ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYmxvY2sgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrCmluZGV4IDQ0ZjUyYTQuLmNiYmQzZTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYmxvY2sKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ibG9jawpAQCAtNjAsMyArNjAsNjIgQEAKIAkJSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGJsb2NrIGxheWVyIHNob3VsZCBhdXRvbWF0aWNhbGx5CiAJCWdlbmVyYXRlIGNoZWNrc3VtcyBmb3Igd3JpdGUgcmVxdWVzdHMgYm91bmQgZm9yCiAJCWRldmljZXMgdGhhdCBzdXBwb3J0IHJlY2VpdmluZyBpbnRlZ3JpdHkgbWV0YWRhdGEuCisKK1doYXQ6CQkvc3lzL2Jsb2NrLzxkaXNrPi9hbGlnbm1lbnRfb2Zmc2V0CitEYXRlOgkJQXByaWwgMjAwOQorQ29udGFjdDoJTWFydGluIEsuIFBldGVyc2VuIDxtYXJ0aW4ucGV0ZXJzZW5Ab3JhY2xlLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlTdG9yYWdlIGRldmljZXMgbWF5IHJlcG9ydCBhIHBoeXNpY2FsIGJsb2NrIHNpemUgdGhhdCBpcworCQliaWdnZXIgdGhhbiB0aGUgbG9naWNhbCBibG9jayBzaXplIChmb3IgaW5zdGFuY2UgYSBkcml2ZQorCQl3aXRoIDRLQiBwaHlzaWNhbCBzZWN0b3JzIGV4cG9zaW5nIDUxMi1ieXRlIGxvZ2ljYWwKKwkJYmxvY2tzIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtKS4gIFRoaXMgcGFyYW1ldGVyCisJCWluZGljYXRlcyBob3cgbWFueSBieXRlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkZXZpY2UgaXMKKwkJb2Zmc2V0IGZyb20gdGhlIGRpc2sncyBuYXR1cmFsIGFsaWdubWVudC4KKworV2hhdDoJCS9zeXMvYmxvY2svPGRpc2s+LzxwYXJ0aXRpb24+L2FsaWdubWVudF9vZmZzZXQKK0RhdGU6CQlBcHJpbCAyMDA5CitDb250YWN0OglNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNlbkBvcmFjbGUuY29tPgorRGVzY3JpcHRpb246CisJCVN0b3JhZ2UgZGV2aWNlcyBtYXkgcmVwb3J0IGEgcGh5c2ljYWwgYmxvY2sgc2l6ZSB0aGF0IGlzCisJCWJpZ2dlciB0aGFuIHRoZSBsb2dpY2FsIGJsb2NrIHNpemUgKGZvciBpbnN0YW5jZSBhIGRyaXZlCisJCXdpdGggNEtCIHBoeXNpY2FsIHNlY3RvcnMgZXhwb3NpbmcgNTEyLWJ5dGUgbG9naWNhbAorCQlibG9ja3MgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0pLiAgVGhpcyBwYXJhbWV0ZXIKKwkJaW5kaWNhdGVzIGhvdyBtYW55IGJ5dGVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbgorCQlpcyBvZmZzZXQgZnJvbSB0aGUgZGlzaydzIG5hdHVyYWwgYWxpZ25tZW50LgorCitXaGF0OgkJL3N5cy9ibG9jay88ZGlzaz4vcXVldWUvbG9naWNhbF9ibG9ja19zaXplCitEYXRlOgkJTWF5IDIwMDkKK0NvbnRhY3Q6CU1hcnRpbiBLLiBQZXRlcnNlbiA8bWFydGluLnBldGVyc2VuQG9yYWNsZS5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhpcyBpcyB0aGUgc21hbGxlc3QgdW5pdCB0aGUgc3RvcmFnZSBkZXZpY2UgY2FuCisJCWFkZHJlc3MuICBJdCBpcyB0eXBpY2FsbHkgNTEyIGJ5dGVzLgorCitXaGF0OgkJL3N5cy9ibG9jay88ZGlzaz4vcXVldWUvcGh5c2ljYWxfYmxvY2tfc2l6ZQorRGF0ZToJCU1heSAyMDA5CitDb250YWN0OglNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNlbkBvcmFjbGUuY29tPgorRGVzY3JpcHRpb246CisJCVRoaXMgaXMgdGhlIHNtYWxsZXN0IHVuaXQgdGhlIHN0b3JhZ2UgZGV2aWNlIGNhbiB3cml0ZQorCQl3aXRob3V0IHJlc29ydGluZyB0byByZWFkLW1vZGlmeS13cml0ZSBvcGVyYXRpb24uICBJdCBpcworCQl1c3VhbGx5IHRoZSBzYW1lIGFzIHRoZSBsb2dpY2FsIGJsb2NrIHNpemUgYnV0IG1heSBiZQorCQliaWdnZXIuICBPbmUgZXhhbXBsZSBpcyBTQVRBIGRyaXZlcyB3aXRoIDRLQiBzZWN0b3JzCisJCXRoYXQgZXhwb3NlIGEgNTEyLWJ5dGUgbG9naWNhbCBibG9jayBzaXplIHRvIHRoZQorCQlvcGVyYXRpbmcgc3lzdGVtLgorCitXaGF0OgkJL3N5cy9ibG9jay88ZGlzaz4vcXVldWUvbWluaW11bV9pb19zaXplCitEYXRlOgkJQXByaWwgMjAwOQorQ29udGFjdDoJTWFydGluIEsuIFBldGVyc2VuIDxtYXJ0aW4ucGV0ZXJzZW5Ab3JhY2xlLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlTdG9yYWdlIGRldmljZXMgbWF5IHJlcG9ydCBhIHByZWZlcnJlZCBtaW5pbXVtIEkvTyBzaXplLAorCQl3aGljaCBpcyB0aGUgc21hbGxlc3QgcmVxdWVzdCB0aGUgZGV2aWNlIGNhbiBwZXJmb3JtCisJCXdpdGhvdXQgaW5jdXJyaW5nIGEgcmVhZC1tb2RpZnktd3JpdGUgcGVuYWx0eS4gIEZvciBkaXNrCisJCWRyaXZlcyB0aGlzIGlzIG9mdGVuIHRoZSBwaHlzaWNhbCBibG9jayBzaXplLiAgRm9yIFJBSUQKKwkJYXJyYXlzIGl0IGlzIG9mdGVuIHRoZSBzdHJpcGUgY2h1bmsgc2l6ZS4KKworV2hhdDoJCS9zeXMvYmxvY2svPGRpc2s+L3F1ZXVlL29wdGltYWxfaW9fc2l6ZQorRGF0ZToJCUFwcmlsIDIwMDkKK0NvbnRhY3Q6CU1hcnRpbiBLLiBQZXRlcnNlbiA8bWFydGluLnBldGVyc2VuQG9yYWNsZS5jb20+CitEZXNjcmlwdGlvbjoKKwkJU3RvcmFnZSBkZXZpY2VzIG1heSByZXBvcnQgYW4gb3B0aW1hbCBJL08gc2l6ZSwgd2hpY2ggaXMKKwkJdGhlIGRldmljZSdzIHByZWZlcnJlZCB1bml0IG9mIHJlY2VpdmluZyBJL08uICBUaGlzIGlzCisJCXJhcmVseSByZXBvcnRlZCBmb3IgZGlzayBkcml2ZXMuICBGb3IgUkFJRCBkZXZpY2VzIGl0IGlzCisJCXVzdWFsbHkgdGhlIHN0cmlwZSB3aWR0aCBvciB0aGUgaW50ZXJuYWwgYmxvY2sgc2l6ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtcGNpLWRldmljZXMtY2Npc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5MmE3YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXBjaS1kZXZpY2VzLWNjaXNzCkBAIC0wLDAgKzEsMzMgQEAKK1doZXJlOgkJL3N5cy9idXMvcGNpL2RldmljZXMvPGRldj4vY2Npc3NYL2NYZFkvbW9kZWwKK0RhdGU6CQlNYXJjaCAyMDA5CitLZXJuZWwgVmVyc2lvbjogMi42LjMwCitDb250YWN0Oglpc3Nfc3RvcmFnZWRldkBocC5jb20KK0Rlc2NyaXB0aW9uOglEaXNwbGF5cyB0aGUgU0NTSSBJTlFVSVJZIHBhZ2UgMCBtb2RlbCBmb3IgbG9naWNhbCBkcml2ZQorCQlZIG9mIGNvbnRyb2xsZXIgWC4KKworV2hlcmU6CQkvc3lzL2J1cy9wY2kvZGV2aWNlcy88ZGV2Pi9jY2lzc1gvY1hkWS9yZXYKK0RhdGU6CQlNYXJjaCAyMDA5CitLZXJuZWwgVmVyc2lvbjogMi42LjMwCitDb250YWN0Oglpc3Nfc3RvcmFnZWRldkBocC5jb20KK0Rlc2NyaXB0aW9uOglEaXNwbGF5cyB0aGUgU0NTSSBJTlFVSVJZIHBhZ2UgMCByZXZpc2lvbiBmb3IgbG9naWNhbAorCQlkcml2ZSBZIG9mIGNvbnRyb2xsZXIgWC4KKworV2hlcmU6CQkvc3lzL2J1cy9wY2kvZGV2aWNlcy88ZGV2Pi9jY2lzc1gvY1hkWS91bmlxdWVfaWQKK0RhdGU6CQlNYXJjaCAyMDA5CitLZXJuZWwgVmVyc2lvbjogMi42LjMwCitDb250YWN0Oglpc3Nfc3RvcmFnZWRldkBocC5jb20KK0Rlc2NyaXB0aW9uOglEaXNwbGF5cyB0aGUgU0NTSSBJTlFVSVJZIHBhZ2UgODMgc2VyaWFsIG51bWJlciBmb3IgbG9naWNhbAorCQlkcml2ZSBZIG9mIGNvbnRyb2xsZXIgWC4KKworV2hlcmU6CQkvc3lzL2J1cy9wY2kvZGV2aWNlcy88ZGV2Pi9jY2lzc1gvY1hkWS92ZW5kb3IKK0RhdGU6CQlNYXJjaCAyMDA5CitLZXJuZWwgVmVyc2lvbjogMi42LjMwCitDb250YWN0Oglpc3Nfc3RvcmFnZWRldkBocC5jb20KK0Rlc2NyaXB0aW9uOglEaXNwbGF5cyB0aGUgU0NTSSBJTlFVSVJZIHBhZ2UgMCB2ZW5kb3IgZm9yIGxvZ2ljYWwgZHJpdmUKKwkJWSBvZiBjb250cm9sbGVyIFguCisKK1doZXJlOgkJL3N5cy9idXMvcGNpL2RldmljZXMvPGRldj4vY2Npc3NYL2NYZFkvYmxvY2s6Y2Npc3MhY1hkWQorRGF0ZToJCU1hcmNoIDIwMDkKK0tlcm5lbCBWZXJzaW9uOiAyLjYuMzAKK0NvbnRhY3Q6CWlzc19zdG9yYWdlZGV2QGhwLmNvbQorRGVzY3JpcHRpb246CUEgc3ltYm9saWMgbGluayB0byAvc3lzL2Jsb2NrL2NjaXNzIWNYZFkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1jYWNoZV9kaXNhYmxlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLWNhY2hlX2Rpc2FibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1YmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1jYWNoZV9kaXNhYmxlCkBAIC0wLDAgKzEsMTggQEAKK1doYXQ6ICAgICAgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Ki9jYWNoZS9pbmRleCovY2FjaGVfZGlzYWJsZV9YCitEYXRlOiAgICAgIEF1Z3VzdCAyMDA4CitLZXJuZWxWZXJzaW9uOgkyLjYuMjcKK0NvbnRhY3Q6CW1hcmsubGFuZ3Nkb3JmQGFtZC5jb20KK0Rlc2NyaXB0aW9uOglUaGVzZSBmaWxlcyBleGlzdCBpbiBldmVyeSBjcHUncyBjYWNoZSBpbmRleCBkaXJlY3Rvcmllcy4KKwkJVGhlcmUgYXJlIGN1cnJlbnRseSAyIGNhY2hlX2Rpc2FibGVfIyBmaWxlcyBpbiBlYWNoCisJCWRpcmVjdG9yeS4gIFJlYWRpbmcgZnJvbSB0aGVzZSBmaWxlcyBvbiBhIHN1cHBvcnRlZAorCQlwcm9jZXNzb3Igd2lsbCByZXR1cm4gdGhhdCBjYWNoZSBkaXNhYmxlIGluZGV4IHZhbHVlCisJCWZvciB0aGF0IHByb2Nlc3NvciBhbmQgbm9kZS4gIFdyaXRpbmcgdG8gb25lIG9mIHRoZXNlCisJCWZpbGVzIHdpbGwgY2F1c2UgdGhlIHNwZWNpZmljZWQgY2FjaGUgaW5kZXggdG8gYmUgZGlzYWJsZWQuCisKKwkJQ3VycmVudGx5LCBvbmx5IEFNRCBGYW1pbHkgMTBoIFByb2Nlc3NvcnMgc3VwcG9ydCBjYWNoZSBpbmRleAorCQlkaXNhYmxlLCBhbmQgb25seSBmb3IgdGhlaXIgTDMgY2FjaGVzLiAgU2VlIHRoZSBCSU9TIGFuZAorCQlLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgYXQKKwkJaHR0cDovL3d3dy5hbWQuY29tL3VzLWVuL2Fzc2V0cy9jb250ZW50X3R5cGUvd2hpdGVfcGFwZXJzX2FuZF90ZWNoX2RvY3MvMzExMTYtUHVibGljLUdILUJLREdfMy4yMF8yLTQtMDkucGRmCisJCWZvciBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGFuZCBvdGhlciBkZXRhaWxzIG9uIHRoZQorCQljYWNoZSBpbmRleCBkaXNhYmxlLgorVXNlcnM6ICAgIGpvYWNoaW0uZGVndWFyYUBhbWQuY29tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0IGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAppbmRleCBkOWFhNDNkLi4yNWZiOGJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKQEAgLTcwNCwxMiArNzA0LDI0IEBACiAJCQkJVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGZyZWUgZG1hX2RlYnVnX2VudHJpZXMKIAkJCQlpbiB0aGUgYWxsb2NhdG9yLgogCisJZG1hLWFwaS9kcml2ZXItZmlsdGVyCisJCQkJWW91IGNhbiB3cml0ZSBhIG5hbWUgb2YgYSBkcml2ZXIgaW50byB0aGlzIGZpbGUKKwkJCQl0byBsaW1pdCB0aGUgZGVidWcgb3V0cHV0IHRvIHJlcXVlc3RzIGZyb20gdGhhdAorCQkJCXBhcnRpY3VsYXIgZHJpdmVyLiBXcml0ZSBhbiBlbXB0eSBzdHJpbmcgdG8KKwkJCQl0aGF0IGZpbGUgdG8gZGlzYWJsZSB0aGUgZmlsdGVyIGFuZCBzZWUKKwkJCQlhbGwgZXJyb3JzIGFnYWluLgorCiBJZiB5b3UgaGF2ZSB0aGlzIGNvZGUgY29tcGlsZWQgaW50byB5b3VyIGtlcm5lbCBpdCB3aWxsIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KIElmIHlvdSB3YW50IHRvIGJvb3Qgd2l0aG91dCB0aGUgYm9va2tlZXBpbmcgYW55d2F5IHlvdSBjYW4gcHJvdmlkZQogJ2RtYV9kZWJ1Zz1vZmYnIGFzIGEgYm9vdCBwYXJhbWV0ZXIuIFRoaXMgd2lsbCBkaXNhYmxlIERNQS1BUEkgZGVidWdnaW5nLgogTm90aWNlIHRoYXQgeW91IGNhbiBub3QgZW5hYmxlIGl0IGFnYWluIGF0IHJ1bnRpbWUuIFlvdSBoYXZlIHRvIHJlYm9vdCB0byBkbwogc28uCiAKK0lmIHlvdSB3YW50IHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcyBvbmx5IGZvciBhIHNwZWNpYWwgZGV2aWNlIGRyaXZlciB5b3UgY2FuCitzcGVjaWZ5IHRoZSBkbWFfZGVidWdfZHJpdmVyPTxkcml2ZXJuYW1lPiBwYXJhbWV0ZXIuIFRoaXMgd2lsbCBlbmFibGUgdGhlCitkcml2ZXIgZmlsdGVyIGF0IGJvb3QgdGltZS4gVGhlIGRlYnVnIGNvZGUgd2lsbCBvbmx5IHByaW50IGVycm9ycyBmb3IgdGhhdAorZHJpdmVyIGFmdGVyd2FyZHMuIFRoaXMgZmlsdGVyIGNhbiBiZSBkaXNhYmxlZCBvciBjaGFuZ2VkIGxhdGVyIHVzaW5nIGRlYnVnZnMuCisKIFdoZW4gdGhlIGNvZGUgZGlzYWJsZXMgaXRzZWxmIGF0IHJ1bnRpbWUgdGhpcyBpcyBtb3N0IGxpa2VseSBiZWNhdXNlIGl0IHJhbgogb3V0IG9mIGRtYV9kZWJ1Z19lbnRyaWVzLiBUaGVzZSBlbnRyaWVzIGFyZSBwcmVhbGxvY2F0ZWQgYXQgYm9vdC4gVGhlIG51bWJlcgogb2YgcHJlYWxsb2NhdGVkIGVudHJpZXMgaXMgZGVmaW5lZCBwZXIgYXJjaGl0ZWN0dXJlLiBJZiBpdCBpcyB0b28gbG93IGZvciB5b3UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQppbmRleCBiMWViNjYxLi45NjMyNDQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw4IEBACiAJICAgIGdhZGdldC54bWwgbGliYXRhLnhtbCBtdGRuYW5kLnhtbCBsaWJycy54bWwgcmFwaWRpby54bWwgXAogCSAgICBnZW5lcmljaXJxLnhtbCBzMzkwLWRyaXZlcnMueG1sIHVpby1ob3d0by54bWwgc2NzaS54bWwgXAogCSAgICBtYWM4MDIxMS54bWwgZGVidWdvYmplY3RzLnhtbCBzaC54bWwgcmVndWxhdG9yLnhtbCBcCi0JICAgIGFsc2EtZHJpdmVyLWFwaS54bWwgd3JpdGluZy1hbi1hbHNhLWRyaXZlci54bWwKKwkgICAgYWxzYS1kcml2ZXItYXBpLnhtbCB3cml0aW5nLWFuLWFsc2EtZHJpdmVyLnhtbCBcCisJICAgIHRyYWNlcG9pbnQueG1sCiAKICMjIwogIyBUaGUgYnVpbGQgcHJvY2VzcyBpcyBhcyBmb2xsb3dzICh0YXJnZXRzKToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay90cmFjZXBvaW50LnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdHJhY2Vwb2ludC50bXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzU2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdHJhY2Vwb2ludC50bXBsCkBAIC0wLDAgKzEsODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKwkiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFtdPgorCis8Ym9vayBpZD0iVHJhY2Vwb2ludHMiPgorIDxib29raW5mbz4KKyAgPHRpdGxlPlRoZSBMaW51eCBLZXJuZWwgVHJhY2Vwb2ludCBBUEk8L3RpdGxlPgorCisgIDxhdXRob3Jncm91cD4KKyAgIDxhdXRob3I+CisgICAgPGZpcnN0bmFtZT5KYXNvbjwvZmlyc3RuYW1lPgorICAgIDxzdXJuYW1lPkJhcm9uPC9zdXJuYW1lPgorICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgPGFkZHJlc3M+CisgICAgICA8ZW1haWw+amJhcm9uQHJlZGhhdC5jb208L2VtYWlsPgorICAgICA8L2FkZHJlc3M+CisgICAgPC9hZmZpbGlhdGlvbj4KKyAgIDwvYXV0aG9yPgorICA8L2F1dGhvcmdyb3VwPgorCisgIDxsZWdhbG5vdGljZT4KKyAgIDxwYXJhPgorICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKKyAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICAgICB2ZXJzaW9uLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAgICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQorICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCisgICA8L3BhcmE+CisgIDwvbGVnYWxub3RpY2U+CisgPC9ib29raW5mbz4KKworIDx0b2M+PC90b2M+CisgIDxjaGFwdGVyIGlkPSJpbnRybyI+CisgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgIDxwYXJhPgorICAgICBUcmFjZXBvaW50cyBhcmUgc3RhdGljIHByb2JlIHBvaW50cyB0aGF0IGFyZSBsb2NhdGVkIGluIHN0cmF0ZWdpYyBwb2ludHMKKyAgICAgdGhyb3VnaG91dCB0aGUga2VybmVsLiAnUHJvYmVzJyByZWdpc3Rlci91bnJlZ2lzdGVyIHdpdGggdHJhY2Vwb2ludHMKKyAgICAgdmlhIGEgY2FsbGJhY2sgbWVjaGFuaXNtLiBUaGUgJ3Byb2JlcycgYXJlIHN0cmljdGx5IHR5cGVkIGZ1bmN0aW9ucyB0aGF0CisgICAgIGFyZSBwYXNzZWQgYSB1bmlxdWUgc2V0IG9mIHBhcmFtZXRlcnMgZGVmaW5lZCBieSBlYWNoIHRyYWNlcG9pbnQuCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgICBGcm9tIHRoaXMgc2ltcGxlIGNhbGxiYWNrIG1lY2hhbmlzbSwgJ3Byb2JlcycgY2FuIGJlIHVzZWQgdG8gcHJvZmlsZSwgZGVidWcsCisgICAgIGFuZCB1bmRlcnN0YW5kIGtlcm5lbCBiZWhhdmlvci4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvb2xzIHRoYXQgcHJvdmlkZSBhCisgICAgIGZyYW1ld29yayBmb3IgdXNpbmcgJ3Byb2JlcycuIFRoZXNlIHRvb2xzIGluY2x1ZGUgU3lzdGVtdGFwLCBmdHJhY2UsIGFuZAorICAgICBMVFRuZy4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIFRyYWNlcG9pbnRzIGFyZSBkZWZpbmVkIGluIGEgbnVtYmVyIG9mIGhlYWRlciBmaWxlcyB2aWEgdmFyaW91cyBtYWNyb3MuIFRodXMsCisgICAgIHRoZSBwdXJwb3NlIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8gcHJvdmlkZSBhIGNsZWFyIGFjY291bnRpbmcgb2YgdGhlIGF2YWlsYWJsZQorICAgICB0cmFjZXBvaW50cy4gVGhlIGludGVudGlvbiBpcyB0byB1bmRlcnN0YW5kIG5vdCBvbmx5IHdoYXQgdHJhY2Vwb2ludHMgYXJlCisgICAgIGF2YWlsYWJsZSBidXQgYWxzbyB0byB1bmRlcnN0YW5kIHdoZXJlIGZ1dHVyZSB0cmFjZXBvaW50cyBtaWdodCBiZSBhZGRlZC4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIFRoZSBBUEkgcHJlc2VudGVkIGhhcyBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CisgICAgIDxmdW5jdGlvbj50cmFjZV90cmFjZXBvaW50bmFtZShmdW5jdGlvbiBwYXJhbWV0ZXJzKTwvZnVuY3Rpb24+LiBUaGVzZSBhcmUgdGhlCisgICAgIHRyYWNlcG9pbnRzIGNhbGxiYWNrcyB0aGF0IGFyZSBmb3VuZCB0aHJvdWdob3V0IHRoZSBjb2RlLiBSZWdpc3RlcmluZyBhbmQKKyAgICAgdW5yZWdpc3RlcmluZyBwcm9iZXMgd2l0aCB0aGVzZSBjYWxsYmFjayBzaXRlcyBpcyBjb3ZlcmVkIGluIHRoZQorICAgICA8ZmlsZW5hbWU+RG9jdW1lbnRhdGlvbi90cmFjZS8qPC9maWxlbmFtZT4gZGlyZWN0b3J5LgorICAgPC9wYXJhPgorICA8L2NoYXB0ZXI+CisKKyAgPGNoYXB0ZXIgaWQ9ImlycSI+CisgICA8dGl0bGU+SVJRPC90aXRsZT4KKyFJaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmgKKyAgPC9jaGFwdGVyPgorCis8L2Jvb2s+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQKaW5kZXggMDY4ODQ4Mi4uMDJjY2VkMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvdHJhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3RyYWNlLnR4dApAQCAtMTkyLDIzICsxOTIsMjQgQEAKIFRoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1ZGF0YSIgbG9va3MgYXMgZm9sbG93czoKIAogcmN1OgotICAwIGM9NDAxMSBnPTQwMTIgcHE9MSBwcWM9NDAxMSBxcD0wIHJwZnE9MSBycD0zYzJhIGR0PTIzMzAxLzczIGRuPTIgZGY9MTg4MiBvZj0wIHJpPTIxMjYgcWw9MiBiPTEwCi0gIDEgYz00MDExIGc9NDAxMiBwcT0xIHBxYz00MDExIHFwPTAgcnBmcT0zIHJwPTM5YTYgZHQ9NzgwNzMvMSBkbj0yIGRmPTE0MDIgb2Y9MCByaT0xODc1IHFsPTQ2IGI9MTAKLSAgMiBjPTQwMTAgZz00MDEwIHBxPTEgcHFjPTQwMTAgcXA9MCBycGZxPS01IHJwPTFkMTIgZHQ9MTY2NDYvMCBkbj0yIGRmPTMxNDAgb2Y9MCByaT0yMDgwIHFsPTAgYj0xMAotICAzIGM9NDAxMiBnPTQwMTMgcHE9MSBwcWM9NDAxMiBxcD0xIHJwZnE9MyBycD0yYjUwIGR0PTIxMTU5LzEgZG49MiBkZj0yMjMwIG9mPTAgcmk9MTkyMyBxbD03MiBiPTEwCi0gIDQgYz00MDEyIGc9NDAxMyBwcT0xIHBxYz00MDEyIHFwPTEgcnBmcT0zIHJwPTE2NDQgZHQ9NTc4My8xIGRuPTIgZGY9MzM0OCBvZj0wIHJpPTI4MDUgcWw9NyBiPTEwCi0gIDUgYz00MDEyIGc9NDAxMyBwcT0wIHBxYz00MDExIHFwPTEgcnBmcT0zIHJwPTFhYWMgZHQ9NTg3OS8xIGRuPTIgZGY9MzE0MCBvZj0wIHJpPTIwNjYgcWw9MTAgYj0xMAotICA2IGM9NDAxMiBnPTQwMTMgcHE9MSBwcWM9NDAxMiBxcD0xIHJwZnE9MyBycD1lZDggZHQ9NTg0Ny8xIGRuPTIgZGY9Mzc5NyBvZj0wIHJpPTEyNjYgcWw9MTAgYj0xMAotICA3IGM9NDAxMiBnPTQwMTMgcHE9MSBwcWM9NDAxMiBxcD0xIHJwZnE9MyBycD0xZmEyIGR0PTYxOTkvMSBkbj0yIGRmPTI3OTUgb2Y9MCByaT0yMTYyIHFsPTI4IGI9MTAKK3JjdToKKyAgMCBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD0xMDk1MS8xIGRuPTAgZGY9MTEwMSBvZj0wIHJpPTM2IHFsPTAgYj0xMAorICAxIGM9MTc4MjkgZz0xNzgyOSBwcT0xIHBxYz0xNzgyOSBxcD0wIGR0PTE2MTE3LzEgZG49MCBkZj0xMDE1IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgMiBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD0xNDQ1LzEgZG49MCBkZj0xODM5IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgMyBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD02NjgxLzEgZG49MCBkZj0xNTQ1IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgNCBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD0xMDAzLzEgZG49MCBkZj0xOTkyIG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgNSBjPTE3ODI5IGc9MTc4MzAgcHE9MSBwcWM9MTc4MjkgcXA9MSBkdD0zODg3LzEgZG49MCBkZj0zMzMxIG9mPTAgcmk9NCBxbD0yIGI9MTAKKyAgNiBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD04NTkvMSBkbj0wIGRmPTMyMjQgb2Y9MCByaT0wIHFsPTAgYj0xMAorICA3IGM9MTc4MjkgZz0xNzgzMCBwcT0wIHBxYz0xNzgyOSBxcD0xIGR0PTM3NjEvMSBkbj0wIGRmPTE4MTggb2Y9MCByaT0wIHFsPTIgYj0xMAogcmN1X2JoOgotICAwIGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0wIHJwZnE9LTE0NSBycD0yMWQ2IGR0PTIzMzAxLzczIGRuPTIgZGY9MCBvZj0wIHJpPTAgcWw9MCBiPTEwCi0gIDEgYz0tMjY4IGc9LTI2OCBwcT0xIHBxYz0tMjY4IHFwPTEgcnBmcT0tMTcwIHJwPTIwY2UgZHQ9NzgwNzMvMSBkbj0yIGRmPTI2IG9mPTAgcmk9NSBxbD0wIGI9MTAKLSAgMiBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MSBycGZxPS04MyBycD1mYmQgZHQ9MTY2NDYvMCBkbj0yIGRmPTI4IG9mPTAgcmk9NCBxbD0wIGI9MTAKLSAgMyBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MCBycGZxPS0xMDUgcnA9MTc4YyBkdD0yMTE1OS8xIGRuPTIgZGY9Mjggb2Y9MCByaT0yIHFsPTAgYj0xMAotICA0IGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0xIHJwZnE9LTMwIHJwPWI1NCBkdD01NzgzLzEgZG49MiBkZj0zMiBvZj0wIHJpPTAgcWw9MCBiPTEwCi0gIDUgYz0tMjY4IGc9LTI2OCBwcT0xIHBxYz0tMjY4IHFwPTEgcnBmcT0tMjkgcnA9ZGY1IGR0PTU4NzkvMSBkbj0yIGRmPTMwIG9mPTAgcmk9MyBxbD0wIGI9MTAKLSAgNiBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MSBycGZxPS0yOCBycD03ODggZHQ9NTg0Ny8xIGRuPTIgZGY9MzIgb2Y9MCByaT0wIHFsPTAgYj0xMAotICA3IGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0xIHJwZnE9LTUzIHJwPTEwOTggZHQ9NjE5OS8xIGRuPTIgZGY9MzAgb2Y9MCByaT0zIHFsPTAgYj0xMAorICAwIGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTEwOTUxLzEgZG49MCBkZj0wIG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgMSBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD0xNjExNy8xIGRuPTAgZGY9MTMgb2Y9MCByaT0wIHFsPTAgYj0xMAorICAyIGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTE0NDUvMSBkbj0wIGRmPTE1IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgMyBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD02NjgxLzEgZG49MCBkZj05IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgNCBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD0xMDAzLzEgZG49MCBkZj0xNSBvZj0wIHJpPTAgcWw9MCBiPTEwCisgIDUgYz0tMjc1IGc9LTI3NSBwcT0xIHBxYz0tMjc1IHFwPTAgZHQ9Mzg4Ny8xIGRuPTAgZGY9MTUgb2Y9MCByaT0wIHFsPTAgYj0xMAorICA2IGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTg1OS8xIGRuPTAgZGY9MTUgb2Y9MCByaT0wIHFsPTAgYj0xMAorICA3IGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTM3NjEvMSBkbj0wIGRmPTE1IG9mPTAgcmk9MCBxbD0wIGI9MTAKIAogVGhlIGZpcnN0IHNlY3Rpb24gbGlzdHMgdGhlIHJjdV9kYXRhIHN0cnVjdHVyZXMgZm9yIHJjdSwgdGhlIHNlY29uZCBmb3IKIHJjdV9iaC4gIEVhY2ggc2VjdGlvbiBoYXMgb25lIGxpbmUgcGVyIENQVSwgb3IgZWlnaHQgZm9yIHRoaXMgOC1DUFUgc3lzdGVtLgpAQCAtMjUzLDEyICsyNTQsNiBAQAogbwkicXAiIGluZGljYXRlcyB0aGF0IFJDVSBzdGlsbCBleHBlY3RzIGEgcXVpZXNjZW50IHN0YXRlIGZyb20KIAl0aGlzIENQVS4KIAotbwkicnBmcSIgaXMgdGhlIG51bWJlciBvZiByY3VfcGVuZGluZygpIGNhbGxzIG9uIHRoaXMgQ1BVIHJlcXVpcmVkCi0JdG8gaW5kdWNlIHRoaXMgQ1BVIHRvIGludm9rZSBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKS4KLQotbwkicnAiIGlzIGxvdy1vcmRlciBmb3VyIGhleCBkaWdpdHMgb2YgdGhlIGNvdW50IG9mIGhvdyBtYW55IHRpbWVzCi0JcmN1X3BlbmRpbmcoKSBoYXMgYmVlbiBpbnZva2VkIG9uIHRoaXMgQ1BVLgotCiBvCSJkdCIgaXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGR5bnRpY2sgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkCiAJd2hlbiBlbnRlcmluZyBvciBsZWF2aW5nIGR5bnRpY2tzIGlkbGUgc3RhdGUsIGVpdGhlciBieSB0aGUKIAlzY2hlZHVsZXIgb3IgYnkgaXJxLiAgVGhlIG51bWJlciBhZnRlciB0aGUgIi8iIGlzIHRoZSBpbnRlcnJ1cHQKQEAgLTMwNSw2ICszMDAsOSBAQAogCW9mIFJDVSBjYWxsYmFja3MgaXMgcmVhZHkgdG8gaW52b2tlLCB0aGVuIHRoZSByZW1haW5kZXIgd2lsbAogCWJlIGRlZmVycmVkLgogCitUaGVyZSBpcyBhbHNvIGFuIHJjdS9yY3VkYXRhLmNzdiBmaWxlIHdpdGggdGhlIHNhbWUgaW5mb3JtYXRpb24gaW4KK2NvbW1hLXNlcGFyYXRlZC12YXJpYWJsZSBzcHJlYWRzaGVldCBmb3JtYXQuCisKIAogVGhlIG91dHB1dCBvZiAiY2F0IHJjdS9yY3VncCIgbG9va3MgYXMgZm9sbG93czoKIApAQCAtNDExLDMgKzQwOSw2MyBAQAogCQlGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGVudHJ5IGF0IHRoZSBsb3dlc3QgbGV2ZWwgc2hvd3MKIAkJIl4wIiwgaW5kaWNhdGluZyB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvIGJpdCB6ZXJvIGluCiAJCXRoZSBmaXJzdCBlbnRyeSBhdCB0aGUgbWlkZGxlIGxldmVsLgorCisKK1RoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1X3BlbmRpbmciIGxvb2tzIGFzIGZvbGxvd3M6CisKK3JjdToKKyAgMCBucD0yNTU4OTIgcXNwPTUzOTM2IGNicj0wIGNuZz0xNDQxNyBncGM9MTAwMzMgZ3BzPTI0MzIwIG5mPTY0NDUgbm49MTQ2NzQxCisgIDEgbnA9MjYxMjI0IHFzcD01NDYzOCBjYnI9MCBjbmc9MjU3MjMgZ3BjPTE2MzEwIGdwcz0yODQ5IG5mPTU5MTIgbm49MTU1NzkyCisgIDIgbnA9MjM3NDk2IHFzcD00OTY2NCBjYnI9MCBjbmc9Mjc2MiBncGM9NDU0NzggZ3BzPTE3NjIgbmY9MTIwMSBubj0xMzY2MjkKKyAgMyBucD0yMzYyNDkgcXNwPTQ4NzY2IGNicj0wIGNuZz0yODYgZ3BjPTQ4MDQ5IGdwcz0xMjE4IG5mPTIwNyBubj0xMzc3MjMKKyAgNCBucD0yMjEzMTAgcXNwPTQ2ODUwIGNicj0wIGNuZz0yNiBncGM9NDMxNjEgZ3BzPTQ2MzQgbmY9MzUyOSBubj0xMjMxMTAKKyAgNSBucD0yMzczMzIgcXNwPTQ4NDQ5IGNicj0wIGNuZz01NCBncGM9NDc5MjAgZ3BzPTMyNTIgbmY9MjAxIG5uPTEzNzQ1NgorICA2IG5wPTIxOTk5NSBxc3A9NDY3MTggY2JyPTAgY25nPTUwIGdwYz00MjA5OCBncHM9NjA5MyBuZj00MjAyIG5uPTEyMDgzNAorICA3IG5wPTI0OTg5MyBxc3A9NDkzOTAgY2JyPTAgY25nPTcyIGdwYz0zODQwMCBncHM9MTcxMDIgbmY9NDEgbm49MTQ0ODg4CityY3VfYmg6CisgIDAgbnA9MTQ2NzQxIHFzcD0xNDE5IGNicj0wIGNuZz02IGdwYz0wIGdwcz0wIG5mPTIgbm49MTQ1MzE0CisgIDEgbnA9MTU1NzkyIHFzcD0xMjU5NyBjYnI9MCBjbmc9MCBncGM9NCBncHM9OCBuZj0zIG5uPTE0MzE4MAorICAyIG5wPTEzNjYyOSBxc3A9MTg2ODAgY2JyPTAgY25nPTAgZ3BjPTcgZ3BzPTYgbmY9MCBubj0xMTc5MzYKKyAgMyBucD0xMzc3MjMgcXNwPTI4NDMgY2JyPTAgY25nPTAgZ3BjPTEwIGdwcz03IG5mPTAgbm49MTM0ODYzCisgIDQgbnA9MTIzMTEwIHFzcD0xMjQzMyBjYnI9MCBjbmc9MCBncGM9NCBncHM9MiBuZj0wIG5uPTExMDY3MQorICA1IG5wPTEzNzQ1NiBxc3A9NDIxMCBjYnI9MCBjbmc9MCBncGM9NiBncHM9NSBuZj0wIG5uPTEzMzIzNQorICA2IG5wPTEyMDgzNCBxc3A9OTkwMiBjYnI9MCBjbmc9MCBncGM9NiBncHM9MyBuZj0yIG5uPTExMDkyMQorICA3IG5wPTE0NDg4OCBxc3A9MjYzMzYgY2JyPTAgY25nPTAgZ3BjPTggZ3BzPTIgbmY9MCBubj0xMTg1NDIKKworQXMgYWx3YXlzLCB0aGlzIGlzIG9uY2UgYWdhaW4gc3BsaXQgaW50byAicmN1IiBhbmQgInJjdV9iaCIgcG9ydGlvbnMuCitUaGUgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgorCitvCSJucCIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IF9fcmN1X3BlbmRpbmcoKSBoYXMgYmVlbiBpbnZva2VkCisJZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZsYXZvciBvZiBSQ1UuCisKK28JInFzcCIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBSQ1Ugd2FzIHdhaXRpbmcgZm9yIGEKKwlxdWllc2NlbnQgc3RhdGUgZnJvbSB0aGlzIENQVS4KKworbwkiY2JyIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhpcyBDUFUgaGFkIFJDVSBjYWxsYmFja3MKKwl0aGF0IGhhZCBwYXNzZWQgdGhyb3VnaCBhIGdyYWNlIHBlcmlvZCwgYW5kIHdlcmUgdGh1cyByZWFkeQorCXRvIGJlIGludm9rZWQuCisKK28JImNuZyIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoaXMgQ1BVIG5lZWRlZCBhbm90aGVyCisJZ3JhY2UgcGVyaW9kIHdoaWxlIFJDVSB3YXMgaWRsZS4KKworbwkiZ3BjIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYW4gb2xkIGdyYWNlIHBlcmlvZCBoYWQKKwljb21wbGV0ZWQsIGJ1dCB0aGlzIENQVSB3YXMgbm90IHlldCBhd2FyZSBvZiBpdC4KKworbwkiZ3BzIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYSBuZXcgZ3JhY2UgcGVyaW9kIGhhZCBzdGFydGVkLAorCWJ1dCB0aGlzIENQVSB3YXMgbm90IHlldCBhd2FyZSBvZiBpdC4KKworbwkibmYiIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGlzIENQVSBzdXNwZWN0ZWQgdGhhdCB0aGUKKwljdXJyZW50IGdyYWNlIHBlcmlvZCBoYWQgcnVuIGZvciB0b28gbG9uZywgYW5kIHRodXMgbmVlZGVkIHRvCisJYmUgZm9yY2VkLgorCisJUGxlYXNlIG5vdGUgdGhhdCAiZm9yY2luZyIgY29uc2lzdHMgb2Ygc2VuZGluZyByZXNjaGVkIElQSXMKKwl0byBob2xkb3V0IENQVXMuICBJZiB0aGF0IENQVSByZWFsbHkgc3RpbGwgaXMgaW4gYW4gb2xkIFJDVQorCXJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLCB0aGVuIHdlIHJlYWxseSBkbyBoYXZlIHRvIHdhaXQgZm9yIGl0LgorCVRoZSBhc3N1bXB0aW9uIGJlaGluZyAiZm9yY2luZyIgaXMgdGhhdCB0aGUgQ1BVIGlzIG5vdCBzdGlsbCBpbgorCWFuIG9sZCBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIGJ1dCBoYXMgbm90IHlldCByZXNwb25kZWQKKwlmb3Igc29tZSBvdGhlciByZWFzb24uCisKK28JIm5uIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhpcyBDUFUgbmVlZGVkIG5vdGhpbmcuICBBbGVydAorCXJlYWRlcnMgd2lsbCBub3RlIHRoYXQgdGhlIHJjdSAibm4iIG51bWJlciBmb3IgYSBnaXZlbiBDUFUgdmVyeQorCWNsb3NlbHkgbWF0Y2hlcyB0aGUgcmN1X2JoICJucCIgbnVtYmVyIGZvciB0aGF0IHNhbWUgQ1BVLiAgVGhpcworCWlzIGR1ZSB0byBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gaW4gcmN1X3BlbmRpbmcoKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vU21hY2sudHh0IGIvRG9jdW1lbnRhdGlvbi9TbWFjay50eHQKaW5kZXggNjI5YzkyZS4uMzQ2MTRiNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9TbWFjay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9TbWFjay50eHQKQEAgLTE4NCw4ICsxODQsOSBAQAogb3RoZXIgdGhhbiBhIGxldHRlciBvciBkaWdpdCwgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIFNtYWNrIGRldmVsb3BtZW50CiB0ZWFtLiBTbWFjayBsYWJlbHMgYXJlIHVuc3RydWN0dXJlZCwgY2FzZSBzZW5zaXRpdmUsIGFuZCB0aGUgb25seSBvcGVyYXRpb24KIGV2ZXIgcGVyZm9ybWVkIG9uIHRoZW0gaXMgY29tcGFyaXNvbiBmb3IgZXF1YWxpdHkuIFNtYWNrIGxhYmVscyBjYW5ub3QKLWNvbnRhaW4gdW5wcmludGFibGUgY2hhcmFjdGVycyBvciB0aGUgIi8iIChzbGFzaCkgY2hhcmFjdGVyLiBTbWFjayBsYWJlbHMKLWNhbm5vdCBiZWdpbiB3aXRoIGEgJy0nLCB3aGljaCBpcyByZXNlcnZlZCBmb3Igc3BlY2lhbCBvcHRpb25zLgorY29udGFpbiB1bnByaW50YWJsZSBjaGFyYWN0ZXJzLCB0aGUgIi8iIChzbGFzaCksIHRoZSAiXCIgKGJhY2tzbGFzaCksIHRoZSAiJyIKKyhxdW90ZSkgYW5kICciJyAoZG91YmxlLXF1b3RlKSBjaGFyYWN0ZXJzLgorU21hY2sgbGFiZWxzIGNhbm5vdCBiZWdpbiB3aXRoIGEgJy0nLCB3aGljaCBpcyByZXNlcnZlZCBmb3Igc3BlY2lhbCBvcHRpb25zLgogCiBUaGVyZSBhcmUgc29tZSBwcmVkZWZpbmVkIGxhYmVsczoKIApAQCAtNTIzLDMgKzUyNCwxOCBAQAogCiBUaGVzZSBtb3VudCBvcHRpb25zIGFwcGx5IHRvIGFsbCBmaWxlIHN5c3RlbSB0eXBlcy4KIAorU21hY2sgYXVkaXRpbmcKKworSWYgeW91IHdhbnQgU21hY2sgYXVkaXRpbmcgb2Ygc2VjdXJpdHkgZXZlbnRzLCB5b3UgbmVlZCB0byBzZXQgQ09ORklHX0FVRElUCitpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uLgorQnkgZGVmYXVsdCwgYWxsIGRlbmllZCBldmVudHMgd2lsbCBiZSBhdWRpdGVkLiBZb3UgY2FuIGNoYW5nZSB0aGlzIGJlaGF2aW9yIGJ5Cit3cml0aW5nIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgL3NtYWNrL2xvZ2dpbmcgZmlsZSA6CiswIDogbm8gbG9nZ2luZworMSA6IGxvZyBkZW5pZWQgKGRlZmF1bHQpCisyIDogbG9nIGFjY2VwdGVkCiszIDogbG9nIGRlbmllZCAmIGFjY2VwdGVkCisKK0V2ZW50cyBhcmUgbG9nZ2VkIGFzICdrZXk9dmFsdWUnIHBhaXJzLCBmb3IgZWFjaCBldmVudCB5b3UgYXQgbGVhc3Qgd2lsbCBnZXQKK3RoZSBzdWJqZXQsIHRoZSBvYmplY3QsIHRoZSByaWdodHMgcmVxdWVzdGVkLCB0aGUgYWN0aW9uLCB0aGUga2VybmVsIGZ1bmN0aW9uCit0aGF0IHRyaWdnZXJlZCB0aGUgZXZlbnQsIHBsdXMgb3RoZXIgcGFpcnMgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGV2ZW50CithdWRpdGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0IGIvRG9jdW1lbnRhdGlvbi9ibG9jay9iaW9kb2MudHh0CmluZGV4IDZmYWI5N2UuLjhkMjE1OGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vYmxvY2svYmlvZG9jLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrL2Jpb2RvYy50eHQKQEAgLTE4Niw3ICsxODYsNyBAQAogZG8gbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgbWFwcGluZykgYW5kCiBsb3ctbWVtb3J5IHBhZ2VzLgogCi1Ob3RlOiBQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9QQ0kvUENJLURNQS1tYXBwaW5nLnR4dCBmb3IgYSBkaXNjdXNzaW9uCitOb3RlOiBQbGVhc2UgcmVmZXIgdG8gRG9jdW1lbnRhdGlvbi9ETUEtbWFwcGluZy50eHQgZm9yIGEgZGlzY3Vzc2lvbgogb24gUENJIGhpZ2ggbWVtIERNQSBhc3BlY3RzIGFuZCBtYXBwaW5nIG9mIHNjYXR0ZXIgZ2F0aGVyIGxpc3RzLCBhbmQgc3VwcG9ydAogZm9yIDY0IGJpdCBQQ0kuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZ2ZzMi1nbG9ja3MudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9nZnMyLWdsb2Nrcy50eHQKaW5kZXggNGRhZTlhMy4uMDQ5NGY3OCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9nZnMyLWdsb2Nrcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9nZnMyLWdsb2Nrcy50eHQKQEAgLTYwLDcgKzYwLDcgQEAKIGdvX3VubG9jayAgICAgICAgfCBDYWxsZWQgb24gdGhlIGZpbmFsIGxvY2FsIHVubG9jayBvZiBhIGxvY2sKIGdvX2R1bXAgICAgICAgICAgfCBDYWxsZWQgdG8gcHJpbnQgY29udGVudCBvZiBvYmplY3QgZm9yIGRlYnVnZnMgZmlsZSwgb3Igb24KICAgICAgICAgICAgICAgICAgfCBlcnJvciB0byBkdW1wIGdsb2NrIHRvIHRoZSBsb2cuCi1nb190eXBlOyAgICAgICAgIHwgVGhlIHR5cGUgb2YgdGhlIGdsb2NrLCBMTV9UWVBFXy4uLi4uCitnb190eXBlICAgICAgICAgIHwgVGhlIHR5cGUgb2YgdGhlIGdsb2NrLCBMTV9UWVBFXy4uLi4uCiBnb19taW5faG9sZF90aW1lIHwgVGhlIG1pbmltdW0gaG9sZCB0aW1lCiAKIFRoZSBtaW5pbXVtIGhvbGQgdGltZSBmb3IgZWFjaCBsb2NrIGlzIHRoZSB0aW1lIGFmdGVyIGEgcmVtb3RlIGxvY2sKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZ2ZzMi50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2dmczIudHh0CmluZGV4IDU5MzAwNGIuLjVlM2FiOGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZ2ZzMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9nZnMyLnR4dApAQCAtMTEsMTggKzExLDE1IEBACiBmZWF0dXJlcyBvZiBHRlMgaXMgcGVyZmVjdCBjb25zaXN0ZW5jeSAtLSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGZpbGUgc3lzdGVtCiBvbiBvbmUgbWFjaGluZSBzaG93IHVwIGltbWVkaWF0ZWx5IG9uIGFsbCBvdGhlciBtYWNoaW5lcyBpbiB0aGUgY2x1c3Rlci4KIAotR0ZTIHVzZXMgaW50ZXJjaGFuZ2FibGUgaW50ZXItbm9kZSBsb2NraW5nIG1lY2hhbmlzbXMuICBEaWZmZXJlbnQgbG9jawotbW9kdWxlcyBjYW4gcGx1ZyBpbnRvIEdGUyBhbmQgZWFjaCBmaWxlIHN5c3RlbSBzZWxlY3RzIHRoZSBhcHByb3ByaWF0ZQotbG9jayBtb2R1bGUgYXQgbW91bnQgdGltZS4gIExvY2sgbW9kdWxlcyBpbmNsdWRlOgorR0ZTIHVzZXMgaW50ZXJjaGFuZ2FibGUgaW50ZXItbm9kZSBsb2NraW5nIG1lY2hhbmlzbXMsIHRoZSBjdXJyZW50bHkKK3N1cHBvcnRlZCBtZWNoYW5pc21zIGFyZToKIAogICBsb2NrX25vbG9jayAtLSBhbGxvd3MgZ2ZzIHRvIGJlIHVzZWQgYXMgYSBsb2NhbCBmaWxlIHN5c3RlbQogCiAgIGxvY2tfZGxtIC0tIHVzZXMgYSBkaXN0cmlidXRlZCBsb2NrIG1hbmFnZXIgKGRsbSkgZm9yIGludGVyLW5vZGUgbG9ja2luZwogICBUaGUgZGxtIGlzIGZvdW5kIGF0IGxpbnV4L2ZzL2RsbS8KIAotSW4gYWRkaXRpb24gdG8gaW50ZXJmYWNpbmcgd2l0aCBhbiBleHRlcm5hbCBsb2NraW5nIG1hbmFnZXIsIGEgZ2ZzIGxvY2sKLW1vZHVsZSBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBleHRlcm5hbCBjbHVzdGVyIG1hbmFnZW1lbnQKLXN5c3RlbXMuICBMb2NrX2RsbSBkZXBlbmRzIG9uIHVzZXIgc3BhY2UgY2x1c3RlciBtYW5hZ2VtZW50IHN5c3RlbXMgZm91bmQKK0xvY2tfZGxtIGRlcGVuZHMgb24gdXNlciBzcGFjZSBjbHVzdGVyIG1hbmFnZW1lbnQgc3lzdGVtcyBmb3VuZAogYXQgdGhlIFVSTCBhYm92ZS4KIAogVG8gdXNlIGdmcyBhcyBhIGxvY2FsIGZpbGUgc3lzdGVtLCBubyBleHRlcm5hbCBjbHVzdGVyaW5nIHN5c3RlbXMgYXJlCkBAIC0zMSwxMyArMjgsMTkgQEAKICAgJCBta2ZzIC10IGdmczIgLXAgbG9ja19ub2xvY2sgLWogMSAvZGV2L2Jsb2NrX2RldmljZQogICAkIG1vdW50IC10IGdmczIgL2Rldi9ibG9ja19kZXZpY2UgL2RpcgogCi1HRlMyIGlzIG5vdCBvbi1kaXNrIGNvbXBhdGlibGUgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiBHRlMuCitJZiB5b3UgYXJlIHVzaW5nIEZlZG9yYSwgeW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgZ2ZzMi11dGlscyBwYWNrYWdlCithbmQsIGZvciBsb2NrX2RsbSwgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGluc3RhbGwgdGhlIGNtYW4gcGFja2FnZQorYW5kIHdyaXRlIGEgY2x1c3Rlci5jb25mIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbi4KKworR0ZTMiBpcyBub3Qgb24tZGlzayBjb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnMgb2YgR0ZTLCBidXQgaXQKK2lzIHByZXR0eSBjbG9zZS4KIAogVGhlIGZvbGxvd2luZyBtYW4gcGFnZXMgY2FuIGJlIGZvdW5kIGF0IHRoZSBVUkwgYWJvdmU6Ci0gIGdmczJfZnNjawl0byByZXBhaXIgYSBmaWxlc3lzdGVtCisgIGZzY2suZ2ZzMgl0byByZXBhaXIgYSBmaWxlc3lzdGVtCiAgIGdmczJfZ3Jvdwl0byBleHBhbmQgYSBmaWxlc3lzdGVtIG9ubGluZQogICBnZnMyX2phZGQJdG8gYWRkIGpvdXJuYWxzIHRvIGEgZmlsZXN5c3RlbSBvbmxpbmUKICAgZ2ZzMl90b29sCXRvIG1hbmlwdWxhdGUsIGV4YW1pbmUgYW5kIHR1bmUgYSBmaWxlc3lzdGVtCiAgIGdmczJfcXVvdGEJdG8gZXhhbWluZSBhbmQgY2hhbmdlIHF1b3RhIHZhbHVlcyBpbiBhIGZpbGVzeXN0ZW0KKyAgZ2ZzMl9jb252ZXJ0CXRvIGNvbnZlcnQgYSBnZnMgZmlsZXN5c3RlbSB0byBnZnMyIGluLXBsYWNlCiAgIG1vdW50LmdmczIJdG8gaGVscCBtb3VudCg4KSBtb3VudCBhIGZpbGVzeXN0ZW0KICAgbWtmcy5nZnMyCXRvIG1ha2UgYSBmaWxlc3lzdGVtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Z1dGV4LXJlcXVldWUtcGkudHh0IGIvRG9jdW1lbnRhdGlvbi9mdXRleC1yZXF1ZXVlLXBpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGMxZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9mdXRleC1yZXF1ZXVlLXBpLnR4dApAQCAtMCwwICsxLDEzMSBAQAorRnV0ZXggUmVxdWV1ZSBQSQorLS0tLS0tLS0tLS0tLS0tLQorCitSZXF1ZXVlaW5nIG9mIHRhc2tzIGZyb20gYSBub24tUEkgZnV0ZXggdG8gYSBQSSBmdXRleCByZXF1aXJlcworc3BlY2lhbCBoYW5kbGluZyBpbiBvcmRlciB0byBlbnN1cmUgdGhlIHVuZGVybHlpbmcgcnRfbXV0ZXggaXMgbmV2ZXIKK2xlZnQgd2l0aG91dCBhbiBvd25lciBpZiBpdCBoYXMgd2FpdGVyczsgZG9pbmcgc28gd291bGQgYnJlYWsgdGhlIFBJCitib29zdGluZyBsb2dpYyBbc2VlIHJ0LW11dGV4LWRlc2dpbi50eHRdIEZvciB0aGUgcHVycG9zZXMgb2YKK2JyZXZpdHksIHRoaXMgYWN0aW9uIHdpbGwgYmUgcmVmZXJyZWQgdG8gYXMgInJlcXVldWVfcGkiIHRocm91Z2hvdXQKK3RoaXMgZG9jdW1lbnQuICBQcmlvcml0eSBpbmhlcml0YW5jZSBpcyBhYmJyZXZpYXRlZCB0aHJvdWdob3V0IGFzCisiUEkiLgorCitNb3RpdmF0aW9uCistLS0tLS0tLS0tCisKK1dpdGhvdXQgcmVxdWV1ZV9waSwgdGhlIGdsaWJjIGltcGxlbWVudGF0aW9uIG9mCitwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCkgbXVzdCByZXNvcnQgdG8gd2FraW5nIGFsbCB0aGUgdGFza3Mgd2FpdGluZworb24gYSBwdGhyZWFkX2NvbmR2YXIgYW5kIGxldHRpbmcgdGhlbSB0cnkgdG8gc29ydCBvdXQgd2hpY2ggdGFzaworZ2V0cyB0byBydW4gZmlyc3QgaW4gY2xhc3NpYyB0aHVuZGVyaW5nLWhlcmQgZm9ybWF0aW9uLiAgQW4gaWRlYWwKK2ltcGxlbWVudGF0aW9uIHdvdWxkIHdha2UgdGhlIGhpZ2hlc3QtcHJpb3JpdHkgd2FpdGVyLCBhbmQgbGVhdmUgdGhlCityZXN0IHRvIHRoZSBuYXR1cmFsIHdha2V1cCBpbmhlcmVudCBpbiB1bmxvY2tpbmcgdGhlIG11dGV4Cithc3NvY2lhdGVkIHdpdGggdGhlIGNvbmR2YXIuCisKK0NvbnNpZGVyIHRoZSBzaW1wbGlmaWVkIGdsaWJjIGNhbGxzOgorCisvKiBjYWxsZXIgbXVzdCBsb2NrIG11dGV4ICovCitwdGhyZWFkX2NvbmRfd2FpdChjb25kLCBtdXRleCkKK3sKKwlsb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCXVubG9jayhtdXRleCk7CisJZG8geworCSAgIHVubG9jayhjb25kLT5fX2RhdGEuX19sb2NrKTsKKwkgICBmdXRleF93YWl0KGNvbmQtPl9fZGF0YS5fX2Z1dGV4KTsKKwkgICBsb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCX0gd2hpbGUoLi4uKQorCXVubG9jayhjb25kLT5fX2RhdGEuX19sb2NrKTsKKwlsb2NrKG11dGV4KTsKK30KKworcHRocmVhZF9jb25kX2Jyb2FkY2FzdChjb25kKQoreworCWxvY2soY29uZC0+X19kYXRhLl9fbG9jayk7CisJdW5sb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCWZ1dGV4X3JlcXVldWUoY29uZC0+ZGF0YS5fX2Z1dGV4LCBjb25kLT5tdXRleCk7Cit9CisKK09uY2UgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgpIHJlcXVldWVzIHRoZSB0YXNrcywgdGhlIGNvbmQtPm11dGV4CitoYXMgd2FpdGVycy4gTm90ZSB0aGF0IHB0aHJlYWRfY29uZF93YWl0KCkgYXR0ZW1wdHMgdG8gbG9jayB0aGUKK211dGV4IG9ubHkgYWZ0ZXIgaXQgaGFzIHJldHVybmVkIHRvIHVzZXIgc3BhY2UuICBUaGlzIHdpbGwgbGVhdmUgdGhlCit1bmRlcmx5aW5nIHJ0X211dGV4IHdpdGggd2FpdGVycywgYW5kIG5vIG93bmVyLCBicmVha2luZyB0aGUKK3ByZXZpb3VzbHkgbWVudGlvbmVkIFBJLWJvb3N0aW5nIGFsZ29yaXRobXMuCisKK0luIG9yZGVyIHRvIHN1cHBvcnQgUEktYXdhcmUgcHRocmVhZF9jb25kdmFyJ3MsIHRoZSBrZXJuZWwgbmVlZHMgdG8KK2JlIGFibGUgdG8gcmVxdWV1ZSB0YXNrcyB0byBQSSBmdXRleGVzLiAgVGhpcyBzdXBwb3J0IGltcGxpZXMgdGhhdAordXBvbiBhIHN1Y2Nlc3NmdWwgZnV0ZXhfd2FpdCBzeXN0ZW0gY2FsbCwgdGhlIGNhbGxlciB3b3VsZCByZXR1cm4gdG8KK3VzZXIgc3BhY2UgYWxyZWFkeSBob2xkaW5nIHRoZSBQSSBmdXRleC4gIFRoZSBnbGliYyBpbXBsZW1lbnRhdGlvbgord291bGQgYmUgbW9kaWZpZWQgYXMgZm9sbG93czoKKworCisvKiBjYWxsZXIgbXVzdCBsb2NrIG11dGV4ICovCitwdGhyZWFkX2NvbmRfd2FpdF9waShjb25kLCBtdXRleCkKK3sKKwlsb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCXVubG9jayhtdXRleCk7CisJZG8geworCSAgIHVubG9jayhjb25kLT5fX2RhdGEuX19sb2NrKTsKKwkgICBmdXRleF93YWl0X3JlcXVldWVfcGkoY29uZC0+X19kYXRhLl9fZnV0ZXgpOworCSAgIGxvY2soY29uZC0+X19kYXRhLl9fbG9jayk7CisJfSB3aGlsZSguLi4pCisJdW5sb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworICAgICAgICAvKiB0aGUga2VybmVsIGFjcXVpcmVkIHRoZSB0aGUgbXV0ZXggZm9yIHVzICovCit9CisKK3B0aHJlYWRfY29uZF9icm9hZGNhc3RfcGkoY29uZCkKK3sKKwlsb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCXVubG9jayhjb25kLT5fX2RhdGEuX19sb2NrKTsKKwlmdXRleF9yZXF1ZXVlX3BpKGNvbmQtPmRhdGEuX19mdXRleCwgY29uZC0+bXV0ZXgpOworfQorCitUaGUgYWN0dWFsIGdsaWJjIGltcGxlbWVudGF0aW9uIHdpbGwgbGlrZWx5IHRlc3QgZm9yIFBJIGFuZCBtYWtlIHRoZQorbmVjZXNzYXJ5IGNoYW5nZXMgaW5zaWRlIHRoZSBleGlzdGluZyBjYWxscyByYXRoZXIgdGhhbiBjcmVhdGluZyBuZXcKK2NhbGxzIGZvciB0aGUgUEkgY2FzZXMuICBTaW1pbGFyIGNoYW5nZXMgYXJlIG5lZWRlZCBmb3IKK3B0aHJlYWRfY29uZF90aW1lZHdhaXQoKSBhbmQgcHRocmVhZF9jb25kX3NpZ25hbCgpLgorCitJbXBsZW1lbnRhdGlvbgorLS0tLS0tLS0tLS0tLS0KKworSW4gb3JkZXIgdG8gZW5zdXJlIHRoZSBydF9tdXRleCBoYXMgYW4gb3duZXIgaWYgaXQgaGFzIHdhaXRlcnMsIGl0CitpcyBuZWNlc3NhcnkgZm9yIGJvdGggdGhlIHJlcXVldWUgY29kZSwgYXMgd2VsbCBhcyB0aGUgd2FpdGluZyBjb2RlLAordG8gYmUgYWJsZSB0byBhY3F1aXJlIHRoZSBydF9tdXRleCBiZWZvcmUgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UuCitUaGUgcmVxdWV1ZSBjb2RlIGNhbm5vdCBzaW1wbHkgd2FrZSB0aGUgd2FpdGVyIGFuZCBsZWF2ZSBpdCB0bworYWNxdWlyZSB0aGUgcnRfbXV0ZXggYXMgaXQgd291bGQgb3BlbiBhIHJhY2Ugd2luZG93IGJldHdlZW4gdGhlCityZXF1ZXVlIGNhbGwgcmV0dXJuaW5nIHRvIHVzZXIgc3BhY2UgYW5kIHRoZSB3YWl0ZXIgd2FraW5nIGFuZAorc3RhcnRpbmcgdG8gcnVuLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaW4gdGhlIHVuY29udGVuZGVkIGNhc2UuCisKK1RoZSBzb2x1dGlvbiBpbnZvbHZlcyB0d28gbmV3IHJ0X211dGV4IGhlbHBlciByb3V0aW5lcywKK3J0X211dGV4X3N0YXJ0X3Byb3h5X2xvY2soKSBhbmQgcnRfbXV0ZXhfZmluaXNoX3Byb3h5X2xvY2soKSwgd2hpY2gKK2FsbG93IHRoZSByZXF1ZXVlIGNvZGUgdG8gYWNxdWlyZSBhbiB1bmNvbnRlbmRlZCBydF9tdXRleCBvbiBiZWhhbGYKK29mIHRoZSB3YWl0ZXIgYW5kIHRvIGVucXVldWUgdGhlIHdhaXRlciBvbiBhIGNvbnRlbmRlZCBydF9tdXRleC4KK1R3byBuZXcgc3lzdGVtIGNhbGxzIHByb3ZpZGUgdGhlIGtlcm5lbDwtPnVzZXIgaW50ZXJmYWNlIHRvCityZXF1ZXVlX3BpOiBGVVRFWF9XQUlUX1JFUVVFVUVfUEkgYW5kIEZVVEVYX1JFUVVFVUVfQ01QX1BJLgorCitGVVRFWF9XQUlUX1JFUVVFVUVfUEkgaXMgY2FsbGVkIGJ5IHRoZSB3YWl0ZXIgKHB0aHJlYWRfY29uZF93YWl0KCkKK2FuZCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCkpIHRvIGJsb2NrIG9uIHRoZSBpbml0aWFsIGZ1dGV4IGFuZCB3YWl0Cit0byBiZSByZXF1ZXVlZCB0byBhIFBJLWF3YXJlIGZ1dGV4LiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIHRoZQorcmVzdWx0IG9mIGEgaGlnaC1zcGVlZCBjb2xsaXNpb24gYmV0d2VlbiBmdXRleF93YWl0KCkgYW5kCitmdXRleF9sb2NrX3BpKCksIHdpdGggc29tZSBleHRyYSBsb2dpYyB0byBjaGVjayBmb3IgdGhlIGFkZGl0aW9uYWwKK3dha2UtdXAgc2NlbmFyaW9zLgorCitGVVRFWF9SRVFVRVVFX0NNUF9QSSBpcyBjYWxsZWQgYnkgdGhlIHdha2VyCisocHRocmVhZF9jb25kX2Jyb2FkY2FzdCgpIGFuZCBwdGhyZWFkX2NvbmRfc2lnbmFsKCkpIHRvIHJlcXVldWUgYW5kCitwb3NzaWJseSB3YWtlIHRoZSB3YWl0aW5nIHRhc2tzLiBJbnRlcm5hbGx5LCB0aGlzIHN5c3RlbSBjYWxsIGlzCitzdGlsbCBoYW5kbGVkIGJ5IGZ1dGV4X3JlcXVldWUgKGJ5IHBhc3NpbmcgcmVxdWV1ZV9waT0xKS4gIEJlZm9yZQorcmVxdWV1ZWluZywgZnV0ZXhfcmVxdWV1ZSgpIGF0dGVtcHRzIHRvIGFjcXVpcmUgdGhlIHJlcXVldWUgdGFyZ2V0CitQSSBmdXRleCBvbiBiZWhhbGYgb2YgdGhlIHRvcCB3YWl0ZXIuICBJZiBpdCBjYW4sIHRoaXMgd2FpdGVyIGlzCit3b2tlbi4gIGZ1dGV4X3JlcXVldWUoKSB0aGVuIHByb2NlZWRzIHRvIHJlcXVldWUgdGhlIHJlbWFpbmluZworbnJfd2FrZStucl9yZXF1ZXVlIHRhc2tzIHRvIHRoZSBQSSBmdXRleCwgY2FsbGluZworcnRfbXV0ZXhfc3RhcnRfcHJveHlfbG9jaygpIHByaW9yIHRvIGVhY2ggcmVxdWV1ZSB0byBwcmVwYXJlIHRoZQordGFzayBhcyBhIHdhaXRlciBvbiB0aGUgdW5kZXJseWluZyBydF9tdXRleC4gIEl0IGlzIHBvc3NpYmxlIHRoYXQKK3RoZSBsb2NrIGNhbiBiZSBhY3F1aXJlZCBhdCB0aGlzIHN0YWdlIGFzIHdlbGwsIGlmIHNvLCB0aGUgbmV4dAord2FpdGVyIGlzIHdva2VuIHRvIGZpbmlzaCB0aGUgYWNxdWlzaXRpb24gb2YgdGhlIGxvY2suCisKK0ZVVEVYX1JFUVVFVUVfUEkgYWNjZXB0cyBucl93YWtlIGFuZCBucl9yZXF1ZXVlIGFzIGFyZ3VtZW50cywgYnV0Cit0aGVpciBzdW0gaXMgYWxsIHRoYXQgcmVhbGx5IG1hdHRlcnMuICBmdXRleF9yZXF1ZXVlKCkgd2lsbCB3YWtlIG9yCityZXF1ZXVlIHVwIHRvIG5yX3dha2UgKyBucl9yZXF1ZXVlIHRhc2tzLiAgSXQgd2lsbCB3YWtlIG9ubHkgYXMgbWFueQordGFza3MgYXMgaXQgY2FuIGFjcXVpcmUgdGhlIGxvY2sgZm9yLCB3aGljaCBpbiB0aGUgbWFqb3JpdHkgb2YgY2FzZXMKK3Nob3VsZCBiZSAwIGFzIGdvb2QgcHJvZ3JhbW1pbmcgcHJhY3RpY2UgZGljdGF0ZXMgdGhhdCB0aGUgY2FsbGVyIG9mCitlaXRoZXIgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgpIG9yIHB0aHJlYWRfY29uZF9zaWduYWwoKSBhY3F1aXJlIHRoZQorbXV0ZXggcHJpb3IgdG8gbWFraW5nIHRoZSBjYWxsLiBGVVRFWF9SRVFVRVVFX1BJIHJlcXVpcmVzIHRoYXQKK25yX3dha2U9MS4gIG5yX3JlcXVldWUgc2hvdWxkIGJlIElOVF9NQVggZm9yIGJyb2FkY2FzdCBhbmQgMCBmb3IKK3NpZ25hbC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKaW5kZXggZmQ1Y2FjMC4uN2JjZGViZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQKQEAgLTU2LDcgKzU2LDYgQEAKIAlJU0FQTlAJSVNBIFBuUCBjb2RlIGlzIGVuYWJsZWQuCiAJSVNETglBcHByb3ByaWF0ZSBJU0ROIHN1cHBvcnQgaXMgZW5hYmxlZC4KIAlKT1kJQXBwcm9wcmlhdGUgam95c3RpY2sgc3VwcG9ydCBpcyBlbmFibGVkLgotCUtNRU1UUkFDRSBrbWVtdHJhY2UgaXMgZW5hYmxlZC4KIAlMSUJBVEEgIExpYmF0YSBkcml2ZXIgaXMgZW5hYmxlZAogCUxQCVByaW50ZXIgc3VwcG9ydCBpcyBlbmFibGVkLgogCUxPT1AJTG9vcGJhY2sgZGV2aWNlIHN1cHBvcnQgaXMgZW5hYmxlZC4KQEAgLTMyOSwxMSArMzI4LDYgQEAKIAkJCQkgICAgZmx1c2hlZCBiZWZvcmUgdGhleSB3aWxsIGJlIHJldXNlZCwgd2hpY2gKIAkJCQkgICAgaXMgYSBsb3Qgb2YgZmFzdGVyCiAKLQlhbWRfaW9tbXVfc2l6ZT0gW0hXLFg4Ni02NF0KLQkJCURlZmluZSB0aGUgc2l6ZSBvZiB0aGUgYXBlcnR1cmUgZm9yIHRoZSBBTUQgSU9NTVUKLQkJCWRyaXZlci4gUG9zc2libGUgdmFsdWVzIGFyZToKLQkJCSczMk0nLCAnNjRNJyAoZGVmYXVsdCksICcxMjhNJywgJzI1Nk0nLCAnNTEyTScsICcxRycKLQogCWFtaWpveS5tYXA9CVtIVyxKT1ldIEFtaWdhIGpveXN0aWNrIHN1cHBvcnQKIAkJCU1hcCBvZiBkZXZpY2VzIGF0dGFjaGVkIHRvIEpPWTBEQVQgYW5kIEpPWTFEQVQKIAkJCUZvcm1hdDogPGE+LDxiPgpAQCAtNjQ2LDYgKzY0MCwxMyBAQAogCQkJRE1BLUFQSSBkZWJ1Z2dpbmcgY29kZSBkaXNhYmxlcyBpdHNlbGYgYmVjYXVzZSB0aGUKIAkJCWFyY2hpdGVjdHVyYWwgZGVmYXVsdCBpcyB0b28gbG93LgogCisJZG1hX2RlYnVnX2RyaXZlcj08ZHJpdmVyX25hbWU+CisJCQlXaXRoIHRoaXMgb3B0aW9uIHRoZSBETUEtQVBJIGRlYnVnZ2luZyBkcml2ZXIKKwkJCWZpbHRlciBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIGF0IGJvb3QgdGltZS4gSnVzdAorCQkJcGFzcyB0aGUgZHJpdmVyIHRvIGZpbHRlciBmb3IgYXMgdGhlIHBhcmFtZXRlci4KKwkJCVRoZSBmaWx0ZXIgY2FuIGJlIGRpc2FibGVkIG9yIGNoYW5nZWQgdG8gYW5vdGhlcgorCQkJZHJpdmVyIGxhdGVyIHVzaW5nIHN5c2ZzLgorCiAJZHNjYzQuc2V0dXA9CVtORVRdCiAKIAlkdGMzMTgxZT0JW0hXLFNDU0ldCkBAIC03NTIsMTIgKzc1MywyNSBAQAogCQkJaWE2NF9wYWxfY2FjaGVfZmx1c2ggaW5zdGVhZCBvZiBTQUxfQ0FDSEVfRkxVU0guCiAKIAlmdHJhY2U9W3RyYWNlcl0KLQkJCVtmdHJhY2VdIHdpbGwgc2V0IGFuZCBzdGFydCB0aGUgc3BlY2lmaWVkIHRyYWNlcgorCQkJW0ZUUkFDRV0gd2lsbCBzZXQgYW5kIHN0YXJ0IHRoZSBzcGVjaWZpZWQgdHJhY2VyCiAJCQlhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiBvcmRlciB0byBmYWNpbGl0YXRlIGVhcmx5CiAJCQlib290IGRlYnVnZ2luZy4KIAogCWZ0cmFjZV9kdW1wX29uX29vcHMKLQkJCVtmdHJhY2VdIHdpbGwgZHVtcCB0aGUgdHJhY2UgYnVmZmVycyBvbiBvb3BzLgorCQkJW0ZUUkFDRV0gd2lsbCBkdW1wIHRoZSB0cmFjZSBidWZmZXJzIG9uIG9vcHMuCisKKwlmdHJhY2VfZmlsdGVyPVtmdW5jdGlvbi1saXN0XQorCQkJW0ZUUkFDRV0gTGltaXQgdGhlIGZ1bmN0aW9ucyB0cmFjZWQgYnkgdGhlIGZ1bmN0aW9uCisJCQl0cmFjZXIgYXQgYm9vdCB1cC4gZnVuY3Rpb24tbGlzdCBpcyBhIGNvbW1hIHNlcGFyYXRlZAorCQkJbGlzdCBvZiBmdW5jdGlvbnMuIFRoaXMgbGlzdCBjYW4gYmUgY2hhbmdlZCBhdCBydW4KKwkJCXRpbWUgYnkgdGhlIHNldF9mdHJhY2VfZmlsdGVyIGZpbGUgaW4gdGhlIGRlYnVnZnMKKwkJCXRyYWNpbmcgZGlyZWN0b3J5LiAKKworCWZ0cmFjZV9ub3RyYWNlPVtmdW5jdGlvbi1saXN0XQorCQkJW0ZUUkFDRV0gRG8gbm90IHRyYWNlIHRoZSBmdW5jdGlvbnMgc3BlY2lmaWVkIGluCisJCQlmdW5jdGlvbi1saXN0LiBUaGlzIGxpc3QgY2FuIGJlIGNoYW5nZWQgYXQgcnVuIHRpbWUKKwkJCWJ5IHRoZSBzZXRfZnRyYWNlX25vdHJhY2UgZmlsZSBpbiB0aGUgZGVidWdmcworCQkJdHJhY2luZyBkaXJlY3RvcnkuCiAKIAlnYW1lY29uLm1hcFsyfDNdPQogCQkJW0hXLEpPWV0gTXVsdGlzeXN0ZW0gam95c3RpY2sgYW5kIE5FUy9TTkVTL1BTWCBwYWQKQEAgLTkxNCw2ICs5MjgsMTIgQEAKIAkJCUZvcm10OiB7ICJzaGExIiB8ICJtZDUiIH0KIAkJCWRlZmF1bHQ6ICJzaGExIgogCisJaW1hX3RjYgkJW0lNQV0KKwkJCUxvYWQgYSBwb2xpY3kgd2hpY2ggbWVldHMgdGhlIG5lZWRzIG9mIHRoZSBUcnVzdGVkCisJCQlDb21wdXRpbmcgQmFzZS4gIFRoaXMgbWVhbnMgSU1BIHdpbGwgbWVhc3VyZSBhbGwKKwkJCXByb2dyYW1zIGV4ZWMnZCwgZmlsZXMgbW1hcCdkIGZvciBleGVjLCBhbmQgYWxsIGZpbGVzCisJCQlvcGVuZWQgZm9yIHJlYWQgYnkgdWlkPTAuCisKIAlpbjIwMDA9CQlbSFcsU0NTSV0KIAkJCVNlZSBoZWFkZXIgb2YgZHJpdmVycy9zY3NpL2luMjAwMC5jLgogCkBAIC0xMDU0LDE1ICsxMDc0LDYgQEAKIAkJCXVzZSB0aGUgSGlnaE1lbSB6b25lIGlmIGl0IGV4aXN0cywgYW5kIHRoZSBOb3JtYWwKIAkJCXpvbmUgaWYgaXQgZG9lcyBub3QuCiAKLQlrbWVtdHJhY2UuZW5hYmxlPQlbS05MLEtNRU1UUkFDRV0gRm9ybWF0OiB7IHllcyB8IG5vIH0KLQkJCQlDb250cm9scyB3aGV0aGVyIGttZW10cmFjZSBpcyBlbmFibGVkCi0JCQkJYXQgYm9vdC10aW1lLgotCi0Ja21lbXRyYWNlLnN1YmJ1ZnM9bglbS05MLEtNRU1UUkFDRV0gT3ZlcnJpZGVzIHRoZSBudW1iZXIgb2YKLQkJCXN1YmJ1ZnMga21lbXRyYWNlJ3MgcmVsYXkgY2hhbm5lbCBoYXMuIFNldCB0aGlzCi0JCQloaWdoZXIgdGhhbiBkZWZhdWx0IChLTUVNVFJBQ0VfTl9TVUJCVUZTIGluIGNvZGUpIGlmCi0JCQl5b3UgZXhwZXJpZW5jZSBidWZmZXIgb3ZlcnJ1bnMuCi0KIAlrZ2Rib2M9CQlbSFddIGtnZGIgb3ZlciBjb25zb2xlcy4KIAkJCVJlcXVpcmVzIGEgdHR5IGRyaXZlciB0aGF0IHN1cHBvcnRzIGNvbnNvbGUgcG9sbGluZy4KIAkJCShvbmx5IHNlcmlhbCBzdXBvcnRlZCBmb3Igbm93KQpAQCAtMTA3Miw2ICsxMDgzLDEwIEBACiAJCQlDb25maWd1cmUgdGhlIFJvdXRlckJvYXJkIDUzMiBzZXJpZXMgb24tY2hpcAogCQkJRXRoZXJuZXQgYWRhcHRlciBNQUMgYWRkcmVzcy4KIAorCWttZW1sZWFrPQlbS05MXSBCb290LXRpbWUga21lbWxlYWsgZW5hYmxlL2Rpc2FibGUKKwkJCVZhbGlkIGFyZ3VtZW50czogb24sIG9mZgorCQkJRGVmYXVsdDogb24KKwogCWtzdGFjaz1OCVtYODZdIFByaW50IE4gd29yZHMgZnJvbSB0aGUga2VybmVsIHN0YWNrCiAJCQlpbiBvb3BzIGR1bXBzLgogCkBAIC0xNTc1LDYgKzE1OTAsOSBAQAogCW5vaW5pdHJkCVtSQU1dIFRlbGxzIHRoZSBrZXJuZWwgbm90IHRvIGxvYWQgYW55IGNvbmZpZ3VyZWQKIAkJCWluaXRpYWwgUkFNIGRpc2suCiAKKwlub2ludHJlbWFwCVtYODYtNjQsIEludGVsLUlPTU1VXSBEbyBub3QgZW5hYmxlIGludGVycnVwdAorCQkJcmVtYXBwaW5nLgorCiAJbm9pbnRyb3V0ZQlbSUEtNjRdCiAKIAlub2ppdHRlcglbSUE2NF0gRGlzYWJsZXMgaml0dGVyIGNoZWNraW5nIGZvciBJVEMgdGltZXJzLgpAQCAtMTY2MCw2ICsxNjc4LDE0IEBACiAJb3Byb2ZpbGUudGltZXI9CVtIV10KIAkJCVVzZSB0aW1lciBpbnRlcnJ1cHQgaW5zdGVhZCBvZiBwZXJmb3JtYW5jZSBjb3VudGVycwogCisJb3Byb2ZpbGUuY3B1X3R5cGU9CUZvcmNlIGFuIG9wcm9maWxlIGNwdSB0eXBlCisJCQlUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhbiBvbGRlciBvcHJvZmlsZQorCQkJdXNlcmxhbmQgb3IgaWYgeW91IHdhbnQgY29tbW9uIGV2ZW50cy4KKwkJCUZvcm1hdDogeyBhcmNocGVyZm1vbiB9CisJCQlhcmNocGVyZm1vbjogW1g4Nl0gRm9yY2UgdXNlIG9mIGFyY2hpdGVjdHVyYWwKKwkJCQlwZXJmbW9uIG9uIEludGVsIENQVXMgaW5zdGVhZCBvZiB0aGUKKwkJCQlDUFUgc3BlY2lmaWMgZXZlbnQgc2V0LgorCiAJb3NzdD0JCVtIVyxTQ1NJXSBTQ1NJIFRhcGUgRHJpdmVyCiAJCQlGb3JtYXQ6IDxidWZmZXJfc2l6ZT4sPHdyaXRlX3RocmVzaG9sZD4KIAkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vc2NzaS9zdC50eHQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dCBiL0RvY3VtZW50YXRpb24va21lbWxlYWsudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTJkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dApAQCAtMCwwICsxLDE0MiBAQAorS2VybmVsIE1lbW9yeSBMZWFrIERldGVjdG9yCis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworS21lbWxlYWsgcHJvdmlkZXMgYSB3YXkgb2YgZGV0ZWN0aW5nIHBvc3NpYmxlIGtlcm5lbCBtZW1vcnkgbGVha3MgaW4gYQord2F5IHNpbWlsYXIgdG8gYSB0cmFjaW5nIGdhcmJhZ2UgY29sbGVjdG9yCisoaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HYXJiYWdlX2NvbGxlY3Rpb25fJTI4Y29tcHV0ZXJfc2NpZW5jZSUyOSNUcmFjaW5nX2dhcmJhZ2VfY29sbGVjdG9ycyksCit3aXRoIHRoZSBkaWZmZXJlbmNlIHRoYXQgdGhlIG9ycGhhbiBvYmplY3RzIGFyZSBub3QgZnJlZWQgYnV0IG9ubHkKK3JlcG9ydGVkIHZpYSAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhay4gQSBzaW1pbGFyIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZQorVmFsZ3JpbmQgdG9vbCAobWVtY2hlY2sgLS1sZWFrLWNoZWNrKSB0byBkZXRlY3QgdGhlIG1lbW9yeSBsZWFrcyBpbgordXNlci1zcGFjZSBhcHBsaWNhdGlvbnMuCisKK1VzYWdlCistLS0tLQorCitDT05GSUdfREVCVUdfS01FTUxFQUsgaW4gIktlcm5lbCBoYWNraW5nIiBoYXMgdG8gYmUgZW5hYmxlZC4gQSBrZXJuZWwKK3RocmVhZCBzY2FucyB0aGUgbWVtb3J5IGV2ZXJ5IDEwIG1pbnV0ZXMgKGJ5IGRlZmF1bHQpIGFuZCBwcmludHMgYW55IG5ldwordW5yZWZlcmVuY2VkIG9iamVjdHMgZm91bmQuIFRvIHRyaWdnZXIgYW4gaW50ZXJtZWRpYXRlIHNjYW4gYW5kIGRpc3BsYXkKK2FsbCB0aGUgcG9zc2libGUgbWVtb3J5IGxlYWtzOgorCisgICMgbW91bnQgLXQgZGVidWdmcyBub2RldiAvc3lzL2tlcm5lbC9kZWJ1Zy8KKyAgIyBjYXQgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsKKworTm90ZSB0aGF0IHRoZSBvcnBoYW4gb2JqZWN0cyBhcmUgbGlzdGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYWxsb2NhdGVkCithbmQgb25lIG9iamVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG1heSBjYXVzZSBvdGhlciBzdWJzZXF1ZW50CitvYmplY3RzIHRvIGJlIHJlcG9ydGVkIGFzIG9ycGhhbi4KKworTWVtb3J5IHNjYW5uaW5nIHBhcmFtZXRlcnMgY2FuIGJlIG1vZGlmaWVkIGF0IHJ1bi10aW1lIGJ5IHdyaXRpbmcgdG8gdGhlCisvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhayBmaWxlLiBUaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZDoKKworICBvZmYJCS0gZGlzYWJsZSBrbWVtbGVhayAoaXJyZXZlcnNpYmxlKQorICBzdGFjaz1vbgktIGVuYWJsZSB0aGUgdGFzayBzdGFja3Mgc2Nhbm5pbmcKKyAgc3RhY2s9b2ZmCS0gZGlzYWJsZSB0aGUgdGFza3Mgc3RhY2tzIHNjYW5uaW5nCisgIHNjYW49b24JLSBzdGFydCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyB0aHJlYWQKKyAgc2Nhbj1vZmYJLSBzdG9wIHRoZSBhdXRvbWF0aWMgbWVtb3J5IHNjYW5uaW5nIHRocmVhZAorICBzY2FuPTxzZWNzPgktIHNldCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyBwZXJpb2QgaW4gc2Vjb25kcyAoMAorCQkgIHRvIGRpc2FibGUgaXQpCisKK0ttZW1sZWFrIGNhbiBhbHNvIGJlIGRpc2FibGVkIGF0IGJvb3QtdGltZSBieSBwYXNzaW5nICJrbWVtbGVhaz1vZmYiIG9uCit0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworQmFzaWMgQWxnb3JpdGhtCistLS0tLS0tLS0tLS0tLS0KKworVGhlIG1lbW9yeSBhbGxvY2F0aW9ucyB2aWEga21hbGxvYywgdm1hbGxvYywga21lbV9jYWNoZV9hbGxvYyBhbmQKK2ZyaWVuZHMgYXJlIHRyYWNlZCBhbmQgdGhlIHBvaW50ZXJzLCB0b2dldGhlciB3aXRoIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uIGxpa2Ugc2l6ZSBhbmQgc3RhY2sgdHJhY2UsIGFyZSBzdG9yZWQgaW4gYSBwcmlvIHNlYXJjaCB0cmVlLgorVGhlIGNvcnJlc3BvbmRpbmcgZnJlZWluZyBmdW5jdGlvbiBjYWxscyBhcmUgdHJhY2tlZCBhbmQgdGhlIHBvaW50ZXJzCityZW1vdmVkIGZyb20gdGhlIGttZW1sZWFrIGRhdGEgc3RydWN0dXJlcy4KKworQW4gYWxsb2NhdGVkIGJsb2NrIG9mIG1lbW9yeSBpcyBjb25zaWRlcmVkIG9ycGhhbiBpZiBubyBwb2ludGVyIHRvIGl0cworc3RhcnQgYWRkcmVzcyBvciB0byBhbnkgbG9jYXRpb24gaW5zaWRlIHRoZSBibG9jayBjYW4gYmUgZm91bmQgYnkKK3NjYW5uaW5nIHRoZSBtZW1vcnkgKGluY2x1ZGluZyBzYXZlZCByZWdpc3RlcnMpLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUKK21pZ2h0IGJlIG5vIHdheSBmb3IgdGhlIGtlcm5lbCB0byBwYXNzIHRoZSBhZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQKK2Jsb2NrIHRvIGEgZnJlZWluZyBmdW5jdGlvbiBhbmQgdGhlcmVmb3JlIHRoZSBibG9jayBpcyBjb25zaWRlcmVkIGEKK21lbW9yeSBsZWFrLgorCitUaGUgc2Nhbm5pbmcgYWxnb3JpdGhtIHN0ZXBzOgorCisgIDEuIG1hcmsgYWxsIG9iamVjdHMgYXMgd2hpdGUgKHJlbWFpbmluZyB3aGl0ZSBvYmplY3RzIHdpbGwgbGF0ZXIgYmUKKyAgICAgY29uc2lkZXJlZCBvcnBoYW4pCisgIDIuIHNjYW4gdGhlIG1lbW9yeSBzdGFydGluZyB3aXRoIHRoZSBkYXRhIHNlY3Rpb24gYW5kIHN0YWNrcywgY2hlY2tpbmcKKyAgICAgdGhlIHZhbHVlcyBhZ2FpbnN0IHRoZSBhZGRyZXNzZXMgc3RvcmVkIGluIHRoZSBwcmlvIHNlYXJjaCB0cmVlLiBJZgorICAgICBhIHBvaW50ZXIgdG8gYSB3aGl0ZSBvYmplY3QgaXMgZm91bmQsIHRoZSBvYmplY3QgaXMgYWRkZWQgdG8gdGhlCisgICAgIGdyYXkgbGlzdAorICAzLiBzY2FuIHRoZSBncmF5IG9iamVjdHMgZm9yIG1hdGNoaW5nIGFkZHJlc3NlcyAoc29tZSB3aGl0ZSBvYmplY3RzCisgICAgIGNhbiBiZWNvbWUgZ3JheSBhbmQgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZ3JheSBsaXN0KSB1bnRpbCB0aGUKKyAgICAgZ3JheSBzZXQgaXMgZmluaXNoZWQKKyAgNC4gdGhlIHJlbWFpbmluZyB3aGl0ZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIG9ycGhhbiBhbmQgcmVwb3J0ZWQgdmlhCisgICAgIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrCisKK1NvbWUgYWxsb2NhdGVkIG1lbW9yeSBibG9ja3MgaGF2ZSBwb2ludGVycyBzdG9yZWQgaW4gdGhlIGtlcm5lbCdzCitpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgYW5kIHRoZXkgY2Fubm90IGJlIGRldGVjdGVkIGFzIG9ycGhhbnMuIFRvCithdm9pZCB0aGlzLCBrbWVtbGVhayBjYW4gYWxzbyBzdG9yZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBwb2ludGluZyB0byBhbgorYWRkcmVzcyBpbnNpZGUgdGhlIGJsb2NrIGFkZHJlc3MgcmFuZ2UgdGhhdCBuZWVkIHRvIGJlIGZvdW5kIHNvIHRoYXQgdGhlCitibG9jayBpcyBub3QgY29uc2lkZXJlZCBhIGxlYWsuIE9uZSBleGFtcGxlIGlzIF9fdm1hbGxvYygpLgorCitLbWVtbGVhayBBUEkKKy0tLS0tLS0tLS0tLQorCitTZWUgdGhlIGluY2x1ZGUvbGludXgva21lbWxlYWsuaCBoZWFkZXIgZm9yIHRoZSBmdW5jdGlvbnMgcHJvdG90eXBlLgorCitrbWVtbGVha19pbml0CQkgLSBpbml0aWFsaXplIGttZW1sZWFrCitrbWVtbGVha19hbGxvYwkJIC0gbm90aWZ5IG9mIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRpb24KK2ttZW1sZWFrX2ZyZWUJCSAtIG5vdGlmeSBvZiBhIG1lbW9yeSBibG9jayBmcmVlaW5nCitrbWVtbGVha19ub3RfbGVhawkgLSBtYXJrIGFuIG9iamVjdCBhcyBub3QgYSBsZWFrCitrbWVtbGVha19pZ25vcmUJCSAtIGRvIG5vdCBzY2FuIG9yIHJlcG9ydCBhbiBvYmplY3QgYXMgbGVhawora21lbWxlYWtfc2Nhbl9hcmVhCSAtIGFkZCBzY2FuIGFyZWFzIGluc2lkZSBhIG1lbW9yeSBibG9jawora21lbWxlYWtfbm9fc2NhbgkgLSBkbyBub3Qgc2NhbiBhIG1lbW9yeSBibG9jawora21lbWxlYWtfZXJhc2UJCSAtIGVyYXNlIGFuIG9sZCB2YWx1ZSBpbiBhIHBvaW50ZXIgdmFyaWFibGUKK2ttZW1sZWFrX2FsbG9jX3JlY3Vyc2l2ZSAtIGFzIGttZW1sZWFrX2FsbG9jIGJ1dCBjaGVja3MgdGhlIHJlY3Vyc2l2ZW5lc3MKK2ttZW1sZWFrX2ZyZWVfcmVjdXJzaXZlCSAtIGFzIGttZW1sZWFrX2ZyZWUgYnV0IGNoZWNrcyB0aGUgcmVjdXJzaXZlbmVzcworCitEZWFsaW5nIHdpdGggZmFsc2UgcG9zaXRpdmVzL25lZ2F0aXZlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGZhbHNlIG5lZ2F0aXZlcyBhcmUgcmVhbCBtZW1vcnkgbGVha3MgKG9ycGhhbiBvYmplY3RzKSBidXQgbm90CityZXBvcnRlZCBieSBrbWVtbGVhayBiZWNhdXNlIHZhbHVlcyBmb3VuZCBkdXJpbmcgdGhlIG1lbW9yeSBzY2FubmluZworcG9pbnQgdG8gc3VjaCBvYmplY3RzLiBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBmYWxzZSBuZWdhdGl2ZXMsIGttZW1sZWFrCitwcm92aWRlcyB0aGUga21lbWxlYWtfaWdub3JlLCBrbWVtbGVha19zY2FuX2FyZWEsIGttZW1sZWFrX25vX3NjYW4gYW5kCitrbWVtbGVha19lcmFzZSBmdW5jdGlvbnMgKHNlZSBhYm92ZSkuIFRoZSB0YXNrIHN0YWNrcyBhbHNvIGluY3JlYXNlIHRoZQorYW1vdW50IG9mIGZhbHNlIG5lZ2F0aXZlcyBhbmQgdGhlaXIgc2Nhbm5pbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KKworVGhlIGZhbHNlIHBvc2l0aXZlcyBhcmUgb2JqZWN0cyB3cm9uZ2x5IHJlcG9ydGVkIGFzIGJlaW5nIG1lbW9yeSBsZWFrcworKG9ycGhhbikuIEZvciBvYmplY3RzIGtub3duIG5vdCB0byBiZSBsZWFrcywga21lbWxlYWsgcHJvdmlkZXMgdGhlCitrbWVtbGVha19ub3RfbGVhayBmdW5jdGlvbi4gVGhlIGttZW1sZWFrX2lnbm9yZSBjb3VsZCBhbHNvIGJlIHVzZWQgaWYKK3RoZSBtZW1vcnkgYmxvY2sgaXMga25vd24gbm90IHRvIGNvbnRhaW4gb3RoZXIgcG9pbnRlcnMgYW5kIGl0IHdpbGwgbm8KK2xvbmdlciBiZSBzY2FubmVkLgorCitTb21lIG9mIHRoZSByZXBvcnRlZCBsZWFrcyBhcmUgb25seSB0cmFuc2llbnQsIGVzcGVjaWFsbHkgb24gU01QCitzeXN0ZW1zLCBiZWNhdXNlIG9mIHBvaW50ZXJzIHRlbXBvcmFyaWx5IHN0b3JlZCBpbiBDUFUgcmVnaXN0ZXJzIG9yCitzdGFja3MuIEttZW1sZWFrIGRlZmluZXMgTVNFQ1NfTUlOX0FHRSAoZGVmYXVsdGluZyB0byAxMDAwKSByZXByZXNlbnRpbmcKK3RoZSBtaW5pbXVtIGFnZSBvZiBhbiBvYmplY3QgdG8gYmUgcmVwb3J0ZWQgYXMgYSBtZW1vcnkgbGVhay4KKworTGltaXRhdGlvbnMgYW5kIERyYXdiYWNrcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgbWFpbiBkcmF3YmFjayBpcyB0aGUgcmVkdWNlZCBwZXJmb3JtYW5jZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQKK2ZyZWVpbmcuIFRvIGF2b2lkIG90aGVyIHBlbmFsdGllcywgdGhlIG1lbW9yeSBzY2FubmluZyBpcyBvbmx5IHBlcmZvcm1lZAord2hlbiB0aGUgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgZmlsZSBpcyByZWFkLiBBbnl3YXksIHRoaXMgdG9vbCBpcworaW50ZW5kZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aGVyZSB0aGUgcGVyZm9ybWFuY2UgbWlnaHQgbm90IGJlIHRoZQorbW9zdCBpbXBvcnRhbnQgcmVxdWlyZW1lbnQuCisKK1RvIGtlZXAgdGhlIGFsZ29yaXRobSBzaW1wbGUsIGttZW1sZWFrIHNjYW5zIGZvciB2YWx1ZXMgcG9pbnRpbmcgdG8gYW55CithZGRyZXNzIGluc2lkZSBhIGJsb2NrJ3MgYWRkcmVzcyByYW5nZS4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbmNyZWFzZWQKK251bWJlciBvZiBmYWxzZSBuZWdhdGl2ZXMuIEhvd2V2ZXIsIGl0IGlzIGxpa2VseSB0aGF0IGEgcmVhbCBtZW1vcnkgbGVhaword2lsbCBldmVudHVhbGx5IGJlY29tZSB2aXNpYmxlLgorCitBbm90aGVyIHNvdXJjZSBvZiBmYWxzZSBuZWdhdGl2ZXMgaXMgdGhlIGRhdGEgc3RvcmVkIGluIG5vbi1wb2ludGVyCit2YWx1ZXMuIEluIGEgZnV0dXJlIHZlcnNpb24sIGttZW1sZWFrIGNvdWxkIG9ubHkgc2NhbiB0aGUgcG9pbnRlcgorbWVtYmVycyBpbiB0aGUgYWxsb2NhdGVkIHN0cnVjdHVyZXMuIFRoaXMgZmVhdHVyZSB3b3VsZCBzb2x2ZSBtYW55IG9mCit0aGUgZmFsc2UgbmVnYXRpdmUgY2FzZXMgZGVzY3JpYmVkIGFib3ZlLgorCitUaGUgdG9vbCBjYW4gcmVwb3J0IGZhbHNlIHBvc2l0aXZlcy4gVGhlc2UgYXJlIGNhc2VzIHdoZXJlIGFuIGFsbG9jYXRlZAorYmxvY2sgZG9lc24ndCBuZWVkIHRvIGJlIGZyZWVkIChzb21lIGNhc2VzIGluIHRoZSBpbml0X2NhbGwgZnVuY3Rpb25zKSwKK3RoZSBwb2ludGVyIGlzIGNhbGN1bGF0ZWQgYnkgb3RoZXIgbWV0aG9kcyB0aGFuIHRoZSB1c3VhbCBjb250YWluZXJfb2YKK21hY3JvIG9yIHRoZSBwb2ludGVyIGlzIHN0b3JlZCBpbiBhIGxvY2F0aW9uIG5vdCBzY2FubmVkIGJ5IGttZW1sZWFrLgorCitQYWdlIGFsbG9jYXRpb25zIGFuZCBpb3JlbWFwIGFyZSBub3QgdHJhY2tlZC4gT25seSB0aGUgQVJNIGFuZCB4ODYKK2FyY2hpdGVjdHVyZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQgYi9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKaW5kZXggZjViNzEyNy4uN2Y1ODA5ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dApAQCAtMzEsNiArMzEsNyBAQAogCiAgICAgIC0gTG9ja2luZyBmdW5jdGlvbnMuCiAgICAgIC0gSW50ZXJydXB0IGRpc2FibGluZyBmdW5jdGlvbnMuCisgICAgIC0gU2xlZXAgYW5kIHdha2UtdXAgZnVuY3Rpb25zLgogICAgICAtIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zLgogCiAgKCopIEludGVyLUNQVSBsb2NraW5nIGJhcnJpZXIgZWZmZWN0cy4KQEAgLTEyMTcsNiArMTIxOCwxMzIgQEAKIG90aGVyIG1lYW5zLgogCiAKK1NMRUVQIEFORCBXQUtFLVVQIEZVTkNUSU9OUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NsZWVwaW5nIGFuZCB3YWtpbmcgb24gYW4gZXZlbnQgZmxhZ2dlZCBpbiBnbG9iYWwgZGF0YSBjYW4gYmUgdmlld2VkIGFzIGFuCitpbnRlcmFjdGlvbiBiZXR3ZWVuIHR3byBwaWVjZXMgb2YgZGF0YTogdGhlIHRhc2sgc3RhdGUgb2YgdGhlIHRhc2sgd2FpdGluZyBmb3IKK3RoZSBldmVudCBhbmQgdGhlIGdsb2JhbCBkYXRhIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGV2ZW50LiAgVG8gbWFrZSBzdXJlIHRoYXQKK3RoZXNlIGFwcGVhciB0byBoYXBwZW4gaW4gdGhlIHJpZ2h0IG9yZGVyLCB0aGUgcHJpbWl0aXZlcyB0byBiZWdpbiB0aGUgcHJvY2Vzcworb2YgZ29pbmcgdG8gc2xlZXAsIGFuZCB0aGUgcHJpbWl0aXZlcyB0byBpbml0aWF0ZSBhIHdha2UgdXAgaW1wbHkgY2VydGFpbgorYmFycmllcnMuCisKK0ZpcnN0bHksIHRoZSBzbGVlcGVyIG5vcm1hbGx5IGZvbGxvd3Mgc29tZXRoaW5nIGxpa2UgdGhpcyBzZXF1ZW5jZSBvZiBldmVudHM6CisKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGV2ZW50X2luZGljYXRlZCkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKworQSBnZW5lcmFsIG1lbW9yeSBiYXJyaWVyIGlzIGludGVycG9sYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNldF9jdXJyZW50X3N0YXRlKCkKK2FmdGVyIGl0IGhhcyBhbHRlcmVkIHRoZSB0YXNrIHN0YXRlOgorCisJQ1BVIDEKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJc2V0X2N1cnJlbnRfc3RhdGUoKTsKKwkgIHNldF9tYigpOworCSAgICBTVE9SRSBjdXJyZW50LT5zdGF0ZQorCSAgICA8Z2VuZXJhbCBiYXJyaWVyPgorCUxPQUQgZXZlbnRfaW5kaWNhdGVkCisKK3NldF9jdXJyZW50X3N0YXRlKCkgbWF5IGJlIHdyYXBwZWQgYnk6CisKKwlwcmVwYXJlX3RvX3dhaXQoKTsKKwlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCk7CisKK3doaWNoIHRoZXJlZm9yZSBhbHNvIGltcGx5IGEgZ2VuZXJhbCBtZW1vcnkgYmFycmllciBhZnRlciBzZXR0aW5nIHRoZSBzdGF0ZS4KK1RoZSB3aG9sZSBzZXF1ZW5jZSBhYm92ZSBpcyBhdmFpbGFibGUgaW4gdmFyaW91cyBjYW5uZWQgZm9ybXMsIGFsbCBvZiB3aGljaAoraW50ZXJwb2xhdGUgdGhlIG1lbW9yeSBiYXJyaWVyIGluIHRoZSByaWdodCBwbGFjZToKKworCXdhaXRfZXZlbnQoKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfZXhjbHVzaXZlKCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKTsKKwl3YWl0X2V2ZW50X2tpbGxhYmxlKCk7CisJd2FpdF9ldmVudF90aW1lb3V0KCk7CisJd2FpdF9vbl9iaXQoKTsKKwl3YWl0X29uX2JpdF9sb2NrKCk7CisKKworU2Vjb25kbHksIGNvZGUgdGhhdCBwZXJmb3JtcyBhIHdha2UgdXAgbm9ybWFsbHkgZm9sbG93cyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisJZXZlbnRfaW5kaWNhdGVkID0gMTsKKwl3YWtlX3VwKCZldmVudF93YWl0X3F1ZXVlKTsKKworb3I6CisKKwlldmVudF9pbmRpY2F0ZWQgPSAxOworCXdha2VfdXBfcHJvY2VzcyhldmVudF9kYWVtb24pOworCitBIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGlzIGltcGxpZWQgYnkgd2FrZV91cCgpIGFuZCBjby4gaWYgYW5kIG9ubHkgaWYgdGhleSB3YWtlCitzb21ldGhpbmcgdXAuICBUaGUgYmFycmllciBvY2N1cnMgYmVmb3JlIHRoZSB0YXNrIHN0YXRlIGlzIGNsZWFyZWQsIGFuZCBzbyBzaXRzCitiZXR3ZWVuIHRoZSBTVE9SRSB0byBpbmRpY2F0ZSB0aGUgZXZlbnQgYW5kIHRoZSBTVE9SRSB0byBzZXQgVEFTS19SVU5OSU5HOgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlzZXRfY3VycmVudF9zdGF0ZSgpOwkJU1RPUkUgZXZlbnRfaW5kaWNhdGVkCisJICBzZXRfbWIoKTsJCQl3YWtlX3VwKCk7CisJICAgIFNUT1JFIGN1cnJlbnQtPnN0YXRlCSAgPHdyaXRlIGJhcnJpZXI+CisJICAgIDxnZW5lcmFsIGJhcnJpZXI+CQkgIFNUT1JFIGN1cnJlbnQtPnN0YXRlCisJTE9BRCBldmVudF9pbmRpY2F0ZWQKKworVGhlIGF2YWlsYWJsZSB3YWtlciBmdW5jdGlvbnMgaW5jbHVkZToKKworCWNvbXBsZXRlKCk7CisJd2FrZV91cCgpOworCXdha2VfdXBfYWxsKCk7CisJd2FrZV91cF9iaXQoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX25yKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYygpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jX3BvbGwoKTsKKwl3YWtlX3VwX2xvY2tlZCgpOworCXdha2VfdXBfbG9ja2VkX3BvbGwoKTsKKwl3YWtlX3VwX25yKCk7CisJd2FrZV91cF9wb2xsKCk7CisJd2FrZV91cF9wcm9jZXNzKCk7CisKKworWyFdIE5vdGUgdGhhdCB0aGUgbWVtb3J5IGJhcnJpZXJzIGltcGxpZWQgYnkgdGhlIHNsZWVwZXIgYW5kIHRoZSB3YWtlciBkbyBfbm90Xworb3JkZXIgbXVsdGlwbGUgc3RvcmVzIGJlZm9yZSB0aGUgd2FrZS11cCB3aXRoIHJlc3BlY3QgdG8gbG9hZHMgb2YgdGhvc2Ugc3RvcmVkCit2YWx1ZXMgYWZ0ZXIgdGhlIHNsZWVwZXIgaGFzIGNhbGxlZCBzZXRfY3VycmVudF9zdGF0ZSgpLiAgRm9yIGluc3RhbmNlLCBpZiB0aGUKK3NsZWVwZXIgZG9lczoKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJaWYgKGV2ZW50X2luZGljYXRlZCkKKwkJYnJlYWs7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCWRvX3NvbWV0aGluZyhteV9kYXRhKTsKKworYW5kIHRoZSB3YWtlciBkb2VzOgorCisJbXlfZGF0YSA9IHZhbHVlOworCWV2ZW50X2luZGljYXRlZCA9IDE7CisJd2FrZV91cCgmZXZlbnRfd2FpdF9xdWV1ZSk7CisKK3RoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGNoYW5nZSB0byBldmVudF9pbmRpY2F0ZWQgd2lsbCBiZSBwZXJjZWl2ZWQgYnkKK3RoZSBzbGVlcGVyIGFzIGNvbWluZyBhZnRlciB0aGUgY2hhbmdlIHRvIG15X2RhdGEuICBJbiBzdWNoIGEgY2lyY3Vtc3RhbmNlLCB0aGUKK2NvZGUgb24gYm90aCBzaWRlcyBtdXN0IGludGVycG9sYXRlIGl0cyBvd24gbWVtb3J5IGJhcnJpZXJzIGJldHdlZW4gdGhlCitzZXBhcmF0ZSBkYXRhIGFjY2Vzc2VzLiAgVGh1cyB0aGUgYWJvdmUgc2xlZXBlciBvdWdodCB0byBkbzoKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJaWYgKGV2ZW50X2luZGljYXRlZCkgeworCQlzbXBfcm1iKCk7CisJCWRvX3NvbWV0aGluZyhteV9kYXRhKTsKKwl9CisKK2FuZCB0aGUgd2FrZXIgc2hvdWxkIGRvOgorCisJbXlfZGF0YSA9IHZhbHVlOworCXNtcF93bWIoKTsKKwlldmVudF9pbmRpY2F0ZWQgPSAxOworCXdha2VfdXAoJmV2ZW50X3dhaXRfcXVldWUpOworCisKIE1JU0NFTExBTkVPVVMgRlVOQ1RJT05TCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xMzY2LDcgKzE0OTMsNyBAQAogCiBVbmRlciBub3JtYWwgb3BlcmF0aW9uLCBtZW1vcnkgb3BlcmF0aW9uIHJlb3JkZXJpbmcgaXMgZ2VuZXJhbGx5IG5vdCBnb2luZyB0bwogYmUgYSBwcm9ibGVtIGFzIGEgc2luZ2xlLXRocmVhZGVkIGxpbmVhciBwaWVjZSBvZiBjb2RlIHdpbGwgc3RpbGwgYXBwZWFyIHRvCi13b3JrIGNvcnJlY3RseSwgZXZlbiBpZiBpdCdzIGluIGFuIFNNUCBrZXJuZWwuICBUaGVyZSBhcmUsIGhvd2V2ZXIsIHRocmVlCit3b3JrIGNvcnJlY3RseSwgZXZlbiBpZiBpdCdzIGluIGFuIFNNUCBrZXJuZWwuICBUaGVyZSBhcmUsIGhvd2V2ZXIsIGZvdXIKIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggcmVvcmRlcmluZyBkZWZpbml0ZWx5IF9jb3VsZF8gYmUgYSBwcm9ibGVtOgogCiAgKCopIEludGVycHJvY2Vzc29yIGludGVyYWN0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtcnQtZ3JvdXAudHh0IGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtcnQtZ3JvdXAudHh0CmluZGV4IDViYTRkM2YuLjFkZjdmOWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLXJ0LWdyb3VwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1ydC1ncm91cC50eHQKQEAgLTQsNiArNCw3IEBACiBDT05URU5UUwogPT09PT09PT0KIAorMC4gV0FSTklORwogMS4gT3ZlcnZpZXcKICAgMS4xIFRoZSBwcm9ibGVtCiAgIDEuMiBUaGUgc29sdXRpb24KQEAgLTE0LDYgKzE1LDIzIEBACiAzLiBGdXR1cmUgcGxhbnMKIAogCiswLiBXQVJOSU5HCis9PT09PT09PT09CisKKyBGaWRkbGluZyB3aXRoIHRoZXNlIHNldHRpbmdzIGNhbiByZXN1bHQgaW4gYW4gdW5zdGFibGUgc3lzdGVtLCB0aGUga25vYnMgYXJlCisgcm9vdCBvbmx5IGFuZCBhc3N1bWVzIHJvb3Qga25vd3Mgd2hhdCBoZSBpcyBkb2luZy4KKworTW9zdCBub3RhYmxlOgorCisgKiB2ZXJ5IHNtYWxsIHZhbHVlcyBpbiBzY2hlZF9ydF9wZXJpb2RfdXMgY2FuIHJlc3VsdCBpbiBhbiB1bnN0YWJsZQorICAgc3lzdGVtIHdoZW4gdGhlIHBlcmlvZCBpcyBzbWFsbGVyIHRoYW4gZWl0aGVyIHRoZSBhdmFpbGFibGUgaHJ0aW1lcgorICAgcmVzb2x1dGlvbiwgb3IgdGhlIHRpbWUgaXQgdGFrZXMgdG8gaGFuZGxlIHRoZSBidWRnZXQgcmVmcmVzaCBpdHNlbGYuCisKKyAqIHZlcnkgc21hbGwgdmFsdWVzIGluIHNjaGVkX3J0X3J1bnRpbWVfdXMgY2FuIHJlc3VsdCBpbiBhbiB1bnN0YWJsZQorICAgc3lzdGVtIHdoZW4gdGhlIHJ1bnRpbWUgaXMgc28gc21hbGwgdGhlIHN5c3RlbSBoYXMgZGlmZmljdWx0eSBtYWtpbmcKKyAgIGZvcndhcmQgcHJvZ3Jlc3MgKE5PVEU6IHRoZSBtaWdyYXRpb24gdGhyZWFkIGFuZCBrc3RvcG1hY2hpbmUgYm90aAorICAgYXJlIHJlYWwtdGltZSBwcm9jZXNzZXMpLgorCiAxLiBPdmVydmlldwogPT09PT09PT09PT0KIApAQCAtMTY5LDcgKzE4Nyw3IEBACiAKIEltcGxlbWVudGluZyBTQ0hFRF9FREYgbWlnaHQgdGFrZSBhIHdoaWxlIHRvIGNvbXBsZXRlLiBQcmlvcml0eSBJbmhlcml0YW5jZSBpcwogdGhlIGJpZ2dlc3QgY2hhbGxlbmdlIGFzIHRoZSBjdXJyZW50IGxpbnV4IFBJIGluZnJhc3RydWN0dXJlIGlzIGdlYXJlZCB0b3dhcmRzCi10aGUgbGltaXRlZCBzdGF0aWMgcHJpb3JpdHkgbGV2ZWxzIDAtMTM5LiBXaXRoIGRlYWRsaW5lIHNjaGVkdWxpbmcgeW91IG5lZWQgdG8KK3RoZSBsaW1pdGVkIHN0YXRpYyBwcmlvcml0eSBsZXZlbHMgMC05OS4gV2l0aCBkZWFkbGluZSBzY2hlZHVsaW5nIHlvdSBuZWVkIHRvCiBkbyBkZWFkbGluZSBpbmhlcml0YW5jZSAoc2luY2UgcHJpb3JpdHkgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUKIGRlYWRsaW5lIGRlbHRhIChkZWFkbGluZSAtIG5vdykuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IGYxMWNhNzkuLjMyMmEwMGJiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKQEAgLTMyLDYgKzMyLDcgQEAKIC0ga3N0YWNrX2RlcHRoX3RvX3ByaW50ICAgICAgIFsgWDg2IG9ubHkgXQogLSBsMmNyICAgICAgICAgICAgICAgICAgICAgICAgWyBQUEMgb25seSBdCiAtIG1vZHByb2JlICAgICAgICAgICAgICAgICAgICA9PT4gRG9jdW1lbnRhdGlvbi9kZWJ1Z2dpbmctbW9kdWxlcy50eHQKKy0gbW9kdWxlc19kaXNhYmxlZAogLSBtc2dtYXgKIC0gbXNnbW5iCiAtIG1zZ21uaQpAQCAtMTg0LDYgKzE4NSwxNiBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCittb2R1bGVzX2Rpc2FibGVkOgorCitBIHRvZ2dsZSB2YWx1ZSBpbmRpY2F0aW5nIGlmIG1vZHVsZXMgYXJlIGFsbG93ZWQgdG8gYmUgbG9hZGVkCitpbiBhbiBvdGhlcndpc2UgbW9kdWxhciBrZXJuZWwuICBUaGlzIHRvZ2dsZSBkZWZhdWx0cyB0byBvZmYKKygwKSwgYnV0IGNhbiBiZSBzZXQgdHJ1ZSAoMSkuICBPbmNlIHRydWUsIG1vZHVsZXMgY2FuIGJlCituZWl0aGVyIGxvYWRlZCBub3IgdW5sb2FkZWQsIGFuZCB0aGUgdG9nZ2xlIGNhbm5vdCBiZSBzZXQgYmFjawordG8gZmFsc2UuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIG9zcmVsZWFzZSwgb3N0eXBlICYgdmVyc2lvbjoKIAogIyBjYXQgb3NyZWxlYXNlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2V2ZW50cy50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2V2ZW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1N2Q3NQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdHJhY2UvZXZlbnRzLnR4dApAQCAtMCwwICsxLDkwIEBACisJCQkgICAgIEV2ZW50IFRyYWNpbmcKKworCQlEb2N1bWVudGF0aW9uIHdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbworCQkJVXBkYXRlZCBieSBMaSBaZWZhbgorCisxLiBJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PT09PQorCitUcmFjZXBvaW50cyAoc2VlIERvY3VtZW50YXRpb24vdHJhY2UvdHJhY2Vwb2ludHMudHh0KSBjYW4gYmUgdXNlZAord2l0aG91dCBjcmVhdGluZyBjdXN0b20ga2VybmVsIG1vZHVsZXMgdG8gcmVnaXN0ZXIgcHJvYmUgZnVuY3Rpb25zCit1c2luZyB0aGUgZXZlbnQgdHJhY2luZyBpbmZyYXN0cnVjdHVyZS4KKworTm90IGFsbCB0cmFjZXBvaW50cyBjYW4gYmUgdHJhY2VkIHVzaW5nIHRoZSBldmVudCB0cmFjaW5nIHN5c3RlbTsKK3RoZSBrZXJuZWwgZGV2ZWxvcGVyIG11c3QgcHJvdmlkZSBjb2RlIHNuaXBwZXRzIHdoaWNoIGRlZmluZSBob3cgdGhlCit0cmFjaW5nIGluZm9ybWF0aW9uIGlzIHNhdmVkIGludG8gdGhlIHRyYWNpbmcgYnVmZmVyLCBhbmQgaG93IHRoZQordHJhY2luZyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcHJpbnRlZC4KKworMi4gVXNpbmcgRXZlbnQgVHJhY2luZworPT09PT09PT09PT09PT09PT09PT09PQorCisyLjEgVmlhIHRoZSAnc2V0X2V2ZW50JyBpbnRlcmZhY2UKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZXZlbnRzIHdoaWNoIGFyZSBhdmFpbGFibGUgZm9yIHRyYWNpbmcgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlCisvZGVidWcvdHJhY2luZy9hdmFpbGFibGVfZXZlbnRzLgorCitUbyBlbmFibGUgYSBwYXJ0aWN1bGFyIGV2ZW50LCBzdWNoIGFzICdzY2hlZF93YWtldXAnLCBzaW1wbHkgZWNobyBpdAordG8gL2RlYnVnL3RyYWNpbmcvc2V0X2V2ZW50LiBGb3IgZXhhbXBsZToKKworCSMgZWNobyBzY2hlZF93YWtldXAgPj4gL2RlYnVnL3RyYWNpbmcvc2V0X2V2ZW50CisKK1sgTm90ZTogJz4+JyBpcyBuZWNlc3NhcnksIG90aGVyd2lzZSBpdCB3aWxsIGZpcnN0bHkgZGlzYWJsZQorICBhbGwgdGhlIGV2ZW50cy4gXQorCitUbyBkaXNhYmxlIGFuIGV2ZW50LCBlY2hvIHRoZSBldmVudCBuYW1lIHRvIHRoZSBzZXRfZXZlbnQgZmlsZSBwcmVmaXhlZAord2l0aCBhbiBleGNsYW1hdGlvbiBwb2ludDoKKworCSMgZWNobyAnIXNjaGVkX3dha2V1cCcgPj4gL2RlYnVnL3RyYWNpbmcvc2V0X2V2ZW50CisKK1RvIGRpc2FibGUgYWxsIGV2ZW50cywgZWNobyBhbiBlbXB0eSBsaW5lIHRvIHRoZSBzZXRfZXZlbnQgZmlsZToKKworCSMgZWNobyA+IC9kZWJ1Zy90cmFjaW5nL3NldF9ldmVudAorCitUbyBlbmFibGUgYWxsIGV2ZW50cywgZWNobyAnKjoqJyBvciAnKjonIHRvIHRoZSBzZXRfZXZlbnQgZmlsZToKKworCSMgZWNobyAqOiogPiAvZGVidWcvdHJhY2luZy9zZXRfZXZlbnQKKworVGhlIGV2ZW50cyBhcmUgb3JnYW5pemVkIGludG8gc3Vic3lzdGVtcywgc3VjaCBhcyBleHQ0LCBpcnEsIHNjaGVkLAorZXRjLiwgYW5kIGEgZnVsbCBldmVudCBuYW1lIGxvb2tzIGxpa2UgdGhpczogPHN1YnN5c3RlbT46PGV2ZW50Pi4gIFRoZQorc3Vic3lzdGVtIG5hbWUgaXMgb3B0aW9uYWwsIGJ1dCBpdCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGF2YWlsYWJsZV9ldmVudHMKK2ZpbGUuICBBbGwgb2YgdGhlIGV2ZW50cyBpbiBhIHN1YnN5c3RlbSBjYW4gYmUgc3BlY2lmaWVkIHZpYSB0aGUgc3ludGF4CisiPHN1YnN5c3RlbT46KiI7IGZvciBleGFtcGxlLCB0byBlbmFibGUgYWxsIGlycSBldmVudHMsIHlvdSBjYW4gdXNlIHRoZQorY29tbWFuZDoKKworCSMgZWNobyAnaXJxOionID4gL2RlYnVnL3RyYWNpbmcvc2V0X2V2ZW50CisKKzIuMiBWaWEgdGhlICdlbmFibGUnIHRvZ2dsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBldmVudHMgYXZhaWxhYmxlIGFyZSBhbHNvIGxpc3RlZCBpbiAvZGVidWcvdHJhY2luZy9ldmVudHMvIGhpZXJhcmNoeQorb2YgZGlyZWN0b3JpZXMuCisKK1RvIGVuYWJsZSBldmVudCAnc2NoZWRfd2FrZXVwJzoKKworCSMgZWNobyAxID4gL2RlYnVnL3RyYWNpbmcvZXZlbnRzL3NjaGVkL3NjaGVkX3dha2V1cC9lbmFibGUKKworVG8gZGlzYWJsZSBpdDoKKworCSMgZWNobyAwID4gL2RlYnVnL3RyYWNpbmcvZXZlbnRzL3NjaGVkL3NjaGVkX3dha2V1cC9lbmFibGUKKworVG8gZW5hYmxlIGFsbCBldmVudHMgaW4gc2NoZWQgc3Vic3lzdGVtOgorCisJIyBlY2hvIDEgPiAvZGVidWcvdHJhY2luZy9ldmVudHMvc2NoZWQvZW5hYmxlCisKK1RvIGVhbmJsZSBhbGwgZXZlbnRzOgorCisJIyBlY2hvIDEgPiAvZGVidWcvdHJhY2luZy9ldmVudHMvZW5hYmxlCisKK1doZW4gcmVhZGluZyBvbmUgb2YgdGhlc2UgZW5hYmxlIGZpbGVzLCB0aGVyZSBhcmUgZm91ciByZXN1bHRzOgorCisgMCAtIGFsbCBldmVudHMgdGhpcyBmaWxlIGFmZmVjdHMgYXJlIGRpc2FibGVkCisgMSAtIGFsbCBldmVudHMgdGhpcyBmaWxlIGFmZmVjdHMgYXJlIGVuYWJsZWQKKyBYIC0gdGhlcmUgaXMgYSBtaXh0dXJlIG9mIGV2ZW50cyBlbmFibGVkIGFuZCBkaXNhYmxlZAorID8gLSB0aGlzIGZpbGUgZG9lcyBub3QgYWZmZWN0IGFueSBldmVudAorCiszLiBEZWZpbmluZyBhbiBldmVudC1lbmFibGVkIHRyYWNlcG9pbnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTZWUgVGhlIGV4YW1wbGUgcHJvdmlkZWQgaW4gc2FtcGxlcy90cmFjZV9ldmVudHMKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UudHh0CmluZGV4IGZkOWEzZTYuLjJhODJkODYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQKQEAgLTE3OSw3ICsxNzksNyBAQAogCiAJRnVuY3Rpb24gY2FsbCB0cmFjZXIgdG8gdHJhY2UgYWxsIGtlcm5lbCBmdW5jdGlvbnMuCiAKLSAgImZ1bmN0aW9uX2dyYXBoX3RyYWNlciIKKyAgImZ1bmN0aW9uX2dyYXBoIgogCiAJU2ltaWxhciB0byB0aGUgZnVuY3Rpb24gdHJhY2VyIGV4Y2VwdCB0aGF0IHRoZQogCWZ1bmN0aW9uIHRyYWNlciBwcm9iZXMgdGhlIGZ1bmN0aW9ucyBvbiB0aGVpciBlbnRyeQpAQCAtNTE4LDkgKzUxOCwxOCBAQAogdmFsdWVzIHN0YXJ0aW5nIGF0IDEwMCAobmljZSAtMjApLiBCZWxvdyBpcyBhIHF1aWNrIGNoYXJ0IHRvIG1hcAogdGhlIGtlcm5lbCBwcmlvcml0eSB0byB1c2VyIGxhbmQgcHJpb3JpdGllcy4KIAotICBLZXJuZWwgcHJpb3JpdHk6IDAgdG8gOTkgICAgPT0+IHVzZXIgUlQgcHJpb3JpdHkgOTkgdG8gMAotICBLZXJuZWwgcHJpb3JpdHk6IDEwMCB0byAxMzkgPT0+IHVzZXIgbmljZSAtMjAgdG8gMTkKLSAgS2VybmVsIHByaW9yaXR5OiAxNDAgICAgICAgID09PiBpZGxlIHRhc2sgcHJpb3JpdHkKKyAgIEtlcm5lbCBTcGFjZSAgICAgICAgICAgICAgICAgICAgIFVzZXIgU3BhY2UKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgIDAoaGlnaCkgdG8gIDk4KGxvdykgICAgIHVzZXIgUlQgcHJpb3JpdHkgOTkoaGlnaCkgdG8gMShsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFNDSEVEX1JSIG9yIFNDSEVEX0ZJRk8KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgOTkgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkX3ByaW9yaXR5IGlzIG5vdCB1c2VkIGluIHNjaGVkdWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2lzaW9ucyhpdCBtdXN0IGJlIHNwZWNpZmllZCBhcyAwKQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDEwMChoaWdoKSB0byAxMzkobG93KSAgICAgdXNlciBuaWNlIC0yMChoaWdoKSB0byAxOShsb3cpCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTQwICAgICAgICAgICAgICAgICAgICAgICBpZGxlIHRhc2sgcHJpb3JpdHkKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogVGhlIHRhc2sgc3RhdGVzIGFyZToKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS9wb3dlci50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL3Bvd2VyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDgwNWUxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9wb3dlci50eHQKQEAgLTAsMCArMSwxNyBAQAorVGhlIHBvd2VyIHRyYWNlciBjb2xsZWN0cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBDLXN0YXRlIGFuZCBQLXN0YXRlCit0cmFuc2l0aW9ucywgaW5zdGVhZCBvZiBqdXN0IGxvb2tpbmcgYXQgdGhlIGhpZ2gtbGV2ZWwgImF2ZXJhZ2UiCitpbmZvcm1hdGlvbi4KKworVGhlcmUgaXMgYSBoZWxwZXIgc2NyaXB0IGZvdW5kIGluIHNjcmlwcy90cmFjaW5nL3Bvd2VyLnBsIGluIHRoZSBrZXJuZWwKK3NvdXJjZXMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcGFyc2UgdGhpcyBpbmZvcm1hdGlvbiBhbmQgY3JlYXRlIGEKK1NjYWxhYmxlIFZlY3RvciBHcmFwaGljcyAoU1ZHKSBwaWN0dXJlIGZyb20gdGhlIHRyYWNlIGRhdGEuCisKK1RvIHVzZSB0aGlzIHRyYWNlcjoKKworCWVjaG8gMCA+IC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvdHJhY2luZ19lbmFibGVkCisJZWNobyBwb3dlciA+IC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvY3VycmVudF90cmFjZXIKKwllY2hvIDEgPiAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNpbmdfZW5hYmxlZAorCXNsZWVwIDEKKwllY2hvIDAgPiAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNpbmdfZW5hYmxlZAorCWNhdCAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL3RyYWNlIHwgXAorCQlwZXJsIHNjcmlwdHMvdHJhY2luZy9wb3dlci5wbCA+IG91dC5zdgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dAppbmRleCBlMDIwMzY2Li44ZGEzYTc5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dApAQCAtNTAsNiArNTAsMTAgQEAKIFByb3RvY29sIDIuMDk6CShLZXJuZWwgMi42LjI2KSBBZGRlZCBhIGZpZWxkIG9mIDY0LWJpdCBwaHlzaWNhbAogCQlwb2ludGVyIHRvIHNpbmdsZSBsaW5rZWQgbGlzdCBvZiBzdHJ1Y3QJc2V0dXBfZGF0YS4KIAorUHJvdG9jb2wgMi4xMDoJKEtlcm5lbCAyLjYuMzEpIEFkZGVkIGEgcHJvdG9jb2wgZm9yIHJlbGF4ZWQgYWxpZ25tZW50CisJCWJleW9uZCB0aGUga2VybmVsX2FsaWdubWVudCBhZGRlZCwgbmV3IGluaXRfc2l6ZSBhbmQKKwkJcHJlZl9hZGRyZXNzIGZpZWxkcy4gIEFkZGVkIGV4dGVuZGVkIGJvb3QgbG9hZGVyIElEcy4KKwogKioqKiBNRU1PUlkgTEFZT1VUCiAKIFRoZSB0cmFkaXRpb25hbCBtZW1vcnkgbWFwIGZvciB0aGUga2VybmVsIGxvYWRlciwgdXNlZCBmb3IgSW1hZ2Ugb3IKQEAgLTE2OCwxMiArMTcyLDEzIEBACiAwMjFDLzQJMi4wMCsJcmFtZGlza19zaXplCWluaXRyZCBzaXplIChzZXQgYnkgYm9vdCBsb2FkZXIpCiAwMjIwLzQJMi4wMCsJYm9vdHNlY3Rfa2x1ZGdlCURPIE5PVCBVU0UgLSBmb3IgYm9vdHNlY3QuUyB1c2Ugb25seQogMDIyNC8yCTIuMDErCWhlYXBfZW5kX3B0cglGcmVlIG1lbW9yeSBhZnRlciBzZXR1cCBlbmQKLTAyMjYvMglOL0EJcGFkMQkJVW51c2VkCiswMjI2LzEJMi4wMisoMyBleHRfbG9hZGVyX3ZlcglFeHRlbmRlZCBib290IGxvYWRlciB2ZXJzaW9uCiswMjI3LzEJMi4wMisoMwlleHRfbG9hZGVyX3R5cGUJRXh0ZW5kZWQgYm9vdCBsb2FkZXIgSUQKIDAyMjgvNAkyLjAyKwljbWRfbGluZV9wdHIJMzItYml0IHBvaW50ZXIgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUKIDAyMkMvNAkyLjAzKwlyYW1kaXNrX21heAlIaWdoZXN0IGxlZ2FsIGluaXRyZCBhZGRyZXNzCiAwMjMwLzQJMi4wNSsJa2VybmVsX2FsaWdubWVudCBQaHlzaWNhbCBhZGRyIGFsaWdubWVudCByZXF1aXJlZCBmb3Iga2VybmVsCiAwMjM0LzEJMi4wNSsJcmVsb2NhdGFibGVfa2VybmVsIFdoZXRoZXIga2VybmVsIGlzIHJlbG9jYXRhYmxlIG9yIG5vdAotMDIzNS8xCU4vQQlwYWQyCQlVbnVzZWQKKzAyMzUvMQkyLjEwKwltaW5fYWxpZ25tZW50CU1pbmltdW0gYWxpZ25tZW50LCBhcyBhIHBvd2VyIG9mIHR3bwogMDIzNi8yCU4vQQlwYWQzCQlVbnVzZWQKIDAyMzgvNAkyLjA2KwljbWRsaW5lX3NpemUJTWF4aW11bSBzaXplIG9mIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lCiAwMjNDLzQJMi4wNysJaGFyZHdhcmVfc3ViYXJjaCBIYXJkd2FyZSBzdWJhcmNoaXRlY3R1cmUKQEAgLTE4Miw2ICsxODcsOCBAQAogMDI0Qy80CTIuMDgrCXBheWxvYWRfbGVuZ3RoCUxlbmd0aCBvZiBrZXJuZWwgcGF5bG9hZAogMDI1MC84CTIuMDkrCXNldHVwX2RhdGEJNjQtYml0IHBoeXNpY2FsIHBvaW50ZXIgdG8gbGlua2VkIGxpc3QKIAkJCQlvZiBzdHJ1Y3Qgc2V0dXBfZGF0YQorMDI1OC84CTIuMTArCXByZWZfYWRkcmVzcwlQcmVmZXJyZWQgbG9hZGluZyBhZGRyZXNzCiswMjYwLzQJMi4xMCsJaW5pdF9zaXplCUxpbmVhciBtZW1vcnkgcmVxdWlyZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uCiAKICgxKSBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIHRoZSBzZXR1cF9zZWN0cyBmaWVsZCBjb250YWlucyAwLCB0aGUKICAgICByZWFsIHZhbHVlIGlzIDQuCkBAIC0xOTAsNiArMTk3LDggQEAKICAgICBmaWVsZCBhcmUgdW51c2FibGUsIHdoaWNoIG1lYW5zIHRoZSBzaXplIG9mIGEgYnpJbWFnZSBrZXJuZWwKICAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KIAorKDMpIElnbm9yZWQsIGJ1dCBzYWZlIHRvIHNldCwgZm9yIGJvb3QgcHJvdG9jb2xzIDIuMDItMi4wOS4KKwogSWYgdGhlICJIZHJTIiAoMHg1MzcyNjQ0OCkgbWFnaWMgbnVtYmVyIGlzIG5vdCBmb3VuZCBhdCBvZmZzZXQgMHgyMDIsCiB0aGUgYm9vdCBwcm90b2NvbCB2ZXJzaW9uIGlzICJvbGQiLiAgTG9hZGluZyBhbiBvbGQga2VybmVsLCB0aGUKIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBhc3N1bWVkOgpAQCAtMzQzLDE4ICszNTIsMzIgQEAKICAgMHhUViBoZXJlLCB3aGVyZSBUIGlzIGFuIGlkZW50aWZpZXIgZm9yIHRoZSBib290IGxvYWRlciBhbmQgViBpcwogICBhIHZlcnNpb24gbnVtYmVyLiAgT3RoZXJ3aXNlLCBlbnRlciAweEZGIGhlcmUuCiAKKyAgRm9yIGJvb3QgbG9hZGVyIElEcyBhYm92ZSBUID0gMHhELCB3cml0ZSBUID0gMHhFIHRvIHRoaXMgZmllbGQgYW5kCisgIHdyaXRlIHRoZSBleHRlbmRlZCBJRCBtaW51cyAweDEwIHRvIHRoZSBleHRfbG9hZGVyX3R5cGUgZmllbGQuCisgIFNpbWlsYXJseSwgdGhlIGV4dF9sb2FkZXJfdmVyIGZpZWxkIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgbW9yZSB0aGFuCisgIGZvdXIgYml0cyBmb3IgdGhlIGJvb3Rsb2FkZXIgdmVyc2lvbi4KKworICBGb3IgZXhhbXBsZSwgZm9yIFQgPSAweDE1LCBWID0gMHgyMzQsIHdyaXRlOgorCisgIHR5cGVfb2ZfbG9hZGVyICA8LSAweEU0CisgIGV4dF9sb2FkZXJfdHlwZSA8LSAweDA1CisgIGV4dF9sb2FkZXJfdmVyICA8LSAweDIzCisKICAgQXNzaWduZWQgYm9vdCBsb2FkZXIgaWRzOgogCTAgIExJTE8JCQkoMHgwMCByZXNlcnZlZCBmb3IgcHJlLTIuMDAgYm9vdGxvYWRlcikKIAkxICBMb2FkbGluCiAJMiAgYm9vdHNlY3QtbG9hZGVyCSgweDIwLCBhbGwgb3RoZXIgdmFsdWVzIHJlc2VydmVkKQotCTMgIFNZU0xJTlVYCi0JNCAgRXRoZXJCb290CisJMyAgU3lzbGludXgKKwk0ICBFdGhlcmJvb3QvZ1BYRQogCTUgIEVMSUxPCiAJNyAgR1JVQgotCTggIFUtQk9PVAorCTggIFUtQm9vdAogCTkgIFhlbgogCUEgIEd1amluCiAJQiAgUWVtdQorCUMgIEFyY3R1cnVzIE5ldHdvcmtzIHVDYm9vdGxvYWRlcgorCUUgIEV4dGVuZGVkCQkoc2VlIGV4dF9sb2FkZXJfdHlwZSkKKwlGICBTcGVjaWFsCQkoMHhGRiA9IHVuZGVmaW5lZCkKIAogICBQbGVhc2UgY29udGFjdCA8aHBhQHp5dG9yLmNvbT4gaWYgeW91IG5lZWQgYSBib290bG9hZGVyIElECiAgIHZhbHVlIGFzc2lnbmVkLgpAQCAtNDUzLDYgKzQ3NiwzNSBAQAogICBTZXQgdGhpcyBmaWVsZCB0byB0aGUgb2Zmc2V0IChmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlYWwtbW9kZQogICBjb2RlKSBvZiB0aGUgZW5kIG9mIHRoZSBzZXR1cCBzdGFjay9oZWFwLCBtaW51cyAweDAyMDAuCiAKK0ZpZWxkIG5hbWU6CWV4dF9sb2FkZXJfdmVyCitUeXBlOgkJd3JpdGUgKG9wdGlvbmFsKQorT2Zmc2V0L3NpemU6CTB4MjI2LzEKK1Byb3RvY29sOgkyLjAyKworCisgIFRoaXMgZmllbGQgaXMgdXNlZCBhcyBhbiBleHRlbnNpb24gb2YgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZQorICB0eXBlX29mX2xvYWRlciBmaWVsZC4gIFRoZSB0b3RhbCB2ZXJzaW9uIG51bWJlciBpcyBjb25zaWRlcmVkIHRvIGJlCisgICh0eXBlX29mX2xvYWRlciAmIDB4MGYpICsgKGV4dF9sb2FkZXJfdmVyIDw8IDQpLgorCisgIFRoZSB1c2Ugb2YgdGhpcyBmaWVsZCBpcyBib290IGxvYWRlciBzcGVjaWZpYy4gIElmIG5vdCB3cml0dGVuLCBpdAorICBpcyB6ZXJvLgorCisgIEtlcm5lbHMgcHJpb3IgdG8gMi42LjMxIGRpZCBub3QgcmVjb2duaXplIHRoaXMgZmllbGQsIGJ1dCBpdCBpcyBzYWZlCisgIHRvIHdyaXRlIGZvciBwcm90b2NvbCB2ZXJzaW9uIDIuMDIgb3IgaGlnaGVyLgorCitGaWVsZCBuYW1lOglleHRfbG9hZGVyX3R5cGUKK1R5cGU6CQl3cml0ZSAob2JsaWdhdG9yeSBpZiAodHlwZV9vZl9sb2FkZXIgJiAweGYwKSA9PSAweGUwKQorT2Zmc2V0L3NpemU6CTB4MjI3LzEKK1Byb3RvY29sOgkyLjAyKworCisgIFRoaXMgZmllbGQgaXMgdXNlZCBhcyBhbiBleHRlbnNpb24gb2YgdGhlIHR5cGUgbnVtYmVyIGluCisgIHR5cGVfb2ZfbG9hZGVyIGZpZWxkLiAgSWYgdGhlIHR5cGUgaW4gdHlwZV9vZl9sb2FkZXIgaXMgMHhFLCB0aGVuCisgIHRoZSBhY3R1YWwgdHlwZSBpcyAoZXh0X2xvYWRlcl90eXBlICsgMHgxMCkuCisKKyAgVGhpcyBmaWVsZCBpcyBpZ25vcmVkIGlmIHRoZSB0eXBlIGluIHR5cGVfb2ZfbG9hZGVyIGlzIG5vdCAweEUuCisKKyAgS2VybmVscyBwcmlvciB0byAyLjYuMzEgZGlkIG5vdCByZWNvZ25pemUgdGhpcyBmaWVsZCwgYnV0IGl0IGlzIHNhZmUKKyAgdG8gd3JpdGUgZm9yIHByb3RvY29sIHZlcnNpb24gMi4wMiBvciBoaWdoZXIuCisKIEZpZWxkIG5hbWU6CWNtZF9saW5lX3B0cgogVHlwZToJCXdyaXRlIChvYmxpZ2F0b3J5KQogT2Zmc2V0L3NpemU6CTB4MjI4LzQKQEAgLTQ4MiwxMSArNTM0LDE5IEBACiAgIDB4MzdGRkZGRkYsIHlvdSBjYW4gc3RhcnQgeW91ciByYW1kaXNrIGF0IDB4MzdGRTAwMDAuKQogCiBGaWVsZCBuYW1lOglrZXJuZWxfYWxpZ25tZW50Ci1UeXBlOgkJcmVhZCAocmVsb2MpCitUeXBlOgkJcmVhZC9tb2RpZnkgKHJlbG9jKQogT2Zmc2V0L3NpemU6CTB4MjMwLzQKLVByb3RvY29sOgkyLjA1KworUHJvdG9jb2w6CTIuMDUrIChyZWFkKSwgMi4xMCsgKG1vZGlmeSkKIAotICBBbGlnbm1lbnQgdW5pdCByZXF1aXJlZCBieSB0aGUga2VybmVsIChpZiByZWxvY2F0YWJsZV9rZXJuZWwgaXMgdHJ1ZS4pCisgIEFsaWdubWVudCB1bml0IHJlcXVpcmVkIGJ5IHRoZSBrZXJuZWwgKGlmIHJlbG9jYXRhYmxlX2tlcm5lbCBpcworICB0cnVlLikgIEEgcmVsb2NhdGFibGUga2VybmVsIHRoYXQgaXMgbG9hZGVkIGF0IGFuIGFsaWdubWVudAorICBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdmFsdWUgaW4gdGhpcyBmaWVsZCB3aWxsIGJlIHJlYWxpZ25lZCBkdXJpbmcKKyAga2VybmVsIGluaXRpYWxpemF0aW9uLgorCisgIFN0YXJ0aW5nIHdpdGggcHJvdG9jb2wgdmVyc2lvbiAyLjEwLCB0aGlzIHJlZmxlY3RzIHRoZSBrZXJuZWwKKyAgYWxpZ25tZW50IHByZWZlcnJlZCBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZTsgaXQgaXMgcG9zc2libGUgZm9yIHRoZQorICBsb2FkZXIgdG8gbW9kaWZ5IHRoaXMgZmllbGQgdG8gcGVybWl0IGEgbGVzc2VyIGFsaWdubWVudC4gIFNlZSB0aGUKKyAgbWluX2FsaWdubWVudCBhbmQgcHJlZl9hZGRyZXNzIGZpZWxkIGJlbG93LgogCiBGaWVsZCBuYW1lOglyZWxvY2F0YWJsZV9rZXJuZWwKIFR5cGU6CQlyZWFkIChyZWxvYykKQEAgLTQ5OCw2ICs1NTgsMjIgQEAKICAgQWZ0ZXIgbG9hZGluZywgdGhlIGJvb3QgbG9hZGVyIG11c3Qgc2V0IHRoZSBjb2RlMzJfc3RhcnQgZmllbGQgdG8KICAgcG9pbnQgdG8gdGhlIGxvYWRlZCBjb2RlLCBvciB0byBhIGJvb3QgbG9hZGVyIGhvb2suCiAKK0ZpZWxkIG5hbWU6CW1pbl9hbGlnbm1lbnQKK1R5cGU6CQlyZWFkIChyZWxvYykKK09mZnNldC9zaXplOgkweDIzNS8xCitQcm90b2NvbDoJMi4xMCsKKworICBUaGlzIGZpZWxkLCBpZiBub256ZXJvLCBpbmRpY2F0ZXMgYXMgYSBwb3dlciBvZiB0d28gdGhlIG1pbmltdW0KKyAgYWxpZ25tZW50IHJlcXVpcmVkLCBhcyBvcHBvc2VkIHRvIHByZWZlcnJlZCwgYnkgdGhlIGtlcm5lbCB0byBib290LgorICBJZiBhIGJvb3QgbG9hZGVyIG1ha2VzIHVzZSBvZiB0aGlzIGZpZWxkLCBpdCBzaG91bGQgdXBkYXRlIHRoZQorICBrZXJuZWxfYWxpZ25tZW50IGZpZWxkIHdpdGggdGhlIGFsaWdubWVudCB1bml0IGRlc2lyZWQ7IHR5cGljYWxseToKKworCWtlcm5lbF9hbGlnbm1lbnQgPSAxIDw8IG1pbl9hbGlnbm1lbnQKKworICBUaGVyZSBtYXkgYmUgYSBjb25zaWRlcmFibGUgcGVyZm9ybWFuY2UgY29zdCB3aXRoIGFuIGV4Y2Vzc2l2ZWx5CisgIG1pc2FsaWduZWQga2VybmVsLiAgVGhlcmVmb3JlLCBhIGxvYWRlciBzaG91bGQgdHlwaWNhbGx5IHRyeSBlYWNoCisgIHBvd2VyLW9mLXR3byBhbGlnbm1lbnQgZnJvbSBrZXJuZWxfYWxpZ25tZW50IGRvd24gdG8gdGhpcyBhbGlnbm1lbnQuCisKIEZpZWxkIG5hbWU6CWNtZGxpbmVfc2l6ZQogVHlwZToJCXJlYWQKIE9mZnNldC9zaXplOgkweDIzOC80CkBAIC01ODIsNiArNjU4LDM2IEBACiAgIHN1cmUgdG8gY29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgdGhlIGxpbmtlZCBsaXN0IGFscmVhZHkgY29udGFpbnMKICAgZW50cmllcy4KIAorRmllbGQgbmFtZToJcHJlZl9hZGRyZXNzCitUeXBlOgkJcmVhZCAocmVsb2MpCitPZmZzZXQvc2l6ZToJMHgyNTgvOAorUHJvdG9jb2w6CTIuMTArCisKKyAgVGhpcyBmaWVsZCwgaWYgbm9uemVybywgcmVwcmVzZW50cyBhIHByZWZlcnJlZCBsb2FkIGFkZHJlc3MgZm9yIHRoZQorICBrZXJuZWwuICBBIHJlbG9jYXRpbmcgYm9vdGxvYWRlciBzaG91bGQgYXR0ZW1wdCB0byBsb2FkIGF0IHRoaXMKKyAgYWRkcmVzcyBpZiBwb3NzaWJsZS4KKworICBBIG5vbi1yZWxvY2F0YWJsZSBrZXJuZWwgd2lsbCB1bmNvbmRpdGlvbmFsbHkgbW92ZSBpdHNlbGYgYW5kIHRvIHJ1bgorICBhdCB0aGlzIGFkZHJlc3MuCisKK0ZpZWxkIG5hbWU6CWluaXRfc2l6ZQorVHlwZToJCXJlYWQKK09mZnNldC9zaXplOgkweDI1Yy80CisKKyAgVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBsaW5lYXIgY29udGlndW91cyBtZW1vcnkgc3RhcnRpbmcKKyAgYXQgdGhlIGtlcm5lbCBydW50aW1lIHN0YXJ0IGFkZHJlc3MgdGhhdCB0aGUga2VybmVsIG5lZWRzIGJlZm9yZSBpdAorICBpcyBjYXBhYmxlIG9mIGV4YW1pbmluZyBpdHMgbWVtb3J5IG1hcC4gIFRoaXMgaXMgbm90IHRoZSBzYW1lIHRoaW5nCisgIGFzIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IHRoZSBrZXJuZWwgbmVlZHMgdG8gYm9vdCwgYnV0IGl0IGNhbgorICBiZSB1c2VkIGJ5IGEgcmVsb2NhdGluZyBib290IGxvYWRlciB0byBoZWxwIHNlbGVjdCBhIHNhZmUgbG9hZAorICBhZGRyZXNzIGZvciB0aGUga2VybmVsLgorCisgIFRoZSBrZXJuZWwgcnVudGltZSBzdGFydCBhZGRyZXNzIGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZyBhbGdvcml0aG06CisKKyAgaWYgKHJlbG9jYXRhYmxlX2tlcm5lbCkKKwlydW50aW1lX3N0YXJ0ID0gYWxpZ25fdXAobG9hZF9hZGRyZXNzLCBrZXJuZWxfYWxpZ25tZW50KQorICBlbHNlCisJcnVudGltZV9zdGFydCA9IHByZWZfYWRkcmVzcworCiAKICoqKiogVEhFIElNQUdFIENIRUNLU1VNCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9ib290LW9wdGlvbnMudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQKaW5kZXggMzRjMTMwNC4uMmRiNTg5MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQKQEAgLTE1MCwxMSArMTUwLDYgQEAKIAkJT3RoZXJ3aXNlLCB0aGUgcmVtYWluaW5nIHN5c3RlbSBSQU0gaXMgYWxsb2NhdGVkIHRvIGFuCiAJCWFkZGl0aW9uYWwgbm9kZS4KIAotICBudW1hPWhvdGFkZD1wZXJjZW50Ci0JCU9ubHkgYWxsb3cgaG90YWRkIG1lbW9yeSB0byBwcmVhbGxvY2F0ZSBwYWdlIHN0cnVjdHVyZXMgdXB0bwotCQlwZXJjZW50IG9mIGFscmVhZHkgYXZhaWxhYmxlIG1lbW9yeS4KLQkJbnVtYT1ob3RhZGQ9MCB3aWxsIGRpc2FibGUgaG90YWRkIG1lbW9yeS4KLQogQUNQSQogCiAgIGFjcGk9b2ZmCURvbid0IGVuYWJsZSBBQ1BJCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0IGIvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L21tLnR4dAppbmRleCAyOWI1MmIxLi5kNjQ5OGUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9tbS50eHQKQEAgLTYsMTAgKzYsMTEgQEAKIDAwMDAwMDAwMDAwMDAwMDAgLSAwMDAwN2ZmZmZmZmZmZmZmICg9NDcgYml0cykgdXNlciBzcGFjZSwgZGlmZmVyZW50IHBlciBtbQogaG9sZSBjYXVzZWQgYnkgWzQ4OjYzXSBzaWduIGV4dGVuc2lvbgogZmZmZjgwMDAwMDAwMDAwMCAtIGZmZmY4MGZmZmZmZmZmZmYgKD00MCBiaXRzKSBndWFyZCBob2xlCi1mZmZmODgwMDAwMDAwMDAwIC0gZmZmZmMwZmZmZmZmZmZmZiAoPTU3IFRCKSBkaXJlY3QgbWFwcGluZyBvZiBhbGwgcGh5cy4gbWVtb3J5Ci1mZmZmYzEwMDAwMDAwMDAwIC0gZmZmZmMxZmZmZmZmZmZmZiAoPTQwIGJpdHMpIGhvbGUKLWZmZmZjMjAwMDAwMDAwMDAgLSBmZmZmZTFmZmZmZmZmZmZmICg9NDUgYml0cykgdm1hbGxvYy9pb3JlbWFwIHNwYWNlCi1mZmZmZTIwMDAwMDAwMDAwIC0gZmZmZmUyZmZmZmZmZmZmZiAoPTQwIGJpdHMpIHZpcnR1YWwgbWVtb3J5IG1hcCAoMVRCKQorZmZmZjg4MDAwMDAwMDAwMCAtIGZmZmZjN2ZmZmZmZmZmZmYgKD02NCBUQikgZGlyZWN0IG1hcHBpbmcgb2YgYWxsIHBoeXMuIG1lbW9yeQorZmZmZmM4MDAwMDAwMDAwMCAtIGZmZmZjOGZmZmZmZmZmZmYgKD00MCBiaXRzKSBob2xlCitmZmZmYzkwMDAwMDAwMDAwIC0gZmZmZmU4ZmZmZmZmZmZmZiAoPTQ1IGJpdHMpIHZtYWxsb2MvaW9yZW1hcCBzcGFjZQorZmZmZmU5MDAwMDAwMDAwMCAtIGZmZmZlOWZmZmZmZmZmZmYgKD00MCBiaXRzKSBob2xlCitmZmZmZWEwMDAwMDAwMDAwIC0gZmZmZmVhZmZmZmZmZmZmZiAoPTQwIGJpdHMpIHZpcnR1YWwgbWVtb3J5IG1hcCAoMVRCKQogLi4uIHVudXNlZCBob2xlIC4uLgogZmZmZmZmZmY4MDAwMDAwMCAtIGZmZmZmZmZmYTAwMDAwMDAgKD01MTIgTUIpICBrZXJuZWwgdGV4dCBtYXBwaW5nLCBmcm9tIHBoeXMgMAogZmZmZmZmZmZhMDAwMDAwMCAtIGZmZmZmZmZmZmZmMDAwMDAgKD0xNTM2IE1CKSBtb2R1bGUgbWFwcGluZyBzcGFjZQpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBjZjRhYmRkLi5jOTQ0ZDYxIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtNzEsNyArNzEsNyBAQAogTTogTWFpbCBwYXRjaGVzIHRvCiBMOiBNYWlsaW5nIGxpc3QgdGhhdCBpcyByZWxldmFudCB0byB0aGlzIGFyZWEKIFc6IFdlYi1wYWdlIHdpdGggc3RhdHVzL2luZm8KLVQ6IFNDTSB0cmVlIHR5cGUgYW5kIGxvY2F0aW9uLiAgVHlwZSBpcyBvbmUgb2Y6IGdpdCwgaGcsIHF1aWx0LgorVDogU0NNIHRyZWUgdHlwZSBhbmQgbG9jYXRpb24uICBUeXBlIGlzIG9uZSBvZjogZ2l0LCBoZywgcXVpbHQsIHN0Z2l0LgogUzogU3RhdHVzLCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKIAogCVN1cHBvcnRlZDoJU29tZW9uZSBpcyBhY3R1YWxseSBwYWlkIHRvIGxvb2sgYWZ0ZXIgdGhpcy4KQEAgLTE1OSw3ICsxNTksOCBAQAogODI1MC8xNj81MCAoQU5EIENMT05FIFVBUlRTKSBTRVJJQUwgRFJJVkVSCiBMOglsaW51eC1zZXJpYWxAdmdlci5rZXJuZWwub3JnCiBXOglodHRwOi8vc2VyaWFsLnNvdXJjZWZvcmdlLm5ldAotUzoJT3JwaGFuCitNOglhbGFuQGx4b3JndWsudWt1dS5vcmcudWsKK1M6CU9kZCBGaXhlcwogRjoJZHJpdmVycy9zZXJpYWwvODI1MCoKIEY6CWluY2x1ZGUvbGludXgvc2VyaWFsXzgyNTAuaAogCkBAIC0xODAxLDEwICsxODAyLDEwIEBACiBGOglkcml2ZXJzL2NoYXIvZGlnaSoKIAogRElSRUNUT1JZIE5PVElGSUNBVElPTiAoRE5PVElGWSkKLVA6CVN0ZXBoZW4gUm90aHdlbGwKLU06CXNmckBjYW5iLmF1dWcub3JnLmF1CitQOglFcmljIFBhcmlzCitNOgllcGFyaXNAcGFyaXNwbGFjZS5vcmcKIEw6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKLVM6CVN1cHBvcnRlZAorUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9kbm90aWZ5LnR4dAogRjoJZnMvbm90aWZ5L2Rub3RpZnkvCiBGOglpbmNsdWRlL2xpbnV4L2Rub3RpZnkuaApAQCAtMTk3OCw2ICsxOTc5LDE2IEBACiBGOglkcml2ZXJzL2VkYWMvZWRhY18qCiBGOglpbmNsdWRlL2xpbnV4L2VkYWMuaAogCitFREFDLUFNRDY0CitQOglEb3VnIFRob21wc29uCitNOglkb3VndGhvbXBzb25AeG1pc3Npb24uY29tCitQOglCb3Jpc2xhdiBQZXRrb3YKK006CWJvcmlzbGF2LnBldGtvdkBhbWQuY29tCitMOglibHVlc21va2UtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKK1c6CWJsdWVzbW9rZS5zb3VyY2Vmb3JnZS5uZXQKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMqCisKIEVEQUMtRTc1MlgKIFA6CU1hcmsgR3Jvc3MKIE06CW1hcmsuZ3Jvc3NAaW50ZWwuY29tCkBAIC0yODQ3LDYgKzI4NTgsOCBAQAogTToJam9obkBqb2hubWNjdXRjaGFuLmNvbQogUDoJUm9iZXJ0IExvdmUKIE06CXJsb3ZlQHJsb3ZlLm9yZworUDoJRXJpYyBQYXJpcworTToJZXBhcmlzQHBhcmlzcGxhY2Uub3JnCiBMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lub3RpZnkudHh0CkBAIC0zMzU5LDYgKzMzNzIsMTIgQEAKIEY6CWluY2x1ZGUvdHJhY2Uva21lbXRyYWNlLmgKIEY6CWtlcm5lbC90cmFjZS9rbWVtdHJhY2UuYwogCitLTUVNTEVBSworUDoJQ2F0YWxpbiBNYXJpbmFzCitNOgljYXRhbGluLm1hcmluYXNAYXJtLmNvbQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorCiBLUFJPQkVTCiBQOglBbmFudGggTiBNYXZpbmFrYXlhbmFoYWxsaQogTToJYW5hbnRoQGluLmlibS5jb20KQEAgLTQzOTIsNiArNDQxMSwxNiBAQAogRjoJaW5jbHVkZS9saW51eC9kZWxheWFjY3QuaAogRjoJa2VybmVsL2RlbGF5YWNjdC5jCiAKK1BFUkZPUk1BTkNFIENPVU5URVIgU1VCU1lTVEVNCitQOglQZXRlciBaaWpsc3RyYQorTToJYS5wLnppamxzdHJhQGNoZWxsby5ubAorUDoJUGF1bCBNYWNrZXJyYXMKK006CXBhdWx1c0BzYW1iYS5vcmcKK1A6CUluZ28gTW9sbmFyCitNOgltaW5nb0BlbHRlLmh1CitMOglsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKKwogUEVSU09OQUxJVFkgSEFORExJTkcKIFA6CUNocmlzdG9waCBIZWxsd2lnCiBNOgloY2hAaW5mcmFkZWFkLm9yZwpAQCAtNTYyOSw2ICs1NjU4LDcgQEAKIE06CWFsYW5AbHhvcmd1ay51a3V1Lm9yZy51awogTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAorVDoJc3RnaXQgaHR0cDovL3plbml2LmxpbnV4Lm9yZy51ay9+YWxhbi90dHlkZXYvCiAKIFRVTElQIE5FVFdPUksgRFJJVkVSUwogUDoJR3JhbnQgR3J1bmRsZXIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKaW5kZXggOWM5ZDFmZC4uNWJkNTI1OSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKQEAgLTE3NiwyMiArMTc2LDI2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogZHAyNjRfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSkKIHsgCiAJc3Bpbl9sb2NrKCZkcDI2NF9pcnFfbG9jayk7CiAJY3B1X3NldF9pcnFfYWZmaW5pdHkoaXJxLCAqYWZmaW5pdHkpOwogCXRzdW5hbWlfdXBkYXRlX2lycV9odyhjYWNoZWRfaXJxX21hc2spOwogCXNwaW5fdW5sb2NrKCZkcDI2NF9pcnFfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGNsaXBwZXJfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSkKIHsgCiAJc3Bpbl9sb2NrKCZkcDI2NF9pcnFfbG9jayk7CiAJY3B1X3NldF9pcnFfYWZmaW5pdHkoaXJxIC0gMTYsICphZmZpbml0eSk7CiAJdHN1bmFtaV91cGRhdGVfaXJxX2h3KGNhY2hlZF9pcnFfbWFzayk7CiAJc3Bpbl91bmxvY2soJmRwMjY0X2lycV9sb2NrKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGRwMjY0X2lycV90eXBlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYwppbmRleCAyN2Y4NDBhLi44ZGQyMzllIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYwpAQCAtMTU3LDEzICsxNTcsMTUgQEAKIAogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogdGl0YW5fc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHkpCiB7IAogCXNwaW5fbG9jaygmdGl0YW5faXJxX2xvY2spOwogCXRpdGFuX2NwdV9zZXRfaXJxX2FmZmluaXR5KGlycSAtIDE2LCAqYWZmaW5pdHkpOwogCXRpdGFuX3VwZGF0ZV9pcnFfaHcodGl0YW5fY2FjaGVkX2lycV9tYXNrKTsKIAlzcGluX3VubG9jaygmdGl0YW5faXJxX2xvY2spOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZ2ljLmMgYi9hcmNoL2FybS9jb21tb24vZ2ljLmMKaW5kZXggM2UxNzE0Yy4uNjY0YzdiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2dpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBnaWNfc2V0X2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFza192YWwpCitzdGF0aWMgaW50IGdpY19zZXRfY3B1KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrX3ZhbCkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZyA9IGdpY19kaXN0X2Jhc2UoaXJxKSArIEdJQ19ESVNUX1RBUkdFVCArIChnaWNfaXJxKGlycSkgJiB+Myk7CiAJdW5zaWduZWQgaW50IHNoaWZ0ID0gKGlycSAlIDQpICogODsKQEAgLTEyMiw2ICsxMjIsOCBAQAogCXZhbCB8PSAxIDw8IChjcHUgKyBzaGlmdCk7CiAJd3JpdGVsKHZhbCwgcmVnKTsKIAlzcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvaW14LXVhcnQuaCBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pbXgtdWFydC5oCmluZGV4IDU5OTIxN2IuLmY5YmQxN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pbXgtdWFydC5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9pbXgtdWFydC5oCkBAIC0yMCwxMSArMjAsMTYgQEAKICNkZWZpbmUgQVNNQVJNX0FSQ0hfVUFSVF9ICiAKICNkZWZpbmUgSU1YVUFSVF9IQVZFX1JUU0NUUyAoMTw8MCkKKyNkZWZpbmUgSU1YVUFSVF9JUkRBICAgICAgICAoMTw8MSkKIAogc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSB7CiAJaW50ICgqaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiAJaW50ICgqZXhpdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiAJdW5zaWduZWQgaW50IGZsYWdzOworCXZvaWQgKCppcmRhX2VuYWJsZSkoaW50IGVuYWJsZSk7CisJdW5zaWduZWQgaW50IGlyZGFfaW52X3J4OjE7CisJdW5zaWduZWQgaW50IGlyZGFfaW52X3R4OjE7CisJdW5zaWduZWQgc2hvcnQgdHJhbnNjZWl2ZXJfZGVsYXk7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9tYWlsYm94LmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvbWFpbGJveC5jCmluZGV4IDBhYmZiYWEuLjQwNDI0ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC9tYWlsYm94LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL21haWxib3guYwpAQCAtMTQ3LDI0ICsxNDcsNDAgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdHJ1Y3Qgb21hcF9tc2dfdHhfZGF0YSB7CisJbWJveF9tc2dfdAltc2c7CisJdm9pZAkJKmFyZzsKK307CisKK3N0YXRpYyB2b2lkIG9tYXBfbXNnX3R4X2VuZF9pbyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvcikKK3sKKwlrZnJlZShycS0+c3BlY2lhbCk7CisJX19ibGtfcHV0X3JlcXVlc3QocnEtPnEsIHJxKTsKK30KKwogaW50IG9tYXBfbWJveF9tc2dfc2VuZChzdHJ1Y3Qgb21hcF9tYm94ICptYm94LCBtYm94X21zZ190IG1zZywgdm9pZCogYXJnKQogeworCXN0cnVjdCBvbWFwX21zZ190eF9kYXRhICp0eF9kYXRhOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IG1ib3gtPnR4cS0+cXVldWU7Ci0JaW50IHJldCA9IDA7CisKKwl0eF9kYXRhID0ga21hbGxvYyhzaXplb2YoKnR4X2RhdGEpLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoIXR4X2RhdGEpKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIFdSSVRFLCBHRlBfQVRPTUlDKTsKIAlpZiAodW5saWtlbHkoIXJxKSkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7CisJCWtmcmVlKHR4X2RhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlycS0+ZGF0YSA9ICh2b2lkICopbXNnOwotCWJsa19pbnNlcnRfcmVxdWVzdChxLCBycSwgMCwgYXJnKTsKKwl0eF9kYXRhLT5tc2cgPSBtc2c7CisJdHhfZGF0YS0+YXJnID0gYXJnOworCXJxLT5lbmRfaW8gPSBvbWFwX21zZ190eF9lbmRfaW87CisJYmxrX2luc2VydF9yZXF1ZXN0KHEsIHJxLCAwLCB0eF9kYXRhKTsKIAogCXNjaGVkdWxlX3dvcmsoJm1ib3gtPnR4cS0+d29yayk7Ci0gZmFpbDoKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChvbWFwX21ib3hfbXNnX3NlbmQpOwogCkBAIC0xNzgsMjIgKzE5NCwyOCBAQAogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gbWJveC0+dHhxLT5xdWV1ZTsKIAogCXdoaWxlICgxKSB7CisJCXN0cnVjdCBvbWFwX21zZ190eF9kYXRhICp0eF9kYXRhOworCiAJCXNwaW5fbG9jayhxLT5xdWV1ZV9sb2NrKTsKLQkJcnEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCQlycSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOwogCQlzcGluX3VubG9jayhxLT5xdWV1ZV9sb2NrKTsKIAogCQlpZiAoIXJxKQogCQkJYnJlYWs7CiAKLQkJcmV0ID0gX19tYm94X21zZ19zZW5kKG1ib3gsIChtYm94X21zZ190KSBycS0+ZGF0YSwgcnEtPnNwZWNpYWwpOworCQl0eF9kYXRhID0gcnEtPnNwZWNpYWw7CisKKwkJcmV0ID0gX19tYm94X21zZ19zZW5kKG1ib3gsIHR4X2RhdGEtPm1zZywgdHhfZGF0YS0+YXJnKTsKIAkJaWYgKHJldCkgewogCQkJZW5hYmxlX21ib3hfaXJxKG1ib3gsIElSUV9UWCk7CisJCQlzcGluX2xvY2socS0+cXVldWVfbG9jayk7CisJCQlibGtfcmVxdWV1ZV9yZXF1ZXN0KHEsIHJxKTsKKwkJCXNwaW5fdW5sb2NrKHEtPnF1ZXVlX2xvY2spOwogCQkJcmV0dXJuOwogCQl9CiAKIAkJc3Bpbl9sb2NrKHEtPnF1ZXVlX2xvY2spOwotCQlpZiAoX19ibGtfZW5kX3JlcXVlc3QocnEsIDAsIDApKQotCQkJQlVHKCk7CisJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChycSwgMCk7CiAJCXNwaW5fdW5sb2NrKHEtPnF1ZXVlX2xvY2spOwogCX0KIH0KQEAgLTIxOCwxNiArMjQwLDEzIEBACiAKIAl3aGlsZSAoMSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCXJxID0gZWx2X25leHRfcmVxdWVzdChxKTsKKwkJcnEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAJCWlmICghcnEpCiAJCQlicmVhazsKIAotCQltc2cgPSAobWJveF9tc2dfdCkgcnEtPmRhdGE7Ci0KLQkJaWYgKGJsa19lbmRfcmVxdWVzdChycSwgMCwgMCkpCi0JCQlCVUcoKTsKLQorCQltc2cgPSAobWJveF9tc2dfdClycS0+c3BlY2lhbDsKKwkJYmxrX2VuZF9yZXF1ZXN0X2FsbChycSwgMCk7CiAJCW1ib3gtPnJ4cS0+Y2FsbGJhY2soKHZvaWQgKiltc2cpOwogCX0KIH0KQEAgLTI2NCw3ICsyODMsNiBAQAogCQkJZ290byBub21lbTsKIAogCQltc2cgPSBtYm94X2ZpZm9fcmVhZChtYm94KTsKLQkJcnEtPmRhdGEgPSAodm9pZCAqKW1zZzsKIAogCQlpZiAodW5saWtlbHkobWJveF9zZXFfdGVzdChtYm94LCBtc2cpKSkgewogCQkJcHJfaW5mbygibWJveDogSWxsZWdhbCBzZXEgYml0ISglMDh4KVxuIiwgbXNnKTsKQEAgLTI3Miw3ICsyOTAsNyBAQAogCQkJCW1ib3gtPmVycl9ub3RpZnkoKTsKIAkJfQogCi0JCWJsa19pbnNlcnRfcmVxdWVzdChxLCBycSwgMCwgTlVMTCk7CisJCWJsa19pbnNlcnRfcmVxdWVzdChxLCBycSwgMCwgKHZvaWQgKiltc2cpOwogCQlpZiAobWJveC0+b3BzLT50eXBlID09IE9NQVBfTUJPWF9UWVBFMSkKIAkJCWJyZWFrOwogCX0KQEAgLTMyOSwxNiArMzQ3LDE1IEBACiAKIAl3aGlsZSAoMSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCXJxID0gZWx2X25leHRfcmVxdWVzdChxKTsKKwkJcnEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKIAkJaWYgKCFycSkKIAkJCWJyZWFrOwogCi0JCSpwID0gKG1ib3hfbXNnX3QpIHJxLT5kYXRhOworCQkqcCA9IChtYm94X21zZ190KXJxLT5zcGVjaWFsOwogCi0JCWlmIChibGtfZW5kX3JlcXVlc3QocnEsIDAsIDApKQotCQkJQlVHKCk7CisJCWJsa19lbmRfcmVxdWVzdF9hbGwocnEsIDApOwogCiAJCWlmICh1bmxpa2VseShtYm94X3NlcV90ZXN0KG1ib3gsICpwKSkpIHsKIAkJCXByX2luZm8oIm1ib3g6IElsbGVnYWwgc2VxIGJpdCEoJTA4eCkgaWdub3JlZFxuIiwgKnApOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9pcnEuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvaXJxLmMKaW5kZXggZGYzOTI1Yy4uZDcwYjQ0NSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2lycS5jCkBAIC0zMjUsMTIgKzMyNSwxNCBAQAogewogfQogCi12b2lkIHNldF9hZmZpbml0eV9jcmlzdjMyX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCkKK2ludCBzZXRfYWZmaW5pdHlfY3Jpc3YzMl9pcnEodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2xvY2ssIGZsYWdzKTsKIAlpcnFfYWxsb2NhdGlvbnNbaXJxIC0gRklSU1RfSVJRXS5tYXNrID0gKmRlc3Q7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGNyaXN2MzJfaXJxX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9LY29uZmlnIGIvYXJjaC9mcnYvS2NvbmZpZwppbmRleCA5ZDE1NTJhLi44YTViZDdhIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9LY29uZmlnCisrKyBiL2FyY2gvZnJ2L0tjb25maWcKQEAgLTYsNiArNiw3IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCXNlbGVjdCBIQVZFX0lERQorCXNlbGVjdCBIQVZFX0FSQ0hfVFJBQ0VIT09LCiAKIGNvbmZpZyBaT05FX0RNQQogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vYml0b3BzLmgKaW5kZXggMjg3ZjZmNi4uNTBhZTkxYiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTExMiw3ICsxMTIsNyBAQAogI2RlZmluZSBhdG9taWNfY2xlYXJfbWFzayhtYXNrLCB2KQlhdG9taWNfdGVzdF9hbmRfQU5ETk9UX21hc2soKG1hc2spLCAodikpCiAjZGVmaW5lIGF0b21pY19zZXRfbWFzayhtYXNrLCB2KQlhdG9taWNfdGVzdF9hbmRfT1JfbWFzaygobWFzayksICh2KSkKIAotc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX2NsZWFyX2JpdCh1bnNpZ25lZCBsb25nIG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKnB0ciA9IGFkZHI7CiAJdW5zaWduZWQgbG9uZyBtYXNrID0gMVVMIDw8IChuciAmIDMxKTsKQEAgLTEyMCw3ICsxMjAsNyBAQAogCXJldHVybiAoYXRvbWljX3Rlc3RfYW5kX0FORE5PVF9tYXNrKG1hc2ssIHB0cikgJiBtYXNrKSAhPSAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX3NldF9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwdHIgPSBhZGRyOwogCXVuc2lnbmVkIGxvbmcgbWFzayA9IDFVTCA8PCAobnIgJiAzMSk7CkBAIC0xMjgsNyArMTI4LDcgQEAKIAlyZXR1cm4gKGF0b21pY190ZXN0X2FuZF9PUl9tYXNrKG1hc2ssIHB0cikgJiBtYXNrKSAhPSAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX2NoYW5nZV9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpwdHIgPSBhZGRyOwogCXVuc2lnbmVkIGxvbmcgbWFzayA9IDFVTCA8PCAobnIgJiAzMSk7CkBAIC0xMzYsMjIgKzEzNiwyMiBAQAogCXJldHVybiAoYXRvbWljX3Rlc3RfYW5kX1hPUl9tYXNrKG1hc2ssIHB0cikgJiBtYXNrKSAhPSAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKIHsKIAl0ZXN0X2FuZF9jbGVhcl9iaXQobnIsIGFkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdCh1bnNpZ25lZCBsb25nIG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQogewogCXRlc3RfYW5kX3NldF9iaXQobnIsIGFkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQorc3RhdGljIGlubGluZSB2b2lkIGNoYW5nZV9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKIHsKIAl0ZXN0X2FuZF9jaGFuZ2VfYml0KG5yLCBhZGRyKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgX19jbGVhcl9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkcjsKIAlpbnQgbWFzazsKQEAgLTE2MSw3ICsxNjEsNyBAQAogCSphICY9IH5tYXNrOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfYml0KHVuc2lnbmVkIGxvbmcgbnIsIHZvbGF0aWxlIHZvaWQgKmFkZHIpCiB7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqYSA9IGFkZHI7CiAJaW50IG1hc2s7CkBAIC0xNzEsNyArMTcxLDcgQEAKIAkqYSB8PSBtYXNrOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NoYW5nZV9iaXQodW5zaWduZWQgbG9uZyBuciwgdm9sYXRpbGUgdm9pZCAqYWRkcikKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICphID0gYWRkcjsKIAlpbnQgbWFzazsKQEAgLTE4MSw3ICsxODEsNyBAQAogCSphIF49IG1hc2s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfY2xlYXJfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCitzdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NsZWFyX2JpdCh1bnNpZ25lZCBsb25nIG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyOwogCWludCBtYXNrLCByZXR2YWw7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX3NldF9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfc2V0X2JpdCh1bnNpZ25lZCBsb25nIG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyOwogCWludCBtYXNrLCByZXR2YWw7CkBAIC0yMDUsNyArMjA1LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX3Rlc3RfYW5kX2NoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IF9fdGVzdF9hbmRfY2hhbmdlX2JpdCh1bnNpZ25lZCBsb25nIG5yLCB2b2xhdGlsZSB2b2lkICphZGRyKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKmEgPSBhZGRyOwogCWludCBtYXNrLCByZXR2YWw7CkBAIC0yMjAsMTIgKzIyMCwxMyBAQAogLyoKICAqIFRoaXMgcm91dGluZSBkb2Vzbid0IG5lZWQgdG8gYmUgYXRvbWljLgogICovCi1zdGF0aWMgaW5saW5lIGludCBfX2NvbnN0YW50X3Rlc3RfYml0KGludCBuciwgY29uc3Qgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCitzdGF0aWMgaW5saW5lIGludAorX19jb25zdGFudF90ZXN0X2JpdCh1bnNpZ25lZCBsb25nIG5yLCBjb25zdCB2b2xhdGlsZSB2b2lkICphZGRyKQogewogCXJldHVybiAoKDFVTCA8PCAobnIgJiAzMSkpICYgKCgoY29uc3Qgdm9sYXRpbGUgdW5zaWduZWQgaW50ICopIGFkZHIpW25yID4+IDVdKSkgIT0gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2JpdChpbnQgbnIsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKiBhZGRyKQorc3RhdGljIGlubGluZSBpbnQgX190ZXN0X2JpdCh1bnNpZ25lZCBsb25nIG5yLCBjb25zdCB2b2xhdGlsZSB2b2lkICphZGRyKQogewogCWludCAJKiBhID0gKGludCAqKSBhZGRyOwogCWludAltYXNrOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCA3Mjc5ZWMwN2QuLjdiYmY2ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0xMTYsNiArMTE2LDcgQEAKIH0gd2hpbGUoMCkKIAogI2RlZmluZSBVU0VfRUxGX0NPUkVfRFVNUAorI2RlZmluZSBDT1JFX0RVTVBfVVNFX1JFR1NFVAogI2RlZmluZSBFTEZfRkRQSUNfQ09SRV9FRkxBR1MJRUZfRlJWX0ZEUElDCiAjZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFCTE2Mzg0CiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3BjaS5oIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggNTg1ZDliNC4uY2M2ODVlNiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vcGNpLmgKQEAgLTg3LDggKzg3LDcgQEAKIAkJCQkgICAgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAogCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKIHsKLQlpZiAoZGlyZWN0aW9uID09IFBDSV9ETUFfTk9ORSkKLSAgICAgICAgICAgICAgICBCVUcoKTsKKwlCVUdfT04oZGlyZWN0aW9uID09IFBDSV9ETUFfTk9ORSk7CiAKIAlmcnZfY2FjaGVfd2JhY2tfaW52KCh1bnNpZ25lZCBsb25nKWJ1c190b192aXJ0KGRtYV9oYW5kbGUpLAogCQkJICAgICh1bnNpZ25lZCBsb25nKWJ1c190b192aXJ0KGRtYV9oYW5kbGUpICsgc2l6ZSk7CkBAIC0xMDUsOSArMTA0LDcgQEAKIAkJCQkgICBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQogewogCWludCBpOwotCi0JaWYgKGRpcmVjdGlvbiA9PSBQQ0lfRE1BX05PTkUpCi0gICAgICAgICAgICAgICAgQlVHKCk7CisJQlVHX09OKGRpcmVjdGlvbiA9PSBQQ0lfRE1BX05PTkUpOwogCiAJZm9yIChpID0gMDsgaSA8IG5lbGVtczsgaSsrKQogCQlmcnZfY2FjaGVfd2JhY2tfaW52KHNnX2RtYV9hZGRyZXNzKCZzZ1tpXSksCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IGNmNjkzNDAuLmE1NGI1MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3B0cmFjZS5oCisrKyBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC02NSw2ICs2NSw4IEBACiAjaWZkZWYgX19LRVJORUxfXwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorc3RydWN0IHRhc2tfc3RydWN0OworCiAvKgogICogd2UgZGVkaWNhdGUgR1IyOCB0byBrZWVwaW5nIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBleGNlcHRpb24gZnJhbWUKICAqIC0gZ3IyOCBpcyBkZXN0cm95ZWQgb24gZW50cnkgdG8gdGhlIGtlcm5lbCBmcm9tIHVzZXJzcGFjZQpAQCAtNzMsMTEgKzc1LDE4IEBACiAKICNkZWZpbmUgdXNlcl9tb2RlKHJlZ3MpCQkJKCEoKHJlZ3MpLT5wc3IgJiBQU1JfUykpCiAjZGVmaW5lIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykJKChyZWdzKS0+cGMpCisjZGVmaW5lIHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKQkoKHJlZ3MpLT5zcCkKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdXNlcl9zdGFjayhjb25zdCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiB2b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVncyAqKTsKICNkZWZpbmUgcHJvZmlsZV9wYyhyZWdzKSAoKHJlZ3MpLT5wYykKLSNlbmRpZgorCisjZGVmaW5lIHRhc2tfcHRfcmVncyh0YXNrKSAoKHRhc2spLT50aHJlYWQuZnJhbWUwKQorCisjZGVmaW5lIGFyY2hfaGFzX3NpbmdsZV9zdGVwKCkJKDEpCitleHRlcm4gdm9pZCB1c2VyX2VuYWJsZV9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCB1c2VyX2Rpc2FibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICopOwogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1BUUkFDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9pbmNsdWRlL2FzbS9zeXNjYWxsLmggYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ODllYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtMCwwICsxLDEyMyBAQAorLyogc3lzY2FsbCBwYXJhbWV0ZXIgYWNjZXNzIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fU1lTQ0FMTF9ICisjZGVmaW5lIF9BU01fU1lTQ0FMTF9ICisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKKy8qCisgKiBHZXQgdGhlIHN5c3RlbSBjYWxsIG51bWJlciBvciAtMQorICovCitzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfbnIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIHJlZ3MtPnN5c2NhbGxubzsKK30KKworLyoKKyAqIFJlc3RvcmUgdGhlIGNsb2JiZXJlZCBHUjggcmVnaXN0ZXIKKyAqICgxc3Qgc3lzY2FsbCBhcmcgd2FzIG92ZXJ3cml0dGVuIHdpdGggc3lzY2FsbCByZXR1cm4gb3IgZXJyb3IpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzeXNjYWxsX3JvbGxiYWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmVncy0+Z3I4ID0gcmVncy0+b3JpZ19ncjg7Cit9CisKKy8qCisgKiBTZWUgaWYgdGhlIHN5c2NhbGwgcmV0dXJuIHZhbHVlIGlzIGFuIGVycm9yLCByZXR1cm5pbmcgaXQgaWYgaXQgaXMgYW5kIDAgaWYKKyAqIG5vdAorICovCitzdGF0aWMgaW5saW5lIGxvbmcgc3lzY2FsbF9nZXRfZXJyb3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJcmV0dXJuIElTX0VSUl9WQUxVRShyZWdzLT5ncjgpID8gcmVncy0+Z3I4IDogMDsKK30KKworLyoKKyAqIEdldCB0aGUgc3lzY2FsbCByZXR1cm4gdmFsdWUKKyAqLworc3RhdGljIGlubGluZSBsb25nIHN5c2NhbGxfZ2V0X3JldHVybl92YWx1ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gcmVncy0+Z3I4OworfQorCisvKgorICogU2V0IHRoZSBzeXNjYWxsIHJldHVybiB2YWx1ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9zZXRfcmV0dXJuX3ZhbHVlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgICAgaW50IGVycm9yLCBsb25nIHZhbCkKK3sKKwlpZiAoZXJyb3IpCisJCXJlZ3MtPmdyOCA9IC1lcnJvcjsKKwllbHNlCisJCXJlZ3MtPmdyOCA9IHZhbDsKK30KKworLyoKKyAqIFJldHJpZXZlIHRoZSBzeXN0ZW0gY2FsbCBhcmd1bWVudHMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHN5c2NhbGxfZ2V0X2FyZ3VtZW50cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkJIHVuc2lnbmVkIGludCBpLCB1bnNpZ25lZCBpbnQgbiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgKmFyZ3MpCit7CisJLyoKKwkgKiBEbyB0aGlzIHNpbXBseSBmb3Igbm93LiBJZiB3ZSBuZWVkIHRvIHN0YXJ0IHN1cHBvcnRpbmcKKwkgKiBmZXRjaGluZyBhcmd1bWVudHMgZnJvbSBhcmJpdHJhcnkgaW5kaWNlcywgdGhpcyB3aWxsIG5lZWQgc29tZQorCSAqIGV4dHJhIGxvZ2ljLiBQcmVzZW50bHkgdGhlcmUgYXJlIG5vIGluLXRyZWUgdXNlcnMgdGhhdCBkZXBlbmQKKwkgKiBvbiB0aGlzIGJlaGF2aW91ci4KKwkgKi8KKwlCVUdfT04oaSk7CisKKwkvKiBBcmd1bWVudCBwYXR0ZXJuIGlzOiBHUjgsIEdSOSwgR1IxMCwgR1IxMSwgR1IxMiwgR1IxMyAqLworCXN3aXRjaCAobikgeworCWNhc2UgNjogYXJnc1s1XSA9IHJlZ3MtPmdyMTM7CisJY2FzZSA1OiBhcmdzWzRdID0gcmVncy0+Z3IxMjsKKwljYXNlIDQ6IGFyZ3NbM10gPSByZWdzLT5ncjExOworCWNhc2UgMzogYXJnc1syXSA9IHJlZ3MtPmdyMTA7CisJY2FzZSAyOiBhcmdzWzFdID0gcmVncy0+Z3I5OworCWNhc2UgMToJYXJnc1swXSA9IHJlZ3MtPmdyODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCisvKgorICogQWx0ZXIgdGhlIHN5c3RlbSBjYWxsIGFyZ3VtZW50cworICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzY2FsbF9zZXRfYXJndW1lbnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorCQkJCQkgdW5zaWduZWQgaW50IGksIHVuc2lnbmVkIGludCBuLAorCQkJCQkgY29uc3QgdW5zaWduZWQgbG9uZyAqYXJncykKK3sKKwkvKiBTYW1lIG5vdGUgYXMgYWJvdmUgYXBwbGllcyAqLworCUJVR19PTihpKTsKKworCXN3aXRjaCAobikgeworCWNhc2UgNjogcmVncy0+Z3IxMyA9IGFyZ3NbNV07CisJY2FzZSA1OiByZWdzLT5ncjEyID0gYXJnc1s0XTsKKwljYXNlIDQ6IHJlZ3MtPmdyMTEgPSBhcmdzWzNdOworCWNhc2UgMzogcmVncy0+Z3IxMCA9IGFyZ3NbMl07CisJY2FzZSAyOiByZWdzLT5ncjkgID0gYXJnc1sxXTsKKwljYXNlIDE6IHJlZ3MtPmdyOCAgPSBhcmdzWzBdOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBfQVNNX1NZU0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggYmI1M2FiNy4uZThhNWVkNyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xMDksMjAgKzEwOSwyMCBAQAogICogLSBvdGhlciBmbGFncyBpbiBNU1cKICAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRQkwCS8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCi0jZGVmaW5lIFRJRl9TSUdQRU5ESU5HCQkxCS8qIHNpZ25hbCBwZW5kaW5nICovCi0jZGVmaW5lIFRJRl9ORUVEX1JFU0NIRUQJMgkvKiByZXNjaGVkdWxpbmcgbmVjZXNzYXJ5ICovCi0jZGVmaW5lIFRJRl9TSU5HTEVTVEVQCQkzCS8qIHJlc3RvcmUgc2luZ2xlc3RlcCBvbiByZXR1cm4gdG8gdXNlciBtb2RlICovCi0jZGVmaW5lIFRJRl9JUkVUCQk0CS8qIHJldHVybiB3aXRoIGlyZXQgKi8KKyNkZWZpbmUgVElGX05PVElGWV9SRVNVTUUJMQkvKiBjYWxsYmFjayBiZWZvcmUgcmV0dXJuaW5nIHRvIHVzZXIgKi8KKyNkZWZpbmUgVElGX1NJR1BFTkRJTkcJCTIJLyogc2lnbmFsIHBlbmRpbmcgKi8KKyNkZWZpbmUgVElGX05FRURfUkVTQ0hFRAkzCS8qIHJlc2NoZWR1bGluZyBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgVElGX1NJTkdMRVNURVAJCTQJLyogcmVzdG9yZSBzaW5nbGVzdGVwIG9uIHJldHVybiB0byB1c2VyIG1vZGUgKi8KICNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk1CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KICNkZWZpbmUgVElGX1BPTExJTkdfTlJGTEFHCTE2CS8qIHRydWUgaWYgcG9sbF9pZGxlKCkgaXMgcG9sbGluZyBUSUZfTkVFRF9SRVNDSEVEICovCiAjZGVmaW5lIFRJRl9NRU1ESUUJCTE3CS8qIE9PTSBraWxsZXIga2lsbGVkIHByb2Nlc3MgKi8KICNkZWZpbmUgVElGX0ZSRUVaRQkJMTgJLyogZnJlZXppbmcgZm9yIHN1c3BlbmQgKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCisjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMSA8PCBUSUZfTk9USUZZX1JFU1VNRSkKICNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMSA8PCBUSUZfU0lHUEVORElORykKICNkZWZpbmUgX1RJRl9ORUVEX1JFU0NIRUQJKDEgPDwgVElGX05FRURfUkVTQ0hFRCkKICNkZWZpbmUgX1RJRl9TSU5HTEVTVEVQCQkoMSA8PCBUSUZfU0lOR0xFU1RFUCkKLSNkZWZpbmUgX1RJRl9JUkVUCQkoMSA8PCBUSUZfSVJFVCkKICNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKDEgPDwgVElGX1JFU1RPUkVfU0lHTUFTSykKICNkZWZpbmUgX1RJRl9QT0xMSU5HX05SRkxBRwkoMSA8PCBUSUZfUE9MTElOR19OUkZMQUcpCiAjZGVmaW5lIF9USUZfRlJFRVpFCQkoMSA8PCBUSUZfRlJFRVpFKQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMgYi9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUwppbmRleCAxZGE1MjNiLi4zNTZlMGUzIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2Zydi9rZXJuZWwvZW50cnkuUwpAQCAtODg2LDcgKzg4Niw2IEBACiAJYm5jCQlpY2MwLCMwLF9fc3lzY2FsbF9iYWRzeXMKIAogCWxkaQkJQChncjE1LCNUSV9GTEFHUyksZ3I0Ci0Jb3JpCQlncjQsI19USUZfU1lTQ0FMTF9UUkFDRSxncjQKIAlhbmRpY2MJCWdyNCwjX1RJRl9TWVNDQUxMX1RSQUNFLGdyMCxpY2MwCiAJYm5lCQlpY2MwLCMwLF9fc3lzY2FsbF90cmFjZV9lbnRyeQogCkBAIC0xMTUwLDExICsxMTQ5LDEwIEBACiAJIyBwZXJmb3JtIHN5c2NhbGwgZW50cnkgdHJhY2luZwogX19zeXNjYWxsX3RyYWNlX2VudHJ5OgogCUxFRFMJCTB4NjMyMAotCXNldGxvcy5wCSMwLGdyOAotCWNhbGwJCWRvX3N5c2NhbGxfdHJhY2UKKwljYWxsCQlzeXNjYWxsX3RyYWNlX2VudHJ5CiAKLQlsZGkJCUAoZ3IyOCwjUkVHX1NZU0NBTExOTyksZ3I3Ci0JbGRkaQkJQChncjI4LCNSRUdfR1IoOCkpICxncjgKKwlsZGRpLnAJCUAoZ3IyOCwjUkVHX0dSKDgpKSAsZ3I4CisJb3JpCQlncjgsIzAsZ3I3CQk7IHN5c2NhbGxfdHJhY2VfZW50cnkoKSByZXR1cm5lZCBuZXcgc3lzY2FsbG5vCiAJbGRkaQkJQChncjI4LCNSRUdfR1IoMTApKSxncjEwCiAJbGRkaS5wCQlAKGdyMjgsI1JFR19HUigxMikpLGdyMTIKIApAQCAtMTE2OSwxMSArMTE2NywxMCBAQAogCWJlcQkJaWNjMCwjMSxfX2VudHJ5X3dvcmtfcGVuZGluZwogCiAJbW92c2cJCXBzcixncjIzCi0JYW5kaQkJZ3IyMywjflBTUl9QSUwsZ3IyMwk7IGNvdWxkIGxldCBkb19zeXNjYWxsX3RyYWNlKCkgY2FsbCBzY2hlZHVsZSgpCisJYW5kaQkJZ3IyMywjflBTUl9QSUwsZ3IyMwk7IGNvdWxkIGxldCBzeXNjYWxsX3RyYWNlX2V4aXQoKSBjYWxsIHNjaGVkdWxlKCkKIAltb3ZncwkJZ3IyMyxwc3IKIAotCXNldGxvcy5wCSMxLGdyOAotCWNhbGwJCWRvX3N5c2NhbGxfdHJhY2UKKwljYWxsCQlzeXNjYWxsX3RyYWNlX2V4aXQKIAlicmEJCV9fZW50cnlfcmVzdW1lX3VzZXJzcGFjZQogCiBfX3N5c2NhbGxfYmFkc3lzOgpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9mcnYva2VybmVsL3B0cmFjZS5jCmluZGV4IDVlN2Q0MDEuLjYwZWVlZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvcHRyYWNlLmMKQEAgLTE5LDYgKzE5LDkgQEAKICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTMzLDYgKzM2LDE2OSBAQAogICovCiAKIC8qCisgKiByZXRyaWV2ZSB0aGUgY29udGVudHMgb2YgRlJWIHVzZXJzcGFjZSBnZW5lcmFsIHJlZ2lzdGVycworICovCitzdGF0aWMgaW50IGdlbnJlZ3NfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgICB2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwljb25zdCBzdHJ1Y3QgdXNlcl9pbnRfcmVncyAqaXJlZ3MgPSAmdGFyZ2V0LT50aHJlYWQudXNlci0+aTsKKwlpbnQgcmV0OworCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgIGlyZWdzLCAwLCBzaXplb2YoKmlyZWdzKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gdXNlcl9yZWdzZXRfY29weW91dF96ZXJvKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQlzaXplb2YoKmlyZWdzKSwgLTEpOworfQorCisvKgorICogdXBkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgRlJWIHVzZXJzcGFjZSBnZW5lcmFsIHJlZ2lzdGVycworICovCitzdGF0aWMgaW50IGdlbnJlZ3Nfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwlzdHJ1Y3QgdXNlcl9pbnRfcmVncyAqaXJlZ3MgPSAmdGFyZ2V0LT50aHJlYWQudXNlci0+aTsKKwl1bnNpZ25lZCBpbnQgb2Zmc19ncjAsIG9mZnNfZ3IxOworCWludCByZXQ7CisKKwkvKiBub3QgYWxsb3dlZCB0byBzZXQgUFNSIG9yIF9fc3RhdHVzICovCisJaWYgKHBvcyA8IG9mZnNldG9mKHN0cnVjdCB1c2VyX2ludF9yZWdzLCBwc3IpICsgc2l6ZW9mKGxvbmcpICYmCisJICAgIHBvcyArIGNvdW50ID4gb2Zmc2V0b2Yoc3RydWN0IHVzZXJfaW50X3JlZ3MsIHBzcikpCisJCXJldHVybiAtRUlPOworCisJaWYgKHBvcyA8IG9mZnNldG9mKHN0cnVjdCB1c2VyX2ludF9yZWdzLCBfX3N0YXR1cykgKyBzaXplb2YobG9uZykgJiYKKwkgICAgcG9zICsgY291bnQgPiBvZmZzZXRvZihzdHJ1Y3QgdXNlcl9pbnRfcmVncywgX19zdGF0dXMpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHNldCB0aGUgY29udHJvbCByZWdzICovCisJb2Zmc19ncjAgPSBvZmZzZXRvZihzdHJ1Y3QgdXNlcl9pbnRfcmVncywgZ3JbMF0pOworCW9mZnNfZ3IxID0gb2Zmc2V0b2Yoc3RydWN0IHVzZXJfaW50X3JlZ3MsIGdyWzFdKTsKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJIGlyZWdzLCAwLCBvZmZzX2dyMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBza2lwIEdSMC9UQlIgKi8KKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW5faWdub3JlKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQlvZmZzX2dyMCwgb2Zmc19ncjEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogc2V0IHRoZSBnZW5lcmFsIHJlZ3MgKi8KKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJICZpcmVncy0+Z3JbMV0sIG9mZnNfZ3IxLCBzaXplb2YoKmlyZWdzKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJc2l6ZW9mKCppcmVncyksIC0xKTsKK30KKworLyoKKyAqIHJldHJpZXZlIHRoZSBjb250ZW50cyBvZiBGUlYgdXNlcnNwYWNlIEZQL01lZGlhIHJlZ2lzdGVycworICovCitzdGF0aWMgaW50IGZwbXJlZ3NfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgICB2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwljb25zdCBzdHJ1Y3QgdXNlcl9mcG1lZGlhX3JlZ3MgKmZwcmVncyA9ICZ0YXJnZXQtPnRocmVhZC51c2VyLT5mOworCWludCByZXQ7CisKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAgZnByZWdzLCAwLCBzaXplb2YoKmZwcmVncykpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXRfemVybygmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJc2l6ZW9mKCpmcHJlZ3MpLCAtMSk7Cit9CisKKy8qCisgKiB1cGRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBGUlYgdXNlcnNwYWNlIEZQL01lZGlhIHJlZ2lzdGVycworICovCitzdGF0aWMgaW50IGZwbXJlZ3Nfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKK3sKKwlzdHJ1Y3QgdXNlcl9mcG1lZGlhX3JlZ3MgKmZwcmVncyA9ICZ0YXJnZXQtPnRocmVhZC51c2VyLT5mOworCWludCByZXQ7CisKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJIGZwcmVncywgMCwgc2l6ZW9mKCpmcHJlZ3MpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiB1c2VyX3JlZ3NldF9jb3B5aW5faWdub3JlKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCQlzaXplb2YoKmZwcmVncyksIC0xKTsKK30KKworLyoKKyAqIGRldGVybWluZSBpZiB0aGUgRlAvTWVkaWEgcmVnaXN0ZXJzIGhhdmUgYWN0dWFsbHkgYmVlbiB1c2VkCisgKi8KK3N0YXRpYyBpbnQgZnBtcmVnc19hY3RpdmUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCQkgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0KQoreworCXJldHVybiB0c2tfdXNlZF9tYXRoKHRhcmdldCkgPyByZWdzZXQtPm4gOiAwOworfQorCisvKgorICogRGVmaW5lIHRoZSByZWdpc3RlciBzZXRzIGF2YWlsYWJsZSBvbiB0aGUgRlJWIHVuZGVyIExpbnV4CisgKi8KK2VudW0gZnJ2X3JlZ3NldCB7CisJUkVHU0VUX0dFTkVSQUwsCisJUkVHU0VUX0ZQTUVESUEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0IGZydl9yZWdzZXRzW10gPSB7CisJLyoKKwkgKiBHZW5lcmFsIHJlZ2lzdGVyIGZvcm1hdCBpczoKKwkgKglQU1IsIElTUiwgQ0NSLCBDQ0NSLCBMUiwgTENSLCBQQywgKFNUQVRVUyksIFNZU0NBTExOTywgT1JJR19HOAorCSAqCUdORVIwLTEsIElBQ0MwLCBUQlIsIEdSMS02MworCSAqLworCVtSRUdTRVRfR0VORVJBTF0gPSB7CisJCS5jb3JlX25vdGVfdHlwZQk9IE5UX1BSU1RBVFVTLAorCQkubgkJPSBFTEZfTkdSRUcsCisJCS5zaXplCQk9IHNpemVvZihsb25nKSwKKwkJLmFsaWduCQk9IHNpemVvZihsb25nKSwKKwkJLmdldAkJPSBnZW5yZWdzX2dldCwKKwkJLnNldAkJPSBnZW5yZWdzX3NldCwKKwl9LAorCS8qCisJICogRlBVL01lZGlhIHJlZ2lzdGVyIGZvcm1hdCBpczoKKwkgKglGUjAtNjMsIEZORVIwLTEsIE1TUjAtMSwgQUNDMC03LCBBQ0NHMC04LCBGU1IKKwkgKi8KKwlbUkVHU0VUX0ZQTUVESUFdID0geworCQkuY29yZV9ub3RlX3R5cGUJPSBOVF9QUkZQUkVHLAorCQkubgkJPSBzaXplb2Yoc3RydWN0IHVzZXJfZnBtZWRpYV9yZWdzKSAvIHNpemVvZihsb25nKSwKKwkJLnNpemUJCT0gc2l6ZW9mKGxvbmcpLAorCQkuYWxpZ24JCT0gc2l6ZW9mKGxvbmcpLAorCQkuZ2V0CQk9IGZwbXJlZ3NfZ2V0LAorCQkuc2V0CQk9IGZwbXJlZ3Nfc2V0LAorCQkuYWN0aXZlCQk9IGZwbXJlZ3NfYWN0aXZlLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgdXNlcl9mcnZfbmF0aXZlX3ZpZXcgPSB7CisJLm5hbWUJCT0gImZydiIsCisJLmVfbWFjaGluZQk9IEVNX0ZSViwKKwkucmVnc2V0cwk9IGZydl9yZWdzZXRzLAorCS5uCQk9IEFSUkFZX1NJWkUoZnJ2X3JlZ3NldHMpLAorfTsKKworY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0X3ZpZXcgKnRhc2tfdXNlcl9yZWdzZXRfdmlldyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuICZ1c2VyX2Zydl9uYXRpdmVfdmlldzsKK30KKworLyoKICAqIEdldCBjb250ZW50cyBvZiByZWdpc3RlciBSRUdOTyBpbiB0YXNrIFRBU0suCiAgKi8KIHN0YXRpYyBpbmxpbmUgbG9uZyBnZXRfcmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJlZ25vKQpAQCAtNjksNDAgKzIzNSwyMyBAQAogfQogCiAvKgotICogY2hlY2sgdGhhdCBhbiBhZGRyZXNzIGZhbGxzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSB0YXJnZXQgcHJvY2VzcydzIG1lbW9yeQotICogbWFwcGluZ3MKLSAqLwotc3RhdGljIGlubGluZSBpbnQgaXNfdXNlcl9hZGRyX3ZhbGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbikKLXsKLSNpZmRlZiBDT05GSUdfTU1VCi0JaWYgKHN0YXJ0ID49IFBBR0VfT0ZGU0VUIHx8IGxlbiA+IFBBR0VfT0ZGU0VUIC0gc3RhcnQpCi0JCXJldHVybiAtRUlPOwotCXJldHVybiAwOwotI2Vsc2UKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQotCXZtYSA9IGZpbmRfdm1hKGNoaWxkLT5tbSwgc3RhcnQpOwotCWlmICh2bWEgJiYgc3RhcnQgPj0gdm1hLT52bV9zdGFydCAmJiBzdGFydCArIGxlbiA8PSB2bWEtPnZtX2VuZCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gLUVJTzsKLSNlbmRpZgotfQotCi0vKgogICogQ2FsbGVkIGJ5IGtlcm5lbC9wdHJhY2UuYyB3aGVuIGRldGFjaGluZy4uCiAgKgogICogQ29udHJvbCBoL3cgc2luZ2xlIHN0ZXBwaW5nCiAgKi8KLXZvaWQgcHRyYWNlX2Rpc2FibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3ZvaWQgdXNlcl9lbmFibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwljaGlsZC0+dGhyZWFkLmZyYW1lMC0+X19zdGF0dXMgfD0gUkVHX19TVEFUVVNfU1RFUDsKK30KKwordm9pZCB1c2VyX2Rpc2FibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKIAljaGlsZC0+dGhyZWFkLmZyYW1lMC0+X19zdGF0dXMgJj0gflJFR19fU1RBVFVTX1NURVA7CiB9CiAKLXZvaWQgcHRyYWNlX2VuYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQordm9pZCBwdHJhY2VfZGlzYWJsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogewotCWNoaWxkLT50aHJlYWQuZnJhbWUwLT5fX3N0YXR1cyB8PSBSRUdfX1NUQVRVU19TVEVQOworCXVzZXJfZGlzYWJsZV9zaW5nbGVfc3RlcChjaGlsZCk7CiB9CiAKIGxvbmcgYXJjaF9wdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgbG9uZyByZXF1ZXN0LCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKQEAgLTExMSwxNSArMjYwLDYgQEAKIAlpbnQgcmV0OwogCiAJc3dpdGNoIChyZXF1ZXN0KSB7Ci0JCS8qIHdoZW4gSSBhbmQgRCBzcGFjZSBhcmUgc2VwYXJhdGUsIHRoZXNlIHdpbGwgbmVlZCB0byBiZSBmaXhlZC4gKi8KLQljYXNlIFBUUkFDRV9QRUVLVEVYVDogLyogcmVhZCB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUEVFS0RBVEE6Ci0JCXJldCA9IC1FSU87Ci0JCWlmIChpc191c2VyX2FkZHJfdmFsaWQoY2hpbGQsIGFkZHIsIHNpemVvZih0bXApKSA8IDApCi0JCQlicmVhazsKLQkJcmV0ID0gZ2VuZXJpY19wdHJhY2VfcGVla2RhdGEoY2hpbGQsIGFkZHIsIGRhdGEpOwotCQlicmVhazsKLQogCQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KIAljYXNlIFBUUkFDRV9QRUVLVVNSOiB7CiAJCXRtcCA9IDA7CkBAIC0xNjMsMTUgKzMwMyw2IEBACiAJCWJyZWFrOwogCX0KIAotCQkvKiB3aGVuIEkgYW5kIEQgc3BhY2UgYXJlIHNlcGFyYXRlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBmaXhlZC4gKi8KLQljYXNlIFBUUkFDRV9QT0tFVEVYVDogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QT0tFREFUQToKLQkJcmV0ID0gLUVJTzsKLQkJaWYgKGlzX3VzZXJfYWRkcl92YWxpZChjaGlsZCwgYWRkciwgc2l6ZW9mKHRtcCkpIDwgMCkKLQkJCWJyZWFrOwotCQlyZXQgPSBnZW5lcmljX3B0cmFjZV9wb2tlZGF0YShjaGlsZCwgYWRkciwgZGF0YSk7Ci0JCWJyZWFrOwotCiAJY2FzZSBQVFJBQ0VfUE9LRVVTUjogLyogd3JpdGUgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhICovCiAJCXJldCA9IC1FSU87CiAJCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwKQpAQCAtMTc5LDcgKzMxMCw3IEBACiAKIAkJcmV0ID0gMDsKIAkJc3dpdGNoIChhZGRyID4+IDIpIHsKLQkJY2FzZSAwIC4uLiBQVF9fRU5ELTE6CisJCWNhc2UgMCAuLi4gUFRfX0VORCAtIDE6CiAJCQlyZXQgPSBwdXRfcmVnKGNoaWxkLCBhZGRyID4+IDIsIGRhdGEpOwogCQkJYnJlYWs7CiAKQEAgLTE4OSw5NSArMzIwLDI5IEBACiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIFBUUkFDRV9TWVNDQUxMOiAvKiBjb250aW51ZSBhbmQgc3RvcCBhdCBuZXh0IChyZXR1cm4gZnJvbSkgc3lzY2FsbCAqLwotCWNhc2UgUFRSQUNFX0NPTlQ6IC8qIHJlc3RhcnQgYWZ0ZXIgc2lnbmFsLiAqLwotCQlyZXQgPSAtRUlPOwotCQlpZiAoIXZhbGlkX3NpZ25hbChkYXRhKSkKLQkJCWJyZWFrOwotCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkKLQkJCXNldF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQkJZWxzZQotCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Ci0JCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwotCQlwdHJhY2VfZGlzYWJsZShjaGlsZCk7Ci0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOworCWNhc2UgUFRSQUNFX0dFVFJFR1M6CS8qIEdldCBhbGwgaW50ZWdlciByZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfdG9fdXNlcihjaGlsZCwgJnVzZXJfZnJ2X25hdGl2ZV92aWV3LAorCQkJCQkgICBSRUdTRVRfR0VORVJBTCwKKwkJCQkJICAgMCwgc2l6ZW9mKGNoaWxkLT50aHJlYWQudXNlci0+aSksCisJCQkJCSAgICh2b2lkIF9fdXNlciAqKWRhdGEpOwogCi0JCS8qIG1ha2UgdGhlIGNoaWxkIGV4aXQuICBCZXN0IEkgY2FuIGRvIGlzIHNlbmQgaXQgYSBzaWdraWxsLgotCQkgKiBwZXJoYXBzIGl0IHNob3VsZCBiZSBwdXQgaW4gdGhlIHN0YXR1cyB0aGF0IGl0IHdhbnRzIHRvCi0JCSAqIGV4aXQuCi0JCSAqLwotCWNhc2UgUFRSQUNFX0tJTEw6Ci0JCXJldCA9IDA7Ci0JCWlmIChjaGlsZC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkJLyogYWxyZWFkeSBkZWFkICovCi0JCQlicmVhazsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IFNJR0tJTEw7Ci0JCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NJTkdMRVNURVApOwotCQlwdHJhY2VfZGlzYWJsZShjaGlsZCk7Ci0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCWJyZWFrOworCWNhc2UgUFRSQUNFX1NFVFJFR1M6CS8qIFNldCBhbGwgaW50ZWdlciByZWdzIGluIHRoZSBjaGlsZC4gKi8KKwkJcmV0dXJuIGNvcHlfcmVnc2V0X2Zyb21fdXNlcihjaGlsZCwgJnVzZXJfZnJ2X25hdGl2ZV92aWV3LAorCQkJCQkgICAgIFJFR1NFVF9HRU5FUkFMLAorCQkJCQkgICAgIDAsIHNpemVvZihjaGlsZC0+dGhyZWFkLnVzZXItPmkpLAorCQkJCQkgICAgIChjb25zdCB2b2lkIF9fdXNlciAqKWRhdGEpOwogCi0JY2FzZSBQVFJBQ0VfU0lOR0xFU1RFUDogIC8qIHNldCB0aGUgdHJhcCBmbGFnLiAqLwotCQlyZXQgPSAtRUlPOwotCQlpZiAoIXZhbGlkX3NpZ25hbChkYXRhKSkKLQkJCWJyZWFrOwotCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQkJcHRyYWNlX2VuYWJsZShjaGlsZCk7Ci0JCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwotCQl3YWtlX3VwX3Byb2Nlc3MoY2hpbGQpOwotCQlyZXQgPSAwOwotCQlicmVhazsKKwljYXNlIFBUUkFDRV9HRVRGUFJFR1M6CS8qIEdldCB0aGUgY2hpbGQgRlAvTWVkaWEgc3RhdGUuICovCisJCXJldHVybiBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCAmdXNlcl9mcnZfbmF0aXZlX3ZpZXcsCisJCQkJCSAgIFJFR1NFVF9GUE1FRElBLAorCQkJCQkgICAwLCBzaXplb2YoY2hpbGQtPnRocmVhZC51c2VyLT5mKSwKKwkJCQkJICAgKHZvaWQgX191c2VyICopZGF0YSk7CiAKLQljYXNlIFBUUkFDRV9ERVRBQ0g6CS8qIGRldGFjaCBhIHByb2Nlc3MgdGhhdCB3YXMgYXR0YWNoZWQuICovCi0JCXJldCA9IHB0cmFjZV9kZXRhY2goY2hpbGQsIGRhdGEpOwotCQlicmVhazsKLQotCWNhc2UgUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IGFsbCBpbnRlZ2VyIHJlZ3MgZnJvbSB0aGUgY2hpbGQuICovCi0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgUFRfX0dQRU5EOyBpKyspIHsKLQkJCXRtcCA9IGdldF9yZWcoY2hpbGQsIGkpOwotCQkJaWYgKHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSkpIHsKLQkJCQlyZXQgPSAtRUZBVUxUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGF0YSArPSBzaXplb2YobG9uZyk7Ci0JCX0KLQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBQVFJBQ0VfU0VUUkVHUzogeyAvKiBTZXQgYWxsIGludGVnZXIgcmVncyBpbiB0aGUgY2hpbGQuICovCi0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgUFRfX0dQRU5EOyBpKyspIHsKLQkJCWlmIChnZXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpKSB7Ci0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXB1dF9yZWcoY2hpbGQsIGksIHRtcCk7Ci0JCQlkYXRhICs9IHNpemVvZihsb25nKTsKLQkJfQotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9HRVRGUFJFR1M6IHsgLyogR2V0IHRoZSBjaGlsZCBGUC9NZWRpYSBzdGF0ZS4gKi8KLQkJcmV0ID0gMDsKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBkYXRhLAotCQkJCSAmY2hpbGQtPnRocmVhZC51c2VyLT5mLAotCQkJCSBzaXplb2YoY2hpbGQtPnRocmVhZC51c2VyLT5mKSkpCi0JCQlyZXQgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IHsgLyogU2V0IHRoZSBjaGlsZCBGUC9NZWRpYSBzdGF0ZS4gKi8KLQkJcmV0ID0gMDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjaGlsZC0+dGhyZWFkLnVzZXItPmYsCi0JCQkJICAgKHZvaWQgKikgZGF0YSwKLQkJCQkgICBzaXplb2YoY2hpbGQtPnRocmVhZC51c2VyLT5mKSkpCi0JCQlyZXQgPSAtRUZBVUxUOwotCQlicmVhazsKLQl9CisJY2FzZSBQVFJBQ0VfU0VURlBSRUdTOgkvKiBTZXQgdGhlIGNoaWxkIEZQL01lZGlhIHN0YXRlLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCAmdXNlcl9mcnZfbmF0aXZlX3ZpZXcsCisJCQkJCSAgICAgUkVHU0VUX0ZQTUVESUEsCisJCQkJCSAgICAgMCwgc2l6ZW9mKGNoaWxkLT50aHJlYWQudXNlci0+ZiksCisJCQkJCSAgICAgKGNvbnN0IHZvaWQgX191c2VyICopZGF0YSk7CiAKIAljYXNlIFBUUkFDRV9HRVRGRFBJQzoKIAkJdG1wID0gMDsKQEAgLTMwMCw0MTQgKzM2NSwzNiBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU87CisJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLWludCBfX25vbmdwcmVsYnNzIGtzdHJhY2U7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCWNvbnN0IGNoYXIJKm5hbWU7Ci0JdW5zaWduZWQJYXJnbWFzazsKLX0gX19zeXNjYWxsX25hbWVfdGFibGVbTlJfc3lzY2FsbHNdID0gewotCVswXQk9IHsgInJlc3RhcnRfc3lzY2FsbCIJCQl9LAotCVsxXQk9IHsgImV4aXQiLAkJMHgwMDAwMDEJfSwKLQlbMl0JPSB7ICJmb3JrIiwJCTB4ZmZmZmZmCX0sCi0JWzNdCT0geyAicmVhZCIsCQkweDAwMDE0MQl9LAotCVs0XQk9IHsgIndyaXRlIiwJCTB4MDAwMTQxCX0sCi0JWzVdCT0geyAib3BlbiIsCQkweDAwMDIzNQl9LAotCVs2XQk9IHsgImNsb3NlIiwJCTB4MDAwMDAxCX0sCi0JWzddCT0geyAid2FpdHBpZCIsCQkweDAwMDE0MQl9LAotCVs4XQk9IHsgImNyZWF0IiwJCTB4MDAwMDI1CX0sCi0JWzldCT0geyAibGluayIsCQkweDAwMDA1NQl9LAotCVsxMF0JPSB7ICJ1bmxpbmsiLAkJMHgwMDAwMDUJfSwKLQlbMTFdCT0geyAiZXhlY3ZlIiwJCTB4MDAwNDQ1CX0sCi0JWzEyXQk9IHsgImNoZGlyIiwJCTB4MDAwMDA1CX0sCi0JWzEzXQk9IHsgInRpbWUiLAkJMHgwMDAwMDQJfSwKLQlbMTRdCT0geyAibWtub2QiLAkJMHgwMDAzMjUJfSwKLQlbMTVdCT0geyAiY2htb2QiLAkJMHgwMDAwMjUJfSwKLQlbMTZdCT0geyAibGNob3duIiwJCTB4MDAwMDI1CX0sCi0JWzE3XQk9IHsgImJyZWFrIiB9LAotCVsxOF0JPSB7ICJvbGRzdGF0IiwJCTB4MDAwMDQ1CX0sCi0JWzE5XQk9IHsgImxzZWVrIiwJCTB4MDAwMTMxCX0sCi0JWzIwXQk9IHsgImdldHBpZCIsCQkweGZmZmZmZgl9LAotCVsyMV0JPSB7ICJtb3VudCIsCQkweDA0MzU1NQl9LAotCVsyMl0JPSB7ICJ1bW91bnQiLAkJMHgwMDAwMDUJfSwKLQlbMjNdCT0geyAic2V0dWlkIiwJCTB4MDAwMDAxCX0sCi0JWzI0XQk9IHsgImdldHVpZCIsCQkweGZmZmZmZgl9LAotCVsyNV0JPSB7ICJzdGltZSIsCQkweDAwMDAwNAl9LAotCVsyNl0JPSB7ICJwdHJhY2UiLAkJMHgwMDQ0MTMJfSwKLQlbMjddCT0geyAiYWxhcm0iLAkJMHgwMDAwMDEJfSwKLQlbMjhdCT0geyAib2xkZnN0YXQiLAkJMHgwMDAwNDEJfSwKLQlbMjldCT0geyAicGF1c2UiLAkJMHhmZmZmZmYJfSwKLQlbMzBdCT0geyAidXRpbWUiLAkJMHgwMDAwNDUJfSwKLQlbMzFdCT0geyAic3R0eSIgfSwKLQlbMzJdCT0geyAiZ3R0eSIgfSwKLQlbMzNdCT0geyAiYWNjZXNzIiwJCTB4MDAwMDI1CX0sCi0JWzM0XQk9IHsgIm5pY2UiLAkJMHgwMDAwMDEJfSwKLQlbMzVdCT0geyAiZnRpbWUiIH0sCi0JWzM2XQk9IHsgInN5bmMiLAkJMHhmZmZmZmYJfSwKLQlbMzddCT0geyAia2lsbCIsCQkweDAwMDAxMQl9LAotCVszOF0JPSB7ICJyZW5hbWUiLAkJMHgwMDAwNTUJfSwKLQlbMzldCT0geyAibWtkaXIiLAkJMHgwMDAwMjUJfSwKLQlbNDBdCT0geyAicm1kaXIiLAkJMHgwMDAwMDUJfSwKLQlbNDFdCT0geyAiZHVwIiwJCTB4MDAwMDAxCX0sCi0JWzQyXQk9IHsgInBpcGUiLAkJMHgwMDAwMDQJfSwKLQlbNDNdCT0geyAidGltZXMiLAkJMHgwMDAwMDQJfSwKLQlbNDRdCT0geyAicHJvZiIgfSwKLQlbNDVdCT0geyAiYnJrIiwJCTB4MDAwMDA0CX0sCi0JWzQ2XQk9IHsgInNldGdpZCIsCQkweDAwMDAwMQl9LAotCVs0N10JPSB7ICJnZXRnaWQiLAkJMHhmZmZmZmYJfSwKLQlbNDhdCT0geyAic2lnbmFsIiwJCTB4MDAwMDQxCX0sCi0JWzQ5XQk9IHsgImdldGV1aWQiLAkJMHhmZmZmZmYJfSwKLQlbNTBdCT0geyAiZ2V0ZWdpZCIsCQkweGZmZmZmZgl9LAotCVs1MV0JPSB7ICJhY2N0IiwJCTB4MDAwMDA1CX0sCi0JWzUyXQk9IHsgInVtb3VudDIiLAkJMHgwMDAwMzUJfSwKLQlbNTNdCT0geyAibG9jayIgfSwKLQlbNTRdCT0geyAiaW9jdGwiLAkJMHgwMDAzMzEJfSwKLQlbNTVdCT0geyAiZmNudGwiLAkJMHgwMDAzMzEJfSwKLQlbNTZdCT0geyAibXB4IiB9LAotCVs1N10JPSB7ICJzZXRwZ2lkIiwJCTB4MDAwMDExCX0sCi0JWzU4XQk9IHsgInVsaW1pdCIgfSwKLQlbNjBdCT0geyAidW1hc2siLAkJMHgwMDAwMDIJfSwKLQlbNjFdCT0geyAiY2hyb290IiwJCTB4MDAwMDA1CX0sCi0JWzYyXQk9IHsgInVzdGF0IiwJCTB4MDAwMDQzCX0sCi0JWzYzXQk9IHsgImR1cDIiLAkJMHgwMDAwMTEJfSwKLQlbNjRdCT0geyAiZ2V0cHBpZCIsCQkweGZmZmZmZgl9LAotCVs2NV0JPSB7ICJnZXRwZ3JwIiwJCTB4ZmZmZmZmCX0sCi0JWzY2XQk9IHsgInNldHNpZCIsCQkweGZmZmZmZgl9LAotCVs2N10JPSB7ICJzaWdhY3Rpb24iIH0sCi0JWzY4XQk9IHsgInNnZXRtYXNrIiB9LAotCVs2OV0JPSB7ICJzc2V0bWFzayIgfSwKLQlbNzBdCT0geyAic2V0cmV1aWQiIH0sCi0JWzcxXQk9IHsgInNldHJlZ2lkIiB9LAotCVs3Ml0JPSB7ICJzaWdzdXNwZW5kIiB9LAotCVs3M10JPSB7ICJzaWdwZW5kaW5nIiB9LAotCVs3NF0JPSB7ICJzZXRob3N0bmFtZSIgfSwKLQlbNzVdCT0geyAic2V0cmxpbWl0IiB9LAotCVs3Nl0JPSB7ICJnZXRybGltaXQiIH0sCi0JWzc3XQk9IHsgImdldHJ1c2FnZSIgfSwKLQlbNzhdCT0geyAiZ2V0dGltZW9mZGF5IiB9LAotCVs3OV0JPSB7ICJzZXR0aW1lb2ZkYXkiIH0sCi0JWzgwXQk9IHsgImdldGdyb3VwcyIgfSwKLQlbODFdCT0geyAic2V0Z3JvdXBzIiB9LAotCVs4Ml0JPSB7ICJzZWxlY3QiIH0sCi0JWzgzXQk9IHsgInN5bWxpbmsiIH0sCi0JWzg0XQk9IHsgIm9sZGxzdGF0IiB9LAotCVs4NV0JPSB7ICJyZWFkbGluayIgfSwKLQlbODZdCT0geyAidXNlbGliIiB9LAotCVs4N10JPSB7ICJzd2Fwb24iIH0sCi0JWzg4XQk9IHsgInJlYm9vdCIgfSwKLQlbODldCT0geyAicmVhZGRpciIgfSwKLQlbOTFdCT0geyAibXVubWFwIiwJCTB4MDAwMDM0CX0sCi0JWzkyXQk9IHsgInRydW5jYXRlIiB9LAotCVs5M10JPSB7ICJmdHJ1bmNhdGUiIH0sCi0JWzk0XQk9IHsgImZjaG1vZCIgfSwKLQlbOTVdCT0geyAiZmNob3duIiB9LAotCVs5Nl0JPSB7ICJnZXRwcmlvcml0eSIgfSwKLQlbOTddCT0geyAic2V0cHJpb3JpdHkiIH0sCi0JWzk5XQk9IHsgInN0YXRmcyIgfSwKLQlbMTAwXQk9IHsgImZzdGF0ZnMiIH0sCi0JWzEwMl0JPSB7ICJzb2NrZXRjYWxsIiB9LAotCVsxMDNdCT0geyAic3lzbG9nIiB9LAotCVsxMDRdCT0geyAic2V0aXRpbWVyIiB9LAotCVsxMDVdCT0geyAiZ2V0aXRpbWVyIiB9LAotCVsxMDZdCT0geyAic3RhdCIgfSwKLQlbMTA3XQk9IHsgImxzdGF0IiB9LAotCVsxMDhdCT0geyAiZnN0YXQiIH0sCi0JWzExMV0JPSB7ICJ2aGFuZ3VwIiB9LAotCVsxMTRdCT0geyAid2FpdDQiIH0sCi0JWzExNV0JPSB7ICJzd2Fwb2ZmIiB9LAotCVsxMTZdCT0geyAic3lzaW5mbyIgfSwKLQlbMTE3XQk9IHsgImlwYyIgfSwKLQlbMTE4XQk9IHsgImZzeW5jIiB9LAotCVsxMTldCT0geyAic2lncmV0dXJuIiB9LAotCVsxMjBdCT0geyAiY2xvbmUiIH0sCi0JWzEyMV0JPSB7ICJzZXRkb21haW5uYW1lIiB9LAotCVsxMjJdCT0geyAidW5hbWUiIH0sCi0JWzEyM10JPSB7ICJtb2RpZnlfbGR0IiB9LAotCVsxMjNdCT0geyAiY2FjaGVmbHVzaCIgfSwKLQlbMTI0XQk9IHsgImFkanRpbWV4IiB9LAotCVsxMjVdCT0geyAibXByb3RlY3QiIH0sCi0JWzEyNl0JPSB7ICJzaWdwcm9jbWFzayIgfSwKLQlbMTI3XQk9IHsgImNyZWF0ZV9tb2R1bGUiIH0sCi0JWzEyOF0JPSB7ICJpbml0X21vZHVsZSIgfSwKLQlbMTI5XQk9IHsgImRlbGV0ZV9tb2R1bGUiIH0sCi0JWzEzMF0JPSB7ICJnZXRfa2VybmVsX3N5bXMiIH0sCi0JWzEzMV0JPSB7ICJxdW90YWN0bCIgfSwKLQlbMTMyXQk9IHsgImdldHBnaWQiIH0sCi0JWzEzM10JPSB7ICJmY2hkaXIiIH0sCi0JWzEzNF0JPSB7ICJiZGZsdXNoIiB9LAotCVsxMzVdCT0geyAic3lzZnMiIH0sCi0JWzEzNl0JPSB7ICJwZXJzb25hbGl0eSIgfSwKLQlbMTM3XQk9IHsgImFmc19zeXNjYWxsIiB9LAotCVsxMzhdCT0geyAic2V0ZnN1aWQiIH0sCi0JWzEzOV0JPSB7ICJzZXRmc2dpZCIgfSwKLQlbMTQwXQk9IHsgIl9sbHNlZWsiLAkJCTB4MDE0MzMxCX0sCi0JWzE0MV0JPSB7ICJnZXRkZW50cyIgfSwKLQlbMTQyXQk9IHsgIl9uZXdzZWxlY3QiLAkJMHgwMDAxNDEJfSwKLQlbMTQzXQk9IHsgImZsb2NrIiB9LAotCVsxNDRdCT0geyAibXN5bmMiIH0sCi0JWzE0NV0JPSB7ICJyZWFkdiIgfSwKLQlbMTQ2XQk9IHsgIndyaXRldiIgfSwKLQlbMTQ3XQk9IHsgImdldHNpZCIsCQkJMHgwMDAwMDEJfSwKLQlbMTQ4XQk9IHsgImZkYXRhc3luYyIsCQkweDAwMDAwMQl9LAotCVsxNDldCT0geyAiX3N5c2N0bCIsCQkJMHgwMDAwMDQJfSwKLQlbMTUwXQk9IHsgIm1sb2NrIiB9LAotCVsxNTFdCT0geyAibXVubG9jayIgfSwKLQlbMTUyXQk9IHsgIm1sb2NrYWxsIiB9LAotCVsxNTNdCT0geyAibXVubG9ja2FsbCIgfSwKLQlbMTU0XQk9IHsgInNjaGVkX3NldHBhcmFtIiB9LAotCVsxNTVdCT0geyAic2NoZWRfZ2V0cGFyYW0iIH0sCi0JWzE1Nl0JPSB7ICJzY2hlZF9zZXRzY2hlZHVsZXIiIH0sCi0JWzE1N10JPSB7ICJzY2hlZF9nZXRzY2hlZHVsZXIiIH0sCi0JWzE1OF0JPSB7ICJzY2hlZF95aWVsZCIgfSwKLQlbMTU5XQk9IHsgInNjaGVkX2dldF9wcmlvcml0eV9tYXgiIH0sCi0JWzE2MF0JPSB7ICJzY2hlZF9nZXRfcHJpb3JpdHlfbWluIiB9LAotCVsxNjFdCT0geyAic2NoZWRfcnJfZ2V0X2ludGVydmFsIiB9LAotCVsxNjJdCT0geyAibmFub3NsZWVwIiwJCTB4MDAwMDQ0CX0sCi0JWzE2M10JPSB7ICJtcmVtYXAiIH0sCi0JWzE2NF0JPSB7ICJzZXRyZXN1aWQiIH0sCi0JWzE2NV0JPSB7ICJnZXRyZXN1aWQiIH0sCi0JWzE2Nl0JPSB7ICJ2bTg2IiB9LAotCVsxNjddCT0geyAicXVlcnlfbW9kdWxlIiB9LAotCVsxNjhdCT0geyAicG9sbCIgfSwKLQlbMTY5XQk9IHsgIm5mc3NlcnZjdGwiIH0sCi0JWzE3MF0JPSB7ICJzZXRyZXNnaWQiIH0sCi0JWzE3MV0JPSB7ICJnZXRyZXNnaWQiIH0sCi0JWzE3Ml0JPSB7ICJwcmN0bCIsCQkJMHgzMzMzMzEJfSwKLQlbMTczXQk9IHsgInJ0X3NpZ3JldHVybiIsCQkweGZmZmZmZgl9LAotCVsxNzRdCT0geyAicnRfc2lnYWN0aW9uIiwJCTB4MDAxNDQxCX0sCi0JWzE3NV0JPSB7ICJydF9zaWdwcm9jbWFzayIsCQkweDAwMTQ0MQl9LAotCVsxNzZdCT0geyAicnRfc2lncGVuZGluZyIsCQkweDAwMDAxNAl9LAotCVsxNzddCT0geyAicnRfc2lndGltZWR3YWl0IiwJCTB4MDAxNDQ0CX0sCi0JWzE3OF0JPSB7ICJydF9zaWdxdWV1ZWluZm8iLAkJMHgwMDA0MTEJfSwKLQlbMTc5XQk9IHsgInJ0X3NpZ3N1c3BlbmQiLAkJMHgwMDAwMTQJfSwKLQlbMTgwXQk9IHsgInByZWFkIiwJCQkweDAwMzM0MQl9LAotCVsxODFdCT0geyAicHdyaXRlIiwJCQkweDAwMzM0MQl9LAotCVsxODJdCT0geyAiY2hvd24iLAkJCTB4MDAwMTE1CX0sCi0JWzE4M10JPSB7ICJnZXRjd2QiIH0sCi0JWzE4NF0JPSB7ICJjYXBnZXQiIH0sCi0JWzE4NV0JPSB7ICJjYXBzZXQiIH0sCi0JWzE4Nl0JPSB7ICJzaWdhbHRzdGFjayIgfSwKLQlbMTg3XQk9IHsgInNlbmRmaWxlIiB9LAotCVsxODhdCT0geyAiZ2V0cG1zZyIgfSwKLQlbMTg5XQk9IHsgInB1dHBtc2ciIH0sCi0JWzE5MF0JPSB7ICJ2Zm9yayIsCQkJMHhmZmZmZmYJfSwKLQlbMTkxXQk9IHsgInVnZXRybGltaXQiIH0sCi0JWzE5Ml0JPSB7ICJtbWFwMiIsCQkJMHgzMTMzMTQJfSwKLQlbMTkzXQk9IHsgInRydW5jYXRlNjQiIH0sCi0JWzE5NF0JPSB7ICJmdHJ1bmNhdGU2NCIgfSwKLQlbMTk1XQk9IHsgInN0YXQ2NCIsCQkJMHgwMDAwNDUJfSwKLQlbMTk2XQk9IHsgImxzdGF0NjQiLAkJCTB4MDAwMDQ1CX0sCi0JWzE5N10JPSB7ICJmc3RhdDY0IiwJCQkweDAwMDA0MQl9LAotCVsxOThdCT0geyAibGNob3duMzIiIH0sCi0JWzE5OV0JPSB7ICJnZXR1aWQzMiIsCQkJMHhmZmZmZmYJfSwKLQlbMjAwXQk9IHsgImdldGdpZDMyIiwJCQkweGZmZmZmZgl9LAotCVsyMDFdCT0geyAiZ2V0ZXVpZDMyIiwJCTB4ZmZmZmZmCX0sCi0JWzIwMl0JPSB7ICJnZXRlZ2lkMzIiLAkJMHhmZmZmZmYJfSwKLQlbMjAzXQk9IHsgInNldHJldWlkMzIiIH0sCi0JWzIwNF0JPSB7ICJzZXRyZWdpZDMyIiB9LAotCVsyMDVdCT0geyAiZ2V0Z3JvdXBzMzIiIH0sCi0JWzIwNl0JPSB7ICJzZXRncm91cHMzMiIgfSwKLQlbMjA3XQk9IHsgImZjaG93bjMyIiB9LAotCVsyMDhdCT0geyAic2V0cmVzdWlkMzIiIH0sCi0JWzIwOV0JPSB7ICJnZXRyZXN1aWQzMiIgfSwKLQlbMjEwXQk9IHsgInNldHJlc2dpZDMyIiB9LAotCVsyMTFdCT0geyAiZ2V0cmVzZ2lkMzIiIH0sCi0JWzIxMl0JPSB7ICJjaG93bjMyIiB9LAotCVsyMTNdCT0geyAic2V0dWlkMzIiIH0sCi0JWzIxNF0JPSB7ICJzZXRnaWQzMiIgfSwKLQlbMjE1XQk9IHsgInNldGZzdWlkMzIiIH0sCi0JWzIxNl0JPSB7ICJzZXRmc2dpZDMyIiB9LAotCVsyMTddCT0geyAicGl2b3Rfcm9vdCIgfSwKLQlbMjE4XQk9IHsgIm1pbmNvcmUiIH0sCi0JWzIxOV0JPSB7ICJtYWR2aXNlIiB9LAotCVsyMjBdCT0geyAiZ2V0ZGVudHM2NCIgfSwKLQlbMjIxXQk9IHsgImZjbnRsNjQiIH0sCi0JWzIyM10JPSB7ICJzZWN1cml0eSIgfSwKLQlbMjI0XQk9IHsgImdldHRpZCIgfSwKLQlbMjI1XQk9IHsgInJlYWRhaGVhZCIgfSwKLQlbMjI2XQk9IHsgInNldHhhdHRyIiB9LAotCVsyMjddCT0geyAibHNldHhhdHRyIiB9LAotCVsyMjhdCT0geyAiZnNldHhhdHRyIiB9LAotCVsyMjldCT0geyAiZ2V0eGF0dHIiIH0sCi0JWzIzMF0JPSB7ICJsZ2V0eGF0dHIiIH0sCi0JWzIzMV0JPSB7ICJmZ2V0eGF0dHIiIH0sCi0JWzIzMl0JPSB7ICJsaXN0eGF0dHIiIH0sCi0JWzIzM10JPSB7ICJsbGlzdHhhdHRyIiB9LAotCVsyMzRdCT0geyAiZmxpc3R4YXR0ciIgfSwKLQlbMjM1XQk9IHsgInJlbW92ZXhhdHRyIiB9LAotCVsyMzZdCT0geyAibHJlbW92ZXhhdHRyIiB9LAotCVsyMzddCT0geyAiZnJlbW92ZXhhdHRyIiB9LAotCVsyMzhdCT0geyAidGtpbGwiIH0sCi0JWzIzOV0JPSB7ICJzZW5kZmlsZTY0IiB9LAotCVsyNDBdCT0geyAiZnV0ZXgiIH0sCi0JWzI0MV0JPSB7ICJzY2hlZF9zZXRhZmZpbml0eSIgfSwKLQlbMjQyXQk9IHsgInNjaGVkX2dldGFmZmluaXR5IiB9LAotCVsyNDNdCT0geyAic2V0X3RocmVhZF9hcmVhIiB9LAotCVsyNDRdCT0geyAiZ2V0X3RocmVhZF9hcmVhIiB9LAotCVsyNDVdCT0geyAiaW9fc2V0dXAiIH0sCi0JWzI0Nl0JPSB7ICJpb19kZXN0cm95IiB9LAotCVsyNDddCT0geyAiaW9fZ2V0ZXZlbnRzIiB9LAotCVsyNDhdCT0geyAiaW9fc3VibWl0IiB9LAotCVsyNDldCT0geyAiaW9fY2FuY2VsIiB9LAotCVsyNTBdCT0geyAiZmFkdmlzZTY0IiB9LAotCVsyNTJdCT0geyAiZXhpdF9ncm91cCIsCQkweDAwMDAwMQl9LAotCVsyNTNdCT0geyAibG9va3VwX2Rjb29raWUiIH0sCi0JWzI1NF0JPSB7ICJlcG9sbF9jcmVhdGUiIH0sCi0JWzI1NV0JPSB7ICJlcG9sbF9jdGwiIH0sCi0JWzI1Nl0JPSB7ICJlcG9sbF93YWl0IiB9LAotCVsyNTddCT0geyAicmVtYXBfZmlsZV9wYWdlcyIgfSwKLQlbMjU4XQk9IHsgInNldF90aWRfYWRkcmVzcyIgfSwKLQlbMjU5XQk9IHsgInRpbWVyX2NyZWF0ZSIgfSwKLQlbMjYwXQk9IHsgInRpbWVyX3NldHRpbWUiIH0sCi0JWzI2MV0JPSB7ICJ0aW1lcl9nZXR0aW1lIiB9LAotCVsyNjJdCT0geyAidGltZXJfZ2V0b3ZlcnJ1biIgfSwKLQlbMjYzXQk9IHsgInRpbWVyX2RlbGV0ZSIgfSwKLQlbMjY0XQk9IHsgImNsb2NrX3NldHRpbWUiIH0sCi0JWzI2NV0JPSB7ICJjbG9ja19nZXR0aW1lIiB9LAotCVsyNjZdCT0geyAiY2xvY2tfZ2V0cmVzIiB9LAotCVsyNjddCT0geyAiY2xvY2tfbmFub3NsZWVwIiB9LAotCVsyNjhdCT0geyAic3RhdGZzNjQiIH0sCi0JWzI2OV0JPSB7ICJmc3RhdGZzNjQiIH0sCi0JWzI3MF0JPSB7ICJ0Z2tpbGwiIH0sCi0JWzI3MV0JPSB7ICJ1dGltZXMiIH0sCi0JWzI3Ml0JPSB7ICJmYWR2aXNlNjRfNjQiIH0sCi0JWzI3M10JPSB7ICJ2c2VydmVyIiB9LAotCVsyNzRdCT0geyAibWJpbmQiIH0sCi0JWzI3NV0JPSB7ICJnZXRfbWVtcG9saWN5IiB9LAotCVsyNzZdCT0geyAic2V0X21lbXBvbGljeSIgfSwKLQlbMjc3XQk9IHsgIm1xX29wZW4iIH0sCi0JWzI3OF0JPSB7ICJtcV91bmxpbmsiIH0sCi0JWzI3OV0JPSB7ICJtcV90aW1lZHNlbmQiIH0sCi0JWzI4MF0JPSB7ICJtcV90aW1lZHJlY2VpdmUiIH0sCi0JWzI4MV0JPSB7ICJtcV9ub3RpZnkiIH0sCi0JWzI4Ml0JPSB7ICJtcV9nZXRzZXRhdHRyIiB9LAotCVsyODNdCT0geyAic3lzX2tleGVjX2xvYWQiIH0sCi19OwotCi1hc21saW5rYWdlIHZvaWQgZG9fc3lzY2FsbF90cmFjZShpbnQgbGVhdmluZykKKy8qCisgKiBoYW5kbGUgdHJhY2luZyBvZiBzeXN0ZW0gY2FsbCBlbnRyeQorICogLSByZXR1cm4gdGhlIHJldmlzZWQgc3lzdGVtIGNhbGwgbnVtYmVyIG9yIFVMT05HX01BWCB0byBjYXVzZSBFTk9TWVMKKyAqLworYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c2NhbGxfdHJhY2VfZW50cnkodm9pZCkKIHsKLSNpZiAwCi0JdW5zaWduZWQgbG9uZyAqYXJncDsKLQljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGFyZ21hc2s7Ci0JY2hhciBidWZmZXJbMTZdOwotCi0JaWYgKCFrc3RyYWNlKQotCQlyZXR1cm47Ci0KLQlpZiAoIWN1cnJlbnQtPm1tKQotCQlyZXR1cm47Ci0KLQlpZiAoX19mcmFtZS0+Z3I3ID09IF9fTlJfY2xvc2UpCi0JCXJldHVybjsKLQotI2lmIDAKLQlpZiAoX19mcmFtZS0+Z3I3ICE9IF9fTlJfbW1hcDIgJiYKLQkgICAgX19mcmFtZS0+Z3I3ICE9IF9fTlJfdmZvcmsgJiYKLQkgICAgX19mcmFtZS0+Z3I3ICE9IF9fTlJfZXhlY3ZlICYmCi0JICAgIF9fZnJhbWUtPmdyNyAhPSBfX05SX2V4aXQpCi0JCXJldHVybjsKLSNlbmRpZgotCi0JYXJnbWFzayA9IDA7Ci0JbmFtZSA9IE5VTEw7Ci0JaWYgKF9fZnJhbWUtPmdyNyA8IE5SX3N5c2NhbGxzKSB7Ci0JCW5hbWUgPSBfX3N5c2NhbGxfbmFtZV90YWJsZVtfX2ZyYW1lLT5ncjddLm5hbWU7Ci0JCWFyZ21hc2sgPSBfX3N5c2NhbGxfbmFtZV90YWJsZVtfX2ZyYW1lLT5ncjddLmFyZ21hc2s7Ci0JfQotCWlmICghbmFtZSkgewotCQlzcHJpbnRmKGJ1ZmZlciwgInN5c18lbHgiLCBfX2ZyYW1lLT5ncjcpOwotCQluYW1lID0gYnVmZmVyOworCV9fZnJhbWUtPl9fc3RhdHVzIHw9IFJFR19fU1RBVFVTX1NZU0NfRU5UUlk7CisJaWYgKHRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9lbnRyeShfX2ZyYW1lKSkgeworCQkvKiB0cmFjaW5nIGRlY2lkZWQgdGhpcyBzeXNjYWxsIHNob3VsZCBub3QgaGFwcGVuLCBzbworCQkgKiBXZSdsbCByZXR1cm4gYSBib2d1cyBjYWxsIG51bWJlciB0byBnZXQgYW4gRU5PU1lTCisJCSAqIGVycm9yLCBidXQgbGVhdmUgdGhlIG9yaWdpbmFsIG51bWJlciBpbgorCQkgKiBfX2ZyYW1lLT5zeXNjYWxsbm8KKwkJICovCisJCXJldHVybiBVTE9OR19NQVg7CiAJfQogCi0JaWYgKCFsZWF2aW5nKSB7Ci0JCWlmICghYXJnbWFzaykgewotCQkJcHJpbnRrKEtFUk5fQ1JJVCAiWyVkXSAlcyglbHgsJWx4LCVseCwlbHgsJWx4LCVseClcbiIsCi0JCQkgICAgICAgY3VycmVudC0+cGlkLAotCQkJICAgICAgIG5hbWUsCi0JCQkgICAgICAgX19mcmFtZS0+Z3I4LAotCQkJICAgICAgIF9fZnJhbWUtPmdyOSwKLQkJCSAgICAgICBfX2ZyYW1lLT5ncjEwLAotCQkJICAgICAgIF9fZnJhbWUtPmdyMTEsCi0JCQkgICAgICAgX19mcmFtZS0+Z3IxMiwKLQkJCSAgICAgICBfX2ZyYW1lLT5ncjEzKTsKLQkJfQotCQllbHNlIGlmIChhcmdtYXNrID09IDB4ZmZmZmZmKSB7Ci0JCQlwcmludGsoS0VSTl9DUklUICJbJWRdICVzKClcbiIsCi0JCQkgICAgICAgY3VycmVudC0+cGlkLAotCQkJICAgICAgIG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJcHJpbnRrKEtFUk5fQ1JJVCAiWyVkXSAlcygiLAotCQkJICAgICAgIGN1cnJlbnQtPnBpZCwKLQkJCSAgICAgICBuYW1lKTsKKwlyZXR1cm4gX19mcmFtZS0+c3lzY2FsbG5vOworfQogCi0JCQlhcmdwID0gJl9fZnJhbWUtPmdyODsKLQotCQkJZG8gewotCQkJCXN3aXRjaCAoYXJnbWFzayAmIDB4ZikgewotCQkJCWNhc2UgMToKLQkJCQkJcHJpbnRrKCIlbGQiLCAobG9uZykgKmFyZ3ApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCXByaW50aygiJWxvIiwgKmFyZ3ApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCXByaW50aygiJWx4IiwgKmFyZ3ApOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6Ci0JCQkJCXByaW50aygiJXAiLCAodm9pZCAqKSAqYXJncCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNToKLQkJCQkJcHJpbnRrKCJcIiVzXCIiLCAoY2hhciAqKSAqYXJncCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWFyZ3ArKzsKLQkJCQlhcmdtYXNrID4+PSA0OwotCQkJCWlmIChhcmdtYXNrKQotCQkJCQlwcmludGsoIiwiKTsKLQotCQkJfSB3aGlsZSAoYXJnbWFzayk7Ci0KLQkJCXByaW50aygiKVxuIik7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCWlmICgoaW50KV9fZnJhbWUtPmdyOCA+IC00MDk2ICYmIChpbnQpX19mcmFtZS0+Z3I4IDwgNDA5NikKLQkJCXByaW50ayhLRVJOX0NSSVQgIlslZF0gJXMoKSA9ICVsZFxuIiwgY3VycmVudC0+cGlkLCBuYW1lLCBfX2ZyYW1lLT5ncjgpOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9DUklUICJbJWRdICVzKCkgPSAlbHhcbiIsIGN1cnJlbnQtPnBpZCwgbmFtZSwgX19mcmFtZS0+Z3I4KTsKLQl9Ci0JcmV0dXJuOwotI2VuZGlmCi0KLQlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpKQotCQlyZXR1cm47Ci0KLQlpZiAoIShjdXJyZW50LT5wdHJhY2UgJiBQVF9QVFJBQ0VEKSkKLQkJcmV0dXJuOwotCi0JLyogd2UgbmVlZCB0byBpbmRpY2F0ZSBlbnRyeSBvciBleGl0IHRvIHN0cmFjZSAqLwotCWlmIChsZWF2aW5nKQotCQlfX2ZyYW1lLT5fX3N0YXR1cyB8PSBSRUdfX1NUQVRVU19TWVNDX0VYSVQ7Ci0JZWxzZQotCQlfX2ZyYW1lLT5fX3N0YXR1cyB8PSBSRUdfX1NUQVRVU19TWVNDX0VOVFJZOwotCi0JcHRyYWNlX25vdGlmeShTSUdUUkFQKTsKLQotCS8qCi0JICogdGhpcyBpc24ndCB0aGUgc2FtZSBhcyBjb250aW51aW5nIHdpdGggYSBzaWduYWwsIGJ1dCBpdCB3aWxsIGRvCi0JICogZm9yIG5vcm1hbCB1c2UuICBzdHJhY2Ugb25seSBjb250aW51ZXMgd2l0aCBhIHNpZ25hbCBpZiB0aGUKLQkgKiBzdG9wcGluZyBzaWduYWwgaXMgbm90IFNJR1RSQVAuICAtYnJsCi0JICovCi0JaWYgKGN1cnJlbnQtPmV4aXRfY29kZSkgewotCQlzZW5kX3NpZyhjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOwotCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOwotCX0KKy8qCisgKiBoYW5kbGUgdHJhY2luZyBvZiBzeXN0ZW0gY2FsbCBleGl0CisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlX2V4aXQodm9pZCkKK3sKKwlfX2ZyYW1lLT5fX3N0YXR1cyB8PSBSRUdfX1NUQVRVU19TWVNDX0VYSVQ7CisJdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2V4aXQoX19mcmFtZSwgMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggM2JkYjM2OC4uNGE3YTYyYyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTUxNiw2ICs1MTcsOSBAQAogCQkJICogY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZyAqLwogCQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCiAJCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisKKwkJCXRyYWNlaG9va19zaWduYWxfaGFuZGxlcihzaWduciwgJmluZm8sICZrYSwgX19mcmFtZSwKKwkJCQkJCSB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSk7CiAJCX0KIAogCQlyZXR1cm47CkBAIC01NjQsNCArNTY4LDEwIEBACiAJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgKF9USUZfU0lHUEVORElORyB8IF9USUZfUkVTVE9SRV9TSUdNQVNLKSkKIAkJZG9fc2lnbmFsKCk7CiAKKwkvKiBkZWFsIHdpdGggbm90aWZpY2F0aW9uIG9uIGFib3V0IHRvIHJlc3VtZSB1c2Vyc3BhY2UgZXhlY3V0aW9uICovCisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9OT1RJRllfUkVTVU1FKSB7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9OT1RJRllfUkVTVU1FKTsKKwkJdHJhY2Vob29rX25vdGlmeV9yZXN1bWUoX19mcmFtZSk7CisJfQorCiB9IC8qIGVuZCBkb19ub3RpZnlfcmVzdW1lKCkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC91YWNjZXNzLmMgYi9hcmNoL2Zydi9rZXJuZWwvdWFjY2Vzcy5jCmluZGV4IDlmYjc3MWEuLjM3NGY4OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC91YWNjZXNzLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3VhY2Nlc3MuYwpAQCAtMjMsOCArMjMsNyBAQAogCWNoYXIgKnAsIGNoOwogCWxvbmcgZXJyID0gLUVGQVVMVDsKIAotCWlmIChjb3VudCA8IDApCi0JCUJVRygpOworCUJVR19PTihjb3VudCA8IDApOwogCiAJcCA9IGRzdDsKIApAQCAtNzYsOCArNzUsNyBAQAogCWxvbmcgZXJyID0gMDsKIAljaGFyIGNoOwogCi0JaWYgKGNvdW50IDwgMCkKLQkJQlVHKCk7CisJQlVHX09OKGNvdW50IDwgMCk7CiAKICNpZm5kZWYgQ09ORklHX01NVQogCWlmICgodW5zaWduZWQgbG9uZykgc3JjIDwgbWVtb3J5X3N0YXJ0KQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1kbWEtbm9tbXUuYyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZG1hLW5vbW11LmMKaW5kZXggNTJmZjlhZS4uNGUxYmEwYiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1kbWEtbm9tbXUuYworKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWRtYS1ub21tdS5jCkBAIC0xMTYsOCArMTE2LDcgQEAKIGRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAogCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JaWYgKGRpcmVjdGlvbiA9PSBETUFfTk9ORSkKLSAgICAgICAgICAgICAgICBCVUcoKTsKKwlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKIAogCWZydl9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpIHB0ciwgKHVuc2lnbmVkIGxvbmcpIHB0ciArIHNpemUpOwogCkBAIC0xNTEsOCArMTUwLDcgQEAKIAkJZnJ2X2NhY2hlX3diYWNrX2ludihzZ19kbWFfYWRkcmVzcygmc2dbaV0pLAogCQkJCSAgICBzZ19kbWFfYWRkcmVzcygmc2dbaV0pICsgc2dfZG1hX2xlbigmc2dbaV0pKTsKIAotCWlmIChkaXJlY3Rpb24gPT0gRE1BX05PTkUpCi0gICAgICAgICAgICAgICAgQlVHKCk7CisJQlVHX09OKGRpcmVjdGlvbiA9PSBETUFfTk9ORSk7CiAKIAlyZXR1cm4gbmVudHM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWRtYS5jIGIvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1kbWEuYwppbmRleCAzZGRlZGViLi40NTk1NGYwIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWRtYS5jCisrKyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktZG1hLmMKQEAgLTQ4LDggKzQ4LDcgQEAKIGRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwdHIsIHNpemVfdCBzaXplLAogCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JaWYgKGRpcmVjdGlvbiA9PSBETUFfTk9ORSkKLSAgICAgICAgICAgICAgICBCVUcoKTsKKwlCVUdfT04oZGlyZWN0aW9uID09IERNQV9OT05FKTsKIAogCWZydl9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpIHB0ciwgKHVuc2lnbmVkIGxvbmcpIHB0ciArIHNpemUpOwogCkBAIC04MSw4ICs4MCw3IEBACiAJdm9pZCAqdmFkZHI7CiAJaW50IGk7CiAKLQlpZiAoZGlyZWN0aW9uID09IERNQV9OT05FKQotICAgICAgICAgICAgICAgIEJVRygpOworCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOwogCiAJZGFtcHIyID0gX19nZXRfREFNUFIoMik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vaHBzaW1faXJxLmMgYi9hcmNoL2lhNjQvaHAvc2ltL2hwc2ltX2lycS5jCmluZGV4IGNjMGEzMTguLmFjYjUwNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vaHBzaW1faXJxLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9ocHNpbV9pcnEuYwpAQCAtMjEsOSArMjEsMTAgQEAKIHsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGhwc2ltX3NldF9hZmZpbml0eV9ub29wKHVuc2lnbmVkIGludCBhLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYikKIHsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9ocF9zaW0gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IDQ1NDI2NTEuLjVmNDM2OTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0zNzEsNiArMzcxLDcgQEAKIAlpbnQgbGFzdF9ydW5fY3B1OwogCWludCB2bW1fdHJfc2xvdDsKIAlpbnQgdm1fdHJfc2xvdDsKKwlpbnQgc25fcnRjX3RyX3Nsb3Q7CiAKICNkZWZpbmUgS1ZNX01QX1NUQVRFX1JVTk5BQkxFICAgICAgICAgIDAKICNkZWZpbmUgS1ZNX01QX1NUQVRFX1VOSU5JVElBTElaRUQgICAgIDEKQEAgLTQ2NSw2ICs0NjYsNyBAQAogCXVuc2lnbmVkIGxvbmcJdm1tX2luaXRfcnI7CiAKIAlpbnQJCW9ubGluZV92Y3B1czsKKwlpbnQJCWlzX3NuMjsKIAogCXN0cnVjdCBrdm1faW9hcGljICp2aW9hcGljOwogCXN0cnVjdCBrdm1fdm1fc3RhdCBzdGF0OwpAQCAtNDcyLDYgKzQ3NCw3IEBACiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFzc2lnbmVkX2Rldl9oZWFkOwogCXN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11X2RvbWFpbjsKKwlpbnQgaW9tbXVfZmxhZ3M7CiAJc3RydWN0IGhsaXN0X2hlYWQgaXJxX2Fja19ub3RpZmllcl9saXN0OwogCiAJdW5zaWduZWQgbG9uZyBpcnFfc291cmNlc19iaXRtYXA7CkBAIC01NzgsNiArNTgxLDggQEAKIAlrdm1fdm1tX2VudHJ5IAkqdm1tX2VudHJ5OwogCWt2bV90cmFtcF9lbnRyeSAqdHJhbXBfZW50cnk7CiAJdW5zaWduZWQgbG9uZyAJdm1tX2l2dDsKKwl1bnNpZ25lZCBsb25nCXBhdGNoX21vdl9hcjsKKwl1bnNpZ25lZCBsb25nCXBhdGNoX21vdl9hcl9zbjI7CiB9OwogCiBpbnQga3ZtX2hpZ2hlc3RfcGVuZGluZ19pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKQEAgLTU4NSw3ICs1OTAsNiBAQAogaW50IGt2bV9wYWxfZW11bChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKTsKIHZvaWQga3ZtX3NhbF9lbXVsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1faW5qZWN0X25taShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpIHt9CiAjZW5kaWYgLyogX19BU1NFTUJMWV9fKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA3YTliZmY0Li4wYTljYzczIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTE0Niw2ICsxNDYsOCBAQAogI2RlZmluZSBQQUdFX0dBVEUJX19wZ3Byb3QoX19BQ0NFU1NfQklUUyB8IF9QQUdFX1BMXzAgfCBfUEFHRV9BUl9YX1JYKQogI2RlZmluZSBQQUdFX0tFUk5FTAlfX3BncHJvdChfX0RJUlRZX0JJVFMgIHwgX1BBR0VfUExfMCB8IF9QQUdFX0FSX1JXWCkKICNkZWZpbmUgUEFHRV9LRVJORUxSWAlfX3BncHJvdChfX0FDQ0VTU19CSVRTIHwgX1BBR0VfUExfMCB8IF9QQUdFX0FSX1JYKQorI2RlZmluZSBQQUdFX0tFUk5FTF9VQwlfX3BncHJvdChfX0RJUlRZX0JJVFMgIHwgX1BBR0VfUExfMCB8IF9QQUdFX0FSX1JXWCB8IFwKKwkJCQkgX1BBR0VfTUFfVUMpCiAKICMgaWZuZGVmIF9fQVNTRU1CTFlfXwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IDU1MTAzMTcuLmJhZWM2ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC02MzYsNyArNjM2LDcgQEAKICAqIHN1Y2Nlc3M6IHJldHVybiBJUlEgbnVtYmVyICg+PTApCiAgKiBmYWlsdXJlOiByZXR1cm4gPCAwCiAgKi8KLWludCBhY3BpX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQoraW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSkKIHsKIAlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfUExBVEZPUk0pCiAJCXJldHVybiBnc2k7CkBAIC02NzgsNyArNjc4LDggQEAKIAogCWZhZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfZmFkdCAqKWZhZHRfaGVhZGVyOwogCi0JYWNwaV9yZWdpc3Rlcl9nc2koZmFkdC0+c2NpX2ludGVycnVwdCwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsIEFDUElfQUNUSVZFX0xPVyk7CisJYWNwaV9yZWdpc3Rlcl9nc2koTlVMTCwgZmFkdC0+c2NpX2ludGVycnVwdCwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsCisJCQkJIEFDUElfQUNUSVZFX0xPVyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKaW5kZXggMTY2ZTBkOC4uZjkyY2VmNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKQEAgLTMyOSw3ICszMjksNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBpb3NhcGljX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKICNpZmRlZiBDT05GSUdfU01QCkBAIC0zNDMsMTUgKzM0MywxNSBAQAogCiAJY3B1ID0gY3B1bWFza19maXJzdF9hbmQoY3B1X29ubGluZV9tYXNrLCBtYXNrKTsKIAlpZiAoY3B1ID49IG5yX2NwdV9pZHMpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJaWYgKGlycV9wcmVwYXJlX21vdmUoaXJxLCBjcHUpKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCWRlc3QgPSBjcHVfcGh5c2ljYWxfaWQoY3B1KTsKIAogCWlmICghaW9zYXBpY19pbnRyX2luZm9baXJxXS5jb3VudCkKLQkJcmV0dXJuOwkJCS8qIG5vdCBhbiBJT1NBUElDIGludGVycnVwdCAqLworCQlyZXR1cm4gLTE7CQkJLyogbm90IGFuIElPU0FQSUMgaW50ZXJydXB0ICovCiAKIAlzZXRfaXJxX2FmZmluaXR5X2luZm8oaXJxLCBkZXN0LCByZWRpcik7CiAKQEAgLTM3Niw3ICszNzYsOSBAQAogCQlpb3NhcGljX3dyaXRlKGlvc2FwaWMsIElPU0FQSUNfUlRFX0hJR0gocnRlX2luZGV4KSwgaGlnaDMyKTsKIAkJaW9zYXBpY193cml0ZShpb3NhcGljLCBJT1NBUElDX1JURV9MT1cocnRlX2luZGV4KSwgbG93MzIpOwogCX0KKwogI2VuZGlmCisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKaW5kZXggYWNjNGQxOS4uYjQ0ODE5NyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYwpAQCAtNjEwLDYgKzYxMCw5IEBACiAJLm5hbWUgPQkJIklQSSIKIH07CiAKKy8qCisgKiBLVk0gdXNlcyB0aGlzIGludGVycnVwdCB0byBmb3JjZSBhIGNwdSBvdXQgb2YgZ3Vlc3QgbW9kZQorICovCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiByZXNjaGVkX2lycWFjdGlvbiA9IHsKIAkuaGFuZGxlciA9CWR1bW15X2hhbmRsZXIsCiAJLmZsYWdzID0JSVJRRl9ESVNBQkxFRCwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYwppbmRleCAyYjE1ZTIzLi4wZjhhZGU5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tc2lfaWE2NC5jCkBAIC0xMiw3ICsxMiw3IEBACiBzdGF0aWMgc3RydWN0IGlycV9jaGlwCWlhNjRfbXNpX2NoaXA7CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBpYTY0X3NldF9tc2lfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsCitzdGF0aWMgaW50IGlhNjRfc2V0X21zaV9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwKIAkJCQkgICAgICBjb25zdCBjcHVtYXNrX3QgKmNwdV9tYXNrKQogewogCXN0cnVjdCBtc2lfbXNnIG1zZzsKQEAgLTIwLDEwICsyMCwxMCBAQAogCWludCBjcHUgPSBmaXJzdF9jcHUoKmNwdV9tYXNrKTsKIAogCWlmICghY3B1X29ubGluZShjcHUpKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCWlmIChpcnFfcHJlcGFyZV9tb3ZlKGlycSwgY3B1KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAlyZWFkX21zaV9tc2coaXJxLCAmbXNnKTsKIApAQCAtMzksNiArMzksOCBAQAogCiAJd3JpdGVfbXNpX21zZyhpcnEsICZtc2cpOwogCWNwdW1hc2tfY29weShpcnFfZGVzY1tpcnFdLmFmZmluaXR5LCBjcHVtYXNrX29mKGNwdSkpOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCkBAIC0xMzAsMTcgKzEzMiwxNyBAQAogCiAjaWZkZWYgQ09ORklHX0RNQVIKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBkbWFyX21zaV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCitzdGF0aWMgaW50IGRtYXJfbXNpX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnID0gaXJxX2NmZyArIGlycTsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CiAJaW50IGNwdSA9IGNwdW1hc2tfZmlyc3QobWFzayk7CiAKIAlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAlpZiAoaXJxX3ByZXBhcmVfbW92ZShpcnEsIGNwdSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJZG1hcl9tc2lfcmVhZChpcnEsICZtc2cpOwogCkBAIC0xNTEsNiArMTUzLDggQEAKIAogCWRtYXJfbXNpX3dyaXRlKGlycSwgJm1zZyk7CiAJY3B1bWFza19jb3B5KGlycV9kZXNjW2lycV0uYWZmaW5pdHksIG1hc2spOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva3ZtL0tjb25maWcgYi9hcmNoL2lhNjQva3ZtL0tjb25maWcKaW5kZXggMGEyZDZiOC4uNjRkNTIwOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2t2bS9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9rdm0vS2NvbmZpZwpAQCAtMjMsNyArMjMsNyBAQAogCiBjb25maWcgS1ZNCiAJdHJpc3RhdGUgIktlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgKEtWTSkgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEhBVkVfS1ZNICYmIEVYUEVSSU1FTlRBTAorCWRlcGVuZHMgb24gSEFWRV9LVk0gJiYgTU9EVUxFUyAmJiBFWFBFUklNRU5UQUwKIAkjIGZvciBkZXZpY2UgYXNzaWdubWVudDoKIAlkZXBlbmRzIG9uIFBDSQogCXNlbGVjdCBQUkVFTVBUX05PVElGSUVSUwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jIGIvYXJjaC9pYTY0L2t2bS9rdm0taWE2NC5jCmluZGV4IGQyMGE1ZGIuLjgwYzU3YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0va3ZtLWlhNjQuYworKysgYi9hcmNoL2lhNjQva3ZtL2t2bS1pYTY0LmMKQEAgLTQxLDYgKzQxLDkgQEAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2VsZi5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9jbGtzdXBwb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3NuL3NodWJfbW1yLmg+CiAKICNpbmNsdWRlICJtaXNjLmgiCiAjaW5jbHVkZSAidnRpLmgiCkBAIC02NSw2ICs2OCwxNiBAQAogCXsgTlVMTCB9CiB9OwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBrdm1fZ2V0X2l0YyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisjaWYgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKSB8fCBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpCisJaWYgKHZjcHUtPmt2bS0+YXJjaC5pc19zbjIpCisJCXJldHVybiBydGNfdGltZSgpOworCWVsc2UKKyNlbmRpZgorCQlyZXR1cm4gaWE2NF9nZXRyZWcoX0lBNjRfUkVHX0FSX0lUQyk7Cit9CisKIHN0YXRpYyB2b2lkIGt2bV9mbHVzaF9pY2FjaGUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4pCiB7CiAJaW50IGw7CkBAIC0xMTksOCArMTMyLDcgQEAKIAl1bnNpZ25lZCBsb25nIHNhdmVkX3BzcjsKIAlpbnQgc2xvdDsKIAotCXB0ZSA9IHB0ZV92YWwobWtfcHRlX3BoeXMoX19wYShrdm1fdm1tX2Jhc2UpLAotCQkJCVBBR0VfS0VSTkVMKSk7CisJcHRlID0gcHRlX3ZhbChta19wdGVfcGh5cyhfX3BhKGt2bV92bW1fYmFzZSksIFBBR0VfS0VSTkVMKSk7CiAJbG9jYWxfaXJxX3NhdmUoc2F2ZWRfcHNyKTsKIAlzbG90ID0gaWE2NF9pdHJfZW50cnkoMHgzLCBLVk1fVk1NX0JBU0UsIHB0ZSwgS1ZNX1ZNTV9TSElGVCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoc2F2ZWRfcHNyKTsKQEAgLTI4Myw2ICsyOTUsMTggQEAKIAogfQogCitzdGF0aWMgaW50IF9fYXBpY19hY2NlcHRfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdWludDY0X3QgdmVjdG9yKQoreworCXN0cnVjdCB2cGQgKnZwZCA9IHRvX2hvc3QodmNwdS0+a3ZtLCB2Y3B1LT5hcmNoLnZwZCk7CisKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQodmVjdG9yLCAmdnBkLT5pcnJbMF0pKSB7CisJCXZjcHUtPmFyY2guaXJxX25ld19wZW5kaW5nID0gMTsKKwkJa3ZtX3ZjcHVfa2ljayh2Y3B1KTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiAvKgogICogIG9mZnNldDogYWRkcmVzcyBvZmZzZXQgdG8gSVBJIHNwYWNlLgogICogIHZhbHVlOiAgZGVsaXZlciB2YWx1ZS4KQEAgLTI5MiwyMCArMzE2LDIwIEBACiB7CiAJc3dpdGNoIChkbSkgewogCWNhc2UgU0FQSUNfRklYRUQ6Ci0JCWt2bV9hcGljX3NldF9pcnEodmNwdSwgdmVjdG9yLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTQVBJQ19OTUk6Ci0JCWt2bV9hcGljX3NldF9pcnEodmNwdSwgMiwgMCk7CisJCXZlY3RvciA9IDI7CiAJCWJyZWFrOwogCWNhc2UgU0FQSUNfRVhUSU5UOgotCQlrdm1fYXBpY19zZXRfaXJxKHZjcHUsIDAsIDApOworCQl2ZWN0b3IgPSAwOwogCQlicmVhazsKIAljYXNlIFNBUElDX0lOSVQ6CiAJY2FzZSBTQVBJQ19QTUk6CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSImt2bTogVW5pbXBsZW1lbnRlZCBEZWxpdmVyIHJlc2VydmVkIElQSSFcbiIpOwotCQlicmVhazsKKwkJcmV0dXJuOwogCX0KKwlfX2FwaWNfYWNjZXB0X2lycSh2Y3B1LCB2ZWN0b3IpOwogfQogCiBzdGF0aWMgc3RydWN0IGt2bV92Y3B1ICpsaWRfdG9fdmNwdShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaWQsCkBAIC00MTMsNiArNDM3LDIzIEBACiAJcmV0dXJuIDE7CiB9CiAKK3N0YXRpYyBpbnQga3ZtX3NuMl9zZXR1cF9tYXBwaW5ncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbG9uZyBwdGUsIHJ0Y19waHlzX2FkZHIsIG1hcF9hZGRyOworCWludCBzbG90OworCisJbWFwX2FkZHIgPSBLVk1fVk1NX0JBU0UgKyAoMVVMIDw8IEtWTV9WTU1fU0hJRlQpOworCXJ0Y19waHlzX2FkZHIgPSBMT0NBTF9NTVJfT0ZGU0VUIHwgU0hfUlRDOworCXB0ZSA9IHB0ZV92YWwobWtfcHRlX3BoeXMocnRjX3BoeXNfYWRkciwgUEFHRV9LRVJORUxfVUMpKTsKKwlzbG90ID0gaWE2NF9pdHJfZW50cnkoMHgzLCBtYXBfYWRkciwgcHRlLCBQQUdFX1NISUZUKTsKKwl2Y3B1LT5hcmNoLnNuX3J0Y190cl9zbG90ID0gc2xvdDsKKwlpZiAoc2xvdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNYXlkYXkgbWF5ZGF5ISBSVEMgbWFwcGluZyBmYWlsZWQhXG4iKTsKKwkJc2xvdCA9IDA7CisJfQorCXJldHVybiBzbG90OworfQorCiBpbnQga3ZtX2VtdWxhdGVfaGFsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAKQEAgLTQyNiw3ICs0NjcsNyBAQAogCiAJaWYgKGlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkpIHsKIAotCQl2Y3B1X25vd19pdGMgPSBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQVJfSVRDKSArIHZjcHUtPmFyY2guaXRjX29mZnNldDsKKwkJdmNwdV9ub3dfaXRjID0ga3ZtX2dldF9pdGModmNwdSkgKyB2Y3B1LT5hcmNoLml0Y19vZmZzZXQ7CiAKIAkJaWYgKHRpbWVfYWZ0ZXIodmNwdV9ub3dfaXRjLCB2cGQtPml0bSkpIHsKIAkJCXZjcHUtPmFyY2gudGltZXJfY2hlY2sgPSAxOwpAQCAtNDQ3LDEwICs0ODgsMTAgQEAKIAkJaHJ0aW1lcl9jYW5jZWwocF9odCk7CiAJCXZjcHUtPmFyY2guaHRfYWN0aXZlID0gMDsKIAotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfVU5IQUxULCAmdmNwdS0+cmVxdWVzdHMpKQorCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfVU5IQUxULCAmdmNwdS0+cmVxdWVzdHMpIHx8CisJCQkJa3ZtX2NwdV9oYXNfcGVuZGluZ190aW1lcih2Y3B1KSkKIAkJCWlmICh2Y3B1LT5hcmNoLm1wX3N0YXRlID09IEtWTV9NUF9TVEFURV9IQUxURUQpCi0JCQkJdmNwdS0+YXJjaC5tcF9zdGF0ZSA9Ci0JCQkJCUtWTV9NUF9TVEFURV9SVU5OQUJMRTsKKwkJCQl2Y3B1LT5hcmNoLm1wX3N0YXRlID0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFOwogCiAJCWlmICh2Y3B1LT5hcmNoLm1wX3N0YXRlICE9IEtWTV9NUF9TVEFURV9SVU5OQUJMRSkKIAkJCXJldHVybiAtRUlOVFI7CkBAIC01NTEsMjIgKzU5MiwzNSBAQAogCWlmIChyIDwgMCkKIAkJZ290byBvdXQ7CiAJdmNwdS0+YXJjaC52bV90cl9zbG90ID0gcjsKKworI2lmIGRlZmluZWQoQ09ORklHX0lBNjRfU0dJX1NOMikgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9HRU5FUklDKQorCWlmIChrdm0tPmFyY2guaXNfc24yKSB7CisJCXIgPSBrdm1fc24yX3NldHVwX21hcHBpbmdzKHZjcHUpOworCQlpZiAociA8IDApCisJCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKwogCXIgPSAwOwogb3V0OgogCXJldHVybiByOwotCiB9CiAKIHN0YXRpYyB2b2lkIGt2bV9wdXJnZV92bW1fbWFwcGluZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0KKwlzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LT5rdm07CiAJaWE2NF9wdHJfZW50cnkoMHgzLCB2Y3B1LT5hcmNoLnZtbV90cl9zbG90KTsKIAlpYTY0X3B0cl9lbnRyeSgweDMsIHZjcHUtPmFyY2gudm1fdHJfc2xvdCk7Ci0KKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0X1NHSV9TTjIpIHx8IGRlZmluZWQoQ09ORklHX0lBNjRfR0VORVJJQykKKwlpZiAoa3ZtLT5hcmNoLmlzX3NuMikKKwkJaWE2NF9wdHJfZW50cnkoMHgzLCB2Y3B1LT5hcmNoLnNuX3J0Y190cl9zbG90KTsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW50IGt2bV92Y3B1X3ByZV90cmFuc2l0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwl1bnNpZ25lZCBsb25nIHBzcjsKKwlpbnQgcjsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJaWYgKHZjcHUtPmFyY2gubGFzdF9ydW5fY3B1ICE9IGNwdSB8fApAQCAtNTc4LDM2ICs2MzIsMjcgQEAKIAogCXZjcHUtPmFyY2guaG9zdF9ycjYgPSBpYTY0X2dldF9ycihSUjYpOwogCXZ0aV9zZXRfcnI2KHZjcHUtPmFyY2gudm1tX3JyKTsKLQlyZXR1cm4ga3ZtX2luc2VydF92bW1fbWFwcGluZyh2Y3B1KTsKKwlsb2NhbF9pcnFfc2F2ZShwc3IpOworCXIgPSBrdm1faW5zZXJ0X3ZtbV9tYXBwaW5nKHZjcHUpOworCWxvY2FsX2lycV9yZXN0b3JlKHBzcik7CisJcmV0dXJuIHI7CiB9CisKIHN0YXRpYyB2b2lkIGt2bV92Y3B1X3Bvc3RfdHJhbnNpdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJa3ZtX3B1cmdlX3ZtbV9tYXBwaW5nKHZjcHUpOwogCXZ0aV9zZXRfcnI2KHZjcHUtPmFyY2guaG9zdF9ycjYpOwogfQogCi1zdGF0aWMgaW50ICB2dGlfdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKK3N0YXRpYyBpbnQgX192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewogCXVuaW9uIGNvbnRleHQgKmhvc3RfY3R4LCAqZ3Vlc3RfY3R4OwogCWludCByOwogCi0JLypHZXQgaG9zdCBhbmQgZ3Vlc3QgY29udGV4dCB3aXRoIGd1ZXN0IGFkZHJlc3Mgc3BhY2UuKi8KLQlob3N0X2N0eCA9IGt2bV9nZXRfaG9zdF9jb250ZXh0KHZjcHUpOwotCWd1ZXN0X2N0eCA9IGt2bV9nZXRfZ3Vlc3RfY29udGV4dCh2Y3B1KTsKLQotCXIgPSBrdm1fdmNwdV9wcmVfdHJhbnNpdGlvbih2Y3B1KTsKLQlpZiAociA8IDApCi0JCWdvdG8gb3V0OwotCWt2bV92bW1faW5mby0+dHJhbXBfZW50cnkoaG9zdF9jdHgsIGd1ZXN0X2N0eCk7Ci0Ja3ZtX3ZjcHVfcG9zdF90cmFuc2l0aW9uKHZjcHUpOwotCXIgPSAwOwotb3V0OgotCXJldHVybiByOwotfQotCi1zdGF0aWMgaW50IF9fdmNwdV9ydW4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKLXsKLQlpbnQgcjsKKwkvKgorCSAqIGRvd25fcmVhZCgpIG1heSBzbGVlcCBhbmQgcmV0dXJuIHdpdGggaW50ZXJydXB0cyBlbmFibGVkCisJICovCisJZG93bl9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOwogCiBhZ2FpbjoKIAlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKQEAgLTYxNiwyNiArNjYxLDMxIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qCi0JICogZG93bl9yZWFkKCkgbWF5IHNsZWVwIGFuZCByZXR1cm4gd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQKLQkgKi8KLQlkb3duX3JlYWQoJnZjcHUtPmt2bS0+c2xvdHNfbG9jayk7Ci0KIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCi0JdmNwdS0+Z3Vlc3RfbW9kZSA9IDE7CisJLypHZXQgaG9zdCBhbmQgZ3Vlc3QgY29udGV4dCB3aXRoIGd1ZXN0IGFkZHJlc3Mgc3BhY2UuKi8KKwlob3N0X2N0eCA9IGt2bV9nZXRfaG9zdF9jb250ZXh0KHZjcHUpOworCWd1ZXN0X2N0eCA9IGt2bV9nZXRfZ3Vlc3RfY29udGV4dCh2Y3B1KTsKKworCWNsZWFyX2JpdChLVk1fUkVRX0tJQ0ssICZ2Y3B1LT5yZXF1ZXN0cyk7CisKKwlyID0ga3ZtX3ZjcHVfcHJlX3RyYW5zaXRpb24odmNwdSk7CisJaWYgKHIgPCAwKQorCQlnb3RvIHZjcHVfcnVuX2ZhaWw7CisKKwl1cF9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOwogCWt2bV9ndWVzdF9lbnRlcigpOwotCXIgPSB2dGlfdmNwdV9ydW4odmNwdSwga3ZtX3J1bik7Ci0JaWYgKHIgPCAwKSB7Ci0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJcHJlZW1wdF9lbmFibGUoKTsKLQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9GQUlMX0VOVFJZOwotCQlnb3RvIG91dDsKLQl9CisKKwkvKgorCSAqIFRyYW5zaXRpb24gdG8gdGhlIGd1ZXN0CisJICovCisJa3ZtX3ZtbV9pbmZvLT50cmFtcF9lbnRyeShob3N0X2N0eCwgZ3Vlc3RfY3R4KTsKKworCWt2bV92Y3B1X3Bvc3RfdHJhbnNpdGlvbih2Y3B1KTsKIAogCXZjcHUtPmFyY2gubGF1bmNoZWQgPSAxOwotCXZjcHUtPmd1ZXN0X21vZGUgPSAwOworCXNldF9iaXQoS1ZNX1JFUV9LSUNLLCAmdmNwdS0+cmVxdWVzdHMpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKIAogCS8qCkBAIC02NDYsOSArNjk2LDEwIEBACiAJICovCiAJYmFycmllcigpOwogCWt2bV9ndWVzdF9leGl0KCk7Ci0JdXBfcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogCisJZG93bl9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOworCiAJciA9IGt2bV9oYW5kbGVfZXhpdChrdm1fcnVuLCB2Y3B1KTsKIAogCWlmIChyID4gMCkgewpAQCAtNjU3LDEyICs3MDgsMjAgQEAKIAl9CiAKIG91dDoKKwl1cF9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOwogCWlmIChyID4gMCkgewogCQlrdm1fcmVzY2hlZCh2Y3B1KTsKKwkJZG93bl9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOwogCQlnb3RvIGFnYWluOwogCX0KIAogCXJldHVybiByOworCit2Y3B1X3J1bl9mYWlsOgorCWxvY2FsX2lycV9lbmFibGUoKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfRkFJTF9FTlRSWTsKKwlnb3RvIG91dDsKIH0KIAogc3RhdGljIHZvaWQga3ZtX3NldF9tbWlvX2RhdGEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtNzg4LDYgKzg0Nyw5IEBACiAKIAlpZiAoSVNfRVJSKGt2bSkpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJa3ZtLT5hcmNoLmlzX3NuMiA9IGlhNjRfcGxhdGZvcm1faXMoInNuMiIpOworCiAJa3ZtX2luaXRfdm0oa3ZtKTsKIAogCWt2bS0+YXJjaC5vbmxpbmVfdmNwdXMgPSAwOwpAQCAtODg0LDcgKzk0Niw3IEBACiAJUkVTVE9SRV9SRUdTKHNhdmVkX2dwKTsKIAogCXZjcHUtPmFyY2guaXJxX25ld19wZW5kaW5nID0gMTsKLQl2Y3B1LT5hcmNoLml0Y19vZmZzZXQgPSByZWdzLT5zYXZlZF9pdGMgLSBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQVJfSVRDKTsKKwl2Y3B1LT5hcmNoLml0Y19vZmZzZXQgPSByZWdzLT5zYXZlZF9pdGMgLSBrdm1fZ2V0X2l0Yyh2Y3B1KTsKIAlzZXRfYml0KEtWTV9SRVFfUkVTVU1FLCAmdmNwdS0+cmVxdWVzdHMpOwogCiAJdmNwdV9wdXQodmNwdSk7CkBAIC0xMDQzLDEwICsxMTA1LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHZ0aV92Y3B1X2xvYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgY3B1KQotewotfQotCiBzdGF0aWMgaW50IHZ0aV9pbml0X3ZwZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJaW50IGk7CkBAIC0xMTY1LDcgKzEyMjMsNyBAQAogCQlyZWdzLT5jcl9paXAgPSBQQUxFX1JFU0VUX0VOVFJZOwogCiAJCS8qSW5pdGlhbGl6ZSBpdGMgb2Zmc2V0IGZvciB2Y3B1cyovCi0JCWl0Y19vZmZzZXQgPSAwVUwgLSBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQVJfSVRDKTsKKwkJaXRjX29mZnNldCA9IDBVTCAtIGt2bV9nZXRfaXRjKHZjcHUpOwogCQlmb3IgKGkgPSAwOyBpIDwga3ZtLT5hcmNoLm9ubGluZV92Y3B1czsgaSsrKSB7CiAJCQl2ID0gKHN0cnVjdCBrdm1fdmNwdSAqKSgoY2hhciAqKXZjcHUgKwogCQkJCQlzaXplb2Yoc3RydWN0IGt2bV92Y3B1X2RhdGEpICogaSk7CkBAIC0xMjM3LDYgKzEyOTUsNyBAQAogCiAJbG9jYWxfaXJxX3NhdmUocHNyKTsKIAlyID0ga3ZtX2luc2VydF92bW1fbWFwcGluZyh2Y3B1KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShwc3IpOwogCWlmIChyKQogCQlnb3RvIGZhaWw7CiAJciA9IGt2bV92Y3B1X2luaXQodmNwdSwgdmNwdS0+a3ZtLCBpZCk7CkBAIC0xMjU0LDEzICsxMzEzLDExIEBACiAJCWdvdG8gdW5pbml0OwogCiAJa3ZtX3B1cmdlX3ZtbV9tYXBwaW5nKHZjcHUpOwotCWxvY2FsX2lycV9yZXN0b3JlKHBzcik7CiAKIAlyZXR1cm4gMDsKIHVuaW5pdDoKIAlrdm1fdmNwdV91bmluaXQodmNwdSk7CiBmYWlsOgotCWxvY2FsX2lycV9yZXN0b3JlKHBzcik7CiAJcmV0dXJuIHI7CiB9CiAKQEAgLTEyOTEsNyArMTM0OCw2IEBACiAJdmNwdS0+a3ZtID0ga3ZtOwogCiAJY3B1ID0gZ2V0X2NwdSgpOwotCXZ0aV92Y3B1X2xvYWQodmNwdSwgY3B1KTsKIAlyID0gdnRpX3ZjcHVfc2V0dXAodmNwdSwgaWQpOwogCXB1dF9jcHUoKTsKIApAQCAtMTQyNyw3ICsxNDgzLDcgQEAKIAl9CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKIAkJcmVncy0+aW5zdmNbaV0gPSB2Y3B1LT5hcmNoLmluc3ZjW2ldOwotCXJlZ3MtPnNhdmVkX2l0YyA9IHZjcHUtPmFyY2guaXRjX29mZnNldCArIGlhNjRfZ2V0cmVnKF9JQTY0X1JFR19BUl9JVEMpOworCXJlZ3MtPnNhdmVkX2l0YyA9IHZjcHUtPmFyY2guaXRjX29mZnNldCArIGt2bV9nZXRfaXRjKHZjcHUpOwogCVNBVkVfUkVHUyh4dHApOwogCVNBVkVfUkVHUyhtZXRhcGh5c2ljYWxfcnIwKTsKIAlTQVZFX1JFR1MobWV0YXBoeXNpY2FsX3JyNCk7CkBAIC0xNTc0LDYgKzE2MzAsNyBAQAogCiB2b2lkIGt2bV9hcmNoX2ZsdXNoX3NoYWRvdyhzdHJ1Y3Qga3ZtICprdm0pCiB7CisJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7CiB9CiAKIGxvbmcga3ZtX2FyY2hfZGV2X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLApAQCAtMTYxNiw4ICsxNjczLDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKKworLyoKKyAqIE9uIFNOMiwgdGhlIElUQyBpc24ndCBzdGFibGUsIHNvIGNvcHkgaW4gZmFzdCBwYXRoIGNvZGUgdG8gdXNlIHRoZQorICogU04yIFJUQywgcmVwbGFjaW5nIHRoZSBJVEMgYmFzZWQgZGVmYXVsdCB2ZXJpb24uCisgKi8KK3N0YXRpYyB2b2lkIGt2bV9wYXRjaF92bW0oc3RydWN0IGt2bV92bW1faW5mbyAqdm1tX2luZm8sCisJCQkgIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5ld19hciwgbmV3X2FyX3NuMjsKKwl1bnNpZ25lZCBsb25nIG1vZHVsZV9iYXNlOworCisJaWYgKCFpYTY0X3BsYXRmb3JtX2lzKCJzbjIiKSkKKwkJcmV0dXJuOworCisJbW9kdWxlX2Jhc2UgPSAodW5zaWduZWQgbG9uZyltb2R1bGUtPm1vZHVsZV9jb3JlOworCisJbmV3X2FyID0ga3ZtX3ZtbV9iYXNlICsgdm1tX2luZm8tPnBhdGNoX21vdl9hciAtIG1vZHVsZV9iYXNlOworCW5ld19hcl9zbjIgPSBrdm1fdm1tX2Jhc2UgKyB2bW1faW5mby0+cGF0Y2hfbW92X2FyX3NuMiAtIG1vZHVsZV9iYXNlOworCisJcHJpbnRrKEtFUk5fSU5GTyAia3ZtOiBQYXRjaGluZyBJVEMgZW11bGF0aW9uIHRvIHVzZSBTR0kgU04yIFJUQyAiCisJICAgICAgICJhcyBzb3VyY2VcbiIpOworCisJLyoKKwkgKiBDb3B5IHRoZSBTTjIgdmVyc2lvbiBvZiBtb3ZfYXIgaW50byBwbGFjZS4gVGhleSBhcmUgYm90aAorCSAqIHRoZSBzYW1lIHNpemUsIHNvIDYgYnVuZGxlcyBpcyBzdWZmaWNpZW50ICg2ICogMHgxMCkuCisJICovCisJbWVtY3B5KCh2b2lkICopbmV3X2FyLCAodm9pZCAqKW5ld19hcl9zbjIsIDB4NjApOworfQorCiBzdGF0aWMgaW50IGt2bV9yZWxvY2F0ZV92bW0oc3RydWN0IGt2bV92bW1faW5mbyAqdm1tX2luZm8sCi0JCQkJCQlzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCisJCQkgICAgc3RydWN0IG1vZHVsZSAqbW9kdWxlKQogewogCXVuc2lnbmVkIGxvbmcgbW9kdWxlX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyB2bW1fc2l6ZTsKQEAgLTE2MzksNiArMTcyNSw3IEBACiAJCXJldHVybiAtRUZBVUxUOwogCiAJbWVtY3B5KCh2b2lkICopa3ZtX3ZtbV9iYXNlLCAodm9pZCAqKW1vZHVsZV9iYXNlLCB2bW1fc2l6ZSk7CisJa3ZtX3BhdGNoX3ZtbSh2bW1faW5mbywgbW9kdWxlKTsKIAlrdm1fZmx1c2hfaWNhY2hlKGt2bV92bW1fYmFzZSwgdm1tX3NpemUpOwogCiAJLypSZWNhbGN1bGF0ZSBrdm1fdm1tX2luZm8gYmFzZWQgb24gbmV3IFZNTSovCkBAIC0xNzkyLDM4ICsxODc5LDI0IEBACiB7CiB9CiAKLXN0YXRpYyB2b2lkIHZjcHVfa2lja19pbnRyKHZvaWQgKmluZm8pCi17Ci0jaWZkZWYgREVCVUcKLQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSAoc3RydWN0IGt2bV92Y3B1ICopaW5mbzsKLQlwcmludGsoS0VSTl9ERUJVRyJ2Y3B1X2tpY2tfaW50ciAlcCBcbiIsIHZjcHUpOwotI2VuZGlmCi19Ci0KIHZvaWQga3ZtX3ZjcHVfa2ljayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JaW50IGlwaV9wY3B1ID0gdmNwdS0+Y3B1OwotCWludCBjcHUgPSBnZXRfY3B1KCk7CisJaW50IG1lOworCWludCBjcHUgPSB2Y3B1LT5jcHU7CiAKIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmdmNwdS0+d3EpKQogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnZjcHUtPndxKTsKIAotCWlmICh2Y3B1LT5ndWVzdF9tb2RlICYmIGNwdSAhPSBpcGlfcGNwdSkKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGlwaV9wY3B1LCB2Y3B1X2tpY2tfaW50ciwgdmNwdSwgMCk7CisJbWUgPSBnZXRfY3B1KCk7CisJaWYgKGNwdSAhPSBtZSAmJiAodW5zaWduZWQpIGNwdSA8IG5yX2NwdV9pZHMgJiYgY3B1X29ubGluZShjcHUpKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoS1ZNX1JFUV9LSUNLLCAmdmNwdS0+cmVxdWVzdHMpKQorCQkJc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOwogCXB1dF9jcHUoKTsKIH0KIAotaW50IGt2bV9hcGljX3NldF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1OCB2ZWMsIHU4IHRyaWcpCitpbnQga3ZtX2FwaWNfc2V0X2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbGFwaWNfaXJxICppcnEpCiB7Ci0KLQlzdHJ1Y3QgdnBkICp2cGQgPSB0b19ob3N0KHZjcHUtPmt2bSwgdmNwdS0+YXJjaC52cGQpOwotCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHZlYywgJnZwZC0+aXJyWzBdKSkgewotCQl2Y3B1LT5hcmNoLmlycV9uZXdfcGVuZGluZyA9IDE7Ci0JCWt2bV92Y3B1X2tpY2sodmNwdSk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gX19hcGljX2FjY2VwdF9pcnEodmNwdSwgaXJxLT52ZWN0b3IpOwogfQogCiBpbnQga3ZtX2FwaWNfbWF0Y2hfcGh5c2ljYWxfYWRkcihzdHJ1Y3Qga3ZtX2xhcGljICphcGljLCB1MTYgZGVzdCkKQEAgLTE4MzYsMjAgKzE5MDksMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGt2bV92Y3B1ICprdm1fZ2V0X2xvd2VzdF9wcmlvX3ZjcHUoc3RydWN0IGt2bSAqa3ZtLCB1OCB2ZWN0b3IsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYml0bWFwKQoraW50IGt2bV9hcGljX2NvbXBhcmVfcHJpbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUxLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUyKQogewotCXN0cnVjdCBrdm1fdmNwdSAqbHZjcHUgPSBrdm0tPnZjcHVzWzBdOwotCWludCBpOworCXJldHVybiB2Y3B1MS0+YXJjaC54dHAgLSB2Y3B1Mi0+YXJjaC54dHA7Cit9CiAKLQlmb3IgKGkgPSAxOyBpIDwga3ZtLT5hcmNoLm9ubGluZV92Y3B1czsgaSsrKSB7Ci0JCWlmICgha3ZtLT52Y3B1c1tpXSkKLQkJCWNvbnRpbnVlOwotCQlpZiAobHZjcHUtPmFyY2gueHRwID4ga3ZtLT52Y3B1c1tpXS0+YXJjaC54dHApCi0JCQlsdmNwdSA9IGt2bS0+dmNwdXNbaV07Ci0JfQotCi0JcmV0dXJuIGx2Y3B1OworaW50IGt2bV9hcGljX21hdGNoX2Rlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2xhcGljICpzb3VyY2UsCisJCWludCBzaG9ydF9oYW5kLCBpbnQgZGVzdCwgaW50IGRlc3RfbW9kZSkKK3sKKwlzdHJ1Y3Qga3ZtX2xhcGljICp0YXJnZXQgPSB2Y3B1LT5hcmNoLmFwaWM7CisJcmV0dXJuIChkZXN0X21vZGUgPT0gMCkgPworCQlrdm1fYXBpY19tYXRjaF9waHlzaWNhbF9hZGRyKHRhcmdldCwgZGVzdCkgOgorCQlrdm1fYXBpY19tYXRjaF9sb2dpY2FsX2FkZHIodGFyZ2V0LCBkZXN0KTsKIH0KIAogc3RhdGljIGludCBmaW5kX2hpZ2hlc3RfYml0cyhpbnQgKmRhdCkKQEAgLTE4ODgsNiArMTk1OSwxMiBAQAogCXJldHVybiAwOwogfQogCitpbnQga3ZtX2FyY2hfaW50ZXJydXB0X2FsbG93ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCS8qIGRvIHJlYWwgY2hlY2sgaGVyZSAqLworCXJldHVybiAxOworfQorCiBpbnQga3ZtX2NwdV9oYXNfcGVuZGluZ190aW1lcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIHZjcHUtPmFyY2gudGltZXJfZmlyZWQ7CkBAIC0xOTE4LDYgKzE5OTUsNyBAQAogCWxvbmcgcHNyOwogCWxvY2FsX2lycV9zYXZlKHBzcik7CiAJciA9IGt2bV9pbnNlcnRfdm1tX21hcHBpbmcodmNwdSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUocHNyKTsKIAlpZiAocikKIAkJZ290byBmYWlsOwogCkBAIC0xOTMwLDcgKzIwMDgsNiBAQAogCWt2bV9wdXJnZV92bW1fbWFwcGluZyh2Y3B1KTsKIAlyID0gMDsKIGZhaWw6Ci0JbG9jYWxfaXJxX3Jlc3RvcmUocHNyKTsKIAlyZXR1cm4gcjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS9rdm1fZncuYyBiL2FyY2gvaWE2NC9rdm0va3ZtX2Z3LmMKaW5kZXggYThhZTUyZS4uZTRiODIzMSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2t2bS9rdm1fZncuYworKysgYi9hcmNoL2lhNjQva3ZtL2t2bV9mdy5jCkBAIC0yMSw2ICsyMSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9jbGtzdXBwb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3NuL3NodWJfbW1yLmg+CiAKICNpbmNsdWRlICJ2dGkuaCIKICNpbmNsdWRlICJtaXNjLmgiCkBAIC0xODgsMTIgKzE5MSwzNSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKKy8qCisgKiBPbiB0aGUgU0dJIFNOMiwgdGhlIElUQyBpc24ndCBzdGFibGUuIEVtdWxhdGlvbiBiYWNrZWQgYnkgdGhlIFNOMgorICogUlRDIGlzIHVzZWQgaW5zdGVhZC4gVGhpcyBmdW5jdGlvbiBwYXRjaGVzIHRoZSByYXRpb3MgZnJvbSBTQUwKKyAqIHRvIG1hdGNoIHRoZSBSVEMgYmVmb3JlIHByb3ZpZGluZyB0aGVtIHRvIHRoZSBndWVzdC4KKyAqLworc3RhdGljIHZvaWQgc24yX3BhdGNoX2l0Y19mcmVxX3JhdGlvcyhzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsICpyZXN1bHQpCit7CisJc3RydWN0IHBhbF9mcmVxX3JhdGlvICpyYXRpbzsKKwl1bnNpZ25lZCBsb25nIHNhbF9mcmVxLCBzYWxfZHJpZnQsIGZhY3RvcjsKKworCXJlc3VsdC0+c3RhdHVzID0gaWE2NF9zYWxfZnJlcV9iYXNlKFNBTF9GUkVRX0JBU0VfUExBVEZPUk0sCisJCQkJCSAgICAmc2FsX2ZyZXEsICZzYWxfZHJpZnQpOworCXJhdGlvID0gKHN0cnVjdCBwYWxfZnJlcV9yYXRpbyAqKSZyZXN1bHQtPnYyOworCWZhY3RvciA9ICgoc2FsX2ZyZXEgKiAzKSArIChzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQgLyAyKSkgLworCQlzbl9ydGNfY3ljbGVzX3Blcl9zZWNvbmQ7CisKKwlyYXRpby0+bnVtID0gMzsKKwlyYXRpby0+ZGVuID0gZmFjdG9yOworfQorCiBzdGF0aWMgc3RydWN0IGlhNjRfcGFsX3JldHZhbCBwYWxfZnJlcV9yYXRpb3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCiAJc3RydWN0IGlhNjRfcGFsX3JldHZhbCByZXN1bHQ7CiAKIAlQQUxfQ0FMTChyZXN1bHQsIFBBTF9GUkVRX1JBVElPUywgMCwgMCwgMCk7CisKKwlpZiAodmNwdS0+a3ZtLT5hcmNoLmlzX3NuMikKKwkJc24yX3BhdGNoX2l0Y19mcmVxX3JhdGlvcygmcmVzdWx0KTsKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0vbGFwaWMuaCBiL2FyY2gvaWE2NC9rdm0vbGFwaWMuaAppbmRleCA2ZDZjYmNiLi5lZTU0MWNlIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva3ZtL2xhcGljLmgKKysrIGIvYXJjaC9pYTY0L2t2bS9sYXBpYy5oCkBAIC0yMCw2ICsyMCwxMCBAQAogCiBpbnQga3ZtX2FwaWNfbWF0Y2hfcGh5c2ljYWxfYWRkcihzdHJ1Y3Qga3ZtX2xhcGljICphcGljLCB1MTYgZGVzdCk7CiBpbnQga3ZtX2FwaWNfbWF0Y2hfbG9naWNhbF9hZGRyKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMsIHU4IG1kYSk7Ci1pbnQga3ZtX2FwaWNfc2V0X2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU4IHZlYywgdTggdHJpZyk7CitpbnQga3ZtX2FwaWNfbWF0Y2hfZGVzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbGFwaWMgKnNvdXJjZSwKKwkJaW50IHNob3J0X2hhbmQsIGludCBkZXN0LCBpbnQgZGVzdF9tb2RlKTsKK2ludCBrdm1fYXBpY19jb21wYXJlX3ByaW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1MSwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1Mik7CitpbnQga3ZtX2FwaWNfc2V0X2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbGFwaWNfaXJxICppcnEpOworI2RlZmluZSBrdm1fYXBpY19wcmVzZW50KHgpICh0cnVlKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0vb3B0dmZhdWx0LlMgYi9hcmNoL2lhNjQva3ZtL29wdHZmYXVsdC5TCmluZGV4IDMyMjU0Y2UuLmY3OTNiZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0vb3B0dmZhdWx0LlMKKysrIGIvYXJjaC9pYTY0L2t2bS9vcHR2ZmF1bHQuUwpAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9rdm1faG9zdC5oPgogCiAjaW5jbHVkZSAidnRpLmgiCiAjaW5jbHVkZSAiYXNtLW9mZnNldHMuaCIKQEAgLTE0MCw2ICsxNDEsMzUgQEAKIAk7OwogRU5EKGt2bV9hc21fbW92X2Zyb21fYXIpCiAKKy8qCisgKiBTcGVjaWFsIFNHSSBTTjIgb3B0aW1pemVkIHZlcnNpb24gb2YgbW92X2Zyb21fYXIgdXNpbmcgdGhlIFNOMiBSVEMKKyAqIGNsb2NrIGFzIGl0J3Mgc291cmNlIGZvciBlbXVsYXRpbmcgdGhlIElUQy4gVGhpcyB2ZXJzaW9uIHdpbGwgYmUKKyAqIGNvcGllZCBvbiB0b3Agb2YgdGhlIG9yaWdpbmFsIHZlcnNpb24gaWYgdGhlIGhvc3QgaXMgZGV0ZXJtaW5lZCB0bworICogYmUgYW4gU04yLgorICovCitHTE9CQUxfRU5UUlkoa3ZtX2FzbV9tb3ZfZnJvbV9hcl9zbjIpCisJYWRkIHIxOD1WTU1fVkNQVV9JVENfT0ZTX09GRlNFVCwgcjIxCisJbW92bCByMTkgPSAoS1ZNX1ZNTV9CQVNFKygxPDxLVk1fVk1NX1NISUZUKSkKKworCWFkZCByMTY9Vk1NX1ZDUFVfTEFTVF9JVENfT0ZGU0VULHIyMQorCWV4dHIudSByMTc9cjI1LDYsNworCW1vdiByMjQ9YjAKKwk7OworCWxkOCByMTg9W3IxOF0KKwlsZDggcjE5PVtyMTldCisJYWRkbCByMjA9QGdwcmVsKGFzbV9tb3ZfdG9fcmVnKSxncAorCTs7CisJYWRkIHIxOT1yMTkscjE4CisJc2hsYWRkIHIxNz1yMTcsNCxyMjAKKwk7OworCWFkZHMgcjMwPWt2bV9yZXN1bWVfdG9fZ3Vlc3QtYXNtX21vdl90b19yZWcscjIwCisJc3Q4IFtyMTZdID0gcjE5CisJbW92IGIwPXIxNworCWJyLnNwdGsuZmV3IGIwCisJOzsKK0VORChrdm1fYXNtX21vdl9mcm9tX2FyX3NuMikKKworCiAKIC8vIG1vdiByMT1ycltyM10KIEdMT0JBTF9FTlRSWShrdm1fYXNtX21vdl9mcm9tX3JyKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS9wcm9jZXNzLmMgYi9hcmNoL2lhNjQva3ZtL3Byb2Nlc3MuYwppbmRleCBiMWRjODA5Li5hOGY4NGRhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva3ZtL3Byb2Nlc3MuYworKysgYi9hcmNoL2lhNjQva3ZtL3Byb2Nlc3MuYwpAQCAtNjUyLDIwICs2NTIsMjUgQEAKIAkJdW5zaWduZWQgbG9uZyBpc3IsIHVuc2lnbmVkIGxvbmcgaWltKQogewogCXN0cnVjdCBrdm1fdmNwdSAqdiA9IGN1cnJlbnRfdmNwdTsKKwlsb25nIHBzcjsKIAogCWlmIChpYTY0X3BzcihyZWdzKS0+Y3BsID09IDApIHsKIAkJLyogQWxsb3cgaHlwZXJjYWxscyBvbmx5IHdoZW4gY3BsID0gMC4gICovCiAJCWlmIChpaW0gPT0gRE9NTl9QQUxfUkVRVUVTVCkgeworCQkJbG9jYWxfaXJxX3NhdmUocHNyKTsKIAkJCXNldF9wYWxfY2FsbF9kYXRhKHYpOwogCQkJdm1tX3RyYW5zaXRpb24odik7CiAJCQlnZXRfcGFsX2NhbGxfcmVzdWx0KHYpOwogCQkJdmNwdV9pbmNyZW1lbnRfaWlwKHYpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUocHNyKTsKIAkJCXJldHVybjsKIAkJfSBlbHNlIGlmIChpaW0gPT0gRE9NTl9TQUxfUkVRVUVTVCkgeworCQkJbG9jYWxfaXJxX3NhdmUocHNyKTsKIAkJCXNldF9zYWxfY2FsbF9kYXRhKHYpOwogCQkJdm1tX3RyYW5zaXRpb24odik7CiAJCQlnZXRfc2FsX2NhbGxfcmVzdWx0KHYpOwogCQkJdmNwdV9pbmNyZW1lbnRfaWlwKHYpOworCQkJbG9jYWxfaXJxX3Jlc3RvcmUocHNyKTsKIAkJCXJldHVybjsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rdm0vdmNwdS5jIGIvYXJjaC9pYTY0L2t2bS92Y3B1LmMKaW5kZXggYTE4ZWUxNy4uYTJjNmMxNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2t2bS92Y3B1LmMKKysrIGIvYXJjaC9pYTY0L2t2bS92Y3B1LmMKQEAgLTc4OCwxMyArNzg4LDI5IEBACiAJCXNldGZwcmVnKHJlZywgdmFsLCByZWdzKTsgICAvKiBGSVhNRTogaGFuZGxlIE5BVHMgbGF0ZXIqLwogfQogCisvKgorICogVGhlIEFsdGl4IFJUQyBpcyBtYXBwZWQgc3BlY2lhbGx5IGhlcmUgZm9yIHRoZSB2bW0gbW9kdWxlCisgKi8KKyNkZWZpbmUgU05fUlRDX0JBU0UJKHU2NCAqKShLVk1fVk1NX0JBU0UrKDFVTDw8S1ZNX1ZNTV9TSElGVCkpCitzdGF0aWMgbG9uZyBrdm1fZ2V0X2l0YyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisjaWYgZGVmaW5lZChDT05GSUdfSUE2NF9TR0lfU04yKSB8fCBkZWZpbmVkKENPTkZJR19JQTY0X0dFTkVSSUMpCisJc3RydWN0IGt2bSAqa3ZtID0gKHN0cnVjdCBrdm0gKilLVk1fVk1fQkFTRTsKKworCWlmIChrdm0tPmFyY2guaXNfc24yKQorCQlyZXR1cm4gKCpTTl9SVENfQkFTRSk7CisJZWxzZQorI2VuZGlmCisJCXJldHVybiBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQVJfSVRDKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbHNhcGljIHRpbWVyCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB1NjQgdmNwdV9nZXRfaXRjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGd1ZXN0X2l0YzsKLQlndWVzdF9pdGMgPSBWTVgodmNwdSwgaXRjX29mZnNldCkgKyBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQVJfSVRDKTsKKwlndWVzdF9pdGMgPSBWTVgodmNwdSwgaXRjX29mZnNldCkgKyBrdm1fZ2V0X2l0Yyh2Y3B1KTsKIAogCWlmIChndWVzdF9pdGMgPj0gVk1YKHZjcHUsIGxhc3RfaXRjKSkgewogCQlWTVgodmNwdSwgbGFzdF9pdGMpID0gZ3Vlc3RfaXRjOwpAQCAtODA5LDcgKzgyNSw3IEBACiAJc3RydWN0IGt2bV92Y3B1ICp2OwogCXN0cnVjdCBrdm0gKmt2bTsKIAlpbnQgaTsKLQlsb25nIGl0Y19vZmZzZXQgPSB2YWwgLSBpYTY0X2dldHJlZyhfSUE2NF9SRUdfQVJfSVRDKTsKKwlsb25nIGl0Y19vZmZzZXQgPSB2YWwgLSBrdm1fZ2V0X2l0Yyh2Y3B1KTsKIAl1bnNpZ25lZCBsb25nIHZpdHYgPSBWQ1BVKHZjcHUsIGl0dik7CiAKIAlrdm0gPSAoc3RydWN0IGt2bSAqKUtWTV9WTV9CQVNFOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2t2bS92bW0uYyBiL2FyY2gvaWE2NC9rdm0vdm1tLmMKaW5kZXggOWVlZTVjMC4uZjRiNGM4OSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2t2bS92bW0uYworKysgYi9hcmNoL2lhNjQva3ZtL3ZtbS5jCkBAIC0zMCwxNSArMzAsMTkgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogZXh0ZXJuIGNoYXIga3ZtX2lhNjRfaXZ0OworZXh0ZXJuIGNoYXIga3ZtX2FzbV9tb3ZfZnJvbV9hcjsKK2V4dGVybiBjaGFyIGt2bV9hc21fbW92X2Zyb21fYXJfc24yOwogZXh0ZXJuIGZwc3dhX2ludGVyZmFjZV90ICp2bW1fZnBzd2FfaW50ZXJmYWNlOwogCiBsb25nIHZtbV9zYW5pdHkgPSAxOwogCiBzdHJ1Y3Qga3ZtX3ZtbV9pbmZvIHZtbV9pbmZvID0gewotCS5tb2R1bGUJICAgICA9IFRISVNfTU9EVUxFLAotCS52bW1fZW50cnkgICA9IHZtbV9lbnRyeSwKLQkudHJhbXBfZW50cnkgPSB2bW1fdHJhbXBvbGluZSwKLQkudm1tX2l2dCAgICAgPSAodW5zaWduZWQgbG9uZykma3ZtX2lhNjRfaXZ0LAorCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLAorCS52bW1fZW50cnkJCT0gdm1tX2VudHJ5LAorCS50cmFtcF9lbnRyeQkJPSB2bW1fdHJhbXBvbGluZSwKKwkudm1tX2l2dAkJPSAodW5zaWduZWQgbG9uZykma3ZtX2lhNjRfaXZ0LAorCS5wYXRjaF9tb3ZfYXIJCT0gKHVuc2lnbmVkIGxvbmcpJmt2bV9hc21fbW92X2Zyb21fYXIsCisJLnBhdGNoX21vdl9hcl9zbjIJPSAodW5zaWduZWQgbG9uZykma3ZtX2FzbV9tb3ZfZnJvbV9hcl9zbjIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCAga3ZtX3ZtbV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva3ZtL3ZtbV9pdnQuUyBiL2FyY2gvaWE2NC9rdm0vdm1tX2l2dC5TCmluZGV4IDNlZjFhMDEuLjQwOTIwYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0vdm1tX2l2dC5TCisrKyBiL2FyY2gvaWE2NC9rdm0vdm1tX2l2dC5TCkBAIC05NSw3ICs5NSw3IEBACiAJOzsKIAlzcmx6LmkgICAgLy8gZ3VhcmFudGVlIHRoYXQgaW50ZXJydXB0aW9uIGNvbGxlY3Rpb24gaXMgb24KIAk7OwotCS8vKHAxNSkgc3NtIHBzci5pICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwc3IuaQorCShwMTUpIHNzbSBwc3IuaSAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgcHNyLgogCWFkZGwgcjE0PUBncHJlbChpYTY0X2xlYXZlX2h5cGVydmlzb3IpLGdwCiAJOzsKIAlLVk1fU0FWRV9SRVNUCkBAIC0yNDksNyArMjQ5LDcgQEAKIAk7OwogCXNybHouaSAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGludGVycnVwdGlvbiBjb2xsZWN0aW9uIGlzIG9uCiAJOzsKLQkvLyhwMTUpc3NtIHBzci5pICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwc3IuaQorCShwMTUpc3NtIHBzci5pICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwc3IuaQogCWFkZGwgcjE0PUBncHJlbChpYTY0X2xlYXZlX2h5cGVydmlzb3IpLGdwCiAJOzsKIAlLVk1fU0FWRV9SRVNUCkBAIC00MzksNyArNDM5LDcgQEAKIAk7OwogCXNybHouaSAvLyBndWFyYW50ZWUgdGhhdCBpbnRlcnJ1cHRpb24gY29sbGVjdGlvbiBpcyBvbgogCTs7Ci0JLy8ocDE1KSBzc20gcHNyLmkgICAgICAgICAgICAgICAvLyByZXN0b3JlIHBzci5pCisJKHAxNSkgc3NtIHBzci5pICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwc3IuaQogCWFkZHMgcjM9OCxyMiAgICAgICAgICAgICAgICAvLyBzZXQgdXAgc2Vjb25kIGJhc2UgcG9pbnRlcgogCTs7CiAJS1ZNX1NBVkVfUkVTVApAQCAtODE5LDcgKzgxOSw3IEBACiAJOzsKIAlzcmx6LmkgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGludGVycnVwdGlvbiBjb2xsZWN0aW9uIGlzIG9uCiAJOzsKLQkvLyhwMTUpIHNzbSBwc3IuaSAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgcHNyLmkKKwkocDE1KSBzc20gcHNyLmkgICAgICAgICAgICAgICAvLyByZXN0b3JlIHBzci5pCiAJYWRkbCByMTQ9QGdwcmVsKGlhNjRfbGVhdmVfaHlwZXJ2aXNvcl9wcmVwYXJlKSxncAogCTs7CiAJS1ZNX1NBVkVfUkVTVApAQCAtODQyLDcgKzg0Miw3IEBACiAJOzsKIAlzcmx6LmkgICAvLyBndWFyYW50ZWUgdGhhdCBpbnRlcnJ1cHRpb24gY29sbGVjdGlvbiBpcyBvbgogCTs7Ci0JLy8ocDE1KSBzc20gcHNyLmkgICAgICAgICAgICAgICAvLyByZXN0b3JlIHBzci5pCisJKHAxNSkgc3NtIHBzci5pICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBwc3IuaQogCWFkZGwgcjE0PUBncHJlbChpYTY0X2xlYXZlX2h5cGVydmlzb3IpLGdwCiAJOzsKIAlLVk1fU0FWRV9SRVNUCkBAIC04NzEsNyArODcxLDcgQEAKIAk7OwogCXNybHouaSAgIC8vIGd1YXJhbnRlZSB0aGF0IGludGVycnVwdGlvbiBjb2xsZWN0aW9uIGlzIG9uCiAJOzsKLQkvLyhwMTUpIHNzbSBwc3IuaSAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgcHNyLmkKKwkocDE1KSBzc20gcHNyLmkgICAgICAgICAgICAgICAvLyByZXN0b3JlIHBzci5pCiAJYWRkbCByMTQ9QGdwcmVsKGlhNjRfbGVhdmVfaHlwZXJ2aXNvciksZ3AKIAk7OwogCUtWTV9TQVZFX1JFU1QKQEAgLTg5OCw3ICs4OTgsNyBAQAogCTs7CiAJc3Jsei5pICAgIC8vIGd1YXJhbnRlZSB0aGF0IGludGVycnVwdGlvbiBjb2xsZWN0aW9uIGlzIG9uCiAJOzsKLQkvLyhwMTUpIHNzbSBwc3IuaSAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgcHNyLmkKKwkocDE1KSBzc20gcHNyLmkgICAgICAgICAgICAgICAvLyByZXN0b3JlIHBzci5pCiAJYWRkbCByMTQ9QGdwcmVsKGlhNjRfbGVhdmVfaHlwZXJ2aXNvcl9wcmVwYXJlKSxncAogCTs7CiAJS1ZNX1NBVkVfUkVTVApAQCAtOTIwLDcgKzkyMCw3IEBACiAJOzsKIAlzcmx6LmkKIAk7OwotCS8vKHAxNSkgc3NtIHBzci5pCisJKHAxNSkgc3NtIHBzci5pCiAJYWRkbCByMTQ9QGdwcmVsKGlhNjRfbGVhdmVfaHlwZXJ2aXNvciksZ3AKIAk7OwogCUtWTV9TQVZFX1JFU1QKQEAgLTEzMzMsNyArMTMzMyw3IEBACiAJOzsKIChwNykgICAgc3Jsei5pCiAJOzsKLS8vKHA2KSAgICBzc20gcHNyLmkKKyhwNikgICAgc3NtIHBzci5pCiAJOzsKIAltb3YgcnA9cnBzYXZlCiAJbW92IGFyLnBmcz1wZnNzYXZlCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva3ZtL3Z0bGIuYyBiL2FyY2gvaWE2NC9rdm0vdnRsYi5jCmluZGV4IDJjMjUwMWYuLjQyOTBhNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rdm0vdnRsYi5jCisrKyBiL2FyY2gvaWE2NC9rdm0vdnRsYi5jCkBAIC0yNTQsNyArMjU0LDggQEAKIAkJCSIocDcpIHN0OCBbJTJdPXI5OzsiCiAJCQkic3NtIHBzci5pYzs7IgogCQkJInNybHouZDs7IgotCQkJLyogInNzbSBwc3IuaTs7IiBPbmNlIGludGVycnVwdHMgaW4gdm1tIG9wZW4sIG5lZWQgZml4Ki8KKwkJCSJzc20gcHNyLmk7OyIKKwkJCSJzcmx6LmQ7OyIKIAkJCTogIj1yIihyZXQpIDogInIiKGloYSksICJyIihwdGUpOiJtZW1vcnkiKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYwppbmRleCA2NmZkNzA1Li43NjRmMjZhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogCXJldHVybiBuZXdfaXJxX2luZm87CiB9CiAKLXN0YXRpYyB2b2lkIHNuX3NldF9hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCitzdGF0aWMgaW50IHNuX3NldF9hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbywgKnNuX2lycV9pbmZvX3NhZmU7CiAJbmFzaWRfdCBuYXNpZDsKQEAgLTIzOSw2ICsyMzksOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbl9pcnFfaW5mbywgc25faXJxX2luZm9fc2FmZSwKIAkJCQkgc25faXJxX2xoW2lycV0sIGxpc3QpCiAJCSh2b2lkKXNuX3JldGFyZ2V0X3ZlY3Rvcihzbl9pcnFfaW5mbywgbmFzaWQsIHNsaWNlKTsKKworCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMKaW5kZXggODFlNDI4OS4uZmJiZmI5NyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9tc2lfc24uYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIHNuX3NldF9tc2lfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsCitzdGF0aWMgaW50IHNuX3NldF9tc2lfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFzaykKIHsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAljcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9tYXNrKTsKIAlzbl9pcnFfaW5mbyA9IHNuX21zaV9pbmZvW2lycV0uc25faXJxX2luZm87CiAJaWYgKHNuX2lycV9pbmZvID09IE5VTEwgfHwgc25faXJxX2luZm8tPmlycV9pbnRfYml0ID49IDApCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJLyoKIAkgKiBSZWxlYXNlIFhJTyByZXNvdXJjZXMgZm9yIHRoZSBvbGQgTVNJIFBDSSBhZGRyZXNzCkBAIC0xODksNyArMTg5LDcgQEAKIAluZXdfaXJxX2luZm8gPSBzbl9yZXRhcmdldF92ZWN0b3Ioc25faXJxX2luZm8sIG5hc2lkLCBzbGljZSk7CiAJc25fbXNpX2luZm9baXJxXS5zbl9pcnFfaW5mbyA9IG5ld19pcnFfaW5mbzsKIAlpZiAobmV3X2lycV9pbmZvID09IE5VTEwpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJLyoKIAkgKiBNYXAgdGhlIHhpbyBhZGRyZXNzIGludG8gYnVzIHNwYWNlCkBAIC0yMDYsNiArMjA2LDggQEAKIAogCXdyaXRlX21zaV9tc2coaXJxLCAmbXNnKTsKIAljcHVtYXNrX2NvcHkoaXJxX2Rlc2NbaXJxXS5hZmZpbml0eSwgY3B1X21hc2spOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKaW5kZXggMWMxOWFmOC4uZDNhMGM4MSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQorc3RhdGljIGludCBvY3Rlb25faXJxX2NpdTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQogewogCWludCBjcHU7CiAJaW50IGJpdCA9IGlycSAtIE9DVEVPTl9JUlFfV09SS1EwOwkvKiBCaXQgMC02MyBvZiBFTjAgKi8KQEAgLTE5OSw2ICsxOTksOCBAQAogCSAqLwogCWN2bXhfcmVhZF9jc3IoQ1ZNWF9DSVVfSU5UWF9FTjAoY3ZteF9nZXRfY29yZV9udW0oKSAqIDIpKTsKIAl3cml0ZV91bmxvY2soJm9jdGVvbl9pcnFfY2l1MF9yd2xvY2spOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtMjkyLDcgKzI5NCw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBvY3Rlb25faXJxX2NpdTFfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQorc3RhdGljIGludCBvY3Rlb25faXJxX2NpdTFfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQogewogCWludCBjcHU7CiAJaW50IGJpdCA9IGlycSAtIE9DVEVPTl9JUlFfV0RPRzA7CS8qIEJpdCAwLTYzIG9mIEVOMSAqLwpAQCAtMzE1LDYgKzMxNyw4IEBACiAJICovCiAJY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMShjdm14X2dldF9jb3JlX251bSgpICogMiArIDEpKTsKIAl3cml0ZV91bmxvY2soJm9jdGVvbl9pcnFfY2l1MV9yd2xvY2spOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IDMyMTRhZGUuLjRmMWVlZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDX0lSUUFGRgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAotZXh0ZXJuIHZvaWQgcGxhdF9zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsCitleHRlcm4gaW50IHBsYXRfc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLAogCQkJCSAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5KTsKIGV4dGVybiB2b2lkIHNtdGNfZm9yd2FyZF9pcnEodW5zaWduZWQgaW50IGlycSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJxLWdpYy5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtZ2ljLmMKaW5kZXggODdkZWI4Zi4uM2Y0M2MyZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtZ2ljLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcnEtZ2ljLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGdpY19sb2NrKTsKIAotc3RhdGljIHZvaWQgZ2ljX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaykKK3N0YXRpYyBpbnQgZ2ljX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaykKIHsKIAljcHVtYXNrX3QJdG1wID0gQ1BVX01BU0tfTk9ORTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIAljcHVtYXNrX2FuZCgmdG1wLCBjcHVtYXNrLCBjcHVfb25saW5lX21hc2spOwogCWlmIChjcHVzX2VtcHR5KHRtcCkpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJLyogQXNzdW1wdGlvbiA6IGNwdW1hc2sgcmVmZXJzIHRvIGEgc2luZ2xlIENQVSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZnaWNfbG9jaywgZmxhZ3MpOwpAQCAtMTkwLDYgKzE5MCw3IEBACiAJY3B1bWFza19jb3B5KGlycV9kZXNjW2lycV0uYWZmaW5pdHksIGNwdW1hc2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdpY19sb2NrLCBmbGFncyk7CiAKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbXRpLW1hbHRhL21hbHRhLXNtdGMuYyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc210Yy5jCmluZGV4IDViYTMxODguLjQ5OWZmZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc210Yy5jCisrKyBiL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc210Yy5jCkBAIC0xMTQsNyArMTE0LDcgQEAKICAqLwogCiAKLXZvaWQgcGxhdF9zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSkKK2ludCBwbGF0X3NldF9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5KQogewogCWNwdW1hc2tfdCB0bWFzazsKIAlpbnQgY3B1ID0gMDsKQEAgLTE1Niw1ICsxNTYsNyBAQAogCiAJLyogRG8gYW55IGdlbmVyaWMgU01UQyBJUlEgYWZmaW5pdHkgc2V0dXAgKi8KIAlzbXRjX3NldF9pcnFfYWZmaW5pdHkoaXJxLCB0bWFzayk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDX0lSUUFGRiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCmluZGV4IGMxNDdjNGIuLjY5MGRlMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYworKysgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKQEAgLTUwLDcgKzUwLDcgQEAKIHN0YXRpYyB2b2lkIGRpc2FibGVfYmNtMTQ4MF9pcnEodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCBhY2tfYmNtMTQ4MF9pcnEodW5zaWduZWQgaW50IGlycSk7CiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgYmNtMTQ4MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOworc3RhdGljIGludCBiY20xNDgwX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTEwOSw3ICsxMDksNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgYmNtMTQ4MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCitzdGF0aWMgaW50IGJjbTE0ODBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCWludCBpID0gMCwgb2xkX2NwdSwgY3B1LCBpbnRfb24sIGs7CiAJdTY0IGN1cl9pbnRzOwpAQCAtMTE4LDcgKzExOCw3IEBACiAKIAlpZiAoY3B1bWFza193ZWlnaHQobWFzaykgIT0gMSkgewogCQlwcmludGsoImF0dGVtcHRlZCB0byBzZXQgaXJxIGFmZmluaXR5IGZvciBpcnEgJWQgdG8gbXVsdGlwbGUgQ1BVc1xuIiwgaXJxKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAJfQogCWkgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOwogCkBAIC0xNTIsNiArMTUyLDggQEAKIAkJfQogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiY20xNDgwX2ltcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9pcnEuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCmluZGV4IDM4Y2I5OTguLjQwOWRlYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgdm9pZCBkaXNhYmxlX3NiMTI1MF9pcnEodW5zaWduZWQgaW50IGlycSk7CiBzdGF0aWMgdm9pZCBhY2tfc2IxMjUwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBzYjEyNTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKTsKK3N0YXRpYyBpbnQgc2IxMjUwX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TSUJZVEVfSEFTX0xEVApAQCAtMTAzLDcgKzEwMyw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBzYjEyNTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQorc3RhdGljIGludCBzYjEyNTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCWludCBpID0gMCwgb2xkX2NwdSwgY3B1LCBpbnRfb247CiAJdTY0IGN1cl9pbnRzOwpAQCAtMTEzLDcgKzExMyw3IEBACiAKIAlpZiAoY3B1bWFza193ZWlnaHQobWFzaykgPiAxKSB7CiAJCXByaW50aygiYXR0ZW1wdGVkIHRvIHNldCBpcnEgYWZmaW5pdHkgZm9yIGlycSAlZCB0byBtdWx0aXBsZSBDUFVzXG4iLCBpcnEpOwotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAl9CiAKIAkvKiBDb252ZXJ0IGxvZ2ljYWwgQ1BVIHRvIHBoeXNpY2FsIENQVSAqLwpAQCAtMTQzLDYgKzE0Myw4IEBACiAJCQkJCVJfSU1SX0lOVEVSUlVQVF9NQVNLKSk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNiMTI1MF9pbXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL0tjb25maWcgYi9hcmNoL21uMTAzMDAvS2NvbmZpZwppbmRleCAzNTU5MjY3Li44OWZhYWNhIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvS2NvbmZpZworKysgYi9hcmNoL21uMTAzMDAvS2NvbmZpZwpAQCAtOCw2ICs4LDcgQEAKIGNvbmZpZyBNTjEwMzAwCiAJZGVmX2Jvb2wgeQogCXNlbGVjdCBIQVZFX09QUk9GSUxFCisJc2VsZWN0IEhBVkVfQVJDSF9UUkFDRUhPT0sKIAogY29uZmlnIEFNMzMKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggYmYwOWY4Yi4uNDkxMDU0NiAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMzQsNyArMzQsNyBAQAogICovCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2dyZWdfdDsKIAotI2RlZmluZSBFTEZfTkdSRUcgKHNpemVvZiAoc3RydWN0IHB0X3JlZ3MpIC8gc2l6ZW9mKGVsZl9ncmVnX3QpKQorI2RlZmluZSBFTEZfTkdSRUcgKChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpIC8gc2l6ZW9mKGVsZl9ncmVnX3QpKSAtIDEpCiB0eXBlZGVmIGVsZl9ncmVnX3QgZWxmX2dyZWdzZXRfdFtFTEZfTkdSRUddOwogCiAjZGVmaW5lIEVMRl9ORlBSRUcgMzIKQEAgLTc2LDYgKzc2LDcgQEAKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgVVNFX0VMRl9DT1JFX0RVTVAKKyNkZWZpbmUgQ09SRV9EVU1QX1VTRV9SRUdTRVQKICNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUJNDA5NgogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDczMjM5MjcuLmY3ZDRiMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTE0MywxMyArMTQzLDcgQEAKIAogdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAotI2RlZmluZSB0YXNrX3B0X3JlZ3ModGFzaykJCQkJCQlcCi0oewkJCQkJCQkJCVwKLSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqX19yZWdzX187CQkJCQlcCi0gICAgICAgX19yZWdzX18gPSAoc3RydWN0IHB0X3JlZ3MgKikgKEtTVEtfVE9QKHRhc2tfc3RhY2tfcGFnZSh0YXNrKSkgLSA4KTsgXAotICAgICAgIF9fcmVnc19fIC0gMTsJCQkJCQkJXAotfSkKLQorI2RlZmluZSB0YXNrX3B0X3JlZ3ModGFzaykgKCh0YXNrKS0+dGhyZWFkLnVyZWdzKQogI2RlZmluZSBLU1RLX0VJUCh0YXNrKSAodGFza19wdF9yZWdzKHRhc2spLT5wYykKICNkZWZpbmUgS1NUS19FU1AodGFzaykgKHRhc2tfcHRfcmVncyh0YXNrKS0+c3ApCiAKZGlmZiAtLWdpdCBhL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCA3YjA2Y2M2Li45MjE5NDJlIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC05MSw5ICs5MSwxNyBAQAogI2lmIGRlZmluZWQoX19LRVJORUxfXykKIAogI2lmICFkZWZpbmVkKF9fQVNTRU1CTFlfXykKK3N0cnVjdCB0YXNrX3N0cnVjdDsKKwogI2RlZmluZSB1c2VyX21vZGUocmVncykJCQkoKChyZWdzKS0+ZXBzdyAmIEVQU1dfblNMKSA9PSBFUFNXX25TTCkKICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQkoKHJlZ3MpLT5wYykKKyNkZWZpbmUgdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpCSgocmVncyktPnNwKQogZXh0ZXJuIHZvaWQgc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICopOworCisjZGVmaW5lIGFyY2hfaGFzX3NpbmdsZV9zdGVwKCkJKDEpCitleHRlcm4gdm9pZCB1c2VyX2VuYWJsZV9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCB1c2VyX2Rpc2FibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICopOworCiAjZW5kaWYgIC8qICAhX19BU1NFTUJMWSAgKi8KIAogI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpICgocmVncyktPnBjKQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9lbnRyeS5TCmluZGV4IDNkYzNlNDYuLjc0MDhhMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL2VudHJ5LlMKQEAgLTc2LDcgKzc2LDcgQEAKIAljbXAJbnJfc3lzY2FsbHMsZDAKIAliY2MJc3lzY2FsbF9iYWRzeXMKIAlidHN0CV9USUZfU1lTQ0FMTF9UUkFDRSwoVElfZmxhZ3MsYTIpCi0JYm5lCXN5c2NhbGxfdHJhY2VfZW50cnkKKwlibmUJc3lzY2FsbF9lbnRyeV90cmFjZQogc3lzY2FsbF9jYWxsOgogCWFkZAlkMCxkMCxhMQogCWFkZAlhMSxhMQpAQCAtMTA0LDExICsxMDQsMTAgQEAKIHN5c2NhbGxfZXhpdF93b3JrOgogCWJ0c3QJX1RJRl9TWVNDQUxMX1RSQUNFLGQyCiAJYmVxCXdvcmtfcGVuZGluZwotCV9fc3RpCQkJCSMgY291bGQgbGV0IGRvX3N5c2NhbGxfdHJhY2UoKSBjYWxsCisJX19zdGkJCQkJIyBjb3VsZCBsZXQgc3lzY2FsbF90cmFjZV9leGl0KCkgY2FsbAogCQkJCQkjIHNjaGVkdWxlKCkgaW5zdGVhZAogCW1vdglmcCxkMAotCW1vdgkxLGQxCi0JY2FsbAlkb19zeXNjYWxsX3RyYWNlW10sMAkjIGRvX3N5c2NhbGxfdHJhY2UocmVncyxlbnRyeWV4aXQpCisJY2FsbAlzeXNjYWxsX3RyYWNlX2V4aXRbXSwwCSMgZG9fc3lzY2FsbF90cmFjZShyZWdzKQogCWptcAlyZXN1bWVfdXNlcnNwYWNlCiAKIAlBTElHTgpAQCAtMTM4LDEzICsxMzcsMTEgQEAKIAlqbXAJcmVzdW1lX3VzZXJzcGFjZQogCiAJIyBwZXJmb3JtIHN5c2NhbGwgZW50cnkgdHJhY2luZwotc3lzY2FsbF90cmFjZV9lbnRyeToKK3N5c2NhbGxfZW50cnlfdHJhY2U6CiAJbW92CS1FTk9TWVMsZDAKIAltb3YJZDAsKFJFR19EMCxmcCkKIAltb3YJZnAsZDAKLQljbHIJZDEKLQljYWxsCWRvX3N5c2NhbGxfdHJhY2VbXSwwCi0JbW92CShSRUdfT1JJR19EMCxmcCksZDAKKwljYWxsCXN5c2NhbGxfdHJhY2VfZW50cnlbXSwwCSMgcmV0dXJucyB0aGUgc3lzY2FsbCBudW1iZXIgdG8gYWN0dWFsbHkgdXNlCiAJbW92CShSRUdfRDEsZnApLGQxCiAJY21wCW5yX3N5c2NhbGxzLGQwCiAJYmNzCXN5c2NhbGxfY2FsbApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggZDZkNmNkYy4uZTE0MzMzOSAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL3B0cmFjZS5jCkBAIC0xNyw2ICsxNyw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvcmVnc2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vob29rLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTY0LDEyICs2Nyw2IEBACiAJCSgodW5zaWduZWQgbG9uZykgdGFzay0+dGhyZWFkLnVyZWdzICsgb2Zmc2V0KTsKIH0KIAotLyoKLSAqIHRoaXMgcm91dGluZSB3aWxsIHB1dCBhIHdvcmQgb24gdGhlIHByb2Nlc3NlcyBwcml2aWxlZ2VkIHN0YWNrLgotICogdGhlIG9mZnNldCBpcyBob3cgZmFyIGZyb20gdGhlIGJhc2UgYWRkciBhcyBzdG9yZWQgaW4gdGhlIFRTUy4KLSAqIHRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgYWxsIHRoZSBwcml2aWxlZ2VkIHN0YWNrcyBhcmUgaW4gb3VyCi0gKiBkYXRhIHNwYWNlLgotICovCiBzdGF0aWMgaW5saW5lCiBpbnQgcHV0X3N0YWNrX2xvbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGRhdGEpCiB7CkBAIC04MCw0NCArNzcsMTkxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfZnByZWdzKHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0ICpidWYsCi0JCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQorLyoKKyAqIHJldHJpZXZlIHRoZSBjb250ZW50cyBvZiBNTjEwMzAwIHVzZXJzcGFjZSBnZW5lcmFsIHJlZ2lzdGVycworICovCitzdGF0aWMgaW50IGdlbnJlZ3NfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgICB2b2lkICprYnVmLCB2b2lkIF9fdXNlciAqdWJ1ZikKIHsKLQlyZXR1cm4gX19jb3B5X3RvX3VzZXIoYnVmLCAmdHNrLT50aHJlYWQuZnB1X3N0YXRlLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0KSk7Ci19CisJY29uc3Qgc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKKwlpbnQgcmV0OwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2V0X2ZwcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJCQkgICAgICAgc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QgKmJ1ZikKLXsKLQlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcigmdHNrLT50aHJlYWQuZnB1X3N0YXRlLCBidWYsCi0JCQkJc2l6ZW9mKHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0KSk7Ci19CisJLyogd2UgbmVlZCB0byBza2lwIHJlZ3MtPm5leHQgKi8KKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAgcmVncywgMCwgUFRfT1JJR19EMCAqIHNpemVvZihsb25nKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmcHNhdmVfaW5pdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0JbWVtc2V0KCZ0YXNrLT50aHJlYWQuZnB1X3N0YXRlLCAwLCBzaXplb2Yoc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QpKTsKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAgJnJlZ3MtPm9yaWdfZDAsIFBUX09SSUdfRDAgKiBzaXplb2YobG9uZyksCisJCQkJICBOUl9QVFJFR1MgKiBzaXplb2YobG9uZykpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXRfemVybygmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJTlJfUFRSRUdTICogc2l6ZW9mKGxvbmcpLCAtMSk7CiB9CiAKIC8qCi0gKiBtYWtlIHN1cmUgdGhlIHNpbmdsZSBzdGVwIGJpdCBpcyBub3Qgc2V0CisgKiB1cGRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNTjEwMzAwIHVzZXJzcGFjZSBnZW5lcmFsIHJlZ2lzdGVycwogICovCi12b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCitzdGF0aWMgaW50IGdlbnJlZ3Nfc2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAorCQkgICAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKIHsKLSNpZm5kZWYgQ09ORklHX01OMTAzMDBfVVNJTkdfSlRBRwotCXN0cnVjdCB1c2VyICpkdW1teSA9IE5VTEw7Ci0JbG9uZyB0bXA7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFyZ2V0KTsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwlpbnQgcmV0OwogCi0JdG1wID0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsICh1bnNpZ25lZCBsb25nKSAmZHVtbXktPnJlZ3MuZXBzdyk7Ci0JdG1wICY9IH5FUFNXX1Q7Ci0JcHV0X3N0YWNrX2xvbmcoY2hpbGQsICh1bnNpZ25lZCBsb25nKSAmZHVtbXktPnJlZ3MuZXBzdywgdG1wKTsKLSNlbmRpZgorCS8qIHdlIG5lZWQgdG8gc2tpcCByZWdzLT5uZXh0ICovCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSByZWdzLCAwLCBQVF9PUklHX0QwICogc2l6ZW9mKGxvbmcpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgJnJlZ3MtPm9yaWdfZDAsIFBUX09SSUdfRDAgKiBzaXplb2YobG9uZyksCisJCQkJIFBUX0VQU1cgKiBzaXplb2YobG9uZykpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogd2UgbmVlZCB0byBtYXNrIG9mZiBjaGFuZ2VzIHRvIEVQU1cgKi8KKwl0bXAgPSByZWdzLT5lcHN3OworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgJnRtcCwgUFRfRVBTVyAqIHNpemVvZihsb25nKSwKKwkJCQkgUFRfUEMgKiBzaXplb2YobG9uZykpOworCXRtcCAmPSBFUFNXX0ZMQUdfViB8IEVQU1dfRkxBR19DIHwgRVBTV19GTEFHX04gfCBFUFNXX0ZMQUdfWjsKKwl0bXAgfD0gcmVncy0+ZXBzdyAmIH4oRVBTV19GTEFHX1YgfCBFUFNXX0ZMQUdfQyB8IEVQU1dfRkxBR19OIHwKKwkJCSAgICAgIEVQU1dfRkxBR19aKTsKKwlyZWdzLT5lcHN3ID0gdG1wOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBhbmQgZmluYWxseSBsb2FkIHRoZSBQQyAqLworCXJldCA9IHVzZXJfcmVnc2V0X2NvcHlpbigmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkgJnJlZ3MtPnBjLCBQVF9QQyAqIHNpemVvZihsb25nKSwKKwkJCQkgTlJfUFRSRUdTICogc2l6ZW9mKGxvbmcpKTsKKworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlpbl9pZ25vcmUoJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCisJCQkJCSBOUl9QVFJFR1MgKiBzaXplb2YobG9uZyksIC0xKTsKIH0KIAogLyoKLSAqIHNldCB0aGUgc2luZ2xlIHN0ZXAgYml0CisgKiByZXRyaWV2ZSB0aGUgY29udGVudHMgb2YgTU4xMDMwMCB1c2Vyc3BhY2UgRlBVIHJlZ2lzdGVycwogICovCi12b2lkIHB0cmFjZV9lbmFibGUoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3N0YXRpYyBpbnQgZnB1cmVnc19nZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJICAgICAgIHZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQoreworCWNvbnN0IHN0cnVjdCBmcHVfc3RhdGVfc3RydWN0ICpmcHJlZ3MgPSAmdGFyZ2V0LT50aHJlYWQuZnB1X3N0YXRlOworCWludCByZXQ7CisKKwl1bmxhenlfZnB1KHRhcmdldCk7CisKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAgZnByZWdzLCAwLCBzaXplb2YoKmZwcmVncykpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHVzZXJfcmVnc2V0X2NvcHlvdXRfemVybygmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJc2l6ZW9mKCpmcHJlZ3MpLCAtMSk7Cit9CisKKy8qCisgKiB1cGRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNTjEwMzAwIHVzZXJzcGFjZSBGUFUgcmVnaXN0ZXJzCisgKi8KK3N0YXRpYyBpbnQgZnB1cmVnc19zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKKwkJICAgICAgIGNvbnN0IHZvaWQgKmtidWYsIGNvbnN0IHZvaWQgX191c2VyICp1YnVmKQoreworCXN0cnVjdCBmcHVfc3RhdGVfc3RydWN0IGZwdV9zdGF0ZSA9IHRhcmdldC0+dGhyZWFkLmZwdV9zdGF0ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAorCQkJCSAmZnB1X3N0YXRlLCAwLCBzaXplb2YoZnB1X3N0YXRlKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmcHVfa2lsbF9zdGF0ZSh0YXJnZXQpOworCXRhcmdldC0+dGhyZWFkLmZwdV9zdGF0ZSA9IGZwdV9zdGF0ZTsKKwlzZXRfdXNpbmdfZnB1KHRhcmdldCk7CisKKwlyZXR1cm4gdXNlcl9yZWdzZXRfY29weWluX2lnbm9yZSgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKKwkJCQkJIHNpemVvZihmcHVfc3RhdGUpLCAtMSk7Cit9CisKKy8qCisgKiBkZXRlcm1pbmUgaWYgdGhlIEZQVSByZWdpc3RlcnMgaGF2ZSBhY3R1YWxseSBiZWVuIHVzZWQKKyAqLworc3RhdGljIGludCBmcHVyZWdzX2FjdGl2ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKKwkJCSAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQpCit7CisJcmV0dXJuIGlzX3VzaW5nX2ZwdSh0YXJnZXQpID8gcmVnc2V0LT5uIDogMDsKK30KKworLyoKKyAqIERlZmluZSB0aGUgcmVnaXN0ZXIgc2V0cyBhdmFpbGFibGUgb24gdGhlIE1OMTAzMDAgdW5kZXIgTGludXgKKyAqLworZW51bSBtbjEwMzAwX3JlZ3NldCB7CisJUkVHU0VUX0dFTkVSQUwsCisJUkVHU0VUX0ZQVSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgbW4xMDMwMF9yZWdzZXRzW10gPSB7CisJLyoKKwkgKiBHZW5lcmFsIHJlZ2lzdGVyIGZvcm1hdCBpczoKKwkgKglBMywgQTIsIEQzLCBEMiwgTUNWRiwgTUNSTCwgTUNSSCwgTURSUQorCSAqCUUxLCBFMCwgRTcuLi5FMiwgU1AsIExBUiwgTElSLCBNRFIKKwkgKglBMSwgQTAsIEQxLCBEMCwgT1JJR19EMCwgRVBTVywgUEMKKwkgKi8KKwlbUkVHU0VUX0dFTkVSQUxdID0geworCQkuY29yZV9ub3RlX3R5cGUJPSBOVF9QUlNUQVRVUywKKwkJLm4JCT0gRUxGX05HUkVHLAorCQkuc2l6ZQkJPSBzaXplb2YobG9uZyksCisJCS5hbGlnbgkJPSBzaXplb2YobG9uZyksCisJCS5nZXQJCT0gZ2VucmVnc19nZXQsCisJCS5zZXQJCT0gZ2VucmVnc19zZXQsCisJfSwKKwkvKgorCSAqIEZQVSByZWdpc3RlciBmb3JtYXQgaXM6CisJICoJRlMwLTMxLCBGUENSCisJICovCisJW1JFR1NFVF9GUFVdID0geworCQkuY29yZV9ub3RlX3R5cGUJPSBOVF9QUkZQUkVHLAorCQkubgkJPSBzaXplb2Yoc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QpIC8gc2l6ZW9mKGxvbmcpLAorCQkuc2l6ZQkJPSBzaXplb2YobG9uZyksCisJCS5hbGlnbgkJPSBzaXplb2YobG9uZyksCisJCS5nZXQJCT0gZnB1cmVnc19nZXQsCisJCS5zZXQJCT0gZnB1cmVnc19zZXQsCisJCS5hY3RpdmUJCT0gZnB1cmVnc19hY3RpdmUsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXRfdmlldyB1c2VyX21uMTAzMDBfbmF0aXZlX3ZpZXcgPSB7CisJLm5hbWUJCT0gIm1uMTAzMDAiLAorCS5lX21hY2hpbmUJPSBFTV9NTjEwMzAwLAorCS5yZWdzZXRzCT0gbW4xMDMwMF9yZWdzZXRzLAorCS5uCQk9IEFSUkFZX1NJWkUobW4xMDMwMF9yZWdzZXRzKSwKK307CisKK2NvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldF92aWV3ICp0YXNrX3VzZXJfcmVnc2V0X3ZpZXcoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiAmdXNlcl9tbjEwMzAwX25hdGl2ZV92aWV3OworfQorCisvKgorICogc2V0IHRoZSBzaW5nbGUtc3RlcCBiaXQKKyAqLwordm9pZCB1c2VyX2VuYWJsZV9zaW5nbGVfc3RlcChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogewogI2lmbmRlZiBDT05GSUdfTU4xMDMwMF9VU0lOR19KVEFHCiAJc3RydWN0IHVzZXIgKmR1bW15ID0gTlVMTDsKQEAgLTEzMCw0NCArMjc0LDM2IEBACiB9CiAKIC8qCisgKiBtYWtlIHN1cmUgdGhlIHNpbmdsZS1zdGVwIGJpdCBpcyBub3Qgc2V0CisgKi8KK3ZvaWQgdXNlcl9kaXNhYmxlX3NpbmdsZV9zdGVwKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisjaWZuZGVmIENPTkZJR19NTjEwMzAwX1VTSU5HX0pUQUcKKwlzdHJ1Y3QgdXNlciAqZHVtbXkgPSBOVUxMOworCWxvbmcgdG1wOworCisJdG1wID0gZ2V0X3N0YWNrX2xvbmcoY2hpbGQsICh1bnNpZ25lZCBsb25nKSAmZHVtbXktPnJlZ3MuZXBzdyk7CisJdG1wICY9IH5FUFNXX1Q7CisJcHV0X3N0YWNrX2xvbmcoY2hpbGQsICh1bnNpZ25lZCBsb25nKSAmZHVtbXktPnJlZ3MuZXBzdywgdG1wKTsKKyNlbmRpZgorfQorCit2b2lkIHB0cmFjZV9kaXNhYmxlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCit7CisJdXNlcl9kaXNhYmxlX3NpbmdsZV9zdGVwKGNoaWxkKTsKK30KKworLyoKICAqIGhhbmRsZSB0aGUgYXJjaC1zcGVjaWZpYyBzaWRlIG9mIHByb2Nlc3MgdHJhY2luZwogICovCiBsb25nIGFyY2hfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIGxvbmcgcmVxdWVzdCwgbG9uZyBhZGRyLCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QgZnB1X3N0YXRlOwotCWludCBpLCByZXQ7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJaW50IHJldDsKIAogCXN3aXRjaCAocmVxdWVzdCkgewotCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLVEVYVDogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkci4gKi8KLQljYXNlIFBUUkFDRV9QRUVLREFUQTogewotCQl1bnNpZ25lZCBsb25nIHRtcDsKLQkJaW50IGNvcGllZDsKLQotCQljb3BpZWQgPSBhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJnRtcCwgc2l6ZW9mKHRtcCksIDApOwotCQlyZXQgPSAtRUlPOwotCQlpZiAoY29waWVkICE9IHNpemVvZih0bXApKQotCQkJYnJlYWs7Ci0JCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7Ci0JCWJyZWFrOwotCX0KLQogCS8qIHJlYWQgdGhlIHdvcmQgYXQgbG9jYXRpb24gYWRkciBpbiB0aGUgVVNFUiBhcmVhLiAqLwotCWNhc2UgUFRSQUNFX1BFRUtVU1I6IHsKLQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0KKwljYXNlIFBUUkFDRV9QRUVLVVNSOgogCQlyZXQgPSAtRUlPOwogCQlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCB8fAogCQkgICAgYWRkciA+IHNpemVvZihzdHJ1Y3QgdXNlcikgLSAzKQpAQCAtMTc5LDE3ICszMTUsNiBAQAogCQkJCQkgICAgIHB0cmFjZV9yZWdpZF90b19mcmFtZVthZGRyXSk7CiAJCXJldCA9IHB1dF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7CiAJCWJyZWFrOwotCX0KLQotCS8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIuICovCi0JY2FzZSBQVFJBQ0VfUE9LRVRFWFQ6Ci0JY2FzZSBQVFJBQ0VfUE9LRURBVEE6Ci0JCWlmIChhY2Nlc3NfcHJvY2Vzc192bShjaGlsZCwgYWRkciwgJmRhdGEsIHNpemVvZihkYXRhKSwgMSkgPT0KLQkJICAgIHNpemVvZihkYXRhKSkKLQkJCXJldCA9IDA7Ci0JCWVsc2UKLQkJCXJldCA9IC1FSU87Ci0JCWJyZWFrOwogCiAJCS8qIHdyaXRlIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYSAqLwogCWNhc2UgUFRSQUNFX1BPS0VVU1I6CkBAIC0yMDQsMTMyICszMjksMzIgQEAKIAkJCQkJICAgICBkYXRhKTsKIAkJYnJlYWs7CiAKLQkJLyogY29udGludWUgYW5kIHN0b3AgYXQgbmV4dCAocmV0dXJuIGZyb20pIHN5c2NhbGwgKi8KLQljYXNlIFBUUkFDRV9TWVNDQUxMOgotCQkvKiByZXN0YXJ0IGFmdGVyIHNpZ25hbC4gKi8KLQljYXNlIFBUUkFDRV9DT05UOgotCQlyZXQgPSAtRUlPOwotCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGRhdGEgPiBfTlNJRykKLQkJCWJyZWFrOwotCQlpZiAocmVxdWVzdCA9PSBQVFJBQ0VfU1lTQ0FMTCkKLQkJCXNldF90c2tfdGhyZWFkX2ZsYWcoY2hpbGQsIFRJRl9TWVNDQUxMX1RSQUNFKTsKLQkJZWxzZQotCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU1lTQ0FMTF9UUkFDRSk7Ci0JCWNoaWxkLT5leGl0X2NvZGUgPSBkYXRhOwotCQlwdHJhY2VfZGlzYWJsZShjaGlsZCk7Ci0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOworCWNhc2UgUFRSQUNFX0dFVFJFR1M6CS8qIEdldCBhbGwgaW50ZWdlciByZWdzIGZyb20gdGhlIGNoaWxkLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfdG9fdXNlcihjaGlsZCwgJnVzZXJfbW4xMDMwMF9uYXRpdmVfdmlldywKKwkJCQkJICAgUkVHU0VUX0dFTkVSQUwsCisJCQkJCSAgIDAsIE5SX1BUUkVHUyAqIHNpemVvZihsb25nKSwKKwkJCQkJICAgKHZvaWQgX191c2VyICopZGF0YSk7CiAKLQkJLyoKLQkJICogbWFrZSB0aGUgY2hpbGQgZXhpdAotCQkgKiAtIHRoZSBiZXN0IEkgY2FuIGRvIGlzIHNlbmQgaXQgYSBzaWdraWxsCi0JCSAqIC0gcGVyaGFwcyBpdCBzaG91bGQgYmUgcHV0IGluIHRoZSBzdGF0dXMgdGhhdCBpdCB3YW50cyB0bwotCQkgKiAgIGV4aXQKLQkJICovCi0JY2FzZSBQVFJBQ0VfS0lMTDoKLQkJcmV0ID0gMDsKLQkJaWYgKGNoaWxkLT5leGl0X3N0YXRlID09IEVYSVRfWk9NQklFKQkvKiBhbHJlYWR5IGRlYWQgKi8KLQkJCWJyZWFrOwotCQljaGlsZC0+ZXhpdF9jb2RlID0gU0lHS0lMTDsKLQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfU0lOR0xFU1RFUCk7Ci0JCXB0cmFjZV9kaXNhYmxlKGNoaWxkKTsKLQkJd2FrZV91cF9wcm9jZXNzKGNoaWxkKTsKLQkJYnJlYWs7CisJY2FzZSBQVFJBQ0VfU0VUUkVHUzoJLyogU2V0IGFsbCBpbnRlZ2VyIHJlZ3MgaW4gdGhlIGNoaWxkLiAqLworCQlyZXR1cm4gY29weV9yZWdzZXRfZnJvbV91c2VyKGNoaWxkLCAmdXNlcl9tbjEwMzAwX25hdGl2ZV92aWV3LAorCQkJCQkgICAgIFJFR1NFVF9HRU5FUkFMLAorCQkJCQkgICAgIDAsIE5SX1BUUkVHUyAqIHNpemVvZihsb25nKSwKKwkJCQkJICAgICAoY29uc3Qgdm9pZCBfX3VzZXIgKilkYXRhKTsKIAotCWNhc2UgUFRSQUNFX1NJTkdMRVNURVA6IC8qIHNldCB0aGUgdHJhcCBmbGFnLiAqLwotI2lmbmRlZiBDT05GSUdfTU4xMDMwMF9VU0lOR19KVEFHCi0JCXJldCA9IC1FSU87Ci0JCWlmICgodW5zaWduZWQgbG9uZykgZGF0YSA+IF9OU0lHKQotCQkJYnJlYWs7Ci0JCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfVFJBQ0UpOwotCQlwdHJhY2VfZW5hYmxlKGNoaWxkKTsKLQkJY2hpbGQtPmV4aXRfY29kZSA9IGRhdGE7Ci0JCXdha2VfdXBfcHJvY2VzcyhjaGlsZCk7Ci0JCXJldCA9IDA7Ci0jZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotI2VuZGlmCi0JCWJyZWFrOworCWNhc2UgUFRSQUNFX0dFVEZQUkVHUzoJLyogR2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCisJCXJldHVybiBjb3B5X3JlZ3NldF90b191c2VyKGNoaWxkLCAmdXNlcl9tbjEwMzAwX25hdGl2ZV92aWV3LAorCQkJCQkgICBSRUdTRVRfRlBVLAorCQkJCQkgICAwLCBzaXplb2Yoc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QpLAorCQkJCQkgICAodm9pZCBfX3VzZXIgKilkYXRhKTsKIAotCWNhc2UgUFRSQUNFX0RFVEFDSDoJLyogZGV0YWNoIGEgcHJvY2VzcyB0aGF0IHdhcyBhdHRhY2hlZC4gKi8KLQkJcmV0ID0gcHRyYWNlX2RldGFjaChjaGlsZCwgZGF0YSk7Ci0JCWJyZWFrOwotCi0JCS8qIEdldCBhbGwgZ3AgcmVncyBmcm9tIHRoZSBjaGlsZC4gKi8KLQljYXNlIFBUUkFDRV9HRVRSRUdTOiB7Ci0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHVuc2lnbmVkICopIGRhdGEsIE5SX1BUUkVHUyA8PCAyKSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IE5SX1BUUkVHUyA8PCAyOyBpICs9IDQpIHsKLQkJCXRtcCA9IGdldF9zdGFja19sb25nKGNoaWxkLCBwdHJhY2VfcmVnaWRfdG9fZnJhbWVbaV0pOwotCQkJX19wdXRfdXNlcih0bXAsICh1bnNpZ25lZCBsb25nICopIGRhdGEpOwotCQkJZGF0YSArPSBzaXplb2YodG1wKTsKLQkJfQotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TRVRSRUdTOiB7IC8qIFNldCBhbGwgZ3AgcmVncyBpbiB0aGUgY2hpbGQuICovCi0JCXVuc2lnbmVkIGxvbmcgdG1wOwotCi0JCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCAodW5zaWduZWQgbG9uZyAqKWRhdGEsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSkpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCBOUl9QVFJFR1MgPDwgMjsgaSArPSA0KSB7Ci0JCQlfX2dldF91c2VyKHRtcCwgKHVuc2lnbmVkIGxvbmcgKikgZGF0YSk7Ci0JCQlwdXRfc3RhY2tfbG9uZyhjaGlsZCwgcHRyYWNlX3JlZ2lkX3RvX2ZyYW1lW2ldLCB0bXApOwotCQkJZGF0YSArPSBzaXplb2YodG1wKTsKLQkJfQotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9HRVRGUFJFR1M6IHsgLyogR2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCi0JCWlmIChpc191c2luZ19mcHUoY2hpbGQpKSB7Ci0JCQl1bmxhenlfZnB1KGNoaWxkKTsKLQkJCWZwdV9zdGF0ZSA9IGNoaWxkLT50aHJlYWQuZnB1X3N0YXRlOwotCQl9IGVsc2UgewotCQkJbWVtc2V0KCZmcHVfc3RhdGUsIDAsIHNpemVvZihmcHVfc3RhdGUpKTsKLQkJfQotCi0JCXJldCA9IC1FSU87Ci0JCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgZGF0YSwgJmZwdV9zdGF0ZSwKLQkJCQkgc2l6ZW9mKGZwdV9zdGF0ZSkpID09IDApCi0JCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TRVRGUFJFR1M6IHsgLyogU2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCi0JCXJldCA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmZnB1X3N0YXRlLCAoY29uc3Qgdm9pZCAqKSBkYXRhLAotCQkJCSAgIHNpemVvZihmcHVfc3RhdGUpKSA9PSAwKSB7Ci0JCQlmcHVfa2lsbF9zdGF0ZShjaGlsZCk7Ci0JCQljaGlsZC0+dGhyZWFkLmZwdV9zdGF0ZSA9IGZwdV9zdGF0ZTsKLQkJCXNldF91c2luZ19mcHUoY2hpbGQpOwotCQkJcmV0ID0gMDsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQljYXNlIFBUUkFDRV9TRVRPUFRJT05TOiB7Ci0JCWlmIChkYXRhICYgUFRSQUNFX09fVFJBQ0VTWVNHT09EKQotCQkJY2hpbGQtPnB0cmFjZSB8PSBQVF9UUkFDRVNZU0dPT0Q7Ci0JCWVsc2UKLQkJCWNoaWxkLT5wdHJhY2UgJj0gflBUX1RSQUNFU1lTR09PRDsKLQkJcmV0ID0gMDsKLQkJYnJlYWs7Ci0JfQorCWNhc2UgUFRSQUNFX1NFVEZQUkVHUzoJLyogU2V0IHRoZSBjaGlsZCBGUFUgc3RhdGUuICovCisJCXJldHVybiBjb3B5X3JlZ3NldF9mcm9tX3VzZXIoY2hpbGQsICZ1c2VyX21uMTAzMDBfbmF0aXZlX3ZpZXcsCisJCQkJCSAgICAgUkVHU0VUX0ZQVSwKKwkJCQkJICAgICAwLCBzaXplb2Yoc3RydWN0IGZwdV9zdGF0ZV9zdHJ1Y3QpLAorCQkJCQkgICAgIChjb25zdCB2b2lkIF9fdXNlciAqKWRhdGEpOwogCiAJZGVmYXVsdDoKLQkJcmV0ID0gLUVJTzsKKwkJcmV0ID0gcHRyYWNlX3JlcXVlc3QoY2hpbGQsIHJlcXVlc3QsIGFkZHIsIGRhdGEpOwogCQlicmVhazsKIAl9CiAKQEAgLTMzNyw0MyArMzYyLDI2IEBACiB9CiAKIC8qCi0gKiBub3RpZmljYXRpb24gb2Ygc3lzdGVtIGNhbGwgZW50cnkvZXhpdAotICogLSB0cmlnZ2VyZWQgYnkgY3VycmVudC0+d29yay5zeXNjYWxsX3RyYWNlCisgKiBoYW5kbGUgdHJhY2luZyBvZiBzeXN0ZW0gY2FsbCBlbnRyeQorICogLSByZXR1cm4gdGhlIHJldmlzZWQgc3lzdGVtIGNhbGwgbnVtYmVyIG9yIFVMT05HX01BWCB0byBjYXVzZSBFTk9TWVMKICAqLwotYXNtbGlua2FnZSB2b2lkIGRvX3N5c2NhbGxfdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBlbnRyeWV4aXQpCithc21saW5rYWdlIHVuc2lnbmVkIGxvbmcgc3lzY2FsbF90cmFjZV9lbnRyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZiAwCi0JLyoganVzdCBpbiBjYXNlLi4uICovCi0JcHJpbnRrKEtFUk5fREVCVUcgIlslZF0gc3lzY2FsbF8lbHUoJWx4LCVseCwlbHgsJWx4KSA9ICVseFxuIiwKLQkgICAgICAgY3VycmVudC0+cGlkLAotCSAgICAgICByZWdzLT5vcmlnX2QwLAotCSAgICAgICByZWdzLT5hMCwKLQkgICAgICAgcmVncy0+ZDEsCi0JICAgICAgIHJlZ3MtPmEzLAotCSAgICAgICByZWdzLT5hMiwKLQkgICAgICAgcmVncy0+ZDApOwotCXJldHVybjsKLSNlbmRpZgorCWlmICh0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZW50cnkocmVncykpCisJCS8qIHRyYWNpbmcgZGVjaWRlZCB0aGlzIHN5c2NhbGwgc2hvdWxkIG5vdCBoYXBwZW4sIHNvCisJCSAqIFdlJ2xsIHJldHVybiBhIGJvZ3VzIGNhbGwgbnVtYmVyIHRvIGdldCBhbiBFTk9TWVMKKwkJICogZXJyb3IsIGJ1dCBsZWF2ZSB0aGUgb3JpZ2luYWwgbnVtYmVyIGluCisJCSAqIHJlZ3MtPm9yaWdfZDAKKwkJICovCisJCXJldHVybiBVTE9OR19NQVg7CiAKLQlpZiAoIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTExfVFJBQ0UpICYmCi0JICAgICF0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKLQkJcmV0dXJuOwotCWlmICghKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKQotCQlyZXR1cm47CisJcmV0dXJuIHJlZ3MtPm9yaWdfZDA7Cit9CiAKLQkvKiB0aGUgMHg4MCBwcm92aWRlcyBhIHdheSBmb3IgdGhlIHRyYWNpbmcgcGFyZW50IHRvIGRpc3Rpbmd1aXNoCi0JICAgYmV0d2VlbiBhIHN5c2NhbGwgc3RvcCBhbmQgU0lHVFJBUCBkZWxpdmVyeSAqLwotCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCB8Ci0JCSAgICAgICgoY3VycmVudC0+cHRyYWNlICYgUFRfVFJBQ0VTWVNHT09EKSAmJgotCQkgICAgICAgIXRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApID8gMHg4MCA6IDApKTsKLQotCS8qCi0JICogdGhpcyBpc24ndCB0aGUgc2FtZSBhcyBjb250aW51aW5nIHdpdGggYSBzaWduYWwsIGJ1dCBpdCB3aWxsIGRvCi0JICogZm9yIG5vcm1hbCB1c2UuICBzdHJhY2Ugb25seSBjb250aW51ZXMgd2l0aCBhIHNpZ25hbCBpZiB0aGUKLQkgKiBzdG9wcGluZyBzaWduYWwgaXMgbm90IFNJR1RSQVAuICAtYnJsCi0JICovCi0JaWYgKGN1cnJlbnQtPmV4aXRfY29kZSkgewotCQlzZW5kX3NpZyhjdXJyZW50LT5leGl0X2NvZGUsIGN1cnJlbnQsIDEpOwotCQljdXJyZW50LT5leGl0X2NvZGUgPSAwOwotCX0KKy8qCisgKiBoYW5kbGUgdHJhY2luZyBvZiBzeXN0ZW0gY2FsbCBleGl0CisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBzeXNjYWxsX3RyYWNlX2V4aXQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2V4aXQocmVncywgMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9zaWduYWwuYwppbmRleCA4NDFjYTk5Li45Zjc1NzJhIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc2lnbmFsLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS91Y29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC01MTEsNiArNTEyLDkgQEAKIAkJCSAqIGNsZWFyIHRoZSBUSUZfUkVTVE9SRV9TSUdNQVNLIGZsYWcgKi8KIAkJCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQogCQkJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCisJCQl0cmFjZWhvb2tfc2lnbmFsX2hhbmRsZXIoc2lnbnIsICZpbmZvLCAma2EsIHJlZ3MsCisJCQkJCQkgdGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpOwogCQl9CiAKIAkJcmV0dXJuOwpAQCAtNTYxLDQgKzU2NSw5IEBACiAJLyogZGVhbCB3aXRoIHBlbmRpbmcgc2lnbmFsIGRlbGl2ZXJ5ICovCiAJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgKF9USUZfU0lHUEVORElORyB8IF9USUZfUkVTVE9SRV9TSUdNQVNLKSkKIAkJZG9fc2lnbmFsKHJlZ3MpOworCisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgX1RJRl9OT1RJRllfUkVTVU1FKSB7CisJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9OT1RJRllfUkVTVU1FKTsKKwkJdHJhY2Vob29rX25vdGlmeV9yZXN1bWUoX19mcmFtZSk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL21tL3RsYi1tbjEwMzAwLlMgYi9hcmNoL21uMTAzMDAvbW0vdGxiLW1uMTAzMDAuUwppbmRleCA3ODkyMDgwLi43MDk1MTQ3IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvbW0vdGxiLW1uMTAzMDAuUworKysgYi9hcmNoL21uMTAzMDAvbW0vdGxiLW1uMTAzMDAuUwpAQCAtMTY1LDI0ICsxNjUsNiBAQAogRU5UUlkoZHRsYl9hZXJyb3IpCiAJYW5kCX5FUFNXX05NSUQsZXBzdwogCWFkZAktNCxzcAotCW1vdglkMSwoc3ApCi0KLQltb3ZodQkoTU1VRkNSX0RGQyksZDEJCQkjIGlzIGl0IHRoZSBpbml0aWFsIHZhbGlkIHdyaXRlCi0JCQkJCQkjIHRvIHRoaXMgcGFnZT8KLQlhbmQJTU1VRkNSX3hGQ19JTklUV1IsZDEKLSAJYmVxCWR0bGJfcGFnZWZhdWx0CQkJIyBqdW1wIGlmIG5vdAotCi0JbW92CShEUFRFTCksZDEJCQkjIHNldCB0aGUgZGlydHkgYml0Ci0JCQkJCQkjIChkb24ndCByZXBsYWNlIHdpdGggQlNFVCEpCi0Jb3IJX1BBR0VfRElSVFksZDEKLQltb3YJZDEsKERQVEVMKQotCW1vdgkoc3ApLGQxCi0JYWRkCTQsc3AKLSAJcnRpCi0KLQlBTElHTgotZHRsYl9wYWdlZmF1bHQ6Ci0JbW92CShzcCksZDEKIAlTQVZFX0FMTAogCWFkZAktNCxzcAkJCQkjIG5lZWQgdG8gcGFzcyB0aHJlZSBwYXJhbXMKIApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jCmluZGV4IDRlYTQyMjkuLjgwMDdmMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMKQEAgLTEzMCwxNSArMTMwLDE3IEBACiAJcmV0dXJuIGNwdV9kZXN0OwogfQogCi1zdGF0aWMgdm9pZCBjcHVfc2V0X2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCkKK3N0YXRpYyBpbnQgY3B1X3NldF9hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCiB7CiAJaW50IGNwdV9kZXN0OwogCiAJY3B1X2Rlc3QgPSBjcHVfY2hlY2tfYWZmaW5pdHkoaXJxLCBkZXN0KTsKIAlpZiAoY3B1X2Rlc3QgPCAwKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCWNwdW1hc2tfY29weSgmaXJxX2Rlc2NbaXJxXS5hZmZpbml0eSwgZGVzdCk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHdfaXJxLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHdfaXJxLmgKaW5kZXggYjdlMDM0Yi4uMjBhNDRkMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h3X2lycS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9od19pcnEuaApAQCAtMTMxLDUgKzEzMSw0NCBAQAogICovCiBzdHJ1Y3QgaXJxX2NoaXA7CiAKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRlc3RfcGVyZl9jb3VudGVyX3BlbmRpbmcodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisKKwlhc20gdm9sYXRpbGUoImxieiAlMCwlMSgxMykiCisJCTogIj1yIiAoeCkKKwkJOiAiaSIgKG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgcGVyZl9jb3VudGVyX3BlbmRpbmcpKSk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGVyZl9jb3VudGVyX3BlbmRpbmcodm9pZCkKK3sKKwlhc20gdm9sYXRpbGUoInN0YiAlMCwlMSgxMykiIDogOgorCQkiciIgKDEpLAorCQkiaSIgKG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgcGVyZl9jb3VudGVyX3BlbmRpbmcpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9wZXJmX2NvdW50ZXJfcGVuZGluZyh2b2lkKQoreworCWFzbSB2b2xhdGlsZSgic3RiICUwLCUxKDEzKSIgOiA6CisJCSJyIiAoMCksCisJCSJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBwZXJmX2NvdW50ZXJfcGVuZGluZykpKTsKK30KKworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2RvX3BlbmRpbmcodm9pZCk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0ZXN0X3BlcmZfY291bnRlcl9wZW5kaW5nKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGVyZl9jb3VudGVyX3BlbmRpbmcodm9pZCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9wZXJmX2NvdW50ZXJfcGVuZGluZyh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9kb19wZW5kaW5nKHZvaWQpIHt9CisjZW5kaWYgLyogQ09ORklHX1BFUkZfQ09VTlRFUlMgKi8KKwogI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgkvKiBfQVNNX1BPV0VSUENfSFdfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCmluZGV4IDA4MmIzYWUuLjZlZjA1NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaApAQCAtOTksNiArOTksNyBAQAogCXU4IHNvZnRfZW5hYmxlZDsJCS8qIGlycSBzb2Z0LWVuYWJsZSBmbGFnICovCiAJdTggaGFyZF9lbmFibGVkOwkJLyogc2V0IGlmIGlycXMgYXJlIGVuYWJsZWQgaW4gTVNSICovCiAJdTggaW9fc3luYzsJCQkvKiB3cml0ZWwoKSBuZWVkcyBzcGluX3VubG9jayBzeW5jICovCisJdTggcGVyZl9jb3VudGVyX3BlbmRpbmc7CS8qIFBNIGludGVycnVwdCB3aGlsZSBzb2Z0LWRpc2FibGVkICovCiAKIAkvKiBTdHVmZiBmb3IgYWNjdXJhdGUgdGltZSBhY2NvdW50aW5nICovCiAJdTY0IHVzZXJfdGltZTsJCQkvKiBhY2N1bXVsYXRlZCB1c2VybW9kZSBUQiB0aWNrcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BlcmZfY291bnRlci5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BlcmZfY291bnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjN2M4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGVyZl9jb3VudGVyLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgc3VwcG9ydCAtIFBvd2VyUEMtc3BlY2lmaWMgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBQYXVsIE1hY2tlcnJhcywgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIE1BWF9IV0NPVU5URVJTCQk4CisjZGVmaW5lIE1BWF9FVkVOVF9BTFRFUk5BVElWRVMJOAorI2RlZmluZSBNQVhfTElNSVRFRF9IV0NPVU5URVJTCTIKKworLyoKKyAqIFRoaXMgc3RydWN0IHByb3ZpZGVzIHRoZSBjb25zdGFudHMgYW5kIGZ1bmN0aW9ucyBuZWVkZWQgdG8KKyAqIGRlc2NyaWJlIHRoZSBQTVUgb24gYSBwYXJ0aWN1bGFyIFBPV0VSLWZhbWlseSBDUFUuCisgKi8KK3N0cnVjdCBwb3dlcl9wbXUgeworCWludAluX2NvdW50ZXI7CisJaW50CW1heF9hbHRlcm5hdGl2ZXM7CisJdTY0CWFkZF9maWVsZHM7CisJdTY0CXRlc3RfYWRkZXI7CisJaW50CSgqY29tcHV0ZV9tbWNyKSh1NjQgZXZlbnRzW10sIGludCBuX2V2LAorCQkJCXVuc2lnbmVkIGludCBod2NbXSwgdTY0IG1tY3JbXSk7CisJaW50CSgqZ2V0X2NvbnN0cmFpbnQpKHU2NCBldmVudCwgdTY0ICptc2twLCB1NjQgKnZhbHApOworCWludAkoKmdldF9hbHRlcm5hdGl2ZXMpKHU2NCBldmVudCwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJCSAgICB1NjQgYWx0W10pOworCXZvaWQJKCpkaXNhYmxlX3BtYykodW5zaWduZWQgaW50IHBtYywgdTY0IG1tY3JbXSk7CisJaW50CSgqbGltaXRlZF9wbWNfZXZlbnQpKHU2NCBldmVudCk7CisJdTMyCWZsYWdzOworCWludAluX2dlbmVyaWM7CisJaW50CSpnZW5lcmljX2V2ZW50czsKKwlpbnQJKCpjYWNoZV9ldmVudHMpW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJICAgICAgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCSAgICAgICBbUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYXTsKK307CisKK2V4dGVybiBzdHJ1Y3QgcG93ZXJfcG11ICpwcG11OworCisvKgorICogVmFsdWVzIGZvciBwb3dlcl9wbXUuZmxhZ3MKKyAqLworI2RlZmluZSBQUE1VX0xJTUlURURfUE1DNV82CTEJLyogUE1DNS82IGhhdmUgbGltaXRlZCBmdW5jdGlvbiAqLworI2RlZmluZSBQUE1VX0FMVF9TSVBSCQkyCS8qIHVzZXMgYWx0ZXJuYXRlIHBvc24gZm9yIFNJUFIvSFYgKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgZmxhZ3MgdG8gZ2V0X2FsdGVybmF0aXZlcygpCisgKi8KKyNkZWZpbmUgUFBNVV9MSU1JVEVEX1BNQ19PSwkxCS8qIGNhbiBwdXQgdGhpcyBvbiBhIGxpbWl0ZWQgUE1DICovCisjZGVmaW5lIFBQTVVfTElNSVRFRF9QTUNfUkVRRAkyCS8qIGhhdmUgdG8gcHV0IHRoaXMgb24gYSBsaW1pdGVkIFBNQyAqLworI2RlZmluZSBQUE1VX09OTFlfQ09VTlRfUlVOCTQJLyogb25seSBjb3VudGluZyBpbiBydW4gc3RhdGUgKi8KKworc3RydWN0IHB0X3JlZ3M7CitleHRlcm4gdW5zaWduZWQgbG9uZyBwZXJmX21pc2NfZmxhZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworI2RlZmluZSBwZXJmX21pc2NfZmxhZ3MocmVncykJcGVyZl9taXNjX2ZsYWdzKHJlZ3MpCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBlcmZfaW5zdHJ1Y3Rpb25fcG9pbnRlcihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKKy8qCisgKiBUaGUgcG93ZXJfcG11LmdldF9jb25zdHJhaW50IGZ1bmN0aW9uIHJldHVybnMgYSA2NC1iaXQgdmFsdWUgYW5kCisgKiBhIDY0LWJpdCBtYXNrIHRoYXQgZXhwcmVzcyB0aGUgY29uc3RyYWludHMgYmV0d2VlbiB0aGlzIGV2ZW50IGFuZAorICogb3RoZXIgZXZlbnRzLgorICoKKyAqIFRoZSB2YWx1ZSBhbmQgbWFzayBhcmUgZGl2aWRlZCB1cCBpbnRvIChub24tb3ZlcmxhcHBpbmcpIGJpdGZpZWxkcworICogb2YgdGhyZWUgZGlmZmVyZW50IHR5cGVzOgorICoKKyAqIFNlbGVjdCBmaWVsZDogdGhpcyBleHByZXNzZXMgdGhlIGNvbnN0cmFpbnQgdGhhdCBzb21lIHNldCBvZiBiaXRzCisgKiBpbiBNTUNSKiBuZWVkcyB0byBiZSBzZXQgdG8gYSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhpcyBldmVudC4gIEZvciBhCisgKiBzZWxlY3QgZmllbGQsIHRoZSBtYXNrIGNvbnRhaW5zIDFzIGluIGV2ZXJ5IGJpdCBvZiB0aGUgZmllbGQsIGFuZAorICogdGhlIHZhbHVlIGNvbnRhaW5zIGEgdW5pcXVlIHZhbHVlIGZvciBlYWNoIHBvc3NpYmxlIHNldHRpbmcgb2YgdGhlCisgKiBNTUNSKiBiaXRzLiAgVGhlIGNvbnN0cmFpbnQgY2hlY2tpbmcgY29kZSB3aWxsIGVuc3VyZSB0aGF0IHR3byBldmVudHMKKyAqIHRoYXQgc2V0IHRoZSBzYW1lIGZpZWxkIGluIHRoZWlyIG1hc2tzIGhhdmUgdGhlIHNhbWUgdmFsdWUgaW4gdGhlaXIKKyAqIHZhbHVlIGR3b3Jkcy4KKyAqCisgKiBBZGQgZmllbGQ6IHRoaXMgZXhwcmVzc2VzIHRoZSBjb25zdHJhaW50IHRoYXQgdGhlcmUgY2FuIGJlIGF0IG1vc3QKKyAqIE4gZXZlbnRzIGluIGEgcGFydGljdWxhciBjbGFzcy4gIEEgZmllbGQgb2YgayBiaXRzIGNhbiBiZSB1c2VkIGZvcgorICogTiA8PSAyXihrLTEpIC0gMS4gIFRoZSBtYXNrIGhhcyB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGZpZWxkCisgKiBzZXQgKGFuZCB0aGUgb3RoZXIgYml0cyAwKSwgYW5kIHRoZSB2YWx1ZSBoYXMgb25seSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKKyAqIGJpdCBvZiB0aGUgZmllbGQgc2V0LiAgSW4gYWRkaXRpb24sIHRoZSAnYWRkX2ZpZWxkcycgYW5kICd0ZXN0X2FkZGVyJworICogaW4gdGhlIHN0cnVjdCBwb3dlcl9wbXUgZm9yIHRoaXMgcHJvY2Vzc29yIGNvbWUgaW50byBwbGF5LiAgVGhlCisgKiBhZGRfZmllbGRzIHZhbHVlIGNvbnRhaW5zIDEgaW4gdGhlIExTQiBvZiB0aGUgZmllbGQsIGFuZCB0aGUKKyAqIHRlc3RfYWRkZXIgY29udGFpbnMgMl4oay0xKSAtIDEgLSBOIGluIHRoZSBmaWVsZC4KKyAqCisgKiBOQU5EIGZpZWxkOiB0aGlzIGV4cHJlc3NlcyB0aGUgY29uc3RyYWludCB0aGF0IHlvdSBtYXkgbm90IGhhdmUgZXZlbnRzCisgKiBpbiBhbGwgb2YgYSBzZXQgb2YgY2xhc3Nlcy4gIChGb3IgZXhhbXBsZSwgb24gUFBDOTcwLCB5b3UgY2FuJ3Qgc2VsZWN0CisgKiBldmVudHMgZnJvbSB0aGUgRlBVLCBJU1UgYW5kIElEVSBzaW11bHRhbmVvdXNseSwgYWx0aG91Z2ggYW55IHR3byBhcmUKKyAqIHBvc3NpYmxlLikgIEZvciBOIGNsYXNzZXMsIHRoZSBmaWVsZCBpcyBOKzEgYml0cyB3aWRlLCBhbmQgZWFjaCBjbGFzcworICogaXMgYXNzaWduZWQgb25lIGJpdCBmcm9tIHRoZSBsZWFzdC1zaWduaWZpY2FudCBOIGJpdHMuICBUaGUgbWFzayBoYXMKKyAqIG9ubHkgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IHNldCwgYW5kIHRoZSB2YWx1ZSBoYXMgb25seSB0aGUgYml0CisgKiBmb3IgdGhlIGV2ZW50J3MgY2xhc3Mgc2V0LiAgVGhlIHRlc3RfYWRkZXIgaGFzIHRoZSBsZWFzdCBzaWduaWZpY2FudAorICogYml0IHNldCBpbiB0aGUgZmllbGQuCisgKgorICogSWYgYW4gZXZlbnQgaXMgbm90IHN1YmplY3QgdG8gdGhlIGNvbnN0cmFpbnQgZXhwcmVzc2VkIGJ5IGEgcGFydGljdWxhcgorICogZmllbGQsIHRoZW4gaXQgd2lsbCBoYXZlIDAgaW4gYm90aCB0aGUgbWFzayBhbmQgdmFsdWUgZm9yIHRoYXQgZmllbGQuCisgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaAppbmRleCBlODAxOGQ1Li5mYjM1OWIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCkBAIC00OTIsMTEgKzQ5MiwxMyBAQAogI2RlZmluZSAgIE1NQ1IwX0ZDSFYJMHgwMDAwMDAwMVVMIC8qIGZyZWV6ZSBjb25kaXRpb25zIGluIGh5cGVydmlzb3IgbW9kZSAqLwogI2RlZmluZSBTUFJOX01NQ1IxCTc5OAogI2RlZmluZSBTUFJOX01NQ1JBCTB4MzEyCisjZGVmaW5lICAgTU1DUkFfU0RTWU5DCTB4ODAwMDAwMDBVTCAvKiBTREFSIHN5bmNlZCB3aXRoIFNJQVIgKi8KICNkZWZpbmUgICBNTUNSQV9TSUhWCTB4MTAwMDAwMDBVTCAvKiBzdGF0ZSBvZiBNU1IgSFYgd2hlbiBTSUFSIHNldCAqLwogI2RlZmluZSAgIE1NQ1JBX1NJUFIJMHgwODAwMDAwMFVMIC8qIHN0YXRlIG9mIE1TUiBQUiB3aGVuIFNJQVIgc2V0ICovCiAjZGVmaW5lICAgTU1DUkFfU0xPVAkweDA3MDAwMDAwVUwgLyogU0xPVCBiaXRzICgzNy0zOSkgKi8KICNkZWZpbmUgICBNTUNSQV9TTE9UX1NISUZUCTI0CiAjZGVmaW5lICAgTU1DUkFfU0FNUExFX0VOQUJMRSAweDAwMDAwMDAxVUwgLyogZW5hYmxlIHNhbXBsaW5nICovCisjZGVmaW5lICAgUE9XRVI2X01NQ1JBX1NEU1lOQyAweDAwMDAwODAwMDAwMDAwMDBVTEwJLyogU0RBUi9TSUFSIHN5bmNlZCAqLwogI2RlZmluZSAgIFBPV0VSNl9NTUNSQV9TSUhWICAgMHgwMDAwMDQwMDAwMDAwMDAwVUxMCiAjZGVmaW5lICAgUE9XRVI2X01NQ1JBX1NJUFIgICAweDAwMDAwMjAwMDAwMDAwMDBVTEwKICNkZWZpbmUgICBQT1dFUjZfTU1DUkFfVEhSTQkweDAwMDAwMDIwVUwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaAppbmRleCBkOThhMzBkLi5hMGI5MmRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCkBAIC0zMjIsNiArMzIyLDYgQEAKIFNZU0NBTExfU1BVKGR1cDMpCiBTWVNDQUxMX1NQVShwaXBlMikKIFNZU0NBTEwoaW5vdGlmeV9pbml0MSkKLVNZU0NBTEwobmlfc3lzY2FsbCkKK1NZU0NBTExfU1BVKHBlcmZfY291bnRlcl9vcGVuKQogQ09NUEFUX1NZU19TUFUocHJlYWR2KQogQ09NUEFUX1NZU19TUFUocHdyaXRldikKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91bmlzdGQuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCAzZjA2ZjhlLi40YmFkYWMyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdW5pc3RkLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCkBAIC0zNDEsNiArMzQxLDcgQEAKICNkZWZpbmUgX19OUl9kdXAzCQkzMTYKICNkZWZpbmUgX19OUl9waXBlMgkJMzE3CiAjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0MQkzMTgKKyNkZWZpbmUgX19OUl9wZXJmX2NvdW50ZXJfb3BlbgkzMTkKICNkZWZpbmUgX19OUl9wcmVhZHYJCTMyMAogI2RlZmluZSBfX05SX3B3cml0ZXYJCTMyMQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQppbmRleCA3MTkwMWZiLi5hMmM2ODM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKQEAgLTk0LDYgKzk0LDkgQEAKIAogb2JqLSQoQ09ORklHX0RZTkFNSUNfRlRSQUNFKQkrPSBmdHJhY2Uubwogb2JqLSQoQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUikJKz0gZnRyYWNlLm8KK29iai0kKENPTkZJR19QRVJGX0NPVU5URVJTKQkrPSBwZXJmX2NvdW50ZXIubyBwb3dlcjQtcG11Lm8gcHBjOTcwLXBtdS5vIFwKKwkJCQkgICBwb3dlcjUtcG11Lm8gcG93ZXI1Ky1wbXUubyBwb3dlcjYtcG11Lm8gXAorCQkJCSAgIHBvd2VyNy1wbXUubwogCiBvYmotJChDT05GSUdfOFhYX01JTklNQUxfRlBFTVUpICs9IHNvZnRlbXU4eHgubwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMWU0MGJjMC4uZTk4MWQxYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTMxLDYgKzEzMSw3IEBACiAJREVGSU5FKFBBQ0FLTVNSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGtlcm5lbF9tc3IpKTsKIAlERUZJTkUoUEFDQVNPRlRJUlFFTiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzb2Z0X2VuYWJsZWQpKTsKIAlERUZJTkUoUEFDQUhBUkRJUlFFTiwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBoYXJkX2VuYWJsZWQpKTsKKwlERUZJTkUoUEFDQVBFUkZQRU5ELCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHBlcmZfY291bnRlcl9wZW5kaW5nKSk7CiAJREVGSU5FKFBBQ0FTTEJDQUNIRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzbGJfY2FjaGUpKTsKIAlERUZJTkUoUEFDQVNMQkNBQ0hFUFRSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNsYl9jYWNoZV9wdHIpKTsKIAlERUZJTkUoUEFDQUNPTlRFWFRJRCwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBjb250ZXh0LmlkKSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggYWJmYzMyMy4uNDNlMDczNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwpAQCAtNTI2LDYgKzUyNiwxNSBAQAogMjoKIAlUUkFDRV9BTkRfUkVTVE9SRV9JUlEocjUpOwogCisjaWZkZWYgQ09ORklHX1BFUkZfQ09VTlRFUlMKKwkvKiBjaGVjayBwYWNhLT5wZXJmX2NvdW50ZXJfcGVuZGluZyBpZiB3ZSdyZSBlbmFibGluZyBpbnRzICovCisJbGJ6CXIzLFBBQ0FQRVJGUEVORChyMTMpCisJYW5kLglyMyxyMyxyNQorCWJlcQkyN2YKKwlibAkucGVyZl9jb3VudGVyX2RvX3BlbmRpbmcKKzI3OgorI2VuZGlmIC8qIENPTkZJR19QRVJGX0NPVU5URVJTICovCisKIAkvKiBleHRyYWN0IEVFIGJpdCBhbmQgdXNlIGl0IHRvIHJlc3RvcmUgcGFjYS0+aGFyZF9lbmFibGVkICovCiAJbGQJcjMsX01TUihyMSkKIAlybGRpY2wJcjQscjMsNDksNjMJCS8qIHIwID0gKHIzID4+IDE1KSAmIDEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCmluZGV4IDhjMWE0OTYuLmZlZmY3OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwpAQCAtMTM1LDYgKzEzNSwxMSBAQAogCQkJaXNlcmllc19oYW5kbGVfaW50ZXJydXB0cygpOwogCX0KIAorCWlmICh0ZXN0X3BlcmZfY291bnRlcl9wZW5kaW5nKCkpIHsKKwkJY2xlYXJfcGVyZl9jb3VudGVyX3BlbmRpbmcoKTsKKwkJcGVyZl9jb3VudGVyX2RvX3BlbmRpbmcoKTsKKwl9CisKIAkvKgogCSAqIGlmIChnZXRfcGFjYSgpLT5oYXJkX2VuYWJsZWQpIHJldHVybjsKIAkgKiBCdXQgYWdhaW4gd2UgbmVlZCB0byB0YWtlIGNhcmUgdGhhdCBnY2MgZ2V0cyBoYXJkX2VuYWJsZWQgZGlyZWN0bHkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9jb3VudGVyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfY291bnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMjAyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BlcmZfY291bnRlci5jCkBAIC0wLDAgKzEsMTI2MyBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgc3VwcG9ydCAtIHBvd2VycGMgYXJjaGl0ZWN0dXJlIGNvZGUKKyAqCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKyNpbmNsdWRlIDxhc20vcG1jLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisKK3N0cnVjdCBjcHVfaHdfY291bnRlcnMgeworCWludCBuX2NvdW50ZXJzOworCWludCBuX3BlcmNwdTsKKwlpbnQgZGlzYWJsZWQ7CisJaW50IG5fYWRkZWQ7CisJaW50IG5fbGltaXRlZDsKKwl1OCAgcG1jc19lbmFibGVkOworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXJbTUFYX0hXQ09VTlRFUlNdOworCXU2NCBldmVudHNbTUFYX0hXQ09VTlRFUlNdOworCXVuc2lnbmVkIGludCBmbGFnc1tNQVhfSFdDT1VOVEVSU107CisJdTY0IG1tY3JbM107CisJc3RydWN0IHBlcmZfY291bnRlciAqbGltaXRlZF9jb3VudGVyW01BWF9MSU1JVEVEX0hXQ09VTlRFUlNdOworCXU4ICBsaW1pdGVkX2h3aWR4W01BWF9MSU1JVEVEX0hXQ09VTlRFUlNdOworfTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfaHdfY291bnRlcnMsIGNwdV9od19jb3VudGVycyk7CisKK3N0cnVjdCBwb3dlcl9wbXUgKnBwbXU7CisKKy8qCisgKiBOb3JtYWxseSwgdG8gaWdub3JlIGtlcm5lbCBldmVudHMgd2Ugc2V0IHRoZSBGQ1MgKGZyZWV6ZSBjb3VudGVycworICogaW4gc3VwZXJ2aXNvciBtb2RlKSBiaXQgaW4gTU1DUjAsIGJ1dCBpZiB0aGUga2VybmVsIHJ1bnMgd2l0aCB0aGUKKyAqIGh5cGVydmlzb3IgYml0IHNldCBpbiB0aGUgTVNSLCBvciBpZiB3ZSBhcmUgcnVubmluZyBvbiBhIHByb2Nlc3NvcgorICogd2hlcmUgdGhlIGh5cGVydmlzb3IgYml0IGlzIGZvcmNlZCB0byAxIChhcyBvbiBBcHBsZSBHNSBwcm9jZXNzb3JzKSwKKyAqIHRoZW4gd2UgbmVlZCB0byB1c2UgdGhlIEZDSFYgYml0IHRvIGlnbm9yZSBrZXJuZWwgZXZlbnRzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGZyZWV6ZV9jb3VudGVyc19rZXJuZWwgPSBNTUNSMF9GQ1M7CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCit2b2lkIHBlcmZfY291bnRlcl9wcmludF9kZWJ1Zyh2b2lkKQoreworfQorCisvKgorICogUmVhZCBvbmUgcGVyZm9ybWFuY2UgbW9uaXRvciBjb3VudGVyIChQTUMpLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyByZWFkX3BtYyhpbnQgaWR4KQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJc3dpdGNoIChpZHgpIHsKKwljYXNlIDE6CisJCXZhbCA9IG1mc3ByKFNQUk5fUE1DMSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJdmFsID0gbWZzcHIoU1BSTl9QTUMyKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQl2YWwgPSBtZnNwcihTUFJOX1BNQzMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXZhbCA9IG1mc3ByKFNQUk5fUE1DNCk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJdmFsID0gbWZzcHIoU1BSTl9QTUM1KTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQl2YWwgPSBtZnNwcihTUFJOX1BNQzYpOworCQlicmVhazsKKwljYXNlIDc6CisJCXZhbCA9IG1mc3ByKFNQUk5fUE1DNyk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJdmFsID0gbWZzcHIoU1BSTl9QTUM4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJvb3BzIHRyeWluZyB0byByZWFkIFBNQyVkXG4iLCBpZHgpOworCQl2YWwgPSAwOworCX0KKwlyZXR1cm4gdmFsOworfQorCisvKgorICogV3JpdGUgb25lIFBNQy4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfcG1jKGludCBpZHgsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCXN3aXRjaCAoaWR4KSB7CisJY2FzZSAxOgorCQltdHNwcihTUFJOX1BNQzEsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJbXRzcHIoU1BSTl9QTUMyLCB2YWwpOworCQlicmVhazsKKwljYXNlIDM6CisJCW10c3ByKFNQUk5fUE1DMywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQltdHNwcihTUFJOX1BNQzQsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJbXRzcHIoU1BSTl9QTUM1LCB2YWwpOworCQlicmVhazsKKwljYXNlIDY6CisJCW10c3ByKFNQUk5fUE1DNiwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQltdHNwcihTUFJOX1BNQzcsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJbXRzcHIoU1BSTl9QTUM4LCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm9vcHMgdHJ5aW5nIHRvIHdyaXRlIFBNQyVkXG4iLCBpZHgpOworCX0KK30KKworLyoKKyAqIENoZWNrIGlmIGEgc2V0IG9mIGV2ZW50cyBjYW4gYWxsIGdvIG9uIHRoZSBQTVUgYXQgb25jZS4KKyAqIElmIHRoZXkgY2FuJ3QsIHRoaXMgd2lsbCBsb29rIGF0IGFsdGVybmF0aXZlIGNvZGVzIGZvciB0aGUgZXZlbnRzCisgKiBhbmQgc2VlIGlmIGFueSBjb21iaW5hdGlvbiBvZiBhbHRlcm5hdGl2ZSBjb2RlcyBpcyBmZWFzaWJsZS4KKyAqIFRoZSBmZWFzaWJsZSBzZXQgaXMgcmV0dXJuZWQgaW4gZXZlbnRbXS4KKyAqLworc3RhdGljIGludCBwb3dlcl9jaGVja19jb25zdHJhaW50cyh1NjQgZXZlbnRbXSwgdW5zaWduZWQgaW50IGNmbGFnc1tdLAorCQkJCSAgIGludCBuX2V2KQoreworCXU2NCBtYXNrLCB2YWx1ZSwgbnY7CisJdTY0IGFsdGVybmF0aXZlc1tNQVhfSFdDT1VOVEVSU11bTUFYX0VWRU5UX0FMVEVSTkFUSVZFU107CisJdTY0IGFtYXNrc1tNQVhfSFdDT1VOVEVSU11bTUFYX0VWRU5UX0FMVEVSTkFUSVZFU107CisJdTY0IGF2YWx1ZXNbTUFYX0hXQ09VTlRFUlNdW01BWF9FVkVOVF9BTFRFUk5BVElWRVNdOworCXU2NCBzbWFza3NbTUFYX0hXQ09VTlRFUlNdLCBzdmFsdWVzW01BWF9IV0NPVU5URVJTXTsKKwlpbnQgbl9hbHRbTUFYX0hXQ09VTlRFUlNdLCBjaG9pY2VbTUFYX0hXQ09VTlRFUlNdOworCWludCBpLCBqOworCXU2NCBhZGRmID0gcHBtdS0+YWRkX2ZpZWxkczsKKwl1NjQgdGFkZCA9IHBwbXUtPnRlc3RfYWRkZXI7CisKKwlpZiAobl9ldiA+IHBwbXUtPm5fY291bnRlcikKKwkJcmV0dXJuIC0xOworCisJLyogRmlyc3Qgc2VlIGlmIHRoZSBldmVudHMgd2lsbCBnbyBvbiBhcy1pcyAqLworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJaWYgKChjZmxhZ3NbaV0gJiBQUE1VX0xJTUlURURfUE1DX1JFUUQpCisJCSAgICAmJiAhcHBtdS0+bGltaXRlZF9wbWNfZXZlbnQoZXZlbnRbaV0pKSB7CisJCQlwcG11LT5nZXRfYWx0ZXJuYXRpdmVzKGV2ZW50W2ldLCBjZmxhZ3NbaV0sCisJCQkJCSAgICAgICBhbHRlcm5hdGl2ZXNbaV0pOworCQkJZXZlbnRbaV0gPSBhbHRlcm5hdGl2ZXNbaV1bMF07CisJCX0KKwkJaWYgKHBwbXUtPmdldF9jb25zdHJhaW50KGV2ZW50W2ldLCAmYW1hc2tzW2ldWzBdLAorCQkJCQkgJmF2YWx1ZXNbaV1bMF0pKQorCQkJcmV0dXJuIC0xOworCX0KKwl2YWx1ZSA9IG1hc2sgPSAwOworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJbnYgPSAodmFsdWUgfCBhdmFsdWVzW2ldWzBdKSArICh2YWx1ZSAmIGF2YWx1ZXNbaV1bMF0gJiBhZGRmKTsKKwkJaWYgKCgoKG52ICsgdGFkZCkgXiB2YWx1ZSkgJiBtYXNrKSAhPSAwIHx8CisJCSAgICAoKChudiArIHRhZGQpIF4gYXZhbHVlc1tpXVswXSkgJiBhbWFza3NbaV1bMF0pICE9IDApCisJCQlicmVhazsKKwkJdmFsdWUgPSBudjsKKwkJbWFzayB8PSBhbWFza3NbaV1bMF07CisJfQorCWlmIChpID09IG5fZXYpCisJCXJldHVybiAwOwkvKiBhbGwgT0sgKi8KKworCS8qIGRvZXNuJ3Qgd29yaywgZ2F0aGVyIGFsdGVybmF0aXZlcy4uLiAqLworCWlmICghcHBtdS0+Z2V0X2FsdGVybmF0aXZlcykKKwkJcmV0dXJuIC0xOworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJY2hvaWNlW2ldID0gMDsKKwkJbl9hbHRbaV0gPSBwcG11LT5nZXRfYWx0ZXJuYXRpdmVzKGV2ZW50W2ldLCBjZmxhZ3NbaV0sCisJCQkJCQkgIGFsdGVybmF0aXZlc1tpXSk7CisJCWZvciAoaiA9IDE7IGogPCBuX2FsdFtpXTsgKytqKQorCQkJcHBtdS0+Z2V0X2NvbnN0cmFpbnQoYWx0ZXJuYXRpdmVzW2ldW2pdLAorCQkJCQkgICAgICZhbWFza3NbaV1bal0sICZhdmFsdWVzW2ldW2pdKTsKKwl9CisKKwkvKiBlbnVtZXJhdGUgYWxsIHBvc3NpYmlsaXRpZXMgYW5kIHNlZSBpZiBhbnkgd2lsbCB3b3JrICovCisJaSA9IDA7CisJaiA9IC0xOworCXZhbHVlID0gbWFzayA9IG52ID0gMDsKKwl3aGlsZSAoaSA8IG5fZXYpIHsKKwkJaWYgKGogPj0gMCkgeworCQkJLyogd2UncmUgYmFja3RyYWNraW5nLCByZXN0b3JlIGNvbnRleHQgKi8KKwkJCXZhbHVlID0gc3ZhbHVlc1tpXTsKKwkJCW1hc2sgPSBzbWFza3NbaV07CisJCQlqID0gY2hvaWNlW2ldOworCQl9CisJCS8qCisJCSAqIFNlZSBpZiBhbnkgYWx0ZXJuYXRpdmUgayBmb3IgZXZlbnQgaSwKKwkJICogd2hlcmUgayA+IGosIHdpbGwgc2F0aXNmeSB0aGUgY29uc3RyYWludHMuCisJCSAqLworCQl3aGlsZSAoKytqIDwgbl9hbHRbaV0pIHsKKwkJCW52ID0gKHZhbHVlIHwgYXZhbHVlc1tpXVtqXSkgKworCQkJCSh2YWx1ZSAmIGF2YWx1ZXNbaV1bal0gJiBhZGRmKTsKKwkJCWlmICgoKChudiArIHRhZGQpIF4gdmFsdWUpICYgbWFzaykgPT0gMCAmJgorCQkJICAgICgoKG52ICsgdGFkZCkgXiBhdmFsdWVzW2ldW2pdKQorCQkJICAgICAmIGFtYXNrc1tpXVtqXSkgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA+PSBuX2FsdFtpXSkgeworCQkJLyoKKwkJCSAqIE5vIGZlYXNpYmxlIGFsdGVybmF0aXZlLCBiYWNrdHJhY2sKKwkJCSAqIHRvIGV2ZW50IGktMSBhbmQgY29udGludWUgZW51bWVyYXRpbmcgaXRzCisJCQkgKiBhbHRlcm5hdGl2ZXMgZnJvbSB3aGVyZSB3ZSBnb3QgdXAgdG8uCisJCQkgKi8KKwkJCWlmICgtLWkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBGb3VuZCBhIGZlYXNpYmxlIGFsdGVybmF0aXZlIGZvciBldmVudCBpLAorCQkJICogcmVtZW1iZXIgd2hlcmUgd2UgZ290IHVwIHRvIHdpdGggdGhpcyBldmVudCwKKwkJCSAqIGdvIG9uIHRvIHRoZSBuZXh0IGV2ZW50LCBhbmQgc3RhcnQgd2l0aAorCQkJICogdGhlIGZpcnN0IGFsdGVybmF0aXZlIGZvciBpdC4KKwkJCSAqLworCQkJY2hvaWNlW2ldID0gajsKKwkJCXN2YWx1ZXNbaV0gPSB2YWx1ZTsKKwkJCXNtYXNrc1tpXSA9IG1hc2s7CisJCQl2YWx1ZSA9IG52OworCQkJbWFzayB8PSBhbWFza3NbaV1bal07CisJCQkrK2k7CisJCQlqID0gLTE7CisJCX0KKwl9CisKKwkvKiBPSywgd2UgaGF2ZSBhIGZlYXNpYmxlIGNvbWJpbmF0aW9uLCB0ZWxsIHRoZSBjYWxsZXIgdGhlIHNvbHV0aW9uICovCisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkKKwkJZXZlbnRbaV0gPSBhbHRlcm5hdGl2ZXNbaV1bY2hvaWNlW2ldXTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoZWNrIGlmIG5ld2x5LWFkZGVkIGNvdW50ZXJzIGhhdmUgY29uc2lzdGVudCBzZXR0aW5ncyBmb3IKKyAqIGV4Y2x1ZGVfe3VzZXIsa2VybmVsLGh2fSB3aXRoIGVhY2ggb3RoZXIgYW5kIGFueSBwcmV2aW91c2x5CisgKiBhZGRlZCBjb3VudGVycy4KKyAqLworc3RhdGljIGludCBjaGVja19leGNsdWRlcyhzdHJ1Y3QgcGVyZl9jb3VudGVyICoqY3RycywgdW5zaWduZWQgaW50IGNmbGFnc1tdLAorCQkJICBpbnQgbl9wcmV2LCBpbnQgbl9uZXcpCit7CisJaW50IGV1ID0gMCwgZWsgPSAwLCBlaCA9IDA7CisJaW50IGksIG4sIGZpcnN0OworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisKKwluID0gbl9wcmV2ICsgbl9uZXc7CisJaWYgKG4gPD0gMSkKKwkJcmV0dXJuIDA7CisKKwlmaXJzdCA9IDE7CisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlpZiAoY2ZsYWdzW2ldICYgUFBNVV9MSU1JVEVEX1BNQ19PSykgeworCQkJY2ZsYWdzW2ldICY9IH5QUE1VX0xJTUlURURfUE1DX1JFUUQ7CisJCQljb250aW51ZTsKKwkJfQorCQljb3VudGVyID0gY3Ryc1tpXTsKKwkJaWYgKGZpcnN0KSB7CisJCQlldSA9IGNvdW50ZXItPmF0dHIuZXhjbHVkZV91c2VyOworCQkJZWsgPSBjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfa2VybmVsOworCQkJZWggPSBjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfaHY7CisJCQlmaXJzdCA9IDA7CisJCX0gZWxzZSBpZiAoY291bnRlci0+YXR0ci5leGNsdWRlX3VzZXIgIT0gZXUgfHwKKwkJCSAgIGNvdW50ZXItPmF0dHIuZXhjbHVkZV9rZXJuZWwgIT0gZWsgfHwKKwkJCSAgIGNvdW50ZXItPmF0dHIuZXhjbHVkZV9odiAhPSBlaCkgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisKKwlpZiAoZXUgfHwgZWsgfHwgZWgpCisJCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisJCQlpZiAoY2ZsYWdzW2ldICYgUFBNVV9MSU1JVEVEX1BNQ19PSykKKwkJCQljZmxhZ3NbaV0gfD0gUFBNVV9MSU1JVEVEX1BNQ19SRVFEOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBvd2VyX3BtdV9yZWFkKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJbG9uZyB2YWwsIGRlbHRhLCBwcmV2OworCisJaWYgKCFjb3VudGVyLT5ody5pZHgpCisJCXJldHVybjsKKwkvKgorCSAqIFBlcmZvcm1hbmNlIG1vbml0b3IgaW50ZXJydXB0cyBjb21lIGV2ZW4gd2hlbiBpbnRlcnJ1cHRzCisJICogYXJlIHNvZnQtZGlzYWJsZWQsIGFzIGxvbmcgYXMgaW50ZXJydXB0cyBhcmUgaGFyZC1lbmFibGVkLgorCSAqIFRoZXJlZm9yZSB3ZSB0cmVhdCB0aGVtIGxpa2UgTk1Jcy4KKwkgKi8KKwlkbyB7CisJCXByZXYgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyLT5ody5wcmV2X2NvdW50KTsKKwkJYmFycmllcigpOworCQl2YWwgPSByZWFkX3BtYyhjb3VudGVyLT5ody5pZHgpOworCX0gd2hpbGUgKGF0b21pYzY0X2NtcHhjaGcoJmNvdW50ZXItPmh3LnByZXZfY291bnQsIHByZXYsIHZhbCkgIT0gcHJldik7CisKKwkvKiBUaGUgY291bnRlcnMgYXJlIG9ubHkgMzIgYml0cyB3aWRlICovCisJZGVsdGEgPSAodmFsIC0gcHJldikgJiAweGZmZmZmZmZmdWw7CisJYXRvbWljNjRfYWRkKGRlbHRhLCAmY291bnRlci0+Y291bnQpOworCWF0b21pYzY0X3N1YihkZWx0YSwgJmNvdW50ZXItPmh3LnBlcmlvZF9sZWZ0KTsKK30KKworLyoKKyAqIE9uIHNvbWUgbWFjaGluZXMsIFBNQzUgYW5kIFBNQzYgY2FuJ3QgYmUgd3JpdHRlbiwgZG9uJ3QgcmVzcGVjdAorICogdGhlIGZyZWV6ZSBjb25kaXRpb25zLCBhbmQgZG9uJ3QgZ2VuZXJhdGUgaW50ZXJydXB0cy4gIFRoaXMgdGVsbHMKKyAqIHVzIGlmIGBjb3VudGVyJyBpcyB1c2luZyBzdWNoIGEgUE1DLgorICovCitzdGF0aWMgaW50IGlzX2xpbWl0ZWRfcG1jKGludCBwbWNudW0pCit7CisJcmV0dXJuIChwcG11LT5mbGFncyAmIFBQTVVfTElNSVRFRF9QTUM1XzYpCisJCSYmIChwbWNudW0gPT0gNSB8fCBwbWNudW0gPT0gNik7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWV6ZV9saW1pdGVkX2NvdW50ZXJzKHN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWh3LAorCQkJCSAgICB1bnNpZ25lZCBsb25nIHBtYzUsIHVuc2lnbmVkIGxvbmcgcG1jNikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCXU2NCB2YWwsIHByZXYsIGRlbHRhOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNwdWh3LT5uX2xpbWl0ZWQ7ICsraSkgeworCQljb3VudGVyID0gY3B1aHctPmxpbWl0ZWRfY291bnRlcltpXTsKKwkJaWYgKCFjb3VudGVyLT5ody5pZHgpCisJCQljb250aW51ZTsKKwkJdmFsID0gKGNvdW50ZXItPmh3LmlkeCA9PSA1KSA/IHBtYzUgOiBwbWM2OworCQlwcmV2ID0gYXRvbWljNjRfcmVhZCgmY291bnRlci0+aHcucHJldl9jb3VudCk7CisJCWNvdW50ZXItPmh3LmlkeCA9IDA7CisJCWRlbHRhID0gKHZhbCAtIHByZXYpICYgMHhmZmZmZmZmZnVsOworCQlhdG9taWM2NF9hZGQoZGVsdGEsICZjb3VudGVyLT5jb3VudCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0aGF3X2xpbWl0ZWRfY291bnRlcnMoc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1aHcsCisJCQkJICB1bnNpZ25lZCBsb25nIHBtYzUsIHVuc2lnbmVkIGxvbmcgcG1jNikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCXU2NCB2YWw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3B1aHctPm5fbGltaXRlZDsgKytpKSB7CisJCWNvdW50ZXIgPSBjcHVody0+bGltaXRlZF9jb3VudGVyW2ldOworCQljb3VudGVyLT5ody5pZHggPSBjcHVody0+bGltaXRlZF9od2lkeFtpXTsKKwkJdmFsID0gKGNvdW50ZXItPmh3LmlkeCA9PSA1KSA/IHBtYzUgOiBwbWM2OworCQlhdG9taWM2NF9zZXQoJmNvdW50ZXItPmh3LnByZXZfY291bnQsIHZhbCk7CisJCXBlcmZfY291bnRlcl91cGRhdGVfdXNlcnBhZ2UoY291bnRlcik7CisJfQorfQorCisvKgorICogU2luY2UgbGltaXRlZCBjb3VudGVycyBkb24ndCByZXNwZWN0IHRoZSBmcmVlemUgY29uZGl0aW9ucywgd2UKKyAqIGhhdmUgdG8gcmVhZCB0aGVtIGltbWVkaWF0ZWx5IGFmdGVyIGZyZWV6aW5nIG9yIHVuZnJlZXppbmcgdGhlCisgKiBvdGhlciBjb3VudGVycy4gIFdlIHRyeSB0byBrZWVwIHRoZSB2YWx1ZXMgZnJvbSB0aGUgbGltaXRlZAorICogY291bnRlcnMgYXMgY29uc2lzdGVudCBhcyBwb3NzaWJsZSBieSBrZWVwaW5nIHRoZSBkZWxheSAoaW4KKyAqIGN5Y2xlcyBhbmQgaW5zdHJ1Y3Rpb25zKSBiZXR3ZWVuIGZyZWV6aW5nL3VuZnJlZXppbmcgYW5kIHJlYWRpbmcKKyAqIHRoZSBsaW1pdGVkIGNvdW50ZXJzIGFzIHNtYWxsIGFuZCBjb25zaXN0ZW50IGFzIHBvc3NpYmxlLgorICogVGhlcmVmb3JlLCBpZiBhbnkgbGltaXRlZCBjb3VudGVycyBhcmUgaW4gdXNlLCB3ZSByZWFkIHRoZW0KKyAqIGJvdGgsIGFuZCBhbHdheXMgaW4gdGhlIHNhbWUgb3JkZXIsIHRvIG1pbmltaXplIHZhcmlhYmlsaXR5LAorICogYW5kIGRvIGl0IGluc2lkZSB0aGUgc2FtZSBhc20gdGhhdCB3cml0ZXMgTU1DUjAuCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX21tY3IwKHN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWh3LCB1bnNpZ25lZCBsb25nIG1tY3IwKQoreworCXVuc2lnbmVkIGxvbmcgcG1jNSwgcG1jNjsKKworCWlmICghY3B1aHctPm5fbGltaXRlZCkgeworCQltdHNwcihTUFJOX01NQ1IwLCBtbWNyMCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdyaXRlIE1NQ1IwLCB0aGVuIHJlYWQgUE1DNSBhbmQgUE1DNiBpbW1lZGlhdGVseS4KKwkgKiBUbyBlbnN1cmUgd2UgZG9uJ3QgZ2V0IGEgcGVyZm9ybWFuY2UgbW9uaXRvciBpbnRlcnJ1cHQKKwkgKiBiZXR3ZWVuIHdyaXRpbmcgTU1DUjAgYW5kIGZyZWV6aW5nL3RoYXdpbmcgdGhlIGxpbWl0ZWQKKwkgKiBjb3VudGVycywgd2UgZmlyc3Qgd3JpdGUgTU1DUjAgd2l0aCB0aGUgY291bnRlciBvdmVyZmxvdworCSAqIGludGVycnVwdCBlbmFibGUgYml0cyB0dXJuZWQgb2ZmLgorCSAqLworCWFzbSB2b2xhdGlsZSgibXRzcHIgJTMsJTI7IG1mc3ByICUwLCU0OyBtZnNwciAlMSwlNSIKKwkJICAgICA6ICI9JnIiIChwbWM1KSwgIj0mciIgKHBtYzYpCisJCSAgICAgOiAiciIgKG1tY3IwICYgfihNTUNSMF9QTUMxQ0UgfCBNTUNSMF9QTUNqQ0UpKSwKKwkJICAgICAgICJpIiAoU1BSTl9NTUNSMCksCisJCSAgICAgICAiaSIgKFNQUk5fUE1DNSksICJpIiAoU1BSTl9QTUM2KSk7CisKKwlpZiAobW1jcjAgJiBNTUNSMF9GQykKKwkJZnJlZXplX2xpbWl0ZWRfY291bnRlcnMoY3B1aHcsIHBtYzUsIHBtYzYpOworCWVsc2UKKwkJdGhhd19saW1pdGVkX2NvdW50ZXJzKGNwdWh3LCBwbWM1LCBwbWM2KTsKKworCS8qCisJICogV3JpdGUgdGhlIGZ1bGwgTU1DUjAgaW5jbHVkaW5nIHRoZSBjb3VudGVyIG92ZXJmbG93IGludGVycnVwdAorCSAqIGVuYWJsZSBiaXRzLCBpZiBuZWNlc3NhcnkuCisJICovCisJaWYgKG1tY3IwICYgKE1NQ1IwX1BNQzFDRSB8IE1NQ1IwX1BNQ2pDRSkpCisJCW10c3ByKFNQUk5fTU1DUjAsIG1tY3IwKTsKK30KKworLyoKKyAqIERpc2FibGUgYWxsIGNvdW50ZXJzIHRvIHByZXZlbnQgUE1VIGludGVycnVwdHMgYW5kIHRvIGFsbG93CisgKiBjb3VudGVycyB0byBiZSBhZGRlZCBvciByZW1vdmVkLgorICovCit2b2lkIGh3X3BlcmZfZGlzYWJsZSh2b2lkKQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWh3OworCXVuc2lnbmVkIGxvbmcgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY3B1aHcgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCisJcmV0ID0gY3B1aHctPmRpc2FibGVkOworCWlmICghcmV0KSB7CisJCWNwdWh3LT5kaXNhYmxlZCA9IDE7CisJCWNwdWh3LT5uX2FkZGVkID0gMDsKKworCQkvKgorCQkgKiBDaGVjayBpZiB3ZSBldmVyIGVuYWJsZWQgdGhlIFBNVSBvbiB0aGlzIGNwdS4KKwkJICovCisJCWlmICghY3B1aHctPnBtY3NfZW5hYmxlZCkgeworCQkJaWYgKHBwY19tZC5lbmFibGVfcG1jcykKKwkJCQlwcGNfbWQuZW5hYmxlX3BtY3MoKTsKKwkJCWNwdWh3LT5wbWNzX2VuYWJsZWQgPSAxOworCQl9CisKKwkJLyoKKwkJICogRGlzYWJsZSBpbnN0cnVjdGlvbiBzYW1wbGluZyBpZiBpdCB3YXMgZW5hYmxlZAorCQkgKi8KKwkJaWYgKGNwdWh3LT5tbWNyWzJdICYgTU1DUkFfU0FNUExFX0VOQUJMRSkgeworCQkJbXRzcHIoU1BSTl9NTUNSQSwKKwkJCSAgICAgIGNwdWh3LT5tbWNyWzJdICYgfk1NQ1JBX1NBTVBMRV9FTkFCTEUpOworCQkJbWIoKTsKKwkJfQorCisJCS8qCisJCSAqIFNldCB0aGUgJ2ZyZWV6ZSBjb3VudGVycycgYml0LgorCQkgKiBUaGUgYmFycmllciBpcyB0byBtYWtlIHN1cmUgdGhlIG10c3ByIGhhcyBiZWVuCisJCSAqIGV4ZWN1dGVkIGFuZCB0aGUgUE1VIGhhcyBmcm96ZW4gdGhlIGNvdW50ZXJzCisJCSAqIGJlZm9yZSB3ZSByZXR1cm4uCisJCSAqLworCQl3cml0ZV9tbWNyMChjcHVodywgbWZzcHIoU1BSTl9NTUNSMCkgfCBNTUNSMF9GQyk7CisJCW1iKCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIFJlLWVuYWJsZSBhbGwgY291bnRlcnMgaWYgZGlzYWJsZSA9PSAwLgorICogSWYgd2Ugd2VyZSBwcmV2aW91c2x5IGRpc2FibGVkIGFuZCBjb3VudGVycyB3ZXJlIGFkZGVkLCB0aGVuCisgKiBwdXQgdGhlIG5ldyBjb25maWcgb24gdGhlIFBNVS4KKyAqLwordm9pZCBod19wZXJmX2VuYWJsZSh2b2lkKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1aHc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJczY0IGxlZnQ7CisJdW5zaWduZWQgaW50IGh3Y19pbmRleFtNQVhfSFdDT1VOVEVSU107CisJaW50IG5fbGltOworCWludCBpZHg7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY3B1aHcgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCWlmICghY3B1aHctPmRpc2FibGVkKSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwljcHVody0+ZGlzYWJsZWQgPSAwOworCisJLyoKKwkgKiBJZiB3ZSBkaWRuJ3QgY2hhbmdlIGFueXRoaW5nLCBvciBvbmx5IHJlbW92ZWQgY291bnRlcnMsCisJICogbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBNTUNSKiBzZXR0aW5ncyBhbmQgcmVzZXQgdGhlIFBNQ3MuCisJICogSnVzdCByZWVuYWJsZSB0aGUgUE1VIHdpdGggdGhlIGN1cnJlbnQgTU1DUiogc2V0dGluZ3MKKwkgKiAocG9zc2libHkgdXBkYXRlZCBmb3IgcmVtb3ZhbCBvZiBjb3VudGVycykuCisJICovCisJaWYgKCFjcHVody0+bl9hZGRlZCkgeworCQltdHNwcihTUFJOX01NQ1JBLCBjcHVody0+bW1jclsyXSAmIH5NTUNSQV9TQU1QTEVfRU5BQkxFKTsKKwkJbXRzcHIoU1BSTl9NTUNSMSwgY3B1aHctPm1tY3JbMV0pOworCQlpZiAoY3B1aHctPm5fY291bnRlcnMgPT0gMCkKKwkJCWdldF9scHBhY2EoKS0+cG1jcmVnc19pbl91c2UgPSAwOworCQlnb3RvIG91dF9lbmFibGU7CisJfQorCisJLyoKKwkgKiBDb21wdXRlIE1NQ1IqIHZhbHVlcyBmb3IgdGhlIG5ldyBzZXQgb2YgY291bnRlcnMKKwkgKi8KKwlpZiAocHBtdS0+Y29tcHV0ZV9tbWNyKGNwdWh3LT5ldmVudHMsIGNwdWh3LT5uX2NvdW50ZXJzLCBod2NfaW5kZXgsCisJCQkgICAgICAgY3B1aHctPm1tY3IpKSB7CisJCS8qIHNob3VsZG4ndCBldmVyIGdldCBoZXJlICovCisJCXByaW50ayhLRVJOX0VSUiAib29wcyBjb21wdXRlX21tY3IgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBBZGQgaW4gTU1DUjAgZnJlZXplIGJpdHMgY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiBhdHRyLmV4Y2x1ZGVfKiBiaXRzIGZvciB0aGUgZmlyc3QgY291bnRlci4KKwkgKiBXZSBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGF0IGFsbCBjb3VudGVycyBoYXZlIHRoZQorCSAqIHNhbWUgdmFsdWVzIGZvciB0aGVzZSBiaXRzIGFzIHRoZSBmaXJzdCBjb3VudGVyLgorCSAqLworCWNvdW50ZXIgPSBjcHVody0+Y291bnRlclswXTsKKwlpZiAoY291bnRlci0+YXR0ci5leGNsdWRlX3VzZXIpCisJCWNwdWh3LT5tbWNyWzBdIHw9IE1NQ1IwX0ZDUDsKKwlpZiAoY291bnRlci0+YXR0ci5leGNsdWRlX2tlcm5lbCkKKwkJY3B1aHctPm1tY3JbMF0gfD0gZnJlZXplX2NvdW50ZXJzX2tlcm5lbDsKKwlpZiAoY291bnRlci0+YXR0ci5leGNsdWRlX2h2KQorCQljcHVody0+bW1jclswXSB8PSBNTUNSMF9GQ0hWOworCisJLyoKKwkgKiBXcml0ZSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gdG8gTU1DUiogd2l0aCB0aGUgZnJlZXplCisJICogYml0IHNldCBhbmQgc2V0IHRoZSBoYXJkd2FyZSBjb3VudGVycyB0byB0aGVpciBpbml0aWFsIHZhbHVlcy4KKwkgKiBUaGVuIHVuZnJlZXplIHRoZSBjb3VudGVycy4KKwkgKi8KKwlnZXRfbHBwYWNhKCktPnBtY3JlZ3NfaW5fdXNlID0gMTsKKwltdHNwcihTUFJOX01NQ1JBLCBjcHVody0+bW1jclsyXSAmIH5NTUNSQV9TQU1QTEVfRU5BQkxFKTsKKwltdHNwcihTUFJOX01NQ1IxLCBjcHVody0+bW1jclsxXSk7CisJbXRzcHIoU1BSTl9NTUNSMCwgKGNwdWh3LT5tbWNyWzBdICYgfihNTUNSMF9QTUMxQ0UgfCBNTUNSMF9QTUNqQ0UpKQorCQkJCXwgTU1DUjBfRkMpOworCisJLyoKKwkgKiBSZWFkIG9mZiBhbnkgcHJlLWV4aXN0aW5nIGNvdW50ZXJzIHRoYXQgbmVlZCB0byBtb3ZlCisJICogdG8gYW5vdGhlciBQTUMuCisJICovCisJZm9yIChpID0gMDsgaSA8IGNwdWh3LT5uX2NvdW50ZXJzOyArK2kpIHsKKwkJY291bnRlciA9IGNwdWh3LT5jb3VudGVyW2ldOworCQlpZiAoY291bnRlci0+aHcuaWR4ICYmIGNvdW50ZXItPmh3LmlkeCAhPSBod2NfaW5kZXhbaV0gKyAxKSB7CisJCQlwb3dlcl9wbXVfcmVhZChjb3VudGVyKTsKKwkJCXdyaXRlX3BtYyhjb3VudGVyLT5ody5pZHgsIDApOworCQkJY291bnRlci0+aHcuaWR4ID0gMDsKKwkJfQorCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgUE1DcyBmb3IgYWxsIHRoZSBuZXcgYW5kIG1vdmVkIGNvdW50ZXJzLgorCSAqLworCWNwdWh3LT5uX2xpbWl0ZWQgPSBuX2xpbSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNwdWh3LT5uX2NvdW50ZXJzOyArK2kpIHsKKwkJY291bnRlciA9IGNwdWh3LT5jb3VudGVyW2ldOworCQlpZiAoY291bnRlci0+aHcuaWR4KQorCQkJY29udGludWU7CisJCWlkeCA9IGh3Y19pbmRleFtpXSArIDE7CisJCWlmIChpc19saW1pdGVkX3BtYyhpZHgpKSB7CisJCQljcHVody0+bGltaXRlZF9jb3VudGVyW25fbGltXSA9IGNvdW50ZXI7CisJCQljcHVody0+bGltaXRlZF9od2lkeFtuX2xpbV0gPSBpZHg7CisJCQkrK25fbGltOworCQkJY29udGludWU7CisJCX0KKwkJdmFsID0gMDsKKwkJaWYgKGNvdW50ZXItPmh3LnNhbXBsZV9wZXJpb2QpIHsKKwkJCWxlZnQgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyLT5ody5wZXJpb2RfbGVmdCk7CisJCQlpZiAobGVmdCA8IDB4ODAwMDAwMDBMKQorCQkJCXZhbCA9IDB4ODAwMDAwMDBMIC0gbGVmdDsKKwkJfQorCQlhdG9taWM2NF9zZXQoJmNvdW50ZXItPmh3LnByZXZfY291bnQsIHZhbCk7CisJCWNvdW50ZXItPmh3LmlkeCA9IGlkeDsKKwkJd3JpdGVfcG1jKGlkeCwgdmFsKTsKKwkJcGVyZl9jb3VudGVyX3VwZGF0ZV91c2VycGFnZShjb3VudGVyKTsKKwl9CisJY3B1aHctPm5fbGltaXRlZCA9IG5fbGltOworCWNwdWh3LT5tbWNyWzBdIHw9IE1NQ1IwX1BNWEUgfCBNTUNSMF9GQ0VDRTsKKworIG91dF9lbmFibGU6CisJbWIoKTsKKwl3cml0ZV9tbWNyMChjcHVodywgY3B1aHctPm1tY3JbMF0pOworCisJLyoKKwkgKiBFbmFibGUgaW5zdHJ1Y3Rpb24gc2FtcGxpbmcgaWYgbmVjZXNzYXJ5CisJICovCisJaWYgKGNwdWh3LT5tbWNyWzJdICYgTU1DUkFfU0FNUExFX0VOQUJMRSkgeworCQltYigpOworCQltdHNwcihTUFJOX01NQ1JBLCBjcHVody0+bW1jclsyXSk7CisJfQorCisgb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCBjb2xsZWN0X2V2ZW50cyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpncm91cCwgaW50IG1heF9jb3VudCwKKwkJCSAgc3RydWN0IHBlcmZfY291bnRlciAqY3Ryc1tdLCB1NjQgKmV2ZW50cywKKwkJCSAgdW5zaWduZWQgaW50ICpmbGFncykKK3sKKwlpbnQgbiA9IDA7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCWlmICghaXNfc29mdHdhcmVfY291bnRlcihncm91cCkpIHsKKwkJaWYgKG4gPj0gbWF4X2NvdW50KQorCQkJcmV0dXJuIC0xOworCQljdHJzW25dID0gZ3JvdXA7CisJCWZsYWdzW25dID0gZ3JvdXAtPmh3LmNvdW50ZXJfYmFzZTsKKwkJZXZlbnRzW24rK10gPSBncm91cC0+aHcuY29uZmlnOworCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZncm91cC0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KSB7CisJCWlmICghaXNfc29mdHdhcmVfY291bnRlcihjb3VudGVyKSAmJgorCQkgICAgY291bnRlci0+c3RhdGUgIT0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRikgeworCQkJaWYgKG4gPj0gbWF4X2NvdW50KQorCQkJCXJldHVybiAtMTsKKwkJCWN0cnNbbl0gPSBjb3VudGVyOworCQkJZmxhZ3Nbbl0gPSBjb3VudGVyLT5ody5jb3VudGVyX2Jhc2U7CisJCQlldmVudHNbbisrXSA9IGNvdW50ZXItPmh3LmNvbmZpZzsKKwkJfQorCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgY291bnRlcl9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBpbnQgY3B1KQoreworCWNvdW50ZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRTsKKwljb3VudGVyLT5vbmNwdSA9IGNwdTsKKwljb3VudGVyLT50c3RhbXBfcnVubmluZyArPSBjb3VudGVyLT5jdHgtPnRpbWUgLSBjb3VudGVyLT50c3RhbXBfc3RvcHBlZDsKKwlpZiAoaXNfc29mdHdhcmVfY291bnRlcihjb3VudGVyKSkKKwkJY291bnRlci0+cG11LT5lbmFibGUoY291bnRlcik7Cit9CisKKy8qCisgKiBDYWxsZWQgdG8gZW5hYmxlIGEgd2hvbGUgZ3JvdXAgb2YgY291bnRlcnMuCisgKiBSZXR1cm5zIDEgaWYgdGhlIGdyb3VwIHdhcyBlbmFibGVkLCBvciAtRUFHQUlOIGlmIGl0IGNvdWxkIG5vdCBiZS4KKyAqIEFzc3VtZXMgdGhlIGNhbGxlciBoYXMgZGlzYWJsZWQgaW50ZXJydXB0cyBhbmQgaGFzCisgKiBmcm96ZW4gdGhlIFBNVSB3aXRoIGh3X3BlcmZfc2F2ZV9kaXNhYmxlLgorICovCitpbnQgaHdfcGVyZl9ncm91cF9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jb3VudGVyICpncm91cF9sZWFkZXIsCisJICAgICAgIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJICAgICAgIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWh3OworCWxvbmcgaSwgbiwgbjA7CisJc3RydWN0IHBlcmZfY291bnRlciAqc3ViOworCisJY3B1aHcgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCW4wID0gY3B1aHctPm5fY291bnRlcnM7CisJbiA9IGNvbGxlY3RfZXZlbnRzKGdyb3VwX2xlYWRlciwgcHBtdS0+bl9jb3VudGVyIC0gbjAsCisJCQkgICAmY3B1aHctPmNvdW50ZXJbbjBdLCAmY3B1aHctPmV2ZW50c1tuMF0sCisJCQkgICAmY3B1aHctPmZsYWdzW24wXSk7CisJaWYgKG4gPCAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAoY2hlY2tfZXhjbHVkZXMoY3B1aHctPmNvdW50ZXIsIGNwdWh3LT5mbGFncywgbjAsIG4pKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlpID0gcG93ZXJfY2hlY2tfY29uc3RyYWludHMoY3B1aHctPmV2ZW50cywgY3B1aHctPmZsYWdzLCBuICsgbjApOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIC1FQUdBSU47CisJY3B1aHctPm5fY291bnRlcnMgPSBuMCArIG47CisJY3B1aHctPm5fYWRkZWQgKz0gbjsKKworCS8qCisJICogT0ssIHRoaXMgZ3JvdXAgY2FuIGdvIG9uOyB1cGRhdGUgY291bnRlciBzdGF0ZXMgZXRjLiwKKwkgKiBhbmQgZW5hYmxlIGFueSBzb2Z0d2FyZSBjb3VudGVycworCSAqLworCWZvciAoaSA9IG4wOyBpIDwgbjAgKyBuOyArK2kpCisJCWNwdWh3LT5jb3VudGVyW2ldLT5ody5jb25maWcgPSBjcHVody0+ZXZlbnRzW2ldOworCWNwdWN0eC0+YWN0aXZlX29uY3B1ICs9IG47CisJbiA9IDE7CisJY291bnRlcl9zY2hlZF9pbihncm91cF9sZWFkZXIsIGNwdSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWIsICZncm91cF9sZWFkZXItPnNpYmxpbmdfbGlzdCwgbGlzdF9lbnRyeSkgeworCQlpZiAoc3ViLT5zdGF0ZSAhPSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGKSB7CisJCQljb3VudGVyX3NjaGVkX2luKHN1YiwgY3B1KTsKKwkJCSsrbjsKKwkJfQorCX0KKwljdHgtPm5yX2FjdGl2ZSArPSBuOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBBZGQgYSBjb3VudGVyIHRvIHRoZSBQTVUuCisgKiBJZiBhbGwgY291bnRlcnMgYXJlIG5vdCBhbHJlYWR5IGZyb3plbiwgdGhlbiB3ZSBkaXNhYmxlIGFuZAorICogcmUtZW5hYmxlIHRoZSBQTVUgaW4gb3JkZXIgdG8gZ2V0IGh3X3BlcmZfZW5hYmxlIHRvIGRvIHRoZQorICogYWN0dWFsIHdvcmsgb2YgcmVjb25maWd1cmluZyB0aGUgUE1VLgorICovCitzdGF0aWMgaW50IHBvd2VyX3BtdV9lbmFibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVodzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBuMDsKKwlpbnQgcmV0ID0gLUVBR0FJTjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlwZXJmX2Rpc2FibGUoKTsKKworCS8qCisJICogQWRkIHRoZSBjb3VudGVyIHRvIHRoZSBsaXN0IChpZiB0aGVyZSBpcyByb29tKQorCSAqIGFuZCBjaGVjayB3aGV0aGVyIHRoZSB0b3RhbCBzZXQgaXMgc3RpbGwgZmVhc2libGUuCisJICovCisJY3B1aHcgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCW4wID0gY3B1aHctPm5fY291bnRlcnM7CisJaWYgKG4wID49IHBwbXUtPm5fY291bnRlcikKKwkJZ290byBvdXQ7CisJY3B1aHctPmNvdW50ZXJbbjBdID0gY291bnRlcjsKKwljcHVody0+ZXZlbnRzW24wXSA9IGNvdW50ZXItPmh3LmNvbmZpZzsKKwljcHVody0+ZmxhZ3NbbjBdID0gY291bnRlci0+aHcuY291bnRlcl9iYXNlOworCWlmIChjaGVja19leGNsdWRlcyhjcHVody0+Y291bnRlciwgY3B1aHctPmZsYWdzLCBuMCwgMSkpCisJCWdvdG8gb3V0OworCWlmIChwb3dlcl9jaGVja19jb25zdHJhaW50cyhjcHVody0+ZXZlbnRzLCBjcHVody0+ZmxhZ3MsIG4wICsgMSkpCisJCWdvdG8gb3V0OworCisJY291bnRlci0+aHcuY29uZmlnID0gY3B1aHctPmV2ZW50c1tuMF07CisJKytjcHVody0+bl9jb3VudGVyczsKKwkrK2NwdWh3LT5uX2FkZGVkOworCisJcmV0ID0gMDsKKyBvdXQ6CisJcGVyZl9lbmFibGUoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlbW92ZSBhIGNvdW50ZXIgZnJvbSB0aGUgUE1VLgorICovCitzdGF0aWMgdm9pZCBwb3dlcl9wbXVfZGlzYWJsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWh3OworCWxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXBlcmZfZGlzYWJsZSgpOworCisJcG93ZXJfcG11X3JlYWQoY291bnRlcik7CisKKwljcHVodyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJZm9yIChpID0gMDsgaSA8IGNwdWh3LT5uX2NvdW50ZXJzOyArK2kpIHsKKwkJaWYgKGNvdW50ZXIgPT0gY3B1aHctPmNvdW50ZXJbaV0pIHsKKwkJCXdoaWxlICgrK2kgPCBjcHVody0+bl9jb3VudGVycykKKwkJCQljcHVody0+Y291bnRlcltpLTFdID0gY3B1aHctPmNvdW50ZXJbaV07CisJCQktLWNwdWh3LT5uX2NvdW50ZXJzOworCQkJcHBtdS0+ZGlzYWJsZV9wbWMoY291bnRlci0+aHcuaWR4IC0gMSwgY3B1aHctPm1tY3IpOworCQkJaWYgKGNvdW50ZXItPmh3LmlkeCkgeworCQkJCXdyaXRlX3BtYyhjb3VudGVyLT5ody5pZHgsIDApOworCQkJCWNvdW50ZXItPmh3LmlkeCA9IDA7CisJCQl9CisJCQlwZXJmX2NvdW50ZXJfdXBkYXRlX3VzZXJwYWdlKGNvdW50ZXIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IGNwdWh3LT5uX2xpbWl0ZWQ7ICsraSkKKwkJaWYgKGNvdW50ZXIgPT0gY3B1aHctPmxpbWl0ZWRfY291bnRlcltpXSkKKwkJCWJyZWFrOworCWlmIChpIDwgY3B1aHctPm5fbGltaXRlZCkgeworCQl3aGlsZSAoKytpIDwgY3B1aHctPm5fbGltaXRlZCkgeworCQkJY3B1aHctPmxpbWl0ZWRfY291bnRlcltpLTFdID0gY3B1aHctPmxpbWl0ZWRfY291bnRlcltpXTsKKwkJCWNwdWh3LT5saW1pdGVkX2h3aWR4W2ktMV0gPSBjcHVody0+bGltaXRlZF9od2lkeFtpXTsKKwkJfQorCQktLWNwdWh3LT5uX2xpbWl0ZWQ7CisJfQorCWlmIChjcHVody0+bl9jb3VudGVycyA9PSAwKSB7CisJCS8qIGRpc2FibGUgZXhjZXB0aW9ucyBpZiBubyBjb3VudGVycyBhcmUgcnVubmluZyAqLworCQljcHVody0+bW1jclswXSAmPSB+KE1NQ1IwX1BNWEUgfCBNTUNSMF9GQ0VDRSk7CisJfQorCisJcGVyZl9lbmFibGUoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBSZS1lbmFibGUgaW50ZXJydXB0cyBvbiBhIGNvdW50ZXIgYWZ0ZXIgdGhleSB3ZXJlIHRocm90dGxlZAorICogYmVjYXVzZSB0aGV5IHdlcmUgY29taW5nIHRvbyBmYXN0LgorICovCitzdGF0aWMgdm9pZCBwb3dlcl9wbXVfdW50aHJvdHRsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXM2NCB2YWwsIGxlZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY291bnRlci0+aHcuaWR4IHx8ICFjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kKQorCQlyZXR1cm47CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXBlcmZfZGlzYWJsZSgpOworCXBvd2VyX3BtdV9yZWFkKGNvdW50ZXIpOworCWxlZnQgPSBjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kOworCWNvdW50ZXItPmh3Lmxhc3RfcGVyaW9kID0gbGVmdDsKKwl2YWwgPSAwOworCWlmIChsZWZ0IDwgMHg4MDAwMDAwMEwpCisJCXZhbCA9IDB4ODAwMDAwMDBMIC0gbGVmdDsKKwl3cml0ZV9wbWMoY291bnRlci0+aHcuaWR4LCB2YWwpOworCWF0b21pYzY0X3NldCgmY291bnRlci0+aHcucHJldl9jb3VudCwgdmFsKTsKKwlhdG9taWM2NF9zZXQoJmNvdW50ZXItPmh3LnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwlwZXJmX2NvdW50ZXJfdXBkYXRlX3VzZXJwYWdlKGNvdW50ZXIpOworCXBlcmZfZW5hYmxlKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdHJ1Y3QgcG11IHBvd2VyX3BtdSA9IHsKKwkuZW5hYmxlCQk9IHBvd2VyX3BtdV9lbmFibGUsCisJLmRpc2FibGUJPSBwb3dlcl9wbXVfZGlzYWJsZSwKKwkucmVhZAkJPSBwb3dlcl9wbXVfcmVhZCwKKwkudW50aHJvdHRsZQk9IHBvd2VyX3BtdV91bnRocm90dGxlLAorfTsKKworLyoKKyAqIFJldHVybiAxIGlmIHdlIG1pZ2h0IGJlIGFibGUgdG8gcHV0IGNvdW50ZXIgb24gYSBsaW1pdGVkIFBNQywKKyAqIG9yIDAgaWYgbm90LgorICogQSBjb3VudGVyIGNhbiBvbmx5IGdvIG9uIGEgbGltaXRlZCBQTUMgaWYgaXQgY291bnRzIHNvbWV0aGluZworICogdGhhdCBhIGxpbWl0ZWQgUE1DIGNhbiBjb3VudCwgZG9lc24ndCByZXF1aXJlIGludGVycnVwdHMsIGFuZAorICogZG9lc24ndCBleGNsdWRlIGFueSBwcm9jZXNzb3IgbW9kZS4KKyAqLworc3RhdGljIGludCBjYW5fZ29fb25fbGltaXRlZF9wbWMoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgdTY0IGV2LAorCQkJCSB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IG47CisJdTY0IGFsdFtNQVhfRVZFTlRfQUxURVJOQVRJVkVTXTsKKworCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfdXNlcgorCSAgICB8fCBjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfa2VybmVsCisJICAgIHx8IGNvdW50ZXItPmF0dHIuZXhjbHVkZV9odgorCSAgICB8fCBjb3VudGVyLT5hdHRyLnNhbXBsZV9wZXJpb2QpCisJCXJldHVybiAwOworCisJaWYgKHBwbXUtPmxpbWl0ZWRfcG1jX2V2ZW50KGV2KSkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIFRoZSByZXF1ZXN0ZWQgZXZlbnQgaXNuJ3Qgb24gYSBsaW1pdGVkIFBNQyBhbHJlYWR5OworCSAqIHNlZSBpZiBhbnkgYWx0ZXJuYXRpdmUgY29kZSBnb2VzIG9uIGEgbGltaXRlZCBQTUMuCisJICovCisJaWYgKCFwcG11LT5nZXRfYWx0ZXJuYXRpdmVzKQorCQlyZXR1cm4gMDsKKworCWZsYWdzIHw9IFBQTVVfTElNSVRFRF9QTUNfT0sgfCBQUE1VX0xJTUlURURfUE1DX1JFUUQ7CisJbiA9IHBwbXUtPmdldF9hbHRlcm5hdGl2ZXMoZXYsIGZsYWdzLCBhbHQpOworCisJcmV0dXJuIG4gPiAwOworfQorCisvKgorICogRmluZCBhbiBhbHRlcm5hdGl2ZSBldmVudCB0aGF0IGdvZXMgb24gYSBub3JtYWwgUE1DLCBpZiBwb3NzaWJsZSwKKyAqIGFuZCByZXR1cm4gdGhlIGV2ZW50IGNvZGUsIG9yIDAgaWYgdGhlcmUgaXMgbm8gc3VjaCBhbHRlcm5hdGl2ZS4KKyAqIChOb3RlOiBldmVudCBjb2RlIDAgaXMgImRvbid0IGNvdW50IiBvbiBhbGwgbWFjaGluZXMuKQorICovCitzdGF0aWMgdTY0IG5vcm1hbF9wbWNfYWx0ZXJuYXRpdmUodTY0IGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXU2NCBhbHRbTUFYX0VWRU5UX0FMVEVSTkFUSVZFU107CisJaW50IG47CisKKwlmbGFncyAmPSB+KFBQTVVfTElNSVRFRF9QTUNfT0sgfCBQUE1VX0xJTUlURURfUE1DX1JFUUQpOworCW4gPSBwcG11LT5nZXRfYWx0ZXJuYXRpdmVzKGV2LCBmbGFncywgYWx0KTsKKwlpZiAoIW4pCisJCXJldHVybiAwOworCXJldHVybiBhbHRbMF07Cit9CisKKy8qIE51bWJlciBvZiBwZXJmX2NvdW50ZXJzIGNvdW50aW5nIGhhcmR3YXJlIGV2ZW50cyAqLworc3RhdGljIGF0b21pY190IG51bV9jb3VudGVyczsKKy8qIFVzZWQgdG8gYXZvaWQgcmFjZXMgaW4gY2FsbGluZyByZXNlcnZlL3JlbGVhc2VfcG1jX2hhcmR3YXJlICovCitzdGF0aWMgREVGSU5FX01VVEVYKHBtY19yZXNlcnZlX211dGV4KTsKKworLyoKKyAqIFJlbGVhc2UgdGhlIFBNVSBpZiB0aGlzIGlzIHRoZSBsYXN0IHBlcmZfY291bnRlci4KKyAqLworc3RhdGljIHZvaWQgaHdfcGVyZl9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlpZiAoIWF0b21pY19hZGRfdW5sZXNzKCZudW1fY291bnRlcnMsIC0xLCAxKSkgeworCQltdXRleF9sb2NrKCZwbWNfcmVzZXJ2ZV9tdXRleCk7CisJCWlmIChhdG9taWNfZGVjX3JldHVybigmbnVtX2NvdW50ZXJzKSA9PSAwKQorCQkJcmVsZWFzZV9wbWNfaGFyZHdhcmUoKTsKKwkJbXV0ZXhfdW5sb2NrKCZwbWNfcmVzZXJ2ZV9tdXRleCk7CisJfQorfQorCisvKgorICogVHJhbnNsYXRlIGEgZ2VuZXJpYyBjYWNoZSBldmVudCBjb25maWcgdG8gYSByYXcgZXZlbnQgY29kZS4KKyAqLworc3RhdGljIGludCBod19wZXJmX2NhY2hlX2V2ZW50KHU2NCBjb25maWcsIHU2NCAqZXZlbnRwKQoreworCXVuc2lnbmVkIGxvbmcgdHlwZSwgb3AsIHJlc3VsdDsKKwlpbnQgZXY7CisKKwlpZiAoIXBwbXUtPmNhY2hlX2V2ZW50cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiB1bnBhY2sgY29uZmlnICovCisJdHlwZSA9IGNvbmZpZyAmIDB4ZmY7CisJb3AgPSAoY29uZmlnID4+IDgpICYgMHhmZjsKKwlyZXN1bHQgPSAoY29uZmlnID4+IDE2KSAmIDB4ZmY7CisKKwlpZiAodHlwZSA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWCB8fAorCSAgICBvcCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCB8fAorCSAgICByZXN1bHQgPj0gUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWV2ID0gKCpwcG11LT5jYWNoZV9ldmVudHMpW3R5cGVdW29wXVtyZXN1bHRdOworCWlmIChldiA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKGV2ID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqZXZlbnRwID0gZXY7CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBwbXUgKmh3X3BlcmZfY291bnRlcl9pbml0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJdTY0IGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHBlcmZfY291bnRlciAqY3Ryc1tNQVhfSFdDT1VOVEVSU107CisJdTY0IGV2ZW50c1tNQVhfSFdDT1VOVEVSU107CisJdW5zaWduZWQgaW50IGNmbGFnc1tNQVhfSFdDT1VOVEVSU107CisJaW50IG47CisJaW50IGVycjsKKworCWlmICghcHBtdSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOWElPKTsKKwlzd2l0Y2ggKGNvdW50ZXItPmF0dHIudHlwZSkgeworCWNhc2UgUEVSRl9UWVBFX0hBUkRXQVJFOgorCQlldiA9IGNvdW50ZXItPmF0dHIuY29uZmlnOworCQlpZiAoZXYgPj0gcHBtdS0+bl9nZW5lcmljIHx8IHBwbXUtPmdlbmVyaWNfZXZlbnRzW2V2XSA9PSAwKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVPUE5PVFNVUFApOworCQlldiA9IHBwbXUtPmdlbmVyaWNfZXZlbnRzW2V2XTsKKwkJYnJlYWs7CisJY2FzZSBQRVJGX1RZUEVfSFdfQ0FDSEU6CisJCWVyciA9IGh3X3BlcmZfY2FjaGVfZXZlbnQoY291bnRlci0+YXR0ci5jb25maWcsICZldik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCQlicmVhazsKKwljYXNlIFBFUkZfVFlQRV9SQVc6CisJCWV2ID0gY291bnRlci0+YXR0ci5jb25maWc7CisJCWJyZWFrOworCX0KKwljb3VudGVyLT5ody5jb25maWdfYmFzZSA9IGV2OworCWNvdW50ZXItPmh3LmlkeCA9IDA7CisKKwkvKgorCSAqIElmIHdlIGFyZSBub3QgcnVubmluZyBvbiBhIGh5cGVydmlzb3IsIGZvcmNlIHRoZQorCSAqIGV4Y2x1ZGVfaHYgYml0IHRvIDAgc28gdGhhdCB3ZSBkb24ndCBjYXJlIHdoYXQKKwkgKiB0aGUgdXNlciBzZXQgaXQgdG8uCisJICovCisJaWYgKCFmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQorCQljb3VudGVyLT5hdHRyLmV4Y2x1ZGVfaHYgPSAwOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGVyLXRhc2sgY291bnRlciwgdGhlbiB3ZSBjYW4gdXNlCisJICogUE1fUlVOXyogZXZlbnRzIGludGVyY2hhbmdlYWJseSB3aXRoIHRoZWlyIG5vbiBSVU5fKgorCSAqIGVxdWl2YWxlbnRzLCBlLmcuIFBNX1JVTl9DWUMgaW5zdGVhZCBvZiBQTV9DWUMuCisJICogWFhYIHdlIHNob3VsZCBjaGVjayBpZiB0aGUgdGFzayBpcyBhbiBpZGxlIHRhc2suCisJICovCisJZmxhZ3MgPSAwOworCWlmIChjb3VudGVyLT5jdHgtPnRhc2spCisJCWZsYWdzIHw9IFBQTVVfT05MWV9DT1VOVF9SVU47CisKKwkvKgorCSAqIElmIHRoaXMgbWFjaGluZSBoYXMgbGltaXRlZCBjb3VudGVycywgY2hlY2sgd2hldGhlciB0aGlzCisJICogZXZlbnQgY291bGQgZ28gb24gYSBsaW1pdGVkIGNvdW50ZXIuCisJICovCisJaWYgKHBwbXUtPmZsYWdzICYgUFBNVV9MSU1JVEVEX1BNQzVfNikgeworCQlpZiAoY2FuX2dvX29uX2xpbWl0ZWRfcG1jKGNvdW50ZXIsIGV2LCBmbGFncykpIHsKKwkJCWZsYWdzIHw9IFBQTVVfTElNSVRFRF9QTUNfT0s7CisJCX0gZWxzZSBpZiAocHBtdS0+bGltaXRlZF9wbWNfZXZlbnQoZXYpKSB7CisJCQkvKgorCQkJICogVGhlIHJlcXVlc3RlZCBldmVudCBpcyBvbiBhIGxpbWl0ZWQgUE1DLAorCQkJICogYnV0IHdlIGNhbid0IHVzZSBhIGxpbWl0ZWQgUE1DOyBzZWUgaWYgYW55CisJCQkgKiBhbHRlcm5hdGl2ZSBnb2VzIG9uIGEgbm9ybWFsIFBNQy4KKwkJCSAqLworCQkJZXYgPSBub3JtYWxfcG1jX2FsdGVybmF0aXZlKGV2LCBmbGFncyk7CisJCQlpZiAoIWV2KQorCQkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGlzIGlzIGluIGEgZ3JvdXAsIGNoZWNrIGlmIGl0IGNhbiBnbyBvbiB3aXRoIGFsbCB0aGUKKwkgKiBvdGhlciBoYXJkd2FyZSBjb3VudGVycyBpbiB0aGUgZ3JvdXAuICBXZSBhc3N1bWUgdGhlIGNvdW50ZXIKKwkgKiBoYXNuJ3QgYmVlbiBsaW5rZWQgaW50byBpdHMgbGVhZGVyJ3Mgc2libGluZyBsaXN0IGF0IHRoaXMgcG9pbnQuCisJICovCisJbiA9IDA7CisJaWYgKGNvdW50ZXItPmdyb3VwX2xlYWRlciAhPSBjb3VudGVyKSB7CisJCW4gPSBjb2xsZWN0X2V2ZW50cyhjb3VudGVyLT5ncm91cF9sZWFkZXIsIHBwbXUtPm5fY291bnRlciAtIDEsCisJCQkJICAgY3RycywgZXZlbnRzLCBjZmxhZ3MpOworCQlpZiAobiA8IDApCisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisJZXZlbnRzW25dID0gZXY7CisJY3Ryc1tuXSA9IGNvdW50ZXI7CisJY2ZsYWdzW25dID0gZmxhZ3M7CisJaWYgKGNoZWNrX2V4Y2x1ZGVzKGN0cnMsIGNmbGFncywgbiwgMSkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWlmIChwb3dlcl9jaGVja19jb25zdHJhaW50cyhldmVudHMsIGNmbGFncywgbiArIDEpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWNvdW50ZXItPmh3LmNvbmZpZyA9IGV2ZW50c1tuXTsKKwljb3VudGVyLT5ody5jb3VudGVyX2Jhc2UgPSBjZmxhZ3Nbbl07CisJY291bnRlci0+aHcubGFzdF9wZXJpb2QgPSBjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kOworCWF0b21pYzY0X3NldCgmY291bnRlci0+aHcucGVyaW9kX2xlZnQsIGNvdW50ZXItPmh3Lmxhc3RfcGVyaW9kKTsKKworCS8qCisJICogU2VlIGlmIHdlIG5lZWQgdG8gcmVzZXJ2ZSB0aGUgUE1VLgorCSAqIElmIG5vIGNvdW50ZXJzIGFyZSBjdXJyZW50bHkgaW4gdXNlLCB0aGVuIHdlIGhhdmUgdG8gdGFrZSBhCisJICogbXV0ZXggdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgcmFjZSB3aXRoIGFub3RoZXIgdGFzayBkb2luZworCSAqIHJlc2VydmVfcG1jX2hhcmR3YXJlIG9yIHJlbGVhc2VfcG1jX2hhcmR3YXJlLgorCSAqLworCWVyciA9IDA7CisJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZudW1fY291bnRlcnMpKSB7CisJCW11dGV4X2xvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwkJaWYgKGF0b21pY19yZWFkKCZudW1fY291bnRlcnMpID09IDAgJiYKKwkJICAgIHJlc2VydmVfcG1jX2hhcmR3YXJlKHBlcmZfY291bnRlcl9pbnRlcnJ1cHQpKQorCQkJZXJyID0gLUVCVVNZOworCQllbHNlCisJCQlhdG9taWNfaW5jKCZudW1fY291bnRlcnMpOworCQltdXRleF91bmxvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwl9CisJY291bnRlci0+ZGVzdHJveSA9IGh3X3BlcmZfY291bnRlcl9kZXN0cm95OworCisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwlyZXR1cm4gJnBvd2VyX3BtdTsKK30KKworLyoKKyAqIEEgY291bnRlciBoYXMgb3ZlcmZsb3dlZDsgdXBkYXRlIGl0cyBjb3VudCBhbmQgcmVjb3JkCisgKiB0aGluZ3MgaWYgcmVxdWVzdGVkLiAgTm90ZSB0aGF0IGludGVycnVwdHMgYXJlIGhhcmQtZGlzYWJsZWQKKyAqIGhlcmUgc28gdGhlcmUgaXMgbm8gcG9zc2liaWxpdHkgb2YgYmVpbmcgaW50ZXJydXB0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJlY29yZF9hbmRfcmVzdGFydChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBsb25nIHZhbCwKKwkJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IG5taSkKK3sKKwl1NjQgcGVyaW9kID0gY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZDsKKwlzNjQgcHJldiwgZGVsdGEsIGxlZnQ7CisJaW50IHJlY29yZCA9IDA7CisJdTY0IGFkZHIsIG1tY3JhLCBzZHN5bmM7CisKKwkvKiB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGludGVycnVwdHMgaGVyZSAqLworCXByZXYgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyLT5ody5wcmV2X2NvdW50KTsKKwlkZWx0YSA9ICh2YWwgLSBwcmV2KSAmIDB4ZmZmZmZmZmZ1bDsKKwlhdG9taWM2NF9hZGQoZGVsdGEsICZjb3VudGVyLT5jb3VudCk7CisKKwkvKgorCSAqIFNlZSBpZiB0aGUgdG90YWwgcGVyaW9kIGZvciB0aGlzIGNvdW50ZXIgaGFzIGV4cGlyZWQsCisJICogYW5kIHVwZGF0ZSBmb3IgdGhlIG5leHQgcGVyaW9kLgorCSAqLworCXZhbCA9IDA7CisJbGVmdCA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmh3LnBlcmlvZF9sZWZ0KSAtIGRlbHRhOworCWlmIChwZXJpb2QpIHsKKwkJaWYgKGxlZnQgPD0gMCkgeworCQkJbGVmdCArPSBwZXJpb2Q7CisJCQlpZiAobGVmdCA8PSAwKQorCQkJCWxlZnQgPSBwZXJpb2Q7CisJCQlyZWNvcmQgPSAxOworCQl9CisJCWlmIChsZWZ0IDwgMHg4MDAwMDAwMEwpCisJCQl2YWwgPSAweDgwMDAwMDAwTCAtIGxlZnQ7CisJfQorCisJLyoKKwkgKiBGaW5hbGx5IHJlY29yZCBkYXRhIGlmIHJlcXVlc3RlZC4KKwkgKi8KKwlpZiAocmVjb3JkKSB7CisJCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIGRhdGEgPSB7CisJCQkucmVncwk9IHJlZ3MsCisJCQkuYWRkcgk9IDAsCisJCQkucGVyaW9kCT0gY291bnRlci0+aHcubGFzdF9wZXJpb2QsCisJCX07CisKKwkJaWYgKGNvdW50ZXItPmF0dHIuc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9BRERSKSB7CisJCQkvKgorCQkJICogVGhlIHVzZXIgd2FudHMgYSBkYXRhIGFkZHJlc3MgcmVjb3JkZWQuCisJCQkgKiBJZiB3ZSdyZSBub3QgZG9pbmcgaW5zdHJ1Y3Rpb24gc2FtcGxpbmcsCisJCQkgKiBnaXZlIHRoZW0gdGhlIFNEQVIgKHNhbXBsZWQgZGF0YSBhZGRyZXNzKS4KKwkJCSAqIElmIHdlIGFyZSBkb2luZyBpbnN0cnVjdGlvbiBzYW1wbGluZywgdGhlbiBvbmx5CisJCQkgKiBnaXZlIHRoZW0gdGhlIFNEQVIgaWYgaXQgY29ycmVzcG9uZHMgdG8gdGhlCisJCQkgKiBpbnN0cnVjdGlvbiBwb2ludGVkIHRvIGJ5IFNJQVI7IHRoaXMgaXMgaW5kaWNhdGVkCisJCQkgKiBieSB0aGUgW1BPV0VSNl9dTU1DUkFfU0RTWU5DIGJpdCBpbiBNTUNSQS4KKwkJCSAqLworCQkJbW1jcmEgPSByZWdzLT5kc2lzcjsKKwkJCXNkc3luYyA9IChwcG11LT5mbGFncyAmIFBQTVVfQUxUX1NJUFIpID8KKwkJCQlQT1dFUjZfTU1DUkFfU0RTWU5DIDogTU1DUkFfU0RTWU5DOworCQkJaWYgKCEobW1jcmEgJiBNTUNSQV9TQU1QTEVfRU5BQkxFKSB8fCAobW1jcmEgJiBzZHN5bmMpKQorCQkJCWRhdGEuYWRkciA9IG1mc3ByKFNQUk5fU0RBUik7CisJCX0KKwkJaWYgKHBlcmZfY291bnRlcl9vdmVyZmxvdyhjb3VudGVyLCBubWksICZkYXRhKSkgeworCQkJLyoKKwkJCSAqIEludGVycnVwdHMgYXJlIGNvbWluZyB0b28gZmFzdCAtIHRocm90dGxlIHRoZW0KKwkJCSAqIGJ5IHNldHRpbmcgdGhlIGNvdW50ZXIgdG8gMCwgc28gaXQgd2lsbCBiZQorCQkJICogYXQgbGVhc3QgMl4zMCBjeWNsZXMgdW50aWwgdGhlIG5leHQgaW50ZXJydXB0CisJCQkgKiAoYXNzdW1pbmcgZWFjaCBjb3VudGVyIGNvdW50cyBhdCBtb3N0IDIgY291bnRzCisJCQkgKiBwZXIgY3ljbGUpLgorCQkJICovCisJCQl2YWwgPSAwOworCQkJbGVmdCA9IH4wVUxMID4+IDE7CisJCX0KKwl9CisKKwl3cml0ZV9wbWMoY291bnRlci0+aHcuaWR4LCB2YWwpOworCWF0b21pYzY0X3NldCgmY291bnRlci0+aHcucHJldl9jb3VudCwgdmFsKTsKKwlhdG9taWM2NF9zZXQoJmNvdW50ZXItPmh3LnBlcmlvZF9sZWZ0LCBsZWZ0KTsKKwlwZXJmX2NvdW50ZXJfdXBkYXRlX3VzZXJwYWdlKGNvdW50ZXIpOworfQorCisvKgorICogQ2FsbGVkIGZyb20gZ2VuZXJpYyBjb2RlIHRvIGdldCB0aGUgbWlzYyBmbGFncyAoaS5lLiBwcm9jZXNzb3IgbW9kZSkKKyAqIGZvciBhbiBldmVudC4KKyAqLwordW5zaWduZWQgbG9uZyBwZXJmX21pc2NfZmxhZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBtbWNyYTsKKworCWlmIChUUkFQKHJlZ3MpICE9IDB4ZjAwKSB7CisJCS8qIG5vdCBhIFBNVSBpbnRlcnJ1cHQgKi8KKwkJcmV0dXJuIHVzZXJfbW9kZShyZWdzKSA/IFBFUkZfRVZFTlRfTUlTQ19VU0VSIDoKKwkJCVBFUkZfRVZFTlRfTUlTQ19LRVJORUw7CisJfQorCisJbW1jcmEgPSByZWdzLT5kc2lzcjsKKwlpZiAocHBtdS0+ZmxhZ3MgJiBQUE1VX0FMVF9TSVBSKSB7CisJCWlmIChtbWNyYSAmIFBPV0VSNl9NTUNSQV9TSUhWKQorCQkJcmV0dXJuIFBFUkZfRVZFTlRfTUlTQ19IWVBFUlZJU09SOworCQlyZXR1cm4gKG1tY3JhICYgUE9XRVI2X01NQ1JBX1NJUFIpID8gUEVSRl9FVkVOVF9NSVNDX1VTRVIgOgorCQkJUEVSRl9FVkVOVF9NSVNDX0tFUk5FTDsKKwl9CisJaWYgKG1tY3JhICYgTU1DUkFfU0lIVikKKwkJcmV0dXJuIFBFUkZfRVZFTlRfTUlTQ19IWVBFUlZJU09SOworCXJldHVybiAobW1jcmEgJiBNTUNSQV9TSVBSKSA/IFBFUkZfRVZFTlRfTUlTQ19VU0VSIDoKKwkJCVBFUkZfRVZFTlRfTUlTQ19LRVJORUw7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBnZW5lcmljIGNvZGUgdG8gZ2V0IHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyCisgKiBmb3IgYW4gZXZlbnQuCisgKi8KK3Vuc2lnbmVkIGxvbmcgcGVyZl9pbnN0cnVjdGlvbl9wb2ludGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgbW1jcmE7CisJdW5zaWduZWQgbG9uZyBpcDsKKwl1bnNpZ25lZCBsb25nIHNsb3Q7CisKKwlpZiAoVFJBUChyZWdzKSAhPSAweGYwMCkKKwkJcmV0dXJuIHJlZ3MtPm5pcDsJLyogbm90IGEgUE1VIGludGVycnVwdCAqLworCisJaXAgPSBtZnNwcihTUFJOX1NJQVIpOworCW1tY3JhID0gcmVncy0+ZHNpc3I7CisJaWYgKChtbWNyYSAmIE1NQ1JBX1NBTVBMRV9FTkFCTEUpICYmICEocHBtdS0+ZmxhZ3MgJiBQUE1VX0FMVF9TSVBSKSkgeworCQlzbG90ID0gKG1tY3JhICYgTU1DUkFfU0xPVCkgPj4gTU1DUkFfU0xPVF9TSElGVDsKKwkJaWYgKHNsb3QgPiAxKQorCQkJaXAgKz0gNCAqIChzbG90IC0gMSk7CisJfQorCXJldHVybiBpcDsKK30KKworLyoKKyAqIFBlcmZvcm1hbmNlIG1vbml0b3IgaW50ZXJydXB0IHN0dWZmCisgKi8KK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGk7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1aHcgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJbG9uZyB2YWw7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgbm1pOworCisJaWYgKGNwdWh3LT5uX2xpbWl0ZWQpCisJCWZyZWV6ZV9saW1pdGVkX2NvdW50ZXJzKGNwdWh3LCBtZnNwcihTUFJOX1BNQzUpLAorCQkJCQltZnNwcihTUFJOX1BNQzYpKTsKKworCS8qCisJICogT3ZlcmxvYWQgcmVncy0+ZHNpc3IgdG8gc3RvcmUgTU1DUkEgc28gd2Ugb25seSBuZWVkIHRvIHJlYWQgaXQgb25jZS4KKwkgKi8KKwlyZWdzLT5kc2lzciA9IG1mc3ByKFNQUk5fTU1DUkEpOworCisJLyoKKwkgKiBJZiBpbnRlcnJ1cHRzIHdlcmUgc29mdC1kaXNhYmxlZCB3aGVuIHRoaXMgUE1VIGludGVycnVwdAorCSAqIG9jY3VycmVkLCB0cmVhdCBpdCBhcyBhbiBOTUkuCisJICovCisJbm1pID0gIXJlZ3MtPnNvZnRlOworCWlmIChubWkpCisJCW5taV9lbnRlcigpOworCWVsc2UKKwkJaXJxX2VudGVyKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3B1aHctPm5fY291bnRlcnM7ICsraSkgeworCQljb3VudGVyID0gY3B1aHctPmNvdW50ZXJbaV07CisJCWlmICghY291bnRlci0+aHcuaWR4IHx8IGlzX2xpbWl0ZWRfcG1jKGNvdW50ZXItPmh3LmlkeCkpCisJCQljb250aW51ZTsKKwkJdmFsID0gcmVhZF9wbWMoY291bnRlci0+aHcuaWR4KTsKKwkJaWYgKChpbnQpdmFsIDwgMCkgeworCQkJLyogY291bnRlciBoYXMgb3ZlcmZsb3dlZCAqLworCQkJZm91bmQgPSAxOworCQkJcmVjb3JkX2FuZF9yZXN0YXJ0KGNvdW50ZXIsIHZhbCwgcmVncywgbm1pKTsKKwkJfQorCX0KKworCS8qCisJICogSW4gY2FzZSB3ZSBkaWRuJ3QgZmluZCBhbmQgcmVzZXQgdGhlIGNvdW50ZXIgdGhhdCBjYXVzZWQKKwkgKiB0aGUgaW50ZXJydXB0LCBzY2FuIGFsbCBjb3VudGVycyBhbmQgcmVzZXQgYW55IHRoYXQgYXJlCisJICogbmVnYXRpdmUsIHRvIGF2b2lkIGdldHRpbmcgY29udGludWFsIGludGVycnVwdHMuCisJICogQW55IHRoYXQgd2UgcHJvY2Vzc2VkIGluIHRoZSBwcmV2aW91cyBsb29wIHdpbGwgbm90IGJlIG5lZ2F0aXZlLgorCSAqLworCWlmICghZm91bmQpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBwbXUtPm5fY291bnRlcjsgKytpKSB7CisJCQlpZiAoaXNfbGltaXRlZF9wbWMoaSArIDEpKQorCQkJCWNvbnRpbnVlOworCQkJdmFsID0gcmVhZF9wbWMoaSArIDEpOworCQkJaWYgKChpbnQpdmFsIDwgMCkKKwkJCQl3cml0ZV9wbWMoaSArIDEsIDApOworCQl9CisJfQorCisJLyoKKwkgKiBSZXNldCBNTUNSMCB0byBpdHMgbm9ybWFsIHZhbHVlLiAgVGhpcyB3aWxsIHNldCBQTVhFIGFuZAorCSAqIGNsZWFyIEZDIChmcmVlemUgY291bnRlcnMpIGFuZCBQTUFPIChwZXJmIG1vbiBhbGVydCBvY2N1cnJlZCkKKwkgKiBhbmQgdGh1cyBhbGxvdyBpbnRlcnJ1cHRzIHRvIG9jY3VyIGFnYWluLgorCSAqIFhYWCBtaWdodCB3YW50IHRvIHVzZSBNU1IuUE0gdG8ga2VlcCB0aGUgY291bnRlcnMgZnJvemVuIHVudGlsCisJICogd2UgZ2V0IGJhY2sgb3V0IG9mIHRoaXMgaW50ZXJydXB0LgorCSAqLworCXdyaXRlX21tY3IwKGNwdWh3LCBjcHVody0+bW1jclswXSk7CisKKwlpZiAobm1pKQorCQlubWlfZXhpdCgpOworCWVsc2UKKwkJaXJxX2V4aXQoKTsKK30KKwordm9pZCBod19wZXJmX2NvdW50ZXJfc2V0dXAoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVodyA9ICZwZXJfY3B1KGNwdV9od19jb3VudGVycywgY3B1KTsKKworCW1lbXNldChjcHVodywgMCwgc2l6ZW9mKCpjcHVodykpOworCWNwdWh3LT5tbWNyWzBdID0gTU1DUjBfRkM7Cit9CisKK2V4dGVybiBzdHJ1Y3QgcG93ZXJfcG11IHBvd2VyNF9wbXU7CitleHRlcm4gc3RydWN0IHBvd2VyX3BtdSBwcGM5NzBfcG11OworZXh0ZXJuIHN0cnVjdCBwb3dlcl9wbXUgcG93ZXI1X3BtdTsKK2V4dGVybiBzdHJ1Y3QgcG93ZXJfcG11IHBvd2VyNXBfcG11OworZXh0ZXJuIHN0cnVjdCBwb3dlcl9wbXUgcG93ZXI2X3BtdTsKK2V4dGVybiBzdHJ1Y3QgcG93ZXJfcG11IHBvd2VyN19wbXU7CisKK3N0YXRpYyBpbnQgaW5pdF9wZXJmX2NvdW50ZXJzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBwdnI7CisKKwkvKiBYWFggc2hvdWxkIGdldCB0aGlzIGZyb20gY3B1dGFibGUgKi8KKwlwdnIgPSBtZnNwcihTUFJOX1BWUik7CisJc3dpdGNoIChQVlJfVkVSKHB2cikpIHsKKwljYXNlIFBWX1BPV0VSNDoKKwljYXNlIFBWX1BPV0VSNHA6CisJCXBwbXUgPSAmcG93ZXI0X3BtdTsKKwkJYnJlYWs7CisJY2FzZSBQVl85NzA6CisJY2FzZSBQVl85NzBGWDoKKwljYXNlIFBWXzk3ME1QOgorCQlwcG11ID0gJnBwYzk3MF9wbXU7CisJCWJyZWFrOworCWNhc2UgUFZfUE9XRVI1OgorCQlwcG11ID0gJnBvd2VyNV9wbXU7CisJCWJyZWFrOworCWNhc2UgUFZfUE9XRVI1cDoKKwkJcHBtdSA9ICZwb3dlcjVwX3BtdTsKKwkJYnJlYWs7CisJY2FzZSAweDNlOgorCQlwcG11ID0gJnBvd2VyNl9wbXU7CisJCWJyZWFrOworCWNhc2UgMHgzZjoKKwkJcHBtdSA9ICZwb3dlcjdfcG11OworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFVzZSBGQ0hWIHRvIGlnbm9yZSBrZXJuZWwgZXZlbnRzIGlmIE1TUi5IViBpcyBzZXQuCisJICovCisJaWYgKG1mbXNyKCkgJiBNU1JfSFYpCisJCWZyZWV6ZV9jb3VudGVyc19rZXJuZWwgPSBNTUNSMF9GQ0hWOworCisJcmV0dXJuIDA7Cit9CisKK2FyY2hfaW5pdGNhbGwoaW5pdF9wZXJmX2NvdW50ZXJzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI0LXBtdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjQtcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiZDMwOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI0LXBtdS5jCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICogUGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IGZvciBQT1dFUjQgKEdQKSBhbmQgUE9XRVI0KyAoR1EpIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IDIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorCisvKgorICogQml0cyBpbiBldmVudCBjb2RlIGZvciBQT1dFUjQKKyAqLworI2RlZmluZSBQTV9QTUNfU0gJMTIJLyogUE1DIG51bWJlciAoMS1iYXNlZCkgZm9yIGRpcmVjdCBldmVudHMgKi8KKyNkZWZpbmUgUE1fUE1DX01TSwkweGYKKyNkZWZpbmUgUE1fVU5JVF9TSAk4CS8qIFRUTU1VWCBudW1iZXIgYW5kIHNldHRpbmcgLSB1bml0IHNlbGVjdCAqLworI2RlZmluZSBQTV9VTklUX01TSwkweGYKKyNkZWZpbmUgUE1fTE9XRVJfU0gJNgorI2RlZmluZSBQTV9MT1dFUl9NU0sJMQorI2RlZmluZSBQTV9MT1dFUl9NU0tTCTB4NDAKKyNkZWZpbmUgUE1fQllURV9TSAk0CS8qIEJ5dGUgbnVtYmVyIG9mIGV2ZW50IGJ1cyB0byB1c2UgKi8KKyNkZWZpbmUgUE1fQllURV9NU0sJMworI2RlZmluZSBQTV9QTUNTRUxfTVNLCTcKKworLyoKKyAqIFVuaXQgY29kZSB2YWx1ZXMKKyAqLworI2RlZmluZSBQTV9GUFUJCTEKKyNkZWZpbmUgUE1fSVNVMQkJMgorI2RlZmluZSBQTV9JRlUJCTMKKyNkZWZpbmUgUE1fSURVMAkJNAorI2RlZmluZSBQTV9JU1UxX0FMVAk2CisjZGVmaW5lIFBNX0lTVTIJCTcKKyNkZWZpbmUgUE1fSUZVX0FMVAk4CisjZGVmaW5lIFBNX0xTVTAJCTkKKyNkZWZpbmUgUE1fTFNVMQkJMHhjCisjZGVmaW5lIFBNX0dQUwkJMHhmCisKKy8qCisgKiBCaXRzIGluIE1NQ1IwIGZvciBQT1dFUjQKKyAqLworI2RlZmluZSBNTUNSMF9QTUMxU0VMX1NICTgKKyNkZWZpbmUgTU1DUjBfUE1DMlNFTF9TSAkxCisjZGVmaW5lIE1NQ1JfUE1DU0VMX01TSwkJMHgxZgorCisvKgorICogQml0cyBpbiBNTUNSMSBmb3IgUE9XRVI0CisgKi8KKyNkZWZpbmUgTU1DUjFfVFRNMFNFTF9TSAk2MgorI2RlZmluZSBNTUNSMV9UVEMwU0VMX1NICTYxCisjZGVmaW5lIE1NQ1IxX1RUTTFTRUxfU0gJNTkKKyNkZWZpbmUgTU1DUjFfVFRDMVNFTF9TSAk1OAorI2RlZmluZSBNTUNSMV9UVE0yU0VMX1NICTU2CisjZGVmaW5lIE1NQ1IxX1RUQzJTRUxfU0gJNTUKKyNkZWZpbmUgTU1DUjFfVFRNM1NFTF9TSAk1MworI2RlZmluZSBNTUNSMV9UVEMzU0VMX1NICTUyCisjZGVmaW5lIE1NQ1IxX1RUTVNFTF9NU0sJMworI2RlZmluZSBNTUNSMV9URF9DUF9EQkcwU0VMX1NICTUwCisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzFTRUxfU0gJNDgKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHMlNFTF9TSAk0NgorI2RlZmluZSBNTUNSMV9URF9DUF9EQkczU0VMX1NICTQ0CisjZGVmaW5lIE1NQ1IxX0RFQlVHMFNFTF9TSAk0MworI2RlZmluZSBNTUNSMV9ERUJVRzFTRUxfU0gJNDIKKyNkZWZpbmUgTU1DUjFfREVCVUcyU0VMX1NICTQxCisjZGVmaW5lIE1NQ1IxX0RFQlVHM1NFTF9TSAk0MAorI2RlZmluZSBNTUNSMV9QTUMxX0FEREVSX1NFTF9TSAkzOQorI2RlZmluZSBNTUNSMV9QTUMyX0FEREVSX1NFTF9TSAkzOAorI2RlZmluZSBNTUNSMV9QTUM2X0FEREVSX1NFTF9TSAkzNworI2RlZmluZSBNTUNSMV9QTUM1X0FEREVSX1NFTF9TSAkzNgorI2RlZmluZSBNTUNSMV9QTUM4X0FEREVSX1NFTF9TSAkzNQorI2RlZmluZSBNTUNSMV9QTUM3X0FEREVSX1NFTF9TSAkzNAorI2RlZmluZSBNTUNSMV9QTUMzX0FEREVSX1NFTF9TSAkzMworI2RlZmluZSBNTUNSMV9QTUM0X0FEREVSX1NFTF9TSAkzMgorI2RlZmluZSBNTUNSMV9QTUMzU0VMX1NICTI3CisjZGVmaW5lIE1NQ1IxX1BNQzRTRUxfU0gJMjIKKyNkZWZpbmUgTU1DUjFfUE1DNVNFTF9TSAkxNworI2RlZmluZSBNTUNSMV9QTUM2U0VMX1NICTEyCisjZGVmaW5lIE1NQ1IxX1BNQzdTRUxfU0gJNworI2RlZmluZSBNTUNSMV9QTUM4U0VMX1NICTIJLyogbm90ZSBiaXQgMCBpcyBpbiBNTUNSQSBmb3IgR1AgKi8KKworc3RhdGljIHNob3J0IG1tY3IxX2FkZGVyX2JpdHNbOF0gPSB7CisJTU1DUjFfUE1DMV9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DMl9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DM19BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DNF9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DNV9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DNl9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DN19BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DOF9BRERFUl9TRUxfU0gKK307CisKKy8qCisgKiBCaXRzIGluIE1NQ1JBCisgKi8KKyNkZWZpbmUgTU1DUkFfUE1DOFNFTDBfU0gJMTcJLyogUE1DOFNFTCBiaXQgMCBmb3IgR1AgKi8KKworLyoKKyAqIExheW91dCBvZiBjb25zdHJhaW50IGJpdHM6CisgKiA2NjY2NTU1NTU1NTU1NTQ0NDQ0NDQ0NDQzMzMzMzMzMzMzMjIyMjIyMjIyMjExMTExMTExMTEwMDAwMDAwMDAwCisgKiAzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwCisgKiAgICAgICAgfFsgID5bICA+WyAgID58fHxbICA+WyAgPjwgID48ICA+PCAgPjwgID48Pjw+PD48Pjw+PD48Pjw+CisgKiAgICAgICAgfCBVQzEgVUMyIFVDMyB8fHwgUFMxIFBTMiBCMCAgQjEgIEIyICBCMyBQMVAyUDNQNFA1UDZQN1A4CisgKiAJICBcU01QTAkgICAgICAgIHx8XFRUQzNTRUwKKyAqIAkJICAgICAgICB8XFRUQ19JRlVfU0VMCisgKiAJCSAgICAgICAgXFRUTTJTRUwwCisgKgorICogU01QTCAtIFNBTVBMRV9FTkFCTEUgY29uc3RyYWludAorICogICAgIDU2OiBTQU1QTEVfRU5BQkxFIHZhbHVlIDB4MDEwMF8wMDAwXzAwMDBfMDAwMAorICoKKyAqIFVDMSAtIHVuaXQgY29uc3RyYWludCAxOiBjYW4ndCBoYXZlIGFsbCB0aHJlZSBvZiBGUFUvSVNVMS9JRFUwfElTVTIKKyAqICAgICA1NTogVUMxIGVycm9yIDB4MDA4MF8wMDAwXzAwMDBfMDAwMAorICogICAgIDU0OiBGUFUgZXZlbnRzIG5lZWRlZCAweDAwNDBfMDAwMF8wMDAwXzAwMDAKKyAqICAgICA1MzogSVNVMSBldmVudHMgbmVlZGVkIDB4MDAyMF8wMDAwXzAwMDBfMDAwMAorICogICAgIDUyOiBJRFUwfElTVTIgZXZlbnRzIG5lZWRlZCAweDAwMTBfMDAwMF8wMDAwXzAwMDAKKyAqCisgKiBVQzIgLSB1bml0IGNvbnN0cmFpbnQgMjogY2FuJ3QgaGF2ZSBhbGwgdGhyZWUgb2YgRlBVL0lGVS9MU1UwCisgKiAgICAgNTE6IFVDMiBlcnJvciAweDAwMDhfMDAwMF8wMDAwXzAwMDAKKyAqICAgICA1MDogRlBVIGV2ZW50cyBuZWVkZWQgMHgwMDA0XzAwMDBfMDAwMF8wMDAwCisgKiAgICAgNDk6IElGVSBldmVudHMgbmVlZGVkIDB4MDAwMl8wMDAwXzAwMDBfMDAwMAorICogICAgIDQ4OiBMU1UwIGV2ZW50cyBuZWVkZWQgMHgwMDAxXzAwMDBfMDAwMF8wMDAwCisgKgorICogVUMzIC0gdW5pdCBjb25zdHJhaW50IDM6IGNhbid0IGhhdmUgYWxsIGZvdXIgb2YgTFNVMC9JRlUvSURVMHxJU1UyL0lTVTEKKyAqICAgICA0NzogVUMzIGVycm9yIDB4ODAwMF8wMDAwXzAwMDAKKyAqICAgICA0NjogTFNVMCBldmVudHMgbmVlZGVkIDB4NDAwMF8wMDAwXzAwMDAKKyAqICAgICA0NTogSUZVIGV2ZW50cyBuZWVkZWQgMHgyMDAwXzAwMDBfMDAwMAorICogICAgIDQ0OiBJRFUwfElTVTIgZXZlbnRzIG5lZWRlZCAweDEwMDBfMDAwMF8wMDAwCisgKiAgICAgNDM6IElTVTEgZXZlbnRzIG5lZWRlZCAweDA4MDBfMDAwMF8wMDAwCisgKgorICogVFRNMlNFTDAKKyAqICAgICA0MjogMCA9IElEVTAgZXZlbnRzIG5lZWRlZAorICogICAgIAkgICAxID0gSVNVMiBldmVudHMgbmVlZGVkIDB4MDQwMF8wMDAwXzAwMDAKKyAqCisgKiBUVENfSUZVX1NFTAorICogICAgIDQxOiAwID0gSUZVLlUgZXZlbnRzIG5lZWRlZAorICogICAgIAkgICAxID0gSUZVLkwgZXZlbnRzIG5lZWRlZCAweDAyMDBfMDAwMF8wMDAwCisgKgorICogVFRDM1NFTAorICogICAgIDQwOiAwID0gTFNVMS5VIGV2ZW50cyBuZWVkZWQKKyAqICAgICAJICAgMSA9IExTVTEuTCBldmVudHMgbmVlZGVkIDB4MDEwMF8wMDAwXzAwMDAKKyAqCisgKiBQUzEKKyAqICAgICAzOTogUFMxIGVycm9yIDB4MDA4MF8wMDAwXzAwMDAKKyAqICAgICAzNi0zODogY291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMS8yLzUvNiAweDAwNzBfMDAwMF8wMDAwCisgKgorICogUFMyCisgKiAgICAgMzU6IFBTMiBlcnJvciAweDAwMDhfMDAwMF8wMDAwCisgKiAgICAgMzItMzQ6IGNvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzMvNC83LzggMHgwMDA3XzAwMDBfMDAwMAorICoKKyAqIEIwCisgKiAgICAgMjgtMzE6IEJ5dGUgMCBldmVudCBzb3VyY2UgMHhmMDAwXzAwMDAKKyAqICAgICAJICAgMSA9IEZQVQorICogCSAgIDIgPSBJU1UxCisgKiAJICAgMyA9IElGVQorICogCSAgIDQgPSBJRFUwCisgKiAJICAgNyA9IElTVTIKKyAqIAkgICA5ID0gTFNVMAorICogCSAgIGMgPSBMU1UxCisgKiAJICAgZiA9IEdQUworICoKKyAqIEIxLCBCMiwgQjMKKyAqICAgICAyNC0yNywgMjAtMjMsIDE2LTE5OiBCeXRlIDEsIDIsIDMgZXZlbnQgc291cmNlcworICoKKyAqIFA4CisgKiAgICAgMTU6IFA4IGVycm9yIDB4ODAwMAorICogICAgIDE0LTE1OiBDb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUM4CisgKgorICogUDEuLlA3CisgKiAgICAgMC0xMzogQ291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMS4uUE1DNworICoKKyAqIE5vdGU6IHRoaXMgZG9lc24ndCBhbGxvdyBldmVudHMgdXNpbmcgSUZVLlUgdG8gYmUgY29tYmluZWQgd2l0aCBldmVudHMKKyAqIHVzaW5nIElGVS5MLCB0aG91Z2ggdGhhdCBpcyBmZWFzaWJsZSAodXNpbmcgVFRNMCBhbmQgVFRNMikuICBIb3dldmVyCisgKiB0aGVyZSBhcmUgbm8gbGlzdGVkIGV2ZW50cyBmb3IgSUZVLkwgKHRoZXkgYXJlIGRlYnVnIGV2ZW50cyBub3QKKyAqIHZlcmlmaWVkIGZvciBwZXJmb3JtYW5jZSBtb25pdG9yaW5nKSBzbyB0aGlzIHNob3VsZG4ndCBjYXVzZSBhCisgKiBwcm9ibGVtLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgdW5pdGluZm8geworCXU2NAl2YWx1ZSwgbWFzazsKKwlpbnQJdW5pdDsKKwlpbnQJbG93ZXJiaXQ7Cit9IHA0X3VuaXRpbmZvWzE2XSA9IHsKKwlbUE1fRlBVXSAgPSB7IDB4NDQwMDAwMDAwMDAwMDB1bGwsIDB4ODgwMDAwMDAwMDAwMDB1bGwsIFBNX0ZQVSwgMCB9LAorCVtQTV9JU1UxXSA9IHsgMHgyMDA4MDAwMDAwMDAwMHVsbCwgMHg4ODAwMDAwMDAwMDAwMHVsbCwgUE1fSVNVMSwgMCB9LAorCVtQTV9JU1UxX0FMVF0gPQorCQkgICAgeyAweDIwMDgwMDAwMDAwMDAwdWxsLCAweDg4MDAwMDAwMDAwMDAwdWxsLCBQTV9JU1UxLCAwIH0sCisJW1BNX0lGVV0gID0geyAweDAyMjAwMDAwMDAwMDAwdWxsLCAweDA4ODIwMDAwMDAwMDAwdWxsLCBQTV9JRlUsIDQxIH0sCisJW1BNX0lGVV9BTFRdID0KKwkJICAgIHsgMHgwMjIwMDAwMDAwMDAwMHVsbCwgMHgwODgyMDAwMDAwMDAwMHVsbCwgUE1fSUZVLCA0MSB9LAorCVtQTV9JRFUwXSA9IHsgMHgxMDEwMDAwMDAwMDAwMHVsbCwgMHg4MDg0MDAwMDAwMDAwMHVsbCwgUE1fSURVMCwgMSB9LAorCVtQTV9JU1UyXSA9IHsgMHgxMDE0MDAwMDAwMDAwMHVsbCwgMHg4MDg0MDAwMDAwMDAwMHVsbCwgUE1fSVNVMiwgMCB9LAorCVtQTV9MU1UwXSA9IHsgMHgwMTQwMDAwMDAwMDAwMHVsbCwgMHgwODgwMDAwMDAwMDAwMHVsbCwgUE1fTFNVMCwgMCB9LAorCVtQTV9MU1UxXSA9IHsgMHgwMDAwMDAwMDAwMDAwMHVsbCwgMHgwMDAxMDAwMDAwMDAwMHVsbCwgUE1fTFNVMSwgNDAgfSwKKwlbUE1fR1BTXSAgPSB7IDB4MDAwMDAwMDAwMDAwMDB1bGwsIDB4MDAwMDAwMDAwMDAwMDB1bGwsIFBNX0dQUywgMCB9Cit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBkaXJlY3RfbWFya2VkX2V2ZW50WzhdID0geworCSgxPDwyKSB8ICgxPDwzKSwJLyogUE1DMTogUE1fTVJLX0dSUF9ESVNQLCBQTV9NUktfU1RfQ01QTCAqLworCSgxPDwzKSB8ICgxPDw1KSwJLyogUE1DMjogUE1fVEhSRVNIX1RJTUVPLCBQTV9NUktfQlJVX0ZJTiAqLworCSgxPDwzKSwJCQkvKiBQTUMzOiBQTV9NUktfU1RfQ01QTF9JTlQgKi8KKwkoMTw8NCkgfCAoMTw8NSksCS8qIFBNQzQ6IFBNX01SS19HUlBfQ01QTCwgUE1fTVJLX0NSVV9GSU4gKi8KKwkoMTw8NCkgfCAoMTw8NSksCS8qIFBNQzU6IFBNX01SS19HUlBfVElNRU8gKi8KKwkoMTw8MykgfCAoMTw8NCkgfCAoMTw8NSksCisJCS8qIFBNQzY6IFBNX01SS19TVF9HUFMsIFBNX01SS19GWFVfRklOLCBQTV9NUktfR1JQX0lTU1VFRCAqLworCSgxPDw0KSB8ICgxPDw1KSwJLyogUE1DNzogUE1fTVJLX0ZQVV9GSU4sIFBNX01SS19JTlNUX0ZJTiAqLworCSgxPDw0KSwJCQkvKiBQTUM4OiBQTV9NUktfTFNVX0ZJTiAqLworfTsKKworLyoKKyAqIFJldHVybnMgMSBpZiBldmVudCBjb3VudHMgdGhpbmdzIHJlbGF0aW5nIHRvIG1hcmtlZCBpbnN0cnVjdGlvbnMKKyAqIGFuZCB0aHVzIG5lZWRzIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBzZXQsIG9yIDAgaWYgbm90LgorICovCitzdGF0aWMgaW50IHA0X21hcmtlZF9pbnN0cl9ldmVudCh1NjQgZXZlbnQpCit7CisJaW50IHBtYywgcHNlbCwgdW5pdCwgYnl0ZSwgYml0OworCXVuc2lnbmVkIGludCBtYXNrOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCXBzZWwgPSBldmVudCAmIFBNX1BNQ1NFTF9NU0s7CisJaWYgKHBtYykgeworCQlpZiAoZGlyZWN0X21hcmtlZF9ldmVudFtwbWMgLSAxXSAmICgxIDw8IHBzZWwpKQorCQkJcmV0dXJuIDE7CisJCWlmIChwc2VsID09IDApCQkvKiBhZGQgZXZlbnRzICovCisJCQliaXQgPSAocG1jIDw9IDQpPyBwbWMgLSAxOiA4IC0gcG1jOworCQllbHNlIGlmIChwc2VsID09IDYpCS8qIGRlY29kZSBldmVudHMgKi8KKwkJCWJpdCA9IDQ7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0gZWxzZQorCQliaXQgPSBwc2VsOworCisJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCXVuaXQgPSAoZXZlbnQgPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwltYXNrID0gMDsKKwlzd2l0Y2ggKHVuaXQpIHsKKwljYXNlIFBNX0xTVTE6CisJCWlmIChldmVudCAmIFBNX0xPV0VSX01TS1MpCisJCQltYXNrID0gMSA8PCAyODsJCS8qIGJ5dGUgNyBiaXQgNCAqLworCQllbHNlCisJCQltYXNrID0gNiA8PCAyNDsJCS8qIGJ5dGUgMyBiaXRzIDEgYW5kIDIgKi8KKwkJYnJlYWs7CisJY2FzZSBQTV9MU1UwOgorCQkvKiBieXRlIDMsIGJpdCAzOyBieXRlIDIgYml0cyAwLDIsMyw0LDU7IGJ5dGUgMSAqLworCQltYXNrID0gMHgwODNkZmYwMDsKKwl9CisJcmV0dXJuIChtYXNrID4+IChieXRlICogOCArIGJpdCkpICYgMTsKK30KKworc3RhdGljIGludCBwNF9nZXRfY29uc3RyYWludCh1NjQgZXZlbnQsIHU2NCAqbWFza3AsIHU2NCAqdmFscCkKK3sKKwlpbnQgcG1jLCBieXRlLCB1bml0LCBsb3dlciwgc2g7CisJdTY0IG1hc2sgPSAwLCB2YWx1ZSA9IDA7CisJaW50IGdycCA9IC0xOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCWlmIChwbWMpIHsKKwkJaWYgKHBtYyA+IDgpCisJCQlyZXR1cm4gLTE7CisJCXNoID0gKHBtYyAtIDEpICogMjsKKwkJbWFzayB8PSAyIDw8IHNoOworCQl2YWx1ZSB8PSAxIDw8IHNoOworCQlncnAgPSAoKHBtYyAtIDEpID4+IDEpICYgMTsKKwl9CisJdW5pdCA9IChldmVudCA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCWJ5dGUgPSAoZXZlbnQgPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwlpZiAodW5pdCkgeworCQlsb3dlciA9IChldmVudCA+PiBQTV9MT1dFUl9TSCkgJiBQTV9MT1dFUl9NU0s7CisKKwkJLyoKKwkJICogQnVzIGV2ZW50cyBvbiBieXRlcyAwIGFuZCAyIGNhbiBiZSBjb3VudGVkCisJCSAqIG9uIFBNQzEvMi81LzY7IGJ5dGVzIDEgYW5kIDMgb24gUE1DMy80LzcvOC4KKwkJICovCisJCWlmICghcG1jKQorCQkJZ3JwID0gYnl0ZSAmIDE7CisKKwkJaWYgKCFwNF91bml0aW5mb1t1bml0XS51bml0KQorCQkJcmV0dXJuIC0xOworCQltYXNrICB8PSBwNF91bml0aW5mb1t1bml0XS5tYXNrOworCQl2YWx1ZSB8PSBwNF91bml0aW5mb1t1bml0XS52YWx1ZTsKKwkJc2ggPSBwNF91bml0aW5mb1t1bml0XS5sb3dlcmJpdDsKKwkJaWYgKHNoID4gMSkKKwkJCXZhbHVlIHw9ICh1NjQpbG93ZXIgPDwgc2g7CisJCWVsc2UgaWYgKGxvd2VyICE9IHNoKQorCQkJcmV0dXJuIC0xOworCQl1bml0ID0gcDRfdW5pdGluZm9bdW5pdF0udW5pdDsKKworCQkvKiBTZXQgYnl0ZSBsYW5lIHNlbGVjdCBmaWVsZCAqLworCQltYXNrICB8PSAweGZVTEwgPDwgKDI4IC0gNCAqIGJ5dGUpOworCQl2YWx1ZSB8PSAodTY0KXVuaXQgPDwgKDI4IC0gNCAqIGJ5dGUpOworCX0KKwlpZiAoZ3JwID09IDApIHsKKwkJLyogaW5jcmVtZW50IFBNQzEvMi81LzYgZmllbGQgKi8KKwkJbWFzayAgfD0gMHg4MDAwMDAwMDAwdWxsOworCQl2YWx1ZSB8PSAweDEwMDAwMDAwMDB1bGw7CisJfSBlbHNlIHsKKwkJLyogaW5jcmVtZW50IFBNQzMvNC83LzggZmllbGQgKi8KKwkJbWFzayAgfD0gMHg4MDAwMDAwMDB1bGw7CisJCXZhbHVlIHw9IDB4MTAwMDAwMDAwdWxsOworCX0KKworCS8qIE1hcmtlZCBpbnN0cnVjdGlvbiBldmVudHMgbmVlZCBzYW1wbGVfZW5hYmxlIHNldCAqLworCWlmIChwNF9tYXJrZWRfaW5zdHJfZXZlbnQoZXZlbnQpKSB7CisJCW1hc2sgIHw9IDF1bGwgPDwgNTY7CisJCXZhbHVlIHw9IDF1bGwgPDwgNTY7CisJfQorCisJLyogUE1DU0VMPTYgZGVjb2RlIGV2ZW50cyBvbiBieXRlIDIgbmVlZCBzYW1wbGVfZW5hYmxlIGNsZWFyICovCisJaWYgKHBtYyAmJiAoZXZlbnQgJiBQTV9QTUNTRUxfTVNLKSA9PSA2ICYmIGJ5dGUgPT0gMikKKwkJbWFzayAgfD0gMXVsbCA8PCA1NjsKKworCSptYXNrcCA9IG1hc2s7CisJKnZhbHAgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwcGNfaW5zdF9jbXBsW10gPSB7CisJMHgxMDAxLCAweDQwMDEsIDB4NjAwMSwgMHg3MDAxLCAweDgwMDEKK307CisKK3N0YXRpYyBpbnQgcDRfZ2V0X2FsdGVybmF0aXZlcyh1NjQgZXZlbnQsIHVuc2lnbmVkIGludCBmbGFncywgdTY0IGFsdFtdKQoreworCWludCBpLCBqLCBuYTsKKworCWFsdFswXSA9IGV2ZW50OworCW5hID0gMTsKKworCS8qIDIgcG9zc2liaWxpdGllcyBmb3IgUE1fR1JQX0RJU1BfUkVKRUNUICovCisJaWYgKGV2ZW50ID09IDB4ODAwMyB8fCBldmVudCA9PSAweDAyMjQpIHsKKwkJYWx0WzFdID0gZXZlbnQgXiAoMHg4MDAzIF4gMHgwMjI0KTsKKwkJcmV0dXJuIDI7CisJfQorCisJLyogMiBwb3NzaWJpbGl0aWVzIGZvciBQTV9TVF9NSVNTX0wxICovCisJaWYgKGV2ZW50ID09IDB4MGMxMyB8fCBldmVudCA9PSAweDBjMjMpIHsKKwkJYWx0WzFdID0gZXZlbnQgXiAoMHgwYzEzIF4gMHgwYzIzKTsKKwkJcmV0dXJuIDI7CisJfQorCisJLyogc2V2ZXJhbCBwb3NzaWJpbGl0aWVzIGZvciBQTV9JTlNUX0NNUEwgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcGNfaW5zdF9jbXBsKTsgKytpKSB7CisJCWlmIChldmVudCA9PSBwcGNfaW5zdF9jbXBsW2ldKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShwcGNfaW5zdF9jbXBsKTsgKytqKQorCQkJCWlmIChqICE9IGkpCisJCQkJCWFsdFtuYSsrXSA9IHBwY19pbnN0X2NtcGxbal07CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBuYTsKK30KKworc3RhdGljIGludCBwNF9jb21wdXRlX21tY3IodTY0IGV2ZW50W10sIGludCBuX2V2LAorCQkJICAgdW5zaWduZWQgaW50IGh3Y1tdLCB1NjQgbW1jcltdKQoreworCXU2NCBtbWNyMCA9IDAsIG1tY3IxID0gMCwgbW1jcmEgPSAwOworCXVuc2lnbmVkIGludCBwbWMsIHVuaXQsIGJ5dGUsIHBzZWwsIGxvd2VyOworCXVuc2lnbmVkIGludCB0dG0sIGdycDsKKwl1bnNpZ25lZCBpbnQgcG1jX2ludXNlID0gMDsKKwl1bnNpZ25lZCBpbnQgcG1jX2dycF91c2VbMl07CisJdW5zaWduZWQgY2hhciBidXNieXRlWzRdOworCXVuc2lnbmVkIGNoYXIgdW5pdHVzZVsxNl07CisJdW5zaWduZWQgaW50IHVuaXRsb3dlciA9IDA7CisJaW50IGk7CisKKwlpZiAobl9ldiA+IDgpCisJCXJldHVybiAtMTsKKworCS8qIEZpcnN0IHBhc3MgdG8gY291bnQgcmVzb3VyY2UgdXNlICovCisJcG1jX2dycF91c2VbMF0gPSBwbWNfZ3JwX3VzZVsxXSA9IDA7CisJbWVtc2V0KGJ1c2J5dGUsIDAsIHNpemVvZihidXNieXRlKSk7CisJbWVtc2V0KHVuaXR1c2UsIDAsIHNpemVvZih1bml0dXNlKSk7CisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCWlmIChwbWMpIHsKKwkJCWlmIChwbWNfaW51c2UgJiAoMSA8PCAocG1jIC0gMSkpKQorCQkJCXJldHVybiAtMTsKKwkJCXBtY19pbnVzZSB8PSAxIDw8IChwbWMgLSAxKTsKKwkJCS8qIGNvdW50IDEvMi81LzYgdnMgMy80LzcvOCB1c2UgKi8KKwkJCSsrcG1jX2dycF91c2VbKChwbWMgLSAxKSA+PiAxKSAmIDFdOworCQl9CisJCXVuaXQgPSAoZXZlbnRbaV0gPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJYnl0ZSA9IChldmVudFtpXSA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQlsb3dlciA9IChldmVudFtpXSA+PiBQTV9MT1dFUl9TSCkgJiBQTV9MT1dFUl9NU0s7CisJCWlmICh1bml0KSB7CisJCQlpZiAoIXBtYykKKwkJCQkrK3BtY19ncnBfdXNlW2J5dGUgJiAxXTsKKwkJCWlmICh1bml0ID09IDYgfHwgdW5pdCA9PSA4KQorCQkJCS8qIG1hcCBhbHQgSVNVMS9JRlUgY29kZXM6IDYtPjIsIDgtPjMgKi8KKwkJCQl1bml0ID0gKHVuaXQgPj4gMSkgLSAxOworCQkJaWYgKGJ1c2J5dGVbYnl0ZV0gJiYgYnVzYnl0ZVtieXRlXSAhPSB1bml0KQorCQkJCXJldHVybiAtMTsKKwkJCWJ1c2J5dGVbYnl0ZV0gPSB1bml0OworCQkJbG93ZXIgPDw9IHVuaXQ7CisJCQlpZiAodW5pdHVzZVt1bml0XSAmJiBsb3dlciAhPSAodW5pdGxvd2VyICYgbG93ZXIpKQorCQkJCXJldHVybiAtMTsKKwkJCXVuaXR1c2VbdW5pdF0gPSAxOworCQkJdW5pdGxvd2VyIHw9IGxvd2VyOworCQl9CisJfQorCWlmIChwbWNfZ3JwX3VzZVswXSA+IDQgfHwgcG1jX2dycF91c2VbMV0gPiA0KQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIEFzc2lnbiByZXNvdXJjZXMgYW5kIHNldCBtdWx0aXBsZXhlciBzZWxlY3RzLgorCSAqCisJICogVW5pdHMgMSwyLDMgYXJlIG9uIFRUTTAsIDQsNiw3IG9uIFRUTTEsIDgsMTAgb24gVFRNMi4KKwkgKiBFYWNoIFRUTXggY2FuIG9ubHkgc2VsZWN0IG9uZSB1bml0LCBidXQgc2luY2UKKwkgKiB1bml0cyAyIGFuZCA2IGFyZSBib3RoIElTVTEsIGFuZCAzIGFuZCA4IGFyZSBib3RoIElGVSwKKwkgKiB3ZSBoYXZlIHNvbWUgY2hvaWNlcy4KKwkgKi8KKwlpZiAodW5pdHVzZVsyXSAmICh1bml0dXNlWzFdIHwgKHVuaXR1c2VbM10gJiB1bml0dXNlWzldKSkpIHsKKwkJdW5pdHVzZVs2XSA9IDE7CQkvKiBNb3ZlIDIgdG8gNiAqLworCQl1bml0dXNlWzJdID0gMDsKKwl9CisJaWYgKHVuaXR1c2VbM10gJiAodW5pdHVzZVsxXSB8IHVuaXR1c2VbMl0pKSB7CisJCXVuaXR1c2VbOF0gPSAxOwkJLyogTW92ZSAzIHRvIDggKi8KKwkJdW5pdHVzZVszXSA9IDA7CisJCXVuaXRsb3dlciA9ICh1bml0bG93ZXIgJiB+OCkgfCAoKHVuaXRsb3dlciAmIDgpIDw8IDUpOworCX0KKwkvKiBDaGVjayBvbmx5IG9uZSB1bml0IHBlciBUVE14ICovCisJaWYgKHVuaXR1c2VbMV0gKyB1bml0dXNlWzJdICsgdW5pdHVzZVszXSA+IDEgfHwKKwkgICAgdW5pdHVzZVs0XSArIHVuaXR1c2VbNl0gKyB1bml0dXNlWzddID4gMSB8fAorCSAgICB1bml0dXNlWzhdICsgdW5pdHVzZVs5XSA+IDEgfHwKKwkgICAgKHVuaXR1c2VbNV0gfCB1bml0dXNlWzEwXSB8IHVuaXR1c2VbMTFdIHwKKwkgICAgIHVuaXR1c2VbMTNdIHwgdW5pdHVzZVsxNF0pKQorCQlyZXR1cm4gLTE7CisKKwkvKiBTZXQgVFRNeFNFTCBmaWVsZHMuICBOb3RlLCB1bml0cyAxLTMgPT4gVFRNMFNFTCBjb2RlcyAwLTIgKi8KKwltbWNyMSB8PSAodTY0KSh1bml0dXNlWzNdICogMiArIHVuaXR1c2VbMl0pIDw8IE1NQ1IxX1RUTTBTRUxfU0g7CisJbW1jcjEgfD0gKHU2NCkodW5pdHVzZVs3XSAqIDMgKyB1bml0dXNlWzZdICogMikgPDwgTU1DUjFfVFRNMVNFTF9TSDsKKwltbWNyMSB8PSAodTY0KXVuaXR1c2VbOV0gPDwgTU1DUjFfVFRNMlNFTF9TSDsKKworCS8qIFNldCBUVEN4U0VMIGZpZWxkcy4gKi8KKwlpZiAodW5pdGxvd2VyICYgMHhlKQorCQltbWNyMSB8PSAxdWxsIDw8IE1NQ1IxX1RUQzBTRUxfU0g7CisJaWYgKHVuaXRsb3dlciAmIDB4ZjApCisJCW1tY3IxIHw9IDF1bGwgPDwgTU1DUjFfVFRDMVNFTF9TSDsKKwlpZiAodW5pdGxvd2VyICYgMHhmMDApCisJCW1tY3IxIHw9IDF1bGwgPDwgTU1DUjFfVFRDMlNFTF9TSDsKKwlpZiAodW5pdGxvd2VyICYgMHg3MDAwKQorCQltbWNyMSB8PSAxdWxsIDw8IE1NQ1IxX1RUQzNTRUxfU0g7CisKKwkvKiBTZXQgYnl0ZSBsYW5lIHNlbGVjdCBmaWVsZHMuICovCisJZm9yIChieXRlID0gMDsgYnl0ZSA8IDQ7ICsrYnl0ZSkgeworCQl1bml0ID0gYnVzYnl0ZVtieXRlXTsKKwkJaWYgKCF1bml0KQorCQkJY29udGludWU7CisJCWlmICh1bml0ID09IDB4ZikgeworCQkJLyogc3BlY2lhbCBjYXNlIGZvciBHUFMgKi8KKwkJCW1tY3IxIHw9IDF1bGwgPDwgKE1NQ1IxX0RFQlVHMFNFTF9TSCAtIGJ5dGUpOworCQl9IGVsc2UgeworCQkJaWYgKCF1bml0dXNlW3VuaXRdKQorCQkJCXR0bSA9IHVuaXQgLSAxOwkJLyogMi0+MSwgMy0+MiAqLworCQkJZWxzZQorCQkJCXR0bSA9IHVuaXQgPj4gMjsKKwkJCW1tY3IxIHw9ICh1NjQpdHRtIDw8IChNTUNSMV9URF9DUF9EQkcwU0VMX1NIIC0gMipieXRlKTsKKwkJfQorCX0KKworCS8qIFNlY29uZCBwYXNzOiBhc3NpZ24gUE1Dcywgc2V0IFBNQ3hTRUwgYW5kIFBNQ3hfQURERVJfU0VMIGZpZWxkcyAqLworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJcG1jID0gKGV2ZW50W2ldID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQl1bml0ID0gKGV2ZW50W2ldID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJCWJ5dGUgPSAoZXZlbnRbaV0gPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJcHNlbCA9IGV2ZW50W2ldICYgUE1fUE1DU0VMX01TSzsKKwkJaWYgKCFwbWMpIHsKKwkJCS8qIEJ1cyBldmVudCBvciAwMHh4eCBkaXJlY3QgZXZlbnQgKG9mZiBvciBjeWNsZXMpICovCisJCQlpZiAodW5pdCkKKwkJCQlwc2VsIHw9IDB4MTAgfCAoKGJ5dGUgJiAyKSA8PCAyKTsKKwkJCWZvciAocG1jID0gMDsgcG1jIDwgODsgKytwbWMpIHsKKwkJCQlpZiAocG1jX2ludXNlICYgKDEgPDwgcG1jKSkKKwkJCQkJY29udGludWU7CisJCQkJZ3JwID0gKHBtYyA+PiAxKSAmIDE7CisJCQkJaWYgKHVuaXQpIHsKKwkJCQkJaWYgKGdycCA9PSAoYnl0ZSAmIDEpKQorCQkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmIChwbWNfZ3JwX3VzZVtncnBdIDwgNCkgeworCQkJCQkrK3BtY19ncnBfdXNlW2dycF07CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXBtY19pbnVzZSB8PSAxIDw8IHBtYzsKKwkJfSBlbHNlIHsKKwkJCS8qIERpcmVjdCBldmVudCAqLworCQkJLS1wbWM7CisJCQlpZiAocHNlbCA9PSAwICYmIChieXRlICYgMikpCisJCQkJLyogYWRkIGV2ZW50cyBvbiBoaWdoZXItbnVtYmVyZWQgYnVzICovCisJCQkJbW1jcjEgfD0gMXVsbCA8PCBtbWNyMV9hZGRlcl9iaXRzW3BtY107CisJCQllbHNlIGlmIChwc2VsID09IDYgJiYgYnl0ZSA9PSAzKQorCQkJCS8qIHNlZW0gdG8gbmVlZCB0byBzZXQgc2FtcGxlX2VuYWJsZSBoZXJlICovCisJCQkJbW1jcmEgfD0gTU1DUkFfU0FNUExFX0VOQUJMRTsKKwkJCXBzZWwgfD0gODsKKwkJfQorCQlpZiAocG1jIDw9IDEpCisJCQltbWNyMCB8PSBwc2VsIDw8IChNTUNSMF9QTUMxU0VMX1NIIC0gNyAqIHBtYyk7CisJCWVsc2UKKwkJCW1tY3IxIHw9IHBzZWwgPDwgKE1NQ1IxX1BNQzNTRUxfU0ggLSA1ICogKHBtYyAtIDIpKTsKKwkJaWYgKHBtYyA9PSA3KQkvKiBQTUM4ICovCisJCQltbWNyYSB8PSAocHNlbCAmIDEpIDw8IE1NQ1JBX1BNQzhTRUwwX1NIOworCQlod2NbaV0gPSBwbWM7CisJCWlmIChwNF9tYXJrZWRfaW5zdHJfZXZlbnQoZXZlbnRbaV0pKQorCQkJbW1jcmEgfD0gTU1DUkFfU0FNUExFX0VOQUJMRTsKKwl9CisKKwlpZiAocG1jX2ludXNlICYgMSkKKwkJbW1jcjAgfD0gTU1DUjBfUE1DMUNFOworCWlmIChwbWNfaW51c2UgJiAweGZlKQorCQltbWNyMCB8PSBNTUNSMF9QTUNqQ0U7CisKKwltbWNyYSB8PSAweDIwMDA7CS8qIG1hcmsgb25seSBvbmUgSU9QIHBlciBQUEMgaW5zdHJ1Y3Rpb24gKi8KKworCS8qIFJldHVybiBNTUNSeCB2YWx1ZXMgKi8KKwltbWNyWzBdID0gbW1jcjA7CisJbW1jclsxXSA9IG1tY3IxOworCW1tY3JbMl0gPSBtbWNyYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcDRfZGlzYWJsZV9wbWModW5zaWduZWQgaW50IHBtYywgdTY0IG1tY3JbXSkKK3sKKwkvKgorCSAqIFNldHRpbmcgdGhlIFBNQ3hTRUwgZmllbGQgdG8gMCBkaXNhYmxlcyBQTUMgeC4KKwkgKiAoTm90ZSB0aGF0IHBtYyBpcyAwLWJhc2VkIGhlcmUsIG5vdCAxLWJhc2VkLikKKwkgKi8KKwlpZiAocG1jIDw9IDEpIHsKKwkJbW1jclswXSAmPSB+KDB4MWZVTCA8PCAoTU1DUjBfUE1DMVNFTF9TSCAtIDcgKiBwbWMpKTsKKwl9IGVsc2UgeworCQltbWNyWzFdICY9IH4oMHgxZlVMIDw8IChNTUNSMV9QTUMzU0VMX1NIIC0gNSAqIChwbWMgLSAyKSkpOworCQlpZiAocG1jID09IDcpCisJCQltbWNyWzJdICY9IH4oMVVMIDw8IE1NQ1JBX1BNQzhTRUwwX1NIKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcDRfZ2VuZXJpY19ldmVudHNbXSA9IHsKKwlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXQkJPSA3LAorCVtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMHgxMDAxLAorCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdCT0gMHg4YzEwLCAvKiBQTV9MRF9SRUZfTDEgKi8KKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQk9IDB4M2MxMCwgLyogUE1fTERfTUlTU19MMSAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCT0gMHgzMzAsICAvKiBQTV9CUl9JU1NVRUQgKi8KKwlbUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTXQkJPSAweDMzMSwgIC8qIFBNX0JSX01QUkVEX0NSICovCit9OworCisjZGVmaW5lIEMoeCkJUEVSRl9DT1VOVF9IV19DQUNIRV8jI3gKKworLyoKKyAqIFRhYmxlIG9mIGdlbmVyYWxpemVkIGNhY2hlLXJlbGF0ZWQgZXZlbnRzLgorICogMCBtZWFucyBub3Qgc3VwcG9ydGVkLCAtMSBtZWFucyBub25zZW5zaWNhbCwgb3RoZXIgdmFsdWVzCisgKiBhcmUgZXZlbnQgY29kZXMuCisgKi8KK3N0YXRpYyBpbnQgcG93ZXI0X2NhY2hlX2V2ZW50c1tDKE1BWCldW0MoT1BfTUFYKV1bQyhSRVNVTFRfTUFYKV0gPSB7CisJW0MoTDFEKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4OGMxMCwJCTB4M2MxMAl9LAorCQlbQyhPUF9XUklURSldID0gewkweDdjMTAsCQkweGMxMwl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweGMzNSwJCTAJfSwKKwl9LAorCVtDKEwxSSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMAl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTAsCQkwCX0sCisJfSwKKwlbQyhMTCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMAl9LAorCQlbQyhPUF9XUklURSldID0gewkwLAkJMAl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweGMzNCwJCTAJfSwKKwl9LAorCVtDKERUTEIpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4OTA0CX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAorCX0sCisJW0MoSVRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHg5MDAJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCisJfSwKKwlbQyhCUFUpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHgzMzAsCQkweDMzMQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKKwl9LAorfTsKKworc3RydWN0IHBvd2VyX3BtdSBwb3dlcjRfcG11ID0geworCS5uX2NvdW50ZXIgPSA4LAorCS5tYXhfYWx0ZXJuYXRpdmVzID0gNSwKKwkuYWRkX2ZpZWxkcyA9IDB4MDAwMDAwMTEwMDAwNTU1NXVsbCwKKwkudGVzdF9hZGRlciA9IDB4MDAxMTA4MzMwMDAwMDAwMHVsbCwKKwkuY29tcHV0ZV9tbWNyID0gcDRfY29tcHV0ZV9tbWNyLAorCS5nZXRfY29uc3RyYWludCA9IHA0X2dldF9jb25zdHJhaW50LAorCS5nZXRfYWx0ZXJuYXRpdmVzID0gcDRfZ2V0X2FsdGVybmF0aXZlcywKKwkuZGlzYWJsZV9wbWMgPSBwNF9kaXNhYmxlX3BtYywKKwkubl9nZW5lcmljID0gQVJSQVlfU0laRShwNF9nZW5lcmljX2V2ZW50cyksCisJLmdlbmVyaWNfZXZlbnRzID0gcDRfZ2VuZXJpY19ldmVudHMsCisJLmNhY2hlX2V2ZW50cyA9ICZwb3dlcjRfY2FjaGVfZXZlbnRzLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI1Ky1wbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI1Ky1wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU1ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjUrLXBtdS5jCkBAIC0wLDAgKzEsNjcxIEBACisvKgorICogUGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IGZvciBQT1dFUjUrLysrIChub3QgUE9XRVI1KSBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAyMDA5IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKworLyoKKyAqIEJpdHMgaW4gZXZlbnQgY29kZSBmb3IgUE9XRVI1KyAoUE9XRVI1IEdTKSBhbmQgUE9XRVI1KysgKFBPV0VSNSBHUyBERDMpCisgKi8KKyNkZWZpbmUgUE1fUE1DX1NICTIwCS8qIFBNQyBudW1iZXIgKDEtYmFzZWQpIGZvciBkaXJlY3QgZXZlbnRzICovCisjZGVmaW5lIFBNX1BNQ19NU0sJMHhmCisjZGVmaW5lIFBNX1BNQ19NU0tTCShQTV9QTUNfTVNLIDw8IFBNX1BNQ19TSCkKKyNkZWZpbmUgUE1fVU5JVF9TSAkxNgkvKiBUVE1NVVggbnVtYmVyIGFuZCBzZXR0aW5nIC0gdW5pdCBzZWxlY3QgKi8KKyNkZWZpbmUgUE1fVU5JVF9NU0sJMHhmCisjZGVmaW5lIFBNX0JZVEVfU0gJMTIJLyogQnl0ZSBudW1iZXIgb2YgZXZlbnQgYnVzIHRvIHVzZSAqLworI2RlZmluZSBQTV9CWVRFX01TSwk3CisjZGVmaW5lIFBNX0dSU19TSAk4CS8qIFN0b3JhZ2Ugc3Vic3lzdGVtIG11eCBzZWxlY3QgKi8KKyNkZWZpbmUgUE1fR1JTX01TSwk3CisjZGVmaW5lIFBNX0JVU0VWRU5UX01TSwkweDgwCS8qIFNldCBpZiBldmVudCB1c2VzIGV2ZW50IGJ1cyAqLworI2RlZmluZSBQTV9QTUNTRUxfTVNLCTB4N2YKKworLyogVmFsdWVzIGluIFBNX1VOSVQgZmllbGQgKi8KKyNkZWZpbmUgUE1fRlBVCQkwCisjZGVmaW5lIFBNX0lTVTAJCTEKKyNkZWZpbmUgUE1fSUZVCQkyCisjZGVmaW5lIFBNX0lTVTEJCTMKKyNkZWZpbmUgUE1fSURVCQk0CisjZGVmaW5lIFBNX0lTVTBfQUxUCTYKKyNkZWZpbmUgUE1fR1JTCQk3CisjZGVmaW5lIFBNX0xTVTAJCTgKKyNkZWZpbmUgUE1fTFNVMQkJMHhjCisjZGVmaW5lIFBNX0xBU1RVTklUCTB4YworCisvKgorICogQml0cyBpbiBNTUNSMSBmb3IgUE9XRVI1KworICovCisjZGVmaW5lIE1NQ1IxX1RUTTBTRUxfU0gJNjIKKyNkZWZpbmUgTU1DUjFfVFRNMVNFTF9TSAk2MAorI2RlZmluZSBNTUNSMV9UVE0yU0VMX1NICTU4CisjZGVmaW5lIE1NQ1IxX1RUTTNTRUxfU0gJNTYKKyNkZWZpbmUgTU1DUjFfVFRNU0VMX01TSwkzCisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzBTRUxfU0gJNTQKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHMVNFTF9TSAk1MgorI2RlZmluZSBNTUNSMV9URF9DUF9EQkcyU0VMX1NICTUwCisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzNTRUxfU0gJNDgKKyNkZWZpbmUgTU1DUjFfR1JTX0wyU0VMX1NICTQ2CisjZGVmaW5lIE1NQ1IxX0dSU19MMlNFTF9NU0sJMworI2RlZmluZSBNTUNSMV9HUlNfTDNTRUxfU0gJNDQKKyNkZWZpbmUgTU1DUjFfR1JTX0wzU0VMX01TSwkzCisjZGVmaW5lIE1NQ1IxX0dSU19NQ1NFTF9TSAk0MQorI2RlZmluZSBNTUNSMV9HUlNfTUNTRUxfTVNLCTcKKyNkZWZpbmUgTU1DUjFfR1JTX0ZBQlNFTF9TSAkzOQorI2RlZmluZSBNTUNSMV9HUlNfRkFCU0VMX01TSwkzCisjZGVmaW5lIE1NQ1IxX1BNQzFfQURERVJfU0VMX1NICTM1CisjZGVmaW5lIE1NQ1IxX1BNQzJfQURERVJfU0VMX1NICTM0CisjZGVmaW5lIE1NQ1IxX1BNQzNfQURERVJfU0VMX1NICTMzCisjZGVmaW5lIE1NQ1IxX1BNQzRfQURERVJfU0VMX1NICTMyCisjZGVmaW5lIE1NQ1IxX1BNQzFTRUxfU0gJMjUKKyNkZWZpbmUgTU1DUjFfUE1DMlNFTF9TSAkxNworI2RlZmluZSBNTUNSMV9QTUMzU0VMX1NICTkKKyNkZWZpbmUgTU1DUjFfUE1DNFNFTF9TSAkxCisjZGVmaW5lIE1NQ1IxX1BNQ1NFTF9TSChuKQkoTU1DUjFfUE1DMVNFTF9TSCAtIChuKSAqIDgpCisjZGVmaW5lIE1NQ1IxX1BNQ1NFTF9NU0sJMHg3ZgorCisvKgorICogQml0cyBpbiBNTUNSQQorICovCisKKy8qCisgKiBMYXlvdXQgb2YgY29uc3RyYWludCBiaXRzOgorICogNjY2NjU1NTU1NTU1NTU0NDQ0NDQ0NDQ0MzMzMzMzMzMzMzIyMjIyMjIyMjIxMTExMTExMTExMDAwMDAwMDAwMAorICogMzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMAorICogICAgICAgICAgICAgWyAgPjw+PD48ID48PiA8Pjw+WyAgPiAgPCAgPjwgID48ICA+PCAgPjw+PD48Pjw+PD48PgorICogICAgICAgICAgICAgTkMgIEcwRzFHMiBHMyBUMFQxIFVDICAgIEIwICBCMSAgQjIgIEIzIFA2UDVQNFAzUDJQMQorICoKKyAqIE5DIC0gbnVtYmVyIG9mIGNvdW50ZXJzCisgKiAgICAgNTE6IE5DIGVycm9yIDB4MDAwOF8wMDAwXzAwMDBfMDAwMAorICogICAgIDQ4LTUwOiBudW1iZXIgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMS00IDB4MDAwN18wMDAwXzAwMDBfMDAwMAorICoKKyAqIEcwLi5HMyAtIEdSUyBtdXggY29uc3RyYWludHMKKyAqICAgICA0Ni00NzogR1JTX0wyU0VMIHZhbHVlCisgKiAgICAgNDQtNDU6IEdSU19MM1NFTCB2YWx1ZQorICogICAgIDQxLTQ0OiBHUlNfTUNTRUwgdmFsdWUKKyAqICAgICAzOS00MDogR1JTX0ZBQlNFTCB2YWx1ZQorICoJTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHVwIHdpdGggdGhlaXIgYml0IHBvc2l0aW9ucyBpbiBNTUNSMQorICoKKyAqIFQwIC0gVFRNMCBjb25zdHJhaW50CisgKiAgICAgMzYtMzc6IFRUTTBTRUwgdmFsdWUgKDA9RlBVLCAyPUlGVSwgMz1JU1UxKSAweDMwXzAwMDBfMDAwMAorICoKKyAqIFQxIC0gVFRNMSBjb25zdHJhaW50CisgKiAgICAgMzQtMzU6IFRUTTFTRUwgdmFsdWUgKDA9SURVLCAzPUdSUykgMHgwY18wMDAwXzAwMDAKKyAqCisgKiBVQyAtIHVuaXQgY29uc3RyYWludDogY2FuJ3QgaGF2ZSBhbGwgdGhyZWUgb2YgRlBVfElGVXxJU1UxLCBJU1UwLCBJRFV8R1JTCisgKiAgICAgMzM6IFVDMyBlcnJvciAweDAyXzAwMDBfMDAwMAorICogICAgIDMyOiBGUFV8SUZVfElTVTEgZXZlbnRzIG5lZWRlZCAweDAxXzAwMDBfMDAwMAorICogICAgIDMxOiBJU1UwIGV2ZW50cyBuZWVkZWQgMHgwMV84MDAwXzAwMDAKKyAqICAgICAzMDogSURVfEdSUyBldmVudHMgbmVlZGVkIDB4MDBfNDAwMF8wMDAwCisgKgorICogQjAKKyAqICAgICAyNC0yNzogQnl0ZSAwIGV2ZW50IHNvdXJjZSAweDBmMDBfMDAwMAorICoJICAgICAgRW5jb2RpbmcgYXMgZm9yIHRoZSBldmVudCBjb2RlCisgKgorICogQjEsIEIyLCBCMworICogICAgIDIwLTIzLCAxNi0xOSwgMTItMTU6IEJ5dGUgMSwgMiwgMyBldmVudCBzb3VyY2VzCisgKgorICogUDYKKyAqICAgICAxMTogUDYgZXJyb3IgMHg4MDAKKyAqICAgICAxMC0xMTogQ291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DNgorICoKKyAqIFAxLi5QNQorICogICAgIDAtOTogQ291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMS4uUE1DNQorICovCisKK3N0YXRpYyBjb25zdCBpbnQgZ3JzZWxfc2hpZnRbOF0gPSB7CisJTU1DUjFfR1JTX0wyU0VMX1NILCBNTUNSMV9HUlNfTDJTRUxfU0gsIE1NQ1IxX0dSU19MMlNFTF9TSCwKKwlNTUNSMV9HUlNfTDNTRUxfU0gsIE1NQ1IxX0dSU19MM1NFTF9TSCwgTU1DUjFfR1JTX0wzU0VMX1NILAorCU1NQ1IxX0dSU19NQ1NFTF9TSCwgTU1DUjFfR1JTX0ZBQlNFTF9TSAorfTsKKworLyogTWFza3MgYW5kIHZhbHVlcyBmb3IgdXNpbmcgZXZlbnRzIGZyb20gdGhlIHZhcmlvdXMgdW5pdHMgKi8KK3N0YXRpYyB1NjQgdW5pdF9jb25zW1BNX0xBU1RVTklUKzFdWzJdID0geworCVtQTV9GUFVdID0gICB7IDB4MzIwMDAwMDAwMHVsbCwgMHgwMTAwMDAwMDAwdWxsIH0sCisJW1BNX0lTVTBdID0gIHsgMHgwMjAwMDAwMDAwdWxsLCAweDAwODAwMDAwMDB1bGwgfSwKKwlbUE1fSVNVMV0gPSAgeyAweDMyMDAwMDAwMDB1bGwsIDB4MzEwMDAwMDAwMHVsbCB9LAorCVtQTV9JRlVdID0gICB7IDB4MzIwMDAwMDAwMHVsbCwgMHgyMTAwMDAwMDAwdWxsIH0sCisJW1BNX0lEVV0gPSAgIHsgMHgwZTAwMDAwMDAwdWxsLCAweDAwNDAwMDAwMDB1bGwgfSwKKwlbUE1fR1JTXSA9ICAgeyAweDBlMDAwMDAwMDB1bGwsIDB4MGM0MDAwMDAwMHVsbCB9LAorfTsKKworc3RhdGljIGludCBwb3dlcjVwX2dldF9jb25zdHJhaW50KHU2NCBldmVudCwgdTY0ICptYXNrcCwgdTY0ICp2YWxwKQoreworCWludCBwbWMsIGJ5dGUsIHVuaXQsIHNoOworCWludCBiaXQsIGZtYXNrOworCXU2NCBtYXNrID0gMCwgdmFsdWUgPSAwOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCWlmIChwbWMpIHsKKwkJaWYgKHBtYyA+IDYpCisJCQlyZXR1cm4gLTE7CisJCXNoID0gKHBtYyAtIDEpICogMjsKKwkJbWFzayB8PSAyIDw8IHNoOworCQl2YWx1ZSB8PSAxIDw8IHNoOworCQlpZiAocG1jID49IDUgJiYgIShldmVudCA9PSAweDUwMDAwOSB8fCBldmVudCA9PSAweDYwMDAwNSkpCisJCQlyZXR1cm4gLTE7CisJfQorCWlmIChldmVudCAmIFBNX0JVU0VWRU5UX01TSykgeworCQl1bml0ID0gKGV2ZW50ID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJCWlmICh1bml0ID4gUE1fTEFTVFVOSVQpCisJCQlyZXR1cm4gLTE7CisJCWlmICh1bml0ID09IFBNX0lTVTBfQUxUKQorCQkJdW5pdCA9IFBNX0lTVTA7CisJCW1hc2sgfD0gdW5pdF9jb25zW3VuaXRdWzBdOworCQl2YWx1ZSB8PSB1bml0X2NvbnNbdW5pdF1bMV07CisJCWJ5dGUgPSAoZXZlbnQgPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJaWYgKGJ5dGUgPj0gNCkgeworCQkJaWYgKHVuaXQgIT0gUE1fTFNVMSkKKwkJCQlyZXR1cm4gLTE7CisJCQkvKiBNYXAgTFNVMSBsb3cgd29yZCAoYnl0ZXMgNC03KSB0byB1bml0IExTVTErMSAqLworCQkJKyt1bml0OworCQkJYnl0ZSAmPSAzOworCQl9CisJCWlmICh1bml0ID09IFBNX0dSUykgeworCQkJYml0ID0gZXZlbnQgJiA3OworCQkJZm1hc2sgPSAoYml0ID09IDYpPyA3OiAzOworCQkJc2ggPSBncnNlbF9zaGlmdFtiaXRdOworCQkJbWFzayB8PSAodTY0KWZtYXNrIDw8IHNoOworCQkJdmFsdWUgfD0gKHU2NCkoKGV2ZW50ID4+IFBNX0dSU19TSCkgJiBmbWFzaykgPDwgc2g7CisJCX0KKwkJLyogU2V0IGJ5dGUgbGFuZSBzZWxlY3QgZmllbGQgKi8KKwkJbWFzayAgfD0gMHhmVUxMIDw8ICgyNCAtIDQgKiBieXRlKTsKKwkJdmFsdWUgfD0gKHU2NCl1bml0IDw8ICgyNCAtIDQgKiBieXRlKTsKKwl9CisJaWYgKHBtYyA8IDUpIHsKKwkJLyogbmVlZCBhIGNvdW50ZXIgZnJvbSBQTUMxLTQgc2V0ICovCisJCW1hc2sgIHw9IDB4ODAwMDAwMDAwMDAwMHVsbDsKKwkJdmFsdWUgfD0gMHgxMDAwMDAwMDAwMDAwdWxsOworCX0KKwkqbWFza3AgPSBtYXNrOworCSp2YWxwID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI1cF9saW1pdGVkX3BtY19ldmVudCh1NjQgZXZlbnQpCit7CisJaW50IHBtYyA9IChldmVudCA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKworCXJldHVybiBwbWMgPT0gNSB8fCBwbWMgPT0gNjsKK30KKworI2RlZmluZSBNQVhfQUxUCTMJLyogYXQgbW9zdCAzIGFsdGVybmF0aXZlcyBmb3IgYW55IGV2ZW50ICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXZlbnRfYWx0ZXJuYXRpdmVzW11bTUFYX0FMVF0gPSB7CisJeyAweDEwMGMwLCAgMHg0MDAwMWYgfSwJCQkvKiBQTV9HQ1RfRlVMTF9DWUMgKi8KKwl7IDB4MTIwZTQsICAweDQwMDAwMiB9LAkJCS8qIFBNX0dSUF9ESVNQX1JFSkVDVCAqLworCXsgMHgyMzBlMiwgIDB4MzIzMDg3IH0sCQkJLyogUE1fQlJfUFJFRF9DUiAqLworCXsgMHgyMzBlMywgIDB4MjIzMDg3LCAweDMyMzBhMCB9LAkvKiBQTV9CUl9QUkVEX1RBICovCisJeyAweDQxMGM3LCAgMHg0NDEwODQgfSwJCQkvKiBQTV9USFJEX0wyTUlTU19CT1RIX0NZQyAqLworCXsgMHg4MDBjNCwgIDB4YzIwZTAgfSwJCQkvKiBQTV9EVExCX01JU1MgKi8KKwl7IDB4YzUwYzYsICAweGM2MGUwIH0sCQkJLyogUE1fTVJLX0RUTEJfTUlTUyAqLworCXsgMHgxMDAwMDUsIDB4NjAwMDA1IH0sCQkJLyogUE1fUlVOX0NZQyAqLworCXsgMHgxMDAwMDksIDB4MjAwMDA5IH0sCQkJLyogUE1fSU5TVF9DTVBMICovCisJeyAweDIwMDAxNSwgMHgzMDAwMTUgfSwJCQkvKiBQTV9MU1VfTE1RX1NSUV9FTVBUWV9DWUMgKi8KKwl7IDB4MzAwMDA5LCAweDQwMDAwOSB9LAkJCS8qIFBNX0lOU1RfRElTUCAqLworfTsKKworLyoKKyAqIFNjYW4gdGhlIGFsdGVybmF0aXZlcyB0YWJsZSBmb3IgYSBtYXRjaCBhbmQgcmV0dXJuIHRoZQorICogaW5kZXggaW50byB0aGUgYWx0ZXJuYXRpdmVzIHRhYmxlIGlmIGZvdW5kLCBlbHNlIC0xLgorICovCitzdGF0aWMgaW50IGZpbmRfYWx0ZXJuYXRpdmUodW5zaWduZWQgaW50IGV2ZW50KQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZlbnRfYWx0ZXJuYXRpdmVzKTsgKytpKSB7CisJCWlmIChldmVudCA8IGV2ZW50X2FsdGVybmF0aXZlc1tpXVswXSkKKwkJCWJyZWFrOworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0FMVCAmJiBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal07ICsraikKKwkJCWlmIChldmVudCA9PSBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal0pCisJCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnl0ZWRlY29kZV9hbHRlcm5hdGl2ZXNbNF1bNF0gPSB7CisJLyogUE1DIDEgKi8JeyAweDIxLCAweDIzLCAweDI1LCAweDI3IH0sCisJLyogUE1DIDIgKi8JeyAweDA3LCAweDE3LCAweDBlLCAweDFlIH0sCisJLyogUE1DIDMgKi8JeyAweDIwLCAweDIyLCAweDI0LCAweDI2IH0sCisJLyogUE1DIDQgKi8JeyAweDA3LCAweDE3LCAweDBlLCAweDFlIH0KK307CisKKy8qCisgKiBTb21lIGRpcmVjdCBldmVudHMgZm9yIGRlY29kZXMgb2YgZXZlbnQgYnVzIGJ5dGUgMyBoYXZlIGFsdGVybmF0aXZlCisgKiBQTUNTRUwgdmFsdWVzIG9uIG90aGVyIGNvdW50ZXJzLiAgVGhpcyByZXR1cm5zIHRoZSBhbHRlcm5hdGl2ZQorICogZXZlbnQgY29kZSBmb3IgdGhvc2UgdGhhdCBkbywgb3IgLTEgb3RoZXJ3aXNlLiAgVGhpcyBhbHNvIGhhbmRsZXMKKyAqIGFsdGVybmF0aXZlIFBDTVNFTCB2YWx1ZXMgZm9yIGFkZCBldmVudHMuCisgKi8KK3N0YXRpYyBzNjQgZmluZF9hbHRlcm5hdGl2ZV9iZGVjb2RlKHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBhbHRwbWMsIHBwLCBqOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCWlmIChwbWMgPT0gMCB8fCBwbWMgPiA0KQorCQlyZXR1cm4gLTE7CisJYWx0cG1jID0gNSAtIHBtYzsJLyogMSA8LT4gNCwgMiA8LT4gMyAqLworCXBwID0gZXZlbnQgJiBQTV9QTUNTRUxfTVNLOworCWZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKwkJaWYgKGJ5dGVkZWNvZGVfYWx0ZXJuYXRpdmVzW3BtYyAtIDFdW2pdID09IHBwKSB7CisJCQlyZXR1cm4gKGV2ZW50ICYgfihQTV9QTUNfTVNLUyB8IFBNX1BNQ1NFTF9NU0spKSB8CisJCQkJKGFsdHBtYyA8PCBQTV9QTUNfU0gpIHwKKwkJCQlieXRlZGVjb2RlX2FsdGVybmF0aXZlc1thbHRwbWMgLSAxXVtqXTsKKwkJfQorCX0KKworCS8qIG5ldyBkZWNvZGUgYWx0ZXJuYXRpdmVzIGZvciBwb3dlcjUrICovCisJaWYgKHBtYyA9PSAxICYmIChwcCA9PSAweDBkIHx8IHBwID09IDB4MGUpKQorCQlyZXR1cm4gZXZlbnQgKyAoMiA8PCBQTV9QTUNfU0gpICsgKDB4MmUgLSAweDBkKTsKKwlpZiAocG1jID09IDMgJiYgKHBwID09IDB4MmUgfHwgcHAgPT0gMHgyZikpCisJCXJldHVybiBldmVudCAtICgyIDw8IFBNX1BNQ19TSCkgLSAoMHgyZSAtIDB4MGQpOworCisJLyogYWx0ZXJuYXRpdmUgYWRkIGV2ZW50IGVuY29kaW5ncyAqLworCWlmIChwcCA9PSAweDEwIHx8IHBwID09IDB4MjgpCisJCXJldHVybiAoKGV2ZW50IF4gKDB4MTAgXiAweDI4KSkgJiB+UE1fUE1DX01TS1MpIHwKKwkJCShhbHRwbWMgPDwgUE1fUE1DX1NIKTsKKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBwb3dlcjVwX2dldF9hbHRlcm5hdGl2ZXModTY0IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHU2NCBhbHRbXSkKK3sKKwlpbnQgaSwgaiwgbmFsdCA9IDE7CisJaW50IG5saW07CisJczY0IGFlOworCisJYWx0WzBdID0gZXZlbnQ7CisJbmFsdCA9IDE7CisJbmxpbSA9IHBvd2VyNXBfbGltaXRlZF9wbWNfZXZlbnQoZXZlbnQpOworCWkgPSBmaW5kX2FsdGVybmF0aXZlKGV2ZW50KTsKKwlpZiAoaSA+PSAwKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxUOyArK2opIHsKKwkJCWFlID0gZXZlbnRfYWx0ZXJuYXRpdmVzW2ldW2pdOworCQkJaWYgKGFlICYmIGFlICE9IGV2ZW50KQorCQkJCWFsdFtuYWx0KytdID0gYWU7CisJCQlubGltICs9IHBvd2VyNXBfbGltaXRlZF9wbWNfZXZlbnQoYWUpOworCQl9CisJfSBlbHNlIHsKKwkJYWUgPSBmaW5kX2FsdGVybmF0aXZlX2JkZWNvZGUoZXZlbnQpOworCQlpZiAoYWUgPiAwKQorCQkJYWx0W25hbHQrK10gPSBhZTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBQUE1VX09OTFlfQ09VTlRfUlVOKSB7CisJCS8qCisJCSAqIFdlJ3JlIG9ubHkgY291bnRpbmcgaW4gUlVOIHN0YXRlLAorCQkgKiBzbyBQTV9DWUMgaXMgZXF1aXZhbGVudCB0byBQTV9SVU5fQ1lDCisJCSAqIGFuZCBQTV9JTlNUX0NNUEwgPT09IFBNX1JVTl9JTlNUX0NNUEwuCisJCSAqIFRoaXMgZG9lc24ndCBpbmNsdWRlIGFsdGVybmF0aXZlcyB0aGF0IGRvbid0IHByb3ZpZGUKKwkJICogYW55IGV4dHJhIGZsZXhpYmlsaXR5IGluIGFzc2lnbmluZyBQTUNzIChlLmcuCisJCSAqIDB4MTAwMDA1IGZvciBQTV9SVU5fQ1lDIHZzLiAweGYgZm9yIFBNX0NZQykuCisJCSAqIE5vdGUgdGhhdCBldmVuIHdpdGggdGhlc2UgYWRkaXRpb25hbCBhbHRlcm5hdGl2ZXMKKwkJICogd2UgbmV2ZXIgZW5kIHVwIHdpdGggbW9yZSB0aGFuIDMgYWx0ZXJuYXRpdmVzIGZvciBhbnkgZXZlbnQuCisJCSAqLworCQlqID0gbmFsdDsKKwkJZm9yIChpID0gMDsgaSA8IG5hbHQ7ICsraSkgeworCQkJc3dpdGNoIChhbHRbaV0pIHsKKwkJCWNhc2UgMHhmOgkvKiBQTV9DWUMgKi8KKwkJCQlhbHRbaisrXSA9IDB4NjAwMDA1OwkvKiBQTV9SVU5fQ1lDICovCisJCQkJKytubGltOworCQkJCWJyZWFrOworCQkJY2FzZSAweDYwMDAwNToJLyogUE1fUlVOX0NZQyAqLworCQkJCWFsdFtqKytdID0gMHhmOworCQkJCWJyZWFrOworCQkJY2FzZSAweDEwMDAwOToJLyogUE1fSU5TVF9DTVBMICovCisJCQkJYWx0W2orK10gPSAweDUwMDAwOTsJLyogUE1fUlVOX0lOU1RfQ01QTCAqLworCQkJCSsrbmxpbTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg1MDAwMDk6CS8qIFBNX1JVTl9JTlNUX0NNUEwgKi8KKwkJCQlhbHRbaisrXSA9IDB4MTAwMDA5OwkvKiBQTV9JTlNUX0NNUEwgKi8KKwkJCQlhbHRbaisrXSA9IDB4MjAwMDA5OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW5hbHQgPSBqOworCX0KKworCWlmICghKGZsYWdzICYgUFBNVV9MSU1JVEVEX1BNQ19PSykgJiYgbmxpbSkgeworCQkvKiByZW1vdmUgdGhlIGxpbWl0ZWQgUE1DIGV2ZW50cyAqLworCQlqID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG5hbHQ7ICsraSkgeworCQkJaWYgKCFwb3dlcjVwX2xpbWl0ZWRfcG1jX2V2ZW50KGFsdFtpXSkpIHsKKwkJCQlhbHRbal0gPSBhbHRbaV07CisJCQkJKytqOworCQkJfQorCQl9CisJCW5hbHQgPSBqOworCX0gZWxzZSBpZiAoKGZsYWdzICYgUFBNVV9MSU1JVEVEX1BNQ19SRVFEKSAmJiBubGltIDwgbmFsdCkgeworCQkvKiByZW1vdmUgYWxsIGJ1dCB0aGUgbGltaXRlZCBQTUMgZXZlbnRzICovCisJCWogPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbmFsdDsgKytpKSB7CisJCQlpZiAocG93ZXI1cF9saW1pdGVkX3BtY19ldmVudChhbHRbaV0pKSB7CisJCQkJYWx0W2pdID0gYWx0W2ldOworCQkJCSsrajsKKwkJCX0KKwkJfQorCQluYWx0ID0gajsKKwl9CisKKwlyZXR1cm4gbmFsdDsKK30KKworLyoKKyAqIE1hcCBvZiB3aGljaCBkaXJlY3QgZXZlbnRzIG9uIHdoaWNoIFBNQ3MgYXJlIG1hcmtlZCBpbnN0cnVjdGlvbiBldmVudHMuCisgKiBJbmRleGVkIGJ5IFBNQ1NFTCB2YWx1ZSwgYml0IGkgKExFKSBzZXQgaWYgUE1DIGkgaXMgYSBtYXJrZWQgZXZlbnQuCisgKiBCaXQgMCBpcyBzZXQgaWYgaXQgaXMgbWFya2VkIGZvciBhbGwgUE1Dcy4KKyAqIFRoZSAweDgwIGJpdCBpbmRpY2F0ZXMgYSBieXRlIGRlY29kZSBQTUNTRUwgdmFsdWUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRpcmVjdF9ldmVudF9pc19tYXJrZWRbMHgyOF0gPSB7CisJMCwJLyogMDAgKi8KKwkweDFmLAkvKiAwMSBQTV9JT1BTX0NNUEwgKi8KKwkweDIsCS8qIDAyIFBNX01SS19HUlBfRElTUCAqLworCTB4ZSwJLyogMDMgUE1fTVJLX1NUX0NNUEwsIFBNX01SS19TVF9HUFMsIFBNX01SS19TVF9DTVBMX0lOVCAqLworCTAsCS8qIDA0ICovCisJMHgxYywJLyogMDUgUE1fTVJLX0JSVV9GSU4sIFBNX01SS19JTlNUX0ZJTiwgUE1fTVJLX0NSVV9GSU4gKi8KKwkweDgwLAkvKiAwNiAqLworCTB4ODAsCS8qIDA3ICovCisJMCwgMCwgMCwvKiAwOCAtIDBhICovCisJMHgxOCwJLyogMGIgUE1fVEhSRVNIX1RJTUVPLCBQTV9NUktfR1JQX1RJTUVPICovCisJMCwJLyogMGMgKi8KKwkweDgwLAkvKiAwZCAqLworCTB4ODAsCS8qIDBlICovCisJMCwJLyogMGYgKi8KKwkwLAkvKiAxMCAqLworCTB4MTQsCS8qIDExIFBNX01SS19HUlBfQlJfUkVESVIsIFBNX01SS19HUlBfSUNfTUlTUyAqLworCTAsCS8qIDEyICovCisJMHgxMCwJLyogMTMgUE1fTVJLX0dSUF9DTVBMICovCisJMHgxZiwJLyogMTQgUE1fR1JQX01SSywgUE1fTVJLX3tGWFUsRlBVLExTVX1fRklOICovCisJMHgyLAkvKiAxNSBQTV9NUktfR1JQX0lTU1VFRCAqLworCTB4ODAsCS8qIDE2ICovCisJMHg4MCwJLyogMTcgKi8KKwkwLCAwLCAwLCAwLCAwLAorCTB4ODAsCS8qIDFkICovCisJMHg4MCwJLyogMWUgKi8KKwkwLAkvKiAxZiAqLworCTB4ODAsCS8qIDIwICovCisJMHg4MCwJLyogMjEgKi8KKwkweDgwLAkvKiAyMiAqLworCTB4ODAsCS8qIDIzICovCisJMHg4MCwJLyogMjQgKi8KKwkweDgwLAkvKiAyNSAqLworCTB4ODAsCS8qIDI2ICovCisJMHg4MCwJLyogMjcgKi8KK307CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgZXZlbnQgY291bnRzIHRoaW5ncyByZWxhdGluZyB0byBtYXJrZWQgaW5zdHJ1Y3Rpb25zCisgKiBhbmQgdGh1cyBuZWVkcyB0aGUgTU1DUkFfU0FNUExFX0VOQUJMRSBiaXQgc2V0LCBvciAwIGlmIG5vdC4KKyAqLworc3RhdGljIGludCBwb3dlcjVwX21hcmtlZF9pbnN0cl9ldmVudCh1NjQgZXZlbnQpCit7CisJaW50IHBtYywgcHNlbDsKKwlpbnQgYml0LCBieXRlLCB1bml0OworCXUzMiBtYXNrOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCXBzZWwgPSBldmVudCAmIFBNX1BNQ1NFTF9NU0s7CisJaWYgKHBtYyA+PSA1KQorCQlyZXR1cm4gMDsKKworCWJpdCA9IC0xOworCWlmIChwc2VsIDwgc2l6ZW9mKGRpcmVjdF9ldmVudF9pc19tYXJrZWQpKSB7CisJCWlmIChkaXJlY3RfZXZlbnRfaXNfbWFya2VkW3BzZWxdICYgKDEgPDwgcG1jKSkKKwkJCXJldHVybiAxOworCQlpZiAoZGlyZWN0X2V2ZW50X2lzX21hcmtlZFtwc2VsXSAmIDB4ODApCisJCQliaXQgPSA0OworCQllbHNlIGlmIChwc2VsID09IDB4MDgpCisJCQliaXQgPSBwbWMgLSAxOworCQllbHNlIGlmIChwc2VsID09IDB4MTApCisJCQliaXQgPSA0IC0gcG1jOworCQllbHNlIGlmIChwc2VsID09IDB4MWIgJiYgKHBtYyA9PSAxIHx8IHBtYyA9PSAzKSkKKwkJCWJpdCA9IDQ7CisJfSBlbHNlIGlmICgocHNlbCAmIDB4NDgpID09IDB4NDApIHsKKwkJYml0ID0gcHNlbCAmIDc7CisJfSBlbHNlIGlmIChwc2VsID09IDB4MjgpIHsKKwkJYml0ID0gcG1jIC0gMTsKKwl9IGVsc2UgaWYgKHBtYyA9PSAzICYmIChwc2VsID09IDB4MmUgfHwgcHNlbCA9PSAweDJmKSkgeworCQliaXQgPSA0OworCX0KKworCWlmICghKGV2ZW50ICYgUE1fQlVTRVZFTlRfTVNLKSB8fCBiaXQgPT0gLTEpCisJCXJldHVybiAwOworCisJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCXVuaXQgPSAoZXZlbnQgPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwlpZiAodW5pdCA9PSBQTV9MU1UwKSB7CisJCS8qIGJ5dGUgMSBiaXRzIDAtNywgYnl0ZSAyIGJpdHMgMCwyLTQsNiAqLworCQltYXNrID0gMHg1ZGZmMDA7CisJfSBlbHNlIGlmICh1bml0ID09IFBNX0xTVTEgJiYgYnl0ZSA+PSA0KSB7CisJCWJ5dGUgLT0gNDsKKwkJLyogYnl0ZSA1IGJpdHMgNi03LCBieXRlIDYgYml0cyAwLDQsIGJ5dGUgNyBiaXRzIDAtNCw2ICovCisJCW1hc2sgPSAweDVmMTFjMDAwOworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCXJldHVybiAobWFzayA+PiAoYnl0ZSAqIDggKyBiaXQpKSAmIDE7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI1cF9jb21wdXRlX21tY3IodTY0IGV2ZW50W10sIGludCBuX2V2LAorCQkJCXVuc2lnbmVkIGludCBod2NbXSwgdTY0IG1tY3JbXSkKK3sKKwl1NjQgbW1jcjEgPSAwOworCXU2NCBtbWNyYSA9IDA7CisJdW5zaWduZWQgaW50IHBtYywgdW5pdCwgYnl0ZSwgcHNlbDsKKwl1bnNpZ25lZCBpbnQgdHRtOworCWludCBpLCBpc2J1cywgYml0LCBncnNlbDsKKwl1bnNpZ25lZCBpbnQgcG1jX2ludXNlID0gMDsKKwl1bnNpZ25lZCBjaGFyIGJ1c2J5dGVbNF07CisJdW5zaWduZWQgY2hhciB1bml0dXNlWzE2XTsKKwlpbnQgdHRtdXNlOworCisJaWYgKG5fZXYgPiA2KQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaXJzdCBwYXNzIHRvIGNvdW50IHJlc291cmNlIHVzZSAqLworCW1lbXNldChidXNieXRlLCAwLCBzaXplb2YoYnVzYnl0ZSkpOworCW1lbXNldCh1bml0dXNlLCAwLCBzaXplb2YodW5pdHVzZSkpOworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJcG1jID0gKGV2ZW50W2ldID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQlpZiAocG1jKSB7CisJCQlpZiAocG1jID4gNikKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAocG1jX2ludXNlICYgKDEgPDwgKHBtYyAtIDEpKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwbWNfaW51c2UgfD0gMSA8PCAocG1jIC0gMSk7CisJCX0KKwkJaWYgKGV2ZW50W2ldICYgUE1fQlVTRVZFTlRfTVNLKSB7CisJCQl1bml0ID0gKGV2ZW50W2ldID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJCQlieXRlID0gKGV2ZW50W2ldID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJCQlpZiAodW5pdCA+IFBNX0xBU1RVTklUKQorCQkJCXJldHVybiAtMTsKKwkJCWlmICh1bml0ID09IFBNX0lTVTBfQUxUKQorCQkJCXVuaXQgPSBQTV9JU1UwOworCQkJaWYgKGJ5dGUgPj0gNCkgeworCQkJCWlmICh1bml0ICE9IFBNX0xTVTEpCisJCQkJCXJldHVybiAtMTsKKwkJCQkrK3VuaXQ7CisJCQkJYnl0ZSAmPSAzOworCQkJfQorCQkJaWYgKGJ1c2J5dGVbYnl0ZV0gJiYgYnVzYnl0ZVtieXRlXSAhPSB1bml0KQorCQkJCXJldHVybiAtMTsKKwkJCWJ1c2J5dGVbYnl0ZV0gPSB1bml0OworCQkJdW5pdHVzZVt1bml0XSA9IDE7CisJCX0KKwl9CisKKwkvKgorCSAqIEFzc2lnbiByZXNvdXJjZXMgYW5kIHNldCBtdWx0aXBsZXhlciBzZWxlY3RzLgorCSAqCisJICogUE1fSVNVMCBjYW4gZ28gZWl0aGVyIG9uIFRUTTAgb3IgVFRNMSwgYnV0IHRoYXQncyB0aGUgb25seQorCSAqIGNob2ljZSB3ZSBoYXZlIHRvIGRlYWwgd2l0aC4KKwkgKi8KKwlpZiAodW5pdHVzZVtQTV9JU1UwXSAmCisJICAgICh1bml0dXNlW1BNX0ZQVV0gfCB1bml0dXNlW1BNX0lGVV0gfCB1bml0dXNlW1BNX0lTVTFdKSkgeworCQl1bml0dXNlW1BNX0lTVTBfQUxUXSA9IDE7CS8qIG1vdmUgSVNVIHRvIFRUTTEgKi8KKwkJdW5pdHVzZVtQTV9JU1UwXSA9IDA7CisJfQorCS8qIFNldCBUVE1bMDFdU0VMIGZpZWxkcy4gKi8KKwl0dG11c2UgPSAwOworCWZvciAoaSA9IFBNX0ZQVTsgaSA8PSBQTV9JU1UxOyArK2kpIHsKKwkJaWYgKCF1bml0dXNlW2ldKQorCQkJY29udGludWU7CisJCWlmICh0dG11c2UrKykKKwkJCXJldHVybiAtMTsKKwkJbW1jcjEgfD0gKHU2NClpIDw8IE1NQ1IxX1RUTTBTRUxfU0g7CisJfQorCXR0bXVzZSA9IDA7CisJZm9yICg7IGkgPD0gUE1fR1JTOyArK2kpIHsKKwkJaWYgKCF1bml0dXNlW2ldKQorCQkJY29udGludWU7CisJCWlmICh0dG11c2UrKykKKwkJCXJldHVybiAtMTsKKwkJbW1jcjEgfD0gKHU2NCkoaSAmIDMpIDw8IE1NQ1IxX1RUTTFTRUxfU0g7CisJfQorCWlmICh0dG11c2UgPiAxKQorCQlyZXR1cm4gLTE7CisKKwkvKiBTZXQgYnl0ZSBsYW5lIHNlbGVjdCBmaWVsZHMsIFRUTVsyM11TRUwgYW5kIEdSU18qU0VMLiAqLworCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCA0OyArK2J5dGUpIHsKKwkJdW5pdCA9IGJ1c2J5dGVbYnl0ZV07CisJCWlmICghdW5pdCkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5pdCA9PSBQTV9JU1UwICYmIHVuaXR1c2VbUE1fSVNVMF9BTFRdKSB7CisJCQkvKiBnZXQgSVNVMCB0aHJvdWdoIFRUTTEgcmF0aGVyIHRoYW4gVFRNMCAqLworCQkJdW5pdCA9IFBNX0lTVTBfQUxUOworCQl9IGVsc2UgaWYgKHVuaXQgPT0gUE1fTFNVMSArIDEpIHsKKwkJCS8qIHNlbGVjdCBsb3dlciB3b3JkIG9mIExTVTEgZm9yIHRoaXMgYnl0ZSAqLworCQkJbW1jcjEgfD0gMXVsbCA8PCAoTU1DUjFfVFRNM1NFTF9TSCArIDMgLSBieXRlKTsKKwkJfQorCQl0dG0gPSB1bml0ID4+IDI7CisJCW1tY3IxIHw9ICh1NjQpdHRtIDw8IChNTUNSMV9URF9DUF9EQkcwU0VMX1NIIC0gMiAqIGJ5dGUpOworCX0KKworCS8qIFNlY29uZCBwYXNzOiBhc3NpZ24gUE1Dcywgc2V0IFBNQ3hTRUwgYW5kIFBNQ3hfQURERVJfU0VMIGZpZWxkcyAqLworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJcG1jID0gKGV2ZW50W2ldID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQl1bml0ID0gKGV2ZW50W2ldID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJCWJ5dGUgPSAoZXZlbnRbaV0gPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJcHNlbCA9IGV2ZW50W2ldICYgUE1fUE1DU0VMX01TSzsKKwkJaXNidXMgPSBldmVudFtpXSAmIFBNX0JVU0VWRU5UX01TSzsKKwkJaWYgKCFwbWMpIHsKKwkJCS8qIEJ1cyBldmVudCBvciBhbnktUE1DIGRpcmVjdCBldmVudCAqLworCQkJZm9yIChwbWMgPSAwOyBwbWMgPCA0OyArK3BtYykgeworCQkJCWlmICghKHBtY19pbnVzZSAmICgxIDw8IHBtYykpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwbWMgPj0gNCkKKwkJCQlyZXR1cm4gLTE7CisJCQlwbWNfaW51c2UgfD0gMSA8PCBwbWM7CisJCX0gZWxzZSBpZiAocG1jIDw9IDQpIHsKKwkJCS8qIERpcmVjdCBldmVudCAqLworCQkJLS1wbWM7CisJCQlpZiAoaXNidXMgJiYgKGJ5dGUgJiAyKSAmJgorCQkJICAgIChwc2VsID09IDggfHwgcHNlbCA9PSAweDEwIHx8IHBzZWwgPT0gMHgyOCkpCisJCQkJLyogYWRkIGV2ZW50cyBvbiBoaWdoZXItbnVtYmVyZWQgYnVzICovCisJCQkJbW1jcjEgfD0gMXVsbCA8PCAoTU1DUjFfUE1DMV9BRERFUl9TRUxfU0ggLSBwbWMpOworCQl9IGVsc2UgeworCQkJLyogSW5zdHJ1Y3Rpb25zIG9yIHJ1biBjeWNsZXMgb24gUE1DNS82ICovCisJCQktLXBtYzsKKwkJfQorCQlpZiAoaXNidXMgJiYgdW5pdCA9PSBQTV9HUlMpIHsKKwkJCWJpdCA9IHBzZWwgJiA3OworCQkJZ3JzZWwgPSAoZXZlbnRbaV0gPj4gUE1fR1JTX1NIKSAmIFBNX0dSU19NU0s7CisJCQltbWNyMSB8PSAodTY0KWdyc2VsIDw8IGdyc2VsX3NoaWZ0W2JpdF07CisJCX0KKwkJaWYgKHBvd2VyNXBfbWFya2VkX2luc3RyX2V2ZW50KGV2ZW50W2ldKSkKKwkJCW1tY3JhIHw9IE1NQ1JBX1NBTVBMRV9FTkFCTEU7CisJCWlmICgocHNlbCAmIDB4NTgpID09IDB4NDAgJiYgKGJ5dGUgJiAxKSAhPSAoKHBtYyA+PiAxKSAmIDEpKQorCQkJLyogc2VsZWN0IGFsdGVybmF0ZSBieXRlIGxhbmUgKi8KKwkJCXBzZWwgfD0gMHgxMDsKKwkJaWYgKHBtYyA8PSAzKQorCQkJbW1jcjEgfD0gcHNlbCA8PCBNTUNSMV9QTUNTRUxfU0gocG1jKTsKKwkJaHdjW2ldID0gcG1jOworCX0KKworCS8qIFJldHVybiBNTUNSeCB2YWx1ZXMgKi8KKwltbWNyWzBdID0gMDsKKwlpZiAocG1jX2ludXNlICYgMSkKKwkJbW1jclswXSA9IE1NQ1IwX1BNQzFDRTsKKwlpZiAocG1jX2ludXNlICYgMHgzZSkKKwkJbW1jclswXSB8PSBNTUNSMF9QTUNqQ0U7CisJbW1jclsxXSA9IG1tY3IxOworCW1tY3JbMl0gPSBtbWNyYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG93ZXI1cF9kaXNhYmxlX3BtYyh1bnNpZ25lZCBpbnQgcG1jLCB1NjQgbW1jcltdKQoreworCWlmIChwbWMgPD0gMykKKwkJbW1jclsxXSAmPSB+KDB4N2ZVTCA8PCBNTUNSMV9QTUNTRUxfU0gocG1jKSk7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI1cF9nZW5lcmljX2V2ZW50c1tdID0geworCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCQk9IDB4ZiwKKwlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdCQk9IDB4MTAwMDA5LAorCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdCT0gMHgxYzEwYTgsIC8qIExEX1JFRl9MMSAqLworCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFU10JCT0gMHgzYzEwODgsIC8qIExEX01JU1NfTDEgKi8KKwlbUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TXQk9IDB4MjMwZTQsICAvKiBCUl9JU1NVRUQgKi8KKwlbUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTXQkJPSAweDIzMGU1LCAgLyogQlJfTVBSRURfQ1IgKi8KK307CisKKyNkZWZpbmUgQyh4KQlQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjeAorCisvKgorICogVGFibGUgb2YgZ2VuZXJhbGl6ZWQgY2FjaGUtcmVsYXRlZCBldmVudHMuCisgKiAwIG1lYW5zIG5vdCBzdXBwb3J0ZWQsIC0xIG1lYW5zIG5vbnNlbnNpY2FsLCBvdGhlciB2YWx1ZXMKKyAqIGFyZSBldmVudCBjb2Rlcy4KKyAqLworc3RhdGljIGludCBwb3dlcjVwX2NhY2hlX2V2ZW50c1tDKE1BWCldW0MoT1BfTUFYKV1bQyhSRVNVTFRfTUFYKV0gPSB7CisJW0MoTDFEKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4MWMxMGE4LAkweDNjMTA4OAl9LAorCQlbQyhPUF9XUklURSldID0gewkweDJjMTBhOCwJMHhjMTBjMwkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMHhjNzBlNywJLTEJCX0sCisJfSwKKwlbQyhMMUkpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTAJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTAsCQkwCQl9LAorCX0sCisJW0MoTEwpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTAJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTAsCQkwCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweGM1MGMzLAkwCQl9LAorCX0sCisJW0MoRFRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweGMyMGU0LAkweDgwMGM0CQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCisJW0MoSVRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHg4MDBjMAkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKKwl9LAorCVtDKEJQVSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDIzMGU0LAkweDIzMGU1CQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCit9OworCitzdHJ1Y3QgcG93ZXJfcG11IHBvd2VyNXBfcG11ID0geworCS5uX2NvdW50ZXIgPSA2LAorCS5tYXhfYWx0ZXJuYXRpdmVzID0gTUFYX0FMVCwKKwkuYWRkX2ZpZWxkcyA9IDB4NzAwMDAwMDAwMDA1NXVsbCwKKwkudGVzdF9hZGRlciA9IDB4MzAwMDA0MDAwMDAwMHVsbCwKKwkuY29tcHV0ZV9tbWNyID0gcG93ZXI1cF9jb21wdXRlX21tY3IsCisJLmdldF9jb25zdHJhaW50ID0gcG93ZXI1cF9nZXRfY29uc3RyYWludCwKKwkuZ2V0X2FsdGVybmF0aXZlcyA9IHBvd2VyNXBfZ2V0X2FsdGVybmF0aXZlcywKKwkuZGlzYWJsZV9wbWMgPSBwb3dlcjVwX2Rpc2FibGVfcG1jLAorCS5saW1pdGVkX3BtY19ldmVudCA9IHBvd2VyNXBfbGltaXRlZF9wbWNfZXZlbnQsCisJLmZsYWdzID0gUFBNVV9MSU1JVEVEX1BNQzVfNiwKKwkubl9nZW5lcmljID0gQVJSQVlfU0laRShwb3dlcjVwX2dlbmVyaWNfZXZlbnRzKSwKKwkuZ2VuZXJpY19ldmVudHMgPSBwb3dlcjVwX2dlbmVyaWNfZXZlbnRzLAorCS5jYWNoZV9ldmVudHMgPSAmcG93ZXI1cF9jYWNoZV9ldmVudHMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjUtcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNS1wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTYwMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjUtcG11LmMKQEAgLTAsMCArMSw2MTEgQEAKKy8qCisgKiBQZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQgZm9yIFBPV0VSNSAobm90IFBPV0VSNSsrKSBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAyMDA5IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKworLyoKKyAqIEJpdHMgaW4gZXZlbnQgY29kZSBmb3IgUE9XRVI1IChub3QgUE9XRVI1KyspCisgKi8KKyNkZWZpbmUgUE1fUE1DX1NICTIwCS8qIFBNQyBudW1iZXIgKDEtYmFzZWQpIGZvciBkaXJlY3QgZXZlbnRzICovCisjZGVmaW5lIFBNX1BNQ19NU0sJMHhmCisjZGVmaW5lIFBNX1BNQ19NU0tTCShQTV9QTUNfTVNLIDw8IFBNX1BNQ19TSCkKKyNkZWZpbmUgUE1fVU5JVF9TSAkxNgkvKiBUVE1NVVggbnVtYmVyIGFuZCBzZXR0aW5nIC0gdW5pdCBzZWxlY3QgKi8KKyNkZWZpbmUgUE1fVU5JVF9NU0sJMHhmCisjZGVmaW5lIFBNX0JZVEVfU0gJMTIJLyogQnl0ZSBudW1iZXIgb2YgZXZlbnQgYnVzIHRvIHVzZSAqLworI2RlZmluZSBQTV9CWVRFX01TSwk3CisjZGVmaW5lIFBNX0dSU19TSAk4CS8qIFN0b3JhZ2Ugc3Vic3lzdGVtIG11eCBzZWxlY3QgKi8KKyNkZWZpbmUgUE1fR1JTX01TSwk3CisjZGVmaW5lIFBNX0JVU0VWRU5UX01TSwkweDgwCS8qIFNldCBpZiBldmVudCB1c2VzIGV2ZW50IGJ1cyAqLworI2RlZmluZSBQTV9QTUNTRUxfTVNLCTB4N2YKKworLyogVmFsdWVzIGluIFBNX1VOSVQgZmllbGQgKi8KKyNkZWZpbmUgUE1fRlBVCQkwCisjZGVmaW5lIFBNX0lTVTAJCTEKKyNkZWZpbmUgUE1fSUZVCQkyCisjZGVmaW5lIFBNX0lTVTEJCTMKKyNkZWZpbmUgUE1fSURVCQk0CisjZGVmaW5lIFBNX0lTVTBfQUxUCTYKKyNkZWZpbmUgUE1fR1JTCQk3CisjZGVmaW5lIFBNX0xTVTAJCTgKKyNkZWZpbmUgUE1fTFNVMQkJMHhjCisjZGVmaW5lIFBNX0xBU1RVTklUCTB4YworCisvKgorICogQml0cyBpbiBNTUNSMSBmb3IgUE9XRVI1CisgKi8KKyNkZWZpbmUgTU1DUjFfVFRNMFNFTF9TSAk2MgorI2RlZmluZSBNTUNSMV9UVE0xU0VMX1NICTYwCisjZGVmaW5lIE1NQ1IxX1RUTTJTRUxfU0gJNTgKKyNkZWZpbmUgTU1DUjFfVFRNM1NFTF9TSAk1NgorI2RlZmluZSBNTUNSMV9UVE1TRUxfTVNLCTMKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHMFNFTF9TSAk1NAorI2RlZmluZSBNTUNSMV9URF9DUF9EQkcxU0VMX1NICTUyCisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzJTRUxfU0gJNTAKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHM1NFTF9TSAk0OAorI2RlZmluZSBNTUNSMV9HUlNfTDJTRUxfU0gJNDYKKyNkZWZpbmUgTU1DUjFfR1JTX0wyU0VMX01TSwkzCisjZGVmaW5lIE1NQ1IxX0dSU19MM1NFTF9TSAk0NAorI2RlZmluZSBNTUNSMV9HUlNfTDNTRUxfTVNLCTMKKyNkZWZpbmUgTU1DUjFfR1JTX01DU0VMX1NICTQxCisjZGVmaW5lIE1NQ1IxX0dSU19NQ1NFTF9NU0sJNworI2RlZmluZSBNTUNSMV9HUlNfRkFCU0VMX1NICTM5CisjZGVmaW5lIE1NQ1IxX0dSU19GQUJTRUxfTVNLCTMKKyNkZWZpbmUgTU1DUjFfUE1DMV9BRERFUl9TRUxfU0gJMzUKKyNkZWZpbmUgTU1DUjFfUE1DMl9BRERFUl9TRUxfU0gJMzQKKyNkZWZpbmUgTU1DUjFfUE1DM19BRERFUl9TRUxfU0gJMzMKKyNkZWZpbmUgTU1DUjFfUE1DNF9BRERFUl9TRUxfU0gJMzIKKyNkZWZpbmUgTU1DUjFfUE1DMVNFTF9TSAkyNQorI2RlZmluZSBNTUNSMV9QTUMyU0VMX1NICTE3CisjZGVmaW5lIE1NQ1IxX1BNQzNTRUxfU0gJOQorI2RlZmluZSBNTUNSMV9QTUM0U0VMX1NICTEKKyNkZWZpbmUgTU1DUjFfUE1DU0VMX1NIKG4pCShNTUNSMV9QTUMxU0VMX1NIIC0gKG4pICogOCkKKyNkZWZpbmUgTU1DUjFfUE1DU0VMX01TSwkweDdmCisKKy8qCisgKiBCaXRzIGluIE1NQ1JBCisgKi8KKworLyoKKyAqIExheW91dCBvZiBjb25zdHJhaW50IGJpdHM6CisgKiA2NjY2NTU1NTU1NTU1NTQ0NDQ0NDQ0NDQzMzMzMzMzMzMzMjIyMjIyMjIyMjExMTExMTExMTEwMDAwMDAwMDAwCisgKiAzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwCisgKiAgICAgICAgIDw+PD5bICA+PD48PjwgPjw+IFsgID5bID5bID48ICA+PCAgPjwgID48ICA+PD48Pjw+PD48Pjw+CisgKiAgICAgICAgIFQwVDEgTkMgRzBHMUcyIEczICBVQyBQUzFQUzIgQjAgIEIxICBCMiAgQjMgUDZQNVA0UDNQMlAxCisgKgorICogVDAgLSBUVE0wIGNvbnN0cmFpbnQKKyAqICAgICA1NC01NTogVFRNMFNFTCB2YWx1ZSAoMD1GUFUsIDI9SUZVLCAzPUlTVTEpIDB4YzBfMDAwMF8wMDAwXzAwMDAKKyAqCisgKiBUMSAtIFRUTTEgY29uc3RyYWludAorICogICAgIDUyLTUzOiBUVE0xU0VMIHZhbHVlICgwPUlEVSwgMz1HUlMpIDB4MzBfMDAwMF8wMDAwXzAwMDAKKyAqCisgKiBOQyAtIG51bWJlciBvZiBjb3VudGVycworICogICAgIDUxOiBOQyBlcnJvciAweDAwMDhfMDAwMF8wMDAwXzAwMDAKKyAqICAgICA0OC01MDogbnVtYmVyIG9mIGV2ZW50cyBuZWVkaW5nIFBNQzEtNCAweDAwMDdfMDAwMF8wMDAwXzAwMDAKKyAqCisgKiBHMC4uRzMgLSBHUlMgbXV4IGNvbnN0cmFpbnRzCisgKiAgICAgNDYtNDc6IEdSU19MMlNFTCB2YWx1ZQorICogICAgIDQ0LTQ1OiBHUlNfTDNTRUwgdmFsdWUKKyAqICAgICA0MS00NDogR1JTX01DU0VMIHZhbHVlCisgKiAgICAgMzktNDA6IEdSU19GQUJTRUwgdmFsdWUKKyAqCU5vdGUgdGhhdCB0aGVzZSBtYXRjaCB1cCB3aXRoIHRoZWlyIGJpdCBwb3NpdGlvbnMgaW4gTU1DUjEKKyAqCisgKiBVQyAtIHVuaXQgY29uc3RyYWludDogY2FuJ3QgaGF2ZSBhbGwgdGhyZWUgb2YgRlBVfElGVXxJU1UxLCBJU1UwLCBJRFV8R1JTCisgKiAgICAgMzc6IFVDMyBlcnJvciAweDIwXzAwMDBfMDAwMAorICogICAgIDM2OiBGUFV8SUZVfElTVTEgZXZlbnRzIG5lZWRlZCAweDEwXzAwMDBfMDAwMAorICogICAgIDM1OiBJU1UwIGV2ZW50cyBuZWVkZWQgMHgwOF8wMDAwXzAwMDAKKyAqICAgICAzNDogSURVfEdSUyBldmVudHMgbmVlZGVkIDB4MDRfMDAwMF8wMDAwCisgKgorICogUFMxCisgKiAgICAgMzM6IFBTMSBlcnJvciAweDJfMDAwMF8wMDAwCisgKiAgICAgMzEtMzI6IGNvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzEvMiAweDFfODAwMF8wMDAwCisgKgorICogUFMyCisgKiAgICAgMzA6IFBTMiBlcnJvciAweDQwMDBfMDAwMAorICogICAgIDI4LTI5OiBjb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUMzLzQgMHgzMDAwXzAwMDAKKyAqCisgKiBCMAorICogICAgIDI0LTI3OiBCeXRlIDAgZXZlbnQgc291cmNlIDB4MGYwMF8wMDAwCisgKgkgICAgICBFbmNvZGluZyBhcyBmb3IgdGhlIGV2ZW50IGNvZGUKKyAqCisgKiBCMSwgQjIsIEIzCisgKiAgICAgMjAtMjMsIDE2LTE5LCAxMi0xNTogQnl0ZSAxLCAyLCAzIGV2ZW50IHNvdXJjZXMKKyAqCisgKiBQMS4uUDYKKyAqICAgICAwLTExOiBDb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUMxLi5QTUM2CisgKi8KKworc3RhdGljIGNvbnN0IGludCBncnNlbF9zaGlmdFs4XSA9IHsKKwlNTUNSMV9HUlNfTDJTRUxfU0gsIE1NQ1IxX0dSU19MMlNFTF9TSCwgTU1DUjFfR1JTX0wyU0VMX1NILAorCU1NQ1IxX0dSU19MM1NFTF9TSCwgTU1DUjFfR1JTX0wzU0VMX1NILCBNTUNSMV9HUlNfTDNTRUxfU0gsCisJTU1DUjFfR1JTX01DU0VMX1NILCBNTUNSMV9HUlNfRkFCU0VMX1NICit9OworCisvKiBNYXNrcyBhbmQgdmFsdWVzIGZvciB1c2luZyBldmVudHMgZnJvbSB0aGUgdmFyaW91cyB1bml0cyAqLworc3RhdGljIHU2NCB1bml0X2NvbnNbUE1fTEFTVFVOSVQrMV1bMl0gPSB7CisJW1BNX0ZQVV0gPSAgIHsgMHhjMDAwMjAwMDAwMDAwMHVsbCwgMHgwMDAwMTAwMDAwMDAwMHVsbCB9LAorCVtQTV9JU1UwXSA9ICB7IDB4MDAwMDIwMDAwMDAwMDB1bGwsIDB4MDAwMDA4MDAwMDAwMDB1bGwgfSwKKwlbUE1fSVNVMV0gPSAgeyAweGMwMDAyMDAwMDAwMDAwdWxsLCAweGMwMDAxMDAwMDAwMDAwdWxsIH0sCisJW1BNX0lGVV0gPSAgIHsgMHhjMDAwMjAwMDAwMDAwMHVsbCwgMHg4MDAwMTAwMDAwMDAwMHVsbCB9LAorCVtQTV9JRFVdID0gICB7IDB4MzAwMDIwMDAwMDAwMDB1bGwsIDB4MDAwMDA0MDAwMDAwMDB1bGwgfSwKKwlbUE1fR1JTXSA9ICAgeyAweDMwMDAyMDAwMDAwMDAwdWxsLCAweDMwMDAwNDAwMDAwMDAwdWxsIH0sCit9OworCitzdGF0aWMgaW50IHBvd2VyNV9nZXRfY29uc3RyYWludCh1NjQgZXZlbnQsIHU2NCAqbWFza3AsIHU2NCAqdmFscCkKK3sKKwlpbnQgcG1jLCBieXRlLCB1bml0LCBzaDsKKwlpbnQgYml0LCBmbWFzazsKKwl1NjQgbWFzayA9IDAsIHZhbHVlID0gMDsKKwlpbnQgZ3JwID0gLTE7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJaWYgKHBtYykgeworCQlpZiAocG1jID4gNikKKwkJCXJldHVybiAtMTsKKwkJc2ggPSAocG1jIC0gMSkgKiAyOworCQltYXNrIHw9IDIgPDwgc2g7CisJCXZhbHVlIHw9IDEgPDwgc2g7CisJCWlmIChwbWMgPD0gNCkKKwkJCWdycCA9IChwbWMgLSAxKSA+PiAxOworCQllbHNlIGlmIChldmVudCAhPSAweDUwMDAwOSAmJiBldmVudCAhPSAweDYwMDAwNSkKKwkJCXJldHVybiAtMTsKKwl9CisJaWYgKGV2ZW50ICYgUE1fQlVTRVZFTlRfTVNLKSB7CisJCXVuaXQgPSAoZXZlbnQgPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJaWYgKHVuaXQgPiBQTV9MQVNUVU5JVCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHVuaXQgPT0gUE1fSVNVMF9BTFQpCisJCQl1bml0ID0gUE1fSVNVMDsKKwkJbWFzayB8PSB1bml0X2NvbnNbdW5pdF1bMF07CisJCXZhbHVlIHw9IHVuaXRfY29uc1t1bml0XVsxXTsKKwkJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQlpZiAoYnl0ZSA+PSA0KSB7CisJCQlpZiAodW5pdCAhPSBQTV9MU1UxKQorCQkJCXJldHVybiAtMTsKKwkJCS8qIE1hcCBMU1UxIGxvdyB3b3JkIChieXRlcyA0LTcpIHRvIHVuaXQgTFNVMSsxICovCisJCQkrK3VuaXQ7CisJCQlieXRlICY9IDM7CisJCX0KKwkJaWYgKHVuaXQgPT0gUE1fR1JTKSB7CisJCQliaXQgPSBldmVudCAmIDc7CisJCQlmbWFzayA9IChiaXQgPT0gNik/IDc6IDM7CisJCQlzaCA9IGdyc2VsX3NoaWZ0W2JpdF07CisJCQltYXNrIHw9ICh1NjQpZm1hc2sgPDwgc2g7CisJCQl2YWx1ZSB8PSAodTY0KSgoZXZlbnQgPj4gUE1fR1JTX1NIKSAmIGZtYXNrKSA8PCBzaDsKKwkJfQorCQkvKgorCQkgKiBCdXMgZXZlbnRzIG9uIGJ5dGVzIDAgYW5kIDIgY2FuIGJlIGNvdW50ZWQKKwkJICogb24gUE1DMS8yOyBieXRlcyAxIGFuZCAzIG9uIFBNQzMvNC4KKwkJICovCisJCWlmICghcG1jKQorCQkJZ3JwID0gYnl0ZSAmIDE7CisJCS8qIFNldCBieXRlIGxhbmUgc2VsZWN0IGZpZWxkICovCisJCW1hc2sgIHw9IDB4ZlVMTCA8PCAoMjQgLSA0ICogYnl0ZSk7CisJCXZhbHVlIHw9ICh1NjQpdW5pdCA8PCAoMjQgLSA0ICogYnl0ZSk7CisJfQorCWlmIChncnAgPT0gMCkgeworCQkvKiBpbmNyZW1lbnQgUE1DMS8yIGZpZWxkICovCisJCW1hc2sgIHw9IDB4MjAwMDAwMDAwdWxsOworCQl2YWx1ZSB8PSAweDA4MDAwMDAwMHVsbDsKKwl9IGVsc2UgaWYgKGdycCA9PSAxKSB7CisJCS8qIGluY3JlbWVudCBQTUMzLzQgZmllbGQgKi8KKwkJbWFzayAgfD0gMHg0MDAwMDAwMHVsbDsKKwkJdmFsdWUgfD0gMHgxMDAwMDAwMHVsbDsKKwl9CisJaWYgKHBtYyA8IDUpIHsKKwkJLyogbmVlZCBhIGNvdW50ZXIgZnJvbSBQTUMxLTQgc2V0ICovCisJCW1hc2sgIHw9IDB4ODAwMDAwMDAwMDAwMHVsbDsKKwkJdmFsdWUgfD0gMHgxMDAwMDAwMDAwMDAwdWxsOworCX0KKwkqbWFza3AgPSBtYXNrOworCSp2YWxwID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX0FMVAkzCS8qIGF0IG1vc3QgMyBhbHRlcm5hdGl2ZXMgZm9yIGFueSBldmVudCAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV2ZW50X2FsdGVybmF0aXZlc1tdW01BWF9BTFRdID0geworCXsgMHgxMjBlNCwgIDB4NDAwMDAyIH0sCQkJLyogUE1fR1JQX0RJU1BfUkVKRUNUICovCisJeyAweDQxMGM3LCAgMHg0NDEwODQgfSwJCQkvKiBQTV9USFJEX0wyTUlTU19CT1RIX0NZQyAqLworCXsgMHgxMDAwMDUsIDB4NjAwMDA1IH0sCQkJLyogUE1fUlVOX0NZQyAqLworCXsgMHgxMDAwMDksIDB4MjAwMDA5LCAweDUwMDAwOSB9LAkvKiBQTV9JTlNUX0NNUEwgKi8KKwl7IDB4MzAwMDA5LCAweDQwMDAwOSB9LAkJCS8qIFBNX0lOU1RfRElTUCAqLworfTsKKworLyoKKyAqIFNjYW4gdGhlIGFsdGVybmF0aXZlcyB0YWJsZSBmb3IgYSBtYXRjaCBhbmQgcmV0dXJuIHRoZQorICogaW5kZXggaW50byB0aGUgYWx0ZXJuYXRpdmVzIHRhYmxlIGlmIGZvdW5kLCBlbHNlIC0xLgorICovCitzdGF0aWMgaW50IGZpbmRfYWx0ZXJuYXRpdmUodTY0IGV2ZW50KQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZlbnRfYWx0ZXJuYXRpdmVzKTsgKytpKSB7CisJCWlmIChldmVudCA8IGV2ZW50X2FsdGVybmF0aXZlc1tpXVswXSkKKwkJCWJyZWFrOworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0FMVCAmJiBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal07ICsraikKKwkJCWlmIChldmVudCA9PSBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal0pCisJCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnl0ZWRlY29kZV9hbHRlcm5hdGl2ZXNbNF1bNF0gPSB7CisJLyogUE1DIDEgKi8JeyAweDIxLCAweDIzLCAweDI1LCAweDI3IH0sCisJLyogUE1DIDIgKi8JeyAweDA3LCAweDE3LCAweDBlLCAweDFlIH0sCisJLyogUE1DIDMgKi8JeyAweDIwLCAweDIyLCAweDI0LCAweDI2IH0sCisJLyogUE1DIDQgKi8JeyAweDA3LCAweDE3LCAweDBlLCAweDFlIH0KK307CisKKy8qCisgKiBTb21lIGRpcmVjdCBldmVudHMgZm9yIGRlY29kZXMgb2YgZXZlbnQgYnVzIGJ5dGUgMyBoYXZlIGFsdGVybmF0aXZlCisgKiBQTUNTRUwgdmFsdWVzIG9uIG90aGVyIGNvdW50ZXJzLiAgVGhpcyByZXR1cm5zIHRoZSBhbHRlcm5hdGl2ZQorICogZXZlbnQgY29kZSBmb3IgdGhvc2UgdGhhdCBkbywgb3IgLTEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgczY0IGZpbmRfYWx0ZXJuYXRpdmVfYmRlY29kZSh1NjQgZXZlbnQpCit7CisJaW50IHBtYywgYWx0cG1jLCBwcCwgajsKKworCXBtYyA9IChldmVudCA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwlpZiAocG1jID09IDAgfHwgcG1jID4gNCkKKwkJcmV0dXJuIC0xOworCWFsdHBtYyA9IDUgLSBwbWM7CS8qIDEgPC0+IDQsIDIgPC0+IDMgKi8KKwlwcCA9IGV2ZW50ICYgUE1fUE1DU0VMX01TSzsKKwlmb3IgKGogPSAwOyBqIDwgNDsgKytqKSB7CisJCWlmIChieXRlZGVjb2RlX2FsdGVybmF0aXZlc1twbWMgLSAxXVtqXSA9PSBwcCkgeworCQkJcmV0dXJuIChldmVudCAmIH4oUE1fUE1DX01TS1MgfCBQTV9QTUNTRUxfTVNLKSkgfAorCQkJCShhbHRwbWMgPDwgUE1fUE1DX1NIKSB8CisJCQkJYnl0ZWRlY29kZV9hbHRlcm5hdGl2ZXNbYWx0cG1jIC0gMV1bal07CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHBvd2VyNV9nZXRfYWx0ZXJuYXRpdmVzKHU2NCBldmVudCwgdW5zaWduZWQgaW50IGZsYWdzLCB1NjQgYWx0W10pCit7CisJaW50IGksIGosIG5hbHQgPSAxOworCXM2NCBhZTsKKworCWFsdFswXSA9IGV2ZW50OworCW5hbHQgPSAxOworCWkgPSBmaW5kX2FsdGVybmF0aXZlKGV2ZW50KTsKKwlpZiAoaSA+PSAwKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxUOyArK2opIHsKKwkJCWFlID0gZXZlbnRfYWx0ZXJuYXRpdmVzW2ldW2pdOworCQkJaWYgKGFlICYmIGFlICE9IGV2ZW50KQorCQkJCWFsdFtuYWx0KytdID0gYWU7CisJCX0KKwl9IGVsc2UgeworCQlhZSA9IGZpbmRfYWx0ZXJuYXRpdmVfYmRlY29kZShldmVudCk7CisJCWlmIChhZSA+IDApCisJCQlhbHRbbmFsdCsrXSA9IGFlOworCX0KKwlyZXR1cm4gbmFsdDsKK30KKworLyoKKyAqIE1hcCBvZiB3aGljaCBkaXJlY3QgZXZlbnRzIG9uIHdoaWNoIFBNQ3MgYXJlIG1hcmtlZCBpbnN0cnVjdGlvbiBldmVudHMuCisgKiBJbmRleGVkIGJ5IFBNQ1NFTCB2YWx1ZSwgYml0IGkgKExFKSBzZXQgaWYgUE1DIGkgaXMgYSBtYXJrZWQgZXZlbnQuCisgKiBCaXQgMCBpcyBzZXQgaWYgaXQgaXMgbWFya2VkIGZvciBhbGwgUE1Dcy4KKyAqIFRoZSAweDgwIGJpdCBpbmRpY2F0ZXMgYSBieXRlIGRlY29kZSBQTUNTRUwgdmFsdWUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRpcmVjdF9ldmVudF9pc19tYXJrZWRbMHgyOF0gPSB7CisJMCwJLyogMDAgKi8KKwkweDFmLAkvKiAwMSBQTV9JT1BTX0NNUEwgKi8KKwkweDIsCS8qIDAyIFBNX01SS19HUlBfRElTUCAqLworCTB4ZSwJLyogMDMgUE1fTVJLX1NUX0NNUEwsIFBNX01SS19TVF9HUFMsIFBNX01SS19TVF9DTVBMX0lOVCAqLworCTAsCS8qIDA0ICovCisJMHgxYywJLyogMDUgUE1fTVJLX0JSVV9GSU4sIFBNX01SS19JTlNUX0ZJTiwgUE1fTVJLX0NSVV9GSU4gKi8KKwkweDgwLAkvKiAwNiAqLworCTB4ODAsCS8qIDA3ICovCisJMCwgMCwgMCwvKiAwOCAtIDBhICovCisJMHgxOCwJLyogMGIgUE1fVEhSRVNIX1RJTUVPLCBQTV9NUktfR1JQX1RJTUVPICovCisJMCwJLyogMGMgKi8KKwkweDgwLAkvKiAwZCAqLworCTB4ODAsCS8qIDBlICovCisJMCwJLyogMGYgKi8KKwkwLAkvKiAxMCAqLworCTB4MTQsCS8qIDExIFBNX01SS19HUlBfQlJfUkVESVIsIFBNX01SS19HUlBfSUNfTUlTUyAqLworCTAsCS8qIDEyICovCisJMHgxMCwJLyogMTMgUE1fTVJLX0dSUF9DTVBMICovCisJMHgxZiwJLyogMTQgUE1fR1JQX01SSywgUE1fTVJLX3tGWFUsRlBVLExTVX1fRklOICovCisJMHgyLAkvKiAxNSBQTV9NUktfR1JQX0lTU1VFRCAqLworCTB4ODAsCS8qIDE2ICovCisJMHg4MCwJLyogMTcgKi8KKwkwLCAwLCAwLCAwLCAwLAorCTB4ODAsCS8qIDFkICovCisJMHg4MCwJLyogMWUgKi8KKwkwLAkvKiAxZiAqLworCTB4ODAsCS8qIDIwICovCisJMHg4MCwJLyogMjEgKi8KKwkweDgwLAkvKiAyMiAqLworCTB4ODAsCS8qIDIzICovCisJMHg4MCwJLyogMjQgKi8KKwkweDgwLAkvKiAyNSAqLworCTB4ODAsCS8qIDI2ICovCisJMHg4MCwJLyogMjcgKi8KK307CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgZXZlbnQgY291bnRzIHRoaW5ncyByZWxhdGluZyB0byBtYXJrZWQgaW5zdHJ1Y3Rpb25zCisgKiBhbmQgdGh1cyBuZWVkcyB0aGUgTU1DUkFfU0FNUExFX0VOQUJMRSBiaXQgc2V0LCBvciAwIGlmIG5vdC4KKyAqLworc3RhdGljIGludCBwb3dlcjVfbWFya2VkX2luc3RyX2V2ZW50KHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBwc2VsOworCWludCBiaXQsIGJ5dGUsIHVuaXQ7CisJdTMyIG1hc2s7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJcHNlbCA9IGV2ZW50ICYgUE1fUE1DU0VMX01TSzsKKwlpZiAocG1jID49IDUpCisJCXJldHVybiAwOworCisJYml0ID0gLTE7CisJaWYgKHBzZWwgPCBzaXplb2YoZGlyZWN0X2V2ZW50X2lzX21hcmtlZCkpIHsKKwkJaWYgKGRpcmVjdF9ldmVudF9pc19tYXJrZWRbcHNlbF0gJiAoMSA8PCBwbWMpKQorCQkJcmV0dXJuIDE7CisJCWlmIChkaXJlY3RfZXZlbnRfaXNfbWFya2VkW3BzZWxdICYgMHg4MCkKKwkJCWJpdCA9IDQ7CisJCWVsc2UgaWYgKHBzZWwgPT0gMHgwOCkKKwkJCWJpdCA9IHBtYyAtIDE7CisJCWVsc2UgaWYgKHBzZWwgPT0gMHgxMCkKKwkJCWJpdCA9IDQgLSBwbWM7CisJCWVsc2UgaWYgKHBzZWwgPT0gMHgxYiAmJiAocG1jID09IDEgfHwgcG1jID09IDMpKQorCQkJYml0ID0gNDsKKwl9IGVsc2UgaWYgKChwc2VsICYgMHg1OCkgPT0gMHg0MCkKKwkJYml0ID0gcHNlbCAmIDc7CisKKwlpZiAoIShldmVudCAmIFBNX0JVU0VWRU5UX01TSykpCisJCXJldHVybiAwOworCisJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCXVuaXQgPSAoZXZlbnQgPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwlpZiAodW5pdCA9PSBQTV9MU1UwKSB7CisJCS8qIGJ5dGUgMSBiaXRzIDAtNywgYnl0ZSAyIGJpdHMgMCwyLTQsNiAqLworCQltYXNrID0gMHg1ZGZmMDA7CisJfSBlbHNlIGlmICh1bml0ID09IFBNX0xTVTEgJiYgYnl0ZSA+PSA0KSB7CisJCWJ5dGUgLT0gNDsKKwkJLyogYnl0ZSA0IGJpdHMgMSwzLDUsNywgYnl0ZSA1IGJpdHMgNi03LCBieXRlIDcgYml0cyAwLTQsNiAqLworCQltYXNrID0gMHg1ZjAwYzBhYTsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKG1hc2sgPj4gKGJ5dGUgKiA4ICsgYml0KSkgJiAxOworfQorCitzdGF0aWMgaW50IHBvd2VyNV9jb21wdXRlX21tY3IodTY0IGV2ZW50W10sIGludCBuX2V2LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBod2NbXSwgdTY0IG1tY3JbXSkKK3sKKwl1NjQgbW1jcjEgPSAwOworCXU2NCBtbWNyYSA9IDA7CisJdW5zaWduZWQgaW50IHBtYywgdW5pdCwgYnl0ZSwgcHNlbDsKKwl1bnNpZ25lZCBpbnQgdHRtLCBncnA7CisJaW50IGksIGlzYnVzLCBiaXQsIGdyc2VsOworCXVuc2lnbmVkIGludCBwbWNfaW51c2UgPSAwOworCXVuc2lnbmVkIGludCBwbWNfZ3JwX3VzZVsyXTsKKwl1bnNpZ25lZCBjaGFyIGJ1c2J5dGVbNF07CisJdW5zaWduZWQgY2hhciB1bml0dXNlWzE2XTsKKwlpbnQgdHRtdXNlOworCisJaWYgKG5fZXYgPiA2KQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaXJzdCBwYXNzIHRvIGNvdW50IHJlc291cmNlIHVzZSAqLworCXBtY19ncnBfdXNlWzBdID0gcG1jX2dycF91c2VbMV0gPSAwOworCW1lbXNldChidXNieXRlLCAwLCBzaXplb2YoYnVzYnl0ZSkpOworCW1lbXNldCh1bml0dXNlLCAwLCBzaXplb2YodW5pdHVzZSkpOworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJcG1jID0gKGV2ZW50W2ldID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQlpZiAocG1jKSB7CisJCQlpZiAocG1jID4gNikKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAocG1jX2ludXNlICYgKDEgPDwgKHBtYyAtIDEpKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwbWNfaW51c2UgfD0gMSA8PCAocG1jIC0gMSk7CisJCQkvKiBjb3VudCAxLzIgdnMgMy80IHVzZSAqLworCQkJaWYgKHBtYyA8PSA0KQorCQkJCSsrcG1jX2dycF91c2VbKHBtYyAtIDEpID4+IDFdOworCQl9CisJCWlmIChldmVudFtpXSAmIFBNX0JVU0VWRU5UX01TSykgeworCQkJdW5pdCA9IChldmVudFtpXSA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCQkJYnl0ZSA9IChldmVudFtpXSA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQkJaWYgKHVuaXQgPiBQTV9MQVNUVU5JVCkKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAodW5pdCA9PSBQTV9JU1UwX0FMVCkKKwkJCQl1bml0ID0gUE1fSVNVMDsKKwkJCWlmIChieXRlID49IDQpIHsKKwkJCQlpZiAodW5pdCAhPSBQTV9MU1UxKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJKyt1bml0OworCQkJCWJ5dGUgJj0gMzsKKwkJCX0KKwkJCWlmICghcG1jKQorCQkJCSsrcG1jX2dycF91c2VbYnl0ZSAmIDFdOworCQkJaWYgKGJ1c2J5dGVbYnl0ZV0gJiYgYnVzYnl0ZVtieXRlXSAhPSB1bml0KQorCQkJCXJldHVybiAtMTsKKwkJCWJ1c2J5dGVbYnl0ZV0gPSB1bml0OworCQkJdW5pdHVzZVt1bml0XSA9IDE7CisJCX0KKwl9CisJaWYgKHBtY19ncnBfdXNlWzBdID4gMiB8fCBwbWNfZ3JwX3VzZVsxXSA+IDIpCisJCXJldHVybiAtMTsKKworCS8qCisJICogQXNzaWduIHJlc291cmNlcyBhbmQgc2V0IG11bHRpcGxleGVyIHNlbGVjdHMuCisJICoKKwkgKiBQTV9JU1UwIGNhbiBnbyBlaXRoZXIgb24gVFRNMCBvciBUVE0xLCBidXQgdGhhdCdzIHRoZSBvbmx5CisJICogY2hvaWNlIHdlIGhhdmUgdG8gZGVhbCB3aXRoLgorCSAqLworCWlmICh1bml0dXNlW1BNX0lTVTBdICYKKwkgICAgKHVuaXR1c2VbUE1fRlBVXSB8IHVuaXR1c2VbUE1fSUZVXSB8IHVuaXR1c2VbUE1fSVNVMV0pKSB7CisJCXVuaXR1c2VbUE1fSVNVMF9BTFRdID0gMTsJLyogbW92ZSBJU1UgdG8gVFRNMSAqLworCQl1bml0dXNlW1BNX0lTVTBdID0gMDsKKwl9CisJLyogU2V0IFRUTVswMV1TRUwgZmllbGRzLiAqLworCXR0bXVzZSA9IDA7CisJZm9yIChpID0gUE1fRlBVOyBpIDw9IFBNX0lTVTE7ICsraSkgeworCQlpZiAoIXVuaXR1c2VbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKHR0bXVzZSsrKQorCQkJcmV0dXJuIC0xOworCQltbWNyMSB8PSAodTY0KWkgPDwgTU1DUjFfVFRNMFNFTF9TSDsKKwl9CisJdHRtdXNlID0gMDsKKwlmb3IgKDsgaSA8PSBQTV9HUlM7ICsraSkgeworCQlpZiAoIXVuaXR1c2VbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKHR0bXVzZSsrKQorCQkJcmV0dXJuIC0xOworCQltbWNyMSB8PSAodTY0KShpICYgMykgPDwgTU1DUjFfVFRNMVNFTF9TSDsKKwl9CisJaWYgKHR0bXVzZSA+IDEpCisJCXJldHVybiAtMTsKKworCS8qIFNldCBieXRlIGxhbmUgc2VsZWN0IGZpZWxkcywgVFRNWzIzXVNFTCBhbmQgR1JTXypTRUwuICovCisJZm9yIChieXRlID0gMDsgYnl0ZSA8IDQ7ICsrYnl0ZSkgeworCQl1bml0ID0gYnVzYnl0ZVtieXRlXTsKKwkJaWYgKCF1bml0KQorCQkJY29udGludWU7CisJCWlmICh1bml0ID09IFBNX0lTVTAgJiYgdW5pdHVzZVtQTV9JU1UwX0FMVF0pIHsKKwkJCS8qIGdldCBJU1UwIHRocm91Z2ggVFRNMSByYXRoZXIgdGhhbiBUVE0wICovCisJCQl1bml0ID0gUE1fSVNVMF9BTFQ7CisJCX0gZWxzZSBpZiAodW5pdCA9PSBQTV9MU1UxICsgMSkgeworCQkJLyogc2VsZWN0IGxvd2VyIHdvcmQgb2YgTFNVMSBmb3IgdGhpcyBieXRlICovCisJCQltbWNyMSB8PSAxdWxsIDw8IChNTUNSMV9UVE0zU0VMX1NIICsgMyAtIGJ5dGUpOworCQl9CisJCXR0bSA9IHVuaXQgPj4gMjsKKwkJbW1jcjEgfD0gKHU2NCl0dG0gPDwgKE1NQ1IxX1REX0NQX0RCRzBTRUxfU0ggLSAyICogYnl0ZSk7CisJfQorCisJLyogU2Vjb25kIHBhc3M6IGFzc2lnbiBQTUNzLCBzZXQgUE1DeFNFTCBhbmQgUE1DeF9BRERFUl9TRUwgZmllbGRzICovCisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCXVuaXQgPSAoZXZlbnRbaV0gPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJYnl0ZSA9IChldmVudFtpXSA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQlwc2VsID0gZXZlbnRbaV0gJiBQTV9QTUNTRUxfTVNLOworCQlpc2J1cyA9IGV2ZW50W2ldICYgUE1fQlVTRVZFTlRfTVNLOworCQlpZiAoIXBtYykgeworCQkJLyogQnVzIGV2ZW50IG9yIGFueS1QTUMgZGlyZWN0IGV2ZW50ICovCisJCQlmb3IgKHBtYyA9IDA7IHBtYyA8IDQ7ICsrcG1jKSB7CisJCQkJaWYgKHBtY19pbnVzZSAmICgxIDw8IHBtYykpCisJCQkJCWNvbnRpbnVlOworCQkJCWdycCA9IChwbWMgPj4gMSkgJiAxOworCQkJCWlmIChpc2J1cykgeworCQkJCQlpZiAoZ3JwID09IChieXRlICYgMSkpCisJCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKHBtY19ncnBfdXNlW2dycF0gPCAyKSB7CisJCQkJCSsrcG1jX2dycF91c2VbZ3JwXTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcG1jX2ludXNlIHw9IDEgPDwgcG1jOworCQl9IGVsc2UgaWYgKHBtYyA8PSA0KSB7CisJCQkvKiBEaXJlY3QgZXZlbnQgKi8KKwkJCS0tcG1jOworCQkJaWYgKChwc2VsID09IDggfHwgcHNlbCA9PSAweDEwKSAmJiBpc2J1cyAmJiAoYnl0ZSAmIDIpKQorCQkJCS8qIGFkZCBldmVudHMgb24gaGlnaGVyLW51bWJlcmVkIGJ1cyAqLworCQkJCW1tY3IxIHw9IDF1bGwgPDwgKE1NQ1IxX1BNQzFfQURERVJfU0VMX1NIIC0gcG1jKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEluc3RydWN0aW9ucyBvciBydW4gY3ljbGVzIG9uIFBNQzUvNiAqLworCQkJLS1wbWM7CisJCX0KKwkJaWYgKGlzYnVzICYmIHVuaXQgPT0gUE1fR1JTKSB7CisJCQliaXQgPSBwc2VsICYgNzsKKwkJCWdyc2VsID0gKGV2ZW50W2ldID4+IFBNX0dSU19TSCkgJiBQTV9HUlNfTVNLOworCQkJbW1jcjEgfD0gKHU2NClncnNlbCA8PCBncnNlbF9zaGlmdFtiaXRdOworCQl9CisJCWlmIChwb3dlcjVfbWFya2VkX2luc3RyX2V2ZW50KGV2ZW50W2ldKSkKKwkJCW1tY3JhIHw9IE1NQ1JBX1NBTVBMRV9FTkFCTEU7CisJCWlmIChwbWMgPD0gMykKKwkJCW1tY3IxIHw9IHBzZWwgPDwgTU1DUjFfUE1DU0VMX1NIKHBtYyk7CisJCWh3Y1tpXSA9IHBtYzsKKwl9CisKKwkvKiBSZXR1cm4gTU1DUnggdmFsdWVzICovCisJbW1jclswXSA9IDA7CisJaWYgKHBtY19pbnVzZSAmIDEpCisJCW1tY3JbMF0gPSBNTUNSMF9QTUMxQ0U7CisJaWYgKHBtY19pbnVzZSAmIDB4M2UpCisJCW1tY3JbMF0gfD0gTU1DUjBfUE1DakNFOworCW1tY3JbMV0gPSBtbWNyMTsKKwltbWNyWzJdID0gbW1jcmE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBvd2VyNV9kaXNhYmxlX3BtYyh1bnNpZ25lZCBpbnQgcG1jLCB1NjQgbW1jcltdKQoreworCWlmIChwbWMgPD0gMykKKwkJbW1jclsxXSAmPSB+KDB4N2ZVTCA8PCBNTUNSMV9QTUNTRUxfU0gocG1jKSk7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI1X2dlbmVyaWNfZXZlbnRzW10gPSB7CisJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10JCT0gMHhmLAorCVtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMHgxMDAwMDksCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JPSAweDRjMTA5MCwgLyogTERfUkVGX0wxICovCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSAweDNjMTA4OCwgLyogTERfTUlTU19MMSAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCT0gMHgyMzBlNCwgIC8qIEJSX0lTU1VFRCAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCQk9IDB4MjMwZTUsICAvKiBCUl9NUFJFRF9DUiAqLworfTsKKworI2RlZmluZSBDKHgpCVBFUkZfQ09VTlRfSFdfQ0FDSEVfIyN4CisKKy8qCisgKiBUYWJsZSBvZiBnZW5lcmFsaXplZCBjYWNoZS1yZWxhdGVkIGV2ZW50cy4KKyAqIDAgbWVhbnMgbm90IHN1cHBvcnRlZCwgLTEgbWVhbnMgbm9uc2Vuc2ljYWwsIG90aGVyIHZhbHVlcworICogYXJlIGV2ZW50IGNvZGVzLgorICovCitzdGF0aWMgaW50IHBvd2VyNV9jYWNoZV9ldmVudHNbQyhNQVgpXVtDKE9QX01BWCldW0MoUkVTVUxUX01BWCldID0geworCVtDKEwxRCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDRjMTA5MCwJMHgzYzEwODgJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJMHgzYzEwOTAsCTB4YzEwYzMJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4YzcwZTcsCTAJCX0sCisJfSwKKwlbQyhMMUkpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTAJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTAsCQkwCQl9LAorCX0sCisJW0MoTEwpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4M2MzMDliCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTAsCQkwCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweGM1MGMzLAkwCQl9LAorCX0sCisJW0MoRFRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDJjNDA5MCwJMHg4MDBjNAkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKKwl9LAorCVtDKElUTEIpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4ODAwYzAJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJCX0sCisJfSwKKwlbQyhCUFUpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHgyMzBlNCwJMHgyMzBlNQkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKKwl9LAorfTsKKworc3RydWN0IHBvd2VyX3BtdSBwb3dlcjVfcG11ID0geworCS5uX2NvdW50ZXIgPSA2LAorCS5tYXhfYWx0ZXJuYXRpdmVzID0gTUFYX0FMVCwKKwkuYWRkX2ZpZWxkcyA9IDB4NzAwMDA5MDAwMDU1NXVsbCwKKwkudGVzdF9hZGRlciA9IDB4MzAwMDQ5MDAwMDAwMHVsbCwKKwkuY29tcHV0ZV9tbWNyID0gcG93ZXI1X2NvbXB1dGVfbW1jciwKKwkuZ2V0X2NvbnN0cmFpbnQgPSBwb3dlcjVfZ2V0X2NvbnN0cmFpbnQsCisJLmdldF9hbHRlcm5hdGl2ZXMgPSBwb3dlcjVfZ2V0X2FsdGVybmF0aXZlcywKKwkuZGlzYWJsZV9wbWMgPSBwb3dlcjVfZGlzYWJsZV9wbWMsCisJLm5fZ2VuZXJpYyA9IEFSUkFZX1NJWkUocG93ZXI1X2dlbmVyaWNfZXZlbnRzKSwKKwkuZ2VuZXJpY19ldmVudHMgPSBwb3dlcjVfZ2VuZXJpY19ldmVudHMsCisJLmNhY2hlX2V2ZW50cyA9ICZwb3dlcjVfY2FjaGVfZXZlbnRzLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI2LXBtdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmNzRiZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI2LXBtdS5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogUGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IGZvciBQT1dFUjYgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKworLyoKKyAqIEJpdHMgaW4gZXZlbnQgY29kZSBmb3IgUE9XRVI2CisgKi8KKyNkZWZpbmUgUE1fUE1DX1NICTIwCS8qIFBNQyBudW1iZXIgKDEtYmFzZWQpIGZvciBkaXJlY3QgZXZlbnRzICovCisjZGVmaW5lIFBNX1BNQ19NU0sJMHg3CisjZGVmaW5lIFBNX1BNQ19NU0tTCShQTV9QTUNfTVNLIDw8IFBNX1BNQ19TSCkKKyNkZWZpbmUgUE1fVU5JVF9TSAkxNgkvKiBVbml0IGV2ZW50IGNvbWVzIChUVE14U0VMIGVuY29kaW5nKSAqLworI2RlZmluZSBQTV9VTklUX01TSwkweGYKKyNkZWZpbmUgUE1fVU5JVF9NU0tTCShQTV9VTklUX01TSyA8PCBQTV9VTklUX1NIKQorI2RlZmluZSBQTV9MTEFWCQkweDgwMDAJLyogTG9hZCBsb29rYWhlYWQgbWF0Y2ggdmFsdWUgKi8KKyNkZWZpbmUgUE1fTExBCQkweDQwMDAJLyogTG9hZCBsb29rYWhlYWQgbWF0Y2ggZW5hYmxlICovCisjZGVmaW5lIFBNX0JZVEVfU0gJMTIJLyogQnl0ZSBvZiBldmVudCBidXMgdG8gdXNlICovCisjZGVmaW5lIFBNX0JZVEVfTVNLCTMKKyNkZWZpbmUgUE1fU1VCVU5JVF9TSAk4CS8qIFN1YnVuaXQgZXZlbnQgY29tZXMgZnJvbSAoTkVTVF9TRUwgZW5jLikgKi8KKyNkZWZpbmUgUE1fU1VCVU5JVF9NU0sJNworI2RlZmluZSBQTV9TVUJVTklUX01TS1MJKFBNX1NVQlVOSVRfTVNLIDw8IFBNX1NVQlVOSVRfU0gpCisjZGVmaW5lIFBNX1BNQ1NFTF9NU0sJMHhmZgkvKiBQTUN4U0VMIHZhbHVlICovCisjZGVmaW5lIFBNX0JVU0VWRU5UX01TSwkweGYzNzAwCisKKy8qCisgKiBCaXRzIGluIE1NQ1IxIGZvciBQT1dFUjYKKyAqLworI2RlZmluZSBNTUNSMV9UVE0wU0VMX1NICTYwCisjZGVmaW5lIE1NQ1IxX1RUTVNFTF9TSChuKQkoTU1DUjFfVFRNMFNFTF9TSCAtIChuKSAqIDQpCisjZGVmaW5lIE1NQ1IxX1RUTVNFTF9NU0sJMHhmCisjZGVmaW5lIE1NQ1IxX1RUTVNFTChtLCBuKQkoKChtKSA+PiBNTUNSMV9UVE1TRUxfU0gobikpICYgTU1DUjFfVFRNU0VMX01TSykKKyNkZWZpbmUgTU1DUjFfTkVTVFNFTF9TSAk0NQorI2RlZmluZSBNTUNSMV9ORVNUU0VMX01TSwkweDcKKyNkZWZpbmUgTU1DUjFfTkVTVFNFTChtKQkoKChtKSA+PiBNTUNSMV9ORVNUU0VMX1NIKSAmIE1NQ1IxX05FU1RTRUxfTVNLKQorI2RlZmluZSBNTUNSMV9QTUMxX0xMQQkJKCh1NjQpMSA8PCA0NCkKKyNkZWZpbmUgTU1DUjFfUE1DMV9MTEFfVkFMVUUJKCh1NjQpMSA8PCAzOSkKKyNkZWZpbmUgTU1DUjFfUE1DMV9BRERSX1NFTAkoKHU2NCkxIDw8IDM1KQorI2RlZmluZSBNTUNSMV9QTUMxU0VMX1NICTI0CisjZGVmaW5lIE1NQ1IxX1BNQ1NFTF9TSChuKQkoTU1DUjFfUE1DMVNFTF9TSCAtIChuKSAqIDgpCisjZGVmaW5lIE1NQ1IxX1BNQ1NFTF9NU0sJMHhmZgorCisvKgorICogTWFwIG9mIHdoaWNoIGRpcmVjdCBldmVudHMgb24gd2hpY2ggUE1DcyBhcmUgbWFya2VkIGluc3RydWN0aW9uIGV2ZW50cy4KKyAqIEluZGV4ZWQgYnkgUE1DU0VMIHZhbHVlID4+IDEuCisgKiBCb3R0b20gNCBiaXRzIGFyZSBhIG1hcCBvZiB3aGljaCBQTUNzIGFyZSBpbnRlcmVzdGluZywKKyAqIHRvcCA0IGJpdHMgc2F5IHdoYXQgc29ydCBvZiBldmVudDoKKyAqICAgMCA9IGRpcmVjdCBtYXJrZWQgZXZlbnQsCisgKiAgIDEgPSBieXRlIGRlY29kZSBldmVudCwKKyAqICAgNCA9IGFkZC9hbmQgZXZlbnQgKFBNQzEgLT4gYml0cyAwICYgNCksCisgKiAgIDUgPSBhZGQvYW5kIGV2ZW50IChQTUMxIC0+IGJpdHMgMSAmIDUpLAorICogICA2ID0gYWRkL2FuZCBldmVudCAoUE1DMSAtPiBiaXRzIDIgJiA2KSwKKyAqICAgNyA9IGFkZC9hbmQgZXZlbnQgKFBNQzEgLT4gYml0cyAzICYgNykuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRpcmVjdF9ldmVudF9pc19tYXJrZWRbMHg2MCA+PiAxXSA9IHsKKwkwLAkvKiAwMCAqLworCTAsCS8qIDAyICovCisJMCwJLyogMDQgKi8KKwkweDA3LAkvKiAwNiBQTV9NUktfU1RfQ01QTCwgUE1fTVJLX1NUX0dQUywgUE1fTVJLX1NUX0NNUExfSU5UICovCisJMHgwNCwJLyogMDggUE1fTVJLX0RGVV9GSU4gKi8KKwkweDA2LAkvKiAwYSBQTV9NUktfSUZVX0ZJTiwgUE1fTVJLX0lOU1RfRklOICovCisJMCwJLyogMGMgKi8KKwkwLAkvKiAwZSAqLworCTB4MDIsCS8qIDEwIFBNX01SS19JTlNUX0RJU1AgKi8KKwkweDA4LAkvKiAxMiBQTV9NUktfTFNVX0RFUkFUX01JU1MgKi8KKwkwLAkvKiAxNCAqLworCTAsCS8qIDE2ICovCisJMHgwYywJLyogMTggUE1fVEhSRVNIX1RJTUVPLCBQTV9NUktfSU5TVF9GSU4gKi8KKwkweDBmLAkvKiAxYSBQTV9NUktfSU5TVF9ESVNQLCBQTV9NUktfe0ZYVSxGUFUsTFNVfV9GSU4gKi8KKwkweDAxLAkvKiAxYyBQTV9NUktfSU5TVF9JU1NVRUQgKi8KKwkwLAkvKiAxZSAqLworCTAsCS8qIDIwICovCisJMCwJLyogMjIgKi8KKwkwLAkvKiAyNCAqLworCTAsCS8qIDI2ICovCisJMHgxNSwJLyogMjggUE1fTVJLX0RBVEFfRlJPTV9MMk1JU1MsIFBNX01SS19EQVRBX0ZST01fTDNNSVNTICovCisJMCwJLyogMmEgKi8KKwkwLAkvKiAyYyAqLworCTAsCS8qIDJlICovCisJMHg0ZiwJLyogMzAgKi8KKwkweDdmLAkvKiAzMiAqLworCTB4NGYsCS8qIDM0ICovCisJMHg1ZiwJLyogMzYgKi8KKwkweDZmLAkvKiAzOCAqLworCTB4NGYsCS8qIDNhICovCisJMCwJLyogM2MgKi8KKwkweDA4LAkvKiAzZSBQTV9NUktfSU5TVF9USU1FTyAqLworCTB4MWYsCS8qIDQwICovCisJMHgxZiwJLyogNDIgKi8KKwkweDFmLAkvKiA0NCAqLworCTB4MWYsCS8qIDQ2ICovCisJMHgxZiwJLyogNDggKi8KKwkweDFmLAkvKiA0YSAqLworCTB4MWYsCS8qIDRjICovCisJMHgxZiwJLyogNGUgKi8KKwkwLAkvKiA1MCAqLworCTB4MDUsCS8qIDUyIFBNX01SS19CUl9UQUtFTiwgUE1fTVJLX0JSX01QUkVEICovCisJMHgxYywJLyogNTQgUE1fTVJLX1BURUdfRlJPTV9MM01JU1MsIFBNX01SS19QVEVHX0ZST01fTDJNSVNTICovCisJMHgwMiwJLyogNTYgUE1fTVJLX0xEX01JU1NfTDEgKi8KKwkwLAkvKiA1OCAqLworCTAsCS8qIDVhICovCisJMCwJLyogNWMgKi8KKwkwLAkvKiA1ZSAqLworfTsKKworLyoKKyAqIE1hc2tzIHNob3dpbmcgZm9yIGVhY2ggdW5pdCB3aGljaCBiaXRzIGFyZSBtYXJrZWQgZXZlbnRzLgorICogVGhlc2UgbWFza3MgYXJlIGluIExFIG9yZGVyLCBpLmUuIDB4MDAwMDAwMDEgaXMgYnl0ZSAwLCBiaXQgMC4KKyAqLworc3RhdGljIHUzMiBtYXJrZWRfYnVzX2V2ZW50c1sxNl0gPSB7CisJMHgwMTAwMDAwMCwJLyogZGlyZWN0IGV2ZW50cyBzZXQgMTogYnl0ZSAzIGJpdCAwICovCisJMHgwMDAxMDAwMCwJLyogZGlyZWN0IGV2ZW50cyBzZXQgMjogYnl0ZSAyIGJpdCAwICovCisJMCwgMCwgMCwgMCwJLyogSURVLCBJRlUsIG5lc3Q6IG5vdGhpbmcgKi8KKwkweDAwMDAwMDg4LAkvKiBWTVggc2V0IDE6IGJ5dGUgMCBiaXRzIDMsIDcgKi8KKwkweDAwMDAwMGMwLAkvKiBWTVggc2V0IDI6IGJ5dGUgMCBiaXRzIDQtNyAqLworCTB4MDQwMTAwMDAsCS8qIExTVSBzZXQgMTogYnl0ZSAyIGJpdCAwLCBieXRlIDMgYml0IDIgKi8KKwkweGZmMDEwMDAwdSwJLyogTFNVIHNldCAyOiBieXRlIDIgYml0IDAsIGFsbCBvZiBieXRlIDMgKi8KKwkwLAkJLyogTFNVIHNldCAzICovCisJMHgwMDAwMDAxMCwJLyogVk1YIHNldCAzOiBieXRlIDAgYml0IDQgKi8KKwkwLAkJLyogQkZQIHNldCAxICovCisJMHgwMDAwMDAyMiwJLyogQkZQIHNldCAyOiBieXRlIDAgYml0cyAxLCA1ICovCisJMCwgMAorfTsKKwkKKy8qCisgKiBSZXR1cm5zIDEgaWYgZXZlbnQgY291bnRzIHRoaW5ncyByZWxhdGluZyB0byBtYXJrZWQgaW5zdHJ1Y3Rpb25zCisgKiBhbmQgdGh1cyBuZWVkcyB0aGUgTU1DUkFfU0FNUExFX0VOQUJMRSBiaXQgc2V0LCBvciAwIGlmIG5vdC4KKyAqLworc3RhdGljIGludCBwb3dlcjZfbWFya2VkX2luc3RyX2V2ZW50KHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBwc2VsLCBwdHlwZTsKKwlpbnQgYml0LCBieXRlLCB1bml0OworCXUzMiBtYXNrOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCXBzZWwgPSAoZXZlbnQgJiBQTV9QTUNTRUxfTVNLKSA+PiAxOwkvKiBkcm9wIGVkZ2UvbGV2ZWwgYml0ICovCisJaWYgKHBtYyA+PSA1KQorCQlyZXR1cm4gMDsKKworCWJpdCA9IC0xOworCWlmIChwc2VsIDwgc2l6ZW9mKGRpcmVjdF9ldmVudF9pc19tYXJrZWQpKSB7CisJCXB0eXBlID0gZGlyZWN0X2V2ZW50X2lzX21hcmtlZFtwc2VsXTsKKwkJaWYgKHBtYyA9PSAwIHx8ICEocHR5cGUgJiAoMSA8PCAocG1jIC0gMSkpKSkKKwkJCXJldHVybiAwOworCQlwdHlwZSA+Pj0gNDsKKwkJaWYgKHB0eXBlID09IDApCisJCQlyZXR1cm4gMTsKKwkJaWYgKHB0eXBlID09IDEpCisJCQliaXQgPSAwOworCQllbHNlCisJCQliaXQgPSBwdHlwZSBeIChwbWMgLSAxKTsKKwl9IGVsc2UgaWYgKChwc2VsICYgMHg0OCkgPT0gMHg0MCkKKwkJYml0ID0gcHNlbCAmIDc7CisKKwlpZiAoIShldmVudCAmIFBNX0JVU0VWRU5UX01TSykgfHwgYml0ID09IC0xKQorCQlyZXR1cm4gMDsKKworCWJ5dGUgPSAoZXZlbnQgPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwl1bml0ID0gKGV2ZW50ID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJbWFzayA9IG1hcmtlZF9idXNfZXZlbnRzW3VuaXRdOworCXJldHVybiAobWFzayA+PiAoYnl0ZSAqIDggKyBiaXQpKSAmIDE7Cit9CisKKy8qCisgKiBBc3NpZ24gUE1DIG51bWJlcnMgYW5kIGNvbXB1dGUgTU1DUjEgdmFsdWUgZm9yIGEgc2V0IG9mIGV2ZW50cworICovCitzdGF0aWMgaW50IHA2X2NvbXB1dGVfbW1jcih1NjQgZXZlbnRbXSwgaW50IG5fZXYsCisJCQkgICB1bnNpZ25lZCBpbnQgaHdjW10sIHU2NCBtbWNyW10pCit7CisJdTY0IG1tY3IxID0gMDsKKwl1NjQgbW1jcmEgPSAwOworCWludCBpOworCXVuc2lnbmVkIGludCBwbWMsIGV2LCBiLCB1LCBzLCBwc2VsOworCXVuc2lnbmVkIGludCB0dG1zZXQgPSAwOworCXVuc2lnbmVkIGludCBwbWNfaW51c2UgPSAwOworCisJaWYgKG5fZXYgPiA2KQorCQlyZXR1cm4gLTE7CisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCWlmIChwbWMpIHsKKwkJCWlmIChwbWNfaW51c2UgJiAoMSA8PCAocG1jIC0gMSkpKQorCQkJCXJldHVybiAtMTsJLyogY29sbGlzaW9uISAqLworCQkJcG1jX2ludXNlIHw9IDEgPDwgKHBtYyAtIDEpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJZXYgPSBldmVudFtpXTsKKwkJcG1jID0gKGV2ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQlpZiAocG1jKSB7CisJCQktLXBtYzsKKwkJfSBlbHNlIHsKKwkJCS8qIGNhbiBnbyBvbiBhbnkgUE1DOyBmaW5kIGEgZnJlZSBvbmUgKi8KKwkJCWZvciAocG1jID0gMDsgcG1jIDwgNDsgKytwbWMpCisJCQkJaWYgKCEocG1jX2ludXNlICYgKDEgPDwgcG1jKSkpCisJCQkJCWJyZWFrOworCQkJaWYgKHBtYyA+PSA0KQorCQkJCXJldHVybiAtMTsKKwkJCXBtY19pbnVzZSB8PSAxIDw8IHBtYzsKKwkJfQorCQlod2NbaV0gPSBwbWM7CisJCXBzZWwgPSBldiAmIFBNX1BNQ1NFTF9NU0s7CisJCWlmIChldiAmIFBNX0JVU0VWRU5UX01TSykgeworCQkJLyogdGhpcyBldmVudCB1c2VzIHRoZSBldmVudCBidXMgKi8KKwkJCWIgPSAoZXYgPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJCXUgPSAoZXYgPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJCS8qIGNoZWNrIGZvciBjb25mbGljdCBvbiB0aGlzIGJ5dGUgb2YgZXZlbnQgYnVzICovCisJCQlpZiAoKHR0bXNldCAmICgxIDw8IGIpKSAmJiBNTUNSMV9UVE1TRUwobW1jcjEsIGIpICE9IHUpCisJCQkJcmV0dXJuIC0xOworCQkJbW1jcjEgfD0gKHU2NCl1IDw8IE1NQ1IxX1RUTVNFTF9TSChiKTsKKwkJCXR0bXNldCB8PSAxIDw8IGI7CisJCQlpZiAodSA9PSA1KSB7CisJCQkJLyogTmVzdCBldmVudHMgaGF2ZSBhIGZ1cnRoZXIgbXV4ICovCisJCQkJcyA9IChldiA+PiBQTV9TVUJVTklUX1NIKSAmIFBNX1NVQlVOSVRfTVNLOworCQkJCWlmICgodHRtc2V0ICYgMHgxMCkgJiYKKwkJCQkgICAgTU1DUjFfTkVTVFNFTChtbWNyMSkgIT0gcykKKwkJCQkJcmV0dXJuIC0xOworCQkJCXR0bXNldCB8PSAweDEwOworCQkJCW1tY3IxIHw9ICh1NjQpcyA8PCBNTUNSMV9ORVNUU0VMX1NIOworCQkJfQorCQkJaWYgKDB4MzAgPD0gcHNlbCAmJiBwc2VsIDw9IDB4M2QpIHsKKwkJCQkvKiB0aGVzZSBuZWVkIHRoZSBQTUN4X0FERFJfU0VMIGJpdHMgKi8KKwkJCQlpZiAoYiA+PSAyKQorCQkJCQltbWNyMSB8PSBNTUNSMV9QTUMxX0FERFJfU0VMID4+IHBtYzsKKwkJCX0KKwkJCS8qIGJ1cyBzZWxlY3QgdmFsdWVzIGFyZSBkaWZmZXJlbnQgZm9yIFBNQzMvNCAqLworCQkJaWYgKHBtYyA+PSAyICYmIChwc2VsICYgMHg5MCkgPT0gMHg4MCkKKwkJCQlwc2VsIF49IDB4MjA7CisJCX0KKwkJaWYgKGV2ICYgUE1fTExBKSB7CisJCQltbWNyMSB8PSBNTUNSMV9QTUMxX0xMQSA+PiBwbWM7CisJCQlpZiAoZXYgJiBQTV9MTEFWKQorCQkJCW1tY3IxIHw9IE1NQ1IxX1BNQzFfTExBX1ZBTFVFID4+IHBtYzsKKwkJfQorCQlpZiAocG93ZXI2X21hcmtlZF9pbnN0cl9ldmVudChldmVudFtpXSkpCisJCQltbWNyYSB8PSBNTUNSQV9TQU1QTEVfRU5BQkxFOworCQlpZiAocG1jIDwgNCkKKwkJCW1tY3IxIHw9ICh1NjQpcHNlbCA8PCBNTUNSMV9QTUNTRUxfU0gocG1jKTsKKwl9CisJbW1jclswXSA9IDA7CisJaWYgKHBtY19pbnVzZSAmIDEpCisJCW1tY3JbMF0gPSBNTUNSMF9QTUMxQ0U7CisJaWYgKHBtY19pbnVzZSAmIDB4ZSkKKwkJbW1jclswXSB8PSBNTUNSMF9QTUNqQ0U7CisJbW1jclsxXSA9IG1tY3IxOworCW1tY3JbMl0gPSBtbWNyYTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExheW91dCBvZiBjb25zdHJhaW50IGJpdHM6CisgKgorICoJMC0xCWFkZCBmaWVsZDogbnVtYmVyIG9mIHVzZXMgb2YgUE1DMSAobWF4IDEpCisgKgkyLTMsIDQtNSwgNi03LCA4LTksIDEwLTExOiBkaXR0byBmb3IgUE1DMiwgMywgNCwgNSwgNgorICoJMTItMTUJYWRkIGZpZWxkOiBudW1iZXIgb2YgdXNlcyBvZiBQTUMxLTQgKG1heCA0KQorICoJMTYtMTkJc2VsZWN0IGZpZWxkOiB1bml0IG9uIGJ5dGUgMCBvZiBldmVudCBidXMKKyAqCTIwLTIzLCAyNC0yNywgMjgtMzEgZGl0dG8gZm9yIGJ5dGVzIDEsIDIsIDMKKyAqCTMyLTM0CXNlbGVjdCBmaWVsZDogbmVzdCAoc3VidW5pdCkgZXZlbnQgc2VsZWN0b3IKKyAqLworc3RhdGljIGludCBwNl9nZXRfY29uc3RyYWludCh1NjQgZXZlbnQsIHU2NCAqbWFza3AsIHU2NCAqdmFscCkKK3sKKwlpbnQgcG1jLCBieXRlLCBzaCwgc3VidW5pdDsKKwl1NjQgbWFzayA9IDAsIHZhbHVlID0gMDsKKworCXBtYyA9IChldmVudCA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwlpZiAocG1jKSB7CisJCWlmIChwbWMgPiA0ICYmICEoZXZlbnQgPT0gMHg1MDAwMDkgfHwgZXZlbnQgPT0gMHg2MDAwMDUpKQorCQkJcmV0dXJuIC0xOworCQlzaCA9IChwbWMgLSAxKSAqIDI7CisJCW1hc2sgfD0gMiA8PCBzaDsKKwkJdmFsdWUgfD0gMSA8PCBzaDsKKwl9CisJaWYgKGV2ZW50ICYgUE1fQlVTRVZFTlRfTVNLKSB7CisJCWJ5dGUgPSAoZXZlbnQgPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJc2ggPSBieXRlICogNCArICgxNiAtIFBNX1VOSVRfU0gpOworCQltYXNrIHw9IFBNX1VOSVRfTVNLUyA8PCBzaDsKKwkJdmFsdWUgfD0gKHU2NCkoZXZlbnQgJiBQTV9VTklUX01TS1MpIDw8IHNoOworCQlpZiAoKGV2ZW50ICYgUE1fVU5JVF9NU0tTKSA9PSAoNSA8PCBQTV9VTklUX1NIKSkgeworCQkJc3VidW5pdCA9IChldmVudCA+PiBQTV9TVUJVTklUX1NIKSAmIFBNX1NVQlVOSVRfTVNLOworCQkJbWFzayAgfD0gKHU2NClQTV9TVUJVTklUX01TSyA8PCAzMjsKKwkJCXZhbHVlIHw9ICh1NjQpc3VidW5pdCA8PCAzMjsKKwkJfQorCX0KKwlpZiAocG1jIDw9IDQpIHsKKwkJbWFzayAgfD0gMHg4MDAwOwkvKiBhZGQgZmllbGQgZm9yIGNvdW50IG9mIFBNQzEtNCB1c2VzICovCisJCXZhbHVlIHw9IDB4MTAwMDsKKwl9CisJKm1hc2twID0gbWFzazsKKwkqdmFscCA9IHZhbHVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHA2X2xpbWl0ZWRfcG1jX2V2ZW50KHU2NCBldmVudCkKK3sKKwlpbnQgcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCisJcmV0dXJuIHBtYyA9PSA1IHx8IHBtYyA9PSA2OworfQorCisjZGVmaW5lIE1BWF9BTFQJNAkvKiBhdCBtb3N0IDQgYWx0ZXJuYXRpdmVzIGZvciBhbnkgZXZlbnQgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldmVudF9hbHRlcm5hdGl2ZXNbXVtNQVhfQUxUXSA9IHsKKwl7IDB4MDEzMGU4LCAweDIwMDBmNiwgMHgzMDAwZmMgfSwJLyogUE1fUFRFR19SRUxPQURfVkFMSUQgKi8KKwl7IDB4MDgwMDgwLCAweDEwMDAwZCwgMHgzMDAwMGMsIDB4NDAwMGYwIH0sIC8qIFBNX0xEX01JU1NfTDEgKi8KKwl7IDB4MDgwMDg4LCAweDIwMDA1NCwgMHgzMDAwZjAgfSwJLyogUE1fU1RfTUlTU19MMSAqLworCXsgMHgxMDAwMGEsIDB4MjAwMGY0LCAweDYwMDAwNSB9LAkvKiBQTV9SVU5fQ1lDICovCisJeyAweDEwMDAwYiwgMHgyMDAwZjUgfSwJCQkvKiBQTV9SVU5fQ09VTlQgKi8KKwl7IDB4MTAwMDBlLCAweDQwMDAxMCB9LAkJCS8qIFBNX1BVUlIgKi8KKwl7IDB4MTAwMDEwLCAweDQwMDBmOCB9LAkJCS8qIFBNX0ZMVVNIICovCisJeyAweDEwMDAxYSwgMHgyMDAwMTAgfSwJCQkvKiBQTV9NUktfSU5TVF9ESVNQICovCisJeyAweDEwMDAyNiwgMHgzMDAwZjggfSwJCQkvKiBQTV9UQl9CSVRfVFJBTlMgKi8KKwl7IDB4MTAwMDU0LCAweDIwMDBmMCB9LAkJCS8qIFBNX1NUX0ZJTiAqLworCXsgMHgxMDAwNTYsIDB4MjAwMGZjIH0sCQkJLyogUE1fTDFfSUNBQ0hFX01JU1MgKi8KKwl7IDB4MTAwMGYwLCAweDQwMDAwYSB9LAkJCS8qIFBNX0lOU1RfSU1DX01BVENIX0NNUEwgKi8KKwl7IDB4MTAwMGY4LCAweDIwMDAwOCB9LAkJCS8qIFBNX0dDVF9FTVBUWV9DWUMgKi8KKwl7IDB4MTAwMGZjLCAweDQwMDAwNiB9LAkJCS8qIFBNX0xTVV9ERVJBVF9NSVNTX0NZQyAqLworCXsgMHgyMDAwMGUsIDB4NDAwMDA3IH0sCQkJLyogUE1fTFNVX0RFUkFUX01JU1MgKi8KKwl7IDB4MjAwMDEyLCAweDMwMDAxMiB9LAkJCS8qIFBNX0lOU1RfRElTUCAqLworCXsgMHgyMDAwZjIsIDB4MzAwMGYyIH0sCQkJLyogUE1fSU5TVF9ESVNQICovCisJeyAweDIwMDBmOCwgMHgzMDAwMTAgfSwJCQkvKiBQTV9FWFRfSU5UICovCisJeyAweDIwMDBmZSwgMHgzMDAwNTYgfSwJCQkvKiBQTV9EQVRBX0ZST01fTDJNSVNTICovCisJeyAweDJkMDAzMCwgMHgzMDAwMWEgfSwJCQkvKiBQTV9NUktfRlBVX0ZJTiAqLworCXsgMHgzMDAwMGEsIDB4NDAwMDE4IH0sCQkJLyogUE1fTVJLX0lOU1RfRklOICovCisJeyAweDMwMDBmNiwgMHg0MDAwMGUgfSwJCQkvKiBQTV9MMV9EQ0FDSEVfUkVMT0FEX1ZBTElEICovCisJeyAweDMwMDBmZSwgMHg0MDAwNTYgfSwJCQkvKiBQTV9EQVRBX0ZST01fTDNNSVNTICovCit9OworCisvKgorICogVGhpcyBjb3VsZCBiZSBtYWRlIG1vcmUgZWZmaWNpZW50IHdpdGggYSBiaW5hcnkgc2VhcmNoIG9uCisgKiBhIHByZXNvcnRlZCBsaXN0LCBpZiBuZWNlc3NhcnkKKyAqLworc3RhdGljIGludCBmaW5kX2FsdGVybmF0aXZlc19saXN0KHU2NCBldmVudCkKK3sKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBpbnQgYWx0OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZlbnRfYWx0ZXJuYXRpdmVzKTsgKytpKSB7CisJCWlmIChldmVudCA8IGV2ZW50X2FsdGVybmF0aXZlc1tpXVswXSkKKwkJCXJldHVybiAtMTsKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9BTFQ7ICsraikgeworCQkJYWx0ID0gZXZlbnRfYWx0ZXJuYXRpdmVzW2ldW2pdOworCQkJaWYgKCFhbHQgfHwgZXZlbnQgPCBhbHQpCisJCQkJYnJlYWs7CisJCQlpZiAoZXZlbnQgPT0gYWx0KQorCQkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBwNl9nZXRfYWx0ZXJuYXRpdmVzKHU2NCBldmVudCwgdW5zaWduZWQgaW50IGZsYWdzLCB1NjQgYWx0W10pCit7CisJaW50IGksIGosIG5saW07CisJdW5zaWduZWQgaW50IHBzZWwsIHBtYzsKKwl1bnNpZ25lZCBpbnQgbmFsdCA9IDE7CisJdTY0IGFldmVudDsKKworCWFsdFswXSA9IGV2ZW50OworCW5saW0gPSBwNl9saW1pdGVkX3BtY19ldmVudChldmVudCk7CisKKwkvKiBjaGVjayB0aGUgYWx0ZXJuYXRpdmVzIHRhYmxlICovCisJaSA9IGZpbmRfYWx0ZXJuYXRpdmVzX2xpc3QoZXZlbnQpOworCWlmIChpID49IDApIHsKKwkJLyogY29weSBvdXQgYWx0ZXJuYXRpdmVzIGZyb20gbGlzdCAqLworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0FMVDsgKytqKSB7CisJCQlhZXZlbnQgPSBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal07CisJCQlpZiAoIWFldmVudCkKKwkJCQlicmVhazsKKwkJCWlmIChhZXZlbnQgIT0gZXZlbnQpCisJCQkJYWx0W25hbHQrK10gPSBhZXZlbnQ7CisJCQlubGltICs9IHA2X2xpbWl0ZWRfcG1jX2V2ZW50KGFldmVudCk7CisJCX0KKworCX0gZWxzZSB7CisJCS8qIENoZWNrIGZvciBhbHRlcm5hdGl2ZSB3YXlzIG9mIGNvbXB1dGluZyBzdW0gZXZlbnRzICovCisJCS8qIFBNQ1NFTCAweDMyIGNvdW50ZXIgTiA9PSBQTUNTRUwgMHgzNCBjb3VudGVyIDUtTiAqLworCQlwc2VsID0gZXZlbnQgJiAoUE1fUE1DU0VMX01TSyAmIH4xKTsJLyogaWdub3JlIGVkZ2UgYml0ICovCisJCXBtYyA9IChldmVudCA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwkJaWYgKHBtYyAmJiAocHNlbCA9PSAweDMyIHx8IHBzZWwgPT0gMHgzNCkpCisJCQlhbHRbbmFsdCsrXSA9ICgoZXZlbnQgXiAweDYpICYgflBNX1BNQ19NU0tTKSB8CisJCQkJKCg1IC0gcG1jKSA8PCBQTV9QTUNfU0gpOworCisJCS8qIFBNQ1NFTCAweDM4IGNvdW50ZXIgTiA9PSBQTUNTRUwgMHgzYSBjb3VudGVyIE4rLy0yICovCisJCWlmIChwbWMgJiYgKHBzZWwgPT0gMHgzOCB8fCBwc2VsID09IDB4M2EpKQorCQkJYWx0W25hbHQrK10gPSAoKGV2ZW50IF4gMHgyKSAmIH5QTV9QTUNfTVNLUykgfAorCQkJCSgocG1jID4gMj8gcG1jIC0gMjogcG1jICsgMikgPDwgUE1fUE1DX1NIKTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBQUE1VX09OTFlfQ09VTlRfUlVOKSB7CisJCS8qCisJCSAqIFdlJ3JlIG9ubHkgY291bnRpbmcgaW4gUlVOIHN0YXRlLAorCQkgKiBzbyBQTV9DWUMgaXMgZXF1aXZhbGVudCB0byBQTV9SVU5fQ1lDLAorCQkgKiBQTV9JTlNUX0NNUEwgPT09IFBNX1JVTl9JTlNUX0NNUEwsIFBNX1BVUlIgPT09IFBNX1JVTl9QVVJSLgorCQkgKiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSBhbHRlcm5hdGl2ZXMgdGhhdCBkb24ndCBwcm92aWRlCisJCSAqIGFueSBleHRyYSBmbGV4aWJpbGl0eSBpbiBhc3NpZ25pbmcgUE1DcyAoZS5nLgorCQkgKiAweDEwMDAwYSBmb3IgUE1fUlVOX0NZQyB2cy4gMHgxZSBmb3IgUE1fQ1lDKS4KKwkJICogTm90ZSB0aGF0IGV2ZW4gd2l0aCB0aGVzZSBhZGRpdGlvbmFsIGFsdGVybmF0aXZlcworCQkgKiB3ZSBuZXZlciBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gNCBhbHRlcm5hdGl2ZXMgZm9yIGFueSBldmVudC4KKwkJICovCisJCWogPSBuYWx0OworCQlmb3IgKGkgPSAwOyBpIDwgbmFsdDsgKytpKSB7CisJCQlzd2l0Y2ggKGFsdFtpXSkgeworCQkJY2FzZSAweDFlOgkvKiBQTV9DWUMgKi8KKwkJCQlhbHRbaisrXSA9IDB4NjAwMDA1OwkvKiBQTV9SVU5fQ1lDICovCisJCQkJKytubGltOworCQkJCWJyZWFrOworCQkJY2FzZSAweDEwMDAwYToJLyogUE1fUlVOX0NZQyAqLworCQkJCWFsdFtqKytdID0gMHgxZTsJLyogUE1fQ1lDICovCisJCQkJYnJlYWs7CisJCQljYXNlIDI6CQkvKiBQTV9JTlNUX0NNUEwgKi8KKwkJCQlhbHRbaisrXSA9IDB4NTAwMDA5OwkvKiBQTV9SVU5fSU5TVF9DTVBMICovCisJCQkJKytubGltOworCQkJCWJyZWFrOworCQkJY2FzZSAweDUwMDAwOToJLyogUE1fUlVOX0lOU1RfQ01QTCAqLworCQkJCWFsdFtqKytdID0gMjsJCS8qIFBNX0lOU1RfQ01QTCAqLworCQkJCWJyZWFrOworCQkJY2FzZSAweDEwMDAwZToJLyogUE1fUFVSUiAqLworCQkJCWFsdFtqKytdID0gMHg0MDAwZjQ7CS8qIFBNX1JVTl9QVVJSICovCisJCQkJYnJlYWs7CisJCQljYXNlIDB4NDAwMGY0OgkvKiBQTV9SVU5fUFVSUiAqLworCQkJCWFsdFtqKytdID0gMHgxMDAwMGU7CS8qIFBNX1BVUlIgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQluYWx0ID0gajsKKwl9CisKKwlpZiAoIShmbGFncyAmIFBQTVVfTElNSVRFRF9QTUNfT0spICYmIG5saW0pIHsKKwkJLyogcmVtb3ZlIHRoZSBsaW1pdGVkIFBNQyBldmVudHMgKi8KKwkJaiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBuYWx0OyArK2kpIHsKKwkJCWlmICghcDZfbGltaXRlZF9wbWNfZXZlbnQoYWx0W2ldKSkgeworCQkJCWFsdFtqXSA9IGFsdFtpXTsKKwkJCQkrK2o7CisJCQl9CisJCX0KKwkJbmFsdCA9IGo7CisJfSBlbHNlIGlmICgoZmxhZ3MgJiBQUE1VX0xJTUlURURfUE1DX1JFUUQpICYmIG5saW0gPCBuYWx0KSB7CisJCS8qIHJlbW92ZSBhbGwgYnV0IHRoZSBsaW1pdGVkIFBNQyBldmVudHMgKi8KKwkJaiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBuYWx0OyArK2kpIHsKKwkJCWlmIChwNl9saW1pdGVkX3BtY19ldmVudChhbHRbaV0pKSB7CisJCQkJYWx0W2pdID0gYWx0W2ldOworCQkJCSsrajsKKwkJCX0KKwkJfQorCQluYWx0ID0gajsKKwl9CisKKwlyZXR1cm4gbmFsdDsKK30KKworc3RhdGljIHZvaWQgcDZfZGlzYWJsZV9wbWModW5zaWduZWQgaW50IHBtYywgdTY0IG1tY3JbXSkKK3sKKwkvKiBTZXQgUE1DeFNFTCB0byAwIHRvIGRpc2FibGUgUE1DeCAqLworCWlmIChwbWMgPD0gMykKKwkJbW1jclsxXSAmPSB+KDB4ZmZVTCA8PCBNTUNSMV9QTUNTRUxfU0gocG1jKSk7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI2X2dlbmVyaWNfZXZlbnRzW10gPSB7CisJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10JCT0gMHgxZSwKKwlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdCQk9IDIsCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JPSAweDI4MDAzMCwgLyogTERfUkVGX0wxICovCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSAweDMwMDAwYywgLyogTERfTUlTU19MMSAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCT0gMHg0MTBhMCwgIC8qIEJSX1BSRUQgKi8KKwlbUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTXQkJPSAweDQwMDA1MiwgLyogQlJfTVBSRUQgKi8KK307CisKKyNkZWZpbmUgQyh4KQlQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjeAorCisvKgorICogVGFibGUgb2YgZ2VuZXJhbGl6ZWQgY2FjaGUtcmVsYXRlZCBldmVudHMuCisgKiAwIG1lYW5zIG5vdCBzdXBwb3J0ZWQsIC0xIG1lYW5zIG5vbnNlbnNpY2FsLCBvdGhlciB2YWx1ZXMKKyAqIGFyZSBldmVudCBjb2Rlcy4KKyAqIFRoZSAiRFRMQiIgYW5kICJJVExCIiBldmVudHMgcmVsYXRlIHRvIHRoZSBERVJBVCBhbmQgSUVSQVQuCisgKi8KK3N0YXRpYyBpbnQgcG93ZXI2X2NhY2hlX2V2ZW50c1tDKE1BWCldW0MoT1BfTUFYKV1bQyhSRVNVTFRfTUFYKV0gPSB7CisJW0MoTDFEKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4ODAwODIsCTB4ODAwODAJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTB4ODAwODYsCTB4ODAwODgJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4ODEwYTQsCTAJCX0sCisJfSwKKwlbQyhMMUkpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4MTAwMDU2IAl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweDQwMDhjLAkwCQl9LAorCX0sCisJW0MoTEwpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHgxNTA3MzAsCTB4MjUwNTMyCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTB4MjUwNDMyLAkweDE1MDQzMgl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweDgxMGE2LAkwCQl9LAorCX0sCisJW0MoRFRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHgyMDAwMGUJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKKwl9LAorCVtDKElUTEIpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4NDIwY2UJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJCX0sCisJfSwKKwlbQyhCUFUpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHg0MzBlNiwJMHg0MDAwNTIJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKKwl9LAorfTsKKworc3RydWN0IHBvd2VyX3BtdSBwb3dlcjZfcG11ID0geworCS5uX2NvdW50ZXIgPSA2LAorCS5tYXhfYWx0ZXJuYXRpdmVzID0gTUFYX0FMVCwKKwkuYWRkX2ZpZWxkcyA9IDB4MTU1NSwKKwkudGVzdF9hZGRlciA9IDB4MzAwMCwKKwkuY29tcHV0ZV9tbWNyID0gcDZfY29tcHV0ZV9tbWNyLAorCS5nZXRfY29uc3RyYWludCA9IHA2X2dldF9jb25zdHJhaW50LAorCS5nZXRfYWx0ZXJuYXRpdmVzID0gcDZfZ2V0X2FsdGVybmF0aXZlcywKKwkuZGlzYWJsZV9wbWMgPSBwNl9kaXNhYmxlX3BtYywKKwkubGltaXRlZF9wbWNfZXZlbnQgPSBwNl9saW1pdGVkX3BtY19ldmVudCwKKwkuZmxhZ3MgPSBQUE1VX0xJTUlURURfUE1DNV82IHwgUFBNVV9BTFRfU0lQUiwKKwkubl9nZW5lcmljID0gQVJSQVlfU0laRShwb3dlcjZfZ2VuZXJpY19ldmVudHMpLAorCS5nZW5lcmljX2V2ZW50cyA9IHBvd2VyNl9nZW5lcmljX2V2ZW50cywKKwkuY2FjaGVfZXZlbnRzID0gJnBvd2VyNl9jYWNoZV9ldmVudHMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjctcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNy1wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Y3ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjctcG11LmMKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiBQZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQgZm9yIFBPV0VSNyBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAyMDA5IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKworLyoKKyAqIEJpdHMgaW4gZXZlbnQgY29kZSBmb3IgUE9XRVI3CisgKi8KKyNkZWZpbmUgUE1fUE1DX1NICTE2CS8qIFBNQyBudW1iZXIgKDEtYmFzZWQpIGZvciBkaXJlY3QgZXZlbnRzICovCisjZGVmaW5lIFBNX1BNQ19NU0sJMHhmCisjZGVmaW5lIFBNX1BNQ19NU0tTCShQTV9QTUNfTVNLIDw8IFBNX1BNQ19TSCkKKyNkZWZpbmUgUE1fVU5JVF9TSAkxMgkvKiBUVE1NVVggbnVtYmVyIGFuZCBzZXR0aW5nIC0gdW5pdCBzZWxlY3QgKi8KKyNkZWZpbmUgUE1fVU5JVF9NU0sJMHhmCisjZGVmaW5lIFBNX0NPTUJJTkVfU0gJMTEJLyogQ29tYmluZWQgZXZlbnQgYml0ICovCisjZGVmaW5lIFBNX0NPTUJJTkVfTVNLCTEKKyNkZWZpbmUgUE1fQ09NQklORV9NU0tTCTB4ODAwCisjZGVmaW5lIFBNX0wyU0VMX1NICTgJLyogTDIgZXZlbnQgc2VsZWN0ICovCisjZGVmaW5lIFBNX0wyU0VMX01TSwk3CisjZGVmaW5lIFBNX1BNQ1NFTF9NU0sJMHhmZgorCisvKgorICogQml0cyBpbiBNTUNSMSBmb3IgUE9XRVI3CisgKi8KKyNkZWZpbmUgTU1DUjFfVFRNMFNFTF9TSAk2MAorI2RlZmluZSBNTUNSMV9UVE0xU0VMX1NICTU2CisjZGVmaW5lIE1NQ1IxX1RUTTJTRUxfU0gJNTIKKyNkZWZpbmUgTU1DUjFfVFRNM1NFTF9TSAk0OAorI2RlZmluZSBNTUNSMV9UVE1TRUxfTVNLCTB4ZgorI2RlZmluZSBNTUNSMV9MMlNFTF9TSAkJNDUKKyNkZWZpbmUgTU1DUjFfTDJTRUxfTVNLCQk3CisjZGVmaW5lIE1NQ1IxX1BNQzFfQ09NQklORV9TSAkzNQorI2RlZmluZSBNTUNSMV9QTUMyX0NPTUJJTkVfU0gJMzQKKyNkZWZpbmUgTU1DUjFfUE1DM19DT01CSU5FX1NICTMzCisjZGVmaW5lIE1NQ1IxX1BNQzRfQ09NQklORV9TSAkzMgorI2RlZmluZSBNTUNSMV9QTUMxU0VMX1NICTI0CisjZGVmaW5lIE1NQ1IxX1BNQzJTRUxfU0gJMTYKKyNkZWZpbmUgTU1DUjFfUE1DM1NFTF9TSAk4CisjZGVmaW5lIE1NQ1IxX1BNQzRTRUxfU0gJMAorI2RlZmluZSBNTUNSMV9QTUNTRUxfU0gobikJKE1NQ1IxX1BNQzFTRUxfU0ggLSAobikgKiA4KQorI2RlZmluZSBNTUNSMV9QTUNTRUxfTVNLCTB4ZmYKKworLyoKKyAqIEJpdHMgaW4gTU1DUkEKKyAqLworCisvKgorICogTGF5b3V0IG9mIGNvbnN0cmFpbnQgYml0czoKKyAqIDY2NjY1NTU1NTU1NTU1NDQ0NDQ0NDQ0NDMzMzMzMzMzMzMyMjIyMjIyMjIyMTExMTExMTExMTAwMDAwMDAwMDAKKyAqIDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgID48Pjw+PD48Pjw+PD4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQyBQNlA1UDRQM1AyUDEKKyAqCisgKiBOQyAtIG51bWJlciBvZiBjb3VudGVycworICogICAgIDE1OiBOQyBlcnJvciAweDgwMDAKKyAqICAgICAxMi0xNDogbnVtYmVyIG9mIGV2ZW50cyBuZWVkaW5nIFBNQzEtNCAweDcwMDAKKyAqCisgKiBQNgorICogICAgIDExOiBQNiBlcnJvciAweDgwMAorICogICAgIDEwLTExOiBDb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUM2CisgKgorICogUDEuLlA1CisgKiAgICAgMC05OiBDb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUMxLi5QTUM1CisgKi8KKworc3RhdGljIGludCBwb3dlcjdfZ2V0X2NvbnN0cmFpbnQodTY0IGV2ZW50LCB1NjQgKm1hc2twLCB1NjQgKnZhbHApCit7CisJaW50IHBtYywgc2g7CisJdTY0IG1hc2sgPSAwLCB2YWx1ZSA9IDA7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJaWYgKHBtYykgeworCQlpZiAocG1jID4gNikKKwkJCXJldHVybiAtMTsKKwkJc2ggPSAocG1jIC0gMSkgKiAyOworCQltYXNrIHw9IDIgPDwgc2g7CisJCXZhbHVlIHw9IDEgPDwgc2g7CisJCWlmIChwbWMgPj0gNSAmJiAhKGV2ZW50ID09IDB4NTAwZmEgfHwgZXZlbnQgPT0gMHg2MDBmNCkpCisJCQlyZXR1cm4gLTE7CisJfQorCWlmIChwbWMgPCA1KSB7CisJCS8qIG5lZWQgYSBjb3VudGVyIGZyb20gUE1DMS00IHNldCAqLworCQltYXNrICB8PSAweDgwMDA7CisJCXZhbHVlIHw9IDB4MTAwMDsKKwl9CisJKm1hc2twID0gbWFzazsKKwkqdmFscCA9IHZhbHVlOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1BWF9BTFQJMgkvKiBhdCBtb3N0IDIgYWx0ZXJuYXRpdmVzIGZvciBhbnkgZXZlbnQgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldmVudF9hbHRlcm5hdGl2ZXNbXVtNQVhfQUxUXSA9IHsKKwl7IDB4MjAwZjIsIDB4MzAwZjIgfSwJCS8qIFBNX0lOU1RfRElTUCAqLworCXsgMHgyMDBmNCwgMHg2MDBmNCB9LAkJLyogUE1fUlVOX0NZQyAqLworCXsgMHg0MDBmYSwgMHg1MDBmYSB9LAkJLyogUE1fUlVOX0lOU1RfQ01QTCAqLworfTsKKworLyoKKyAqIFNjYW4gdGhlIGFsdGVybmF0aXZlcyB0YWJsZSBmb3IgYSBtYXRjaCBhbmQgcmV0dXJuIHRoZQorICogaW5kZXggaW50byB0aGUgYWx0ZXJuYXRpdmVzIHRhYmxlIGlmIGZvdW5kLCBlbHNlIC0xLgorICovCitzdGF0aWMgaW50IGZpbmRfYWx0ZXJuYXRpdmUodTY0IGV2ZW50KQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZlbnRfYWx0ZXJuYXRpdmVzKTsgKytpKSB7CisJCWlmIChldmVudCA8IGV2ZW50X2FsdGVybmF0aXZlc1tpXVswXSkKKwkJCWJyZWFrOworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0FMVCAmJiBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal07ICsraikKKwkJCWlmIChldmVudCA9PSBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal0pCisJCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIHM2NCBmaW5kX2FsdGVybmF0aXZlX2RlY29kZSh1NjQgZXZlbnQpCit7CisJaW50IHBtYywgcHNlbDsKKworCS8qIHRoaXMgb25seSBoYW5kbGVzIHRoZSA0eCBkZWNvZGUgZXZlbnRzICovCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCXBzZWwgPSBldmVudCAmIFBNX1BNQ1NFTF9NU0s7CisJaWYgKChwbWMgPT0gMiB8fCBwbWMgPT0gNCkgJiYgKHBzZWwgJiB+NykgPT0gMHg0MCkKKwkJcmV0dXJuIGV2ZW50IC0gKDEgPDwgUE1fUE1DX1NIKSArIDg7CisJaWYgKChwbWMgPT0gMSB8fCBwbWMgPT0gMykgJiYgKHBzZWwgJiB+NykgPT0gMHg0OCkKKwkJcmV0dXJuIGV2ZW50ICsgKDEgPDwgUE1fUE1DX1NIKSAtIDg7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHBvd2VyN19nZXRfYWx0ZXJuYXRpdmVzKHU2NCBldmVudCwgdW5zaWduZWQgaW50IGZsYWdzLCB1NjQgYWx0W10pCit7CisJaW50IGksIGosIG5hbHQgPSAxOworCXM2NCBhZTsKKworCWFsdFswXSA9IGV2ZW50OworCW5hbHQgPSAxOworCWkgPSBmaW5kX2FsdGVybmF0aXZlKGV2ZW50KTsKKwlpZiAoaSA+PSAwKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxUOyArK2opIHsKKwkJCWFlID0gZXZlbnRfYWx0ZXJuYXRpdmVzW2ldW2pdOworCQkJaWYgKGFlICYmIGFlICE9IGV2ZW50KQorCQkJCWFsdFtuYWx0KytdID0gYWU7CisJCX0KKwl9IGVsc2UgeworCQlhZSA9IGZpbmRfYWx0ZXJuYXRpdmVfZGVjb2RlKGV2ZW50KTsKKwkJaWYgKGFlID4gMCkKKwkJCWFsdFtuYWx0KytdID0gYWU7CisJfQorCisJaWYgKGZsYWdzICYgUFBNVV9PTkxZX0NPVU5UX1JVTikgeworCQkvKgorCQkgKiBXZSdyZSBvbmx5IGNvdW50aW5nIGluIFJVTiBzdGF0ZSwKKwkJICogc28gUE1fQ1lDIGlzIGVxdWl2YWxlbnQgdG8gUE1fUlVOX0NZQworCQkgKiBhbmQgUE1fSU5TVF9DTVBMID09PSBQTV9SVU5fSU5TVF9DTVBMLgorCQkgKiBUaGlzIGRvZXNuJ3QgaW5jbHVkZSBhbHRlcm5hdGl2ZXMgdGhhdCBkb24ndCBwcm92aWRlCisJCSAqIGFueSBleHRyYSBmbGV4aWJpbGl0eSBpbiBhc3NpZ25pbmcgUE1Dcy4KKwkJICovCisJCWogPSBuYWx0OworCQlmb3IgKGkgPSAwOyBpIDwgbmFsdDsgKytpKSB7CisJCQlzd2l0Y2ggKGFsdFtpXSkgeworCQkJY2FzZSAweDFlOgkvKiBQTV9DWUMgKi8KKwkJCQlhbHRbaisrXSA9IDB4NjAwZjQ7CS8qIFBNX1JVTl9DWUMgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMHg2MDBmNDoJLyogUE1fUlVOX0NZQyAqLworCQkJCWFsdFtqKytdID0gMHgxZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgyOgkvKiBQTV9QUENfQ01QTCAqLworCQkJCWFsdFtqKytdID0gMHg1MDBmYTsJLyogUE1fUlVOX0lOU1RfQ01QTCAqLworCQkJCWJyZWFrOworCQkJY2FzZSAweDUwMGZhOgkvKiBQTV9SVU5fSU5TVF9DTVBMICovCisJCQkJYWx0W2orK10gPSAweDI7CS8qIFBNX1BQQ19DTVBMICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbmFsdCA9IGo7CisJfQorCisJcmV0dXJuIG5hbHQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgZXZlbnQgY291bnRzIHRoaW5ncyByZWxhdGluZyB0byBtYXJrZWQgaW5zdHJ1Y3Rpb25zCisgKiBhbmQgdGh1cyBuZWVkcyB0aGUgTU1DUkFfU0FNUExFX0VOQUJMRSBiaXQgc2V0LCBvciAwIGlmIG5vdC4KKyAqLworc3RhdGljIGludCBwb3dlcjdfbWFya2VkX2luc3RyX2V2ZW50KHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBwc2VsOworCWludCB1bml0OworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCXVuaXQgPSAoZXZlbnQgPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwlwc2VsID0gZXZlbnQgJiBQTV9QTUNTRUxfTVNLICYgfjE7CS8qIHRyaW0gb2ZmIGVkZ2UvbGV2ZWwgYml0ICovCisJaWYgKHBtYyA+PSA1KQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAocHNlbCA+PiA0KSB7CisJY2FzZSAyOgorCQlyZXR1cm4gcG1jID09IDIgfHwgcG1jID09IDQ7CisJY2FzZSAzOgorCQlpZiAocHNlbCA9PSAweDNjKQorCQkJcmV0dXJuIHBtYyA9PSAxOworCQlpZiAocHNlbCA9PSAweDNlKQorCQkJcmV0dXJuIHBtYyAhPSAyOworCQlyZXR1cm4gMTsKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlyZXR1cm4gdW5pdCA9PSAweGQ7CisJY2FzZSA2OgorCQlpZiAocHNlbCA9PSAweDY0KQorCQkJcmV0dXJuIHBtYyA+PSAzOworCWNhc2UgODoKKwkJcmV0dXJuIHVuaXQgPT0gMHhkOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3dlcjdfY29tcHV0ZV9tbWNyKHU2NCBldmVudFtdLCBpbnQgbl9ldiwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgaHdjW10sIHU2NCBtbWNyW10pCit7CisJdTY0IG1tY3IxID0gMDsKKwl1NjQgbW1jcmEgPSAwOworCXVuc2lnbmVkIGludCBwbWMsIHVuaXQsIGNvbWJpbmUsIGwyc2VsLCBwc2VsOworCXVuc2lnbmVkIGludCBwbWNfaW51c2UgPSAwOworCWludCBpOworCisJLyogRmlyc3QgcGFzcyB0byBjb3VudCByZXNvdXJjZSB1c2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbl9ldjsgKytpKSB7CisJCXBtYyA9IChldmVudFtpXSA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwkJaWYgKHBtYykgeworCQkJaWYgKHBtYyA+IDYpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKHBtY19pbnVzZSAmICgxIDw8IChwbWMgLSAxKSkpCisJCQkJcmV0dXJuIC0xOworCQkJcG1jX2ludXNlIHw9IDEgPDwgKHBtYyAtIDEpOworCQl9CisJfQorCisJLyogU2Vjb25kIHBhc3M6IGFzc2lnbiBQTUNzLCBzZXQgYWxsIE1NQ1IxIGZpZWxkcyAqLworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJcG1jID0gKGV2ZW50W2ldID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQl1bml0ID0gKGV2ZW50W2ldID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJCWNvbWJpbmUgPSAoZXZlbnRbaV0gPj4gUE1fQ09NQklORV9TSCkgJiBQTV9DT01CSU5FX01TSzsKKwkJbDJzZWwgPSAoZXZlbnRbaV0gPj4gUE1fTDJTRUxfU0gpICYgUE1fTDJTRUxfTVNLOworCQlwc2VsID0gZXZlbnRbaV0gJiBQTV9QTUNTRUxfTVNLOworCQlpZiAoIXBtYykgeworCQkJLyogQnVzIGV2ZW50IG9yIGFueS1QTUMgZGlyZWN0IGV2ZW50ICovCisJCQlmb3IgKHBtYyA9IDA7IHBtYyA8IDQ7ICsrcG1jKSB7CisJCQkJaWYgKCEocG1jX2ludXNlICYgKDEgPDwgcG1jKSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBtYyA+PSA0KQorCQkJCXJldHVybiAtMTsKKwkJCXBtY19pbnVzZSB8PSAxIDw8IHBtYzsKKwkJfSBlbHNlIHsKKwkJCS8qIERpcmVjdCBvciBkZWNvZGVkIGV2ZW50ICovCisJCQktLXBtYzsKKwkJfQorCQlpZiAocG1jIDw9IDMpIHsKKwkJCW1tY3IxIHw9ICh1NjQpIHVuaXQgPDwgKE1NQ1IxX1RUTTBTRUxfU0ggLSA0ICogcG1jKTsKKwkJCW1tY3IxIHw9ICh1NjQpIGNvbWJpbmUgPDwgKE1NQ1IxX1BNQzFfQ09NQklORV9TSCAtIHBtYyk7CisJCQltbWNyMSB8PSBwc2VsIDw8IE1NQ1IxX1BNQ1NFTF9TSChwbWMpOworCQkJaWYgKHVuaXQgPT0gNikJLyogTDIgZXZlbnRzICovCisJCQkJbW1jcjEgfD0gKHU2NCkgbDJzZWwgPDwgTU1DUjFfTDJTRUxfU0g7CisJCX0KKwkJaWYgKHBvd2VyN19tYXJrZWRfaW5zdHJfZXZlbnQoZXZlbnRbaV0pKQorCQkJbW1jcmEgfD0gTU1DUkFfU0FNUExFX0VOQUJMRTsKKwkJaHdjW2ldID0gcG1jOworCX0KKworCS8qIFJldHVybiBNTUNSeCB2YWx1ZXMgKi8KKwltbWNyWzBdID0gMDsKKwlpZiAocG1jX2ludXNlICYgMSkKKwkJbW1jclswXSA9IE1NQ1IwX1BNQzFDRTsKKwlpZiAocG1jX2ludXNlICYgMHgzZSkKKwkJbW1jclswXSB8PSBNTUNSMF9QTUNqQ0U7CisJbW1jclsxXSA9IG1tY3IxOworCW1tY3JbMl0gPSBtbWNyYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG93ZXI3X2Rpc2FibGVfcG1jKHVuc2lnbmVkIGludCBwbWMsIHU2NCBtbWNyW10pCit7CisJaWYgKHBtYyA8PSAzKQorCQltbWNyWzFdICY9IH4oMHhmZlVMTCA8PCBNTUNSMV9QTUNTRUxfU0gocG1jKSk7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI3X2dlbmVyaWNfZXZlbnRzW10gPSB7CisJW1BFUkZfQ09VTlRfQ1BVX0NZQ0xFU10gPSAweDFlLAorCVtQRVJGX0NPVU5UX0lOU1RSVUNUSU9OU10gPSAyLAorCVtQRVJGX0NPVU5UX0NBQ0hFX1JFRkVSRU5DRVNdID0gMHhjODgwLAkJLyogTERfUkVGX0wxX0xTVSAqLworCVtQRVJGX0NPVU5UX0NBQ0hFX01JU1NFU10gPSAweDQwMGYwLAkJLyogTERfTUlTU19MMSAqLworCVtQRVJGX0NPVU5UX0JSQU5DSF9JTlNUUlVDVElPTlNdID0gMHgxMDA2OCwJLyogQlJVX0ZJTiAqLworCVtQRVJGX0NPVU5UX0JSQU5DSF9NSVNTRVNdID0gMHg0MDBmNiwJCS8qIEJSX01QUkVEICovCit9OworCisjZGVmaW5lIEMoeCkJUEVSRl9DT1VOVF9IV19DQUNIRV8jI3gKKworLyoKKyAqIFRhYmxlIG9mIGdlbmVyYWxpemVkIGNhY2hlLXJlbGF0ZWQgZXZlbnRzLgorICogMCBtZWFucyBub3Qgc3VwcG9ydGVkLCAtMSBtZWFucyBub25zZW5zaWNhbCwgb3RoZXIgdmFsdWVzCisgKiBhcmUgZXZlbnQgY29kZXMuCisgKi8KK3N0YXRpYyBpbnQgcG93ZXI3X2NhY2hlX2V2ZW50c1tDKE1BWCldW0MoT1BfTUFYKV1bQyhSRVNVTFRfTUFYKV0gPSB7CisJW0MoTDFEKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4NDAwZjAsCTB4Yzg4MAl9LAorCQlbQyhPUF9XUklURSldID0gewkwLAkJMHgzMDBmMAl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweGQ4YjgsCQkwCX0sCisJfSwKKwlbQyhMMUkpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4MjAwZmMJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweDQwOGEsCQkwCX0sCisJfSwKKwlbQyhMTCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDYwODAsCQkweDYwODQJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJMHg2MDgyLAkJMHg2MDg2CX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTAsCQkwCX0sCisJfSwKKwlbQyhEVExCKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTAsCQkweDMwMGZjCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAorCX0sCisJW0MoSVRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHg0MDBmYwl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKKwl9LAorCVtDKEJQVSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDEwMDY4LAkweDQwMGY2CX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAorCX0sCit9OworCitzdHJ1Y3QgcG93ZXJfcG11IHBvd2VyN19wbXUgPSB7CisJLm5fY291bnRlciA9IDYsCisJLm1heF9hbHRlcm5hdGl2ZXMgPSBNQVhfQUxUICsgMSwKKwkuYWRkX2ZpZWxkcyA9IDB4MTU1NXVsbCwKKwkudGVzdF9hZGRlciA9IDB4MzAwMHVsbCwKKwkuY29tcHV0ZV9tbWNyID0gcG93ZXI3X2NvbXB1dGVfbW1jciwKKwkuZ2V0X2NvbnN0cmFpbnQgPSBwb3dlcjdfZ2V0X2NvbnN0cmFpbnQsCisJLmdldF9hbHRlcm5hdGl2ZXMgPSBwb3dlcjdfZ2V0X2FsdGVybmF0aXZlcywKKwkuZGlzYWJsZV9wbWMgPSBwb3dlcjdfZGlzYWJsZV9wbWMsCisJLm5fZ2VuZXJpYyA9IEFSUkFZX1NJWkUocG93ZXI3X2dlbmVyaWNfZXZlbnRzKSwKKwkuZ2VuZXJpY19ldmVudHMgPSBwb3dlcjdfZ2VuZXJpY19ldmVudHMsCisJLmNhY2hlX2V2ZW50cyA9ICZwb3dlcjdfY2FjaGVfZXZlbnRzLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjOTcwLXBtdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGM5NzAtcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwYTM1NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHBjOTcwLXBtdS5jCkBAIC0wLDAgKzEsNDgyIEBACisvKgorICogUGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IGZvciBQUEM5NzAtZmFtaWx5IHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IDIwMDgtMjAwOSBQYXVsIE1hY2tlcnJhcywgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KKyNpbmNsdWRlIDxhc20vcmVnLmg+CisKKy8qCisgKiBCaXRzIGluIGV2ZW50IGNvZGUgZm9yIFBQQzk3MAorICovCisjZGVmaW5lIFBNX1BNQ19TSAkxMgkvKiBQTUMgbnVtYmVyICgxLWJhc2VkKSBmb3IgZGlyZWN0IGV2ZW50cyAqLworI2RlZmluZSBQTV9QTUNfTVNLCTB4ZgorI2RlZmluZSBQTV9VTklUX1NICTgJLyogVFRNTVVYIG51bWJlciBhbmQgc2V0dGluZyAtIHVuaXQgc2VsZWN0ICovCisjZGVmaW5lIFBNX1VOSVRfTVNLCTB4ZgorI2RlZmluZSBQTV9TUENTRUxfU0gJNgorI2RlZmluZSBQTV9TUENTRUxfTVNLCTMKKyNkZWZpbmUgUE1fQllURV9TSAk0CS8qIEJ5dGUgbnVtYmVyIG9mIGV2ZW50IGJ1cyB0byB1c2UgKi8KKyNkZWZpbmUgUE1fQllURV9NU0sJMworI2RlZmluZSBQTV9QTUNTRUxfTVNLCTB4ZgorCisvKiBWYWx1ZXMgaW4gUE1fVU5JVCBmaWVsZCAqLworI2RlZmluZSBQTV9OT05FCQkwCisjZGVmaW5lIFBNX0ZQVQkJMQorI2RlZmluZSBQTV9WUFUJCTIKKyNkZWZpbmUgUE1fSVNVCQkzCisjZGVmaW5lIFBNX0lGVQkJNAorI2RlZmluZSBQTV9JRFUJCTUKKyNkZWZpbmUgUE1fU1RTCQk2CisjZGVmaW5lIFBNX0xTVTAJCTcKKyNkZWZpbmUgUE1fTFNVMVUJOAorI2RlZmluZSBQTV9MU1UxTAk5CisjZGVmaW5lIFBNX0xBU1RVTklUCTkKKworLyoKKyAqIEJpdHMgaW4gTU1DUjAgZm9yIFBQQzk3MAorICovCisjZGVmaW5lIE1NQ1IwX1BNQzFTRUxfU0gJOAorI2RlZmluZSBNTUNSMF9QTUMyU0VMX1NICTEKKyNkZWZpbmUgTU1DUl9QTUNTRUxfTVNLCQkweDFmCisKKy8qCisgKiBCaXRzIGluIE1NQ1IxIGZvciBQUEM5NzAKKyAqLworI2RlZmluZSBNTUNSMV9UVE0wU0VMX1NICTYyCisjZGVmaW5lIE1NQ1IxX1RUTTFTRUxfU0gJNTkKKyNkZWZpbmUgTU1DUjFfVFRNM1NFTF9TSAk1MworI2RlZmluZSBNTUNSMV9UVE1TRUxfTVNLCTMKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHMFNFTF9TSAk1MAorI2RlZmluZSBNTUNSMV9URF9DUF9EQkcxU0VMX1NICTQ4CisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzJTRUxfU0gJNDYKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHM1NFTF9TSAk0NAorI2RlZmluZSBNTUNSMV9QTUMxX0FEREVSX1NFTF9TSAkzOQorI2RlZmluZSBNTUNSMV9QTUMyX0FEREVSX1NFTF9TSAkzOAorI2RlZmluZSBNTUNSMV9QTUM2X0FEREVSX1NFTF9TSAkzNworI2RlZmluZSBNTUNSMV9QTUM1X0FEREVSX1NFTF9TSAkzNgorI2RlZmluZSBNTUNSMV9QTUM4X0FEREVSX1NFTF9TSAkzNQorI2RlZmluZSBNTUNSMV9QTUM3X0FEREVSX1NFTF9TSAkzNAorI2RlZmluZSBNTUNSMV9QTUMzX0FEREVSX1NFTF9TSAkzMworI2RlZmluZSBNTUNSMV9QTUM0X0FEREVSX1NFTF9TSAkzMgorI2RlZmluZSBNTUNSMV9QTUMzU0VMX1NICTI3CisjZGVmaW5lIE1NQ1IxX1BNQzRTRUxfU0gJMjIKKyNkZWZpbmUgTU1DUjFfUE1DNVNFTF9TSAkxNworI2RlZmluZSBNTUNSMV9QTUM2U0VMX1NICTEyCisjZGVmaW5lIE1NQ1IxX1BNQzdTRUxfU0gJNworI2RlZmluZSBNTUNSMV9QTUM4U0VMX1NICTIKKworc3RhdGljIHNob3J0IG1tY3IxX2FkZGVyX2JpdHNbOF0gPSB7CisJTU1DUjFfUE1DMV9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DMl9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DM19BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DNF9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DNV9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DNl9BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DN19BRERFUl9TRUxfU0gsCisJTU1DUjFfUE1DOF9BRERFUl9TRUxfU0gKK307CisKKy8qCisgKiBCaXRzIGluIE1NQ1JBCisgKi8KKworLyoKKyAqIExheW91dCBvZiBjb25zdHJhaW50IGJpdHM6CisgKiA2NjY2NTU1NTU1NTU1NTQ0NDQ0NDQ0NDQzMzMzMzMzMzMzMjIyMjIyMjIyMjExMTExMTExMTEwMDAwMDAwMDAwCisgKiAzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwCisgKiAgICAgICAgICAgICAgIDw+PD48PlsgID5bICA+WyAgPjwgID48ICA+PCAgPjwgID48Pjw+PD48Pjw+PD48Pjw+CisgKiAgICAgICAgICAgICAgIFNQVDBUMSBVQyAgUFMxIFBTMiBCMCAgQjEgIEIyICBCMyBQMVAyUDNQNFA1UDZQN1A4CisgKgorICogU1AgLSBTUENTRUwgY29uc3RyYWludAorICogICAgIDQ4LTQ5OiBTUENTRUwgdmFsdWUgMHgzXzAwMDBfMDAwMF8wMDAwCisgKgorICogVDAgLSBUVE0wIGNvbnN0cmFpbnQKKyAqICAgICA0Ni00NzogVFRNMFNFTCB2YWx1ZSAoMD1GUFUsIDI9SUZVLCAzPVZQVSkgMHhDMDAwXzAwMDBfMDAwMAorICoKKyAqIFQxIC0gVFRNMSBjb25zdHJhaW50CisgKiAgICAgNDQtNDU6IFRUTTFTRUwgdmFsdWUgKDA9SURVLCAzPVNUUykgMHgzMDAwXzAwMDBfMDAwMAorICoKKyAqIFVDIC0gdW5pdCBjb25zdHJhaW50OiBjYW4ndCBoYXZlIGFsbCB0aHJlZSBvZiBGUFV8SUZVfFZQVSwgSVNVLCBJRFV8U1RTCisgKiAgICAgNDM6IFVDMyBlcnJvciAweDA4MDBfMDAwMF8wMDAwCisgKiAgICAgNDI6IEZQVXxJRlV8VlBVIGV2ZW50cyBuZWVkZWQgMHgwNDAwXzAwMDBfMDAwMAorICogICAgIDQxOiBJU1UgZXZlbnRzIG5lZWRlZCAweDAyMDBfMDAwMF8wMDAwCisgKiAgICAgNDA6IElEVXxTVFMgZXZlbnRzIG5lZWRlZCAweDAxMDBfMDAwMF8wMDAwCisgKgorICogUFMxCisgKiAgICAgMzk6IFBTMSBlcnJvciAweDAwODBfMDAwMF8wMDAwCisgKiAgICAgMzYtMzg6IGNvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzEvMi81LzYgMHgwMDcwXzAwMDBfMDAwMAorICoKKyAqIFBTMgorICogICAgIDM1OiBQUzIgZXJyb3IgMHgwMDA4XzAwMDBfMDAwMAorICogICAgIDMyLTM0OiBjb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUMzLzQvNy84IDB4MDAwN18wMDAwXzAwMDAKKyAqCisgKiBCMAorICogICAgIDI4LTMxOiBCeXRlIDAgZXZlbnQgc291cmNlIDB4ZjAwMF8wMDAwCisgKgkgICAgICBFbmNvZGluZyBhcyBmb3IgdGhlIGV2ZW50IGNvZGUKKyAqCisgKiBCMSwgQjIsIEIzCisgKiAgICAgMjQtMjcsIDIwLTIzLCAxNi0xOTogQnl0ZSAxLCAyLCAzIGV2ZW50IHNvdXJjZXMKKyAqCisgKiBQMQorICogICAgIDE1OiBQMSBlcnJvciAweDgwMDAKKyAqICAgICAxNC0xNTogQ291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMQorICoKKyAqIFAyLi5QOAorICogICAgIDAtMTM6IENvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzIuLlBNQzgKKyAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBkaXJlY3RfbWFya2VkX2V2ZW50WzhdID0geworCSgxPDwyKSB8ICgxPDwzKSwJLyogUE1DMTogUE1fTVJLX0dSUF9ESVNQLCBQTV9NUktfU1RfQ01QTCAqLworCSgxPDwzKSB8ICgxPDw1KSwJLyogUE1DMjogUE1fVEhSRVNIX1RJTUVPLCBQTV9NUktfQlJVX0ZJTiAqLworCSgxPDwzKSB8ICgxPDw1KSwJLyogUE1DMzogUE1fTVJLX1NUX0NNUExfSU5ULCBQTV9NUktfVk1YX0ZJTiAqLworCSgxPDw0KSB8ICgxPDw1KSwJLyogUE1DNDogUE1fTVJLX0dSUF9DTVBMLCBQTV9NUktfQ1JVX0ZJTiAqLworCSgxPDw0KSB8ICgxPDw1KSwJLyogUE1DNTogUE1fR1JQX01SSywgUE1fTVJLX0dSUF9USU1FTyAqLworCSgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSwKKwkJLyogUE1DNjogUE1fTVJLX1NUX1NUUywgUE1fTVJLX0ZYVV9GSU4sIFBNX01SS19HUlBfSVNTVUVEICovCisJKDE8PDQpIHwgKDE8PDUpLAkvKiBQTUM3OiBQTV9NUktfRlBVX0ZJTiwgUE1fTVJLX0lOU1RfRklOICovCisJKDE8PDQpCQkJLyogUE1DODogUE1fTVJLX0xTVV9GSU4gKi8KK307CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgZXZlbnQgY291bnRzIHRoaW5ncyByZWxhdGluZyB0byBtYXJrZWQgaW5zdHJ1Y3Rpb25zCisgKiBhbmQgdGh1cyBuZWVkcyB0aGUgTU1DUkFfU0FNUExFX0VOQUJMRSBiaXQgc2V0LCBvciAwIGlmIG5vdC4KKyAqLworc3RhdGljIGludCBwOTcwX21hcmtlZF9pbnN0cl9ldmVudCh1NjQgZXZlbnQpCit7CisJaW50IHBtYywgcHNlbCwgdW5pdCwgYnl0ZSwgYml0OworCXVuc2lnbmVkIGludCBtYXNrOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCXBzZWwgPSBldmVudCAmIFBNX1BNQ1NFTF9NU0s7CisJaWYgKHBtYykgeworCQlpZiAoZGlyZWN0X21hcmtlZF9ldmVudFtwbWMgLSAxXSAmICgxIDw8IHBzZWwpKQorCQkJcmV0dXJuIDE7CisJCWlmIChwc2VsID09IDApCQkvKiBhZGQgZXZlbnRzICovCisJCQliaXQgPSAocG1jIDw9IDQpPyBwbWMgLSAxOiA4IC0gcG1jOworCQllbHNlIGlmIChwc2VsID09IDcgfHwgcHNlbCA9PSAxMykJLyogZGVjb2RlIGV2ZW50cyAqLworCQkJYml0ID0gNDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCWJpdCA9IHBzZWw7CisKKwlieXRlID0gKGV2ZW50ID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJdW5pdCA9IChldmVudCA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCW1hc2sgPSAwOworCXN3aXRjaCAodW5pdCkgeworCWNhc2UgUE1fVlBVOgorCQltYXNrID0gMHg0YzsJCS8qIGJ5dGUgMCBiaXRzIDIsMyw2ICovCisJY2FzZSBQTV9MU1UwOgorCQkvKiBieXRlIDIgYml0cyAwLDIsMyw0LDY7IGFsbCBvZiBieXRlIDEgKi8KKwkJbWFzayA9IDB4MDg1ZGZmMDA7CisJY2FzZSBQTV9MU1UxTDoKKwkJbWFzayA9IDB4NTAgPDwgMjQ7CS8qIGJ5dGUgMyBiaXRzIDQsNiAqLworCQlicmVhazsKKwl9CisJcmV0dXJuIChtYXNrID4+IChieXRlICogOCArIGJpdCkpICYgMTsKK30KKworLyogTWFza3MgYW5kIHZhbHVlcyBmb3IgdXNpbmcgZXZlbnRzIGZyb20gdGhlIHZhcmlvdXMgdW5pdHMgKi8KK3N0YXRpYyB1NjQgdW5pdF9jb25zW1BNX0xBU1RVTklUKzFdWzJdID0geworCVtQTV9GUFVdID0gICB7IDB4YzgwMDAwMDAwMDAwdWxsLCAweDA0MDAwMDAwMDAwMHVsbCB9LAorCVtQTV9WUFVdID0gICB7IDB4YzgwMDAwMDAwMDAwdWxsLCAweGM0MDAwMDAwMDAwMHVsbCB9LAorCVtQTV9JU1VdID0gICB7IDB4MDgwMDAwMDAwMDAwdWxsLCAweDAyMDAwMDAwMDAwMHVsbCB9LAorCVtQTV9JRlVdID0gICB7IDB4YzgwMDAwMDAwMDAwdWxsLCAweDg0MDAwMDAwMDAwMHVsbCB9LAorCVtQTV9JRFVdID0gICB7IDB4MzgwMDAwMDAwMDAwdWxsLCAweDAxMDAwMDAwMDAwMHVsbCB9LAorCVtQTV9TVFNdID0gICB7IDB4MzgwMDAwMDAwMDAwdWxsLCAweDMxMDAwMDAwMDAwMHVsbCB9LAorfTsKKworc3RhdGljIGludCBwOTcwX2dldF9jb25zdHJhaW50KHU2NCBldmVudCwgdTY0ICptYXNrcCwgdTY0ICp2YWxwKQoreworCWludCBwbWMsIGJ5dGUsIHVuaXQsIHNoLCBzcGNzZWw7CisJdTY0IG1hc2sgPSAwLCB2YWx1ZSA9IDA7CisJaW50IGdycCA9IC0xOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCWlmIChwbWMpIHsKKwkJaWYgKHBtYyA+IDgpCisJCQlyZXR1cm4gLTE7CisJCXNoID0gKHBtYyAtIDEpICogMjsKKwkJbWFzayB8PSAyIDw8IHNoOworCQl2YWx1ZSB8PSAxIDw8IHNoOworCQlncnAgPSAoKHBtYyAtIDEpID4+IDEpICYgMTsKKwl9CisJdW5pdCA9IChldmVudCA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCWlmICh1bml0KSB7CisJCWlmICh1bml0ID4gUE1fTEFTVFVOSVQpCisJCQlyZXR1cm4gLTE7CisJCW1hc2sgfD0gdW5pdF9jb25zW3VuaXRdWzBdOworCQl2YWx1ZSB8PSB1bml0X2NvbnNbdW5pdF1bMV07CisJCWJ5dGUgPSAoZXZlbnQgPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJLyoKKwkJICogQnVzIGV2ZW50cyBvbiBieXRlcyAwIGFuZCAyIGNhbiBiZSBjb3VudGVkCisJCSAqIG9uIFBNQzEvMi81LzY7IGJ5dGVzIDEgYW5kIDMgb24gUE1DMy80LzcvOC4KKwkJICovCisJCWlmICghcG1jKQorCQkJZ3JwID0gYnl0ZSAmIDE7CisJCS8qIFNldCBieXRlIGxhbmUgc2VsZWN0IGZpZWxkICovCisJCW1hc2sgIHw9IDB4ZlVMTCA8PCAoMjggLSA0ICogYnl0ZSk7CisJCXZhbHVlIHw9ICh1NjQpdW5pdCA8PCAoMjggLSA0ICogYnl0ZSk7CisJfQorCWlmIChncnAgPT0gMCkgeworCQkvKiBpbmNyZW1lbnQgUE1DMS8yLzUvNiBmaWVsZCAqLworCQltYXNrICB8PSAweDgwMDAwMDAwMDB1bGw7CisJCXZhbHVlIHw9IDB4MTAwMDAwMDAwMHVsbDsKKwl9IGVsc2UgaWYgKGdycCA9PSAxKSB7CisJCS8qIGluY3JlbWVudCBQTUMzLzQvNy84IGZpZWxkICovCisJCW1hc2sgIHw9IDB4ODAwMDAwMDAwdWxsOworCQl2YWx1ZSB8PSAweDEwMDAwMDAwMHVsbDsKKwl9CisJc3Bjc2VsID0gKGV2ZW50ID4+IFBNX1NQQ1NFTF9TSCkgJiBQTV9TUENTRUxfTVNLOworCWlmIChzcGNzZWwpIHsKKwkJbWFzayAgfD0gM3VsbCA8PCA0ODsKKwkJdmFsdWUgfD0gKHU2NClzcGNzZWwgPDwgNDg7CisJfQorCSptYXNrcCA9IG1hc2s7CisJKnZhbHAgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwOTcwX2dldF9hbHRlcm5hdGl2ZXModTY0IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHU2NCBhbHRbXSkKK3sKKwlhbHRbMF0gPSBldmVudDsKKworCS8qIDIgYWx0ZXJuYXRpdmVzIGZvciBMU1UgZW1wdHkgKi8KKwlpZiAoZXZlbnQgPT0gMHgyMDAyIHx8IGV2ZW50ID09IDB4MzAwMikgeworCQlhbHRbMV0gPSBldmVudCBeIDB4MTAwMDsKKwkJcmV0dXJuIDI7CisJfQorCQkKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwOTcwX2NvbXB1dGVfbW1jcih1NjQgZXZlbnRbXSwgaW50IG5fZXYsCisJCQkgICAgIHVuc2lnbmVkIGludCBod2NbXSwgdTY0IG1tY3JbXSkKK3sKKwl1NjQgbW1jcjAgPSAwLCBtbWNyMSA9IDAsIG1tY3JhID0gMDsKKwl1bnNpZ25lZCBpbnQgcG1jLCB1bml0LCBieXRlLCBwc2VsOworCXVuc2lnbmVkIGludCB0dG0sIGdycDsKKwl1bnNpZ25lZCBpbnQgcG1jX2ludXNlID0gMDsKKwl1bnNpZ25lZCBpbnQgcG1jX2dycF91c2VbMl07CisJdW5zaWduZWQgY2hhciBidXNieXRlWzRdOworCXVuc2lnbmVkIGNoYXIgdW5pdHVzZVsxNl07CisJdW5zaWduZWQgY2hhciB1bml0bWFwW10gPSB7IDAsIDA8PDMsIDM8PDMsIDE8PDMsIDI8PDMsIDB8NCwgM3w0IH07CisJdW5zaWduZWQgY2hhciB0dG11c2VbMl07CisJdW5zaWduZWQgY2hhciBwbWNzZWxbOF07CisJaW50IGk7CisJaW50IHNwY3NlbDsKKworCWlmIChuX2V2ID4gOCkKKwkJcmV0dXJuIC0xOworCisJLyogRmlyc3QgcGFzcyB0byBjb3VudCByZXNvdXJjZSB1c2UgKi8KKwlwbWNfZ3JwX3VzZVswXSA9IHBtY19ncnBfdXNlWzFdID0gMDsKKwltZW1zZXQoYnVzYnl0ZSwgMCwgc2l6ZW9mKGJ1c2J5dGUpKTsKKwltZW1zZXQodW5pdHVzZSwgMCwgc2l6ZW9mKHVuaXR1c2UpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbl9ldjsgKytpKSB7CisJCXBtYyA9IChldmVudFtpXSA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwkJaWYgKHBtYykgeworCQkJaWYgKHBtY19pbnVzZSAmICgxIDw8IChwbWMgLSAxKSkpCisJCQkJcmV0dXJuIC0xOworCQkJcG1jX2ludXNlIHw9IDEgPDwgKHBtYyAtIDEpOworCQkJLyogY291bnQgMS8yLzUvNiB2cyAzLzQvNy84IHVzZSAqLworCQkJKytwbWNfZ3JwX3VzZVsoKHBtYyAtIDEpID4+IDEpICYgMV07CisJCX0KKwkJdW5pdCA9IChldmVudFtpXSA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCQlieXRlID0gKGV2ZW50W2ldID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJCWlmICh1bml0KSB7CisJCQlpZiAodW5pdCA+IFBNX0xBU1RVTklUKQorCQkJCXJldHVybiAtMTsKKwkJCWlmICghcG1jKQorCQkJCSsrcG1jX2dycF91c2VbYnl0ZSAmIDFdOworCQkJaWYgKGJ1c2J5dGVbYnl0ZV0gJiYgYnVzYnl0ZVtieXRlXSAhPSB1bml0KQorCQkJCXJldHVybiAtMTsKKwkJCWJ1c2J5dGVbYnl0ZV0gPSB1bml0OworCQkJdW5pdHVzZVt1bml0XSA9IDE7CisJCX0KKwl9CisJaWYgKHBtY19ncnBfdXNlWzBdID4gNCB8fCBwbWNfZ3JwX3VzZVsxXSA+IDQpCisJCXJldHVybiAtMTsKKworCS8qCisJICogQXNzaWduIHJlc291cmNlcyBhbmQgc2V0IG11bHRpcGxleGVyIHNlbGVjdHMuCisJICoKKwkgKiBQTV9JU1UgY2FuIGdvIGVpdGhlciBvbiBUVE0wIG9yIFRUTTEsIGJ1dCB0aGF0J3MgdGhlIG9ubHkKKwkgKiBjaG9pY2Ugd2UgaGF2ZSB0byBkZWFsIHdpdGguCisJICovCisJaWYgKHVuaXR1c2VbUE1fSVNVXSAmCisJICAgICh1bml0dXNlW1BNX0ZQVV0gfCB1bml0dXNlW1BNX0lGVV0gfCB1bml0dXNlW1BNX1ZQVV0pKQorCQl1bml0bWFwW1BNX0lTVV0gPSAyIHwgNDsJLyogbW92ZSBJU1UgdG8gVFRNMSAqLworCS8qIFNldCBUVE1bMDFdU0VMIGZpZWxkcy4gKi8KKwl0dG11c2VbMF0gPSB0dG11c2VbMV0gPSAwOworCWZvciAoaSA9IFBNX0ZQVTsgaSA8PSBQTV9TVFM7ICsraSkgeworCQlpZiAoIXVuaXR1c2VbaV0pCisJCQljb250aW51ZTsKKwkJdHRtID0gdW5pdG1hcFtpXTsKKwkJKyt0dG11c2VbKHR0bSA+PiAyKSAmIDFdOworCQltbWNyMSB8PSAodTY0KSh0dG0gJiB+NCkgPDwgTU1DUjFfVFRNMVNFTF9TSDsKKwl9CisJLyogQ2hlY2sgb25seSBvbmUgdW5pdCBwZXIgVFRNeCAqLworCWlmICh0dG11c2VbMF0gPiAxIHx8IHR0bXVzZVsxXSA+IDEpCisJCXJldHVybiAtMTsKKworCS8qIFNldCBieXRlIGxhbmUgc2VsZWN0IGZpZWxkcyBhbmQgVFRNM1NFTC4gKi8KKwlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgNDsgKytieXRlKSB7CisJCXVuaXQgPSBidXNieXRlW2J5dGVdOworCQlpZiAoIXVuaXQpCisJCQljb250aW51ZTsKKwkJaWYgKHVuaXQgPD0gUE1fU1RTKQorCQkJdHRtID0gKHVuaXRtYXBbdW5pdF0gPj4gMikgJiAxOworCQllbHNlIGlmICh1bml0ID09IFBNX0xTVTApCisJCQl0dG0gPSAyOworCQllbHNlIHsKKwkJCXR0bSA9IDM7CisJCQlpZiAodW5pdCA9PSBQTV9MU1UxTCAmJiBieXRlID49IDIpCisJCQkJbW1jcjEgfD0gMXVsbCA8PCAoTU1DUjFfVFRNM1NFTF9TSCArIDMgLSBieXRlKTsKKwkJfQorCQltbWNyMSB8PSAodTY0KXR0bSA8PCAoTU1DUjFfVERfQ1BfREJHMFNFTF9TSCAtIDIgKiBieXRlKTsKKwl9CisKKwkvKiBTZWNvbmQgcGFzczogYXNzaWduIFBNQ3MsIHNldCBQTUN4U0VMIGFuZCBQTUN4X0FEREVSX1NFTCBmaWVsZHMgKi8KKwltZW1zZXQocG1jc2VsLCAweDgsIHNpemVvZihwbWNzZWwpKTsJLyogOCBtZWFucyBkb24ndCBjb3VudCAqLworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJcG1jID0gKGV2ZW50W2ldID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQl1bml0ID0gKGV2ZW50W2ldID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJCWJ5dGUgPSAoZXZlbnRbaV0gPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJcHNlbCA9IGV2ZW50W2ldICYgUE1fUE1DU0VMX01TSzsKKwkJaWYgKCFwbWMpIHsKKwkJCS8qIEJ1cyBldmVudCBvciBhbnktUE1DIGRpcmVjdCBldmVudCAqLworCQkJaWYgKHVuaXQpCisJCQkJcHNlbCB8PSAweDEwIHwgKChieXRlICYgMikgPDwgMik7CisJCQllbHNlCisJCQkJcHNlbCB8PSA4OworCQkJZm9yIChwbWMgPSAwOyBwbWMgPCA4OyArK3BtYykgeworCQkJCWlmIChwbWNfaW51c2UgJiAoMSA8PCBwbWMpKQorCQkJCQljb250aW51ZTsKKwkJCQlncnAgPSAocG1jID4+IDEpICYgMTsKKwkJCQlpZiAodW5pdCkgeworCQkJCQlpZiAoZ3JwID09IChieXRlICYgMSkpCisJCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKHBtY19ncnBfdXNlW2dycF0gPCA0KSB7CisJCQkJCSsrcG1jX2dycF91c2VbZ3JwXTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcG1jX2ludXNlIHw9IDEgPDwgcG1jOworCQl9IGVsc2UgeworCQkJLyogRGlyZWN0IGV2ZW50ICovCisJCQktLXBtYzsKKwkJCWlmIChwc2VsID09IDAgJiYgKGJ5dGUgJiAyKSkKKwkJCQkvKiBhZGQgZXZlbnRzIG9uIGhpZ2hlci1udW1iZXJlZCBidXMgKi8KKwkJCQltbWNyMSB8PSAxdWxsIDw8IG1tY3IxX2FkZGVyX2JpdHNbcG1jXTsKKwkJfQorCQlwbWNzZWxbcG1jXSA9IHBzZWw7CisJCWh3Y1tpXSA9IHBtYzsKKwkJc3Bjc2VsID0gKGV2ZW50W2ldID4+IFBNX1NQQ1NFTF9TSCkgJiBQTV9TUENTRUxfTVNLOworCQltbWNyMSB8PSBzcGNzZWw7CisJCWlmIChwOTcwX21hcmtlZF9pbnN0cl9ldmVudChldmVudFtpXSkpCisJCQltbWNyYSB8PSBNTUNSQV9TQU1QTEVfRU5BQkxFOworCX0KKwlmb3IgKHBtYyA9IDA7IHBtYyA8IDI7ICsrcG1jKQorCQltbWNyMCB8PSBwbWNzZWxbcG1jXSA8PCAoTU1DUjBfUE1DMVNFTF9TSCAtIDcgKiBwbWMpOworCWZvciAoOyBwbWMgPCA4OyArK3BtYykKKwkJbW1jcjEgfD0gKHU2NClwbWNzZWxbcG1jXSA8PCAoTU1DUjFfUE1DM1NFTF9TSCAtIDUgKiAocG1jIC0gMikpOworCWlmIChwbWNfaW51c2UgJiAxKQorCQltbWNyMCB8PSBNTUNSMF9QTUMxQ0U7CisJaWYgKHBtY19pbnVzZSAmIDB4ZmUpCisJCW1tY3IwIHw9IE1NQ1IwX1BNQ2pDRTsKKworCW1tY3JhIHw9IDB4MjAwMDsJLyogbWFyayBvbmx5IG9uZSBJT1AgcGVyIFBQQyBpbnN0cnVjdGlvbiAqLworCisJLyogUmV0dXJuIE1NQ1J4IHZhbHVlcyAqLworCW1tY3JbMF0gPSBtbWNyMDsKKwltbWNyWzFdID0gbW1jcjE7CisJbW1jclsyXSA9IG1tY3JhOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwOTcwX2Rpc2FibGVfcG1jKHVuc2lnbmVkIGludCBwbWMsIHU2NCBtbWNyW10pCit7CisJaW50IHNoaWZ0LCBpOworCisJaWYgKHBtYyA8PSAxKSB7CisJCXNoaWZ0ID0gTU1DUjBfUE1DMVNFTF9TSCAtIDcgKiBwbWM7CisJCWkgPSAwOworCX0gZWxzZSB7CisJCXNoaWZ0ID0gTU1DUjFfUE1DM1NFTF9TSCAtIDUgKiAocG1jIC0gMik7CisJCWkgPSAxOworCX0KKwkvKgorCSAqIFNldHRpbmcgdGhlIFBNQ3hTRUwgZmllbGQgdG8gMHgwOCBkaXNhYmxlcyBQTUMgeC4KKwkgKi8KKwltbWNyW2ldID0gKG1tY3JbaV0gJiB+KDB4MWZVTCA8PCBzaGlmdCkpIHwgKDB4MDhVTCA8PCBzaGlmdCk7Cit9CisKK3N0YXRpYyBpbnQgcHBjOTcwX2dlbmVyaWNfZXZlbnRzW10gPSB7CisJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10JCT0gNywKKwlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdCQk9IDEsCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JPSAweDg4MTAsIC8qIFBNX0xEX1JFRl9MMSAqLworCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFU10JCT0gMHgzODEwLCAvKiBQTV9MRF9NSVNTX0wxICovCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10JPSAweDQzMSwgIC8qIFBNX0JSX0lTU1VFRCAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdIAkJPSAweDMyNywgIC8qIFBNX0dSUF9CUl9NUFJFRCAqLworfTsKKworI2RlZmluZSBDKHgpCVBFUkZfQ09VTlRfSFdfQ0FDSEVfIyN4CisKKy8qCisgKiBUYWJsZSBvZiBnZW5lcmFsaXplZCBjYWNoZS1yZWxhdGVkIGV2ZW50cy4KKyAqIDAgbWVhbnMgbm90IHN1cHBvcnRlZCwgLTEgbWVhbnMgbm9uc2Vuc2ljYWwsIG90aGVyIHZhbHVlcworICogYXJlIGV2ZW50IGNvZGVzLgorICovCitzdGF0aWMgaW50IHBwYzk3MF9jYWNoZV9ldmVudHNbQyhNQVgpXVtDKE9QX01BWCldW0MoUkVTVUxUX01BWCldID0geworCVtDKEwxRCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDg4MTAsCQkweDM4MTAJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJMHg3ODEwLAkJMHg4MTMJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMHg3MzEsCQkwCX0sCisJfSwKKwlbQyhMMUkpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTAJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkwLAkJMAl9LAorCX0sCisJW0MoTEwpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTAJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJMCwJCTAJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMHg3MzMsCQkwCX0sCisJfSwKKwlbQyhEVExCKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTAsCQkweDcwNAl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKKwl9LAorCVtDKElUTEIpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4NzAwCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAorCX0sCisJW0MoQlBVKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4NDMxLAkJMHgzMjcJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCisJfSwKK307CisKK3N0cnVjdCBwb3dlcl9wbXUgcHBjOTcwX3BtdSA9IHsKKwkubl9jb3VudGVyID0gOCwKKwkubWF4X2FsdGVybmF0aXZlcyA9IDIsCisJLmFkZF9maWVsZHMgPSAweDAwMTEwMDAwNTU1NXVsbCwKKwkudGVzdF9hZGRlciA9IDB4MDEzMzAwMDAwMDAwdWxsLAorCS5jb21wdXRlX21tY3IgPSBwOTcwX2NvbXB1dGVfbW1jciwKKwkuZ2V0X2NvbnN0cmFpbnQgPSBwOTcwX2dldF9jb25zdHJhaW50LAorCS5nZXRfYWx0ZXJuYXRpdmVzID0gcDk3MF9nZXRfYWx0ZXJuYXRpdmVzLAorCS5kaXNhYmxlX3BtYyA9IHA5NzBfZGlzYWJsZV9wbWMsCisJLm5fZ2VuZXJpYyA9IEFSUkFZX1NJWkUocHBjOTcwX2dlbmVyaWNfZXZlbnRzKSwKKwkuZ2VuZXJpY19ldmVudHMgPSBwcGM5NzBfZ2VuZXJpY19ldmVudHMsCisJLmNhY2hlX2V2ZW50cyA9ICZwcGM5NzBfY2FjaGVfZXZlbnRzLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKaW5kZXggOTA1NzMzNS4uMmNmOTE1ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKQEAgLTQxLDYgKzQxLDEyIEBACiAJcmV0dXJuICEhKHYtPmFyY2gucGVuZGluZ19leGNlcHRpb25zKTsKIH0KIAoraW50IGt2bV9hcmNoX2ludGVycnVwdF9hbGxvd2VkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwkvKiBkbyByZWFsIGNoZWNrIGhlcmUgKi8KKwlyZXR1cm4gMTsKK30KKwogaW50IGt2bV9hcmNoX3ZjcHVfcnVubmFibGUoc3RydWN0IGt2bV92Y3B1ICp2KQogewogCXJldHVybiAhKHYtPmFyY2gubXNyICYgTVNSX1dFKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jIGIvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKaW5kZXggNzY5OTM5NC4uNWJlZmZjOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgva2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CiAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMTcwLDYgKzE3MSw4IEBACiAJCWRpZSgiV2VpcmQgcGFnZSBmYXVsdCIsIHJlZ3MsIFNJR1NFR1YpOwogCX0KIAorCXBlcmZfc3djb3VudGVyX2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIDAsIHJlZ3MsIGFkZHJlc3MpOworCiAJLyogV2hlbiBydW5uaW5nIGluIHRoZSBrZXJuZWwgd2UgZXhwZWN0IGZhdWx0cyB0byBvY2N1ciBvbmx5IHRvCiAJICogYWRkcmVzc2VzIGluIHVzZXIgc3BhY2UuICBBbGwgb3RoZXIgZmF1bHRzIHJlcHJlc2VudCBlcnJvcnMgaW4gdGhlCiAJICoga2VybmVsIGFuZCBzaG91bGQgZ2VuZXJhdGUgYW4gT09QUy4gIFVuZm9ydHVuYXRlbHksIGluIHRoZSBjYXNlIG9mIGFuCkBAIC0zMDksNiArMzEyLDggQEAKIAl9CiAJaWYgKHJldCAmIFZNX0ZBVUxUX01BSk9SKSB7CiAJCWN1cnJlbnQtPm1hal9mbHQrKzsKKwkJcGVyZl9zd2NvdW50ZXJfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NQUosIDEsIDAsCisJCQkJICAgICByZWdzLCBhZGRyZXNzKTsKICNpZmRlZiBDT05GSUdfUFBDX1NNTFBBUgogCQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9DTU8pKSB7CiAJCQlwcmVlbXB0X2Rpc2FibGUoKTsKQEAgLTMxNiw4ICszMjEsMTEgQEAKIAkJCXByZWVtcHRfZW5hYmxlKCk7CiAJCX0KICNlbmRpZgotCX0gZWxzZQorCX0gZWxzZSB7CiAJCWN1cnJlbnQtPm1pbl9mbHQrKzsKKwkJcGVyZl9zd2NvdW50ZXJfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4sIDEsIDAsCisJCQkJICAgICByZWdzLCBhZGRyZXNzKTsKKwl9CiAJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQppbmRleCA5ZGE3OTVlLi43MzJlZTkzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZQpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBQUEM2NAogCWJvb2wgIjY0LWJpdCBrZXJuZWwiCiAJZGVmYXVsdCBuCisJc2VsZWN0IEhBVkVfUEVSRl9DT1VOVEVSUwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHNlbGVjdHMgd2hldGhlciBhIDMyLWJpdCBvciBhIDY0LWJpdCBrZXJuZWwKIAkgIHdpbGwgYmUgYnVpbHQuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwppbmRleCA4MGI1MTM0Li5iZTM1ODFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKQEAgLTMzMyw3ICszMzMsNyBAQAogCWxwYXJfeGlycl9pbmZvX3NldCgoMHhmZiA8PCAyNCkgfCBpcnEpOwogfQogCi1zdGF0aWMgdm9pZCB4aWNzX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgdmlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2spCitzdGF0aWMgaW50IHhpY3Nfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaykKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCWludCBzdGF0dXM7CkBAIC0zNDIsMTQgKzM0MiwxNCBAQAogCiAJaXJxID0gKHVuc2lnbmVkIGludClpcnFfbWFwW3ZpcnFdLmh3aXJxOwogCWlmIChpcnEgPT0gWElDU19JUEkgfHwgaXJxID09IFhJQ1NfSVJRX1NQVVJJT1VTKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCXN0YXR1cyA9IHJ0YXNfY2FsbChpYm1fZ2V0X3hpdmUsIDEsIDMsIHhpY3Nfc3RhdHVzLCBpcnEpOwogCiAJaWYgKHN0YXR1cykgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBpYm0sZ2V0LXhpdmUgaXJxPSV1IHJldHVybnMgJWRcbiIsCiAJCQlfX2Z1bmNfXywgaXJxLCBzdGF0dXMpOwotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAl9CiAKIAkvKgpAQCAtMzYzLDcgKzM2Myw3IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSIlczogTm8gb25saW5lIGNwdXMgaW4gdGhlIG1hc2sgJXMgZm9yIGlycSAlZFxuIiwKIAkJCV9fZnVuY19fLCBjcHVsaXN0LCB2aXJxKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAJfQogCiAJc3RhdHVzID0gcnRhc19jYWxsKGlibV9zZXRfeGl2ZSwgMywgMSwgTlVMTCwKQEAgLTM3Miw4ICszNzIsMTAgQEAKIAlpZiAoc3RhdHVzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlibSxzZXQteGl2ZSBpcnE9JXUgcmV0dXJucyAlZFxuIiwKIAkJCV9fZnVuY19fLCBpcnEsIHN0YXR1cyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHhpY3NfcGljX2RpcmVjdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvYXhvbnJhbS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKaW5kZXggOWUxMDVjYi4uYTQ3Nzk5MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCiAJc2V0X2NhcGFjaXR5KGJhbmstPmRpc2ssIGJhbmstPnNpemUgPj4gQVhPTl9SQU1fU0VDVE9SX1NISUZUKTsKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KGJhbmstPmRpc2stPnF1ZXVlLCBheG9uX3JhbV9tYWtlX3JlcXVlc3QpOwotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGJhbmstPmRpc2stPnF1ZXVlLCBBWE9OX1JBTV9TRUNUT1JfU0laRSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShiYW5rLT5kaXNrLT5xdWV1ZSwgQVhPTl9SQU1fU0VDVE9SX1NJWkUpOwogCWFkZF9kaXNrKGJhbmstPmRpc2spOwogCiAJYmFuay0+aXJxX2lkID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2aWNlLT5ub2RlLCAwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggMGVmYzEyZC4uMzUyZDhjMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTgwNyw3ICs4MDcsNyBAQAogCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi12b2lkIG1waWNfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKQoraW50IG1waWNfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKQogewogCXN0cnVjdCBtcGljICptcGljID0gbXBpY19mcm9tX2lycShpcnEpOwogCXVuc2lnbmVkIGludCBzcmMgPSBtcGljX2lycV90b19odyhpcnEpOwpAQCAtODI0LDYgKzgyNCw4IEBACiAJCW1waWNfaXJxX3dyaXRlKHNyYywgTVBJQ19JTkZPKElSUV9ERVNUSU5BVElPTiksCiAJCQkgICAgICAgbXBpY19waHlzbWFzayhjcHVzX2FkZHIodG1wKVswXSkpOwogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1waWNfdHlwZV90b192ZWNwcmkoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCB0eXBlKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmggYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuaAppbmRleCAzY2VmMmFmLi5lZmY0MzNjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuaAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuaApAQCAtMzYsNiArMzYsNiBAQAogCiBleHRlcm4gaW50IG1waWNfc2V0X2lycV90eXBlKHVuc2lnbmVkIGludCB2aXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKTsKIGV4dGVybiB2b2lkIG1waWNfc2V0X3ZlY3Rvcih1bnNpZ25lZCBpbnQgdmlycSwgdW5zaWduZWQgaW50IHZlY3Rvcik7Ci1leHRlcm4gdm9pZCBtcGljX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzayk7CitleHRlcm4gaW50IG1waWNfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKTsKIAogI2VuZGlmIC8qIF9QT1dFUlBDX1NZU0RFVl9NUElDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggNTRlYTM5Zi4uYTI3ZDBkNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTEzLDYgKzEzLDggQEAKIAogI2lmbmRlZiBBU01fS1ZNX0hPU1RfSAogI2RlZmluZSBBU01fS1ZNX0hPU1RfSAorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGFzbS9kZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9jcHVpZC5oPgpAQCAtMjEwLDcgKzIxMiw4IEBACiAJczM5MF9mcF9yZWdzICAgICAgZ3Vlc3RfZnByZWdzOwogCXVuc2lnbmVkIGludCAgICAgIGd1ZXN0X2FjcnNbTlVNX0FDUlNdOwogCXN0cnVjdCBrdm1fczM5MF9sb2NhbF9pbnRlcnJ1cHQgbG9jYWxfaW50OwotCXN0cnVjdCB0aW1lcl9saXN0IGNrY190aW1lcjsKKwlzdHJ1Y3QgaHJ0aW1lciAgICBja2NfdGltZXI7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHRhc2tsZXQ7CiAJdW5pb24gIHsKIAkJY3B1aWRfdAkgIGNwdV9pZDsKIAkJdTY0CSAgc3RpZHBfZGF0YTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMgYi9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jCmluZGV4IDlkMTk4MDMuLjk4OTk3Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMKKysrIGIvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYwpAQCAtMTU0LDE3ICsxNTQsMjUgQEAKIHN0YXRpYyBpbnQgaGFuZGxlX3ZhbGlkaXR5KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlpbnQgdml3aHkgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiID4+IDE2OworCWludCByYzsKKwogCXZjcHUtPnN0YXQuZXhpdF92YWxpZGl0eSsrOwotCWlmICh2aXdoeSA9PSAweDM3KSB7Ci0JCWZhdWx0X2luX3BhZ2VzX3dyaXRlYWJsZSgoY2hhciBfX3VzZXIgKikKLQkJCQkJIHZjcHUtPmt2bS0+YXJjaC5ndWVzdF9vcmlnaW4gKwotCQkJCQkgdmNwdS0+YXJjaC5zaWVfYmxvY2stPnByZWZpeCwKLQkJCQkJIFBBR0VfU0laRSk7Ci0JCXJldHVybiAwOwotCX0KLQlWQ1BVX0VWRU5UKHZjcHUsIDIsICJ1bmhhbmRsZWQgdmFsaWRpdHkgaW50ZXJjZXB0IGNvZGUgJWQiLAotCQkgICB2aXdoeSk7Ci0JcmV0dXJuIC1FTk9UU1VQUDsKKwlpZiAoKHZpd2h5ID09IDB4MzcpICYmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+cHJlZml4CisJCTw9IHZjcHUtPmt2bS0+YXJjaC5ndWVzdF9tZW1zaXplIC0gMipQQUdFX1NJWkUpKXsKKwkJcmMgPSBmYXVsdF9pbl9wYWdlc193cml0ZWFibGUoKGNoYXIgX191c2VyICopCisJCQkgdmNwdS0+a3ZtLT5hcmNoLmd1ZXN0X29yaWdpbiArCisJCQkgdmNwdS0+YXJjaC5zaWVfYmxvY2stPnByZWZpeCwKKwkJCSAyKlBBR0VfU0laRSk7CisJCWlmIChyYykKKwkJCS8qIHVzZXIgd2lsbCByZWNlaXZlIHNpZ3NlZ3YsIGV4aXQgdG8gdXNlciAqLworCQkJcmMgPSAtRU5PVFNVUFA7CisJfSBlbHNlCisJCXJjID0gLUVOT1RTVVBQOworCisJaWYgKHJjKQorCQlWQ1BVX0VWRU5UKHZjcHUsIDIsICJ1bmhhbmRsZWQgdmFsaWRpdHkgaW50ZXJjZXB0IGNvZGUgJWQiLAorCQkJICAgdml3aHkpOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBoYW5kbGVfaW5zdHJ1Y3Rpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYyBiL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMKaW5kZXggMDE4OTM1Ni4uZjA0ZjUzMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jCkBAIC0xMiw2ICsxMiw4IEBACiAKICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSAia3ZtLXMzOTAuaCIKQEAgLTI5OSwxMyArMzAxLDEzIEBACiAJfQogCiAJaWYgKCghcmMpICYmIGF0b21pY19yZWFkKCZmaS0+YWN0aXZlKSkgewotCQlzcGluX2xvY2tfYmgoJmZpLT5sb2NrKTsKKwkJc3Bpbl9sb2NrKCZmaS0+bG9jayk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50aSwgJmZpLT5saXN0LCBsaXN0KQogCQkJaWYgKF9faW50ZXJydXB0X2lzX2RlbGl2ZXJhYmxlKHZjcHUsIGludGkpKSB7CiAJCQkJcmMgPSAxOwogCQkJCWJyZWFrOwogCQkJfQotCQlzcGluX3VubG9ja19iaCgmZmktPmxvY2spOworCQlzcGluX3VubG9jaygmZmktPmxvY2spOwogCX0KIAogCWlmICgoIXJjKSAmJiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmNrYyA8CkBAIC0zMTgsNiArMzIwLDEyIEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQga3ZtX2FyY2hfaW50ZXJydXB0X2FsbG93ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCS8qIGRvIHJlYWwgY2hlY2sgaGVyZSAqLworCXJldHVybiAxOworfQorCiBpbnQga3ZtX2NwdV9oYXNfcGVuZGluZ190aW1lcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIDA7CkBAIC0zNTUsMTQgKzM2MywxMiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlzbHRpbWUgPSAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmNrYyAtIG5vdykgLyAoMHhmNDI0MDAwMHVsIC8gSFopICsgMTsKKwlzbHRpbWUgPSAoKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5ja2MgLSBub3cpKjEyNSk+Pjk7CiAKLQl2Y3B1LT5hcmNoLmNrY190aW1lci5leHBpcmVzID0gamlmZmllcyArIHNsdGltZTsKLQotCWFkZF90aW1lcigmdmNwdS0+YXJjaC5ja2NfdGltZXIpOwotCVZDUFVfRVZFTlQodmNwdSwgNSwgImVuYWJsZWQgd2FpdCB0aW1lcjolbGx4IGppZmZpZXMiLCBzbHRpbWUpOworCWhydGltZXJfc3RhcnQoJnZjcHUtPmFyY2guY2tjX3RpbWVyLCBrdGltZV9zZXQgKDAsIHNsdGltZSkgLCBIUlRJTUVSX01PREVfUkVMKTsKKwlWQ1BVX0VWRU5UKHZjcHUsIDUsICJlbmFibGVkIHdhaXQgdmlhIGNsb2NrIGNvbXBhcmF0b3I6ICVsbHggbnMiLCBzbHRpbWUpOwogbm9fdGltZXI6Ci0Jc3Bpbl9sb2NrX2JoKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5mbG9hdF9pbnQtPmxvY2spOworCXNwaW5fbG9jaygmdmNwdS0+YXJjaC5sb2NhbF9pbnQuZmxvYXRfaW50LT5sb2NrKTsKIAlzcGluX2xvY2tfYmgoJnZjcHUtPmFyY2gubG9jYWxfaW50LmxvY2spOwogCWFkZF93YWl0X3F1ZXVlKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC53cSwgJndhaXQpOwogCXdoaWxlIChsaXN0X2VtcHR5KCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5saXN0KSAmJgpAQCAtMzcxLDMzICszNzcsNDYgQEAKIAkJIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCXNwaW5fdW5sb2NrX2JoKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5sb2NrKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnZjcHUtPmFyY2gubG9jYWxfaW50LmZsb2F0X2ludC0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5mbG9hdF9pbnQtPmxvY2spOwogCQl2Y3B1X3B1dCh2Y3B1KTsKIAkJc2NoZWR1bGUoKTsKIAkJdmNwdV9sb2FkKHZjcHUpOwotCQlzcGluX2xvY2tfYmgoJnZjcHUtPmFyY2gubG9jYWxfaW50LmZsb2F0X2ludC0+bG9jayk7CisJCXNwaW5fbG9jaygmdmNwdS0+YXJjaC5sb2NhbF9pbnQuZmxvYXRfaW50LT5sb2NrKTsKIAkJc3Bpbl9sb2NrX2JoKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5sb2NrKTsKIAl9CiAJX191bnNldF9jcHVfaWRsZSh2Y3B1KTsKIAlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJcmVtb3ZlX3dhaXRfcXVldWUoJnZjcHUtPndxLCAmd2FpdCk7CiAJc3Bpbl91bmxvY2tfYmgoJnZjcHUtPmFyY2gubG9jYWxfaW50LmxvY2spOwotCXNwaW5fdW5sb2NrX2JoKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5mbG9hdF9pbnQtPmxvY2spOwotCWRlbF90aW1lcigmdmNwdS0+YXJjaC5ja2NfdGltZXIpOworCXNwaW5fdW5sb2NrKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5mbG9hdF9pbnQtPmxvY2spOworCWhydGltZXJfdHJ5X3RvX2NhbmNlbCgmdmNwdS0+YXJjaC5ja2NfdGltZXIpOwogCXJldHVybiAwOwogfQogCi12b2lkIGt2bV9zMzkwX2lkbGVfd2FrZXVwKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3ZvaWQga3ZtX3MzOTBfdGFza2xldCh1bnNpZ25lZCBsb25nIHBhcm0pCiB7Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gKHN0cnVjdCBrdm1fdmNwdSAqKWRhdGE7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gKHN0cnVjdCBrdm1fdmNwdSAqKSBwYXJtOwogCi0Jc3Bpbl9sb2NrX2JoKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5sb2NrKTsKKwlzcGluX2xvY2soJnZjcHUtPmFyY2gubG9jYWxfaW50LmxvY2spOwogCXZjcHUtPmFyY2gubG9jYWxfaW50LnRpbWVyX2R1ZSA9IDE7CiAJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnZjcHUtPmFyY2gubG9jYWxfaW50LndxKSkKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC53cSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnZjcHUtPmFyY2gubG9jYWxfaW50LmxvY2spOworCXNwaW5fdW5sb2NrKCZ2Y3B1LT5hcmNoLmxvY2FsX2ludC5sb2NrKTsKIH0KIAorLyoKKyAqIGxvdyBsZXZlbCBocnRpbWVyIHdha2Ugcm91dGluZS4gQmVjYXVzZSB0aGlzIHJ1bnMgaW4gaGFyZGlycSBjb250ZXh0CisgKiB3ZSBzY2hlZHVsZSBhIHRhc2tsZXQgdG8gZG8gdGhlIHJlYWwgd29yay4KKyAqLworZW51bSBocnRpbWVyX3Jlc3RhcnQga3ZtX3MzOTBfaWRsZV93YWtldXAoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKKworCXZjcHUgPSBjb250YWluZXJfb2YodGltZXIsIHN0cnVjdCBrdm1fdmNwdSwgYXJjaC5ja2NfdGltZXIpOworCXRhc2tsZXRfc2NoZWR1bGUoJnZjcHUtPmFyY2gudGFza2xldCk7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cit9CiAKIHZvaWQga3ZtX3MzOTBfZGVsaXZlcl9wZW5kaW5nX2ludGVycnVwdHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtNDM2LDcgKzQ1NSw3IEBACiAJaWYgKGF0b21pY19yZWFkKCZmaS0+YWN0aXZlKSkgewogCQlkbyB7CiAJCQlkZWxpdmVyID0gMDsKLQkJCXNwaW5fbG9ja19iaCgmZmktPmxvY2spOworCQkJc3Bpbl9sb2NrKCZmaS0+bG9jayk7CiAJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW50aSwgbiwgJmZpLT5saXN0LCBsaXN0KSB7CiAJCQkJaWYgKF9faW50ZXJydXB0X2lzX2RlbGl2ZXJhYmxlKHZjcHUsIGludGkpKSB7CiAJCQkJCWxpc3RfZGVsKCZpbnRpLT5saXN0KTsKQEAgLTQ0Nyw3ICs0NjYsNyBAQAogCQkJfQogCQkJaWYgKGxpc3RfZW1wdHkoJmZpLT5saXN0KSkKIAkJCQlhdG9taWNfc2V0KCZmaS0+YWN0aXZlLCAwKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZmaS0+bG9jayk7CisJCQlzcGluX3VubG9jaygmZmktPmxvY2spOwogCQkJaWYgKGRlbGl2ZXIpIHsKIAkJCQlfX2RvX2RlbGl2ZXJfaW50ZXJydXB0KHZjcHUsIGludGkpOwogCQkJCWtmcmVlKGludGkpOwpAQCAtNTEyLDcgKzUzMSw3IEBACiAKIAltdXRleF9sb2NrKCZrdm0tPmxvY2spOwogCWZpID0gJmt2bS0+YXJjaC5mbG9hdF9pbnQ7Ci0Jc3Bpbl9sb2NrX2JoKCZmaS0+bG9jayk7CisJc3Bpbl9sb2NrKCZmaS0+bG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmaW50aS0+bGlzdCwgJmZpLT5saXN0KTsKIAlhdG9taWNfc2V0KCZmaS0+YWN0aXZlLCAxKTsKIAlzaWdjcHUgPSBmaW5kX2ZpcnN0X2JpdChmaS0+aWRsZV9tYXNrLCBLVk1fTUFYX1ZDUFVTKTsKQEAgLTUyOSw3ICs1NDgsNyBAQAogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZsaS0+d3EpKQogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmxpLT53cSk7CiAJc3Bpbl91bmxvY2tfYmgoJmxpLT5sb2NrKTsKLQlzcGluX3VubG9ja19iaCgmZmktPmxvY2spOworCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCmluZGV4IGY0ZDU2ZTkuLjEwYmNjZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYworKysgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rdm0uaD4KICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgpAQCAtMTk1LDYgKzE5NiwxMCBAQAogdm9pZCBrdm1fYXJjaF92Y3B1X2Rlc3Ryb3koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCVZDUFVfRVZFTlQodmNwdSwgMywgIiVzIiwgImZyZWUgY3B1Iik7CisJaWYgKHZjcHUtPmt2bS0+YXJjaC5zY2EtPmNwdVt2Y3B1LT52Y3B1X2lkXS5zZGEgPT0KKwkJKF9fdTY0KSB2Y3B1LT5hcmNoLnNpZV9ibG9jaykKKwkJdmNwdS0+a3ZtLT5hcmNoLnNjYS0+Y3B1W3ZjcHUtPnZjcHVfaWRdLnNkYSA9IDA7CisJc21wX21iKCk7CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSh2Y3B1LT5hcmNoLnNpZV9ibG9jaykpOwogCWt2bV92Y3B1X3VuaW5pdCh2Y3B1KTsKIAlrZnJlZSh2Y3B1KTsKQEAgLTI4Myw4ICsyODgsMTAgQEAKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z21zb3IgPSB2Y3B1LT5rdm0tPmFyY2guZ3Vlc3Rfb3JpZ2luOwogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2IgICA9IDI7CiAJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYSAgID0gMHhDMTAwMjAwMVU7Ci0Jc2V0dXBfdGltZXIoJnZjcHUtPmFyY2guY2tjX3RpbWVyLCBrdm1fczM5MF9pZGxlX3dha2V1cCwKLQkJICh1bnNpZ25lZCBsb25nKSB2Y3B1KTsKKwlocnRpbWVyX2luaXQoJnZjcHUtPmFyY2guY2tjX3RpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CisJdGFza2xldF9pbml0KCZ2Y3B1LT5hcmNoLnRhc2tsZXQsIGt2bV9zMzkwX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHZjcHUpOworCXZjcHUtPmFyY2guY2tjX3RpbWVyLmZ1bmN0aW9uID0ga3ZtX3MzOTBfaWRsZV93YWtldXA7CiAJZ2V0X2NwdV9pZCgmdmNwdS0+YXJjaC5jcHVfaWQpOwogCXZjcHUtPmFyY2guY3B1X2lkLnZlcnNpb24gPSAweGZmOwogCXJldHVybiAwOwpAQCAtMzA3LDE5ICszMTQsMjEgQEAKIAogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5pY3B1YSA9IGlkOwogCUJVR19PTigha3ZtLT5hcmNoLnNjYSk7Ci0JQlVHX09OKGt2bS0+YXJjaC5zY2EtPmNwdVtpZF0uc2RhKTsKLQlrdm0tPmFyY2guc2NhLT5jcHVbaWRdLnNkYSA9IChfX3U2NCkgdmNwdS0+YXJjaC5zaWVfYmxvY2s7CisJaWYgKCFrdm0tPmFyY2guc2NhLT5jcHVbaWRdLnNkYSkKKwkJa3ZtLT5hcmNoLnNjYS0+Y3B1W2lkXS5zZGEgPSAoX191NjQpIHZjcHUtPmFyY2guc2llX2Jsb2NrOworCWVsc2UKKwkJQlVHX09OKCFrdm0tPnZjcHVzW2lkXSk7IC8qIHZjcHUgZG9lcyBhbHJlYWR5IGV4aXN0ICovCiAJdmNwdS0+YXJjaC5zaWVfYmxvY2stPnNjYW9oID0gKF9fdTMyKSgoKF9fdTY0KWt2bS0+YXJjaC5zY2EpID4+IDMyKTsKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+c2Nhb2wgPSAoX191MzIpKF9fdTY0KWt2bS0+YXJjaC5zY2E7CiAKIAlzcGluX2xvY2tfaW5pdCgmdmNwdS0+YXJjaC5sb2NhbF9pbnQubG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnZjcHUtPmFyY2gubG9jYWxfaW50Lmxpc3QpOwogCXZjcHUtPmFyY2gubG9jYWxfaW50LmZsb2F0X2ludCA9ICZrdm0tPmFyY2guZmxvYXRfaW50OwotCXNwaW5fbG9ja19iaCgma3ZtLT5hcmNoLmZsb2F0X2ludC5sb2NrKTsKKwlzcGluX2xvY2soJmt2bS0+YXJjaC5mbG9hdF9pbnQubG9jayk7CiAJa3ZtLT5hcmNoLmZsb2F0X2ludC5sb2NhbF9pbnRbaWRdID0gJnZjcHUtPmFyY2gubG9jYWxfaW50OwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZjcHUtPmFyY2gubG9jYWxfaW50LndxKTsKIAl2Y3B1LT5hcmNoLmxvY2FsX2ludC5jcHVmbGFncyA9ICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y3B1ZmxhZ3M7Ci0Jc3Bpbl91bmxvY2tfYmgoJmt2bS0+YXJjaC5mbG9hdF9pbnQubG9jayk7CisJc3Bpbl91bmxvY2soJmt2bS0+YXJjaC5mbG9hdF9pbnQubG9jayk7CiAKIAlyYyA9IGt2bV92Y3B1X2luaXQodmNwdSwga3ZtLCBpZCk7CiAJaWYgKHJjKQpAQCAtNDc4LDYgKzQ4NywxMiBAQAogCiAJdmNwdV9sb2FkKHZjcHUpOwogCisJLyogdmVyaWZ5LCB0aGF0IG1lbW9yeSBoYXMgYmVlbiByZWdpc3RlcmVkICovCisJaWYgKCF2Y3B1LT5rdm0tPmFyY2guZ3Vlc3RfbWVtc2l6ZSkgeworCQl2Y3B1X3B1dCh2Y3B1KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKHZjcHUtPnNpZ3NldF9hY3RpdmUpCiAJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmdmNwdS0+c2lnc2V0LCAmc2lnc2F2ZWQpOwogCkBAIC02NTcsNiArNjcyLDggQEAKIAkJCQlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90IG9sZCwKIAkJCQlpbnQgdXNlcl9hbGxvYykKIHsKKwlpbnQgaTsKKwogCS8qIEEgZmV3IHNhbml0eSBjaGVja3MuIFdlIGNhbiBoYXZlIGV4YWN0bHkgb25lIG1lbW9yeSBzbG90IHdoaWNoIGhhcwogCSAgIHRvIHN0YXJ0IGF0IGd1ZXN0IHZpcnR1YWwgemVybyBhbmQgd2hpY2ggaGFzIHRvIGJlIGxvY2F0ZWQgYXQgYQogCSAgIHBhZ2UgYm91bmRhcnkgaW4gdXNlcmxhbmQgYW5kIHdoaWNoIGhhcyB0byBlbmQgYXQgYSBwYWdlIGJvdW5kYXJ5LgpAQCAtNjY0LDcgKzY4MSw3IEBACiAJICAgdm1hcy4gSXQgaXMgb2theSB0byBtbWFwKCkgYW5kIG11bm1hcCgpIHN0dWZmIGluIHRoaXMgc2xvdCBhZnRlcgogCSAgIGRvaW5nIHRoaXMgY2FsbCBhdCBhbnkgdGltZSAqLwogCi0JaWYgKG1lbS0+c2xvdCkKKwlpZiAobWVtLT5zbG90IHx8IGt2bS0+YXJjaC5ndWVzdF9tZW1zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChtZW0tPmd1ZXN0X3BoeXNfYWRkcikKQEAgLTY3NiwxNSArNjkzLDM5IEBACiAJaWYgKG1lbS0+bWVtb3J5X3NpemUgJiAoUEFHRV9TSVpFIC0gMSkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKCF1c2VyX2FsbG9jKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGxvY2sgYWxsIHZjcHVzICovCisJZm9yIChpID0gMDsgaSA8IEtWTV9NQVhfVkNQVVM7ICsraSkgeworCQlpZiAoIWt2bS0+dmNwdXNbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKCFtdXRleF90cnlsb2NrKCZrdm0tPnZjcHVzW2ldLT5tdXRleCkpCisJCQlnb3RvIGZhaWxfb3V0OworCX0KKwogCWt2bS0+YXJjaC5ndWVzdF9vcmlnaW4gPSBtZW0tPnVzZXJzcGFjZV9hZGRyOwogCWt2bS0+YXJjaC5ndWVzdF9tZW1zaXplID0gbWVtLT5tZW1vcnlfc2l6ZTsKIAotCS8qIEZJWE1FOiB3ZSBkbyB3YW50IHRvIGludGVycnVwdCBydW5uaW5nIENQVXMgYW5kIHVwZGF0ZSB0aGVpciBtZW1vcnkKLQkgICBjb25maWd1cmF0aW9uIG5vdyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMuIEJ1dCBoZXksIGNoYW5naW5nIHRoZQotCSAgIG1lbW9yeSBsYXlvdXQgd2hpbGUgdmlydHVhbCBDUFVzIGFyZSBydW5uaW5nIGlzIHVzdWFsbHkgYmFkCi0JICAgcHJvZ3JhbW1pbmcgcHJhY3RpY2UuICovCisJLyogdXBkYXRlIHNpZSBjb250cm9sIGJsb2NrcywgYW5kIHVubG9jayBhbGwgdmNwdXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKSB7CisJCWlmIChrdm0tPnZjcHVzW2ldKSB7CisJCQlrdm0tPnZjcHVzW2ldLT5hcmNoLnNpZV9ibG9jay0+Z21zb3IgPQorCQkJCWt2bS0+YXJjaC5ndWVzdF9vcmlnaW47CisJCQlrdm0tPnZjcHVzW2ldLT5hcmNoLnNpZV9ibG9jay0+Z21zbG0gPQorCQkJCWt2bS0+YXJjaC5ndWVzdF9tZW1zaXplICsKKwkJCQlrdm0tPmFyY2guZ3Vlc3Rfb3JpZ2luICsKKwkJCQlWSVJUSU9ERVNDU1BBQ0UgLSAxdWw7CisJCQltdXRleF91bmxvY2soJmt2bS0+dmNwdXNbaV0tPm11dGV4KTsKKwkJfQorCX0KIAogCXJldHVybiAwOworCitmYWlsX291dDoKKwlmb3IgKDsgaSA+PSAwOyBpLS0pCisJCW11dGV4X3VubG9jaygma3ZtLT52Y3B1c1tpXS0+bXV0ZXgpOworCXJldHVybiAtRUlOVkFMOwogfQogCiB2b2lkIGt2bV9hcmNoX2ZsdXNoX3NoYWRvdyhzdHJ1Y3Qga3ZtICprdm0pCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmggYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKaW5kZXggMDBiYmU2OS4uNzQ4ZmVlOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCisrKyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaApAQCAtMTQsNiArMTQsNyBAQAogI2lmbmRlZiBBUkNIX1MzOTBfS1ZNX1MzOTBfSAogI2RlZmluZSBBUkNIX1MzOTBfS1ZNX1MzOTBfSAogCisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgogI2luY2x1ZGUgPGxpbnV4L2t2bV9ob3N0Lmg+CiAKQEAgLTQxLDcgKzQyLDggQEAKIH0KIAogaW50IGt2bV9zMzkwX2hhbmRsZV93YWl0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci12b2lkIGt2bV9zMzkwX2lkbGVfd2FrZXVwKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitlbnVtIGhydGltZXJfcmVzdGFydCBrdm1fczM5MF9pZGxlX3dha2V1cChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwordm9pZCBrdm1fczM5MF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgcGFybSk7CiB2b2lkIGt2bV9zMzkwX2RlbGl2ZXJfcGVuZGluZ19pbnRlcnJ1cHRzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBpbnQga3ZtX3MzOTBfaW5qZWN0X3ZtKHN0cnVjdCBrdm0gKmt2bSwKIAkJc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdCAqczM5MGludCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL3ByaXYuYyBiL2FyY2gvczM5MC9rdm0vcHJpdi5jCmluZGV4IDRiODg4MzQuLjkzZWNkMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vcHJpdi5jCisrKyBiL2FyY2gvczM5MC9rdm0vcHJpdi5jCkBAIC0yMDQsMTEgKzIwNCwxMSBAQAogCWludCBjcHVzID0gMDsKIAlpbnQgbjsKIAotCXNwaW5fbG9ja19iaCgmZmktPmxvY2spOworCXNwaW5fbG9jaygmZmktPmxvY2spOwogCWZvciAobiA9IDA7IG4gPCBLVk1fTUFYX1ZDUFVTOyBuKyspCiAJCWlmIChmaS0+bG9jYWxfaW50W25dKQogCQkJY3B1cysrOwotCXNwaW5fdW5sb2NrX2JoKCZmaS0+bG9jayk7CisJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKIAogCS8qIGRlYWwgd2l0aCBvdGhlciBsZXZlbCAzIGh5cGVydmlzb3JzICovCiAJaWYgKHN0c2kobWVtLCAzLCAyLCAyKSA9PSAtRU5PU1lTKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9zaWdwLmMgYi9hcmNoL3MzOTAva3ZtL3NpZ3AuYwppbmRleCBmMjdkYmVkLi4zNjY3ODgzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL3NpZ3AuYworKysgYi9hcmNoL3MzOTAva3ZtL3NpZ3AuYwpAQCAtNTIsNyArNTIsNyBAQAogCWlmIChjcHVfYWRkciA+PSBLVk1fTUFYX1ZDUFVTKQogCQlyZXR1cm4gMzsgLyogbm90IG9wZXJhdGlvbmFsICovCiAKLQlzcGluX2xvY2tfYmgoJmZpLT5sb2NrKTsKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKIAlpZiAoZmktPmxvY2FsX2ludFtjcHVfYWRkcl0gPT0gTlVMTCkKIAkJcmMgPSAzOyAvKiBub3Qgb3BlcmF0aW9uYWwgKi8KIAllbHNlIGlmIChhdG9taWNfcmVhZChmaS0+bG9jYWxfaW50W2NwdV9hZGRyXS0+Y3B1ZmxhZ3MpCkBAIC02NCw3ICs2NCw3IEBACiAJCSpyZWcgfD0gU0lHUF9TVEFUX1NUT1BQRUQ7CiAJCXJjID0gMTsgLyogc3RhdHVzIHN0b3JlZCAqLwogCX0KLQlzcGluX3VubG9ja19iaCgmZmktPmxvY2spOworCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CiAKIAlWQ1BVX0VWRU5UKHZjcHUsIDQsICJzZW5zZWQgc3RhdHVzIG9mIGNwdSAleCByYyAleCIsIGNwdV9hZGRyLCByYyk7CiAJcmV0dXJuIHJjOwpAQCAtODYsNyArODYsNyBAQAogCiAJaW50aS0+dHlwZSA9IEtWTV9TMzkwX0lOVF9FTUVSR0VOQ1k7CiAKLQlzcGluX2xvY2tfYmgoJmZpLT5sb2NrKTsKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKIAlsaSA9IGZpLT5sb2NhbF9pbnRbY3B1X2FkZHJdOwogCWlmIChsaSA9PSBOVUxMKSB7CiAJCXJjID0gMzsgLyogbm90IG9wZXJhdGlvbmFsICovCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlzcGluX3VubG9ja19iaCgmbGktPmxvY2spOwogCXJjID0gMDsgLyogb3JkZXIgYWNjZXB0ZWQgKi8KIHVubG9jazoKLQlzcGluX3VubG9ja19iaCgmZmktPmxvY2spOworCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CiAJVkNQVV9FVkVOVCh2Y3B1LCA0LCAic2VudCBzaWdwIGVtZXJnIHRvIGNwdSAleCIsIGNwdV9hZGRyKTsKIAlyZXR1cm4gcmM7CiB9CkBAIC0xMjMsNyArMTIzLDcgQEAKIAogCWludGktPnR5cGUgPSBLVk1fUzM5MF9TSUdQX1NUT1A7CiAKLQlzcGluX2xvY2tfYmgoJmZpLT5sb2NrKTsKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKIAlsaSA9IGZpLT5sb2NhbF9pbnRbY3B1X2FkZHJdOwogCWlmIChsaSA9PSBOVUxMKSB7CiAJCXJjID0gMzsgLyogbm90IG9wZXJhdGlvbmFsICovCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlzcGluX3VubG9ja19iaCgmbGktPmxvY2spOwogCXJjID0gMDsgLyogb3JkZXIgYWNjZXB0ZWQgKi8KIHVubG9jazoKLQlzcGluX3VubG9ja19iaCgmZmktPmxvY2spOworCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CiAJVkNQVV9FVkVOVCh2Y3B1LCA0LCAic2VudCBzaWdwIHN0b3AgdG8gY3B1ICV4IiwgY3B1X2FkZHIpOwogCXJldHVybiByYzsKIH0KQEAgLTE4OCw3ICsxODgsNyBAQAogCWlmICghaW50aSkKIAkJcmV0dXJuIDI7IC8qIGJ1c3kgKi8KIAotCXNwaW5fbG9ja19iaCgmZmktPmxvY2spOworCXNwaW5fbG9jaygmZmktPmxvY2spOwogCWxpID0gZmktPmxvY2FsX2ludFtjcHVfYWRkcl07CiAKIAlpZiAoKGNwdV9hZGRyID49IEtWTV9NQVhfVkNQVVMpIHx8IChsaSA9PSBOVUxMKSkgewpAQCAtMjIwLDcgKzIyMCw3IEBACiBvdXRfbGk6CiAJc3Bpbl91bmxvY2tfYmgoJmxpLT5sb2NrKTsKIG91dF9maToKLQlzcGluX3VubG9ja19iaCgmZmktPmxvY2spOworCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggZTczOTBkZC4uNTg2Y2QwNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMTUsNiArMTUsNyBAQAogCXNlbGVjdCBIQVZFX0lPUkVNQVBfUFJPVCBpZiBNTVUKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSwogCXNlbGVjdCBIQVZFX0RNQV9BUElfREVCVUcKKwlzZWxlY3QgUlRDX0xJQgogCWhlbHAKIAkgIFRoZSBTdXBlckggaXMgYSBSSVNDIHByb2Nlc3NvciB0YXJnZXRlZCBmb3IgdXNlIGluIGVtYmVkZGVkIHN5c3RlbXMKIAkgIGFuZCBjb25zdW1lciBlbGVjdHJvbmljczsgaXQgd2FzIGFsc28gdXNlZCBpbiB0aGUgU2VnYSBEcmVhbWNhc3QKQEAgLTc0LDE0ICs3NSwxOCBAQAogCWJvb2wKIAogY29uZmlnIEdFTkVSSUNfVElNRQotCWRlZl9ib29sIG4KKwlkZWZfYm9vbCB5CiAKIGNvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCi0JZGVmX2Jvb2wgbgorCWRlZl9ib29sIHkKIAogY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCiAJYm9vbAogCitjb25maWcgR0VORVJJQ19DTU9TX1VQREFURQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFNIX1NIMDMgfHwgU0hfRFJFQU1DQVNUCisKIGNvbmZpZyBHRU5FUklDX0xPQ0tCUkVBSwogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFNNUCAmJiBQUkVFTVBUCkBAIC0xMTIsNiArMTE3LDEyIEBACiBjb25maWcgU1lTX1NVUFBPUlRTX0NNVAogCWJvb2wKIAorY29uZmlnIFNZU19TVVBQT1JUU19NVFUyCisJYm9vbAorCitjb25maWcgU1lTX1NVUFBPUlRTX1RNVQorCWJvb2wKKwogY29uZmlnIFNUQUNLVFJBQ0VfU1VQUE9SVAogCWRlZl9ib29sIHkKIApAQCAtMTU3LDEzICsxNjgsMTQgQEAKIAlib29sCiAJc2VsZWN0IENQVV9IQVNfSU5URVZUCiAJc2VsZWN0IENQVV9IQVNfU1JfUkIKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1RNVQogCiBjb25maWcgQ1BVX1NINAogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19JTlRFVlQKIAlzZWxlY3QgQ1BVX0hBU19TUl9SQgotCXNlbGVjdCBDUFVfSEFTX1BURUEgaWYgIUNQVV9TSDRBIHx8IENQVV9TSFgyCiAJc2VsZWN0IENQVV9IQVNfRlBVIGlmICFDUFVfU0g0QUxfRFNQCisJc2VsZWN0IFNZU19TVVBQT1JUU19UTVUKIAogY29uZmlnIENQVV9TSDRBCiAJYm9vbApAQCAtMTc3LDYgKzE4OSw3IEBACiBjb25maWcgQ1BVX1NINQogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19GUFUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX1RNVQogCiBjb25maWcgQ1BVX1NIWDIKIAlib29sCkBAIC0yMTAsMjcgKzIyMywzMiBAQAogCWJvb2wgIlN1cHBvcnQgU0g3MjAxIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMkEKIAlzZWxlY3QgQ1BVX0hBU19GUFUKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX01UVTIKICAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDcyMDMKIAlib29sICJTdXBwb3J0IFNINzIwMyBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDJBCiAJc2VsZWN0IENQVV9IQVNfRlBVCiAJc2VsZWN0IFNZU19TVVBQT1JUU19DTVQKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX01UVTIKIAogY29uZmlnIENQVV9TVUJUWVBFX1NINzIwNgogCWJvb2wgIlN1cHBvcnQgU0g3MjA2IHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMkEKIAlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3MjYzCiAJYm9vbCAiU3VwcG9ydCBTSDcyNjMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQogCXNlbGVjdCBDUFVfSEFTX0ZQVQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCisJc2VsZWN0IFNZU19TVVBQT1JUU19NVFUyCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9NWEcKIAlib29sICJTdXBwb3J0IE1YLUcgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gyQQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfTVRVMgogCWhlbHAKIAkgIFNlbGVjdCBNWC1HIGlmIHJ1bm5pbmcgb24gYW4gUjhBMDMwMjJCRyBwYXJ0LgogCkBAIC0yODMsNiArMzAxLDcgQEAKIAlib29sICJTdXBwb3J0IFNINzcyMCBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDMKIAlzZWxlY3QgQ1BVX0hBU19EU1AKKwlzZWxlY3QgU1lTX1NVUFBPUlRTX0NNVAogCWhlbHAKIAkgIFNlbGVjdCBTSDc3MjAgaWYgeW91IGhhdmUgYSBTSDMtRFNQIFNINzcyMCBDUFUuCiAKQEAgLTI5MCw2ICszMDksNyBAQAogCWJvb2wgIlN1cHBvcnQgU0g3NzIxIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NIMwogCXNlbGVjdCBDUFVfSEFTX0RTUAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCiAJaGVscAogCSAgU2VsZWN0IFNINzcyMSBpZiB5b3UgaGF2ZSBhIFNIMy1EU1AgU0g3NzIxIENQVS4KIApAQCAtMzQ3LDYgKzM2NywxNiBAQAogCWhlbHAKIAkgIFNlbGVjdCBTSDc3MjMgaWYgeW91IGhhdmUgYW4gU0gtTW9iaWxlUjIgQ1BVLgogCitjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzI0CisJYm9vbCAiU3VwcG9ydCBTSDc3MjQgcHJvY2Vzc29yIgorCXNlbGVjdCBDUFVfU0g0QQorCXNlbGVjdCBDUFVfU0hYMgorCXNlbGVjdCBBUkNIX1NITU9CSUxFCisJc2VsZWN0IEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQorCXNlbGVjdCBTWVNfU1VQUE9SVFNfQ01UCisJaGVscAorCSAgU2VsZWN0IFNINzcyNCBpZiB5b3UgaGF2ZSBhbiBTSC1Nb2JpbGVSMlIgQ1BVLgorCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzYzCiAJYm9vbCAiU3VwcG9ydCBTSDc3NjMgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0QQpAQCAtNDQyLDQ4ICs0NzIsMjYgQEAKIAogbWVudSAiVGltZXIgYW5kIGNsb2NrIGNvbmZpZ3VyYXRpb24iCiAKLWNvbmZpZyBTSF9UTVUKLQlib29sICJUTVUgdGltZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENQVV9TSDMgfHwgQ1BVX1NINAotCWRlZmF1bHQgeQotCXNlbGVjdCBHRU5FUklDX1RJTUUKLQlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwotCWhlbHAKLQkgIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIHRoZSBUTVUgYXMgdGhlIHN5c3RlbSB0aW1lci4KLQotY29uZmlnIFNIX0NNVAotCWJvb2wgIkNNVCB0aW1lciBzdXBwb3J0IgotCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX0NNVCAmJiBDUFVfU0gyCitjb25maWcgU0hfVElNRVJfVE1VCisJYm9vbCAiVE1VIHRpbWVyIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19UTVUKIAlkZWZhdWx0IHkKIAloZWxwCi0JICBUaGlzIGVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgQ01UIGFzIHRoZSBzeXN0ZW0gdGltZXIuCisJICBUaGlzIGVuYWJsZXMgdGhlIGJ1aWxkIG9mIHRoZSBUTVUgdGltZXIgZHJpdmVyLgogCi0jCi0jIFN1cHBvcnQgZm9yIHRoZSBuZXctc3R5bGUgQ01UIGRyaXZlci4gVGhpcyB3aWxsIHJlcGxhY2UgU0hfQ01UCi0jIG9uY2UgaXRzIG90aGVyIGRlcGVuZGVuY2llcyBhcmUgbWVyZ2VkLgotIwogY29uZmlnIFNIX1RJTUVSX0NNVAotCWJvb2wgIkNNVCBjbG9ja2V2ZW50cyBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTWVNfU1VQUE9SVFNfQ01UICYmICFTSF9DTVQKLQlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwotCi1jb25maWcgU0hfTVRVMgotCWJvb2wgIk1UVTIgdGltZXIgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENQVV9TSDJBCisJYm9vbCAiQ01UIHRpbWVyIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19DTVQKIAlkZWZhdWx0IHkKIAloZWxwCi0JICBUaGlzIGVuYWJsZXMgdGhlIHVzZSBvZiB0aGUgTVRVMiBhcyB0aGUgc3lzdGVtIHRpbWVyLgorCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIHRoZSBDTVQgdGltZXIgZHJpdmVyLgogCi1jb25maWcgU0hfVElNRVJfSVJRCi0JaW50Ci0JZGVmYXVsdCAiMjgiIGlmIENQVV9TVUJUWVBFX1NINzc4MCB8fCBDUFVfU1VCVFlQRV9TSDc3ODUgfHwgXAotCQkJQ1BVX1NVQlRZUEVfU0g3NzYzCi0JZGVmYXVsdCAiODYiIGlmIENQVV9TVUJUWVBFX1NINzYxOQotCWRlZmF1bHQgIjE0MCIgaWYgQ1BVX1NVQlRZUEVfU0g3MjA2Ci0JZGVmYXVsdCAiMTQyIiBpZiBDUFVfU1VCVFlQRV9TSDcyMDMgJiYgU0hfQ01UCi0JZGVmYXVsdCAiMTUzIiBpZiBDUFVfU1VCVFlQRV9TSDcyMDMgJiYgU0hfTVRVMgotCWRlZmF1bHQgIjIzOCIgaWYgQ1BVX1NVQlRZUEVfTVhHCi0JZGVmYXVsdCAiMTYiCitjb25maWcgU0hfVElNRVJfTVRVMgorCWJvb2wgIk1UVTIgdGltZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gU1lTX1NVUFBPUlRTX01UVTIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgdGhlIE1UVTIgdGltZXIgZHJpdmVyLgogCiBjb25maWcgU0hfUENMS19GUkVRCiAJaW50ICJQZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeSAoaW4gSHopIgpAQCAtNDk0LDcgKzUwMiw3IEBACiAJCQkgICAgICBDUFVfU1VCVFlQRV9TSDc3NjAgfHwgQ1BVX1NVQlRZUEVfU0g3NzA1IHx8IFwKIAkJCSAgICAgIENQVV9TVUJUWVBFX1NINzIwMyB8fCBDUFVfU1VCVFlQRV9TSDcyMDYgfHwgXAogCQkJICAgICAgQ1BVX1NVQlRZUEVfU0g3MjYzIHx8IENQVV9TVUJUWVBFX01YRyAgICB8fCBcCi0JCQkgICAgICBDUFVfU1VCVFlQRV9TSDc3ODYKKwkJCSAgICAgIENQVV9TVUJUWVBFX1NINzc4NiB8fCBDUFVfU1VCVFlQRV9TSDc3MjQKIAlkZWZhdWx0ICI2MDAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzUxIHx8IENQVV9TVUJUWVBFX1NINzc1MVIKIAlkZWZhdWx0ICI2NjAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g0XzIwMgogCWRlZmF1bHQgIjUwMDAwMDAwIgpAQCAtNTAzLDYgKzUxMSwxMyBAQAogCSAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGRldGVybWluaW5nIHRoZSByZWZlcmVuY2UgY2xvY2sgdmFsdWUgb24KIAkgIHBsYXRmb3JtcyBsYWNraW5nIGFuIFJUQy4KIAorY29uZmlnIFNIX0NMS19DUEcKKwlkZWZfYm9vbCB5CisKK2NvbmZpZyBTSF9DTEtfQ1BHX0xFR0FDWQorCWRlcGVuZHMgb24gU0hfQ0xLX0NQRworCWRlZl9ib29sIHkgaWYgIUNQVV9TVUJUWVBFX1NINzc4NSAmJiAhQVJDSF9TSE1PQklMRQorCiBjb25maWcgU0hfQ0xLX01ECiAJaW50ICJDUFUgTW9kZSBQaW4gU2V0dGluZyIKIAlkZXBlbmRzIG9uIENQVV9TSDIKQEAgLTY2MywyNyArNjc4LDU0IEBACiAJICBMTFNDLCB0aGlzIHNob3VsZCBiZSBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvdGhlciBhbHRlcm5hdGl2ZSBvZgogCSAgZGlzYWJsaW5nIGludGVycnVwdHMgYXJvdW5kIHRoZSBhdG9taWMgc2VxdWVuY2UuCiAKK2NvbmZpZyBTUEFSU0VfSVJRCisJYm9vbCAiU3VwcG9ydCBzcGFyc2UgaXJxIG51bWJlcmluZyIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciBzcGFyc2UgaXJxcy4gVGhpcyBpcyB1c2VmdWwgaW4gZ2VuZXJhbAorCSAgYXMgbW9zdCBDUFVzIGhhdmUgYSBmYWlybHkgc3BhcnNlIGFycmF5IG9mIElSUSB2ZWN0b3JzLCB3aGljaAorCSAgdGhlIGlycV9kZXNjIHRoZW4gbWFwcyBkaXJlY3RseSBvbiB0by4gU3lzdGVtcyB3aXRoIGEgaGlnaAorCSAgbnVtYmVyIG9mIG9mZi1jaGlwIElSUXMgd2lsbCB3YW50IHRvIHRyZWF0IHRoaXMgYXMKKwkgIGV4cGVyaW1lbnRhbCB1bnRpbCB0aGV5IGhhdmUgYmVlbiBpbmRlcGVuZGVudGx5IHZlcmlmaWVkLgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgorCiBlbmRtZW51CiAKIG1lbnUgIkJvb3Qgb3B0aW9ucyIKIAogY29uZmlnIFpFUk9fUEFHRV9PRkZTRVQKLQloZXggIlplcm8gcGFnZSBvZmZzZXQiCi0JZGVmYXVsdCAiMHgwMDAwNDAwMCIgaWYgU0hfU0gwMwotCWRlZmF1bHQgIjB4MDAwMTAwMDAiIGlmIFBBR0VfU0laRV82NEtCCisJaGV4CisJZGVmYXVsdCAiMHgwMDAxMDAwMCIgaWYgUEFHRV9TSVpFXzY0S0IgfHwgU0hfUlRTNzc1MVIyRCB8fCBcCisJCQkJU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUKKwlkZWZhdWx0ICIweDAwMDA0MDAwIiBpZiBQQUdFX1NJWkVfMTZLQiB8fCBTSF9TSDAzCiAJZGVmYXVsdCAiMHgwMDAwMjAwMCIgaWYgUEFHRV9TSVpFXzhLQgogCWRlZmF1bHQgIjB4MDAwMDEwMDAiCiAJaGVscAogCSAgVGhpcyBzZXRzIHRoZSBkZWZhdWx0IG9mZnNldCBvZiB6ZXJvIHBhZ2UuCiAKIGNvbmZpZyBCT09UX0xJTktfT0ZGU0VUCi0JaGV4ICJMaW5rIGFkZHJlc3Mgb2Zmc2V0IGZvciBib290aW5nIgorCWhleAorCWRlZmF1bHQgIjB4MDAyMTAwMDAiIGlmIFNIX1NITUlOCisJZGVmYXVsdCAiMHgwMDQwMDAwMCIgaWYgU0hfQ0FZTUFOCisJZGVmYXVsdCAiMHgwMDgxMDAwMCIgaWYgU0hfNzc4MF9TT0xVVElPTl9FTkdJTkUKKwlkZWZhdWx0ICIweDAwOWUwMDAwIiBpZiBTSF9USVRBTgorCWRlZmF1bHQgIjB4MDE4MDAwMDAiIGlmIFNIX1NESzc3ODAKKwlkZWZhdWx0ICIweDAyMDAwMDAwIiBpZiBTSF9FRE9TSzc3NjAKIAlkZWZhdWx0ICIweDAwODAwMDAwIgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBsaW5rIGFkZHJlc3Mgb2Zmc2V0IG9mIHRoZSB6SW1hZ2UuCiAJICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSBvbiBhIGJvYXJkIHdoaWNoIGhhcyBhIHNtYWxsIGFtb3VudCBvZgogCSAgbWVtb3J5LgogCitjb25maWcgRU5UUllfT0ZGU0VUCisJaGV4CisJZGVmYXVsdCAiMHgwMDAwMTAwMCIgaWYgUEFHRV9TSVpFXzRLQgorCWRlZmF1bHQgIjB4MDAwMDIwMDAiIGlmIFBBR0VfU0laRV84S0IKKwlkZWZhdWx0ICIweDAwMDA0MDAwIiBpZiBQQUdFX1NJWkVfMTZLQgorCWRlZmF1bHQgIjB4MDAwMTAwMDAiIGlmIFBBR0VfU0laRV82NEtCCisJZGVmYXVsdCAiMHgwMDAwMDAwMCIKKwogY29uZmlnIFVCQ19XQUtFVVAKIAlib29sICJXYWtldXAgVUJDIG9uIHN0YXJ0dXAiCiAJZGVwZW5kcyBvbiBDUFVfU0g0ICYmICFDUFVfU0g0QQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnLmNwdSBiL2FyY2gvc2gvS2NvbmZpZy5jcHUKaW5kZXggYzdkNzA0My4uY2Q2ZTNlYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnLmNwdQorKysgYi9hcmNoL3NoL0tjb25maWcuY3B1CkBAIC03NiwxMSArNzYsNiBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgU0g2NF9VU0VSX01JU0FMSUdORURfRklYVVAKLQlkZWZfYm9vbCB5Ci0JcHJvbXB0ICJGaXh1cCBtaXNhbGlnbmVkIGxvYWRzL3N0b3JlcyBvY2N1cnJpbmcgaW4gdXNlciBtb2RlIgotCWRlcGVuZHMgb24gU1VQRVJINjQKLQogY29uZmlnIFNINjRfSUQyODE1X1dPUktBUk9VTkQKIAlib29sICJJbmNsdWRlIHdvcmthcm91bmQgZm9yIFNINS0xMDEgY3V0MiBzaWxpY29uIGRlZmVjdCBJRDI4MTUiCiAJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDVfMTAxCkBAIC0xMDEsOSArOTYsNiBAQAogCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vc2gvcmVnaXN0ZXItYmFua3MudHh0PiBmb3IgZnVydGhlcgogCSAgaW5mb3JtYXRpb24gb24gU1IuUkIgYW5kIHJlZ2lzdGVyIGJhbmtpbmcgaW4gdGhlIGtlcm5lbCBpbiBnZW5lcmFsLgogCi1jb25maWcgQ1BVX0hBU19QVEVBCi0JYm9vbAotCiBjb25maWcgQ1BVX0hBU19QVEVBRVgKIAlib29sCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZwppbmRleCAwZDYyNjgxLi44MTc5Y2M5IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9zaC9LY29uZmlnLmRlYnVnCkBAIC0zOCwxMCArMzgsMTAgQEAKIAlkZWZhdWx0ICIweGZmZTAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3ODAgfHwgQ1BVX1NVQlRZUEVfU0g3NzYzIHx8IFwKIAkJCQlDUFVfU1VCVFlQRV9TSDc3MjIgfHwgQ1BVX1NVQlRZUEVfU0g3MzY2IHx8IFwKIAkJCQlDUFVfU1VCVFlQRV9TSDczNDMKLQlkZWZhdWx0ICIweGZmZTgwMDAwIiBpZiBDUFVfU0g0CiAJZGVmYXVsdCAiMHhmZmVhMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3Nzg1CiAJZGVmYXVsdCAiMHhmZmZlODAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MjAzCiAJZGVmYXVsdCAiMHhmZmZlOTgwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MjA2IHx8IENQVV9TVUJUWVBFX1NINzI2MworCWRlZmF1bHQgIjB4ZmZlODAwMDAiIGlmIENQVV9TSDQKIAlkZWZhdWx0ICIweDAwMDAwMDAwIgogCiBjb25maWcgRUFSTFlfUFJJTlRLCkBAIC05Miw3ICs5Miw3IEBACiAKIGNvbmZpZyBJUlFTVEFDS1MKIAlib29sICJVc2Ugc2VwYXJhdGUga2VybmVsIHN0YWNrcyB3aGVuIHByb2Nlc3NpbmcgaW50ZXJydXB0cyIKLQlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBTVVBFUkgzMgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFNVUEVSSDMyICYmIEJST0tFTgogCWhlbHAKIAkgIElmIHlvdSBzYXkgWSBoZXJlIHRoZSBrZXJuZWwgd2lsbCB1c2Ugc2VwYXJhdGUga2VybmVsIHN0YWNrcwogCSAgZm9yIGhhbmRsaW5nIGhhcmQgYW5kIHNvZnQgaW50ZXJydXB0cy4gIFRoaXMgY2FuIGhlbHAgYXZvaWQKQEAgLTEyMiwyNyArMTIyLDggQEAKIAkgIEZvciBhbGwgb3RoZXIgY2FzZXMsIHNheSBOLiBJZiB0aGlzIG9wdGlvbiBzZWVtcyBwZXJwbGV4aW5nLCBvcgogCSAgeW91IGFyZW4ndCBzdXJlLCBzYXkgTi4KIAotY29uZmlnIE1PUkVfQ09NUElMRV9PUFRJT05TCi0JYm9vbCAiQWRkIGFueSBhZGRpdGlvbmFsIGNvbXBpbGUgb3B0aW9ucyIKLQloZWxwCi0JICBJZiB5b3Ugd2FudCB0byBhZGQgYWRkaXRpb25hbCBDRkxBR1MgdG8gdGhlIGtlcm5lbCBidWlsZCwgZW5hYmxlIHRoaXMKLQkgIG9wdGlvbiBhbmQgdGhlbiBlbnRlciB3aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGFkZCBpbiB0aGUgbmV4dCBxdWVzdGlvbi4KLQkgIE5vdGUgaG93ZXZlciB0aGF0IC1nIGlzIGFscmVhZHkgYXBwZW5kZWQgd2l0aCB0aGUgc2VsZWN0aW9uIG9mIEtHREIuCi0KLWNvbmZpZyBDT01QSUxFX09QVElPTlMKLQlzdHJpbmcgIkFkZGl0aW9uYWwgY29tcGlsZSBhcmd1bWVudHMiCi0JZGVwZW5kcyBvbiBNT1JFX0NPTVBJTEVfT1BUSU9OUwotCiBjb25maWcgU0g2NF9TUl9XQVRDSAogCWJvb2wgIkRlYnVnOiBzZXQgU1IuV0FUQ0ggdG8gZW5hYmxlIGhhcmR3YXJlIHdhdGNocG9pbnRzIGFuZCB0cmFjZSIKIAlkZXBlbmRzIG9uIFNVUEVSSDY0CiAKLWNvbmZpZyBQT09SX01BTlNfU1RSQUNFCi0JYm9vbCAiRGVidWc6IGVuYWJsZSBydWRpbWVudGFyeSBzdHJhY2UgZmFjaWxpdHkiCi0JZGVwZW5kcyBvbiBTVVBFUkg2NAotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFsbG93cyBzeXN0ZW0gY2FsbHMgdG8gYmUgdHJhY2VkIHRvIHRoZSBjb25zb2xlLiAgSXQgYWxzbwotCSAgYWlkcyBpbiBkZXRlY3Rpbmcga2VybmVsIHN0YWNrIHVuZGVyZmxvdy4gIEl0IGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0JICBlYXJseS11c2VybGFuZCBwcm9ibGVtcyAoZS5nLiBpbml0IGluY3VycmluZyBmYXRhbCBleGNlcHRpb25zLikKLQogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggYmVjZTFmNy4uNzVkMDQ5YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9NYWtlZmlsZQpAQCAtNzAsOSArNzAsNiBAQAogY2ZsYWdzLXkJKz0gJChjYWxsIGNjLW9wdGlvbiwtbW5vLWZkcGljKQogY2ZsYWdzLXkJKz0gJChpc2FmbGFncy15KSAtZmZyZWVzdGFuZGluZwogCi1jZmxhZ3MtJChDT05GSUdfTU9SRV9DT01QSUxFX09QVElPTlMpCSs9IFwKLQkkKHNoZWxsIGVjaG8gJChDT05GSUdfQ09NUElMRV9PUFRJT05TKSB8IHNlZCAtZSAncy8iLy9nJykKLQogT0JKQ09QWUZMQUdTCTo9IC1PIGJpbmFyeSAtUiAubm90ZSAtUiAubm90ZS5nbnUuYnVpbGQtaWQgLVIgLmNvbW1lbnQgXAogCQkgICAtUiAuc3RhYiAtUiAuc3RhYnN0ciAtUwogCkBAIC04NSw3ICs4Miw2IEBACiBkZWZhdWx0aW1hZ2UtJChDT05GSUdfU0hfNzYxOV9TT0xVVElPTl9FTkdJTkUpCTo9IHZtbGludXgKIAogIyBTZXQgc29tZSBzZW5zaWJsZSBLYnVpbGQgZGVmYXVsdHMKLUtCVUlMRF9ERUZDT05GSUcJOj0gc2h4M19kZWZjb25maWcKIEtCVUlMRF9JTUFHRQkJOj0gJChkZWZhdWx0aW1hZ2UteSkKIAogIwpAQCAtOTMsMjYgKzg5LDM4IEBACiAjIGVycm9yIG1lc3NhZ2VzIGR1cmluZyBsaW5raW5nLgogIwogaWZkZWYgQ09ORklHX1NVUEVSSDMyCi1VVFNfTUFDSElORQk6PSBzaAotTERGTEFHU192bWxpbnV4CSs9IC1lIF9zdGV4dAorVVRTX01BQ0hJTkUJCTo9IHNoCitCSVRTCQkJOj0gMzIKK0xERkxBR1Nfdm1saW51eAkJKz0gLWUgX3N0ZXh0CitLQlVJTERfREVGQ09ORklHCTo9IHNoeDNfZGVmY29uZmlnCiBlbHNlCi1VVFNfTUFDSElORQk6PSBzaDY0Ci1MREZMQUdTX3ZtbGludXgJKz0gLS1kZWZzeW0gcGh5c19zdGV4dD1fc3RleHQtJChDT05GSUdfUEFHRV9PRkZTRVQpIFwKLQkJICAgLS1kZWZzeW0gcGh5c19zdGV4dF9zaG1lZGlhPXBoeXNfc3RleHQrMSBcCi0JCSAgIC1lIHBoeXNfc3RleHRfc2htZWRpYQorVVRTX01BQ0hJTkUJCTo9IHNoNjQKK0JJVFMJCQk6PSA2NAorTERGTEFHU192bWxpbnV4CQkrPSAtLWRlZnN5bSBwaHlzX3N0ZXh0PV9zdGV4dC0kKENPTkZJR19QQUdFX09GRlNFVCkgXAorCQkJICAgLS1kZWZzeW0gcGh5c19zdGV4dF9zaG1lZGlhPXBoeXNfc3RleHQrMSBcCisJCQkgICAtZSBwaHlzX3N0ZXh0X3NobWVkaWEKK0tCVUlMRF9ERUZDT05GSUcJOj0gY2F5bWFuX2RlZmNvbmZpZworZW5kaWYKKworaWZuZXEgKCQoU1VCQVJDSCksJChBUkNIKSkKKyAgaWZlcSAoJChDUk9TU19DT01QSUxFKSwpCisgICAgQ1JPU1NfQ09NUElMRSA6PSAkKGNhbGwgY2MtY3Jvc3MtcHJlZml4LCAkKFVUU19NQUNISU5FKS1saW51eC0gICQoVVRTX01BQ0hJTkUpLWxpbnV4LWdudS0gICQoVVRTX01BQ0hJTkUpLXVua25vd24tbGludXgtZ251LSkKKyAgZW5kaWYKIGVuZGlmCiAKIGlmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgotTERGTEFHU192bWxpbnV4CQkrPSAtLWRlZnN5bSAnamlmZmllcz1qaWZmaWVzXzY0JworbGQtYmZkCQkJOj0gZWxmMzItJChVVFNfTUFDSElORSktbGludXgKK0xERkxBR1Nfdm1saW51eAkJKz0gLS1kZWZzeW0gJ2ppZmZpZXM9amlmZmllc182NCcgLS1vZm9ybWF0ICQobGQtYmZkKQogTERGTEFHUwkJCSs9IC1FTAogZWxzZQotTERGTEFHU192bWxpbnV4CQkrPSAtLWRlZnN5bSAnamlmZmllcz1qaWZmaWVzXzY0KzQnCitsZC1iZmQJCQk6PSBlbGYzMi0kKFVUU19NQUNISU5FKWJpZy1saW51eAorTERGTEFHU192bWxpbnV4CQkrPSAtLWRlZnN5bSAnamlmZmllcz1qaWZmaWVzXzY0KzQnIC0tb2Zvcm1hdCAkKGxkLWJmZCkKIExERkxBR1MJCQkrPSAtRUIKIGVuZGlmCiAKLWhlYWQteQkJCTo9IGFyY2gvc2gva2VybmVsL2luaXRfdGFzay5vCi1oZWFkLSQoQ09ORklHX1NVUEVSSDMyKQkrPSBhcmNoL3NoL2tlcm5lbC9oZWFkXzMyLm8KLWhlYWQtJChDT05GSUdfU1VQRVJINjQpCSs9IGFyY2gvc2gva2VybmVsL2hlYWRfNjQubworZXhwb3J0IGxkLWJmZCBCSVRTCisKK2hlYWQteQk6PSBhcmNoL3NoL2tlcm5lbC9pbml0X3Rhc2subyBhcmNoL3NoL2tlcm5lbC9oZWFkXyQoQklUUykubwogCiBjb3JlLXkJCQkJKz0gYXJjaC9zaC9rZXJuZWwvIGFyY2gvc2gvbW0vIGFyY2gvc2gvYm9hcmRzLwogY29yZS0kKENPTkZJR19TSF9GUFVfRU1VKQkrPSBhcmNoL3NoL21hdGgtZW11LwpAQCAtMTkzLDEwICsyMDEsMTEgQEAKIAogY29tcHJlc3NlZDogekltYWdlCiAKLWFyY2hwcmVwYXJlOiBtYWtldG9vbHMgYXJjaC9zaC9saWI2NC9zeXNjYWxsdGFiLmgKK2FyY2hwcmVwYXJlOiBtYWtldG9vbHMKIAogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT1hcmNoL3NoL2tlcm5lbC92c3lzY2FsbAogCiBkZWZpbmUgYXJjaGhlbHAKIAlAZWNobyAnKiB6SW1hZ2UgCSAgICAgICAgICAgLSBDb21wcmVzc2VkIGtlcm5lbCBpbWFnZScKQEAgLTIwNSwzNCArMjE0LDQgQEAKIAlAZWNobyAnICB1SW1hZ2Uuc3JlYyAgCSAgICAgICAgICAgLSBDcmVhdGUgYW4gUy1yZWNvcmQgZm9yIFUtQm9vdCcKIGVuZGVmCiAKLWRlZmluZSBmaWxlY2hrX2dlbi1zeXNjYWxsdGFiCi0gICAgICAgKHNldCAtZTsgXAotCWVjaG8gIi8qIjsgXAotCWVjaG8gIiAqIERPIE5PVCBNT0RJRlkuIjsgXAotCWVjaG8gIiAqIjsgXAotCWVjaG8gIiAqIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFyY2gvc2gvTWFrZWZpbGUiOyBcCi0JZWNobyAiICogQW55IGNoYW5nZXMgd2lsbCBiZSByZXZlcnRlZCBhdCBidWlsZCB0aW1lLiI7IFwKLQllY2hvICIgKi8iOyBcCi0JZWNobyAiIjsgXAotCWVjaG8gIiNpZm5kZWYgX19TWVNDQUxMVEFCX0giOyBcCi0JZWNobyAiI2RlZmluZSBfX1NZU0NBTExUQUJfSCI7IFwKLQllY2hvICIiOyBcCi0JZWNobyAiI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiI7IFwKLQllY2hvICIiOyBcCi0JZWNobyAic3RydWN0IHN5c2NhbGxfaW5mbyB7IjsgXAotCWVjaG8gIgljb25zdCBjaGFyICpuYW1lOyI7IFwKLQllY2hvICJ9IHN5c2NhbGxfaW5mb190YWJsZVtdID0geyI7IFwKLQlzZWQgLWUgJy9eLipcLmxvbmcgLyFkO3MvLwl7ICIvO3MvXChcKFteL10qXClcL1wpXHsxXH0uKi9cMi87IFwKLQkJcy9bIFx0XSokJC8vZztzLyQkLyIgfSwvO3MvXCgiXClzeXNfL1wxL2cnOyBcCi0JZWNobyAifTsiOyBcCi0JZWNobyAiIjsgXAotCWVjaG8gIiNkZWZpbmUgTlVNX1NZU0NBTExfSU5GT19FTlRSSUVTIEFSUkFZX1NJWkUoc3lzY2FsbF9pbmZvX3RhYmxlKSI7XAotCWVjaG8gIiI7IFwKLQllY2hvICIjZW5kaWYgLyogX19TWVNDQUxMVEFCX0ggKi8iICkKLWVuZGVmCi0KLWFyY2gvc2gvbGliNjQvc3lzY2FsbHRhYi5oOiBhcmNoL3NoL2tlcm5lbC9zeXNjYWxsc182NC5TCi0JJChjYWxsIGZpbGVjaGssZ2VuLXN5c2NhbGx0YWIpCi0KLUNMRUFOX0ZJTEVTICs9IGFyY2gvc2gvbGliNjQvc3lzY2FsbHRhYi5oIFwKLQkgICAgICAgaW5jbHVkZS9hc20tc2gvbWFjaHR5cGVzLmgKK0NMRUFOX0ZJTEVTICs9IGluY2x1ZGUvYXNtLXNoL21hY2h0eXBlcy5oCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9LY29uZmlnIGIvYXJjaC9zaC9ib2FyZHMvS2NvbmZpZwppbmRleCBkY2MxYWY4Li4xYzkxYjFmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9LY29uZmlnCisrKyBiL2FyY2gvc2gvYm9hcmRzL0tjb25maWcKQEAgLTQ2LDYgKzQ2LDE1IEBACiAJICBTZWxlY3QgNzcyMiBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcyCiAJICBldmFsdWF0aW9uIGJvYXJkLgogCitjb25maWcgU0hfNzcyNF9TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTc3MjQiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzI0CisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJaGVscAorCSAgU2VsZWN0IDc3MjQgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDc3MjQKKwkgIGV2YWx1YXRpb24gYm9hcmQuCisKIGNvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQogCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKIAlzZWxlY3QgU09MVVRJT05fRU5HSU5FCkBAIC0xMjEsNyArMTMwLDcgQEAKIAlib29sICJSVFM3NzUxUjJEIgogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzUxUgogCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCi0Jc2VsZWN0IElPX1RSQVBQRUQKKwlzZWxlY3QgSU9fVFJBUFBFRCBpZiBNTVUKIAloZWxwCiAJICBTZWxlY3QgUlRTNzc1MVIyRCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKIAkgIFNhbGVzIFNILUdyYXBoaWNzIGJvYXJkLgpAQCAtMTQ1LDEzICsxNTQsMTMgQEAKIAlib29sICJIaWdobGFuZGVyIgogCWRlcGVuZHMgb24gQ1BVX1NVQlRZUEVfU0g3NzgwIHx8IENQVV9TVUJUWVBFX1NINzc4NQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCi0Jc2VsZWN0IElPX1RSQVBQRUQKKwlzZWxlY3QgSU9fVFJBUFBFRCBpZiBNTVUKIAogY29uZmlnIFNIX1NINzc4NUxDUgogCWJvb2wgIlNINzc4NUxDUiIKIAlkZXBlbmRzIG9uIENQVV9TVUJUWVBFX1NINzc4NQogCXNlbGVjdCBTWVNfU1VQUE9SVFNfUENJCi0Jc2VsZWN0IElPX1RSQVBQRUQKKwlzZWxlY3QgSU9fVFJBUFBFRCBpZiBNTVUKIAogY29uZmlnIFNIX1NINzc4NUxDUl8yOUJJVF9QSFlTTUFQUwogCWJvb2wgIlNINzc4NUxDUiAyOWJpdCBwaHlzbWFwcyIKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwMzI1cnhhLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcDMyNXJ4YS5jCmluZGV4IGYyYTI5NjQuLjFjNGQ4M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwMzI1cnhhLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXAzMjVyeGEuYwpAQCAtNTM1LDYgKzUzNSwxOCBAQAogfQogZGV2aWNlX2luaXRjYWxsKGFwMzI1cnhhX2RldmljZXNfc2V0dXApOwogCisvKiBSZXR1cm4gdGhlIGJvYXJkIHNwZWNpZmljIGJvb3QgbW9kZSBwaW4gY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBhcDMyNXJ4YV9tb2RlX3BpbnModm9pZCkKK3sKKwkvKiBNRDA9MCwgTUQxPTAsIE1EMj0wOiBDbG9jayBNb2RlIDAKKwkgKiBNRDM9MDogMTYtYml0IEFyZWEwIEJ1cyBXaWR0aAorCSAqIE1ENT0xOiBMaXR0bGUgRW5kaWFuCisJICogVFNUTUQ9MSwgTUQ4PTE6IFRlc3QgTW9kZSBEaXNhYmxlZAorCSAqLworCXJldHVybiBNT0RFX1BJTjUgfCBNT0RFX1BJTjg7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfYXAzMjVyeGEgX19pbml0bXYgPSB7CiAJLm12X25hbWUgPSAiQVAtMzI1UlhBIiwKKwkubXZfbW9kZV9waW5zID0gYXAzMjVyeGFfbW9kZV9waW5zLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc4NWxjci5jIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3Nzg1bGNyLmMKaW5kZXggNmY5NGYxNy4uN2JlNTZmYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3Nzg1bGNyLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3Nzg1bGNyLmMKQEAgLTIsMTIgKzIsMTIgQEAKICAqIFJlbmVzYXMgVGVjaG5vbG9neSBDb3JwLiBSMFA3Nzg1TEMwMDExUkwgU3VwcG9ydC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggIFlvc2hpaGlybyBTaGltb2RhCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtNTAxLmg+CkBAIC0xOSw4ICsxOSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy1wY2EtcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1wY2EuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaGVhcnRiZWF0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxtYWNoL3NoNzc4NWxjci5oPgorI2luY2x1ZGUgPGFzbS9oZWFydGJlYXQuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxjcHUvc2g3Nzg1Lmg+CiAKIC8qCiAgKiBOT1RFOiBUaGlzIGJvYXJkIGhhcyAyIHBoeXNpY2FsIG1lbW9yeSBtYXBzLgpAQCAtMjczLDYgKzI3NywyMCBAQAogCXBsYXRfaXJxX3NldHVwX3BpbnMoSVJRX01PREVfSVJRMzIxMCk7CiB9CiAKK3N0YXRpYyBpbnQgc2g3Nzg1bGNyX2Nsa19pbml0KHZvaWQpCit7CisJc3RydWN0IGNsayAqY2xrOworCWludCByZXQ7CisKKwljbGsgPSBjbGtfZ2V0KE5VTEwsICJleHRhbCIpOworCWlmICghY2xrIHx8IElTX0VSUihjbGspKQorCQlyZXR1cm4gUFRSX0VSUihjbGspOworCXJldCA9IGNsa19zZXRfcmF0ZShjbGssIDMzMzMzMzMzKTsKKwljbGtfcHV0KGNsayk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBzaDc3ODVsY3JfcG93ZXJfb2ZmKHZvaWQpCiB7CiAJdW5zaWduZWQgY2hhciAqcDsKQEAgLTMwMywxMiArMzIxLDM0IEBACiAJd3JpdGVsKDB4MDAwMzA3YzIsIHNtNTAxX3JlZyk7CiB9CiAKKy8qIFJldHVybiB0aGUgYm9hcmQgc3BlY2lmaWMgYm9vdCBtb2RlIHBpbiBjb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IHNoNzc4NWxjcl9tb2RlX3BpbnModm9pZCkKK3sKKwlpbnQgdmFsdWUgPSAwOworCisJLyogVGhlc2UgYXJlIHRoZSBmYWN0b3J5IGRlZmF1bHQgc2V0dGluZ3Mgb2YgUzEgYW5kIFMyLgorCSAqIElmIHlvdSBjaGFuZ2UgdGhlc2UgZGlwIHN3aXRjaGVzIHRoZW4geW91IHdpbGwgbmVlZCB0bworCSAqIGFkanVzdCB0aGUgdmFsdWVzIGJlbG93IGFzIHdlbGwuCisJICovCisJdmFsdWUgfD0gTU9ERV9QSU40OyAvKiBDbG9jayBNb2RlIDE2ICovCisJdmFsdWUgfD0gTU9ERV9QSU41OyAvKiAzMi1iaXQgQXJlYTAgYnVzIHdpZHRoICovCisJdmFsdWUgfD0gTU9ERV9QSU42OyAvKiAzMi1iaXQgQXJlYTAgYnVzIHdpZHRoICovCisJdmFsdWUgfD0gTU9ERV9QSU43OyAvKiBBcmVhIDAgU1JBTSBpbnRlcmZhY2UgW2ZpeGVkXSAqLworCXZhbHVlIHw9IE1PREVfUElOODsgLyogTGl0dGxlIEVuZGlhbiAqLworCXZhbHVlIHw9IE1PREVfUElOOTsgLyogTWFzdGVyIE1vZGUgKi8KKwl2YWx1ZSB8PSBNT0RFX1BJTjE0OyAvKiBObyBQTEwgc3RlcC11cCAqLworCisJcmV0dXJuIHZhbHVlOworfQorCiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2g3Nzg1bGNyIF9faW5pdG12ID0gewogCS5tdl9uYW1lCQk9ICJTSDc3ODVMQ1IiLAogCS5tdl9zZXR1cAkJPSBzaDc3ODVsY3Jfc2V0dXAsCisJLm12X2Nsa19pbml0CQk9IHNoNzc4NWxjcl9jbGtfaW5pdCwKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9zaDc3ODVsY3JfSVJRLAorCS5tdl9tb2RlX3BpbnMJCT0gc2g3Nzg1bGNyX21vZGVfcGlucywKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtY2F5bWFuL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vTWFrZWZpbGUKaW5kZXggY2FmZTFhYzMuLjAwZmEzZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtY2F5bWFuL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtY2F5bWFuL01ha2VmaWxlCkBAIC0xLDQgKzEsNCBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIEhpdGFjaGkgQ2F5bWFuIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKICMKLW9iai15IDo9IHNldHVwLm8gaXJxLm8KK29iai15IDo9IHNldHVwLm8gaXJxLm8gcGFuaWMubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWNheW1hbi9pcnEuYwppbmRleCBkYTYyYWQ1Li4zM2Y3NzA4NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vaXJxLmMKQEAgLTE0MiwyNiArMTQyLDExIEBACiAJcmV0dXJuIGlycTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkKLWludCBjYXltYW5faXJxX2Rlc2NyaWJlKGNoYXIqIHAsIGludCBpcnEpCi17Ci0JaWYgKGlycSA8IE5SX0lOVENfSVJRUykgewotCQlyZXR1cm4gaW50Y19pcnFfZGVzY3JpYmUocCwgaXJxKTsKLQl9IGVsc2UgaWYgKGlycSA8IE5SX0lOVENfSVJRUyArIDgpIHsKLQkJcmV0dXJuIHNwcmludGYocCwgIihTTVNDICVkKSIsIGlycSAtIE5SX0lOVENfSVJRUyk7Ci0JfSBlbHNlIGlmICgoaXJxID49IE5SX0lOVENfSVJRUyArIDI0KSAmJiAoaXJxIDwgTlJfSU5UQ19JUlFTICsgMzIpKSB7Ci0JCXJldHVybiBzcHJpbnRmKHAsICIoUENJMiAlZCkiLCBpcnEgLSAoTlJfSU5UQ19JUlFTICsgMjQpKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiB2b2lkIGluaXRfY2F5bWFuX2lycSh2b2lkKQogewogCWludCBpOwogCi0JZXBsZF92aXJ0ID0gb25jaGlwX3JlbWFwKEVQTERfQkFTRSwgMTAyNCwgIkVQTEQiKTsKKwllcGxkX3ZpcnQgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUoRVBMRF9CQVNFLCAxMDI0KTsKIAlpZiAoIWVwbGRfdmlydCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNheW1hbiBJUlE6IFVuYWJsZSB0byByZW1hcCBFUExEXG4iKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vcGFuaWMuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtY2F5bWFuL3BhbmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlNjczMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtY2F5bWFuL3BhbmljLmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgUmljaGFyZCBDdXJub3csIFN1cGVySCBVSyBMaW1pdGVkCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8Y3B1L3JlZ2lzdGVycy5oPgorCisvKiBUSElTIElTIEEgUEhZU0lDQUwgQUREUkVTUyAqLworI2RlZmluZSBIRFNQMjUzNF9BRERSICgweDA0MDAyMTAwKQorCitzdGF0aWMgdm9pZCBwb29yX21hbnNfZGVsYXkodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTAwMDAwOyBpKyspCisJCWNwdV9yZWxheCgpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3ZhbHVlKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBuaWJibGU7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQluaWJibGUgPSAoKHggPj4gKGkgKiA0KSkgJiAweGYpOworCisJCV9fcmF3X3dyaXRlYihuaWJibGUgKyAoKG5pYmJsZSA+IDkpID8gNTUgOiA0OCksCisJCQkgIEhEU1AyNTM0X0FERFIgKyAweGUwICsgKCg3IC0gaSkgPDwgMikpOworCX0KK30KKwordm9pZAorcGFuaWNfaGFuZGxlcih1bnNpZ25lZCBsb25nIHBhbmljUEMsIHVuc2lnbmVkIGxvbmcgcGFuaWNTU1IsCisJICAgICAgdW5zaWduZWQgbG9uZyBwYW5pY0VYUEVWVCkKK3sKKwl3aGlsZSAoMSkgeworCQkvKiBUaGlzIHBpZWNlIG9mIGNvZGUgZGlzcGxheXMgdGhlIFBDIG9uIHRoZSBMRUQgZGlzcGxheSAqLworCQlzaG93X3ZhbHVlKHBhbmljUEMpOworCQlwb29yX21hbnNfZGVsYXkoKTsKKwkJc2hvd192YWx1ZShwYW5pY1NTUik7CisJCXBvb3JfbWFuc19kZWxheSgpOworCQlzaG93X3ZhbHVlKHBhbmljRVhQRVZUKTsKKwkJcG9vcl9tYW5zX2RlbGF5KCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtY2F5bWFuL3NldHVwLmMKaW5kZXggZTdmOWNjNS4uN2U4MjE2YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1jYXltYW4vc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWNheW1hbi9zZXR1cC5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGRldmlkLCBkZXZyZXY7CiAKLQlzbXNjX3N1cGVyaW9fdmlydCA9IG9uY2hpcF9yZW1hcChTTVNDX1NVUEVSSU9fQkFTRSwgMTAyNCwgIlNNU0MgU3VwZXJJTyIpOworCXNtc2Nfc3VwZXJpb192aXJ0ID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcF9ub2NhY2hlKFNNU0NfU1VQRVJJT19CQVNFLCAxMDI0KTsKIAlpZiAoIXNtc2Nfc3VwZXJpb192aXJ0KSB7CiAJCXBhbmljKCJVbmFibGUgdG8gcmVtYXAgU01TQyBTdXBlcklPXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWRyZWFtY2FzdC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1kcmVhbWNhc3Qvc2V0dXAuYwppbmRleCBkMWJlZTQ4Li5lYmU5OTIyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWRyZWFtY2FzdC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtZHJlYW1jYXN0L3NldHVwLmMKQEAgLTMwLDcgKzMwLDYgQEAKIAogZXh0ZXJuIHN0cnVjdCBpcnFfY2hpcCBzeXN0ZW1hc2ljX2ludDsKIGV4dGVybiB2b2lkIGFpY2FfdGltZV9pbml0KHZvaWQpOwotZXh0ZXJuIGludCBnYXBzcGNpX2luaXQodm9pZCk7CiBleHRlcm4gaW50IHN5c3RlbWFzaWNfaXJxX2RlbXV4KGludCk7CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBkcmVhbWNhc3Rfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKQEAgLTUxLDExICs1MCw2IEBACiAJCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKIAogCWJvYXJkX3RpbWVfaW5pdCA9IGFpY2FfdGltZV9pbml0OwotCi0jaWZkZWYgQ09ORklHX1BDSQotCWlmIChnYXBzcGNpX2luaXQoKSA8IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkdBUFNQQ0kgd2FzIG5vdCBkZXRlY3RlZC5cbiIpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZHJlYW1jYXN0IF9faW5pdG12ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1taWdvci9zZXR1cC5jCmluZGV4IDFlZTFkZTAuLjZlZDQwMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtbWlnb3Ivc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLW1pZ29yL3NldHVwLmMKQEAgLTU4NCwzICs1ODQsMjIgQEAKIAlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMobWlnb3JfZGV2aWNlcywgQVJSQVlfU0laRShtaWdvcl9kZXZpY2VzKSk7CiB9CiBfX2luaXRjYWxsKG1pZ29yX2RldmljZXNfc2V0dXApOworCisvKiBSZXR1cm4gdGhlIGJvYXJkIHNwZWNpZmljIGJvb3QgbW9kZSBwaW4gY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBtaWdvcl9tb2RlX3BpbnModm9pZCkKK3sKKwkvKiBNRDA9MSwgTUQxPTEsIE1EMj0wOiBDbG9jayBNb2RlIDMKKwkgKiBNRDM9MDogMTYtYml0IEFyZWEwIEJ1cyBXaWR0aAorCSAqIE1ENT0xOiBMaXR0bGUgRW5kaWFuCisJICogVFNUTUQ9MSwgTUQ4PTA6IFRlc3QgTW9kZSBEaXNhYmxlZAorCSAqLworCXJldHVybiBNT0RFX1BJTjAgfCBNT0RFX1BJTjEgfCBNT0RFX1BJTjU7Cit9CisKKy8qCisgKiBUaGUgTWFjaGluZSBWZWN0b3IKKyAqLworc3RhdGljIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9taWdvciBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQkJPSAiTWlnby1SIiwKKwkubXZfbW9kZV9waW5zCQk9IG1pZ29yX21vZGVfcGlucywKK307CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXIyZC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1yMmQvc2V0dXAuYwppbmRleCBjNTg1YmUwLi5hNjI1ZWNiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXIyZC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtcjJkL3NldHVwLmMKQEAgLTEwLDYgKzEwLDkgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BhcnRpdGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2F0YV9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtNTAxLmg+CiAjaW5jbHVkZSA8bGludXgvc201MDEtcmVncy5oPgpAQCAtMTgxLDYgKzE4NCw1MCBAQAogCS5yZXNvdXJjZQk9IHNtNTAxX3Jlc291cmNlcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiByMmRfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUJCT0gIlUtQm9vdCIsCisJCS5vZmZzZXQJCT0gMHgwMDAwMDAwMCwKKwkJLnNpemUJCT0gMHgwMDA0MDAwMCwKKwkJLm1hc2tfZmxhZ3MJPSBNVERfV1JJVEVBQkxFLAorCX0sIHsKKwkJLm5hbWUJCT0gIkVudmlyb25tZW50IiwKKwkJLm9mZnNldAkJPSBNVERQQVJUX09GU19OWFRCTEssCisJCS5zaXplCQk9IDB4MDAwNDAwMDAsCisJCS5tYXNrX2ZsYWdzCT0gTVREX1dSSVRFQUJMRSwKKwl9LCB7CisJCS5uYW1lCQk9ICJLZXJuZWwiLAorCQkub2Zmc2V0CQk9IE1URFBBUlRfT0ZTX05YVEJMSywKKwkJLnNpemUJCT0gMHgwMDFjMDAwMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJGbGFzaF9GUyIsCisJCS5vZmZzZXQJCT0gTVREUEFSVF9PRlNfTlhUQkxLLAorCQkuc2l6ZQkJPSBNVERQQVJUX1NJWl9GVUxMLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGZsYXNoX2RhdGEgPSB7CisJLndpZHRoCQk9IDIsCisJLm5yX3BhcnRzCT0gQVJSQVlfU0laRShyMmRfcGFydGl0aW9ucyksCisJLnBhcnRzCQk9IHIyZF9wYXJ0aXRpb25zLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gMHgwMDAwMDAwMCwKKwkuZW5kCQk9IDB4MDIwMDAwMDAsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZmxhc2hfZGV2aWNlID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gLTEsCisJLnJlc291cmNlCT0gJmZsYXNoX3Jlc291cmNlLAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmZmxhc2hfZGF0YSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJ0czc3NTFyMmRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNtNTAxX2RldmljZSwKIAkmaGVhcnRiZWF0X2RldmljZSwKQEAgLTIwMyw2ICsyNTAsOSBAQAogCWlmIChyZWdpc3Rlcl90cmFwcGVkX2lvKCZjZl90cmFwcGVkX2lvKSA9PSAwKQogCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmNmX2lkZV9kZXZpY2UpOwogCisJaWYgKG1hY2hfaXNfcjJkX3BsdXMoKSkKKwkJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZmbGFzaF9kZXZpY2UpOworCiAJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oc3BpX2J1cywgQVJSQVlfU0laRShzcGlfYnVzKSk7CiAKIAlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMocnRzNzc1MXIyZF9kZXZpY2VzLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OWNiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIEhJVEFDSEkgVUwgU29sdXRpb25FbmdpbmUgNzcyNCBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCisjCisjIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisjIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyMgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMKKworb2JqLXkJIDo9IHNldHVwLm8gaXJxLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3MjQvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2Y2YzYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9pcnEuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzc3MjQvaXJxLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUmVuZXNhcyBTb2x1dGlvbnMgQ29ycC4KKyAqCisgKiBLdW5pbm9yaSBNb3JpbW90byA8bW9yaW1vdG8ua3VuaW5vcmlAcmVuZXNhcy5jb20+CisgKgorICogQmFzZWQgb24gIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzc3MjIvaXJxLmMKKyAqIENvcHlyaWdodCAoQykgMjAwNyAgTm9idWhpcm8gSXdhbWF0c3UKKyAqCisgKiBIaXRhY2hpIFVMIFNvbHV0aW9uRW5naW5lIDc3MjQgU3VwcG9ydC4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bWFjaC1zZS9tYWNoL3NlNzcyNC5oPgorCitzdHJ1Y3QgZnBnYV9pcnEgeworCXVuc2lnbmVkIGxvbmcgIHNyYWRkcjsKKwl1bnNpZ25lZCBsb25nICBtcmFkZHI7CisJdW5zaWduZWQgc2hvcnQgbWFzazsKKwl1bnNpZ25lZCBpbnQgICBiYXNlOworfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBmcGdhMmlycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPj0gSVJRMF9CQVNFICYmCisJICAgIGlycSA8PSBJUlEwX0VORCkKKwkJcmV0dXJuIElSUTBfSVJROworCWVsc2UgaWYgKGlycSA+PSBJUlExX0JBU0UgJiYKKwkJIGlycSA8PSBJUlExX0VORCkKKwkJcmV0dXJuIElSUTFfSVJROworCWVsc2UKKwkJcmV0dXJuIElSUTJfSVJROworfQorCitzdGF0aWMgc3RydWN0IGZwZ2FfaXJxIGdldF9mcGdhX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBmcGdhX2lycSBzZXQ7CisKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgSVJRMF9JUlE6CisJCXNldC5zcmFkZHIgPSBJUlEwX1NSOworCQlzZXQubXJhZGRyID0gSVJRMF9NUjsKKwkJc2V0Lm1hc2sgICA9IElSUTBfTUFTSzsKKwkJc2V0LmJhc2UgICA9IElSUTBfQkFTRTsKKwkJYnJlYWs7CisJY2FzZSBJUlExX0lSUToKKwkJc2V0LnNyYWRkciA9IElSUTFfU1I7CisJCXNldC5tcmFkZHIgPSBJUlExX01SOworCQlzZXQubWFzayAgID0gSVJRMV9NQVNLOworCQlzZXQuYmFzZSAgID0gSVJRMV9CQVNFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXQuc3JhZGRyID0gSVJRMl9TUjsKKwkJc2V0Lm1yYWRkciA9IElSUTJfTVI7CisJCXNldC5tYXNrICAgPSBJUlEyX01BU0s7CisJCXNldC5iYXNlICAgPSBJUlEyX0JBU0U7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfc2U3NzI0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBmcGdhX2lycSBzZXQgPSBnZXRfZnBnYV9pcnEoZnBnYTJpcnEoaXJxKSk7CisJdW5zaWduZWQgaW50IGJpdCA9IGlycSAtIHNldC5iYXNlOworCWN0cmxfb3V0dyhjdHJsX2ludyhzZXQubXJhZGRyKSB8IDB4MDAwMSA8PCBiaXQsIHNldC5tcmFkZHIpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfc2U3NzI0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBmcGdhX2lycSBzZXQgPSBnZXRfZnBnYV9pcnEoZnBnYTJpcnEoaXJxKSk7CisJdW5zaWduZWQgaW50IGJpdCA9IGlycSAtIHNldC5iYXNlOworCWN0cmxfb3V0dyhjdHJsX2ludyhzZXQubXJhZGRyKSAmIH4oMHgwMDAxIDw8IGJpdCksIHNldC5tcmFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNlNzcyNF9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lICAgICAgICAgICA9ICJTRTc3MjQtRlBHQSIsCisJLm1hc2sgICAgICAgICAgID0gZGlzYWJsZV9zZTc3MjRfaXJxLAorCS51bm1hc2sgICAgICAgICA9IGVuYWJsZV9zZTc3MjRfaXJxLAorCS5tYXNrX2FjayAgICAgICA9IGRpc2FibGVfc2U3NzI0X2lycSwKK307CisKK3N0YXRpYyB2b2lkIHNlNzcyNF9pcnFfZGVtdXgodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBmcGdhX2lycSBzZXQgPSBnZXRfZnBnYV9pcnEoaXJxKTsKKwl1bnNpZ25lZCBzaG9ydCBpbnR2ID0gY3RybF9pbncoc2V0LnNyYWRkcik7CisJc3RydWN0IGlycV9kZXNjICpleHRfZGVzYzsKKwl1bnNpZ25lZCBpbnQgZXh0X2lycSA9IHNldC5iYXNlOworCisJaW50diAmPSBzZXQubWFzazsKKworCXdoaWxlIChpbnR2KSB7CisJCWlmIChpbnR2ICYgMHgwMDAxKSB7CisJCQlleHRfZGVzYyA9IGlycV9kZXNjICsgZXh0X2lycTsKKwkJCWhhbmRsZV9sZXZlbF9pcnEoZXh0X2lycSwgZXh0X2Rlc2MpOworCQl9CisJCWludHYgPj49IDE7CisJCWV4dF9pcnErKzsKKwl9Cit9CisKKy8qCisgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCisgKi8KK3ZvaWQgX19pbml0IGluaXRfc2U3NzI0X0lSUSh2b2lkKQoreworCWludCBpOworCisJY3RybF9vdXR3KDB4ZmZmZiwgSVJRMF9NUik7ICAvKiBtYXNrIGFsbCAqLworCWN0cmxfb3V0dygweGZmZmYsIElSUTFfTVIpOyAgLyogbWFzayBhbGwgKi8KKwljdHJsX291dHcoMHhmZmZmLCBJUlEyX01SKTsgIC8qIG1hc2sgYWxsICovCisJY3RybF9vdXR3KDB4MDAwMCwgSVJRMF9TUik7ICAvKiBjbGVhciBpcnEgKi8KKwljdHJsX291dHcoMHgwMDAwLCBJUlExX1NSKTsgIC8qIGNsZWFyIGlycSAqLworCWN0cmxfb3V0dygweDAwMDAsIElSUTJfU1IpOyAgLyogY2xlYXIgaXJxICovCisJY3RybF9vdXR3KDB4MDAyYSwgSVJRX01PREUpOyAvKiBzZXQgaXJxIHR5cGUgKi8KKworCWZvciAoaSA9IDA7IGkgPCBTRTc3MjRfRlBHQV9JUlFfTlI7IGkrKykKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoU0U3NzI0X0ZQR0FfSVJRX0JBU0UgKyBpLAorCQkJCQkgICAgICAmc2U3NzI0X2lycV9jaGlwLAorCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKKworCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUTBfSVJRLCBzZTc3MjRfaXJxX2RlbXV4KTsKKwlzZXRfaXJxX3R5cGUoSVJRMF9JUlEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CisKKwlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlExX0lSUSwgc2U3NzI0X2lycV9kZW11eCk7CisJc2V0X2lycV90eXBlKElSUTFfSVJRLCBJUlFfVFlQRV9MRVZFTF9MT1cpOworCisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRMl9JUlEsIHNlNzcyNF9pcnFfZGVtdXgpOworCXNldF9pcnFfdHlwZShJUlEyX0lSUSwgSVJRX1RZUEVfTEVWRUxfTE9XKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzI0L3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMDRiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzcyNC9zZXR1cC5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogbGludXgvYXJjaC9zaC9ib2FyZHMvc2UvNzcyNC9zZXR1cC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKgorICogS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL3BoeXNtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYzkxeC5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPHZpZGVvL3NoX21vYmlsZV9sY2RjLmg+CisjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NldS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oZWFydGJlYXQuaD4KKyNpbmNsdWRlIDxhc20vc2hfa2V5c2MuaD4KKyNpbmNsdWRlIDxjcHUvc2g3NzI0Lmg+CisjaW5jbHVkZSA8bWFjaC1zZS9tYWNoL3NlNzcyNC5oPgorCisvKgorICogU1d4ICAgIDEyMzQgNTY3OAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBTVzMxIDogMTAwMSAxMTAwICAgIDogZGVmYXVsdAorICogU1czMiA6IDAxMTEgMTExMSAgICA6IHVzZSBvbiBib2FyZCBmbGFzaAorICoKKyAqIFNXNDEgOiBhYnh4IHh4eHggIC0+IGEgPSAwIDogQW5hbG9nICBtb25pdG9yCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgMSA6IERpZ2l0YWwgbW9uaXRvcgorICogICAgICAgICAgICAgICAgICAgICAgYiA9IDAgOiBWR0EKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAxIDogU1ZHQQorICovCisKKy8qIEhlYXJ0YmVhdCAqLworc3RhdGljIHN0cnVjdCBoZWFydGJlYXRfZGF0YSBoZWFydGJlYXRfZGF0YSA9IHsKKwkucmVnc2l6ZSA9IDE2LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQgID0gUEFfTEVELAorCQkuZW5kICAgID0gUEFfTEVELAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhlYXJ0YmVhdF9kZXZpY2UgPSB7CisJLm5hbWUgICAgICAgICAgID0gImhlYXJ0YmVhdCIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgPSAmaGVhcnRiZWF0X2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCisvKiBMQU45MUMxMTEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc21jOTF4X3BsYXRkYXRhIHNtYzkxeF9pbmZvID0geworCS5mbGFncyA9IFNNQzkxWF9VU0VfMTZCSVQgfCBTTUM5MVhfTk9XQUlULAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzbWM5MXhfZXRoX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUgICA9ICJTTUM5MUMxMTEiICwKKwkJLnN0YXJ0ICA9IDB4MWEzMDAzMDAsCisJCS5lbmQgICAgPSAweDFhMzAwMzBmLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSBJUlEwX1NNQywKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRIHwgSU9SRVNPVVJDRV9JUlFfSElHSExFVkVMLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzbWM5MXhfZXRoX2RldmljZSA9IHsKKwkubmFtZQk9ICJzbWM5MXgiLAorCS5udW1fcmVzb3VyY2VzICA9IEFSUkFZX1NJWkUoc21jOTF4X2V0aF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZSAgICAgICA9IHNtYzkxeF9ldGhfcmVzb3VyY2VzLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNtYzkxeF9pbmZvLAorCX0sCit9OworCisvKiBNVEQgKi8KK3N0YXRpYyBzdHJ1Y3QgbXRkX3BhcnRpdGlvbiBub3JfZmxhc2hfcGFydGl0aW9uc1tdID0geworCXsKKwkJLm5hbWUgPSAidWJvb3QiLAorCQkub2Zmc2V0ID0gMCwKKwkJLnNpemUgPSAoMSAqIDEwMjQgKiAxMDI0KSwKKwkJLm1hc2tfZmxhZ3MgPSBNVERfV1JJVEVBQkxFLAkvKiBSZWFkLW9ubHkgKi8KKwl9LCB7CisJCS5uYW1lID0gImtlcm5lbCIsCisJCS5vZmZzZXQgPSBNVERQQVJUX09GU19BUFBFTkQsCisJCS5zaXplID0gKDIgKiAxMDI0ICogMTAyNCksCisJfSwgeworCQkubmFtZSA9ICJmcmVlLWFyZWEiLAorCQkub2Zmc2V0ID0gTVREUEFSVF9PRlNfQVBQRU5ELAorCQkuc2l6ZSA9IE1URFBBUlRfU0laX0ZVTEwsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIG5vcl9mbGFzaF9kYXRhID0geworCS53aWR0aAkJPSAyLAorCS5wYXJ0cwkJPSBub3JfZmxhc2hfcGFydGl0aW9ucywKKwkubnJfcGFydHMJPSBBUlJBWV9TSVpFKG5vcl9mbGFzaF9wYXJ0aXRpb25zKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugbm9yX2ZsYXNoX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiTk9SIEZsYXNoIiwKKwkJLnN0YXJ0CT0gMHgwMDAwMDAwMCwKKwkJLmVuZAk9IDB4MDFmZmZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG5vcl9mbGFzaF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5yZXNvdXJjZQk9IG5vcl9mbGFzaF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG5vcl9mbGFzaF9yZXNvdXJjZXMpLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YSA9ICZub3JfZmxhc2hfZGF0YSwKKwl9LAorfTsKKworLyogTENEQyAqLworc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfbGNkY19pbmZvIGxjZGNfaW5mbyA9IHsKKwkuY2xvY2tfc291cmNlID0gTENEQ19DTEtfRVhURVJOQUwsCisJLmNoWzBdID0geworCQkuY2hhbiA9IExDRENfQ0hBTl9NQUlOTENELAorCQkuYnBwID0gMTYsCisJCS5jbG9ja19kaXZpZGVyID0gMSwKKwkJLmxjZF9jZmcgPSB7CisJCQkubmFtZSA9ICJMQjA3MFdWMSIsCisJCQkuc3luYyA9IDAsIC8qIGhzeW5jIGFuZCB2c3luYyBhcmUgYWN0aXZlIGxvdyAqLworCQl9LAorCQkubGNkX3NpemVfY2ZnID0geyAvKiA3LjAgaW5jaCAqLworCQkJLndpZHRoID0gMTUyLAorCQkJLmhlaWdodCA9IDkxLAorCQl9LAorCQkuYm9hcmRfY2ZnID0geworCQl9LAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbGNkY19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIkxDREMiLAorCQkuc3RhcnQJPSAweGZlOTQwMDAwLAorCQkuZW5kCT0gMHhmZTk0MWZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDEwNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxjZGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9tb2JpbGVfbGNkY19mYiIsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGxjZGNfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBsY2RjX3Jlc291cmNlcywKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbGNkY19pbmZvLAorCX0sCit9OworCisvKiBDRVUwICovCitzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9jZXVfaW5mbyBzaF9tb2JpbGVfY2V1MF9pbmZvID0geworCS5mbGFncyA9IFNIX0NFVV9GTEFHX1VTRV84QklUX0JVUywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2V1MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIkNFVTAiLAorCQkuc3RhcnQJPSAweGZlOTEwMDAwLAorCQkuZW5kCT0gMHhmZTkxMDA5ZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydCAgPSA1MiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkvKiBwbGFjZSBob2xkZXIgZm9yIGNvbnRpZ3VvdXMgbWVtb3J5ICovCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNldTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9tb2JpbGVfY2V1IiwKKwkuaWQgICAgICAgICAgICAgPSAwLCAvKiAiY2V1MCIgY2xvY2sgKi8KKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY2V1MF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGNldTBfcmVzb3VyY2VzLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnNoX21vYmlsZV9jZXUwX2luZm8sCisJfSwKK307CisKKy8qIENFVTEgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9pbmZvIHNoX21vYmlsZV9jZXUxX2luZm8gPSB7CisJLmZsYWdzID0gU0hfQ0VVX0ZMQUdfVVNFXzhCSVRfQlVTLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjZXUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ0VVMSIsCisJCS5zdGFydAk9IDB4ZmU5MTQwMDAsCisJCS5lbmQJPSAweGZlOTE0MDlmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0ICA9IDYzLAorCQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS8qIHBsYWNlIGhvbGRlciBmb3IgY29udGlndW91cyBtZW1vcnkgKi8KKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2V1MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX21vYmlsZV9jZXUiLAorCS5pZCAgICAgICAgICAgICA9IDEsIC8qICJjZXUxIiBjbG9jayAqLworCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjZXUxX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gY2V1MV9yZXNvdXJjZXMsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmc2hfbW9iaWxlX2NldTFfaW5mbywKKwl9LAorfTsKKworLyogS0VZU0MgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2hfa2V5c2NfaW5mbyBrZXlzY19pbmZvID0geworCS5tb2RlID0gU0hfS0VZU0NfTU9ERV8xLAorCS5zY2FuX3RpbWluZyA9IDEwLAorCS5kZWxheSA9IDUwLAorCS5rZXljb2RlcyA9IHsKKwkJS0VZXzEsIEtFWV8yLCBLRVlfMywgS0VZXzQsIEtFWV81LAorCQlLRVlfNiwgS0VZXzcsIEtFWV84LCBLRVlfOSwgS0VZX0EsCisJCUtFWV9CLCBLRVlfQywgS0VZX0QsIEtFWV9FLCBLRVlfRiwKKwkJS0VZX0csIEtFWV9ILCBLRVlfSSwgS0VZX0ssIEtFWV9MLAorCQlLRVlfTSwgS0VZX04sIEtFWV9PLCBLRVlfUCwgS0VZX1EsCisJCUtFWV9SLCBLRVlfUywgS0VZX1QsIEtFWV9VLCBLRVlfViwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBrZXlzY19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydCAgPSAweDFhMjA0MDAwLAorCQkuZW5kICAgID0gMHgxYTIwNDAwZiwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gSVJRMF9LRVksCisJCS5mbGFncyAgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Uga2V5c2NfZGV2aWNlID0geworCS5uYW1lICAgICAgICAgICA9ICJzaF9rZXlzYyIsCisJLmlkICAgICAgICAgICAgID0gMCwgLyogImtleXNjMCIgY2xvY2sgKi8KKwkubnVtX3Jlc291cmNlcyAgPSBBUlJBWV9TSVpFKGtleXNjX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0ga2V5c2NfcmVzb3VyY2VzLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmtleXNjX2luZm8sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptczc3MjRzZV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaGVhcnRiZWF0X2RldmljZSwKKwkmc21jOTF4X2V0aF9kZXZpY2UsCisJJmxjZGNfZGV2aWNlLAorCSZub3JfZmxhc2hfZGV2aWNlLAorCSZjZXUwX2RldmljZSwKKwkmY2V1MV9kZXZpY2UsCisJJmtleXNjX2RldmljZSwKK307CisKKyNkZWZpbmUgU1c0MTQwICAgIDB4QkEyMDEwMDAKKyNkZWZpbmUgRlBHQV9PVVQgIDB4QkEyMDA0MDAKKyNkZWZpbmUgUE9SVF9ISVpBIDB4QTQwNTAxNTgKKworI2RlZmluZSBTVzQxX0EgICAgMHgwMTAwCisjZGVmaW5lIFNXNDFfQiAgICAweDAyMDAKKyNkZWZpbmUgU1c0MV9DICAgIDB4MDQwMAorI2RlZmluZSBTVzQxX0QgICAgMHgwODAwCisjZGVmaW5lIFNXNDFfRSAgICAweDEwMDAKKyNkZWZpbmUgU1c0MV9GICAgIDB4MjAwMAorI2RlZmluZSBTVzQxX0cgICAgMHg0MDAwCisjZGVmaW5lIFNXNDFfSCAgICAweDgwMDAKK3N0YXRpYyBpbnQgX19pbml0IGRldmljZXNfc2V0dXAodm9pZCkKK3sKKwl1MTYgc3cgPSBjdHJsX2ludyhTVzQxNDApOyAvKiBzZWxlY3QgY2FtZXJhLCBtb25pdG9yICovCisKKwkvKiBSZXNldCBSZWxlYXNlICovCisJY3RybF9vdXR3KGN0cmxfaW53KEZQR0FfT1VUKSAmCisJCSAgfigoMSA8PCAxKSAgfCAvKiBMQU4gKi8KKwkJICAgICgxIDw8IDYpICB8IC8qIFZJREVPIERBQyAqLworCQkgICAgKDEgPDwgMTIpKSwgLyogVVNCMCAqLworCQkgIEZQR0FfT1VUKTsKKworCS8qIGVuYWJsZSBJUlEgMCwxLDIgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9JTlRDX0lSUTAsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0lOVENfSVJRMSwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fSU5UQ19JUlEyLCBOVUxMKTsKKworCS8qIGVuYWJsZSBTQ0lGQTMgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TQ0lGM19JX1NDSywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRjNfSV9SWEQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1NDSUYzX0lfVFhELCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9TQ0lGM19JX0NUUywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fU0NJRjNfSV9SVFMsIE5VTEwpOworCisJLyogZW5hYmxlIExDREMgKi8KKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0REMjMsICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDIyLCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDREQyMSwgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0REMjAsICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDE5LCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDREQxOCwgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0REMTcsICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDE2LCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDREQxNSwgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0REMTQsICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDEzLCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDREQxMiwgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0REMTEsICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDEwLCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDREQ5LCAgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0REOCwgICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDcsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDREQ2LCAgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0RENSwgICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDQsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDREQzLCAgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0REMiwgICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERDEsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDREQwLCAgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0RESVNQLCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENESFNZTiwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDRERDSywgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0RWU1lOLCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENERE9OLCAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDRFZFUFdDLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9MQ0RWQ1BXQywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fTENEUkQsICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0xDRExDTEssICBOVUxMKTsKKwljdHJsX291dHcoKGN0cmxfaW53KFBPUlRfSElaQSkgJiB+MHgwMDAxKSwgUE9SVF9ISVpBKTsKKworCS8qIGVuYWJsZSBDRVUwICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9EMTUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDE0LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8wX0QxMywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9EMTIsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDExLCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8wX0QxMCwgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9EOSwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDgsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8wX0Q3LCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9ENiwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDUsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8wX0Q0LCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9EMywgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfRDIsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8wX0QxLCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9EMCwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfVkQsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8wX0NMSywgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMF9GTEQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzBfSEQsICBOVUxMKTsKKwlwbGF0Zm9ybV9yZXNvdXJjZV9zZXR1cF9tZW1vcnkoJmNldTBfZGV2aWNlLCAiY2V1IiwgNCA8PCAyMCk7CisKKwkvKiBlbmFibGUgQ0VVMSAqLworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzFfRDcsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8xX0Q2LCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMV9ENSwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzFfRDQsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8xX0QzLCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMV9EMiwgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzFfRDEsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8xX0QwLCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMV9GTEQsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX1ZJTzFfSEQsICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9WSU8xX1ZELCAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fVklPMV9DTEssIE5VTEwpOworCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmY2V1MV9kZXZpY2UsICJjZXUiLCA0IDw8IDIwKTsKKworCS8qIEtFWVNDICovCisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZT1VUNV9JTjUsIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDRfSU42LCBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlJTjQsICAgICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZSU4zLCAgICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWUlOMiwgICAgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlJTjEsICAgICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZSU4wLCAgICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDMsICAgICBOVUxMKTsKKwlncGlvX3JlcXVlc3QoR1BJT19GTl9LRVlPVVQyLCAgICAgTlVMTCk7CisJZ3Bpb19yZXF1ZXN0KEdQSU9fRk5fS0VZT1VUMSwgICAgIE5VTEwpOworCWdwaW9fcmVxdWVzdChHUElPX0ZOX0tFWU9VVDAsICAgICBOVUxMKTsKKworCWlmIChzdyAmIFNXNDFfQikgeworCQkvKiBTVkdBICovCisJCWxjZGNfaW5mby5jaFswXS5sY2RfY2ZnLnhyZXMgICAgICAgICA9IDgwMDsKKwkJbGNkY19pbmZvLmNoWzBdLmxjZF9jZmcueXJlcyAgICAgICAgID0gNjAwOworCQlsY2RjX2luZm8uY2hbMF0ubGNkX2NmZy5sZWZ0X21hcmdpbiAgPSAxNDI7CisJCWxjZGNfaW5mby5jaFswXS5sY2RfY2ZnLnJpZ2h0X21hcmdpbiA9IDUyOworCQlsY2RjX2luZm8uY2hbMF0ubGNkX2NmZy5oc3luY19sZW4gICAgPSA5NjsKKwkJbGNkY19pbmZvLmNoWzBdLmxjZF9jZmcudXBwZXJfbWFyZ2luID0gMjQ7CisJCWxjZGNfaW5mby5jaFswXS5sY2RfY2ZnLmxvd2VyX21hcmdpbiA9IDI7CisJCWxjZGNfaW5mby5jaFswXS5sY2RfY2ZnLnZzeW5jX2xlbiAgICA9IDI7CisJfSBlbHNlIHsKKwkJLyogVkdBICovCisJCWxjZGNfaW5mby5jaFswXS5sY2RfY2ZnLnhyZXMgICAgICAgICA9IDY0MDsKKwkJbGNkY19pbmZvLmNoWzBdLmxjZF9jZmcueXJlcyAgICAgICAgID0gNDgwOworCQlsY2RjX2luZm8uY2hbMF0ubGNkX2NmZy5sZWZ0X21hcmdpbiAgPSAxMDU7CisJCWxjZGNfaW5mby5jaFswXS5sY2RfY2ZnLnJpZ2h0X21hcmdpbiA9IDUwOworCQlsY2RjX2luZm8uY2hbMF0ubGNkX2NmZy5oc3luY19sZW4gICAgPSA5NjsKKwkJbGNkY19pbmZvLmNoWzBdLmxjZF9jZmcudXBwZXJfbWFyZ2luID0gMzM7CisJCWxjZGNfaW5mby5jaFswXS5sY2RfY2ZnLmxvd2VyX21hcmdpbiA9IDEwOworCQlsY2RjX2luZm8uY2hbMF0ubGNkX2NmZy52c3luY19sZW4gICAgPSAyOworCX0KKworCWlmIChzdyAmIFNXNDFfQSkgeworCQkvKiBEaWdpdGFsIG1vbml0b3IgKi8KKwkJbGNkY19pbmZvLmNoWzBdLmludGVyZmFjZV90eXBlID0gUkdCMTg7CisJCWxjZGNfaW5mby5jaFswXS5mbGFncyAgICAgICAgICA9IDA7CisJfSBlbHNlIHsKKwkJLyogQW5hbG9nIG1vbml0b3IgKi8KKwkJbGNkY19pbmZvLmNoWzBdLmludGVyZmFjZV90eXBlID0gUkdCMjQ7CisJCWxjZGNfaW5mby5jaFswXS5mbGFncyAgICAgICAgICA9IExDRENfRkxBR1NfRFdQT0w7CisJfQorCisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKG1zNzcyNHNlX2RldmljZXMsCisJCQkJQVJSQVlfU0laRShtczc3MjRzZV9kZXZpY2VzKSk7Cit9CitkZXZpY2VfaW5pdGNhbGwoZGV2aWNlc19zZXR1cCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbXM3NzI0c2UgX19pbml0bXYgPSB7CisJLm12X25hbWUJPSAibXM3NzI0c2UiLAorCS5tdl9pbml0X2lycQk9IGluaXRfc2U3NzI0X0lSUSwKKwkubXZfbnJfaXJxcwk9IFNFNzcyNF9GUEdBX0lSUV9CQVNFICsgU0U3NzI0X0ZQR0FfSVJRX05SLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9NYWtlZmlsZQppbmRleCBkYmMyOWYzLi5lNmY0MzQxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3NTEvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzUxL01ha2VmaWxlCkBAIC0zLDUgKzMsMyBAQAogIwogCiBvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi0KLW9iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3NTEvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9pby5jCmluZGV4IDYyODdhZTUuLjZlNzViZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9pby5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9pby5jCkBAIC0zNCw4ICszNCw2IEBACiB7CiAJaWYgKFBYU0VHKHBvcnQpKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCiAJCXJldHVybiAoKnBvcnQyYWRyKHBvcnQpKSAmIDB4ZmY7CiB9CkBAIC00Niw4ICs0NCw2IEBACiAKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgIHYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0OwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0gICAgICAgICAgICAgICAgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBjaV9pb2FkZHIocG9ydCk7CiAJZWxzZQogCQl2ID0gKCpwb3J0MmFkcihwb3J0KSkgJiAweGZmOwogCWN0cmxfZGVsYXkoKTsKQEAgLTU4LDggKzU0LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKIAkJcmV0dXJuICpwb3J0MmFkcihwb3J0KTsKIAllbHNlCkBAIC03MSw4ICs2NSw2IEBACiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICByZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKXBjaV9pb2FkZHIocG9ydCk7CiAJZWxzZSBpZiAocG9ydCA+PSAweDIwMDApCiAJCXJldHVybiAqcG9ydDJhZHIocG9ydCk7CiAJZWxzZQpAQCAtODUsOCArNzcsNiBAQAogCiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLQkJKigodW5zaWduZWQgY2hhciopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlCiAJCSoocG9ydDJhZHIocG9ydCkpID0gdmFsdWU7CiB9CkBAIC05NSw4ICs4NSw2IEBACiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLQkJKigodW5zaWduZWQgY2hhciopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlCiAJCSoocG9ydDJhZHIocG9ydCkpID0gdmFsdWU7CiAJY3RybF9kZWxheSgpOwpAQCAtMTA2LDggKzk0LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLQkJKigodW5zaWduZWQgc2hvcnQgKilwY2lfaW9hZGRyKHBvcnQpKSA9IHZhbHVlOwogCWVsc2UgaWYgKHBvcnQgPj0gMHgyMDAwKQogCQkqcG9ydDJhZHIocG9ydCkgPSB2YWx1ZTsKIAllbHNlCkBAIC0xMTgsOCArMTA0LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotCQkqKCh1bnNpZ25lZCBsb25nKilwY2lfaW9hZGRyKHBvcnQpKSA9IHZhbHVlOwogCWVsc2UKIAkJbWF5YmViYWRpbyhwb3J0KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9wY2kuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc1MS9wY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzYjI5Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3NTEvcGNpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvcGNpLmMKLSAqCi0gKiBBdXRob3I6ICBJYW4gRGFTaWx2YSAoaWRhc2lsdmFAbXZpc3RhLmNvbSkKLSAqCi0gKiBIaWdobHkgbGV2ZXJhZ2VkIGZyb20gcGNpLWJpZ3N1ci5jLCB3cml0dGVuIGJ5IER1c3RpbiBNY0ludGlyZS4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSGl0YWNoaSBTSDc3NTEgU29sdXRpb24gRW5naW5lIGJvYXJkIChNUzc3NTFTRTAxKQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5oIgotCi0jZGVmaW5lIFBDSU1DUl9NUlNFVF9PRkYJMHhCRkZGRkZGRgotI2RlZmluZSBQQ0lNQ1JfUkZTSF9PRkYJCTB4RkZGRkZGRkIKLQotLyoKLSAqIE9ubHkgbG9uZyB3b3JkIGFjY2Vzc2VzIG9mIHRoZSBQQ0lDJ3MgaW50ZXJuYWwgbG9jYWwgcmVnaXN0ZXJzIGFuZCB0aGUKLSAqIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGZyb20gdGhlIENQVSBpcyBzdXBwb3J0ZWQuCi0gKi8KLSNkZWZpbmUgUENJQ19XUklURSh4LHYpIHdyaXRlbCgodiksIFBDSV9SRUcoeCkpCi0jZGVmaW5lIFBDSUNfUkVBRCh4KSByZWFkbChQQ0lfUkVHKHgpKQotCi0vKgotICogRGVzY3JpcHRpb246ICBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgYW5kIGluaXRpYWxpemVzIHRoZSBwY2ljLCBzZXRzCi0gKiB1cCB0aGUgQkFSUywgbWFwcyB0aGUgRFJBTSBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlIGV0YywgZXRjLgotICovCi1pbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQotewotICAgdW5zaWduZWQgbG9uZyBiY3IxLCB3Y3IxLCB3Y3IyLCB3Y3IzLCBtY3I7Ci0gICB1bnNpZ25lZCBzaG9ydCBiY3IyOwotCi0gICAvKgotICAgICogSW5pdGlhbGl6ZSB0aGUgc2xhdmUgYnVzIGNvbnRyb2xsZXIgb24gdGhlIHBjaWMuICBUaGUgdmFsdWVzIHVzZWQKLSAgICAqIGhlcmUgc2hvdWxkIG5vdCBiZSBoYXJkY29kZWQsIGJ1dCB0aGV5IHNob3VsZCBiZSB0YWtlbiBmcm9tIHRoZSBic2MKLSAgICAqIG9uIHRoZSBwcm9jZXNzb3IsIHRvIG1ha2UgdGhpcyBmdW5jdGlvbiBhcyBnZW5lcmljIGFzIHBvc3NpYmxlLgotICAgICogKGkuZS4gQW5vdGhlciBzYmMgbWF5IHVzciBkaWZmZXJlbnQgU0RSQU0gdGltaW5nIHNldHRpbmdzIC0tIGluIG9yZGVyCi0gICAgKiBmb3IgdGhlIHBjaWMgdG8gd29yaywgaXRzIHNldHRpbmdzIG5lZWQgdG8gYmUgZXhhY3RseSB0aGUgc2FtZS4pCi0gICAgKi8KLSAgIGJjcjEgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nKikoU0g3NzUxX0JDUjEpKTsKLSAgIGJjcjIgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopKFNINzc1MV9CQ1IyKSk7Ci0gICB3Y3IxID0gKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopKFNINzc1MV9XQ1IxKSk7Ci0gICB3Y3IyID0gKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopKFNINzc1MV9XQ1IyKSk7Ci0gICB3Y3IzID0gKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopKFNINzc1MV9XQ1IzKSk7Ci0gICBtY3IgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nKikoU0g3NzUxX01DUikpOwotCi0gICBiY3IxID0gYmNyMSB8IDB4MDAwODAwMDA7ICAvKiBFbmFibGUgQml0IDE5LCBCUkVRRU4gKi8KLSAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKShTSDc3NTFfQkNSMSkpID0gYmNyMTsgICAKLQotICAgYmNyMSA9IGJjcjEgfCAweDQwMDgwMDAwOyAgLyogRW5hYmxlIEJpdCAxOSBCUkVRRU4sIHNldCBQQ0lDIHRvIHNsYXZlICovCi0gICBQQ0lDX1dSSVRFKFNINzc1MV9QQ0lCQ1IxLCBiY3IxKTsJIC8qIFBDSUMgQkNSMSAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJQkNSMiwgYmNyMik7ICAgICAvKiBQQ0lDIEJDUjIgKi8KLSAgIFBDSUNfV1JJVEUoU0g3NzUxX1BDSVdDUjEsIHdjcjEpOyAgICAgLyogUENJQyBXQ1IxICovCi0gICBQQ0lDX1dSSVRFKFNINzc1MV9QQ0lXQ1IyLCB3Y3IyKTsgICAgIC8qIFBDSUMgV0NSMiAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJV0NSMywgd2NyMyk7ICAgICAvKiBQQ0lDIFdDUjMgKi8KLSAgIG1jciA9IChtY3IgJiBQQ0lNQ1JfTVJTRVRfT0ZGKSAmIFBDSU1DUl9SRlNIX09GRjsKLSAgIFBDSUNfV1JJVEUoU0g3NzUxX1BDSU1DUiwgbWNyKTsgICAgICAvKiBQQ0lDIE1DUiAqLwotCi0KLSAgIC8qIEVuYWJsZSBhbGwgaW50ZXJydXB0cywgc28gd2Uga25vdyB3aGF0IHRvIGZpeCAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJSU5UTSwgMHgwMDAwYzNmZik7Ci0gICBQQ0lDX1dSSVRFKFNINzc1MV9QQ0lBSU5UTSwgMHgwMDAwMzgwZik7Ci0KLSAgIC8qIFNldCB1cCBzdGFuZGFyZCBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJQ09ORjEsIAkweEYzOTAwMEM3KTsgLyogQnVzIE1hc3RlciwgTWVtICYgSS9PIGFjY2VzcyAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJQ09ORjIsIAkweDAwMDAwMDAwKTsgLyogUENJIENsYXNzIGNvZGUgJiBSZXZpc2lvbiBJRCAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJQ09ORjQsIAkweGFiMDAwMDAxKTsgLyogUENJIEkvTyBhZGRyZXNzIChsb2NhbCByZWdzKSAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJQ09ORjUsIAkweDBjMDAwMDAwKTsgLyogUENJIE1FTSBhZGRyZXNzIChsb2NhbCBSQU0pICAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJQ09ORjYsIAkweGQwMDAwMDAwKTsgLyogUENJIE1FTSBhZGRyZXNzICh1bnVzZWQpICAgICAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJQ09ORjExLCAweDM1MDUxMDU0KTsgLyogUENJIFN1YnN5c3RlbSBJRCAmIFZlbmRvciBJRCAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJTFNSMCwgMHgwM2YwMDAwMCk7ICAgLyogTUVNIChmdWxsIDY0TSBleHBvc2VkKSAgICAgICAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJTFNSMSwgMHgwMDAwMDAwMCk7ICAgLyogTUVNICh1bnVzZWQpICAgICAgICAgICAgICAgICAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJTEFSMCwgMHgwYzAwMDAwMCk7ICAgLyogTUVNIChkaXJlY3QgbWFwIGZyb20gUENJKSAgICAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJTEFSMSwgMHgwMDAwMDAwMCk7ICAgLyogTUVNICh1bnVzZWQpICAgICAgICAgICAgICAgICAqLwotCi0gICAvKiBOb3cgdHVybiBpdCBvbi4uLiAqLwotICAgUENJQ19XUklURShTSDc3NTFfUENJQ1IsIDB4YTUwMDAwMDEpOwotCi0gICAvKgotICAgICogU2V0IFBDSU1CUiBhbmQgUENJSU9CUiBoZXJlLCBhc3N1bWluZyBhIHNpbmdsZSB3aW5kb3cKLSAgICAqICgxNk0gTUVNLCAyNTZLIElPKSBpcyBlbm91Z2guICBJZiBhIGxhcmdlciBzcGFjZSBpcwotICAgICogbmVlZGVkLCB0aGUgcmVhZHgvd3JpdGV4IGFuZCBpbngvb3V0eCBmdW5jdGlvbnMgd2lsbAotICAgICogaGF2ZSB0byBkbyBtb3JlIChlLmcuIHNldHRpbmcgcmVnaXN0ZXJzIGZvciBlYWNoIGNhbGwpLgotICAgICovCi0KLSAgIC8qCi0gICAgKiBTZXQgdGhlIE1CUiBzbyBQQ0kgYWRkcmVzcyBpcyBvbmUtdG8tb25lIHdpdGggd2luZG93LAotICAgICogbWVhbmluZyBhbGwgY2FsbHMgZ28gc3RyYWlnaHQgdGhyb3VnaC4uLiB1c2UgQlVHX09OIHRvCi0gICAgKiBjYXRjaCBlcnJvbmVvdXMgYXNzdW1wdGlvbi4KLSAgICAqLwotICAgQlVHX09OKFBDSUJJT1NfTUlOX01FTSAhPSBTSDc3NTFfUENJX01FTU9SWV9CQVNFKTsKLQotICAgUENJQ19XUklURShTSDc3NTFfUENJTUJSLCBQQ0lCSU9TX01JTl9NRU0pOwotCi0gICAvKiBTZXQgSU9CUiBmb3Igd2luZG93IGNvbnRhaW5pbmcgYXJlYSBzcGVjaWZpZWQgaW4gcGNpLmggKi8KLSAgIFBDSUNfV1JJVEUoU0g3NzUxX1BDSUlPQlIsIChQQ0lCSU9TX01JTl9JTyAmIFNINzc1MV9QQ0lJT0JSX01BU0spKTsKLQotICAgLyogQWxsIGRvbmUsIG1heSBhcyB3ZWxsIHNheSBzby4uLiAqLwotICAgcHJpbnRrKCJTSDc3NTEgUENJOiBGaW5pc2hlZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgUENJIGNvbnRyb2xsZXJcbiIpOwotCi0gICByZXR1cm4gMTsKLX0KLQotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEodTggc2xvdCwgdTggcGluKQotewotICAgICAgICBzd2l0Y2ggKHNsb3QpIHsKLSAgICAgICAgY2FzZSAwOiByZXR1cm4gMTM7Ci0gICAgICAgIGNhc2UgMTogcmV0dXJuIDEzOyAJLyogQU1EIEV0aGVybmV0IGNvbnRyb2xsZXIgKi8KLSAgICAgICAgY2FzZSAyOiByZXR1cm4gLTE7Ci0gICAgICAgIGNhc2UgMzogcmV0dXJuIC0xOwotICAgICAgICBjYXNlIDQ6IHJldHVybiAtMTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBwcmludGsoIlBDSTogQmFkIElSUSBtYXBwaW5nIHJlcXVlc3QgZm9yIHNsb3QgJWRcbiIsIHNsb3QpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotfQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9pb19yZXNvdXJjZSA9IHsKLQkubmFtZSAgID0gIlNINzc1MSBJTyIsCi0JLnN0YXJ0ICA9IFNINzc1MV9QQ0lfSU9fQkFTRSwKLQkuZW5kICAgID0gU0g3NzUxX1BDSV9JT19CQVNFICsgU0g3NzUxX1BDSV9JT19TSVpFIC0gMSwKLQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9JTwotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3NTFfbWVtX3Jlc291cmNlID0gewotCS5uYW1lICAgPSAiU0g3NzUxIG1lbSIsCi0JLnN0YXJ0ICA9IFNINzc1MV9QQ0lfTUVNT1JZX0JBU0UsCi0JLmVuZCAgICA9IFNINzc1MV9QQ0lfTUVNT1JZX0JBU0UgKyBTSDc3NTFfUENJX01FTV9TSVpFIC0gMSwKLQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0KLX07Ci0KLWV4dGVybiBzdHJ1Y3QgcGNpX29wcyBzaDc3NTFfcGNpX29wczsKLQotc3RydWN0IHBjaV9jaGFubmVsIGJvYXJkX3BjaV9jaGFubmVsc1tdID0gewotCXsgJnNoNzc1MV9wY2lfb3BzLCAmc2g3NzUxX2lvX3Jlc291cmNlLCAmc2g3NzUxX21lbV9yZXNvdXJjZSwgMCwgMHhmZiB9LAotCXsgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCB9LAotfTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzgwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS83NzgwL2lycS5jCmluZGV4IDY2YWQyOTIuLmI4ZDQzYjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvNzc4MC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlLzc3ODAvaXJxLmMKQEAgLTEyLDEwICsxMiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxtYWNoLXNlL21hY2gvc2U3NzgwLmg+CiAKKyNkZWZpbmUgSU5UQ19CQVNFCTB4ZmZkMDAwMDAKKyNkZWZpbmUgSU5UQ19JQ1IxCShJTlRDX0JBU0UrMHgxYykKKwogLyoKICAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKICAqLwpAQCAtNDMsNCArNDYsMjQgQEAKIAljdHJsX291dHcoKElSUVBJTl9QQ0NQVyA8PCBJUlFQT1NfUENDUFcpLCBGUEdBX0lOVFNFTDMpOwogCiAJcGxhdF9pcnFfc2V0dXBfcGlucyhJUlFfTU9ERV9JUlEpOyAvKiBpbnN0YWxsIGhhbmRsZXJzIGZvciBJUlEwLTcgKi8KKworCS8qIElDUjE6IGRldGVjdCBsb3cgbGV2ZWwoZm9yIDJuZGN1dCkgKi8KKwljdHJsX291dGwoMHhBQUFBMDAwMCwgSU5UQ19JQ1IxKTsKKworCS8qCisJICogRlBHQSBQQ0lTRUwgcmVnaXN0ZXIgaW5pdGlhbGl6ZQorCSAqCisJICogIENQVSAgfHwgU0xPVDEgfCBTTE9UMiB8IFMtQVRBIHwgVVNCCisJICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiAgSU5UQSB8fCBJTlRBICB8IElOVEQgIHwgIC0tICAgfCBJTlRCCisJICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiAgSU5UQiB8fCBJTlRCICB8IElOVEEgIHwgIC0tICAgfCBJTlRDCisJICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKiAgSU5UQyB8fCBJTlRDICB8IElOVEIgIHwgSU5UQSAgfCAgLS0KKwkgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqICBJTlREIHx8IElOVEQgIHwgSU5UQyAgfCAgLS0gICB8IElOVEEKKwkgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqLworCWN0cmxfb3V0dygweDAwMTMsIEZQR0FfUENJX0lOVFNFTDEpOworCWN0cmxfb3V0dygweEU0MDIsIEZQR0FfUENJX0lOVFNFTDIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2UvTWFrZWZpbGUKaW5kZXggMmRlNDJiYS4uYjUzN2UyMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zZS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNlL01ha2VmaWxlCkBAIC03LDMgKzcsNCBAQAogb2JqLSQoQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FKQkrPSA3NzgwLwogb2JqLSQoQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FKQkrPSA3MzQzLwogb2JqLSQoQ09ORklHX1NIXzc3MjFfU09MVVRJT05fRU5HSU5FKQkrPSA3NzIxLworb2JqLSQoQ09ORklHX1NIXzc3MjRfU09MVVRJT05fRU5HSU5FKQkrPSA3NzI0LwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1zaDAzL3J0Yy5jIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zaDAzL3J0Yy5jCmluZGV4IDBhOTI2NmIuLmE4YjlmODQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2gwMy9ydGMuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLXNoMDMvcnRjLmMKQEAgLTM1LDEzICszNSwxMyBAQAogI2RlZmluZSBSVENfQlVTWQkxCiAjZGVmaW5lIFJUQ19TVE9QCTIKIAotZXh0ZXJuIHNwaW5sb2NrX3QgcnRjX2xvY2s7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNoMDNfcnRjX2xvY2spOwogCiB1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjOwogCi0Jc3Bpbl9sb2NrKCZydGNfbG9jayk7CisJc3Bpbl9sb2NrKCZzaDAzX3J0Y19sb2NrKTsKICBhZ2FpbjoKIAlkbyB7CiAJCXNlYyAgPSAoY3RybF9pbmIoUlRDX1NFQzEpICYgMHhmKSArIChjdHJsX2luYihSVENfU0VDMTApICYgMHg3KSAqIDEwOwpAQCAtNzMsNyArNzMsNyBAQAogCQlnb3RvIGFnYWluOwogCX0KIAotCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisJc3Bpbl91bmxvY2soJnNoMDNfcnRjX2xvY2spOwogCXJldHVybiBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKIH0KIApAQCAtOTEsNyArOTEsNyBAQAogCWludCBpOwogCiAJLyogZ2V0cyByZWNhbGxlZCB3aXRoIGlycSBsb2NhbGx5IGRpc2FibGVkICovCi0Jc3Bpbl9sb2NrKCZydGNfbG9jayk7CisJc3Bpbl9sb2NrKCZzaDAzX3J0Y19sb2NrKTsKIAlmb3IgKGkgPSAwIDsgaSA8IDEwMDAwMDAgOyBpKyspCS8qIG1heSB0YWtlIHVwIHRvIDEgc2Vjb25kLi4uICovCiAJCWlmICghKGN0cmxfaW5iKFJUQ19DVEwpICYgUlRDX0JVU1kpKQogCQkJYnJlYWs7CkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJICAgICAgIGNtb3NfbWludXRlcywgcmVhbF9taW51dGVzKTsKIAkJcmV0dmFsID0gLTE7CiAJfQotCXNwaW5fdW5sb2NrKCZydGNfbG9jayk7CisJc3Bpbl91bmxvY2soJnNoMDNfcnRjX2xvY2spOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc25hcGdlYXIvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc25hcGdlYXIvaW8uYwppbmRleCAwZjQ4MjQyLi40NzY2NTBlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNuYXBnZWFyL2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1zbmFwZ2Vhci9pby5jCkBAIC0zNiw4ICszNiw2IEBACiB7CiAJaWYgKFBYU0VHKHBvcnQpKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCiAJCXJldHVybiAoKnBvcnQyYWRyKHBvcnQpKSAmIDB4ZmY7CiB9CkBAIC00OCw4ICs0Niw2IEBACiAKIAlpZiAoUFhTRUcocG9ydCkpCiAJCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0OwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0JCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UKIAkJdiA9ICgqcG9ydDJhZHIocG9ydCkpJjB4ZmY7CiAJY3RybF9kZWxheSgpOwpAQCAtNjAsOCArNTYsNiBAQAogewogCWlmIChQWFNFRyhwb3J0KSkKIAkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0OwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKIAkJcmV0dXJuICpwb3J0MmFkcihwb3J0KTsKIAllbHNlCkBAIC03Myw4ICs2Nyw2IEBACiB7CiAJaWYgKFBYU0VHKHBvcnQpKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UgaWYgKHBvcnQgPj0gMHgyMDAwKQogCQlyZXR1cm4gKnBvcnQyYWRyKHBvcnQpOwogCWVsc2UKQEAgLTg3LDggKzc5LDYgQEAKIAogCWlmIChQWFNFRyhwb3J0KSkKIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0JCSooKHVuc2lnbmVkIGNoYXIqKXBjaV9pb2FkZHIocG9ydCkpID0gdmFsdWU7CiAJZWxzZQogCQkqKHBvcnQyYWRyKHBvcnQpKSA9IHZhbHVlOwogfQpAQCAtOTcsOCArODcsNiBAQAogewogCWlmIChQWFNFRyhwb3J0KSkKIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0JCSooKHVuc2lnbmVkIGNoYXIqKXBjaV9pb2FkZHIocG9ydCkpID0gdmFsdWU7CiAJZWxzZQogCQkqKHBvcnQyYWRyKHBvcnQpKSA9IHZhbHVlOwogCWN0cmxfZGVsYXkoKTsKQEAgLTEwOCw4ICs5Niw2IEBACiB7CiAJaWYgKFBYU0VHKHBvcnQpKQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0JCSooKHVuc2lnbmVkIHNob3J0ICopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKIAkJKnBvcnQyYWRyKHBvcnQpID0gdmFsdWU7CiAJZWxzZQpAQCAtMTIwLDggKzEwNiw2IEBACiB7CiAJaWYgKFBYU0VHKHBvcnQpKQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLQkJKigodW5zaWduZWQgbG9uZyopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlCiAJCW1heWJlYmFkaW8ocG9ydCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXN5c3RlbWgvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc3lzdGVtaC9pby5jCmluZGV4IGRlYzNkYjAuLjE1NTc3ZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc3lzdGVtaC9pby5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc3lzdGVtaC9pby5jCkBAIC0zNSw4ICszNSw2IEBACiB7CiAJaWYgKFBYU0VHKHBvcnQpKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0IDw9IDB4M0YxKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopRVRIRVJfSU9NQVAocG9ydCk7CiAJZWxzZQpAQCAtNDksOCArNDcsNiBAQAogCiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotICAgICAgICAgICAgICAgIHYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UgaWYgKHBvcnQgPD0gMHgzRjEpCiAJCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilFVEhFUl9JT01BUChwb3J0KTsKIAllbHNlCkBAIC02Myw4ICs1OSw2IEBACiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICByZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCk7CiAJZWxzZSBpZiAocG9ydCA+PSAweDIwMDApCiAJCXJldHVybiAqcG9ydDJhZHIocG9ydCk7CiAJZWxzZSBpZiAocG9ydCA8PSAweDNGMSkKQEAgLTc4LDggKzcyLDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwb3J0OwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKIAkJcmV0dXJuICpwb3J0MmFkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0IDw9IDB4M0YxKQpAQCAtOTQsOCArODYsNiBAQAogCiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLQkJKigodW5zaWduZWQgY2hhciopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlIGlmIChwb3J0IDw9IDB4M0YxKQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilFVEhFUl9JT01BUChwb3J0KSA9IHZhbHVlOwogCWVsc2UKQEAgLTEwNiw4ICs5Niw2IEBACiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLQkJKigodW5zaWduZWQgY2hhciopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlIGlmIChwb3J0IDw9IDB4M0YxKQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilFVEhFUl9JT01BUChwb3J0KSA9IHZhbHVlOwogCWVsc2UKQEAgLTExOSw4ICsxMDcsNiBAQAogewogICAgICAgICBpZiAoUFhTRUcocG9ydCkpCiAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotCQkqKCh1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCkpID0gdmFsdWU7CiAJZWxzZSBpZiAocG9ydCA+PSAweDIwMDApCiAJCSpwb3J0MmFkcihwb3J0KSA9IHZhbHVlOwogCWVsc2UgaWYgKHBvcnQgPD0gMHgzRjEpCkBAIC0xMzMsOCArMTE5LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotCQkqKCh1bnNpZ25lZCBsb25nKilwY2lfaW9hZGRyKHBvcnQpKSA9IHZhbHVlOwogCWVsc2UKIAkJbWF5YmViYWRpbyhwb3J0KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtdGl0YW4vaW8uYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtdGl0YW4vaW8uYwppbmRleCA0YmFkYWQ0Li4wMTMwZTk4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXRpdGFuL2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC10aXRhbi9pby5jCkBAIC0xNyw4ICsxNyw2IEBACiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICByZXR1cm4gY3RybF9pbmIocG9ydCk7Ci0gICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN0cmxfaW5iKHBjaV9pb2FkZHIocG9ydCkpOwogICAgICAgICByZXR1cm4gY3RybF9pbncocG9ydDJhZHIocG9ydCkpICYgMHhmZjsKIH0KIApAQCAtMjgsOCArMjYsNiBAQAogCiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICB2ID0gY3RybF9pbmIocG9ydCk7Ci0gICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0gICAgICAgICAgICAgICAgdiA9IGN0cmxfaW5iKHBjaV9pb2FkZHIocG9ydCkpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgdiA9IGN0cmxfaW53KHBvcnQyYWRyKHBvcnQpKSAmIDB4ZmY7CiAgICAgICAgIGN0cmxfZGVsYXkoKTsKQEAgLTQwLDggKzM2LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgIHJldHVybiBjdHJsX2ludyhwb3J0KTsKLSAgICAgICAgZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gY3RybF9pbncocGNpX2lvYWRkcihwb3J0KSk7CiAgICAgICAgIGVsc2UgaWYgKHBvcnQgPj0gMHgyMDAwKQogICAgICAgICAgICAgICAgIHJldHVybiBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSk7CiAgICAgICAgIGVsc2UKQEAgLTUzLDggKzQ3LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgIHJldHVybiBjdHJsX2lubChwb3J0KTsKLSAgICAgICAgZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gY3RybF9pbmwocGNpX2lvYWRkcihwb3J0KSk7CiAgICAgICAgIGVsc2UgaWYgKHBvcnQgPj0gMHgyMDAwKQogICAgICAgICAgICAgICAgIHJldHVybiBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSk7CiAgICAgICAgIGVsc2UKQEAgLTY2LDggKzU4LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgIGN0cmxfb3V0Yih2YWx1ZSwgcG9ydCk7Ci0gICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0gICAgICAgICAgICAgICAgY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOwogfQpAQCAtNzYsOCArNjYsNiBAQAogewogICAgICAgICBpZiAoUFhTRUcocG9ydCkpCiAgICAgICAgICAgICAgICAgY3RybF9vdXRiKHZhbHVlLCBwb3J0KTsKLSAgICAgICAgZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKLSAgICAgICAgICAgICAgICBjdHJsX291dGIodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgY3RybF9vdXR3KHZhbHVlLCBwb3J0MmFkcihwb3J0KSk7CiAgICAgICAgIGN0cmxfZGVsYXkoKTsKQEAgLTg3LDggKzc1LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgIGN0cmxfb3V0dyh2YWx1ZSwgcG9ydCk7Ci0gICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0gICAgICAgICAgICAgICAgY3RybF9vdXR3KHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKICAgICAgICAgZWxzZSBpZiAocG9ydCA+PSAweDIwMDApCiAgICAgICAgICAgICAgICAgY3RybF9vdXR3KHZhbHVlLCBwb3J0MmFkcihwb3J0KSk7CiAgICAgICAgIGVsc2UKQEAgLTk5LDggKzg1LDYgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgIGN0cmxfb3V0bCh2YWx1ZSwgcG9ydCk7Ci0gICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCi0gICAgICAgICAgICAgICAgY3RybF9vdXRsKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIG1heWJlYmFkaW8ocG9ydCk7CiB9CkBAIC0xMTcsMTAgKzEwMSw4IEBACiAKIHZvaWQgX19pb21lbSAqdGl0YW5faW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBzaXplKQogewotCWlmIChQWFNFRyhwb3J0KSB8fCBpc19wY2lfbWVtYWRkcihwb3J0KSkKKwlpZiAoUFhTRUcocG9ydCkpCiAJCXJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQotCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBjaV9pb2FkZHIocG9ydCk7CiAKIAlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBvcnQyYWRyKHBvcnQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L01ha2VmaWxlIGIvYXJjaC9zaC9ib290L01ha2VmaWxlCmluZGV4IDk1NDgzZDEuLjc4ZWZiMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2Jvb3QvTWFrZWZpbGUKQEAgLTIwLDkgKzIwLDYgQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUCT89IDB4MDAwMDEwMDAKIENPTkZJR19FTlRSWV9PRkZTRVQJPz0gMHgwMDAwMTAwMAogCi1leHBvcnQgQ09ORklHX1BBR0VfT0ZGU0VUIENPTkZJR19NRU1PUllfU1RBUlQgQ09ORklHX0JPT1RfTElOS19PRkZTRVQgXAotICAgICAgIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUIENPTkZJR19FTlRSWV9PRkZTRVQKLQogdGFyZ2V0cyA6PSB6SW1hZ2Ugdm1saW51eC5zcmVjIHVJbWFnZSB1SW1hZ2Uuc3JlYwogc3ViZGlyLSA6PSBjb21wcmVzc2VkCiAKQEAgLTQzLDYgKzQwLDkgQEAKIAkJICAgICAkJFskKENPTkZJR19NRU1PUllfU1RBUlQpXScpCiBlbmRpZgogCitleHBvcnQgQ09ORklHX1BBR0VfT0ZGU0VUIENPTkZJR19NRU1PUllfU1RBUlQgQ09ORklHX0JPT1RfTElOS19PRkZTRVQgXAorICAgICAgIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUIENPTkZJR19FTlRSWV9PRkZTRVQgS0VSTkVMX01FTU9SWQorCiBLRVJORUxfTE9BRAk6PSAkKHNoZWxsIC9iaW4vYmFzaCAtYyAncHJpbnRmICIweCUwOHgiIFwKIAkJICAgICAkJFskKENPTkZJR19QQUdFX09GRlNFVCkgICsgXAogCQkJJChLRVJORUxfTUVNT1JZKSArIFwKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggZWZiMDFkYy4uOTUzMWJmMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTEsNSArMSw0NyBAQAotaWZlcSAoJChDT05GSUdfU1VQRVJIMzIpLHkpCi1pbmNsdWRlICR7c3JjdHJlZX0vYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGVfMzIKLWVsc2UKLWluY2x1ZGUgJHtzcmN0cmVlfS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZV82NAorIworIyBsaW51eC9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorIworIyBjcmVhdGUgYSBjb21wcmVzc2VkIHZtbGludXggaW1hZ2UgZnJvbSB0aGUgb3JpZ2luYWwgdm1saW51eAorIworCit0YXJnZXRzCQk6PSB2bWxpbnV4IHZtbGludXguYmluIHZtbGludXguYmluLmd6IFwKKwkJICAgaGVhZF8kKEJJVFMpLm8gbWlzY18kKEJJVFMpLm8gcGlnZ3kubworCitPQkpFQ1RTID0gJChvYmopL2hlYWRfJChCSVRTKS5vICQob2JqKS9taXNjXyQoQklUUykubyAkKG9iaikvY2FjaGUubworCitpZmRlZiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUworT0JKRUNUUyArPSAkKG9iaikvLi4vLi4va2VybmVsL3NoX2Jpb3MubwogZW5kaWYKKworIworIyBJTUFHRV9PRkZTRVQgaXMgdGhlIGxvYWQgb2Zmc2V0IG9mIHRoZSBjb21wcmVzc2lvbiBsb2FkZXIKKyMKK0lNQUdFX09GRlNFVAk6PSAkKHNoZWxsIC9iaW4vYmFzaCAtYyAncHJpbnRmICIweCUwOHgiIFwKKwkJICAgICAkJFskKENPTkZJR19QQUdFX09GRlNFVCkgICsgXAorCQkJJChLRVJORUxfTUVNT1JZKSArIFwKKwkJCSQoQ09ORklHX0JPT1RfTElOS19PRkZTRVQpXScpCisKK0xJQkdDQwk6PSAkKHNoZWxsICQoQ0MpICQoS0JVSUxEX0NGTEFHUykgLXByaW50LWxpYmdjYy1maWxlLW5hbWUpCisKK2lmZXEgKCQoQ09ORklHX0ZVTkNUSU9OX1RSQUNFUikseSkKK09SSUdfQ0ZMQUdTIDo9ICQoS0JVSUxEX0NGTEFHUykKK0tCVUlMRF9DRkxBR1MgPSAkKHN1YnN0IC1wZywgLCAkKE9SSUdfQ0ZMQUdTKSkKK2VuZGlmCisKK0xERkxBR1Nfdm1saW51eCA6PSAtLW9mb3JtYXQgJChsZC1iZmQpIC1UdGV4dCAkKElNQUdFX09GRlNFVCkgLWUgc3RhcnR1cCBcCisJCSAgIC1UICQob2JqKS8uLi8uLi9rZXJuZWwvdm1saW51eC5sZHMKKworJChvYmopL3ZtbGludXg6ICQoT0JKRUNUUykgJChvYmopL3BpZ2d5Lm8gJChMSUJHQ0MpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGQpCisJQDoKKworJChvYmopL3ZtbGludXguYmluOiB2bWxpbnV4IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsb2JqY29weSkKKworJChvYmopL3ZtbGludXguYmluLmd6OiAkKG9iaikvdm1saW51eC5iaW4gRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxnemlwKQorCitPQkpDT1BZRkxBR1MgKz0gLVIgLmVtcHR5X3plcm9fcGFnZQorCiskKG9iaikvcGlnZ3kubzogJChvYmopL3BpZ2d5LlMgJChvYmopL3ZtbGludXguYmluLmd6IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsYXNfb19TKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGVfMzIgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZV8zMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2YTA1NS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZV8zMgorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMKLSMgbGludXgvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKLSMKLSMgY3JlYXRlIGEgY29tcHJlc3NlZCB2bWxpbnV4IGltYWdlIGZyb20gdGhlIG9yaWdpbmFsIHZtbGludXgKLSMKLQotdGFyZ2V0cwkJOj0gdm1saW51eCB2bWxpbnV4LmJpbiB2bWxpbnV4LmJpbi5neiBcCi0JCSAgIGhlYWRfMzIubyBtaXNjXzMyLm8gcGlnZ3kubwotCi1PQkpFQ1RTID0gJChvYmopL2hlYWRfMzIubyAkKG9iaikvbWlzY18zMi5vCi0KLWlmZGVmIENPTkZJR19TSF9TVEFOREFSRF9CSU9TCi1PQkpFQ1RTICs9ICQob2JqKS8uLi8uLi9rZXJuZWwvc2hfYmlvcy5vCi1lbmRpZgotCi0jCi0jIElNQUdFX09GRlNFVCBpcyB0aGUgbG9hZCBvZmZzZXQgb2YgdGhlIGNvbXByZXNzaW9uIGxvYWRlcgotIwotSU1BR0VfT0ZGU0VUCTo9ICQoc2hlbGwgL2Jpbi9iYXNoIC1jICdwcmludGYgIjB4JTA4eCIgXAotCQkgICAgICQkWyQoQ09ORklHX1BBR0VfT0ZGU0VUKSAgKyBcCi0JCQkkKENPTkZJR19NRU1PUllfU1RBUlQpICsgXAotCQkJJChDT05GSUdfQk9PVF9MSU5LX09GRlNFVCldJykKLQotTElCR0NDCTo9ICQoc2hlbGwgJChDQykgJChLQlVJTERfQ0ZMQUdTKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSkKLQotaWZlcSAoJChDT05GSUdfRlVOQ1RJT05fVFJBQ0VSKSx5KQotT1JJR19DRkxBR1MgOj0gJChLQlVJTERfQ0ZMQUdTKQotS0JVSUxEX0NGTEFHUyA9ICQoc3Vic3QgLXBnLCAsICQoT1JJR19DRkxBR1MpKQotZW5kaWYKLQotTERGTEFHU192bWxpbnV4IDo9IC1UdGV4dCAkKElNQUdFX09GRlNFVCkgLWUgc3RhcnR1cCAtVCAkKG9iaikvLi4vLi4va2VybmVsL3ZtbGludXgubGRzCi0KLSQob2JqKS92bWxpbnV4OiAkKE9CSkVDVFMpICQob2JqKS9waWdneS5vICQoTElCR0NDKSBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQotCUA6Ci0KLSQob2JqKS92bWxpbnV4LmJpbjogdm1saW51eCBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCi0KLSQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKLQotT0JKQ09QWUZMQUdTICs9IC1SIC5lbXB0eV96ZXJvX3BhZ2UKLQotJChvYmopL3BpZ2d5Lm86ICQob2JqKS9waWdneS5TICQob2JqKS92bWxpbnV4LmJpbi5neiBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGFzX29fUykKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlXzY0IGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGVfNjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OGQ0ZjkuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGVfNjQKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jCi0jIGFyY2gvc2gvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlXzY0Ci0jCi0jIGNyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eCBpbWFnZSBmcm9tIHRoZSBvcmlnaW5hbCB2bWxpbnV4Ci0jCi0jIENvcHlyaWdodCAoQykgMjAwMiBTdHVhcnQgTWVuZWZ5Ci0jIENvcHlyaWdodCAoQykgMjAwNCBQYXVsIE11bmR0Ci0jCi0jIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0jIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSMgZm9yIG1vcmUgZGV0YWlscy4KLSMKLQotdGFyZ2V0cwkJOj0gdm1saW51eCB2bWxpbnV4LmJpbiB2bWxpbnV4LmJpbi5neiBcCi0JCSAgIGhlYWRfNjQubyBtaXNjXzY0Lm8gY2FjaGUubyBwaWdneS5vCi0KLU9CSkVDVFMJCTo9ICQob2JqKS92bWxpbnV4XzY0LmxkcyAkKG9iaikvaGVhZF82NC5vICQob2JqKS9taXNjXzY0Lm8gXAotCQkgICAkKG9iaikvY2FjaGUubwotCi0jCi0jIFpJTUFHRV9PRkZTRVQgaXMgdGhlIGxvYWQgb2Zmc2V0IG9mIHRoZSBjb21wcmVzc2lvbiBsb2FkZXIKLSMgKDRNIGZvciB0aGUga2VybmVsIHBsdXMgNjRLIGZvciB0aGlzIGxvYWRlcikKLSMKLVpJTUFHRV9PRkZTRVQJOj0gJChzaGVsbCAvYmluL2Jhc2ggLWMgJ3ByaW50ZiAiMHglMDh4IiBcCi0JCSAgICAgJCRbJChDT05GSUdfUEFHRV9PRkZTRVQpKzB4NDAwMDAwKzB4MTAwMDBdJykKLQotTERGTEFHU192bWxpbnV4IDo9IC1UdGV4dCAkKFpJTUFHRV9PRkZTRVQpIC1lIHN0YXJ0dXAgXAotCQkgICAgLVQgJChvYmopLy4uLy4uL2tlcm5lbC92bWxpbnV4LmxkcwotCi0kKG9iaikvdm1saW51eDogJChPQkpFQ1RTKSAkKG9iaikvcGlnZ3kubyBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGxkKQotCUA6Ci0KLSQob2JqKS92bWxpbnV4LmJpbjogdm1saW51eCBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLG9iamNvcHkpCi0KLSQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKLQotT0JKQ09QWUZMQUdTICs9IC1SIC5lbXB0eV96ZXJvX3BhZ2UKLQotJChvYmopL3BpZ2d5Lm86ICQob2JqKS9waWdneS5TICQob2JqKS92bWxpbnV4LmJpbi5neiBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGFzX29fUykKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUyBiL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUwppbmRleCA2MjJlYWMzLi45OTkzMTEzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKKysrIGIvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCkBAIC0xNCw2ICsxNCw3IEBACiAgKiAgIENvcHlyaWdodCAoQykgMjAwMiBTdHVhcnQgTWVuZWZ5IChzdHVhcnQubWVuZWZ5QHN0LmNvbSkKICAqLwogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxjcHUvbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxjcHUvcmVnaXN0ZXJzLmg+CiAKQEAgLTMzLDExICszNCw3IEBACiAjZGVmaW5lCUlDQ1IwX0lOSVRfVkFMCUlDQ1IwX09OIHwgSUNDUjBfSUNJCQkvKiBJQ0UgKyBJQ0kgKi8KICNkZWZpbmUJSUNDUjFfSU5JVF9WQUwJSUNDUjFfTk9MT0NLCQkJLyogTm8gbG9ja2luZyAqLwogCi0jaWYgMQogI2RlZmluZQlPQ0NSMF9JTklUX1ZBTAlPQ0NSMF9PTiB8IE9DQ1IwX09DSSB8IE9DQ1IwX1dCCS8qIE9DRSArIE9DSSArIFdCICovCi0jZWxzZQotI2RlZmluZQlPQ0NSMF9JTklUX1ZBTAlPQ0NSMF9PRkYKLSNlbmRpZgogI2RlZmluZQlPQ0NSMV9JTklUX1ZBTAlPQ0NSMV9OT0xPQ0sJCQkvKiBObyBsb2NraW5nICovCiAKIAkudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib290L2NvbXByZXNzZWQvdm1saW51eF82NC5sZHMgYi9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4XzY0LmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljMmVmNC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4XzY0LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBsZCBzY3JpcHQgdG8gbWFrZSBjb21wcmVzc2VkIFN1cGVySC9zaG1lZGlhIExpbnV4IGtlcm5lbCtkZWNvbXByZXNzaW9uCi0gKgkJYm9vdHN0cmFwCi0gKiBNb2RpZmllZCBieSBTdHVhcnQgTWVuZWZ5IGZyb20gYXJjaC9zaC92bWxpbnV4Lmxkcy5TIHdyaXR0ZW4gYnkgTmlpYmUgWXV0YWthCi0gKi8KLQotCi0jaWZkZWYgQ09ORklHX0xJVFRMRV9FTkRJQU4KLS8qIE9VVFBVVF9GT1JNQVQoImVsZjMyLXNoNjRsLWxpbnV4IiwgImVsZjMyLXNoNjRsLWxpbnV4IiwgImVsZjMyLXNoNjRsLWxpbnV4IikgKi8KLSNkZWZpbmUgTk9QIDB4NmZmMGZmZjAKLSNlbHNlCi0vKiBPVVRQVVRfRk9STUFUKCJlbGYzMi1zaDY0IiwgImVsZjMyLXNoNjQiLCAiZWxmMzItc2g2NCIpICovCi0jZGVmaW5lIE5PUCAweGYwZmZmMDZmCi0jZW5kaWYKLQotT1VUUFVUX0ZPUk1BVCgiZWxmMzItc2g2NC1saW51eCIpCi1PVVRQVVRfQVJDSChzaCkKLUVOVFJZKF9zdGFydCkKLQotI2RlZmluZSBBTElHTkVEX0dBUChzZWN0aW9uLCBhbGlnbikgKCgoQUREUihzZWN0aW9uKStTSVpFT0Yoc2VjdGlvbikrKGFsaWduKS0xKSAmIH4oKGFsaWduKS0xKSktQUREUihzZWN0aW9uKSkKLSNkZWZpbmUgRk9MTE9XSU5HKHNlY3Rpb24sIGFsaWduKSBBVCAoTE9BREFERFIoc2VjdGlvbikgKyBBTElHTkVEX0dBUChzZWN0aW9uLGFsaWduKSkKLQotU0VDVElPTlMKLXsKLSAgX3RleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCi0KLSAgLnRleHQgOiB7Ci0JKigudGV4dCkKLQkqKC50ZXh0NjQpCi0JKigudGV4dC4uU0htZWRpYTMyKQotCSooLmZpeHVwKQotCSooLmdudS53YXJuaW5nKQotCX0gPSBOT1AKLSAgLiA9IEFMSUdOKDQpOwotICAucm9kYXRhIDogeyAqKC5yb2RhdGEpIH0KLQotICAvKiBUaGVyZSBpcyBubyAncmVhbCcgcmVhc29uIGZvciBlaWdodCBieXRlIGFsaWdubWVudCwgZm91ciB3b3VsZCB3b3JrCi0gICAqIGFzIHdlbGwsIGJ1dCBnZGIgZG93bmxvYWRzIG11Y2ggKCo0KSBmYXN0ZXIgd2l0aCB0aGlzLgotICAgKi8KLSAgLiA9IEFMSUdOKDgpOwotICAuaW1hZ2UgOiB7ICooLmltYWdlKSB9Ci0gIC4gPSBBTElHTig0KTsKLSAgX2V0ZXh0ID0gLjsJCQkvKiBFbmQgb2YgdGV4dCBzZWN0aW9uICovCi0KLSAgLmRhdGEgOgkJCS8qIERhdGEgKi8KLQlGT0xMT1dJTkcoLmltYWdlLCA0KQotCXsKLQlfZGF0YSA9IC47Ci0JKiguZGF0YSkKLQl9Ci0gIF9kYXRhX2ltYWdlID0gTE9BREFERFIoLmRhdGEpOy8qIEFkZHJlc3Mgb2YgZGF0YSBzZWN0aW9uIGluIFJPTSAqLwotCi0gIF9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwotCi0gIC5zdGFjayA6IHsgc3RhY2sgPSAuOyAgX3N0YWNrID0gLjsgfQotCi0gIC4gPSBBTElHTig0KTsKLSAgX19ic3Nfc3RhcnQgPSAuOwkJLyogQlNTICovCi0gIC5ic3MgOiB7Ci0JKiguYnNzKQotCX0KLSAgLiA9IEFMSUdOKDQpOwotICBfZW5kID0gLiA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NjaGlwcy9LY29uZmlnIGIvYXJjaC9zaC9jY2hpcHMvS2NvbmZpZwppbmRleCBmNDNkMTgzLi5hNWFiMmVjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NjaGlwcy9LY29uZmlnCisrKyBiL2FyY2gvc2gvY2NoaXBzL0tjb25maWcKQEAgLTM0LDExICszNCw2IEBACiAKIAkgIERvIG5vdCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogCi1jb25maWcgSEQ2NDQ2MV9JT0JBU0UKLQloZXggIkhENjQ0NjEgc3RhcnQgYWRkcmVzcyIKLQlkZXBlbmRzIG9uIEhENjQ0NjEKLQlkZWZhdWx0ICIweGIwMDAwMDAwIgotCiBjb25maWcgSEQ2NDQ2MV9FTkFCTEVSCiAJYm9vbCAiSEQ2NDQ2MSBQQ01DSUEgZW5hYmxlciIKIAlkZXBlbmRzIG9uIEhENjQ0NjEKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2MS5jIGIvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDYxLmMKaW5kZXggMjVlZjkxMC4uNTBhYTBjMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDYxLmMKKysrIGIvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDYxLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAogCXByaW50ayhLRVJOX0lORk8KIAkgICAgICAgIkhENjQ0NjEgY29uZmlndXJlZCBhdCAweCV4IG9uIGlycSAlZChtYXBwZWQgaW50byAlZCB0byAlZClcbiIsCi0JICAgICAgIENPTkZJR19IRDY0NDYxX0lPQkFTRSwgQ09ORklHX0hENjQ0NjFfSVJRLCBIRDY0NDYxX0lSUUJBU0UsCisJICAgICAgIEhENjQ0NjFfSU9CQVNFLCBDT05GSUdfSEQ2NDQ2MV9JUlEsIEhENjQ0NjFfSVJRQkFTRSwKIAkgICAgICAgSEQ2NDQ2MV9JUlFCQVNFICsgMTUpOwogCiAvKiBTaG91bGQgYmUgYXQgcHJvY2Vzc29yIHNwZWNpZmljIHBhcnQuLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2FwMzI1cnhhX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9hcDMyNXJ4YV9kZWZjb25maWcKaW5kZXggYzhkOTgyYS4uMDIyZjcwZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2FwMzI1cnhhX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvYXAzMjVyeGFfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxNzo0Njo1MyAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTI6NDI6MDYgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNzQsNiArNzUsNyBAQAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiAjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtOTIsMTIgKzk0LDE1IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTExMCw3ICsxMTUsNiBAQAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE1OSw2ICsxNjMsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMz15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTY4LDggKzE3Myw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTU3Myw2ICs1NzYsNyBAQAogQ09ORklHX1NDU0lfTE9XTEVWRUw9eQogIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CkBAIC02OTUsNiArNjk5LDcgQEAKICMKICMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAogIworIyBDT05GSUdfU0VSSUFMX01BWDMxMDAgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF9TSF9TQ0k9eQogQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFM9NgogQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CkBAIC0xMDMwLDYgKzEwMzUsNyBAQAogQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQogIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CiBDT05GSUdfRVhUM19GU19TRUNVUklUWT15CkBAIC0xMDUyLDYgKzEwNTgsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC0xMTAwLDYgKzExMTEsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC0xMTkxLDEwICsxMjAzLDI0IEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwogIworIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTEzMDMsNiArMTMyOSw3IEBACiAjCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9jYXltYW5fZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2NheW1hbl9kZWZjb25maWcKaW5kZXggZmE1ZmMxZS4uNDAzMDFmOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL2NheW1hbl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2NheW1hbl9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxNzo0OToxNCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTM6NDI6NTMgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiAjIENPTkZJR19TVVBFUkgzMiBpcyBub3Qgc2V0CkBAIC00MCw2ICs0MCw3IEBACiBDT05GSUdfU1dBUD15CiAjIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKIENPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BPU0lYX01RVUVVRV9TWVNDVEw9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldApAQCAtNzAsNiArNzEsNyBAQAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC04OSwxMCArOTEsMTMgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMDUsNyArMTEwLDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xMjcsMzkgKzEzMSw2IEBACiAjIFN5c3RlbSB0eXBlCiAjCiBDT05GSUdfQ1BVX1NINT15Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX01YRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxPXkKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCkBAIC0yNzksOCArMjUwLDYgQEAKICMKIENPTkZJR19QQ0k9eQogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15Ci1DT05GSUdfUENJX0FVVE89eQotQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQogIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogQ09ORklHX1BDSV9MRUdBQ1k9eQpAQCAtNDkyLDYgKzQ2MSw3IEBACiAjIENPTkZJR19TQ1NJX01QVDJTQVMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKQEAgLTU2OCw2ICs1MzgsNyBAQAogIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JR0IgaXMgbm90IHNldAorIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CkBAIC01OTEsNiArNTYyLDcgQEAKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKQEAgLTc3OSw2ICs3NTEsNyBAQAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzUzNzVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRzc2MEEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldApAQCAtMTA0Miw3ICsxMDE1LDYgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CkBAIC0xMDgyLDYgKzEwNTQsNyBAQAogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC0xMTA1LDYgKzEwNzgsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC0xMTQ2LDggKzExMjQsMTMgQEAKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CitDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JMT0NLPXkKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JPVEggaXMgbm90IHNldAorQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMTIwOCw2ICsxMTkxLDkgQEAKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCiBDT05GSUdfU0NIRURfREVCVUc9eQogQ09ORklHX1NDSEVEU1RBVFM9eQogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldApAQCAtMTI0MSwxNSArMTIyNywyMSBAQAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQUdFX1BPSVNPTklORyBpcyBub3Qgc2V0CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCiAjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0JPT1RNRU0gaXMgbm90IHNldApAQCAtMTM1NCw2ICsxMzQ2LDcgQEAKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQogIyBDT05GSUdfQ1JZUFRPX0RFVl9ISUZOXzc5NVggaXMgbm90IHNldAorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2RyZWFtY2FzdF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZwppbmRleCA1YzExMjM2Li4xZjNjYzk4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvZHJlYW1jYXN0X2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTc6NTE6NDggMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEyOjQ0OjI3IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTcxLDYgKzcyLDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC05MCw2ICs5Miw3IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX09QUk9GSUxFIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldApAQCAtOTgsNiArMTAxLDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMTAsNyArMTE1LDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNTYsNiArMTYwLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTY1LDggKzE3MCw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTI3MSw3ICsyNzQsNyBAQAogQ09ORklHX1NIX0RNQV9BUEk9eQogQ09ORklHX1NIX0RNQT15CiBDT05GSUdfU0hfRE1BX0lSUV9NVUxUST15Ci1DT05GSUdfTlJfT05DSElQX0RNQV9DSEFOTkVMUz02CitDT05GSUdfTlJfT05DSElQX0RNQV9DSEFOTkVMUz00CiBDT05GSUdfTlJfRE1BX0NIQU5ORUxTX0JPT0w9eQogQ09ORklHX05SX0RNQV9DSEFOTkVMUz05CiAjIENPTkZJR19QVlIyX0RNQSBpcyBub3Qgc2V0CkBAIC0zMjAsNyArMzIzLDYgQEAKIENPTkZJR19NQVBMRT15CiBDT05GSUdfUENJPXkKIENPTkZJR19TSF9QQ0lETUFfTk9OQ09IRVJFTlQ9eQotQ09ORklHX1BDSV9BVVRPPXkKICMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIENPTkZJR19QQ0lfTEVHQUNZPXkKQEAgLTYwMiw2ICs2MDQsNyBAQAogIyBDT05GSUdfTU9VU0VfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CiAjIENPTkZJR19NT1VTRV9CQ001OTc0IGlzIG5vdCBzZXQKICMgQ09ORklHX01PVVNFX1ZTWFhYQUEgaXMgbm90IHNldAorIyBDT05GSUdfTU9VU0VfTUFQTEUgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKQEAgLTgxMiw3ICs4MTUsNiBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKQEAgLTg2Nyw2ICs4NjksMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC05MTAsNiArOTE3LDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CkBAIC05NDcsMTAgKzk1NSwyNCBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CkBAIC0xMDUxLDYgKzEwNzMsNyBAQAogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CiAjIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvZWRvc2s3NzA1X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9lZG9zazc3MDVfZGVmY29uZmlnCmluZGV4IGY0YzM0YjAuLmQ3MDkyNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9lZG9zazc3MDVfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9lZG9zazc3MDVfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxNzo1NDowMiAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTI6NDU6MDQgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKQEAgLTU2LDYgKzU3LDcgQEAKICMgQ09ORklHX1VJRDE2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogIyBDT05GSUdfUFJJTlRLIGlzIG5vdCBzZXQKICMgQ09ORklHX0JVRyBpcyBub3Qgc2V0CkBAIC03NCwxMiArNzYsMTUgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX0JBU0VfU01BTEw9MQogIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CkBAIC0xMTQsNiArMTE5LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTIzLDggKzEyOSw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTM4Miw2ICszODYsMTAgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworCisjCiAjIFBzZXVkbyBmaWxlc3lzdGVtcwogIwogIyBDT05GSUdfUFJPQ19GUyBpcyBub3Qgc2V0CkBAIC00MDksMTAgKzQxNywyMiBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtNDI2LDYgKzQ0Niw3IEBACiAjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvZWRvc2s3NzYwX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9lZG9zazc3NjBfZGVmY29uZmlnCmluZGV4IDc4MjVjMjYuLmE4MjJiMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9lZG9zazc3NjBfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9lZG9zazc3NjBfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxNzo1NDo1NyAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTI6NDU6MjUgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNDAsNiArNDEsNyBAQAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKIENPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BPU0lYX01RVUVVRV9TWVNDVEw9eQogQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldApAQCAtNjcsNyArNjksNiBAQAogQ09ORklHX1JEX0daSVA9eQogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkU9eQogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTc3LDYgKzc4LDcgQEAKIENPTkZJR19LQUxMU1lNUz15CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTk2LDYgKzk4LDcgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtMTAzLDYgKzEwNiw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTE1LDcgKzEyMCw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTYxLDYgKzE2NSw3IEBACiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwPXkKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0xNzAsOCArMTc1LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtODE1LDYgKzgxOCw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKIENPTkZJR19FWFQyX0ZTX1hJUD15CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC04MzksNiArODQzLDExIEBACiBDT05GSUdfR0VORVJJQ19BQ0w9eQogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC04ODMsNiArODkyLDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKICMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CkBAIC05NjQsNiArOTc0LDkgQEAKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCiAjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKIENPTkZJR19USU1FUl9TVEFUUz15CkBAIC0xMDAxLDYgKzEwMTQsNyBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTEwMTAsOSArMTAyNCwxNCBAQAogIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldApAQCAtMTEyNiw2ICsxMTQ1LDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2VzcHRfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2VzcHRfZGVmY29uZmlnCmluZGV4IGViYjRjMzcuLmM1YjUwMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9lc3B0X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvZXNwdF9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE3OjU4OjE4IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMjo0NjoyNiAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC03OCw2ICs3OSw3IEBACiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtMTA2LDYgKzEwOCw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTE3LDcgKzEyMSw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY0LDYgKzE2Nyw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjM9eQogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0xNzMsOCArMTc3LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtNTQ4LDYgKzU1MCw3IEBACiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKQEAgLTkxOSw2ICs5MjIsNyBAQAogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC05NDMsNiArOTQ3LDExIEBACiBDT05GSUdfR0VORVJJQ19BQ0w9eQogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC05ODUsOCArOTk0LDEzIEBACiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfUk9NRlNfRlM9eQorQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9CTE9DSz15CisjIENPTkZJR19ST01GU19CQUNLRURfQllfTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9CT1RIIGlzIG5vdCBzZXQKK0NPTkZJR19ST01GU19PTl9CTE9DSz15CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiAjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldApAQCAtMTA3NSwxMSArMTA4OSwyNSBAQAogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtMTE3OSw2ICsxMjA3LDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQorQ09ORklHX0JJTkFSWV9QUklOVEY9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9ocDZ4eF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvaHA2eHhfZGVmY29uZmlnCmluZGV4IDgyYjExM2EuLjhlMTMwMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9ocDZ4eF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2hwNnh4X2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6MDE6MDUgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEyOjQ3OjE1IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTY3LDYgKzY4LDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC04NSwxMiArODcsMTUgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtOTgsNyArMTAzLDYgQEAKICMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTQ0LDYgKzE0OCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE1Myw4ICsxNTgsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0zODUsNiArMzg4LDcgQEAKICMgQ09ORklHX1NDU0lfU1JQX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPV0xFVkVMX1BDTUNJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKQEAgLTQzMSw2ICs0MzUsNyBAQAogIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfVEFCTEVUIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTj15CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldApAQCAtNjc0LDYgKzY3OSwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTcxOSw2ICs3MjksNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBQYXJ0aXRpb24gVHlwZXMKQEAgLTc4NiwxMCArNzk3LDIzIEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwogIworIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTg5OCw2ICs5MjIsNyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9sYW5kaXNrX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9sYW5kaXNrX2RlZmNvbmZpZwppbmRleCBiNmZhNGE3Li43ZjU0OWFlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvbGFuZGlza19kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL2xhbmRpc2tfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxODowMjo1NCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTI6NDc6NDggMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNjksNiArNzAsNyBAQAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC04OCw2ICs5MCw3IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtOTUsNiArOTgsOCBAQAogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTEwNyw3ICsxMTIsNiBAQAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE1Myw2ICsxNTcsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0xNjIsOCArMTY3LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtMjkyLDggKzI5NSw2IEBACiAjCiBDT05GSUdfUENJPXkKIENPTkZJR19TSF9QQ0lETUFfTk9OQ09IRVJFTlQ9eQotQ09ORklHX1BDSV9BVVRPPXkKLUNPTkZJR19QQ0lfQVVUT19VUERBVEVfUkVTT1VSQ0VTPXkKICMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIENPTkZJR19QQ0lfTEVHQUNZPXkKQEAgLTYwMiw2ICs2MDMsNyBAQAogIyBDT05GSUdfU0NTSV9NUFQyU0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CkBAIC03MDYsNiArNzA4LDcgQEAKICMgQ09ORklHX0UxMDAwRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSUdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQlZGIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApAQCAtNzI5LDYgKzczMiw3IEBACiAjIENPTkZJR19JWEdCRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKICMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfVlhHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX05JVSBpcyBub3Qgc2V0CkBAIC05MjIsNiArOTI2LDcgQEAKICMgQ09ORklHX1NPQ19DQU1FUkEgaXMgbm90IHNldAogQ09ORklHX1Y0TF9VU0JfRFJJVkVSUz15CiAjIENPTkZJR19VU0JfVklERU9fQ0xBU1MgaXMgbm90IHNldAorQ09ORklHX1VTQl9WSURFT19DTEFTU19JTlBVVF9FVkRFVj15CiAjIENPTkZJR19VU0JfR1NQQ0EgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fSERQVlIgaXMgbm90IHNldAogQ09ORklHX1ZJREVPX1VTQlZJREVPPW0KQEAgLTk5NCwxNSArOTk5LDE3IEBACiAjCiAjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKLUNPTkZJR19ISURfQ09NUEFUPXkKIENPTkZJR19ISURfQTRURUNIPW0KIENPTkZJR19ISURfQVBQTEU9bQogQ09ORklHX0hJRF9CRUxLSU49bQogQ09ORklHX0hJRF9DSEVSUlk9bQogQ09ORklHX0hJRF9DSElDT05ZPW0KIENPTkZJR19ISURfQ1lQUkVTUz1tCisjIENPTkZJR19EUkFHT05SSVNFX0ZGIGlzIG5vdCBzZXQKIENPTkZJR19ISURfRVpLRVk9bQorIyBDT05GSUdfSElEX0tZRSBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0dZUkFUSU9OPW0KKyMgQ09ORklHX0hJRF9LRU5TSU5HVE9OIGlzIG5vdCBzZXQKIENPTkZJR19ISURfTE9HSVRFQ0g9bQogIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAogIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldApAQCAtMTE5Nyw2ICsxMjA0LDcgQEAKICMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAogIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKICMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldApAQCAtMTIyMiw2ICsxMjMwLDExIEBACiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKIENPTkZJR19JU085NjYwX0ZTPW0KQEAgLTEyNzAsMTAgKzEyODMsMTUgQEAKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CitDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JMT0NLPXkKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JPVEggaXMgbm90IHNldAorQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogQ09ORklHX1VGU19GUz1tCiAjIENPTkZJR19VRlNfRlNfV1JJVEUgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPW0KIENPTkZJR19ORlNfVjM9eQpAQCAtMTM2NCwxMCArMTM4MiwyMyBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogQ09ORklHX1NIX1NUQU5EQVJEX0JJT1M9eQpAQCAtMTQ2OSw2ICsxNTAwLDcgQEAKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQogIyBDT05GSUdfQ1JZUFRPX0RFVl9ISUZOXzc5NVggaXMgbm90IHNldAorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL2xib3hyZTJfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL2xib3hyZTJfZGVmY29uZmlnCmluZGV4IDkyYzUxNWMuLmE3ZGI1MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9sYm94cmUyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvbGJveHJlMl9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjA2OjUxIDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMjo0ODo1NCAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC02OSw2ICs3MCw3IEBACiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTg4LDYgKzkwLDcgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC05NSw2ICs5OCw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTA3LDcgKzExMiw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTUzLDYgKzE1Nyw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE2Miw4ICsxNjcsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0yOTMsOCArMjk2LDYgQEAKICMKIENPTkZJR19QQ0k9eQogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15Ci1DT05GSUdfUENJX0FVVE89eQotQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQogIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogQ09ORklHX1BDSV9MRUdBQ1k9eQpAQCAtNTQyLDYgKzU0Myw3IEBACiAjIENPTkZJR19TQ1NJX01QVDJTQVMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKQEAgLTcwMiw2ICs3MDQsNyBAQAogIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JR0IgaXMgbm90IHNldAorIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CkBAIC03MjUsNiArNzI4LDcgQEAKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKQEAgLTkzMSw3ICs5MzUsNiBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKQEAgLTEwMDcsNiArMTAxMCw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTEwMjksNiArMTAzMywxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTEwNzMsOCArMTA4MiwxMyBAQAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAogQ09ORklHX1JPTUZTX0ZTPXkKK0NPTkZJR19ST01GU19CQUNLRURfQllfQkxPQ0s9eQorIyBDT05GSUdfUk9NRlNfQkFDS0VEX0JZX01URCBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19CQUNLRURfQllfQk9USCBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfT05fQkxPQ0s9eQogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKQEAgLTExNTEsMTAgKzExNjUsMjMgQEAKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKIENPTkZJR19TSF9TVEFOREFSRF9CSU9TPXkKQEAgLTEyNTYsNiArMTI4Myw3IEBACiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKICMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9tYWdpY3BhbmVscjJfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL21hZ2ljcGFuZWxyMl9kZWZjb25maWcKaW5kZXggMjY1ODZjMi4uNThiZWM2MSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL21hZ2ljcGFuZWxyMl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL21hZ2ljcGFuZWxyMl9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjA3OjM5IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMjo0OTozMiAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC0zOSw2ICs0MCw3IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMz15CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldApAQCAtNjYsNyArNjgsNiBAQAogQ09ORklHX1JEX0daSVA9eQogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkU9eQogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtNzYsNiArNzcsNyBAQAogQ09ORklHX0tBTExTWU1TPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtOTQsNiArOTYsNyBAQAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKQEAgLTEwMSw2ICsxMDQsOCBAQAogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTExMyw3ICsxMTgsNiBAQAogQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTD15CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNTksNiArMTYzLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTY4LDggKzE3Myw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTgxMyw2ICs4MTYsNyBAQAogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQpAQCAtODMxLDYgKzgzNSwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTg4NCw2ICs4OTMsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC05NjUsNiArOTc1LDcgQEAKIENPTkZJR19ERUJVR19LRVJORUw9eQogIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAogIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVURUNUX0hVTkdfVEFTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKQEAgLTEwMDAsNiArMTAxMSw3IEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwpAQCAtMTAwOCw5ICsxMDIwLDE0IEBACiAjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC0xMDM1LDYgKzEwNTIsNyBAQAogIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL21pY3JvZGV2X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9taWNyb2Rldl9kZWZjb25maWcKaW5kZXggNzUxNzgzNS4uMjg4NmZjOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL21pY3JvZGV2X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvbWljcm9kZXZfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxODoxMToxMyAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTI6NTA6NTEgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNjUsNyArNjYsNiBAQAogQ09ORklHX1JEX0daSVA9eQogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkU9eQogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtNzQsNiArNzQsNyBAQAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTkyLDEyICs5MywxNSBAQAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMDUsNyArMTA5LDYgQEAKICMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTUxLDYgKzE1NCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDI9eQogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0xNjAsOCArMTY0LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtNjQ3LDYgKzY0OSw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTY2OSw2ICs2NzIsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC03MTUsNiArNzIzLDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtODAyLDEwICs4MTEsMjQgQEAKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtOTE0LDYgKzkzNyw3IEBACiAjCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9taWdvcl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvbWlnb3JfZGVmY29uZmlnCmluZGV4IGE4NzIwZjkuLjhlY2NlYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9taWdvcl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL21pZ29yX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6MTQ6MDMgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEyOjUxOjM0IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTY3LDcgKzY4LDYgQEAKIENPTkZJR19SRF9HWklQPXkKICMgQ09ORklHX1JEX0JaSVAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JEX0xaTUEgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19DT01QUkVTU0lPTl9OT05FPXkKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTc2LDYgKzc2LDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC0xMDQsNiArMTA1LDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMTUsNyArMTE4LDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjUsNiArMTY3LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTc0LDggKzE3Nyw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMj15CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC01NzcsNiArNTc4LDcgQEAKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldApAQCAtODczLDcgKzg3NSw2IEBACiAjCiAjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKLUNPTkZJR19ISURfQ09NUEFUPXkKIENPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiAjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CkBAIC0xMDEyLDYgKzEwMTMsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC0xMDU2LDYgKzEwNjIsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTExMDUsMTEgKzExMTIsMjUgQEAKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19SSU5HX0JVRkZFUj15CiBDT05GSUdfVFJBQ0lORz15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTEyMTgsNiArMTIzOSw3IEBACiAjCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorQ09ORklHX0JJTkFSWV9QUklOVEY9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9wb2xhcmlzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9wb2xhcmlzX2RlZmNvbmZpZwppbmRleCBkZjJkMTc3ZC4uMmI5NTA3MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3BvbGFyaXNfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9wb2xhcmlzX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6MTY6NDggMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEyOjUyOjE5IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTQwLDYgKzQxLDcgQEAKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19QT1NJWF9NUVVFVUVfU1lTQ1RMPXkKIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzPXkKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CkBAIC03Niw2ICs3OCw3IEBACiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC05NCw2ICs5Nyw3IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtMTAxLDYgKzEwNSw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTEzLDcgKzExOSw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTU5LDYgKzE2NCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE2OCw4ICsxNzQsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC03NzgsNiArNzgyLDExIEBACiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKICMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldApAQCAtODMxLDYgKzg0MCw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTg3NCw2ICs4ODQsOSBAQAogQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKICMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CisjIENPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDX1ZBTFVFPTAKICMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldApAQCAtOTE0LDYgKzkyNyw3IEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwpAQCAtOTIzLDkgKzkzNywxNCBAQAogIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldApAQCAtOTUwLDYgKzk2OSw3IEBACiAjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBtcF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODBtcF9kZWZjb25maWcKaW5kZXggN2RlZjRkZi4uOTQzZGE2MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3I3NzgwbXBfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9yNzc4MG1wX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6MjA6MTcgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEyOjUzOjI4IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTc4LDYgKzc5LDcgQEAKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtMTA3LDYgKzEwOSw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX0JBU0VfU01BTEw9MApAQCAtMTE4LDcgKzEyMiw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY1LDYgKzE2OCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MD15CkBAIC0xNzQsOCArMTc4LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtMjU4LDcgKzI2MCw3IEBACiAjCiBDT05GSUdfU0hfVE1VPXkKIENPTkZJR19TSF9USU1FUl9JUlE9MjgKLUNPTkZJR19TSF9QQ0xLX0ZSRVE9MzIwMDAwMDAKK0NPTkZJR19TSF9QQ0xLX0ZSRVE9MzMzMzMzMzMKICMgQ09ORklHX05PX0haIGlzIG5vdCBzZXQKICMgQ09ORklHX0hJR0hfUkVTX1RJTUVSUyBpcyBub3Qgc2V0CiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CkBAIC0zMTMsOCArMzE1LDYgQEAKICMKIENPTkZJR19QQ0k9eQogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15Ci1DT05GSUdfUENJX0FVVE89eQotQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQogIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogQ09ORklHX1BDSV9MRUdBQ1k9eQpAQCAtNTM2LDYgKzUzNiw3IEBACiAjIENPTkZJR19TQ1NJX01QVDJTQVMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKQEAgLTY5Niw2ICs2OTcsNyBAQAogIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JR0IgaXMgbm90IHNldAorIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CkBAIC03MTksNiArNzIxLDcgQEAKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKQEAgLTkyMCw2ICs5MjMsNyBAQAogIyBDT05GSUdfU0VOU09SU19GNzE4MDVGIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODgyRkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GNzUzNzVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRzc2MEEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0lUODcgaXMgbm90IHNldApAQCAtMTAyNyw3ICsxMDMxLDYgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CkBAIC0xMTIwLDYgKzExMjMsNyBAQAogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC0xMTQzLDYgKzExNDcsMTEgQEAKIENPTkZJR19GVVNFX0ZTPW0KIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKICMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldApAQCAtMTE5MSw2ICsxMjAwLDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMTI3OSw2ICsxMjg5LDkgQEAKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCiBDT05GSUdfU0NIRURfREVCVUc9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CkBAIC0xMzE2LDYgKzEzMjksNyBAQAogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTEzMjUsMTEgKzEzMzksMTYgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC0xNDQ5LDYgKzE0NjgsNyBAQAogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CiAjIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3I3Nzg1cnBfZGVmY29uZmlnCmluZGV4IGNiMTM0ZmYuLjgyNjU4ZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9yNzc4NXJwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvcjc3ODVycF9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjI0OjM1IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMjo1NToxMCAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC00Myw2ICs0NCw3IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CkBAIC03OCw2ICs4MCw3IEBACiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC0xMDgsNiArMTExLDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMjAsNyArMTI1LDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjgsNiArMTcyLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTc3LDggKzE4Miw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTI2Niw3ICsyNjksNyBAQAogIwogQ09ORklHX1NIX1RNVT15CiBDT05GSUdfU0hfVElNRVJfSVJRPTI4Ci1DT05GSUdfU0hfUENMS19GUkVRPTUwMDAwMDAwCitDT05GSUdfU0hfUENMS19GUkVRPTMzMzMzMzMzCiBDT05GSUdfVElDS19PTkVTSE9UPXkKIENPTkZJR19OT19IWj15CiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKQEAgLTMzNyw4ICszNDAsNiBAQAogIwogQ09ORklHX1BDST15CiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKLUNPTkZJR19QQ0lfQVVUTz15Ci1DT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0lfTEVHQUNZIGlzIG5vdCBzZXQKQEAgLTU2MSw2ICs1NjIsNyBAQAogIyBDT05GSUdfU0NTSV9NUFQyU0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CkBAIC02OTgsNiArNzAwLDcgQEAKICMgQ09ORklHX0UxMDAwRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSUdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQlZGIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApAQCAtNzIxLDYgKzcyNCw3IEBACiAjIENPTkZJR19JWEdCRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKICMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfVlhHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX05JVSBpcyBub3Qgc2V0CkBAIC05NDgsNiArOTUyLDcgQEAKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0Y3MTg4MkZHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjc1Mzc1UyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0c3NjBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JVDg3IGlzIG5vdCBzZXQKQEAgLTk3MCw2ICs5NzUsNyBAQAogIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzQyNyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TSFQxNSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19ETUUxNzM3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldApAQCAtMTEwOSw3ICsxMTE1LDYgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CkBAIC0xMjAyLDYgKzEyMDcsNyBAQAogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC0xMjI1LDYgKzEyMzEsMTEgQEAKIENPTkZJR19GVVNFX0ZTPW0KIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKICMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldApAQCAtMTI3Myw2ICsxMjg0LDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMTM1OSw2ICsxMzcxLDcgQEAKIENPTkZJR19ERUJVR19LRVJORUw9eQogIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAogIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVURUNUX0hVTkdfVEFTSyBpcyBub3Qgc2V0CiBDT05GSUdfU0NIRURfREVCVUc9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CkBAIC0xNDAxLDYgKzE0MTQsNyBAQAogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTE0MTAsMTEgKzE0MjQsMTYgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC0xNTM0LDYgKzE1NTMsNyBAQAogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CiAjIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3JzazcyMDFfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3JzazcyMDFfZGVmY29uZmlnCmluZGV4IGEwMzdjNzQuLmZhNDM5NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9yc2s3MjAxX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvcnNrNzIwMV9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjI5OjA4IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMjo1NjoyOSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC02NSw3ICs2Niw2IEBACiBDT05GSUdfUkRfR1pJUD15CiAjIENPTkZJR19SRF9CWklQMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRF9MWk1BIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfQ09NUFJFU1NJT05fTk9ORT15CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtNzQsNiArNzQsNyBAQAogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC0xMDAsNiArMTAxLDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKIENPTkZJR19CQVNFX1NNQUxMPTAKQEAgLTExMCw3ICsxMTMsNiBAQAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE1Nyw2ICsxNTksNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0xNjYsOCArMTY5LDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtNjAzLDYgKzYwNCwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTY1MSw4ICs2NTcsMTMgQEAKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CitDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JMT0NLPXkKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JPVEggaXMgbm90IHNldAorQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiAKICMKICMgUGFydGl0aW9uIFR5cGVzCkBAIC02ODYsMTEgKzY5NywyNCBAQAogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtNzA1LDYgKzcyOSw3IEBACiAjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3JzazcyMDNfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3JzazcyMDNfZGVmY29uZmlnCmluZGV4IDlhZTI4ZTguLmUzYTY1ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9yc2s3MjAzX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvcnNrNzIwM19kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjMwOjM0IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMjo1NzowNiAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC0zOSw2ICs0MCw3IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CkBAIC03MCw3ICs3Miw2IEBACiBDT05GSUdfUkRfR1pJUD15CiAjIENPTkZJR19SRF9CWklQMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRF9MWk1BIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfQ09NUFJFU1NJT05fTk9ORT15CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtODAsNiArODEsNyBAQAogQ09ORklHX0tBTExTWU1TPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtMTA2LDYgKzEwOCw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfQkFTRV9TTUFMTD0wCkBAIC0xMTYsNyArMTIwLDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjMsNiArMTY2LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTcyLDggKzE3Niw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTc1MCwxNSArNzUyLDE3IEBACiAjCiAjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKLUNPTkZJR19ISURfQ09NUEFUPXkKIENPTkZJR19ISURfQTRURUNIPXkKIENPTkZJR19ISURfQVBQTEU9eQogQ09ORklHX0hJRF9CRUxLSU49eQogQ09ORklHX0hJRF9DSEVSUlk9eQogQ09ORklHX0hJRF9DSElDT05ZPXkKIENPTkZJR19ISURfQ1lQUkVTUz15CisjIENPTkZJR19EUkFHT05SSVNFX0ZGIGlzIG5vdCBzZXQKIENPTkZJR19ISURfRVpLRVk9eQorIyBDT05GSUdfSElEX0tZRSBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0dZUkFUSU9OPXkKKyMgQ09ORklHX0hJRF9LRU5TSU5HVE9OIGlzIG5vdCBzZXQKIENPTkZJR19ISURfTE9HSVRFQ0g9eQogIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAogIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldApAQCAtODc0LDYgKzg3OCw3IEBACiAjIExFRCBkcml2ZXJzCiAjCiBDT05GSUdfTEVEU19HUElPPXkKK0NPTkZJR19MRURTX0dQSU9fUExBVEZPUk09eQogCiAjCiAjIExFRCBUcmlnZ2VycwpAQCAtODgyLDYgKzg4Nyw3IEBACiBDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSPXkKIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUPXkKIENPTkZJR19MRURTX1RSSUdHRVJfQkFDS0xJR0hUPXkKKyMgQ09ORklHX0xFRFNfVFJJR0dFUl9HUElPIGlzIG5vdCBzZXQKIENPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTj15CiAKICMKQEAgLTk1MSw2ICs5NTcsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC05ODksOCArMTAwMCwxMyBAQAogIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAogQ09ORklHX1JPTUZTX0ZTPXkKK0NPTkZJR19ST01GU19CQUNLRURfQllfQkxPQ0s9eQorIyBDT05GSUdfUk9NRlNfQkFDS0VEX0JZX01URCBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19CQUNLRURfQllfQk9USCBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfT05fQkxPQ0s9eQogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTEwMzMsNiArMTA0OSw5IEBACiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAogQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUNfVkFMVUU9MAogQ09ORklHX1NDSEVEX0RFQlVHPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldApAQCAtMTA3Niw2ICsxMDk1LDcgQEAKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19SSU5HX0JVRkZFUj15CiBDT05GSUdfVFJBQ0lORz15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCkBAIC0xMDgzLDExICsxMTAzLDE2IEBACiAjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKQEAgLTExMTEsNiArMTEzNiw3IEBACiAjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3J0czc3NTFyMmQxX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9ydHM3NzUxcjJkMV9kZWZjb25maWcKaW5kZXggYzBmNzQxYS4uYTRhNTlmNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3J0czc3NTFyMmQxX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZDFfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxODozMzoyNSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTI6NTg6MTMgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNzAsNiArNzEsNyBAQAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTk5LDYgKzEwMSw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTEwLDcgKzExNCw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTU2LDYgKzE1OSw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE2NSw4ICsxNjksNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0zMDIsOCArMzA0LDYgQEAKICMKIENPTkZJR19QQ0k9eQogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15Ci1DT05GSUdfUENJX0FVVE89eQotQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQogIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogQ09ORklHX1BDSV9MRUdBQ1k9eQpAQCAtNTEzLDYgKzUxMyw3IEBACiAjIENPTkZJR19TQ1NJX01QVDJTQVMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKQEAgLTY3Miw2ICs2NzMsNyBAQAogIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JR0IgaXMgbm90IHNldAorIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CkBAIC02OTUsNiArNjk3LDcgQEAKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKQEAgLTc5Myw2ICs3OTYsNyBAQAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCisjIENPTkZJR19TRVJJQUxfTUFYMzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMX1NIX1NDST15CiBDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0xCiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKQEAgLTEwNzksMTUgKzEwODMsMTcgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX0hJRF9BNFRFQ0g9eQogQ09ORklHX0hJRF9BUFBMRT15CiBDT05GSUdfSElEX0JFTEtJTj15CiBDT05GSUdfSElEX0NIRVJSWT15CiBDT05GSUdfSElEX0NISUNPTlk9eQogQ09ORklHX0hJRF9DWVBSRVNTPXkKKyMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9FWktFWT15CisjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CkBAIC0xMjkxLDYgKzEyOTcsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC0xMzM3LDYgKzEzNDgsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKQEAgLTE0MTcsMTEgKzE0MjksMjUgQEAKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19SSU5HX0JVRkZFUj15CiBDT05GSUdfVFJBQ0lORz15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTE1MjQsNiArMTU1MCw3IEBACiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKICMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZHBsdXNfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3J0czc3NTFyMmRwbHVzX2RlZmNvbmZpZwppbmRleCA4ZmVlZjYyLi5hODYwNDM1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZHBsdXNfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9ydHM3NzUxcjJkcGx1c19kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjM0OjEyIDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMjo1OTowMSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC03MCw2ICs3MSw3IEBACiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtOTksNiArMTAxLDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMTAsNyArMTE0LDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNTYsNiArMTU5LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTY1LDggKzE2OSw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTMwMiw4ICszMDQsNiBAQAogIwogQ09ORklHX1BDST15CiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKLUNPTkZJR19QQ0lfQVVUTz15Ci1DT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiBDT05GSUdfUENJX0xFR0FDWT15CkBAIC00MjQsNyArNDI0LDkyIEBACiBDT05GSUdfRVhUUkFfRklSTVdBUkU9IiIKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19NVEQgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CisjIENPTkZJR19NVERfQkxLREVWUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLX1JPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorIyBDT05GSUdfU1NGREMgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09PUFMgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKKyMgQ09ORklHX01URF9SQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1JPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUJTRU5UIGlzIG5vdCBzZXQKKworIworIyBNYXBwaW5nIGRyaXZlcnMgZm9yIGNoaXAgYWNjZXNzCisjCisjIENPTkZJR19NVERfQ09NUExFWF9NQVBQSU5HUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BIWVNNQVA9eQorIyBDT05GSUdfTVREX1BIWVNNQVBfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9JTlRFTF9WUl9OT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1BNQzU1MSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBMUEREUiBmbGFzaCBtZW1vcnkgZHJpdmVycworIworIyBDT05GSUdfTVREX0xQRERSIGlzIG5vdCBzZXQKKworIworIyBVQkkgLSBVbnNvcnRlZCBibG9jayBpbWFnZXMKKyMKKyMgQ09ORklHX01URF9VQkkgaXMgbm90IHNldAogIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CiBDT05GSUdfQkxLX0RFVj15CiAjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldApAQCAtNTEzLDYgKzU5OCw3IEBACiAjIENPTkZJR19TQ1NJX01QVDJTQVMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKQEAgLTY3Miw2ICs3NTgsNyBAQAogIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JR0IgaXMgbm90IHNldAorIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CkBAIC02OTUsNiArNzgyLDcgQEAKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKQEAgLTc5Myw2ICs4ODEsNyBAQAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCisjIENPTkZJR19TRVJJQUxfTUFYMzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfU0VSSUFMX1NIX1NDST15CiBDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0xCiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKQEAgLTEwNzksMTUgKzExNjgsMTcgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX0hJRF9BNFRFQ0g9eQogQ09ORklHX0hJRF9BUFBMRT15CiBDT05GSUdfSElEX0JFTEtJTj15CiBDT05GSUdfSElEX0NIRVJSWT15CiBDT05GSUdfSElEX0NISUNPTlk9eQogQ09ORklHX0hJRF9DWVBSRVNTPXkKKyMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9FWktFWT15CisjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CkBAIC0xMjkxLDYgKzEzODIsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC0xMzM3LDYgKzE0MzMsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKQEAgLTE0MTcsMTEgKzE1MTQsMjUgQEAKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19SSU5HX0JVRkZFUj15CiBDT05GSUdfVFJBQ0lORz15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTE1MjQsNiArMTYzNSw3IEBACiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKICMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2RrNzc4MF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2RrNzc4MF9kZWZjb25maWcKaW5kZXggNzM5ZTIyOS4uYTYyOWI3OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3Nkazc3ODBfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZGs3NzgwX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6MzQ6NDMgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEyOjU5OjMyIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTQxLDYgKzQyLDcgQEAKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19QT1NJWF9NUVVFVUVfU1lTQ1RMPXkKIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKQEAgLTczLDYgKzc1LDcgQEAKIENPTkZJR19LQUxMU1lNUz15CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTkzLDYgKzk2LDcgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtMTAwLDYgKzEwNCw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTEyLDcgKzExOCw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKIENPTkZJR19MQkQ9eQotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE1OSw2ICsxNjQsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODA9eQpAQCAtMTY4LDggKzE3NCw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTMxMCw4ICszMTQsNiBAQAogIwogQ09ORklHX1BDST15CiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKLUNPTkZJR19QQ0lfQVVUTz15Ci1DT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0lfTEVHQUNZIGlzIG5vdCBzZXQKQEAgLTY0Niw2ICs2NDgsNyBAQAogIyBDT05GSUdfU0NTSV9NUFQyU0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKICMgQ09ORklHX0xJQkZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xJQkZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CkBAIC0xMDkxLDE1ICsxMDk0LDE3IEBACiAjCiAjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKLUNPTkZJR19ISURfQ09NUEFUPXkKIENPTkZJR19ISURfQTRURUNIPXkKIENPTkZJR19ISURfQVBQTEU9eQogQ09ORklHX0hJRF9CRUxLSU49eQogQ09ORklHX0hJRF9DSEVSUlk9eQogQ09ORklHX0hJRF9DSElDT05ZPXkKIENPTkZJR19ISURfQ1lQUkVTUz15CisjIENPTkZJR19EUkFHT05SSVNFX0ZGIGlzIG5vdCBzZXQKIENPTkZJR19ISURfRVpLRVk9eQorIyBDT05GSUdfSElEX0tZRSBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0dZUkFUSU9OPXkKKyMgQ09ORklHX0hJRF9LRU5TSU5HVE9OIGlzIG5vdCBzZXQKIENPTkZJR19ISURfTE9HSVRFQ0g9eQogIyBDT05GSUdfTE9HSVRFQ0hfRkYgaXMgbm90IHNldAogIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldApAQCAtMTI1Nyw2ICsxMjYyLDcgQEAKICMgQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkgaXMgbm90IHNldAogIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTEyODEsNiArMTI4NywxMSBAQAogQ09ORklHX0dFTkVSSUNfQUNMPXkKIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKIENPTkZJR19JU085NjYwX0ZTPXkKQEAgLTEzMzEsNiArMTM0Miw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTE0MTgsNiArMTQzMCw5IEBACiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAogQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUNfVkFMVUU9MAogIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiBDT05GSUdfVElNRVJfU1RBVFM9eQpAQCAtMTQ1NSw2ICsxNDcwLDcgQEAKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCkBAIC0xNDY0LDkgKzE0ODAsMTQgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKQEAgLTE1ODAsNiArMTYwMSw3IEBACiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKICMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTcyMDZfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcKaW5kZXggZDMwZTBhNy4uNWNhZjg1YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzIwNl9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjM5OjM3IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMzowMTowMiAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC00MCw2ICs0MSw3IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CkBAIC02Myw2ICs2NSw3IEBACiBDT05GSUdfQ0dST1VQX05TPXkKICMgQ09ORklHX0NHUk9VUF9GUkVFWkVSIGlzIG5vdCBzZXQKIENPTkZJR19DR1JPVVBfREVWSUNFPXkKKyMgQ09ORklHX0NQVVNFVFMgaXMgbm90IHNldAogQ09ORklHX0NHUk9VUF9DUFVBQ0NUPXkKIENPTkZJR19SRVNPVVJDRV9DT1VOVEVSUz15CiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUj15CkBAIC04MCw3ICs4Myw2IEBACiBDT05GSUdfUkRfR1pJUD15CiAjIENPTkZJR19SRF9CWklQMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRF9MWk1BIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfQ09NUFJFU1NJT05fTk9ORT15CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtOTAsNiArOTIsNyBAQAogQ09ORklHX0tBTExTWU1TPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtMTE2LDYgKzExOSw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfQkFTRV9TTUFMTD0wCkBAIC0xMjcsNyArMTMyLDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNzQsNiArMTc4LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTgzLDggKzE4OCw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTc0Niw2ICs3NDksMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC03ODUsOCArNzkzLDEzIEBACiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfUk9NRlNfRlM9eQorQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9CTE9DSz15CisjIENPTkZJR19ST01GU19CQUNLRURfQllfTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9CT1RIIGlzIG5vdCBzZXQKK0NPTkZJR19ST01GU19PTl9CTE9DSz15CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTgzMSw2ICs4NDQsOSBAQAogQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKICMgQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDIGlzIG5vdCBzZXQKIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRT0wCitDT05GSUdfREVURUNUX0hVTkdfVEFTSz15CisjIENPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDIGlzIG5vdCBzZXQKK0NPTkZJR19CT09UUEFSQU1fSFVOR19UQVNLX1BBTklDX1ZBTFVFPTAKIENPTkZJR19TQ0hFRF9ERUJVRz15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKQEAgLTg2OSw2ICs4ODUsNyBAQAogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTg3NiwxMSArODkzLDE2IEBACiAjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKQEAgLTk5MSw2ICsxMDEzLDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzM0M19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MzQzX2RlZmNvbmZpZwppbmRleCBmYmI3MmQwLi4wMDRkNTMxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3MzQzX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MzQzX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6NDI6MDAgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjAxOjQ0IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTQwLDYgKzQxLDcgQEAKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19QT1NJWF9NUVVFVUVfU1lTQ1RMPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKQEAgLTczLDYgKzc1LDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC05MSw2ICs5NCw3IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtOTgsNiArMTAyLDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfQkFTRV9TTUFMTD0wCkBAIC0xMDksNyArMTE1LDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNTgsNiArMTYzLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTY3LDggKzE3Myw2IEBACiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzPXkKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC03NjksNiArNzczLDcgQEAKICMgQ09ORklHX1NPQ19DQU1FUkEgaXMgbm90IHNldAogQ09ORklHX1Y0TF9VU0JfRFJJVkVSUz15CiAjIENPTkZJR19VU0JfVklERU9fQ0xBU1MgaXMgbm90IHNldAorQ09ORklHX1VTQl9WSURFT19DTEFTU19JTlBVVF9FVkRFVj15CiBDT05GSUdfVVNCX0dTUENBPW0KICMgQ09ORklHX1VTQl9NNTYwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU1RWMDZYWCBpcyBub3Qgc2V0CkBAIC04MDAsNiArODA1LDcgQEAKICMgQ09ORklHX1ZJREVPX1BWUlVTQjIgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fSERQVlIgaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fRU0yOFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0NYMjMxWFggaXMgbm90IHNldAogIyBDT05GSUdfVklERU9fVVNCVklTSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9WSUNBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSUJNQ0FNIGlzIG5vdCBzZXQKQEAgLTgxMyw2ICs4MTksNyBAQAogIyBDT05GSUdfVVNCX1NUVjY4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfWkMwMzAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QV0MgaXMgbm90IHNldAorQ09ORklHX1VTQl9QV0NfSU5QVVRfRVZERVY9eQogIyBDT05GSUdfVVNCX1pSMzY0WFggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NUS1dFQkNBTSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUzIyNTUgaXMgbm90IHNldApAQCAtOTE0LDE1ICs5MjEsMTcgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX0hJRF9BNFRFQ0g9eQogQ09ORklHX0hJRF9BUFBMRT15CiBDT05GSUdfSElEX0JFTEtJTj15CiBDT05GSUdfSElEX0NIRVJSWT15CiBDT05GSUdfSElEX0NISUNPTlk9eQogQ09ORklHX0hJRF9DWVBSRVNTPXkKKyMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9FWktFWT15CisjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CkBAIC0xMDUwLDYgKzEwNTksNyBAQAogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC0xMDcxLDYgKzEwODEsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC0xMTI1LDYgKzExNDAsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC0xMTc0LDEwICsxMTkwLDIzIEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwogIworIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTEyNzksNiArMTMwOCw3IEBACiAjCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTc2MTlfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcKaW5kZXggMTI1MzA0ZS4uZWRiZWNlNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzYxOV9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjQ0OjUzIDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMzowMjozMiAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC02MSw2ICs2Miw3IEBACiAjIENPTkZJR19VSUQxNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC03OCwxMSArODAsMTQgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfQkFTRV9TTUFMTD0xCkBAIC0xMzQsNiArMTM5LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTQzLDggKzE0OSw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTUxMyw3ICs1MTcsNiBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldApAQCAtNTY0LDYgKzU2NywxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTYwMSw4ICs2MDksMTMgQEAKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CitDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JMT0NLPXkKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JPVEggaXMgbm90IHNldAorQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiAKICMKICMgUGFydGl0aW9uIFR5cGVzCkBAIC02MzAsMTAgKzY0MywyMSBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtNjQ3LDYgKzY3MSw3IEBACiAjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzA1X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MDVfZGVmY29uZmlnCmluZGV4IDAzMDhhYmYuLmJhZTE2MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTc3MDVfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MDVfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxODo0NTo1NiAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTM6MDI6NTIgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNjIsNyArNjMsNiBAQAogQ09ORklHX1JEX0daSVA9eQogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkU9eQogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtNzAsNiArNzAsNyBAQAogQ09ORklHX1VJRDE2PXkKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTg4LDEyICs4OSwxNSBAQAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xNTAsNiArMTU0LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTU5LDggKzE2NCw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTY5OCw3ICs3MDEsNiBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldApAQCAtNzUyLDYgKzc1NCwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTgwNCw2ICs4MTEsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTg0NywxMCArODU1LDIzIEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwogIworIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CkBAIC05NDksNiArOTcwLDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzcxMl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzEyX2RlZmNvbmZpZwppbmRleCBhOGMyNGI3Li4zMzAwNDNmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzEyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzEyX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6NDg6MTggMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjAzOjI3IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CkBAIC0zOCw2ICszOSw3IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CkBAIC02OSw2ICs3MSw3IEBACiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogIyBDT05GSUdfQlVHIGlzIG5vdCBzZXQKQEAgLTg3LDYgKzkwLDcgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC05NCw2ICs5OCw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTA1LDcgKzExMSw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTUxLDYgKzE1Niw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE2MCw4ICsxNjYsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC01ODUsNiArNTg5LDcgQEAKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldApAQCAtODEyLDYgKzgxNyw3IEBACiBDT05GSUdfRVhUMl9GU19TRUNVUklUWT15CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC04MzMsNiArODM5LDExIEBACiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKICMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldApAQCAtODg3LDYgKzg5OCw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiAjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldApAQCAtOTI3LDYgKzkzOSw3IEBACiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVEVDVF9IVU5HX1RBU0sgaXMgbm90IHNldAogQ09ORklHX1NDSEVEX0RFQlVHPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldApAQCAtOTYxLDYgKzk3NCw3IEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwpAQCAtOTY5LDkgKzk4MywxNCBAQAogIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldApAQCAtMTA5MCw2ICsxMTA5LDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzcyMV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIxX2RlZmNvbmZpZwppbmRleCA0Yjc5YzI1Li41NjQ3ODkxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIxX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIxX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6NTE6NDQgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjA0OjE5IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CkBAIC0zOCw2ICszOSw3IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CkBAIC03Myw2ICs3NSw3IEBACiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogIyBDT05GSUdfQlVHIGlzIG5vdCBzZXQKQEAgLTkxLDYgKzk0LDcgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC05OCw2ICsxMDIsOCBAQAogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTEwOSw3ICsxMTUsNiBAQAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE1NSw2ICsxNjAsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0xNjQsOCArMTcwLDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtNzc2LDE1ICs3ODAsMTcgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX0hJRF9BNFRFQ0g9eQogQ09ORklHX0hJRF9BUFBMRT15CiBDT05GSUdfSElEX0JFTEtJTj15CiBDT05GSUdfSElEX0NIRVJSWT15CiBDT05GSUdfSElEX0NISUNPTlk9eQogQ09ORklHX0hJRF9DWVBSRVNTPXkKKyMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9FWktFWT15CisjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CkBAIC05NDMsNiArOTQ5LDcgQEAKIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZPXkKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTk2NCw2ICs5NzEsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC0xMDIxLDYgKzEwMzMsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVMgaXMgbm90IHNldAogCiAjCkBAIC0xMDg1LDYgKzEwOTgsNyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiAjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIGlzIG5vdCBzZXQKIENPTkZJR19TQ0hFRF9ERUJVRz15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX1RJTUVSX1NUQVRTIGlzIG5vdCBzZXQKQEAgLTExMTksNiArMTEzMyw3IEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwpAQCAtMTEyNyw5ICsxMTQyLDE0IEBACiAjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC0xMjQ4LDYgKzEyNjgsNyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CisjIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjJfZGVmY29uZmlnCmluZGV4IDgyYmRhYWMuLjcyNmZkYmRiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzIyX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6NTU6MTAgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjA1OjI5IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTY5LDcgKzcwLDYgQEAKIENPTkZJR19SRF9HWklQPXkKICMgQ09ORklHX1JEX0JaSVAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JEX0xaTUEgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19DT01QUkVTU0lPTl9OT05FPXkKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC03OCw2ICs3OCw3IEBACiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTk3LDYgKzk4LDcgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX09QUk9GSUxFIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldApAQCAtMTA1LDYgKzEwNyw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTE3LDcgKzEyMSw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY3LDYgKzE3MCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE3Niw4ICsxODAsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjI9eQogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtNDg2LDYgKzQ4OCw3IEBACiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKQEAgLTY5Miw3ICs2OTUsNiBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldApAQCAtNzY2LDYgKzc2OCw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTc4OSw2ICs3OTIsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC04MzIsNiArODQwLDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CkBAIC04NzIsMTEgKzg4MSwyNSBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CkBAIC05NzcsNiArMTAwMCw3IEBACiAjCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zZTc3MjRfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzcyNF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkMjU4NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvY29uZmlncy9zZTc3MjRfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTU1MiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjNgorIyBUdWUgTWF5IDI2IDEzOjE4OjA5IDIwMDkKKyMKK0NPTkZJR19TVVBFUkg9eQorQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfQlVHPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19HUElPPXkKK0NPTkZJR19HRU5FUklDX1RJTUU9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM9eQorQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CitDT05GSUdfQVJDSF9ISUJFUk5BVElPTl9QT1NTSUJMRT15CitDT05GSUdfU1lTX1NVUFBPUlRTX0NNVD15CitDT05GSUdfU1lTX1NVUFBPUlRTX1RNVT15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQorQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorCisjCisjIFJDVSBTdWJzeXN0ZW0KKyMKK0NPTkZJR19DTEFTU0lDX1JDVT15CisjIENPTkZJR19UUkVFX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19UUkVFX1JDVV9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1JDVV9UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0dST1VQX1NDSEVEPXkKK0NPTkZJR19GQUlSX0dST1VQX1NDSEVEPXkKKyMgQ09ORklHX1JUX0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEPXkKK0NPTkZJR19TWVNGU19ERVBSRUNBVEVEX1YyPXkKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKKyMgQ09ORklHX0tBTExTWU1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0FJTz15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX0NPTVBBVF9CUks9eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX09QUk9GSUxFPXkKK0NPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CitDT05GSUdfSEFWRV9LUFJPQkVTPXkKK0NPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQorQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKK0NPTkZJR19TTEFCSU5GTz15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfQkFTRV9TTUFMTD0wCitDT05GSUdfTU9EVUxFUz15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfTE9BRCBpcyBub3Qgc2V0CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCisjIENPTkZJR19GUkVFWkVSIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gdHlwZQorIworQ09ORklHX0NQVV9TSDQ9eQorQ09ORklHX0NQVV9TSDRBPXkKK0NPTkZJR19DUFVfU0hYMj15CitDT05GSUdfQVJDSF9TSE1PQklMRT15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX01YRyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyND15CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19RVUlDS0xJU1Q9eQorQ09ORklHX01NVT15CitDT05GSUdfUEFHRV9PRkZTRVQ9MHg4MDAwMDAwMAorQ09ORklHX0ZPUkNFX01BWF9aT05FT1JERVI9MTEKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwODAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDgwMDAwMDAKK0NPTkZJR18yOUJJVD15CisjIENPTkZJR19YMlRMQiBpcyBub3Qgc2V0CitDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19QQUdFX1NJWkVfNEtCPXkKKyMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAorIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQorQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorIyBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQgaXMgbm90IHNldAorQ09ORklHX1pPTkVfRE1BX0ZMQUc9MAorQ09ORklHX05SX1FVSUNLPTIKK0NPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQorQ09ORklHX0hBVkVfTUxPQ0s9eQorQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworQ09ORklHX0NBQ0hFX1dSSVRFQkFDSz15CisjIENPTkZJR19DQUNIRV9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfQ0FDSEVfT0ZGIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgZmVhdHVyZXMKKyMKK0NPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfU0hfRlBVPXkKKyMgQ09ORklHX1NIX1NUT1JFX1FVRVVFUyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfU1JfUkI9eQorQ09ORklHX0NQVV9IQVNfUFRFQT15CitDT05GSUdfQ1BVX0hBU19GUFU9eQorCisjCisjIEJvYXJkIHN1cHBvcnQKKyMKK0NPTkZJR19TT0xVVElPTl9FTkdJTkU9eQorQ09ORklHX1NIXzc3MjRfU09MVVRJT05fRU5HSU5FPXkKKworIworIyBUaW1lciBhbmQgY2xvY2sgY29uZmlndXJhdGlvbgorIworQ09ORklHX1NIX1RJTUVSX1RNVT15CisjIENPTkZJR19TSF9USU1FUl9DTVQgaXMgbm90IHNldAorQ09ORklHX1NIX1BDTEtfRlJFUT0zMzMzMzMzMworIyBDT05GSUdfTk9fSFogaXMgbm90IHNldAorIyBDT05GSUdfSElHSF9SRVNfVElNRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKKworIworIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKKyMKKyMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKKworIworIyBETUEgc3VwcG9ydAorIworIyBDT05GSUdfU0hfRE1BIGlzIG5vdCBzZXQKKworIworIyBDb21wYW5pb24gQ2hpcHMKKyMKKworIworIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0hFQVJUQkVBVD15CisjIENPTkZJR19QVVNIX1NXSVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGZlYXR1cmVzCisjCisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCisjIENPTkZJR19TQ0hFRF9IUlRJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CitDT05GSUdfU0VDQ09NUD15CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFQ9eQorQ09ORklHX0dVU0E9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorQ09ORklHX0VOVFJZX09GRlNFVD0weDAwMDAxMDAwCitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eTEgY29uc29sZT10dHlTQzMsMTE1MjAwIHJvb3Q9L2Rldi9uZnMgaXA9ZGhjcCBtZW1jaHVuay52cHU9NG0iCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfSURMRSBpcyBub3Qgc2V0CitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKK0NPTkZJR19QQUNLRVQ9eQorIyBDT05GSUdfUEFDS0VUX01NQVAgaXMgbm90IHNldAorQ09ORklHX1VOSVg9eQorIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CitDT05GSUdfSU5FVD15CisjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUj15CitDT05GSUdfQVNLX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX0ZJQl9UUklFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9MUk8gaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFdPUktfU0VDTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFNBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorIyBDT05GSUdfRENCIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfQ0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTPXkKKyMgQ09ORklHX0NGRzgwMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dJUkVMRVNTX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19MSUI4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUM4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XSU1BWCBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUXzlQIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorQ09ORklHX01URF9DT05DQVQ9eQorQ09ORklHX01URF9QQVJUSVRJT05TPXkKKyMgQ09ORklHX01URF9URVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorIyBDT05GSUdfTVREX0FSN19QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMS0RFVlM9eQorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NTRkRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PT1BTIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworQ09ORklHX01URF9DRkk9eQorIyBDT05GSUdfTVREX0pFREVDUFJPQkUgaXMgbm90IHNldAorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisKKyMKKyMgTWFwcGluZyBkcml2ZXJzIGZvciBjaGlwIGFjY2VzcworIworIyBDT05GSUdfTVREX0NPTVBMRVhfTUFQUElOR1MgaXMgbm90IHNldAorQ09ORklHX01URF9QSFlTTUFQPXkKKyMgQ09ORklHX01URF9QSFlTTUFQX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfREFUQUZMQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NMjVQODAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORD15CisjIENPTkZJR19NVERfTkFORF9WRVJJRllfV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTVREX05BTkRfRUNDX1NNQyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9NVVNFVU1fSURTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTkFORF9JRFM9eQorIyBDT05GSUdfTVREX05BTkRfRElTS09OQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTkFORF9OQU5EU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9OQU5EX1BMQVRGT1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BTEFVREEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIExQRERSIGZsYXNoIG1lbW9yeSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfTFBERFIgaXMgbm90IHNldAorCisjCisjIFVCSSAtIFVuc29ydGVkIGJsb2NrIGltYWdlcworIworQ09ORklHX01URF9VQkk9eQorQ09ORklHX01URF9VQklfV0xfVEhSRVNIT0xEPTQwOTYKK0NPTkZJR19NVERfVUJJX0JFQl9SRVNFUlZFPTEKKyMgQ09ORklHX01URF9VQklfR0xVRUJJIGlzIG5vdCBzZXQKKworIworIyBVQkkgZGVidWdnaW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX01URF9VQklfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD00CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CisjIENPTkZJR19CTEtfREVWX1hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorIyBDT05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVNMMjkwMDMgaXMgbm90IHNldAorIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKKworIworIyBFRVBST00gc3VwcG9ydAorIworIyBDT05GSUdfRUVQUk9NX0FUMjQgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX0FUMjUgaXMgbm90IHNldAorIyBDT05GSUdfRUVQUk9NX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBST01fOTNDWDYgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ETUE9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9XQUlUX1NDQU49bQorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NSUF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9MT1dMRVZFTD15CisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19NRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfQ09NUEFUX05FVF9ERVZfT1BTPXkKKyMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFDVkxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFVEggaXMgbm90IHNldAorQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19WSVRFU1NFX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfU01TQ19QSFk9eQorIyBDT05GSUdfQlJPQURDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lDUExVU19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFRFS19QSFkgaXMgbm90IHNldAorIyBDT05GSUdfTkFUSU9OQUxfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NURTEwWFAgaXMgbm90IHNldAorIyBDT05GSUdfTFNJX0VUMTAxMUNfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJWEVEX1BIWSBpcyBub3Qgc2V0CitDT05GSUdfTURJT19CSVRCQU5HPXkKKyMgQ09ORklHX01ESU9fR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfQVg4ODc5NiBpcyBub3Qgc2V0CisjIENPTkZJR19TVE5JQyBpcyBub3Qgc2V0CitDT05GSUdfU01DOTFYPXkKKyMgQ09ORklHX0VOQzI4SjYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfU01TQzkxMVggaXMgbm90IHNldAorIyBDT05GSUdfRE5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfWk1JSSBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfUkdNSUkgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX1RBSCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfRU1BQzQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX05PX0ZMT1dfQ1RSTCBpcyBub3Qgc2V0CisjIENPTkZJR19JQk1fTkVXX0VNQUNfTUFMX0NMUl9JQ0lOVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUJNX05FV19FTUFDX01BTF9DT01NT05fRVJSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTgorIworIyBDT05GSUdfV0xBTl9QUkU4MDIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19XTEFOXzgwMjExIGlzIG5vdCBzZXQKKworIworIyBFbmFibGUgV2lNQVggKE5ldHdvcmtpbmcgb3B0aW9ucykgdG8gc2VlIHRoZSBXaU1BWCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BFR0FTVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1JUTDgxNTAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1VTQk5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisjIENPTkZJR19JTlBVVF9GRl9NRU1MRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1BPTExERVYgaXMgbm90IHNldAorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CitDT05GSUdfSU5QVVRfRVZERVY9eQorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorIyBDT05GSUdfS0VZQk9BUkRfQVRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfU1VOS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX0xLS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX1hUS0JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFWUJPQVJEX05FV1RPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9TVE9XQVdBWSBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9HUElPIGlzIG5vdCBzZXQKK0NPTkZJR19LRVlCT0FSRF9TSF9LRVlTQz15CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UQUJMRVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKK0NPTkZJR19WVD15CitDT05GSUdfQ09OU09MRV9UUkFOU0xBVElPTlM9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15CitDT05GSUdfREVWS01FTT15CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfU0VSSUFMX01BWDMxMDAgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF9TSF9TQ0k9eQorQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFM9NgorQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorQ09ORklHX1VOSVg5OF9QVFlTPXkKKyMgQ09ORklHX0RFVlBUU19NVUxUSVBMRV9JTlNUQU5DRVMgaXMgbm90IHNldAorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKK0NPTkZJR19IV19SQU5ET009eQorIyBDT05GSUdfSFdfUkFORE9NX1RJTUVSSU9NRU0gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworIyBDT05GSUdfSTJDX0dQSU8gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1NIX01PQklMRT15CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RJTllfVVNCIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NUVUIgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorQ09ORklHX1NQST15CitDT05GSUdfU1BJX01BU1RFUj15CisKKyMKKyMgU1BJIE1hc3RlciBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19TUElfQklUQkFORz15CisjIENPTkZJR19TUElfR1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfU0hfU0NJIGlzIG5vdCBzZXQKKworIworIyBTUEkgUHJvdG9jb2wgTWFzdGVycworIworIyBDT05GSUdfU1BJX1NQSURFViBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfVExFNjJYMCBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9SRVFVSVJFX0dQSU9MSUI9eQorQ09ORklHX0dQSU9MSUI9eQorIyBDT05GSUdfR1BJT19TWVNGUyBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hcHBlZCBHUElPIGV4cGFuZGVyczoKKyMKKworIworIyBJMkMgR1BJTyBleHBhbmRlcnM6CisjCisjIENPTkZJR19HUElPX01BWDczMlggaXMgbm90IHNldAorIyBDT05GSUdfR1BJT19QQ0E5NTNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dQSU9fUENGODU3WCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEdQSU8gZXhwYW5kZXJzOgorIworCisjCisjIFNQSSBHUElPIGV4cGFuZGVyczoKKyMKKyMgQ09ORklHX0dQSU9fTUFYNzMwMSBpcyBub3Qgc2V0CisjIENPTkZJR19HUElPX01DUDIzUzA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RQUzY1MDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXTDQwMzBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCitDT05GSUdfVklERU9fREVWPXkKK0NPTkZJR19WSURFT19WNEwyX0NPTU1PTj15CisjIENPTkZJR19WSURFT19BTExPV19WNEwxIGlzIG5vdCBzZXQKK0NPTkZJR19WSURFT19WNEwxX0NPTVBBVD15CisjIENPTkZJR19EVkJfQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fTUVESUE9eQorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfTUVESUFfQVRUQUNIIGlzIG5vdCBzZXQKK0NPTkZJR19NRURJQV9UVU5FUj15CisjIENPTkZJR19NRURJQV9UVU5FUl9DVVNUT01JU0UgaXMgbm90IHNldAorQ09ORklHX01FRElBX1RVTkVSX1NJTVBMRT15CitDT05GSUdfTUVESUFfVFVORVJfVERBODI5MD15CitDT05GSUdfTUVESUFfVFVORVJfVERBOTg4Nz15CitDT05GSUdfTUVESUFfVFVORVJfVEVBNTc2MT15CitDT05GSUdfTUVESUFfVFVORVJfVEVBNTc2Nz15CitDT05GSUdfTUVESUFfVFVORVJfTVQyMFhYPXkKK0NPTkZJR19NRURJQV9UVU5FUl9YQzIwMjg9eQorQ09ORklHX01FRElBX1RVTkVSX1hDNTAwMD15CitDT05GSUdfTUVESUFfVFVORVJfTUM0NFM4MDM9eQorQ09ORklHX1ZJREVPX1Y0TDI9eQorQ09ORklHX1ZJREVPQlVGX0dFTj15CitDT05GSUdfVklERU9CVUZfRE1BX0NPTlRJRz15CitDT05GSUdfVklERU9fQ0FQVFVSRV9EUklWRVJTPXkKKyMgQ09ORklHX1ZJREVPX0FEVl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19GSVhFRF9NSU5PUl9SQU5HRVMgaXMgbm90IHNldAorQ09ORklHX1ZJREVPX0hFTFBFUl9DSElQU19BVVRPPXkKKyMgQ09ORklHX1ZJREVPX1ZJVkkgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0FBNTI0NkEgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0FBNTI0OSBpcyBub3Qgc2V0CitDT05GSUdfU09DX0NBTUVSQT15CisjIENPTkZJR19TT0NfQ0FNRVJBX01UOU0wMDEgaXMgbm90IHNldAorIyBDT05GSUdfU09DX0NBTUVSQV9NVDlNMTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPQ19DQU1FUkFfTVQ5VDAzMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT0NfQ0FNRVJBX01UOVYwMjIgaXMgbm90IHNldAorIyBDT05GSUdfU09DX0NBTUVSQV9UVzk5MTAgaXMgbm90IHNldAorIyBDT05GSUdfU09DX0NBTUVSQV9QTEFURk9STSBpcyBub3Qgc2V0CitDT05GSUdfU09DX0NBTUVSQV9PVjc3Mlg9eQorQ09ORklHX1ZJREVPX1NIX01PQklMRV9DRVU9eQorQ09ORklHX1Y0TF9VU0JfRFJJVkVSUz15CisjIENPTkZJR19VU0JfVklERU9fQ0xBU1MgaXMgbm90IHNldAorQ09ORklHX1VTQl9WSURFT19DTEFTU19JTlBVVF9FVkRFVj15CitDT05GSUdfVVNCX0dTUENBPW0KKyMgQ09ORklHX1VTQl9NNTYwMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RWMDZYWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR1NQQ0FfQ09ORVggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dTUENBX0VUT01TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9GSU5FUElYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9NQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9NUjk3MzEwQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR1NQQ0FfT1Y1MTkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dTUENBX09WNTM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9QQUMyMDcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dTUENBX1BBQzczMTEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dTUENBX1NPTklYQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR1NQQ0FfU09OSVhKIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TUENBNTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TUENBNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TUENBNTA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TUENBNTA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TUENBNTA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TUENBNTYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TUTkwNSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR1NQQ0FfU1E5MDVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9TVEswMTQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dTUENBX1NVTlBMVVMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dTUENBX1Q2MTMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0dTUENBX1RWODUzMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR1NQQ0FfVkMwMzJYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9HU1BDQV9aQzNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19QVlJVU0IyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0hEUFZSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0VNMjhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19DWDIzMVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1VTQlZJU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRVQ2MVgyNTEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NOOUMxMDIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1pDMDMwMSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1BXQ19JTlBVVF9FVkRFVj15CisjIENPTkZJR19VU0JfWlIzNjRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RLV0VCQ0FNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TMjI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19BREFQVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKK0NPTkZJR19GQj15CisjIENPTkZJR19GSVJNV0FSRV9FRElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0REQyBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CT09UX1ZFU0FfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DRkJfRklMTFJFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0NGQl9JTUFHRUJMSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX1JFVl9QSVhFTFNfSU5fQllURSBpcyBub3Qgc2V0CitDT05GSUdfRkJfU1lTX0ZJTExSRUNUPXkKK0NPTkZJR19GQl9TWVNfQ09QWUFSRUE9eQorQ09ORklHX0ZCX1NZU19JTUFHRUJMSVQ9eQorIyBDT05GSUdfRkJfRk9SRUlHTl9FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX0ZCX1NZU19GT1BTPXkKK0NPTkZJR19GQl9ERUZFUlJFRF9JTz15CisjIENPTkZJR19GQl9TVkdBTElCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKworIworIyBGcmFtZSBidWZmZXIgaGFyZHdhcmUgZHJpdmVycworIworIyBDT05GSUdfRkJfUzFEMTNYWFggaXMgbm90IHNldAorQ09ORklHX0ZCX1NIX01PQklMRV9MQ0RDPXkKKyMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX01CODYyWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQlJPQURTSEVFVCBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX0RFVEVDVF9QUklNQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEVfUk9UQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRk9OVFMgaXMgbm90IHNldAorQ09ORklHX0ZPTlRfOHg4PXkKK0NPTkZJR19GT05UXzh4MTY9eQorQ09ORklHX0xPR089eQorIyBDT05GSUdfTE9HT19MSU5VWF9NT05PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR09fTElOVVhfVkdBMTYgaXMgbm90IHNldAorIyBDT05GSUdfTE9HT19MSU5VWF9DTFVUMjI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR09fU1VQRVJIX01PTk8gaXMgbm90IHNldAorIyBDT05GSUdfTE9HT19TVVBFUkhfVkdBMTYgaXMgbm90IHNldAorQ09ORklHX0xPR09fU1VQRVJIX0NMVVQyMjQ9eQorIyBDT05GSUdfU09VTkQgaXMgbm90IHNldAorQ09ORklHX0hJRF9TVVBQT1JUPXkKK0NPTkZJR19ISUQ9eQorIyBDT05GSUdfSElEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRFJBVyBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIElucHV0IERldmljZXMKKyMKK0NPTkZJR19VU0JfSElEPXkKKyMgQ09ORklHX0hJRF9QSUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0hJRERFViBpcyBub3Qgc2V0CisKKyMKKyMgU3BlY2lhbCBISUQgZHJpdmVycworIworIyBDT05GSUdfSElEX0E0VEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfQVBQTEUgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0JFTEtJTiBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfQ0hFUlJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9DSElDT05ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0VaS0VZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAorIyBDT05GSUdfSElEX0dZUkFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9LRU5TSU5HVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9MT0dJVEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfTUlDUk9TT0ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9NT05URVJFWSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfTlRSSUcgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1BBTlRIRVJMT1JEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9QRVRBTFlOWCBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU0FNU1VORyBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU09OWSBpcyBub3Qgc2V0CisjIENPTkZJR19ISURfU1VOUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19HUkVFTkFTSUFfRkYgaXMgbm90IHNldAorIyBDT05GSUdfSElEX1RPUFNFRUQgaXMgbm90IHNldAorIyBDT05GSUdfVEhSVVNUTUFTVEVSX0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX1pFUk9QTFVTX0ZGIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1VQUE9SVD15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVVNCIG9wdGlvbnMKKyMKKyMgQ09ORklHX1VTQl9ERVZJQ0VGUyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0RFVklDRV9DTEFTUz15CisjIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX09URyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX1dISVRFTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHX0JMQUNLTElTVF9IVUIgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorIyBDT05GSUdfVVNCX1dVU0IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dVU0JfQ0JBRiBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCisjCisjIENPTkZJR19VU0JfQzY3WDAwX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1hVMjEwSFBfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNQMTc2MF9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1I4QTY2NTk3X0hDRD15CisjIENPTkZJR19VU0JfSFdBX0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9XRE0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQorIworCisjCisjIGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvCisjCitDT05GSUdfVVNCX1NUT1JBR0U9eQorIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9GUkVFQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0lTRDIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9DWVBSRVNTX0FUQUNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MSUJVU1VBTCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9TRVJJQUwgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9FTUk2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRU1JMjYgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FEVVRVWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VWU0VHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9CRVJSWV9DSEFSR0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVFJBTkNFVklCUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lPV0FSUklPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVNJR0hURlcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1ZTVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBPVEcgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUKKyMKKyMgQ09ORklHX1VTQl9HUElPX1ZCVVMgaXMgbm90IHNldAorIyBDT05GSUdfTk9QX1VTQl9YQ0VJViBpcyBub3Qgc2V0CitDT05GSUdfTU1DPXkKKyMgQ09ORklHX01NQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVU5TQUZFX1JFU1VNRSBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEL1NESU8gQ2FyZCBEcml2ZXJzCisjCitDT05GSUdfTU1DX0JMT0NLPXkKK0NPTkZJR19NTUNfQkxPQ0tfQk9VTkNFPXkKKyMgQ09ORklHX1NESU9fVUFSVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUNfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEL1NESU8gSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKKyMgQ09ORklHX01NQ19TREhDSSBpcyBub3Qgc2V0CitDT05GSUdfTU1DX1NQST15CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfU1lTRlM9eQorQ09ORklHX1JUQ19JTlRGX1BST0M9eQorQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfUENGODU2Mz15CisjIENPTkZJR19SVENfRFJWX1BDRjg1ODMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDFUODAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9TMzUzOTBBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRk0zMTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlg4NTgxIGlzIG5vdCBzZXQKKworIworIyBTUEkgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDk0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1I5NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM0OCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMzIzNCBpcyBub3Qgc2V0CisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX1NIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAorQ09ORklHX1VJTz15CisjIENPTkZJR19VSU9fUERSViBpcyBub3Qgc2V0CitDT05GSUdfVUlPX1BEUlZfR0VOSVJRPXkKKyMgQ09ORklHX1VJT19TTVggaXMgbm90IHNldAorIyBDT05GSUdfVUlPX1NFUkNPUzMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfRVhUMl9GU19YQVRUUj15CitDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0w9eQorQ09ORklHX0VYVDJfRlNfU0VDVVJJVFk9eQorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUM19GU19TRUNVUklUWT15CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19GU19QT1NJWF9BQ0w9eQorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1BST0NfU1lTQ1RMPXkKK0NPTkZJR19QUk9DX1BBR0VfTU9OSVRPUj15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX1RNUEZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19NSVNDX0ZJTEVTWVNURU1TPXkKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUJJRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NRVUFTSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQorQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRD15CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQorCisjCisjIFRyYWNlcnMKKyMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPPXkKKworIworIyBDcnlwdG8gY29yZSBvciBoZWxwZXIKKyMKKyMgQ09ORklHX0NSWVBUT19GSVBTIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQUxHQVBJPXkKK0NPTkZJR19DUllQVE9fQUxHQVBJMj15CitDT05GSUdfQ1JZUFRPX0FFQUQyPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSPXkKK0NPTkZJR19DUllQVE9fQkxLQ0lQSEVSMj15CitDT05GSUdfQ1JZUFRPX0hBU0gyPXkKK0NPTkZJR19DUllQVE9fUk5HMj15CitDT05GSUdfQ1JZUFRPX1BDT01QPXkKK0NPTkZJR19DUllQVE9fTUFOQUdFUj15CitDT05GSUdfQ1JZUFRPX01BTkFHRVIyPXkKKyMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1dPUktRVUVVRT15CisjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BVVRIRU5DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKKworIworIyBBdXRoZW50aWNhdGVkIEVuY3J5cHRpb24gd2l0aCBBc3NvY2lhdGVkIERhdGEKKyMKKyMgQ09ORklHX0NSWVBUT19DQ00gaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0dDTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VRSVYgaXMgbm90IHNldAorCisjCisjIEJsb2NrIG1vZGVzCisjCitDT05GSUdfQ1JZUFRPX0NCQz15CisjIENPTkZJR19DUllQVE9fQ1RSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DVFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0VDQiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTFJXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19QQ0JDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YVFMgaXMgbm90IHNldAorCisjCisjIEhhc2ggbW9kZXMKKyMKKyMgQ09ORklHX0NSWVBUT19ITUFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19YQ0JDIGlzIG5vdCBzZXQKKworIworIyBEaWdlc3QKKyMKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01ENCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fTUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMTI4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19STUQxNjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1JNRDI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fUk1EMzIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEExIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19TSEEyNTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisKKyMKKyMgQ2lwaGVycworIworIyBDT05GSUdfQ1JZUFRPX0FFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BUkM0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FNRUxMSUEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0NBU1Q1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fREVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19GQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0tIQVpBRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0FMU0EyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VFRCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEVBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKKworIworIyBDb21wcmVzc2lvbgorIworIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1pMSUIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0xaTyBpcyBub3Qgc2V0CisKKyMKKyMgUmFuZG9tIE51bWJlciBHZW5lcmF0aW9uCisjCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19CSVRSRVZFUlNFPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTEFTVF9CSVQ9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkNfVDEwRElGPXkKK0NPTkZJR19DUkNfSVRVX1Q9eQorQ09ORklHX0NSQzMyPXkKK0NPTkZJR19DUkM3PXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfSEFTX0lPTUVNPXkKK0NPTkZJR19IQVNfSU9QT1JUPXkKK0NPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19OTEFUVFI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzc1MF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZwppbmRleCBjZWVmNmQ5Li5lZDFhMTIzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTg6NTc6MzEgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjA2OjAyIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTcwLDYgKzcxLDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTg4LDYgKzkwLDcgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC05NSw2ICs5OCw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTA2LDcgKzExMSw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTUyLDYgKzE1Niw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE2MSw4ICsxNjYsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC01NTMsNiArNTU2LDcgQEAKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldApAQCAtNzc1LDYgKzc3OSwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTgyOSw2ICs4MzgsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKQEAgLTg4NiwxMCArODk2LDIzIEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwogIworIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTk4OSw2ICsxMDEyLDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzc1MV9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUxX2RlZmNvbmZpZwppbmRleCA2N2ZjMjZiMy4uNTVmM2I3OCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NlNzc1MV9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzc1MV9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE4OjU5OjU5IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMzowNjo0NCAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC02NSw3ICs2Niw2IEBACiBDT05GSUdfUkRfR1pJUD15CiAjIENPTkZJR19SRF9CWklQMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRF9MWk1BIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfQ09NUFJFU1NJT05fTk9ORT15CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC03NCw2ICs3NCw3IEBACiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC05Miw2ICs5Myw3IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtOTksNiArMTAxLDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMTAsNyArMTE0LDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNTYsNiArMTU5LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTY1LDggKzE2OSw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTc0Miw2ICs3NDQsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC03OTYsNiArODAzLDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CkBAIC04MzMsMTAgKzg0MSwyMyBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CkBAIC05MzYsNiArOTU3LDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzc4MF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzgwX2RlZmNvbmZpZwppbmRleCBlYmNlMjNjLi5jNGYwYWYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzgwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzgwX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTk6MDI6MDUgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjA3OjE0IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTY3LDYgKzY4LDcgQEAKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogIyBDT05GSUdfS0FMTFNZTVMgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtODYsMTIgKzg4LDE1IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CiBDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTEwMyw3ICsxMDgsNiBAQAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKICMKQEAgLTE0OSw2ICsxNTMsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODA9eQpAQCAtMTU4LDggKzE2Myw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTI4NSw4ICsyODgsNiBAQAogIwogQ09ORklHX1BDST15CiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKLUNPTkZJR19QQ0lfQVVUTz15Ci1DT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiBDT05GSUdfUENJX0xFR0FDWT15CkBAIC01NTgsNiArNTU5LDcgQEAKICMgQ09ORklHX1NDU0lfTVBUMlNBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldApAQCAtOTU3LDE1ICs5NTksMTcgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX0hJRF9BNFRFQ0g9eQogQ09ORklHX0hJRF9BUFBMRT15CiBDT05GSUdfSElEX0JFTEtJTj15CiBDT05GSUdfSElEX0NIRVJSWT15CiBDT05GSUdfSElEX0NISUNPTlk9eQogQ09ORklHX0hJRF9DWVBSRVNTPXkKKyMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9FWktFWT15CisjIENPTkZJR19ISURfS1lFIGlzIG5vdCBzZXQKIENPTkZJR19ISURfR1lSQVRJT049eQorIyBDT05GSUdfSElEX0tFTlNJTkdUT04gaXMgbm90IHNldAogQ09ORklHX0hJRF9MT0dJVEVDSD15CiAjIENPTkZJR19MT0dJVEVDSF9GRiBpcyBub3Qgc2V0CiAjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CkBAIC0xMTIyLDYgKzExMjYsMTAgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKICMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldApAQCAtMTI0NSwxMSArMTI1MywyNCBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTEzNDUsNiArMTM2Niw3IEBACiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKICMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaDAzX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaDAzX2RlZmNvbmZpZwppbmRleCA2ZmNkYjA5Li5mOWM2ZTUxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2gwM19kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoMDNfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxOTowNDo1OSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTM6MDc6NTYgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNDEsNiArNDIsNyBAQAogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKIENPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BPU0lYX01RVUVVRV9TWVNDVEw9eQogQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldApAQCAtNjcsNyArNjksNiBAQAogQ09ORklHX1JEX0daSVA9eQogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkU9eQogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTc2LDYgKzc3LDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC0xMDUsNiArMTA3LDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMTcsNyArMTIxLDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjMsNiArMTY2LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTcyLDggKzE3Niw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTMwMCw4ICszMDIsNiBAQAogIwogQ09ORklHX1BDST15CiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKLUNPTkZJR19QQ0lfQVVUTz15Ci1DT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiBDT05GSUdfUENJX0xFR0FDWT15CkBAIC01NjIsNiArNTYyLDcgQEAKICMgQ09ORklHX1NDU0lfTVBUMlNBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldApAQCAtNjU2LDYgKzY1Nyw3IEBACiAjIENPTkZJR19FMTAwMEUgaXMgbm90IHNldAogIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lHQiBpcyBub3Qgc2V0CisjIENPTkZJR19JR0JWRiBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKQEAgLTY3OSw2ICs2ODEsNyBAQAogIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYR0UgaXMgbm90IHNldAogIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAogIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19OSVUgaXMgbm90IHNldApAQCAtODg3LDcgKzg5MCw2IEBACiAjCiAjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKLUNPTkZJR19ISURfQ09NUEFUPXkKIENPTkZJR19VU0JfU1VQUE9SVD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQpAQCAtOTI5LDYgKzkzMSw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC05NTIsNiArOTU1LDExIEBACiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKIENPTkZJR19JU085NjYwX0ZTPW0KQEAgLTEwMDEsNiArMTAwOSw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTExMTIsMTEgKzExMjEsMjYgQEAKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19SSU5HX0JVRkZFUj15CiBDT05GSUdfVFJBQ0lORz15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CkBAIC0xMjI4LDYgKzEyNTIsNyBAQAogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CiAjIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NoNzcxMHZvaXBnd19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzEwdm9pcGd3X2RlZmNvbmZpZwppbmRleCAxYWIzN2MwLi40OGI1ODA5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzEwdm9pcGd3X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzEwdm9pcGd3X2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTk6MDk6MDEgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjA5OjE2IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTM5LDYgKzQwLDcgQEAKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19QT1NJWF9NUVVFVUVfU1lTQ1RMPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKQEAgLTcyLDYgKzc0LDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC05MCw2ICs5Myw3IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQpAQCAtOTcsNiArMTAxLDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfQkFTRV9TTUFMTD0wCkBAIC0xMDgsNyArMTE0LDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNTQsNiArMTU5LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTYzLDggKzE2OSw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTcyOCw3ICs3MzIsNiBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfVVNCX1NVUFBPUlQ9eQogQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQogIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldApAQCAtNzgwLDYgKzc4MywxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTgzNCw2ICs4NDIsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKICMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKQEAgLTg3MSwxMSArODgwLDI0IEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwogIworIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtOTc1LDYgKzk5Nyw3IEBACiAjCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaDc3MjRfZ2VuZXJpY19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzI0X2dlbmVyaWNfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOGYxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzI0X2dlbmVyaWNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzA3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTM6MDk6NDcgMjAwOQorIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKKyMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKK0NPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQorQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEU9eQorQ09ORklHX1NZU19TVVBQT1JUU19DTVQ9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTE9DS0RFUF9TVVBQT1JUPXkKK0NPTkZJR19IQVZFX0xBVEVOQ1lUT1BfU1VQUE9SVD15CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VMzIgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTY0IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX05PX1ZJUlRfVE9fQlVTPXkKK0NPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKKyMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19TWVNWSVBDX1NZU0NUTD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKworIworIyBSQ1UgU3Vic3lzdGVtCisjCisjIENPTkZJR19DTEFTU0lDX1JDVSBpcyBub3Qgc2V0CitDT05GSUdfVFJFRV9SQ1U9eQorIyBDT05GSUdfUFJFRU1QVF9SQ1UgaXMgbm90IHNldAorIyBDT05GSUdfUkNVX1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19SQ1VfRkFOT1VUPTMyCisjIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSRUVfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfUkNVX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE3CitDT05GSUdfR1JPVVBfU0NIRUQ9eQorQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQ9eQorQ09ORklHX1JUX0dST1VQX1NDSEVEPXkKK0NPTkZJR19VU0VSX1NDSEVEPXkKKyMgQ09ORklHX0NHUk9VUF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfQ0dST1VQUz15CisjIENPTkZJR19DR1JPVVBfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUF9GUkVFWkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUF9ERVZJQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBfQ1BVQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19SRVNPVVJDRV9DT1VOVEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU1FU1BBQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKK0NPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CitDT05GSUdfRU1CRURERUQ9eQorIyBDT05GSUdfVUlEMTYgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSUdOQUxGRD15CitDT05GSUdfVElNRVJGRD15CitDT05GSUdfRVZFTlRGRD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX0FJTz15CitDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19TTFVCPXkKKyMgQ09ORklHX1NMT0IgaXMgbm90IHNldAorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfVFJBQ0VQT0lOVFM9eQorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CitDT05GSUdfT1BST0ZJTEU9eQorQ09ORklHX0hBVkVfT1BST0ZJTEU9eQorQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKK0NPTkZJR19IQVZFX0tQUk9CRVM9eQorQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CitDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CitDT05GSUdfSEFWRV9DTEs9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAorQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQorQ09ORklHX1JUX01VVEVYRVM9eQorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CitDT05GSUdfQkxPQ0s9eQorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CitDT05GSUdfREVGQVVMVF9BUz15CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCitDT05GSUdfRlJFRVpFUj15CisKKyMKKyMgU3lzdGVtIHR5cGUKKyMKK0NPTkZJR19DUFVfU0g0PXkKK0NPTkZJR19DUFVfU0g0QT15CitDT05GSUdfQ1BVX1NIWDI9eQorQ09ORklHX0FSQ0hfU0hNT0JJTEU9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzI2MyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9NWEcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQ9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfUVVJQ0tMSVNUPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwODAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDQwMDAwMDAKK0NPTkZJR18yOUJJVD15CisjIENPTkZJR19YMlRMQiBpcyBub3Qgc2V0CitDT05GSUdfVlNZU0NBTEw9eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CitDT05GSUdfQVJDSF9TUEFSU0VNRU1fREVGQVVMVD15CitDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TPTEKK0NPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CitDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19BUkNIX0VOQUJMRV9NRU1PUllfSE9UUExVRz15CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFJFTU9WRT15CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV8xNktCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKK0NPTkZJR19FTlRSWV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorIyBDT05GSUdfRkxBVE1FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfU1BBUlNFTUVNX01BTlVBTD15CitDT05GSUdfU1BBUlNFTUVNPXkKK0NPTkZJR19IQVZFX01FTU9SWV9QUkVTRU5UPXkKK0NPTkZJR19TUEFSU0VNRU1fU1RBVElDPXkKKworIworIyBNZW1vcnkgaG90cGx1ZyBpcyBjdXJyZW50bHkgaW5jb21wYXRpYmxlIHdpdGggU29mdHdhcmUgU3VzcGVuZAorIworQ09ORklHX1BBR0VGTEFHU19FWFRFTkRFRD15CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX01JR1JBVElPTj15CisjIENPTkZJR19QSFlTX0FERFJfVF82NEJJVCBpcyBub3Qgc2V0CitDT05GSUdfWk9ORV9ETUFfRkxBRz0wCitDT05GSUdfTlJfUVVJQ0s9MgorQ09ORklHX1VORVZJQ1RBQkxFX0xSVT15CitDT05GSUdfSEFWRV9NTE9DSz15CitDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCitDT05GSUdfQ0FDSEVfV1JJVEVCQUNLPXkKKyMgQ09ORklHX0NBQ0hFX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19DQUNIRV9PRkYgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9GUFU9eQorIyBDT05GSUdfU0hfU1RPUkVfUVVFVUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19TUl9SQj15CitDT05GSUdfQ1BVX0hBU19QVEVBPXkKK0NPTkZJR19DUFVfSEFTX0ZQVT15CisKKyMKKyMgQm9hcmQgc3VwcG9ydAorIworCisjCisjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCisjCitDT05GSUdfU0hfVE1VPXkKK0NPTkZJR19TSF9USU1FUl9DTVQ9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgorQ09ORklHX1NIX1BDTEtfRlJFUT00MTY2NjY2NgorQ09ORklHX1RJQ0tfT05FU0hPVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCitDT05GSUdfQ1BVX0ZSRVE9eQorQ09ORklHX0NQVV9GUkVRX1RBQkxFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9TVEFUPXkKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1VTRVJTUEFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9DT05TRVJWQVRJVkUgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0dPVl9QRVJGT1JNQU5DRT15CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfUE9XRVJTQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkUgaXMgbm90IHNldAorQ09ORklHX1NIX0NQVV9GUkVRPXkKKworIworIyBETUEgc3VwcG9ydAorIworIyBDT05GSUdfU0hfRE1BIGlzIG5vdCBzZXQKKworIworIyBDb21wYW5pb24gQ2hpcHMKKyMKKworIworIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfSEVBUlRCRUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BVU0hfU1dJVENIIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgZmVhdHVyZXMKKyMKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKK0NPTkZJR19TQ0hFRF9IUlRJQ0s9eQorQ09ORklHX0tFWEVDPXkKKyMgQ09ORklHX0NSQVNIX0RVTVAgaXMgbm90IHNldAorQ09ORklHX0tFWEVDX0pVTVA9eQorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19HVVNBPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKK0NPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BNX1NMRUVQPXkKK0NPTkZJR19TVVNQRU5EPXkKK0NPTkZJR19TVVNQRU5EX0ZSRUVaRVI9eQorQ09ORklHX0hJQkVSTkFUSU9OPXkKK0NPTkZJR19QTV9TVERfUEFSVElUSU9OPSIiCitDT05GSUdfQ1BVX0lETEU9eQorQ09ORklHX0NQVV9JRExFX0dPVl9MQURERVI9eQorQ09ORklHX0NQVV9JRExFX0dPVl9NRU5VPXkKKyMgQ09ORklHX05FVCBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1NUQU5EQUxPTkU9eQorIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CitDT05GSUdfRldfTE9BREVSPXkKK0NPTkZJR19GSVJNV0FSRV9JTl9LRVJORUw9eQorQ09ORklHX0VYVFJBX0ZJUk1XQVJFPSIiCisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVj15CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisjIENPTkZJR19NSVNDX0RFVklDRVMgaXMgbm90IHNldAorQ09ORklHX0hBVkVfSURFPXkKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkVUTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEEgaXMgbm90IHNldAorIyBDT05GSUdfTUQgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfU0hfU0NJPXkKK0NPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTPTYKK0NPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1VOSVg5OF9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisjIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19CT0FSRElORk89eQorQ09ORklHX0kyQ19DSEFSREVWPXkKK0NPTkZJR19JMkNfSEVMUEVSX0FVVE89eQorCisjCisjIEkyQyBIYXJkd2FyZSBCdXMgc3VwcG9ydAorIworCisjCisjIEkyQyBzeXN0ZW0gYnVzIGRyaXZlcnMgKG1vc3RseSBlbWJlZGRlZCAvIHN5c3RlbS1vbi1jaGlwKQorIworIyBDT05GSUdfSTJDX09DT1JFUyBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1NIX01PQklMRT15CisjIENPTkZJR19JMkNfU0lNVEVDIGlzIG5vdCBzZXQKKworIworIyBFeHRlcm5hbCBJMkMvU01CdXMgYWRhcHRlciBkcml2ZXJzCisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVEFPU19FVk0gaXMgbm90IHNldAorCisjCisjIE90aGVyIEkyQy9TTUJ1cyBidXMgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BDQV9QTEFURk9STSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19EUzE2ODIgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1RTTDI1NTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfVzEgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJfU1VQUExZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUwgaXMgbm90IHNldAorIyBDT05GSUdfVEhFUk1BTF9IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CitDT05GSUdfU1NCX1BPU1NJQkxFPXkKKworIworIyBTb25pY3MgU2lsaWNvbiBCYWNrcGxhbmUKKyMKKyMgQ09ORklHX1NTQiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGlmdW5jdGlvbiBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUZEX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1NNNTAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hUQ19QQVNJQzMgaXMgbm90IHNldAorIyBDT05GSUdfVFdMNDAzMF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9UTUlPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNSUNfREE5MDNYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTg0MDAgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1dNODM1MF9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfTUZEX1BDRjUwNjMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFR1VMQVRPUiBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBjb3JlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19NRURJQSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGltZWRpYSBkcml2ZXJzCisjCisjIENPTkZJR19EQUIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX1ZHQVNUQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX09VVFBVVF9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzcGxheSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRElTUExBWV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19SVENfTElCPXkKK0NPTkZJR19SVENfQ0xBU1M9eQorQ09ORklHX1JUQ19IQ1RPU1lTPXkKK0NPTkZJR19SVENfSENUT1NZU19ERVZJQ0U9InJ0YzAiCisjIENPTkZJR19SVENfREVCVUcgaXMgbm90IHNldAorCisjCisjIFJUQyBpbnRlcmZhY2VzCisjCitDT05GSUdfUlRDX0lOVEZfREVWPXkKKyMgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1RFU1QgaXMgbm90IHNldAorCisjCisjIEkyQyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzEzMDcgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzEzNzQgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE2NzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NQVg2OTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUlM1QzM3MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0lTTDEyMDggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9YMTIwNSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1BDRjg1NjMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQxVDgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUzM1MzkwQSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0ZNMzEzMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JYODU4MSBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIFJUQyBkcml2ZXJzCisjCisKKyMKKyMgUGxhdGZvcm0gUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMjg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNTUzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNzQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfU1RLMTdUQTggaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUMzUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUNTkgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9CUTQ4MDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9WMzAyMCBpcyBub3Qgc2V0CisKKyMKKyMgb24tQ1BVIFJUQyBkcml2ZXJzCisjCitDT05GSUdfUlRDX0RSVl9TSD15CisjIENPTkZJR19ETUFERVZJQ0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAorQ09ORklHX1VJTz15CisjIENPTkZJR19VSU9fUERSViBpcyBub3Qgc2V0CitDT05GSUdfVUlPX1BEUlZfR0VOSVJRPXkKKyMgQ09ORklHX1VJT19TTVggaXMgbm90IHNldAorIyBDT05GSUdfVUlPX1NFUkNPUzMgaXMgbm90IHNldAorIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCisjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GSUxFX0xPQ0tJTkc9eQorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRkFUX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05URlNfRlMgaXMgbm90IHNldAorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfUFJPQ19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNGUyBpcyBub3Qgc2V0CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JU0NfRklMRVNZU1RFTVMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQorIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRU5BQkxFX1dBUk5fREVQUkVDQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfV0FSTj0xMDI0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQorIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19NRU1PUllfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAorIyBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0sgaXMgbm90IHNldAorQ09ORklHX05PUF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKK0NPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19SSU5HX0JVRkZFUj15CitDT05GSUdfVFJBQ0lORz15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKKworIworIyBUcmFjZXJzCisjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9BUkNIX0tHREI9eQorIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTU9SRV9DT01QSUxFX09QVElPTlMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlGUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9GSUxFX0NBUEFCSUxJVElFUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE8gaXMgbm90IHNldAorQ09ORklHX0JJTkFSWV9QUklOVEY9eQorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKK0NPTkZJR19HRU5FUklDX0ZJTkRfTEFTVF9CSVQ9eQorIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQ19UMTBESUYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX0lUVV9UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzcgaXMgbm90IHNldAorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQorQ09ORklHX0hBU19ETUE9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NoNzc2M3JkcF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzYzcmRwX2RlZmNvbmZpZwppbmRleCBjNzliYjg0Li5mNzdiYzc5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzYzcmRwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzYzcmRwX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTk6MTA6NTcgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjEwOjEyIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTc4LDYgKzc5LDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC0xMDYsNiArMTA4LDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMTcsNyArMTIxLDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjQsNiArMTY3LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2Mz15CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE3Myw4ICsxNzcsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC01NTUsNiArNTU3LDcgQEAKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldApAQCAtOTQxLDYgKzk0NCw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTk2NSw2ICs5NjksMTEgQEAKIENPTkZJR19HRU5FUklDX0FDTD15CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTEwMTIsNiArMTAyMSw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiAjIENPTkZJR19ORlNfVjMgaXMgbm90IHNldApAQCAtMTEwMCwxMSArMTExMCwyNSBAQAogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAogIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtMTIwNCw2ICsxMjI4LDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQorQ09ORklHX0JJTkFSWV9QUklOVEY9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaDc3NzBfZ2VuZXJpY19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzcwX2dlbmVyaWNfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NDg5YjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzcwX2dlbmVyaWNfZGVmY29uZmlnCkBAIC0wLDAgKzEsNzAwIEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmM0CisjIFR1ZSBNYXkgMTIgMTQ6NDg6MjEgMjAwOQorIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19CVUc9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKKyMgQ09ORklHX0dFTkVSSUNfR1BJTyBpcyBub3Qgc2V0CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTPXkKKyMgQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRSBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9ISUJFUk5BVElPTl9QT1NTSUJMRT15CitDT05GSUdfU1lTX1NVUFBPUlRTX1RNVT15CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX0hBVkVfTEFURU5DWVRPUF9TVVBQT1JUPXkKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1UzMiBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0hBU19JTE9HMl9VNjQgaXMgbm90IHNldAorQ09ORklHX0FSQ0hfTk9fVklSVF9UT19CVVM9eQorQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CitDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorCisjCisjIFJDVSBTdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0NMQVNTSUNfUkNVIGlzIG5vdCBzZXQKK0NPTkZJR19UUkVFX1JDVT15CisjIENPTkZJR19QUkVFTVBUX1JDVSBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX1JDVV9GQU5PVVQ9MzIKKyMgQ09ORklHX1JDVV9GQU5PVVRfRVhBQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVFJFRV9SQ1VfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9SQ1VfVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTcKK0NPTkZJR19HUk9VUF9TQ0hFRD15CitDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRD15CitDT05GSUdfUlRfR1JPVVBfU0NIRUQ9eQorQ09ORklHX1VTRVJfU0NIRUQ9eQorIyBDT05GSUdfQ0dST1VQX1NDSEVEIGlzIG5vdCBzZXQKK0NPTkZJR19DR1JPVVBTPXkKKyMgQ09ORklHX0NHUk9VUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19DR1JPVVBfTlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX0ZSRUVaRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ0dST1VQX0RFVklDRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVTRVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NHUk9VUF9DUFVBQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU09VUkNFX0NPVU5URVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVTUEFDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19TWVNDVEw9eQorQ09ORklHX0FOT05fSU5PREVTPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19VSUQxNiBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQorQ09ORklHX0tBTExTWU1TPXkKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NJR05BTEZEPXkKK0NPTkZJR19USU1FUkZEPXkKK0NPTkZJR19FVkVOVEZEPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQUlPPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX1NMVUI9eQorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CitDT05GSUdfUFJPRklMSU5HPXkKK0NPTkZJR19UUkFDRVBPSU5UUz15CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19PUFJPRklMRT15CitDT05GSUdfSEFWRV9PUFJPRklMRT15CitDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQorQ09ORklHX0hBVkVfS1BST0JFUz15CitDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKK0NPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKK0NPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CitDT05GSUdfUlRfTVVURVhFUz15CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19CTE9DSz15CisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19GUkVFWkVSPXkKKworIworIyBTeXN0ZW0gdHlwZQorIworQ09ORklHX0NQVV9TSDQ9eQorQ09ORklHX0NQVV9TSDRBPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzYxOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjAzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcyNjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfTVhHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzA9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODYgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX1FVSUNLTElTVD15CitDT05GSUdfTU1VPXkKK0NPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MDgwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDA0MDAwMDAwCitDT05GSUdfMjlCSVQ9eQorQ09ORklHX1ZTWVNDQUxMPXkKK0NPTkZJR19BUkNIX0ZMQVRNRU1fRU5BQkxFPXkKK0NPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQorQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQ9eQorQ09ORklHX01BWF9BQ1RJVkVfUkVHSU9OUz0xCitDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQorQ09ORklHX0FSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQorQ09ORklHX0FSQ0hfRU5BQkxFX01FTU9SWV9IT1RSRU1PVkU9eQorQ09ORklHX1BBR0VfU0laRV80S0I9eQorIyBDT05GSUdfUEFHRV9TSVpFXzhLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfMTZLQiBpcyBub3Qgc2V0CisjIENPTkZJR19QQUdFX1NJWkVfNjRLQiBpcyBub3Qgc2V0CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CisjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19TUEFSU0VNRU1fTUFOVUFMPXkKK0NPTkZJR19TUEFSU0VNRU09eQorQ09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlQ9eQorQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQorCisjCisjIE1lbW9yeSBob3RwbHVnIGlzIGN1cnJlbnRseSBpbmNvbXBhdGlibGUgd2l0aCBTb2Z0d2FyZSBTdXNwZW5kCisjCitDT05GSUdfUEFHRUZMQUdTX0VYVEVOREVEPXkKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfTUlHUkFUSU9OPXkKKyMgQ09ORklHX1BIWVNfQUREUl9UXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKK0NPTkZJR19OUl9RVUlDSz0yCitDT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKK0NPTkZJR19IQVZFX01MT0NLPXkKK0NPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQorCisjCisjIENhY2hlIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19DQUNIRV9XUklURUJBQ0s9eQorIyBDT05GSUdfQ0FDSEVfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBQ0hFX09GRiBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfQ1BVX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1NIX0ZQVT15CisjIENPTkZJR19TSF9TVE9SRV9RVUVVRVMgaXMgbm90IHNldAorQ09ORklHX0NQVV9IQVNfSU5URVZUPXkKK0NPTkZJR19DUFVfSEFTX1NSX1JCPXkKK0NPTkZJR19DUFVfSEFTX0ZQVT15CisKKyMKKyMgQm9hcmQgc3VwcG9ydAorIworCisjCisjIFRpbWVyIGFuZCBjbG9jayBjb25maWd1cmF0aW9uCisjCitDT05GSUdfU0hfVE1VPXkKK0NPTkZJR19TSF9USU1FUl9JUlE9MTYKK0NPTkZJR19TSF9QQ0xLX0ZSRVE9NDE2NjY2NjYKK0NPTkZJR19USUNLX09ORVNIT1Q9eQorQ09ORklHX05PX0haPXkKK0NPTkZJR19ISUdIX1JFU19USU1FUlM9eQorQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQ9eQorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworQ09ORklHX0NQVV9GUkVRPXkKK0NPTkZJR19DUFVfRlJFUV9UQUJMRT15CisjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfU1RBVD15CisjIENPTkZJR19DUFVfRlJFUV9TVEFUX0RFVEFJTFMgaXMgbm90IHNldAorQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BFUkZPUk1BTkNFPXkKKyMgQ09ORklHX0NQVV9GUkVRX0RFRkFVTFRfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9ERUZBVUxUX0dPVl9VU0VSU1BBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfT05ERU1BTkQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9PTkRFTUFORCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfRlJFUV9HT1ZfQ09OU0VSVkFUSVZFIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9DUFVfRlJFUT15CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisKKyMKKyMgQWRkaXRpb25hbCBTdXBlckggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0hFQVJUQkVBVCBpcyBub3Qgc2V0CisjIENPTkZJR19QVVNIX1NXSVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGZlYXR1cmVzCisjCisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CitDT05GSUdfSFo9MjUwCitDT05GSUdfU0NIRURfSFJUSUNLPXkKK0NPTkZJR19LRVhFQz15CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKK0NPTkZJR19LRVhFQ19KVU1QPXkKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CitDT05GSUdfR1VTQT15CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCitDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCitDT05GSUdfRU5UUllfT0ZGU0VUPTB4MDAwMDEwMDAKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBVkVfQU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCitDT05GSUdfUE09eQorIyBDT05GSUdfUE1fREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BNX1NMRUVQPXkKK0NPTkZJR19ISUJFUk5BVElPTj15CitDT05GSUdfUE1fU1REX1BBUlRJVElPTj0iIgorQ09ORklHX0NQVV9JRExFPXkKK0NPTkZJR19DUFVfSURMRV9HT1ZfTEFEREVSPXkKK0NPTkZJR19DUFVfSURMRV9HT1ZfTUVOVT15CisjIENPTkZJR19ORVQgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19TVEFOREFMT05FPXkKKyMgQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQgaXMgbm90IHNldAorQ09ORklHX0ZXX0xPQURFUj15CitDT05GSUdfRklSTVdBUkVfSU5fS0VSTkVMPXkKK0NPTkZJR19FWFRSQV9GSVJNV0FSRT0iIgorIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAorIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVY9eQorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19ERVZJQ0VTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0lERT15CisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz02CitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19VTklYOThfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQk9BUkRJTkZPPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0hFTFBFUl9BVVRPPXkKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKworIworIyBJMkMgc3lzdGVtIGJ1cyBkcml2ZXJzIChtb3N0bHkgZW1iZWRkZWQgLyBzeXN0ZW0tb24tY2hpcCkKKyMKKyMgQ09ORklHX0kyQ19PQ09SRVMgaXMgbm90IHNldAorQ09ORklHX0kyQ19TSF9NT0JJTEU9eQorIyBDT05GSUdfSTJDX1NJTVRFQyBpcyBub3Qgc2V0CisKKyMKKyMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycworIworIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1RBT1NfRVZNIGlzIG5vdCBzZXQKKworIworIyBPdGhlciBJMkMvU01CdXMgYnVzIGRyaXZlcnMKKyMKKyMgQ09ORklHX0kyQ19QQ0FfUExBVEZPUk0gaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAorIworIyBDT05GSUdfRFMxNjgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CisjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfU1BJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1cxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPV0VSX1NVUFBMWSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19USEVSTUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RIRVJNQUxfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorQ09ORklHX1NTQl9QT1NTSUJMRT15CisKKyMKKyMgU29uaWNzIFNpbGljb24gQmFja3BsYW5lCisjCisjIENPTkZJR19TU0IgaXMgbm90IHNldAorCisjCisjIE11bHRpZnVuY3Rpb24gZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01GRF9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9TTTUwMSBpcyBub3Qgc2V0CisjIENPTkZJR19IVENfUEFTSUMzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RXTDQwMzBfQ09SRSBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfVE1JTyBpcyBub3Qgc2V0CisjIENPTkZJR19QTUlDX0RBOTAzWCBpcyBub3Qgc2V0CisjIENPTkZJR19NRkRfV004NDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9XTTgzNTBfSTJDIGlzIG5vdCBzZXQKKyMgQ09ORklHX01GRF9QQ0Y1MDYzMyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUdVTEFUT1IgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgY29yZSBzdXBwb3J0CisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTUVESUEgaXMgbm90IHNldAorCisjCisjIE11bHRpbWVkaWEgZHJpdmVycworIworIyBDT05GSUdfREFCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19WR0FTVEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVVRQVVRfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIERpc3BsYXkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0RJU1BMQVlfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUMgaXMgbm90IHNldAorIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX0RFVj15CisjIENPTkZJR19SVENfSU5URl9ERVZfVUlFX0VNVUwgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKworIworIyBJMkMgUlRDIGRyaXZlcnMKKyMKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxMzc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfRFMxNjcyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTUFYNjkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1JTNUMzNzIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9JU0wxMjA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfWDEyMDUgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfUENGODU4MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX000MVQ4MCBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1MzNTM5MEEgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9GTTMxMzAgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9SWDg1ODEgaXMgbm90IHNldAorCisjCisjIFNQSSBSVEMgZHJpdmVycworIworCisjCisjIFBsYXRmb3JtIFJUQyBkcml2ZXJzCisjCisjIENPTkZJR19SVENfRFJWX0RTMTI4NiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTUxMSBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTU1MyBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX0RTMTc0MiBpcyBub3Qgc2V0CisjIENPTkZJR19SVENfRFJWX1NUSzE3VEE4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDg2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfTTQ4VDU5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfQlE0ODAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAorCisjCisjIG9uLUNQVSBSVEMgZHJpdmVycworIworQ09ORklHX1JUQ19EUlZfU0g9eQorIyBDT05GSUdfUlRDX0RSVl9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQURFVklDRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CitDT05GSUdfVUlPPXkKKyMgQ09ORklHX1VJT19QRFJWIGlzIG5vdCBzZXQKK0NPTkZJR19VSU9fUERSVl9HRU5JUlE9eQorIyBDT05GSUdfVUlPX1NNWCBpcyBub3Qgc2V0CisjIENPTkZJR19VSU9fU0VSQ09TMyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKKworIworIyBGaWxlIHN5c3RlbXMKKyMKKyMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0ZJTEVfTE9DS0lORz15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQlRSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19QUk9DX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorIyBDT05GSUdfTUlTQ19GSUxFU1lTVEVNUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19FTkFCTEVfV0FSTl9ERVBSRUNBVEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLIGlzIG5vdCBzZXQKK0NPTkZJR19GUkFNRV9XQVJOPTEwMjQKKyMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19GUz15CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRT15CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01FTU9SWV9JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JDVV9DUFVfU1RBTExfREVURUNUT1IgaXMgbm90IHNldAorIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSyBpcyBub3Qgc2V0CitDT05GSUdfTk9QX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQorQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQorCisjCisjIFRyYWNlcnMKKyMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0FSQ0hfS0dEQj15CisjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisKKyMKKyMgU2VjdXJpdHkgb3B0aW9ucworIworIyBDT05GSUdfS0VZUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0dFTkVSSUNfRklORF9MQVNUX0JJVD15CisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDX1QxMERJRiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkNfSVRVX1QgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMzIgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorQ09ORklHX0hBU19JT01FTT15CitDT05GSUdfSEFTX0lPUE9SVD15CitDT05GSUdfSEFTX0RNQT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3Nzg1bGNyXzMyYml0X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaDc3ODVsY3JfMzJiaXRfZGVmY29uZmlnCmluZGV4IGE2Y2Y0NTA1Li4xYzU1YjgwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3Nzg1bGNyXzMyYml0X2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3Nzg1bGNyXzMyYml0X2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTk6MTI6MTggMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjEwOjUzIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTc5LDYgKzgwLDcgQEAKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtOTgsNiArMTAwLDcgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiBDT05GSUdfUFJPRklMSU5HPXkKKyMgQ09ORklHX01BUktFUlMgaXMgbm90IHNldAogIyBDT05GSUdfT1BST0ZJTEUgaXMgbm90IHNldAogQ09ORklHX0hBVkVfT1BST0ZJTEU9eQogIyBDT05GSUdfS1BST0JFUyBpcyBub3Qgc2V0CkBAIC0xMDYsNiArMTA5LDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMTgsNyArMTIzLDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjYsNiArMTcwLDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTc1LDggKzE4MCw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTMxMCw4ICszMTMsNiBAQAogIwogQ09ORklHX1BDST15CiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKLUNPTkZJR19QQ0lfQVVUTz15Ci1DT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiBDT05GSUdfUENJX0xFR0FDWT15CkBAIC02NzIsNiArNjczLDcgQEAKICMgQ09ORklHX0UxMDAwRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSUdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQlZGIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApAQCAtMTAwOSwxNSArMTAxMSwxNyBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfSElEX0E0VEVDSD15CiBDT05GSUdfSElEX0FQUExFPXkKIENPTkZJR19ISURfQkVMS0lOPXkKIENPTkZJR19ISURfQ0hFUlJZPXkKIENPTkZJR19ISURfQ0hJQ09OWT15CiBDT05GSUdfSElEX0NZUFJFU1M9eQorIyBDT05GSUdfRFJBR09OUklTRV9GRiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0VaS0VZPXkKKyMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9HWVJBVElPTj15CisjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0xPR0lURUNIPXkKICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKQEAgLTEyMTgsNiArMTIyMiw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTEyNDAsNiArMTI0NSwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTEyODksNiArMTI5OSw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTEzNzcsNiArMTM4OCw5IEBACiBDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQogIyBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMgaXMgbm90IHNldAogQ09ORklHX0JPT1RQQVJBTV9TT0ZUTE9DS1VQX1BBTklDX1ZBTFVFPTAKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKKyMgQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUMgaXMgbm90IHNldAorQ09ORklHX0JPT1RQQVJBTV9IVU5HX1RBU0tfUEFOSUNfVkFMVUU9MAogQ09ORklHX1NDSEVEX0RFQlVHPXkKICMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAogIyBDT05GSUdfVElNRVJfU1RBVFMgaXMgbm90IHNldApAQCAtMTQxMyw2ICsxNDI3LDcgQEAKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCkBAIC0xNDIyLDkgKzE0MzcsMTQgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKQEAgLTE1NDIsNiArMTU2Miw3IEBACiAjCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NoNzc4NWxjcl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3Nzg1bGNyX2RlZmNvbmZpZwppbmRleCBlNGZhYzJlLi40Mzg1ZmU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3Nzg1bGNyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2g3Nzg1bGNyX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzIKLSMgV2VkIEFwciAyMiAxOToxNzo1NiAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTM6MTE6NDggMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQpAQCAtMzA3LDggKzMwNyw2IEBACiAjCiBDT05GSUdfUENJPXkKIENPTkZJR19TSF9QQ0lETUFfTk9OQ09IRVJFTlQ9eQotQ09ORklHX1BDSV9BVVRPPXkKLUNPTkZJR19QQ0lfQVVUT19VUERBVEVfUkVTT1VSQ0VTPXkKICMgQ09ORklHX1BDSUVQT1JUQlVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSQ0hfU1VQUE9SVFNfTVNJIGlzIG5vdCBzZXQKIENPTkZJR19QQ0lfTEVHQUNZPXkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zaG1pbl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2htaW5fZGVmY29uZmlnCmluZGV4IGQ2OTVlOTAuLjRlMTIwMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zaG1pbl9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3NobWluX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTk6MTk6MDMgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjEyOjQxIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CkBAIC02Myw2ICs2NCw3IEBACiAjIENPTkZJR19VSUQxNiBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNDVExfU1lTQ0FMTCBpcyBub3Qgc2V0CiAjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKIENPTkZJR19QUklOVEs9eQogIyBDT05GSUdfQlVHIGlzIG5vdCBzZXQKQEAgLTgxLDEyICs4MywxNSBAQAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xPQj15CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiBDT05GSUdfSEFWRV9JT1JFTUFQX1BST1Q9eQogQ09ORklHX0hBVkVfS1BST0JFUz15CiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfQkFTRV9TTUFMTD0xCiAjIENPTkZJR19NT0RVTEVTIGlzIG5vdCBzZXQKQEAgLTEzNyw2ICsxNDIsNyBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CkBAIC0xNDYsOCArMTUyLDYgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtNjc1LDYgKzY3OSwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTcxOCw2ICs3MjcsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC03NjIsMTAgKzc3MiwyMiBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKIENPTkZJR19TSF9TVEFOREFSRF9CSU9TPXkKQEAgLTg2NCw2ICs4ODYsNyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CisjIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWcKaW5kZXggZTM2NTFmNS4uYzA4ODE0NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTk6MjA6NTQgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjEzOjEyIDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTQyLDYgKzQzLDcgQEAKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19QT1NJWF9NUVVFVUVfU1lTQ1RMPXkKIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAogIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKQEAgLTk2LDYgKzk4LDcgQEAKIENPTkZJR19LQUxMU1lNUz15CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTEyNiw2ICsxMjksOCBAQAogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfQkFTRV9TTUFMTD0wCkBAIC0xMzgsNyArMTQzLDYgQEAKIENPTkZJR19TVE9QX01BQ0hJTkU9eQogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTg2LDYgKzE5MCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE5NSw4ICsyMDAsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC01NTMsNiArNTU2LDcgQEAKIENPTkZJR19TQ1NJX0xPV0xFVkVMPXkKICMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldApAQCAtNjQ2LDYgKzY1MCw3IEBACiAjCiAjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKICMKKyMgQ09ORklHX1NFUklBTF9NQVgzMTAwIGlzIG5vdCBzZXQKIENPTkZJR19TRVJJQUxfU0hfU0NJPXkKIENPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTPTIKIENPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQpAQCAtOTg1LDYgKzk5MCw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTEwMDgsNiArMTAxNCwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTEwNTEsNiArMTA2Miw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogIyBDT05GSUdfTkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05GU0QgaXMgbm90IHNldApAQCAtMTA4NSw2ICsxMDk3LDkgQEAKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19CT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQyBpcyBub3Qgc2V0CiBDT05GSUdfQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUNfVkFMVUU9MAorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorIyBDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQyBpcyBub3Qgc2V0CitDT05GSUdfQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRT0wCiBDT05GSUdfU0NIRURfREVCVUc9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CkBAIC0xMTI0LDYgKzExMzksNyBAQAogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX1JJTkdfQlVGRkVSPXkKIENPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTExMzMsMTEgKzExNDksMTYgQEAKICMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC0xMjQ1LDYgKzEyNjYsNyBAQAogIwogIyBDT05GSUdfQ1JZUFRPX0FOU0lfQ1BSTkcgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19IVz15CitDT05GSUdfQklOQVJZX1BSSU5URj15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NuYXBnZWFyX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zbmFwZ2Vhcl9kZWZjb25maWcKaW5kZXggNjk2MGY2MC4uNTRhN2EzYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3NuYXBnZWFyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc25hcGdlYXJfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxOToyMTozOSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTM6MTQ6MDAgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNjQsNyArNjUsNiBAQAogQ09ORklHX1JEX0daSVA9eQogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkU9eQogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0FOT05fSU5PREVTPXkKQEAgLTczLDYgKzczLDcgQEAKICMgQ09ORklHX1NZU0NUTF9TWVNDQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPVFBMVUcgaXMgbm90IHNldAogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTkyLDEyICs5MywxNSBAQAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMDUsNyArMTA5LDYgQEAKICMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTUxLDYgKzE1NCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE2MCw4ICsxNjQsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0yOTUsOCArMjk3LDYgQEAKICMKIENPTkZJR19QQ0k9eQogQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15Ci1DT05GSUdfUENJX0FVVE89eQotQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQogIyBDT05GSUdfUENJRVBPUlRCVVMgaXMgbm90IHNldAogIyBDT05GSUdfQVJDSF9TVVBQT1JUU19NU0kgaXMgbm90IHNldAogQ09ORklHX1BDSV9MRUdBQ1k9eQpAQCAtNzYzLDYgKzc2MywxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTgwNSw4ICs4MTAsMTMgQEAKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CitDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JMT0NLPXkKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JPVEggaXMgbm90IHNldAorQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiAjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CkBAIC04NDQsMTAgKzg1NCwyMyBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKICMKKyMgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFTT0ZGX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CkBAIC04NjIsNiArODg1LDcgQEAKICMgQ09ORklHX1NFQ1VSSVRZRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfRklMRV9DQVBBQklMSVRJRVMgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9zeXN0ZW1oX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zeXN0ZW1oX2RlZmNvbmZpZwppbmRleCA3ZWE2MzliLi5kYmU3ZTU0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc3lzdGVtaF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3N5c3RlbWhfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxOToyMzozMSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTM6MTQ6MzMgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNjEsNyArNjIsNiBAQAogQ09ORklHX1JEX0daSVA9eQogIyBDT05GSUdfUkRfQlpJUDIgaXMgbm90IHNldAogIyBDT05GSUdfUkRfTFpNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX05PTkU9eQogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiBDT05GSUdfQU5PTl9JTk9ERVM9eQpAQCAtNzAsNiArNzAsNyBAQAogIyBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgaXMgbm90IHNldAogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQpAQCAtODgsNiArODksNyBAQAogIyBDT05GSUdfU0xVQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKICMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfSU9SRU1BUF9QUk9UPXkKQEAgLTk1LDYgKzk3LDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMDcsNyArMTExLDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNTMsNiArMTU2LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTYyLDggKzE2Niw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTUwNiw2ICs1MDgsMTEgQEAKICMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CkBAIC01NDcsOCArNTU0LDEzIEBACiAjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfUk9NRlNfRlM9eQorQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9CTE9DSz15CisjIENPTkZJR19ST01GU19CQUNLRURfQllfTVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9CT1RIIGlzIG5vdCBzZXQKK0NPTkZJR19ST01GU19PTl9CTE9DSz15CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogCiAjCiAjIFBhcnRpdGlvbiBUeXBlcwpAQCAtNTc3LDEwICs1ODksMjQgQEAKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtNTk1LDYgKzYyMSw3IEBACiAjIENPTkZJR19TRUNVUklUWUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX0ZJTEVfQ0FQQUJJTElUSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZwppbmRleCBiYmViNGM2Li44Y2E5NGVmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvdGl0YW5fZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKQEAgLTEsMTAgKzEsMTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOQotIyBUaHUgQXByICAyIDE5OjI0OjU1IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzMKKyMgTW9uIEFwciAyNyAxMzoxNDo1NSAyMDA5CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19TVVBFUkgzMj15CisjIENPTkZJR19TVVBFUkg2NCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gvc2gvY29uZmlncy9zaHgzX2RlZmNvbmZpZyIKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKIENPTkZJR19HRU5FUklDX0JVRz15CkBAIC00MCw2ICs0MSw3IEBACiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CkBAIC02Niw3ICs2OCw2IEBACiBDT05GSUdfUkRfR1pJUD15CiAjIENPTkZJR19SRF9CWklQMiBpcyBub3Qgc2V0CiAjIENPTkZJR19SRF9MWk1BIGlzIG5vdCBzZXQKLUNPTkZJR19JTklUUkFNRlNfQ09NUFJFU1NJT05fTk9ORT15CiAjIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC03Niw2ICs3Nyw3IEBACiBDT05GSUdfS0FMTFNZTVM9eQogIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTk1LDYgKzk3LDcgQEAKICMgQ09ORklHX1NMVUIgaXMgbm90IHNldAogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CiAjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfTUFSS0VSUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9PUFJPRklMRT15CiAjIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0lPUkVNQVBfUFJPVD15CkBAIC0xMDIsNiArMTA1LDggQEAKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQogQ09ORklHX0hBVkVfQ0xLPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UPXkKIENPTkZJR19TTEFCSU5GTz15CiBDT05GSUdfUlRfTVVURVhFUz15CkBAIC0xMTQsNyArMTE5LDYgQEAKICMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkgaXMgbm90IHNldAogCkBAIC0xNjAsNiArMTY0LDcgQEAKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldApAQCAtMTY5LDggKzE3NCw2IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMgaXMgbm90IHNldAogCiAjCiAjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKQEAgLTMwNSw4ICszMDgsNiBAQAogIwogQ09ORklHX1BDST15CiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKLUNPTkZJR19QQ0lfQVVUTz15Ci1DT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BUkNIX1NVUFBPUlRTX01TSSBpcyBub3Qgc2V0CiBDT05GSUdfUENJX0xFR0FDWT15CkBAIC03ODksNiArNzkwLDcgQEAKICMgQ09ORklHX1NDU0lfTVBUMlNBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJGQyBpcyBub3Qgc2V0CisjIENPTkZJR19MSUJGQ09FIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZDT0UgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldApAQCAtOTA2LDYgKzkwOCw3IEBACiAjIENPTkZJR19FMTAwMEUgaXMgbm90IHNldAogIyBDT05GSUdfSVAxMDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0lHQiBpcyBub3Qgc2V0CisjIENPTkZJR19JR0JWRiBpcyBub3Qgc2V0CiAjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAogIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKQEAgLTkyOSw2ICs5MzIsNyBAQAogIyBDT05GSUdfSVhHQkUgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYR0UgaXMgbm90IHNldAogIyBDT05GSUdfTVlSSTEwR0UgaXMgbm90IHNldAogIyBDT05GSUdfTkVUWEVOX05JQyBpcyBub3Qgc2V0CiAjIENPTkZJR19OSVUgaXMgbm90IHNldApAQCAtMTE4Miw3ICsxMTg2LDYgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX1VTQl9TVVBQT1JUPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CkBAIC0xMzkzLDYgKzEzOTYsNyBAQAogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQ0X0ZTIGlzIG5vdCBzZXQKIENPTkZJR19KQkQ9eQpAQCAtMTQxOSw2ICsxNDIzLDExIEBACiBDT05GSUdfRlVTRV9GUz1tCiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiBDT05GSUdfSVNPOTY2MF9GUz1tCkBAIC0xNDY3LDggKzE0NzYsMTMgQEAKICMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ST01GU19GUz15CitDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JMT0NLPXkKKyMgQ09ORklHX1JPTUZTX0JBQ0tFRF9CWV9NVEQgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfQkFDS0VEX0JZX0JPVEggaXMgbm90IHNldAorQ09ORklHX1JPTUZTX09OX0JMT0NLPXkKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMTU3Niw2ICsxNTkwLDcgQEAKIENPTkZJR19ERUJVR19LRVJORUw9eQogIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAogIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVURUNUX0hVTkdfVEFTSyBpcyBub3Qgc2V0CiBDT05GSUdfU0NIRURfREVCVUc9eQogIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19USU1FUl9TVEFUUyBpcyBub3Qgc2V0CkBAIC0xNjEwLDYgKzE2MjUsNyBAQAogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTE2MTgsOSArMTYzNCwxNCBAQAogIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldApAQCAtMTc0MSw2ICsxNzYyLDcgQEAKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fSFc9eQogIyBDT05GSUdfQ1JZUFRPX0RFVl9ISUZOXzc5NVggaXMgbm90IHNldAorIyBDT05GSUdfQklOQVJZX1BSSU5URiBpcyBub3Qgc2V0CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3VsMl9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvdWwyX2RlZmNvbmZpZwppbmRleCAzNGY1MTkyLi5iZmI0ZDk4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvdWwyX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3MvdWwyX2RlZmNvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5Ci0jIFRodSBBcHIgIDIgMTk6MzA6MjcgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMworIyBNb24gQXByIDI3IDEzOjE3OjA1IDIwMDkKICMKIENPTkZJR19TVVBFUkg9eQogQ09ORklHX1NVUEVSSDMyPXkKKyMgQ09ORklHX1NVUEVSSDY0IGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC9zaC9jb25maWdzL3NoeDNfZGVmY29uZmlnIgogQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQogQ09ORklHX0dFTkVSSUNfQlVHPXkKQEAgLTY5LDcgKzcwLDYgQEAKIENPTkZJR19SRF9HWklQPXkKICMgQ09ORklHX1JEX0JaSVAyIGlzIG5vdCBzZXQKICMgQ09ORklHX1JEX0xaTUEgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19DT01QUkVTU0lPTl9OT05FPXkKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKIENPTkZJR19BTk9OX0lOT0RFUz15CkBAIC03OCw2ICs3OCw3IEBACiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKICMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKQEAgLTk3LDYgKzk4LDcgQEAKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX09QUk9GSUxFIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldApAQCAtMTA1LDYgKzEwNyw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTE3LDcgKzEyMSw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTY3LDYgKzE3MCw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE3Niw4ICsxODAsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2PXkKLSMgQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMyBpcyBub3Qgc2V0CiAKICMKICMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucwpAQCAtNTg0LDYgKzU4Niw3IEBACiBDT05GSUdfU0NTSV9MT1dMRVZFTD15CiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAogIyBDT05GSUdfTElCRkMgaXMgbm90IHNldAorIyBDT05GSUdfTElCRkNPRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKQEAgLTkzNiw2ICs5MzksNyBAQAogIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CkBAIC05NTgsNiArOTYyLDExIEBACiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKICMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldApAQCAtMTAwNSw2ICsxMDE0LDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKICMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CkBAIC0xMDk1LDEwICsxMTA1LDI0IEBACiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwogIworIyBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUVNPRkZfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAorIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKQEAgLTEyMDgsNiArMTIzMiw3IEBACiAjCiAjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0hXPXkKKyMgQ09ORklHX0JJTkFSWV9QUklOVEYgaXMgbm90IHNldAogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy91cnF1ZWxsX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy91cnF1ZWxsX2RlZmNvbmZpZwppbmRleCBkMTc0YjFhLi41MTI2NjRmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3MvdXJxdWVsbF9kZWZjb25maWcKKysrIGIvYXJjaC9zaC9jb25maWdzL3VycXVlbGxfZGVmY29uZmlnCkBAIC0xLDEwICsxLDExIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjkKLSMgVGh1IEFwciAgMiAxOTozMzozOSAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMzCisjIE1vbiBBcHIgMjcgMTQ6MDI6NTUgMjAwOQogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfU1VQRVJIMzI9eQorIyBDT05GSUdfU1VQRVJINjQgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3NoL2NvbmZpZ3Mvc2h4M19kZWZjb25maWciCiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19CVUc9eQpAQCAtNzYsNiArNzcsNyBAQAogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CkBAIC05NCw2ICs5Niw3IEBACiAjIENPTkZJR19TTFVCIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldAogQ09ORklHX1BST0ZJTElORz15CisjIENPTkZJR19NQVJLRVJTIGlzIG5vdCBzZXQKICMgQ09ORklHX09QUk9GSUxFIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX09QUk9GSUxFPXkKICMgQ09ORklHX0tQUk9CRVMgaXMgbm90IHNldApAQCAtMTAyLDYgKzEwNSw4IEBACiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKIENPTkZJR19IQVZFX0NMSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTE0LDcgKzExOSw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX0JMT0NLPXkKICMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQlNHIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTYyLDYgKzE2Niw3IEBACiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0IGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKQEAgLTE3MSw4ICsxNzYsNiBAQAogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC05MDAsMTUgKzkwMywxNyBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfSElEX0E0VEVDSD15CiBDT05GSUdfSElEX0FQUExFPXkKIENPTkZJR19ISURfQkVMS0lOPXkKIENPTkZJR19ISURfQ0hFUlJZPXkKIENPTkZJR19ISURfQ0hJQ09OWT15CiBDT05GSUdfSElEX0NZUFJFU1M9eQorIyBDT05GSUdfRFJBR09OUklTRV9GRiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0VaS0VZPXkKKyMgQ09ORklHX0hJRF9LWUUgaXMgbm90IHNldAogQ09ORklHX0hJRF9HWVJBVElPTj15CisjIENPTkZJR19ISURfS0VOU0lOR1RPTiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0xPR0lURUNIPXkKICMgQ09ORklHX0xPR0lURUNIX0ZGIGlzIG5vdCBzZXQKICMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKQEAgLTEwNDYsNiArMTA1MSw3IEBACiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiAjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CiAjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKQEAgLTEwNjgsNiArMTA3NCwxMSBAQAogIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiAjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKQEAgLTExMTcsNiArMTEyOCw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTEyMDksMTAgKzEyMjEsMjQgQEAKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCiAjCisjIENPTkZJR19GVU5DVElPTl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfSVJRU09GRl9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CisjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldApAQCAtMTMyMiw2ICsxMzQ4LDcgQEAKICMKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5BUllfUFJJTlRGIGlzIG5vdCBzZXQKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcKaW5kZXggNjY2NzEzYS4uNjNlOWRkMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMTYsNyArMTYsOCBAQAogCQkgICAgIENQVV9TVUJUWVBFX1NINzc1MFMgfHwgQ1BVX1NVQlRZUEVfU0g3NzUwUiB8fCBcCiAJCSAgICAgQ1BVX1NVQlRZUEVfU0g3NzUxUiB8fCBDUFVfU1VCVFlQRV9TSDcwOTEgIHx8IFwKIAkJICAgICBDUFVfU1VCVFlQRV9TSDc3NjMgIHx8IENQVV9TVUJUWVBFX1NINzc2NCAgfHwgXAotCQkgICAgIENQVV9TVUJUWVBFX1NINzc4MCAgfHwgQ1BVX1NVQlRZUEVfU0g3Nzg1CisJCSAgICAgQ1BVX1NVQlRZUEVfU0g3NzgwICB8fCBDUFVfU1VCVFlQRV9TSDc3ODUgIHx8IFwKKwkJICAgICBDUFVfU1VCVFlQRV9TSDc3NjAKIAogY29uZmlnIE5SX09OQ0hJUF9ETUFfQ0hBTk5FTFMKIAlpbnQKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCA3ZTgxNmVkLi5lOGRiNTg1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9LY29uZmlnCkBAIC0xNywyMSArMTcsMyBAQAogCSAgY29kZSB3aWxsIG5vdCBoYXZlIHRvIGZsdXNoIHRoZSBDUFUncyBjYWNoZXMuIElmIHlvdSBoYXZlIGEgUENJIGhvc3QKIAkgIGJyaWRnZSBpbnRlZ3JhdGVkIHdpdGggeW91ciBTSCBDUFUsIHJlZmVyIGNhcmVmdWxseSB0byB0aGUgY2hpcCBzcGVjcwogCSAgdG8gc2VlIGlmIHlvdSBjYW4gc2F5ICdOJyBoZXJlLiBPdGhlcndpc2UsIGxlYXZlIGl0IGFzICdZJy4KLQotIyBUaGlzIGlzIGFsc28gYm9hcmQtc3BlY2lmaWMKLWNvbmZpZyBQQ0lfQVVUTwotCWJvb2wKLQlkZXBlbmRzIG9uIFBDSQotCWRlZmF1bHQgeQotCi1jb25maWcgUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUwotCWJvb2wKLQlkZXBlbmRzIG9uIFBDSV9BVVRPCi0JZGVmYXVsdCB5IGlmICFTSF9EUkVBTUNBU1QKLQloZWxwCi0JICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBjYXVzZSB0aGUgUENJIGF1dG8gY29kZSB0byBsZWF2ZSB5b3VyCi0JICBCQVIgdmFsdWVzIGFsb25lLiBPdGhlcndpc2UgdGhleSB3aWxsIGJlIHVwZGF0ZWQgYXV0b21hdGljYWxseS4gSWYKLQkgIGZvciBzb21lIHJlYXNvbiwgeW91IGhhdmUgYSBib2FyZCB0aGF0IHNpbXBseSByZWZ1c2VzIHRvIHdvcmsKLQkgIHdpdGggaXRzIHJlc291cmNlcyB1cGRhdGVkIGJleW9uZCB3aGF0IHRoZXkgYXJlIHdoZW4gdGhlIGRldmljZQotCSAgaXMgcG93ZXJlZCB1cCwgc2V0IHRoaXMgdG8gTi4gRXZlcnlvbmUgZWxzZSB3aWxsIHdhbnQgdGhpcyBhcyBZLgotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL01ha2VmaWxlIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9NYWtlZmlsZQppbmRleCA4NDdlOTA4OS4uZDJmZmM0NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL01ha2VmaWxlCkBAIC0xLDkgKzEsNyBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIFBDSSBzcGVjaWZpYyBrZXJuZWwgaW50ZXJmYWNlIHJvdXRpbmVzIHVuZGVyIExpbnV4LgogIwotCiBvYmoteQkJCQkJKz0gcGNpLm8KLW9iai0kKENPTkZJR19QQ0lfQVVUTykJCQkrPSBwY2ktYXV0by5vCiAKIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpCSs9IHBjaS1zaDc3NTEubyBvcHMtc2g0Lm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQkrPSBwY2ktc2g3NzUxLm8gb3BzLXNoNC5vCkBAIC0xMiwxNSArMTAsMTcgQEAKIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCSs9IHBjaS1zaDc3ODAubyBvcHMtc2g0Lm8KIG9iai0kKENPTkZJR19DUFVfU0g1KQkJCSs9IHBjaS1zaDUubyBvcHMtc2g1Lm8KIAotb2JqLSQoQ09ORklHX1NIX0RSRUFNQ0FTVCkJCSs9IG9wcy1kcmVhbWNhc3QubyBmaXh1cHMtZHJlYW1jYXN0Lm8KLW9iai0kKENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCkJCSs9IG9wcy1zbmFwZ2Vhci5vCi1vYmotJChDT05GSUdfU0hfUlRTNzc1MVIyRCkJCSs9IG9wcy1ydHM3NzUxcjJkLm8gZml4dXBzLXJ0czc3NTFyMmQubwotb2JqLSQoQ09ORklHX1NIX1NIMDMpCQkJKz0gb3BzLXNoMDMubyBmaXh1cHMtc2gwMy5vCi1vYmotJChDT05GSUdfU0hfSElHSExBTkRFUikJCSs9IG9wcy1yNzc4MHJwLm8gZml4dXBzLXI3NzgwcnAubwotb2JqLSQoQ09ORklHX1NIX1NESzc3ODApCQkrPSBvcHMtc2RrNzc4MC5vIGZpeHVwcy1zZGs3NzgwLm8KLW9iai0kKENPTkZJR19TSF9USVRBTikJCQkrPSBvcHMtdGl0YW4ubwotb2JqLSQoQ09ORklHX1NIX0xBTkRJU0spCQkrPSBvcHMtbGFuZGlzay5vCi1vYmotJChDT05GSUdfU0hfTEJPWF9SRTIpCQkrPSBvcHMtbGJveHJlMi5vIGZpeHVwcy1sYm94cmUyLm8KLW9iai0kKENPTkZJR19TSF83NzgwX1NPTFVUSU9OX0VOR0lORSkJKz0gb3BzLXNlNzc4MC5vIGZpeHVwcy1zZTc3ODAubwotb2JqLSQoQ09ORklHX1NIX0NBWU1BTikJCQkrPSBvcHMtY2F5bWFuLm8KLW9iai0kKENPTkZJR19TSF9TSDc3ODVMQ1IpCQkrPSBvcHMtc2g3Nzg1bGNyLm8gZml4dXBzLXNoNzc4NWxjci5vCitvYmotJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJKz0gb3BzLWRyZWFtY2FzdC5vIGZpeHVwcy1kcmVhbWNhc3QubyBcCisJCQkJCSAgIHBjaS1kcmVhbWNhc3Qubworb2JqLSQoQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwKQkJKz0gZml4dXBzLXNuYXBnZWFyLm8KK29iai0kKENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSkJKz0gZml4dXBzLXNlNzc1MS5vCitvYmotJChDT05GSUdfU0hfUlRTNzc1MVIyRCkJCSs9IGZpeHVwcy1ydHM3NzUxcjJkLm8KK29iai0kKENPTkZJR19TSF9TSDAzKQkJCSs9IGZpeHVwcy1zaDAzLm8KK29iai0kKENPTkZJR19TSF9ISUdITEFOREVSKQkJKz0gZml4dXBzLXI3NzgwcnAubworb2JqLSQoQ09ORklHX1NIX1NINzc4NUxDUikJCSs9IGZpeHVwcy1yNzc4MHJwLm8KK29iai0kKENPTkZJR19TSF9TREs3NzgwKQkJKz0gZml4dXBzLXNkazc3ODAubworb2JqLSQoQ09ORklHX1NIXzc3ODBfU09MVVRJT05fRU5HSU5FKQkrPSBmaXh1cHMtc2RrNzc4MC5vCitvYmotJChDT05GSUdfU0hfVElUQU4pCQkJKz0gZml4dXBzLXRpdGFuLm8KK29iai0kKENPTkZJR19TSF9MQU5ESVNLKQkJKz0gZml4dXBzLWxhbmRpc2subworb2JqLSQoQ09ORklHX1NIX0xCT1hfUkUyKQkJKz0gZml4dXBzLXJ0czc3NTFyMmQubworb2JqLSQoQ09ORklHX1NIX0NBWU1BTikJCQkrPSBmaXh1cHMtY2F5bWFuLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtY2F5bWFuLmMKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtY2F5bWFuLmMKcmVuYW1lIHRvIGFyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWNheW1hbi5jCmluZGV4IDM4ZWY3NjIuLmI2OGI2MWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWNheW1hbi5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWNheW1hbi5jCkBAIC03NSwxNSArNzUsMyBAQAogCiAJcmV0dXJuIHJlc3VsdDsKIH0KLQotc3RydWN0IHBjaV9jaGFubmVsIGJvYXJkX3BjaV9jaGFubmVsc1tdID0gewotCXsgJnNoNV9wY2lfb3BzLCBOVUxMLCBOVUxMLCAwLCAweGZmIH0sCi0JeyBOVUxMLCBOVUxMLCBOVUxMLCAwLCAwIH0sCi19OwotRVhQT1JUX1NZTUJPTChib2FyZF9wY2lfY2hhbm5lbHMpOwotCi1pbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQotewotCXJldHVybiBzaDVwY2lfaW5pdChfX3BhKG1lbW9yeV9zdGFydCksCi0JCQkgICBfX3BhKG1lbW9yeV9lbmQpIC0gX19wYShtZW1vcnlfc3RhcnQpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWRyZWFtY2FzdC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtZHJlYW1jYXN0LmMKaW5kZXggMmJmODVjZi4uZWQ3ZjQ4OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtZHJlYW1jYXN0LmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtZHJlYW1jYXN0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IGdhcHNwY2lfZml4dXBfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IHBjaV9jaGFubmVsICpwID0gYm9hcmRfcGNpX2NoYW5uZWxzOworCXN0cnVjdCBwY2lfY2hhbm5lbCAqcCA9IGRldi0+c3lzZGF0YTsKIAogCXByaW50ayhLRVJOX05PVElDRSAiUENJOiBGaXhpbmcgdXAgZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKIApAQCAtNDEsNiArNDEsMTMgQEAKIAkJICovCiAJCWRldi0+cmVzb3VyY2VbMV0uc3RhcnQJPSBwLT5pb19yZXNvdXJjZS0+c3RhcnQgICsgMHgxMDA7CiAJCWRldi0+cmVzb3VyY2VbMV0uZW5kCT0gZGV2LT5yZXNvdXJjZVsxXS5zdGFydCArIDB4MjAwIC0gMTsKKworCQkvKgorCQkgKiBUaGlzIGlzIG5vdCBhIG5vcm1hbCBCQVIsIHByZXZlbnQgYW55IGF0dGVtcHRzIHRvIG1vdmUKKwkJICogdGhlIEJBUiwgYXMgdGhpcyB3aWxsIHJlc3VsdCBpbiBhIGJ1cyBsb2NrLgorCQkgKi8KKwkJZGV2LT5yZXNvdXJjZVsxXS5mbGFncyB8PSBJT1JFU09VUkNFX1BDSV9GSVhFRDsKKwogCQkvKgogCQkgKiBSZWRpcmVjdCBkbWEgbWVtb3J5IGFsbG9jYXRpb25zIHRvIHNwZWNpYWwgbWVtb3J5IHdpbmRvdy4KIAkJICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYW5kaXNrLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYW5kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxYTZiYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWxhbmRpc2suYwpAQCAtMCwwICsxLDM0IEBACisvKgorICogYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtbGFuZGlzay5jCisgKgorICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSS1PIERBVEEgRGV2aWNlLCBJbmMuIExBTkRJU0sgYm9hcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYga29naWlkZW5hCisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJwY2ktc2g0LmgiCisKK2ludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwkvKgorCSAqIHNsb3QwOiBwaW4xLTQgPSBpcnE1LDYsNyw4CisJICogc2xvdDE6IHBpbjEtNCA9IGlycTYsNyw4LDUKKwkgKiBzbG90MjogcGluMS00ID0gaXJxNyw4LDUsNgorCSAqIHNsb3QzOiBwaW4xLTQgPSBpcnE4LDUsNiw3CisJICovCisJaW50IGlycSA9ICgoc2xvdCArIHBpbiAtIDEpICYgMHgzKSArIDU7CisKKwlpZiAoKHNsb3QgfCAocGluIC0gMSkpID4gMHgzKSB7CisJCXByaW50aygiUENJOiBCYWQgSVJRIG1hcHBpbmcgcmVxdWVzdCBmb3Igc2xvdCAlZCBwaW4gJWNcbiIsCisJCSAgICAgICBzbG90LCBwaW4gLSAxICsgJ0EnKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gaXJxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGJveHJlMi5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGJveHJlMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzFkNDEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWxib3hyZTIuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYm94cmUyLmMKLSAqCi0gKiBMLUJPWCBSRTIgUENJIGZpeHVwcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBOb2J1aGlybyBJd2FtYXRzdQotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSAicGNpLXNoNC5oIgotCi0jZGVmaW5lIFBDSU1DUl9NUlNFVF9PRkYJMHhCRkZGRkZGRgotI2RlZmluZSBQQ0lNQ1JfUkZTSF9PRkYJCTB4RkZGRkZGRkIKLQotaW50IHBjaV9maXh1cF9wY2ljKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBiY3IxLCBtY3I7Ci0KLQliY3IxID0gY3RybF9pbmwoU0g3NzUxX0JDUjEpOwotCWJjcjEgfD0gMHg0MDA4MDAwMDsJLyogRW5hYmxlIEJpdCAxOSBCUkVRRU4sIHNldCBQQ0lDIHRvIHNsYXZlICovCi0JcGNpX3dyaXRlX3JlZyhiY3IxLCBTSDRfUENJQkNSMSk7Ci0KLQkvKiBFbmFibGUgYWxsIGludGVycnVwdHMsIHNvIHdlIGtub3duIHdoYXQgdG8gZml4ICovCi0JcGNpX3dyaXRlX3JlZygweDAwMDBjM2ZmLCBTSDRfUENJSU5UTSk7Ci0JcGNpX3dyaXRlX3JlZygweDAwMDAzODBmLCBTSDRfUENJQUlOVE0pOwotCXBjaV93cml0ZV9yZWcoMHhmYjkwMDA0NywgU0g3NzUxX1BDSUNPTkYxKTsKLQlwY2lfd3JpdGVfcmVnKDB4YWIwMDAwMDEsIFNINzc1MV9QQ0lDT05GNCk7Ci0KLQltY3IgPSBjdHJsX2lubChTSDc3NTFfTUNSKTsKLQltY3IgPSAobWNyICYgUENJTUNSX01SU0VUX09GRikgJiBQQ0lNQ1JfUkZTSF9PRkY7Ci0JcGNpX3dyaXRlX3JlZyhtY3IsIFNINF9QQ0lNQ1IpOwotCi0JcGNpX3dyaXRlX3JlZygweDBjMDAwMDAwLCBTSDc3NTFfUENJQ09ORjUpOwotCXBjaV93cml0ZV9yZWcoMHhkMDAwMDAwMCwgU0g3NzUxX1BDSUNPTkY2KTsKLQlwY2lfd3JpdGVfcmVnKDB4MGMwMDAwMDAsIFNINF9QQ0lMQVIwKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwMDAsIFNINF9QQ0lMQVIxKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcjc3ODBycC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcjc3ODBycC5jCmluZGV4IDNlMzIxZGYuLjE1Y2E2NWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXI3NzgwcnAuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1yNzc4MHJwLmMKQEAgLTExLDM1ICsxMSwyNiBAQAogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSAicGNpLXNoNC5oIgotI2luY2x1ZGUgPGFzbS9pby5oPgogCi1pbnQgcGNpX2ZpeHVwX3BjaWModm9pZCkKK3N0YXRpYyBjaGFyIGlycV90YWJbXSBfX2luaXRkYXRhID0geworCTY1LCA2NiwgNjcsIDY4LAorfTsKKworaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKLQlwY2lfd3JpdGVfcmVnKDB4MDAwMDQzZmYsIFNINF9QQ0lJTlRNKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDAwMDM4MGYsIFNINF9QQ0lBSU5UTSk7CisJcmV0dXJuIGlycV90YWJbc2xvdF07Cit9CiAKLQlwY2lfd3JpdGVfcmVnKDB4ZmJiMDAwNDcsIFNINzc4MF9QQ0lDTUQpOwotCXBjaV93cml0ZV9yZWcoMHgwMDAwMDAwMCwgU0g3NzgwX1BDSUlCQVIpOwotCi0JcGNpX3dyaXRlX3JlZygweDAwMDExOTEyLCBTSDc3ODBfUENJU1ZJRCk7Ci0JcGNpX3dyaXRlX3JlZygweDA4MDAwMDAwLCBTSDc3ODBfUENJQ1NDUjApOwotCXBjaV93cml0ZV9yZWcoMHgwMDAwMDAxYiwgU0g3NzgwX1BDSUNTQVIwKTsKLQlwY2lfd3JpdGVfcmVnKDB4ZmQwMDAwMDAsIFNINzc4MF9QQ0lDU0NSMSk7Ci0JcGNpX3dyaXRlX3JlZygweDAwMDAwMDBmLCBTSDc3ODBfUENJQ1NBUjEpOwotCi0JcGNpX3dyaXRlX3JlZygweGZkMDAwMDAwLCBTSDc3ODBfUENJTUJSMCk7Ci0JcGNpX3dyaXRlX3JlZygweDAwZmMwMDAwLCBTSDc3ODBfUENJTUJNUjApOwotCi0jaWZkZWYgQ09ORklHXzMyQklUCi0JcGNpX3dyaXRlX3JlZygweGMwMDAwMDAwLCBTSDc3ODBfUENJTUJSMik7Ci0JcGNpX3dyaXRlX3JlZygweDIwMDAwMDAwIC0gU0g3NzgwX1BDSV9JT19TSVpFLCBTSDc3ODBfUENJTUJNUjIpOwotI2VuZGlmCi0KLQkvKiBTZXQgSU9CUiBmb3Igd2luZG93cyBjb250YWluaW5nIGFyZWEgc3BlY2lmaWVkIGluIHBjaS5oICovCi0JcGNpX3dyaXRlX3JlZygoUENJQklPU19NSU5fSU8gJiB+KFNINzc4MF9QQ0lfSU9fU0laRSAtIDEpKSwKLQkJICAgICAgU0g3NzgwX1BDSUlPQlIpOwotCXBjaV93cml0ZV9yZWcoKChTSDc3ODBfUENJX0lPX1NJWkUtMSkgJiAoNzw8MTgpKSwgU0g3NzgwX1BDSUlPQk1SKTsKK2ludCBwY2lfZml4dXBfcGNpYyhzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4pCit7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweDAwMDA0M2ZmLCBTSDRfUENJSU5UTSk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweDAwMDAwMDAwLCBTSDc3ODBfUENJSUJBUik7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweDA4MDAwMDAwLCBTSDc3ODBfUENJQ1NDUjApOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHgwMDAwMDAxYiwgU0g3NzgwX1BDSUNTQVIwKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDB4ZmQwMDAwMDAsIFNINzc4MF9QQ0lDU0NSMSk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweDAwMDAwMDBmLCBTSDc3ODBfUENJQ1NBUjEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1ydHM3NzUxcjJkLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1ydHM3NzUxcjJkLmMKaW5kZXggOTA0YmNlOC4uMDUyYjM1NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcnRzNzc1MXIyZC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXJ0czc3NTFyMmQuYwpAQCAtMSw0MyArMSw2NyBAQAogLyoKICAqIGFyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXJ0czc3NTFyMmQuYwogICoKLSAqIFJUUzc3NTFSMkQgUENJIGZpeHVwcworICogUlRTNzc1MVIyRCAvIExCT1hSRTIgUENJIGZpeHVwcwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMyAgTGluZW8gdVNvbHV0aW9ucywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA0ICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIE5vYnVoaXJvIEl3YW1hdHN1CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxtYWNoL2xib3hyZTIuaD4KKyNpbmNsdWRlIDxtYWNoL3IyZC5oPgogI2luY2x1ZGUgInBjaS1zaDQuaCIKKyNpbmNsdWRlIDxhc20vbWFjaHR5cGVzLmg+CiAKICNkZWZpbmUgUENJTUNSX01SU0VUX09GRgkweEJGRkZGRkZGCiAjZGVmaW5lIFBDSU1DUl9SRlNIX09GRgkJMHhGRkZGRkZGQgogCi1pbnQgcGNpX2ZpeHVwX3BjaWModm9pZCkKK3N0YXRpYyB1OCBydHM3NzUxcjJkX2lycV90YWJbXSBfX2luaXRkYXRhID0geworCUlSUV9QQ0lfSU5UQSwKKwlJUlFfUENJX0lOVEIsCisJSVJRX1BDSV9JTlRDLAorCUlSUV9QQ0lfSU5URCwKK307CisKK3N0YXRpYyBjaGFyIGxib3hyZTJfaXJxX3RhYltdIF9faW5pdGRhdGEgPSB7CisJSVJRX0VUSDAsIElSUV9FVEgxLCBJUlFfSU5UQSwgSVJRX0lOVEQsCit9OworCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQoreworCWlmIChtYWNoX2lzX2xib3hyZTIoKSkKKwkJcmV0dXJuIGxib3hyZTJfaXJxX3RhYltzbG90XTsKKwllbHNlCisJCXJldHVybiBydHM3NzUxcjJkX2lycV90YWJbc2xvdF07Cit9CisKK2ludCBwY2lfZml4dXBfcGNpYyhzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4pCiB7CiAJdW5zaWduZWQgbG9uZyBiY3IxLCBtY3I7CiAKIAliY3IxID0gY3RybF9pbmwoU0g3NzUxX0JDUjEpOwogCWJjcjEgfD0gMHg0MDA4MDAwMDsJLyogRW5hYmxlIEJpdCAxOSBCUkVRRU4sIHNldCBQQ0lDIHRvIHNsYXZlICovCi0JcGNpX3dyaXRlX3JlZyhiY3IxLCBTSDRfUENJQkNSMSk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCBiY3IxLCBTSDRfUENJQkNSMSk7CiAKIAkvKiBFbmFibGUgYWxsIGludGVycnVwdHMsIHNvIHdlIGtub3duIHdoYXQgdG8gZml4ICovCi0JcGNpX3dyaXRlX3JlZygweDAwMDBjM2ZmLCBTSDRfUENJSU5UTSk7Ci0JcGNpX3dyaXRlX3JlZygweDAwMDAzODBmLCBTSDRfUENJQUlOVE0pOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHgwMDAwYzNmZiwgU0g0X1BDSUlOVE0pOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHgwMDAwMzgwZiwgU0g0X1BDSUFJTlRNKTsKIAotCXBjaV93cml0ZV9yZWcoMHhmYjkwMDA0NywgU0g3NzUxX1BDSUNPTkYxKTsKLQlwY2lfd3JpdGVfcmVnKDB4YWIwMDAwMDEsIFNINzc1MV9QQ0lDT05GNCk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweGZiOTAwMDQ3LCBTSDc3NTFfUENJQ09ORjEpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHhhYjAwMDAwMSwgU0g3NzUxX1BDSUNPTkY0KTsKIAogCW1jciA9IGN0cmxfaW5sKFNINzc1MV9NQ1IpOwogCW1jciA9IChtY3IgJiBQQ0lNQ1JfTVJTRVRfT0ZGKSAmIFBDSU1DUl9SRlNIX09GRjsKLQlwY2lfd3JpdGVfcmVnKG1jciwgU0g0X1BDSU1DUik7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCBtY3IsIFNINF9QQ0lNQ1IpOwogCi0JcGNpX3dyaXRlX3JlZygweDBjMDAwMDAwLCBTSDc3NTFfUENJQ09ORjUpOwotCXBjaV93cml0ZV9yZWcoMHhkMDAwMDAwMCwgU0g3NzUxX1BDSUNPTkY2KTsKLQlwY2lfd3JpdGVfcmVnKDB4MGMwMDAwMDAsIFNINF9QQ0lMQVIwKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwMDAsIFNINF9QQ0lMQVIxKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDB4MGMwMDAwMDAsIFNINzc1MV9QQ0lDT05GNSk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweGQwMDAwMDAwLCBTSDc3NTFfUENJQ09ORjYpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHgwYzAwMDAwMCwgU0g0X1BDSUxBUjApOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHgwMDAwMDAwMCwgU0g0X1BDSUxBUjEpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZGs3NzgwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZGs3NzgwLmMKaW5kZXggMmY4ODYzMC4uMjUwYjBlZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2RrNzc4MC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNkazc3ODAuYwpAQCAtNSw1NSArNSw0OCBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMyAgTGluZW8gdVNvbHV0aW9ucywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNiAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDA2ICBOb2J1aGlybyBJd2FtYXRzdQogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlICJwY2ktc2g0LmgiCi0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKLWludCBwY2lfZml4dXBfcGNpYyh2b2lkKQorLyogSURTRUwgWzE2XVsxN11bMThdWzE5XVsyMF1bMjFdWzIyXVsyM11bMjRdWzI1XVsyNl1bMjddWzI4XVsyOV1bMzBdWzMxXSAqLworc3RhdGljIGNoYXIgc2RrNzc4MF9pcnFfdGFiWzRdWzE2XSBfX2luaXRkYXRhID0geworCS8qIElOVEEgKi8KKwl7IDY1LCA2OCwgNjcsIDY4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisJLyogSU5UQiAqLworCXsgNjYsIDY1LCAtMSwgNjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKwkvKiBJTlRDICovCisJeyA2NywgNjYsIC0xLCA2NiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorCS8qIElOVEQgKi8KKwl7IDY4LCA2NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCit9OworCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewotCWN0cmxfb3V0bCgweDAwMDAwMDAxLCBTSDc3ODBfUENJX1ZDUjIpOwotCisgICAgICAgcmV0dXJuIHNkazc3ODBfaXJxX3RhYltwaW4tMV1bc2xvdF07Cit9CitpbnQgcGNpX2ZpeHVwX3BjaWMoc3RydWN0IHBjaV9jaGFubmVsICpjaGFuKQorewogCS8qIEVuYWJsZSBhbGwgaW50ZXJydXB0cywgc28gd2Uga25vdyB3aGF0IHRvIGZpeCAqLwotCXBjaV93cml0ZV9yZWcoMHgwMDAwQzNGRiwgU0g3NzgwX1BDSUlNUik7Ci0JcGNpX3dyaXRlX3JlZygweDAwMDAzODBGLCBTSDc3ODBfUENJQUlOVE0pOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHgwMDAwQzNGRiwgU0g3NzgwX1BDSUlNUik7CiAKIAkvKiBTZXQgdXAgc3RhbmRhcmQgUENJIGNvbmZpZyByZWdpc3RlcnMgKi8KLQlwY2lfd3JpdGVfcmVnKDB4RkIwMCwgU0g3NzgwX1BDSVNUQVRVUyk7Ci0JcGNpX3dyaXRlX3JlZygweDAwNDcsIFNINzc4MF9QQ0lDTUQpOwotCXBjaV93cml0ZV9yZWcoMHgwMCwgU0g3NzgwX1BDSVBJRik7Ci0JcGNpX3dyaXRlX3JlZygweDAwLCBTSDc3ODBfUENJU1VCKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDYsIFNINzc4MF9QQ0lCQ0MpOwotCXBjaV93cml0ZV9yZWcoMHgxOTEyLCBTSDc3ODBfUENJU1ZJRCk7Ci0JcGNpX3dyaXRlX3JlZygweDAwMDEsIFNINzc4MF9QQ0lTSUQpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHgwODAwMDAwMCwgU0g3NzgwX1BDSU1CQVIwKTsJLyogUENJICovCisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweDA4MDAwMDAwLCBTSDRfUENJTEFSMCk7CS8qIFNId3kgKi8KKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDB4MDdGMDAwMDEsIFNINF9QQ0lMU1IwKTsJLyogc2l6ZSAxMjhNIHcvIE1CQVIgKi8KIAotCXBjaV93cml0ZV9yZWcoMHgwODAwMDAwMCwgU0g3NzgwX1BDSU1CQVIwKTsJLyogUENJICovCi0JcGNpX3dyaXRlX3JlZygweDA4MDAwMDAwLCBTSDc3ODBfUENJTEFSMCk7CS8qIFNId3kgKi8KLQlwY2lfd3JpdGVfcmVnKDB4MDdGMDAwMDEsIFNINzc4MF9QQ0lMU1IpOwkvKiBzaXplIDEyOE0gdy8gTUJBUiAqLworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHgwMDAwMDAwMCwgU0g3NzgwX1BDSU1CQVIxKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDB4MDAwMDAwMDAsIFNINF9QQ0lMQVIxKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDB4MDAwMDAwMDAsIFNINF9QQ0lMU1IxKTsKIAotCXBjaV93cml0ZV9yZWcoMHgwMDAwMDAwMCwgU0g3NzgwX1BDSU1CQVIxKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwMDAsIFNINzc4MF9QQ0lMQVIxKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwMDAsIFNINzc4MF9QQ0lMU1IxKTsKLQotCXBjaV93cml0ZV9yZWcoMHhBQjAwMDgwMSwgU0g3NzgwX1BDSUlCQVIpOwotCi0JLyoKLQkgKiBTZXQgdGhlIE1CUiBzbyBQQ0kgYWRkcmVzcyBpcyBvbmUtdG8tb25lIHdpdGggd2luZG93LAotCSAqIG1lYW5pbmcgYWxsIGNhbGxzIGdvIHN0cmFpZ2h0IHRocm91Z2guLi4gdXNlIGlmZGVmIHRvCi0JICogY2F0Y2ggZXJyb25lb3VzIGFzc3VtcHRpb24uCi0JICovCi0JcGNpX3dyaXRlX3JlZygweEZEMDAwMDAwICwgU0g3NzgwX1BDSU1CUjApOwotCXBjaV93cml0ZV9yZWcoMHgwMEZDMDAwMCAsIFNINzc4MF9QQ0lNQk1SMCk7CS8qIDE2TSAqLwotCi0JLyogU2V0IElPQlIgZm9yIHdpbmRvdyBjb250YWluaW5nIGFyZWEgc3BlY2lmaWVkIGluIHBjaS5oICovCi0JcGNpX3dyaXRlX3JlZyhQQ0lCSU9TX01JTl9JTyAmIH4oU0g3NzgwX1BDSV9JT19TSVpFLTEpLCBTSDc3ODBfUENJSU9CUik7Ci0JcGNpX3dyaXRlX3JlZygoU0g3NzgwX1BDSV9JT19TSVpFLTEpICYgKDcgPDwgMTgpLCBTSDc3ODBfUENJSU9CTVIpOwotCi0JcGNpX3dyaXRlX3JlZygweEE1MDAwQzAxLCBTSDc3ODBfUENJQ1IpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHhBQjAwMDgwMSwgU0g3NzgwX1BDSUlCQVIpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgMHhBNTAwMEMwMSwgU0g0X1BDSUNSKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2U3NzUxLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZTc3NTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzVmYTlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2U3NzUxLmMKQEAgLTAsMCArMSwxMTEgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSAicGNpLXNoNC5oIgorCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycSh1OCBzbG90LCB1OCBwaW4pCit7CisgICAgICAgIHN3aXRjaCAoc2xvdCkgeworICAgICAgICBjYXNlIDA6IHJldHVybiAxMzsKKyAgICAgICAgY2FzZSAxOiByZXR1cm4gMTM7CS8qIEFNRCBFdGhlcm5ldCBjb250cm9sbGVyICovCisgICAgICAgIGNhc2UgMjogcmV0dXJuIC0xOworICAgICAgICBjYXNlIDM6IHJldHVybiAtMTsKKyAgICAgICAgY2FzZSA0OiByZXR1cm4gLTE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRrKCJQQ0k6IEJhZCBJUlEgbWFwcGluZyByZXF1ZXN0IGZvciBzbG90ICVkXG4iLCBzbG90KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KK30KKworI2RlZmluZSBQQ0lNQ1JfTVJTRVRfT0ZGCTB4QkZGRkZGRkYKKyNkZWZpbmUgUENJTUNSX1JGU0hfT0ZGCQkweEZGRkZGRkZCCisKKy8qCisgKiBPbmx5IGxvbmcgd29yZCBhY2Nlc3NlcyBvZiB0aGUgUENJQydzIGludGVybmFsIGxvY2FsIHJlZ2lzdGVycyBhbmQgdGhlCisgKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBmcm9tIHRoZSBDUFUgaXMgc3VwcG9ydGVkLgorICovCisjZGVmaW5lIFBDSUNfV1JJVEUoeCx2KSB3cml0ZWwoKHYpLCBQQ0lfUkVHKHgpKQorI2RlZmluZSBQQ0lDX1JFQUQoeCkgcmVhZGwoUENJX1JFRyh4KSkKKworLyoKKyAqIERlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGFuZCBpbml0aWFsaXplcyB0aGUgcGNpYywgc2V0cworICogdXAgdGhlIEJBUlMsIG1hcHMgdGhlIERSQU0gaW50byB0aGUgYWRkcmVzcyBzcGFjZSBldGMsIGV0Yy4KKyAqLworaW50IHBjaV9maXh1cF9wY2ljKHN0cnVjdCBwY2lfY2hhbm5lbCAqY2hhbikKK3sKKwl1bnNpZ25lZCBsb25nIGJjcjEsIHdjcjEsIHdjcjIsIHdjcjMsIG1jcjsKKwl1bnNpZ25lZCBzaG9ydCBiY3IyOworCisJLyoKKwkqIEluaXRpYWxpemUgdGhlIHNsYXZlIGJ1cyBjb250cm9sbGVyIG9uIHRoZSBwY2ljLiAgVGhlIHZhbHVlcyB1c2VkCisJKiBoZXJlIHNob3VsZCBub3QgYmUgaGFyZGNvZGVkLCBidXQgdGhleSBzaG91bGQgYmUgdGFrZW4gZnJvbSB0aGUgYnNjCisJKiBvbiB0aGUgcHJvY2Vzc29yLCB0byBtYWtlIHRoaXMgZnVuY3Rpb24gYXMgZ2VuZXJpYyBhcyBwb3NzaWJsZS4KKwkqIChpLmUuIEFub3RoZXIgc2JjIG1heSB1c3IgZGlmZmVyZW50IFNEUkFNIHRpbWluZyBzZXR0aW5ncyAtLSBpbiBvcmRlcgorCSogZm9yIHRoZSBwY2ljIHRvIHdvcmssIGl0cyBzZXR0aW5ncyBuZWVkIHRvIGJlIGV4YWN0bHkgdGhlIHNhbWUuKQorCSovCisJYmNyMSA9ICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKShTSDc3NTFfQkNSMSkpOworCWJjcjIgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopKFNINzc1MV9CQ1IyKSk7CisJd2NyMSA9ICgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKShTSDc3NTFfV0NSMSkpOworCXdjcjIgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nKikoU0g3NzUxX1dDUjIpKTsKKwl3Y3IzID0gKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopKFNINzc1MV9XQ1IzKSk7CisJbWNyID0gKCoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyopKFNINzc1MV9NQ1IpKTsKKworCWJjcjEgPSBiY3IxIHwgMHgwMDA4MDAwMDsgIC8qIEVuYWJsZSBCaXQgMTksIEJSRVFFTiAqLworCSgqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKShTSDc3NTFfQkNSMSkpID0gYmNyMTsKKworCWJjcjEgPSBiY3IxIHwgMHg0MDA4MDAwMDsgIC8qIEVuYWJsZSBCaXQgMTkgQlJFUUVOLCBzZXQgUENJQyB0byBzbGF2ZSAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUJDUjEsIGJjcjEpOwkgLyogUENJQyBCQ1IxICovCisJUENJQ19XUklURShTSDc3NTFfUENJQkNSMiwgYmNyMik7ICAgICAvKiBQQ0lDIEJDUjIgKi8KKwlQQ0lDX1dSSVRFKFNINzc1MV9QQ0lXQ1IxLCB3Y3IxKTsgICAgIC8qIFBDSUMgV0NSMSAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSVdDUjIsIHdjcjIpOyAgICAgLyogUENJQyBXQ1IyICovCisJUENJQ19XUklURShTSDc3NTFfUENJV0NSMywgd2NyMyk7ICAgICAvKiBQQ0lDIFdDUjMgKi8KKwltY3IgPSAobWNyICYgUENJTUNSX01SU0VUX09GRikgJiBQQ0lNQ1JfUkZTSF9PRkY7CisJUENJQ19XUklURShTSDc3NTFfUENJTUNSLCBtY3IpOyAgICAgIC8qIFBDSUMgTUNSICovCisKKworCS8qIEVuYWJsZSBhbGwgaW50ZXJydXB0cywgc28gd2Uga25vdyB3aGF0IHRvIGZpeCAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUlOVE0sIDB4MDAwMGMzZmYpOworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUFJTlRNLCAweDAwMDAzODBmKTsKKworCS8qIFNldCB1cCBzdGFuZGFyZCBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUNPTkYxLAkweEYzOTAwMEM3KTsgLyogQnVzIE1hc3RlciwgTWVtICYgSS9PIGFjY2VzcyAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUNPTkYyLAkweDAwMDAwMDAwKTsgLyogUENJIENsYXNzIGNvZGUgJiBSZXZpc2lvbiBJRCAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUNPTkY0LAkweGFiMDAwMDAxKTsgLyogUENJIEkvTyBhZGRyZXNzIChsb2NhbCByZWdzKSAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUNPTkY1LAkweDBjMDAwMDAwKTsgLyogUENJIE1FTSBhZGRyZXNzIChsb2NhbCBSQU0pICAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUNPTkY2LAkweGQwMDAwMDAwKTsgLyogUENJIE1FTSBhZGRyZXNzICh1bnVzZWQpICAgICAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUNPTkYxMSwgMHgzNTA1MTA1NCk7IC8qIFBDSSBTdWJzeXN0ZW0gSUQgJiBWZW5kb3IgSUQgKi8KKwlQQ0lDX1dSSVRFKFNINzc1MV9QQ0lMU1IwLCAweDAzZjAwMDAwKTsgICAvKiBNRU0gKGZ1bGwgNjRNIGV4cG9zZWQpICAgICAgICovCisJUENJQ19XUklURShTSDc3NTFfUENJTFNSMSwgMHgwMDAwMDAwMCk7ICAgLyogTUVNICh1bnVzZWQpICAgICAgICAgICAgICAgICAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUxBUjAsIDB4MGMwMDAwMDApOyAgIC8qIE1FTSAoZGlyZWN0IG1hcCBmcm9tIFBDSSkgICAgKi8KKwlQQ0lDX1dSSVRFKFNINzc1MV9QQ0lMQVIxLCAweDAwMDAwMDAwKTsgICAvKiBNRU0gKHVudXNlZCkgICAgICAgICAgICAgICAgICovCisKKwkvKiBOb3cgdHVybiBpdCBvbi4uLiAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUNSLCAweGE1MDAwMDAxKTsKKworCS8qCisJKiBTZXQgUENJTUJSIGFuZCBQQ0lJT0JSIGhlcmUsIGFzc3VtaW5nIGEgc2luZ2xlIHdpbmRvdworCSogKDE2TSBNRU0sIDI1NksgSU8pIGlzIGVub3VnaC4gIElmIGEgbGFyZ2VyIHNwYWNlIGlzCisJKiBuZWVkZWQsIHRoZSByZWFkeC93cml0ZXggYW5kIGlueC9vdXR4IGZ1bmN0aW9ucyB3aWxsCisJKiBoYXZlIHRvIGRvIG1vcmUgKGUuZy4gc2V0dGluZyByZWdpc3RlcnMgZm9yIGVhY2ggY2FsbCkuCisJKi8KKworCS8qCisJKiBTZXQgdGhlIE1CUiBzbyBQQ0kgYWRkcmVzcyBpcyBvbmUtdG8tb25lIHdpdGggd2luZG93LAorCSogbWVhbmluZyBhbGwgY2FsbHMgZ28gc3RyYWlnaHQgdGhyb3VnaC4uLiB1c2UgQlVHX09OIHRvCisJKiBjYXRjaCBlcnJvbmVvdXMgYXNzdW1wdGlvbi4KKwkqLworCUJVR19PTihjaGFuLT5tZW1fcmVzb3VyY2UtPnN0YXJ0ICE9IFNINzc1MV9QQ0lfTUVNT1JZX0JBU0UpOworCisJUENJQ19XUklURShTSDc3NTFfUENJTUJSLCBjaGFuLT5tZW1fcmVzb3VyY2UtPnN0YXJ0KTsKKworCS8qIFNldCBJT0JSIGZvciB3aW5kb3cgY29udGFpbmluZyBhcmVhIHNwZWNpZmllZCBpbiBwY2kuaCAqLworCVBDSUNfV1JJVEUoU0g3NzUxX1BDSUlPQlIsIChjaGFuLT5pb19yZXNvdXJjZS0+c3RhcnQgJiBTSDc3NTFfUENJSU9CUl9NQVNLKSk7CisKKwkvKiBBbGwgZG9uZSwgbWF5IGFzIHdlbGwgc2F5IHNvLi4uICovCisJcHJpbnRrKCJTSDc3NTEgUENJOiBGaW5pc2hlZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgUENJIGNvbnRyb2xsZXJcbiIpOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZTc3ODAuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc4MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODBjZWExLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc4MC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIGFyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc4MC5jCi0gKgotICogSElUQUNISSBVTCBTb2x1dGlvbiBFbmdpbmUgNzc4MCAgUENJIGZpeHVwcwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMyAgTGluZW8gdVNvbHV0aW9ucywgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNiAgUGF1bCBNdW5kdAotICogQ29weXJpZ2h0IChDKSAyMDA2ICBOb2J1aGlybyBJd2FtYXRzdQotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSAicGNpLXNoNC5oIgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi1pbnQgcGNpX2ZpeHVwX3BjaWModm9pZCkKLXsKLQljdHJsX291dGwoMHgwMDAwMDAwMSwgU0g3NzgwX1BDSV9WQ1IyKTsKLQotCS8qIEVuYWJsZSBhbGwgaW50ZXJydXB0cywgc28gd2Uga25vdyB3aGF0IHRvIGZpeCAqLwotCXBjaV93cml0ZV9yZWcoMHgwMDAwQzNGRiwgU0g3NzgwX1BDSUlNUik7Ci0JcGNpX3dyaXRlX3JlZygweDAwMDAzODBGLCBTSDc3ODBfUENJQUlOVE0pOwotCi0JLyogU2V0IHVwIHN0YW5kYXJkIFBDSSBjb25maWcgcmVnaXN0ZXJzICovCi0JY3RybF9vdXR3KDB4RkIwMCwgUENJX1JFRyhTSDc3ODBfUENJU1RBVFVTKSk7Ci0JY3RybF9vdXR3KDB4MDA0NywgUENJX1JFRyhTSDc3ODBfUENJQ01EKSk7Ci0JY3RybF9vdXRiKCAgMHgwMCwgUENJX1JFRyhTSDc3ODBfUENJUElGKSk7Ci0JY3RybF9vdXRiKCAgMHgwMCwgUENJX1JFRyhTSDc3ODBfUENJU1VCKSk7Ci0JY3RybF9vdXRiKCAgMHgwNiwgUENJX1JFRyhTSDc3ODBfUENJQkNDKSk7Ci0JY3RybF9vdXR3KDB4MTkxMiwgUENJX1JFRyhTSDc3ODBfUENJU1ZJRCkpOwotCWN0cmxfb3V0dygweDAwMDEsIFBDSV9SRUcoU0g3NzgwX1BDSVNJRCkpOwotCi0JcGNpX3dyaXRlX3JlZygweDA4MDAwMDAwLCBTSDc3ODBfUENJTUJBUjApOyAgICAgLyogUENJICovCi0JcGNpX3dyaXRlX3JlZygweDA4MDAwMDAwLCBTSDc3ODBfUENJTEFSMCk7ICAgICAvKiBTSHd5ICovCi0JcGNpX3dyaXRlX3JlZygweDA3RjAwMDAxLCBTSDc3ODBfUENJTFNSKTsgICAgICAvKiBzaXplIDEyOE0gdy8gTUJBUiAqLwotCi0JcGNpX3dyaXRlX3JlZygweDAwMDAwMDAwLCBTSDc3ODBfUENJTUJBUjEpOwotCXBjaV93cml0ZV9yZWcoMHgwMDAwMDAwMCwgU0g3NzgwX1BDSUxBUjEpOwotCXBjaV93cml0ZV9yZWcoMHgwMDAwMDAwMCwgU0g3NzgwX1BDSUxTUjEpOwotCi0JcGNpX3dyaXRlX3JlZygweEFCMDAwODAxLCBTSDc3ODBfUENJSUJBUik7Ci0KLQkvKgotCSAqIFNldCB0aGUgTUJSIHNvIFBDSSBhZGRyZXNzIGlzIG9uZS10by1vbmUgd2l0aCB3aW5kb3csCi0JICogbWVhbmluZyBhbGwgY2FsbHMgZ28gc3RyYWlnaHQgdGhyb3VnaC4uLiB1c2UgaWZkZWYgdG8KLQkgKiBjYXRjaCBlcnJvbmVvdXMgYXNzdW1wdGlvbi4KLQkgKi8KLQlwY2lfd3JpdGVfcmVnKDB4RkQwMDAwMDAgLCBTSDc3ODBfUENJTUJSMCk7Ci0JcGNpX3dyaXRlX3JlZygweDAwRkMwMDAwICwgU0g3NzgwX1BDSU1CTVIwKTsgICAgLyogMTZNICovCi0KLQkvKiBTZXQgSU9CUiBmb3Igd2luZG93IGNvbnRhaW5pbmcgYXJlYSBzcGVjaWZpZWQgaW4gcGNpLmggKi8KLQlwY2lfd3JpdGVfcmVnKFBDSUJJT1NfTUlOX0lPICYgfihTSDc3ODBfUENJX0lPX1NJWkUtMSksIFNINzc4MF9QQ0lJT0JSKTsKLQlwY2lfd3JpdGVfcmVnKChTSDc3ODBfUENJX0lPX1NJWkUtMSkgJiAoNyA8PCAxOCksIFNINzc4MF9QQ0lJT0JNUik7Ci0KLQlwY2lfd3JpdGVfcmVnKDB4QTUwMDBDMDEsIFNINzc4MF9QQ0lDUik7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNoNzc4NWxjci5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2g3Nzg1bGNyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NDllNjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2g3Nzg1bGNyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2g3Nzg1bGNyLmMKLSAqCi0gKiBSMFA3Nzg1TEMwMDExUkwgUENJIGZpeHVwcwotICogQ29weXJpZ2h0IChDKSAyMDA4ICBZb3NoaWhpcm8gU2hpbW9kYQotICoKLSAqIEJhc2VkIG9uIGFyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXI3NzgwcnAuYwotICogQ29weXJpZ2h0IChDKSAyMDAzICBMaW5lbyB1U29sdXRpb25zLCBJbmMuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA2ICBQYXVsIE11bmR0Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlICJwY2ktc2g0LmgiCi0KLWludCBwY2lfZml4dXBfcGNpYyh2b2lkKQotewotCXBjaV93cml0ZV9yZWcoMHgwMDAwNDNmZiwgU0g0X1BDSUlOVE0pOwotCXBjaV93cml0ZV9yZWcoMHgwMDAwMzgwZiwgU0g0X1BDSUFJTlRNKTsKLQotCXBjaV93cml0ZV9yZWcoMHhmYmIwMDA0NywgU0g3NzgwX1BDSUNNRCk7Ci0JcGNpX3dyaXRlX3JlZygweDAwMDAwMDAwLCBTSDc3ODBfUENJSUJBUik7Ci0KLQlwY2lfd3JpdGVfcmVnKDB4MDAwMTE5MTIsIFNINzc4MF9QQ0lTVklEKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDgwMDAwMDAsIFNINzc4MF9QQ0lDU0NSMCk7Ci0JcGNpX3dyaXRlX3JlZygweDAwMDAwMDFiLCBTSDc3ODBfUENJQ1NBUjApOwotCXBjaV93cml0ZV9yZWcoMHhmZDAwMDAwMCwgU0g3NzgwX1BDSUNTQ1IxKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwMGYsIFNINzc4MF9QQ0lDU0FSMSk7Ci0KLQlwY2lfd3JpdGVfcmVnKDB4ZmQwMDAwMDAsIFNINzc4MF9QQ0lNQlIwKTsKLQlwY2lfd3JpdGVfcmVnKDB4MDBmYzAwMDAsIFNINzc4MF9QQ0lNQk1SMCk7Ci0KLSNpZmRlZiBDT05GSUdfMzJCSVQKLQlwY2lfd3JpdGVfcmVnKDB4YzAwMDAwMDAsIFNINzc4MF9QQ0lNQlIyKTsKLQlwY2lfd3JpdGVfcmVnKDB4MjAwMDAwMDAgLSBTSDc3ODBfUENJX0lPX1NJWkUsIFNINzc4MF9QQ0lNQk1SMik7Ci0jZW5kaWYKLQotCS8qIFNldCBJT0JSIGZvciB3aW5kb3dzIGNvbnRhaW5pbmcgYXJlYSBzcGVjaWZpZWQgaW4gcGNpLmggKi8KLQlwY2lfd3JpdGVfcmVnKChQQ0lCSU9TX01JTl9JTyAmIH4oU0g3NzgwX1BDSV9JT19TSVpFIC0gMSkpLAotCQkgICAgICBTSDc3ODBfUENJSU9CUik7Ci0JcGNpX3dyaXRlX3JlZygoKFNINzc4MF9QQ0lfSU9fU0laRSAtIDEpICYgKDcgPDwgMTgpKSwgU0g3NzgwX1BDSUlPQk1SKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc25hcGdlYXIuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNuYXBnZWFyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEzOWVjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNuYXBnZWFyLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGFyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNuYXBnZWFyLmMKKyAqCisgKiBBdXRob3I6ICBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgorICoKKyAqIFBvcnRlZCB0byBuZXcgQVBJIGJ5IFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+CisgKgorICogSGlnaGx5IGxldmVyYWdlZCBmcm9tIHBjaS1iaWdzdXIuYywgd3JpdHRlbiBieSBEdXN0aW4gTWNJbnRpcmUuCisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFBDSSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIFNuYXBHZWFyIGJvYXJkcworICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAicGNpLXNoNC5oIgorCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQoreworCWludCBpcnEgPSAtMTsKKworCXN3aXRjaCAoc2xvdCkgeworCWNhc2UgODogIC8qIHRoZSBQQ0kgYnJpZGdlICovIGJyZWFrOworCWNhc2UgMTE6IGlycSA9IDg7ICBicmVhazsgLyogVVNCICAgICovCisJY2FzZSAxMjogaXJxID0gMTE7IGJyZWFrOyAvKiBQQ01DSUEgKi8KKwljYXNlIDEzOiBpcnEgPSA1OyAgYnJlYWs7IC8qIGV0aDAgICAqLworCWNhc2UgMTQ6IGlycSA9IDg7ICBicmVhazsgLyogZXRoMSAgICovCisJY2FzZSAxNTogaXJxID0gMTE7IGJyZWFrOyAvKiBzYWZlbmV0ICh1bnVzZWQpICovCisJfQorCisJcHJpbnRrKCJQQ0k6IE1hcHBpbmcgU25hcEdlYXIgSVJRIGZvciBzbG90ICVkLCBwaW4gJWMgdG8gaXJxICVkXG4iLAorCSAgICAgICBzbG90LCBwaW4gLSAxICsgJ0EnLCBpcnEpOworCisJcmV0dXJuIGlycTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXRpdGFuLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy10aXRhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzlmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy10aXRhbi5jCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBhcmNoL3NoL2RyaXZlcnMvcGNpL29wcy10aXRhbi5jCisgKgorICogUG9ydGVkIHRvIG5ldyBBUEkgYnkgUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KKyAqCisgKiBNb2RpZmllZCBmcm9tIG9wcy1zbmFwZ2Vhci5jIHdyaXR0ZW4gYnkgIERhdmlkIE1jQ3VsbG91Z2gKKyAqIEhpZ2hseSBsZXZlcmFnZWQgZnJvbSBwY2ktYmlnc3VyLmMsIHdyaXR0ZW4gYnkgRHVzdGluIE1jSW50aXJlLgorICoKKyAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBQQ0kgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBUaXRhbiBib2FyZHMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bWFjaC90aXRhbi5oPgorI2luY2x1ZGUgInBjaS1zaDQuaCIKKworc3RhdGljIGNoYXIgdGl0YW5faXJxX3RhYltdIF9faW5pdGRhdGEgPSB7CisJVElUQU5fSVJRX1dBTiwKKwlUSVRBTl9JUlFfTEFOLAorCVRJVEFOX0lSUV9NUENJQSwKKwlUSVRBTl9JUlFfTVBDSUIsCisJVElUQU5fSVJRX1VTQiwKK307CisKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaW50IGlycSA9IHRpdGFuX2lycV90YWJbc2xvdF07CisKKwlwcmludGsoIlBDSTogTWFwcGluZyBUSVRBTiBJUlEgZm9yIHNsb3QgJWQsIHBpbiAlYyB0byBpcnEgJWRcbiIsCisJCXNsb3QsIHBpbiAtIDEgKyAnQScsIGlycSk7CisKKwlyZXR1cm4gaXJxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtZHJlYW1jYXN0LmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1kcmVhbWNhc3QuYwppbmRleCBmNWQyYTJhLi5lODNkMGQzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1kcmVhbWNhc3QuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1kcmVhbWNhc3QuYwpAQCAtMSwxNSArMSw5IEBACiAvKgotICogYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtZHJlYW1jYXN0LmMKLSAqCiAgKiBQQ0kgb3BlcmF0aW9ucyBmb3IgdGhlIFNlZ2EgRHJlYW1jYXN0CiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyICBNLiBSLiBCcm93bgogICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBQYXVsIE11bmR0CiAgKgotICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgYm9yZSB0aGUgbWVzc2FnZSAod2l0aCBlbmNsb3NlZC0kKToKLSAqCUlkOiBwY2kuYyx2IDEuMyAyMDAzLzA1LzA0IDE5OjI5OjQ2IGxldGhhbCBFeHAKLSAqCURyZWFtY2FzdCBQQ0k6IFN1cHBvcnRzIFNFR0EgQnJvYWRiYW5kIEFkYXB0b3Igb25seS4KLSAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KQEAgLTIzLDM0ICsxNywxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9wY2kuaD4KIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnYXBzcGNpX2lvX3Jlc291cmNlID0gewotCS5uYW1lCT0gIkdBUFNQQ0kgSU8iLAotCS5zdGFydAk9IEdBUFNQQ0lfQkJBX0NPTkZJRywKLQkuZW5kCT0gR0FQU1BDSV9CQkFfQ09ORklHICsgR0FQU1BDSV9CQkFfQ09ORklHX1NJWkUgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGdhcHNwY2lfbWVtX3Jlc291cmNlID0gewotCS5uYW1lCT0gIkdBUFNQQ0kgbWVtIiwKLQkuc3RhcnQJPSBHQVBTUENJX0RNQV9CQVNFLAotCS5lbmQJPSBHQVBTUENJX0RNQV9CQVNFICsgR0FQU1BDSV9ETUFfU0laRSAtIDEsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9vcHMgZ2Fwc3BjaV9wY2lfb3BzOwotCi1zdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7Ci0JeyAmZ2Fwc3BjaV9wY2lfb3BzLCAmZ2Fwc3BjaV9pb19yZXNvdXJjZSwKLQkgICZnYXBzcGNpX21lbV9yZXNvdXJjZSwgMCwgMSB9LAotCXsgMCwgfQotfTsKLUVYUE9SVF9TWU1CT0woYm9hcmRfcGNpX2NoYW5uZWxzKTsKLQogLyoKICAqIFRoZSAhZ2Fwc3BjaV9jb25maWdfYWNjZXNzIGNhc2UgcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4sIGV2ZXIsIHVubGVzcwogICogc29tZW9uZSBpbXBsaWNpdGx5IG1lc3NlcyBhcm91bmQgd2l0aCB0aGUgbGFzdCBkZXZmbiB2YWx1ZS4uIG90aGVyd2lzZSB3ZQpAQCAtODUsMTAgKzU1LDEwIEBACiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAlzd2l0Y2ggKHNpemUpIHsKLQkJY2FzZSAxOiAqdmFsID0gaW5iKEdBUFNQQ0lfQkJBX0NPTkZJRyt3aGVyZSk7IGJyZWFrOwotCQljYXNlIDI6ICp2YWwgPSBpbncoR0FQU1BDSV9CQkFfQ09ORklHK3doZXJlKTsgYnJlYWs7Ci0JCWNhc2UgNDogKnZhbCA9IGlubChHQVBTUENJX0JCQV9DT05GSUcrd2hlcmUpOyBicmVhazsKLQl9CQorCWNhc2UgMTogKnZhbCA9IGluYihHQVBTUENJX0JCQV9DT05GSUcrd2hlcmUpOyBicmVhazsKKwljYXNlIDI6ICp2YWwgPSBpbncoR0FQU1BDSV9CQkFfQ09ORklHK3doZXJlKTsgYnJlYWs7CisJY2FzZSA0OiAqdmFsID0gaW5sKEdBUFNQQ0lfQkJBX0NPTkZJRyt3aGVyZSk7IGJyZWFrOworCX0KIAogICAgICAgICByZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwogfQpAQCAtOTksNzIgKzY5LDE1IEBACiAJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CiAKIAlzd2l0Y2ggKHNpemUpIHsKLQkJY2FzZSAxOiBvdXRiKCggdTgpdmFsLCBHQVBTUENJX0JCQV9DT05GSUcrd2hlcmUpOyBicmVhazsKLQkJY2FzZSAyOiBvdXR3KCh1MTYpdmFsLCBHQVBTUENJX0JCQV9DT05GSUcrd2hlcmUpOyBicmVhazsKLQkJY2FzZSA0OiBvdXRsKCh1MzIpdmFsLCBHQVBTUENJX0JCQV9DT05GSUcrd2hlcmUpOyBicmVhazsKKwljYXNlIDE6IG91dGIoKCB1OCl2YWwsIEdBUFNQQ0lfQkJBX0NPTkZJRyt3aGVyZSk7IGJyZWFrOworCWNhc2UgMjogb3V0dygodTE2KXZhbCwgR0FQU1BDSV9CQkFfQ09ORklHK3doZXJlKTsgYnJlYWs7CisJY2FzZSA0OiBvdXRsKCh1MzIpdmFsLCBHQVBTUENJX0JCQV9DT05GSUcrd2hlcmUpOyBicmVhazsKIAl9CiAKICAgICAgICAgcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKIH0KIAotc3RhdGljIHN0cnVjdCBwY2lfb3BzIGdhcHNwY2lfcGNpX29wcyA9IHsKK3N0cnVjdCBwY2lfb3BzIGdhcHNwY2lfcGNpX29wcyA9IHsKIAkucmVhZAk9IGdhcHNwY2lfcmVhZCwKIAkud3JpdGUJPSBnYXBzcGNpX3dyaXRlLAogfTsKLQotLyoKLSAqIGdhcHNwY2kgaW5pdAotICovCi0KLWludCBfX2luaXQgZ2Fwc3BjaV9pbml0KHZvaWQpCi17Ci0JY2hhciBpZGJ1ZlsxNl07Ci0JaW50IGk7Ci0KLQkvKgotCSAqIEZJWE1FOiBBbGwgb2YgdGhpcyB3YW50cyBkb2N1bWVudGluZyB0byBzb21lIGRlZ3JlZSwKLQkgKiBldmVuIHNvbWUgYmFzaWMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgd291bGQgYmUgbmljZS4KLQkgKgotCSAqIEkgaGF2ZW4ndCBzZWVuIGFueXRoaW5nIHRoaXMgdWdseSBzaW5jZS4uIG1hcGxlLgotCSAqLwotCi0JZm9yIChpPTA7IGk8MTY7IGkrKykKLQkJaWRidWZbaV0gPSBpbmIoR0FQU1BDSV9SRUdTK2kpOwotCi0JaWYgKHN0cm5jbXAoaWRidWYsICJHQVBTUENJX0JSSURHRV8yIiwgMTYpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCW91dGwoMHg1YTE0YTUwMSwgR0FQU1BDSV9SRUdTKzB4MTgpOwotCi0JZm9yIChpPTA7IGk8MTAwMDAwMDsgaSsrKQotCQk7Ci0KLQlpZiAoaW5sKEdBUFNQQ0lfUkVHUysweDE4KSAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW91dGwoMHgwMTAwMDAwMCwgR0FQU1BDSV9SRUdTKzB4MjApOwotCW91dGwoMHgwMTAwMDAwMCwgR0FQU1BDSV9SRUdTKzB4MjQpOwotCi0Jb3V0bChHQVBTUENJX0RNQV9CQVNFLCBHQVBTUENJX1JFR1MrMHgyOCk7Ci0Jb3V0bChHQVBTUENJX0RNQV9CQVNFK0dBUFNQQ0lfRE1BX1NJWkUsIEdBUFNQQ0lfUkVHUysweDJjKTsKLQotCW91dGwoMSwgR0FQU1BDSV9SRUdTKzB4MTQpOwotCW91dGwoMSwgR0FQU1BDSV9SRUdTKzB4MzQpOwotCi0JLyogU2V0dGluZyBCcm9hZGJhbmQgQWRhcHRlciAqLwotCW91dHcoMHhmOTAwLCBHQVBTUENJX0JCQV9DT05GSUcrMHgwNik7Ci0Jb3V0bCgweDAwMDAwMDAwLCBHQVBTUENJX0JCQV9DT05GSUcrMHgzMCk7Ci0Jb3V0YigweDAwLCBHQVBTUENJX0JCQV9DT05GSUcrMHgzYyk7Ci0Jb3V0YigweGYwLCBHQVBTUENJX0JCQV9DT05GSUcrMHgwZCk7Ci0Jb3V0dygweDAwMDYsIEdBUFNQQ0lfQkJBX0NPTkZJRysweDA0KTsKLQlvdXRsKDB4MDAwMDIwMDEsIEdBUFNQQ0lfQkJBX0NPTkZJRysweDEwKTsKLQlvdXRsKDB4MDEwMDAwMDAsIEdBUFNQQ0lfQkJBX0NPTkZJRysweDE0KTsKLQotCXJldHVybiAwOwotfQotCi0vKiBIYXZlbid0IGRvbmUgYW55dGhpbmcgaGVyZSBhcyB5ZXQgKi8KLWNoYXIgKiBfX2RldmluaXQgcGNpYmlvc19zZXR1cChjaGFyICpzdHIpCi17Ci0JcmV0dXJuIHN0cjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWxhbmRpc2suYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWxhbmRpc2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmMDllYy4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1sYW5kaXNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtbGFuZGlzay5jCi0gKgotICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSS1PIERBVEEgRGV2aWNlLCBJbmMuIExBTkRJU0sgYm9hcmQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYga29naWlkZW5hCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlICJwY2ktc2g0LmgiCi0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3NzUxX2lvX3Jlc291cmNlID0gewotCS5uYW1lID0gIlNINzc1MSBJTyIsCi0JLnN0YXJ0ID0gU0g3NzUxX1BDSV9JT19CQVNFLAotCS5lbmQgPSBTSDc3NTFfUENJX0lPX0JBU0UgKyBTSDc3NTFfUENJX0lPX1NJWkUgLSAxLAotCS5mbGFncyA9IElPUkVTT1VSQ0VfSU8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3NzUxX21lbV9yZXNvdXJjZSA9IHsKLQkubmFtZSA9ICJTSDc3NTEgbWVtIiwKLQkuc3RhcnQgPSBTSDc3NTFfUENJX01FTU9SWV9CQVNFLAotCS5lbmQgPSBTSDc3NTFfUENJX01FTU9SWV9CQVNFICsgU0g3NzUxX1BDSV9NRU1fU0laRSAtIDEsCi0JLmZsYWdzID0gSU9SRVNPVVJDRV9NRU0KLX07Ci0KLXN0cnVjdCBwY2lfY2hhbm5lbCBib2FyZF9wY2lfY2hhbm5lbHNbXSA9IHsKLQl7JnNoNF9wY2lfb3BzLCAmc2g3NzUxX2lvX3Jlc291cmNlLCAmc2g3NzUxX21lbV9yZXNvdXJjZSwgMCwgMHgzZmZ9LAotCXtOVUxMLCBOVUxMLCBOVUxMLCAwLCAwfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX21hcCBzaDc3NTFfcGNpX21hcCA9IHsKLQkud2luZG93MCA9IHsKLQkJLmJhc2UJPSBTSDc3NTFfQ1MzX0JBU0VfQUREUiwKLQkJLnNpemUJPSAoNjQgPDwgMjApLAkvKiA2NE1CICovCi0JfSwKLQotCS5mbGFncyA9IFNINF9QQ0lDX05PX1JFU0VULAotfTsKLQotaW50IF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCkKLXsKLQlyZXR1cm4gc2g3NzUxX3BjaWNfaW5pdCgmc2g3NzUxX3BjaV9tYXApOwotfQotCi1pbnQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JLyoKLQkgKiBzbG90MDogcGluMS00ID0gaXJxNSw2LDcsOAotCSAqIHNsb3QxOiBwaW4xLTQgPSBpcnE2LDcsOCw1Ci0JICogc2xvdDI6IHBpbjEtNCA9IGlycTcsOCw1LDYKLQkgKiBzbG90MzogcGluMS00ID0gaXJxOCw1LDYsNwotCSAqLwotCWludCBpcnEgPSAoKHNsb3QgKyBwaW4gLSAxKSAmIDB4MykgKyA1OwotCi0JaWYgKChzbG90IHwgKHBpbiAtIDEpKSA+IDB4MykgewotCQlwcmludGsoIlBDSTogQmFkIElSUSBtYXBwaW5nIHJlcXVlc3QgZm9yIHNsb3QgJWQgcGluICVjXG4iLAotCQkgICAgICAgc2xvdCwgcGluIC0gMSArICdBJyk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmV0dXJuIGlycTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWxib3hyZTIuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWxib3hyZTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjMGI2Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1sYm94cmUyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtbGJveHJlMi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA3IE5vYnVoaXJvIEl3YW1hdHN1Ci0gKgotICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgTlRUIENPTVdBUkUgTC1CT1ggUkUyCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPG1hY2gvbGJveHJlMi5oPgotI2luY2x1ZGUgInBjaS1zaDQuaCIKLQotc3RhdGljIGNoYXIgbGJveHJlMl9pcnFfdGFiW10gX19pbml0ZGF0YSA9IHsKLQlJUlFfRVRIMCwgSVJRX0VUSDEsIElSUV9JTlRBLCBJUlFfSU5URCwKLX07Ci0KLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JcmV0dXJuIGxib3hyZTJfaXJxX3RhYltzbG90XTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3NTFfaW9fcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiU0g3NzUxX0lPIiwKLQkuc3RhcnQJPSBTSDc3NTFfUENJX0lPX0JBU0UgLAotCS5lbmQJPSBTSDc3NTFfUENJX0lPX0JBU0UgKyBTSDc3NTFfUENJX0lPX1NJWkUgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3NzUxX21lbV9yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJTSDc3NTFfbWVtIiwKLQkuc3RhcnQJPSBTSDc3NTFfUENJX01FTU9SWV9CQVNFLAotCS5lbmQJPSBTSDc3NTFfUENJX01FTU9SWV9CQVNFICsgU0g3NzUxX1BDSV9NRU1fU0laRSAtIDEsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KLX07Ci0KLWV4dGVybiBzdHJ1Y3QgcGNpX29wcyBzaDc3NTFfcGNpX29wczsKLQotc3RydWN0IHBjaV9jaGFubmVsIGJvYXJkX3BjaV9jaGFubmVsc1tdID0gewotCXsgJnNoNF9wY2lfb3BzLCAmc2g3NzUxX2lvX3Jlc291cmNlLCAmc2g3NzUxX21lbV9yZXNvdXJjZSwgMCwgMHhmZiB9LAotCXsgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCB9LAotfTsKLQotRVhQT1JUX1NZTUJPTChib2FyZF9wY2lfY2hhbm5lbHMpOwotCi1zdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7Ci0JLndpbmRvdzAJPSB7Ci0JCS5iYXNlCT0gU0g3NzUxX0NTM19CQVNFX0FERFIsCi0JCS5zaXplCT0gMHgwNDAwMDAwMCwKLQl9LAotCS53aW5kb3cxCT0gewotCQkuYmFzZQk9IDB4MDAwMDAwMDAsCS8qIFVudXNlZCAqLwotCQkuc2l6ZQk9IDB4MDAwMDAwMDAsCS8qIFVudXNlZCAqLwotCX0sCi0JLmZsYWdzCT0gU0g0X1BDSUNfTk9fUkVTRVQsCi19OwotCi1pbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQotewotCXJldHVybiBzaDc3NTFfcGNpY19pbml0KCZzaDc3NTFfcGNpX21hcCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1yNzc4MHJwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1yNzc4MHJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NTUyMzguLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcjc3ODBycC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIEF1dGhvcjogIElhbiBEYVNpbHZhIChpZGFzaWx2YUBtdmlzdGEuY29tKQotICoKLSAqIEhpZ2hseSBsZXZlcmFnZWQgZnJvbSBwY2ktYmlnc3VyLmMsIHdyaXR0ZW4gYnkgRHVzdGluIE1jSW50aXJlLgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBQQ0kgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBSZW5lc2FzIFNINzc4MCBIaWdobGFuZGVyIFI3NzgwUlAtMSBib2FyZAotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxtYWNoL2hpZ2hsYW5kZXIuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlICJwY2ktc2g0LmgiCi0KLXN0YXRpYyBjaGFyIGlycV90YWJbXSBfX2luaXRkYXRhID0gewotCTY1LCA2NiwgNjcsIDY4LAotfTsKLQotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlyZXR1cm4gaXJxX3RhYltzbG90XTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3ODBfaW9fcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiU0g3NzgwX0lPIiwKLQkuc3RhcnQJPSBTSDc3ODBfUENJX0lPX0JBU0UsCi0JLmVuZAk9IFNINzc4MF9QQ0lfSU9fQkFTRSArIFNINzc4MF9QQ0lfSU9fU0laRSAtIDEsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9JTwotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3ODBfbWVtX3Jlc291cmNlID0gewotCS5uYW1lCT0gIlNINzc4MF9tZW0iLAotCS5zdGFydAk9IFNINzc4MF9QQ0lfTUVNT1JZX0JBU0UsCi0JLmVuZAk9IFNINzc4MF9QQ0lfTUVNT1JZX0JBU0UgKyBTSDc3ODBfUENJX01FTV9TSVpFIC0gMSwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTQotfTsKLQotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHNoNzc4MF9wY2lfb3BzOwotCi1zdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7Ci0JeyAmc2g0X3BjaV9vcHMsICZzaDc3ODBfaW9fcmVzb3VyY2UsICZzaDc3ODBfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCi0JeyBOVUxMLCBOVUxMLCBOVUxMLCAwLCAwIH0sCi19OwotRVhQT1JUX1NZTUJPTChib2FyZF9wY2lfY2hhbm5lbHMpOwotCi1zdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzgwX3BjaV9tYXAgPSB7Ci0JLndpbmRvdzAJPSB7Ci0JCS5iYXNlCT0gU0g3NzgwX0NTMl9CQVNFX0FERFIsCi0JCS5zaXplCT0gMHgwNDAwMDAwMCwKLQl9LAotCi0JLndpbmRvdzEJPSB7Ci0JCS5iYXNlCT0gU0g3NzgwX0NTM19CQVNFX0FERFIsCi0JCS5zaXplCT0gMHgwNDAwMDAwMCwKLQl9LAotCi0JLmZsYWdzCT0gU0g0X1BDSUNfTk9fUkVTRVQsCi19OwotCi1pbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQotewotCXJldHVybiBzaDc3ODBfcGNpY19pbml0KCZzaDc3ODBfcGNpX21hcCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1ydHM3NzUxcjJkLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1ydHM3NzUxcjJkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Y2E3NGIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcnRzNzc1MXIyZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXJ0czc3NTFyMmQuYwotICoKLSAqIEF1dGhvcjogIElhbiBEYVNpbHZhIChpZGFzaWx2YUBtdmlzdGEuY29tKQotICoKLSAqIEhpZ2hseSBsZXZlcmFnZWQgZnJvbSBwY2ktYmlnc3VyLmMsIHdyaXR0ZW4gYnkgRHVzdGluIE1jSW50aXJlLgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBQQ0kgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBSZW5lc2FzIFNINzc1MVIgUlRTNzc1MVIyRCBib2FyZAotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxtYWNoL3IyZC5oPgotI2luY2x1ZGUgInBjaS1zaDQuaCIKLQotc3RhdGljIHU4IHJ0czc3NTFyMmRfaXJxX3RhYltdIF9faW5pdGRhdGEgPSB7Ci0JSVJRX1BDSV9JTlRBLAotCUlSUV9QQ0lfSU5UQiwKLQlJUlFfUENJX0lOVEMsCi0JSVJRX1BDSV9JTlRELAotfTsKLQotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlyZXR1cm4gcnRzNzc1MXIyZF9pcnFfdGFiW3Nsb3RdOwotfQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9pb19yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJTSDc3NTFfSU8iLAotCS5zdGFydAk9IDB4NDAwMCwKLQkuZW5kCT0gU0g3NzUxX1BDSV9JT19TSVpFIC0gMSwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9tZW1fcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiU0g3NzUxX21lbSIsCi0JLnN0YXJ0CT0gU0g3NzUxX1BDSV9NRU1PUllfQkFTRSwKLQkuZW5kCT0gU0g3NzUxX1BDSV9NRU1PUllfQkFTRSArIFNINzc1MV9QQ0lfTUVNX1NJWkUgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCi19OwotCi1leHRlcm4gc3RydWN0IHBjaV9vcHMgc2g3NzUxX3BjaV9vcHM7Ci0KLXN0cnVjdCBwY2lfY2hhbm5lbCBib2FyZF9wY2lfY2hhbm5lbHNbXSA9IHsKLQl7ICZzaDRfcGNpX29wcywgJnNoNzc1MV9pb19yZXNvdXJjZSwgJnNoNzc1MV9tZW1fcmVzb3VyY2UsIDAsIDB4ZmYgfSwKLQl7IE5VTEwsIE5VTEwsIE5VTEwsIDAsIDAgfSwKLX07Ci1FWFBPUlRfU1lNQk9MKGJvYXJkX3BjaV9jaGFubmVscyk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX21hcCBzaDc3NTFfcGNpX21hcCA9IHsKLQkud2luZG93MAk9IHsKLQkJLmJhc2UJPSBTSDc3NTFfQ1MzX0JBU0VfQUREUiwKLQkJLnNpemUJPSAweDA0MDAwMDAwLAotCX0sCi0KLQkud2luZG93MQk9IHsKLQkJLmJhc2UJPSAweDAwMDAwMDAwLAkvKiBVbnVzZWQgKi8KLQkJLnNpemUJPSAweDAwMDAwMDAwLAkvKiBVbnVzZWQgKi8KLQl9LAotCi0JLmZsYWdzCT0gU0g0X1BDSUNfTk9fUkVTRVQsCi19OwotCi1pbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQotewotCV9fc2V0X2lvX3BvcnRfYmFzZShTSDc3NTFfUENJX0lPX0JBU0UpOwotCXJldHVybiBzaDc3NTFfcGNpY19pbml0KCZzaDc3NTFfcGNpX21hcCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNkazc3ODAuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNkazc3ODAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjYzY0MS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zZGs3NzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2RrNzc4MC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA2ICBOb2J1aGlybyBJd2FtYXRzdQotICoKLSAqIFBDSSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIFNESzc3ODBTRTAzCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxtYWNoL3Nkazc3ODAuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlICJwY2ktc2g0LmgiCi0KLS8qIElEU0VMIFsxNl1bMTddWzE4XVsxOV1bMjBdWzIxXVsyMl1bMjNdWzI0XVsyNV1bMjZdWzI3XVsyOF1bMjldWzMwXVszMV0gKi8KLXN0YXRpYyBjaGFyIHNkazc3ODBfaXJxX3RhYls0XVsxNl0gX19pbml0ZGF0YSA9IHsKLQkvKiBJTlRBICovCi0JeyA2NSwgNjgsIDY3LCA2OCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotCS8qIElOVEIgKi8KLQl7IDY2LCA2NSwgLTEsIDY1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi0JLyogSU5UQyAqLwotCXsgNjcsIDY2LCAtMSwgNjYsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLQkvKiBJTlREICovCi0JeyA2OCwgNjcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotfTsKLQotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLSAgICAgICByZXR1cm4gc2RrNzc4MF9pcnFfdGFiW3Bpbi0xXVtzbG90XTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzZGs3NzgwX2lvX3Jlc291cmNlID0gewotCS5uYW1lCT0gIlNINzc4MF9JTyIsCi0JLnN0YXJ0CT0gU0g3NzgwX1BDSV9JT19CQVNFLAotCS5lbmQJPSBTSDc3ODBfUENJX0lPX0JBU0UgKyBTSDc3ODBfUENJX0lPX1NJWkUgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2RrNzc4MF9tZW1fcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiU0g3NzgwX21lbSIsCi0JLnN0YXJ0CT0gU0g3NzgwX1BDSV9NRU1PUllfQkFTRSwKLQkuZW5kCT0gU0g3NzgwX1BDSV9NRU1PUllfQkFTRSArIFNINzc4MF9QQ0lfTUVNX1NJWkUgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCi19OwotCi1zdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7Ci0JeyAmc2g0X3BjaV9vcHMsICZzZGs3NzgwX2lvX3Jlc291cmNlLCAmc2RrNzc4MF9tZW1fcmVzb3VyY2UsIDAsIDB4ZmYgfSwKLQl7IE5VTEwsIE5VTEwsIE5VTEwsIDAsIDAgfSwKLX07Ci1FWFBPUlRfU1lNQk9MKGJvYXJkX3BjaV9jaGFubmVscyk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX21hcCBzZGs3NzgwX3BjaV9tYXAgPSB7Ci0JLndpbmRvdzAJPSB7Ci0JCS5iYXNlCT0gU0g3NzgwX0NTMl9CQVNFX0FERFIsCi0JCS5zaXplCT0gMHgwNDAwMDAwMCwKLQl9LAotCS53aW5kb3cxCT0gewotCQkuYmFzZQk9IFNINzc4MF9DUzNfQkFTRV9BRERSLAotCQkuc2l6ZQk9IDB4MDQwMDAwMDAsCi0JfSwKLQkuZmxhZ3MJPSBTSDRfUENJQ19OT19SRVNFVCwKLX07Ci0KLWludCBfX2luaXQgcGNpYmlvc19pbml0X3BsYXRmb3JtKHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAiU0g3NzgwIFBDSTogRmluaXNoZWQgaW5pdGlhbGl6aW5nIFBDSSBjb250cm9sbGVyXG4iKTsKLQlyZXR1cm4gc2g3NzgwX3BjaWNfaW5pdCgmc2RrNzc4MF9wY2lfbWFwKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNlNzc4MC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2U3NzgwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDVjNjIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2U3NzgwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2U3NzgwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgIE5vYnVoaXJvIEl3YW1hdHN1Ci0gKgotICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSGl0YWNoaSBVTCBTb2x1dGlvbiBFbmdpbmUgNzc4MFNFMDMKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPG1hY2gtc2UvbWFjaC9zZTc3ODAuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlICJwY2ktc2g0LmgiCi0KLS8qCi0gKiBJRFNFTCA9IEFEMTYgIFBDSSBzbG90Ci0gKiBJRFNFTCA9IEFEMTcgIFBDSSBzbG90Ci0gKiBJRFNFTCA9IEFEMTggIFNlcmlhbCBBVEEgQ29udHJvbGxlciAoU2lsaWNvbiBJbWFnZSBTaUwzNTEyQSkKLSAqIElEU0VMID0gQUQxOSAgVVNCIEhvc3QgQ29udHJvbGxlciAoTkVDIHVQRDcyMTAxMDBBKQotICovCi0KLS8qIElEU0VMIFsxNl1bMTddWzE4XVsxOV1bMjBdWzIxXVsyMl1bMjNdWzI0XVsyNV1bMjZdWzI3XVsyOF1bMjldWzMwXVszMV0gKi8KLXN0YXRpYyBjaGFyIHNlNzc4MF9pcnFfdGFiWzRdWzE2XSBfX2luaXRkYXRhID0gewotCS8qIElOVEEgKi8KLQl7IDY1LCA2OCwgNjcsIDY4LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi0JLyogSU5UQiAqLwotCXsgNjYsIDY1LCAtMSwgNjUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLQkvKiBJTlRDICovCi0JeyA2NywgNjYsIC0xLCA2NiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotCS8qIElOVEQgKi8KLQl7IDY4LCA2NywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi19OwotCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQotewotICAgICAgIHJldHVybiBzZTc3ODBfaXJxX3RhYltwaW4tMV1bc2xvdF07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2U3NzgwX2lvX3Jlc291cmNlID0gewotCS5uYW1lCT0gIlNINzc4MF9JTyIsCi0JLnN0YXJ0CT0gU0g3NzgwX1BDSV9JT19CQVNFLAotCS5lbmQJPSBTSDc3ODBfUENJX0lPX0JBU0UgKyBTSDc3ODBfUENJX0lPX1NJWkUgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2U3NzgwX21lbV9yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJTSDc3ODBfbWVtIiwKLQkuc3RhcnQJPSBTSDc3ODBfUENJX01FTU9SWV9CQVNFLAotCS5lbmQJPSBTSDc3ODBfUENJX01FTU9SWV9CQVNFICsgU0g3NzgwX1BDSV9NRU1fU0laRSAtIDEsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KLX07Ci0KLWV4dGVybiBzdHJ1Y3QgcGNpX29wcyBzZTc3ODBfcGNpX29wczsKLQotc3RydWN0IHBjaV9jaGFubmVsIGJvYXJkX3BjaV9jaGFubmVsc1tdID0gewotCXsgJnNoNF9wY2lfb3BzLCAmc2U3NzgwX2lvX3Jlc291cmNlLCAmc2U3NzgwX21lbV9yZXNvdXJjZSwgMCwgMHhmZiB9LAotCXsgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCB9LAotfTsKLUVYUE9SVF9TWU1CT0woYm9hcmRfcGNpX2NoYW5uZWxzKTsKLQotc3RhdGljIHN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwIHNlNzc4MF9wY2lfbWFwID0gewotCS53aW5kb3cwCT0gewotCQkuYmFzZQk9IFNINzc4MF9DUzJfQkFTRV9BRERSLAotCQkuc2l6ZQk9IDB4MDQwMDAwMDAsCi0JfSwKLQkuZmxhZ3MgID0gU0g0X1BDSUNfTk9fUkVTRVQsCi19OwotCi1pbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQotewotCXByaW50aygiU0g3NzgwIFBDSTogRmluaXNoZWQgaW5pdGlhbGl6YXRpb24gb2YgdGhlIFBDSSBjb250cm9sbGVyXG4iKTsKLQotCS8qCi0JICogRlBHQSBQQ0lTRUwgcmVnaXN0ZXIgaW5pdGlhbGl6ZQotCSAqCi0JICogIENQVSAgfHwgU0xPVDEgfCBTTE9UMiB8IFMtQVRBIHwgVVNCCi0JICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiAgSU5UQSB8fCBJTlRBICB8IElOVEQgIHwgIC0tICAgfCBJTlRCCi0JICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiAgSU5UQiB8fCBJTlRCICB8IElOVEEgIHwgIC0tICAgfCBJTlRDCi0JICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiAgSU5UQyB8fCBJTlRDICB8IElOVEIgIHwgSU5UQSAgfCAgLS0KLQkgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqICBJTlREIHx8IElOVEQgIHwgSU5UQyAgfCAgLS0gICB8IElOVEEKLQkgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSAqLwotCWN0cmxfb3V0dygweDAwMTMsIEZQR0FfUENJX0lOVFNFTDEpOwotCWN0cmxfb3V0dygweEU0MDIsIEZQR0FfUENJX0lOVFNFTDIpOwotCi0JcmV0dXJuIHNoNzc4MF9wY2ljX2luaXQoJnNlNzc4MF9wY2lfbWFwKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNoMDMuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNoMDMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE3MDNmZi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDAzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2gwMy5jCi0gKgotICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSW50ZXJmYWNlIENUUC9QQ0ktU0gwMyBib2FyZAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgInBjaS1zaDc3NTEuaCIKLQotLyoKLSAqIERlc2NyaXB0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXRzIHVwIGFuZCBpbml0aWFsaXplcyB0aGUgcGNpYywgc2V0cwotICogdXAgdGhlIEJBUlMsIG1hcHMgdGhlIERSQU0gaW50byB0aGUgYWRkcmVzcyBzcGFjZSBldGMsIGV0Yy4KLSAqLwotaW50IF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCkKLXsKLQlfX3NldF9pb19wb3J0X2Jhc2UoU0g3NzUxX1BDSV9JT19CQVNFKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3NTFfaW9fcmVzb3VyY2UgPSB7Ci0JLm5hbWUgICA9ICJTSDAzIElPIiwKLQkuc3RhcnQgID0gU0g3NzUxX1BDSV9JT19CQVNFLAotCS5lbmQgICAgPSBTSDc3NTFfUENJX0lPX0JBU0UgKyBTSDc3NTFfUENJX0lPX1NJWkUgLSAxLAotCS5mbGFncyAgPSBJT1JFU09VUkNFX0lPCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9tZW1fcmVzb3VyY2UgPSB7Ci0JLm5hbWUgICA9ICJTSDAzIG1lbSIsCi0JLnN0YXJ0ICA9IFNINzc1MV9QQ0lfTUVNT1JZX0JBU0UsCi0JLmVuZCAgICA9IFNINzc1MV9QQ0lfTUVNT1JZX0JBU0UgKyBTSDc3NTFfUENJX01FTV9TSVpFIC0gMSwKLQkuZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU0KLX07Ci0KLWV4dGVybiBzdHJ1Y3QgcGNpX29wcyBzaDRfcGNpX29wczsKLQotc3RydWN0IHBjaV9jaGFubmVsIGJvYXJkX3BjaV9jaGFubmVsc1tdID0gewotCXsgJnNoNF9wY2lfb3BzLCAmc2g3NzUxX2lvX3Jlc291cmNlLCAmc2g3NzUxX21lbV9yZXNvdXJjZSwgMCwgMHhmZiB9LAotCXsgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCB9LAotfTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2g0LmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDQuYwppbmRleCA3MTBhM2IwLi43OGJlYmViIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDQuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDQuYwpAQCAtMSwyMiArMSwyMiBAQAogLyoKICAqIEdlbmVyaWMgU0gtNCAvIFNILTRBIFBDSUMgb3BlcmF0aW9ucyAoU0g3NzUxLCBTSDc3ODApLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDYgIFBhdWwgTXVuZHQKKyAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDkgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZSB2Mi4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAicGNpLXNoNC5oIgogCiAvKgogICogRGlyZWN0IGFjY2VzcyB0byBQQ0kgaGFyZHdhcmUuLi4KICAqLwogI2RlZmluZSBDT05GSUdfQ01EKGJ1cywgZGV2Zm4sIHdoZXJlKSBcCi0JUDFTRUdBRERSKChidXMtPm51bWJlciA8PCAxNikgfCAoZGV2Zm4gPDwgOCkgfCAod2hlcmUgJiB+MykpCisJKFAxU0VHIHwgKGJ1cy0+bnVtYmVyIDw8IDE2KSB8IChkZXZmbiA8PCA4KSB8ICh3aGVyZSAmIH4zKSkKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhzaDRfcGNpX2xvY2spOwogCkBAIC0yNiw2ICsyNiw3IEBACiBzdGF0aWMgaW50IHNoNF9wY2lfcmVhZChzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCiAJCQkgICBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKnZhbCkKIHsKKwlzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4gPSBidXMtPnN5c2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgZGF0YTsKIApAQCAtMzQsOCArMzUsOCBAQAogCSAqIHNvIHdlIG11c3QgZG8gYnl0ZSBhbGlnbm1lbnQgYnkgaGFuZAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZzaDRfcGNpX2xvY2ssIGZsYWdzKTsKLQlwY2lfd3JpdGVfcmVnKENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpLCBTSDRfUENJUEFSKTsKLQlkYXRhID0gcGNpX3JlYWRfcmVnKFNINF9QQ0lQRFIpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgQ09ORklHX0NNRChidXMsIGRldmZuLCB3aGVyZSksIFNINF9QQ0lQQVIpOworCWRhdGEgPSBwY2lfcmVhZF9yZWcoY2hhbiwgU0g0X1BDSVBEUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2g0X3BjaV9sb2NrLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHNpemUpIHsKQEAgLTYzLDEzICs2NCwxNCBAQAogc3RhdGljIGludCBzaDRfcGNpX3dyaXRlKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKIAkJCSBpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgdmFsKQogeworCXN0cnVjdCBwY2lfY2hhbm5lbCAqY2hhbiA9IGJ1cy0+c3lzZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzaGlmdDsKIAl1MzIgZGF0YTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzaDRfcGNpX2xvY2ssIGZsYWdzKTsKLQlwY2lfd3JpdGVfcmVnKENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpLCBTSDRfUENJUEFSKTsKLQlkYXRhID0gcGNpX3JlYWRfcmVnKFNINF9QQ0lQRFIpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgQ09ORklHX0NNRChidXMsIGRldmZuLCB3aGVyZSksIFNINF9QQ0lQQVIpOworCWRhdGEgPSBwY2lfcmVhZF9yZWcoY2hhbiwgU0g0X1BDSVBEUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2g0X3BjaV9sb2NrLCBmbGFncyk7CiAKIAlzd2l0Y2ggKHNpemUpIHsKQEAgLTkwLDcgKzkyLDcgQEAKIAkJcmV0dXJuIFBDSUJJT1NfRlVOQ19OT1RfU1VQUE9SVEVEOwogCX0KIAotCXBjaV93cml0ZV9yZWcoZGF0YSwgU0g0X1BDSVBEUik7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCBkYXRhLCBTSDRfUENJUERSKTsKIAogCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CiB9CkBAIC0xMDQsNjYgKzEwNiwzMSBAQAogICogTm90IHJlYWxseSByZWxhdGVkIHRvIHBjaV9vcHMsIGJ1dCBpdCdzIGNvbW1vbiBhbmQgbm90IHdvcnRoIHNob3ZpbmcKICAqIHNvbWV3aGVyZSBlbHNlIGZvciBub3cuLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHBjaV9wcm9iZSA9IFBDSV9QUk9CRV9DT05GMTsKLQotaW50IF9faW5pdCBzaDRfcGNpX2NoZWNrX2RpcmVjdCh2b2lkKQoraW50IF9faW5pdCBzaDRfcGNpX2NoZWNrX2RpcmVjdChzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4pCiB7CiAJLyoKIAkgKiBDaGVjayBpZiBjb25maWd1cmF0aW9uIHdvcmtzLgogCSAqLwotCWlmIChwY2lfcHJvYmUgJiBQQ0lfUFJPQkVfQ09ORjEpIHsKLQkJdW5zaWduZWQgaW50IHRtcCA9IHBjaV9yZWFkX3JlZyhTSDRfUENJUEFSKTsKKwl1bnNpZ25lZCBpbnQgdG1wID0gcGNpX3JlYWRfcmVnKGNoYW4sIFNINF9QQ0lQQVIpOwogCi0JCXBjaV93cml0ZV9yZWcoUDFTRUcsIFNINF9QQ0lQQVIpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgUDFTRUcsIFNINF9QQ0lQQVIpOwogCi0JCWlmIChwY2lfcmVhZF9yZWcoU0g0X1BDSVBBUikgPT0gUDFTRUcpIHsKLQkJCXBjaV93cml0ZV9yZWcodG1wLCBTSDRfUENJUEFSKTsKLQkJCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgY29uZmlndXJhdGlvbiB0eXBlIDFcbiIpOwotCQkJcmVxdWVzdF9yZWdpb24oUENJX1JFRyhTSDRfUENJUEFSKSwgOCwgIlBDSSBjb25mMSIpOwotCi0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXBjaV93cml0ZV9yZWcodG1wLCBTSDRfUENJUEFSKTsKKwlpZiAocGNpX3JlYWRfcmVnKGNoYW4sIFNINF9QQ0lQQVIpID09IFAxU0VHKSB7CisJCXBjaV93cml0ZV9yZWcoY2hhbiwgdG1wLCBTSDRfUENJUEFSKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBjb25maWd1cmF0aW9uIHR5cGUgMVxuIik7CisJCXJlcXVlc3RfcmVnaW9uKGNoYW4tPnJlZ19iYXNlICsgU0g0X1BDSVBBUiwgOCwKKwkJCSAgICAgICAiUENJIGNvbmYxIik7CisJCXJldHVybiAwOwogCX0KIAotCXByX2RlYnVnKCJQQ0k6IHBjaV9jaGVja19kaXJlY3QgZmFpbGVkXG4iKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIHRtcCwgU0g0X1BDSVBBUik7CisKKwlwcmludGsoS0VSTl9FUlIgIlBDSTogJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotLyogSGFuZGxlIGdlbmVyaWMgZml4dXBzICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcGNpX2ZpeHVwX2lkZV9iYXNlcyhzdHJ1Y3QgcGNpX2RldiAqZCkKLXsKLQlpbnQgaTsKLQotCS8qCi0JICogUENJIElERSBjb250cm9sbGVycyB1c2Ugbm9uLXN0YW5kYXJkIEkvTyBwb3J0IGRlY29kaW5nLCByZXNwZWN0IGl0LgotCSAqLwotCWlmICgoZC0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKQotCQlyZXR1cm47Ci0JcHJfZGVidWcoIlBDSTogSURFIGJhc2UgYWRkcmVzcyBmaXh1cCBmb3IgJXNcbiIsIHBjaV9uYW1lKGQpKTsKLQlmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyID0gJmQtPnJlc291cmNlW2ldOwotCi0JCWlmICgoci0+c3RhcnQgJiB+MHg4MCkgPT0gMHgzNzQpIHsKLQkJCXItPnN0YXJ0IHw9IDI7Ci0JCQlyLT5lbmQgPSByLT5zdGFydDsKLQkJfQotCX0KLX0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZml4dXBfaWRlX2Jhc2VzKTsKLQotY2hhciAqIF9fZGV2aW5pdCBwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKLXsKLQlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkgewotCQlwY2lfcHJvYmUgPSAwOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gc3RyOwotfQotCi1pbnQgX19hdHRyaWJ1dGVfXygod2VhaykpIHBjaV9maXh1cF9wY2ljKHZvaWQpCitpbnQgX19hdHRyaWJ1dGVfXygod2VhaykpIHBjaV9maXh1cF9wY2ljKHN0cnVjdCBwY2lfY2hhbm5lbCAqY2hhbikKIHsKIAkvKiBOb3RoaW5nIHRvIGRvLiAqLwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2g1LmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDUuYwppbmRleCA3MjllMzhhLi40Y2U5NWEwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDUuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDUuYwpAQCAtMjIsMzEgKzIyLDYgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlICJwY2ktc2g1LmgiCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfZml4dXBfaWRlX2Jhc2VzKHN0cnVjdCBwY2lfZGV2ICpkKQotewotCWludCBpOwotCi0JLyoKLQkgKiBQQ0kgSURFIGNvbnRyb2xsZXJzIHVzZSBub24tc3RhbmRhcmQgSS9PIHBvcnQgZGVjb2RpbmcsIHJlc3BlY3QgaXQuCi0JICovCi0JaWYgKChkLT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCi0JCXJldHVybjsKLQlwcmludGsoIlBDSTogSURFIGJhc2UgYWRkcmVzcyBmaXh1cCBmb3IgJXNcbiIsIHBjaV9uYW1lKGQpKTsKLQlmb3IoaT0wOyBpPDQ7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZC0+cmVzb3VyY2VbaV07Ci0JCWlmICgoci0+c3RhcnQgJiB+MHg4MCkgPT0gMHgzNzQpIHsKLQkJCXItPnN0YXJ0IHw9IDI7Ci0JCQlyLT5lbmQgPSByLT5zdGFydDsKLQkJfQotCX0KLX0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZml4dXBfaWRlX2Jhc2VzKTsKLQotY2hhciAqIF9fZGV2aW5pdCBwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKLXsKLQlyZXR1cm4gc3RyOwotfQotCiBzdGF0aWMgaW50IHNoNXBjaV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHdoZXJlLAogCQkJaW50IHNpemUsIHUzMiAqdmFsKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2g3Nzg1bGNyLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDc3ODVsY3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwODY5Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDc3ODVsY3IuYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qCi0gKiBBdXRob3I6ICBJYW4gRGFTaWx2YSAoaWRhc2lsdmFAbXZpc3RhLmNvbSkKLSAqCi0gKiBIaWdobHkgbGV2ZXJhZ2VkIGZyb20gcGNpLWJpZ3N1ci5jLCB3cml0dGVuIGJ5IER1c3RpbiBNY0ludGlyZS4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgUmVuZXNhcyBSMFA3Nzg1TEMwMDExUkwgYm9hcmQKLSAqIEJhc2VkIG9uIGFyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXI3NzgwcnAuYwotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSAicGNpLXNoNC5oIgotCi1zdGF0aWMgY2hhciBpcnFfdGFiW10gX19pbml0ZGF0YSA9IHsKLQk2NSwgNjYsIDY3LCA2OCwKLX07Ci0KLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JcmV0dXJuIGlycV90YWJbc2xvdF07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3Nzg1X2lvX3Jlc291cmNlID0gewotCS5uYW1lCT0gIlNINzc4NV9JTyIsCi0JLnN0YXJ0CT0gU0g3NzgwX1BDSV9JT19CQVNFLAotCS5lbmQJPSBTSDc3ODBfUENJX0lPX0JBU0UgKyBTSDc3ODBfUENJX0lPX1NJWkUgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3Nzg1X21lbV9yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJTSDc3ODVfbWVtIiwKLQkuc3RhcnQJPSBTSDc3ODBfUENJX01FTU9SWV9CQVNFLAotCS5lbmQJPSBTSDc3ODBfUENJX01FTU9SWV9CQVNFICsgU0g3NzgwX1BDSV9NRU1fU0laRSAtIDEsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KLX07Ci0KLXN0cnVjdCBwY2lfY2hhbm5lbCBib2FyZF9wY2lfY2hhbm5lbHNbXSA9IHsKLQl7ICZzaDRfcGNpX29wcywgJnNoNzc4NV9pb19yZXNvdXJjZSwgJnNoNzc4NV9tZW1fcmVzb3VyY2UsIDAsIDB4ZmYgfSwKLQl7IE5VTEwsIE5VTEwsIE5VTEwsIDAsIDAgfSwKLX07Ci1FWFBPUlRfU1lNQk9MKGJvYXJkX3BjaV9jaGFubmVscyk7Ci0KLXN0YXRpYyBzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX21hcCBzaDc3ODVfcGNpX21hcCA9IHsKLQkud2luZG93MAk9IHsKLSNpZiBkZWZpbmVkKENPTkZJR18zMkJJVCkKLQkJLmJhc2UJPSBTSDc3ODBfMzJCSVRfRERSX0JBU0VfQUREUiwKLQkJLnNpemUJPSAweDQwMDAwMDAwLAotI2Vsc2UKLQkJLmJhc2UJPSBTSDc3ODBfQ1MwX0JBU0VfQUREUiwKLQkJLnNpemUJPSAweDIwMDAwMDAwLAotI2VuZGlmCi0JfSwKLQotCS5mbGFncwk9IFNINF9QQ0lDX05PX1JFU0VULAotfTsKLQotaW50IF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCkKLXsKLQlyZXR1cm4gc2g3NzgwX3BjaWNfaW5pdCgmc2g3Nzg1X3BjaV9tYXApOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc25hcGdlYXIuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNuYXBnZWFyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZGQ4OTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc25hcGdlYXIuYworKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zbmFwZ2Vhci5jCi0gKgotICogQXV0aG9yOiAgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KLSAqCi0gKiBQb3J0ZWQgdG8gbmV3IEFQSSBieSBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPgotICoKLSAqIEhpZ2hseSBsZXZlcmFnZWQgZnJvbSBwY2ktYmlnc3VyLmMsIHdyaXR0ZW4gYnkgRHVzdGluIE1jSW50aXJlLgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBQQ0kgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBTbmFwR2VhciBib2FyZHMKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgInBjaS1zaDQuaCIKLQotI2RlZmluZSBTTkFQR0VBUl9QQ0lfSU8JCTB4NDAwMAotI2RlZmluZSBTTkFQR0VBUl9QQ0lfTUVNCTB4ZmQwMDAwMDAKLQotLyogUENJOiBkZWZhdWx0IExPQ0FMIG1lbW9yeSB3aW5kb3cgc2l6ZXMgKHNlZW4gZnJvbSBQQ0kgYnVzKSAqLwotI2RlZmluZSBTTkFQR0VBUl9MU1IwX1NJWkUgICAgKDY0KigxPDwyMCkpIC8vNjRNQgotI2RlZmluZSBTTkFQR0VBUl9MU1IxX1NJWkUgICAgKDY0KigxPDwyMCkpIC8vNjRNQgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9pb19yZXNvdXJjZSA9IHsKLQkubmFtZQkJPSAiU0g3NzUxIElPIiwKLQkuc3RhcnQJCT0gU05BUEdFQVJfUENJX0lPLAotCS5lbmQJCT0gU05BUEdFQVJfUENJX0lPICsgKDY0KjEwMjQpIC0gMSwgLyogNjRLaUIgSS9PICovCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfSU8sCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9tZW1fcmVzb3VyY2UgPSB7Ci0JLm5hbWUJCT0gIlNINzc1MSBtZW0iLAotCS5zdGFydAkJPSBTTkFQR0VBUl9QQ0lfTUVNLAotCS5lbmQJCT0gU05BUEdFQVJfUENJX01FTSArICg2NCoxMDI0KjEwMjQpIC0gMSwgLyogNjRNaUIgbWVtICovCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotc3RydWN0IHBjaV9jaGFubmVsIGJvYXJkX3BjaV9jaGFubmVsc1tdID0gewotCXsgJnNoNF9wY2lfb3BzLCAmc2g3NzUxX2lvX3Jlc291cmNlLCAmc2g3NzUxX21lbV9yZXNvdXJjZSwgMCwgMHhmZiB9LAotCXsgMCwgfQotfTsKLQotc3RhdGljIHN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwIHNoNzc1MV9wY2lfbWFwID0gewotCS53aW5kb3cwCT0gewotCQkuYmFzZQk9IFNINzc1MV9DUzJfQkFTRV9BRERSLAotCQkuc2l6ZQk9IFNOQVBHRUFSX0xTUjBfU0laRSwKLQl9LAotCi0JLndpbmRvdzEJPSB7Ci0JCS5iYXNlCT0gU0g3NzUxX0NTMl9CQVNFX0FERFIsCi0JCS5zaXplCT0gU05BUEdFQVJfTFNSMV9TSVpFLAotCX0sCi0KLQkuZmxhZ3MJPSBTSDRfUENJQ19OT19SRVNFVCwKLX07Ci0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBTbmFwR2VhciBQQ0kgaW50ZXJmYWNlCi0gKiBTZXR1cCBoYXJkd2FyZSB0byBiZSBDZW50cmFsIEZ1bnRpb24KLSAqIENvcHkgdGhlIEJTUiByZWdzIHRvIHRoZSBQQ0kgaW50ZXJmYWNlCi0gKiBTZXR1cCBQQ0kgd2luZG93cyBpbnRvIGxvY2FsIFJBTQotICovCi1pbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQotewotCXJldHVybiBzaDc3NTFfcGNpY19pbml0KCZzaDc3NTFfcGNpX21hcCk7Ci19Ci0KLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JaW50IGlycSA9IC0xOwotCi0Jc3dpdGNoIChzbG90KSB7Ci0JY2FzZSA4OiAgLyogdGhlIFBDSSBicmlkZ2UgKi8gYnJlYWs7Ci0JY2FzZSAxMTogaXJxID0gODsgIGJyZWFrOyAvKiBVU0IgICAgKi8KLQljYXNlIDEyOiBpcnEgPSAxMTsgYnJlYWs7IC8qIFBDTUNJQSAqLwotCWNhc2UgMTM6IGlycSA9IDU7ICBicmVhazsgLyogZXRoMCAgICovCi0JY2FzZSAxNDogaXJxID0gODsgIGJyZWFrOyAvKiBldGgxICAgKi8KLQljYXNlIDE1OiBpcnEgPSAxMTsgYnJlYWs7IC8qIHNhZmVuZXQgKHVudXNlZCkgKi8KLQl9Ci0KLQlwcmludGsoIlBDSTogTWFwcGluZyBTbmFwR2VhciBJUlEgZm9yIHNsb3QgJWQsIHBpbiAlYyB0byBpcnEgJWRcbiIsCi0JICAgICAgIHNsb3QsIHBpbiAtIDEgKyAnQScsIGlycSk7Ci0KLQlyZXR1cm4gaXJxOwotfQotCi12b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwKHZvaWQpCi17Ci0JLyogTm90aGluZyB0byBmaXh1cCAuLiAqLwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtdGl0YW4uYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXRpdGFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Zjc4MDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtdGl0YW4uYworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2RyaXZlcnMvcGNpL29wcy10aXRhbi5jCi0gKgotICogUG9ydGVkIHRvIG5ldyBBUEkgYnkgUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KLSAqCi0gKiBNb2RpZmllZCBmcm9tIG9wcy1zbmFwZ2Vhci5jIHdyaXR0ZW4gYnkgIERhdmlkIE1jQ3VsbG91Z2gKLSAqIEhpZ2hseSBsZXZlcmFnZWQgZnJvbSBwY2ktYmlnc3VyLmMsIHdyaXR0ZW4gYnkgRHVzdGluIE1jSW50aXJlLgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBQQ0kgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBUaXRhbiBib2FyZHMKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bWFjaC90aXRhbi5oPgotI2luY2x1ZGUgInBjaS1zaDQuaCIKLQotc3RhdGljIGNoYXIgdGl0YW5faXJxX3RhYltdIF9faW5pdGRhdGEgPSB7Ci0JVElUQU5fSVJRX1dBTiwKLQlUSVRBTl9JUlFfTEFOLAotCVRJVEFOX0lSUV9NUENJQSwKLQlUSVRBTl9JUlFfTVBDSUIsCi0JVElUQU5fSVJRX1VTQiwKLX07Ci0KLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JaW50IGlycSA9IHRpdGFuX2lycV90YWJbc2xvdF07Ci0KLQlwcmludGsoIlBDSTogTWFwcGluZyBUSVRBTiBJUlEgZm9yIHNsb3QgJWQsIHBpbiAlYyB0byBpcnEgJWRcbiIsCi0JCXNsb3QsIHBpbiAtIDEgKyAnQScsIGlycSk7Ci0KLQlyZXR1cm4gaXJxOwotfQotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9pb19yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJTSDc3NTFfSU8iLAotCS5zdGFydAk9IFNINzc1MV9QQ0lfSU9fQkFTRSwKLQkuZW5kCT0gU0g3NzUxX1BDSV9JT19CQVNFICsgU0g3NzUxX1BDSV9JT19TSVpFIC0gMSwKLQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPCi19OwotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9tZW1fcmVzb3VyY2UgPSB7Ci0JLm5hbWUJPSAiU0g3NzUxX21lbSIsCi0JLnN0YXJ0CT0gU0g3NzUxX1BDSV9NRU1PUllfQkFTRSwKLQkuZW5kCT0gU0g3NzUxX1BDSV9NRU1PUllfQkFTRSArIFNINzc1MV9QQ0lfTUVNX1NJWkUgLSAxLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCi19OwotCi1zdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7Ci0JeyAmc2g0X3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCi0JeyBOVUxMLCBOVUxMLCBOVUxMLCAwLCAwIH0sCi19OwotRVhQT1JUX1NZTUJPTChib2FyZF9wY2lfY2hhbm5lbHMpOwotCi1zdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7Ci0JLndpbmRvdzAJPSB7Ci0JCS5iYXNlCT0gU0g3NzUxX0NTMl9CQVNFX0FERFIsCi0JCS5zaXplCT0gU0g3NzUxX01FTV9SRUdJT05fU0laRSoyLAkvKiBjczIgYW5kIGNzMyAqLwotCX0sCi0KLQkud2luZG93MQk9IHsKLQkJLmJhc2UJPSBTSDc3NTFfQ1MyX0JBU0VfQUREUiwKLQkJLnNpemUJPSBTSDc3NTFfTUVNX1JFR0lPTl9TSVpFKjIsCi0JfSwKLQotCS5mbGFncwk9IFNINF9QQ0lDX05PX1JFU0VULAotfTsKLQotaW50IF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCkKLXsKLQlyZXR1cm4gc2g3NzUxX3BjaWNfaW5pdCgmc2g3NzUxX3BjaV9tYXApOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktYXV0by5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktYXV0by5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjQ4YjEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLWF1dG8uYworKysgL2Rldi9udWxsCkBAIC0xLDU0NSArMCwwIEBACi0vKgotICogUENJIGF1dG9jb25maWd1cmF0aW9uIGxpYnJhcnkKLSAqCi0gKiBBdXRob3I6IE1hdHQgUG9ydGVyIDxtcG9ydGVyQG12aXN0YS5jb20+Ci0gKgotICogQ29weXJpZ2h0IDIwMDAsIDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwMSBCcmFkbGV5IEQuIExhUm9uZGUgPGJyYWRAbHRjLmNvbT4KLSAqIENvcHlyaWdodCAyMDAzIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0vKgotICogTW9kaWZpZWQgZm9yIE1JUFMgYnkgSnVuIFN1biwganN1bkBtdmlzdGEuY29tCi0gKgotICogLiBTaW1wbGlmeSB0aGUgaW50ZXJmYWNlIGJldHdlZW4gcGNpX2F1dG8gYW5kIHRoZSByZXN0OiBhIHNpbmdsZSBmdW5jdGlvbi4KLSAqIC4gQXNzaWduIHJlc291cmNlcyBmcm9tIGxvdyBhZGRyZXNzIHRvIHVwcGVyIGFkZHJlc3MuCi0gKiAuIGNoYW5nZSBtb3N0IGludCB0byB1MzIuCi0gKgotICogRnVydGhlciBtb2RpZmllZCB0byBpbmNsdWRlIGl0IGFzIG1pcHMgZ2VuZXJpYyBjb2RlLCBwcG9wb3ZAbXZpc3RhLmNvbS4KLSAqCi0gKiAyMDAxLTEwLTI2ICBCcmFkbGV5IEQuIExhUm9uZGUgPGJyYWRAbHRjLmNvbT4KLSAqIC0gQWRkIGEgdG9wX2J1cyBhcmd1bWVudCB0byB0aGUgImVhcmx5IGNvbmZpZyIgZnVuY3Rpb25zIHNvIHRoYXQKLSAqICAgdGhleSBjYW4gc2V0IGEgZmFrZSBwYXJlbnQgYnVzIHBvaW50ZXIgdG8gY29udmluY2UgdGhlIHVuZGVybHlpbmcKLSAqICAgcGNpIG9wcyB0byB1c2UgdHlwZSAxIGNvbmZpZ3VyYXRpb24gZm9yIHN1YiBidXNzZXMuCi0gKiAtIFNldCBicmlkZ2UgYmFzZSBhbmQgbGltaXQgcmVnaXN0ZXJzIGNvcnJlY3RseS4KLSAqIC0gQWxpZ24gaW8gYW5kIG1lbW9yeSBiYXNlIHByb3Blcmx5IGJlZm9yZSBhbmQgYWZ0ZXIgYnJpZGdlIHNldHVwLgotICogLSBEb24ndCBmYWxsIHRocm91Z2ggdG8gcGNpX3NldHVwX2JhcnMgZm9yIGJyaWRnZS4KLSAqIC0gUmVmb3JtYXQgdGhlIGRlYnVnIG91dHB1dCB0byBsb29rIG1vcmUgbGlrZSBsc3BjaSdzIG91dHB1dC4KLSAqCi0gKiBDbG9uZWQgZm9yIFN1cGVySCBieSBNLiBSLiBCcm93biwgbXJicm93bkAweGQ2Lm9yZwotICoKLSAqIDIwMDMtMDgtMDUgIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+Ci0gKiAtIERvbid0IHVwZGF0ZSB0aGUgQkFSIHZhbHVlcyBvbiBzeXN0ZW1zIHRoYXQgYWxyZWFkeSBoYXZlIHZhbGlkIGFkZHJlc3NlcwotICogICBhbmQgZG9uJ3Qgd2FudCB0aGVzZSB1cGRhdGVkIGZvciB3aGF0ZXZlciByZWFzb24sIGJ5IHdheSBvZiBhIG5ldyBjb25maWcKLSAqICAgb3B0aW9uIGNoZWNrLiBIb3dldmVyLCB3ZSBzdGlsbCByZWFkIGluIHRoZSBvbGQgQkFSIHZhbHVlcyBzbyB0aGF0IHRoZXkKLSAqICAgY2FuIHN0aWxsIGJlIHJlcG9ydGVkIHRocm91Z2ggdGhlIGRlYnVnIG91dHB1dC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0KLSNkZWZpbmUJREVCVUcKLSNpZmRlZglERUJVRwotI2RlZmluZQlEQkcoeC4uLikJcHJpbnRrKHgpCi0jZWxzZQotI2RlZmluZQlEQkcoeC4uLikKLSNlbmRpZgotCi0vKgotICogVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGVhcmx5IG9uIGJlZm9yZSBQQ0kgc2Nhbm5pbmcgaXMgZG9uZQotICogYW5kIGFsbCBvZiB0aGUgcGNpX2RldiBhbmQgcGNpX2J1cyBzdHJ1Y3R1cmVzIGhhdmUgYmVlbiBjcmVhdGVkLgotICovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKmZha2VfcGNpX2RldihzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UsCi0JaW50IHRvcF9idXMsIGludCBidXNuciwgaW50IGRldmZuKQotewotCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiBkZXY7Ci0Jc3RhdGljIHN0cnVjdCBwY2lfYnVzIGJ1czsKLQotCWRldi5idXMgPSAmYnVzOwotCWRldi5zeXNkYXRhID0gaG9zZTsKLQlkZXYuZGV2Zm4gPSBkZXZmbjsKLQlidXMubnVtYmVyID0gYnVzbnI7Ci0JYnVzLm9wcyA9IGhvc2UtPnBjaV9vcHM7Ci0KLQlpZihidXNuciAhPSB0b3BfYnVzKQotCQkvKiBGYWtlIGEgcGFyZW50IGJ1cyBzdHJ1Y3R1cmUuICovCi0JCWJ1cy5wYXJlbnQgPSAmYnVzOwotCWVsc2UKLQkJYnVzLnBhcmVudCA9IE5VTEw7Ci0KLQlyZXR1cm4gJmRldjsKLX0KLQotI2RlZmluZSBFQVJMWV9QQ0lfT1AocncsIHNpemUsIHR5cGUpCQkJCQlcCi1zdGF0aWMgaW50IGVhcmx5XyMjcncjI19jb25maWdfIyNzaXplKHN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSwJCVwKLQlpbnQgdG9wX2J1cywgaW50IGJ1cywgaW50IGRldmZuLCBpbnQgb2Zmc2V0LCB0eXBlIHZhbHVlKQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBwY2lfIyNydyMjX2NvbmZpZ18jI3NpemUoCQkJCVwKLQkJZmFrZV9wY2lfZGV2KGhvc2UsIHRvcF9idXMsIGJ1cywgZGV2Zm4pLAkJXAotCQlvZmZzZXQsIHZhbHVlKTsJCQkJCQlcCi19Ci0KLUVBUkxZX1BDSV9PUChyZWFkLCBieXRlLCB1OCAqKQotRUFSTFlfUENJX09QKHJlYWQsIHdvcmQsIHUxNiAqKQotRUFSTFlfUENJX09QKHJlYWQsIGR3b3JkLCB1MzIgKikKLUVBUkxZX1BDSV9PUCh3cml0ZSwgYnl0ZSwgdTgpCi1FQVJMWV9QQ0lfT1Aod3JpdGUsIHdvcmQsIHUxNikKLUVBUkxZX1BDSV9PUCh3cml0ZSwgZHdvcmQsIHUzMikKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqaW9fcmVzb3VyY2VfaW51c2U7Ci1zdGF0aWMgc3RydWN0IHJlc291cmNlICptZW1fcmVzb3VyY2VfaW51c2U7Ci0KLXN0YXRpYyB1MzIgcGNpYXV0b19sb3dlcl9pb3NwYzsKLXN0YXRpYyB1MzIgcGNpYXV0b191cHBlcl9pb3NwYzsKLQotc3RhdGljIHUzMiBwY2lhdXRvX2xvd2VyX21lbXNwYzsKLXN0YXRpYyB1MzIgcGNpYXV0b191cHBlcl9tZW1zcGM7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotcGNpYXV0b19zZXR1cF9iYXJzKHN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSwKLQkJICAgaW50IHRvcF9idXMsCi0JCSAgIGludCBjdXJyZW50X2J1cywKLQkJICAgaW50IHBjaV9kZXZmbiwKLQkJICAgaW50IGJhcl9saW1pdCkKLXsKLQl1MzIgYmFyX3Jlc3BvbnNlLCBiYXJfc2l6ZSwgYmFyX3ZhbHVlOwotCXUzMiBiYXIsIGFkZHJfbWFzaywgYmFyX25yID0gMDsKLQl1MzIgKiB1cHBlcl9saW1pdDsKLQl1MzIgKiBsb3dlcl9saW1pdDsKLQlpbnQgZm91bmRfbWVtNjQgPSAwOwotCi0JZm9yIChiYXIgPSBQQ0lfQkFTRV9BRERSRVNTXzA7IGJhciA8PSBiYXJfbGltaXQ7IGJhcis9NCkgewotCQl1MzIgYmFyX2FkZHI7Ci0KLQkJLyogUmVhZCB0aGUgb2xkIEJBUiB2YWx1ZSAqLwotCQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCB0b3BfYnVzLAotCQkJCQljdXJyZW50X2J1cywKLQkJCQkJcGNpX2RldmZuLAotCQkJCQliYXIsCi0JCQkJCSZiYXJfYWRkcik7Ci0KLQkJLyogVGlja2xlIHRoZSBCQVIgYW5kIGdldCB0aGUgcmVzcG9uc2UgKi8KLQkJZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsCi0JCQkJCSBjdXJyZW50X2J1cywKLQkJCQkJIHBjaV9kZXZmbiwKLQkJCQkJIGJhciwKLQkJCQkJIDB4ZmZmZmZmZmYpOwotCi0JCWVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsCi0JCQkJCWN1cnJlbnRfYnVzLAotCQkJCQlwY2lfZGV2Zm4sCi0JCQkJCWJhciwKLQkJCQkJJmJhcl9yZXNwb25zZSk7Ci0KLQkJLyoKLQkJICogV3JpdGUgdGhlIG9sZCBCQVIgdmFsdWUgYmFjayBvdXQsIG9ubHkgdXBkYXRlIHRoZSBCQVIKLQkJICogaWYgd2UgaW1wbGljaXRseSB3YW50IHJlc291cmNlcyB0byBiZSB1cGRhdGVkLCB3aGljaAotCQkgKiBpcyBkb25lIGJ5IHRoZSBnZW5lcmljIGNvZGUgZnVydGhlciBkb3duLiAtLSBQRk0uCi0JCSAqLwotCQllYXJseV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgdG9wX2J1cywKLQkJCQkJIGN1cnJlbnRfYnVzLAotCQkJCQkgcGNpX2RldmZuLAotCQkJCQkgYmFyLAotCQkJCQkgYmFyX2FkZHIpOwotCi0JCS8qIElmIEJBUiBpcyBub3QgaW1wbGVtZW50ZWQgZ28gdG8gdGhlIG5leHQgQkFSICovCi0JCWlmICghYmFyX3Jlc3BvbnNlKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogV29ya2Fyb3VuZCBmb3IgYSBCQVIgdGhhdCBkb2Vzbid0IHVzZSBpdHMgdXBwZXIgd29yZCwKLQkJICogbGlrZSB0aGUgQUxpIDE1MzVEKyBQQ0kgREMtOTcgQ29udHJvbGxlciBNb2RlbSAoTTU0NTcpLgotCQkgKiBiZGwgPGJyYWRAbHRjLmNvbT4KLQkJICovCi0JCWlmICghKGJhcl9yZXNwb25zZSAmIDB4ZmZmZjAwMDApKQotCQkJYmFyX3Jlc3BvbnNlIHw9IDB4ZmZmZjAwMDA7Ci0KLXJldHJ5OgotCQkvKiBDaGVjayB0aGUgQkFSIHR5cGUgYW5kIHNldCBvdXIgYWRkcmVzcyBtYXNrICovCi0JCWlmIChiYXJfcmVzcG9uc2UgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSB7Ci0JCQlhZGRyX21hc2sgPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCQl1cHBlcl9saW1pdCA9ICZwY2lhdXRvX3VwcGVyX2lvc3BjOwotCQkJbG93ZXJfbGltaXQgPSAmcGNpYXV0b19sb3dlcl9pb3NwYzsKLQkJCURCRygiICAgICAgICBJL08iKTsKLQkJfSBlbHNlIHsKLQkJCWlmICgoYmFyX3Jlc3BvbnNlICYgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV9NQVNLKSA9PQotCQkJICAgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfNjQpCi0JCQkJZm91bmRfbWVtNjQgPSAxOwotCi0JCQlhZGRyX21hc2sgPSBQQ0lfQkFTRV9BRERSRVNTX01FTV9NQVNLOwotCQkJdXBwZXJfbGltaXQgPSAmcGNpYXV0b191cHBlcl9tZW1zcGM7Ci0JCQlsb3dlcl9saW1pdCA9ICZwY2lhdXRvX2xvd2VyX21lbXNwYzsKLQkJCURCRygiICAgICAgICBNZW0iKTsKLQkJfQotCi0KLQkJLyogQ2FsY3VsYXRlIHJlcXVlc3RlZCBzaXplICovCi0JCWJhcl9zaXplID0gfihiYXJfcmVzcG9uc2UgJiBhZGRyX21hc2spICsgMTsKLQotCQkvKiBBbGxvY2F0ZSBhIGJhc2UgYWRkcmVzcyAqLwotCQliYXJfdmFsdWUgPSAoKCpsb3dlcl9saW1pdCAtIDEpICYgfihiYXJfc2l6ZSAtIDEpKSArIGJhcl9zaXplOwotCi0JCWlmICgoYmFyX3ZhbHVlICsgYmFyX3NpemUpID4gKnVwcGVyX2xpbWl0KSB7Ci0JCQlpZiAoYmFyX3Jlc3BvbnNlICYgUENJX0JBU0VfQUREUkVTU19TUEFDRSkgewotCQkJCWlmIChpb19yZXNvdXJjZV9pbnVzZS0+Y2hpbGQpIHsKLQkJCQkJaW9fcmVzb3VyY2VfaW51c2UgPQotCQkJCQkJaW9fcmVzb3VyY2VfaW51c2UtPmNoaWxkOwotCQkJCQlwY2lhdXRvX2xvd2VyX2lvc3BjID0KLQkJCQkJCWlvX3Jlc291cmNlX2ludXNlLT5zdGFydDsKLQkJCQkJcGNpYXV0b191cHBlcl9pb3NwYyA9Ci0JCQkJCQlpb19yZXNvdXJjZV9pbnVzZS0+ZW5kICsgMTsKLQkJCQkJZ290byByZXRyeTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1lbV9yZXNvdXJjZV9pbnVzZS0+Y2hpbGQpIHsKLQkJCQkJbWVtX3Jlc291cmNlX2ludXNlID0KLQkJCQkJCW1lbV9yZXNvdXJjZV9pbnVzZS0+Y2hpbGQ7Ci0JCQkJCXBjaWF1dG9fbG93ZXJfbWVtc3BjID0KLQkJCQkJCW1lbV9yZXNvdXJjZV9pbnVzZS0+c3RhcnQ7Ci0JCQkJCXBjaWF1dG9fdXBwZXJfbWVtc3BjID0KLQkJCQkJCW1lbV9yZXNvdXJjZV9pbnVzZS0+ZW5kICsgMTsKLQkJCQkJZ290byByZXRyeTsKLQkJCQl9Ci0JCQl9Ci0JCQlEQkcoIiB1bmF2YWlsYWJsZSAtLSBza2lwcGluZywgdmFsdWUgJXggc2l6ZSAleFxuIiwKLQkJCQkJYmFyX3ZhbHVlLCBiYXJfc2l6ZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChiYXJfdmFsdWUgPCAqbG93ZXJfbGltaXQgfHwgKGJhcl92YWx1ZSArIGJhcl9zaXplKSA+PSAqdXBwZXJfbGltaXQpIHsKLQkJCURCRygiIHVuYXZhaWxhYmxlIC0tIHNraXBwaW5nLCB2YWx1ZSAleCBzaXplICV4XG4iLAotCQkJCQliYXJfdmFsdWUsIGJhcl9zaXplKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLSNpZmRlZiBDT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUwotCQkvKiBXcml0ZSBpdCBvdXQgYW5kIHVwZGF0ZSBvdXIgbGltaXQgKi8KLQkJZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCQkJCSBiYXIsIGJhcl92YWx1ZSk7Ci0jZW5kaWYKLQotCQkqbG93ZXJfbGltaXQgPSBiYXJfdmFsdWUgKyBiYXJfc2l6ZTsKLQotCQkvKgotCQkgKiBJZiB3ZSBhcmUgYSA2NC1iaXQgZGVjb2RlciB0aGVuIGluY3JlbWVudCB0byB0aGUKLQkJICogdXBwZXIgMzIgYml0cyBvZiB0aGUgYmFyIGFuZCBmb3JjZSBpdCB0byBsb2NhdGUKLQkJICogaW4gdGhlIGxvd2VyIDRHQiBvZiBtZW1vcnkuCi0JCSAqLwotCQlpZiAoZm91bmRfbWVtNjQpIHsKLQkJCWJhciArPSA0OwotCQkJZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsCi0JCQkJCQkgY3VycmVudF9idXMsCi0JCQkJCQkgcGNpX2RldmZuLAotCQkJCQkJIGJhciwKLQkJCQkJCSAweDAwMDAwMDAwKTsKLQkJfQotCi0JCURCRygiIGF0IDB4JS44eCBbc2l6ZT0weCV4XVxuIiwgYmFyX3ZhbHVlLCBiYXJfc2l6ZSk7Ci0KLQkJYmFyX25yKys7Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdAotcGNpYXV0b19wcmVzY2FuX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UsCi0JCQkgICAgIGludCB0b3BfYnVzLAotCQkJICAgICBpbnQgY3VycmVudF9idXMsCi0JCQkgICAgIGludCBwY2lfZGV2Zm4sCi0JCQkgICAgIGludCBzdWJfYnVzKQotewotCS8qIENvbmZpZ3VyZSBidXMgbnVtYmVyIHJlZ2lzdGVycyAqLwotCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgUENJX1BSSU1BUllfQlVTLCBjdXJyZW50X2J1cyk7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJCQlQQ0lfU0VDT05EQVJZX0JVUywgc3ViX2J1cyArIDEpOwotCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCQkJUENJX1NVQk9SRElOQVRFX0JVUywgMHhmZik7Ci0KLQkvKiBBbGlnbiBtZW1vcnkgYW5kIEkvTyB0byAxTUIgYW5kIDRLQiBib3VuZGFyaWVzLiAqLwotCXBjaWF1dG9fbG93ZXJfbWVtc3BjID0gKHBjaWF1dG9fbG93ZXJfbWVtc3BjICsgKDB4MTAwMDAwIC0gMSkpCi0JCSYgfigweDEwMDAwMCAtIDEpOwotCXBjaWF1dG9fbG93ZXJfaW9zcGMgPSAocGNpYXV0b19sb3dlcl9pb3NwYyArICgweDEwMDAgLSAxKSkKLQkJJiB+KDB4MTAwMCAtIDEpOwotCi0JLyogU2V0IGJhc2UgKGxvd2VyIGxpbWl0KSBvZiBhZGRyZXNzIHJhbmdlIGJlaGluZCBicmlkZ2UuICovCi0JZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJUENJX01FTU9SWV9CQVNFLCBwY2lhdXRvX2xvd2VyX21lbXNwYyA+PiAxNik7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJUENJX0lPX0JBU0UsIChwY2lhdXRvX2xvd2VyX2lvc3BjICYgMHgwMDAwZjAwMCkgPj4gOCk7Ci0JZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJUENJX0lPX0JBU0VfVVBQRVIxNiwgcGNpYXV0b19sb3dlcl9pb3NwYyA+PiAxNik7Ci0KLQkvKiBXZSBkb24ndCBzdXBwb3J0IHByZWZldGNoYWJsZSBtZW1vcnkgZm9yIG5vdywgc28gZGlzYWJsZSAqLwotCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCQkJUENJX1BSRUZfTUVNT1JZX0JBU0UsIDApOwotCWVhcmx5X3dyaXRlX2NvbmZpZ193b3JkKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCQkJUENJX1BSRUZfTUVNT1JZX0xJTUlULCAwKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0Ci1wY2lhdXRvX3Bvc3RzY2FuX3NldHVwX2JyaWRnZShzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UsCi0JCQkgICAgICBpbnQgdG9wX2J1cywKLQkJCSAgICAgIGludCBjdXJyZW50X2J1cywKLQkJCSAgICAgIGludCBwY2lfZGV2Zm4sCi0JCQkgICAgICBpbnQgc3ViX2J1cykKLXsKLQl1MzIgdGVtcDsKLQotCS8qCi0JICogW2pzdW5dIHdlIGFsd2F5cyBidW1wIHVwIGJhc2VsaW5lcyBhIGxpdHRsZSwgc28gdGhhdCBpZiB0aGVyZQotCSAqIG5vdGhpbmcgYmVoaW5kIFAyUCBicmlkZ2UsIHdlIGRvbid0IHdpbmQgdXAgb3ZlcmxhcHBpbmcgSU8vTUVNCi0JICogc3BhY2VzLgotCSAqLwotCXBjaWF1dG9fbG93ZXJfbWVtc3BjICs9IDE7Ci0JcGNpYXV0b19sb3dlcl9pb3NwYyArPSAxOwotCi0JLyogQ29uZmlndXJlIGJ1cyBudW1iZXIgcmVnaXN0ZXJzICovCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJCQlQQ0lfU1VCT1JESU5BVEVfQlVTLCBzdWJfYnVzKTsKLQotCS8qIFNldCB1cHBlciBsaW1pdCBvZiBhZGRyZXNzIHJhbmdlIGJlaGluZCBicmlkZ2UuICovCi0JZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJUENJX01FTU9SWV9MSU1JVCwgcGNpYXV0b19sb3dlcl9tZW1zcGMgPj4gMTYpOwotCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCVBDSV9JT19MSU1JVCwgKHBjaWF1dG9fbG93ZXJfaW9zcGMgJiAweDAwMDBmMDAwKSA+PiA4KTsKLQllYXJseV93cml0ZV9jb25maWdfd29yZChob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQlQQ0lfSU9fTElNSVRfVVBQRVIxNiwgcGNpYXV0b19sb3dlcl9pb3NwYyA+PiAxNik7Ci0KLQkvKiBBbGlnbiBtZW1vcnkgYW5kIEkvTyB0byAxTUIgYW5kIDRLQiBib3VuZGFyaWVzLiAqLwotCXBjaWF1dG9fbG93ZXJfbWVtc3BjID0gKHBjaWF1dG9fbG93ZXJfbWVtc3BjICsgKDB4MTAwMDAwIC0gMSkpCi0JCSYgfigweDEwMDAwMCAtIDEpOwotCXBjaWF1dG9fbG93ZXJfaW9zcGMgPSAocGNpYXV0b19sb3dlcl9pb3NwYyArICgweDEwMDAgLSAxKSkKLQkJJiB+KDB4MTAwMCAtIDEpOwotCi0JLyogRW5hYmxlIG1lbW9yeSBhbmQgSS9PIGFjY2Vzc2VzLCBlbmFibGUgYnVzIG1hc3RlciAqLwotCWVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCVBDSV9DT01NQU5ELCAmdGVtcCk7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCVBDSV9DT01NQU5ELCB0ZW1wIHwgUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1PUlkKLQkJfCBQQ0lfQ09NTUFORF9NQVNURVIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLXBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9jYXJkYnVzX2JyaWRnZShzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UsCi0JCQlpbnQgdG9wX2J1cywKLQkJCWludCBjdXJyZW50X2J1cywKLQkJCWludCBwY2lfZGV2Zm4sCi0JCQlpbnQgc3ViX2J1cykKLXsKLQkvKiBDb25maWd1cmUgYnVzIG51bWJlciByZWdpc3RlcnMgKi8KLQllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQkJCVBDSV9QUklNQVJZX0JVUywgY3VycmVudF9idXMpOwotCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCQkJUENJX1NFQ09OREFSWV9CVVMsIHN1Yl9idXMgKyAxKTsKLQllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQkJCVBDSV9TVUJPUkRJTkFURV9CVVMsIDB4ZmYpOwotCi0JLyogQWxpZ24gbWVtb3J5IGFuZCBJL08gdG8gNEtCIGFuZCA0IGJ5dGUgYm91bmRhcmllcy4gKi8KLQlwY2lhdXRvX2xvd2VyX21lbXNwYyA9IChwY2lhdXRvX2xvd2VyX21lbXNwYyArICgweDEwMDAgLSAxKSkKLQkJJiB+KDB4MTAwMCAtIDEpOwotCXBjaWF1dG9fbG93ZXJfaW9zcGMgPSAocGNpYXV0b19sb3dlcl9pb3NwYyArICgweDQgLSAxKSkKLQkJJiB+KDB4NCAtIDEpOwotCi0JZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCVBDSV9DQl9NRU1PUllfQkFTRV8wLCBwY2lhdXRvX2xvd2VyX21lbXNwYyk7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCVBDSV9DQl9JT19CQVNFXzAsIHBjaWF1dG9fbG93ZXJfaW9zcGMpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQKLXBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfY2FyZGJ1c19icmlkZ2Uoc3RydWN0IHBjaV9jaGFubmVsICpob3NlLAotCQkJaW50IHRvcF9idXMsCi0JCQlpbnQgY3VycmVudF9idXMsCi0JCQlpbnQgcGNpX2RldmZuLAotCQkJaW50IHN1Yl9idXMpCi17Ci0JdTMyIHRlbXA7Ci0KLQkvKgotCSAqIFtqc3VuXSB3ZSBhbHdheXMgYnVtcCB1cCBiYXNlbGluZXMgYSBsaXR0bGUsIHNvIHRoYXQgaWYgdGhlcmUKLQkgKiBub3RoaW5nIGJlaGluZCBQMlAgYnJpZGdlLCB3ZSBkb24ndCB3aW5kIHVwIG92ZXJsYXBwaW5nIElPL01FTQotCSAqIHNwYWNlcy4KLQkgKi8KLQlwY2lhdXRvX2xvd2VyX21lbXNwYyArPSAxOwotCXBjaWF1dG9fbG93ZXJfaW9zcGMgKz0gMTsKLQotCS8qCi0JICogQ29uZmlndXJlIHN1Ym9yZGluYXRlIGJ1cyBudW1iZXIuICBUaGUgUENJIHN1YnN5c3RlbQotCSAqIGJ1cyBzY2FuIHdpbGwgcmVudW1iZXIgYnVzZXMgKHJlc2VydmluZyB0aHJlZSBhZGRpdGlvbmFsCi0JICogZm9yIHRoaXMgUENJPC0+Q2FyZEJ1cyBicmlkZ2UgZm9yIHRoZSBjYXNlIHdoZXJlIGEgQ2FyZEJ1cwotCSAqIGFkYXB0ZXIgY29udGFpbnMgYSBQMlAgb3IgQ0IyQ0IgYnJpZGdlLgotCSAqLwotCi0JZWFybHlfd3JpdGVfY29uZmlnX2J5dGUoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJCQlQQ0lfU1VCT1JESU5BVEVfQlVTLCBzdWJfYnVzKTsKLQotCS8qCi0JICogUmVzZXJ2ZSBhbiBhZGRpdGlvbmFsIDRNQiBmb3IgbWVtIHNwYWNlIGFuZCAxNktCIGZvcgotCSAqIEkvTyBzcGFjZS4gIFRoaXMgc2hvdWxkIGNvdmVyIGFueSBhZGRpdGlvbmFsIHNwYWNlCi0JICogcmVxdWlyZW1lbnQgb2YgdW51c3VhbCBDYXJkQnVzIGRldmljZXMgd2l0aAotCSAqIGFkZGl0aW9uYWwgYnJpZGdlcyB0aGF0IGNhbiBjb25zdW1lIG1vcmUgYWRkcmVzcyBzcGFjZS4KLQkgKgotCSAqIEFsdGhvdWdoIHBjbWNpYS1jcyBjdXJyZW50bHkgd2lsbCByZXByb2dyYW0gYnJpZGdlCi0JICogd2luZG93cywgdGhlIGdvYWwgaXMgdG8gYWRkIGFuIG9wdGlvbiB0byBsZWF2ZSB0aGVtCi0JICogYWxvbmUgYW5kIHVzZSB0aGUgYnJpZGdlIHdpbmRvdyByYW5nZXMgYXMgdGhlIHJlZ2lvbnMKLQkgKiB0aGF0IGFyZSBzZWFyY2hlZCBmb3IgZnJlZSByZXNvdXJjZXMgdXBvbiBob3QtaW5zZXJ0aW9uCi0JICogb2YgYSBkZXZpY2UuICBUaGlzIHdpbGwgYWxsb3cgYSBQQ0k8LT5DYXJkQnVzIGJyaWRnZQotCSAqIGNvbmZpZ3VyZWQgYnkgdGhpcyByb3V0aW5lIHRvIGhhcHBpbHkgbGl2ZSBiZWhpbmQgYQotCSAqIFAyUCBicmlkZ2UgaW4gYSBzeXN0ZW0uCi0JICovCi0JLyogQWxpZ24gbWVtb3J5IGFuZCBJL08gdG8gNEtCIGFuZCA0IGJ5dGUgYm91bmRhcmllcy4gKi8KLQlwY2lhdXRvX2xvd2VyX21lbXNwYyA9IChwY2lhdXRvX2xvd2VyX21lbXNwYyArICgweDEwMDAgLSAxKSkKLQkJJiB+KDB4MTAwMCAtIDEpOwotCXBjaWF1dG9fbG93ZXJfaW9zcGMgPSAocGNpYXV0b19sb3dlcl9pb3NwYyArICgweDQgLSAxKSkKLQkJJiB+KDB4NCAtIDEpOwotCS8qIFNldCB1cCBtZW1vcnkgYW5kIEkvTyBmaWx0ZXIgbGltaXRzLCBhc3N1bWUgMzItYml0IEkvTyBzcGFjZSAqLwotCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQlQQ0lfQ0JfTUVNT1JZX0xJTUlUXzAsIHBjaWF1dG9fbG93ZXJfbWVtc3BjIC0gMSk7Ci0JZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCVBDSV9DQl9JT19MSU1JVF8wLCBwY2lhdXRvX2xvd2VyX2lvc3BjIC0gMSk7Ci0KLQkvKiBFbmFibGUgbWVtb3J5IGFuZCBJL08gYWNjZXNzZXMsIGVuYWJsZSBidXMgbWFzdGVyICovCi0JZWFybHlfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJUENJX0NPTU1BTkQsICZ0ZW1wKTsKLQllYXJseV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJUENJX0NPTU1BTkQsIHRlbXAgfCBQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSB8Ci0JCVBDSV9DT01NQU5EX01BU1RFUik7Ci19Ci0KLSNkZWZpbmUJUENJQVVUT19JREVfTU9ERV9NQVNLCQkweDA1Ci0KLXN0YXRpYyBpbnQgX19pbml0Ci1wY2lhdXRvX2J1c19zY2FuKHN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSwgaW50IHRvcF9idXMsIGludCBjdXJyZW50X2J1cykKLXsKLQlpbnQgc3ViX2J1czsKLQl1MzIgcGNpX2RldmZuLCBwY2lfY2xhc3MsIGNtZHN0YXQsIGZvdW5kX211bHRpPTA7Ci0JdW5zaWduZWQgc2hvcnQgdmlkLCBkaWQ7Ci0JdW5zaWduZWQgY2hhciBoZWFkZXJfdHlwZTsKLQlpbnQgZGV2Zm5fc3RhcnQgPSAwOwotCWludCBkZXZmbl9zdG9wID0gMHhmZjsKLQotCXN1Yl9idXMgPSBjdXJyZW50X2J1czsKLQotCWlmIChob3NlLT5maXJzdF9kZXZmbikKLQkJZGV2Zm5fc3RhcnQgPSBob3NlLT5maXJzdF9kZXZmbjsKLQlpZiAoaG9zZS0+bGFzdF9kZXZmbikKLQkJZGV2Zm5fc3RvcCA9IGhvc2UtPmxhc3RfZGV2Zm47Ci0KLQlmb3IgKHBjaV9kZXZmbj1kZXZmbl9zdGFydDsgcGNpX2RldmZuPGRldmZuX3N0b3A7IHBjaV9kZXZmbisrKSB7Ci0KLQkJaWYgKFBDSV9GVU5DKHBjaV9kZXZmbikgJiYgIWZvdW5kX211bHRpKQotCQkJY29udGludWU7Ci0KLQkJZWFybHlfcmVhZF9jb25maWdfd29yZChob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQkJCSAgICAgICBQQ0lfVkVORE9SX0lELCAmdmlkKTsKLQotCQlpZiAodmlkID09IDB4ZmZmZikgY29udGludWU7Ci0KLQkJZWFybHlfcmVhZF9jb25maWdfYnl0ZShob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQkJCSAgICAgICBQQ0lfSEVBREVSX1RZUEUsICZoZWFkZXJfdHlwZSk7Ci0KLQkJaWYgKCFQQ0lfRlVOQyhwY2lfZGV2Zm4pKQotCQkJZm91bmRfbXVsdGkgPSBoZWFkZXJfdHlwZSAmIDB4ODA7Ci0KLQkJZWFybHlfcmVhZF9jb25maWdfd29yZChob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQkJCSAgICAgICBQQ0lfREVWSUNFX0lELCAmZGlkKTsKLQotCQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQkJCQlQQ0lfQ0xBU1NfUkVWSVNJT04sICZwY2lfY2xhc3MpOwotCi0JCURCRygiJS4yeDolLjJ4LiV4IENsYXNzICUuNHg6ICUuNHg6JS40eCIsCi0JCQljdXJyZW50X2J1cywgUENJX1NMT1QocGNpX2RldmZuKSwgUENJX0ZVTkMocGNpX2RldmZuKSwKLQkJCXBjaV9jbGFzcyA+PiAxNiwgdmlkLCBkaWQpOwotCQlpZiAocGNpX2NsYXNzICYgMHhmZikKLQkJCURCRygiIChyZXYgJS4yeCkiLCBwY2lfY2xhc3MgJiAweGZmKTsKLQkJREJHKCJcbiIpOwotCi0JCWlmICgocGNpX2NsYXNzID4+IDE2KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSkgewotCQkJREJHKCIgICAgICAgIEJyaWRnZTogcHJpbWFyeT0lLjJ4LCBzZWNvbmRhcnk9JS4yeFxuIiwKLQkJCQljdXJyZW50X2J1cywgc3ViX2J1cyArIDEpOwotCQkJcGNpYXV0b19wcmVzY2FuX3NldHVwX2JyaWRnZShob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywKLQkJCQkJCSAgICAgcGNpX2RldmZuLCBzdWJfYnVzKTsKLQkJCURCRygiU2Nhbm5pbmcgc3ViIGJ1cyAlLjJ4LCBJL08gMHglLjh4LCBNZW0gMHglLjh4XG4iLAotCQkJCXN1Yl9idXMgKyAxLAotCQkJCXBjaWF1dG9fbG93ZXJfaW9zcGMsIHBjaWF1dG9fbG93ZXJfbWVtc3BjKTsKLQkJCXN1Yl9idXMgPSBwY2lhdXRvX2J1c19zY2FuKGhvc2UsIHRvcF9idXMsIHN1Yl9idXMrMSk7Ci0JCQlEQkcoIkJhY2sgdG8gYnVzICUuMnhcbiIsIGN1cnJlbnRfYnVzKTsKLQkJCXBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfYnJpZGdlKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLAotCQkJCQkJCXBjaV9kZXZmbiwgc3ViX2J1cyk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICgocGNpX2NsYXNzID4+IDE2KSA9PSBQQ0lfQ0xBU1NfQlJJREdFX0NBUkRCVVMpIHsKLQkJCURCRygiICBDQVJEQlVTICBCcmlkZ2U6IHByaW1hcnk9JS4yeCwgc2Vjb25kYXJ5PSUuMnhcbiIsCi0JCQkJY3VycmVudF9idXMsIHN1Yl9idXMgKyAxKTsKLQkJCURCRygiUENJIEF1dG9jb25maWc6IEZvdW5kIENhcmRCdXMgYnJpZGdlLCBkZXZpY2UgJWQgZnVuY3Rpb24gJWRcbiIsIFBDSV9TTE9UKHBjaV9kZXZmbiksIFBDSV9GVU5DKHBjaV9kZXZmbikpOwotCQkJLyogUGxhY2UgQ2FyZEJ1cyBTb2NrZXQvRXhDQSByZWdpc3RlcnMgKi8KLQkJCXBjaWF1dG9fc2V0dXBfYmFycyhob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLCBQQ0lfQkFTRV9BRERSRVNTXzApOwotCi0JCQlwY2lhdXRvX3ByZXNjYW5fc2V0dXBfY2FyZGJ1c19icmlkZ2UoaG9zZSwgdG9wX2J1cywKLQkJCQkJY3VycmVudF9idXMsIHBjaV9kZXZmbiwgc3ViX2J1cyk7Ci0KLQkJCURCRygiU2Nhbm5pbmcgc3ViIGJ1cyAlLjJ4LCBJL08gMHglLjh4LCBNZW0gMHglLjh4XG4iLAotCQkJCXN1Yl9idXMgKyAxLAotCQkJCXBjaWF1dG9fbG93ZXJfaW9zcGMsIHBjaWF1dG9fbG93ZXJfbWVtc3BjKTsKLQkJCXN1Yl9idXMgPSBwY2lhdXRvX2J1c19zY2FuKGhvc2UsIHRvcF9idXMsIHN1Yl9idXMrMSk7Ci0JCQlEQkcoIkJhY2sgdG8gYnVzICUuMngsIHN1Yl9idXMgaXMgJXhcbiIsIGN1cnJlbnRfYnVzLCBzdWJfYnVzKTsKLQkJCXBjaWF1dG9fcG9zdHNjYW5fc2V0dXBfY2FyZGJ1c19icmlkZ2UoaG9zZSwgdG9wX2J1cywKLQkJCQkJY3VycmVudF9idXMsIHBjaV9kZXZmbiwgc3ViX2J1cyk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICgocGNpX2NsYXNzID4+IDE2KSA9PSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpIHsKLQotCQkJdW5zaWduZWQgY2hhciBwcmdfaWZhY2U7Ci0KLQkJCWVhcmx5X3JlYWRfY29uZmlnX2J5dGUoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsCi0JCQkJcGNpX2RldmZuLCBQQ0lfQ0xBU1NfUFJPRywgJnByZ19pZmFjZSk7Ci0JCQlpZiAoIShwcmdfaWZhY2UgJiBQQ0lBVVRPX0lERV9NT0RFX01BU0spKSB7Ci0JCQkJREJHKCJTa2lwcGluZyBsZWdhY3kgbW9kZSBJREUgY29udHJvbGxlclxuIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBGb3VuZCBhIHBlcmlwaGVyYWwsIGVuYWJsZSBzb21lIHN0YW5kYXJkCi0JCSAqIHNldHRpbmdzCi0JCSAqLwotCQllYXJseV9yZWFkX2NvbmZpZ19kd29yZChob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLAotCQkJCQlQQ0lfQ09NTUFORCwgJmNtZHN0YXQpOwotCQllYXJseV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgdG9wX2J1cywgY3VycmVudF9idXMsIHBjaV9kZXZmbiwKLQkJCQkJIFBDSV9DT01NQU5ELCBjbWRzdGF0IHwgUENJX0NPTU1BTkRfSU8gfAotCQkJCQkgUENJX0NPTU1BTkRfTUVNT1JZIHwKLQkJCQkJIFBDSV9DT01NQU5EX01BU1RFUik7Ci0JCWVhcmx5X3dyaXRlX2NvbmZpZ19ieXRlKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sCi0JCQkJCVBDSV9MQVRFTkNZX1RJTUVSLCAweDgwKTsKLQotCQkvKiBBbGxvY2F0ZSBQQ0kgSS9PIGFuZC9vciBtZW1vcnkgc3BhY2UgKi8KLQkJcGNpYXV0b19zZXR1cF9iYXJzKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sIFBDSV9CQVNFX0FERFJFU1NfNSk7Ci0JfQotCXJldHVybiBzdWJfYnVzOwotfQotCi1pbnQgX19pbml0Ci1wY2lhdXRvX2Fzc2lnbl9yZXNvdXJjZXMoaW50IGJ1c25vLCBzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UpCi17Ci0JLyogc2V0dXAgcmVzb3VyY2UgbGltaXRzICovCi0JaW9fcmVzb3VyY2VfaW51c2UgPSBob3NlLT5pb19yZXNvdXJjZTsKLQltZW1fcmVzb3VyY2VfaW51c2UgPSBob3NlLT5tZW1fcmVzb3VyY2U7Ci0KLQlwY2lhdXRvX2xvd2VyX2lvc3BjID0gaW9fcmVzb3VyY2VfaW51c2UtPnN0YXJ0OwotCXBjaWF1dG9fdXBwZXJfaW9zcGMgPSBpb19yZXNvdXJjZV9pbnVzZS0+ZW5kICsgMTsKLQlwY2lhdXRvX2xvd2VyX21lbXNwYyA9IG1lbV9yZXNvdXJjZV9pbnVzZS0+c3RhcnQ7Ci0JcGNpYXV0b191cHBlcl9tZW1zcGMgPSBtZW1fcmVzb3VyY2VfaW51c2UtPmVuZCArIDE7Ci0JREJHKCJBdXRvY29uZmlnIFBDSSBjaGFubmVsIDB4JXBcbiIsIGhvc2UpOwotCURCRygiU2Nhbm5pbmcgYnVzICUuMngsIEkvTyAweCUuOHg6MHglLjh4LCBNZW0gMHglLjh4OjB4JS44eFxuIiwKLQkJYnVzbm8sIHBjaWF1dG9fbG93ZXJfaW9zcGMsIHBjaWF1dG9fdXBwZXJfaW9zcGMsIAotCQlwY2lhdXRvX2xvd2VyX21lbXNwYywgcGNpYXV0b191cHBlcl9tZW1zcGMpOwotCi0JcmV0dXJuIHBjaWF1dG9fYnVzX3NjYW4oaG9zZSwgYnVzbm8sIGJ1c25vKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLWRyZWFtY2FzdC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktZHJlYW1jYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEwZjlkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLWRyZWFtY2FzdC5jCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogUENJIHN1cHBvcnQgZm9yIHRoZSBTZWdhIERyZWFtY2FzdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiAgTS4gUi4gQnJvd24KKyAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBvcmlnaW5hbGx5IGJvcmUgdGhlIG1lc3NhZ2UgKHdpdGggZW5jbG9zZWQtJCk6CisgKglJZDogcGNpLmMsdiAxLjMgMjAwMy8wNS8wNCAxOToyOTo0NiBsZXRoYWwgRXhwCisgKglEcmVhbWNhc3QgUENJOiBTdXBwb3J0cyBTRUdBIEJyb2FkYmFuZCBBZGFwdG9yIG9ubHkuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPG1hY2gvcGNpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZ2Fwc3BjaV9pb19yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJHQVBTUENJIElPIiwKKwkuc3RhcnQJPSBHQVBTUENJX0JCQV9DT05GSUcsCisJLmVuZAk9IEdBUFNQQ0lfQkJBX0NPTkZJRyArIEdBUFNQQ0lfQkJBX0NPTkZJR19TSVpFIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnYXBzcGNpX21lbV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJHQVBTUENJIG1lbSIsCisJLnN0YXJ0CT0gR0FQU1BDSV9ETUFfQkFTRSwKKwkuZW5kCT0gR0FQU1BDSV9ETUFfQkFTRSArIEdBUFNQQ0lfRE1BX1NJWkUgLSAxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfY2hhbm5lbCBkcmVhbWNhc3RfcGNpX2NvbnRyb2xsZXIgPSB7CisJLnBjaV9vcHMJPSAmZ2Fwc3BjaV9wY2lfb3BzLAorCS5pb19yZXNvdXJjZQk9ICZnYXBzcGNpX2lvX3Jlc291cmNlLAorCS5pb19vZmZzZXQJPSAweDAwMDAwMDAwLAorCS5tZW1fcmVzb3VyY2UJPSAmZ2Fwc3BjaV9tZW1fcmVzb3VyY2UsCisJLm1lbV9vZmZzZXQJPSAweDAwMDAwMDAwLAorfTsKKworLyoKKyAqIGdhcHNwY2kgaW5pdAorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGdhcHNwY2lfaW5pdCh2b2lkKQoreworCWNoYXIgaWRidWZbMTZdOworCWludCBpOworCisJLyoKKwkgKiBGSVhNRTogQWxsIG9mIHRoaXMgd2FudHMgZG9jdW1lbnRpbmcgdG8gc29tZSBkZWdyZWUsCisJICogZXZlbiBzb21lIGJhc2ljIHJlZ2lzdGVyIGRlZmluaXRpb25zIHdvdWxkIGJlIG5pY2UuCisJICoKKwkgKiBJIGhhdmVuJ3Qgc2VlbiBhbnl0aGluZyB0aGlzIHVnbHkgc2luY2UuLiBtYXBsZS4KKwkgKi8KKworCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCWlkYnVmW2ldID0gaW5iKEdBUFNQQ0lfUkVHUytpKTsKKworCWlmIChzdHJuY21wKGlkYnVmLCAiR0FQU1BDSV9CUklER0VfMiIsIDE2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvdXRsKDB4NWExNGE1MDEsIEdBUFNQQ0lfUkVHUysweDE4KTsKKworCWZvciAoaT0wOyBpPDEwMDAwMDA7IGkrKykKKwkJY3B1X3JlbGF4KCk7CisKKwlpZiAoaW5sKEdBUFNQQ0lfUkVHUysweDE4KSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW91dGwoMHgwMTAwMDAwMCwgR0FQU1BDSV9SRUdTKzB4MjApOworCW91dGwoMHgwMTAwMDAwMCwgR0FQU1BDSV9SRUdTKzB4MjQpOworCisJb3V0bChHQVBTUENJX0RNQV9CQVNFLCBHQVBTUENJX1JFR1MrMHgyOCk7CisJb3V0bChHQVBTUENJX0RNQV9CQVNFK0dBUFNQQ0lfRE1BX1NJWkUsIEdBUFNQQ0lfUkVHUysweDJjKTsKKworCW91dGwoMSwgR0FQU1BDSV9SRUdTKzB4MTQpOworCW91dGwoMSwgR0FQU1BDSV9SRUdTKzB4MzQpOworCisJLyogU2V0dGluZyBCcm9hZGJhbmQgQWRhcHRlciAqLworCW91dHcoMHhmOTAwLCBHQVBTUENJX0JCQV9DT05GSUcrMHgwNik7CisJb3V0bCgweDAwMDAwMDAwLCBHQVBTUENJX0JCQV9DT05GSUcrMHgzMCk7CisJb3V0YigweDAwLCBHQVBTUENJX0JCQV9DT05GSUcrMHgzYyk7CisJb3V0YigweGYwLCBHQVBTUENJX0JCQV9DT05GSUcrMHgwZCk7CisJb3V0dygweDAwMDYsIEdBUFNQQ0lfQkJBX0NPTkZJRysweDA0KTsKKwlvdXRsKDB4MDAwMDIwMDEsIEdBUFNQQ0lfQkJBX0NPTkZJRysweDEwKTsKKwlvdXRsKDB4MDEwMDAwMDAsIEdBUFNQQ0lfQkJBX0NPTkZJRysweDE0KTsKKworCXJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKCZkcmVhbWNhc3RfcGNpX2NvbnRyb2xsZXIpOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKGdhcHNwY2lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDQuaCBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNC5oCmluZGV4IGE4M2RjZjcuLjNkNTI5NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNC5oCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNC5oCkBAIC0xNDksMTMgKzE0OSwxMCBAQAogICAjZGVmaW5lIFNINF9QQ0lQRFRSX1BCMAkgIDB4MDAwMDAwMDAxCS8qIFBvcnQgMCBFbmFibGUgKi8KICNkZWZpbmUgU0g0X1BDSVBEUgkJMHgyMjAJCS8qIFBvcnQgSU8gRGF0YSBSZWdpc3RlciAqLwogCi0vKiBGbGFncyAqLwotI2RlZmluZSBTSDRfUENJQ19OT19SRVNFVAkweDAwMDEKLQogLyogYXJjaC9zaC9rZXJuZWwvZHJpdmVycy9wY2kvb3BzLXNoNC5jICovCiBleHRlcm4gc3RydWN0IHBjaV9vcHMgc2g0X3BjaV9vcHM7Ci1pbnQgc2g0X3BjaV9jaGVja19kaXJlY3Qodm9pZCk7Ci1pbnQgcGNpX2ZpeHVwX3BjaWModm9pZCk7CitpbnQgc2g0X3BjaV9jaGVja19kaXJlY3Qoc3RydWN0IHBjaV9jaGFubmVsICpjaGFuKTsKK2ludCBwY2lfZml4dXBfcGNpYyhzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4pOwogCiBzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX3NwYWNlIHsKIAl1bnNpZ25lZCBsb25nIGJhc2U7CkBAIC0xNjUsMTYgKzE2MiwxOCBAQAogc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgewogCXN0cnVjdCBzaDRfcGNpX2FkZHJlc3Nfc3BhY2Ugd2luZG93MDsKIAlzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX3NwYWNlIHdpbmRvdzE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIH07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfd3JpdGVfcmVnKHVuc2lnbmVkIGxvbmcgdmFsLCB1bnNpZ25lZCBsb25nIHJlZykKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfd3JpdGVfcmVnKHN0cnVjdCBwY2lfY2hhbm5lbCAqY2hhbiwKKwkJCQkgdW5zaWduZWQgbG9uZyB2YWwsIHVuc2lnbmVkIGxvbmcgcmVnKQogewotCWN0cmxfb3V0bCh2YWwsIFBDSV9SRUcocmVnKSk7CisJY3RybF9vdXRsKHZhbCwgY2hhbi0+cmVnX2Jhc2UgKyByZWcpOwogfQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGNpX3JlYWRfcmVnKHVuc2lnbmVkIGxvbmcgcmVnKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9yZWFkX3JlZyhzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4sCisJCQkJCSB1bnNpZ25lZCBsb25nIHJlZykKIHsKLQlyZXR1cm4gY3RybF9pbmwoUENJX1JFRyhyZWcpKTsKKwlyZXR1cm4gY3RybF9pbmwoY2hhbi0+cmVnX2Jhc2UgKyByZWcpOwogfQorCiAjZW5kaWYgLyogX19QQ0lfU0g0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmMKaW5kZXggN2E5NzQzOC4uODczZWQyYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmMKQEAgLTg5LDggKzg5LDIxIEBACiAJcmV0dXJuIElSUV9OT05FOwogfQogCi1pbnQgX19pbml0IHNoNXBjaV9pbml0KHVuc2lnbmVkIGxvbmcgbWVtU3RhcnQsIHVuc2lnbmVkIGxvbmcgbWVtU2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g1X2lvX3Jlc291cmNlID0geyAvKiBwbGFjZSBob2xkZXIgKi8gfTsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g1X21lbV9yZXNvdXJjZSA9IHsgLyogcGxhY2UgaG9sZGVyICovIH07CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NoYW5uZWwgc2g1cGNpX2NvbnRyb2xsZXIgPSB7CisJLnBjaV9vcHMJCT0gJnNoNV9wY2lfb3BzLAorCS5tZW1fcmVzb3VyY2UJCT0gJnNoNV9tZW1fcmVzb3VyY2UsCisJLm1lbV9vZmZzZXQJCT0gMHgwMDAwMDAwMCwKKwkuaW9fcmVzb3VyY2UJCT0gJnNoNV9pb19yZXNvdXJjZSwKKwkuaW9fb2Zmc2V0CQk9IDB4MDAwMDAwMDAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDVwY2lfaW5pdCh2b2lkKQogeworCXVuc2lnbmVkIGxvbmcgbWVtU3RhcnQgPSBfX3BhKG1lbW9yeV9zdGFydCk7CisJdW5zaWduZWQgbG9uZyBtZW1TaXplID0gX19wYShtZW1vcnlfZW5kKSAtIG1lbVN0YXJ0OwogCXUzMiBsc3IwOwogCXUzMiB1dmFsOwogCkBAIC0xMDYsMTIgKzExOSwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAKLQlwY2ljcl92aXJ0ID0gb25jaGlwX3JlbWFwKFNINVBDSV9JQ1JfQkFTRSwgMTAyNCwgIlBDSUNSIik7CisJcGNpY3JfdmlydCA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXBfbm9jYWNoZShTSDVQQ0lfSUNSX0JBU0UsIDEwMjQpOwogCWlmICghcGNpY3JfdmlydCkgewogCQlwYW5pYygiVW5hYmxlIHRvIHJlbWFwIFBDSUNSXG4iKTsKIAl9CiAKLQlQQ0lfSU9fQVJFQSA9IG9uY2hpcF9yZW1hcChTSDVQQ0lfSU9fQkFTRSwgMHgxMDAwMCwgIlBDSUlPIik7CisJUENJX0lPX0FSRUEgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUoU0g1UENJX0lPX0JBU0UsIDB4MTAwMDApOwogCWlmICghUENJX0lPX0FSRUEpIHsKIAkJcGFuaWMoIlVuYWJsZSB0byByZW1hcCBQQ0lJT1xuIik7CiAJfQpAQCAtMTk3LDMyICsyMTAsMTQgQEAKICAgICAgICAgU0g1UENJX1dSSVRFKEFJTlRNLCB+MCk7CiAgICAgICAgIFNINVBDSV9XUklURShQSU5UTSwgfjApOwogCisJc2g1X2lvX3Jlc291cmNlLnN0YXJ0ID0gUENJX0lPX0FSRUE7CisJc2g1X2lvX3Jlc291cmNlLmVuZCA9IFBDSV9JT19BUkVBICsgMHgxMDAwMDsKKworCXNoNV9tZW1fcmVzb3VyY2Uuc3RhcnQgPSBtZW1TdGFydDsKKwlzaDVfbWVtX3Jlc291cmNlLmVuZCA9IG1lbVN0YXJ0ICsgbWVtU2l6ZTsKKworCXJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKCZzaDVwY2lfY29udHJvbGxlcik7CisKIAlyZXR1cm4gMDsKIH0KLQotdm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gYnVzLT5zZWxmOwotCWludCBpOwotCi0JaWYgKGRldikgewotCQlmb3IgKGk9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWJ1cy0+cmVzb3VyY2VbaV0gPQotCQkJCSZkZXYtPnJlc291cmNlW1BDSV9CUklER0VfUkVTT1VSQ0VTK2ldOwotCQkJYnVzLT5yZXNvdXJjZVtpXS0+bmFtZSA9IGJ1cy0+bmFtZTsKLQkJfQotCQlidXMtPnJlc291cmNlWzBdLT5mbGFncyB8PSBJT1JFU09VUkNFX0lPOwotCQlidXMtPnJlc291cmNlWzFdLT5mbGFncyB8PSBJT1JFU09VUkNFX01FTTsKLQotCQkvKiBGb3Igbm93LCBwcm9wYWdhdGUgaG9zdCBsaW1pdHMgdG8gdGhlIGJ1czsKLQkJICogd2UnbGwgYWRqdXN0IHRoZW0gbGF0ZXIuICovCi0JCWJ1cy0+cmVzb3VyY2VbMF0tPmVuZCA9IDY0KjEwMjQgLSAxIDsKLQkJYnVzLT5yZXNvdXJjZVsxXS0+ZW5kID0gUENJQklPU19NSU5fTUVNKygyNTYqMTAyNCoxMDI0KS0xOwotCQlidXMtPnJlc291cmNlWzBdLT5zdGFydCA9IFBDSUJJT1NfTUlOX0lPOwotCQlidXMtPnJlc291cmNlWzFdLT5zdGFydCA9IFBDSUJJT1NfTUlOX01FTTsKLQotCQkvKiBUdXJuIG9mZiBkb3duc3RyZWFtIFBGIG1lbW9yeSBhZGRyZXNzIHJhbmdlIGJ5IGRlZmF1bHQgKi8KLQkJYnVzLT5yZXNvdXJjZVsyXS0+c3RhcnQgPSAxMDI0KjEwMjQ7Ci0JCWJ1cy0+cmVzb3VyY2VbMl0tPmVuZCA9IGJ1cy0+cmVzb3VyY2VbMl0tPnN0YXJ0IC0gMTsKLQl9Ci19CithcmNoX2luaXRjYWxsKHNoNXBjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNS5oIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmgKaW5kZXggN2NmZjNmYy4uZjI3NzYyOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmgKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g1LmgKQEAgLTEwNyw3ICsxMDcsNCBAQAogCiBleHRlcm4gc3RydWN0IHBjaV9vcHMgc2g1X3BjaV9vcHM7CiAKLS8qIGFyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNS5jICovCi1pbnQgc2g1cGNpX2luaXQodW5zaWduZWQgbG9uZyBtZW1TdGFydCwgdW5zaWduZWQgbG9uZyBtZW1TaXplKTsKLQogI2VuZGlmIC8qIF9fUENJX1NINV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5jCmluZGV4IDMwNjVlYjE4NC4uNzBjMTk5OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmMKQEAgLTEsMTE0ICsxLDExMSBAQAogLyoKLSAqCUxvdy1MZXZlbCBQQ0kgU3VwcG9ydCBmb3IgdGhlIFNINzc1MQorICogTG93LUxldmVsIFBDSSBTdXBwb3J0IGZvciB0aGUgU0g3NzUxCiAgKgotICogIER1c3RpbiBNY0ludGlyZSAoZHVzdGluQHNlbnNvcmlhLmNvbSkKLSAqCURlcml2ZWQgZnJvbSBhcmNoL2kzODYva2VybmVsL3BjaS0qLmMgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqCShjKSAxOTk5LS0yMDAwIE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6PgorICogIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDkgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgIER1c3RpbiBNY0ludGlyZQogICoKLSAqICBQb3J0ZWQgdG8gdGhlIG5ldyBBUEkgYnkgUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KLSAqICBXaXRoIGNsZWFudXAgYnkgUGF1bCB2YW4gR29vbCA8cHZhbmdvb2xAbWltb3RlY2guY29tPgorICogIFdpdGggY2xlYW51cCBieSBQYXVsIHZhbiBHb29sIDxwdmFuZ29vbEBtaW1vdGVjaC5jb20+LCAyMDAzLgogICoKLSAqICBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiAgTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0jdW5kZWYgREVCVUcKLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgInBjaS1zaDQuaCIKICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAKLS8qCi0gKiBJbml0aWFsaXphdGlvbi4gVHJ5IGFsbCBrbm93biBQQ0kgYWNjZXNzIG1ldGhvZHMuIE5vdGUgdGhhdCB3ZSBzdXBwb3J0Ci0gKiB1c2luZyBib3RoIFBDSSBCSU9TIGFuZCBkaXJlY3QgYWNjZXNzOiBpbiBzdWNoIGNhc2VzLCB3ZSB1c2UgSS9PIHBvcnRzCi0gKiB0byBhY2Nlc3MgY29uZmlnIHNwYWNlLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKEJTQyByZWdpc3RlcnMsIGFuZCBtZW1vcnkKLSAqIHNwYWNlIG1hcHBpbmcpIHdpbGwgYmUgY2FsbGVkIHZpYSB0aGUgcGxhdGZvcm0gZGVmaW5lZCBmdW5jdGlvbgotICogcGNpYmlvc19pbml0X3BsYXRmb3JtKCkuCi0gKi8KK3N0YXRpYyBpbnQgX19pbml0IF9fYXJlYV9zZHJhbV9jaGVjayhzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgYXJlYSkKK3sKKwl1bnNpZ25lZCBsb25nIHdvcmQ7CisKKwl3b3JkID0gX19yYXdfcmVhZGwoU0g3NzUxX0JDUjEpOworCS8qIGNoZWNrIEJDUiBmb3IgU0RSQU0gaW4gYXJlYSAqLworCWlmICgoKHdvcmQgPj4gYXJlYSkgJiAxKSA9PSAwKSB7CisJCXByaW50aygiUENJOiBBcmVhICVkIGlzIG5vdCBjb25maWd1cmVkIGZvciBTRFJBTS4gQkNSMT0weCVseFxuIiwKKwkJICAgICAgIGFyZWEsIHdvcmQpOworCQlyZXR1cm4gMDsKKwl9CisJcGNpX3dyaXRlX3JlZyhjaGFuLCB3b3JkLCBTSDRfUENJQkNSMSk7CisKKwl3b3JkID0gX19yYXdfcmVhZHcoU0g3NzUxX0JDUjIpOworCS8qIGNoZWNrIEJDUjIgZm9yIDMyYml0IFNEUkFNIGludGVyZmFjZSovCisJaWYgKCgod29yZCA+PiAoYXJlYSA8PCAxKSkgJiAweDMpICE9IDB4MykgeworCQlwcmludGsoIlBDSTogQXJlYSAlZCBpcyBub3QgMzIgYml0IFNEUkFNLiBCQ1IyPTB4JWx4XG4iLAorCQkgICAgICAgYXJlYSwgd29yZCk7CisJCXJldHVybiAwOworCX0KKwlwY2lfd3JpdGVfcmVnKGNoYW4sIHdvcmQsIFNINF9QQ0lCQ1IyKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9pb19yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJTSDc3NTFfSU8iLAorCS5zdGFydAk9IFNINzc1MV9QQ0lfSU9fQkFTRSwKKwkuZW5kCT0gU0g3NzUxX1BDSV9JT19CQVNFICsgU0g3NzUxX1BDSV9JT19TSVpFIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9tZW1fcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAiU0g3NzUxX21lbSIsCisJLnN0YXJ0CT0gU0g3NzUxX1BDSV9NRU1PUllfQkFTRSwKKwkuZW5kCT0gU0g3NzUxX1BDSV9NRU1PUllfQkFTRSArIFNINzc1MV9QQ0lfTUVNX1NJWkUgLSAxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9jaGFubmVsIHNoNzc1MV9wY2lfY29udHJvbGxlciA9IHsKKwkucGNpX29wcwk9ICZzaDRfcGNpX29wcywKKwkubWVtX3Jlc291cmNlCT0gJnNoNzc1MV9tZW1fcmVzb3VyY2UsCisJLm1lbV9vZmZzZXQJPSAweDAwMDAwMDAwLAorCS5pb19yZXNvdXJjZQk9ICZzaDc3NTFfaW9fcmVzb3VyY2UsCisJLmlvX29mZnNldAk9IDB4MDAwMDAwMDAsCisJLmlvX21hcF9iYXNlCT0gU0g3NzUxX1BDSV9JT19CQVNFLAorfTsKKworc3RhdGljIHN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwIHNoNzc1MV9wY2lfbWFwID0geworCS53aW5kb3cwCT0geworCQkuYmFzZQk9IFNINzc1MV9DUzNfQkFTRV9BRERSLAorCQkuc2l6ZQk9IDB4MDQwMDAwMDAsCisJfSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHNoNzc1MV9wY2lfaW5pdCh2b2lkKQogeworCXN0cnVjdCBwY2lfY2hhbm5lbCAqY2hhbiA9ICZzaDc3NTFfcGNpX2NvbnRyb2xsZXI7CiAJdW5zaWduZWQgaW50IGlkOworCXUzMiB3b3JkLCByZWc7CiAJaW50IHJldDsKIAotCXByX2RlYnVnKCJQQ0k6IFN0YXJ0aW5nIGludGlhbGl6YXRpb24uXG4iKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlBDSTogU3RhcnRpbmcgaW50aWFsaXphdGlvbi5cbiIpOworCisJY2hhbi0+cmVnX2Jhc2UgPSAweGZlMjAwMDAwOwogCiAJLyogY2hlY2sgZm9yIFNINzc1MS9TSDc3NTFSIGhhcmR3YXJlICovCi0JaWQgPSBwY2lfcmVhZF9yZWcoU0g3NzUxX1BDSUNPTkYwKTsKKwlpZCA9IHBjaV9yZWFkX3JlZyhjaGFuLCBTSDc3NTFfUENJQ09ORjApOwogCWlmIChpZCAhPSAoKFNINzc1MV9ERVZJQ0VfSUQgPDwgMTYpIHwgU0g3NzUxX1ZFTkRPUl9JRCkgJiYKIAkgICAgaWQgIT0gKChTSDc3NTFSX0RFVklDRV9JRCA8PCAxNikgfCBTSDc3NTFfVkVORE9SX0lEKSkgewogCQlwcl9kZWJ1ZygiUENJOiBUaGlzIGlzIG5vdCBhbiBTSDc3NTEoUikgKCV4KVxuIiwgaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoKHJldCA9IHNoNF9wY2lfY2hlY2tfZGlyZWN0KCkpICE9IDApCisJaWYgKChyZXQgPSBzaDRfcGNpX2NoZWNrX2RpcmVjdChjaGFuKSkgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiBwY2liaW9zX2luaXRfcGxhdGZvcm0oKTsKLX0KLXN1YnN5c19pbml0Y2FsbChzaDc3NTFfcGNpX2luaXQpOwotCi1zdGF0aWMgaW50IF9faW5pdCBfX2FyZWFfc2RyYW1fY2hlY2sodW5zaWduZWQgaW50IGFyZWEpCi17Ci0JdTMyIHdvcmQ7Ci0KLQl3b3JkID0gY3RybF9pbmwoU0g3NzUxX0JDUjEpOwotCS8qIGNoZWNrIEJDUiBmb3IgU0RSQU0gaW4gYXJlYSAqLwotCWlmICgoKHdvcmQgPj4gYXJlYSkgJiAxKSA9PSAwKSB7Ci0JCXByaW50aygiUENJOiBBcmVhICVkIGlzIG5vdCBjb25maWd1cmVkIGZvciBTRFJBTS4gQkNSMT0weCV4XG4iLAotCQkgICAgICAgYXJlYSwgd29yZCk7Ci0JCXJldHVybiAwOwotCX0KLQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lCQ1IxKTsKLQotCXdvcmQgPSAodTE2KWN0cmxfaW53KFNINzc1MV9CQ1IyKTsKLQkvKiBjaGVjayBCQ1IyIGZvciAzMmJpdCBTRFJBTSBpbnRlcmZhY2UqLwotCWlmICgoKHdvcmQgPj4gKGFyZWEgPDwgMSkpICYgMHgzKSAhPSAweDMpIHsKLQkJcHJpbnRrKCJQQ0k6IEFyZWEgJWQgaXMgbm90IDMyIGJpdCBTRFJBTS4gQkNSMj0weCV4XG4iLAotCQkgICAgICAgYXJlYSwgd29yZCk7Ci0JCXJldHVybiAwOwotCX0KLQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lCQ1IyKTsKLQotCXJldHVybiAxOwotfQotCi1pbnQgX19pbml0IHNoNzc1MV9wY2ljX2luaXQoc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgKm1hcCkKLXsKLQl1MzIgcmVnOwotCXUzMiB3b3JkOwotCiAJLyogU2V0IHRoZSBCQ1IncyB0byBlbmFibGUgUENJIGFjY2VzcyAqLwogCXJlZyA9IGN0cmxfaW5sKFNINzc1MV9CQ1IxKTsKIAlyZWcgfD0gMHg4MDAwMDsKIAljdHJsX291dGwocmVnLCBTSDc3NTFfQkNSMSk7CiAKIAkvKiBUdXJuIHRoZSBjbG9ja3MgYmFjayBvbiAobm90IGRvbmUgaW4gcmVzZXQpKi8KLQlwY2lfd3JpdGVfcmVnKDAsIFNINF9QQ0lDTEtSKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDAsIFNINF9QQ0lDTEtSKTsKIAkvKiBDbGVhciBQb3dlcmRvd24gSVJRJ3MgKG5vdCBkb25lIGluIHJlc2V0KSAqLwogCXdvcmQgPSBTSDRfUENJUElOVF9EMyB8IFNINF9QQ0lQSU5UX0QwOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSVBJTlQpOwotCi0JLyoKLQkgKiBUaGlzIGNvZGUgaXMgdW51c2VkIGZvciBzb21lIGJvYXJkcyBhcyBpdCBpcyBkb25lIGluIHRoZQotCSAqIGJvb3Rsb2FkZXIgYW5kIGRvaW5nIGl0IGhlcmUgbWVhbnMgdGhlIE1BQyBhZGRyZXNzZXMgbG9hZGVkCi0JICogYnkgdGhlIGJvb3Rsb2FkZXIgZ2V0IGxvc3QuCi0JICovCi0JaWYgKCEobWFwLT5mbGFncyAmIFNINF9QQ0lDX05PX1JFU0VUKSkgewotCQkvKiB0b2dnbGUgUENJIHJlc2V0IHBpbiAqLwotCQl3b3JkID0gU0g0X1BDSUNSX1BSRUZJWCB8IFNINF9QQ0lDUl9QUlNUOwotCQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lDUik7Ci0JCS8qIFdhaXQgZm9yIGEgbG9uZyB0aW1lLi4uIG5vdCAxIHNlYy4gYnV0IGxvbmcgZW5vdWdoICovCi0JCW1kZWxheSgxMDApOwotCQl3b3JkID0gU0g0X1BDSUNSX1BSRUZJWDsKLQkJcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJQ1IpOwotCX0KKwlwY2lfd3JpdGVfcmVnKGNoYW4sIHdvcmQsIFNINF9QQ0lQSU5UKTsKIAogCS8qIHNldCB0aGUgY29tbWFuZC9zdGF0dXMgYml0cyB0bzoKIAkgKiBXYWl0IEN5Y2xlIENvbnRyb2wgKyBQYXJpdHkgRW5hYmxlICsgQnVzIE1hc3RlciArCkBAIC0xMTYsODkgKzExMyw3NSBAQAogCSAqLwogCXdvcmQgPSBTSDc3NTFfUENJQ09ORjFfV0NDIHwgU0g3NzUxX1BDSUNPTkYxX1BFUiB8CiAJICAgICAgIFNINzc1MV9QQ0lDT05GMV9CVU0gfCBTSDc3NTFfUENJQ09ORjFfTUVTOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g3NzUxX1BDSUNPTkYxKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIHdvcmQsIFNINzc1MV9QQ0lDT05GMSk7CiAKIAkvKiBkZWZpbmUgdGhpcyBob3N0IGFzIHRoZSBob3N0IGJyaWRnZSAqLwogCXdvcmQgPSBQQ0lfQkFTRV9DTEFTU19CUklER0UgPDwgMjQ7Ci0JcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDc3NTFfUENJQ09ORjIpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgd29yZCwgU0g3NzUxX1BDSUNPTkYyKTsKIAogCS8qIFNldCBJTyBhbmQgTWVtIHdpbmRvd3MgdG8gbG9jYWwgYWRkcmVzcwogCSAqIE1ha2UgUENJIGFuZCBsb2NhbCBhZGRyZXNzIHRoZSBzYW1lIGZvciBlYXN5IDEgdG8gMSBtYXBwaW5nCi0JICogV2luZG93MCA9IG1hcC0+d2luZG93MC5zaXplIEAgbm9uLWNhY2hlZCBhcmVhIGJhc2UgPSBTRFJBTQotCSAqIFdpbmRvdzEgPSBtYXAtPndpbmRvdzEuc2l6ZSBAIGNhY2hlZCBhcmVhIGJhc2UgPSBTRFJBTQogCSAqLwotCXdvcmQgPSBtYXAtPndpbmRvdzAuc2l6ZSAtIDE7Ci0JcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJTFNSMCk7Ci0Jd29yZCA9IG1hcC0+d2luZG93MS5zaXplIC0gMTsKLQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lMU1IxKTsKKwl3b3JkID0gc2g3NzUxX3BjaV9tYXAud2luZG93MC5zaXplIC0gMTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIHdvcmQsIFNINF9QQ0lMU1IwKTsKIAkvKiBTZXQgdGhlIHZhbHVlcyBvbiB3aW5kb3cgMCBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLwotCXdvcmQgPSBQMlNFR0FERFIobWFwLT53aW5kb3cwLmJhc2UpOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSUxBUjApOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g3NzUxX1BDSUNPTkY1KTsKLQkvKiBTZXQgdGhlIHZhbHVlcyBvbiB3aW5kb3cgMSBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLwotCXdvcmQgPSAgUEhZU0FERFIobWFwLT53aW5kb3cxLmJhc2UpOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSUxBUjEpOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g3NzUxX1BDSUNPTkY2KTsKKwl3b3JkID0gUDJTRUdBRERSKHNoNzc1MV9wY2lfbWFwLndpbmRvdzAuYmFzZSk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCB3b3JkLCBTSDRfUENJTEFSMCk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCB3b3JkLCBTSDc3NTFfUENJQ09ORjUpOwogCiAJLyogU2V0IHRoZSBsb2NhbCAxNk1CIFBDSSBtZW1vcnkgc3BhY2Ugd2luZG93IHRvCiAJICogdGhlIGxvd2VzdCBQQ0kgbWFwcGVkIGFkZHJlc3MKIAkgKi8KLQl3b3JkID0gUENJQklPU19NSU5fTUVNICYgU0g0X1BDSU1CUl9NQVNLOworCXdvcmQgPSBjaGFuLT5tZW1fcmVzb3VyY2UtPnN0YXJ0ICYgU0g0X1BDSU1CUl9NQVNLOwogCXByX2RlYnVnKCJQQ0k6IFNldHRpbmcgdXBwZXIgYml0cyBvZiBNZW1vcnkgd2luZG93IHRvIDB4JXhcbiIsIHdvcmQpOwotCXBjaV93cml0ZV9yZWcod29yZCAsIFNINF9QQ0lNQlIpOwotCi0JLyogTWFwIElPIHNwYWNlIGludG8gUENJIElPIHdpbmRvdwotCSAqIFRoZSBJTyB3aW5kb3cgaXMgNjRLLVBDSUJJT1NfTUlOX0lPIGluIHNpemUKLQkgKiBJTyBhZGRyZXNzZXMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZQotCSAqIFBDSSBJTyB3aW5kb3cgYmFzZSBhZGRyZXNzCi0JICovCi0JcHJfZGVidWcoIlBDSTogTWFwcGluZyBJTyBhZGRyZXNzIDB4JXggLSAweCV4IHRvIGJhc2UgMHgleFxuIiwKLQkJIFBDSUJJT1NfTUlOX0lPLCAoNjQgPDwgMTApLAotCQkgU0g3NzUxX1BDSV9JT19CQVNFICsgUENJQklPU19NSU5fSU8pOworCXBjaV93cml0ZV9yZWcoY2hhbiwgd29yZCAsIFNINF9QQ0lNQlIpOwogCiAJLyogTWFrZSBzdXJlIHRoZSBNU0IncyBvZiBJTyB3aW5kb3cgYXJlIHNldCB0byBhY2Nlc3MgUENJIHNwYWNlCiAJICogY29ycmVjdGx5ICovCi0Jd29yZCA9IFBDSUJJT1NfTUlOX0lPICYgU0g0X1BDSUlPQlJfTUFTSzsKKwl3b3JkID0gY2hhbi0+aW9fcmVzb3VyY2UtPnN0YXJ0ICYgU0g0X1BDSUlPQlJfTUFTSzsKIAlwcl9kZWJ1ZygiUENJOiBTZXR0aW5nIHVwcGVyIGJpdHMgb2YgSU8gd2luZG93IHRvIDB4JXhcbiIsIHdvcmQpOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSUlPQlIpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgd29yZCwgU0g0X1BDSUlPQlIpOwogCiAJLyogU2V0IFBDSSBXQ1J4LCBCQ1J4J3MsIGNvcHkgZnJvbSBCU0MgbG9jYXRpb25zICovCiAKIAkvKiBjaGVjayBCQ1IgZm9yIFNEUkFNIGluIHNwZWNpZmllZCBhcmVhICovCi0Jc3dpdGNoIChtYXAtPndpbmRvdzAuYmFzZSkgewotCWNhc2UgU0g3NzUxX0NTMF9CQVNFX0FERFI6IHdvcmQgPSBfX2FyZWFfc2RyYW1fY2hlY2soMCk7IGJyZWFrOwotCWNhc2UgU0g3NzUxX0NTMV9CQVNFX0FERFI6IHdvcmQgPSBfX2FyZWFfc2RyYW1fY2hlY2soMSk7IGJyZWFrOwotCWNhc2UgU0g3NzUxX0NTMl9CQVNFX0FERFI6IHdvcmQgPSBfX2FyZWFfc2RyYW1fY2hlY2soMik7IGJyZWFrOwotCWNhc2UgU0g3NzUxX0NTM19CQVNFX0FERFI6IHdvcmQgPSBfX2FyZWFfc2RyYW1fY2hlY2soMyk7IGJyZWFrOwotCWNhc2UgU0g3NzUxX0NTNF9CQVNFX0FERFI6IHdvcmQgPSBfX2FyZWFfc2RyYW1fY2hlY2soNCk7IGJyZWFrOwotCWNhc2UgU0g3NzUxX0NTNV9CQVNFX0FERFI6IHdvcmQgPSBfX2FyZWFfc2RyYW1fY2hlY2soNSk7IGJyZWFrOwotCWNhc2UgU0g3NzUxX0NTNl9CQVNFX0FERFI6IHdvcmQgPSBfX2FyZWFfc2RyYW1fY2hlY2soNik7IGJyZWFrOworCXN3aXRjaCAoc2g3NzUxX3BjaV9tYXAud2luZG93MC5iYXNlKSB7CisJY2FzZSBTSDc3NTFfQ1MwX0JBU0VfQUREUjogd29yZCA9IF9fYXJlYV9zZHJhbV9jaGVjayhjaGFuLCAwKTsgYnJlYWs7CisJY2FzZSBTSDc3NTFfQ1MxX0JBU0VfQUREUjogd29yZCA9IF9fYXJlYV9zZHJhbV9jaGVjayhjaGFuLCAxKTsgYnJlYWs7CisJY2FzZSBTSDc3NTFfQ1MyX0JBU0VfQUREUjogd29yZCA9IF9fYXJlYV9zZHJhbV9jaGVjayhjaGFuLCAyKTsgYnJlYWs7CisJY2FzZSBTSDc3NTFfQ1MzX0JBU0VfQUREUjogd29yZCA9IF9fYXJlYV9zZHJhbV9jaGVjayhjaGFuLCAzKTsgYnJlYWs7CisJY2FzZSBTSDc3NTFfQ1M0X0JBU0VfQUREUjogd29yZCA9IF9fYXJlYV9zZHJhbV9jaGVjayhjaGFuLCA0KTsgYnJlYWs7CisJY2FzZSBTSDc3NTFfQ1M1X0JBU0VfQUREUjogd29yZCA9IF9fYXJlYV9zZHJhbV9jaGVjayhjaGFuLCA1KTsgYnJlYWs7CisJY2FzZSBTSDc3NTFfQ1M2X0JBU0VfQUREUjogd29yZCA9IF9fYXJlYV9zZHJhbV9jaGVjayhjaGFuLCA2KTsgYnJlYWs7CiAJfQogCiAJaWYgKCF3b3JkKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC0xOwogCiAJLyogY29uZmlndXJlIHRoZSB3YWl0IGNvbnRyb2wgcmVnaXN0ZXJzICovCiAJd29yZCA9IGN0cmxfaW5sKFNINzc1MV9XQ1IxKTsKLQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lXQ1IxKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIHdvcmQsIFNINF9QQ0lXQ1IxKTsKIAl3b3JkID0gY3RybF9pbmwoU0g3NzUxX1dDUjIpOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSVdDUjIpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgd29yZCwgU0g0X1BDSVdDUjIpOwogCXdvcmQgPSBjdHJsX2lubChTSDc3NTFfV0NSMyk7Ci0JcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJV0NSMyk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCB3b3JkLCBTSDRfUENJV0NSMyk7CiAJd29yZCA9IGN0cmxfaW5sKFNINzc1MV9NQ1IpOwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSU1DUik7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCB3b3JkLCBTSDRfUENJTUNSKTsKIAogCS8qIE5PVEU6IEknbSBpZ25vcmluZyB0aGUgUENJIGVycm9yIElSUXMgZm9yIG5vdy4uCiAJICogVE9ETzogYWRkIHN1cHBvcnQgZm9yIHRoZSBpbnRlcm5hbCBlcnJvciBpbnRlcnJ1cHRzIGFuZAogCSAqIERNQSBpbnRlcnJ1cHRzLi4uCiAJICovCiAKLQlwY2lfZml4dXBfcGNpYygpOworCXBjaV9maXh1cF9wY2ljKGNoYW4pOwogCiAJLyogU0g3NzUxIGluaXQgZG9uZSwgc2V0IGNlbnRyYWwgZnVuY3Rpb24gaW5pdCBjb21wbGV0ZSAqLwogCS8qIHVzZSByb3VuZCByb2JpbiBtb2RlIHRvIHN0b3AgYSBkZXZpY2Ugc3RhcnZpbmcvb3ZlcnJ1bmluZyAqLwogCXdvcmQgPSBTSDRfUENJQ1JfUFJFRklYIHwgU0g0X1BDSUNSX0NGSU4gfCBTSDRfUENJQ1JfQVJCTTsKLQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lDUik7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCB3b3JkLCBTSDRfUENJQ1IpOwogCi0JcmV0dXJuIDE7CisJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoY2hhbik7CisKKwlyZXR1cm4gMDsKIH0KK2FyY2hfaW5pdGNhbGwoc2g3NzUxX3BjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5oIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmgKaW5kZXggNjhlM2NiNS4uNDk4M2E0ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmgKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmgKQEAgLTI2LDcgKzI2LDYgQEAKICNkZWZpbmUgU0g3NzUxX1BDSV9JT19TSVpFICAgICAgICAgICAweDQwMDAwICAgICAvKiBTaXplIG9mIElPIHdpbmRvdyAqLwogCiAjZGVmaW5lIFNINzc1MV9QQ0lSRUdfQkFTRSAgICAgICAgICAgMHhGRTIwMDAwMCAgLyogUENJIHJlZ3MgYmFzZSBhZGRyZXNzICovCi0jZGVmaW5lIFBDSV9SRUcobikgICAgICAgICAgICAgICAgICAoU0g3NzUxX1BDSVJFR19CQVNFKyBuKQogCiAjZGVmaW5lIFNINzc1MV9QQ0lDT05GMCAgICAgICAgICAgIDB4MCAgICAgICAgICAgLyogUENJIENvbmZpZyBSZWcgMCAqLwogICAjZGVmaW5lIFNINzc1MV9QQ0lDT05GMF9ERVZJRCAgICAgIDB4RkZGRjAwMDAgIC8qIERldmljZSBJRCAqLwpAQCAtNTgsNyArNTcsNyBAQAogICAjZGVmaW5lIFNINzc1MV9QQ0lDT05GMl9TQ0MgICAgICAgIDB4MDBGRjAwMDAgIC8qIFN1Yi1DbGFzcyBDb2RlICovCiAgICNkZWZpbmUgU0g3NzUxX1BDSUNPTkYyX1JMUEkgICAgICAgMHgwMDAwRkYwMCAgLyogUHJvZ3JhbW1pbmcgSW50ZXJmYWNlICovCiAgICNkZWZpbmUgU0g3NzUxX1BDSUNPTkYyX1JFViAgICAgICAgMHgwMDAwMDBGRiAgLyogUmV2aXNpb24gSUQgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSUNPTkYzICAgICAgICAgICAgMHhDICAgICAgICAgICAvKiBQQ0kgQ29uZmlnIFJlZyAzICovIAorI2RlZmluZSBTSDc3NTFfUENJQ09ORjMgICAgICAgICAgICAweEMgICAgICAgICAgIC8qIFBDSSBDb25maWcgUmVnIDMgKi8KICAgI2RlZmluZSBTSDc3NTFfUENJQ09ORjNfQklTVDcgICAgICAweDgwMDAwMDAwICAvKiBCaXN0IFN1cHBvcnRlZCAqLwogICAjZGVmaW5lIFNINzc1MV9QQ0lDT05GM19CSVNUNiAgICAgIDB4NDAwMDAwMDAgIC8qIEJpc3QgRXhlY3V0aW5nICovCiAgICNkZWZpbmUgU0g3NzUxX1BDSUNPTkYzX0JJU1QzXzAgICAgMHgwRjAwMDAwMCAgLyogQmlzdCBQYXNzZWQgKi8KQEAgLTczLDEyICs3MiwxMiBAQAogICAjZGVmaW5lIFNINzc1MV9QQ0lDT05GNV9CQVNFICAgICAgIDB4RkZGRkZGRjAgIC8qIE1lbSBTcGFjZSBCYXNlIEFkZHIgKi8KICAgI2RlZmluZSBTSDc3NTFfUENJQ09ORjVfTEFQICAgICAgICAweDAwMDAwMDA4ICAvKiBQcmVmZXRjaCBFbmFibGVkICovCiAgICNkZWZpbmUgU0g3NzUxX1BDSUNPTkY1X0xBVCAgICAgICAgMHgwMDAwMDAwNiAgLyogTG9jYWwgTWVtb3J5IHR5cGUgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJQ09ORjVfQVNJICAgICAgICAweDAwMDAwMDAxICAvKiBBZGRyZXNzIFNwYWNlIFR5cGUgKi8gIAorICAjZGVmaW5lIFNINzc1MV9QQ0lDT05GNV9BU0kgICAgICAgIDB4MDAwMDAwMDEgIC8qIEFkZHJlc3MgU3BhY2UgVHlwZSAqLwogI2RlZmluZSBTSDc3NTFfUENJQ09ORjYgICAgICAgICAgICAweDE4ICAgICAgICAgIC8qIFBDSSBDb25maWcgUmVnIDYgKi8KICAgI2RlZmluZSBTSDc3NTFfUENJQ09ORjZfQkFTRSAgICAgICAweEZGRkZGRkYwICAvKiBNZW0gU3BhY2UgQmFzZSBBZGRyICovCiAgICNkZWZpbmUgU0g3NzUxX1BDSUNPTkY2X0xBUCAgICAgICAgMHgwMDAwMDAwOCAgLyogUHJlZmV0Y2ggRW5hYmxlZCAqLwogICAjZGVmaW5lIFNINzc1MV9QQ0lDT05GNl9MQVQgICAgICAgIDB4MDAwMDAwMDYgIC8qIExvY2FsIE1lbW9yeSB0eXBlICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNPTkY2X0FTSSAgICAgICAgMHgwMDAwMDAwMSAgLyogQWRkcmVzcyBTcGFjZSBUeXBlICovICAKKyAgI2RlZmluZSBTSDc3NTFfUENJQ09ORjZfQVNJICAgICAgICAweDAwMDAwMDAxICAvKiBBZGRyZXNzIFNwYWNlIFR5cGUgKi8KIC8qIFBDSUNPTkY3IC0gUENJQ09ORjEwIGFyZSB1bmRlZmluZWQgKi8KICNkZWZpbmUgU0g3NzUxX1BDSUNPTkYxMSAgICAgICAgICAgMHgyQyAgICAgICAgICAvKiBQQ0kgQ29uZmlnIFJlZyAxMSAqLwogICAjZGVmaW5lIFNINzc1MV9QQ0lDT05GMTFfU1NJRCAgICAgIDB4RkZGRjAwMDAgIC8qIFN1YnN5c3RlbSBJRCAqLwpAQCAtMTI3LDkgKzEyNiw0IEBACiAjZGVmaW5lIFNINzc1MV9DUzVfQkFTRV9BRERSICAgICAgIChTSDc3NTFfQ1M0X0JBU0VfQUREUiArIFNINzc1MV9NRU1fUkVHSU9OX1NJWkUpCiAjZGVmaW5lIFNINzc1MV9DUzZfQkFTRV9BRERSICAgICAgIChTSDc3NTFfQ1M1X0JBU0VfQUREUiArIFNINzc1MV9NRU1fUkVHSU9OX1NJWkUpCiAKLXN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwOwotCi0vKiBhcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuYyAqLwotaW50IHNoNzc1MV9wY2ljX2luaXQoc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgKm1hcCk7Ci0KICNlbmRpZiAvKiBfUENJX1NINzc1MV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYwppbmRleCBiYWU2YTJjLi4zMjNiOTJkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYwpAQCAtMSwxOSArMSwxMiBAQAogLyoKLSAqCUxvdy1MZXZlbCBQQ0kgU3VwcG9ydCBmb3IgdGhlIFNINzc4MAorICogTG93LUxldmVsIFBDSSBTdXBwb3J0IGZvciB0aGUgU0g3NzgwCiAgKgotICogIER1c3RpbiBNY0ludGlyZSAoZHVzdGluQHNlbnNvcmlhLmNvbSkKLSAqCURlcml2ZWQgZnJvbSBhcmNoL2kzODYva2VybmVsL3BjaS0qLmMgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqCShjKSAxOTk5LS0yMDAwIE1hcnRpbiBNYXJlcyA8bWpAdWN3LmN6PgorICogIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDkgIFBhdWwgTXVuZHQKICAqCi0gKiAgUG9ydGVkIHRvIHRoZSBuZXcgQVBJIGJ5IFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+Ci0gKiAgV2l0aCBjbGVhbnVwIGJ5IFBhdWwgdmFuIEdvb2wgPHB2YW5nb29sQG1pbW90ZWNoLmNvbT4KLSAqCi0gKiAgTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwotI3VuZGVmIERFQlVHCi0KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTIyLDEzNSArMTUsMTMyIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlICJwY2ktc2g0LmgiCiAKLSNkZWZpbmUgSU5UQ19CQVNFCTB4ZmZkMDAwMDAKLSNkZWZpbmUgSU5UQ19JQ1IwCShJTlRDX0JBU0UrMHgwKQotI2RlZmluZSBJTlRDX0lDUjEJKElOVENfQkFTRSsweDFjKQotI2RlZmluZSBJTlRDX0lOVFBSSQkoSU5UQ19CQVNFKzB4MTApCi0jZGVmaW5lIElOVENfSU5UUkVRCShJTlRDX0JBU0UrMHgyNCkKLSNkZWZpbmUgSU5UQ19JTlRNU0swCShJTlRDX0JBU0UrMHg0NCkKLSNkZWZpbmUgSU5UQ19JTlRNU0sxCShJTlRDX0JBU0UrMHg0OCkKLSNkZWZpbmUgSU5UQ19JTlRNU0syCShJTlRDX0JBU0UrMHg0MDA4MCkKLSNkZWZpbmUgSU5UQ19JTlRNU0tDTFIwCShJTlRDX0JBU0UrMHg2NCkKLSNkZWZpbmUgSU5UQ19JTlRNU0tDTFIxCShJTlRDX0JBU0UrMHg2OCkKLSNkZWZpbmUgSU5UQ19JTlRNU0tDTFIyCShJTlRDX0JBU0UrMHg0MDA4NCkKLSNkZWZpbmUgSU5UQ19JTlQyTVNLUgkoSU5UQ19CQVNFKzB4NDAwMzgpCi0jZGVmaW5lIElOVENfSU5UMk1TS0NSCShJTlRDX0JBU0UrMHg0MDAzYykKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3Nzg1X2lvX3Jlc291cmNlID0geworCS5uYW1lCT0gIlNINzc4NV9JTyIsCisJLnN0YXJ0CT0gU0g3NzgwX1BDSV9JT19CQVNFLAorCS5lbmQJPSBTSDc3ODBfUENJX0lPX0JBU0UgKyBTSDc3ODBfUENJX0lPX1NJWkUgLSAxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KK307CiAKLS8qCi0gKiBJbml0aWFsaXphdGlvbi4gVHJ5IGFsbCBrbm93biBQQ0kgYWNjZXNzIG1ldGhvZHMuIE5vdGUgdGhhdCB3ZSBzdXBwb3J0Ci0gKiB1c2luZyBib3RoIFBDSSBCSU9TIGFuZCBkaXJlY3QgYWNjZXNzOiBpbiBzdWNoIGNhc2VzLCB3ZSB1c2UgSS9PIHBvcnRzCi0gKiB0byBhY2Nlc3MgY29uZmlnIHNwYWNlLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKEJTQyByZWdpc3RlcnMsIGFuZCBtZW1vcnkKLSAqIHNwYWNlIG1hcHBpbmcpIHdpbGwgYmUgY2FsbGVkIHZpYSB0aGUgcGxhdGZvcm0gZGVmaW5lZCBmdW5jdGlvbgotICogcGNpYmlvc19pbml0X3BsYXRmb3JtKCkuCi0gKi8KK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3Nzg1X21lbV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJTSDc3ODVfbWVtIiwKKwkuc3RhcnQJPSBTSDc3ODBfUENJX01FTU9SWV9CQVNFLAorCS5lbmQJPSBTSDc3ODBfUENJX01FTU9SWV9CQVNFICsgU0g3NzgwX1BDSV9NRU1fU0laRSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NoYW5uZWwgc2g3NzgwX3BjaV9jb250cm9sbGVyID0geworCS5wY2lfb3BzCT0gJnNoNF9wY2lfb3BzLAorCS5tZW1fcmVzb3VyY2UJPSAmc2g3Nzg1X21lbV9yZXNvdXJjZSwKKwkubWVtX29mZnNldAk9IDB4MDAwMDAwMDAsCisJLmlvX3Jlc291cmNlCT0gJnNoNzc4NV9pb19yZXNvdXJjZSwKKwkuaW9fb2Zmc2V0CT0gMHgwMDAwMDAwMCwKKwkuaW9fbWFwX2Jhc2UJPSBTSDc3ODBfUENJX0lPX0JBU0UsCit9OworCitzdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzgwX3BjaV9tYXAgPSB7CisJLndpbmRvdzAJPSB7CisjaWYgZGVmaW5lZChDT05GSUdfMzJCSVQpCisJCS5iYXNlCT0gU0g3NzgwXzMyQklUX0REUl9CQVNFX0FERFIsCisJCS5zaXplCT0gMHg0MDAwMDAwMCwKKyNlbHNlCisJCS5iYXNlCT0gU0g3NzgwX0NTMF9CQVNFX0FERFIsCisJCS5zaXplCT0gMHgyMDAwMDAwMCwKKyNlbmRpZgorCX0sCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3ODBfcGNpX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3QgcGNpX2NoYW5uZWwgKmNoYW4gPSAmc2g3NzgwX3BjaV9jb250cm9sbGVyOwogCXVuc2lnbmVkIGludCBpZDsKLQlpbnQgcmV0LCBtYXRjaCA9IDA7CisJY29uc3QgY2hhciAqdHlwZSA9IE5VTEw7CisJaW50IHJldDsKKwl1MzIgd29yZDsKIAotCXByX2RlYnVnKCJQQ0k6IFN0YXJ0aW5nIGludGlhbGl6YXRpb24uXG4iKTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlBDSTogU3RhcnRpbmcgaW50aWFsaXphdGlvbi5cbiIpOwogCi0JY3RybF9vdXRsKDB4MDAwMDAwMDEsIFNINzc4MF9QQ0lfVkNSMik7IC8qIEVuYWJsZSBQQ0lDICovCisJY2hhbi0+cmVnX2Jhc2UgPSAweGZlMDQwMDAwOwogCi0JLyogY2hlY2sgZm9yIFNINzc4MC9TSDc3ODBSIGhhcmR3YXJlICovCi0JaWQgPSBwY2lfcmVhZF9yZWcoU0g3NzgwX1BDSVZJRCk7Ci0JaWYgKChpZCAmIDB4ZmZmZikgPT0gU0g3NzgwX1ZFTkRPUl9JRCkgewotCQlzd2l0Y2ggKChpZCA+PiAxNikgJiAweGZmZmYpIHsKLQkJY2FzZSBTSDc3NjNfREVWSUNFX0lEOgotCQljYXNlIFNINzc4MF9ERVZJQ0VfSUQ6Ci0JCWNhc2UgU0g3NzgxX0RFVklDRV9JRDoKLQkJY2FzZSBTSDc3ODVfREVWSUNFX0lEOgotCQkJbWF0Y2ggPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9CisJLyogRW5hYmxlIENQVSBhY2Nlc3MgdG8gdGhlIFBDSUMgcmVnaXN0ZXJzLiAqLworCV9fcmF3X3dyaXRlbChQQ0lFQ1JfRU5CTCwgUENJRUNSKTsKIAotCWlmICh1bmxpa2VseSghbWF0Y2gpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBUaGlzIGlzIG5vdCBhbiBTSDc3ODAgKCV4KVxuIiwgaWQpOworCWlkID0gX19yYXdfcmVhZHcoY2hhbi0+cmVnX2Jhc2UgKyBTSDc3ODBfUENJVklEKTsKKwlpZiAoaWQgIT0gU0g3NzgwX1ZFTkRPUl9JRCkgeworCQlwcmludGsoS0VSTl9FUlIgIlBDSTogVW5rbm93biB2ZW5kb3IgSUQgMHglMDR4LlxuIiwgaWQpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQkvKiBTZXR1cCB0aGUgSU5UQyAqLwotCWlmIChtYWNoX2lzXzc3ODBzZSgpKSB7Ci0JCS8qIElDUjA6IElSTD11c2Ugc2VwYXJhdGVseSAqLwotCQljdHJsX291dGwoMHgwMEMwMDAyMCwgSU5UQ19JQ1IwKTsKLQkJLyogSUNSMTogZGV0ZWN0IGxvdyBsZXZlbChmb3IgMm5kY3V0KSAqLwotCQljdHJsX291dGwoMHhBQUFBMDAwMCwgSU5UQ19JQ1IxKTsKLQkJLyogSU5UUFJJOiBwcmlvcml0eT0zKGFsbCkgKi8KLQkJY3RybF9vdXRsKDB4MzMzMzMzMzMsIElOVENfSU5UUFJJKTsKKwlpZCA9IF9fcmF3X3JlYWR3KGNoYW4tPnJlZ19iYXNlICsgU0g3NzgwX1BDSURJRCk7CisJdHlwZSA9IChpZCA9PSBTSDc3NjNfREVWSUNFX0lEKQk/ICJTSDc3NjMiIDoKKwkgICAgICAgKGlkID09IFNINzc4MF9ERVZJQ0VfSUQpID8gIlNINzc4MCIgOgorCSAgICAgICAoaWQgPT0gU0g3NzgxX0RFVklDRV9JRCkgPyAiU0g3NzgxIiA6CisJICAgICAgIChpZCA9PSBTSDc3ODVfREVWSUNFX0lEKSA/ICJTSDc3ODUiIDoKKwkJCQkJICBOVUxMOworCWlmICh1bmxpa2VseSghdHlwZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEZvdW5kIGFuIHVuc3VwcG9ydGVkIFJlbmVzYXMgaG9zdCAiCisJCSAgICAgICAiY29udHJvbGxlciwgZGV2aWNlIGlkIDB4JTA0eC5cbiIsIGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKChyZXQgPSBzaDRfcGNpX2NoZWNrX2RpcmVjdCgpKSAhPSAwKQorCXByaW50ayhLRVJOX05PVElDRSAiUENJOiBGb3VuZCBhIFJlbmVzYXMgJXMgaG9zdCAiCisJICAgICAgICJjb250cm9sbGVyLCByZXZpc2lvbiAlZC5cbiIsIHR5cGUsCisJICAgICAgIF9fcmF3X3JlYWRiKGNoYW4tPnJlZ19iYXNlICsgU0g3NzgwX1BDSVJJRCkpOworCisJaWYgKChyZXQgPSBzaDRfcGNpX2NoZWNrX2RpcmVjdChjaGFuKSkgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldHVybiBwY2liaW9zX2luaXRfcGxhdGZvcm0oKTsKLX0KLWNvcmVfaW5pdGNhbGwoc2g3NzgwX3BjaV9pbml0KTsKLQotaW50IF9faW5pdCBzaDc3ODBfcGNpY19pbml0KHN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwICptYXApCi17Ci0JdTMyIHdvcmQ7CisJLyoKKwkgKiBTZXQgdGhlIGNsYXNzIGFuZCBzdWItY2xhc3MgY29kZXMuCisJICovCisJX19yYXdfd3JpdGViKFBDSV9DTEFTU19CUklER0VfSE9TVCA+PiA4LAorCQkgICAgIGNoYW4tPnJlZ19iYXNlICsgU0g3NzgwX1BDSUJDQyk7CisJX19yYXdfd3JpdGViKFBDSV9DTEFTU19CUklER0VfSE9TVCAmIDB4ZmYsCisJCSAgICAgY2hhbi0+cmVnX2Jhc2UgKyBTSDc3ODBfUENJU1VCKTsKIAogCS8qCi0JICogVGhpcyBjb2RlIGlzIHVudXNlZCBmb3Igc29tZSBib2FyZHMgYXMgaXQgaXMgZG9uZSBpbiB0aGUKLQkgKiBib290bG9hZGVyIGFuZCBkb2luZyBpdCBoZXJlIG1lYW5zIHRoZSBNQUMgYWRkcmVzc2VzIGxvYWRlZAotCSAqIGJ5IHRoZSBib290bG9hZGVyIGdldCBsb3N0LgotCSAqLwotCWlmICghKG1hcC0+ZmxhZ3MgJiBTSDRfUENJQ19OT19SRVNFVCkpIHsKLQkJLyogdG9nZ2xlIFBDSSByZXNldCBwaW4gKi8KLQkJd29yZCA9IFNINF9QQ0lDUl9QUkVGSVggfCBTSDRfUENJQ1JfUFJTVDsKLQkJcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJQ1IpOwotCQkvKiBXYWl0IGZvciBhIGxvbmcgdGltZS4uLiBub3QgMSBzZWMuIGJ1dCBsb25nIGVub3VnaCAqLwotCQltZGVsYXkoMTAwKTsKLQkJd29yZCA9IFNINF9QQ0lDUl9QUkVGSVg7Ci0JCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSUNSKTsKLQl9Ci0KLQkvKiBzZXQgdGhlIGNvbW1hbmQvc3RhdHVzIGJpdHMgdG86Ci0JICogV2FpdCBDeWNsZSBDb250cm9sICsgUGFyaXR5IEVuYWJsZSArIEJ1cyBNYXN0ZXIgKwotCSAqIE1lbSBzcGFjZSBlbmFibGUKLQkgKi8KLQlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwNDYsIFNINzc4MF9QQ0lDTUQpOwotCi0JLyogZGVmaW5lIHRoaXMgaG9zdCBhcyB0aGUgaG9zdCBicmlkZ2UgKi8KLQl3b3JkID0gUENJX0JBU0VfQ0xBU1NfQlJJREdFIDw8IDI0OwotCXBjaV93cml0ZV9yZWcod29yZCwgU0g3NzgwX1BDSVJJRCk7Ci0KLQkvKiBTZXQgSU8gYW5kIE1lbSB3aW5kb3dzIHRvIGxvY2FsIGFkZHJlc3MKKwkgKiBTZXQgSU8gYW5kIE1lbSB3aW5kb3dzIHRvIGxvY2FsIGFkZHJlc3MKIAkgKiBNYWtlIFBDSSBhbmQgbG9jYWwgYWRkcmVzcyB0aGUgc2FtZSBmb3IgZWFzeSAxIHRvIDEgbWFwcGluZwogCSAqLwotCXBjaV93cml0ZV9yZWcobWFwLT53aW5kb3cwLnNpemUgLSAweGZmZmZmLCBTSDRfUENJTFNSMCk7Ci0JcGNpX3dyaXRlX3JlZyhtYXAtPndpbmRvdzEuc2l6ZSAtIDB4ZmZmZmYsIFNINF9QQ0lMU1IxKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIHNoNzc4MF9wY2lfbWFwLndpbmRvdzAuc2l6ZSAtIDB4ZmZmZmYsIFNINF9QQ0lMU1IwKTsKIAkvKiBTZXQgdGhlIHZhbHVlcyBvbiB3aW5kb3cgMCBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLwotCXBjaV93cml0ZV9yZWcobWFwLT53aW5kb3cwLmJhc2UsIFNINF9QQ0lMQVIwKTsKLQlwY2lfd3JpdGVfcmVnKG1hcC0+d2luZG93MC5iYXNlLCBTSDc3ODBfUENJTUJBUjApOwotCS8qIFNldCB0aGUgdmFsdWVzIG9uIHdpbmRvdyAxIFBDSSBjb25maWcgcmVnaXN0ZXJzICovCi0JcGNpX3dyaXRlX3JlZyhtYXAtPndpbmRvdzEuYmFzZSwgU0g0X1BDSUxBUjEpOwotCXBjaV93cml0ZV9yZWcobWFwLT53aW5kb3cxLmJhc2UsIFNINzc4MF9QQ0lNQkFSMSk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCBzaDc3ODBfcGNpX21hcC53aW5kb3cwLmJhc2UsIFNINF9QQ0lMQVIwKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIHNoNzc4MF9wY2lfbWFwLndpbmRvdzAuYmFzZSwgU0g3NzgwX1BDSU1CQVIwKTsKIAotCS8qIE1hcCBJTyBzcGFjZSBpbnRvIFBDSSBJTyB3aW5kb3cKLQkgKiBUaGUgSU8gd2luZG93IGlzIDY0Sy1QQ0lCSU9TX01JTl9JTyBpbiBzaXplCi0JICogSU8gYWRkcmVzc2VzIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0aGUKLQkgKiBQQ0kgSU8gd2luZG93IGJhc2UgYWRkcmVzcwotCSAqLwotCXByX2RlYnVnKCJQQ0k6IE1hcHBpbmcgSU8gYWRkcmVzcyAweCV4IC0gMHgleCB0byBiYXNlIDB4JXhcbiIsCi0JCSBQQ0lCSU9TX01JTl9JTywgKDY0IDw8IDEwKSwKLQkJIFNINzc4MF9QQ0lfSU9fQkFTRSArIFBDSUJJT1NfTUlOX0lPKTsKKwlwY2lfd3JpdGVfcmVnKGNoYW4sIDB4MDAwMDM4MGYsIFNINF9QQ0lBSU5UTSk7CiAKLQkvKiBOT1RFOiBJJ20gaWdub3JpbmcgdGhlIFBDSSBlcnJvciBJUlFzIGZvciBub3cuLgotCSAqIFRPRE86IGFkZCBzdXBwb3J0IGZvciB0aGUgaW50ZXJuYWwgZXJyb3IgaW50ZXJydXB0cyBhbmQKLQkgKiBETUEgaW50ZXJydXB0cy4uLgotCSAqLworCS8qIFNldCB1cCBzdGFuZGFyZCBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLworCV9fcmF3X3dyaXRldygweEZCMDAsIGNoYW4tPnJlZ19iYXNlICsgU0g3NzgwX1BDSVNUQVRVUyk7CisJX19yYXdfd3JpdGV3KDB4MDA0NywgY2hhbi0+cmVnX2Jhc2UgKyBTSDc3ODBfUENJQ01EKTsKKwlfX3Jhd193cml0ZXcoMHgxOTEyLCBjaGFuLT5yZWdfYmFzZSArIFNINzc4MF9QQ0lTVklEKTsKKwlfX3Jhd193cml0ZXcoMHgwMDAxLCBjaGFuLT5yZWdfYmFzZSArIFNINzc4MF9QQ0lTSUQpOworCisJX19yYXdfd3JpdGViKDB4MDAsIGNoYW4tPnJlZ19iYXNlICsgU0g3NzgwX1BDSVBJRik7CiAKIAkvKiBBcHBseSBhbnkgbGFzdC1taW51dGUgUENJQyBmaXh1cHMgKi8KLQlwY2lfZml4dXBfcGNpYygpOworCXBjaV9maXh1cF9wY2ljKGNoYW4pOworCisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweGZkMDAwMDAwLCBTSDc3ODBfUENJTUJSMCk7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweDAwZmMwMDAwLCBTSDc3ODBfUENJTUJNUjApOworCisjaWZkZWYgQ09ORklHXzMyQklUCisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweGMwMDAwMDAwLCBTSDc3ODBfUENJTUJSMik7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCAweDIwMDAwMDAwIC0gU0g3NzgwX1BDSV9JT19TSVpFLCBTSDc3ODBfUENJTUJNUjIpOworI2VuZGlmCisKKwkvKiBTZXQgSU9CUiBmb3Igd2luZG93cyBjb250YWluaW5nIGFyZWEgc3BlY2lmaWVkIGluIHBjaS5oICovCisJcGNpX3dyaXRlX3JlZyhjaGFuLCBjaGFuLT5pb19yZXNvdXJjZS0+c3RhcnQgJiB+KFNINzc4MF9QQ0lfSU9fU0laRS0xKSwKKwkJICAgICAgU0g3NzgwX1BDSUlPQlIpOworCXBjaV93cml0ZV9yZWcoY2hhbiwgKChTSDc3ODBfUENJX0lPX1NJWkUtMSkgJiAoNzw8MTgpKSwKKwkJICAgICAgU0g3NzgwX1BDSUlPQk1SKTsKIAogCS8qIFNINzc4MCBpbml0IGRvbmUsIHNldCBjZW50cmFsIGZ1bmN0aW9uIGluaXQgY29tcGxldGUgKi8KIAkvKiB1c2Ugcm91bmQgcm9iaW4gbW9kZSB0byBzdG9wIGEgZGV2aWNlIHN0YXJ2aW5nL292ZXJydW5pbmcgKi8KIAl3b3JkID0gU0g0X1BDSUNSX1BSRUZJWCB8IFNINF9QQ0lDUl9DRklOIHwgU0g0X1BDSUNSX0ZUTzsKLQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lDUik7CisJcGNpX3dyaXRlX3JlZyhjaGFuLCB3b3JkLCBTSDRfUENJQ1IpOwogCi0JcmV0dXJuIDE7CisJcmVnaXN0ZXJfcGNpX2NvbnRyb2xsZXIoY2hhbik7CisKKwlyZXR1cm4gMDsKIH0KK2FyY2hfaW5pdGNhbGwoc2g3NzgwX3BjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc4MC5oIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmgKaW5kZXggOTNhZGM3MS4uNGE1MjQ3OCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmgKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmgKQEAgLTIwLDkgKzIwLDggQEAKICNkZWZpbmUgU0g3Nzg1X0RFVklDRV9JRAkweDAwMDcKIAogLyogU0g3NzgwIENvbnRyb2wgUmVnaXN0ZXJzICovCi0jZGVmaW5lCVNINzc4MF9QQ0lfVkNSMAkJMHhGRTAwMDAwMAotI2RlZmluZQlTSDc3ODBfUENJX1ZDUjEJCTB4RkUwMDAwMDQKLSNkZWZpbmUJU0g3NzgwX1BDSV9WQ1IyCQkweEZFMDAwMDA4CisjZGVmaW5lCVBDSUVDUgkJCTB4RkUwMDAwMDgKKyNkZWZpbmUgUENJRUNSX0VOQkwJCTB4MDEKIAogLyogU0g3NzgwIFNwZWNpZmljIFZhbHVlcyAqLwogI2RlZmluZSBTSDc3ODBfUENJX0NPTkZJR19CQVNFCTB4RkQwMDAwMDAJLyogQ29uZmlnIHNwYWNlIGJhc2UgYWRkciAqLwpAQCAtMzUsNyArMzQsNiBAQAogI2RlZmluZSBTSDc3ODBfUENJX0lPX1NJWkUJMHgwMDQwMDAwMAkvKiBTaXplIG9mIElPIHdpbmRvdyAqLwogCiAjZGVmaW5lIFNINzc4MF9QQ0lSRUdfQkFTRQkweEZFMDQwMDAwCS8qIFBDSSByZWdzIGJhc2UgYWRkcmVzcyAqLwotI2RlZmluZSBQQ0lfUkVHKG4pCQkoU0g3NzgwX1BDSVJFR19CQVNFK24pCiAKIC8qIFNINzc4MCBQQ0kgQ29uZmlnIFJlZ2lzdGVycyAqLwogI2RlZmluZSBTSDc3ODBfUENJVklECQkweDAwMAkJLyogVmVuZG9yIElEICovCkBAIC02NywxMSArNjUsNiBAQAogI2RlZmluZSBTSDc3ODBfUENJUE1DU1JfQlNFCTB4MDQ2CiAjZGVmaW5lIFNINzc4MF9QQ0lDREQJCTB4MDQ3CiAKLSNkZWZpbmUgU0g3NzgwX1BDSUNSCQkweDEwMAkJLyogUENJIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzgwX1BDSUxTUgkJMHgxMDQJCS8qIFBDSSBMb2NhbCBTcGFjZSBSZWdpc3RlcjAgKi8KLSNkZWZpbmUgU0g3NzgwX1BDSUxTUjEJCTB4MTA4CQkvKiBQQ0kgTG9jYWwgU3BhY2UgUmVnaXN0ZXIxICovCi0jZGVmaW5lIFNINzc4MF9QQ0lMQVIwCQkweDEwQwkJLyogUENJIExvY2FsIEFkZHJlc3MgUmVnaXN0ZXIxICovCi0jZGVmaW5lIFNINzc4MF9QQ0lMQVIxCQkweDExMAkJLyogUENJIExvY2FsIEFkZHJlc3MgUmVnaXN0ZXIxICovCiAjZGVmaW5lIFNINzc4MF9QQ0lJUgkJMHgxMTQJCS8qIFBDSSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgU0g3NzgwX1BDSUlNUgkJMHgxMTgJCS8qIFBDSSBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwogI2RlZmluZSBTSDc3ODBfUENJQUlSCQkweDExQwkJLyogRXJyb3IgQWRkcmVzcyBSZWdpc3RlciAqLwpAQCAtMTA2LDkgKzk5LDQgQEAKIAogI2RlZmluZSBTSDc3ODBfMzJCSVRfRERSX0JBU0VfQUREUgkweDQwMDAwMDAwCiAKLXN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwOwotCi0vKiBhcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYyAqLwotaW50IHNoNzc4MF9wY2ljX2luaXQoc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgKm1hcCk7Ci0KICNlbmRpZiAvKiBfUENJX1NINzc4MF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggMGQ2YWM3YTEuLjU0ZDc3Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMSw2NyArMSwxNTYgQEAKIC8qCi0gKiBhcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCisgKiBOZXctc3R5bGUgUENJIGNvcmUuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAyIE0uIFIuIEJyb3duICA8bXJicm93bkBsaW51eC1zaC5vcmc+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgLSAyMDA2IFBhdWwgTXVuZHQgIDxsZXRoYWxAbGludXgtc2gub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDA0IC0gMjAwOSAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChjKSAyMDAyICBNLiBSLiBCcm93bgogICoKLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY29sbGVjdGVkIGhlcmUgdG8gcmVkdWNlIGR1cGxpY2F0aW9uIG9mIGNvbW1vbgotICogY29kZSBhbW9uZ3N0IHRoZSBtYW55IHBsYXRmb3JtLXNwZWNpZmljIFBDSSBzdXBwb3J0IGNvZGUgZmlsZXMuCi0gKgotICogVGhlc2Ugcm91dGluZXMgcmVxdWlyZSB0aGUgZm9sbG93aW5nIGJvYXJkLXNwZWNpZmljIHJvdXRpbmVzOgotICogdm9pZCBwY2liaW9zX2ZpeHVwX2lycXMoKTsKLSAqCi0gKiBTZWUgaW5jbHVkZS9hc20tc2gvcGNpLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKiBNb2RlbGxlZCBhZnRlciBhcmNoL21pcHMvcGNpL3BjaS5jOgorICogIENvcHlyaWdodCAoQykgMjAwMywgMDQgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtZGVidWcuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKK3Vuc2lnbmVkIGxvbmcgUENJQklPU19NSU5fSU8gPSAweDAwMDA7Cit1bnNpZ25lZCBsb25nIFBDSUJJT1NfTUlOX01FTSA9IDA7CisKKy8qCisgKiBUaGUgUENJIGNvbnRyb2xsZXIgbGlzdC4KKyAqLworc3RhdGljIHN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZV9oZWFkLCAqKmhvc2VfdGFpbCA9ICZob3NlX2hlYWQ7CisKK3N0YXRpYyBpbnQgcGNpX2luaXRpYWxpemVkOworCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcGNpYmlvc19zY2FuYnVzKHN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSkKK3sKKwlzdGF0aWMgaW50IG5leHRfYnVzbm87CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKworCWJ1cyA9IHBjaV9zY2FuX2J1cyhuZXh0X2J1c25vLCBob3NlLT5wY2lfb3BzLCBob3NlKTsKKwlpZiAoYnVzKSB7CisJCW5leHRfYnVzbm8gPSBidXMtPnN1Ym9yZGluYXRlICsgMTsKKwkJLyogRG9uJ3QgYWxsb3cgOC1iaXQgYnVzIG51bWJlciBvdmVyZmxvdyBpbnNpZGUgdGhlIGhvc2UgLQorCQkgICByZXNlcnZlIHNvbWUgc3BhY2UgZm9yIGJyaWRnZXMuICovCisJCWlmIChuZXh0X2J1c25vID4gMjI0KQorCQkJbmV4dF9idXNubyA9IDA7CisKKwkJcGNpX2J1c19zaXplX2JyaWRnZXMoYnVzKTsKKwkJcGNpX2J1c19hc3NpZ25fcmVzb3VyY2VzKGJ1cyk7CisJCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOworCX0KK30KKworc3RhdGljIERFRklORV9NVVRFWChwY2lfc2Nhbl9tdXRleCk7CisKK3ZvaWQgX19kZXZpbml0IHJlZ2lzdGVyX3BjaV9jb250cm9sbGVyKHN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSkKK3sKKwlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIGhvc2UtPm1lbV9yZXNvdXJjZSkgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAocmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCBob3NlLT5pb19yZXNvdXJjZSkgPCAwKSB7CisJCXJlbGVhc2VfcmVzb3VyY2UoaG9zZS0+bWVtX3Jlc291cmNlKTsKKwkJZ290byBvdXQ7CisJfQorCisJKmhvc2VfdGFpbCA9IGhvc2U7CisJaG9zZV90YWlsID0gJmhvc2UtPm5leHQ7CisKKwkvKgorCSAqIERvIG5vdCBwYW5pYyBoZXJlIGJ1dCBsYXRlciAtIHRoaXMgbWlnaHQgaGFwZW4gYmVmb3JlIGNvbnNvbGUgaW5pdC4KKwkgKi8KKwlpZiAoIWhvc2UtPmlvX21hcF9iYXNlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJyZWdpc3RlcmluZyBQQ0kgY29udHJvbGxlciB3aXRoIGlvX21hcF9iYXNlIHVuc2V0XG4iKTsKKwl9CisKKwkvKgorCSAqIFNjYW4gdGhlIGJ1cyBpZiBpdCBpcyByZWdpc3RlciBhZnRlciB0aGUgUENJIHN1YnN5c3RlbQorCSAqIGluaXRpYWxpemF0aW9uLgorCSAqLworCWlmIChwY2lfaW5pdGlhbGl6ZWQpIHsKKwkJbXV0ZXhfbG9jaygmcGNpX3NjYW5fbXV0ZXgpOworCQlwY2liaW9zX3NjYW5idXMoaG9zZSk7CisJCW11dGV4X3VubG9jaygmcGNpX3NjYW5fbXV0ZXgpOworCX0KKworCXJldHVybjsKKworb3V0OgorCXByaW50ayhLRVJOX1dBUk5JTkcKKwkgICAgICAgIlNraXBwaW5nIFBDSSBidXMgc2NhbiBkdWUgdG8gcmVzb3VyY2UgY29uZmxpY3RcbiIpOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgcGNpX2NoYW5uZWwgKnA7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKLQlpbnQgYnVzbm87CisJc3RydWN0IHBjaV9jaGFubmVsICpob3NlOwogCi0jaWZkZWYgQ09ORklHX1BDSV9BVVRPCi0JLyogYXNzaWduIHJlc291cmNlcyAqLwotCWJ1c25vID0gMDsKLQlmb3IgKHAgPSBib2FyZF9wY2lfY2hhbm5lbHM7IHAtPnBjaV9vcHMgIT0gTlVMTDsgcCsrKQotCQlidXNubyA9IHBjaWF1dG9fYXNzaWduX3Jlc291cmNlcyhidXNubywgcCkgKyAxOwotI2VuZGlmCi0KLQkvKiBzY2FuIHRoZSBidXNlcyAqLwotCWJ1c25vID0gMDsKLQlmb3IgKHAgPSBib2FyZF9wY2lfY2hhbm5lbHM7IHAtPnBjaV9vcHMgIT0gTlVMTDsgcCsrKSB7Ci0JCWJ1cyA9IHBjaV9zY2FuX2J1cyhidXNubywgcC0+cGNpX29wcywgcCk7Ci0JCWJ1c25vID0gYnVzLT5zdWJvcmRpbmF0ZSArIDE7Ci0JfQorCS8qIFNjYW4gYWxsIG9mIHRoZSByZWNvcmRlZCBQQ0kgY29udHJvbGxlcnMuICAqLworCWZvciAoaG9zZSA9IGhvc2VfaGVhZDsgaG9zZTsgaG9zZSA9IGhvc2UtPm5leHQpCisJCXBjaWJpb3Nfc2NhbmJ1cyhob3NlKTsKIAogCXBjaV9maXh1cF9pcnFzKHBjaV9jb21tb25fc3dpenpsZSwgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKTsKIAogCWRtYV9kZWJ1Z19hZGRfYnVzKCZwY2lfYnVzX3R5cGUpOwogCisJcGNpX2luaXRpYWxpemVkID0gMTsKKwogCXJldHVybiAwOwogfQogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKK3N0YXRpYyB2b2lkIHBjaWJpb3NfZml4dXBfZGV2aWNlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCXN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJLyogVXBkYXRlIGRldmljZSByZXNvdXJjZXMuICAqLworCXN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUENJX05VTV9SRVNPVVJDRVM7IGkrKykgeworCQlpZiAoIWRldi0+cmVzb3VyY2VbaV0uc3RhcnQpCisJCQljb250aW51ZTsKKwkJaWYgKGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX1BDSV9GSVhFRCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCQlvZmZzZXQgPSBob3NlLT5pb19vZmZzZXQ7CisJCWVsc2UgaWYgKGRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJCW9mZnNldCA9IGhvc2UtPm1lbV9vZmZzZXQ7CisKKwkJZGV2LT5yZXNvdXJjZVtpXS5zdGFydCArPSBvZmZzZXQ7CisJCWRldi0+cmVzb3VyY2VbaV0uZW5kICs9IG9mZnNldDsKKwl9Cit9CisKIC8qCiAgKiAgQ2FsbGVkIGFmdGVyIGVhY2ggYnVzIGlzIHByb2JlZCwgYnV0IGJlZm9yZSBpdHMgY2hpbGRyZW4KICAqICBhcmUgZXhhbWluZWQuCiAgKi8KLXZvaWQgX19kZXZpbml0IF9fd2VhayBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQordm9pZCBfX2RldmluaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKLQlwY2lfcmVhZF9icmlkZ2VfYmFzZXMoYnVzKTsKLX0KKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gYnVzLT5zZWxmOworCXN0cnVjdCBsaXN0X2hlYWQgKmxuOworCXN0cnVjdCBwY2lfY2hhbm5lbCAqY2hhbiA9IGJ1cy0+c3lzZGF0YTsKIAotdm9pZCBwY2liaW9zX2FsaWduX3Jlc291cmNlKHZvaWQgKmRhdGEsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJICAgIHJlc291cmNlX3NpemVfdCBzaXplLCByZXNvdXJjZV9zaXplX3QgYWxpZ24pCi0JCQkgICAgX19hdHRyaWJ1dGVfXyAoKHdlYWspKTsKKwlpZiAoIWRldikgeworCQlidXMtPnJlc291cmNlWzBdID0gY2hhbi0+aW9fcmVzb3VyY2U7CisJCWJ1cy0+cmVzb3VyY2VbMV0gPSBjaGFuLT5tZW1fcmVzb3VyY2U7CisJfQorCisJZm9yIChsbiA9IGJ1cy0+ZGV2aWNlcy5uZXh0OyBsbiAhPSAmYnVzLT5kZXZpY2VzOyBsbiA9IGxuLT5uZXh0KSB7CisJCWRldiA9IHBjaV9kZXZfYihsbik7CisKKwkJaWYgKChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19CUklER0VfUENJKQorCQkJcGNpYmlvc19maXh1cF9kZXZpY2VfcmVzb3VyY2VzKGRldiwgYnVzKTsKKwl9Cit9CiAKIC8qCiAgKiBXZSBuZWVkIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBgbWlycm9yZWQnIFZHQSBwb3J0cwpAQCAtNzIsMTQgKzE2MSw1OCBAQAogdm9pZCBwY2liaW9zX2FsaWduX3Jlc291cmNlKHZvaWQgKmRhdGEsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAogCQkJICAgIHJlc291cmNlX3NpemVfdCBzaXplLCByZXNvdXJjZV9zaXplX3QgYWxpZ24pCiB7Ci0JaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7Ci0JCXJlc291cmNlX3NpemVfdCBzdGFydCA9IHJlcy0+c3RhcnQ7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGRhdGE7CisJc3RydWN0IHBjaV9jaGFubmVsICpjaGFuID0gZGV2LT5zeXNkYXRhOworCXJlc291cmNlX3NpemVfdCBzdGFydCA9IHJlcy0+c3RhcnQ7CiAKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJaWYgKHN0YXJ0IDwgUENJQklPU19NSU5fSU8gKyBjaGFuLT5pb19yZXNvdXJjZS0+c3RhcnQpCisJCQlzdGFydCA9IFBDSUJJT1NfTUlOX0lPICsgY2hhbi0+aW9fcmVzb3VyY2UtPnN0YXJ0OworCisJCS8qCisgICAgICAgICAgICAgICAgICogUHV0IGV2ZXJ5dGhpbmcgaW50byAweDAwLTB4ZmYgcmVnaW9uIG1vZHVsbyAweDQwMC4KKwkJICovCiAJCWlmIChzdGFydCAmIDB4MzAwKSB7CiAJCQlzdGFydCA9IChzdGFydCArIDB4M2ZmKSAmIH4weDNmZjsKIAkJCXJlcy0+c3RhcnQgPSBzdGFydDsKIAkJfQorCX0gZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CisJCWlmIChzdGFydCA8IFBDSUJJT1NfTUlOX01FTSArIGNoYW4tPm1lbV9yZXNvdXJjZS0+c3RhcnQpCisJCQlzdGFydCA9IFBDSUJJT1NfTUlOX01FTSArIGNoYW4tPm1lbV9yZXNvdXJjZS0+c3RhcnQ7CiAJfQorCisJcmVzLT5zdGFydCA9IHN0YXJ0OworfQorCit2b2lkIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLAorCQkJIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSA9IGRldi0+c3lzZGF0YTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCW9mZnNldCA9IGhvc2UtPmlvX29mZnNldDsKKwllbHNlIGlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCW9mZnNldCA9IGhvc2UtPm1lbV9vZmZzZXQ7CisKKwlyZWdpb24tPnN0YXJ0ID0gcmVzLT5zdGFydCAtIG9mZnNldDsKKwlyZWdpb24tPmVuZCA9IHJlcy0+ZW5kIC0gb2Zmc2V0OworfQorCit2b2lkIF9fZGV2aW5pdAorcGNpYmlvc19idXNfdG9fcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyZXMsCisJCQlzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbikKK3sKKwlzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UgPSBkZXYtPnN5c2RhdGE7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlvZmZzZXQgPSBob3NlLT5pb19vZmZzZXQ7CisJZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlvZmZzZXQgPSBob3NlLT5tZW1fb2Zmc2V0OworCisJcmVzLT5zdGFydCA9IHJlZ2lvbi0+c3RhcnQgKyBvZmZzZXQ7CisJcmVzLT5lbmQgPSByZWdpb24tPmVuZCArIG9mZnNldDsKIH0KIAogaW50IHBjaWJpb3NfZW5hYmxlX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzaykKQEAgLTkwLDEzICsyMjMsMjEgQEAKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOwogCW9sZF9jbWQgPSBjbWQ7Ci0JZm9yKGlkeD0wOyBpZHg8NjsgaWR4KyspIHsKLQkJaWYgKCEobWFzayAmICgxIDw8IGlkeCkpKQorCWZvciAoaWR4PTA7IGlkeCA8IFBDSV9OVU1fUkVTT1VSQ0VTOyBpZHgrKykgeworCQkvKiBPbmx5IHNldCB1cCB0aGUgcmVxdWVzdGVkIHN0dWZmICovCisJCWlmICghKG1hc2sgJiAoMTw8aWR4KSkpCiAJCQljb250aW51ZTsKKwogCQlyID0gJmRldi0+cmVzb3VyY2VbaWR4XTsKKwkJaWYgKCEoci0+ZmxhZ3MgJiAoSU9SRVNPVVJDRV9JTyB8IElPUkVTT1VSQ0VfTUVNKSkpCisJCQljb250aW51ZTsKKwkJaWYgKChpZHggPT0gUENJX1JPTV9SRVNPVVJDRSkgJiYKKwkJCQkoIShyLT5mbGFncyAmIElPUkVTT1VSQ0VfUk9NX0VOQUJMRSkpKQorCQkJY29udGludWU7CiAJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSAiCi0JCQkgICAgICAgIm9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsIHBjaV9uYW1lKGRldikpOworCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IERldmljZSAlcyBub3QgYXZhaWxhYmxlICIKKwkJCSAgICAgICAiYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKGRldikpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9JTykKQEAgLTEwNCwxMCArMjQ1LDggQEAKIAkJaWYgKHItPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCiAJCQljbWQgfD0gUENJX0NPTU1BTkRfTUVNT1JZOwogCX0KLQlpZiAoZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09VUkNFXS5zdGFydCkKLQkJY21kIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKIAlpZiAoY21kICE9IG9sZF9jbWQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsCisJCXByaW50aygiUENJOiBFbmFibGluZyBkZXZpY2UgJXMgKCUwNHggLT4gJTA0eClcbiIsCiAJCSAgICAgICBwY2lfbmFtZShkZXYpLCBvbGRfY21kLCBjbWQpOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKIAl9CkBAIC0xNDAsNiArMjc5LDQzIEBACiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOwogfQogCitjaGFyICogX19kZXZpbml0IHBjaWJpb3Nfc2V0dXAoY2hhciAqc3RyKQoreworCXJldHVybiBzdHI7Cit9CisKK2ludCBwY2lfbW1hcF9wYWdlX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLCBpbnQgd3JpdGVfY29tYmluZSkKK3sKKwkvKgorCSAqIEkvTyBzcGFjZSBjYW4gYmUgYWNjZXNzZWQgdmlhIG5vcm1hbCBwcm9jZXNzb3IgbG9hZHMgYW5kIHN0b3JlcyBvbgorCSAqIHRoaXMgcGxhdGZvcm0gYnV0IGZvciBub3cgd2UgZWxlY3Qgbm90IHRvIGRvIHRoaXMgYW5kIHBvcnRhYmxlCisJICogZHJpdmVycyBzaG91bGQgbm90IGRvIHRoaXMgYW55d2F5LgorCSAqLworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogSWdub3JlIHdyaXRlLWNvbWJpbmU7IGZvciBub3cgb25seSByZXR1cm4gdW5jYWNoZWQgbWFwcGluZ3MuCisJICovCisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCXJldHVybiByZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmLAorCQkJICAgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCSAgICAgICB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmlvcG9ydF9tYXBfcGNpKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IG5yKQoreworCXN0cnVjdCBwY2lfY2hhbm5lbCAqY2hhbiA9IGRldi0+c3lzZGF0YTsKKworCWlmICghY2hhbi0+aW9fbWFwX2Jhc2UpCisJCWNoYW4tPmlvX21hcF9iYXNlID0gZ2VuZXJpY19pb19iYXNlOworCisJcmV0dXJuICh2b2lkIF9faW9tZW0gKikoY2hhbi0+aW9fbWFwX2Jhc2UgKyBwb3J0KTsKK30KKwogdm9pZCBfX2lvbWVtICpwY2lfaW9tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwgdW5zaWduZWQgbG9uZyBtYXhsZW4pCiB7CiAJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgYmFyKTsKQEAgLTE1MSwyMCArMzI3LDI0IEBACiAJaWYgKG1heGxlbiAmJiBsZW4gPiBtYXhsZW4pCiAJCWxlbiA9IG1heGxlbjsKIAorCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJldHVybiBpb3BvcnRfbWFwX3BjaShkZXYsIHN0YXJ0LCBsZW4pOworCiAJLyoKIAkgKiBQcmVzZW50bHkgdGhlIElPUkVTT1VSQ0VfTUVNIGNhc2UgaXMgYSBiaXQgc3BlY2lhbCwgbW9zdAogCSAqIFNINzc1MSBzdHlsZSBQQ0kgY29udHJvbGxlcnMgaGF2ZSBQQ0kgbWVtb3J5IGF0IGEgZml4ZWQKLQkgKiBsb2NhdGlvbiBpbiB0aGUgYWRkcmVzcyBzcGFjZSB3aGVyZSBubyByZW1hcHBpbmcgaXMgZGVzaXJlZAotCSAqICh0eXBpY2FsbHkgYXQgMHhmZDAwMDAwMCwgYnV0IGlzX3BjaV9tZW1hZGRyKCkgd2lsbCBrbm93Ci0JICogYmVzdCkuIFdpdGggdGhlIElPUkVTT1VSQ0VfTUVNIGNhc2UgbW9yZSBjYXJlIGhhcyB0byBiZSB0YWtlbgorCSAqIGxvY2F0aW9uIGluIHRoZSBhZGRyZXNzIHNwYWNlIHdoZXJlIG5vIHJlbWFwcGluZyBpcyBkZXNpcmVkLgorCSAqIFdpdGggdGhlIElPUkVTT1VSQ0VfTUVNIGNhc2UgbW9yZSBjYXJlIGhhcyB0byBiZSB0YWtlbgogCSAqIHRvIGluaGliaXQgcGFnZSB0YWJsZSBtYXBwaW5nIGZvciBsZWdhY3kgY29yZXMsIGJ1dCB0aGlzIGlzCiAJICogcHVudGVkIG9mZiB0byBfX2lvcmVtYXAoKS4KIAkgKgkJCQkJLS0gUEZNLgogCSAqLwotCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pCi0JCXJldHVybiBpb3BvcnRfbWFwKHN0YXJ0LCBsZW4pOwotCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKQotCQlyZXR1cm4gaW9yZW1hcChzdGFydCwgbGVuKTsKKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0NBQ0hFQUJMRSkKKwkJCXJldHVybiBpb3JlbWFwKHN0YXJ0LCBsZW4pOworCisJCXJldHVybiBpb3JlbWFwX25vY2FjaGUoc3RhcnQsIGxlbik7CisJfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xNzUsMyArMzU1LDEwIEBACiAJaW91bm1hcChhZGRyKTsKIH0KIEVYUE9SVF9TWU1CT0wocGNpX2lvdW5tYXApOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUcKK0VYUE9SVF9TWU1CT0wocGNpYmlvc19yZXNvdXJjZV90b19idXMpOworRVhQT1JUX1NZTUJPTChwY2liaW9zX2J1c190b19yZXNvdXJjZSk7CitFWFBPUlRfU1lNQk9MKFBDSUJJT1NfTUlOX0lPKTsKK0VYUE9SVF9TWU1CT0woUENJQklPU19NSU5fTUVNKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMtbGxzYy5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMtbGxzYy5oCmluZGV4IDRiMDBiNzguLmIwNDBlMWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLWxsc2MuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy1sbHNjLmgKQEAgLTEwNCw0ICsxMDQsMzEgQEAKIAk6ICJ0Iik7CiB9CiAKKyNkZWZpbmUgYXRvbWljX2NtcHhjaGcodiwgbywgbikgKGNtcHhjaGcoJigodiktPmNvdW50ZXIpLCAobyksIChuKSkpCisKKy8qKgorICogYXRvbWljX2FkZF91bmxlc3MgLSBhZGQgdW5sZXNzIHRoZSBudW1iZXIgaXMgYSBnaXZlbiB2YWx1ZQorICogQHY6IHBvaW50ZXIgb2YgdHlwZSBhdG9taWNfdAorICogQGE6IHRoZSBhbW91bnQgdG8gYWRkIHRvIHYuLi4KKyAqIEB1OiAuLi51bmxlc3MgdiBpcyBlcXVhbCB0byB1LgorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAYSB0byBAdiwgc28gbG9uZyBhcyBpdCB3YXMgbm90IEB1LgorICogUmV0dXJucyBub24temVybyBpZiBAdiB3YXMgbm90IEB1LCBhbmQgemVybyBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfdW5sZXNzKGF0b21pY190ICp2LCBpbnQgYSwgaW50IHUpCit7CisJaW50IGMsIG9sZDsKKwljID0gYXRvbWljX3JlYWQodik7CisJZm9yICg7OykgeworCQlpZiAodW5saWtlbHkoYyA9PSAodSkpKQorCQkJYnJlYWs7CisJCW9sZCA9IGF0b21pY19jbXB4Y2hnKCh2KSwgYywgYyArIChhKSk7CisJCWlmIChsaWtlbHkob2xkID09IGMpKQorCQkJYnJlYWs7CisJCWMgPSBvbGQ7CisJfQorCisJcmV0dXJuIGMgIT0gKHUpOworfQorCiAjZW5kaWYgLyogX19BU01fU0hfQVRPTUlDX0xMU0NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggNjMyN2ZmYi4uOTc4YjU4ZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2F0b21pYy5oCkBAIC00NSw3ICs0NSw3IEBACiAjZGVmaW5lIGF0b21pY19pbmModikgYXRvbWljX2FkZCgxLCh2KSkKICNkZWZpbmUgYXRvbWljX2RlYyh2KSBhdG9taWNfc3ViKDEsKHYpKQogCi0jaWZuZGVmIENPTkZJR19HVVNBX1JCCisjaWYgIWRlZmluZWQoQ09ORklHX0dVU0FfUkIpICYmICFkZWZpbmVkKENPTkZJR19DUFVfU0g0QSkKIHN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19jbXB4Y2hnKGF0b21pY190ICp2LCBpbnQgb2xkLCBpbnQgbmV3KQogewogCWludCByZXQ7CkBAIC03Myw3ICs3Myw3IEBACiAKIAlyZXR1cm4gcmV0ICE9IHU7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiAhQ09ORklHX0dVU0FfUkIgJiYgIUNPTkZJR19DUFVfU0g0QSAqLwogCiAjZGVmaW5lIGF0b21pY194Y2hnKHYsIG5ldykgKHhjaGcoJigodiktPmNvdW50ZXIpLCBuZXcpKQogI2RlZmluZSBhdG9taWNfaW5jX25vdF96ZXJvKHYpIGF0b21pY19hZGRfdW5sZXNzKCh2KSwgMSwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vY2FjaGVmbHVzaC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKaW5kZXggMDlhY2JjMy4uNGM1NDYyZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoLmgKQEAgLTc1LDcgKzc1LDUgQEAKICNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCwgZW5kKQkJZmx1c2hfY2FjaGVfYWxsKCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfdnVubWFwKHN0YXJ0LCBlbmQpCQlmbHVzaF9jYWNoZV9hbGwoKQogCi0jZGVmaW5lIEhBVkVfQVJDSF9VTk1BUFBFRF9BUkVBCi0KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fU0hfQ0FDSEVGTFVTSF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2Nsb2NrLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2Nsb2NrLmgKaW5kZXggMmY2Yzk2Mi4uOWZlN2Q3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9jbG9jay5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vY2xvY2suaApAQCAtMSw5ICsxLDkgQEAKICNpZm5kZWYgX19BU01fU0hfQ0xPQ0tfSAogI2RlZmluZSBfX0FTTV9TSF9DTE9DS19ICiAKLSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCkBAIC0xMSw5ICsxMSw5IEBACiAKIHN0cnVjdCBjbGtfb3BzIHsKIAl2b2lkICgqaW5pdCkoc3RydWN0IGNsayAqY2xrKTsKLQl2b2lkICgqZW5hYmxlKShzdHJ1Y3QgY2xrICpjbGspOworCWludCAoKmVuYWJsZSkoc3RydWN0IGNsayAqY2xrKTsKIAl2b2lkICgqZGlzYWJsZSkoc3RydWN0IGNsayAqY2xrKTsKLQl2b2lkICgqcmVjYWxjKShzdHJ1Y3QgY2xrICpjbGspOworCXVuc2lnbmVkIGxvbmcgKCpyZWNhbGMpKHN0cnVjdCBjbGsgKmNsayk7CiAJaW50ICgqc2V0X3JhdGUpKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlLCBpbnQgYWxnb19pZCk7CiAJaW50ICgqc2V0X3BhcmVudCkoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpOwogCWxvbmcgKCpyb3VuZF9yYXRlKShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CkBAIC0yOCw0MyArMjgsNDcgQEAKIAlzdHJ1Y3QgY2xrCQkqcGFyZW50OwogCXN0cnVjdCBjbGtfb3BzCQkqb3BzOwogCi0Jc3RydWN0IGtyZWYJCWtyZWY7CisJc3RydWN0IGxpc3RfaGVhZAljaGlsZHJlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXNpYmxpbmc7CS8qIG5vZGUgZm9yIGNoaWxkcmVuICovCisKKwlpbnQJCQl1c2Vjb3VudDsKIAogCXVuc2lnbmVkIGxvbmcJCXJhdGU7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwl2b2lkIF9faW9tZW0JCSplbmFibGVfcmVnOworCXVuc2lnbmVkIGludAkJZW5hYmxlX2JpdDsKKwogCXVuc2lnbmVkIGxvbmcJCWFyY2hfZmxhZ3M7CisJdm9pZAkJCSpwcml2OworCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlOwogfTsKIAotI2RlZmluZSBDTEtfQUxXQVlTX0VOQUJMRUQJKDEgPDwgMCkKLSNkZWZpbmUgQ0xLX1JBVEVfUFJPUEFHQVRFUwkoMSA8PCAxKQorc3RydWN0IGNsa19sb29rdXAgeworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwljb25zdCBjaGFyCQkqZGV2X2lkOworCWNvbnN0IGNoYXIJCSpjb25faWQ7CisJc3RydWN0IGNsawkJKmNsazsKK307CisKKyNkZWZpbmUgQ0xLX0VOQUJMRV9PTl9JTklUCSgxIDw8IDApCiAKIC8qIFNob3VsZCBiZSBkZWZpbmVkIGJ5IHByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlICovCi12b2lkIGFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqLCBpbnQgdHlwZSk7Cit2b2lkIF9fZGVwcmVjYXRlZCBhcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKiwgaW50IHR5cGUpOwogaW50IF9faW5pdCBhcmNoX2Nsa19pbml0KHZvaWQpOwogCiAvKiBhcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2suYyAqLwogaW50IGNsa19pbml0KHZvaWQpOwotCi12b2lkIGNsa19yZWNhbGNfcmF0ZShzdHJ1Y3QgY2xrICopOwotCit1bnNpZ25lZCBsb25nIGZvbGxvd3BhcmVudF9yZWNhbGMoc3RydWN0IGNsayAqKTsKK3ZvaWQgcmVjYWxjdWxhdGVfcm9vdF9jbG9ja3Modm9pZCk7Cit2b2lkIHByb3BhZ2F0ZV9yYXRlKHN0cnVjdCBjbGsgKik7CitpbnQgY2xrX3JlcGFyZW50KHN0cnVjdCBjbGsgKmNoaWxkLCBzdHJ1Y3QgY2xrICpwYXJlbnQpOwogaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICopOwogdm9pZCBjbGtfdW5yZWdpc3RlcihzdHJ1Y3QgY2xrICopOwogCi1zdGF0aWMgaW5saW5lIGludCBjbGtfYWx3YXlzX2VuYWJsZShjb25zdCBjaGFyICppZCkKLXsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0JaW50IHJldDsKLQotCWNsayA9IGNsa19nZXQoTlVMTCwgaWQpOwotCWlmIChJU19FUlIoY2xrKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKLQotCXJldCA9IGNsa19lbmFibGUoY2xrKTsKLQlpZiAocmV0KQotCQljbGtfcHV0KGNsayk7Ci0KLQlyZXR1cm4gcmV0OwotfQorLyogYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLWNwZy5jICovCitpbnQgX19pbml0IF9fZGVwcmVjYXRlZCBjcGdfY2xrX2luaXQodm9pZCk7CiAKIC8qIHRoZSBleHBvcnRlZCBBUEksIGluIGFkZGl0aW9uIHRvIGNsa19zZXRfcmF0ZSAqLwogLyoqCkBAIC05Niw0ICsxMDAsNjMgQEAKIAogCUlQX04xLAogfTsKKworc3RydWN0IGNsa19kaXZfbXVsdF90YWJsZSB7CisJdW5zaWduZWQgaW50ICpkaXZpc29yczsKKwl1bnNpZ25lZCBpbnQgbnJfZGl2aXNvcnM7CisJdW5zaWduZWQgaW50ICptdWx0aXBsaWVyczsKKwl1bnNpZ25lZCBpbnQgbnJfbXVsdGlwbGllcnM7Cit9OworCitzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGU7Cit2b2lkIGNsa19yYXRlX3RhYmxlX2J1aWxkKHN0cnVjdCBjbGsgKmNsaywKKwkJCSAgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLAorCQkJICBpbnQgbnJfZnJlcXMsCisJCQkgIHN0cnVjdCBjbGtfZGl2X211bHRfdGFibGUgKnNyY190YWJsZSwKKwkJCSAgdW5zaWduZWQgbG9uZyAqYml0bWFwKTsKKworbG9uZyBjbGtfcmF0ZV90YWJsZV9yb3VuZChzdHJ1Y3QgY2xrICpjbGssCisJCQkgIHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZSwKKwkJCSAgdW5zaWduZWQgbG9uZyByYXRlKTsKKworaW50IGNsa19yYXRlX3RhYmxlX2ZpbmQoc3RydWN0IGNsayAqY2xrLAorCQkJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLAorCQkJdW5zaWduZWQgbG9uZyByYXRlKTsKKworI2RlZmluZSBTSF9DTEtfTVNUUDMyKF9uYW1lLCBfaWQsIF9wYXJlbnQsIF9lbmFibGVfcmVnLAlcCisJICAgIF9lbmFibGVfYml0LCBfZmxhZ3MpCQkJXAorewkJCQkJCQlcCisJLm5hbWUJCT0gX25hbWUsCQkJXAorCS5pZAkJPSBfaWQsCQkJCVwKKwkucGFyZW50CQk9IF9wYXJlbnQsCQkJXAorCS5lbmFibGVfcmVnCT0gKHZvaWQgX19pb21lbSAqKV9lbmFibGVfcmVnLAlcCisJLmVuYWJsZV9iaXQJPSBfZW5hYmxlX2JpdCwJCQlcCisJLmZsYWdzCQk9IF9mbGFncywJCQlcCit9CisKK2ludCBzaF9jbGtfbXN0cDMyX3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsa3MsIGludCBucik7CisKKyNkZWZpbmUgU0hfQ0xLX0RJVjQoX25hbWUsIF9wYXJlbnQsIF9yZWcsIF9zaGlmdCwgX2Rpdl9iaXRtYXAsIF9mbGFncykJXAorewkJCQkJCQkJCVwKKwkubmFtZSA9IF9uYW1lLAkJCQkJCQlcCisJLnBhcmVudCA9IF9wYXJlbnQsCQkJCQkJXAorCS5lbmFibGVfcmVnID0gKHZvaWQgX19pb21lbSAqKV9yZWcsCQkJCVwKKwkuZW5hYmxlX2JpdCA9IF9zaGlmdCwJCQkJCQlcCisJLmFyY2hfZmxhZ3MgPSBfZGl2X2JpdG1hcCwJCQkJCVwKKwkuZmxhZ3MgPSBfZmxhZ3MsCQkJCQkJXAorfQorCitpbnQgc2hfY2xrX2RpdjRfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrcywgaW50IG5yLAorCQkJIHN0cnVjdCBjbGtfZGl2X211bHRfdGFibGUgKnRhYmxlKTsKKworI2RlZmluZSBTSF9DTEtfRElWNihfbmFtZSwgX3BhcmVudCwgX3JlZywgX2ZsYWdzKQlcCit7CQkJCQkJCVwKKwkubmFtZSA9IF9uYW1lLAkJCQkJXAorCS5wYXJlbnQgPSBfcGFyZW50LAkJCQlcCisJLmVuYWJsZV9yZWcgPSAodm9pZCBfX2lvbWVtICopX3JlZywJCVwKKwkuZmxhZ3MgPSBfZmxhZ3MsCQkJCVwKK30KKworaW50IHNoX2Nsa19kaXY2X3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsa3MsIGludCBucik7CisKICNlbmRpZiAvKiBfX0FTTV9TSF9DTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2NtcHhjaGctbGxzYy5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9jbXB4Y2hnLWxsc2MuaAppbmRleCAwZmFjM2RhLi40NzEzNjY2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2NtcHhjaGctbGxzYy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vY21weGNoZy1sbHNjLmgKQEAgLTU1LDcgKzU1LDcgQEAKIAkJIm1vdgkJJTAsICUxCQkJCVxuXHQiCiAJCSJjbXAvZXEJCSUxLCAlMwkJCQlcblx0IgogCQkiYmYJCTJmCQkJCVxuXHQiCi0JCSJtb3YJCSUzLCAlMAkJCQlcblx0IgorCQkibW92CQklNCwgJTAJCQkJXG5cdCIKIAkJIjI6CQkJCQkJXG5cdCIKIAkJIm1vdmNvLmwJJTAsIEAlMgkJCQlcblx0IgogCQkiYmYJCTFiCQkJCVxuXHQiCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2RldmljZS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9kZXZpY2UuaAppbmRleCBlZmQ1MTFkLi44Njg4YTg4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vZGV2aWNlLmgKQEAgLTEwLDMgKzEwLDUgQEAKIGludCBwbGF0Zm9ybV9yZXNvdXJjZV9zZXR1cF9tZW1vcnkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJCQkgICBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIG1lbXNpemUpOwogCit2b2lkIHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpOworCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2hkNjQ0NjEuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vaGQ2NDQ2MS5oCmluZGV4IDUyYjRiNjIuLjk3NzM1NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vaGQ2NDQ2MS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vaGQ2NDQ2MS5oCkBAIC0xMywxOCArMTMsMjAgQEAKICNkZWZpbmUJSEQ2NDQ2MV9QQ0NfV0lORE9XCTB4MDEwMDAwMDAKIAogLyogQXJlYSA2IC0gU2xvdCAwIC0gbWVtb3J5IGFuZC9vciBJTyBjYXJkICovCi0jZGVmaW5lCUhENjQ0NjFfUENDMF9CQVNFCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDgwMDAwMDApCisjZGVmaW5lIEhENjQ0NjFfSU9CQVNFCQkweGIwMDAwMDAwCisjZGVmaW5lIEhENjQ0NjFfSU9fT0ZGU0VUKHgpCShIRDY0NDYxX0lPQkFTRSArICh4KSkKKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwX0JBU0UJSEQ2NDQ2MV9JT19PRkZTRVQoMHg4MDAwMDAwKQogI2RlZmluZQlIRDY0NDYxX1BDQzBfQVRUUgkoSEQ2NDQ2MV9QQ0MwX0JBU0UpCQkJCS8qIDB4YjgwMDAwMDAwICovCiAjZGVmaW5lCUhENjQ0NjFfUENDMF9DT01NCShIRDY0NDYxX1BDQzBfQkFTRStIRDY0NDYxX1BDQ19XSU5ET1cpCQkvKiAweGI5MDAwMDAwMCAqLwogI2RlZmluZQlIRDY0NDYxX1BDQzBfSU8JCShIRDY0NDYxX1BDQzBfQkFTRSsyKkhENjQ0NjFfUENDX1dJTkRPVykJLyogMHhiYTAwMDAwMDAgKi8KIAogLyogQXJlYSA1IC0gU2xvdCAxIC0gbWVtb3J5IGNhcmQgb25seSAqLwotI2RlZmluZQlIRDY0NDYxX1BDQzFfQkFTRQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDAwMDAwKQorI2RlZmluZQlIRDY0NDYxX1BDQzFfQkFTRQlIRDY0NDYxX0lPX09GRlNFVCgweDQwMDAwMDApCiAjZGVmaW5lCUhENjQ0NjFfUENDMV9BVFRSCShIRDY0NDYxX1BDQzFfQkFTRSkJCQkJLyogMHhiNDAwMDAwMCAqLwogI2RlZmluZQlIRDY0NDYxX1BDQzFfQ09NTQkoSEQ2NDQ2MV9QQ0MxX0JBU0UrSEQ2NDQ2MV9QQ0NfV0lORE9XKQkJLyogMHhiNTAwMDAwMCAqLwogCiAvKiBTdGFuZGJ5IENvbnRyb2wgUmVnaXN0ZXIgZm9yIEhENjQ0NjEgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9TVEJDUgkJCUNPTkZJR19IRDY0NDYxX0lPQkFTRQorI2RlZmluZQlIRDY0NDYxX1NUQkNSCQkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgwMDAwMDAwMCkKICNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9DS0lPX1NUQlkJCTB4MjAwMAogI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NBRkVDS0VfSVNUCTB4MTAwMAogI2RlZmluZQlIRDY0NDYxX1NUQkNSX1NMQ0tFX0lTVAkJMHgwODAwCkBAIC00MSwxOSArNDMsMTkgQEAKICNkZWZpbmUJSEQ2NDQ2MV9TVEJDUl9TVVJUU1QJCTB4MDAwMQogCiAvKiBTeXN0ZW0gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwotI2RlZmluZQlIRDY0NDYxX1NZU0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgwMikKKyNkZWZpbmUJSEQ2NDQ2MV9TWVNDUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgwMikKIAogLyogQ1BVIERhdGEgQnVzIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9TQ1BVQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDA0KQorI2RlZmluZQlIRDY0NDYxX1NDUFVDUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgwNCkKIAogLyogQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lCUhENjQ0NjFfTENEQ0JBUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAwMCkKKyNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQkFSCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwMDApCiAKIC8qIExpbmUgaW5jcmVtZW50IGFkZHJlc3MgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9MQ0RDTE9SCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDAyKQorI2RlZmluZQlIRDY0NDYxX0xDRENMT1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTAwMikKIAogLyogQ29udHJvbHMgTENEIGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9MQ0RDQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMDQpCisjZGVmaW5lCUhENjQ0NjFfTENEQ0NSCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwMDQpCiAKIC8qIExDQ0RSIGNvbnRyb2wgYml0cyAqLwogI2RlZmluZQlIRDY0NDYxX0xDRENDUl9TVEJBQ0sJMHgwNDAwCS8qIFN0YW5kYnkgQmFjayAqLwpAQCAtNjQsMzAgKzY2LDMwIEBACiAjZGVmaW5lCUhENjQ0NjFfTENEQ0NSX1NQT04JMHgwMDEwCS8qIFN0YXJ0IFBvd2VyIE9uICovCiAKIC8qIENvbnRyb2xzIExDRCAoMSkgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9MRFIxCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDEwKQorI2RlZmluZQlIRDY0NDYxX0xEUjEJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTAxMCkKICNkZWZpbmUJSEQ2NDQ2MV9MRFIxX0RPTgkweDAxCS8qIERpc3BsYXkgT24gKi8KICNkZWZpbmUJSEQ2NDQ2MV9MRFIxX0RJTlYJMHg4MAkvKiBEaXNwbGF5IEludmVydCAqLwogCiAvKiBDb250cm9scyBMQ0QgKDIpICovCi0jZGVmaW5lCUhENjQ0NjFfTERSMgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAxMikKLSNkZWZpbmUJSEQ2NDQ2MV9MREhOQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMTQpCS8qIE51bWJlciBvZiBob3Jpem9udGFsIGNoYXJhY3RlcnMgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9MREhOU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMTYpCS8qIFNwZWNpZnkgb3V0cHV0IHN0YXJ0IHBvc2l0aW9uICsgd2lkdGggb2YgQ0wxICovCi0jZGVmaW5lCUhENjQ0NjFfTERWTlRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDE4KQkvKiBTcGVjaWZ5IHRvdGFsIHZlcnRpY2FsIGxpbmVzICovCi0jZGVmaW5lCUhENjQ0NjFfTERWTkRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFhKQkvKiBzcGVjaWZ5IG51bWJlciBvZiBkaXNwbGF5IHZlcnRpY2FsIGxpbmVzICovCi0jZGVmaW5lCUhENjQ0NjFfTERWU1BSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFjKQkvKiBzcGVjaWZ5IHZlcnRpY2FsIHN5bmNocm9uaXphdGlvbiBwb3MgYW5kIEFDIG5yICovCisjZGVmaW5lCUhENjQ0NjFfTERSMgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDEyKQorI2RlZmluZQlIRDY0NDYxX0xESE5DUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDE0KQkvKiBOdW1iZXIgb2YgaG9yaXpvbnRhbCBjaGFyYWN0ZXJzICovCisjZGVmaW5lCUhENjQ0NjFfTERITlNSCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwMTYpCS8qIFNwZWNpZnkgb3V0cHV0IHN0YXJ0IHBvc2l0aW9uICsgd2lkdGggb2YgQ0wxICovCisjZGVmaW5lCUhENjQ0NjFfTERWTlRSCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwMTgpCS8qIFNwZWNpZnkgdG90YWwgdmVydGljYWwgbGluZXMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MRFZORFIJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTAxYSkJLyogc3BlY2lmeSBudW1iZXIgb2YgZGlzcGxheSB2ZXJ0aWNhbCBsaW5lcyAqLworI2RlZmluZQlIRDY0NDYxX0xEVlNQUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDFjKQkvKiBzcGVjaWZ5IHZlcnRpY2FsIHN5bmNocm9uaXphdGlvbiBwb3MgYW5kIEFDIG5yICovCiAKIC8qIENvbnRyb2xzIExDRCAoMykgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9MRFIzCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDFlKQorI2RlZmluZQlIRDY0NDYxX0xEUjMJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTAxZSkKIAogLyogUGFsZXR0ZSBSZWdpc3RlcnMgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9DUFRXQVIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwMzApCS8qIENvbG9yIFBhbGV0dGUgV3JpdGUgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlIRDY0NDYxX0NQVFdEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzMikJLyogQ29sb3IgUGFsZXR0ZSBXcml0ZSBEYXRhIFJlZ2lzdGVyICovCi0jZGVmaW5lCUhENjQ0NjFfQ1BUUkFSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDM0KQkvKiBDb2xvciBQYWxldHRlIFJlYWQgQWRkcmVzcyBSZWdpc3RlciAqLwotI2RlZmluZQlIRDY0NDYxX0NQVFJEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTAzNikJLyogQ29sb3IgUGFsZXR0ZSBSZWFkIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9DUFRXQVIJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTAzMCkJLyogQ29sb3IgUGFsZXR0ZSBXcml0ZSBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfQ1BUV0RSCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwMzIpCS8qIENvbG9yIFBhbGV0dGUgV3JpdGUgRGF0YSBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0NQVFJBUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDM0KQkvKiBDb2xvciBQYWxldHRlIFJlYWQgQWRkcmVzcyBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0NQVFJEUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDM2KQkvKiBDb2xvciBQYWxldHRlIFJlYWQgRGF0YSBSZWdpc3RlciAqLwogCi0jZGVmaW5lCUhENjQ0NjFfR1JET1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDApCS8qIERpc3BsYXkgUmVzb2x1dGlvbiBPZmZzZXQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9HUlNDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA0MikJLyogU29saWQgQ29sb3IgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDQpCS8qIEFjY2VsZXJhdG9yIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkRPUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDQwKQkvKiBEaXNwbGF5IFJlc29sdXRpb24gT2Zmc2V0IFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfR1JTQ1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTA0MikJLyogU29saWQgQ29sb3IgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUkNGR1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTA0NCkJLyogQWNjZWxlcmF0b3IgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwogCiAjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0FDQ1NUQVRVUwkweDEwCS8qIEFjY2VsZXJhdG9yIFN0YXR1cyAqLwogI2RlZmluZQlIRDY0NDYxX0dSQ0ZHUl9BQ0NSRVNFVAkJMHgwOAkvKiBBY2NlbGVyYXRvciBSZXNldCAqLwpAQCAtOTcsNDEgKzk5LDQxIEBACiAjZGVmaW5lCUhENjQ0NjFfR1JDRkdSX0NPTE9SREVQVEg4CTB4MDEJLyogU2V0cyBDb2xvcmRlcHRoIDggZm9yIEFjY2VsZXJhdG9yICovCiAKIC8qIExpbmUgRHJhd2luZyBSZWdpc3RlcnMgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9MTlNBUkgJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDYpCS8qIExpbmUgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoSCkgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9MTlNBUkwJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNDgpCS8qIExpbmUgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoTCkgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9MTkFYTFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGEpCS8qIEF4aXMgUGl4ZWwgTGVuZ3RoIFJlZ2lzdGVyICovCi0jZGVmaW5lCUhENjQ0NjFfTE5ER1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGMpCS8qIERpYWdvbmFsIFJlZ2lzdGVyICovCi0jZGVmaW5lCUhENjQ0NjFfTE5BWFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNGUpCS8qIEF4aWFsIFJlZ2lzdGVyICovCi0jZGVmaW5lCUhENjQ0NjFfTE5FUlRSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDUwKQkvKiBTdGFydCBFcnJvciBUZXJtIFJlZ2lzdGVyICovCi0jZGVmaW5lCUhENjQ0NjFfTE5NRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTIpCS8qIExpbmUgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0xOU0FSSAkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDQ2KQkvKiBMaW5lIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfTE5TQVJMCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwNDgpCS8qIExpbmUgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkFYTFIJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTA0YSkJLyogQXhpcyBQaXhlbCBMZW5ndGggUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTkRHUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDRjKQkvKiBEaWFnb25hbCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0xOQVhSCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwNGUpCS8qIEF4aWFsIFJlZ2lzdGVyICovCisjZGVmaW5lCUhENjQ0NjFfTE5FUlRSCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwNTApCS8qIFN0YXJ0IEVycm9yIFRlcm0gUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9MTk1EUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDUyKQkvKiBMaW5lIE1vZGUgUmVnaXN0ZXIgKi8KIAogLyogQml0QkxUIFJlZ2lzdGVycyAqLwotI2RlZmluZQlIRDY0NDYxX0JCVFNTQVJICShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTQpCS8qIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIChIKSAqLwotI2RlZmluZQlIRDY0NDYxX0JCVFNTQVJMCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTYpCS8qIFNvdXJjZSBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIChMKSAqLwotI2RlZmluZQlIRDY0NDYxX0JCVERTQVJICShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNTgpCS8qIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKEgpICovCi0jZGVmaW5lCUhENjQ0NjFfQkJURFNBUkwJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA1YSkJLyogRGVzdGluYXRpb24gU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoTCkgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9CQlREV1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNWMpCS8qIERlc3RpbmF0aW9uIEJsb2NrIFdpZHRoIFJlZ2lzdGVyICovCi0jZGVmaW5lCUhENjQ0NjFfQkJUREhSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDVlKQkvKiBEZXN0aW5hdGlvbiBCbG9jayBIZWlnaHQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9CQlRQQVJICQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDYwKQkvKiBQYXR0ZXJuIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKEgpICovCi0jZGVmaW5lCUhENjQ0NjFfQkJUUEFSTAkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2MikJLyogUGF0dGVybiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIChMKSAqLwotI2RlZmluZQlIRDY0NDYxX0JCVE1BUkgJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDEwNjQpCS8qIE1hc2sgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoSCkgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9CQlRNQVJMCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDY2KQkvKiBNYXNrIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKEwpICovCi0jZGVmaW5lCUhENjQ0NjFfQkJUUk9QUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MTA2OCkJLyogUk9QIFJlZ2lzdGVyICovCi0jZGVmaW5lCUhENjQ0NjFfQkJUTURSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgxMDZhKQkvKiBCaXRCTFQgTW9kZSBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0JCVFNTQVJICUhENjQ0NjFfSU9fT0ZGU0VUKDB4MTA1NCkJLyogU291cmNlIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfQkJUU1NBUkwJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDU2KQkvKiBTb3VyY2UgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlREU0FSSAlIRDY0NDYxX0lPX09GRlNFVCgweDEwNTgpCS8qIERlc3RpbmF0aW9uIFN0YXJ0IEFkZHJlc3MgUmVnaXN0ZXIgKEgpICovCisjZGVmaW5lCUhENjQ0NjFfQkJURFNBUkwJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDVhKQkvKiBEZXN0aW5hdGlvbiBTdGFydCBBZGRyZXNzIFJlZ2lzdGVyIChMKSAqLworI2RlZmluZQlIRDY0NDYxX0JCVERXUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDVjKQkvKiBEZXN0aW5hdGlvbiBCbG9jayBXaWR0aCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0JCVERIUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDVlKQkvKiBEZXN0aW5hdGlvbiBCbG9jayBIZWlnaHQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRQQVJICQlIRDY0NDYxX0lPX09GRlNFVCgweDEwNjApCS8qIFBhdHRlcm4gU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRQQVJMCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwNjIpCS8qIFBhdHRlcm4gU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRNQVJICQlIRDY0NDYxX0lPX09GRlNFVCgweDEwNjQpCS8qIE1hc2sgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoSCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRNQVJMCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwNjYpCS8qIE1hc2sgU3RhcnQgQWRkcmVzcyBSZWdpc3RlciAoTCkgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9CQlRST1BSCQlIRDY0NDYxX0lPX09GRlNFVCgweDEwNjgpCS8qIFJPUCBSZWdpc3RlciAqLworI2RlZmluZQlIRDY0NDYxX0JCVE1EUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgxMDZhKQkvKiBCaXRCTFQgTW9kZSBSZWdpc3RlciAqLwogCiAvKiBQQyBDYXJkIENvbnRyb2xsZXIgUmVnaXN0ZXJzICovCiAvKiBNYXBzIHRvIFBoeXNpY2FsIEFyZWEgNiAqLwotI2RlZmluZQlIRDY0NDYxX1BDQzBJU1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMDApCS8qIHNvY2tldCAwIGludGVyZmFjZSBzdGF0dXMgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9QQ0MwR0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDAyKQkvKiBzb2NrZXQgMCBnZW5lcmFsIGNvbnRyb2wgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9QQ0MwQ1NDUgkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDA0KQkvKiBzb2NrZXQgMCBjYXJkIHN0YXR1cyBjaGFuZ2UgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9QQ0MwQ1NDSUVSCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMDYpCS8qIHNvY2tldCAwIGNhcmQgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lCUhENjQ0NjFfUENDMFNDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAwOCkJLyogc29ja2V0IDAgc29mdHdhcmUgY29udHJvbCAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBJU1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MjAwMCkJLyogc29ja2V0IDAgaW50ZXJmYWNlIHN0YXR1cyAqLworI2RlZmluZQlIRDY0NDYxX1BDQzBHQ1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MjAwMikJLyogc29ja2V0IDAgZ2VuZXJhbCBjb250cm9sICovCisjZGVmaW5lCUhENjQ0NjFfUENDMENTQ1IJSEQ2NDQ2MV9JT19PRkZTRVQoMHgyMDA0KQkvKiBzb2NrZXQgMCBjYXJkIHN0YXR1cyBjaGFuZ2UgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwQ1NDSUVSCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MjAwNikJLyogc29ja2V0IDAgY2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MwU0NSCQlIRDY0NDYxX0lPX09GRlNFVCgweDIwMDgpCS8qIHNvY2tldCAwIHNvZnR3YXJlIGNvbnRyb2wgKi8KIC8qIE1hcHMgdG8gUGh5c2ljYWwgQXJlYSA1ICovCi0jZGVmaW5lCUhENjQ0NjFfUENDMUlTUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAxMCkJLyogc29ja2V0IDEgaW50ZXJmYWNlIHN0YXR1cyAqLwotI2RlZmluZQlIRDY0NDYxX1BDQzFHQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTIpCS8qIHNvY2tldCAxIGdlbmVyYWwgY29udHJvbCAqLwotI2RlZmluZQlIRDY0NDYxX1BDQzFDU0NSCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMTQpCS8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSAqLwotI2RlZmluZQlIRDY0NDYxX1BDQzFDU0NJRVIJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAxNikJLyogc29ja2V0IDEgY2FyZCBzdGF0dXMgY2hhbmdlIGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9QQ0MxU0NSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgyMDE4KQkvKiBzb2NrZXQgMSBzb2Z0d2FyZSBjb250cm9sICovCisjZGVmaW5lCUhENjQ0NjFfUENDMUlTUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgyMDEwKQkvKiBzb2NrZXQgMSBpbnRlcmZhY2Ugc3RhdHVzICovCisjZGVmaW5lCUhENjQ0NjFfUENDMUdDUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgyMDEyKQkvKiBzb2NrZXQgMSBnZW5lcmFsIGNvbnRyb2wgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9QQ0MxQ1NDUglIRDY0NDYxX0lPX09GRlNFVCgweDIwMTQpCS8qIHNvY2tldCAxIGNhcmQgc3RhdHVzIGNoYW5nZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFDU0NJRVIJSEQ2NDQ2MV9JT19PRkZTRVQoMHgyMDE2KQkvKiBzb2NrZXQgMSBjYXJkIHN0YXR1cyBjaGFuZ2UgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZQlIRDY0NDYxX1BDQzFTQ1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4MjAxOCkJLyogc29ja2V0IDEgc29mdHdhcmUgY29udHJvbCAqLwogCiAvKiBQQ0MgSW50ZXJmYWNlIFN0YXR1cyBSZWdpc3RlciAqLwogI2RlZmluZQlIRDY0NDYxX1BDQ0lTUl9SRUFEWQkJMHg4MAkvKiBjYXJkIHJlYWR5ICovCkBAIC0xODksNDEgKzE5MSw0MSBAQAogI2RlZmluZQlIRDY0NDYxX1BDQ1NDUl9TV1AJCTB4MDEJLyogd3JpdGUgcHJvdGVjdCAqLwogCiAvKiBQQ0MwIE91dHB1dCBQaW5zIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9QME9DUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAyYSkKKyNkZWZpbmUJSEQ2NDQ2MV9QME9DUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgyMDJhKQogCiAvKiBQQ0MxIE91dHB1dCBQaW5zIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9QMU9DUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4MjAyYykKKyNkZWZpbmUJSEQ2NDQ2MV9QMU9DUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgyMDJjKQogCiAvKiBQQyBDYXJkIEdlbmVyYWwgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZQlIRDY0NDYxX1BHQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDIwMmUpCisjZGVmaW5lCUhENjQ0NjFfUEdDUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHgyMDJlKQogCiAvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXJzICovCi0jZGVmaW5lCUhENjQ0NjFfR1BBQ1IJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMDApCS8qIFBvcnQgQSAtIEhhbmRsZXMgSVJEQS9USU1FUiAqLwotI2RlZmluZQlIRDY0NDYxX0dQQkNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDAyKQkvKiBQb3J0IEIgLSBIYW5kbGVzIFVBUlQgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9HUENDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAwNCkJLyogUG9ydCBDIC0gSGFuZGxlcyBQQ01DSUEgMSAqLwotI2RlZmluZQlIRDY0NDYxX0dQRENSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDA2KQkvKiBQb3J0IEQgLSBIYW5kbGVzIFBDTUNJQSAxICovCisjZGVmaW5lCUhENjQ0NjFfR1BBQ1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4NDAwMCkJLyogUG9ydCBBIC0gSGFuZGxlcyBJUkRBL1RJTUVSICovCisjZGVmaW5lCUhENjQ0NjFfR1BCQ1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4NDAwMikJLyogUG9ydCBCIC0gSGFuZGxlcyBVQVJUICovCisjZGVmaW5lCUhENjQ0NjFfR1BDQ1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4NDAwNCkJLyogUG9ydCBDIC0gSGFuZGxlcyBQQ01DSUEgMSAqLworI2RlZmluZQlIRDY0NDYxX0dQRENSCQlIRDY0NDYxX0lPX09GRlNFVCgweDQwMDYpCS8qIFBvcnQgRCAtIEhhbmRsZXMgUENNQ0lBIDEgKi8KIAogLyogUG9ydCBDb250cm9sIERhdGEgUmVnaXN0ZXJzICovCi0jZGVmaW5lCUhENjQ0NjFfR1BBRFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMTApCS8qIEEgKi8KLSNkZWZpbmUJSEQ2NDQ2MV9HUEJEUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAxMikJLyogQiAqLwotI2RlZmluZQlIRDY0NDYxX0dQQ0RSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDE0KQkvKiBDICovCi0jZGVmaW5lCUhENjQ0NjFfR1BERFIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDQwMTYpCS8qIEQgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEFEUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHg0MDEwKQkvKiBBICovCisjZGVmaW5lCUhENjQ0NjFfR1BCRFIJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4NDAxMikJLyogQiAqLworI2RlZmluZQlIRDY0NDYxX0dQQ0RSCQlIRDY0NDYxX0lPX09GRlNFVCgweDQwMTQpCS8qIEMgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEREUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHg0MDE2KQkvKiBEICovCiAKIC8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVycyAqLwotI2RlZmluZQlIRDY0NDYxX0dQQUlDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyMCkJLyogQSAqLwotI2RlZmluZQlIRDY0NDYxX0dQQklDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyMikJLyogQiAqLwotI2RlZmluZQlIRDY0NDYxX0dQQ0lDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyNCkJLyogQyAqLwotI2RlZmluZQlIRDY0NDYxX0dQRElDUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NDAyNikJLyogRCAqLworI2RlZmluZQlIRDY0NDYxX0dQQUlDUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHg0MDIwKQkvKiBBICovCisjZGVmaW5lCUhENjQ0NjFfR1BCSUNSCQlIRDY0NDYxX0lPX09GRlNFVCgweDQwMjIpCS8qIEIgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUENJQ1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4NDAyNCkJLyogQyAqLworI2RlZmluZQlIRDY0NDYxX0dQRElDUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHg0MDI2KQkvKiBEICovCiAKIC8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXJzICovCi0jZGVmaW5lCUhENjQ0NjFfR1BBSVNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDQwKQkvKiBBICovCi0jZGVmaW5lCUhENjQ0NjFfR1BCSVNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDQyKQkvKiBCICovCi0jZGVmaW5lCUhENjQ0NjFfR1BDSVNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDQ0KQkvKiBDICovCi0jZGVmaW5lCUhENjQ0NjFfR1BESVNSCQkoQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHg0MDQ2KQkvKiBEICovCisjZGVmaW5lCUhENjQ0NjFfR1BBSVNSCQlIRDY0NDYxX0lPX09GRlNFVCgweDQwNDApCS8qIEEgKi8KKyNkZWZpbmUJSEQ2NDQ2MV9HUEJJU1IJCUhENjQ0NjFfSU9fT0ZGU0VUKDB4NDA0MikJLyogQiAqLworI2RlZmluZQlIRDY0NDYxX0dQQ0lTUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHg0MDQ0KQkvKiBDICovCisjZGVmaW5lCUhENjQ0NjFfR1BESVNSCQlIRDY0NDYxX0lPX09GRlNFVCgweDQwNDYpCS8qIEQgKi8KIAogLyogSW50ZXJydXB0IFJlcXVlc3QgUmVnaXN0ZXIgJiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZQlIRDY0NDYxX05JUlIJCShDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDUwMDApCi0jZGVmaW5lCUhENjQ0NjFfTklNUgkJKENPTkZJR19IRDY0NDYxX0lPQkFTRSArIDB4NTAwMikKKyNkZWZpbmUJSEQ2NDQ2MV9OSVJSCQlIRDY0NDYxX0lPX09GRlNFVCgweDUwMDApCisjZGVmaW5lCUhENjQ0NjFfTklNUgkJSEQ2NDQ2MV9JT19PRkZTRVQoMHg1MDAyKQogCiAjZGVmaW5lCUhENjQ0NjFfSVJRQkFTRQkJT0ZGQ0hJUF9JUlFfQkFTRQogI2RlZmluZQlPRkZDSElQX0lSUV9CQVNFCTY0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2lvLmgKaW5kZXggMDQ1NGY4ZC4uMjUzNDgxNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9pby5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vaW8uaApAQCAtMTIzLDEwICsxMjMsMTUgQEAKIAogX19CVUlMRF9NRU1PUllfU1RSSU5HKGIsIHU4KQogX19CVUlMRF9NRU1PUllfU1RSSU5HKHcsIHUxNikKLV9fQlVJTERfTUVNT1JZX1NUUklORyhxLCB1NjQpCiAKKyNpZmRlZiBDT05GSUdfU1VQRVJIMzIKIHZvaWQgX19yYXdfd3JpdGVzbCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsb25nbGVuKTsKIHZvaWQgX19yYXdfcmVhZHNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IGxvbmdsZW4pOworI2Vsc2UKK19fQlVJTERfTUVNT1JZX1NUUklORyhsLCB1MzIpCisjZW5kaWYKKworX19CVUlMRF9NRU1PUllfU1RSSU5HKHEsIHU2NCkKIAogI2RlZmluZSB3cml0ZXNiCQkJX19yYXdfd3JpdGVzYgogI2RlZmluZSB3cml0ZXN3CQkJX19yYXdfd3JpdGVzdwpAQCAtMjI0LDE3ICsyMjksNiBAQAogCQkJdW5zaWduZWQgbG9uZyBmbGFncyk7CiB2b2lkIF9faW91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpOwogCi0vKiBhcmNoL3NoL21tL2lvcmVtYXBfNjQuYyAqLwotdW5zaWduZWQgbG9uZyBvbmNoaXBfcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkgICBjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIG9uY2hpcF91bm1hcCh1bnNpZ25lZCBsb25nIHZhZGRyKTsKLSNlbHNlCi0jZGVmaW5lIF9faW9yZW1hcChvZmZzZXQsIHNpemUsIGZsYWdzKQkoKHZvaWQgX19pb21lbSAqKShvZmZzZXQpKQotI2RlZmluZSBfX2lvdW5tYXAoYWRkcikJCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIG9uY2hpcF9yZW1hcChhZGRyLCBzaXplLCBuYW1lKQkoYWRkcikKLSNkZWZpbmUgb25jaGlwX3VubWFwKGFkZHIpCQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYgLyogQ09ORklHX01NVSAqLwotCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqCiBfX2lvcmVtYXBfbW9kZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpAQCAtMjY4LDYgKzI2MiwxMCBAQAogCiAJcmV0dXJuIF9faW9yZW1hcChvZmZzZXQsIHNpemUsIGZsYWdzKTsKIH0KKyNlbHNlCisjZGVmaW5lIF9faW9yZW1hcF9tb2RlKG9mZnNldCwgc2l6ZSwgZmxhZ3MpCSgodm9pZCBfX2lvbWVtICopKG9mZnNldCkpCisjZGVmaW5lIF9faW91bm1hcChhZGRyKQkJCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX01NVSAqLwogCiAjZGVmaW5lIGlvcmVtYXAob2Zmc2V0LCBzaXplKQkJCQlcCiAJX19pb3JlbWFwX21vZGUoKG9mZnNldCksIChzaXplKSwgMCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IGQzMTliYWEuLmEyYjhjOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9pcnEuaApAQCAtOCw3ICs4LDggQEAKICAqIGFkdmlzZWQgdG8gY2FwIHRoaXMgYXQgdGhlIGhhcmQgbGltaXQgdGhhdCB0aGV5J3JlIGludGVyZXN0ZWQgaW4KICAqIHRocm91Z2ggdGhlIG1hY2h2ZWMuCiAgKi8KLSNkZWZpbmUgTlJfSVJRUyAyNTYKKyNkZWZpbmUgTlJfSVJRUwkJCTI1NgorI2RlZmluZSBOUl9JUlFTX0xFR0FDWQkJOAkvKiBMZWdhY3kgZXh0ZXJuYWwgSVJRMC03ICovCiAKIC8qCiAgKiBDb252ZXJ0IGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gSU5URVZUIGFuZCBJUlEgdmFsdWVzLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9rcHJvYmVzLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2twcm9iZXMuaAppbmRleCA2MTM2NDRhLi4wMzZjMzMxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL2twcm9iZXMuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL2twcm9iZXMuaApAQCAtNiw3ICs2LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogCi10eXBlZGVmIHUxNiBrcHJvYmVfb3Bjb2RlX3Q7Cit0eXBlZGVmIGluc25fc2l6ZV90IGtwcm9iZV9vcGNvZGVfdDsKICNkZWZpbmUgQlJFQUtQT0lOVF9JTlNUUlVDVElPTgkweGMzM2EKIAogI2RlZmluZSBNQVhfSU5TTl9TSVpFIDE2CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL21hY2h2ZWMuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vbWFjaHZlYy5oCmluZGV4IDY0YjFjMTYuLjg0ZGQzNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vbWFjaHZlYy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vbWFjaHZlYy5oCkBAIC00Niw2ICs0Niw5IEBACiAKIAl2b2lkIF9faW9tZW0gKigqbXZfaW9wb3J0X21hcCkodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgc2l6ZSk7CiAJdm9pZCAoKm12X2lvcG9ydF91bm1hcCkodm9pZCBfX2lvbWVtICopOworCisJaW50ICgqbXZfY2xrX2luaXQpKHZvaWQpOworCWludCAoKm12X21vZGVfcGlucykodm9pZCk7CiB9OwogCiBleHRlcm4gc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIHNoX212OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggZGYxZDM4My4uYWUwZGE2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wY2kuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3BjaS5oCkBAIC0xNyw1NCArMTcsMjkgQEAKICAqIGV4dGVybmFsKSBQQ0kgY29udHJvbGxlcnMuCiAgKi8KIHN0cnVjdCBwY2lfY2hhbm5lbCB7Ci0Jc3RydWN0IHBjaV9vcHMgKnBjaV9vcHM7Ci0Jc3RydWN0IHJlc291cmNlICppb19yZXNvdXJjZTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9yZXNvdXJjZTsKLQlpbnQgZmlyc3RfZGV2Zm47Ci0JaW50IGxhc3RfZGV2Zm47CisJc3RydWN0IHBjaV9jaGFubmVsCSpuZXh0OworCisJc3RydWN0IHBjaV9vcHMJCSpwY2lfb3BzOworCXN0cnVjdCByZXNvdXJjZQkJKmlvX3Jlc291cmNlOworCXN0cnVjdCByZXNvdXJjZQkJKm1lbV9yZXNvdXJjZTsKKworCXVuc2lnbmVkIGxvbmcJCWlvX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCQltZW1fb2Zmc2V0OworCisJdW5zaWduZWQgbG9uZwkJcmVnX2Jhc2U7CisKKwl1bnNpZ25lZCBsb25nCQlpb19tYXBfYmFzZTsKIH07CiAKLS8qCi0gKiBFYWNoIGJvYXJkIGluaXRpYWxpemVzIHRoaXMgYXJyYXkgYW5kIHRlcm1pbmF0ZXMgaXQgd2l0aCBhIE5VTEwgZW50cnkuCi0gKi8KLWV4dGVybiBzdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW107CitleHRlcm4gdm9pZCByZWdpc3Rlcl9wY2lfY29udHJvbGxlcihzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UpOwogCi0jZGVmaW5lIFBDSUJJT1NfTUlOX0lPCQlib2FyZF9wY2lfY2hhbm5lbHMtPmlvX3Jlc291cmNlLT5zdGFydAotI2RlZmluZSBQQ0lCSU9TX01JTl9NRU0JCWJvYXJkX3BjaV9jaGFubmVscy0+bWVtX3Jlc291cmNlLT5zdGFydAotCi0vKgotICogSS9PIHJvdXRpbmUgaGVscGVycwotICovCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCi0jZGVmaW5lIFBDSV9JT19BUkVBCQkweEZFNDAwMDAwCi0jZGVmaW5lIFBDSV9JT19TSVpFCQkweDAwNDAwMDAwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g1KQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgUENJX0lPX0FSRUE7Ci0jZGVmaW5lIFBDSV9JT19TSVpFCQkweDAwMDEwMDAwCi0jZWxzZQotI2RlZmluZSBQQ0lfSU9fQVJFQQkJMHhGRTI0MDAwMAotI2RlZmluZSBQQ0lfSU9fU0laRQkJMHgwMDA0MDAwMAotI2VuZGlmCi0KLSNkZWZpbmUgUENJX01FTV9TSVpFCQkweDAxMDAwMDAwCi0KLSNkZWZpbmUgU0g0X1BDSUlPQlJfTUFTSwkweEZGRkMwMDAwCi0jZGVmaW5lIHBjaV9pb2FkZHIoYWRkcikJKFBDSV9JT19BUkVBICsgKGFkZHIgJiB+U0g0X1BDSUlPQlJfTUFTSykpCi0KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lIGlzX3BjaV9pb2FkZHIocG9ydCkJCVwKLQkoKChwb3J0KSA+PSBQQ0lCSU9TX01JTl9JTykgJiYJXAotCSAoKHBvcnQpIDwgKFBDSUJJT1NfTUlOX0lPICsgUENJX0lPX1NJWkUpKSkKLSNkZWZpbmUgaXNfcGNpX21lbWFkZHIocG9ydCkJCVwKLQkoKChwb3J0KSA+PSBQQ0lCSU9TX01JTl9NRU0pICYmCVwKLQkgKChwb3J0KSA8IChQQ0lCSU9TX01JTl9NRU0gKyBQQ0lfTUVNX1NJWkUpKSkKLSNlbHNlCi0jZGVmaW5lIGlzX3BjaV9pb2FkZHIocG9ydCkJKDApCi0jZGVmaW5lIGlzX3BjaV9tZW1hZGRyKHBvcnQpCSgwKQotI2VuZGlmCitleHRlcm4gdW5zaWduZWQgbG9uZyBQQ0lCSU9TX01JTl9JTywgUENJQklPU19NSU5fTUVNOwogCiBzdHJ1Y3QgcGNpX2RldjsKIAorI2RlZmluZSBIQVZFX1BDSV9NTUFQCitleHRlcm4gaW50IHBjaV9tbWFwX3BhZ2VfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlLCBpbnQgd3JpdGVfY29tYmluZSk7CiBleHRlcm4gdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2liaW9zX3BlbmFsaXplX2lzYV9pcnEoaW50IGlycSwgaW50IGFjdGl2ZSkKQEAgLTExNCwzMSArODksNzYgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqIE5vbmUgb2YgdGhlIFNIIFBDSSBjb250cm9sbGVycyBzdXBwb3J0IE1XSSwgaXQgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgYQorICogZGlyZWN0IG1lbW9yeSB3cml0ZS4KKyAqLworI2RlZmluZSBQQ0lfRElTQUJMRV9NV0kKKwogc3RhdGljIGlubGluZSB2b2lkIHBjaV9kbWFfYnVyc3RfYWR2aWNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAogCQkJCQllbnVtIHBjaV9kbWFfYnVyc3Rfc3RyYXRlZ3kgKnN0cmF0LAogCQkJCQl1bnNpZ25lZCBsb25nICpzdHJhdGVneV9wYXJhbWV0ZXIpCiB7Ci0JKnN0cmF0ID0gUENJX0RNQV9CVVJTVF9JTkZJTklUWTsKLQkqc3RyYXRlZ3lfcGFyYW1ldGVyID0gfjBVTDsKKwl1bnNpZ25lZCBsb25nIGNhY2hlbGluZV9zaXplOworCXU4IGJ5dGU7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0FDSEVfTElORV9TSVpFLCAmYnl0ZSk7CisKKwlpZiAoYnl0ZSA9PSAwKQorCQljYWNoZWxpbmVfc2l6ZSA9IEwxX0NBQ0hFX0JZVEVTOworCWVsc2UKKwkJY2FjaGVsaW5lX3NpemUgPSBieXRlIDw8IDI7CisKKwkqc3RyYXQgPSBQQ0lfRE1BX0JVUlNUX01VTFRJUExFOworCSpzdHJhdGVneV9wYXJhbWV0ZXIgPSBjYWNoZWxpbmVfc2l6ZTsKIH0KICNlbmRpZgogCi0vKiBCb2FyZC1zcGVjaWZpYyBmaXh1cCByb3V0aW5lcy4gKi8KLXZvaWQgcGNpYmlvc19maXh1cCh2b2lkKTsKLWludCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCk7Ci1pbnQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CisjaWZkZWYgQ09ORklHX1NVUEVSSDMyCisvKgorICogSWYgd2UncmUgb24gYW4gU0g3NzUxIG9yIFNINzc4MCBQQ0kgY29udHJvbGxlciwgUENJIG1lbW9yeSBpcyBtYXBwZWQKKyAqIGF0IHRoZSBlbmQgb2YgdGhlIGFkZHJlc3Mgc3BhY2UgaW4gYSBzcGVjaWFsIG5vbi10cmFuc2xhdGFibGUgYXJlYS4KKyAqLworI2RlZmluZSBQQ0lfTUVNX0ZJWEVEX1NUQVJUCTB4ZmQwMDAwMDAKKyNkZWZpbmUgUENJX01FTV9GSVhFRF9FTkQJKFBDSV9NRU1fRklYRURfU1RBUlQgKyAweDAxMDAwMDAwKQogCi0jaWZkZWYgQ09ORklHX1BDSV9BVVRPCi1pbnQgcGNpYXV0b19hc3NpZ25fcmVzb3VyY2VzKGludCBidXNubywgc3RydWN0IHBjaV9jaGFubmVsICpob3NlKTsKKyNkZWZpbmUgaXNfcGNpX21lbW9yeV9maXhlZF9yYW5nZShzLCBlKQlcCisJKChzKSA+PSBQQ0lfTUVNX0ZJWEVEX1NUQVJUICYmIChlKSA8IFBDSV9NRU1fRklYRURfRU5EKQorI2Vsc2UKKyNkZWZpbmUgaXNfcGNpX21lbW9yeV9maXhlZF9yYW5nZShzLCBlKQkoMCkKICNlbmRpZgogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLworLyogQm9hcmQtc3BlY2lmaWMgZml4dXAgcm91dGluZXMuICovCitpbnQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CiAKLS8qIGdlbmVyaWMgcGNpIHN0dWZmICovCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGNpLmg+CitleHRlcm4gdm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCXN0cnVjdCBwY2lfYnVzX3JlZ2lvbiAqcmVnaW9uLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcyk7CisKK2V4dGVybiB2b2lkIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkJCSAgICBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlc291cmNlICoKK3BjaWJpb3Nfc2VsZWN0X3Jvb3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCByZXNvdXJjZSAqcm9vdCA9IE5VTEw7CisKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJvb3QgPSAmaW9wb3J0X3Jlc291cmNlOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCXJvb3QgPSAmaW9tZW1fcmVzb3VyY2U7CisKKwlyZXR1cm4gcm9vdDsKK30KKworLyogQ2hhbmNlcyBhcmUgdGhpcyBpbnRlcnJ1cHQgaXMgd2lyZWQgUEMtc3R5bGUgLi4uICAqLworc3RhdGljIGlubGluZSBpbnQgcGNpX2dldF9sZWdhY3lfaWRlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgY2hhbm5lbCkKK3sKKwlyZXR1cm4gY2hhbm5lbCA/IDE1IDogMTQ7Cit9CiAKIC8qIGdlbmVyaWMgRE1BLW1hcHBpbmcgc3R1ZmYgKi8KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wY2ktZG1hLWNvbXBhdC5oPgogCisjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX1BDSV9IICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggYjUxN2FlMC4uMmEwMTFiMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTE1NCw2ICsxNTQsMTAgQEAKICNkZWZpbmUga21hcF9jb2hlcmVudF9pbml0KCkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKKy8qIGFyY2gvc2gvbW0vbW1hcC5jICovCisjZGVmaW5lIEhBVkVfQVJDSF9VTk1BUFBFRF9BUkVBCisjZGVmaW5lIEhBVkVfQVJDSF9VTk1BUFBFRF9BUkVBX1RPUERPV04KKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUuaD4KIAogI2VuZGlmIC8qIF9fQVNNX1NIX1BHVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggMWZkNThiNC4uZmY3ZGFhZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0zMiw3ICszMiw3IEBACiAKIAkvKiBTSC00QSB0eXBlcyAqLwogCUNQVV9TSDc3NjMsIENQVV9TSDc3NzAsIENQVV9TSDc3ODAsIENQVV9TSDc3ODEsIENQVV9TSDc3ODUsIENQVV9TSDc3ODYsCi0JQ1BVX1NINzcyMywgQ1BVX1NIWDMsCisJQ1BVX1NINzcyMywgQ1BVX1NINzcyNCwgQ1BVX1NIWDMsCiAKIAkvKiBTSDRBTC1EU1AgdHlwZXMgKi8KIAlDUFVfU0g3MzQzLCBDUFVfU0g3NzIyLCBDUFVfU0g3MzY2LApAQCAtOTQsNiArOTQsMjcgQEAKIGNvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZShzdHJ1Y3Qgc2hfY3B1aW5mbyAqYyk7CiBleHRlcm4gY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3A7CiAKKy8qIHByb2Nlc3NvciBib290IG1vZGUgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBNT0RFX1BJTjAgKDEgPDwgMCkKKyNkZWZpbmUgTU9ERV9QSU4xICgxIDw8IDEpCisjZGVmaW5lIE1PREVfUElOMiAoMSA8PCAyKQorI2RlZmluZSBNT0RFX1BJTjMgKDEgPDwgMykKKyNkZWZpbmUgTU9ERV9QSU40ICgxIDw8IDQpCisjZGVmaW5lIE1PREVfUElONSAoMSA8PCA1KQorI2RlZmluZSBNT0RFX1BJTjYgKDEgPDwgNikKKyNkZWZpbmUgTU9ERV9QSU43ICgxIDw8IDcpCisjZGVmaW5lIE1PREVfUElOOCAoMSA8PCA4KQorI2RlZmluZSBNT0RFX1BJTjkgKDEgPDwgOSkKKyNkZWZpbmUgTU9ERV9QSU4xMCAoMSA8PCAxMCkKKyNkZWZpbmUgTU9ERV9QSU4xMSAoMSA8PCAxMSkKKyNkZWZpbmUgTU9ERV9QSU4xMiAoMSA8PCAxMikKKyNkZWZpbmUgTU9ERV9QSU4xMyAoMSA8PCAxMykKKyNkZWZpbmUgTU9ERV9QSU4xNCAoMSA8PCAxNCkKKyNkZWZpbmUgTU9ERV9QSU4xNSAoMSA8PCAxNSkKKworaW50IGdlbmVyaWNfbW9kZV9waW5zKHZvaWQpOworaW50IHRlc3RfbW9kZV9waW4oaW50IHBpbik7CisKICNpZmRlZiBDT05GSUdfVlNZU0NBTEwKIGludCB2c3lzY2FsbF9pbml0KHZvaWQpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDY4ZTIwZmYuLjFkYzEyY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtMTAyLDYgKzEwMiwxMSBAQAogI2RlZmluZQlQVFJBQ0VfR0VURFNQUkVHUwk1NQkvKiBEU1AgcmVnaXN0ZXJzICovCiAjZGVmaW5lCVBUUkFDRV9TRVREU1BSRUdTCTU2CiAKKyNkZWZpbmUgUFRfVEVYVF9FTkRfQUREUiAJMjQwCisjZGVmaW5lIFBUX1RFWFRfQUREUiAJCTI0NAkvKiAmKHN0cnVjdCB1c2VyKS0+c3RhcnRfY29kZSAqLworI2RlZmluZSBQVF9EQVRBX0FERFIgCQkyNDgJLyogJihzdHJ1Y3QgdXNlciktPnN0YXJ0X2RhdGEgKi8KKyNkZWZpbmUgUFRfVEVYVF9MRU4JCTI1MgorCiAjaWZkZWYgX19LRVJORUxfXwogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9ydGMuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcnRjLmgKaW5kZXggZjdiMDEwZC4uNTJiMGMyZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9ydGMuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3J0Yy5oCkBAIC02LDYgKzYsMTcgQEAKIGV4dGVybiB2b2lkICgqcnRjX3NoX2dldF90aW1lKShzdHJ1Y3QgdGltZXNwZWMgKik7CiBleHRlcm4gaW50ICgqcnRjX3NoX3NldF90aW1lKShjb25zdCB0aW1lX3QpOwogCisvKiBzb21lIGR1bW15IGRlZmluaXRpb25zICovCisjZGVmaW5lIFJUQ19CQVRUX0JBRCAweDEwMAkvKiBiYXR0ZXJ5IGJhZCAqLworI2RlZmluZSBSVENfU1FXRSAweDA4CQkvKiBlbmFibGUgc3F1YXJlLXdhdmUgb3V0cHV0ICovCisjZGVmaW5lIFJUQ19ETV9CSU5BUlkgMHgwNAkvKiBhbGwgdGltZS9kYXRlIHZhbHVlcyBhcmUgQkNEIGlmIGNsZWFyICovCisjZGVmaW5lIFJUQ18yNEggMHgwMgkJLyogMjQgaG91ciBtb2RlIC0gZWxzZSBob3VycyBiaXQgNyBtZWFucyBwbSAqLworI2RlZmluZSBSVENfRFNUX0VOIDB4MDEJICAgICAgICAvKiBhdXRvIHN3aXRjaCBEU1QgLSB3b3JrcyBmLiBVU0Egb25seSAqLworCitzdHJ1Y3QgcnRjX3RpbWU7Cit1bnNpZ25lZCBpbnQgZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqKTsKK2ludCBzZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICopOworCiAjZGVmaW5lIFJUQ19DQVBfNF9ESUdJVF9ZRUFSCSgxIDw8IDApCiAKIHN0cnVjdCBzaF9ydGNfcGxhdGZvcm1faW5mbyB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggNjAyODM1Ni4uYTI4YzlmMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9zcGlubG9jay5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3BpbmxvY2suaApAQCAtMjYsNyArMjYsNyBAQAogI2RlZmluZSBfX3Jhd19zcGluX2lzX2xvY2tlZCh4KQkJKCh4KS0+bG9jayA8PSAwKQogI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQogI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KHgpIFwKLQlkbyB7IGNwdV9yZWxheCgpOyB9IHdoaWxlICgoeCktPmxvY2spCisJZG8geyB3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQoeCkpIGNwdV9yZWxheCgpOyB9IHdoaWxlICgwKQogCiAvKgogICogU2ltcGxlIHNwaW4gbG9jayBvcGVyYXRpb25zLiAgVGhlcmUgYXJlIHR3byB2YXJpYW50cywgb25lIGNsZWFycyBJUlEncwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9zd2FiLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3N3YWIuaAppbmRleCBlNjkzMTU5Li4wZTA4ZmU1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3N3YWIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3N3YWIuaApAQCAtMTQsMTUgKzE0LDE1IEBACiB7CiAJX19hc21fXygKICNpZmRlZiBfX1NINV9fCi0JCSJieXRlcmV2CSUwLCAlMFxuXHQiCisJCSJieXRlcmV2CSUxLCAlMFxuXHQiCiAJCSJzaGFyaQkJJTAsIDMyLCAlMCIKICNlbHNlCi0JCSJzd2FwLmIJCSUwLCAlMFxuXHQiCisJCSJzd2FwLmIJCSUxLCAlMFxuXHQiCiAJCSJzd2FwLncJCSUwLCAlMFxuXHQiCiAJCSJzd2FwLmIJCSUwLCAlMCIKICNlbmRpZgogCQk6ICI9ciIgKHgpCi0JCTogIjAiICh4KSk7CisJCTogInIiICh4KSk7CiAKIAlyZXR1cm4geDsKIH0KQEAgLTMyLDEzICszMiwxMyBAQAogewogCV9fYXNtX18oCiAjaWZkZWYgX19TSDVfXwotCQkiYnl0ZXJldgklMCwgJTBcblx0IgorCQkiYnl0ZXJldgklMSwgJTBcblx0IgogCQkic2hhcmkJCSUwLCAzMiwgJTAiCiAjZWxzZQotCQkic3dhcC5iCQklMCwgJTAiCisJCSJzd2FwLmIJCSUxLCAlMCIKICNlbmRpZgogCQk6ICI9ciIgKHgpCi0JCTogICIwIiAoeCkpOworCQk6ICAiciIgKHgpKTsKIAogCXJldHVybiB4OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9zeXN0ZW1fMzIuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vc3lzdGVtXzMyLmgKaW5kZXggMjQwYjMxZS4uNmM2OGE1MSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9zeXN0ZW1fMzIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3N5c3RlbV8zMi5oCkBAIC0xOTgsNyArMTk4LDcgQEAKIH0pCiAjZW5kaWYKIAotaW50IGhhbmRsZV91bmFsaWduZWRfYWNjZXNzKG9wY29kZV90IGluc3RydWN0aW9uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKK2ludCBoYW5kbGVfdW5hbGlnbmVkX2FjY2VzcyhpbnNuX3NpemVfdCBpbnN0cnVjdGlvbiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkgICAgc3RydWN0IG1lbV9hY2Nlc3MgKm1hKTsKIAogYXNtbGlua2FnZSB2b2lkIGRvX2FkZHJlc3NfZXJyb3Ioc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3RpbWVyLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3RpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjM2I2NmUzLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdGltZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfVElNRVJfSAotI2RlZmluZSBfX0FTTV9TSF9USU1FUl9ICi0KLSNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgotI2luY2x1ZGUgPGNwdS90aW1lci5oPgotCi1zdHJ1Y3Qgc3lzX3RpbWVyX29wcyB7Ci0JaW50ICgqaW5pdCkodm9pZCk7Ci0JaW50ICgqc3RhcnQpKHZvaWQpOwotCWludCAoKnN0b3ApKHZvaWQpOwotI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCi0JdW5zaWduZWQgbG9uZyAoKmdldF9vZmZzZXQpKHZvaWQpOwotI2VuZGlmCi19OwotCi1zdHJ1Y3Qgc3lzX3RpbWVyIHsKLQljb25zdCBjaGFyCQkqbmFtZTsKLQotCXN0cnVjdCBzeXNfZGV2aWNlCWRldjsKLQlzdHJ1Y3Qgc3lzX3RpbWVyX29wcwkqb3BzOwotfTsKLQotI2RlZmluZSBUSUNLX1NJWkUgKHRpY2tfbnNlYyAvIDEwMDApCi0KLWV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIHRtdV90aW1lciwgY210X3RpbWVyLCBtdHUyX3RpbWVyOwotZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgKnN5c190aW1lcjsKLQotI2lmbmRlZiBDT05GSUdfR0VORVJJQ19USU1FCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3RpbWVyX29mZnNldCh2b2lkKQotewotCXJldHVybiBzeXNfdGltZXItPm9wcy0+Z2V0X29mZnNldCgpOwotfQotI2VuZGlmCi0KLS8qIGFyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci5jICovCi1zdHJ1Y3Qgc3lzX3RpbWVyICpnZXRfc3lzX3RpbWVyKHZvaWQpOwotCi0vKiBhcmNoL3NoL2tlcm5lbC90aW1lLmMgKi8KLXZvaWQgaGFuZGxlX3RpbWVyX3RpY2sodm9pZCk7Ci0KLWV4dGVybiBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2Vfc2g7Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9USU1FUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3R5cGVzLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3R5cGVzLmgKaW5kZXggYmVlYTRlNi4uYjEzY2FjYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS90eXBlcy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdHlwZXMuaApAQCAtMjMsOSArMjMsOSBAQAogdHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKIAogI2lmZGVmIENPTkZJR19TVVBFUkgzMgotdHlwZWRlZiB1MTYgb3Bjb2RlX3Q7Cit0eXBlZGVmIHUxNiBpbnNuX3NpemVfdDsKICNlbHNlCi10eXBlZGVmIHUzMiBvcGNvZGVfdDsKK3R5cGVkZWYgdTMyIGluc25fc2l6ZV90OwogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdWJjLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3ViYy5oCmluZGV4IGE3YjkwMjguLjRjYTRiNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vdWJjLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91YmMuaApAQCAtNDIsMTIgKzQyLDIzIEBACiAKICNkZWZpbmUgQlJDUl9DTUZBCQkoMSA8PCAxNSkKICNkZWZpbmUgQlJDUl9DTUZCCQkoMSA8PCAxNCkKKworI2lmIGRlZmluZWQgQ09ORklHX0NQVV9TSDJBCisjZGVmaW5lIEJSQ1JfQ01GQ0EJCSgxIDw8IDE1KQorI2RlZmluZSBCUkNSX0NNRkNCCQkoMSA8PCAxNCkKKyNkZWZpbmUgQlJDUl9DTUZEQQkJKDEgPDwgMTMpCisjZGVmaW5lIEJSQ1JfQ01GREIJCSgxIDw8IDEyKQorI2RlZmluZSBCUkNSX1BDQkIJCSgxIDw8IDYpCS8qIDE6IGFmdGVyIGV4ZWN1dGlvbiAqLworI2RlZmluZSBCUkNSX1BDQkEJCSgxIDw8IDUpCS8qIDE6IGFmdGVyIGV4ZWN1dGlvbiAqLworI2RlZmluZSBCUkNSX1BDVEUJCTAKKyNlbHNlCiAjZGVmaW5lIEJSQ1JfUENURQkJKDEgPDwgMTEpCiAjZGVmaW5lIEJSQ1JfUENCQQkJKDEgPDwgMTApCS8qIDE6IGFmdGVyIGV4ZWN1dGlvbiAqLwogI2RlZmluZSBCUkNSX0RCRUIJCSgxIDw8IDcpCiAjZGVmaW5lIEJSQ1JfUENCQgkJKDEgPDwgNikKICNkZWZpbmUgQlJDUl9TRVEJCSgxIDw8IDMpCiAjZGVmaW5lIEJSQ1JfVUJERQkJKDEgPDwgMCkKKyNlbmRpZgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogLyogYXJjaC9zaC9rZXJuZWwvY3B1L3ViYy5TICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC1zaDRhLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuYWxpZ25lZC1zaDRhLmgKaW5kZXggZDhmODk3Ny4uOWY0ZGQyNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmFsaWduZWQtc2g0YS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdW5hbGlnbmVkLXNoNGEuaApAQCAtMyw5ICszLDkgQEAKIAogLyoKICAqIFNILTRBIGhhcyBzdXBwb3J0IGZvciB1bmFsaWduZWQgMzItYml0IGxvYWRzLCBhbmQgMzItYml0IGxvYWRzIG9ubHkuCi0gKiBTdXBwb3J0IGZvciAxNiBhbmQgNjQtYml0IGFjY2Vzc2VzIGFyZSBkb25lIHRocm91Z2ggc2hpZnRpbmcgYW5kCi0gKiBtYXNraW5nIHJlbGF0aXZlIHRvIHRoZSBlbmRpYW5uZXNzLiBVbmFsaWduZWQgc3RvcmVzIGFyZSBub3Qgc3VwcG9ydGVkCi0gKiBieSB0aGUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcsIHNvIHRoZXNlIGNvbnRpbnVlIHRvIHVzZSB0aGUgcGFja2VkCisgKiBTdXBwb3J0IGZvciA2NC1iaXQgYWNjZXNzZXMgYXJlIGRvbmUgdGhyb3VnaCBzaGlmdGluZyBhbmQgbWFza2luZworICogcmVsYXRpdmUgdG8gdGhlIGVuZGlhbm5lc3MuIFVuYWxpZ25lZCBzdG9yZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisgKiBpbnN0cnVjdGlvbiBlbmNvZGluZywgc28gdGhlc2UgY29udGludWUgdG8gdXNlIHRoZSBwYWNrZWQKICAqIHN0cnVjdC4KICAqCiAgKiBUaGUgc2FtZSBub3RlIGFzIHdpdGggdGhlIG1vdmxpLmwvbW92Y28ubCBwYWlyIGFwcGxpZXMgaGVyZSwgYXMgbG9uZwpAQCAtNDEsOSArNDEsOSBAQAogc3RhdGljIGlubGluZSB1MTYgX19nZXRfdW5hbGlnbmVkX2NwdTE2KGNvbnN0IHU4ICpwKQogewogI2lmZGVmIF9fTElUVExFX0VORElBTgotCXJldHVybiBfX2dldF91bmFsaWduZWRfY3B1MzIocCkgJiAweGZmZmY7CisJcmV0dXJuIHBbMF0gfCBwWzFdIDw8IDg7CiAjZWxzZQotCXJldHVybiBfX2dldF91bmFsaWduZWRfY3B1MzIocCkgPj4gMTY7CisJcmV0dXJuIHBbMF0gPDwgOCB8IHBbMV07CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKaW5kZXggMmVmYjgxOS4uNjUxOTcwOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF8zMi5oCkBAIC0zNDMsOCArMzQzLDkgQEAKICNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQxCTMzMgogI2RlZmluZSBfX05SX3ByZWFkdgkJMzMzCiAjZGVmaW5lIF9fTlJfcHdyaXRldgkJMzM0CisjZGVmaW5lIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8JMzM1CiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzM1CisjZGVmaW5lIE5SX3N5c2NhbGxzIDMzNgogCiAjaWZkZWYgX19LRVJORUxfXwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaAppbmRleCA2ZWI5ZDI5Li44MDE0YWVhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmgKQEAgLTM4MywxMCArMzgzLDExIEBACiAjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0MQkzNjAKICNkZWZpbmUgX19OUl9wcmVhZHYJCTM2MQogI2RlZmluZSBfX05SX3B3cml0ZXYJCTM2MgorI2RlZmluZSBfX05SX3J0X3Rnc2lncXVldWVpbmZvCTM2MwogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jZGVmaW5lIE5SX3N5c2NhbGxzIDM2MworI2RlZmluZSBOUl9zeXNjYWxscyAzNjQKIAogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDJhL2NwdS91YmMuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2gyYS9jcHUvdWJjLmgKaW5kZXggOGNlMmZjMWMuLjExOTJlMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2gyYS9jcHUvdWJjLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDJhL2NwdS91YmMuaApAQCAtMSArMSwyOCBAQAotI2luY2x1ZGUgPGNwdS1zaDIvY3B1L3ViYy5oPgorLyoKKyAqIFNILTJBIFVCQyBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBLaWVyYW4gQmluZ2hhbQorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19BU01fQ1BVX1NIMkFfVUJDX0gKKyNkZWZpbmUgX19BU01fQ1BVX1NIMkFfVUJDX0gKKworI2RlZmluZSBVQkNfQkFSQSAgICAgICAgICAgICAgICAweGZmZmMwNDAwCisjZGVmaW5lIFVCQ19CQU1SQSAgICAgICAgICAgICAgIDB4ZmZmYzA0MDQKKyNkZWZpbmUgVUJDX0JCUkEgICAgICAgICAgICAgICAgMHhmZmZjMDRhMAkvKiAxNiBiaXQgYWNjZXNzICovCisjZGVmaW5lIFVCQ19CRFJBICAgICAgICAgICAgICAgIDB4ZmZmYzA0MDgKKyNkZWZpbmUgVUJDX0JETVJBICAgICAgICAgICAgICAgMHhmZmZjMDQwYworCisjZGVmaW5lIFVCQ19CQVJCICAgICAgICAgICAgICAgIDB4ZmZmYzA0MTAKKyNkZWZpbmUgVUJDX0JBTVJCICAgICAgICAgICAgICAgMHhmZmZjMDQxNAorI2RlZmluZSBVQkNfQkJSQiAgICAgICAgICAgICAgICAweGZmZmMwNGIwCS8qIDE2IGJpdCBhY2Nlc3MgKi8KKyNkZWZpbmUgVUJDX0JEUkIgICAgICAgICAgICAgICAgMHhmZmZjMDQxOAorI2RlZmluZSBVQkNfQkRNUkIgICAgICAgICAgICAgICAweGZmZmMwNDFjCisKKyNkZWZpbmUgVUJDX0JSQ1IgICAgICAgICAgICAgICAgMHhmZmZjMDRjMAorCisjZW5kaWYgLyogX19BU01fQ1BVX1NIMkFfVUJDX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2gzL2NwdS90aW1lci5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDMvY3B1L3RpbWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5M2FjZjEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDMvY3B1L3RpbWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA0IExpbmVvIFNvbHV0aW9ucywgSW5jLgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIF9fQVNNX0NQVV9TSDNfVElNRVJfSAotI2RlZmluZSBfX0FTTV9DUFVfU0gzX1RJTUVSX0gKLQotLyoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVE1VIENvbW1vbiBkZWZpbml0aW9ucyBmb3IgU0gzIHByb2Nlc3NvcnMKLSAqCVNINzcwNgotICoJU0g3NzA5UwotICoJU0g3NzI3Ci0gKglTSDc3MjlSCi0gKglTSDc3MTAKLSAqCVNINzcyMAotICoJU0g3NzEwCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotCi0jaWYgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjApICYmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpCi0jZGVmaW5lIFRNVV9UT0NSCTB4ZmZmZmZlOTAJLyogQnl0ZSBhY2Nlc3MgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIxKQotI2RlZmluZSBUTVVfMDEyX1RTVFIJMHhhNDEyZmU5MgkvKiBCeXRlIGFjY2VzcyAqLwotCi0jZGVmaW5lIFRNVTBfVENPUgkweGE0MTJmZTk0CS8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTBfVENOVAkweGE0MTJmZTk4CS8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTBfVENSCTB4YTQxMmZlOWMJLyogV29yZCBhY2Nlc3MgKi8KLQotI2RlZmluZSBUTVUxX1RDT1IJMHhhNDEyZmVhMAkvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUxX1RDTlQJMHhhNDEyZmVhNAkvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUxX1RDUgkweGE0MTJmZWE4CS8qIFdvcmQgYWNjZXNzICovCi0KLSNkZWZpbmUgVE1VMl9UQ09SCTB4YTQxMmZlYWMJLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMl9UQ05UCTB4YTQxMmZlYjAJLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMl9UQ1IJMHhhNDEyZmViNAkvKiBXb3JkIGFjY2VzcyAqLwotCi0jZWxzZQotI2RlZmluZSBUTVVfMDEyX1RTVFIJMHhmZmZmZmU5MgkvKiBCeXRlIGFjY2VzcyAqLwotCi0jZGVmaW5lIFRNVTBfVENPUgkweGZmZmZmZTk0CS8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTBfVENOVAkweGZmZmZmZTk4CS8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTBfVENSCTB4ZmZmZmZlOWMJLyogV29yZCBhY2Nlc3MgKi8KLQotI2RlZmluZSBUTVUxX1RDT1IJMHhmZmZmZmVhMAkvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUxX1RDTlQJMHhmZmZmZmVhNAkvKiBMb25nIGFjY2VzcyAqLwotI2RlZmluZSBUTVUxX1RDUgkweGZmZmZmZWE4CS8qIFdvcmQgYWNjZXNzICovCi0KLSNkZWZpbmUgVE1VMl9UQ09SCTB4ZmZmZmZlYWMJLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMl9UQ05UCTB4ZmZmZmZlYjAJLyogTG9uZyBhY2Nlc3MgKi8KLSNkZWZpbmUgVE1VMl9UQ1IJMHhmZmZmZmViNAkvKiBXb3JkIGFjY2VzcyAqLwotI2lmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjApICYmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpCi0jZGVmaW5lIFRNVTJfVENQUjIJMHhmZmZmZmViOAkvKiBMb25nIGFjY2VzcyAqLwotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDNfVElNRVJfSCAqLwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvY2FjaGUuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9jYWNoZS5oCmluZGV4IDFjNjFlYmYuLjdiZmI5ZTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9jYWNoZS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9jYWNoZS5oCkBAIC0zOCw1ICszOCw3IEBACiAjZGVmaW5lIENBQ0hFX0lDX0FERFJFU1NfQVJSQVkJMHhmMDAwMDAwMAogI2RlZmluZSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZCTB4ZjQwMDAwMDAKIAorI2RlZmluZSBSQU1DUgkJCTB4RkYwMDAwNzQKKwogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfQ0FDSEVfSCAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvZnJlcS5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L2ZyZXEuaAppbmRleCA3NDlkMWM0Li5jY2YxZDk5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvZnJlcS5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9mcmVxLmgKQEAgLTI1LDYgKzI1LDI0IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjMpIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKICNkZWZpbmUJRlJRQ1IJCQkweGZmYzgwMDAwCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCisjZGVmaW5lIEZSUUNSQQkJCTB4YTQxNTAwMDAKKyNkZWZpbmUgRlJRQ1JCCQkJMHhhNDE1MDAwNAorI2RlZmluZSBWQ0xLQ1IJCQkweGE0MTUwMDQ4CisKKyNkZWZpbmUgRkNMS0FDUgkJCTB4YTQxNTAwMDgKKyNkZWZpbmUgRkNMS0JDUgkJCTB4YTQxNTAwMGMKKyNkZWZpbmUgRlJRQ1IJCQlGUlFDUkEKKyNkZWZpbmUgU0NMS0FDUgkJCUZDTEtBQ1IKKyNkZWZpbmUgU0NMS0JDUgkJCUZDTEtCQ1IKKyNkZWZpbmUgRkNMS0FDUgkJCTB4YTQxNTAwMDgKKyNkZWZpbmUgRkNMS0JDUgkJCTB4YTQxNTAwMGMKKyNkZWZpbmUgSXJEQUNMS0NSCQkweGE0MTUwMDE4CisKKyNkZWZpbmUgTVNUUENSMAkJCTB4YTQxNTAwMzAKKyNkZWZpbmUgTVNUUENSMQkJCTB4YTQxNTAwMzQKKyNkZWZpbmUgTVNUUENSMgkJCTB4YTQxNTAwMzgKKwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KQogI2RlZmluZSBGUlFDUjAJCQkweGZmYzgwMDAwCiAjZGVmaW5lIEZSUUNSMQkJCTB4ZmZjODAwMDQKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjIuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjIuaAppbmRleCA0YjMwOTZmLi43MzhlYTQzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzIyLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyMi5oCkBAIC0xLDYgKzEsMjAgQEAKICNpZm5kZWYgX19BU01fU0g3NzIyX0hfXwogI2RlZmluZSBfX0FTTV9TSDc3MjJfSF9fCiAKKy8qIEJvb3QgTW9kZSBQaW5zOgorICoKKyAqIE1EMDogQ1BHIC0gQ2xvY2sgTW9kZSAwLT4zCisgKiBNRDE6IENQRyAtIENsb2NrIE1vZGUgMC0+MworICogTUQyOiBDUEcgLSBSZXNlcnZlZCAoTDogTm9ybWFsIG9wZXJhdGlvbikKKyAqIE1EMzogQlNDIC0gQXJlYTAgQnVzIFdpZHRoICgxNi8zMi1iaXQpIFtDUzBCQ1IuOSwxMF0KKyAqIE1ENTogQlNDIC0gRW5kaWFuIE1vZGUgKEw6IEJpZywgSDogTGl0dGxlKSBbQ01OQ1IuM10KKyAqIE1EODogVGVzdCBNb2RlCisgKi8KKworLyogUGluIEZ1bmN0aW9uIENvbnRyb2xsZXI6CisgKiBHUElPX0ZOX3h4IC0gR1BJTyB1c2VkIHRvIHNlbGVjdCBwaW4gZnVuY3Rpb24KKyAqIEdQSU9fUHh4IC0gR1BJTyBtYXBwZWQgdG8gcmVhbCBJL08gcGluIG9uIENQVQorICovCiBlbnVtIHsKIAkvKiBQVEEgKi8KIAlHUElPX1BUQTcsIEdQSU9fUFRBNiwgR1BJT19QVEE1LCBHUElPX1BUQTQsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzIzLmggYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzIzLmgKaW5kZXggOWQyZjZkNy4uMTRjOGNhOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyMy5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3MjMuaApAQCAtMSw2ICsxLDIwIEBACiAjaWZuZGVmIF9fQVNNX1NINzcyM19IX18KICNkZWZpbmUgX19BU01fU0g3NzIzX0hfXwogCisvKiBCb290IE1vZGUgUGluczoKKyAqCisgKiBNRDA6IENQRyAtIENsb2NrIE1vZGUgMC0+MworICogTUQxOiBDUEcgLSBDbG9jayBNb2RlIDAtPjMKKyAqIE1EMjogQ1BHIC0gUmVzZXJ2ZWQgKEw6IE5vcm1hbCBvcGVyYXRpb24pCisgKiBNRDM6IEJTQyAtIEFyZWEwIEJ1cyBXaWR0aCAoMTYvMzItYml0KSBbQ1MwQkNSLjksMTBdCisgKiBNRDU6IEJTQyAtIEVuZGlhbiBNb2RlIChMOiBCaWcsIEg6IExpdHRsZSkgW0NNTkNSLjNdCisgKiBNRDg6IFRlc3QgTW9kZQorICovCisKKy8qIFBpbiBGdW5jdGlvbiBDb250cm9sbGVyOgorICogR1BJT19GTl94eCAtIEdQSU8gdXNlZCB0byBzZWxlY3QgcGluIGZ1bmN0aW9uCisgKiBHUElPX1B4eCAtIEdQSU8gbWFwcGVkIHRvIHJlYWwgSS9PIHBpbiBvbiBDUFUKKyAqLwogZW51bSB7CiAJLyogUFRBICovCiAJR1BJT19QVEE3LCBHUElPX1BUQTYsIEdQSU9fUFRBNSwgR1BJT19QVEE0LApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyNC5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzcyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZmQxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3NzI0LmgKQEAgLTAsMCArMSwyNjkgQEAKKyNpZm5kZWYgX19BU01fU0g3NzI0X0hfXworI2RlZmluZSBfX0FTTV9TSDc3MjRfSF9fCisKKy8qIEJvb3QgTW9kZSBQaW5zOgorICoKKyAqIE1EMDogQ1BHIC0gQ2xvY2sgTW9kZSAwLT43CisgKiBNRDE6IENQRyAtIENsb2NrIE1vZGUgMC0+NworICogTUQyOiBDUEcgLSBDbG9jayBNb2RlIDAtPjcKKyAqIE1EMzogQlNDIC0gQXJlYTAgQnVzIFdpZHRoICgxNi8zMi1iaXQpIFtDUzBCQ1IuOSwxMF0KKyAqIE1ENTogQlNDIC0gRW5kaWFuIE1vZGUgKEw6IEJpZywgSDogTGl0dGxlKSBbQ01OQ1IuM10KKyAqIE1EODogVGVzdCBNb2RlCisgKi8KKworLyogUGluIEZ1bmN0aW9uIENvbnRyb2xsZXI6CisgKiBHUElPX0ZOX3h4IC0gR1BJTyB1c2VkIHRvIHNlbGVjdCBwaW4gZnVuY3Rpb24KKyAqIEdQSU9fUHh4IC0gR1BJTyBtYXBwZWQgdG8gcmVhbCBJL08gcGluIG9uIENQVQorICovCitlbnVtIHsKKwkvKiBQVEEgKi8KKwlHUElPX1BUQTcsIEdQSU9fUFRBNiwgR1BJT19QVEE1LCBHUElPX1BUQTQsCisJR1BJT19QVEEzLCBHUElPX1BUQTIsIEdQSU9fUFRBMSwgR1BJT19QVEEwLAorCisJLyogUFRCICovCisJR1BJT19QVEI3LCBHUElPX1BUQjYsIEdQSU9fUFRCNSwgR1BJT19QVEI0LAorCUdQSU9fUFRCMywgR1BJT19QVEIyLCBHUElPX1BUQjEsIEdQSU9fUFRCMCwKKworCS8qIFBUQyAqLworCUdQSU9fUFRDNywgR1BJT19QVEM2LCBHUElPX1BUQzUsIEdQSU9fUFRDNCwKKwlHUElPX1BUQzMsIEdQSU9fUFRDMiwgR1BJT19QVEMxLCBHUElPX1BUQzAsCisKKwkvKiBQVEQgKi8KKwlHUElPX1BURDcsIEdQSU9fUFRENiwgR1BJT19QVEQ1LCBHUElPX1BURDQsCisJR1BJT19QVEQzLCBHUElPX1BURDIsIEdQSU9fUFREMSwgR1BJT19QVEQwLAorCisJLyogUFRFICovCisJR1BJT19QVEU3LCBHUElPX1BURTYsIEdQSU9fUFRFNSwgR1BJT19QVEU0LAorCUdQSU9fUFRFMywgR1BJT19QVEUyLCBHUElPX1BURTEsIEdQSU9fUFRFMCwKKworCS8qIFBURiAqLworCUdQSU9fUFRGNywgR1BJT19QVEY2LCBHUElPX1BURjUsIEdQSU9fUFRGNCwKKwlHUElPX1BURjMsIEdQSU9fUFRGMiwgR1BJT19QVEYxLCBHUElPX1BURjAsCisKKwkvKiBQVEcgKi8KKwkJCSAgICAgIEdQSU9fUFRHNSwgR1BJT19QVEc0LAorCUdQSU9fUFRHMywgR1BJT19QVEcyLCBHUElPX1BURzEsIEdQSU9fUFRHMCwKKworCS8qIFBUSCAqLworCUdQSU9fUFRINywgR1BJT19QVEg2LCBHUElPX1BUSDUsIEdQSU9fUFRINCwKKwlHUElPX1BUSDMsIEdQSU9fUFRIMiwgR1BJT19QVEgxLCBHUElPX1BUSDAsCisKKwkvKiBQVEogKi8KKwlHUElPX1BUSjcsIEdQSU9fUFRKNiwgR1BJT19QVEo1LAorCUdQSU9fUFRKMywgR1BJT19QVEoyLCBHUElPX1BUSjEsIEdQSU9fUFRKMCwKKworCS8qIFBUSyAqLworCUdQSU9fUFRLNywgR1BJT19QVEs2LCBHUElPX1BUSzUsIEdQSU9fUFRLNCwKKwlHUElPX1BUSzMsIEdQSU9fUFRLMiwgR1BJT19QVEsxLCBHUElPX1BUSzAsCisKKwkvKiBQVEwgKi8KKwlHUElPX1BUTDcsIEdQSU9fUFRMNiwgR1BJT19QVEw1LCBHUElPX1BUTDQsCisJR1BJT19QVEwzLCBHUElPX1BUTDIsIEdQSU9fUFRMMSwgR1BJT19QVEwwLAorCisJLyogUFRNICovCisJR1BJT19QVE03LCBHUElPX1BUTTYsIEdQSU9fUFRNNSwgR1BJT19QVE00LAorCUdQSU9fUFRNMywgR1BJT19QVE0yLCBHUElPX1BUTTEsIEdQSU9fUFRNMCwKKworCS8qIFBUTiAqLworCUdQSU9fUFRONywgR1BJT19QVE42LCBHUElPX1BUTjUsIEdQSU9fUFRONCwKKwlHUElPX1BUTjMsIEdQSU9fUFROMiwgR1BJT19QVE4xLCBHUElPX1BUTjAsCisKKwkvKiBQVFEgKi8KKwlHUElPX1BUUTcsIEdQSU9fUFRRNiwgR1BJT19QVFE1LCBHUElPX1BUUTQsCisJR1BJT19QVFEzLCBHUElPX1BUUTIsIEdQSU9fUFRRMSwgR1BJT19QVFEwLAorCisJLyogUFRSICovCisJR1BJT19QVFI3LCBHUElPX1BUUjYsIEdQSU9fUFRSNSwgR1BJT19QVFI0LAorCUdQSU9fUFRSMywgR1BJT19QVFIyLCBHUElPX1BUUjEsIEdQSU9fUFRSMCwKKworCS8qIFBUUyAqLworCQkgICBHUElPX1BUUzYsIEdQSU9fUFRTNSwgR1BJT19QVFM0LAorCUdQSU9fUFRTMywgR1BJT19QVFMyLCBHUElPX1BUUzEsIEdQSU9fUFRTMCwKKworCS8qIFBUVCAqLworCUdQSU9fUFRUNywgR1BJT19QVFQ2LCBHUElPX1BUVDUsIEdQSU9fUFRUNCwKKwlHUElPX1BUVDMsIEdQSU9fUFRUMiwgR1BJT19QVFQxLCBHUElPX1BUVDAsCisKKwkvKiBQVFUgKi8KKwlHUElPX1BUVTcsIEdQSU9fUFRVNiwgR1BJT19QVFU1LCBHUElPX1BUVTQsCisJR1BJT19QVFUzLCBHUElPX1BUVTIsIEdQSU9fUFRVMSwgR1BJT19QVFUwLAorCisJLyogUFRWICovCisJR1BJT19QVFY3LCBHUElPX1BUVjYsIEdQSU9fUFRWNSwgR1BJT19QVFY0LAorCUdQSU9fUFRWMywgR1BJT19QVFYyLCBHUElPX1BUVjEsIEdQSU9fUFRWMCwKKworCS8qIFBUVyAqLworCUdQSU9fUFRXNywgR1BJT19QVFc2LCBHUElPX1BUVzUsIEdQSU9fUFRXNCwKKwlHUElPX1BUVzMsIEdQSU9fUFRXMiwgR1BJT19QVFcxLCBHUElPX1BUVzAsCisKKwkvKiBQVFggKi8KKwlHUElPX1BUWDcsIEdQSU9fUFRYNiwgR1BJT19QVFg1LCBHUElPX1BUWDQsCisJR1BJT19QVFgzLCBHUElPX1BUWDIsIEdQSU9fUFRYMSwgR1BJT19QVFgwLAorCisJLyogUFRZICovCisJR1BJT19QVFk3LCBHUElPX1BUWTYsIEdQSU9fUFRZNSwgR1BJT19QVFk0LAorCUdQSU9fUFRZMywgR1BJT19QVFkyLCBHUElPX1BUWTEsIEdQSU9fUFRZMCwKKworCS8qIFBUWiAqLworCUdQSU9fUFRaNywgR1BJT19QVFo2LCBHUElPX1BUWjUsIEdQSU9fUFRaNCwKKwlHUElPX1BUWjMsIEdQSU9fUFRaMiwgR1BJT19QVFoxLCBHUElPX1BUWjAsCisKKwkvKiBCU0MgKFBUQS9QVEIvUFRKL1BUUS9QVFIvUFRUKSAqLworCUdQSU9fRk5fRDMxLCBHUElPX0ZOX0QzMCwgR1BJT19GTl9EMjksIEdQSU9fRk5fRDI4LAorCUdQSU9fRk5fRDI3LCBHUElPX0ZOX0QyNiwgR1BJT19GTl9EMjUsIEdQSU9fRk5fRDI0LAorCUdQSU9fRk5fRDIzLCBHUElPX0ZOX0QyMiwgR1BJT19GTl9EMjEsIEdQSU9fRk5fRDIwLAorCUdQSU9fRk5fRDE5LCBHUElPX0ZOX0QxOCwgR1BJT19GTl9EMTcsIEdQSU9fRk5fRDE2LAorCUdQSU9fRk5fRDE1LCBHUElPX0ZOX0QxNCwgR1BJT19GTl9EMTMsIEdQSU9fRk5fRDEyLAorCUdQSU9fRk5fRDExLCBHUElPX0ZOX0QxMCwgR1BJT19GTl9EOSwgIEdQSU9fRk5fRDgsCisJR1BJT19GTl9ENywgIEdQSU9fRk5fRDYsICBHUElPX0ZOX0Q1LCAgR1BJT19GTl9ENCwKKwlHUElPX0ZOX0QzLCAgR1BJT19GTl9EMiwgIEdQSU9fRk5fRDEsICBHUElPX0ZOX0QwLAorCUdQSU9fRk5fQTI1LCBHUElPX0ZOX0EyNCwgR1BJT19GTl9BMjMsIEdQSU9fRk5fQTIyLAorCUdQSU9fRk5fQ1M2Ql9DRTFCLCAgR1BJT19GTl9DUzZBX0NFMkIsCisJR1BJT19GTl9DUzVCX0NFMUEsICBHUElPX0ZOX0NTNUFfQ0UyQSwKKwlHUElPX0ZOX1dFM19JQ0lPV1IsIEdQSU9fRk5fV0UyX0lDSU9SRCwKKwlHUElPX0ZOX0lPSVMxNiwgICAgIEdQSU9fRk5fV0FJVCwKKwlHUElPX0ZOX0JTLAorCisJLyogS0VZU0MgKFBUQS9QVEIpKi8KKwlHUElPX0ZOX0tFWU9VVDVfSU41LCBHUElPX0ZOX0tFWU9VVDRfSU42LCBHUElPX0ZOX0tFWUlONCwKKwlHUElPX0ZOX0tFWUlOMywgIEdQSU9fRk5fS0VZSU4yLCAgR1BJT19GTl9LRVlJTjEsICBHUElPX0ZOX0tFWUlOMCwKKwlHUElPX0ZOX0tFWU9VVDMsIEdQSU9fRk5fS0VZT1VUMiwgR1BJT19GTl9LRVlPVVQxLCBHUElPX0ZOX0tFWU9VVDAsCisKKwkvKiBBVEFQSSAoUFRBL1BUQi9QVEsvUFRSL1BUUy9QVFcpICovCisJR1BJT19GTl9JREVEMTUsIEdQSU9fRk5fSURFRDE0LCBHUElPX0ZOX0lERUQxMywgR1BJT19GTl9JREVEMTIsCisJR1BJT19GTl9JREVEMTEsIEdQSU9fRk5fSURFRDEwLCBHUElPX0ZOX0lERUQ5LCAgR1BJT19GTl9JREVEOCwKKwlHUElPX0ZOX0lERUQ3LCAgR1BJT19GTl9JREVENiwgIEdQSU9fRk5fSURFRDUsICBHUElPX0ZOX0lERUQ0LAorCUdQSU9fRk5fSURFRDMsICBHUElPX0ZOX0lERUQyLCAgR1BJT19GTl9JREVEMSwgIEdQSU9fRk5fSURFRDAsCisJR1BJT19GTl9JREVBMiwgICAgIEdQSU9fRk5fSURFQTEsICAgICBHUElPX0ZOX0lERUEwLCAgR1BJT19GTl9JREVJT1dSLAorCUdQSU9fRk5fSU9EUkVRLCAgICBHUElPX0ZOX0lERUNTMCwgICAgR1BJT19GTl9JREVDUzEsIEdQSU9fRk5fSURFSU9SRCwKKwlHUElPX0ZOX0RJUkVDVElPTiwgR1BJT19GTl9FWEJVRl9FTkIsIEdQSU9fRk5fSURFUlNULCBHUElPX0ZOX0lPREFDSywKKwlHUElPX0ZOX0lERUlOVCwgICAgR1BJT19GTl9JREVJT1JEWSwKKworCS8qIFRQVSAoUFRCL1BUUi9QVFMpICovCisJR1BJT19GTl9UUFVUTzMsIEdQSU9fRk5fVFBVVE8yLCBHUElPX0ZOX1RQVVRPMSwgR1BJT19GTl9UUFVUTzAsCisJR1BJT19GTl9UUFVUSTMsIEdQSU9fRk5fVFBVVEkyLAorCisJLyogTENEQyAoUFRDL1BURC9QVEUvUFRGL1BUTS9QVFIpICovCisJR1BJT19GTl9MQ0REMjMsIEdQSU9fRk5fTENERDIyLCBHUElPX0ZOX0xDREQyMSwgR1BJT19GTl9MQ0REMjAsCisJR1BJT19GTl9MQ0REMTksIEdQSU9fRk5fTENERDE4LCBHUElPX0ZOX0xDREQxNywgR1BJT19GTl9MQ0REMTYsCisJR1BJT19GTl9MQ0REMTUsIEdQSU9fRk5fTENERDE0LCBHUElPX0ZOX0xDREQxMywgR1BJT19GTl9MQ0REMTIsCisJR1BJT19GTl9MQ0REMTEsIEdQSU9fRk5fTENERDEwLCBHUElPX0ZOX0xDREQ5LCAgR1BJT19GTl9MQ0REOCwKKwlHUElPX0ZOX0xDREQ3LCAgR1BJT19GTl9MQ0RENiwgIEdQSU9fRk5fTENERDUsICBHUElPX0ZOX0xDREQ0LAorCUdQSU9fRk5fTENERDMsICBHUElPX0ZOX0xDREQyLCAgR1BJT19GTl9MQ0REMSwgIEdQSU9fRk5fTENERDAsCisJR1BJT19GTl9MQ0RWU1lOLCAgR1BJT19GTl9MQ0RESVNQLCAgR1BJT19GTl9MQ0RSUywgIEdQSU9fRk5fTENESFNZTiwKKwlHUElPX0ZOX0xDRENTLCAgICBHUElPX0ZOX0xDRERPTiwgICBHUElPX0ZOX0xDRERDSywgR1BJT19GTl9MQ0RXUiwKKwlHUElPX0ZOX0xDRFZFUFdDLCBHUElPX0ZOX0xDRFZDUFdDLCBHUElPX0ZOX0xDRFJELCAgR1BJT19GTl9MQ0RMQ0xLLAorCisJLyogU0NJRjAgKFBURi9QVE0pICovCisJR1BJT19GTl9TQ0lGMF9UWEQsIEdQSU9fRk5fU0NJRjBfUlhELCBHUElPX0ZOX1NDSUYwX1NDSywKKworCS8qIFNDSUYxIChQVEwpICovCisJR1BJT19GTl9TQ0lGMV9TQ0ssIEdQSU9fRk5fU0NJRjFfUlhELCBHUElPX0ZOX1NDSUYxX1RYRCwKKworCS8qIFNDSUYyIChQVEUvUFRGL1BUTikgd2l0aCBMQ0RDLCBWT1UgKi8KKwlHUElPX0ZOX1NDSUYyX0xfVFhELCBHUElPX0ZOX1NDSUYyX0xfU0NLLCBHUElPX0ZOX1NDSUYyX0xfUlhELAorCUdQSU9fRk5fU0NJRjJfVl9UWEQsIEdQSU9fRk5fU0NJRjJfVl9TQ0ssIEdQSU9fRk5fU0NJRjJfVl9SWEQsCisKKwkvKiBTQ0lGMyAoUFRML1BUTi9QVFopIHdpdGggVk9VLCBJUlEgKi8KKwlHUElPX0ZOX1NDSUYzX1ZfU0NLLCBHUElPX0ZOX1NDSUYzX1ZfUlhELCBHUElPX0ZOX1NDSUYzX1ZfVFhELAorCUdQSU9fRk5fU0NJRjNfVl9DVFMsIEdQSU9fRk5fU0NJRjNfVl9SVFMsCisJR1BJT19GTl9TQ0lGM19JX1NDSywgR1BJT19GTl9TQ0lGM19JX1JYRCwgR1BJT19GTl9TQ0lGM19JX1RYRCwKKwlHUElPX0ZOX1NDSUYzX0lfQ1RTLCBHUElPX0ZOX1NDSUYzX0lfUlRTLAorCisJLyogU0NJRjQgKFBURSkgKi8KKwlHUElPX0ZOX1NDSUY0X1NDSywgR1BJT19GTl9TQ0lGNF9SWEQsIEdQSU9fRk5fU0NJRjRfVFhELAorCisJLyogU0NJRjUgKFBUUykgKi8KKwlHUElPX0ZOX1NDSUY1X1NDSywgR1BJT19GTl9TQ0lGNV9SWEQsIEdQSU9fRk5fU0NJRjVfVFhELAorCisJLyogRlNJIChQVEUvUFRVL1BUVikgKi8KKwlHUElPX0ZOX0ZTSU1DS0IsICAgR1BJT19GTl9GU0lNQ0tBLCAgICBHUElPX0ZOX0ZTSU9BU0QsCisJR1BJT19GTl9GU0lJQUJDSywgIEdQSU9fRk5fRlNJSUFMUkNLLCAgR1BJT19GTl9GU0lPQUJDSywKKwlHUElPX0ZOX0ZTSU9BTFJDSywgR1BJT19GTl9DTEtBVURJT0FPLCBHUElPX0ZOX0ZTSUlCU0QsCisJR1BJT19GTl9GU0lPQlNELCAgIEdQSU9fRk5fRlNJSUJCQ0ssICAgR1BJT19GTl9GU0lJQkxSQ0ssCisJR1BJT19GTl9GU0lPQkJDSywgIEdQSU9fRk5fRlNJT0JMUkNLLCAgR1BJT19GTl9DTEtBVURJT0JPLAorCUdQSU9fRk5fRlNJSUFTRCwKKworCS8qIEFVRCAoUFRHKSAqLworCUdQSU9fRk5fQVVEQ0ssICAgR1BJT19GTl9BVURTWU5DLCBHUElPX0ZOX0FVREFUQTMsCisJR1BJT19GTl9BVURBVEEyLCBHUElPX0ZOX0FVREFUQTEsIEdQSU9fRk5fQVVEQVRBMCwKKworCS8qIFZJTyAoUFRTKSAoY29tbW9uPykgKi8KKwlHUElPX0ZOX1ZJT19DS08sCisKKwkvKiBWSU8wIChQVEgvUFRLKSAqLworCUdQSU9fRk5fVklPMF9EMTUsIEdQSU9fRk5fVklPMF9EMTQsIEdQSU9fRk5fVklPMF9EMTMsIEdQSU9fRk5fVklPMF9EMTIsCisJR1BJT19GTl9WSU8wX0QxMSwgR1BJT19GTl9WSU8wX0QxMCwgR1BJT19GTl9WSU8wX0Q5LCAgR1BJT19GTl9WSU8wX0Q4LAorCUdQSU9fRk5fVklPMF9ENywgIEdQSU9fRk5fVklPMF9ENiwgIEdQSU9fRk5fVklPMF9ENSwgIEdQSU9fRk5fVklPMF9ENCwKKwlHUElPX0ZOX1ZJTzBfRDMsICBHUElPX0ZOX1ZJTzBfRDIsICBHUElPX0ZOX1ZJTzBfRDEsICBHUElPX0ZOX1ZJTzBfRDAsCisJR1BJT19GTl9WSU8wX1ZELCAgR1BJT19GTl9WSU8wX0NMSywKKwlHUElPX0ZOX1ZJTzBfRkxELCBHUElPX0ZOX1ZJTzBfSEQsCisKKwkvKiBWSU8xIChQVEsvUFRTKSAqLworCUdQSU9fRk5fVklPMV9ENywgIEdQSU9fRk5fVklPMV9ENiwgR1BJT19GTl9WSU8xX0Q1LCBHUElPX0ZOX1ZJTzFfRDQsCisJR1BJT19GTl9WSU8xX0QzLCAgR1BJT19GTl9WSU8xX0QyLCBHUElPX0ZOX1ZJTzFfRDEsIEdQSU9fRk5fVklPMV9EMCwKKwlHUElPX0ZOX1ZJTzFfRkxELCBHUElPX0ZOX1ZJTzFfSEQsIEdQSU9fRk5fVklPMV9WRCwgR1BJT19GTl9WSU8xX0NMSywKKworCS8qIEV0aCAgKFBUTC9QVE4vUFRYKSAqLworCUdQSU9fRk5fUk1JSV9SWEQwLCAgICBHUElPX0ZOX1JNSUlfUlhEMSwKKwlHUElPX0ZOX1JNSUlfVFhEMCwgICAgR1BJT19GTl9STUlJX1RYRDEsCisJR1BJT19GTl9STUlJX1JFRl9DTEssIEdQSU9fRk5fUk1JSV9UWF9FTiwKKwlHUElPX0ZOX1JNSUlfUlhfRVIsICAgR1BJT19GTl9STUlJX0NSU19EViwKKwlHUElPX0ZOX0xOS1NUQSwgICAgICAgR1BJT19GTl9NRElPLAorCUdQSU9fRk5fTURDLAorCisJLyogU3lzdGVtIChQVEopICovCisJR1BJT19GTl9QRFNUQVRVUywgR1BJT19GTl9TVEFUVVMyLCBHUElPX0ZOX1NUQVRVUzAsCisKKwkvKiBWT1UgKFBUTC9QVE0vUFROKi8KKwlHUElPX0ZOX0RWX0QxNSwgIEdQSU9fRk5fRFZfRDE0LCBHUElPX0ZOX0RWX0QxMywgICBHUElPX0ZOX0RWX0QxMiwKKwlHUElPX0ZOX0RWX0QxMSwgIEdQSU9fRk5fRFZfRDEwLCBHUElPX0ZOX0RWX0Q5LCAgICBHUElPX0ZOX0RWX0Q4LAorCUdQSU9fRk5fRFZfRDcsICAgR1BJT19GTl9EVl9ENiwgIEdQSU9fRk5fRFZfRDUsICAgIEdQSU9fRk5fRFZfRDQsCisJR1BJT19GTl9EVl9EMywgICBHUElPX0ZOX0RWX0QyLCAgR1BJT19GTl9EVl9EMSwgICAgR1BJT19GTl9EVl9EMCwKKwlHUElPX0ZOX0RWX0NMS0ksIEdQSU9fRk5fRFZfQ0xLLCBHUElPX0ZOX0RWX1ZTWU5DLCBHUElPX0ZOX0RWX0hTWU5DLAorCisJLyogTVNJT0YwIChQVEwvUFRNKSAqLworCUdQSU9fRk5fTVNJT0YwX1JYRCwgICBHUElPX0ZOX01TSU9GMF9UWEQsCisJR1BJT19GTl9NU0lPRjBfTUNLLCAgIEdQSU9fRk5fTVNJT0YwX1RTQ0ssCisJR1BJT19GTl9NU0lPRjBfU1MxLCAgIEdQSU9fRk5fTVNJT0YwX1NTMiwKKwlHUElPX0ZOX01TSU9GMF9UU1lOQywgR1BJT19GTl9NU0lPRjBfUlNDSywKKwlHUElPX0ZOX01TSU9GMF9SU1lOQywKKworCS8qIE1TSU9GMSAoUFRWKSAqLworCUdQSU9fRk5fTVNJT0YxX1JYRCwgICBHUElPX0ZOX01TSU9GMV9UWEQsCisJR1BJT19GTl9NU0lPRjFfTUNLLCAgIEdQSU9fRk5fTVNJT0YxX1RTQ0ssCisJR1BJT19GTl9NU0lPRjFfU1MxLCAgIEdQSU9fRk5fTVNJT0YxX1NTMiwKKwlHUElPX0ZOX01TSU9GMV9UU1lOQywgR1BJT19GTl9NU0lPRjFfUlNDSywKKwlHUElPX0ZOX01TSU9GMV9SU1lOQywKKworCS8qIERNQUMgKFBUVS9QVFgpICovCisJR1BJT19GTl9ETUFDX0RBQ0swLCBHUElPX0ZOX0RNQUNfRFJFUTAsCisJR1BJT19GTl9ETUFDX0RBQ0sxLCBHUElPX0ZOX0RNQUNfRFJFUTEsCisKKwkvKiBTREhJMCAoUFRZKSAqLworCUdQSU9fRk5fU0RISTBDRCwgR1BJT19GTl9TREhJMFdQLCBHUElPX0ZOX1NESEkwQ01ELCBHUElPX0ZOX1NESEkwQ0xLLAorCUdQSU9fRk5fU0RISTBEMywgR1BJT19GTl9TREhJMEQyLCBHUElPX0ZOX1NESEkwRDEsICBHUElPX0ZOX1NESEkwRDAsCisKKwkvKiBTREhJMSAoUFRXKSAqLworCUdQSU9fRk5fU0RISTFDRCwgR1BJT19GTl9TREhJMVdQLCBHUElPX0ZOX1NESEkxQ01ELCBHUElPX0ZOX1NESEkxQ0xLLAorCUdQSU9fRk5fU0RISTFEMywgR1BJT19GTl9TREhJMUQyLCBHUElPX0ZOX1NESEkxRDEsICBHUElPX0ZOX1NESEkxRDAsCisKKwkvKiBNTUMgKFBUVy9QVFgpKi8KKwlHUElPX0ZOX01NQ19ENywgIEdQSU9fRk5fTU1DX0Q2LCAgR1BJT19GTl9NTUNfRDUsIEdQSU9fRk5fTU1DX0Q0LAorCUdQSU9fRk5fTU1DX0QzLCAgR1BJT19GTl9NTUNfRDIsICBHUElPX0ZOX01NQ19EMSwgR1BJT19GTl9NTUNfRDAsCisJR1BJT19GTl9NTUNfQ0xLLCBHUElPX0ZOX01NQ19DTUQsCisKKwkvKiBJckRBIChQVFgpICovCisJR1BJT19GTl9JUkRBX09VVCwgR1BJT19GTl9JUkRBX0lOLAorCisJLyogVFNJRiAoUFRYKSAqLworCUdQSU9fRk5fVFNJRl9UUzBfU0RBVCwgR1BJT19GTl9UU0lGX1RTMF9TQ0ssCisJR1BJT19GTl9UU0lGX1RTMF9TREVOLCBHUElPX0ZOX1RTSUZfVFMwX1NQU1lOQywKKworCS8qIElSUSAoUFRaKSAqLworCUdQSU9fRk5fSU5UQ19JUlE3LCBHUElPX0ZOX0lOVENfSVJRNiwgR1BJT19GTl9JTlRDX0lSUTUsCisJR1BJT19GTl9JTlRDX0lSUTQsIEdQSU9fRk5fSU5UQ19JUlEzLCBHUElPX0ZOX0lOVENfSVJRMiwKKwlHUElPX0ZOX0lOVENfSVJRMSwgR1BJT19GTl9JTlRDX0lSUTAsCit9OworCisjZW5kaWYgLyogX19BU01fU0g3NzI0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzc4NS5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDQvY3B1L3NoNzc4NS5oCmluZGV4IGU0MDA2YWYuLjlkYzlkOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS9zaDc3ODUuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvc2g3Nzg1LmgKQEAgLTEsNiArMSwzMSBAQAogI2lmbmRlZiBfX0FTTV9TSDc3ODVfSF9fCiAjZGVmaW5lIF9fQVNNX1NINzc4NV9IX18KIAorLyogQm9vdCBNb2RlIFBpbnM6CisgKgorICogTU9ERTA6IENQRyAtIEluaXRpYWwgUGNrL0JjayBGcmVxdWVuY3kgW0ZSUU1SMV0KKyAqIE1PREUxOiBDUEcgLSBJbml0aWFsIFVjay9TSGNrL0REUmNrIEZyZXF1ZW5jeSBbRlJRTVIxXQorICogTU9ERTI6IENQRyAtIFJlc2VydmVkIChMOiBOb3JtYWwgb3BlcmF0aW9uKQorICogTU9ERTM6IENQRyAtIFJlc2VydmVkIChMOiBOb3JtYWwgb3BlcmF0aW9uKQorICogTU9ERTQ6IENQRyAtIEluaXRpYWwgUExMIHNldHRpbmcgKDcyeC8zNngpCisgKiBNT0RFNTogTEJTQyAtIEFyZWEwIE1lbW9yeSBUeXBlIC8gQnVzIFdpZHRoIFtDUzBCQ1IuOF0KKyAqIE1PREU2OiBMQlNDIC0gQXJlYTAgTWVtb3J5IFR5cGUgLyBCdXMgV2lkdGggW0NTMEJDUi45XQorICogTU9ERTc6IExCU0MgLSBBcmVhMCBNZW1vcnkgVHlwZSAvIEJ1cyBXaWR0aCBbQ1MwQkNSLjNdCisgKiBNT0RFODogTEJTQyAtIEVuZGlhbiBNb2RlIChMOiBCaWcsIEg6IExpdHRsZSkgW0JDUi4zMV0KKyAqIE1PREU5OiBMQlNDIC0gTWFzdGVyL1NsYXZlIE1vZGUgKEw6IFNsYXZlKSBbQkNSLjMwXQorICogTU9ERTEwOiBDUEcgLSBDbG9jayBJbnB1dCAoTDogRXh0IENsaywgSDogQ3J5c3RhbCkKKyAqIE1PREUxMTogUENJIC0gUGluIE1vZGUgKExMOiBQQ0kgaG9zdCwgTEg6IFBDSSBzbGF2ZSkKKyAqIE1PREUxMjogUENJIC0gUGluIE1vZGUgKEhMOiBMb2NhbCBidXMsIEhIOiBEVSkKKyAqIE1PREUxMzogQm9vdCBBZGRyZXNzIE1vZGUgKEw6IDI5LWJpdCwgSDogMzItYml0KQorICogTU9ERTE0OiBSZXNlcnZlZCAoSDogTm9ybWFsIG9wZXJhdGlvbikKKyAqCisgKiBNb3JlIGluZm9ybWF0aW9uIGluIHNoNzc4NSBtYW51YWwgUmV2LjEuMDAsIHBhZ2UgMTYyOC4KKyAqLworCisvKiBQaW4gRnVuY3Rpb24gQ29udHJvbGxlcjoKKyAqIEdQSU9fRk5feHggLSBHUElPIHVzZWQgdG8gc2VsZWN0IHBpbiBmdW5jdGlvbgorICogR1BJT19QeHggLSBHUElPIG1hcHBlZCB0byByZWFsIEkvTyBwaW4gb24gQ1BVCisgKi8KIGVudW0gewogCS8qIFBBICovCiAJR1BJT19QQTcsIEdQSU9fUEE2LCBHUElPX1BBNSwgR1BJT19QQTQsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNC9jcHUvdGltZXIuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS90aW1lci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWU3OTZiLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0L2NwdS90aW1lci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXNoL2NwdS1zaDQvdGltZXIuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBMaW5lbyBTb2x1dGlvbnMsIEluYy4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX0FTTV9DUFVfU0g0X1RJTUVSX0gKLSNkZWZpbmUgX19BU01fQ1BVX1NINF9USU1FUl9ICi0KLS8qCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRNVSBDb21tb24gZGVmaW5pdGlvbnMgZm9yIFNINCBwcm9jZXNzb3JzCi0gKglTSDc3NTBTL1NINzc1MFIKLSAqCVNINzc1MS9TSDc3NTFSCi0gKglTSDc3NjAKLSAqCVNILVgzCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSFgzCi0jZGVmaW5lIFRNVV8wMTJfQkFTRQkweGZmYzEwMDAwCi0jZGVmaW5lIFRNVV8zNDVfQkFTRQkweGZmYzIwMDAwCi0jZWxzZQotI2RlZmluZSBUTVVfMDEyX0JBU0UJMHhmZmQ4MDAwMAotI2RlZmluZSBUTVVfMzQ1X0JBU0UJMHhmZTEwMDAwMAotI2VuZGlmCi0KLSNkZWZpbmUgVE1VX1RPQ1IJVE1VXzAxMl9CQVNFCS8qIE5vdCBzdXBwb3J0ZWQgb24gYWxsIENQVXMgKi8KLQotI2RlZmluZSBUTVVfMDEyX1RTVFIJKFRNVV8wMTJfQkFTRSArIDB4MDQpCi0jZGVmaW5lIFRNVV8zNDVfVFNUUgkoVE1VXzM0NV9CQVNFICsgMHgwNCkKLQotI2RlZmluZSBUTVUwX1RDT1IJKFRNVV8wMTJfQkFTRSArIDB4MDgpCi0jZGVmaW5lIFRNVTBfVENOVAkoVE1VXzAxMl9CQVNFICsgMHgwYykKLSNkZWZpbmUgVE1VMF9UQ1IJKFRNVV8wMTJfQkFTRSArIDB4MTApCi0KLSNkZWZpbmUgVE1VMV9UQ09SICAgICAgIChUTVVfMDEyX0JBU0UgKyAweDE0KQotI2RlZmluZSBUTVUxX1RDTlQgICAgICAgKFRNVV8wMTJfQkFTRSArIDB4MTgpCi0jZGVmaW5lIFRNVTFfVENSICAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgxYykKLQotI2RlZmluZSBUTVUyX1RDT1IgICAgICAgKFRNVV8wMTJfQkFTRSArIDB4MjApCi0jZGVmaW5lIFRNVTJfVENOVCAgICAgICAoVE1VXzAxMl9CQVNFICsgMHgyNCkKLSNkZWZpbmUgVE1VMl9UQ1IJKFRNVV8wMTJfQkFTRSArIDB4MjgpCi0jZGVmaW5lIFRNVTJfVENQUgkoVE1VXzAxMl9CQVNFICsgMHgyYykKLQotI2RlZmluZSBUTVUzX1RDT1IJKFRNVV8zNDVfQkFTRSArIDB4MDgpCi0jZGVmaW5lIFRNVTNfVENOVAkoVE1VXzM0NV9CQVNFICsgMHgwYykKLSNkZWZpbmUgVE1VM19UQ1IJKFRNVV8zNDVfQkFTRSArIDB4MTApCi0KLSNkZWZpbmUgVE1VNF9UQ09SCShUTVVfMzQ1X0JBU0UgKyAweDE0KQotI2RlZmluZSBUTVU0X1RDTlQJKFRNVV8zNDVfQkFTRSArIDB4MTgpCi0jZGVmaW5lIFRNVTRfVENSCShUTVVfMzQ1X0JBU0UgKyAweDFjKQotCi0jZGVmaW5lIFRNVTVfVENPUgkoVE1VXzM0NV9CQVNFICsgMHgyMCkKLSNkZWZpbmUgVE1VNV9UQ05UCShUTVVfMzQ1X0JBU0UgKyAweDI0KQotI2RlZmluZSBUTVU1X1RDUgkoVE1VXzM0NV9CQVNFICsgMHgyOCkKLQotI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfVElNRVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDUvY3B1L2lycS5oIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDUvY3B1L2lycS5oCmluZGV4IGYwZjA3NTZlLi4wY2NmMjU3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNS9jcHUvaXJxLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDUvY3B1L2lycS5oCkBAIC0xMTEsNyArMTExLDYgQEAKICNkZWZpbmUgVE9QX1BSSU9SSVRZCTE1CiAKIGV4dGVybiBpbnQgaW50Y19ldnRfdG9faXJxWygweEUyMC8weDIwKSsxXTsKLWludCBpbnRjX2lycV9kZXNjcmliZShjaGFyKiBwLCBpbnQgaXJxKTsKIGV4dGVybiBpbnQgcGxhdGZvcm1faW50X3ByaW9yaXR5W05SX0lOVENfSVJRU107CiAKICNlbmRpZiAvKiBfX0FTTV9TSF9DUFVfU0g1X0lSUV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvbWFjaC1jb21tb24vbWFjaC9zaDc3ODVsY3IuaCBiL2FyY2gvc2gvaW5jbHVkZS9tYWNoLWNvbW1vbi9tYWNoL3NoNzc4NWxjci5oCmluZGV4IDFjZTI3ZDUuLjkwMDExZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9tYWNoLWNvbW1vbi9tYWNoL3NoNzc4NWxjci5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9tYWNoLWNvbW1vbi9tYWNoL3NoNzc4NWxjci5oCkBAIC05LDExICs5LDExIEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tCiAgKiAweDAwMDAwMDAwIC0gMHgwM2ZmZmZmZihDUzApCXwgTk9SIEZsYXNoCXwgTk9SIEZsYXNoCiAgKiAweDA0MDAwMDAwIC0gMHgwNWZmZmZmZihDUzEpCXwgUExECQl8IFBMRAotICogMHgwNjAwMDAwMCAtIDB4MDdmZmZmZmYoQ1MxKQl8IHJlc2VydmVkCXwgSTJDCisgKiAweDA2MDAwMDAwIC0gMHgwN2ZmZmZmZihDUzEpCXwgSTJDCQl8IEkyQwogICogMHgwODAwMDAwMCAtIDB4MGJmZmZmZmYoQ1MyKQl8IFVTQgkJfCBERFIgU0RSQU0KICAqIDB4MGMwMDAwMDAgLSAweDBmZmZmZmZmKENTMykJfCBTRAkJfCBERFIgU0RSQU0KICAqIDB4MTAwMDAwMDAgLSAweDEzZmZmZmZmKENTNCkJfCBTTTEwNwkJfCBTTTEwNwotICogMHgxNDAwMDAwMCAtIDB4MTdmZmZmZmYoQ1M1KQl8IEkyQwkJfCBVU0IKKyAqIDB4MTQwMDAwMDAgLSAweDE3ZmZmZmZmKENTNSkJfCByZXNlcnZlZAl8IFVTQgogICogMHgxODAwMDAwMCAtIDB4MWJmZmZmZmYoQ1M2KQl8IHJlc2VydmVkCXwgU0QKICAqIDB4NDAwMDAwMDAgLSAweDVmZmZmZmZmCXwgRERSIFNEUkFNCXwgKGNhbm5vdCB1c2UpCiAgKgpAQCAtMzIsNiArMzIsOSBAQAogI2RlZmluZSBQTERfVkVSU1IJCShQTERfQkFTRV9BRERSICsgMHgwYykKICNkZWZpbmUgUExEX01NU1IJCShQTERfQkFTRV9BRERSICsgMHgwZSkKIAorI2RlZmluZSBQQ0E5NTY0X0FERFIJCTB4MDYwMDAwMDAJLyogSTJDICovCisjZGVmaW5lIFBDQTk1NjRfU0laRQkJMHgwMDAwMDEwMAorCiAjZGVmaW5lIFNNMTA3X01FTV9BRERSCQkweDEwMDAwMDAwCiAjZGVmaW5lIFNNMTA3X01FTV9TSVpFCQkweDAwZTAwMDAwCiAjZGVmaW5lIFNNMTA3X1JFR19BRERSCQkweDEzZTAwMDAwCkBAIC00MCwxNiArNDMsMTMgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9TSDc3ODVMQ1JfMjlCSVRfUEhZU01BUFMpCiAjZGVmaW5lIFI4QTY2NTk3X0FERFIJCTB4MTQwMDAwMDAJLyogVVNCICovCiAjZGVmaW5lIENHMjAwX0FERFIJCTB4MTgwMDAwMDAJLyogU0QgKi8KLSNkZWZpbmUgUENBOTU2NF9BRERSCQkweDA2MDAwMDAwCS8qIEkyQyAqLwogI2Vsc2UKICNkZWZpbmUgUjhBNjY1OTdfQUREUgkJMHgwODAwMDAwMAogI2RlZmluZSBDRzIwMF9BRERSCQkweDBjMDAwMDAwCi0jZGVmaW5lIFBDQTk1NjRfQUREUgkJMHgxNDAwMDAwMAogI2VuZGlmCiAKICNkZWZpbmUgUjhBNjY1OTdfU0laRQkJMHgwMDAwMDEwMAogI2RlZmluZSBDRzIwMF9TSVpFCQkweDAwMDEwMDAwCi0jZGVmaW5lIFBDQTk1NjRfU0laRQkJMHgwMDAwMDEwMAogCiAjZW5kaWYgIC8qIF9fQVNNX1NIX1JFTkVTQVNfU0g3Nzg1TENSX0ggKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL21hY2gtZHJlYW1jYXN0L21hY2gvcGNpLmggYi9hcmNoL3NoL2luY2x1ZGUvbWFjaC1kcmVhbWNhc3QvbWFjaC9wY2kuaAppbmRleCA3NWZjOTAwLi4wMzE0ZDk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvbWFjaC1kcmVhbWNhc3QvbWFjaC9wY2kuaAorKysgYi9hcmNoL3NoL2luY2x1ZGUvbWFjaC1kcmVhbWNhc3QvbWFjaC9wY2kuaApAQCAtMjEsNSArMjEsNyBAQAogCiAjZGVmaW5lCUdBUFNQQ0lfSVJRCQlIV19FVkVOVF9FWFRFUk5BTAogCitleHRlcm4gc3RydWN0IHBjaV9vcHMgZ2Fwc3BjaV9wY2lfb3BzOworCiAjZW5kaWYgLyogX19BU01fU0hfRFJFQU1DQVNUX1BDSV9IICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9tYWNoLXNlL21hY2gvc2U3NzI0LmggYi9hcmNoL3NoL2luY2x1ZGUvbWFjaC1zZS9tYWNoL3NlNzcyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTY0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2luY2x1ZGUvbWFjaC1zZS9tYWNoL3NlNzcyNC5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgX19BU01fU0hfU0U3NzI0X0gKKyNkZWZpbmUgX19BU01fU0hfU0U3NzI0X0gKKworLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLXNoL3NlNzcyNC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKgorICogS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgorICoKKyAqIEhpdGFjaGkgVUwgU29sdXRpb25FbmdpbmUgNzcyNCBTdXBwb3J0LgorICoKKyAqIEJhc2VkIG9uIHNlNzcyMi5oCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIE5vYnVoaXJvIEl3YW1hdHN1CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorCisjZGVmaW5lIFBBX0xFRAkJKDB4YmEyMDMwMDApCS8qIDhiaXQgTEVEICovCisjZGVmaW5lIElSUV9NT0RFCSgweGJhMjAwMDEwKQorI2RlZmluZSBJUlEwX1NSCQkoMHhiYTIwMDAxNCkKKyNkZWZpbmUgSVJRMV9TUgkJKDB4YmEyMDAwMTgpCisjZGVmaW5lIElSUTJfU1IJCSgweGJhMjAwMDFjKQorI2RlZmluZSBJUlEwX01SCQkoMHhiYTIwMDAyMCkKKyNkZWZpbmUgSVJRMV9NUgkJKDB4YmEyMDAwMjQpCisjZGVmaW5lIElSUTJfTVIJCSgweGJhMjAwMDI4KQorCisvKiBJUlEgKi8KKyNkZWZpbmUgSVJRMF9JUlEgICAgICAgIDMyCisjZGVmaW5lIElSUTFfSVJRICAgICAgICAzMworI2RlZmluZSBJUlEyX0lSUSAgICAgICAgMzQKKworLyogQml0cyBpbiBJUlEwMTIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNFNzcyNF9GUEdBX0lSUV9CQVNFCTIyMAorCisvKiBJUlEwICovCisjZGVmaW5lIElSUTBfQkFTRQlTRTc3MjRfRlBHQV9JUlFfQkFTRQorI2RlZmluZSBJUlEwX0tFWQkoSVJRMF9CQVNFICsgMTIpCisjZGVmaW5lIElSUTBfUk1JSQkoSVJRMF9CQVNFICsgMTMpCisjZGVmaW5lIElSUTBfU01DCShJUlEwX0JBU0UgKyAxNCkKKyNkZWZpbmUgSVJRMF9NQVNLCTB4N2ZmZgorI2RlZmluZSBJUlEwX0VORAlJUlEwX1NNQworLyogSVJRMSAqLworI2RlZmluZSBJUlExX0JBU0UJKElSUTBfRU5EICsgMSkKKyNkZWZpbmUgSVJRMV9UUwkJKElSUTFfQkFTRSArIDApCisjZGVmaW5lIElSUTFfTUFTSwkweDAwMDEKKyNkZWZpbmUgSVJRMV9FTkQJSVJRMV9UUworLyogSVJRMiAqLworI2RlZmluZSBJUlEyX0JBU0UJKElSUTFfRU5EICsgMSkKKyNkZWZpbmUgSVJRMl9VU0IwCShJUlExX0JBU0UgKyAwKQorI2RlZmluZSBJUlEyX1VTQjEJKElSUTFfQkFTRSArIDEpCisjZGVmaW5lIElSUTJfTUFTSwkweDAwMDMKKyNkZWZpbmUgSVJRMl9FTkQJSVJRMl9VU0IxCisKKyNkZWZpbmUgU0U3NzI0X0ZQR0FfSVJRX05SCShJUlEyX0VORCAtIElSUTBfQkFTRSkKKworLyogYXJjaC9zaC9ib2FyZHMvc2UvNzcyNC9pcnEuYyAqLwordm9pZCBpbml0X3NlNzcyNF9JUlEodm9pZCk7CisKKyNkZWZpbmUgX19JT19QUkVGSVgJCXNlNzcyNAorI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+CisKKyNlbmRpZiAgLyogX19BU01fU0hfU0U3NzI0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL01ha2VmaWxlXzMyIGIvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGVfMzIKaW5kZXggODJhM2ExNS4uOTQxMWUzZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGVfMzIKKysrIGIvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGVfMzIKQEAgLTExLDEwICsxMSwxMCBAQAogCiBvYmoteQk6PSBkZWJ1Z3RyYXBzLm8gaWRsZS5vIGlvLm8gaW9fZ2VuZXJpYy5vIGlycS5vCQkJXAogCSAgIG1hY2h2ZWMubyBwcm9jZXNzXzMyLm8gcHRyYWNlXzMyLm8gc2V0dXAubyBzaWduYWxfMzIubwlcCi0JICAgc3lzX3NoLm8gc3lzX3NoMzIubyBzeXNjYWxsc18zMi5vIHRpbWVfMzIubyB0b3BvbG9neS5vCVwKKwkgICBzeXNfc2gubyBzeXNfc2gzMi5vIHN5c2NhbGxzXzMyLm8gdGltZS5vIHRvcG9sb2d5Lm8JXAogCSAgIHRyYXBzLm8gdHJhcHNfMzIubwogCi1vYmoteQkJCQkrPSBjcHUvIHRpbWVycy8KK29iai15CQkJCSs9IGNwdS8KIG9iai0kKENPTkZJR19WU1lTQ0FMTCkJCSs9IHZzeXNjYWxsLwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCiBvYmotJChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykJKz0gc2hfYmlvcy5vCkBAIC0zMiw0ICszMiw2IEBACiBvYmotJChDT05GSUdfRFVNUF9DT0RFKQkJKz0gZGlzYXNzZW1ibGUubwogb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBzd3N1c3AubwogCitvYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpCSs9IGxvY2FsdGltZXIubworCiBFWFRSQV9DRkxBR1MgKz0gLVdlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGVfNjQgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZV82NAppbmRleCBmZTQyNWQ3Li42N2I5ZjZjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZV82NAorKysgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZV82NApAQCAtMiwxOSArMiwxOCBAQAogCiBvYmoteQk6PSBkZWJ1Z3RyYXBzLm8gaWRsZS5vIGlvLm8gaW9fZ2VuZXJpYy5vIGlycS5vIG1hY2h2ZWMubyBwcm9jZXNzXzY0Lm8gXAogCSAgIHB0cmFjZV82NC5vIHNldHVwLm8gc2lnbmFsXzY0Lm8gc3lzX3NoLm8gc3lzX3NoNjQubyBcCi0JICAgc3lzY2FsbHNfNjQubyB0aW1lXzY0Lm8gdG9wb2xvZ3kubyB0cmFwcy5vIHRyYXBzXzY0Lm8KKwkgICBzeXNjYWxsc182NC5vIHRpbWUubyB0b3BvbG9neS5vIHRyYXBzLm8gdHJhcHNfNjQubwogCi1vYmoteQkJCQkrPSBjcHUvIHRpbWVycy8KLW9iai0kKENPTkZJR19WU1lTQ0FMTCkJCSs9IHZzeXNjYWxsLworb2JqLXkJCQkJKz0gY3B1Lwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vCi1vYmotJChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykJKz0gc2hfYmlvcy5vCiBvYmotJChDT05GSUdfU0hfQ1BVX0ZSRVEpCSs9IGNwdWZyZXEubwogb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBzaF9rc3ltc182NC5vIG1vZHVsZS5vCiBvYmotJChDT05GSUdfRUFSTFlfUFJJTlRLKQkrPSBlYXJseV9wcmludGsubwotb2JqLSQoQ09ORklHX0tFWEVDKQkJKz0gbWFjaGluZV9rZXhlYy5vIHJlbG9jYXRlX2tlcm5lbC5vCiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkJKz0gY3Jhc2hfZHVtcC5vCiBvYmotJChDT05GSUdfU1RBQ0tUUkFDRSkJKz0gc3RhY2t0cmFjZS5vCiBvYmotJChDT05GSUdfSU9fVFJBUFBFRCkJKz0gaW9fdHJhcHBlZC5vCiBvYmotJChDT05GSUdfR0VORVJJQ19HUElPKQkrPSBncGlvLm8KIAorb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUKQkrPSBsb2NhbHRpbWVyLm8KKwogRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9NYWtlZmlsZQppbmRleCAyNjAwNjQxLi5lZWNhZDdjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlCkBAIC0xNyw1ICsxNyw2IEBACiAKIG9iai0kKENPTkZJR19VQkNfV0FLRVVQKQkrPSB1YmMubwogb2JqLSQoQ09ORklHX1NIX0FEQykJCSs9IGFkYy5vCitvYmotJChDT05GSUdfU0hfQ0xLX0NQRykJKz0gY2xvY2stY3BnLm8KIAogb2JqLXkJKz0gaXJxLyBpbml0Lm8gY2xvY2subwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLWNwZy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLWNwZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NTk0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2stY3BnLmMKQEAgLTAsMCArMSwyNTYgQEAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorCitzdGF0aWMgaW50IHNoX2Nsa19tc3RwMzJfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoY2xrLT5lbmFibGVfcmVnKSAmIH4oMSA8PCBjbGstPmVuYWJsZV9iaXQpLAorCQkgICAgIGNsay0+ZW5hYmxlX3JlZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNoX2Nsa19tc3RwMzJfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZykgfCAoMSA8PCBjbGstPmVuYWJsZV9iaXQpLAorCQkgICAgIGNsay0+ZW5hYmxlX3JlZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaF9jbGtfbXN0cDMyX2Nsa19vcHMgPSB7CisJLmVuYWJsZQkJPSBzaF9jbGtfbXN0cDMyX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHNoX2Nsa19tc3RwMzJfZGlzYWJsZSwKKwkucmVjYWxjCQk9IGZvbGxvd3BhcmVudF9yZWNhbGMsCit9OworCitpbnQgX19pbml0IHNoX2Nsa19tc3RwMzJfcmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrcywgaW50IG5yKQoreworCXN0cnVjdCBjbGsgKmNsa3A7CisJaW50IHJldCA9IDA7CisJaW50IGs7CisKKwlmb3IgKGsgPSAwOyAhcmV0ICYmIChrIDwgbnIpOyBrKyspIHsKKwkJY2xrcCA9IGNsa3MgKyBrOworCQljbGtwLT5vcHMgPSAmc2hfY2xrX21zdHAzMl9jbGtfb3BzOworCQlyZXQgfD0gY2xrX3JlZ2lzdGVyKGNsa3ApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIHNoX2Nsa19kaXZfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gY2xrX3JhdGVfdGFibGVfcm91bmQoY2xrLCBjbGstPmZyZXFfdGFibGUsIHJhdGUpOworfQorCitzdGF0aWMgaW50IHNoX2Nsa19kaXY2X2Rpdmlzb3JzWzY0XSA9IHsKKwkxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKwkxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwKKwkzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKwk0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X211bHRfdGFibGUgc2hfY2xrX2RpdjZfdGFibGUgPSB7CisJLmRpdmlzb3JzID0gc2hfY2xrX2RpdjZfZGl2aXNvcnMsCisJLm5yX2Rpdmlzb3JzID0gQVJSQVlfU0laRShzaF9jbGtfZGl2Nl9kaXZpc29ycyksCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaF9jbGtfZGl2Nl9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBjbGtfZGl2X211bHRfdGFibGUgKnRhYmxlID0gJnNoX2Nsa19kaXY2X3RhYmxlOworCXVuc2lnbmVkIGludCBpZHg7CisKKwljbGtfcmF0ZV90YWJsZV9idWlsZChjbGssIGNsay0+ZnJlcV90YWJsZSwgdGFibGUtPm5yX2Rpdmlzb3JzLAorCQkJICAgICB0YWJsZSwgTlVMTCk7CisKKwlpZHggPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpICYgMHgwMDNmOworCisJcmV0dXJuIGNsay0+ZnJlcV90YWJsZVtpZHhdLmZyZXF1ZW5jeTsKK30KKworc3RhdGljIGludCBzaF9jbGtfZGl2Nl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssCisJCQkJdW5zaWduZWQgbG9uZyByYXRlLCBpbnQgYWxnb19pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCBpZHg7CisKKwlpZHggPSBjbGtfcmF0ZV90YWJsZV9maW5kKGNsaywgY2xrLT5mcmVxX3RhYmxlLCByYXRlKTsKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIGlkeDsKKworCXZhbHVlID0gX19yYXdfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwl2YWx1ZSAmPSB+MHgzZjsKKwl2YWx1ZSB8PSBpZHg7CisJX19yYXdfd3JpdGVsKHZhbHVlLCBjbGstPmVuYWJsZV9yZWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoX2Nsa19kaXY2X2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gc2hfY2xrX2RpdjZfc2V0X3JhdGUoY2xrLCBjbGstPnJhdGUsIDApOworCWlmIChyZXQgPT0gMCkgeworCQl2YWx1ZSA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJCXZhbHVlICY9IH4weDEwMDsgLyogY2xlYXIgc3RvcCBiaXQgdG8gZW5hYmxlIGNsb2NrICovCisJCV9fcmF3X3dyaXRlbCh2YWx1ZSwgY2xrLT5lbmFibGVfcmVnKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2hfY2xrX2RpdjZfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCXZhbHVlID0gX19yYXdfcmVhZGwoY2xrLT5lbmFibGVfcmVnKTsKKwl2YWx1ZSB8PSAweDEwMDsgLyogc3RvcCBjbG9jayAqLworCXZhbHVlIHw9IDB4M2Y7IC8qIFZESVYgYml0cyBtdXN0IGJlIG5vbi16ZXJvLCBvdmVyd3JpdGUgZGl2aWRlciAqLworCV9fcmF3X3dyaXRlbCh2YWx1ZSwgY2xrLT5lbmFibGVfcmVnKTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoX2Nsa19kaXY2X2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBzaF9jbGtfZGl2Nl9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSBzaF9jbGtfZGl2X3JvdW5kX3JhdGUsCisJLnNldF9yYXRlCT0gc2hfY2xrX2RpdjZfc2V0X3JhdGUsCisJLmVuYWJsZQkJPSBzaF9jbGtfZGl2Nl9lbmFibGUsCisJLmRpc2FibGUJPSBzaF9jbGtfZGl2Nl9kaXNhYmxlLAorfTsKKworaW50IF9faW5pdCBzaF9jbGtfZGl2Nl9yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGtzLCBpbnQgbnIpCit7CisJc3RydWN0IGNsayAqY2xrcDsKKwl2b2lkICpmcmVxX3RhYmxlOworCWludCBucl9kaXZzID0gc2hfY2xrX2RpdjZfdGFibGUubnJfZGl2aXNvcnM7CisJaW50IGZyZXFfdGFibGVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpOworCWludCByZXQgPSAwOworCWludCBrOworCisJZnJlcV90YWJsZV9zaXplICo9IChucl9kaXZzICsgMSk7CisKKwlmcmVxX3RhYmxlID0gYWxsb2NfYm9vdG1lbShmcmVxX3RhYmxlX3NpemUgKiBucik7CisJaWYgKCFmcmVxX3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoayA9IDA7ICFyZXQgJiYgKGsgPCBucik7IGsrKykgeworCQljbGtwID0gY2xrcyArIGs7CisKKwkJY2xrcC0+b3BzID0gJnNoX2Nsa19kaXY2X2Nsa19vcHM7CisJCWNsa3AtPmlkID0gLTE7CisJCWNsa3AtPmZyZXFfdGFibGUgPSBmcmVxX3RhYmxlICsgKGsgKiBmcmVxX3RhYmxlX3NpemUpOworCQljbGtwLT5mcmVxX3RhYmxlW25yX2RpdnNdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCisJCXJldCA9IGNsa19yZWdpc3RlcihjbGtwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaF9jbGtfZGl2NF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCXN0cnVjdCBjbGtfZGl2X211bHRfdGFibGUgKnRhYmxlID0gY2xrLT5wcml2OworCXVuc2lnbmVkIGludCBpZHg7CisKKwljbGtfcmF0ZV90YWJsZV9idWlsZChjbGssIGNsay0+ZnJlcV90YWJsZSwgdGFibGUtPm5yX2Rpdmlzb3JzLAorCQkJICAgICB0YWJsZSwgJmNsay0+YXJjaF9mbGFncyk7CisKKwlpZHggPSAoX19yYXdfcmVhZGwoY2xrLT5lbmFibGVfcmVnKSA+PiBjbGstPmVuYWJsZV9iaXQpICYgMHgwMDBmOworCisJcmV0dXJuIGNsay0+ZnJlcV90YWJsZVtpZHhdLmZyZXF1ZW5jeTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoX2Nsa19kaXY0X2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBzaF9jbGtfZGl2NF9yZWNhbGMsCisJLnJvdW5kX3JhdGUJPSBzaF9jbGtfZGl2X3JvdW5kX3JhdGUsCit9OworCitpbnQgX19pbml0IHNoX2Nsa19kaXY0X3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsa3MsIGludCBuciwKKwkJCQlzdHJ1Y3QgY2xrX2Rpdl9tdWx0X3RhYmxlICp0YWJsZSkKK3sKKwlzdHJ1Y3QgY2xrICpjbGtwOworCXZvaWQgKmZyZXFfdGFibGU7CisJaW50IG5yX2RpdnMgPSB0YWJsZS0+bnJfZGl2aXNvcnM7CisJaW50IGZyZXFfdGFibGVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpOworCWludCByZXQgPSAwOworCWludCBrOworCisJZnJlcV90YWJsZV9zaXplICo9IChucl9kaXZzICsgMSk7CisKKwlmcmVxX3RhYmxlID0gYWxsb2NfYm9vdG1lbShmcmVxX3RhYmxlX3NpemUgKiBucik7CisJaWYgKCFmcmVxX3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoayA9IDA7ICFyZXQgJiYgKGsgPCBucik7IGsrKykgeworCQljbGtwID0gY2xrcyArIGs7CisKKwkJY2xrcC0+b3BzID0gJnNoX2Nsa19kaXY0X2Nsa19vcHM7CisJCWNsa3AtPmlkID0gLTE7CisJCWNsa3AtPnByaXYgPSB0YWJsZTsKKworCQljbGtwLT5mcmVxX3RhYmxlID0gZnJlcV90YWJsZSArIChrICogZnJlcV90YWJsZV9zaXplKTsKKwkJY2xrcC0+ZnJlcV90YWJsZVtucl9kaXZzXS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKworCQlyZXQgPSBjbGtfcmVnaXN0ZXIoY2xrcCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19TSF9DTEtfQ1BHX0xFR0FDWQorc3RhdGljIHN0cnVjdCBjbGsgbWFzdGVyX2NsayA9IHsKKwkubmFtZQkJPSAibWFzdGVyX2NsayIsCisJLmZsYWdzCQk9IENMS19FTkFCTEVfT05fSU5JVCwKKwkucmF0ZQkJPSBDT05GSUdfU0hfUENMS19GUkVRLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgcGVyaXBoZXJhbF9jbGsgPSB7CisJLm5hbWUJCT0gInBlcmlwaGVyYWxfY2xrIiwKKwkucGFyZW50CQk9ICZtYXN0ZXJfY2xrLAorCS5mbGFncwkJPSBDTEtfRU5BQkxFX09OX0lOSVQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBidXNfY2xrID0geworCS5uYW1lCQk9ICJidXNfY2xrIiwKKwkucGFyZW50CQk9ICZtYXN0ZXJfY2xrLAorCS5mbGFncwkJPSBDTEtfRU5BQkxFX09OX0lOSVQsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBjcHVfY2xrID0geworCS5uYW1lCQk9ICJjcHVfY2xrIiwKKwkucGFyZW50CQk9ICZtYXN0ZXJfY2xrLAorCS5mbGFncwkJPSBDTEtfRU5BQkxFX09OX0lOSVQsCit9OworCisvKgorICogVGhlIG9yZGVyaW5nIG9mIHRoZXNlIGNsb2NrcyBtYXR0ZXJzLCBkbyBub3QgY2hhbmdlIGl0LgorICovCitzdGF0aWMgc3RydWN0IGNsayAqb25jaGlwX2Nsb2Nrc1tdID0geworCSZtYXN0ZXJfY2xrLAorCSZwZXJpcGhlcmFsX2NsaywKKwkmYnVzX2NsaywKKwkmY3B1X2NsaywKK307CisKK2ludCBfX2luaXQgX19kZXByZWNhdGVkIGNwZ19jbGtfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUob25jaGlwX2Nsb2Nrcyk7IGkrKykgeworCQlzdHJ1Y3QgY2xrICpjbGsgPSBvbmNoaXBfY2xvY2tzW2ldOworCQlhcmNoX2luaXRfY2xrX29wcygmY2xrLT5vcHMsIGkpOworCQlpZiAoY2xrLT5vcHMpCisJCQlyZXQgfD0gY2xrX3JlZ2lzdGVyKGNsayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBsYWNlaG9sZGVyIGZvciBjb21wYXRhYmlsaXR5LCB1bnRpbCB0aGUgbGF6eSBDUFVzIGRvIHRoaXMKKyAqIG9uIHRoZWlyIG93bi4KKyAqLworaW50IF9faW5pdCBfX3dlYWsgYXJjaF9jbGtfaW5pdCh2b2lkKQoreworCXJldHVybiBjcGdfY2xrX2luaXQoKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0hfQ1BHX0NMS19MRUdBQ1kgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9jbG9jay5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLmMKaW5kZXggMWRjODk2NC4uZjNhNDZiZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLmMKQEAgLTEsMTUgKzEsMTkgQEAKIC8qCiAgKiBhcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2suYyAtIFN1cGVySCBjbG9jayBmcmFtZXdvcmsKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2LCAyMDA3ICBQYXVsIE11bmR0CisgKiAgQ29weXJpZ2h0IChDKSAyMDA1IC0gMjAwOSAgUGF1bCBNdW5kdAogICoKICAqIFRoaXMgY2xvY2sgZnJhbWV3b3JrIGlzIGRlcml2ZWQgZnJvbSB0aGUgT01BUCB2ZXJzaW9uIGJ5OgogICoKLSAqCUNvcHlyaWdodCAoQykgMjAwNCAtIDIwMDUgTm9raWEgQ29ycG9yYXRpb24KKyAqCUNvcHlyaWdodCAoQykgMjAwNCAtIDIwMDggTm9raWEgQ29ycG9yYXRpb24KICAqCVdyaXR0ZW4gYnkgVHV1a2thIFRpa2thbmVuIDx0dXVra2EudGlra2FuZW5AZWxla3Ryb2JpdC5jb20+CiAgKgogICogIE1vZGlmaWVkIGZvciBvbWFwIHNoYXJlZCBjbG9jayBmcmFtZXdvcmsgYnkgVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4KICAqCisgKiAgV2l0aCBjbGtkZXYgYml0czoKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDggUnVzc2VsbCBLaW5nLgorICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMTksMTM0ICsyMywxNTkgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KIAogc3RhdGljIExJU1RfSEVBRChjbG9ja19saXN0KTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tfbG9jayk7CiBzdGF0aWMgREVGSU5FX01VVEVYKGNsb2NrX2xpc3Rfc2VtKTsKIAotLyoKLSAqIEVhY2ggc3VidHlwZSBpcyBleHBlY3RlZCB0byBkZWZpbmUgdGhlIGluaXQgcm91dGluZXMgZm9yIHRoZXNlIGNsb2NrcywKLSAqIGFzIGVhY2ggc3VidHlwZSAob3IgcHJvY2Vzc29yIGZhbWlseSkgd2lsbCBoYXZlIHRoZXNlIGNsb2NrcyBhdCB0aGUKLSAqIHZlcnkgbGVhc3QuIFRoZXNlIGFyZSBhbGwgcHJvdmlkZWQgdGhyb3VnaCB0aGUgQ1BHLCB3aGljaCBldmVuIHNvbWUgb2YKLSAqIHRoZSBtb3JlIHF1aXJreSBwYXJ0cyAoc3VjaCBhcyBTVDQwLCBTSDQtMjAyLCBldGMuKSBzdGlsbCBoYXZlLgotICoKLSAqIFRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY29kZSBpcyBleHBlY3RlZCB0byByZWdpc3RlciBhbnkgYWRkaXRpb25hbAotICogY2xvY2sgc291cmNlcyB0aGF0IGFyZSBvZiBpbnRlcmVzdC4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgbWFzdGVyX2NsayA9IHsKLQkubmFtZQkJPSAibWFzdGVyX2NsayIsCi0JLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCB8IENMS19SQVRFX1BST1BBR0FURVMsCi0JLnJhdGUJCT0gQ09ORklHX1NIX1BDTEtfRlJFUSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIG1vZHVsZV9jbGsgPSB7Ci0JLm5hbWUJCT0gIm1vZHVsZV9jbGsiLAotCS5wYXJlbnQJCT0gJm1hc3Rlcl9jbGssCi0JLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCB8IENMS19SQVRFX1BST1BBR0FURVMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBidXNfY2xrID0gewotCS5uYW1lCQk9ICJidXNfY2xrIiwKLQkucGFyZW50CQk9ICZtYXN0ZXJfY2xrLAotCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQgfCBDTEtfUkFURV9QUk9QQUdBVEVTLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgY3B1X2NsayA9IHsKLQkubmFtZQkJPSAiY3B1X2NsayIsCi0JLnBhcmVudAkJPSAmbWFzdGVyX2NsaywKLQkuZmxhZ3MJCT0gQ0xLX0FMV0FZU19FTkFCTEVELAotfTsKLQotLyoKLSAqIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBjbG9ja3MgbWF0dGVycywgZG8gbm90IGNoYW5nZSBpdC4KLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgKm9uY2hpcF9jbG9ja3NbXSA9IHsKLQkmbWFzdGVyX2NsaywKLQkmbW9kdWxlX2NsaywKLQkmYnVzX2NsaywKLQkmY3B1X2NsaywKLX07Ci0KLXN0YXRpYyB2b2lkIHByb3BhZ2F0ZV9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3ZvaWQgY2xrX3JhdGVfdGFibGVfYnVpbGQoc3RydWN0IGNsayAqY2xrLAorCQkJICBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXFfdGFibGUsCisJCQkgIGludCBucl9mcmVxcywKKwkJCSAgc3RydWN0IGNsa19kaXZfbXVsdF90YWJsZSAqc3JjX3RhYmxlLAorCQkJICB1bnNpZ25lZCBsb25nICpiaXRtYXApCiB7Ci0Jc3RydWN0IGNsayAqY2xrcDsKKwl1bnNpZ25lZCBsb25nIG11bHQsIGRpdjsKKwl1bnNpZ25lZCBsb25nIGZyZXE7CisJaW50IGk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsa3AsICZjbG9ja19saXN0LCBub2RlKSB7Ci0JCWlmIChsaWtlbHkoY2xrcC0+cGFyZW50ICE9IGNsaykpCi0JCQljb250aW51ZTsKLQkJaWYgKGxpa2VseShjbGtwLT5vcHMgJiYgY2xrcC0+b3BzLT5yZWNhbGMpKQotCQkJY2xrcC0+b3BzLT5yZWNhbGMoY2xrcCk7Ci0JCWlmICh1bmxpa2VseShjbGtwLT5mbGFncyAmIENMS19SQVRFX1BST1BBR0FURVMpKQotCQkJcHJvcGFnYXRlX3JhdGUoY2xrcCk7CisJZm9yIChpID0gMDsgaSA8IG5yX2ZyZXFzOyBpKyspIHsKKwkJZGl2ID0gMTsKKwkJbXVsdCA9IDE7CisKKwkJaWYgKHNyY190YWJsZS0+ZGl2aXNvcnMgJiYgaSA8IHNyY190YWJsZS0+bnJfZGl2aXNvcnMpCisJCQlkaXYgPSBzcmNfdGFibGUtPmRpdmlzb3JzW2ldOworCisJCWlmIChzcmNfdGFibGUtPm11bHRpcGxpZXJzICYmIGkgPCBzcmNfdGFibGUtPm5yX211bHRpcGxpZXJzKQorCQkJbXVsdCA9IHNyY190YWJsZS0+bXVsdGlwbGllcnNbaV07CisKKwkJaWYgKCFkaXYgfHwgIW11bHQgfHwgKGJpdG1hcCAmJiAhdGVzdF9iaXQoaSwgYml0bWFwKSkpCisJCQlmcmVxID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQllbHNlCisJCQlmcmVxID0gY2xrLT5wYXJlbnQtPnJhdGUgKiBtdWx0IC8gZGl2OworCisJCWZyZXFfdGFibGVbaV0uaW5kZXggPSBpOworCQlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IGZyZXE7CiAJfQorCisJLyogVGVybWluYXRpb24gZW50cnkgKi8KKwlmcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKKwlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOwogfQogCi1zdGF0aWMgaW50IF9fY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCitsb25nIGNsa19yYXRlX3RhYmxlX3JvdW5kKHN0cnVjdCBjbGsgKmNsaywKKwkJCSAgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLAorCQkJICB1bnNpZ25lZCBsb25nIHJhdGUpCiB7Ci0JLyoKLQkgKiBTZWUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSdyZSBlbmFibGluZyB0aGUgY2xvY2ssIHNvbWUKLQkgKiBjbG9ja3MgdGhhdCBhcmUgYWx3YXlzIGVuYWJsZWQgc3RpbGwgcmVxdWlyZSAic3BlY2lhbCIKLQkgKiBpbml0aWFsaXphdGlvbi4gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgaWYgdGhlIGNsb2NrIG1vZGUKLQkgKiBjaGFuZ2VzIGFuZCB0aGUgY2xvY2sgbmVlZHMgdG8gaHVudCBmb3IgdGhlIHByb3BlciBzZXQgb2YKLQkgKiBkaXZpc29ycyB0byB1c2UgYmVmb3JlIGl0IGNhbiBlZmZlY3RpdmVseSByZWNhbGMuCi0JICovCi0JaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZjbGstPmtyZWYucmVmY291bnQpID09IDEpKQotCQlpZiAoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPmluaXQpCi0JCQljbGstPm9wcy0+aW5pdChjbGspOworCXVuc2lnbmVkIGxvbmcgcmF0ZV9lcnJvciwgcmF0ZV9lcnJvcl9wcmV2ID0gfjBVTDsKKwl1bnNpZ25lZCBsb25nIHJhdGVfYmVzdF9maXQgPSByYXRlOworCXVuc2lnbmVkIGxvbmcgaGlnaGVzdCwgbG93ZXN0OworCWludCBpOwogCi0Ja3JlZl9nZXQoJmNsay0+a3JlZik7CisJaGlnaGVzdCA9IGxvd2VzdCA9IDA7CiAKLQlpZiAoY2xrLT5mbGFncyAmIENMS19BTFdBWVNfRU5BQkxFRCkKLQkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQ7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGZyZXEgPSBmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeTsKIAotCWlmIChsaWtlbHkoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPmVuYWJsZSkpCi0JCWNsay0+b3BzLT5lbmFibGUoY2xrKTsKKwkJaWYgKGZyZXEgPT0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEKQorCQkJY29udGludWU7CisKKwkJaWYgKGZyZXEgPiBoaWdoZXN0KQorCQkJaGlnaGVzdCA9IGZyZXE7CisJCWlmIChmcmVxIDwgbG93ZXN0KQorCQkJbG93ZXN0ID0gZnJlcTsKKworCQlyYXRlX2Vycm9yID0gYWJzKGZyZXEgLSByYXRlKTsKKwkJaWYgKHJhdGVfZXJyb3IgPCByYXRlX2Vycm9yX3ByZXYpIHsKKwkJCXJhdGVfYmVzdF9maXQgPSBmcmVxOworCQkJcmF0ZV9lcnJvcl9wcmV2ID0gcmF0ZV9lcnJvcjsKKwkJfQorCisJCWlmIChyYXRlX2Vycm9yID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAocmF0ZSA+PSBoaWdoZXN0KQorCQlyYXRlX2Jlc3RfZml0ID0gaGlnaGVzdDsKKwlpZiAocmF0ZSA8PSBsb3dlc3QpCisJCXJhdGVfYmVzdF9maXQgPSBsb3dlc3Q7CisKKwlyZXR1cm4gcmF0ZV9iZXN0X2ZpdDsKK30KKworaW50IGNsa19yYXRlX3RhYmxlX2ZpbmQoc3RydWN0IGNsayAqY2xrLAorCQkJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLAorCQkJdW5zaWduZWQgbG9uZyByYXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgIT0gQ1BVRlJFUV9UQUJMRV9FTkQ7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIGZyZXEgPSBmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeTsKKworCQlpZiAoZnJlcSA9PSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpCisJCQljb250aW51ZTsKKworCQlpZiAoZnJlcSA9PSByYXRlKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKy8qIFVzZWQgZm9yIGNsb2NrcyB0aGF0IGFsd2F5cyBoYXZlIHNhbWUgdmFsdWUgYXMgdGhlIHBhcmVudCBjbG9jayAqLwordW5zaWduZWQgbG9uZyBmb2xsb3dwYXJlbnRfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrLT5wYXJlbnQgPyBjbGstPnBhcmVudC0+cmF0ZSA6IDA7Cit9CisKK2ludCBjbGtfcmVwYXJlbnQoc3RydWN0IGNsayAqY2hpbGQsIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwlsaXN0X2RlbF9pbml0KCZjaGlsZC0+c2libGluZyk7CisJaWYgKHBhcmVudCkKKwkJbGlzdF9hZGQoJmNoaWxkLT5zaWJsaW5nLCAmcGFyZW50LT5jaGlsZHJlbik7CisJY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKKworCS8qIG5vdyBkbyB0aGUgZGVidWdmcyByZW5hbWluZyB0byByZWF0dGFjaCB0aGUgY2hpbGQKKwkgICB0byB0aGUgcHJvcGVyIHBhcmVudCAqLwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKKy8qIFByb3BhZ2F0ZSByYXRlIHRvIGNoaWxkcmVuICovCit2b2lkIHByb3BhZ2F0ZV9yYXRlKHN0cnVjdCBjbGsgKnRjbGspCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OworCXN0cnVjdCBjbGsgKmNsa3A7CiAKLQlpZiAoIWNsaykKLQkJcmV0dXJuIC1FSU5WQUw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGtwLCAmdGNsay0+Y2hpbGRyZW4sIHNpYmxpbmcpIHsKKwkJaWYgKGNsa3AtPm9wcyAmJiBjbGtwLT5vcHMtPnJlY2FsYykKKwkJCWNsa3AtPnJhdGUgPSBjbGtwLT5vcHMtPnJlY2FsYyhjbGtwKTsKIAotCWNsa19lbmFibGUoY2xrLT5wYXJlbnQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKLQlyZXQgPSBfX2Nsa19lbmFibGUoY2xrKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2VuYWJsZSk7Ci0KLXN0YXRpYyB2b2lkIGNsa19rcmVmX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0JLyogTm90aGluZyB0byBkbyAqLworCQlwcm9wYWdhdGVfcmF0ZShjbGtwKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIF9fY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQogewotCWludCBjb3VudCA9IGtyZWZfcHV0KCZjbGstPmtyZWYsIGNsa19rcmVmX3JlbGVhc2UpOwotCi0JaWYgKGNsay0+ZmxhZ3MgJiBDTEtfQUxXQVlTX0VOQUJMRUQpCisJaWYgKGNsay0+dXNlY291bnQgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlRyeWluZyBkaXNhYmxlIGNsb2NrICVzIHdpdGggMCB1c2Vjb3VudFxuIiwKKwkJICAgICAgIGNsay0+bmFtZSk7CisJCVdBUk5fT04oMSk7CiAJCXJldHVybjsKKwl9CiAKLQlpZiAoIWNvdW50KSB7CS8qIGNvdW50IHJlYWNoZXMgemVybywgZGlzYWJsZSB0aGUgY2xvY2sgKi8KKwlpZiAoISgtLWNsay0+dXNlY291bnQpKSB7CiAJCWlmIChsaWtlbHkoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPmRpc2FibGUpKQogCQkJY2xrLT5vcHMtPmRpc2FibGUoY2xrKTsKKwkJaWYgKGxpa2VseShjbGstPnBhcmVudCkpCisJCQlfX2Nsa19kaXNhYmxlKGNsay0+cGFyZW50KTsKIAl9CiB9CiAKQEAgLTE2MCwyOSArMTg5LDk4IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKIAlfX2Nsa19kaXNhYmxlKGNsayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tfbG9jaywgZmxhZ3MpOwotCi0JY2xrX2Rpc2FibGUoY2xrLT5wYXJlbnQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2Rpc2FibGUpOwogCitzdGF0aWMgaW50IF9fY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoY2xrLT51c2Vjb3VudCsrID09IDApIHsKKwkJaWYgKGNsay0+cGFyZW50KSB7CisJCQlyZXQgPSBfX2Nsa19lbmFibGUoY2xrLT5wYXJlbnQpOworCQkJaWYgKHVubGlrZWx5KHJldCkpCisJCQkJZ290byBlcnI7CisJCX0KKworCQlpZiAoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPmVuYWJsZSkgeworCQkJcmV0ID0gY2xrLT5vcHMtPmVuYWJsZShjbGspOworCQkJaWYgKHJldCkgeworCQkJCWlmIChjbGstPnBhcmVudCkKKwkJCQkJX19jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CisJCQkJZ290byBlcnI7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworZXJyOgorCWNsay0+dXNlY291bnQtLTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKCFjbGspCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBfX2Nsa19lbmFibGUoY2xrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2VuYWJsZSk7CisKK3N0YXRpYyBMSVNUX0hFQUQocm9vdF9jbGtzKTsKKworLyoqCisgKiByZWNhbGN1bGF0ZV9yb290X2Nsb2NrcyAtIHJlY2FsY3VsYXRlIGFuZCBwcm9wYWdhdGUgYWxsIHJvb3QgY2xvY2tzCisgKgorICogUmVjYWxjdWxhdGVzIGFsbCByb290IGNsb2NrcyAoY2xvY2tzIHdpdGggbm8gcGFyZW50KSwgd2hpY2ggaWYgdGhlCisgKiBjbG9jaydzIC5yZWNhbGMgaXMgc2V0IGNvcnJlY3RseSwgc2hvdWxkIGFsc28gcHJvcGFnYXRlIHRoZWlyIHJhdGVzLgorICogQ2FsbGVkIGF0IGluaXQuCisgKi8KK3ZvaWQgcmVjYWxjdWxhdGVfcm9vdF9jbG9ja3Modm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpjbGtwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGtwLCAmcm9vdF9jbGtzLCBzaWJsaW5nKSB7CisJCWlmIChjbGtwLT5vcHMgJiYgY2xrcC0+b3BzLT5yZWNhbGMpCisJCQljbGtwLT5yYXRlID0gY2xrcC0+b3BzLT5yZWNhbGMoY2xrcCk7CisJCXByb3BhZ2F0ZV9yYXRlKGNsa3ApOworCX0KK30KKwogaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7CisJaWYgKGNsayA9PSBOVUxMIHx8IElTX0VSUihjbGspKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogdHJhcCBvdXQgYWxyZWFkeSByZWdpc3RlcmVkIGNsb2NrcworCSAqLworCWlmIChjbGstPm5vZGUubmV4dCB8fCBjbGstPm5vZGUucHJldikKKwkJcmV0dXJuIDA7CisKIAltdXRleF9sb2NrKCZjbG9ja19saXN0X3NlbSk7CiAKKwlJTklUX0xJU1RfSEVBRCgmY2xrLT5jaGlsZHJlbik7CisJY2xrLT51c2Vjb3VudCA9IDA7CisKKwlpZiAoY2xrLT5wYXJlbnQpCisJCWxpc3RfYWRkKCZjbGstPnNpYmxpbmcsICZjbGstPnBhcmVudC0+Y2hpbGRyZW4pOworCWVsc2UKKwkJbGlzdF9hZGQoJmNsay0+c2libGluZywgJnJvb3RfY2xrcyk7CisKIAlsaXN0X2FkZCgmY2xrLT5ub2RlLCAmY2xvY2tfbGlzdCk7Ci0Ja3JlZl9pbml0KCZjbGstPmtyZWYpOwotCisJaWYgKGNsay0+b3BzICYmIGNsay0+b3BzLT5pbml0KQorCQljbGstPm9wcy0+aW5pdChjbGspOwogCW11dGV4X3VubG9jaygmY2xvY2tfbGlzdF9zZW0pOwogCi0JaWYgKGNsay0+ZmxhZ3MgJiBDTEtfQUxXQVlTX0VOQUJMRUQpIHsKLQkJcHJfZGVidWcoICJDbG9jayAnJXMnIGlzIEFMV0FZU19FTkFCTEVEXG4iLCBjbGstPm5hbWUpOwotCQlpZiAoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPmluaXQpCi0JCQljbGstPm9wcy0+aW5pdChjbGspOwotCQlpZiAoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPmVuYWJsZSkKLQkJCWNsay0+b3BzLT5lbmFibGUoY2xrKTsKLQkJcHJfZGVidWcoICJFbmFibGVkLiIpOwotCX0KLQogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xrX3JlZ2lzdGVyKTsKQEAgLTE5MCwxMSArMjg4LDIxIEBACiB2b2lkIGNsa191bnJlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsaykKIHsKIAltdXRleF9sb2NrKCZjbG9ja19saXN0X3NlbSk7CisJbGlzdF9kZWwoJmNsay0+c2libGluZyk7CiAJbGlzdF9kZWwoJmNsay0+bm9kZSk7CiAJbXV0ZXhfdW5sb2NrKCZjbG9ja19saXN0X3NlbSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbGtfdW5yZWdpc3Rlcik7CiAKK3N0YXRpYyB2b2lkIGNsa19lbmFibGVfaW5pdF9jbG9ja3Modm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpjbGtwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGtwLCAmY2xvY2tfbGlzdCwgbm9kZSkKKwkJaWYgKGNsa3AtPmZsYWdzICYgQ0xLX0VOQUJMRV9PTl9JTklUKQorCQkJY2xrX2VuYWJsZShjbGtwKTsKK30KKwogdW5zaWduZWQgbG9uZyBjbGtfZ2V0X3JhdGUoc3RydWN0IGNsayAqY2xrKQogewogCXJldHVybiBjbGstPnJhdGU7CkBAIC0yMTAsNTYgKzMxOCw1OSBAQAogaW50IGNsa19zZXRfcmF0ZV9leChzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSwgaW50IGFsZ29faWQpCiB7CiAJaW50IHJldCA9IC1FT1BOT1RTVVBQOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGxpa2VseShjbGstPm9wcyAmJiBjbGstPm9wcy0+c2V0X3JhdGUpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKIAkJcmV0ID0gY2xrLT5vcHMtPnNldF9yYXRlKGNsaywgcmF0ZSwgYWxnb19pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0gZWxzZSB7CisJCWNsay0+cmF0ZSA9IHJhdGU7CisJCXJldCA9IDA7CiAJfQogCi0JaWYgKHVubGlrZWx5KGNsay0+ZmxhZ3MgJiBDTEtfUkFURV9QUk9QQUdBVEVTKSkKLQkJcHJvcGFnYXRlX3JhdGUoY2xrKTsKKwlpZiAoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPnJlY2FsYykKKwkJY2xrLT5yYXRlID0gY2xrLT5vcHMtPnJlY2FsYyhjbGspOworCisJcHJvcGFnYXRlX3JhdGUoY2xrKTsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xrX3NldF9yYXRlX2V4KTsKIAotdm9pZCBjbGtfcmVjYWxjX3JhdGUoc3RydWN0IGNsayAqY2xrKQotewotCWlmIChsaWtlbHkoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPnJlY2FsYykpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOwotCQljbGstPm9wcy0+cmVjYWxjKGNsayk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlpZiAodW5saWtlbHkoY2xrLT5mbGFncyAmIENMS19SQVRFX1BST1BBR0FURVMpKQotCQlwcm9wYWdhdGVfcmF0ZShjbGspOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoY2xrX3JlY2FsY19yYXRlKTsKLQogaW50IGNsa19zZXRfcGFyZW50KHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IGNsayAqcGFyZW50KQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IC1FSU5WQUw7Ci0Jc3RydWN0IGNsayAqb2xkOwogCiAJaWYgKCFwYXJlbnQgfHwgIWNsaykKIAkJcmV0dXJuIHJldDsKKwlpZiAoY2xrLT5wYXJlbnQgPT0gcGFyZW50KQorCQlyZXR1cm4gMDsKIAotCW9sZCA9IGNsay0+cGFyZW50OwotCWlmIChsaWtlbHkoY2xrLT5vcHMgJiYgY2xrLT5vcHMtPnNldF9wYXJlbnQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja19sb2NrLCBmbGFncyk7Ci0JCXJldCA9IGNsay0+b3BzLT5zZXRfcGFyZW50KGNsaywgcGFyZW50KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tfbG9jaywgZmxhZ3MpOwotCQljbGstPnBhcmVudCA9IChyZXQgPyBvbGQgOiBwYXJlbnQpOwotCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tfbG9jaywgZmxhZ3MpOworCWlmIChjbGstPnVzZWNvdW50ID09IDApIHsKKwkJaWYgKGNsay0+b3BzLT5zZXRfcGFyZW50KQorCQkJcmV0ID0gY2xrLT5vcHMtPnNldF9wYXJlbnQoY2xrLCBwYXJlbnQpOworCQllbHNlCisJCQlyZXQgPSBjbGtfcmVwYXJlbnQoY2xrLCBwYXJlbnQpOwogCi0JaWYgKHVubGlrZWx5KGNsay0+ZmxhZ3MgJiBDTEtfUkFURV9QUk9QQUdBVEVTKSkKLQkJcHJvcGFnYXRlX3JhdGUoY2xrKTsKKwkJaWYgKHJldCA9PSAwKSB7CisJCQlwcl9kZWJ1ZygiY2xvY2s6IHNldCBwYXJlbnQgb2YgJXMgdG8gJXMgKG5ldyByYXRlICVsZClcbiIsCisJCQkJIGNsay0+bmFtZSwgY2xrLT5wYXJlbnQtPm5hbWUsIGNsay0+cmF0ZSk7CisJCQlpZiAoY2xrLT5vcHMtPnJlY2FsYykKKwkJCQljbGstPnJhdGUgPSBjbGstPm9wcy0+cmVjYWxjKGNsayk7CisJCQlwcm9wYWdhdGVfcmF0ZShjbGspOworCQl9CisJfSBlbHNlCisJCXJldCA9IC1FQlVTWTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja19sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY2xrX3NldF9wYXJlbnQpOwpAQCAtMjg3LDE0ICszOTgsNjkgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGNsa19yb3VuZF9yYXRlKTsKIAogLyoKKyAqIEZpbmQgdGhlIGNvcnJlY3Qgc3RydWN0IGNsayBmb3IgdGhlIGRldmljZSBhbmQgY29ubmVjdGlvbiBJRC4KKyAqIFdlIGRvIHNsaWdodGx5IGZ1enp5IG1hdGNoaW5nIGhlcmU6CisgKiAgQW4gZW50cnkgd2l0aCBhIE5VTEwgSUQgaXMgYXNzdW1lZCB0byBiZSBhIHdpbGRjYXJkLgorICogIElmIGFuIGVudHJ5IGhhcyBhIGRldmljZSBJRCwgaXQgbXVzdCBtYXRjaAorICogIElmIGFuIGVudHJ5IGhhcyBhIGNvbm5lY3Rpb24gSUQsIGl0IG11c3QgbWF0Y2gKKyAqIFRoZW4gd2UgdGFrZSB0aGUgbW9zdCBzcGVjaWZpYyBlbnRyeSAtIHdpdGggdGhlIGZvbGxvd2luZworICogb3JkZXIgb2YgcHJlY2lkZW5jZTogZGV2K2NvbiA+IGRldiBvbmx5ID4gY29uIG9ubHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtfZmluZChjb25zdCBjaGFyICpkZXZfaWQsIGNvbnN0IGNoYXIgKmNvbl9pZCkKK3sKKwlzdHJ1Y3QgY2xrX2xvb2t1cCAqcDsKKwlzdHJ1Y3QgY2xrICpjbGsgPSBOVUxMOworCWludCBtYXRjaCwgYmVzdCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjbG9ja19saXN0LCBub2RlKSB7CisJCW1hdGNoID0gMDsKKwkJaWYgKHAtPmRldl9pZCkgeworCQkJaWYgKCFkZXZfaWQgfHwgc3RyY21wKHAtPmRldl9pZCwgZGV2X2lkKSkKKwkJCQljb250aW51ZTsKKwkJCW1hdGNoICs9IDI7CisJCX0KKwkJaWYgKHAtPmNvbl9pZCkgeworCQkJaWYgKCFjb25faWQgfHwgc3RyY21wKHAtPmNvbl9pZCwgY29uX2lkKSkKKwkJCQljb250aW51ZTsKKwkJCW1hdGNoICs9IDE7CisJCX0KKwkJaWYgKG1hdGNoID09IDApCisJCQljb250aW51ZTsKKworCQlpZiAobWF0Y2ggPiBiZXN0KSB7CisJCQljbGsgPSBwLT5jbGs7CisJCQliZXN0ID0gbWF0Y2g7CisJCX0KKwl9CisJcmV0dXJuIGNsazsKK30KKworc3RydWN0IGNsayAqY2xrX2dldF9zeXMoY29uc3QgY2hhciAqZGV2X2lkLCBjb25zdCBjaGFyICpjb25faWQpCit7CisJc3RydWN0IGNsayAqY2xrOworCisJbXV0ZXhfbG9jaygmY2xvY2tfbGlzdF9zZW0pOworCWNsayA9IGNsa19maW5kKGRldl9pZCwgY29uX2lkKTsKKwltdXRleF91bmxvY2soJmNsb2NrX2xpc3Rfc2VtKTsKKworCXJldHVybiBjbGsgPyBjbGsgOiBFUlJfUFRSKC1FTk9FTlQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY2xrX2dldF9zeXMpOworCisvKgogICogUmV0dXJucyBhIGNsb2NrLiBOb3RlIHRoYXQgd2UgZmlyc3QgdHJ5IHRvIHVzZSBkZXZpY2UgaWQgb24gdGhlIGJ1cwogICogYW5kIGNsb2NrIG5hbWUuIElmIHRoaXMgZmFpbHMsIHdlIHRyeSB0byB1c2UgY2xvY2sgbmFtZSBvbmx5LgogICovCiBzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCiB7CisJY29uc3QgY2hhciAqZGV2X2lkID0gZGV2ID8gZGV2X25hbWUoZGV2KSA6IE5VTEw7CiAJc3RydWN0IGNsayAqcCwgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CiAJaW50IGlkbm87CiAKKwljbGsgPSBjbGtfZ2V0X3N5cyhkZXZfaWQsIGlkKTsKKwlpZiAoY2xrICYmICFJU19FUlIoY2xrKSkKKwkJcmV0dXJuIGNsazsKKwogCWlmIChkZXYgPT0gTlVMTCB8fCBkZXYtPmJ1cyAhPSAmcGxhdGZvcm1fYnVzX3R5cGUpCiAJCWlkbm8gPSAtMTsKIAllbHNlCkBAIC0zMzAsMzYgKzQ5Niw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbGtfcHV0KTsKIAotdm9pZCBfX2luaXQgX19hdHRyaWJ1dGVfXyAoKHdlYWspKQotYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCB0eXBlKQotewotfQotCi1pbnQgX19pbml0IF9fYXR0cmlidXRlX18gKCh3ZWFrKSkKLWFyY2hfY2xrX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaG93X2Nsb2NrcyhjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAotCQkgICAgICAgaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGNsayAqY2xrOwotCWNoYXIgKnAgPSBidWY7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoY2xrLCAmY2xvY2tfbGlzdCwgbm9kZSkgewotCQl1bnNpZ25lZCBsb25nIHJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKLQotCQlwICs9IHNwcmludGYocCwgIiUtMTJzXHQ6ICVsZC4lMDJsZE1Ielx0JXNcbiIsIGNsay0+bmFtZSwKLQkJCSAgICAgcmF0ZSAvIDEwMDAwMDAsIChyYXRlICUgMTAwMDAwMCkgLyAxMDAwMCwKLQkJCSAgICAgKChjbGstPmZsYWdzICYgQ0xLX0FMV0FZU19FTkFCTEVEKSB8fAotCQkJICAgICAgKGF0b21pY19yZWFkKCZjbGstPmtyZWYucmVmY291bnQpICE9IDEpKSA/Ci0JCQkgICAgICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwotCX0KLQotCXJldHVybiBwIC0gYnVmOwotfQotCiAjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGNsa3Nfc3lzZGV2X3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewpAQCAtMzY5LDIwICs1MDUsMjIgQEAKIAlzd2l0Y2ggKHN0YXRlLmV2ZW50KSB7CiAJY2FzZSBQTV9FVkVOVF9PTjoKIAkJLyogUmVzdW1laW5nIGZyb20gaGliZXJuYXRpb24gKi8KLQkJaWYgKHByZXZfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFKSB7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsa3AsICZjbG9ja19saXN0LCBub2RlKQotCQkJCWlmIChsaWtlbHkoY2xrcC0+b3BzKSkgewotCQkJCQl1bnNpZ25lZCBsb25nIHJhdGUgPSBjbGtwLT5yYXRlOworCQlpZiAocHJldl9zdGF0ZS5ldmVudCAhPSBQTV9FVkVOVF9GUkVFWkUpCisJCQlicmVhazsKIAotCQkJCQlpZiAobGlrZWx5KGNsa3AtPm9wcy0+c2V0X3BhcmVudCkpCi0JCQkJCQljbGtwLT5vcHMtPnNldF9wYXJlbnQoY2xrcCwKLQkJCQkJCQljbGtwLT5wYXJlbnQpOwotCQkJCQlpZiAobGlrZWx5KGNsa3AtPm9wcy0+c2V0X3JhdGUpKQotCQkJCQkJY2xrcC0+b3BzLT5zZXRfcmF0ZShjbGtwLAotCQkJCQkJCXJhdGUsIE5PX0NIQU5HRSk7Ci0JCQkJCWVsc2UgaWYgKGxpa2VseShjbGtwLT5vcHMtPnJlY2FsYykpCi0JCQkJCQljbGtwLT5vcHMtPnJlY2FsYyhjbGtwKTsKLQkJCQkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsa3AsICZjbG9ja19saXN0LCBub2RlKSB7CisJCQlpZiAobGlrZWx5KGNsa3AtPm9wcykpIHsKKwkJCQl1bnNpZ25lZCBsb25nIHJhdGUgPSBjbGtwLT5yYXRlOworCisJCQkJaWYgKGxpa2VseShjbGtwLT5vcHMtPnNldF9wYXJlbnQpKQorCQkJCQljbGtwLT5vcHMtPnNldF9wYXJlbnQoY2xrcCwKKwkJCQkJCWNsa3AtPnBhcmVudCk7CisJCQkJaWYgKGxpa2VseShjbGtwLT5vcHMtPnNldF9yYXRlKSkKKwkJCQkJY2xrcC0+b3BzLT5zZXRfcmF0ZShjbGtwLAorCQkJCQkJcmF0ZSwgTk9fQ0hBTkdFKTsKKwkJCQllbHNlIGlmIChsaWtlbHkoY2xrcC0+b3BzLT5yZWNhbGMpKQorCQkJCQljbGtwLT5yYXRlID0gY2xrcC0+b3BzLT5yZWNhbGMoY2xrcCk7CisJCQl9CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQTV9FVkVOVF9GUkVFWkU6CkBAIC00MjYsMzQgKzU2NCwxMTYgQEAKIAogaW50IF9faW5pdCBjbGtfaW5pdCh2b2lkKQogewotCWludCBpLCByZXQgPSAwOworCWludCByZXQ7CiAKLQlCVUdfT04oIW1hc3Rlcl9jbGsucmF0ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbmNoaXBfY2xvY2tzKTsgaSsrKSB7Ci0JCXN0cnVjdCBjbGsgKmNsayA9IG9uY2hpcF9jbG9ja3NbaV07Ci0KLQkJYXJjaF9pbml0X2Nsa19vcHMoJmNsay0+b3BzLCBpKTsKLQkJcmV0IHw9IGNsa19yZWdpc3RlcihjbGspOworCXJldCA9IGFyY2hfY2xrX2luaXQoKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlwcl9lcnIoIiVzOiBDUFUgY2xvY2sgcmVnaXN0cmF0aW9uIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgfD0gYXJjaF9jbGtfaW5pdCgpOworCWlmIChzaF9tdi5tdl9jbGtfaW5pdCkgeworCQlyZXQgPSBzaF9tdi5tdl9jbGtfaW5pdCgpOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJcHJfZXJyKCIlczogbWFjaHZlYyBjbG9jayBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CiAKIAkvKiBLaWNrIHRoZSBjaGlsZCBjbG9ja3MuLiAqLwotCXByb3BhZ2F0ZV9yYXRlKCZtYXN0ZXJfY2xrKTsKLQlwcm9wYWdhdGVfcmF0ZSgmYnVzX2Nsayk7CisJcmVjYWxjdWxhdGVfcm9vdF9jbG9ja3MoKTsKKworCS8qIEVuYWJsZSB0aGUgbmVjZXNzYXJ5IGluaXQgY2xvY2tzICovCisJY2xrX2VuYWJsZV9pbml0X2Nsb2NrcygpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgY2xrX3Byb2NfaW5pdCh2b2lkKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcDsKLQlwID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiY2xvY2tzIiwgU19JUlVTUiwgTlVMTCwKLQkJCQkgICBzaG93X2Nsb2NrcywgTlVMTCk7Ci0JaWYgKHVubGlrZWx5KCFwKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisvKgorICoJZGVidWdmcyBzdXBwb3J0IHRvIHRyYWNlIGNsb2NrIHRyZWUgaGllcmFyY2h5IGFuZCBhdHRyaWJ1dGVzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpjbGtfZGVidWdmc19yb290OwogCitzdGF0aWMgaW50IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyX29uZShzdHJ1Y3QgY2xrICpjKQoreworCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZCwgKmNoaWxkOworCXN0cnVjdCBjbGsgKnBhID0gYy0+cGFyZW50OworCWNoYXIgc1syNTVdOworCWNoYXIgKnAgPSBzOworCisJcCArPSBzcHJpbnRmKHAsICIlcyIsIGMtPm5hbWUpOworCWlmIChjLT5pZCA+PSAwKQorCQlzcHJpbnRmKHAsICI6JWQiLCBjLT5pZCk7CisJZCA9IGRlYnVnZnNfY3JlYXRlX2RpcihzLCBwYSA/IHBhLT5kZW50cnkgOiBjbGtfZGVidWdmc19yb290KTsKKwlpZiAoIWQpCisJCXJldHVybiAtRU5PTUVNOworCWMtPmRlbnRyeSA9IGQ7CisKKwlkID0gZGVidWdmc19jcmVhdGVfdTgoInVzZWNvdW50IiwgU19JUlVHTywgYy0+ZGVudHJ5LCAodTggKikmYy0+dXNlY291bnQpOworCWlmICghZCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoInJhdGUiLCBTX0lSVUdPLCBjLT5kZW50cnksICh1MzIgKikmYy0+cmF0ZSk7CisJaWYgKCFkKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZCA9IGRlYnVnZnNfY3JlYXRlX3gzMigiZmxhZ3MiLCBTX0lSVUdPLCBjLT5kZW50cnksICh1MzIgKikmYy0+ZmxhZ3MpOworCWlmICghZCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXJldHVybiAwOworCitlcnJfb3V0OgorCWQgPSBjLT5kZW50cnk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmQtPmRfc3ViZGlycywgZF91LmRfY2hpbGQpCisJCWRlYnVnZnNfcmVtb3ZlKGNoaWxkKTsKKwlkZWJ1Z2ZzX3JlbW92ZShjLT5kZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY2xrX2RlYnVnZnNfcmVnaXN0ZXIoc3RydWN0IGNsayAqYykKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBjbGsgKnBhID0gYy0+cGFyZW50OworCisJaWYgKHBhICYmICFwYS0+ZGVudHJ5KSB7CisJCWVyciA9IGNsa19kZWJ1Z2ZzX3JlZ2lzdGVyKHBhKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCFjLT5kZW50cnkpIHsKKwkJZXJyID0gY2xrX2RlYnVnZnNfcmVnaXN0ZXJfb25lKGMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CiAJcmV0dXJuIDA7CiB9Ci1zdWJzeXNfaW5pdGNhbGwoY2xrX3Byb2NfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNsa19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpjOworCXN0cnVjdCBkZW50cnkgKmQ7CisJaW50IGVycjsKKworCWQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImNsb2NrIiwgTlVMTCk7CisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT01FTTsKKwljbGtfZGVidWdmc19yb290ID0gZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNsb2NrX2xpc3QsIG5vZGUpIHsKKwkJZXJyID0gY2xrX2RlYnVnZnNfcmVnaXN0ZXIoYyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCXJldHVybiAwOworZXJyX291dDoKKwlkZWJ1Z2ZzX3JlbW92ZShjbGtfZGVidWdmc19yb290KTsgLyogUkVWSVNJVDogQ2xlYW51cCBjb3JyZWN0bHkgKi8KKwlyZXR1cm4gZXJyOworfQorbGF0ZV9pbml0Y2FsbChjbGtfZGVidWdmc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCmluZGV4IGQyOWU2OWMuLmFkODU0MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYwpAQCAtNjIsNiArNjIsMTEgQEAKICNkZWZpbmUgc3BlY3VsYXRpdmVfZXhlY3V0aW9uX2luaXQoKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAorLyogMm5kLWxldmVsIGNhY2hlIGluaXQgKi8KK3ZvaWQgX191c2VzX2p1bXBfdG9fdW5jYWNoZWQgX19hdHRyaWJ1dGVfXyAoKHdlYWspKSBsMl9jYWNoZV9pbml0KHZvaWQpCit7Cit9CisKIC8qCiAgKiBHZW5lcmljIGZpcnN0LWxldmVsIGNhY2hlIGluaXQKICAqLwpAQCAtMTQ2LDYgKzE1MSw4IEBACiAJZmxhZ3MgJj0gfkNDUl9DQUNIRV9FTkFCTEU7CiAjZW5kaWYKIAorCWwyX2NhY2hlX2luaXQoKTsKKwogCWN0cmxfb3V0bChmbGFncywgQ0NSKTsKIAliYWNrX3RvX2NhY2hlZCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbWFzay5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbWFzay5jCmluZGV4IDMwMWI1MDUuLjZiNWQxOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW1hc2suYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ltYXNrLmMKQEAgLTE4LDM4ICsxOCwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAvKiBCaXRtYXAgb2YgSVJRIG1hc2tlZCAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW1hc2tfbWFzayA9IDB4N2ZmZjsKLXN0YXRpYyBpbnQgaW50ZXJydXB0X3ByaW9yaXR5ID0gMDsKLQotc3RhdGljIHZvaWQgZW5hYmxlX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGRpc2FibGVfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgc2h1dGRvd25faW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2ltYXNrKHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBlbmRfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCiAjZGVmaW5lIElNQVNLX1BSSU9SSVRZCTE1CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQkvKiBOb3RoaW5nIHRvIGRvICovCi0JcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KK3N0YXRpYyBERUNMQVJFX0JJVE1BUChpbWFza19tYXNrLCBJTUFTS19QUklPUklUWSk7CitzdGF0aWMgaW50IGludGVycnVwdF9wcmlvcml0eTsKIAotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpbWFza19pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUgPSAiU1IuSU1BU0siLAotCS5zdGFydHVwID0gc3RhcnR1cF9pbWFza19pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25faW1hc2tfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfaW1hc2tfaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9pbWFza19pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19pbWFzaywKLQkuZW5kID0gZW5kX2ltYXNrX2lycQotfTsKLQotdm9pZCBzdGF0aWMgaW5saW5lIHNldF9pbnRlcnJ1cHRfcmVnaXN0ZXJzKGludCBpcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaW50ZXJydXB0X3JlZ2lzdGVycyhpbnQgaXApCiB7CiAJdW5zaWduZWQgbG9uZyBfX2R1bW15OwogCkBAIC03Miw0MiArNTEsMzEgQEAKIAkJICAgICA6ICJ0Iik7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc2FibGVfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYXNrX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWNsZWFyX2JpdChpcnEsICZpbWFza19tYXNrKTsKKwljbGVhcl9iaXQoaXJxLCBpbWFza19tYXNrKTsKIAlpZiAoaW50ZXJydXB0X3ByaW9yaXR5IDwgSU1BU0tfUFJJT1JJVFkgLSBpcnEpCiAJCWludGVycnVwdF9wcmlvcml0eSA9IElNQVNLX1BSSU9SSVRZIC0gaXJxOwotCiAJc2V0X2ludGVycnVwdF9yZWdpc3RlcnMoaW50ZXJydXB0X3ByaW9yaXR5KTsKIH0KIAotc3RhdGljIHZvaWQgZW5hYmxlX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdW5tYXNrX2ltYXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXNldF9iaXQoaXJxLCAmaW1hc2tfbWFzayk7Ci0JaW50ZXJydXB0X3ByaW9yaXR5ID0gSU1BU0tfUFJJT1JJVFkgLSBmZnooaW1hc2tfbWFzayk7Ci0KKwlzZXRfYml0KGlycSwgaW1hc2tfbWFzayk7CisJaW50ZXJydXB0X3ByaW9yaXR5ID0gSU1BU0tfUFJJT1JJVFkgLQorCQlmaW5kX2ZpcnN0X3plcm9fYml0KGltYXNrX21hc2ssIElNQVNLX1BSSU9SSVRZKTsKIAlzZXRfaW50ZXJydXB0X3JlZ2lzdGVycyhpbnRlcnJ1cHRfcHJpb3JpdHkpOwogfQogCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaW1hc2sodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlX2ltYXNrX2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfaW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCi0JCWVuYWJsZV9pbWFza19pcnEoaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgc2h1dGRvd25faW1hc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JLyogTm90aGluZyB0byBkbyAqLwotfQorc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpbWFza19pcnFfY2hpcCA9IHsKKwkudHlwZW5hbWUJPSAiU1IuSU1BU0siLAorCS5tYXNrCQk9IG1hc2tfaW1hc2tfaXJxLAorCS51bm1hc2sJCT0gdW5tYXNrX2ltYXNrX2lycSwKKwkubWFza19hY2sJPSBtYXNrX2ltYXNrX2lycSwKK307CiAKIHZvaWQgbWFrZV9pbWFza19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQlpcnFfZGVzY1tpcnFdLmNoaXAgPSAmaW1hc2tfaXJxX3R5cGU7Ci0JZW5hYmxlX2lycShpcnEpOworCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmltYXNrX2lycV9jaGlwLAorCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjLXNoNS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjLXNoNS5jCmluZGV4IDcyNmYwMzMuLjZjMDkyZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50Yy1zaDUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMtc2g1LmMKQEAgLTg0LDcgKzg0LDcgQEAKIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19pbnRjKHVuc2lnbmVkIGludCk7CiBzdGF0aWMgdm9pZCBlbmRfaW50Y19pcnEodW5zaWduZWQgaW50IGlycSk7CiAKLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgaW50Y19pcnFfdHlwZSA9IHsKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgaW50Y19pcnFfdHlwZSA9IHsKIAkudHlwZW5hbWUgPSAiSU5UQyIsCiAJLnN0YXJ0dXAgPSBzdGFydHVwX2ludGNfaXJxLAogCS5zaHV0ZG93biA9IHNodXRkb3duX2ludGNfaXJxLApAQCAtMTUyLDQzICsxNTIsMTMgQEAKIAllbmFibGVfaW50Y19pcnEoaXJxKTsKIH0KIAotLyogRm9yIGZ1dHVyZSB1c2UsIGlmIHdlIGV2ZXIgc3VwcG9ydCBJUkxNPTApICovCi12b2lkIG1ha2VfaW50Y19pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQlpcnFfZGVzY1tpcnFdLmNoaXAgPSAmaW50Y19pcnFfdHlwZTsKLQlkaXNhYmxlX2ludGNfaXJxKGlycSk7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19TWVNDVEwpCi1zdGF0aWMgaW50IElSUV90b192ZWN0b3JOW05SX0lOVENfSVJRU10gPSB7Ci0JMHgxMiwgMHgxNSwgMHgxOCwgMHgxQiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgLyogIDAtIDcgKi8KLQkgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAweDUwLCAweDUxLCAweDUyLCAweDUzLAkvKiAgOC0xNSAqLwotCTB4NTQsIDB4NTUsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsICAgLTEsIC8qIDE2LTIzICovCi0JICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgLyogMjQtMzEgKi8KLQkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDM4LAkvKiAzMi0zOSAqLwotICAgICAgICAweDM5LCAweDNBLCAweDNCLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAvKiA0MC00NyAqLwotCSAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsICAgLTEsIC8qIDQ4LTU1ICovCi0JICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgMHgyQiwgLyogNTYtNjMgKi8KLQotfTsKLQotaW50IGludGNfaXJxX2Rlc2NyaWJlKGNoYXIqIHAsIGludCBpcnEpCi17Ci0JaWYgKGlycSA8IE5SX0lOVENfSVJRUykKLQkJcmV0dXJuIHNwcmludGYocCwgIigweCUzeCkiLCBJUlFfdG9fdmVjdG9yTltpcnFdKjB4MjApOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogdm9pZCBfX2luaXQgcGxhdF9pcnFfc2V0dXAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgX19kdW1teTAsIF9fZHVtbXkxPX4weDAwMDAwMDAwMTAwMDAwZjA7CiAJdW5zaWduZWQgbG9uZyByZWc7CiAJaW50IGk7CiAKLQlpbnRjX3ZpcnQgPSBvbmNoaXBfcmVtYXAoSU5UQ19CQVNFLCAxMDI0LCAiSU5UQyIpOworCWludGNfdmlydCA9ICh1bnNpZ25lZCBsb25nKWlvcmVtYXBfbm9jYWNoZShJTlRDX0JBU0UsIDEwMjQpOwogCWlmICghaW50Y192aXJ0KSB7CiAJCXBhbmljKCJVbmFibGUgdG8gcmVtYXAgSU5UQ1xuIik7CiAJfQpAQCAtMTk2LDcgKzE2Niw3IEBACiAKIAkvKiBTZXQgZGVmYXVsdDogcGVyLWxpbmUgZW5hYmxlL2Rpc2FibGUsIHByaW9yaXR5IGRyaXZlbiBhY2svZW9pICovCiAJZm9yIChpID0gMDsgaSA8IE5SX0lOVENfSVJRUzsgaSsrKQotCQlpcnFfZGVzY1tpXS5jaGlwID0gJmludGNfaXJxX3R5cGU7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcihpLCAmaW50Y19pcnFfdHlwZSwgaGFuZGxlX2xldmVsX2lycSk7CiAKIAogCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIHNldCBhbGwgcHJpb3JpdGllcyB0byAwIHRvIGF2b2lkIHRyb3VibGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCmluZGV4IDNlYjE3ZWUuLjgwOGQ5OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaXByX2Rlc2MgKmdldF9pcHJfZGVzYyh1bnNpZ25lZCBpbnQgaXJxKQogewpAQCAtNTksMTAgKzYwLDE4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgZGVzYy0+bnJfaXJxczsgaSsrKSB7CiAJCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGRlc2MtPmlwcl9kYXRhICsgaTsKKwkJc3RydWN0IGlycV9kZXNjICppcnFfZGVzYzsKIAogCQlCVUdfT04ocC0+aXByX2lkeCA+PSBkZXNjLT5ucl9vZmZzZXRzKTsKIAkJQlVHX09OKCFkZXNjLT5pcHJfb2Zmc2V0c1twLT5pcHJfaWR4XSk7CiAKKwkJaXJxX2Rlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKHAtPmlycSwgbnVtYV9ub2RlX2lkKCkpOworCQlpZiAodW5saWtlbHkoIWlycV9kZXNjKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY2FuIG5vdCBnZXQgaXJxX2Rlc2MgZm9yICVkXG4iLAorCQkJICAgICAgIHAtPmlycSk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCWRpc2FibGVfaXJxX25vc3luYyhwLT5pcnEpOwogCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShwLT5pcnEsICZkZXNjLT5jaGlwLAogCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9jbG9jay1zaDc2MTkuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvY2xvY2stc2g3NjE5LmMKaW5kZXggZDJjMTU3OS4uNGZlODYzMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9jbG9jay1zaDc2MTkuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL2Nsb2NrLXNoNzYxOS5jCkBAIC0zOCwzMiArMzgsMjcgQEAKIAkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCiB9OwogCi1zdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGlkeCA9IChjdHJsX2ludyhGUkVRQ1IpICYgMHgwMDA3KTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NjE5X21vZHVsZV9jbGtfb3BzID0gewogCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCiB9OwogCi1zdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwbGwxcmF0ZVsoY3RybF9pbncoRlJFUUNSKSA+PiA4KSAmIDddOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIHBsbDFyYXRlWyhjdHJsX2ludyhGUkVRQ1IpID4+IDgpICYgN107CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc2MTlfYnVzX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZTsKLX0KLQogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzYxOV9jcHVfY2xrX29wcyA9IHsKLQkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorCS5yZWNhbGMJCT0gZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyAqc2g3NjE5X2Nsa19vcHNbXSA9IHsKQEAgLTc4LDQgKzczLDMgQEAKIAlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDc2MTlfY2xrX29wcykpCiAJCSpvcHMgPSBzaDc2MTlfY2xrX29wc1tpZHhdOwogfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYwppbmRleCAwZTMyZDhlLi4xMzc5ODczIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogZW51bSB7CiAJVU5VU0VEID0gMCwKQEAgLTEwOSw5ICsxMTEsNzUgQEAKIAkucmVzb3VyY2UgPSBldGhfcmVzb3VyY2VzLAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgY210MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIkNNVDAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDIsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMTI1LAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAwLCAvKiBkaXNhYmxlZCBkdWUgdG8gY29kZSBnZW5lcmF0aW9uIGlzc3VlcyAqLworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXQwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UMCIsCisJCS5zdGFydAk9IDB4Zjg0YTAwNzIsCisJCS5lbmQJPSAweGY4NGEwMDc3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gODYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjbXQwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfY210IiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZjbXQwX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBjbXQwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY210MF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgY210MV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIkNNVDEiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDgsCisJLnRpbWVyX2JpdCA9IDEsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMTI1LAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAwLCAvKiBkaXNhYmxlZCBkdWUgdG8gY29kZSBnZW5lcmF0aW9uIGlzc3VlcyAqLworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXQxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UMSIsCisJCS5zdGFydAk9IDB4Zjg0YTAwNzgsCisJCS5lbmQJPSAweGY4NGEwMDdkLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gODcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjbXQxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfY210IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZjbXQxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBjbXQxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY210MV9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzYxOV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmc2NpX2RldmljZSwKIAkmZXRoX2RldmljZSwKKwkmY210MF9kZXZpY2UsCisJJmNtdDFfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2g3NjE5X2RldmljZXNfc2V0dXAodm9pZCkKQEAgLTEyNSwzICsxOTMsMTkgQEAKIHsKIAlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNfZGVzYyk7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc2MTlfZWFybHlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmNtdDBfZGV2aWNlLAorCSZjbXQxX2RldmljZSwKK307CisKKyNkZWZpbmUgU1RCQ1IzIDB4ZjgwYTAwMDAKKwordm9pZCBfX2luaXQgcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAodm9pZCkKK3sKKwkvKiBlbmFibGUgQ01UIGNsb2NrICovCisJX19yYXdfd3JpdGViKF9fcmF3X3JlYWRiKFNUQkNSMykgJiB+MHgxMCwgU1RCQ1IzKTsKKworCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzYxOV9lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2g3NjE5X2Vhcmx5X2RldmljZXMpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL2Nsb2NrLXNoNzIwMS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvY2xvY2stc2g3MjAxLmMKaW5kZXggNGE1ZTU5Ny4uNzgxNGM3NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvY2xvY2stc2g3MjAxLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvY2xvY2stc2g3MjAxLmMKQEAgLTM0LDM3ICszNCwzNyBAQAogCiBzdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX2luaXQoc3RydWN0IGNsayAqY2xrKQogewotCWNsay0+cmF0ZSA9IDEwMDAwMDAwICogUExMMiAqIHBsbDFyYXRlWyhjdHJsX2ludyhGUkVRQ1IpID4+IDgpICYgMHgwMDA3XTsKKwlyZXR1cm4gMTAwMDAwMDAgKiBQTEwyICogcGxsMXJhdGVbKGN0cmxfaW53KEZSRVFDUikgPj4gOCkgJiAweDAwMDddOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MjAxX21hc3Rlcl9jbGtfb3BzID0gewogCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KEZSRVFDUikgJiAweDAwMDcpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDcyMDFfbW9kdWxlX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KEZSRVFDUikgJiAweDAwMDcpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDcyMDFfYnVzX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKChjdHJsX2ludyhGUkVRQ1IpID4+IDQpICYgMHgwMDA3KTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3MjAxX2NwdV9jbGtfb3BzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvY2xvY2stc2g3MjAzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9jbG9jay1zaDcyMDMuYwppbmRleCBmYjc4MTMyLi45NDA5ODY5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9jbG9jay1zaDcyMDMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9jbG9jay1zaDcyMDMuYwpAQCAtNDYsMzMgKzQ2LDI4IEBACiAJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAogfTsKIAotc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbncoRlJFUUNSKSAmIDB4MDAwNyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzIwM19tb2R1bGVfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbncoRlJFUUNSKSAmIDB4MDAwNyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4LTJdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHgtMl07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDcyMDNfYnVzX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZTsKLX0KLQogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzIwM19jcHVfY2xrX29wcyA9IHsKLQkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorCS5yZWNhbGMJCT0gZm9sbG93cGFyZW50X3JlY2FsYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyAqc2g3MjAzX2Nsa19vcHNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL2Nsb2NrLXNoNzIwNi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvY2xvY2stc2g3MjA2LmMKaW5kZXggODJkN2Y5OS4uYzIyNjhiZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvY2xvY2stc2g3MjA2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvY2xvY2stc2g3MjA2LmMKQEAgLTQxLDI5ICs0MSwyOSBAQAogCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KEZSRVFDUikgJiAweDAwMDcpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gcGZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDcyMDZfbW9kdWxlX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBsbDFyYXRlWyhjdHJsX2ludyhGUkVRQ1IpID4+IDgpICYgMHgwMDA3XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwbGwxcmF0ZVsoY3RybF9pbncoRlJFUUNSKSA+PiA4KSAmIDB4MDAwN107CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDcyMDZfYnVzX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KEZSRVFDUikgJiAweDAwMDcpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDcyMDZfY3B1X2Nsa19vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1teGcuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLW14Zy5jCmluZGV4IDg0NDI5MzcuLjg2OWMyZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLW14Zy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLW14Zy5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogCiBlbnVtIHsKIAlVTlVTRUQgPSAwLApAQCAtMjQsNyArMjUsNyBAQAogCiAJU0NJRjAsIFNDSUYxLAogCi0JTVRVMl9HUk9VUDEsIE1UVTJfR1JPVVAyLCBNVFUyX0dST1VQMywgTVRVMl9HUk9VUDQsIE1UVTJfR1JPVVA1CisJTVRVMl9HUk9VUDEsIE1UVTJfR1JPVVAyLCBNVFUyX0dST1VQMywgTVRVMl9HUk9VUDQsIE1UVTJfR1JPVVA1LAogCU1UVTJfVEdJM0IsIE1UVTJfVEdJM0MsCiAKIAkvKiBpbnRlcnJ1cHQgZ3JvdXBzICovCkBAIC0xMTMsNiArMTE0LDk5IEBACiBzdGF0aWMgREVDTEFSRV9JTlRDX0RFU0MoaW50Y19kZXNjLCAibXhnIiwgdmVjdG9ycywgZ3JvdXBzLAogCQkJIG1hc2tfcmVnaXN0ZXJzLCBwcmlvX3JlZ2lzdGVycywgTlVMTCk7CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIG10dTJfMF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIk1UVTJfMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gLTB4ODAsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdHUyXzBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJNVFUyXzAiLAorCQkuc3RhcnQJPSAweGZmODAxMzAwLAorCQkuZW5kCT0gMHhmZjgwMTMyNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDIyOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG10dTJfMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX210dTIiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm10dTJfMF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gbXR1Ml8wX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobXR1Ml8wX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyBtdHUyXzFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJNVFUyXzEiLAorCS5jaGFubmVsX29mZnNldCA9IC0weDEwMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG10dTJfMV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIk1UVTJfMSIsCisJCS5zdGFydAk9IDB4ZmY4MDEzODAsCisJCS5lbmQJPSAweGZmODAxMzkwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMjM0LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXR1Ml8xX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfbXR1MiIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXR1Ml8xX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBtdHUyXzFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdHUyXzFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIG10dTJfMl9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIk1UVTJfMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHg4MCwKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG10dTJfMl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIk1UVTJfMiIsCisJCS5zdGFydAk9IDB4ZmY4MDEwMDAsCisJCS5lbmQJPSAweGZmODAxMDBhLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMjQwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXR1Ml8yX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfbXR1MiIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXR1Ml8yX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBtdHUyXzJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdHUyXzJfcmVzb3VyY2VzKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKIAkJLm1hcGJhc2UJPSAweGZmODA0MDAwLApAQCAtMTM0LDYgKzIyOCw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpteGdfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaV9kZXZpY2UsCisJJm10dTJfMF9kZXZpY2UsCisJJm10dTJfMV9kZXZpY2UsCisJJm10dTJfMl9kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBteGdfZGV2aWNlc19zZXR1cCh2b2lkKQpAQCAtMTQ3LDMgKzI0NCwxNSBAQAogewogCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y19kZXNjKTsKIH0KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm14Z19lYXJseV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbXR1Ml8wX2RldmljZSwKKwkmbXR1Ml8xX2RldmljZSwKKwkmbXR1Ml8yX2RldmljZSwKK307CisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMobXhnX2Vhcmx5X2RldmljZXMsCisJCQkJICAgQVJSQVlfU0laRShteGdfZWFybHlfZGV2aWNlcykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAxLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDEuYwppbmRleCAwMGY0MmY5Li5kOGZlYmUxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDEuYwpAQCAtMTIsNiArMTIsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiBlbnVtIHsKIAlVTlVTRUQgPSAwLApAQCAtMjQ5LDkgKzI1MSwxMDUgQEAKIAkucmVzb3VyY2UJPSBydGNfcmVzb3VyY2VzLAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgbXR1Ml8wX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiTVRVMl8wIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAtMHg4MCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG10dTJfMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIk1UVTJfMCIsCisJCS5zdGFydAk9IDB4ZmZmZTQzMDAsCisJCS5lbmQJPSAweGZmZmU0MzI2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTA4LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXR1Ml8wX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfbXR1MiIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXR1Ml8wX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBtdHUyXzBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdHUyXzBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIG10dTJfMV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIk1UVTJfMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gLTB4MTAwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXR1Ml8xX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiTVRVMl8xIiwKKwkJLnN0YXJ0CT0gMHhmZmZlNDM4MCwKKwkJLmVuZAk9IDB4ZmZmZTQzOTAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxMTYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtdHUyXzFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9tdHUyIiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZtdHUyXzFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IG10dTJfMV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG10dTJfMV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgbXR1Ml8yX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiTVRVMl8yIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDgwLAorCS50aW1lcl9iaXQgPSAyLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXR1Ml8yX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiTVRVMl8yIiwKKwkJLnN0YXJ0CT0gMHhmZmZlNDAwMCwKKwkJLmVuZAk9IDB4ZmZmZTQwMGEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxMjQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtdHUyXzJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9tdHUyIiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZtdHUyXzJfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IG10dTJfMl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG10dTJfMl9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzIwMV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmc2NpX2RldmljZSwKIAkmcnRjX2RldmljZSwKKwkmbXR1Ml8wX2RldmljZSwKKwkmbXR1Ml8xX2RldmljZSwKKwkmbXR1Ml8yX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNoNzIwMV9kZXZpY2VzX3NldHVwKHZvaWQpCkBAIC0yNjUsMyArMzYzLDIwIEBACiB7CiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX2Rlc2MpOwogfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3MjAxX2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZtdHUyXzBfZGV2aWNlLAorCSZtdHUyXzFfZGV2aWNlLAorCSZtdHUyXzJfZGV2aWNlLAorfTsKKworI2RlZmluZSBTVEJDUjMgMHhmZmZlMDQwOAorCit2b2lkIF9faW5pdCBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQoreworCS8qIGVuYWJsZSBNVFUyIGNsb2NrICovCisJX19yYXdfd3JpdGViKF9fcmF3X3JlYWRiKFNUQkNSMykgJiB+MHgyMCwgU1RCQ1IzKTsKKworCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzIwMV9lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2g3MjAxX2Vhcmx5X2RldmljZXMpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwMy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKaW5kZXggODIwZGZiMi4uNjJlMzAzOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjAzLmMKQEAgLTExLDYgKzExLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogZW51bSB7CiAJVU5VU0VEID0gMCwKQEAgLTIwNSw2ICsyMDcsMTMyIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIGNtdDBfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJDTVQwIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDAyLAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDEyNSwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMCwgLyogZGlzYWJsZWQgZHVlIHRvIGNvZGUgZ2VuZXJhdGlvbiBpc3N1ZXMgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY210MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIkNNVDAiLAorCQkuc3RhcnQJPSAweGZmZmVjMDAyLAorCQkuZW5kCT0gMHhmZmZlYzAwNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE0MiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNtdDBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9jbXQiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmNtdDBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IGNtdDBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjbXQwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyBjbXQxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiQ01UMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwOCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAxMjUsCisJLmNsb2Nrc291cmNlX3JhdGluZyA9IDAsIC8qIGRpc2FibGVkIGR1ZSB0byBjb2RlIGdlbmVyYXRpb24gaXNzdWVzICovCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNtdDFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJDTVQxIiwKKwkJLnN0YXJ0CT0gMHhmZmZlYzAwOCwKKwkJLmVuZAk9IDB4ZmZmZWMwMGQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjbXQxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfY210IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZjbXQxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBjbXQxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY210MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgbXR1Ml8wX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiTVRVMl8wIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAtMHg4MCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG10dTJfMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIk1UVTJfMCIsCisJCS5zdGFydAk9IDB4ZmZmZTQzMDAsCisJCS5lbmQJPSAweGZmZmU0MzI2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTQ2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXR1Ml8wX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfbXR1MiIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXR1Ml8wX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBtdHUyXzBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdHUyXzBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIG10dTJfMV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIk1UVTJfMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gLTB4MTAwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbXR1Ml8xX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiTVRVMl8xIiwKKwkJLnN0YXJ0CT0gMHhmZmZlNDM4MCwKKwkJLmVuZAk9IDB4ZmZmZTQzOTAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBtdHUyXzFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9tdHUyIiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZtdHUyXzFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IG10dTJfMV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG10dTJfMV9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBydGNfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewogCQkuc3RhcnQJPSAweGZmZmYyMDAwLApAQCAtMjI3LDYgKzM1NSwxMCBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3MjAzX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzY2lfZGV2aWNlLAorCSZjbXQwX2RldmljZSwKKwkmY210MV9kZXZpY2UsCisJJm10dTJfMF9kZXZpY2UsCisJJm10dTJfMV9kZXZpY2UsCiAJJnJ0Y19kZXZpY2UsCiB9OwogCkBAIC0yNDEsMyArMzczLDI1IEBACiB7CiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX2Rlc2MpOwogfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3MjAzX2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZjbXQwX2RldmljZSwKKwkmY210MV9kZXZpY2UsCisJJm10dTJfMF9kZXZpY2UsCisJJm10dTJfMV9kZXZpY2UsCit9OworCisjZGVmaW5lIFNUQkNSMyAweGZmZmUwNDA4CisjZGVmaW5lIFNUQkNSNCAweGZmZmUwNDBjCisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJLyogZW5hYmxlIENNVCBjbG9jayAqLworCV9fcmF3X3dyaXRlYihfX3Jhd19yZWFkYihTVEJDUjQpICYgfjB4MDQsIFNUQkNSNCk7CisKKwkvKiBlbmFibGUgTVRVMiBjbG9jayAqLworCV9fcmF3X3dyaXRlYihfX3Jhd19yZWFkYihTVEJDUjMpICYgfjB4MjAsIFNUQkNSMyk7CisKKwllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDcyMDNfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzIwM19lYXJseV9kZXZpY2VzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9zZXR1cC1zaDcyMDYuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwNi5jCmluZGV4IGM0NmE4MzUuLjNlNmYzZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwNi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwNi5jCkBAIC0xMiw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIGVudW0gewogCVVOVVNFRCA9IDAsCkBAIC0xNjUsOCArMTY3LDE3MCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyBjbXQwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiQ01UMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwMiwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAxMjUsCisJLmNsb2Nrc291cmNlX3JhdGluZyA9IDAsIC8qIGRpc2FibGVkIGR1ZSB0byBjb2RlIGdlbmVyYXRpb24gaXNzdWVzICovCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNtdDBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJDTVQwIiwKKwkJLnN0YXJ0CT0gMHhmZmZlYzAwMiwKKwkJLmVuZAk9IDB4ZmZmZWMwMDcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNDAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjbXQwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfY210IiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZjbXQwX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBjbXQwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY210MF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgY210MV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIkNNVDEiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDgsCisJLnRpbWVyX2JpdCA9IDEsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMTI1LAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAwLCAvKiBkaXNhYmxlZCBkdWUgdG8gY29kZSBnZW5lcmF0aW9uIGlzc3VlcyAqLworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXQxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UMSIsCisJCS5zdGFydAk9IDB4ZmZmZWMwMDgsCisJCS5lbmQJPSAweGZmZmVjMDBkLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTQ0LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY210MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2NtdCIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY210MV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gY210MV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdDFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIG10dTJfMF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIk1UVTJfMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gLTB4ODAsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtdHUyXzBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJNVFUyXzAiLAorCQkuc3RhcnQJPSAweGZmZmU0MzAwLAorCQkuZW5kCT0gMHhmZmZlNDMyNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE1NiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG10dTJfMF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX210dTIiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJm10dTJfMF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gbXR1Ml8wX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUobXR1Ml8wX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyBtdHUyXzFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJNVFUyXzEiLAorCS5jaGFubmVsX29mZnNldCA9IC0weDEwMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG10dTJfMV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIk1UVTJfMSIsCisJCS5zdGFydAk9IDB4ZmZmZTQzODAsCisJCS5lbmQJPSAweGZmZmU0MzkwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTY0LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXR1Ml8xX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfbXR1MiIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXR1Ml8xX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBtdHUyXzFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdHUyXzFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIG10dTJfMl9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIk1UVTJfMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHg4MCwKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG10dTJfMl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIk1UVTJfMiIsCisJCS5zdGFydAk9IDB4ZmZmZTQwMDAsCisJCS5lbmQJPSAweGZmZmU0MDBhLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTgwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbXR1Ml8yX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfbXR1MiIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXR1Ml8yX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBtdHUyXzJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShtdHUyXzJfcmVzb3VyY2VzKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDcyMDZfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaV9kZXZpY2UsCisJJmNtdDBfZGV2aWNlLAorCSZjbXQxX2RldmljZSwKKwkmbXR1Ml8wX2RldmljZSwKKwkmbXR1Ml8xX2RldmljZSwKKwkmbXR1Ml8yX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNoNzIwNl9kZXZpY2VzX3NldHVwKHZvaWQpCkBAIC0xODAsMyArMzQ0LDI2IEBACiB7CiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX2Rlc2MpOwogfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3MjA2X2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZjbXQwX2RldmljZSwKKwkmY210MV9kZXZpY2UsCisJJm10dTJfMF9kZXZpY2UsCisJJm10dTJfMV9kZXZpY2UsCisJJm10dTJfMl9kZXZpY2UsCit9OworCisjZGVmaW5lIFNUQkNSMyAweGZmZmUwNDA4CisjZGVmaW5lIFNUQkNSNCAweGZmZmUwNDBjCisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJLyogZW5hYmxlIENNVCBjbG9jayAqLworCV9fcmF3X3dyaXRlYihfX3Jhd19yZWFkYihTVEJDUjQpICYgfjB4MDQsIFNUQkNSNCk7CisKKwkvKiBlbmFibGUgTVRVMiBjbG9jayAqLworCV9fcmF3X3dyaXRlYihfX3Jhd19yZWFkYihTVEJDUjMpICYgfjB4MjAsIFNUQkNSMyk7CisKKwllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDcyMDZfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzIwNl9lYXJseV9kZXZpY2VzKSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoMy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDMuYwppbmRleCBjM2M5NDU5Li4yN2I4NzM4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoMy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2gzLmMKQEAgLTM4LDM2ICszOCwzNiBAQAogCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CiAJaW50IGlkeCA9ICgoZnJxY3IgJiAweDIwMDApID4+IDExKSB8IChmcnFjciAmIDB4MDAwMyk7CiAKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2gzX21vZHVsZV9jbGtfb3BzID0gewogCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCiB9OwogCi1zdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOwogCWludCBpZHggPSAoKGZycWNyICYgMHg4MDAwKSA+PiAxMykgfCAoKGZycWNyICYgMHgwMDMwKSA+PiA0KTsKIAotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gc3RjX211bHRpcGxpZXJzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gc3RjX211bHRpcGxpZXJzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDNfYnVzX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CiAJaW50IGlkeCA9ICgoZnJxY3IgJiAweDQwMDApID4+IDEyKSB8ICgoZnJxY3IgJiAweDAwMGMpID4+IDIpOwogCi0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoM19jcHVfY2xrX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwNS5jCmluZGV4IGRmZGJmMzIuLjBjYThmMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDUuYwpAQCAtMzksMzAgKzM5LDMwIEBACiAJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAogfTsKIAotc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSBjdHJsX2ludyhGUlFDUikgJiAweDAwMDM7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcwNV9tb2R1bGVfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbncoRlJRQ1IpICYgMHgwMzAwKSA+PiA4OwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gc3RjX211bHRpcGxpZXJzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gc3RjX211bHRpcGxpZXJzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MDVfYnVzX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KEZSUUNSKSAmIDB4MDAzMCkgPj4gNDsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzA1X2NwdV9jbGtfb3BzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDYuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA2LmMKaW5kZXggMGNmOTZmOS4uNGJmNzg4NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwNi5jCkBAIC0zNCwzNiArMzQsMzYgQEAKIAkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCiB9OwogCi1zdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOwogCWludCBpZHggPSAoKGZycWNyICYgMHgyMDAwKSA+PiAxMSkgfCAoZnJxY3IgJiAweDAwMDMpOwogCi0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcwNl9tb2R1bGVfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBmcnFjciA9IGN0cmxfaW53KEZSUUNSKTsKIAlpbnQgaWR4ID0gKChmcnFjciAmIDB4ODAwMCkgPj4gMTMpIHwgKChmcnFjciAmIDB4MDAzMCkgPj4gNCk7CiAKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHN0Y19tdWx0aXBsaWVyc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIHN0Y19tdWx0aXBsaWVyc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzA2X2J1c19jbGtfb3BzID0gewogCS5yZWNhbGMJCT0gYnVzX2Nsa19yZWNhbGMsCiB9OwogCi1zdGF0aWMgdm9pZCBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOwogCWludCBpZHggPSAoKGZycWNyICYgMHg0MDAwKSA+PiAxMikgfCAoKGZycWNyICYgMHgwMDBjKSA+PiAyKTsKIAotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MDZfY3B1X2Nsa19vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDkuYwppbmRleCBiNzkxYTI5Li5mYTMwYjYwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcwOS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA5LmMKQEAgLTQxLDEyICs0MSwxMiBAQAogCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CiAJaW50IGlkeCA9ICgoZnJxY3IgJiAweDIwMDApID4+IDExKSB8IChmcnFjciAmIDB4MDAwMyk7CiAKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzA5X21vZHVsZV9jbGtfb3BzID0gewpAQCAtNTYsMjUgKzU2LDI1IEBACiAJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CiAJaW50IGlkeCA9IChmcnFjciAmIDB4MDA4MCkgPwogCQkoKGZycWNyICYgMHg4MDAwKSA+PiAxMykgfCAoKGZycWNyICYgMHgwMDMwKSA+PiA0KSA6IDE7CiAKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAqIHN0Y19tdWx0aXBsaWVyc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAqIHN0Y19tdWx0aXBsaWVyc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzA5X2J1c19jbGtfb3BzID0gewogCS5yZWNhbGMJCT0gYnVzX2Nsa19yZWNhbGMsCiB9OwogCi1zdGF0aWMgdm9pZCBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOwogCWludCBpZHggPSAoKGZycWNyICYgMHg0MDAwKSA+PiAxMikgfCAoKGZycWNyICYgMHgwMDBjKSA+PiAyKTsKIAotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MDlfY3B1X2Nsa19vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcxMC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MTAuYwppbmRleCA0NzQ0YzUwLi4wMzBhNThiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2Nsb2NrLXNoNzcxMC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzEwLmMKQEAgLTMzLDMwICszMywzMCBAQAogCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KEZSUUNSKSAmIDB4MDAwNyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBtZF90YWJsZVtpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIG1kX3RhYmxlW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MTBfbW9kdWxlX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KEZSUUNSKSAmIDB4MDcwMCkgPj4gODsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIG1kX3RhYmxlW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gbWRfdGFibGVbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcxMF9idXNfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbncoRlJRQ1IpICYgMHgwMDcwKSA+PiA0OwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gbWRfdGFibGVbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBtZF90YWJsZVtpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzEwX2NwdV9jbGtfb3BzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MTIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzEyLmMKaW5kZXggNTRmNTRkZi4uNjQyOGVlNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzEyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MTIuYwpAQCAtMzMsMjQgKzMzLDI0IEBACiAJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAogfTsKIAotc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBmcnFjciA9IGN0cmxfaW53KEZSUUNSKTsKIAlpbnQgaWR4ID0gZnJxY3IgJiAweDAwMDc7CiAKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGRpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcxMl9tb2R1bGVfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBmcnFjciA9IGN0cmxfaW53KEZSUUNSKTsKIAlpbnQgaWR4ID0gKGZycWNyICYgMHgwMDMwKSA+PiA0OwogCi0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBkaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIGRpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MTJfY3B1X2Nsa19vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYwppbmRleCA2M2I2N2JhLi44OGY3NDJmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CiAKIGVudW0gewpAQCAtMTE2LDcgKzExNywxMDIgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDIsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMCIsCisJCS5zdGFydAk9IDB4ZmZmZmZlOTQsCisJCS5lbmQJPSAweGZmZmZmZTlmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUwX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTEiLAorCS5jaGFubmVsX29mZnNldCA9IDB4ZSwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMSIsCisJCS5zdGFydAk9IDB4ZmZmZmZlYTAsCisJCS5lbmQJPSAweGZmZmZmZWFiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11Ml9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTIiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWEsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUyIiwKKwkJLnN0YXJ0CT0gMHhmZmZmZmVhYywKKwkJLmVuZAk9IDB4ZmZmZmZlYmIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTJfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUyX3Jlc291cmNlcyksCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzA1X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAogCSZzY2lfZGV2aWNlLAogCSZydGNfZGV2aWNlLAogfTsKQEAgLTEyOCw2ICsyMjQsMTggQEAKIH0KIF9faW5pdGNhbGwoc2g3NzA1X2RldmljZXNfc2V0dXApOwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzA1X2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorfTsKKwordm9pZCBfX2luaXQgcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAodm9pZCkKK3sKKwllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3MDVfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzcwNV9lYXJseV9kZXZpY2VzKSk7Cit9CisKIHZvaWQgX19pbml0IHBsYXRfaXJxX3NldHVwKHZvaWQpCiB7CiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX2Rlc2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MHguYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzB4LmMKaW5kZXggYTc0Zjk2MC4uYzU2MzA2NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MHguYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcweC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAKIGVudW0gewogCVVOVVNFRCA9IDAsCkBAIC0xNDQsNyArMTQ1LDEwMiBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwMiwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmZmZmU5NCwKKwkJLmVuZAk9IDB4ZmZmZmZlOWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHhlLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUxIiwKKwkJLnN0YXJ0CT0gMHhmZmZmZmVhMCwKKwkJLmVuZAk9IDB4ZmZmZmZlYWIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUyX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYSwKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11Ml9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTIiLAorCQkuc3RhcnQJPSAweGZmZmZmZWFjLAorCQkuZW5kCT0gMHhmZmZmZmViYiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE4LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11Ml9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11Ml9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11Ml9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTJfcmVzb3VyY2VzKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MHhfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCiAJJnNjaV9kZXZpY2UsCiAJJnJ0Y19kZXZpY2UsCiB9OwpAQCAtMTU2LDYgKzI1MiwxOCBAQAogfQogX19pbml0Y2FsbChzaDc3MHhfZGV2aWNlc19zZXR1cCk7CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MHhfZWFybHlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCit9OworCit2b2lkIF9faW5pdCBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQoreworCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzcweF9lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2g3NzB4X2Vhcmx5X2RldmljZXMpKTsKK30KKwogdm9pZCBfX2luaXQgcGxhdF9pcnFfc2V0dXAodm9pZCkKIHsKIAlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNfZGVzYyk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYwppbmRleCAzMzUwOThiLi5lZmE3NmM4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzEwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CiAKIGVudW0gewpAQCAtMTIwLDcgKzEyMSwxMDIgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDIsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMCIsCisJCS5zdGFydAk9IDB4YTQxMmZlOTQsCisJCS5lbmQJPSAweGE0MTJmZTlmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUwX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTEiLAorCS5jaGFubmVsX29mZnNldCA9IDB4ZSwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMSIsCisJCS5zdGFydAk9IDB4YTQxMmZlYTAsCisJCS5lbmQJPSAweGE0MTJmZWFiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11Ml9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTIiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWEsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUyIiwKKwkJLnN0YXJ0CT0gMHhhNDEyZmVhYywKKwkJLmVuZAk9IDB4YTQxMmZlYjUsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTJfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUyX3Jlc291cmNlcyksCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzEwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAogCSZzY2lfZGV2aWNlLAogCSZydGNfZGV2aWNlLAogfTsKQEAgLTEzMiw2ICsyMjgsMTggQEAKIH0KIF9faW5pdGNhbGwoc2g3NzEwX2RldmljZXNfc2V0dXApOwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzEwX2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorfTsKKwordm9pZCBfX2luaXQgcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAodm9pZCkKK3sKKwllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3MTBfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzcxMF9lYXJseV9kZXZpY2VzKSk7Cit9CisKIHZvaWQgX19pbml0IHBsYXRfaXJxX3NldHVwKHZvaWQpCiB7CiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX2Rlc2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MjAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzIwLmMKaW5kZXggMDAzODc0YS4uNWIyMTA3NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MjAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcyMC5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRjX3Jlc291cmNlc1tdID0gewpAQCAtMTIzLDcgKzEyNCwyNTkgQEAKIAkucmVzb3VyY2UJPSB1c2JmX3Jlc291cmNlcywKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIGNtdDBfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJDTVQwIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDEyNSwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMTI1LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXQwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UMCIsCisJCS5zdGFydAk9IDB4MDQ0YTAwMTAsCisJCS5lbmQJPSAweDA0NGEwMDFiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTA0LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY210MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2NtdCIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY210MF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gY210MF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdDBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIGNtdDFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJDTVQxIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDIwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXQxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UMSIsCisJCS5zdGFydAk9IDB4MDQ0YTAwMjAsCisJCS5lbmQJPSAweDA0NGEwMDJiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTA0LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY210MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2NtdCIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY210MV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gY210MV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdDFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIGNtdDJfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJDTVQyIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDMwLAorCS50aW1lcl9iaXQgPSAyLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXQyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UMiIsCisJCS5zdGFydAk9IDB4MDQ0YTAwMzAsCisJCS5lbmQJPSAweDA0NGEwMDNiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTA0LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY210Ml9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2NtdCIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY210Ml9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gY210Ml9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdDJfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIGNtdDNfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJDTVQzIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDQwLAorCS50aW1lcl9iaXQgPSAzLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXQzX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UMyIsCisJCS5zdGFydAk9IDB4MDQ0YTAwNDAsCisJCS5lbmQJPSAweDA0NGEwMDRiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTA0LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY210M19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2NtdCIsCisJLmlkCQk9IDMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY210M19wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gY210M19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdDNfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIGNtdDRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJDTVQ0IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDUwLAorCS50aW1lcl9iaXQgPSA0LAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjbXQ0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UNCIsCisJCS5zdGFydAk9IDB4MDQ0YTAwNTAsCisJCS5lbmQJPSAweDA0NGEwMDViLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTA0LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY210NF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX2NtdCIsCisJLmlkCQk9IDQsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmY210NF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gY210NF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdDRfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTBfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUwIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDAyLAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTAiLAorCQkuc3RhcnQJPSAweGE0MTJmZTk0LAorCQkuZW5kCT0gMHhhNDEyZmU5ZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUxIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweGUsCisJLnRpbWVyX2JpdCA9IDEsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2Nrc291cmNlX3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTEiLAorCQkuc3RhcnQJPSAweGE0MTJmZWEwLAorCQkuZW5kCT0gMHhhNDEyZmVhYiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTJfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUyIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDFhLAorCS50aW1lcl9iaXQgPSAyLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMiIsCisJCS5zdGFydAk9IDB4YTQxMmZlYWMsCisJCS5lbmQJPSAweGE0MTJmZWI1LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUyX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUyX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11Ml9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzcyMF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmY210MF9kZXZpY2UsCisJJmNtdDFfZGV2aWNlLAorCSZjbXQyX2RldmljZSwKKwkmY210M19kZXZpY2UsCisJJmNtdDRfZGV2aWNlLAorCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAogCSZydGNfZGV2aWNlLAogCSZzY2lfZGV2aWNlLAogCSZ1c2Jfb2hjaV9kZXZpY2UsCkBAIC0xMzcsNiArMzkwLDIzIEBACiB9CiBfX2luaXRjYWxsKHNoNzcyMF9kZXZpY2VzX3NldHVwKTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzcyMF9lYXJseV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmY210MF9kZXZpY2UsCisJJmNtdDFfZGV2aWNlLAorCSZjbXQyX2RldmljZSwKKwkmY210M19kZXZpY2UsCisJJmNtdDRfZGV2aWNlLAorCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorfTsKKwordm9pZCBfX2luaXQgcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAodm9pZCkKK3sKKwllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3MjBfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzcyMF9lYXJseV9kZXZpY2VzKSk7Cit9CisKIGVudW0gewogCVVOVVNFRCA9IDAsCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g0LTIwMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMKaW5kZXggYTMzNDI5NC4uMjE0MjFlMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMKQEAgLTIxLDEwICsyMSwxMCBAQAogc3RhdGljIGludCBmcnFjcjNfZGl2aXNvcnNbXSA9IHsgMSwgMiwgMywgNCwgNiwgOCwgMTYgfTsKIHN0YXRpYyBpbnQgZnJxY3IzX3ZhbHVlc1tdICAgPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYgIH07CiAKLXN0YXRpYyB2b2lkIGVtaV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVtaV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gY3RybF9pbmwoQ1BHMl9GUlFDUjMpICYgMHgwMDA3OwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZnJxY3IzX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gZnJxY3IzX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGZycWNyM19sb29rdXAoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCkBAIC00NiwxNCArNDYsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgc2g0MjAyX2VtaV9jbGsgPSB7CiAJLm5hbWUJCT0gImVtaV9jbGsiLAotCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQsCisJLmZsYWdzCQk9IENMS19FTkFCTEVfT05fSU5JVCwKIAkub3BzCQk9ICZzaDQyMDJfZW1pX2Nsa19vcHMsCiB9OwogCi1zdGF0aWMgdm9pZCBmZW1pX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgZmVtaV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW5sKENQRzJfRlJRQ1IzKSA+PiAzKSAmIDB4MDAwNzsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGZycWNyM19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIGZycWNyM19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g0MjAyX2ZlbWlfY2xrX29wcyA9IHsKQEAgLTYyLDcgKzYyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgc2g0MjAyX2ZlbWlfY2xrID0gewogCS5uYW1lCQk9ICJmZW1pX2NsayIsCi0JLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkuZmxhZ3MJCT0gQ0xLX0VOQUJMRV9PTl9JTklULAogCS5vcHMJCT0gJnNoNDIwMl9mZW1pX2Nsa19vcHMsCiB9OwogCkBAIC05MCwxMCArOTAsMTAgQEAKIAlXQVJOX09OKGkgPT0gQVJSQVlfU0laRShmcnFjcjNfZGl2aXNvcnMpKTsJLyogVW5kZWZpbmVkIGNsb2NrICovCiB9CiAKLXN0YXRpYyB2b2lkIHNob2NfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaG9jX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbmwoQ1BHMl9GUlFDUjMpID4+IDYpICYgMHgwMDA3OwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZnJxY3IzX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gZnJxY3IzX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBpbnQgc2hvY19jbGtfdmVyaWZ5X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgc2g0MjAyX3Nob2NfY2xrID0gewogCS5uYW1lCQk9ICJzaG9jX2NsayIsCi0JLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkuZmxhZ3MJCT0gQ0xLX0VOQUJMRV9PTl9JTklULAogCS5vcHMJCT0gJnNoNDIwMl9zaG9jX2Nsa19vcHMsCiB9OwogCkBAIC0xNTAsMzEgKzE1MCwyMiBAQAogCSZzaDQyMDJfc2hvY19jbGssCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzaDQyMDJfY2xrX2luaXQodm9pZCkKK2ludCBfX2luaXQgYXJjaF9jbGtfaW5pdCh2b2lkKQogewotCXN0cnVjdCBjbGsgKmNsayA9IGNsa19nZXQoTlVMTCwgIm1hc3Rlcl9jbGsiKTsKLQlpbnQgaTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IGksIHJldCA9IDA7CiAKKwljcGdfY2xrX2luaXQoKTsKKworCWNsayA9IGNsa19nZXQoTlVMTCwgIm1hc3Rlcl9jbGsiKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaDQyMDJfb25jaGlwX2Nsb2Nrcyk7IGkrKykgewogCQlzdHJ1Y3QgY2xrICpjbGtwID0gc2g0MjAyX29uY2hpcF9jbG9ja3NbaV07CiAKIAkJY2xrcC0+cGFyZW50ID0gY2xrOwotCQljbGtfcmVnaXN0ZXIoY2xrcCk7Ci0JCWNsa19lbmFibGUoY2xrcCk7CisJCXJldCB8PSBjbGtfcmVnaXN0ZXIoY2xrcCk7CiAJfQogCi0JLyoKLQkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBjbG9ja3MgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0bwotCSAqIGZvcmNlIHRoZSBwYXJlbnQgY2xvY2sgdG8gcHJvcGFnYXRlIHNvIHRoYXQgdGhlc2UgY2xvY2tzIHdpbGwKLQkgKiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgdGhlaXIgcmF0ZS4gV2UgY2hlYXQgYnkgaGFuZGluZyB0aGUKLQkgKiBwYXJlbnQgY2xvY2sgaXRzIGN1cnJlbnQgcmF0ZSBhbmQgZm9yY2luZyBjaGlsZCBwcm9wYWdhdGlvbi4KLQkgKi8KLQljbGtfc2V0X3JhdGUoY2xrLCBjbGtfZ2V0X3JhdGUoY2xrKSk7Ci0KIAljbGtfcHV0KGNsayk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQotCi1hcmNoX2luaXRjYWxsKHNoNDIwMl9jbGtfaW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g0LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNC5jCmluZGV4IGRjYTlmODcuLjczMjk0ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvY2xvY2stc2g0LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQuYwpAQCAtMzUsMzAgKzM1LDMwIEBACiAJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAogfTsKIAotc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbncoRlJRQ1IpICYgMHgwMDA3KTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g0X21vZHVsZV9jbGtfb3BzID0gewogCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCiB9OwogCi1zdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGlkeCA9IChjdHJsX2ludyhGUlFDUikgPj4gMykgJiAweDAwMDc7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBiZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBiZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNF9idXNfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbncoRlJRQ1IpID4+IDYpICYgMHgwMDA3OwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDRfY3B1X2Nsa19vcHMgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKaW5kZXggOTFlMzY3Ny4uNmM3OGQwYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYwpAQCAtNjAsMTIgKzYwLDE4IEBACiAJCWlmICgoY3ZyICYgMHgxMDAwMDAwMCkgPT0gMCkKIAkJCWJvb3RfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19EU1A7CiAKLQkJYm9vdF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CisJCWJvb3RfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MTFNDIHwgQ1BVX0hBU19QRVJGX0NPVU5URVI7CiAJCWJvb3RfY3B1X2RhdGEuY3V0X21ham9yID0gcHZyICYgMHg3ZjsKKworCQlib290X2NwdV9kYXRhLmljYWNoZS53YXlzID0gNDsKKwkJYm9vdF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDQ7CisJfSBlbHNlIHsKKwkJLyogQW5kIHNvbWUgU0gtNCBkZWZhdWx0cy4uICovCisJCWJvb3RfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19QVEVBOwogCX0KIAogCS8qIEZQVSBkZXRlY3Rpb24gd29ya3MgZm9yIGV2ZXJ5b25lICovCi0JaWYgKChjdnIgJiAweDIwMDAwMDAwKSA9PSAxKQorCWlmICgoY3ZyICYgMHgyMDAwMDAwMCkpCiAJCWJvb3RfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19GUFU7CiAKIAkvKiBNYXNrIG9mZiB0aGUgdXBwZXIgY2hpcCBJRCAqLwpAQCAtNzgsMjUgKzg0LDIwIEBACiAJc3dpdGNoIChwdnIpIHsKIAljYXNlIDB4MjA1OgogCQlib290X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzUwOwotCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19GUFUgfAotCQkJCSAgIENQVV9IQVNfUEVSRl9DT1VOVEVSOworCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwKKwkJCQkgICAgICAgQ1BVX0hBU19QRVJGX0NPVU5URVI7CiAJCWJyZWFrOwogCWNhc2UgMHgyMDY6CiAJCWJvb3RfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3NTBTOwotCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19GUFUgfAotCQkJCSAgIENQVV9IQVNfUEVSRl9DT1VOVEVSOworCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwKKwkJCQkgICAgICAgQ1BVX0hBU19QRVJGX0NPVU5URVI7CiAJCWJyZWFrOwogCWNhc2UgMHgxMTAwOgogCQlib290X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzUxOwotCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwogCQlicmVhazsKIAljYXNlIDB4MjAwMToKIAljYXNlIDB4MjAwNDoKIAkJYm9vdF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzc3MDsKLQkJYm9vdF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDQ7Ci0JCWJvb3RfY3B1X2RhdGEuZGNhY2hlLndheXMgPSA0OwotCi0JCWJvb3RfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX0xMU0M7CiAJCWJyZWFrOwogCWNhc2UgMHgyMDA2OgogCWNhc2UgMHgyMDBBOgpAQCAtMTA3LDQ1ICsxMDgsMjYgQEAKIAkJZWxzZQogCQkJYm9vdF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzc4MDsKIAotCQlib290X2NwdV9kYXRhLmljYWNoZS53YXlzID0gNDsKLQkJYm9vdF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDQ7Ci0KLQkJYm9vdF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKLQkJCQkgICBDUFVfSEFTX0xMU0M7CiAJCWJyZWFrOwogCWNhc2UgMHgzMDAwOgogCWNhc2UgMHgzMDAzOgogCWNhc2UgMHgzMDA5OgogCQlib290X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3MzQzOwotCQlib290X2NwdV9kYXRhLmljYWNoZS53YXlzID0gNDsKLQkJYm9vdF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDQ7Ci0JCWJvb3RfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOwogCQlicmVhazsKIAljYXNlIDB4MzAwNDoKIAljYXNlIDB4MzAwNzoKIAkJYm9vdF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzc4NTsKLQkJYm9vdF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDQ7Ci0JCWJvb3RfY3B1X2RhdGEuZGNhY2hlLndheXMgPSA0OwotCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVIHwgQ1BVX0hBU19QRVJGX0NPVU5URVIgfAotCQkJCQkgIENQVV9IQVNfTExTQzsKIAkJYnJlYWs7CiAJY2FzZSAweDQwMDQ6CiAJCWJvb3RfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3ODY7Ci0JCWJvb3RfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OwotCQlib290X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKLQkJYm9vdF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKLQkJCUNQVV9IQVNfTExTQyB8IENQVV9IQVNfUFRFQUVYOworCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfUFRFQUVYIHwgQ1BVX0hBU19MMl9DQUNIRTsKIAkJYnJlYWs7CiAJY2FzZSAweDMwMDg6Ci0JCWJvb3RfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OwotCQlib290X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKLQkJYm9vdF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0xMU0M7Ci0KIAkJc3dpdGNoIChwcnIpIHsKIAkJY2FzZSAweDUwOgogCQljYXNlIDB4NTE6CiAJCQlib290X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzIzOwotCQkJYm9vdF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfTDJfQ0FDSEU7CisJCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfTDJfQ0FDSEU7CiAJCQlicmVhazsKIAkJY2FzZSAweDcwOgogCQkJYm9vdF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzM2NjsKQEAgLTE1NiwxMyArMTM4LDEzIEBACiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKKwljYXNlIDB4MzAwYjoKKwkJYm9vdF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzcyNDsKKwkJYm9vdF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0wyX0NBQ0hFOworCQlicmVhazsKIAljYXNlIDB4NDAwMDoJLyogMXN0IGN1dCAqLwogCWNhc2UgMHg0MDAxOgkvKiAybmQgY3V0ICovCiAJCWJvb3RfY3B1X2RhdGEudHlwZSA9IENQVV9TSFgzOwotCQlib290X2NwdV9kYXRhLmljYWNoZS53YXlzID0gNDsKLQkJYm9vdF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDQ7Ci0JCWJvb3RfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX1BFUkZfQ09VTlRFUiB8Ci0JCQkJCSAgQ1BVX0hBU19MTFNDOwogCQlicmVhazsKIAljYXNlIDB4NzAwOgogCQlib290X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g0XzUwMTsKQEAgLTE3Myw3ICsxNTUsNiBAQAogCQlib290X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g0XzIwMjsKIAkJYm9vdF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDI7CiAJCWJvb3RfY3B1X2RhdGEuZGNhY2hlLndheXMgPSAyOwotCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwogCQlicmVhazsKIAljYXNlIDB4NTAwIC4uLiAweDUwMToKIAkJc3dpdGNoIChwcnIpIHsKQEAgLTE5MSwxOCArMTcyLDEyIEBACiAJCWJvb3RfY3B1X2RhdGEuaWNhY2hlLndheXMgPSAyOwogCQlib290X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gMjsKIAotCQlib290X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwotCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJvb3RfY3B1X2RhdGEudHlwZSA9IENQVV9TSF9OT05FOwogCQlicmVhazsKIAl9CiAKLSNpZmRlZiBDT05GSUdfQ1BVX0hBU19QVEVBCi0JYm9vdF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX1BURUE7Ci0jZW5kaWYKLQogCS8qCiAJICogT24gYW55dGhpbmcgdGhhdCdzIG5vdCBhIGRpcmVjdC1tYXBwZWQgY2FjaGUsIGxvb2sgdG8gdGhlIENWUgogCSAqIGZvciBJL0QtY2FjaGUgc3BlY2lmaWNzLgpAQCAtMjIyLDQzICsxOTcsNDggQEAKIAl9CiAKIAkvKgotCSAqIFNldHVwIHRoZSBMMiBjYWNoZSBkZXNjCi0JICoKIAkgKiBTSC00QSdzIGhhdmUgYW4gb3B0aW9uYWwgUElQVCBMMi4KIAkgKi8KIAlpZiAoYm9vdF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfTDJfQ0FDSEUpIHsKLQkJLyogQnVnIGlmIHdlIGNhbid0IGRlY29kZSB0aGUgTDIgaW5mbyAqLwotCQlCVUdfT04oIShjdnIgJiAweGYpKTsKLQotCQkvKiBTaWxpY29uIGFuZCBzcGVjaWZpY2F0aW9ucyBoYXZlIGNsZWFybHkgbmV2ZXIgbWV0Li4gKi8KLQkJY3ZyIF49IDB4ZjsKLQogCQkvKgotCQkgKiBTaXplIGNhbGN1bGF0aW9uIGlzIG11Y2ggbW9yZSBzZW5zaWJsZQotCQkgKiB0aGFuIGl0IGlzIGZvciB0aGUgTDEuCi0JCSAqCi0JCSAqIFNpemVzIGFyZSAxMjhLQiwgMjU4S0IsIDUxMktCLCBhbmQgMU1CLgorCQkgKiBWZXJpZnkgdGhhdCBpdCByZWFsbHkgaGFzIHNvbWV0aGluZyBob29rZWQgdXAsIHRoaXMKKwkJICogaXMgdGhlIHNhZmV0eSBuZXQgZm9yIENQVXMgdGhhdCBoYXZlIG9wdGlvbmFsIEwyCisJCSAqIHN1cHBvcnQgeWV0IGRvIG5vdCBpbXBsZW1lbnQgaXQuCiAJCSAqLwotCQlzaXplID0gKGN2ciAmIDB4ZikgPDwgMTc7CisJCWlmICgoY3ZyICYgMHhmKSA9PSAwKQorCQkJYm9vdF9jcHVfZGF0YS5mbGFncyAmPSB+Q1BVX0hBU19MMl9DQUNIRTsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogU2lsaWNvbiBhbmQgc3BlY2lmaWNhdGlvbnMgaGF2ZSBjbGVhcmx5IG5ldmVyCisJCQkgKiBtZXQuLgorCQkJICovCisJCQljdnIgXj0gMHhmOwogCi0JCUJVR19PTighc2l6ZSk7CisJCQkvKgorCQkJICogU2l6ZSBjYWxjdWxhdGlvbiBpcyBtdWNoIG1vcmUgc2Vuc2libGUKKwkJCSAqIHRoYW4gaXQgaXMgZm9yIHRoZSBMMS4KKwkJCSAqCisJCQkgKiBTaXplcyBhcmUgMTI4S0IsIDI1OEtCLCA1MTJLQiwgYW5kIDFNQi4KKwkJCSAqLworCQkJc2l6ZSA9IChjdnIgJiAweGYpIDw8IDE3OwogCi0JCWJvb3RfY3B1X2RhdGEuc2NhY2hlLndheV9pbmNyCQk9ICgxIDw8IDE2KTsKLQkJYm9vdF9jcHVfZGF0YS5zY2FjaGUuZW50cnlfc2hpZnQJPSA1OwotCQlib290X2NwdV9kYXRhLnNjYWNoZS53YXlzCQk9IDQ7Ci0JCWJvb3RfY3B1X2RhdGEuc2NhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwkJCWJvb3RfY3B1X2RhdGEuc2NhY2hlLndheV9pbmNyCQk9ICgxIDw8IDE2KTsKKwkJCWJvb3RfY3B1X2RhdGEuc2NhY2hlLmVudHJ5X3NoaWZ0CT0gNTsKKwkJCWJvb3RfY3B1X2RhdGEuc2NhY2hlLndheXMJCT0gNDsKKwkJCWJvb3RfY3B1X2RhdGEuc2NhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKIAotCQlib290X2NwdV9kYXRhLnNjYWNoZS5lbnRyeV9tYXNrCT0KLQkJCShib290X2NwdV9kYXRhLnNjYWNoZS53YXlfaW5jciAtCi0JCQkgYm9vdF9jcHVfZGF0YS5zY2FjaGUubGluZXN6KTsKKwkJCWJvb3RfY3B1X2RhdGEuc2NhY2hlLmVudHJ5X21hc2sJPQorCQkJCShib290X2NwdV9kYXRhLnNjYWNoZS53YXlfaW5jciAtCisJCQkJIGJvb3RfY3B1X2RhdGEuc2NhY2hlLmxpbmVzeik7CiAKLQkJYm9vdF9jcHVfZGF0YS5zY2FjaGUuc2V0cwk9IHNpemUgLwotCQkJKGJvb3RfY3B1X2RhdGEuc2NhY2hlLmxpbmVzeiAqCi0JCQkgYm9vdF9jcHVfZGF0YS5zY2FjaGUud2F5cyk7CisJCQlib290X2NwdV9kYXRhLnNjYWNoZS5zZXRzCT0gc2l6ZSAvCisJCQkJKGJvb3RfY3B1X2RhdGEuc2NhY2hlLmxpbmVzeiAqCisJCQkJIGJvb3RfY3B1X2RhdGEuc2NhY2hlLndheXMpOwogCi0JCWJvb3RfY3B1X2RhdGEuc2NhY2hlLndheV9zaXplCT0KLQkJCShib290X2NwdV9kYXRhLnNjYWNoZS5zZXRzICoKLQkJCSBib290X2NwdV9kYXRhLnNjYWNoZS5saW5lc3opOworCQkJYm9vdF9jcHVfZGF0YS5zY2FjaGUud2F5X3NpemUJPQorCQkJCShib290X2NwdV9kYXRhLnNjYWNoZS5zZXRzICoKKwkJCQkgYm9vdF9jcHVfZGF0YS5zY2FjaGUubGluZXN6KTsKKwkJfQogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDQtMjAyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNC0yMDIuYwppbmRleCA3MzcxYWJmLi42ZDA4OGQxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNC0yMDIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNC0yMDIuYwpAQCAtMiw2ICsyLDcgQEAKICAqIFNINC0yMDIgU2V0dXAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CisgKiAgQ29weXJpZ2h0IChDKSAyMDA5ICBNYWdudXMgRGFtbQogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xMSw2ICsxMiw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKQEAgLTMxLDggKzM0LDEwMyBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAwOCwKKwkJLmVuZAk9IDB4ZmZkODAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMSIsCisJCS5zdGFydAk9IDB4ZmZkODAwMTQsCisJCS5lbmQJPSAweGZmZDgwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11Ml9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTIiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUyIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAyMCwKKwkJLmVuZAk9IDB4ZmZkODAwMmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTJfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUyX3Jlc291cmNlcyksCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g0MjAyX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzY2lfZGV2aWNlLAorCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2g0MjAyX2RldmljZXNfc2V0dXAodm9pZCkKQEAgLTQyLDcgKzE0MCw3MSBAQAogfQogX19pbml0Y2FsbChzaDQyMDJfZGV2aWNlc19zZXR1cCk7CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDQyMDJfZWFybHlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCit9OworCit2b2lkIF9faW5pdCBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQoreworCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNDIwMl9lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2g0MjAyX2Vhcmx5X2RldmljZXMpKTsKK30KKworZW51bSB7CisJVU5VU0VEID0gMCwKKworCS8qIGludGVycnVwdCBzb3VyY2VzICovCisJSVJMMCwgSVJMMSwgSVJMMiwgSVJMMywgLyogb25seSBJUkxNIG1vZGUgc3VwcG9ydGVkICovCisJSFVESSwgVE1VMCwgVE1VMSwgVE1VMiwgUlRDLCBTQ0lGLCBXRFQsCit9OworCitzdGF0aWMgc3RydWN0IGludGNfdmVjdCB2ZWN0b3JzW10gX19pbml0ZGF0YSA9IHsKKwlJTlRDX1ZFQ1QoSFVESSwgMHg2MDApLAorCUlOVENfVkVDVChUTVUwLCAweDQwMCksIElOVENfVkVDVChUTVUxLCAweDQyMCksCisJSU5UQ19WRUNUKFRNVTIsIDB4NDQwKSwgSU5UQ19WRUNUKFRNVTIsIDB4NDYwKSwKKwlJTlRDX1ZFQ1QoUlRDLCAweDQ4MCksIElOVENfVkVDVChSVEMsIDB4NGEwKSwKKwlJTlRDX1ZFQ1QoUlRDLCAweDRjMCksCisJSU5UQ19WRUNUKFNDSUYsIDB4NzAwKSwgSU5UQ19WRUNUKFNDSUYsIDB4NzIwKSwKKwlJTlRDX1ZFQ1QoU0NJRiwgMHg3NDApLCBJTlRDX1ZFQ1QoU0NJRiwgMHg3NjApLAorCUlOVENfVkVDVChXRFQsIDB4NTYwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50Y19wcmlvX3JlZyBwcmlvX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CisJeyAweGZmZDAwMDA0LCAwLCAxNiwgNCwgLyogSVBSQSAqLyB7IFRNVTAsIFRNVTEsIFRNVTIsIFJUQyB9IH0sCisJeyAweGZmZDAwMDA4LCAwLCAxNiwgNCwgLyogSVBSQiAqLyB7IFdEVCwgMCwgMCwgMCB9IH0sCisJeyAweGZmZDAwMDBjLCAwLCAxNiwgNCwgLyogSVBSQyAqLyB7IDAsIDAsIFNDSUYsIEhVREkgfSB9LAorCXsgMHhmZmQwMDAxMCwgMCwgMTYsIDQsIC8qIElQUkQgKi8geyBJUkwwLCBJUkwxLCBJUkwyLCBJUkwzIH0gfSwKK307CisKK3N0YXRpYyBERUNMQVJFX0lOVENfREVTQyhpbnRjX2Rlc2MsICJzaDQtMjAyIiwgdmVjdG9ycywgTlVMTCwKKwkJCSBOVUxMLCBwcmlvX3JlZ2lzdGVycywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgaW50Y192ZWN0IHZlY3RvcnNfaXJsbVtdIF9faW5pdGRhdGEgPSB7CisJSU5UQ19WRUNUKElSTDAsIDB4MjQwKSwgSU5UQ19WRUNUKElSTDEsIDB4MmEwKSwKKwlJTlRDX1ZFQ1QoSVJMMiwgMHgzMDApLCBJTlRDX1ZFQ1QoSVJMMywgMHgzNjApLAorfTsKKworc3RhdGljIERFQ0xBUkVfSU5UQ19ERVNDKGludGNfZGVzY19pcmxtLCAic2g0LTIwMl9pcmxtIiwgdmVjdG9yc19pcmxtLCBOVUxMLAorCQkJIE5VTEwsIHByaW9fcmVnaXN0ZXJzLCBOVUxMKTsKKwogdm9pZCBfX2luaXQgcGxhdF9pcnFfc2V0dXAodm9pZCkKIHsKLQkvKiBkbyBub3RoaW5nIC0gYWxsIElSTCBpbnRlcnJ1cHRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBib2FyZCBjb2RlICovCisJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX2Rlc2MpOworfQorCisjZGVmaW5lIElOVENfSUNSCTB4ZmZkMDAwMDBVTAorI2RlZmluZSBJTlRDX0lDUl9JUkxNICAgKDE8PDcpCisKK3ZvaWQgX19pbml0IHBsYXRfaXJxX3NldHVwX3BpbnMoaW50IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBJUlFfTU9ERV9JUlE6IC8qIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIElSTDMtMCAqLworCQljdHJsX291dHcoY3RybF9pbncoSU5UQ19JQ1IpIHwgSU5UQ19JQ1JfSVJMTSwgSU5UQ19JQ1IpOworCQlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNfZGVzY19pcmxtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKaW5kZXggYTFjODBkOS4uODUxNjcyZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRjX3Jlc291cmNlc1tdID0gewpAQCAtNjAsOSArNjEsMTc3IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTBfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUwIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDA0LAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTAiLAorCQkuc3RhcnQJPSAweGZmZDgwMDA4LAorCQkuZW5kCT0gMHhmZmQ4MDAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUxIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUxIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAxNCwKKwkJLmVuZAk9IDB4ZmZkODAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUyX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11Ml9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTIiLAorCQkuc3RhcnQJPSAweGZmZDgwMDIwLAorCQkuZW5kCT0gMHhmZmQ4MDAyZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE4LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11Ml9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11Ml9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11Ml9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTJfcmVzb3VyY2VzKSwKK307CisKKy8qIFNINzc1MFIsIFNINzc1MSBhbmQgU0g3NzUxUiBhbGwgaGF2ZSB0d28gZXh0cmEgdGltZXIgY2hhbm5lbHMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxKSB8fCBcCisJZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUikKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11M19wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTMiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUzIiwKKwkJLnN0YXJ0CT0gMHhmZTEwMDAwOCwKKwkJLmVuZAk9IDB4ZmUxMDAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA3MiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTNfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUzX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXU0X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VNCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11NF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTQiLAorCQkuc3RhcnQJPSAweGZlMTAwMDE0LAorCQkuZW5kCT0gMHhmZTEwMDAxZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDc2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11NF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDQsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11NF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11NF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTRfcmVzb3VyY2VzKSwKK307CisKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzUwX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZydGNfZGV2aWNlLAogCSZzY2lfZGV2aWNlLAorCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQorCSZ0bXUzX2RldmljZSwKKwkmdG11NF9kZXZpY2UsCisjZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNoNzc1MF9kZXZpY2VzX3NldHVwKHZvaWQpCkBAIC03Miw2ICsyNDEsMjQgQEAKIH0KIF9faW5pdGNhbGwoc2g3NzUwX2RldmljZXNfc2V0dXApOwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzUwX2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpIHx8IFwKKwlkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKQorCSZ0bXUzX2RldmljZSwKKwkmdG11NF9kZXZpY2UsCisjZW5kaWYKK307CisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzUwX2Vhcmx5X2RldmljZXMsCisJCQkJICAgQVJSQVlfU0laRShzaDc3NTBfZWFybHlfZGV2aWNlcykpOworfQorCiBlbnVtIHsKIAlVTlVTRUQgPSAwLAogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwppbmRleCBkOWJkYzkzLi41YjgyMjUxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIApAQCAtMTgsMTAgKzE5LDcgQEAKIAogCS8qIGludGVycnVwdCBzb3VyY2VzICovCiAJSVJMMCwgSVJMMSwgSVJMMiwgSVJMMywKLQlIVURJLCBHUElPSSwKLQlETUFDX0RNVEUwLCBETUFDX0RNVEUxLCBETUFDX0RNVEUyLCBETUFDX0RNVEUzLAotCURNQUNfRE1URTQsIERNQUNfRE1URTUsIERNQUNfRE1URTYsIERNQUNfRE1URTcsCi0JRE1BQ19ETUFFLAorCUhVREksIEdQSU9JLCBETUFDLAogCUlSUTQsIElSUTUsIElSUTYsIElSUTcsCiAJSENBTjIwLCBIQ0FOMjEsCiAJU1NJMCwgU1NJMSwKQEAgLTM2LDIxICszNCwyMCBAQAogCUhTUEksCiAJTU1DSUYwLCBNTUNJRjEsIE1NQ0lGMiwgTU1DSUYzLAogCU1GSSwgQURDLCBDTVQsCi0JVE1VMCwgVE1VMSwgVE1VMl9UVU5JLCBUTVUyX1RJQ1BJLAotCVdEVCwKLQlSRUZfUkNNSSwgUkVGX1JPVkksCisJVE1VMCwgVE1VMSwgVE1VMiwKKwlXRFQsIFJFRiwKIAogCS8qIGludGVycnVwdCBncm91cHMgKi8KLQlETUFDLCBETUFCUkcsIFNDSUYwLCBTQ0lGMSwgU0NJRjIsIFNJTSwgTU1DSUYsIFRNVTIsIFJFRiwKKwlETUFCUkcsIFNDSUYwLCBTQ0lGMSwgU0NJRjIsIFNJTSwgTU1DSUYsCiB9OwogCiBzdGF0aWMgc3RydWN0IGludGNfdmVjdCB2ZWN0b3JzW10gX19pbml0ZGF0YSA9IHsKIAlJTlRDX1ZFQ1QoSFVESSwgMHg2MDApLCBJTlRDX1ZFQ1QoR1BJT0ksIDB4NjIwKSwKLQlJTlRDX1ZFQ1QoRE1BQ19ETVRFMCwgMHg2NDApLCBJTlRDX1ZFQ1QoRE1BQ19ETVRFMSwgMHg2NjApLAotCUlOVENfVkVDVChETUFDX0RNVEUyLCAweDY4MCksIElOVENfVkVDVChETUFDX0RNVEUzLCAweDZhMCksCi0JSU5UQ19WRUNUKERNQUNfRE1URTQsIDB4NzgwKSwgSU5UQ19WRUNUKERNQUNfRE1URTUsIDB4N2EwKSwKLQlJTlRDX1ZFQ1QoRE1BQ19ETVRFNiwgMHg3YzApLCBJTlRDX1ZFQ1QoRE1BQ19ETVRFNywgMHg3ZTApLAotCUlOVENfVkVDVChETUFDX0RNQUUsIDB4NmMwKSwKKwlJTlRDX1ZFQ1QoRE1BQywgMHg2NDApLCBJTlRDX1ZFQ1QoRE1BQywgMHg2NjApLAorCUlOVENfVkVDVChETUFDLCAweDY4MCksIElOVENfVkVDVChETUFDLCAweDZhMCksCisJSU5UQ19WRUNUKERNQUMsIDB4NzgwKSwgSU5UQ19WRUNUKERNQUMsIDB4N2EwKSwKKwlJTlRDX1ZFQ1QoRE1BQywgMHg3YzApLCBJTlRDX1ZFQ1QoRE1BQywgMHg3ZTApLAorCUlOVENfVkVDVChETUFDLCAweDZjMCksCiAJSU5UQ19WRUNUKElSUTQsIDB4ODAwKSwgSU5UQ19WRUNUKElSUTUsIDB4ODIwKSwKIAlJTlRDX1ZFQ1QoSVJRNiwgMHg4NDApLCBJTlRDX1ZFQ1QoSVJRNiwgMHg4NjApLAogCUlOVENfVkVDVChIQ0FOMjAsIDB4OTAwKSwgSU5UQ19WRUNUKEhDQU4yMSwgMHg5MjApLApAQCAtNzQsMjMgKzcxLDE4IEBACiAJSU5UQ19WRUNUKE1GSSwgMHhlODApLCAvKiAweGY4MCBhY2NvcmRpbmcgdG8gZGF0YSBzaGVldCAqLwogCUlOVENfVkVDVChBREMsIDB4ZjgwKSwgSU5UQ19WRUNUKENNVCwgMHhmYTApLAogCUlOVENfVkVDVChUTVUwLCAweDQwMCksIElOVENfVkVDVChUTVUxLCAweDQyMCksCi0JSU5UQ19WRUNUKFRNVTJfVFVOSSwgMHg0NDApLCBJTlRDX1ZFQ1QoVE1VMl9USUNQSSwgMHg0NjApLAorCUlOVENfVkVDVChUTVUyLCAweDQ0MCksIElOVENfVkVDVChUTVUyLCAweDQ2MCksCiAJSU5UQ19WRUNUKFdEVCwgMHg1NjApLAotCUlOVENfVkVDVChSRUZfUkNNSSwgMHg1ODApLCBJTlRDX1ZFQ1QoUkVGX1JPVkksIDB4NWEwKSwKKwlJTlRDX1ZFQ1QoUkVGLCAweDU4MCksIElOVENfVkVDVChSRUYsIDB4NWEwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaW50Y19ncm91cCBncm91cHNbXSBfX2luaXRkYXRhID0gewotCUlOVENfR1JPVVAoRE1BQywgRE1BQ19ETVRFMCwgRE1BQ19ETVRFMSwgRE1BQ19ETVRFMiwKLQkJICAgRE1BQ19ETVRFMywgRE1BQ19ETVRFNCwgRE1BQ19ETVRFNSwKLQkJICAgRE1BQ19ETVRFNiwgRE1BQ19ETVRFNywgRE1BQ19ETUFFKSwKIAlJTlRDX0dST1VQKERNQUJSRywgRE1BQlJHMCwgRE1BQlJHMSwgRE1BQlJHMiksCiAJSU5UQ19HUk9VUChTQ0lGMCwgU0NJRjBfRVJJLCBTQ0lGMF9SWEksIFNDSUYwX0JSSSwgU0NJRjBfVFhJKSwKIAlJTlRDX0dST1VQKFNDSUYxLCBTQ0lGMV9FUkksIFNDSUYxX1JYSSwgU0NJRjFfQlJJLCBTQ0lGMV9UWEkpLAogCUlOVENfR1JPVVAoU0NJRjIsIFNDSUYyX0VSSSwgU0NJRjJfUlhJLCBTQ0lGMl9CUkksIFNDSUYyX1RYSSksCiAJSU5UQ19HUk9VUChTSU0sIFNJTV9FUkksIFNJTV9SWEksIFNJTV9UWEksIFNJTV9URUkpLAogCUlOVENfR1JPVVAoTU1DSUYsIE1NQ0lGMCwgTU1DSUYxLCBNTUNJRjIsIE1NQ0lGMyksCi0JSU5UQ19HUk9VUChUTVUyLCBUTVUyX1RVTkksIFRNVTJfVElDUEkpLAotCUlOVENfR1JPVVAoUkVGLCBSRUZfUkNNSSwgUkVGX1JPVkkpLAogfTsKIAogc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIG1hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKQEAgLTE2OCw4ICsxNjAsMTA0IEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTBfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUwIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDA0LAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTAiLAorCQkuc3RhcnQJPSAweGZmZDgwMDA4LAorCQkuZW5kCT0gMHhmZmQ4MDAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUxIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUxIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAxNCwKKwkJLmVuZAk9IDB4ZmZkODAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUyX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11Ml9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTIiLAorCQkuc3RhcnQJPSAweGZmZDgwMDIwLAorCQkuZW5kCT0gMHhmZmQ4MDAyZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE4LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11Ml9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11Ml9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11Ml9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTJfcmVzb3VyY2VzKSwKK307CisKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc2MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmc2NpX2RldmljZSwKKwkmdG11MF9kZXZpY2UsCisJJnRtdTFfZGV2aWNlLAorCSZ0bXUyX2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNoNzc2MF9kZXZpY2VzX3NldHVwKHZvaWQpCkBAIC0xNzksNiArMjY3LDE4IEBACiB9CiBfX2luaXRjYWxsKHNoNzc2MF9kZXZpY2VzX3NldHVwKTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc2MF9lYXJseV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmdG11MF9kZXZpY2UsCisJJnRtdTFfZGV2aWNlLAorCSZ0bXUyX2RldmljZSwKK307CisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzYwX2Vhcmx5X2RldmljZXMsCisJCQkJICAgQVJSQVlfU0laRShzaDc3NjBfZWFybHlfZGV2aWNlcykpOworfQorCiAjZGVmaW5lIElOVENfSUNSCTB4ZmZkMDAwMDBVTAogI2RlZmluZSBJTlRDX0lDUl9JUkxNCSgxIDw8IDcpCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKaW5kZXggMWE5MjM2MS4uOTZlYTA5YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKQEAgLTExLDYgKzExLDcgQEAKIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCSs9IHNldHVwLXNoNzM0My5vCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQkrPSBzZXR1cC1zaDc3MjIubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykJKz0gc2V0dXAtc2g3NzIzLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCSs9IHNldHVwLXNoNzcyNC5vCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2KQkrPSBzZXR1cC1zaDczNjYubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NIWDMpCQkrPSBzZXR1cC1zaHgzLm8KIApAQCAtMjMsMTUgKzI0LDE3IEBACiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCTo9IGNsb2NrLXNoNzc4MC5vCiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCTo9IGNsb2NrLXNoNzc4NS5vCiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODYpCTo9IGNsb2NrLXNoNzc4Ni5vCi1jbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCTo9IGNsb2NrLXNoNzcyMi5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCTo9IGNsb2NrLXNoNzM0My5vCiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCTo9IGNsb2NrLXNoNzcyMi5vCi1jbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMpCTo9IGNsb2NrLXNoNzcyMi5vCi1jbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYpCTo9IGNsb2NrLXNoNzcyMi5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMpCTo9IGNsb2NrLXNoNzcyMy5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCTo9IGNsb2NrLXNoNzcyNC5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNjYpCTo9IGNsb2NrLXNoNzM2Ni5vCiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQk6PSBjbG9jay1zaHgzLm8KIAogIyBQaW5tdXggc2V0dXAKIHBpbm11eC0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCTo9IHBpbm11eC1zaDc3MjIubwogcGlubXV4LSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykJOj0gcGlubXV4LXNoNzcyMy5vCitwaW5tdXgtJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0KQk6PSBwaW5tdXgtc2g3NzI0Lm8KIHBpbm11eC0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCTo9IHBpbm11eC1zaDc3ODUubwogcGlubXV4LSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NikJOj0gcGlubXV4LXNoNzc4Ni5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM0My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzQzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlM2VlOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM0My5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzQzLmMKKyAqCisgKiBTSDczNDMgY2xvY2sgZnJhbWV3b3JrIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFnbnVzIERhbW0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisKKy8qIFNINzM0MyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRlJRQ1IJCTB4YTQxNTAwMDAKKyNkZWZpbmUgVkNMS0NSCQkweGE0MTUwMDA0CisjZGVmaW5lIFNDTEtBQ1IJCTB4YTQxNTAwMDgKKyNkZWZpbmUgU0NMS0JDUgkJMHhhNDE1MDAwYworI2RlZmluZSBQTExDUgkJMHhhNDE1MDAyNAorI2RlZmluZSBNU1RQQ1IwCQkweGE0MTUwMDMwCisjZGVmaW5lIE1TVFBDUjEJCTB4YTQxNTAwMzQKKyNkZWZpbmUgTVNUUENSMgkJMHhhNDE1MDAzOAorI2RlZmluZSBETExGUlEJCTB4YTQxNTAwNTAKKworLyogRml4ZWQgMzIgS0h6IHJvb3QgY2xvY2sgZm9yIFJUQyBhbmQgUG93ZXIgTWFuYWdlbWVudCBwdXJwb3NlcyAqLworc3RhdGljIHN0cnVjdCBjbGsgcl9jbGsgPSB7CisJLm5hbWUgICAgICAgICAgID0gInJjbGsiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5yYXRlICAgICAgICAgICA9IDMyNzY4LAorfTsKKworLyoKKyAqIERlZmF1bHQgcmF0ZSBmb3IgdGhlIHJvb3QgaW5wdXQgY2xvY2ssIHJlc2V0IHRoaXMgd2l0aCBjbGtfc2V0X3JhdGUoKQorICogZnJvbSB0aGUgcGxhdGZvcm0gY29kZS4KKyAqLworc3RydWN0IGNsayBleHRhbF9jbGsgPSB7CisJLm5hbWUJCT0gImV4dGFsIiwKKwkuaWQJCT0gLTEsCisJLnJhdGUJCT0gMzMzMzMzMzMsCit9OworCisvKiBUaGUgZGxsIGJsb2NrIG11bHRpcGxpZXMgdGhlIDMya2h6IHJfY2xrLCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIGV4dGFsICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbGxfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIG11bHQ7CisKKwlpZiAoX19yYXdfcmVhZGwoUExMQ1IpICYgMHgxMDAwKQorCQltdWx0ID0gX19yYXdfcmVhZGwoRExMRlJRKTsKKwllbHNlCisJCW11bHQgPSAwOworCisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlICogbXVsdDsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIGRsbF9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gZGxsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRsbF9jbGsgPSB7CisJLm5hbWUgICAgICAgICAgID0gImRsbF9jbGsiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5vcHMJCT0gJmRsbF9jbGtfb3BzLAorCS5wYXJlbnQJCT0gJnJfY2xrLAorCS5mbGFncwkJPSBDTEtfRU5BQkxFX09OX0lOSVQsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGxfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIG11bHQgPSAxOworCisJaWYgKF9fcmF3X3JlYWRsKFBMTENSKSAmIDB4NDAwMCkKKwkJbXVsdCA9ICgoKF9fcmF3X3JlYWRsKEZSUUNSKSA+PiAyNCkgJiAweDFmKSArIDEpOworCisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlICogbXVsdDsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHBsbF9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gcGxsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbF9jbGsgPSB7CisJLm5hbWUJCT0gInBsbF9jbGsiLAorCS5pZAkJPSAtMSwKKwkub3BzCQk9ICZwbGxfY2xrX29wcywKKwkuZmxhZ3MJCT0gQ0xLX0VOQUJMRV9PTl9JTklULAorfTsKKworc3RydWN0IGNsayAqbWFpbl9jbGtzW10gPSB7CisJJnJfY2xrLAorCSZleHRhbF9jbGssCisJJmRsbF9jbGssCisJJnBsbF9jbGssCit9OworCitzdGF0aWMgaW50IG11bHRpcGxpZXJzW10gPSB7IDEsIDIsIDEsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfTsKK3N0YXRpYyBpbnQgZGl2aXNvcnNbXSA9IHsgMSwgMywgMiwgNSwgMywgNCwgNSwgNiwgOCwgMTAsIDEyLCAxNiwgMjAgfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X211bHRfdGFibGUgZGl2NF90YWJsZSA9IHsKKwkuZGl2aXNvcnMgPSBkaXZpc29ycywKKwkubnJfZGl2aXNvcnMgPSBBUlJBWV9TSVpFKGRpdmlzb3JzKSwKKwkubXVsdGlwbGllcnMgPSBtdWx0aXBsaWVycywKKwkubnJfbXVsdGlwbGllcnMgPSBBUlJBWV9TSVpFKG11bHRpcGxpZXJzKSwKK307CisKK2VudW0geyBESVY0X0ksIERJVjRfVSwgRElWNF9TSCwgRElWNF9CLCBESVY0X0IzLCBESVY0X1AsCisgICAgICAgRElWNF9TSVVBLCBESVY0X1NJVUIsIERJVjRfTlIgfTsKKworI2RlZmluZSBESVY0KF9zdHIsIF9yZWcsIF9iaXQsIF9tYXNrLCBfZmxhZ3MpIFwKKyAgU0hfQ0xLX0RJVjQoX3N0ciwgJnBsbF9jbGssIF9yZWcsIF9iaXQsIF9tYXNrLCBfZmxhZ3MpCisKK3N0cnVjdCBjbGsgZGl2NF9jbGtzW0RJVjRfTlJdID0geworCVtESVY0X0ldID0gRElWNCgiY3B1X2NsayIsIEZSUUNSLCAyMCwgMHgxZmZmLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCVtESVY0X1VdID0gRElWNCgidW1lbV9jbGsiLCBGUlFDUiwgMTYsIDB4MWZmZiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlbRElWNF9TSF0gPSBESVY0KCJzaHl3YXlfY2xrIiwgRlJRQ1IsIDEyLCAweDFmZmYsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfQl0gPSBESVY0KCJidXNfY2xrIiwgRlJRQ1IsIDgsIDB4MWZmZiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlbRElWNF9CM10gPSBESVY0KCJiM19jbGsiLCBGUlFDUiwgNCwgMHgxZmZmLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCVtESVY0X1BdID0gRElWNCgicGVyaXBoZXJhbF9jbGsiLCBGUlFDUiwgMCwgMHgxZmZmLCAwKSwKKwlbRElWNF9TSVVBXSA9IERJVjQoInNpdWFfY2xrIiwgU0NMS0FDUiwgMCwgMHgxZmZmLCAwKSwKKwlbRElWNF9TSVVCXSA9IERJVjQoInNpdWJfY2xrIiwgU0NMS0JDUiwgMCwgMHgxZmZmLCAwKSwKK307CisKK3N0cnVjdCBjbGsgZGl2Nl9jbGtzW10gPSB7CisJU0hfQ0xLX0RJVjYoInZpZGVvX2NsayIsICZwbGxfY2xrLCBWQ0xLQ1IsIDApLAorfTsKKworI2RlZmluZSBNU1RQKF9zdHIsIF9wYXJlbnQsIF9yZWcsIF9iaXQsIF9mbGFncykgXAorICBTSF9DTEtfTVNUUDMyKF9zdHIsIC0xLCBfcGFyZW50LCBfcmVnLCBfYml0LCBfZmxhZ3MpCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1zdHBfY2xrc1tdID0geworCU1TVFAoInRsYjAiLCAmZGl2NF9jbGtzW0RJVjRfSV0sIE1TVFBDUjAsIDMxLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCU1TVFAoImljMCIsICZkaXY0X2Nsa3NbRElWNF9JXSwgTVNUUENSMCwgMzAsIENMS19FTkFCTEVfT05fSU5JVCksCisJTVNUUCgib2MwIiwgJmRpdjRfY2xrc1tESVY0X0ldLCBNU1RQQ1IwLCAyOSwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlNU1RQKCJ1cmFtMCIsICZkaXY0X2Nsa3NbRElWNF9VXSwgTVNUUENSMCwgMjgsIENMS19FTkFCTEVfT05fSU5JVCksCisJTVNUUCgieHltZW0wIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IwLCAyNiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlNU1RQKCJpbnRjMyIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMjMsIDApLAorCU1TVFAoImludGMwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAyMiwgMCksCisJTVNUUCgiZG1hYzAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDIxLCAwKSwKKwlNU1RQKCJzaDAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDIwLCAwKSwKKwlNU1RQKCJodWRpMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTksIDApLAorCU1TVFAoInViYzAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDE3LCAwKSwKKwlNU1RQKCJ0bXUwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAxNSwgMCksCisJTVNUUCgiY210MCIsICZyX2NsaywgTVNUUENSMCwgMTQsIDApLAorCU1TVFAoInJ3ZHQwIiwgJnJfY2xrLCBNU1RQQ1IwLCAxMywgMCksCisJTVNUUCgibWZpMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTEsIDApLAorCU1TVFAoImZsY3RsMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTAsIDApLAorCU1TVFAoInNjaWYwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCA3LCAwKSwKKwlNU1RQKCJzY2lmMSIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgNiwgMCksCisJTVNUUCgic2NpZjIiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDUsIDApLAorCU1TVFAoInNjaWYzIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCA0LCAwKSwKKwlNU1RQKCJzaW8wIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAzLCAwKSwKKwlNU1RQKCJzaW9mMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMiwgMCksCisJTVNUUCgic2lvZjEiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDEsIDApLAorCisJTVNUUCgiaTJjMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMSwgOSwgMCksCisJTVNUUCgiaTJjMSIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMSwgOCwgMCksCisKKwlNU1RQKCJ0cHUwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IyLCAyNSwgMCksCisJTVNUUCgiaXJkYTAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjIsIDI0LCAwKSwKKwlNU1RQKCJzZGhpMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMTgsIDApLAorCU1TVFAoIm1tY2lmMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMTcsIDApLAorCU1TVFAoInNpbTAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjIsIDE2LCAwKSwKKwlNU1RQKCJrZXlzYzAiLCAmcl9jbGssIE1TVFBDUjIsIDE0LCAwKSwKKwlNU1RQKCJ0c2lmMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMTMsIDApLAorCU1TVFAoInMzZDQwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IyLCAxMiwgMCksCisJTVNUUCgidXNiZjAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjIsIDExLCAwKSwKKwlNU1RQKCJzaXUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCA4LCAwKSwKKwlNU1RQKCJqcHUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCA2LCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCU1TVFAoInZvdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDUsIDApLAorCU1TVFAoImJldTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDQsIDApLAorCU1TVFAoImNldTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDMsIDApLAorCU1TVFAoInZldTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDIsIENMS19FTkFCTEVfT05fSU5JVCksCisJTVNUUCgidnB1MCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMSwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlNU1RQKCJsY2RjMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMCwgMCksCit9OworCitpbnQgX19pbml0IGFyY2hfY2xrX2luaXQodm9pZCkKK3sKKwlpbnQgaywgcmV0ID0gMDsKKworCS8qIGF1dG9kZXRlY3QgZXh0YWwgb3IgZGxsIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoX19yYXdfcmVhZGwoUExMQ1IpICYgMHgxMDAwKQorCQlwbGxfY2xrLnBhcmVudCA9ICZkbGxfY2xrOworCWVsc2UKKwkJcGxsX2Nsay5wYXJlbnQgPSAmZXh0YWxfY2xrOworCisJZm9yIChrID0gMDsgIXJldCAmJiAoayA8IEFSUkFZX1NJWkUobWFpbl9jbGtzKSk7IGsrKykKKwkJcmV0ID0gY2xrX3JlZ2lzdGVyKG1haW5fY2xrc1trXSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2hfY2xrX2RpdjRfcmVnaXN0ZXIoZGl2NF9jbGtzLCBESVY0X05SLCAmZGl2NF90YWJsZSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2hfY2xrX2RpdjZfcmVnaXN0ZXIoZGl2Nl9jbGtzLCBBUlJBWV9TSVpFKGRpdjZfY2xrcykpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHNoX2Nsa19tc3RwMzJfcmVnaXN0ZXIobXN0cF9jbGtzLCBBUlJBWV9TSVpFKG1zdHBfY2xrcykpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM2Ni5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1ZWJhYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM2Ni5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzY2LmMKKyAqCisgKiBTSDczNjYgY2xvY2sgZnJhbWV3b3JrIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFnbnVzIERhbW0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisKKy8qIFNINzM2NiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRlJRQ1IJCTB4YTQxNTAwMDAKKyNkZWZpbmUgVkNMS0NSCQkweGE0MTUwMDA0CisjZGVmaW5lIFNDTEtBQ1IJCTB4YTQxNTAwMDgKKyNkZWZpbmUgU0NMS0JDUgkJMHhhNDE1MDAwYworI2RlZmluZSBQTExDUgkJMHhhNDE1MDAyNAorI2RlZmluZSBNU1RQQ1IwCQkweGE0MTUwMDMwCisjZGVmaW5lIE1TVFBDUjEJCTB4YTQxNTAwMzQKKyNkZWZpbmUgTVNUUENSMgkJMHhhNDE1MDAzOAorI2RlZmluZSBETExGUlEJCTB4YTQxNTAwNTAKKworLyogRml4ZWQgMzIgS0h6IHJvb3QgY2xvY2sgZm9yIFJUQyBhbmQgUG93ZXIgTWFuYWdlbWVudCBwdXJwb3NlcyAqLworc3RhdGljIHN0cnVjdCBjbGsgcl9jbGsgPSB7CisJLm5hbWUgICAgICAgICAgID0gInJjbGsiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5yYXRlICAgICAgICAgICA9IDMyNzY4LAorfTsKKworLyoKKyAqIERlZmF1bHQgcmF0ZSBmb3IgdGhlIHJvb3QgaW5wdXQgY2xvY2ssIHJlc2V0IHRoaXMgd2l0aCBjbGtfc2V0X3JhdGUoKQorICogZnJvbSB0aGUgcGxhdGZvcm0gY29kZS4KKyAqLworc3RydWN0IGNsayBleHRhbF9jbGsgPSB7CisJLm5hbWUJCT0gImV4dGFsIiwKKwkuaWQJCT0gLTEsCisJLnJhdGUJCT0gMzMzMzMzMzMsCit9OworCisvKiBUaGUgZGxsIGJsb2NrIG11bHRpcGxpZXMgdGhlIDMya2h6IHJfY2xrLCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIGV4dGFsICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkbGxfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIG11bHQ7CisKKwlpZiAoX19yYXdfcmVhZGwoUExMQ1IpICYgMHgxMDAwKQorCQltdWx0ID0gX19yYXdfcmVhZGwoRExMRlJRKTsKKwllbHNlCisJCW11bHQgPSAwOworCisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlICogbXVsdDsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIGRsbF9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gZGxsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGRsbF9jbGsgPSB7CisJLm5hbWUgICAgICAgICAgID0gImRsbF9jbGsiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5vcHMJCT0gJmRsbF9jbGtfb3BzLAorCS5wYXJlbnQJCT0gJnJfY2xrLAorCS5mbGFncwkJPSBDTEtfRU5BQkxFX09OX0lOSVQsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwbGxfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIG11bHQgPSAxOworCXVuc2lnbmVkIGxvbmcgZGl2ID0gMTsKKworCWlmIChfX3Jhd19yZWFkbChQTExDUikgJiAweDQwMDApCisJCW11bHQgPSAoKChfX3Jhd19yZWFkbChGUlFDUikgPj4gMjQpICYgMHgxZikgKyAxKTsKKwllbHNlCisJCWRpdiA9IDI7CisKKwlyZXR1cm4gKGNsay0+cGFyZW50LT5yYXRlICogbXVsdCkgLyBkaXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBwbGxfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IHBsbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBwbGxfY2xrID0geworCS5uYW1lCQk9ICJwbGxfY2xrIiwKKwkuaWQJCT0gLTEsCisJLm9wcwkJPSAmcGxsX2Nsa19vcHMsCisJLmZsYWdzCQk9IENMS19FTkFCTEVfT05fSU5JVCwKK307CisKK3N0cnVjdCBjbGsgKm1haW5fY2xrc1tdID0geworCSZyX2NsaywKKwkmZXh0YWxfY2xrLAorCSZkbGxfY2xrLAorCSZwbGxfY2xrLAorfTsKKworc3RhdGljIGludCBtdWx0aXBsaWVyc1tdID0geyAxLCAyLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH07CitzdGF0aWMgaW50IGRpdmlzb3JzW10gPSB7IDEsIDMsIDIsIDUsIDMsIDQsIDUsIDYsIDgsIDEwLCAxMiwgMTYsIDIwIH07CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl9tdWx0X3RhYmxlIGRpdjRfdGFibGUgPSB7CisJLmRpdmlzb3JzID0gZGl2aXNvcnMsCisJLm5yX2Rpdmlzb3JzID0gQVJSQVlfU0laRShkaXZpc29ycyksCisJLm11bHRpcGxpZXJzID0gbXVsdGlwbGllcnMsCisJLm5yX211bHRpcGxpZXJzID0gQVJSQVlfU0laRShtdWx0aXBsaWVycyksCit9OworCitlbnVtIHsgRElWNF9JLCBESVY0X1UsIERJVjRfU0gsIERJVjRfQiwgRElWNF9CMywgRElWNF9QLAorICAgICAgIERJVjRfU0lVQSwgRElWNF9TSVVCLCBESVY0X05SIH07CisKKyNkZWZpbmUgRElWNChfc3RyLCBfcmVnLCBfYml0LCBfbWFzaywgX2ZsYWdzKSBcCisgIFNIX0NMS19ESVY0KF9zdHIsICZwbGxfY2xrLCBfcmVnLCBfYml0LCBfbWFzaywgX2ZsYWdzKQorCitzdHJ1Y3QgY2xrIGRpdjRfY2xrc1tESVY0X05SXSA9IHsKKwlbRElWNF9JXSA9IERJVjQoImNwdV9jbGsiLCBGUlFDUiwgMjAsIDB4MWZlZiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlbRElWNF9VXSA9IERJVjQoInVtZW1fY2xrIiwgRlJRQ1IsIDE2LCAweDFmZmYsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfU0hdID0gRElWNCgic2h5d2F5X2NsayIsIEZSUUNSLCAxMiwgMHgxZmZmLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCVtESVY0X0JdID0gRElWNCgiYnVzX2NsayIsIEZSUUNSLCA4LCAweDFmZmYsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfQjNdID0gRElWNCgiYjNfY2xrIiwgRlJRQ1IsIDQsIDB4MWZmZiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlbRElWNF9QXSA9IERJVjQoInBlcmlwaGVyYWxfY2xrIiwgRlJRQ1IsIDAsIDB4MWZmZiwgMCksCisJW0RJVjRfU0lVQV0gPSBESVY0KCJzaXVhX2NsayIsIFNDTEtBQ1IsIDAsIDB4MWZmZiwgMCksCisJW0RJVjRfU0lVQl0gPSBESVY0KCJzaXViX2NsayIsIFNDTEtCQ1IsIDAsIDB4MWZmZiwgMCksCit9OworCitzdHJ1Y3QgY2xrIGRpdjZfY2xrc1tdID0geworCVNIX0NMS19ESVY2KCJ2aWRlb19jbGsiLCAmcGxsX2NsaywgVkNMS0NSLCAwKSwKK307CisKKyNkZWZpbmUgTVNUUChfc3RyLCBfcGFyZW50LCBfcmVnLCBfYml0LCBfZmxhZ3MpIFwKKyAgU0hfQ0xLX01TVFAzMihfc3RyLCAtMSwgX3BhcmVudCwgX3JlZywgX2JpdCwgX2ZsYWdzKQorCitzdGF0aWMgc3RydWN0IGNsayBtc3RwX2Nsa3NbXSA9IHsKKwkvKiBTZWUgcGFnZSA1MiBvZiBEYXRhc2hlZXQgVjAuNDA6IE92ZXJ2aWV3IC0+IEJsb2NrIERpYWdyYW0gKi8KKwlNU1RQKCJ0bGIwIiwgJmRpdjRfY2xrc1tESVY0X0ldLCBNU1RQQ1IwLCAzMSwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlNU1RQKCJpYzAiLCAmZGl2NF9jbGtzW0RJVjRfSV0sIE1TVFBDUjAsIDMwLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCU1TVFAoIm9jMCIsICZkaXY0X2Nsa3NbRElWNF9JXSwgTVNUUENSMCwgMjksIENMS19FTkFCTEVfT05fSU5JVCksCisJTVNUUCgicnNtZW0wIiwgJmRpdjRfY2xrc1tESVY0X1NIXSwgTVNUUENSMCwgMjgsIENMS19FTkFCTEVfT05fSU5JVCksCisJTVNUUCgieHltZW0wIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IwLCAyNiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlNU1RQKCJpbnRjMyIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMjMsIDApLAorCU1TVFAoImludGMwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAyMiwgMCksCisJTVNUUCgiZG1hYzAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDIxLCAwKSwKKwlNU1RQKCJzaDAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDIwLCAwKSwKKwlNU1RQKCJodWRpMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTksIDApLAorCU1TVFAoInViYzAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDE3LCAwKSwKKwlNU1RQKCJ0bXUwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAxNSwgMCksCisJTVNUUCgiY210MCIsICZyX2NsaywgTVNUUENSMCwgMTQsIDApLAorCU1TVFAoInJ3ZHQwIiwgJnJfY2xrLCBNU1RQQ1IwLCAxMywgMCksCisJTVNUUCgibWZpMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTEsIDApLAorCU1TVFAoImZsY3RsMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTAsIDApLAorCU1TVFAoInNjaWYwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCA3LCAwKSwKKwlNU1RQKCJzY2lmMSIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgNiwgMCksCisJTVNUUCgic2NpZjIiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDUsIDApLAorCU1TVFAoIm1zaW9mMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMiwgMCksCisJTVNUUCgic2JyMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMSwgMCksCisKKwlNU1RQKCJpMmMwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IxLCA5LCAwKSwKKworCU1TVFAoImljYjAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjIsIDI3LCAwKSwKKwlNU1RQKCJtZXJhbTAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjIsIDI2LCAwKSwKKwlNU1RQKCJkYWN5MSIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMjQsIDApLAorCU1TVFAoImRhY3kwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IyLCAyMywgMCksCisJTVNUUCgidHNpZjAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjIsIDIyLCAwKSwKKwlNU1RQKCJzZGhpMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMTgsIDApLAorCU1TVFAoIm1tY2lmMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMTcsIDApLAorCU1TVFAoInVzYmYwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IyLCAxMSwgMCksCisJTVNUUCgic2l1MCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgOSwgMCksCisJTVNUUCgidmV1MSIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgNywgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlNU1RQKCJ2b3UwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCA1LCAwKSwKKwlNU1RQKCJiZXUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCA0LCAwKSwKKwlNU1RQKCJjZXUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAzLCAwKSwKKwlNU1RQKCJ2ZXUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAyLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCU1TVFAoInZwdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDEsIENMS19FTkFCTEVfT05fSU5JVCksCisJTVNUUCgibGNkYzAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDAsIDApLAorfTsKKworaW50IF9faW5pdCBhcmNoX2Nsa19pbml0KHZvaWQpCit7CisJaW50IGssIHJldCA9IDA7CisKKwkvKiBhdXRvZGV0ZWN0IGV4dGFsIG9yIGRsbCBjb25maWd1cmF0aW9uICovCisJaWYgKF9fcmF3X3JlYWRsKFBMTENSKSAmIDB4MTAwMCkKKwkJcGxsX2Nsay5wYXJlbnQgPSAmZGxsX2NsazsKKwllbHNlCisJCXBsbF9jbGsucGFyZW50ID0gJmV4dGFsX2NsazsKKworCWZvciAoayA9IDA7ICFyZXQgJiYgKGsgPCBBUlJBWV9TSVpFKG1haW5fY2xrcykpOyBrKyspCisJCXJldCA9IGNsa19yZWdpc3RlcihtYWluX2Nsa3Nba10pOworCisJaWYgKCFyZXQpCisJCXJldCA9IHNoX2Nsa19kaXY0X3JlZ2lzdGVyKGRpdjRfY2xrcywgRElWNF9OUiwgJmRpdjRfdGFibGUpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHNoX2Nsa19kaXY2X3JlZ2lzdGVyKGRpdjZfY2xrcywgQVJSQVlfU0laRShkaXY2X2Nsa3MpKTsKKworCWlmICghcmV0KQorCQlyZXQgPSBzaF9jbGtfbXN0cDMyX3JlZ2lzdGVyKG1zdHBfY2xrcywgQVJSQVlfU0laRShtc3RwX2Nsa3MpKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMi5jCmluZGV4IDBlMTc0YWYuLjQwZjg1OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMi5jCkBAIC0xLDg0NCArMSwxOTcgQEAKIC8qCiAgKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjIuYwogICoKLSAqIFNINzM0MywgU0g3NzIyLCBTSDc3MjMgJiBTSDczNjYgc3VwcG9ydCBmb3IgdGhlIGNsb2NrIGZyYW1ld29yaworICogU0g3NzIyIGNsb2NrIGZyYW1ld29yayBzdXBwb3J0CiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgTm9tYWQgR2xvYmFsIFNvbHV0aW9ucyBJbmMKLSAqIEJhc2VkIG9uIGNvZGUgZm9yIHNoNzM0MyBieSBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTWFnbnVzIERhbW0KICAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9mcmVxLmg+CiAKLSNkZWZpbmUgTiAgKC0xKQotI2RlZmluZSBOTSAoLTIpCi0jZGVmaW5lIFJPVU5EX05FQVJFU1QgMAotI2RlZmluZSBST1VORF9ET1dOIC0xCi0jZGVmaW5lIFJPVU5EX1VQICAgKzEKKy8qIFNINzcyMiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgRlJRQ1IJCTB4YTQxNTAwMDAKKyNkZWZpbmUgVkNMS0NSCQkweGE0MTUwMDA0CisjZGVmaW5lIFNDTEtBQ1IJCTB4YTQxNTAwMDgKKyNkZWZpbmUgU0NMS0JDUgkJMHhhNDE1MDAwYworI2RlZmluZSBJUkRBQ0xLQ1IJMHhhNDE1MDAxOAorI2RlZmluZSBQTExDUgkJMHhhNDE1MDAyNAorI2RlZmluZSBNU1RQQ1IwCQkweGE0MTUwMDMwCisjZGVmaW5lIE1TVFBDUjEJCTB4YTQxNTAwMzQKKyNkZWZpbmUgTVNUUENSMgkJMHhhNDE1MDAzOAorI2RlZmluZSBETExGUlEJCTB4YTQxNTAwNTAKIAotc3RhdGljIGludCBhZGp1c3RfYWxnb3NbXVszXSA9IHsKLQl7fSwJLyogTk9fQ0hBTkdFICovCi0JeyBOTSwgTiwgMSB9LCAgIC8qIE46MSwgTjoxICovCi0JeyAzLCAyLCAyIH0sCS8qIDM6MjoyICovCi0JeyA1LCAyLCAyIH0sICAgIC8qIDU6MjoyICovCi0JeyBOLCAxLCAxIH0sCS8qIE46MToxICovCi0KLQl7IE4sIDEgfSwJLyogTjoxICovCi0KLQl7IE4sIDEgfSwJLyogTjoxICovCi0JeyAzLCAyIH0sCi0JeyA0LCAzIH0sCi0JeyA1LCA0IH0sCi0KLQl7IE4sIDEgfQotfTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYWRqdXN0X3BhaXJfb2ZfY2xvY2tzKHVuc2lnbmVkIGxvbmcgcjEsIHVuc2lnbmVkIGxvbmcgcjIsCi0JCQlpbnQgbTEsIGludCBtMiwgaW50IHJvdW5kX2ZsYWcpCi17Ci0JdW5zaWduZWQgbG9uZyByZW0sIGRpdjsKLQlpbnQgdGhlX29uZSA9IDA7Ci0KLQlwcl9kZWJ1ZyggIkFjdHVhbCB2YWx1ZXM6IHIxID0gJWxkXG4iLCByMSk7Ci0JcHJfZGVidWcoICIuLi4uLi4uLi4uLi4uLi5yMiA9ICVsZFxuIiwgcjIpOwotCi0JaWYgKG0xID09IG0yKSB7Ci0JCXIyID0gcjE7Ci0JCXByX2RlYnVnKCAic2V0dGluZyBlcXVhbCByYXRlczogcjIgbm93ICVsZFxuIiwgcjIpOwotCX0gZWxzZSBpZiAoKG0yID09IE4gICYmIG0xID09IDEpIHx8Ci0JCSAgIChtMiA9PSBOTSAmJiBtMSA9PSBOKSkgeyAvKiBOOjEgb3IgTk06TiAqLwotCQlwcl9kZWJ1ZyggIlNldHRpbmcgcmF0ZXMgYXMgMTpOIChOOk4qTSlcbiIpOwotCQlyZW0gPSByMiAlIHIxOwotCQlwcl9kZWJ1ZyggIi4uLnJlbWFpbmRlciA9ICVsZFxuIiwgcmVtKTsKLQkJaWYgKHJlbSkgewotCQkJZGl2ID0gcjIgLyByMTsKLQkJCXByX2RlYnVnKCAiLi4uZGl2ID0gJWxkXG4iLCBkaXYpOwotCQkJc3dpdGNoIChyb3VuZF9mbGFnKSB7Ci0JCQljYXNlIFJPVU5EX05FQVJFU1Q6Ci0JCQkJdGhlX29uZSA9IHJlbSA+PSByMS8yID8gMSA6IDA7IGJyZWFrOwotCQkJY2FzZSBST1VORF9VUDoKLQkJCQl0aGVfb25lID0gMTsgYnJlYWs7Ci0JCQljYXNlIFJPVU5EX0RPV046Ci0JCQkJdGhlX29uZSA9IDA7IGJyZWFrOwotCQkJfQotCi0JCQlyMiA9IHIxICogKGRpdiArIHRoZV9vbmUpOwotCQkJcHJfZGVidWcoICIuLi5zZXR0aW5nIHIyIHRvICVsZFxuIiwgcjIpOwotCQl9Ci0JfSBlbHNlIGlmICgobTIgPT0gMSAgJiYgbTEgPT0gTikgfHwKLQkJICAgKG0yID09IE4gJiYgbTEgPT0gTk0pKSB7IC8qIDE6TiBvciBOOk5NICovCi0JCXByX2RlYnVnKCAiU2V0dGluZyByYXRlcyBhcyBOOjEgKE4qTTpOKVxuIik7Ci0JCXJlbSA9IHIxICUgcjI7Ci0JCXByX2RlYnVnKCAiLi4ucmVtYWluZGVyID0gJWxkXG4iLCByZW0pOwotCQlpZiAocmVtKSB7Ci0JCQlkaXYgPSByMSAvIHIyOwotCQkJcHJfZGVidWcoICIuLi5kaXYgPSAlbGRcbiIsIGRpdik7Ci0JCQlzd2l0Y2ggKHJvdW5kX2ZsYWcpIHsKLQkJCWNhc2UgUk9VTkRfTkVBUkVTVDoKLQkJCQl0aGVfb25lID0gcmVtID4gcjIvMiA/IDEgOiAwOyBicmVhazsKLQkJCWNhc2UgUk9VTkRfVVA6Ci0JCQkJdGhlX29uZSA9IDA7IGJyZWFrOwotCQkJY2FzZSBST1VORF9ET1dOOgotCQkJCXRoZV9vbmUgPSAxOyBicmVhazsKLQkJCX0KLQotCQkJcjIgPSByMSAvIChkaXYgKyB0aGVfb25lKTsKLQkJCXByX2RlYnVnKCAiLi4uc2V0dGluZyByMiB0byAlbGRcbiIsIHIyKTsKLQkJfQotCX0gZWxzZSB7IC8qIHZhbHVlOnZhbHVlICovCi0JCXByX2RlYnVnKCAiU2V0dGluZyByYXRlcyBhcyAlZDolZFxuIiwgbTEsIG0yKTsKLQkJZGl2ID0gcjEgLyBtMTsKLQkJcjIgPSBkaXYgKiBtMjsKLQkJcHJfZGVidWcoICIuLi5kaXYgPSAlbGRcbiIsIGRpdik7Ci0JCXByX2RlYnVnKCAiLi4uc2V0dGluZyByMiB0byAlbGRcbiIsIHIyKTsKLQl9Ci0KLQlyZXR1cm4gcjI7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkanVzdF9jbG9ja3MoaW50IG9yaWdpbmF0ZSwgaW50ICpsLCB1bnNpZ25lZCBsb25nIHZbXSwKLQkJCSAgaW50IG5faW5fbGluZSkKLXsKLQlpbnQgeDsKLQotCXByX2RlYnVnKCAiR28gZG93biBmcm9tICVkLi4uXG4iLCBvcmlnaW5hdGUpOwotCS8qIGdvIHVwIHJlY2FsY3VsYXRpb24gY2xvY2tzICovCi0JZm9yICh4ID0gb3JpZ2luYXRlOyB4PjA7IHggLS0gKQotCQl2W3gtMV0gPSBhZGp1c3RfcGFpcl9vZl9jbG9ja3Modlt4XSwgdlt4LTFdLAotCQkJCQlsW3hdLCBsW3gtMV0sCi0JCQkJCVJPVU5EX1VQKTsKLQotCXByX2RlYnVnKCAiR28gdXAgZnJvbSAlZC4uLlxuIiwgb3JpZ2luYXRlKTsKLQkvKiBnbyBkb3duIHJlY2FsY3VsYXRpb24gY2xvY2tzICovCi0JZm9yICh4ID0gb3JpZ2luYXRlOyB4PG5faW5fbGluZSAtIDE7IHggKysgKQotCQl2W3grMV0gPSBhZGp1c3RfcGFpcl9vZl9jbG9ja3Modlt4XSwgdlt4KzFdLAotCQkJCQlsW3hdLCBsW3grMV0sCi0JCQkJCVJPVU5EX1VQKTsKLX0KLQotCi0vKgotICogU0g3NzIyIHVzZXMgYSBjb21tb24gc2V0IG9mIG11bHRpcGxpZXJzIGFuZCBkaXZpc29ycywgc28gdGhpcwotICogaXMgcXVpdGUgc2ltcGxlLi4KLSAqLwotCi0vKgotICogSW5zdGVhZCBvZiBoYXZpbmcgdHdvIHNlcGFyYXRlIG11bHRpcGxpZXJzL2Rpdmlzb3JzIHNldCwgbGlrZSB0aGlzOgotICoKLSAqIHN0YXRpYyBpbnQgbXVsdGlwbGllcnNbXSA9IHsgMSwgMiwgMSwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9OwotICogc3RhdGljIGludCBkaXZpc29yc1tdID0geyAxLCAzLCAyLCA1LCAzLCA0LCA1LCA2LCA4LCAxMCwgMTIsIDE2LCAyMCB9OwotICoKLSAqIEkgY3JlYXRlZCB0aGUgZGl2aXNvcnMyIGFycmF5LCB3aGljaCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSByYXRlIGxpa2UKLSAqICAgcmF0ZSA9IHBhcmVudCAqIDIgLyBkaXZpc29yczJbIGRpdmlzb3IgXTsKLSovCi1zdGF0aWMgaW50IGRpdmlzb3JzMltdID0geyAyLCAzLCA0LCA1LCA2LCA4LCAxMCwgMTIsIDE2LCAyMCwgMjQsIDMyLCA0MCB9OwotCi1zdGF0aWMgdm9pZCBtYXN0ZXJfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdW5zaWduZWQgZnJxY3IgPSBjdHJsX2lubChGUlFDUik7Ci0KLQljbGstPnJhdGUgPSBDT05GSUdfU0hfUENMS19GUkVRICogKCgoZnJxY3IgPj4gMjQpICYgMHgxZikgKyAxKTsKLX0KLQotc3RhdGljIHZvaWQgbWFzdGVyX2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKLXsKLQljbGstPnBhcmVudCA9IE5VTEw7Ci0JY2xrLT5mbGFncyB8PSBDTEtfUkFURV9QUk9QQUdBVEVTOwotCWNsay0+cmF0ZSA9IENPTkZJR19TSF9QQ0xLX0ZSRVE7Ci0JbWFzdGVyX2Nsa19yZWNhbGMoY2xrKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdW5zaWduZWQgbG9uZyBmcnFjciA9IGN0cmxfaW5sKEZSUUNSKTsKLQotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gKCgoZnJxY3IgPj4gMjQpICYgMHgxZikgKyAxKTsKLX0KLQotc3RhdGljIGludCBtYXN0ZXJfY2xrX3NldHJhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUsIGludCBpZCkKLXsKLQlpbnQgZGl2ID0gcmF0ZSAvIGNsay0+cmF0ZTsKLQlpbnQgbWFzdGVyX2RpdnNbXSA9IHsgMiwgMywgNCwgNiwgOCwgMTYgfTsKLQlpbnQgaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmcnFjcjsKLQotCWZvciAoaW5kZXggPSAxOyBpbmRleCA8IEFSUkFZX1NJWkUobWFzdGVyX2RpdnMpOyBpbmRleCsrKQotCQlpZiAoZGl2ID49IG1hc3Rlcl9kaXZzW2luZGV4IC0gMV0gJiYgZGl2IDwgbWFzdGVyX2RpdnNbaW5kZXhdKQotCQkJYnJlYWs7Ci0KLQlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShtYXN0ZXJfZGl2cykpCi0JCWluZGV4ID0gQVJSQVlfU0laRShtYXN0ZXJfZGl2cyk7Ci0JZGl2ID0gbWFzdGVyX2RpdnNbaW5kZXggLSAxXTsKLQotCWZycWNyID0gY3RybF9pbmwoRlJRQ1IpOwotCWZycWNyICY9IH4oMHhGIDw8IDI0KTsKLQlmcnFjciB8PSAoIChkaXYtMSkgPDwgMjQpOwotCWN0cmxfb3V0bChmcnFjciwgRlJRQ1IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MjJfbWFzdGVyX2Nsa19vcHMgPSB7Ci0JLmluaXQgPSBtYXN0ZXJfY2xrX2luaXQsCi0JLnJlY2FsYyA9IG1hc3Rlcl9jbGtfcmVjYWxjLAotCS5zZXRfcmF0ZSA9IG1hc3Rlcl9jbGtfc2V0cmF0ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MjJfbW9kdWxlX2Nsa19vcHMgPSB7Ci0gICAgICAgLnJlY2FsYyA9IG1vZHVsZV9jbGtfcmVjYWxjLAotfTsKLQotc3RydWN0IGZycWNyX2NvbnRleHQgewotCXVuc2lnbmVkIG1hc2s7Ci0JdW5zaWduZWQgc2hpZnQ7Ci19OwotCi1zdHJ1Y3QgZnJxY3JfY29udGV4dCBzaDc3MjJfZ2V0X2Nsa19jb250ZXh0KGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGZycWNyX2NvbnRleHQgY3R4ID0geyAwLCB9OwotCi0JaWYgKCFzdHJjbXAobmFtZSwgInBlcmlwaGVyYWxfY2xrIikpIHsKLQkJY3R4LnNoaWZ0ID0gMDsKLQkJY3R4Lm1hc2sgPSAweEY7Ci0JfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJzZHJhbV9jbGsiKSkgewotCQljdHguc2hpZnQgPSA0OwotCQljdHgubWFzayA9IDB4RjsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImJ1c19jbGsiKSkgewotCQljdHguc2hpZnQgPSA4OwotCQljdHgubWFzayA9IDB4RjsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInNoX2NsayIpKSB7Ci0JCWN0eC5zaGlmdCA9IDEyOwotCQljdHgubWFzayA9IDB4RjsKLQl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgInVtZW1fY2xrIikpIHsKLQkJY3R4LnNoaWZ0ID0gMTY7Ci0JCWN0eC5tYXNrID0gMHhGOwotCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiY3B1X2NsayIpKSB7Ci0JCWN0eC5zaGlmdCA9IDIwOwotCQljdHgubWFzayA9IDc7Ci0JfQotCXJldHVybiBjdHg7Ci19Ci0KLS8qKgotICogc2g3NzIyX2ZpbmRfZGl2X2luZGV4IC0gZmluZCBkaXZpc29yIGZvciBzZXR0aW5nIHJhdGUKLSAqCi0gKiBBbGwgc2g3NzIyIGNsb2NrcyB1c2UgdGhlIHNhbWUgc2V0IG9mIG11bHRpcGxpZXJzL2Rpdmlzb3JzLiBUaGlzIGZ1bmN0aW9uCi0gKiBjaG9vc2VzIGNvcnJlY3QgZGl2aXNvciB0byBzZXQgdGhlIHJhdGUgb2YgY2xvY2sgd2l0aCBwYXJlbnQgY2xvY2sgdGhhdAotICogZ2VuZXJhdGVzIGZyZXF1ZW5jeSBvZiAncGFyZW50X3JhdGUnCi0gKgotICogQHBhcmVudF9yYXRlOiByYXRlIG9mIHBhcmVudCBjbG9jawotICogQHJhdGU6IHJlcXVlc3RlZCByYXRlIHRvIGJlIHNldAotICovCi1zdGF0aWMgaW50IHNoNzcyMl9maW5kX2Rpdl9pbmRleCh1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlLCB1bnNpZ25lZCByYXRlKQotewotCXVuc2lnbmVkIGRpdjIgPSBwYXJlbnRfcmF0ZSAqIDIgLyByYXRlOwotCWludCBpbmRleDsKLQotCWlmIChyYXRlID4gcGFyZW50X3JhdGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpbmRleCA9IDE7IGluZGV4IDwgQVJSQVlfU0laRShkaXZpc29yczIpOyBpbmRleCsrKSB7Ci0JCWlmIChkaXYyID4gZGl2aXNvcnMyW2luZGV4IC0gMV0gJiYgZGl2MiA8PSBkaXZpc29yczJbaW5kZXhdKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKGRpdmlzb3JzMikpCi0JCWluZGV4ID0gQVJSQVlfU0laRShkaXZpc29yczIpIC0gMTsKLQlyZXR1cm4gaW5kZXg7Ci19Ci0KLXN0YXRpYyB2b2lkIHNoNzcyMl9mcnFjcl9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQotewotCXN0cnVjdCBmcnFjcl9jb250ZXh0IGN0eCA9IHNoNzcyMl9nZXRfY2xrX2NvbnRleHQoY2xrLT5uYW1lKTsKLQl1bnNpZ25lZCBsb25nIGZycWNyID0gY3RybF9pbmwoRlJRQ1IpOwotCWludCBpbmRleDsKLQotCWluZGV4ID0gKGZycWNyID4+IGN0eC5zaGlmdCkgJiBjdHgubWFzazsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAqIDIgLyBkaXZpc29yczJbaW5kZXhdOwotfQotCi1zdGF0aWMgaW50IHNoNzcyMl9mcnFjcl9zZXRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSwKLQkJCQkgaW50IGFsZ29faWQpCi17Ci0Jc3RydWN0IGZycWNyX2NvbnRleHQgY3R4ID0gc2g3NzIyX2dldF9jbGtfY29udGV4dChjbGstPm5hbWUpOwotCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGstPnBhcmVudC0+cmF0ZTsKLQlpbnQgZGl2OwotCXVuc2lnbmVkIGxvbmcgZnJxY3I7Ci0JaW50IGVyciA9IDA7Ci0KLQkvKiBwcmV0dHkgaW52YWxpZCAqLwotCWlmIChwYXJlbnRfcmF0ZSA8IHJhdGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogbG9vayBmb3IgbXVsdGlwbGllci9kaXZpc29yIHBhaXIgKi8KLQlkaXYgPSBzaDc3MjJfZmluZF9kaXZfaW5kZXgocGFyZW50X3JhdGUsIHJhdGUpOwotCWlmIChkaXY8MCkKLQkJcmV0dXJuIGRpdjsKLQotCS8qIGNhbGN1bGF0ZSBuZXcgdmFsdWUgb2YgY2xvY2sgcmF0ZSAqLwotCWNsay0+cmF0ZSA9IHBhcmVudF9yYXRlICogMiAvIGRpdmlzb3JzMltkaXZdOwotCWZycWNyID0gY3RybF9pbmwoRlJRQ1IpOwotCi0JLyogRklYTUU6IGFkanVzdCBhcyBhbGdvX2lkIHNwZWNpZmllcyAqLwotCWlmIChhbGdvX2lkICE9IE5PX0NIQU5HRSkgewotCQlpbnQgb3JpZ2luYXRvcjsKLQkJY2hhciAqYWxnb19ncm91cF8xW10gPSB7ICJjcHVfY2xrIiwgInVtZW1fY2xrIiwgInNoX2NsayIgfTsKLQkJY2hhciAqYWxnb19ncm91cF8yW10gPSB7ICJzaF9jbGsiLCAiYnVzX2NsayIgfTsKLQkJY2hhciAqYWxnb19ncm91cF8zW10gPSB7ICJzaF9jbGsiLCAic2RyYW1fY2xrIiB9OwotCQljaGFyICphbGdvX2dyb3VwXzRbXSA9IHsgImJ1c19jbGsiLCAicGVyaXBoZXJhbF9jbGsiIH07Ci0JCWNoYXIgKmFsZ29fZ3JvdXBfNVtdID0geyAiY3B1X2NsayIsICJwZXJpcGhlcmFsX2NsayIgfTsKLQkJY2hhciAqKmFsZ29fY3VycmVudCA9IE5VTEw7Ci0JCS8qIDMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNsb2NrcyBpbiByZWxhdGlvbiAqLwotCQlzdHJ1Y3QgY2xrICpja1szXTsKLQkJdW5zaWduZWQgbG9uZyB2YWx1ZXNbM107IC8qIHRoZSBzYW1lIGNvbW1lbnQgYXMgYWJvdmUgKi8KLQkJaW50IHBhcnRfbGVuZ3RoID0gLTE7Ci0JCWludCBpOwotCi0JCS8qCi0JCSAqIGFsbCB0aGUgc3RlcHMgYmVsb3cgb25seSByZXF1aXJlZCBpZiBhZGp1c3Rpb24gd2FzCi0JCSAqIHJlcXVlc3RlZAotCQkgKi8KLQkJaWYgKGFsZ29faWQgPT0gSVVTX04xX04xIHx8Ci0JCSAgICBhbGdvX2lkID09IElVU18zMjIgfHwKLQkJICAgIGFsZ29faWQgPT0gSVVTXzUyMiB8fAotCQkgICAgYWxnb19pZCA9PSBJVVNfTjExKSB7Ci0JCQlhbGdvX2N1cnJlbnQgPSBhbGdvX2dyb3VwXzE7Ci0JCQlwYXJ0X2xlbmd0aCA9IDM7Ci0JCX0KLQkJaWYgKGFsZ29faWQgPT0gU0JfTjEpIHsKLQkJCWFsZ29fY3VycmVudCA9IGFsZ29fZ3JvdXBfMjsKLQkJCXBhcnRfbGVuZ3RoID0gMjsKLQkJfQotCQlpZiAoYWxnb19pZCA9PSBTQjNfTjEgfHwKLQkJICAgIGFsZ29faWQgPT0gU0IzXzMyIHx8Ci0JCSAgICBhbGdvX2lkID09IFNCM180MyB8fAotCQkgICAgYWxnb19pZCA9PSBTQjNfNTQpIHsKLQkJCWFsZ29fY3VycmVudCA9IGFsZ29fZ3JvdXBfMzsKLQkJCXBhcnRfbGVuZ3RoID0gMjsKLQkJfQotCQlpZiAoYWxnb19pZCA9PSBCUF9OMSkgewotCQkJYWxnb19jdXJyZW50ID0gYWxnb19ncm91cF80OwotCQkJcGFydF9sZW5ndGggPSAyOwotCQl9Ci0JCWlmIChhbGdvX2lkID09IElQX04xKSB7Ci0JCQlhbGdvX2N1cnJlbnQgPSBhbGdvX2dyb3VwXzU7Ci0JCQlwYXJ0X2xlbmd0aCA9IDI7Ci0JCX0KLQkJaWYgKCFhbGdvX2N1cnJlbnQpCi0JCQlnb3RvIGluY29ycmVjdF9hbGdvX2lkOwotCi0JCW9yaWdpbmF0b3IgPSAtMTsKLQkJZm9yIChpID0gMDsgaSA8IHBhcnRfbGVuZ3RoOyBpICsrICkgewotCQkJaWYgKG9yaWdpbmF0b3IgPj0gMCAmJiAhc3RyY21wKGNsay0+bmFtZSwKLQkJCQkJCSAgICAgICBhbGdvX2N1cnJlbnRbaV0pKQotCQkJCW9yaWdpbmF0b3IgPSBpOwotCQkJY2tbaV0gPSBjbGtfZ2V0KE5VTEwsIGFsZ29fY3VycmVudFtpXSk7Ci0JCQl2YWx1ZXNbaV0gPSBjbGtfZ2V0X3JhdGUoY2tbaV0pOwotCQl9Ci0KLQkJaWYgKG9yaWdpbmF0b3IgPj0gMCkKLQkJCWFkanVzdF9jbG9ja3Mob3JpZ2luYXRvciwgYWRqdXN0X2FsZ29zW2FsZ29faWRdLAotCQkJCSAgICAgIHZhbHVlcywgcGFydF9sZW5ndGgpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBwYXJ0X2xlbmd0aDsgaSArKyApIHsKLQkJCXN0cnVjdCBmcnFjcl9jb250ZXh0IHBhcnRfY3R4OwotCQkJaW50IHBhcnRfZGl2OwotCi0JCQlpZiAobGlrZWx5KCFlcnIpKSB7Ci0JCQkJcGFydF9kaXYgPSBzaDc3MjJfZmluZF9kaXZfaW5kZXgocGFyZW50X3JhdGUsCi0JCQkJCQkJCXJhdGUpOwotCQkJCWlmIChwYXJ0X2RpdiA+IDApIHsKLQkJCQkJcGFydF9jdHggPSBzaDc3MjJfZ2V0X2Nsa19jb250ZXh0KAotCQkJCQkJCQlja1tpXS0+bmFtZSk7Ci0JCQkJCWZycWNyICY9IH4ocGFydF9jdHgubWFzayA8PAotCQkJCQkJICAgcGFydF9jdHguc2hpZnQpOwotCQkJCQlmcnFjciB8PSBwYXJ0X2RpdiA8PCBwYXJ0X2N0eC5zaGlmdDsKLQkJCQl9IGVsc2UKLQkJCQkJZXJyID0gcGFydF9kaXY7Ci0JCQl9Ci0KLQkJCWNrW2ldLT5vcHMtPnJlY2FsYyhja1tpXSk7Ci0JCQljbGtfcHV0KGNrW2ldKTsKLQkJfQotCX0KLQotCS8qIHdhcyB0aGVyZSBhbnkgZXJyb3IgZHVyaW5nIHJlY2FsY3VsYXRpb24gPyBJZiBzbywgYmFpbCBvdXQuLiAqLwotCWlmICh1bmxpa2VseShlcnIhPTApKQotCQlnb3RvIG91dF9lcnI7Ci0KLQkvKiBjbGVhciBGUlFDUiBiaXRzICovCi0JZnJxY3IgJj0gfihjdHgubWFzayA8PCBjdHguc2hpZnQpOwotCWZycWNyIHw9IGRpdiA8PCBjdHguc2hpZnQ7Ci0KLQkvKiAuLi5hbmQgcGVyZm9ybSBhY3R1YWwgY2hhbmdlICovCi0JY3RybF9vdXRsKGZycWNyLCBGUlFDUik7Ci0JcmV0dXJuIDA7Ci0KLWluY29ycmVjdF9hbGdvX2lkOgotCXJldHVybiAtRUlOVkFMOwotb3V0X2VycjoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgbG9uZyBzaDc3MjJfZnJxY3Jfcm91bmRfcmF0ZShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGU7Ci0JaW50IGRpdjsKLQotCS8qIGxvb2sgZm9yIG11bHRpcGxpZXIvZGl2aXNvciBwYWlyICovCi0JZGl2ID0gc2g3NzIyX2ZpbmRfZGl2X2luZGV4KHBhcmVudF9yYXRlLCByYXRlKTsKLQlpZiAoZGl2IDwgMCkKLQkJcmV0dXJuIGNsay0+cmF0ZTsKLQotCS8qIGNhbGN1bGF0ZSBuZXcgdmFsdWUgb2YgY2xvY2sgcmF0ZSAqLwotCXJldHVybiBwYXJlbnRfcmF0ZSAqIDIgLyBkaXZpc29yczJbZGl2XTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcyMl9mcnFjcl9jbGtfb3BzID0gewotCS5yZWNhbGMgPSBzaDc3MjJfZnJxY3JfcmVjYWxjLAotCS5zZXRfcmF0ZSA9IHNoNzcyMl9mcnFjcl9zZXRfcmF0ZSwKLQkucm91bmRfcmF0ZSA9IHNoNzcyMl9mcnFjcl9yb3VuZF9yYXRlLAorLyogRml4ZWQgMzIgS0h6IHJvb3QgY2xvY2sgZm9yIFJUQyBhbmQgUG93ZXIgTWFuYWdlbWVudCBwdXJwb3NlcyAqLworc3RhdGljIHN0cnVjdCBjbGsgcl9jbGsgPSB7CisJLm5hbWUgICAgICAgICAgID0gInJjbGsiLAorCS5pZCAgICAgICAgICAgICA9IC0xLAorCS5yYXRlICAgICAgICAgICA9IDMyNzY4LAogfTsKIAogLyoKLSAqIGNsb2NrIG9wcyBtZXRob2RzIGZvciBTSVUgQS9CIGFuZCBJckRBIGNsb2NrCi0gKgorICogRGVmYXVsdCByYXRlIGZvciB0aGUgcm9vdCBpbnB1dCBjbG9jaywgcmVzZXQgdGhpcyB3aXRoIGNsa19zZXRfcmF0ZSgpCisgKiBmcm9tIHRoZSBwbGF0Zm9ybSBjb2RlLgogICovCitzdHJ1Y3QgY2xrIGV4dGFsX2NsayA9IHsKKwkubmFtZQkJPSAiZXh0YWwiLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAzMzMzMzMzMywKK307CiAKLSNpZm5kZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MwotCi1zdGF0aWMgaW50IHNoNzcyMl9zaXVfc2V0X3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUsIGludCBhbGdvX2lkKQorLyogVGhlIGRsbCBibG9jayBtdWx0aXBsaWVzIHRoZSAzMmtoeiByX2NsaywgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiBleHRhbCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGxsX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JdW5zaWduZWQgbG9uZyByOwotCWludCBkaXY7CisJdW5zaWduZWQgbG9uZyBtdWx0OwogCi0JciA9IGN0cmxfaW5sKGNsay0+YXJjaF9mbGFncyk7Ci0JZGl2ID0gc2g3NzIyX2ZpbmRfZGl2X2luZGV4KGNsay0+cGFyZW50LT5yYXRlLCByYXRlKTsKLQlpZiAoZGl2IDwgMCkKLQkJcmV0dXJuIGRpdjsKLQlyID0gKHIgJiB+MHhGKSB8IGRpdjsKLQljdHJsX291dGwociwgY2xrLT5hcmNoX2ZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2g3NzIyX3NpdV9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgcjsKLQotCXIgPSBjdHJsX2lubChjbGstPmFyY2hfZmxhZ3MpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlICogMiAvIGRpdmlzb3JzMltyICYgMHhGXTsKLX0KLQotc3RhdGljIGludCBzaDc3MjJfc2l1X3N0YXJ0X3N0b3Aoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQotewotCXVuc2lnbmVkIGxvbmcgcjsKLQotCXIgPSBjdHJsX2lubChjbGstPmFyY2hfZmxhZ3MpOwotCWlmIChlbmFibGUpCi0JCWN0cmxfb3V0bChyICYgfigxIDw8IDgpLCBjbGstPmFyY2hfZmxhZ3MpOworCWlmIChfX3Jhd19yZWFkbChQTExDUikgJiAweDEwMDApCisJCW11bHQgPSBfX3Jhd19yZWFkbChETExGUlEpOwogCWVsc2UKLQkJY3RybF9vdXRsKHIgfCAoMSA8PCA4KSwgY2xrLT5hcmNoX2ZsYWdzKTsKLQlyZXR1cm4gMDsKKwkJbXVsdCA9IDA7CisKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgKiBtdWx0OwogfQogCi1zdGF0aWMgdm9pZCBzaDc3MjJfc2l1X2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgc3RydWN0IGNsa19vcHMgZGxsX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBkbGxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZGxsX2NsayA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiZGxsX2NsayIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLm9wcwkJPSAmZGxsX2Nsa19vcHMsCisJLnBhcmVudAkJPSAmcl9jbGssCisJLmZsYWdzCQk9IENMS19FTkFCTEVfT05fSU5JVCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsbF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewotCXNoNzcyMl9zaXVfc3RhcnRfc3RvcChjbGssIDEpOwotfQorCXVuc2lnbmVkIGxvbmcgbXVsdCA9IDE7CisJdW5zaWduZWQgbG9uZyBkaXYgPSAxOwogCi1zdGF0aWMgdm9pZCBzaDc3MjJfc2l1X2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQotewotCXNoNzcyMl9zaXVfc3RhcnRfc3RvcChjbGssIDApOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzIyX3NpdV9jbGtfb3BzID0gewotCS5yZWNhbGMgPSBzaDc3MjJfc2l1X3JlY2FsYywKLQkuc2V0X3JhdGUgPSBzaDc3MjJfc2l1X3NldF9yYXRlLAotCS5lbmFibGUgPSBzaDc3MjJfc2l1X2VuYWJsZSwKLQkuZGlzYWJsZSA9IHNoNzcyMl9zaXVfZGlzYWJsZSwKLX07Ci0KLSNlbmRpZiAvKiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzICovCi0KLXN0YXRpYyB2b2lkIHNoNzcyMl92aWRlb19lbmFibGUoc3RydWN0IGNsayAqY2xrKQotewotCXVuc2lnbmVkIGxvbmcgcjsKLQotCXIgPSBjdHJsX2lubChWQ0xLQ1IpOwotCWN0cmxfb3V0bCggciAmIH4oMTw8OCksIFZDTEtDUik7Ci19Ci0KLXN0YXRpYyB2b2lkIHNoNzcyMl92aWRlb19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHI7Ci0KLQlyID0gY3RybF9pbmwoVkNMS0NSKTsKLQljdHJsX291dGwoIHIgfCAoMTw8OCksIFZDTEtDUik7Ci19Ci0KLXN0YXRpYyBpbnQgc2g3NzIyX3ZpZGVvX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlLAotCQkJCSBpbnQgYWxnb19pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHI7Ci0KLQlyID0gY3RybF9pbmwoVkNMS0NSKTsKLQlyICY9IH4weDNGOwotCXIgfD0gKChjbGstPnBhcmVudC0+cmF0ZSAvIHJhdGUgLSAxKSAmIDB4M0YpOwotCWN0cmxfb3V0bChyLCBWQ0xLQ1IpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaDc3MjJfdmlkZW9fcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1bnNpZ25lZCBsb25nIHI7Ci0KLQlyID0gY3RybF9pbmwoVkNMS0NSKTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvICgociAmIDB4M0YpICsgMSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MjJfdmlkZW9fY2xrX29wcyA9IHsKLQkucmVjYWxjID0gc2g3NzIyX3ZpZGVvX3JlY2FsYywKLQkuc2V0X3JhdGUgPSBzaDc3MjJfdmlkZW9fc2V0X3JhdGUsCi0JLmVuYWJsZSA9IHNoNzcyMl92aWRlb19lbmFibGUsCi0JLmRpc2FibGUgPSBzaDc3MjJfdmlkZW9fZGlzYWJsZSwKLX07Ci0vKgotICogYW5kIGF0IGxhc3QsIGNsb2NrIGRlZmluaXRpb25zIHRoZW1zZWx2ZXMKLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgc2g3NzIyX3VtZW1fY2xvY2sgPSB7Ci0JLm5hbWUgPSAidW1lbV9jbGsiLAotCS5vcHMgPSAmc2g3NzIyX2ZycWNyX2Nsa19vcHMsCi0JLmZsYWdzID0gQ0xLX1JBVEVfUFJPUEFHQVRFUywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNoNzcyMl9zaF9jbG9jayA9IHsKLQkubmFtZSA9ICJzaF9jbGsiLAotCS5vcHMgPSAmc2g3NzIyX2ZycWNyX2Nsa19vcHMsCi0JLmZsYWdzID0gQ0xLX1JBVEVfUFJPUEFHQVRFUywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNoNzcyMl9wZXJpcGhlcmFsX2Nsb2NrID0gewotCS5uYW1lID0gInBlcmlwaGVyYWxfY2xrIiwKLQkub3BzID0gJnNoNzcyMl9mcnFjcl9jbGtfb3BzLAotCS5mbGFncyA9IENMS19SQVRFX1BST1BBR0FURVMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzaDc3MjJfc2RyYW1fY2xvY2sgPSB7Ci0JLm5hbWUgPSAic2RyYW1fY2xrIiwKLQkub3BzID0gJnNoNzcyMl9mcnFjcl9jbGtfb3BzLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2g3NzIyX3JfY2xvY2sgPSB7Ci0JLm5hbWUgPSAicl9jbGsiLAotCS5yYXRlID0gMzI3NjgsCi0JLmZsYWdzID0gQ0xLX1JBVEVfUFJPUEFHQVRFUywKLX07Ci0KLSNpZm5kZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MwotCi0vKgotICogdGhlc2UgdGhyZWUgY2xvY2tzIC0gU0lVIEEsIFNJVSBCLCBJckRBIC0gc2hhcmUgdGhlIHNhbWUgY2xrX29wcwotICogbWV0aG9kcyBvZiBjbGtfb3BzIGRldGVybWluZSB3aGljaCByZWdpc3RlciB0aGV5IHNob3VsZCBhY2Nlc3MgYnkKLSAqIGV4YW1pbmluZyBjbGstPm5hbWUgZmllbGQKLSAqLwotc3RhdGljIHN0cnVjdCBjbGsgc2g3NzIyX3NpdV9hX2Nsb2NrID0gewotCS5uYW1lID0gInNpdV9hX2NsayIsCi0JLmFyY2hfZmxhZ3MgPSBTQ0xLQUNSLAotCS5vcHMgPSAmc2g3NzIyX3NpdV9jbGtfb3BzLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2g3NzIyX3NpdV9iX2Nsb2NrID0gewotCS5uYW1lID0gInNpdV9iX2NsayIsCi0JLmFyY2hfZmxhZ3MgPSBTQ0xLQkNSLAotCS5vcHMgPSAmc2g3NzIyX3NpdV9jbGtfb3BzLAotfTsKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikKLXN0YXRpYyBzdHJ1Y3QgY2xrIHNoNzcyMl9pcmRhX2Nsb2NrID0gewotCS5uYW1lID0gImlyZGFfY2xrIiwKLQkuYXJjaF9mbGFncyA9IElyREFDTEtDUiwKLQkub3BzID0gJnNoNzcyMl9zaXVfY2xrX29wcywKLX07Ci0jZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzICovCi0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNoNzcyMl92aWRlb19jbG9jayA9IHsKLQkubmFtZSA9ICJ2aWRlb19jbGsiLAotCS5vcHMgPSAmc2g3NzIyX3ZpZGVvX2Nsa19vcHMsCi19OwotCi0jZGVmaW5lIE1TVFBDUl9BUkNIX0ZMQUdTKHJlZywgYml0KSAoKChyZWcpIDw8IDgpIHwgKGJpdCkpCi0jZGVmaW5lIE1TVFBDUl9BUkNIX0ZMQUdTX1JFRyh2YWx1ZSkgKCh2YWx1ZSkgPj4gOCkKLSNkZWZpbmUgTVNUUENSX0FSQ0hfRkxBR1NfQklUKHZhbHVlKSAoKHZhbHVlKSAmIDB4ZmYpCi0KLXN0YXRpYyBpbnQgc2g3NzIyX21zdHBjcl9zdGFydF9zdG9wKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKLXsKLQl1bnNpZ25lZCBsb25nIGJpdCA9IE1TVFBDUl9BUkNIX0ZMQUdTX0JJVChjbGstPmFyY2hfZmxhZ3MpOwotCXVuc2lnbmVkIGxvbmcgcmVnOwotCXVuc2lnbmVkIGxvbmcgcjsKLQotCXN3aXRjaChNU1RQQ1JfQVJDSF9GTEFHU19SRUcoY2xrLT5hcmNoX2ZsYWdzKSkgewotCWNhc2UgMDoKLQkJcmVnID0gTVNUUENSMDsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlyZWcgPSBNU1RQQ1IxOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCXJlZyA9IE1TVFBDUjI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0gIAotCi0JciA9IGN0cmxfaW5sKHJlZyk7Ci0KLQlpZiAoZW5hYmxlKQotCQlyICY9IH4oMSA8PCBiaXQpOworCWlmIChfX3Jhd19yZWFkbChQTExDUikgJiAweDQwMDApCisJCW11bHQgPSAoKChfX3Jhd19yZWFkbChGUlFDUikgPj4gMjQpICYgMHgxZikgKyAxKTsKIAllbHNlCi0JCXIgfD0gKDEgPDwgYml0KTsKKwkJZGl2ID0gMjsKIAotCWN0cmxfb3V0bChyLCByZWcpOwotCXJldHVybiAwOworCXJldHVybiAoY2xrLT5wYXJlbnQtPnJhdGUgKiBtdWx0KSAvIGRpdjsKIH0KIAotc3RhdGljIHZvaWQgc2g3NzIyX21zdHBjcl9lbmFibGUoc3RydWN0IGNsayAqY2xrKQotewotCXNoNzcyMl9tc3RwY3Jfc3RhcnRfc3RvcChjbGssIDEpOwotfQotCi1zdGF0aWMgdm9pZCBzaDc3MjJfbXN0cGNyX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQotewotCXNoNzcyMl9tc3RwY3Jfc3RhcnRfc3RvcChjbGssIDApOwotfQotCi1zdGF0aWMgdm9pZCBzaDc3MjJfbXN0cGNyX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKGNsay0+cGFyZW50KQotCQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcyMl9tc3RwY3JfY2xrX29wcyA9IHsKLQkuZW5hYmxlID0gc2g3NzIyX21zdHBjcl9lbmFibGUsCi0JLmRpc2FibGUgPSBzaDc3MjJfbXN0cGNyX2Rpc2FibGUsCi0JLnJlY2FsYyA9IHNoNzcyMl9tc3RwY3JfcmVjYWxjLAorc3RhdGljIHN0cnVjdCBjbGtfb3BzIHBsbF9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gcGxsX3JlY2FsYywKIH07CiAKLSNkZWZpbmUgTVNUUENSKF9uYW1lLCBfcGFyZW50LCByZWduciwgYml0bnIpIFwKLXsJCQkJCQlcCi0JLm5hbWUgPSBfbmFtZSwJCQkJXAotCS5hcmNoX2ZsYWdzID0gTVNUUENSX0FSQ0hfRkxBR1MocmVnbnIsIGJpdG5yKSwJXAotCS5vcHMgPSAodm9pZCAqKV9wYXJlbnQsCQlcCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNoNzcyMl9tc3RwY3JfY2xvY2tzW10gPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQotCU1TVFBDUigidXJhbTAiLCAidW1lbV9jbGsiLCAwLCAyOCksCi0JTVNUUENSKCJ4eW1lbTAiLCAiYnVzX2NsayIsIDAsIDI2KSwKLQlNU1RQQ1IoInRtdTAiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCAxNSksCi0JTVNUUENSKCJjbXQwIiwgInJfY2xrIiwgMCwgMTQpLAotCU1TVFBDUigicndkdDAiLCAicl9jbGsiLCAwLCAxMyksCi0JTVNUUENSKCJmbGN0bDAiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCAxMCksCi0JTVNUUENSKCJzY2lmMCIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDcpLAotCU1TVFBDUigic2NpZjEiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCA2KSwKLQlNU1RQQ1IoInNjaWYyIiwgInBlcmlwaGVyYWxfY2xrIiwgMCwgNSksCi0JTVNUUENSKCJpMmMwIiwgInBlcmlwaGVyYWxfY2xrIiwgMSwgOSksCi0JTVNUUENSKCJydGMwIiwgInJfY2xrIiwgMSwgOCksCi0JTVNUUENSKCJzZGhpMCIsICJwZXJpcGhlcmFsX2NsayIsIDIsIDE4KSwKLQlNU1RQQ1IoImtleXNjMCIsICJyX2NsayIsIDIsIDE0KSwKLQlNU1RQQ1IoInVzYmYwIiwgInBlcmlwaGVyYWxfY2xrIiwgMiwgMTEpLAotCU1TVFBDUigiMmRnMCIsICJidXNfY2xrIiwgMiwgOSksCi0JTVNUUENSKCJzaXUwIiwgImJ1c19jbGsiLCAyLCA4KSwKLQlNU1RQQ1IoInZvdTAiLCAiYnVzX2NsayIsIDIsIDUpLAotCU1TVFBDUigianB1MCIsICJidXNfY2xrIiwgMiwgNiksCi0JTVNUUENSKCJiZXUwIiwgImJ1c19jbGsiLCAyLCA0KSwKLQlNU1RQQ1IoImNldTAiLCAiYnVzX2NsayIsIDIsIDMpLAotCU1TVFBDUigidmV1MCIsICJidXNfY2xrIiwgMiwgMiksCi0JTVNUUENSKCJ2cHUwIiwgImJ1c19jbGsiLCAyLCAxKSwKLQlNU1RQQ1IoImxjZGMwIiwgImJ1c19jbGsiLCAyLCAwKSwKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykKLQkvKiBTZWUgcGFnZSA2MCBvZiBEYXRhc2hlZXQgVjEuMDogT3ZlcnZpZXcgLT4gQmxvY2sgRGlhZ3JhbSAqLwotCU1TVFBDUigidGxiMCIsICJjcHVfY2xrIiwgMCwgMzEpLAotCU1TVFBDUigiaWMwIiwgImNwdV9jbGsiLCAwLCAzMCksCi0JTVNUUENSKCJvYzAiLCAiY3B1X2NsayIsIDAsIDI5KSwKLQlNU1RQQ1IoImwyYzAiLCAic2hfY2xrIiwgMCwgMjgpLAotCU1TVFBDUigiaWxtZW0wIiwgImNwdV9jbGsiLCAwLCAyNyksCi0JTVNUUENSKCJmcHUwIiwgImNwdV9jbGsiLCAwLCAyNCksCi0JTVNUUENSKCJpbnRjMCIsICJjcHVfY2xrIiwgMCwgMjIpLAotCU1TVFBDUigiZG1hYzAiLCAiYnVzX2NsayIsIDAsIDIxKSwKLQlNU1RQQ1IoInNoMCIsICJzaF9jbGsiLCAwLCAyMCksCi0JTVNUUENSKCJodWRpMCIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDE5KSwKLQlNU1RQQ1IoInViYzAiLCAiY3B1X2NsayIsIDAsIDE3KSwKLQlNU1RQQ1IoInRtdTAiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCAxNSksCi0JTVNUUENSKCJjbXQwIiwgInJfY2xrIiwgMCwgMTQpLAotCU1TVFBDUigicndkdDAiLCAicl9jbGsiLCAwLCAxMyksCi0JTVNUUENSKCJkbWFjMSIsICJidXNfY2xrIiwgMCwgMTIpLAotCU1TVFBDUigidG11MSIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDExKSwKLQlNU1RQQ1IoImZsY3RsMCIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDEwKSwKLQlNU1RQQ1IoInNjaWYwIiwgInBlcmlwaGVyYWxfY2xrIiwgMCwgOSksCi0JTVNUUENSKCJzY2lmMSIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDgpLAotCU1TVFBDUigic2NpZjIiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCA3KSwKLQlNU1RQQ1IoInNjaWYzIiwgImJ1c19jbGsiLCAwLCA2KSwKLQlNU1RQQ1IoInNjaWY0IiwgImJ1c19jbGsiLCAwLCA1KSwKLQlNU1RQQ1IoInNjaWY1IiwgImJ1c19jbGsiLCAwLCA0KSwKLQlNU1RQQ1IoIm1zaW9mMCIsICJidXNfY2xrIiwgMCwgMiksCi0JTVNUUENSKCJtc2lvZjEiLCAiYnVzX2NsayIsIDAsIDEpLAotCU1TVFBDUigibWVyYW0wIiwgInNoX2NsayIsIDAsIDApLAotCU1TVFBDUigiaTJjMCIsICJwZXJpcGhlcmFsX2NsayIsIDEsIDkpLAotCU1TVFBDUigicnRjMCIsICJyX2NsayIsIDEsIDgpLAotCU1TVFBDUigiYXRhcGkwIiwgInNoX2NsayIsIDIsIDI4KSwKLQlNU1RQQ1IoImFkYzAiLCAicGVyaXBoZXJhbF9jbGsiLCAyLCAyOCksCi0JTVNUUENSKCJ0cHUwIiwgImJ1c19jbGsiLCAyLCAyNSksCi0JTVNUUENSKCJpcmRhMCIsICJwZXJpcGhlcmFsX2NsayIsIDIsIDI0KSwKLQlNU1RQQ1IoInRzaWYwIiwgImJ1c19jbGsiLCAyLCAyMiksCi0JTVNUUENSKCJpY2IwIiwgImJ1c19jbGsiLCAyLCAyMSksCi0JTVNUUENSKCJzZGhpMCIsICJidXNfY2xrIiwgMiwgMTgpLAotCU1TVFBDUigic2RoaTEiLCAiYnVzX2NsayIsIDIsIDE3KSwKLQlNU1RQQ1IoImtleXNjMCIsICJyX2NsayIsIDIsIDE0KSwKLQlNU1RQQ1IoInVzYjAiLCAiYnVzX2NsayIsIDIsIDExKSwKLQlNU1RQQ1IoIjJkZzAiLCAiYnVzX2NsayIsIDIsIDEwKSwKLQlNU1RQQ1IoInNpdTAiLCAiYnVzX2NsayIsIDIsIDgpLAotCU1TVFBDUigidmV1MSIsICJidXNfY2xrIiwgMiwgNiksCi0JTVNUUENSKCJ2b3UwIiwgImJ1c19jbGsiLCAyLCA1KSwKLQlNU1RQQ1IoImJldTAiLCAiYnVzX2NsayIsIDIsIDQpLAotCU1TVFBDUigiY2V1MCIsICJidXNfY2xrIiwgMiwgMyksCi0JTVNUUENSKCJ2ZXUwIiwgImJ1c19jbGsiLCAyLCAyKSwKLQlNU1RQQ1IoInZwdTAiLCAiYnVzX2NsayIsIDIsIDEpLAotCU1TVFBDUigibGNkYzAiLCAiYnVzX2NsayIsIDIsIDApLAotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQotCU1TVFBDUigidXJhbTAiLCAidW1lbV9jbGsiLCAwLCAyOCksCi0JTVNUUENSKCJ4eW1lbTAiLCAiYnVzX2NsayIsIDAsIDI2KSwKLQlNU1RQQ1IoInRtdTAiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCAxNSksCi0JTVNUUENSKCJjbXQwIiwgInJfY2xrIiwgMCwgMTQpLAotCU1TVFBDUigicndkdDAiLCAicl9jbGsiLCAwLCAxMyksCi0JTVNUUENSKCJzY2lmMCIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDcpLAotCU1TVFBDUigic2NpZjEiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCA2KSwKLQlNU1RQQ1IoInNjaWYyIiwgInBlcmlwaGVyYWxfY2xrIiwgMCwgNSksCi0JTVNUUENSKCJzY2lmMyIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDQpLAotCU1TVFBDUigiaTJjMCIsICJwZXJpcGhlcmFsX2NsayIsIDEsIDkpLAotCU1TVFBDUigiaTJjMSIsICJwZXJpcGhlcmFsX2NsayIsIDEsIDgpLAotCU1TVFBDUigic2RoaTAiLCAicGVyaXBoZXJhbF9jbGsiLCAyLCAxOCksCi0JTVNUUENSKCJrZXlzYzAiLCAicl9jbGsiLCAyLCAxNCksCi0JTVNUUENSKCJ1c2JmMCIsICJwZXJpcGhlcmFsX2NsayIsIDIsIDExKSwKLQlNU1RQQ1IoInNpdTAiLCAiYnVzX2NsayIsIDIsIDgpLAotCU1TVFBDUigianB1MCIsICJidXNfY2xrIiwgMiwgNiksCi0JTVNUUENSKCJ2b3UwIiwgImJ1c19jbGsiLCAyLCA1KSwKLQlNU1RQQ1IoImJldTAiLCAiYnVzX2NsayIsIDIsIDQpLAotCU1TVFBDUigiY2V1MCIsICJidXNfY2xrIiwgMiwgMyksCi0JTVNUUENSKCJ2ZXUwIiwgImJ1c19jbGsiLCAyLCAyKSwKLQlNU1RQQ1IoInZwdTAiLCAiYnVzX2NsayIsIDIsIDEpLAotCU1TVFBDUigibGNkYzAiLCAiYnVzX2NsayIsIDIsIDApLAotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2KQotCS8qIFNlZSBwYWdlIDUyIG9mIERhdGFzaGVldCBWMC40MDogT3ZlcnZpZXcgLT4gQmxvY2sgRGlhZ3JhbSAqLwotCU1TVFBDUigidGxiMCIsICJjcHVfY2xrIiwgMCwgMzEpLAotCU1TVFBDUigiaWMwIiwgImNwdV9jbGsiLCAwLCAzMCksCi0JTVNUUENSKCJvYzAiLCAiY3B1X2NsayIsIDAsIDI5KSwKLQlNU1RQQ1IoInJzbWVtMCIsICJzaF9jbGsiLCAwLCAyOCksCi0JTVNUUENSKCJ4eW1lbTAiLCAiY3B1X2NsayIsIDAsIDI2KSwKLQlNU1RQQ1IoImludGMzMCIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDIzKSwKLQlNU1RQQ1IoImludGMwIiwgInBlcmlwaGVyYWxfY2xrIiwgMCwgMjIpLAotCU1TVFBDUigiZG1hYzAiLCAiYnVzX2NsayIsIDAsIDIxKSwKLQlNU1RQQ1IoInNoMCIsICJzaF9jbGsiLCAwLCAyMCksCi0JTVNUUENSKCJodWRpMCIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDE5KSwKLQlNU1RQQ1IoInViYzAiLCAiY3B1X2NsayIsIDAsIDE3KSwKLQlNU1RQQ1IoInRtdTAiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCAxNSksCi0JTVNUUENSKCJjbXQwIiwgInJfY2xrIiwgMCwgMTQpLAotCU1TVFBDUigicndkdDAiLCAicl9jbGsiLCAwLCAxMyksCi0JTVNUUENSKCJmbGN0bDAiLCAicGVyaXBoZXJhbF9jbGsiLCAwLCAxMCksCi0JTVNUUENSKCJzY2lmMCIsICJwZXJpcGhlcmFsX2NsayIsIDAsIDcpLAotCU1TVFBDUigic2NpZjEiLCAiYnVzX2NsayIsIDAsIDYpLAotCU1TVFBDUigic2NpZjIiLCAiYnVzX2NsayIsIDAsIDUpLAotCU1TVFBDUigibXNpb2YwIiwgInBlcmlwaGVyYWxfY2xrIiwgMCwgMiksCi0JTVNUUENSKCJzYnIwIiwgInBlcmlwaGVyYWxfY2xrIiwgMCwgMSksCi0JTVNUUENSKCJpMmMwIiwgInBlcmlwaGVyYWxfY2xrIiwgMSwgOSksCi0JTVNUUENSKCJpY2IwIiwgImJ1c19jbGsiLCAyLCAyNyksCi0JTVNUUENSKCJtZXJhbTAiLCAic2hfY2xrIiwgMiwgMjYpLAotCU1TVFBDUigiZGFjYzAiLCAicGVyaXBoZXJhbF9jbGsiLCAyLCAyNCksCi0JTVNUUENSKCJkYWN5MCIsICJwZXJpcGhlcmFsX2NsayIsIDIsIDIzKSwKLQlNU1RQQ1IoInRzaWYwIiwgImJ1c19jbGsiLCAyLCAyMiksCi0JTVNUUENSKCJzZGhpMCIsICJidXNfY2xrIiwgMiwgMTgpLAotCU1TVFBDUigibW1jaWYwIiwgImJ1c19jbGsiLCAyLCAxNyksCi0JTVNUUENSKCJ1c2IwIiwgImJ1c19jbGsiLCAyLCAxMSksCi0JTVNUUENSKCJzaXUwIiwgImJ1c19jbGsiLCAyLCA4KSwKLQlNU1RQQ1IoInZldTEiLCAiYnVzX2NsayIsIDIsIDcpLAotCU1TVFBDUigidm91MCIsICJidXNfY2xrIiwgMiwgNSksCi0JTVNUUENSKCJiZXUwIiwgImJ1c19jbGsiLCAyLCA0KSwKLQlNU1RQQ1IoImNldTAiLCAiYnVzX2NsayIsIDIsIDMpLAotCU1TVFBDUigidmV1MCIsICJidXNfY2xrIiwgMiwgMiksCi0JTVNUUENSKCJ2cHUwIiwgImJ1c19jbGsiLCAyLCAxKSwKLQlNU1RQQ1IoImxjZGMwIiwgImJ1c19jbGsiLCAyLCAwKSwKLSNlbmRpZgorc3RhdGljIHN0cnVjdCBjbGsgcGxsX2NsayA9IHsKKwkubmFtZQkJPSAicGxsX2NsayIsCisJLmlkCQk9IC0xLAorCS5vcHMJCT0gJnBsbF9jbGtfb3BzLAorCS5mbGFncwkJPSBDTEtfRU5BQkxFX09OX0lOSVQsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayAqc2g3NzIyX2Nsb2Nrc1tdID0gewotCSZzaDc3MjJfdW1lbV9jbG9jaywKLQkmc2g3NzIyX3NoX2Nsb2NrLAotCSZzaDc3MjJfcGVyaXBoZXJhbF9jbG9jaywKLQkmc2g3NzIyX3NkcmFtX2Nsb2NrLAotI2lmbmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzCi0JJnNoNzcyMl9zaXVfYV9jbG9jaywKLQkmc2g3NzIyX3NpdV9iX2Nsb2NrLAotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikKLQkmc2g3NzIyX2lyZGFfY2xvY2ssCi0jZW5kaWYKLSNlbmRpZgotCSZzaDc3MjJfdmlkZW9fY2xvY2ssCitzdHJ1Y3QgY2xrICptYWluX2Nsa3NbXSA9IHsKKwkmcl9jbGssCisJJmV4dGFsX2NsaywKKwkmZGxsX2NsaywKKwkmcGxsX2NsaywKIH07CiAKLS8qCi0gKiBpbml0IGluIG9yZGVyOiBtYXN0ZXIsIG1vZHVsZSwgYnVzLCBjcHUKLSAqLwotc3RydWN0IGNsa19vcHMgKm9uY2hpcF9vcHNbXSA9IHsKLQkmc2g3NzIyX21hc3Rlcl9jbGtfb3BzLAotCSZzaDc3MjJfbW9kdWxlX2Nsa19vcHMsCi0JJnNoNzcyMl9mcnFjcl9jbGtfb3BzLAotCSZzaDc3MjJfZnJxY3JfY2xrX29wcywKK3N0YXRpYyBpbnQgbXVsdGlwbGllcnNbXSA9IHsgMSwgMiwgMSwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9Oworc3RhdGljIGludCBkaXZpc29yc1tdID0geyAxLCAzLCAyLCA1LCAzLCA0LCA1LCA2LCA4LCAxMCwgMTIsIDE2LCAyMCB9OworCitzdGF0aWMgc3RydWN0IGNsa19kaXZfbXVsdF90YWJsZSBkaXY0X3RhYmxlID0geworCS5kaXZpc29ycyA9IGRpdmlzb3JzLAorCS5ucl9kaXZpc29ycyA9IEFSUkFZX1NJWkUoZGl2aXNvcnMpLAorCS5tdWx0aXBsaWVycyA9IG11bHRpcGxpZXJzLAorCS5ucl9tdWx0aXBsaWVycyA9IEFSUkFZX1NJWkUobXVsdGlwbGllcnMpLAogfTsKIAotdm9pZCBfX2luaXQKLWFyY2hfaW5pdF9jbGtfb3BzKHN0cnVjdCBjbGtfb3BzICoqb3BzLCBpbnQgdHlwZSkKLXsKLQlCVUdfT04odHlwZSA8IDAgfHwgdHlwZSA+IEFSUkFZX1NJWkUob25jaGlwX29wcykpOwotCSpvcHMgPSBvbmNoaXBfb3BzW3R5cGVdOwotfQorZW51bSB7IERJVjRfSSwgRElWNF9VLCBESVY0X1NILCBESVY0X0IsIERJVjRfQjMsIERJVjRfUCwKKyAgICAgICBESVY0X1NJVUEsIERJVjRfU0lVQiwgRElWNF9JUkRBLCBESVY0X05SIH07CisKKyNkZWZpbmUgRElWNChfc3RyLCBfcmVnLCBfYml0LCBfbWFzaywgX2ZsYWdzKSBcCisgIFNIX0NMS19ESVY0KF9zdHIsICZwbGxfY2xrLCBfcmVnLCBfYml0LCBfbWFzaywgX2ZsYWdzKQorCitzdHJ1Y3QgY2xrIGRpdjRfY2xrc1tESVY0X05SXSA9IHsKKwlbRElWNF9JXSA9IERJVjQoImNwdV9jbGsiLCBGUlFDUiwgMjAsIDB4MWZlZiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlbRElWNF9VXSA9IERJVjQoInVtZW1fY2xrIiwgRlJRQ1IsIDE2LCAweDFmZmYsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfU0hdID0gRElWNCgic2h5d2F5X2NsayIsIEZSUUNSLCAxMiwgMHgxZmZmLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCVtESVY0X0JdID0gRElWNCgiYnVzX2NsayIsIEZSUUNSLCA4LCAweDFmZmYsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfQjNdID0gRElWNCgiYjNfY2xrIiwgRlJRQ1IsIDQsIDB4MWZmZiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlbRElWNF9QXSA9IERJVjQoInBlcmlwaGVyYWxfY2xrIiwgRlJRQ1IsIDAsIDB4MWZmZiwgMCksCisJW0RJVjRfU0lVQV0gPSBESVY0KCJzaXVhX2NsayIsIFNDTEtBQ1IsIDAsIDB4MWZmZiwgMCksCisJW0RJVjRfU0lVQl0gPSBESVY0KCJzaXViX2NsayIsIFNDTEtCQ1IsIDAsIDB4MWZmZiwgMCksCisJW0RJVjRfSVJEQV0gPSBESVY0KCJpcmRhX2NsayIsIElSREFDTEtDUiwgMCwgMHgxZmZmLCAwKSwKK307CisKK3N0cnVjdCBjbGsgZGl2Nl9jbGtzW10gPSB7CisJU0hfQ0xLX0RJVjYoInZpZGVvX2NsayIsICZwbGxfY2xrLCBWQ0xLQ1IsIDApLAorfTsKKworI2RlZmluZSBNU1RQKF9zdHIsIF9wYXJlbnQsIF9yZWcsIF9iaXQsIF9mbGFncykgXAorICBTSF9DTEtfTVNUUDMyKF9zdHIsIC0xLCBfcGFyZW50LCBfcmVnLCBfYml0LCBfZmxhZ3MpCisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1zdHBfY2xrc1tdID0geworCU1TVFAoInVyYW0wIiwgJmRpdjRfY2xrc1tESVY0X1VdLCBNU1RQQ1IwLCAyOCwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlNU1RQKCJ4eW1lbTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjAsIDI2LCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCU1TVFAoInRtdTAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDE1LCAwKSwKKwlNU1RQKCJjbXQwIiwgJnJfY2xrLCBNU1RQQ1IwLCAxNCwgMCksCisJTVNUUCgicndkdDAiLCAmcl9jbGssIE1TVFBDUjAsIDEzLCAwKSwKKwlNU1RQKCJmbGN0bDAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDEwLCAwKSwKKwlNU1RQKCJzY2lmMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgNywgMCksCisJTVNUUCgic2NpZjEiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDYsIDApLAorCU1TVFAoInNjaWYyIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCA1LCAwKSwKKworCU1TVFAoImkyYzAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjEsIDksIDApLAorCU1TVFAoInJ0YzAiLCAmcl9jbGssIE1TVFBDUjEsIDgsIDApLAorCisJTVNUUCgic2RoaTAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjIsIDE4LCAwKSwKKwlNU1RQKCJrZXlzYzAiLCAmcl9jbGssIE1TVFBDUjIsIDE0LCAwKSwKKwlNU1RQKCJ1c2JmMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMTEsIDApLAorCU1TVFAoIjJkZzAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDksIDApLAorCU1TVFAoInNpdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDgsIDApLAorCU1TVFAoInZvdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDUsIDApLAorCU1TVFAoImpwdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDYsIENMS19FTkFCTEVfT05fSU5JVCksCisJTVNUUCgiYmV1MCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgNCwgMCksCisJTVNUUCgiY2V1MCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMywgMCksCisJTVNUUCgidmV1MCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlNU1RQKCJ2cHUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAxLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCU1TVFAoImxjZGMwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAwLCAwKSwKK307CiAKIGludCBfX2luaXQgYXJjaF9jbGtfaW5pdCh2b2lkKQogewotCXN0cnVjdCBjbGsgKmNsazsKLQlpbnQgaTsKKwlpbnQgaywgcmV0ID0gMDsKIAotCWNsayA9IGNsa19nZXQoTlVMTCwgIm1hc3Rlcl9jbGsiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaDc3MjJfY2xvY2tzKTsgaSsrKSB7Ci0JCXByX2RlYnVnKCAiUmVnaXN0ZXJpbmcgY2xvY2sgJyVzJ1xuIiwgc2g3NzIyX2Nsb2Nrc1tpXS0+bmFtZSk7Ci0JCXNoNzcyMl9jbG9ja3NbaV0tPnBhcmVudCA9IGNsazsKLQkJY2xrX3JlZ2lzdGVyKHNoNzcyMl9jbG9ja3NbaV0pOwotCX0KLQljbGtfcHV0KGNsayk7CisJLyogYXV0b2RldGVjdCBleHRhbCBvciBkbGwgY29uZmlndXJhdGlvbiAqLworCWlmIChfX3Jhd19yZWFkbChQTExDUikgJiAweDEwMDApCisJCXBsbF9jbGsucGFyZW50ID0gJmRsbF9jbGs7CisJZWxzZQorCQlwbGxfY2xrLnBhcmVudCA9ICZleHRhbF9jbGs7CiAKLQljbGtfcmVnaXN0ZXIoJnNoNzcyMl9yX2Nsb2NrKTsKKwlmb3IgKGsgPSAwOyAhcmV0ICYmIChrIDwgQVJSQVlfU0laRShtYWluX2Nsa3MpKTsgaysrKQorCQlyZXQgPSBjbGtfcmVnaXN0ZXIobWFpbl9jbGtzW2tdKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNoNzcyMl9tc3RwY3JfY2xvY2tzKTsgaSsrKSB7Ci0JCXByX2RlYnVnKCAiUmVnaXN0ZXJpbmcgbXN0cGNyIGNsb2NrICclcydcbiIsCi0JCQkgIHNoNzcyMl9tc3RwY3JfY2xvY2tzW2ldLm5hbWUpOwotCQljbGsgPSBjbGtfZ2V0KE5VTEwsICh2b2lkICopIHNoNzcyMl9tc3RwY3JfY2xvY2tzW2ldLm9wcyk7Ci0JCXNoNzcyMl9tc3RwY3JfY2xvY2tzW2ldLnBhcmVudCA9IGNsazsKLQkJc2g3NzIyX21zdHBjcl9jbG9ja3NbaV0ub3BzID0gJnNoNzcyMl9tc3RwY3JfY2xrX29wczsKLQkJY2xrX3JlZ2lzdGVyKCZzaDc3MjJfbXN0cGNyX2Nsb2Nrc1tpXSk7Ci0JCWNsa19wdXQoY2xrKTsKLQl9CisJaWYgKCFyZXQpCisJCXJldCA9IHNoX2Nsa19kaXY0X3JlZ2lzdGVyKGRpdjRfY2xrcywgRElWNF9OUiwgJmRpdjRfdGFibGUpOwogCi0JY2xrX3JlY2FsY19yYXRlKCZzaDc3MjJfcl9jbG9jayk7IC8qIG1ha2Ugc3VyZSByYXRlIGdldHMgcHJvcGFnYXRlZCAqLworCWlmICghcmV0KQorCQlyZXQgPSBzaF9jbGtfZGl2Nl9yZWdpc3RlcihkaXY2X2Nsa3MsIEFSUkFZX1NJWkUoZGl2Nl9jbGtzKSk7CiAKLQlyZXR1cm4gMDsKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2hfY2xrX21zdHAzMl9yZWdpc3Rlcihtc3RwX2Nsa3MsIEFSUkFZX1NJWkUobXN0cF9jbGtzKSk7CisKKwlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzIzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjdjMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzIzLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjMuYworICoKKyAqIFNINzcyMyBjbG9jayBmcmFtZXdvcmsgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYWdudXMgRGFtbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKworLyogU0g3NzIzIHJlZ2lzdGVycyAqLworI2RlZmluZSBGUlFDUgkJMHhhNDE1MDAwMAorI2RlZmluZSBWQ0xLQ1IJCTB4YTQxNTAwMDQKKyNkZWZpbmUgU0NMS0FDUgkJMHhhNDE1MDAwOAorI2RlZmluZSBTQ0xLQkNSCQkweGE0MTUwMDBjCisjZGVmaW5lIElSREFDTEtDUgkweGE0MTUwMDE4CisjZGVmaW5lIFBMTENSCQkweGE0MTUwMDI0CisjZGVmaW5lIE1TVFBDUjAJCTB4YTQxNTAwMzAKKyNkZWZpbmUgTVNUUENSMQkJMHhhNDE1MDAzNAorI2RlZmluZSBNU1RQQ1IyCQkweGE0MTUwMDM4CisjZGVmaW5lIERMTEZSUQkJMHhhNDE1MDA1MAorCisvKiBGaXhlZCAzMiBLSHogcm9vdCBjbG9jayBmb3IgUlRDIGFuZCBQb3dlciBNYW5hZ2VtZW50IHB1cnBvc2VzICovCitzdGF0aWMgc3RydWN0IGNsayByX2NsayA9IHsKKwkubmFtZSAgICAgICAgICAgPSAicmNsayIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLnJhdGUgICAgICAgICAgID0gMzI3NjgsCit9OworCisvKgorICogRGVmYXVsdCByYXRlIGZvciB0aGUgcm9vdCBpbnB1dCBjbG9jaywgcmVzZXQgdGhpcyB3aXRoIGNsa19zZXRfcmF0ZSgpCisgKiBmcm9tIHRoZSBwbGF0Zm9ybSBjb2RlLgorICovCitzdHJ1Y3QgY2xrIGV4dGFsX2NsayA9IHsKKwkubmFtZQkJPSAiZXh0YWwiLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAzMzMzMzMzMywKK307CisKKy8qIFRoZSBkbGwgbXVsdGlwbGllcyB0aGUgMzJraHogcl9jbGssIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgZXh0YWwgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRsbF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgbXVsdDsKKworCWlmIChfX3Jhd19yZWFkbChQTExDUikgJiAweDEwMDApCisJCW11bHQgPSBfX3Jhd19yZWFkbChETExGUlEpOworCWVsc2UKKwkJbXVsdCA9IDA7CisKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgKiBtdWx0OworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgZGxsX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBkbGxfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZGxsX2NsayA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiZGxsX2NsayIsCisJLmlkICAgICAgICAgICAgID0gLTEsCisJLm9wcwkJPSAmZGxsX2Nsa19vcHMsCisJLnBhcmVudAkJPSAmcl9jbGssCisJLmZsYWdzCQk9IENMS19FTkFCTEVfT05fSU5JVCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBsbF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgbXVsdCA9IDE7CisJdW5zaWduZWQgbG9uZyBkaXYgPSAxOworCisJaWYgKF9fcmF3X3JlYWRsKFBMTENSKSAmIDB4NDAwMCkKKwkJbXVsdCA9ICgoKF9fcmF3X3JlYWRsKEZSUUNSKSA+PiAyNCkgJiAweDFmKSArIDEpOworCWVsc2UKKwkJZGl2ID0gMjsKKworCXJldHVybiAoY2xrLT5wYXJlbnQtPnJhdGUgKiBtdWx0KSAvIGRpdjsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHBsbF9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gcGxsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbF9jbGsgPSB7CisJLm5hbWUJCT0gInBsbF9jbGsiLAorCS5pZAkJPSAtMSwKKwkub3BzCQk9ICZwbGxfY2xrX29wcywKKwkuZmxhZ3MJCT0gQ0xLX0VOQUJMRV9PTl9JTklULAorfTsKKworc3RydWN0IGNsayAqbWFpbl9jbGtzW10gPSB7CisJJnJfY2xrLAorCSZleHRhbF9jbGssCisJJmRsbF9jbGssCisJJnBsbF9jbGssCit9OworCitzdGF0aWMgaW50IG11bHRpcGxpZXJzW10gPSB7IDEsIDIsIDEsIDIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfTsKK3N0YXRpYyBpbnQgZGl2aXNvcnNbXSA9IHsgMSwgMywgMiwgNSwgMywgNCwgNSwgNiwgOCwgMTAsIDEyLCAxNiwgMjAgfTsKKworc3RhdGljIHN0cnVjdCBjbGtfZGl2X211bHRfdGFibGUgZGl2NF90YWJsZSA9IHsKKwkuZGl2aXNvcnMgPSBkaXZpc29ycywKKwkubnJfZGl2aXNvcnMgPSBBUlJBWV9TSVpFKGRpdmlzb3JzKSwKKwkubXVsdGlwbGllcnMgPSBtdWx0aXBsaWVycywKKwkubnJfbXVsdGlwbGllcnMgPSBBUlJBWV9TSVpFKG11bHRpcGxpZXJzKSwKK307CisKK2VudW0geyBESVY0X0ksIERJVjRfVSwgRElWNF9TSCwgRElWNF9CLCBESVY0X0IzLCBESVY0X1AsCisgICAgICAgRElWNF9TSVVBLCBESVY0X1NJVUIsIERJVjRfSVJEQSwgRElWNF9OUiB9OworCisjZGVmaW5lIERJVjQoX3N0ciwgX3JlZywgX2JpdCwgX21hc2ssIF9mbGFncykgXAorICBTSF9DTEtfRElWNChfc3RyLCAmcGxsX2NsaywgX3JlZywgX2JpdCwgX21hc2ssIF9mbGFncykKKworc3RydWN0IGNsayBkaXY0X2Nsa3NbRElWNF9OUl0gPSB7CisJW0RJVjRfSV0gPSBESVY0KCJjcHVfY2xrIiwgRlJRQ1IsIDIwLCAweDBkYmYsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfVV0gPSBESVY0KCJ1bWVtX2NsayIsIEZSUUNSLCAxNiwgMHgwZGJmLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCVtESVY0X1NIXSA9IERJVjQoInNoeXdheV9jbGsiLCBGUlFDUiwgMTIsIDB4MGRiZiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKKwlbRElWNF9CXSA9IERJVjQoImJ1c19jbGsiLCBGUlFDUiwgOCwgMHgwZGJmLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCVtESVY0X0IzXSA9IERJVjQoImIzX2NsayIsIEZSUUNSLCA0LCAweDBkYjQsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfUF0gPSBESVY0KCJwZXJpcGhlcmFsX2NsayIsIEZSUUNSLCAwLCAweDBkYmYsIDApLAorCVtESVY0X1NJVUFdID0gRElWNCgic2l1YV9jbGsiLCBTQ0xLQUNSLCAwLCAweDBkYmYsIDApLAorCVtESVY0X1NJVUJdID0gRElWNCgic2l1Yl9jbGsiLCBTQ0xLQkNSLCAwLCAweDBkYmYsIDApLAorCVtESVY0X0lSREFdID0gRElWNCgiaXJkYV9jbGsiLCBJUkRBQ0xLQ1IsIDAsIDB4MGRiZiwgMCksCit9OworCitzdHJ1Y3QgY2xrIGRpdjZfY2xrc1tdID0geworCVNIX0NMS19ESVY2KCJ2aWRlb19jbGsiLCAmcGxsX2NsaywgVkNMS0NSLCAwKSwKK307CisKKyNkZWZpbmUgTVNUUChfc3RyLCBfcGFyZW50LCBfcmVnLCBfYml0LCBfZm9yY2Vfb24sIF9uZWVkX2NwZywgX25lZWRfcmFtKSBcCisgIFNIX0NMS19NU1RQMzIoX3N0ciwgLTEsIF9wYXJlbnQsIF9yZWcsIF9iaXQsIF9mb3JjZV9vbiAqIENMS19FTkFCTEVfT05fSU5JVCkKKworc3RhdGljIHN0cnVjdCBjbGsgbXN0cF9jbGtzW10gPSB7CisJLyogU2VlIHBhZ2UgNjAgb2YgRGF0YXNoZWV0IFYxLjA6IE92ZXJ2aWV3IC0+IEJsb2NrIERpYWdyYW0gKi8KKwlNU1RQKCJ0bGIwIiwgJmRpdjRfY2xrc1tESVY0X0ldLCBNU1RQQ1IwLCAzMSwgMSwgMSwgMCksCisJTVNUUCgiaWMwIiwgJmRpdjRfY2xrc1tESVY0X0ldLCBNU1RQQ1IwLCAzMCwgMSwgMSwgMCksCisJTVNUUCgib2MwIiwgJmRpdjRfY2xrc1tESVY0X0ldLCBNU1RQQ1IwLCAyOSwgMSwgMSwgMCksCisJTVNUUCgibDJjMCIsICZkaXY0X2Nsa3NbRElWNF9TSF0sIE1TVFBDUjAsIDI4LCAxLCAxLCAwKSwKKwlNU1RQKCJpbG1lbTAiLCAmZGl2NF9jbGtzW0RJVjRfSV0sIE1TVFBDUjAsIDI3LCAxLCAxLCAwKSwKKwlNU1RQKCJmcHUwIiwgJmRpdjRfY2xrc1tESVY0X0ldLCBNU1RQQ1IwLCAyNCwgMSwgMSwgMCksCisJTVNUUCgiaW50YzAiLCAmZGl2NF9jbGtzW0RJVjRfSV0sIE1TVFBDUjAsIDIyLCAxLCAxLCAwKSwKKwlNU1RQKCJkbWFjMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMCwgMjEsIDAsIDEsIDEpLAorCU1TVFAoInNoMCIsICZkaXY0X2Nsa3NbRElWNF9TSF0sIE1TVFBDUjAsIDIwLCAwLCAxLCAwKSwKKwlNU1RQKCJodWRpMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTksIDAsIDEsIDApLAorCU1TVFAoInViYzAiLCAmZGl2NF9jbGtzW0RJVjRfSV0sIE1TVFBDUjAsIDE3LCAwLCAxLCAwKSwKKwlNU1RQKCJ0bXUwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAxNSwgMCwgMSwgMCksCisJTVNUUCgiY210MCIsICZyX2NsaywgTVNUUENSMCwgMTQsIDAsIDAsIDApLAorCU1TVFAoInJ3ZHQwIiwgJnJfY2xrLCBNU1RQQ1IwLCAxMywgMCwgMCwgMCksCisJTVNUUCgiZG1hYzEiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjAsIDEyLCAwLCAxLCAxKSwKKwlNU1RQKCJ0bXUxIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAxMSwgMCwgMSwgMCksCisJTVNUUCgiZmxjdGwwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAxMCwgMCwgMSwgMCksCisJTVNUUCgic2NpZjAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDksIDAsIDEsIDApLAorCU1TVFAoInNjaWYxIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCA4LCAwLCAxLCAwKSwKKwlNU1RQKCJzY2lmMiIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgNywgMCwgMSwgMCksCisJTVNUUCgic2NpZjMiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjAsIDYsIDAsIDEsIDApLAorCU1TVFAoInNjaWY0IiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IwLCA1LCAwLCAxLCAwKSwKKwlNU1RQKCJzY2lmNSIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMCwgNCwgMCwgMSwgMCksCisJTVNUUCgibXNpb2YwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IwLCAyLCAwLCAxLCAwKSwKKwlNU1RQKCJtc2lvZjEiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjAsIDEsIDAsIDEsIDApLAorCU1TVFAoIm1lcmFtMCIsICZkaXY0X2Nsa3NbRElWNF9TSF0sIE1TVFBDUjAsIDAsIDEsIDEsIDApLAorCisJTVNUUCgiaTJjMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMSwgOSwgMCwgMSwgMCksCisJTVNUUCgicnRjMCIsICZyX2NsaywgTVNUUENSMSwgOCwgMCwgMCwgMCksCisKKwlNU1RQKCJhdGFwaTAiLCAmZGl2NF9jbGtzW0RJVjRfU0hdLCBNU1RQQ1IyLCAyOCwgMCwgMSwgMCksCisJTVNUUCgiYWRjMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMjcsIDAsIDEsIDApLAorCU1TVFAoInRwdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDI1LCAwLCAxLCAwKSwKKwlNU1RQKCJpcmRhMCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMjQsIDAsIDEsIDApLAorCU1TVFAoInRzaWYwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAyMiwgMCwgMSwgMCksCisJTVNUUCgiaWNiMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMjEsIDAsIDEsIDEpLAorCU1TVFAoInNkaGkwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAxOCwgMCwgMSwgMCksCisJTVNUUCgic2RoaTEiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDE3LCAwLCAxLCAwKSwKKwlNU1RQKCJrZXlzYzAiLCAmcl9jbGssIE1TVFBDUjIsIDE0LCAwLCAwLCAwKSwKKwlNU1RQKCJ1c2IwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAxMSwgMCwgMSwgMCksCisJTVNUUCgiMmRnMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMTAsIDAsIDEsIDEpLAorCU1TVFAoInNpdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDgsIDAsIDEsIDApLAorCU1TVFAoInZldTEiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDYsIDEsIDEsIDEpLAorCU1TVFAoInZvdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDUsIDAsIDEsIDEpLAorCU1TVFAoImJldTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDQsIDAsIDEsIDEpLAorCU1TVFAoImNldTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDMsIDAsIDEsIDEpLAorCU1TVFAoInZldTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDIsIDEsIDEsIDEpLAorCU1TVFAoInZwdTAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDEsIDEsIDEsIDEpLAorCU1TVFAoImxjZGMwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAwLCAwLCAxLCAxKSwKK307CisKK2ludCBfX2luaXQgYXJjaF9jbGtfaW5pdCh2b2lkKQoreworCWludCBrLCByZXQgPSAwOworCisJLyogYXV0b2RldGVjdCBleHRhbCBvciBkbGwgY29uZmlndXJhdGlvbiAqLworCWlmIChfX3Jhd19yZWFkbChQTExDUikgJiAweDEwMDApCisJCXBsbF9jbGsucGFyZW50ID0gJmRsbF9jbGs7CisJZWxzZQorCQlwbGxfY2xrLnBhcmVudCA9ICZleHRhbF9jbGs7CisKKwlmb3IgKGsgPSAwOyAhcmV0ICYmIChrIDwgQVJSQVlfU0laRShtYWluX2Nsa3MpKTsgaysrKQorCQlyZXQgPSBjbGtfcmVnaXN0ZXIobWFpbl9jbGtzW2tdKTsKKworCWlmICghcmV0KQorCQlyZXQgPSBzaF9jbGtfZGl2NF9yZWdpc3RlcihkaXY0X2Nsa3MsIERJVjRfTlIsICZkaXY0X3RhYmxlKTsKKworCWlmICghcmV0KQorCQlyZXQgPSBzaF9jbGtfZGl2Nl9yZWdpc3RlcihkaXY2X2Nsa3MsIEFSUkFZX1NJWkUoZGl2Nl9jbGtzKSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2hfY2xrX21zdHAzMl9yZWdpc3Rlcihtc3RwX2Nsa3MsIEFSUkFZX1NJWkUobXN0cF9jbGtzKSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzI0LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDVjOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzI0LmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYworICoKKyAqIFNINzcyNCBjbG9jayBmcmFtZXdvcmsgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYWdudXMgRGFtbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKworLyogU0g3NzI0IHJlZ2lzdGVycyAqLworI2RlZmluZSBGUlFDUkEJCTB4YTQxNTAwMDAKKyNkZWZpbmUgRlJRQ1JCCQkweGE0MTUwMDA0CisjZGVmaW5lIFZDTEtDUgkJMHhhNDE1MDA0OAorI2RlZmluZSBGQ0xLQUNSCQkweGE0MTUwMDA4CisjZGVmaW5lIEZDTEtCQ1IJCTB4YTQxNTAwMGMKKyNkZWZpbmUgSVJEQUNMS0NSCTB4YTQxNTAwMTgKKyNkZWZpbmUgUExMQ1IJCTB4YTQxNTAwMjQKKyNkZWZpbmUgTVNUUENSMAkJMHhhNDE1MDAzMAorI2RlZmluZSBNU1RQQ1IxCQkweGE0MTUwMDM0CisjZGVmaW5lIE1TVFBDUjIJCTB4YTQxNTAwMzgKKyNkZWZpbmUgU1BVQ0xLQ1IJMHhhNDE1MDAzYworI2RlZmluZSBGTExGUlEJCTB4YTQxNTAwNTAKKyNkZWZpbmUgTFNUQVRTCQkweGE0MTUwMDYwCisKKy8qIEZpeGVkIDMyIEtIeiByb290IGNsb2NrIGZvciBSVEMgYW5kIFBvd2VyIE1hbmFnZW1lbnQgcHVycG9zZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIHJfY2xrID0geworCS5uYW1lICAgICAgICAgICA9ICJyY2xrIiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkucmF0ZSAgICAgICAgICAgPSAzMjc2OCwKK307CisKKy8qCisgKiBEZWZhdWx0IHJhdGUgZm9yIHRoZSByb290IGlucHV0IGNsb2NrLCByZXNldCB0aGlzIHdpdGggY2xrX3NldF9yYXRlKCkKKyAqIGZyb20gdGhlIHBsYXRmb3JtIGNvZGUuCisgKi8KK3N0cnVjdCBjbGsgZXh0YWxfY2xrID0geworCS5uYW1lCQk9ICJleHRhbCIsCisJLmlkCQk9IC0xLAorCS5yYXRlCQk9IDMzMzMzMzMzLAorfTsKKworLyogVGhlIGZsbCBtdWx0aXBsaWVzIHRoZSAzMmtoeiByX2NsaywgbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiBleHRhbCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmxsX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBtdWx0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGRpdiA9IDE7CisKKwlpZiAoX19yYXdfcmVhZGwoUExMQ1IpICYgMHgxMDAwKQorCQltdWx0ID0gX19yYXdfcmVhZGwoRkxMRlJRKSAmIDB4M2ZmOworCisJaWYgKF9fcmF3X3JlYWRsKEZMTEZSUSkgJiAweDQwMDApCisJCWRpdiA9IDI7CisKKwlyZXR1cm4gKGNsay0+cGFyZW50LT5yYXRlICogbXVsdCkgLyBkaXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBmbGxfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGZsbF9yZWNhbGMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayBmbGxfY2xrID0geworCS5uYW1lICAgICAgICAgICA9ICJmbGxfY2xrIiwKKwkuaWQgICAgICAgICAgICAgPSAtMSwKKwkub3BzCQk9ICZmbGxfY2xrX29wcywKKwkucGFyZW50CQk9ICZyX2NsaywKKwkuZmxhZ3MJCT0gQ0xLX0VOQUJMRV9PTl9JTklULAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxsX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBtdWx0ID0gMTsKKworCWlmIChfX3Jhd19yZWFkbChQTExDUikgJiAweDQwMDApCisJCW11bHQgPSAoKChfX3Jhd19yZWFkbChGUlFDUkEpID4+IDI0KSAmIDB4M2YpICsgMSkgKiAyOworCisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlICogbXVsdDsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHBsbF9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gcGxsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbF9jbGsgPSB7CisJLm5hbWUJCT0gInBsbF9jbGsiLAorCS5pZAkJPSAtMSwKKwkub3BzCQk9ICZwbGxfY2xrX29wcywKKwkuZmxhZ3MJCT0gQ0xLX0VOQUJMRV9PTl9JTklULAorfTsKKworLyogQSBmaXhlZCBkaXZpZGUtYnktMyBibG9jayB1c2UgYnkgdGhlIGRpdjYgY2xvY2tzICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXYzX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gMzsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIGRpdjNfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGRpdjNfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgZGl2M19jbGsgPSB7CisJLm5hbWUJCT0gImRpdjNfY2xrIiwKKwkuaWQJCT0gLTEsCisJLm9wcwkJPSAmZGl2M19jbGtfb3BzLAorCS5wYXJlbnQJCT0gJnBsbF9jbGssCit9OworCitzdHJ1Y3QgY2xrICptYWluX2Nsa3NbXSA9IHsKKwkmcl9jbGssCisJJmV4dGFsX2NsaywKKwkmZmxsX2NsaywKKwkmcGxsX2NsaywKKwkmZGl2M19jbGssCit9OworCitzdGF0aWMgaW50IGRpdmlzb3JzW10gPSB7IDIsIDAsIDQsIDYsIDgsIDEyLCAxNiwgMCwgMjQsIDMyLCAzNiwgNDgsIDAsIDcyIH07CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl9tdWx0X3RhYmxlIGRpdjRfdGFibGUgPSB7CisJLmRpdmlzb3JzID0gZGl2aXNvcnMsCisJLm5yX2Rpdmlzb3JzID0gQVJSQVlfU0laRShkaXZpc29ycyksCit9OworCitlbnVtIHsgRElWNF9JLCBESVY0X1NILCBESVY0X0IsIERJVjRfUCwgRElWNF9NMSwgRElWNF9OUiB9OworCisjZGVmaW5lIERJVjQoX3N0ciwgX3JlZywgX2JpdCwgX21hc2ssIF9mbGFncykgXAorICBTSF9DTEtfRElWNChfc3RyLCAmcGxsX2NsaywgX3JlZywgX2JpdCwgX21hc2ssIF9mbGFncykKKworc3RydWN0IGNsayBkaXY0X2Nsa3NbRElWNF9OUl0gPSB7CisJW0RJVjRfSV0gPSBESVY0KCJjcHVfY2xrIiwgRlJRQ1JBLCAyMCwgMHgyZjdkLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCVtESVY0X1NIXSA9IERJVjQoInNoeXdheV9jbGsiLCBGUlFDUkEsIDEyLCAweDJmN2MsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfQl0gPSBESVY0KCJidXNfY2xrIiwgRlJRQ1JBLCA4LCAweDJmN2MsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfUF0gPSBESVY0KCJwZXJpcGhlcmFsX2NsayIsIEZSUUNSQSwgMCwgMHgyZjdjLCAwKSwKKwlbRElWNF9NMV0gPSBESVY0KCJ2cHVfY2xrIiwgRlJRQ1JCLCA0LCAweDJmN2MsIDApLAorfTsKKworc3RydWN0IGNsayBkaXY2X2Nsa3NbXSA9IHsKKwlTSF9DTEtfRElWNigidmlkZW9fY2xrIiwgJmRpdjNfY2xrLCBWQ0xLQ1IsIDApLAorCVNIX0NMS19ESVY2KCJmc2lhX2NsayIsICZkaXYzX2NsaywgRkNMS0FDUiwgMCksCisJU0hfQ0xLX0RJVjYoImZzaWJfY2xrIiwgJmRpdjNfY2xrLCBGQ0xLQkNSLCAwKSwKKwlTSF9DTEtfRElWNigiaXJkYV9jbGsiLCAmZGl2M19jbGssIElSREFDTEtDUiwgMCksCisJU0hfQ0xLX0RJVjYoInNwdV9jbGsiLCAmZGl2M19jbGssIFNQVUNMS0NSLCAwKSwKK307CisKKyNkZWZpbmUgTVNUUChfc3RyLCBfcGFyZW50LCBfcmVnLCBfYml0LCBfZm9yY2Vfb24sIF9uZWVkX2NwZywgX25lZWRfcmFtKSBcCisgIFNIX0NMS19NU1RQMzIoX3N0ciwgLTEsIF9wYXJlbnQsIF9yZWcsIF9iaXQsIF9mb3JjZV9vbiAqIENMS19FTkFCTEVfT05fSU5JVCkKKworc3RhdGljIHN0cnVjdCBjbGsgbXN0cF9jbGtzW10gPSB7CisJTVNUUCgidGxiMCIsICZkaXY0X2Nsa3NbRElWNF9JXSwgTVNUUENSMCwgMzEsIDEsIDEsIDApLAorCU1TVFAoImljMCIsICZkaXY0X2Nsa3NbRElWNF9JXSwgTVNUUENSMCwgMzAsIDEsIDEsIDApLAorCU1TVFAoIm9jMCIsICZkaXY0X2Nsa3NbRElWNF9JXSwgTVNUUENSMCwgMjksIDEsIDEsIDApLAorCU1TVFAoInJzMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMCwgMjgsIDEsIDEsIDApLAorCU1TVFAoImlsbWVtMCIsICZkaXY0X2Nsa3NbRElWNF9JXSwgTVNUUENSMCwgMjcsIDEsIDEsIDApLAorCU1TVFAoImwyYzAiLCAmZGl2NF9jbGtzW0RJVjRfU0hdLCBNU1RQQ1IwLCAyNiwgMSwgMSwgMCksCisJTVNUUCgiZnB1MCIsICZkaXY0X2Nsa3NbRElWNF9JXSwgTVNUUENSMCwgMjQsIDEsIDEsIDApLAorCU1TVFAoImludGMwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAyMiwgMSwgMSwgMCksCisJTVNUUCgiZG1hYzAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjAsIDIxLCAwLCAxLCAxKSwKKwlNU1RQKCJzaDAiLCAmZGl2NF9jbGtzW0RJVjRfU0hdLCBNU1RQQ1IwLCAyMCwgMCwgMSwgMCksCisJTVNUUCgiaHVkaTAiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDE5LCAwLCAxLCAwKSwKKwlNU1RQKCJ1YmMwIiwgJmRpdjRfY2xrc1tESVY0X0ldLCBNU1RQQ1IwLCAxNywgMCwgMSwgMCksCisJTVNUUCgidG11MCIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTUsIDAsIDEsIDApLAorCU1TVFAoImNtdDAiLCAmcl9jbGssIE1TVFBDUjAsIDE0LCAwLCAwLCAwKSwKKwlNU1RQKCJyd2R0MCIsICZyX2NsaywgTVNUUENSMCwgMTMsIDAsIDAsIDApLAorCU1TVFAoImRtYWMxIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IwLCAxMiwgMCwgMSwgMSksCisJTVNUUCgidG11MSIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTAsIDAsIDEsIDApLAorCU1TVFAoInNjaWYwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCA5LCAwLCAxLCAwKSwKKwlNU1RQKCJzY2lmMSIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgOCwgMCwgMSwgMCksCisJTVNUUCgic2NpZjIiLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDcsIDAsIDEsIDApLAorCU1TVFAoInNjaWYzIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IwLCA2LCAwLCAxLCAwKSwKKwlNU1RQKCJzY2lmNCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMCwgNSwgMCwgMSwgMCksCisJTVNUUCgic2NpZjUiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjAsIDQsIDAsIDEsIDApLAorCU1TVFAoIm1zaW9mMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMCwgMiwgMCwgMSwgMCksCisJTVNUUCgibXNpb2YxIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IwLCAxLCAwLCAxLCAwKSwKKworCU1TVFAoImtleXNjMCIsICZyX2NsaywgTVNUUENSMSwgMTIsIDAsIDAsIDApLAorCU1TVFAoInJ0YzAiLCAmcl9jbGssIE1TVFBDUjEsIDExLCAwLCAwLCAwKSwKKwlNU1RQKCJpMmMwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IxLCA5LCAwLCAxLCAwKSwKKwlNU1RQKCJpMmMxIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IxLCA4LCAwLCAxLCAwKSwKKworCU1TVFAoIm1tYzAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDI5LCAwLCAxLCAwKSwKKwlNU1RQKCJldGgwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAyOCwgMCwgMSwgMCksCisJTVNUUCgiYXRhcGkwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAyNiwgMCwgMSwgMCksCisJTVNUUCgidHB1MCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMjUsIDAsIDEsIDApLAorCU1TVFAoImlyZGEwIiwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IyLCAyNCwgMCwgMSwgMCksCisJTVNUUCgidHNpZjAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDIyLCAwLCAxLCAwKSwKKwlNU1RQKCJ1c2IxIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAyMSwgMCwgMSwgMSksCisJTVNUUCgidXNiMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMjAsIDAsIDEsIDEpLAorCU1TVFAoIjJkZzAiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDE5LCAwLCAxLCAxKSwKKwlNU1RQKCJzZGhpMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMTgsIDAsIDEsIDApLAorCU1TVFAoInNkaGkxIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAxNywgMCwgMSwgMCksCisJTVNUUCgidmV1MSIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMTUsIDEsIDEsIDEpLAorCU1TVFAoImNldTEiLCAmZGl2NF9jbGtzW0RJVjRfQl0sIE1TVFBDUjIsIDEzLCAwLCAxLCAxKSwKKwlNU1RQKCJiZXUxIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAxMiwgMCwgMSwgMSksCisJTVNUUCgiMmRkbWFjMCIsICZkaXY0X2Nsa3NbRElWNF9TSF0sIE1TVFBDUjIsIDEwLCAwLCAxLCAxKSwKKwlNU1RQKCJzcHUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCA5LCAwLCAxLCAwKSwKKwlNU1RQKCJqcHUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCA2LCAxLCAxLCAxKSwKKwlNU1RQKCJ2b3UwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCA1LCAwLCAxLCAxKSwKKwlNU1RQKCJiZXUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCA0LCAwLCAxLCAxKSwKKwlNU1RQKCJjZXUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAzLCAwLCAxLCAxKSwKKwlNU1RQKCJ2ZXUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAyLCAxLCAxLCAxKSwKKwlNU1RQKCJ2cHUwIiwgJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAxLCAxLCAxLCAxKSwKKwlNU1RQKCJsY2RjMCIsICZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMCwgMCwgMSwgMSksCit9OworCitpbnQgX19pbml0IGFyY2hfY2xrX2luaXQodm9pZCkKK3sKKwlpbnQgaywgcmV0ID0gMDsKKworCS8qIGF1dG9kZXRlY3QgZXh0YWwgb3IgZmxsIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoX19yYXdfcmVhZGwoUExMQ1IpICYgMHgxMDAwKQorCQlwbGxfY2xrLnBhcmVudCA9ICZmbGxfY2xrOworCWVsc2UKKwkJcGxsX2Nsay5wYXJlbnQgPSAmZXh0YWxfY2xrOworCisJZm9yIChrID0gMDsgIXJldCAmJiAoayA8IEFSUkFZX1NJWkUobWFpbl9jbGtzKSk7IGsrKykKKwkJcmV0ID0gY2xrX3JlZ2lzdGVyKG1haW5fY2xrc1trXSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2hfY2xrX2RpdjRfcmVnaXN0ZXIoZGl2NF9jbGtzLCBESVY0X05SLCAmZGl2NF90YWJsZSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2hfY2xrX2RpdjZfcmVnaXN0ZXIoZGl2Nl9jbGtzLCBBUlJBWV9TSVpFKGRpdjZfY2xrcykpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHNoX2Nsa19tc3RwMzJfcmVnaXN0ZXIobXN0cF9jbGtzLCBBUlJBWV9TSVpFKG1zdHBfY2xrcykpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc2My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKaW5kZXggMzE3N2QwZC4uMzcwY2Q0NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKQEAgLTI5LDMzICsyOSwyOCBAQAogCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gNCkgJiAweDA3KTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHAwZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwMGZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3NjNfbW9kdWxlX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gMTYpICYgMHgwNyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBiZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBiZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc2M19idXNfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQotewotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlOwotfQotCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzYzX2NwdV9jbGtfb3BzID0gewotCS5yZWNhbGMJCT0gY3B1X2Nsa19yZWNhbGMsCisJLnJlY2FsYwkJPSBmb2xsb3dwYXJlbnRfcmVjYWxjLAogfTsKIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDc3NjNfY2xrX29wc1tdID0gewpAQCAtNzEsMTAgKzY2LDEwIEBACiAJCSpvcHMgPSBzaDc3NjNfY2xrX29wc1tpZHhdOwogfQogCi1zdGF0aWMgdm9pZCBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IDIwKSAmIDB4MDcpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gY2ZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gY2ZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3NjNfc2h5d2F5X2Nsa19vcHMgPSB7CkBAIC04Myw3ICs3OCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHNoNzc2M19zaHl3YXlfY2xrID0gewogCS5uYW1lCQk9ICJzaHl3YXlfY2xrIiwKLQkuZmxhZ3MJCT0gQ0xLX0FMV0FZU19FTkFCTEVELAorCS5mbGFncwkJPSBDTEtfRU5BQkxFX09OX0lOSVQsCiAJLm9wcwkJPSAmc2g3NzYzX3NoeXdheV9jbGtfb3BzLAogfTsKIApAQCAtOTUsMzEgKzkwLDIyIEBACiAJJnNoNzc2M19zaHl3YXlfY2xrLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2g3NzYzX2Nsa19pbml0KHZvaWQpCitpbnQgX19pbml0IGFyY2hfY2xrX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KE5VTEwsICJtYXN0ZXJfY2xrIik7Ci0JaW50IGk7CisJc3RydWN0IGNsayAqY2xrOworCWludCBpLCByZXQgPSAwOwogCisJY3BnX2Nsa19pbml0KCk7CisKKwljbGsgPSBjbGtfZ2V0KE5VTEwsICJtYXN0ZXJfY2xrIik7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2g3NzYzX29uY2hpcF9jbG9ja3MpOyBpKyspIHsKIAkJc3RydWN0IGNsayAqY2xrcCA9IHNoNzc2M19vbmNoaXBfY2xvY2tzW2ldOwogCiAJCWNsa3AtPnBhcmVudCA9IGNsazsKLQkJY2xrX3JlZ2lzdGVyKGNsa3ApOwotCQljbGtfZW5hYmxlKGNsa3ApOworCQlyZXQgfD0gY2xrX3JlZ2lzdGVyKGNsa3ApOwogCX0KIAotCS8qCi0JICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgY2xvY2tzIHJlZ2lzdGVyZWQsIHdlIG5lZWQgdG8KLQkgKiBmb3JjZSB0aGUgcGFyZW50IGNsb2NrIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IHRoZXNlIGNsb2NrcyB3aWxsCi0JICogYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IHRoZWlyIHJhdGUuIFdlIGNoZWF0IGJ5IGhhbmRpbmcgdGhlCi0JICogcGFyZW50IGNsb2NrIGl0cyBjdXJyZW50IHJhdGUgYW5kIGZvcmNpbmcgY2hpbGQgcHJvcGFnYXRpb24uCi0JICovCi0JY2xrX3NldF9yYXRlKGNsaywgY2xrX2dldF9yYXRlKGNsaykpOwotCiAJY2xrX3B1dChjbGspOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KLQotYXJjaF9pbml0Y2FsbChzaDc3NjNfY2xrX2luaXQpOwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3NzAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc3MC5jCmluZGV4IDhlMjM2MDYuLmUwYjg5NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc3MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc3MC5jCkBAIC0yOCwzMCArMjgsMzAgQEAKIAkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCiB9OwogCi1zdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IDI4KSAmIDB4MDAwZik7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc3MF9tb2R1bGVfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbmwoRlJRQ1IpICYgMHgwMDBmKTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzcwX2J1c19jbGtfb3BzID0gewogCS5yZWNhbGMJCT0gYnVzX2Nsa19yZWNhbGMsCiB9OwogCi1zdGF0aWMgdm9pZCBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IDI0KSAmIDB4MDAwZik7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc3MF9jcHVfY2xrX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzgwLmMKaW5kZXggMDFmM2RhNi4uYTI0OWQ4MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzgwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzgwLmMKQEAgLTI5LDMwICsyOSwzMCBAQAogCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW5sKEZSUUNSKSAmIDB4MDAwMyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4MF9tb2R1bGVfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiAxNikgJiAweDAwMDcpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gYmZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gYmZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3ODBfYnVzX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gMjQpICYgMHgwMDAxKTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIGlmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzgwX2NwdV9jbGtfb3BzID0gewpAQCAtNzIsMTAgKzcyLDEwIEBACiAJCSpvcHMgPSBzaDc3ODBfY2xrX29wc1tpZHhdOwogfQogCi1zdGF0aWMgdm9pZCBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IDIwKSAmIDB4MDAwNyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBjZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBjZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4MF9zaHl3YXlfY2xrX29wcyA9IHsKQEAgLTg0LDcgKzg0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBjbGsgc2g3NzgwX3NoeXdheV9jbGsgPSB7CiAJLm5hbWUJCT0gInNoeXdheV9jbGsiLAotCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQsCisJLmZsYWdzCQk9IENMS19FTkFCTEVfT05fSU5JVCwKIAkub3BzCQk9ICZzaDc3ODBfc2h5d2F5X2Nsa19vcHMsCiB9OwogCkBAIC05NiwzMSArOTYsMjIgQEAKIAkmc2g3NzgwX3NoeXdheV9jbGssCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzaDc3ODBfY2xrX2luaXQodm9pZCkKK2ludCBfX2luaXQgYXJjaF9jbGtfaW5pdCh2b2lkKQogewotCXN0cnVjdCBjbGsgKmNsayA9IGNsa19nZXQoTlVMTCwgIm1hc3Rlcl9jbGsiKTsKLQlpbnQgaTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IGksIHJldCA9IDA7CiAKKwljcGdfY2xrX2luaXQoKTsKKworCWNsayA9IGNsa19nZXQoTlVMTCwgIm1hc3Rlcl9jbGsiKTsKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaDc3ODBfb25jaGlwX2Nsb2Nrcyk7IGkrKykgewogCQlzdHJ1Y3QgY2xrICpjbGtwID0gc2g3NzgwX29uY2hpcF9jbG9ja3NbaV07CiAKIAkJY2xrcC0+cGFyZW50ID0gY2xrOwotCQljbGtfcmVnaXN0ZXIoY2xrcCk7Ci0JCWNsa19lbmFibGUoY2xrcCk7CisJCXJldCB8PSBjbGtfcmVnaXN0ZXIoY2xrcCk7CiAJfQogCi0JLyoKLQkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZXN0IG9mIHRoZSBjbG9ja3MgcmVnaXN0ZXJlZCwgd2UgbmVlZCB0bwotCSAqIGZvcmNlIHRoZSBwYXJlbnQgY2xvY2sgdG8gcHJvcGFnYXRlIHNvIHRoYXQgdGhlc2UgY2xvY2tzIHdpbGwKLQkgKiBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgdGhlaXIgcmF0ZS4gV2UgY2hlYXQgYnkgaGFuZGluZyB0aGUKLQkgKiBwYXJlbnQgY2xvY2sgaXRzIGN1cnJlbnQgcmF0ZSBhbmQgZm9yY2luZyBjaGlsZCBwcm9wYWdhdGlvbi4KLQkgKi8KLQljbGtfc2V0X3JhdGUoY2xrLCBjbGtfZ2V0X3JhdGUoY2xrKSk7Ci0KIAljbGtfcHV0KGNsayk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQotCi1hcmNoX2luaXRjYWxsKHNoNzc4MF9jbGtfaW5pdCk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4NS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg1LmMKaW5kZXggMjdmYTgxYi4uNzNhYmZiZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg1LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogU0g3Nzg1IHN1cHBvcnQgZm9yIHRoZSBjbG9jayBmcmFtZXdvcmsKICAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA3ICBQYXVsIE11bmR0CisgKiAgQ29weXJpZ2h0IChDKSAyMDA3IC0gMjAwOSAgUGF1bCBNdW5kdAogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xMSwxNTIgKzExLDExNiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9mcmVxLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLXN0YXRpYyBpbnQgaWZjX2Rpdmlzb3JzW10gPSB7IDEsIDIsIDQsIDYgfTsKLXN0YXRpYyBpbnQgdWZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDQsIDYgfTsKLXN0YXRpYyBpbnQgc2ZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDQsIDYgfTsKLXN0YXRpYyBpbnQgYmZjX2Rpdmlzb3JzW10gPSB7IDEsIDEsIDEsIDEsIDEsIDEyLCAxNiwgMTgsCi0JCQkgICAgIDI0LCAzMiwgMzYsIDQ4LCAxLCAxLCAxLCAxIH07Ci1zdGF0aWMgaW50IG1mY19kaXZpc29yc1tdID0geyAxLCAxLCA0LCA2IH07Ci1zdGF0aWMgaW50IHBmY19kaXZpc29yc1tdID0geyAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxOCwKLQkJCSAgICAgIDI0LCAzMiwgMzYsIDQ4LCAxLCAxLCAxLCAxIH07Ci0KLXN0YXRpYyB2b2lkIG1hc3Rlcl9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JY2xrLT5yYXRlICo9IHBmY19kaXZpc29yc1tjdHJsX2lubChGUlFNUjEpICYgMHgwMDBmXTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4NV9tYXN0ZXJfY2xrX29wcyA9IHsKLQkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCi19OwotCi1zdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaW50IGlkeCA9IChjdHJsX2lubChGUlFNUjEpICYgMHgwMDBmKTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3Nzg1X21vZHVsZV9jbGtfb3BzID0gewotCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCi19OwotCi1zdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRTVIxKSA+PiAxNikgJiAweDAwMGYpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gYmZjX2Rpdmlzb3JzW2lkeF07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3ODVfYnVzX2Nsa19vcHMgPSB7Ci0JLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKLX07Ci0KLXN0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFNUjEpID4+IDI4KSAmIDB4MDAwMyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4NV9jcHVfY2xrX29wcyA9IHsKLQkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDc3ODVfY2xrX29wc1tdID0gewotCSZzaDc3ODVfbWFzdGVyX2Nsa19vcHMsCi0JJnNoNzc4NV9tb2R1bGVfY2xrX29wcywKLQkmc2g3Nzg1X2J1c19jbGtfb3BzLAotCSZzaDc3ODVfY3B1X2Nsa19vcHMsCi19OwotCi12b2lkIF9faW5pdCBhcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKm9wcywgaW50IGlkeCkKLXsKLQlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDc3ODVfY2xrX29wcykpCi0JCSpvcHMgPSBzaDc3ODVfY2xrX29wc1tpZHhdOwotfQotCi1zdGF0aWMgdm9pZCBzaHl3YXlfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRTVIxKSA+PiAyMCkgJiAweDAwMDMpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gc2ZjX2Rpdmlzb3JzW2lkeF07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3ODVfc2h5d2F5X2Nsa19vcHMgPSB7Ci0JLnJlY2FsYwkJPSBzaHl3YXlfY2xrX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHNoNzc4NV9zaHl3YXlfY2xrID0gewotCS5uYW1lCQk9ICJzaHl3YXlfY2xrIiwKLQkuZmxhZ3MJCT0gQ0xLX0FMV0FZU19FTkFCTEVELAotCS5vcHMJCT0gJnNoNzc4NV9zaHl3YXlfY2xrX29wcywKLX07Ci0KLXN0YXRpYyB2b2lkIGRkcl9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFNUjEpID4+IDEyKSAmIDB4MDAwMyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBtZmNfZGl2aXNvcnNbaWR4XTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4NV9kZHJfY2xrX29wcyA9IHsKLQkucmVjYWxjCQk9IGRkcl9jbGtfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgc2g3Nzg1X2Rkcl9jbGsgPSB7Ci0JLm5hbWUJCT0gImRkcl9jbGsiLAotCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQsCi0JLm9wcwkJPSAmc2g3Nzg1X2Rkcl9jbGtfb3BzLAotfTsKLQotc3RhdGljIHZvaWQgcmFtX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQotewotCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUU1SMSkgPj4gMjQpICYgMHgwMDAzKTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHVmY19kaXZpc29yc1tpZHhdOwotfQotCi1zdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3Nzg1X3JhbV9jbGtfb3BzID0gewotCS5yZWNhbGMJCT0gcmFtX2Nsa19yZWNhbGMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayBzaDc3ODVfcmFtX2NsayA9IHsKLQkubmFtZQkJPSAicmFtX2NsayIsCi0JLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKLQkub3BzCQk9ICZzaDc3ODVfcmFtX2Nsa19vcHMsCi19OworI2luY2x1ZGUgPGNwdS9zaDc3ODUuaD4KIAogLyoKLSAqIEFkZGl0aW9uYWwgU0g3Nzg1LXNwZWNpZmljIG9uLWNoaXAgY2xvY2tzIHRoYXQgYXJlbid0IGFscmVhZHkgcGFydCBvZiB0aGUKLSAqIGNsb2NrIGZyYW1ld29yaworICogRGVmYXVsdCByYXRlIGZvciB0aGUgcm9vdCBpbnB1dCBjbG9jaywgcmVzZXQgdGhpcyB3aXRoIGNsa19zZXRfcmF0ZSgpCisgKiBmcm9tIHRoZSBwbGF0Zm9ybSBjb2RlLgogICovCi1zdGF0aWMgc3RydWN0IGNsayAqc2g3Nzg1X29uY2hpcF9jbG9ja3NbXSA9IHsKLQkmc2g3Nzg1X3NoeXdheV9jbGssCi0JJnNoNzc4NV9kZHJfY2xrLAotCSZzaDc3ODVfcmFtX2NsaywKK3N0YXRpYyBzdHJ1Y3QgY2xrIGV4dGFsX2NsayA9IHsKKwkubmFtZQkJPSAiZXh0YWwiLAorCS5pZAkJPSAtMSwKKwkucmF0ZQkJPSAzMzMzMzMzMywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNoNzc4NV9jbGtfaW5pdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgcGxsX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7Ci0Jc3RydWN0IGNsayAqY2xrID0gY2xrX2dldChOVUxMLCAibWFzdGVyX2NsayIpOwotCWludCBpOworCWludCBtdWx0aXBsaWVyOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2g3Nzg1X29uY2hpcF9jbG9ja3MpOyBpKyspIHsKLQkJc3RydWN0IGNsayAqY2xrcCA9IHNoNzc4NV9vbmNoaXBfY2xvY2tzW2ldOworCW11bHRpcGxpZXIgPSB0ZXN0X21vZGVfcGluKE1PREVfUElONCkgPyAzNiA6IDcyOwogCi0JCWNsa3AtPnBhcmVudCA9IGNsazsKLQkJY2xrX3JlZ2lzdGVyKGNsa3ApOwotCQljbGtfZW5hYmxlKGNsa3ApOwotCX0KLQotCS8qCi0JICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgY2xvY2tzIHJlZ2lzdGVyZWQsIHdlIG5lZWQgdG8KLQkgKiBmb3JjZSB0aGUgcGFyZW50IGNsb2NrIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IHRoZXNlIGNsb2NrcyB3aWxsCi0JICogYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IHRoZWlyIHJhdGUuIFdlIGNoZWF0IGJ5IGhhbmRpbmcgdGhlCi0JICogcGFyZW50IGNsb2NrIGl0cyBjdXJyZW50IHJhdGUgYW5kIGZvcmNpbmcgY2hpbGQgcHJvcGFnYXRpb24uCi0JICovCi0JY2xrX3NldF9yYXRlKGNsaywgY2xrX2dldF9yYXRlKGNsaykpOwotCi0JY2xrX3B1dChjbGspOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlICogbXVsdGlwbGllcjsKIH0KLWFyY2hfaW5pdGNhbGwoc2g3Nzg1X2Nsa19pbml0KTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHBsbF9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gcGxsX3JlY2FsYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIHBsbF9jbGsgPSB7CisJLm5hbWUJCT0gInBsbF9jbGsiLAorCS5pZAkJPSAtMSwKKwkub3BzCQk9ICZwbGxfY2xrX29wcywKKwkucGFyZW50CQk9ICZleHRhbF9jbGssCisJLmZsYWdzCQk9IENMS19FTkFCTEVfT05fSU5JVCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbGtzW10gPSB7CisJJmV4dGFsX2NsaywKKwkmcGxsX2NsaywKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGl2MltdID0geyAxLCAyLCA0LCA2LCA4LCAxMiwgMTYsIDE4LAorCQkJICAgICAgIDI0LCAzMiwgMzYsIDQ4IH07CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX2Rpdl9tdWx0X3RhYmxlIGRpdjRfdGFibGUgPSB7CisJLmRpdmlzb3JzID0gZGl2MiwKKwkubnJfZGl2aXNvcnMgPSBBUlJBWV9TSVpFKGRpdjIpLAorfTsKKworZW51bSB7IERJVjRfSSwgRElWNF9VLCBESVY0X1NILCBESVY0X0IsIERJVjRfRERSLCBESVY0X0dBLAorCURJVjRfRFUsIERJVjRfUCwgRElWNF9OUiB9OworCisjZGVmaW5lIERJVjQoX3N0ciwgX2JpdCwgX21hc2ssIF9mbGFncykgXAorICBTSF9DTEtfRElWNChfc3RyLCAmcGxsX2NsaywgRlJRTVIxLCBfYml0LCBfbWFzaywgX2ZsYWdzKQorCitzdHJ1Y3QgY2xrIGRpdjRfY2xrc1tESVY0X05SXSA9IHsKKwlbRElWNF9QXSA9IERJVjQoInBlcmlwaGVyYWxfY2xrIiwgMCwgMHgwZjgwLCAwKSwKKwlbRElWNF9EVV0gPSBESVY0KCJkdV9jbGsiLCA0LCAweDBmZjAsIDApLAorCVtESVY0X0dBXSA9IERJVjQoImdhX2NsayIsIDgsIDB4MDAzMCwgMCksCisJW0RJVjRfRERSXSA9IERJVjQoImRkcl9jbGsiLCAxMiwgMHgwMDBjLCBDTEtfRU5BQkxFX09OX0lOSVQpLAorCVtESVY0X0JdID0gRElWNCgiYnVzX2NsayIsIDE2LCAweDBmZTAsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfU0hdID0gRElWNCgic2h5d2F5X2NsayIsIDIwLCAweDAwMGMsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfVV0gPSBESVY0KCJ1bWVtX2NsayIsIDI0LCAweDAwMGMsIENMS19FTkFCTEVfT05fSU5JVCksCisJW0RJVjRfSV0gPSBESVY0KCJjcHVfY2xrIiwgMjgsIDB4MDAwZSwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKK307CisKKyNkZWZpbmUgTVNUUENSMAkJMHhmZmM4MDAzMAorI2RlZmluZSBNU1RQQ1IxCQkweGZmYzgwMDM0CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIG1zdHBfY2xrc1tdID0geworCS8qIE1TVFBDUjAgKi8KKwlTSF9DTEtfTVNUUDMyKCJzY2lmX2ZjayIsIDUsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMjksIDApLAorCVNIX0NMS19NU1RQMzIoInNjaWZfZmNrIiwgNCwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAyOCwgMCksCisJU0hfQ0xLX01TVFAzMigic2NpZl9mY2siLCAzLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDI3LCAwKSwKKwlTSF9DTEtfTVNUUDMyKCJzY2lmX2ZjayIsIDIsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMjYsIDApLAorCVNIX0NMS19NU1RQMzIoInNjaWZfZmNrIiwgMSwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAyNSwgMCksCisJU0hfQ0xLX01TVFAzMigic2NpZl9mY2siLCAwLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDI0LCAwKSwKKwlTSF9DTEtfTVNUUDMyKCJzc2lfZmNrIiwgMSwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAyMSwgMCksCisJU0hfQ0xLX01TVFAzMigic3NpX2ZjayIsIDAsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMjAsIDApLAorCVNIX0NMS19NU1RQMzIoImhhY19mY2siLCAxLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDE3LCAwKSwKKwlTSF9DTEtfTVNUUDMyKCJoYWNfZmNrIiwgMCwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAxNiwgMCksCisJU0hfQ0xLX01TVFAzMigibW1jaWZfZmNrIiwgLTEsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMTMsIDApLAorCVNIX0NMS19NU1RQMzIoImZsY3RsX2ZjayIsIC0xLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDEyLCAwKSwKKwlTSF9DTEtfTVNUUDMyKCJ0bXUzNDVfZmNrIiwgLTEsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgOSwgMCksCisJU0hfQ0xLX01TVFAzMigidG11MDEyX2ZjayIsIC0xLCAmZGl2NF9jbGtzW0RJVjRfUF0sIE1TVFBDUjAsIDgsIDApLAorCVNIX0NMS19NU1RQMzIoInNpb2ZfZmNrIiwgLTEsICZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMCwgMywgMCksCisJU0hfQ0xLX01TVFAzMigiaHNwaV9mY2siLCAtMSwgJmRpdjRfY2xrc1tESVY0X1BdLCBNU1RQQ1IwLCAyLCAwKSwKKworCS8qIE1TVFBDUjEgKi8KKwlTSF9DTEtfTVNUUDMyKCJodWRpX2ZjayIsIC0xLCBOVUxMLCBNU1RQQ1IxLCAxOSwgMCksCisJU0hfQ0xLX01TVFAzMigidWJjX2ZjayIsIC0xLCBOVUxMLCBNU1RQQ1IxLCAxNywgMCksCisJU0hfQ0xLX01TVFAzMigiZG1hY18xMV82X2ZjayIsIC0xLCBOVUxMLCBNU1RQQ1IxLCA1LCAwKSwKKwlTSF9DTEtfTVNUUDMyKCJkbWFjXzVfMF9mY2siLCAtMSwgTlVMTCwgTVNUUENSMSwgNCwgMCksCisJU0hfQ0xLX01TVFAzMigiZ2R0YV9mY2siLCAtMSwgTlVMTCwgTVNUUENSMSwgMCwgMCksCit9OworCitpbnQgX19pbml0IGFyY2hfY2xrX2luaXQodm9pZCkKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNsa3MpOyBpKyspCisJCXJldCB8PSBjbGtfcmVnaXN0ZXIoY2xrc1tpXSk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2hfY2xrX2RpdjRfcmVnaXN0ZXIoZGl2NF9jbGtzLCBBUlJBWV9TSVpFKGRpdjRfY2xrcyksCisJCQkJCSAgICZkaXY0X3RhYmxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2hfY2xrX21zdHAzMl9yZWdpc3Rlcihtc3RwX2Nsa3MsIEFSUkFZX1NJWkUobXN0cF9jbGtzKSk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODYuYwppbmRleCBmODRhOWMxLi5hMGU4ODY5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODYuYwpAQCAtMzYsMzAgKzM2LDMwIEBACiAJLmluaXQJCT0gbWFzdGVyX2Nsa19pbml0LAogfTsKIAotc3RhdGljIHZvaWQgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbW9kdWxlX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbmwoRlJRTVIxKSAmIDB4MDAwZik7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4Nl9tb2R1bGVfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IG1vZHVsZV9jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVzX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUU1SMSkgPj4gMTYpICYgMHgwMDBmKTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3Nzg2X2J1c19jbGtfb3BzID0gewogCS5yZWNhbGMJCT0gYnVzX2Nsa19yZWNhbGMsCiB9OwogCi1zdGF0aWMgdm9pZCBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRTVIxKSA+PiAyOCkgJiAweDAwMDMpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3ODZfY3B1X2Nsa19vcHMgPSB7CkBAIC03OSwxMCArNzksMTAgQEAKIAkJKm9wcyA9IHNoNzc4Nl9jbGtfb3BzW2lkeF07CiB9CiAKLXN0YXRpYyB2b2lkIHNoeXdheV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNoeXdheV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFNUjEpID4+IDIwKSAmIDB4MDAwMyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBzZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBzZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4Nl9zaHl3YXlfY2xrX29wcyA9IHsKQEAgLTkxLDE0ICs5MSwxNCBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBzaDc3ODZfc2h5d2F5X2NsayA9IHsKIAkubmFtZQkJPSAic2h5d2F5X2NsayIsCi0JLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkuZmxhZ3MJCT0gQ0xLX0VOQUJMRV9PTl9JTklULAogCS5vcHMJCT0gJnNoNzc4Nl9zaHl3YXlfY2xrX29wcywKIH07CiAKLXN0YXRpYyB2b2lkIGRkcl9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRkcl9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFNUjEpID4+IDEyKSAmIDB4MDAwMyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBtZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBtZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzc4Nl9kZHJfY2xrX29wcyA9IHsKQEAgLTEwNyw3ICsxMDcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBzaDc3ODZfZGRyX2NsayA9IHsKIAkubmFtZQkJPSAiZGRyX2NsayIsCi0JLmZsYWdzCQk9IENMS19BTFdBWVNfRU5BQkxFRCwKKwkuZmxhZ3MJCT0gQ0xLX0VOQUJMRV9PTl9JTklULAogCS5vcHMJCT0gJnNoNzc4Nl9kZHJfY2xrX29wcywKIH07CiAKQEAgLTEyMCwyOSArMTIwLDIyIEBACiAJJnNoNzc4Nl9kZHJfY2xrLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2g3Nzg2X2Nsa19pbml0KHZvaWQpCitpbnQgX19pbml0IGFyY2hfY2xrX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KE5VTEwsICJtYXN0ZXJfY2xrIik7Ci0JaW50IGk7CisJc3RydWN0IGNsayAqY2xrOworCWludCBpLCByZXQgPSAwOwogCisJY3BnX2Nsa19pbml0KCk7CisKKwljbGsgPSBjbGtfZ2V0KE5VTEwsICJtYXN0ZXJfY2xrIik7CiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc2g3Nzg2X29uY2hpcF9jbG9ja3MpOyBpKyspIHsKIAkJc3RydWN0IGNsayAqY2xrcCA9IHNoNzc4Nl9vbmNoaXBfY2xvY2tzW2ldOwogCiAJCWNsa3AtPnBhcmVudCA9IGNsazsKLQkJY2xrX3JlZ2lzdGVyKGNsa3ApOwotCQljbGtfZW5hYmxlKGNsa3ApOworCQlyZXQgfD0gY2xrX3JlZ2lzdGVyKGNsa3ApOwogCX0KIAotCS8qCi0JICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgY2xvY2tzIHJlZ2lzdGVyZWQsIHdlIG5lZWQgdG8KLQkgKiBmb3JjZSB0aGUgcGFyZW50IGNsb2NrIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IHRoZXNlIGNsb2NrcyB3aWxsCi0JICogYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IHRoZWlyIHJhdGUuIFdlIGNoZWF0IGJ5IGhhbmRpbmcgdGhlCi0JICogcGFyZW50IGNsb2NrIGl0cyBjdXJyZW50IHJhdGUgYW5kIGZvcmNpbmcgY2hpbGQgcHJvcGFnYXRpb24uCi0JICovCi0JY2xrX3NldF9yYXRlKGNsaywgY2xrX2dldF9yYXRlKGNsaykpOwotCiAJY2xrX3B1dChjbGspOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KLWFyY2hfaW5pdGNhbGwoc2g3Nzg2X2Nsa19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYwppbmRleCBjNjMwYjI5Li4yM2MyN2QzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaHgzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2h4My5jCkBAIC00MCwzMCArNDAsMzAgQEAKIAkuaW5pdAkJPSBtYXN0ZXJfY2xrX2luaXQsCiB9OwogCi1zdGF0aWMgdm9pZCBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtb2R1bGVfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCiB7CiAJaW50IGlkeCA9ICgoY3RybF9pbmwoRlJRQ1IpID4+IFBGQ19QT1MpICYgUEZDX01TSyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBwZmNfZGl2aXNvcnNbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoeDNfbW9kdWxlX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKChjdHJsX2lubChGUlFDUikgPj4gQkZDX1BPUykgJiBCRkNfTVNLKTsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOworCXJldHVybiBjbGstPnBhcmVudC0+cmF0ZSAvIGJmY19kaXZpc29yc1tpZHhdOwogfQogCiBzdGF0aWMgc3RydWN0IGNsa19vcHMgc2h4M19idXNfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiBJRkNfUE9TKSAmIElGQ19NU0spOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaHgzX2NwdV9jbGtfb3BzID0gewpAQCAtODMsMTAgKzgzLDEwIEBACiAJCSpvcHMgPSBzaHgzX2Nsa19vcHNbaWR4XTsKIH0KIAotc3RhdGljIHZvaWQgc2h5d2F5X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgc2h5d2F5X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoKGN0cmxfaW5sKEZSUUNSKSA+PiBDRkNfUE9TKSAmIENGQ19NU0spOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gY2ZjX2Rpdmlzb3JzW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gY2ZjX2Rpdmlzb3JzW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaHgzX3NoeXdheV9jbGtfb3BzID0gewpAQCAtOTUsNyArOTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGNsayBzaHgzX3NoeXdheV9jbGsgPSB7CiAJLm5hbWUJCT0gInNoeXdheV9jbGsiLAotCS5mbGFncwkJPSBDTEtfQUxXQVlTX0VOQUJMRUQsCisJLmZsYWdzCQk9IENMS19FTkFCTEVfT05fSU5JVCwKIAkub3BzCQk9ICZzaHgzX3NoeXdheV9jbGtfb3BzLAogfTsKIApAQCAtMTA3LDI5ICsxMDcsMjIgQEAKIAkmc2h4M19zaHl3YXlfY2xrLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2h4M19jbGtfaW5pdCh2b2lkKQoraW50IF9faW5pdCBhcmNoX2Nsa19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGNsayAqY2xrID0gY2xrX2dldChOVUxMLCAibWFzdGVyX2NsayIpOwotCWludCBpOworCXN0cnVjdCBjbGsgKmNsazsKKwlpbnQgaSwgcmV0ID0gMDsKIAorCWNwZ19jbGtfaW5pdCgpOworCisJY2xrID0gY2xrX2dldChOVUxMLCAibWFzdGVyX2NsayIpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNoeDNfb25jaGlwX2Nsb2Nrcyk7IGkrKykgewogCQlzdHJ1Y3QgY2xrICpjbGtwID0gc2h4M19vbmNoaXBfY2xvY2tzW2ldOwogCiAJCWNsa3AtPnBhcmVudCA9IGNsazsKLQkJY2xrX3JlZ2lzdGVyKGNsa3ApOwotCQljbGtfZW5hYmxlKGNsa3ApOworCQlyZXQgfD0gY2xrX3JlZ2lzdGVyKGNsa3ApOwogCX0KIAotCS8qCi0JICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVzdCBvZiB0aGUgY2xvY2tzIHJlZ2lzdGVyZWQsIHdlIG5lZWQgdG8KLQkgKiBmb3JjZSB0aGUgcGFyZW50IGNsb2NrIHRvIHByb3BhZ2F0ZSBzbyB0aGF0IHRoZXNlIGNsb2NrcyB3aWxsCi0JICogYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IHRoZWlyIHJhdGUuIFdlIGNoZWF0IGJ5IGhhbmRpbmcgdGhlCi0JICogcGFyZW50IGNsb2NrIGl0cyBjdXJyZW50IHJhdGUgYW5kIGZvcmNpbmcgY2hpbGQgcHJvcGFnYXRpb24uCi0JICovCi0JY2xrX3NldF9yYXRlKGNsaywgY2xrX2dldF9yYXRlKGNsaykpOwotCiAJY2xrX3B1dChjbGspOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KLWFyY2hfaW5pdGNhbGwoc2h4M19jbGtfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9waW5tdXgtc2g3NzI0LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9waW5tdXgtc2g3NzI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmMGY5NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3Bpbm11eC1zaDc3MjQuYwpAQCAtMCwwICsxLDIyMzAgQEAKKy8qCisgKiBTSDc3MjQgUGlubXV4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKgorICogS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgorICoKKyAqIEJhc2VkIG9uIFNINzcyMyBQaW5tdXgKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggIE1hZ251cyBEYW1tCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8Y3B1L3NoNzcyNC5oPgorCitlbnVtIHsKKwlQSU5NVVhfUkVTRVJWRUQgPSAwLAorCisJUElOTVVYX0RBVEFfQkVHSU4sCisJUFRBN19EQVRBLCBQVEE2X0RBVEEsIFBUQTVfREFUQSwgUFRBNF9EQVRBLAorCVBUQTNfREFUQSwgUFRBMl9EQVRBLCBQVEExX0RBVEEsIFBUQTBfREFUQSwKKwlQVEI3X0RBVEEsIFBUQjZfREFUQSwgUFRCNV9EQVRBLCBQVEI0X0RBVEEsCisJUFRCM19EQVRBLCBQVEIyX0RBVEEsIFBUQjFfREFUQSwgUFRCMF9EQVRBLAorCVBUQzdfREFUQSwgUFRDNl9EQVRBLCBQVEM1X0RBVEEsIFBUQzRfREFUQSwKKwlQVEMzX0RBVEEsIFBUQzJfREFUQSwgUFRDMV9EQVRBLCBQVEMwX0RBVEEsCisJUFREN19EQVRBLCBQVEQ2X0RBVEEsIFBURDVfREFUQSwgUFRENF9EQVRBLAorCVBURDNfREFUQSwgUFREMl9EQVRBLCBQVEQxX0RBVEEsIFBURDBfREFUQSwKKwlQVEU3X0RBVEEsIFBURTZfREFUQSwgUFRFNV9EQVRBLCBQVEU0X0RBVEEsCisJUFRFM19EQVRBLCBQVEUyX0RBVEEsIFBURTFfREFUQSwgUFRFMF9EQVRBLAorCVBURjdfREFUQSwgUFRGNl9EQVRBLCBQVEY1X0RBVEEsIFBURjRfREFUQSwKKwlQVEYzX0RBVEEsIFBURjJfREFUQSwgUFRGMV9EQVRBLCBQVEYwX0RBVEEsCisJCQkgICAgICBQVEc1X0RBVEEsIFBURzRfREFUQSwKKwlQVEczX0RBVEEsIFBURzJfREFUQSwgUFRHMV9EQVRBLCBQVEcwX0RBVEEsCisJUFRIN19EQVRBLCBQVEg2X0RBVEEsIFBUSDVfREFUQSwgUFRINF9EQVRBLAorCVBUSDNfREFUQSwgUFRIMl9EQVRBLCBQVEgxX0RBVEEsIFBUSDBfREFUQSwKKwlQVEo3X0RBVEEsIFBUSjZfREFUQSwgUFRKNV9EQVRBLAorCVBUSjNfREFUQSwgUFRKMl9EQVRBLCBQVEoxX0RBVEEsIFBUSjBfREFUQSwKKwlQVEs3X0RBVEEsIFBUSzZfREFUQSwgUFRLNV9EQVRBLCBQVEs0X0RBVEEsCisJUFRLM19EQVRBLCBQVEsyX0RBVEEsIFBUSzFfREFUQSwgUFRLMF9EQVRBLAorCVBUTDdfREFUQSwgUFRMNl9EQVRBLCBQVEw1X0RBVEEsIFBUTDRfREFUQSwKKwlQVEwzX0RBVEEsIFBUTDJfREFUQSwgUFRMMV9EQVRBLCBQVEwwX0RBVEEsCisJUFRNN19EQVRBLCBQVE02X0RBVEEsIFBUTTVfREFUQSwgUFRNNF9EQVRBLAorCVBUTTNfREFUQSwgUFRNMl9EQVRBLCBQVE0xX0RBVEEsIFBUTTBfREFUQSwKKwlQVE43X0RBVEEsIFBUTjZfREFUQSwgUFRONV9EQVRBLCBQVE40X0RBVEEsCisJUFROM19EQVRBLCBQVE4yX0RBVEEsIFBUTjFfREFUQSwgUFROMF9EQVRBLAorCVBUUTdfREFUQSwgUFRRNl9EQVRBLCBQVFE1X0RBVEEsIFBUUTRfREFUQSwKKwlQVFEzX0RBVEEsIFBUUTJfREFUQSwgUFRRMV9EQVRBLCBQVFEwX0RBVEEsCisJUFRSN19EQVRBLCBQVFI2X0RBVEEsIFBUUjVfREFUQSwgUFRSNF9EQVRBLAorCVBUUjNfREFUQSwgUFRSMl9EQVRBLCBQVFIxX0RBVEEsIFBUUjBfREFUQSwKKwkJICAgUFRTNl9EQVRBLCBQVFM1X0RBVEEsIFBUUzRfREFUQSwKKwlQVFMzX0RBVEEsIFBUUzJfREFUQSwgUFRTMV9EQVRBLCBQVFMwX0RBVEEsCisJUFRUN19EQVRBLCBQVFQ2X0RBVEEsIFBUVDVfREFUQSwgUFRUNF9EQVRBLAorCVBUVDNfREFUQSwgUFRUMl9EQVRBLCBQVFQxX0RBVEEsIFBUVDBfREFUQSwKKwlQVFU3X0RBVEEsIFBUVTZfREFUQSwgUFRVNV9EQVRBLCBQVFU0X0RBVEEsCisJUFRVM19EQVRBLCBQVFUyX0RBVEEsIFBUVTFfREFUQSwgUFRVMF9EQVRBLAorCVBUVjdfREFUQSwgUFRWNl9EQVRBLCBQVFY1X0RBVEEsIFBUVjRfREFUQSwKKwlQVFYzX0RBVEEsIFBUVjJfREFUQSwgUFRWMV9EQVRBLCBQVFYwX0RBVEEsCisJUFRXN19EQVRBLCBQVFc2X0RBVEEsIFBUVzVfREFUQSwgUFRXNF9EQVRBLAorCVBUVzNfREFUQSwgUFRXMl9EQVRBLCBQVFcxX0RBVEEsIFBUVzBfREFUQSwKKwlQVFg3X0RBVEEsIFBUWDZfREFUQSwgUFRYNV9EQVRBLCBQVFg0X0RBVEEsCisJUFRYM19EQVRBLCBQVFgyX0RBVEEsIFBUWDFfREFUQSwgUFRYMF9EQVRBLAorCVBUWTdfREFUQSwgUFRZNl9EQVRBLCBQVFk1X0RBVEEsIFBUWTRfREFUQSwKKwlQVFkzX0RBVEEsIFBUWTJfREFUQSwgUFRZMV9EQVRBLCBQVFkwX0RBVEEsCisJUFRaN19EQVRBLCBQVFo2X0RBVEEsIFBUWjVfREFUQSwgUFRaNF9EQVRBLAorCVBUWjNfREFUQSwgUFRaMl9EQVRBLCBQVFoxX0RBVEEsIFBUWjBfREFUQSwKKwlQSU5NVVhfREFUQV9FTkQsCisKKwlQSU5NVVhfSU5QVVRfQkVHSU4sCisJUFRBN19JTiwgUFRBNl9JTiwgUFRBNV9JTiwgUFRBNF9JTiwKKwlQVEEzX0lOLCBQVEEyX0lOLCBQVEExX0lOLCBQVEEwX0lOLAorCVBUQjdfSU4sIFBUQjZfSU4sIFBUQjVfSU4sIFBUQjRfSU4sCisJUFRCM19JTiwgUFRCMl9JTiwgUFRCMV9JTiwgUFRCMF9JTiwKKwlQVEM3X0lOLCBQVEM2X0lOLCBQVEM1X0lOLCBQVEM0X0lOLAorCVBUQzNfSU4sIFBUQzJfSU4sIFBUQzFfSU4sIFBUQzBfSU4sCisJUFREN19JTiwgUFRENl9JTiwgUFRENV9JTiwgUFRENF9JTiwKKwlQVEQzX0lOLCBQVEQyX0lOLCBQVEQxX0lOLCBQVEQwX0lOLAorCVBURTdfSU4sIFBURTZfSU4sIFBURTVfSU4sIFBURTRfSU4sCisJUFRFM19JTiwgUFRFMl9JTiwgUFRFMV9JTiwgUFRFMF9JTiwKKwlQVEY3X0lOLCBQVEY2X0lOLCBQVEY1X0lOLCBQVEY0X0lOLAorCVBURjNfSU4sIFBURjJfSU4sIFBURjFfSU4sIFBURjBfSU4sCisJUFRIN19JTiwgUFRINl9JTiwgUFRINV9JTiwgUFRINF9JTiwKKwlQVEgzX0lOLCBQVEgyX0lOLCBQVEgxX0lOLCBQVEgwX0lOLAorCVBUSjNfSU4sIFBUSjJfSU4sIFBUSjFfSU4sIFBUSjBfSU4sCisJUFRLN19JTiwgUFRLNl9JTiwgUFRLNV9JTiwgUFRLNF9JTiwKKwlQVEszX0lOLCBQVEsyX0lOLCBQVEsxX0lOLCBQVEswX0lOLAorCVBUTDdfSU4sIFBUTDZfSU4sIFBUTDVfSU4sIFBUTDRfSU4sCisJUFRMM19JTiwgUFRMMl9JTiwgUFRMMV9JTiwgUFRMMF9JTiwKKwlQVE03X0lOLCBQVE02X0lOLCBQVE01X0lOLCBQVE00X0lOLAorCVBUTTNfSU4sIFBUTTJfSU4sIFBUTTFfSU4sIFBUTTBfSU4sCisJUFRON19JTiwgUFRONl9JTiwgUFRONV9JTiwgUFRONF9JTiwKKwlQVE4zX0lOLCBQVE4yX0lOLCBQVE4xX0lOLCBQVE4wX0lOLAorCVBUUTdfSU4sIFBUUTZfSU4sIFBUUTVfSU4sIFBUUTRfSU4sCisJUFRRM19JTiwgUFRRMl9JTiwgUFRRMV9JTiwgUFRRMF9JTiwKKwlQVFI3X0lOLCBQVFI2X0lOLCBQVFI1X0lOLCBQVFI0X0lOLAorCVBUUjNfSU4sIFBUUjJfSU4sIFBUUjFfSU4sIFBUUjBfSU4sCisJCSBQVFM2X0lOLCBQVFM1X0lOLCBQVFM0X0lOLAorCVBUUzNfSU4sIFBUUzJfSU4sIFBUUzFfSU4sIFBUUzBfSU4sCisJUFRUN19JTiwgUFRUNl9JTiwgUFRUNV9JTiwgUFRUNF9JTiwKKwlQVFQzX0lOLCBQVFQyX0lOLCBQVFQxX0lOLCBQVFQwX0lOLAorCVBUVTdfSU4sIFBUVTZfSU4sIFBUVTVfSU4sIFBUVTRfSU4sCisJUFRVM19JTiwgUFRVMl9JTiwgUFRVMV9JTiwgUFRVMF9JTiwKKwlQVFY3X0lOLCBQVFY2X0lOLCBQVFY1X0lOLCBQVFY0X0lOLAorCVBUVjNfSU4sIFBUVjJfSU4sIFBUVjFfSU4sIFBUVjBfSU4sCisJUFRXN19JTiwgUFRXNl9JTiwgUFRXNV9JTiwgUFRXNF9JTiwKKwlQVFczX0lOLCBQVFcyX0lOLCBQVFcxX0lOLCBQVFcwX0lOLAorCVBUWDdfSU4sIFBUWDZfSU4sIFBUWDVfSU4sIFBUWDRfSU4sCisJUFRYM19JTiwgUFRYMl9JTiwgUFRYMV9JTiwgUFRYMF9JTiwKKwlQVFk3X0lOLCBQVFk2X0lOLCBQVFk1X0lOLCBQVFk0X0lOLAorCVBUWTNfSU4sIFBUWTJfSU4sIFBUWTFfSU4sIFBUWTBfSU4sCisJUFRaN19JTiwgUFRaNl9JTiwgUFRaNV9JTiwgUFRaNF9JTiwKKwlQVFozX0lOLCBQVFoyX0lOLCBQVFoxX0lOLCBQVFowX0lOLAorCVBJTk1VWF9JTlBVVF9FTkQsCisKKwlQSU5NVVhfSU5QVVRfUFVMTFVQX0JFR0lOLAorCVBUQTdfSU5fUFUsIFBUQTZfSU5fUFUsIFBUQTVfSU5fUFUsIFBUQTRfSU5fUFUsCisJUFRBM19JTl9QVSwgUFRBMl9JTl9QVSwgUFRBMV9JTl9QVSwgUFRBMF9JTl9QVSwKKwlQVEI3X0lOX1BVLCBQVEI2X0lOX1BVLCBQVEI1X0lOX1BVLCBQVEI0X0lOX1BVLAorCVBUQjNfSU5fUFUsIFBUQjJfSU5fUFUsIFBUQjFfSU5fUFUsIFBUQjBfSU5fUFUsCisJUFRDN19JTl9QVSwgUFRDNl9JTl9QVSwgUFRDNV9JTl9QVSwgUFRDNF9JTl9QVSwKKwlQVEMzX0lOX1BVLCBQVEMyX0lOX1BVLCBQVEMxX0lOX1BVLCBQVEMwX0lOX1BVLAorCVBURDdfSU5fUFUsIFBURDZfSU5fUFUsIFBURDVfSU5fUFUsIFBURDRfSU5fUFUsCisJUFREM19JTl9QVSwgUFREMl9JTl9QVSwgUFREMV9JTl9QVSwgUFREMF9JTl9QVSwKKwlQVEU3X0lOX1BVLCBQVEU2X0lOX1BVLCBQVEU1X0lOX1BVLCBQVEU0X0lOX1BVLAorCVBURTNfSU5fUFUsIFBURTJfSU5fUFUsIFBURTFfSU5fUFUsIFBURTBfSU5fUFUsCisJUFRGN19JTl9QVSwgUFRGNl9JTl9QVSwgUFRGNV9JTl9QVSwgUFRGNF9JTl9QVSwKKwlQVEYzX0lOX1BVLCBQVEYyX0lOX1BVLCBQVEYxX0lOX1BVLCBQVEYwX0lOX1BVLAorCVBUSDdfSU5fUFUsIFBUSDZfSU5fUFUsIFBUSDVfSU5fUFUsIFBUSDRfSU5fUFUsCisJUFRIM19JTl9QVSwgUFRIMl9JTl9QVSwgUFRIMV9JTl9QVSwgUFRIMF9JTl9QVSwKKwlQVEozX0lOX1BVLCBQVEoyX0lOX1BVLCBQVEoxX0lOX1BVLCBQVEowX0lOX1BVLAorCVBUSzdfSU5fUFUsIFBUSzZfSU5fUFUsIFBUSzVfSU5fUFUsIFBUSzRfSU5fUFUsCisJUFRLM19JTl9QVSwgUFRLMl9JTl9QVSwgUFRLMV9JTl9QVSwgUFRLMF9JTl9QVSwKKwlQVEw3X0lOX1BVLCBQVEw2X0lOX1BVLCBQVEw1X0lOX1BVLCBQVEw0X0lOX1BVLAorCVBUTDNfSU5fUFUsIFBUTDJfSU5fUFUsIFBUTDFfSU5fUFUsIFBUTDBfSU5fUFUsCisJUFRNN19JTl9QVSwgUFRNNl9JTl9QVSwgUFRNNV9JTl9QVSwgUFRNNF9JTl9QVSwKKwlQVE0zX0lOX1BVLCBQVE0yX0lOX1BVLCBQVE0xX0lOX1BVLCBQVE0wX0lOX1BVLAorCVBUTjdfSU5fUFUsIFBUTjZfSU5fUFUsIFBUTjVfSU5fUFUsIFBUTjRfSU5fUFUsCisJUFROM19JTl9QVSwgUFROMl9JTl9QVSwgUFROMV9JTl9QVSwgUFROMF9JTl9QVSwKKwlQVFE3X0lOX1BVLCBQVFE2X0lOX1BVLCBQVFE1X0lOX1BVLCBQVFE0X0lOX1BVLAorCVBUUTNfSU5fUFUsIFBUUTJfSU5fUFUsIFBUUTFfSU5fUFUsIFBUUTBfSU5fUFUsCisJUFRSN19JTl9QVSwgUFRSNl9JTl9QVSwgUFRSNV9JTl9QVSwgUFRSNF9JTl9QVSwKKwlQVFIzX0lOX1BVLCBQVFIyX0lOX1BVLCBQVFIxX0lOX1BVLCBQVFIwX0lOX1BVLAorCQkgICAgUFRTNl9JTl9QVSwgUFRTNV9JTl9QVSwgUFRTNF9JTl9QVSwKKwlQVFMzX0lOX1BVLCBQVFMyX0lOX1BVLCBQVFMxX0lOX1BVLCBQVFMwX0lOX1BVLAorCVBUVDdfSU5fUFUsIFBUVDZfSU5fUFUsIFBUVDVfSU5fUFUsIFBUVDRfSU5fUFUsCisJUFRUM19JTl9QVSwgUFRUMl9JTl9QVSwgUFRUMV9JTl9QVSwgUFRUMF9JTl9QVSwKKwlQVFU3X0lOX1BVLCBQVFU2X0lOX1BVLCBQVFU1X0lOX1BVLCBQVFU0X0lOX1BVLAorCVBUVTNfSU5fUFUsIFBUVTJfSU5fUFUsIFBUVTFfSU5fUFUsIFBUVTBfSU5fUFUsCisJUFRWN19JTl9QVSwgUFRWNl9JTl9QVSwgUFRWNV9JTl9QVSwgUFRWNF9JTl9QVSwKKwlQVFYzX0lOX1BVLCBQVFYyX0lOX1BVLCBQVFYxX0lOX1BVLCBQVFYwX0lOX1BVLAorCVBUVzdfSU5fUFUsIFBUVzZfSU5fUFUsIFBUVzVfSU5fUFUsIFBUVzRfSU5fUFUsCisJUFRXM19JTl9QVSwgUFRXMl9JTl9QVSwgUFRXMV9JTl9QVSwgUFRXMF9JTl9QVSwKKwlQVFg3X0lOX1BVLCBQVFg2X0lOX1BVLCBQVFg1X0lOX1BVLCBQVFg0X0lOX1BVLAorCVBUWDNfSU5fUFUsIFBUWDJfSU5fUFUsIFBUWDFfSU5fUFUsIFBUWDBfSU5fUFUsCisJUFRZN19JTl9QVSwgUFRZNl9JTl9QVSwgUFRZNV9JTl9QVSwgUFRZNF9JTl9QVSwKKwlQVFkzX0lOX1BVLCBQVFkyX0lOX1BVLCBQVFkxX0lOX1BVLCBQVFkwX0lOX1BVLAorCVBUWjdfSU5fUFUsIFBUWjZfSU5fUFUsIFBUWjVfSU5fUFUsIFBUWjRfSU5fUFUsCisJUFRaM19JTl9QVSwgUFRaMl9JTl9QVSwgUFRaMV9JTl9QVSwgUFRaMF9JTl9QVSwKKwlQSU5NVVhfSU5QVVRfUFVMTFVQX0VORCwKKworCVBJTk1VWF9PVVRQVVRfQkVHSU4sCisJUFRBN19PVVQsIFBUQTZfT1VULCBQVEE1X09VVCwgUFRBNF9PVVQsCisJUFRBM19PVVQsIFBUQTJfT1VULCBQVEExX09VVCwgUFRBMF9PVVQsCisJUFRCN19PVVQsIFBUQjZfT1VULCBQVEI1X09VVCwgUFRCNF9PVVQsCisJUFRCM19PVVQsIFBUQjJfT1VULCBQVEIxX09VVCwgUFRCMF9PVVQsCisJUFRDN19PVVQsIFBUQzZfT1VULCBQVEM1X09VVCwgUFRDNF9PVVQsCisJUFRDM19PVVQsIFBUQzJfT1VULCBQVEMxX09VVCwgUFRDMF9PVVQsCisJUFREN19PVVQsIFBURDZfT1VULCBQVEQ1X09VVCwgUFRENF9PVVQsCisJUFREM19PVVQsIFBURDJfT1VULCBQVEQxX09VVCwgUFREMF9PVVQsCisJUFRFN19PVVQsIFBURTZfT1VULCBQVEU1X09VVCwgUFRFNF9PVVQsCisJUFRFM19PVVQsIFBURTJfT1VULCBQVEUxX09VVCwgUFRFMF9PVVQsCisJUFRGN19PVVQsIFBURjZfT1VULCBQVEY1X09VVCwgUFRGNF9PVVQsCisJUFRGM19PVVQsIFBURjJfT1VULCBQVEYxX09VVCwgUFRGMF9PVVQsCisJCQkgICAgUFRHNV9PVVQsIFBURzRfT1VULAorCVBURzNfT1VULCBQVEcyX09VVCwgUFRHMV9PVVQsIFBURzBfT1VULAorCVBUSDdfT1VULCBQVEg2X09VVCwgUFRINV9PVVQsIFBUSDRfT1VULAorCVBUSDNfT1VULCBQVEgyX09VVCwgUFRIMV9PVVQsIFBUSDBfT1VULAorCVBUSjdfT1VULCBQVEo2X09VVCwgUFRKNV9PVVQsCisJUFRKM19PVVQsIFBUSjJfT1VULCBQVEoxX09VVCwgUFRKMF9PVVQsCisJUFRLN19PVVQsIFBUSzZfT1VULCBQVEs1X09VVCwgUFRLNF9PVVQsCisJUFRLM19PVVQsIFBUSzJfT1VULCBQVEsxX09VVCwgUFRLMF9PVVQsCisJUFRMN19PVVQsIFBUTDZfT1VULCBQVEw1X09VVCwgUFRMNF9PVVQsCisJUFRMM19PVVQsIFBUTDJfT1VULCBQVEwxX09VVCwgUFRMMF9PVVQsCisJUFRNN19PVVQsIFBUTTZfT1VULCBQVE01X09VVCwgUFRNNF9PVVQsCisJUFRNM19PVVQsIFBUTTJfT1VULCBQVE0xX09VVCwgUFRNMF9PVVQsCisJUFRON19PVVQsIFBUTjZfT1VULCBQVE41X09VVCwgUFRONF9PVVQsCisJUFROM19PVVQsIFBUTjJfT1VULCBQVE4xX09VVCwgUFROMF9PVVQsCisJUFRRN19PVVQsIFBUUTZfT1VULCBQVFE1X09VVCwgUFRRNF9PVVQsCisJUFRRM19PVVQsIFBUUTJfT1VULCBQVFExX09VVCwgUFRRMF9PVVQsCisJUFRSN19PVVQsIFBUUjZfT1VULCBQVFI1X09VVCwgUFRSNF9PVVQsCisJCQkgICAgUFRSMV9PVVQsIFBUUjBfT1VULAorCQkgIFBUUzZfT1VULCBQVFM1X09VVCwgUFRTNF9PVVQsCisJUFRTM19PVVQsIFBUUzJfT1VULCBQVFMxX09VVCwgUFRTMF9PVVQsCisJUFRUN19PVVQsIFBUVDZfT1VULCBQVFQ1X09VVCwgUFRUNF9PVVQsCisJUFRUM19PVVQsIFBUVDJfT1VULCBQVFQxX09VVCwgUFRUMF9PVVQsCisJUFRVN19PVVQsIFBUVTZfT1VULCBQVFU1X09VVCwgUFRVNF9PVVQsCisJUFRVM19PVVQsIFBUVTJfT1VULCBQVFUxX09VVCwgUFRVMF9PVVQsCisJUFRWN19PVVQsIFBUVjZfT1VULCBQVFY1X09VVCwgUFRWNF9PVVQsCisJUFRWM19PVVQsIFBUVjJfT1VULCBQVFYxX09VVCwgUFRWMF9PVVQsCisJUFRXN19PVVQsIFBUVzZfT1VULCBQVFc1X09VVCwgUFRXNF9PVVQsCisJUFRXM19PVVQsIFBUVzJfT1VULCBQVFcxX09VVCwgUFRXMF9PVVQsCisJUFRYN19PVVQsIFBUWDZfT1VULCBQVFg1X09VVCwgUFRYNF9PVVQsCisJUFRYM19PVVQsIFBUWDJfT1VULCBQVFgxX09VVCwgUFRYMF9PVVQsCisJUFRZN19PVVQsIFBUWTZfT1VULCBQVFk1X09VVCwgUFRZNF9PVVQsCisJUFRZM19PVVQsIFBUWTJfT1VULCBQVFkxX09VVCwgUFRZMF9PVVQsCisJUFRaN19PVVQsIFBUWjZfT1VULCBQVFo1X09VVCwgUFRaNF9PVVQsCisJUFRaM19PVVQsIFBUWjJfT1VULCBQVFoxX09VVCwgUFRaMF9PVVQsCisJUElOTVVYX09VVFBVVF9FTkQsCisKKwlQSU5NVVhfRlVOQ1RJT05fQkVHSU4sCisJUFRBN19GTiwgUFRBNl9GTiwgUFRBNV9GTiwgUFRBNF9GTiwKKwlQVEEzX0ZOLCBQVEEyX0ZOLCBQVEExX0ZOLCBQVEEwX0ZOLAorCVBUQjdfRk4sIFBUQjZfRk4sIFBUQjVfRk4sIFBUQjRfRk4sCisJUFRCM19GTiwgUFRCMl9GTiwgUFRCMV9GTiwgUFRCMF9GTiwKKwlQVEM3X0ZOLCBQVEM2X0ZOLCBQVEM1X0ZOLCBQVEM0X0ZOLAorCVBUQzNfRk4sIFBUQzJfRk4sIFBUQzFfRk4sIFBUQzBfRk4sCisJUFREN19GTiwgUFRENl9GTiwgUFRENV9GTiwgUFRENF9GTiwKKwlQVEQzX0ZOLCBQVEQyX0ZOLCBQVEQxX0ZOLCBQVEQwX0ZOLAorCVBURTdfRk4sIFBURTZfRk4sIFBURTVfRk4sIFBURTRfRk4sCisJUFRFM19GTiwgUFRFMl9GTiwgUFRFMV9GTiwgUFRFMF9GTiwKKwlQVEY3X0ZOLCBQVEY2X0ZOLCBQVEY1X0ZOLCBQVEY0X0ZOLAorCVBURjNfRk4sIFBURjJfRk4sIFBURjFfRk4sIFBURjBfRk4sCisJCQkgIFBURzVfRk4sIFBURzRfRk4sCisJUFRHM19GTiwgUFRHMl9GTiwgUFRHMV9GTiwgUFRHMF9GTiwKKwlQVEg3X0ZOLCBQVEg2X0ZOLCBQVEg1X0ZOLCBQVEg0X0ZOLAorCVBUSDNfRk4sIFBUSDJfRk4sIFBUSDFfRk4sIFBUSDBfRk4sCisJUFRKN19GTiwgUFRKNl9GTiwgUFRKNV9GTiwKKwlQVEozX0ZOLCBQVEoyX0ZOLCBQVEoxX0ZOLCBQVEowX0ZOLAorCVBUSzdfRk4sIFBUSzZfRk4sIFBUSzVfRk4sIFBUSzRfRk4sCisJUFRLM19GTiwgUFRLMl9GTiwgUFRLMV9GTiwgUFRLMF9GTiwKKwlQVEw3X0ZOLCBQVEw2X0ZOLCBQVEw1X0ZOLCBQVEw0X0ZOLAorCVBUTDNfRk4sIFBUTDJfRk4sIFBUTDFfRk4sIFBUTDBfRk4sCisJUFRNN19GTiwgUFRNNl9GTiwgUFRNNV9GTiwgUFRNNF9GTiwKKwlQVE0zX0ZOLCBQVE0yX0ZOLCBQVE0xX0ZOLCBQVE0wX0ZOLAorCVBUTjdfRk4sIFBUTjZfRk4sIFBUTjVfRk4sIFBUTjRfRk4sCisJUFROM19GTiwgUFROMl9GTiwgUFROMV9GTiwgUFROMF9GTiwKKwlQVFE3X0ZOLCBQVFE2X0ZOLCBQVFE1X0ZOLCBQVFE0X0ZOLAorCVBUUTNfRk4sIFBUUTJfRk4sIFBUUTFfRk4sIFBUUTBfRk4sCisJUFRSN19GTiwgUFRSNl9GTiwgUFRSNV9GTiwgUFRSNF9GTiwKKwlQVFIzX0ZOLCBQVFIyX0ZOLCBQVFIxX0ZOLCBQVFIwX0ZOLAorCQkgUFRTNl9GTiwgUFRTNV9GTiwgUFRTNF9GTiwKKwlQVFMzX0ZOLCBQVFMyX0ZOLCBQVFMxX0ZOLCBQVFMwX0ZOLAorCVBUVDdfRk4sIFBUVDZfRk4sIFBUVDVfRk4sIFBUVDRfRk4sCisJUFRUM19GTiwgUFRUMl9GTiwgUFRUMV9GTiwgUFRUMF9GTiwKKwlQVFU3X0ZOLCBQVFU2X0ZOLCBQVFU1X0ZOLCBQVFU0X0ZOLAorCVBUVTNfRk4sIFBUVTJfRk4sIFBUVTFfRk4sIFBUVTBfRk4sCisJUFRWN19GTiwgUFRWNl9GTiwgUFRWNV9GTiwgUFRWNF9GTiwKKwlQVFYzX0ZOLCBQVFYyX0ZOLCBQVFYxX0ZOLCBQVFYwX0ZOLAorCVBUVzdfRk4sIFBUVzZfRk4sIFBUVzVfRk4sIFBUVzRfRk4sCisJUFRXM19GTiwgUFRXMl9GTiwgUFRXMV9GTiwgUFRXMF9GTiwKKwlQVFg3X0ZOLCBQVFg2X0ZOLCBQVFg1X0ZOLCBQVFg0X0ZOLAorCVBUWDNfRk4sIFBUWDJfRk4sIFBUWDFfRk4sIFBUWDBfRk4sCisJUFRZN19GTiwgUFRZNl9GTiwgUFRZNV9GTiwgUFRZNF9GTiwKKwlQVFkzX0ZOLCBQVFkyX0ZOLCBQVFkxX0ZOLCBQVFkwX0ZOLAorCVBUWjdfRk4sIFBUWjZfRk4sIFBUWjVfRk4sIFBUWjRfRk4sCisJUFRaM19GTiwgUFRaMl9GTiwgUFRaMV9GTiwgUFRaMF9GTiwKKworCisJUFNBMTVfMCwgUFNBMTVfMSwKKwlQU0ExNF8wLCBQU0ExNF8xLAorCVBTQTEzXzAsIFBTQTEzXzEsCisJUFNBMTJfMCwgUFNBMTJfMSwKKwlQU0ExMF8wLCBQU0ExMF8xLAorCVBTQTlfMCwgIFBTQTlfMSwKKwlQU0E4XzAsICBQU0E4XzEsCisJUFNBN18wLCAgUFNBN18xLAorCVBTQTZfMCwgIFBTQTZfMSwKKwlQU0E1XzAsICBQU0E1XzEsCisJUFNBM18wLCAgUFNBM18xLAorCVBTQTJfMCwgIFBTQTJfMSwKKwlQU0ExXzAsICBQU0ExXzEsCisJUFNBMF8wLCAgUFNBMF8xLAorCisJUFNCMTRfMCwgUFNCMTRfMSwKKwlQU0IxM18wLCBQU0IxM18xLAorCVBTQjEyXzAsIFBTQjEyXzEsCisJUFNCMTFfMCwgUFNCMTFfMSwKKwlQU0IxMF8wLCBQU0IxMF8xLAorCVBTQjlfMCwgIFBTQjlfMSwKKwlQU0I4XzAsICBQU0I4XzEsCisJUFNCN18wLCAgUFNCN18xLAorCVBTQjZfMCwgIFBTQjZfMSwKKwlQU0I1XzAsICBQU0I1XzEsCisJUFNCNF8wLCAgUFNCNF8xLAorCVBTQjNfMCwgIFBTQjNfMSwKKwlQU0IyXzAsICBQU0IyXzEsCisJUFNCMV8wLCAgUFNCMV8xLAorCVBTQjBfMCwgIFBTQjBfMSwKKworCVBTQzE1XzAsIFBTQzE1XzEsCisJUFNDMTRfMCwgUFNDMTRfMSwKKwlQU0MxM18wLCBQU0MxM18xLAorCVBTQzEyXzAsIFBTQzEyXzEsCisJUFNDMTFfMCwgUFNDMTFfMSwKKwlQU0MxMF8wLCBQU0MxMF8xLAorCVBTQzlfMCwgIFBTQzlfMSwKKwlQU0M4XzAsICBQU0M4XzEsCisJUFNDN18wLCAgUFNDN18xLAorCVBTQzZfMCwgIFBTQzZfMSwKKwlQU0M1XzAsICBQU0M1XzEsCisJUFNDNF8wLCAgUFNDNF8xLAorCVBTQzJfMCwgIFBTQzJfMSwKKwlQU0MxXzAsICBQU0MxXzEsCisJUFNDMF8wLCAgUFNDMF8xLAorCisJUFNEMTVfMCwgUFNEMTVfMSwKKwlQU0QxNF8wLCBQU0QxNF8xLAorCVBTRDEzXzAsIFBTRDEzXzEsCisJUFNEMTJfMCwgUFNEMTJfMSwKKwlQU0QxMV8wLCBQU0QxMV8xLAorCVBTRDEwXzAsIFBTRDEwXzEsCisJUFNEOV8wLCAgUFNEOV8xLAorCVBTRDhfMCwgIFBTRDhfMSwKKwlQU0Q3XzAsICBQU0Q3XzEsCisJUFNENl8wLCAgUFNENl8xLAorCVBTRDVfMCwgIFBTRDVfMSwKKwlQU0Q0XzAsICBQU0Q0XzEsCisJUFNEM18wLCAgUFNEM18xLAorCVBTRDJfMCwgIFBTRDJfMSwKKwlQU0QxXzAsICBQU0QxXzEsCisJUFNEMF8wLCAgUFNEMF8xLAorCisJUFNFMTVfMCwgUFNFMTVfMSwKKwlQU0UxNF8wLCBQU0UxNF8xLAorCVBTRTEzXzAsIFBTRTEzXzEsCisJUFNFMTJfMCwgUFNFMTJfMSwKKwlQU0UxMV8wLCBQU0UxMV8xLAorCVBTRTEwXzAsIFBTRTEwXzEsCisJUFNFOV8wLCAgUFNFOV8xLAorCVBTRThfMCwgIFBTRThfMSwKKwlQU0U3XzAsICBQU0U3XzEsCisJUFNFNl8wLCAgUFNFNl8xLAorCVBTRTVfMCwgIFBTRTVfMSwKKwlQU0U0XzAsICBQU0U0XzEsCisJUFNFM18wLCAgUFNFM18xLAorCVBTRTJfMCwgIFBTRTJfMSwKKwlQU0UxXzAsICBQU0UxXzEsCisJUFNFMF8wLCAgUFNFMF8xLAorCVBJTk1VWF9GVU5DVElPTl9FTkQsCisKKwlQSU5NVVhfTUFSS19CRUdJTiwKKwkvKlBUQSovCisJRDIzX01BUkssCUtFWU9VVDJfTUFSSywJCUlERUQxNV9NQVJLLAorCUQyMl9NQVJLLAlLRVlPVVQxX01BUkssCQlJREVEMTRfTUFSSywKKwlEMjFfTUFSSywJS0VZT1VUMF9NQVJLLAkJSURFRDEzX01BUkssCisJRDIwX01BUkssCUtFWUlONF9NQVJLLAkJSURFRDEyX01BUkssCisJRDE5X01BUkssCUtFWUlOM19NQVJLLAkJSURFRDExX01BUkssCisJRDE4X01BUkssCUtFWUlOMl9NQVJLLAkJSURFRDEwX01BUkssCisJRDE3X01BUkssCUtFWUlOMV9NQVJLLAkJSURFRDlfTUFSSywKKwlEMTZfTUFSSywJS0VZSU4wX01BUkssCQlJREVEOF9NQVJLLAorCisJLypQVEIqLworCUQzMV9NQVJLLAlUUFVUTzFfTUFSSywJCUlERUExX01BUkssCisJRDMwX01BUkssCVRQVVRPMF9NQVJLLAkJSURFQTBfTUFSSywKKwlEMjlfTUFSSywJCQkJSU9EUkVRX01BUkssCisJRDI4X01BUkssCQkJCUlERUNTMF9NQVJLLAorCUQyN19NQVJLLAkJCQlJREVDUzFfTUFSSywKKwlEMjZfTUFSSywJS0VZT1VUNV9JTjVfTUFSSywJSURFSU9SRF9NQVJLLAorCUQyNV9NQVJLLAlLRVlPVVQ0X0lONl9NQVJLLAlJREVJT1dSX01BUkssCisJRDI0X01BUkssCUtFWU9VVDNfTUFSSywJCUlERUlOVF9NQVJLLAorCisJLypQVEMqLworCUxDREQ3X01BUkssCisJTENERDZfTUFSSywKKwlMQ0RENV9NQVJLLAorCUxDREQ0X01BUkssCisJTENERDNfTUFSSywKKwlMQ0REMl9NQVJLLAorCUxDREQxX01BUkssCisJTENERDBfTUFSSywKKworCS8qUFREKi8KKwlMQ0REMTVfTUFSSywKKwlMQ0REMTRfTUFSSywKKwlMQ0REMTNfTUFSSywKKwlMQ0REMTJfTUFSSywKKwlMQ0REMTFfTUFSSywKKwlMQ0REMTBfTUFSSywKKwlMQ0REOV9NQVJLLAorCUxDREQ4X01BUkssCisKKwkvKlBURSovCisJRlNJTUNLQl9NQVJLLAorCUZTSU1DS0FfTUFSSywKKwlMQ0REMjFfTUFSSywJU0NJRjJfTF9UWERfTUFSSywKKwlMQ0REMjBfTUFSSywJU0NJRjRfU0NLX01BUkssCisJTENERDE5X01BUkssCVNDSUY0X1JYRF9NQVJLLAorCUxDREQxOF9NQVJLLAlTQ0lGNF9UWERfTUFSSywKKwlMQ0REMTdfTUFSSywKKwlMQ0REMTZfTUFSSywKKworCS8qUFRGKi8KKwlMQ0RWU1lOX01BUkssCisJTENERElTUF9NQVJLLAlMQ0RSU19NQVJLLAorCUxDREhTWU5fTUFSSywJTENEQ1NfTUFSSywKKwlMQ0RET05fTUFSSywKKwlMQ0REQ0tfTUFSSywJTENEV1JfTUFSSywKKwlMQ0RWRVBXQ19NQVJLLAlTQ0lGMF9UWERfTUFSSywKKwlMQ0REMjNfTUFSSywJU0NJRjJfTF9TQ0tfTUFSSywKKwlMQ0REMjJfTUFSSywJU0NJRjJfTF9SWERfTUFSSywKKworCS8qUFRHKi8KKwlBVURDS19NQVJLLAorCUFVRFNZTkNfTUFSSywKKwlBVURBVEEzX01BUkssCisJQVVEQVRBMl9NQVJLLAorCUFVREFUQTFfTUFSSywKKwlBVURBVEEwX01BUkssCisKKwkvKlBUSCovCisJVklPMF9WRF9NQVJLLAorCVZJTzBfQ0xLX01BUkssCisJVklPMF9EN19NQVJLLAorCVZJTzBfRDZfTUFSSywKKwlWSU8wX0Q1X01BUkssCisJVklPMF9ENF9NQVJLLAorCVZJTzBfRDNfTUFSSywKKwlWSU8wX0QyX01BUkssCisKKwkvKlBUSiovCisJUERTVEFUVVNfTUFSSywKKwlTVEFUVVMyX01BUkssCisJU1RBVFVTMF9NQVJLLAorCUEyNV9NQVJLLAkJQlNfTUFSSywKKwlBMjRfTUFSSywKKwlBMjNfTUFSSywKKwlBMjJfTUFSSywKKworCS8qUFRLKi8KKwlWSU8xX0Q1X01BUkssCVZJTzBfRDEzX01BUkssCUlERUQ1X01BUkssCisJVklPMV9ENF9NQVJLLAlWSU8wX0QxMl9NQVJLLAlJREVENF9NQVJLLAorCVZJTzFfRDNfTUFSSywJVklPMF9EMTFfTUFSSywJSURFRDNfTUFSSywKKwlWSU8xX0QyX01BUkssCVZJTzBfRDEwX01BUkssCUlERUQyX01BUkssCisJVklPMV9EMV9NQVJLLAlWSU8wX0Q5X01BUkssCUlERUQxX01BUkssCisJVklPMV9EMF9NQVJLLAlWSU8wX0Q4X01BUkssCUlERUQwX01BUkssCisJVklPMF9GTERfTUFSSywKKwlWSU8wX0hEX01BUkssCisKKwkvKlBUTCovCisJRFZfRDVfTUFSSywJU0NJRjNfVl9TQ0tfTUFSSywJUk1JSV9SWEQwX01BUkssCisJRFZfRDRfTUFSSywJU0NJRjNfVl9SWERfTUFSSywJUk1JSV9SWEQxX01BUkssCisJRFZfRDNfTUFSSywJU0NJRjNfVl9UWERfTUFSSywJUk1JSV9SRUZfQ0xLX01BUkssCisJRFZfRDJfTUFSSywJU0NJRjFfU0NLX01BUkssCQlSTUlJX1RYX0VOX01BUkssCisJRFZfRDFfTUFSSywJU0NJRjFfUlhEX01BUkssCQlSTUlJX1RYRDBfTUFSSywKKwlEVl9EMF9NQVJLLAlTQ0lGMV9UWERfTUFSSywJCVJNSUlfVFhEMV9NQVJLLAorCURWX0QxNV9NQVJLLAorCURWX0QxNF9NQVJLLAlNU0lPRjBfTUNLX01BUkssCisKKwkvKlBUTSovCisJRFZfRDEzX01BUkssCU1TSU9GMF9UU0NLX01BUkssCisJRFZfRDEyX01BUkssCU1TSU9GMF9SWERfTUFSSywKKwlEVl9EMTFfTUFSSywJTVNJT0YwX1RYRF9NQVJLLAorCURWX0QxMF9NQVJLLAlNU0lPRjBfVFNZTkNfTUFSSywKKwlEVl9EOV9NQVJLLAlNU0lPRjBfU1MxX01BUkssCU1TSU9GMF9SU0NLX01BUkssCisJRFZfRDhfTUFSSywJTVNJT0YwX1NTMl9NQVJLLAlNU0lPRjBfUlNZTkNfTUFSSywKKwlMQ0RWQ1BXQ19NQVJLLAlTQ0lGMF9SWERfTUFSSywKKwlMQ0RSRF9NQVJLLAlTQ0lGMF9TQ0tfTUFSSywKKworCS8qUFROKi8KKwlWSU8wX0QxX01BUkssCisJVklPMF9EMF9NQVJLLAorCURWX0NMS0lfTUFSSywKKwlEVl9DTEtfTUFSSywJU0NJRjJfVl9TQ0tfTUFSSywKKwlEVl9WU1lOQ19NQVJLLAlTQ0lGMl9WX1JYRF9NQVJLLAorCURWX0hTWU5DX01BUkssCVNDSUYyX1ZfVFhEX01BUkssCisJRFZfRDdfTUFSSywJU0NJRjNfVl9DVFNfTUFSSywJUk1JSV9SWF9FUl9NQVJLLAorCURWX0Q2X01BUkssCVNDSUYzX1ZfUlRTX01BUkssCVJNSUlfQ1JTX0RWX01BUkssCisKKwkvKlBUUSovCisJRDdfTUFSSywKKwlENl9NQVJLLAorCUQ1X01BUkssCisJRDRfTUFSSywKKwlEM19NQVJLLAorCUQyX01BUkssCisJRDFfTUFSSywKKwlEMF9NQVJLLAorCisJLypQVFIqLworCUNTNkJfQ0UxQl9NQVJLLAorCUNTNkFfQ0UyQl9NQVJLLAorCUNTNUJfQ0UxQV9NQVJLLAorCUNTNUFfQ0UyQV9NQVJLLAorCUlPSVMxNl9NQVJLLAkJTENETENMS19NQVJLLAorCVdBSVRfTUFSSywKKwlXRTNfSUNJT1dSX01BUkssCVRQVVRPM19NQVJLLAlUUFVUSTNfTUFSSywKKwlXRTJfSUNJT1JEX01BUkssCVRQVVRPMl9NQVJLLAlJREVBMl9NQVJLLAorCisJLypQVFMqLworCVZJT19DS09fTUFSSywKKwlWSU8xX0ZMRF9NQVJLLAlUUFVUSTJfTUFSSywJCUlERUlPUkRZX01BUkssCisJVklPMV9IRF9NQVJLLAlTQ0lGNV9TQ0tfTUFSSywKKwlWSU8xX1ZEX01BUkssCVNDSUY1X1JYRF9NQVJLLAorCVZJTzFfQ0xLX01BUkssCVNDSUY1X1RYRF9NQVJLLAorCVZJTzFfRDdfTUFSSywJVklPMF9EMTVfTUFSSywJCUlERUQ3X01BUkssCisJVklPMV9ENl9NQVJLLAlWSU8wX0QxNF9NQVJLLAkJSURFRDZfTUFSSywKKworCS8qUFRUKi8KKwlEMTVfTUFSSywKKwlEMTRfTUFSSywKKwlEMTNfTUFSSywKKwlEMTJfTUFSSywKKwlEMTFfTUFSSywKKwlEMTBfTUFSSywKKwlEOV9NQVJLLAorCUQ4X01BUkssCisKKwkvKlBUVSovCisJRE1BQ19EQUNLMF9NQVJLLAorCURNQUNfRFJFUTBfTUFSSywKKwlGU0lPQVNEX01BUkssCisJRlNJSUFCQ0tfTUFSSywKKwlGU0lJQUxSQ0tfTUFSSywKKwlGU0lPQUJDS19NQVJLLAorCUZTSU9BTFJDS19NQVJLLAorCUNMS0FVRElPQU9fTUFSSywKKworCS8qUFRWKi8KKwlGU0lJQlNEX01BUkssCQlNU0lPRjFfU1MyX01BUkssCU1TSU9GMV9SU1lOQ19NQVJLLAorCUZTSU9CU0RfTUFSSywJCU1TSU9GMV9TUzFfTUFSSywJTVNJT0YxX1JTQ0tfTUFSSywKKwlGU0lJQkJDS19NQVJLLAkJTVNJT0YxX1JYRF9NQVJLLAorCUZTSUlCTFJDS19NQVJLLAkJTVNJT0YxX1RTWU5DX01BUkssCisJRlNJT0JCQ0tfTUFSSywJCU1TSU9GMV9UU0NLX01BUkssCisJRlNJT0JMUkNLX01BUkssCQlNU0lPRjFfVFhEX01BUkssCisJQ0xLQVVESU9CT19NQVJLLAlNU0lPRjFfTUNLX01BUkssCisJRlNJSUFTRF9NQVJLLAorCisJLypQVFcqLworCU1NQ19EN19NQVJLLAkJU0RISTFDRF9NQVJLLAkJSU9EQUNLX01BUkssCisJTU1DX0Q2X01BUkssCQlTREhJMVdQX01BUkssCQlJREVSU1RfTUFSSywKKwlNTUNfRDVfTUFSSywJCVNESEkxRDNfTUFSSywJCUVYQlVGX0VOQl9NQVJLLAorCU1NQ19ENF9NQVJLLAkJU0RISTFEMl9NQVJLLAkJRElSRUNUSU9OX01BUkssCisJTU1DX0QzX01BUkssCQlTREhJMUQxX01BUkssCisJTU1DX0QyX01BUkssCQlTREhJMUQwX01BUkssCisJTU1DX0QxX01BUkssCQlTREhJMUNNRF9NQVJLLAorCU1NQ19EMF9NQVJLLAkJU0RISTFDTEtfTUFSSywKKworCS8qUFRYKi8KKwlETUFDX0RBQ0sxX01BUkssCUlSREFfT1VUX01BUkssCisJRE1BQ19EUkVRMV9NQVJLLAlJUkRBX0lOX01BUkssCisJVFNJRl9UUzBfU0RBVF9NQVJLLAkJCQlMTktTVEFfTUFSSywKKwlUU0lGX1RTMF9TQ0tfTUFSSywJCQkJTURJT19NQVJLLAorCVRTSUZfVFMwX1NERU5fTUFSSywJCQkJTURDX01BUkssCisJVFNJRl9UUzBfU1BTWU5DX01BUkssCisJTU1DX0NMS19NQVJLLAorCU1NQ19DTURfTUFSSywKKworCS8qUFRZKi8KKwlTREhJMENEX01BUkssCisJU0RISTBXUF9NQVJLLAorCVNESEkwRDNfTUFSSywKKwlTREhJMEQyX01BUkssCisJU0RISTBEMV9NQVJLLAorCVNESEkwRDBfTUFSSywKKwlTREhJMENNRF9NQVJLLAorCVNESEkwQ0xLX01BUkssCisKKwkvKlBUWiovCisJSU5UQ19JUlE3X01BUkssCQlTQ0lGM19JX0NUU19NQVJLLAorCUlOVENfSVJRNl9NQVJLLAkJU0NJRjNfSV9SVFNfTUFSSywKKwlJTlRDX0lSUTVfTUFSSywJCVNDSUYzX0lfU0NLX01BUkssCisJSU5UQ19JUlE0X01BUkssCQlTQ0lGM19JX1JYRF9NQVJLLAorCUlOVENfSVJRM19NQVJLLAkJU0NJRjNfSV9UWERfTUFSSywKKwlJTlRDX0lSUTJfTUFSSywKKwlJTlRDX0lSUTFfTUFSSywKKwlJTlRDX0lSUTBfTUFSSywKKwlQSU5NVVhfTUFSS19FTkQsCit9OworCitzdGF0aWMgcGlubXV4X2VudW1fdCBwaW5tdXhfZGF0YVtdID0geworCS8qIFBUQSBHUElPICovCisJUElOTVVYX0RBVEEoUFRBN19EQVRBLCBQVEE3X0lOLCBQVEE3X09VVCwgUFRBN19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRBNl9EQVRBLCBQVEE2X0lOLCBQVEE2X09VVCwgUFRBNl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRBNV9EQVRBLCBQVEE1X0lOLCBQVEE1X09VVCwgUFRBNV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRBNF9EQVRBLCBQVEE0X0lOLCBQVEE0X09VVCwgUFRBNF9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRBM19EQVRBLCBQVEEzX0lOLCBQVEEzX09VVCwgUFRBM19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRBMl9EQVRBLCBQVEEyX0lOLCBQVEEyX09VVCwgUFRBMl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRBMV9EQVRBLCBQVEExX0lOLCBQVEExX09VVCwgUFRBMV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRBMF9EQVRBLCBQVEEwX0lOLCBQVEEwX09VVCwgUFRBMF9JTl9QVSksCisKKwkvKiBQVEIgR1BJTyAqLworCVBJTk1VWF9EQVRBKFBUQjdfREFUQSwgUFRCN19JTiwgUFRCN19PVVQsIFBUQjdfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUQjZfREFUQSwgUFRCNl9JTiwgUFRCNl9PVVQsIFBUQjZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUQjVfREFUQSwgUFRCNV9JTiwgUFRCNV9PVVQsIFBUQjVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUQjRfREFUQSwgUFRCNF9JTiwgUFRCNF9PVVQsIFBUQjRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUQjNfREFUQSwgUFRCM19JTiwgUFRCM19PVVQsIFBUQjNfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUQjJfREFUQSwgUFRCMl9JTiwgUFRCMl9PVVQsIFBUQjJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUQjFfREFUQSwgUFRCMV9JTiwgUFRCMV9PVVQsIFBUQjFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUQjBfREFUQSwgUFRCMF9JTiwgUFRCMF9PVVQsIFBUQjBfSU5fUFUpLAorCisJLyogUFRDIEdQSU8gKi8KKwlQSU5NVVhfREFUQShQVEM3X0RBVEEsIFBUQzdfSU4sIFBUQzdfT1VULCBQVEM3X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEM2X0RBVEEsIFBUQzZfSU4sIFBUQzZfT1VULCBQVEM2X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEM1X0RBVEEsIFBUQzVfSU4sIFBUQzVfT1VULCBQVEM1X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEM0X0RBVEEsIFBUQzRfSU4sIFBUQzRfT1VULCBQVEM0X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEMzX0RBVEEsIFBUQzNfSU4sIFBUQzNfT1VULCBQVEMzX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEMyX0RBVEEsIFBUQzJfSU4sIFBUQzJfT1VULCBQVEMyX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEMxX0RBVEEsIFBUQzFfSU4sIFBUQzFfT1VULCBQVEMxX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEMwX0RBVEEsIFBUQzBfSU4sIFBUQzBfT1VULCBQVEMwX0lOX1BVKSwKKworCS8qIFBURCBHUElPICovCisJUElOTVVYX0RBVEEoUFREN19EQVRBLCBQVEQ3X0lOLCBQVEQ3X09VVCwgUFREN19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRENl9EQVRBLCBQVEQ2X0lOLCBQVEQ2X09VVCwgUFRENl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRENV9EQVRBLCBQVEQ1X0lOLCBQVEQ1X09VVCwgUFRENV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRENF9EQVRBLCBQVEQ0X0lOLCBQVEQ0X09VVCwgUFRENF9JTl9QVSksCisJUElOTVVYX0RBVEEoUFREM19EQVRBLCBQVEQzX0lOLCBQVEQzX09VVCwgUFREM19JTl9QVSksCisJUElOTVVYX0RBVEEoUFREMl9EQVRBLCBQVEQyX0lOLCBQVEQyX09VVCwgUFREMl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFREMV9EQVRBLCBQVEQxX0lOLCBQVEQxX09VVCwgUFREMV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFREMF9EQVRBLCBQVEQwX0lOLCBQVEQwX09VVCwgUFREMF9JTl9QVSksCisKKwkvKiBQVEUgR1BJTyAqLworCVBJTk1VWF9EQVRBKFBURTdfREFUQSwgUFRFN19JTiwgUFRFN19PVVQsIFBURTdfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBURTZfREFUQSwgUFRFNl9JTiwgUFRFNl9PVVQsIFBURTZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBURTVfREFUQSwgUFRFNV9JTiwgUFRFNV9PVVQsIFBURTVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBURTRfREFUQSwgUFRFNF9JTiwgUFRFNF9PVVQsIFBURTRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBURTNfREFUQSwgUFRFM19JTiwgUFRFM19PVVQsIFBURTNfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBURTJfREFUQSwgUFRFMl9JTiwgUFRFMl9PVVQsIFBURTJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBURTFfREFUQSwgUFRFMV9JTiwgUFRFMV9PVVQsIFBURTFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBURTBfREFUQSwgUFRFMF9JTiwgUFRFMF9PVVQsIFBURTBfSU5fUFUpLAorCisJLyogUFRGIEdQSU8gKi8KKwlQSU5NVVhfREFUQShQVEY3X0RBVEEsIFBURjdfSU4sIFBURjdfT1VULCBQVEY3X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEY2X0RBVEEsIFBURjZfSU4sIFBURjZfT1VULCBQVEY2X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEY1X0RBVEEsIFBURjVfSU4sIFBURjVfT1VULCBQVEY1X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEY0X0RBVEEsIFBURjRfSU4sIFBURjRfT1VULCBQVEY0X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEYzX0RBVEEsIFBURjNfSU4sIFBURjNfT1VULCBQVEYzX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEYyX0RBVEEsIFBURjJfSU4sIFBURjJfT1VULCBQVEYyX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEYxX0RBVEEsIFBURjFfSU4sIFBURjFfT1VULCBQVEYxX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEYwX0RBVEEsIFBURjBfSU4sIFBURjBfT1VULCBQVEYwX0lOX1BVKSwKKworCS8qIFBURyBHUElPICovCisJUElOTVVYX0RBVEEoUFRHNV9EQVRBLCBQVEc1X09VVCksCisJUElOTVVYX0RBVEEoUFRHNF9EQVRBLCBQVEc0X09VVCksCisJUElOTVVYX0RBVEEoUFRHM19EQVRBLCBQVEczX09VVCksCisJUElOTVVYX0RBVEEoUFRHMl9EQVRBLCBQVEcyX09VVCksCisJUElOTVVYX0RBVEEoUFRHMV9EQVRBLCBQVEcxX09VVCksCisJUElOTVVYX0RBVEEoUFRHMF9EQVRBLCBQVEcwX09VVCksCisKKwkvKiBQVEggR1BJTyAqLworCVBJTk1VWF9EQVRBKFBUSDdfREFUQSwgUFRIN19JTiwgUFRIN19PVVQsIFBUSDdfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUSDZfREFUQSwgUFRINl9JTiwgUFRINl9PVVQsIFBUSDZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUSDVfREFUQSwgUFRINV9JTiwgUFRINV9PVVQsIFBUSDVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUSDRfREFUQSwgUFRINF9JTiwgUFRINF9PVVQsIFBUSDRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUSDNfREFUQSwgUFRIM19JTiwgUFRIM19PVVQsIFBUSDNfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUSDJfREFUQSwgUFRIMl9JTiwgUFRIMl9PVVQsIFBUSDJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUSDFfREFUQSwgUFRIMV9JTiwgUFRIMV9PVVQsIFBUSDFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUSDBfREFUQSwgUFRIMF9JTiwgUFRIMF9PVVQsIFBUSDBfSU5fUFUpLAorCisJLyogUFRKIEdQSU8gKi8KKwlQSU5NVVhfREFUQShQVEo3X0RBVEEsIFBUSjdfT1VUKSwKKwlQSU5NVVhfREFUQShQVEo2X0RBVEEsIFBUSjZfT1VUKSwKKwlQSU5NVVhfREFUQShQVEo1X0RBVEEsIFBUSjVfT1VUKSwKKwlQSU5NVVhfREFUQShQVEozX0RBVEEsIFBUSjNfSU4sIFBUSjNfT1VULCBQVEozX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEoyX0RBVEEsIFBUSjJfSU4sIFBUSjJfT1VULCBQVEoyX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEoxX0RBVEEsIFBUSjFfSU4sIFBUSjFfT1VULCBQVEoxX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVEowX0RBVEEsIFBUSjBfSU4sIFBUSjBfT1VULCBQVEowX0lOX1BVKSwKKworCS8qIFBUSyBHUElPICovCisJUElOTVVYX0RBVEEoUFRLN19EQVRBLCBQVEs3X0lOLCBQVEs3X09VVCwgUFRLN19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRLNl9EQVRBLCBQVEs2X0lOLCBQVEs2X09VVCwgUFRLNl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRLNV9EQVRBLCBQVEs1X0lOLCBQVEs1X09VVCwgUFRLNV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRLNF9EQVRBLCBQVEs0X0lOLCBQVEs0X09VVCwgUFRLNF9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRLM19EQVRBLCBQVEszX0lOLCBQVEszX09VVCwgUFRLM19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRLMl9EQVRBLCBQVEsyX0lOLCBQVEsyX09VVCwgUFRLMl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRLMV9EQVRBLCBQVEsxX0lOLCBQVEsxX09VVCwgUFRLMV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRLMF9EQVRBLCBQVEswX0lOLCBQVEswX09VVCwgUFRLMF9JTl9QVSksCisKKwkvKiBQVEwgR1BJTyAqLworCVBJTk1VWF9EQVRBKFBUTDdfREFUQSwgUFRMN19JTiwgUFRMN19PVVQsIFBUTDdfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUTDZfREFUQSwgUFRMNl9JTiwgUFRMNl9PVVQsIFBUTDZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUTDVfREFUQSwgUFRMNV9JTiwgUFRMNV9PVVQsIFBUTDVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUTDRfREFUQSwgUFRMNF9JTiwgUFRMNF9PVVQsIFBUTDRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUTDNfREFUQSwgUFRMM19JTiwgUFRMM19PVVQsIFBUTDNfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUTDJfREFUQSwgUFRMMl9JTiwgUFRMMl9PVVQsIFBUTDJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUTDFfREFUQSwgUFRMMV9JTiwgUFRMMV9PVVQsIFBUTDFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUTDBfREFUQSwgUFRMMF9JTiwgUFRMMF9PVVQsIFBUTDBfSU5fUFUpLAorCisJLyogUFRNIEdQSU8gKi8KKwlQSU5NVVhfREFUQShQVE03X0RBVEEsIFBUTTdfSU4sIFBUTTdfT1VULCBQVE03X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVE02X0RBVEEsIFBUTTZfSU4sIFBUTTZfT1VULCBQVE02X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVE01X0RBVEEsIFBUTTVfSU4sIFBUTTVfT1VULCBQVE01X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVE00X0RBVEEsIFBUTTRfSU4sIFBUTTRfT1VULCBQVE00X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVE0zX0RBVEEsIFBUTTNfSU4sIFBUTTNfT1VULCBQVE0zX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVE0yX0RBVEEsIFBUTTJfSU4sIFBUTTJfT1VULCBQVE0yX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVE0xX0RBVEEsIFBUTTFfSU4sIFBUTTFfT1VULCBQVE0xX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVE0wX0RBVEEsIFBUTTBfSU4sIFBUTTBfT1VULCBQVE0wX0lOX1BVKSwKKworCS8qIFBUTiBHUElPICovCisJUElOTVVYX0RBVEEoUFRON19EQVRBLCBQVE43X0lOLCBQVE43X09VVCwgUFRON19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRONl9EQVRBLCBQVE42X0lOLCBQVE42X09VVCwgUFRONl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRONV9EQVRBLCBQVE41X0lOLCBQVE41X09VVCwgUFRONV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRONF9EQVRBLCBQVE40X0lOLCBQVE40X09VVCwgUFRONF9JTl9QVSksCisJUElOTVVYX0RBVEEoUFROM19EQVRBLCBQVE4zX0lOLCBQVE4zX09VVCwgUFROM19JTl9QVSksCisJUElOTVVYX0RBVEEoUFROMl9EQVRBLCBQVE4yX0lOLCBQVE4yX09VVCwgUFROMl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFROMV9EQVRBLCBQVE4xX0lOLCBQVE4xX09VVCwgUFROMV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFROMF9EQVRBLCBQVE4wX0lOLCBQVE4wX09VVCwgUFROMF9JTl9QVSksCisKKwkvKiBQVFEgR1BJTyAqLworCVBJTk1VWF9EQVRBKFBUUTdfREFUQSwgUFRRN19JTiwgUFRRN19PVVQsIFBUUTdfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUUTZfREFUQSwgUFRRNl9JTiwgUFRRNl9PVVQsIFBUUTZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUUTVfREFUQSwgUFRRNV9JTiwgUFRRNV9PVVQsIFBUUTVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUUTRfREFUQSwgUFRRNF9JTiwgUFRRNF9PVVQsIFBUUTRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUUTNfREFUQSwgUFRRM19JTiwgUFRRM19PVVQsIFBUUTNfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUUTJfREFUQSwgUFRRMl9JTiwgUFRRMl9PVVQsIFBUUTJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUUTFfREFUQSwgUFRRMV9JTiwgUFRRMV9PVVQsIFBUUTFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUUTBfREFUQSwgUFRRMF9JTiwgUFRRMF9PVVQsIFBUUTBfSU5fUFUpLAorCisJLyogUFRSIEdQSU8gKi8KKwlQSU5NVVhfREFUQShQVFI3X0RBVEEsIFBUUjdfSU4sIFBUUjdfT1VULCBQVFI3X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFI2X0RBVEEsIFBUUjZfSU4sIFBUUjZfT1VULCBQVFI2X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFI1X0RBVEEsIFBUUjVfSU4sIFBUUjVfT1VULCBQVFI1X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFI0X0RBVEEsIFBUUjRfSU4sIFBUUjRfT1VULCBQVFI0X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFIzX0RBVEEsIFBUUjNfSU4sICAgICAgICAgICBQVFIzX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFIyX0RBVEEsIFBUUjJfSU4sICAgICAgICAgICBQVFIyX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFIxX0RBVEEsIFBUUjFfSU4sIFBUUjFfT1VULCBQVFIxX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFIwX0RBVEEsIFBUUjBfSU4sIFBUUjBfT1VULCBQVFIwX0lOX1BVKSwKKworCS8qIFBUUyBHUElPICovCisJUElOTVVYX0RBVEEoUFRTNl9EQVRBLCBQVFM2X0lOLCBQVFM2X09VVCwgUFRTNl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRTNV9EQVRBLCBQVFM1X0lOLCBQVFM1X09VVCwgUFRTNV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRTNF9EQVRBLCBQVFM0X0lOLCBQVFM0X09VVCwgUFRTNF9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRTM19EQVRBLCBQVFMzX0lOLCBQVFMzX09VVCwgUFRTM19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRTMl9EQVRBLCBQVFMyX0lOLCBQVFMyX09VVCwgUFRTMl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRTMV9EQVRBLCBQVFMxX0lOLCBQVFMxX09VVCwgUFRTMV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRTMF9EQVRBLCBQVFMwX0lOLCBQVFMwX09VVCwgUFRTMF9JTl9QVSksCisKKwkvKiBQVFQgR1BJTyAqLworCVBJTk1VWF9EQVRBKFBUVDdfREFUQSwgUFRUN19JTiwgUFRUN19PVVQsIFBUVDdfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVDZfREFUQSwgUFRUNl9JTiwgUFRUNl9PVVQsIFBUVDZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVDVfREFUQSwgUFRUNV9JTiwgUFRUNV9PVVQsIFBUVDVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVDRfREFUQSwgUFRUNF9JTiwgUFRUNF9PVVQsIFBUVDRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVDNfREFUQSwgUFRUM19JTiwgUFRUM19PVVQsIFBUVDNfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVDJfREFUQSwgUFRUMl9JTiwgUFRUMl9PVVQsIFBUVDJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVDFfREFUQSwgUFRUMV9JTiwgUFRUMV9PVVQsIFBUVDFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVDBfREFUQSwgUFRUMF9JTiwgUFRUMF9PVVQsIFBUVDBfSU5fUFUpLAorCisJLyogUFRVIEdQSU8gKi8KKwlQSU5NVVhfREFUQShQVFU3X0RBVEEsIFBUVTdfSU4sIFBUVTdfT1VULCBQVFU3X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFU2X0RBVEEsIFBUVTZfSU4sIFBUVTZfT1VULCBQVFU2X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFU1X0RBVEEsIFBUVTVfSU4sIFBUVTVfT1VULCBQVFU1X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFU0X0RBVEEsIFBUVTRfSU4sIFBUVTRfT1VULCBQVFU0X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFUzX0RBVEEsIFBUVTNfSU4sIFBUVTNfT1VULCBQVFUzX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFUyX0RBVEEsIFBUVTJfSU4sIFBUVTJfT1VULCBQVFUyX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFUxX0RBVEEsIFBUVTFfSU4sIFBUVTFfT1VULCBQVFUxX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFUwX0RBVEEsIFBUVTBfSU4sIFBUVTBfT1VULCBQVFUwX0lOX1BVKSwKKworCS8qIFBUViBHUElPICovCisJUElOTVVYX0RBVEEoUFRWN19EQVRBLCBQVFY3X0lOLCBQVFY3X09VVCwgUFRWN19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRWNl9EQVRBLCBQVFY2X0lOLCBQVFY2X09VVCwgUFRWNl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRWNV9EQVRBLCBQVFY1X0lOLCBQVFY1X09VVCwgUFRWNV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRWNF9EQVRBLCBQVFY0X0lOLCBQVFY0X09VVCwgUFRWNF9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRWM19EQVRBLCBQVFYzX0lOLCBQVFYzX09VVCwgUFRWM19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRWMl9EQVRBLCBQVFYyX0lOLCBQVFYyX09VVCwgUFRWMl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRWMV9EQVRBLCBQVFYxX0lOLCBQVFYxX09VVCwgUFRWMV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRWMF9EQVRBLCBQVFYwX0lOLCBQVFYwX09VVCwgUFRWMF9JTl9QVSksCisKKwkvKiBQVFcgR1BJTyAqLworCVBJTk1VWF9EQVRBKFBUVzdfREFUQSwgUFRXN19JTiwgUFRXN19PVVQsIFBUVzdfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVzZfREFUQSwgUFRXNl9JTiwgUFRXNl9PVVQsIFBUVzZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVzVfREFUQSwgUFRXNV9JTiwgUFRXNV9PVVQsIFBUVzVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVzRfREFUQSwgUFRXNF9JTiwgUFRXNF9PVVQsIFBUVzRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVzNfREFUQSwgUFRXM19JTiwgUFRXM19PVVQsIFBUVzNfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVzJfREFUQSwgUFRXMl9JTiwgUFRXMl9PVVQsIFBUVzJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVzFfREFUQSwgUFRXMV9JTiwgUFRXMV9PVVQsIFBUVzFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUVzBfREFUQSwgUFRXMF9JTiwgUFRXMF9PVVQsIFBUVzBfSU5fUFUpLAorCisJLyogUFRYIEdQSU8gKi8KKwlQSU5NVVhfREFUQShQVFg3X0RBVEEsIFBUWDdfSU4sIFBUWDdfT1VULCBQVFg3X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFg2X0RBVEEsIFBUWDZfSU4sIFBUWDZfT1VULCBQVFg2X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFg1X0RBVEEsIFBUWDVfSU4sIFBUWDVfT1VULCBQVFg1X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFg0X0RBVEEsIFBUWDRfSU4sIFBUWDRfT1VULCBQVFg0X0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFgzX0RBVEEsIFBUWDNfSU4sIFBUWDNfT1VULCBQVFgzX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFgyX0RBVEEsIFBUWDJfSU4sIFBUWDJfT1VULCBQVFgyX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFgxX0RBVEEsIFBUWDFfSU4sIFBUWDFfT1VULCBQVFgxX0lOX1BVKSwKKwlQSU5NVVhfREFUQShQVFgwX0RBVEEsIFBUWDBfSU4sIFBUWDBfT1VULCBQVFgwX0lOX1BVKSwKKworCS8qIFBUWSBHUElPICovCisJUElOTVVYX0RBVEEoUFRZN19EQVRBLCBQVFk3X0lOLCBQVFk3X09VVCwgUFRZN19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRZNl9EQVRBLCBQVFk2X0lOLCBQVFk2X09VVCwgUFRZNl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRZNV9EQVRBLCBQVFk1X0lOLCBQVFk1X09VVCwgUFRZNV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRZNF9EQVRBLCBQVFk0X0lOLCBQVFk0X09VVCwgUFRZNF9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRZM19EQVRBLCBQVFkzX0lOLCBQVFkzX09VVCwgUFRZM19JTl9QVSksCisJUElOTVVYX0RBVEEoUFRZMl9EQVRBLCBQVFkyX0lOLCBQVFkyX09VVCwgUFRZMl9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRZMV9EQVRBLCBQVFkxX0lOLCBQVFkxX09VVCwgUFRZMV9JTl9QVSksCisJUElOTVVYX0RBVEEoUFRZMF9EQVRBLCBQVFkwX0lOLCBQVFkwX09VVCwgUFRZMF9JTl9QVSksCisKKwkvKiBQVFogR1BJTyAqLworCVBJTk1VWF9EQVRBKFBUWjdfREFUQSwgUFRaN19JTiwgUFRaN19PVVQsIFBUWjdfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUWjZfREFUQSwgUFRaNl9JTiwgUFRaNl9PVVQsIFBUWjZfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUWjVfREFUQSwgUFRaNV9JTiwgUFRaNV9PVVQsIFBUWjVfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUWjRfREFUQSwgUFRaNF9JTiwgUFRaNF9PVVQsIFBUWjRfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUWjNfREFUQSwgUFRaM19JTiwgUFRaM19PVVQsIFBUWjNfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUWjJfREFUQSwgUFRaMl9JTiwgUFRaMl9PVVQsIFBUWjJfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUWjFfREFUQSwgUFRaMV9JTiwgUFRaMV9PVVQsIFBUWjFfSU5fUFUpLAorCVBJTk1VWF9EQVRBKFBUWjBfREFUQSwgUFRaMF9JTiwgUFRaMF9PVVQsIFBUWjBfSU5fUFUpLAorCisJLyogUFRBIEZOICovCisJUElOTVVYX0RBVEEoRDIzX01BUkssCVBTQTE1XzAsIFBTQTE0XzAsIFBUQTdfRk4pLAorCVBJTk1VWF9EQVRBKEQyMl9NQVJLLAlQU0ExNV8wLCBQU0ExNF8wLCBQVEE2X0ZOKSwKKwlQSU5NVVhfREFUQShEMjFfTUFSSywJUFNBMTVfMCwgUFNBMTRfMCwgUFRBNV9GTiksCisJUElOTVVYX0RBVEEoRDIwX01BUkssCVBTQTE1XzAsIFBTQTE0XzAsIFBUQTRfRk4pLAorCVBJTk1VWF9EQVRBKEQxOV9NQVJLLAlQU0ExNV8wLCBQU0ExNF8wLCBQVEEzX0ZOKSwKKwlQSU5NVVhfREFUQShEMThfTUFSSywJUFNBMTVfMCwgUFNBMTRfMCwgUFRBMl9GTiksCisJUElOTVVYX0RBVEEoRDE3X01BUkssCVBTQTE1XzAsIFBTQTE0XzAsIFBUQTFfRk4pLAorCVBJTk1VWF9EQVRBKEQxNl9NQVJLLAlQU0ExNV8wLCBQU0ExNF8wLCBQVEEwX0ZOKSwKKworCVBJTk1VWF9EQVRBKEtFWU9VVDJfTUFSSywJUFNBMTVfMCwgUFNBMTRfMSwgUFRBN19GTiksCisJUElOTVVYX0RBVEEoS0VZT1VUMV9NQVJLLAlQU0ExNV8wLCBQU0ExNF8xLCBQVEE2X0ZOKSwKKwlQSU5NVVhfREFUQShLRVlPVVQwX01BUkssCVBTQTE1XzAsIFBTQTE0XzEsIFBUQTVfRk4pLAorCVBJTk1VWF9EQVRBKEtFWUlONF9NQVJLLAlQU0ExNV8wLCBQU0ExNF8xLCBQVEE0X0ZOKSwKKwlQSU5NVVhfREFUQShLRVlJTjNfTUFSSywJUFNBMTVfMCwgUFNBMTRfMSwgUFRBM19GTiksCisJUElOTVVYX0RBVEEoS0VZSU4yX01BUkssCVBTQTE1XzAsIFBTQTE0XzEsIFBUQTJfRk4pLAorCVBJTk1VWF9EQVRBKEtFWUlOMV9NQVJLLAlQU0ExNV8wLCBQU0ExNF8xLCBQVEExX0ZOKSwKKwlQSU5NVVhfREFUQShLRVlJTjBfTUFSSywJUFNBMTVfMCwgUFNBMTRfMSwgUFRBMF9GTiksCisKKwlQSU5NVVhfREFUQShJREVEMTVfTUFSSywJUFNBMTVfMSwgUFNBMTRfMCwgUFRBN19GTiksCisJUElOTVVYX0RBVEEoSURFRDE0X01BUkssCVBTQTE1XzEsIFBTQTE0XzAsIFBUQTZfRk4pLAorCVBJTk1VWF9EQVRBKElERUQxM19NQVJLLAlQU0ExNV8xLCBQU0ExNF8wLCBQVEE1X0ZOKSwKKwlQSU5NVVhfREFUQShJREVEMTJfTUFSSywJUFNBMTVfMSwgUFNBMTRfMCwgUFRBNF9GTiksCisJUElOTVVYX0RBVEEoSURFRDExX01BUkssCVBTQTE1XzEsIFBTQTE0XzAsIFBUQTNfRk4pLAorCVBJTk1VWF9EQVRBKElERUQxMF9NQVJLLAlQU0ExNV8xLCBQU0ExNF8wLCBQVEEyX0ZOKSwKKwlQSU5NVVhfREFUQShJREVEOV9NQVJLLAkJUFNBMTVfMSwgUFNBMTRfMCwgUFRBMV9GTiksCisJUElOTVVYX0RBVEEoSURFRDhfTUFSSywJCVBTQTE1XzEsIFBTQTE0XzAsIFBUQTBfRk4pLAorCisJLyogUFRCIEZOICovCisJUElOTVVYX0RBVEEoRDMxX01BUkssCQlQU0UxNV8wLCBQU0UxNF8wLCBQVEI3X0ZOKSwKKwlQSU5NVVhfREFUQShEMzBfTUFSSywJCVBTRTE1XzAsIFBTRTE0XzAsIFBUQjZfRk4pLAorCVBJTk1VWF9EQVRBKEQyOV9NQVJLLAkJUFNFMTFfMCwgICAgICAgICAgUFRCNV9GTiksCisJUElOTVVYX0RBVEEoRDI4X01BUkssCQlQU0UxMV8wLCAgICAgICAgICBQVEI0X0ZOKSwKKwlQSU5NVVhfREFUQShEMjdfTUFSSywJCVBTRTExXzAsICAgICAgICAgIFBUQjNfRk4pLAorCVBJTk1VWF9EQVRBKEQyNl9NQVJLLAkJUFNBMTVfMCwgUFNBMTRfMCwgUFRCMl9GTiksCisJUElOTVVYX0RBVEEoRDI1X01BUkssCQlQU0ExNV8wLCBQU0ExNF8wLCBQVEIxX0ZOKSwKKwlQSU5NVVhfREFUQShEMjRfTUFSSywJCVBTQTE1XzAsIFBTQTE0XzAsIFBUQjBfRk4pLAorCisJUElOTVVYX0RBVEEoSURFQTFfTUFSSywJCVBTRTE1XzEsIFBTRTE0XzAsIFBUQjdfRk4pLAorCVBJTk1VWF9EQVRBKElERUEwX01BUkssCQlQU0UxNV8xLCBQU0UxNF8wLCBQVEI2X0ZOKSwKKwlQSU5NVVhfREFUQShJT0RSRVFfTUFSSywJUFNFMTFfMSwgICAgICAgICAgUFRCNV9GTiksCisJUElOTVVYX0RBVEEoSURFQ1MwX01BUkssCVBTRTExXzEsICAgICAgICAgIFBUQjRfRk4pLAorCVBJTk1VWF9EQVRBKElERUNTMV9NQVJLLAlQU0UxMV8xLCAgICAgICAgICBQVEIzX0ZOKSwKKwlQSU5NVVhfREFUQShJREVJT1JEX01BUkssCVBTQTE1XzEsIFBTQTE0XzAsIFBUQjJfRk4pLAorCVBJTk1VWF9EQVRBKElERUlPV1JfTUFSSywJUFNBMTVfMSwgUFNBMTRfMCwgUFRCMV9GTiksCisJUElOTVVYX0RBVEEoSURFSU5UX01BUkssCVBTQTE1XzEsIFBTQTE0XzAsIFBUQjBfRk4pLAorCisJUElOTVVYX0RBVEEoVFBVVE8xX01BUkssCVBTRTE1XzAsIFBTRTE0XzEsIFBUQjdfRk4pLAorCVBJTk1VWF9EQVRBKFRQVVRPMF9NQVJLLAlQU0UxNV8wLCBQU0UxNF8xLCBQVEI2X0ZOKSwKKworCVBJTk1VWF9EQVRBKEtFWU9VVDVfSU41X01BUkssCVBTQTE1XzAsIFBTQTE0XzEsIFBUQjJfRk4pLAorCVBJTk1VWF9EQVRBKEtFWU9VVDRfSU42X01BUkssCVBTQTE1XzAsIFBTQTE0XzEsIFBUQjFfRk4pLAorCVBJTk1VWF9EQVRBKEtFWU9VVDNfTUFSSywJUFNBMTVfMCwgUFNBMTRfMSwgUFRCMF9GTiksCisKKwkvKiBQVEMgRk4gKi8KKwlQSU5NVVhfREFUQShMQ0REN19NQVJLLCBQU0Q1XzAsIFBUQzdfRk4pLAorCVBJTk1VWF9EQVRBKExDREQ2X01BUkssIFBTRDVfMCwgUFRDNl9GTiksCisJUElOTVVYX0RBVEEoTENERDVfTUFSSywgUFNENV8wLCBQVEM1X0ZOKSwKKwlQSU5NVVhfREFUQShMQ0RENF9NQVJLLCBQU0Q1XzAsIFBUQzRfRk4pLAorCVBJTk1VWF9EQVRBKExDREQzX01BUkssIFBTRDVfMCwgUFRDM19GTiksCisJUElOTVVYX0RBVEEoTENERDJfTUFSSywgUFNENV8wLCBQVEMyX0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMV9NQVJLLCBQU0Q1XzAsIFBUQzFfRk4pLAorCVBJTk1VWF9EQVRBKExDREQwX01BUkssIFBTRDVfMCwgUFRDMF9GTiksCisKKwkvKiBQVEQgRk4gKi8KKwlQSU5NVVhfREFUQShMQ0REMTVfTUFSSywgUFNENV8wLCBQVEQ3X0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMTRfTUFSSywgUFNENV8wLCBQVEQ2X0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMTNfTUFSSywgUFNENV8wLCBQVEQ1X0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMTJfTUFSSywgUFNENV8wLCBQVEQ0X0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMTFfTUFSSywgUFNENV8wLCBQVEQzX0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMTBfTUFSSywgUFNENV8wLCBQVEQyX0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REOV9NQVJLLCAgUFNENV8wLCBQVEQxX0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REOF9NQVJLLCAgUFNENV8wLCBQVEQwX0ZOKSwKKworCS8qIFBURSBGTiAqLworCVBJTk1VWF9EQVRBKEZTSU1DS0JfTUFSSywgUFRFN19GTiksCisJUElOTVVYX0RBVEEoRlNJTUNLQV9NQVJLLCBQVEU2X0ZOKSwKKworCVBJTk1VWF9EQVRBKExDREQyMV9NQVJLLAlQU0M1XzAsIFBTQzRfMCwgUFRFNV9GTiksCisJUElOTVVYX0RBVEEoTENERDIwX01BUkssCVBTRDNfMCwgUFNEMl8wLCBQVEU0X0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMTlfTUFSSywJUFNBM18wLCBQU0EyXzAsIFBURTNfRk4pLAorCVBJTk1VWF9EQVRBKExDREQxOF9NQVJLLAlQU0EzXzAsIFBTQTJfMCwgUFRFMl9GTiksCisJUElOTVVYX0RBVEEoTENERDE3X01BUkssCVBTRDVfMCwgICAgICAgICBQVEUxX0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMTZfTUFSSywJUFNENV8wLCAgICAgICAgIFBURTBfRk4pLAorCisJUElOTVVYX0RBVEEoU0NJRjJfTF9UWERfTUFSSywJUFNDNV8wLCBQU0M0XzEsIFBURTVfRk4pLAorCVBJTk1VWF9EQVRBKFNDSUY0X1NDS19NQVJLLAlQU0QzXzAsIFBTRDJfMSwgUFRFNF9GTiksCisJUElOTVVYX0RBVEEoU0NJRjRfUlhEX01BUkssCVBTQTNfMCwgUFNBMl8xLCBQVEUzX0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGNF9UWERfTUFSSywJUFNBM18wLCBQU0EyXzEsIFBURTJfRk4pLAorCisJLyogUFRGIEZOICovCisJUElOTVVYX0RBVEEoTENEVlNZTl9NQVJLLAlQU0Q4XzAsICAgICAgICAgIFBURjdfRk4pLAorCVBJTk1VWF9EQVRBKExDRERJU1BfTUFSSywJUFNEMTBfMCwgUFNEOV8wLCBQVEY2X0ZOKSwKKwlQSU5NVVhfREFUQShMQ0RIU1lOX01BUkssCVBTRDEwXzAsIFBTRDlfMCwgUFRGNV9GTiksCisJUElOTVVYX0RBVEEoTENERE9OX01BUkssCVBTRDhfMCwgICAgICAgICAgUFRGNF9GTiksCisJUElOTVVYX0RBVEEoTENERENLX01BUkssCVBTRDEwXzAsIFBTRDlfMCwgUFRGM19GTiksCisJUElOTVVYX0RBVEEoTENEVkVQV0NfTUFSSywJUFNBNl8wLCAgICAgICAgICBQVEYyX0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMjNfTUFSSywJUFNDN18wLCAgUFNDNl8wLCBQVEYxX0ZOKSwKKwlQSU5NVVhfREFUQShMQ0REMjJfTUFSSywJUFNDNV8wLCAgUFNDNF8wLCBQVEYwX0ZOKSwKKworCVBJTk1VWF9EQVRBKExDRFJTX01BUkssCQlQU0QxMF8wLCBQU0Q5XzEsIFBURjZfRk4pLAorCVBJTk1VWF9EQVRBKExDRENTX01BUkssCQlQU0QxMF8wLCBQU0Q5XzEsIFBURjVfRk4pLAorCVBJTk1VWF9EQVRBKExDRFdSX01BUkssCQlQU0QxMF8wLCBQU0Q5XzEsIFBURjNfRk4pLAorCisJUElOTVVYX0RBVEEoU0NJRjBfVFhEX01BUkssCVBTQTZfMSwgICAgICAgICAgUFRGMl9GTiksCisJUElOTVVYX0RBVEEoU0NJRjJfTF9TQ0tfTUFSSywJUFNDN18wLCAgUFNDNl8xLCBQVEYxX0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGMl9MX1JYRF9NQVJLLAlQU0M1XzAsICBQU0M0XzEsIFBURjBfRk4pLAorCisJLyogUFRHIEZOICovCisJUElOTVVYX0RBVEEoQVVEQ0tfTUFSSywgICBQVEc1X0ZOKSwKKwlQSU5NVVhfREFUQShBVURTWU5DX01BUkssIFBURzRfRk4pLAorCVBJTk1VWF9EQVRBKEFVREFUQTNfTUFSSywgUFRHM19GTiksCisJUElOTVVYX0RBVEEoQVVEQVRBMl9NQVJLLCBQVEcyX0ZOKSwKKwlQSU5NVVhfREFUQShBVURBVEExX01BUkssIFBURzFfRk4pLAorCVBJTk1VWF9EQVRBKEFVREFUQTBfTUFSSywgUFRHMF9GTiksCisKKwkvKiBQVEggRk4gKi8KKwlQSU5NVVhfREFUQShWSU8wX1ZEX01BUkssICBQVEg3X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0NMS19NQVJLLCBQVEg2X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0Q3X01BUkssICBQVEg1X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0Q2X01BUkssICBQVEg0X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0Q1X01BUkssICBQVEgzX0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0Q0X01BUkssICBQVEgyX0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0QzX01BUkssICBQVEgxX0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0QyX01BUkssICBQVEgwX0ZOKSwKKworCS8qIFBUSiBGTiAqLworCVBJTk1VWF9EQVRBKFBEU1RBVFVTX01BUkssCVBUSjdfRk4pLAorCVBJTk1VWF9EQVRBKFNUQVRVUzJfTUFSSywJUFRKNl9GTiksCisJUElOTVVYX0RBVEEoU1RBVFVTMF9NQVJLLAlQVEo1X0ZOKSwKKwlQSU5NVVhfREFUQShBMjVfTUFSSywJCVBTQThfMCwgUFRKM19GTiksCisJUElOTVVYX0RBVEEoQlNfTUFSSywJCVBTQThfMSwgUFRKM19GTiksCisJUElOTVVYX0RBVEEoQTI0X01BUkssCQlQVEoyX0ZOKSwKKwlQSU5NVVhfREFUQShBMjNfTUFSSywJCVBUSjFfRk4pLAorCVBJTk1VWF9EQVRBKEEyMl9NQVJLLAkJUFRKMF9GTiksCisKKwkvKiBQVEsgRk4gKi8KKwlQSU5NVVhfREFUQShWSU8xX0Q1X01BUkssCVBTQjdfMCwgUFNCNl8wLCBQVEs3X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8xX0Q0X01BUkssCVBTQjdfMCwgUFNCNl8wLCBQVEs2X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8xX0QzX01BUkssCVBTQjdfMCwgUFNCNl8wLCBQVEs1X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8xX0QyX01BUkssCVBTQjdfMCwgUFNCNl8wLCBQVEs0X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8xX0QxX01BUkssCVBTQjdfMCwgUFNCNl8wLCBQVEszX0ZOKSwKKwlQSU5NVVhfREFUQShWSU8xX0QwX01BUkssCVBTQjdfMCwgUFNCNl8wLCBQVEsyX0ZOKSwKKworCVBJTk1VWF9EQVRBKFZJTzBfRDEzX01BUkssCVBTQjdfMCwgUFNCNl8xLCBQVEs3X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0QxMl9NQVJLLAlQU0I3XzAsIFBTQjZfMSwgUFRLNl9GTiksCisJUElOTVVYX0RBVEEoVklPMF9EMTFfTUFSSywJUFNCN18wLCBQU0I2XzEsIFBUSzVfRk4pLAorCVBJTk1VWF9EQVRBKFZJTzBfRDEwX01BUkssCVBTQjdfMCwgUFNCNl8xLCBQVEs0X0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0Q5X01BUkssCVBTQjdfMCwgUFNCNl8xLCBQVEszX0ZOKSwKKwlQSU5NVVhfREFUQShWSU8wX0Q4X01BUkssCVBTQjdfMCwgUFNCNl8xLCBQVEsyX0ZOKSwKKworCVBJTk1VWF9EQVRBKElERUQ1X01BUkssCQlQU0I3XzEsIFBTQjZfMCwgUFRLN19GTiksCisJUElOTVVYX0RBVEEoSURFRDRfTUFSSywJCVBTQjdfMSwgUFNCNl8wLCBQVEs2X0ZOKSwKKwlQSU5NVVhfREFUQShJREVEM19NQVJLLAkJUFNCN18xLCBQU0I2XzAsIFBUSzVfRk4pLAorCVBJTk1VWF9EQVRBKElERUQyX01BUkssCQlQU0I3XzEsIFBTQjZfMCwgUFRLNF9GTiksCisJUElOTVVYX0RBVEEoSURFRDFfTUFSSywJCVBTQjdfMSwgUFNCNl8wLCBQVEszX0ZOKSwKKwlQSU5NVVhfREFUQShJREVEMF9NQVJLLAkJUFNCN18xLCBQU0I2XzAsIFBUSzJfRk4pLAorCisJUElOTVVYX0RBVEEoVklPMF9GTERfTUFSSywJUFRLMV9GTiksCisJUElOTVVYX0RBVEEoVklPMF9IRF9NQVJLLAlQVEswX0ZOKSwKKworCS8qIFBUTCBGTiAqLworCVBJTk1VWF9EQVRBKERWX0Q1X01BUkssCQlQU0I5XzAsIFBTQjhfMCwgUFRMN19GTiksCisJUElOTVVYX0RBVEEoRFZfRDRfTUFSSywJCVBTQjlfMCwgUFNCOF8wLCBQVEw2X0ZOKSwKKwlQSU5NVVhfREFUQShEVl9EM19NQVJLLAkJUFNFN18wLCBQU0U2XzAsIFBUTDVfRk4pLAorCVBJTk1VWF9EQVRBKERWX0QyX01BUkssCQlQU0M5XzAsIFBTQzhfMCwgUFRMNF9GTiksCisJUElOTVVYX0RBVEEoRFZfRDFfTUFSSywJCVBTQzlfMCwgUFNDOF8wLCBQVEwzX0ZOKSwKKwlQSU5NVVhfREFUQShEVl9EMF9NQVJLLAkJUFNDOV8wLCBQU0M4XzAsIFBUTDJfRk4pLAorCVBJTk1VWF9EQVRBKERWX0QxNV9NQVJLLAlQU0Q0XzAsICAgICAgICAgUFRMMV9GTiksCisJUElOTVVYX0RBVEEoRFZfRDE0X01BUkssCVBTRTVfMCwgUFNFNF8wLCBQVEwwX0ZOKSwKKworCVBJTk1VWF9EQVRBKFNDSUYzX1ZfU0NLX01BUkssCVBTQjlfMCwgUFNCOF8xLCBQVEw3X0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGM19WX1JYRF9NQVJLLAlQU0I5XzAsIFBTQjhfMSwgUFRMNl9GTiksCisJUElOTVVYX0RBVEEoU0NJRjNfVl9UWERfTUFSSywJUFNFN18wLCBQU0U2XzEsIFBUTDVfRk4pLAorCVBJTk1VWF9EQVRBKFNDSUYxX1NDS19NQVJLLAlQU0M5XzAsIFBTQzhfMSwgUFRMNF9GTiksCisJUElOTVVYX0RBVEEoU0NJRjFfUlhEX01BUkssCVBTQzlfMCwgUFNDOF8xLCBQVEwzX0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGMV9UWERfTUFSSywJUFNDOV8wLCBQU0M4XzEsIFBUTDJfRk4pLAorCisJUElOTVVYX0RBVEEoUk1JSV9SWEQwX01BUkssCVBTQjlfMSwgUFNCOF8wLCBQVEw3X0ZOKSwKKwlQSU5NVVhfREFUQShSTUlJX1JYRDFfTUFSSywJUFNCOV8xLCBQU0I4XzAsIFBUTDZfRk4pLAorCVBJTk1VWF9EQVRBKFJNSUlfUkVGX0NMS19NQVJLLAlQU0U3XzEsIFBTRTZfMCwgUFRMNV9GTiksCisJUElOTVVYX0RBVEEoUk1JSV9UWF9FTl9NQVJLLAlQU0M5XzEsIFBTQzhfMCwgUFRMNF9GTiksCisJUElOTVVYX0RBVEEoUk1JSV9UWEQwX01BUkssCVBTQzlfMSwgUFNDOF8wLCBQVEwzX0ZOKSwKKwlQSU5NVVhfREFUQShSTUlJX1RYRDFfTUFSSywJUFNDOV8xLCBQU0M4XzAsIFBUTDJfRk4pLAorCisJUElOTVVYX0RBVEEoTVNJT0YwX01DS19NQVJLLAlQU0U1XzAsIFBTRTRfMSwgUFRMMF9GTiksCisKKwkvKiBQVE0gRk4gKi8KKwlQSU5NVVhfREFUQShEVl9EMTNfTUFSSywJUFNDMTNfMCwgUFNDMTJfMCwgUFRNN19GTiksCisJUElOTVVYX0RBVEEoRFZfRDEyX01BUkssCVBTQzEzXzAsIFBTQzEyXzAsIFBUTTZfRk4pLAorCVBJTk1VWF9EQVRBKERWX0QxMV9NQVJLLAlQU0MxM18wLCBQU0MxMl8wLCBQVE01X0ZOKSwKKwlQSU5NVVhfREFUQShEVl9EMTBfTUFSSywJUFNDMTNfMCwgUFNDMTJfMCwgUFRNNF9GTiksCisJUElOTVVYX0RBVEEoRFZfRDlfTUFSSywJCVBTQzExXzAsIFBTQzEwXzAsIFBUTTNfRk4pLAorCVBJTk1VWF9EQVRBKERWX0Q4X01BUkssCQlQU0MxMV8wLCBQU0MxMF8wLCBQVE0yX0ZOKSwKKworCVBJTk1VWF9EQVRBKE1TSU9GMF9UU0NLX01BUkssCVBTQzEzXzAsIFBTQzEyXzEsIFBUTTdfRk4pLAorCVBJTk1VWF9EQVRBKE1TSU9GMF9SWERfTUFSSywJUFNDMTNfMCwgUFNDMTJfMSwgUFRNNl9GTiksCisJUElOTVVYX0RBVEEoTVNJT0YwX1RYRF9NQVJLLAlQU0MxM18wLCBQU0MxMl8xLCBQVE01X0ZOKSwKKwlQSU5NVVhfREFUQShNU0lPRjBfVFNZTkNfTUFSSywJUFNDMTNfMCwgUFNDMTJfMSwgUFRNNF9GTiksCisJUElOTVVYX0RBVEEoTVNJT0YwX1NTMV9NQVJLLAlQU0MxMV8wLCBQU0MxMF8xLCBQVE0zX0ZOKSwKKwlQSU5NVVhfREFUQShNU0lPRjBfUlNDS19NQVJLLAlQU0MxMV8xLCBQU0MxMF8wLCBQVE0zX0ZOKSwKKwlQSU5NVVhfREFUQShNU0lPRjBfU1MyX01BUkssCVBTQzExXzAsIFBTQzEwXzEsIFBUTTJfRk4pLAorCVBJTk1VWF9EQVRBKE1TSU9GMF9SU1lOQ19NQVJLLAlQU0MxMV8xLCBQU0MxMF8wLCBQVE0yX0ZOKSwKKworCVBJTk1VWF9EQVRBKExDRFZDUFdDX01BUkssCVBTQTZfMCwgUFRNMV9GTiksCisJUElOTVVYX0RBVEEoTENEUkRfTUFSSywJCVBTQTdfMCwgUFRNMF9GTiksCisKKwlQSU5NVVhfREFUQShTQ0lGMF9SWERfTUFSSywJUFNBNl8xLCBQVE0xX0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGMF9TQ0tfTUFSSywJUFNBN18xLCBQVE0wX0ZOKSwKKworCS8qIFBUTiBGTiAqLworCVBJTk1VWF9EQVRBKFZJTzBfRDFfTUFSSywJUFRON19GTiksCisJUElOTVVYX0RBVEEoVklPMF9EMF9NQVJLLAlQVE42X0ZOKSwKKworCVBJTk1VWF9EQVRBKERWX0NMS0lfTUFSSywJUFNEMTFfMCwgICAgICAgICAgUFRONV9GTiksCisJUElOTVVYX0RBVEEoRFZfQ0xLX01BUkssCVBTRDEzXzAsIFBTRDEyXzAsIFBUTjRfRk4pLAorCVBJTk1VWF9EQVRBKERWX1ZTWU5DX01BUkssCVBTRDE1XzAsIFBTRDE0XzAsIFBUTjNfRk4pLAorCVBJTk1VWF9EQVRBKERWX0hTWU5DX01BUkssCVBTQjVfMCwgIFBTQjRfMCwgIFBUTjJfRk4pLAorCVBJTk1VWF9EQVRBKERWX0Q3X01BUkssCQlQU0IzXzAsICBQU0IyXzAsICBQVE4xX0ZOKSwKKwlQSU5NVVhfREFUQShEVl9ENl9NQVJLLAkJUFNCMV8wLCAgUFNCMF8wLCAgUFROMF9GTiksCisKKwlQSU5NVVhfREFUQShTQ0lGMl9WX1NDS19NQVJLLAlQU0QxM18wLCBQU0QxMl8xLCBQVE40X0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGMl9WX1JYRF9NQVJLLAlQU0QxNV8wLCBQU0QxNF8xLCBQVE4zX0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGMl9WX1RYRF9NQVJLLAlQU0I1XzAsICBQU0I0XzEsICBQVE4yX0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGM19WX0NUU19NQVJLLAlQU0IzXzAsICBQU0IyXzEsICBQVE4xX0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGM19WX1JUU19NQVJLLAlQU0IxXzAsICBQU0IwXzEsICBQVE4wX0ZOKSwKKworCVBJTk1VWF9EQVRBKFJNSUlfUlhfRVJfTUFSSywJUFNCM18xLCBQU0IyXzAsIFBUTjFfRk4pLAorCVBJTk1VWF9EQVRBKFJNSUlfQ1JTX0RWX01BUkssCVBTQjFfMSwgUFNCMF8wLCBQVE4wX0ZOKSwKKworCS8qIFBUUSBGTiAqLworCVBJTk1VWF9EQVRBKEQ3X01BUkssIFBUUTdfRk4pLAorCVBJTk1VWF9EQVRBKEQ2X01BUkssIFBUUTZfRk4pLAorCVBJTk1VWF9EQVRBKEQ1X01BUkssIFBUUTVfRk4pLAorCVBJTk1VWF9EQVRBKEQ0X01BUkssIFBUUTRfRk4pLAorCVBJTk1VWF9EQVRBKEQzX01BUkssIFBUUTNfRk4pLAorCVBJTk1VWF9EQVRBKEQyX01BUkssIFBUUTJfRk4pLAorCVBJTk1VWF9EQVRBKEQxX01BUkssIFBUUTFfRk4pLAorCVBJTk1VWF9EQVRBKEQwX01BUkssIFBUUTBfRk4pLAorCisJLyogUFRSIEZOICovCisJUElOTVVYX0RBVEEoQ1M2Ql9DRTFCX01BUkssCSAgICAgICAgICAgICAgICBQVFI3X0ZOKSwKKwlQSU5NVVhfREFUQShDUzZBX0NFMkJfTUFSSywJICAgICAgICAgICAgICAgIFBUUjZfRk4pLAorCVBJTk1VWF9EQVRBKENTNUJfQ0UxQV9NQVJLLAkgICAgICAgICAgICAgICAgUFRSNV9GTiksCisJUElOTVVYX0RBVEEoQ1M1QV9DRTJBX01BUkssCSAgICAgICAgICAgICAgICBQVFI0X0ZOKSwKKwlQSU5NVVhfREFUQShJT0lTMTZfTUFSSywJUFNBNV8wLCAgICAgICAgIFBUUjNfRk4pLAorCVBJTk1VWF9EQVRBKFdBSVRfTUFSSywJCSAgICAgICAgICAgICAgICBQVFIyX0ZOKSwKKwlQSU5NVVhfREFUQShXRTNfSUNJT1dSX01BUkssCVBTQTFfMCwgUFNBMF8wLCBQVFIxX0ZOKSwKKwlQSU5NVVhfREFUQShXRTJfSUNJT1JEX01BUkssCVBTRDFfMCwgUFNEMF8wLCBQVFIwX0ZOKSwKKworCVBJTk1VWF9EQVRBKExDRExDTEtfTUFSSywJUFNBNV8xLCAgICAgICAgIFBUUjNfRk4pLAorCisJUElOTVVYX0RBVEEoSURFQTJfTUFSSywJCVBTRDFfMSwgUFNEMF8wLCBQVFIwX0ZOKSwKKworCVBJTk1VWF9EQVRBKFRQVVRPM19NQVJLLAlQU0ExXzAsIFBTQTBfMSwgUFRSMV9GTiksCisJUElOTVVYX0RBVEEoVFBVVEkzX01BUkssCVBTQTFfMSwgUFNBMF8wLCBQVFIxX0ZOKSwKKwlQSU5NVVhfREFUQShUUFVUTzJfTUFSSywJUFNEMV8wLCBQU0QwXzEsIFBUUjBfRk4pLAorCisJLyogUFRTIEZOICovCisJUElOTVVYX0RBVEEoVklPX0NLT19NQVJLLAlQVFM2X0ZOKSwKKworCVBJTk1VWF9EQVRBKFRQVVRJMl9NQVJLLAlQU0U5XzAsIFBTRThfMSwgUFRTNV9GTiksCisKKwlQSU5NVVhfREFUQShJREVJT1JEWV9NQVJLLAlQU0U5XzEsIFBTRThfMCwgUFRTNV9GTiksCisKKwlQSU5NVVhfREFUQShWSU8xX0ZMRF9NQVJLLAlQU0U5XzAsIFBTRThfMCwgUFRTNV9GTiksCisJUElOTVVYX0RBVEEoVklPMV9IRF9NQVJLLAlQU0ExMF8wLCAgICAgICAgUFRTNF9GTiksCisJUElOTVVYX0RBVEEoVklPMV9WRF9NQVJLLAlQU0E5XzAsICAgICAgICAgUFRTM19GTiksCisJUElOTVVYX0RBVEEoVklPMV9DTEtfTUFSSywJUFNBOV8wLCAgICAgICAgIFBUUzJfRk4pLAorCVBJTk1VWF9EQVRBKFZJTzFfRDdfTUFSSywJUFNCN18wLCBQU0I2XzAsIFBUUzFfRk4pLAorCVBJTk1VWF9EQVRBKFZJTzFfRDZfTUFSSywJUFNCN18wLCBQU0I2XzAsIFBUUzBfRk4pLAorCisJUElOTVVYX0RBVEEoU0NJRjVfU0NLX01BUkssCVBTQTEwXzEsIFBUUzRfRk4pLAorCVBJTk1VWF9EQVRBKFNDSUY1X1JYRF9NQVJLLAlQU0E5XzEsICBQVFMzX0ZOKSwKKwlQSU5NVVhfREFUQShTQ0lGNV9UWERfTUFSSywJUFNBOV8xLCAgUFRTMl9GTiksCisKKwlQSU5NVVhfREFUQShWSU8wX0QxNV9NQVJLLAlQU0I3XzAsIFBTQjZfMSwgUFRTMV9GTiksCisJUElOTVVYX0RBVEEoVklPMF9EMTRfTUFSSywJUFNCN18wLCBQU0I2XzEsIFBUUzBfRk4pLAorCisJUElOTVVYX0RBVEEoSURFRDdfTUFSSywJCVBTQjdfMSwgUFNCNl8wLCBQVFMxX0ZOKSwKKwlQSU5NVVhfREFUQShJREVENl9NQVJLLAkJUFNCN18xLCBQU0I2XzAsIFBUUzBfRk4pLAorCisJLyogUFRUIEZOICovCisJUElOTVVYX0RBVEEoRDE1X01BUkssIFBUVDdfRk4pLAorCVBJTk1VWF9EQVRBKEQxNF9NQVJLLCBQVFQ2X0ZOKSwKKwlQSU5NVVhfREFUQShEMTNfTUFSSywgUFRUNV9GTiksCisJUElOTVVYX0RBVEEoRDEyX01BUkssIFBUVDRfRk4pLAorCVBJTk1VWF9EQVRBKEQxMV9NQVJLLCBQVFQzX0ZOKSwKKwlQSU5NVVhfREFUQShEMTBfTUFSSywgUFRUMl9GTiksCisJUElOTVVYX0RBVEEoRDlfTUFSSywgIFBUVDFfRk4pLAorCVBJTk1VWF9EQVRBKEQ4X01BUkssICBQVFQwX0ZOKSwKKworCS8qIFBUVSBGTiAqLworCVBJTk1VWF9EQVRBKERNQUNfREFDSzBfTUFSSywgUFRVN19GTiksCisJUElOTVVYX0RBVEEoRE1BQ19EUkVRMF9NQVJLLCBQVFU2X0ZOKSwKKworCVBJTk1VWF9EQVRBKEZTSU9BU0RfTUFSSywJUFNFMV8wLCBQVFU1X0ZOKSwKKwlQSU5NVVhfREFUQShGU0lJQUJDS19NQVJLLAlQU0UxXzAsIFBUVTRfRk4pLAorCVBJTk1VWF9EQVRBKEZTSUlBTFJDS19NQVJLLAlQU0UxXzAsIFBUVTNfRk4pLAorCVBJTk1VWF9EQVRBKEZTSU9BQkNLX01BUkssCVBTRTFfMCwgUFRVMl9GTiksCisJUElOTVVYX0RBVEEoRlNJT0FMUkNLX01BUkssCVBTRTFfMCwgUFRVMV9GTiksCisJUElOTVVYX0RBVEEoQ0xLQVVESU9BT19NQVJLLAlQU0UwXzAsIFBUVTBfRk4pLAorCisJLyogUFRWIEZOICovCisJUElOTVVYX0RBVEEoRlNJSUJTRF9NQVJLLAlQU0Q3XzAsICBQU0Q2XzAsICBQVFY3X0ZOKSwKKwlQSU5NVVhfREFUQShGU0lPQlNEX01BUkssCVBTRDdfMCwgIFBTRDZfMCwgIFBUVjZfRk4pLAorCVBJTk1VWF9EQVRBKEZTSUlCQkNLX01BUkssCVBTQzE1XzAsIFBTQzE0XzAsIFBUVjVfRk4pLAorCVBJTk1VWF9EQVRBKEZTSUlCTFJDS19NQVJLLAlQU0MxNV8wLCBQU0MxNF8wLCBQVFY0X0ZOKSwKKwlQSU5NVVhfREFUQShGU0lPQkJDS19NQVJLLAlQU0MxNV8wLCBQU0MxNF8wLCBQVFYzX0ZOKSwKKwlQSU5NVVhfREFUQShGU0lPQkxSQ0tfTUFSSywJUFNDMTVfMCwgUFNDMTRfMCwgUFRWMl9GTiksCisJUElOTVVYX0RBVEEoQ0xLQVVESU9CT19NQVJLLAlQU0UzXzAsICBQU0UyXzAsICBQVFYxX0ZOKSwKKwlQSU5NVVhfREFUQShGU0lJQVNEX01BUkssCVBTRTEwXzAsICAgICAgICAgIFBUVjBfRk4pLAorCisJUElOTVVYX0RBVEEoTVNJT0YxX1NTMl9NQVJLLAlQU0Q3XzAsICBQU0Q2XzEsICBQVFY3X0ZOKSwKKwlQSU5NVVhfREFUQShNU0lPRjFfUlNZTkNfTUFSSywJUFNEN18xLCAgUFNENl8wLCAgUFRWN19GTiksCisJUElOTVVYX0RBVEEoTVNJT0YxX1NTMV9NQVJLLAlQU0Q3XzAsICBQU0Q2XzEsICBQVFY2X0ZOKSwKKwlQSU5NVVhfREFUQShNU0lPRjFfUlNDS19NQVJLLAlQU0Q3XzEsICBQU0Q2XzAsICBQVFY2X0ZOKSwKKwlQSU5NVVhfREFUQShNU0lPRjFfUlhEX01BUkssCVBTQzE1XzAsIFBTQzE0XzEsIFBUVjVfRk4pLAorCVBJTk1VWF9EQVRBKE1TSU9GMV9UU1lOQ19NQVJLLAlQU0MxNV8wLCBQU0MxNF8xLCBQVFY0X0ZOKSwKKwlQSU5NVVhfREFUQShNU0lPRjFfVFNDS19NQVJLLAlQU0MxNV8wLCBQU0MxNF8xLCBQVFYzX0ZOKSwKKwlQSU5NVVhfREFUQShNU0lPRjFfVFhEX01BUkssCVBTQzE1XzAsIFBTQzE0XzEsIFBUVjJfRk4pLAorCVBJTk1VWF9EQVRBKE1TSU9GMV9NQ0tfTUFSSywJUFNFM18wLCAgUFNFMl8xLCAgUFRWMV9GTiksCisKKwkvKiBQVFcgRk4gKi8KKwlQSU5NVVhfREFUQShNTUNfRDdfTUFSSywJUFNFMTNfMCwgUFNFMTJfMCwgUFRXN19GTiksCisJUElOTVVYX0RBVEEoTU1DX0Q2X01BUkssCVBTRTEzXzAsIFBTRTEyXzAsIFBUVzZfRk4pLAorCVBJTk1VWF9EQVRBKE1NQ19ENV9NQVJLLAlQU0UxM18wLCBQU0UxMl8wLCBQVFc1X0ZOKSwKKwlQSU5NVVhfREFUQShNTUNfRDRfTUFSSywJUFNFMTNfMCwgUFNFMTJfMCwgUFRXNF9GTiksCisJUElOTVVYX0RBVEEoTU1DX0QzX01BUkssCVBTQTEzXzAsICAgICAgICAgIFBUVzNfRk4pLAorCVBJTk1VWF9EQVRBKE1NQ19EMl9NQVJLLAlQU0ExM18wLCAgICAgICAgICBQVFcyX0ZOKSwKKwlQSU5NVVhfREFUQShNTUNfRDFfTUFSSywJUFNBMTNfMCwgICAgICAgICAgUFRXMV9GTiksCisJUElOTVVYX0RBVEEoTU1DX0QwX01BUkssCVBTQTEzXzAsICAgICAgICAgIFBUVzBfRk4pLAorCisJUElOTVVYX0RBVEEoU0RISTFDRF9NQVJLLAlQU0UxM18wLCBQU0UxMl8xLCBQVFc3X0ZOKSwKKwlQSU5NVVhfREFUQShTREhJMVdQX01BUkssCVBTRTEzXzAsIFBTRTEyXzEsIFBUVzZfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkxRDNfTUFSSywJUFNFMTNfMCwgUFNFMTJfMSwgUFRXNV9GTiksCisJUElOTVVYX0RBVEEoU0RISTFEMl9NQVJLLAlQU0UxM18wLCBQU0UxMl8xLCBQVFc0X0ZOKSwKKwlQSU5NVVhfREFUQShTREhJMUQxX01BUkssCVBTQTEzXzEsICAgICAgICAgIFBUVzNfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkxRDBfTUFSSywJUFNBMTNfMSwgICAgICAgICAgUFRXMl9GTiksCisJUElOTVVYX0RBVEEoU0RISTFDTURfTUFSSywJUFNBMTNfMSwgICAgICAgICAgUFRXMV9GTiksCisJUElOTVVYX0RBVEEoU0RISTFDTEtfTUFSSywJUFNBMTNfMSwgICAgICAgICAgUFRXMF9GTiksCisKKwlQSU5NVVhfREFUQShJT0RBQ0tfTUFSSywJUFNFMTNfMSwgUFNFMTJfMCwgUFRXN19GTiksCisJUElOTVVYX0RBVEEoSURFUlNUX01BUkssCVBTRTEzXzEsIFBTRTEyXzAsIFBUVzZfRk4pLAorCVBJTk1VWF9EQVRBKEVYQlVGX0VOQl9NQVJLLAlQU0UxM18xLCBQU0UxMl8wLCBQVFc1X0ZOKSwKKwlQSU5NVVhfREFUQShESVJFQ1RJT05fTUFSSywJUFNFMTNfMSwgUFNFMTJfMCwgUFRXNF9GTiksCisKKwkvKiBQVFggRk4gKi8KKwlQSU5NVVhfREFUQShETUFDX0RBQ0sxX01BUkssCVBTQTEyXzAsIFBUWDdfRk4pLAorCVBJTk1VWF9EQVRBKERNQUNfRFJFUTFfTUFSSywJUFNBMTJfMCwgUFRYNl9GTiksCisKKwlQSU5NVVhfREFUQShJUkRBX09VVF9NQVJLLAlQU0ExMl8xLCBQVFg3X0ZOKSwKKwlQSU5NVVhfREFUQShJUkRBX0lOX01BUkssCVBTQTEyXzEsIFBUWDZfRk4pLAorCisJUElOTVVYX0RBVEEoVFNJRl9UUzBfU0RBVF9NQVJLLAlQU0MwXzAsIFBUWDVfRk4pLAorCVBJTk1VWF9EQVRBKFRTSUZfVFMwX1NDS19NQVJLLAlQU0MxXzAsIFBUWDRfRk4pLAorCVBJTk1VWF9EQVRBKFRTSUZfVFMwX1NERU5fTUFSSywJUFNDMl8wLCBQVFgzX0ZOKSwKKwlQSU5NVVhfREFUQShUU0lGX1RTMF9TUFNZTkNfTUFSSywgICAgICAgUFRYMl9GTiksCisKKwlQSU5NVVhfREFUQShMTktTVEFfTUFSSywJUFNDMF8xLCBQVFg1X0ZOKSwKKwlQSU5NVVhfREFUQShNRElPX01BUkssCQlQU0MxXzEsIFBUWDRfRk4pLAorCVBJTk1VWF9EQVRBKE1EQ19NQVJLLAkJUFNDMl8xLCBQVFgzX0ZOKSwKKworCVBJTk1VWF9EQVRBKE1NQ19DTEtfTUFSSywgUFRYMV9GTiksCisJUElOTVVYX0RBVEEoTU1DX0NNRF9NQVJLLCBQVFgwX0ZOKSwKKworCS8qIFBUWSBGTiAqLworCVBJTk1VWF9EQVRBKFNESEkwQ0RfTUFSSywgIFBUWTdfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkwV1BfTUFSSywgIFBUWTZfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkwRDNfTUFSSywgIFBUWTVfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkwRDJfTUFSSywgIFBUWTRfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkwRDFfTUFSSywgIFBUWTNfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkwRDBfTUFSSywgIFBUWTJfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkwQ01EX01BUkssIFBUWTFfRk4pLAorCVBJTk1VWF9EQVRBKFNESEkwQ0xLX01BUkssIFBUWTBfRk4pLAorCisJLyogUFRaIEZOICovCisJUElOTVVYX0RBVEEoSU5UQ19JUlE3X01BUkssCVBTQjEwXzAsIFBUWjdfRk4pLAorCVBJTk1VWF9EQVRBKElOVENfSVJRNl9NQVJLLAlQU0IxMV8wLCBQVFo2X0ZOKSwKKwlQSU5NVVhfREFUQShJTlRDX0lSUTVfTUFSSywJUFNCMTJfMCwgUFRaNV9GTiksCisJUElOTVVYX0RBVEEoSU5UQ19JUlE0X01BUkssCVBTQjEzXzAsIFBUWjRfRk4pLAorCVBJTk1VWF9EQVRBKElOVENfSVJRM19NQVJLLAlQU0IxNF8wLCBQVFozX0ZOKSwKKwlQSU5NVVhfREFUQShJTlRDX0lSUTJfTUFSSywJICAgICAgICAgUFRaMl9GTiksCisJUElOTVVYX0RBVEEoSU5UQ19JUlExX01BUkssCSAgICAgICAgIFBUWjFfRk4pLAorCVBJTk1VWF9EQVRBKElOVENfSVJRMF9NQVJLLAkgICAgICAgICBQVFowX0ZOKSwKKworCVBJTk1VWF9EQVRBKFNDSUYzX0lfQ1RTX01BUkssCVBTQjEwXzEsIFBUWjdfRk4pLAorCVBJTk1VWF9EQVRBKFNDSUYzX0lfUlRTX01BUkssCVBTQjExXzEsIFBUWjZfRk4pLAorCVBJTk1VWF9EQVRBKFNDSUYzX0lfU0NLX01BUkssCVBTQjEyXzEsIFBUWjVfRk4pLAorCVBJTk1VWF9EQVRBKFNDSUYzX0lfUlhEX01BUkssCVBTQjEzXzEsIFBUWjRfRk4pLAorCVBJTk1VWF9EQVRBKFNDSUYzX0lfVFhEX01BUkssCVBTQjE0XzEsIFBUWjNfRk4pLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5tdXhfZ3BpbyBwaW5tdXhfZ3Bpb3NbXSA9IHsKKwkvKiBQVEEgKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BUQTcsIFBUQTdfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEE2LCBQVEE2X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRBNSwgUFRBNV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUQTQsIFBUQTRfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEEzLCBQVEEzX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRBMiwgUFRBMl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUQTEsIFBUQTFfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEEwLCBQVEEwX0RBVEEpLAorCisJLyogUFRCICovCisJUElOTVVYX0dQSU8oR1BJT19QVEI3LCBQVEI3X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRCNiwgUFRCNl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUQjUsIFBUQjVfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEI0LCBQVEI0X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRCMywgUFRCM19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUQjIsIFBUQjJfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEIxLCBQVEIxX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRCMCwgUFRCMF9EQVRBKSwKKworCS8qIFBUQyAqLworCVBJTk1VWF9HUElPKEdQSU9fUFRDNywgUFRDN19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUQzYsIFBUQzZfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEM1LCBQVEM1X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRDNCwgUFRDNF9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUQzMsIFBUQzNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEMyLCBQVEMyX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRDMSwgUFRDMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUQzAsIFBUQzBfREFUQSksCisKKwkvKiBQVEQgKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BURDcsIFBURDdfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEQ2LCBQVEQ2X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRENSwgUFRENV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BURDQsIFBURDRfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEQzLCBQVEQzX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFREMiwgUFREMl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BURDEsIFBURDFfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEQwLCBQVEQwX0RBVEEpLAorCisJLyogUFRFICovCisJUElOTVVYX0dQSU8oR1BJT19QVEU3LCBQVEU3X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRFNiwgUFRFNl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BURTUsIFBURTVfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEU0LCBQVEU0X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRFMywgUFRFM19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BURTIsIFBURTJfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEUxLCBQVEUxX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRFMCwgUFRFMF9EQVRBKSwKKworCS8qIFBURiAqLworCVBJTk1VWF9HUElPKEdQSU9fUFRGNywgUFRGN19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BURjYsIFBURjZfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEY1LCBQVEY1X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRGNCwgUFRGNF9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BURjMsIFBURjNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEYyLCBQVEYyX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRGMSwgUFRGMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BURjAsIFBURjBfREFUQSksCisKKwkvKiBQVEcgKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BURzUsIFBURzVfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEc0LCBQVEc0X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRHMywgUFRHM19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BURzIsIFBURzJfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEcxLCBQVEcxX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRHMCwgUFRHMF9EQVRBKSwKKworCS8qIFBUSCAqLworCVBJTk1VWF9HUElPKEdQSU9fUFRINywgUFRIN19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUSDYsIFBUSDZfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEg1LCBQVEg1X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRINCwgUFRINF9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUSDMsIFBUSDNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEgyLCBQVEgyX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRIMSwgUFRIMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUSDAsIFBUSDBfREFUQSksCisKKwkvKiBQVEogKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BUSjcsIFBUSjdfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEo2LCBQVEo2X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRKNSwgUFRKNV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUSjMsIFBUSjNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEoyLCBQVEoyX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRKMSwgUFRKMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUSjAsIFBUSjBfREFUQSksCisKKwkvKiBQVEsgKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BUSzcsIFBUSzdfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEs2LCBQVEs2X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRLNSwgUFRLNV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUSzQsIFBUSzRfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEszLCBQVEszX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRLMiwgUFRLMl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUSzEsIFBUSzFfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEswLCBQVEswX0RBVEEpLAorCisJLyogUFRMICovCisJUElOTVVYX0dQSU8oR1BJT19QVEw3LCBQVEw3X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRMNiwgUFRMNl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUTDUsIFBUTDVfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEw0LCBQVEw0X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRMMywgUFRMM19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUTDIsIFBUTDJfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVEwxLCBQVEwxX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRMMCwgUFRMMF9EQVRBKSwKKworCS8qIFBUTSAqLworCVBJTk1VWF9HUElPKEdQSU9fUFRNNywgUFRNN19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUTTYsIFBUTTZfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVE01LCBQVE01X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRNNCwgUFRNNF9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUTTMsIFBUTTNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVE0yLCBQVE0yX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRNMSwgUFRNMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUTTAsIFBUTTBfREFUQSksCisKKwkvKiBQVE4gKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BUTjcsIFBUTjdfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVE42LCBQVE42X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRONSwgUFRONV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUTjQsIFBUTjRfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVE4zLCBQVE4zX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFROMiwgUFROMl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUTjEsIFBUTjFfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVE4wLCBQVE4wX0RBVEEpLAorCisJLyogUFRRICovCisJUElOTVVYX0dQSU8oR1BJT19QVFE3LCBQVFE3X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRRNiwgUFRRNl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUUTUsIFBUUTVfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFE0LCBQVFE0X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRRMywgUFRRM19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUUTIsIFBUUTJfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFExLCBQVFExX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRRMCwgUFRRMF9EQVRBKSwKKworCS8qIFBUUiAqLworCVBJTk1VWF9HUElPKEdQSU9fUFRSNywgUFRSN19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUUjYsIFBUUjZfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFI1LCBQVFI1X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRSNCwgUFRSNF9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUUjMsIFBUUjNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFIyLCBQVFIyX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRSMSwgUFRSMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUUjAsIFBUUjBfREFUQSksCisKKwkvKiBQVFMgKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BUUzYsIFBUUzZfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFM1LCBQVFM1X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRTNCwgUFRTNF9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUUzMsIFBUUzNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFMyLCBQVFMyX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRTMSwgUFRTMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUUzAsIFBUUzBfREFUQSksCisKKwkvKiBQVFQgKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BUVDcsIFBUVDdfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFQ2LCBQVFQ2X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRUNSwgUFRUNV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVDQsIFBUVDRfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFQzLCBQVFQzX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRUMiwgUFRUMl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVDEsIFBUVDFfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFQwLCBQVFQwX0RBVEEpLAorCisJLyogUFRVICovCisJUElOTVVYX0dQSU8oR1BJT19QVFU3LCBQVFU3X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRVNiwgUFRVNl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVTUsIFBUVTVfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFU0LCBQVFU0X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRVMywgUFRVM19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVTIsIFBUVTJfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFUxLCBQVFUxX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRVMCwgUFRVMF9EQVRBKSwKKworCS8qIFBUViAqLworCVBJTk1VWF9HUElPKEdQSU9fUFRWNywgUFRWN19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVjYsIFBUVjZfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFY1LCBQVFY1X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRWNCwgUFRWNF9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVjMsIFBUVjNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFYyLCBQVFYyX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRWMSwgUFRWMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVjAsIFBUVjBfREFUQSksCisKKwkvKiBQVFcgKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BUVzcsIFBUVzdfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFc2LCBQVFc2X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRXNSwgUFRXNV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVzQsIFBUVzRfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFczLCBQVFczX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRXMiwgUFRXMl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUVzEsIFBUVzFfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFcwLCBQVFcwX0RBVEEpLAorCisJLyogUFRYICovCisJUElOTVVYX0dQSU8oR1BJT19QVFg3LCBQVFg3X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRYNiwgUFRYNl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUWDUsIFBUWDVfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFg0LCBQVFg0X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRYMywgUFRYM19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUWDIsIFBUWDJfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFgxLCBQVFgxX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRYMCwgUFRYMF9EQVRBKSwKKworCS8qIFBUWSAqLworCVBJTk1VWF9HUElPKEdQSU9fUFRZNywgUFRZN19EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUWTYsIFBUWTZfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFk1LCBQVFk1X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRZNCwgUFRZNF9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUWTMsIFBUWTNfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFkyLCBQVFkyX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRZMSwgUFRZMV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUWTAsIFBUWTBfREFUQSksCisKKwkvKiBQVFogKi8KKwlQSU5NVVhfR1BJTyhHUElPX1BUWjcsIFBUWjdfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFo2LCBQVFo2X0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRaNSwgUFRaNV9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUWjQsIFBUWjRfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFozLCBQVFozX0RBVEEpLAorCVBJTk1VWF9HUElPKEdQSU9fUFRaMiwgUFRaMl9EQVRBKSwKKwlQSU5NVVhfR1BJTyhHUElPX1BUWjEsIFBUWjFfREFUQSksCisJUElOTVVYX0dQSU8oR1BJT19QVFowLCBQVFowX0RBVEEpLAorCisJLyogQlNDICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMzEsCUQzMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QzMCwJRDMwX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDI5LAlEMjlfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMjgsCUQyOF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QyNywJRDI3X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDI2LAlEMjZfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMjUsCUQyNV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QyNCwJRDI0X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDIzLAlEMjNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMjIsCUQyMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QyMSwJRDIxX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDIwLAlEMjBfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMTksCUQxOV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QxOCwJRDE4X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDE3LAlEMTdfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMTYsCUQxNl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QxNSwJRDE1X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDE0LAlEMTRfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMTMsCUQxM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QxMiwJRDEyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDExLAlEMTFfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMTAsCUQxMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0Q5LAkJRDlfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EOCwJCUQ4X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDcsCQlEN19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0Q2LAkJRDZfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9ENSwJCUQ1X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDQsCQlENF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QzLAkJRDNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EMiwJCUQyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRDEsCQlEMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0QwLAkJRDBfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9BMjUsCUEyNV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0EyNCwJQTI0X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fQTIzLAlBMjNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9BMjIsCUEyMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0NTNkJfQ0UxQiwJQ1M2Ql9DRTFCX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fQ1M2QV9DRTJCLAlDUzZBX0NFMkJfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9DUzVCX0NFMUEsCUNTNUJfQ0UxQV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0NTNUFfQ0UyQSwJQ1M1QV9DRTJBX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fV0UzX0lDSU9XUiwJV0UzX0lDSU9XUl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1dFMl9JQ0lPUkQsCVdFMl9JQ0lPUkRfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9JT0lTMTYsCUlPSVMxNl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1dBSVQsCVdBSVRfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9CUywJCUJTX01BUkspLAorCisJLyogS0VZU0MgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWU9VVDVfSU41LAlLRVlPVVQ1X0lONV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWU9VVDRfSU42LAlLRVlPVVQ0X0lONl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWUlONCwJCUtFWUlONF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWUlOMywJCUtFWUlOM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWUlOMiwJCUtFWUlOMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWUlOMSwJCUtFWUlOMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWUlOMCwJCUtFWUlOMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWU9VVDMsCQlLRVlPVVQzX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fS0VZT1VUMiwJCUtFWU9VVDJfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9LRVlPVVQxLAkJS0VZT1VUMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0tFWU9VVDAsCQlLRVlPVVQwX01BUkspLAorCisJLyogQVRBUEkgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQxNSwJSURFRDE1X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fSURFRDE0LAlJREVEMTRfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9JREVEMTMsCUlERUQxM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQxMiwJSURFRDEyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fSURFRDExLAlJREVEMTFfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9JREVEMTAsCUlERUQxMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQ5LAlJREVEOV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQ4LAlJREVEOF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQ3LAlJREVEN19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQ2LAlJREVENl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQ1LAlJREVENV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQ0LAlJREVENF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQzLAlJREVEM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQyLAlJREVEMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQxLAlJREVEMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUQwLAlJREVEMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUEyLAlJREVBMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUExLAlJREVBMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUEwLAlJREVBMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUlPV1IsCUlERUlPV1JfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9JT0RSRVEsCUlPRFJFUV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUNTMCwJSURFQ1MwX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fSURFQ1MxLAlJREVDUzFfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9JREVJT1JELAlJREVJT1JEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRElSRUNUSU9OLAlESVJFQ1RJT05fTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9FWEJVRl9FTkIsCUVYQlVGX0VOQl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERVJTVCwJSURFUlNUX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fSU9EQUNLLAlJT0RBQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9JREVJTlQsCUlERUlOVF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lERUlPUkRZLAlJREVJT1JEWV9NQVJLKSwKKworCS8qIFRQVSAqLworCVBJTk1VWF9HUElPKEdQSU9fRk5fVFBVVE8zLAlUUFVUTzNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9UUFVUTzIsCVRQVVRPMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1RQVVRPMSwJVFBVVE8xX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVFBVVE8wLAlUUFVUTzBfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9UUFVUSTMsCVRQVVRJM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1RQVVRJMiwJVFBVVEkyX01BUkspLAorCisJLyogTENEQyAqLworCVBJTk1VWF9HUElPKEdQSU9fRk5fTENERDIzLAlMQ0REMjNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0REMjIsCUxDREQyMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQyMSwJTENERDIxX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTENERDIwLAlMQ0REMjBfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0REMTksCUxDREQxOV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQxOCwJTENERDE4X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTENERDE3LAlMQ0REMTdfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0REMTYsCUxDREQxNl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQxNSwJTENERDE1X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTENERDE0LAlMQ0REMTRfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0REMTMsCUxDREQxM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQxMiwJTENERDEyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTENERDExLAlMQ0REMTFfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0REMTAsCUxDREQxMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQ5LAlMQ0REOV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQ4LAlMQ0REOF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQ3LAlMQ0REN19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQ2LAlMQ0RENl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQ1LAlMQ0RENV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQ0LAlMQ0RENF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQzLAlMQ0REM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQyLAlMQ0REMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQxLAlMQ0REMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDREQwLAlMQ0REMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDRFZTWU4sCUxDRFZTWU5fTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0RESVNQLAlMQ0RESVNQX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTENEUlMsCUxDRFJTX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTENESFNZTiwJTENESFNZTl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDRENTLAlMQ0RDU19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xDRERPTiwJTENERE9OX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTENERENLLAlMQ0REQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0RXUiwJTENEV1JfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0RWRVBXQywJTENEVkVQV0NfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0RWQ1BXQywJTENEVkNQV0NfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0RSRCwJTENEUkRfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9MQ0RMQ0xLLAlMQ0RMQ0xLX01BUkspLAorCisJLyogU0NJRjAgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYwX1RYRCwJU0NJRjBfVFhEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjBfUlhELAlTQ0lGMF9SWERfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9TQ0lGMF9TQ0ssCVNDSUYwX1NDS19NQVJLKSwKKworCS8qIFNDSUYxICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9TQ0lGMV9TQ0ssCVNDSUYxX1NDS19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYxX1JYRCwJU0NJRjFfUlhEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjFfVFhELAlTQ0lGMV9UWERfTUFSSyksCisKKwkvKiBTQ0lGMiAqLworCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjJfTF9UWEQsCVNDSUYyX0xfVFhEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjJfTF9TQ0ssCVNDSUYyX0xfU0NLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjJfTF9SWEQsCVNDSUYyX0xfUlhEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjJfVl9UWEQsCVNDSUYyX1ZfVFhEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjJfVl9TQ0ssCVNDSUYyX1ZfU0NLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjJfVl9SWEQsCVNDSUYyX1ZfUlhEX01BUkspLAorCisJLyogU0NJRjMgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX1ZfU0NLLAlTQ0lGM19WX1NDS19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX1ZfUlhELAlTQ0lGM19WX1JYRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX1ZfVFhELAlTQ0lGM19WX1RYRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX1ZfQ1RTLAlTQ0lGM19WX0NUU19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX1ZfUlRTLAlTQ0lGM19WX1JUU19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX0lfU0NLLAlTQ0lGM19JX1NDS19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX0lfUlhELAlTQ0lGM19JX1JYRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX0lfVFhELAlTQ0lGM19JX1RYRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX0lfQ1RTLAlTQ0lGM19JX0NUU19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUYzX0lfUlRTLAlTQ0lGM19JX1JUU19NQVJLKSwKKworCS8qIFNDSUY0ICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9TQ0lGNF9TQ0ssCVNDSUY0X1NDS19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUY0X1JYRCwJU0NJRjRfUlhEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjRfVFhELAlTQ0lGNF9UWERfTUFSSyksCisKKwkvKiBTQ0lGNSAqLworCVBJTk1VWF9HUElPKEdQSU9fRk5fU0NJRjVfU0NLLAlTQ0lGNV9TQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9TQ0lGNV9SWEQsCVNDSUY1X1JYRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NDSUY1X1RYRCwJU0NJRjVfVFhEX01BUkspLAorCisJLyogRlNJICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9GU0lNQ0tCLAlGU0lNQ0tCX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRlNJTUNLQSwJRlNJTUNLQV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0ZTSU9BU0QsCUZTSU9BU0RfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9GU0lJQUJDSywJRlNJSUFCQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9GU0lJQUxSQ0ssCUZTSUlBTFJDS19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0ZTSU9BQkNLLAlGU0lPQUJDS19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0ZTSU9BTFJDSywJRlNJT0FMUkNLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fQ0xLQVVESU9BTywJQ0xLQVVESU9BT19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0ZTSUlCU0QsCUZTSUlCU0RfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9GU0lPQlNELAlGU0lPQlNEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRlNJSUJCQ0ssCUZTSUlCQkNLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRlNJSUJMUkNLLAlGU0lJQkxSQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9GU0lPQkJDSywJRlNJT0JCQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9GU0lPQkxSQ0ssCUZTSU9CTFJDS19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0NMS0FVRElPQk8sCUNMS0FVRElPQk9fTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9GU0lJQVNELAlGU0lJQVNEX01BUkspLAorCisJLyogQVVEICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9BVURDSywJQVVEQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9BVURTWU5DLAlBVURTWU5DX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fQVVEQVRBMywJQVVEQVRBM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0FVREFUQTIsCUFVREFUQTJfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9BVURBVEExLAlBVURBVEExX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fQVVEQVRBMCwJQVVEQVRBMF9NQVJLKSwKKworCS8qIFZJTyAqLworCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPX0NLTywJVklPX0NLT19NQVJLKSwKKworCS8qIFZJTzAgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDE1LAlWSU8wX0QxNV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDE0LAlWSU8wX0QxNF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDEzLAlWSU8wX0QxM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDEyLAlWSU8wX0QxMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDExLAlWSU8wX0QxMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDEwLAlWSU8wX0QxMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDksCVZJTzBfRDlfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9WSU8wX0Q4LAlWSU8wX0Q4X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMF9ENywJVklPMF9EN19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDYsCVZJTzBfRDZfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9WSU8wX0Q1LAlWSU8wX0Q1X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMF9ENCwJVklPMF9ENF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDMsCVZJTzBfRDNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9WSU8wX0QyLAlWSU8wX0QyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMF9EMSwJVklPMF9EMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzBfRDAsCVZJTzBfRDBfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9WSU8wX1ZELAlWSU8wX1ZEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMF9DTEssCVZJTzBfQ0xLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMF9GTEQsCVZJTzBfRkxEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMF9IRCwJVklPMF9IRF9NQVJLKSwKKworCS8qIFZJTzEgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzFfRDcsCVZJTzFfRDdfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9WSU8xX0Q2LAlWSU8xX0Q2X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMV9ENSwJVklPMV9ENV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzFfRDQsCVZJTzFfRDRfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9WSU8xX0QzLAlWSU8xX0QzX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMV9EMiwJVklPMV9EMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzFfRDEsCVZJTzFfRDFfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9WSU8xX0QwLAlWSU8xX0QwX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMV9GTEQsCVZJTzFfRkxEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVklPMV9IRCwJVklPMV9IRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1ZJTzFfVkQsCVZJTzFfVkRfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9WSU8xX0NMSywJVklPMV9DTEtfTUFSSyksCisKKwkvKiBFdGggKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1JNSUlfUlhEMCwJCVJNSUlfUlhEMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1JNSUlfUlhEMSwJCVJNSUlfUlhEMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1JNSUlfVFhEMCwJCVJNSUlfVFhEMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1JNSUlfVFhEMSwJCVJNSUlfVFhEMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1JNSUlfUkVGX0NMSywJUk1JSV9SRUZfQ0xLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fUk1JSV9UWF9FTiwJCVJNSUlfVFhfRU5fTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9STUlJX1JYX0VSLAkJUk1JSV9SWF9FUl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1JNSUlfQ1JTX0RWLAlSTUlJX0NSU19EVl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0xOS1NUQSwJCUxOS1NUQV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX01ESU8sCQlNRElPX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTURDLAkJTURDX01BUkspLAorCisJLyogU3lzdGVtICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9QRFNUQVRVUywJUERTVEFUVVNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9TVEFUVVMyLAlTVEFUVVMyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU1RBVFVTMCwJU1RBVFVTMF9NQVJLKSwKKworCS8qIFZPVSAqLworCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDE1LAlEVl9EMTVfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EVl9EMTQsCURWX0QxNF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0RWX0QxMywJRFZfRDEzX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDEyLAlEVl9EMTJfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9EVl9EMTEsCURWX0QxMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0RWX0QxMCwJRFZfRDEwX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDksCURWX0Q5X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDgsCURWX0Q4X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDcsCURWX0Q3X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDYsCURWX0Q2X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDUsCURWX0Q1X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDQsCURWX0Q0X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDMsCURWX0QzX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDIsCURWX0QyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDEsCURWX0QxX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfRDAsCURWX0QwX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfQ0xLSSwJRFZfQ0xLSV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0RWX0NMSywJRFZfQ0xLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfVlNZTkMsCURWX1ZTWU5DX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRFZfSFNZTkMsCURWX0hTWU5DX01BUkspLAorCisJLyogTVNJT0YwICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9NU0lPRjBfUlhELAkJTVNJT0YwX1JYRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX01TSU9GMF9UWEQsCQlNU0lPRjBfVFhEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTVNJT0YwX01DSywJCU1TSU9GMF9NQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NU0lPRjBfVFNDSywJTVNJT0YwX1RTQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NU0lPRjBfU1MxLAkJTVNJT0YwX1NTMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX01TSU9GMF9TUzIsCQlNU0lPRjBfU1MyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTVNJT0YwX1RTWU5DLAlNU0lPRjBfVFNZTkNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NU0lPRjBfUlNDSywJTVNJT0YwX1JTQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NU0lPRjBfUlNZTkMsCU1TSU9GMF9SU1lOQ19NQVJLKSwKKworCS8qIE1TSU9GMSAqLworCVBJTk1VWF9HUElPKEdQSU9fRk5fTVNJT0YxX1JYRCwJCU1TSU9GMV9SWERfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NU0lPRjFfVFhELAkJTVNJT0YxX1RYRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX01TSU9GMV9NQ0ssCQlNU0lPRjFfTUNLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTVNJT0YxX1RTQ0ssCU1TSU9GMV9UU0NLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTVNJT0YxX1NTMSwJCU1TSU9GMV9TUzFfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NU0lPRjFfU1MyLAkJTVNJT0YxX1NTMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX01TSU9GMV9UU1lOQywJTVNJT0YxX1RTWU5DX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTVNJT0YxX1JTQ0ssCU1TSU9GMV9SU0NLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTVNJT0YxX1JTWU5DLAlNU0lPRjFfUlNZTkNfTUFSSyksCisKKwkvKiBETUFDICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9ETUFDX0RBQ0swLAlETUFDX0RBQ0swX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fRE1BQ19EUkVRMCwJRE1BQ19EUkVRMF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0RNQUNfREFDSzEsCURNQUNfREFDSzFfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9ETUFDX0RSRVExLAlETUFDX0RSRVExX01BUkspLAorCisJLyogU0RISTAgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NESEkwQ0QsCVNESEkwQ0RfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9TREhJMFdQLAlTREhJMFdQX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0RISTBDTUQsCVNESEkwQ01EX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0RISTBDTEssCVNESEkwQ0xLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0RISTBEMywJU0RISTBEM19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NESEkwRDIsCVNESEkwRDJfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9TREhJMEQxLAlTREhJMEQxX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0RISTBEMCwJU0RISTBEMF9NQVJLKSwKKworCS8qIFNESEkxICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9TREhJMUNELAlTREhJMUNEX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0RISTFXUCwJU0RISTFXUF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NESEkxQ01ELAlTREhJMUNNRF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NESEkxQ0xLLAlTREhJMUNMS19NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NESEkxRDMsCVNESEkxRDNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9TREhJMUQyLAlTREhJMUQyX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fU0RISTFEMSwJU0RISTFEMV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX1NESEkxRDAsCVNESEkxRDBfTUFSSyksCisKKwkvKiBNTUMgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX01NQ19ENywJTU1DX0Q3X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTU1DX0Q2LAlNTUNfRDZfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NTUNfRDUsCU1NQ19ENV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX01NQ19ENCwJTU1DX0Q0X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTU1DX0QzLAlNTUNfRDNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NTUNfRDIsCU1NQ19EMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX01NQ19EMSwJTU1DX0QxX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTU1DX0QwLAlNTUNfRDBfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9NTUNfQ0xLLAlNTUNfQ0xLX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fTU1DX0NNRCwJTU1DX0NNRF9NQVJLKSwKKworCS8qIElyREEgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lSREFfT1VULAlJUkRBX09VVF9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lSREFfSU4sCUlSREFfSU5fTUFSSyksCisKKwkvKiBUU0lGICovCisJUElOTVVYX0dQSU8oR1BJT19GTl9UU0lGX1RTMF9TREFULAlUU0lGX1RTMF9TREFUX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVFNJRl9UUzBfU0NLLAlUU0lGX1RTMF9TQ0tfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9UU0lGX1RTMF9TREVOLAlUU0lGX1RTMF9TREVOX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fVFNJRl9UUzBfU1BTWU5DLAlUU0lGX1RTMF9TUFNZTkNfTUFSSyksCisKKwkvKiBJUlEgKi8KKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lOVENfSVJRNywJSU5UQ19JUlE3X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fSU5UQ19JUlE2LAlJTlRDX0lSUTZfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9JTlRDX0lSUTUsCUlOVENfSVJRNV9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lOVENfSVJRNCwJSU5UQ19JUlE0X01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fSU5UQ19JUlEzLAlJTlRDX0lSUTNfTUFSSyksCisJUElOTVVYX0dQSU8oR1BJT19GTl9JTlRDX0lSUTIsCUlOVENfSVJRMl9NQVJLKSwKKwlQSU5NVVhfR1BJTyhHUElPX0ZOX0lOVENfSVJRMSwJSU5UQ19JUlExX01BUkspLAorCVBJTk1VWF9HUElPKEdQSU9fRk5fSU5UQ19JUlEwLAlJTlRDX0lSUTBfTUFSSyksCisgfTsKKworc3RhdGljIHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyBwaW5tdXhfY29uZmlnX3JlZ3NbXSA9IHsKKwl7IFBJTk1VWF9DRkdfUkVHKCJQQUNSIiwgMHhhNDA1MDEwMCwgMTYsIDIpIHsKKwkJUFRBN19GTiwgUFRBN19PVVQsIFBUQTdfSU5fUFUsIFBUQTdfSU4sCisJCVBUQTZfRk4sIFBUQTZfT1VULCBQVEE2X0lOX1BVLCBQVEE2X0lOLAorCQlQVEE1X0ZOLCBQVEE1X09VVCwgUFRBNV9JTl9QVSwgUFRBNV9JTiwKKwkJUFRBNF9GTiwgUFRBNF9PVVQsIFBUQTRfSU5fUFUsIFBUQTRfSU4sCisJCVBUQTNfRk4sIFBUQTNfT1VULCBQVEEzX0lOX1BVLCBQVEEzX0lOLAorCQlQVEEyX0ZOLCBQVEEyX09VVCwgUFRBMl9JTl9QVSwgUFRBMl9JTiwKKwkJUFRBMV9GTiwgUFRBMV9PVVQsIFBUQTFfSU5fUFUsIFBUQTFfSU4sCisJCVBUQTBfRk4sIFBUQTBfT1VULCBQVEEwX0lOX1BVLCBQVEEwX0lOIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBCQ1IiLCAweGE0MDUwMTAyLCAxNiwgMikgeworCQlQVEI3X0ZOLCBQVEI3X09VVCwgUFRCN19JTl9QVSwgUFRCN19JTiwKKwkJUFRCNl9GTiwgUFRCNl9PVVQsIFBUQjZfSU5fUFUsIFBUQjZfSU4sCisJCVBUQjVfRk4sIFBUQjVfT1VULCBQVEI1X0lOX1BVLCBQVEI1X0lOLAorCQlQVEI0X0ZOLCBQVEI0X09VVCwgUFRCNF9JTl9QVSwgUFRCNF9JTiwKKwkJUFRCM19GTiwgUFRCM19PVVQsIFBUQjNfSU5fUFUsIFBUQjNfSU4sCisJCVBUQjJfRk4sIFBUQjJfT1VULCBQVEIyX0lOX1BVLCBQVEIyX0lOLAorCQlQVEIxX0ZOLCBQVEIxX09VVCwgUFRCMV9JTl9QVSwgUFRCMV9JTiwKKwkJUFRCMF9GTiwgUFRCMF9PVVQsIFBUQjBfSU5fUFUsIFBUQjBfSU4gfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiUENDUiIsIDB4YTQwNTAxMDQsIDE2LCAyKSB7CisJCVBUQzdfRk4sIFBUQzdfT1VULCBQVEM3X0lOX1BVLCBQVEM3X0lOLAorCQlQVEM2X0ZOLCBQVEM2X09VVCwgUFRDNl9JTl9QVSwgUFRDNl9JTiwKKwkJUFRDNV9GTiwgUFRDNV9PVVQsIFBUQzVfSU5fUFUsIFBUQzVfSU4sCisJCVBUQzRfRk4sIFBUQzRfT1VULCBQVEM0X0lOX1BVLCBQVEM0X0lOLAorCQlQVEMzX0ZOLCBQVEMzX09VVCwgUFRDM19JTl9QVSwgUFRDM19JTiwKKwkJUFRDMl9GTiwgUFRDMl9PVVQsIFBUQzJfSU5fUFUsIFBUQzJfSU4sCisJCVBUQzFfRk4sIFBUQzFfT1VULCBQVEMxX0lOX1BVLCBQVEMxX0lOLAorCQlQVEMwX0ZOLCBQVEMwX09VVCwgUFRDMF9JTl9QVSwgUFRDMF9JTiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQRENSIiwgMHhhNDA1MDEwNiwgMTYsIDIpIHsKKwkJUFREN19GTiwgUFREN19PVVQsIFBURDdfSU5fUFUsIFBURDdfSU4sCisJCVBURDZfRk4sIFBURDZfT1VULCBQVEQ2X0lOX1BVLCBQVEQ2X0lOLAorCQlQVEQ1X0ZOLCBQVEQ1X09VVCwgUFRENV9JTl9QVSwgUFRENV9JTiwKKwkJUFRENF9GTiwgUFRENF9PVVQsIFBURDRfSU5fUFUsIFBURDRfSU4sCisJCVBURDNfRk4sIFBURDNfT1VULCBQVEQzX0lOX1BVLCBQVEQzX0lOLAorCQlQVEQyX0ZOLCBQVEQyX09VVCwgUFREMl9JTl9QVSwgUFREMl9JTiwKKwkJUFREMV9GTiwgUFREMV9PVVQsIFBURDFfSU5fUFUsIFBURDFfSU4sCisJCVBURDBfRk4sIFBURDBfT1VULCBQVEQwX0lOX1BVLCBQVEQwX0lOIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBFQ1IiLCAweGE0MDUwMTA4LCAxNiwgMikgeworCQlQVEU3X0ZOLCBQVEU3X09VVCwgUFRFN19JTl9QVSwgUFRFN19JTiwKKwkJUFRFNl9GTiwgUFRFNl9PVVQsIFBURTZfSU5fUFUsIFBURTZfSU4sCisJCVBURTVfRk4sIFBURTVfT1VULCBQVEU1X0lOX1BVLCBQVEU1X0lOLAorCQlQVEU0X0ZOLCBQVEU0X09VVCwgUFRFNF9JTl9QVSwgUFRFNF9JTiwKKwkJUFRFM19GTiwgUFRFM19PVVQsIFBURTNfSU5fUFUsIFBURTNfSU4sCisJCVBURTJfRk4sIFBURTJfT1VULCBQVEUyX0lOX1BVLCBQVEUyX0lOLAorCQlQVEUxX0ZOLCBQVEUxX09VVCwgUFRFMV9JTl9QVSwgUFRFMV9JTiwKKwkJUFRFMF9GTiwgUFRFMF9PVVQsIFBURTBfSU5fUFUsIFBURTBfSU4gfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiUEZDUiIsIDB4YTQwNTAxMGEsIDE2LCAyKSB7CisJCVBURjdfRk4sIFBURjdfT1VULCBQVEY3X0lOX1BVLCBQVEY3X0lOLAorCQlQVEY2X0ZOLCBQVEY2X09VVCwgUFRGNl9JTl9QVSwgUFRGNl9JTiwKKwkJUFRGNV9GTiwgUFRGNV9PVVQsIFBURjVfSU5fUFUsIFBURjVfSU4sCisJCVBURjRfRk4sIFBURjRfT1VULCBQVEY0X0lOX1BVLCBQVEY0X0lOLAorCQlQVEYzX0ZOLCBQVEYzX09VVCwgUFRGM19JTl9QVSwgUFRGM19JTiwKKwkJUFRGMl9GTiwgUFRGMl9PVVQsIFBURjJfSU5fUFUsIFBURjJfSU4sCisJCVBURjFfRk4sIFBURjFfT1VULCBQVEYxX0lOX1BVLCBQVEYxX0lOLAorCQlQVEYwX0ZOLCBQVEYwX09VVCwgUFRGMF9JTl9QVSwgUFRGMF9JTiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQR0NSIiwgMHhhNDA1MDEwYywgMTYsIDIpIHsKKwkJMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCwgMCwKKwkJUFRHNV9GTiwgUFRHNV9PVVQsIDAsIDAsCisJCVBURzRfRk4sIFBURzRfT1VULCAwLCAwLAorCQlQVEczX0ZOLCBQVEczX09VVCwgMCwgMCwKKwkJUFRHMl9GTiwgUFRHMl9PVVQsIDAsIDAsCisJCVBURzFfRk4sIFBURzFfT1VULCAwLCAwLAorCQlQVEcwX0ZOLCBQVEcwX09VVCwgMCwgMCB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQSENSIiwgMHhhNDA1MDEwZSwgMTYsIDIpIHsKKwkJUFRIN19GTiwgUFRIN19PVVQsIFBUSDdfSU5fUFUsIFBUSDdfSU4sCisJCVBUSDZfRk4sIFBUSDZfT1VULCBQVEg2X0lOX1BVLCBQVEg2X0lOLAorCQlQVEg1X0ZOLCBQVEg1X09VVCwgUFRINV9JTl9QVSwgUFRINV9JTiwKKwkJUFRINF9GTiwgUFRINF9PVVQsIFBUSDRfSU5fUFUsIFBUSDRfSU4sCisJCVBUSDNfRk4sIFBUSDNfT1VULCBQVEgzX0lOX1BVLCBQVEgzX0lOLAorCQlQVEgyX0ZOLCBQVEgyX09VVCwgUFRIMl9JTl9QVSwgUFRIMl9JTiwKKwkJUFRIMV9GTiwgUFRIMV9PVVQsIFBUSDFfSU5fUFUsIFBUSDFfSU4sCisJCVBUSDBfRk4sIFBUSDBfT1VULCBQVEgwX0lOX1BVLCBQVEgwX0lOIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBKQ1IiLCAweGE0MDUwMTEwLCAxNiwgMikgeworCQlQVEo3X0ZOLCBQVEo3X09VVCwgMCwgMCwKKwkJUFRKNl9GTiwgUFRKNl9PVVQsIDAsIDAsCisJCVBUSjVfRk4sIFBUSjVfT1VULCAwLCAwLAorCQkwLCAwLCAwLCAwLAorCQlQVEozX0ZOLCBQVEozX09VVCwgUFRKM19JTl9QVSwgUFRKM19JTiwKKwkJUFRKMl9GTiwgUFRKMl9PVVQsIFBUSjJfSU5fUFUsIFBUSjJfSU4sCisJCVBUSjFfRk4sIFBUSjFfT1VULCBQVEoxX0lOX1BVLCBQVEoxX0lOLAorCQlQVEowX0ZOLCBQVEowX09VVCwgUFRKMF9JTl9QVSwgUFRKMF9JTiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQS0NSIiwgMHhhNDA1MDExMiwgMTYsIDIpIHsKKwkJUFRLN19GTiwgUFRLN19PVVQsIFBUSzdfSU5fUFUsIFBUSzdfSU4sCisJCVBUSzZfRk4sIFBUSzZfT1VULCBQVEs2X0lOX1BVLCBQVEs2X0lOLAorCQlQVEs1X0ZOLCBQVEs1X09VVCwgUFRLNV9JTl9QVSwgUFRLNV9JTiwKKwkJUFRLNF9GTiwgUFRLNF9PVVQsIFBUSzRfSU5fUFUsIFBUSzRfSU4sCisJCVBUSzNfRk4sIFBUSzNfT1VULCBQVEszX0lOX1BVLCBQVEszX0lOLAorCQlQVEsyX0ZOLCBQVEsyX09VVCwgUFRLMl9JTl9QVSwgUFRLMl9JTiwKKwkJUFRLMV9GTiwgUFRLMV9PVVQsIFBUSzFfSU5fUFUsIFBUSzFfSU4sCisJCVBUSzBfRk4sIFBUSzBfT1VULCBQVEswX0lOX1BVLCBQVEswX0lOIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBMQ1IiLCAweGE0MDUwMTE0LCAxNiwgMikgeworCQlQVEw3X0ZOLCBQVEw3X09VVCwgUFRMN19JTl9QVSwgUFRMN19JTiwKKwkJUFRMNl9GTiwgUFRMNl9PVVQsIFBUTDZfSU5fUFUsIFBUTDZfSU4sCisJCVBUTDVfRk4sIFBUTDVfT1VULCBQVEw1X0lOX1BVLCBQVEw1X0lOLAorCQlQVEw0X0ZOLCBQVEw0X09VVCwgUFRMNF9JTl9QVSwgUFRMNF9JTiwKKwkJUFRMM19GTiwgUFRMM19PVVQsIFBUTDNfSU5fUFUsIFBUTDNfSU4sCisJCVBUTDJfRk4sIFBUTDJfT1VULCBQVEwyX0lOX1BVLCBQVEwyX0lOLAorCQlQVEwxX0ZOLCBQVEwxX09VVCwgUFRMMV9JTl9QVSwgUFRMMV9JTiwKKwkJUFRMMF9GTiwgUFRMMF9PVVQsIFBUTDBfSU5fUFUsIFBUTDBfSU4gfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiUE1DUiIsIDB4YTQwNTAxMTYsIDE2LCAyKSB7CisJCVBUTTdfRk4sIFBUTTdfT1VULCBQVE03X0lOX1BVLCBQVE03X0lOLAorCQlQVE02X0ZOLCBQVE02X09VVCwgUFRNNl9JTl9QVSwgUFRNNl9JTiwKKwkJUFRNNV9GTiwgUFRNNV9PVVQsIFBUTTVfSU5fUFUsIFBUTTVfSU4sCisJCVBUTTRfRk4sIFBUTTRfT1VULCBQVE00X0lOX1BVLCBQVE00X0lOLAorCQlQVE0zX0ZOLCBQVE0zX09VVCwgUFRNM19JTl9QVSwgUFRNM19JTiwKKwkJUFRNMl9GTiwgUFRNMl9PVVQsIFBUTTJfSU5fUFUsIFBUTTJfSU4sCisJCVBUTTFfRk4sIFBUTTFfT1VULCBQVE0xX0lOX1BVLCBQVE0xX0lOLAorCQlQVE0wX0ZOLCBQVE0wX09VVCwgUFRNMF9JTl9QVSwgUFRNMF9JTiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQTkNSIiwgMHhhNDA1MDExOCwgMTYsIDIpIHsKKwkJUFRON19GTiwgUFRON19PVVQsIFBUTjdfSU5fUFUsIFBUTjdfSU4sCisJCVBUTjZfRk4sIFBUTjZfT1VULCBQVE42X0lOX1BVLCBQVE42X0lOLAorCQlQVE41X0ZOLCBQVE41X09VVCwgUFRONV9JTl9QVSwgUFRONV9JTiwKKwkJUFRONF9GTiwgUFRONF9PVVQsIFBUTjRfSU5fUFUsIFBUTjRfSU4sCisJCVBUTjNfRk4sIFBUTjNfT1VULCBQVE4zX0lOX1BVLCBQVE4zX0lOLAorCQlQVE4yX0ZOLCBQVE4yX09VVCwgUFROMl9JTl9QVSwgUFROMl9JTiwKKwkJUFROMV9GTiwgUFROMV9PVVQsIFBUTjFfSU5fUFUsIFBUTjFfSU4sCisJCVBUTjBfRk4sIFBUTjBfT1VULCBQVE4wX0lOX1BVLCBQVE4wX0lOIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBRQ1IiLCAweGE0MDUwMTFhLCAxNiwgMikgeworCQlQVFE3X0ZOLCBQVFE3X09VVCwgUFRRN19JTl9QVSwgUFRRN19JTiwKKwkJUFRRNl9GTiwgUFRRNl9PVVQsIFBUUTZfSU5fUFUsIFBUUTZfSU4sCisJCVBUUTVfRk4sIFBUUTVfT1VULCBQVFE1X0lOX1BVLCBQVFE1X0lOLAorCQlQVFE0X0ZOLCBQVFE0X09VVCwgUFRRNF9JTl9QVSwgUFRRNF9JTiwKKwkJUFRRM19GTiwgUFRRM19PVVQsIFBUUTNfSU5fUFUsIFBUUTNfSU4sCisJCVBUUTJfRk4sIFBUUTJfT1VULCBQVFEyX0lOX1BVLCBQVFEyX0lOLAorCQlQVFExX0ZOLCBQVFExX09VVCwgUFRRMV9JTl9QVSwgUFRRMV9JTiwKKwkJUFRRMF9GTiwgUFRRMF9PVVQsIFBUUTBfSU5fUFUsIFBUUTBfSU4gfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiUFJDUiIsIDB4YTQwNTAxMWMsIDE2LCAyKSB7CisJCVBUUjdfRk4sIFBUUjdfT1VULCBQVFI3X0lOX1BVLCBQVFI3X0lOLAorCQlQVFI2X0ZOLCBQVFI2X09VVCwgUFRSNl9JTl9QVSwgUFRSNl9JTiwKKwkJUFRSNV9GTiwgUFRSNV9PVVQsIFBUUjVfSU5fUFUsIFBUUjVfSU4sCisJCVBUUjRfRk4sIFBUUjRfT1VULCBQVFI0X0lOX1BVLCBQVFI0X0lOLAorCQlQVFIzX0ZOLCAwLCAgICAgICAgUFRSM19JTl9QVSwgUFRSM19JTiwKKwkJUFRSMl9GTiwgMCwgICAgICAgIFBUUjJfSU5fUFUsIFBUUjJfSU4sCisJCVBUUjFfRk4sIFBUUjFfT1VULCBQVFIxX0lOX1BVLCBQVFIxX0lOLAorCQlQVFIwX0ZOLCBQVFIwX09VVCwgUFRSMF9JTl9QVSwgUFRSMF9JTiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQU0NSIiwgMHhhNDA1MDExZSwgMTYsIDIpIHsKKwkJMCwgMCwgMCwgMCwKKwkJUFRTNl9GTiwgUFRTNl9PVVQsIFBUUzZfSU5fUFUsIFBUUzZfSU4sCisJCVBUUzVfRk4sIFBUUzVfT1VULCBQVFM1X0lOX1BVLCBQVFM1X0lOLAorCQlQVFM0X0ZOLCBQVFM0X09VVCwgUFRTNF9JTl9QVSwgUFRTNF9JTiwKKwkJUFRTM19GTiwgUFRTM19PVVQsIFBUUzNfSU5fUFUsIFBUUzNfSU4sCisJCVBUUzJfRk4sIFBUUzJfT1VULCBQVFMyX0lOX1BVLCBQVFMyX0lOLAorCQlQVFMxX0ZOLCBQVFMxX09VVCwgUFRTMV9JTl9QVSwgUFRTMV9JTiwKKwkJUFRTMF9GTiwgUFRTMF9PVVQsIFBUUzBfSU5fUFUsIFBUUzBfSU4gfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiUFRDUiIsIDB4YTQwNTAxNDAsIDE2LCAyKSB7CisJCVBUVDdfRk4sIFBUVDdfT1VULCBQVFQ3X0lOX1BVLCBQVFQ3X0lOLAorCQlQVFQ2X0ZOLCBQVFQ2X09VVCwgUFRUNl9JTl9QVSwgUFRUNl9JTiwKKwkJUFRUNV9GTiwgUFRUNV9PVVQsIFBUVDVfSU5fUFUsIFBUVDVfSU4sCisJCVBUVDRfRk4sIFBUVDRfT1VULCBQVFQ0X0lOX1BVLCBQVFQ0X0lOLAorCQlQVFQzX0ZOLCBQVFQzX09VVCwgUFRUM19JTl9QVSwgUFRUM19JTiwKKwkJUFRUMl9GTiwgUFRUMl9PVVQsIFBUVDJfSU5fUFUsIFBUVDJfSU4sCisJCVBUVDFfRk4sIFBUVDFfT1VULCBQVFQxX0lOX1BVLCBQVFQxX0lOLAorCQlQVFQwX0ZOLCBQVFQwX09VVCwgUFRUMF9JTl9QVSwgUFRUMF9JTiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQVUNSIiwgMHhhNDA1MDE0MiwgMTYsIDIpIHsKKwkJUFRVN19GTiwgUFRVN19PVVQsIFBUVTdfSU5fUFUsIFBUVTdfSU4sCisJCVBUVTZfRk4sIFBUVTZfT1VULCBQVFU2X0lOX1BVLCBQVFU2X0lOLAorCQlQVFU1X0ZOLCBQVFU1X09VVCwgUFRVNV9JTl9QVSwgUFRVNV9JTiwKKwkJUFRVNF9GTiwgUFRVNF9PVVQsIFBUVTRfSU5fUFUsIFBUVTRfSU4sCisJCVBUVTNfRk4sIFBUVTNfT1VULCBQVFUzX0lOX1BVLCBQVFUzX0lOLAorCQlQVFUyX0ZOLCBQVFUyX09VVCwgUFRVMl9JTl9QVSwgUFRVMl9JTiwKKwkJUFRVMV9GTiwgUFRVMV9PVVQsIFBUVTFfSU5fUFUsIFBUVTFfSU4sCisJCVBUVTBfRk4sIFBUVTBfT1VULCBQVFUwX0lOX1BVLCBQVFUwX0lOIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBWQ1IiLCAweGE0MDUwMTQ0LCAxNiwgMikgeworCQlQVFY3X0ZOLCBQVFY3X09VVCwgUFRWN19JTl9QVSwgUFRWN19JTiwKKwkJUFRWNl9GTiwgUFRWNl9PVVQsIFBUVjZfSU5fUFUsIFBUVjZfSU4sCisJCVBUVjVfRk4sIFBUVjVfT1VULCBQVFY1X0lOX1BVLCBQVFY1X0lOLAorCQlQVFY0X0ZOLCBQVFY0X09VVCwgUFRWNF9JTl9QVSwgUFRWNF9JTiwKKwkJUFRWM19GTiwgUFRWM19PVVQsIFBUVjNfSU5fUFUsIFBUVjNfSU4sCisJCVBUVjJfRk4sIFBUVjJfT1VULCBQVFYyX0lOX1BVLCBQVFYyX0lOLAorCQlQVFYxX0ZOLCBQVFYxX09VVCwgUFRWMV9JTl9QVSwgUFRWMV9JTiwKKwkJUFRWMF9GTiwgUFRWMF9PVVQsIFBUVjBfSU5fUFUsIFBUVjBfSU4gfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiUFdDUiIsIDB4YTQwNTAxNDYsIDE2LCAyKSB7CisJCVBUVzdfRk4sIFBUVzdfT1VULCBQVFc3X0lOX1BVLCBQVFc3X0lOLAorCQlQVFc2X0ZOLCBQVFc2X09VVCwgUFRXNl9JTl9QVSwgUFRXNl9JTiwKKwkJUFRXNV9GTiwgUFRXNV9PVVQsIFBUVzVfSU5fUFUsIFBUVzVfSU4sCisJCVBUVzRfRk4sIFBUVzRfT1VULCBQVFc0X0lOX1BVLCBQVFc0X0lOLAorCQlQVFczX0ZOLCBQVFczX09VVCwgUFRXM19JTl9QVSwgUFRXM19JTiwKKwkJUFRXMl9GTiwgUFRXMl9PVVQsIFBUVzJfSU5fUFUsIFBUVzJfSU4sCisJCVBUVzFfRk4sIFBUVzFfT1VULCBQVFcxX0lOX1BVLCBQVFcxX0lOLAorCQlQVFcwX0ZOLCBQVFcwX09VVCwgUFRXMF9JTl9QVSwgUFRXMF9JTiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQWENSIiwgMHhhNDA1MDE0OCwgMTYsIDIpIHsKKwkJUFRYN19GTiwgUFRYN19PVVQsIFBUWDdfSU5fUFUsIFBUWDdfSU4sCisJCVBUWDZfRk4sIFBUWDZfT1VULCBQVFg2X0lOX1BVLCBQVFg2X0lOLAorCQlQVFg1X0ZOLCBQVFg1X09VVCwgUFRYNV9JTl9QVSwgUFRYNV9JTiwKKwkJUFRYNF9GTiwgUFRYNF9PVVQsIFBUWDRfSU5fUFUsIFBUWDRfSU4sCisJCVBUWDNfRk4sIFBUWDNfT1VULCBQVFgzX0lOX1BVLCBQVFgzX0lOLAorCQlQVFgyX0ZOLCBQVFgyX09VVCwgUFRYMl9JTl9QVSwgUFRYMl9JTiwKKwkJUFRYMV9GTiwgUFRYMV9PVVQsIFBUWDFfSU5fUFUsIFBUWDFfSU4sCisJCVBUWDBfRk4sIFBUWDBfT1VULCBQVFgwX0lOX1BVLCBQVFgwX0lOIH0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBZQ1IiLCAweGE0MDUwMTRhLCAxNiwgMikgeworCQlQVFk3X0ZOLCBQVFk3X09VVCwgUFRZN19JTl9QVSwgUFRZN19JTiwKKwkJUFRZNl9GTiwgUFRZNl9PVVQsIFBUWTZfSU5fUFUsIFBUWTZfSU4sCisJCVBUWTVfRk4sIFBUWTVfT1VULCBQVFk1X0lOX1BVLCBQVFk1X0lOLAorCQlQVFk0X0ZOLCBQVFk0X09VVCwgUFRZNF9JTl9QVSwgUFRZNF9JTiwKKwkJUFRZM19GTiwgUFRZM19PVVQsIFBUWTNfSU5fUFUsIFBUWTNfSU4sCisJCVBUWTJfRk4sIFBUWTJfT1VULCBQVFkyX0lOX1BVLCBQVFkyX0lOLAorCQlQVFkxX0ZOLCBQVFkxX09VVCwgUFRZMV9JTl9QVSwgUFRZMV9JTiwKKwkJUFRZMF9GTiwgUFRZMF9PVVQsIFBUWTBfSU5fUFUsIFBUWTBfSU4gfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiUFpDUiIsIDB4YTQwNTAxNGMsIDE2LCAyKSB7CisJCVBUWjdfRk4sIFBUWjdfT1VULCBQVFo3X0lOX1BVLCBQVFo3X0lOLAorCQlQVFo2X0ZOLCBQVFo2X09VVCwgUFRaNl9JTl9QVSwgUFRaNl9JTiwKKwkJUFRaNV9GTiwgUFRaNV9PVVQsIFBUWjVfSU5fUFUsIFBUWjVfSU4sCisJCVBUWjRfRk4sIFBUWjRfT1VULCBQVFo0X0lOX1BVLCBQVFo0X0lOLAorCQlQVFozX0ZOLCBQVFozX09VVCwgUFRaM19JTl9QVSwgUFRaM19JTiwKKwkJUFRaMl9GTiwgUFRaMl9PVVQsIFBUWjJfSU5fUFUsIFBUWjJfSU4sCisJCVBUWjFfRk4sIFBUWjFfT1VULCBQVFoxX0lOX1BVLCBQVFoxX0lOLAorCQlQVFowX0ZOLCBQVFowX09VVCwgUFRaMF9JTl9QVSwgUFRaMF9JTiB9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQU0VMQSIsIDB4YTQwNTAxNGUsIDE2LCAxKSB7CisJCVBTQTE1XzAsIFBTQTE1XzEsCisJCVBTQTE0XzAsIFBTQTE0XzEsCisJCVBTQTEzXzAsIFBTQTEzXzEsCisJCVBTQTEyXzAsIFBTQTEyXzEsCisJCTAsIDAsCisJCVBTQTEwXzAsIFBTQTEwXzEsCisJCVBTQTlfMCwgIFBTQTlfMSwKKwkJUFNBOF8wLCAgUFNBOF8xLAorCQlQU0E3XzAsICBQU0E3XzEsCisJCVBTQTZfMCwgIFBTQTZfMSwKKwkJUFNBNV8wLCAgUFNBNV8xLAorCQkwLCAwLAorCQlQU0EzXzAsICBQU0EzXzEsCisJCVBTQTJfMCwgIFBTQTJfMSwKKwkJUFNBMV8wLCAgUFNBMV8xLAorCQlQU0EwXzAsICBQU0EwXzF9CisJfSwKKwl7IFBJTk1VWF9DRkdfUkVHKCJQU0VMQiIsIDB4YTQwNTAxNTAsIDE2LCAxKSB7CisJCTAsIDAsCisJCVBTQjE0XzAsIFBTQjE0XzEsCisJCVBTQjEzXzAsIFBTQjEzXzEsCisJCVBTQjEyXzAsIFBTQjEyXzEsCisJCVBTQjExXzAsIFBTQjExXzEsCisJCVBTQjEwXzAsIFBTQjEwXzEsCisJCVBTQjlfMCwgIFBTQjlfMSwKKwkJUFNCOF8wLCAgUFNCOF8xLAorCQlQU0I3XzAsICBQU0I3XzEsCisJCVBTQjZfMCwgIFBTQjZfMSwKKwkJUFNCNV8wLCAgUFNCNV8xLAorCQlQU0I0XzAsICBQU0I0XzEsCisJCVBTQjNfMCwgIFBTQjNfMSwKKwkJUFNCMl8wLCAgUFNCMl8xLAorCQlQU0IxXzAsICBQU0IxXzEsCisJCVBTQjBfMCwgIFBTQjBfMX0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBTRUxDIiwgMHhhNDA1MDE1MiwgMTYsIDEpIHsKKwkJUFNDMTVfMCwgUFNDMTVfMSwKKwkJUFNDMTRfMCwgUFNDMTRfMSwKKwkJUFNDMTNfMCwgUFNDMTNfMSwKKwkJUFNDMTJfMCwgUFNDMTJfMSwKKwkJUFNDMTFfMCwgUFNDMTFfMSwKKwkJUFNDMTBfMCwgUFNDMTBfMSwKKwkJUFNDOV8wLCAgUFNDOV8xLAorCQlQU0M4XzAsICBQU0M4XzEsCisJCVBTQzdfMCwgIFBTQzdfMSwKKwkJUFNDNl8wLCAgUFNDNl8xLAorCQlQU0M1XzAsICBQU0M1XzEsCisJCVBTQzRfMCwgIFBTQzRfMSwKKwkJMCwgMCwKKwkJUFNDMl8wLCAgUFNDMl8xLAorCQlQU0MxXzAsICBQU0MxXzEsCisJCVBTQzBfMCwgIFBTQzBfMX0KKwl9LAorCXsgUElOTVVYX0NGR19SRUcoIlBTRUxEIiwgMHhhNDA1MDE1NCwgMTYsIDEpIHsKKwkJUFNEMTVfMCwgUFNEMTVfMSwKKwkJUFNEMTRfMCwgUFNEMTRfMSwKKwkJUFNEMTNfMCwgUFNEMTNfMSwKKwkJUFNEMTJfMCwgUFNEMTJfMSwKKwkJUFNEMTFfMCwgUFNEMTFfMSwKKwkJUFNEMTBfMCwgUFNEMTBfMSwKKwkJUFNEOV8wLCAgUFNEOV8xLAorCQlQU0Q4XzAsICBQU0Q4XzEsCisJCVBTRDdfMCwgIFBTRDdfMSwKKwkJUFNENl8wLCAgUFNENl8xLAorCQlQU0Q1XzAsICBQU0Q1XzEsCisJCVBTRDRfMCwgIFBTRDRfMSwKKwkJUFNEM18wLCAgUFNEM18xLAorCQlQU0QyXzAsICBQU0QyXzEsCisJCVBTRDFfMCwgIFBTRDFfMSwKKwkJUFNEMF8wLCAgUFNEMF8xfQorCX0sCisJeyBQSU5NVVhfQ0ZHX1JFRygiUFNFTEUiLCAweGE0MDUwMTU2LCAxNiwgMSkgeworCQlQU0UxNV8wLCBQU0UxNV8xLAorCQlQU0UxNF8wLCBQU0UxNF8xLAorCQlQU0UxM18wLCBQU0UxM18xLAorCQlQU0UxMl8wLCBQU0UxMl8xLAorCQlQU0UxMV8wLCBQU0UxMV8xLAorCQlQU0UxMF8wLCBQU0UxMF8xLAorCQlQU0U5XzAsICBQU0U5XzEsCisJCVBTRThfMCwgIFBTRThfMSwKKwkJUFNFN18wLCAgUFNFN18xLAorCQlQU0U2XzAsICBQU0U2XzEsCisJCVBTRTVfMCwgIFBTRTVfMSwKKwkJUFNFNF8wLCAgUFNFNF8xLAorCQlQU0UzXzAsICBQU0UzXzEsCisJCVBTRTJfMCwgIFBTRTJfMSwKKwkJUFNFMV8wLCAgUFNFMV8xLAorCQlQU0UwXzAsICBQU0UwXzF9CisJfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwaW5tdXhfZGF0YV9yZWcgcGlubXV4X2RhdGFfcmVnc1tdID0geworCXsgUElOTVVYX0RBVEFfUkVHKCJQQURSIiwgMHhhNDA1MDEyMCwgOCkgeworCQlQVEE3X0RBVEEsIFBUQTZfREFUQSwgUFRBNV9EQVRBLCBQVEE0X0RBVEEsCisJCVBUQTNfREFUQSwgUFRBMl9EQVRBLCBQVEExX0RBVEEsIFBUQTBfREFUQSB9CisJfSwKKwl7IFBJTk1VWF9EQVRBX1JFRygiUEJEUiIsIDB4YTQwNTAxMjIsIDgpIHsKKwkJUFRCN19EQVRBLCBQVEI2X0RBVEEsIFBUQjVfREFUQSwgUFRCNF9EQVRBLAorCQlQVEIzX0RBVEEsIFBUQjJfREFUQSwgUFRCMV9EQVRBLCBQVEIwX0RBVEEgfQorCX0sCisJeyBQSU5NVVhfREFUQV9SRUcoIlBDRFIiLCAweGE0MDUwMTI0LCA4KSB7CisJCVBUQzdfREFUQSwgUFRDNl9EQVRBLCBQVEM1X0RBVEEsIFBUQzRfREFUQSwKKwkJUFRDM19EQVRBLCBQVEMyX0RBVEEsIFBUQzFfREFUQSwgUFRDMF9EQVRBIH0KKwl9LAorCXsgUElOTVVYX0RBVEFfUkVHKCJQRERSIiwgMHhhNDA1MDEyNiwgOCkgeworCQlQVEQ3X0RBVEEsIFBURDZfREFUQSwgUFRENV9EQVRBLCBQVEQ0X0RBVEEsCisJCVBURDNfREFUQSwgUFREMl9EQVRBLCBQVEQxX0RBVEEsIFBURDBfREFUQSB9CisJfSwKKwl7IFBJTk1VWF9EQVRBX1JFRygiUEVEUiIsIDB4YTQwNTAxMjgsIDgpIHsKKwkJUFRFN19EQVRBLCBQVEU2X0RBVEEsIFBURTVfREFUQSwgUFRFNF9EQVRBLAorCQlQVEUzX0RBVEEsIFBURTJfREFUQSwgUFRFMV9EQVRBLCBQVEUwX0RBVEEgfQorCX0sCisJeyBQSU5NVVhfREFUQV9SRUcoIlBGRFIiLCAweGE0MDUwMTJhLCA4KSB7CisJCVBURjdfREFUQSwgUFRGNl9EQVRBLCBQVEY1X0RBVEEsIFBURjRfREFUQSwKKwkJUFRGM19EQVRBLCBQVEYyX0RBVEEsIFBURjFfREFUQSwgUFRGMF9EQVRBIH0KKwl9LAorCXsgUElOTVVYX0RBVEFfUkVHKCJQR0RSIiwgMHhhNDA1MDEyYywgOCkgeworCQkwLCAgICAgICAgIDAsICAgICAgICAgUFRHNV9EQVRBLCBQVEc0X0RBVEEsCisJCVBURzNfREFUQSwgUFRHMl9EQVRBLCBQVEcxX0RBVEEsIFBURzBfREFUQSB9CisJfSwKKwl7IFBJTk1VWF9EQVRBX1JFRygiUEhEUiIsIDB4YTQwNTAxMmUsIDgpIHsKKwkJUFRIN19EQVRBLCBQVEg2X0RBVEEsIFBUSDVfREFUQSwgUFRINF9EQVRBLAorCQlQVEgzX0RBVEEsIFBUSDJfREFUQSwgUFRIMV9EQVRBLCBQVEgwX0RBVEEgfQorCX0sCisJeyBQSU5NVVhfREFUQV9SRUcoIlBKRFIiLCAweGE0MDUwMTMwLCA4KSB7CisJCVBUSjdfREFUQSwgUFRKNl9EQVRBLCBQVEo1X0RBVEEsIDAsCisJCVBUSjNfREFUQSwgUFRKMl9EQVRBLCBQVEoxX0RBVEEsIFBUSjBfREFUQSB9CisJfSwKKwl7IFBJTk1VWF9EQVRBX1JFRygiUEtEUiIsIDB4YTQwNTAxMzIsIDgpIHsKKwkJUFRLN19EQVRBLCBQVEs2X0RBVEEsIFBUSzVfREFUQSwgUFRLNF9EQVRBLAorCQlQVEszX0RBVEEsIFBUSzJfREFUQSwgUFRLMV9EQVRBLCBQVEswX0RBVEEgfQorCX0sCisJeyBQSU5NVVhfREFUQV9SRUcoIlBMRFIiLCAweGE0MDUwMTM0LCA4KSB7CisJCVBUTDdfREFUQSwgUFRMNl9EQVRBLCBQVEw1X0RBVEEsIFBUTDRfREFUQSwKKwkJUFRMM19EQVRBLCBQVEwyX0RBVEEsIFBUTDFfREFUQSwgUFRMMF9EQVRBIH0KKwl9LAorCXsgUElOTVVYX0RBVEFfUkVHKCJQTURSIiwgMHhhNDA1MDEzNiwgOCkgeworCQlQVE03X0RBVEEsIFBUTTZfREFUQSwgUFRNNV9EQVRBLCBQVE00X0RBVEEsCisJCVBUTTNfREFUQSwgUFRNMl9EQVRBLCBQVE0xX0RBVEEsIFBUTTBfREFUQSB9CisJfSwKKwl7IFBJTk1VWF9EQVRBX1JFRygiUE5EUiIsIDB4YTQwNTAxMzgsIDgpIHsKKwkJUFRON19EQVRBLCBQVE42X0RBVEEsIFBUTjVfREFUQSwgUFRONF9EQVRBLAorCQlQVE4zX0RBVEEsIFBUTjJfREFUQSwgUFROMV9EQVRBLCBQVE4wX0RBVEEgfQorCX0sCisJeyBQSU5NVVhfREFUQV9SRUcoIlBRRFIiLCAweGE0MDUwMTNhLCA4KSB7CisJCVBUUTdfREFUQSwgUFRRNl9EQVRBLCBQVFE1X0RBVEEsIFBUUTRfREFUQSwKKwkJUFRRM19EQVRBLCBQVFEyX0RBVEEsIFBUUTFfREFUQSwgUFRRMF9EQVRBIH0KKwl9LAorCXsgUElOTVVYX0RBVEFfUkVHKCJQUkRSIiwgMHhhNDA1MDEzYywgOCkgeworCQlQVFI3X0RBVEEsIFBUUjZfREFUQSwgUFRSNV9EQVRBLCBQVFI0X0RBVEEsCisJCVBUUjNfREFUQSwgUFRSMl9EQVRBLCBQVFIxX0RBVEEsIFBUUjBfREFUQSB9CisJfSwKKwl7IFBJTk1VWF9EQVRBX1JFRygiUFNEUiIsIDB4YTQwNTAxM2UsIDgpIHsKKwkJMCwgICAgICAgICBQVFM2X0RBVEEsIFBUUzVfREFUQSwgUFRTNF9EQVRBLAorCQlQVFMzX0RBVEEsIFBUUzJfREFUQSwgUFRTMV9EQVRBLCBQVFMwX0RBVEEgfQorCX0sCisJeyBQSU5NVVhfREFUQV9SRUcoIlBURFIiLCAweGE0MDUwMTYwLCA4KSB7CisJCVBUVDdfREFUQSwgUFRUNl9EQVRBLCBQVFQ1X0RBVEEsIFBUVDRfREFUQSwKKwkJUFRUM19EQVRBLCBQVFQyX0RBVEEsIFBUVDFfREFUQSwgUFRUMF9EQVRBIH0KKwl9LAorCXsgUElOTVVYX0RBVEFfUkVHKCJQVURSIiwgMHhhNDA1MDE2MiwgOCkgeworCQlQVFU3X0RBVEEsIFBUVTZfREFUQSwgUFRVNV9EQVRBLCBQVFU0X0RBVEEsCisJCVBUVTNfREFUQSwgUFRVMl9EQVRBLCBQVFUxX0RBVEEsIFBUVTBfREFUQSB9CisJfSwKKwl7IFBJTk1VWF9EQVRBX1JFRygiUFZEUiIsIDB4YTQwNTAxNjQsIDgpIHsKKwkJUFRWN19EQVRBLCBQVFY2X0RBVEEsIFBUVjVfREFUQSwgUFRWNF9EQVRBLAorCQlQVFYzX0RBVEEsIFBUVjJfREFUQSwgUFRWMV9EQVRBLCBQVFYwX0RBVEEgfQorCX0sCisJeyBQSU5NVVhfREFUQV9SRUcoIlBXRFIiLCAweGE0MDUwMTY2LCA4KSB7CisJCVBUVzdfREFUQSwgUFRXNl9EQVRBLCBQVFc1X0RBVEEsIFBUVzRfREFUQSwKKwkJUFRXM19EQVRBLCBQVFcyX0RBVEEsIFBUVzFfREFUQSwgUFRXMF9EQVRBIH0KKwl9LAorCXsgUElOTVVYX0RBVEFfUkVHKCJQWERSIiwgMHhhNDA1MDE2OCwgOCkgeworCQlQVFg3X0RBVEEsIFBUWDZfREFUQSwgUFRYNV9EQVRBLCBQVFg0X0RBVEEsCisJCVBUWDNfREFUQSwgUFRYMl9EQVRBLCBQVFgxX0RBVEEsIFBUWDBfREFUQSB9CisJfSwKKwl7IFBJTk1VWF9EQVRBX1JFRygiUFlEUiIsIDB4YTQwNTAxNmEsIDgpIHsKKwkJUFRZN19EQVRBLCBQVFk2X0RBVEEsIFBUWTVfREFUQSwgUFRZNF9EQVRBLAorCQlQVFkzX0RBVEEsIFBUWTJfREFUQSwgUFRZMV9EQVRBLCBQVFkwX0RBVEEgfQorCX0sCisJeyBQSU5NVVhfREFUQV9SRUcoIlBaRFIiLCAweGE0MDUwMTZjLCA4KSB7CisJCVBUWjdfREFUQSwgUFRaNl9EQVRBLCBQVFo1X0RBVEEsIFBUWjRfREFUQSwKKwkJUFRaM19EQVRBLCBQVFoyX0RBVEEsIFBUWjFfREFUQSwgUFRaMF9EQVRBIH0KKwl9LAorCXsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGlubXV4X2luZm8gc2g3NzI0X3Bpbm11eF9pbmZvID0geworCS5uYW1lID0gInNoNzcyNF9wZmMiLAorCS5yZXNlcnZlZF9pZCA9IFBJTk1VWF9SRVNFUlZFRCwKKwkuZGF0YSA9IHsgUElOTVVYX0RBVEFfQkVHSU4sIFBJTk1VWF9EQVRBX0VORCB9LAorCS5pbnB1dCA9IHsgUElOTVVYX0lOUFVUX0JFR0lOLCBQSU5NVVhfSU5QVVRfRU5EIH0sCisJLmlucHV0X3B1ID0geyBQSU5NVVhfSU5QVVRfUFVMTFVQX0JFR0lOLCBQSU5NVVhfSU5QVVRfUFVMTFVQX0VORCB9LAorCS5vdXRwdXQgPSB7IFBJTk1VWF9PVVRQVVRfQkVHSU4sIFBJTk1VWF9PVVRQVVRfRU5EIH0sCisJLm1hcmsgPSB7IFBJTk1VWF9NQVJLX0JFR0lOLCBQSU5NVVhfTUFSS19FTkQgfSwKKwkuZnVuY3Rpb24gPSB7IFBJTk1VWF9GVU5DVElPTl9CRUdJTiwgUElOTVVYX0ZVTkNUSU9OX0VORCB9LAorCisJLmZpcnN0X2dwaW8gPSBHUElPX1BUQTcsCisJLmxhc3RfZ3BpbyA9IEdQSU9fRk5fSU5UQ19JUlEwLAorCisJLmdwaW9zID0gcGlubXV4X2dwaW9zLAorCS5jZmdfcmVncyA9IHBpbm11eF9jb25maWdfcmVncywKKwkuZGF0YV9yZWdzID0gcGlubXV4X2RhdGFfcmVncywKKworCS5ncGlvX2RhdGEgPSBwaW5tdXhfZGF0YSwKKwkuZ3Bpb19kYXRhX3NpemUgPSBBUlJBWV9TSVpFKHBpbm11eF9kYXRhKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBsYXRfcGlubXV4X3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3Bpbm11eCgmc2g3NzI0X3Bpbm11eF9pbmZvKTsKK30KK2FyY2hfaW5pdGNhbGwocGxhdF9waW5tdXhfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzQzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNDMuYwppbmRleCBjMTU0OTM4Li42MzA3ZTA4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNDMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNDMuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KICNpbmNsdWRlIDxsaW51eC91aW9fZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2hfY210Lmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpaWMwX3Jlc291cmNlc1tdID0gewpAQCAtMTQxLDcgKzE0MSw3IEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGpwdV9yZXNvdXJjZXMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzaF9jbXRfY29uZmlnIGNtdF9wbGF0Zm9ybV9kYXRhID0geworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgY210X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm5hbWUgPSAiQ01UIiwKIAkuY2hhbm5lbF9vZmZzZXQgPSAweDYwLAogCS50aW1lcl9iaXQgPSA1LApAQCAtMTczLDI3ICsxNzMsMTIzIEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdF9yZXNvdXJjZXMpLAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJ0bXUwIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAwOCwKKwkJLmVuZAk9IDB4ZmZkODAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInRtdTAiLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUxIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAxNCwKKwkJLmVuZAk9IDB4ZmZkODAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUyX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInRtdTAiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMiIsCisJCS5zdGFydAk9IDB4ZmZkODAwMjAsCisJCS5lbmQJPSAweGZmZDgwMDJiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUyX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUyX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11Ml9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCQkuaXJxcwkJPSB7IDgwLCA4MCwgODAsIDgwIH0sCisJCS5jbGsJCT0gInNjaWYwIiwKIAl9LCB7CiAJCS5tYXBiYXNlCT0gMHhmZmUxMDAwMCwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkudHlwZQkJPSBQT1JUX1NDSUYsCiAJCS5pcnFzCQk9IHsgODEsIDgxLCA4MSwgODEgfSwKKwkJLmNsawkJPSAic2NpZjEiLAogCX0sIHsKIAkJLm1hcGJhc2UJPSAweGZmZTIwMDAwLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkJLmlycXMJCT0geyA4MiwgODIsIDgyLCA4MiB9LAorCQkuY2xrCQk9ICJzY2lmMiIsCiAJfSwgewogCQkubWFwYmFzZQk9IDB4ZmZlMzAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCQkuaXJxcwkJPSB7IDgzLCA4MywgODMsIDgzIH0sCisJCS5jbGsJCT0gInNjaWYzIiwKIAl9LCB7CiAJCS5mbGFncyA9IDAsCiAJfQpAQCAtMjA5LDYgKzMwNSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDczNDNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmNtdF9kZXZpY2UsCisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCiAJJmlpYzBfZGV2aWNlLAogCSZpaWMxX2RldmljZSwKIAkmc2NpX2RldmljZSwKQEAgLTIxOSwxMiArMzE4LDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2g3MzQzX2RldmljZXNfc2V0dXAodm9pZCkKIHsKLQljbGtfYWx3YXlzX2VuYWJsZSgidXJhbTAiKTsgLyogVVJBTSAqLwotCWNsa19hbHdheXNfZW5hYmxlKCJ4eW1lbTAiKTsgLyogWFlNRU0gKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgidmV1MCIpOyAvKiBWRVUgKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgidnB1MCIpOyAvKiBWUFUgKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgianB1MCIpOyAvKiBKUFUgKi8KLQogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdnB1X2RldmljZSwgInZwdSIsIDEgPDwgMjApOwogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdmV1X2RldmljZSwgInZldSIsIDIgPDwgMjApOwogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmanB1X2RldmljZSwgImpwdSIsIDIgPDwgMjApOwpAQCAtMjM0LDYgKzMyNywxOSBAQAogfQogX19pbml0Y2FsbChzaDczNDNfZGV2aWNlc19zZXR1cCk7CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDczNDNfZWFybHlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmNtdF9kZXZpY2UsCisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCit9OworCit2b2lkIF9faW5pdCBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQoreworCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzM0M19lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2g3MzQzX2Vhcmx5X2RldmljZXMpKTsKK30KKwogZW51bSB7CiAJVU5VU0VEID0gMCwKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzY2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNjYuYwppbmRleCA5M2VjZjhlLi4zMTg1MTZmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNjYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDczNjYuYwpAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KICNpbmNsdWRlIDxsaW51eC91aW9fZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2hfY210Lmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KICNpbmNsdWRlIDxhc20vY2xvY2suaD4KIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpaWNfcmVzb3VyY2VzW10gPSB7CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodmV1MV9yZXNvdXJjZXMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzaF9jbXRfY29uZmlnIGNtdF9wbGF0Zm9ybV9kYXRhID0geworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgY210X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm5hbWUgPSAiQ01UIiwKIAkuY2hhbm5lbF9vZmZzZXQgPSAweDYwLAogCS50aW1lcl9iaXQgPSA1LApAQCAtMTgwLDEyICsxODAsMTA1IEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdF9yZXNvdXJjZXMpLAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJ0bXUwIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAwOCwKKwkJLmVuZAk9IDB4ZmZkODAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInRtdTAiLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUxIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAxNCwKKwkJLmVuZAk9IDB4ZmZkODAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUyX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInRtdTAiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMiIsCisJCS5zdGFydAk9IDB4ZmZkODAwMjAsCisJCS5lbmQJPSAweGZmZDgwMDJiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUyX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUyX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11Ml9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCQkuaXJxcwkJPSB7IDgwLCA4MCwgODAsIDgwIH0sCisJCS5jbGsJCT0gInNjaWYwIiwKIAl9LCB7CiAJCS5mbGFncyA9IDAsCiAJfQpAQCAtMjAxLDYgKzI5NCw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDczNjZfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJmNtdF9kZXZpY2UsCisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCiAJJmlpY19kZXZpY2UsCiAJJnNjaV9kZXZpY2UsCiAJJnVzYl9ob3N0X2RldmljZSwKQEAgLTIxMSwxMiArMzA3LDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2g3MzY2X2RldmljZXNfc2V0dXAodm9pZCkKIHsKLQljbGtfYWx3YXlzX2VuYWJsZSgicnNtZW0wIik7IC8qIFJTTUVNICovCi0JY2xrX2Fsd2F5c19lbmFibGUoInh5bWVtMCIpOyAvKiBYWU1FTSAqLwotCWNsa19hbHdheXNfZW5hYmxlKCJ2ZXUxIik7IC8qIFZFVS0yICovCi0JY2xrX2Fsd2F5c19lbmFibGUoInZldTAiKTsgLyogVkVVLTEgKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgidnB1MCIpOyAvKiBWUFUgKi8KLQogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdnB1X2RldmljZSwgInZwdSIsIDIgPDwgMjApOwogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdmV1MF9kZXZpY2UsICJ2ZXUwIiwgMiA8PCAyMCk7CiAJcGxhdGZvcm1fcmVzb3VyY2Vfc2V0dXBfbWVtb3J5KCZ2ZXUxX2RldmljZSwgInZldTEiLCAyIDw8IDIwKTsKQEAgLTIyNiw2ICszMTYsMTkgQEAKIH0KIF9faW5pdGNhbGwoc2g3MzY2X2RldmljZXNfc2V0dXApOwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3MzY2X2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZjbXRfZGV2aWNlLAorCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorfTsKKwordm9pZCBfX2luaXQgcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAodm9pZCkKK3sKKwllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDczNjZfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzM2Nl9lYXJseV9kZXZpY2VzKSk7Cit9CisKIGVudW0gewogCVVOVVNFRD0wLAogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCmluZGV4IDQwNjc0N2YuLmVhNTI0YTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvX2RyaXZlci5oPgotI2luY2x1ZGUgPGxpbnV4L3NoX2NtdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL21tem9uZS5oPgogCkBAIC0xNzcsMTMgKzE3NywxMyBAQAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShqcHVfcmVzb3VyY2VzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc2hfY210X2NvbmZpZyBjbXRfcGxhdGZvcm1fZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIGNtdF9wbGF0Zm9ybV9kYXRhID0gewogCS5uYW1lID0gIkNNVCIsCiAJLmNoYW5uZWxfb2Zmc2V0ID0gMHg2MCwKIAkudGltZXJfYml0ID0gNSwKIAkuY2xrID0gImNtdDAiLAogCS5jbG9ja2V2ZW50X3JhdGluZyA9IDEyNSwKLQkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMjAwLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAxMjUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGNtdF9yZXNvdXJjZXNbXSA9IHsKQEAgLTIwOSwyNCArMjA5LDExOSBAQAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjbXRfcmVzb3VyY2VzKSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTBfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUwIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDA0LAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAidG11MCIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMCIsCisJCS5zdGFydAk9IDB4ZmZkODAwMDgsCisJCS5lbmQJPSAweGZmZDgwMDEzLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUwX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTEiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MTAsCisJLnRpbWVyX2JpdCA9IDEsCisJLmNsayA9ICJ0bXUwIiwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMSIsCisJCS5zdGFydAk9IDB4ZmZkODAwMTQsCisJCS5lbmQJPSAweGZmZDgwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11Ml9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTIiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJ0bXUwIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11Ml9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTIiLAorCQkuc3RhcnQJPSAweGZmZDgwMDIwLAorCQkuZW5kCT0gMHhmZmQ4MDAyYiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE4LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11Ml9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11Ml9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11Ml9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTJfcmVzb3VyY2VzKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKIAkJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkJLmlycXMJCT0geyA4MCwgODAsIDgwLCA4MCB9LAorCQkuY2xrCQk9ICJzY2lmMCIsCiAJfSwKIAl7CiAJCS5tYXBiYXNlCT0gMHhmZmUxMDAwMCwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkudHlwZQkJPSBQT1JUX1NDSUYsCiAJCS5pcnFzCQk9IHsgODEsIDgxLCA4MSwgODEgfSwKKwkJLmNsawkJPSAic2NpZjEiLAogCX0sCiAJewogCQkubWFwYmFzZQk9IDB4ZmZlMjAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCQkuaXJxcwkJPSB7IDgyLCA4MiwgODIsIDgyIH0sCisJCS5jbGsJCT0gInNjaWYyIiwKIAl9LAogCXsKIAkJLmZsYWdzID0gMCwKQEAgLTI0Myw2ICszMzgsOSBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzIyX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZjbXRfZGV2aWNlLAorCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAogCSZydGNfZGV2aWNlLAogCSZ1c2JmX2RldmljZSwKIAkmaWljX2RldmljZSwKQEAgLTI1NCwxMiArMzUyLDYgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2g3NzIyX2RldmljZXNfc2V0dXAodm9pZCkKIHsKLQljbGtfYWx3YXlzX2VuYWJsZSgidXJhbTAiKTsgLyogVVJBTSAqLwotCWNsa19hbHdheXNfZW5hYmxlKCJ4eW1lbTAiKTsgLyogWFlNRU0gKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgidmV1MCIpOyAvKiBWRVUgKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgidnB1MCIpOyAvKiBWUFUgKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgianB1MCIpOyAvKiBKUFUgKi8KLQogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdnB1X2RldmljZSwgInZwdSIsIDEgPDwgMjApOwogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdmV1X2RldmljZSwgInZldSIsIDIgPDwgMjApOwogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmanB1X2RldmljZSwgImpwdSIsIDIgPDwgMjApOwpAQCAtMjY5LDYgKzM2MSwxOSBAQAogfQogX19pbml0Y2FsbChzaDc3MjJfZGV2aWNlc19zZXR1cCk7CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MjJfZWFybHlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmNtdF9kZXZpY2UsCisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCit9OworCit2b2lkIF9faW5pdCBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQoreworCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzcyMl9lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2g3NzIyX2Vhcmx5X2RldmljZXMpKTsKK30KKwogZW51bSB7CiAJVU5VU0VEPTAsCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKaW5kZXggYTgwMDQ2Ni4uZDhmNGExMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKQEAgLTEzLDcgKzEzLDggQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KICNpbmNsdWRlIDxsaW51eC91aW9fZHJpdmVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2hfY210Lmg+CisjaW5jbHVkZSA8bGludXgvc2hfdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KIApAQCAtMTAxLDEzICsxMDIsMTMgQEAKIAkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodmV1MV9yZXNvdXJjZXMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBzaF9jbXRfY29uZmlnIGNtdF9wbGF0Zm9ybV9kYXRhID0geworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgY210X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm5hbWUgPSAiQ01UIiwKIAkuY2hhbm5lbF9vZmZzZXQgPSAweDYwLAogCS50aW1lcl9iaXQgPSA1LAogCS5jbGsgPSAiY210MCIsCiAJLmNsb2NrZXZlbnRfcmF0aW5nID0gMTI1LAotCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCisJLmNsb2Nrc291cmNlX3JhdGluZyA9IDEyNSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY210X3Jlc291cmNlc1tdID0gewpAQCAtMTMzLDM3ICsxMzQsMjI1IEBACiAJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGNtdF9yZXNvdXJjZXMpLAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJ0bXUwIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAwOCwKKwkJLmVuZAk9IDB4ZmZkODAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInRtdTAiLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUxIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAxNCwKKwkJLmVuZAk9IDB4ZmZkODAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUyX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInRtdTAiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMiIsCisJCS5zdGFydAk9IDB4ZmZkODAwMjAsCisJCS5lbmQJPSAweGZmZDgwMDJiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUyX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUyX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11Ml9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11M19wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTMiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJ0bXUxIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11M19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTMiLAorCQkuc3RhcnQJPSAweGZmZDkwMDA4LAorCQkuZW5kCT0gMHhmZmQ5MDAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDU3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11M19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11M19wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11M19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTNfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVU0IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAidG11MSIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU0IiwKKwkJLnN0YXJ0CT0gMHhmZmQ5MDAxNCwKKwkJLmVuZAk9IDB4ZmZkOTAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA1OCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTRfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA0LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTRfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTRfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU0X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXU1X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VNSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInRtdTEiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU1X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VNSIsCisJCS5zdGFydAk9IDB4ZmZkOTAwMjAsCisJCS5lbmQJPSAweGZmZDkwMDJiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gNTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU1X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gNSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU1X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU1X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11NV9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZSAgICAgICAgPSAweGZmZTAwMDAwLAogCQkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCQkuaXJxcyAgICAgICAgICAgPSB7IDgwLCA4MCwgODAsIDgwIH0sCisJCS5jbGsJCT0gInNjaWYwIiwKIAl9LHsKIAkJLm1hcGJhc2UgICAgICAgID0gMHhmZmUxMDAwMCwKIAkJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAorCQkuY2xrCQk9ICJzY2lmMSIsCiAJfSx7CiAJCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMjAwMDAsCiAJCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCQkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJCS5pcnFzICAgICAgICAgICA9IHsgODIsIDgyLCA4MiwgODIgfSwKKwkJLmNsawkJPSAic2NpZjIiLAogCX0sewogCQkubWFwYmFzZQk9IDB4YTRlMzAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0lGQSwKIAkJLmlycXMJCT0geyA1NiwgNTYsIDU2LCA1NiB9LAorCQkuY2xrCQk9ICJzY2lmMyIsCiAJfSx7CiAJCS5tYXBiYXNlCT0gMHhhNGU0MDAwMCwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkudHlwZQkJPSBQT1JUX1NDSUZBLAogCQkuaXJxcwkJPSB7IDg4LCA4OCwgODgsIDg4IH0sCisJCS5jbGsJCT0gInNjaWY0IiwKIAl9LHsKIAkJLm1hcGJhc2UJPSAweGE0ZTUwMDAwLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS50eXBlCQk9IFBPUlRfU0NJRkEsCiAJCS5pcnFzCQk9IHsgMTA5LCAxMDksIDEwOSwgMTA5IH0sCisJCS5jbGsJCT0gInNjaWY1IiwKIAl9LCB7CiAJCS5mbGFncyA9IDAsCiAJfQpAQCAtMjU1LDYgKzQ0NCwxMiBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzIzX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZjbXRfZGV2aWNlLAorCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorCSZ0bXUzX2RldmljZSwKKwkmdG11NF9kZXZpY2UsCisJJnRtdTVfZGV2aWNlLAogCSZzY2lfZGV2aWNlLAogCSZydGNfZGV2aWNlLAogCSZpaWNfZGV2aWNlLApAQCAtMjY2LDExICs0NjEsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3MjNfZGV2aWNlc19zZXR1cCh2b2lkKQogewotCWNsa19hbHdheXNfZW5hYmxlKCJtZXJhbTAiKTsgLyogTUVSQU0gKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgidmV1MSIpOyAvKiBWRVUySDEgKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgidmV1MCIpOyAvKiBWRVUySDAgKi8KLQljbGtfYWx3YXlzX2VuYWJsZSgidnB1MCIpOyAvKiBWUFUgKi8KLQogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdnB1X2RldmljZSwgInZwdSIsIDIgPDwgMjApOwogCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdmV1MF9kZXZpY2UsICJ2ZXUwIiwgMiA8PCAyMCk7CiAJcGxhdGZvcm1fcmVzb3VyY2Vfc2V0dXBfbWVtb3J5KCZ2ZXUxX2RldmljZSwgInZldTEiLCAyIDw8IDIwKTsKQEAgLTI4MCw2ICs0NzAsMzEgQEAKIH0KIF9faW5pdGNhbGwoc2g3NzIzX2RldmljZXNfc2V0dXApOwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzIzX2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZjbXRfZGV2aWNlLAorCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorCSZ0bXUzX2RldmljZSwKKwkmdG11NF9kZXZpY2UsCisJJnRtdTVfZGV2aWNlLAorfTsKKwordm9pZCBfX2luaXQgcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAodm9pZCkKK3sKKwllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3MjNfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzcyM19lYXJseV9kZXZpY2VzKSk7Cit9CisKKyNkZWZpbmUgUkFNQ1JfQ0FDSEVfTDJGQwkweDAwMDIKKyNkZWZpbmUgUkFNQ1JfQ0FDSEVfTDJFCQkweDAwMDEKKyNkZWZpbmUgTDJfQ0FDSEVfRU5BQkxFCQkoUkFNQ1JfQ0FDSEVfTDJFfFJBTUNSX0NBQ0hFX0wyRkMpCit2b2lkIF9fdXNlc19qdW1wX3RvX3VuY2FjaGVkIGwyX2NhY2hlX2luaXQodm9pZCkKK3sKKwkvKiBFbmFibGUgTDIgY2FjaGUgKi8KKwljdHJsX291dGwoTDJfQ0FDSEVfRU5BQkxFLCBSQU1DUik7Cit9CisKIGVudW0gewogCVVOVVNFRD0wLAogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YWM5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3MjQuYwpAQCAtMCwwICsxLDc4NiBAQAorLyoKKyAqIFNINzcyNCBTZXR1cAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICoKKyAqIEt1bmlub3JpIE1vcmltb3RvIDxtb3JpbW90by5rdW5pbm9yaUByZW5lc2FzLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBTSDc3MjMgU2V0dXAKKyAqIENvcHlyaWdodCAoQykgMjAwOCAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpb19kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXNtL21tem9uZS5oPgorCisvKiBTZXJpYWwgKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UgICAgICAgID0gMHhmZmUwMDAwMCwKKwkJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKKwkJLmlycXMgICAgICAgICAgID0geyA4MCwgODAsIDgwLCA4MCB9LAorCQkuY2xrCQk9ICJzY2lmMCIsCisJfSwgeworCQkubWFwYmFzZSAgICAgICAgPSAweGZmZTEwMDAwLAorCQkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAorCQkuaXJxcyAgICAgICAgICAgPSB7IDgxLCA4MSwgODEsIDgxIH0sCisJCS5jbGsJCT0gInNjaWYxIiwKKwl9LCB7CisJCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMjAwMDAsCisJCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCisJCS5pcnFzICAgICAgICAgICA9IHsgODIsIDgyLCA4MiwgODIgfSwKKwkJLmNsawkJPSAic2NpZjIiLAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGE0ZTMwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRkEsCisJCS5pcnFzCQk9IHsgNTYsIDU2LCA1NiwgNTYgfSwKKwkJLmNsawkJPSAic2NpZjMiLAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGE0ZTQwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRkEsCisJCS5pcnFzCQk9IHsgODgsIDg4LCA4OCwgODggfSwKKwkJLmNsawkJPSAic2NpZjQiLAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGE0ZTUwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRkEsCisJCS5pcnFzCQk9IHsgMTA5LCAxMDksIDEwOSwgMTA5IH0sCisJCS5jbGsJCT0gInNjaWY1IiwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKKy8qIFJUQyAqLworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBydGNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGE0NjVmZWMwLAorCQkuZW5kCT0gMHhhNDY1ZmVjMCArIDB4NTggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPLAorCX0sCisJWzFdID0geworCQkvKiBQZXJpb2QgSVJRICovCisJCS5zdGFydAk9IDY5LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVsyXSA9IHsKKwkJLyogQ2FycnkgSVJRICovCisJCS5zdGFydAk9IDcwLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9IHsKKwkJLyogQWxhcm0gSVJRICovCisJCS5zdGFydAk9IDY4LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgcnRjX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtcnRjIiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHJ0Y19yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHJ0Y19yZXNvdXJjZXMsCit9OworCisvKiBJMkMwICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlpYzBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJJSUMwIiwKKwkJLnN0YXJ0ICA9IDB4MDQ0NzAwMDAsCisJCS5lbmQgICAgPSAweDA0NDcwMDE4IC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gOTYsCisJCS5lbmQgICAgPSA5OSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpaWMwX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiaTJjLXNoX21vYmlsZSIsCisJLmlkICAgICAgICAgICAgID0gMCwgLyogImkyYzAiIGNsb2NrICovCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShpaWMwX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gaWljMF9yZXNvdXJjZXMsCit9OworCisvKiBJMkMxICovCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGlpYzFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJJSUMxIiwKKwkJLnN0YXJ0ICA9IDB4MDQ3NTAwMDAsCisJCS5lbmQgICAgPSAweDA0NzUwMDE4IC0gMSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQgID0gOTIsCisJCS5lbmQgICAgPSA5NSwKKwkJLmZsYWdzICA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBpaWMxX2RldmljZSA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiaTJjLXNoX21vYmlsZSIsCisJLmlkICAgICAgICAgICAgID0gMSwgLyogImkyYzEiIGNsb2NrICovCisJLm51bV9yZXNvdXJjZXMgID0gQVJSQVlfU0laRShpaWMxX3Jlc291cmNlcyksCisJLnJlc291cmNlICAgICAgID0gaWljMV9yZXNvdXJjZXMsCit9OworCisvKiBWUFUgKi8KK3N0YXRpYyBzdHJ1Y3QgdWlvX2luZm8gdnB1X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVlBVNUYiLAorCS52ZXJzaW9uID0gIjAiLAorCS5pcnEgPSA2MCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdnB1X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVlBVIiwKKwkJLnN0YXJ0CT0gMHhmZTkwMDAwMCwKKwkJLmVuZAk9IDB4ZmU5MDI4MDcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkvKiBwbGFjZSBob2xkZXIgZm9yIGNvbnRpZ3VvdXMgbWVtb3J5ICovCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZwdV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInVpb19wZHJ2X2dlbmlycSIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdnB1X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB2cHVfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh2cHVfcmVzb3VyY2VzKSwKK307CisKKy8qIFZFVTAgKi8KK3N0YXRpYyBzdHJ1Y3QgdWlvX2luZm8gdmV1MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlZFVTNGMCIsCisJLnZlcnNpb24gPSAiMCIsCisJLmlycSA9IDgzLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB2ZXUwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVkVVM0YwIiwKKwkJLnN0YXJ0CT0gMHhmZTkyMDAwMCwKKwkJLmVuZAk9IDB4ZmU5MjAwY2IgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLyogcGxhY2UgaG9sZGVyIGZvciBjb250aWd1b3VzIG1lbW9yeSAqLworCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB2ZXUwX2RldmljZSA9IHsKKwkubmFtZQkJPSAidWlvX3BkcnZfZ2VuaXJxIiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ2ZXUwX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB2ZXUwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodmV1MF9yZXNvdXJjZXMpLAorfTsKKworLyogVkVVMSAqLworc3RhdGljIHN0cnVjdCB1aW9faW5mbyB2ZXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVkVVM0YxIiwKKwkudmVyc2lvbiA9ICIwIiwKKwkuaXJxID0gNTQsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHZldTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJWRVUzRjEiLAorCQkuc3RhcnQJPSAweGZlOTI0MDAwLAorCQkuZW5kCT0gMHhmZTkyNDBjYiAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkvKiBwbGFjZSBob2xkZXIgZm9yIGNvbnRpZ3VvdXMgbWVtb3J5ICovCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHZldTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJ1aW9fcGRydl9nZW5pcnEiLAorCS5pZAkJPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnZldTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHZldTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh2ZXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyBjbXRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJDTVQiLAorCS5jaGFubmVsX29mZnNldCA9IDB4NjAsCisJLnRpbWVyX2JpdCA9IDUsCisJLmNsayA9ICJjbXQwIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAxMjUsCisJLmNsb2Nrc291cmNlX3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY210X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiQ01UIiwKKwkJLnN0YXJ0CT0gMHgwNDRhMDA2MCwKKwkJLmVuZAk9IDB4MDQ0YTAwNmIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxMDQsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjbXRfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF9jbXQiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmNtdF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gY210X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoY210X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInRtdTAiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTAiLAorCQkuc3RhcnQJPSAweGZmZDgwMDA4LAorCQkuZW5kCT0gMHhmZmQ4MDAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUxIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAidG11MCIsCisJLmNsb2Nrc291cmNlX3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTEiLAorCQkuc3RhcnQJPSAweGZmZDgwMDE0LAorCQkuZW5kCT0gMHhmZmQ4MDAxZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTJfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUyIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDFjLAorCS50aW1lcl9iaXQgPSAyLAorCS5jbGsgPSAidG11MCIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUyIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAyMCwKKwkJLmVuZAk9IDB4ZmZkODAwMmIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTJfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUyX3Jlc291cmNlcyksCit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTNfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUzIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDA0LAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAidG11MSIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUzIiwKKwkJLnN0YXJ0CT0gMHhmZmQ5MDAwOCwKKwkJLmVuZAk9IDB4ZmZkOTAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA1NywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTNfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUzX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXU0X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VNCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInRtdTEiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VNCIsCisJCS5zdGFydAk9IDB4ZmZkOTAwMTQsCisJCS5lbmQJPSAweGZmZDkwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gNTgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU0X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gNCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU0X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU0X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11NF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11NV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTUiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJ0bXUxIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11NV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTUiLAorCQkuc3RhcnQJPSAweGZmZDkwMDIwLAorCQkuZW5kCT0gMHhmZmQ5MDAyYiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDU3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11NV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDUsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11NV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11NV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTVfcmVzb3VyY2VzKSwKK307CisKKy8qIEpQVSAqLworc3RhdGljIHN0cnVjdCB1aW9faW5mbyBqcHVfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJKUFUiLAorCS52ZXJzaW9uID0gIjAiLAorCS5pcnEgPSAyNywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UganB1X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiSlBVIiwKKwkJLnN0YXJ0CT0gMHhmZTk4MDAwMCwKKwkJLmVuZAk9IDB4ZmU5OTAyZDMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkvKiBwbGFjZSBob2xkZXIgZm9yIGNvbnRpZ3VvdXMgbWVtb3J5ICovCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGpwdV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInVpb19wZHJ2X2dlbmlycSIsCisJLmlkCQk9IDMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmanB1X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSBqcHVfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShqcHVfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MjRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmNtdF9kZXZpY2UsCisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCisJJnRtdTNfZGV2aWNlLAorCSZ0bXU0X2RldmljZSwKKwkmdG11NV9kZXZpY2UsCisJJnNjaV9kZXZpY2UsCisJJnJ0Y19kZXZpY2UsCisJJmlpYzBfZGV2aWNlLAorCSZpaWMxX2RldmljZSwKKwkmdnB1X2RldmljZSwKKwkmdmV1MF9kZXZpY2UsCisJJnZldTFfZGV2aWNlLAorCSZqcHVfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g3NzI0X2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9yZXNvdXJjZV9zZXR1cF9tZW1vcnkoJnZwdV9kZXZpY2UsICJ2cHUiLCAyIDw8IDIwKTsKKwlwbGF0Zm9ybV9yZXNvdXJjZV9zZXR1cF9tZW1vcnkoJnZldTBfZGV2aWNlLCAidmV1MCIsIDIgPDwgMjApOworCXBsYXRmb3JtX3Jlc291cmNlX3NldHVwX21lbW9yeSgmdmV1MV9kZXZpY2UsICJ2ZXUxIiwgMiA8PCAyMCk7CisJcGxhdGZvcm1fcmVzb3VyY2Vfc2V0dXBfbWVtb3J5KCZqcHVfZGV2aWNlLCAgImpwdSIsICAyIDw8IDIwKTsKKworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3MjRfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDc3MjRfZGV2aWNlcykpOworfQorZGV2aWNlX2luaXRjYWxsKHNoNzcyNF9kZXZpY2VzX3NldHVwKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzcyNF9lYXJseV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmY210X2RldmljZSwKKwkmdG11MF9kZXZpY2UsCisJJnRtdTFfZGV2aWNlLAorCSZ0bXUyX2RldmljZSwKKwkmdG11M19kZXZpY2UsCisJJnRtdTRfZGV2aWNlLAorCSZ0bXU1X2RldmljZSwKK307CisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzI0X2Vhcmx5X2RldmljZXMsCisJCQkJICAgQVJSQVlfU0laRShzaDc3MjRfZWFybHlfZGV2aWNlcykpOworfQorCisjZGVmaW5lIFJBTUNSX0NBQ0hFX0wyRkMJMHgwMDAyCisjZGVmaW5lIFJBTUNSX0NBQ0hFX0wyRQkJMHgwMDAxCisjZGVmaW5lIEwyX0NBQ0hFX0VOQUJMRQkJKFJBTUNSX0NBQ0hFX0wyRXxSQU1DUl9DQUNIRV9MMkZDKQordm9pZCBfX3VzZXNfanVtcF90b191bmNhY2hlZCBsMl9jYWNoZV9pbml0KHZvaWQpCit7CisJLyogRW5hYmxlIEwyIGNhY2hlICovCisJY3RybF9vdXRsKEwyX0NBQ0hFX0VOQUJMRSwgUkFNQ1IpOworfQorCitlbnVtIHsKKwlVTlVTRUQgPSAwLAorCisJLyogaW50ZXJydXB0IHNvdXJjZXMgKi8KKwlJUlEwLCBJUlExLCBJUlEyLCBJUlEzLCBJUlE0LCBJUlE1LCBJUlE2LCBJUlE3LAorCUhVREksCisJRE1BQzFBX0RFSTAsIERNQUMxQV9ERUkxLCBETUFDMUFfREVJMiwgRE1BQzFBX0RFSTMsCisJXzJER19UUkksIF8yREdfSU5JLCBfMkRHX0NFSSwKKwlETUFDMEFfREVJMCwgRE1BQzBBX0RFSTEsIERNQUMwQV9ERUkyLCBETUFDMEFfREVJMywKKwlWSU9fQ0VVMCwgVklPX0JFVTAsIFZJT19WRVUxLCBWSU9fVk9VLAorCVNDSUZBMywKKwlWUFUsCisJVFBVLAorCUNFVTEsCisJQkVVMSwKKwlVU0IwLCBVU0IxLAorCUFUQVBJLAorCVJUQ19BVEksIFJUQ19QUkksIFJUQ19DVUksCisJRE1BQzFCX0RFSTQsIERNQUMxQl9ERUk1LCBETUFDMUJfREFERVJSLAorCURNQUMwQl9ERUk0LCBETUFDMEJfREVJNSwgRE1BQzBCX0RBREVSUiwKKwlLRVlTQywKKwlTQ0lGX1NDSUYwLCBTQ0lGX1NDSUYxLCBTQ0lGX1NDSUYyLAorCVZFVTAsCisJTVNJT0ZfTVNJT0ZJMCwgTVNJT0ZfTVNJT0ZJMSwKKwlTUFVfU1BVSTAsIFNQVV9TUFVJMSwKKwlTQ0lGQTQsCisJSUNCLAorCUVUSEksCisJSTJDMV9BTEksIEkyQzFfVEFDS0ksIEkyQzFfV0FJVEksIEkyQzFfRFRFSSwKKwlJMkMwX0FMSSwgSTJDMF9UQUNLSSwgSTJDMF9XQUlUSSwgSTJDMF9EVEVJLAorCVNESEkwX1NESElJMCwgU0RISTBfU0RISUkxLCBTREhJMF9TREhJSTIsIFNESEkwX1NESElJMywKKwlDTVQsCisJVFNJRiwKKwlGU0ksCisJU0NJRkE1LAorCVRNVTBfVFVOSTAsIFRNVTBfVFVOSTEsIFRNVTBfVFVOSTIsCisJSVJEQSwKKwlTREhJMV9TREhJSTAsIFNESEkxX1NESElJMSwgU0RISTFfU0RISUkyLAorCUpQVSwKKwlfMkRETUFDLAorCU1NQ19NTUMySSwgTU1DX01NQzNJLAorCUxDREMsCisJVE1VMV9UVU5JMCwgVE1VMV9UVU5JMSwgVE1VMV9UVU5JMiwKKworCS8qIGludGVycnVwdCBncm91cHMgKi8KKwlETUFDMUEsIF8yREcsIERNQUMwQSwgVklPLCBVU0IsIFJUQywKKwlETUFDMUIsIERNQUMwQiwgSTJDMCwgSTJDMSwgU0RISTAsIFNESEkxLCBTUFUsIE1NQ0lGLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRjX3ZlY3QgdmVjdG9yc1tdIF9faW5pdGRhdGEgPSB7CisJSU5UQ19WRUNUKElSUTAsIDB4NjAwKSwgSU5UQ19WRUNUKElSUTEsIDB4NjIwKSwKKwlJTlRDX1ZFQ1QoSVJRMiwgMHg2NDApLCBJTlRDX1ZFQ1QoSVJRMywgMHg2NjApLAorCUlOVENfVkVDVChJUlE0LCAweDY4MCksIElOVENfVkVDVChJUlE1LCAweDZhMCksCisJSU5UQ19WRUNUKElSUTYsIDB4NmMwKSwgSU5UQ19WRUNUKElSUTcsIDB4NmUwKSwKKworCUlOVENfVkVDVChETUFDMUFfREVJMCwgMHg3MDApLAorCUlOVENfVkVDVChETUFDMUFfREVJMSwgMHg3MjApLAorCUlOVENfVkVDVChETUFDMUFfREVJMiwgMHg3NDApLAorCUlOVENfVkVDVChETUFDMUFfREVJMywgMHg3NjApLAorCisJSU5UQ19WRUNUKF8yREdfVFJJLCAweDc4MCksCisJSU5UQ19WRUNUKF8yREdfSU5JLCAweDdBMCksCisJSU5UQ19WRUNUKF8yREdfQ0VJLCAweDdDMCksCisKKwlJTlRDX1ZFQ1QoRE1BQzBBX0RFSTAsIDB4ODAwKSwKKwlJTlRDX1ZFQ1QoRE1BQzBBX0RFSTEsIDB4ODIwKSwKKwlJTlRDX1ZFQ1QoRE1BQzBBX0RFSTIsIDB4ODQwKSwKKwlJTlRDX1ZFQ1QoRE1BQzBBX0RFSTMsIDB4ODYwKSwKKworCUlOVENfVkVDVChWSU9fQ0VVMCwgMHg4ODApLAorCUlOVENfVkVDVChWSU9fQkVVMCwgMHg4QTApLAorCUlOVENfVkVDVChWSU9fVkVVMSwgMHg4QzApLAorCUlOVENfVkVDVChWSU9fVk9VLCAgMHg4RTApLAorCisJSU5UQ19WRUNUKFNDSUZBMywgMHg5MDApLAorCUlOVENfVkVDVChWUFUsICAgIDB4OTgwKSwKKwlJTlRDX1ZFQ1QoVFBVLCAgICAweDlBMCksCisJSU5UQ19WRUNUKENFVTEsICAgMHg5RTApLAorCUlOVENfVkVDVChCRVUxLCAgIDB4QTAwKSwKKwlJTlRDX1ZFQ1QoVVNCMCwgICAweEEyMCksCisJSU5UQ19WRUNUKFVTQjEsICAgMHhBNDApLAorCUlOVENfVkVDVChBVEFQSSwgIDB4QTYwKSwKKworCUlOVENfVkVDVChSVENfQVRJLCAweEE4MCksCisJSU5UQ19WRUNUKFJUQ19QUkksIDB4QUEwKSwKKwlJTlRDX1ZFQ1QoUlRDX0NVSSwgMHhBQzApLAorCisJSU5UQ19WRUNUKERNQUMxQl9ERUk0LCAweEIwMCksCisJSU5UQ19WRUNUKERNQUMxQl9ERUk1LCAweEIyMCksCisJSU5UQ19WRUNUKERNQUMxQl9EQURFUlIsIDB4QjQwKSwKKworCUlOVENfVkVDVChETUFDMEJfREVJNCwgMHhCODApLAorCUlOVENfVkVDVChETUFDMEJfREVJNSwgMHhCQTApLAorCUlOVENfVkVDVChETUFDMEJfREFERVJSLCAweEJDMCksCisKKwlJTlRDX1ZFQ1QoS0VZU0MsICAgICAgMHhCRTApLAorCUlOVENfVkVDVChTQ0lGX1NDSUYwLCAweEMwMCksCisJSU5UQ19WRUNUKFNDSUZfU0NJRjEsIDB4QzIwKSwKKwlJTlRDX1ZFQ1QoU0NJRl9TQ0lGMiwgMHhDNDApLAorCUlOVENfVkVDVChWRVUwLCAgICAgICAweEM2MCksCisJSU5UQ19WRUNUKE1TSU9GX01TSU9GSTAsIDB4QzgwKSwKKwlJTlRDX1ZFQ1QoTVNJT0ZfTVNJT0ZJMSwgMHhDQTApLAorCUlOVENfVkVDVChTUFVfU1BVSTAsIDB4Q0MwKSwKKwlJTlRDX1ZFQ1QoU1BVX1NQVUkxLCAweENFMCksCisJSU5UQ19WRUNUKFNDSUZBNCwgICAgMHhEMDApLAorCisJSU5UQ19WRUNUKElDQiwgIDB4RDIwKSwKKwlJTlRDX1ZFQ1QoRVRISSwgMHhENjApLAorCisJSU5UQ19WRUNUKEkyQzFfQUxJLCAweEQ4MCksCisJSU5UQ19WRUNUKEkyQzFfVEFDS0ksIDB4REEwKSwKKwlJTlRDX1ZFQ1QoSTJDMV9XQUlUSSwgMHhEQzApLAorCUlOVENfVkVDVChJMkMxX0RURUksIDB4REUwKSwKKworCUlOVENfVkVDVChJMkMwX0FMSSwgMHhFMDApLAorCUlOVENfVkVDVChJMkMwX1RBQ0tJLCAweEUyMCksCisJSU5UQ19WRUNUKEkyQzBfV0FJVEksIDB4RTQwKSwKKwlJTlRDX1ZFQ1QoSTJDMF9EVEVJLCAweEU2MCksCisKKwlJTlRDX1ZFQ1QoU0RISTBfU0RISUkwLCAweEU4MCksCisJSU5UQ19WRUNUKFNESEkwX1NESElJMSwgMHhFQTApLAorCUlOVENfVkVDVChTREhJMF9TREhJSTIsIDB4RUMwKSwKKwlJTlRDX1ZFQ1QoU0RISTBfU0RISUkzLCAweEVFMCksCisKKwlJTlRDX1ZFQ1QoQ01ULCAgICAweEYwMCksCisJSU5UQ19WRUNUKFRTSUYsICAgMHhGMjApLAorCUlOVENfVkVDVChGU0ksICAgIDB4RjgwKSwKKwlJTlRDX1ZFQ1QoU0NJRkE1LCAweEZBMCksCisKKwlJTlRDX1ZFQ1QoVE1VMF9UVU5JMCwgMHg0MDApLAorCUlOVENfVkVDVChUTVUwX1RVTkkxLCAweDQyMCksCisJSU5UQ19WRUNUKFRNVTBfVFVOSTIsIDB4NDQwKSwKKworCUlOVENfVkVDVChJUkRBLCAgICAweDQ4MCksCisKKwlJTlRDX1ZFQ1QoU0RISTFfU0RISUkwLCAweDRFMCksCisJSU5UQ19WRUNUKFNESEkxX1NESElJMSwgMHg1MDApLAorCUlOVENfVkVDVChTREhJMV9TREhJSTIsIDB4NTIwKSwKKworCUlOVENfVkVDVChKUFUsIDB4NTYwKSwKKwlJTlRDX1ZFQ1QoXzJERE1BQywgMHg0QTApLAorCisJSU5UQ19WRUNUKE1NQ19NTUMySSwgMHg1QTApLAorCUlOVENfVkVDVChNTUNfTU1DM0ksIDB4NUMwKSwKKworCUlOVENfVkVDVChMQ0RDLCAweEY0MCksCisKKwlJTlRDX1ZFQ1QoVE1VMV9UVU5JMCwgMHg5MjApLAorCUlOVENfVkVDVChUTVUxX1RVTkkxLCAweDk0MCksCisJSU5UQ19WRUNUKFRNVTFfVFVOSTIsIDB4OTYwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50Y19ncm91cCBncm91cHNbXSBfX2luaXRkYXRhID0geworCUlOVENfR1JPVVAoRE1BQzFBLCBETUFDMUFfREVJMCwgRE1BQzFBX0RFSTEsIERNQUMxQV9ERUkyLCBETUFDMUFfREVJMyksCisJSU5UQ19HUk9VUChfMkRHLCBfMkRHX1RSSSwgXzJER19JTkksIF8yREdfQ0VJKSwKKwlJTlRDX0dST1VQKERNQUMwQSwgRE1BQzBBX0RFSTAsIERNQUMwQV9ERUkxLCBETUFDMEFfREVJMiwgRE1BQzBBX0RFSTMpLAorCUlOVENfR1JPVVAoVklPLCBWSU9fQ0VVMCwgVklPX0JFVTAsIFZJT19WRVUxLCBWSU9fVk9VKSwKKwlJTlRDX0dST1VQKFVTQiwgVVNCMCwgVVNCMSksCisJSU5UQ19HUk9VUChSVEMsIFJUQ19BVEksIFJUQ19QUkksIFJUQ19DVUkpLAorCUlOVENfR1JPVVAoRE1BQzFCLCBETUFDMUJfREVJNCwgRE1BQzFCX0RFSTUsIERNQUMxQl9EQURFUlIpLAorCUlOVENfR1JPVVAoRE1BQzBCLCBETUFDMEJfREVJNCwgRE1BQzBCX0RFSTUsIERNQUMwQl9EQURFUlIpLAorCUlOVENfR1JPVVAoSTJDMCwgSTJDMF9BTEksIEkyQzBfVEFDS0ksIEkyQzBfV0FJVEksIEkyQzBfRFRFSSksCisJSU5UQ19HUk9VUChJMkMxLCBJMkMxX0FMSSwgSTJDMV9UQUNLSSwgSTJDMV9XQUlUSSwgSTJDMV9EVEVJKSwKKwlJTlRDX0dST1VQKFNESEkwLCBTREhJMF9TREhJSTAsIFNESEkwX1NESElJMSwgU0RISTBfU0RISUkyLCBTREhJMF9TREhJSTMpLAorCUlOVENfR1JPVVAoU0RISTEsIFNESEkxX1NESElJMCwgU0RISTFfU0RISUkxLCBTREhJMV9TREhJSTIpLAorCUlOVENfR1JPVVAoU1BVLCBTUFVfU1BVSTAsIFNQVV9TUFVJMSksCisJSU5UQ19HUk9VUChNTUNJRiwgTU1DX01NQzJJLCBNTUNfTU1DM0kpLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIG1hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKKwl7IDB4YTQwODAwODAsIDB4YTQwODAwYzAsIDgsIC8qIElNUjAgLyBJTUNSMCAqLworCSAgeyAwLCBUTVUxX1RVTkkyLCBUTVUxX1RVTkkxLCBUTVUxX1RVTkkwLAorCSAgICAwLCBTREhJMV9TREhJSTIsIFNESEkxX1NESElJMSwgU0RISTFfU0RISUkwIH0gfSwKKwl7IDB4YTQwODAwODQsIDB4YTQwODAwYzQsIDgsIC8qIElNUjEgLyBJTUNSMSAqLworCSAgeyBWSU9fVk9VLCBWSU9fVkVVMSwgVklPX0JFVTAsIFZJT19DRVUwLAorCSAgICBETUFDMEFfREVJMywgRE1BQzBBX0RFSTIsIERNQUMwQV9ERUkxLCBETUFDMEFfREVJMCB9IH0sCisJeyAweGE0MDgwMDg4LCAweGE0MDgwMGM4LCA4LCAvKiBJTVIyIC8gSU1DUjIgKi8KKwkgIHsgMCwgMCwgMCwgVlBVLCBBVEFQSSwgRVRISSwgMCwgU0NJRkEzIH0gfSwKKwl7IDB4YTQwODAwOGMsIDB4YTQwODAwY2MsIDgsIC8qIElNUjMgLyBJTUNSMyAqLworCSAgeyBETUFDMUFfREVJMywgRE1BQzFBX0RFSTIsIERNQUMxQV9ERUkxLCBETUFDMUFfREVJMCwKKwkgICAgU1BVX1NQVUkxLCBTUFVfU1BVSTAsIEJFVTEsIElSREEgfSB9LAorCXsgMHhhNDA4MDA5MCwgMHhhNDA4MDBkMCwgOCwgLyogSU1SNCAvIElNQ1I0ICovCisJICB7IDAsIFRNVTBfVFVOSTIsIFRNVTBfVFVOSTEsIFRNVTBfVFVOSTAsCisJICAgIEpQVSwgMCwgMCwgTENEQyB9IH0sCisJeyAweGE0MDgwMDk0LCAweGE0MDgwMGQ0LCA4LCAvKiBJTVI1IC8gSU1DUjUgKi8KKwkgIHsgS0VZU0MsIERNQUMwQl9EQURFUlIsIERNQUMwQl9ERUk1LCBETUFDMEJfREVJNCwKKwkgICAgVkVVMCwgU0NJRl9TQ0lGMiwgU0NJRl9TQ0lGMSwgU0NJRl9TQ0lGMCB9IH0sCisJeyAweGE0MDgwMDk4LCAweGE0MDgwMGQ4LCA4LCAvKiBJTVI2IC8gSU1DUjYgKi8KKwkgIHsgMCwgMCwgSUNCLCBTQ0lGQTQsCisJICAgIENFVTEsIDAsIE1TSU9GX01TSU9GSTEsIE1TSU9GX01TSU9GSTAgfSB9LAorCXsgMHhhNDA4MDA5YywgMHhhNDA4MDBkYywgOCwgLyogSU1SNyAvIElNQ1I3ICovCisJICB7IEkyQzBfRFRFSSwgSTJDMF9XQUlUSSwgSTJDMF9UQUNLSSwgSTJDMF9BTEksCisJICAgIEkyQzFfRFRFSSwgSTJDMV9XQUlUSSwgSTJDMV9UQUNLSSwgSTJDMV9BTEkgfSB9LAorCXsgMHhhNDA4MDBhMCwgMHhhNDA4MDBlMCwgOCwgLyogSU1SOCAvIElNQ1I4ICovCisJICB7IFNESEkwX1NESElJMywgU0RISTBfU0RISUkyLCBTREhJMF9TREhJSTEsIFNESEkwX1NESElJMCwKKwkgICAgMCwgMCwgU0NJRkE1LCBGU0kgfSB9LAorCXsgMHhhNDA4MDBhNCwgMHhhNDA4MDBlNCwgOCwgLyogSU1SOSAvIElNQ1I5ICovCisJICB7IDAsIDAsIDAsIENNVCwgMCwgVVNCMSwgVVNCMCwgMCB9IH0sCisJeyAweGE0MDgwMGE4LCAweGE0MDgwMGU4LCA4LCAvKiBJTVIxMCAvIElNQ1IxMCAqLworCSAgeyAwLCBETUFDMUJfREFERVJSLCBETUFDMUJfREVJNSwgRE1BQzFCX0RFSTQsCisJICAgIDAsIFJUQ19DVUksIFJUQ19QUkksIFJUQ19BVEkgfSB9LAorCXsgMHhhNDA4MDBhYywgMHhhNDA4MDBlYywgOCwgLyogSU1SMTEgLyBJTUNSMTEgKi8KKwkgIHsgMCwgXzJER19DRUksIF8yREdfSU5JLCBfMkRHX1RSSSwKKwkgICAgMCwgVFBVLCAwLCBUU0lGIH0gfSwKKwl7IDB4YTQwODAwYjAsIDB4YTQwODAwZjAsIDgsIC8qIElNUjEyIC8gSU1DUjEyICovCisJICB7IDAsIDAsIE1NQ19NTUMzSSwgTU1DX01NQzJJLCAwLCAwLCAwLCBfMkRETUFDIH0gfSwKKwl7IDB4YTQxNDAwNDQsIDB4YTQxNDAwNjQsIDgsIC8qIElOVE1TSzAwIC8gSU5UTVNLQ0xSMDAgKi8KKwkgIHsgSVJRMCwgSVJRMSwgSVJRMiwgSVJRMywgSVJRNCwgSVJRNSwgSVJRNiwgSVJRNyB9IH0sCit9OworCitzdGF0aWMgc3RydWN0IGludGNfcHJpb19yZWcgcHJpb19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0geworCXsgMHhhNDA4MDAwMCwgMCwgMTYsIDQsIC8qIElQUkEgKi8geyBUTVUwX1RVTkkwLCBUTVUwX1RVTkkxLAorCQkJCQkgICAgIFRNVTBfVFVOSTIsIElSREEgfSB9LAorCXsgMHhhNDA4MDAwNCwgMCwgMTYsIDQsIC8qIElQUkIgKi8geyBKUFUsIExDREMsIERNQUMxQSwgQkVVMSB9IH0sCisJeyAweGE0MDgwMDA4LCAwLCAxNiwgNCwgLyogSVBSQyAqLyB7IFRNVTFfVFVOSTAsIFRNVTFfVFVOSTEsCisJCQkJCSAgICAgVE1VMV9UVU5JMiwgU1BVIH0gfSwKKwl7IDB4YTQwODAwMGMsIDAsIDE2LCA0LCAvKiBJUFJEICovIHsgMCwgTU1DSUYsIDAsIEFUQVBJIH0gfSwKKwl7IDB4YTQwODAwMTAsIDAsIDE2LCA0LCAvKiBJUFJFICovIHsgRE1BQzBBLCBWSU8sIFNDSUZBMywgVlBVIH0gfSwKKwl7IDB4YTQwODAwMTQsIDAsIDE2LCA0LCAvKiBJUFJGICovIHsgS0VZU0MsIERNQUMwQiwgVVNCLCBDTVQgfSB9LAorCXsgMHhhNDA4MDAxOCwgMCwgMTYsIDQsIC8qIElQUkcgKi8geyBTQ0lGX1NDSUYwLCBTQ0lGX1NDSUYxLAorCQkJCQkgICAgIFNDSUZfU0NJRjIsIFZFVTAgfSB9LAorCXsgMHhhNDA4MDAxYywgMCwgMTYsIDQsIC8qIElQUkggKi8geyBNU0lPRl9NU0lPRkkwLCBNU0lPRl9NU0lPRkkxLAorCQkJCQkgICAgIEkyQzEsIEkyQzAgfSB9LAorCXsgMHhhNDA4MDAyMCwgMCwgMTYsIDQsIC8qIElQUkkgKi8geyBTQ0lGQTQsIElDQiwgVFNJRiwgXzJERyB9IH0sCisJeyAweGE0MDgwMDI0LCAwLCAxNiwgNCwgLyogSVBSSiAqLyB7IENFVTEsIEVUSEksIEZTSSwgU0RISTEgfSB9LAorCXsgMHhhNDA4MDAyOCwgMCwgMTYsIDQsIC8qIElQUksgKi8geyBSVEMsIERNQUMxQiwgMCwgU0RISTAgfSB9LAorCXsgMHhhNDA4MDAyYywgMCwgMTYsIDQsIC8qIElQUkwgKi8geyBTQ0lGQTUsIDAsIFRQVSwgXzJERE1BQyB9IH0sCisJeyAweGE0MTQwMDEwLCAwLCAzMiwgNCwgLyogSU5UUFJJMDAgKi8KKwkgIHsgSVJRMCwgSVJRMSwgSVJRMiwgSVJRMywgSVJRNCwgSVJRNSwgSVJRNiwgSVJRNyB9IH0sCit9OworCitzdGF0aWMgc3RydWN0IGludGNfc2Vuc2VfcmVnIHNlbnNlX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CisJeyAweGE0MTQwMDFjLCAxNiwgMiwgLyogSUNSMSAqLworCSAgeyBJUlEwLCBJUlExLCBJUlEyLCBJUlEzLCBJUlE0LCBJUlE1LCBJUlE2LCBJUlE3IH0gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBhY2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKKwl7IDB4YTQxNDAwMjQsIDAsIDgsIC8qIElOVFJFUTAwICovCisJICB7IElSUTAsIElSUTEsIElSUTIsIElSUTMsIElSUTQsIElSUTUsIElSUTYsIElSUTcgfSB9LAorfTsKKworc3RhdGljIERFQ0xBUkVfSU5UQ19ERVNDX0FDSyhpbnRjX2Rlc2MsICJzaDc3MjQiLCB2ZWN0b3JzLCBncm91cHMsCisJCQkgICAgIG1hc2tfcmVnaXN0ZXJzLCBwcmlvX3JlZ2lzdGVycywgc2Vuc2VfcmVnaXN0ZXJzLAorCQkJICAgICBhY2tfcmVnaXN0ZXJzKTsKKwordm9pZCBfX2luaXQgcGxhdF9pcnFfc2V0dXAodm9pZCkKK3sKKwlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNfZGVzYyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NjMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc2My5jCmluZGV4IGJkZjBmNjEuLmYxZTBjMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc2My5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc2My5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CiAKQEAgLTExMyw3ICsxMTQsMTk1IEBACiAJLnJlc291cmNlCT0gdXNiZl9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAwOCwKKwkJLmVuZAk9IDB4ZmZkODAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAyOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMSIsCisJCS5zdGFydAk9IDB4ZmZkODAwMTQsCisJCS5lbmQJPSAweGZmZDgwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMjksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11Ml9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTIiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUyIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAyMCwKKwkJLmVuZAk9IDB4ZmZkODAwMmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAzMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTJfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUyX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUzX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMyIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11M19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTMiLAorCQkuc3RhcnQJPSAweGZmZDg4MDA4LAorCQkuZW5kCT0gMHhmZmQ4ODAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDk2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11M19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11M19wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11M19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTNfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVU0IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VNCIsCisJCS5zdGFydAk9IDB4ZmZkODgwMTQsCisJCS5lbmQJPSAweGZmZDg4MDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gOTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU0X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gNCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU0X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU0X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11NF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11NV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTUiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTVfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU1IiwKKwkJLnN0YXJ0CT0gMHhmZmQ4ODAyMCwKKwkJLmVuZAk9IDB4ZmZkODgwMmIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA5OCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTVfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA1LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTVfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTVfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU1X3Jlc291cmNlcyksCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzYzX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorCSZ0bXUzX2RldmljZSwKKwkmdG11NF9kZXZpY2UsCisJJnRtdTVfZGV2aWNlLAogCSZydGNfZGV2aWNlLAogCSZzY2lfZGV2aWNlLAogCSZ1c2Jfb2hjaV9kZXZpY2UsCkBAIC0xMjcsNiArMzE2LDIxIEBACiB9CiBfX2luaXRjYWxsKHNoNzc2M19kZXZpY2VzX3NldHVwKTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc2M19lYXJseV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmdG11MF9kZXZpY2UsCisJJnRtdTFfZGV2aWNlLAorCSZ0bXUyX2RldmljZSwKKwkmdG11M19kZXZpY2UsCisJJnRtdTRfZGV2aWNlLAorCSZ0bXU1X2RldmljZSwKK307CisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzYzX2Vhcmx5X2RldmljZXMsCisJCQkJICAgQVJSQVlfU0laRShzaDc3NjNfZWFybHlfZGV2aWNlcykpOworfQorCiBlbnVtIHsKIAlVTlVTRUQgPSAwLAogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3NzAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc3MC5jCmluZGV4IGI3MzU3OGUuLjFlODYyMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc3MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc3MC5jCkBAIC0xMSw2ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKQEAgLTc2LDcgKzc4LDI4OCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAwOCwKKwkJLmVuZAk9IDB4ZmZkODAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMSIsCisJCS5zdGFydAk9IDB4ZmZkODAwMTQsCisJCS5lbmQJPSAweGZmZDgwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11Ml9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTIiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUyIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAyMCwKKwkJLmVuZAk9IDB4ZmZkODAwMmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTJfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUyX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUzX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMyIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11M19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTMiLAorCQkuc3RhcnQJPSAweGZmZDgxMDA4LAorCQkuZW5kCT0gMHhmZmQ4MTAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE5LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11M19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11M19wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11M19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTNfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVU0IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VNCIsCisJCS5zdGFydAk9IDB4ZmZkODEwMTQsCisJCS5lbmQJPSAweGZmZDgxMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMjAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU0X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gNCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU0X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU0X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11NF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11NV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTUiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTVfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU1IiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MTAyMCwKKwkJLmVuZAk9IDB4ZmZkODEwMmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAyMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTVfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA1LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTVfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTVfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU1X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXU2X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VNiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11Nl9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTYiLAorCQkuc3RhcnQJPSAweGZmZDgyMDA4LAorCQkuZW5kCT0gMHhmZmQ4MjAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDIyLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11Nl9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDYsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11Nl9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11Nl9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTZfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTdfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVU3IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU3X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VNyIsCisJCS5zdGFydAk9IDB4ZmZkODIwMTQsCisJCS5lbmQJPSAweGZmZDgyMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMjMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU3X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gNywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU3X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU3X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11N19yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11OF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTgiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdThfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU4IiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MjAyMCwKKwkJLmVuZAk9IDB4ZmZkODIwMmIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAyNCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdThfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA4LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdThfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdThfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU4X3Jlc291cmNlcyksCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzcwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorCSZ0bXUzX2RldmljZSwKKwkmdG11NF9kZXZpY2UsCisJJnRtdTVfZGV2aWNlLAorCSZ0bXU2X2RldmljZSwKKwkmdG11N19kZXZpY2UsCisJJnRtdThfZGV2aWNlLAogCSZzY2lfZGV2aWNlLAogfTsKIApAQCAtODcsNiArMzcwLDI2OSBAQAogfQogX19pbml0Y2FsbChzaDc3NzBfZGV2aWNlc19zZXR1cCk7CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3NzBfZWFybHlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCisJJnRtdTNfZGV2aWNlLAorCSZ0bXU0X2RldmljZSwKKwkmdG11NV9kZXZpY2UsCisJJnRtdTZfZGV2aWNlLAorCSZ0bXU3X2RldmljZSwKKwkmdG11OF9kZXZpY2UsCit9OworCit2b2lkIF9faW5pdCBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQoreworCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzc3MF9lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2g3NzcwX2Vhcmx5X2RldmljZXMpKTsKK30KKworZW51bSB7CisJVU5VU0VEID0gMCwKKworCS8qIGludGVycnVwdCBzb3VyY2VzICovCisJSVJMX0xMTEwsIElSTF9MTExILCBJUkxfTExITCwgSVJMX0xMSEgsCisJSVJMX0xITEwsIElSTF9MSExILCBJUkxfTEhITCwgSVJMX0xISEgsCisJSVJMX0hMTEwsIElSTF9ITExILCBJUkxfSExITCwgSVJMX0hMSEgsCisJSVJMX0hITEwsIElSTF9ISExILCBJUkxfSEhITCwKKworCUlSUTAsIElSUTEsIElSUTIsIElSUTMsIElSUTQsIElSUTUsCisKKwlHUElPLAorCVRNVTAsIFRNVTEsIFRNVTIsIFRNVTJfVElDUEksCisJVE1VMywgVE1VNCwgVE1VNSwgVE1VNV9USUNQSSwKKwlUTVU2LCBUTVU3LCBUTVU4LAorCUhBQywgSVBJLCBTUERJRiwgSFVESSwgSTJDLAorCURNQUMwX0RNSU5UMCwgRE1BQzBfRE1JTlQxLCBETUFDMF9ETUlOVDIsCisJSTJTMCwgSTJTMSwgSTJTMiwgSTJTMywKKwlTUkNfUlgsIFNSQ19UWCwgU1JDX1NQRElGLAorCURVLCBWSURFT19JTiwgUkVNT1RFLCBZVVYsIFVTQiwgQVRBUEksIENBTiwgR1BTLCBHRlgyRCwKKwlHRlgzRF9NQlgsIEdGWDNEX0RNQUMsCisJRVhCVVNfQVRBLAorCVNQSTAsIFNQSTEsCisJU0NJRjA4OSwgU0NJRjEyMzQsIFNDSUY1NjcsCisJQURDLAorCUJCRE1BQ18wXzMsIEJCRE1BQ180XzcsIEJCRE1BQ184XzEwLCBCQkRNQUNfMTFfMTQsCisJQkJETUFDXzE1XzE4LCBCQkRNQUNfMTlfMjIsIEJCRE1BQ18yM18yNiwgQkJETUFDXzI3LAorCUJCRE1BQ18yOCwgQkJETUFDXzI5LCBCQkRNQUNfMzAsIEJCRE1BQ18zMSwKKworCS8qIGludGVycnVwdCBncm91cHMgKi8KKwlUTVUsIERNQUMsIEkyUywgU1JDLCBHRlgzRCwgU1BJLCBTQ0lGLCBCQkRNQUMsCit9OworCitzdGF0aWMgc3RydWN0IGludGNfdmVjdCB2ZWN0b3JzW10gX19pbml0ZGF0YSA9IHsKKwlJTlRDX1ZFQ1QoR1BJTywgMHgzZTApLAorCUlOVENfVkVDVChUTVUwLCAweDQwMCksIElOVENfVkVDVChUTVUxLCAweDQyMCksCisJSU5UQ19WRUNUKFRNVTIsIDB4NDQwKSwgSU5UQ19WRUNUKFRNVTJfVElDUEksIDB4NDYwKSwKKwlJTlRDX1ZFQ1QoVE1VMywgMHg0ODApLCBJTlRDX1ZFQ1QoVE1VNCwgMHg0YTApLAorCUlOVENfVkVDVChUTVU1LCAweDRjMCksIElOVENfVkVDVChUTVU1X1RJQ1BJLCAweDRlMCksCisJSU5UQ19WRUNUKFRNVTYsIDB4NTAwKSwgSU5UQ19WRUNUKFRNVTcsIDB4NTIwKSwKKwlJTlRDX1ZFQ1QoVE1VOCwgMHg1NDApLAorCUlOVENfVkVDVChIQUMsIDB4NTgwKSwgSU5UQ19WRUNUKElQSSwgMHg1YzApLAorCUlOVENfVkVDVChTUERJRiwgMHg1ZTApLAorCUlOVENfVkVDVChIVURJLCAweDYwMCksIElOVENfVkVDVChJMkMsIDB4NjIwKSwKKwlJTlRDX1ZFQ1QoRE1BQzBfRE1JTlQwLCAweDY0MCksIElOVENfVkVDVChETUFDMF9ETUlOVDEsIDB4NjYwKSwKKwlJTlRDX1ZFQ1QoRE1BQzBfRE1JTlQyLCAweDY4MCksCisJSU5UQ19WRUNUKEkyUzAsIDB4NmEwKSwgSU5UQ19WRUNUKEkyUzEsIDB4NmMwKSwKKwlJTlRDX1ZFQ1QoSTJTMiwgMHg2ZTApLCBJTlRDX1ZFQ1QoSTJTMywgMHg3MDApLAorCUlOVENfVkVDVChTUkNfUlgsIDB4NzIwKSwgSU5UQ19WRUNUKFNSQ19UWCwgMHg3NDApLAorCUlOVENfVkVDVChTUkNfU1BESUYsIDB4NzYwKSwKKwlJTlRDX1ZFQ1QoRFUsIDB4NzgwKSwgSU5UQ19WRUNUKFZJREVPX0lOLCAweDdhMCksCisJSU5UQ19WRUNUKFJFTU9URSwgMHg3YzApLCBJTlRDX1ZFQ1QoWVVWLCAweDdlMCksCisJSU5UQ19WRUNUKFVTQiwgMHg4NDApLCBJTlRDX1ZFQ1QoQVRBUEksIDB4ODYwKSwKKwlJTlRDX1ZFQ1QoQ0FOLCAweDg4MCksIElOVENfVkVDVChHUFMsIDB4OGEwKSwKKwlJTlRDX1ZFQ1QoR0ZYMkQsIDB4OGMwKSwKKwlJTlRDX1ZFQ1QoR0ZYM0RfTUJYLCAweDkwMCksIElOVENfVkVDVChHRlgzRF9ETUFDLCAweDkyMCksCisJSU5UQ19WRUNUKEVYQlVTX0FUQSwgMHg5NDApLAorCUlOVENfVkVDVChTUEkwLCAweDk2MCksIElOVENfVkVDVChTUEkxLCAweDk4MCksCisJSU5UQ19WRUNUKFNDSUYwODksIDB4OWEwKSwgSU5UQ19WRUNUKFNDSUYxMjM0LCAweDljMCksCisJSU5UQ19WRUNUKFNDSUYxMjM0LCAweDllMCksIElOVENfVkVDVChTQ0lGMTIzNCwgMHhhMDApLAorCUlOVENfVkVDVChTQ0lGMTIzNCwgMHhhMjApLCBJTlRDX1ZFQ1QoU0NJRjU2NywgMHhhNDApLAorCUlOVENfVkVDVChTQ0lGNTY3LCAweGE2MCksIElOVENfVkVDVChTQ0lGNTY3LCAweGE4MCksCisJSU5UQ19WRUNUKFNDSUYwODksIDB4YWEwKSwgSU5UQ19WRUNUKFNDSUYwODksIDB4YWMwKSwKKwlJTlRDX1ZFQ1QoQURDLCAweGIyMCksCisJSU5UQ19WRUNUKEJCRE1BQ18wXzMsIDB4YmEwKSwgSU5UQ19WRUNUKEJCRE1BQ18wXzMsIDB4YmMwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzBfMywgMHhiZTApLCBJTlRDX1ZFQ1QoQkJETUFDXzBfMywgMHhjMDApLAorCUlOVENfVkVDVChCQkRNQUNfNF83LCAweGMyMCksIElOVENfVkVDVChCQkRNQUNfNF83LCAweGM0MCksCisJSU5UQ19WRUNUKEJCRE1BQ180XzcsIDB4YzYwKSwgSU5UQ19WRUNUKEJCRE1BQ180XzcsIDB4YzgwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzhfMTAsIDB4Y2EwKSwgSU5UQ19WRUNUKEJCRE1BQ184XzEwLCAweGNjMCksCisJSU5UQ19WRUNUKEJCRE1BQ184XzEwLCAweGNlMCksIElOVENfVkVDVChCQkRNQUNfMTFfMTQsIDB4ZDAwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzExXzE0LCAweGQyMCksIElOVENfVkVDVChCQkRNQUNfMTFfMTQsIDB4ZDQwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzExXzE0LCAweGQ2MCksIElOVENfVkVDVChCQkRNQUNfMTVfMTgsIDB4ZDgwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzE1XzE4LCAweGRhMCksIElOVENfVkVDVChCQkRNQUNfMTVfMTgsIDB4ZGMwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzE1XzE4LCAweGRlMCksIElOVENfVkVDVChCQkRNQUNfMTlfMjIsIDB4ZTAwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzE5XzIyLCAweGUyMCksIElOVENfVkVDVChCQkRNQUNfMTlfMjIsIDB4ZTQwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzE5XzIyLCAweGU2MCksIElOVENfVkVDVChCQkRNQUNfMjNfMjYsIDB4ZTgwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzIzXzI2LCAweGVhMCksIElOVENfVkVDVChCQkRNQUNfMjNfMjYsIDB4ZWMwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzIzXzI2LCAweGVlMCksIElOVENfVkVDVChCQkRNQUNfMjcsIDB4ZjAwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzI4LCAweGYyMCksIElOVENfVkVDVChCQkRNQUNfMjksIDB4ZjQwKSwKKwlJTlRDX1ZFQ1QoQkJETUFDXzMwLCAweGY2MCksIElOVENfVkVDVChCQkRNQUNfMzEsIDB4ZjgwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50Y19ncm91cCBncm91cHNbXSBfX2luaXRkYXRhID0geworCUlOVENfR1JPVVAoVE1VLCBUTVUwLCBUTVUxLCBUTVUyLCBUTVUyX1RJQ1BJLCBUTVUzLCBUTVU0LCBUTVU1LAorCQkgICBUTVU1X1RJQ1BJLCBUTVU2LCBUTVU3LCBUTVU4KSwKKwlJTlRDX0dST1VQKERNQUMsIERNQUMwX0RNSU5UMCwgRE1BQzBfRE1JTlQxLCBETUFDMF9ETUlOVDIpLAorCUlOVENfR1JPVVAoSTJTLCBJMlMwLCBJMlMxLCBJMlMyLCBJMlMzKSwKKwlJTlRDX0dST1VQKFNSQywgU1JDX1JYLCBTUkNfVFgsIFNSQ19TUERJRiksCisJSU5UQ19HUk9VUChHRlgzRCwgR0ZYM0RfTUJYLCBHRlgzRF9ETUFDKSwKKwlJTlRDX0dST1VQKFNQSSwgU1BJMCwgU1BJMSksCisJSU5UQ19HUk9VUChTQ0lGLCBTQ0lGMDg5LCBTQ0lGMTIzNCwgU0NJRjU2NyksCisJSU5UQ19HUk9VUChCQkRNQUMsCisJCSAgIEJCRE1BQ18wXzMsIEJCRE1BQ180XzcsIEJCRE1BQ184XzEwLCBCQkRNQUNfMTFfMTQsCisJCSAgIEJCRE1BQ18xNV8xOCwgQkJETUFDXzE5XzIyLCBCQkRNQUNfMjNfMjYsIEJCRE1BQ18yNywKKwkJICAgQkJETUFDXzI4LCBCQkRNQUNfMjksIEJCRE1BQ18zMCwgQkJETUFDXzMxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBtYXNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CisJeyAweGZmZTAwMDQwLCAweGZmZTAwMDQ0LCAzMiwgLyogSU5UMk1TS1IgLyBJTlQyTVNLQ1IgKi8KKwkgIHsgMCwgQkJETUFDLCBBREMsIFNDSUYsIFNQSSwgRVhCVVNfQVRBLCBHRlgzRCwgR0ZYMkQsCisJICAgIEdQUywgQ0FOLCBBVEFQSSwgVVNCLCBZVVYsIFJFTU9URSwgVklERU9fSU4sIERVLCBTUkMsIEkyUywKKwkgICAgRE1BQywgSTJDLCBIVURJLCBTUERJRiwgSVBJLCBIQUMsIFRNVSwgR1BJTyB9IH0sCit9OworCitzdGF0aWMgc3RydWN0IGludGNfcHJpb19yZWcgcHJpb19yZWdpc3RlcnNbXSBfX2luaXRkYXRhID0geworCXsgMHhmZmUwMDAwMCwgMCwgMzIsIDgsIC8qIElOVDJQUkkwICovIHsgR1BJTywgVE1VMCwgMCwgSEFDIH0gfSwKKwl7IDB4ZmZlMDAwMDQsIDAsIDMyLCA4LCAvKiBJTlQyUFJJMSAqLyB7IElQSSwgU1BESUYsIEhVREksIEkyQyB9IH0sCisJeyAweGZmZTAwMDA4LCAwLCAzMiwgOCwgLyogSU5UMlBSSTIgKi8geyBETUFDLCBJMlMsIFNSQywgRFUgfSB9LAorCXsgMHhmZmUwMDAwYywgMCwgMzIsIDgsIC8qIElOVDJQUkkzICovIHsgVklERU9fSU4sIFJFTU9URSwgWVVWLCBVU0IgfSB9LAorCXsgMHhmZmUwMDAxMCwgMCwgMzIsIDgsIC8qIElOVDJQUkk0ICovIHsgQVRBUEksIENBTiwgR1BTLCBHRlgyRCB9IH0sCisJeyAweGZmZTAwMDE0LCAwLCAzMiwgOCwgLyogSU5UMlBSSTUgKi8geyAwLCBHRlgzRCwgRVhCVVNfQVRBLCBTUEkgfSB9LAorCXsgMHhmZmUwMDAxOCwgMCwgMzIsIDgsIC8qIElOVDJQUkk2ICovIHsgU0NJRjEyMzQsIFNDSUY1NjcsIFNDSUYwODkgfSB9LAorCXsgMHhmZmUwMDAxYywgMCwgMzIsIDgsIC8qIElOVDJQUkk3ICovIHsgQURDLCAwLCAwLCBCQkRNQUNfMF8zIH0gfSwKKwl7IDB4ZmZlMDAwMjAsIDAsIDMyLCA4LCAvKiBJTlQyUFJJOCAqLworCSAgeyBCQkRNQUNfNF83LCBCQkRNQUNfOF8xMCwgQkJETUFDXzExXzE0LCBCQkRNQUNfMTVfMTggfSB9LAorCXsgMHhmZmUwMDAyNCwgMCwgMzIsIDgsIC8qIElOVDJQUkk5ICovCisJICB7IEJCRE1BQ18xOV8yMiwgQkJETUFDXzIzXzI2LCBCQkRNQUNfMjcsIEJCRE1BQ18yOCB9IH0sCisJeyAweGZmZTAwMDI4LCAwLCAzMiwgOCwgLyogSU5UMlBSSTEwICovCisJICB7IEJCRE1BQ18yOSwgQkJETUFDXzMwLCBCQkRNQUNfMzEgfSB9LAorCXsgMHhmZmUwMDAyYywgMCwgMzIsIDgsIC8qIElOVDJQUkkxMSAqLworCSAgeyBUTVUxLCBUTVUyLCBUTVUyX1RJQ1BJLCBUTVUzIH0gfSwKKwl7IDB4ZmZlMDAwMzAsIDAsIDMyLCA4LCAvKiBJTlQyUFJJMTIgKi8KKwkgIHsgVE1VNCwgVE1VNSwgVE1VNV9USUNQSSwgVE1VNiB9IH0sCisJeyAweGZmZTAwMDM0LCAwLCAzMiwgOCwgLyogSU5UMlBSSTEzICovCisJICB7IFRNVTcsIFRNVTggfSB9LAorfTsKKworc3RhdGljIERFQ0xBUkVfSU5UQ19ERVNDKGludGNfZGVzYywgInNoNzc3MCIsIHZlY3RvcnMsIGdyb3VwcywKKwkJCSBtYXNrX3JlZ2lzdGVycywgcHJpb19yZWdpc3RlcnMsIE5VTEwpOworCisvKiBTdXBwb3J0IGZvciBleHRlcm5hbCBpbnRlcnJ1cHQgcGlucyBpbiBJUlEgbW9kZSAqLworc3RhdGljIHN0cnVjdCBpbnRjX3ZlY3QgaXJxX3ZlY3RvcnNbXSBfX2luaXRkYXRhID0geworCUlOVENfVkVDVChJUlEwLCAweDI0MCksIElOVENfVkVDVChJUlExLCAweDI4MCksCisJSU5UQ19WRUNUKElSUTIsIDB4MmMwKSwgSU5UQ19WRUNUKElSUTMsIDB4MzAwKSwKKwlJTlRDX1ZFQ1QoSVJRNCwgMHgzNDApLCBJTlRDX1ZFQ1QoSVJRNSwgMHgzODApLAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRjX21hc2tfcmVnIGlycV9tYXNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CisJeyAweGZmZDAwMDQ0LCAweGZmZDAwMDY0LCAzMiwgLyogSU5UTVNLMCAvIElOVE1TS0NMUjAgKi8KKwkgIHsgSVJRMCwgSVJRMSwgSVJRMiwgSVJRMywgSVJRNCwgSVJRNSwgfSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBpbnRjX3ByaW9fcmVnIGlycV9wcmlvX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CisJeyAweGZmZDAwMDEwLCAwLCAzMiwgNCwgLyogSU5UUFJJICovIHsgSVJRMCwgSVJRMSwgSVJRMiwgSVJRMywKKwkJCQkJICAgICAgIElSUTQsIElSUTUsIH0gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50Y19zZW5zZV9yZWcgaXJxX3NlbnNlX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CisJeyAweGZmZDAwMDFjLCAzMiwgMiwgLyogSUNSMSAqLyAgIHsgSVJRMCwgSVJRMSwgSVJRMiwgSVJRMywKKwkJCQkJICAgIElSUTQsIElSUTUsIH0gfSwKK307CisKK3N0YXRpYyBERUNMQVJFX0lOVENfREVTQyhpbnRjX2lycV9kZXNjLCAic2g3NzcwLWlycSIsIGlycV92ZWN0b3JzLAorCQkJIE5VTEwsIGlycV9tYXNrX3JlZ2lzdGVycywgaXJxX3ByaW9fcmVnaXN0ZXJzLAorCQkJIGlycV9zZW5zZV9yZWdpc3RlcnMpOworCisvKiBFeHRlcm5hbCBpbnRlcnJ1cHQgcGlucyBpbiBJUkwgbW9kZSAqLworc3RhdGljIHN0cnVjdCBpbnRjX3ZlY3QgaXJsX3ZlY3RvcnNbXSBfX2luaXRkYXRhID0geworCUlOVENfVkVDVChJUkxfTExMTCwgMHgyMDApLCBJTlRDX1ZFQ1QoSVJMX0xMTEgsIDB4MjIwKSwKKwlJTlRDX1ZFQ1QoSVJMX0xMSEwsIDB4MjQwKSwgSU5UQ19WRUNUKElSTF9MTEhILCAweDI2MCksCisJSU5UQ19WRUNUKElSTF9MSExMLCAweDI4MCksIElOVENfVkVDVChJUkxfTEhMSCwgMHgyYTApLAorCUlOVENfVkVDVChJUkxfTEhITCwgMHgyYzApLCBJTlRDX1ZFQ1QoSVJMX0xISEgsIDB4MmUwKSwKKwlJTlRDX1ZFQ1QoSVJMX0hMTEwsIDB4MzAwKSwgSU5UQ19WRUNUKElSTF9ITExILCAweDMyMCksCisJSU5UQ19WRUNUKElSTF9ITEhMLCAweDM0MCksIElOVENfVkVDVChJUkxfSExISCwgMHgzNjApLAorCUlOVENfVkVDVChJUkxfSEhMTCwgMHgzODApLCBJTlRDX1ZFQ1QoSVJMX0hITEgsIDB4M2EwKSwKKwlJTlRDX1ZFQ1QoSVJMX0hISEwsIDB4M2MwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW50Y19tYXNrX3JlZyBpcmwzMjEwX21hc2tfcmVnaXN0ZXJzW10gX19pbml0ZGF0YSA9IHsKKwl7IDB4ZmZkNDAwODAsIDB4ZmZkNDAwODQsIDMyLCAvKiBJTlRNU0syIC8gSU5UTVNLQ0xSMiAqLworCSAgeyBJUkxfTExMTCwgSVJMX0xMTEgsIElSTF9MTEhMLCBJUkxfTExISCwKKwkgICAgSVJMX0xITEwsIElSTF9MSExILCBJUkxfTEhITCwgSVJMX0xISEgsCisJICAgIElSTF9ITExMLCBJUkxfSExMSCwgSVJMX0hMSEwsIElSTF9ITEhILAorCSAgICBJUkxfSEhMTCwgSVJMX0hITEgsIElSTF9ISEhMLCB9IH0sCit9OworCitzdGF0aWMgc3RydWN0IGludGNfbWFza19yZWcgaXJsNzY1NF9tYXNrX3JlZ2lzdGVyc1tdIF9faW5pdGRhdGEgPSB7CisJeyAweGZmZDQwMDgwLCAweGZmZDQwMDg0LCAzMiwgLyogSU5UTVNLMiAvIElOVE1TS0NMUjIgKi8KKwkgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkgICAgSVJMX0xMTEwsIElSTF9MTExILCBJUkxfTExITCwgSVJMX0xMSEgsCisJICAgIElSTF9MSExMLCBJUkxfTEhMSCwgSVJMX0xISEwsIElSTF9MSEhILAorCSAgICBJUkxfSExMTCwgSVJMX0hMTEgsIElSTF9ITEhMLCBJUkxfSExISCwKKwkgICAgSVJMX0hITEwsIElSTF9ISExILCBJUkxfSEhITCwgfSB9LAorfTsKKworc3RhdGljIERFQ0xBUkVfSU5UQ19ERVNDKGludGNfaXJsNzY1NF9kZXNjLCAic2g3NzgwLWlybDc2NTQiLCBpcmxfdmVjdG9ycywKKwkJCSBOVUxMLCBpcmw3NjU0X21hc2tfcmVnaXN0ZXJzLCBOVUxMLCBOVUxMKTsKKworc3RhdGljIERFQ0xBUkVfSU5UQ19ERVNDKGludGNfaXJsMzIxMF9kZXNjLCAic2g3NzgwLWlybDMyMTAiLCBpcmxfdmVjdG9ycywKKwkJCSBOVUxMLCBpcmwzMjEwX21hc2tfcmVnaXN0ZXJzLCBOVUxMLCBOVUxMKTsKKworI2RlZmluZSBJTlRDX0lDUjAJMHhmZmQwMDAwMAorI2RlZmluZSBJTlRDX0lOVE1TSzAJMHhmZmQwMDA0NAorI2RlZmluZSBJTlRDX0lOVE1TSzEJMHhmZmQwMDA0OAorI2RlZmluZSBJTlRDX0lOVE1TSzIJMHhmZmQ0MDA4MAorI2RlZmluZSBJTlRDX0lOVE1TS0NMUjEJMHhmZmQwMDA2OAorI2RlZmluZSBJTlRDX0lOVE1TS0NMUjIJMHhmZmQ0MDA4NAorCiB2b2lkIF9faW5pdCBwbGF0X2lycV9zZXR1cCh2b2lkKQogeworCS8qIGRpc2FibGUgSVJRNy0wICovCisJY3RybF9vdXRsKDB4ZmYwMDAwMDAsIElOVENfSU5UTVNLMCk7CisKKwkvKiBkaXNhYmxlIElSTDMtMCArIElSTDctNCAqLworCWN0cmxfb3V0bCgweGMwMDAwMDAwLCBJTlRDX0lOVE1TSzEpOworCWN0cmxfb3V0bCgweGZmZmVmZmZlLCBJTlRDX0lOVE1TSzIpOworCisJLyogc2VsZWN0IElSTCBtb2RlIGZvciBJUkwzLTAgKyBJUkw3LTQgKi8KKwljdHJsX291dGwoY3RybF9pbmwoSU5UQ19JQ1IwKSAmIH4weDAwYzAwMDAwLCBJTlRDX0lDUjApOworCisJLyogZGlzYWJsZSBob2xkaW5nIGZ1bmN0aW9uLCBpZSBlbmFibGUgIlNILTQgTW9kZSIgKi8KKwljdHJsX291dGwoY3RybF9pbmwoSU5UQ19JQ1IwKSB8IDB4MDAyMDAwMDAsIElOVENfSUNSMCk7CisKKwlyZWdpc3Rlcl9pbnRjX2NvbnRyb2xsZXIoJmludGNfZGVzYyk7Cit9CisKK3ZvaWQgX19pbml0IHBsYXRfaXJxX3NldHVwX3BpbnMoaW50IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBJUlFfTU9ERV9JUlE6CisJCS8qIHNlbGVjdCBJUlEgbW9kZSBmb3IgSVJMMy0wICsgSVJMNy00ICovCisJCWN0cmxfb3V0bChjdHJsX2lubChJTlRDX0lDUjApIHwgMHgwMGMwMDAwMCwgSU5UQ19JQ1IwKTsKKwkJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX2lycV9kZXNjKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfTU9ERV9JUkw3NjU0OgorCQkvKiBlbmFibGUgSVJMNy00IGJ1dCBkb24ndCBwcm92aWRlIGFueSBtYXNraW5nICovCisJCWN0cmxfb3V0bCgweDQwMDAwMDAwLCBJTlRDX0lOVE1TS0NMUjEpOworCQljdHJsX291dGwoMHgwMDAwZmZmZSwgSU5UQ19JTlRNU0tDTFIyKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfTU9ERV9JUkwzMjEwOgorCQkvKiBlbmFibGUgSVJMMC0zIGJ1dCBkb24ndCBwcm92aWRlIGFueSBtYXNraW5nICovCisJCWN0cmxfb3V0bCgweDgwMDAwMDAwLCBJTlRDX0lOVE1TS0NMUjEpOworCQljdHJsX291dGwoMHhmZmZlMDAwMCwgSU5UQ19JTlRNU0tDTFIyKTsKKwkJYnJlYWs7CisJY2FzZSBJUlFfTU9ERV9JUkw3NjU0X01BU0s6CisJCS8qIGVuYWJsZSBJUkw3LTQgYW5kIG1hc2sgdXNpbmcgY3B1IGludGMgY29udHJvbGxlciAqLworCQljdHJsX291dGwoMHg0MDAwMDAwMCwgSU5UQ19JTlRNU0tDTFIxKTsKKwkJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX2lybDc2NTRfZGVzYyk7CisJCWJyZWFrOworCWNhc2UgSVJRX01PREVfSVJMMzIxMF9NQVNLOgorCQkvKiBlbmFibGUgSVJMMC0zIGFuZCBtYXNrIHVzaW5nIGNwdSBpbnRjIGNvbnRyb2xsZXIgKi8KKwkJY3RybF9vdXRsKDB4ODAwMDAwMDAsIElOVENfSU5UTVNLQ0xSMSk7CisJCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y19pcmwzMjEwX2Rlc2MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCmluZGV4IDZmNzIyN2MuLjcxNWUwNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCkBAIC0xMiw2ICsxMiwxODkgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgorCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUwX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAwOCwKKwkJLmVuZAk9IDB4ZmZkODAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAyOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKKwkuY2xvY2tzb3VyY2VfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUxX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMSIsCisJCS5zdGFydAk9IDB4ZmZkODAwMTQsCisJCS5lbmQJPSAweGZmZDgwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMjksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUxX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUxX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUxX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11Ml9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTIiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTJfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUyIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAyMCwKKwkJLmVuZAk9IDB4ZmZkODAwMmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAzMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTJfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTJfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTJfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUyX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUzX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMyIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgwNCwKKwkudGltZXJfYml0ID0gMCwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11M19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTMiLAorCQkuc3RhcnQJPSAweGZmZGMwMDA4LAorCQkuZW5kCT0gMHhmZmRjMDAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDk2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11M19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11M19wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11M19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTNfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVU0IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VNCIsCisJCS5zdGFydAk9IDB4ZmZkYzAwMTQsCisJCS5lbmQJPSAweGZmZGMwMDFmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gOTcsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU0X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gNCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU0X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU0X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11NF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11NV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTUiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTVfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU1IiwKKwkJLnN0YXJ0CT0gMHhmZmRjMDAyMCwKKwkJLmVuZAk9IDB4ZmZkYzAwMmIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA5OCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTVfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA1LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTVfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTVfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU1X3Jlc291cmNlcyksCit9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CkBAIC01OCw2ICsyNDEsMTIgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3ODBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCisJJnRtdTNfZGV2aWNlLAorCSZ0bXU0X2RldmljZSwKKwkmdG11NV9kZXZpY2UsCiAJJnJ0Y19kZXZpY2UsCiAJJnNjaV9kZXZpY2UsCiB9OwpAQCAtNjksNiArMjU4LDIxIEBACiB9CiBfX2luaXRjYWxsKHNoNzc4MF9kZXZpY2VzX3NldHVwKTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc4MF9lYXJseV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmdG11MF9kZXZpY2UsCisJJnRtdTFfZGV2aWNlLAorCSZ0bXUyX2RldmljZSwKKwkmdG11M19kZXZpY2UsCisJJnRtdTRfZGV2aWNlLAorCSZ0bXU1X2RldmljZSwKK307CisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzgwX2Vhcmx5X2RldmljZXMsCisJCQkJICAgQVJSQVlfU0laRShzaDc3ODBfZWFybHlfZGV2aWNlcykpOworfQorCiBlbnVtIHsKIAlVTlVTRUQgPSAwLAogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCmluZGV4IGQ4MDgwMmEuLmFmNTYxNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jCkBAIC0xMywzOSArMTMsMjI4IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJ0bXUwMTJfZmNrIiwKKwkuY2xvY2tldmVudF9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTBfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUwIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAwOCwKKwkJLmVuZAk9IDB4ZmZkODAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAyOCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTBfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTBfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUwX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInRtdTAxMl9mY2siLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUxIiwKKwkJLnN0YXJ0CT0gMHhmZmQ4MDAxNCwKKwkJLmVuZAk9IDB4ZmZkODAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAyOSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUyX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInRtdTAxMl9mY2siLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMiIsCisJCS5zdGFydAk9IDB4ZmZkODAwMjAsCisJCS5lbmQJPSAweGZmZDgwMDJmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMzAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUyX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUyX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11Ml9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11M19wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTMiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJ0bXUzNDVfZmNrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11M19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTMiLAorCQkuc3RhcnQJPSAweGZmZGMwMDA4LAorCQkuZW5kCT0gMHhmZmRjMDAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDk2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11M19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDMsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11M19wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11M19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTNfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTRfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVU0IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAidG11MzQ1X2ZjayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU0IiwKKwkJLnN0YXJ0CT0gMHhmZmRjMDAxNCwKKwkJLmVuZAk9IDB4ZmZkYzAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA5NywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTRfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA0LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTRfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTRfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU0X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXU1X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VNSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInRtdTM0NV9mY2siLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU1X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VNSIsCisJCS5zdGFydAk9IDB4ZmZkYzAwMjAsCisJCS5lbmQJPSAweGZmZGMwMDJiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gOTgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU1X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gNSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU1X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU1X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11NV9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CiAJewogCQkubWFwYmFzZQk9IDB4ZmZlYTAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCQkuaXJxcwkJPSB7IDQwLCA0MCwgNDAsIDQwIH0sCisJCS5jbGsJCT0gInNjaWZfZmNrIiwKIAl9LCB7CiAJCS5tYXBiYXNlCT0gMHhmZmViMDAwMCwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkudHlwZQkJPSBQT1JUX1NDSUYsCiAJCS5pcnFzCQk9IHsgNDQsIDQ0LCA0NCwgNDQgfSwKKwkJLmNsawkJPSAic2NpZl9mY2siLAogCX0sIHsKIAkJLm1hcGJhc2UJPSAweGZmZWMwMDAwLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkJLmlycXMJCT0geyA2MCwgNjAsIDYwLCA2MCB9LAorCQkuY2xrCQk9ICJzY2lmX2ZjayIsCiAJfSwgewogCQkubWFwYmFzZQk9IDB4ZmZlZDAwMDAsCiAJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCQkuaXJxcwkJPSB7IDYxLCA2MSwgNjEsIDYxIH0sCisJCS5jbGsJCT0gInNjaWZfZmNrIiwKIAl9LCB7CiAJCS5tYXBiYXNlCT0gMHhmZmVlMDAwMCwKIAkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCQkudHlwZQkJPSBQT1JUX1NDSUYsCiAJCS5pcnFzCQk9IHsgNjIsIDYyLCA2MiwgNjIgfSwKKwkJLmNsawkJPSAic2NpZl9mY2siLAogCX0sIHsKIAkJLm1hcGJhc2UJPSAweGZmZWYwMDAwLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkJLmlycXMJCT0geyA2MywgNjMsIDYzLCA2MyB9LAorCQkuY2xrCQk9ICJzY2lmX2ZjayIsCiAJfSwgewogCQkuZmxhZ3MgPSAwLAogCX0KQEAgLTYwLDYgKzI0OSwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc4NV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmdG11MF9kZXZpY2UsCisJJnRtdTFfZGV2aWNlLAorCSZ0bXUyX2RldmljZSwKKwkmdG11M19kZXZpY2UsCisJJnRtdTRfZGV2aWNlLAorCSZ0bXU1X2RldmljZSwKIAkmc2NpX2RldmljZSwKIH07CiAKQEAgLTcwLDYgKzI2NSwyMSBAQAogfQogX19pbml0Y2FsbChzaDc3ODVfZGV2aWNlc19zZXR1cCk7CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3ODVfZWFybHlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnRtdTBfZGV2aWNlLAorCSZ0bXUxX2RldmljZSwKKwkmdG11Ml9kZXZpY2UsCisJJnRtdTNfZGV2aWNlLAorCSZ0bXU0X2RldmljZSwKKwkmdG11NV9kZXZpY2UsCit9OworCit2b2lkIF9faW5pdCBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQoreworCWVhcmx5X3BsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzc4NV9lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2g3Nzg1X2Vhcmx5X2RldmljZXMpKTsKK30KKwogZW51bSB7CiAJVU5VU0VEID0gMCwKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg2LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODYuYwppbmRleCA5MGU4Y2ZmLi45M2UwZDJjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODYuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODYuYwpAQCAtMyw2ICszLDcgQEAKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCiAgKiBLdW5pbm9yaSBNb3JpbW90byA8bW9yaW1vdG8ua3VuaW5vcmlAcmVuZXNhcy5jb20+CisgKiBQYXVsIE11bmR0IDxwYXVsLm11bmR0QHJlbmVzYXMuY29tPgogICoKICAqIEJhc2VkIG9uIFNINzc4NSBTZXR1cAogICoKQEAgLTE5LDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CkBAIC02OSw2ICs3MSwzNjggQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMCIsCisJCS5zdGFydAk9IDB4ZmZkODAwMDgsCisJCS5lbmQJPSAweGZmZDgwMDEzLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUwX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTEiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MTAsCisJLnRpbWVyX2JpdCA9IDEsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2Nrc291cmNlX3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTEiLAorCQkuc3RhcnQJPSAweGZmZDgwMDE0LAorCQkuZW5kCT0gMHhmZmQ4MDAxZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE3LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTJfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUyIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDFjLAorCS50aW1lcl9iaXQgPSAyLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMiIsCisJCS5zdGFydAk9IDB4ZmZkODAwMjAsCisJCS5lbmQJPSAweGZmZDgwMDJmLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUyX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUyX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11Ml9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11M19wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTMiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTNfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUzIiwKKwkJLnN0YXJ0CT0gMHhmZmRhMDAwOCwKKwkJLmVuZAk9IDB4ZmZkYTAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAyMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAzLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTNfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTNfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUzX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXU0X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VNCIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11NF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTQiLAorCQkuc3RhcnQJPSAweGZmZGEwMDE0LAorCQkuZW5kCT0gMHhmZmRhMDAxZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDIxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11NF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDQsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11NF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11NF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTRfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTVfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVU1IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDFjLAorCS50aW1lcl9iaXQgPSAyLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU1X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VNSIsCisJCS5zdGFydAk9IDB4ZmZkYTAwMjAsCisJCS5lbmQJPSAweGZmZGEwMDJiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMjIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU1X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gNSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU1X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU1X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11NV9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11Nl9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTYiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTZfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU2IiwKKwkJLnN0YXJ0CT0gMHhmZmRjMDAwOCwKKwkJLmVuZAk9IDB4ZmZkYzAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA0NSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTZfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA2LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTZfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTZfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU2X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXU3X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VNyIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMSwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11N19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTciLAorCQkuc3RhcnQJPSAweGZmZGMwMDE0LAorCQkuZW5kCT0gMHhmZmRjMDAxZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDQ1LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11N19kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDcsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11N19wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11N19yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTdfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdThfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVU4IiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDFjLAorCS50aW1lcl9iaXQgPSAyLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXU4X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VOCIsCisJCS5zdGFydAk9IDB4ZmZkYzAwMjAsCisJCS5lbmQJPSAweGZmZGMwMDJiLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gNDUsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXU4X2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gOCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXU4X3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXU4X3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11OF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11OV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTkiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTlfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU5IiwKKwkJLnN0YXJ0CT0gMHhmZmRlMDAwOCwKKwkJLmVuZAk9IDB4ZmZkZTAwMTMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA0NiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTlfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA5LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTlfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTlfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU5X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUxMF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTEwIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUxMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTEwIiwKKwkJLnN0YXJ0CT0gMHhmZmRlMDAxNCwKKwkJLmVuZAk9IDB4ZmZkZTAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA0NiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTEwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMTAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MTBfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTEwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MTBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTExX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMTEiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MWMsCisJLnRpbWVyX2JpdCA9IDIsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTExX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMTEiLAorCQkuc3RhcnQJPSAweGZmZGUwMDIwLAorCQkuZW5kCT0gMHhmZmRlMDAyYiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDQ2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxMSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUxMV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxMV9yZXNvdXJjZXMpLAorfTsKKwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1c2Jfb2hjaV9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CiAJCS5zdGFydAk9IDB4ZmZlNzA0MDAsCkBAIC05NCw2ICs0NTgsMjEgQEAKIAkucmVzb3VyY2UJPSB1c2Jfb2hjaV9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3Nzg2X2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorCSZ0bXUzX2RldmljZSwKKwkmdG11NF9kZXZpY2UsCisJJnRtdTVfZGV2aWNlLAorCSZ0bXU2X2RldmljZSwKKwkmdG11N19kZXZpY2UsCisJJnRtdThfZGV2aWNlLAorCSZ0bXU5X2RldmljZSwKKwkmdG11MTBfZGV2aWNlLAorCSZ0bXUxMV9kZXZpY2UsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3Nzg2X2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzY2lfZGV2aWNlLAogCSZ1c2Jfb2hjaV9kZXZpY2UsCkBAIC0xNTYsMTIgKzUzNSwyNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzaDc3ODZfZGV2aWNlc19zZXR1cCh2b2lkKQogeworCWludCByZXQ7CisKIAlzaDc3ODZfdXNiX3NldHVwKCk7CisKKwlyZXQgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3ODZfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzc4Nl9lYXJseV9kZXZpY2VzKSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKwogCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3ODZfZGV2aWNlcywKIAkJCQkgICAgQVJSQVlfU0laRShzaDc3ODZfZGV2aWNlcykpOwogfQogZGV2aWNlX2luaXRjYWxsKHNoNzc4Nl9kZXZpY2VzX3NldHVwKTsKIAordm9pZCBfX2luaXQgcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAodm9pZCkKK3sKKwllYXJseV9wbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3ODZfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNzc4Nl9lYXJseV9kZXZpY2VzKSk7Cit9CisKIGVudW0gewogCVVOVVNFRCA9IDAsCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoeDMuYwppbmRleCBiZDM1ZjMyNTMuLjUzYzY1ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoeDMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaHgzLmMKQEAgLTEsNyArMSw3IEBACiAvKgotICogU0gtWDMgU2V0dXAKKyAqIFNILVgzIFByb3RvdHlwZSBTZXR1cAogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDcgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDcgLSAyMDA5ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEyLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9tbXpvbmUuaD4KIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CkBAIC00OCwxNyArNDksMjIxIEBACiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTBfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUwIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDA0LAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja2V2ZW50X3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTAiLAorCQkuc3RhcnQJPSAweGZmYzEwMDA4LAorCQkuZW5kCT0gMHhmZmMxMDAxMywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE2LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDAsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MF9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MF9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTBfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTFfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUxIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDEwLAorCS50aW1lcl9iaXQgPSAxLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorCS5jbG9ja3NvdXJjZV9yYXRpbmcgPSAyMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVUxIiwKKwkJLnN0YXJ0CT0gMHhmZmMxMDAxNCwKKwkJLmVuZAk9IDB4ZmZjMTAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAxNywKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTFfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSAxLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTFfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTFfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXUxX3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXUyX3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VMiIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11Ml9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTIiLAorCQkuc3RhcnQJPSAweGZmYzEwMDIwLAorCQkuZW5kCT0gMHhmZmMxMDAyZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDE4LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11Ml9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11Ml9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11Ml9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTJfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTNfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUzIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDA0LAorCS50aW1lcl9iaXQgPSAwLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUzX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMyIsCisJCS5zdGFydAk9IDB4ZmZjMjAwMDgsCisJCS5lbmQJPSAweGZmYzIwMDEzLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gMTksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUzX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMywKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUzX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUzX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11M19yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11NF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTQiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MTAsCisJLnRpbWVyX2JpdCA9IDEsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRtdTRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUTVU0IiwKKwkJLnN0YXJ0CT0gMHhmZmMyMDAxNCwKKwkJLmVuZAk9IDB4ZmZjMjAwMWYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSAyMCwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHRtdTRfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaF90bXUiLAorCS5pZAkJPSA0LAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnRtdTRfcGxhdGZvcm1fZGF0YSwKKwl9LAorCS5yZXNvdXJjZQk9IHRtdTRfcmVzb3VyY2VzLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0bXU0X3Jlc291cmNlcyksCit9OworCitzdGF0aWMgc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB0bXU1X3BsYXRmb3JtX2RhdGEgPSB7CisJLm5hbWUgPSAiVE1VNSIsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxYywKKwkudGltZXJfYml0ID0gMiwKKwkuY2xrID0gInBlcmlwaGVyYWxfY2xrIiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11NV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTUiLAorCQkuc3RhcnQJPSAweGZmYzIwMDIwLAorCQkuZW5kCT0gMHhmZmMyMDAyYiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IDIxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11NV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDUsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11NV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11NV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTVfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaHgzX2Vhcmx5X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZ0bXUwX2RldmljZSwKKwkmdG11MV9kZXZpY2UsCisJJnRtdTJfZGV2aWNlLAorCSZ0bXUzX2RldmljZSwKKwkmdG11NF9kZXZpY2UsCisJJnRtdTVfZGV2aWNlLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoeDNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnNjaV9kZXZpY2UsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzaHgzX2RldmljZXNfc2V0dXAodm9pZCkKIHsKKwlpbnQgcmV0OworCisJcmV0ID0gcGxhdGZvcm1fYWRkX2RldmljZXMoc2h4M19lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2h4M19lYXJseV9kZXZpY2VzKSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKwogCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaHgzX2RldmljZXMsCiAJCQkJICAgIEFSUkFZX1NJWkUoc2h4M19kZXZpY2VzKSk7CiB9CiBfX2luaXRjYWxsKHNoeDNfZGV2aWNlc19zZXR1cCk7CiAKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoc2h4M19lYXJseV9kZXZpY2VzLAorCQkJCSAgIEFSUkFZX1NJWkUoc2h4M19lYXJseV9kZXZpY2VzKSk7Cit9CisKIGVudW0gewogCVVOVVNFRCA9IDAsCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L01ha2VmaWxlCmluZGV4IGNlNDYwMmUuLmExODRhMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNS9NYWtlZmlsZQpAQCAtNiw2ICs2LDkgQEAKIG9iai0kKENPTkZJR19TSF9GUFUpCQkrPSBmcHUubwogb2JqLSQoQ09ORklHX0tBTExTWU1TKQkJKz0gdW53aW5kLm8KIAorIyBDUFUgc3VidHlwZSBzZXR1cAorb2JqLSQoQ09ORklHX0NQVV9TSDUpCQkrPSBzZXR1cC1zaDUubworCiAjIFByaW1hcnkgb24tY2hpcCBjbG9ja3MgKGNvbW1vbikKIGNsb2NrLSQoQ09ORklHX0NQVV9TSDUpCQk6PSBjbG9jay1zaDUubwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L2Nsb2NrLXNoNS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNS9jbG9jay1zaDUuYwppbmRleCA1MmM0OTI0Li43Zjg2NGViIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L2Nsb2NrLXNoNS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvY2xvY2stc2g1LmMKQEAgLTMyLDMwICszMiwzMCBAQAogCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKIH07CiAKLXN0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KGNwcmNfYmFzZSkgPj4gMTIpICYgMHgwMDA3OwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX3RhYmxlW2lkeF07CisJcmV0dXJuIGNsay0+cGFyZW50LT5yYXRlIC8gaWZjX3RhYmxlW2lkeF07CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDVfbW9kdWxlX2Nsa19vcHMgPSB7CiAJLnJlY2FsYwkJPSBtb2R1bGVfY2xrX3JlY2FsYywKIH07CiAKLXN0YXRpYyB2b2lkIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJ1c19jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgaWR4ID0gKGN0cmxfaW53KGNwcmNfYmFzZSkgPj4gMykgJiAweDAwMDc7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfdGFibGVbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfdGFibGVbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNV9idXNfY2xrX29wcyA9IHsKIAkucmVjYWxjCQk9IGJ1c19jbGtfcmVjYWxjLAogfTsKIAotc3RhdGljIHZvaWQgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY3B1X2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewogCWludCBpZHggPSAoY3RybF9pbncoY3ByY19iYXNlKSAmIDB4MDAwNyk7Ci0JY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfdGFibGVbaWR4XTsKKwlyZXR1cm4gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfdGFibGVbaWR4XTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNV9jcHVfY2xrX29wcyA9IHsKQEAgLTcxLDcgKzcxLDcgQEAKIAogdm9pZCBfX2luaXQgYXJjaF9pbml0X2Nsa19vcHMoc3RydWN0IGNsa19vcHMgKipvcHMsIGludCBpZHgpCiB7Ci0JY3ByY19iYXNlID0gb25jaGlwX3JlbWFwKENQUkNfQkFTRSwgMTAyNCwgIkNQUkMiKTsKKwljcHJjX2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUoQ1BSQ19CQVNFLCAxMDI0KTsKIAlCVUdfT04oIWNwcmNfYmFzZSk7CiAKIAlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDVfY2xrX29wcykpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L2VudHJ5LlMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L2VudHJ5LlMKaW5kZXggN2U0OWNiOC4uYjBhYWNmNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNS9lbnRyeS5TCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvZW50cnkuUwpAQCAtODEyLDI3ICs4MTIsNiBAQAogCSEgZXhjZXB0aW9ucwogCWFkZAlTUCwgWkVSTywgcjE0CiAKLSNpZmRlZiBDT05GSUdfUE9PUl9NQU5TX1NUUkFDRQotCS8qIFdlJ3ZlIHB1c2hlZCBhbGwgdGhlIHJlZ2lzdGVycyBub3csIHNvIG9ubHkgcjItcjQgaG9sZCBhbnl0aGluZwotCSAqIHVzZWZ1bC4gTW92ZSB0aGVtIGludG8gY2FsbGVlIHNhdmUgcmVnaXN0ZXJzICovCi0Jb3IJcjIsIFpFUk8sIHIyOAotCW9yCXIzLCBaRVJPLCByMjkKLQlvcglyNCwgWkVSTywgcjMwCi0KLQkvKiBQcmVzZXJ2ZSByMiBhcyB0aGUgZXZlbnQgY29kZSAqLwotCW1vdmkJZXZ0X2RlYnVnLCByMwotCW9yaQlyMywgMSwgcjMKLQlwdGFicwlyMywgdHIwCi0KLQlvcglTUCwgWkVSTywgcjYKLQlnZXRjb24JVFJBLCByNQotCWJsaW5rCXRyMCwgTElOSwotCi0Jb3IJcjI4LCBaRVJPLCByMgotCW9yCXIyOSwgWkVSTywgcjMKLQlvcglyMzAsIFpFUk8sIHI0Ci0jZW5kaWYKLQogCS8qIEZvciBzeXNjYWxsIGFuZCBkZWJ1ZyByYWNlIGNvbmRpdGlvbiwgZ2V0IFRSQSBub3cgKi8KIAlnZXRjb24JVFJBLCByNQogCkBAIC04ODcsMTEgKzg2Niw2IEBACiAgKi8KIAkuZ2xvYmFsIHJldF9mcm9tX2lycQogcmV0X2Zyb21faXJxOgotI2lmZGVmIENPTkZJR19QT09SX01BTlNfU1RSQUNFCi0JcHRhCWV2dF9kZWJ1Z19yZXRfZnJvbV9pcnEsIHRyMAotCW9yaQlTUCwgMCwgcjIKLQlibGluawl0cjAsIExJTksKLSNlbmRpZgogCWxkLnEJU1AsIEZSQU1FX1MoRlNTUiksIHI2CiAJc2hscmkJcjYsIDMwLCByNgogCWFuZGkJcjYsIDEsIHI2CkBAIC05MDUsMTIgKzg3OSw2IEBACiByZXRfZnJvbV9leGNlcHRpb246CiAJcHJlZW1wdF9zdG9wKCkKIAotI2lmZGVmIENPTkZJR19QT09SX01BTlNfU1RSQUNFCi0JcHRhCWV2dF9kZWJ1Z19yZXRfZnJvbV9leGMsIHRyMAotCW9yaQlTUCwgMCwgcjIKLQlibGluawl0cjAsIExJTksKLSNlbmRpZgotCiAJbGQucQlTUCwgRlJBTUVfUyhGU1NSKSwgcjYKIAlzaGxyaQlyNiwgMzAsIHI2CiAJYW5kaQlyNiwgMSwgcjYKQEAgLTEyMzYsMTggKzEyMDQsNiBAQAogCS5nbG9iYWwgc3lzY2FsbF9yZXQKIHN5c2NhbGxfcmV0OgogCXN0LnEJU1AsIEZSQU1FX1IoOSksIHIyCS8qIEV4cGVjdGluZyBTUCBiYWNrIHRvIEJBU0lDIGZyYW1lICovCi0KLSNpZmRlZiBDT05GSUdfUE9PUl9NQU5TX1NUUkFDRQotCS8qIG5vdGhpbmcgdXNlZnVsIGluIHJlZ2lzdGVycyBhdCB0aGlzIHBvaW50ICovCi0KLQltb3ZpCWV2dF9kZWJ1ZzIsIHI1Ci0Jb3JpCXI1LCAxLCByNQotCXB0YWJzCXI1LCB0cjAKLQlsZC5xCVNQLCBGUkFNRV9SKDkpLCByMgotCW9yCVNQLCBaRVJPLCByMwotCWJsaW5rCXRyMCwgTElOSwotI2VuZGlmCi0KIAlsZC5xCVNQLCBGUkFNRV9TKEZTUEMpLCByMgogCWFkZGkJcjIsIDQsIHIyCQkvKiBNb3ZlIFBDLCBiZWluZyBwcmUtZXhlY3V0aW9uIGV2ZW50ICovCiAJc3QucQlTUCwgRlJBTUVfUyhGU1BDKSwgcjIKQEAgLTEyNjgsMjUgKzEyMjQsMTIgQEAKIAlwdGFicwlyNSwgdHIwCiAJYmxpbmsJdHIwLCBMSU5LCiAKLSNpZmRlZiBDT05GSUdfUE9PUl9NQU5TX1NUUkFDRQotCS8qIG5vdGhpbmcgdXNlZnVsIGluIHJlZ2lzdGVycyBhdCB0aGlzIHBvaW50ICovCi0KLQltb3ZpCWV2dF9kZWJ1ZzIsIHI1Ci0Jb3JpCXI1LCAxLCByNQotCXB0YWJzCXI1LCB0cjAKLQlsZC5xCVNQLCBGUkFNRV9SKDkpLCByMgotCW9yCVNQLCBaRVJPLCByMwotCWJsaW5rCXRyMCwgTElOSwotI2VuZGlmCi0KIAlsZC5xCVNQLCBGUkFNRV9TKEZTUEMpLCByMgogCWFkZGkJcjIsIDQsIHIyCQkvKiBNb3ZlIFBDLCBiZWluZyBwcmUtZXhlY3V0aW9uIGV2ZW50ICovCiAJc3QucQlTUCwgRlJBTUVfUyhGU1BDKSwgcjIKIAlwdGEJcmV0X2Zyb21fc3lzY2FsbCwgdHIwCiAJYmxpbmsJdHIwLCBaRVJPCiAKLQotCiBzeXNjYWxsX2FsbG93ZWQ6CiAJLyogVXNlIExJTksgdG8gZGVmbGVjdCB0aGUgZXhpdCBwb2ludCwgZGVmYXVsdCBpcyBzeXNjYWxsX3JldCAqLwogCXB0YQlzeXNjYWxsX3JldCwgdHIwCkBAIC0xNDEwLDggKzEzNTMsOCBAQAogCSAgIHIyKG91dCkgOiByZXN1bHQgcXVhZHdvcmQKIAogCSAgIFRoaXMgaXMgcHJvdmlkZWQgYXMgYSBjaGVhcHNrYXRlIHdheSBvZiBtYW5pcHVsYXRpbmcgZGV2aWNlCi0JICAgcmVnaXN0ZXJzIGZvciBkZWJ1Z2dpbmcgKHRvIGF2b2lkIHRoZSBuZWVkIHRvIG9uY2hpcF9yZW1hcCB0aGUgZGVidWcKLQkgICBtb2R1bGUsIGFuZCB0byBhdm9pZCB0aGUgbmVlZCB0byBvbmNoaXBfcmVtYXAgdGhlIHdhdGNocG9pbnQKKwkgICByZWdpc3RlcnMgZm9yIGRlYnVnZ2luZyAodG8gYXZvaWQgdGhlIG5lZWQgdG8gaW9yZW1hcCB0aGUgZGVidWcKKwkgICBtb2R1bGUsIGFuZCB0byBhdm9pZCB0aGUgbmVlZCB0byBpb3JlbWFwIHRoZSB3YXRjaHBvaW50CiAJICAgY29udHJvbGxlciBpbiBhIHdheSB0aGF0IGlkZW50aXR5IG1hcHMgc3VmZmljaWVudCBiaXRzIHRvIGF2b2lkIHRoZQogCSAgIFNINS0xMDEgY3V0MiBzaWxpY29uIGRlZmVjdCkuCiAKQEAgLTE0NTksOCArMTQwMiw4IEBACiAJICAgcjMgOiBxdWFkd29yZCB2YWx1ZSB0byB3cml0ZS4KIAogCSAgIFRoaXMgaXMgcHJvdmlkZWQgYXMgYSBjaGVhcHNrYXRlIHdheSBvZiBtYW5pcHVsYXRpbmcgZGV2aWNlCi0JICAgcmVnaXN0ZXJzIGZvciBkZWJ1Z2dpbmcgKHRvIGF2b2lkIHRoZSBuZWVkIHRvIG9uY2hpcF9yZW1hcCB0aGUgZGVidWcKLQkgICBtb2R1bGUsIGFuZCB0byBhdm9pZCB0aGUgbmVlZCB0byBvbmNoaXBfcmVtYXAgdGhlIHdhdGNocG9pbnQKKwkgICByZWdpc3RlcnMgZm9yIGRlYnVnZ2luZyAodG8gYXZvaWQgdGhlIG5lZWQgdG8gaW9yZW1hcCB0aGUgZGVidWcKKwkgICBtb2R1bGUsIGFuZCB0byBhdm9pZCB0aGUgbmVlZCB0byBpb3JlbWFwIHRoZSB3YXRjaHBvaW50CiAJICAgY29udHJvbGxlciBpbiBhIHdheSB0aGF0IGlkZW50aXR5IG1hcHMgc3VmZmljaWVudCBiaXRzIHRvIGF2b2lkIHRoZQogCSAgIFNINS0xMDEgY3V0MiBzaWxpY29uIGRlZmVjdCkuCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDUvc2V0dXAtc2g1LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L3NldHVwLXNoNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZmYxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g1L3NldHVwLXNoNS5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogU0g1LTEwMS9TSDUtMTAzIENQVSBTZXR1cAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorCitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gUEhZU19QRVJJUEhFUkFMX0JMT0NLICsgMHgwMTAzMDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX0lPUkVNQVAsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0geyAzOSwgNDAsIDQyLCAwIH0sCisJfSwgeworCQkuZmxhZ3MgPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLXNjaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNjaV9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFBIWVNfUEVSSVBIRVJBTF9CTE9DSyArIDB4MDEwNDAwMDAsCisJCS5lbmQJPSBQSFlTX1BFUklQSEVSQUxfQkxPQ0sgKyAweDAxMDQwMDAwICsgMHg1OCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwlbMV0gPSB7CisJCS8qIFBlcmlvZCBJUlEgKi8KKwkJLnN0YXJ0CT0gSVJRX1BSSSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwlbMl0gPSB7CisJCS8qIENhcnJ5IElSUSAqLworCQkuc3RhcnQJPSBJUlFfQ1VJLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCVszXSA9IHsKKwkJLyogQWxhcm0gSVJRICovCisJCS5zdGFydAk9IElSUV9BVEksCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKK307CisKKyNkZWZpbmUJVE1VX0JMT0NLX09GRgkweDAxMDIwMDAwCisjZGVmaW5lIFRNVV9CQVNFCVBIWVNfUEVSSVBIRVJBTF9CTE9DSyArIFRNVV9CTE9DS19PRkYKKyNkZWZpbmUgVE1VMF9CQVNFCShUTVVfQkFTRSArIDB4OCArICgweGMgKiAweDApKQorI2RlZmluZSBUTVUxX0JBU0UJKFRNVV9CQVNFICsgMHg4ICsgKDB4YyAqIDB4MSkpCisjZGVmaW5lIFRNVTJfQkFTRQkoVE1VX0JBU0UgKyAweDggKyAoMHhjICogMHgyKSkKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MF9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTAiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MDQsCisJLnRpbWVyX2JpdCA9IDAsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2NrZXZlbnRfcmF0aW5nID0gMjAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUwX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMCIsCisJCS5zdGFydAk9IFRNVTBfQkFTRSwKKwkJLmVuZAk9IFRNVTBfQkFTRSArIDB4YyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfVFVOSTAsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUwX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUwX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUwX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11MF9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBzaF90aW1lcl9jb25maWcgdG11MV9wbGF0Zm9ybV9kYXRhID0geworCS5uYW1lID0gIlRNVTEiLAorCS5jaGFubmVsX29mZnNldCA9IDB4MTAsCisJLnRpbWVyX2JpdCA9IDEsCisJLmNsayA9ICJwZXJpcGhlcmFsX2NsayIsCisJLmNsb2Nrc291cmNlX3JhdGluZyA9IDIwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdG11MV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRNVTEiLAorCQkuc3RhcnQJPSBUTVUxX0JBU0UsCisJCS5lbmQJPSBUTVUxX0JBU0UgKyAweGMgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLnN0YXJ0CT0gSVJRX1RVTkkxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdG11MV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoX3RtdSIsCisJLmlkCQk9IDEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdG11MV9wbGF0Zm9ybV9kYXRhLAorCX0sCisJLnJlc291cmNlCT0gdG11MV9yZXNvdXJjZXMsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRtdTFfcmVzb3VyY2VzKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnIHRtdTJfcGxhdGZvcm1fZGF0YSA9IHsKKwkubmFtZSA9ICJUTVUyIiwKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDFjLAorCS50aW1lcl9iaXQgPSAyLAorCS5jbGsgPSAicGVyaXBoZXJhbF9jbGsiLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0bXUyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVE1VMiIsCisJCS5zdGFydAk9IFRNVTJfQkFTRSwKKwkJLmVuZAk9IFRNVTJfQkFTRSArIDB4YyAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBJUlFfVFVOSTIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB0bXUyX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2hfdG11IiwKKwkuaWQJCT0gMiwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YQk9ICZ0bXUyX3BsYXRmb3JtX2RhdGEsCisJfSwKKwkucmVzb3VyY2UJPSB0bXUyX3Jlc291cmNlcywKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodG11Ml9yZXNvdXJjZXMpLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNV9lYXJseV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmdG11MF9kZXZpY2UsCisJJnRtdTFfZGV2aWNlLAorCSZ0bXUyX2RldmljZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDVfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNjaV9kZXZpY2UsCisJJnJ0Y19kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDVfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDVfZWFybHlfZGV2aWNlcywKKwkJCQkgICBBUlJBWV9TSVpFKHNoNV9lYXJseV9kZXZpY2VzKSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDVfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDVfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDVfZGV2aWNlc19zZXR1cCk7CisKK3ZvaWQgX19pbml0IHBsYXRfZWFybHlfZGV2aWNlX3NldHVwKHZvaWQpCit7CisJZWFybHlfcGxhdGZvcm1fYWRkX2RldmljZXMoc2g1X2Vhcmx5X2RldmljZXMsCisJCQkJICAgQVJSQVlfU0laRShzaDVfZWFybHlfZGV2aWNlcykpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaW8uYyBiL2FyY2gvc2gva2VybmVsL2lvLmMKaW5kZXggMjljZjQ1OC4uNGY4NWZmZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaW8uYworKysgYi9hcmNoL3NoL2tlcm5lbC9pby5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaW9fdHJhcHBlZC5jIGIvYXJjaC9zaC9rZXJuZWwvaW9fdHJhcHBlZC5jCmluZGV4IGMyMjg1M2IuLjc3ZGZlY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lvX3RyYXBwZWQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pb190cmFwcGVkLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogaW50IGhhbmRsZV90cmFwcGVkX2lvKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAJbW1fc2VnbWVudF90IG9sZGZzOwotCW9wY29kZV90IGluc3RydWN0aW9uOworCWluc25fc2l6ZV90IGluc3RydWN0aW9uOwogCWludCB0bXA7CiAKIAlpZiAoIWxvb2t1cF90aW9wKGFkZHJlc3MpKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCAzZjEzNzJlLi4zZDA5MDYyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMzEsMzkgKzMxLDY0IEBACiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQorLyoKKyAqIC9wcm9jL2ludGVycnVwdHMgcHJpbnRpbmc6CisgKi8KK3N0YXRpYyBpbnQgc2hvd19vdGhlcl9pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgaW50IHByZWMpCit7CisJc2VxX3ByaW50ZihwLCAiJSpzOiAlMTB1XG4iLCBwcmVjLCAiRVJSIiwgYXRvbWljX3JlYWQoJmlycV9lcnJfY291bnQpKTsKKwlyZXR1cm4gMDsKK30KKwogaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCiB7Ci0JaW50IGkgPSAqKGxvZmZfdCAqKSB2LCBqOwotCXN0cnVjdCBpcnFhY3Rpb24gKiBhY3Rpb247Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBhbnlfY291bnQgPSAwOworCWludCBpID0gKihsb2ZmX3QgKil2LCBqLCBwcmVjOworCXN0cnVjdCBpcnFhY3Rpb24gKmFjdGlvbjsKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisKKwlpZiAoaSA+IG5yX2lycXMpCisJCXJldHVybiAwOworCisJZm9yIChwcmVjID0gMywgaiA9IDEwMDA7IHByZWMgPCAxMCAmJiBqIDw9IG5yX2lycXM7ICsrcHJlYykKKwkJaiAqPSAxMDsKKworCWlmIChpID09IG5yX2lycXMpCisJCXJldHVybiBzaG93X290aGVyX2ludGVycnVwdHMocCwgcHJlYyk7CiAKIAlpZiAoaSA9PSAwKSB7Ci0JCXNlcV9wdXRzKHAsICIgICAgICAgICAgICIpOworCQlzZXFfcHJpbnRmKHAsICIlKnMiLCBwcmVjICsgOCwgIiIpOwogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCi0JCQlzZXFfcHJpbnRmKHAsICJDUFUlZCAgICAgICAiLGopOworCQkJc2VxX3ByaW50ZihwLCAiQ1BVJS04ZCIsIGopOwogCQlzZXFfcHV0YyhwLCAnXG4nKTsKIAl9CiAKLQlpZiAoaSA8IHNoX212Lm12X25yX2lycXMpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlycV9kZXNjW2ldLmxvY2ssIGZsYWdzKTsKLQkJYWN0aW9uID0gaXJxX2Rlc2NbaV0uYWN0aW9uOwotCQlpZiAoIWFjdGlvbikKLQkJCWdvdG8gdW5sb2NrOwotCQlzZXFfcHJpbnRmKHAsICIlM2Q6ICIsaSk7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoaikKLQkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwga3N0YXRfaXJxc19jcHUoaSwgaikpOwotCQlzZXFfcHJpbnRmKHAsICIgJTE0cyIsIGlycV9kZXNjW2ldLmNoaXAtPm5hbWUpOwotCQlzZXFfcHJpbnRmKHAsICItJS04cyIsIGlycV9kZXNjW2ldLm5hbWUpOworCWRlc2MgPSBpcnFfdG9fZGVzYyhpKTsKKwlpZiAoIWRlc2MpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCWFueV9jb3VudCB8PSBrc3RhdF9pcnFzX2NwdShpLCBqKTsKKwlhY3Rpb24gPSBkZXNjLT5hY3Rpb247CisJaWYgKCFhY3Rpb24gJiYgIWFueV9jb3VudCkKKwkJZ290byBvdXQ7CisKKwlzZXFfcHJpbnRmKHAsICIlKmQ6ICIsIHByZWMsIGkpOworCWZvcl9lYWNoX29ubGluZV9jcHUoaikKKwkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBrc3RhdF9pcnFzX2NwdShpLCBqKSk7CisJc2VxX3ByaW50ZihwLCAiICUxNHMiLCBkZXNjLT5jaGlwLT5uYW1lKTsKKwlzZXFfcHJpbnRmKHAsICItJS04cyIsIGRlc2MtPm5hbWUpOworCisJaWYgKGFjdGlvbikgewogCQlzZXFfcHJpbnRmKHAsICIgICVzIiwgYWN0aW9uLT5uYW1lKTsKLQotCQlmb3IgKGFjdGlvbj1hY3Rpb24tPm5leHQ7IGFjdGlvbjsgYWN0aW9uID0gYWN0aW9uLT5uZXh0KQorCQl3aGlsZSAoKGFjdGlvbiA9IGFjdGlvbi0+bmV4dCkgIT0gTlVMTCkKIAkJCXNlcV9wcmludGYocCwgIiwgJXMiLCBhY3Rpb24tPm5hbWUpOwotCQlzZXFfcHV0YyhwLCAnXG4nKTsKLXVubG9jazoKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxX2Rlc2NbaV0ubG9jaywgZmxhZ3MpOwotCX0gZWxzZSBpZiAoaSA9PSBzaF9tdi5tdl9ucl9pcnFzKQotCQlzZXFfcHJpbnRmKHAsICJFcnI6ICUxMHVcbiIsIGF0b21pY19yZWFkKCZpcnFfZXJyX2NvdW50KSk7CisJfQogCisJc2VxX3B1dGMocCwgJ1xuJyk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogI2VuZGlmCkBAIC0yNTQsMyArMjc5LDExIEBACiAKIAlpcnFfY3R4X2luaXQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIH0KKworI2lmZGVmIENPTkZJR19TUEFSU0VfSVJRCitpbnQgX19pbml0IGFyY2hfcHJvYmVfbnJfaXJxcyh2b2lkKQoreworCW5yX2lycXMgPSBzaF9tdi5tdl9ucl9pcnFzOworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9rZ2RiLmMgYi9hcmNoL3NoL2tlcm5lbC9rZ2RiLmMKaW5kZXggN2M3NDdlNy4uMzA1YWFkNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwva2dkYi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2tnZGIuYwpAQCAtNDcsNyArNDcsNyBAQAogLyogQ2FsY3VsYXRlIHRoZSBuZXcgYWRkcmVzcyBmb3IgYWZ0ZXIgYSBzdGVwICovCiBzdGF0aWMgc2hvcnQgKmdldF9zdGVwX2FkZHJlc3Moc3RydWN0IHB0X3JlZ3MgKmxpbnV4X3JlZ3MpCiB7Ci0Jb3Bjb2RlX3Qgb3AgPSBfX3Jhd19yZWFkdyhsaW51eF9yZWdzLT5wYyk7CisJaW5zbl9zaXplX3Qgb3AgPSBfX3Jhd19yZWFkdyhsaW51eF9yZWdzLT5wYyk7CiAJbG9uZyBhZGRyOwogCiAJLyogQlQgKi8KQEAgLTEzNCw3ICsxMzQsNyBAQAogICovCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHN0ZXBwZWRfYWRkcmVzczsKLXN0YXRpYyBvcGNvZGVfdCBzdGVwcGVkX29wY29kZTsKK3N0YXRpYyBpbnNuX3NpemVfdCBzdGVwcGVkX29wY29kZTsKIAogc3RhdGljIHZvaWQgZG9fc2luZ2xlX3N0ZXAoc3RydWN0IHB0X3JlZ3MgKmxpbnV4X3JlZ3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItYnJvYWRjYXN0LmMgYi9hcmNoL3NoL2tlcm5lbC9sb2NhbHRpbWVyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci1icm9hZGNhc3QuYwpyZW5hbWUgdG8gYXJjaC9zaC9rZXJuZWwvbG9jYWx0aW1lci5jCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMgYi9hcmNoL3NoL2tlcm5lbC9tYWNodmVjLmMKaW5kZXggYzFlYTQxZS4uNTQ4ZjY2MCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvbWFjaHZlYy5jCisrKyBiL2FyY2gvc2gva2VybmVsL21hY2h2ZWMuYwpAQCAtMTI5LDYgKzEyOSw3IEBACiAJbXZfc2V0KGlvcG9ydF9tYXApOwogCW12X3NldChpb3BvcnRfdW5tYXApOwogCW12X3NldChpcnFfZGVtdXgpOworCW12X3NldChtb2RlX3BpbnMpOwogCiAJaWYgKCFzaF9tdi5tdl9ucl9pcnFzKQogCQlzaF9tdi5tdl9ucl9pcnFzID0gTlJfSVJRUzsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL21vZHVsZS5jIGIvYXJjaC9zaC9rZXJuZWwvbW9kdWxlLmMKaW5kZXggYzQzMDgxMC4uYzE5YjBmNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvbW9kdWxlLmMKQEAgLTkwLDcgKzkwLDcgQEAKIAkJICogU0htZWRpYSwgdGhlIExTQiBvZiB0aGUgc3ltYm9sIG5lZWRzIHRvIGJlIGFzc2VydGVkCiAJCSAqIGZvciB0aGUgQ1BVIHRvIGJlIGluIFNIbWVkaWEgbW9kZSB3aGVuIGl0IHN0YXJ0cyBleGVjdXRpbmcKIAkJICogdGhlIGJyYW5jaCB0YXJnZXQuICovCi0JCXJlbG9jYXRpb24gfD0gKHN5bS0+c3Rfb3RoZXIgJiA0KTsKKwkJcmVsb2NhdGlvbiB8PSAhIShzeW0tPnN0X290aGVyICYgNCk7CiAjZW5kaWYKIAogCQlzd2l0Y2ggKEVMRjMyX1JfVFlQRShyZWxbaV0ucl9pbmZvKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzc18zMi5jIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IDZkOTQ3MjUuLjkyODllZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzXzMyLmMKQEAgLTI1MSw3ICsyNTEsOCBAQAogCiAJaWYgKGN1cnJlbnRfY3B1X2RhdGEudHlwZSA9PSBDUFVfU0g3NzI5IHx8CiAJICAgIGN1cnJlbnRfY3B1X2RhdGEudHlwZSA9PSBDUFVfU0g3NzEwIHx8Ci0JICAgIGN1cnJlbnRfY3B1X2RhdGEudHlwZSA9PSBDUFVfU0g3NzEyKSB7CisJICAgIGN1cnJlbnRfY3B1X2RhdGEudHlwZSA9PSBDUFVfU0g3NzEyIHx8CisJICAgIGN1cnJlbnRfY3B1X2RhdGEudHlwZSA9PSBDUFVfU0g3MjAzKXsKIAkJY3RybF9vdXR3KEJCUl9JTlNUIHwgQkJSX1JFQUQgfCBCQlJfQ1BVLCBVQkNfQkJSQSk7CiAJCWN0cmxfb3V0bChCUkNSX1BDQkEgfCBCUkNSX1BDVEUsIFVCQ19CUkNSKTsKIAl9IGVsc2UgewpAQCAtNDA3LDYgKzQwOCw3IEBACiAjZWxzZQogCWN0cmxfb3V0dygwLCBVQkNfQkJSQSk7CiAJY3RybF9vdXR3KDAsIFVCQ19CQlJCKTsKKwljdHJsX291dGwoMCwgVUJDX0JSQ1IpOwogI2VuZGlmCiAJY3VycmVudC0+dGhyZWFkLnViY19wYyA9IDA7CiAJdWJjX3VzZXJjbnQgLT0gMTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3B0cmFjZV8zMi5jIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlXzMyLmMKaW5kZXggZjdiMjJkZC4uMzM5MmU4MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvcHRyYWNlXzMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvcHRyYWNlXzMyLmMKQEAgLTMzNCw2ICszMzQsMTQgQEAKIAkJCQkJWyhhZGRyIC0gKGxvbmcpJmR1bW15LT5mcHUpID4+IDJdOwogCQl9IGVsc2UgaWYgKGFkZHIgPT0gKGxvbmcpICZkdW1teS0+dV9mcHZhbGlkKQogCQkJdG1wID0gISF0c2tfdXNlZF9tYXRoKGNoaWxkKTsKKwkJZWxzZSBpZiAoYWRkciA9PSBQVF9URVhUX0FERFIpCisJCQl0bXAgPSBjaGlsZC0+bW0tPnN0YXJ0X2NvZGU7CisJCWVsc2UgaWYgKGFkZHIgPT0gUFRfREFUQV9BRERSKQorCQkJdG1wID0gY2hpbGQtPm1tLT5zdGFydF9kYXRhOworCQllbHNlIGlmIChhZGRyID09IFBUX1RFWFRfRU5EX0FERFIpCisJCQl0bXAgPSBjaGlsZC0+bW0tPmVuZF9jb2RlOworCQllbHNlIGlmIChhZGRyID09IFBUX1RFWFRfTEVOKQorCQkJdG1wID0gY2hpbGQtPm1tLT5lbmRfY29kZSAtIGNoaWxkLT5tbS0+c3RhcnRfY29kZTsKIAkJZWxzZQogCQkJdG1wID0gMDsKIAkJcmV0ID0gcHV0X3VzZXIodG1wLCBkYXRhcCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwppbmRleCAwNGE2MDA0Li5kZDM4MzM4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTE1NSw3ICsxNTYsNyBAQAogCQkJJmNyYXNoX3NpemUsICZjcmFzaF9iYXNlKTsKIAlpZiAocmV0ID09IDAgJiYgY3Jhc2hfc2l6ZSkgewogCQlpZiAoY3Jhc2hfYmFzZSA8PSAwKSB7Ci0JCQl2cCA9IGFsbG9jX2Jvb3RtZW1fbm9wYW5pYyhjcmFzaF9zaXplKTsgCisJCQl2cCA9IGFsbG9jX2Jvb3RtZW1fbm9wYW5pYyhjcmFzaF9zaXplKTsKIAkJCWlmICghdnApIHsKIAkJCQlwcmludGsoS0VSTl9JTkZPICJjcmFzaGtlcm5lbCBhbGxvY2F0aW9uICIKIAkJCQkgICAgICAgImZhaWxlZFxuIik7CkBAIC0xODQsNyArMTg1LDYgQEAKIHt9CiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVkKIHZvaWQgX19jcHVpbml0IGNhbGlicmF0ZV9kZWxheSh2b2lkKQogewogCXN0cnVjdCBjbGsgKmNsayA9IGNsa19nZXQoTlVMTCwgImNwdV9jbGsiKTsKQEAgLTIwMCw3ICsyMDAsNiBAQAogCQkJIChsb29wc19wZXJfamlmZnkvKDUwMDAvSFopKSAlIDEwMCwKIAkJCSBsb29wc19wZXJfamlmZnkpOwogfQotI2VuZGlmCiAKIHZvaWQgX19pbml0IF9fYWRkX2FjdGl2ZV9yYW5nZSh1bnNpZ25lZCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3BmbikKQEAgLTMyOCw2ICszMjcsMTAgQEAKIGVhcmx5X3BhcmFtKCJlbGZjb3JlaGRyIiwgcGFyc2VfZWxmY29yZWhkcik7CiAjZW5kaWYKIAordm9pZCBfX2luaXQgX19hdHRyaWJ1dGVfXyAoKHdlYWspKSBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQoreworfQorCiB2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCiB7CiAJZW5hYmxlX21tdSgpOwpAQCAtMzgxLDYgKzM4NCw4IEBACiAKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCisJcGxhdF9lYXJseV9kZXZpY2Vfc2V0dXAoKTsKKwogCXNoX212X3NldHVwKCk7CiAKIAkvKgpAQCAtNDE1LDYgKzQyMCwxOCBAQAogI2VuZGlmCiB9CiAKKy8qIHByb2Nlc3NvciBib290IG1vZGUgY29uZmlndXJhdGlvbiAqLworaW50IGdlbmVyaWNfbW9kZV9waW5zKHZvaWQpCit7CisJcHJfd2FybmluZygiZ2VuZXJpY19tb2RlX3BpbnMoKTogbWlzc2luZyBtb2RlIHBpbiBjb25maWd1cmF0aW9uXG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHRlc3RfbW9kZV9waW4oaW50IHBpbikKK3sKKwlyZXR1cm4gc2hfbXYubXZfbW9kZV9waW5zKCkgJiBwaW47Cit9CisKIHN0YXRpYyBjb25zdCBjaGFyICpjcHVfbmFtZVtdID0gewogCVtDUFVfU0g3MjAxXQk9ICJTSDcyMDEiLAogCVtDUFVfU0g3MjAzXQk9ICJTSDcyMDMiLAlbQ1BVX1NINzI2M10JPSAiU0g3MjYzIiwKQEAgLTQzNSw3ICs0NTIsOCBAQAogCVtDUFVfU0g3NzIyXQk9ICJTSDc3MjIiLAlbQ1BVX1NIWDNdCT0gIlNILVgzIiwKIAlbQ1BVX1NINV8xMDFdCT0gIlNINS0xMDEiLAlbQ1BVX1NINV8xMDNdCT0gIlNINS0xMDMiLAogCVtDUFVfTVhHXQk9ICJNWC1HIiwJW0NQVV9TSDc3MjNdCT0gIlNINzcyMyIsCi0JW0NQVV9TSDczNjZdCT0gIlNINzM2NiIsCVtDUFVfU0hfTk9ORV0JPSAiVW5rbm93biIKKwlbQ1BVX1NINzM2Nl0JPSAiU0g3MzY2IiwJW0NQVV9TSDc3MjRdCT0gIlNINzcyNCIsCisJW0NQVV9TSF9OT05FXQk9ICJVbmtub3duIgogfTsKIAogY29uc3QgY2hhciAqZ2V0X2NwdV9zdWJ0eXBlKHN0cnVjdCBzaF9jcHVpbmZvICpjKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXNfMzIuYyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zXzMyLmMKaW5kZXggNTI4ZGUyOS4uZmNjNWRlMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXNfMzIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltc18zMi5jCkBAIC0xOSwxNCArMTksMTAgQEAKICNpbmNsdWRlIDxhc20vZnRyYWNlLmg+CiAKIGV4dGVybiBpbnQgZHVtcF9mcHUoc3RydWN0IHB0X3JlZ3MgKiwgZWxmX2ZwcmVnc2V0X3QgKik7Ci1leHRlcm4gc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG5vX2lycV90eXBlOwogCiAvKiBwbGF0Zm9ybSBkZXBlbmRlbnQgc3VwcG9ydCAqLwogRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7CiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwotRVhQT1JUX1NZTUJPTChpcnFfZGVzYyk7Ci1FWFBPUlRfU1lNQk9MKG5vX2lycV90eXBlKTsKLQogRVhQT1JUX1NZTUJPTChzdHJsZW4pOwogCiAvKiBQQ0kgZXhwb3J0cyAqLwpAQCAtNDEsMTEgKzM3LDYgQEAKIEVYUE9SVF9TWU1CT0wobWVtc2V0KTsKIEVYUE9SVF9TWU1CT0wobWVtbW92ZSk7CiBFWFBPUlRfU1lNQk9MKF9fY29weV91c2VyKTsKLQotI2lmZGVmIENPTkZJR19NTVUKLUVYUE9SVF9TWU1CT0woZ2V0X3ZtX2FyZWEpOwotI2VuZGlmCi0KIEVYUE9SVF9TWU1CT0woX191ZGVsYXkpOwogRVhQT1JUX1NZTUJPTChfX25kZWxheSk7CiBFWFBPUlRfU1lNQk9MKF9fY29uc3RfdWRlbGF5KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zXzY0LmMgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltc182NC5jCmluZGV4IDBkNzRkNmIuLjhmNTRlZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zXzY0LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXNfNjQuYwpAQCAtNzYsNSArNzYsNyBAQAogI2RlZmluZSBERUNMQVJFX0VYUE9SVChuYW1lKSBleHRlcm4gdm9pZCBuYW1lKHZvaWQpO0VYUE9SVF9TWU1CT0wobmFtZSkKIAogREVDTEFSRV9FWFBPUlQoX19zZGl2c2kzKTsKK0RFQ0xBUkVfRVhQT1JUKF9fc2RpdnNpM18xKTsKK0RFQ0xBUkVfRVhQT1JUKF9fc2RpdnNpM18yKTsKIERFQ0xBUkVfRVhQT1JUKF9fdWRpdnNpMyk7CiBERUNMQVJFX0VYUE9SVChfX2Rpdl90YWJsZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc18zMi5TIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfMzIuUwppbmRleCAwNTIwMmVkLi5hOWZmZjlmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc18zMi5TCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzMyLlMKQEAgLTM1MCw0ICszNTAsNSBAQAogCS5sb25nIHN5c19waXBlMgogCS5sb25nIHN5c19pbm90aWZ5X2luaXQxCiAJLmxvbmcgc3lzX3ByZWFkdgotCS5sb25nIHN5c193cml0ZXYKKwkubG9uZyBzeXNfcHdyaXRldgorCS5sb25nIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbwkvKiAzMzUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzY0LlMgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxsc182NC5TCmluZGV4IGEwODM2MDkuLjc1YzE4ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzXzY0LlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHNfNjQuUwpAQCAtMzg5LDMgKzM4OSw0IEBACiAJLmxvbmcgc3lzX2lub3RpZnlfaW5pdDEJCS8qIDM2MCAqLwogCS5sb25nIHN5c19wcmVhZHYKIAkubG9uZyBzeXNfcHdyaXRldgorCS5sb25nIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZGRlMzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC90aW1lLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiAgYXJjaC9zaC9rZXJuZWwvdGltZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSAgVGV0c3V5YSBPa2FkYSAmIE5paWJlIFl1dGFrYQorICogIENvcHlyaWdodCAoQykgMjAwMCAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwOSAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMiAgTS4gUi4gQnJvd24gIDxtcmJyb3duQGxpbnV4LXNoLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKKy8qIER1bW15IFJUQyBvcHMgKi8KK3N0YXRpYyB2b2lkIG51bGxfcnRjX2dldF90aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHYpCit7CisJdHYtPnR2X3NlYyA9IG1rdGltZSgyMDAwLCAxLCAxLCAwLCAwLCAwKTsKKwl0di0+dHZfbnNlYyA9IDA7Cit9CisKK3N0YXRpYyBpbnQgbnVsbF9ydGNfc2V0X3RpbWUoY29uc3QgdGltZV90IHNlY3MpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgKCpydGNfc2hfZ2V0X3RpbWUpKHN0cnVjdCB0aW1lc3BlYyAqKSA9IG51bGxfcnRjX2dldF90aW1lOworaW50ICgqcnRjX3NoX3NldF90aW1lKShjb25zdCB0aW1lX3QpID0gbnVsbF9ydGNfc2V0X3RpbWU7CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTU9TX1VQREFURQordW5zaWduZWQgbG9uZyByZWFkX3BlcnNpc3RlbnRfY2xvY2sodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHY7CisJcnRjX3NoX2dldF90aW1lKCZ0dik7CisJcmV0dXJuIHR2LnR2X3NlYzsKK30KKworaW50IHVwZGF0ZV9wZXJzaXN0ZW50X2Nsb2NrKHN0cnVjdCB0aW1lc3BlYyBub3cpCit7CisJcmV0dXJuIHJ0Y19zaF9zZXRfdGltZShub3cudHZfc2VjKTsKK30KKyNlbmRpZgorCit1bnNpZ25lZCBpbnQgZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJaWYgKHJ0Y19zaF9nZXRfdGltZSAhPSBudWxsX3J0Y19nZXRfdGltZSkgeworCQlzdHJ1Y3QgdGltZXNwZWMgdHY7CisKKwkJcnRjX3NoX2dldF90aW1lKCZ0dik7CisJCXJ0Y190aW1lX3RvX3RtKHR2LnR2X3NlYywgdG0pOworCX0KKworCXJldHVybiBSVENfMjRIOworfQorRVhQT1JUX1NZTUJPTChnZXRfcnRjX3RpbWUpOworCitpbnQgc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJdW5zaWduZWQgbG9uZyBzZWNzOworCisJcnRjX3RtX3RvX3RpbWUodG0sICZzZWNzKTsKKwlyZXR1cm4gcnRjX3NoX3NldF90aW1lKHNlY3MpOworfQorRVhQT1JUX1NZTUJPTChzZXRfcnRjX3RpbWUpOworCitzdGF0aWMgaW50IF9faW5pdCBydGNfZ2VuZXJpY19pbml0KHZvaWQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKworCWlmIChydGNfc2hfZ2V0X3RpbWUgPT0gbnVsbF9ydGNfZ2V0X3RpbWUpCisJCXJldHVybiAtRU5PREVWOworCisJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoInJ0Yy1nZW5lcmljIiwgLTEsIE5VTEwsIDApOworCWlmIChJU19FUlIocGRldikpCisJCXJldHVybiBQVFJfRVJSKHBkZXYpOworCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChydGNfZ2VuZXJpY19pbml0KTsKKwordm9pZCAoKmJvYXJkX3RpbWVfaW5pdCkodm9pZCk7CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBzY2hlZF9jbG9jayh2b2lkKQoreworCXJldHVybiAoamlmZmllc182NCAtIElOSVRJQUxfSklGRklFUykgKiAoTlNFQ19QRVJfU0VDIC8gSFopOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2hfbGF0ZV90aW1lX2luaXQodm9pZCkKK3sKKwkvKgorCSAqIE1ha2Ugc3VyZSBhbGwgY29tcGlsZWQtaW4gZWFybHkgdGltZXJzIHJlZ2lzdGVyIHRoZW1zZWx2ZXMuCisJICogUnVuIHByb2JlKCkgZm9yIG9uZSAiZWFybHl0aW1lciIgZGV2aWNlLgorCSAqLworCWVhcmx5X3BsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcl9hbGwoImVhcmx5dGltZXIiKTsKKwllYXJseV9wbGF0Zm9ybV9kcml2ZXJfcHJvYmUoImVhcmx5dGltZXIiLCAxLCAwKTsKK30KKwordm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCit7CisJaWYgKGJvYXJkX3RpbWVfaW5pdCkKKwkJYm9hcmRfdGltZV9pbml0KCk7CisKKwljbGtfaW5pdCgpOworCisJcnRjX3NoX2dldF90aW1lKCZ4dGltZSk7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAorCQkJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAorCWxvY2FsX3RpbWVyX3NldHVwKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisjZW5kaWYKKworCWxhdGVfdGltZV9pbml0ID0gc2hfbGF0ZV90aW1lX2luaXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lXzMyLmMgYi9hcmNoL3NoL2tlcm5lbC90aW1lXzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MDBkMjQuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdGltZV8zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiAgYXJjaC9zaC9rZXJuZWwvdGltZV8zMi5jCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5OSAgVGV0c3V5YSBPa2FkYSAmIE5paWJlIFl1dGFrYQotICogIENvcHlyaWdodCAoQykgMjAwMCAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwOCAgUGF1bCBNdW5kdAotICogIENvcHlyaWdodCAoQykgMjAwMiAgTS4gUi4gQnJvd24gIDxtcmJyb3duQGxpbnV4LXNoLm9yZz4KLSAqCi0gKiAgU29tZSBjb2RlIHRha2VuIGZyb20gaTM4NiB2ZXJzaW9uLgotICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk1ICBMaW51cyBUb3J2YWxkcwotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgotI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CS8qIGZvciBydGNfbG9jayAqLwotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGFzbS9jbG9jay5oPgotI2luY2x1ZGUgPGFzbS9ydGMuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLSNpbmNsdWRlIDxhc20va2dkYi5oPgotCi1zdHJ1Y3Qgc3lzX3RpbWVyICpzeXNfdGltZXI7Ci0KLS8qIE1vdmUgdGhpcyBzb21ld2hlcmUgbW9yZSBzZW5zaWJsZS4uICovCi1ERUZJTkVfU1BJTkxPQ0socnRjX2xvY2spOwotRVhQT1JUX1NZTUJPTChydGNfbG9jayk7Ci0KLS8qIER1bW15IFJUQyBvcHMgKi8KLXN0YXRpYyB2b2lkIG51bGxfcnRjX2dldF90aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHYpCi17Ci0JdHYtPnR2X3NlYyA9IG1rdGltZSgyMDAwLCAxLCAxLCAwLCAwLCAwKTsKLQl0di0+dHZfbnNlYyA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgbnVsbF9ydGNfc2V0X3RpbWUoY29uc3QgdGltZV90IHNlY3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgKCpydGNfc2hfZ2V0X3RpbWUpKHN0cnVjdCB0aW1lc3BlYyAqKSA9IG51bGxfcnRjX2dldF90aW1lOwotaW50ICgqcnRjX3NoX3NldF90aW1lKShjb25zdCB0aW1lX3QpID0gbnVsbF9ydGNfc2V0X3RpbWU7Ci0KLSNpZm5kZWYgQ09ORklHX0dFTkVSSUNfVElNRQotdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBzZXE7Ci0JdW5zaWduZWQgbG9uZyB1c2VjLCBzZWM7Ci0KLQlkbyB7Ci0JCS8qCi0JCSAqIFR1cm4gb2ZmIElSUXMgd2hlbiBncmFiYmluZyB4dGltZV9sb2NrLCBzbyB0aGF0Ci0JCSAqIHRoZSBzeXNfdGltZXIgZ2V0X29mZnNldCBjb2RlIGRvZXNuJ3QgaGF2ZSB0byBoYW5kbGUgaXQuCi0JCSAqLwotCQlzZXEgPSByZWFkX3NlcWJlZ2luX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKLQkJdXNlYyA9IGdldF90aW1lcl9vZmZzZXQoKTsKLQkJc2VjID0geHRpbWUudHZfc2VjOwotCQl1c2VjICs9IHh0aW1lLnR2X25zZWMgLyBOU0VDX1BFUl9VU0VDOwotCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnlfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgc2VxLCBmbGFncykpOwotCi0Jd2hpbGUgKHVzZWMgPj0gMTAwMDAwMCkgewotCQl1c2VjIC09IDEwMDAwMDA7Ci0JCXNlYysrOwotCX0KLQotCXR2LT50dl9zZWMgPSBzZWM7Ci0JdHYtPnR2X3VzZWMgPSB1c2VjOwotfQotRVhQT1JUX1NZTUJPTChkb19nZXR0aW1lb2ZkYXkpOwotCi1pbnQgZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpCi17Ci0JdGltZV90IHd0bV9zZWMsIHNlYyA9IHR2LT50dl9zZWM7Ci0JbG9uZyB3dG1fbnNlYywgbnNlYyA9IHR2LT50dl9uc2VjOwotCi0JaWYgKCh1bnNpZ25lZCBsb25nKXR2LT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7Ci0JLyoKLQkgKiBUaGlzIGlzIHJldm9sdGluZy4gV2UgbmVlZCB0byBzZXQgInh0aW1lIiBjb3JyZWN0bHkuIEhvd2V2ZXIsIHRoZQotCSAqIHZhbHVlIGluIHRoaXMgbG9jYXRpb24gaXMgdGhlIHZhbHVlIGF0IHRoZSBtb3N0IHJlY2VudCB1cGRhdGUgb2YKLQkgKiB3YWxsIHRpbWUuICBEaXNjb3ZlciB3aGF0IGNvcnJlY3Rpb24gZ2V0dGltZW9mZGF5KCkgd291bGQgaGF2ZQotCSAqIG1hZGUsIGFuZCB0aGVuIHVuZG8gaXQhCi0JICovCi0JbnNlYyAtPSBnZXRfdGltZXJfb2Zmc2V0KCkgKiBOU0VDX1BFUl9VU0VDOwotCi0Jd3RtX3NlYyAgPSB3YWxsX3RvX21vbm90b25pYy50dl9zZWMgKyAoeHRpbWUudHZfc2VjIC0gc2VjKTsKLQl3dG1fbnNlYyA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMgKyAoeHRpbWUudHZfbnNlYyAtIG5zZWMpOwotCi0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnh0aW1lLCBzZWMsIG5zZWMpOwotCXNldF9ub3JtYWxpemVkX3RpbWVzcGVjKCZ3YWxsX3RvX21vbm90b25pYywgd3RtX3NlYywgd3RtX25zZWMpOwotCi0JbnRwX2NsZWFyKCk7Ci0Jd3JpdGVfc2VxdW5sb2NrX2lycSgmeHRpbWVfbG9jayk7Ci0JY2xvY2tfd2FzX3NldCgpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGRvX3NldHRpbWVvZmRheSk7Ci0jZW5kaWYgLyogIUNPTkZJR19HRU5FUklDX1RJTUUgKi8KLQotLyogbGFzdCB0aW1lIHRoZSBSVEMgY2xvY2sgZ290IHVwZGF0ZWQgKi8KLXN0YXRpYyBsb25nIGxhc3RfcnRjX3VwZGF0ZTsKLQotLyoKLSAqIGhhbmRsZV90aW1lcl90aWNrKCkgbmVlZHMgdG8ga2VlcCB1cCB0aGUgcmVhbC10aW1lIGNsb2NrLAotICogYXMgd2VsbCBhcyBjYWxsIHRoZSAiZG9fdGltZXIoKSIgcm91dGluZSBldmVyeSBjbG9ja3RpY2sKLSAqLwotdm9pZCBoYW5kbGVfdGltZXJfdGljayh2b2lkKQotewotCWlmIChjdXJyZW50LT5waWQpCi0JCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKLQotCS8qCi0JICogSGVyZSB3ZSBhcmUgaW4gdGhlIHRpbWVyIGlycSBoYW5kbGVyLiBXZSBqdXN0IGhhdmUgaXJxcyBsb2NhbGx5Ci0JICogZGlzYWJsZWQgYnV0IHdlIGRvbid0IGtub3cgaWYgdGhlIHRpbWVyX2JoIGlzIHJ1bm5pbmcgb24gdGhlIG90aGVyCi0JICogQ1BVLiBXZSBuZWVkIHRvIGF2b2lkIHRvIFNNUCByYWNlIHdpdGggaXQuIE5PVEU6IHdlIGRvbicgdCBuZWVkCi0JICogdGhlIGlycSB2ZXJzaW9uIG9mIHdyaXRlX2xvY2sgYmVjYXVzZSBhcyBqdXN0IHNhaWQgd2UgaGF2ZSBpcnEKLQkgKiBsb2NhbGx5IGRpc2FibGVkLiAtYXJjYQotCSAqLwotCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwotCWRvX3RpbWVyKDEpOwotCi0JLyoKLQkgKiBJZiB3ZSBoYXZlIGFuIGV4dGVybmFsbHkgc3luY2hyb25pemVkIExpbnV4IGNsb2NrLCB0aGVuIHVwZGF0ZQotCSAqIFJUQyBjbG9jayBhY2NvcmRpbmdseSBldmVyeSB+MTEgbWludXRlcy4gU2V0X3J0Y19tbXNzKCkgaGFzIHRvIGJlCi0JICogY2FsbGVkIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDUwMCBtcyBiZWZvcmUgdGhlIG5ldyBzZWNvbmQgc3RhcnRzLgotCSAqLwotCWlmIChudHBfc3luY2VkKCkgJiYKLQkgICAgeHRpbWUudHZfc2VjID4gbGFzdF9ydGNfdXBkYXRlICsgNjYwICYmCi0JICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPj0gNTAwMDAwIC0gKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIgJiYKLQkgICAgKHh0aW1lLnR2X25zZWMgLyAxMDAwKSA8PSA1MDAwMDAgKyAoKHVuc2lnbmVkKSBUSUNLX1NJWkUpIC8gMikgewotCQlpZiAocnRjX3NoX3NldF90aW1lKHh0aW1lLnR2X3NlYykgPT0gMCkKLQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYzsKLQkJZWxzZQotCQkJLyogZG8gaXQgYWdhaW4gaW4gNjBzICovCi0JCQlsYXN0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWMgLSA2MDA7Ci0JfQotCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7Ci0KLSNpZm5kZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSkpOwotI2VuZGlmCi19Ci0KLSNpZmRlZiBDT05GSUdfUE0KLWludCB0aW1lcl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3Qgc3lzX3RpbWVyICpzeXNfdGltZXIgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc3lzX3RpbWVyLCBkZXYpOwotCi0Jc3lzX3RpbWVyLT5vcHMtPnN0b3AoKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgdGltZXJfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHN5c190aW1lciAqc3lzX3RpbWVyID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c190aW1lciwgZGV2KTsKLQotCXN5c190aW1lci0+b3BzLT5zdGFydCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotI2RlZmluZSB0aW1lcl9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgdGltZXJfcmVzdW1lIE5VTEwKLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyB0aW1lcl9zeXNjbGFzcyA9IHsKLQkubmFtZQkgPSAidGltZXIiLAotCS5zdXNwZW5kID0gdGltZXJfc3VzcGVuZCwKLQkucmVzdW1lCSA9IHRpbWVyX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRpbWVyX2luaXRfc3lzZnModm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKCFzeXNfdGltZXIpCi0JCXJldHVybiAwOwotCi0JcmV0ID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZ0aW1lcl9zeXNjbGFzcyk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0Jc3lzX3RpbWVyLT5kZXYuY2xzID0gJnRpbWVyX3N5c2NsYXNzOwotCXJldHVybiBzeXNkZXZfcmVnaXN0ZXIoJnN5c190aW1lci0+ZGV2KTsKLX0KLWRldmljZV9pbml0Y2FsbCh0aW1lcl9pbml0X3N5c2ZzKTsKLQotdm9pZCAoKmJvYXJkX3RpbWVfaW5pdCkodm9pZCk7Ci0KLXN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9zaCA9IHsKLQkubmFtZQkJPSAiU3VwZXJIIiwKLX07Ci0KLSNpZmRlZiBDT05GSUdfR0VORVJJQ19USU1FCi11bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzOwotCi0JLyogamlmZmllcyBiYXNlZCBzY2hlZF9jbG9jayBpZiBubyBjbG9ja3NvdXJjZSBpcyBpbnN0YWxsZWQgKi8KLQlpZiAoIWNsb2Nrc291cmNlX3NoLnJhdGluZykKLQkJcmV0dXJuICh1bnNpZ25lZCBsb25nIGxvbmcpamlmZmllcyAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0KLQljeWNsZXMgPSBjbG9ja3NvdXJjZV9zaC5yZWFkKCZjbG9ja3NvdXJjZV9zaCk7Ci0JcmV0dXJuIGN5YzJucygmY2xvY2tzb3VyY2Vfc2gsIGN5Y2xlcyk7Ci19Ci0jZW5kaWYKLQotdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCi17Ci0JaWYgKGJvYXJkX3RpbWVfaW5pdCkKLQkJYm9hcmRfdGltZV9pbml0KCk7Ci0KLQljbGtfaW5pdCgpOwotCi0JcnRjX3NoX2dldF90aW1lKCZ4dGltZSk7Ci0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLAotCQkJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKLQotI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAotCWxvY2FsX3RpbWVyX3NldHVwKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0jZW5kaWYKLQotCS8qCi0JICogRmluZCB0aGUgdGltZXIgdG8gdXNlIGFzIHRoZSBzeXN0ZW0gdGltZXIsIGl0IHdpbGwgYmUKLQkgKiBpbml0aWFsaXplZCBmb3IgdXMuCi0JICovCi0Jc3lzX3RpbWVyID0gZ2V0X3N5c190aW1lcigpOwotCWlmICh1bmxpa2VseSghc3lzX3RpbWVyKSkKLQkJcGFuaWMoIlN5c3RlbSB0aW1lciBtaXNzaW5nLlxuIik7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJVc2luZyAlcyBmb3Igc3lzdGVtIHRpbWVyXG4iLCBzeXNfdGltZXItPm5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZV82NC5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZV82NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODhjNzdjLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gva2VybmVsL3RpbWVfNjQuYworKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKgotICogYXJjaC9zaC9rZXJuZWwvdGltZV82NC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxICBQYW9sbyBBbGJlcmVsbGkKLSAqIENvcHlyaWdodCAoQykgMjAwMyAtIDIwMDcgIFBhdWwgTXVuZHQKLSAqIENvcHlyaWdodCAoQykgMjAwMyAgUmljaGFyZCBDdXJub3cKLSAqCi0gKiAgICBPcmlnaW5hbCBUTVUvUlRDIGNvZGUgdGFrZW4gZnJvbSBzaCB2ZXJzaW9uLgotICogICAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCi0gKiAgICAgIFNvbWUgY29kZSB0YWtlbiBmcm9tIGkzODYgdmVyc2lvbi4KLSAqICAgICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk1ICBMaW51cyBUb3J2YWxkcwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvYmNkLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGNwdS9yZWdpc3RlcnMuaD4JIC8qIHJlcXVpcmVkIGJ5IGlubGluZSBfX2FzbV9fIHN0bXQuICovCi0jaW5jbHVkZSA8Y3B1L2lycS5oPgotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLSNpbmNsdWRlIDxhc20vY2xvY2suaD4KLQotI2RlZmluZSBUTVVfVE9DUl9JTklUCTB4MDAKLSNkZWZpbmUgVE1VMF9UQ1JfSU5JVAkweDAwMjAKLSNkZWZpbmUgVE1VX1RTVFJfSU5JVAkxCi0jZGVmaW5lIFRNVV9UU1RSX09GRgkwCi0KLS8qIFJlYWwgVGltZSBDbG9jayAqLwotI2RlZmluZQlSVENfQkxPQ0tfT0ZGCTB4MDEwNDAwMDAKLSNkZWZpbmUgUlRDX0JBU0UJUEhZU19QRVJJUEhFUkFMX0JMT0NLICsgUlRDX0JMT0NLX09GRgotI2RlZmluZSBSVENfUkNSMV9DSUUJMHgxMAkvKiBDYXJyeSBJbnRlcnJ1cHQgRW5hYmxlICovCi0jZGVmaW5lIFJUQ19SQ1IxCShydGNfYmFzZSArIDB4MzgpCi0KLS8qIFRpbWUgTWFuYWdlbWVudCBVbml0ICovCi0jZGVmaW5lCVRNVV9CTE9DS19PRkYJMHgwMTAyMDAwMAotI2RlZmluZSBUTVVfQkFTRQlQSFlTX1BFUklQSEVSQUxfQkxPQ0sgKyBUTVVfQkxPQ0tfT0ZGCi0jZGVmaW5lIFRNVTBfQkFTRQl0bXVfYmFzZSArIDB4OCArICgweGMgKiAweDApCi0jZGVmaW5lIFRNVTFfQkFTRQl0bXVfYmFzZSArIDB4OCArICgweGMgKiAweDEpCi0jZGVmaW5lIFRNVTJfQkFTRQl0bXVfYmFzZSArIDB4OCArICgweGMgKiAweDIpCi0KLSNkZWZpbmUgVE1VX1RPQ1IJdG11X2Jhc2UrMHgwCS8qIEJ5dGUgYWNjZXNzICovCi0jZGVmaW5lIFRNVV9UU1RSCXRtdV9iYXNlKzB4NAkvKiBCeXRlIGFjY2VzcyAqLwotCi0jZGVmaW5lIFRNVTBfVENPUglUTVUwX0JBU0UrMHgwCS8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTBfVENOVAlUTVUwX0JBU0UrMHg0CS8qIExvbmcgYWNjZXNzICovCi0jZGVmaW5lIFRNVTBfVENSCVRNVTBfQkFTRSsweDgJLyogV29yZCBhY2Nlc3MgKi8KLQotI2RlZmluZSBUSUNLX1NJWkUgKHRpY2tfbnNlYyAvIDEwMDApCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRtdV9iYXNlLCBydGNfYmFzZTsKLXVuc2lnbmVkIGxvbmcgY3ByY19iYXNlOwotCi0vKiBWYXJpYWJsZXMgdG8gYWxsb3cgaW50ZXJwb2xhdGlvbiBvZiB0aW1lIG9mIGRheSB0byByZXNvbHV0aW9uIGJldHRlciB0aGFuIGEKLSAqIGppZmZ5LiAqLwotCi0vKiBUaGlzIGlzIGVmZmVjdGl2ZWx5IHByb3RlY3RlZCBieSB4dGltZV9sb2NrICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjdGNfbGFzdF9pbnRlcnJ1cHQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHVzZWNzX3Blcl9qaWZmeSA9IDEwMDAwMDAvSFo7IC8qIEFwcHJveGltYXRpb24gKi8KLQotI2RlZmluZSBDVENfSklGRllfU0NBTEVfU0hJRlQgNDAKLQotLyogMioqQ1RDX0pJRkZZX1NDQUxFX1NISUZUIC8gY3RjX3RpY2tzX3Blcl9qaWZmeSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzY2FsZWRfcmVjaXBfY3RjX3RpY2tzX3Blcl9qaWZmeTsKLQotLyogRXN0aW1hdGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lciB0aWNrLAotICAgYnkgc2NhbGluZyB0aGUgZGVsdGEgdGhhdCBoYXMgb2NjdXJyZWQgaW4gdGhlIENUQyByZWdpc3Rlci4KLQotICAgV0FSTklORyBXQVJOSU5HIFdBUk5JTkcgOiBUaGlzIGFsZ29yaXRobSByZWxpZXMgb24gdGhlIENUQyBkZWNyZW1lbnRpbmcgYXQKLSAgIHRoZSBDUFUgY2xvY2sgcmF0ZS4gIElmIHRoZSBDUFUgc2xlZXBzLCB0aGUgQ1RDIHN0b3BzIGNvdW50aW5nLiAgQmVhciB0aGlzCi0gICBpbiBtaW5kIGlmIGVuYWJsaW5nIFNMRUVQX1dPUktTIGluIHByb2Nlc3MuYy4gIEluIHRoYXQgY2FzZSwgdGhpcyBhbGdvcml0aG0KLSAgIHByb2JhYmx5IG5lZWRzIHRvIHVzZSBUTVUuVENOVDAgaW5zdGVhZC4gIFRoaXMgd2lsbCB3b3JrIGV2ZW4gaWYgdGhlIENQVSBpcwotICAgc2xlZXBpbmcsIHRob3VnaCB3aWxsIGJlIGNvYXJzZXIuCi0KLSAgIEZJWE1FIDogV2hhdCBpZiB1c2Vjc19wZXJfdGljayBpcyBtb3ZpbmcgYXJvdW5kIHRvbyBtdWNoLCBlLmcuIGlmIGFuIGFkanRpbWUKLSAgIGlzIHJ1bm5pbmcgb3IgaWYgdGhlIGZyZXEgb3IgdGljayBhcmd1bWVudHMgb2YgYWRqdGltZXggYXJlIG1vZGlmaWVkIGFmdGVyCi0gICB3ZSBoYXZlIGNhbGlicmF0ZWQgdGhlIHNjYWxpbmcgZmFjdG9yPyAgVGhpcyB3aWxsIHJlc3VsdCBpbiBlaXRoZXIgYSBqdW1wIGF0Ci0gICB0aGUgZW5kIG9mIGEgdGljayBwZXJpb2QsIG9yIGEgd3JhcCBiYWNrd2FyZHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG9uZSwKLSAgIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyByZWFkaW5nIHRoZSB0aW1lIG9mIGRheSBvZnRlbiBlbm91Z2guICBJIHRoaW5rIHdlCi0gICBvdWdodCB0byBkbyBiZXR0ZXIgdGhhbiB0aGlzLiAgRm9yIHRoaXMgcmVhc29uLCB1c2Vjc19wZXJfamlmZnkgaXMgbGVmdAotICAgc2VwYXJhdGVkIG91dCBpbiB0aGUgY2FsY3VsYXRpb24gYmVsb3cuICBUaGlzIGFsbG93cyBzb21lIGZ1dHVyZSBob29rIGludG8KLSAgIHRoZSBhZGp0aW1lLXJlbGF0ZWQgc3R1ZmYgaW4ga2VybmVsL3RpbWVyLmMgdG8gcmVtb3ZlIHRoaXMgaGF6YXJkLgotCi0qLwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB1c2Vjc19zaW5jZV90aWNrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIGN1cnJlbnRfY3RjOwotCWxvbmcgY3RjX3RpY2tzX3NpbmNlX2ludGVycnVwdDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdWxsX2N0Y190aWNrc19zaW5jZV9pbnRlcnJ1cHQ7Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQ7Ci0KLQl1bnNpZ25lZCBsb25nIGxvbmcgbXVsMV9vdXQ7Ci0JdW5zaWduZWQgbG9uZyBsb25nIG11bDFfb3V0X2hpZ2g7Ci0JdW5zaWduZWQgbG9uZyBsb25nIG11bDJfb3V0X2xvdywgbXVsMl9vdXRfaGlnaDsKLQotCS8qIFJlYWQgQ1RDIHJlZ2lzdGVyICovCi0JYXNtICgiZ2V0Y29uIGNyNjIsICUwIiA6ICI9ciIgKGN1cnJlbnRfY3RjKSk7Ci0JLyogTm90ZSwgdGhlIENUQyBjb3VudHMgZG93biBvbiBlYWNoIENQVSBjbG9jaywgbm90IHVwLgotCSAgIE5vdGUoMiksIHVzZSBsb25nIHR5cGUgdG8gZ2V0IGNvcnJlY3Qgd3JhcGFyb3VuZCBhcml0aG1ldGljIHdoZW4KLQkgICB0aGUgY291bnRlciBjcm9zc2VzIHplcm8uICovCi0JY3RjX3RpY2tzX3NpbmNlX2ludGVycnVwdCA9IChsb25nKSBjdGNfbGFzdF9pbnRlcnJ1cHQgLSAobG9uZykgY3VycmVudF9jdGM7Ci0JdWxsX2N0Y190aWNrc19zaW5jZV9pbnRlcnJ1cHQgPSAodW5zaWduZWQgbG9uZyBsb25nKSBjdGNfdGlja3Nfc2luY2VfaW50ZXJydXB0OwotCi0JLyogSW5saW5lIGFzc2VtYmx5IHRvIGRvIDMyeDMyeDMyLT42NCBtdWx0aXBsaWVyICovCi0JYXNtIHZvbGF0aWxlICgibXVsdS5sICUxLCAlMiwgJTAiIDoKLQkgICAgICI9ciIgKG11bDFfb3V0KSA6Ci0JICAgICAiciIgKHVsbF9jdGNfdGlja3Nfc2luY2VfaW50ZXJydXB0KSwgInIiICh1c2Vjc19wZXJfamlmZnkpKTsKLQotCW11bDFfb3V0X2hpZ2ggPSBtdWwxX291dCA+PiAzMjsKLQotCWFzbSB2b2xhdGlsZSAoIm11bHUubCAlMSwgJTIsICUwIiA6Ci0JICAgICAiPXIiIChtdWwyX291dF9sb3cpIDoKLQkgICAgICJyIiAobXVsMV9vdXQpLCAiciIgKHNjYWxlZF9yZWNpcF9jdGNfdGlja3NfcGVyX2ppZmZ5KSk7Ci0KLSNpZiAxCi0JYXNtIHZvbGF0aWxlICgibXVsdS5sICUxLCAlMiwgJTAiIDoKLQkgICAgICI9ciIgKG11bDJfb3V0X2hpZ2gpIDoKLQkgICAgICJyIiAobXVsMV9vdXRfaGlnaCksICJyIiAoc2NhbGVkX3JlY2lwX2N0Y190aWNrc19wZXJfamlmZnkpKTsKLSNlbmRpZgotCi0JcmVzdWx0ID0gKHVuc2lnbmVkIGxvbmcpICgoKG11bDJfb3V0X2hpZ2ggPDwgMzIpICsgbXVsMl9vdXRfbG93KSA+PiBDVENfSklGRllfU0NBTEVfU0hJRlQpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBzZXE7Ci0JdW5zaWduZWQgbG9uZyB1c2VjLCBzZWM7Ci0KLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW5faXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwotCQl1c2VjID0gdXNlY3Nfc2luY2VfdGljaygpOwotCQlzZWMgPSB4dGltZS50dl9zZWM7Ci0JCXVzZWMgKz0geHRpbWUudHZfbnNlYyAvIDEwMDA7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeV9pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBzZXEsIGZsYWdzKSk7Ci0KLQl3aGlsZSAodXNlYyA+PSAxMDAwMDAwKSB7Ci0JCXVzZWMgLT0gMTAwMDAwMDsKLQkJc2VjKys7Ci0JfQotCi0JdHYtPnR2X3NlYyA9IHNlYzsKLQl0di0+dHZfdXNlYyA9IHVzZWM7Ci19Ci1FWFBPUlRfU1lNQk9MKGRvX2dldHRpbWVvZmRheSk7Ci0KLWludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKLXsKLQl0aW1lX3Qgd3RtX3NlYywgc2VjID0gdHYtPnR2X3NlYzsKLQlsb25nIHd0bV9uc2VjLCBuc2VjID0gdHYtPnR2X25zZWM7Ci0KLQlpZiAoKHVuc2lnbmVkIGxvbmcpdHYtPnR2X25zZWMgPj0gTlNFQ19QRVJfU0VDKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXdyaXRlX3NlcWxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKLQkvKgotCSAqIFRoaXMgaXMgcmV2b2x0aW5nLiBXZSBuZWVkIHRvIHNldCAieHRpbWUiIGNvcnJlY3RseS4gSG93ZXZlciwgdGhlCi0JICogdmFsdWUgaW4gdGhpcyBsb2NhdGlvbiBpcyB0aGUgdmFsdWUgYXQgdGhlIG1vc3QgcmVjZW50IHVwZGF0ZSBvZgotCSAqIHdhbGwgdGltZS4gIERpc2NvdmVyIHdoYXQgY29ycmVjdGlvbiBnZXR0aW1lb2ZkYXkoKSB3b3VsZCBoYXZlCi0JICogbWFkZSwgYW5kIHRoZW4gdW5kbyBpdCEKLQkgKi8KLQluc2VjIC09IDEwMDAgKiB1c2Vjc19zaW5jZV90aWNrKCk7Ci0KLQl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOwotCXd0bV9uc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyArICh4dGltZS50dl9uc2VjIC0gbnNlYyk7Ci0KLQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7Ci0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7Ci0KLQludHBfY2xlYXIoKTsKLQl3cml0ZV9zZXF1bmxvY2tfaXJxKCZ4dGltZV9sb2NrKTsKLQljbG9ja193YXNfc2V0KCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZG9fc2V0dGltZW9mZGF5KTsKLQotLyogRHVtbXkgUlRDIG9wcyAqLwotc3RhdGljIHZvaWQgbnVsbF9ydGNfZ2V0X3RpbWUoc3RydWN0IHRpbWVzcGVjICp0dikKLXsKLQl0di0+dHZfc2VjID0gbWt0aW1lKDIwMDAsIDEsIDEsIDAsIDAsIDApOwotCXR2LT50dl9uc2VjID0gMDsKLX0KLQotc3RhdGljIGludCBudWxsX3J0Y19zZXRfdGltZShjb25zdCB0aW1lX3Qgc2VjcykKLXsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCAoKnJ0Y19zaF9nZXRfdGltZSkoc3RydWN0IHRpbWVzcGVjICopID0gbnVsbF9ydGNfZ2V0X3RpbWU7Ci1pbnQgKCpydGNfc2hfc2V0X3RpbWUpKGNvbnN0IHRpbWVfdCkgPSBudWxsX3J0Y19zZXRfdGltZTsKLQotLyogbGFzdCB0aW1lIHRoZSBSVEMgY2xvY2sgZ290IHVwZGF0ZWQgKi8KLXN0YXRpYyBsb25nIGxhc3RfcnRjX3VwZGF0ZTsKLQotLyoKLSAqIHRpbWVyX2ludGVycnVwdCgpIG5lZWRzIHRvIGtlZXAgdXAgdGhlIHJlYWwtdGltZSBjbG9jaywKLSAqIGFzIHdlbGwgYXMgY2FsbCB0aGUgImRvX3RpbWVyKCkiIHJvdXRpbmUgZXZlcnkgY2xvY2t0aWNrCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkb190aW1lcl9pbnRlcnJ1cHQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVudF9jdGM7Ci0KLQlpZiAoY3VycmVudC0+cGlkKQotCQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Ci0KLQkvKgotCSAqIEhlcmUgd2UgYXJlIGluIHRoZSB0aW1lciBpcnEgaGFuZGxlci4gV2UganVzdCBoYXZlIGlycXMgbG9jYWxseQotCSAqIGRpc2FibGVkIGJ1dCB3ZSBkb24ndCBrbm93IGlmIHRoZSB0aW1lcl9iaCBpcyBydW5uaW5nIG9uIHRoZSBvdGhlcgotCSAqIENQVS4gV2UgbmVlZCB0byBhdm9pZCB0byBTTVAgcmFjZSB3aXRoIGl0LiBOT1RFOiB3ZSBkb24nIHQgbmVlZAotCSAqIHRoZSBpcnEgdmVyc2lvbiBvZiB3cml0ZV9sb2NrIGJlY2F1c2UgYXMganVzdCBzYWlkIHdlIGhhdmUgaXJxCi0JICogbG9jYWxseSBkaXNhYmxlZC4gLWFyY2EKLQkgKi8KLQl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKLQlhc20gKCJnZXRjb24gY3I2MiwgJTAiIDogIj1yIiAoY3VycmVudF9jdGMpKTsKLQljdGNfbGFzdF9pbnRlcnJ1cHQgPSAodW5zaWduZWQgbG9uZykgY3VycmVudF9jdGM7Ci0KLQlkb190aW1lcigxKTsKLQotCS8qCi0JICogSWYgd2UgaGF2ZSBhbiBleHRlcm5hbGx5IHN5bmNocm9uaXplZCBMaW51eCBjbG9jaywgdGhlbiB1cGRhdGUKLQkgKiBSVEMgY2xvY2sgYWNjb3JkaW5nbHkgZXZlcnkgfjExIG1pbnV0ZXMuIFNldF9ydGNfbW1zcygpIGhhcyB0byBiZQotCSAqIGNhbGxlZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byA1MDAgbXMgYmVmb3JlIHRoZSBuZXcgc2Vjb25kIHN0YXJ0cy4KLQkgKi8KLQlpZiAobnRwX3N5bmNlZCgpICYmCi0JICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgotCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyICYmCi0JICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIpIHsKLQkJaWYgKHJ0Y19zaF9zZXRfdGltZSh4dGltZS50dl9zZWMpID09IDApCi0JCQlsYXN0X3J0Y191cGRhdGUgPSB4dGltZS50dl9zZWM7Ci0JCWVsc2UKLQkJCS8qIGRvIGl0IGFnYWluIGluIDYwIHMgKi8KLQkJCWxhc3RfcnRjX3VwZGF0ZSA9IHh0aW1lLnR2X3NlYyAtIDYwMDsKLQl9Ci0Jd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKLQotI2lmbmRlZiBDT05GSUdfU01QCi0JdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKGdldF9pcnFfcmVncygpKSk7Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGFib3ZlLCBleGNlcHQgd2UgX2Fsc29fIHNhdmUgdGhlIGN1cnJlbnQKLSAqIFRpbWUgU3RhbXAgQ291bnRlciB2YWx1ZSBhdCB0aGUgdGltZSBvZiB0aGUgdGltZXIgaW50ZXJydXB0LCBzbyB0aGF0Ci0gKiB3ZSBsYXRlciBvbiBjYW4gZXN0aW1hdGUgdGhlIHRpbWUgb2YgZGF5IG1vcmUgZXhhY3RseS4KLSAqLwotc3RhdGljIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9zdGF0dXM7Ci0KLQkvKiBDbGVhciBVTkYgYml0ICovCi0JdGltZXJfc3RhdHVzID0gY3RybF9pbncoVE1VMF9UQ1IpOwotCXRpbWVyX3N0YXR1cyAmPSB+MHgxMDA7Ci0JY3RybF9vdXR3KHRpbWVyX3N0YXR1cywgVE1VMF9UQ1IpOwotCi0JZG9fdGltZXJfaW50ZXJydXB0KCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgID0gewotCS5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0LAotCS5mbGFncyA9IElSUUZfRElTQUJMRUQsCi0JLm5hbWUgPSAidGltZXIiLAotfTsKLQotdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci0KLQl0bXVfYmFzZSA9IG9uY2hpcF9yZW1hcChUTVVfQkFTRSwgMTAyNCwgIlRNVSIpOwotCWlmICghdG11X2Jhc2UpIHsKLQkJcGFuaWMoIlVuYWJsZSB0byByZW1hcCBUTVVcbiIpOwotCX0KLQotCXJ0Y19iYXNlID0gb25jaGlwX3JlbWFwKFJUQ19CQVNFLCAxMDI0LCAiUlRDIik7Ci0JaWYgKCFydGNfYmFzZSkgewotCQlwYW5pYygiVW5hYmxlIHRvIHJlbWFwIFJUQ1xuIik7Ci0JfQotCi0JY2xrID0gY2xrX2dldChOVUxMLCAiY3B1X2NsayIpOwotCXNjYWxlZF9yZWNpcF9jdGNfdGlja3NfcGVyX2ppZmZ5ID0gKCgxVUxMIDw8IENUQ19KSUZGWV9TQ0FMRV9TSElGVCkgLwotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykoY2xrX2dldF9yYXRlKGNsaykgLyBIWikpOwotCi0JcnRjX3NoX2dldF90aW1lKCZ4dGltZSk7Ci0KLQlzZXR1cF9pcnEoVElNRVJfSVJRLCAmaXJxMCk7Ci0KLQljbGsgPSBjbGtfZ2V0KE5VTEwsICJtb2R1bGVfY2xrIik7Ci0JaW50ZXJ2YWwgPSAoY2xrX2dldF9yYXRlKGNsaykvKEhaKjQpKTsKLQotCXByaW50aygiSW50ZXJ2YWwgPSAlbGRcbiIsIGludGVydmFsKTsKLQotCS8qIFN0YXJ0IFRNVTAgKi8KLQljdHJsX291dGIoVE1VX1RTVFJfT0ZGLCBUTVVfVFNUUik7Ci0JY3RybF9vdXRiKFRNVV9UT0NSX0lOSVQsIFRNVV9UT0NSKTsKLQljdHJsX291dHcoVE1VMF9UQ1JfSU5JVCwgVE1VMF9UQ1IpOwotCWN0cmxfb3V0bChpbnRlcnZhbCwgVE1VMF9UQ09SKTsKLQljdHJsX291dGwoaW50ZXJ2YWwsIFRNVTBfVENOVCk7Ci0JY3RybF9vdXRiKFRNVV9UU1RSX0lOSVQsIFRNVV9UU1RSKTsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBydGNfcmVzb3VyY2VzW10gPSB7Ci0JWzBdID0gewotCQkvKiBSVEMgYmFzZSwgZmlsbGVkIGluIGJ5IHJ0Y19pbml0ICovCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCi0JfSwKLQlbMV0gPSB7Ci0JCS8qIFBlcmlvZCBJUlEgKi8KLQkJLnN0YXJ0CT0gSVJRX1BSSSwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQlbMl0gPSB7Ci0JCS8qIENhcnJ5IElSUSAqLwotCQkuc3RhcnQJPSBJUlFfQ1VJLAotCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCVszXSA9IHsKLQkJLyogQWxhcm0gSVJRICovCi0JCS5zdGFydAk9IElSUV9BVEksCi0JCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0gewotCS5uYW1lCQk9ICJzaC1ydGMiLAotCS5pZAkJPSAtMSwKLQkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCi0JLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJ0Y19pbml0KHZvaWQpCi17Ci0JcnRjX3Jlc291cmNlc1swXS5zdGFydAk9IHJ0Y19iYXNlOwotCXJ0Y19yZXNvdXJjZXNbMF0uZW5kCT0gcnRjX3Jlc291cmNlc1swXS5zdGFydCArIDB4NTggLSAxOwotCi0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmcnRjX2RldmljZSk7Ci19Ci1kZXZpY2VfaW5pdGNhbGwocnRjX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdmODU3Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gva2VybmVsL3RpbWVycy9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSB2YXJpb3VzIExpbnV4L1N1cGVySCB0aW1lcnMKLSMKLQotb2JqLXkJOj0gdGltZXIubwotCi1vYmotJChDT05GSUdfU0hfVE1VKQkJKz0gdGltZXItdG11Lm8KLW9iai0kKENPTkZJR19TSF9NVFUyKQkJKz0gdGltZXItbXR1Mi5vCi1vYmotJChDT05GSUdfU0hfQ01UKQkJKz0gdGltZXItY210Lm8KLQotb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUKQkrPSB0aW1lci1icm9hZGNhc3QubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLWNtdC5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLWNtdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWEzNDg2Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci1jbXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKgotICogYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLWNtdC5jIC0gQ01UIFRpbWVyIFN1cHBvcnQKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA1ICBZb3NoaW5vcmkgU2F0bwotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgotI2luY2x1ZGUgPGFzbS90aW1lci5oPgotI2luY2x1ZGUgPGFzbS9ydGMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2Nsb2NrLmg+Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCi0jZGVmaW5lIENNVF9DTVNUUgkweGY4NGEwMDcwCi0jZGVmaW5lIENNVF9DTUNTUl8wCTB4Zjg0YTAwNzIKLSNkZWZpbmUgQ01UX0NNQ05UXzAJMHhmODRhMDA3NAotI2RlZmluZSBDTVRfQ01DT1JfMAkweGY4NGEwMDc2Ci0jZGVmaW5lIENNVF9DTUNTUl8xCTB4Zjg0YTAwNzgKLSNkZWZpbmUgQ01UX0NNQ05UXzEJMHhmODRhMDA3YQotI2RlZmluZSBDTVRfQ01DT1JfMQkweGY4NGEwMDdjCi0KLSNkZWZpbmUgU1RCQ1IzCQkweGY4MGEwMDAwCi0jZGVmaW5lIGNtdF9jbG9ja19lbmFibGUoKSBkbyB7CWN0cmxfb3V0YihjdHJsX2luYihTVEJDUjMpICYgfjB4MTAsIFNUQkNSMyk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQ01UX0NNQ1NSX0lOSVQJMHgwMDQwCi0jZGVmaW5lIENNVF9DTUNTUl9DQUxJQgkweDAwMDAKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwMykgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcyNjMpCi0jZGVmaW5lIENNVF9DTVNUUgkweGZmZmVjMDAwCi0jZGVmaW5lIENNVF9DTUNTUl8wCTB4ZmZmZWMwMDIKLSNkZWZpbmUgQ01UX0NNQ05UXzAJMHhmZmZlYzAwNAotI2RlZmluZSBDTVRfQ01DT1JfMAkweGZmZmVjMDA2Ci0KLSNkZWZpbmUgU1RCQ1I0CQkweGZmZmUwNDBjCi0jZGVmaW5lIGNtdF9jbG9ja19lbmFibGUoKSBkbyB7CWN0cmxfb3V0YihjdHJsX2luYihTVEJDUjQpICYgfjB4MDQsIFNUQkNSNCk7IH0gd2hpbGUoMCkKLSNkZWZpbmUgQ01UX0NNQ1NSX0lOSVQJMHgwMDQwCi0jZGVmaW5lIENNVF9DTUNTUl9DQUxJQgkweDAwMDAKLSNlbHNlCi0jZXJyb3IgIlVua25vd24gQ1BVIFNVQlRZUEUiCi0jZW5kaWYKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY210X3RpbWVyX2dldF9vZmZzZXQodm9pZCkKLXsKLQlpbnQgY291bnQ7Ci0Jc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvdW50X3AgPSAweGZmZmY7ICAgIC8qIGZvciB0aGUgZmlyc3QgY2FsbCBhZnRlciBib290ICovCi0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgamlmZmllc19wID0gMDsKLQotCS8qCi0JICogY2FjaGUgdm9sYXRpbGUgamlmZmllcyB0ZW1wb3JhcmlseTsgd2UgaGF2ZSBJUlFzIHR1cm5lZCBvZmYuCi0JICovCi0JdW5zaWduZWQgbG9uZyBqaWZmaWVzX3Q7Ci0KLQkvKiB0aW1lciBjb3VudCBtYXkgdW5kZXJmbG93IHJpZ2h0IGhlcmUgKi8KLQljb3VudCA9ICBjdHJsX2ludyhDTVRfQ01DT1JfMCk7Ci0JY291bnQgLT0gY3RybF9pbncoQ01UX0NNQ05UXzApOwotCi0JamlmZmllc190ID0gamlmZmllczsKLQotCS8qCi0JICogYXZvaWRpbmcgdGltZXIgaW5jb25zaXN0ZW5jaWVzICh0aGV5IGFyZSByYXJlLCBidXQgdGhleSBoYXBwZW4pLi4uCi0JICogdGhlcmUgaXMgb25lIGtpbmQgb2YgcHJvYmxlbSB0aGF0IG11c3QgYmUgYXZvaWRlZCBoZXJlOgotCSAqICAxLiB0aGUgdGltZXIgY291bnRlciB1bmRlcmZsb3dzCi0JICovCi0KLQlpZiAoamlmZmllc190ID09IGppZmZpZXNfcCkgewotCQlpZiAoY291bnQgPiBjb3VudF9wKSB7Ci0JCQkvKiB0aGUgbnV0Y2FzZSAqLwotCQkJaWYgKGN0cmxfaW53KENNVF9DTUNTUl8wKSAmIDB4ODApIHsgLyogQ2hlY2sgQ01GIGJpdCAqLwotCQkJCWNvdW50IC09IExBVENIOwotCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoIiVzICgpOiBoYXJkd2FyZSB0aW1lciBwcm9ibGVtP1xuIiwKLQkJCQkgICAgICAgX19mdW5jX18pOwotCQkJfQotCQl9Ci0JfSBlbHNlCi0JCWppZmZpZXNfcCA9IGppZmZpZXNfdDsKLQotCWNvdW50X3AgPSBjb3VudDsKLQotCWNvdW50ID0gKChMQVRDSC0xKSAtIGNvdW50KSAqIFRJQ0tfU0laRTsKLQljb3VudCA9IChjb3VudCArIExBVENILzIpIC8gTEFUQ0g7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBjbXRfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXR1czsKLQotCS8qIENsZWFyIENNRiBiaXQgKi8KLQl0aW1lcl9zdGF0dXMgPSBjdHJsX2ludyhDTVRfQ01DU1JfMCk7Ci0JdGltZXJfc3RhdHVzICY9IH4weDgwOwotCWN0cmxfb3V0dyh0aW1lcl9zdGF0dXMsIENNVF9DTUNTUl8wKTsKLQotCWhhbmRsZV90aW1lcl90aWNrKCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGNtdF9pcnEgPSB7Ci0JLm5hbWUJCT0gInRpbWVyIiwKLQkuaGFuZGxlcgk9IGNtdF90aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAotfTsKLQotc3RhdGljIHZvaWQgY210X2Nsa19pbml0KHN0cnVjdCBjbGsgKmNsaykKLXsKLQl1OCBkaXZpc29yID0gQ01UX0NNQ1NSX0lOSVQgJiAweDM7Ci0JY3RybF9pbncoQ01UX0NNQ1NSXzApOwotCWN0cmxfb3V0dyhDTVRfQ01DU1JfSU5JVCwgQ01UX0NNQ1NSXzApOwotCWNsay0+cGFyZW50ID0gY2xrX2dldChOVUxMLCAibW9kdWxlX2NsayIpOwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gKDggPDwgKGRpdmlzb3IgPDwgMSkpOwotfQotCi1zdGF0aWMgdm9pZCBjbXRfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdTggZGl2aXNvciA9IGN0cmxfaW53KENNVF9DTUNTUl8wKSAmIDB4MzsKLQljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvICg4IDw8IChkaXZpc29yIDw8IDEpKTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIGNtdF9jbGtfb3BzID0gewotCS5pbml0CQk9IGNtdF9jbGtfaW5pdCwKLQkucmVjYWxjCQk9IGNtdF9jbGtfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgY210MF9jbGsgPSB7Ci0JLm5hbWUJCT0gImNtdDBfY2xrIiwKLQkub3BzCQk9ICZjbXRfY2xrX29wcywKLX07Ci0KLXN0YXRpYyBpbnQgY210X3RpbWVyX3N0YXJ0KHZvaWQpCi17Ci0JY3RybF9vdXR3KGN0cmxfaW53KENNVF9DTVNUUikgfCAweDAxLCBDTVRfQ01TVFIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNtdF90aW1lcl9zdG9wKHZvaWQpCi17Ci0JY3RybF9vdXR3KGN0cmxfaW53KENNVF9DTVNUUikgJiB+MHgwMSwgQ01UX0NNU1RSKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjbXRfdGltZXJfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7Ci0KLQljbXRfY2xvY2tfZW5hYmxlKCk7Ci0KLQlzZXR1cF9pcnEoQ09ORklHX1NIX1RJTUVSX0lSUSwgJmNtdF9pcnEpOwotCi0JY210MF9jbGsucGFyZW50ID0gY2xrX2dldChOVUxMLCAibW9kdWxlX2NsayIpOwotCi0JY210X3RpbWVyX3N0b3AoKTsKLQotCWludGVydmFsID0gY210MF9jbGsucGFyZW50LT5yYXRlIC8gOCAvIEhaOwotCXByaW50ayhLRVJOX0lORk8gIkludGVydmFsID0gJWxkXG4iLCBpbnRlcnZhbCk7Ci0KLQljdHJsX291dHcoaW50ZXJ2YWwsIENNVF9DTUNPUl8wKTsKLQotCWNsa19yZWdpc3RlcigmY210MF9jbGspOwotCWNsa19lbmFibGUoJmNtdDBfY2xrKTsKLQotCWNtdF90aW1lcl9zdGFydCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyX29wcyBjbXRfdGltZXJfb3BzID0gewotCS5pbml0CQk9IGNtdF90aW1lcl9pbml0LAotCS5zdGFydAkJPSBjbXRfdGltZXJfc3RhcnQsCi0JLnN0b3AJCT0gY210X3RpbWVyX3N0b3AsCi0jaWZuZGVmIENPTkZJR19HRU5FUklDX1RJTUUKLQkuZ2V0X29mZnNldAk9IGNtdF90aW1lcl9nZXRfb2Zmc2V0LAotI2VuZGlmCi19OwotCi1zdHJ1Y3Qgc3lzX3RpbWVyIGNtdF90aW1lciA9IHsKLQkubmFtZQk9ICJjbXQiLAotCS5vcHMJPSAmY210X3RpbWVyX29wcywKLX07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItbXR1Mi5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLW10dTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwZWYwMS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItbXR1Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItbXR1Mi5jIC0gTVRVMiBUaW1lciBTdXBwb3J0Ci0gKgotICogIENvcHlyaWdodCAoQykgMjAwNSAgUGF1bCBNdW5kdAotICoKLSAqIEJhc2VkIG9mZiBvZiBhcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9jbG9jay5oPgotCi0vKgotICogV2UgdXNlIGNoYW5uZWwgMSBmb3Igb3VyIGxvd2x5IHN5c3RlbSB0aW1lci4gQ2hhbm5lbCAyIHdvdWxkIGJlIHRoZSBvdGhlcgotICogbGlrZWx5IGNhbmRpZGF0ZSwgYnV0IHdlIGxlYXZlIGl0IGFsb25lIGFzIGl0IGhhcyBoaWdoZXIgZGl2aXNvcnMgdGhhdAotICogd291bGQgYmUgb2YgbW9yZSB1c2UgdG8gb3RoZXIgbW9yZSBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbnMuCi0gKgotICogVE9ETzogUHJlc2VudGx5IHdlIG9ubHkgaW1wbGVtZW50IGEgMTYtYml0IHNpbmdsZS1jaGFubmVsIHN5c3RlbSB0aW1lci4KLSAqIEhvd2V2ZXIsIHdlIGNhbiBpbXBsZW1lbnQgY2hhbm5lbCBjYXNjYWRlIGlmIHdlIGdvIHRoZSBvdmVyZmxvdyByb3V0ZSBhbmQKLSAqIGdldCBhd2F5IHdpdGggdXNpbmcgMiBNVFUyIGNoYW5uZWxzIGFzIGEgMzItYml0IHRpbWVyLgotICovCi0jZGVmaW5lIE1UVTJfVFNUUgkweGZmZmU0MjgwCi0jZGVmaW5lIE1UVTJfVENSXzEJMHhmZmZlNDM4MAotI2RlZmluZSBNVFUyX1RNRFJfMQkweGZmZmU0MzgxCi0jZGVmaW5lIE1UVTJfVElPUl8xCTB4ZmZmZTQzODIKLSNkZWZpbmUgTVRVMl9USUVSXzEJMHhmZmZlNDM4NAotI2RlZmluZSBNVFUyX1RTUl8xCTB4ZmZmZTQzODUKLSNkZWZpbmUgTVRVMl9UQ05UXzEJMHhmZmZlNDM4NgkvKiAxNi1iaXQgY291bnRlciAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjAxKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjAzKQotI2RlZmluZSBNVFUyX1RHUkFfMQkweGZmZmU0Mzg4Ci0jZWxzZQotI2RlZmluZSBNVFUyX1RHUkFfMQkweGZmZmU0MzhhCi0jZW5kaWYKLQotI2RlZmluZSBTVEJDUjMJCTB4ZmZmZTA0MDgKLQotI2RlZmluZSBNVFUyX1RTVFJfQ1NUMQkoMSA8PCAxKQkvKiBDb3VudGVyIFN0YXJ0IDEgKi8KLQotI2RlZmluZSBNVFUyX1RTUl9UR0ZBCSgxIDw8IDApCS8qIEdSQSBjb21wYXJlIG1hdGNoICovCi0KLSNkZWZpbmUgTVRVMl9USUVSX1RHSUVBCSgxIDw8IDApCS8qIEdSQSBjb21wYXJlIG1hdGNoICBpbnRlcnJ1cHQgZW5hYmxlICovCi0KLSNkZWZpbmUgTVRVMl9UQ1JfSU5JVAkweDIyCi0KLSNkZWZpbmUgTVRVMl9UQ1JfQ0FMSUIgIDB4MDAKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgbXR1Ml90aW1lcl9nZXRfb2Zmc2V0KHZvaWQpCi17Ci0JaW50IGNvdW50OwotCXN0YXRpYyBpbnQgY291bnRfcCA9IDB4N2ZmZjsJLyogZm9yIHRoZSBmaXJzdCBjYWxsIGFmdGVyIGJvb3QgKi8KLQlzdGF0aWMgdW5zaWduZWQgbG9uZyBqaWZmaWVzX3AgPSAwOwotCi0JLyoKLQkgKiBjYWNoZSB2b2xhdGlsZSBqaWZmaWVzIHRlbXBvcmFyaWx5OyB3ZSBoYXZlIElSUXMgdHVybmVkIG9mZi4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIGppZmZpZXNfdDsKLQotCS8qIHRpbWVyIGNvdW50IG1heSB1bmRlcmZsb3cgcmlnaHQgaGVyZSAqLwotCWNvdW50ID0gY3RybF9pbncoTVRVMl9UQ05UXzEpOwkvKiByZWFkIHRoZSBsYXRjaGVkIGNvdW50ICovCi0KLQlqaWZmaWVzX3QgPSBqaWZmaWVzOwotCi0JLyoKLQkgKiBhdm9pZGluZyB0aW1lciBpbmNvbnNpc3RlbmNpZXMgKHRoZXkgYXJlIHJhcmUsIGJ1dCB0aGV5IGhhcHBlbikuLi4KLQkgKiB0aGVyZSBpcyBvbmUga2luZCBvZiBwcm9ibGVtIHRoYXQgbXVzdCBiZSBhdm9pZGVkIGhlcmU6Ci0JICogIDEuIHRoZSB0aW1lciBjb3VudGVyIHVuZGVyZmxvd3MKLQkgKi8KLQotCWlmIChqaWZmaWVzX3QgPT0gamlmZmllc19wKSB7Ci0JCWlmIChjb3VudCA+IGNvdW50X3ApIHsKLQkJCWlmIChjdHJsX2luYihNVFUyX1RTUl8xKSAmIE1UVTJfVFNSX1RHRkEpIHsKLQkJCQljb3VudCAtPSBMQVRDSDsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKCIlcyAoKTogaGFyZHdhcmUgdGltZXIgcHJvYmxlbT9cbiIsCi0JCQkJICAgICAgIF9fZnVuY19fKTsKLQkJCX0KLQkJfQotCX0gZWxzZQotCQlqaWZmaWVzX3AgPSBqaWZmaWVzX3Q7Ci0KLQljb3VudF9wID0gY291bnQ7Ci0KLQljb3VudCA9ICgoTEFUQ0gtMSkgLSBjb3VudCkgKiBUSUNLX1NJWkU7Ci0JY291bnQgPSAoY291bnQgKyBMQVRDSC8yKSAvIExBVENIOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgbXR1Ml90aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGxvbmcgdGltZXJfc3RhdHVzOwotCi0JLyogQ2xlYXIgVEdGQSBiaXQgKi8KLQl0aW1lcl9zdGF0dXMgPSBjdHJsX2luYihNVFUyX1RTUl8xKTsKLQl0aW1lcl9zdGF0dXMgJj0gfk1UVTJfVFNSX1RHRkE7Ci0JY3RybF9vdXRiKHRpbWVyX3N0YXR1cywgTVRVMl9UU1JfMSk7Ci0KLQkvKiBEbyB0aW1lciB0aWNrICovCi0JaGFuZGxlX3RpbWVyX3RpY2soKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gbXR1Ml9pcnEgPSB7Ci0JLm5hbWUJCT0gInRpbWVyIiwKLQkuaGFuZGxlcgk9IG10dTJfdGltZXJfaW50ZXJydXB0LAotCS5mbGFncwkJPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9USU1FUiB8IElSUUZfSVJRUE9MTCwKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGl2aXNvcnNbXSA9IHsgMSwgNCwgMTYsIDY0LCAxLCAxLCAyNTYgfTsKLQotc3RhdGljIHZvaWQgbXR1Ml9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdTggaWR4ID0gTVRVMl9UQ1JfSU5JVCAmIDB4NzsKLQotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZGl2aXNvcnNbaWR4XTsKLQkvKiBTdGFydCBUQ05UIGNvdW50aW5nICovCi0JY3RybF9vdXRiKGN0cmxfaW5iKE1UVTJfVFNUUikgfCBNVFUyX1RTVFJfQ1NUMSwgTVRVMl9UU1RSKTsKLQotfQotCi1zdGF0aWMgdm9pZCBtdHUyX2Nsa19yZWNhbGMoc3RydWN0IGNsayAqY2xrKQotewotCXU4IGlkeCA9IGN0cmxfaW5iKE1UVTJfVENSXzEpICYgMHg3OwotCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gZGl2aXNvcnNbaWR4XTsKLX0KLQotc3RhdGljIHN0cnVjdCBjbGtfb3BzIG10dTJfY2xrX29wcyA9IHsKLQkuaW5pdAkJPSBtdHUyX2Nsa19pbml0LAotCS5yZWNhbGMJCT0gbXR1Ml9jbGtfcmVjYWxjLAotfTsKLQotc3RhdGljIHN0cnVjdCBjbGsgbXR1Ml9jbGsxID0gewotCS5uYW1lCQk9ICJtdHUyX2NsazEiLAotCS5vcHMJCT0gJm10dTJfY2xrX29wcywKLX07Ci0KLXN0YXRpYyBpbnQgbXR1Ml90aW1lcl9zdGFydCh2b2lkKQotewotCWN0cmxfb3V0YihjdHJsX2luYihNVFUyX1RTVFIpIHwgTVRVMl9UU1RSX0NTVDEsIE1UVTJfVFNUUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXR1Ml90aW1lcl9zdG9wKHZvaWQpCi17Ci0JY3RybF9vdXRiKGN0cmxfaW5iKE1UVTJfVFNUUikgJiB+TVRVMl9UU1RSX0NTVDEsIE1UVTJfVFNUUik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbXR1Ml90aW1lcl9pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKLQotCXNldHVwX2lycShDT05GSUdfU0hfVElNRVJfSVJRLCAmbXR1Ml9pcnEpOwotCi0JbXR1Ml9jbGsxLnBhcmVudCA9IGNsa19nZXQoTlVMTCwgIm1vZHVsZV9jbGsiKTsKLQotCWN0cmxfb3V0YihjdHJsX2luYihTVEJDUjMpICYgKH4weDIwKSwgU1RCQ1IzKTsKLQotCS8qIE5vcm1hbCBvcGVyYXRpb24gKi8KLQljdHJsX291dGIoMCwgTVRVMl9UTURSXzEpOwotCWN0cmxfb3V0YihNVFUyX1RDUl9JTklULCBNVFUyX1RDUl8xKTsKLQljdHJsX291dGIoMHgwMSwgTVRVMl9USU9SXzEpOwotCi0JLyogRW5hYmxlIHVuZGVyZmxvdyBpbnRlcnJ1cHQgKi8KLQljdHJsX291dGIoY3RybF9pbmIoTVRVMl9USUVSXzEpIHwgTVRVMl9USUVSX1RHSUVBLCBNVFUyX1RJRVJfMSk7Ci0KLQlpbnRlcnZhbCA9IENPTkZJR19TSF9QQ0xLX0ZSRVEgLyAxNiAvIEhaOwotCXByaW50ayhLRVJOX0lORk8gIkludGVydmFsID0gJWxkXG4iLCBpbnRlcnZhbCk7Ci0KLQljdHJsX291dHcoaW50ZXJ2YWwsIE1UVTJfVEdSQV8xKTsKLQljdHJsX291dHcoMCwgTVRVMl9UQ05UXzEpOwotCi0JY2xrX3JlZ2lzdGVyKCZtdHUyX2NsazEpOwotCWNsa19lbmFibGUoJm10dTJfY2xrMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHN5c190aW1lcl9vcHMgbXR1Ml90aW1lcl9vcHMgPSB7Ci0JLmluaXQJCT0gbXR1Ml90aW1lcl9pbml0LAotCS5zdGFydAkJPSBtdHUyX3RpbWVyX3N0YXJ0LAotCS5zdG9wCQk9IG10dTJfdGltZXJfc3RvcCwKLSNpZm5kZWYgQ09ORklHX0dFTkVSSUNfVElNRQotCS5nZXRfb2Zmc2V0CT0gbXR1Ml90aW1lcl9nZXRfb2Zmc2V0LAotI2VuZGlmCi19OwotCi1zdHJ1Y3Qgc3lzX3RpbWVyIG10dTJfdGltZXIgPSB7Ci0JLm5hbWUJPSAibXR1MiIsCi0JLm9wcwk9ICZtdHUyX3RpbWVyX29wcywKLX07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOGQ4OTMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMgLSBUTVUgVGltZXIgU3VwcG9ydAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA3ICBQYXVsIE11bmR0Ci0gKgotICogVE1VIGhhbmRsaW5nIGNvZGUgaGFja2VkIG91dCBvZiBhcmNoL3NoL2tlcm5lbC90aW1lLmMKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAwICBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIsIDIwMDMsIDIwMDQgIFBhdWwgTXVuZHQKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDIgIE0uIFIuIEJyb3duICA8bXJicm93bkBsaW51eC1zaC5vcmc+Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KLSNpbmNsdWRlIDxhc20vdGltZXIuaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9jbG9jay5oPgotCi0jZGVmaW5lIFRNVV9UT0NSX0lOSVQJMHgwMAotI2RlZmluZSBUTVVfVENSX0lOSVQJMHgwMDIwCi0KLSNkZWZpbmUgVE1VMAkJKDApCi0jZGVmaW5lIFRNVTEJCSgxKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3RtdV9zdGFydChpbnQgdG11X251bSkKLXsKLQljdHJsX291dGIoY3RybF9pbmIoVE1VXzAxMl9UU1RSKSB8ICgweDE8PHRtdV9udW0pLCBUTVVfMDEyX1RTVFIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3RtdV9zZXRfaXJxKGludCB0bXVfbnVtLCBpbnQgZW5hYmxlZCkKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRtdV90Y3IgPSBUTVUwX1RDUiArICgweGMqdG11X251bSk7Ci0JY3RybF9vdXR3KCAoZW5hYmxlZCA/IGN0cmxfaW53KHRtdV90Y3IpIHwgKDE8PDUpIDogY3RybF9pbncodG11X3RjcikgJiB+KDE8PDUpKSwgdG11X3Rjcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfdG11X3N0b3AoaW50IHRtdV9udW0pCi17Ci0JY3RybF9vdXRiKGN0cmxfaW5iKFRNVV8wMTJfVFNUUikgJiB+KDB4MTw8dG11X251bSksIFRNVV8wMTJfVFNUUik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfdG11X2NsZWFyX3N0YXR1cyhpbnQgdG11X251bSkKLXsKLQlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHRtdV90Y3IgPSBUTVUwX1RDUiArICgweGMqdG11X251bSk7Ci0JLyogQ2xlYXIgVU5GIGJpdCAqLwotCWN0cmxfb3V0dyhjdHJsX2ludyh0bXVfdGNyKSAmIH4weDEwMCwgdG11X3Rjcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfdG11X3JlYWQoaW50IHRtdV9udW0pCi17Ci0gICAgICAgIHJldHVybiBjdHJsX2lubChUTVUwX1RDTlQrMHhDKnRtdV9udW0pOwotfQotCi1zdGF0aWMgaW50IHRtdV90aW1lcl9zdGFydCh2b2lkKQotewotCV90bXVfc3RhcnQoVE1VMCk7Ci0JX3RtdV9zdGFydChUTVUxKTsKLQlfdG11X3NldF9pcnEoVE1VMCwxKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0bXVfdGltZXJfc3RvcCh2b2lkKQotewotCV90bXVfc3RvcChUTVUwKTsKLQlfdG11X3N0b3AoVE1VMSk7Ci0JX3RtdV9jbGVhcl9zdGF0dXMoVE1VMCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBhbHNvIHdoZW4gdGhlIG1vZHVsZV9jbGsgaXMgc2NhbGVkIHRoZSBUTVUxCi0gKiB3aWxsIHNob3cgdGhlIHNhbWUgZnJlcXVlbmN5Ci0gKi8KLXN0YXRpYyBpbnQgdG11c19hcmVfc2NhbGVkOwotCi1zdGF0aWMgY3ljbGVfdCB0bXVfdGltZXJfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQotewotCXJldHVybiAoKGN5Y2xlX3QpKH5fdG11X3JlYWQoVE1VMSkpKTw8dG11c19hcmVfc2NhbGVkOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRtdV9sYXRlc3RfaW50ZXJ2YWxbM107Ci1zdGF0aWMgdm9pZCB0bXVfdGltZXJfc2V0X2ludGVydmFsKGludCB0bXVfbnVtLCB1bnNpZ25lZCBsb25nIGludGVydmFsLCB1bnNpZ25lZCBpbnQgcmVsb2FkKQotewotCXVuc2lnbmVkIGxvbmcgdG11X3RjbnQgPSBUTVUwX1RDTlQgKyB0bXVfbnVtKjB4QzsKLQl1bnNpZ25lZCBsb25nIHRtdV90Y29yID0gVE1VMF9UQ09SICsgdG11X251bSoweEM7Ci0KLQlfdG11X3N0b3AodG11X251bSk7Ci0KLQljdHJsX291dGwoaW50ZXJ2YWwsIHRtdV90Y250KTsKLQl0bXVfbGF0ZXN0X2ludGVydmFsW3RtdV9udW1dID0gaW50ZXJ2YWw7Ci0KLQkvKgotCSAqIFRDTlQgcmVsb2FkcyBmcm9tIFRDT1Igb24gdW5kZXJmbG93LCBjbGVhciBpdCBpZiB3ZSBkb24ndAotCSAqIGludGVuZCB0byBhdXRvLXJlbG9hZAotCSAqLwotCWN0cmxfb3V0bCggcmVsb2FkID8gaW50ZXJ2YWwgOiAwICwgdG11X3Rjb3IpOwotCi0JX3RtdV9zdGFydCh0bXVfbnVtKTsKLX0KLQotc3RhdGljIGludCB0bXVfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCi0JCQkgICAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCi17Ci0JdG11X3RpbWVyX3NldF9pbnRlcnZhbChUTVUwLGN5Y2xlcywgZXZ0LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1BFUklPRElDKTsKLQlfdG11X3NldF9pcnEoVE1VMCwxKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdG11X3NldF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAotCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKLXsKLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgotCQljdHJsX291dGwodG11X2xhdGVzdF9pbnRlcnZhbFtUTVUwXSwgVE1VMF9UQ09SKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCQljdHJsX291dGwoMCwgVE1VMF9UQ09SKTsKLQkJYnJlYWs7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKLQljYXNlIENMT0NLX0VWVF9NT0RFX1JFU1VNRToKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSB0bXUwX2Nsb2NrZXZlbnQgPSB7Ci0JLm5hbWUJCT0gInRtdTAiLAotCS5zaGlmdAkJPSAzMiwKLQkuZmVhdHVyZXMJPSBDTE9DS19FVlRfRkVBVF9QRVJJT0RJQyB8IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCi0JLnNldF9tb2RlCT0gdG11X3NldF9tb2RlLAotCS5zZXRfbmV4dF9ldmVudAk9IHRtdV9zZXRfbmV4dF9ldmVudCwKLX07Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCB0bXVfdGltZXJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15KQotewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZ0bXUwX2Nsb2NrZXZlbnQ7Ci0JX3RtdV9jbGVhcl9zdGF0dXMoVE1VMCk7Ci0JX3RtdV9zZXRfaXJxKFRNVTAsdG11MF9jbG9ja2V2ZW50Lm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7Ci0KLQlzd2l0Y2ggKHRtdTBfY2xvY2tldmVudC5tb2RlKSB7Ci0JY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6Ci0JCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHRtdTBfaXJxID0gewotCS5uYW1lCQk9ICJwZXJpb2RpYy9vbmVzaG90IHRpbWVyIiwKLQkuaGFuZGxlcgk9IHRtdV90aW1lcl9pbnRlcnJ1cHQsCi0JLmZsYWdzCQk9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMLAotfTsKLQotc3RhdGljIHZvaWQgX19pbml0IHRtdV9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCi17Ci0JdTggZGl2aXNvciAgPSBUTVVfVENSX0lOSVQgJiAweDc7Ci0JaW50IHRtdV9udW0gPSBjbGstPm5hbWVbM10tJzAnOwotCWN0cmxfb3V0dyhUTVVfVENSX0lOSVQsIFRNVTBfVENSKyh0bXVfbnVtKjB4QykpOwotCWNsay0+cmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyAoNCA8PCAoZGl2aXNvciA8PCAxKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRtdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgdG11X251bSA9IGNsay0+bmFtZVszXS0nMCc7Ci0JdW5zaWduZWQgbG9uZyBwcmV2X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXU4IGRpdmlzb3IgPSBjdHJsX2ludyhUTVUwX1RDUit0bXVfbnVtKjB4QykgJiAweDc7Ci0JY2xrLT5yYXRlICA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCkgLyAoNCA8PCAoZGl2aXNvciA8PCAxKSk7Ci0KLQlpZihwcmV2X3JhdGU9PWNsa19nZXRfcmF0ZShjbGspKQotCQlyZXR1cm47Ci0KLQlpZih0bXVfbnVtKQotCQlyZXR1cm47IC8qIE5vIG1vcmUgd29yayBvbiBUTVUxICovCi0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JdG11c19hcmVfc2NhbGVkID0gKHByZXZfcmF0ZSA+IGNsay0+cmF0ZSk7Ci0KLQlfdG11X3N0b3AoVE1VMCk7Ci0KLQl0bXUwX2Nsb2NrZXZlbnQubXVsdCA9IGRpdl9zYyhjbGstPnJhdGUsIE5TRUNfUEVSX1NFQywKLQkJCQl0bXUwX2Nsb2NrZXZlbnQuc2hpZnQpOwotCXRtdTBfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPQotCQkJY2xvY2tldmVudF9kZWx0YTJucygtMSwgJnRtdTBfY2xvY2tldmVudCk7Ci0JdG11MF9jbG9ja2V2ZW50Lm1pbl9kZWx0YV9ucyA9Ci0JCQljbG9ja2V2ZW50X2RlbHRhMm5zKDEsICZ0bXUwX2Nsb2NrZXZlbnQpOwotCi0JaWYgKHRtdXNfYXJlX3NjYWxlZCkKLQkJdG11X2xhdGVzdF9pbnRlcnZhbFtUTVUwXSA+Pj0gMTsKLQllbHNlCi0JCXRtdV9sYXRlc3RfaW50ZXJ2YWxbVE1VMF0gPDw9IDE7Ci0KLQl0bXVfdGltZXJfc2V0X2ludGVydmFsKFRNVTAsCi0JCXRtdV9sYXRlc3RfaW50ZXJ2YWxbVE1VMF0sCi0JCXRtdTBfY2xvY2tldmVudC5tb2RlID09IENMT0NLX0VWVF9NT0RFX1BFUklPRElDKTsKLQotCV90bXVfc3RhcnQoVE1VMCk7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrX29wcyB0bXVfY2xrX29wcyA9IHsKLQkuaW5pdAkJPSB0bXVfY2xrX2luaXQsCi0JLnJlY2FsYwkJPSB0bXVfY2xrX3JlY2FsYywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2xrIHRtdTBfY2xrID0gewotCS5uYW1lCQk9ICJ0bXUwX2NsayIsCi0JLm9wcwkJPSAmdG11X2Nsa19vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IGNsayB0bXUxX2NsayA9IHsKLQkubmFtZQkJPSAidG11MV9jbGsiLAotCS5vcHMJCT0gJnRtdV9jbGtfb3BzLAotfTsKLQotc3RhdGljIGludCB0bXVfdGltZXJfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7Ci0JdW5zaWduZWQgbG9uZyBmcmVxdWVuY3k7Ci0KLQlzZXR1cF9pcnEoQ09ORklHX1NIX1RJTUVSX0lSUSwgJnRtdTBfaXJxKTsKLQotCXRtdTBfY2xrLnBhcmVudCA9IGNsa19nZXQoTlVMTCwgIm1vZHVsZV9jbGsiKTsKLQl0bXUxX2Nsay5wYXJlbnQgPSBjbGtfZ2V0KE5VTEwsICJtb2R1bGVfY2xrIik7Ci0KLQl0bXVfdGltZXJfc3RvcCgpOwotCi0jaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMCkgJiYgXAotICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpICYmIFwKLSAgICAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKSAmJiBcCi0gICAgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgJiYgXAotICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODYpICYmIFwKLSAgICAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKLQljdHJsX291dGIoVE1VX1RPQ1JfSU5JVCwgVE1VX1RPQ1IpOwotI2VuZGlmCi0KLQljbGtfcmVnaXN0ZXIoJnRtdTBfY2xrKTsKLQljbGtfcmVnaXN0ZXIoJnRtdTFfY2xrKTsKLQljbGtfZW5hYmxlKCZ0bXUwX2Nsayk7Ci0JY2xrX2VuYWJsZSgmdG11MV9jbGspOwotCi0JZnJlcXVlbmN5ID0gY2xrX2dldF9yYXRlKCZ0bXUwX2Nsayk7Ci0JaW50ZXJ2YWwgPSAoZnJlcXVlbmN5ICsgSFogLyAyKSAvIEhaOwotCi0JdG11X3RpbWVyX3NldF9pbnRlcnZhbChUTVUwLGludGVydmFsLCAxKTsKLQl0bXVfdGltZXJfc2V0X2ludGVydmFsKFRNVTEsfjAsMSk7Ci0KLQlfdG11X3N0YXJ0KFRNVTEpOwotCi0JY2xvY2tzb3VyY2Vfc2gucmF0aW5nID0gMjAwOwotCWNsb2Nrc291cmNlX3NoLm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKTsKLQljbG9ja3NvdXJjZV9zaC5yZWFkID0gdG11X3RpbWVyX3JlYWQ7Ci0JY2xvY2tzb3VyY2Vfc2guc2hpZnQgPSAxMDsKLQljbG9ja3NvdXJjZV9zaC5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChjbGtfZ2V0X3JhdGUoJnRtdTFfY2xrKSwKLQkJCQkJCSAgY2xvY2tzb3VyY2Vfc2guc2hpZnQpOwotCWNsb2Nrc291cmNlX3NoLmZsYWdzID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVM7Ci0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX3NoKTsKLQotCXRtdTBfY2xvY2tldmVudC5tdWx0ID0gZGl2X3NjKGZyZXF1ZW5jeSwgTlNFQ19QRVJfU0VDLAotCQkJCSAgICAgIHRtdTBfY2xvY2tldmVudC5zaGlmdCk7Ci0JdG11MF9jbG9ja2V2ZW50Lm1heF9kZWx0YV9ucyA9Ci0JCQljbG9ja2V2ZW50X2RlbHRhMm5zKC0xLCAmdG11MF9jbG9ja2V2ZW50KTsKLQl0bXUwX2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0KLQkJCWNsb2NrZXZlbnRfZGVsdGEybnMoMSwgJnRtdTBfY2xvY2tldmVudCk7Ci0KLQl0bXUwX2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2YoMCk7Ci0JdG11MF9jbG9ja2V2ZW50LnJhdGluZyA9IDEwMDsKLQotCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSgmdG11MF9jbG9ja2V2ZW50KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHN5c190aW1lcl9vcHMgdG11X3RpbWVyX29wcyA9IHsKLQkuaW5pdAkJPSB0bXVfdGltZXJfaW5pdCwKLQkuc3RhcnQJCT0gdG11X3RpbWVyX3N0YXJ0LAotCS5zdG9wCQk9IHRtdV90aW1lcl9zdG9wLAotfTsKLQotc3RydWN0IHN5c190aW1lciB0bXVfdGltZXIgPSB7Ci0JLm5hbWUJPSAidG11IiwKLQkub3BzCT0gJnRtdV90aW1lcl9vcHMsCi19OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLmMgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU3ZTc0Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBhcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXIuYyAtIENvbW1vbiB0aW1lciBjb2RlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNSAgUGF1bCBNdW5kdAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8YXNtL3RpbWVyLmg+Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzX3RpbWVyICpzeXNfdGltZXJzW10gPSB7Ci0jaWZkZWYgQ09ORklHX1NIX1RNVQotCSZ0bXVfdGltZXIsCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU0hfTVRVMgotCSZtdHUyX3RpbWVyLAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NIX0NNVAotCSZjbXRfdGltZXIsCi0jZW5kaWYKLQlOVUxMLAotfTsKLQotc3RhdGljIGNoYXIgdGltZXJfb3ZlcnJpZGVbMTBdOwotc3RhdGljIGludCBfX2luaXQgdGltZXJfc2V0dXAoY2hhciAqc3RyKQotewotCWlmIChzdHIpCi0JCXN0cmxjcHkodGltZXJfb3ZlcnJpZGUsIHN0ciwgc2l6ZW9mKHRpbWVyX292ZXJyaWRlKSk7Ci0JcmV0dXJuIDE7Ci19Ci1fX3NldHVwKCJ0aW1lcj0iLCB0aW1lcl9zZXR1cCk7Ci0KLXN0cnVjdCBzeXNfdGltZXIgKmdldF9zeXNfdGltZXIodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN5c190aW1lcnMpOyBpKyspIHsKLQkJc3RydWN0IHN5c190aW1lciAqdCA9IHN5c190aW1lcnNbaV07Ci0KLQkJaWYgKHVubGlrZWx5KCF0KSkKLQkJCWJyZWFrOwotCQlpZiAodW5saWtlbHkodGltZXJfb3ZlcnJpZGVbMF0pKQotCQkJaWYgKChzdHJjbXAodGltZXJfb3ZlcnJpZGUsIHQtPm5hbWUpICE9IDApKQotCQkJCWNvbnRpbnVlOwotCQlpZiAobGlrZWx5KHQtPm9wcy0+aW5pdCgpID09IDApKQotCQkJcmV0dXJuIHQ7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwppbmRleCA0MzhmMWViLi40NjM0OGVkMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCkBAIC0yMiwxMSArMjIsMTEgQEAKIAogaW50IGlzX3ZhbGlkX2J1Z2FkZHIodW5zaWduZWQgbG9uZyBhZGRyKQogewotCXVuc2lnbmVkIHNob3J0IG9wY29kZTsKKwlpbnNuX3NpemVfdCBvcGNvZGU7CiAKIAlpZiAoYWRkciA8IFBBR0VfT0ZGU0VUKQogCQlyZXR1cm4gMDsKLQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHUxNiAqKWFkZHIsIG9wY29kZSkpCisJaWYgKHByb2JlX2tlcm5lbF9hZGRyZXNzKChpbnNuX3NpemVfdCAqKWFkZHIsIG9wY29kZSkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIG9wY29kZSA9PSBUUkFQQV9CVUdfT1BDT0RFOwpAQCAtNjYsNyArNjYsNyBAQAogCiAjaWZkZWYgQ09ORklHX0JVRwogCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSkpIHsKLQkJb3Bjb2RlX3QgaW5zbiA9ICoob3Bjb2RlX3QgKilpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOworCQlpbnNuX3NpemVfdCBpbnNuID0gKihpbnNuX3NpemVfdCAqKWluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CiAJCWlmIChpbnNuID09IFRSQVBBX0JVR19PUENPREUpCiAJCQloYW5kbGVfQlVHKHJlZ3MpOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMgYi9hcmNoL3NoL2tlcm5lbC90cmFwc18zMi5jCmluZGV4IDMwY2E5YzUuLjJiNzcyNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RyYXBzXzMyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfMzIuYwpAQCAtMzQsNiArMzQsNyBAQAogIyBkZWZpbmUgVFJBUF9JTExFR0FMX1NMT1RfSU5TVAk2CiAjIGRlZmluZSBUUkFQX0FERFJFU1NfRVJST1IJOQogIyBpZmRlZiBDT05GSUdfQ1BVX1NIMkEKKyMgIGRlZmluZSBUUkFQX1VCQwkJMTIKICMgIGRlZmluZSBUUkFQX0ZQVV9FUlJPUgkxMwogIyAgZGVmaW5lIFRSQVBfRElWWkVST19FUlJPUgkxNwogIyAgZGVmaW5lIFRSQVBfRElWT1ZGX0VSUk9SCTE4CkBAIC0xNzYsNyArMTc3LDcgQEAKICAqICAgKGlmIHRoYXQgaW5zdHJ1Y3Rpb24gaXMgaW4gYSBicmFuY2ggZGVsYXkgc2xvdCkKICAqIC0gcmV0dXJuIDAgaWYgZW11bGF0aW9uIG9rYXksIC1FRkFVTFQgb24gZXhpc3RlbnRpYWwgZXJyb3IKICAqLwotc3RhdGljIGludCBoYW5kbGVfdW5hbGlnbmVkX2lucyhvcGNvZGVfdCBpbnN0cnVjdGlvbiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCitzdGF0aWMgaW50IGhhbmRsZV91bmFsaWduZWRfaW5zKGluc25fc2l6ZV90IGluc3RydWN0aW9uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCQlzdHJ1Y3QgbWVtX2FjY2VzcyAqbWEpCiB7CiAJaW50IHJldCwgaW5kZXgsIGNvdW50OwpAQCAtMzIxLDEwICszMjIsMTAgQEAKICAqIC0gZmV0Y2hlcyB0aGUgaW5zdHJ1Y3Rpb24gZnJvbSBQQysyCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGhhbmRsZV9kZWxheXNsb3Qoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkJICAgb3Bjb2RlX3Qgb2xkX2luc3RydWN0aW9uLAorCQkJCSAgIGluc25fc2l6ZV90IG9sZF9pbnN0cnVjdGlvbiwKIAkJCQkgICBzdHJ1Y3QgbWVtX2FjY2VzcyAqbWEpCiB7Ci0Jb3Bjb2RlX3QgaW5zdHJ1Y3Rpb247CisJaW5zbl9zaXplX3QgaW5zdHJ1Y3Rpb247CiAJdm9pZCBfX3VzZXIgKmFkZHIgPSAodm9pZCBfX3VzZXIgKikocmVncy0+cGMgKwogCQlpbnN0cnVjdGlvbl9zaXplKG9sZF9pbnN0cnVjdGlvbikpOwogCkBAIC0zNjQsNyArMzY1LDcgQEAKIAogc3RhdGljIGludCBoYW5kbGVfdW5hbGlnbmVkX25vdGlmeV9jb3VudCA9IDEwOwogCi1pbnQgaGFuZGxlX3VuYWxpZ25lZF9hY2Nlc3Mob3Bjb2RlX3QgaW5zdHJ1Y3Rpb24sIHN0cnVjdCBwdF9yZWdzICpyZWdzLAoraW50IGhhbmRsZV91bmFsaWduZWRfYWNjZXNzKGluc25fc2l6ZV90IGluc3RydWN0aW9uLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCSAgICBzdHJ1Y3QgbWVtX2FjY2VzcyAqbWEpCiB7CiAJdV9pbnQgcm07CkBAIC01MjIsNyArNTIzLDcgQEAKIAl1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUgPSAwOwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAlzaWdpbmZvX3QgaW5mbzsKLQlvcGNvZGVfdCBpbnN0cnVjdGlvbjsKKwlpbnNuX3NpemVfdCBpbnN0cnVjdGlvbjsKIAlpbnQgdG1wOwogCiAJLyogSW50ZW50aW9uYWwgaWZkZWYgKi8KQEAgLTg0OSw2ICs4NTAsMTAgQEAKICNlbmRpZgogI2VuZGlmCiAKKyNpZmRlZiBUUkFQX1VCQworCXNldF9leGNlcHRpb25fdGFibGVfdmVjKFRSQVBfVUJDLCBicmVha19wb2ludF90cmFwKTsKKyNlbmRpZgorCiAJLyogU2V0dXAgVkJSIGZvciBib290IGNwdSAqLwogCXBlcl9jcHVfdHJhcF9pbml0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwc182NC5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHNfNjQuYwppbmRleCBhODU4MzFjLi4yNjdlNWViIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwc182NC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzXzY0LmMKQEAgLTM3MCw3ICszNzAsNiBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU0g2NF9VU0VSX01JU0FMSUdORURfRklYVVApCiAJLyogQ2hlY2sgYWNjZXNzaWJsZS4gIEZvciBtaXNhbGlnbmVkIGFjY2VzcyBpbiB0aGUga2VybmVsLCBhc3N1bWUgdGhlCiAJICAgYWRkcmVzcyBpcyBhbHdheXMgYWNjZXNzaWJsZSAoYW5kIGlmIG5vdCwganVzdCBmYXVsdCB3aGVuIHRoZQogCSAgIGxvYWQvc3RvcmUgZ2V0cyBkb25lLikgKi8KQEAgLTM4MCwxOCArMzc5LDEzIEBACiAJCX0KIAkJLyogRG8gYWNjZXNzX29rIGNoZWNrIGxhdGVyIC0gaXQgZGVwZW5kcyBvbiB3aGV0aGVyIGl0J3MgYSBsb2FkIG9yIGEgc3RvcmUuICovCiAJfQotI2VuZGlmCiAKIAkqYWRkcmVzcyA9IGFkZHI7CiAJcmV0dXJuIDA7CiB9CiAKLS8qIERlZmF1bHQgdmFsdWUgYXMgZm9yIHNoICovCi0jaWYgZGVmaW5lZChDT05GSUdfU0g2NF9VU0VSX01JU0FMSUdORURfRklYVVApCiBzdGF0aWMgaW50IHVzZXJfbW9kZV91bmFsaWduZWRfZml4dXBfY291bnQgPSAxMDsKIHN0YXRpYyBpbnQgdXNlcl9tb2RlX3VuYWxpZ25lZF9maXh1cF9lbmFibGUgPSAxOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQga2VybmVsX21vZGVfdW5hbGlnbmVkX2ZpeHVwX2NvdW50ID0gMzI7CiAKIHN0YXRpYyB2b2lkIG1pc2FsaWduZWRfa2VybmVsX3dvcmRfbG9hZChfX3U2NCBhZGRyZXNzLCBpbnQgZG9fc2lnbl9leHRlbmQsIF9fdTY0ICpyZXN1bHQpCkBAIC00NDAsNyArNDM0LDYgQEAKIAl9CiAKIAlkZXN0cmVnID0gKG9wY29kZSA+PiA0KSAmIDB4M2Y7Ci0jaWYgZGVmaW5lZChDT05GSUdfU0g2NF9VU0VSX01JU0FMSUdORURfRklYVVApCiAJaWYgKHVzZXJfbW9kZShyZWdzKSkgewogCQlfX3U2NCBidWZmZXI7CiAKQEAgLTQ3MCw5ICs0NjMsNyBAQAogCQkJCXdpZHRoX3NoaWZ0LCAodW5zaWduZWQgbG9uZykgcmVncy0+cGMpOwogCQkJYnJlYWs7CiAJCX0KLQl9IGVsc2UKLSNlbmRpZgotCXsKKwl9IGVsc2UgewogCQkvKiBrZXJuZWwgbW9kZSAtIHdlIGNhbiB0YWtlIHNob3J0IGN1dHMgc2luY2UgaWYgd2UgZmF1bHQsIGl0J3MgYSBnZW51aW5lIGJ1ZyAqLwogCQlfX3U2NCBsbywgaGk7CiAKQEAgLTUxOSw3ICs1MTAsNiBAQAogCX0KIAogCXNyY3JlZyA9IChvcGNvZGUgPj4gNCkgJiAweDNmOwotI2lmIGRlZmluZWQoQ09ORklHX1NINjRfVVNFUl9NSVNBTElHTkVEX0ZJWFVQKQogCWlmICh1c2VyX21vZGUocmVncykpIHsKIAkJX191NjQgYnVmZmVyOwogCkBAIC01NDYsOSArNTM2LDcgQEAKIAkJaWYgKF9fY29weV91c2VyKCh2b2lkICopKGludClhZGRyZXNzLCAmYnVmZmVyLCAoMSA8PCB3aWR0aF9zaGlmdCkpID4gMCkgewogCQkJcmV0dXJuIC0xOyAvKiBmYXVsdCAqLwogCQl9Ci0JfSBlbHNlCi0jZW5kaWYKLQl7CisJfSBlbHNlIHsKIAkJLyoga2VybmVsIG1vZGUgLSB3ZSBjYW4gdGFrZSBzaG9ydCBjdXRzIHNpbmNlIGlmIHdlIGZhdWx0LCBpdCdzIGEgZ2VudWluZSBidWcgKi8KIAkJX191NjQgdmFsID0gcmVncy0+cmVnc1tzcmNyZWddOwogCkBAIC01NzYsNyArNTY0LDYgQEAKIAogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfU0g2NF9VU0VSX01JU0FMSUdORURfRklYVVApCiAvKiBOZXZlciBuZWVkIHRvIGZpeCB1cCBtaXNhbGlnbmVkIEZQVSBhY2Nlc3NlcyB3aXRoaW4gdGhlIGtlcm5lbCBzaW5jZSB0aGF0J3MgYSByZWFsCiAgICBlcnJvci4gKi8KIHN0YXRpYyBpbnQgbWlzYWxpZ25lZF9mcHVfbG9hZChzdHJ1Y3QgcHRfcmVncyAqcmVncywKQEAgLTcyNyw3ICs3MTQsNiBAQAogCQlyZXR1cm4gLTE7CiAJfQogfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgbWlzYWxpZ25lZF9maXh1cChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTczNSwxMiArNzIxLDggQEAKIAlpbnQgZXJyb3I7CiAJaW50IG1ham9yLCBtaW5vcjsKIAotI2lmICFkZWZpbmVkKENPTkZJR19TSDY0X1VTRVJfTUlTQUxJR05FRF9GSVhVUCkKLQkvKiBOZXZlciBmaXh1cCB1c2VyIG1vZGUgbWlzYWxpZ25lZCBhY2Nlc3NlcyB3aXRob3V0IHRoaXMgb3B0aW9uIGVuYWJsZWQuICovCi0JcmV0dXJuIC0xOwotI2Vsc2UKLQlpZiAoIXVzZXJfbW9kZV91bmFsaWduZWRfZml4dXBfZW5hYmxlKSByZXR1cm4gLTE7Ci0jZW5kaWYKKwlpZiAoIXVzZXJfbW9kZV91bmFsaWduZWRfZml4dXBfZW5hYmxlKQorCQlyZXR1cm4gLTE7CiAKIAllcnJvciA9IHJlYWRfb3Bjb2RlKHJlZ3MtPnBjLCAmb3Bjb2RlLCB1c2VyX21vZGUocmVncykpOwogCWlmIChlcnJvciA8IDApIHsKQEAgLTc0OSwxNSArNzMxLDEyIEBACiAJbWFqb3IgPSAob3Bjb2RlID4+IDI2KSAmIDB4M2Y7CiAJbWlub3IgPSAob3Bjb2RlID4+IDE2KSAmIDB4ZjsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NINjRfVVNFUl9NSVNBTElHTkVEX0ZJWFVQKQogCWlmICh1c2VyX21vZGUocmVncykgJiYgKHVzZXJfbW9kZV91bmFsaWduZWRfZml4dXBfY291bnQgPiAwKSkgewogCQktLXVzZXJfbW9kZV91bmFsaWduZWRfZml4dXBfY291bnQ7CiAJCS8qIE9ubHkgZG8gJ2NvdW50JyB3b3J0aCBvZiB0aGVzZSByZXBvcnRzLCB0byByZW1vdmUgYSBwb3RlbnRpYWwgRG9TIGFnYWluc3Qgc3lzbG9nICovCiAJCXByaW50aygiRml4aW5nIHVwIHVuYWxpZ25lZCB1c2Vyc3BhY2UgYWNjZXNzIGluIFwiJXNcIiBwaWQ9JWQgcGM9MHglMDh4IGlucz0weCUwOGx4XG4iLAogCQkgICAgICAgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksIChfX3UzMilyZWdzLT5wYywgb3Bjb2RlKTsKLQl9IGVsc2UKLSNlbmRpZgotCWlmICghdXNlcl9tb2RlKHJlZ3MpICYmIChrZXJuZWxfbW9kZV91bmFsaWduZWRfZml4dXBfY291bnQgPiAwKSkgeworCX0gZWxzZSBpZiAoIXVzZXJfbW9kZShyZWdzKSAmJiAoa2VybmVsX21vZGVfdW5hbGlnbmVkX2ZpeHVwX2NvdW50ID4gMCkpIHsKIAkJLS1rZXJuZWxfbW9kZV91bmFsaWduZWRfZml4dXBfY291bnQ7CiAJCWlmIChpbl9pbnRlcnJ1cHQoKSkgewogCQkJcHJpbnRrKCJGaXhpbmcgdXAgdW5hbGlnbmVkIGtlcm5lbHNwYWNlIGFjY2VzcyBpbiBpbnRlcnJ1cHQgcGM9MHglMDh4IGlucz0weCUwOGx4XG4iLApAQCAtODMwLDcgKzgwOSw2IEBACiAJCQl9CiAJCQlicmVhazsKIAotI2lmIGRlZmluZWQoQ09ORklHX1NINjRfVVNFUl9NSVNBTElHTkVEX0ZJWFVQKQogCQljYXNlICgweDk0Pj4yKTogLyogRkxELlMgKi8KIAkJCWVycm9yID0gbWlzYWxpZ25lZF9mcHVfbG9hZChyZWdzLCBvcGNvZGUsIDEsIDIsIDApOwogCQkJYnJlYWs7CkBAIC04ODEsNyArODU5LDYgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCWJyZWFrOwotI2VuZGlmCiAKIAkJZGVmYXVsdDoKIAkJCS8qIEZhdWx0ICovCkBAIC05MDcsNyArODg0LDYgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjCiAJfSwKLSNpZiBkZWZpbmVkKENPTkZJR19TSDY0X1VTRVJfTUlTQUxJR05FRF9GSVhVUCkKIAl7CiAJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAogCQkucHJvY25hbWUJPSAidXNlcl9yZXBvcnRzIiwKQEAgLTkyMyw3ICs4OTksNiBAQAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWN9LAotI2VuZGlmCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGQ3ZDQ5OTEuLmY1M2M3NmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMSw1ICsxLDE3OCBAQAotI2lmZGVmIENPTkZJR19TVVBFUkgzMgotIyBpbmNsdWRlICJ2bWxpbnV4XzMyLmxkcy5TIgorLyoKKyAqIGxkIHNjcmlwdCB0byBtYWtlIFN1cGVySCBMaW51eCBrZXJuZWwKKyAqIFdyaXR0ZW4gYnkgTmlpYmUgWXV0YWthIGFuZCBQYXVsIE11bmR0CisgKi8KKyNpZmRlZiBDT05GSUdfU1VQRVJINjQKKyNkZWZpbmUgTE9BRF9PRkZTRVQJQ09ORklHX1BBR0VfT0ZGU0VUCitPVVRQVVRfQVJDSChzaDpzaDUpCiAjZWxzZQotIyBpbmNsdWRlICJ2bWxpbnV4XzY0Lmxkcy5TIgorI2RlZmluZSBMT0FEX09GRlNFVAkwCitPVVRQVVRfQVJDSChzaCkKICNlbmRpZgorCisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KKworRU5UUlkoX3N0YXJ0KQorU0VDVElPTlMKK3sKKyNpZmRlZiBDT05GSUdfUE1CX0ZJWEVECisJLiA9IENPTkZJR19QQUdFX09GRlNFVCArIChDT05GSUdfTUVNT1JZX1NUQVJUICYgMHgxZmZmZmZmZikgKworCSAgICBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKKyNlbGlmIGRlZmluZWQoQ09ORklHXzMyQklUKQorCS4gPSBDT05GSUdfUEFHRV9PRkZTRVQgKyBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKKyNlbHNlCisJLiA9IENPTkZJR19QQUdFX09GRlNFVCArIENPTkZJR19NRU1PUllfU1RBUlQgKyBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKKyNlbmRpZgorCisJX3RleHQgPSAuOwkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KKworCS5lbXB0eV96ZXJvX3BhZ2UgOiBBVChBRERSKC5lbXB0eV96ZXJvX3BhZ2UpIC0gTE9BRF9PRkZTRVQpIHsKKwkJKiguZW1wdHlfemVyb19wYWdlKQorCX0gPSAwCisKKwkudGV4dCA6IEFUKEFERFIoLnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJSEVBRF9URVhUCisJCVRFWFRfVEVYVAorCisjaWZkZWYgQ09ORklHX1NVUEVSSDY0CisJCSooLnRleHQ2NCkKKwkJKigudGV4dC4uU0htZWRpYTMyKQorI2VuZGlmCisKKwkJU0NIRURfVEVYVAorCQlMT0NLX1RFWFQKKwkJS1BST0JFU19URVhUCisJCUlSUUVOVFJZX1RFWFQKKwkJKiguZml4dXApCisJCSooLmdudS53YXJuaW5nKQorCQlfZXRleHQgPSAuOwkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworCX0gPSAweDAwMDkKKworCS4gPSBBTElHTigxNik7CQkvKiBFeGNlcHRpb24gdGFibGUgKi8KKwlfX2V4X3RhYmxlIDogQVQoQUREUihfX2V4X3RhYmxlKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fc3RhcnRfX19leF90YWJsZSA9IC47CisJCSooX19leF90YWJsZSkKKwkJX19zdG9wX19fZXhfdGFibGUgPSAuOworCX0KKworCU5PVEVTCisJUk9fREFUQShQQUdFX1NJWkUpCisKKwkvKgorCSAqIENvZGUgd2hpY2ggbXVzdCBiZSBleGVjdXRlZCB1bmNhY2hlZCBhbmQgdGhlIGFzc29jaWF0ZWQgZGF0YQorCSAqLworCS4gPSBBTElHTihQQUdFX1NJWkUpOworCS51bmNhY2hlZCA6IEFUKEFERFIoLnVuY2FjaGVkKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fdW5jYWNoZWRfc3RhcnQgPSAuOworCQkqKC51bmNhY2hlZC50ZXh0KQorCQkqKC51bmNhY2hlZC5kYXRhKQorCQlfX3VuY2FjaGVkX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsKKwkuZGF0YSA6IEFUKEFERFIoLmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsJCS8qIERhdGEgKi8KKwkJKiguZGF0YS5pbml0X3Rhc2spCisKKwkJLiA9IEFMSUdOKEwxX0NBQ0hFX0JZVEVTKTsKKwkJKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKKworCQkuID0gQUxJR04oTDFfQ0FDSEVfQllURVMpOworCQkqKC5kYXRhLnJlYWRfbW9zdGx5KQorCisJCS4gPSBBTElHTihQQUdFX1NJWkUpOworCQkqKC5kYXRhLnBhZ2VfYWxpZ25lZCkKKworCQlfX25vc2F2ZV9iZWdpbiA9IC47CisJCSooLmRhdGEubm9zYXZlKQorCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkJX19ub3NhdmVfZW5kID0gLjsKKworCQlEQVRBX0RBVEEKKwkJQ09OU1RSVUNUT1JTCisJfQorCisJX2VkYXRhID0gLjsJCQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCisKKwkuID0gQUxJR04oUEFHRV9TSVpFKTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLworCS5pbml0LnRleHQgOiBBVChBRERSKC5pbml0LnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19pbml0X2JlZ2luID0gLjsKKwkJX3Npbml0dGV4dCA9IC47CisJCUlOSVRfVEVYVAorCQlfZWluaXR0ZXh0ID0gLjsKKwl9CisKKwkuaW5pdC5kYXRhIDogQVQoQUREUiguaW5pdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7IElOSVRfREFUQSB9CisKKwkuID0gQUxJR04oMTYpOworCS5pbml0LnNldHVwIDogQVQoQUREUiguaW5pdC5zZXR1cCkgLSBMT0FEX09GRlNFVCkgeworCQlfX3NldHVwX3N0YXJ0ID0gLjsKKwkJKiguaW5pdC5zZXR1cCkKKwkJX19zZXR1cF9lbmQgPSAuOworCX0KKworCS5pbml0Y2FsbC5pbml0IDogQVQoQUREUiguaW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKKwkJSU5JVENBTExTCisJCV9faW5pdGNhbGxfZW5kID0gLjsKKwl9CisKKwkuY29uX2luaXRjYWxsLmluaXQgOiBBVChBRERSKC5jb25faW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CisJCSooLmNvbl9pbml0Y2FsbC5pbml0KQorCQlfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOworCX0KKworCVNFQ1VSSVRZX0lOSVQKKworI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAorCS4gPSBBTElHTihQQUdFX1NJWkUpOworCS5pbml0LnJhbWZzIDogQVQoQUREUiguaW5pdC5yYW1mcykgLSBMT0FEX09GRlNFVCkgeworCQlfX2luaXRyYW1mc19zdGFydCA9IC47CisJCSooLmluaXQucmFtZnMpCisJCV9faW5pdHJhbWZzX2VuZCA9IC47CisJfQorI2VuZGlmCisKKwkuID0gQUxJR04oNCk7CisJLm1hY2h2ZWMuaW5pdCA6IEFUKEFERFIoLm1hY2h2ZWMuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX21hY2h2ZWNfc3RhcnQgPSAuOworCQkqKC5tYWNodmVjLmluaXQpCisJCV9fbWFjaHZlY19lbmQgPSAuOworCX0KKworCVBFUkNQVShQQUdFX1NJWkUpCisKKwkvKgorCSAqIC5leGl0LnRleHQgaXMgZGlzY2FyZGVkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aAorCSAqIHJlZmVyZW5jZXMgZnJvbSBfX2J1Z190YWJsZQorCSAqLworCS5leGl0LnRleHQgOiBBVChBRERSKC5leGl0LnRleHQpIC0gTE9BRF9PRkZTRVQpIHsgRVhJVF9URVhUIH0KKwkuZXhpdC5kYXRhIDogQVQoQUREUiguZXhpdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7IEVYSVRfREFUQSB9CisKKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuYnNzIDogQVQoQUREUiguYnNzKSAtIExPQURfT0ZGU0VUKSB7CisJCV9faW5pdF9lbmQgPSAuOworCQlfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KKwkJKiguYnNzLnBhZ2VfYWxpZ25lZCkKKwkJKiguYnNzKQorCQkqKENPTU1PTikKKwkJLiA9IEFMSUdOKDQpOworCQlfZWJzcyA9IC47CQkJLyogdUNsaW51eCBNVEQgc3Vja3MgKi8KKwkJX2VuZCA9IC4gOworCX0KKworCS8qCisJICogV2hlbiBzb21ldGhpbmcgaW4gdGhlIGtlcm5lbCBpcyBOT1QgY29tcGlsZWQgYXMgYSBtb2R1bGUsIHRoZQorCSAqIG1vZHVsZSBjbGVhbnVwIGNvZGUgYW5kIGRhdGEgYXJlIHB1dCBpbnRvIHRoZXNlIHNlZ21lbnRzLiBCb3RoCisJICogY2FuIHRoZW4gYmUgdGhyb3duIGF3YXksIGFzIGNsZWFudXAgY29kZSBpcyBuZXZlciBjYWxsZWQgdW5sZXNzCisJICogaXQncyBhIG1vZHVsZS4KKwkgKi8KKwkvRElTQ0FSRC8gOiB7CisJCSooLmV4aXRjYWxsLmV4aXQpCisJfQorCisJU1RBQlNfREVCVUcKKwlEV0FSRl9ERUJVRworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdm1saW51eF8zMi5sZHMuUyBiL2FyY2gvc2gva2VybmVsL3ZtbGludXhfMzIubGRzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkOWIyZWUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdm1saW51eF8zMi5sZHMuUworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKgotICogbGQgc2NyaXB0IHRvIG1ha2UgU3VwZXJIIExpbnV4IGtlcm5lbAotICogV3JpdHRlbiBieSBOaWliZSBZdXRha2EKLSAqLwotI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+Ci0KLSNpZmRlZiBDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU4KLU9VVFBVVF9GT1JNQVQoImVsZjMyLXNoLWxpbnV4IiwgImVsZjMyLXNoLWxpbnV4IiwgImVsZjMyLXNoLWxpbnV4IikKLSNlbHNlCi1PVVRQVVRfRk9STUFUKCJlbGYzMi1zaGJpZy1saW51eCIsICJlbGYzMi1zaGJpZy1saW51eCIsICJlbGYzMi1zaGJpZy1saW51eCIpCi0jZW5kaWYKLU9VVFBVVF9BUkNIKHNoKQotRU5UUlkoX3N0YXJ0KQotU0VDVElPTlMKLXsKLSNpZmRlZiBDT05GSUdfUE1CX0ZJWEVECi0JLiA9IENPTkZJR19QQUdFX09GRlNFVCArIChDT05GSUdfTUVNT1JZX1NUQVJUICYgMHgxZmZmZmZmZikgKwotCSAgICBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKLSNlbGlmIGRlZmluZWQoQ09ORklHXzMyQklUKQotCS4gPSBDT05GSUdfUEFHRV9PRkZTRVQgKyBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKLSNlbHNlCi0JLiA9IENPTkZJR19QQUdFX09GRlNFVCArIENPTkZJR19NRU1PUllfU1RBUlQgKyBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKLSNlbmRpZgotCi0JX3RleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCi0KLQkuZW1wdHlfemVyb19wYWdlIDogewotCQkqKC5lbXB0eV96ZXJvX3BhZ2UpCi0JfSA9IDAKLQotCS50ZXh0IDogewotCQlIRUFEX1RFWFQKLQkJVEVYVF9URVhUCi0JCVNDSEVEX1RFWFQKLQkJTE9DS19URVhUCi0JCUtQUk9CRVNfVEVYVAotCQkqKC5maXh1cCkKLQkJKiguZ251Lndhcm5pbmcpCi0JfSA9IDB4MDAwOQotCi0JLiA9IEFMSUdOKDE2KTsJCS8qIEV4Y2VwdGlvbiB0YWJsZSAqLwotCV9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0JX19leF90YWJsZSA6IHsgKihfX2V4X3RhYmxlKSB9Ci0JX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0JX2V0ZXh0ID0gLjsJCQkvKiBFbmQgb2YgdGV4dCBzZWN0aW9uICovCi0KLQlOT1RFUwotCVJPX0RBVEEoUEFHRV9TSVpFKQotCi0JLyoKLQkgKiBDb2RlIHdoaWNoIG11c3QgYmUgZXhlY3V0ZWQgdW5jYWNoZWQgYW5kIHRoZSBhc3NvY2lhdGVkIGRhdGEKLQkgKi8KLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX3VuY2FjaGVkX3N0YXJ0ID0gLjsKLQkudW5jYWNoZWQudGV4dCA6IHsgKigudW5jYWNoZWQudGV4dCkgfQotCS51bmNhY2hlZC5kYXRhIDogeyAqKC51bmNhY2hlZC5kYXRhKSB9Ci0JX191bmNhY2hlZF9lbmQgPSAuOwotCi0JLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsKLQkuZGF0YSA6IHsJCQkvKiBEYXRhICovCi0JCSooLmRhdGEuaW5pdF90YXNrKQotCi0JCS4gPSBBTElHTihMMV9DQUNIRV9CWVRFUyk7Ci0JCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0KLQkJLiA9IEFMSUdOKEwxX0NBQ0hFX0JZVEVTKTsKLQkJKiguZGF0YS5yZWFkX21vc3RseSkKLQotCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQkJKiguZGF0YS5wYWdlX2FsaWduZWQpCi0KLQkJX19ub3NhdmVfYmVnaW4gPSAuOwotCQkqKC5kYXRhLm5vc2F2ZSkKLQkJLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JCV9fbm9zYXZlX2VuZCA9IC47Ci0KLQkJREFUQV9EQVRBCi0JCUNPTlNUUlVDVE9SUwotCX0KLQotCV9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwotCi0JLiA9IEFMSUdOKFBBR0VfU0laRSk7CQkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KLQlfX2luaXRfYmVnaW4gPSAuOwotCV9zaW5pdHRleHQgPSAuOwotCS5pbml0LnRleHQgOiB7IElOSVRfVEVYVCB9Ci0JX2Vpbml0dGV4dCA9IC47Ci0JLmluaXQuZGF0YSA6IHsgSU5JVF9EQVRBIH0KLQotCS4gPSBBTElHTigxNik7Ci0JX19zZXR1cF9zdGFydCA9IC47Ci0JLmluaXQuc2V0dXAgOiB7ICooLmluaXQuc2V0dXApIH0KLQlfX3NldHVwX2VuZCA9IC47Ci0KLQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkuaW5pdGNhbGwuaW5pdCA6IHsKLQkJSU5JVENBTExTCi0JfQotCV9faW5pdGNhbGxfZW5kID0gLjsKLQlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47Ci0JLmNvbl9pbml0Y2FsbC5pbml0IDogeyAqKC5jb25faW5pdGNhbGwuaW5pdCkgfQotCV9fY29uX2luaXRjYWxsX2VuZCA9IC47Ci0KLQlTRUNVUklUWV9JTklUCi0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX2luaXRyYW1mc19zdGFydCA9IC47Ci0JLmluaXQucmFtZnMgOiB7ICooLmluaXQucmFtZnMpIH0KLQlfX2luaXRyYW1mc19lbmQgPSAuOwotI2VuZGlmCi0KLQkuID0gQUxJR04oNCk7Ci0JX19tYWNodmVjX3N0YXJ0ID0gLjsKLQkubWFjaHZlYy5pbml0IDogeyAqKC5tYWNodmVjLmluaXQpIH0KLQlfX21hY2h2ZWNfZW5kID0gLjsKLQotCVBFUkNQVShQQUdFX1NJWkUpCi0KLQkvKgotCSAqIC5leGl0LnRleHQgaXMgZGlzY2FyZGVkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aAotCSAqIHJlZmVyZW5jZXMgZnJvbSBfX2J1Z190YWJsZQotCSAqLwotCS5leGl0LnRleHQgOiB7IEVYSVRfVEVYVCB9Ci0JLmV4aXQuZGF0YSA6IHsgRVhJVF9EQVRBIH0KLQotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCS5ic3MgOiB7Ci0JCV9faW5pdF9lbmQgPSAuOwotCQlfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLQkJKiguYnNzLnBhZ2VfYWxpZ25lZCkKLQkJKiguYnNzKQotCQkqKENPTU1PTikKLQkJLiA9IEFMSUdOKDQpOwotCQlfZWJzcyA9IC47CQkJLyogdUNsaW51eCBNVEQgc3Vja3MgKi8KLQkJX2VuZCA9IC4gOwotCX0KLQotCS8qCi0JICogV2hlbiBzb21ldGhpbmcgaW4gdGhlIGtlcm5lbCBpcyBOT1QgY29tcGlsZWQgYXMgYSBtb2R1bGUsIHRoZQotCSAqIG1vZHVsZSBjbGVhbnVwIGNvZGUgYW5kIGRhdGEgYXJlIHB1dCBpbnRvIHRoZXNlIHNlZ21lbnRzLiBCb3RoCi0JICogY2FuIHRoZW4gYmUgdGhyb3duIGF3YXksIGFzIGNsZWFudXAgY29kZSBpcyBuZXZlciBjYWxsZWQgdW5sZXNzCi0JICogaXQncyBhIG1vZHVsZS4KLQkgKi8KLQkvRElTQ0FSRC8gOiB7Ci0JCSooLmV4aXRjYWxsLmV4aXQpCi0JfQotCi0JU1RBQlNfREVCVUcKLQlEV0FSRl9ERUJVRwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdm1saW51eF82NC5sZHMuUyBiL2FyY2gvc2gva2VybmVsL3ZtbGludXhfNjQubGRzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NjY0NDYuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9rZXJuZWwvdm1saW51eF82NC5sZHMuUworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogbGQgc2NyaXB0IHRvIG1ha2UgU0g2NCBMaW51eCBrZXJuZWwKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgIFBhb2xvIEFsYmVyZWxsaQotICoKLSAqIGJlbmVkaWN0Lmdhc3RlckBzdXBlcmguY29tOgkgMm5kIE1heSAyMDAyCi0gKiAgICBBZGQgZGVmaW5pdGlvbiBvZiBlbXB0eV96ZXJvX3BhZ2UgdG8gYmUgdGhlIGZpcnN0IHBhZ2Ugb2Yga2VybmVsIGltYWdlLgotICoKLSAqIGJlbmVkaWN0Lmdhc3RlckBzdXBlcmguY29tOgkgM3JkIE1heSAyMDAyCi0gKiAgICBBZGRlZCBzdXBwb3J0IGZvciByYW1kaXNrLCByZW1vdmluZyBzdGF0aWNhbGx5IGxpbmtlZCByb21mcyBhdCB0aGUKLSAqICAgIHNhbWUgdGltZS4KLSAqCi0gKiBsZXRoYWxAbGludXgtc2gub3JnOiAgICAgICAgICA5dGggTWF5IDIwMDMKLSAqICAgIEtpbGwgb2ZmIEdMT0JBTF9OQU1FKCkgdXNhZ2UgYW5kIG90aGVyIENEQy1pc21zLgotICoKLSAqIGxldGhhbEBsaW51eC1zaC5vcmc6ICAgICAgICAgMTl0aCBNYXkgMjAwMwotICogICAgUmVtb3ZlIHN1cHBvcnQgZm9yIGFuY2llbnQgdG9vbGNoYWlucy4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2NhY2hlLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0KLSNkZWZpbmUgTE9BRF9PRkZTRVQJQ09ORklHX1BBR0VfT0ZGU0VUCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KLQotT1VUUFVUX0FSQ0goc2g6c2g1KQotCi0jZGVmaW5lIENfUEhZUyh4KSBBVCAoQUREUih4KSAtIExPQURfT0ZGU0VUKQotCi1FTlRSWShfX3N0YXJ0KQotU0VDVElPTlMKLXsKLQkuID0gQ09ORklHX1BBR0VfT0ZGU0VUICsgQ09ORklHX01FTU9SWV9TVEFSVCArIFBBR0VfU0laRTsKLQlfdGV4dCA9IC47CQkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KLQotCS5lbXB0eV96ZXJvX3BhZ2UgOiBDX1BIWVMoLmVtcHR5X3plcm9fcGFnZSkgewotCQkqKC5lbXB0eV96ZXJvX3BhZ2UpCi0JfSA9IDAKLQotCS50ZXh0IDogQ19QSFlTKC50ZXh0KSB7Ci0JCUhFQURfVEVYVAotCQlURVhUX1RFWFQKLQkJKigudGV4dDY0KQotCQkqKC50ZXh0Li5TSG1lZGlhMzIpCi0JCVNDSEVEX1RFWFQKLQkJTE9DS19URVhUCi0JCUtQUk9CRVNfVEVYVAotCQkqKC5maXh1cCkKLQkJKiguZ251Lndhcm5pbmcpCi0jaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCi0JfSA9IDB4NmZmMGZmZjAKLSNlbHNlCi0JfSA9IDB4ZjBmZmYwNmYKLSNlbmRpZgotCi0JLyogV2UgbGlrZWx5IHdhbnQgX19leF90YWJsZSB0byBiZSBDYWNoZSBMaW5lIGFsaWduZWQgKi8KLQkuID0gQUxJR04oTDFfQ0FDSEVfQllURVMpOwkJLyogRXhjZXB0aW9uIHRhYmxlICovCi0JX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLQlfX2V4X3RhYmxlIDogQ19QSFlTKF9fZXhfdGFibGUpIHsgKihfX2V4X3RhYmxlKSB9Ci0JX19zdG9wX19fZXhfdGFibGUgPSAuOwotCi0JX2V0ZXh0ID0gLjsJCQkvKiBFbmQgb2YgdGV4dCBzZWN0aW9uICovCi0KLQlOT1RFUyAKLQlST19EQVRBKFBBR0VfU0laRSkKLQotCS4gPSBBTElHTihUSFJFQURfU0laRSk7Ci0JLmRhdGEgOiBDX1BIWVMoLmRhdGEpIHsJCQkvKiBEYXRhICovCi0JCSooLmRhdGEuaW5pdF90YXNrKQotCi0JCS4gPSBBTElHTihMMV9DQUNIRV9CWVRFUyk7Ci0JCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0KLQkJLiA9IEFMSUdOKEwxX0NBQ0hFX0JZVEVTKTsKLQkJKiguZGF0YS5yZWFkX21vc3RseSkKLQotCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQkJKiguZGF0YS5wYWdlX2FsaWduZWQpCi0KLQkJX19ub3NhdmVfYmVnaW4gPSAuOwotCQkqKC5kYXRhLm5vc2F2ZSkKLQkJLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JCV9fbm9zYXZlX2VuZCA9IC47Ci0KLQkJREFUQV9EQVRBCi0JCUNPTlNUUlVDVE9SUwotCX0KLQotCV9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwotCi0JLiA9IEFMSUdOKFBBR0VfU0laRSk7CQkvKiBJbml0IGNvZGUgYW5kIGRhdGEgKi8KLQlfX2luaXRfYmVnaW4gPSAuOwotCV9zaW5pdHRleHQgPSAuOwotCS5pbml0LnRleHQgOiBDX1BIWVMoLmluaXQudGV4dCkgeyBJTklUX1RFWFQgfQotCV9laW5pdHRleHQgPSAuOwotCS5pbml0LmRhdGEgOiBDX1BIWVMoLmluaXQuZGF0YSkgeyBJTklUX0RBVEEgfQotCS4gPSBBTElHTihMMV9DQUNIRV9CWVRFUyk7CS8qIEJldHRlciBpZiBDYWNoZSBMaW5lIGFsaWduZWQgKi8KLQlfX3NldHVwX3N0YXJ0ID0gLjsKLQkuaW5pdC5zZXR1cCA6IENfUEhZUyguaW5pdC5zZXR1cCkgeyAqKC5pbml0LnNldHVwKSB9Ci0JX19zZXR1cF9lbmQgPSAuOwotCV9faW5pdGNhbGxfc3RhcnQgPSAuOwotCS5pbml0Y2FsbC5pbml0IDogQ19QSFlTKC5pbml0Y2FsbC5pbml0KSB7Ci0JCUlOSVRDQUxMUwotCX0KLQlfX2luaXRjYWxsX2VuZCA9IC47Ci0JX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotCS5jb25faW5pdGNhbGwuaW5pdCA6IENfUEhZUyguY29uX2luaXRjYWxsLmluaXQpIHsKLQkJKiguY29uX2luaXRjYWxsLmluaXQpCi0JfQotCV9fY29uX2luaXRjYWxsX2VuZCA9IC47Ci0KLQlTRUNVUklUWV9JTklUCi0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX2luaXRyYW1mc19zdGFydCA9IC47Ci0JLmluaXQucmFtZnMgOiBDX1BIWVMoLmluaXQucmFtZnMpIHsgKiguaW5pdC5yYW1mcykgfQotCV9faW5pdHJhbWZzX2VuZCA9IC47Ci0jZW5kaWYKLQotCS4gPSBBTElHTig4KTsKLQlfX21hY2h2ZWNfc3RhcnQgPSAuOwotCS5tYWNodmVjLmluaXQgOiBDX1BIWVMoLm1hY2h2ZWMuaW5pdCkgeyAqKC5tYWNodmVjLmluaXQpIH0KLQlfX21hY2h2ZWNfZW5kID0gLjsKLQotCVBFUkNQVShQQUdFX1NJWkUpCi0KLQkvKgotCSAqIC5leGl0LnRleHQgaXMgZGlzY2FyZGVkIGF0IHJ1bnRpbWUsIG5vdCBsaW5rIHRpbWUsIHRvIGRlYWwgd2l0aAotCSAqIHJlZmVyZW5jZXMgZnJvbSBfX2J1Z190YWJsZQotCSAqLwotCS5leGl0LnRleHQgOiBDX1BIWVMoLmV4aXQudGV4dCkgeyBFWElUX1RFWFQgfQotCS5leGl0LmRhdGEgOiBDX1BIWVMoLmV4aXQuZGF0YSkgeyBFWElUX0RBVEEgfQotCi0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JLmJzcyA6IENfUEhZUyguYnNzKSB7Ci0JCV9faW5pdF9lbmQgPSAuOwotCQlfX2Jzc19zdGFydCA9IC47CQkvKiBCU1MgKi8KLQkJKiguYnNzLnBhZ2VfYWxpZ25lZCkKLQkJKiguYnNzKQotCQkqKENPTU1PTikKLQkJLiA9IEFMSUdOKDQpOwotCQlfZWJzcyA9IC47CQkJLyogdUNsaW51eCBNVEQgc3Vja3MgKi8KLQkJX2VuZCA9IC4gOwotCX0KLQotCS8qCi0JICogV2hlbiBzb21ldGhpbmcgaW4gdGhlIGtlcm5lbCBpcyBOT1QgY29tcGlsZWQgYXMgYSBtb2R1bGUsIHRoZQotCSAqIG1vZHVsZSBjbGVhbnVwIGNvZGUgYW5kIGRhdGEgYXJlIHB1dCBpbnRvIHRoZXNlIHNlZ21lbnRzLiBCb3RoCi0JICogY2FuIHRoZW4gYmUgdGhyb3duIGF3YXksIGFzIGNsZWFudXAgY29kZSBpcyBuZXZlciBjYWxsZWQgdW5sZXNzCi0JICogaXQncyBhIG1vZHVsZS4KLQkgKi8KLQkvRElTQ0FSRC8gOiB7Ci0JCSooLmV4aXRjYWxsLmV4aXQpCi0JfQotCi0JU1RBQlNfREVCVUcKLQlEV0FSRl9ERUJVRwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWI2NC8uZ2l0aWdub3JlIGIvYXJjaC9zaC9saWI2NC8uZ2l0aWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA4YzJjLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvbGliNjQvLmdpdGlnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN5c2NhbGx0YWIuaApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWI2NC9kYmcuYyBiL2FyY2gvc2gvbGliNjQvZGJnLmMKaW5kZXggMmZiOGVhZi4uNjE1MmE2YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9saWI2NC9kYmcuYworKysgYi9hcmNoL3NoL2xpYjY0L2RiZy5jCkBAIC0xMzUsMTQwICsxMzUsNiBAQAogCSAgICAoIiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIH0KIAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotI2lmZGVmIENPTkZJR19QT09SX01BTlNfU1RSQUNFCi0KLSNpbmNsdWRlICJzeXNjYWxsdGFiLmgiCi0KLXN0cnVjdCByaW5nX25vZGUgewotCWludCBldnQ7Ci0JaW50IHJldF9hZGRyOwotCWludCBldmVudDsKLQlpbnQgdHJhOwotCWludCBwaWQ7Ci0JdW5zaWduZWQgbG9uZyBzcDsKLQl1bnNpZ25lZCBsb25nIHBjOwotfTsKLQotc3RhdGljIHN0cnVjdCByaW5nX25vZGUgZXZlbnRfcmluZ1sxNl07Ci1zdGF0aWMgaW50IGV2ZW50X3B0ciA9IDA7Ci0KLXN0cnVjdCBzdG9yZWRfc3lzY2FsbF9kYXRhIHsKLQlpbnQgcGlkOwotCWludCBzeXNjYWxsX251bWJlcjsKLX07Ci0KLSNkZWZpbmUgTl9TVE9SRURfU1lTQ0FMTFMgMTYKLQotc3RhdGljIHN0cnVjdCBzdG9yZWRfc3lzY2FsbF9kYXRhIHN0b3JlZF9zeXNjYWxsc1tOX1NUT1JFRF9TWVNDQUxMU107Ci1zdGF0aWMgaW50IHN5c2NhbGxfbmV4dD0wOwotc3RhdGljIGludCBzeXNjYWxsX25leHRfcHJpbnQ9MDsKLQotdm9pZCBldnRfZGVidWcoaW50IGV2dCwgaW50IHJldF9hZGRyLCBpbnQgZXZlbnQsIGludCB0cmEsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWludCBzeXNjYWxsbm8gPSB0cmEgJiAweGZmOwotCXVuc2lnbmVkIGxvbmcgc3A7Ci0JdW5zaWduZWQgbG9uZyBzdGFja19ib3R0b207Ci0JaW50IHBpZDsKLQlzdHJ1Y3QgcmluZ19ub2RlICpycjsKLQotCXBpZCA9IGN1cnJlbnQtPnBpZDsKLQlzdGFja19ib3R0b20gPSAodW5zaWduZWQgbG9uZykgdGFza19zdGFja19wYWdlKGN1cnJlbnQpOwotCWFzbSB2b2xhdGlsZSgib3JpIHIxNSwgMCwgJTAiIDogIj1yIiAoc3ApKTsKLQlyciA9IGV2ZW50X3JpbmcgKyBldmVudF9wdHI7Ci0JcnItPmV2dCA9IGV2dDsKLQlyci0+cmV0X2FkZHIgPSByZXRfYWRkcjsKLQlyci0+ZXZlbnQgPSBldmVudDsKLQlyci0+dHJhID0gdHJhOwotCXJyLT5waWQgPSBwaWQ7Ci0JcnItPnNwID0gc3A7Ci0JcnItPnBjID0gcmVncy0+cGM7Ci0KLQlpZiAoc3AgPCBzdGFja19ib3R0b20gKyAzMDkyKSB7Ci0JCWludCBpLCBqOwotCQlwcmludGsoImV2dF9kZWJ1ZyA6IHN0YWNrIHVuZGVyZmxvdyByZXBvcnRcbiIpOwotCQlmb3IgKGo9MCwgaSA9IGV2ZW50X3B0cjsgajwxNjsgaisrKSB7Ci0JCQlyciA9IGV2ZW50X3JpbmcgKyBpOwotCQkJcHJpbnRrKCJldnQ9JTA4eCBldmVudD0lMDh4IHRyYT0lMDh4IHBpZD0lNWQgc3A9JTA4bHggcGM9JTA4bHhcbiIsCi0JCQkJcnItPmV2dCwgcnItPmV2ZW50LCByci0+dHJhLCByci0+cGlkLCByci0+c3AsIHJyLT5wYyk7Ci0JCQlpLS07Ci0JCQlpICY9IDE1OwotCQl9Ci0JCXBhbmljKCJTVEFDSyBVTkRFUkZMT1dcbiIpOwotCX0KLQotCWV2ZW50X3B0ciA9IChldmVudF9wdHIgKyAxKSAmIDE1OwotCi0JaWYgKChldmVudCA9PSAyKSAmJiAoZXZ0ID09IDB4MTYwKSkgewotCQlpZiAoc3lzY2FsbG5vIDwgTlVNX1NZU0NBTExfSU5GT19FTlRSSUVTKSB7Ci0JCQkvKiBTdG9yZSB0aGUgc3lzY2FsbCBpbmZvcm1hdGlvbiB0byBwcmludCBsYXRlci4gIFdlCi0JCQkgKiBjYW4ndCBwcmludCB0aGlzIG5vdyAtIGN1cnJlbnRseSB3ZSdyZSBydW5uaW5nIHdpdGgKLQkJCSAqIFNSLkJMPTEsIHNvIHdlIGNhbid0IHRha2UgYSB0bGJtaXNzICh3aGljaCBjb3VsZCBvY2N1cgotCQkJICogaW4gdGhlIGNvbnNvbGUgZHJpdmVycyB1bmRlciBwcmludGspLgotCQkJICoKLQkJCSAqIEp1c3Qgb3ZlcndyaXRlIG9sZCBlbnRyaWVzIG9uIHJpbmcgb3ZlcmZsb3cgLSB0aGlzCi0JCQkgKiBpcyBvbmx5IGZvciBsYXN0LWhvcGUgZGVidWdnaW5nLiAqLwotCQkJc3RvcmVkX3N5c2NhbGxzW3N5c2NhbGxfbmV4dF0ucGlkID0gY3VycmVudC0+cGlkOwotCQkJc3RvcmVkX3N5c2NhbGxzW3N5c2NhbGxfbmV4dF0uc3lzY2FsbF9udW1iZXIgPSBzeXNjYWxsbm87Ci0JCQlzeXNjYWxsX25leHQrKzsKLQkJCXN5c2NhbGxfbmV4dCAmPSAoTl9TVE9SRURfU1lTQ0FMTFMgLSAxKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgZHJhaW5fc3lzY2FsbHModm9pZCkgewotCXdoaWxlIChzeXNjYWxsX25leHRfcHJpbnQgIT0gc3lzY2FsbF9uZXh0KSB7Ci0JCXByaW50aygiVGFzayAlZDogJXMoKVxuIiwKLQkJCXN0b3JlZF9zeXNjYWxsc1tzeXNjYWxsX25leHRfcHJpbnRdLnBpZCwKLQkJCXN5c2NhbGxfaW5mb190YWJsZVtzdG9yZWRfc3lzY2FsbHNbc3lzY2FsbF9uZXh0X3ByaW50XS5zeXNjYWxsX251bWJlcl0ubmFtZSk7Ci0JCQlzeXNjYWxsX25leHRfcHJpbnQrKzsKLQkJCXN5c2NhbGxfbmV4dF9wcmludCAmPSAoTl9TVE9SRURfU1lTQ0FMTFMgLSAxKTsKLQl9Ci19Ci0KLXZvaWQgZXZ0X2RlYnVnMih1bnNpZ25lZCBpbnQgcmV0KQotewotCWRyYWluX3N5c2NhbGxzKCk7Ci0JcHJpbnRrKCJUYXNrICVkOiBzeXNjYWxsIHJldHVybnMgJTA4eFxuIiwgY3VycmVudC0+cGlkLCByZXQpOwotfQotCi12b2lkIGV2dF9kZWJ1Z19yZXRfZnJvbV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaW50IHBpZDsKLQlzdHJ1Y3QgcmluZ19ub2RlICpycjsKLQotCXBpZCA9IGN1cnJlbnQtPnBpZDsKLQlyciA9IGV2ZW50X3JpbmcgKyBldmVudF9wdHI7Ci0JcnItPmV2dCA9IDB4ZmZmZjsKLQlyci0+cmV0X2FkZHIgPSAwOwotCXJyLT5ldmVudCA9IDA7Ci0JcnItPnRyYSA9IDA7Ci0JcnItPnBpZCA9IHBpZDsKLQlyci0+cGMgPSByZWdzLT5wYzsKLQlldmVudF9wdHIgPSAoZXZlbnRfcHRyICsgMSkgJiAxNTsKLX0KLQotdm9pZCBldnRfZGVidWdfcmV0X2Zyb21fZXhjKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWludCBwaWQ7Ci0Jc3RydWN0IHJpbmdfbm9kZSAqcnI7Ci0KLQlwaWQgPSBjdXJyZW50LT5waWQ7Ci0JcnIgPSBldmVudF9yaW5nICsgZXZlbnRfcHRyOwotCXJyLT5ldnQgPSAweGZmZmU7Ci0JcnItPnJldF9hZGRyID0gMDsKLQlyci0+ZXZlbnQgPSAwOwotCXJyLT50cmEgPSAwOwotCXJyLT5waWQgPSBwaWQ7Ci0JcnItPnBjID0gcmVncy0+cGM7Ci0JZXZlbnRfcHRyID0gKGV2ZW50X3B0ciArIDEpICYgMTU7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfUE9PUl9NQU5TX1NUUkFDRSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCiB2b2lkIHNob3dfZXhjcF9yZWdzKGNoYXIgKmZyb20sIGludCB0cmFwbnIsIGludCBzaWduciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAKQEAgLTM4MCw1MSArMjQ2LDMgQEAKIAlwcmludF9kdGxiKCk7CiAJcHJpbnRfaXRsYigpOwogfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0vKgotKiogRGVwZW5kaW5nIG9uIDxiYXNlPiBzY2FuIHRoZSBNTVUsIERhdGEgb3IgSW5zdHJ1Y3Rpb24gc2lkZQotKiogbG9va2luZyBmb3IgYSB2YWxpZCBtYXBwaW5nIG1hdGNoaW5nIEVhZGRyICYgYXNpZC4KLSoqIFJldHVybiAtMSBpZiBub3QgZm91bmQgb3IgdGhlIFRMQiBpZCBlbnRyeSBvdGhlcndpc2UuCi0qKiBOb3RlOiBpdCB3b3JrcyBvbmx5IGZvciA0ayBwYWdlcyEKLSovCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotbG9va3VwX21tdV9zaWRlKHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBFYWRkciwgdW5zaWduZWQgbG9uZyBhc2lkKQotewotCXJlZ1R5cGVfdCBwdGVIOwotCXVuc2lnbmVkIGxvbmcgZXBuOwotCWludCBjb3VudDsKLQotCWVwbiA9IEVhZGRyICYgMHhmZmZmZjAwMDsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1BWF9UTEJzOyBjb3VudCsrLCBiYXNlICs9IFRMQl9TVEVQKSB7Ci0JCXB0ZUggPSBnZXRDb25maWdSZWcoYmFzZSk7Ci0JCWlmIChHRVRfVkFMSUQocHRlSCkpCi0JCQlpZiAoKHVuc2lnbmVkIGxvbmcpIEdFVF9FUE4ocHRlSCkgPT0gZXBuKQotCQkJCWlmICgodW5zaWduZWQgbG9uZykgR0VUX0FTSUQocHRlSCkgPT0gYXNpZCkKLQkJCQkJYnJlYWs7Ci0JfQotCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpICgoY291bnQgPCBNQVhfVExCcykgPyBiYXNlIDogLTEpKTsKLX0KLQotdW5zaWduZWQgbG9uZyBsb29rdXBfZHRsYih1bnNpZ25lZCBsb25nIEVhZGRyKQotewotCXVuc2lnbmVkIGxvbmcgYXNpZCA9IGdldF9hc2lkKCk7Ci0JcmV0dXJuIChsb29rdXBfbW11X3NpZGUoKHU2NCkgRFRMQl9CQVNFLCBFYWRkciwgYXNpZCkpOwotfQotCi11bnNpZ25lZCBsb25nIGxvb2t1cF9pdGxiKHVuc2lnbmVkIGxvbmcgRWFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyBhc2lkID0gZ2V0X2FzaWQoKTsKLQlyZXR1cm4gKGxvb2t1cF9tbXVfc2lkZSgodTY0KSBJVExCX0JBU0UsIEVhZGRyLCBhc2lkKSk7Ci19Ci0KLXZvaWQgcHJpbnRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlwcmludGsoIiAgcGFnZVslcF0gLT4gaW5kZXggMHglbHgsICBjb3VudCAweCV4LCAgZmxhZ3MgMHglbHhcbiIsCi0JICAgICAgIHBhZ2UsIHBhZ2UtPmluZGV4LCBwYWdlX2NvdW50KHBhZ2UpLCBwYWdlLT5mbGFncyk7Ci0JcHJpbnRrKCIgICAgICAgYWRkcmVzc19zcGFjZSA9ICVwLCBwYWdlcyA9JWxkXG4iLCBwYWdlLT5tYXBwaW5nLAotCSAgICAgICBwYWdlLT5tYXBwaW5nLT5ucnBhZ2VzKTsKLQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWI2NC9wYW5pYy5jIGIvYXJjaC9zaC9saWI2NC9wYW5pYy5jCmluZGV4IGRhMzJiYTcuLjM4Yzk1NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbGliNjQvcGFuaWMuYworKysgYi9hcmNoL3NoL2xpYjY0L3BhbmljLmMKQEAgLTYsNTMgKzYsMTAgQEAKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGNwdS9yZWdpc3RlcnMuaD4KLQotLyogVEhJUyBJUyBBIFBIWVNJQ0FMIEFERFJFU1MgKi8KLSNkZWZpbmUgSERTUDI1MzRfQUREUiAoMHgwNDAwMjEwMCkKLQotI2lmZGVmIENPTkZJR19TSF9DQVlNQU4KLQotc3RhdGljIHZvaWQgcG9vcl9tYW5zX2RlbGF5KHZvaWQpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IDI1MDAwMDA7IGkrKykgewotCX0JCS8qIHBvb3IgbWFuJ3MgZGVsYXkgKi8KLX0KLQotc3RhdGljIHZvaWQgc2hvd192YWx1ZSh1bnNpZ25lZCBsb25nIHgpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgbmliYmxlOwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJbmliYmxlID0gKCh4ID4+IChpICogNCkpICYgMHhmKTsKLQotCQljdHJsX291dGIobmliYmxlICsgKChuaWJibGUgPiA5KSA/IDU1IDogNDgpLAotCQkJICBIRFNQMjUzNF9BRERSICsgMHhlMCArICgoNyAtIGkpIDw8IDIpKTsKLQl9Ci19Ci0KLSNlbmRpZgotCiB2b2lkCiBwYW5pY19oYW5kbGVyKHVuc2lnbmVkIGxvbmcgcGFuaWNQQywgdW5zaWduZWQgbG9uZyBwYW5pY1NTUiwKIAkgICAgICB1bnNpZ25lZCBsb25nIHBhbmljRVhQRVZUKQogewotI2lmZGVmIENPTkZJR19TSF9DQVlNQU4KLQl3aGlsZSAoMSkgewotCQkvKiBUaGlzIHBpZWNlIG9mIGNvZGUgZGlzcGxheXMgdGhlIFBDIG9uIHRoZSBMRUQgZGlzcGxheSAqLwotCQlzaG93X3ZhbHVlKHBhbmljUEMpOwotCQlwb29yX21hbnNfZGVsYXkoKTsKLQkJc2hvd192YWx1ZShwYW5pY1NTUik7Ci0JCXBvb3JfbWFuc19kZWxheSgpOwotCQlzaG93X3ZhbHVlKHBhbmljRVhQRVZUKTsKLQkJcG9vcl9tYW5zX2RlbGF5KCk7Ci0JfQotI2VuZGlmCi0KIAkvKiBOZXZlciByZXR1cm4gZnJvbSB0aGUgcGFuaWMgaGFuZGxlciAqLwogCWZvciAoOzspIDsKLQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWI2NC9zZGl2c2kzLlMgYi9hcmNoL3NoL2xpYjY0L3NkaXZzaTMuUwppbmRleCA2YTgwMGM2Li4xOTYzYmJkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2xpYjY0L3NkaXZzaTMuUworKysgYi9hcmNoL3NoL2xpYjY0L3NkaXZzaTMuUwpAQCAtMSw0ICsxLDYgQEAKIAkuZ2xvYmFsCV9fc2RpdnNpMworCS5nbG9iYWwJX19zZGl2c2kzXzEKKwkuZ2xvYmFsCV9fc2RpdnNpM18yCiAJLnNlY3Rpb24JLnRleHQuLlNIbWVkaWEzMiwiYXgiCiAJLmFsaWduCTIKIApAQCAtNiwxMyArOCwxNSBAQAogCS8qIGNsb2JiZXJlZDogcjEscjE4LHIxOSxyMjAscjIxLHIyNSx0cjAgKi8KIAkvKiByZXN1bHQgaW4gcjAgKi8KIF9fc2RpdnNpMzoKK19fc2RpdnNpM18xOgogCXB0YiBfX2Rpdl90YWJsZSx0cjAKKwlnZXR0ciB0cjAscjIwCiAKK19fc2RpdnNpM18yOgogCW5zYiByNSwgcjEKIAlzaGxsZCByNSwgcjEsIHIyNSAgICAvKiBub3JtYWxpemU7IFstMiAuLjEsIDEuLjIpIGluIHMyLjYyICovCiAJc2hhcmkgcjI1LCA1OCwgcjIxICAgLyogZXh0cmFjdCA1KDYpIGJpdCBpbmRleCAoczIuNCB3aXRoIGhvbGUgLTEuLjEpICovCiAJLyogYnViYmxlICovCi0JZ2V0dHIgdHIwLHIyMAogCWxkeC51YiByMjAsIHIyMSwgcjE5IC8qIHUwLjggKi8KIAlzaGFyaSByMjUsIDMyLCByMjUgICAvKiBub3JtYWxpemUgdG8gczIuMzAgKi8KIAlzaGxsaSByMjEsIDEsIHIyMQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWI2NC91ZGVsYXkuYyBiL2FyY2gvc2gvbGliNjQvdWRlbGF5LmMKaW5kZXggZDc2YmQ4MC4uZjIxNWIwNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9saWI2NC91ZGVsYXkuYworKysgYi9hcmNoL3NoL2xpYjY0L3VkZWxheS5jCkBAIC0zMyw3ICszMyw3IEBACiAJCQkgICAgIDoiMCIobG9vcHMpKTsKIH0KIAotaW5saW5lIHZvaWQgX19jb25zdF91ZGVsYXkodW5zaWduZWQgbG9uZyB4bG9vcHMpCit2b2lkIF9fY29uc3RfdWRlbGF5KHVuc2lnbmVkIGxvbmcgeGxvb3BzKQogewogCV9fZGVsYXkoeGxvb3BzICogKEhaICogY3B1X2RhdGFbcmF3X3NtcF9wcm9jZXNzb3JfaWQoKV0ubG9vcHNfcGVyX2ppZmZ5KSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL0tjb25maWcgYi9hcmNoL3NoL21tL0tjb25maWcKaW5kZXggZDQwNzljYS4uMjc5NTYxOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9LY29uZmlnCisrKyBiL2FyY2gvc2gvbW0vS2NvbmZpZwpAQCAtMjEsNiArMjEsMjkgQEAKIAlkZWZhdWx0ICIweDIwMDAwMDAwIiBpZiBNTVUgJiYgU1VQRVJINjQKIAlkZWZhdWx0ICIweDAwMDAwMDAwIgogCitjb25maWcgRk9SQ0VfTUFYX1pPTkVPUkRFUgorCWludCAiTWF4aW11bSB6b25lIG9yZGVyIgorCXJhbmdlIDkgNjQgaWYgUEFHRV9TSVpFXzE2S0IKKwlkZWZhdWx0ICI5IiBpZiBQQUdFX1NJWkVfMTZLQgorCXJhbmdlIDcgNjQgaWYgUEFHRV9TSVpFXzY0S0IKKwlkZWZhdWx0ICI3IiBpZiBQQUdFX1NJWkVfNjRLQgorCXJhbmdlIDExIDY0CisJZGVmYXVsdCAiMTQiIGlmICFNTVUKKwlkZWZhdWx0ICIxMSIKKwloZWxwCisJICBUaGUga2VybmVsIG1lbW9yeSBhbGxvY2F0b3IgZGl2aWRlcyBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5CisJICBibG9ja3MgaW50byAiem9uZXMiLCB3aGVyZSBlYWNoIHpvbmUgaXMgYSBwb3dlciBvZiB0d28gbnVtYmVyIG9mCisJICBwYWdlcy4gIFRoaXMgb3B0aW9uIHNlbGVjdHMgdGhlIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQgdGhlIGtlcm5lbAorCSAga2VlcHMgaW4gdGhlIG1lbW9yeSBhbGxvY2F0b3IuICBJZiB5b3UgbmVlZCB0byBhbGxvY2F0ZSB2ZXJ5IGxhcmdlCisJICBibG9ja3Mgb2YgcGh5c2ljYWxseSBjb250aWd1b3VzIG1lbW9yeSwgdGhlbiB5b3UgbWF5IG5lZWQgdG8KKwkgIGluY3JlYXNlIHRoaXMgdmFsdWUuCisKKwkgIFRoaXMgY29uZmlnIG9wdGlvbiBpcyBhY3R1YWxseSBtYXhpbXVtIG9yZGVyIHBsdXMgb25lLiBGb3IgZXhhbXBsZSwKKwkgIGEgdmFsdWUgb2YgMTEgbWVhbnMgdGhhdCB0aGUgbGFyZ2VzdCBmcmVlIG1lbW9yeSBibG9jayBpcyAyXjEwIHBhZ2VzLgorCisJICBUaGUgcGFnZSBzaXplIGlzIG5vdCBuZWNlc3NhcmlseSA0S0IuIEtlZXAgdGhpcyBpbiBtaW5kIHdoZW4KKwkgIGNob29zaW5nIGEgdmFsdWUgZm9yIHRoaXMgb3B0aW9uLgorCiBjb25maWcgTUVNT1JZX1NUQVJUCiAJaGV4ICJQaHlzaWNhbCBtZW1vcnkgc3RhcnQgYWRkcmVzcyIKIAlkZWZhdWx0ICIweDA4MDAwMDAwIgpAQCAtMjAxLDE0ICsyMjQsNiBAQAogCiBlbmRjaG9pY2UKIAotY29uZmlnIEVOVFJZX09GRlNFVAotCWhleAotCWRlZmF1bHQgIjB4MDAwMDEwMDAiIGlmIFBBR0VfU0laRV80S0IKLQlkZWZhdWx0ICIweDAwMDAyMDAwIiBpZiBQQUdFX1NJWkVfOEtCCi0JZGVmYXVsdCAiMHgwMDAwNDAwMCIgaWYgUEFHRV9TSVpFXzE2S0IKLQlkZWZhdWx0ICIweDAwMDEwMDAwIiBpZiBQQUdFX1NJWkVfNjRLQgotCWRlZmF1bHQgIjB4MDAwMDAwMDAiCi0KIGNob2ljZQogCXByb21wdCAiSHVnZVRMQiBwYWdlIHNpemUiCiAJZGVwZW5kcyBvbiBIVUdFVExCX1BBR0UgJiYgKENQVV9TSDQgfHwgQ1BVX1NINSkgJiYgTU1VCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2NhY2hlLXNoNS5jIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDUuYwppbmRleCA5ZTI3N2VjLi44Njc2MjA5IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NhY2hlLXNoNS5jCisrKyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g1LmMKQEAgLTYwLDcgKzYwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzaDY0X2ljYWNoZV9pbnZfYWxsKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIGFkZHIsIGZsYWcsIGRhdGE7Ci0JdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlhZGRyID0gSUNDUjA7CiAJZmxhZyA9IElDQ1IwX0lDSTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogCQl1bnNpZ25lZCBsb25nIGVhZGRyOwogCQl1bnNpZ25lZCBsb25nIGFmdGVyX2xhc3RfcGFnZV9zdGFydDsKIAkJdW5zaWduZWQgbG9uZyBtbV9hc2lkLCBjdXJyZW50X2FzaWQ7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBmbGFncyA9IDBVTEw7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCiAJCW1tX2FzaWQgPSBjcHVfYXNpZChzbXBfcHJvY2Vzc29yX2lkKCksIG1tKTsKIAkJY3VycmVudF9hc2lkID0gZ2V0X2FzaWQoKTsKQEAgLTIzNiw3ICsyMzYsNyBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBlYWRkciA9IHN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgbG9uZyBlYWRkcl9lbmQgPSBzdGFydCArIGxlbjsKIAl1bnNpZ25lZCBsb25nIGN1cnJlbnRfYXNpZCwgbW1fYXNpZDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGxvbmcgZXBhZ2Vfc3RhcnQ7CiAKIAkvKgpAQCAtMzQyLDcgKzM0Miw3IEBACiAJCQkgKiBhbGxvY28gaXMgYSBOT1AgaWYgdGhlIGNhY2hlIGlzIHdyaXRlLXRocm91Z2guCiAJCQkgKi8KIAkJCWlmICh0ZXN0X2JpdChTSF9DQUNIRV9NT0RFX1dULCAmKGNwdV9kYXRhLT5kY2FjaGUuZmxhZ3MpKSkKLQkJCQljdHJsX2luYihlYWRkcik7CisJCQkJX19yYXdfcmVhZGIoKHVuc2lnbmVkIGxvbmcpZWFkZHIpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2luaXQuYyBiL2FyY2gvc2gvbW0vaW5pdC5jCmluZGV4IDNlZGYyOTcuLmVlOGU2YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vaW5pdC5jCisrKyBiL2FyY2gvc2gvbW0vaW5pdC5jCkBAIC0xODQsNyArMTg0LDYgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBrY29yZV9saXN0IGtjb3JlX21lbSwga2NvcmVfdm1hbGxvYzsKLWludCBhZnRlcl9ib290bWVtID0gMDsKIAogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKQEAgLTIxNyw4ICsyMTYsNiBAQAogCW1lbXNldChlbXB0eV96ZXJvX3BhZ2UsIDAsIFBBR0VfU0laRSk7CiAJX19mbHVzaF93YmFja19yZWdpb24oZW1wdHlfemVyb19wYWdlLCBQQUdFX1NJWkUpOwogCi0JYWZ0ZXJfYm9vdG1lbSA9IDE7Ci0KIAljb2Rlc2l6ZSA9ICAodW5zaWduZWQgbG9uZykgJl9ldGV4dCAtICh1bnNpZ25lZCBsb25nKSAmX3RleHQ7CiAJZGF0YXNpemUgPSAgKHVuc2lnbmVkIGxvbmcpICZfZWRhdGEgLSAodW5zaWduZWQgbG9uZykgJl9ldGV4dDsKIAlpbml0c2l6ZSA9ICAodW5zaWduZWQgbG9uZykgJl9faW5pdF9lbmQgLSAodW5zaWduZWQgbG9uZykgJl9faW5pdF9iZWdpbjsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW9yZW1hcF8zMi5jIGIvYXJjaC9zaC9tbS9pb3JlbWFwXzMyLmMKaW5kZXggNjBjYzQ4Ni4uZGEyZjQxOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pb3JlbWFwXzMyLmMKKysrIGIvYXJjaC9zaC9tbS9pb3JlbWFwXzMyLmMKQEAgLTQ2LDE3ICs0NiwxNSBAQAogCQlyZXR1cm4gTlVMTDsKIAogCS8qCi0JICogSWYgd2UncmUgb24gYW4gU0g3NzUxIG9yIFNINzc4MCBQQ0kgY29udHJvbGxlciwgUENJIG1lbW9yeSBpcwotCSAqIG1hcHBlZCBhdCB0aGUgZW5kIG9mIHRoZSBhZGRyZXNzIHNwYWNlICh0eXBpY2FsbHkgMHhmZDAwMDAwMCkKLQkgKiBpbiBhIG5vbi10cmFuc2xhdGFibGUgYXJlYSwgc28gbWFwcGluZyB0aHJvdWdoIHBhZ2UgdGFibGVzIGZvcgotCSAqIHRoaXMgYXJlYSBpcyBub3Qgb25seSBwb2ludGxlc3MsIGJ1dCBhbHNvIGZ1bmRhbWVudGFsbHkKLQkgKiBicm9rZW4uIEp1c3QgcmV0dXJuIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGluc3RlYWQuCisJICogSWYgd2UncmUgaW4gdGhlIGZpeGVkIFBDSSBtZW1vcnkgcmFuZ2UsIG1hcHBpbmcgdGhyb3VnaCBwYWdlCisJICogdGFibGVzIGlzIG5vdCBvbmx5IHBvaW50bGVzcywgYnV0IGFsc28gZnVuZGFtZW50YWxseSBicm9rZW4uCisJICogSnVzdCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW5zdGVhZC4KIAkgKgogCSAqIEZvciBib2FyZHMgdGhhdCBtYXAgYSBzbWFsbCBQQ0kgbWVtb3J5IGFwZXJ0dXJlIHNvbWV3aGVyZSBpbgogCSAqIFAxL1AyIHNwYWNlLCBpb3JlbWFwKCkgd2lsbCBhbHJlYWR5IGRvIHRoZSByaWdodCB0aGluZywKIAkgKiBhbmQgd2UnbGwgbmV2ZXIgZ2V0IHRoaXMgZmFyLgogCSAqLwotCWlmIChpc19wY2lfbWVtYWRkcihwaHlzX2FkZHIpICYmIGlzX3BjaV9tZW1hZGRyKGxhc3RfYWRkcikpCisJaWYgKGlzX3BjaV9tZW1vcnlfZml4ZWRfcmFuZ2UocGh5c19hZGRyLCBzaXplKSkKIAkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwaHlzX2FkZHI7CiAKICNpZiAhZGVmaW5lZChDT05GSUdfUE1CX0ZJWEVEKQpAQCAtMTIxLDcgKzExOSw5IEBACiAJdW5zaWduZWQgbG9uZyBzZWcgPSBQWFNFRyh2YWRkcik7CiAJc3RydWN0IHZtX3N0cnVjdCAqcDsKIAotCWlmIChzZWcgPCBQM1NFRyB8fCB2YWRkciA+PSBQM19BRERSX01BWCB8fCBpc19wY2lfbWVtYWRkcih2YWRkcikpCisJaWYgKHNlZyA8IFAzU0VHIHx8IHZhZGRyID49IFAzX0FERFJfTUFYKQorCQlyZXR1cm47CisJaWYgKGlzX3BjaV9tZW1vcnlfZml4ZWRfcmFuZ2UodmFkZHIsIDApKQogCQlyZXR1cm47CiAKICNpZmRlZiBDT05GSUdfUE1CCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2lvcmVtYXBfNjQuYyBiL2FyY2gvc2gvbW0vaW9yZW1hcF82NC5jCmluZGV4IDMxZTFiYjUuLjgyOGM4NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vaW9yZW1hcF82NC5jCisrKyBiL2FyY2gvc2gvbW0vaW9yZW1hcF82NC5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgpAQCAtMjcsODggKzI4LDE3IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgogCi1zdGF0aWMgdm9pZCBzaG1lZGlhX21hcGlvYWRkcih1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNobWVkaWFfaW9yZW1hcChzdHJ1Y3QgcmVzb3VyY2UgKiwgdTMyLCBpbnQpOwotCi0vKgotICogR2VuZXJpYyBtYXBwaW5nIGZ1bmN0aW9uIChub3QgdmlzaWJsZSBvdXRzaWRlKToKLSAqLwotCi0vKgotICogUmVtYXAgYW4gYXJiaXRyYXJ5IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgaW50byB0aGUga2VybmVsIHZpcnR1YWwKLSAqIGFkZHJlc3Mgc3BhY2UuIE5lZWRlZCB3aGVuIHRoZSBrZXJuZWwgd2FudHMgdG8gYWNjZXNzIGhpZ2ggYWRkcmVzc2VzCi0gKiBkaXJlY3RseS4KLSAqCi0gKiBOT1RFISBXZSBuZWVkIHRvIGFsbG93IG5vbi1wYWdlLWFsaWduZWQgbWFwcGluZ3MgdG9vOiB3ZSB3aWxsIG9idmlvdXNseQotICogaGF2ZSB0byBjb252ZXJ0IHRoZW0gaW50byBhbiBvZmZzZXQgaW4gYSBwYWdlLWFsaWduZWQgbWFwcGluZywgYnV0IHRoZQotICogY2FsbGVyIHNob3VsZG4ndCBuZWVkIHRvIGtub3cgdGhhdCBzbWFsbCBkZXRhaWwuCi0gKi8KLXZvaWQgKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQl1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXZvaWQgKiBhZGRyOwotCXN0cnVjdCB2bV9zdHJ1Y3QgKiBhcmVhOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBsYXN0X2FkZHI7Ci0JcGdwcm90X3QgcGdwcm90OwotCi0JLyogRG9uJ3QgYWxsb3cgd3JhcGFyb3VuZCBvciB6ZXJvIHNpemUgKi8KLQlsYXN0X2FkZHIgPSBwaHlzX2FkZHIgKyBzaXplIC0gMTsKLQlpZiAoIXNpemUgfHwgbGFzdF9hZGRyIDwgcGh5c19hZGRyKQotCQlyZXR1cm4gTlVMTDsKLQotCXBncHJvdCA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgIHwgX1BBR0VfUkVBRCAgIHwKLQkJCSAgX1BBR0VfV1JJVEUgICAgfCBfUEFHRV9ESVJUWSAgfAotCQkJICBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX1NIQVJFRCB8IGZsYWdzKTsKLQotCS8qCi0JICogTWFwcGluZ3MgaGF2ZSB0byBiZSBwYWdlLWFsaWduZWQKLQkgKi8KLQlvZmZzZXQgPSBwaHlzX2FkZHIgJiB+UEFHRV9NQVNLOwotCXBoeXNfYWRkciAmPSBQQUdFX01BU0s7Ci0Jc2l6ZSA9IFBBR0VfQUxJR04obGFzdF9hZGRyICsgMSkgLSBwaHlzX2FkZHI7Ci0KLQkvKgotCSAqIE9rLCBnbyBmb3IgaXQuLgotCSAqLwotCWFyZWEgPSBnZXRfdm1fYXJlYShzaXplLCBWTV9JT1JFTUFQKTsKLQlpZiAoIWFyZWEpCi0JCXJldHVybiBOVUxMOwotCXByX2RlYnVnKCJHZXQgdm1fYXJlYSByZXR1cm5zICVwIGFkZHIgJXBcbiIsIGFyZWEsIGFyZWEtPmFkZHIpOwotCWFyZWEtPnBoeXNfYWRkciA9IHBoeXNfYWRkcjsKLQlhZGRyID0gYXJlYS0+YWRkcjsKLQlpZiAoaW9yZW1hcF9wYWdlX3JhbmdlKCh1bnNpZ25lZCBsb25nKWFkZHIsICh1bnNpZ25lZCBsb25nKWFkZHIgKyBzaXplLAotCQkJICAgICAgIHBoeXNfYWRkciwgcGdwcm90KSkgewotCQl2dW5tYXAoYWRkcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gKHZvaWQgKikgKG9mZnNldCArIChjaGFyICopYWRkcik7Ci19Ci1FWFBPUlRfU1lNQk9MKF9faW9yZW1hcCk7Ci0KLXZvaWQgX19pb3VubWFwKHZvaWQgKmFkZHIpCi17Ci0Jc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKLQotCXZmcmVlKCh2b2lkICopIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZykgYWRkcikpOwotCWFyZWEgPSByZW1vdmVfdm1fYXJlYSgodm9pZCAqKSAoUEFHRV9NQVNLICYgKHVuc2lnbmVkIGxvbmcpIGFkZHIpKTsKLQlpZiAoIWFyZWEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpb3VubWFwOiBiYWQgYWRkcmVzcyAlcFxuIiwgYWRkcik7Ci0JCXJldHVybjsKLQl9Ci0KLQlrZnJlZShhcmVhKTsKLX0KLUVYUE9SVF9TWU1CT0woX19pb3VubWFwKTsKLQogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaG1lZGlhX2lvbWFwID0gewogCS5uYW1lCT0gInNobWVkaWFfaW9tYXAiLAogCS5zdGFydAk9IElPQkFTRV9WQUREUiArIFBBR0VfU0laRSwKIAkuZW5kCT0gSU9CQVNFX0VORCAtIDEsCiB9OwogCi1zdGF0aWMgdm9pZCBzaG1lZGlhX21hcGlvYWRkcih1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHZhKTsKK3N0YXRpYyB2b2lkIHNobWVkaWFfbWFwaW9hZGRyKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgdmEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIHN0YXRpYyB2b2lkIHNobWVkaWFfdW5tYXBpb2FkZHIodW5zaWduZWQgbG9uZyB2YWRkcik7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBzaG1lZGlhX2lvcmVtYXAoc3RydWN0IHJlc291cmNlICpyZXMsIHUzMiBwYSwgaW50IHN6KTsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNobWVkaWFfaW9yZW1hcChzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdTMyIHBhLAorCQkJCSAgICAgaW50IHN6LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAogLyoKICAqIFdlIGhhdmUgdGhlIHNhbWUgcHJvYmxlbSBhcyB0aGUgU1BBUkMsIHNvIGxldHMgaGF2ZSB0aGUgc2FtZSBjb21tZW50OgpAQCAtMTMwLDE4ICs2MCwxOCBAQAogCiBzdGF0aWMgc3RydWN0IHhyZXNvdXJjZSAqeHJlc19hbGxvYyh2b2lkKQogewotICAgICAgICBzdHJ1Y3QgeHJlc291cmNlICp4cnA7Ci0gICAgICAgIGludCBuOworCXN0cnVjdCB4cmVzb3VyY2UgKnhycDsKKwlpbnQgbjsKIAotICAgICAgICB4cnAgPSB4cmVzdjsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IFhOUkVTOyBuKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoeHJwLT54ZmxhZyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4cnAtPnhmbGFnID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB4cnA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhycCsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOVUxMOworCXhycCA9IHhyZXN2OworCWZvciAobiA9IDA7IG4gPCBYTlJFUzsgbisrKSB7CisJCWlmICh4cnAtPnhmbGFnID09IDApIHsKKwkJCXhycC0+eGZsYWcgPSAxOworCQkJcmV0dXJuIHhycDsKKwkJfQorCQl4cnArKzsKKwl9CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIHhyZXNfZnJlZShzdHJ1Y3QgeHJlc291cmNlICp4cnApCkBAIC0xNjEsNzYgKzkxLDcxIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNobWVkaWFfYWxsb2NfaW8odW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyB2b2lkIF9faW9tZW0gKnNobWVkaWFfYWxsb2NfaW8odW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLSAgICAgICAgc3RhdGljIGludCBwcmludGVkX2Z1bGwgPSAwOwotICAgICAgICBzdHJ1Y3QgeHJlc291cmNlICp4cmVzOwotICAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLSAgICAgICAgY2hhciAqdGFjazsKLSAgICAgICAgaW50IHRsZW47CisJc3RhdGljIGludCBwcmludGVkX2Z1bGw7CisJc3RydWN0IHhyZXNvdXJjZSAqeHJlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwljaGFyICp0YWNrOworCWludCB0bGVuOwogCi0gICAgICAgIGlmIChuYW1lID09IE5VTEwpIG5hbWUgPSAiPz8/IjsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQluYW1lID0gIj8/PyI7CiAKLSAgICAgICAgaWYgKCh4cmVzID0geHJlc19hbGxvYygpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgdGFjayA9IHhyZXMtPnhuYW1lOwotICAgICAgICAgICAgICAgIHJlcyA9ICZ4cmVzLT54cmVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghcHJpbnRlZF9mdWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIiVzOiBkb25lIHdpdGggc3RhdGljcywgc3dpdGNoaW5nIHRvIGttYWxsb2NcbiIsCi0JCQkgICAgICAgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlZF9mdWxsID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGxlbiA9IHN0cmxlbihuYW1lKTsKLSAgICAgICAgICAgICAgICB0YWNrID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCByZXNvdXJjZSkgKyB0bGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0YWNrKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHRhY2ssIDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpKTsKLSAgICAgICAgICAgICAgICByZXMgPSAoc3RydWN0IHJlc291cmNlICopIHRhY2s7Ci0gICAgICAgICAgICAgICAgdGFjayArPSBzaXplb2YgKHN0cnVjdCByZXNvdXJjZSk7Ci0gICAgICAgIH0KKwl4cmVzID0geHJlc19hbGxvYygpOworCWlmICh4cmVzICE9IDApIHsKKwkJdGFjayA9IHhyZXMtPnhuYW1lOworCQlyZXMgPSAmeHJlcy0+eHJlczsKKwl9IGVsc2UgeworCQlpZiAoIXByaW50ZWRfZnVsbCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogZG9uZSB3aXRoIHN0YXRpY3MsICIKKwkJCSAgICAgICAic3dpdGNoaW5nIHRvIGttYWxsb2NcbiIsIF9fZnVuY19fKTsKKwkJCXByaW50ZWRfZnVsbCA9IDE7CisJCX0KKwkJdGxlbiA9IHN0cmxlbihuYW1lKTsKKwkJdGFjayA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkgKyB0bGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdGFjaykKKwkJCXJldHVybiBOVUxMOworCQltZW1zZXQodGFjaywgMCwgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOworCQlyZXMgPSAoc3RydWN0IHJlc291cmNlICopIHRhY2s7CisJCXRhY2sgKz0gc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSk7CisJfQogCi0gICAgICAgIHN0cm5jcHkodGFjaywgbmFtZSwgWE5NTE4pOwotICAgICAgICB0YWNrW1hOTUxOXSA9IDA7Ci0gICAgICAgIHJlcy0+bmFtZSA9IHRhY2s7CisJc3RybmNweSh0YWNrLCBuYW1lLCBYTk1MTik7CisJdGFja1tYTk1MTl0gPSAwOworCXJlcy0+bmFtZSA9IHRhY2s7CiAKLSAgICAgICAgcmV0dXJuIHNobWVkaWFfaW9yZW1hcChyZXMsIHBoeXMsIHNpemUpOworCXJldHVybiBzaG1lZGlhX2lvcmVtYXAocmVzLCBwaHlzLCBzaXplLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNobWVkaWFfaW9yZW1hcChzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdTMyIHBhLCBpbnQgc3opCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzaG1lZGlhX2lvcmVtYXAoc3RydWN0IHJlc291cmNlICpyZXMsIHUzMiBwYSwgaW50IHN6LAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAoKHVuc2lnbmVkIGxvbmcpIHBhKSAmICh+UEFHRV9NQVNLKTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICgodW5zaWduZWQgbG9uZykgcGEpICYgKH5QQUdFX01BU0spOwogCXVuc2lnbmVkIGxvbmcgcm91bmRfc3ogPSAob2Zmc2V0ICsgc3ogKyBQQUdFX1NJWkUtMSkgJiBQQUdFX01BU0s7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgdmE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBwc3o7CisJdW5zaWduZWQgbG9uZyB2YTsKKwl1bnNpZ25lZCBpbnQgcHN6OwogCi0gICAgICAgIGlmIChhbGxvY2F0ZV9yZXNvdXJjZSgmc2htZWRpYV9pb21hcCwgcmVzLCByb3VuZF9zeiwKKwlpZiAoYWxsb2NhdGVfcmVzb3VyY2UoJnNobWVkaWFfaW9tYXAsIHJlcywgcm91bmRfc3osCiAJCQkgICAgICBzaG1lZGlhX2lvbWFwLnN0YXJ0LCBzaG1lZGlhX2lvbWFwLmVuZCwKIAkJCSAgICAgIFBBR0VfU0laRSwgTlVMTCwgTlVMTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHBhbmljKCJhbGxvY19pb19yZXMoJXMpOiBjYW5ub3Qgb2NjdXB5XG4iLAotICAgICAgICAgICAgICAgICAgICAocmVzLT5uYW1lICE9IE5VTEwpPyByZXMtPm5hbWU6ICI/Pz8iKTsKLSAgICAgICAgfQorCQlwYW5pYygiYWxsb2NfaW9fcmVzKCVzKTogY2Fubm90IG9jY3VweVxuIiwKKwkJICAgICAgKHJlcy0+bmFtZSAhPSBOVUxMKSA/IHJlcy0+bmFtZSA6ICI/Pz8iKTsKKwl9CiAKLSAgICAgICAgdmEgPSByZXMtPnN0YXJ0OwotICAgICAgICBwYSAmPSBQQUdFX01BU0s7CisJdmEgPSByZXMtPnN0YXJ0OworCXBhICY9IFBBR0VfTUFTSzsKIAogCXBzeiA9IChyZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAoUEFHRV9TSVpFIC0gMSkpIC8gUEFHRV9TSVpFOwogCi0JLyogbG9nIGF0IGJvb3QgdGltZSAuLi4gKi8KLQlwcmludGsoIm1hcGlvYWRkcjogJTZzICBbJTJkIHBhZ2Ulc10gIHZhIDB4JTA4bHggICBwYSAweCUwOHhcbiIsCi0JICAgICAgICgocmVzLT5uYW1lICE9IE5VTEwpID8gcmVzLT5uYW1lIDogIj8/PyIpLAotCSAgICAgICBwc3osIHBzeiA9PSAxID8gIiAiIDogInMiLCB2YSwgcGEpOworCWZvciAocHN6ID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgMTsgcHN6ICE9IDA7IHBzeiAtPSBQQUdFX1NJWkUpIHsKKwkJc2htZWRpYV9tYXBpb2FkZHIocGEsIHZhLCBmbGFncyk7CisJCXZhICs9IFBBR0VfU0laRTsKKwkJcGEgKz0gUEFHRV9TSVpFOworCX0KIAotICAgICAgICBmb3IgKHBzeiA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7IHBzeiAhPSAwOyBwc3ogLT0gUEFHRV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgc2htZWRpYV9tYXBpb2FkZHIocGEsIHZhKTsKLSAgICAgICAgICAgICAgICB2YSArPSBQQUdFX1NJWkU7Ci0gICAgICAgICAgICAgICAgcGEgKz0gUEFHRV9TSVpFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzLT5zdGFydCArPSBvZmZzZXQ7Ci0gICAgICAgIHJlcy0+ZW5kID0gcmVzLT5zdGFydCArIHN6IC0gMTsgICAgICAgICAvKiBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5Li4gKi8KLQotICAgICAgICByZXR1cm4gcmVzLT5zdGFydDsKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSh1bnNpZ25lZCBsb25nKShyZXMtPnN0YXJ0ICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHZvaWQgc2htZWRpYV9mcmVlX2lvKHN0cnVjdCByZXNvdXJjZSAqcmVzKQpAQCAtMjQ5LDE0ICsxNzQsMTIgQEAKIAogc3RhdGljIF9faW5pdF9yZWZvayB2b2lkICpzaDY0X2dldF9wYWdlKHZvaWQpCiB7Ci0JZXh0ZXJuIGludCBhZnRlcl9ib290bWVtOwogCXZvaWQgKnBhZ2U7CiAKLQlpZiAoYWZ0ZXJfYm9vdG1lbSkgewotCQlwYWdlID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7Ci0JfSBlbHNlIHsKKwlpZiAoc2xhYl9pc19hdmFpbGFibGUoKSkKKwkJcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWVsc2UKIAkJcGFnZSA9IGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKLQl9CiAKIAlpZiAoIXBhZ2UgfHwgKCh1bnNpZ25lZCBsb25nKXBhZ2UgJiB+UEFHRV9NQVNLKSkKIAkJcGFuaWMoInNoNjRfZ2V0X3BhZ2U6IE91dCBvZiBtZW1vcnkgYWxyZWFkeT9cbiIpOwpAQCAtMjY0LDE3ICsxODcsMjAgQEAKIAlyZXR1cm4gcGFnZTsKIH0KIAotc3RhdGljIHZvaWQgc2htZWRpYV9tYXBpb2FkZHIodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyB2YSkKK3N0YXRpYyB2b2lkIHNobWVkaWFfbWFwaW9hZGRyKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgdmEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXBnZF90ICpwZ2RwOwogCXB1ZF90ICpwdWRwOwogCXBtZF90ICpwbWRwOwogCXB0ZV90ICpwdGVwLCBwdGU7CiAJcGdwcm90X3QgcHJvdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMTsgLyogMSA9IENCMC0xIGRldmljZSAqLwogCiAJcHJfZGVidWcoInNobWVkaWFfbWFwaW9wYWdlIHBhICUwOGx4IHZhICUwOGx4XG4iLCAgcGEsIHZhKTsKIAorCWlmICghZmxhZ3MpCisJCWZsYWdzID0gMTsgLyogMSA9IENCMC0xIGRldmljZSAqLworCiAJcGdkcCA9IHBnZF9vZmZzZXRfayh2YSk7CiAJaWYgKHBnZF9ub25lKCpwZ2RwKSB8fCAhcGdkX3ByZXNlbnQoKnBnZHApKSB7CiAJCXB1ZHAgPSAocHVkX3QgKilzaDY0X2dldF9wYWdlKCk7CkBAIC0yODgsNyArMjE0LDcgQEAKIAl9CiAKIAlwbWRwID0gcG1kX29mZnNldChwdWRwLCB2YSk7Ci0JaWYgKHBtZF9ub25lKCpwbWRwKSB8fCAhcG1kX3ByZXNlbnQoKnBtZHApICkgeworCWlmIChwbWRfbm9uZSgqcG1kcCkgfHwgIXBtZF9wcmVzZW50KCpwbWRwKSkgewogCQlwdGVwID0gKHB0ZV90ICopc2g2NF9nZXRfcGFnZSgpOwogCQlzZXRfcG1kKHBtZHAsIF9fcG1kKCh1bnNpZ25lZCBsb25nKXB0ZXAgKyBfUEFHRV9UQUJMRSkpOwogCX0KQEAgLTMzNiwxNyArMjYyLDE5IEBACiAJcHRlX2NsZWFyKCZpbml0X21tLCB2YWRkciwgcHRlcCk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgb25jaGlwX3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICpuYW1lKQordm9pZCBfX2lvbWVtICpfX2lvcmVtYXAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0JaWYgKHNpemUgPCBQQUdFX1NJWkUpCi0JCXNpemUgPSBQQUdFX1NJWkU7CisJY2hhciBuYW1lWzE0XTsKIAotCXJldHVybiBzaG1lZGlhX2FsbG9jX2lvKHBoeXMsIHNpemUsIG5hbWUpOworCXNwcmludGYobmFtZSwgInBoeXNfJTA4eCIsICh1MzIpb2Zmc2V0KTsKKwlyZXR1cm4gc2htZWRpYV9hbGxvY19pbyhvZmZzZXQsIHNpemUsIG5hbWUsIGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0wob25jaGlwX3JlbWFwKTsKK0VYUE9SVF9TWU1CT0woX19pb3JlbWFwKTsKIAotdm9pZCBvbmNoaXBfdW5tYXAodW5zaWduZWQgbG9uZyB2YWRkcikKK3ZvaWQgX19pb3VubWFwKHZvaWQgX19pb21lbSAqdmlydHVhbCkKIHsKKwl1bnNpZ25lZCBsb25nIHZhZGRyID0gKHVuc2lnbmVkIGxvbmcpdmlydHVhbCAmIFBBR0VfTUFTSzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAl1bnNpZ25lZCBpbnQgcHN6OwogCkBAIC0zNTcsMTAgKzI4NSw3IEBACiAJCXJldHVybjsKIAl9CiAKLSAgICAgICAgcHN6ID0gKHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIChQQUdFX1NJWkUgLSAxKSkgLyBQQUdFX1NJWkU7Ci0KLSAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgInVubWFwaW9hZGRyOiAlNnMgIFslMmQgcGFnZSVzXSBmcmVlZFxuIiwKLQkgICAgICAgcmVzLT5uYW1lLCBwc3osIHBzeiA9PSAxID8gIiAiIDogInMiKTsKKwlwc3ogPSAocmVzLT5lbmQgLSByZXMtPnN0YXJ0ICsgKFBBR0VfU0laRSAtIDEpKSAvIFBBR0VfU0laRTsKIAogCXNobWVkaWFfZnJlZV9pbyhyZXMpOwogCkBAIC0zNzEsOSArMjk2LDggQEAKIAkJa2ZyZWUocmVzKTsKIAl9CiB9Ci1FWFBPUlRfU1lNQk9MKG9uY2hpcF91bm1hcCk7CitFWFBPUlRfU1lNQk9MKF9faW91bm1hcCk7CiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGludAogaW9yZW1hcF9wcm9jX2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsIGludCBsZW5ndGgsIGludCAqZW9mLAogCQkgIHZvaWQgKmRhdGEpCkBAIC0zODUsNyArMzA5LDEwIEBACiAJZm9yIChyID0gKChzdHJ1Y3QgcmVzb3VyY2UgKilkYXRhKS0+Y2hpbGQ7IHIgIT0gTlVMTDsgciA9IHItPnNpYmxpbmcpIHsKIAkJaWYgKHAgKyAzMiA+PSBlKSAgICAgICAgLyogQmV0dGVyIHRoYW4gbm90aGluZyAqLwogCQkJYnJlYWs7Ci0JCWlmICgobm0gPSByLT5uYW1lKSA9PSAwKSBubSA9ICI/Pz8iOworCQlubSA9IHItPm5hbWU7CisJCWlmIChubSA9PSBOVUxMKQorCQkJbm0gPSAiPz8/IjsKKwogCQlwICs9IHNwcmludGYocCwgIiUwOGx4LSUwOGx4OiAlc1xuIiwKIAkJCSAgICAgKHVuc2lnbmVkIGxvbmcpci0+c3RhcnQsCiAJCQkgICAgICh1bnNpZ25lZCBsb25nKXItPmVuZCwgbm0pOwpAQCAtMzkzLDE0ICszMjAsMTEgQEAKIAogCXJldHVybiBwLWJ1ZjsKIH0KLSNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwogCiBzdGF0aWMgaW50IF9faW5pdCByZWdpc3Rlcl9wcm9jX29uY2hpcCh2b2lkKQogewotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi0JY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiaW9fbWFwIiwwLDAsIGlvcmVtYXBfcHJvY19pbmZvLCAmc2htZWRpYV9pb21hcCk7Ci0jZW5kaWYKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpb19tYXAiLCAwLCAwLCBpb3JlbWFwX3Byb2NfaW5mbywKKwkJCSAgICAgICAmc2htZWRpYV9pb21hcCk7CiAJcmV0dXJuIDA7CiB9Ci0KLV9faW5pdGNhbGwocmVnaXN0ZXJfcHJvY19vbmNoaXApOworbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9wcm9jX29uY2hpcCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL21tYXAuYyBiL2FyY2gvc2gvbW0vbW1hcC5jCmluZGV4IDkzMWY0ZDAuLjFiNWZkZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vbW1hcC5jCisrKyBiL2FyY2gvc2gvbW0vbW1hcC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGFyY2gvc2gvbW0vbW1hcC5jCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA4ICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggLSAyMDA5ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTIxLDkgKzIxLDI2IEBACiAvKgogICogVG8gYXZvaWQgY2FjaGUgYWxpYXNlcywgd2UgbWFwIHRoZSBzaGFyZWQgcGFnZSB3aXRoIHNhbWUgY29sb3IuCiAgKi8KLSNkZWZpbmUgQ09MT1VSX0FMSUdOKGFkZHIsIHBnb2ZmKQkJCQlcCi0JKCgoKGFkZHIpICsgc2htX2FsaWduX21hc2spICYgfnNobV9hbGlnbl9tYXNrKSArCVwKLQkgKCgocGdvZmYpIDw8IFBBR0VfU0hJRlQpICYgc2htX2FsaWduX21hc2spKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIENPTE9VUl9BTElHTih1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJCSB1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IChhZGRyICsgc2htX2FsaWduX21hc2spICYgfnNobV9hbGlnbl9tYXNrOworCXVuc2lnbmVkIGxvbmcgb2ZmID0gKHBnb2ZmIDw8IFBBR0VfU0hJRlQpICYgc2htX2FsaWduX21hc2s7CisKKwlyZXR1cm4gYmFzZSArIG9mZjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIENPTE9VUl9BTElHTl9ET1dOKHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwZ29mZikKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSBhZGRyICYgfnNobV9hbGlnbl9tYXNrOworCXVuc2lnbmVkIGxvbmcgb2ZmID0gKHBnb2ZmIDw8IFBBR0VfU0hJRlQpICYgc2htX2FsaWduX21hc2s7CisKKwlpZiAoYmFzZSArIG9mZiA8PSBhZGRyKQorCQlyZXR1cm4gYmFzZSArIG9mZjsKKworCXJldHVybiBiYXNlIC0gb2ZmOworfQogCiB1bnNpZ25lZCBsb25nIGFyY2hfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwZ29mZiwgdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTEwMyw2ICsxMjAsMTE3IEBACiAJCQlhZGRyID0gQ09MT1VSX0FMSUdOKGFkZHIsIHBnb2ZmKTsKIAl9CiB9CisKK3Vuc2lnbmVkIGxvbmcKK2FyY2hfZ2V0X3VubWFwcGVkX2FyZWFfdG9wZG93bihzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgdW5zaWduZWQgbG9uZyBhZGRyMCwKKwkJCSAgY29uc3QgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IHVuc2lnbmVkIGxvbmcgcGdvZmYsCisJCQkgIGNvbnN0IHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBhZGRyMDsKKwlpbnQgZG9fY29sb3VyX2FsaWduOworCisJaWYgKGZsYWdzICYgTUFQX0ZJWEVEKSB7CisJCS8qIFdlIGRvIG5vdCBhY2NlcHQgYSBzaGFyZWQgbWFwcGluZyBpZiBpdCB3b3VsZCB2aW9sYXRlCisJCSAqIGNhY2hlIGFsaWFzaW5nIGNvbnN0cmFpbnRzLgorCQkgKi8KKwkJaWYgKChmbGFncyAmIE1BUF9TSEFSRUQpICYmCisJCSAgICAoKGFkZHIgLSAocGdvZmYgPDwgUEFHRV9TSElGVCkpICYgc2htX2FsaWduX21hc2spKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBhZGRyOworCX0KKworCWlmICh1bmxpa2VseShsZW4gPiBUQVNLX1NJWkUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRvX2NvbG91cl9hbGlnbiA9IDA7CisJaWYgKGZpbHAgfHwgKGZsYWdzICYgTUFQX1NIQVJFRCkpCisJCWRvX2NvbG91cl9hbGlnbiA9IDE7CisKKwkvKiByZXF1ZXN0aW5nIGEgc3BlY2lmaWMgYWRkcmVzcyAqLworCWlmIChhZGRyKSB7CisJCWlmIChkb19jb2xvdXJfYWxpZ24pCisJCQlhZGRyID0gQ09MT1VSX0FMSUdOKGFkZHIsIHBnb2ZmKTsKKwkJZWxzZQorCQkJYWRkciA9IFBBR0VfQUxJR04oYWRkcik7CisKKwkJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOworCQlpZiAoVEFTS19TSVpFIC0gbGVuID49IGFkZHIgJiYKKwkJICAgICghdm1hIHx8IGFkZHIgKyBsZW4gPD0gdm1hLT52bV9zdGFydCkpCisJCQlyZXR1cm4gYWRkcjsKKwl9CisKKwkvKiBjaGVjayBpZiBmcmVlX2FyZWFfY2FjaGUgaXMgdXNlZnVsIGZvciB1cyAqLworCWlmIChsZW4gPD0gbW0tPmNhY2hlZF9ob2xlX3NpemUpIHsKKwkgICAgICAgIG1tLT5jYWNoZWRfaG9sZV9zaXplID0gMDsKKwkJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IG1tLT5tbWFwX2Jhc2U7CisJfQorCisJLyogZWl0aGVyIG5vIGFkZHJlc3MgcmVxdWVzdGVkIG9yIGNhbid0IGZpdCBpbiByZXF1ZXN0ZWQgYWRkcmVzcyBob2xlICovCisJYWRkciA9IG1tLT5mcmVlX2FyZWFfY2FjaGU7CisJaWYgKGRvX2NvbG91cl9hbGlnbikgeworCQl1bnNpZ25lZCBsb25nIGJhc2UgPSBDT0xPVVJfQUxJR05fRE9XTihhZGRyLWxlbiwgcGdvZmYpOworCisJCWFkZHIgPSBiYXNlICsgbGVuOworCX0KKworCS8qIG1ha2Ugc3VyZSBpdCBjYW4gZml0IGluIHRoZSByZW1haW5pbmcgYWRkcmVzcyBzcGFjZSAqLworCWlmIChsaWtlbHkoYWRkciA+IGxlbikpIHsKKwkJdm1hID0gZmluZF92bWEobW0sIGFkZHItbGVuKTsKKwkJaWYgKCF2bWEgfHwgYWRkciA8PSB2bWEtPnZtX3N0YXJ0KSB7CisJCQkvKiByZW1lbWJlciB0aGUgYWRkcmVzcyBhcyBhIGhpbnQgZm9yIG5leHQgdGltZSAqLworCQkJcmV0dXJuIChtbS0+ZnJlZV9hcmVhX2NhY2hlID0gYWRkci1sZW4pOworCQl9CisJfQorCisJaWYgKHVubGlrZWx5KG1tLT5tbWFwX2Jhc2UgPCBsZW4pKQorCQlnb3RvIGJvdHRvbXVwOworCisJYWRkciA9IG1tLT5tbWFwX2Jhc2UtbGVuOworCWlmIChkb19jb2xvdXJfYWxpZ24pCisJCWFkZHIgPSBDT0xPVVJfQUxJR05fRE9XTihhZGRyLCBwZ29mZik7CisKKwlkbyB7CisJCS8qCisJCSAqIExvb2t1cCBmYWlsdXJlIG1lYW5zIG5vIHZtYSBpcyBhYm92ZSB0aGlzIGFkZHJlc3MsCisJCSAqIGVsc2UgaWYgbmV3IHJlZ2lvbiBmaXRzIGJlbG93IHZtYS0+dm1fc3RhcnQsCisJCSAqIHJldHVybiB3aXRoIHN1Y2Nlc3M6CisJCSAqLworCQl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CisJCWlmIChsaWtlbHkoIXZtYSB8fCBhZGRyK2xlbiA8PSB2bWEtPnZtX3N0YXJ0KSkgeworCQkJLyogcmVtZW1iZXIgdGhlIGFkZHJlc3MgYXMgYSBoaW50IGZvciBuZXh0IHRpbWUgKi8KKwkJCXJldHVybiAobW0tPmZyZWVfYXJlYV9jYWNoZSA9IGFkZHIpOworCQl9CisKKwkJLyogcmVtZW1iZXIgdGhlIGxhcmdlc3QgaG9sZSB3ZSBzYXcgc28gZmFyICovCisJCWlmIChhZGRyICsgbW0tPmNhY2hlZF9ob2xlX3NpemUgPCB2bWEtPnZtX3N0YXJ0KQorCQkgICAgICAgIG1tLT5jYWNoZWRfaG9sZV9zaXplID0gdm1hLT52bV9zdGFydCAtIGFkZHI7CisKKwkJLyogdHJ5IGp1c3QgYmVsb3cgdGhlIGN1cnJlbnQgdm1hLT52bV9zdGFydCAqLworCQlhZGRyID0gdm1hLT52bV9zdGFydC1sZW47CisJCWlmIChkb19jb2xvdXJfYWxpZ24pCisJCQlhZGRyID0gQ09MT1VSX0FMSUdOX0RPV04oYWRkciwgcGdvZmYpOworCX0gd2hpbGUgKGxpa2VseShsZW4gPCB2bWEtPnZtX3N0YXJ0KSk7CisKK2JvdHRvbXVwOgorCS8qCisJICogQSBmYWlsZWQgbW1hcCgpIHZlcnkgbGlrZWx5IGNhdXNlcyBhcHBsaWNhdGlvbiBmYWlsdXJlLAorCSAqIHNvIGZhbGwgYmFjayB0byB0aGUgYm90dG9tLXVwIGZ1bmN0aW9uIGhlcmUuIFRoaXMgc2NlbmFyaW8KKwkgKiBjYW4gaGFwcGVuIHdpdGggbGFyZ2Ugc3RhY2sgbGltaXRzIGFuZCBsYXJnZSBtbWFwKCkKKwkgKiBhbGxvY2F0aW9ucy4KKwkgKi8KKwltbS0+Y2FjaGVkX2hvbGVfc2l6ZSA9IH4wVUw7CisJbW0tPmZyZWVfYXJlYV9jYWNoZSA9IFRBU0tfVU5NQVBQRURfQkFTRTsKKwlhZGRyID0gYXJjaF9nZXRfdW5tYXBwZWRfYXJlYShmaWxwLCBhZGRyMCwgbGVuLCBwZ29mZiwgZmxhZ3MpOworCS8qCisJICogUmVzdG9yZSB0aGUgdG9wZG93biBiYXNlOgorCSAqLworCW1tLT5mcmVlX2FyZWFfY2FjaGUgPSBtbS0+bW1hcF9iYXNlOworCW1tLT5jYWNoZWRfaG9sZV9zaXplID0gfjBVTDsKKworCXJldHVybiBhZGRyOworfQogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvb3Byb2ZpbGUvY29tbW9uLmMgYi9hcmNoL3NoL29wcm9maWxlL2NvbW1vbi5jCmluZGV4IDFiOWQ0MzAuLjQ0ZjRlMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9zaC9vcHJvZmlsZS9jb21tb24uYwpAQCAtMTA5LDYgKzEwOSw3IEBACiAJY2FzZSBDUFVfU0g3Nzg1OgogCWNhc2UgQ1BVX1NINzc4NjoKIAljYXNlIENQVV9TSDc3MjM6CisJY2FzZSBDUFVfU0g3NzI0OgogCWNhc2UgQ1BVX1NIWDM6CiAJCWxtb2RlbCA9ICZvcF9tb2RlbF9zaDRhX29wczsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMgYi9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKaW5kZXggODQ3N2I1ZC4uZmVjM2E1MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCisrKyBiL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcwpAQCAtMjMsNiArMjMsNyBAQAogNzYxOVNFCQkJU0hfNzYxOV9TT0xVVElPTl9FTkdJTkUKIDc3MjFTRQkJCVNIXzc3MjFfU09MVVRJT05fRU5HSU5FCiA3NzIyU0UJCQlTSF83NzIyX1NPTFVUSU9OX0VOR0lORQorNzcyNFNFCQkJU0hfNzcyNF9TT0xVVElPTl9FTkdJTkUKIDc3NTFTRQkJCVNIXzc3NTFfU09MVVRJT05fRU5HSU5FCiA3NzgwU0UJCQlTSF83NzgwX1NPTFVUSU9OX0VOR0lORQogNzc1MVNZU1RFTUgJCVNIXzc3NTFfU1lTVEVNSApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb182NC5oCmluZGV4IDYzOWFjODAuLjY1ODY1NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvXzY0LmgKQEAgLTEwMiw4ICsxMDIsOCBAQAogI2RlZmluZSBUSV9LRVJOX0NOVEQxCTB4MDAwMDA0ODgKICNkZWZpbmUgVElfUENSCQkweDAwMDAwNDkwCiAjZGVmaW5lIFRJX1JFU1RBUlRfQkxPQ0sgMHgwMDAwMDQ5OAotI2RlZmluZSBUSV9LVU5BX1JFR1MJMHgwMDAwMDRjMAotI2RlZmluZSBUSV9LVU5BX0lOU04JMHgwMDAwMDRjOAorI2RlZmluZSBUSV9LVU5BX1JFR1MJMHgwMDAwMDRjOAorI2RlZmluZSBUSV9LVU5BX0lOU04JMHgwMDAwMDRkMAogI2RlZmluZSBUSV9GUFJFR1MJMHgwMDAwMDUwMAogCiAvKiBXZSBlbWJlZCB0aGlzIGluIHRoZSB1cHBlcm1vc3QgYnl0ZSBvZiB0aHJlYWRfaW5mby0+ZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lycV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMKaW5kZXggNWRlYWJlOS4uZTVlNzhmOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMKQEAgLTMxOCwxMCArMzE4LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzdW40dV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IHZpcnRfaXJxLAorc3RhdGljIGludCBzdW40dV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IHZpcnRfaXJxLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXN1bjR1X2lycV9lbmFibGUodmlydF9pcnEpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIERvbid0IGRvIGFueXRoaW5nLiAgVGhlIGRlc2MtPnN0YXR1cyBjaGVjayBmb3IgSVJRX0RJU0FCTEVEIGluCkBAIC0zNzcsNyArMzc5LDcgQEAKIAkJICAgICAgIGlubywgZXJyKTsKIH0KIAotc3RhdGljIHZvaWQgc3VuNHZfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwKK3N0YXRpYyBpbnQgc3VuNHZfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAl1bnNpZ25lZCBpbnQgaW5vID0gdmlydF9pcnFfdGFibGVbdmlydF9pcnFdLmRldl9pbm87CkBAIC0zODgsNiArMzkwLDggQEAKIAlpZiAoZXJyICE9IEhWX0VPSykKIAkJcHJpbnRrKEtFUk5fRVJSICJzdW40dl9pbnRyX3NldHRhcmdldCgleCwlbHUpOiAiCiAJCSAgICAgICAiZXJyKCVkKVxuIiwgaW5vLCBjcHVpZCwgZXJyKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzdW40dl9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCkBAIC00NDUsNyArNDQ5LDcgQEAKIAkJICAgICAgIGRldl9oYW5kbGUsIGRldl9pbm8sIGVycik7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bjR2X3ZpcnRfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwKK3N0YXRpYyBpbnQgc3VuNHZfdmlydF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IHZpcnRfaXJxLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGNwdWlkLCBkZXZfaGFuZGxlLCBkZXZfaW5vOwpAQCAtNDYxLDYgKzQ2NSw4IEBACiAJCXByaW50ayhLRVJOX0VSUiAic3VuNHZfdmludHJfc2V0X3RhcmdldCglbHgsJWx4LCVsdSk6ICIKIAkJICAgICAgICJlcnIoJWQpXG4iLAogCQkgICAgICAgZGV2X2hhbmRsZSwgZGV2X2lubywgY3B1aWQsIGVycik7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc3VuNHZfdmlycV9kaXNhYmxlKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3ViZF9rZXJuLmMKaW5kZXggZjkzNDIyNS4uYWE5ZTkyNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy91YmRfa2Vybi5jCkBAIC00NTEsMjMgKzQ1MSw2IEBACiAKIC8qIE9ubHkgY2hhbmdlZCBieSB1YmRfaW5pdCwgd2hpY2ggaXMgYW4gaW5pdGNhbGwuICovCiBzdGF0aWMgaW50IHRocmVhZF9mZCA9IC0xOwotCi1zdGF0aWMgdm9pZCB1YmRfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGJ5dGVzLCBpbnQgZXJyb3IpCi17Ci0JYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyb3IsIGJ5dGVzKTsKLX0KLQotLyogQ2FsbGFibGUgb25seSBmcm9tIGludGVycnVwdCBjb250ZXh0IC0gb3RoZXJ3aXNlIHlvdSBuZWVkIHRvIGRvCi0gKiBzcGluX2xvY2tfaXJxKCkvc3Bpbl9sb2NrX2lycXNhdmUoKSAqLwotc3RhdGljIGlubGluZSB2b2lkIHViZF9maW5pc2goc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGJ5dGVzKQotewotCWlmKGJ5dGVzIDwgMCl7Ci0JCXViZF9lbmRfcmVxdWVzdChyZXEsIDAsIC1FSU8pOwotCQlyZXR1cm47Ci0JfQotCXViZF9lbmRfcmVxdWVzdChyZXEsIGJ5dGVzLCAwKTsKLX0KLQogc3RhdGljIExJU1RfSEVBRChyZXN0YXJ0KTsKIAogLyogWFhYIC0gbW92ZSB0aGlzIGluc2lkZSB1YmRfaW50ci4gKi8KQEAgLTQ3NSw3ICs0NTgsNiBAQAogc3RhdGljIHZvaWQgdWJkX2hhbmRsZXIodm9pZCkKIHsKIAlzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqcmVxOwotCXN0cnVjdCByZXF1ZXN0ICpycTsKIAlzdHJ1Y3QgdWJkICp1YmQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgKm5leHRfZWxlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00OTIsMTAgKzQ3NCw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQlycSA9IHJlcS0+cmVxOwotCQlycS0+bnJfc2VjdG9ycyAtPSByZXEtPmxlbmd0aCA+PiA5OwotCQlpZihycS0+bnJfc2VjdG9ycyA9PSAwKQotCQkJdWJkX2ZpbmlzaChycSwgcnEtPmhhcmRfbnJfc2VjdG9ycyA8PCA5KTsKKwkJYmxrX2VuZF9yZXF1ZXN0KHJlcS0+cmVxLCAwLCByZXEtPmxlbmd0aCk7CiAJCWtmcmVlKHJlcSk7CiAJfQogCXJlYWN0aXZhdGVfZmQodGhyZWFkX2ZkLCBVQkRfSVJRKTsKQEAgLTEyNDMsMjcgKzEyMjIsMjYgQEAKIHsKIAlzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqaW9fcmVxOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0JaW50IG4sIGxhc3Rfc2VjdG9yczsKKwlzZWN0b3JfdCBzZWN0b3I7CisJaW50IG47CiAKIAl3aGlsZSgxKXsKIAkJc3RydWN0IHViZCAqZGV2ID0gcS0+cXVldWVkYXRhOwogCQlpZihkZXYtPmVuZF9zZyA9PSAwKXsKLQkJCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCQkJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOwogCQkJaWYocmVxID09IE5VTEwpCiAJCQkJcmV0dXJuOwogCiAJCQlkZXYtPnJlcXVlc3QgPSByZXE7Ci0JCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CiAJCQlkZXYtPnN0YXJ0X3NnID0gMDsKIAkJCWRldi0+ZW5kX3NnID0gYmxrX3JxX21hcF9zZyhxLCByZXEsIGRldi0+c2cpOwogCQl9CiAKIAkJcmVxID0gZGV2LT5yZXF1ZXN0OwotCQlsYXN0X3NlY3RvcnMgPSAwOworCQlzZWN0b3IgPSBibGtfcnFfcG9zKHJlcSk7CiAJCXdoaWxlKGRldi0+c3RhcnRfc2cgPCBkZXYtPmVuZF9zZyl7CiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gJmRldi0+c2dbZGV2LT5zdGFydF9zZ107CiAKLQkJCXJlcS0+c2VjdG9yICs9IGxhc3Rfc2VjdG9yczsKIAkJCWlvX3JlcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb190aHJlYWRfcmVxKSwKIAkJCQkJIEdGUF9BVE9NSUMpOwogCQkJaWYoaW9fcmVxID09IE5VTEwpewpAQCAtMTI3MiwxMCArMTI1MCwxMCBAQAogCQkJCXJldHVybjsKIAkJCX0KIAkJCXByZXBhcmVfcmVxdWVzdChyZXEsIGlvX3JlcSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcmVxLT5zZWN0b3IgPDwgOSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzZWN0b3IgPDwgOSwKIAkJCQkJc2ctPm9mZnNldCwgc2ctPmxlbmd0aCwgc2dfcGFnZShzZykpOwogCi0JCQlsYXN0X3NlY3RvcnMgPSBzZy0+bGVuZ3RoID4+IDk7CisJCQlzZWN0b3IgKz0gc2ctPmxlbmd0aCA+PiA5OwogCQkJbiA9IG9zX3dyaXRlX2ZpbGUodGhyZWFkX2ZkLCAmaW9fcmVxLAogCQkJCQkgIHNpemVvZihzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqKSk7CiAJCQlpZihuICE9IHNpemVvZihzdHJ1Y3QgaW9fdGhyZWFkX3JlcSAqKSl7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9LYnVpbGQgYi9hcmNoL3g4Ni9LYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4ZWMzNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L0tidWlsZApAQCAtMCwwICsxLDE2IEBACisKK29iai0kKENPTkZJR19LVk0pICs9IGt2bS8KKworIyBYZW4gcGFyYXZpcnR1YWxpemF0aW9uIHN1cHBvcnQKK29iai0kKENPTkZJR19YRU4pICs9IHhlbi8KKworIyBsZ3Vlc3QgcGFyYXZpcnR1YWxpemF0aW9uIHN1cHBvcnQKK29iai0kKENPTkZJR19MR1VFU1RfR1VFU1QpICs9IGxndWVzdC8KKworb2JqLXkgKz0ga2VybmVsLworb2JqLXkgKz0gbW0vCisKK29iai15ICs9IGNyeXB0by8KK29iai15ICs9IHZkc28vCitvYmotJChDT05GSUdfSUEzMl9FTVVMQVRJT04pICs9IGlhMzIvCisKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IGE2ZWZlMGEuLjY4ZjU1NzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtNDcsNiArNDcsMTEgQEAKIAlzZWxlY3QgSEFWRV9LRVJORUxfQlpJUDIKIAlzZWxlY3QgSEFWRV9LRVJORUxfTFpNQQogCitjb25maWcgT1VUUFVUX0ZPUk1BVAorCXN0cmluZworCWRlZmF1bHQgImVsZjMyLWkzODYiIGlmIFg4Nl8zMgorCWRlZmF1bHQgImVsZjY0LXg4Ni02NCIgaWYgWDg2XzY0CisKIGNvbmZpZyBBUkNIX0RFRkNPTkZJRwogCXN0cmluZwogCWRlZmF1bHQgImFyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWciIGlmIFg4Nl8zMgpAQCAtMjc0LDE1ICsyNzksOSBAQAogCiAJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgogCi1jb25maWcgTlVNQV9NSUdSQVRFX0lSUV9ERVNDCi0JYm9vbCAiTW92ZSBpcnEgZGVzYyB3aGVuIGNoYW5naW5nIGlycSBzbXBfYWZmaW5pdHkiCitjb25maWcgTlVNQV9JUlFfREVTQworCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFNQQVJTRV9JUlEgJiYgTlVNQQotCWRlcGVuZHMgb24gQlJPS0VOCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgVGhpcyBlbmFibGVzIG1vdmluZyBpcnFfZGVzYyB0byBjcHUvbm9kZSB0aGF0IGlycSB3aWxsIHVzZSBoYW5kbGVkLgotCi0JICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgogCiBjb25maWcgWDg2X01QUEFSU0UKIAlib29sICJFbmFibGUgTVBTIHRhYmxlIiBpZiBBQ1BJCkBAIC0zNTUsNyArMzU0LDcgQEAKIAlkZXBlbmRzIG9uIFg4Nl82NAogCWRlcGVuZHMgb24gWDg2X0VYVEVOREVEX1BMQVRGT1JNCiAJZGVwZW5kcyBvbiBOVU1BCi0Jc2VsZWN0IFg4Nl9YMkFQSUMKKwlkZXBlbmRzIG9uIFg4Nl9YMkFQSUMKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCBTR0kgVWx0cmF2aW9sZXQgc3lzdGVtcy4KIAkgIElmIHlvdSBkb24ndCBoYXZlIG9uZSBvZiB0aGVzZSwgeW91IHNob3VsZCBzYXkgTiBoZXJlLgpAQCAtNzQwLDYgKzczOSw3IEBACiBjb25maWcgWDg2X0xPQ0FMX0FQSUMKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBYODZfNjQgfHwgU01QIHx8IFg4Nl8zMl9OT05fU1RBTkRBUkQgfHwgWDg2X1VQX0FQSUMKKwlzZWxlY3QgSEFWRV9QRVJGX0NPVU5URVJTIGlmICghTTM4NiAmJiAhTTQ4NikKIAogY29uZmlnIFg4Nl9JT19BUElDCiAJZGVmX2Jvb2wgeQpAQCAtMTQ2Niw5ICsxNDY2LDcgQEAKIAogY29uZmlnIFBIWVNJQ0FMX1NUQVJUCiAJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkIiBpZiAoRU1CRURERUQgfHwgQ1JBU0hfRFVNUCkKLQlkZWZhdWx0ICIweDEwMDAwMDAiIGlmIFg4Nl9OVU1BUQotCWRlZmF1bHQgIjB4MjAwMDAwIiBpZiBYODZfNjQKLQlkZWZhdWx0ICIweDEwMDAwMCIKKwlkZWZhdWx0ICIweDEwMDAwMDAiCiAJLS0taGVscC0tLQogCSAgVGhpcyBnaXZlcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzIGxvYWRlZC4KIApAQCAtMTQ4NywxNSArMTQ4NSwxNSBAQAogCSAgdG8gYmUgc3BlY2lmaWNhbGx5IGNvbXBpbGVkIHRvIHJ1biBmcm9tIGEgc3BlY2lmaWMgbWVtb3J5IGFyZWEKIAkgIChub3JtYWxseSBhIHJlc2VydmVkIHJlZ2lvbikgYW5kIHRoaXMgb3B0aW9uIGNvbWVzIGhhbmR5LgogCi0JICBTbyBpZiB5b3UgYXJlIHVzaW5nIGJ6SW1hZ2UgZm9yIGNhcHR1cmluZyB0aGUgY3Jhc2ggZHVtcCwgbGVhdmUKLQkgIHRoZSB2YWx1ZSBoZXJlIHVuY2hhbmdlZCB0byAweDEwMDAwMCBhbmQgc2V0IENPTkZJR19SRUxPQ0FUQUJMRT15LgotCSAgT3RoZXJ3aXNlIGlmIHlvdSBwbGFuIHRvIHVzZSB2bWxpbnV4IGZvciBjYXB0dXJpbmcgdGhlIGNyYXNoIGR1bXAKLQkgIGNoYW5nZSB0aGlzIHZhbHVlIHRvIHN0YXJ0IG9mIHRoZSByZXNlcnZlZCByZWdpb24gKFR5cGljYWxseSAxNk1CCi0JICAweDEwMDAwMDApLiBJbiBvdGhlciB3b3JkcywgaXQgY2FuIGJlIHNldCBiYXNlZCBvbiB0aGUgIlgiIHZhbHVlIGFzCi0JICBzcGVjaWZpZWQgaW4gdGhlICJjcmFzaGtlcm5lbD1ZTUBYTSIgY29tbWFuZCBsaW5lIGJvb3QgcGFyYW1ldGVyCi0JICBwYXNzZWQgdG8gdGhlIHBhbmljLWVkIGtlcm5lbC4gVHlwaWNhbGx5IHRoaXMgcGFyYW1ldGVyIGlzIHNldCBhcwotCSAgY3Jhc2hrZXJuZWw9NjRNQDE2TS4gUGxlYXNlIHRha2UgYSBsb29rIGF0Ci0JICBEb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dCBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGNyYXNoIGR1bXBzLgorCSAgU28gaWYgeW91IGFyZSB1c2luZyBiekltYWdlIGZvciBjYXB0dXJpbmcgdGhlIGNyYXNoIGR1bXAsCisJICBsZWF2ZSB0aGUgdmFsdWUgaGVyZSB1bmNoYW5nZWQgdG8gMHgxMDAwMDAwIGFuZCBzZXQKKwkgIENPTkZJR19SRUxPQ0FUQUJMRT15LiAgT3RoZXJ3aXNlIGlmIHlvdSBwbGFuIHRvIHVzZSB2bWxpbnV4CisJICBmb3IgY2FwdHVyaW5nIHRoZSBjcmFzaCBkdW1wIGNoYW5nZSB0aGlzIHZhbHVlIHRvIHN0YXJ0IG9mCisJICB0aGUgcmVzZXJ2ZWQgcmVnaW9uLiAgSW4gb3RoZXIgd29yZHMsIGl0IGNhbiBiZSBzZXQgYmFzZWQgb24KKwkgIHRoZSAiWCIgdmFsdWUgYXMgc3BlY2lmaWVkIGluIHRoZSAiY3Jhc2hrZXJuZWw9WU1AWE0iCisJICBjb21tYW5kIGxpbmUgYm9vdCBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBwYW5pYy1lZAorCSAga2VybmVsLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKKwkgIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgY3Jhc2ggZHVtcHMuCiAKIAkgIFVzYWdlIG9mIGJ6SW1hZ2UgZm9yIGNhcHR1cmluZyB0aGUgY3Jhc2ggZHVtcCBpcyByZWNvbW1lbmRlZCBhcwogCSAgb25lIGRvZXMgbm90IGhhdmUgdG8gYnVpbGQgdHdvIGtlcm5lbHMuIFNhbWUga2VybmVsIGNhbiBiZSB1c2VkCkBAIC0xNTA4LDggKzE1MDYsOCBAQAogCSAgRG9uJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KIAogY29uZmlnIFJFTE9DQVRBQkxFCi0JYm9vbCAiQnVpbGQgYSByZWxvY2F0YWJsZSBrZXJuZWwgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwlib29sICJCdWlsZCBhIHJlbG9jYXRhYmxlIGtlcm5lbCIKKwlkZWZhdWx0IHkKIAktLS1oZWxwLS0tCiAJICBUaGlzIGJ1aWxkcyBhIGtlcm5lbCBpbWFnZSB0aGF0IHJldGFpbnMgcmVsb2NhdGlvbiBpbmZvcm1hdGlvbgogCSAgc28gaXQgY2FuIGJlIGxvYWRlZCBzb21lcGxhY2UgYmVzaWRlcyB0aGUgZGVmYXVsdCAxTUIuCkBAIC0xNTI0LDEyICsxNTIyLDE2IEBACiAJICBpdCBoYXMgYmVlbiBsb2FkZWQgYXQgYW5kIHRoZSBjb21waWxlIHRpbWUgcGh5c2ljYWwgYWRkcmVzcwogCSAgKENPTkZJR19QSFlTSUNBTF9TVEFSVCkgaXMgaWdub3JlZC4KIAorIyBSZWxvY2F0aW9uIG9uIHg4Ni0zMiBuZWVkcyBzb21lIGFkZGl0aW9uYWwgYnVpbGQgc3VwcG9ydAorY29uZmlnIFg4Nl9ORUVEX1JFTE9DUworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBSRUxPQ0FUQUJMRQorCiBjb25maWcgUEhZU0lDQUxfQUxJR04KIAloZXgKIAlwcm9tcHQgIkFsaWdubWVudCB2YWx1ZSB0byB3aGljaCBrZXJuZWwgc2hvdWxkIGJlIGFsaWduZWQiIGlmIFg4Nl8zMgotCWRlZmF1bHQgIjB4MTAwMDAwIiBpZiBYODZfMzIKLQlkZWZhdWx0ICIweDIwMDAwMCIgaWYgWDg2XzY0Ci0JcmFuZ2UgMHgyMDAwIDB4NDAwMDAwCisJZGVmYXVsdCAiMHgxMDAwMDAwIgorCXJhbmdlIDB4MjAwMCAweDEwMDAwMDAKIAktLS1oZWxwLS0tCiAJICBUaGlzIHZhbHVlIHB1dHMgdGhlIGFsaWdubWVudCByZXN0cmljdGlvbnMgb24gcGh5c2ljYWwgYWRkcmVzcwogCSAgd2hlcmUga2VybmVsIGlzIGxvYWRlZCBhbmQgcnVuIGZyb20uIEtlcm5lbCBpcyBjb21waWxlZCBmb3IgYW4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcuZGVidWcgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnCmluZGV4IGQ4MzU5ZTcuLmQxMDVmMjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcuZGVidWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZwpAQCAtMTU5LDE0ICsxNTksMzAgQEAKIAkgIG9wdGlvbnMuIFNlZSBEb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0IGZvciBtb3JlCiAJICBkZXRhaWxzLgogCitjb25maWcgSU9NTVVfU1RSRVNTCisJYm9vbCAiRW5hYmxlIElPTU1VIHN0cmVzcy10ZXN0IG1vZGUiCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZGlzYWJsZXMgdmFyaW91cyBvcHRpbWl6YXRpb25zIGluIElPTU1VIHJlbGF0ZWQKKwkgIGNvZGUgdG8gZG8gcmVhbCBzdHJlc3MgdGVzdGluZyBvZiB0aGUgSU9NTVUgY29kZS4gVGhpcyBvcHRpb24KKwkgIHdpbGwgY2F1c2UgYSBwZXJmb3JtYW5jZSBkcm9wIGFuZCBzaG91bGQgb25seSBiZSBlbmFibGVkIGZvcgorCSAgdGVzdGluZy4KKwogY29uZmlnIElPTU1VX0xFQUsKIAlib29sICJJT01NVSBsZWFrIHRyYWNpbmciCi0JZGVwZW5kcyBvbiBERUJVR19LRVJORUwKLQlkZXBlbmRzIG9uIElPTU1VX0RFQlVHCisJZGVwZW5kcyBvbiBJT01NVV9ERUJVRyAmJiBETUFfQVBJX0RFQlVHCiAJLS0taGVscC0tLQogCSAgQWRkIGEgc2ltcGxlIGxlYWsgdHJhY2VyIHRvIHRoZSBJT01NVSBjb2RlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdQogCSAgYXJlIGRlYnVnZ2luZyBhIGJ1Z2d5IGRldmljZSBkcml2ZXIgdGhhdCBsZWFrcyBJT01NVSBtYXBwaW5ncy4KIAorY29uZmlnIFg4Nl9EU19TRUxGVEVTVAorICAgIGJvb2wgIkRTIHNlbGZ0ZXN0IgorICAgIGRlZmF1bHQgeQorICAgIGRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisgICAgZGVwZW5kcyBvbiBYODZfRFMKKwktLS1oZWxwLS0tCisJICBQZXJmb3JtIERlYnVnIFN0b3JlIHNlbGZ0ZXN0cyBhdCBib290IHRpbWUuCisJICBJZiBpbiBkb3VidCwgc2F5ICJOIi4KKwogY29uZmlnIEhBVkVfTU1JT1RSQUNFX1NVUFBPUlQKIAlkZWZfYm9vbCB5CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L01ha2VmaWxlIGIvYXJjaC94ODYvTWFrZWZpbGUKaW5kZXggOGM4NmI3Mi4uZWRiZDBjYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvTWFrZWZpbGUKQEAgLTcsOCArNyw2IEBACiAgICAgICAgIEtCVUlMRF9ERUZDT05GSUcgOj0gJChBUkNIKV9kZWZjb25maWcKIGVuZGlmCiAKLWNvcmUtJChDT05GSUdfS1ZNKSArPSBhcmNoL3g4Ni9rdm0vCi0KICMgQklUUyBpcyB1c2VkIGFzIGV4dGVuc2lvbiBmb3IgZmlsZXMgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiBhIDMyIGJpdAogIyBhbmQgYSA2NCBiaXQgdmVyc2lvbiB0byBzaW1wbGlmeSBzaGFyZWQgTWFrZWZpbGVzLgogIyBlLmcuOiBvYmoteSArPSBmb29fJChCSVRTKS5vCkBAIC0xMTgsMjEgKzExNiw4IEBACiAKIGxpYnMteSAgKz0gYXJjaC94ODYvbGliLwogCi0jIFN1YiBhcmNoaXRlY3R1cmUgZmlsZXMgdGhhdCBuZWVkcyBsaW5raW5nIGZpcnN0Ci1jb3JlLXkgKz0gJChmY29yZS15KQotCi0jIFhlbiBwYXJhdmlydHVhbGl6YXRpb24gc3VwcG9ydAotY29yZS0kKENPTkZJR19YRU4pICs9IGFyY2gveDg2L3hlbi8KLQotIyBsZ3Vlc3QgcGFyYXZpcnR1YWxpemF0aW9uIHN1cHBvcnQKLWNvcmUtJChDT05GSUdfTEdVRVNUX0dVRVNUKSArPSBhcmNoL3g4Ni9sZ3Vlc3QvCi0KLWNvcmUteSArPSBhcmNoL3g4Ni9rZXJuZWwvCi1jb3JlLXkgKz0gYXJjaC94ODYvbW0vCi0KLWNvcmUteSArPSBhcmNoL3g4Ni9jcnlwdG8vCi1jb3JlLXkgKz0gYXJjaC94ODYvdmRzby8KLWNvcmUtJChDT05GSUdfSUEzMl9FTVVMQVRJT04pICs9IGFyY2gveDg2L2lhMzIvCisjIFNlZSBhcmNoL3g4Ni9LYnVpbGQgZm9yIGNvbnRlbnQgb2YgY29yZSBwYXJ0IG9mIHRoZSBrZXJuZWwKK2NvcmUteSArPSBhcmNoL3g4Ni8KIAogIyBkcml2ZXJzLXkgYXJlIGxpbmtlZCBhZnRlciBjb3JlLXkKIGRyaXZlcnMtJChDT05GSUdfTUFUSF9FTVVMQVRJT04pICs9IGFyY2gveDg2L21hdGgtZW11LwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC8uZ2l0aWdub3JlIGIvYXJjaC94ODYvYm9vdC8uZ2l0aWdub3JlCmluZGV4IDE3MmNmOGEuLjg1MWZlOTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvLmdpdGlnbm9yZQorKysgYi9hcmNoL3g4Ni9ib290Ly5naXRpZ25vcmUKQEAgLTMsNiArMyw4IEBACiBjcHVzdHIuaAogbWtjcHVzdHIKIG9mZnNldHMuaAordm9mZnNldC5oCit6b2Zmc2V0LmgKIHNldHVwCiBzZXR1cC5iaW4KIHNldHVwLmVsZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKaW5kZXggNjYzM2I2ZS4uOGQxNmFkYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9ib290L01ha2VmaWxlCkBAIC0yNiw5ICsyNiwxMCBAQAogdGFyZ2V0cwkJKz0gZmRpbWFnZSBmZGltYWdlMTQ0IGZkaW1hZ2UyODggaW1hZ2UuaXNvIG10b29scy5jb25mCiBzdWJkaXItCQk6PSBjb21wcmVzc2VkCiAKLXNldHVwLXkJCSs9IGEyMC5vIGNtZGxpbmUubyBjb3B5Lm8gY3B1Lm8gY3B1Y2hlY2subyBlZGQubworc2V0dXAteQkJKz0gYTIwLm8gYmlvc2NhbGwubyBjbWRsaW5lLm8gY29weS5vIGNwdS5vIGNwdWNoZWNrLm8gZWRkLm8KIHNldHVwLXkJCSs9IGhlYWRlci5vIG1haW4ubyBtY2EubyBtZW1vcnkubyBwbS5vIHBtanVtcC5vCi1zZXR1cC15CQkrPSBwcmludGYubyBzdHJpbmcubyB0dHkubyB2aWRlby5vIHZpZGVvLW1vZGUubyB2ZXJzaW9uLm8KK3NldHVwLXkJCSs9IHByaW50Zi5vIHJlZ3MubyBzdHJpbmcubyB0dHkubyB2aWRlby5vIHZpZGVvLW1vZGUubworc2V0dXAteQkJKz0gdmVyc2lvbi5vCiBzZXR1cC0kKENPTkZJR19YODZfQVBNX0JPT1QpICs9IGFwbS5vCiAKICMgVGhlIGxpbmsgb3JkZXIgb2YgdGhlIHZpZGVvLSoubyBtb2R1bGVzIGNhbiBtYXR0ZXIuICBJbiBwYXJ0aWN1bGFyLApAQCAtODYsMTkgKzg3LDI3IEBACiAKIFNFVFVQX09CSlMgPSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc2V0dXAteSkpCiAKLXNlZC1vZmZzZXRzIDo9IC1lICdzL14wMCovMC8nIFwKLSAgICAgICAgLWUgJ3MvXlwoWzAtOWEtZkEtRl0qXCkgLiBcKGlucHV0X2RhdGFcfGlucHV0X2RhdGFfZW5kXCkkJC9cI2RlZmluZSBcMiAweFwxL3AnCitzZWQtdm9mZnNldCA6PSAtZSAncy9eXChbMC05YS1mQS1GXSpcKSAuIFwoX3RleHRcfF9lbmRcKSQkL1wjZGVmaW5lIFZPX1wyIDB4XDEvcCcKIAotcXVpZXRfY21kX29mZnNldHMgPSBPRkZTRVRTICRACi0gICAgICBjbWRfb2Zmc2V0cyA9ICQoTk0pICQ8IHwgc2VkIC1uICQoc2VkLW9mZnNldHMpID4gJEAKK3F1aWV0X2NtZF92b2Zmc2V0ID0gVk9GRlNFVCAkQAorICAgICAgY21kX3ZvZmZzZXQgPSAkKE5NKSAkPCB8IHNlZCAtbiAkKHNlZC12b2Zmc2V0KSA+ICRACiAKLSQob2JqKS9vZmZzZXRzLmg6ICQob2JqKS9jb21wcmVzc2VkL3ZtbGludXggRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxvZmZzZXRzKQordGFyZ2V0cyArPSB2b2Zmc2V0LmgKKyQob2JqKS92b2Zmc2V0Lmg6IHZtbGludXggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx2b2Zmc2V0KQogCi10YXJnZXRzICs9IG9mZnNldHMuaAorc2VkLXpvZmZzZXQgOj0gLWUgJ3MvXlwoWzAtOWEtZkEtRl0qXCkgLiBcKHN0YXJ0dXBfMzJcfGlucHV0X2RhdGFcfF9lbmRcfHpfLipcKSQkL1wjZGVmaW5lIFpPX1wyIDB4XDEvcCcKKworcXVpZXRfY21kX3pvZmZzZXQgPSBaT0ZGU0VUICRACisgICAgICBjbWRfem9mZnNldCA9ICQoTk0pICQ8IHwgc2VkIC1uICQoc2VkLXpvZmZzZXQpID4gJEAKKwordGFyZ2V0cyArPSB6b2Zmc2V0LmgKKyQob2JqKS96b2Zmc2V0Lmg6ICQob2JqKS9jb21wcmVzc2VkL3ZtbGludXggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx6b2Zmc2V0KQorCiAKIEFGTEFHU19oZWFkZXIubyArPSAtSSQob2JqKQotJChvYmopL2hlYWRlci5vOiAkKG9iaikvb2Zmc2V0cy5oCiskKG9iaikvaGVhZGVyLm86ICQob2JqKS92b2Zmc2V0LmggJChvYmopL3pvZmZzZXQuaAogCiBMREZMQUdTX3NldHVwLmVsZgk6PSAtVAogJChvYmopL3NldHVwLmVsZjogJChzcmMpL3NldHVwLmxkICQoU0VUVVBfT0JKUykgRk9SQ0UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvYTIwLmMgYi9hcmNoL3g4Ni9ib290L2EyMC5jCmluZGV4IDdjMTljZTguLjY0YTMxYTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvYTIwLmMKKysrIGIvYXJjaC94ODYvYm9vdC9hMjAuYwpAQCAtMiw3ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNy0yMDA4IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAotICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbgorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCiAgKgogICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKICAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCkBAIC05MCw4ICs5MCwxMSBAQAogCiBzdGF0aWMgdm9pZCBlbmFibGVfYTIwX2Jpb3Modm9pZCkKIHsKLQlhc20gdm9sYXRpbGUoInB1c2hmbDsgaW50ICQweDE1OyBwb3BmbCIKLQkJICAgICA6IDogImEiICgodTE2KTB4MjQwMSkpOworCXN0cnVjdCBiaW9zcmVncyBpcmVnOworCisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweDI0MDE7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9hMjBfa2JjKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2FwbS5jIGIvYXJjaC94ODYvYm9vdC9hcG0uYwppbmRleCA3YWE2MDMzLi5lZTI3NDgzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2FwbS5jCisrKyBiL2FyY2gveDg2L2Jvb3QvYXBtLmMKQEAgLTIsNiArMiw3IEBACiAgKgogICogICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKICAqICAgQ29weXJpZ2h0IDIwMDcgclBhdGgsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KICAqCiAgKiAgIE9yaWdpbmFsIEFQTSBCSU9TIGNoZWNraW5nIGJ5IFN0ZXBoZW4gUm90aHdlbGwsIE1heSAxOTk0CiAgKiAgIChzZnJAY2FuYi5hdXVnLm9yZy5hdSkKQEAgLTE5LDc1ICsyMCw1NiBAQAogCiBpbnQgcXVlcnlfYXBtX2Jpb3Modm9pZCkKIHsKLQl1MTYgYXgsIGJ4LCBjeCwgZHgsIGRpOwotCXUzMiBlYngsIGVzaTsKLQl1OCBlcnI7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAKIAkvKiBBUE0gQklPUyBpbnN0YWxsYXRpb24gY2hlY2sgKi8KLQlheCA9IDB4NTMwMDsKLQlieCA9IGN4ID0gMDsKLQlhc20gdm9sYXRpbGUoInB1c2hsICUlZWJwIDsgaW50ICQweDE1IDsgcG9wbCAlJWVicCA7IHNldGMgJTAiCi0JCSAgICAgOiAiPWQiIChlcnIpLCAiK2EiIChheCksICIrYiIgKGJ4KSwgIitjIiAoY3gpCi0JCSAgICAgOiA6ICJlc2kiLCAiZWRpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYWggPSAweDUzOworCWludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKIAotCWlmIChlcnIpCisJaWYgKG9yZWcuZmxhZ3MgJiBYODZfRUZMQUdTX0NGKQogCQlyZXR1cm4gLTE7CQkvKiBObyBBUE0gQklPUyAqLwogCi0JaWYgKGJ4ICE9IDB4NTA0ZCkJLyogIlBNIiBzaWduYXR1cmUgKi8KKwlpZiAob3JlZy5ieCAhPSAweDUwNGQpCQkvKiAiUE0iIHNpZ25hdHVyZSAqLwogCQlyZXR1cm4gLTE7CiAKLQlpZiAoIShjeCAmIDB4MDIpKQkJLyogMzIgYml0cyBzdXBwb3J0ZWQ/ICovCisJaWYgKCEob3JlZy5jeCAmIDB4MDIpKQkJLyogMzIgYml0cyBzdXBwb3J0ZWQ/ICovCiAJCXJldHVybiAtMTsKIAogCS8qIERpc2Nvbm5lY3QgZmlyc3QsIGp1c3QgaW4gY2FzZSAqLwotCWF4ID0gMHg1MzA0OwotCWJ4ID0gMDsKLQlhc20gdm9sYXRpbGUoInB1c2hsICUlZWJwIDsgaW50ICQweDE1IDsgcG9wbCAlJWVicCIKLQkJICAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpCi0JCSAgICAgOiA6ICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKLQotCS8qIFBhcmFub2lhICovCi0JZWJ4ID0gZXNpID0gMDsKLQljeCA9IGR4ID0gZGkgPSAwOworCWlyZWcuYWwgPSAweDA0OworCWludGNhbGwoMHgxNSwgJmlyZWcsIE5VTEwpOwogCiAJLyogMzItYml0IGNvbm5lY3QgKi8KLQlhc20gdm9sYXRpbGUoInB1c2hsICUlZWJwIDsgaW50ICQweDE1IDsgcG9wbCAlJWVicCA7IHNldGMgJTYiCi0JCSAgICAgOiAiPWEiIChheCksICIrYiIgKGVieCksICIrYyIgKGN4KSwgIitkIiAoZHgpLAotCQkgICAgICAgIitTIiAoZXNpKSwgIitEIiAoZGkpLCAiPW0iIChlcnIpCi0JCSAgICAgOiAiYSIgKDB4NTMwMykpOworCWlyZWcuYWwgPSAweDAzOworCWludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKIAotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uY3NlZyA9IGF4OwotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8ub2Zmc2V0ID0gZWJ4OwotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uY3NlZ18xNiA9IGN4OwotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uZHNlZyA9IGR4OwotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uY3NlZ19sZW4gPSAodTE2KWVzaTsKLQlib290X3BhcmFtcy5hcG1fYmlvc19pbmZvLmNzZWdfMTZfbGVuID0gZXNpID4+IDE2OwotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uZHNlZ19sZW4gPSBkaTsKKwlib290X3BhcmFtcy5hcG1fYmlvc19pbmZvLmNzZWcgICAgICAgID0gb3JlZy5heDsKKwlib290X3BhcmFtcy5hcG1fYmlvc19pbmZvLm9mZnNldCAgICAgID0gb3JlZy5lYng7CisJYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5jc2VnXzE2ICAgICA9IG9yZWcuY3g7CisJYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5kc2VnICAgICAgICA9IG9yZWcuZHg7CisJYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5jc2VnX2xlbiAgICA9IG9yZWcuc2k7CisJYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5jc2VnXzE2X2xlbiA9IG9yZWcuaHNpOworCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uZHNlZ19sZW4gICAgPSBvcmVnLmRpOwogCi0JaWYgKGVycikKKwlpZiAob3JlZy5mbGFncyAmIFg4Nl9FRkxBR1NfQ0YpCiAJCXJldHVybiAtMTsKIAogCS8qIFJlZG8gdGhlIGluc3RhbGxhdGlvbiBjaGVjayBhcyB0aGUgMzItYml0IGNvbm5lY3Q7CiAJICAgc29tZSBCSU9TZXMgcmV0dXJuIGRpZmZlcmVudCBmbGFncyB0aGlzIHdheS4uLiAqLwogCi0JYXggPSAweDUzMDA7Ci0JYnggPSBjeCA9IDA7Ci0JYXNtIHZvbGF0aWxlKCJwdXNobCAlJWVicCA7IGludCAkMHgxNSA7IHBvcGwgJSVlYnAgOyBzZXRjICUwIgotCQkgICAgIDogIj1kIiAoZXJyKSwgIithIiAoYXgpLCAiK2IiIChieCksICIrYyIgKGN4KQotCQkgICAgIDogOiAiZXNpIiwgImVkaSIpOworCWlyZWcuYWwgPSAweDAwOworCWludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKIAotCWlmIChlcnIgfHwgYnggIT0gMHg1MDRkKSB7CisJaWYgKChvcmVnLmVmbGFncyAmIFg4Nl9FRkxBR1NfQ0YpIHx8IG9yZWcuYnggIT0gMHg1MDRkKSB7CiAJCS8qIEZhaWx1cmUgd2l0aCAzMi1iaXQgY29ubmVjdCwgdHJ5IHRvIGRpc2NvbmVjdCBhbmQgaWdub3JlICovCi0JCWF4ID0gMHg1MzA0OwotCQlieCA9IDA7Ci0JCWFzbSB2b2xhdGlsZSgicHVzaGwgJSVlYnAgOyBpbnQgJDB4MTUgOyBwb3BsICUlZWJwIgotCQkJICAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpCi0JCQkgICAgIDogOiAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7CisJCWlyZWcuYWwgPSAweDA0OworCQlpbnRjYWxsKDB4MTUsICZpcmVnLCBOVUxMKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8udmVyc2lvbiA9IGF4OwotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uZmxhZ3MgPSBjeDsKKwlib290X3BhcmFtcy5hcG1fYmlvc19pbmZvLnZlcnNpb24gPSBvcmVnLmF4OworCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uZmxhZ3MgICA9IG9yZWcuY3g7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvYmlvc2NhbGwuUyBiL2FyY2gveDg2L2Jvb3QvYmlvc2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDc3OTM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvYm9vdC9iaW9zY2FsbC5TCkBAIC0wLDAgKzEsODIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqICJHbG92ZSBib3giIGZvciBCSU9TIGNhbGxzLiAgQXZvaWRzIHRoZSBjb25zdGFudCBwcm9ibGVtcyB3aXRoIEJJT1NlcworICogdG91Y2hpbmcgcmVnaXN0ZXJzIHRoZXkgc2hvdWxkbid0IGJlLgorICovCisKKwkuY29kZTE2CisJLnRleHQKKwkuZ2xvYmwJaW50Y2FsbAorCS50eXBlCWludGNhbGwsIEBmdW5jdGlvbgoraW50Y2FsbDoKKwkvKiBTZWxmLW1vZGlmeSB0aGUgSU5UIGluc3RydWN0aW9uLiAgVWdseSwgYnV0IHdvcmtzLiAqLworCWNtcGIJJWFsLCAzZgorCWplCTFmCisJbW92YgklYWwsIDNmCisJam1wCTFmCQkvKiBTeW5jaHJvbml6ZSBwaXBlbGluZSAqLworMToKKwkvKiBTYXZlIHN0YXRlICovCisJcHVzaGZsCisJcHVzaHcJJWZzCisJcHVzaHcJJWdzCisJcHVzaGFsCisKKwkvKiBDb3B5IGlucHV0IHN0YXRlIHRvIHN0YWNrIGZyYW1lICovCisJc3VidwkkNDQsICVzcAorCW1vdncJJWR4LCAlc2kKKwltb3Z3CSVzcCwgJWRpCisJbW92dwkkMTEsICVjeAorCXJlcDsgbW92c2QKKworCS8qIFBvcCBmdWxsIHN0YXRlIGZyb20gdGhlIHN0YWNrICovCisJcG9wYWwKKwlwb3B3CSVncworCXBvcHcJJWZzCisJcG9wdwklZXMKKwlwb3B3CSVkcworCXBvcGZsCisKKwkvKiBBY3R1YWwgSU5UICovCisJLmJ5dGUJMHhjZAkJLyogSU5UIG9wY29kZSAqLworMzoJLmJ5dGUJMAorCisJLyogUHVzaCBmdWxsIHN0YXRlIHRvIHRoZSBzdGFjayAqLworCXB1c2hmbAorCXB1c2h3CSVkcworCXB1c2h3CSVlcworCXB1c2h3CSVmcworCXB1c2h3CSVncworCXB1c2hhbAorCisJLyogUmUtZXN0YWJsaXNoIEMgZW52aXJvbm1lbnQgaW52YXJpYW50cyAqLworCWNsZAorCW1vdnp3bAklc3AsICVlc3AKKwltb3Z3CSVjcywgJWF4CisJbW92dwklYXgsICVkcworCW1vdncJJWF4LCAlZXMKKworCS8qIENvcHkgb3V0cHV0IHN0YXRlIGZyb20gc3RhY2sgZnJhbWUgKi8KKwltb3Z3CTY4KCVlc3ApLCAlZGkJLyogT3JpZ2luYWwgJWN4ID09IDNyZCBhcmd1bWVudCAqLworCWFuZHcJJWRpLCAlZGkKKwlqegk0ZgorCW1vdncJJXNwLCAlc2kKKwltb3Z3CSQxMSwgJWN4CisJcmVwOyBtb3ZzZAorNDoJYWRkdwkkNDQsICVzcAorCisJLyogUmVzdG9yZSBzdGF0ZSBhbmQgcmV0dXJuICovCisJcG9wYWwKKwlwb3B3CSVncworCXBvcHcJJWZzCisJcG9wZmwKKwlyZXRsCisJLnNpemUJaW50Y2FsbCwgLi1pbnRjYWxsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2Jvb3QuaCBiL2FyY2gveDg2L2Jvb3QvYm9vdC5oCmluZGV4IDdiMjY5MmUuLjk4MjM5ZDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvYm9vdC5oCisrKyBiL2FyY2gveDg2L2Jvb3QvYm9vdC5oCkBAIC0yLDYgKzIsNyBAQAogICoKICAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKiAgIENvcHlyaWdodCAyMDA3IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCiAgKgogICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKICAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCkBAIC0yNiw2ICsyNyw3IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSAiYml0b3BzLmgiCiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CiAKIC8qIFVzZWZ1bCBtYWNyb3MgKi8KICNkZWZpbmUgQlVJTERfQlVHX09OKGNvbmRpdGlvbikgKCh2b2lkKXNpemVvZihjaGFyWzEgLSAyKiEhKGNvbmRpdGlvbildKSkKQEAgLTI0MSw2ICsyNDMsNDkgQEAKIC8qIGFwbS5jICovCiBpbnQgcXVlcnlfYXBtX2Jpb3Modm9pZCk7CiAKKy8qIGJpb3NjYWxsLmMgKi8KK3N0cnVjdCBiaW9zcmVncyB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGVkaTsKKwkJCXUzMiBlc2k7CisJCQl1MzIgZWJwOworCQkJdTMyIF9lc3A7CisJCQl1MzIgZWJ4OworCQkJdTMyIGVkeDsKKwkJCXUzMiBlY3g7CisJCQl1MzIgZWF4OworCQkJdTMyIF9mc2dzOworCQkJdTMyIF9kc2VzOworCQkJdTMyIGVmbGFnczsKKwkJfTsKKwkJc3RydWN0IHsKKwkJCXUxNiBkaSwgaGRpOworCQkJdTE2IHNpLCBoc2k7CisJCQl1MTYgYnAsIGhicDsKKwkJCXUxNiBfc3AsIF9oc3A7CisJCQl1MTYgYngsIGhieDsKKwkJCXUxNiBkeCwgaGR4OworCQkJdTE2IGN4LCBoY3g7CisJCQl1MTYgYXgsIGhheDsKKwkJCXUxNiBncywgZnM7CisJCQl1MTYgZXMsIGRzOworCQkJdTE2IGZsYWdzLCBoZmxhZ3M7CisJCX07CisJCXN0cnVjdCB7CisJCQl1OCBkaWwsIGRpaCwgZWRpMiwgZWRpMzsKKwkJCXU4IHNpbCwgc2loLCBlc2kyLCBlc2kzOworCQkJdTggYnBsLCBicGgsIGVicDIsIGVicDM7CisJCQl1OCBfc3BsLCBfc3BoLCBfZXNwMiwgX2VzcDM7CisJCQl1OCBibCwgYmgsIGVieDIsIGVieDM7CisJCQl1OCBkbCwgZGgsIGVkeDIsIGVkeDM7CisJCQl1OCBjbCwgY2gsIGVjeDIsIGVjeDM7CisJCQl1OCBhbCwgYWgsIGVheDIsIGVheDM7CisJCX07CisJfTsKK307Cit2b2lkIGludGNhbGwodTggaW50X25vLCBjb25zdCBzdHJ1Y3QgYmlvc3JlZ3MgKmlyZWcsIHN0cnVjdCBiaW9zcmVncyAqb3JlZyk7CisKIC8qIGNtZGxpbmUuYyAqLwogaW50IGNtZGxpbmVfZmluZF9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uLCBjaGFyICpidWZmZXIsIGludCBidWZzaXplKTsKIGludCBjbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2woY29uc3QgY2hhciAqb3B0aW9uKTsKQEAgLTI3OSw2ICszMjQsOSBAQAogaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpOwogaW50IHByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKKy8qIHJlZ3MuYyAqLwordm9pZCBpbml0cmVncyhzdHJ1Y3QgYmlvc3JlZ3MgKnJlZ3MpOworCiAvKiBzdHJpbmcuYyAqLwogaW50IHN0cmNtcChjb25zdCBjaGFyICpzdHIxLCBjb25zdCBjaGFyICpzdHIyKTsKIHNpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBtYXhsZW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkLy5naXRpZ25vcmUgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQppbmRleCA2M2VmZjNiLi40YTQ2ZmFiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQorKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZQpAQCAtMSwzICsxLDYgQEAKIHJlbG9jcwogdm1saW51eC5iaW4uYWxsCiB2bWxpbnV4LnJlbG9jcwordm1saW51eC5sZHMKK21rcGlnZ3kKK3BpZ2d5LlMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQppbmRleCA2NTU1MWM5Li40OWM4YTRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0xOSw3ICsxOSw5IEBACiBMREZMQUdTIDo9IC1tIGVsZl8kKFVUU19NQUNISU5FKQogTERGTEFHU192bWxpbnV4IDo9IC1UCiAKLSQob2JqKS92bWxpbnV4OiAkKHNyYykvdm1saW51eF8kKEJJVFMpLmxkcyAkKG9iaikvaGVhZF8kKEJJVFMpLm8gJChvYmopL21pc2MubyAkKG9iaikvcGlnZ3kubyBGT1JDRQoraG9zdHByb2dzLXkJOj0gbWtwaWdneQorCiskKG9iaikvdm1saW51eDogJChvYmopL3ZtbGludXgubGRzICQob2JqKS9oZWFkXyQoQklUUykubyAkKG9iaikvbWlzYy5vICQob2JqKS9waWdneS5vIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbGQpCiAJQDoKIApAQCAtMjksNyArMzEsNyBAQAogCiAKIHRhcmdldHMgKz0gdm1saW51eC5iaW4uYWxsIHZtbGludXgucmVsb2NzIHJlbG9jcwotaG9zdHByb2dzLSQoQ09ORklHX1g4Nl8zMikgKz0gcmVsb2NzCitob3N0cHJvZ3MtJChDT05GSUdfWDg2X05FRURfUkVMT0NTKSArPSByZWxvY3MKIAogcXVpZXRfY21kX3JlbG9jcyA9IFJFTE9DUyAgJEAKICAgICAgIGNtZF9yZWxvY3MgPSAkKG9iaikvcmVsb2NzICQ8ID4gJEA7JChvYmopL3JlbG9jcyAtLWFicy1yZWxvY3MgJDwKQEAgLTM3LDQ2ICszOSwyMiBAQAogCSQoY2FsbCBpZl9jaGFuZ2VkLHJlbG9jcykKIAogdm1saW51eC5iaW4uYWxsLXkgOj0gJChvYmopL3ZtbGludXguYmluCi12bWxpbnV4LmJpbi5hbGwtJChDT05GSUdfUkVMT0NBVEFCTEUpICs9ICQob2JqKS92bWxpbnV4LnJlbG9jcwotcXVpZXRfY21kX3JlbG9jYmluID0gQlVJTEQgICAkQAotICAgICAgY21kX3JlbG9jYmluID0gY2F0ICQoZmlsdGVyLW91dCBGT1JDRSwkXikgPiAkQAotJChvYmopL3ZtbGludXguYmluLmFsbDogJCh2bWxpbnV4LmJpbi5hbGwteSkgRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxyZWxvY2JpbikKK3ZtbGludXguYmluLmFsbC0kKENPTkZJR19YODZfTkVFRF9SRUxPQ1MpICs9ICQob2JqKS92bWxpbnV4LnJlbG9jcwogCi1pZmVxICgkKENPTkZJR19YODZfMzIpLHkpCi0KLWlmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQotJChvYmopL3ZtbGludXguYmluLmd6OiAkKG9iaikvdm1saW51eC5iaW4uYWxsIEZPUkNFCiskKG9iaikvdm1saW51eC5iaW4uZ3o6ICQodm1saW51eC5iaW4uYWxsLXkpIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKLSQob2JqKS92bWxpbnV4LmJpbi5iejI6ICQob2JqKS92bWxpbnV4LmJpbi5hbGwgRk9SQ0UKKyQob2JqKS92bWxpbnV4LmJpbi5iejI6ICQodm1saW51eC5iaW4uYWxsLXkpIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsYnppcDIpCi0kKG9iaikvdm1saW51eC5iaW4ubHptYTogJChvYmopL3ZtbGludXguYmluLmFsbCBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGx6bWEpCi1lbHNlCi0kKG9iaikvdm1saW51eC5iaW4uZ3o6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCi0kKG9iaikvdm1saW51eC5iaW4uYnoyOiAkKG9iaikvdm1saW51eC5iaW4gRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxiemlwMikKLSQob2JqKS92bWxpbnV4LmJpbi5sem1hOiAkKG9iaikvdm1saW51eC5iaW4gRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxsem1hKQotZW5kaWYKLUxERkxBR1NfcGlnZ3kubyA6PSAtciAtLWZvcm1hdCBiaW5hcnkgLS1vZm9ybWF0IGVsZjMyLWkzODYgLVQKLQotZWxzZQotCi0kKG9iaikvdm1saW51eC5iaW4uZ3o6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGd6aXApCi0kKG9iaikvdm1saW51eC5iaW4uYnoyOiAkKG9iaikvdm1saW51eC5iaW4gRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxiemlwMikKLSQob2JqKS92bWxpbnV4LmJpbi5sem1hOiAkKG9iaikvdm1saW51eC5iaW4gRk9SQ0UKKyQob2JqKS92bWxpbnV4LmJpbi5sem1hOiAkKHZtbGludXguYmluLmFsbC15KSBGT1JDRQogCSQoY2FsbCBpZl9jaGFuZ2VkLGx6bWEpCiAKLUxERkxBR1NfcGlnZ3kubyA6PSAtciAtLWZvcm1hdCBiaW5hcnkgLS1vZm9ybWF0IGVsZjY0LXg4Ni02NCAtVAotZW5kaWYKK3N1ZmZpeC0kKENPTkZJR19LRVJORUxfR1pJUCkJOj0gZ3oKK3N1ZmZpeC0kKENPTkZJR19LRVJORUxfQlpJUDIpCTo9IGJ6Mgorc3VmZml4LSQoQ09ORklHX0tFUk5FTF9MWk1BKQk6PSBsem1hCiAKLXN1ZmZpeF8kKENPTkZJR19LRVJORUxfR1pJUCkgID0gZ3oKLXN1ZmZpeF8kKENPTkZJR19LRVJORUxfQlpJUDIpID0gYnoyCi1zdWZmaXhfJChDT05GSUdfS0VSTkVMX0xaTUEpICA9IGx6bWEKK3F1aWV0X2NtZF9ta3BpZ2d5ID0gTUtQSUdHWSAkQAorICAgICAgY21kX21rcGlnZ3kgPSAkKG9iaikvbWtwaWdneSAkPCA+ICRAIHx8ICggcm0gLWYgJEAgOyBmYWxzZSApCiAKLSQob2JqKS9waWdneS5vOiAkKG9iaikvdm1saW51eC5zY3IgJChvYmopL3ZtbGludXguYmluLiQoc3VmZml4X3kpIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsbGQpCit0YXJnZXRzICs9IHBpZ2d5LlMKKyQob2JqKS9waWdneS5TOiAkKG9iaikvdm1saW51eC5iaW4uJChzdWZmaXgteSkgJChvYmopL21rcGlnZ3kgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxta3BpZ2d5KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKaW5kZXggM2E4YTg2Ni4uNzVlNGYwMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCkBAIC0xMiwxNiArMTIsMTYgQEAKICAqIHRoZSBwYWdlIGRpcmVjdG9yeS4gW0FjY29yZGluZyB0byBjb21tZW50cyBldGMgZWxzZXdoZXJlIG9uIGEgY29tcHJlc3NlZAogICoga2VybmVsIGl0IHdpbGwgZW5kIHVwIGF0IDB4MTAwMCArIDFNYiBJIGhvcGUgc28gYXMgSSBhc3N1bWUgdGhpcy4gLSBBQ10KICAqCi0gKiBQYWdlIDAgaXMgZGVsaWJlcmF0ZWx5IGtlcHQgc2FmZSwgc2luY2UgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBjb2RlIGluIAorICogUGFnZSAwIGlzIGRlbGliZXJhdGVseSBrZXB0IHNhZmUsIHNpbmNlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgY29kZSBpbgogICogbGFwdG9wcyBtYXkgbmVlZCB0byBhY2Nlc3MgdGhlIEJJT1MgZGF0YSBzdG9yZWQgdGhlcmUuICBUaGlzIGlzIGFsc28KLSAqIHVzZWZ1bCBmb3IgZnV0dXJlIGRldmljZSBkcml2ZXJzIHRoYXQgZWl0aGVyIGFjY2VzcyB0aGUgQklPUyB2aWEgVk04NiAKKyAqIHVzZWZ1bCBmb3IgZnV0dXJlIGRldmljZSBkcml2ZXJzIHRoYXQgZWl0aGVyIGFjY2VzcyB0aGUgQklPUyB2aWEgVk04NgogICogbW9kZS4KICAqLwogCiAvKgogICogSGlnaCBsb2FkZWQgc3R1ZmYgYnkgSGFucyBMZXJtZW4gJiBXZXJuZXIgQWxtZXNiZXJnZXIsIEZlYi4gMTk5NgogICovCi0udGV4dAorCS50ZXh0CiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KQEAgLTI5LDE2MSArMjksMTUxIEBACiAjaW5jbHVkZSA8YXNtL2Jvb3QuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAotLnNlY3Rpb24gIi50ZXh0LmhlYWQiLCJheCIsQHByb2diaXRzCisJLnNlY3Rpb24gIi50ZXh0LmhlYWQiLCJheCIsQHByb2diaXRzCiBFTlRSWShzdGFydHVwXzMyKQogCWNsZAotCS8qIHRlc3QgS0VFUF9TRUdNRU5UUyBmbGFnIHRvIHNlZSBpZiB0aGUgYm9vdGxvYWRlciBpcyBhc2tpbmcKLQkgKiB1cyB0byBub3QgcmVsb2FkIHNlZ21lbnRzICovCi0JdGVzdGIgJCgxPDw2KSwgQlBfbG9hZGZsYWdzKCVlc2kpCi0Jam56IDFmCisJLyoKKwkgKiBUZXN0IEtFRVBfU0VHTUVOVFMgZmxhZyB0byBzZWUgaWYgdGhlIGJvb3Rsb2FkZXIgaXMgYXNraW5nCisJICogdXMgdG8gbm90IHJlbG9hZCBzZWdtZW50cworCSAqLworCXRlc3RiCSQoMTw8NiksIEJQX2xvYWRmbGFncyglZXNpKQorCWpuegkxZgogCiAJY2xpCi0JbW92bCAkKF9fQk9PVF9EUyksJWVheAotCW1vdmwgJWVheCwlZHMKLQltb3ZsICVlYXgsJWVzCi0JbW92bCAlZWF4LCVmcwotCW1vdmwgJWVheCwlZ3MKLQltb3ZsICVlYXgsJXNzCisJbW92bAkkX19CT09UX0RTLCAlZWF4CisJbW92bAklZWF4LCAlZHMKKwltb3ZsCSVlYXgsICVlcworCW1vdmwJJWVheCwgJWZzCisJbW92bAklZWF4LCAlZ3MKKwltb3ZsCSVlYXgsICVzcwogMToKIAotLyogQ2FsY3VsYXRlIHRoZSBkZWx0YSBiZXR3ZWVuIHdoZXJlIHdlIHdlcmUgY29tcGlsZWQgdG8gcnVuCisvKgorICogQ2FsY3VsYXRlIHRoZSBkZWx0YSBiZXR3ZWVuIHdoZXJlIHdlIHdlcmUgY29tcGlsZWQgdG8gcnVuCiAgKiBhdCBhbmQgd2hlcmUgd2Ugd2VyZSBhY3R1YWxseSBsb2FkZWQgYXQuICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUKICAqIHdpdGggYSBzaG9ydCBsb2NhbCBjYWxsIG9uIHg4Ni4gIE5vdGhpbmcgIGVsc2Ugd2lsbCB0ZWxsIHVzIHdoYXQKICAqIGFkZHJlc3Mgd2UgYXJlIHJ1bm5pbmcgYXQuICBUaGUgcmVzZXJ2ZWQgY2h1bmsgb2YgdGhlIHJlYWwtbW9kZQogICogZGF0YSBhdCAweDFlNCAoZGVmaW5lZCBhcyBhIHNjcmF0Y2ggZmllbGQpIGFyZSB1c2VkIGFzIHRoZSBzdGFjawogICogZm9yIHRoaXMgY2FsY3VsYXRpb24uIE9ubHkgNCBieXRlcyBhcmUgbmVlZGVkLgogICovCi0JbGVhbCAoMHgxZTQrNCkoJWVzaSksICVlc3AKLQljYWxsIDFmCi0xOglwb3BsICVlYnAKLQlzdWJsICQxYiwgJWVicAorCWxlYWwJKEJQX3NjcmF0Y2grNCkoJWVzaSksICVlc3AKKwljYWxsCTFmCisxOglwb3BsCSVlYnAKKwlzdWJsCSQxYiwgJWVicAogCi0vKiAlZWJwIGNvbnRhaW5zIHRoZSBhZGRyZXNzIHdlIGFyZSBsb2FkZWQgYXQgYnkgdGhlIGJvb3QgbG9hZGVyIGFuZCAlZWJ4CisvKgorICogJWVicCBjb250YWlucyB0aGUgYWRkcmVzcyB3ZSBhcmUgbG9hZGVkIGF0IGJ5IHRoZSBib290IGxvYWRlciBhbmQgJWVieAogICogY29udGFpbnMgdGhlIGFkZHJlc3Mgd2hlcmUgd2Ugc2hvdWxkIG1vdmUgdGhlIGtlcm5lbCBpbWFnZSB0ZW1wb3JhcmlseQogICogZm9yIHNhZmUgaW4tcGxhY2UgZGVjb21wcmVzc2lvbi4KICAqLwogCiAjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCi0JbW92bCAJJWVicCwgJWVieAotCWFkZGwgICAgJChDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSwgJWVieAotCWFuZGwgICAgJCh+KENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKSwgJWVieAorCW1vdmwJJWVicCwgJWVieAorCW1vdmwJQlBfa2VybmVsX2FsaWdubWVudCglZXNpKSwgJWVheAorCWRlY2wJJWVheAorCWFkZGwgICAgJWVheCwgJWVieAorCW5vdGwJJWVheAorCWFuZGwgICAgJWVheCwgJWVieAogI2Vsc2UKLQltb3ZsICRMT0FEX1BIWVNJQ0FMX0FERFIsICVlYngKKwltb3ZsCSRMT0FEX1BIWVNJQ0FMX0FERFIsICVlYngKICNlbmRpZgogCi0JLyogUmVwbGFjZSB0aGUgY29tcHJlc3NlZCBkYXRhIHNpemUgd2l0aCB0aGUgdW5jb21wcmVzc2VkIHNpemUgKi8KLQlzdWJsIGlucHV0X2xlbiglZWJwKSwgJWVieAotCW1vdmwgb3V0cHV0X2xlbiglZWJwKSwgJWVheAotCWFkZGwgJWVheCwgJWVieAotCS8qIEFkZCA4IGJ5dGVzIGZvciBldmVyeSAzMksgaW5wdXQgYmxvY2sgKi8KLQlzaHJsICQxMiwgJWVheAotCWFkZGwgJWVheCwgJWVieAotCS8qIEFkZCAzMksgKyAxOCBieXRlcyBvZiBleHRyYSBzbGFjayAqLwotCWFkZGwgJCgzMjc2OCArIDE4KSwgJWVieAotCS8qIEFsaWduIG9uIGEgNEsgYm91bmRhcnkgKi8KLQlhZGRsICQ0MDk1LCAlZWJ4Ci0JYW5kbCAkfjQwOTUsICVlYngKKwkvKiBUYXJnZXQgYWRkcmVzcyB0byByZWxvY2F0ZSB0byBmb3IgZGVjb21wcmVzc2lvbiAqLworCWFkZGwJJHpfZXh0cmFjdF9vZmZzZXQsICVlYngKIAotLyogQ29weSB0aGUgY29tcHJlc3NlZCBrZXJuZWwgdG8gdGhlIGVuZCBvZiBvdXIgYnVmZmVyCisJLyogU2V0IHVwIHRoZSBzdGFjayAqLworCWxlYWwJYm9vdF9zdGFja19lbmQoJWVieCksICVlc3AKKworCS8qIFplcm8gRUZMQUdTICovCisJcHVzaGwJJDAKKwlwb3BmbAorCisvKgorICogQ29weSB0aGUgY29tcHJlc3NlZCBrZXJuZWwgdG8gdGhlIGVuZCBvZiBvdXIgYnVmZmVyCiAgKiB3aGVyZSBkZWNvbXByZXNzaW9uIGluIHBsYWNlIGJlY29tZXMgc2FmZS4KICAqLwotCXB1c2hsICVlc2kKLQlsZWFsIF9lbmQoJWVicCksICVlc2kKLQlsZWFsIF9lbmQoJWVieCksICVlZGkKLQltb3ZsICQoX2VuZCAtIHN0YXJ0dXBfMzIpLCAlZWN4CisJcHVzaGwJJWVzaQorCWxlYWwJKF9ic3MtNCkoJWVicCksICVlc2kKKwlsZWFsCShfYnNzLTQpKCVlYngpLCAlZWRpCisJbW92bAkkKF9ic3MgLSBzdGFydHVwXzMyKSwgJWVjeAorCXNocmwJJDIsICVlY3gKIAlzdGQKLQlyZXAKLQltb3ZzYgorCXJlcAltb3ZzbAogCWNsZAotCXBvcGwgJWVzaQotCi0vKiBDb21wdXRlIHRoZSBrZXJuZWwgc3RhcnQgYWRkcmVzcy4KLSAqLwotI2lmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQotCWFkZGwgICAgJChDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSwgJWVicAotCWFuZGwgICAgJCh+KENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKSwgJWVicAotI2Vsc2UKLQltb3ZsCSRMT0FEX1BIWVNJQ0FMX0FERFIsICVlYnAKLSNlbmRpZgorCXBvcGwJJWVzaQogCiAvKgogICogSnVtcCB0byB0aGUgcmVsb2NhdGVkIGFkZHJlc3MuCiAgKi8KLQlsZWFsIHJlbG9jYXRlZCglZWJ4KSwgJWVheAotCWptcCAqJWVheAorCWxlYWwJcmVsb2NhdGVkKCVlYngpLCAlZWF4CisJam1wCSolZWF4CiBFTkRQUk9DKHN0YXJ0dXBfMzIpCiAKLS5zZWN0aW9uICIudGV4dCIKKwkudGV4dAogcmVsb2NhdGVkOgogCiAvKgotICogQ2xlYXIgQlNTCisgKiBDbGVhciBCU1MgKHN0YWNrIGlzIGN1cnJlbnRseSBlbXB0eSkKICAqLwotCXhvcmwgJWVheCwlZWF4Ci0JbGVhbCBfZWRhdGEoJWVieCksJWVkaQotCWxlYWwgX2VuZCglZWJ4KSwgJWVjeAotCXN1YmwgJWVkaSwlZWN4Ci0JY2xkCi0JcmVwCi0Jc3Rvc2IKLQotLyoKLSAqIFNldHVwIHRoZSBzdGFjayBmb3IgdGhlIGRlY29tcHJlc3NvcgotICovCi0JbGVhbCBib290X3N0YWNrX2VuZCglZWJ4KSwgJWVzcAorCXhvcmwJJWVheCwgJWVheAorCWxlYWwJX2JzcyglZWJ4KSwgJWVkaQorCWxlYWwJX2Vic3MoJWVieCksICVlY3gKKwlzdWJsCSVlZGksICVlY3gKKwlzaHJsCSQyLCAlZWN4CisJcmVwCXN0b3NsCiAKIC8qCiAgKiBEbyB0aGUgZGVjb21wcmVzc2lvbiwgYW5kIGp1bXAgdG8gdGhlIG5ldyBrZXJuZWwuLgogICovCi0JbW92bCBvdXRwdXRfbGVuKCVlYngpLCAlZWF4Ci0JcHVzaGwgJWVheAotCQkJIyBwdXNoIGFyZ3VtZW50cyBmb3IgZGVjb21wcmVzc19rZXJuZWw6Ci0JcHVzaGwgJWVicAkjIG91dHB1dCBhZGRyZXNzCi0JbW92bCBpbnB1dF9sZW4oJWVieCksICVlYXgKLQlwdXNobCAlZWF4CSMgaW5wdXRfbGVuCi0JbGVhbCBpbnB1dF9kYXRhKCVlYngpLCAlZWF4Ci0JcHVzaGwgJWVheAkjIGlucHV0X2RhdGEKLQlsZWFsIGJvb3RfaGVhcCglZWJ4KSwgJWVheAotCXB1c2hsICVlYXgJIyBoZWFwIGFyZWEKLQlwdXNobCAlZXNpCSMgcmVhbCBtb2RlIHBvaW50ZXIKLQljYWxsIGRlY29tcHJlc3Nfa2VybmVsCi0JYWRkbCAkMjAsICVlc3AKLQlwb3BsICVlY3gKKwlsZWFsCXpfZXh0cmFjdF9vZmZzZXRfbmVnYXRpdmUoJWVieCksICVlYnAKKwkJCQkvKiBwdXNoIGFyZ3VtZW50cyBmb3IgZGVjb21wcmVzc19rZXJuZWw6ICovCisJcHVzaGwJJWVicAkJLyogb3V0cHV0IGFkZHJlc3MgKi8KKwlwdXNobAkkel9pbnB1dF9sZW4JLyogaW5wdXRfbGVuICovCisJbGVhbAlpbnB1dF9kYXRhKCVlYngpLCAlZWF4CisJcHVzaGwJJWVheAkJLyogaW5wdXRfZGF0YSAqLworCWxlYWwJYm9vdF9oZWFwKCVlYngpLCAlZWF4CisJcHVzaGwJJWVheAkJLyogaGVhcCBhcmVhICovCisJcHVzaGwJJWVzaQkJLyogcmVhbCBtb2RlIHBvaW50ZXIgKi8KKwljYWxsCWRlY29tcHJlc3Nfa2VybmVsCisJYWRkbAkkMjAsICVlc3AKIAogI2lmIENPTkZJR19SRUxPQ0FUQUJMRQotLyogRmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbnMuCisvKgorICogRmluZCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVsb2NhdGlvbnMuCiAgKi8KLQltb3ZsICVlYnAsICVlZGkKLQlhZGRsICVlY3gsICVlZGkKKwlsZWFsCXpfb3V0cHV0X2xlbiglZWJwKSwgJWVkaQogCi0vKiBDYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gd2hlcmUgdm1saW51eCB3YXMgY29tcGlsZWQgdG8gcnVuCisvKgorICogQ2FsY3VsYXRlIHRoZSBkZWx0YSBiZXR3ZWVuIHdoZXJlIHZtbGludXggd2FzIGNvbXBpbGVkIHRvIHJ1bgogICogYW5kIHdoZXJlIGl0IHdhcyBhY3R1YWxseSBsb2FkZWQuCiAgKi8KLQltb3ZsICVlYnAsICVlYngKLQlzdWJsICRMT0FEX1BIWVNJQ0FMX0FERFIsICVlYngKLQlqeiAgIDJmCQkvKiBOb3RoaW5nIHRvIGJlIGRvbmUgaWYgbG9hZGVkIGF0IGNvbXBpbGVkIGFkZHIuICovCisJbW92bAklZWJwLCAlZWJ4CisJc3VibAkkTE9BRF9QSFlTSUNBTF9BRERSLCAlZWJ4CisJanoJMmYJLyogTm90aGluZyB0byBiZSBkb25lIGlmIGxvYWRlZCBhdCBjb21waWxlZCBhZGRyLiAqLwogLyoKICAqIFByb2Nlc3MgcmVsb2NhdGlvbnMuCiAgKi8KIAotMToJc3VibCAkNCwgJWVkaQotCW1vdmwgMCglZWRpKSwgJWVjeAotCXRlc3RsICVlY3gsICVlY3gKLQlqeiAyZgotCWFkZGwgJWVieCwgLV9fUEFHRV9PRkZTRVQoJWVieCwgJWVjeCkKLQlqbXAgMWIKKzE6CXN1YmwJJDQsICVlZGkKKwltb3ZsCSglZWRpKSwgJWVjeAorCXRlc3RsCSVlY3gsICVlY3gKKwlqegkyZgorCWFkZGwJJWVieCwgLV9fUEFHRV9PRkZTRVQoJWVieCwgJWVjeCkKKwlqbXAJMWIKIDI6CiAjZW5kaWYKIAogLyoKICAqIEp1bXAgdG8gdGhlIGRlY29tcHJlc3NlZCBrZXJuZWwuCiAgKi8KLQl4b3JsICVlYngsJWVieAotCWptcCAqJWVicAorCXhvcmwJJWVieCwgJWVieAorCWptcAkqJWVicAogCi0uYnNzCi0vKiBTdGFjayBhbmQgaGVhcCBmb3IgdW5jb21wcmVzc2lvbiAqLwotLmJhbGlnbiA0CisvKgorICogU3RhY2sgYW5kIGhlYXAgZm9yIHVuY29tcHJlc3Npb24KKyAqLworCS5ic3MKKwkuYmFsaWduIDQKIGJvb3RfaGVhcDoKIAkuZmlsbCBCT09UX0hFQVBfU0laRSwgMSwgMAogYm9vdF9zdGFjazoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCmluZGV4IGVkNGE4MjkuLmY2MmMyODQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUwpAQCAtMjEsOCArMjEsOCBAQAogLyoKICAqIEhpZ2ggbG9hZGVkIHN0dWZmIGJ5IEhhbnMgTGVybWVuICYgV2VybmVyIEFsbWVzYmVyZ2VyLCBGZWIuIDE5OTYKICAqLwotLmNvZGUzMgotLnRleHQKKwkuY29kZTMyCisJLnRleHQKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgpAQCAtMzMsMTIgKzMzLDE0IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCi0uc2VjdGlvbiAiLnRleHQuaGVhZCIKKwkuc2VjdGlvbiAiLnRleHQuaGVhZCIKIAkuY29kZTMyCiBFTlRSWShzdGFydHVwXzMyKQogCWNsZAotCS8qIHRlc3QgS0VFUF9TRUdNRU5UUyBmbGFnIHRvIHNlZSBpZiB0aGUgYm9vdGxvYWRlciBpcyBhc2tpbmcKLQkgKiB1cyB0byBub3QgcmVsb2FkIHNlZ21lbnRzICovCisJLyoKKwkgKiBUZXN0IEtFRVBfU0VHTUVOVFMgZmxhZyB0byBzZWUgaWYgdGhlIGJvb3Rsb2FkZXIgaXMgYXNraW5nCisJICogdXMgdG8gbm90IHJlbG9hZCBzZWdtZW50cworCSAqLwogCXRlc3RiICQoMTw8NiksIEJQX2xvYWRmbGFncyglZXNpKQogCWpueiAxZgogCkBAIC00OSwxNCArNTEsMTUgQEAKIAltb3ZsCSVlYXgsICVzcwogMToKIAotLyogQ2FsY3VsYXRlIHRoZSBkZWx0YSBiZXR3ZWVuIHdoZXJlIHdlIHdlcmUgY29tcGlsZWQgdG8gcnVuCisvKgorICogQ2FsY3VsYXRlIHRoZSBkZWx0YSBiZXR3ZWVuIHdoZXJlIHdlIHdlcmUgY29tcGlsZWQgdG8gcnVuCiAgKiBhdCBhbmQgd2hlcmUgd2Ugd2VyZSBhY3R1YWxseSBsb2FkZWQgYXQuICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUKICAqIHdpdGggYSBzaG9ydCBsb2NhbCBjYWxsIG9uIHg4Ni4gIE5vdGhpbmcgIGVsc2Ugd2lsbCB0ZWxsIHVzIHdoYXQKICAqIGFkZHJlc3Mgd2UgYXJlIHJ1bm5pbmcgYXQuICBUaGUgcmVzZXJ2ZWQgY2h1bmsgb2YgdGhlIHJlYWwtbW9kZQogICogZGF0YSBhdCAweDFlNCAoZGVmaW5lZCBhcyBhIHNjcmF0Y2ggZmllbGQpIGFyZSB1c2VkIGFzIHRoZSBzdGFjawogICogZm9yIHRoaXMgY2FsY3VsYXRpb24uIE9ubHkgNCBieXRlcyBhcmUgbmVlZGVkLgogICovCi0JbGVhbAkoMHgxZTQrNCkoJWVzaSksICVlc3AKKwlsZWFsCShCUF9zY3JhdGNoKzQpKCVlc2kpLCAlZXNwCiAJY2FsbAkxZgogMToJcG9wbAklZWJwCiAJc3VibAkkMWIsICVlYnAKQEAgLTcwLDMyICs3MywyOCBAQAogCXRlc3RsCSVlYXgsICVlYXgKIAlqbnoJbm9fbG9uZ21vZGUKIAotLyogQ29tcHV0ZSB0aGUgZGVsdGEgYmV0d2VlbiB3aGVyZSB3ZSB3ZXJlIGNvbXBpbGVkIHRvIHJ1biBhdAorLyoKKyAqIENvbXB1dGUgdGhlIGRlbHRhIGJldHdlZW4gd2hlcmUgd2Ugd2VyZSBjb21waWxlZCB0byBydW4gYXQKICAqIGFuZCB3aGVyZSB0aGUgY29kZSB3aWxsIGFjdHVhbGx5IHJ1biBhdC4KLSAqLwotLyogJWVicCBjb250YWlucyB0aGUgYWRkcmVzcyB3ZSBhcmUgbG9hZGVkIGF0IGJ5IHRoZSBib290IGxvYWRlciBhbmQgJWVieAorICoKKyAqICVlYnAgY29udGFpbnMgdGhlIGFkZHJlc3Mgd2UgYXJlIGxvYWRlZCBhdCBieSB0aGUgYm9vdCBsb2FkZXIgYW5kICVlYngKICAqIGNvbnRhaW5zIHRoZSBhZGRyZXNzIHdoZXJlIHdlIHNob3VsZCBtb3ZlIHRoZSBrZXJuZWwgaW1hZ2UgdGVtcG9yYXJpbHkKICAqIGZvciBzYWZlIGluLXBsYWNlIGRlY29tcHJlc3Npb24uCiAgKi8KIAogI2lmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQogCW1vdmwJJWVicCwgJWVieAotCWFkZGwJJChQTURfUEFHRV9TSVpFIC0xKSwgJWVieAotCWFuZGwJJFBNRF9QQUdFX01BU0ssICVlYngKKwltb3ZsCUJQX2tlcm5lbF9hbGlnbm1lbnQoJWVzaSksICVlYXgKKwlkZWNsCSVlYXgKKwlhZGRsCSVlYXgsICVlYngKKwlub3RsCSVlYXgKKwlhbmRsCSVlYXgsICVlYngKICNlbHNlCi0JbW92bAkkQ09ORklHX1BIWVNJQ0FMX1NUQVJULCAlZWJ4CisJbW92bAkkTE9BRF9QSFlTSUNBTF9BRERSLCAlZWJ4CiAjZW5kaWYKIAotCS8qIFJlcGxhY2UgdGhlIGNvbXByZXNzZWQgZGF0YSBzaXplIHdpdGggdGhlIHVuY29tcHJlc3NlZCBzaXplICovCi0Jc3VibAlpbnB1dF9sZW4oJWVicCksICVlYngKLQltb3ZsCW91dHB1dF9sZW4oJWVicCksICVlYXgKLQlhZGRsCSVlYXgsICVlYngKLQkvKiBBZGQgOCBieXRlcyBmb3IgZXZlcnkgMzJLIGlucHV0IGJsb2NrICovCi0Jc2hybAkkMTIsICVlYXgKLQlhZGRsCSVlYXgsICVlYngKLQkvKiBBZGQgMzJLICsgMTggYnl0ZXMgb2YgZXh0cmEgc2xhY2sgYW5kIGFsaWduIG9uIGEgNEsgYm91bmRhcnkgKi8KLQlhZGRsCSQoMzI3NjggKyAxOCArIDQwOTUpLCAlZWJ4Ci0JYW5kbAkkfjQwOTUsICVlYngKKwkvKiBUYXJnZXQgYWRkcmVzcyB0byByZWxvY2F0ZSB0byBmb3IgZGVjb21wcmVzc2lvbiAqLworCWFkZGwJJHpfZXh0cmFjdF9vZmZzZXQsICVlYngKIAogLyoKICAqIFByZXBhcmUgZm9yIGVudGVyaW5nIDY0IGJpdCBtb2RlCkBAIC0xMTQsNyArMTEzLDcgQEAKICAvKgogICAqIEJ1aWxkIGVhcmx5IDRHIGJvb3QgcGFnZXRhYmxlCiAgICovCi0JLyogSW5pdGlhbGl6ZSBQYWdlIHRhYmxlcyB0byAwKi8KKwkvKiBJbml0aWFsaXplIFBhZ2UgdGFibGVzIHRvIDAgKi8KIAlsZWFsCXBndGFibGUoJWVieCksICVlZGkKIAl4b3JsCSVlYXgsICVlYXgKIAltb3ZsCSQoKDQwOTYqNikvNCksICVlY3gKQEAgLTE1NSw3ICsxNTQsOCBAQAogCWJ0c2wJJF9FRkVSX0xNRSwgJWVheAogCXdybXNyCiAKLQkvKiBTZXR1cCBmb3IgdGhlIGp1bXAgdG8gNjRiaXQgbW9kZQorCS8qCisJICogU2V0dXAgZm9yIHRoZSBqdW1wIHRvIDY0Yml0IG1vZGUKIAkgKgogCSAqIFdoZW4gdGhlIGp1bXAgaXMgcGVyZm9ybWVuZCB3ZSB3aWxsIGJlIGluIGxvbmcgbW9kZSBidXQKIAkgKiBpbiAzMmJpdCBjb21wYXRpYmlsaXR5IG1vZGUgd2l0aCBFRkVSLkxNRSA9IDEsIENTLkwgPSAwLCBDUy5EID0gMQpAQCAtMTg0LDcgKzE4NCw4IEBACiAKICNpbmNsdWRlICIuLi8uLi9rZXJuZWwvdmVyaWZ5X2NwdV82NC5TIgogCi0JLyogQmUgY2FyZWZ1bCBoZXJlIHN0YXJ0dXBfNjQgbmVlZHMgdG8gYmUgYXQgYSBwcmVkaWN0YWJsZQorCS8qCisJICogQmUgY2FyZWZ1bCBoZXJlIHN0YXJ0dXBfNjQgbmVlZHMgdG8gYmUgYXQgYSBwcmVkaWN0YWJsZQogCSAqIGFkZHJlc3Mgc28gSSBjYW4gZXhwb3J0IGl0IGluIGFuIEVMRiBoZWFkZXIuICBCb290bG9hZGVycwogCSAqIHNob3VsZCBsb29rIGF0IHRoZSBFTEYgaGVhZGVyIHRvIGZpbmQgdGhpcyBhZGRyZXNzLCBhcwogCSAqIGl0IG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KQEAgLTE5Miw3ICsxOTMsOCBAQAogCS5jb2RlNjQKIAkub3JnIDB4MjAwCiBFTlRSWShzdGFydHVwXzY0KQotCS8qIFdlIGNvbWUgaGVyZSBlaXRoZXIgZnJvbSBzdGFydHVwXzMyIG9yIGRpcmVjdGx5IGZyb20gYQorCS8qCisJICogV2UgY29tZSBoZXJlIGVpdGhlciBmcm9tIHN0YXJ0dXBfMzIgb3IgZGlyZWN0bHkgZnJvbSBhCiAJICogNjRiaXQgYm9vdGxvYWRlci4gIElmIHdlIGNvbWUgaGVyZSBmcm9tIGEgYm9vdGxvYWRlciB3ZSBkZXBlbmQgb24KIAkgKiBhbiBpZGVudGl0eSBtYXBwZWQgcGFnZSB0YWJsZSBiZWluZyBwcm92aWVkIHRoYXQgbWFwcyBvdXIKIAkgKiBlbnRpcmUgdGV4dCtkYXRhK2JzcyBhbmQgaG9wZWZ1bGx5IGFsbCBvZiBtZW1vcnkuCkBAIC0yMDksNTAgKzIxMSw1NCBAQAogCW1vdmwgICAgJDB4MjAsICVlYXgKIAlsdHIJJWF4CiAKLQkvKiBDb21wdXRlIHRoZSBkZWNvbXByZXNzZWQga2VybmVsIHN0YXJ0IGFkZHJlc3MuICBJdCBpcyB3aGVyZQorCS8qCisJICogQ29tcHV0ZSB0aGUgZGVjb21wcmVzc2VkIGtlcm5lbCBzdGFydCBhZGRyZXNzLiAgSXQgaXMgd2hlcmUKIAkgKiB3ZSB3ZXJlIGxvYWRlZCBhdCBhbGlnbmVkIHRvIGEgMk0gYm91bmRhcnkuICVyYnAgY29udGFpbnMgdGhlCiAJICogZGVjb21wcmVzc2VkIGtlcm5lbCBzdGFydCBhZGRyZXNzLgogCSAqCiAJICogSWYgaXQgaXMgYSByZWxvY2F0YWJsZSBrZXJuZWwgdGhlbiBkZWNvbXByZXNzIGFuZCBydW4gdGhlIGtlcm5lbAogCSAqIGZyb20gbG9hZCBhZGRyZXNzIGFsaWduZWQgdG8gMk1CIGFkZHIsIG90aGVyd2lzZSBkZWNvbXByZXNzIGFuZAotCSAqIHJ1biB0aGUga2VybmVsIGZyb20gQ09ORklHX1BIWVNJQ0FMX1NUQVJUCisJICogcnVuIHRoZSBrZXJuZWwgZnJvbSBMT0FEX1BIWVNJQ0FMX0FERFIKKwkgKgorCSAqIFdlIGNhbm5vdCByZWx5IG9uIHRoZSBjYWxjdWxhdGlvbiBkb25lIGluIDMyLWJpdCBtb2RlLCBzaW5jZSB3ZQorCSAqIG1heSBoYXZlIGJlZW4gaW52b2tlZCB2aWEgdGhlIDY0LWJpdCBlbnRyeSBwb2ludC4KIAkgKi8KIAogCS8qIFN0YXJ0IHdpdGggdGhlIGRlbHRhIHRvIHdoZXJlIHRoZSBrZXJuZWwgd2lsbCBydW4gYXQuICovCiAjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCiAJbGVhcQlzdGFydHVwXzMyKCVyaXApIC8qIC0gJHN0YXJ0dXBfMzIgKi8sICVyYnAKLQlhZGRxCSQoUE1EX1BBR0VfU0laRSAtIDEpLCAlcmJwCi0JYW5kcQkkUE1EX1BBR0VfTUFTSywgJXJicAotCW1vdnEJJXJicCwgJXJieAorCW1vdmwJQlBfa2VybmVsX2FsaWdubWVudCglcnNpKSwgJWVheAorCWRlY2wJJWVheAorCWFkZHEJJXJheCwgJXJicAorCW5vdHEJJXJheAorCWFuZHEJJXJheCwgJXJicAogI2Vsc2UKLQltb3ZxCSRDT05GSUdfUEhZU0lDQUxfU1RBUlQsICVyYnAKLQltb3ZxCSVyYnAsICVyYngKKwltb3ZxCSRMT0FEX1BIWVNJQ0FMX0FERFIsICVyYnAKICNlbmRpZgogCi0JLyogUmVwbGFjZSB0aGUgY29tcHJlc3NlZCBkYXRhIHNpemUgd2l0aCB0aGUgdW5jb21wcmVzc2VkIHNpemUgKi8KLQltb3ZsCWlucHV0X2xlbiglcmlwKSwgJWVheAotCXN1YnEJJXJheCwgJXJieAotCW1vdmwJb3V0cHV0X2xlbiglcmlwKSwgJWVheAotCWFkZHEJJXJheCwgJXJieAotCS8qIEFkZCA4IGJ5dGVzIGZvciBldmVyeSAzMksgaW5wdXQgYmxvY2sgKi8KLQlzaHJxCSQxMiwgJXJheAotCWFkZHEJJXJheCwgJXJieAotCS8qIEFkZCAzMksgKyAxOCBieXRlcyBvZiBleHRyYSBzbGFjayBhbmQgYWxpZ24gb24gYSA0SyBib3VuZGFyeSAqLwotCWFkZHEJJCgzMjc2OCArIDE4ICsgNDA5NSksICVyYngKLQlhbmRxCSR+NDA5NSwgJXJieAorCS8qIFRhcmdldCBhZGRyZXNzIHRvIHJlbG9jYXRlIHRvIGZvciBkZWNvbXByZXNzaW9uICovCisJbGVhcQl6X2V4dHJhY3Rfb2Zmc2V0KCVyYnApLCAlcmJ4CiAKLS8qIENvcHkgdGhlIGNvbXByZXNzZWQga2VybmVsIHRvIHRoZSBlbmQgb2Ygb3VyIGJ1ZmZlcgorCS8qIFNldCB1cCB0aGUgc3RhY2sgKi8KKwlsZWFxCWJvb3Rfc3RhY2tfZW5kKCVyYngpLCAlcnNwCisKKwkvKiBaZXJvIEVGTEFHUyAqLworCXB1c2hxCSQwCisJcG9wZnEKKworLyoKKyAqIENvcHkgdGhlIGNvbXByZXNzZWQga2VybmVsIHRvIHRoZSBlbmQgb2Ygb3VyIGJ1ZmZlcgogICogd2hlcmUgZGVjb21wcmVzc2lvbiBpbiBwbGFjZSBiZWNvbWVzIHNhZmUuCiAgKi8KLQlsZWFxCV9lbmRfYmVmb3JlX3BndCglcmlwKSwgJXI4Ci0JbGVhcQlfZW5kX2JlZm9yZV9wZ3QoJXJieCksICVyOQotCW1vdnEJJF9lbmRfYmVmb3JlX3BndCAvKiAtICRzdGFydHVwXzMyICovLCAlcmN4Ci0xOglzdWJxCSQ4LCAlcjgKLQlzdWJxCSQ4LCAlcjkKLQltb3ZxCTAoJXI4KSwgJXJheAotCW1vdnEJJXJheCwgMCglcjkpCi0Jc3VicQkkOCwgJXJjeAotCWpuegkxYgorCXB1c2hxCSVyc2kKKwlsZWFxCShfYnNzLTgpKCVyaXApLCAlcnNpCisJbGVhcQkoX2Jzcy04KSglcmJ4KSwgJXJkaQorCW1vdnEJJF9ic3MgLyogLSAkc3RhcnR1cF8zMiAqLywgJXJjeAorCXNocnEJJDMsICVyY3gKKwlzdGQKKwlyZXAJbW92c3EKKwljbGQKKwlwb3BxCSVyc2kKIAogLyoKICAqIEp1bXAgdG8gdGhlIHJlbG9jYXRlZCBhZGRyZXNzLgpAQCAtMjYwLDM3ICsyNjYsMjggQEAKIAlsZWFxCXJlbG9jYXRlZCglcmJ4KSwgJXJheAogCWptcAkqJXJheAogCi0uc2VjdGlvbiAiLnRleHQiCisJLnRleHQKIHJlbG9jYXRlZDoKIAogLyoKLSAqIENsZWFyIEJTUworICogQ2xlYXIgQlNTIChzdGFjayBpcyBjdXJyZW50bHkgZW1wdHkpCiAgKi8KLQl4b3JxCSVyYXgsICVyYXgKLQlsZWFxICAgIF9lZGF0YSglcmJ4KSwgJXJkaQotCWxlYXEgICAgX2VuZF9iZWZvcmVfcGd0KCVyYngpLCAlcmN4CisJeG9ybAklZWF4LCAlZWF4CisJbGVhcSAgICBfYnNzKCVyaXApLCAlcmRpCisJbGVhcSAgICBfZWJzcyglcmlwKSwgJXJjeAogCXN1YnEJJXJkaSwgJXJjeAotCWNsZAotCXJlcAotCXN0b3NiCi0KLQkvKiBTZXR1cCB0aGUgc3RhY2sgKi8KLQlsZWFxCWJvb3Rfc3RhY2tfZW5kKCVyaXApLCAlcnNwCi0KLQkvKiB6ZXJvIEVGTEFHUyBhZnRlciBzZXR0aW5nIHJzcCAqLwotCXB1c2hxCSQwCi0JcG9wZnEKKwlzaHJxCSQzLCAlcmN4CisJcmVwCXN0b3NxCiAKIC8qCiAgKiBEbyB0aGUgZGVjb21wcmVzc2lvbiwgYW5kIGp1bXAgdG8gdGhlIG5ldyBrZXJuZWwuLgogICovCi0JcHVzaHEJJXJzaQkJCSMgU2F2ZSB0aGUgcmVhbCBtb2RlIGFyZ3VtZW50Ci0JbW92cQklcnNpLCAlcmRpCQkjIHJlYWwgbW9kZSBhZGRyZXNzCi0JbGVhcQlib290X2hlYXAoJXJpcCksICVyc2kJIyBtYWxsb2MgYXJlYSBmb3IgdW5jb21wcmVzc2lvbgotCWxlYXEJaW5wdXRfZGF0YSglcmlwKSwgJXJkeCAgIyBpbnB1dF9kYXRhCi0JbW92bAlpbnB1dF9sZW4oJXJpcCksICVlYXgKLQltb3ZxCSVyYXgsICVyY3gJCSMgaW5wdXRfbGVuCi0JbW92cQklcmJwLCAlcjgJCSMgb3V0cHV0CisJcHVzaHEJJXJzaQkJCS8qIFNhdmUgdGhlIHJlYWwgbW9kZSBhcmd1bWVudCAqLworCW1vdnEJJXJzaSwgJXJkaQkJLyogcmVhbCBtb2RlIGFkZHJlc3MgKi8KKwlsZWFxCWJvb3RfaGVhcCglcmlwKSwgJXJzaQkvKiBtYWxsb2MgYXJlYSBmb3IgdW5jb21wcmVzc2lvbiAqLworCWxlYXEJaW5wdXRfZGF0YSglcmlwKSwgJXJkeCAgLyogaW5wdXRfZGF0YSAqLworCW1vdmwJJHpfaW5wdXRfbGVuLCAlZWN4CS8qIGlucHV0X2xlbiAqLworCW1vdnEJJXJicCwgJXI4CQkvKiBvdXRwdXQgdGFyZ2V0IGFkZHJlc3MgKi8KIAljYWxsCWRlY29tcHJlc3Nfa2VybmVsCiAJcG9wcQklcnNpCiAKQEAgLTMxMSwxMSArMzA4LDIxIEBACiAJLnF1YWQgICAweDAwMDAwMDAwMDAwMDAwMDAJLyogVFMgY29udGludWVkICovCiBnZHRfZW5kOgogCi0uYnNzCi0vKiBTdGFjayBhbmQgaGVhcCBmb3IgdW5jb21wcmVzc2lvbiAqLwotLmJhbGlnbiA0CisvKgorICogU3RhY2sgYW5kIGhlYXAgZm9yIHVuY29tcHJlc3Npb24KKyAqLworCS5ic3MKKwkuYmFsaWduIDQKIGJvb3RfaGVhcDoKIAkuZmlsbCBCT09UX0hFQVBfU0laRSwgMSwgMAogYm9vdF9zdGFjazoKIAkuZmlsbCBCT09UX1NUQUNLX1NJWkUsIDEsIDAKIGJvb3Rfc3RhY2tfZW5kOgorCisvKgorICogU3BhY2UgZm9yIHBhZ2UgdGFibGVzIChub3QgaW4gLmJzcyBzbyBub3QgemVyb2VkKQorICovCisJLnNlY3Rpb24gIi5wZ3RhYmxlIiwiYSIsQG5vYml0cworCS5iYWxpZ24gNDA5NgorcGd0YWJsZToKKwkuZmlsbCA2KjQwOTYsIDEsIDAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCmluZGV4IGU0NWJlNzMuLjg0MmIyYTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYwpAQCAtMzI1LDIwICszMjUsMTggQEAKIAlmcmVlX21lbV9wdHIgICAgID0gaGVhcDsJLyogSGVhcCAqLwogCWZyZWVfbWVtX2VuZF9wdHIgPSBoZWFwICsgQk9PVF9IRUFQX1NJWkU7CiAKKwlpZiAoKHVuc2lnbmVkIGxvbmcpb3V0cHV0ICYgKE1JTl9LRVJORUxfQUxJR04gLSAxKSkKKwkJZXJyb3IoIkRlc3RpbmF0aW9uIGFkZHJlc3MgaW5hcHByb3ByaWF0ZWx5IGFsaWduZWQiKTsKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JaWYgKCh1bnNpZ25lZCBsb25nKW91dHB1dCAmIChfX0tFUk5FTF9BTElHTiAtIDEpKQotCQllcnJvcigiRGVzdGluYXRpb24gYWRkcmVzcyBub3QgMk0gYWxpZ25lZCIpOwotCWlmICgodW5zaWduZWQgbG9uZylvdXRwdXQgPj0gMHhmZmZmZmZmZmZmVUwpCisJaWYgKGhlYXAgPiAweDNmZmZmZmZmZmZmZlVMKQogCQllcnJvcigiRGVzdGluYXRpb24gYWRkcmVzcyB0b28gbGFyZ2UiKTsKICNlbHNlCi0JaWYgKCh1MzIpb3V0cHV0ICYgKENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKQotCQllcnJvcigiRGVzdGluYXRpb24gYWRkcmVzcyBub3QgQ09ORklHX1BIWVNJQ0FMX0FMSUdOIGFsaWduZWQiKTsKIAlpZiAoaGVhcCA+ICgoLV9fUEFHRV9PRkZTRVQtKDUxMjw8MjApLTEpICYgMHg3ZmZmZmZmZikpCiAJCWVycm9yKCJEZXN0aW5hdGlvbiBhZGRyZXNzIHRvbyBsYXJnZSIpOwotI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKLQlpZiAoKHUzMilvdXRwdXQgIT0gTE9BRF9QSFlTSUNBTF9BRERSKQotCQllcnJvcigiV3JvbmcgZGVzdGluYXRpb24gYWRkcmVzcyIpOwogI2VuZGlmCisjaWZuZGVmIENPTkZJR19SRUxPQ0FUQUJMRQorCWlmICgodW5zaWduZWQgbG9uZylvdXRwdXQgIT0gTE9BRF9QSFlTSUNBTF9BRERSKQorCQllcnJvcigiV3JvbmcgZGVzdGluYXRpb24gYWRkcmVzcyIpOwogI2VuZGlmCiAKIAlpZiAoIXF1aWV0KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21rcGlnZ3kuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9ta3BpZ2d5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiZDM2YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9ta3BpZ2d5LmMKQEAgLTAsMCArMSw5NyBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAgMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqICAwMjExMC0xMzAxLCBVU0EuCisgKgorICogIEguIFBldGVyIEFudmluIDxocGFAbGludXguaW50ZWwuY29tPgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBDb21wdXRlIHRoZSBkZXNpcmVkIGxvYWQgb2Zmc2V0IGZyb20gYSBjb21wcmVzc2VkIHByb2dyYW07IG91dHB1dHMKKyAqIGEgc21hbGwgYXNzZW1ibHkgd3JhcHBlciB3aXRoIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2xzIGRlZmluZWQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworc3RhdGljIHVpbnQzMl90IGdldGxlMzIoY29uc3Qgdm9pZCAqcCkKK3sKKwljb25zdCB1aW50OF90ICpjcCA9IHA7CisKKwlyZXR1cm4gKHVpbnQzMl90KWNwWzBdICsgKCh1aW50MzJfdCljcFsxXSA8PCA4KSArCisJCSgodWludDMyX3QpY3BbMl0gPDwgMTYpICsgKCh1aW50MzJfdCljcFszXSA8PCAyNCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJdWludDMyX3Qgb2xlbjsKKwlsb25nIGlsZW47CisJdW5zaWduZWQgbG9uZyBvZmZzOworCUZJTEUgKmY7CisKKwlpZiAoYXJnYyA8IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgY29tcHJlc3NlZF9maWxlXG4iLCBhcmd2WzBdKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogR2V0IHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXByZXNzZWQga2VybmVsIGltYWdlIGZpcnN0ICovCisKKwlmID0gZm9wZW4oYXJndlsxXSwgInIiKTsKKwlpZiAoIWYpIHsKKwkJcGVycm9yKGFyZ3ZbMV0pOworCQlyZXR1cm4gMTsKKwl9CisKKworCWlmIChmc2VlayhmLCAtNEwsIFNFRUtfRU5EKSkgeworCQlwZXJyb3IoYXJndlsxXSk7CisJfQorCWZyZWFkKCZvbGVuLCBzaXplb2Ygb2xlbiwgMSwgZik7CisJaWxlbiA9IGZ0ZWxsKGYpOworCW9sZW4gPSBnZXRsZTMyKCZvbGVuKTsKKwlmY2xvc2UoZik7CisKKwkvKgorCSAqIE5vdyB3ZSBoYXZlIHRoZSBpbnB1dCAoY29tcHJlc3NlZCkgYW5kIG91dHB1dCAodW5jb21wcmVzc2VkKQorCSAqIHNpemVzLCBjb21wdXRlIHRoZSBuZWNlc3NhcnkgZGVjb21wcmVzc2lvbiBvZmZzZXQuLi4KKwkgKi8KKworCW9mZnMgPSAob2xlbiA+IGlsZW4pID8gb2xlbiAtIGlsZW4gOiAwOworCW9mZnMgKz0gb2xlbiA+PiAxMjsJLyogQWRkIDggYnl0ZXMgZm9yIGVhY2ggMzJLIGJsb2NrICovCisJb2ZmcyArPSAzMioxMDI0ICsgMTg7CS8qIEFkZCAzMksgKyAxOCBieXRlcyBzbGFjayAqLworCW9mZnMgPSAob2Zmcys0MDk1KSAmIH40MDk1OyAvKiBSb3VuZCB0byBhIDRLIGJvdW5kYXJ5ICovCisKKwlwcmludGYoIi5zZWN0aW9uIFwiLnJvZGF0YS5jb21wcmVzc2VkXCIsXCJhXCIsQHByb2diaXRzXG4iKTsKKwlwcmludGYoIi5nbG9ibCB6X2lucHV0X2xlblxuIik7CisJcHJpbnRmKCJ6X2lucHV0X2xlbiA9ICVsdVxuIiwgaWxlbik7CisJcHJpbnRmKCIuZ2xvYmwgel9vdXRwdXRfbGVuXG4iKTsKKwlwcmludGYoInpfb3V0cHV0X2xlbiA9ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpb2xlbik7CisJcHJpbnRmKCIuZ2xvYmwgel9leHRyYWN0X29mZnNldFxuIik7CisJcHJpbnRmKCJ6X2V4dHJhY3Rfb2Zmc2V0ID0gMHglbHhcbiIsIG9mZnMpOworCS8qIHpfZXh0cmFjdF9vZmZzZXRfbmVnYXRpdmUgYWxsb3dzIHNpbXBsaWZpY2F0aW9uIG9mIGhlYWRfMzIuUyAqLworCXByaW50ZigiLmdsb2JsIHpfZXh0cmFjdF9vZmZzZXRfbmVnYXRpdmVcbiIpOworCXByaW50Zigiel9leHRyYWN0X29mZnNldF9uZWdhdGl2ZSA9IC0weCVseFxuIiwgb2Zmcyk7CisKKwlwcmludGYoIi5nbG9ibCBpbnB1dF9kYXRhLCBpbnB1dF9kYXRhX2VuZFxuIik7CisJcHJpbnRmKCJpbnB1dF9kYXRhOlxuIik7CisJcHJpbnRmKCIuaW5jYmluIFwiJXNcIlxuIiwgYXJndlsxXSk7CisJcHJpbnRmKCJpbnB1dF9kYXRhX2VuZDpcbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuUyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzUzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuUwpAQCAtMCwwICsxLDY1IEBACitPVVRQVVRfRk9STUFUKENPTkZJR19PVVRQVVRfRk9STUFULCBDT05GSUdfT1VUUFVUX0ZPUk1BVCwgQ09ORklHX09VVFBVVF9GT1JNQVQpCisKKyN1bmRlZiBpMzg2CisKKyNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCitFTlRSWShzdGFydHVwXzY0KQorI2Vsc2UKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShzdGFydHVwXzMyKQorI2VuZGlmCisKK1NFQ1RJT05TCit7CisJLyogQmUgY2FyZWZ1bCBwYXJ0cyBvZiBoZWFkXzY0LlMgYXNzdW1lIHN0YXJ0dXBfMzIgaXMgYXQKKwkgKiBhZGRyZXNzIDAuCisJICovCisJLiA9IDA7CisJLnRleHQuaGVhZCA6IHsKKwkJX2hlYWQgPSAuIDsKKwkJKigudGV4dC5oZWFkKQorCQlfZWhlYWQgPSAuIDsKKwl9CisJLnJvZGF0YS5jb21wcmVzc2VkIDogeworCQkqKC5yb2RhdGEuY29tcHJlc3NlZCkKKwl9CisJLnRleHQgOgl7CisJCV90ZXh0ID0gLjsgCS8qIFRleHQgKi8KKwkJKigudGV4dCkKKwkJKigudGV4dC4qKQorCQlfZXRleHQgPSAuIDsKKwl9CisJLnJvZGF0YSA6IHsKKwkJX3JvZGF0YSA9IC4gOworCQkqKC5yb2RhdGEpCSAvKiByZWFkLW9ubHkgZGF0YSAqLworCQkqKC5yb2RhdGEuKikKKwkJX2Vyb2RhdGEgPSAuIDsKKwl9CisJLmRhdGEgOgl7CisJCV9kYXRhID0gLiA7CisJCSooLmRhdGEpCisJCSooLmRhdGEuKikKKwkJX2VkYXRhID0gLiA7CisJfQorCS4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKKwkuYnNzIDogeworCQlfYnNzID0gLiA7CisJCSooLmJzcykKKwkJKiguYnNzLiopCisJCSooQ09NTU9OKQorCQkuID0gQUxJR04oOCk7CS8qIEZvciBjb252ZW5pZW5jZSBkdXJpbmcgemVyb2luZyAqLworCQlfZWJzcyA9IC47CisJfQorI2lmZGVmIENPTkZJR19YODZfNjQKKyAgICAgICAuID0gQUxJR04oUEFHRV9TSVpFKTsKKyAgICAgICAucGd0YWJsZSA6IHsKKwkJX3BndGFibGUgPSAuIDsKKwkJKigucGd0YWJsZSkKKwkJX2VwZ3RhYmxlID0gLiA7CisJfQorI2VuZGlmCisJX2VuZCA9IC47Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMjM4MmEuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXguc2NyCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotU0VDVElPTlMKLXsKLSAgLnJvZGF0YS5jb21wcmVzc2VkIDogewotCWlucHV0X2xlbiA9IC47Ci0JTE9ORyhpbnB1dF9kYXRhX2VuZCAtIGlucHV0X2RhdGEpIGlucHV0X2RhdGEgPSAuOwotCSooLmRhdGEpCi0Jb3V0cHV0X2xlbiA9IC4gLSA0OwotCWlucHV0X2RhdGFfZW5kID0gLjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eF8zMi5sZHMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eF8zMi5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2M0ODMuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXhfMzIubGRzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotT1VUUFVUX0ZPUk1BVCgiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiKQotT1VUUFVUX0FSQ0goaTM4NikKLUVOVFJZKHN0YXJ0dXBfMzIpCi1TRUNUSU9OUwotewotCS8qIEJlIGNhcmVmdWwgcGFydHMgb2YgaGVhZF8zMi5TIGFzc3VtZSBzdGFydHVwXzMyIGlzIGF0Ci0JICogYWRkcmVzcyAwLgotCSAqLwotCS4gPSAwOwotCS50ZXh0LmhlYWQgOiB7Ci0JCV9oZWFkID0gLiA7Ci0JCSooLnRleHQuaGVhZCkKLQkJX2VoZWFkID0gLiA7Ci0JfQotCS5yb2RhdGEuY29tcHJlc3NlZCA6IHsKLQkJKigucm9kYXRhLmNvbXByZXNzZWQpCi0JfQotCS50ZXh0IDoJewotCQlfdGV4dCA9IC47IAkvKiBUZXh0ICovCi0JCSooLnRleHQpCi0JCSooLnRleHQuKikKLQkJX2V0ZXh0ID0gLiA7Ci0JfQotCS5yb2RhdGEgOiB7Ci0JCV9yb2RhdGEgPSAuIDsKLQkJKigucm9kYXRhKQkgLyogcmVhZC1vbmx5IGRhdGEgKi8KLQkJKigucm9kYXRhLiopCi0JCV9lcm9kYXRhID0gLiA7Ci0JfQotCS5kYXRhIDoJewotCQlfZGF0YSA9IC4gOwotCQkqKC5kYXRhKQotCQkqKC5kYXRhLiopCi0JCV9lZGF0YSA9IC4gOwotCX0KLQkuYnNzIDogewotCQlfYnNzID0gLiA7Ci0JCSooLmJzcykKLQkJKiguYnNzLiopCi0JCSooQ09NTU9OKQotCQlfZW5kID0gLiA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXhfNjQubGRzIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXhfNjQubGRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWYxYWM4Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4XzY0LmxkcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLU9VVFBVVF9GT1JNQVQoImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiLCAiZWxmNjQteDg2LTY0IikKLU9VVFBVVF9BUkNIKGkzODY6eDg2LTY0KQotRU5UUlkoc3RhcnR1cF82NCkKLVNFQ1RJT05TCi17Ci0JLyogQmUgY2FyZWZ1bCBwYXJ0cyBvZiBoZWFkXzY0LlMgYXNzdW1lIHN0YXJ0dXBfMzIgaXMgYXQKLQkgKiBhZGRyZXNzIDAuCi0JICovCi0JLiA9IDA7Ci0JLnRleHQuaGVhZCA6IHsKLQkJX2hlYWQgPSAuIDsKLQkJKigudGV4dC5oZWFkKQotCQlfZWhlYWQgPSAuIDsKLQl9Ci0JLnJvZGF0YS5jb21wcmVzc2VkIDogewotCQkqKC5yb2RhdGEuY29tcHJlc3NlZCkKLQl9Ci0JLnRleHQgOgl7Ci0JCV90ZXh0ID0gLjsgCS8qIFRleHQgKi8KLQkJKigudGV4dCkKLQkJKigudGV4dC4qKQotCQlfZXRleHQgPSAuIDsKLQl9Ci0JLnJvZGF0YSA6IHsKLQkJX3JvZGF0YSA9IC4gOwotCQkqKC5yb2RhdGEpCSAvKiByZWFkLW9ubHkgZGF0YSAqLwotCQkqKC5yb2RhdGEuKikKLQkJX2Vyb2RhdGEgPSAuIDsKLQl9Ci0JLmRhdGEgOgl7Ci0JCV9kYXRhID0gLiA7Ci0JCSooLmRhdGEpCi0JCSooLmRhdGEuKikKLQkJX2VkYXRhID0gLiA7Ci0JfQotCS5ic3MgOiB7Ci0JCV9ic3MgPSAuIDsKLQkJKiguYnNzKQotCQkqKC5ic3MuKikKLQkJKihDT01NT04pCi0JCS4gPSBBTElHTig4KTsKLQkJX2VuZF9iZWZvcmVfcGd0ID0gLiA7Ci0JCS4gPSBBTElHTig0MDk2KTsKLQkJcGd0YWJsZSA9IC4gOwotCQkuID0gLiArIDQwOTYgKiA2OwotCQlfZWJzcyA9IC47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9lZGQuYyBiL2FyY2gveDg2L2Jvb3QvZWRkLmMKaW5kZXggMWFhZThmMy4uYzUwMWE1YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9lZGQuYworKysgYi9hcmNoL3g4Ni9ib290L2VkZC5jCkBAIC0yLDYgKzIsNyBAQAogICoKICAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKiAgIENvcHlyaWdodCAyMDA3IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCiAgKgogICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKICAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCkBAIC0yMiwxNyArMjMsMTcgQEAKICAqLwogc3RhdGljIGludCByZWFkX21icih1OCBkZXZubywgdm9pZCAqYnVmKQogewotCXUxNiBheCwgYngsIGN4LCBkeDsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAotCWF4ID0gMHgwMjAxOwkJLyogTGVnYWN5IFJlYWQsIG9uZSBzZWN0b3IgKi8KLQljeCA9IDB4MDAwMTsJCS8qIFNlY3RvciAwLTAtMSAqLwotCWR4ID0gZGV2bm87Ci0JYnggPSAoc2l6ZV90KWJ1ZjsKLQlhc20gdm9sYXRpbGUoInB1c2hmbDsgc3RjOyBpbnQgJDB4MTM7IHNldGMgJSVhbDsgcG9wZmwiCi0JCSAgICAgOiAiK2EiIChheCksICIrYyIgKGN4KSwgIitkIiAoZHgpLCAiK2IiIChieCkKLQkJICAgICA6IDogImVzaSIsICJlZGkiLCAibWVtb3J5Iik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweDAyMDE7CQkvKiBMZWdhY3kgUmVhZCwgb25lIHNlY3RvciAqLworCWlyZWcuY3ggPSAweDAwMDE7CQkvKiBTZWN0b3IgMC0wLTEgKi8KKwlpcmVnLmRsID0gZGV2bm87CisJaXJlZy5ieCA9IChzaXplX3QpYnVmOwogCi0JcmV0dXJuIC0odTgpYXg7CQkvKiAwIG9yIC0xICovCisJaW50Y2FsbCgweDEzLCAmaXJlZywgJm9yZWcpOworCisJcmV0dXJuIC0ob3JlZy5lZmxhZ3MgJiBYODZfRUZMQUdTX0NGKTsgLyogMCBvciAtMSAqLwogfQogCiBzdGF0aWMgdTMyIHJlYWRfbWJyX3NpZyh1OCBkZXZubywgc3RydWN0IGVkZF9pbmZvICplaSwgdTMyICptYnJzaWcpCkBAIC03Miw1NiArNzMsNDYgQEAKIAogc3RhdGljIGludCBnZXRfZWRkX2luZm8odTggZGV2bm8sIHN0cnVjdCBlZGRfaW5mbyAqZWkpCiB7Ci0JdTE2IGF4LCBieCwgY3gsIGR4LCBkaTsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAogCW1lbXNldChlaSwgMCwgc2l6ZW9mICplaSk7CiAKIAkvKiBDaGVjayBFeHRlbnNpb25zIFByZXNlbnQgKi8KIAotCWF4ID0gMHg0MTAwOwotCWJ4ID0gRURETUFHSUMxOwotCWR4ID0gZGV2bm87Ci0JYXNtKCJwdXNoZmw7IHN0YzsgaW50ICQweDEzOyBzZXRjICUlYWw7IHBvcGZsIgotCSAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpLCAiPWMiIChjeCksICIrZCIgKGR4KQotCSAgICA6IDogImVzaSIsICJlZGkiKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5haCA9IDB4NDE7CisJaXJlZy5ieCA9IEVERE1BR0lDMTsKKwlpcmVnLmRsID0gZGV2bm87CisJaW50Y2FsbCgweDEzLCAmaXJlZywgJm9yZWcpOwogCi0JaWYgKCh1OClheCkKKwlpZiAob3JlZy5lZmxhZ3MgJiBYODZfRUZMQUdTX0NGKQogCQlyZXR1cm4gLTE7CS8qIE5vIGV4dGVuZGVkIGluZm9ybWF0aW9uICovCiAKLQlpZiAoYnggIT0gRURETUFHSUMyKQorCWlmIChvcmVnLmJ4ICE9IEVERE1BR0lDMikKIAkJcmV0dXJuIC0xOwogCiAJZWktPmRldmljZSAgPSBkZXZubzsKLQllaS0+dmVyc2lvbiA9IGF4ID4+IDg7CS8qIEVERCB2ZXJzaW9uIG51bWJlciAqLwotCWVpLT5pbnRlcmZhY2Vfc3VwcG9ydCA9IGN4OyAvKiBFREQgZnVuY3Rpb25hbGl0eSBzdWJzZXRzICovCisJZWktPnZlcnNpb24gPSBvcmVnLmFoOwkJIC8qIEVERCB2ZXJzaW9uIG51bWJlciAqLworCWVpLT5pbnRlcmZhY2Vfc3VwcG9ydCA9IG9yZWcuY3g7IC8qIEVERCBmdW5jdGlvbmFsaXR5IHN1YnNldHMgKi8KIAogCS8qIEV4dGVuZGVkIEdldCBEZXZpY2UgUGFyYW1ldGVycyAqLwogCiAJZWktPnBhcmFtcy5sZW5ndGggPSBzaXplb2YoZWktPnBhcmFtcyk7Ci0JYXggPSAweDQ4MDA7Ci0JZHggPSBkZXZubzsKLQlhc20oInB1c2hmbDsgaW50ICQweDEzOyBwb3BmbCIKLQkgICAgOiAiK2EiIChheCksICIrZCIgKGR4KSwgIj1tIiAoZWktPnBhcmFtcykKLQkgICAgOiAiUyIgKCZlaS0+cGFyYW1zKQotCSAgICA6ICJlYngiLCAiZWN4IiwgImVkaSIpOworCWlyZWcuYWggPSAweDQ4OworCWlyZWcuc2kgPSAoc2l6ZV90KSZlaS0+cGFyYW1zOworCWludGNhbGwoMHgxMywgJmlyZWcsICZvcmVnKTsKIAogCS8qIEdldCBsZWdhY3kgQ0hTIHBhcmFtZXRlcnMgKi8KIAogCS8qIFJhbGYgQnJvd24gcmVjb21tZW5kcyBzZXR0aW5nIEVTOkRJIHRvIDA6MCAqLwotCWF4ID0gMHgwODAwOwotCWR4ID0gZGV2bm87Ci0JZGkgPSAwOwotCWFzbSgicHVzaHcgJSVlczsgIgotCSAgICAibW92dyAlJWRpLCUlZXM7ICIKLQkgICAgInB1c2hmbDsgc3RjOyBpbnQgJDB4MTM7IHNldGMgJSVhbDsgcG9wZmw7ICIKLQkgICAgInBvcHcgJSVlcyIKLQkgICAgOiAiK2EiIChheCksICI9YiIgKGJ4KSwgIj1jIiAoY3gpLCAiK2QiIChkeCksICIrRCIgKGRpKQotCSAgICA6IDogImVzaSIpOworCWlyZWcuYWggPSAweDA4OworCWlyZWcuZXMgPSAwOworCWludGNhbGwoMHgxMywgJmlyZWcsICZvcmVnKTsKIAotCWlmICgodTgpYXggPT0gMCkgewotCQllaS0+bGVnYWN5X21heF9jeWxpbmRlciA9IChjeCA+PiA4KSArICgoY3ggJiAweGMwKSA8PCAyKTsKLQkJZWktPmxlZ2FjeV9tYXhfaGVhZCA9IGR4ID4+IDg7Ci0JCWVpLT5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2sgPSBjeCAmIDB4M2Y7CisJaWYgKCEob3JlZy5lZmxhZ3MgJiBYODZfRUZMQUdTX0NGKSkgeworCQllaS0+bGVnYWN5X21heF9jeWxpbmRlciA9IG9yZWcuY2ggKyAoKG9yZWcuY2wgJiAweGMwKSA8PCAyKTsKKwkJZWktPmxlZ2FjeV9tYXhfaGVhZCA9IG9yZWcuZGg7CisJCWVpLT5sZWdhY3lfc2VjdG9yc19wZXJfdHJhY2sgPSBvcmVnLmNsICYgMHgzZjsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvaGVhZGVyLlMgYi9hcmNoL3g4Ni9ib290L2hlYWRlci5TCmluZGV4IDVkODRkMWMuLmIzMWNjNTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvaGVhZGVyLlMKKysrIGIvYXJjaC94ODYvYm9vdC9oZWFkZXIuUwpAQCAtMjIsNyArMjIsOCBAQAogI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSAiYm9vdC5oIgotI2luY2x1ZGUgIm9mZnNldHMuaCIKKyNpbmNsdWRlICJ2b2Zmc2V0LmgiCisjaW5jbHVkZSAiem9mZnNldC5oIgogCiBCT09UU0VHCQk9IDB4MDdDMAkJLyogb3JpZ2luYWwgYWRkcmVzcyBvZiBib290LXNlY3RvciAqLwogU1lTU0VHCQk9IDB4MTAwMAkJLyogaGlzdG9yaWNhbCBsb2FkIGFkZHJlc3MgPj4gNCAqLwpAQCAtMTE1LDcgKzExNiw3IEBACiAJIyBQYXJ0IDIgb2YgdGhlIGhlYWRlciwgZnJvbSB0aGUgb2xkIHNldHVwLlMKIAogCQkuYXNjaWkJIkhkclMiCQkjIGhlYWRlciBzaWduYXR1cmUKLQkJLndvcmQJMHgwMjA5CQkjIGhlYWRlciB2ZXJzaW9uIG51bWJlciAoPj0gMHgwMTA1KQorCQkud29yZAkweDAyMGEJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCiAJCQkJCSMgb3IgZWxzZSBvbGQgbG9hZGxpbi0xLjUgd2lsbCBmYWlsKQogCQkuZ2xvYmwgcmVhbG1vZGVfc3d0Y2gKIHJlYWxtb2RlX3N3dGNoOgkud29yZAkwLCAwCQkjIGRlZmF1bHRfc3dpdGNoLCBTRVRVUFNFRwpAQCAtMTY4LDcgKzE2OSwxMSBAQAogCQkJCQkjIGVuZCBvZiBzZXR1cCBjb2RlIGNhbiBiZSB1c2VkIGJ5IHNldHVwCiAJCQkJCSMgZm9yIGxvY2FsIGhlYXAgcHVycG9zZXMuCiAKLXBhZDE6CQkud29yZAkwCitleHRfbG9hZGVyX3ZlcjoKKwkJLmJ5dGUJMAkJIyBFeHRlbmRlZCBib290IGxvYWRlciB2ZXJzaW9uCitleHRfbG9hZGVyX3R5cGU6CisJCS5ieXRlCTAJCSMgRXh0ZW5kZWQgYm9vdCBsb2FkZXIgdHlwZQorCiBjbWRfbGluZV9wdHI6CS5sb25nCTAJCSMgKEhlYWRlciB2ZXJzaW9uIDB4MDIwMiBvciBsYXRlcikKIAkJCQkJIyBJZiBub256ZXJvLCBhIDMyLWJpdCBwb2ludGVyCiAJCQkJCSMgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCkBAIC0yMDAsNyArMjA1LDcgQEAKICNlbHNlCiByZWxvY2F0YWJsZV9rZXJuZWw6ICAgIC5ieXRlIDAKICNlbmRpZgotcGFkMjoJCQkuYnl0ZSAwCittaW5fYWxpZ25tZW50OgkJLmJ5dGUgTUlOX0tFUk5FTF9BTElHTl9MRzIJIyBtaW5pbXVtIGFsaWdubWVudAogcGFkMzoJCQkud29yZCAwCiAKIGNtZGxpbmVfc2l6ZTogICAubG9uZyAgIENPTU1BTkRfTElORV9TSVpFLTEgICAgICNsZW5ndGggb2YgdGhlIGNvbW1hbmQgbGluZSwKQEAgLTIxMiwxNiArMjE3LDI3IEBACiAKIGhhcmR3YXJlX3N1YmFyY2hfZGF0YToJLnF1YWQgMAogCi1wYXlsb2FkX29mZnNldDoJCS5sb25nIGlucHV0X2RhdGEKLXBheWxvYWRfbGVuZ3RoOgkJLmxvbmcgaW5wdXRfZGF0YV9lbmQtaW5wdXRfZGF0YQorcGF5bG9hZF9vZmZzZXQ6CQkubG9uZyBaT19pbnB1dF9kYXRhCitwYXlsb2FkX2xlbmd0aDoJCS5sb25nIFpPX3pfaW5wdXRfbGVuCiAKIHNldHVwX2RhdGE6CQkucXVhZCAwCQkJIyA2NC1iaXQgcGh5c2ljYWwgcG9pbnRlciB0bwogCQkJCQkJIyBzaW5nbGUgbGlua2VkIGxpc3Qgb2YKIAkJCQkJCSMgc3RydWN0IHNldHVwX2RhdGEKIAorcHJlZl9hZGRyZXNzOgkJLnF1YWQgTE9BRF9QSFlTSUNBTF9BRERSCSMgcHJlZmVycmVkIGxvYWQgYWRkcgorCisjZGVmaW5lIFpPX0lOSVRfU0laRQkoWk9fX2VuZCAtIFpPX3N0YXJ0dXBfMzIgKyBaT196X2V4dHJhY3Rfb2Zmc2V0KQorI2RlZmluZSBWT19JTklUX1NJWkUJKFZPX19lbmQgLSBWT19fdGV4dCkKKyNpZiBaT19JTklUX1NJWkUgPiBWT19JTklUX1NJWkUKKyNkZWZpbmUgSU5JVF9TSVpFIFpPX0lOSVRfU0laRQorI2Vsc2UKKyNkZWZpbmUgSU5JVF9TSVpFIFZPX0lOSVRfU0laRQorI2VuZGlmCitpbml0X3NpemU6CQkubG9uZyBJTklUX1NJWkUJCSMga2VybmVsIGluaXRpYWxpemF0aW9uIHNpemUKKwogIyBFbmQgb2Ygc2V0dXAgaGVhZGVyICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKLQkuc2VjdGlvbiAiLmluaXR0ZXh0IiwgImF4IgorCS5zZWN0aW9uICIuZW50cnl0ZXh0IiwgImF4Igogc3RhcnRfb2Zfc2V0dXA6CiAjaWZkZWYgU0FGRV9SRVNFVF9ESVNLX0NPTlRST0xMRVIKICMgUmVzZXQgdGhlIGRpc2sgY29udHJvbGxlci4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvbWFpbi5jIGIvYXJjaC94ODYvYm9vdC9tYWluLmMKaW5kZXggNThmMDQxNS4uMTQwMTcyYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9tYWluLmMKKysrIGIvYXJjaC94ODYvYm9vdC9tYWluLmMKQEAgLTIsNiArMiw3IEBACiAgKgogICogICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKICAqICAgQ29weXJpZ2h0IDIwMDcgclBhdGgsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KICAqCiAgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgogICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KQEAgLTYxLDExICs2MiwxMCBAQAogICovCiBzdGF0aWMgdm9pZCBrZXlib2FyZF9zZXRfcmVwZWF0KHZvaWQpCiB7Ci0JdTE2IGF4ID0gMHgwMzA1OwotCXUxNiBieCA9IDA7Ci0JYXNtIHZvbGF0aWxlKCJpbnQgJDB4MTYiCi0JCSAgICAgOiAiK2EiIChheCksICIrYiIgKGJ4KQotCQkgICAgIDogOiAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7CisJc3RydWN0IGJpb3NyZWdzIGlyZWc7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweDAzMDU7CisJaW50Y2FsbCgweDE2LCAmaXJlZywgTlVMTCk7CiB9CiAKIC8qCkBAIC03MywxOCArNzMsMjIgQEAKICAqLwogc3RhdGljIHZvaWQgcXVlcnlfaXN0KHZvaWQpCiB7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CisKIAkvKiBTb21lIG9sZGVyIEJJT1NlcyBhcHBhcmVudGx5IGNyYXNoIG9uIHRoaXMgY2FsbCwgc28gZmlsdGVyCiAJICAgaXQgZnJvbSBtYWNoaW5lcyB0b28gb2xkIHRvIGhhdmUgU3BlZWRTdGVwIGF0IGFsbC4gKi8KIAlpZiAoY3B1LmxldmVsIDwgNikKIAkJcmV0dXJuOwogCi0JYXNtKCJpbnQgJDB4MTUiCi0JICAgIDogIj1hIiAoYm9vdF9wYXJhbXMuaXN0X2luZm8uc2lnbmF0dXJlKSwKLQkgICAgICAiPWIiIChib290X3BhcmFtcy5pc3RfaW5mby5jb21tYW5kKSwKLQkgICAgICAiPWMiIChib290X3BhcmFtcy5pc3RfaW5mby5ldmVudCksCi0JICAgICAgIj1kIiAoYm9vdF9wYXJhbXMuaXN0X2luZm8ucGVyZl9sZXZlbCkKLQkgICAgOiAiYSIgKDB4MDAwMGU5ODApLAkgLyogSVNUIFN1cHBvcnQgKi8KLQkgICAgICAiZCIgKDB4NDc1MzQ5NDMpKTsgLyogUmVxdWVzdCB2YWx1ZSAqLworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmF4ICA9IDB4ZTk4MDsJIC8qIElTVCBTdXBwb3J0ICovCisJaXJlZy5lZHggPSAweDQ3NTM0OTQzOwkgLyogUmVxdWVzdCB2YWx1ZSAqLworCWludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKKworCWJvb3RfcGFyYW1zLmlzdF9pbmZvLnNpZ25hdHVyZSAgPSBvcmVnLmVheDsKKwlib290X3BhcmFtcy5pc3RfaW5mby5jb21tYW5kICAgID0gb3JlZy5lYng7CisJYm9vdF9wYXJhbXMuaXN0X2luZm8uZXZlbnQgICAgICA9IG9yZWcuZWN4OworCWJvb3RfcGFyYW1zLmlzdF9pbmZvLnBlcmZfbGV2ZWwgPSBvcmVnLmVkeDsKIH0KIAogLyoKQEAgLTkzLDEzICs5NywxMiBAQAogc3RhdGljIHZvaWQgc2V0X2Jpb3NfbW9kZSh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfNjQKLQl1MzIgZWF4LCBlYng7CisJc3RydWN0IGJpb3NyZWdzIGlyZWc7CiAKLQllYXggPSAweGVjMDA7Ci0JZWJ4ID0gMjsKLQlhc20gdm9sYXRpbGUoImludCAkMHgxNSIKLQkJICAgICA6ICIrYSIgKGVheCksICIrYiIgKGVieCkKLQkJICAgICA6IDogImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmF4ID0gMHhlYzAwOworCWlyZWcuYnggPSAyOworCWludGNhbGwoMHgxNSwgJmlyZWcsIE5VTEwpOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvbWNhLmMgYi9hcmNoL3g4Ni9ib290L21jYS5jCmluZGV4IDkxMWVhYWUuLmE5NWE1MzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvbWNhLmMKKysrIGIvYXJjaC94ODYvYm9vdC9tY2EuYwpAQCAtMiw2ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgogICoKICAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCiAgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgpAQCAtMTYsMjYgKzE3LDIyIEBACiAKIGludCBxdWVyeV9tY2Eodm9pZCkKIHsKLQl1OCBlcnI7Ci0JdTE2IGVzLCBieCwgbGVuOworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOworCXUxNiBsZW47CiAKLQlhc20oInB1c2h3ICUlZXMgOyAiCi0JICAgICJpbnQgJDB4MTUgOyAiCi0JICAgICJzZXRjICUwIDsgIgotCSAgICAibW92dyAlJWVzLCAlMSA7ICIKLQkgICAgInBvcHcgJSVlcyIKLQkgICAgOiAiPWFjZCIgKGVyciksICI9YWNkU0QiIChlcyksICI9YiIgKGJ4KQotCSAgICA6ICJhIiAoMHhjMDAwKSk7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYWggPSAweGMwOworCWludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKIAotCWlmIChlcnIpCisJaWYgKG9yZWcuZWZsYWdzICYgWDg2X0VGTEFHU19DRikKIAkJcmV0dXJuIC0xOwkvKiBObyBNQ0EgcHJlc2VudCAqLwogCi0Jc2V0X2ZzKGVzKTsKLQlsZW4gPSByZGZzMTYoYngpOworCXNldF9mcyhvcmVnLmVzKTsKKwlsZW4gPSByZGZzMTYob3JlZy5ieCk7CiAKIAlpZiAobGVuID4gc2l6ZW9mKGJvb3RfcGFyYW1zLnN5c19kZXNjX3RhYmxlKSkKIAkJbGVuID0gc2l6ZW9mKGJvb3RfcGFyYW1zLnN5c19kZXNjX3RhYmxlKTsKIAotCWNvcHlfZnJvbV9mcygmYm9vdF9wYXJhbXMuc3lzX2Rlc2NfdGFibGUsIGJ4LCBsZW4pOworCWNvcHlfZnJvbV9mcygmYm9vdF9wYXJhbXMuc3lzX2Rlc2NfdGFibGUsIG9yZWcuYngsIGxlbik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L21lbW9yeS5jIGIvYXJjaC94ODYvYm9vdC9tZW1vcnkuYwppbmRleCA3NGIzZDJiLi5jYWUzZmViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L21lbW9yeS5jCisrKyBiL2FyY2gveDg2L2Jvb3QvbWVtb3J5LmMKQEAgLTIwLDEyICsyMCwxNiBAQAogc3RhdGljIGludCBkZXRlY3RfbWVtb3J5X2U4MjAodm9pZCkKIHsKIAlpbnQgY291bnQgPSAwOwotCXUzMiBuZXh0ID0gMDsKLQl1MzIgc2l6ZSwgaWQsIGVkaTsKLQl1OCBlcnI7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAJc3RydWN0IGU4MjBlbnRyeSAqZGVzYyA9IGJvb3RfcGFyYW1zLmU4MjBfbWFwOwogCXN0YXRpYyBzdHJ1Y3QgZTgyMGVudHJ5IGJ1ZjsgLyogc3RhdGljIHNvIGl0IGlzIHplcm9lZCAqLwogCisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggID0gMHhlODIwOworCWlyZWcuY3ggID0gc2l6ZW9mIGJ1ZjsKKwlpcmVnLmVkeCA9IFNNQVA7CisJaXJlZy5kaSAgPSAoc2l6ZV90KSZidWY7CisKIAkvKgogCSAqIE5vdGU6IGF0IGxlYXN0IG9uZSBCSU9TIGlzIGtub3duIHdoaWNoIGFzc3VtZXMgdGhhdCB0aGUKIAkgKiBidWZmZXIgcG9pbnRlZCB0byBieSBvbmUgZTgyMCBjYWxsIGlzIHRoZSBzYW1lIG9uZSBhcwpAQCAtNDEsMjIgKzQ1LDEzIEBACiAJICovCiAKIAlkbyB7Ci0JCXNpemUgPSBzaXplb2YgYnVmOwotCi0JCS8qIEltcG9ydGFudDogJWVkeCBhbmQgJWVzaSBhcmUgY2xvYmJlcmVkIGJ5IHNvbWUgQklPU2VzLAotCQkgICBzbyB0aGV5IG11c3QgYmUgZWl0aGVyIHVzZWQgZm9yIHRoZSBlcnJvciBvdXRwdXQKLQkJICAgb3IgZXhwbGljaXRseSBtYXJrZWQgY2xvYmJlcmVkLiAgR2l2ZW4gdGhhdCwgYXNzdW1lIHRoZXJlCi0JCSAgIGlzIHNvbWV0aGluZyBvdXQgdGhlcmUgY2xvYmJlcmluZyAlZWJwIGFuZCAlZWRpLCB0b28uICovCi0JCWFzbSgicHVzaGwgJSVlYnA7IGludCAkMHgxNTsgcG9wbCAlJWVicDsgc2V0YyAlMCIKLQkJICAgIDogIj1kIiAoZXJyKSwgIitiIiAobmV4dCksICI9YSIgKGlkKSwgIitjIiAoc2l6ZSksCi0JCSAgICAgICI9RCIgKGVkaSksICIrbSIgKGJ1ZikKLQkJICAgIDogIkQiICgmYnVmKSwgImQiIChTTUFQKSwgImEiICgweGU4MjApCi0JCSAgICA6ICJlc2kiKTsKKwkJaW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworCQlpcmVnLmVieCA9IG9yZWcuZWJ4OyAvKiBmb3IgbmV4dCBpdGVyYXRpb24uLi4gKi8KIAogCQkvKiBCSU9TZXMgd2hpY2ggdGVybWluYXRlIHRoZSBjaGFpbiB3aXRoIENGID0gMSBhcyBvcHBvc2VkCiAJCSAgIHRvICVlYnggPSAwIGRvbid0IGFsd2F5cyByZXBvcnQgdGhlIFNNQVAgc2lnbmF0dXJlIG9uCiAJCSAgIHRoZSBmaW5hbCwgZmFpbGluZywgcHJvYmUuICovCi0JCWlmIChlcnIpCisJCWlmIChvcmVnLmVmbGFncyAmIFg4Nl9FRkxBR1NfQ0YpCiAJCQlicmVhazsKIAogCQkvKiBTb21lIEJJT1NlcyBzdG9wIHJldHVybmluZyBTTUFQIGluIHRoZSBtaWRkbGUgb2YKQEAgLTY0LDYwICs1OSw2NCBAQAogCQkgICBzY3Jld2VkIHVwIHRoZSBtYXAgYXQgdGhhdCBwb2ludCwgd2UgbWlnaHQgaGF2ZSBhCiAJCSAgIHBhcnRpYWwgbWFwLCB0aGUgZnVsbCBtYXAsIG9yIGNvbXBsZXRlIGdhcmJhZ2UsIHNvCiAJCSAgIGp1c3QgcmV0dXJuIGZhaWx1cmUuICovCi0JCWlmIChpZCAhPSBTTUFQKSB7CisJCWlmIChvcmVnLmVheCAhPSBTTUFQKSB7CiAJCQljb3VudCA9IDA7CiAJCQlicmVhazsKIAkJfQogCiAJCSpkZXNjKysgPSBidWY7CiAJCWNvdW50Kys7Ci0JfSB3aGlsZSAobmV4dCAmJiBjb3VudCA8IEFSUkFZX1NJWkUoYm9vdF9wYXJhbXMuZTgyMF9tYXApKTsKKwl9IHdoaWxlIChpcmVnLmVieCAmJiBjb3VudCA8IEFSUkFZX1NJWkUoYm9vdF9wYXJhbXMuZTgyMF9tYXApKTsKIAogCXJldHVybiBib290X3BhcmFtcy5lODIwX2VudHJpZXMgPSBjb3VudDsKIH0KIAogc3RhdGljIGludCBkZXRlY3RfbWVtb3J5X2U4MDEodm9pZCkKIHsKLQl1MTYgYXgsIGJ4LCBjeCwgZHg7Ci0JdTggZXJyOworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCi0JYnggPSBjeCA9IGR4ID0gMDsKLQlheCA9IDB4ZTgwMTsKLQlhc20oInN0YzsgaW50ICQweDE1OyBzZXRjICUwIgotCSAgICA6ICI9bSIgKGVyciksICIrYSIgKGF4KSwgIitiIiAoYngpLCAiK2MiIChjeCksICIrZCIgKGR4KSk7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweGU4MDE7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOwogCi0JaWYgKGVycikKKwlpZiAob3JlZy5lZmxhZ3MgJiBYODZfRUZMQUdTX0NGKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBEbyB3ZSByZWFsbHkgbmVlZCB0byBkbyB0aGlzPyAqLwotCWlmIChjeCB8fCBkeCkgewotCQlheCA9IGN4OwotCQlieCA9IGR4OworCWlmIChvcmVnLmN4IHx8IG9yZWcuZHgpIHsKKwkJb3JlZy5heCA9IG9yZWcuY3g7CisJCW9yZWcuYnggPSBvcmVnLmR4OwogCX0KIAotCWlmIChheCA+IDE1KjEwMjQpCisJaWYgKG9yZWcuYXggPiAxNSoxMDI0KSB7CiAJCXJldHVybiAtMTsJLyogQm9ndXMhICovCi0KLQkvKiBUaGlzIGlnbm9yZXMgbWVtb3J5IGFib3ZlIDE2TUIgaWYgd2UgaGF2ZSBhIG1lbW9yeSBob2xlCi0JICAgdGhlcmUuICBJZiBzb21lb25lIGFjdHVhbGx5IGZpbmRzIGEgbWFjaGluZSB3aXRoIGEgbWVtb3J5Ci0JICAgaG9sZSBhdCAxNk1CIGFuZCBubyBzdXBwb3J0IGZvciAwRTgyMGggdGhleSBzaG91bGQgcHJvYmFibHkKLQkgICBnZW5lcmF0ZSBhIGZha2UgZTgyMCBtYXAuICovCi0JYm9vdF9wYXJhbXMuYWx0X21lbV9rID0gKGF4ID09IDE1KjEwMjQpID8gKGR4IDw8IDYpK2F4IDogYXg7CisJfSBlbHNlIGlmIChvcmVnLmF4ID09IDE1KjEwMjQpIHsKKwkJYm9vdF9wYXJhbXMuYWx0X21lbV9rID0gKG9yZWcuZHggPDwgNikgKyBvcmVnLmF4OworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoaXMgaWdub3JlcyBtZW1vcnkgYWJvdmUgMTZNQiBpZiB3ZSBoYXZlIGEgbWVtb3J5CisJCSAqIGhvbGUgdGhlcmUuICBJZiBzb21lb25lIGFjdHVhbGx5IGZpbmRzIGEgbWFjaGluZQorCQkgKiB3aXRoIGEgbWVtb3J5IGhvbGUgYXQgMTZNQiBhbmQgbm8gc3VwcG9ydCBmb3IKKwkJICogMEU4MjBoIHRoZXkgc2hvdWxkIHByb2JhYmx5IGdlbmVyYXRlIGEgZmFrZSBlODIwCisJCSAqIG1hcC4KKwkJICovCisJCWJvb3RfcGFyYW1zLmFsdF9tZW1fayA9IG9yZWcuYXg7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZGV0ZWN0X21lbW9yeV84OCh2b2lkKQogewotCXUxNiBheDsKLQl1OCBlcnI7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAKLQlheCA9IDB4ODgwMDsKLQlhc20oInN0YzsgaW50ICQweDE1OyBzZXRjICUwIiA6ICI9YmNkbSIgKGVyciksICIrYSIgKGF4KSk7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYWggPSAweDg4OworCWludGNhbGwoMHgxNSwgJmlyZWcsICZvcmVnKTsKIAotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLmV4dF9tZW1fayA9IGF4OworCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLmV4dF9tZW1fayA9IG9yZWcuYXg7CiAKLQlyZXR1cm4gLWVycjsKKwlyZXR1cm4gLShvcmVnLmVmbGFncyAmIFg4Nl9FRkxBR1NfQ0YpOyAvKiAwIG9yIC0xICovCiB9CiAKIGludCBkZXRlY3RfbWVtb3J5KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3JlZ3MuYyBiL2FyY2gveDg2L2Jvb3QvcmVncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODAxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9ib290L3JlZ3MuYwpAQCAtMCwwICsxLDI5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBTaW1wbGUgaGVscGVyIGZ1bmN0aW9uIGZvciBpbml0aWFsaXppbmcgYSByZWdpc3RlciBzZXQuCisgKgorICogTm90ZSB0aGF0IHRoaXMgc2V0cyBFRkxBR1NfQ0YgaW4gdGhlIGlucHV0IHJlZ2lzdGVyIHNldDsgdGhpcworICogbWFrZXMgaXQgZWFzaWVyIHRvIGNhdGNoIGZ1bmN0aW9ucyB3aGljaCBkbyBub3RoaW5nIGJ1dCBkb24ndAorICogZXhwbGljaXRseSBzZXQgQ0YuCisgKi8KKworI2luY2x1ZGUgImJvb3QuaCIKKwordm9pZCBpbml0cmVncyhzdHJ1Y3QgYmlvc3JlZ3MgKnJlZykKK3sKKwltZW1zZXQocmVnLCAwLCBzaXplb2YgKnJlZyk7CisJcmVnLT5lZmxhZ3MgfD0gWDg2X0VGTEFHU19DRjsKKwlyZWctPmRzID0gZHMoKTsKKwlyZWctPmVzID0gZHMoKTsKKwlyZWctPmZzID0gZnMoKTsKKwlyZWctPmdzID0gZ3MoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3Qvc2V0dXAubGQgYi9hcmNoL3g4Ni9ib290L3NldHVwLmxkCmluZGV4IGJiOGRjMmQuLjBmNmVjNDU1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3NldHVwLmxkCisrKyBiL2FyY2gveDg2L2Jvb3Qvc2V0dXAubGQKQEAgLTE1LDggKzE1LDExIEBACiAKIAkuID0gNDk3OwogCS5oZWFkZXIJCTogeyAqKC5oZWFkZXIpIH0KKwkuZW50cnl0ZXh0CTogeyAqKC5lbnRyeXRleHQpIH0KIAkuaW5pdHRleHQJOiB7ICooLmluaXR0ZXh0KSB9CiAJLmluaXRkYXRhCTogeyAqKC5pbml0ZGF0YSkgfQorCV9fZW5kX2luaXQgPSAuOworCiAJLnRleHQJCTogeyAqKC50ZXh0KSB9CiAJLnRleHQzMgkJOiB7ICooLnRleHQzMikgfQogCkBAIC01Miw0ICs1NSw3IEBACiAKIAkuID0gQVNTRVJUKF9lbmQgPD0gMHg4MDAwLCAiU2V0dXAgdG9vIGJpZyEiKTsKIAkuID0gQVNTRVJUKGhkciA9PSAweDFmMSwgIlRoZSBzZXR1cCBoZWFkZXIgaGFzIHRoZSB3cm9uZyBvZmZzZXQhIik7CisJLyogTmVjZXNzYXJ5IGZvciB0aGUgdmVyeS1vbGQtbG9hZGVyIGNoZWNrIHRvIHdvcmsuLi4gKi8KKwkuID0gQVNTRVJUKF9fZW5kX2luaXQgPD0gNSo1MTIsICJpbml0IHNlY3Rpb25zIHRvbyBiaWchIik7CisKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvdHR5LmMgYi9hcmNoL3g4Ni9ib290L3R0eS5jCmluZGV4IDdlOGU4YjIuLjAxZWM2OWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvdHR5LmMKKysrIGIvYXJjaC94ODYvYm9vdC90dHkuYwpAQCAtMiw2ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgogICoKICAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCiAgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgpAQCAtMjIsMjQgKzIzLDIzIEBACiAKIHZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmluaXR0ZXh0IikpKSBwdXRjaGFyKGludCBjaCkKIHsKLQl1bnNpZ25lZCBjaGFyIGMgPSBjaDsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZzsKIAotCWlmIChjID09ICdcbicpCisJaWYgKGNoID09ICdcbicpCiAJCXB1dGNoYXIoJ1xyJyk7CS8qIFxuIC0+IFxyXG4gKi8KIAotCS8qIGludCAkMHgxMCBpcyBrbm93biB0byBoYXZlIGJ1Z3MgaW52b2x2aW5nIHRvdWNoaW5nIHJlZ2lzdGVycwotCSAgIGl0IHNob3VsZG4ndC4gIEJlIGV4dHJhIGNvbnNlcnZhdGl2ZS4uLiAqLwotCWFzbSB2b2xhdGlsZSgicHVzaGFsOyBwdXNodyAlJWRzOyBpbnQgJDB4MTA7IHBvcHcgJSVkczsgcG9wYWwiCi0JCSAgICAgOiA6ICJiIiAoMHgwMDA3KSwgImMiICgweDAwMDEpLCAiYSIgKDB4MGUwMHxjaCkpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmJ4ID0gMHgwMDA3OworCWlyZWcuY3ggPSAweDAwMDE7CisJaXJlZy5haCA9IDB4MGU7CisJaXJlZy5hbCA9IGNoOworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogfQogCiB2b2lkIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIi5pbml0dGV4dCIpKSkgcHV0cyhjb25zdCBjaGFyICpzdHIpCiB7Ci0JaW50IG4gPSAwOwotCXdoaWxlICgqc3RyKSB7CisJd2hpbGUgKCpzdHIpCiAJCXB1dGNoYXIoKnN0cisrKTsKLQkJbisrOwotCX0KIH0KIAogLyoKQEAgLTQ5LDE0ICs0OSwxMyBAQAogCiBzdGF0aWMgdTggZ2V0dGltZSh2b2lkKQogewotCXUxNiBheCA9IDB4MDIwMDsKLQl1MTYgY3gsIGR4OworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCi0JYXNtIHZvbGF0aWxlKCJpbnQgJDB4MWEiCi0JCSAgICAgOiAiK2EiIChheCksICI9YyIgKGN4KSwgIj1kIiAoZHgpCi0JCSAgICAgOiA6ICJlYngiLCAiZXNpIiwgImVkaSIpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmFoID0gMHgwMjsKKwlpbnRjYWxsKDB4MWEsICZpcmVnLCAmb3JlZyk7CiAKLQlyZXR1cm4gZHggPj4gODsKKwlyZXR1cm4gb3JlZy5kaDsKIH0KIAogLyoKQEAgLTY0LDE5ICs2MywyNCBAQAogICovCiBpbnQgZ2V0Y2hhcih2b2lkKQogewotCXUxNiBheCA9IDA7Ci0JYXNtIHZvbGF0aWxlKCJpbnQgJDB4MTYiIDogIithIiAoYXgpKTsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAotCXJldHVybiBheCAmIDB4ZmY7CisJaW5pdHJlZ3MoJmlyZWcpOworCS8qIGlyZWcuYWggPSAweDAwOyAqLworCWludGNhbGwoMHgxNiwgJmlyZWcsICZvcmVnKTsKKworCXJldHVybiBvcmVnLmFsOwogfQogCiBzdGF0aWMgaW50IGtiZF9wZW5kaW5nKHZvaWQpCiB7Ci0JdTggcGVuZGluZzsKLQlhc20gdm9sYXRpbGUoImludCAkMHgxNjsgc2V0bnogJTAiCi0JCSAgICAgOiAiPXFtIiAocGVuZGluZykKLQkJICAgICA6ICJhIiAoMHgwMTAwKSk7Ci0JcmV0dXJuIHBlbmRpbmc7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CisKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5haCA9IDB4MDE7CisJaW50Y2FsbCgweDE2LCAmaXJlZywgJm9yZWcpOworCisJcmV0dXJuICEob3JlZy5lZmxhZ3MgJiBYODZfRUZMQUdTX1pGKTsKIH0KIAogdm9pZCBrYmRfZmx1c2godm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvdmlkZW8tYmlvcy5jIGIvYXJjaC94ODYvYm9vdC92aWRlby1iaW9zLmMKaW5kZXggM2ZhOTc5Yy4uZDY2MGJlNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC92aWRlby1iaW9zLmMKKysrIGIvYXJjaC94ODYvYm9vdC92aWRlby1iaW9zLmMKQEAgLTIsNiArMiw3IEBACiAgKgogICogICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKICAqICAgQ29weXJpZ2h0IDIwMDcgclBhdGgsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KICAqCiAgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgogICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KQEAgLTI5LDIxICszMCwyMSBAQAogCiBzdGF0aWMgaW50IHNldF9iaW9zX21vZGUodTggbW9kZSkKIHsKLQl1MTYgYXg7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAJdTggbmV3X21vZGU7CiAKLQlheCA9IG1vZGU7CQkvKiBBSD0weDAwIFNldCBWaWRlbyBNb2RlICovCi0JYXNtIHZvbGF0aWxlKElOVDEwCi0JCSAgICAgOiAiK2EiIChheCkKLQkJICAgICA6IDogImVieCIsICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5hbCA9IG1vZGU7CQkvKiBBSD0weDAwIFNldCBWaWRlbyBNb2RlICovCisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiAKLQlheCA9IDB4MGYwMDsJCS8qIEdldCBDdXJyZW50IFZpZGVvIE1vZGUgKi8KLQlhc20gdm9sYXRpbGUoSU5UMTAKLQkJICAgICA6ICIrYSIgKGF4KQotCQkgICAgIDogOiAiZWJ4IiwgImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOworCisJaXJlZy5haCA9IDB4MGY7CQkvKiBHZXQgQ3VycmVudCBWaWRlbyBNb2RlICovCisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCiAJZG9fcmVzdG9yZSA9IDE7CQkvKiBBc3N1bWUgdmlkZW8gY29udGVudHMgd2VyZSBsb3N0ICovCi0JbmV3X21vZGUgPSBheCAmIDB4N2Y7CS8qIE5vdCBhbGwgQklPU2VzIGFyZSBjbGVhbiB3aXRoIHRoZSB0b3AgYml0ICovCisKKwkvKiBOb3QgYWxsIEJJT1NlcyBhcmUgY2xlYW4gd2l0aCB0aGUgdG9wIGJpdCAqLworCW5ld19tb2RlID0gaXJlZy5hbCAmIDB4N2Y7CiAKIAlpZiAobmV3X21vZGUgPT0gbW9kZSkKIAkJcmV0dXJuIDA7CS8qIE1vZGUgY2hhbmdlIE9LICovCkBAIC01MywxMCArNTQsOCBAQAogCQkvKiBNb2RlIHNldHRpbmcgZmFpbGVkLCBidXQgd2UgZGlkbid0IGVuZCB1cCB3aGVyZSB3ZQogCQkgICBzdGFydGVkLiAgVGhhdCdzIGJhZC4gIFRyeSB0byByZXZlcnQgdG8gdGhlIG9yaWdpbmFsCiAJCSAgIHZpZGVvIG1vZGUuICovCi0JCWF4ID0gYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19tb2RlOwotCQlhc20gdm9sYXRpbGUoSU5UMTAKLQkJCSAgICAgOiAiK2EiIChheCkKLQkJCSAgICAgOiA6ICJlYngiLCAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7CisJCWlyZWcuYXggPSBib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX21vZGU7CisJCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogCX0KICNlbmRpZgogCXJldHVybiAtMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmVzYS5jIGIvYXJjaC94ODYvYm9vdC92aWRlby12ZXNhLmMKaW5kZXggNGE1OGM4Yy4uYzcwMDE0NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC92aWRlby12ZXNhLmMKKysrIGIvYXJjaC94ODYvYm9vdC92aWRlby12ZXNhLmMKQEAgLTIsNiArMiw3IEBACiAgKgogICogICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKICAqICAgQ29weXJpZ2h0IDIwMDcgclBhdGgsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KICAqCiAgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgogICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KQEAgLTMxLDcgKzMyLDcgQEAKIHN0YXRpYyBpbnQgdmVzYV9wcm9iZSh2b2lkKQogewogI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPX1ZFU0EpIHx8IGRlZmluZWQoQ09ORklHX0ZJUk1XQVJFX0VESUQpCi0JdTE2IGF4LCBjeCwgZGk7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAJdTE2IG1vZGU7CiAJYWRkcl90IG1vZGVfcHRyOwogCXN0cnVjdCBtb2RlX2luZm8gKm1pOwpAQCAtMzksMTMgKzQwLDEyIEBACiAKIAl2aWRlb192ZXNhLm1vZGVzID0gR0VUX0hFQVAoc3RydWN0IG1vZGVfaW5mbywgMCk7CiAKLQlheCA9IDB4NGYwMDsKLQlkaSA9IChzaXplX3QpJnZnaW5mbzsKLQlhc20oSU5UMTAKLQkgICAgOiAiK2EiIChheCksICIrRCIgKGRpKSwgIj1tIiAodmdpbmZvKQotCSAgICA6IDogImVieCIsICJlY3giLCAiZWR4IiwgImVzaSIpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmF4ID0gMHg0ZjAwOworCWlyZWcuZGkgPSAoc2l6ZV90KSZ2Z2luZm87CisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCi0JaWYgKGF4ICE9IDB4MDA0ZiB8fAorCWlmIChpcmVnLmF4ICE9IDB4MDA0ZiB8fAogCSAgICB2Z2luZm8uc2lnbmF0dXJlICE9IFZFU0FfTUFHSUMgfHwKIAkgICAgdmdpbmZvLnZlcnNpb24gPCAweDAxMDIpCiAJCXJldHVybiAwOwkvKiBOb3QgcHJlc2VudCAqLwpAQCAtNjUsMTQgKzY1LDEyIEBACiAKIAkJbWVtc2V0KCZ2bWluZm8sIDAsIHNpemVvZiB2bWluZm8pOyAvKiBKdXN0IGluIGNhc2UuLi4gKi8KIAotCQlheCA9IDB4NGYwMTsKLQkJY3ggPSBtb2RlOwotCQlkaSA9IChzaXplX3QpJnZtaW5mbzsKLQkJYXNtKElOVDEwCi0JCSAgICA6ICIrYSIgKGF4KSwgIitjIiAoY3gpLCAiK0QiIChkaSksICI9bSIgKHZtaW5mbykKLQkJICAgIDogOiAiZWJ4IiwgImVkeCIsICJlc2kiKTsKKwkJaXJlZy5heCA9IDB4NGYwMTsKKwkJaXJlZy5jeCA9IG1vZGU7CisJCWlyZWcuZGkgPSAoc2l6ZV90KSZ2bWluZm87CisJCWludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKIAotCQlpZiAoYXggIT0gMHgwMDRmKQorCQlpZiAoaXJlZy5heCAhPSAweDAwNGYpCiAJCQljb250aW51ZTsKIAogCQlpZiAoKHZtaW5mby5tb2RlX2F0dHIgJiAweDE1KSA9PSAweDA1KSB7CkBAIC0xMTEsMjAgKzEwOSwxOSBAQAogCiBzdGF0aWMgaW50IHZlc2Ffc2V0X21vZGUoc3RydWN0IG1vZGVfaW5mbyAqbW9kZSkKIHsKLQl1MTYgYXgsIGJ4LCBjeCwgZGk7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAJaW50IGlzX2dyYXBoaWM7CiAJdTE2IHZlc2FfbW9kZSA9IG1vZGUtPm1vZGUgLSBWSURFT19GSVJTVF9WRVNBOwogCiAJbWVtc2V0KCZ2bWluZm8sIDAsIHNpemVvZiB2bWluZm8pOyAvKiBKdXN0IGluIGNhc2UuLi4gKi8KIAotCWF4ID0gMHg0ZjAxOwotCWN4ID0gdmVzYV9tb2RlOwotCWRpID0gKHNpemVfdCkmdm1pbmZvOwotCWFzbShJTlQxMAotCSAgICA6ICIrYSIgKGF4KSwgIitjIiAoY3gpLCAiK0QiIChkaSksICI9bSIgKHZtaW5mbykKLQkgICAgOiA6ICJlYngiLCAiZWR4IiwgImVzaSIpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmF4ID0gMHg0ZjAxOworCWlyZWcuY3ggPSB2ZXNhX21vZGU7CisJaXJlZy5kaSA9IChzaXplX3QpJnZtaW5mbzsKKwlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAKLQlpZiAoYXggIT0gMHgwMDRmKQorCWlmIChvcmVnLmF4ICE9IDB4MDA0ZikKIAkJcmV0dXJuIC0xOwogCiAJaWYgKCh2bWluZm8ubW9kZV9hdHRyICYgMHgxNSkgPT0gMHgwNSkgewpAQCAtMTQxLDE0ICsxMzgsMTIgQEAKIAl9CiAKIAotCWF4ID0gMHg0ZjAyOwotCWJ4ID0gdmVzYV9tb2RlOwotCWRpID0gMDsKLQlhc20gdm9sYXRpbGUoSU5UMTAKLQkJICAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpLCAiK0QiIChkaSkKLQkJICAgICA6IDogImVjeCIsICJlZHgiLCAiZXNpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweDRmMDI7CisJaXJlZy5ieCA9IHZlc2FfbW9kZTsKKwlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAKLQlpZiAoYXggIT0gMHgwMDRmKQorCWlmIChvcmVnLmF4ICE9IDB4MDA0ZikKIAkJcmV0dXJuIC0xOwogCiAJZ3JhcGhpY19tb2RlID0gaXNfZ3JhcGhpYzsKQEAgLTE3MSw1MCArMTY2LDQ1IEBACiAvKiBTd2l0Y2ggREFDIHRvIDgtYml0IG1vZGUgKi8KIHN0YXRpYyB2b2lkIHZlc2FfZGFjX3NldF84Yml0cyh2b2lkKQogeworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCXU4IGRhY19zaXplID0gNjsKIAogCS8qIElmIHBvc3NpYmxlLCBzd2l0Y2ggdGhlIERBQyB0byA4LWJpdCBtb2RlICovCiAJaWYgKHZnaW5mby5jYXBhYmlsaXRpZXMgJiAxKSB7Ci0JCXUxNiBheCwgYng7Ci0KLQkJYXggPSAweDRmMDg7Ci0JCWJ4ID0gMHgwODAwOwotCQlhc20gdm9sYXRpbGUoSU5UMTAKLQkJCSAgICAgOiAiK2EiIChheCksICIrYiIgKGJ4KQotCQkJICAgICA6IDogImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOwotCi0JCWlmIChheCA9PSAweDAwNGYpCi0JCQlkYWNfc2l6ZSA9IGJ4ID4+IDg7CisJCWluaXRyZWdzKCZpcmVnKTsKKwkJaXJlZy5heCA9IDB4NGYwODsKKwkJaXJlZy5iaCA9IDB4MDg7CisJCWludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKKwkJaWYgKG9yZWcuYXggPT0gMHgwMDRmKQorCQkJZGFjX3NpemUgPSBvcmVnLmJoOwogCX0KIAogCS8qIFNldCB0aGUgY29sb3Igc2l6ZXMgdG8gdGhlIERBQyBzaXplLCBhbmQgb2Zmc2V0cyB0byAwICovCi0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ucmVkX3NpemUgPSBkYWNfc2l6ZTsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5yZWRfc2l6ZSAgID0gZGFjX3NpemU7CiAJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8uZ3JlZW5fc2l6ZSA9IGRhY19zaXplOwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLmJsdWVfc2l6ZSA9IGRhY19zaXplOwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLnJzdmRfc2l6ZSA9IGRhY19zaXplOworCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLmJsdWVfc2l6ZSAgPSBkYWNfc2l6ZTsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5yc3ZkX3NpemUgID0gZGFjX3NpemU7CiAKLQlib290X3BhcmFtcy5zY3JlZW5faW5mby5yZWRfcG9zID0gMDsKLQlib290X3BhcmFtcy5zY3JlZW5faW5mby5ncmVlbl9wb3MgPSAwOwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLmJsdWVfcG9zID0gMDsKLQlib290X3BhcmFtcy5zY3JlZW5faW5mby5yc3ZkX3BvcyA9IDA7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ucmVkX3BvcyAgICA9IDA7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8uZ3JlZW5fcG9zICA9IDA7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8uYmx1ZV9wb3MgICA9IDA7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ucnN2ZF9wb3MgICA9IDA7CiB9CiAKIC8qIFNhdmUgdGhlIFZFU0EgcHJvdGVjdGVkIG1vZGUgaW5mbyAqLwogc3RhdGljIHZvaWQgdmVzYV9zdG9yZV9wbV9pbmZvKHZvaWQpCiB7Ci0JdTE2IGF4LCBieCwgZGksIGVzOworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCi0JYXggPSAweDRmMGE7Ci0JYnggPSBkaSA9IDA7Ci0JYXNtKCJwdXNodyAlJWVzOyAiSU5UMTAiOyBtb3Z3ICUlZXMsJTA7IHBvcHcgJSVlcyIKLQkgICAgOiAiPWQiIChlcyksICIrYSIgKGF4KSwgIitiIiAoYngpLCAiK0QiIChkaSkKLQkgICAgOiA6ICJlY3giLCAiZXNpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweDRmMGE7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCi0JaWYgKGF4ICE9IDB4MDA0ZikKKwlpZiAob3JlZy5heCAhPSAweDAwNGYpCiAJCXJldHVybjsKIAotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLnZlc2FwbV9zZWcgPSBlczsKLQlib290X3BhcmFtcy5zY3JlZW5faW5mby52ZXNhcG1fb2ZmID0gZGk7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8udmVzYXBtX3NlZyA9IG9yZWcuZXM7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8udmVzYXBtX29mZiA9IG9yZWcuZGk7CiB9CiAKIC8qCkBAIC0yNTIsNyArMjQyLDcgQEAKIHZvaWQgdmVzYV9zdG9yZV9lZGlkKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0ZJUk1XQVJFX0VESUQKLQl1MTYgYXgsIGJ4LCBjeCwgZHgsIGRpOworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCiAJLyogQXBwYXJlbnRseSB1c2VkIGFzIGEgbm9uc2Vuc2UgdG9rZW4uLi4gKi8KIAltZW1zZXQoJmJvb3RfcGFyYW1zLmVkaWRfaW5mbywgMHgxMywgc2l6ZW9mIGJvb3RfcGFyYW1zLmVkaWRfaW5mbyk7CkBAIC0yNjAsMzMgKzI1MCwyNiBAQAogCWlmICh2Z2luZm8udmVyc2lvbiA8IDB4MDIwMCkKIAkJcmV0dXJuOwkJLyogRURJRCByZXF1aXJlcyBWQkUgMi4wKyAqLwogCi0JYXggPSAweDRmMTU7CQkvKiBWQkUgRERDICovCi0JYnggPSAweDAwMDA7CQkvKiBSZXBvcnQgRERDIGNhcGFiaWxpdGllcyAqLwotCWN4ID0gMDsJCQkvKiBDb250cm9sbGVyIDAgKi8KLQlkaSA9IDA7CQkJLyogRVM6REkgbXVzdCBiZSAwIGJ5IHNwZWMgKi8KKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5heCA9IDB4NGYxNTsJCS8qIFZCRSBEREMgKi8KKwkvKiBpcmVnLmJ4ID0gMHgwMDAwOyAqLwkJLyogUmVwb3J0IEREQyBjYXBhYmlsaXRpZXMgKi8KKwkvKiBpcmVnLmN4ID0gMDsJKi8JCS8qIENvbnRyb2xsZXIgMCAqLworCWlyZWcuZXMgPSAwOwkJCS8qIEVTOkRJIG11c3QgYmUgMCBieSBzcGVjICovCisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCi0JLyogTm90ZTogVGhlIFZCRSBEREMgc3BlYyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbWFpbiBWRVNBIHNwZWM7Ci0JICAgd2UgZ2VudWluZWx5IGhhdmUgdG8gYXNzdW1lIGFsbCByZWdpc3RlcnMgYXJlIGRlc3Ryb3llZCBoZXJlLiAqLwotCi0JYXNtKCJwdXNodyAlJWVzOyBtb3Z3ICUyLCUlZXM7ICJJTlQxMCI7IHBvcHcgJSVlcyIKLQkgICAgOiAiK2EiIChheCksICIrYiIgKGJ4KSwgIitjIiAoY3gpLCAiK0QiIChkaSkKLQkgICAgOiA6ICJlc2kiLCAiZWR4Iik7Ci0KLQlpZiAoYXggIT0gMHgwMDRmKQorCWlmIChvcmVnLmF4ICE9IDB4MDA0ZikKIAkJcmV0dXJuOwkJLyogTm8gRURJRCAqLwogCiAJLyogQkggPSB0aW1lIGluIHNlY29uZHMgdG8gdHJhbnNmZXIgRUREIGluZm9ybWF0aW9uICovCiAJLyogQkwgPSBEREMgbGV2ZWwgc3VwcG9ydGVkICovCiAKLQlheCA9IDB4NGYxNTsJCS8qIFZCRSBEREMgKi8KLQlieCA9IDB4MDAwMTsJCS8qIFJlYWQgRURJRCAqLwotCWN4ID0gMDsJCQkvKiBDb250cm9sbGVyIDAgKi8KLQlkeCA9IDA7CQkJLyogRURJRCBibG9jayBudW1iZXIgKi8KLQlkaSA9KHNpemVfdCkgJmJvb3RfcGFyYW1zLmVkaWRfaW5mbzsgLyogKEVTOilQb2ludGVyIHRvIGJsb2NrICovCi0JYXNtKElOVDEwCi0JICAgIDogIithIiAoYXgpLCAiK2IiIChieCksICIrZCIgKGR4KSwgIj1tIiAoYm9vdF9wYXJhbXMuZWRpZF9pbmZvKSwKLQkgICAgICAiK2MiIChjeCksICIrRCIgKGRpKQotCSAgICA6IDogImVzaSIpOworCWlyZWcuYXggPSAweDRmMTU7CQkvKiBWQkUgRERDICovCisJaXJlZy5ieCA9IDB4MDAwMTsJCS8qIFJlYWQgRURJRCAqLworCS8qIGlyZWcuY3ggPSAwOyAqLwkJLyogQ29udHJvbGxlciAwICovCisJLyogaXJlZy5keCA9IDA7CSovCQkvKiBFRElEIGJsb2NrIG51bWJlciAqLworCWlyZWcuZXMgPSBkcygpOworCWlyZWcuZGkgPShzaXplX3QpJmJvb3RfcGFyYW1zLmVkaWRfaW5mbzsgLyogKEVTOilQb2ludGVyIHRvIGJsb2NrICovCisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogI2VuZGlmIC8qIENPTkZJR19GSVJNV0FSRV9FRElEICovCiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmdhLmMgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLXZnYS5jCmluZGV4IDllMDU4N2EuLjhmOGQ4MjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmdhLmMKKysrIGIvYXJjaC94ODYvYm9vdC92aWRlby12Z2EuYwpAQCAtMiw2ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgogICoKICAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCiAgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgpAQCAtMzksMzAgKzQwLDMwIEBACiAvKiBTZXQgYmFzaWMgODB4MjUgbW9kZSAqLwogc3RhdGljIHU4IHZnYV9zZXRfYmFzaWNfbW9kZSh2b2lkKQogeworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCXUxNiBheDsKIAl1OCByb3dzOwogCXU4IG1vZGU7CiAKKwlpbml0cmVncygmaXJlZyk7CisKICNpZmRlZiBDT05GSUdfVklERU9fNDAwX0hBQ0sKIAlpZiAoYWRhcHRlciA+PSBBREFQVEVSX1ZHQSkgewotCQlhc20gdm9sYXRpbGUoSU5UMTAKLQkJCSAgICAgOiA6ICJhIiAoMHgxMjAyKSwgImIiICgweDAwMzApCi0JCQkgICAgIDogImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOworCQlpcmVnLmF4ID0gMHgxMjAyOworCQlpcmVnLmJ4ID0gMHgwMDMwOworCQlpbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKIAl9CiAjZW5kaWYKIAogCWF4ID0gMHgwZjAwOwotCWFzbSB2b2xhdGlsZShJTlQxMAotCQkgICAgIDogIithIiAoYXgpCi0JCSAgICAgOiA6ICJlYngiLCAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7Ci0KLQltb2RlID0gKHU4KWF4OworCWludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKKwltb2RlID0gb3JlZy5hbDsKIAogCXNldF9mcygwKTsKIAlyb3dzID0gcmRmczgoMHg0ODQpOwkvKiByb3dzIG1pbnVzIG9uZSAqLwogCiAjaWZuZGVmIENPTkZJR19WSURFT180MDBfSEFDSwotCWlmICgoYXggPT0gMHg1MDAzIHx8IGF4ID09IDB4NTAwNykgJiYKKwlpZiAoKG9yZWcuYXggPT0gMHg1MDAzIHx8IG9yZWcuYXggPT0gMHg1MDA3KSAmJgogCSAgICAocm93cyA9PSAwIHx8IHJvd3MgPT0gMjQpKQogCQlyZXR1cm4gbW9kZTsKICNlbmRpZgpAQCAtNzEsMTAgKzcyLDggQEAKIAkJbW9kZSA9IDM7CiAKIAkvKiBTZXQgdGhlIG1vZGUgKi8KLQlheCA9IG1vZGU7Ci0JYXNtIHZvbGF0aWxlKElOVDEwCi0JCSAgICAgOiAiK2EiIChheCkKLQkJICAgICA6IDogImVieCIsICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwlpcmVnLmF4ID0gbW9kZTsJCS8qIEFIPTA6IHNldCBtb2RlICovCisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiAJZG9fcmVzdG9yZSA9IDE7CiAJcmV0dXJuIG1vZGU7CiB9CkBAIC04Miw0MyArODEsNjkgQEAKIHN0YXRpYyB2b2lkIHZnYV9zZXRfOGZvbnQodm9pZCkKIHsKIAkvKiBTZXQgOHg4IGZvbnQgLSA4MHg0MyBvbiBFR0EsIDgweDUwIG9uIFZHQSAqLworCXN0cnVjdCBiaW9zcmVncyBpcmVnOworCisJaW5pdHJlZ3MoJmlyZWcpOwogCiAJLyogU2V0IDh4OCBmb250ICovCi0JYXNtIHZvbGF0aWxlKElOVDEwIDogOiAiYSIgKDB4MTExMiksICJiIiAoMCkpOworCWlyZWcuYXggPSAweDExMTI7CisJLyogaXJlZy5ibCA9IDA7ICovCisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiAKIAkvKiBVc2UgYWx0ZXJuYXRlIHByaW50IHNjcmVlbiAqLwotCWFzbSB2b2xhdGlsZShJTlQxMCA6IDogImEiICgweDEyMDApLCAiYiIgKDB4MjApKTsKKwlpcmVnLmF4ID0gMHgxMjAwOworCWlyZWcuYmwgPSAweDIwOworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogCiAJLyogVHVybiBvZmYgY3Vyc29yIGVtdWxhdGlvbiAqLwotCWFzbSB2b2xhdGlsZShJTlQxMCA6IDogImEiICgweDEyMDEpLCAiYiIgKDB4MzQpKTsKKwlpcmVnLmF4ID0gMHgxMjAxOworCWlyZWcuYmwgPSAweDM0OworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogCiAJLyogQ3Vyc29yIGlzIHNjYW4gbGluZXMgNi03ICovCi0JYXNtIHZvbGF0aWxlKElOVDEwIDogOiAiYSIgKDB4MDEwMCksICJjIiAoMHgwNjA3KSk7CisJaXJlZy5heCA9IDB4MDEwMDsKKwlpcmVnLmN4ID0gMHgwNjA3OworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCB2Z2Ffc2V0XzE0Zm9udCh2b2lkKQogewogCS8qIFNldCA5eDE0IGZvbnQgLSA4MHgyOCBvbiBWR0EgKi8KKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZzsKKworCWluaXRyZWdzKCZpcmVnKTsKIAogCS8qIFNldCA5eDE0IGZvbnQgKi8KLQlhc20gdm9sYXRpbGUoSU5UMTAgOiA6ICJhIiAoMHgxMTExKSwgImIiICgwKSk7CisJaXJlZy5heCA9IDB4MTExMTsKKwkvKiBpcmVnLmJsID0gMDsgKi8KKwlpbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKIAogCS8qIFR1cm4gb2ZmIGN1cnNvciBlbXVsYXRpb24gKi8KLQlhc20gdm9sYXRpbGUoSU5UMTAgOiA6ICJhIiAoMHgxMjAxKSwgImIiICgweDM0KSk7CisJaXJlZy5heCA9IDB4MTIwMTsKKwlpcmVnLmJsID0gMHgzNDsKKwlpbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKIAogCS8qIEN1cnNvciBpcyBzY2FuIGxpbmVzIDExLTEyICovCi0JYXNtIHZvbGF0aWxlKElOVDEwIDogOiAiYSIgKDB4MDEwMCksICJjIiAoMHgwYjBjKSk7CisJaXJlZy5heCA9IDB4MDEwMDsKKwlpcmVnLmN4ID0gMHgwYjBjOworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogfQogCiBzdGF0aWMgdm9pZCB2Z2Ffc2V0XzgweDQzKHZvaWQpCiB7CiAJLyogU2V0IDgweDQzIG1vZGUgb24gVkdBIChub3QgRUdBKSAqLworCXN0cnVjdCBiaW9zcmVncyBpcmVnOworCisJaW5pdHJlZ3MoJmlyZWcpOwogCiAJLyogU2V0IDM1MCBzY2FucyAqLwotCWFzbSB2b2xhdGlsZShJTlQxMCA6IDogImEiICgweDEyMDEpLCAiYiIgKDB4MzApKTsKKwlpcmVnLmF4ID0gMHgxMjAxOworCWlyZWcuYmwgPSAweDMwOworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogCiAJLyogUmVzZXQgdmlkZW8gbW9kZSAqLwotCWFzbSB2b2xhdGlsZShJTlQxMCA6IDogImEiICgweDAwMDMpKTsKKwlpcmVnLmF4ID0gMHgwMDAzOworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogCiAJdmdhX3NldF84Zm9udCgpOwogfQpAQCAtMjI1LDggKzI1MCw2IEBACiAgKi8KIHN0YXRpYyBpbnQgdmdhX3Byb2JlKHZvaWQpCiB7Ci0JdTE2IGVnYV9ieDsKLQogCXN0YXRpYyBjb25zdCBjaGFyICpjYXJkX25hbWVbXSA9IHsKIAkJIkNHQS9NREEvSEdDIiwgIkVHQSIsICJWR0EiCiAJfTsKQEAgLTI0MCwyNiArMjYzLDI2IEBACiAJCXNpemVvZihlZ2FfbW9kZXMpL3NpemVvZihzdHJ1Y3QgbW9kZV9pbmZvKSwKIAkJc2l6ZW9mKHZnYV9tb2Rlcykvc2l6ZW9mKHN0cnVjdCBtb2RlX2luZm8pLAogCX07Ci0JdTggdmdhX2ZsYWc7CiAKLQlhc20oSU5UMTAKLQkgICAgOiAiPWIiIChlZ2FfYngpCi0JICAgIDogImEiICgweDEyMDApLCAiYiIgKDB4MTApIC8qIENoZWNrIEVHQS9WR0EgKi8KLQkgICAgOiAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CisKKwlpbml0cmVncygmaXJlZyk7CisKKwlpcmVnLmF4ID0gMHgxMjAwOworCWlyZWcuYmwgPSAweDEwOwkJLyogQ2hlY2sgRUdBL1ZHQSAqLworCWludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKIAogI2lmbmRlZiBfV0FLRVVQCi0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19lZ2FfYnggPSBlZ2FfYng7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19lZ2FfYnggPSBvcmVnLmJ4OwogI2VuZGlmCiAKIAkvKiBJZiB3ZSBoYXZlIE1EQS9DR0EvSEdDIHRoZW4gQkwgd2lsbCBiZSB1bmNoYW5nZWQgYXQgMHgxMCAqLwotCWlmICgodTgpZWdhX2J4ICE9IDB4MTApIHsKKwlpZiAob3JlZy5ibCAhPSAweDEwKSB7CiAJCS8qIEVHQS9WR0EgKi8KLQkJYXNtKElOVDEwCi0JCSAgICA6ICI9YSIgKHZnYV9mbGFnKQotCQkgICAgOiAiYSIgKDB4MWEwMCkKLQkJICAgIDogImVieCIsICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwkJaXJlZy5heCA9IDB4MWEwMDsKKwkJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCi0JCWlmICh2Z2FfZmxhZyA9PSAweDFhKSB7CisJCWlmIChvcmVnLmFsID09IDB4MWEpIHsKIAkJCWFkYXB0ZXIgPSBBREFQVEVSX1ZHQTsKICNpZm5kZWYgX1dBS0VVUAogCQkJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19pc1ZHQSA9IDE7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3ZpZGVvLmMgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLmMKaW5kZXggM2JlZjJjMS4uYmFkNzI4YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC92aWRlby5jCisrKyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8uYwpAQCAtMiw2ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgogICoKICAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCiAgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgpAQCAtMTgsMzMgKzE5LDI5IEBACiAKIHN0YXRpYyB2b2lkIHN0b3JlX2N1cnNvcl9wb3NpdGlvbih2b2lkKQogewotCXUxNiBjdXJwb3M7Ci0JdTE2IGF4LCBieDsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAotCWF4ID0gMHgwMzAwOwotCWJ4ID0gMDsKLQlhc20oSU5UMTAKLQkgICAgOiAiPWQiIChjdXJwb3MpLCAiK2EiIChheCksICIrYiIgKGJ4KQotCSAgICA6IDogImVjeCIsICJlc2kiLCAiZWRpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYWggPSAweDAzOworCWludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKIAotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLm9yaWdfeCA9IGN1cnBvczsKLQlib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3kgPSBjdXJwb3MgPj4gODsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ggPSBvcmVnLmRsOworCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLm9yaWdfeSA9IG9yZWcuZGg7CiB9CiAKIHN0YXRpYyB2b2lkIHN0b3JlX3ZpZGVvX21vZGUodm9pZCkKIHsKLQl1MTYgYXgsIHBhZ2U7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAKIAkvKiBOLkIuOiB0aGUgc2F2aW5nIG9mIHRoZSB2aWRlbyBwYWdlIGhlcmUgaXMgYSBiaXQgc2lsbHksCiAJICAgc2luY2Ugd2UgcHJldHR5IG11Y2ggYXNzdW1lIHBhZ2UgMCBldmVyeXdoZXJlLiAqLwotCWF4ID0gMHgwZjAwOwotCWFzbShJTlQxMAotCSAgICA6ICIrYSIgKGF4KSwgIj1iIiAocGFnZSkKLQkgICAgOiA6ICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5haCA9IDB4MGY7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCiAJLyogTm90IGFsbCBCSU9TZXMgYXJlIGNsZWFuIHdpdGggcmVzcGVjdCB0byB0aGUgdG9wIGJpdCAqLwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLm9yaWdfdmlkZW9fbW9kZSA9IGF4ICYgMHg3ZjsKLQlib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX3BhZ2UgPSBwYWdlID4+IDg7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19tb2RlID0gb3JlZy5hbCAmIDB4N2Y7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19wYWdlID0gb3JlZy5iaDsKIH0KIAogLyoKQEAgLTI1Nyw3ICsyNTQsNyBAQAogCWludCB5OwogCWFkZHJfdCBkc3QgPSAwOwogCXUxNiAqc3JjID0gc2F2ZWQuZGF0YTsKLQl1MTYgYXgsIGJ4LCBkeDsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZzsKIAogCWlmIChncmFwaGljX21vZGUpCiAJCXJldHVybjsJCS8qIENhbid0IHJlc3RvcmUgb250byBhIGdyYXBoaWMgbW9kZSAqLwpAQCAtMjk2LDEyICsyOTMsMTEgQEAKIAl9CiAKIAkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLwotCWF4ID0gMHgwMjAwOwkJLyogU2V0IGN1cnNvciBwb3NpdGlvbiAqLwotCWJ4ID0gMDsJCQkvKiBQYWdlIG51bWJlciAoPDwgOCkgKi8KLQlkeCA9IChzYXZlZC5jdXJ5IDw8IDgpK3NhdmVkLmN1cng7Ci0JYXNtIHZvbGF0aWxlKElOVDEwCi0JCSAgICAgOiAiK2EiIChheCksICIrYiIgKGJ4KSwgIitkIiAoZHgpCi0JCSAgICAgOiA6ICJlY3giLCAiZXNpIiwgImVkaSIpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmFoID0gMHgwMjsJCS8qIFNldCBjdXJzb3IgcG9zaXRpb24gKi8KKwlpcmVnLmRoID0gc2F2ZWQuY3VyeTsKKwlpcmVnLmRsID0gc2F2ZWQuY3VyeDsKKwlpbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKIH0KICNlbHNlCiAjZGVmaW5lIHNhdmVfc2NyZWVuKCkJCSgodm9pZCkwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC92aWRlby5oIGIvYXJjaC94ODYvYm9vdC92aWRlby5oCmluZGV4IGVlNjNmNWQuLjViYjE3NGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvdmlkZW8uaAorKysgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLmgKQEAgLTExMiwyMCArMTEyLDYgQEAKIGV4dGVybiBpbnQgZG9fcmVzdG9yZTsJCS8qIFJlc3RvcmUgc2NyZWVuIGNvbnRlbnRzICovCiBleHRlcm4gaW50IGdyYXBoaWNfbW9kZTsJLyogR3JhcGhpY3MgbW9kZSB3aXRoIGxpbmVhciBmcmFtZSBidWZmZXIgKi8KIAotLyoKLSAqIGludCAkMHgxMCBpcyBub3RvcmlvdXMgZm9yIHRvdWNoaW5nIHJlZ2lzdGVycyBpdCBzaG91bGRuJ3QuCi0gKiBnY2MgZG9lc24ndCBsaWtlICVlYnAgYmVpbmcgY2xvYmJlcmVkLCBzbyBkZWZpbmUgaXQgYXMgYSBwdXNoL3BvcAotICogc2VxdWVuY2UgaGVyZS4KLSAqCi0gKiBBIG51bWJlciBvZiBzeXN0ZW1zLCBpbmNsdWRpbmcgdGhlIG9yaWdpbmFsIFBDIGNhbiBjbG9iYmVyICVicCBpbgotICogY2VydGFpbiBjaXJjdW1zdGFuY2VzLCBsaWtlIHdoZW4gc2Nyb2xsaW5nLiAgVGhlcmUgZXhpc3RzIGF0IGxlYXN0Ci0gKiBvbmUgVHJpZGVudCB2aWRlbyBjYXJkIHdoaWNoIGNvdWxkIGNsb2JiZXIgRFMgdW5kZXIgYSBzZXQgb2YKLSAqIGNpcmN1bXN0YW5jZXMgdGhhdCB3ZSBhcmUgdW5saWtlbHkgdG8gZW5jb3VudGVyIChzY3JvbGxpbmcgd2hlbgotICogdXNpbmcgYW4gZXh0ZW5kZWQgZ3JhcGhpY3MgbW9kZSBvZiBtb3JlIHRoYW4gODAweDYwMCBwaXhlbHMpLCBidXQKLSAqIGl0J3MgY2hlYXAgaW5zdXJhbmNlIHRvIGRlYWwgd2l0aCB0aGF0IGhlcmUuCi0gKi8KLSNkZWZpbmUgSU5UMTAgInB1c2hsICUlZWJwOyBwdXNodyAlJWRzOyBpbnQgJDB4MTA7IHBvcHcgJSVkczsgcG9wbCAlJWVicCIKLQogLyogQWNjZXNzaW5nIFZHQSBpbmRleGVkIHJlZ2lzdGVycyAqLwogc3RhdGljIGlubGluZSB1OCBpbl9pZHgodTE2IHBvcnQsIHU4IGluZGV4KQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZyBiL2FyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWcKaW5kZXggMjM1YjgxZC4uZWRiOTkyZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZworKysgYi9hcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnCkBAIC0xLDEyICsxLDEzIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjktcmM0Ci0jIFR1ZSBGZWIgMjQgMTU6NTA6NTggMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMgorIyBNb24gTWF5IDExIDE2OjIxOjU1IDIwMDkKICMKICMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKIENPTkZJR19YODZfMzI9eQogIyBDT05GSUdfWDg2XzY0IGlzIG5vdCBzZXQKIENPTkZJR19YODY9eQorQ09ORklHX09VVFBVVF9GT1JNQVQ9ImVsZjMyLWkzODYiCiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWciCiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKQEAgLTMzLDYgKzM0LDcgQEAKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQogQ09ORklHX0FSQ0hfSEFTX0NBQ0hFX0xJTkVfU0laRT15CiBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUE9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19QRVJfQ1BVX0FSRUE9eQogIyBDT05GSUdfSEFWRV9DUFVNQVNLX09GX0NQVV9NQVAgaXMgbm90IHNldAogQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEU9eQogQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CkBAIC00MCwxNSArNDIsMTYgQEAKIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CiAjIENPTkZJR19BVURJVF9BUkNIIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1NVUFBPUlRTX09QVElNSVpFRF9JTkxJTklORz15CitDT05GSUdfQVJDSF9TVVBQT1JUU19ERUJVR19QQUdFQUxMT0M9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlE9eQotQ09ORklHX1g4Nl9TTVA9eQogQ09ORklHX1VTRV9HRU5FUklDX1NNUF9IRUxQRVJTPXkKIENPTkZJR19YODZfMzJfU01QPXkKIENPTkZJR19YODZfSFQ9eQotQ09ORklHX1g4Nl9CSU9TX1JFQk9PVD15CiBDT05GSUdfWDg2X1RSQU1QT0xJTkU9eQorQ09ORklHX1g4Nl8zMl9MQVpZX0dTPXkKIENPTkZJR19LVElNRV9TQ0FMQVI9eQogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIApAQCAtNjAsMTAgKzYzLDE3IEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiAjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKIENPTkZJR19UQVNLU1RBVFM9eQpAQCAtMTEzLDIzICsxMjMsMjYgQEAKIENPTkZJR19ORVRfTlM9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfUkRfR1pJUD15CitDT05GSUdfUkRfQlpJUDI9eQorQ09ORklHX1JEX0xaTUE9eQogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQorQ09ORklHX0FOT05fSU5PREVTPXkKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQogQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfUENTUEtSX1BMQVRGT1JNPXkKLSMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQotQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0lHTkFMRkQ9eQogQ09ORklHX1RJTUVSRkQ9eQpAQCAtMTM5LDYgKzE1Miw3IEBACiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1BDSV9RVUlSS1M9eQogQ09ORklHX1NMVUJfREVCVUc9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldApAQCAtMTU0LDYgKzE2OCw4IEBACiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQ9eQogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTE2Nyw3ICsxODMsNiBAQAogQ09ORklHX1NUT1BfTUFDSElORT15CiBDT05GSUdfQkxPQ0s9eQogIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKIENPTkZJR19CTEtfREVWX0JTRz15CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiAKQEAgLTE5NCwxMiArMjA5LDEyIEBACiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CiBDT05GSUdfU01QPXkKIENPTkZJR19TUEFSU0VfSVJRPXkKLUNPTkZJR19YODZfRklORF9TTVBfQ09ORklHPXkKIENPTkZJR19YODZfTVBQQVJTRT15CisjIENPTkZJR19YODZfQklHU01QIGlzIG5vdCBzZXQKK0NPTkZJR19YODZfRVhURU5ERURfUExBVEZPUk09eQogIyBDT05GSUdfWDg2X0VMQU4gaXMgbm90IHNldAotIyBDT05GSUdfWDg2X0dFTkVSSUNBUkNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1g4Nl9WU01QIGlzIG5vdCBzZXQKICMgQ09ORklHX1g4Nl9SREMzMjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1g4Nl8zMl9OT05fU1RBTkRBUkQgaXMgbm90IHNldAogQ09ORklHX1NDSEVEX09NSVRfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19QQVJBVklSVF9HVUVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1URVNUIGlzIG5vdCBzZXQKQEAgLTIzMCw4ICsyNDUsMTAgQEAKICMgQ09ORklHX0dFTkVSSUNfQ1BVIGlzIG5vdCBzZXQKIENPTkZJR19YODZfR0VORVJJQz15CiBDT05GSUdfWDg2X0NQVT15CitDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTPTY0CitDT05GSUdfWDg2X0lOVEVSTk9ERV9DQUNIRV9CWVRFUz02NAogQ09ORklHX1g4Nl9DTVBYQ0hHPXkKLUNPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQ9NworQ09ORklHX1g4Nl9MMV9DQUNIRV9TSElGVD01CiBDT05GSUdfWDg2X1hBREQ9eQogIyBDT05GSUdfWDg2X1BQUk9fRkVOQ0UgaXMgbm90IHNldAogQ09ORklHX1g4Nl9XUF9XT1JLU19PSz15CkBAIC0yNDcsNyArMjY0LDcgQEAKIENPTkZJR19DUFVfU1VQX0lOVEVMPXkKIENPTkZJR19DUFVfU1VQX0NZUklYXzMyPXkKIENPTkZJR19DUFVfU1VQX0FNRD15Ci1DT05GSUdfQ1BVX1NVUF9DRU5UQVVSXzMyPXkKK0NPTkZJR19DUFVfU1VQX0NFTlRBVVI9eQogQ09ORklHX0NQVV9TVVBfVFJBTlNNRVRBXzMyPXkKIENPTkZJR19DUFVfU1VQX1VNQ18zMj15CiBDT05GSUdfWDg2X0RTPXkKQEAgLTI3OSw2ICsyOTYsNyBAQAogQ09ORklHX01JQ1JPQ09ERV9PTERfSU5URVJGQUNFPXkKIENPTkZJR19YODZfTVNSPXkKIENPTkZJR19YODZfQ1BVSUQ9eQorIyBDT05GSUdfWDg2X0NQVV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19OT0hJR0hNRU0gaXMgbm90IHNldAogQ09ORklHX0hJR0hNRU00Rz15CiAjIENPTkZJR19ISUdITUVNNjRHIGlzIG5vdCBzZXQKQEAgLTMwMiw2ICszMjAsOCBAQAogQ09ORklHX0JPVU5DRT15CiBDT05GSUdfVklSVF9UT19CVVM9eQogQ09ORklHX1VORVZJQ1RBQkxFX0xSVT15CitDT05GSUdfSEFWRV9NTE9DSz15CitDT05GSUdfSEFWRV9NTE9DS0VEX1BBR0VfQklUPXkKIENPTkZJR19ISUdIUFRFPXkKIENPTkZJR19YODZfQ0hFQ0tfQklPU19DT1JSVVBUSU9OPXkKIENPTkZJR19YODZfQk9PVFBBUkFNX01FTU9SWV9DT1JSVVBUSU9OX0NIRUNLPXkKQEAgLTMxMiw2ICszMzIsNyBAQAogQ09ORklHX1g4Nl9QQVQ9eQogQ09ORklHX0VGST15CiBDT05GSUdfU0VDQ09NUD15CisjIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzMwMCBpcyBub3Qgc2V0CkBAIC0zMjIsOCArMzQzLDkgQEAKIENPTkZJR19DUkFTSF9EVU1QPXkKICMgQ09ORklHX0tFWEVDX0pVTVAgaXMgbm90IHNldAogQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MTAwMDAwMAotIyBDT05GSUdfUkVMT0NBVEFCTEUgaXMgbm90IHNldAotQ09ORklHX1BIWVNJQ0FMX0FMSUdOPTB4MjAwMDAwCitDT05GSUdfUkVMT0NBVEFCTEU9eQorQ09ORklHX1g4Nl9ORUVEX1JFTE9DUz15CitDT05GSUdfUEhZU0lDQUxfQUxJR049MHgxMDAwMDAwCiBDT05GSUdfSE9UUExVR19DUFU9eQogIyBDT05GSUdfQ09NUEFUX1ZEU08gaXMgbm90IHNldAogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKQEAgLTM2Myw3ICszODUsNiBAQAogQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAogIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ1BJX1BDSV9TTE9UIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX1NZU1RFTT15CiBDT05GSUdfWDg2X1BNX1RJTUVSPXkKIENPTkZJR19BQ1BJX0NPTlRBSU5FUj15CiAjIENPTkZJR19BQ1BJX1NCUyBpcyBub3Qgc2V0CkBAIC00MjUsNiArNDQ2LDcgQEAKIENPTkZJR19QQ0lfRElSRUNUPXkKIENPTkZJR19QQ0lfTU1DT05GSUc9eQogQ09ORklHX1BDSV9ET01BSU5TPXkKKyMgQ09ORklHX0RNQVIgaXMgbm90IHNldAogQ09ORklHX1BDSUVQT1JUQlVTPXkKICMgQ09ORklHX0hPVFBMVUdfUENJX1BDSUUgaXMgbm90IHNldAogQ09ORklHX1BDSUVBRVI9eQpAQCAtNDM1LDYgKzQ1Nyw3IEBACiAjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfUENJX1NUVUIgaXMgbm90IHNldAogQ09ORklHX0hUX0lSUT15CisjIENPTkZJR19QQ0lfSU9WIGlzIG5vdCBzZXQKIENPTkZJR19JU0FfRE1BX0FQST15CiAjIENPTkZJR19JU0EgaXMgbm90IHNldAogIyBDT05GSUdfTUNBIGlzIG5vdCBzZXQKQEAgLTQ4MSw3ICs1MDQsNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLUNPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQogQ09ORklHX1VOSVg9eQpAQCAtNjM5LDYgKzY2MSw3IEBACiAjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1NDSEVEPXkKIAogIwpAQCAtNjk2LDYgKzcxOSw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9UQ1BQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFJPUF9NT05JVE9SIGlzIG5vdCBzZXQKIENPTkZJR19IQU1SQURJTz15CiAKICMKQEAgLTcwNiwxMiArNzMwLDEwIEBACiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CiBDT05GSUdfRklCX1JVTEVTPXkKIENPTkZJR19XSVJFTEVTUz15CiBDT05GSUdfQ0ZHODAyMTE9eQogIyBDT05GSUdfQ0ZHODAyMTFfUkVHX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19OTDgwMjExPXkKIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlM9eQpAQCAtNzg5LDYgKzgxMSw3IEBACiAjIENPTkZJR19JQ1M5MzJTNDAxIGlzIG5vdCBzZXQKICMgQ09ORklHX0VOQ0xPU1VSRV9TRVJWSUNFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAorIyBDT05GSUdfSVNMMjkwMDMgaXMgbm90IHNldAogIyBDT05GSUdfQzJQT1JUIGlzIG5vdCBzZXQKIAogIwpAQCAtODQyLDYgKzg2NSw3IEBACiAjIENPTkZJR19TQ1NJX0xPV0xFVkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTE9XTEVWRUxfUENNQ0lBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfREggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9PU0RfSU5JVElBVE9SIGlzIG5vdCBzZXQKIENPTkZJR19BVEE9eQogIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIENPTkZJR19BVEFfQUNQST15CkBAIC05NDAsNiArOTY0LDcgQEAKIENPTkZJR19NQUNJTlRPU0hfRFJJVkVSUz15CiBDT05GSUdfTUFDX0VNVU1PVVNFQlROPXkKIENPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQogIyBDT05GSUdfSUZCIGlzIG5vdCBzZXQKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldApAQCAtOTc3LDYgKzEwMDIsOCBAQAogQ09ORklHX05FVF9WRU5ET1JfM0NPTT15CiAjIENPTkZJR19WT1JURVggaXMgbm90IHNldAogIyBDT05GSUdfVFlQSE9PTiBpcyBub3Qgc2V0CisjIENPTkZJR19FVEhPQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETkVUIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfVFVMSVA9eQogIyBDT05GSUdfREUyMTA0WCBpcyBub3Qgc2V0CiAjIENPTkZJR19UVUxJUCBpcyBub3Qgc2V0CkBAIC0xMDI2LDYgKzEwNTMsNyBAQAogQ09ORklHX0UxMDAwRT15CiAjIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSUdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQlZGIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApAQCAtMTA0MCw2ICsxMDY4LDcgQEAKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwxQyBpcyBub3Qgc2V0CiAjIENPTkZJR19KTUUgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKQEAgLTEwNDksNiArMTA3OCw3IEBACiAjIENPTkZJR19JWEdCRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKICMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfVlhHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX05JVSBpcyBub3Qgc2V0CkBAIC0xMDU4LDYgKzEwODgsNyBAQAogIyBDT05GSUdfQk5YMlggaXMgbm90IHNldAogIyBDT05GSUdfUUxHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRkMgaXMgbm90IHNldAorIyBDT05GSUdfQkUyTkVUIGlzIG5vdCBzZXQKIENPTkZJR19UUj15CiAjIENPTkZJR19JQk1PTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JQk1MUyBpcyBub3Qgc2V0CkBAIC0xMDczLDggKzExMDQsOCBAQAogIyBDT05GSUdfTElCRVJUQVMgaXMgbm90IHNldAogIyBDT05GSUdfTElCRVJUQVNfVEhJTkZJUk0gaXMgbm90IHNldAogIyBDT05GSUdfQUlSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAorIyBDT05GSUdfQVQ3NkM1MFhfVVNCIGlzIG5vdCBzZXQKICMgQ09ORklHX0FJUk9fQ1MgaXMgbm90IHNldAogIyBDT05GSUdfUENNQ0lBX1dMMzUwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKQEAgLTEwODQsMjEgKzExMTUsMjEgQEAKICMgQ09ORklHX1JUTDgxODcgaXMgbm90IHNldAogIyBDT05GSUdfQURNODIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMV9IV1NJTSBpcyBub3Qgc2V0CisjIENPTkZJR19NV0w4SyBpcyBub3Qgc2V0CiAjIENPTkZJR19QNTRfQ09NTU9OIGlzIG5vdCBzZXQKIENPTkZJR19BVEg1Sz15CiAjIENPTkZJR19BVEg1S19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEg5SyBpcyBub3Qgc2V0CisjIENPTkZJR19BUjkxNzBfVVNCIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAogIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0xDT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0xBR04gaXMgbm90IHNldAotIyBDT05GSUdfSVdMMzk0NSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CNDMgaXMgbm90IHNldAogIyBDT05GSUdfQjQzTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1pEMTIxMVJXIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUMlgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAogCiAjCiAjIEVuYWJsZSBXaU1BWCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKQEAgLTEyMDksNiArMTI0MCw4IEBACiAjIENPTkZJR19UQUJMRVRfVVNCX0tCVEFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBQkxFVF9VU0JfV0FDT00gaXMgbm90IHNldAogQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX0ZVSklUU1UgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fR1VOWkUgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRUxPIGlzIG5vdCBzZXQKQEAgLTEzMDMsNiArMTMzNiw3IEBACiAjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19IV19SQU5ET01fVElNRVJJT01FTSBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NX0lOVEVMPXkKIENPTkZJR19IV19SQU5ET01fQU1EPXkKIENPTkZJR19IV19SQU5ET01fR0VPREU9eQpAQCAtMTM5MCw3ICsxNDI0LDYgQEAKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CkBAIC0xNDI0LDYgKzE0NTcsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRFQ3NDc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSzhURU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRLMDExMCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSTVLX0FNQiBpcyBub3Qgc2V0CkBAIC0xNDMzLDYgKzE0NjcsNyBAQAogIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NITUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HNzYwQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQ09SRVRFTVAgaXMgbm90IHNldApAQCAtMTQ0OCwxMSArMTQ4MywxNCBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MVEM0MjE1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTFRDNDI0NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTUyNDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19ETUUxNzM3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldApAQCAtMTY0Myw3ICsxNjgxLDYgQEAKICMgQ09ORklHX0ZCXzNERlggaXMgbm90IHNldAogIyBDT05GSUdfRkJfVk9PRE9PMSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WVDg2MjMgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ1lCTEEgaXMgbm90IHNldAogIyBDT05GSUdfRkJfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9BUksgaXMgbm90IHNldAogIyBDT05GSUdfRkJfUE0zIGlzIG5vdCBzZXQKQEAgLTE2NTIsNiArMTY4OSw3IEBACiAjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01FVFJPTk9NRSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQjg2MlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0JST0FEU0hFRVQgaXMgbm90IHNldAogQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVD15CiAjIENPTkZJR19MQ0RfQ0xBU1NfREVWSUNFIGlzIG5vdCBzZXQKIENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFPXkKQEAgLTE3MzgsNiArMTc3Niw4IEBACiAjIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9JTkRJR09JTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfSU5ESUdPREogaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHT0lPWCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPREpYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9FTVUxMEsxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9FTVUxMEsxWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfRU5TMTM3MCBpcyBub3Qgc2V0CkBAIC0xODExLDE1ICsxODUxLDE3IEBACiAjCiAjIFNwZWNpYWwgSElEIGRyaXZlcnMKICMKLUNPTkZJR19ISURfQ09NUEFUPXkKIENPTkZJR19ISURfQTRURUNIPXkKIENPTkZJR19ISURfQVBQTEU9eQogQ09ORklHX0hJRF9CRUxLSU49eQogQ09ORklHX0hJRF9DSEVSUlk9eQogQ09ORklHX0hJRF9DSElDT05ZPXkKIENPTkZJR19ISURfQ1lQUkVTUz15CisjIENPTkZJR19EUkFHT05SSVNFX0ZGIGlzIG5vdCBzZXQKIENPTkZJR19ISURfRVpLRVk9eQorQ09ORklHX0hJRF9LWUU9eQogQ09ORklHX0hJRF9HWVJBVElPTj15CitDT05GSUdfSElEX0tFTlNJTkdUT049eQogQ09ORklHX0hJRF9MT0dJVEVDSD15CiBDT05GSUdfTE9HSVRFQ0hfRkY9eQogIyBDT05GSUdfTE9HSVJVTUJMRVBBRDJfRkYgaXMgbm90IHNldApAQCAtMTg4NSwxMSArMTkyNywxMSBAQAogIyBDT05GSUdfVVNCX1RNQyBpcyBub3Qgc2V0CiAKICMKLSMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heSBhbHNvIGJlIG5lZWRlZDsKKyMgTk9URTogVVNCX1NUT1JBR0UgZGVwZW5kcyBvbiBTQ1NJIGJ1dCBCTEtfREVWX1NEIG1heQogIwogCiAjCi0jIHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm9ybWF0aW9uCisjIGFsc28gYmUgbmVlZGVkOyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvCiAjCiBDT05GSUdfVVNCX1NUT1JBR0U9eQogIyBDT05GSUdfVVNCX1NUT1JBR0VfREVCVUcgaXMgbm90IHNldApAQCAtMTkzMSw3ICsxOTczLDYgQEAKICMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9QSElER0VUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9GVERJX0VMQU4gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CkBAIC0xOTQ3LDYgKzE5ODgsNyBAQAogIwogIyBPVEcgYW5kIHJlbGF0ZWQgaW5mcmFzdHJ1Y3R1cmUKICMKKyMgQ09ORklHX05PUF9VU0JfWENFSVYgaXMgbm90IHNldAogIyBDT05GSUdfVVdCIGlzIG5vdCBzZXQKICMgQ09ORklHX01NQyBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1TVElDSyBpcyBub3Qgc2V0CkBAIC0xOTU4LDggKzIwMDAsMTAgQEAKICMKICMgQ09ORklHX0xFRFNfQUxJWDIgaXMgbm90IHNldAogIyBDT05GSUdfTEVEU19QQ0E5NTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfTFA1NTIxIGlzIG5vdCBzZXQKICMgQ09ORklHX0xFRFNfQ0xFVk9fTUFJTCBpcyBub3Qgc2V0CiAjIENPTkZJR19MRURTX1BDQTk1NVggaXMgbm90IHNldAorIyBDT05GSUdfTEVEU19CRDI4MDIgaXMgbm90IHNldAogCiAjCiAjIExFRCBUcmlnZ2VycwpAQCAtMTk2OSw2ICsyMDEzLDEwIEBACiAjIENPTkZJR19MRURTX1RSSUdHRVJfSEVBUlRCRUFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xFRFNfVFJJR0dFUl9CQUNLTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfTEVEU19UUklHR0VSX0RFRkFVTFRfT04gaXMgbm90IHNldAorCisjCisjIGlwdGFibGVzIHRyaWdnZXIgaXMgdW5kZXIgTmV0ZmlsdGVyIGNvbmZpZyAoTEVEIHRhcmdldCkKKyMKICMgQ09ORklHX0FDQ0VTU0lCSUxJVFkgaXMgbm90IHNldAogIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CiBDT05GSUdfRURBQz15CkBAIC0yMDM3LDYgKzIwODUsNyBAQAogIyBETUEgRGV2aWNlcwogIwogIyBDT05GSUdfSU5URUxfSU9BVERNQSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVhESVNQTEFZIGlzIG5vdCBzZXQKICMgQ09ORklHX1VJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFHSU5HIGlzIG5vdCBzZXQKIENPTkZJR19YODZfUExBVEZPUk1fREVWSUNFUz15CkBAIC0yMDcxLDYgKzIxMjAsNyBAQAogIwogIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKQEAgLTIxMDEsNiArMjE1MSwxMSBAQAogQ09ORklHX0dFTkVSSUNfQUNMPXkKIAogIworIyBDYWNoZXMKKyMKKyMgQ09ORklHX0ZTQ0FDSEUgaXMgbm90IHNldAorCisjCiAjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKICMKIENPTkZJR19JU085NjYwX0ZTPXkKQEAgLTIxNTEsNiArMjIwNiw3IEBACiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUxGUzJfRlMgaXMgbm90IHNldAogQ09ORklHX05FVFdPUktfRklMRVNZU1RFTVM9eQogQ09ORklHX05GU19GUz15CiBDT05GSUdfTkZTX1YzPXkKQEAgLTIxNjQsNyArMjIyMCw2IEBACiBDT05GSUdfTkZTX0NPTU1PTj15CiBDT05GSUdfU1VOUlBDPXkKIENPTkZJR19TVU5SUENfR1NTPXkKLSMgQ09ORklHX1NVTlJQQ19SRUdJU1RFUl9WNCBpcyBub3Qgc2V0CiBDT05GSUdfUlBDU0VDX0dTU19LUkI1PXkKICMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKQEAgLTIyNTEsNiArMjMwNiw3IEBACiBDT05GSUdfREVCVUdfS0VSTkVMPXkKICMgQ09ORklHX0RFQlVHX1NISVJRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVEVDVF9IVU5HX1RBU0sgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfREVCVUcgaXMgbm90IHNldAogQ09ORklHX1NDSEVEU1RBVFM9eQogQ09ORklHX1RJTUVSX1NUQVRTPXkKQEAgLTIyNjYsNiArMjMyMiw3IEBACiAjIENPTkZJR19MT0NLX1NUQVQgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfTE9DS0lOR19BUElfU0VMRlRFU1RTIGlzIG5vdCBzZXQKK0NPTkZJR19TVEFDS1RSQUNFPXkKICMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfSElHSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CkBAIC0yMjg5LDEzICsyMzQ2LDE5IEBACiAjIENPTkZJR19GQVVMVF9JTkpFQ1RJT04gaXMgbm90IHNldAogIyBDT05GSUdfTEFURU5DWVRPUCBpcyBub3Qgc2V0CiBDT05GSUdfU1lTQ1RMX1NZU0NBTExfQ0hFQ0s9eQorIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKIENPTkZJR19VU0VSX1NUQUNLVFJBQ0VfU1VQUE9SVD15CitDT05GSUdfTk9QX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRVI9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFX01DT1VOVF9URVNUPXkKIENPTkZJR19IQVZFX0RZTkFNSUNfRlRSQUNFPXkKIENPTkZJR19IQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JEPXkKIENPTkZJR19IQVZFX0hXX0JSQU5DSF9UUkFDRVI9eQorQ09ORklHX0hBVkVfRlRSQUNFX1NZU0NBTExTPXkKK0NPTkZJR19SSU5HX0JVRkZFUj15CitDT05GSUdfVFJBQ0lORz15CitDT05GSUdfVFJBQ0lOR19TVVBQT1JUPXkKIAogIwogIyBUcmFjZXJzCkBAIC0yMzA1LDEzICsyMzY4LDIxIEBACiAjIENPTkZJR19TWVNQUk9GX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VWRU5UX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GVFJBQ0VfU1lTQ0FMTFMgaXMgbm90IHNldAogIyBDT05GSUdfQk9PVF9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfVFJBQ0VfQlJBTkNIX1BST0ZJTElORyBpcyBub3Qgc2V0CiAjIENPTkZJR19QT1dFUl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU1RBQ0tfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX0JSQU5DSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfS01FTVRSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dPUktRVUVVRV9UUkFDRVIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQorIyBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19NTUlPVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX1BST1ZJREVfT0hDSTEzOTRfRE1BX0lOSVQ9eQotIyBDT05GSUdfRFlOQU1JQ19QUklOVEtfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ETUFfQVBJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX1NBTVBMRVMgaXMgbm90IHNldAogQ09ORklHX0hBVkVfQVJDSF9LR0RCPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldApAQCAtMjMyMSw3ICsyMzkyLDYgQEAKIENPTkZJR19FQVJMWV9QUklOVEtfREJHUD15CiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0U9eQotIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1BFUl9DUFVfTUFQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19YODZfUFREVU1QIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19ST0RBVEE9eQpAQCAtMjMyOSw3ICsyMzk5LDcgQEAKIENPTkZJR19ERUJVR19OWF9URVNUPW0KICMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKIENPTkZJR19ET1VCTEVGQVVMVD15Ci0jIENPTkZJR19NTUlPVFJBQ0UgaXMgbm90IHNldAorQ09ORklHX0hBVkVfTU1JT1RSQUNFX1NVUFBPUlQ9eQogQ09ORklHX0lPX0RFTEFZX1RZUEVfMFg4MD0wCiBDT05GSUdfSU9fREVMQVlfVFlQRV8wWEVEPTEKIENPTkZJR19JT19ERUxBWV9UWVBFX1VERUxBWT0yCkBAIC0yMzY1LDYgKzI0MzUsOCBAQAogQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfQ0hFQ0tSRVFQUk9UX1ZBTFVFPTEKICMgQ09ORklHX1NFQ1VSSVRZX1NFTElOVVhfUE9MSUNZREJfVkVSU0lPTl9NQVggaXMgbm90IHNldAogIyBDT05GSUdfU0VDVVJJVFlfU01BQ0sgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFlfVE9NT1lPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lNQSBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPPXkKIAogIwpAQCAtMjM4MCwxMCArMjQ1MiwxMiBAQAogQ09ORklHX0NSWVBUT19IQVNIPXkKIENPTkZJR19DUllQVE9fSEFTSDI9eQogQ09ORklHX0NSWVBUT19STkcyPXkKK0NPTkZJR19DUllQVE9fUENPTVA9eQogQ09ORklHX0NSWVBUT19NQU5BR0VSPXkKIENPTkZJR19DUllQVE9fTUFOQUdFUjI9eQogIyBDT05GSUdfQ1JZUFRPX0dGMTI4TVVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fV09SS1FVRVVFPXkKICMgQ09ORklHX0NSWVBUT19DUllQVEQgaXMgbm90IHNldAogQ09ORklHX0NSWVBUT19BVVRIRU5DPXkKICMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKQEAgLTI0NTYsNiArMjUzMCw3IEBACiAjIENvbXByZXNzaW9uCiAjCiAjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWkxJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKIAogIwpAQCAtMjQ2NywxMSArMjU0MiwxMyBAQAogIyBDT05GSUdfQ1JZUFRPX0RFVl9HRU9ERSBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9LVk09eQorQ09ORklHX0hBVkVfS1ZNX0lSUUNISVA9eQogQ09ORklHX1ZJUlRVQUxJWkFUSU9OPXkKICMgQ09ORklHX0tWTSBpcyBub3Qgc2V0CiAjIENPTkZJR19MR1VFU1QgaXMgbm90IHNldAogIyBDT05GSUdfVklSVElPX1BDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19WSVJUSU9fQkFMTE9PTiBpcyBub3Qgc2V0CitDT05GSUdfQklOQVJZX1BSSU5URj15CiAKICMKICMgTGlicmFyeSByb3V0aW5lcwpAQCAtMjQ4OSw3ICsyNTY2LDEwIEBACiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX0FVRElUX0dFTkVSSUM9eQogQ09ORklHX1pMSUJfSU5GTEFURT15Ci1DT05GSUdfUExJU1Q9eQorQ09ORklHX0RFQ09NUFJFU1NfR1pJUD15CitDT05GSUdfREVDT01QUkVTU19CWklQMj15CitDT05GSUdfREVDT01QUkVTU19MWk1BPXkKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX05MQVRUUj15CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcgYi9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcKaW5kZXggOWZlNWQyMS4uY2VlMWRkMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY29uZmlncy94ODZfNjRfZGVmY29uZmlnCisrKyBiL2FyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZwpAQCAtMSwxMiArMSwxMyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjI5LXJjNAotIyBUdWUgRmViIDI0IDE1OjQ0OjE2IDIwMDkKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4zMC1yYzIKKyMgTW9uIE1heSAxMSAxNjoyMjowMCAyMDA5CiAjCiBDT05GSUdfNjRCSVQ9eQogIyBDT05GSUdfWDg2XzMyIGlzIG5vdCBzZXQKIENPTkZJR19YODZfNjQ9eQogQ09ORklHX1g4Nj15CitDT05GSUdfT1VUUFVUX0ZPUk1BVD0iZWxmNjQteDg2LTY0IgogQ09ORklHX0FSQ0hfREVGQ09ORklHPSJhcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWciCiBDT05GSUdfR0VORVJJQ19USU1FPXkKIENPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFPXkKQEAgLTM0LDYgKzM1LDcgQEAKIENPTkZJR19BUkNIX0hBU19ERUZBVUxUX0lETEU9eQogQ09ORklHX0FSQ0hfSEFTX0NBQ0hFX0xJTkVfU0laRT15CiBDT05GSUdfSEFWRV9TRVRVUF9QRVJfQ1BVX0FSRUE9eQorQ09ORklHX0hBVkVfRFlOQU1JQ19QRVJfQ1BVX0FSRUE9eQogQ09ORklHX0hBVkVfQ1BVTUFTS19PRl9DUFVfTUFQPXkKIENPTkZJR19BUkNIX0hJQkVSTkFUSU9OX1BPU1NJQkxFPXkKIENPTkZJR19BUkNIX1NVU1BFTkRfUE9TU0lCTEU9eQpAQCAtNDEsMTQgKzQzLDE0IEBACiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVA9eQogQ09ORklHX0FVRElUX0FSQ0g9eQogQ09ORklHX0FSQ0hfU1VQUE9SVFNfT1BUSU1JWkVEX0lOTElOSU5HPXkKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUT15Ci1DT05GSUdfWDg2X1NNUD15CiBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlM9eQogQ09ORklHX1g4Nl82NF9TTVA9eQogQ09ORklHX1g4Nl9IVD15Ci1DT05GSUdfWDg2X0JJT1NfUkVCT09UPXkKIENPTkZJR19YODZfVFJBTVBPTElORT15CiAjIENPTkZJR19LVElNRV9TQ0FMQVIgaXMgbm90IHNldAogQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKQEAgLTYxLDEwICs2MywxNyBAQAogQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgogQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgogIyBDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE8gaXMgbm90IHNldAorQ09ORklHX0hBVkVfS0VSTkVMX0daSVA9eQorQ09ORklHX0hBVkVfS0VSTkVMX0JaSVAyPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9MWk1BPXkKK0NPTkZJR19LRVJORUxfR1pJUD15CisjIENPTkZJR19LRVJORUxfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfS0VSTkVMX0xaTUEgaXMgbm90IHNldAogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1NZU1ZJUENfU1lTQ1RMPXkKIENPTkZJR19QT1NJWF9NUVVFVUU9eQorQ09ORklHX1BPU0lYX01RVUVVRV9TWVNDVEw9eQogQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1Q9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVF9WMyBpcyBub3Qgc2V0CiBDT05GSUdfVEFTS1NUQVRTPXkKQEAgLTExNCwyMyArMTIzLDI2IEBACiBDT05GSUdfTkVUX05TPXkKIENPTkZJR19CTEtfREVWX0lOSVRSRD15CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX1JEX0daSVA9eQorQ09ORklHX1JEX0JaSVAyPXkKK0NPTkZJR19SRF9MWk1BPXkKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiBDT05GSUdfU1lTQ1RMPXkKK0NPTkZJR19BTk9OX0lOT0RFUz15CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CiBDT05GSUdfVUlEMTY9eQogQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKIENPTkZJR19LQUxMU1lNUz15CiBDT05GSUdfS0FMTFNZTVNfQUxMPXkKIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTPXkKKyMgQ09ORklHX1NUUklQX0FTTV9TWU1TIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQogQ09ORklHX0JVRz15CiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX1BDU1BLUl9QTEFURk9STT15Ci0jIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX0ZVTEw9eQogQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19BTk9OX0lOT0RFUz15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NJR05BTEZEPXkKIENPTkZJR19USU1FUkZEPXkKQEAgLTE0MCw2ICsxNTIsNyBAQAogQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKIENPTkZJR19QQ0lfUVVJUktTPXkKIENPTkZJR19TTFVCX0RFQlVHPXkKKyMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CiBDT05GSUdfU0xVQj15CiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKQEAgLTE1NSw2ICsxNjgsOCBAQAogQ09ORklHX0hBVkVfS1BST0JFUz15CiBDT05GSUdfSEFWRV9LUkVUUFJPQkVTPXkKIENPTkZJR19IQVZFX0FSQ0hfVFJBQ0VIT09LPXkKK0NPTkZJR19IQVZFX0RNQV9BUElfREVCVUc9eQorIyBDT05GSUdfU0xPV19XT1JLIGlzIG5vdCBzZXQKICMgQ09ORklHX0hBVkVfR0VORVJJQ19ETUFfQ09IRVJFTlQgaXMgbm90IHNldAogQ09ORklHX1NMQUJJTkZPPXkKIENPTkZJR19SVF9NVVRFWEVTPXkKQEAgLTE2Nyw3ICsxODIsNiBAQAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19TVE9QX01BQ0hJTkU9eQogQ09ORklHX0JMT0NLPXkKLUNPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKIENPTkZJR19CTEtfREVWX0JTRz15CiAjIENPTkZJR19CTEtfREVWX0lOVEVHUklUWSBpcyBub3Qgc2V0CiBDT05GSUdfQkxPQ0tfQ09NUEFUPXkKQEAgLTE5NSwxMiArMjA5LDEwIEBACiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRD15CiBDT05GSUdfU01QPXkKIENPTkZJR19TUEFSU0VfSVJRPXkKLSMgQ09ORklHX05VTUFfTUlHUkFURV9JUlFfREVTQyBpcyBub3Qgc2V0Ci1DT05GSUdfWDg2X0ZJTkRfU01QX0NPTkZJRz15CiBDT05GSUdfWDg2X01QUEFSU0U9eQotIyBDT05GSUdfWDg2X0VMQU4gaXMgbm90IHNldAotIyBDT05GSUdfWDg2X0dFTkVSSUNBUkNIIGlzIG5vdCBzZXQKK0NPTkZJR19YODZfRVhURU5ERURfUExBVEZPUk09eQogIyBDT05GSUdfWDg2X1ZTTVAgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X1VWIGlzIG5vdCBzZXQKIENPTkZJR19TQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVI9eQogIyBDT05GSUdfUEFSQVZJUlRfR1VFU1QgaXMgbm90IHNldAogIyBDT05GSUdfTUVNVEVTVCBpcyBub3Qgc2V0CkBAIC0yMzAsMTAgKzI0MiwxMCBAQAogIyBDT05GSUdfTUNPUkUyIGlzIG5vdCBzZXQKIENPTkZJR19HRU5FUklDX0NQVT15CiBDT05GSUdfWDg2X0NQVT15Ci1DT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTPTEyOAotQ09ORklHX1g4Nl9JTlRFUk5PREVfQ0FDSEVfQllURVM9MTI4CitDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTPTY0CitDT05GSUdfWDg2X0lOVEVSTk9ERV9DQUNIRV9CWVRFUz02NAogQ09ORklHX1g4Nl9DTVBYQ0hHPXkKLUNPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQ9NworQ09ORklHX1g4Nl9MMV9DQUNIRV9TSElGVD02CiBDT05GSUdfWDg2X1dQX1dPUktTX09LPXkKIENPTkZJR19YODZfVFNDPXkKIENPTkZJR19YODZfQ01QWENIRzY0PXkKQEAgLTI0Miw3ICsyNTQsNyBAQAogQ09ORklHX1g4Nl9ERUJVR0NUTE1TUj15CiBDT05GSUdfQ1BVX1NVUF9JTlRFTD15CiBDT05GSUdfQ1BVX1NVUF9BTUQ9eQotQ09ORklHX0NQVV9TVVBfQ0VOVEFVUl82ND15CitDT05GSUdfQ1BVX1NVUF9DRU5UQVVSPXkKIENPTkZJR19YODZfRFM9eQogQ09ORklHX1g4Nl9QVFJBQ0VfQlRTPXkKIENPTkZJR19IUEVUX1RJTUVSPXkKQEAgLTI2OSw2ICsyODEsNyBAQAogQ09ORklHX1g4Nl9NQ0U9eQogQ09ORklHX1g4Nl9NQ0VfSU5URUw9eQogQ09ORklHX1g4Nl9NQ0VfQU1EPXkKK0NPTkZJR19YODZfTUNFX1RIUkVTSE9MRD15CiAjIENPTkZJR19JOEsgaXMgbm90IHNldAogQ09ORklHX01JQ1JPQ09ERT15CiBDT05GSUdfTUlDUk9DT0RFX0lOVEVMPXkKQEAgLTI3Niw2ICsyODksNyBAQAogQ09ORklHX01JQ1JPQ09ERV9PTERfSU5URVJGQUNFPXkKIENPTkZJR19YODZfTVNSPXkKIENPTkZJR19YODZfQ1BVSUQ9eQorIyBDT05GSUdfWDg2X0NQVV9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9QSFlTX0FERFJfVF82NEJJVD15CiBDT05GSUdfRElSRUNUX0dCUEFHRVM9eQogQ09ORklHX05VTUE9eQpAQCAtMzA5LDYgKzMyMyw4IEBACiBDT05GSUdfQk9VTkNFPXkKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKK0NPTkZJR19IQVZFX01MT0NLPXkKK0NPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQogQ09ORklHX1g4Nl9DSEVDS19CSU9TX0NPUlJVUFRJT049eQogQ09ORklHX1g4Nl9CT09UUEFSQU1fTUVNT1JZX0NPUlJVUFRJT05fQ0hFQ0s9eQogQ09ORklHX1g4Nl9SRVNFUlZFX0xPV182NEs9eQpAQCAtMzE3LDYgKzMzMyw3IEBACiBDT05GSUdfWDg2X1BBVD15CiBDT05GSUdfRUZJPXkKIENPTkZJR19TRUNDT01QPXkKKyMgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKQEAgLTMyNSw5ICszNDIsMTAgQEAKIENPTkZJR19TQ0hFRF9IUlRJQ0s9eQogQ09ORklHX0tFWEVDPXkKIENPTkZJR19DUkFTSF9EVU1QPXkKKyMgQ09ORklHX0tFWEVDX0pVTVAgaXMgbm90IHNldAogQ09ORklHX1BIWVNJQ0FMX1NUQVJUPTB4MTAwMDAwMAotIyBDT05GSUdfUkVMT0NBVEFCTEUgaXMgbm90IHNldAotQ09ORklHX1BIWVNJQ0FMX0FMSUdOPTB4MjAwMDAwCitDT05GSUdfUkVMT0NBVEFCTEU9eQorQ09ORklHX1BIWVNJQ0FMX0FMSUdOPTB4MTAwMDAwMAogQ09ORklHX0hPVFBMVUdfQ1BVPXkKICMgQ09ORklHX0NPTVBBVF9WRFNPIGlzIG5vdCBzZXQKICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CkBAIC0zNzAsNyArMzg4LDYgQEAKIENPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTAKICMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfQUNQSV9QQ0lfU0xPVCBpcyBub3Qgc2V0Ci1DT05GSUdfQUNQSV9TWVNURU09eQogQ09ORklHX1g4Nl9QTV9USU1FUj15CiBDT05GSUdfQUNQSV9DT05UQUlORVI9eQogIyBDT05GSUdfQUNQSV9TQlMgaXMgbm90IHNldApAQCAtNDM2LDYgKzQ1Myw3IEBACiAjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfUENJX1NUVUIgaXMgbm90IHNldAogQ09ORklHX0hUX0lSUT15CisjIENPTkZJR19QQ0lfSU9WIGlzIG5vdCBzZXQKIENPTkZJR19JU0FfRE1BX0FQST15CiBDT05GSUdfSzhfTkI9eQogQ09ORklHX1BDQ0FSRD15CkBAIC00ODEsNyArNDk5LDYgQEAKICMKICMgTmV0d29ya2luZyBvcHRpb25zCiAjCi1DT05GSUdfQ09NUEFUX05FVF9ERVZfT1BTPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1BBQ0tFVF9NTUFQPXkKIENPTkZJR19VTklYPXkKQEAgLTYzOSw2ICs2NTYsNyBAQAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CiAjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAogIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAogQ09ORklHX05FVF9TQ0hFRD15CiAKICMKQEAgLTY5Niw2ICs3MTQsNyBAQAogIwogIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRfVENQUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RST1BfTU9OSVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfSEFNUkFESU89eQogCiAjCkBAIC03MDYsMTIgKzcyNSwxMCBAQAogIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CiAjIENPTkZJR19CVCBpcyBub3Qgc2V0CiAjIENPTkZJR19BRl9SWFJQQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QSE9ORVQgaXMgbm90IHNldAogQ09ORklHX0ZJQl9SVUxFUz15CiBDT05GSUdfV0lSRUxFU1M9eQogQ09ORklHX0NGRzgwMjExPXkKICMgQ09ORklHX0NGRzgwMjExX1JFR19ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfTkw4MDIxMT15CiBDT05GSUdfV0lSRUxFU1NfT0xEX1JFR1VMQVRPUlk9eQogQ09ORklHX1dJUkVMRVNTX0VYVD15CiBDT05GSUdfV0lSRUxFU1NfRVhUX1NZU0ZTPXkKQEAgLTc4OCw5ICs4MDUsOCBAQAogIyBDT05GSUdfVElGTV9DT1JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lDUzkzMlM0MDEgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9YUCBpcyBub3Qgc2V0CiAjIENPTkZJR19IUF9JTE8gaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0dSVSBpcyBub3Qgc2V0CisjIENPTkZJR19JU0wyOTAwMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DMlBPUlQgaXMgbm90IHNldAogCiAjCkBAIC04NDQsNiArODYwLDcgQEAKICMgQ09ORklHX1NDU0lfTE9XTEVWRUwgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MT1dMRVZFTF9QQ01DSUEgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogQ09ORklHX0FUQV9BQ1BJPXkKQEAgLTk0MCw2ICs5NTcsNyBAQAogQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTPXkKIENPTkZJR19NQUNfRU1VTU9VU0VCVE49eQogQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0NPTVBBVF9ORVRfREVWX09QUz15CiAjIENPTkZJR19JRkIgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CkBAIC05NzcsNiArOTk1LDggQEAKIENPTkZJR19ORVRfVkVORE9SXzNDT009eQogIyBDT05GSUdfVk9SVEVYIGlzIG5vdCBzZXQKICMgQ09ORklHX1RZUEhPT04gaXMgbm90IHNldAorIyBDT05GSUdfRVRIT0MgaXMgbm90IHNldAorIyBDT05GSUdfRE5FVCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1RVTElQPXkKICMgQ09ORklHX0RFMjEwNFggaXMgbm90IHNldAogIyBDT05GSUdfVFVMSVAgaXMgbm90IHNldApAQCAtMTAyNiw2ICsxMDQ2LDcgQEAKICMgQ09ORklHX0UxMDAwRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JUDEwMDAgaXMgbm90IHNldAogIyBDT05GSUdfSUdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lHQlZGIGlzIG5vdCBzZXQKICMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAogIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CiAjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldApAQCAtMTA0MCw2ICsxMDYxLDcgQEAKICMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogIyBDT05GSUdfQVRMMSBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxRSBpcyBub3Qgc2V0CisjIENPTkZJR19BVEwxQyBpcyBub3Qgc2V0CiAjIENPTkZJR19KTUUgaXMgbm90IHNldAogQ09ORklHX05FVERFVl8xMDAwMD15CiAjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKQEAgLTEwNDksNiArMTA3MSw3IEBACiAjIENPTkZJR19JWEdCRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKICMgQ09ORklHX1MySU8gaXMgbm90IHNldAorIyBDT05GSUdfVlhHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX05JVSBpcyBub3Qgc2V0CkBAIC0xMDU4LDYgKzEwODEsNyBAQAogIyBDT05GSUdfQk5YMlggaXMgbm90IHNldAogIyBDT05GSUdfUUxHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRkMgaXMgbm90IHNldAorIyBDT05GSUdfQkUyTkVUIGlzIG5vdCBzZXQKIENPTkZJR19UUj15CiAjIENPTkZJR19JQk1PTCBpcyBub3Qgc2V0CiAjIENPTkZJR18zQzM1OSBpcyBub3Qgc2V0CkBAIC0xMDcyLDggKzEwOTYsOCBAQAogIyBDT05GSUdfTElCRVJUQVMgaXMgbm90IHNldAogIyBDT05GSUdfTElCRVJUQVNfVEhJTkZJUk0gaXMgbm90IHNldAogIyBDT05GSUdfQUlSTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAogIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAorIyBDT05GSUdfQVQ3NkM1MFhfVVNCIGlzIG5vdCBzZXQKICMgQ09ORklHX0FJUk9fQ1MgaXMgbm90IHNldAogIyBDT05GSUdfUENNQ0lBX1dMMzUwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19QUklTTTU0IGlzIG5vdCBzZXQKQEAgLTEwODMsMjEgKzExMDcsMjEgQEAKICMgQ09ORklHX1JUTDgxODcgaXMgbm90IHNldAogIyBDT05GSUdfQURNODIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUM4MDIxMV9IV1NJTSBpcyBub3Qgc2V0CisjIENPTkZJR19NV0w4SyBpcyBub3Qgc2V0CiAjIENPTkZJR19QNTRfQ09NTU9OIGlzIG5vdCBzZXQKIENPTkZJR19BVEg1Sz15CiAjIENPTkZJR19BVEg1S19ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEg5SyBpcyBub3Qgc2V0CisjIENPTkZJR19BUjkxNzBfVVNCIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVzIxMDAgaXMgbm90IHNldAogIyBDT05GSUdfSVBXMjIwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0xDT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lXTFdJRklfTEVEUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0xBR04gaXMgbm90IHNldAotIyBDT05GSUdfSVdMMzk0NSBpcyBub3Qgc2V0CisjIENPTkZJR19JV0xXSUZJIGlzIG5vdCBzZXQKICMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0CiAjIENPTkZJR19CNDMgaXMgbm90IHNldAogIyBDT05GSUdfQjQzTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX1pEMTIxMVJXIGlzIG5vdCBzZXQKICMgQ09ORklHX1JUMlgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAogCiAjCiAjIEVuYWJsZSBXaU1BWCAoTmV0d29ya2luZyBvcHRpb25zKSB0byBzZWUgdGhlIFdpTUFYIGRyaXZlcnMKQEAgLTEyMDgsNiArMTIzMiw4IEBACiAjIENPTkZJR19UQUJMRVRfVVNCX0tCVEFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1RBQkxFVF9VU0JfV0FDT00gaXMgbm90IHNldAogQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOPXkKKyMgQ09ORklHX1RPVUNIU0NSRUVOX0FENzg3OV9JMkMgaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5IGlzIG5vdCBzZXQKICMgQ09ORklHX1RPVUNIU0NSRUVOX0ZVSklUU1UgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fR1VOWkUgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRUxPIGlzIG5vdCBzZXQKQEAgLTEzMDEsNiArMTMyNyw3IEBACiAjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAogQ09ORklHX0hXX1JBTkRPTT15CisjIENPTkZJR19IV19SQU5ET01fVElNRVJJT01FTSBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET01fSU5URUwgaXMgbm90IHNldAogIyBDT05GSUdfSFdfUkFORE9NX0FNRCBpcyBub3Qgc2V0CiBDT05GSUdfTlZSQU09eQpAQCAtMTM4Miw3ICsxNDA5LDYgQEAKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0Y4NTc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfVFNMMjU1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CkBAIC0xNDE2LDYgKzE0NDIsNyBAQAogIyBDT05GSUdfU0VOU09SU19BRFQ3NDc1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSzhURU1QIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVNCMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQVRLMDExMCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FUWFAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRFMxNjIxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfSTVLX0FNQiBpcyBub3Qgc2V0CkBAIC0xNDI1LDYgKzE0NTIsNyBAQAogIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19GU0NITUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19HNzYwQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTE4U00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19HTDUyMFNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQ09SRVRFTVAgaXMgbm90IHNldApAQCAtMTQ0MCwxMSArMTQ2OCwxNCBAQAogIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0xNOTMgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19MVEM0MjE1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTFRDNDI0NSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xNOTUyNDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVgxNjE5IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTUFYNjY1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQzg3NDI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1NJUzU1OTUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19ETUUxNzM3IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldApAQCAtMTYzNSw2ICsxNjY2LDcgQEAKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01CODYyWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQlJPQURTSEVFVCBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKICMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAogQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQpAQCAtMTcyMCw2ICsxNzUyLDggQEAKICMgQ09ORklHX1NORF9JTkRJR08gaXMgbm90IHNldAogIyBDT05GSUdfU05EX0lORElHT0lPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9JTkRJR09ESiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPSU9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09ESlggaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKQEAgLTE3OTIsMTUgKzE4MjYsMTcgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX0hJRF9BNFRFQ0g9eQogQ09ORklHX0hJRF9BUFBMRT15CiBDT05GSUdfSElEX0JFTEtJTj15CiBDT05GSUdfSElEX0NIRVJSWT15CiBDT05GSUdfSElEX0NISUNPTlk9eQogQ09ORklHX0hJRF9DWVBSRVNTPXkKKyMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9FWktFWT15CitDT05GSUdfSElEX0tZRT15CiBDT05GSUdfSElEX0dZUkFUSU9OPXkKK0NPTkZJR19ISURfS0VOU0lOR1RPTj15CiBDT05GSUdfSElEX0xPR0lURUNIPXkKIENPTkZJR19MT0dJVEVDSF9GRj15CiAjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CkBAIC0xODY2LDExICsxOTAyLDExIEBACiAjIENPTkZJR19VU0JfVE1DIGlzIG5vdCBzZXQKIAogIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5IGFsc28gYmUgbmVlZGVkOworIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5CiAjCiAKICMKLSMgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm8KICMKIENPTkZJR19VU0JfU1RPUkFHRT15CiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CkBAIC0xOTEyLDcgKzE5NDgsNiBAQAogIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKQEAgLTE5MjgsNiArMTk2Myw3IEBACiAjCiAjIE9URyBhbmQgcmVsYXRlZCBpbmZyYXN0cnVjdHVyZQogIworIyBDT05GSUdfTk9QX1VTQl9YQ0VJViBpcyBub3Qgc2V0CiAjIENPTkZJR19VV0IgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKICMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKQEAgLTE5MzksOCArMTk3NSwxMCBAQAogIwogIyBDT05GSUdfTEVEU19BTElYMiBpcyBub3Qgc2V0CiAjIENPTkZJR19MRURTX1BDQTk1MzIgaXMgbm90IHNldAorIyBDT05GSUdfTEVEU19MUDU1MjEgaXMgbm90IHNldAogIyBDT05GSUdfTEVEU19DTEVWT19NQUlMIGlzIG5vdCBzZXQKICMgQ09ORklHX0xFRFNfUENBOTU1WCBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX0JEMjgwMiBpcyBub3Qgc2V0CiAKICMKICMgTEVEIFRyaWdnZXJzCkBAIC0xOTUwLDYgKzE5ODgsMTAgQEAKICMgQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQgaXMgbm90IHNldAogIyBDT05GSUdfTEVEU19UUklHR0VSX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTiBpcyBub3Qgc2V0CisKKyMKKyMgaXB0YWJsZXMgdHJpZ2dlciBpcyB1bmRlciBOZXRmaWx0ZXIgY29uZmlnIChMRUQgdGFyZ2V0KQorIwogIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIENPTkZJR19FREFDPXkKQEAgLTIwMTgsNiArMjA2MCw3IEBACiAjIERNQSBEZXZpY2VzCiAjCiAjIENPTkZJR19JTlRFTF9JT0FURE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogQ09ORklHX1g4Nl9QTEFURk9STV9ERVZJQ0VTPXkKQEAgLTIwNTEsNiArMjA5NCw3IEBACiAjCiAjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQogQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQpAQCAtMjA4Miw2ICsyMTI2LDExIEBACiBDT05GSUdfR0VORVJJQ19BQ0w9eQogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogQ09ORklHX0lTTzk2NjBfRlM9eQpAQCAtMjEzMiw2ICsyMTgxLDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMjE0NSw3ICsyMTk1LDYgQEAKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogQ09ORklHX1NVTlJQQ19HU1M9eQotIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldApAQCAtMjIzMiw2ICsyMjgxLDcgQEAKIENPTkZJR19ERUJVR19LRVJORUw9eQogIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAogIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVURUNUX0hVTkdfVEFTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfU0NIRURTVEFUUz15CiBDT05GSUdfVElNRVJfU1RBVFM9eQpAQCAtMjI0Nyw2ICsyMjk3LDcgQEAKICMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CiAjIENPTkZJR19ERUJVR19JTkZPIGlzIG5vdCBzZXQKQEAgLTIyNjksMTMgKzIzMjAsMTkgQEAKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAogQ09ORklHX1VTRVJfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX0hBVkVfSFdfQlJBTkNIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVFJBQ0VfU1lTQ0FMTFM9eQorQ09ORklHX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTIyODUsMTMgKzIzNDIsMjEgQEAKICMgQ09ORklHX1NZU1BST0ZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfQlJBTkNIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JT19UUkFDRT15CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NSU9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfUFJPVklERV9PSENJMTM5NF9ETUFfSU5JVD15Ci0jIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC0yMzAxLDE0ICsyMzY2LDEzIEBACiBDT05GSUdfRUFSTFlfUFJJTlRLX0RCR1A9eQogQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQogQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFPXkKLSMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19QRVJfQ1BVX01BUFMgaXMgbm90IHNldAogIyBDT05GSUdfWDg2X1BURFVNUCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfUk9EQVRBPXkKICMgQ09ORklHX0RFQlVHX1JPREFUQV9URVNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19OWF9URVNUPW0KICMgQ09ORklHX0lPTU1VX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX01NSU9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9NTUlPVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfSU9fREVMQVlfVFlQRV8wWDgwPTAKIENPTkZJR19JT19ERUxBWV9UWVBFXzBYRUQ9MQogQ09ORklHX0lPX0RFTEFZX1RZUEVfVURFTEFZPTIKQEAgLTIzNDQsNiArMjQwOCw4IEBACiBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9DSEVDS1JFUVBST1RfVkFMVUU9MQogIyBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9QT0xJQ1lEQl9WRVJTSU9OX01BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9TTUFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9UT01PWU8gaXMgbm90IHNldAorIyBDT05GSUdfSU1BIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE89eQogCiAjCkBAIC0yMzU5LDEwICsyNDI1LDEyIEBACiBDT05GSUdfQ1JZUFRPX0hBU0g9eQogQ09ORklHX0NSWVBUT19IQVNIMj15CiBDT05GSUdfQ1JZUFRPX1JORzI9eQorQ09ORklHX0NSWVBUT19QQ09NUD15CiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19NQU5BR0VSMj15CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19XT1JLUVVFVUU9eQogIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FVVEhFTkM9eQogIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldApAQCAtMjQxNCw2ICsyNDgyLDcgQEAKICMKIENPTkZJR19DUllQVE9fQUVTPXkKICMgQ09ORklHX0NSWVBUT19BRVNfWDg2XzY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BRVNfTklfSU5URUwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FSQzQ9eQogIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKQEAgLTI0MzUsNiArMjUwNCw3IEBACiAjIENvbXByZXNzaW9uCiAjCiAjIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fWkxJQiBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTFpPIGlzIG5vdCBzZXQKIAogIwpAQCAtMjQ0NCwxMCArMjUxNCwxMiBAQAogQ09ORklHX0NSWVBUT19IVz15CiAjIENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9LVk09eQorQ09ORklHX0hBVkVfS1ZNX0lSUUNISVA9eQogQ09ORklHX1ZJUlRVQUxJWkFUSU9OPXkKICMgQ09ORklHX0tWTSBpcyBub3Qgc2V0CiAjIENPTkZJR19WSVJUSU9fUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJUlRJT19CQUxMT09OIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0yNDY0LDcgKzI1MzYsMTAgQEAKICMgQ09ORklHX0NSQzcgaXMgbm90IHNldAogIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKIENPTkZJR19aTElCX0lORkxBVEU9eQotQ09ORklHX1BMSVNUPXkKK0NPTkZJR19ERUNPTVBSRVNTX0daSVA9eQorQ09ORklHX0RFQ09NUFJFU1NfQlpJUDI9eQorQ09ORklHX0RFQ09NUFJFU1NfTFpNQT15CiBDT05GSUdfSEFTX0lPTUVNPXkKIENPTkZJR19IQVNfSU9QT1JUPXkKIENPTkZJR19IQVNfRE1BPXkKK0NPTkZJR19OTEFUVFI9eQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUyBiL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKaW5kZXggYTUwNTIwMi4uZTU5MDI2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUworKysgYi9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCkBAIC04MjUsOSArODI1LDExIEBACiAJLnF1YWQgY29tcGF0X3N5c19zaWduYWxmZDQKIAkucXVhZCBzeXNfZXZlbnRmZDIKIAkucXVhZCBzeXNfZXBvbGxfY3JlYXRlMQotCS5xdWFkIHN5c19kdXAzCQkJLyogMzMwICovCisJLnF1YWQgc3lzX2R1cDMJCQkJLyogMzMwICovCiAJLnF1YWQgc3lzX3BpcGUyCiAJLnF1YWQgc3lzX2lub3RpZnlfaW5pdDEKIAkucXVhZCBjb21wYXRfc3lzX3ByZWFkdgogCS5xdWFkIGNvbXBhdF9zeXNfcHdyaXRldgorCS5xdWFkIGNvbXBhdF9zeXNfcnRfdGdzaWdxdWV1ZWluZm8JLyogMzM1ICovCisJLnF1YWQgc3lzX3BlcmZfY291bnRlcl9vcGVuCiBpYTMyX3N5c2NhbGxfZW5kOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKaW5kZXggZjZhYTE4ZS4uMWEzN2JjZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCkBAIC0zLDYgKzMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxhc20vYXNtLmg+CiAKIC8qCkBAIC03NCw2ICs3NSwyMiBAQAogCiBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCAqZmluZF9ub3BfdGFibGUodm9pZCk7CiAKKy8qIGFsdGVybmF0aXZlIGFzc2VtYmx5IHByaW1pdGl2ZTogKi8KKyNkZWZpbmUgQUxURVJOQVRJVkUob2xkaW5zdHIsIG5ld2luc3RyLCBmZWF0dXJlKQkJCVwKKwkJCQkJCQkJCVwKKyAgICAgICI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIgkJCQkJXAorICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsXCJhXCJcbiIJCQkJXAorICAgICAgX0FTTV9BTElHTiAiXG4iCQkJCQkJCVwKKyAgICAgIF9BU01fUFRSICI2NjFiXG4iCQkJCS8qIGxhYmVsICAgICAgICAgICAqLwlcCisgICAgICBfQVNNX1BUUiAiNjYzZlxuIgkJCQkvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAorICAgICAgIgkgLmJ5dGUgIiBfX3N0cmluZ2lmeShmZWF0dXJlKSAiXG4iCS8qIGZlYXR1cmUgYml0ICAgICAqLwlcCisgICAgICAiCSAuYnl0ZSA2NjJiLTY2MWJcbiIJCQkvKiBzb3VyY2VsZW4gICAgICAgKi8JXAorICAgICAgIgkgLmJ5dGUgNjY0Zi02NjNmXG4iCQkJLyogcmVwbGFjZW1lbnRsZW4gICovCVwKKyAgICAgICIucHJldmlvdXNcbiIJCQkJCQkJXAorICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgXCJheFwiXG4iCQkJXAorICAgICAgIjY2Mzpcblx0IiBuZXdpbnN0ciAiXG42NjQ6XG4iCQkvKiByZXBsYWNlbWVudCAgICAgKi8JXAorICAgICAgIi5wcmV2aW91cyIKKwogLyoKICAqIEFsdGVybmF0aXZlIGluc3RydWN0aW9ucyBmb3IgZGlmZmVyZW50IENQVSB0eXBlcyBvciBjYXBhYmlsaXRpZXMuCiAgKgpAQCAtODcsMTggKzEwNCw3IEBACiAgKiB3aXRob3V0IHZvbGF0aWxlIGFuZCBtZW1vcnkgY2xvYmJlci4KICAqLwogI2RlZmluZSBhbHRlcm5hdGl2ZShvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUpCQkJXAotCWFzbSB2b2xhdGlsZSAoIjY2MTpcblx0IiBvbGRpbnN0ciAiXG42NjI6XG4iCQkJXAotCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIgkJXAotCQkgICAgICBfQVNNX0FMSUdOICJcbiIJCQkJCVwKLQkJICAgICAgX0FTTV9QVFIgIjY2MWJcbiIJCS8qIGxhYmVsICovCQlcCi0JCSAgICAgIF9BU01fUFRSICI2NjNmXG4iCQkvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAotCQkgICAgICAiCSAuYnl0ZSAlYzBcbiIJCS8qIGZlYXR1cmUgYml0ICovCVwKLQkJICAgICAgIgkgLmJ5dGUgNjYyYi02NjFiXG4iCS8qIHNvdXJjZWxlbiAqLwkJXAotCQkgICAgICAiCSAuYnl0ZSA2NjRmLTY2M2ZcbiIJLyogcmVwbGFjZW1lbnRsZW4gKi8JXAotCQkgICAgICAiLnByZXZpb3VzXG4iCQkJCQlcCi0JCSAgICAgICIuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsXCJheFwiXG4iCQlcCi0JCSAgICAgICI2NjM6XG5cdCIgbmV3aW5zdHIgIlxuNjY0OlxuIiAgLyogcmVwbGFjZW1lbnQgKi8JXAotCQkgICAgICAiLnByZXZpb3VzIiA6OiAiaSIgKGZlYXR1cmUpIDogIm1lbW9yeSIpCisJYXNtIHZvbGF0aWxlIChBTFRFUk5BVElWRShvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUpIDogOiA6ICJtZW1vcnkiKQogCiAvKgogICogQWx0ZXJuYXRpdmUgaW5saW5lIGFzc2VtYmx5IHdpdGggaW5wdXQuCkBAIC0xMDksMzUgKzExNSwxNiBAQAogICogQmVzdCBpcyB0byB1c2UgY29uc3RyYWludHMgdGhhdCBhcmUgZml4ZWQgc2l6ZSAobGlrZSAoJTEpIC4uLiAiciIpCiAgKiBJZiB5b3UgdXNlIHZhcmlhYmxlIHNpemVkIGNvbnN0cmFpbnRzIGxpa2UgIm0iIG9yICJnIiBpbiB0aGUKICAqIHJlcGxhY2VtZW50IG1ha2Ugc3VyZSB0byBwYWQgdG8gdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLgorICogTGVhdmluZyBhbiB1bnVzZWQgYXJndW1lbnQgMCB0byBrZWVwIEFQSSBjb21wYXRpYmlsaXR5LgogICovCiAjZGVmaW5lIGFsdGVybmF0aXZlX2lucHV0KG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZSwgaW5wdXQuLi4pCVwKLQlhc20gdm9sYXRpbGUgKCI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIgkJCVwKLQkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsXCJhXCJcbiIJCVwKLQkJICAgICAgX0FTTV9BTElHTiAiXG4iCQkJCQlcCi0JCSAgICAgIF9BU01fUFRSICI2NjFiXG4iCQkvKiBsYWJlbCAqLwkJXAotCQkgICAgICBfQVNNX1BUUiAiNjYzZlxuIgkJLyogbmV3IGluc3RydWN0aW9uICovCVwKLQkJICAgICAgIgkgLmJ5dGUgJWMwXG4iCQkvKiBmZWF0dXJlIGJpdCAqLwlcCi0JCSAgICAgICIJIC5ieXRlIDY2MmItNjYxYlxuIgkvKiBzb3VyY2VsZW4gKi8JCVwKLQkJICAgICAgIgkgLmJ5dGUgNjY0Zi02NjNmXG4iCS8qIHJlcGxhY2VtZW50bGVuICovCVwKLQkJICAgICAgIi5wcmV2aW91c1xuIgkJCQkJXAotCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LFwiYXhcIlxuIgkJXAotCQkgICAgICAiNjYzOlxuXHQiIG5ld2luc3RyICJcbjY2NDpcbiIgIC8qIHJlcGxhY2VtZW50ICovCVwKLQkJICAgICAgIi5wcmV2aW91cyIgOjogImkiIChmZWF0dXJlKSwgIyNpbnB1dCkKKwlhc20gdm9sYXRpbGUgKEFMVEVSTkFUSVZFKG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZSkJCVwKKwkJOiA6ICJpIiAoMCksICMjIGlucHV0KQogCiAvKiBMaWtlIGFsdGVybmF0aXZlX2lucHV0LCBidXQgd2l0aCBhIHNpbmdsZSBvdXRwdXQgYXJndW1lbnQgKi8KICNkZWZpbmUgYWx0ZXJuYXRpdmVfaW8ob2xkaW5zdHIsIG5ld2luc3RyLCBmZWF0dXJlLCBvdXRwdXQsIGlucHV0Li4uKQlcCi0JYXNtIHZvbGF0aWxlICgiNjYxOlxuXHQiIG9sZGluc3RyICJcbjY2MjpcbiIJCQlcCi0JCSAgICAgICIuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLFwiYVwiXG4iCQlcCi0JCSAgICAgIF9BU01fQUxJR04gIlxuIgkJCQkJXAotCQkgICAgICBfQVNNX1BUUiAiNjYxYlxuIgkJLyogbGFiZWwgKi8JCVwKLQkJICAgICAgX0FTTV9QVFIgIjY2M2ZcbiIJCS8qIG5ldyBpbnN0cnVjdGlvbiAqLwlcCi0JCSAgICAgICIJIC5ieXRlICVjW2ZlYXRdXG4iCS8qIGZlYXR1cmUgYml0ICovCVwKLQkJICAgICAgIgkgLmJ5dGUgNjYyYi02NjFiXG4iCS8qIHNvdXJjZWxlbiAqLwkJXAotCQkgICAgICAiCSAuYnl0ZSA2NjRmLTY2M2ZcbiIJLyogcmVwbGFjZW1lbnRsZW4gKi8JXAotCQkgICAgICAiLnByZXZpb3VzXG4iCQkJCQlcCi0JCSAgICAgICIuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsXCJheFwiXG4iCQlcCi0JCSAgICAgICI2NjM6XG5cdCIgbmV3aW5zdHIgIlxuNjY0OlxuIiAgLyogcmVwbGFjZW1lbnQgKi8gXAotCQkgICAgICAiLnByZXZpb3VzIiA6IG91dHB1dCA6IFtmZWF0XSAiaSIgKGZlYXR1cmUpLCAjI2lucHV0KQorCWFzbSB2b2xhdGlsZSAoQUxURVJOQVRJVkUob2xkaW5zdHIsIG5ld2luc3RyLCBmZWF0dXJlKQkJXAorCQk6IG91dHB1dCA6ICJpIiAoMCksICMjIGlucHV0KQogCiAvKgogICogdXNlIHRoaXMgbWFjcm8ocykgaWYgeW91IG5lZWQgbW9yZSB0aGFuIG9uZSBvdXRwdXQgcGFyYW1ldGVyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdS5oCmluZGV4IGY3MTIzNDQuLjI2MmUwMjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdS5oCkBAIC0yNyw2ICsyNyw4IEBACiBleHRlcm4gaW50IGFtZF9pb21tdV9pbml0X2RtYV9vcHModm9pZCk7CiBleHRlcm4gdm9pZCBhbWRfaW9tbXVfZGV0ZWN0KHZvaWQpOwogZXh0ZXJuIGlycXJldHVybl90IGFtZF9pb21tdV9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIGFtZF9pb21tdV9mbHVzaF9hbGxfZG9tYWlucyh2b2lkKTsKK2V4dGVybiB2b2lkIGFtZF9pb21tdV9mbHVzaF9hbGxfZGV2aWNlcyh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBhbWRfaW9tbXVfaW5pdCh2b2lkKSB7IHJldHVybiAtRU5PREVWOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYW1kX2lvbW11X2RldGVjdCh2b2lkKSB7IH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdV90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3R5cGVzLmgKaW5kZXggOTVjOGNkOS4uMGM4NzhjYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3R5cGVzLmgKQEAgLTE5NCw2ICsxOTQsMjcgQEAKICNkZWZpbmUgUERfRE1BX09QU19NQVNLCQkoMVVMIDw8IDApIC8qIGRvbWFpbiB1c2VkIGZvciBkbWFfb3BzICovCiAjZGVmaW5lIFBEX0RFRkFVTFRfTUFTSwkJKDFVTCA8PCAxKSAvKiBkb21haW4gaXMgYSBkZWZhdWx0IGRtYV9vcHMKIAkJCQkJICAgICAgZG9tYWluIGZvciBhbiBJT01NVSAqLworZXh0ZXJuIGJvb2wgYW1kX2lvbW11X2R1bXA7CisjZGVmaW5lIERVTVBfcHJpbnRrKGZvcm1hdCwgYXJnLi4uKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKGFtZF9pb21tdV9kdW1wKQkJCQkJCVwKKwkJCXByaW50ayhLRVJOX0lORk8gIkFNRCBJT01NVTogIiBmb3JtYXQsICMjIGFyZyk7CVwKKwl9IHdoaWxlKDApOworCisvKgorICogTWFrZSBpdGVyYXRpbmcgb3ZlciBhbGwgSU9NTVVzIGVhc2llcgorICovCisjZGVmaW5lIGZvcl9lYWNoX2lvbW11KGlvbW11KSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeSgoaW9tbXUpLCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpCisjZGVmaW5lIGZvcl9lYWNoX2lvbW11X3NhZmUoaW9tbXUsIG5leHQpIFwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoKGlvbW11KSwgKG5leHQpLCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpCisKKyNkZWZpbmUgQVBFUlRVUkVfUkFOR0VfU0hJRlQJMjcJLyogMTI4IE1CICovCisjZGVmaW5lIEFQRVJUVVJFX1JBTkdFX1NJWkUJKDFVTEwgPDwgQVBFUlRVUkVfUkFOR0VfU0hJRlQpCisjZGVmaW5lIEFQRVJUVVJFX1JBTkdFX1BBR0VTCShBUEVSVFVSRV9SQU5HRV9TSVpFID4+IFBBR0VfU0hJRlQpCisjZGVmaW5lIEFQRVJUVVJFX01BWF9SQU5HRVMJMzIJLyogYWxsb3dzIDRHQiBvZiBETUEgYWRkcmVzcyBzcGFjZSAqLworI2RlZmluZSBBUEVSVFVSRV9SQU5HRV9JTkRFWChhKQkoKGEpID4+IEFQRVJUVVJFX1JBTkdFX1NISUZUKQorI2RlZmluZSBBUEVSVFVSRV9QQUdFX0lOREVYKGEpCSgoKGEpID4+IDIxKSAmIDB4M2ZVTEwpCiAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBnZW5lcmljIGRhdGEgZm9yICBJT01NVSBwcm90ZWN0aW9uIGRvbWFpbnMKQEAgLTIxMCw2ICsyMzEsMjYgQEAKIH07CiAKIC8qCisgKiBGb3IgZHluYW1pYyBncm93dGggdGhlIGFwZXJ0dXJlIHNpemUgaXMgc3BsaXQgaW50byByYW5nZXMgb2YgMTI4TUIgb2YKKyAqIERNQSBhZGRyZXNzIHNwYWNlIGVhY2guIFRoaXMgc3RydWN0IHJlcHJlc2VudHMgb25lIHN1Y2ggcmFuZ2UuCisgKi8KK3N0cnVjdCBhcGVydHVyZV9yYW5nZSB7CisKKwkvKiBhZGRyZXNzIGFsbG9jYXRpb24gYml0bWFwICovCisJdW5zaWduZWQgbG9uZyAqYml0bWFwOworCisJLyoKKwkgKiBBcnJheSBvZiBQVEUgcGFnZXMgZm9yIHRoZSBhcGVydHVyZS4gSW4gdGhpcyBhcnJheSB3ZSBzYXZlIGFsbCB0aGUKKwkgKiBsZWFmIHBhZ2VzIG9mIHRoZSBkb21haW4gcGFnZSB0YWJsZSB1c2VkIGZvciB0aGUgYXBlcnR1cmUuIFRoaXMgd2F5CisJICogd2UgZG9uJ3QgbmVlZCB0byB3YWxrIHRoZSBwYWdlIHRhYmxlIHRvIGZpbmQgYSBzcGVjaWZpYyBQVEUuIFdlIGNhbgorCSAqIGp1c3QgY2FsY3VsYXRlIGl0cyBhZGRyZXNzIGluIGNvbnN0YW50IHRpbWUuCisJICovCisJdTY0ICpwdGVfcGFnZXNbNjRdOworCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7Cit9OworCisvKgogICogRGF0YSBjb250YWluZXIgZm9yIGEgZG1hX29wcyBzcGVjaWZpYyBwcm90ZWN0aW9uIGRvbWFpbgogICovCiBzdHJ1Y3QgZG1hX29wc19kb21haW4gewpAQCAtMjIyLDE4ICsyNjMsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGFwZXJ0dXJlX3NpemU7CiAKIAkvKiBhZGRyZXNzIHdlIHN0YXJ0IHRvIHNlYXJjaCBmb3IgZnJlZSBhZGRyZXNzZXMgKi8KLQl1bnNpZ25lZCBsb25nIG5leHRfYml0OworCXVuc2lnbmVkIGxvbmcgbmV4dF9hZGRyZXNzOwogCi0JLyogYWRkcmVzcyBhbGxvY2F0aW9uIGJpdG1hcCAqLwotCXVuc2lnbmVkIGxvbmcgKmJpdG1hcDsKLQotCS8qCi0JICogQXJyYXkgb2YgUFRFIHBhZ2VzIGZvciB0aGUgYXBlcnR1cmUuIEluIHRoaXMgYXJyYXkgd2Ugc2F2ZSBhbGwgdGhlCi0JICogbGVhZiBwYWdlcyBvZiB0aGUgZG9tYWluIHBhZ2UgdGFibGUgdXNlZCBmb3IgdGhlIGFwZXJ0dXJlLiBUaGlzIHdheQotCSAqIHdlIGRvbid0IG5lZWQgdG8gd2FsayB0aGUgcGFnZSB0YWJsZSB0byBmaW5kIGEgc3BlY2lmaWMgUFRFLiBXZSBjYW4KLQkgKiBqdXN0IGNhbGN1bGF0ZSBpdHMgYWRkcmVzcyBpbiBjb25zdGFudCB0aW1lLgotCSAqLwotCXU2NCAqKnB0ZV9wYWdlczsKKwkvKiBhZGRyZXNzIHNwYWNlIHJlbGV2YW50IGRhdGEgKi8KKwlzdHJ1Y3QgYXBlcnR1cmVfcmFuZ2UgKmFwZXJ0dXJlW0FQRVJUVVJFX01BWF9SQU5HRVNdOwogCiAJLyogVGhpcyB3aWxsIGJlIHNldCB0byB0cnVlIHdoZW4gVExCIG5lZWRzIHRvIGJlIGZsdXNoZWQgKi8KIAlib29sIG5lZWRfZmx1c2g7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKaW5kZXggNDJmMmY4My4uYmI3ZDQ3OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaApAQCAtMTA3LDggKzEwNyw3IEBACiBleHRlcm4gdm9pZCBuYXRpdmVfYXBpY19pY3Jfd3JpdGUodTMyIGxvdywgdTMyIGlkKTsKIGV4dGVybiB1NjQgbmF0aXZlX2FwaWNfaWNyX3JlYWQodm9pZCk7CiAKLSNkZWZpbmUgRUlNXzhCSVRfQVBJQ19JRAkwCi0jZGVmaW5lIEVJTV8zMkJJVF9BUElDX0lECTEKK2V4dGVybiBpbnQgeDJhcGljX21vZGU7CiAKICNpZmRlZiBDT05GSUdfWDg2X1gyQVBJQwogLyoKQEAgLTE2NiwxMCArMTY1LDkgQEAKIAlyZXR1cm4gdmFsOwogfQogCi1leHRlcm4gaW50IHgyYXBpYywgeDJhcGljX3BoeXM7CitleHRlcm4gaW50IHgyYXBpY19waHlzOwogZXh0ZXJuIHZvaWQgY2hlY2tfeDJhcGljKHZvaWQpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX3gyYXBpYyh2b2lkKTsKLWV4dGVybiB2b2lkIGVuYWJsZV9JUl94MmFwaWModm9pZCk7CiBleHRlcm4gdm9pZCB4MmFwaWNfaWNyX3dyaXRlKHUzMiBsb3csIHUzMiBpZCk7CiBzdGF0aWMgaW5saW5lIGludCB4MmFwaWNfZW5hYmxlZCh2b2lkKQogewpAQCAtMTgzLDYgKzE4MSw4IEBACiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQorCisjZGVmaW5lIHgyYXBpY19zdXBwb3J0ZWQoKQkoY3B1X2hhc194MmFwaWMpCiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3gyYXBpYyh2b2lkKQogewpAQCAtMTkwLDI4ICsxOTAsMjAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfeDJhcGljKHZvaWQpCiB7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX0lSX3gyYXBpYyh2b2lkKQotewotfQogc3RhdGljIGlubGluZSBpbnQgeDJhcGljX2VuYWJsZWQodm9pZCkKIHsKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZQl4MmFwaWMJMAotCisjZGVmaW5lCXgyYXBpY19wcmVlbmFibGVkIDAKKyNkZWZpbmUJeDJhcGljX3N1cHBvcnRlZCgpCTAKICNlbmRpZgogCitleHRlcm4gdm9pZCBlbmFibGVfSVJfeDJhcGljKHZvaWQpOworCiBleHRlcm4gaW50IGdldF9waHlzaWNhbF9icm9hZGNhc3Qodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X1gyQVBJQwotc3RhdGljIGlubGluZSB2b2lkIGFja194MkFQSUNfaXJxKHZvaWQpCi17Ci0JLyogRG9jcyBzYXkgdXNlIDAgZm9yIGZ1dHVyZSBjb21wYXRpYmlsaXR5ICovCi0JbmF0aXZlX2FwaWNfbXNyX3dyaXRlKEFQSUNfRU9JLCAwKTsKLX0KLSNlbmRpZgotCitleHRlcm4gdm9pZCBhcGljX2Rpc2FibGUodm9pZCk7CiBleHRlcm4gaW50IGxhcGljX2dldF9tYXhsdnQodm9pZCk7CiBleHRlcm4gdm9pZCBjbGVhcl9sb2NhbF9BUElDKHZvaWQpOwogZXh0ZXJuIHZvaWQgY29ubmVjdF9ic3BfQVBJQyh2b2lkKTsKQEAgLTI1Miw3ICsyNDQsNyBAQAogI2RlZmluZSBsb2NhbF9hcGljX3RpbWVyX2MyX29rCQkxCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9hcGljX21hcHBpbmdzKHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfbG9jYWxfQVBJQyh2b2lkKSB7IH0KLQorc3RhdGljIGlubGluZSB2b2lkIGFwaWNfZGlzYWJsZSh2b2lkKSB7IH0KICNlbmRpZiAvKiAhQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC00MTAsNyArNDAyLDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgdmVyID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKIAotCWlmIChBUElDX1hBUElDKHZlcikpCisJaWYgKEFQSUNfWEFQSUModmVyKSB8fCBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfRVhURF9BUElDSUQpKQogCQlyZXR1cm4gKHggPj4gMjQpICYgMHhGRjsKIAllbHNlCiAJCXJldHVybiAoeCA+PiAyNCkgJiAweDBGOwpAQCAtNDc4LDYgKzQ3MCw5IEBACiBleHRlcm4gdm9pZCBkZWZhdWx0X3NldHVwX2FwaWNfcm91dGluZyh2b2lkKTsKIAogI2lmZGVmIENPTkZJR19YODZfMzIKKworZXh0ZXJuIHN0cnVjdCBhcGljIGFwaWNfZGVmYXVsdDsKKwogLyoKICAqIFNldCB1cCB0aGUgbG9naWNhbCBkZXN0aW5hdGlvbiBJRC4KICAqCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljZGVmLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljZGVmLmgKaW5kZXggYmM5NTE0Zi4uN2RkYjM2YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpY2RlZi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWNkZWYuaApAQCAtMjIsNiArMjIsNyBAQAogIyAgZGVmaW5lCUFQSUNfSU5URUdSQVRFRCh4KQkoMSkKICNlbmRpZgogI2RlZmluZQkJQVBJQ19YQVBJQyh4KQkJKCh4KSA+PSAweDE0KQorI2RlZmluZQkJQVBJQ19FWFRfU1BBQ0UoeCkJKCh4KSAmIDB4ODAwMDAwMDApCiAjZGVmaW5lCUFQSUNfVEFTS1BSSQkweDgwCiAjZGVmaW5lCQlBUElDX1RQUklfTUFTSwkJMHhGRnUKICNkZWZpbmUJQVBJQ19BUkJQUkkJMHg5MApAQCAtMTE2LDcgKzExNyw5IEBACiAjZGVmaW5lCQlBUElDX1REUl9ESVZfMzIJCTB4OAogI2RlZmluZQkJQVBJQ19URFJfRElWXzY0CQkweDkKICNkZWZpbmUJCUFQSUNfVERSX0RJVl8xMjgJMHhBCi0jZGVmaW5lCUFQSUNfRUlMVlQwICAgICAweDUwMAorI2RlZmluZQlBUElDX0VGRUFUCTB4NDAwCisjZGVmaW5lCUFQSUNfRUNUUkwJMHg0MTAKKyNkZWZpbmUgQVBJQ19FSUxWVG4obikJKDB4NTAwICsgMHgxMCAqIG4pCiAjZGVmaW5lCQlBUElDX0VJTFZUX05SX0FNRF9LOAkxCS8qICMgb2YgZXh0ZW5kZWQgaW50ZXJydXB0cyAqLwogI2RlZmluZQkJQVBJQ19FSUxWVF9OUl9BTURfMTBICTQKICNkZWZpbmUJCUFQSUNfRUlMVlRfTFZUT0ZGKHgpCSgoKHgpID4+IDQpICYgMHhGKQpAQCAtMTI1LDkgKzEyOCw2IEBACiAjZGVmaW5lCQlBUElDX0VJTFZUX01TR19OTUkJMHg0CiAjZGVmaW5lCQlBUElDX0VJTFZUX01TR19FWFQJMHg3CiAjZGVmaW5lCQlBUElDX0VJTFZUX01BU0tFRAkoMSA8PCAxNikKLSNkZWZpbmUJQVBJQ19FSUxWVDEgICAgIDB4NTEwCi0jZGVmaW5lCUFQSUNfRUlMVlQyICAgICAweDUyMAotI2RlZmluZQlBUElDX0VJTFZUMyAgICAgMHg1MzAKIAogI2RlZmluZSBBUElDX0JBU0UgKGZpeF90b192aXJ0KEZJWF9BUElDX0JBU0UpKQogI2RlZmluZSBBUElDX0JBU0VfTVNSCTB4ODAwCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hdG9taWNfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY18zMi5oCmluZGV4IDg1YjQ2ZmIuLmFmZjlmMWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY18zMi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY18zMi5oCkBAIC0yNDcsNSArMjQ3LDI0MSBAQAogI2RlZmluZSBzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpCWJhcnJpZXIoKQogCisvKiBBbiA2NGJpdCBhdG9taWMgdHlwZSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBsb25nIGNvdW50ZXI7Cit9IGF0b21pYzY0X3Q7CisKKyNkZWZpbmUgQVRPTUlDNjRfSU5JVCh2YWwpCXsgKHZhbCkgfQorCisvKioKKyAqIGF0b21pYzY0X3JlYWQgLSByZWFkIGF0b21pYzY0IHZhcmlhYmxlCisgKiBAdjogcG9pbnRlciBvZiB0eXBlIGF0b21pYzY0X3QKKyAqCisgKiBBdG9taWNhbGx5IHJlYWRzIHRoZSB2YWx1ZSBvZiBAdi4KKyAqIERvZXNuJ3QgaW1wbHkgYSByZWFkIG1lbW9yeSBiYXJyaWVyLgorICovCisjZGVmaW5lIF9fYXRvbWljNjRfcmVhZChwdHIpCQkoKHB0ciktPmNvdW50ZXIpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCitjbXB4Y2hnOGIodW5zaWduZWQgbG9uZyBsb25nICpwdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBvbGQsIHVuc2lnbmVkIGxvbmcgbG9uZyBuZXcpCit7CisJYXNtIHZvbGF0aWxlKAorCisJCUxPQ0tfUFJFRklYICJjbXB4Y2hnOGIgKCVbcHRyXSlcbiIKKworCQkgICAgIDoJCSI9QSIgKG9sZCkKKworCQkgICAgIDogW3B0cl0JIkQiIChwdHIpLAorCQkJCSJBIiAob2xkKSwKKwkJCQkiYiIgKGxsX2xvdyhuZXcpKSwKKwkJCQkiYyIgKGxsX2hpZ2gobmV3KSkKKworCQkgICAgIDogIm1lbW9yeSIpOworCisJcmV0dXJuIG9sZDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK2F0b21pYzY0X2NtcHhjaGcoYXRvbWljNjRfdCAqcHRyLCB1bnNpZ25lZCBsb25nIGxvbmcgb2xkX3ZhbCwKKwkJIHVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfdmFsKQoreworCXJldHVybiBjbXB4Y2hnOGIoJnB0ci0+Y291bnRlciwgb2xkX3ZhbCwgbmV3X3ZhbCk7Cit9CisKKy8qKgorICogYXRvbWljNjRfeGNoZyAtIHhjaGcgYXRvbWljNjQgdmFyaWFibGUKKyAqIEBwdHI6ICAgICAgcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqIEBuZXdfdmFsOiAgdmFsdWUgdG8gYXNzaWduCisgKiBAb2xkX3ZhbDogIG9sZCB2YWx1ZSB0aGF0IHdhcyB0aGVyZQorICoKKyAqIEF0b21pY2FsbHkgeGNoZ3MgdGhlIHZhbHVlIG9mIEBwdHIgdG8gQG5ld192YWwgYW5kIHJldHVybnMKKyAqIHRoZSBvbGQgdmFsdWUuCisgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK2F0b21pYzY0X3hjaGcoYXRvbWljNjRfdCAqcHRyLCB1bnNpZ25lZCBsb25nIGxvbmcgbmV3X3ZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2xkX3ZhbDsKKworCWRvIHsKKwkJb2xkX3ZhbCA9IGF0b21pY19yZWFkKHB0cik7CisJfSB3aGlsZSAoYXRvbWljNjRfY21weGNoZyhwdHIsIG9sZF92YWwsIG5ld192YWwpICE9IG9sZF92YWwpOworCisJcmV0dXJuIG9sZF92YWw7Cit9CisKKy8qKgorICogYXRvbWljNjRfc2V0IC0gc2V0IGF0b21pYzY0IHZhcmlhYmxlCisgKiBAcHRyOiAgICAgIHBvaW50ZXIgdG8gdHlwZSBhdG9taWM2NF90CisgKiBAbmV3X3ZhbDogIHZhbHVlIHRvIGFzc2lnbgorICoKKyAqIEF0b21pY2FsbHkgc2V0cyB0aGUgdmFsdWUgb2YgQHB0ciB0byBAbmV3X3ZhbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0b21pYzY0X3NldChhdG9taWM2NF90ICpwdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfdmFsKQoreworCWF0b21pYzY0X3hjaGcocHRyLCBuZXdfdmFsKTsKK30KKworLyoqCisgKiBhdG9taWM2NF9yZWFkIC0gcmVhZCBhdG9taWM2NCB2YXJpYWJsZQorICogQHB0cjogICAgICBwb2ludGVyIHRvIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIEF0b21pY2FsbHkgcmVhZHMgdGhlIHZhbHVlIG9mIEBwdHIgYW5kIHJldHVybnMgaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGF0b21pYzY0X3JlYWQoYXRvbWljNjRfdCAqcHRyKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBjdXJyX3ZhbDsKKworCWRvIHsKKwkJY3Vycl92YWwgPSBfX2F0b21pYzY0X3JlYWQocHRyKTsKKwl9IHdoaWxlIChhdG9taWM2NF9jbXB4Y2hnKHB0ciwgY3Vycl92YWwsIGN1cnJfdmFsKSAhPSBjdXJyX3ZhbCk7CisKKwlyZXR1cm4gY3Vycl92YWw7Cit9CisKKy8qKgorICogYXRvbWljNjRfYWRkX3JldHVybiAtIGFkZCBhbmQgcmV0dXJuCisgKiBAZGVsdGE6IGludGVnZXIgdmFsdWUgdG8gYWRkCisgKiBAcHRyOiAgIHBvaW50ZXIgdG8gdHlwZSBhdG9taWM2NF90CisgKgorICogQXRvbWljYWxseSBhZGRzIEBkZWx0YSB0byBAcHRyIGFuZCByZXR1cm5zIEBkZWx0YSArICpAcHRyCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nCithdG9taWM2NF9hZGRfcmV0dXJuKHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSwgYXRvbWljNjRfdCAqcHRyKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBvbGRfdmFsLCBuZXdfdmFsOworCisJZG8geworCQlvbGRfdmFsID0gYXRvbWljX3JlYWQocHRyKTsKKwkJbmV3X3ZhbCA9IG9sZF92YWwgKyBkZWx0YTsKKworCX0gd2hpbGUgKGF0b21pYzY0X2NtcHhjaGcocHRyLCBvbGRfdmFsLCBuZXdfdmFsKSAhPSBvbGRfdmFsKTsKKworCXJldHVybiBuZXdfdmFsOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgYXRvbWljNjRfc3ViX3JldHVybih1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEsIGF0b21pYzY0X3QgKnB0cikKK3sKKwlyZXR1cm4gYXRvbWljNjRfYWRkX3JldHVybigtZGVsdGEsIHB0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBhdG9taWM2NF9pbmNfcmV0dXJuKGF0b21pYzY0X3QgKnB0cikKK3sKKwlyZXR1cm4gYXRvbWljNjRfYWRkX3JldHVybigxLCBwdHIpOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgYXRvbWljNjRfZGVjX3JldHVybihhdG9taWM2NF90ICpwdHIpCit7CisJcmV0dXJuIGF0b21pYzY0X3N1Yl9yZXR1cm4oMSwgcHRyKTsKK30KKworLyoqCisgKiBhdG9taWM2NF9hZGQgLSBhZGQgaW50ZWdlciB0byBhdG9taWM2NCB2YXJpYWJsZQorICogQGRlbHRhOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICogQHB0cjogICBwb2ludGVyIHRvIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAZGVsdGEgdG8gQHB0ci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0b21pYzY0X2FkZCh1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEsIGF0b21pYzY0X3QgKnB0cikKK3sKKwlhdG9taWM2NF9hZGRfcmV0dXJuKGRlbHRhLCBwdHIpOworfQorCisvKioKKyAqIGF0b21pYzY0X3N1YiAtIHN1YnRyYWN0IHRoZSBhdG9taWM2NCB2YXJpYWJsZQorICogQGRlbHRhOiBpbnRlZ2VyIHZhbHVlIHRvIHN1YnRyYWN0CisgKiBAcHRyOiAgIHBvaW50ZXIgdG8gdHlwZSBhdG9taWM2NF90CisgKgorICogQXRvbWljYWxseSBzdWJ0cmFjdHMgQGRlbHRhIGZyb20gQHB0ci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0b21pYzY0X3N1Yih1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEsIGF0b21pYzY0X3QgKnB0cikKK3sKKwlhdG9taWM2NF9hZGQoLWRlbHRhLCBwdHIpOworfQorCisvKioKKyAqIGF0b21pYzY0X3N1Yl9hbmRfdGVzdCAtIHN1YnRyYWN0IHZhbHVlIGZyb20gdmFyaWFibGUgYW5kIHRlc3QgcmVzdWx0CisgKiBAZGVsdGE6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEBwdHI6ICAgcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAZGVsdGEgZnJvbSBAcHRyIGFuZCByZXR1cm5zCisgKiB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CithdG9taWM2NF9zdWJfYW5kX3Rlc3QodW5zaWduZWQgbG9uZyBsb25nIGRlbHRhLCBhdG9taWM2NF90ICpwdHIpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG9sZF92YWwgPSBhdG9taWM2NF9zdWJfcmV0dXJuKGRlbHRhLCBwdHIpOworCisJcmV0dXJuIG9sZF92YWwgPT0gMDsKK30KKworLyoqCisgKiBhdG9taWM2NF9pbmMgLSBpbmNyZW1lbnQgYXRvbWljNjQgdmFyaWFibGUKKyAqIEBwdHI6IHBvaW50ZXIgdG8gdHlwZSBhdG9taWM2NF90CisgKgorICogQXRvbWljYWxseSBpbmNyZW1lbnRzIEBwdHIgYnkgMS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0b21pYzY0X2luYyhhdG9taWM2NF90ICpwdHIpCit7CisJYXRvbWljNjRfYWRkKDEsIHB0cik7Cit9CisKKy8qKgorICogYXRvbWljNjRfZGVjIC0gZGVjcmVtZW50IGF0b21pYzY0IHZhcmlhYmxlCisgKiBAcHRyOiBwb2ludGVyIHRvIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAcHRyIGJ5IDEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWM2NF9kZWMoYXRvbWljNjRfdCAqcHRyKQoreworCWF0b21pYzY0X3N1YigxLCBwdHIpOworfQorCisvKioKKyAqIGF0b21pYzY0X2RlY19hbmRfdGVzdCAtIGRlY3JlbWVudCBhbmQgdGVzdAorICogQHB0cjogcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqCisgKiBBdG9taWNhbGx5IGRlY3JlbWVudHMgQHB0ciBieSAxIGFuZAorICogcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgMCwgb3IgZmFsc2UgZm9yIGFsbCBvdGhlcgorICogY2FzZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pYzY0X2RlY19hbmRfdGVzdChhdG9taWM2NF90ICpwdHIpCit7CisJcmV0dXJuIGF0b21pYzY0X3N1Yl9hbmRfdGVzdCgxLCBwdHIpOworfQorCisvKioKKyAqIGF0b21pYzY0X2luY19hbmRfdGVzdCAtIGluY3JlbWVudCBhbmQgdGVzdAorICogQHB0cjogcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHB0ciBieSAxCisgKiBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSByZXN1bHQgaXMgemVybywgb3IgZmFsc2UgZm9yIGFsbAorICogb3RoZXIgY2FzZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pYzY0X2luY19hbmRfdGVzdChhdG9taWM2NF90ICpwdHIpCit7CisJcmV0dXJuIGF0b21pYzY0X3N1Yl9hbmRfdGVzdCgtMSwgcHRyKTsKK30KKworLyoqCisgKiBhdG9taWM2NF9hZGRfbmVnYXRpdmUgLSBhZGQgYW5kIHRlc3QgaWYgbmVnYXRpdmUKKyAqIEBkZWx0YTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqIEBwdHI6ICAgcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGRlbHRhIHRvIEBwdHIgYW5kIHJldHVybnMgdHJ1ZQorICogaWYgdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSwgb3IgZmFsc2Ugd2hlbgorICogcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLgorICovCitzdGF0aWMgaW5saW5lIGludAorYXRvbWljNjRfYWRkX25lZ2F0aXZlKHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSwgYXRvbWljNjRfdCAqcHRyKQoreworCWxvbmcgbG9uZyBvbGRfdmFsID0gYXRvbWljNjRfYWRkX3JldHVybihkZWx0YSwgcHRyKTsKKworCXJldHVybiBvbGRfdmFsIDwgMDsKK30KKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F0b21pYy5oPgogI2VuZGlmIC8qIF9BU01fWDg2X0FUT01JQ18zMl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290LmgKaW5kZXggNmJhMjNkZC4uNDE4ZTYzMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Jvb3QuaApAQCAtOCwxMSArOCwyNiBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8YXNtL3BhZ2VfdHlwZXMuaD4KKwogLyogUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSBrZXJuZWwgc2hvdWxkIGJlIGxvYWRlZC4gKi8KICNkZWZpbmUgTE9BRF9QSFlTSUNBTF9BRERSICgoQ09ORklHX1BIWVNJQ0FMX1NUQVJUIFwKIAkJCQkrIChDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSkgXAogCQkJCSYgfihDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSkKIAorLyogTWluaW11bSBrZXJuZWwgYWxpZ25tZW50LCBhcyBhIHBvd2VyIG9mIHR3byAqLworI2lmZGVmIENPTkZJR194ODZfNjQKKyNkZWZpbmUgTUlOX0tFUk5FTF9BTElHTl9MRzIJUE1EX1NISUZUCisjZWxzZQorI2RlZmluZSBNSU5fS0VSTkVMX0FMSUdOX0xHMgkoUEFHRV9TSElGVCsxKQorI2VuZGlmCisjZGVmaW5lIE1JTl9LRVJORUxfQUxJR04JKF9BQygxLCBVTCkgPDwgTUlOX0tFUk5FTF9BTElHTl9MRzIpCisKKyNpZiAoQ09ORklHX1BIWVNJQ0FMX0FMSUdOICYgKENPTkZJR19QSFlTSUNBTF9BTElHTi0xKSkgfHwgXAorCShDT05GSUdfUEhZU0lDQUxfQUxJR04gPCAoX0FDKDEsIFVMKSA8PCBNSU5fS0VSTkVMX0FMSUdOX0xHMikpCisjZXJyb3IgIkludmFsaWQgdmFsdWUgZm9yIENPTkZJR19QSFlTSUNBTF9BTElHTiIKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX0tFUk5FTF9CWklQMgogI2RlZmluZSBCT09UX0hFQVBfU0laRSAgICAgICAgICAgICAweDQwMDAwMAogI2Vsc2UgLyogIUNPTkZJR19LRVJORUxfQlpJUDIgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Jvb3RwYXJhbS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKaW5kZXggNDMzYWRhZS4uMTcyNGU4ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmgKQEAgLTUwLDcgKzUwLDggQEAKIAlfX3UzMglyYW1kaXNrX3NpemU7CiAJX191MzIJYm9vdHNlY3Rfa2x1ZGdlOwogCV9fdTE2CWhlYXBfZW5kX3B0cjsKLQlfX3UxNglfcGFkMTsKKwlfX3U4CWV4dF9sb2FkZXJfdmVyOworCV9fdTgJZXh0X2xvYWRlcl90eXBlOwogCV9fdTMyCWNtZF9saW5lX3B0cjsKIAlfX3UzMglpbml0cmRfYWRkcl9tYXg7CiAJX191MzIJa2VybmVsX2FsaWdubWVudDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdV9kZWJ1Zy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1X2RlYnVnLmgKaW5kZXggMjIyODAyMC4uZDk2YzFlZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1X2RlYnVnLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1X2RlYnVnLmgKQEAgLTg2LDEwNSArODYsNyBAQAogCUNQVV9WQUxVRV9CSVQsCQkJCS8qIHZhbHVlCQkqLwogfTsKIAotI2RlZmluZQlDUFVfRklMRV9WQUxVRQkJCSgxIDw8IENQVV9WQUxVRV9CSVQpCi0KLS8qCi0gKiBEaXNwbGF5RmFtaWx5X0Rpc3BsYXlNb2RlbAlQcm9jZXNzb3IgRmFtaWxpZXMvUHJvY2Vzc29yIE51bWJlciBTZXJpZXMKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMDVfMDEsIDA1XzAyLCAwNV8wNAkJUGVudGl1bSwgUGVudGl1bSB3aXRoIE1NWAotICoKLSAqIDA2XzAxCQkJUGVudGl1bSBQcm8KLSAqIDA2XzAzLCAwNl8wNQkJCVBlbnRpdW0gSUkgWGVvbiwgUGVudGl1bSBJSQotICogMDZfMDcsIDA2XzA4LCAwNl8wQSwgMDZfMEIJUGVudGl1bSBJSUkgWGVvbiwgUGVudHVtIElJSQotICoKLSAqIDA2XzA5LCAwNjBECQkJUGVudGl1bSBNCi0gKgotICogMDZfMEUJCQlDb3JlIER1bywgQ29yZSBTb2xvCi0gKgotICogMDZfMEYJCQlYZW9uIDMwMDAsIDMyMDAsIDUxMDAsIDUzMDAsIDczMDAgc2VyaWVzLAotICoJCQkJQ29yZSAyIFF1YWQsIENvcmUgMiBFeHRyZW1lLCBDb3JlIDIgRHVvLAotICoJCQkJUGVudGl1bSBkdWFsLWNvcmUKLSAqIDA2XzE3CQkJWGVvbiA1MjAwLCA1NDAwIHNlcmllcywgQ29yZSAyIFF1YWQgUTk2NTAKLSAqCi0gKiAwNl8xQwkJCUF0b20KLSAqCi0gKiAwRl8wMCwgMEZfMDEsIDBGXzAyCQlYZW9uLCBYZW9uIE1QLCBQZW50aXVtIDQKLSAqIDBGXzAzLCAwRl8wNAkJCVhlb24sIFhlb24gTVAsIFBlbnRpdW0gNCwgUGVudGl1bSBECi0gKgotICogMEZfMDYJCQlYZW9uIDcxMDAsIDUwMDAgU2VyaWVzLCBYZW9uIE1QLAotICoJCQkJUGVudGl1bSA0LCBQZW50aXVtIEQKLSAqLwotCi0vKiBSZWdpc3RlciBwcm9jZXNzb3JzIGJpdHMgKi8KLWVudW0gY3B1X3Byb2Nlc3Nvcl9iaXQgewotCUNQVV9OT05FLAotLyogSW50ZWwgKi8KLQlDUFVfSU5URUxfUEVOVElVTV9CSVQsCi0JQ1BVX0lOVEVMX1A2X0JJVCwKLQlDUFVfSU5URUxfUEVOVElVTV9NX0JJVCwKLQlDUFVfSU5URUxfQ09SRV9CSVQsCi0JQ1BVX0lOVEVMX0NPUkUyX0JJVCwKLQlDUFVfSU5URUxfQVRPTV9CSVQsCi0JQ1BVX0lOVEVMX1hFT05fUDRfQklULAotCUNQVV9JTlRFTF9YRU9OX01QX0JJVCwKLS8qIEFNRCAqLwotCUNQVV9BTURfSzZfQklULAotCUNQVV9BTURfSzdfQklULAotCUNQVV9BTURfSzhfQklULAotCUNQVV9BTURfMEZfQklULAotCUNQVV9BTURfMTBfQklULAotCUNQVV9BTURfMTFfQklULAotfTsKLQotI2RlZmluZQlDUFVfSU5URUxfUEVOVElVTQkoMSA8PCBDUFVfSU5URUxfUEVOVElVTV9CSVQpCi0jZGVmaW5lCUNQVV9JTlRFTF9QNgkJKDEgPDwgQ1BVX0lOVEVMX1A2X0JJVCkKLSNkZWZpbmUJQ1BVX0lOVEVMX1BFTlRJVU1fTQkoMSA8PCBDUFVfSU5URUxfUEVOVElVTV9NX0JJVCkKLSNkZWZpbmUJQ1BVX0lOVEVMX0NPUkUJCSgxIDw8IENQVV9JTlRFTF9DT1JFX0JJVCkKLSNkZWZpbmUJQ1BVX0lOVEVMX0NPUkUyCQkoMSA8PCBDUFVfSU5URUxfQ09SRTJfQklUKQotI2RlZmluZQlDUFVfSU5URUxfQVRPTQkJKDEgPDwgQ1BVX0lOVEVMX0FUT01fQklUKQotI2RlZmluZQlDUFVfSU5URUxfWEVPTl9QNAkoMSA8PCBDUFVfSU5URUxfWEVPTl9QNF9CSVQpCi0jZGVmaW5lCUNQVV9JTlRFTF9YRU9OX01QCSgxIDw8IENQVV9JTlRFTF9YRU9OX01QX0JJVCkKLQotI2RlZmluZQlDUFVfSU5URUxfUFgJCShDUFVfSU5URUxfUDYgfCBDUFVfSU5URUxfUEVOVElVTV9NKQotI2RlZmluZQlDUFVfSU5URUxfQ09SRVgJCShDUFVfSU5URUxfQ09SRSB8IENQVV9JTlRFTF9DT1JFMikKLSNkZWZpbmUJQ1BVX0lOVEVMX1hFT04JCShDUFVfSU5URUxfWEVPTl9QNCB8IENQVV9JTlRFTF9YRU9OX01QKQotI2RlZmluZQlDUFVfQ09fQVQJCShDUFVfSU5URUxfQ09SRSB8IENQVV9JTlRFTF9BVE9NKQotI2RlZmluZQlDUFVfQzJfQVQJCShDUFVfSU5URUxfQ09SRTIgfCBDUFVfSU5URUxfQVRPTSkKLSNkZWZpbmUJQ1BVX0NYX0FUCQkoQ1BVX0lOVEVMX0NPUkVYIHwgQ1BVX0lOVEVMX0FUT00pCi0jZGVmaW5lCUNQVV9DWF9YRQkJKENQVV9JTlRFTF9DT1JFWCB8IENQVV9JTlRFTF9YRU9OKQotI2RlZmluZQlDUFVfUDZfWEUJCShDUFVfSU5URUxfUDYgfCBDUFVfSU5URUxfWEVPTikKLSNkZWZpbmUJQ1BVX1BNX0NPX0FUCQkoQ1BVX0lOVEVMX1BFTlRJVU1fTSB8IENQVV9DT19BVCkKLSNkZWZpbmUJQ1BVX0MyX0FUX1hFCQkoQ1BVX0MyX0FUIHwgQ1BVX0lOVEVMX1hFT04pCi0jZGVmaW5lCUNQVV9DWF9BVF9YRQkJKENQVV9DWF9BVCB8IENQVV9JTlRFTF9YRU9OKQotI2RlZmluZQlDUFVfUDZfQ1hfQVQJCShDUFVfSU5URUxfUDYgfCBDUFVfQ1hfQVQpCi0jZGVmaW5lCUNQVV9QNl9DWF9YRQkJKENQVV9QNl9YRSB8IENQVV9JTlRFTF9DT1JFWCkKLSNkZWZpbmUJQ1BVX1A2X0NYX0FUX1hFCQkoQ1BVX0lOVEVMX1A2IHwgQ1BVX0NYX0FUX1hFKQotI2RlZmluZQlDUFVfUE1fQ1hfQVRfWEUJCShDUFVfSU5URUxfUEVOVElVTV9NIHwgQ1BVX0NYX0FUX1hFKQotI2RlZmluZQlDUFVfUE1fQ1hfQVQJCShDUFVfSU5URUxfUEVOVElVTV9NIHwgQ1BVX0NYX0FUKQotI2RlZmluZQlDUFVfUE1fQ1hfWEUJCShDUFVfSU5URUxfUEVOVElVTV9NIHwgQ1BVX0NYX1hFKQotI2RlZmluZQlDUFVfUFhfQ1hfQVQJCShDUFVfSU5URUxfUFggfCBDUFVfQ1hfQVQpCi0jZGVmaW5lCUNQVV9QWF9DWF9BVF9YRQkJKENQVV9JTlRFTF9QWCB8IENQVV9DWF9BVF9YRSkKLQotLyogU2VsZWN0IGFsbCBzdXBwb3J0ZWQgSW50ZWwgQ1BVcyAqLwotI2RlZmluZQlDUFVfSU5URUxfQUxMCQkoQ1BVX0lOVEVMX1BFTlRJVU0gfCBDUFVfUFhfQ1hfQVRfWEUpCi0KLSNkZWZpbmUJQ1BVX0FNRF9LNgkJKDEgPDwgQ1BVX0FNRF9LNl9CSVQpCi0jZGVmaW5lCUNQVV9BTURfSzcJCSgxIDw8IENQVV9BTURfSzdfQklUKQotI2RlZmluZQlDUFVfQU1EX0s4CQkoMSA8PCBDUFVfQU1EX0s4X0JJVCkKLSNkZWZpbmUJQ1BVX0FNRF8wRgkJKDEgPDwgQ1BVX0FNRF8wRl9CSVQpCi0jZGVmaW5lCUNQVV9BTURfMTAJCSgxIDw8IENQVV9BTURfMTBfQklUKQotI2RlZmluZQlDUFVfQU1EXzExCQkoMSA8PCBDUFVfQU1EXzExX0JJVCkKLQotI2RlZmluZQlDUFVfSzEwX1BMVVMJCShDUFVfQU1EXzEwIHwgQ1BVX0FNRF8xMSkKLSNkZWZpbmUJQ1BVX0swRl9QTFVTCQkoQ1BVX0FNRF8wRiB8IENQVV9LMTBfUExVUykKLSNkZWZpbmUJQ1BVX0s4X1BMVVMJCShDUFVfQU1EX0s4IHwgQ1BVX0swRl9QTFVTKQotI2RlZmluZQlDUFVfSzdfUExVUwkJKENQVV9BTURfSzcgfCBDUFVfSzhfUExVUykKLQotLyogU2VsZWN0IGFsbCBzdXBwb3J0ZWQgQU1EIENQVXMgKi8KLSNkZWZpbmUJQ1BVX0FNRF9BTEwJCShDUFVfQU1EX0s2IHwgQ1BVX0s3X1BMVVMpCi0KLS8qIFNlbGVjdCBhbGwgc3VwcG9ydGVkIENQVXMgKi8KLSNkZWZpbmUJQ1BVX0FMTAkJCShDUFVfSU5URUxfQUxMIHwgQ1BVX0FNRF9BTEwpCisjZGVmaW5lCUNQVV9GSUxFX1ZBTFVFCQkoMSA8PCBDUFVfVkFMVUVfQklUKQogCiAjZGVmaW5lIE1BWF9DUFVfRklMRVMJCTUxMgogCkBAIC0yMjAsNyArMTIyLDYgQEAKIAl1bnNpZ25lZAkJbWluOwkJLyogUmVnaXN0ZXIgcmFuZ2UgbWluCSovCiAJdW5zaWduZWQJCW1heDsJCS8qIFJlZ2lzdGVyIHJhbmdlIG1heAkqLwogCXVuc2lnbmVkCQlmbGFnOwkJLyogU3VwcG9ydGVkIGZsYWdzCSovCi0JdW5zaWduZWQJCW1vZGVsOwkJLyogU3VwcG9ydGVkIG1vZGVscwkqLwogfTsKIAogI2VuZGlmIC8qIF9BU01fWDg2X0NQVV9ERUJVR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKaW5kZXggYmI4M2IxYy4uNGEyOGQyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaApAQCAtMjIsNyArMjIsNyBAQAogI2RlZmluZSBYODZfRkVBVFVSRV9UU0MJCSgwKjMyKyA0KSAvKiBUaW1lIFN0YW1wIENvdW50ZXIgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfTVNSCQkoMCozMisgNSkgLyogTW9kZWwtU3BlY2lmaWMgUmVnaXN0ZXJzICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1BBRQkJKDAqMzIrIDYpIC8qIFBoeXNpY2FsIEFkZHJlc3MgRXh0ZW5zaW9ucyAqLwotI2RlZmluZSBYODZfRkVBVFVSRV9NQ0UJCSgwKjMyKyA3KSAvKiBNYWNoaW5lIENoZWNrIEFyY2hpdGVjdHVyZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NQ0UJCSgwKjMyKyA3KSAvKiBNYWNoaW5lIENoZWNrIEV4Y2VwdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9DWDgJCSgwKjMyKyA4KSAvKiBDTVBYQ0hHOCBpbnN0cnVjdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9BUElDCSgwKjMyKyA5KSAvKiBPbmJvYXJkIEFQSUMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfU0VQCQkoMCozMisxMSkgLyogU1lTRU5URVIvU1lTRVhJVCAqLwpAQCAtOTQsNiArOTQsNyBAQAogI2RlZmluZSBYODZfRkVBVFVSRV9UU0NfUkVMSUFCTEUgKDMqMzIrMjMpIC8qIFRTQyBpcyBrbm93biB0byBiZSByZWxpYWJsZSAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9OT05TVE9QX1RTQwkoMyozMisyNCkgLyogVFNDIGRvZXMgbm90IHN0b3AgaW4gQyBzdGF0ZXMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQ0xGTFVTSF9NT05JVE9SICgzKjMyKzI1KSAvKiAiIiBjbGZsdXNoIHJlcWQgd2l0aCBtb25pdG9yICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0VYVERfQVBJQ0lECSgzKjMyKzI2KSAvKiBoYXMgZXh0ZW5kZWQgQVBJQ0lEICg4IGJpdHMpICovCiAKIC8qIEludGVsLWRlZmluZWQgQ1BVIGZlYXR1cmVzLCBDUFVJRCBsZXZlbCAweDAwMDAwMDAxIChlY3gpLCB3b3JkIDQgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NMwkoNCozMisgMCkgLyogInBuaSIgU1NFLTMgKi8KQEAgLTExNSw2ICsxMTYsOCBAQAogI2RlZmluZSBYODZfRkVBVFVSRV9YTU00XzEJKDQqMzIrMTkpIC8qICJzc2U0XzEiIFNTRS00LjEgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NNF8yCSg0KjMyKzIwKSAvKiAic3NlNF8yIiBTU0UtNC4yICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1gyQVBJQwkoNCozMisyMSkgLyogeDJBUElDICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01PVkJFCSg0KjMyKzIyKSAvKiBNT1ZCRSBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QT1BDTlQgICAgICAoNCozMisyMykgLyogUE9QQ05UIGluc3RydWN0aW9uICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FFUwkJKDQqMzIrMjUpIC8qIEFFUyBpbnN0cnVjdGlvbnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFNBVkUJKDQqMzIrMjYpIC8qIFhTQVZFL1hSU1RPUi9YU0VUQlYvWEdFVEJWICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX09TWFNBVkUJKDQqMzIrMjcpIC8qICIiIFhTQVZFIGVuYWJsZWQgaW4gdGhlIE9TICovCkBAIC0xOTIsMTEgKzE5NSwxMSBAQAogI2RlZmluZSBjbGVhcl9jcHVfY2FwKGMsIGJpdCkJY2xlYXJfYml0KGJpdCwgKHVuc2lnbmVkIGxvbmcgKikoKGMpLT54ODZfY2FwYWJpbGl0eSkpCiAjZGVmaW5lIHNldHVwX2NsZWFyX2NwdV9jYXAoYml0KSBkbyB7IFwKIAljbGVhcl9jcHVfY2FwKCZib290X2NwdV9kYXRhLCBiaXQpOwlcCi0Jc2V0X2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopY2xlYXJlZF9jcHVfY2Fwcyk7IFwKKwlzZXRfYml0KGJpdCwgKHVuc2lnbmVkIGxvbmcgKiljcHVfY2Fwc19jbGVhcmVkKTsgXAogfSB3aGlsZSAoMCkKICNkZWZpbmUgc2V0dXBfZm9yY2VfY3B1X2NhcChiaXQpIGRvIHsgXAogCXNldF9jcHVfY2FwKCZib290X2NwdV9kYXRhLCBiaXQpOwlcCi0JY2xlYXJfYml0KGJpdCwgKHVuc2lnbmVkIGxvbmcgKiljbGVhcmVkX2NwdV9jYXBzKTsJXAorCXNldF9iaXQoYml0LCAodW5zaWduZWQgbG9uZyAqKWNwdV9jYXBzX3NldCk7CVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgY3B1X2hhc19mcHUJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9GUFUpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZHMuaAppbmRleCBhOGY2NzJiLi43MGRhYzE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2RzLmgKQEAgLTE1LDggKzE1LDggQEAKICAqIC0gYnVmZmVyIGFsbG9jYXRpb24gKG1lbW9yeSBhY2NvdW50aW5nKQogICoKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqIE1hcmt1cyBNZXR6Z2VyIDxtYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbT4sIDIwMDctMjAwOAorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBNYXJrdXMgTWV0emdlciA8bWFya3VzLnQubWV0emdlckBpbnRlbC5jb20+LCAyMDA3LTIwMDkKICAqLwogCiAjaWZuZGVmIF9BU01fWDg2X0RTX0gKQEAgLTgzLDggKzgzLDEwIEBACiAgKiBUaGUgaW50ZXJydXB0IHRocmVzaG9sZCBpcyBpbmRlcGVuZGVudCBmcm9tIHRoZSBvdmVyZmxvdyBjYWxsYmFjawogICogdG8gYWxsb3cgdXNlcnMgdG8gdXNlIHRoZWlyIG93biBvdmVyZmxvdyBpbnRlcnJ1cHQgaGFuZGxpbmcgbWVjaGFuaXNtLgogICoKLSAqIHRhc2s6IHRoZSB0YXNrIHRvIHJlcXVlc3QgcmVjb3JkaW5nIGZvcjsKLSAqICAgICAgIE5VTEwgZm9yIHBlci1jcHUgcmVjb3JkaW5nIG9uIHRoZSBjdXJyZW50IGNwdQorICogVGhlIGZ1bmN0aW9uIG1pZ2h0IHNsZWVwLgorICoKKyAqIHRhc2s6IHRoZSB0YXNrIHRvIHJlcXVlc3QgcmVjb3JkaW5nIGZvcgorICogY3B1OiAgdGhlIGNwdSB0byByZXF1ZXN0IHJlY29yZGluZyBmb3IKICAqIGJhc2U6IHRoZSBiYXNlIHBvaW50ZXIgZm9yIHRoZSAobm9uLXBhZ2VhYmxlKSBidWZmZXI7CiAgKiBzaXplOiB0aGUgc2l6ZSBvZiB0aGUgcHJvdmlkZWQgYnVmZmVyIGluIGJ5dGVzCiAgKiBvdmZsOiBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIGJ1ZmZlciBvdmVyZmxvdzsKQEAgLTkzLDE5ICs5NSwyOCBAQAogICogICAgIC0xIGlmIG5vIGludGVycnVwdCB0aHJlc2hvbGQgaXMgcmVxdWVzdGVkLgogICogZmxhZ3M6IGEgYml0LW1hc2sgb2YgdGhlIGFib3ZlIGZsYWdzCiAgKi8KLWV4dGVybiBzdHJ1Y3QgYnRzX3RyYWNlciAqZHNfcmVxdWVzdF9idHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCQkgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCi0JCQkJCSBidHNfb3ZmbF9jYWxsYmFja190IG92ZmwsCi0JCQkJCSBzaXplX3QgdGgsIHVuc2lnbmVkIGludCBmbGFncyk7Ci1leHRlcm4gc3RydWN0IHBlYnNfdHJhY2VyICpkc19yZXF1ZXN0X3BlYnMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAotCQkJCQkgICB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKLQkJCQkJICAgcGVic19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwKLQkJCQkJICAgc2l6ZV90IHRoLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIHN0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0c190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgICAgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJCSAgICAgIGJ0c19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwKKwkJCQkJICAgICAgc2l6ZV90IHRoLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworZXh0ZXJuIHN0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0c19jcHUoaW50IGNwdSwgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJCSAgICAgYnRzX292ZmxfY2FsbGJhY2tfdCBvdmZsLAorCQkJCQkgICAgIHNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBzdHJ1Y3QgcGVic190cmFjZXIgKmRzX3JlcXVlc3RfcGVic190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJCXZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAorCQkJCQkJcGVic19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwKKwkJCQkJCXNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBzdHJ1Y3QgcGVic190cmFjZXIgKmRzX3JlcXVlc3RfcGVic19jcHUoaW50IGNwdSwKKwkJCQkJICAgICAgIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAorCQkJCQkgICAgICAgcGVic19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwKKwkJCQkJICAgICAgIHNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKTsKIAogLyoKICAqIFJlbGVhc2UgQlRTIG9yIFBFQlMgcmVzb3VyY2VzCiAgKiBTdXNwZW5kIGFuZCByZXN1bWUgQlRTIG9yIFBFQlMgdHJhY2luZwogICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggaXJxJ3MgZW5hYmxlZC4KKyAqCiAgKiB0cmFjZXI6IHRoZSB0cmFjZXIgaGFuZGxlIHJldHVybmVkIGZyb20gZHNfcmVxdWVzdF9+KCkKICAqLwogZXh0ZXJuIHZvaWQgZHNfcmVsZWFzZV9idHMoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcik7CkBAIC0xMTUsNiArMTI2LDI4IEBACiBleHRlcm4gdm9pZCBkc19zdXNwZW5kX3BlYnMoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIpOwogZXh0ZXJuIHZvaWQgZHNfcmVzdW1lX3BlYnMoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIpOwogCisvKgorICogUmVsZWFzZSBCVFMgb3IgUEVCUyByZXNvdXJjZXMKKyAqIFN1c3BlbmQgYW5kIHJlc3VtZSBCVFMgb3IgUEVCUyB0cmFjaW5nCisgKgorICogQ3B1IHRyYWNlcnMgbXVzdCBjYWxsIHRoaXMgb24gdGhlIHRyYWNlZCBjcHUuCisgKiBUYXNrIHRyYWNlcnMgbXVzdCBjYWxsIGRzX3JlbGVhc2Vffl9ub2lycSgpIGZvciB0aGVtc2VsdmVzLgorICoKKyAqIE1heSBiZSBjYWxsZWQgd2l0aCBpcnEncyBkaXNhYmxlZC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bDsKKyAqIC1FUEVSTSBpZiB0aGUgY3B1IHRyYWNlciBkb2VzIG5vdCB0cmFjZSB0aGUgY3VycmVudCBjcHUuCisgKiAtRVBFUk0gaWYgdGhlIHRhc2sgdHJhY2VyIGRvZXMgbm90IHRyYWNlIGl0c2VsZi4KKyAqCisgKiB0cmFjZXI6IHRoZSB0cmFjZXIgaGFuZGxlIHJldHVybmVkIGZyb20gZHNfcmVxdWVzdF9+KCkKKyAqLworZXh0ZXJuIGludCBkc19yZWxlYXNlX2J0c19ub2lycShzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKTsKK2V4dGVybiBpbnQgZHNfc3VzcGVuZF9idHNfbm9pcnEoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcik7CitleHRlcm4gaW50IGRzX3Jlc3VtZV9idHNfbm9pcnEoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcik7CitleHRlcm4gaW50IGRzX3JlbGVhc2VfcGVic19ub2lycShzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcik7CitleHRlcm4gaW50IGRzX3N1c3BlbmRfcGVic19ub2lycShzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcik7CitleHRlcm4gaW50IGRzX3Jlc3VtZV9wZWJzX25vaXJxKHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyKTsKKwogCiAvKgogICogVGhlIHJhdyBEUyBidWZmZXIgc3RhdGUgYXMgaXQgaXMgdXNlZCBmb3IgQlRTIGFuZCBQRUJTIHJlY29yZGluZy4KQEAgLTE3MCw5ICsyMDMsOSBAQAogCQl9IGxicjsKIAkJLyogQlRTX1RBU0tfQVJSSVZFUyBvciBCVFNfVEFTS19ERVBBUlRTICovCiAJCXN0cnVjdCB7Ci0JCQlfX3U2NCBqaWZmaWVzOworCQkJX191NjQgY2xvY2s7CiAJCQlwaWRfdCBwaWQ7Ci0JCX0gdGltZXN0YW1wOworCQl9IGV2ZW50OwogCX0gdmFyaWFudDsKIH07CiAKQEAgLTIwMSw4ICsyMzQsMTIgQEAKIHN0cnVjdCBwZWJzX3RyYWNlIHsKIAlzdHJ1Y3QgZHNfdHJhY2UgZHM7CiAKLQkvKiB0aGUgUEVCUyByZXNldCB2YWx1ZSAqLwotCXVuc2lnbmVkIGxvbmcgbG9uZyByZXNldF92YWx1ZTsKKwkvKiB0aGUgbnVtYmVyIG9mIHZhbGlkIGNvdW50ZXJzIGluIHRoZSBiZWxvdyBhcnJheSAqLworCXVuc2lnbmVkIGludCBjb3VudGVyczsKKworI2RlZmluZSBNQVhfUEVCU19DT1VOVEVSUyA0CisJLyogdGhlIGNvdW50ZXIgcmVzZXQgdmFsdWUgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgY291bnRlcl9yZXNldFtNQVhfUEVCU19DT1VOVEVSU107CiB9OwogCiAKQEAgLTIzNyw5ICsyNzQsMTEgQEAKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzOyAtRWVycm5vIG9uIGVycm9yCiAgKgogICogdHJhY2VyOiB0aGUgdHJhY2VyIGhhbmRsZSByZXR1cm5lZCBmcm9tIGRzX3JlcXVlc3RfcGVicygpCisgKiBjb3VudGVyOiB0aGUgaW5kZXggb2YgdGhlIGNvdW50ZXIKICAqIHZhbHVlOiB0aGUgbmV3IGNvdW50ZXIgcmVzZXQgdmFsdWUKICAqLwotZXh0ZXJuIGludCBkc19zZXRfcGVic19yZXNldChzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlciwgdTY0IHZhbHVlKTsKK2V4dGVybiBpbnQgZHNfc2V0X3BlYnNfcmVzZXQoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIsCisJCQkgICAgIHVuc2lnbmVkIGludCBjb3VudGVyLCB1NjQgdmFsdWUpOwogCiAvKgogICogSW5pdGlhbGl6YXRpb24KQEAgLTI1MiwyMSArMjkxLDEyIEBACiAgKi8KIGV4dGVybiB2b2lkIGRzX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CiAKLS8qCi0gKiBUYXNrIGNsb25lL2luaXQgYW5kIGNsZWFudXAgd29yawotICovCi1leHRlcm4gdm9pZCBkc19jb3B5X3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHRhc2tfc3RydWN0ICpmYXRoZXIpOwotZXh0ZXJuIHZvaWQgZHNfZXhpdF90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwotCiAjZWxzZSAvKiBDT05GSUdfWDg2X0RTICovCiAKIHN0cnVjdCBjcHVpbmZvX3g4NjsKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2NwdWluaXQgZHNfaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmlnbm9yZWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgZHNfc3dpdGNoX3RvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHNfY29weV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZhdGhlcikge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBkc19leGl0X3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykge30KIAogI2VuZGlmIC8qIENPTkZJR19YODZfRFMgKi8KICNlbmRpZiAvKiBfQVNNX1g4Nl9EU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbnRyeV9hcmNoLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbnRyeV9hcmNoLmgKaW5kZXggYzJlNmJlZC4uZDc1MGExMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZW50cnlfYXJjaC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VudHJ5X2FyY2guaApAQCAtNDksNyArNDksNyBAQAogQlVJTERfSU5URVJSVVBUKHNwdXJpb3VzX2ludGVycnVwdCxTUFVSSU9VU19BUElDX1ZFQ1RPUikKIAogI2lmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCi1CVUlMRF9JTlRFUlJVUFQocGVyZl9jb3VudGVyX2ludGVycnVwdCwgTE9DQUxfUEVSRl9WRUNUT1IpCitCVUlMRF9JTlRFUlJVUFQocGVyZl9wZW5kaW5nX2ludGVycnVwdCwgTE9DQUxfUEVORElOR19WRUNUT1IpCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19YODZfTUNFX1A0VEhFUk1BTApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oCmluZGV4IDM3NTU1ZTUuLjllYmM1YzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKQEAgLTEzLDYgKzEzLDggQEAKIAl1bnNpZ25lZCBpbnQgaXJxX3NwdXJpb3VzX2NvdW50OwogI2VuZGlmCiAJdW5zaWduZWQgaW50IGdlbmVyaWNfaXJxczsJLyogYXJjaCBkZXBlbmRlbnQgKi8KKwl1bnNpZ25lZCBpbnQgYXBpY19wZXJmX2lycXM7CisJdW5zaWduZWQgaW50IGFwaWNfcGVuZGluZ19pcnFzOwogI2lmZGVmIENPTkZJR19TTVAKIAl1bnNpZ25lZCBpbnQgaXJxX3Jlc2NoZWRfY291bnQ7CiAJdW5zaWduZWQgaW50IGlycV9jYWxsX2NvdW50OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaAppbmRleCBiNzYyZWE0Li42ZGY0NWY2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9od19pcnEuaApAQCAtMjksNiArMjksOCBAQAogZXh0ZXJuIHZvaWQgYXBpY190aW1lcl9pbnRlcnJ1cHQodm9pZCk7CiBleHRlcm4gdm9pZCBnZW5lcmljX2ludGVycnVwdCh2b2lkKTsKIGV4dGVybiB2b2lkIGVycm9yX2ludGVycnVwdCh2b2lkKTsKK2V4dGVybiB2b2lkIHBlcmZfcGVuZGluZ19pbnRlcnJ1cHQodm9pZCk7CisKIGV4dGVybiB2b2lkIHNwdXJpb3VzX2ludGVycnVwdCh2b2lkKTsKIGV4dGVybiB2b2lkIHRoZXJtYWxfaW50ZXJydXB0KHZvaWQpOwogZXh0ZXJuIHZvaWQgcmVzY2hlZHVsZV9pbnRlcnJ1cHQodm9pZCk7CkBAIC02Myw3ICs2NSwyNiBAQAogZXh0ZXJuIHZvaWQgaW5pdF9WSVNXU19BUElDX2lycXModm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9JT19BUElDKHZvaWQpOwogZXh0ZXJuIHZvaWQgZGlzYWJsZV9JT19BUElDKHZvaWQpOwotZXh0ZXJuIGludCBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IGZuKTsKKworc3RydWN0IGlvX2FwaWNfaXJxX2F0dHIgeworCWludCBpb2FwaWM7CisJaW50IGlvYXBpY19waW47CisJaW50IHRyaWdnZXI7CisJaW50IHBvbGFyaXR5OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9pb19hcGljX2lycV9hdHRyKHN0cnVjdCBpb19hcGljX2lycV9hdHRyICppcnFfYXR0ciwKKwkJCQkJaW50IGlvYXBpYywgaW50IGlvYXBpY19waW4sCisJCQkJCWludCB0cmlnZ2VyLCBpbnQgcG9sYXJpdHkpCit7CisJaXJxX2F0dHItPmlvYXBpYyAgICAgPSBpb2FwaWM7CisJaXJxX2F0dHItPmlvYXBpY19waW4gPSBpb2FwaWNfcGluOworCWlycV9hdHRyLT50cmlnZ2VyICAgID0gdHJpZ2dlcjsKKwlpcnFfYXR0ci0+cG9sYXJpdHkgICA9IHBvbGFyaXR5OworfQorCitleHRlcm4gaW50IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGludCBidXMsIGludCBkZXZmbiwgaW50IHBpbiwKKwkJCQkJc3RydWN0IGlvX2FwaWNfaXJxX2F0dHIgKmlycV9hdHRyKTsKIGV4dGVybiB2b2lkIHNldHVwX2lvYXBpY19kZXN0KHZvaWQpOwogCiBleHRlcm4gdm9pZCBlbmFibGVfSU9fQVBJQyh2b2lkKTsKQEAgLTc4LDcgKzk5LDExIEBACiAvKiBTTVAgKi8KIGV4dGVybiB2b2lkIHNtcF9hcGljX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiB2b2lkIHNtcF9zcHVyaW91c19pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CitleHRlcm4gdm9pZCBzbXBfZ2VuZXJpY19pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gdm9pZCBzbXBfZXJyb3JfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICopOworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBzbXBfaXJxX21vdmVfY2xlYW51cF9pbnRlcnJ1cHQodm9pZCk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfU01QCiBleHRlcm4gdm9pZCBzbXBfcmVzY2hlZHVsZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gdm9pZCBzbXBfY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pMzg3LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pMzg3LmgKaW5kZXggNzFjOWU1MS4uMTc1YWRmNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaTM4Ny5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2kzODcuaApAQCAtNjcsNyArNjcsNyBAQAogCQkgICAgICIucHJldmlvdXNcbiIKIAkJICAgICBfQVNNX0VYVEFCTEUoMWIsIDNiKQogCQkgICAgIDogW2Vycl0gIj1yIiAoZXJyKQotI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gX19zYXZlX2luaXRfZnB1KCkgYmVsb3cuICovCisjaWYgMCAvKiBTZWUgY29tbWVudCBpbiBmeHNhdmUoKSBiZWxvdy4gKi8KIAkJICAgICA6IFtmeF0gInIiIChmeCksICJtIiAoKmZ4KSwgIjAiICgwKSk7CiAjZWxzZQogCQkgICAgIDogW2Z4XSAiY2RhU0RiIiAoZngpLCAibSIgKCpmeCksICIwIiAoMCkpOwpAQCAtNzUsMTQgKzc1LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIGludCByZXN0b3JlX2ZwdV9jaGVja2luZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlpZiAodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19YU0FWRSkKLQkJcmV0dXJuIHhyc3Rvcl9jaGVja2luZygmdHNrLT50aHJlYWQueHN0YXRlLT54c2F2ZSk7Ci0JZWxzZQotCQlyZXR1cm4gZnhyc3Rvcl9jaGVja2luZygmdHNrLT50aHJlYWQueHN0YXRlLT5meHNhdmUpOwotfQotCiAvKiBBTUQgQ1BVcyBkb24ndCBzYXZlL3Jlc3RvcmUgRkRQL0ZJUC9GT1AgdW5sZXNzIGFuIGV4Y2VwdGlvbgogICAgaXMgcGVuZGluZy4gQ2xlYXIgdGhlIHg4NyBzdGF0ZSBoZXJlIGJ5IHNldHRpbmcgaXQgdG8gZml4ZWQKICAgIHZhbHVlcy4gVGhlIGtlcm5lbCBkYXRhIHNlZ21lbnQgY2FuIGJlIHNvbWV0aW1lcyAwIGFuZCBzb21ldGltZXMKQEAgLTEyMCw3ICsxMTIsNyBAQAogCQkgICAgICIucHJldmlvdXNcbiIKIAkJICAgICBfQVNNX0VYVEFCTEUoMWIsIDNiKQogCQkgICAgIDogW2Vycl0gIj1yIiAoZXJyKSwgIj1tIiAoKmZ4KQotI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gX19meHNhdmVfY2xlYXIoKSBiZWxvdy4gKi8KKyNpZiAwIC8qIFNlZSBjb21tZW50IGluIGZ4c2F2ZSgpIGJlbG93LiAqLwogCQkgICAgIDogW2Z4XSAiciIgKGZ4KSwgIjAiICgwKSk7CiAjZWxzZQogCQkgICAgIDogW2Z4XSAiY2RhU0RiIiAoZngpLCAiMCIgKDApKTsKQEAgLTE4NSwxMiArMTc3LDkgQEAKIAlhc20gdm9sYXRpbGUoImZuY2xleCA7IGZ3YWl0Iik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKKy8qIHBlcmZvcm0gZnhyc3RvciBpZmYgdGhlIHByb2Nlc3NvciBoYXMgZXh0ZW5kZWQgc3RhdGVzLCBvdGhlcndpc2UgZnJzdG9yICovCitzdGF0aWMgaW5saW5lIGludCBmeHJzdG9yX2NoZWNraW5nKHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKmZ4KQogewotCWlmICh0YXNrX3RocmVhZF9pbmZvKHRzayktPnN0YXR1cyAmIFRTX1hTQVZFKSB7Ci0JCXhyc3Rvcl9jaGVja2luZygmdHNrLT50aHJlYWQueHN0YXRlLT54c2F2ZSk7Ci0JCXJldHVybjsKLQl9CiAJLyoKIAkgKiBUaGUgIm5vcCIgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIGluc3RydWN0aW9ucyB0aGUgc2FtZQogCSAqIGxlbmd0aC4KQEAgLTE5OSw3ICsxODgsOSBAQAogCQkibm9wIDsgZnJzdG9yICUxIiwKIAkJImZ4cnN0b3IgJTEiLAogCQlYODZfRkVBVFVSRV9GWFNSLAotCQkibSIgKHRzay0+dGhyZWFkLnhzdGF0ZS0+ZnhzYXZlKSk7CisJCSJtIiAoKmZ4KSk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyogV2UgbmVlZCBhIHNhZmUgYWRkcmVzcyB0aGF0IGlzIGNoZWFwIHRvIGZpbmQgYW5kIHRoYXQgaXMgYWxyZWFkeQpAQCAtMjYyLDYgKzI1MywxNCBAQAogCiAjZW5kaWYJLyogQ09ORklHX1g4Nl82NCAqLwogCitzdGF0aWMgaW5saW5lIGludCByZXN0b3JlX2ZwdV9jaGVja2luZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlpZiAodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19YU0FWRSkKKwkJcmV0dXJuIHhyc3Rvcl9jaGVja2luZygmdHNrLT50aHJlYWQueHN0YXRlLT54c2F2ZSk7CisJZWxzZQorCQlyZXR1cm4gZnhyc3Rvcl9jaGVja2luZygmdHNrLT50aHJlYWQueHN0YXRlLT5meHNhdmUpOworfQorCiAvKgogICogU2lnbmFsIGZyYW1lIGhhbmRsZXJzLi4uCiAgKi8KQEAgLTMwNSwxOCArMzA0LDE4IEBACiAvKgogICogU29tZSBpbnN0cnVjdGlvbnMgbGlrZSBWSUEncyBwYWRsb2NrIGluc3RydWN0aW9ucyBnZW5lcmF0ZSBhIHNwdXJpb3VzCiAgKiBETkEgZmF1bHQgYnV0IGRvbid0IG1vZGlmeSBTU0UgcmVnaXN0ZXJzLiBBbmQgdGhlc2UgaW5zdHJ1Y3Rpb25zCi0gKiBnZXQgdXNlZCBmcm9tIGludGVycnVwdCBjb250ZXh0IGFzd2VsbC4gVG8gcHJldmVudCB0aGVzZSBrZXJuZWwgaW5zdHJ1Y3Rpb25zCi0gKiBpbiBpbnRlcnJ1cHQgY29udGV4dCBpbnRlcmFjdCB3cm9uZ2x5IHdpdGggb3RoZXIgdXNlci9rZXJuZWwgZnB1IHVzYWdlLCB3ZQorICogZ2V0IHVzZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCBhcyB3ZWxsLiBUbyBwcmV2ZW50IHRoZXNlIGtlcm5lbCBpbnN0cnVjdGlvbnMKKyAqIGluIGludGVycnVwdCBjb250ZXh0IGludGVyYWN0aW5nIHdyb25nbHkgd2l0aCBvdGhlciB1c2VyL2tlcm5lbCBmcHUgdXNhZ2UsIHdlCiAgKiBzaG91bGQgdXNlIHRoZW0gb25seSBpbiB0aGUgY29udGV4dCBvZiBpcnFfdHNfc2F2ZS9yZXN0b3JlKCkKICAqLwogc3RhdGljIGlubGluZSBpbnQgaXJxX3RzX3NhdmUodm9pZCkKIHsKIAkvKgotCSAqIElmIHdlIGFyZSBpbiBwcm9jZXNzIGNvbnRleHQsIHdlIGFyZSBvayB0byB0YWtlIGEgc3B1cmlvdXMgRE5BIGZhdWx0LgotCSAqIE90aGVyd2lzZSwgZG9pbmcgY2x0cygpIGluIHByb2Nlc3MgY29udGV4dCByZXF1aXJlIHByZS1lbXB0aW9uIHRvCi0JICogYmUgZGlzYWJsZWQgb3Igc29tZSBoZWF2eSBsaWZ0aW5nIGxpa2Uga2VybmVsX2ZwdV9iZWdpbigpCisJICogSWYgaW4gcHJvY2VzcyBjb250ZXh0IGFuZCBub3QgYXRvbWljLCB3ZSBjYW4gdGFrZSBhIHNwdXJpb3VzIEROQSBmYXVsdC4KKwkgKiBPdGhlcndpc2UsIGRvaW5nIGNsdHMoKSBpbiBwcm9jZXNzIGNvbnRleHQgcmVxdWlyZXMgZGlzYWJsaW5nIHByZWVtcHRpb24KKwkgKiBvciBzb21lIGhlYXZ5IGxpZnRpbmcgbGlrZSBrZXJuZWxfZnB1X2JlZ2luKCkKIAkgKi8KLQlpZiAoIWluX2ludGVycnVwdCgpKQorCWlmICghaW5fYXRvbWljKCkpCiAJCXJldHVybiAwOwogCiAJaWYgKHJlYWRfY3IwKCkgJiBYODZfQ1IwX1RTKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pODI1OS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaTgyNTkuaAppbmRleCAxYTk5ZTZjLi41OGQ3MDkxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pODI1OS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2k4MjU5LmgKQEAgLTYwLDggKzYwLDQgQEAKIGV4dGVybiB2b2lkIG1hc2tfODI1OUEodm9pZCk7CiBleHRlcm4gdm9pZCB1bm1hc2tfODI1OUEodm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi1leHRlcm4gdm9pZCBpbml0X0lTQV9pcnFzKHZvaWQpOwotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX1g4Nl9JODI1OV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9hcmNoX3BlcmZtb24uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX2FyY2hfcGVyZm1vbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBmZDA2Li4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX2FyY2hfcGVyZm1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotI2lmbmRlZiBfQVNNX1g4Nl9JTlRFTF9BUkNIX1BFUkZNT05fSAotI2RlZmluZSBfQVNNX1g4Nl9JTlRFTF9BUkNIX1BFUkZNT05fSAotCi0jZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjAJCTB4YzEKLSNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMQkJMHhjMgotCi0jZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwCQkweDE4NgotI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMQkJMHgxODcKLQotI2RlZmluZSBBUkNIX1BFUkZNT05fRVZFTlRTRUwwX0VOQUJMRQkoMSA8PCAyMikKLSNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVAkoMSA8PCAyMCkKLSNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX09TCSgxIDw8IDE3KQotI2RlZmluZSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfVVNSCSgxIDw8IDE2KQotCi0jZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19TRUwJKDB4M2MpCi0jZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19VTUFTSwkoMHgwMCA8PCA4KQotI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfSU5ERVggKDApCi0jZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19QUkVTRU5UIFwKLQkoMSA8PCAoQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX0lOREVYKSkKLQotdW5pb24gY3B1aWQxMF9lYXggewotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGludCB2ZXJzaW9uX2lkOjg7Ci0JCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM6ODsKLQkJdW5zaWduZWQgaW50IGJpdF93aWR0aDo4OwotCQl1bnNpZ25lZCBpbnQgbWFza19sZW5ndGg6ODsKLQl9IHNwbGl0OwotCXVuc2lnbmVkIGludCBmdWxsOwotfTsKLQotI2VuZGlmIC8qIF9BU01fWDg2X0lOVEVMX0FSQ0hfUEVSRk1PTl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pb19hcGljLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pb19hcGljLmgKaW5kZXggOWQ4MjZlNC4uZGFmODY2ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9fYXBpYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvX2FwaWMuaApAQCAtMTU0LDIyICsxNTQsMTkgQEAKIGV4dGVybiBpbnQgaW9fYXBpY19nZXRfdW5pcXVlX2lkKGludCBpb2FwaWMsIGludCBhcGljX2lkKTsKIGV4dGVybiBpbnQgaW9fYXBpY19nZXRfdmVyc2lvbihpbnQgaW9hcGljKTsKIGV4dGVybiBpbnQgaW9fYXBpY19nZXRfcmVkaXJfZW50cmllcyhpbnQgaW9hcGljKTsKLWV4dGVybiBpbnQgaW9fYXBpY19zZXRfcGNpX3JvdXRpbmcoaW50IGlvYXBpYywgaW50IHBpbiwgaW50IGlycSwKLQkJCQkgICBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdyk7CiAjZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KIAorc3RydWN0IGlvX2FwaWNfaXJxX2F0dHI7CitleHRlcm4gaW50IGlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlycSwKKwkJIHN0cnVjdCBpb19hcGljX2lycV9hdHRyICppcnFfYXR0cik7CiBleHRlcm4gaW50ICgqaW9hcGljX3JlbnVtYmVyX2lycSkoaW50IGlvYXBpYywgaW50IGlycSk7CiBleHRlcm4gdm9pZCBpb2FwaWNfaW5pdF9tYXBwaW5ncyh2b2lkKTsKIAotI2lmZGVmIENPTkZJR19YODZfNjQKIGV4dGVybiBzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmFsbG9jX2lvYXBpY19lbnRyaWVzKHZvaWQpOwogZXh0ZXJuIHZvaWQgZnJlZV9pb2FwaWNfZW50cmllcyhzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzKTsKIGV4dGVybiBpbnQgc2F2ZV9JT19BUElDX3NldHVwKHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICoqaW9hcGljX2VudHJpZXMpOwogZXh0ZXJuIHZvaWQgbWFza19JT19BUElDX3NldHVwKHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICoqaW9hcGljX2VudHJpZXMpOwogZXh0ZXJuIGludCByZXN0b3JlX0lPX0FQSUNfc2V0dXAoc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgKippb2FwaWNfZW50cmllcyk7Ci1leHRlcm4gdm9pZCByZWluaXRfaW50cl9yZW1hcHBlZF9JT19BUElDKGludCBpbnRyX3JlbWFwcGluZywKLQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzKTsKLSNlbmRpZgogCiBleHRlcm4gdm9pZCBwcm9iZV9ucl9pcnFzX2dzaSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9tYXAuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvbWFwLmgKaW5kZXggODZhZjI2MC4uMGU5ZmUxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9tYXAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pb21hcC5oCkBAIC0xLDMgKzEsNiBAQAorI2lmbmRlZiBfQVNNX1g4Nl9JT01BUF9ICisjZGVmaW5lIF9BU01fWDg2X0lPTUFQX0gKKwogLyoKICAqIENvcHlyaWdodCDCqSAyMDA4IEluZ28gTW9sbmFyCiAgKgpAQCAtMzEsMyArMzQsNSBAQAogCiB2b2lkCiBpb3VubWFwX2F0b21pYyh2b2lkICprdmFkZHIsIGVudW0ga21fdHlwZSB0eXBlKTsKKworI2VuZGlmIC8qIF9BU01fWDg2X0lPTUFQX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV9yZW1hcHBpbmcuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV9yZW1hcHBpbmcuaAppbmRleCAwMzk2NzYwLi5mMjc1ZTIyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfcmVtYXBwaW5nLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxX3JlbWFwcGluZy5oCkBAIC0xLDYgKzEsNiBAQAogI2lmbmRlZiBfQVNNX1g4Nl9JUlFfUkVNQVBQSU5HX0gKICNkZWZpbmUgX0FTTV9YODZfSVJRX1JFTUFQUElOR19ICiAKLSNkZWZpbmUgSVJURV9ERVNUKGRlc3QpICgoeDJhcGljKSA/IGRlc3QgOiBkZXN0IDw8IDgpCisjZGVmaW5lIElSVEVfREVTVChkZXN0KSAoKHgyYXBpY19tb2RlKSA/IGRlc3QgOiBkZXN0IDw8IDgpCiAKICNlbmRpZgkvKiBfQVNNX1g4Nl9JUlFfUkVNQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oCmluZGV4IDNjYmQ3OWIuLmU5OTdiZTk4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV92ZWN0b3JzLmgKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2lmZGVmIENPTkZJR19YODZfMzIKICMgZGVmaW5lIFNZU0NBTExfVkVDVE9SCQkJMHg4MAorIyBkZWZpbmUgSUEzMl9TWVNDQUxMX1ZFQ1RPUgkJMHg4MAogI2Vsc2UKICMgZGVmaW5lIElBMzJfU1lTQ0FMTF9WRUNUT1IJCTB4ODAKICNlbmRpZgpAQCAtMTA3LDE2ICsxMDgsMTYgQEAKICNkZWZpbmUgTE9DQUxfVElNRVJfVkVDVE9SCQkweGVmCiAKIC8qCi0gKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGludGVycnVwdCB2ZWN0b3I6Ci0gKi8KLSNkZWZpbmUgTE9DQUxfUEVSRl9WRUNUT1IJCTB4ZWUKLQotLyoKICAqIEdlbmVyaWMgc3lzdGVtIHZlY3RvciBmb3IgcGxhdGZvcm0gc3BlY2lmaWMgdXNlCiAgKi8KICNkZWZpbmUgR0VORVJJQ19JTlRFUlJVUFRfVkVDVE9SCTB4ZWQKIAogLyoKKyAqIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgcGVuZGluZyB3b3JrIHZlY3RvcjoKKyAqLworI2RlZmluZSBMT0NBTF9QRU5ESU5HX1ZFQ1RPUgkJMHhlYworCisvKgogICogRmlyc3QgQVBJQyB2ZWN0b3IgYXZhaWxhYmxlIHRvIGRyaXZlcnM6ICh2ZWN0b3JzIDB4MzAtMHhlZSkgd2UKICAqIHN0YXJ0IGF0IDB4MzEoMHg0MSkgdG8gc3ByZWFkIG91dCB2ZWN0b3JzIGV2ZW5seSBiZXR3ZWVuIHByaW9yaXR5CiAgKiBsZXZlbHMuICgweDgwIGlzIHRoZSBzeXNjYWxsIHZlY3RvcikKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2s4LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rOC5oCmluZGV4IDU0YzhjYzUuLmMyZDFmM2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2s4LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vazguaApAQCAtMTIsNCArMTIsMTcgQEAKIGV4dGVybiB2b2lkIGs4X2ZsdXNoX2dhcnRzKHZvaWQpOwogZXh0ZXJuIGludCBrOF9zY2FuX25vZGVzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIAorI2lmZGVmIENPTkZJR19LOF9OQgorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2RldiAqbm9kZV90b19rOF9uYl9taXNjKGludCBub2RlKQoreworCXJldHVybiAobm9kZSA8IG51bV9rOF9ub3J0aGJyaWRnZXMpID8gazhfbm9ydGhicmlkZ2VzW25vZGVdIDogTlVMTDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwY2lfZGV2ICpub2RlX3RvX2s4X25iX21pc2MoaW50IG5vZGUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworCiAjZW5kaWYgLyogX0FTTV9YODZfSzhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm0uaAppbmRleCBkYzNmNmNmLi4xMjViZThiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm0uaApAQCAtMTYsNiArMTYsNyBAQAogI2RlZmluZSBfX0tWTV9IQVZFX01TSQogI2RlZmluZSBfX0tWTV9IQVZFX1VTRVJfTk1JCiAjZGVmaW5lIF9fS1ZNX0hBVkVfR1VFU1RfREVCVUcKKyNkZWZpbmUgX19LVk1fSEFWRV9NU0lYCiAKIC8qIEFyY2hpdGVjdHVyYWwgaW50ZXJydXB0IGxpbmUgY291bnQuICovCiAjZGVmaW5lIEtWTV9OUl9JTlRFUlJVUFRTIDI1NgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggZjBmYWY1OC4uZWFiZGMxYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0xODUsNiArMTg1LDcgQEAKIAkJdW5zaWduZWQgYWNjZXNzOjM7CiAJCXVuc2lnbmVkIGludmFsaWQ6MTsKIAkJdW5zaWduZWQgY3I0X3BnZToxOworCQl1bnNpZ25lZCBueGU6MTsKIAl9OwogfTsKIApAQCAtMjEyLDcgKzIxMyw2IEBACiAJaW50IG11bHRpbWFwcGVkOyAgICAgICAgIC8qIE1vcmUgdGhhbiBvbmUgcGFyZW50X3B0ZT8gKi8KIAlpbnQgcm9vdF9jb3VudDsgICAgICAgICAgLyogQ3VycmVudGx5IHNlcnZpbmcgYXMgYWN0aXZlIHJvb3QgKi8KIAlib29sIHVuc3luYzsKLQlib29sIGdsb2JhbDsKIAl1bnNpZ25lZCBpbnQgdW5zeW5jX2NoaWxkcmVuOwogCXVuaW9uIHsKIAkJdTY0ICpwYXJlbnRfcHRlOyAgICAgICAgICAgICAgIC8qICFtdWx0aW1hcHBlZCAqLwpAQCAtMjYxLDEzICsyNjEsMTEgQEAKIAl1bmlvbiBrdm1fbW11X3BhZ2Vfcm9sZSBiYXNlX3JvbGU7CiAKIAl1NjQgKnBhZV9yb290OworCXU2NCByc3ZkX2JpdHNfbWFza1syXVs0XTsKIH07CiAKIHN0cnVjdCBrdm1fdmNwdV9hcmNoIHsKIAl1NjQgaG9zdF90c2M7Ci0JaW50IGludGVycnVwdF93aW5kb3dfb3BlbjsKLQl1bnNpZ25lZCBsb25nIGlycV9zdW1tYXJ5OyAvKiBiaXQgdmVjdG9yOiAxIHBlciB3b3JkIGluIGlycV9wZW5kaW5nICovCi0JREVDTEFSRV9CSVRNQVAoaXJxX3BlbmRpbmcsIEtWTV9OUl9JTlRFUlJVUFRTKTsKIAkvKgogCSAqIHJpcCBhbmQgcmVncyBhY2Nlc3NlcyBtdXN0IGdvIHRocm91Z2gKIAkgKiBrdm1fe3JlZ2lzdGVyLHJpcH1fe3JlYWQsd3JpdGV9IGZ1bmN0aW9ucy4KQEAgLTI4Niw2ICsyODQsNyBAQAogCXU2NCBzaGFkb3dfZWZlcjsKIAl1NjQgYXBpY19iYXNlOwogCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWM7ICAgIC8qIGtlcm5lbCBpcnFjaGlwIGNvbnRleHQgKi8KKwlpbnQzMl90IGFwaWNfYXJiX3ByaW87CiAJaW50IG1wX3N0YXRlOwogCWludCBzaXBpX3ZlY3RvcjsKIAl1NjQgaWEzMl9taXNjX2VuYWJsZV9tc3I7CkBAIC0zMjAsNiArMzE5LDggQEAKIAlzdHJ1Y3Qga3ZtX3Bpb19yZXF1ZXN0IHBpbzsKIAl2b2lkICpwaW9fZGF0YTsKIAorCXU4IGV2ZW50X2V4aXRfaW5zdF9sZW47CisKIAlzdHJ1Y3Qga3ZtX3F1ZXVlZF9leGNlcHRpb24gewogCQlib29sIHBlbmRpbmc7CiAJCWJvb2wgaGFzX2Vycm9yX2NvZGU7CkBAIC0zMjksMTEgKzMzMCwxMiBAQAogCiAJc3RydWN0IGt2bV9xdWV1ZWRfaW50ZXJydXB0IHsKIAkJYm9vbCBwZW5kaW5nOworCQlib29sIHNvZnQ7CiAJCXU4IG5yOwogCX0gaW50ZXJydXB0OwogCiAJc3RydWN0IHsKLQkJaW50IGFjdGl2ZTsKKwkJaW50IHZtODZfYWN0aXZlOwogCQl1OCBzYXZlX2lvcGw7CiAJCXN0cnVjdCBrdm1fc2F2ZV9zZWdtZW50IHsKIAkJCXUxNiBzZWxlY3RvcjsKQEAgLTM1Niw5ICszNTgsOSBAQAogCXVuc2lnbmVkIGludCB0aW1lX29mZnNldDsKIAlzdHJ1Y3QgcGFnZSAqdGltZV9wYWdlOwogCisJYm9vbCBzaW5nbGVzdGVwOyAvKiBndWVzdCBpcyBzaW5nbGUgc3RlcHBlZCBieSBLVk0gKi8KIAlib29sIG5taV9wZW5kaW5nOwogCWJvb2wgbm1pX2luamVjdGVkOwotCWJvb2wgbm1pX3dpbmRvd19vcGVuOwogCiAJc3RydWN0IG10cnJfc3RhdGVfdHlwZSBtdHJyX3N0YXRlOwogCXUzMiBwYXQ7CkBAIC0zOTIsMTUgKzM5NCwxNCBAQAogCSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYWN0aXZlX21tdV9wYWdlczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFzc2lnbmVkX2Rldl9oZWFkOwotCXN0cnVjdCBsaXN0X2hlYWQgb29zX2dsb2JhbF9wYWdlczsKIAlzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW47CisJaW50IGlvbW11X2ZsYWdzOwogCXN0cnVjdCBrdm1fcGljICp2cGljOwogCXN0cnVjdCBrdm1faW9hcGljICp2aW9hcGljOwogCXN0cnVjdCBrdm1fcGl0ICp2cGl0OwogCXN0cnVjdCBobGlzdF9oZWFkIGlycV9hY2tfbm90aWZpZXJfbGlzdDsKIAlpbnQgdmFwaWNzX2luX25taV9tb2RlOwogCi0JaW50IHJvdW5kX3JvYmluX3ByZXZfdmNwdTsKIAl1bnNpZ25lZCBpbnQgdHNzX2FkZHI7CiAJc3RydWN0IHBhZ2UgKmFwaWNfYWNjZXNzX3BhZ2U7CiAKQEAgLTQyMyw3ICs0MjQsNiBAQAogCXUzMiBtbXVfcmVjeWNsZWQ7CiAJdTMyIG1tdV9jYWNoZV9taXNzOwogCXUzMiBtbXVfdW5zeW5jOwotCXUzMiBtbXVfdW5zeW5jX2dsb2JhbDsKIAl1MzIgcmVtb3RlX3RsYl9mbHVzaDsKIAl1MzIgbHBhZ2VzOwogfTsKQEAgLTQ0Myw3ICs0NDMsNiBAQAogCXUzMiBoYWx0X2V4aXRzOwogCXUzMiBoYWx0X3dha2V1cDsKIAl1MzIgcmVxdWVzdF9pcnFfZXhpdHM7Ci0JdTMyIHJlcXVlc3Rfbm1pX2V4aXRzOwogCXUzMiBpcnFfZXhpdHM7CiAJdTMyIGhvc3Rfc3RhdGVfcmVsb2FkOwogCXUzMiBlZmVyX3JlbG9hZDsKQEAgLTUxMSwyMCArNTEwLDIyIEBACiAJdm9pZCAoKnJ1bikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuKTsKIAlpbnQgKCpoYW5kbGVfZXhpdCkoc3RydWN0IGt2bV9ydW4gKnJ1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAl2b2lkICgqc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwl2b2lkICgqc2V0X2ludGVycnVwdF9zaGFkb3cpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IG1hc2spOworCXUzMiAoKmdldF9pbnRlcnJ1cHRfc2hhZG93KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBtYXNrKTsKIAl2b2lkICgqcGF0Y2hfaHlwZXJjYWxsKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJdW5zaWduZWQgY2hhciAqaHlwZXJjYWxsX2FkZHIpOwotCWludCAoKmdldF9pcnEpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci0Jdm9pZCAoKnNldF9pcnEpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHZlYyk7CisJdm9pZCAoKnNldF9pcnEpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJdm9pZCAoKnNldF9ubWkpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJdm9pZCAoKnF1ZXVlX2V4Y2VwdGlvbikoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBuciwKIAkJCQlib29sIGhhc19lcnJvcl9jb2RlLCB1MzIgZXJyb3JfY29kZSk7Ci0JYm9vbCAoKmV4Y2VwdGlvbl9pbmplY3RlZCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLQl2b2lkICgqaW5qZWN0X3BlbmRpbmdfaXJxKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotCXZvaWQgKCppbmplY3RfcGVuZGluZ192ZWN0b3JzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJICAgICAgIHN0cnVjdCBrdm1fcnVuICpydW4pOwotCisJaW50ICgqaW50ZXJydXB0X2FsbG93ZWQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJaW50ICgqbm1pX2FsbG93ZWQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisJdm9pZCAoKmVuYWJsZV9ubWlfd2luZG93KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCXZvaWQgKCplbmFibGVfaXJxX3dpbmRvdykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwl2b2lkICgqdXBkYXRlX2NyOF9pbnRlcmNlcHQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHRwciwgaW50IGlycik7CiAJaW50ICgqc2V0X3Rzc19hZGRyKShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGludCBhZGRyKTsKIAlpbnQgKCpnZXRfdGRwX2xldmVsKSh2b2lkKTsKLQlpbnQgKCpnZXRfbXRfbWFza19zaGlmdCkodm9pZCk7CisJdTY0ICgqZ2V0X210X21hc2spKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgZ2ZuLCBib29sIGlzX21taW8pOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBrdm1feDg2X29wcyAqa3ZtX3g4Nl9vcHM7CkBAIC01MzgsNyArNTM5LDcgQEAKIHZvaWQga3ZtX21tdV9zZXRfbm9ucHJlc2VudF9wdGVzKHU2NCB0cmFwX3B0ZSwgdTY0IG5vdHJhcF9wdGUpOwogdm9pZCBrdm1fbW11X3NldF9iYXNlX3B0ZXModTY0IGJhc2VfcHRlKTsKIHZvaWQga3ZtX21tdV9zZXRfbWFza19wdGVzKHU2NCB1c2VyX21hc2ssIHU2NCBhY2Nlc3NlZF9tYXNrLAotCQl1NjQgZGlydHlfbWFzaywgdTY0IG54X21hc2ssIHU2NCB4X21hc2ssIHU2NCBtdF9tYXNrKTsKKwkJdTY0IGRpcnR5X21hc2ssIHU2NCBueF9tYXNrLCB1NjQgeF9tYXNrKTsKIAogaW50IGt2bV9tbXVfcmVzZXRfY29udGV4dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fbW11X3Nsb3RfcmVtb3ZlX3dyaXRlX2FjY2VzcyhzdHJ1Y3Qga3ZtICprdm0sIGludCBzbG90KTsKQEAgLTU1Miw2ICs1NTMsNyBAQAogCQkJICBjb25zdCB2b2lkICp2YWwsIGludCBieXRlcyk7CiBpbnQga3ZtX3B2X21tdV9vcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsCiAJCSAgZ3BhX3QgYWRkciwgdW5zaWduZWQgbG9uZyAqcmV0KTsKK3U4IGt2bV9nZXRfZ3Vlc3RfbWVtb3J5X3R5cGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBnZm4pOwogCiBleHRlcm4gYm9vbCB0ZHBfZW5hYmxlZDsKIApAQCAtNTYzLDYgKzU2NSw3IEBACiAKICNkZWZpbmUgRU1VTFRZUEVfTk9fREVDT0RFCSAgICAoMSA8PCAwKQogI2RlZmluZSBFTVVMVFlQRV9UUkFQX1VECSAgICAoMSA8PCAxKQorI2RlZmluZSBFTVVMVFlQRV9TS0lQCQkgICAgKDEgPDwgMikKIGludCBlbXVsYXRlX2luc3RydWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1biwKIAkJCXVuc2lnbmVkIGxvbmcgY3IyLCB1MTYgZXJyb3JfY29kZSwgaW50IGVtdWxhdGlvbl90eXBlKTsKIHZvaWQga3ZtX3JlcG9ydF9lbXVsYXRpb25fZmFpbHVyZShzdHJ1Y3Qga3ZtX3ZjcHUgKmN2cHUsIGNvbnN0IGNoYXIgKmNvbnRleHQpOwpAQCAtNjM4LDcgKzY0MSw2IEBACiBpbnQga3ZtX21tdV9sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9tbXVfdW5sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9tbXVfc3luY19yb290cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwotdm9pZCBrdm1fbW11X3N5bmNfZ2xvYmFsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIGludCBrdm1fZW11bGF0ZV9oeXBlcmNhbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIApAQCAtNzY5LDYgKzc3MSw4IEBACiAjZGVmaW5lIEhGX0dJRl9NQVNLCQkoMSA8PCAwKQogI2RlZmluZSBIRl9ISUZfTUFTSwkJKDEgPDwgMSkKICNkZWZpbmUgSEZfVklOVFJfTUFTSwkJKDEgPDwgMikKKyNkZWZpbmUgSEZfTk1JX01BU0sJCSgxIDw8IDMpCisjZGVmaW5lIEhGX0lSRVRfTUFTSwkJKDEgPDwgNCkKIAogLyoKICAqIEhhcmR3YXJlIHZpcnR1YWxpemF0aW9uIGV4dGVuc2lvbiBpbnN0cnVjdGlvbnMgbWF5IGZhdWx0IGlmIGEKQEAgLTc5MSw1ICs3OTUsNiBAQAogI2RlZmluZSBLVk1fQVJDSF9XQU5UX01NVV9OT1RJRklFUgogaW50IGt2bV91bm1hcF9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSk7CiBpbnQga3ZtX2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSk7CitpbnQgY3B1aWRfbWF4cGh5YWRkcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiAjZW5kaWYgLyogX0FTTV9YODZfS1ZNX0hPU1RfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX3g4Nl9lbXVsYXRlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1feDg2X2VtdWxhdGUuaAppbmRleCA2YTE1OTczLi5iN2VkMmM0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1feDg2X2VtdWxhdGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1feDg2X2VtdWxhdGUuaApAQCAtMTQzLDYgKzE0Myw5IEBACiAJc3RydWN0IGZldGNoX2NhY2hlIGZldGNoOwogfTsKIAorI2RlZmluZSBYODZfU0hBRE9XX0lOVF9NT1ZfU1MgIDEKKyNkZWZpbmUgWDg2X1NIQURPV19JTlRfU1RJICAgICAyCisKIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0IHsKIAkvKiBSZWdpc3RlciBzdGF0ZSBiZWZvcmUvYWZ0ZXIgZW11bGF0aW9uLiAqLwogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKQEAgLTE1Miw2ICsxNTUsOSBAQAogCWludCBtb2RlOwogCXUzMiBjc19iYXNlOwogCisJLyogaW50ZXJydXB0aWJpbGl0eSBzdGF0ZSwgYXMgYSByZXN1bHQgb2YgZXhlY3V0aW9uIG9mIFNUSSBvciBNT1YgU1MgKi8KKwlpbnQgaW50ZXJydXB0aWJpbGl0eTsKKwogCS8qIGRlY29kZSBjYWNoZSAqLwogCXN0cnVjdCBkZWNvZGVfY2FjaGUgZGVjb2RlOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21pY3JvY29kZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlLmgKaW5kZXggYzg4MjY2NC4uZWY1MWI1MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlLmgKQEAgLTksMjAgKzksMzEgQEAKIAogc3RydWN0IGRldmljZTsKIAorZW51bSB1Y29kZV9zdGF0ZSB7IFVDT0RFX0VSUk9SLCBVQ09ERV9PSywgVUNPREVfTkZPVU5EIH07CisKIHN0cnVjdCBtaWNyb2NvZGVfb3BzIHsKLQlpbnQgICgqcmVxdWVzdF9taWNyb2NvZGVfdXNlcikgKGludCBjcHUsIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBzaXplKTsKLQlpbnQgICgqcmVxdWVzdF9taWNyb2NvZGVfZncpIChpbnQgY3B1LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworCWVudW0gdWNvZGVfc3RhdGUgKCpyZXF1ZXN0X21pY3JvY29kZV91c2VyKSAoaW50IGNwdSwKKwkJCQljb25zdCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiAKLQl2b2lkICgqYXBwbHlfbWljcm9jb2RlKSAoaW50IGNwdSk7CisJZW51bSB1Y29kZV9zdGF0ZSAoKnJlcXVlc3RfbWljcm9jb2RlX2Z3KSAoaW50IGNwdSwKKwkJCQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwogCi0JaW50ICAoKmNvbGxlY3RfY3B1X2luZm8pIChpbnQgY3B1LCBzdHJ1Y3QgY3B1X3NpZ25hdHVyZSAqY3NpZyk7CiAJdm9pZCAoKm1pY3JvY29kZV9maW5pX2NwdSkgKGludCBjcHUpOworCisJLyoKKwkgKiBUaGUgZ2VuZXJpYyAnbWljcm9jb2RlX2NvcmUnIHBhcnQgZ3VhcmFudGVlcyB0aGF0CisJICogdGhlIGNhbGxiYWNrcyBiZWxvdyBydW4gb24gYSB0YXJnZXQgY3B1IHdoZW4gdGhleQorCSAqIGFyZSBiZWluZyBjYWxsZWQuCisJICogU2VlIGFsc28gdGhlICJTeW5jaHJvbml6YXRpb24iIHNlY3Rpb24gaW4gbWljcm9jb2RlX2NvcmUuYy4KKwkgKi8KKwlpbnQgKCphcHBseV9taWNyb2NvZGUpIChpbnQgY3B1KTsKKwlpbnQgKCpjb2xsZWN0X2NwdV9pbmZvKSAoaW50IGNwdSwgc3RydWN0IGNwdV9zaWduYXR1cmUgKmNzaWcpOwogfTsKIAogc3RydWN0IHVjb2RlX2NwdV9pbmZvIHsKLQlzdHJ1Y3QgY3B1X3NpZ25hdHVyZSBjcHVfc2lnOwotCWludCB2YWxpZDsKLQl2b2lkICptYzsKKwlzdHJ1Y3QgY3B1X3NpZ25hdHVyZQljcHVfc2lnOworCWludAkJCXZhbGlkOworCXZvaWQJCQkqbWM7CiB9OwogZXh0ZXJuIHN0cnVjdCB1Y29kZV9jcHVfaW5mbyB1Y29kZV9jcHVfaW5mb1tdOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCmluZGV4IDY0MmZjN2YuLmUyYTFiYjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCkBAIC02MSw5ICs2MSwxMSBAQAogI2lmZGVmIENPTkZJR19YODZfTVBQQVJTRQogZXh0ZXJuIHZvaWQgZmluZF9zbXBfY29uZmlnKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfcmVzZXJ2ZV9lODIwX21wY19uZXcodm9pZCk7CitleHRlcm4gaW50IGVuYWJsZV91cGRhdGVfbXB0YWJsZTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgZmluZF9zbXBfY29uZmlnKHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGVhcmx5X3Jlc2VydmVfZTgyMF9tcGNfbmV3KHZvaWQpIHsgfQorI2RlZmluZSBlbmFibGVfdXBkYXRlX21wdGFibGUgMAogI2VuZGlmCiAKIHZvaWQgX19jcHVpbml0IGdlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24pOwpAQCAtNzIsMjAgKzc0LDEzIEBACiBleHRlcm4gdm9pZCBtcF9vdmVycmlkZV9sZWdhY3lfaXJxKHU4IGJ1c19pcnEsIHU4IHBvbGFyaXR5LCB1OCB0cmlnZ2VyLAogCQkJCSAgIHUzMiBnc2kpOwogZXh0ZXJuIHZvaWQgbXBfY29uZmlnX2FjcGlfbGVnYWN5X2lycXModm9pZCk7Ci1leHRlcm4gaW50IG1wX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdyk7CitzdHJ1Y3QgZGV2aWNlOworZXh0ZXJuIGludCBtcF9yZWdpc3Rlcl9nc2koc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwKKwkJCQkgaW50IGFjdGl2ZV9oaWdoX2xvdyk7CiBleHRlcm4gaW50IGFjcGlfcHJvYmVfZ3NpKHZvaWQpOwogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwotZXh0ZXJuIGludCBtcF9jb25maWdfYWNwaV9nc2kodW5zaWduZWQgY2hhciBudW1iZXIsIHVuc2lnbmVkIGludCBkZXZmbiwgdTggcGluLAotCQkJCXUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpOwogZXh0ZXJuIGludCBtcF9maW5kX2lvYXBpYyhpbnQgZ3NpKTsKIGV4dGVybiBpbnQgbXBfZmluZF9pb2FwaWNfcGluKGludCBpb2FwaWMsIGludCBnc2kpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50Ci1tcF9jb25maWdfYWNwaV9nc2kodW5zaWduZWQgY2hhciBudW1iZXIsIHVuc2lnbmVkIGludCBkZXZmbiwgdTggcGluLAotCQkgICB1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQotewotCXJldHVybiAwOwotfQogI2VuZGlmCiAjZWxzZSAvKiAhQ09ORklHX0FDUEk6ICovCiBzdGF0aWMgaW5saW5lIGludCBhY3BpX3Byb2JlX2dzaSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLWluZGV4LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaAppbmRleCBlYzQxZmMxLi40ZDU4ZDA0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaApAQCAtMTIxLDcgKzEyMSw2IEBACiAjZGVmaW5lIE1TUl9LOF9UT1BfTUVNMQkJCTB4YzAwMTAwMWEKICNkZWZpbmUgTVNSX0s4X1RPUF9NRU0yCQkJMHhjMDAxMDAxZAogI2RlZmluZSBNU1JfSzhfU1lTQ0ZHCQkJMHhjMDAxMDAxMAotI2RlZmluZSBNU1JfSzhfSFdDUgkJCTB4YzAwMTAwMTUKICNkZWZpbmUgTVNSX0s4X0lOVF9QRU5ESU5HX01TRwkJMHhjMDAxMDA1NQogLyogQzFFIGFjdGl2ZSBiaXRzIGluIGludCBwZW5kaW5nIG1lc3NhZ2UgKi8KICNkZWZpbmUgSzhfSU5UUF9DMUVfQUNUSVZFX01BU0sJCTB4MTgwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21zci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmgKaW5kZXggNjM4YmY2Mi4uMjI2MDM3NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmgKQEAgLTEyLDYgKzEyLDE3IEBACiAKICNpbmNsdWRlIDxhc20vYXNtLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL2NwdW1hc2suaD4KKworc3RydWN0IG1zciB7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTMyIGw7CisJCQl1MzIgaDsKKwkJfTsKKwkJdTY0IHE7CisJfTsKK307CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIG5hdGl2ZV9yZWFkX3RzY3AodW5zaWduZWQgaW50ICphdXgpCiB7CkBAIC0yMTYsNiArMjI3LDggQEAKICNpZmRlZiBDT05GSUdfU01QCiBpbnQgcmRtc3Jfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sIHUzMiAqbCwgdTMyICpoKTsKIGludCB3cm1zcl9vbl9jcHUodW5zaWduZWQgaW50IGNwdSwgdTMyIG1zcl9ubywgdTMyIGwsIHUzMiBoKTsKK3ZvaWQgcmRtc3Jfb25fY3B1cyhjb25zdCBjcHVtYXNrX3QgKm1hc2ssIHUzMiBtc3Jfbm8sIHN0cnVjdCBtc3IgKm1zcnMpOwordm9pZCB3cm1zcl9vbl9jcHVzKGNvbnN0IGNwdW1hc2tfdCAqbWFzaywgdTMyIG1zcl9ubywgc3RydWN0IG1zciAqbXNycyk7CiBpbnQgcmRtc3Jfc2FmZV9vbl9jcHUodW5zaWduZWQgaW50IGNwdSwgdTMyIG1zcl9ubywgdTMyICpsLCB1MzIgKmgpOwogaW50IHdybXNyX3NhZmVfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sIHUzMiBsLCB1MzIgaCk7CiAjZWxzZSAgLyogIENPTkZJR19TTVAgICovCkBAIC0yMjksNiArMjQyLDE2IEBACiAJd3Jtc3IobXNyX25vLCBsLCBoKTsKIAlyZXR1cm4gMDsKIH0KK3N0YXRpYyBpbmxpbmUgdm9pZCByZG1zcl9vbl9jcHVzKGNvbnN0IGNwdW1hc2tfdCAqbSwgdTMyIG1zcl9ubywKKwkJCQlzdHJ1Y3QgbXNyICptc3JzKQoreworICAgICAgIHJkbXNyX29uX2NwdSgwLCBtc3Jfbm8sICYobXNyc1swXS5sKSwgJihtc3JzWzBdLmgpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cm1zcl9vbl9jcHVzKGNvbnN0IGNwdW1hc2tfdCAqbSwgdTMyIG1zcl9ubywKKwkJCQlzdHJ1Y3QgbXNyICptc3JzKQoreworICAgICAgIHdybXNyX29uX2NwdSgwLCBtc3Jfbm8sIG1zcnNbMF0ubCwgbXNyc1swXS5oKTsKK30KIHN0YXRpYyBpbmxpbmUgaW50IHJkbXNyX3NhZmVfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sCiAJCQkJICAgIHUzMiAqbCwgdTMyICpoKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbm1pLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaAppbmRleCBjNDVhMGE1Li5jOTcyNjQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ubWkuaApAQCAtNjQsNyArNjQsNyBAQAogCSAqIGJ1dCBzaW5jZSB0aGV5IGFyZSBwb3dlciBvZiB0d28gd2UgY291bGQgdXNlIGEKIAkgKiBjaGVhcGVyIHdheSAtLWN2ZwogCSAqLwotCXJldHVybiBubWlfd2F0Y2hkb2cgJiAweDM7CisJcmV0dXJuIG5taV93YXRjaGRvZyAmIChOTUlfTE9DQUxfQVBJQyB8IE5NSV9JT19BUElDKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hXzY0LmgKaW5kZXggMDY0ZWQ2ZC4uYzRhZTgyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYV82NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfNjQuaApAQCAtMTcsOSArMTcsNiBAQAogZXh0ZXJuIHZvaWQgbnVtYV9pbml0X2FycmF5KHZvaWQpOwogZXh0ZXJuIGludCBudW1hX29mZjsKIAotZXh0ZXJuIHZvaWQgc3JhdF9yZXNlcnZlX2FkZF9hcmVhKGludCBub2RlaWQpOwotZXh0ZXJuIGludCBob3RhZGRfcGVyY2VudDsKLQogZXh0ZXJuIHMxNiBhcGljaWRfdG9fbm9kZVtNQVhfTE9DQUxfQVBJQ107CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG51bWFfZnJlZV9hbGxfYm9vdG1lbSh2b2lkKTsKQEAgLTI3LDYgKzI0LDEzIEBACiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmQpOwogCiAjaWZkZWYgQ09ORklHX05VTUEKKy8qCisgKiBUb28gc21hbGwgbm9kZSBzaXplcyBtYXkgY29uZnVzZSB0aGUgVk0gYmFkbHkuIFVzdWFsbHkgdGhleQorICogcmVzdWx0IGZyb20gQklPUyBidWdzLiBTbyBkb250IHJlY29nbml6ZSBub2RlcyBhcyBzdGFuZGFsb25lCisgKiBOVU1BIGVudGl0aWVzIHRoYXQgaGF2ZSBsZXNzIHRoYW4gdGhpcyBhbW91bnQgb2YgUkFNIGxpc3RlZDoKKyAqLworI2RlZmluZSBOT0RFX01JTl9TSVpFICg0KjEwMjQqMTAyNCkKKwogZXh0ZXJuIHZvaWQgX19pbml0IGluaXRfY3B1X3RvX25vZGUodm9pZCk7CiBleHRlcm4gdm9pZCBfX2NwdWluaXQgbnVtYV9zZXRfbm9kZShpbnQgY3B1LCBpbnQgbm9kZSk7CiBleHRlcm4gdm9pZCBfX2NwdWluaXQgbnVtYV9jbGVhcl9ub2RlKGludCBjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV8zMl90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV8zMl90eXBlcy5oCmluZGV4IDBmOTE1YWUuLjZmMWI3MzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfMzJfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYWdlXzMyX3R5cGVzLmgKQEAgLTU0LDEwICs1NCw2IEBACiBleHRlcm4gaW50IHN5c2N0bF9sZWdhY3lfdmFfbGF5b3V0OwogCiBleHRlcm4gdm9pZCBmaW5kX2xvd19wZm5fcmFuZ2Uodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBpbml0X21lbW9yeV9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCQkJCSB1bnNpZ25lZCBsb25nIGVuZCk7Ci1leHRlcm4gdm9pZCBpbml0bWVtX2luaXQodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZCBmcmVlX2luaXRtZW0odm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9ib290bWVtX2FsbG9jYXRvcih2b2lkKTsKIAogI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfNjRfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfNjRfdHlwZXMuaAppbmRleCBkMzhjOTFiLi44ZDM4MmQzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYWdlXzY0X3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV82NF90eXBlcy5oCkBAIC0zMiwyMiArMzIsMTQgQEAKICAqLwogI2RlZmluZSBfX1BBR0VfT0ZGU0VUICAgICAgICAgICBfQUMoMHhmZmZmODgwMDAwMDAwMDAwLCBVTCkKIAotI2RlZmluZSBfX1BIWVNJQ0FMX1NUQVJUCUNPTkZJR19QSFlTSUNBTF9TVEFSVAotI2RlZmluZSBfX0tFUk5FTF9BTElHTgkJMHgyMDAwMDAKLQotLyoKLSAqIE1ha2Ugc3VyZSBrZXJuZWwgaXMgYWxpZ25lZCB0byAyTUIgYWRkcmVzcy4gQ2F0Y2hpbmcgaXQgYXQgY29tcGlsZQotICogdGltZSBpcyBiZXR0ZXIuIENoYW5nZSB5b3VyIGNvbmZpZyBmaWxlIGFuZCBjb21waWxlIHRoZSBrZXJuZWwKLSAqIGZvciBhIDJNQiBhbGlnbmVkIGFkZHJlc3MgKENPTkZJR19QSFlTSUNBTF9TVEFSVCkKLSAqLwotI2lmIChDT05GSUdfUEhZU0lDQUxfU1RBUlQgJSBfX0tFUk5FTF9BTElHTikgIT0gMAotI2Vycm9yICJDT05GSUdfUEhZU0lDQUxfU1RBUlQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDJNQiIKLSNlbmRpZgorI2RlZmluZSBfX1BIWVNJQ0FMX1NUQVJUCSgoQ09ORklHX1BIWVNJQ0FMX1NUQVJUICsJIAlcCisJCQkJICAoQ09ORklHX1BIWVNJQ0FMX0FMSUdOIC0gMSkpICYJXAorCQkJCSB+KENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKQogCiAjZGVmaW5lIF9fU1RBUlRfS0VSTkVMCQkoX19TVEFSVF9LRVJORUxfbWFwICsgX19QSFlTSUNBTF9TVEFSVCkKICNkZWZpbmUgX19TVEFSVF9LRVJORUxfbWFwCV9BQygweGZmZmZmZmZmODAwMDAwMDAsIFVMKQogCi0vKiBTZWUgRG9jdW1lbnRhdGlvbi94ODZfNjQvbW0udHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtZW1vcnkgbWFwLiAqLworLyogU2VlIERvY3VtZW50YXRpb24veDg2L3g4Nl82NC9tbS50eHQgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIG1lbW9yeSBtYXAuICovCiAjZGVmaW5lIF9fUEhZU0lDQUxfTUFTS19TSElGVAk0NgogI2RlZmluZSBfX1ZJUlRVQUxfTUFTS19TSElGVAk0OAogCkBAIC03MSwxMiArNjMsNiBAQAogCiAjZGVmaW5lIHZtZW1tYXAgKChzdHJ1Y3QgcGFnZSAqKVZNRU1NQVBfU1RBUlQpCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGluaXRfbWVtb3J5X21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgZW5kKTsKLQotZXh0ZXJuIHZvaWQgaW5pdG1lbV9pbml0KHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pOwotZXh0ZXJuIHZvaWQgZnJlZV9pbml0bWVtKHZvaWQpOwotCiBleHRlcm4gdm9pZCBpbml0X2V4dHJhX21hcHBpbmdfdWModW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgaW5pdF9leHRyYV9tYXBwaW5nX3diKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV90eXBlcy5oCmluZGV4IDgyNmFkMzcuLjY0NzNmNWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYWdlX3R5cGVzLmgKQEAgLTQ2LDYgKzQ2LDEyIEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfbG93X3Bmbl9tYXBwZWQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfcGZuX21hcHBlZDsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW5pdF9tZW1vcnlfbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgdW5zaWduZWQgbG9uZyBlbmQpOworCitleHRlcm4gdm9pZCBpbml0bWVtX2luaXQodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CitleHRlcm4gdm9pZCBmcmVlX2luaXRtZW0odm9pZCk7CisKICNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCiAKICNlbmRpZgkvKiBfQVNNX1g4Nl9QQUdFX0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKaW5kZXggYTUzZGEwMC4uNGZiMzdjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCkBAIC01Niw2ICs1Niw3IEBACiBzdHJ1Y3QgdHNzX3N0cnVjdDsKIHN0cnVjdCBtbV9zdHJ1Y3Q7CiBzdHJ1Y3QgZGVzY19zdHJ1Y3Q7CitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiAKIC8qCiAgKiBXcmFwcGVyIHR5cGUgZm9yIHBvaW50ZXJzIHRvIGNvZGUgd2hpY2ggdXNlcyB0aGUgbm9uLXN0YW5kYXJkCkBAIC0yMDMsNyArMjA0LDggQEAKIAogCXZvaWQgKCpzd2FwZ3MpKHZvaWQpOwogCi0Jc3RydWN0IHB2X2xhenlfb3BzIGxhenlfbW9kZTsKKwl2b2lkICgqc3RhcnRfY29udGV4dF9zd2l0Y2gpKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldik7CisJdm9pZCAoKmVuZF9jb250ZXh0X3N3aXRjaCkoc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KTsKIH07CiAKIHN0cnVjdCBwdl9pcnFfb3BzIHsKQEAgLTEzOTksMjUgKzE0MDEsMjMgQEAKIH07CiAKIGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIHBhcmF2aXJ0X2dldF9sYXp5X21vZGUodm9pZCk7Ci12b2lkIHBhcmF2aXJ0X2VudGVyX2xhenlfY3B1KHZvaWQpOwotdm9pZCBwYXJhdmlydF9sZWF2ZV9sYXp5X2NwdSh2b2lkKTsKK3ZvaWQgcGFyYXZpcnRfc3RhcnRfY29udGV4dF9zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KTsKK3ZvaWQgcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CisKIHZvaWQgcGFyYXZpcnRfZW50ZXJfbGF6eV9tbXUodm9pZCk7CiB2b2lkIHBhcmF2aXJ0X2xlYXZlX2xhenlfbW11KHZvaWQpOwotdm9pZCBwYXJhdmlydF9sZWF2ZV9sYXp5KGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpOwogCi0jZGVmaW5lICBfX0hBVkVfQVJDSF9FTlRFUl9MQVpZX0NQVV9NT0RFCi1zdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9lbnRlcl9sYXp5X2NwdV9tb2RlKHZvaWQpCisjZGVmaW5lICBfX0hBVkVfQVJDSF9TVEFSVF9DT05URVhUX1NXSVRDSAorc3RhdGljIGlubGluZSB2b2lkIGFyY2hfc3RhcnRfY29udGV4dF9zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewotCVBWT1BfVkNBTEwwKHB2X2NwdV9vcHMubGF6eV9tb2RlLmVudGVyKTsKKwlQVk9QX1ZDQUxMMShwdl9jcHVfb3BzLnN0YXJ0X2NvbnRleHRfc3dpdGNoLCBwcmV2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfbGVhdmVfbGF6eV9jcHVfbW9kZSh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZW5kX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlQVk9QX1ZDQUxMMChwdl9jcHVfb3BzLmxhenlfbW9kZS5sZWF2ZSk7CisJUFZPUF9WQ0FMTDEocHZfY3B1X29wcy5lbmRfY29udGV4dF9zd2l0Y2gsIG5leHQpOwogfQogCi12b2lkIGFyY2hfZmx1c2hfbGF6eV9jcHVfbW9kZSh2b2lkKTsKLQogI2RlZmluZSAgX19IQVZFX0FSQ0hfRU5URVJfTEFaWV9NTVVfTU9ERQogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9jb3VudGVyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2NvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzZlZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9jb3VudGVyLmgKQEAgLTAsMCArMSwxMDAgQEAKKyNpZm5kZWYgX0FTTV9YODZfUEVSRl9DT1VOVEVSX0gKKyNkZWZpbmUgX0FTTV9YODZfUEVSRl9DT1VOVEVSX0gKKworLyoKKyAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgaHcgZGV0YWlsczoKKyAqLworCisjZGVmaW5lIFg4Nl9QTUNfTUFYX0dFTkVSSUMJCQkJCTgKKyNkZWZpbmUgWDg2X1BNQ19NQVhfRklYRUQJCQkJCTMKKworI2RlZmluZSBYODZfUE1DX0lEWF9HRU5FUklDCQkJCSAgICAgICAgMAorI2RlZmluZSBYODZfUE1DX0lEWF9GSVhFRAkJCQkgICAgICAgMzIKKyNkZWZpbmUgWDg2X1BNQ19JRFhfTUFYCQkJCQkgICAgICAgNjQKKworI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwCQkJICAgICAgMHhjMQorI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIxCQkJICAgICAgMHhjMgorCisjZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwCQkJICAgICAweDE4NgorI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMQkJCSAgICAgMHgxODcKKworI2RlZmluZSBBUkNIX1BFUkZNT05fRVZFTlRTRUwwX0VOQUJMRQkJCSAgKDEgPDwgMjIpCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9JTlQJCQkgICgxIDw8IDIwKQorI2RlZmluZSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfT1MJCQkgICgxIDw8IDE3KQorI2RlZmluZSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfVVNSCQkJICAoMSA8PCAxNikKKworLyoKKyAqIEluY2x1ZGVzIGV2ZW50c2VsIGFuZCB1bml0IG1hc2sgYXMgd2VsbDoKKyAqLworI2RlZmluZSBBUkNIX1BFUkZNT05fRVZFTlRfTUFTSwkJCQkgICAgMHhmZmZmCisKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1NFTAkJICAgICAgMHgzYworI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfVU1BU0sJCSgweDAwIDw8IDgpCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19JTkRFWCAJCSAwCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19QUkVTRU5UIFwKKwkJKDEgPDwgKEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19JTkRFWCkpCisKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0JSQU5DSF9NSVNTRVNfUkVUSVJFRAkJCSA2CisKKy8qCisgKiBJbnRlbCAiQXJjaGl0ZWN0dXJhbCBQZXJmb3JtYW5jZSBNb25pdG9yaW5nIiBDUFVJRAorICogZGV0ZWN0aW9uL2VudW1lcmF0aW9uIGRldGFpbHM6CisgKi8KK3VuaW9uIGNwdWlkMTBfZWF4IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZDo4OworCQl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOjg7CisJCXVuc2lnbmVkIGludCBiaXRfd2lkdGg6ODsKKwkJdW5zaWduZWQgaW50IG1hc2tfbGVuZ3RoOjg7CisJfSBzcGxpdDsKKwl1bnNpZ25lZCBpbnQgZnVsbDsKK307CisKK3VuaW9uIGNwdWlkMTBfZWR4IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzX2ZpeGVkOjQ7CisJCXVuc2lnbmVkIGludCByZXNlcnZlZDoyODsKKwl9IHNwbGl0OworCXVuc2lnbmVkIGludCBmdWxsOworfTsKKworCisvKgorICogRml4ZWQtcHVycG9zZSBwZXJmb3JtYW5jZSBjb3VudGVyczoKKyAqLworCisvKgorICogQWxsIDMgZml4ZWQtbW9kZSBQTUNzIGFyZSBjb25maWd1cmVkIHZpYSB0aGlzIHNpbmdsZSBNU1I6CisgKi8KKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFJfQ1RSTAkJCTB4MzhkCisKKy8qCisgKiBUaGUgY291bnRzIGFyZSBhdmFpbGFibGUgaW4gdGhyZWUgc2VwYXJhdGUgTVNSczoKKyAqLworCisvKiBJbnN0cl9SZXRpcmVkLkFueTogKi8KKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFIwCQkJMHgzMDkKKyNkZWZpbmUgWDg2X1BNQ19JRFhfRklYRURfSU5TVFJVQ1RJT05TCQkJKFg4Nl9QTUNfSURYX0ZJWEVEICsgMCkKKworLyogQ1BVX0NMS19VbmhhbHRlZC5Db3JlOiAqLworI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUjEJCQkweDMwYQorI2RlZmluZSBYODZfUE1DX0lEWF9GSVhFRF9DUFVfQ1lDTEVTCQkJKFg4Nl9QTUNfSURYX0ZJWEVEICsgMSkKKworLyogQ1BVX0NMS19VbmhhbHRlZC5SZWY6ICovCisjZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSMgkJCTB4MzBiCisjZGVmaW5lIFg4Nl9QTUNfSURYX0ZJWEVEX0JVU19DWUNMRVMJCQkoWDg2X1BNQ19JRFhfRklYRUQgKyAyKQorCitleHRlcm4gdm9pZCBzZXRfcGVyZl9jb3VudGVyX3BlbmRpbmcodm9pZCk7CisKKyNkZWZpbmUgY2xlYXJfcGVyZl9jb3VudGVyX3BlbmRpbmcoKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHRlc3RfcGVyZl9jb3VudGVyX3BlbmRpbmcoKQkoMCkKKworI2lmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCitleHRlcm4gdm9pZCBpbml0X2h3X3BlcmZfY291bnRlcnModm9pZCk7CitleHRlcm4gdm9pZCBwZXJmX2NvdW50ZXJzX2xhcGljX2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGluaXRfaHdfcGVyZl9jb3VudGVycyh2b2lkKQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9jb3VudGVyc19sYXBpY19pbml0KHZvaWQpCXsgfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9QRVJGX0NPVU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IDI5ZDk2ZDEuLjE4ZWY3ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTgxLDYgKzgxLDggQEAKICNkZWZpbmUgcHRlX3ZhbCh4KQluYXRpdmVfcHRlX3ZhbCh4KQogI2RlZmluZSBfX3B0ZSh4KQluYXRpdmVfbWFrZV9wdGUoeCkKIAorI2RlZmluZSBhcmNoX2VuZF9jb250ZXh0X3N3aXRjaChwcmV2KQlkbyB7fSB3aGlsZSgwKQorCiAjZW5kaWYJLyogQ09ORklHX1BBUkFWSVJUICovCiAKIC8qCkBAIC01MDMsNiArNTA1LDggQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAorZXh0ZXJuIGludCBkaXJlY3RfZ2JwYWdlczsKKwogLyogbG9jYWwgcHRlIHVwZGF0ZXMgbmVlZCBub3QgdXNlIHhjaGcgZm9yIGxvY2tpbmcgKi8KIHN0YXRpYyBpbmxpbmUgcHRlX3QgbmF0aXZlX2xvY2FsX3B0ZXBfZ2V0X2FuZF9jbGVhcihwdGVfdCAqcHRlcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaAppbmRleCA2Yjg3YmM2Li5hYmRlMzA4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCkBAIC0yNSwxMCArMjUsNiBAQAogCiBleHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKIAotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLQogI2RlZmluZSBwdGVfRVJST1IoZSkJCQkJCVwKIAlwcmludGsoIiVzOiVkOiBiYWQgcHRlICVwKCUwMTZseCkuXG4iLAkJXAogCSAgICAgICBfX0ZJTEVfXywgX19MSU5FX18sICYoZSksIHB0ZV92YWwoZSkpCkBAIC0xMzUsOCArMTMxLDYgQEAKIAogI2RlZmluZSB1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgcHRlKSBkbyB7IH0gd2hpbGUgKDApCiAKLWV4dGVybiBpbnQgZGlyZWN0X2dicGFnZXM7Ci0KIC8qIEVuY29kZSBhbmQgZGUtY29kZSBhIHN3YXAgZW50cnkgKi8KICNpZiBfUEFHRV9CSVRfRklMRSA8IF9QQUdFX0JJVF9QUk9UTk9ORQogI2RlZmluZSBTV1BfVFlQRV9CSVRTIChfUEFHRV9CSVRfRklMRSAtIF9QQUdFX0JJVF9QUkVTRU5UIC0gMSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaAppbmRleCBmYmY0MmI4Li43NjZlYTE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0X3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NF90eXBlcy5oCkBAIC01MSwxMSArNTEsMTEgQEAKICNkZWZpbmUgUEdESVJfU0laRQkoX0FDKDEsIFVMKSA8PCBQR0RJUl9TSElGVCkKICNkZWZpbmUgUEdESVJfTUFTSwkofihQR0RJUl9TSVpFIC0gMSkpCiAKLQorLyogU2VlIERvY3VtZW50YXRpb24veDg2L3g4Nl82NC9tbS50eHQgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIG1lbW9yeSBtYXAuICovCiAjZGVmaW5lIE1BWE1FTQkJIF9BQyhfX0FDKDEsIFVMKSA8PCBNQVhfUEhZU01FTV9CSVRTLCBVTCkKLSNkZWZpbmUgVk1BTExPQ19TVEFSVCAgICBfQUMoMHhmZmZmYzIwMDAwMDAwMDAwLCBVTCkKLSNkZWZpbmUgVk1BTExPQ19FTkQgICAgICBfQUMoMHhmZmZmZTFmZmZmZmZmZmZmLCBVTCkKLSNkZWZpbmUgVk1FTU1BUF9TVEFSVAkgX0FDKDB4ZmZmZmUyMDAwMDAwMDAwMCwgVUwpCisjZGVmaW5lIFZNQUxMT0NfU1RBUlQgICAgX0FDKDB4ZmZmZmM5MDAwMDAwMDAwMCwgVUwpCisjZGVmaW5lIFZNQUxMT0NfRU5EICAgICAgX0FDKDB4ZmZmZmU4ZmZmZmZmZmZmZiwgVUwpCisjZGVmaW5lIFZNRU1NQVBfU1RBUlQJIF9BQygweGZmZmZlYTAwMDAwMDAwMDAsIFVMKQogI2RlZmluZSBNT0RVTEVTX1ZBRERSICAgIF9BQygweGZmZmZmZmZmYTAwMDAwMDAsIFVMKQogI2RlZmluZSBNT0RVTEVTX0VORCAgICAgIF9BQygweGZmZmZmZmZmZmYwMDAwMDAsIFVMKQogI2RlZmluZSBNT0RVTEVTX0xFTiAgIChNT0RVTEVTX0VORCAtIE1PRFVMRVNfVkFERFIpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKaW5kZXggYjgyMzhkYy4uNGQyNThhZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaApAQCAtMjczLDcgKzI3Myw2IEBACiAKIGV4dGVybiBwdGV2YWxfdCBfX3N1cHBvcnRlZF9wdGVfbWFzazsKIGV4dGVybiBpbnQgbnhfZW5hYmxlZDsKLWV4dGVybiB2b2lkIHNldF9ueCh2b2lkKTsKIAogI2RlZmluZSBwZ3Byb3Rfd3JpdGVjb21iaW5lCXBncHJvdF93cml0ZWNvbWJpbmUKIGV4dGVybiBwZ3Byb3RfdCBwZ3Byb3Rfd3JpdGVjb21iaW5lKHBncHJvdF90IHByb3QpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBjMmNjZWFlLi5jNzc2ODI2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTM1LDcgKzEzNSw4IEBACiBleHRlcm4gc3RydWN0IGNwdWluZm9feDg2CW5ld19jcHVfZGF0YTsKIAogZXh0ZXJuIHN0cnVjdCB0c3Nfc3RydWN0CWRvdWJsZWZhdWx0X3RzczsKLWV4dGVybiBfX3UzMgkJCWNsZWFyZWRfY3B1X2NhcHNbTkNBUElOVFNdOworZXh0ZXJuIF9fdTMyCQkJY3B1X2NhcHNfY2xlYXJlZFtOQ0FQSU5UU107CitleHRlcm4gX191MzIJCQljcHVfY2Fwc19zZXRbTkNBUElOVFNdOwogCiAjaWZkZWYgQ09ORklHX1NNUAogREVDTEFSRV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBjcHVpbmZvX3g4NiwgY3B1X2luZm8pOwpAQCAtNDA5LDkgKzQxMCw2IEBACiBleHRlcm4gdW5zaWduZWQgaW50IHhzdGF0ZV9zaXplOwogZXh0ZXJuIHZvaWQgZnJlZV90aHJlYWRfeHN0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqdGFza194c3RhdGVfY2FjaGVwOwotZXh0ZXJuIHZvaWQgaW5pdF9zY2F0dGVyZWRfY3B1aWRfZmVhdHVyZXMoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgaW5pdF9pbnRlbF9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBudW1fY2FjaGVfbGVhdmVzOwogCiBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CiAJLyogQ2FjaGVkIFRMUyBkZXNjcmlwdG9yczogKi8KQEAgLTQyNyw4ICs0MjUsMTIgQEAKIAl1bnNpZ25lZCBzaG9ydAkJZnNpbmRleDsKIAl1bnNpZ25lZCBzaG9ydAkJZ3NpbmRleDsKICNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfMzIKIAl1bnNpZ25lZCBsb25nCQlpcDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19YODZfNjQKIAl1bnNpZ25lZCBsb25nCQlmczsKKyNlbmRpZgogCXVuc2lnbmVkIGxvbmcJCWdzOwogCS8qIEhhcmR3YXJlIGRlYnVnZ2luZyByZWdpc3RlcnM6ICovCiAJdW5zaWduZWQgbG9uZwkJZGVidWdyZWcwOwpAQCAtNDYwLDE0ICs0NjIsOCBAQAogCXVuc2lnbmVkCQlpb19iaXRtYXBfbWF4OwogLyogTVNSX0lBMzJfREVCVUdDVExNU1IgdmFsdWUgdG8gc3dpdGNoIGluIGlmIFRJRl9ERUJVR0NUTE1TUiBpcyBzZXQuICAqLwogCXVuc2lnbmVkIGxvbmcJZGVidWdjdGxtc3I7Ci0jaWZkZWYgQ09ORklHX1g4Nl9EUwotLyogRGVidWcgU3RvcmUgY29udGV4dDsgc2VlIGluY2x1ZGUvYXNtLXg4Ni9kcy5oOyBnb2VzIGludG8gTVNSX0lBMzJfRFNfQVJFQSAqLworCS8qIERlYnVnIFN0b3JlIGNvbnRleHQ7IHNlZSBhc20vZHMuaCAqLwogCXN0cnVjdCBkc19jb250ZXh0CSpkc19jdHg7Ci0jZW5kaWYgLyogQ09ORklHX1g4Nl9EUyAqLwotI2lmZGVmIENPTkZJR19YODZfUFRSQUNFX0JUUwotLyogdGhlIHNpZ25hbCB0byBzZW5kIG9uIGEgYnRzIGJ1ZmZlciBvdmVyZmxvdyAqLwotCXVuc2lnbmVkIGludAlidHNfb3ZmbF9zaWduYWw7Ci0jZW5kaWYgLyogQ09ORklHX1g4Nl9QVFJBQ0VfQlRTICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbmF0aXZlX2dldF9kZWJ1Z3JlZyhpbnQgcmVnbm8pCkBAIC03OTUsNiArNzkxLDIxIEBACiAgICAgcmV0dXJuIGRlYnVnY3RsbXNyOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2RlYnVnY3RsbXNyX29uX2NwdShpbnQgY3B1KQoreworCXU2NCBkZWJ1Z2N0bG1zciA9IDA7CisJdTMyIHZhbDEsIHZhbDI7CisKKyNpZm5kZWYgQ09ORklHX1g4Nl9ERUJVR0NUTE1TUgorCWlmIChib290X2NwdV9kYXRhLng4NiA8IDYpCisJCXJldHVybiAwOworI2VuZGlmCisJcmRtc3Jfb25fY3B1KGNwdSwgTVNSX0lBMzJfREVCVUdDVExNU1IsICZ2YWwxLCAmdmFsMik7CisJZGVidWdjdGxtc3IgPSB2YWwxIHwgKCh1NjQpdmFsMiA8PCAzMik7CisKKwlyZXR1cm4gZGVidWdjdGxtc3I7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfZGVidWdjdGxtc3IodW5zaWduZWQgbG9uZyBkZWJ1Z2N0bG1zcikKIHsKICNpZm5kZWYgQ09ORklHX1g4Nl9ERUJVR0NUTE1TUgpAQCAtODA0LDYgKzgxNSwxOCBAQAogCXdybXNybChNU1JfSUEzMl9ERUJVR0NUTE1TUiwgZGVidWdjdGxtc3IpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2RlYnVnY3RsbXNyX29uX2NwdShpbnQgY3B1LAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZGVidWdjdGxtc3IpCit7CisjaWZuZGVmIENPTkZJR19YODZfREVCVUdDVExNU1IKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPCA2KQorCQlyZXR1cm47CisjZW5kaWYKKwl3cm1zcl9vbl9jcHUoY3B1LCBNU1JfSUEzMl9ERUJVR0NUTE1TUiwKKwkJICAgICAodTMyKSgodTY0KWRlYnVnY3RsbXNyKSwKKwkJICAgICAodTMyKSgodTY0KWRlYnVnY3RsbXNyID4+IDMyKSk7Cit9CisKIC8qCiAgKiBmcm9tIHN5c3RlbSBkZXNjcmlwdGlvbiB0YWJsZSBpbiBCSU9TLiBNb3N0bHkgZm9yIE1DQSB1c2UsIGJ1dAogICogb3RoZXJzIG1heSBmaW5kIGl0IHVzZWZ1bDoKQEAgLTgxNCw2ICs4MzcsNyBAQAogCiAvKiBCb290IGxvYWRlciB0eXBlIGZyb20gdGhlIHNldHVwIGhlYWRlcjogKi8KIGV4dGVybiBpbnQJCQlib290bG9hZGVyX3R5cGU7CitleHRlcm4gaW50CQkJYm9vdGxvYWRlcl92ZXJzaW9uOwogCiBleHRlcm4gY2hhcgkJCWlnbm9yZV9mcHVfaXJxOwogCkBAIC04NzQsNyArODk4LDYgQEAKIAkudm04Nl9pbmZvCQk9IE5VTEwsCQkJCQkgIFwKIAkuc3lzZW50ZXJfY3MJCT0gX19LRVJORUxfQ1MsCQkJCSAgXAogCS5pb19iaXRtYXBfcHRyCQk9IE5VTEwsCQkJCQkgIFwKLQkuZnMJCQk9IF9fS0VSTkVMX1BFUkNQVSwJCQkgIFwKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B0cmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggNjI0ZjEzMy4uMGYwZDkwOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHRyYWNlLmgKQEAgLTIzNiwxMiArMjM2LDExIEBACiBleHRlcm4gaW50IGRvX3NldF90aHJlYWRfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBpZHgsCiAJCQkgICAgICBzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqaW5mbywgaW50IGNhbl9hbGxvY2F0ZSk7CiAKLWV4dGVybiB2b2lkIHg4Nl9wdHJhY2VfdW50cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7Ci1leHRlcm4gdm9pZCB4ODZfcHRyYWNlX2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKLQkJCSAgICB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzKTsKKyNpZmRlZiBDT05GSUdfWDg2X1BUUkFDRV9CVFMKK2V4dGVybiB2b2lkIHB0cmFjZV9idHNfdW50cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKLSNkZWZpbmUgYXJjaF9wdHJhY2VfdW50cmFjZSh0c2spIHg4Nl9wdHJhY2VfdW50cmFjZSh0c2spCi0jZGVmaW5lIGFyY2hfcHRyYWNlX2ZvcmsoY2hpbGQsIGZsYWdzKSB4ODZfcHRyYWNlX2ZvcmsoY2hpbGQsIGZsYWdzKQorI2RlZmluZSBhcmNoX3B0cmFjZV91bnRyYWNlKHRzaykJcHRyYWNlX2J0c191bnRyYWNlKHRzaykKKyNlbmRpZiAvKiBDT05GSUdfWDg2X1BUUkFDRV9CVFMgKi8KIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVxdWlyZWQtZmVhdHVyZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3JlcXVpcmVkLWZlYXR1cmVzLmgKaW5kZXggYTQ3MzdkZC4uNjRjZjJkMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVxdWlyZWQtZmVhdHVyZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yZXF1aXJlZC1mZWF0dXJlcy5oCkBAIC00OCw5ICs0OCwxNSBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CisjaWZkZWYgQ09ORklHX1BBUkFWSVJUCisvKiBQYXJhdmlydHVhbGl6ZWQgc3lzdGVtcyBtYXkgbm90IGhhdmUgUFNFIG9yIFBHRSBhdmFpbGFibGUgKi8KICNkZWZpbmUgTkVFRF9QU0UJMAotI2RlZmluZSBORUVEX01TUgkoMTw8KFg4Nl9GRUFUVVJFX01TUiAmIDMxKSkKICNkZWZpbmUgTkVFRF9QR0UJMAorI2Vsc2UKKyNkZWZpbmUgTkVFRF9QU0UJKDE8PChYODZfRkVBVFVSRV9QU0UpICYgMzEpCisjZGVmaW5lIE5FRURfUEdFCSgxPDwoWDg2X0ZFQVRVUkVfUEdFKSAmIDMxKQorI2VuZGlmCisjZGVmaW5lIE5FRURfTVNSCSgxPDwoWDg2X0ZFQVRVUkVfTVNSICYgMzEpKQogI2RlZmluZSBORUVEX0ZYU1IJKDE8PChYODZfRkVBVFVSRV9GWFNSICYgMzEpKQogI2RlZmluZSBORUVEX1hNTQkoMTw8KFg4Nl9GRUFUVVJFX1hNTSAmIDMxKSkKICNkZWZpbmUgTkVFRF9YTU0yCSgxPDwoWDg2X0ZFQVRVUkVfWE1NMiAmIDMxKSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGJkYzJhZGEuLjQwOTNkMWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaApAQCAtMzMsNyArMzMsNiBAQAogCWludCAoKnNldHVwX2lvYXBpY19pZHMpKHZvaWQpOwogfTsKIAotZXh0ZXJuIHZvaWQgeDg2X3F1aXJrX3ByZV9pbnRyX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCB4ODZfcXVpcmtfaW50cl9pbml0KHZvaWQpOwogCiBleHRlcm4gdm9pZCB4ODZfcXVpcmtfdHJhcF9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCAxOWUwZDg4Li42YTg0ZWQxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMTgwLDcgKzE4MCw3IEBACiBzdGF0aWMgaW5saW5lIGludCBsb2dpY2FsX3NtcF9wcm9jZXNzb3JfaWQodm9pZCkKIHsKIAkvKiB3ZSBkb24ndCB3YW50IHRvIG1hcmsgdGhpcyBhY2Nlc3Mgdm9sYXRpbGUgLSBiYWQgY29kZSBnZW5lcmF0aW9uICovCi0JcmV0dXJuIEdFVF9BUElDX0xPR0lDQUxfSUQoKih1MzIgKikoQVBJQ19CQVNFICsgQVBJQ19MRFIpKTsKKwlyZXR1cm4gR0VUX0FQSUNfTE9HSUNBTF9JRChhcGljX3JlYWQoQVBJQ19MRFIpKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oCmluZGV4IGUzY2MzYzAuLjQ1MTdkNmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oCkBAIC0yNyw3ICsyNyw3IEBACiAjZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCiAjIGRlZmluZSBTRUNUSU9OX1NJWkVfQklUUwkyNyAvKiBtYXR0IC0gMTI4IGlzIGNvbnZlbmllbnQgcmlnaHQgbm93ICovCiAjIGRlZmluZSBNQVhfUEhZU0FERFJfQklUUwk0NAotIyBkZWZpbmUgTUFYX1BIWVNNRU1fQklUUwk0NCAvKiBDYW4gYmUgbWF4IDQ1IGJpdHMgKi8KKyMgZGVmaW5lIE1BWF9QSFlTTUVNX0JJVFMJNDYKICNlbmRpZgogCiAjZW5kaWYgLyogQ09ORklHX1NQQVJTRU1FTSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3ZtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdm0uaAppbmRleCA4MmFkYTc1Li44NTU3NGI3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdm0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zdm0uaApAQCAtMjI1LDYgKzIyNSw3IEBACiAjZGVmaW5lIFNWTV9FVlRJTkpfVkFMSURfRVJSICgxIDw8IDExKQogCiAjZGVmaW5lIFNWTV9FWElUSU5USU5GT19WRUNfTUFTSyBTVk1fRVZUSU5KX1ZFQ19NQVNLCisjZGVmaW5lIFNWTV9FWElUSU5USU5GT19UWVBFX01BU0sgU1ZNX0VWVElOSl9UWVBFX01BU0sKIAogI2RlZmluZQlTVk1fRVhJVElOVElORk9fVFlQRV9JTlRSIFNWTV9FVlRJTkpfVFlQRV9JTlRSCiAjZGVmaW5lCVNWTV9FWElUSU5USU5GT19UWVBFX05NSSBTVk1fRVZUSU5KX1RZUEVfTk1JCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxscy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzY2FsbHMuaAppbmRleCA3MDQzNDA4Li4zNzJiNzZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogc3lzY2FsbHMuaCAtIExpbnV4IHN5c2NhbGwgaW50ZXJmYWNlcyAoYXJjaC1zcGVjaWZpYykKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSmFzd2luZGVyIFNpbmdoCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSmFzd2luZGVyIFNpbmdoIFJhanB1dAogICoKICAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMdjIuCiAgKiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgpAQCAtMTIsNTAgKzEyLDU1IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qIENvbW1vbiBpbiBYODZfMzIgYW5kIFg4Nl82NCAqLwogLyoga2VybmVsL2lvcG9ydC5jICovCiBhc21saW5rYWdlIGxvbmcgc3lzX2lvcGVybSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCBpbnQpOwogCisvKiBrZXJuZWwvcHJvY2Vzcy5jICovCitpbnQgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MgKik7CitpbnQgc3lzX3Zmb3JrKHN0cnVjdCBwdF9yZWdzICopOworCiAvKiBrZXJuZWwvbGR0LmMgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19tb2RpZnlfbGR0KGludCwgdm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgbG9uZyk7CiAKKy8qIGtlcm5lbC9zaWduYWwuYyAqLworbG9uZyBzeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICopOworCiAvKiBrZXJuZWwvdGxzLmMgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19zZXRfdGhyZWFkX2FyZWEoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKik7CiBhc21saW5rYWdlIGludCBzeXNfZ2V0X3RocmVhZF9hcmVhKHN0cnVjdCB1c2VyX2Rlc2MgX191c2VyICopOwogCiAvKiBYODZfMzIgb25seSAqLwogI2lmZGVmIENPTkZJR19YODZfMzIKKy8qIGtlcm5lbC9pb3BvcnQuYyAqLworbG9uZyBzeXNfaW9wbChzdHJ1Y3QgcHRfcmVncyAqKTsKKwogLyoga2VybmVsL3Byb2Nlc3NfMzIuYyAqLwotaW50IHN5c19mb3JrKHN0cnVjdCBwdF9yZWdzICopOwogaW50IHN5c19jbG9uZShzdHJ1Y3QgcHRfcmVncyAqKTsKLWludCBzeXNfdmZvcmsoc3RydWN0IHB0X3JlZ3MgKik7CiBpbnQgc3lzX2V4ZWN2ZShzdHJ1Y3QgcHRfcmVncyAqKTsKIAotLyoga2VybmVsL3NpZ25hbF8zMi5jICovCisvKiBrZXJuZWwvc2lnbmFsLmMgKi8KIGFzbWxpbmthZ2UgaW50IHN5c19zaWdzdXNwZW5kKGludCwgaW50LCBvbGRfc2lnc2V0X3QpOwogYXNtbGlua2FnZSBpbnQgc3lzX3NpZ2FjdGlvbihpbnQsIGNvbnN0IHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqLAogCQkJICAgICBzdHJ1Y3Qgb2xkX3NpZ2FjdGlvbiBfX3VzZXIgKik7CiBpbnQgc3lzX3NpZ2FsdHN0YWNrKHN0cnVjdCBwdF9yZWdzICopOwogdW5zaWduZWQgbG9uZyBzeXNfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICopOwotbG9uZyBzeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICopOwotCi0vKiBrZXJuZWwvaW9wb3J0LmMgKi8KLWxvbmcgc3lzX2lvcGwoc3RydWN0IHB0X3JlZ3MgKik7CiAKIC8qIGtlcm5lbC9zeXNfaTM4Nl8zMi5jICovCitzdHJ1Y3QgbW1hcF9hcmdfc3RydWN0Oworc3RydWN0IHNlbF9hcmdfc3RydWN0Oworc3RydWN0IG9sZG9sZF91dHNuYW1lOworc3RydWN0IG9sZF91dHNuYW1lOworCiBhc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCiAJCQkgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotc3RydWN0IG1tYXBfYXJnX3N0cnVjdDsKIGFzbWxpbmthZ2UgaW50IG9sZF9tbWFwKHN0cnVjdCBtbWFwX2FyZ19zdHJ1Y3QgX191c2VyICopOwotc3RydWN0IHNlbF9hcmdfc3RydWN0OwogYXNtbGlua2FnZSBpbnQgb2xkX3NlbGVjdChzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3QgX191c2VyICopOwogYXNtbGlua2FnZSBpbnQgc3lzX2lwYyh1aW50LCBpbnQsIGludCwgaW50LCB2b2lkIF9fdXNlciAqLCBsb25nKTsKLXN0cnVjdCBvbGRfdXRzbmFtZTsKIGFzbWxpbmthZ2UgaW50IHN5c191bmFtZShzdHJ1Y3Qgb2xkX3V0c25hbWUgX191c2VyICopOwotc3RydWN0IG9sZG9sZF91dHNuYW1lOwogYXNtbGlua2FnZSBpbnQgc3lzX29sZHVuYW1lKHN0cnVjdCBvbGRvbGRfdXRzbmFtZSBfX3VzZXIgKik7CiAKIC8qIGtlcm5lbC92bTg2XzMyLmMgKi8KQEAgLTY1LDI5ICs3MCwyNyBAQAogI2Vsc2UgLyogQ09ORklHX1g4Nl8zMiAqLwogCiAvKiBYODZfNjQgb25seSAqLworLyoga2VybmVsL2lvcG9ydC5jICovCithc21saW5rYWdlIGxvbmcgc3lzX2lvcGwodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKKwogLyoga2VybmVsL3Byb2Nlc3NfNjQuYyAqLwotYXNtbGlua2FnZSBsb25nIHN5c19mb3JrKHN0cnVjdCBwdF9yZWdzICopOwogYXNtbGlua2FnZSBsb25nIHN5c19jbG9uZSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAogCQkJICB2b2lkIF9fdXNlciAqLCB2b2lkIF9fdXNlciAqLAogCQkJICBzdHJ1Y3QgcHRfcmVncyAqKTsKLWFzbWxpbmthZ2UgbG9uZyBzeXNfdmZvcmsoc3RydWN0IHB0X3JlZ3MgKik7CiBhc21saW5rYWdlIGxvbmcgc3lzX2V4ZWN2ZShjaGFyIF9fdXNlciAqLCBjaGFyIF9fdXNlciAqIF9fdXNlciAqLAogCQkJICAgY2hhciBfX3VzZXIgKiBfX3VzZXIgKiwKIAkJCSAgIHN0cnVjdCBwdF9yZWdzICopOwogbG9uZyBzeXNfYXJjaF9wcmN0bChpbnQsIHVuc2lnbmVkIGxvbmcpOwogCi0vKiBrZXJuZWwvaW9wb3J0LmMgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfaW9wbCh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopOwotCi0vKiBrZXJuZWwvc2lnbmFsXzY0LmMgKi8KKy8qIGtlcm5lbC9zaWduYWwuYyAqLwogYXNtbGlua2FnZSBsb25nIHN5c19zaWdhbHRzdGFjayhjb25zdCBzdGFja190IF9fdXNlciAqLCBzdGFja190IF9fdXNlciAqLAogCQkJCXN0cnVjdCBwdF9yZWdzICopOwotbG9uZyBzeXNfcnRfc2lncmV0dXJuKHN0cnVjdCBwdF9yZWdzICopOwogCiAvKiBrZXJuZWwvc3lzX3g4Nl82NC5jICovCitzdHJ1Y3QgbmV3X3V0c25hbWU7CisKIGFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAogCQkJIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotc3RydWN0IG5ld191dHNuYW1lOwogYXNtbGlua2FnZSBsb25nIHN5c191bmFtZShzdHJ1Y3QgbmV3X3V0c25hbWUgX191c2VyICopOwogCiAjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGVybWlvcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGVybWlvcy5oCmluZGV4IGY3Mjk1NjMuLmM0ZWU4MDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Rlcm1pb3MuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKQEAgLTY3LDYgKzY3LDcgQEAKIAlTRVRfTE9XX1RFUk1JT1NfQklUUyh0ZXJtaW9zLCB0ZXJtaW8sIGNfb2ZsYWcpOwogCVNFVF9MT1dfVEVSTUlPU19CSVRTKHRlcm1pb3MsIHRlcm1pbywgY19jZmxhZyk7CiAJU0VUX0xPV19URVJNSU9TX0JJVFModGVybWlvcywgdGVybWlvLCBjX2xmbGFnKTsKKwlnZXRfdXNlcih0ZXJtaW9zLT5jX2xpbmUsICZ0ZXJtaW8tPmNfbGluZSk7CiAJcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRlcm1pb3MtPmNfY2MsIHRlcm1pby0+Y19jYywgTkNDKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggODgyMGE3My4uNjAyYzc2OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC05NCw3ICs5NCw4IEBACiAjZGVmaW5lIFRJRl9GT1JDRURfVEYJCTI0CS8qIHRydWUgaWYgVEYgaW4gZWZsYWdzIGFydGlmaWNpYWxseSAqLwogI2RlZmluZSBUSUZfREVCVUdDVExNU1IJCTI1CS8qIHVzZXMgdGhyZWFkX3N0cnVjdC5kZWJ1Z2N0bG1zciAqLwogI2RlZmluZSBUSUZfRFNfQVJFQV9NU1IJCTI2ICAgICAgLyogdXNlcyB0aHJlYWRfc3RydWN0LmRzX2FyZWFfbXNyICovCi0jZGVmaW5lIFRJRl9TWVNDQUxMX0ZUUkFDRQkyNwkvKiBmb3IgZnRyYWNlIHN5c2NhbGwgaW5zdHJ1bWVudGF0aW9uICovCisjZGVmaW5lIFRJRl9MQVpZX01NVV9VUERBVEVTCTI3CS8qIHRhc2sgaXMgdXBkYXRpbmcgdGhlIG1tdSBsYXppbHkgKi8KKyNkZWZpbmUgVElGX1NZU0NBTExfRlRSQUNFCTI4CS8qIGZvciBmdHJhY2Ugc3lzY2FsbCBpbnN0cnVtZW50YXRpb24gKi8KIAogI2RlZmluZSBfVElGX1NZU0NBTExfVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMSA8PCBUSUZfTk9USUZZX1JFU1VNRSkKQEAgLTExNiw2ICsxMTcsNyBAQAogI2RlZmluZSBfVElGX0ZPUkNFRF9URgkJKDEgPDwgVElGX0ZPUkNFRF9URikKICNkZWZpbmUgX1RJRl9ERUJVR0NUTE1TUgkoMSA8PCBUSUZfREVCVUdDVExNU1IpCiAjZGVmaW5lIF9USUZfRFNfQVJFQV9NU1IJKDEgPDwgVElGX0RTX0FSRUFfTVNSKQorI2RlZmluZSBfVElGX0xBWllfTU1VX1VQREFURVMJKDEgPDwgVElGX0xBWllfTU1VX1VQREFURVMpCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9GVFJBQ0UJKDEgPDwgVElGX1NZU0NBTExfRlRSQUNFKQogCiAvKiB3b3JrIHRvIGRvIGluIHN5c2NhbGxfdHJhY2VfZW50ZXIoKSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGxiZmx1c2guaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggMTZhNWM4NC4uYTVlY2M5YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdGxiZmx1c2guaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCkBAIC0xNyw3ICsxNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX25hdGl2ZV9mbHVzaF90bGIodm9pZCkKIHsKLQl3cml0ZV9jcjMocmVhZF9jcjMoKSk7CisJbmF0aXZlX3dyaXRlX2NyMyhuYXRpdmVfcmVhZF9jcjMoKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX25hdGl2ZV9mbHVzaF90bGJfZ2xvYmFsKHZvaWQpCkBAIC0zMiwxMSArMzIsMTEgQEAKIAkgKi8KIAlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCi0JY3I0ID0gcmVhZF9jcjQoKTsKKwljcjQgPSBuYXRpdmVfcmVhZF9jcjQoKTsKIAkvKiBjbGVhciBQR0UgKi8KLQl3cml0ZV9jcjQoY3I0ICYgflg4Nl9DUjRfUEdFKTsKKwluYXRpdmVfd3JpdGVfY3I0KGNyNCAmIH5YODZfQ1I0X1BHRSk7CiAJLyogd3JpdGUgb2xkIFBHRSBhZ2FpbiBhbmQgZmx1c2ggVExCcyAqLwotCXdyaXRlX2NyNChjcjQpOworCW5hdGl2ZV93cml0ZV9jcjQoY3I0KTsKIAogCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCBmNDRiNDlhLi4wNjZlZjU5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTIwMyw3ICsyMDMsOCBAQAogdm9pZCB4ODZfcGNpX3Jvb3RfYnVzX3Jlc19xdWlya3Moc3RydWN0IHBjaV9idXMgKmIpOwogCiAjaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBtY19jYXBhYmxlKCkJKGNwdW1hc2tfd2VpZ2h0KGNwdV9jb3JlX21hc2soMCkpICE9IG5yX2NwdV9pZHMpCisjZGVmaW5lIG1jX2NhcGFibGUoKQkoKGJvb3RfY3B1X2RhdGEueDg2X21heF9jb3JlcyA+IDEpICYmIFwKKwkJCShjcHVtYXNrX3dlaWdodChjcHVfY29yZV9tYXNrKDApKSAhPSBucl9jcHVfaWRzKSkKICNkZWZpbmUgc210X2NhcGFibGUoKQkJCShzbXBfbnVtX3NpYmxpbmdzID4gMSkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaAppbmRleCAwZDUzNDI1Li5iZmQ3NGMwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9BU01fWDg2X1RSQVBTX0gKIAogI2luY2x1ZGUgPGFzbS9kZWJ1Z3JlZy5oPgorI2luY2x1ZGUgPGFzbS9zaWdpbmZvLmg+CQkJLyogVFJBUF9UUkFDRSwgLi4uICovCiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjZGVmaW5lIGRvdHJhcGxpbmthZ2UKQEAgLTEzLDYgKzE0LDkgQEAKIGFzbWxpbmthZ2Ugdm9pZCBkZWJ1Zyh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBubWkodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgaW50Myh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCB4ZW5fZGVidWcodm9pZCk7Cithc21saW5rYWdlIHZvaWQgeGVuX2ludDModm9pZCk7Cithc21saW5rYWdlIHZvaWQgeGVuX3N0YWNrX3NlZ21lbnQodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgb3ZlcmZsb3codm9pZCk7CiBhc21saW5rYWdlIHZvaWQgYm91bmRzKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIGludmFsaWRfb3Aodm9pZCk7CkBAIC03NCw3ICs3OCw2IEBACiB9CiAKIGV4dGVybiBpbnQgcGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pOwotZXh0ZXJuIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQ7CiAKIHZvaWQgbWF0aF9lcnJvcih2b2lkIF9fdXNlciAqKTsKIHZvaWQgbWF0aF9lbXVsYXRlKHN0cnVjdCBtYXRoX2VtdV9pbmZvICopOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAppbmRleCA2ZTcyZDc0Li43MzJhMzA3MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzMyLmgKQEAgLTM0MCw2ICszNDAsOCBAQAogI2RlZmluZSBfX05SX2lub3RpZnlfaW5pdDEJMzMyCiAjZGVmaW5lIF9fTlJfcHJlYWR2CQkzMzMKICNkZWZpbmUgX19OUl9wd3JpdGV2CQkzMzQKKyNkZWZpbmUgX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbwkzMzUKKyNkZWZpbmUgX19OUl9wZXJmX2NvdW50ZXJfb3BlbgkzMzYKIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdW5pc3RkXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaAppbmRleCBmODE4Mjk0Li45MDBlMTYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaApAQCAtNjU3LDcgKzY1NywxMCBAQAogX19TWVNDQUxMKF9fTlJfcHJlYWR2LCBzeXNfcHJlYWR2KQogI2RlZmluZSBfX05SX3B3cml0ZXYJCQkJMjk2CiBfX1NZU0NBTEwoX19OUl9wd3JpdGV2LCBzeXNfcHdyaXRldikKLQorI2RlZmluZSBfX05SX3J0X3Rnc2lncXVldWVpbmZvCQkJMjk3CitfX1NZU0NBTEwoX19OUl9ydF90Z3NpZ3F1ZXVlaW5mbywgc3lzX3J0X3Rnc2lncXVldWVpbmZvKQorI2RlZmluZSBfX05SX3BlcmZfY291bnRlcl9vcGVuCQkJMjk4CitfX1NZU0NBTEwoX19OUl9wZXJmX2NvdW50ZXJfb3Blbiwgc3lzX3BlcmZfY291bnRlcl9vcGVuKQogCiAjaWZuZGVmIF9fTk9fU1RVQlMKICNkZWZpbmUgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2JhdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKaW5kZXggOWIwZTYxYi4uYmRkZDQ0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmgKQEAgLTM3LDcgKzM3LDcgQEAKICNkZWZpbmUgVVZfQ1BVU19QRVJfQUNUX1NUQVRVUwkJMzIKICNkZWZpbmUgVVZfQUNUX1NUQVRVU19NQVNLCQkweDMKICNkZWZpbmUgVVZfQUNUX1NUQVRVU19TSVpFCQkyCi0jZGVmaW5lIFVWX0FDVElWQVRJT05fREVTQ1JJUFRPUl9TSVpFCTMyCisjZGVmaW5lIFVWX0FEUF9TSVpFCQkJMzIKICNkZWZpbmUgVVZfRElTVFJJQlVUSU9OX1NJWkUJCTI1NgogI2RlZmluZSBVVl9TV19BQ0tfTlBFTkRJTkcJCTgKICNkZWZpbmUgVVZfTkVUX0VORFBPSU5UX0lOVEQJCTB4MzgKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X2h1Yi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKaW5kZXggZDNhOThlYS4uMzQxMDcwZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmgKQEAgLTEzMyw2ICsxMzMsNyBAQAogc3RydWN0IHV2X2h1Yl9pbmZvX3MgewogCXVuc2lnbmVkIGxvbmcJCWdsb2JhbF9tbXJfYmFzZTsKIAl1bnNpZ25lZCBsb25nCQlncGFfbWFzazsKKwl1bnNpZ25lZCBpbnQJCWdub2RlX2V4dHJhOwogCXVuc2lnbmVkIGxvbmcJCWdub2RlX3VwcGVyOwogCXVuc2lnbmVkIGxvbmcJCWxvd21lbV9yZW1hcF90b3A7CiAJdW5zaWduZWQgbG9uZwkJbG93bWVtX3JlbWFwX2Jhc2U7CkBAIC0xNTksNyArMTYwLDggQEAKICAqIAkJcCAtICBQTk9ERSAobG9jYWwgcGFydCBvZiBuc2lkcywgcmlnaHQgc2hpZnRlZCAxKQogICovCiAjZGVmaW5lIFVWX05BU0lEX1RPX1BOT0RFKG4pCQkoKChuKSA+PiAxKSAmIHV2X2h1Yl9pbmZvLT5wbm9kZV9tYXNrKQotI2RlZmluZSBVVl9QTk9ERV9UT19OQVNJRChwKQkJKCgocCkgPDwgMSkgfCB1dl9odWJfaW5mby0+Z25vZGVfdXBwZXIpCisjZGVmaW5lIFVWX1BOT0RFX1RPX0dOT0RFKHApCQkoKHApIHx1dl9odWJfaW5mby0+Z25vZGVfZXh0cmEpCisjZGVmaW5lIFVWX1BOT0RFX1RPX05BU0lEKHApCQkoVVZfUE5PREVfVE9fR05PREUocCkgPDwgMSkKIAogI2RlZmluZSBVVl9MT0NBTF9NTVJfQkFTRQkJMHhmNDAwMDAwMFVMCiAjZGVmaW5lIFVWX0dMT0JBTF9NTVIzMl9CQVNFCQkweGY4MDAwMDAwVUwKQEAgLTE3Myw3ICsxNzUsNyBAQAogI2RlZmluZSBVVl9HTE9CQUxfTU1SMzJfUE5PREVfQklUUyhwKQkoKHApIDw8IChVVl9HTE9CQUxfTU1SMzJfUE5PREVfU0hJRlQpKQogCiAjZGVmaW5lIFVWX0dMT0JBTF9NTVI2NF9QTk9ERV9CSVRTKHApCQkJCQlcCi0JKCh1bnNpZ25lZCBsb25nKShwKSA8PCBVVl9HTE9CQUxfTU1SNjRfUE5PREVfU0hJRlQpCisJKCh1bnNpZ25lZCBsb25nKShVVl9QTk9ERV9UT19HTk9ERShwKSkgPDwgVVZfR0xPQkFMX01NUjY0X1BOT0RFX1NISUZUKQogCiAjZGVmaW5lIFVWX0FQSUNfUE5PREVfU0hJRlQJNgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS92bXguaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCmluZGV4IDQ5OGY5NDQuLjExYmU1YWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3ZteC5oCkBAIC0yNDcsNiArMjQ3LDcgQEAKICNkZWZpbmUgRVhJVF9SRUFTT05fTVNSX1JFQUQgICAgICAgICAgICAzMQogI2RlZmluZSBFWElUX1JFQVNPTl9NU1JfV1JJVEUgICAgICAgICAgIDMyCiAjZGVmaW5lIEVYSVRfUkVBU09OX01XQUlUX0lOU1RSVUNUSU9OICAgMzYKKyNkZWZpbmUgRVhJVF9SRUFTT05fTUNFX0RVUklOR19WTUVOVFJZCSA0MQogI2RlZmluZSBFWElUX1JFQVNPTl9UUFJfQkVMT1dfVEhSRVNIT0xEIDQzCiAjZGVmaW5lIEVYSVRfUkVBU09OX0FQSUNfQUNDRVNTICAgICAgICAgNDQKICNkZWZpbmUgRVhJVF9SRUFTT05fRVBUX1ZJT0xBVElPTiAgICAgICA0OApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCmluZGV4IDg4ZDFiZmMuLjRmNzhiZDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKQEAgLTI4LDcgKzI4LDcgQEAKIG9iai15CQkJOj0gcHJvY2Vzc18kKEJJVFMpLm8gc2lnbmFsLm8gZW50cnlfJChCSVRTKS5vCiBvYmoteQkJCSs9IHRyYXBzLm8gaXJxLm8gaXJxXyQoQklUUykubyBkdW1wc3RhY2tfJChCSVRTKS5vCiBvYmoteQkJCSs9IHRpbWVfJChCSVRTKS5vIGlvcG9ydC5vIGxkdC5vIGR1bXBzdGFjay5vCi1vYmoteQkJCSs9IHNldHVwLm8gaTgyNTkubyBpcnFpbml0XyQoQklUUykubworb2JqLXkJCQkrPSBzZXR1cC5vIGk4MjU5Lm8gaXJxaW5pdC5vCiBvYmotJChDT05GSUdfWDg2X1ZJU1dTKQkrPSB2aXN3c19xdWlya3Mubwogb2JqLSQoQ09ORklHX1g4Nl8zMikJKz0gcHJvYmVfcm9tc18zMi5vCiBvYmotJChDT05GSUdfWDg2XzMyKQkrPSBzeXNfaTM4Nl8zMi5vIGkzODZfa3N5bXNfMzIubwpAQCAtNDQsNiArNDQsNyBAQAogb2JqLXkJCQkJKz0gaTM4Ny5vIHhzYXZlLm8KIG9iai15CQkJCSs9IHB0cmFjZS5vCiBvYmotJChDT05GSUdfWDg2X0RTKQkJKz0gZHMubworb2JqLSQoQ09ORklHX1g4Nl9EU19TRUxGVEVTVCkJCSs9IGRzX3NlbGZ0ZXN0Lm8KIG9iai0kKENPTkZJR19YODZfMzIpCQkrPSB0bHMubwogb2JqLSQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKQkrPSB0bHMubwogb2JqLXkJCQkJKz0gc3RlcC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggNzIzOTg5ZC4uNjMxMDg2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KQEAgLTUyMiw3ICs1MjMsNyBAQAogICogc3VjY2VzczogcmV0dXJuIElSUSBudW1iZXIgKD49MCkKICAqIGZhaWx1cmU6IHJldHVybiA8IDAKICAqLwotaW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCitpbnQgYWNwaV9yZWdpc3Rlcl9nc2koc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZ3NpLCBpbnQgdHJpZ2dlciwgaW50IHBvbGFyaXR5KQogewogCXVuc2lnbmVkIGludCBpcnE7CiAJdW5zaWduZWQgaW50IHBsYXRfZ3NpID0gZ3NpOwpAQCAtNTMyLDE0ICs1MzMsMTQgQEAKIAkgKiBNYWtlIHN1cmUgYWxsIChsZWdhY3kpIFBDSSBJUlFzIGFyZSBzZXQgYXMgbGV2ZWwtdHJpZ2dlcmVkLgogCSAqLwogCWlmIChhY3BpX2lycV9tb2RlbCA9PSBBQ1BJX0lSUV9NT0RFTF9QSUMpIHsKLQkJaWYgKHRyaWdnZXJpbmcgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpCisJCWlmICh0cmlnZ2VyID09IEFDUElfTEVWRUxfU0VOU0lUSVZFKQogCQkJZWlzYV9zZXRfbGV2ZWxfaXJxKGdzaSk7CiAJfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfSU9BUElDKSB7Ci0JCXBsYXRfZ3NpID0gbXBfcmVnaXN0ZXJfZ3NpKGdzaSwgdHJpZ2dlcmluZywgcG9sYXJpdHkpOworCQlwbGF0X2dzaSA9IG1wX3JlZ2lzdGVyX2dzaShkZXYsIGdzaSwgdHJpZ2dlciwgcG9sYXJpdHkpOwogCX0KICNlbmRpZgogCWFjcGlfZ3NpX3RvX2lycShwbGF0X2dzaSwgJmlycSk7CkBAIC05MDMsMTAgKzkwNCw4IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCB7Ci0JaW50IGFwaWNfaWQ7CiAJaW50IGdzaV9iYXNlOwogCWludCBnc2lfZW5kOwotCURFQ0xBUkVfQklUTUFQKHBpbl9wcm9ncmFtbWVkLCBNUF9NQVhfSU9BUElDX1BJTiArIDEpOwogfSBtcF9pb2FwaWNfcm91dGluZ1tNQVhfSU9fQVBJQ1NdOwogCiBpbnQgbXBfZmluZF9pb2FwaWMoaW50IGdzaSkKQEAgLTk4NiwxNiArOTg1LDEyIEBACiAKIAlzZXRfZml4bWFwX25vY2FjaGUoRklYX0lPX0FQSUNfQkFTRV8wICsgaWR4LCBhZGRyZXNzKTsKIAltcF9pb2FwaWNzW2lkeF0uYXBpY2lkID0gdW5pcV9pb2FwaWNfaWQoaWQpOwotI2lmZGVmIENPTkZJR19YODZfMzIKIAltcF9pb2FwaWNzW2lkeF0uYXBpY3ZlciA9IGlvX2FwaWNfZ2V0X3ZlcnNpb24oaWR4KTsKLSNlbHNlCi0JbXBfaW9hcGljc1tpZHhdLmFwaWN2ZXIgPSAwOwotI2VuZGlmCisKIAkvKgogCSAqIEJ1aWxkIGJhc2ljIEdTSSBsb29rdXAgdGFibGUgdG8gZmFjaWxpdGF0ZSBnc2ktPmlvX2FwaWMgbG9va3VwcwogCSAqIGFuZCB0byBwcmV2ZW50IHJlcHJvZ3JhbW1pbmcgb2YgSU9BUElDIHBpbnMgKFBDSSBHU0lzKS4KIAkgKi8KLQltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmFwaWNfaWQgPSBtcF9pb2FwaWNzW2lkeF0uYXBpY2lkOwogCW1wX2lvYXBpY19yb3V0aW5nW2lkeF0uZ3NpX2Jhc2UgPSBnc2lfYmFzZTsKIAltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmdzaV9lbmQgPSBnc2lfYmFzZSArCiAJICAgIGlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMoaWR4KTsKQEAgLTExNTgsMjYgKzExNTMsNTIgQEAKIAl9CiB9CiAKLWludCBtcF9yZWdpc3Rlcl9nc2kodTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSkKK3N0YXRpYyBpbnQgbXBfY29uZmlnX2FjcGlfZ3NpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGdzaSwgaW50IHRyaWdnZXIsCisJCQlpbnQgcG9sYXJpdHkpCit7CisjaWZkZWYgQ09ORklHX1g4Nl9NUFBBUlNFCisJc3RydWN0IG1wY19pbnRzcmMgbXBfaXJxOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVuc2lnbmVkIGNoYXIgbnVtYmVyOworCXVuc2lnbmVkIGludCBkZXZmbjsKKwlpbnQgaW9hcGljOworCXU4IHBpbjsKKworCWlmICghYWNwaV9pb2FwaWMpCisJCXJldHVybiAwOworCWlmICghZGV2KQorCQlyZXR1cm4gMDsKKwlpZiAoZGV2LT5idXMgIT0gJnBjaV9idXNfdHlwZSkKKwkJcmV0dXJuIDA7CisKKwlwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCW51bWJlciA9IHBkZXYtPmJ1cy0+bnVtYmVyOworCWRldmZuID0gcGRldi0+ZGV2Zm47CisJcGluID0gcGRldi0+cGluOworCS8qIHByaW50IHRoZSBlbnRyeSBzaG91bGQgaGFwcGVuIG9uIG1wdGFibGUgaWRlbnRpY2FsbHkgKi8KKwltcF9pcnEudHlwZSA9IE1QX0lOVFNSQzsKKwltcF9pcnEuaXJxdHlwZSA9IG1wX0lOVDsKKwltcF9pcnEuaXJxZmxhZyA9ICh0cmlnZ2VyID09IEFDUElfRURHRV9TRU5TSVRJVkUgPyA0IDogMHgwYykgfAorCQkJCShwb2xhcml0eSA9PSBBQ1BJX0FDVElWRV9ISUdIID8gMSA6IDMpOworCW1wX2lycS5zcmNidXMgPSBudW1iZXI7CisJbXBfaXJxLnNyY2J1c2lycSA9ICgoKGRldmZuID4+IDMpICYgMHgxZikgPDwgMikgfCAoKHBpbiAtIDEpICYgMyk7CisJaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKKwltcF9pcnEuZHN0YXBpYyA9IG1wX2lvYXBpY3NbaW9hcGljXS5hcGljaWQ7CisJbXBfaXJxLmRzdGlycSA9IG1wX2ZpbmRfaW9hcGljX3Bpbihpb2FwaWMsIGdzaSk7CisKKwlzYXZlX21wX2lycSgmbXBfaXJxKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitpbnQgbXBfcmVnaXN0ZXJfZ3NpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGdzaSwgaW50IHRyaWdnZXIsIGludCBwb2xhcml0eSkKIHsKIAlpbnQgaW9hcGljOwogCWludCBpb2FwaWNfcGluOwotI2lmZGVmIENPTkZJR19YODZfMzIKLSNkZWZpbmUgTUFYX0dTSV9OVU0JNDA5NgotI2RlZmluZSBJUlFfQ09NUFJFU1NJT05fU1RBUlQJNjQKLQotCXN0YXRpYyBpbnQgcGNpX2lycSA9IElSUV9DT01QUkVTU0lPTl9TVEFSVDsKLQkvKgotCSAqIE1hcHBpbmcgYmV0d2VlbiBHbG9iYWwgU3lzdGVtIEludGVycnVwdHMsIHdoaWNoCi0JICogcmVwcmVzZW50IGFsbCBwb3NzaWJsZSBpbnRlcnJ1cHRzLCBhbmQgSVJRcwotCSAqIGFzc2lnbmVkIHRvIGFjdHVhbCBkZXZpY2VzLgotCSAqLwotCXN0YXRpYyBpbnQgZ3NpX3RvX2lycVtNQVhfR1NJX05VTV07Ci0jZWxzZQorCXN0cnVjdCBpb19hcGljX2lycV9hdHRyIGlycV9hdHRyOwogCiAJaWYgKGFjcGlfaXJxX21vZGVsICE9IEFDUElfSVJRX01PREVMX0lPQVBJQykKIAkJcmV0dXJuIGdzaTsKLSNlbmRpZgogCiAJLyogRG9uJ3Qgc2V0IHVwIHRoZSBBQ1BJIFNDSSBiZWNhdXNlIGl0J3MgYWxyZWFkeSBzZXQgdXAgKi8KIAlpZiAoYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0ID09IGdzaSkKQEAgLTExOTYsOTUgKzEyMTcsMjQgQEAKIAkJZ3NpID0gaW9hcGljX3JlbnVtYmVyX2lycShpb2FwaWMsIGdzaSk7CiAjZW5kaWYKIAotCS8qCi0JICogQXZvaWQgcGluIHJlcHJvZ3JhbW1pbmcuICBQUlRzIHR5cGljYWxseSBpbmNsdWRlIGVudHJpZXMKLQkgKiB3aXRoIHJlZHVuZGFudCBwaW4tPmdzaSBtYXBwaW5ncyAoYnV0IHVuaXF1ZSBQQ0kgZGV2aWNlcyk7Ci0JICogd2Ugb25seSBwcm9ncmFtIHRoZSBJT0FQSUMgb24gdGhlIGZpcnN0LgotCSAqLwogCWlmIChpb2FwaWNfcGluID4gTVBfTUFYX0lPQVBJQ19QSU4pIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHJlZmVyZW5jZSB0byBJT0FQSUMgcGluICIKLQkJICAgICAgICIlZC0lZFxuIiwgbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5hcGljX2lkLAorCQkgICAgICAgIiVkLSVkXG4iLCBtcF9pb2FwaWNzW2lvYXBpY10uYXBpY2lkLAogCQkgICAgICAgaW9hcGljX3Bpbik7CiAJCXJldHVybiBnc2k7CiAJfQotCWlmICh0ZXN0X2JpdChpb2FwaWNfcGluLCBtcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLnBpbl9wcm9ncmFtbWVkKSkgewotCQlwcl9kZWJ1ZygiUGluICVkLSVkIGFscmVhZHkgcHJvZ3JhbW1lZFxuIiwKLQkJCSBtcF9pb2FwaWNfcm91dGluZ1tpb2FwaWNdLmFwaWNfaWQsIGlvYXBpY19waW4pOwotI2lmZGVmIENPTkZJR19YODZfMzIKLQkJcmV0dXJuIChnc2kgPCBJUlFfQ09NUFJFU1NJT05fU1RBUlQgPyBnc2kgOiBnc2lfdG9faXJxW2dzaV0pOwotI2Vsc2UKLQkJcmV0dXJuIGdzaTsKLSNlbmRpZgotCX0KIAotCXNldF9iaXQoaW9hcGljX3BpbiwgbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5waW5fcHJvZ3JhbW1lZCk7Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCS8qCi0JICogRm9yIEdTSSA+PSA2NCwgdXNlIElSUSBjb21wcmVzc2lvbgotCSAqLwotCWlmICgoZ3NpID49IElSUV9DT01QUkVTU0lPTl9TVEFSVCkKLQkgICAgJiYgKHRyaWdnZXJpbmcgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpKSB7Ci0JCS8qCi0JCSAqIEZvciBQQ0kgZGV2aWNlcyBhc3NpZ24gSVJRcyBpbiBvcmRlciwgYXZvaWRpbmcgZ2FwcwotCQkgKiBkdWUgdG8gdW51c2VkIEkvTyBBUElDIHBpbnMuCi0JCSAqLwotCQlpbnQgaXJxID0gZ3NpOwotCQlpZiAoZ3NpIDwgTUFYX0dTSV9OVU0pIHsKLQkJCS8qCi0JCQkgKiBSZXRhaW4gdGhlIFZJQSBjaGlwc2V0IHdvcmstYXJvdW5kIChnc2kgPiAxNSksIGJ1dAotCQkJICogYXZvaWQgYSBwcm9ibGVtIHdoZXJlIHRoZSA4MjU0IHRpbWVyIChJUlEwKSBpcyBzZXR1cAotCQkJICogdmlhIGFuIG92ZXJyaWRlIChzbyBpdCdzIG5vdCBvbiBwaW4gMCBvZiB0aGUgaW9hcGljKSwKLQkJCSAqIGFuZCBhdCB0aGUgc2FtZSB0aW1lLCB0aGUgcGluIDAgaW50ZXJydXB0IGlzIGEgUENJCi0JCQkgKiB0eXBlLiAgVGhlIGdzaSA+IDE1IHRlc3QgY291bGQgY2F1c2UgdGhlc2UgdHdvIHBpbnMKLQkJCSAqIHRvIGJlIHNoYXJlZCBhcyBJUlEwLCBhbmQgdGhleSBhcmUgbm90IHNoYXJlYWJsZS4KLQkJCSAqIFNvIHRlc3QgZm9yIHRoaXMgY29uZGl0aW9uLCBhbmQgaWYgbmVjZXNzYXJ5LCBhdm9pZAotCQkJICogdGhlIHBpbiBjb2xsaXNpb24uCi0JCQkgKi8KLQkJCWdzaSA9IHBjaV9pcnErKzsKLQkJCS8qCi0JCQkgKiBEb24ndCBhc3NpZ24gSVJRIHVzZWQgYnkgQUNQSSBTQ0kKLQkJCSAqLwotCQkJaWYgKGdzaSA9PSBhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQpCi0JCQkJZ3NpID0gcGNpX2lycSsrOwotCQkJZ3NpX3RvX2lycVtpcnFdID0gZ3NpOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fRVJSICJHU0kgJXUgaXMgdG9vIGhpZ2hcbiIsIGdzaSk7Ci0JCQlyZXR1cm4gZ3NpOwotCQl9Ci0JfQotI2VuZGlmCi0JaW9fYXBpY19zZXRfcGNpX3JvdXRpbmcoaW9hcGljLCBpb2FwaWNfcGluLCBnc2ksCi0JCQkJdHJpZ2dlcmluZyA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFID8gMCA6IDEsCi0JCQkJcG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfSElHSCA/IDAgOiAxKTsKKwlpZiAoZW5hYmxlX3VwZGF0ZV9tcHRhYmxlKQorCQltcF9jb25maWdfYWNwaV9nc2koZGV2LCBnc2ksIHRyaWdnZXIsIHBvbGFyaXR5KTsKKworCXNldF9pb19hcGljX2lycV9hdHRyKCZpcnFfYXR0ciwgaW9hcGljLCBpb2FwaWNfcGluLAorCQkJICAgICB0cmlnZ2VyID09IEFDUElfRURHRV9TRU5TSVRJVkUgPyAwIDogMSwKKwkJCSAgICAgcG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfSElHSCA/IDAgOiAxKTsKKwlpb19hcGljX3NldF9wY2lfcm91dGluZyhkZXYsIGdzaSwgJmlycV9hdHRyKTsKKwogCXJldHVybiBnc2k7CiB9CiAKLWludCBtcF9jb25maWdfYWNwaV9nc2kodW5zaWduZWQgY2hhciBudW1iZXIsIHVuc2lnbmVkIGludCBkZXZmbiwgdTggcGluLAotCQkJdTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSkKLXsKLSNpZmRlZiBDT05GSUdfWDg2X01QUEFSU0UKLQlzdHJ1Y3QgbXBjX2ludHNyYyBtcF9pcnE7Ci0JaW50IGlvYXBpYzsKLQotCWlmICghYWNwaV9pb2FwaWMpCi0JCXJldHVybiAwOwotCi0JLyogcHJpbnQgdGhlIGVudHJ5IHNob3VsZCBoYXBwZW4gb24gbXB0YWJsZSBpZGVudGljYWxseSAqLwotCW1wX2lycS50eXBlID0gTVBfSU5UU1JDOwotCW1wX2lycS5pcnF0eXBlID0gbXBfSU5UOwotCW1wX2lycS5pcnFmbGFnID0gKHRyaWdnZXJpbmcgPT0gQUNQSV9FREdFX1NFTlNJVElWRSA/IDQgOiAweDBjKSB8Ci0JCQkJKHBvbGFyaXR5ID09IEFDUElfQUNUSVZFX0hJR0ggPyAxIDogMyk7Ci0JbXBfaXJxLnNyY2J1cyA9IG51bWJlcjsKLQltcF9pcnEuc3JjYnVzaXJxID0gKCgoZGV2Zm4gPj4gMykgJiAweDFmKSA8PCAyKSB8ICgocGluIC0gMSkgJiAzKTsKLQlpb2FwaWMgPSBtcF9maW5kX2lvYXBpYyhnc2kpOwotCW1wX2lycS5kc3RhcGljID0gbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5hcGljX2lkOwotCW1wX2lycS5kc3RpcnEgPSBtcF9maW5kX2lvYXBpY19waW4oaW9hcGljLCBnc2kpOwotCi0Jc2F2ZV9tcF9pcnEoJm1wX2lycSk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIFBhcnNlIElPQVBJQyByZWxhdGVkIGVudHJpZXMgaW4gTUFEVAogICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIDwgMCBvbiBlcnJvcgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS9NYWtlZmlsZQppbmRleCAxYzMxY2MwLi4xNjdiYzE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS9NYWtlZmlsZQpAQCAtOSw3ICs5LDcgQEAKIGFsd2F5cwkJOj0gd2FrZXVwLmJpbgogdGFyZ2V0cwkJOj0gd2FrZXVwLmVsZiB3YWtldXAubGRzCiAKLXdha2V1cC15CSs9IHdha2V1cC5vIHdha2VtYWluLm8gdmlkZW8tbW9kZS5vIGNvcHkubword2FrZXVwLXkJKz0gd2FrZXVwLm8gd2FrZW1haW4ubyB2aWRlby1tb2RlLm8gY29weS5vIGJpb3NjYWxsLm8gcmVncy5vCiAKICMgVGhlIGxpbmsgb3JkZXIgb2YgdGhlIHZpZGVvLSoubyBtb2R1bGVzIGNhbiBtYXR0ZXIuICBJbiBwYXJ0aWN1bGFyLAogIyB2aWRlby12Z2EubyAqbXVzdCogYmUgbGlzdGVkIGZpcnN0LCBmb2xsb3dlZCBieSB2aWRlby12ZXNhLm8uCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS9iaW9zY2FsbC5TIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvYmlvc2NhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTFlYjBiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvYmlvc2NhbGwuUwpAQCAtMCwwICsxIEBACisjaW5jbHVkZSAiLi4vLi4vLi4vYm9vdC9iaW9zY2FsbC5TIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvcmVncy5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvcmVncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDYwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9yZWFsbW9kZS9yZWdzLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uLy4uL2Jvb3QvcmVncy5jIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCmluZGV4IGE5N2RiOTkuLjFjNjA1NTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKQEAgLTU1LDcgKzU1LDE2IEBACiBzdGF0aWMgaW50IGRtYV9vcHNfdW5pdHlfbWFwKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbSwKIAkJCSAgICAgc3RydWN0IHVuaXR5X21hcF9lbnRyeSAqZSk7CiBzdGF0aWMgc3RydWN0IGRtYV9vcHNfZG9tYWluICpmaW5kX3Byb3RlY3Rpb25fZG9tYWluKHUxNiBkZXZpZCk7CitzdGF0aWMgdTY0KiBhbGxvY19wdGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb20sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdTY0CisJCSAgICAgICoqcHRlX3BhZ2UsIGdmcF90IGdmcCk7CitzdGF0aWMgdm9pZCBkbWFfb3BzX3Jlc2VydmVfYWRkcmVzc2VzKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGFnZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgcGFnZXMpOwogCisjaWZuZGVmIEJVU19OT1RJRllfVU5CT1VORF9EUklWRVIKKyNkZWZpbmUgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUiAweDAwMDUKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FNRF9JT01NVV9TVEFUUwogCkBAIC0yMTMsNyArMjIyLDcgQEAKIHsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9tbXUsICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkKKwlmb3JfZWFjaF9pb21tdShpb21tdSkKIAkJaW9tbXVfcG9sbF9ldmVudHMoaW9tbXUpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNDQwLDcgKzQ0OSw3IEBACiAJX19pb21tdV9idWlsZF9pbnZfaW9tbXVfcGFnZXMoJmNtZCwgQ01EX0lOVl9JT01NVV9BTExfUEFHRVNfQUREUkVTUywKIAkJCQkgICAgICBkb21pZCwgMSwgMSk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvbW11LCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpIHsKKwlmb3JfZWFjaF9pb21tdShpb21tdSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9tbXUtPmxvY2ssIGZsYWdzKTsKIAkJX19pb21tdV9xdWV1ZV9jb21tYW5kKGlvbW11LCAmY21kKTsKIAkJX19pb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwpAQCAtNDQ5LDYgKzQ1OCwzNSBAQAogCX0KIH0KIAordm9pZCBhbWRfaW9tbXVfZmx1c2hfYWxsX2RvbWFpbnModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPCBNQVhfRE9NQUlOX0lEOyArK2kpIHsKKwkJaWYgKCF0ZXN0X2JpdChpLCBhbWRfaW9tbXVfcGRfYWxsb2NfYml0bWFwKSkKKwkJCWNvbnRpbnVlOworCQlpb21tdV9mbHVzaF9kb21haW4oaSk7CisJfQorfQorCit2b2lkIGFtZF9pb21tdV9mbHVzaF9hbGxfZGV2aWNlcyh2b2lkKQoreworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8PSBhbWRfaW9tbXVfbGFzdF9iZGY7ICsraSkgeworCQlpZiAoYW1kX2lvbW11X3BkX3RhYmxlW2ldID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2ldOworCQlpZiAoIWlvbW11KQorCQkJY29udGludWU7CisKKwkJaW9tbXVfcXVldWVfaW52X2Rldl9lbnRyeShpb21tdSwgaSk7CisJCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CisJfQorfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIHVzZWQgdGhlIGNyZWF0ZSB0aGUgcGFnZSB0YWJsZSBtYXBwaW5ncyBmb3IKQEAgLTQ2OCw3ICs1MDYsNyBAQAogCQkJICB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKIAkJCSAgaW50IHByb3QpCiB7Ci0JdTY0IF9fcHRlLCAqcHRlLCAqcGFnZTsKKwl1NjQgX19wdGUsICpwdGU7CiAKIAlidXNfYWRkciAgPSBQQUdFX0FMSUdOKGJ1c19hZGRyKTsKIAlwaHlzX2FkZHIgPSBQQUdFX0FMSUdOKHBoeXNfYWRkcik7CkBAIC00NzcsMjcgKzUxNSw3IEBACiAJaWYgKGJ1c19hZGRyID4gSU9NTVVfTUFQX1NJWkVfTDMgfHwgIShwcm90ICYgSU9NTVVfUFJPVF9NQVNLKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwdGUgPSAmZG9tLT5wdF9yb290W0lPTU1VX1BURV9MMl9JTkRFWChidXNfYWRkcildOwotCi0JaWYgKCFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkgewotCQlwYWdlID0gKHU2NCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYWdlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCSpwdGUgPSBJT01NVV9MMl9QREUodmlydF90b19waHlzKHBhZ2UpKTsKLQl9Ci0KLQlwdGUgPSBJT01NVV9QVEVfUEFHRSgqcHRlKTsKLQlwdGUgPSAmcHRlW0lPTU1VX1BURV9MMV9JTkRFWChidXNfYWRkcildOwotCi0JaWYgKCFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkgewotCQlwYWdlID0gKHU2NCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFwYWdlKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCSpwdGUgPSBJT01NVV9MMV9QREUodmlydF90b19waHlzKHBhZ2UpKTsKLQl9Ci0KLQlwdGUgPSBJT01NVV9QVEVfUEFHRSgqcHRlKTsKLQlwdGUgPSAmcHRlW0lPTU1VX1BURV9MMF9JTkRFWChidXNfYWRkcildOworCXB0ZSA9IGFsbG9jX3B0ZShkb20sIGJ1c19hZGRyLCBOVUxMLCBHRlBfS0VSTkVMKTsKIAogCWlmIChJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTU5NSw3ICs2MTMsOCBAQAogCQkgKiBhcyBhbGxvY2F0ZWQgaW4gdGhlIGFwZXJ0dXJlCiAJCSAqLwogCQlpZiAoYWRkciA8IGRtYV9kb20tPmFwZXJ0dXJlX3NpemUpCi0JCQlfX3NldF9iaXQoYWRkciA+PiBQQUdFX1NISUZULCBkbWFfZG9tLT5iaXRtYXApOworCQkJX19zZXRfYml0KGFkZHIgPj4gUEFHRV9TSElGVCwKKwkJCQkgIGRtYV9kb20tPmFwZXJ0dXJlWzBdLT5iaXRtYXApOwogCX0KIAogCXJldHVybiAwOwpAQCAtNjMyLDQyICs2NTEsMTkxIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoKLSAqIFRoZSBhZGRyZXNzIGFsbG9jYXRvciBjb3JlIGZ1bmN0aW9uLgorICogVGhlIGFkZHJlc3MgYWxsb2NhdG9yIGNvcmUgZnVuY3Rpb25zLgogICoKICAqIGNhbGxlZCB3aXRoIGRvbWFpbi0+bG9jayBoZWxkCiAgKi8KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZXJlIGlzIGEgUFRFIGZvciBhIGdpdmVuIGRtYSBhZGRyZXNzLiBJZgorICogdGhlcmUgaXMgb25lLCBpdCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIGl0LgorICovCitzdGF0aWMgdTY0KiBmZXRjaF9wdGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwl1NjQgKnB0ZTsKKworCXB0ZSA9ICZkb21haW4tPnB0X3Jvb3RbSU9NTVVfUFRFX0wyX0lOREVYKGFkZHJlc3MpXTsKKworCWlmICghSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpCisJCXJldHVybiBOVUxMOworCisJcHRlID0gSU9NTVVfUFRFX1BBR0UoKnB0ZSk7CisJcHRlID0gJnB0ZVtJT01NVV9QVEVfTDFfSU5ERVgoYWRkcmVzcyldOworCisJaWYgKCFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwdGUgPSBJT01NVV9QVEVfUEFHRSgqcHRlKTsKKwlwdGUgPSAmcHRlW0lPTU1VX1BURV9MMF9JTkRFWChhZGRyZXNzKV07CisKKwlyZXR1cm4gcHRlOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBhIG5ldyBhcGVydHVyZSByYW5nZSB0byBhbiBleGlzdGluZworICogYXBlcnR1cmUgaW4gY2FzZSBvZiBkbWFfb3BzIGRvbWFpbiBhbGxvY2F0aW9uIG9yIGFkZHJlc3MgYWxsb2NhdGlvbgorICogZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBhbGxvY19uZXdfcmFuZ2Uoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsCisJCQkgICBzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb20sCisJCQkgICBib29sIHBvcHVsYXRlLCBnZnBfdCBnZnApCit7CisJaW50IGluZGV4ID0gZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSA+PiBBUEVSVFVSRV9SQU5HRV9TSElGVDsKKwlpbnQgaTsKKworI2lmZGVmIENPTkZJR19JT01NVV9TVFJFU1MKKwlwb3B1bGF0ZSA9IGZhbHNlOworI2VuZGlmCisKKwlpZiAoaW5kZXggPj0gQVBFUlRVUkVfTUFYX1JBTkdFUykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXBlcnR1cmVfcmFuZ2UpLCBnZnApOworCWlmICghZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+Yml0bWFwID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoZ2ZwKTsKKwlpZiAoIWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+Yml0bWFwKQorCQlnb3RvIG91dF9mcmVlOworCisJZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5vZmZzZXQgPSBkbWFfZG9tLT5hcGVydHVyZV9zaXplOworCisJaWYgKHBvcHVsYXRlKSB7CisJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IGRtYV9kb20tPmFwZXJ0dXJlX3NpemU7CisJCWludCBpLCBudW1fcHRlcyA9IEFQRVJUVVJFX1JBTkdFX1BBR0VTIC8gNTEyOworCQl1NjQgKnB0ZSwgKnB0ZV9wYWdlOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fcHRlczsgKytpKSB7CisJCQlwdGUgPSBhbGxvY19wdGUoJmRtYV9kb20tPmRvbWFpbiwgYWRkcmVzcywKKwkJCQkJJnB0ZV9wYWdlLCBnZnApOworCQkJaWYgKCFwdGUpCisJCQkJZ290byBvdXRfZnJlZTsKKworCQkJZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5wdGVfcGFnZXNbaV0gPSBwdGVfcGFnZTsKKworCQkJYWRkcmVzcyArPSBBUEVSVFVSRV9SQU5HRV9TSVpFIC8gNjQ7CisJCX0KKwl9CisKKwlkbWFfZG9tLT5hcGVydHVyZV9zaXplICs9IEFQRVJUVVJFX1JBTkdFX1NJWkU7CisKKwkvKiBJbnRpYWxpemUgdGhlIGV4Y2x1c2lvbiByYW5nZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCAmJgorCSAgICBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ID49IGRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+b2Zmc2V0ICYmCisJICAgIGlvbW11LT5leGNsdXNpb25fc3RhcnQgPCBkbWFfZG9tLT5hcGVydHVyZV9zaXplKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRwYWdlID0gaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCA+PiBQQUdFX1NISUZUOworCQlpbnQgcGFnZXMgPSBpb21tdV9udW1fcGFnZXMoaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCwKKwkJCQkJICAgIGlvbW11LT5leGNsdXNpb25fbGVuZ3RoLAorCQkJCQkgICAgUEFHRV9TSVpFKTsKKwkJZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhkbWFfZG9tLCBzdGFydHBhZ2UsIHBhZ2VzKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBhcmVhcyBhbHJlYWR5IG1hcHBlZCBhcyBwcmVzZW50IGluIHRoZSBuZXcgYXBlcnR1cmUKKwkgKiByYW5nZSBhbmQgbWFyayB0aG9zZSBwYWdlcyBhcyByZXNlcnZlZCBpbiB0aGUgYWxsb2NhdG9yLiBTdWNoCisJICogbWFwcGluZ3MgbWF5IGFscmVhZHkgZXhpc3QgYXMgYSByZXN1bHQgb2YgcmVxdWVzdGVkIHVuaXR5CisJICogbWFwcGluZ3MgZm9yIGRldmljZXMuCisJICovCisJZm9yIChpID0gZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5vZmZzZXQ7CisJICAgICBpIDwgZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZTsKKwkgICAgIGkgKz0gUEFHRV9TSVpFKSB7CisJCXU2NCAqcHRlID0gZmV0Y2hfcHRlKCZkbWFfZG9tLT5kb21haW4sIGkpOworCQlpZiAoIXB0ZSB8fCAhSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpCisJCQljb250aW51ZTsKKworCQlkbWFfb3BzX3Jlc2VydmVfYWRkcmVzc2VzKGRtYV9kb20sIGkgPDwgUEFHRV9TSElGVCwgMSk7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPmJpdG1hcCk7CisKKwlrZnJlZShkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0pOworCWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XSA9IE5VTEw7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX29wc19hcmVhX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20sCisJCQkJCXVuc2lnbmVkIGludCBwYWdlcywKKwkJCQkJdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrLAorCQkJCQl1NjQgZG1hX21hc2ssCisJCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnQpCit7CisJdW5zaWduZWQgbG9uZyBuZXh0X2JpdCA9IGRvbS0+bmV4dF9hZGRyZXNzICUgQVBFUlRVUkVfUkFOR0VfU0laRTsKKwlpbnQgbWF4X2luZGV4ID0gZG9tLT5hcGVydHVyZV9zaXplID4+IEFQRVJUVVJFX1JBTkdFX1NISUZUOworCWludCBpID0gc3RhcnQgPj4gQVBFUlRVUkVfUkFOR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBib3VuZGFyeV9zaXplOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9IC0xOworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisKKwluZXh0X2JpdCA+Pj0gUEFHRV9TSElGVDsKKworCWJvdW5kYXJ5X3NpemUgPSBBTElHTihkbWFfZ2V0X3NlZ19ib3VuZGFyeShkZXYpICsgMSwKKwkJCVBBR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKKworCWZvciAoO2kgPCBtYXhfaW5kZXg7ICsraSkgeworCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IGRvbS0+YXBlcnR1cmVbaV0tPm9mZnNldCA+PiBQQUdFX1NISUZUOworCisJCWlmIChkb20tPmFwZXJ0dXJlW2ldLT5vZmZzZXQgPj0gZG1hX21hc2spCisJCQlicmVhazsKKworCQlsaW1pdCA9IGlvbW11X2RldmljZV9tYXhfaW5kZXgoQVBFUlRVUkVfUkFOR0VfUEFHRVMsIG9mZnNldCwKKwkJCQkJICAgICAgIGRtYV9tYXNrID4+IFBBR0VfU0hJRlQpOworCisJCWFkZHJlc3MgPSBpb21tdV9hcmVhX2FsbG9jKGRvbS0+YXBlcnR1cmVbaV0tPmJpdG1hcCwKKwkJCQkJICAgbGltaXQsIG5leHRfYml0LCBwYWdlcywgMCwKKwkJCQkJICAgIGJvdW5kYXJ5X3NpemUsIGFsaWduX21hc2spOworCQlpZiAoYWRkcmVzcyAhPSAtMSkgeworCQkJYWRkcmVzcyA9IGRvbS0+YXBlcnR1cmVbaV0tPm9mZnNldCArCisJCQkJICAoYWRkcmVzcyA8PCBQQUdFX1NISUZUKTsKKwkJCWRvbS0+bmV4dF9hZGRyZXNzID0gYWRkcmVzcyArIChwYWdlcyA8PCBQQUdFX1NISUZUKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbmV4dF9iaXQgPSAwOworCX0KKworCXJldHVybiBhZGRyZXNzOworfQorCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfb3BzX2FsbG9jX2FkZHJlc3NlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20sCiAJCQkJCSAgICAgdW5zaWduZWQgaW50IHBhZ2VzLAogCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzaywKIAkJCQkJICAgICB1NjQgZG1hX21hc2spCiB7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7Ci0JdW5zaWduZWQgbG9uZyBib3VuZGFyeV9zaXplOwogCi0JYm91bmRhcnlfc2l6ZSA9IEFMSUdOKGRtYV9nZXRfc2VnX2JvdW5kYXJ5KGRldikgKyAxLAotCQkJUEFHRV9TSVpFKSA+PiBQQUdFX1NISUZUOwotCWxpbWl0ID0gaW9tbXVfZGV2aWNlX21heF9pbmRleChkb20tPmFwZXJ0dXJlX3NpemUgPj4gUEFHRV9TSElGVCwgMCwKLQkJCQkgICAgICAgZG1hX21hc2sgPj4gUEFHRV9TSElGVCk7CisjaWZkZWYgQ09ORklHX0lPTU1VX1NUUkVTUworCWRvbS0+bmV4dF9hZGRyZXNzID0gMDsKKwlkb20tPm5lZWRfZmx1c2ggPSB0cnVlOworI2VuZGlmCiAKLQlpZiAoZG9tLT5uZXh0X2JpdCA+PSBsaW1pdCkgewotCQlkb20tPm5leHRfYml0ID0gMDsKLQkJZG9tLT5uZWVkX2ZsdXNoID0gdHJ1ZTsKLQl9CisJYWRkcmVzcyA9IGRtYV9vcHNfYXJlYV9hbGxvYyhkZXYsIGRvbSwgcGFnZXMsIGFsaWduX21hc2ssCisJCQkJICAgICBkbWFfbWFzaywgZG9tLT5uZXh0X2FkZHJlc3MpOwogCi0JYWRkcmVzcyA9IGlvbW11X2FyZWFfYWxsb2MoZG9tLT5iaXRtYXAsIGxpbWl0LCBkb20tPm5leHRfYml0LCBwYWdlcywKLQkJCQkgICAwICwgYm91bmRhcnlfc2l6ZSwgYWxpZ25fbWFzayk7CiAJaWYgKGFkZHJlc3MgPT0gLTEpIHsKLQkJYWRkcmVzcyA9IGlvbW11X2FyZWFfYWxsb2MoZG9tLT5iaXRtYXAsIGxpbWl0LCAwLCBwYWdlcywKLQkJCQkwLCBib3VuZGFyeV9zaXplLCBhbGlnbl9tYXNrKTsKKwkJZG9tLT5uZXh0X2FkZHJlc3MgPSAwOworCQlhZGRyZXNzID0gZG1hX29wc19hcmVhX2FsbG9jKGRldiwgZG9tLCBwYWdlcywgYWxpZ25fbWFzaywKKwkJCQkJICAgICBkbWFfbWFzaywgMCk7CiAJCWRvbS0+bmVlZF9mbHVzaCA9IHRydWU7CiAJfQogCi0JaWYgKGxpa2VseShhZGRyZXNzICE9IC0xKSkgewotCQlkb20tPm5leHRfYml0ID0gYWRkcmVzcyArIHBhZ2VzOwotCQlhZGRyZXNzIDw8PSBQQUdFX1NISUZUOwotCX0gZWxzZQorCWlmICh1bmxpa2VseShhZGRyZXNzID09IC0xKSkKIAkJYWRkcmVzcyA9IGJhZF9kbWFfYWRkcmVzczsKIAogCVdBUk5fT04oKGFkZHJlc3MgKyAoUEFHRV9TSVpFKnBhZ2VzKSkgPiBkb20tPmFwZXJ0dXJlX3NpemUpOwpAQCAtNjg0LDExICs4NTIsMjMgQEAKIAkJCQkgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJICAgdW5zaWduZWQgaW50IHBhZ2VzKQogewotCWFkZHJlc3MgPj49IFBBR0VfU0hJRlQ7Ci0JaW9tbXVfYXJlYV9mcmVlKGRvbS0+Yml0bWFwLCBhZGRyZXNzLCBwYWdlcyk7CisJdW5zaWduZWQgaSA9IGFkZHJlc3MgPj4gQVBFUlRVUkVfUkFOR0VfU0hJRlQ7CisJc3RydWN0IGFwZXJ0dXJlX3JhbmdlICpyYW5nZSA9IGRvbS0+YXBlcnR1cmVbaV07CiAKLQlpZiAoYWRkcmVzcyA+PSBkb20tPm5leHRfYml0KQorCUJVR19PTihpID49IEFQRVJUVVJFX01BWF9SQU5HRVMgfHwgcmFuZ2UgPT0gTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfSU9NTVVfU1RSRVNTCisJaWYgKGkgPCA0KQorCQlyZXR1cm47CisjZW5kaWYKKworCWlmIChhZGRyZXNzID49IGRvbS0+bmV4dF9hZGRyZXNzKQogCQlkb20tPm5lZWRfZmx1c2ggPSB0cnVlOworCisJYWRkcmVzcyA9IChhZGRyZXNzICUgQVBFUlRVUkVfUkFOR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKKworCWlvbW11X2FyZWFfZnJlZShyYW5nZS0+Yml0bWFwLCBhZGRyZXNzLCBwYWdlcyk7CisKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTczNiwxMiArOTE2LDE2IEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydF9wYWdlLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBwYWdlcykKIHsKLQl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlID0gZG9tLT5hcGVydHVyZV9zaXplID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgaW50IGksIGxhc3RfcGFnZSA9IGRvbS0+YXBlcnR1cmVfc2l6ZSA+PiBQQUdFX1NISUZUOwogCiAJaWYgKHN0YXJ0X3BhZ2UgKyBwYWdlcyA+IGxhc3RfcGFnZSkKIAkJcGFnZXMgPSBsYXN0X3BhZ2UgLSBzdGFydF9wYWdlOwogCi0JaW9tbXVfYXJlYV9yZXNlcnZlKGRvbS0+Yml0bWFwLCBzdGFydF9wYWdlLCBwYWdlcyk7CisJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IHN0YXJ0X3BhZ2UgKyBwYWdlczsgKytpKSB7CisJCWludCBpbmRleCA9IGkgLyBBUEVSVFVSRV9SQU5HRV9QQUdFUzsKKwkJaW50IHBhZ2UgID0gaSAlIEFQRVJUVVJFX1JBTkdFX1BBR0VTOworCQlfX3NldF9iaXQocGFnZSwgZG9tLT5hcGVydHVyZVtpbmRleF0tPmJpdG1hcCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBmcmVlX3BhZ2V0YWJsZShzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbWFpbikKQEAgLTc4MCwxNCArOTY0LDE5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGRtYV9vcHNfZG9tYWluX2ZyZWUoc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20pCiB7CisJaW50IGk7CisKIAlpZiAoIWRvbSkKIAkJcmV0dXJuOwogCiAJZnJlZV9wYWdldGFibGUoJmRvbS0+ZG9tYWluKTsKIAotCWtmcmVlKGRvbS0+cHRlX3BhZ2VzKTsKLQotCWtmcmVlKGRvbS0+Yml0bWFwKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVBFUlRVUkVfTUFYX1JBTkdFUzsgKytpKSB7CisJCWlmICghZG9tLT5hcGVydHVyZVtpXSkKKwkJCWNvbnRpbnVlOworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZG9tLT5hcGVydHVyZVtpXS0+Yml0bWFwKTsKKwkJa2ZyZWUoZG9tLT5hcGVydHVyZVtpXSk7CisJfQogCiAJa2ZyZWUoZG9tKTsKIH0KQEAgLTc5NywxOSArOTg2LDkgQEAKICAqIEl0IGFsc28gaW50aWFsaXplcyB0aGUgcGFnZSB0YWJsZSBhbmQgdGhlIGFkZHJlc3MgYWxsb2NhdG9yIGRhdGEKICAqIHN0cnVjdHVyZXMgcmVxdWlyZWQgZm9yIHRoZSBkbWFfb3BzIGludGVyZmFjZQogICovCi1zdGF0aWMgc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfb3BzX2RvbWFpbl9hbGxvYyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwKLQkJCQkJCSAgIHVuc2lnbmVkIG9yZGVyKQorc3RhdGljIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX29wc19kb21haW5fYWxsb2Moc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7CiAJc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfZG9tOwotCXVuc2lnbmVkIGksIG51bV9wdGVfcGFnZXM7Ci0JdTY0ICpsMl9wZGU7Ci0JdTY0IGFkZHJlc3M7Ci0KLQkvKgotCSAqIEN1cnJlbnRseSB0aGUgRE1BIGFwZXJ0dXJlIG11c3QgYmUgYmV0d2VlbiAzMiBNQiBhbmQgMUdCIGluIHNpemUKLQkgKi8KLQlpZiAoKG9yZGVyIDwgMjUpIHx8IChvcmRlciA+IDMwKSkKLQkJcmV0dXJuIE5VTEw7CiAKIAlkbWFfZG9tID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRtYV9vcHNfZG9tYWluKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkbWFfZG9tKQpAQCAtODI2LDU1ICsxMDA1LDIwIEBACiAJZG1hX2RvbS0+ZG9tYWluLnByaXYgPSBkbWFfZG9tOwogCWlmICghZG1hX2RvbS0+ZG9tYWluLnB0X3Jvb3QpCiAJCWdvdG8gZnJlZV9kbWFfZG9tOwotCWRtYV9kb20tPmFwZXJ0dXJlX3NpemUgPSAoMVVMTCA8PCBvcmRlcik7Ci0JZG1hX2RvbS0+Yml0bWFwID0ga3phbGxvYyhkbWFfZG9tLT5hcGVydHVyZV9zaXplIC8gKFBBR0VfU0laRSAqIDgpLAotCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkbWFfZG9tLT5iaXRtYXApCi0JCWdvdG8gZnJlZV9kbWFfZG9tOwotCS8qCi0JICogbWFyayB0aGUgZmlyc3QgcGFnZSBhcyBhbGxvY2F0ZWQgc28gd2UgbmV2ZXIgcmV0dXJuIDAgYXMKLQkgKiBhIHZhbGlkIGRtYS1hZGRyZXNzLiBTbyB3ZSBjYW4gdXNlIDAgYXMgZXJyb3IgdmFsdWUKLQkgKi8KLQlkbWFfZG9tLT5iaXRtYXBbMF0gPSAxOwotCWRtYV9kb20tPm5leHRfYml0ID0gMDsKIAogCWRtYV9kb20tPm5lZWRfZmx1c2ggPSBmYWxzZTsKIAlkbWFfZG9tLT50YXJnZXRfZGV2ID0gMHhmZmZmOwogCi0JLyogSW50aWFsaXplIHRoZSBleGNsdXNpb24gcmFuZ2UgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKGlvbW11LT5leGNsdXNpb25fc3RhcnQgJiYKLQkgICAgaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCA8IGRtYV9kb20tPmFwZXJ0dXJlX3NpemUpIHsKLQkJdW5zaWduZWQgbG9uZyBzdGFydHBhZ2UgPSBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ID4+IFBBR0VfU0hJRlQ7Ci0JCWludCBwYWdlcyA9IGlvbW11X251bV9wYWdlcyhpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0LAotCQkJCQkgICAgaW9tbXUtPmV4Y2x1c2lvbl9sZW5ndGgsCi0JCQkJCSAgICBQQUdFX1NJWkUpOwotCQlkbWFfb3BzX3Jlc2VydmVfYWRkcmVzc2VzKGRtYV9kb20sIHN0YXJ0cGFnZSwgcGFnZXMpOwotCX0KKwlpZiAoYWxsb2NfbmV3X3JhbmdlKGlvbW11LCBkbWFfZG9tLCB0cnVlLCBHRlBfS0VSTkVMKSkKKwkJZ290byBmcmVlX2RtYV9kb207CiAKIAkvKgotCSAqIEF0IHRoZSBsYXN0IHN0ZXAsIGJ1aWxkIHRoZSBwYWdlIHRhYmxlcyBzbyB3ZSBkb24ndCBuZWVkIHRvCi0JICogYWxsb2NhdGUgcGFnZSB0YWJsZSBwYWdlcyBpbiB0aGUgZG1hX29wcyBtYXBwaW5nL3VubWFwcGluZwotCSAqIHBhdGguCisJICogbWFyayB0aGUgZmlyc3QgcGFnZSBhcyBhbGxvY2F0ZWQgc28gd2UgbmV2ZXIgcmV0dXJuIDAgYXMKKwkgKiBhIHZhbGlkIGRtYS1hZGRyZXNzLiBTbyB3ZSBjYW4gdXNlIDAgYXMgZXJyb3IgdmFsdWUKIAkgKi8KLQludW1fcHRlX3BhZ2VzID0gZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSAvIChQQUdFX1NJWkUgKiA1MTIpOwotCWRtYV9kb20tPnB0ZV9wYWdlcyA9IGt6YWxsb2MobnVtX3B0ZV9wYWdlcyAqIHNpemVvZih2b2lkICopLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkbWFfZG9tLT5wdGVfcGFnZXMpCi0JCWdvdG8gZnJlZV9kbWFfZG9tOworCWRtYV9kb20tPmFwZXJ0dXJlWzBdLT5iaXRtYXBbMF0gPSAxOworCWRtYV9kb20tPm5leHRfYWRkcmVzcyA9IDA7CiAKLQlsMl9wZGUgPSAodTY0ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCWlmIChsMl9wZGUgPT0gTlVMTCkKLQkJZ290byBmcmVlX2RtYV9kb207Ci0KLQlkbWFfZG9tLT5kb21haW4ucHRfcm9vdFswXSA9IElPTU1VX0wyX1BERSh2aXJ0X3RvX3BoeXMobDJfcGRlKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3B0ZV9wYWdlczsgKytpKSB7Ci0JCWRtYV9kb20tPnB0ZV9wYWdlc1tpXSA9ICh1NjQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmICghZG1hX2RvbS0+cHRlX3BhZ2VzW2ldKQotCQkJZ290byBmcmVlX2RtYV9kb207Ci0JCWFkZHJlc3MgPSB2aXJ0X3RvX3BoeXMoZG1hX2RvbS0+cHRlX3BhZ2VzW2ldKTsKLQkJbDJfcGRlW2ldID0gSU9NTVVfTDFfUERFKGFkZHJlc3MpOwotCX0KIAogCXJldHVybiBkbWFfZG9tOwogCkBAIC05ODMsNyArMTEyNyw2IEBACiAJc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW47CiAJc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfZG9tYWluOwogCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwotCWludCBvcmRlciA9IGFtZF9pb21tdV9hcGVydHVyZV9vcmRlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGRldmlkID4gYW1kX2lvbW11X2xhc3RfYmRmKQpAQCAtMTAwMiwxNyArMTE0NSw3IEBACiAJCQkgICJ0byBhIG5vbi1kbWEtb3BzIGRvbWFpblxuIiwgZGV2X25hbWUoZGV2KSk7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgQlVTX05PVElGWV9CT1VORF9EUklWRVI6Ci0JCWlmIChkb21haW4pCi0JCQlnb3RvIG91dDsKLQkJZG1hX2RvbWFpbiA9IGZpbmRfcHJvdGVjdGlvbl9kb21haW4oZGV2aWQpOwotCQlpZiAoIWRtYV9kb21haW4pCi0JCQlkbWFfZG9tYWluID0gaW9tbXUtPmRlZmF1bHRfZG9tOwotCQlhdHRhY2hfZGV2aWNlKGlvbW11LCAmZG1hX2RvbWFpbi0+ZG9tYWluLCBkZXZpZCk7Ci0JCXByaW50ayhLRVJOX0lORk8gIkFNRCBJT01NVTogVXNpbmcgcHJvdGVjdGlvbiBkb21haW4gJWQgZm9yICIKLQkJICAgICAgICJkZXZpY2UgJXNcbiIsIGRtYV9kb21haW4tPmRvbWFpbi5pZCwgZGV2X25hbWUoZGV2KSk7Ci0JCWJyZWFrOwotCWNhc2UgQlVTX05PVElGWV9VTkJJTkRfRFJJVkVSOgorCWNhc2UgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUjoKIAkJaWYgKCFkb21haW4pCiAJCQlnb3RvIG91dDsKIAkJZGV0YWNoX2RldmljZShkb21haW4sIGRldmlkKTsKQEAgLTEwMjIsNyArMTE1NSw3IEBACiAJCWRtYV9kb21haW4gPSBmaW5kX3Byb3RlY3Rpb25fZG9tYWluKGRldmlkKTsKIAkJaWYgKGRtYV9kb21haW4pCiAJCQlnb3RvIG91dDsKLQkJZG1hX2RvbWFpbiA9IGRtYV9vcHNfZG9tYWluX2FsbG9jKGlvbW11LCBvcmRlcik7CisJCWRtYV9kb21haW4gPSBkbWFfb3BzX2RvbWFpbl9hbGxvYyhpb21tdSk7CiAJCWlmICghZG1hX2RvbWFpbikKIAkJCWdvdG8gb3V0OwogCQlkbWFfZG9tYWluLT50YXJnZXRfZGV2ID0gZGV2aWQ7CkBAIC0xMTMzLDggKzEyNjYsOCBAQAogCQkJZG1hX2RvbSA9ICgqaW9tbXUpLT5kZWZhdWx0X2RvbTsKIAkJKmRvbWFpbiA9ICZkbWFfZG9tLT5kb21haW47CiAJCWF0dGFjaF9kZXZpY2UoKmlvbW11LCAqZG9tYWluLCAqYmRmKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIElPTU1VOiBVc2luZyBwcm90ZWN0aW9uIGRvbWFpbiAlZCBmb3IgIgotCQkJCSJkZXZpY2UgJXNcbiIsICgqZG9tYWluKS0+aWQsIGRldl9uYW1lKGRldikpOworCQlEVU1QX3ByaW50aygiVXNpbmcgcHJvdGVjdGlvbiBkb21haW4gJWQgZm9yIGRldmljZSAlc1xuIiwKKwkJCSAgICAoKmRvbWFpbiktPmlkLCBkZXZfbmFtZShkZXYpKTsKIAl9CiAKIAlpZiAoZG9tYWluX2Zvcl9kZXZpY2UoX2JkZikgPT0gTlVMTCkKQEAgLTExNDQsNiArMTI3Nyw2NiBAQAogfQogCiAvKgorICogSWYgdGhlIHB0ZV9wYWdlIGlzIG5vdCB5ZXQgYWxsb2NhdGVkIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKi8KK3N0YXRpYyB1NjQqIGFsbG9jX3B0ZShzdHJ1Y3QgcHJvdGVjdGlvbl9kb21haW4gKmRvbSwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1NjQgKipwdGVfcGFnZSwgZ2ZwX3QgZ2ZwKQoreworCXU2NCAqcHRlLCAqcGFnZTsKKworCXB0ZSA9ICZkb20tPnB0X3Jvb3RbSU9NTVVfUFRFX0wyX0lOREVYKGFkZHJlc3MpXTsKKworCWlmICghSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpIHsKKwkJcGFnZSA9ICh1NjQgKilnZXRfemVyb2VkX3BhZ2UoZ2ZwKTsKKwkJaWYgKCFwYWdlKQorCQkJcmV0dXJuIE5VTEw7CisJCSpwdGUgPSBJT01NVV9MMl9QREUodmlydF90b19waHlzKHBhZ2UpKTsKKwl9CisKKwlwdGUgPSBJT01NVV9QVEVfUEFHRSgqcHRlKTsKKwlwdGUgPSAmcHRlW0lPTU1VX1BURV9MMV9JTkRFWChhZGRyZXNzKV07CisKKwlpZiAoIUlPTU1VX1BURV9QUkVTRU5UKCpwdGUpKSB7CisJCXBhZ2UgPSAodTY0ICopZ2V0X3plcm9lZF9wYWdlKGdmcCk7CisJCWlmICghcGFnZSkKKwkJCXJldHVybiBOVUxMOworCQkqcHRlID0gSU9NTVVfTDFfUERFKHZpcnRfdG9fcGh5cyhwYWdlKSk7CisJfQorCisJcHRlID0gSU9NTVVfUFRFX1BBR0UoKnB0ZSk7CisKKwlpZiAocHRlX3BhZ2UpCisJCSpwdGVfcGFnZSA9IHB0ZTsKKworCXB0ZSA9ICZwdGVbSU9NTVVfUFRFX0wwX0lOREVYKGFkZHJlc3MpXTsKKworCXJldHVybiBwdGU7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZldGNoZXMgdGhlIFBURSBmb3IgYSBnaXZlbiBhZGRyZXNzIGluIHRoZSBhcGVydHVyZQorICovCitzdGF0aWMgdTY0KiBkbWFfb3BzX2dldF9wdGUoc3RydWN0IGRtYV9vcHNfZG9tYWluICpkb20sCisJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBhcGVydHVyZV9yYW5nZSAqYXBlcnR1cmU7CisJdTY0ICpwdGUsICpwdGVfcGFnZTsKKworCWFwZXJ0dXJlID0gZG9tLT5hcGVydHVyZVtBUEVSVFVSRV9SQU5HRV9JTkRFWChhZGRyZXNzKV07CisJaWYgKCFhcGVydHVyZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwdGUgPSBhcGVydHVyZS0+cHRlX3BhZ2VzW0FQRVJUVVJFX1BBR0VfSU5ERVgoYWRkcmVzcyldOworCWlmICghcHRlKSB7CisJCXB0ZSA9IGFsbG9jX3B0ZSgmZG9tLT5kb21haW4sIGFkZHJlc3MsICZwdGVfcGFnZSwgR0ZQX0FUT01JQyk7CisJCWFwZXJ0dXJlLT5wdGVfcGFnZXNbQVBFUlRVUkVfUEFHRV9JTkRFWChhZGRyZXNzKV0gPSBwdGVfcGFnZTsKKwl9IGVsc2UKKwkJcHRlICs9IElPTU1VX1BURV9MMF9JTkRFWChhZGRyZXNzKTsKKworCXJldHVybiBwdGU7Cit9CisKKy8qCiAgKiBUaGlzIGlzIHRoZSBnZW5lcmljIG1hcCBmdW5jdGlvbi4gSXQgbWFwcyBvbmUgNGtiIHBhZ2UgYXQgcGFkZHIgdG8KICAqIHRoZSBnaXZlbiBhZGRyZXNzIGluIHRoZSBETUEgYWRkcmVzcyBzcGFjZSBmb3IgdGhlIGRvbWFpbi4KICAqLwpAQCAtMTE1OSw4ICsxMzUyLDkgQEAKIAogCXBhZGRyICY9IFBBR0VfTUFTSzsKIAotCXB0ZSAgPSBkb20tPnB0ZV9wYWdlc1tJT01NVV9QVEVfTDFfSU5ERVgoYWRkcmVzcyldOwotCXB0ZSArPSBJT01NVV9QVEVfTDBfSU5ERVgoYWRkcmVzcyk7CisJcHRlICA9IGRtYV9vcHNfZ2V0X3B0ZShkb20sIGFkZHJlc3MpOworCWlmICghcHRlKQorCQlyZXR1cm4gYmFkX2RtYV9hZGRyZXNzOwogCiAJX19wdGUgPSBwYWRkciB8IElPTU1VX1BURV9QIHwgSU9NTVVfUFRFX0ZDOwogCkBAIC0xMTg1LDE0ICsxMzc5LDIwIEBACiAJCQkJIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAogCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CisJc3RydWN0IGFwZXJ0dXJlX3JhbmdlICphcGVydHVyZTsKIAl1NjQgKnB0ZTsKIAogCWlmIChhZGRyZXNzID49IGRvbS0+YXBlcnR1cmVfc2l6ZSkKIAkJcmV0dXJuOwogCi0JV0FSTl9PTihhZGRyZXNzICYgflBBR0VfTUFTSyB8fCBhZGRyZXNzID49IGRvbS0+YXBlcnR1cmVfc2l6ZSk7CisJYXBlcnR1cmUgPSBkb20tPmFwZXJ0dXJlW0FQRVJUVVJFX1JBTkdFX0lOREVYKGFkZHJlc3MpXTsKKwlpZiAoIWFwZXJ0dXJlKQorCQlyZXR1cm47CiAKLQlwdGUgID0gZG9tLT5wdGVfcGFnZXNbSU9NTVVfUFRFX0wxX0lOREVYKGFkZHJlc3MpXTsKKwlwdGUgID0gYXBlcnR1cmUtPnB0ZV9wYWdlc1tBUEVSVFVSRV9QQUdFX0lOREVYKGFkZHJlc3MpXTsKKwlpZiAoIXB0ZSkKKwkJcmV0dXJuOworCiAJcHRlICs9IElPTU1VX1BURV9MMF9JTkRFWChhZGRyZXNzKTsKIAogCVdBUk5fT04oISpwdGUpOwpAQCAtMTIxNiw3ICsxNDE2LDcgQEAKIAkJCSAgICAgICB1NjQgZG1hX21hc2spCiB7CiAJZG1hX2FkZHJfdCBvZmZzZXQgPSBwYWRkciAmIH5QQUdFX01BU0s7Ci0JZG1hX2FkZHJfdCBhZGRyZXNzLCBzdGFydDsKKwlkbWFfYWRkcl90IGFkZHJlc3MsIHN0YXJ0LCByZXQ7CiAJdW5zaWduZWQgaW50IHBhZ2VzOwogCXVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzayA9IDA7CiAJaW50IGk7CkBAIC0xMjMyLDE0ICsxNDMyLDMzIEBACiAJaWYgKGFsaWduKQogCQlhbGlnbl9tYXNrID0gKDFVTCA8PCBnZXRfb3JkZXIoc2l6ZSkpIC0gMTsKIAorcmV0cnk6CiAJYWRkcmVzcyA9IGRtYV9vcHNfYWxsb2NfYWRkcmVzc2VzKGRldiwgZG1hX2RvbSwgcGFnZXMsIGFsaWduX21hc2ssCiAJCQkJCSAgZG1hX21hc2spOwotCWlmICh1bmxpa2VseShhZGRyZXNzID09IGJhZF9kbWFfYWRkcmVzcykpCi0JCWdvdG8gb3V0OworCWlmICh1bmxpa2VseShhZGRyZXNzID09IGJhZF9kbWFfYWRkcmVzcykpIHsKKwkJLyoKKwkJICogc2V0dGluZyBuZXh0X2FkZHJlc3MgaGVyZSB3aWxsIGxldCB0aGUgYWRkcmVzcworCQkgKiBhbGxvY2F0b3Igb25seSBzY2FuIHRoZSBuZXcgYWxsb2NhdGVkIHJhbmdlIGluIHRoZQorCQkgKiBmaXJzdCBydW4uIFRoaXMgaXMgYSBzbWFsbCBvcHRpbWl6YXRpb24uCisJCSAqLworCQlkbWFfZG9tLT5uZXh0X2FkZHJlc3MgPSBkbWFfZG9tLT5hcGVydHVyZV9zaXplOworCisJCWlmIChhbGxvY19uZXdfcmFuZ2UoaW9tbXUsIGRtYV9kb20sIGZhbHNlLCBHRlBfQVRPTUlDKSkKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIGFwZXJ0dXJlIHdhcyBzdWNlc3NmdWxseSBlbmxhcmdlZCBieSAxMjggTUIsIHRyeQorCQkgKiBhbGxvY2F0aW9uIGFnYWluCisJCSAqLworCQlnb3RvIHJldHJ5OworCX0KIAogCXN0YXJ0ID0gYWRkcmVzczsKIAlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7ICsraSkgewotCQlkbWFfb3BzX2RvbWFpbl9tYXAoaW9tbXUsIGRtYV9kb20sIHN0YXJ0LCBwYWRkciwgZGlyKTsKKwkJcmV0ID0gZG1hX29wc19kb21haW5fbWFwKGlvbW11LCBkbWFfZG9tLCBzdGFydCwgcGFkZHIsIGRpcik7CisJCWlmIChyZXQgPT0gYmFkX2RtYV9hZGRyZXNzKQorCQkJZ290byBvdXRfdW5tYXA7CisKIAkJcGFkZHIgKz0gUEFHRV9TSVpFOwogCQlzdGFydCArPSBQQUdFX1NJWkU7CiAJfQpAQCAtMTI1NSw2ICsxNDc0LDE3IEBACiAKIG91dDoKIAlyZXR1cm4gYWRkcmVzczsKKworb3V0X3VubWFwOgorCisJZm9yICgtLWk7IGkgPj0gMDsgLS1pKSB7CisJCXN0YXJ0IC09IFBBR0VfU0laRTsKKwkJZG1hX29wc19kb21haW5fdW5tYXAoaW9tbXUsIGRtYV9kb20sIHN0YXJ0KTsKKwl9CisKKwlkbWFfb3BzX2ZyZWVfYWRkcmVzc2VzKGRtYV9kb20sIGFkZHJlc3MsIHBhZ2VzKTsKKworCXJldHVybiBiYWRfZG1hX2FkZHJlc3M7CiB9CiAKIC8qCkBAIC0xNTM3LDggKzE3NjcsMTAgQEAKIAkqZG1hX2FkZHIgPSBfX21hcF9zaW5nbGUoZGV2LCBpb21tdSwgZG9tYWluLT5wcml2LCBwYWRkciwKIAkJCQkgc2l6ZSwgRE1BX0JJRElSRUNUSU9OQUwsIHRydWUsIGRtYV9tYXNrKTsKIAotCWlmICgqZG1hX2FkZHIgPT0gYmFkX2RtYV9hZGRyZXNzKQorCWlmICgqZG1hX2FkZHIgPT0gYmFkX2RtYV9hZGRyZXNzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRvbWFpbi0+bG9jaywgZmxhZ3MpOwogCQlnb3RvIG91dF9mcmVlOworCX0KIAogCWlvbW11X2NvbXBsZXRpb25fd2FpdChpb21tdSk7CiAKQEAgLTE2MjUsNyArMTg1Nyw2IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CiAJc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfZG9tOwogCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwotCWludCBvcmRlciA9IGFtZF9pb21tdV9hcGVydHVyZV9vcmRlcjsKIAl1MTYgZGV2aWQ7CiAKIAl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKQEAgLTE2MzgsNyArMTg2OSw3IEBACiAJCWlvbW11ID0gYW1kX2lvbW11X3Jsb29rdXBfdGFibGVbZGV2aWRdOwogCQlpZiAoIWlvbW11KQogCQkJY29udGludWU7Ci0JCWRtYV9kb20gPSBkbWFfb3BzX2RvbWFpbl9hbGxvYyhpb21tdSwgb3JkZXIpOworCQlkbWFfZG9tID0gZG1hX29wc19kb21haW5fYWxsb2MoaW9tbXUpOwogCQlpZiAoIWRtYV9kb20pCiAJCQljb250aW51ZTsKIAkJaW5pdF91bml0eV9tYXBwaW5nc19mb3JfZGV2aWNlKGRtYV9kb20sIGRldmlkKTsKQEAgLTE2NjQsNyArMTg5NSw2IEBACiBpbnQgX19pbml0IGFtZF9pb21tdV9pbml0X2RtYV9vcHModm9pZCkKIHsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQlpbnQgb3JkZXIgPSBhbWRfaW9tbXVfYXBlcnR1cmVfb3JkZXI7CiAJaW50IHJldDsKIAogCS8qCkBAIC0xNjcyLDggKzE5MDIsOCBAQAogCSAqIGZvdW5kIGluIHRoZSBzeXN0ZW0uIERldmljZXMgbm90IGFzc2lnbmVkIHRvIGFueSBvdGhlcgogCSAqIHByb3RlY3Rpb24gZG9tYWluIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGRlZmF1bHQgb25lLgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9tbXUsICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkgewotCQlpb21tdS0+ZGVmYXVsdF9kb20gPSBkbWFfb3BzX2RvbWFpbl9hbGxvYyhpb21tdSwgb3JkZXIpOworCWZvcl9lYWNoX2lvbW11KGlvbW11KSB7CisJCWlvbW11LT5kZWZhdWx0X2RvbSA9IGRtYV9vcHNfZG9tYWluX2FsbG9jKGlvbW11KTsKIAkJaWYgKGlvbW11LT5kZWZhdWx0X2RvbSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCWlvbW11LT5kZWZhdWx0X2RvbS0+ZG9tYWluLmZsYWdzIHw9IFBEX0RFRkFVTFRfTUFTSzsKQEAgLTE3MTAsNyArMTk0MCw3IEBACiAKIGZyZWVfZG9tYWluczoKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9tbXUsICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkgeworCWZvcl9lYWNoX2lvbW11KGlvbW11KSB7CiAJCWlmIChpb21tdS0+ZGVmYXVsdF9kb20pCiAJCQlkbWFfb3BzX2RvbWFpbl9mcmVlKGlvbW11LT5kZWZhdWx0X2RvbSk7CiAJfQpAQCAtMTg0Miw3ICsyMDcyLDcgQEAKIAogCW9sZF9kb21haW4gPSBkb21haW5fZm9yX2RldmljZShkZXZpZCk7CiAJaWYgKG9sZF9kb21haW4pCi0JCXJldHVybiAtRUJVU1k7CisJCWRldGFjaF9kZXZpY2Uob2xkX2RvbWFpbiwgZGV2aWQpOwogCiAJYXR0YWNoX2RldmljZShpb21tdSwgZG9tYWluLCBkZXZpZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKaW5kZXggOGMwYmUwOS4uMjM4OTg5ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdV9pbml0LmMKQEAgLTExNSwxNSArMTE1LDIxIEBACiAJdTY0IHJhbmdlX2xlbmd0aDsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKK2Jvb2wgYW1kX2lvbW11X2R1bXA7CisKIHN0YXRpYyBpbnQgX19pbml0ZGF0YSBhbWRfaW9tbXVfZGV0ZWN0ZWQ7CiAKIHUxNiBhbWRfaW9tbXVfbGFzdF9iZGY7CQkJLyogbGFyZ2VzdCBQQ0kgZGV2aWNlIGlkIHdlIGhhdmUKIAkJCQkJICAgdG8gaGFuZGxlICovCiBMSVNUX0hFQUQoYW1kX2lvbW11X3VuaXR5X21hcCk7CQkvKiBhIGxpc3Qgb2YgcmVxdWlyZWQgdW5pdHkgbWFwcGluZ3MKIAkJCQkJICAgd2UgZmluZCBpbiBBQ1BJICovCi11bnNpZ25lZCBhbWRfaW9tbXVfYXBlcnR1cmVfb3JkZXIgPSAyNjsgLyogc2l6ZSBvZiBhcGVydHVyZSBpbiBwb3dlciBvZiAyICovCisjaWZkZWYgQ09ORklHX0lPTU1VX1NUUkVTUworYm9vbCBhbWRfaW9tbXVfaXNvbGF0ZSA9IGZhbHNlOworI2Vsc2UKIGJvb2wgYW1kX2lvbW11X2lzb2xhdGUgPSB0cnVlOwkJLyogaWYgdHJ1ZSwgZGV2aWNlIGlzb2xhdGlvbiBpcwogCQkJCQkgICBlbmFibGVkICovCisjZW5kaWYKKwogYm9vbCBhbWRfaW9tbXVfdW5tYXBfZmx1c2g7CQkvKiBpZiB0cnVlLCBmbHVzaCBvbiBldmVyeSB1bm1hcCAqLwogCiBMSVNUX0hFQUQoYW1kX2lvbW11X2xpc3QpOwkJLyogbGlzdCBvZiBhbGwgQU1EIElPTU1VcyBpbiB0aGUKQEAgLTE3NSw3ICsxODEsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRibF9zaXplKGludCBlbnRyeV9zaXplKQogewogCXVuc2lnbmVkIHNoaWZ0ID0gUEFHRV9TSElGVCArCi0JCQkgZ2V0X29yZGVyKGFtZF9pb21tdV9sYXN0X2JkZiAqIGVudHJ5X3NpemUpOworCQkJIGdldF9vcmRlcigoKGludClhbWRfaW9tbXVfbGFzdF9iZGYgKyAxKSAqIGVudHJ5X3NpemUpOwogCiAJcmV0dXJuIDFVTCA8PCBzaGlmdDsKIH0KQEAgLTE5Myw3ICsxOTksNyBAQAogICogVGhpcyBmdW5jdGlvbiBzZXQgdGhlIGV4Y2x1c2lvbiByYW5nZSBpbiB0aGUgSU9NTVUuIERNQSBhY2Nlc3NlcyB0byB0aGUKICAqIGV4Y2x1c2lvbiByYW5nZSBhcmUgcGFzc2VkIHRocm91Z2ggdW50cmFuc2xhdGVkCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpb21tdV9zZXRfZXhjbHVzaW9uX3JhbmdlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQorc3RhdGljIHZvaWQgaW9tbXVfc2V0X2V4Y2x1c2lvbl9yYW5nZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKIHsKIAl1NjQgc3RhcnQgPSBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ICYgUEFHRV9NQVNLOwogCXU2NCBsaW1pdCA9IChzdGFydCArIGlvbW11LT5leGNsdXNpb25fbGVuZ3RoKSAmIFBBR0VfTUFTSzsKQEAgLTIyNSw3ICsyMzEsNyBAQAogfQogCiAvKiBHZW5lcmljIGZ1bmN0aW9ucyB0byBlbmFibGUvZGlzYWJsZSBjZXJ0YWluIGZlYXR1cmVzIG9mIHRoZSBJT01NVS4gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpb21tdV9mZWF0dXJlX2VuYWJsZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgdTggYml0KQorc3RhdGljIHZvaWQgaW9tbXVfZmVhdHVyZV9lbmFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHU4IGJpdCkKIHsKIAl1MzIgY3RybDsKIApAQCAtMjQ0LDcgKzI1MCw3IEBACiB9CiAKIC8qIEZ1bmN0aW9uIHRvIGVuYWJsZSB0aGUgaGFyZHdhcmUgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpb21tdV9lbmFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCitzdGF0aWMgdm9pZCBpb21tdV9lbmFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIElPTU1VOiBFbmFibGluZyBJT01NVSBhdCAlcyBjYXAgMHglaHhcbiIsCiAJICAgICAgIGRldl9uYW1lKCZpb21tdS0+ZGV2LT5kZXYpLCBpb21tdS0+Y2FwX3B0cik7CkBAIC0yNTIsMTEgKzI1OCw5IEBACiAJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfSU9NTVVfRU4pOwogfQogCi0vKiBGdW5jdGlvbiB0byBlbmFibGUgSU9NTVUgZXZlbnQgbG9nZ2luZyBhbmQgZXZlbnQgaW50ZXJydXB0cyAqLwotc3RhdGljIHZvaWQgX19pbml0IGlvbW11X2VuYWJsZV9ldmVudF9sb2dnaW5nKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQorc3RhdGljIHZvaWQgaW9tbXVfZGlzYWJsZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKIHsKLQlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfTE9HX0VOKTsKLQlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfSU5UX0VOKTsKKwlpb21tdV9mZWF0dXJlX2Rpc2FibGUoaW9tbXUsIENPTlRST0xfSU9NTVVfRU4pOwogfQogCiAvKgpAQCAtNDEzLDI1ICs0MTcsMzYgQEAKIHsKIAl1OCAqY21kX2J1ZiA9ICh1OCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCiAJCQlnZXRfb3JkZXIoQ01EX0JVRkZFUl9TSVpFKSk7Ci0JdTY0IGVudHJ5OwogCiAJaWYgKGNtZF9idWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpb21tdS0+Y21kX2J1Zl9zaXplID0gQ01EX0JVRkZFUl9TSVpFOwogCi0JZW50cnkgPSAodTY0KXZpcnRfdG9fcGh5cyhjbWRfYnVmKTsKKwlyZXR1cm4gY21kX2J1ZjsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBjb21tYW5kIGJ1ZmZlciBhZGRyZXNzIHRvIHRoZSBoYXJkd2FyZSBhbmQKKyAqIGVuYWJsZXMgaXQuCisgKi8KK3N0YXRpYyB2b2lkIGlvbW11X2VuYWJsZV9jb21tYW5kX2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3sKKwl1NjQgZW50cnk7CisKKwlCVUdfT04oaW9tbXUtPmNtZF9idWYgPT0gTlVMTCk7CisKKwllbnRyeSA9ICh1NjQpdmlydF90b19waHlzKGlvbW11LT5jbWRfYnVmKTsKIAllbnRyeSB8PSBNTUlPX0NNRF9TSVpFXzUxMjsKKwogCW1lbWNweV90b2lvKGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9CVUZfT0ZGU0VULAotCQkJJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKwkJICAgICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CiAKIAkvKiBzZXQgaGVhZCBhbmQgdGFpbCB0byB6ZXJvIG1hbnVhbGx5ICovCiAJd3JpdGVsKDB4MDAsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9IRUFEX09GRlNFVCk7CiAJd3JpdGVsKDB4MDAsIGlvbW11LT5tbWlvX2Jhc2UgKyBNTUlPX0NNRF9UQUlMX09GRlNFVCk7CiAKIAlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9DTURCVUZfRU4pOwotCi0JcmV0dXJuIGNtZF9idWY7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBmcmVlX2NvbW1hbmRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQpAQCAtNDQzLDIwICs0NTgsMjcgQEAKIC8qIGFsbG9jYXRlcyB0aGUgbWVtb3J5IHdoZXJlIHRoZSBJT01NVSB3aWxsIGxvZyBpdHMgZXZlbnRzIHRvICovCiBzdGF0aWMgdTggKiBfX2luaXQgYWxsb2NfZXZlbnRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewotCXU2NCBlbnRyeTsKIAlpb21tdS0+ZXZ0X2J1ZiA9ICh1OCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCiAJCQkJCQlnZXRfb3JkZXIoRVZUX0JVRkZFUl9TSVpFKSk7CiAKIAlpZiAoaW9tbXUtPmV2dF9idWYgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKKwlyZXR1cm4gaW9tbXUtPmV2dF9idWY7Cit9CisKK3N0YXRpYyB2b2lkIGlvbW11X2VuYWJsZV9ldmVudF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJdTY0IGVudHJ5OworCisJQlVHX09OKGlvbW11LT5ldnRfYnVmID09IE5VTEwpOworCiAJZW50cnkgPSAodTY0KXZpcnRfdG9fcGh5cyhpb21tdS0+ZXZ0X2J1ZikgfCBFVlRfTEVOX01BU0s7CisKIAltZW1jcHlfdG9pbyhpb21tdS0+bW1pb19iYXNlICsgTU1JT19FVlRfQlVGX09GRlNFVCwKIAkJICAgICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CiAKLQlpb21tdS0+ZXZ0X2J1Zl9zaXplID0gRVZUX0JVRkZFUl9TSVpFOwotCi0JcmV0dXJuIGlvbW11LT5ldnRfYnVmOworCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX0VWVF9MT0dfRU4pOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9ldmVudF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCkBAIC01OTYsMzIgKzYxOCw4MyBAQAogCXAgKz0gc2l6ZW9mKHN0cnVjdCBpdmhkX2hlYWRlcik7CiAJZW5kICs9IGgtPmxlbmd0aDsKIAorCiAJd2hpbGUgKHAgPCBlbmQpIHsKIAkJZSA9IChzdHJ1Y3QgaXZoZF9lbnRyeSAqKXA7CiAJCXN3aXRjaCAoZS0+dHlwZSkgewogCQljYXNlIElWSERfREVWX0FMTDoKKworCQkJRFVNUF9wcmludGsoIiAgREVWX0FMTFx0XHRcdCBmaXJzdCBkZXZpZDogJTAyeDolMDJ4LiV4IgorCQkJCSAgICAiIGxhc3QgZGV2aWNlICUwMng6JTAyeC4leCBmbGFnczogJTAyeFxuIiwKKwkJCQkgICAgUENJX0JVUyhpb21tdS0+Zmlyc3RfZGV2aWNlKSwKKwkJCQkgICAgUENJX1NMT1QoaW9tbXUtPmZpcnN0X2RldmljZSksCisJCQkJICAgIFBDSV9GVU5DKGlvbW11LT5maXJzdF9kZXZpY2UpLAorCQkJCSAgICBQQ0lfQlVTKGlvbW11LT5sYXN0X2RldmljZSksCisJCQkJICAgIFBDSV9TTE9UKGlvbW11LT5sYXN0X2RldmljZSksCisJCQkJICAgIFBDSV9GVU5DKGlvbW11LT5sYXN0X2RldmljZSksCisJCQkJICAgIGUtPmZsYWdzKTsKKwogCQkJZm9yIChkZXZfaSA9IGlvbW11LT5maXJzdF9kZXZpY2U7CiAJCQkJCWRldl9pIDw9IGlvbW11LT5sYXN0X2RldmljZTsgKytkZXZfaSkKIAkJCQlzZXRfZGV2X2VudHJ5X2Zyb21fYWNwaShpb21tdSwgZGV2X2ksCiAJCQkJCQkJZS0+ZmxhZ3MsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgSVZIRF9ERVZfU0VMRUNUOgorCisJCQlEVU1QX3ByaW50aygiICBERVZfU0VMRUNUXHRcdFx0IGRldmlkOiAlMDJ4OiUwMnguJXggIgorCQkJCSAgICAiZmxhZ3M6ICUwMnhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSwKKwkJCQkgICAgZS0+ZmxhZ3MpOworCiAJCQlkZXZpZCA9IGUtPmRldmlkOwogCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldmlkLCBlLT5mbGFncywgMCk7CiAJCQlicmVhazsKIAkJY2FzZSBJVkhEX0RFVl9TRUxFQ1RfUkFOR0VfU1RBUlQ6CisKKwkJCURVTVBfcHJpbnRrKCIgIERFVl9TRUxFQ1RfUkFOR0VfU1RBUlRcdCAiCisJCQkJICAgICJkZXZpZDogJTAyeDolMDJ4LiV4IGZsYWdzOiAlMDJ4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCisJCQkJICAgIGUtPmZsYWdzKTsKKwogCQkJZGV2aWRfc3RhcnQgPSBlLT5kZXZpZDsKIAkJCWZsYWdzID0gZS0+ZmxhZ3M7CiAJCQlleHRfZmxhZ3MgPSAwOwogCQkJYWxpYXMgPSBmYWxzZTsKIAkJCWJyZWFrOwogCQljYXNlIElWSERfREVWX0FMSUFTOgorCisJCQlEVU1QX3ByaW50aygiICBERVZfQUxJQVNcdFx0XHQgZGV2aWQ6ICUwMng6JTAyeC4leCAiCisJCQkJICAgICJmbGFnczogJTAyeCBkZXZpZF90bzogJTAyeDolMDJ4LiV4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCisJCQkJICAgIGUtPmZsYWdzLAorCQkJCSAgICBQQ0lfQlVTKGUtPmV4dCA+PiA4KSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZXh0ID4+IDgpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5leHQgPj4gOCkpOworCiAJCQlkZXZpZCA9IGUtPmRldmlkOwogCQkJZGV2aWRfdG8gPSBlLT5leHQgPj4gODsKLQkJCXNldF9kZXZfZW50cnlfZnJvbV9hY3BpKGlvbW11LCBkZXZpZCwgZS0+ZmxhZ3MsIDApOworCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldmlkX3RvLCBlLT5mbGFncywgMCk7CiAJCQlhbWRfaW9tbXVfYWxpYXNfdGFibGVbZGV2aWRdID0gZGV2aWRfdG87CiAJCQlicmVhazsKIAkJY2FzZSBJVkhEX0RFVl9BTElBU19SQU5HRToKKworCQkJRFVNUF9wcmludGsoIiAgREVWX0FMSUFTX1JBTkdFXHRcdCAiCisJCQkJICAgICJkZXZpZDogJTAyeDolMDJ4LiV4IGZsYWdzOiAlMDJ4ICIKKwkJCQkgICAgImRldmlkX3RvOiAlMDJ4OiUwMnguJXhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSwKKwkJCQkgICAgZS0+ZmxhZ3MsCisJCQkJICAgIFBDSV9CVVMoZS0+ZXh0ID4+IDgpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5leHQgPj4gOCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmV4dCA+PiA4KSk7CisKIAkJCWRldmlkX3N0YXJ0ID0gZS0+ZGV2aWQ7CiAJCQlmbGFncyA9IGUtPmZsYWdzOwogCQkJZGV2aWRfdG8gPSBlLT5leHQgPj4gODsKQEAgLTYyOSwxNyArNzAyLDM5IEBACiAJCQlhbGlhcyA9IHRydWU7CiAJCQlicmVhazsKIAkJY2FzZSBJVkhEX0RFVl9FWFRfU0VMRUNUOgorCisJCQlEVU1QX3ByaW50aygiICBERVZfRVhUX1NFTEVDVFx0XHQgZGV2aWQ6ICUwMng6JTAyeC4leCAiCisJCQkJICAgICJmbGFnczogJTAyeCBleHQ6ICUwOHhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSwKKwkJCQkgICAgZS0+ZmxhZ3MsIGUtPmV4dCk7CisKIAkJCWRldmlkID0gZS0+ZGV2aWQ7CiAJCQlzZXRfZGV2X2VudHJ5X2Zyb21fYWNwaShpb21tdSwgZGV2aWQsIGUtPmZsYWdzLAogCQkJCQkJZS0+ZXh0KTsKIAkJCWJyZWFrOwogCQljYXNlIElWSERfREVWX0VYVF9TRUxFQ1RfUkFOR0U6CisKKwkJCURVTVBfcHJpbnRrKCIgIERFVl9FWFRfU0VMRUNUX1JBTkdFXHQgZGV2aWQ6ICIKKwkJCQkgICAgIiUwMng6JTAyeC4leCBmbGFnczogJTAyeCBleHQ6ICUwOHhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSwKKwkJCQkgICAgZS0+ZmxhZ3MsIGUtPmV4dCk7CisKIAkJCWRldmlkX3N0YXJ0ID0gZS0+ZGV2aWQ7CiAJCQlmbGFncyA9IGUtPmZsYWdzOwogCQkJZXh0X2ZsYWdzID0gZS0+ZXh0OwogCQkJYWxpYXMgPSBmYWxzZTsKIAkJCWJyZWFrOwogCQljYXNlIElWSERfREVWX1JBTkdFX0VORDoKKworCQkJRFVNUF9wcmludGsoIiAgREVWX1JBTkdFX0VORFx0XHQgZGV2aWQ6ICUwMng6JTAyeC4leFxuIiwKKwkJCQkgICAgUENJX0JVUyhlLT5kZXZpZCksCisJCQkJICAgIFBDSV9TTE9UKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX0ZVTkMoZS0+ZGV2aWQpKTsKKwogCQkJZGV2aWQgPSBlLT5kZXZpZDsKIAkJCWZvciAoZGV2X2kgPSBkZXZpZF9zdGFydDsgZGV2X2kgPD0gZGV2aWQ7ICsrZGV2X2kpIHsKIAkJCQlpZiAoYWxpYXMpCkBAIC02NzksNyArNzc0LDcgQEAKIHsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSwgKm5leHQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW9tbXUsIG5leHQsICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkgeworCWZvcl9lYWNoX2lvbW11X3NhZmUoaW9tbXUsIG5leHQpIHsKIAkJbGlzdF9kZWwoJmlvbW11LT5saXN0KTsKIAkJZnJlZV9pb21tdV9vbmUoaW9tbXUpOwogCQlrZnJlZShpb21tdSk7CkBAIC03MTAsNyArODA1LDYgQEAKIAlpZiAoIWlvbW11LT5tbWlvX2Jhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW9tbXVfc2V0X2RldmljZV90YWJsZShpb21tdSk7CiAJaW9tbXUtPmNtZF9idWYgPSBhbGxvY19jb21tYW5kX2J1ZmZlcihpb21tdSk7CiAJaWYgKCFpb21tdS0+Y21kX2J1ZikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03NDYsNiArODQwLDE1IEBACiAJCWggPSAoc3RydWN0IGl2aGRfaGVhZGVyICopcDsKIAkJc3dpdGNoICgqcCkgewogCQljYXNlIEFDUElfSVZIRF9UWVBFOgorCisJCQlEVU1QX3ByaW50aygiSU9NTVU6IGRldmljZTogJTAyeDolMDJ4LiUwMXggY2FwOiAlMDR4ICIKKwkJCQkgICAgInNlZzogJWQgZmxhZ3M6ICUwMXggaW5mbyAlMDR4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGgtPmRldmlkKSwgUENJX1NMT1QoaC0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhoLT5kZXZpZCksIGgtPmNhcF9wdHIsCisJCQkJICAgIGgtPnBjaV9zZWcsIGgtPmZsYWdzLCBoLT5pbmZvKTsKKwkJCURVTVBfcHJpbnRrKCIgICAgICAgbW1pby1hZGRyOiAlMDE2bGx4XG4iLAorCQkJCSAgICBoLT5tbWlvX3BoeXMpOworCiAJCQlpb21tdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbWRfaW9tbXUpLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChpb21tdSA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOwpAQCAtNzczLDU2ICs4NzYsOSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50IF9faW5pdCBpb21tdV9zZXR1cF9tc2l4KHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQotewotCXN0cnVjdCBhbWRfaW9tbXUgKmN1cnI7Ci0Jc3RydWN0IG1zaXhfZW50cnkgZW50cmllc1szMl07IC8qIG9ubHkgMzIgc3VwcG9ydGVkIGJ5IEFNRCBJT01NVSAqLwotCWludCBudmVjID0gMCwgaTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyciwgJmFtZF9pb21tdV9saXN0LCBsaXN0KSB7Ci0JCWlmIChjdXJyLT5kZXYgPT0gaW9tbXUtPmRldikgewotCQkJZW50cmllc1tudmVjXS5lbnRyeSA9IGN1cnItPmV2dF9tc2lfbnVtOwotCQkJZW50cmllc1tudmVjXS52ZWN0b3IgPSAwOwotCQkJY3Vyci0+aW50X2VuYWJsZWQgPSB0cnVlOwotCQkJbnZlYysrOwotCQl9Ci0JfQotCi0JaWYgKHBjaV9lbmFibGVfbXNpeChpb21tdS0+ZGV2LCBlbnRyaWVzLCBudmVjKSkgewotCQlwY2lfZGlzYWJsZV9tc2l4KGlvbW11LT5kZXYpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnZlYzsgKytpKSB7Ci0JCWludCByID0gcmVxdWVzdF9pcnEoZW50cmllcy0+dmVjdG9yLCBhbWRfaW9tbXVfaW50X2hhbmRsZXIsCi0JCQkJICAgIElSUUZfU0FNUExFX1JBTkRPTSwKLQkJCQkgICAgIkFNRCBJT01NVSIsCi0JCQkJICAgIE5VTEwpOwotCQlpZiAocikKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLW91dF9mcmVlOgotCWZvciAoaSAtPSAxOyBpID49IDA7IC0taSkKLQkJZnJlZV9pcnEoZW50cmllcy0+dmVjdG9yLCBOVUxMKTsKLQotCXBjaV9kaXNhYmxlX21zaXgoaW9tbXUtPmRldik7Ci0KLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGludCBfX2luaXQgaW9tbXVfc2V0dXBfbXNpKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewogCWludCByOwotCXN0cnVjdCBhbWRfaW9tbXUgKmN1cnI7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cnIsICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkgewotCQlpZiAoY3Vyci0+ZGV2ID09IGlvbW11LT5kZXYpCi0JCQljdXJyLT5pbnRfZW5hYmxlZCA9IHRydWU7Ci0JfQotCiAKIAlpZiAocGNpX2VuYWJsZV9tc2koaW9tbXUtPmRldikpCiAJCXJldHVybiAxOwpAQCAtODM3LDE3ICs4OTMsMTggQEAKIAkJcmV0dXJuIDE7CiAJfQogCisJaW9tbXUtPmludF9lbmFibGVkID0gdHJ1ZTsKKwlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfSU5UX0VOKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBpb21tdV9pbml0X21zaShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3N0YXRpYyBpbnQgaW9tbXVfaW5pdF9tc2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7CiAJaWYgKGlvbW11LT5pbnRfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShpb21tdS0+ZGV2LCBQQ0lfQ0FQX0lEX01TSVgpKQotCQlyZXR1cm4gaW9tbXVfc2V0dXBfbXNpeChpb21tdSk7Ci0JZWxzZSBpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShpb21tdS0+ZGV2LCBQQ0lfQ0FQX0lEX01TSSkpCisJaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaW9tbXUtPmRldiwgUENJX0NBUF9JRF9NU0kpKQogCQlyZXR1cm4gaW9tbXVfc2V0dXBfbXNpKGlvbW11KTsKIAogCXJldHVybiAxOwpAQCAtODk5LDYgKzk1Niw3IEBACiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3VuaXR5X21hcF9yYW5nZShzdHJ1Y3QgaXZtZF9oZWFkZXIgKm0pCiB7CiAJc3RydWN0IHVuaXR5X21hcF9lbnRyeSAqZSA9IDA7CisJY2hhciAqczsKIAogCWUgPSBremFsbG9jKHNpemVvZigqZSksIEdGUF9LRVJORUwpOwogCWlmIChlID09IE5VTEwpCkBAIC05MDYsMTQgKzk2NCwxOSBAQAogCiAJc3dpdGNoIChtLT50eXBlKSB7CiAJZGVmYXVsdDoKKwkJa2ZyZWUoZSk7CisJCXJldHVybiAwOwogCWNhc2UgQUNQSV9JVk1EX1RZUEU6CisJCXMgPSAiSVZNRF9UWVBFaVx0XHRcdCI7CiAJCWUtPmRldmlkX3N0YXJ0ID0gZS0+ZGV2aWRfZW5kID0gbS0+ZGV2aWQ7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9JVk1EX1RZUEVfQUxMOgorCQlzID0gIklWTURfVFlQRV9BTExcdFx0IjsKIAkJZS0+ZGV2aWRfc3RhcnQgPSAwOwogCQllLT5kZXZpZF9lbmQgPSBhbWRfaW9tbXVfbGFzdF9iZGY7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9JVk1EX1RZUEVfUkFOR0U6CisJCXMgPSAiSVZNRF9UWVBFX1JBTkdFXHRcdCI7CiAJCWUtPmRldmlkX3N0YXJ0ID0gbS0+ZGV2aWQ7CiAJCWUtPmRldmlkX2VuZCA9IG0tPmF1eDsKIAkJYnJlYWs7CkBAIC05MjIsNiArOTg1LDEzIEBACiAJZS0+YWRkcmVzc19lbmQgPSBlLT5hZGRyZXNzX3N0YXJ0ICsgUEFHRV9BTElHTihtLT5yYW5nZV9sZW5ndGgpOwogCWUtPnByb3QgPSBtLT5mbGFncyA+PiAxOwogCisJRFVNUF9wcmludGsoIiVzIGRldmlkX3N0YXJ0OiAlMDJ4OiUwMnguJXggZGV2aWRfZW5kOiAlMDJ4OiUwMnguJXgiCisJCSAgICAiIHJhbmdlX3N0YXJ0OiAlMDE2bGx4IHJhbmdlX2VuZDogJTAxNmxseCBmbGFnczogJXhcbiIsIHMsCisJCSAgICBQQ0lfQlVTKGUtPmRldmlkX3N0YXJ0KSwgUENJX1NMT1QoZS0+ZGV2aWRfc3RhcnQpLAorCQkgICAgUENJX0ZVTkMoZS0+ZGV2aWRfc3RhcnQpLCBQQ0lfQlVTKGUtPmRldmlkX2VuZCksCisJCSAgICBQQ0lfU0xPVChlLT5kZXZpZF9lbmQpLCBQQ0lfRlVOQyhlLT5kZXZpZF9lbmQpLAorCQkgICAgZS0+YWRkcmVzc19zdGFydCwgZS0+YWRkcmVzc19lbmQsIG0tPmZsYWdzKTsKKwogCWxpc3RfYWRkX3RhaWwoJmUtPmxpc3QsICZhbWRfaW9tbXVfdW5pdHlfbWFwKTsKIAogCXJldHVybiAwOwpAQCAtOTY3LDE4ICsxMDM3LDI4IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGZpbmFsbHkgZW5hYmxlcyBhbGwgSU9NTVVzIGZvdW5kIGluIHRoZSBzeXN0ZW0gYWZ0ZXIKICAqIHRoZXkgaGF2ZSBiZWVuIGluaXRpYWxpemVkCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBlbmFibGVfaW9tbXVzKHZvaWQpCitzdGF0aWMgdm9pZCBlbmFibGVfaW9tbXVzKHZvaWQpCiB7CiAJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvbW11LCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpIHsKKwlmb3JfZWFjaF9pb21tdShpb21tdSkgeworCQlpb21tdV9zZXRfZGV2aWNlX3RhYmxlKGlvbW11KTsKKwkJaW9tbXVfZW5hYmxlX2NvbW1hbmRfYnVmZmVyKGlvbW11KTsKKwkJaW9tbXVfZW5hYmxlX2V2ZW50X2J1ZmZlcihpb21tdSk7CiAJCWlvbW11X3NldF9leGNsdXNpb25fcmFuZ2UoaW9tbXUpOwogCQlpb21tdV9pbml0X21zaShpb21tdSk7Ci0JCWlvbW11X2VuYWJsZV9ldmVudF9sb2dnaW5nKGlvbW11KTsKIAkJaW9tbXVfZW5hYmxlKGlvbW11KTsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGRpc2FibGVfaW9tbXVzKHZvaWQpCit7CisJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CisKKwlmb3JfZWFjaF9pb21tdShpb21tdSkKKwkJaW9tbXVfZGlzYWJsZShpb21tdSk7Cit9CisKIC8qCiAgKiBTdXNwZW5kL1Jlc3VtZSBzdXBwb3J0CiAgKiBkaXNhYmxlIHN1c3BlbmQgdW50aWwgcmVhbCByZXN1bWUgaW1wbGVtZW50ZWQKQEAgLTk4NiwxMiArMTA2NiwzMSBAQAogCiBzdGF0aWMgaW50IGFtZF9pb21tdV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKIHsKKwkvKgorCSAqIERpc2FibGUgSU9NTVVzIGJlZm9yZSByZXByb2dyYW1taW5nIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMuCisJICogSU9NTVUgaXMgc3RpbGwgZW5hYmxlZCBmcm9tIHRoZSByZXN1bWUga2VybmVsLgorCSAqLworCWRpc2FibGVfaW9tbXVzKCk7CisKKwkvKiByZS1sb2FkIHRoZSBoYXJkd2FyZSAqLworCWVuYWJsZV9pb21tdXMoKTsKKworCS8qCisJICogd2UgaGF2ZSB0byBmbHVzaCBhZnRlciB0aGUgSU9NTVVzIGFyZSBlbmFibGVkIGJlY2F1c2UgYQorCSAqIGRpc2FibGVkIElPTU1VIHdpbGwgbmV2ZXIgZXhlY3V0ZSB0aGUgY29tbWFuZHMgd2Ugc2VuZAorCSAqLworCWFtZF9pb21tdV9mbHVzaF9hbGxfZG9tYWlucygpOworCWFtZF9pb21tdV9mbHVzaF9hbGxfZGV2aWNlcygpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYW1kX2lvbW11X3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCXJldHVybiAtRUlOVkFMOworCS8qIGRpc2FibGUgSU9NTVVzIHRvIGdvIG91dCBvZiB0aGUgd2F5IGZvciBCSU9TICovCisJZGlzYWJsZV9pb21tdXMoKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyBhbWRfaW9tbXVfc3lzZGV2X2NsYXNzID0gewpAQCAtMTEzNyw5ICsxMjM2LDYgQEAKIAogCWVuYWJsZV9pb21tdXMoKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkFNRCBJT01NVTogYXBlcnR1cmUgc2l6ZSBpcyAlZCBNQlxuIiwKLQkJCSgxIDw8IChhbWRfaW9tbXVfYXBlcnR1cmVfb3JkZXItMjApKSk7Ci0KIAlwcmludGsoS0VSTl9JTkZPICJBTUQgSU9NTVU6IGRldmljZSBpc29sYXRpb24gIik7CiAJaWYgKGFtZF9pb21tdV9pc29sYXRlKQogCQlwcmludGsoImVuYWJsZWRcbiIpOwpAQCAtMTIxMSw2ICsxMzA3LDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FtZF9pb21tdV9kdW1wKGNoYXIgKnN0cikKK3sKKwlhbWRfaW9tbXVfZHVtcCA9IHRydWU7CisKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBfX2luaXQgcGFyc2VfYW1kX2lvbW11X29wdGlvbnMoY2hhciAqc3RyKQogewogCWZvciAoOyAqc3RyOyArK3N0cikgewpAQCAtMTIyNSwxNSArMTMyOCw1IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FtZF9pb21tdV9zaXplX29wdGlvbnMoY2hhciAqc3RyKQotewotCXVuc2lnbmVkIG9yZGVyID0gUEFHRV9TSElGVCArIGdldF9vcmRlcihtZW1wYXJzZShzdHIsICZzdHIpKTsKLQotCWlmICgob3JkZXIgPiAyNCkgJiYgKG9yZGVyIDwgMzEpKQotCQlhbWRfaW9tbXVfYXBlcnR1cmVfb3JkZXIgPSBvcmRlcjsKLQotCXJldHVybiAxOwotfQotCitfX3NldHVwKCJhbWRfaW9tbXVfZHVtcCIsIHBhcnNlX2FtZF9pb21tdV9kdW1wKTsKIF9fc2V0dXAoImFtZF9pb21tdT0iLCBwYXJzZV9hbWRfaW9tbXVfb3B0aW9ucyk7Ci1fX3NldHVwKCJhbWRfaW9tbXVfc2l6ZT0iLCBwYXJzZV9hbWRfaW9tbXVfc2l6ZV9vcHRpb25zKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwppbmRleCBmMjg3MDkyLi4wNzZkMzg4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKglNaWthZWwgUGV0dGVyc3Nvbgk6CVBNIGNvbnZlcnRlZCB0byBkcml2ZXIgbW9kZWwuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpX3BtdG1yLmg+CkBAIC0zNCw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIAorI2luY2x1ZGUgPGFzbS9wZXJmX2NvdW50ZXIuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CkBAIC05OCw2ICsxMDAsMjkgQEAKIC8qIExvY2FsIEFQSUMgd2FzIGRpc2FibGVkIGJ5IHRoZSBCSU9TIGFuZCBlbmFibGVkIGJ5IHRoZSBrZXJuZWwgKi8KIHN0YXRpYyBpbnQgZW5hYmxlZF92aWFfYXBpY2Jhc2U7CiAKKy8qCisgKiBIYW5kbGUgaW50ZXJydXB0IG1vZGUgY29uZmlndXJhdGlvbiByZWdpc3RlciAoSU1DUikuCisgKiBUaGlzIHJlZ2lzdGVyIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGludGVycnVwdCBzaWduYWxzCisgKiB0aGF0IHJlYWNoIHRoZSBCU1AgY29tZSBmcm9tIHRoZSBtYXN0ZXIgUElDIG9yIGZyb20gdGhlCisgKiBsb2NhbCBBUElDLiBCZWZvcmUgZW50ZXJpbmcgU3ltbWV0cmljIEkvTyBNb2RlLCBlaXRoZXIKKyAqIHRoZSBCSU9TIG9yIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG11c3Qgc3dpdGNoIG91dCBvZgorICogUElDIE1vZGUgYnkgY2hhbmdpbmcgdGhlIElNQ1IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbWNyX3BpY190b19hcGljKHZvaWQpCit7CisJLyogc2VsZWN0IElNQ1IgcmVnaXN0ZXIgKi8KKwlvdXRiKDB4NzAsIDB4MjIpOworCS8qIE5NSSBhbmQgODI1OSBJTlRSIGdvIHRocm91Z2ggQVBJQyAqLworCW91dGIoMHgwMSwgMHgyMyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbWNyX2FwaWNfdG9fcGljKHZvaWQpCit7CisJLyogc2VsZWN0IElNQ1IgcmVnaXN0ZXIgKi8KKwlvdXRiKDB4NzAsIDB4MjIpOworCS8qIE5NSSBhbmQgODI1OSBJTlRSIGdvIGRpcmVjdGx5IHRvIEJTUCAqLworCW91dGIoMHgwMCwgMHgyMyk7Cit9CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTExMSwxMyArMTM2LDE5IEBACiBfX3NldHVwKCJhcGljcG10aW1lciIsIHNldHVwX2FwaWNwbXRpbWVyKTsKICNlbmRpZgogCitpbnQgeDJhcGljX21vZGU7CiAjaWZkZWYgQ09ORklHX1g4Nl9YMkFQSUMKLWludCB4MmFwaWM7CiAvKiB4MmFwaWMgZW5hYmxlZCBiZWZvcmUgT1MgaGFuZG92ZXIgKi8KIHN0YXRpYyBpbnQgeDJhcGljX3ByZWVuYWJsZWQ7CiBzdGF0aWMgaW50IGRpc2FibGVfeDJhcGljOwogc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm94MmFwaWMoY2hhciAqc3RyKQogeworCWlmICh4MmFwaWNfZW5hYmxlZCgpKSB7CisJCXByX3dhcm5pbmcoIkJpb3MgYWxyZWFkeSBlbmFibGVkIHgyYXBpYywgIgorCQkJICAgImNhbid0IGVuZm9yY2Ugbm94MmFwaWMiKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJZGlzYWJsZV94MmFwaWMgPSAxOwogCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfWDJBUElDKTsKIAlyZXR1cm4gMDsKQEAgLTIwOSw2ICsyNDAsMzEgQEAKIAlyZXR1cm4gbGFwaWNfZ2V0X3ZlcnNpb24oKSA+PSAweDE0OwogfQogCisvKgorICogYmFyZSBmdW5jdGlvbiB0byBzdWJzdGl0dXRlIHdyaXRlIG9wZXJhdGlvbgorICogYW5kIGl0J3MgX3RoYXRfIGZhc3QgOikKKyAqLworc3RhdGljIHZvaWQgbmF0aXZlX2FwaWNfd3JpdGVfZHVtbXkodTMyIHJlZywgdTMyIHYpCit7CisJV0FSTl9PTl9PTkNFKChjcHVfaGFzX2FwaWMgfHwgIWRpc2FibGVfYXBpYykpOworfQorCitzdGF0aWMgdTMyIG5hdGl2ZV9hcGljX3JlYWRfZHVtbXkodTMyIHJlZykKK3sKKwlXQVJOX09OX09OQ0UoKGNwdV9oYXNfYXBpYyAmJiAhZGlzYWJsZV9hcGljKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByaWdodCBhZnRlciB0aGlzIGNhbGwgYXBpYy0+d3JpdGUvcmVhZCBkb2Vzbid0IGRvIGFueXRoaW5nCisgKiBub3RlIHRoYXQgdGhlcmUgaXMgbm8gcmVzdG9yZSBvcGVyYXRpb24gaXQgd29ya3Mgb25lIHdheQorICovCit2b2lkIGFwaWNfZGlzYWJsZSh2b2lkKQoreworCWFwaWMtPnJlYWQgPSBuYXRpdmVfYXBpY19yZWFkX2R1bW15OworCWFwaWMtPndyaXRlID0gbmF0aXZlX2FwaWNfd3JpdGVfZHVtbXk7Cit9CisKIHZvaWQgbmF0aXZlX2FwaWNfd2FpdF9pY3JfaWRsZSh2b2lkKQogewogCXdoaWxlIChhcGljX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWSkKQEAgLTM0OCw3ICs0MDQsNyBAQAogCiBzdGF0aWMgdm9pZCBzZXR1cF9BUElDX2VpbHZ0KHU4IGx2dF9vZmYsIHU4IHZlY3RvciwgdTggbXNnX3R5cGUsIHU4IG1hc2spCiB7Ci0JdW5zaWduZWQgbG9uZyByZWcgPSAobHZ0X29mZiA8PCA0KSArIEFQSUNfRUlMVlQwOworCXVuc2lnbmVkIGxvbmcgcmVnID0gKGx2dF9vZmYgPDwgNCkgKyBBUElDX0VJTFZUbigwKTsKIAl1bnNpZ25lZCBpbnQgIHYgICA9IChtYXNrIDw8IDE2KSB8IChtc2dfdHlwZSA8PCA4KSB8IHZlY3RvcjsKIAogCWFwaWNfd3JpdGUocmVnLCB2KTsKQEAgLTgxNSw3ICs4NzEsNyBAQAogCXUzMiB2OwogCiAJLyogQVBJQyBoYXNuJ3QgYmVlbiBtYXBwZWQgeWV0ICovCi0JaWYgKCF4MmFwaWMgJiYgIWFwaWNfcGh5cykKKwlpZiAoIXgyYXBpY19tb2RlICYmICFhcGljX3BoeXMpCiAJCXJldHVybjsKIAogCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKQEAgLTExMzMsNiArMTE4OSw3IEBACiAJCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOwogCX0KICNlbmRpZgorCXBlcmZfY291bnRlcnNfbGFwaWNfaW5pdCgpOwogCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAKQEAgLTEyODcsNyArMTM0NCw3IEBACiB7CiAJaWYgKHgyYXBpY19lbmFibGVkKCkpIHsKIAkJcHJfaW5mbygieDJhcGljIGVuYWJsZWQgYnkgQklPUywgc3dpdGNoaW5nIHRvIHgyYXBpYyBvcHNcbiIpOwotCQl4MmFwaWNfcHJlZW5hYmxlZCA9IHgyYXBpYyA9IDE7CisJCXgyYXBpY19wcmVlbmFibGVkID0geDJhcGljX21vZGUgPSAxOwogCX0KIH0KIApAQCAtMTI5NSw3ICsxMzUyLDcgQEAKIHsKIAlpbnQgbXNyLCBtc3IyOwogCi0JaWYgKCF4MmFwaWMpCisJaWYgKCF4MmFwaWNfbW9kZSkKIAkJcmV0dXJuOwogCiAJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIG1zciwgbXNyMik7CkBAIC0xMzA0LDYgKzEzNjEsNyBAQAogCQl3cm1zcihNU1JfSUEzMl9BUElDQkFTRSwgbXNyIHwgWDJBUElDX0VOQUJMRSwgMCk7CiAJfQogfQorI2VuZGlmIC8qIENPTkZJR19YODZfWDJBUElDICovCiAKIHZvaWQgX19pbml0IGVuYWJsZV9JUl94MmFwaWModm9pZCkKIHsKQEAgLTEzMTIsMzIgKzEzNzAsMjEgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICoqaW9hcGljX2VudHJpZXMgPSBOVUxMOwogCi0JaWYgKCFjcHVfaGFzX3gyYXBpYykKLQkJcmV0dXJuOwotCi0JaWYgKCF4MmFwaWNfcHJlZW5hYmxlZCAmJiBkaXNhYmxlX3gyYXBpYykgewotCQlwcl9pbmZvKCJTa2lwcGVkIGVuYWJsaW5nIHgyYXBpYyBhbmQgSW50ZXJydXB0LXJlbWFwcGluZyAiCi0JCQkiYmVjYXVzZSBvZiBub3gyYXBpY1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoeDJhcGljX3ByZWVuYWJsZWQgJiYgZGlzYWJsZV94MmFwaWMpCi0JCXBhbmljKCJCaW9zIGFscmVhZHkgZW5hYmxlZCB4MmFwaWMsIGNhbid0IGVuZm9yY2Ugbm94MmFwaWMiKTsKLQotCWlmICgheDJhcGljX3ByZWVuYWJsZWQgJiYgc2tpcF9pb2FwaWNfc2V0dXApIHsKLQkJcHJfaW5mbygiU2tpcHBlZCBlbmFibGluZyB4MmFwaWMgYW5kIEludGVycnVwdC1yZW1hcHBpbmcgIgotCQkJImJlY2F1c2Ugb2Ygc2tpcHBpbmcgaW8tYXBpYyBzZXR1cFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KIAlyZXQgPSBkbWFyX3RhYmxlX2luaXQoKTsKIAlpZiAocmV0KSB7Ci0JCXByX2luZm8oImRtYXJfdGFibGVfaW5pdCgpIGZhaWxlZCB3aXRoICVkOlxuIiwgcmV0KTsKKwkJcHJfZGVidWcoImRtYXJfdGFibGVfaW5pdCgpIGZhaWxlZCB3aXRoICVkOlxuIiwgcmV0KTsKKwkJZ290byBpcl9mYWlsZWQ7CisJfQogCi0JCWlmICh4MmFwaWNfcHJlZW5hYmxlZCkKLQkJCXBhbmljKCJ4MmFwaWMgZW5hYmxlZCBieSBiaW9zLiBCdXQgSVIgZW5hYmxpbmcgZmFpbGVkIik7Ci0JCWVsc2UKLQkJCXByX2luZm8oIk5vdCBlbmFibGluZyB4MmFwaWMsSW50ci1yZW1hcHBpbmdcbiIpOworCWlmICghaW50cl9yZW1hcHBpbmdfc3VwcG9ydGVkKCkpIHsKKwkJcHJfZGVidWcoImludHItcmVtYXBwaW5nIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlnb3RvIGlyX2ZhaWxlZDsKKwl9CisKKworCWlmICgheDJhcGljX3ByZWVuYWJsZWQgJiYgc2tpcF9pb2FwaWNfc2V0dXApIHsKKwkJcHJfaW5mbygiU2tpcHBlZCBlbmFibGluZyBpbnRyLXJlbWFwIGJlY2F1c2Ugb2Ygc2tpcHBpbmcgIgorCQkJImlvLWFwaWMgc2V0dXBcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMzU3LDE5ICsxNDA0LDE2IEBACiAJbWFza19JT19BUElDX3NldHVwKGlvYXBpY19lbnRyaWVzKTsKIAltYXNrXzgyNTlBKCk7CiAKLQlyZXQgPSBlbmFibGVfaW50cl9yZW1hcHBpbmcoRUlNXzMyQklUX0FQSUNfSUQpOwotCi0JaWYgKHJldCAmJiB4MmFwaWNfcHJlZW5hYmxlZCkgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCXBhbmljKCJ4MmFwaWMgZW5hYmxlZCBieSBiaW9zLiBCdXQgSVIgZW5hYmxpbmcgZmFpbGVkIik7Ci0JfQotCisJcmV0ID0gZW5hYmxlX2ludHJfcmVtYXBwaW5nKHgyYXBpY19zdXBwb3J0ZWQoKSk7CiAJaWYgKHJldCkKIAkJZ290byBlbmRfcmVzdG9yZTsKIAotCWlmICgheDJhcGljKSB7Ci0JCXgyYXBpYyA9IDE7CisJcHJfaW5mbygiRW5hYmxlZCBJbnRlcnJ1cHQtcmVtYXBwaW5nXG4iKTsKKworCWlmICh4MmFwaWNfc3VwcG9ydGVkKCkgJiYgIXgyYXBpY19tb2RlKSB7CisJCXgyYXBpY19tb2RlID0gMTsKIAkJZW5hYmxlX3gyYXBpYygpOworCQlwcl9pbmZvKCJFbmFibGVkIHgyYXBpY1xuIik7CiAJfQogCiBlbmRfcmVzdG9yZToKQEAgLTEzNzgsMzcgKzE0MjIsMzQgQEAKIAkJICogSVIgZW5hYmxpbmcgZmFpbGVkCiAJCSAqLwogCQlyZXN0b3JlX0lPX0FQSUNfc2V0dXAoaW9hcGljX2VudHJpZXMpOwotCWVsc2UKLQkJcmVpbml0X2ludHJfcmVtYXBwZWRfSU9fQVBJQyh4MmFwaWNfcHJlZW5hYmxlZCwgaW9hcGljX2VudHJpZXMpOwogCiAJdW5tYXNrXzgyNTlBKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiBlbmQ6Ci0JaWYgKCFyZXQpIHsKLQkJaWYgKCF4MmFwaWNfcHJlZW5hYmxlZCkKLQkJCXByX2luZm8oIkVuYWJsZWQgeDJhcGljIGFuZCBpbnRlcnJ1cHQtcmVtYXBwaW5nXG4iKTsKLQkJZWxzZQotCQkJcHJfaW5mbygiRW5hYmxlZCBJbnRlcnJ1cHQtcmVtYXBwaW5nXG4iKTsKLQl9IGVsc2UKLQkJcHJfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIEludGVycnVwdC1yZW1hcHBpbmcgYW5kIHgyYXBpY1xuIik7CiAJaWYgKGlvYXBpY19lbnRyaWVzKQogCQlmcmVlX2lvYXBpY19lbnRyaWVzKGlvYXBpY19lbnRyaWVzKTsKKworCWlmICghcmV0KQorCQlyZXR1cm47CisKK2lyX2ZhaWxlZDoKKwlpZiAoeDJhcGljX3ByZWVuYWJsZWQpCisJCXBhbmljKCJ4MmFwaWMgZW5hYmxlZCBieSBiaW9zLiBCdXQgSVIgZW5hYmxpbmcgZmFpbGVkIik7CisJZWxzZSBpZiAoY3B1X2hhc194MmFwaWMpCisJCXByX2luZm8oIk5vdCBlbmFibGluZyB4MmFwaWMsSW50ci1yZW1hcHBpbmdcbiIpOwogI2Vsc2UKIAlpZiAoIWNwdV9oYXNfeDJhcGljKQogCQlyZXR1cm47CiAKIAlpZiAoeDJhcGljX3ByZWVuYWJsZWQpCiAJCXBhbmljKCJ4MmFwaWMgZW5hYmxlZCBwcmlvciBPUyBoYW5kb3ZlciwiCi0JCSAgICAgICIgZW5hYmxlIENPTkZJR19JTlRSX1JFTUFQIik7Ci0KLQlwcl9pbmZvKCJFbmFibGUgQ09ORklHX0lOVFJfUkVNQVAgZm9yIGVuYWJsaW5nIGludHItcmVtYXBwaW5nICIKLQkJIiBhbmQgeDJhcGljXG4iKTsKKwkJICAgICAgIiBlbmFibGUgQ09ORklHX1g4Nl9YMkFQSUMsIENPTkZJR19JTlRSX1JFTUFQIik7CiAjZW5kaWYKIAogCXJldHVybjsKIH0KLSNlbmRpZiAvKiBDT05GSUdfWDg2X1gyQVBJQyAqLworCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAvKgpAQCAtMTQyNSw3ICsxNDY2LDYgQEAKIAl9CiAKIAltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKLQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSAwOwogCXJldHVybiAwOwogfQogI2Vsc2UKQEAgLTE1MzksMzIgKzE1NzksNDkgQEAKICAqLwogdm9pZCBfX2luaXQgaW5pdF9hcGljX21hcHBpbmdzKHZvaWQpCiB7Ci0JaWYgKHgyYXBpYykgeworCXVuc2lnbmVkIGludCBuZXdfYXBpY2lkOworCisJaWYgKHgyYXBpY19tb2RlKSB7CiAJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IHJlYWRfYXBpY19pZCgpOwogCQlyZXR1cm47CiAJfQogCi0JLyoKLQkgKiBJZiBubyBsb2NhbCBBUElDIGNhbiBiZSBmb3VuZCB0aGVuIHNldCB1cCBhIGZha2UgYWxsCi0JICogemVyb2VzIHBhZ2UgdG8gc2ltdWxhdGUgdGhlIGxvY2FsIEFQSUMgYW5kIGFub3RoZXIKLQkgKiBvbmUgZm9yIHRoZSBJTy1BUElDLgotCSAqLworCS8qIElmIG5vIGxvY2FsIEFQSUMgY2FuIGJlIGZvdW5kIHJldHVybiBlYXJseSAqLwogCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiBkZXRlY3RfaW5pdF9BUElDKCkpIHsKLQkJYXBpY19waHlzID0gKHVuc2lnbmVkIGxvbmcpIGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKLQkJYXBpY19waHlzID0gX19wYShhcGljX3BoeXMpOwotCX0gZWxzZQorCQkvKiBsZXRzIE5PUCdpZnkgYXBpYyBvcGVyYXRpb25zICovCisJCXByX2luZm8oIkFQSUM6IGRpc2FibGUgYXBpYyBmYWNpbGl0eVxuIik7CisJCWFwaWNfZGlzYWJsZSgpOworCX0gZWxzZSB7CiAJCWFwaWNfcGh5cyA9IG1wX2xhcGljX2FkZHI7CiAKLQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgYXBpY19waHlzKTsKLQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJtYXBwZWQgQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLAotCQkJCUFQSUNfQkFTRSwgYXBpY19waHlzKTsKKwkJLyoKKwkJICogYWNwaSBsYXBpYyBwYXRoIGFscmVhZHkgbWFwcyB0aGF0IGFkZHJlc3MgaW4KKwkJICogYWNwaV9yZWdpc3Rlcl9sYXBpY19hZGRyZXNzKCkKKwkJICovCisJCWlmICghYWNwaV9sYXBpYykKKwkJCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBhcGljX3BoeXMpOworCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIm1hcHBlZCBBUElDIHRvICUwOGx4ICglMDhseClcbiIsCisJCQkJCUFQSUNfQkFTRSwgYXBpY19waHlzKTsKKwl9CiAKIAkvKgogCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKIAkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgogCSAqLwotCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQotCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSByZWFkX2FwaWNfaWQoKTsKKwluZXdfYXBpY2lkID0gcmVhZF9hcGljX2lkKCk7CisJaWYgKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCAhPSBuZXdfYXBpY2lkKSB7CisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IG5ld19hcGljaWQ7CisJCS8qCisJCSAqIHllYWggLS0gd2UgbGllIGFib3V0IGFwaWNfdmVyc2lvbgorCQkgKiBpbiBjYXNlIGlmIGFwaWMgd2FzIGRpc2FibGVkIHZpYSBib290IG9wdGlvbgorCQkgKiBidXQgaXQncyBub3QgYSBwcm9ibGVtIGZvciBTTVAgY29tcGlsZWQga2VybmVsCisJCSAqIHNpbmNlIHNtcF9zYW5pdHlfY2hlY2sgaXMgcHJlcGFyZWQgZm9yIHN1Y2ggYSBjYXNlCisJCSAqIGFuZCBkaXNhYmxlIHNtcCBtb2RlCisJCSAqLworCQlhcGljX3ZlcnNpb25bbmV3X2FwaWNpZF0gPQorCQkJIEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJfQogfQogCiAvKgpAQCAtMTczMyw4ICsxNzkwLDcgQEAKIAkJICovCiAJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImxlYXZpbmcgUElDIG1vZGUsICIKIAkJCQkiZW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7Ci0JCW91dGIoMHg3MCwgMHgyMik7Ci0JCW91dGIoMHgwMSwgMHgyMyk7CisJCWltY3JfcGljX3RvX2FwaWMoKTsKIAl9CiAjZW5kaWYKIAlpZiAoYXBpYy0+ZW5hYmxlX2FwaWNfbW9kZSkKQEAgLTE3NjIsOCArMTgxOCw3IEBACiAJCSAqLwogCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJkaXNhYmxpbmcgQVBJQyBtb2RlLCAiCiAJCQkJImVudGVyaW5nIFBJQyBtb2RlLlxuIik7Ci0JCW91dGIoMHg3MCwgMHgyMik7Ci0JCW91dGIoMHgwMCwgMHgyMyk7CisJCWltY3JfYXBpY190b19waWMoKTsKIAkJcmV0dXJuOwogCX0KICNlbmRpZgpAQCAtMTk2OSwxMCArMjAyNCwxMCBAQAogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWRpc2FibGVfbG9jYWxfQVBJQygpOwotI2lmZGVmIENPTkZJR19JTlRSX1JFTUFQCisKIAlpZiAoaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkKIAkJZGlzYWJsZV9pbnRyX3JlbWFwcGluZygpOwotI2VuZGlmCisKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTgyLDQyICsyMDM3LDM0IEBACiAJdW5zaWduZWQgaW50IGwsIGg7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgbWF4bHZ0OwotCi0jaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICoqaW9hcGljX2VudHJpZXMgPSBOVUxMOwogCiAJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKIAkJcmV0dXJuIDA7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKHgyYXBpYykgeworCWlmIChpbnRyX3JlbWFwcGluZ19lbmFibGVkKSB7CiAJCWlvYXBpY19lbnRyaWVzID0gYWxsb2NfaW9hcGljX2VudHJpZXMoKTsKIAkJaWYgKCFpb2FwaWNfZW50cmllcykgewogCQkJV0FSTigxLCAiQWxsb2MgaW9hcGljX2VudHJpZXMgaW4gbGFwaWMgcmVzdW1lIGZhaWxlZC4iKTsKLQkJCXJldHVybiAtRU5PTUVNOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gcmVzdG9yZTsKIAkJfQogCiAJCXJldCA9IHNhdmVfSU9fQVBJQ19zZXR1cChpb2FwaWNfZW50cmllcyk7CiAJCWlmIChyZXQpIHsKIAkJCVdBUk4oMSwgIlNhdmluZyBJTy1BUElDIHN0YXRlIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCQlmcmVlX2lvYXBpY19lbnRyaWVzKGlvYXBpY19lbnRyaWVzKTsKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIHJlc3RvcmU7CiAJCX0KIAogCQltYXNrX0lPX0FQSUNfc2V0dXAoaW9hcGljX2VudHJpZXMpOwogCQltYXNrXzgyNTlBKCk7Ci0JCWVuYWJsZV94MmFwaWMoKTsKIAl9Ci0jZWxzZQotCWlmICghYXBpY19wbV9zdGF0ZS5hY3RpdmUpCi0JCXJldHVybiAwOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmICh4MmFwaWMpCisJaWYgKHgyYXBpY19tb2RlKQogCQllbmFibGVfeDJhcGljKCk7Ci0jZW5kaWYKLQogCWVsc2UgewogCQkvKgogCQkgKiBNYWtlIHN1cmUgdGhlIEFQSUNCQVNFIHBvaW50cyB0byB0aGUgcmlnaHQgYWRkcmVzcwpAQCAtMjA1NSwyMSArMjEwMiwxNiBAQAogCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOwogCWFwaWNfcmVhZChBUElDX0VTUik7CiAKLSNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAotCWlmIChpbnRyX3JlbWFwcGluZ19lbmFibGVkKQotCQlyZWVuYWJsZV9pbnRyX3JlbWFwcGluZyhFSU1fMzJCSVRfQVBJQ19JRCk7Ci0KLQlpZiAoeDJhcGljKSB7CisJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpIHsKKwkJcmVlbmFibGVfaW50cl9yZW1hcHBpbmcoeDJhcGljX21vZGUpOwogCQl1bm1hc2tfODI1OUEoKTsKIAkJcmVzdG9yZV9JT19BUElDX3NldHVwKGlvYXBpY19lbnRyaWVzKTsKIAkJZnJlZV9pb2FwaWNfZW50cmllcyhpb2FwaWNfZW50cmllcyk7CiAJfQotI2VuZGlmCi0KK3Jlc3RvcmU6CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMjExNywzMSArMjE1OSwxNCBAQAogI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAotLyoKLSAqIGFwaWNfaXNfY2x1c3RlcmVkX2JveCgpIC0tIENoZWNrIGlmIHdlIGNhbiBleHBlY3QgZ29vZCBUU0MKLSAqCi0gKiBUaHVzIGZhciwgdGhlIG1ham9yIHVzZXIgb2YgdGhpcyBpcyBJQk0ncyBTdW1taXQyIHNlcmllczoKLSAqCi0gKiBDbHVzdGVyZWQgYm94ZXMgbWF5IGhhdmUgdW5zeW5jZWQgVFNDIHByb2JsZW1zIGlmIHRoZXkgYXJlCi0gKiBtdWx0aS1jaGFzc2lzLiBVc2UgYXZhaWxhYmxlIGRhdGEgdG8gdGFrZSBhIGdvb2QgZ3Vlc3MuCi0gKiBJZiBpbiBkb3VidCwgZ28gSFBFVC4KLSAqLwotX19jcHVpbml0IGludCBhcGljX2lzX2NsdXN0ZXJlZF9ib3godm9pZCkKKworc3RhdGljIGludCBfX2NwdWluaXQgYXBpY19jbHVzdGVyX251bSh2b2lkKQogewogCWludCBpLCBjbHVzdGVycywgemVyb3M7CiAJdW5zaWduZWQgaWQ7CiAJdTE2ICpiaW9zX2NwdV9hcGljaWQ7CiAJREVDTEFSRV9CSVRNQVAoY2x1c3Rlcm1hcCwgTlVNX0FQSUNfQ0xVU1RFUlMpOwogCi0JLyoKLQkgKiB0aGVyZSBpcyBub3QgdGhpcyBraW5kIG9mIGJveCB3aXRoIEFNRCBDUFUgeWV0LgotCSAqIFNvbWUgQU1EIGJveCB3aXRoIHF1YWRjb3JlIGNwdSBhbmQgOCBzb2NrZXRzIGFwaWNpZAotCSAqIHdpbGwgYmUgWzQsIDB4MjNdIG9yIFs4LCAweDI3XSBjb3VsZCBiZSB0aG91Z2h0IHRvCi0JICogdnNtcCBib3ggc3RpbGwgbmVlZCBjaGVja2luZy4uLgotCSAqLwotCWlmICgoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKSAmJiAhaXNfdnNtcF9ib3goKSkKLQkJcmV0dXJuIDA7Ci0KIAliaW9zX2NwdV9hcGljaWQgPSBlYXJseV9wZXJfY3B1X3B0cih4ODZfYmlvc19jcHVfYXBpY2lkKTsKIAliaXRtYXBfemVybyhjbHVzdGVybWFwLCBOVU1fQVBJQ19DTFVTVEVSUyk7CiAKQEAgLTIxNzcsMTggKzIyMDIsNjcgQEAKIAkJCSsremVyb3M7CiAJfQogCi0JLyogU2NhbGVNUCB2U01Qb3dlcmVkIGJveGVzIGhhdmUgb25lIGNsdXN0ZXIgcGVyIGJvYXJkIGFuZCBUU0NzIGFyZQotCSAqIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNlZCBiZXR3ZWVuIGJvYXJkcwotCSAqLwotCWlmIChpc192c21wX2JveCgpICYmIGNsdXN0ZXJzID4gMSkKKwlyZXR1cm4gY2x1c3RlcnM7Cit9CisKK3N0YXRpYyBpbnQgX19jcHVpbml0ZGF0YSBtdWx0aV9jaGVja2VkOworc3RhdGljIGludCBfX2NwdWluaXRkYXRhIG11bHRpOworCitzdGF0aWMgaW50IF9fY3B1aW5pdCBzZXRfbXVsdGkoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJaWYgKG11bHRpKQorCQlyZXR1cm4gMDsKKwlwcl9pbmZvKCJBUElDOiAlcyBkZXRlY3RlZCwgTXVsdGkgQ2hhc3Npc1xuIiwgZC0+aWRlbnQpOworCW11bHRpID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IF9fY3B1aW5pdGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIG11bHRpX2RtaV90YWJsZVtdID0geworCXsKKwkJLmNhbGxiYWNrID0gc2V0X211bHRpLAorCQkuaWRlbnQgPSAiSUJNIFN5c3RlbSBTdW1taXQyIiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJJQk0iKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiU3VtbWl0MiIpLAorCQl9LAorCX0sCisJe30KK307CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkbWlfY2hlY2tfbXVsdGkodm9pZCkKK3sKKwlpZiAobXVsdGlfY2hlY2tlZCkKKwkJcmV0dXJuOworCisJZG1pX2NoZWNrX3N5c3RlbShtdWx0aV9kbWlfdGFibGUpOworCW11bHRpX2NoZWNrZWQgPSAxOworfQorCisvKgorICogYXBpY19pc19jbHVzdGVyZWRfYm94KCkgLS0gQ2hlY2sgaWYgd2UgY2FuIGV4cGVjdCBnb29kIFRTQworICoKKyAqIFRodXMgZmFyLCB0aGUgbWFqb3IgdXNlciBvZiB0aGlzIGlzIElCTSdzIFN1bW1pdDIgc2VyaWVzOgorICogQ2x1c3RlcmVkIGJveGVzIG1heSBoYXZlIHVuc3luY2VkIFRTQyBwcm9ibGVtcyBpZiB0aGV5IGFyZQorICogbXVsdGktY2hhc3Npcy4KKyAqIFVzZSBETUkgdG8gY2hlY2sgdGhlbQorICovCitfX2NwdWluaXQgaW50IGFwaWNfaXNfY2x1c3RlcmVkX2JveCh2b2lkKQoreworCWRtaV9jaGVja19tdWx0aSgpOworCWlmIChtdWx0aSkKIAkJcmV0dXJuIDE7CiAKKwlpZiAoIWlzX3ZzbXBfYm94KCkpCisJCXJldHVybiAwOworCiAJLyoKLQkgKiBJZiBjbHVzdGVycyA+IDIsIHRoZW4gc2hvdWxkIGJlIG11bHRpLWNoYXNzaXMuCi0JICogTWF5IGhhdmUgdG8gcmV2aXNpdCB0aGlzIHdoZW4gbXVsdGktY29yZSArIGh5cGVydGhyZWFkZWQgQ1BVcyBjb21lCi0JICogb3V0LCBidXQgQUZBSUsgdGhpcyB3aWxsIHdvcmsgZXZlbiBmb3IgdGhlbS4KKwkgKiBTY2FsZU1QIHZTTVBvd2VyZWQgYm94ZXMgaGF2ZSBvbmUgY2x1c3RlciBwZXIgYm9hcmQgYW5kIFRTQ3MgYXJlCisJICogbm90IGd1YXJhbnRlZWQgdG8gYmUgc3luY2VkIGJldHdlZW4gYm9hcmRzCiAJICovCi0JcmV0dXJuIChjbHVzdGVycyA+IDIpOworCWlmIChhcGljX2NsdXN0ZXJfbnVtKCkgPiAxKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMKaW5kZXggMzA2ZTVlOC4uZDBjOTlhYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCiBzdGF0aWMgaW50IGZsYXRfcGh5c19wa2dfaWQoaW50IGluaXRpYWxfYXBpY19pZCwgaW50IGluZGV4X21zYikKIHsKLQlyZXR1cm4gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgPj4gaW5kZXhfbXNiOworCXJldHVybiBpbml0aWFsX2FwaWNfaWQgPj4gaW5kZXhfbXNiOwogfQogCiBzdHJ1Y3QgYXBpYyBhcGljX2ZsYXQgPSAgewpAQCAtMjM1LDcgKzIzNSw3IEBACiAJICogcmVnYXJkbGVzcyBvZiBob3cgbWFueSBwcm9jZXNzb3JzIGFyZSBwcmVzZW50ICh4ODZfNjQgRVM3MDAwCiAJICogaXMgYW4gZXhhbXBsZSkuCiAJICovCi0JaWYgKGFjcGlfZ2JsX0ZBRFQuaGVhZGVyLnJldmlzaW9uID4gRkFEVDJfUkVWSVNJT05fSUQgJiYKKwlpZiAoYWNwaV9nYmxfRkFEVC5oZWFkZXIucmV2aXNpb24gPj0gRkFEVDJfUkVWSVNJT05fSUQgJiYKIAkJKGFjcGlfZ2JsX0ZBRFQuZmxhZ3MgJiBBQ1BJX0ZBRFRfQVBJQ19QSFlTSUNBTCkpIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgInN5c3RlbSBBUElDIG9ubHkgY2FuIHVzZSBwaHlzaWNhbCBmbGF0Iik7CiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9lczcwMDBfMzIuYwppbmRleCAzMDI5NDc3Li42OTMyOGFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9lczcwMDBfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9lczcwMDBfMzIuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJcmV0dXJuIGdzaTsKIH0KIAotc3RhdGljIGludCB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfbWlwKGludCBjcHUsIHVuc2lnbmVkIGxvbmcgZWlwKQorc3RhdGljIGludCBfX2NwdWluaXQgd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX21pcChpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGVpcCkKIHsKIAl1bnNpZ25lZCBsb25nIHZlY3QgPSAwLCBwc2FpdmFsID0gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCmluZGV4IDMwZGE2MTcuLjk0NjA1ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKQEAgLTU5LDYgKzU5LDcgQEAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlbWFwcGluZy5oPgogI2luY2x1ZGUgPGFzbS9ocGV0Lmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS91di91dl9odWIuaD4KICNpbmNsdWRlIDxhc20vdXYvdXZfaXJxLmg+CiAKQEAgLTEyOSwxMiArMTMwLDkgQEAKIAlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICpuZXh0OwogfTsKIAotc3RhdGljIHN0cnVjdCBpcnFfcGluX2xpc3QgKmdldF9vbmVfZnJlZV9pcnFfMl9waW4oaW50IGNwdSkKK3N0YXRpYyBzdHJ1Y3QgaXJxX3Bpbl9saXN0ICpnZXRfb25lX2ZyZWVfaXJxXzJfcGluKGludCBub2RlKQogewogCXN0cnVjdCBpcnFfcGluX2xpc3QgKnBpbjsKLQlpbnQgbm9kZTsKLQotCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwogCiAJcGluID0ga3phbGxvY19ub2RlKHNpemVvZigqcGluKSwgR0ZQX0FUT01JQywgbm9kZSk7CiAKQEAgLTE0OCw5ICsxNDYsNiBAQAogCXVuc2lnbmVkIG1vdmVfY2xlYW51cF9jb3VudDsKIAl1OCB2ZWN0b3I7CiAJdTggbW92ZV9pbl9wcm9ncmVzcyA6IDE7Ci0jaWZkZWYgQ09ORklHX05VTUFfTUlHUkFURV9JUlFfREVTQwotCXU4IG1vdmVfZGVzY19wZW5kaW5nIDogMTsKLSNlbmRpZgogfTsKIAogLyogaXJxX2NmZyBpcyBpbmRleGVkIGJ5IHRoZSBzdW0gb2YgYWxsIFJURXMgaW4gYWxsIEkvTyBBUElDcy4gKi8KQEAgLTE4MiwxNiArMTc3LDE4IEBACiAJc3RydWN0IGlycV9jZmcgKmNmZzsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJaW50IGNvdW50OworCWludCBub2RlOwogCWludCBpOwogCiAJY2ZnID0gaXJxX2NmZ3g7CiAJY291bnQgPSBBUlJBWV9TSVpFKGlycV9jZmd4KTsKKwlub2RlPSBjcHVfdG9fbm9kZShib290X2NwdV9pZCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlkZXNjID0gaXJxX3RvX2Rlc2MoaSk7CiAJCWRlc2MtPmNoaXBfZGF0YSA9ICZjZmdbaV07Ci0JCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJmNmZ1tpXS5kb21haW4pOwotCQlhbGxvY19ib290bWVtX2NwdW1hc2tfdmFyKCZjZmdbaV0ub2xkX2RvbWFpbik7CisJCWFsbG9jX2NwdW1hc2tfdmFyX25vZGUoJmNmZ1tpXS5kb21haW4sIEdGUF9OT1dBSVQsIG5vZGUpOworCQlhbGxvY19jcHVtYXNrX3Zhcl9ub2RlKCZjZmdbaV0ub2xkX2RvbWFpbiwgR0ZQX05PV0FJVCwgbm9kZSk7CiAJCWlmIChpIDwgTlJfSVJRU19MRUdBQ1kpCiAJCQljcHVtYXNrX3NldGFsbChjZmdbaV0uZG9tYWluKTsKIAl9CkBAIC0yMTIsMTIgKzIwOSw5IEBACiAJcmV0dXJuIGNmZzsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2ZnICpnZXRfb25lX2ZyZWVfaXJxX2NmZyhpbnQgY3B1KQorc3RhdGljIHN0cnVjdCBpcnFfY2ZnICpnZXRfb25lX2ZyZWVfaXJxX2NmZyhpbnQgbm9kZSkKIHsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwotCWludCBub2RlOwotCi0Jbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CiAKIAljZmcgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpjZmcpLCBHRlBfQVRPTUlDLCBub2RlKTsKIAlpZiAoY2ZnKSB7CkBAIC0yMzgsMTMgKzIzMiwxMyBAQAogCXJldHVybiBjZmc7CiB9CiAKLWludCBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSkKK2ludCBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9jZmcgKmNmZzsKIAogCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKIAlpZiAoIWNmZykgewotCQlkZXNjLT5jaGlwX2RhdGEgPSBnZXRfb25lX2ZyZWVfaXJxX2NmZyhjcHUpOworCQlkZXNjLT5jaGlwX2RhdGEgPSBnZXRfb25lX2ZyZWVfaXJxX2NmZyhub2RlKTsKIAkJaWYgKCFkZXNjLT5jaGlwX2RhdGEpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiY2FuIG5vdCBhbGxvYyBpcnFfY2ZnXG4iKTsKIAkJCUJVR19PTigxKTsKQEAgLTI1NCwxMCArMjQ4LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MKLQorLyogZm9yIG1vdmVfaXJxX2Rlc2MgKi8KIHN0YXRpYyB2b2lkCi1pbml0X2NvcHlfaXJxXzJfcGluKHN0cnVjdCBpcnFfY2ZnICpvbGRfY2ZnLCBzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBpbnQgY3B1KQoraW5pdF9jb3B5X2lycV8yX3BpbihzdHJ1Y3QgaXJxX2NmZyAqb2xkX2NmZywgc3RydWN0IGlycV9jZmcgKmNmZywgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9waW5fbGlzdCAqb2xkX2VudHJ5LCAqaGVhZCwgKnRhaWwsICplbnRyeTsKIApAQCAtMjY2LDcgKzI1OSw3IEBACiAJaWYgKCFvbGRfZW50cnkpCiAJCXJldHVybjsKIAotCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3BpbihjcHUpOworCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3Bpbihub2RlKTsKIAlpZiAoIWVudHJ5KQogCQlyZXR1cm47CiAKQEAgLTI3Niw3ICsyNjksNyBAQAogCXRhaWwJCT0gZW50cnk7CiAJb2xkX2VudHJ5CT0gb2xkX2VudHJ5LT5uZXh0OwogCXdoaWxlIChvbGRfZW50cnkpIHsKLQkJZW50cnkgPSBnZXRfb25lX2ZyZWVfaXJxXzJfcGluKGNwdSk7CisJCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3Bpbihub2RlKTsKIAkJaWYgKCFlbnRyeSkgewogCQkJZW50cnkgPSBoZWFkOwogCQkJd2hpbGUgKGVudHJ5KSB7CkBAIC0zMTYsMTIgKzMwOSwxMiBAQAogfQogCiB2b2lkIGFyY2hfaW5pdF9jb3B5X2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAotCQkJCSBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUpCisJCQkJIHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9jZmcgKmNmZzsKIAlzdHJ1Y3QgaXJxX2NmZyAqb2xkX2NmZzsKIAotCWNmZyA9IGdldF9vbmVfZnJlZV9pcnFfY2ZnKGNwdSk7CisJY2ZnID0gZ2V0X29uZV9mcmVlX2lycV9jZmcobm9kZSk7CiAKIAlpZiAoIWNmZykKIAkJcmV0dXJuOwpAQCAtMzMyLDcgKzMyNSw3IEBACiAKIAltZW1jcHkoY2ZnLCBvbGRfY2ZnLCBzaXplb2Yoc3RydWN0IGlycV9jZmcpKTsKIAotCWluaXRfY29weV9pcnFfMl9waW4ob2xkX2NmZywgY2ZnLCBjcHUpOworCWluaXRfY29weV9pcnFfMl9waW4ob2xkX2NmZywgY2ZnLCBub2RlKTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9pcnFfY2ZnKHN0cnVjdCBpcnFfY2ZnICpvbGRfY2ZnKQpAQCAtMzU2LDE5ICszNDksNyBAQAogCQlvbGRfZGVzYy0+Y2hpcF9kYXRhID0gTlVMTDsKIAl9CiB9Ci0KLXN0YXRpYyB2b2lkCi1zZXRfZXh0cmFfbW92ZV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCi17Ci0Jc3RydWN0IGlycV9jZmcgKmNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQotCWlmICghY2ZnLT5tb3ZlX2luX3Byb2dyZXNzKSB7Ci0JCS8qIGl0IG1lYW5zIHRoYXQgZG9tYWluIGlzIG5vdCBjaGFuZ2VkICovCi0JCWlmICghY3B1bWFza19pbnRlcnNlY3RzKGRlc2MtPmFmZmluaXR5LCBtYXNrKSkKLQkJCWNmZy0+bW92ZV9kZXNjX3BlbmRpbmcgPSAxOwotCX0KLX0KLSNlbmRpZgorLyogZW5kIGZvciBtb3ZlX2lycV9kZXNjICovCiAKICNlbHNlCiBzdGF0aWMgc3RydWN0IGlycV9jZmcgKmlycV9jZmcodW5zaWduZWQgaW50IGlycSkKQEAgLTM3OCwxMyArMzU5LDYgQEAKIAogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX05VTUFfTUlHUkFURV9JUlFfREVTQwotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfZXh0cmFfbW92ZV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCi17Ci19Ci0jZW5kaWYKLQogc3RydWN0IGlvX2FwaWMgewogCXVuc2lnbmVkIGludCBpbmRleDsKIAl1bnNpZ25lZCBpbnQgdW51c2VkWzNdOwpAQCAtNTE4LDEzMiArNDkyLDE4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIH0KIAotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIHNlbmRfY2xlYW51cF92ZWN0b3Ioc3RydWN0IGlycV9jZmcgKmNmZykKLXsKLQljcHVtYXNrX3Zhcl90IGNsZWFudXBfbWFzazsKLQotCWlmICh1bmxpa2VseSghYWxsb2NfY3B1bWFza192YXIoJmNsZWFudXBfbWFzaywgR0ZQX0FUT01JQykpKSB7Ci0JCXVuc2lnbmVkIGludCBpOwotCQljZmctPm1vdmVfY2xlYW51cF9jb3VudCA9IDA7Ci0JCWZvcl9lYWNoX2NwdV9hbmQoaSwgY2ZnLT5vbGRfZG9tYWluLCBjcHVfb25saW5lX21hc2spCi0JCQljZmctPm1vdmVfY2xlYW51cF9jb3VudCsrOwotCQlmb3JfZWFjaF9jcHVfYW5kKGksIGNmZy0+b2xkX2RvbWFpbiwgY3B1X29ubGluZV9tYXNrKQotCQkJYXBpYy0+c2VuZF9JUElfbWFzayhjcHVtYXNrX29mKGkpLCBJUlFfTU9WRV9DTEVBTlVQX1ZFQ1RPUik7Ci0JfSBlbHNlIHsKLQkJY3B1bWFza19hbmQoY2xlYW51cF9tYXNrLCBjZmctPm9sZF9kb21haW4sIGNwdV9vbmxpbmVfbWFzayk7Ci0JCWNmZy0+bW92ZV9jbGVhbnVwX2NvdW50ID0gY3B1bWFza193ZWlnaHQoY2xlYW51cF9tYXNrKTsKLQkJYXBpYy0+c2VuZF9JUElfbWFzayhjbGVhbnVwX21hc2ssIElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SKTsKLQkJZnJlZV9jcHVtYXNrX3ZhcihjbGVhbnVwX21hc2spOwotCX0KLQljZmctPm1vdmVfaW5fcHJvZ3Jlc3MgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBfX3RhcmdldF9JT19BUElDX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZGVzdCwgc3RydWN0IGlycV9jZmcgKmNmZykKLXsKLQlpbnQgYXBpYywgcGluOwotCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5OwotCXU4IHZlY3RvciA9IGNmZy0+dmVjdG9yOwotCi0JZW50cnkgPSBjZmctPmlycV8yX3BpbjsKLQlmb3IgKDs7KSB7Ci0JCXVuc2lnbmVkIGludCByZWc7Ci0KLQkJaWYgKCFlbnRyeSkKLQkJCWJyZWFrOwotCi0JCWFwaWMgPSBlbnRyeS0+YXBpYzsKLQkJcGluID0gZW50cnktPnBpbjsKLQkJLyoKLQkJICogV2l0aCBpbnRlcnJ1cHQtcmVtYXBwaW5nLCBkZXN0aW5hdGlvbiBpbmZvcm1hdGlvbiBjb21lcwotCQkgKiBmcm9tIGludGVycnVwdC1yZW1hcHBpbmcgdGFibGUgZW50cnkuCi0JCSAqLwotCQlpZiAoIWlycV9yZW1hcHBlZChpcnEpKQotCQkJaW9fYXBpY193cml0ZShhcGljLCAweDExICsgcGluKjIsIGRlc3QpOwotCQlyZWcgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMCArIHBpbioyKTsKLQkJcmVnICY9IH5JT19BUElDX1JFRElSX1ZFQ1RPUl9NQVNLOwotCQlyZWcgfD0gdmVjdG9yOwotCQlpb19hcGljX21vZGlmeShhcGljLCAweDEwICsgcGluKjIsIHJlZyk7Ci0JCWlmICghZW50cnktPm5leHQpCi0JCQlicmVhazsKLQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLWFzc2lnbl9pcnFfdmVjdG9yKGludCBpcnEsIHN0cnVjdCBpcnFfY2ZnICpjZmcsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKTsKLQotLyoKLSAqIEVpdGhlciBzZXRzIGRlc2MtPmFmZmluaXR5IHRvIGEgdmFsaWQgdmFsdWUsIGFuZCByZXR1cm5zCi0gKiAtPmNwdV9tYXNrX3RvX2FwaWNpZCBvZiB0aGF0LCBvciByZXR1cm5zIEJBRF9BUElDSUQgYW5kCi0gKiBsZWF2ZXMgZGVzYy0+YWZmaW5pdHkgdW50b3VjaGVkLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zZXRfZGVzY19hZmZpbml0eShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQotewotCXN0cnVjdCBpcnFfY2ZnICpjZmc7Ci0JdW5zaWduZWQgaW50IGlycTsKLQotCWlmICghY3B1bWFza19pbnRlcnNlY3RzKG1hc2ssIGNwdV9vbmxpbmVfbWFzaykpCi0JCXJldHVybiBCQURfQVBJQ0lEOwotCi0JaXJxID0gZGVzYy0+aXJxOwotCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIG1hc2spKQotCQlyZXR1cm4gQkFEX0FQSUNJRDsKLQotCS8qIGNoZWNrIHRoYXQgYmVmb3JlIGRlc2MtPmFkZGluaXR5IGdldCB1cGRhdGVkICovCi0Jc2V0X2V4dHJhX21vdmVfZGVzYyhkZXNjLCBtYXNrKTsKLQotCWNwdW1hc2tfY29weShkZXNjLT5hZmZpbml0eSwgbWFzayk7Ci0KLQlyZXR1cm4gYXBpYy0+Y3B1X21hc2tfdG9fYXBpY2lkX2FuZChkZXNjLT5hZmZpbml0eSwgY2ZnLT5kb21haW4pOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQotewotCXN0cnVjdCBpcnFfY2ZnICpjZmc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgZGVzdDsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCi0JaXJxID0gZGVzYy0+aXJxOwotCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCWRlc3QgPSBzZXRfZGVzY19hZmZpbml0eShkZXNjLCBtYXNrKTsKLQlpZiAoZGVzdCAhPSBCQURfQVBJQ0lEKSB7Ci0JCS8qIE9ubHkgdGhlIGhpZ2ggOCBiaXRzIGFyZSB2YWxpZC4gKi8KLQkJZGVzdCA9IFNFVF9BUElDX0xPR0lDQUxfSUQoZGVzdCk7Ci0JCV9fdGFyZ2V0X0lPX0FQSUNfaXJxKGlycSwgZGVzdCwgY2ZnKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQotewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKLQotCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCi0Jc2V0X2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhkZXNjLCBtYXNrKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi0KIC8qCiAgKiBUaGUgY29tbW9uIGNhc2UgaXMgMToxIElSUTwtPnBpbiBtYXBwaW5ncy4gU29tZXRpbWVzIHRoZXJlIGFyZQogICogc2hhcmVkIElTQS1zcGFjZSBJUlFzLCBzbyB3ZSBoYXZlIHRvIHN1cHBvcnQgdGhlbS4gV2UgYXJlIHN1cGVyCiAgKiBmYXN0IGluIHRoZSBjb21tb24gY2FzZSwgYW5kIGZhc3QgZm9yIHNoYXJlZCBJU0Etc3BhY2UgSVJRcy4KICAqLwotc3RhdGljIHZvaWQgYWRkX3Bpbl90b19pcnFfY3B1KHN0cnVjdCBpcnFfY2ZnICpjZmcsIGludCBjcHUsIGludCBhcGljLCBpbnQgcGluKQorc3RhdGljIHZvaWQgYWRkX3Bpbl90b19pcnFfbm9kZShzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBpbnQgbm9kZSwgaW50IGFwaWMsIGludCBwaW4pCiB7CiAJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnk7CiAKIAllbnRyeSA9IGNmZy0+aXJxXzJfcGluOwogCWlmICghZW50cnkpIHsKLQkJZW50cnkgPSBnZXRfb25lX2ZyZWVfaXJxXzJfcGluKGNwdSk7CisJCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3Bpbihub2RlKTsKIAkJaWYgKCFlbnRyeSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4gbm90IGFsbG9jIGlycV8yX3BpbiB0byBhZGQgJWQgLSAlZFxuIiwKIAkJCQkJYXBpYywgcGluKTsKQEAgLTY2Myw3ICs1MjMsNyBAQAogCQllbnRyeSA9IGVudHJ5LT5uZXh0OwogCX0KIAotCWVudHJ5LT5uZXh0ID0gZ2V0X29uZV9mcmVlX2lycV8yX3BpbihjcHUpOworCWVudHJ5LT5uZXh0ID0gZ2V0X29uZV9mcmVlX2lycV8yX3Bpbihub2RlKTsKIAllbnRyeSA9IGVudHJ5LT5uZXh0OwogCWVudHJ5LT5hcGljID0gYXBpYzsKIAllbnRyeS0+cGluID0gcGluOwpAQCAtNjcyLDcgKzUzMiw3IEBACiAvKgogICogUmVyb3V0ZSBhbiBJUlEgdG8gYSBkaWZmZXJlbnQgcGluLgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVwbGFjZV9waW5fYXRfaXJxX2NwdShzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBpbnQgY3B1LAorc3RhdGljIHZvaWQgX19pbml0IHJlcGxhY2VfcGluX2F0X2lycV9ub2RlKHN0cnVjdCBpcnFfY2ZnICpjZmcsIGludCBub2RlLAogCQkJCSAgICAgIGludCBvbGRhcGljLCBpbnQgb2xkcGluLAogCQkJCSAgICAgIGludCBuZXdhcGljLCBpbnQgbmV3cGluKQogewpAQCAtNjkyLDcgKzU1Miw3IEBACiAKIAkvKiB3aHk/IGNhbGwgcmVwbGFjZSBiZWZvcmUgYWRkPyAqLwogCWlmICghcmVwbGFjZWQpCi0JCWFkZF9waW5fdG9faXJxX2NwdShjZmcsIGNwdSwgbmV3YXBpYywgbmV3cGluKTsKKwkJYWRkX3Bpbl90b19pcnFfbm9kZShjZmcsIG5vZGUsIG5ld2FwaWMsIG5ld3Bpbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpb19hcGljX21vZGlmeV9pcnEoc3RydWN0IGlycV9jZmcgKmNmZywKQEAgLTg1MCw3ICs3MTAsNiBAQAogX19zZXR1cCgicGlycT0iLCBpb2FwaWNfcGlycV9zZXR1cCk7CiAjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogCi0jaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKIHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICoqYWxsb2NfaW9hcGljX2VudHJpZXModm9pZCkKIHsKIAlpbnQgYXBpYzsKQEAgLTk0OCwyMCArODA3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByZWluaXRfaW50cl9yZW1hcHBlZF9JT19BUElDKGludCBpbnRyX3JlbWFwcGluZywKLQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzKQotCi17Ci0JLyoKLQkgKiBmb3Igbm93IHBsYWluIHJlc3RvcmUgb2YgcHJldmlvdXMgc2V0dGluZ3MuCi0JICogVEJEOiBJbiB0aGUgY2FzZSBvZiBPUyBlbmFibGluZyBpbnRlcnJ1cHQtcmVtYXBwaW5nLAotCSAqIElPLUFQSUMgUlRFJ3MgbmVlZCB0byBiZSBzZXR1cCB0byBwb2ludCB0byBpbnRlcnJ1cHQtcmVtYXBwaW5nCi0JICogdGFibGUgZW50cmllcy4gZm9yIG5vdywgZG8gYSBwbGFpbiByZXN0b3JlLCBhbmQgd2FpdCBmb3IKLQkgKiB0aGUgc2V0dXBfSU9fQVBJQ19pcnFzKCkgdG8gZG8gcHJvcGVyIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXJlc3RvcmVfSU9fQVBJQ19zZXR1cChpb2FwaWNfZW50cmllcyk7Ci19Ci0KIHZvaWQgZnJlZV9pb2FwaWNfZW50cmllcyhzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzKQogewogCWludCBhcGljOwpAQCAtOTcxLDcgKzgxNiw2IEBACiAKIAlrZnJlZShpb2FwaWNfZW50cmllcyk7CiB9Ci0jZW5kaWYKIAogLyoKICAqIEZpbmQgdGhlIElSUSBlbnRyeSBudW1iZXIgb2YgYSBjZXJ0YWluIHBpbi4KQEAgLTEwMzIsNTQgKzg3Niw2IEBACiAJcmV0dXJuIC0xOwogfQogCi0vKgotICogRmluZCBhIHNwZWNpZmljIFBDSSBJUlEgZW50cnkuCi0gKiBOb3QgYW4gX19pbml0LCBwb3NzaWJseSBuZWVkZWQgYnkgbW9kdWxlcwotICovCi1zdGF0aWMgaW50IHBpbl8yX2lycShpbnQgaWR4LCBpbnQgYXBpYywgaW50IHBpbik7Ci0KLWludCBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IHBpbikKLXsKLQlpbnQgYXBpYywgaSwgYmVzdF9ndWVzcyA9IC0xOwotCi0JYXBpY19wcmludGsoQVBJQ19ERUJVRywgInF1ZXJ5aW5nIFBDSSAtPiBJUlEgbWFwcGluZyBidXM6JWQsIHNsb3Q6JWQsIHBpbjolZC5cbiIsCi0JCWJ1cywgc2xvdCwgcGluKTsKLQlpZiAodGVzdF9iaXQoYnVzLCBtcF9idXNfbm90X3BjaSkpIHsKLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiUENJIEJJT1MgcGFzc2VkIG5vbmV4aXN0ZW50IFBDSSBidXMgJWQhXG4iLCBidXMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBtcF9pcnFfZW50cmllczsgaSsrKSB7Ci0JCWludCBsYnVzID0gbXBfaXJxc1tpXS5zcmNidXM7Ci0KLQkJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykKLQkJCWlmIChtcF9pb2FwaWNzW2FwaWNdLmFwaWNpZCA9PSBtcF9pcnFzW2ldLmRzdGFwaWMgfHwKLQkJCSAgICBtcF9pcnFzW2ldLmRzdGFwaWMgPT0gTVBfQVBJQ19BTEwpCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKCF0ZXN0X2JpdChsYnVzLCBtcF9idXNfbm90X3BjaSkgJiYKLQkJICAgICFtcF9pcnFzW2ldLmlycXR5cGUgJiYKLQkJICAgIChidXMgPT0gbGJ1cykgJiYKLQkJICAgIChzbG90ID09ICgobXBfaXJxc1tpXS5zcmNidXNpcnEgPj4gMikgJiAweDFmKSkpIHsKLQkJCWludCBpcnEgPSBwaW5fMl9pcnEoaSwgYXBpYywgbXBfaXJxc1tpXS5kc3RpcnEpOwotCi0JCQlpZiAoIShhcGljIHx8IElPX0FQSUNfSVJRKGlycSkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocGluID09IChtcF9pcnFzW2ldLnNyY2J1c2lycSAmIDMpKQotCQkJCXJldHVybiBpcnE7Ci0JCQkvKgotCQkJICogVXNlIHRoZSBmaXJzdCBhbGwtYnV0LXBpbiBtYXRjaGluZyBlbnRyeSBhcyBhCi0JCQkgKiBiZXN0LWd1ZXNzIGZ1enp5IHJlc3VsdCBmb3IgYnJva2VuIG1wdGFibGVzLgotCQkJICovCi0JCQlpZiAoYmVzdF9ndWVzcyA8IDApCi0JCQkJYmVzdF9ndWVzcyA9IGlycTsKLQkJfQotCX0KLQlyZXR1cm4gYmVzdF9ndWVzczsKLX0KLQotRVhQT1JUX1NZTUJPTChJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3Rvcik7Ci0KICNpZiBkZWZpbmVkKENPTkZJR19FSVNBKSB8fCBkZWZpbmVkKENPTkZJR19NQ0EpCiAvKgogICogRUlTQSBFZGdlL0xldmVsIGNvbnRyb2wgcmVnaXN0ZXIsIEVMQ1IKQEAgLTEyOTgsNiArMTA5NCw2NCBAQAogCXJldHVybiBpcnE7CiB9CiAKKy8qCisgKiBGaW5kIGEgc3BlY2lmaWMgUENJIElSUSBlbnRyeS4KKyAqIE5vdCBhbiBfX2luaXQsIHBvc3NpYmx5IG5lZWRlZCBieSBtb2R1bGVzCisgKi8KK2ludCBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IHBpbiwKKwkJCQlzdHJ1Y3QgaW9fYXBpY19pcnFfYXR0ciAqaXJxX2F0dHIpCit7CisJaW50IGFwaWMsIGksIGJlc3RfZ3Vlc3MgPSAtMTsKKworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsCisJCSAgICAicXVlcnlpbmcgUENJIC0+IElSUSBtYXBwaW5nIGJ1czolZCwgc2xvdDolZCwgcGluOiVkLlxuIiwKKwkJICAgIGJ1cywgc2xvdCwgcGluKTsKKwlpZiAodGVzdF9iaXQoYnVzLCBtcF9idXNfbm90X3BjaSkpIHsKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLAorCQkJICAgICJQQ0kgQklPUyBwYXNzZWQgbm9uZXhpc3RlbnQgUENJIGJ1cyAlZCFcbiIsIGJ1cyk7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspIHsKKwkJaW50IGxidXMgPSBtcF9pcnFzW2ldLnNyY2J1czsKKworCQlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKQorCQkJaWYgKG1wX2lvYXBpY3NbYXBpY10uYXBpY2lkID09IG1wX2lycXNbaV0uZHN0YXBpYyB8fAorCQkJICAgIG1wX2lycXNbaV0uZHN0YXBpYyA9PSBNUF9BUElDX0FMTCkKKwkJCQlicmVhazsKKworCQlpZiAoIXRlc3RfYml0KGxidXMsIG1wX2J1c19ub3RfcGNpKSAmJgorCQkgICAgIW1wX2lycXNbaV0uaXJxdHlwZSAmJgorCQkgICAgKGJ1cyA9PSBsYnVzKSAmJgorCQkgICAgKHNsb3QgPT0gKChtcF9pcnFzW2ldLnNyY2J1c2lycSA+PiAyKSAmIDB4MWYpKSkgeworCQkJaW50IGlycSA9IHBpbl8yX2lycShpLCBhcGljLCBtcF9pcnFzW2ldLmRzdGlycSk7CisKKwkJCWlmICghKGFwaWMgfHwgSU9fQVBJQ19JUlEoaXJxKSkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChwaW4gPT0gKG1wX2lycXNbaV0uc3JjYnVzaXJxICYgMykpIHsKKwkJCQlzZXRfaW9fYXBpY19pcnFfYXR0cihpcnFfYXR0ciwgYXBpYywKKwkJCQkJCSAgICAgbXBfaXJxc1tpXS5kc3RpcnEsCisJCQkJCQkgICAgIGlycV90cmlnZ2VyKGkpLAorCQkJCQkJICAgICBpcnFfcG9sYXJpdHkoaSkpOworCQkJCXJldHVybiBpcnE7CisJCQl9CisJCQkvKgorCQkJICogVXNlIHRoZSBmaXJzdCBhbGwtYnV0LXBpbiBtYXRjaGluZyBlbnRyeSBhcyBhCisJCQkgKiBiZXN0LWd1ZXNzIGZ1enp5IHJlc3VsdCBmb3IgYnJva2VuIG1wdGFibGVzLgorCQkJICovCisJCQlpZiAoYmVzdF9ndWVzcyA8IDApIHsKKwkJCQlzZXRfaW9fYXBpY19pcnFfYXR0cihpcnFfYXR0ciwgYXBpYywKKwkJCQkJCSAgICAgbXBfaXJxc1tpXS5kc3RpcnEsCisJCQkJCQkgICAgIGlycV90cmlnZ2VyKGkpLAorCQkJCQkJICAgICBpcnFfcG9sYXJpdHkoaSkpOworCQkJCWJlc3RfZ3Vlc3MgPSBpcnE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGJlc3RfZ3Vlc3M7Cit9CitFWFBPUlRfU1lNQk9MKElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKTsKKwogdm9pZCBsb2NrX3ZlY3Rvcl9sb2NrKHZvaWQpCiB7CiAJLyogVXNlZCB0byB0aGUgb25saW5lIHNldCBvZiBjcHVzIGRvZXMgbm90IGNoYW5nZQpAQCAtMTYyOCw1OCArMTQ4Miw3MCBAQAogCWlvYXBpY193cml0ZV9lbnRyeShhcGljX2lkLCBwaW4sIGVudHJ5KTsKIH0KIAorc3RhdGljIHN0cnVjdCB7CisJREVDTEFSRV9CSVRNQVAocGluX3Byb2dyYW1tZWQsIE1QX01BWF9JT0FQSUNfUElOICsgMSk7Cit9IG1wX2lvYXBpY19yb3V0aW5nW01BWF9JT19BUElDU107CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9JT19BUElDX2lycXModm9pZCkKIHsKLQlpbnQgYXBpY19pZCwgcGluLCBpZHgsIGlycTsKKwlpbnQgYXBpY19pZCA9IDAsIHBpbiwgaWR4LCBpcnE7CiAJaW50IG5vdGNvbiA9IDA7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7Ci0JaW50IGNwdSA9IGJvb3RfY3B1X2lkOworCWludCBub2RlID0gY3B1X3RvX25vZGUoYm9vdF9jcHVfaWQpOwogCiAJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHICJpbml0IElPX0FQSUMgSVJRc1xuIik7CiAKLQlmb3IgKGFwaWNfaWQgPSAwOyBhcGljX2lkIDwgbnJfaW9hcGljczsgYXBpY19pZCsrKSB7Ci0JCWZvciAocGluID0gMDsgcGluIDwgbnJfaW9hcGljX3JlZ2lzdGVyc1thcGljX2lkXTsgcGluKyspIHsKKyNpZmRlZiBDT05GSUdfQUNQSQorCWlmICghYWNwaV9kaXNhYmxlZCAmJiBhY3BpX2lvYXBpYykgeworCQlhcGljX2lkID0gbXBfZmluZF9pb2FwaWMoMCk7CisJCWlmIChhcGljX2lkIDwgMCkKKwkJCWFwaWNfaWQgPSAwOworCX0KKyNlbmRpZgogCi0JCQlpZHggPSBmaW5kX2lycV9lbnRyeShhcGljX2lkLCBwaW4sIG1wX0lOVCk7Ci0JCQlpZiAoaWR4ID09IC0xKSB7Ci0JCQkJaWYgKCFub3Rjb24pIHsKLQkJCQkJbm90Y29uID0gMTsKLQkJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLAotCQkJCQkJS0VSTl9ERUJVRyAiICVkLSVkIiwKLQkJCQkJCW1wX2lvYXBpY3NbYXBpY19pZF0uYXBpY2lkLCBwaW4pOwotCQkJCX0gZWxzZQotCQkJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIgJWQtJWQiLAotCQkJCQkJbXBfaW9hcGljc1thcGljX2lkXS5hcGljaWQsIHBpbik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobm90Y29uKSB7CisJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNfaWRdOyBwaW4rKykgeworCQlpZHggPSBmaW5kX2lycV9lbnRyeShhcGljX2lkLCBwaW4sIG1wX0lOVCk7CisJCWlmIChpZHggPT0gLTEpIHsKKwkJCWlmICghbm90Y29uKSB7CisJCQkJbm90Y29uID0gMTsKIAkJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsCi0JCQkJCSIgKGFwaWNpZC1waW4pIG5vdCBjb25uZWN0ZWRcbiIpOwotCQkJCW5vdGNvbiA9IDA7Ci0JCQl9Ci0KLQkJCWlycSA9IHBpbl8yX2lycShpZHgsIGFwaWNfaWQsIHBpbik7Ci0KLQkJCS8qCi0JCQkgKiBTa2lwIHRoZSB0aW1lciBJUlEgaWYgdGhlcmUncyBhIHF1aXJrIGhhbmRsZXIKLQkJCSAqIGluc3RhbGxlZCBhbmQgaWYgaXQgcmV0dXJucyAxOgotCQkJICovCi0JCQlpZiAoYXBpYy0+bXVsdGlfdGltZXJfY2hlY2sgJiYKLQkJCQkJYXBpYy0+bXVsdGlfdGltZXJfY2hlY2soYXBpY19pZCwgaXJxKSkKLQkJCQljb250aW51ZTsKLQotCQkJZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX2NwdShpcnEsIGNwdSk7Ci0JCQlpZiAoIWRlc2MpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJjYW4gbm90IGdldCBpcnFfZGVzYyBmb3IgJWRcbiIsIGlycSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7Ci0JCQlhZGRfcGluX3RvX2lycV9jcHUoY2ZnLCBjcHUsIGFwaWNfaWQsIHBpbik7Ci0KLQkJCXNldHVwX0lPX0FQSUNfaXJxKGFwaWNfaWQsIHBpbiwgaXJxLCBkZXNjLAotCQkJCQlpcnFfdHJpZ2dlcihpZHgpLCBpcnFfcG9sYXJpdHkoaWR4KSk7CisJCQkJCUtFUk5fREVCVUcgIiAlZC0lZCIsCisJCQkJCW1wX2lvYXBpY3NbYXBpY19pZF0uYXBpY2lkLCBwaW4pOworCQkJfSBlbHNlCisJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiICVkLSVkIiwKKwkJCQkJbXBfaW9hcGljc1thcGljX2lkXS5hcGljaWQsIHBpbik7CisJCQljb250aW51ZTsKIAkJfQorCQlpZiAobm90Y29uKSB7CisJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsCisJCQkJIiAoYXBpY2lkLXBpbikgbm90IGNvbm5lY3RlZFxuIik7CisJCQlub3Rjb24gPSAwOworCQl9CisKKwkJaXJxID0gcGluXzJfaXJxKGlkeCwgYXBpY19pZCwgcGluKTsKKworCQkvKgorCQkgKiBTa2lwIHRoZSB0aW1lciBJUlEgaWYgdGhlcmUncyBhIHF1aXJrIGhhbmRsZXIKKwkJICogaW5zdGFsbGVkIGFuZCBpZiBpdCByZXR1cm5zIDE6CisJCSAqLworCQlpZiAoYXBpYy0+bXVsdGlfdGltZXJfY2hlY2sgJiYKKwkJCQlhcGljLT5tdWx0aV90aW1lcl9jaGVjayhhcGljX2lkLCBpcnEpKQorCQkJY29udGludWU7CisKKwkJZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX25vZGUoaXJxLCBub2RlKTsKKwkJaWYgKCFkZXNjKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJjYW4gbm90IGdldCBpcnFfZGVzYyBmb3IgJWRcbiIsIGlycSk7CisJCQljb250aW51ZTsKKwkJfQorCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJCWFkZF9waW5fdG9faXJxX25vZGUoY2ZnLCBub2RlLCBhcGljX2lkLCBwaW4pOworCQkvKgorCQkgKiBkb24ndCBtYXJrIGl0IGluIHBpbl9wcm9ncmFtbWVkLCBzbyBsYXRlciBhY3BpIGNvdWxkCisJCSAqIHNldCBpdCBjb3JyZWN0bHkgd2hlbiBpcnEgPCAxNgorCQkgKi8KKwkJc2V0dXBfSU9fQVBJQ19pcnEoYXBpY19pZCwgcGluLCBpcnEsIGRlc2MsCisJCQkJaXJxX3RyaWdnZXIoaWR4KSwgaXJxX3BvbGFyaXR5KGlkeCkpOwogCX0KIAogCWlmIChub3Rjb24pCkBAIC0xODY5LDcgKzE3MzUsNyBAQAogCiBfX2FwaWNkZWJ1Z2luaXQodm9pZCkgcHJpbnRfbG9jYWxfQVBJQyh2b2lkICpkdW1teSkKIHsKLQl1bnNpZ25lZCBpbnQgdiwgdmVyLCBtYXhsdnQ7CisJdW5zaWduZWQgaW50IGksIHYsIHZlciwgbWF4bHZ0OwogCXU2NCBpY3I7CiAKIAlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKQEAgLTE5NTcsNiArMTgyMywxOCBAQAogCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBUTUNDVDogJTA4eFxuIiwgdik7CiAJdiA9IGFwaWNfcmVhZChBUElDX1REQ1IpOwogCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBURENSOiAlMDh4XG4iLCB2KTsKKworCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfRVhUQVBJQykpIHsKKwkJdiA9IGFwaWNfcmVhZChBUElDX0VGRUFUKTsKKwkJbWF4bHZ0ID0gKHYgPj4gMTYpICYgMHhmZjsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIEVGRUFUOiAlMDh4XG4iLCB2KTsKKwkJdiA9IGFwaWNfcmVhZChBUElDX0VDVFJMKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIEVDVFJMOiAlMDh4XG4iLCB2KTsKKwkJZm9yIChpID0gMDsgaSA8IG1heGx2dDsgaSsrKSB7CisJCQl2ID0gYXBpY19yZWFkKEFQSUNfRUlMVlRuKGkpKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBFSUxWVCVkOiAlMDh4XG4iLCBpLCB2KTsKKwkJfQorCX0KIAlwcmludGsoIlxuIik7CiB9CiAKQEAgLTIwMDUsNiArMTg4MywxMSBAQAogX19hcGljZGVidWdpbml0KGludCkgcHJpbnRfYWxsX0lDcyh2b2lkKQogewogCXByaW50X1BJQygpOworCisJLyogZG9uJ3QgcHJpbnQgb3V0IGlmIGFwaWMgaXMgbm90IHRoZXJlICovCisJaWYgKCFjcHVfaGFzX2FwaWMgfHwgZGlzYWJsZV9hcGljKQorCQlyZXR1cm4gMDsKKwogCXByaW50X2FsbF9sb2NhbF9BUElDcygpOwogCXByaW50X0lPX0FQSUMoKTsKIApAQCAtMjM2MCw2ICsyMjQzLDExOCBAQAogICovCiAKICNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgdm9pZCBzZW5kX2NsZWFudXBfdmVjdG9yKHN0cnVjdCBpcnFfY2ZnICpjZmcpCit7CisJY3B1bWFza192YXJfdCBjbGVhbnVwX21hc2s7CisKKwlpZiAodW5saWtlbHkoIWFsbG9jX2NwdW1hc2tfdmFyKCZjbGVhbnVwX21hc2ssIEdGUF9BVE9NSUMpKSkgeworCQl1bnNpZ25lZCBpbnQgaTsKKwkJY2ZnLT5tb3ZlX2NsZWFudXBfY291bnQgPSAwOworCQlmb3JfZWFjaF9jcHVfYW5kKGksIGNmZy0+b2xkX2RvbWFpbiwgY3B1X29ubGluZV9tYXNrKQorCQkJY2ZnLT5tb3ZlX2NsZWFudXBfY291bnQrKzsKKwkJZm9yX2VhY2hfY3B1X2FuZChpLCBjZmctPm9sZF9kb21haW4sIGNwdV9vbmxpbmVfbWFzaykKKwkJCWFwaWMtPnNlbmRfSVBJX21hc2soY3B1bWFza19vZihpKSwgSVJRX01PVkVfQ0xFQU5VUF9WRUNUT1IpOworCX0gZWxzZSB7CisJCWNwdW1hc2tfYW5kKGNsZWFudXBfbWFzaywgY2ZnLT5vbGRfZG9tYWluLCBjcHVfb25saW5lX21hc2spOworCQljZmctPm1vdmVfY2xlYW51cF9jb3VudCA9IGNwdW1hc2tfd2VpZ2h0KGNsZWFudXBfbWFzayk7CisJCWFwaWMtPnNlbmRfSVBJX21hc2soY2xlYW51cF9tYXNrLCBJUlFfTU9WRV9DTEVBTlVQX1ZFQ1RPUik7CisJCWZyZWVfY3B1bWFza192YXIoY2xlYW51cF9tYXNrKTsKKwl9CisJY2ZnLT5tb3ZlX2luX3Byb2dyZXNzID0gMDsKK30KKworc3RhdGljIHZvaWQgX190YXJnZXRfSU9fQVBJQ19pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGRlc3QsIHN0cnVjdCBpcnFfY2ZnICpjZmcpCit7CisJaW50IGFwaWMsIHBpbjsKKwlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeTsKKwl1OCB2ZWN0b3IgPSBjZmctPnZlY3RvcjsKKworCWVudHJ5ID0gY2ZnLT5pcnFfMl9waW47CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBpbnQgcmVnOworCisJCWlmICghZW50cnkpCisJCQlicmVhazsKKworCQlhcGljID0gZW50cnktPmFwaWM7CisJCXBpbiA9IGVudHJ5LT5waW47CisJCS8qCisJCSAqIFdpdGggaW50ZXJydXB0LXJlbWFwcGluZywgZGVzdGluYXRpb24gaW5mb3JtYXRpb24gY29tZXMKKwkJICogZnJvbSBpbnRlcnJ1cHQtcmVtYXBwaW5nIHRhYmxlIGVudHJ5LgorCQkgKi8KKwkJaWYgKCFpcnFfcmVtYXBwZWQoaXJxKSkKKwkJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIHBpbioyLCBkZXN0KTsKKwkJcmVnID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTAgKyBwaW4qMik7CisJCXJlZyAmPSB+SU9fQVBJQ19SRURJUl9WRUNUT1JfTUFTSzsKKwkJcmVnIHw9IHZlY3RvcjsKKwkJaW9fYXBpY19tb2RpZnkoYXBpYywgMHgxMCArIHBpbioyLCByZWcpOworCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJYnJlYWs7CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW50Cithc3NpZ25faXJxX3ZlY3RvcihpbnQgaXJxLCBzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CisKKy8qCisgKiBFaXRoZXIgc2V0cyBkZXNjLT5hZmZpbml0eSB0byBhIHZhbGlkIHZhbHVlLCBhbmQgcmV0dXJucworICogLT5jcHVfbWFza190b19hcGljaWQgb2YgdGhhdCwgb3IgcmV0dXJucyBCQURfQVBJQ0lEIGFuZAorICogbGVhdmVzIGRlc2MtPmFmZmluaXR5IHVudG91Y2hlZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorc2V0X2Rlc2NfYWZmaW5pdHkoc3RydWN0IGlycV9kZXNjICpkZXNjLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3sKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOworCXVuc2lnbmVkIGludCBpcnE7CisKKwlpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhtYXNrLCBjcHVfb25saW5lX21hc2spKQorCQlyZXR1cm4gQkFEX0FQSUNJRDsKKworCWlycSA9IGRlc2MtPmlycTsKKwljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgY2ZnLCBtYXNrKSkKKwkJcmV0dXJuIEJBRF9BUElDSUQ7CisKKwljcHVtYXNrX2NvcHkoZGVzYy0+YWZmaW5pdHksIG1hc2spOworCisJcmV0dXJuIGFwaWMtPmNwdV9tYXNrX3RvX2FwaWNpZF9hbmQoZGVzYy0+YWZmaW5pdHksIGNmZy0+ZG9tYWluKTsKK30KKworc3RhdGljIGludAorc2V0X2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQoreworCXN0cnVjdCBpcnFfY2ZnICpjZmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZGVzdDsKKwl1bnNpZ25lZCBpbnQgaXJxOworCWludCByZXQgPSAtMTsKKworCWlycSA9IGRlc2MtPmlycTsKKwljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlkZXN0ID0gc2V0X2Rlc2NfYWZmaW5pdHkoZGVzYywgbWFzayk7CisJaWYgKGRlc3QgIT0gQkFEX0FQSUNJRCkgeworCQkvKiBPbmx5IHRoZSBoaWdoIDggYml0cyBhcmUgdmFsaWQuICovCisJCWRlc3QgPSBTRVRfQVBJQ19MT0dJQ0FMX0lEKGRlc3QpOworCQlfX3RhcmdldF9JT19BUElDX2lycShpcnEsIGRlc3QsIGNmZyk7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitzZXRfaW9hcGljX2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisKKwlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCXJldHVybiBzZXRfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOworfQogCiAjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKIApAQCAtMjM3NCwyNiArMjM2OSwyNSBAQAogICogUmVhbCB2ZWN0b3IgdGhhdCBpcyB1c2VkIGZvciBpbnRlcnJ1cHRpbmcgY3B1IHdpbGwgYmUgY29taW5nIGZyb20KICAqIHRoZSBpbnRlcnJ1cHQtcmVtYXBwaW5nIHRhYmxlIGVudHJ5LgogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogbWlncmF0ZV9pb2FwaWNfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwogCXN0cnVjdCBpcnRlIGlydGU7CiAJdW5zaWduZWQgaW50IGRlc3Q7CiAJdW5zaWduZWQgaW50IGlycTsKKwlpbnQgcmV0ID0gLTE7CiAKIAlpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhtYXNrLCBjcHVfb25saW5lX21hc2spKQotCQlyZXR1cm47CisJCXJldHVybiByZXQ7CiAKIAlpcnEgPSBkZXNjLT5pcnE7CiAJaWYgKGdldF9pcnRlKGlycSwgJmlydGUpKQotCQlyZXR1cm47CisJCXJldHVybiByZXQ7CiAKIAljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CiAJaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgY2ZnLCBtYXNrKSkKLQkJcmV0dXJuOwotCi0Jc2V0X2V4dHJhX21vdmVfZGVzYyhkZXNjLCBtYXNrKTsKKwkJcmV0dXJuIHJldDsKIAogCWRlc3QgPSBhcGljLT5jcHVfbWFza190b19hcGljaWRfYW5kKGNmZy0+ZG9tYWluLCBtYXNrKTsKIApAQCAtMjQwOSwyNyArMjQwMywzMCBAQAogCQlzZW5kX2NsZWFudXBfdmVjdG9yKGNmZyk7CiAKIAljcHVtYXNrX2NvcHkoZGVzYy0+YWZmaW5pdHksIG1hc2spOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBNaWdyYXRlcyB0aGUgSVJRIGRlc3RpbmF0aW9uIGluIHRoZSBwcm9jZXNzIGNvbnRleHQuCiAgKi8KLXN0YXRpYyB2b2lkIHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLAorc3RhdGljIGludCBzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewotCW1pZ3JhdGVfaW9hcGljX2lycV9kZXNjKGRlc2MsIG1hc2spOworCXJldHVybiBtaWdyYXRlX2lvYXBpY19pcnFfZGVzYyhkZXNjLCBtYXNrKTsKIH0KLXN0YXRpYyB2b2lkIHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsCitzdGF0aWMgaW50IHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAKLQlzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOworCXJldHVybiBzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLAogCQkJCQkJICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtMjQ5MSw4NiArMjQ4OCwxOSBAQAogCXN0cnVjdCBpcnFfY2ZnICpjZmcgPSBkZXNjLT5jaGlwX2RhdGE7CiAJdW5zaWduZWQgdmVjdG9yLCBtZTsKIAotCWlmIChsaWtlbHkoIWNmZy0+bW92ZV9pbl9wcm9ncmVzcykpIHsKLSNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRFX0lSUV9ERVNDCi0JCWlmIChsaWtlbHkoIWNmZy0+bW92ZV9kZXNjX3BlbmRpbmcpKQotCQkJcmV0dXJuOwotCi0JCS8qIGRvbWFpbiBoYXMgbm90IGNoYW5nZWQsIGJ1dCBhZmZpbml0eSBkaWQgKi8KLQkJbWUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWlmIChjcHVtYXNrX3Rlc3RfY3B1KG1lLCBkZXNjLT5hZmZpbml0eSkpIHsKLQkJCSpkZXNjcCA9IGRlc2MgPSBtb3ZlX2lycV9kZXNjKGRlc2MsIG1lKTsKLQkJCS8qIGdldCB0aGUgbmV3IG9uZSAqLwotCQkJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwotCQkJY2ZnLT5tb3ZlX2Rlc2NfcGVuZGluZyA9IDA7Ci0JCX0KLSNlbmRpZgorCWlmIChsaWtlbHkoIWNmZy0+bW92ZV9pbl9wcm9ncmVzcykpCiAJCXJldHVybjsKLQl9CiAKIAl2ZWN0b3IgPSB+Z2V0X2lycV9yZWdzKCktPm9yaWdfYXg7CiAJbWUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAodmVjdG9yID09IGNmZy0+dmVjdG9yICYmIGNwdW1hc2tfdGVzdF9jcHUobWUsIGNmZy0+ZG9tYWluKSkgewotI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MKLQkJKmRlc2NwID0gZGVzYyA9IG1vdmVfaXJxX2Rlc2MoZGVzYywgbWUpOwotCQkvKiBnZXQgdGhlIG5ldyBvbmUgKi8KLQkJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwotI2VuZGlmCisJaWYgKHZlY3RvciA9PSBjZmctPnZlY3RvciAmJiBjcHVtYXNrX3Rlc3RfY3B1KG1lLCBjZmctPmRvbWFpbikpCiAJCXNlbmRfY2xlYW51cF92ZWN0b3IoY2ZnKTsKLQl9CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGlycV9jb21wbGV0ZV9tb3ZlKHN0cnVjdCBpcnFfZGVzYyAqKmRlc2NwKSB7fQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9fZW9pX2lvYXBpY19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9jZmcgKmNmZykKLXsKLQlpbnQgYXBpYywgcGluOwotCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5OwotCi0JZW50cnkgPSBjZmctPmlycV8yX3BpbjsKLQlmb3IgKDs7KSB7Ci0KLQkJaWYgKCFlbnRyeSkKLQkJCWJyZWFrOwotCi0JCWFwaWMgPSBlbnRyeS0+YXBpYzsKLQkJcGluID0gZW50cnktPnBpbjsKLQkJaW9fYXBpY19lb2koYXBpYywgcGluKTsKLQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1lb2lfaW9hcGljX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGlycV9jZmcgKmNmZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBpcnE7Ci0KLQlpcnEgPSBkZXNjLT5pcnE7Ci0JY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JX19lb2lfaW9hcGljX2lycShpcnEsIGNmZyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi1zdGF0aWMgdm9pZCBhY2tfeDJhcGljX2xldmVsKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQlhY2tfeDJBUElDX2lycSgpOwotCWVvaV9pb2FwaWNfaXJxKGRlc2MpOwotfQotCi1zdGF0aWMgdm9pZCBhY2tfeDJhcGljX2VkZ2UodW5zaWduZWQgaW50IGlycSkKLXsKLQlhY2tfeDJBUElDX2lycSgpOwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIGFja19hcGljX2VkZ2UodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwpAQCAtMjYzNCw5ICsyNTY0LDYgQEAKIAkgKi8KIAlhY2tfQVBJQ19pcnEoKTsKIAotCWlmIChpcnFfcmVtYXBwZWQoaXJxKSkKLQkJZW9pX2lvYXBpY19pcnEoZGVzYyk7Ci0KIAkvKiBOb3cgd2UgY2FuIG1vdmUgYW5kIHJlbmFibGUgdGhlIGlycSAqLwogCWlmICh1bmxpa2VseShkb191bm1hc2tfaXJxKSkgewogCQkvKiBPbmx5IG1pZ3JhdGUgdGhlIGlycSBpZiB0aGUgYWNrIGhhcyBiZWVuIHJlY2VpdmVkLgpAQCAtMjY4MywyMiArMjYxMCw1MCBAQAogfQogCiAjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKK3N0YXRpYyB2b2lkIF9fZW9pX2lvYXBpY19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9jZmcgKmNmZykKK3sKKwlpbnQgYXBpYywgcGluOworCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5OworCisJZW50cnkgPSBjZmctPmlycV8yX3BpbjsKKwlmb3IgKDs7KSB7CisKKwkJaWYgKCFlbnRyeSkKKwkJCWJyZWFrOworCisJCWFwaWMgPSBlbnRyeS0+YXBpYzsKKwkJcGluID0gZW50cnktPnBpbjsKKwkJaW9fYXBpY19lb2koYXBpYywgcGluKTsKKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitlb2lfaW9hcGljX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9jZmcgKmNmZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnE7CisKKwlpcnEgPSBkZXNjLT5pcnE7CisJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJX19lb2lfaW9hcGljX2lycShpcnEsIGNmZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKK30KKwogc3RhdGljIHZvaWQgaXJfYWNrX2FwaWNfZWRnZSh1bnNpZ25lZCBpbnQgaXJxKQogewotI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi0gICAgICAgaWYgKHgyYXBpY19lbmFibGVkKCkpCi0gICAgICAgICAgICAgICByZXR1cm4gYWNrX3gyYXBpY19lZGdlKGlycSk7Ci0jZW5kaWYKLSAgICAgICByZXR1cm4gYWNrX2FwaWNfZWRnZShpcnEpOworCWFja19BUElDX2lycSgpOwogfQogCiBzdGF0aWMgdm9pZCBpcl9hY2tfYXBpY19sZXZlbCh1bnNpZ25lZCBpbnQgaXJxKQogewotI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi0gICAgICAgaWYgKHgyYXBpY19lbmFibGVkKCkpCi0gICAgICAgICAgICAgICByZXR1cm4gYWNrX3gyYXBpY19sZXZlbChpcnEpOwotI2VuZGlmCi0gICAgICAgcmV0dXJuIGFja19hcGljX2xldmVsKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCWFja19BUElDX2lycSgpOworCWVvaV9pb2FwaWNfaXJxKGRlc2MpOwogfQogI2VuZGlmIC8qIENPTkZJR19JTlRSX1JFTUFQICovCiAKQEAgLTI5MDMsNyArMjg1OCw3IEBACiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoMCk7CiAJc3RydWN0IGlycV9jZmcgKmNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQlpbnQgY3B1ID0gYm9vdF9jcHVfaWQ7CisJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShib290X2NwdV9pZCk7CiAJaW50IGFwaWMxLCBwaW4xLCBhcGljMiwgcGluMjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBub19waW4xID0gMDsKQEAgLTI5NjksNyArMjkyNCw3IEBACiAJCSAqIE9rLCBkb2VzIElSUTAgdGhyb3VnaCB0aGUgSU9BUElDIHdvcms/CiAJCSAqLwogCQlpZiAobm9fcGluMSkgewotCQkJYWRkX3Bpbl90b19pcnFfY3B1KGNmZywgY3B1LCBhcGljMSwgcGluMSk7CisJCQlhZGRfcGluX3RvX2lycV9ub2RlKGNmZywgbm9kZSwgYXBpYzEsIHBpbjEpOwogCQkJc2V0dXBfdGltZXJfSVJRMF9waW4oYXBpYzEsIHBpbjEsIGNmZy0+dmVjdG9yKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGZvciBlZGdlIHRyaWdnZXIsIHNldHVwX0lPX0FQSUNfaXJxIGFscmVhZHkKQEAgLTMwMDYsNyArMjk2MSw3IEBACiAJCS8qCiAJCSAqIGxlZ2FjeSBkZXZpY2VzIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gSU8gQVBJQyAjMAogCQkgKi8KLQkJcmVwbGFjZV9waW5fYXRfaXJxX2NwdShjZmcsIGNwdSwgYXBpYzEsIHBpbjEsIGFwaWMyLCBwaW4yKTsKKwkJcmVwbGFjZV9waW5fYXRfaXJxX25vZGUoY2ZnLCBub2RlLCBhcGljMSwgcGluMSwgYXBpYzIsIHBpbjIpOwogCQlzZXR1cF90aW1lcl9JUlEwX3BpbihhcGljMiwgcGluMiwgY2ZnLT52ZWN0b3IpOwogCQllbmFibGVfODI1OUFfaXJxKDApOwogCQlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKQEAgLTMyMTgsMTQgKzMxNzMsMTMgQEAKIC8qCiAgKiBEeW5hbWljIGlycSBhbGxvY2F0ZSBhbmQgZGVhbGxvY2F0aW9uCiAgKi8KLXVuc2lnbmVkIGludCBjcmVhdGVfaXJxX25yKHVuc2lnbmVkIGludCBpcnFfd2FudCkKK3Vuc2lnbmVkIGludCBjcmVhdGVfaXJxX25yKHVuc2lnbmVkIGludCBpcnFfd2FudCwgaW50IG5vZGUpCiB7CiAJLyogQWxsb2NhdGUgYW4gdW51c2VkIGlycSAqLwogCXVuc2lnbmVkIGludCBpcnE7CiAJdW5zaWduZWQgaW50IG5ldzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpcnFfY2ZnICpjZmdfbmV3ID0gTlVMTDsKLQlpbnQgY3B1ID0gYm9vdF9jcHVfaWQ7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjX25ldyA9IE5VTEw7CiAKIAlpcnEgPSAwOwpAQCAtMzIzNCw3ICszMTg4LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOwogCWZvciAobmV3ID0gaXJxX3dhbnQ7IG5ldyA8IG5yX2lycXM7IG5ldysrKSB7Ci0JCWRlc2NfbmV3ID0gaXJxX3RvX2Rlc2NfYWxsb2NfY3B1KG5ldywgY3B1KTsKKwkJZGVzY19uZXcgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKG5ldywgbm9kZSk7CiAJCWlmICghZGVzY19uZXcpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjIGZvciAlZFxuIiwgbmV3KTsKIAkJCWNvbnRpbnVlOwpAQCAtMzI0Myw2ICszMTk3LDkgQEAKIAogCQlpZiAoY2ZnX25ldy0+dmVjdG9yICE9IDApCiAJCQljb250aW51ZTsKKworCQlkZXNjX25ldyA9IG1vdmVfaXJxX2Rlc2MoZGVzY19uZXcsIG5vZGUpOworCiAJCWlmIChfX2Fzc2lnbl9pcnFfdmVjdG9yKG5ldywgY2ZnX25ldywgYXBpYy0+dGFyZ2V0X2NwdXMoKSkgPT0gMCkKIAkJCWlycSA9IG5ldzsKIAkJYnJlYWs7CkBAIC0zMjYwLDExICszMjE3LDEyIEBACiAKIGludCBjcmVhdGVfaXJxKHZvaWQpCiB7CisJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShib290X2NwdV9pZCk7CiAJdW5zaWduZWQgaW50IGlycV93YW50OwogCWludCBpcnE7CiAKIAlpcnFfd2FudCA9IG5yX2lycXNfZ3NpOwotCWlycSA9IGNyZWF0ZV9pcnFfbnIoaXJxX3dhbnQpOworCWlycSA9IGNyZWF0ZV9pcnFfbnIoaXJxX3dhbnQsIG5vZGUpOwogCiAJaWYgKGlycSA9PSAwKQogCQlpcnEgPSAtMTsKQEAgLTMzNjYsNyArMzMyNCw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBzZXRfbXNpX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3N0YXRpYyBpbnQgc2V0X21zaV9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwpAQCAtMzM3NSw3ICszMzMzLDcgQEAKIAogCWRlc3QgPSBzZXRfZGVzY19hZmZpbml0eShkZXNjLCBtYXNrKTsKIAlpZiAoZGVzdCA9PSBCQURfQVBJQ0lEKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKIApAQCAtMzM4NywxMyArMzM0NSwxNSBAQAogCW1zZy5hZGRyZXNzX2xvIHw9IE1TSV9BRERSX0RFU1RfSUQoZGVzdCk7CiAKIAl3cml0ZV9tc2lfbXNnX2Rlc2MoZGVzYywgJm1zZyk7CisKKwlyZXR1cm4gMDsKIH0KICNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAogLyoKICAqIE1pZ3JhdGUgdGhlIE1TSSBpcnEgdG8gYW5vdGhlciBjcHVtYXNrLiBUaGlzIG1pZ3JhdGlvbiBpcwogICogZG9uZSBpbiB0aGUgcHJvY2VzcyBjb250ZXh0IHVzaW5nIGludGVycnVwdC1yZW1hcHBpbmcgaGFyZHdhcmUuCiAgKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBpcl9zZXRfbXNpX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwpAQCAtMzQwMiwxMSArMzM2MiwxMSBAQAogCXN0cnVjdCBpcnRlIGlydGU7CiAKIAlpZiAoZ2V0X2lydGUoaXJxLCAmaXJ0ZSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJZGVzdCA9IHNldF9kZXNjX2FmZmluaXR5KGRlc2MsIG1hc2spOwogCWlmIChkZXN0ID09IEJBRF9BUElDSUQpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJaXJ0ZS52ZWN0b3IgPSBjZmctPnZlY3RvcjsKIAlpcnRlLmRlc3RfaWQgPSBJUlRFX0RFU1QoZGVzdCk7CkBAIC0zNDIzLDYgKzMzODMsOCBAQAogCSAqLwogCWlmIChjZmctPm1vdmVfaW5fcHJvZ3Jlc3MpCiAJCXNlbmRfY2xlYW51cF92ZWN0b3IoY2ZnKTsKKworCXJldHVybiAwOwogfQogCiAjZW5kaWYKQEAgLTM1MTgsMTUgKzM0ODAsMTcgQEAKIAl1bnNpZ25lZCBpbnQgaXJxX3dhbnQ7CiAJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IE5VTEw7CiAJaW50IGluZGV4ID0gMDsKKwlpbnQgbm9kZTsKIAogCS8qIHg4NiBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgTVNJIHlldCAqLwogCWlmICh0eXBlID09IFBDSV9DQVBfSURfTVNJICYmIG52ZWMgPiAxKQogCQlyZXR1cm4gMTsKIAorCW5vZGUgPSBkZXZfdG9fbm9kZSgmZGV2LT5kZXYpOwogCWlycV93YW50ID0gbnJfaXJxc19nc2k7CiAJc3ViX2hhbmRsZSA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtc2lkZXNjLCAmZGV2LT5tc2lfbGlzdCwgbGlzdCkgewotCQlpcnEgPSBjcmVhdGVfaXJxX25yKGlycV93YW50KTsKKwkJaXJxID0gY3JlYXRlX2lycV9ucihpcnFfd2FudCwgbm9kZSk7CiAJCWlmIChpcnEgPT0gMCkKIAkJCXJldHVybiAtMTsKIAkJaXJxX3dhbnQgPSBpcnEgKyAxOwpAQCAtMzU3Niw3ICszNTQwLDcgQEAKIAogI2lmIGRlZmluZWQgKENPTkZJR19ETUFSKSB8fCBkZWZpbmVkIChDT05GSUdfSU5UUl9SRU1BUCkKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBkbWFyX21zaV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCitzdGF0aWMgaW50IGRtYXJfbXNpX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CkBAIC0zNTg1LDcgKzM1NDksNyBAQAogCiAJZGVzdCA9IHNldF9kZXNjX2FmZmluaXR5KGRlc2MsIG1hc2spOwogCWlmIChkZXN0ID09IEJBRF9BUElDSUQpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwogCkBAIC0zNTk3LDYgKzM1NjEsOCBAQAogCW1zZy5hZGRyZXNzX2xvIHw9IE1TSV9BRERSX0RFU1RfSUQoZGVzdCk7CiAKIAlkbWFyX21zaV93cml0ZShpcnEsICZtc2cpOworCisJcmV0dXJuIDA7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCkBAIC0zNjMwLDcgKzM1OTYsNyBAQAogI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBocGV0X21zaV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCitzdGF0aWMgaW50IGhwZXRfbXNpX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CkBAIC0zNjM5LDcgKzM2MDUsNyBAQAogCiAJZGVzdCA9IHNldF9kZXNjX2FmZmluaXR5KGRlc2MsIG1hc2spOwogCWlmIChkZXN0ID09IEJBRF9BUElDSUQpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwogCkBAIC0zNjUxLDYgKzM2MTcsOCBAQAogCW1zZy5hZGRyZXNzX2xvIHw9IE1TSV9BRERSX0RFU1RfSUQoZGVzdCk7CiAKIAlocGV0X21zaV93cml0ZShpcnEsICZtc2cpOworCisJcmV0dXJuIDA7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCkBAIC0zNzA3LDcgKzM2NzUsNyBAQAogCXdyaXRlX2h0X2lycV9tc2coaXJxLCAmbXNnKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X2h0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3N0YXRpYyBpbnQgc2V0X2h0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CkBAIC0zNzE1LDExICszNjgzLDEzIEBACiAKIAlkZXN0ID0gc2V0X2Rlc2NfYWZmaW5pdHkoZGVzYywgbWFzayk7CiAJaWYgKGRlc3QgPT0gQkFEX0FQSUNJRCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CiAKIAl0YXJnZXRfaHRfaXJxKGlycSwgZGVzdCwgY2ZnLT52ZWN0b3IpOworCisJcmV0dXJuIDA7CiB9CiAKICNlbmRpZgpAQCAtMzc5NCw2ICszNzY0LDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CiAKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5KSAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpOworCiAJY2ZnID0gaXJxX2NmZyhpcnEpOwogCiAJZXJyID0gYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIGVsaWdpYmxlX2NwdSk7CkBAIC0zODA3LDE1ICszNzc5LDEzIEBACiAKIAltbXJfdmFsdWUgPSAwOwogCWVudHJ5ID0gKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5ICopJm1tcl92YWx1ZTsKLQlCVUdfT04oc2l6ZW9mKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5KSAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCi0JZW50cnktPnZlY3RvciA9IGNmZy0+dmVjdG9yOwotCWVudHJ5LT5kZWxpdmVyeV9tb2RlID0gYXBpYy0+aXJxX2RlbGl2ZXJ5X21vZGU7Ci0JZW50cnktPmRlc3RfbW9kZSA9IGFwaWMtPmlycV9kZXN0X21vZGU7Ci0JZW50cnktPnBvbGFyaXR5ID0gMDsKLQllbnRyeS0+dHJpZ2dlciA9IDA7Ci0JZW50cnktPm1hc2sgPSAwOwotCWVudHJ5LT5kZXN0ID0gYXBpYy0+Y3B1X21hc2tfdG9fYXBpY2lkKGVsaWdpYmxlX2NwdSk7CisJZW50cnktPnZlY3RvcgkJPSBjZmctPnZlY3RvcjsKKwllbnRyeS0+ZGVsaXZlcnlfbW9kZQk9IGFwaWMtPmlycV9kZWxpdmVyeV9tb2RlOworCWVudHJ5LT5kZXN0X21vZGUJPSBhcGljLT5pcnFfZGVzdF9tb2RlOworCWVudHJ5LT5wb2xhcml0eQkJPSAwOworCWVudHJ5LT50cmlnZ2VyCQk9IDA7CisJZW50cnktPm1hc2sJCT0gMDsKKwllbnRyeS0+ZGVzdAkJPSBhcGljLT5jcHVfbWFza190b19hcGljaWQoZWxpZ2libGVfY3B1KTsKIAogCW1tcl9wbm9kZSA9IHV2X2JsYWRlX3RvX3Bub2RlKG1tcl9ibGFkZSk7CiAJdXZfd3JpdGVfZ2xvYmFsX21tcjY0KG1tcl9wbm9kZSwgbW1yX29mZnNldCwgbW1yX3ZhbHVlKTsKQEAgLTM4MzMsMTAgKzM4MDMsMTAgQEAKIAlzdHJ1Y3QgdXZfSU9fQVBJQ19yb3V0ZV9lbnRyeSAqZW50cnk7CiAJaW50IG1tcl9wbm9kZTsKIAorCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHV2X0lPX0FQSUNfcm91dGVfZW50cnkpICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKIAltbXJfdmFsdWUgPSAwOwogCWVudHJ5ID0gKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5ICopJm1tcl92YWx1ZTsKLQlCVUdfT04oc2l6ZW9mKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5KSAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCiAJZW50cnktPm1hc2sgPSAxOwogCiAJbW1yX3Bub2RlID0gdXZfYmxhZGVfdG9fcG5vZGUobW1yX2JsYWRlKTsKQEAgLTM5MDAsNiArMzg3MCw3MSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgX19pb19hcGljX3NldF9wY2lfcm91dGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpcnEsCisJCQkJc3RydWN0IGlvX2FwaWNfaXJxX2F0dHIgKmlycV9hdHRyKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOworCWludCBub2RlOworCWludCBpb2FwaWMsIHBpbjsKKwlpbnQgdHJpZ2dlciwgcG9sYXJpdHk7CisKKwlpb2FwaWMgPSBpcnFfYXR0ci0+aW9hcGljOworCWlmICghSU9fQVBJQ19JUlEoaXJxKSkgeworCQlhcGljX3ByaW50ayhBUElDX1FVSUVULEtFUk5fRVJSICJJT0FQSUNbJWRdOiBJbnZhbGlkIHJlZmVyZW5jZSB0byBJUlEgMFxuIiwKKwkJCWlvYXBpYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkZXYpCisJCW5vZGUgPSBkZXZfdG9fbm9kZShkZXYpOworCWVsc2UKKwkJbm9kZSA9IGNwdV90b19ub2RlKGJvb3RfY3B1X2lkKTsKKworCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKGlycSwgbm9kZSk7CisJaWYgKCFkZXNjKSB7CisJCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjICVkXG4iLCBpcnEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwaW4gPSBpcnFfYXR0ci0+aW9hcGljX3BpbjsKKwl0cmlnZ2VyID0gaXJxX2F0dHItPnRyaWdnZXI7CisJcG9sYXJpdHkgPSBpcnFfYXR0ci0+cG9sYXJpdHk7CisKKwkvKgorCSAqIElSUXMgPCAxNiBhcmUgYWxyZWFkeSBpbiB0aGUgaXJxXzJfcGluW10gbWFwCisJICovCisJaWYgKGlycSA+PSBOUl9JUlFTX0xFR0FDWSkgeworCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJCWFkZF9waW5fdG9faXJxX25vZGUoY2ZnLCBub2RlLCBpb2FwaWMsIHBpbik7CisJfQorCisJc2V0dXBfSU9fQVBJQ19pcnEoaW9hcGljLCBwaW4sIGlycSwgZGVzYywgdHJpZ2dlciwgcG9sYXJpdHkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpb19hcGljX3NldF9wY2lfcm91dGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpcnEsCisJCQkJc3RydWN0IGlvX2FwaWNfaXJxX2F0dHIgKmlycV9hdHRyKQoreworCWludCBpb2FwaWMsIHBpbjsKKwkvKgorCSAqIEF2b2lkIHBpbiByZXByb2dyYW1taW5nLiAgUFJUcyB0eXBpY2FsbHkgaW5jbHVkZSBlbnRyaWVzCisJICogd2l0aCByZWR1bmRhbnQgcGluLT5nc2kgbWFwcGluZ3MgKGJ1dCB1bmlxdWUgUENJIGRldmljZXMpOworCSAqIHdlIG9ubHkgcHJvZ3JhbSB0aGUgSU9BUElDIG9uIHRoZSBmaXJzdC4KKwkgKi8KKwlpb2FwaWMgPSBpcnFfYXR0ci0+aW9hcGljOworCXBpbiA9IGlycV9hdHRyLT5pb2FwaWNfcGluOworCWlmICh0ZXN0X2JpdChwaW4sIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10ucGluX3Byb2dyYW1tZWQpKSB7CisJCXByX2RlYnVnKCJQaW4gJWQtJWQgYWxyZWFkeSBwcm9ncmFtbWVkXG4iLAorCQkJIG1wX2lvYXBpY3NbaW9hcGljXS5hcGljaWQsIHBpbik7CisJCXJldHVybiAwOworCX0KKwlzZXRfYml0KHBpbiwgbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5waW5fcHJvZ3JhbW1lZCk7CisKKwlyZXR1cm4gX19pb19hcGljX3NldF9wY2lfcm91dGluZyhkZXYsIGlycSwgaXJxX2F0dHIpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJLWJhc2VkIElPQVBJQyBDb25maWd1cmF0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzk4MCw2ICs0MDE1LDcgQEAKIAogCXJldHVybiBhcGljX2lkOwogfQorI2VuZGlmCiAKIGludCBfX2luaXQgaW9fYXBpY19nZXRfdmVyc2lvbihpbnQgaW9hcGljKQogewpAQCAtMzk5MiwzOSArNDAyOCw2IEBACiAKIAlyZXR1cm4gcmVnXzAxLmJpdHMudmVyc2lvbjsKIH0KLSNlbmRpZgotCi1pbnQgaW9fYXBpY19zZXRfcGNpX3JvdXRpbmcgKGludCBpb2FwaWMsIGludCBwaW4sIGludCBpcnEsIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCi17Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwotCXN0cnVjdCBpcnFfY2ZnICpjZmc7Ci0JaW50IGNwdSA9IGJvb3RfY3B1X2lkOwotCi0JaWYgKCFJT19BUElDX0lSUShpcnEpKSB7Ci0JCWFwaWNfcHJpbnRrKEFQSUNfUVVJRVQsS0VSTl9FUlIgIklPQVBJQ1slZF06IEludmFsaWQgcmVmZXJlbmNlIHRvIElSUSAwXG4iLAotCQkJaW9hcGljKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX2NwdShpcnEsIGNwdSk7Ci0JaWYgKCFkZXNjKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjICVkXG4iLCBpcnEpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIElSUXMgPCAxNiBhcmUgYWxyZWFkeSBpbiB0aGUgaXJxXzJfcGluW10gbWFwCi0JICovCi0JaWYgKGlycSA+PSBOUl9JUlFTX0xFR0FDWSkgewotCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7Ci0JCWFkZF9waW5fdG9faXJxX2NwdShjZmcsIGNwdSwgaW9hcGljLCBwaW4pOwotCX0KLQotCXNldHVwX0lPX0FQSUNfaXJxKGlvYXBpYywgcGluLCBpcnEsIGRlc2MsIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKLQotCXJldHVybiAwOwotfQotCiAKIGludCBhY3BpX2dldF9vdmVycmlkZV9pcnEoaW50IGJ1c19pcnEsIGludCAqdHJpZ2dlciwgaW50ICpwb2xhcml0eSkKIHsKQEAgLTQwNTUsNTEgKzQwNTgsNDQgQEAKICNpZmRlZiBDT05GSUdfU01QCiB2b2lkIF9faW5pdCBzZXR1cF9pb2FwaWNfZGVzdCh2b2lkKQogewotCWludCBwaW4sIGlvYXBpYywgaXJxLCBpcnFfZW50cnk7CisJaW50IHBpbiwgaW9hcGljID0gMCwgaXJxLCBpcnFfZW50cnk7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwotCXN0cnVjdCBpcnFfY2ZnICpjZmc7CiAJY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2s7CiAKIAlpZiAoc2tpcF9pb2FwaWNfc2V0dXAgPT0gMSkKIAkJcmV0dXJuOwogCi0JZm9yIChpb2FwaWMgPSAwOyBpb2FwaWMgPCBucl9pb2FwaWNzOyBpb2FwaWMrKykgewotCQlmb3IgKHBpbiA9IDA7IHBpbiA8IG5yX2lvYXBpY19yZWdpc3RlcnNbaW9hcGljXTsgcGluKyspIHsKLQkJCWlycV9lbnRyeSA9IGZpbmRfaXJxX2VudHJ5KGlvYXBpYywgcGluLCBtcF9JTlQpOwotCQkJaWYgKGlycV9lbnRyeSA9PSAtMSkKLQkJCQljb250aW51ZTsKLQkJCWlycSA9IHBpbl8yX2lycShpcnFfZW50cnksIGlvYXBpYywgcGluKTsKLQotCQkJLyogc2V0dXBfSU9fQVBJQ19pcnFzIGNvdWxkIGZhaWwgdG8gZ2V0IHZlY3RvciBmb3Igc29tZSBkZXZpY2UKLQkJCSAqIHdoZW4geW91IGhhdmUgdG9vIG1hbnkgZGV2aWNlcywgYmVjYXVzZSBhdCB0aGF0IHRpbWUgb25seSBib290Ci0JCQkgKiBjcHUgaXMgb25saW5lLgotCQkJICovCi0JCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQkJCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQkJCWlmICghY2ZnLT52ZWN0b3IpIHsKLQkJCQlzZXR1cF9JT19BUElDX2lycShpb2FwaWMsIHBpbiwgaXJxLCBkZXNjLAotCQkJCQkJICBpcnFfdHJpZ2dlcihpcnFfZW50cnkpLAotCQkJCQkJICBpcnFfcG9sYXJpdHkoaXJxX2VudHJ5KSk7Ci0JCQkJY29udGludWU7Ci0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIEhvbm91ciBhZmZpbml0aWVzIHdoaWNoIGhhdmUgYmVlbiBzZXQgaW4gZWFybHkgYm9vdAotCQkJICovCi0JCQlpZiAoZGVzYy0+c3RhdHVzICYKLQkJCSAgICAoSVJRX05PX0JBTEFOQ0lORyB8IElSUV9BRkZJTklUWV9TRVQpKQotCQkJCW1hc2sgPSBkZXNjLT5hZmZpbml0eTsKLQkJCWVsc2UKLQkJCQltYXNrID0gYXBpYy0+dGFyZ2V0X2NwdXMoKTsKLQotCQkJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpCi0JCQkJc2V0X2lyX2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhkZXNjLCBtYXNrKTsKLQkJCWVsc2UKLQkJCQlzZXRfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOwotCQl9Ci0KKyNpZmRlZiBDT05GSUdfQUNQSQorCWlmICghYWNwaV9kaXNhYmxlZCAmJiBhY3BpX2lvYXBpYykgeworCQlpb2FwaWMgPSBtcF9maW5kX2lvYXBpYygwKTsKKwkJaWYgKGlvYXBpYyA8IDApCisJCQlpb2FwaWMgPSAwOwogCX0KKyNlbmRpZgorCisJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2lvYXBpY107IHBpbisrKSB7CisJCWlycV9lbnRyeSA9IGZpbmRfaXJxX2VudHJ5KGlvYXBpYywgcGluLCBtcF9JTlQpOworCQlpZiAoaXJxX2VudHJ5ID09IC0xKQorCQkJY29udGludWU7CisJCWlycSA9IHBpbl8yX2lycShpcnFfZW50cnksIGlvYXBpYywgcGluKTsKKworCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCQkvKgorCQkgKiBIb25vdXIgYWZmaW5pdGllcyB3aGljaCBoYXZlIGJlZW4gc2V0IGluIGVhcmx5IGJvb3QKKwkJICovCisJCWlmIChkZXNjLT5zdGF0dXMgJgorCQkgICAgKElSUV9OT19CQUxBTkNJTkcgfCBJUlFfQUZGSU5JVFlfU0VUKSkKKwkJCW1hc2sgPSBkZXNjLT5hZmZpbml0eTsKKwkJZWxzZQorCQkJbWFzayA9IGFwaWMtPnRhcmdldF9jcHVzKCk7CisKKwkJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpCisJCQlzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOworCQllbHNlCisJCQlzZXRfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOworCX0KKwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL25taS5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMKaW5kZXggY2U0ZmJmYS4uYTY5MTMwMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHJlcG9ydF9icm9rZW5fbm1pKGludCBjcHUsIGludCAqcHJldl9ubWlfY291bnQpCitzdGF0aWMgdm9pZCByZXBvcnRfYnJva2VuX25taShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgKnByZXZfbm1pX2NvdW50KQogewogCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV8zMi5jCmluZGV4IDAxZWRhMmEuLjQ0MGE4YmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYwpAQCAtMTYwLDcgKzE2MCw2IEBACiBleHRlcm4gc3RydWN0IGFwaWMgYXBpY19iaWdzbXA7CiBleHRlcm4gc3RydWN0IGFwaWMgYXBpY19lczcwMDA7CiBleHRlcm4gc3RydWN0IGFwaWMgYXBpY19lczcwMDBfY2x1c3RlcjsKLWV4dGVybiBzdHJ1Y3QgYXBpYyBhcGljX2RlZmF1bHQ7CiAKIHN0cnVjdCBhcGljICphcGljID0gJmFwaWNfZGVmYXVsdDsKIEVYUE9SVF9TWU1CT0xfR1BMKGFwaWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzY0LmMKaW5kZXggMTc4MzY1Mi4uYmMzZTg4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV82NC5jCkBAIC01MCw3ICs1MCw3IEBACiB2b2lkIF9faW5pdCBkZWZhdWx0X3NldHVwX2FwaWNfcm91dGluZyh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi0JaWYgKHgyYXBpYyAmJiAoYXBpYyAhPSAmYXBpY194MmFwaWNfcGh5cyAmJgorCWlmICh4MmFwaWNfbW9kZSAmJiAoYXBpYyAhPSAmYXBpY194MmFwaWNfcGh5cyAmJgogI2lmZGVmIENPTkZJR19YODZfVVYKIAkJICAgICAgIGFwaWMgIT0gJmFwaWNfeDJhcGljX3V2X3ggJiYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvc3VtbWl0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYwppbmRleCA5Y2ZlMWY0Li4zNDRlZWU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYwpAQCAtMTczLDEzICsxNzMsNiBAQAogCQlyaW8tPnR5cGUgPT0gTG9va091dEFXUEVHIHx8IHJpby0+dHlwZSA9PSBMb29rT3V0QldQRUcpOwogfQogCi0KLS8qIEluIGNsdXN0ZXJlZCBtb2RlLCB0aGUgaGlnaCBuaWJibGUgb2YgQVBJQyBJRCBpcyBhIGNsdXN0ZXIgbnVtYmVyLgotICogVGhlIGxvdyBuaWJibGUgaXMgYSA0LWJpdCBiaXRtYXAuICovCi0jZGVmaW5lIFhBUElDX0RFU1RfQ1BVU19TSElGVAk0Ci0jZGVmaW5lIFhBUElDX0RFU1RfQ1BVU19NQVNLCSgoMXUgPDwgWEFQSUNfREVTVF9DUFVTX1NISUZUKSAtIDEpCi0jZGVmaW5lIFhBUElDX0RFU1RfQ0xVU1RFUl9NQVNLCShYQVBJQ19ERVNUX0NQVVNfTUFTSyA8PCBYQVBJQ19ERVNUX0NQVVNfU0hJRlQpCi0KICNkZWZpbmUgU1VNTUlUX0FQSUNfREZSX1ZBTFVFCShBUElDX0RGUl9DTFVTVEVSKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnN1bW1pdF90YXJnZXRfY3B1cyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMKaW5kZXggNGE5MDNlMi4uOGU0Y2JiMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaXBpLmg+CiAKLURFRklORV9QRVJfQ1BVKHUzMiwgeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTMyLCB4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKTsKIAogc3RhdGljIGludCB4MmFwaWNfYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IDJiZGE2OTMuLmVmMGFlMjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJY3B1bWFza19zZXRfY3B1KGNwdSwgcmV0bWFzayk7CiB9CiAKLXN0YXRpYyBpbnQgdXZfd2FrZXVwX3NlY29uZGFyeShpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcmlwKQorc3RhdGljIGludCBfX2NwdWluaXQgdXZfd2FrZXVwX3NlY29uZGFyeShpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcmlwKQogewogI2lmZGVmIENPTkZJR19TTVAKIAl1bnNpZ25lZCBsb25nIHZhbDsKQEAgLTU2Miw3ICs1NjIsNyBAQAogCXVuaW9uIHV2aF9ub2RlX2lkX3Ugbm9kZV9pZDsKIAl1bnNpZ25lZCBsb25nIGdub2RlX3VwcGVyLCBsb3dtZW1fcmVkaXJfYmFzZSwgbG93bWVtX3JlZGlyX3NpemU7CiAJaW50IGJ5dGVzLCBuaWQsIGNwdSwgbGNwdSwgcG5vZGUsIGJsYWRlLCBpLCBqLCBtX3ZhbCwgbl92YWw7Ci0JaW50IG1heF9wbm9kZSA9IDA7CisJaW50IGdub2RlX2V4dHJhLCBtYXhfcG5vZGUgPSAwOwogCXVuc2lnbmVkIGxvbmcgbW1yX2Jhc2UsIHByZXNlbnQsIHBhZGRyOwogCXVuc2lnbmVkIHNob3J0IHBub2RlX21hc2s7CiAKQEAgLTU3NCw2ICs1NzQsMTMgQEAKIAltbXJfYmFzZSA9CiAJICAgIHV2X3JlYWRfbG9jYWxfbW1yKFVWSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUikgJgogCSAgICB+VVZfTU1SX0VOQUJMRTsKKwlwbm9kZV9tYXNrID0gKDEgPDwgbl92YWwpIC0gMTsKKwlub2RlX2lkLnYgPSB1dl9yZWFkX2xvY2FsX21tcihVVkhfTk9ERV9JRCk7CisJZ25vZGVfZXh0cmEgPSAobm9kZV9pZC5zLm5vZGVfaWQgJiB+KCgxIDw8IG5fdmFsKSAtIDEpKSA+PiAxOworCWdub2RlX3VwcGVyID0gKCh1bnNpZ25lZCBsb25nKWdub2RlX2V4dHJhICA8PCBtX3ZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlVWOiBOICVkLCBNICVkLCBnbm9kZV91cHBlciAweCVseCwgZ25vZGVfZXh0cmEgMHgleFxuIiwKKwkJCW5fdmFsLCBtX3ZhbCwgZ25vZGVfdXBwZXIsIGdub2RlX2V4dHJhKTsKKwogCXByaW50ayhLRVJOX0RFQlVHICJVVjogZ2xvYmFsIE1NUiBiYXNlIDB4JWx4XG4iLCBtbXJfYmFzZSk7CiAKIAlmb3IoaSA9IDA7IGkgPCBVVkhfTk9ERV9QUkVTRU5UX1RBQkxFX0RFUFRIOyBpKyspCkBAIC01ODMsMTUgKzU5MCwxOCBAQAogCiAJYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHV2X2JsYWRlX2luZm8pICogdXZfbnVtX3Bvc3NpYmxlX2JsYWRlcygpOwogCXV2X2JsYWRlX2luZm8gPSBrbWFsbG9jKGJ5dGVzLCBHRlBfS0VSTkVMKTsKKwlCVUdfT04oIXV2X2JsYWRlX2luZm8pOwogCiAJZ2V0X2xvd21lbV9yZWRpcmVjdCgmbG93bWVtX3JlZGlyX2Jhc2UsICZsb3dtZW1fcmVkaXJfc2l6ZSk7CiAKIAlieXRlcyA9IHNpemVvZih1dl9ub2RlX3RvX2JsYWRlWzBdKSAqIG51bV9wb3NzaWJsZV9ub2RlcygpOwogCXV2X25vZGVfdG9fYmxhZGUgPSBrbWFsbG9jKGJ5dGVzLCBHRlBfS0VSTkVMKTsKKwlCVUdfT04oIXV2X25vZGVfdG9fYmxhZGUpOwogCW1lbXNldCh1dl9ub2RlX3RvX2JsYWRlLCAyNTUsIGJ5dGVzKTsKIAogCWJ5dGVzID0gc2l6ZW9mKHV2X2NwdV90b19ibGFkZVswXSkgKiBudW1fcG9zc2libGVfY3B1cygpOwogCXV2X2NwdV90b19ibGFkZSA9IGttYWxsb2MoYnl0ZXMsIEdGUF9LRVJORUwpOworCUJVR19PTighdXZfY3B1X3RvX2JsYWRlKTsKIAltZW1zZXQodXZfY3B1X3RvX2JsYWRlLCAyNTUsIGJ5dGVzKTsKIAogCWJsYWRlID0gMDsKQEAgLTYwNywxMSArNjE3LDYgQEAKIAkJfQogCX0KIAotCXBub2RlX21hc2sgPSAoMSA8PCBuX3ZhbCkgLSAxOwotCW5vZGVfaWQudiA9IHV2X3JlYWRfbG9jYWxfbW1yKFVWSF9OT0RFX0lEKTsKLQlnbm9kZV91cHBlciA9ICgoKHVuc2lnbmVkIGxvbmcpbm9kZV9pZC5zLm5vZGVfaWQpICYKLQkJICAgICAgIH4oKDEgPDwgbl92YWwpIC0gMSkpIDw8IG1fdmFsOwotCiAJdXZfYmlvc19pbml0KCk7CiAJdXZfYmlvc19nZXRfc25faW5mbygwLCAmdXZfdHlwZSwgJnNuX3BhcnRpdGlvbl9pZCwKIAkJCSAgICAmc25fY29oZXJlbmN5X2lkLCAmc25fcmVnaW9uX3NpemUpOwpAQCAtNjM0LDYgKzYzOSw3IEBACiAJCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5wbm9kZV9tYXNrID0gcG5vZGVfbWFzazsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmdwYV9tYXNrID0gKDEgPDwgKG1fdmFsICsgbl92YWwpKSAtIDE7CiAJCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5nbm9kZV91cHBlciA9IGdub2RlX3VwcGVyOworCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+Z25vZGVfZXh0cmEgPSBnbm9kZV9leHRyYTsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmdsb2JhbF9tbXJfYmFzZSA9IG1tcl9iYXNlOwogCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+Y29oZXJlbmN5X2RvbWFpbl9udW1iZXIgPSBzbl9jb2hlcmVuY3lfaWQ7CiAJCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5zY2lyLm9mZnNldCA9IFNDSVJfTE9DQUxfTU1SX0JBU0UgKyBsY3B1OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYwppbmRleCA1YTZhYTFjLi4xYTgzMGNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYwpAQCAtMTQ2LDQgKzE0Niw1IEBACiAJT0ZGU0VUKEJQX2xvYWRmbGFncywgYm9vdF9wYXJhbXMsIGhkci5sb2FkZmxhZ3MpOwogCU9GRlNFVChCUF9oYXJkd2FyZV9zdWJhcmNoLCBib290X3BhcmFtcywgaGRyLmhhcmR3YXJlX3N1YmFyY2gpOwogCU9GRlNFVChCUF92ZXJzaW9uLCBib290X3BhcmFtcywgaGRyLnZlcnNpb24pOworCU9GRlNFVChCUF9rZXJuZWxfYWxpZ25tZW50LCBib290X3BhcmFtcywgaGRyLmtlcm5lbF9hbGlnbm1lbnQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwppbmRleCBlNzJmMDYyLi44OThlY2M0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwpAQCAtMTI1LDYgKzEyNSw3IEBACiAJT0ZGU0VUKEJQX2xvYWRmbGFncywgYm9vdF9wYXJhbXMsIGhkci5sb2FkZmxhZ3MpOwogCU9GRlNFVChCUF9oYXJkd2FyZV9zdWJhcmNoLCBib290X3BhcmFtcywgaGRyLmhhcmR3YXJlX3N1YmFyY2gpOwogCU9GRlNFVChCUF92ZXJzaW9uLCBib290X3BhcmFtcywgaGRyLnZlcnNpb24pOworCU9GRlNFVChCUF9rZXJuZWxfYWxpZ25tZW50LCBib290X3BhcmFtcywgaGRyLmtlcm5lbF9hbGlnbm1lbnQpOwogCiAJQkxBTksoKTsKIAlERUZJTkUoUEFHRV9TSVpFX2FzbSwgUEFHRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCmluZGV4IDRlMjQyZjkuLjNlZmNiMmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMKLSMgTWFrZWZpbGUgZm9yIHg4Ni1jb21wYXRpYmxlIENQVSBkZXRhaWxzIGFuZCBxdWlya3MKKyMgTWFrZWZpbGUgZm9yIHg4Ni1jb21wYXRpYmxlIENQVSBkZXRhaWxzLCBmZWF0dXJlcyBhbmQgcXVpcmtzCiAjCiAKICMgRG9uJ3QgdHJhY2UgZWFybHkgc3RhZ2VzIG9mIGEgc2Vjb25kYXJ5IENQVSBib290CkBAIC0yMywxMSArMjMsMTMgQEAKIG9iai0kKENPTkZJR19DUFVfU1VQX1RSQU5TTUVUQV8zMikJKz0gdHJhbnNtZXRhLm8KIG9iai0kKENPTkZJR19DUFVfU1VQX1VNQ18zMikJCSs9IHVtYy5vCiAKLW9iai0kKENPTkZJR19YODZfTUNFKQkrPSBtY2hlY2svCi1vYmotJChDT05GSUdfTVRSUikJKz0gbXRyci8KLW9iai0kKENPTkZJR19DUFVfRlJFUSkJKz0gY3B1ZnJlcS8KK29iai0kKENPTkZJR19QRVJGX0NPVU5URVJTKQkJKz0gcGVyZl9jb3VudGVyLm8KIAotb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSArPSBwZXJmY3RyLXdhdGNoZG9nLm8KK29iai0kKENPTkZJR19YODZfTUNFKQkJCSs9IG1jaGVjay8KK29iai0kKENPTkZJR19NVFJSKQkJCSs9IG10cnIvCitvYmotJChDT05GSUdfQ1BVX0ZSRVEpCQkJKz0gY3B1ZnJlcS8KKworb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkJKz0gcGVyZmN0ci13YXRjaGRvZy5vCiAKIHF1aWV0X2NtZF9ta2NhcGZsYWdzID0gTUtDQVAgICAkQAogICAgICAgY21kX21rY2FwZmxhZ3MgPSAkKFBFUkwpICQoc3JjdHJlZSkvJChzcmMpL21rY2FwZmxhZ3MucGwgJDwgJEAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IDdlNGE0NTkuLmU1YjI3ZDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CisjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KIAogI2lmZGVmIENPTkZJR19YODZfNjQKICMgaW5jbHVkZSA8YXNtL251bWFfNjQuaD4KQEAgLTI3Miw3ICsyNzMsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX05VTUEpICYmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBub2RlOwotCXVuc2lnbmVkIGFwaWNpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuc2lnbmVkIGFwaWNpZCA9IGNwdV9oYXNfYXBpYyA/IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpIDogYy0+YXBpY2lkOwogCiAJbm9kZSA9IGMtPnBoeXNfcHJvY19pZDsKIAlpZiAoYXBpY2lkX3RvX25vZGVbYXBpY2lkXSAhPSBOVU1BX05PX05PREUpCkBAIC0zNTEsNiArMzUyLDE1IEBACiAJCSAgICAoYy0+eDg2X21vZGVsID09IDggJiYgYy0+eDg2X21hc2sgPj0gOCkpCiAJCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9LNl9NVFJSKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLyogY2hlY2sgQ1BVIGNvbmZpZyBzcGFjZSBmb3IgZXh0ZW5kZWQgQVBJQyBJRCAqLworCWlmIChjLT54ODYgPj0gMHhmKSB7CisJCXVuc2lnbmVkIGludCB2YWw7CisJCXZhbCA9IHJlYWRfcGNpX2NvbmZpZygwLCAyNCwgMCwgMHg2OCk7CisJCWlmICgodmFsICYgKCgxIDw8IDE3KSB8ICgxIDw8IDE4KSkpID09ICgoMSA8PCAxNykgfCAoMSA8PCAxOCkpKQorCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfRVhURF9BUElDSUQpOworCX0KKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggNzc4NDhkOS4uM2ZmZGNmYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9zdGFja3Byb3RlY3Rvci5oPgorI2luY2x1ZGUgPGFzbS9wZXJmX2NvdW50ZXIuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTI5OSw3ICszMDAsOCBAQAogCXJldHVybiBOVUxMOwkJLyogTm90IGZvdW5kICovCiB9CiAKLV9fdTMyIGNsZWFyZWRfY3B1X2NhcHNbTkNBUElOVFNdIF9fY3B1aW5pdGRhdGE7CitfX3UzMiBjcHVfY2Fwc19jbGVhcmVkW05DQVBJTlRTXSBfX2NwdWluaXRkYXRhOworX191MzIgY3B1X2NhcHNfc2V0W05DQVBJTlRTXSBfX2NwdWluaXRkYXRhOwogCiB2b2lkIGxvYWRfcGVyY3B1X3NlZ21lbnQoaW50IGNwdSkKIHsKQEAgLTc2OCw2ICs3NzAsMTIgQEAKIAlpZiAodGhpc19jcHUtPmNfaWRlbnRpZnkpCiAJCXRoaXNfY3B1LT5jX2lkZW50aWZ5KGMpOwogCisJLyogQ2xlYXIvU2V0IGFsbCBmbGFncyBvdmVycmlkZW4gYnkgb3B0aW9ucywgYWZ0ZXIgcHJvYmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykgeworCQljLT54ODZfY2FwYWJpbGl0eVtpXSAmPSB+Y3B1X2NhcHNfY2xlYXJlZFtpXTsKKwkJYy0+eDg2X2NhcGFiaWxpdHlbaV0gfD0gY3B1X2NhcHNfc2V0W2ldOworCX0KKwogI2lmZGVmIENPTkZJR19YODZfNjQKIAljLT5hcGljaWQgPSBhcGljLT5waHlzX3BrZ19pZChjLT5pbml0aWFsX2FwaWNpZCwgMCk7CiAjZW5kaWYKQEAgLTgxMyw2ICs4MjEsMTYgQEAKICNlbmRpZgogCiAJaW5pdF9oeXBlcnZpc29yKGMpOworCisJLyoKKwkgKiBDbGVhci9TZXQgYWxsIGZsYWdzIG92ZXJyaWRlbiBieSBvcHRpb25zLCBuZWVkIGRvIGl0CisJICogYmVmb3JlIGZvbGxvd2luZyBzbXAgYWxsIGNwdXMgY2FwIEFORC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykgeworCQljLT54ODZfY2FwYWJpbGl0eVtpXSAmPSB+Y3B1X2NhcHNfY2xlYXJlZFtpXTsKKwkJYy0+eDg2X2NhcGFiaWxpdHlbaV0gfD0gY3B1X2NhcHNfc2V0W2ldOworCX0KKwogCS8qCiAJICogT24gU01QLCBib290X2NwdV9kYXRhIGhvbGRzIHRoZSBjb21tb24gZmVhdHVyZSBzZXQgYmV0d2VlbgogCSAqIGFsbCBDUFVzOyBzbyBtYWtlIHN1cmUgdGhhdCB3ZSBpbmRpY2F0ZSB3aGljaCBmZWF0dXJlcyBhcmUKQEAgLTgyNSwxMCArODQzLDYgQEAKIAkJCWJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHlbaV0gJj0gYy0+eDg2X2NhcGFiaWxpdHlbaV07CiAJfQogCi0JLyogQ2xlYXIgYWxsIGZsYWdzIG92ZXJyaWRlbiBieSBvcHRpb25zICovCi0JZm9yIChpID0gMDsgaSA8IE5DQVBJTlRTOyBpKyspCi0JCWMtPng4Nl9jYXBhYmlsaXR5W2ldICY9IH5jbGVhcmVkX2NwdV9jYXBzW2ldOwotCiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKIAkvKiBJbml0IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIGlmIGF2YWlsYWJsZS4gKi8KIAltY2hlY2tfaW5pdChjKTsKQEAgLTg2MSw2ICs4NzUsNyBAQAogI2Vsc2UKIAl2Z2V0Y3B1X3NldF9tb2RlKCk7CiAjZW5kaWYKKwlpbml0X2h3X3BlcmZfY291bnRlcnMoKTsKIH0KIAogdm9pZCBfX2NwdWluaXQgaWRlbnRpZnlfc2Vjb25kYXJ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdV9kZWJ1Zy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVfZGVidWcuYwppbmRleCA0NmUyOWFiLi42YjJhNTJkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdV9kZWJ1Zy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1X2RlYnVnLmMKQEAgLTMyLDkgKzMyLDcgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfY3B1WF9iYXNlLCBjcHVfYXJyW0NQVV9SRUdfQUxMX0JJVF0pOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfcHJpdmF0ZSAqLCBwcml2X2FycltNQVhfQ1BVX0ZJTEVTXSk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQsIGNwdV9tb2RlbGZsYWcpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgY3B1X3ByaXZfY291bnQpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkLCBjcHVfbW9kZWwpOwogCiBzdGF0aWMgREVGSU5FX01VVEVYKGNwdV9kZWJ1Z19sb2NrKTsKIApAQCAtODAsMzAyICs3OCwxMDIgQEAKIAl7ICJ2YWx1ZSIsCUNQVV9SRUdfQUxMLAkxCX0sCiB9OwogCi0vKiBJbnRlbCBSZWdpc3RlcnMgUmFuZ2UgKi8KLXN0YXRpYyBzdHJ1Y3QgY3B1X2RlYnVnX3JhbmdlIGNwdV9pbnRlbF9yYW5nZVtdID0gewotCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgQ1BVX01DLAlDUFVfSU5URUxfQUxMCQl9LAotCXsgMHgwMDAwMDAwNiwgMHgwMDAwMDAwNywgQ1BVX01PTklUT1IsCUNQVV9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIENQVV9USU1FLAlDUFVfSU5URUxfQUxMCQl9LAotCXsgMHgwMDAwMDAxMSwgMHgwMDAwMDAxMywgQ1BVX1BNQywJQ1BVX0lOVEVMX1BFTlRJVU0JfSwKLQl7IDB4MDAwMDAwMTcsIDB4MDAwMDAwMTcsIENQVV9QTEFURk9STSwJQ1BVX1BYX0NYX0FUX1hFCQl9LAotCXsgMHgwMDAwMDAxQiwgMHgwMDAwMDAxQiwgQ1BVX0FQSUMsCUNQVV9QNl9DWF9BVF9YRQkJfSwKKy8qIENQVSBSZWdpc3RlcnMgUmFuZ2UgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1X2RlYnVnX3JhbmdlIGNwdV9yZWdfcmFuZ2VbXSA9IHsKKwl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIENQVV9NQywJfSwKKwl7IDB4MDAwMDAwMDYsIDB4MDAwMDAwMDcsIENQVV9NT05JVE9SLAl9LAorCXsgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgQ1BVX1RJTUUsCX0sCisJeyAweDAwMDAwMDExLCAweDAwMDAwMDEzLCBDUFVfUE1DLAl9LAorCXsgMHgwMDAwMDAxNywgMHgwMDAwMDAxNywgQ1BVX1BMQVRGT1JNLAl9LAorCXsgMHgwMDAwMDAxQiwgMHgwMDAwMDAxQiwgQ1BVX0FQSUMsCX0sCisJeyAweDAwMDAwMDJBLCAweDAwMDAwMDJCLCBDUFVfUE9XRVJPTiwJfSwKKwl7IDB4MDAwMDAwMkMsIDB4MDAwMDAwMkMsIENQVV9GUkVRLAl9LAorCXsgMHgwMDAwMDAzQSwgMHgwMDAwMDAzQSwgQ1BVX0NPTlRST0wsCX0sCisJeyAweDAwMDAwMDQwLCAweDAwMDAwMDQ3LCBDUFVfTEJSQU5DSCwJfSwKKwl7IDB4MDAwMDAwNjAsIDB4MDAwMDAwNjcsIENQVV9MQlJBTkNILAl9LAorCXsgMHgwMDAwMDA3OSwgMHgwMDAwMDA3OSwgQ1BVX0JJT1MsCX0sCisJeyAweDAwMDAwMDg4LCAweDAwMDAwMDhBLCBDUFVfQ0FDSEUsCX0sCisJeyAweDAwMDAwMDhCLCAweDAwMDAwMDhCLCBDUFVfQklPUywJfSwKKwl7IDB4MDAwMDAwOUIsIDB4MDAwMDAwOUIsIENQVV9NT05JVE9SLAl9LAorCXsgMHgwMDAwMDBDMSwgMHgwMDAwMDBDNCwgQ1BVX1BNQywJfSwKKwl7IDB4MDAwMDAwQ0QsIDB4MDAwMDAwQ0QsIENQVV9GUkVRLAl9LAorCXsgMHgwMDAwMDBFNywgMHgwMDAwMDBFOCwgQ1BVX1BFUkYsCX0sCisJeyAweDAwMDAwMEZFLCAweDAwMDAwMEZFLCBDUFVfTVRSUiwJfSwKIAotCXsgMHgwMDAwMDAyQSwgMHgwMDAwMDAyQSwgQ1BVX1BPV0VST04sCUNQVV9QWF9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAwMkIsIDB4MDAwMDAwMkIsIENQVV9QT1dFUk9OLAlDUFVfSU5URUxfWEVPTgkJfSwKLQl7IDB4MDAwMDAwMkMsIDB4MDAwMDAwMkMsIENQVV9GUkVRLAlDUFVfSU5URUxfWEVPTgkJfSwKLQl7IDB4MDAwMDAwM0EsIDB4MDAwMDAwM0EsIENQVV9DT05UUk9MLAlDUFVfQ1hfQVRfWEUJCX0sCisJeyAweDAwMDAwMTE2LCAweDAwMDAwMTFFLCBDUFVfQ0FDSEUsCX0sCisJeyAweDAwMDAwMTc0LCAweDAwMDAwMTc2LCBDUFVfU1lTRU5URVIsCX0sCisJeyAweDAwMDAwMTc5LCAweDAwMDAwMTdCLCBDUFVfTUMsCX0sCisJeyAweDAwMDAwMTg2LCAweDAwMDAwMTg5LCBDUFVfUE1DLAl9LAorCXsgMHgwMDAwMDE5OCwgMHgwMDAwMDE5OSwgQ1BVX1BFUkYsCX0sCisJeyAweDAwMDAwMTlBLCAweDAwMDAwMTlBLCBDUFVfVElNRSwJfSwKKwl7IDB4MDAwMDAxOUIsIDB4MDAwMDAxOUQsIENQVV9USEVSTSwJfSwKKwl7IDB4MDAwMDAxQTAsIDB4MDAwMDAxQTAsIENQVV9NSVNDLAl9LAorCXsgMHgwMDAwMDFDOSwgMHgwMDAwMDFDOSwgQ1BVX0xCUkFOQ0gsCX0sCisJeyAweDAwMDAwMUQ3LCAweDAwMDAwMUQ4LCBDUFVfTEJSQU5DSCwJfSwKKwl7IDB4MDAwMDAxRDksIDB4MDAwMDAxRDksIENQVV9ERUJVRywJfSwKKwl7IDB4MDAwMDAxREEsIDB4MDAwMDAxRTAsIENQVV9MQlJBTkNILAl9LAogCi0JeyAweDAwMDAwMDQwLCAweDAwMDAwMDQzLCBDUFVfTEJSQU5DSCwJQ1BVX1BNX0NYX0FUX1hFCQl9LAotCXsgMHgwMDAwMDA0NCwgMHgwMDAwMDA0NywgQ1BVX0xCUkFOQ0gsCUNQVV9QTV9DT19BVAkJfSwKLQl7IDB4MDAwMDAwNjAsIDB4MDAwMDAwNjMsIENQVV9MQlJBTkNILAlDUFVfQzJfQVQJCX0sCi0JeyAweDAwMDAwMDY0LCAweDAwMDAwMDY3LCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX0FUT00JCX0sCisJeyAweDAwMDAwMjAwLCAweDAwMDAwMjBGLCBDUFVfTVRSUiwJfSwKKwl7IDB4MDAwMDAyNTAsIDB4MDAwMDAyNTAsIENQVV9NVFJSLAl9LAorCXsgMHgwMDAwMDI1OCwgMHgwMDAwMDI1OSwgQ1BVX01UUlIsCX0sCisJeyAweDAwMDAwMjY4LCAweDAwMDAwMjZGLCBDUFVfTVRSUiwJfSwKKwl7IDB4MDAwMDAyNzcsIDB4MDAwMDAyNzcsIENQVV9QQVQsCX0sCisJeyAweDAwMDAwMkZGLCAweDAwMDAwMkZGLCBDUFVfTVRSUiwJfSwKIAotCXsgMHgwMDAwMDA3OSwgMHgwMDAwMDA3OSwgQ1BVX0JJT1MsCUNQVV9QNl9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAwODgsIDB4MDAwMDAwOEEsIENQVV9DQUNIRSwJQ1BVX0lOVEVMX1A2CQl9LAotCXsgMHgwMDAwMDA4QiwgMHgwMDAwMDA4QiwgQ1BVX0JJT1MsCUNQVV9QNl9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAwOUIsIDB4MDAwMDAwOUIsIENQVV9NT05JVE9SLAlDUFVfSU5URUxfWEVPTgkJfSwKKwl7IDB4MDAwMDAzMDAsIDB4MDAwMDAzMTEsIENQVV9QTUMsCX0sCisJeyAweDAwMDAwMzQ1LCAweDAwMDAwMzQ1LCBDUFVfUE1DLAl9LAorCXsgMHgwMDAwMDM2MCwgMHgwMDAwMDM3MSwgQ1BVX1BNQywJfSwKKwl7IDB4MDAwMDAzOEQsIDB4MDAwMDAzOTAsIENQVV9QTUMsCX0sCisJeyAweDAwMDAwM0EwLCAweDAwMDAwM0JFLCBDUFVfUE1DLAl9LAorCXsgMHgwMDAwMDNDMCwgMHgwMDAwMDNDRCwgQ1BVX1BNQywJfSwKKwl7IDB4MDAwMDAzRTAsIDB4MDAwMDAzRTEsIENQVV9QTUMsCX0sCisJeyAweDAwMDAwM0YwLCAweDAwMDAwM0YyLCBDUFVfUE1DLAl9LAogCi0JeyAweDAwMDAwMEMxLCAweDAwMDAwMEMyLCBDUFVfUE1DLAlDUFVfUDZfQ1hfQVQJCX0sCi0JeyAweDAwMDAwMENELCAweDAwMDAwMENELCBDUFVfRlJFUSwJQ1BVX0NYX0FUCQl9LAotCXsgMHgwMDAwMDBFNywgMHgwMDAwMDBFOCwgQ1BVX1BFUkYsCUNQVV9DWF9BVAkJfSwKLQl7IDB4MDAwMDAwRkUsIDB4MDAwMDAwRkUsIENQVV9NVFJSLAlDUFVfUDZfQ1hfWEUJCX0sCisJeyAweDAwMDAwNDAwLCAweDAwMDAwNDE3LCBDUFVfTUMsCX0sCisJeyAweDAwMDAwNDgwLCAweDAwMDAwNDhCLCBDUFVfVk1YLAl9LAogCi0JeyAweDAwMDAwMTE2LCAweDAwMDAwMTE2LCBDUFVfQ0FDSEUsCUNQVV9JTlRFTF9QNgkJfSwKLQl7IDB4MDAwMDAxMTgsIDB4MDAwMDAxMTgsIENQVV9DQUNIRSwJQ1BVX0lOVEVMX1A2CQl9LAotCXsgMHgwMDAwMDExOSwgMHgwMDAwMDExOSwgQ1BVX0NBQ0hFLAlDUFVfSU5URUxfUFgJCX0sCi0JeyAweDAwMDAwMTFBLCAweDAwMDAwMTFCLCBDUFVfQ0FDSEUsCUNQVV9JTlRFTF9QNgkJfSwKLQl7IDB4MDAwMDAxMUUsIDB4MDAwMDAxMUUsIENQVV9DQUNIRSwJQ1BVX1BYX0NYX0FUCQl9LAorCXsgMHgwMDAwMDYwMCwgMHgwMDAwMDYwMCwgQ1BVX0RFQlVHLAl9LAorCXsgMHgwMDAwMDY4MCwgMHgwMDAwMDY4RiwgQ1BVX0xCUkFOQ0gsCX0sCisJeyAweDAwMDAwNkMwLCAweDAwMDAwNkNGLCBDUFVfTEJSQU5DSCwJfSwKIAotCXsgMHgwMDAwMDE3NCwgMHgwMDAwMDE3NiwgQ1BVX1NZU0VOVEVSLAlDUFVfUDZfQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwMTc5LCAweDAwMDAwMTdBLCBDUFVfTUMsCUNQVV9QWF9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAxN0IsIDB4MDAwMDAxN0IsIENQVV9NQywJQ1BVX1A2X1hFCQl9LAotCXsgMHgwMDAwMDE4NiwgMHgwMDAwMDE4NywgQ1BVX1BNQywJQ1BVX1A2X0NYX0FUCQl9LAotCXsgMHgwMDAwMDE5OCwgMHgwMDAwMDE5OSwgQ1BVX1BFUkYsCUNQVV9QTV9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAxOUEsIDB4MDAwMDAxOUEsIENQVV9USU1FLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwMTlCLCAweDAwMDAwMTlELCBDUFVfVEhFUk0sCUNQVV9QTV9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAxQTAsIDB4MDAwMDAxQTAsIENQVV9NSVNDLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCisJeyAweDAwMDEwN0NDLCAweDAwMDEwN0QzLCBDUFVfUE1DLAl9LAogCi0JeyAweDAwMDAwMUM5LCAweDAwMDAwMUM5LCBDUFVfTEJSQU5DSCwJQ1BVX1BNX0NYX0FUCQl9LAotCXsgMHgwMDAwMDFENywgMHgwMDAwMDFEOCwgQ1BVX0xCUkFOQ0gsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDFEOSwgMHgwMDAwMDFEOSwgQ1BVX0RFQlVHLAlDUFVfQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwMURBLCAweDAwMDAwMURBLCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwMURCLCAweDAwMDAwMURCLCBDUFVfTEJSQU5DSCwJQ1BVX1A2X1hFCQl9LAotCXsgMHgwMDAwMDFEQywgMHgwMDAwMDFEQywgQ1BVX0xCUkFOQ0gsCUNQVV9JTlRFTF9QNgkJfSwKLQl7IDB4MDAwMDAxREQsIDB4MDAwMDAxREUsIENQVV9MQlJBTkNILAlDUFVfUFhfQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwMUUwLCAweDAwMDAwMUUwLCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX1A2CQl9LAorCXsgMHhDMDAwMDA4MCwgMHhDMDAwMDA4MCwgQ1BVX0ZFQVRVUkVTLAl9LAorCXsgMHhDMDAwMDA4MSwgMHhDMDAwMDA4NCwgQ1BVX0NBTEwsCX0sCisJeyAweEMwMDAwMTAwLCAweEMwMDAwMTAyLCBDUFVfQkFTRSwJfSwKKwl7IDB4QzAwMDAxMDMsIDB4QzAwMDAxMDMsIENQVV9USU1FLAl9LAogCi0JeyAweDAwMDAwMjAwLCAweDAwMDAwMjBGLCBDUFVfTVRSUiwJQ1BVX1A2X0NYX1hFCQl9LAotCXsgMHgwMDAwMDI1MCwgMHgwMDAwMDI1MCwgQ1BVX01UUlIsCUNQVV9QNl9DWF9YRQkJfSwKLQl7IDB4MDAwMDAyNTgsIDB4MDAwMDAyNTksIENQVV9NVFJSLAlDUFVfUDZfQ1hfWEUJCX0sCi0JeyAweDAwMDAwMjY4LCAweDAwMDAwMjZGLCBDUFVfTVRSUiwJQ1BVX1A2X0NYX1hFCQl9LAotCXsgMHgwMDAwMDI3NywgMHgwMDAwMDI3NywgQ1BVX1BBVCwJQ1BVX0MyX0FUX1hFCQl9LAotCXsgMHgwMDAwMDJGRiwgMHgwMDAwMDJGRiwgQ1BVX01UUlIsCUNQVV9QNl9DWF9YRQkJfSwKLQotCXsgMHgwMDAwMDMwMCwgMHgwMDAwMDMwOCwgQ1BVX1BNQywJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwMzA5LCAweDAwMDAwMzBCLCBDUFVfUE1DLAlDUFVfQzJfQVRfWEUJCX0sCi0JeyAweDAwMDAwMzBDLCAweDAwMDAwMzExLCBDUFVfUE1DLAlDUFVfSU5URUxfWEVPTgkJfSwKLQl7IDB4MDAwMDAzNDUsIDB4MDAwMDAzNDUsIENQVV9QTUMsCUNQVV9DMl9BVAkJfSwKLQl7IDB4MDAwMDAzNjAsIDB4MDAwMDAzNzEsIENQVV9QTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDM4RCwgMHgwMDAwMDM5MCwgQ1BVX1BNQywJQ1BVX0MyX0FUCQl9LAotCXsgMHgwMDAwMDNBMCwgMHgwMDAwMDNCRSwgQ1BVX1BNQywJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwM0MwLCAweDAwMDAwM0NELCBDUFVfUE1DLAlDUFVfSU5URUxfWEVPTgkJfSwKLQl7IDB4MDAwMDAzRTAsIDB4MDAwMDAzRTEsIENQVV9QTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDNGMCwgMHgwMDAwMDNGMCwgQ1BVX1BNQywJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwM0YxLCAweDAwMDAwM0YxLCBDUFVfUE1DLAlDUFVfQzJfQVRfWEUJCX0sCi0JeyAweDAwMDAwM0YyLCAweDAwMDAwM0YyLCBDUFVfUE1DLAlDUFVfSU5URUxfWEVPTgkJfSwKLQotCXsgMHgwMDAwMDQwMCwgMHgwMDAwMDQwMiwgQ1BVX01DLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNDAzLCAweDAwMDAwNDAzLCBDUFVfTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDQwNCwgMHgwMDAwMDQwNiwgQ1BVX01DLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNDA3LCAweDAwMDAwNDA3LCBDUFVfTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDQwOCwgMHgwMDAwMDQwQSwgQ1BVX01DLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNDBCLCAweDAwMDAwNDBCLCBDUFVfTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDQwQywgMHgwMDAwMDQwRSwgQ1BVX01DLAlDUFVfUE1fQ1hfWEUJCX0sCi0JeyAweDAwMDAwNDBGLCAweDAwMDAwNDBGLCBDUFVfTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDQxMCwgMHgwMDAwMDQxMiwgQ1BVX01DLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNDEzLCAweDAwMDAwNDE3LCBDUFVfTUMsCUNQVV9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDA0ODAsIDB4MDAwMDA0OEIsIENQVV9WTVgsCUNQVV9DWF9BVF9YRQkJfSwKLQotCXsgMHgwMDAwMDYwMCwgMHgwMDAwMDYwMCwgQ1BVX0RFQlVHLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNjgwLCAweDAwMDAwNjhGLCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwNkMwLCAweDAwMDAwNkNGLCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0KLQl7IDB4MDAwMTA3Q0MsIDB4MDAwMTA3RDMsIENQVV9QTUMsCUNQVV9JTlRFTF9YRU9OX01QCX0sCi0KLQl7IDB4QzAwMDAwODAsIDB4QzAwMDAwODAsIENQVV9GRUFUVVJFUywJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweEMwMDAwMDgxLCAweEMwMDAwMDgyLCBDUFVfQ0FMTCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweEMwMDAwMDg0LCAweEMwMDAwMDg0LCBDUFVfQ0FMTCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweEMwMDAwMTAwLCAweEMwMDAwMTAyLCBDUFVfQkFTRSwJQ1BVX0lOVEVMX1hFT04JCX0sCisJeyAweEMwMDEwMDAwLCAweEMwMDEwMDA3LCBDUFVfUE1DLAl9LAorCXsgMHhDMDAxMDAxMCwgMHhDMDAxMDAxMCwgQ1BVX0NPTkYsCX0sCisJeyAweEMwMDEwMDE1LCAweEMwMDEwMDE1LCBDUFVfQ09ORiwJfSwKKwl7IDB4QzAwMTAwMTYsIDB4QzAwMTAwMUEsIENQVV9NVFJSLAl9LAorCXsgMHhDMDAxMDAxRCwgMHhDMDAxMDAxRCwgQ1BVX01UUlIsCX0sCisJeyAweEMwMDEwMDFGLCAweEMwMDEwMDFGLCBDUFVfQ09ORiwJfSwKKwl7IDB4QzAwMTAwMzAsIDB4QzAwMTAwMzUsIENQVV9CSU9TLAl9LAorCXsgMHhDMDAxMDA0NCwgMHhDMDAxMDA0OCwgQ1BVX01DLAl9LAorCXsgMHhDMDAxMDA1MCwgMHhDMDAxMDA1NiwgQ1BVX1NNTSwJfSwKKwl7IDB4QzAwMTAwNTgsIDB4QzAwMTAwNTgsIENQVV9DT05GLAl9LAorCXsgMHhDMDAxMDA2MCwgMHhDMDAxMDA2MCwgQ1BVX0NBQ0hFLAl9LAorCXsgMHhDMDAxMDA2MSwgMHhDMDAxMDA2OCwgQ1BVX1NNTSwJfSwKKwl7IDB4QzAwMTAwNjksIDB4QzAwMTAwNkIsIENQVV9TTU0sCX0sCisJeyAweEMwMDEwMDcwLCAweEMwMDEwMDcxLCBDUFVfU01NLAl9LAorCXsgMHhDMDAxMDExMSwgMHhDMDAxMDExMywgQ1BVX1NNTSwJfSwKKwl7IDB4QzAwMTAxMTQsIDB4QzAwMTAxMTgsIENQVV9TVk0sCX0sCisJeyAweEMwMDEwMTQwLCAweEMwMDEwMTQxLCBDUFVfT1NWTSwJfSwKKwl7IDB4QzAwMTEwMjIsIDB4QzAwMTEwMjMsIENQVV9DT05GLAl9LAogfTsKIAotLyogQU1EIFJlZ2lzdGVycyBSYW5nZSAqLwotc3RhdGljIHN0cnVjdCBjcHVfZGVidWdfcmFuZ2UgY3B1X2FtZF9yYW5nZVtdID0gewotCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgQ1BVX01DLAlDUFVfSzEwX1BMVVMsCQl9LAotCXsgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgQ1BVX1RJTUUsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4MDAwMDAwMUIsIDB4MDAwMDAwMUIsIENQVV9BUElDLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMDJBLCAweDAwMDAwMDJBLCBDUFVfUE9XRVJPTiwJQ1BVX0s3X1BMVVMJCX0sCi0JeyAweDAwMDAwMDhCLCAweDAwMDAwMDhCLCBDUFVfVkVSLAlDUFVfSzhfUExVUwkJfSwKLQl7IDB4MDAwMDAwRkUsIDB4MDAwMDAwRkUsIENQVV9NVFJSLAlDUFVfSzhfUExVUywJCX0sCi0KLQl7IDB4MDAwMDAxNzQsIDB4MDAwMDAxNzYsIENQVV9TWVNFTlRFUiwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHgwMDAwMDE3OSwgMHgwMDAwMDE3QiwgQ1BVX01DLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMUQ5LCAweDAwMDAwMUQ5LCBDUFVfREVCVUcsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4MDAwMDAxREIsIDB4MDAwMDAxREUsIENQVV9MQlJBTkNILAlDUFVfSzhfUExVUywJCX0sCi0KLQl7IDB4MDAwMDAyMDAsIDB4MDAwMDAyMEYsIENQVV9NVFJSLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMjUwLCAweDAwMDAwMjUwLCBDUFVfTVRSUiwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHgwMDAwMDI1OCwgMHgwMDAwMDI1OSwgQ1BVX01UUlIsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4MDAwMDAyNjgsIDB4MDAwMDAyNkYsIENQVV9NVFJSLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMjc3LCAweDAwMDAwMjc3LCBDUFVfUEFULAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMkZGLCAweDAwMDAwMkZGLCBDUFVfTVRSUiwJQ1BVX0s4X1BMVVMsCQl9LAotCi0JeyAweDAwMDAwNDAwLCAweDAwMDAwNDEzLCBDUFVfTUMsCUNQVV9LOF9QTFVTLAkJfSwKLQotCXsgMHhDMDAwMDA4MCwgMHhDMDAwMDA4MCwgQ1BVX0ZFQVRVUkVTLAlDUFVfQU1EX0FMTCwJCX0sCi0JeyAweEMwMDAwMDgxLCAweEMwMDAwMDg0LCBDUFVfQ0FMTCwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHhDMDAwMDEwMCwgMHhDMDAwMDEwMiwgQ1BVX0JBU0UsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4QzAwMDAxMDMsIDB4QzAwMDAxMDMsIENQVV9USU1FLAlDUFVfSzEwX1BMVVMsCQl9LAotCi0JeyAweEMwMDEwMDAwLCAweEMwMDEwMDA3LCBDUFVfUE1DLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweEMwMDEwMDEwLCAweEMwMDEwMDEwLCBDUFVfQ09ORiwJQ1BVX0s3X1BMVVMsCQl9LAotCXsgMHhDMDAxMDAxNSwgMHhDMDAxMDAxNSwgQ1BVX0NPTkYsCUNQVV9LN19QTFVTLAkJfSwKLQl7IDB4QzAwMTAwMTYsIDB4QzAwMTAwMUEsIENQVV9NVFJSLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweEMwMDEwMDFELCAweEMwMDEwMDFELCBDUFVfTVRSUiwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHhDMDAxMDAxRiwgMHhDMDAxMDAxRiwgQ1BVX0NPTkYsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4QzAwMTAwMzAsIDB4QzAwMTAwMzUsIENQVV9CSU9TLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweEMwMDEwMDQ0LCAweEMwMDEwMDQ4LCBDUFVfTUMsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4QzAwMTAwNTAsIDB4QzAwMTAwNTYsIENQVV9TTU0sCUNQVV9LMEZfUExVUywJCX0sCi0JeyAweEMwMDEwMDU4LCAweEMwMDEwMDU4LCBDUFVfQ09ORiwJQ1BVX0sxMF9QTFVTLAkJfSwKLQl7IDB4QzAwMTAwNjAsIDB4QzAwMTAwNjAsIENQVV9DQUNIRSwJQ1BVX0FNRF8xMSwJCX0sCi0JeyAweEMwMDEwMDYxLCAweEMwMDEwMDY4LCBDUFVfU01NLAlDUFVfSzEwX1BMVVMsCQl9LAotCXsgMHhDMDAxMDA2OSwgMHhDMDAxMDA2QiwgQ1BVX1NNTSwJQ1BVX0FNRF8xMSwJCX0sCi0JeyAweEMwMDEwMDcwLCAweEMwMDEwMDcxLCBDUFVfU01NLAlDUFVfSzEwX1BMVVMsCQl9LAotCXsgMHhDMDAxMDExMSwgMHhDMDAxMDExMywgQ1BVX1NNTSwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHhDMDAxMDExNCwgMHhDMDAxMDExOCwgQ1BVX1NWTSwJQ1BVX0sxMF9QTFVTLAkJfSwKLQl7IDB4QzAwMTAxNDAsIDB4QzAwMTAxNDEsIENQVV9PU1ZNLAlDUFVfSzEwX1BMVVMsCQl9LAotCXsgMHhDMDAxMTAyMiwgMHhDMDAxMTAyMywgQ1BVX0NPTkYsCUNQVV9LMTBfUExVUywJCX0sCi19OwotCi0KLS8qIEludGVsICovCi1zdGF0aWMgaW50IGdldF9pbnRlbF9tb2RlbGZsYWcodW5zaWduZWQgbW9kZWwpCi17Ci0JaW50IGZsYWc7Ci0KLQlzd2l0Y2ggKG1vZGVsKSB7Ci0JY2FzZSAweDA1MDE6Ci0JY2FzZSAweDA1MDI6Ci0JY2FzZSAweDA1MDQ6Ci0JCWZsYWcgPSBDUFVfSU5URUxfUEVOVElVTTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA2MDE6Ci0JY2FzZSAweDA2MDM6Ci0JY2FzZSAweDA2MDU6Ci0JY2FzZSAweDA2MDc6Ci0JY2FzZSAweDA2MDg6Ci0JY2FzZSAweDA2MEE6Ci0JY2FzZSAweDA2MEI6Ci0JCWZsYWcgPSBDUFVfSU5URUxfUDY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwNjA5OgotCWNhc2UgMHgwNjBEOgotCQlmbGFnID0gQ1BVX0lOVEVMX1BFTlRJVU1fTTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA2MEU6Ci0JCWZsYWcgPSBDUFVfSU5URUxfQ09SRTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA2MEY6Ci0JY2FzZSAweDA2MTc6Ci0JCWZsYWcgPSBDUFVfSU5URUxfQ09SRTI7Ci0JCWJyZWFrOwotCWNhc2UgMHgwNjFDOgotCQlmbGFnID0gQ1BVX0lOVEVMX0FUT007Ci0JCWJyZWFrOwotCWNhc2UgMHgwRjAwOgotCWNhc2UgMHgwRjAxOgotCWNhc2UgMHgwRjAyOgotCWNhc2UgMHgwRjAzOgotCWNhc2UgMHgwRjA0OgotCQlmbGFnID0gQ1BVX0lOVEVMX1hFT05fUDQ7Ci0JCWJyZWFrOwotCWNhc2UgMHgwRjA2OgotCQlmbGFnID0gQ1BVX0lOVEVMX1hFT05fTVA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZsYWcgPSBDUFVfTk9ORTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGZsYWc7Ci19Ci0KLS8qIEFNRCAqLwotc3RhdGljIGludCBnZXRfYW1kX21vZGVsZmxhZyh1bnNpZ25lZCBtb2RlbCkKLXsKLQlpbnQgZmxhZzsKLQotCXN3aXRjaCAobW9kZWwgPj4gOCkgewotCWNhc2UgMHg2OgotCQlmbGFnID0gQ1BVX0FNRF9LNjsKLQkJYnJlYWs7Ci0JY2FzZSAweDc6Ci0JCWZsYWcgPSBDUFVfQU1EX0s3OwotCQlicmVhazsKLQljYXNlIDB4ODoKLQkJZmxhZyA9IENQVV9BTURfSzg7Ci0JCWJyZWFrOwotCWNhc2UgMHhmOgotCQlmbGFnID0gQ1BVX0FNRF8wRjsKLQkJYnJlYWs7Ci0JY2FzZSAweDEwOgotCQlmbGFnID0gQ1BVX0FNRF8xMDsKLQkJYnJlYWs7Ci0JY2FzZSAweDExOgotCQlmbGFnID0gQ1BVX0FNRF8xMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmxhZyA9IENQVV9OT05FOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZmxhZzsKLX0KLQotc3RhdGljIGludCBnZXRfY3B1X21vZGVsZmxhZyh1bnNpZ25lZCBjcHUpCi17Ci0JaW50IGZsYWc7Ci0KLQlmbGFnID0gcGVyX2NwdShjcHVfbW9kZWwsIGNwdSk7Ci0KLQlzd2l0Y2ggKGZsYWcgPj4gMTYpIHsKLQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6Ci0JCWZsYWcgPSBnZXRfaW50ZWxfbW9kZWxmbGFnKGZsYWcpOwotCQlicmVhazsKLQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQlmbGFnID0gZ2V0X2FtZF9tb2RlbGZsYWcoZmxhZyAmIDB4ZmZmZik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZsYWcgPSBDUFVfTk9ORTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2NwdV9yYW5nZV9jb3VudCh1bnNpZ25lZCBjcHUpCi17Ci0JaW50IGluZGV4OwotCi0Jc3dpdGNoIChwZXJfY3B1KGNwdV9tb2RlbCwgY3B1KSA+PiAxNikgewotCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKLQkJaW5kZXggPSBBUlJBWV9TSVpFKGNwdV9pbnRlbF9yYW5nZSk7Ci0JCWJyZWFrOwotCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6Ci0JCWluZGV4ID0gQVJSQVlfU0laRShjcHVfYW1kX3JhbmdlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaW5kZXggPSAwOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0KIHN0YXRpYyBpbnQgaXNfdHlwZWZsYWdfdmFsaWQodW5zaWduZWQgY3B1LCB1bnNpZ25lZCBmbGFnKQogewotCXVuc2lnbmVkIHZlbmRvciwgbW9kZWxmbGFnOwotCWludCBpLCBpbmRleDsKKwlpbnQgaTsKIAogCS8qIFN0YW5kYXJkIFJlZ2lzdGVycyBzaG91bGQgYmUgYWx3YXlzIHZhbGlkICovCiAJaWYgKGZsYWcgPj0gQ1BVX1RTUykKIAkJcmV0dXJuIDE7CiAKLQltb2RlbGZsYWcgPSBwZXJfY3B1KGNwdV9tb2RlbGZsYWcsIGNwdSk7Ci0JdmVuZG9yID0gcGVyX2NwdShjcHVfbW9kZWwsIGNwdSkgPj4gMTY7Ci0JaW5kZXggPSBnZXRfY3B1X3JhbmdlX2NvdW50KGNwdSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgewotCQlzd2l0Y2ggKHZlbmRvcikgewotCQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6Ci0JCQlpZiAoKGNwdV9pbnRlbF9yYW5nZVtpXS5tb2RlbCAmIG1vZGVsZmxhZykgJiYKLQkJCSAgICAoY3B1X2ludGVsX3JhbmdlW2ldLmZsYWcgJiBmbGFnKSkKLQkJCQlyZXR1cm4gMTsKLQkJCWJyZWFrOwotCQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQkJaWYgKChjcHVfYW1kX3JhbmdlW2ldLm1vZGVsICYgbW9kZWxmbGFnKSAmJgotCQkJICAgIChjcHVfYW1kX3JhbmdlW2ldLmZsYWcgJiBmbGFnKSkKLQkJCQlyZXR1cm4gMTsKLQkJCWJyZWFrOwotCQl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3B1X3JlZ19yYW5nZSk7IGkrKykgeworCQlpZiAoY3B1X3JlZ19yYW5nZVtpXS5mbGFnID09IGZsYWcpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBJbnZhbGlkICovCkBAIC0zODUsMjYgKzE4MywxMSBAQAogc3RhdGljIHVuc2lnbmVkIGdldF9jcHVfcmFuZ2UodW5zaWduZWQgY3B1LCB1bnNpZ25lZCAqbWluLCB1bnNpZ25lZCAqbWF4LAogCQkJICAgICAgaW50IGluZGV4LCB1bnNpZ25lZCBmbGFnKQogewotCXVuc2lnbmVkIG1vZGVsZmxhZzsKLQotCW1vZGVsZmxhZyA9IHBlcl9jcHUoY3B1X21vZGVsZmxhZywgY3B1KTsKLQkqbWF4ID0gMDsKLQlzd2l0Y2ggKHBlcl9jcHUoY3B1X21vZGVsLCBjcHUpID4+IDE2KSB7Ci0JY2FzZSBYODZfVkVORE9SX0lOVEVMOgotCQlpZiAoKGNwdV9pbnRlbF9yYW5nZVtpbmRleF0ubW9kZWwgJiBtb2RlbGZsYWcpICYmCi0JCSAgICAoY3B1X2ludGVsX3JhbmdlW2luZGV4XS5mbGFnICYgZmxhZykpIHsKLQkJCSptaW4gPSBjcHVfaW50ZWxfcmFuZ2VbaW5kZXhdLm1pbjsKLQkJCSptYXggPSBjcHVfaW50ZWxfcmFuZ2VbaW5kZXhdLm1heDsKLQkJfQotCQlicmVhazsKLQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQlpZiAoKGNwdV9hbWRfcmFuZ2VbaW5kZXhdLm1vZGVsICYgbW9kZWxmbGFnKSAmJgotCQkgICAgKGNwdV9hbWRfcmFuZ2VbaW5kZXhdLmZsYWcgJiBmbGFnKSkgewotCQkJKm1pbiA9IGNwdV9hbWRfcmFuZ2VbaW5kZXhdLm1pbjsKLQkJCSptYXggPSBjcHVfYW1kX3JhbmdlW2luZGV4XS5tYXg7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorCWlmIChjcHVfcmVnX3JhbmdlW2luZGV4XS5mbGFnID09IGZsYWcpIHsKKwkJKm1pbiA9IGNwdV9yZWdfcmFuZ2VbaW5kZXhdLm1pbjsKKwkJKm1heCA9IGNwdV9yZWdfcmFuZ2VbaW5kZXhdLm1heDsKKwl9IGVsc2UKKwkJKm1heCA9IDA7CiAKIAlyZXR1cm4gKm1heDsKIH0KQEAgLTQzNCw3ICsyMTcsNyBAQAogCXVuc2lnbmVkIG1zciwgbXNyX21pbiwgbXNyX21heDsKIAlzdHJ1Y3QgY3B1X3ByaXZhdGUgKnByaXY7CiAJdTMyIGxvdywgaGlnaDsKLQlpbnQgaSwgcmFuZ2U7CisJaW50IGk7CiAKIAlpZiAoc2VxKSB7CiAJCXByaXYgPSBzZXEtPnByaXZhdGU7CkBAIC00NDYsOSArMjI5LDcgQEAKIAkJfQogCX0KIAotCXJhbmdlID0gZ2V0X2NwdV9yYW5nZV9jb3VudChjcHUpOwotCi0JZm9yIChpID0gMDsgaSA8IHJhbmdlOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcHVfcmVnX3JhbmdlKTsgaSsrKSB7CiAJCWlmICghZ2V0X2NwdV9yYW5nZShjcHUsICZtc3JfbWluLCAmbXNyX21heCwgaSwgZmxhZykpCiAJCQljb250aW51ZTsKIApAQCAtNTg4LDggKzM2OSwyMCBAQAogCXNlcV9wcmludGYoc2VxLCAiIFRNSUNUXHRcdDogJTA4eFxuIiwgIGFwaWNfcmVhZChBUElDX1RNSUNUKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgVE1DQ1RcdFx0OiAlMDh4XG4iLCAgYXBpY19yZWFkKEFQSUNfVE1DQ1QpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiBURENSXHRcdDogJTA4eFxuIiwgIGFwaWNfcmVhZChBUElDX1REQ1IpKTsKLSNlbmRpZiAvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KKwlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0VYVEFQSUMpKSB7CisJCXVuc2lnbmVkIGludCBpLCB2LCBtYXhlaWx2dDsKIAorCQl2ID0gYXBpY19yZWFkKEFQSUNfRUZFQVQpOworCQltYXhlaWx2dCA9ICh2ID4+IDE2KSAmIDB4ZmY7CisJCXNlcV9wcmludGYoc2VxLCAiIEVGRUFUXHRcdDogJTA4eFxuIiwgdik7CisJCXNlcV9wcmludGYoc2VxLCAiIEVDVFJMXHRcdDogJTA4eFxuIiwgYXBpY19yZWFkKEFQSUNfRUNUUkwpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4ZWlsdnQ7IGkrKykgeworCQkJdiA9IGFwaWNfcmVhZChBUElDX0VJTFZUbihpKSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiBFSUxWVCVkXHRcdDogJTA4eFxuIiwgaSwgdik7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAJc2VxX3ByaW50ZihzZXEsICJcbiBNU1JcdDpcbiIpOwogfQogCkBAIC03ODgsMTMgKzU4MSwxMSBAQAogewogCXN0cnVjdCBkZW50cnkgKmNwdV9kZW50cnkgPSBOVUxMOwogCXVuc2lnbmVkIHJlZywgcmVnX21pbiwgcmVnX21heDsKLQlpbnQgaSwgcmFuZ2UsIGVyciA9IDA7CisJaW50IGksIGVyciA9IDA7CiAJY2hhciByZWdfZGlyWzEyXTsKIAl1MzIgbG93LCBoaWdoOwogCi0JcmFuZ2UgPSBnZXRfY3B1X3JhbmdlX2NvdW50KGNwdSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2U7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNwdV9yZWdfcmFuZ2UpOyBpKyspIHsKIAkJaWYgKCFnZXRfY3B1X3JhbmdlKGNwdSwgJnJlZ19taW4sICZyZWdfbWF4LCBpLAogCQkJCSAgIGNwdV9iYXNlW3R5cGVdLmZsYWcpKQogCQkJY29udGludWU7CkBAIC04NTAsMTAgKzY0MSw2IEBACiAJCWNwdWkgPSAmY3B1X2RhdGEoY3B1KTsKIAkJaWYgKCFjcHVfaGFzKGNwdWksIFg4Nl9GRUFUVVJFX01TUikpCiAJCQljb250aW51ZTsKLQkJcGVyX2NwdShjcHVfbW9kZWwsIGNwdSkgPSAoKGNwdWktPng4Nl92ZW5kb3IgPDwgMTYpIHwKLQkJCQkJICAgKGNwdWktPng4NiA8PCA4KSB8Ci0JCQkJCSAgIChjcHVpLT54ODZfbW9kZWwpKTsKLQkJcGVyX2NwdShjcHVfbW9kZWxmbGFnLCBjcHUpID0gZ2V0X2NwdV9tb2RlbGZsYWcoY3B1KTsKIAogCQlzcHJpbnRmKGNwdV9kaXIsICJjcHUlZCIsIGNwdSk7CiAJCWNwdV9kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoY3B1X2RpciwgY3B1X2RlYnVnZnNfZGlyKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKaW5kZXggNTJjODM5OC4uZjEzOGM2YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKQEAgLTIyMCwxMSArMjIwLDE0IEBACiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKIGNvbmZpZyBYODZfRV9QT1dFUlNBVkVSCi0JdHJpc3RhdGUgIlZJQSBDNyBFbmhhbmNlZCBQb3dlclNhdmVyIgorCXRyaXN0YXRlICJWSUEgQzcgRW5oYW5jZWQgUG93ZXJTYXZlciAoREFOR0VST1VTKSIKIAlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKLQlkZXBlbmRzIG9uIFg4Nl8zMgorCWRlcGVuZHMgb24gWDg2XzMyICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKLQkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIFZJQSBDNyBwcm9jZXNzb3JzLgorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgVklBIEM3IHByb2Nlc3NvcnMuICBIb3dldmVyLCB0aGlzIGRyaXZlcgorCSAgZG9lcyBub3QgaGF2ZSBhbnkgc2FmZWd1YXJkcyB0byBwcmV2ZW50IG9wZXJhdGluZyB0aGUgQ1BVIG91dCBvZiBzcGVjCisJICBhbmQgaXMgdGh1cyBjb25zaWRlcmVkIGRhbmdlcm91cy4gIFBsZWFzZSB1c2UgdGhlIHJlZ3VsYXIgQUNQSSBjcHVmcmVxCisJICBkcml2ZXIsIGVuYWJsZWQgYnkgQ09ORklHX1g4Nl9BQ1BJX0NQVUZSRVEuCiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCmluZGV4IDc1MmU4YzYuLmFlOWI1MDMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC05MCwxMSArOTAsNyBAQAogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqY3B1ID0gJmNwdV9kYXRhKGNwdWlkKTsKIAotCWlmIChjcHUtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fAotCSAgICAhY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX0VTVCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7CisJcmV0dXJuIGNwdV9oYXMoY3B1LCBYODZfRkVBVFVSRV9FU1QpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgZXh0cmFjdF9pbyh1MzIgdmFsdWUsIHN0cnVjdCBhY3BpX2NwdWZyZXFfZGF0YSAqZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCA3NDM3ZmExLi5kYWVkMzliIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC0yMjksMTIgKzIyOSwxMiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBzcmF0X2RldGVjdF9ub2RlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgc3JhdF9kZXRlY3Rfbm9kZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogCXVuc2lnbmVkIG5vZGU7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgYXBpY2lkID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGFwaWNpZCA9IGNwdV9oYXNfYXBpYyA/IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpIDogYy0+YXBpY2lkOwogCiAJLyogRG9uJ3QgZG8gdGhlIGZ1bmt5IGZhbGxiYWNrIGhldXJpc3RpY3MgdGhlIEFNRCB2ZXJzaW9uIGVtcGxveXMKIAkgICBmb3Igbm93LiAqLwpAQCAtNDAwLDcgKzQwMCw3IEBACiAJfQogCiAJLyogV29yayBhcm91bmQgZXJyYXRhICovCi0Jc3JhdF9kZXRlY3Rfbm9kZSgpOworCXNyYXRfZGV0ZWN0X25vZGUoYyk7CiAKIAlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9WTVgpKQogCQlkZXRlY3Rfdm14X3ZpcnRjYXAoYyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYwppbmRleCA0ODNlZGE5Li43ODllZmUyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2s4Lmg+CiAKICNkZWZpbmUgTFZMXzFfSU5TVAkxCiAjZGVmaW5lIExWTF8xX0RBVEEJMgpAQCAtMTU5LDE0ICsxNjAsNiBAQAogCXVuc2lnbmVkIGxvbmcgY2FuX2Rpc2FibGU7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENPTkZJR19TWVNGUykKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBrOF9uYl9pZFtdID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMTAzKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMjAzKSB9LAotCXt9Ci19OwotI2VuZGlmCi0KIHVuc2lnbmVkIHNob3J0CQkJbnVtX2NhY2hlX2xlYXZlczsKIAogLyogQU1EIGRvZXNuJ3QgaGF2ZSBDUFVJRDQuIEVtdWxhdGUgaXQgaGVyZSB0byByZXBvcnQgdGhlIHNhbWUKQEAgLTIwNywxMCArMjAwLDE3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgX19jcHVpbml0Y29uc3QgYXNzb2NzW10gPSB7Ci0JWzFdID0gMSwgWzJdID0gMiwgWzRdID0gNCwgWzZdID0gOCwKLQlbOF0gPSAxNiwgWzB4YV0gPSAzMiwgWzB4Yl0gPSA0OCwKKwlbMV0gPSAxLAorCVsyXSA9IDIsCisJWzRdID0gNCwKKwlbNl0gPSA4LAorCVs4XSA9IDE2LAorCVsweGFdID0gMzIsCisJWzB4Yl0gPSA0OCwKIAlbMHhjXSA9IDY0LAotCVsweGZdID0gMHhmZmZmIC8vID8/CisJWzB4ZF0gPSA5NiwKKwlbMHhlXSA9IDEyOCwKKwlbMHhmXSA9IDB4ZmZmZiAvKiBmdWxseSBhc3NvY2lhdGl2ZSAtIG5vIHdheSB0byBzaG93IHRoaXMgY3VycmVudGx5ICovCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfX2NwdWluaXRjb25zdCBsZXZlbHNbXSA9IHsgMSwgMSwgMiwgMyB9OwpAQCAtMjcxLDcgKzI3MSw4IEBACiAJZWF4LT5zcGxpdC50eXBlID0gdHlwZXNbbGVhZl07CiAJZWF4LT5zcGxpdC5sZXZlbCA9IGxldmVsc1tsZWFmXTsKIAlpZiAobGVhZiA9PSAzKQotCQllYXgtPnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmcgPSBjdXJyZW50X2NwdV9kYXRhLng4Nl9tYXhfY29yZXMgLSAxOworCQllYXgtPnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmcgPQorCQkJY3VycmVudF9jcHVfZGF0YS54ODZfbWF4X2NvcmVzIC0gMTsKIAllbHNlCiAJCWVheC0+c3BsaXQubnVtX3RocmVhZHNfc2hhcmluZyA9IDA7CiAJZWF4LT5zcGxpdC5udW1fY29yZXNfb25fZGllID0gY3VycmVudF9jcHVfZGF0YS54ODZfbWF4X2NvcmVzIC0gMTsKQEAgLTI5MSw2ICsyOTIsMTQgQEAKIHsKIAlpZiAoaW5kZXggPCAzKQogCQlyZXR1cm47CisKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxMSkKKwkJcmV0dXJuOworCisJLyogc2VlIGVycmF0dW0gIzM4MiAqLworCWlmICgoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxMCkgJiYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDwgMHg4KSkKKwkJcmV0dXJuOworCiAJdGhpc19sZWFmLT5jYW5fZGlzYWJsZSA9IDE7CiB9CiAKQEAgLTY5Niw5OCArNzA1LDc2IEBACiAjZGVmaW5lIHRvX29iamVjdChrKQljb250YWluZXJfb2Yoaywgc3RydWN0IF9pbmRleF9rb2JqZWN0LCBrb2JqKQogI2RlZmluZSB0b19hdHRyKGEpCWNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgX2NhY2hlX2F0dHIsIGF0dHIpCiAKLSNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKmdldF9rOF9ub3J0aGJyaWRnZShpbnQgbm9kZSkKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKKwkJCQkgIHVuc2lnbmVkIGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPD0gbm9kZTsgaSsrKSB7Ci0JCWRvIHsKLQkJCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldik7Ci0JCQlpZiAoIWRldikKLQkJCQlicmVhazsKLQkJfSB3aGlsZSAoIXBjaV9tYXRjaF9pZCgmazhfbmJfaWRbMF0sIGRldikpOwotCQlpZiAoIWRldikKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gZGV2OwotfQotI2Vsc2UKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqZ2V0X2s4X25vcnRoYnJpZGdlKGludCBub2RlKQotewotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzc2l6ZV90IHNob3dfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikKLXsKLQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayA9IHRvX2NwdW1hc2sodGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCk7Ci0JaW50IG5vZGUgPSBjcHVfdG9fbm9kZShjcHVtYXNrX2ZpcnN0KG1hc2spKTsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlzc2l6ZV90IHJldCA9IDA7Ci0JaW50IGk7CisJaW50IGNwdSA9IGNwdW1hc2tfZmlyc3QodG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CisJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBub2RlX3RvX2s4X25iX21pc2Mobm9kZSk7CisJdW5zaWduZWQgaW50IHJlZyA9IDA7CiAKIAlpZiAoIXRoaXNfbGVhZi0+Y2FuX2Rpc2FibGUpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkZlYXR1cmUgbm90IGVuYWJsZWRcbiIpOwotCi0JZGV2ID0gZ2V0X2s4X25vcnRoYnJpZGdlKG5vZGUpOwotCWlmICghZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQXR0ZW1wdGluZyBBTUQgbm9ydGhicmlkZ2Ugb3BlcmF0aW9uIG9uIGEgc3lzdGVtIHdpdGggbm8gbm9ydGhicmlkZ2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCByZWc7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4MUJDICsgaSAqIDQsICZyZWcpOwotCi0JCXJldCArPSBzcHJpbnRmKGJ1ZiwgIiVzRW50cnk6ICVkXG4iLCBidWYsIGkpOwotCQlyZXQgKz0gc3ByaW50ZihidWYsICIlc1JlYWRzOiAgJXNcdE5ldyBFbnRyaWVzOiAlc1xuIiwgIAotCQkJYnVmLAotCQkJcmVnICYgMHg4MDAwMDAwMCA/ICJEaXNhYmxlZCIgOiAiQWxsb3dlZCIsCi0JCQlyZWcgJiAweDQwMDAwMDAwID8gIkRpc2FibGVkIiA6ICJBbGxvd2VkIik7Ci0JCXJldCArPSBzcHJpbnRmKGJ1ZiwgIiVzU3ViQ2FjaGU6ICV4XHRJbmRleDogJXhcbiIsCi0JCQlidWYsIChyZWcgJiAweDMwMDAwKSA+PiAxNiwgcmVnICYgMHhmZmYpOwotCX0KLQlyZXR1cm4gcmV0OworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4MUJDICsgaW5kZXggKiA0LCAmcmVnKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgcmVnKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXN0b3JlX2NhY2hlX2Rpc2FibGUoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjb25zdCBjaGFyICpidWYsCi0JCSAgICBzaXplX3QgY291bnQpCisjZGVmaW5lIFNIT1dfQ0FDSEVfRElTQUJMRShpbmRleCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X2NhY2hlX2Rpc2FibGVfIyNpbmRleChzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikgIAlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2NhY2hlX2Rpc2FibGUodGhpc19sZWFmLCBidWYsIGluZGV4KTsJCVwKK30KK1NIT1dfQ0FDSEVfRElTQUJMRSgwKQorU0hPV19DQUNIRV9ESVNBQkxFKDEpCisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2NhY2hlX2Rpc2FibGUoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCB1bnNpZ25lZCBpbnQgaW5kZXgpCiB7Ci0JY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2sgPSB0b19jcHVtYXNrKHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOwotCWludCBub2RlID0gY3B1X3RvX25vZGUoY3B1bWFza19maXJzdChtYXNrKSk7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IHJldCwgaW5kZXgsIHZhbDsKKwlpbnQgY3B1ID0gY3B1bWFza19maXJzdCh0b19jcHVtYXNrKHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApKTsKKwlpbnQgbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IG5vZGVfdG9fazhfbmJfbWlzYyhub2RlKTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CisJdW5zaWduZWQgaW50IHNjcnViYmVyID0gMDsKIAogCWlmICghdGhpc19sZWFmLT5jYW5fZGlzYWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc3RybGVuKGJ1ZikgPiAxNSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmaW5kZXgsICZ2YWwpOwotCWlmIChyZXQgIT0gMikKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIWRldikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGluZGV4ID4gMSkKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdmFsIHw9IDB4YzAwMDAwMDA7Ci0JZGV2ID0gZ2V0X2s4X25vcnRoYnJpZGdlKG5vZGUpOwotCWlmICghZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQXR0ZW1wdGluZyBBTUQgbm9ydGhicmlkZ2Ugb3BlcmF0aW9uIG9uIGEgc3lzdGVtIHdpdGggbm8gbm9ydGhicmlkZ2VcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDU4LCAmc2NydWJiZXIpOworCXNjcnViYmVyICY9IH4weDFmMDAwMDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDU4LCBzY3J1YmJlcik7CiAKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHgxQkMgKyBpbmRleCAqIDQsIHZhbCAmIH4weDQwMDAwMDAwKTsKIAl3YmludmQoKTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHgxQkMgKyBpbmRleCAqIDQsIHZhbCk7Ci0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKKyNkZWZpbmUgU1RPUkVfQ0FDSEVfRElTQUJMRShpbmRleCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzdG9yZV9jYWNoZV9kaXNhYmxlXyMjaW5kZXgoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLAkgICAgIAlcCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzdG9yZV9jYWNoZV9kaXNhYmxlKHRoaXNfbGVhZiwgYnVmLCBjb3VudCwgaW5kZXgpOwlcCit9CitTVE9SRV9DQUNIRV9ESVNBQkxFKDApCitTVE9SRV9DQUNIRV9ESVNBQkxFKDEpCisKIHN0cnVjdCBfY2FjaGVfYXR0ciB7CiAJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwogCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgX2NwdWlkNF9pbmZvICosIGNoYXIgKik7CkBAIC04MDgsNyArNzk1LDEwIEBACiBkZWZpbmVfb25lX3JvKHNoYXJlZF9jcHVfbWFwKTsKIGRlZmluZV9vbmVfcm8oc2hhcmVkX2NwdV9saXN0KTsKIAotc3RhdGljIHN0cnVjdCBfY2FjaGVfYXR0ciBjYWNoZV9kaXNhYmxlID0gX19BVFRSKGNhY2hlX2Rpc2FibGUsIDA2NDQsIHNob3dfY2FjaGVfZGlzYWJsZSwgc3RvcmVfY2FjaGVfZGlzYWJsZSk7CitzdGF0aWMgc3RydWN0IF9jYWNoZV9hdHRyIGNhY2hlX2Rpc2FibGVfMCA9IF9fQVRUUihjYWNoZV9kaXNhYmxlXzAsIDA2NDQsCisJCXNob3dfY2FjaGVfZGlzYWJsZV8wLCBzdG9yZV9jYWNoZV9kaXNhYmxlXzApOworc3RhdGljIHN0cnVjdCBfY2FjaGVfYXR0ciBjYWNoZV9kaXNhYmxlXzEgPSBfX0FUVFIoY2FjaGVfZGlzYWJsZV8xLCAwNjQ0LAorCQlzaG93X2NhY2hlX2Rpc2FibGVfMSwgc3RvcmVfY2FjaGVfZGlzYWJsZV8xKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBkZWZhdWx0X2F0dHJzW10gPSB7CiAJJnR5cGUuYXR0ciwKQEAgLTgyMCw3ICs4MTAsOCBAQAogCSZzaXplLmF0dHIsCiAJJnNoYXJlZF9jcHVfbWFwLmF0dHIsCiAJJnNoYXJlZF9jcHVfbGlzdC5hdHRyLAotCSZjYWNoZV9kaXNhYmxlLmF0dHIsCisJJmNhY2hlX2Rpc2FibGVfMC5hdHRyLAorCSZjYWNoZV9kaXNhYmxlXzEuYXR0ciwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV82NC5jCmluZGV4IDA5ZGQxZDQuLjI4OWNjNDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV82NC5jCkBAIC00MjAsNiArNDIwLDcgQEAKICBvdXQyOgogCWF0b21pY19kZWMoJm1jZV9lbnRyeSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChkb19tYWNoaW5lX2NoZWNrKTsKIAogI2lmZGVmIENPTkZJR19YODZfTUNFX0lOVEVMCiAvKioqCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfaW50ZWxfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbF82NC5jCmluZGV4IGNlZjNlZTMuLjY1YTBmY2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbF82NC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAjaW5jbHVkZSA8YXNtL3RoZXJtX3Rocm90Lmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWMuaD4KIAogYXNtbGlua2FnZSB2b2lkIHNtcF90aGVybWFsX2ludGVycnVwdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2NsZWFudXAuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9jbGVhbnVwLmMKaW5kZXggY2UwZmU0Yi4uMWQ1ODRhMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2NsZWFudXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvY2xlYW51cC5jCkBAIC04MDgsNyArODA4LDcgQEAKIAogCWlmICghaXNfY3B1KElOVEVMKSB8fCBlbmFibGVfbXRycl9jbGVhbnVwIDwgMSkKIAkJcmV0dXJuIDA7Ci0JcmRtc3IoTVRSUmRlZlR5cGVfTVNSLCBkZWYsIGR1bW15KTsKKwlyZG1zcihNU1JfTVRSUmRlZlR5cGUsIGRlZiwgZHVtbXkpOwogCWRlZiAmPSAweGZmOwogCWlmIChkZWYgIT0gTVRSUl9UWVBFX1VOQ0FDSEFCTEUpCiAJCXJldHVybiAwOwpAQCAtMTAwMyw3ICsxMDAzLDcgQEAKIAkgKi8KIAlpZiAoIWlzX2NwdShJTlRFTCkgfHwgZGlzYWJsZV9tdHJyX3RyaW0pCiAJCXJldHVybiAwOwotCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmLCBkdW1teSk7CisJcmRtc3IoTVNSX01UUlJkZWZUeXBlLCBkZWYsIGR1bW15KTsKIAlkZWYgJj0gMHhmZjsKIAlpZiAoZGVmICE9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCmluZGV4IGQyMWQ0ZmIuLjA1NDNmNjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwpAQCAtMjAsOSArMjAsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBmaXhlZF9yYW5nZV9ibG9jayBmaXhlZF9yYW5nZV9ibG9ja3NbXSA9IHsKLQl7IE1UUlJmaXg2NEtfMDAwMDBfTVNSLCAxIH0sIC8qIG9uZSAgNjRrIE1UUlIgICovCi0JeyBNVFJSZml4MTZLXzgwMDAwX01TUiwgMiB9LCAvKiB0d28gIDE2ayBNVFJScyAqLwotCXsgTVRSUmZpeDRLX0MwMDAwX01TUiwgIDggfSwgLyogZWlnaHQgNGsgTVRSUnMgKi8KKwl7IE1TUl9NVFJSZml4NjRLXzAwMDAwLCAxIH0sIC8qIG9uZSAgNjRrIE1UUlIgICovCisJeyBNU1JfTVRSUmZpeDE2S184MDAwMCwgMiB9LCAvKiB0d28gIDE2ayBNVFJScyAqLworCXsgTVNSX01UUlJmaXg0S19DMDAwMCwgIDggfSwgLyogZWlnaHQgNGsgTVRSUnMgKi8KIAl7fQogfTsKIApAQCAtMTk0LDEyICsxOTQsMTIgQEAKIAogCWs4X2NoZWNrX3N5c2NmZ19kcmFtX21vZF9lbigpOwogCi0JcmRtc3IoTVRSUmZpeDY0S18wMDAwMF9NU1IsIHBbMF0sIHBbMV0pOworCXJkbXNyKE1TUl9NVFJSZml4NjRLXzAwMDAwLCBwWzBdLCBwWzFdKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JCXJkbXNyKE1UUlJmaXgxNktfODAwMDBfTVNSICsgaSwgcFsyICsgaSAqIDJdLCBwWzMgKyBpICogMl0pOworCQlyZG1zcihNU1JfTVRSUmZpeDE2S184MDAwMCArIGksIHBbMiArIGkgKiAyXSwgcFszICsgaSAqIDJdKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlyZG1zcihNVFJSZml4NEtfQzAwMDBfTVNSICsgaSwgcFs2ICsgaSAqIDJdLCBwWzcgKyBpICogMl0pOworCQlyZG1zcihNU1JfTVRSUmZpeDRLX0MwMDAwICsgaSwgcFs2ICsgaSAqIDJdLCBwWzcgKyBpICogMl0pOwogfQogCiB2b2lkIG10cnJfc2F2ZV9maXhlZF9yYW5nZXModm9pZCAqaW5mbykKQEAgLTMxMCw3ICszMTAsNyBAQAogCiAJdnJzID0gbXRycl9zdGF0ZS52YXJfcmFuZ2VzOwogCi0JcmRtc3IoTVRSUmNhcF9NU1IsIGxvLCBkdW1teSk7CisJcmRtc3IoTVNSX01UUlJjYXAsIGxvLCBkdW1teSk7CiAJbXRycl9zdGF0ZS5oYXZlX2ZpeGVkID0gKGxvID4+IDgpICYgMTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgaSsrKQpAQCAtMzE4LDcgKzMxOCw3IEBACiAJaWYgKG10cnJfc3RhdGUuaGF2ZV9maXhlZCkKIAkJZ2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3N0YXRlLmZpeGVkX3Jhbmdlcyk7CiAKLQlyZG1zcihNVFJSZGVmVHlwZV9NU1IsIGxvLCBkdW1teSk7CisJcmRtc3IoTVNSX01UUlJkZWZUeXBlLCBsbywgZHVtbXkpOwogCW10cnJfc3RhdGUuZGVmX3R5cGUgPSAobG8gJiAweGZmKTsKIAltdHJyX3N0YXRlLmVuYWJsZWQgPSAobG8gJiAweGMwMCkgPj4gMTA7CiAKQEAgLTU4MywxMCArNTgzLDEwIEBACiAJX19mbHVzaF90bGIoKTsKIAogCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KLQlyZG1zcihNVFJSZGVmVHlwZV9NU1IsIGRlZnR5cGVfbG8sIGRlZnR5cGVfaGkpOworCXJkbXNyKE1TUl9NVFJSZGVmVHlwZSwgZGVmdHlwZV9sbywgZGVmdHlwZV9oaSk7CiAKIAkvKiAgRGlzYWJsZSBNVFJScywgYW5kIHNldCB0aGUgZGVmYXVsdCB0eXBlIHRvIHVuY2FjaGVkICAqLwotCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBkZWZ0eXBlX2xvICYgfjB4Y2ZmLCBkZWZ0eXBlX2hpKTsKKwltdHJyX3dybXNyKE1TUl9NVFJSZGVmVHlwZSwgZGVmdHlwZV9sbyAmIH4weGNmZiwgZGVmdHlwZV9oaSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBvc3Rfc2V0KHZvaWQpIF9fcmVsZWFzZXMoc2V0X2F0b21pY2l0eV9sb2NrKQpAQCAtNTk1LDcgKzU5NSw3IEBACiAJX19mbHVzaF90bGIoKTsKIAogCS8qIEludGVsIChQNikgc3RhbmRhcmQgTVRSUnMgKi8KLQltdHJyX3dybXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmdHlwZV9sbywgZGVmdHlwZV9oaSk7CisJbXRycl93cm1zcihNU1JfTVRSUmRlZlR5cGUsIGRlZnR5cGVfbG8sIGRlZnR5cGVfaGkpOwogCQkKIAkvKiAgRW5hYmxlIGNhY2hlcyAgKi8KIAl3cml0ZV9jcjAocmVhZF9jcjAoKSAmIDB4YmZmZmZmZmYpOwpAQCAtNzA3LDcgKzcwNyw3IEBACiBzdGF0aWMgaW50IGdlbmVyaWNfaGF2ZV93cmNvbWIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNvbmZpZywgZHVtbXk7Ci0JcmRtc3IoTVRSUmNhcF9NU1IsIGNvbmZpZywgZHVtbXkpOworCXJkbXNyKE1TUl9NVFJSY2FwLCBjb25maWcsIGR1bW15KTsKIAlyZXR1cm4gKGNvbmZpZyAmICgxIDw8IDEwKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCmluZGV4IDAzY2RhMDEuLjhmYzI0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJdW5zaWduZWQgbG9uZyBjb25maWcgPSAwLCBkdW1teTsKIAogCWlmICh1c2VfaW50ZWwoKSkgewotCQlyZG1zcihNVFJSY2FwX01TUiwgY29uZmlnLCBkdW1teSk7CisJCXJkbXNyKE1TUl9NVFJSY2FwLCBjb25maWcsIGR1bW15KTsKIAl9IGVsc2UgaWYgKGlzX2NwdShBTUQpKQogCQljb25maWcgPSAyOwogCWVsc2UgaWYgKGlzX2NwdShDWVJJWCkgfHwgaXNfY3B1KENFTlRBVVIpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL210cnIuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmgKaW5kZXggNzdmNjdmNy4uNzUzOGI3NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL210cnIuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oCkBAIC01LDIxICs1LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogCi0jZGVmaW5lIE1UUlJjYXBfTVNSICAgICAweDBmZQotI2RlZmluZSBNVFJSZGVmVHlwZV9NU1IgMHgyZmYKLQotI2RlZmluZSBNVFJSZml4NjRLXzAwMDAwX01TUiAweDI1MAotI2RlZmluZSBNVFJSZml4MTZLXzgwMDAwX01TUiAweDI1OAotI2RlZmluZSBNVFJSZml4MTZLX0EwMDAwX01TUiAweDI1OQotI2RlZmluZSBNVFJSZml4NEtfQzAwMDBfTVNSIDB4MjY4Ci0jZGVmaW5lIE1UUlJmaXg0S19DODAwMF9NU1IgMHgyNjkKLSNkZWZpbmUgTVRSUmZpeDRLX0QwMDAwX01TUiAweDI2YQotI2RlZmluZSBNVFJSZml4NEtfRDgwMDBfTVNSIDB4MjZiCi0jZGVmaW5lIE1UUlJmaXg0S19FMDAwMF9NU1IgMHgyNmMKLSNkZWZpbmUgTVRSUmZpeDRLX0U4MDAwX01TUiAweDI2ZAotI2RlZmluZSBNVFJSZml4NEtfRjAwMDBfTVNSIDB4MjZlCi0jZGVmaW5lIE1UUlJmaXg0S19GODAwMF9NU1IgMHgyNmYKLQogI2RlZmluZSBNVFJSX0NIQU5HRV9NQVNLX0ZJWEVEICAgICAweDAxCiAjZGVmaW5lIE1UUlJfQ0hBTkdFX01BU0tfVkFSSUFCTEUgIDB4MDIKICNkZWZpbmUgTVRSUl9DSEFOR0VfTUFTS19ERUZUWVBFICAgMHgwNApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL3N0YXRlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYwppbmRleCA3ZjdlMjc1Li4xZjVmYjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAJCWlmICh1c2VfaW50ZWwoKSkKIAkJCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KLQkJCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CisJCQlyZG1zcihNU1JfTVRSUmRlZlR5cGUsIGN0eHQtPmRlZnR5cGVfbG8sIGN0eHQtPmRlZnR5cGVfaGkpOwogCQllbHNlCiAJCQkvKiBDeXJpeCBBUlJzIC0gZXZlcnl0aGluZyBlbHNlIHdlcmUgZXhjbHVkZWQgYXQgdGhlIHRvcCAqLwogCQkJY3R4dC0+Y2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKQEAgLTQ2LDcgKzQ2LDcgQEAKIHsKIAlpZiAodXNlX2ludGVsKCkpCiAJCS8qICBEaXNhYmxlIE1UUlJzLCBhbmQgc2V0IHRoZSBkZWZhdWx0IHR5cGUgdG8gdW5jYWNoZWQgICovCi0JCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBjdHh0LT5kZWZ0eXBlX2xvICYgMHhmMzAwVUwsCisJCW10cnJfd3Jtc3IoTVNSX01UUlJkZWZUeXBlLCBjdHh0LT5kZWZ0eXBlX2xvICYgMHhmMzAwVUwsCiAJCSAgICAgIGN0eHQtPmRlZnR5cGVfaGkpOwogCWVsc2UgaWYgKGlzX2NwdShDWVJJWCkpCiAJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2VyZSBleGNsdWRlZCBhdCB0aGUgdG9wICovCkBAIC02NCw3ICs2NCw3IEBACiAJCS8qICBSZXN0b3JlIE1UUlJkZWZUeXBlICAqLwogCQlpZiAodXNlX2ludGVsKCkpCiAJCQkvKiBJbnRlbCAoUDYpIHN0YW5kYXJkIE1UUlJzICovCi0JCQltdHJyX3dybXNyKE1UUlJkZWZUeXBlX01TUiwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CisJCQltdHJyX3dybXNyKE1TUl9NVFJSZGVmVHlwZSwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CiAJCWVsc2UKIAkJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2FzIGV4Y2x1ZGVkIGF0IHRoZSB0b3AgKi8KIAkJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjdHh0LT5jY3IzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9jb3VudGVyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfY291bnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NWM4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfY291bnRlci5jCkBAIC0wLDAgKzEsMTcwNCBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgeDg2IGFyY2hpdGVjdHVyZSBjb2RlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodCAoQykgMjAwOSBKYXN3aW5kZXIgU2luZ2ggUmFqcHV0CisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4sIFJvYmVydCBSaWNodGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgUmVkIEhhdCwgSW5jLiwgUGV0ZXIgWmlqbHN0cmEgPHB6aWpsc3RyQHJlZGhhdC5jb20+CisgKgorICogIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisKKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KKworc3RhdGljIHU2NCBwZXJmX2NvdW50ZXJfbWFzayBfX3JlYWRfbW9zdGx5OworCitzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzIHsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyCSpjb3VudGVyc1tYODZfUE1DX0lEWF9NQVhdOworCXVuc2lnbmVkIGxvbmcJCXVzZWRfbWFza1tCSVRTX1RPX0xPTkdTKFg4Nl9QTUNfSURYX01BWCldOworCXVuc2lnbmVkIGxvbmcJCWFjdGl2ZV9tYXNrW0JJVFNfVE9fTE9OR1MoWDg2X1BNQ19JRFhfTUFYKV07CisJdW5zaWduZWQgbG9uZwkJaW50ZXJydXB0czsKKwlpbnQJCQllbmFibGVkOworfTsKKworLyoKKyAqIHN0cnVjdCB4ODZfcG11IC0gZ2VuZXJpYyB4ODYgcG11CisgKi8KK3N0cnVjdCB4ODZfcG11IHsKKwljb25zdCBjaGFyCSpuYW1lOworCWludAkJdmVyc2lvbjsKKwlpbnQJCSgqaGFuZGxlX2lycSkoc3RydWN0IHB0X3JlZ3MgKik7CisJdm9pZAkJKCpkaXNhYmxlX2FsbCkodm9pZCk7CisJdm9pZAkJKCplbmFibGVfYWxsKSh2b2lkKTsKKwl2b2lkCQkoKmVuYWJsZSkoc3RydWN0IGh3X3BlcmZfY291bnRlciAqLCBpbnQpOworCXZvaWQJCSgqZGlzYWJsZSkoc3RydWN0IGh3X3BlcmZfY291bnRlciAqLCBpbnQpOworCXVuc2lnbmVkCWV2ZW50c2VsOworCXVuc2lnbmVkCXBlcmZjdHI7CisJdTY0CQkoKmV2ZW50X21hcCkoaW50KTsKKwl1NjQJCSgqcmF3X2V2ZW50KSh1NjQpOworCWludAkJbWF4X2V2ZW50czsKKwlpbnQJCW51bV9jb3VudGVyczsKKwlpbnQJCW51bV9jb3VudGVyc19maXhlZDsKKwlpbnQJCWNvdW50ZXJfYml0czsKKwl1NjQJCWNvdW50ZXJfbWFzazsKKwl1NjQJCW1heF9wZXJpb2Q7CisJdTY0CQlpbnRlbF9jdHJsOworfTsKKworc3RhdGljIHN0cnVjdCB4ODZfcG11IHg4Nl9wbXUgX19yZWFkX21vc3RseTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfaHdfY291bnRlcnMsIGNwdV9od19jb3VudGVycykgPSB7CisJLmVuYWJsZWQgPSAxLAorfTsKKworLyoKKyAqIEludGVsIFBlcmZNb24gdjMuIFVzZWQgb24gQ29yZTIgYW5kIGxhdGVyLgorICovCitzdGF0aWMgY29uc3QgdTY0IGludGVsX3BlcmZtb25fZXZlbnRfbWFwW10gPQoreworICBbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXQkJPSAweDAwM2MsCisgIFtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMHgwMGMwLAorICBbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXQk9IDB4NGYyZSwKKyAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSAweDQxMmUsCisgIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCT0gMHgwMGM0LAorICBbUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTXQkJPSAweDAwYzUsCisgIFtQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVNdCQk9IDB4MDEzYywKK307CisKK3N0YXRpYyB1NjQgaW50ZWxfcG11X2V2ZW50X21hcChpbnQgZXZlbnQpCit7CisJcmV0dXJuIGludGVsX3BlcmZtb25fZXZlbnRfbWFwW2V2ZW50XTsKK30KKworLyoKKyAqIEdlbmVyYWxpemVkIGh3IGNhY2hpbmcgcmVsYXRlZCBldmVudCB0YWJsZSwgZmlsbGVkCisgKiBpbiBvbiBhIHBlciBtb2RlbCBiYXNpcy4gQSB2YWx1ZSBvZiAwIG1lYW5zCisgKiAnbm90IHN1cHBvcnRlZCcsIC0xIG1lYW5zICdldmVudCBtYWtlcyBubyBzZW5zZSBvbgorICogdGhpcyBDUFUnLCBhbnkgb3RoZXIgdmFsdWUgbWVhbnMgdGhlIHJhdyBldmVudAorICogSUQuCisgKi8KKworI2RlZmluZSBDKHgpIFBFUkZfQ09VTlRfSFdfQ0FDSEVfIyN4CisKK3N0YXRpYyB1NjQgX19yZWFkX21vc3RseSBod19jYWNoZV9ldmVudF9pZHMKKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdOworCitzdGF0aWMgY29uc3QgdTY0IG5laGFsZW1faHdfY2FjaGVfZXZlbnRfaWRzCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYXSA9Cit7CisgWyBDKEwxRCkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDBmNDAsIC8qIEwxRF9DQUNIRV9MRC5NRVNJICAgICAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAxNDAsIC8qIEwxRF9DQUNIRV9MRC5JX1NUQVRFICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDBmNDEsIC8qIEwxRF9DQUNIRV9TVC5NRVNJICAgICAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAxNDEsIC8qIEwxRF9DQUNIRV9TVC5JX1NUQVRFICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAxNGUsIC8qIEwxRF9QUkVGRVRDSC5SRVFVRVNUUyAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAyNGUsIC8qIEwxRF9QUkVGRVRDSC5NSVNTICAgICAgICAgICAgKi8KKwl9LAorIH0sCisgWyBDKEwxSSApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMzgwLCAvKiBMMUkuUkVBRFMgICAgICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMjgwLCAvKiBMMUkuTUlTU0VTICAgICAgICAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MCwKKwl9LAorIH0sCisgWyBDKExMICApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMzI0LCAvKiBMMl9SUVNUUy5MT0FEUyAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMjI0LCAvKiBMMl9SUVNUUy5MRF9NSVNTICAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwYzI0LCAvKiBMMl9SUVNUUy5SRk9TICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwODI0LCAvKiBMMl9SUVNUUy5SRk9fTUlTUyAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg0ZjJlLCAvKiBMTEMgUmVmZXJlbmNlICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHg0MTJlLCAvKiBMTEMgTWlzc2VzICAgICAgICAgICAgICAgICAgICovCisJfSwKKyB9LAorIFsgQyhEVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MGY0MCwgLyogTDFEX0NBQ0hFX0xELk1FU0kgICAoYWxpYXMpICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDEwOCwgLyogRFRMQl9MT0FEX01JU1NFUy5BTlkgICAgICAgICAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MGY0MSwgLyogTDFEX0NBQ0hFX1NULk1FU0kgICAoYWxpYXMpICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDEwYywgLyogTUVNX1NUT1JFX1JFVElSRUQuRFRMQl9NSVNTICAqLworCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAsCisJfSwKKyB9LAorIFsgQyhJVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDFjMCwgLyogSU5TVF9SRVRJUkVELkFOWV9QICAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MjBjOCwgLyogSVRMQl9NSVNTX1JFVElSRUQgICAgICAgICAgICAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisgfSwKKyBbIEMoQlBVICkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAwYzQsIC8qIEJSX0lOU1RfUkVUSVJFRC5BTExfQlJBTkNIRVMgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAzZTgsIC8qIEJQVV9DTEVBUlMuQU5ZICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorIH0sCit9OworCitzdGF0aWMgY29uc3QgdTY0IGNvcmUyX2h3X2NhY2hlX2V2ZW50X2lkcworCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPQoreworIFsgQyhMMUQpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwZjQwLCAvKiBMMURfQ0FDSEVfTEQuTUVTSSAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDE0MCwgLyogTDFEX0NBQ0hFX0xELklfU1RBVEUgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDBmNDEsIC8qIEwxRF9DQUNIRV9TVC5NRVNJICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMTQxLCAvKiBMMURfQ0FDSEVfU1QuSV9TVEFURSAgICAgICAqLworCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MTA0ZSwgLyogTDFEX1BSRUZFVENILlJFUVVFU1RTICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisgfSwKKyBbIEMoTDFJICkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAwODAsIC8qIEwxSS5SRUFEUyAgICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMDgxLCAvKiBMMUkuTUlTU0VTICAgICAgICAgICAgICAgICAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKExMICApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg0ZjI5LCAvKiBMMl9MRC5NRVNJICAgICAgICAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4NDEyOSwgLyogTDJfTEQuSVNUQVRFICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDRmMkEsIC8qIEwyX1NULk1FU0kgICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHg0MTJBLCAvKiBMMl9TVC5JU1RBVEUgICAgICAgICAgICAgICAqLworCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKERUTEIpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwZjQwLCAvKiBMMURfQ0FDSEVfTEQuTUVTSSAgKGFsaWFzKSAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDIwOCwgLyogRFRMQl9NSVNTRVMuTUlTU19MRCAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDBmNDEsIC8qIEwxRF9DQUNIRV9TVC5NRVNJICAoYWxpYXMpICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwODA4LCAvKiBEVExCX01JU1NFUy5NSVNTX1NUICAgICAgICAqLworCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKElUTEIpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMGMwLCAvKiBJTlNUX1JFVElSRUQuQU5ZX1AgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MTI4MiwgLyogSVRMQk1JU1NFUyAgICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorIH0sCisgWyBDKEJQVSApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMGM0LCAvKiBCUl9JTlNUX1JFVElSRUQuQU5ZICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDBjNSwgLyogQlBfSU5TVF9SRVRJUkVELk1JU1BSRUQgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorIH0sCit9OworCitzdGF0aWMgY29uc3QgdTY0IGF0b21faHdfY2FjaGVfZXZlbnRfaWRzCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYXSA9Cit7CisgWyBDKEwxRCkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDIxNDAsIC8qIEwxRF9DQUNIRS5MRCAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDIyNDAsIC8qIEwxRF9DQUNIRS5TVCAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKEwxSSApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMzgwLCAvKiBMMUkuUkVBRFMgICAgICAgICAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDI4MCwgLyogTDFJLk1JU1NFUyAgICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhMTCAgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4NGYyOSwgLyogTDJfTEQuTUVTSSAgICAgICAgICAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDQxMjksIC8qIEwyX0xELklTVEFURSAgICAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg0ZjJBLCAvKiBMMl9TVC5NRVNJICAgICAgICAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4NDEyQSwgLyogTDJfU1QuSVNUQVRFICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhEVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MjE0MCwgLyogTDFEX0NBQ0hFX0xELk1FU0kgIChhbGlhcykgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDA1MDgsIC8qIERUTEJfTUlTU0VTLk1JU1NfTEQgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgyMjQwLCAvKiBMMURfQ0FDSEVfU1QuTUVTSSAgKGFsaWFzKSAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDYwOCwgLyogRFRMQl9NSVNTRVMuTUlTU19TVCAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhJVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDBjMCwgLyogSU5TVF9SRVRJUkVELkFOWV9QICAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAyODIsIC8qIElUTEIuTUlTU0VTICAgICAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorIFsgQyhCUFUgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDBjNCwgLyogQlJfSU5TVF9SRVRJUkVELkFOWSAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwYzUsIC8qIEJQX0lOU1RfUkVUSVJFRC5NSVNQUkVEICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorfTsKKworc3RhdGljIHU2NCBpbnRlbF9wbXVfcmF3X2V2ZW50KHU2NCBldmVudCkKK3sKKyNkZWZpbmUgQ09SRV9FVk5UU0VMX0VWRU5UX01BU0sJCTB4MDAwMDAwRkZVTEwKKyNkZWZpbmUgQ09SRV9FVk5UU0VMX1VOSVRfTUFTSwkJMHgwMDAwRkYwMFVMTAorI2RlZmluZSBDT1JFX0VWTlRTRUxfRURHRV9NQVNLCQkweDAwMDQwMDAwVUxMCisjZGVmaW5lIENPUkVfRVZOVFNFTF9JTlZfTUFTSwkJMHgwMDgwMDAwMFVMTAorI2RlZmluZSBDT1JFX0VWTlRTRUxfQ09VTlRFUl9NQVNLCTB4RkYwMDAwMDBVTEwKKworI2RlZmluZSBDT1JFX0VWTlRTRUxfTUFTSwkJXAorCShDT1JFX0VWTlRTRUxfRVZFTlRfTUFTSyB8CVwKKwkgQ09SRV9FVk5UU0VMX1VOSVRfTUFTSyAgfAlcCisJIENPUkVfRVZOVFNFTF9FREdFX01BU0sgIHwJXAorCSBDT1JFX0VWTlRTRUxfSU5WX01BU0sgIHwJXAorCSBDT1JFX0VWTlRTRUxfQ09VTlRFUl9NQVNLKQorCisJcmV0dXJuIGV2ZW50ICYgQ09SRV9FVk5UU0VMX01BU0s7Cit9CisKK3N0YXRpYyBjb25zdCB1NjQgYW1kXzBmX2h3X2NhY2hlX2V2ZW50X2lkcworCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPQoreworIFsgQyhMMUQpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhMMUkgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDA4MCwgLyogSW5zdHJ1Y3Rpb24gY2FjaGUgZmV0Y2hlcyAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwODEsIC8qIEluc3RydWN0aW9uIGNhY2hlIG1pc3NlcyAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisgfSwKKyBbIEMoTEwgICkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKERUTEIpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhJVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDA4MCwgLyogSW5zdHJ1Y3Rpb24gZmVjdGhlcyAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwODUsIC8qIEluc3RyLiBmZXRjaCBJVExCIG1pc3NlcyAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorIFsgQyhCUFUgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDBjMiwgLyogUmV0aXJlZCBCcmFuY2ggSW5zdHIuICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwYzMsIC8qIFJldGlyZWQgTWlzcHJlZGljdGVkIEJJICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorfTsKKworLyoKKyAqIEFNRCBQZXJmb3JtYW5jZSBNb25pdG9yIEs3IGFuZCBsYXRlci4KKyAqLworc3RhdGljIGNvbnN0IHU2NCBhbWRfcGVyZm1vbl9ldmVudF9tYXBbXSA9Cit7CisgIFtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCQk9IDB4MDA3NiwKKyAgW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXQkJPSAweDAwYzAsCisgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdCT0gMHgwMDgwLAorICBbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQk9IDB4MDA4MSwKKyAgW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10JPSAweDAwYzQsCisgIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCQk9IDB4MDBjNSwKK307CisKK3N0YXRpYyB1NjQgYW1kX3BtdV9ldmVudF9tYXAoaW50IGV2ZW50KQoreworCXJldHVybiBhbWRfcGVyZm1vbl9ldmVudF9tYXBbZXZlbnRdOworfQorCitzdGF0aWMgdTY0IGFtZF9wbXVfcmF3X2V2ZW50KHU2NCBldmVudCkKK3sKKyNkZWZpbmUgSzdfRVZOVFNFTF9FVkVOVF9NQVNLCTB4NzAwMDAwMEZGVUxMCisjZGVmaW5lIEs3X0VWTlRTRUxfVU5JVF9NQVNLCTB4MDAwMDBGRjAwVUxMCisjZGVmaW5lIEs3X0VWTlRTRUxfRURHRV9NQVNLCTB4MDAwMDQwMDAwVUxMCisjZGVmaW5lIEs3X0VWTlRTRUxfSU5WX01BU0sJMHgwMDA4MDAwMDBVTEwKKyNkZWZpbmUgSzdfRVZOVFNFTF9DT1VOVEVSX01BU0sJMHgwRkYwMDAwMDBVTEwKKworI2RlZmluZSBLN19FVk5UU0VMX01BU0sJCQlcCisJKEs3X0VWTlRTRUxfRVZFTlRfTUFTSyB8CVwKKwkgSzdfRVZOVFNFTF9VTklUX01BU0sgIHwJXAorCSBLN19FVk5UU0VMX0VER0VfTUFTSyAgfAlcCisJIEs3X0VWTlRTRUxfSU5WX01BU0sgICB8CVwKKwkgSzdfRVZOVFNFTF9DT1VOVEVSX01BU0spCisKKwlyZXR1cm4gZXZlbnQgJiBLN19FVk5UU0VMX01BU0s7Cit9CisKKy8qCisgKiBQcm9wYWdhdGUgY291bnRlciBlbGFwc2VkIHRpbWUgaW50byB0aGUgZ2VuZXJpYyBjb3VudGVyLgorICogQ2FuIG9ubHkgYmUgZXhlY3V0ZWQgb24gdGhlIENQVSB3aGVyZSB0aGUgY291bnRlciBpcyBhY3RpdmUuCisgKiBSZXR1cm5zIHRoZSBkZWx0YSBldmVudHMgcHJvY2Vzc2VkLgorICovCitzdGF0aWMgdTY0Cit4ODZfcGVyZl9jb3VudGVyX3VwZGF0ZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCWludCBzaGlmdCA9IDY0IC0geDg2X3BtdS5jb3VudGVyX2JpdHM7CisJdTY0IHByZXZfcmF3X2NvdW50LCBuZXdfcmF3X2NvdW50OworCXM2NCBkZWx0YTsKKworCS8qCisJICogQ2FyZWZ1bDogYW4gTk1JIG1pZ2h0IG1vZGlmeSB0aGUgcHJldmlvdXMgY291bnRlciB2YWx1ZS4KKwkgKgorCSAqIE91ciB0YWN0aWMgdG8gaGFuZGxlIHRoaXMgaXMgdG8gZmlyc3QgYXRvbWljYWxseSByZWFkIGFuZAorCSAqIGV4Y2hhbmdlIGEgbmV3IHJhdyBjb3VudCAtIHRoZW4gYWRkIHRoYXQgbmV3LXByZXYgZGVsdGEKKwkgKiBjb3VudCB0byB0aGUgZ2VuZXJpYyBjb3VudGVyIGF0b21pY2FsbHk6CisJICovCithZ2FpbjoKKwlwcmV2X3Jhd19jb3VudCA9IGF0b21pYzY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7CisJcmRtc3JsKGh3Yy0+Y291bnRlcl9iYXNlICsgaWR4LCBuZXdfcmF3X2NvdW50KTsKKworCWlmIChhdG9taWM2NF9jbXB4Y2hnKCZod2MtPnByZXZfY291bnQsIHByZXZfcmF3X2NvdW50LAorCQkJCQluZXdfcmF3X2NvdW50KSAhPSBwcmV2X3Jhd19jb3VudCkKKwkJZ290byBhZ2FpbjsKKworCS8qCisJICogTm93IHdlIGhhdmUgdGhlIG5ldyByYXcgdmFsdWUgYW5kIGhhdmUgdXBkYXRlZCB0aGUgcHJldgorCSAqIHRpbWVzdGFtcCBhbHJlYWR5LiBXZSBjYW4gbm93IGNhbGN1bGF0ZSB0aGUgZWxhcHNlZCBkZWx0YQorCSAqIChjb3VudGVyLSl0aW1lIGFuZCBhZGQgdGhhdCB0byB0aGUgZ2VuZXJpYyBjb3VudGVyLgorCSAqCisJICogQ2FyZWZ1bCwgbm90IGFsbCBodyBzaWduLWV4dGVuZHMgYWJvdmUgdGhlIHBoeXNpY2FsIHdpZHRoCisJICogb2YgdGhlIGNvdW50LgorCSAqLworCWRlbHRhID0gKG5ld19yYXdfY291bnQgPDwgc2hpZnQpIC0gKHByZXZfcmF3X2NvdW50IDw8IHNoaWZ0KTsKKwlkZWx0YSA+Pj0gc2hpZnQ7CisKKwlhdG9taWM2NF9hZGQoZGVsdGEsICZjb3VudGVyLT5jb3VudCk7CisJYXRvbWljNjRfc3ViKGRlbHRhLCAmaHdjLT5wZXJpb2RfbGVmdCk7CisKKwlyZXR1cm4gbmV3X3Jhd19jb3VudDsKK30KKworc3RhdGljIGF0b21pY190IGFjdGl2ZV9jb3VudGVyczsKK3N0YXRpYyBERUZJTkVfTVVURVgocG1jX3Jlc2VydmVfbXV0ZXgpOworCitzdGF0aWMgYm9vbCByZXNlcnZlX3BtY19oYXJkd2FyZSh2b2lkKQoreworCWludCBpOworCisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKKwkJZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKworCWZvciAoaSA9IDA7IGkgPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaSsrKSB7CisJCWlmICghcmVzZXJ2ZV9wZXJmY3RyX25taSh4ODZfcG11LnBlcmZjdHIgKyBpKSkKKwkJCWdvdG8gcGVyZmN0cl9mYWlsOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaSsrKSB7CisJCWlmICghcmVzZXJ2ZV9ldm50c2VsX25taSh4ODZfcG11LmV2ZW50c2VsICsgaSkpCisJCQlnb3RvIGV2ZW50c2VsX2ZhaWw7CisJfQorCisJcmV0dXJuIHRydWU7CisKK2V2ZW50c2VsX2ZhaWw6CisJZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQlyZWxlYXNlX2V2bnRzZWxfbm1pKHg4Nl9wbXUuZXZlbnRzZWwgKyBpKTsKKworCWkgPSB4ODZfcG11Lm51bV9jb3VudGVyczsKKworcGVyZmN0cl9mYWlsOgorCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJcmVsZWFzZV9wZXJmY3RyX25taSh4ODZfcG11LnBlcmZjdHIgKyBpKTsKKworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCWVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9wbWNfaGFyZHdhcmUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaSsrKSB7CisJCXJlbGVhc2VfcGVyZmN0cl9ubWkoeDg2X3BtdS5wZXJmY3RyICsgaSk7CisJCXJlbGVhc2VfZXZudHNlbF9ubWkoeDg2X3BtdS5ldmVudHNlbCArIGkpOworCX0KKworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCWVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKK30KKworc3RhdGljIHZvaWQgaHdfcGVyZl9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jaygmYWN0aXZlX2NvdW50ZXJzLCAmcG1jX3Jlc2VydmVfbXV0ZXgpKSB7CisJCXJlbGVhc2VfcG1jX2hhcmR3YXJlKCk7CisJCW11dGV4X3VubG9jaygmcG1jX3Jlc2VydmVfbXV0ZXgpOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgeDg2X3BtdV9pbml0aWFsaXplZCh2b2lkKQoreworCXJldHVybiB4ODZfcG11LmhhbmRsZV9pcnEgIT0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NldF9leHRfaHdfYXR0cihzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MsIHN0cnVjdCBwZXJmX2NvdW50ZXJfYXR0ciAqYXR0cikKK3sKKwl1bnNpZ25lZCBpbnQgY2FjaGVfdHlwZSwgY2FjaGVfb3AsIGNhY2hlX3Jlc3VsdDsKKwl1NjQgY29uZmlnLCB2YWw7CisKKwljb25maWcgPSBhdHRyLT5jb25maWc7CisKKwljYWNoZV90eXBlID0gKGNvbmZpZyA+PiAgMCkgJiAweGZmOworCWlmIChjYWNoZV90eXBlID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhY2hlX29wID0gKGNvbmZpZyA+PiAgOCkgJiAweGZmOworCWlmIChjYWNoZV9vcCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYWNoZV9yZXN1bHQgPSAoY29uZmlnID4+IDE2KSAmIDB4ZmY7CisJaWYgKGNhY2hlX3Jlc3VsdCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsID0gaHdfY2FjaGVfZXZlbnRfaWRzW2NhY2hlX3R5cGVdW2NhY2hlX29wXVtjYWNoZV9yZXN1bHRdOworCisJaWYgKHZhbCA9PSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmICh2YWwgPT0gLTEpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdjLT5jb25maWcgfD0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXR1cCB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBhdHRyX3R5cGUKKyAqLworc3RhdGljIGludCBfX2h3X3BlcmZfY291bnRlcl9pbml0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyID0gJmNvdW50ZXItPmF0dHI7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCWludCBlcnI7CisKKwlpZiAoIXg4Nl9wbXVfaW5pdGlhbGl6ZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSAwOworCWlmICghYXRvbWljX2luY19ub3RfemVybygmYWN0aXZlX2NvdW50ZXJzKSkgeworCQltdXRleF9sb2NrKCZwbWNfcmVzZXJ2ZV9tdXRleCk7CisJCWlmIChhdG9taWNfcmVhZCgmYWN0aXZlX2NvdW50ZXJzKSA9PSAwICYmICFyZXNlcnZlX3BtY19oYXJkd2FyZSgpKQorCQkJZXJyID0gLUVCVVNZOworCQllbHNlCisJCQlhdG9taWNfaW5jKCZhY3RpdmVfY291bnRlcnMpOworCQltdXRleF91bmxvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qCisJICogR2VuZXJhdGUgUE1DIElSUXM6CisJICogKGtlZXAgJ2VuYWJsZWQnIGJpdCBjbGVhciBmb3Igbm93KQorCSAqLworCWh3Yy0+Y29uZmlnID0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVDsKKworCS8qCisJICogQ291bnQgdXNlciBhbmQgT1MgZXZlbnRzIHVubGVzcyByZXF1ZXN0ZWQgbm90IHRvLgorCSAqLworCWlmICghYXR0ci0+ZXhjbHVkZV91c2VyKQorCQlod2MtPmNvbmZpZyB8PSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfVVNSOworCWlmICghYXR0ci0+ZXhjbHVkZV9rZXJuZWwpCisJCWh3Yy0+Y29uZmlnIHw9IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9PUzsKKworCWlmICghaHdjLT5zYW1wbGVfcGVyaW9kKSB7CisJCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IHg4Nl9wbXUubWF4X3BlcmlvZDsKKwkJaHdjLT5sYXN0X3BlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKKwkJYXRvbWljNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBod2MtPnNhbXBsZV9wZXJpb2QpOworCX0KKworCWNvdW50ZXItPmRlc3Ryb3kgPSBod19wZXJmX2NvdW50ZXJfZGVzdHJveTsKKworCS8qCisJICogUmF3IGV2ZW50IHR5cGUgcHJvdmlkZSB0aGUgY29uZmlnIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUKKwkgKi8KKwlpZiAoYXR0ci0+dHlwZSA9PSBQRVJGX1RZUEVfUkFXKSB7CisJCWh3Yy0+Y29uZmlnIHw9IHg4Nl9wbXUucmF3X2V2ZW50KGF0dHItPmNvbmZpZyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhdHRyLT50eXBlID09IFBFUkZfVFlQRV9IV19DQUNIRSkKKwkJcmV0dXJuIHNldF9leHRfaHdfYXR0cihod2MsIGF0dHIpOworCisJaWYgKGF0dHItPmNvbmZpZyA+PSB4ODZfcG11Lm1heF9ldmVudHMpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogVGhlIGdlbmVyaWMgbWFwOgorCSAqLworCWh3Yy0+Y29uZmlnIHw9IHg4Nl9wbXUuZXZlbnRfbWFwKGF0dHItPmNvbmZpZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfcG11X2Rpc2FibGVfYWxsKHZvaWQpCit7CisJd3Jtc3JsKE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwsIDApOworfQorCitzdGF0aWMgdm9pZCBhbWRfcG11X2Rpc2FibGVfYWxsKHZvaWQpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJaW50IGlkeDsKKworCWlmICghY3B1Yy0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJY3B1Yy0+ZW5hYmxlZCA9IDA7CisJLyoKKwkgKiBlbnN1cmUgd2Ugd3JpdGUgdGhlIGRpc2FibGUgYmVmb3JlIHdlIHN0YXJ0IGRpc2FibGluZyB0aGUKKwkgKiBjb3VudGVycyBwcm9wZXIsIHNvIHRoYXQgYW1kX3BtdV9lbmFibGVfY291bnRlcigpIGRvZXMgdGhlCisJICogcmlnaHQgdGhpbmcuCisJICovCisJYmFycmllcigpOworCisJZm9yIChpZHggPSAwOyBpZHggPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaWR4KyspIHsKKwkJdTY0IHZhbDsKKworCQlpZiAoIXRlc3RfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spKQorCQkJY29udGludWU7CisJCXJkbXNybChNU1JfSzdfRVZOVFNFTDAgKyBpZHgsIHZhbCk7CisJCWlmICghKHZhbCAmIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTDBfRU5BQkxFKSkKKwkJCWNvbnRpbnVlOworCQl2YWwgJj0gfkFSQ0hfUEVSRk1PTl9FVkVOVFNFTDBfRU5BQkxFOworCQl3cm1zcmwoTVNSX0s3X0VWTlRTRUwwICsgaWR4LCB2YWwpOworCX0KK30KKwordm9pZCBod19wZXJmX2Rpc2FibGUodm9pZCkKK3sKKwlpZiAoIXg4Nl9wbXVfaW5pdGlhbGl6ZWQoKSkKKwkJcmV0dXJuOworCXJldHVybiB4ODZfcG11LmRpc2FibGVfYWxsKCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3BtdV9lbmFibGVfYWxsKHZvaWQpCit7CisJd3Jtc3JsKE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwsIHg4Nl9wbXUuaW50ZWxfY3RybCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9wbXVfZW5hYmxlX2FsbCh2b2lkKQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCWludCBpZHg7CisKKwlpZiAoY3B1Yy0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJY3B1Yy0+ZW5hYmxlZCA9IDE7CisJYmFycmllcigpOworCisJZm9yIChpZHggPSAwOyBpZHggPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaWR4KyspIHsKKwkJdTY0IHZhbDsKKworCQlpZiAoIXRlc3RfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spKQorCQkJY29udGludWU7CisJCXJkbXNybChNU1JfSzdfRVZOVFNFTDAgKyBpZHgsIHZhbCk7CisJCWlmICh2YWwgJiBBUkNIX1BFUkZNT05fRVZFTlRTRUwwX0VOQUJMRSkKKwkJCWNvbnRpbnVlOworCQl2YWwgfD0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEU7CisJCXdybXNybChNU1JfSzdfRVZOVFNFTDAgKyBpZHgsIHZhbCk7CisJfQorfQorCit2b2lkIGh3X3BlcmZfZW5hYmxlKHZvaWQpCit7CisJaWYgKCF4ODZfcG11X2luaXRpYWxpemVkKCkpCisJCXJldHVybjsKKwl4ODZfcG11LmVuYWJsZV9hbGwoKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgaW50ZWxfcG11X2dldF9zdGF0dXModm9pZCkKK3sKKwl1NjQgc3RhdHVzOworCisJcmRtc3JsKE1TUl9DT1JFX1BFUkZfR0xPQkFMX1NUQVRVUywgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9wbXVfYWNrX3N0YXR1cyh1NjQgYWNrKQoreworCXdybXNybChNU1JfQ09SRV9QRVJGX0dMT0JBTF9PVkZfQ1RSTCwgYWNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHg4Nl9wbXVfZW5hYmxlX2NvdW50ZXIoc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCWludCBlcnI7CisJZXJyID0gY2hlY2tpbmdfd3Jtc3JsKGh3Yy0+Y29uZmlnX2Jhc2UgKyBpZHgsCisJCQkgICAgICBod2MtPmNvbmZpZyB8IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTDBfRU5BQkxFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHg4Nl9wbXVfZGlzYWJsZV9jb3VudGVyKHN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YywgaW50IGlkeCkKK3sKKwlpbnQgZXJyOworCWVyciA9IGNoZWNraW5nX3dybXNybChod2MtPmNvbmZpZ19iYXNlICsgaWR4LAorCQkJICAgICAgaHdjLT5jb25maWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ludGVsX3BtdV9kaXNhYmxlX2ZpeGVkKHN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YywgaW50IF9faWR4KQoreworCWludCBpZHggPSBfX2lkeCAtIFg4Nl9QTUNfSURYX0ZJWEVEOworCXU2NCBjdHJsX3ZhbCwgbWFzazsKKwlpbnQgZXJyOworCisJbWFzayA9IDB4ZlVMTCA8PCAoaWR4ICogNCk7CisKKwlyZG1zcmwoaHdjLT5jb25maWdfYmFzZSwgY3RybF92YWwpOworCWN0cmxfdmFsICY9IH5tYXNrOworCWVyciA9IGNoZWNraW5nX3dybXNybChod2MtPmNvbmZpZ19iYXNlLCBjdHJsX3ZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW50ZWxfcG11X2Rpc2FibGVfY291bnRlcihzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MsIGludCBpZHgpCit7CisJaWYgKHVubGlrZWx5KGh3Yy0+Y29uZmlnX2Jhc2UgPT0gTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFJfQ1RSTCkpIHsKKwkJaW50ZWxfcG11X2Rpc2FibGVfZml4ZWQoaHdjLCBpZHgpOworCQlyZXR1cm47CisJfQorCisJeDg2X3BtdV9kaXNhYmxlX2NvdW50ZXIoaHdjLCBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2FtZF9wbXVfZGlzYWJsZV9jb3VudGVyKHN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YywgaW50IGlkeCkKK3sKKwl4ODZfcG11X2Rpc2FibGVfY291bnRlcihod2MsIGlkeCk7Cit9CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1NjQsIHByZXZfbGVmdFtYODZfUE1DX0lEWF9NQVhdKTsKKworLyoKKyAqIFNldCB0aGUgbmV4dCBJUlEgcGVyaW9kLCBiYXNlZCBvbiB0aGUgaHdjLT5wZXJpb2RfbGVmdCB2YWx1ZS4KKyAqIFRvIGJlIGNhbGxlZCB3aXRoIHRoZSBjb3VudGVyIGRpc2FibGVkIGluIGh3OgorICovCitzdGF0aWMgaW50Cit4ODZfcGVyZl9jb3VudGVyX3NldF9wZXJpb2Qoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCSAgICAgc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCXM2NCBsZWZ0ID0gYXRvbWljNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCk7CisJczY0IHBlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKKwlpbnQgZXJyLCByZXQgPSAwOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgd2F5IG91dHNpZGUgYSByZWFzb2FibGUgcmFuZ2UgdGhlbiBqdXN0IHNraXAgZm9yd2FyZDoKKwkgKi8KKwlpZiAodW5saWtlbHkobGVmdCA8PSAtcGVyaW9kKSkgeworCQlsZWZ0ID0gcGVyaW9kOworCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOworCQlyZXQgPSAxOworCX0KKworCWlmICh1bmxpa2VseShsZWZ0IDw9IDApKSB7CisJCWxlZnQgKz0gcGVyaW9kOworCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOworCQlyZXQgPSAxOworCX0KKwkvKgorCSAqIFF1aXJrOiBjZXJ0YWluIENQVXMgZG9udCBsaWtlIGl0IGlmIGp1c3QgMSBldmVudCBpcyBsZWZ0OgorCSAqLworCWlmICh1bmxpa2VseShsZWZ0IDwgMikpCisJCWxlZnQgPSAyOworCisJaWYgKGxlZnQgPiB4ODZfcG11Lm1heF9wZXJpb2QpCisJCWxlZnQgPSB4ODZfcG11Lm1heF9wZXJpb2Q7CisKKwlwZXJfY3B1KHByZXZfbGVmdFtpZHhdLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gbGVmdDsKKworCS8qCisJICogVGhlIGh3IGNvdW50ZXIgc3RhcnRzIGNvdW50aW5nIGZyb20gdGhpcyBjb3VudGVyIG9mZnNldCwKKwkgKiBtYXJrIGl0IHRvIGJlIGFibGUgdG8gZXh0cmEgZnV0dXJlIGRlbHRhczoKKwkgKi8KKwlhdG9taWM2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgKHU2NCktbGVmdCk7CisKKwllcnIgPSBjaGVja2luZ193cm1zcmwoaHdjLT5jb3VudGVyX2Jhc2UgKyBpZHgsCisJCQkgICAgICh1NjQpKC1sZWZ0KSAmIHg4Nl9wbXUuY291bnRlcl9tYXNrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW50ZWxfcG11X2VuYWJsZV9maXhlZChzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MsIGludCBfX2lkeCkKK3sKKwlpbnQgaWR4ID0gX19pZHggLSBYODZfUE1DX0lEWF9GSVhFRDsKKwl1NjQgY3RybF92YWwsIGJpdHMsIG1hc2s7CisJaW50IGVycjsKKworCS8qCisJICogRW5hYmxlIElSUSBnZW5lcmF0aW9uICgweDgpLAorCSAqIGFuZCBlbmFibGUgcmluZy0zIGNvdW50aW5nICgweDIpIGFuZCByaW5nLTAgY291bnRpbmcgKDB4MSkKKwkgKiBpZiByZXF1ZXN0ZWQ6CisJICovCisJYml0cyA9IDB4OFVMTDsKKwlpZiAoaHdjLT5jb25maWcgJiBBUkNIX1BFUkZNT05fRVZFTlRTRUxfVVNSKQorCQliaXRzIHw9IDB4MjsKKwlpZiAoaHdjLT5jb25maWcgJiBBUkNIX1BFUkZNT05fRVZFTlRTRUxfT1MpCisJCWJpdHMgfD0gMHgxOworCWJpdHMgPDw9IChpZHggKiA0KTsKKwltYXNrID0gMHhmVUxMIDw8IChpZHggKiA0KTsKKworCXJkbXNybChod2MtPmNvbmZpZ19iYXNlLCBjdHJsX3ZhbCk7CisJY3RybF92YWwgJj0gfm1hc2s7CisJY3RybF92YWwgfD0gYml0czsKKwllcnIgPSBjaGVja2luZ193cm1zcmwoaHdjLT5jb25maWdfYmFzZSwgY3RybF92YWwpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9wbXVfZW5hYmxlX2NvdW50ZXIoc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCWlmICh1bmxpa2VseShod2MtPmNvbmZpZ19iYXNlID09IE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSX0NUUkwpKSB7CisJCWludGVsX3BtdV9lbmFibGVfZml4ZWQoaHdjLCBpZHgpOworCQlyZXR1cm47CisJfQorCisJeDg2X3BtdV9lbmFibGVfY291bnRlcihod2MsIGlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9wbXVfZW5hYmxlX2NvdW50ZXIoc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCisJaWYgKGNwdWMtPmVuYWJsZWQpCisJCXg4Nl9wbXVfZW5hYmxlX2NvdW50ZXIoaHdjLCBpZHgpOworCWVsc2UKKwkJeDg2X3BtdV9kaXNhYmxlX2NvdW50ZXIoaHdjLCBpZHgpOworfQorCitzdGF0aWMgaW50CitmaXhlZF9tb2RlX2lkeChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MpCit7CisJdW5zaWduZWQgaW50IGV2ZW50OworCisJaWYgKCF4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZCkKKwkJcmV0dXJuIC0xOworCisJZXZlbnQgPSBod2MtPmNvbmZpZyAmIEFSQ0hfUEVSRk1PTl9FVkVOVF9NQVNLOworCisJaWYgKHVubGlrZWx5KGV2ZW50ID09IHg4Nl9wbXUuZXZlbnRfbWFwKFBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TKSkpCisJCXJldHVybiBYODZfUE1DX0lEWF9GSVhFRF9JTlNUUlVDVElPTlM7CisJaWYgKHVubGlrZWx5KGV2ZW50ID09IHg4Nl9wbXUuZXZlbnRfbWFwKFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUykpKQorCQlyZXR1cm4gWDg2X1BNQ19JRFhfRklYRURfQ1BVX0NZQ0xFUzsKKwlpZiAodW5saWtlbHkoZXZlbnQgPT0geDg2X3BtdS5ldmVudF9tYXAoUEVSRl9DT1VOVF9IV19CVVNfQ1lDTEVTKSkpCisJCXJldHVybiBYODZfUE1DX0lEWF9GSVhFRF9CVVNfQ1lDTEVTOworCisJcmV0dXJuIC0xOworfQorCisvKgorICogRmluZCBhIFBNQyBzbG90IGZvciB0aGUgZnJlc2hseSBlbmFibGVkIC8gc2NoZWR1bGVkIGluIGNvdW50ZXI6CisgKi8KK3N0YXRpYyBpbnQgeDg2X3BtdV9lbmFibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2NvdW50ZXJzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MgPSAmY291bnRlci0+aHc7CisJaW50IGlkeDsKKworCWlkeCA9IGZpeGVkX21vZGVfaWR4KGNvdW50ZXIsIGh3Yyk7CisJaWYgKGlkeCA+PSAwKSB7CisJCS8qCisJCSAqIFRyeSB0byBnZXQgdGhlIGZpeGVkIGNvdW50ZXIsIGlmIHRoYXQgaXMgYWxyZWFkeSB0YWtlbgorCQkgKiB0aGVuIHRyeSB0byBnZXQgYSBnZW5lcmljIGNvdW50ZXI6CisJCSAqLworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzaykpCisJCQlnb3RvIHRyeV9nZW5lcmljOworCisJCWh3Yy0+Y29uZmlnX2Jhc2UgPSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUl9DVFJMOworCQkvKgorCQkgKiBXZSBzZXQgaXQgc28gdGhhdCBjb3VudGVyX2Jhc2UgKyBpZHggaW4gd3Jtc3IvcmRtc3IgbWFwcyB0bworCQkgKiBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUjAgLi4uIENUUjI6CisJCSAqLworCQlod2MtPmNvdW50ZXJfYmFzZSA9CisJCQlNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUjAgLSBYODZfUE1DX0lEWF9GSVhFRDsKKwkJaHdjLT5pZHggPSBpZHg7CisJfSBlbHNlIHsKKwkJaWR4ID0gaHdjLT5pZHg7CisJCS8qIFRyeSB0byBnZXQgdGhlIHByZXZpb3VzIGdlbmVyaWMgY291bnRlciBhZ2FpbiAqLworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzaykpIHsKK3RyeV9nZW5lcmljOgorCQkJaWR4ID0gZmluZF9maXJzdF96ZXJvX2JpdChjcHVjLT51c2VkX21hc2ssCisJCQkJCQkgIHg4Nl9wbXUubnVtX2NvdW50ZXJzKTsKKwkJCWlmIChpZHggPT0geDg2X3BtdS5udW1fY291bnRlcnMpCisJCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJCXNldF9iaXQoaWR4LCBjcHVjLT51c2VkX21hc2spOworCQkJaHdjLT5pZHggPSBpZHg7CisJCX0KKwkJaHdjLT5jb25maWdfYmFzZSAgPSB4ODZfcG11LmV2ZW50c2VsOworCQlod2MtPmNvdW50ZXJfYmFzZSA9IHg4Nl9wbXUucGVyZmN0cjsKKwl9CisKKwlwZXJmX2NvdW50ZXJzX2xhcGljX2luaXQoKTsKKworCXg4Nl9wbXUuZGlzYWJsZShod2MsIGlkeCk7CisKKwljcHVjLT5jb3VudGVyc1tpZHhdID0gY291bnRlcjsKKwlzZXRfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spOworCisJeDg2X3BlcmZfY291bnRlcl9zZXRfcGVyaW9kKGNvdW50ZXIsIGh3YywgaWR4KTsKKwl4ODZfcG11LmVuYWJsZShod2MsIGlkeCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeDg2X3BtdV91bnRocm90dGxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCisJaWYgKFdBUk5fT05fT05DRShod2MtPmlkeCA+PSBYODZfUE1DX0lEWF9NQVggfHwKKwkJCQljcHVjLT5jb3VudGVyc1tod2MtPmlkeF0gIT0gY291bnRlcikpCisJCXJldHVybjsKKworCXg4Nl9wbXUuZW5hYmxlKGh3YywgaHdjLT5pZHgpOworfQorCit2b2lkIHBlcmZfY291bnRlcl9wcmludF9kZWJ1Zyh2b2lkKQoreworCXU2NCBjdHJsLCBzdGF0dXMsIG92ZXJmbG93LCBwbWNfY3RybCwgcG1jX2NvdW50LCBwcmV2X2xlZnQsIGZpeGVkOworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY3B1LCBpZHg7CisKKwlpZiAoIXg4Nl9wbXUubnVtX2NvdW50ZXJzKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3B1YyA9ICZwZXJfY3B1KGNwdV9od19jb3VudGVycywgY3B1KTsKKworCWlmICh4ODZfcG11LnZlcnNpb24gPj0gMikgeworCQlyZG1zcmwoTVNSX0NPUkVfUEVSRl9HTE9CQUxfQ1RSTCwgY3RybCk7CisJCXJkbXNybChNU1JfQ09SRV9QRVJGX0dMT0JBTF9TVEFUVVMsIHN0YXR1cyk7CisJCXJkbXNybChNU1JfQ09SRV9QRVJGX0dMT0JBTF9PVkZfQ1RSTCwgb3ZlcmZsb3cpOworCQlyZG1zcmwoTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFJfQ1RSTCwgZml4ZWQpOworCisJCXByX2luZm8oIlxuIik7CisJCXByX2luZm8oIkNQVSMlZDogY3RybDogICAgICAgJTAxNmxseFxuIiwgY3B1LCBjdHJsKTsKKwkJcHJfaW5mbygiQ1BVIyVkOiBzdGF0dXM6ICAgICAlMDE2bGx4XG4iLCBjcHUsIHN0YXR1cyk7CisJCXByX2luZm8oIkNQVSMlZDogb3ZlcmZsb3c6ICAgJTAxNmxseFxuIiwgY3B1LCBvdmVyZmxvdyk7CisJCXByX2luZm8oIkNQVSMlZDogZml4ZWQ6ICAgICAgJTAxNmxseFxuIiwgY3B1LCBmaXhlZCk7CisJfQorCXByX2luZm8oIkNQVSMlZDogdXNlZDogICAgICAgJTAxNmxseFxuIiwgY3B1LCAqKHU2NCAqKWNwdWMtPnVzZWRfbWFzayk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHg4Nl9wbXUubnVtX2NvdW50ZXJzOyBpZHgrKykgeworCQlyZG1zcmwoeDg2X3BtdS5ldmVudHNlbCArIGlkeCwgcG1jX2N0cmwpOworCQlyZG1zcmwoeDg2X3BtdS5wZXJmY3RyICArIGlkeCwgcG1jX2NvdW50KTsKKworCQlwcmV2X2xlZnQgPSBwZXJfY3B1KHByZXZfbGVmdFtpZHhdLCBjcHUpOworCisJCXByX2luZm8oIkNQVSMlZDogICBnZW4tUE1DJWQgY3RybDogICUwMTZsbHhcbiIsCisJCQljcHUsIGlkeCwgcG1jX2N0cmwpOworCQlwcl9pbmZvKCJDUFUjJWQ6ICAgZ2VuLVBNQyVkIGNvdW50OiAlMDE2bGx4XG4iLAorCQkJY3B1LCBpZHgsIHBtY19jb3VudCk7CisJCXByX2luZm8oIkNQVSMlZDogICBnZW4tUE1DJWQgbGVmdDogICUwMTZsbHhcbiIsCisJCQljcHUsIGlkeCwgcHJldl9sZWZ0KTsKKwl9CisJZm9yIChpZHggPSAwOyBpZHggPCB4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZDsgaWR4KyspIHsKKwkJcmRtc3JsKE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSMCArIGlkeCwgcG1jX2NvdW50KTsKKworCQlwcl9pbmZvKCJDUFUjJWQ6IGZpeGVkLVBNQyVkIGNvdW50OiAlMDE2bGx4XG4iLAorCQkJY3B1LCBpZHgsIHBtY19jb3VudCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgeDg2X3BtdV9kaXNhYmxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCWludCBpZHggPSBod2MtPmlkeDsKKworCS8qCisJICogTXVzdCBiZSBkb25lIGJlZm9yZSB3ZSBkaXNhYmxlLCBvdGhlcndpc2UgdGhlIG5taSBoYW5kbGVyCisJICogY291bGQgcmVlbmFibGUgYWdhaW46CisJICovCisJY2xlYXJfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spOworCXg4Nl9wbXUuZGlzYWJsZShod2MsIGlkeCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgY2xlYXJlZCBwb2ludGVyIGJlY29tZXMgdmlzaWJsZSBiZWZvcmUgd2UKKwkgKiAocG90ZW50aWFsbHkpIGZyZWUgdGhlIGNvdW50ZXI6CisJICovCisJYmFycmllcigpOworCisJLyoKKwkgKiBEcmFpbiB0aGUgcmVtYWluaW5nIGRlbHRhIGNvdW50IG91dCBvZiBhIGNvdW50ZXIKKwkgKiB0aGF0IHdlIGFyZSBkaXNhYmxpbmc6CisJICovCisJeDg2X3BlcmZfY291bnRlcl91cGRhdGUoY291bnRlciwgaHdjLCBpZHgpOworCWNwdWMtPmNvdW50ZXJzW2lkeF0gPSBOVUxMOworCWNsZWFyX2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzayk7Cit9CisKKy8qCisgKiBTYXZlIGFuZCByZXN0YXJ0IGFuIGV4cGlyZWQgY291bnRlci4gQ2FsbGVkIGJ5IE5NSSBjb250ZXh0cywKKyAqIHNvIGl0IGhhcyB0byBiZSBjYXJlZnVsIGFib3V0IHByZWVtcHRpbmcgbm9ybWFsIGNvdW50ZXIgb3BzOgorICovCitzdGF0aWMgaW50IGludGVsX3BtdV9zYXZlX2FuZF9yZXN0YXJ0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCWludCBpZHggPSBod2MtPmlkeDsKKwlpbnQgcmV0OworCisJeDg2X3BlcmZfY291bnRlcl91cGRhdGUoY291bnRlciwgaHdjLCBpZHgpOworCXJldCA9IHg4Nl9wZXJmX2NvdW50ZXJfc2V0X3BlcmlvZChjb3VudGVyLCBod2MsIGlkeCk7CisKKwlpZiAoY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRSkKKwkJaW50ZWxfcG11X2VuYWJsZV9jb3VudGVyKGh3YywgaWR4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3BtdV9yZXNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlkeDsKKworCWlmICgheDg2X3BtdS5udW1fY291bnRlcnMpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXByaW50aygiY2xlYXJpbmcgUE1VIHN0YXRlIG9uIENQVSMlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgeDg2X3BtdS5udW1fY291bnRlcnM7IGlkeCsrKSB7CisJCWNoZWNraW5nX3dybXNybCh4ODZfcG11LmV2ZW50c2VsICsgaWR4LCAwdWxsKTsKKwkJY2hlY2tpbmdfd3Jtc3JsKHg4Nl9wbXUucGVyZmN0ciAgKyBpZHgsIDB1bGwpOworCX0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHg4Nl9wbXUubnVtX2NvdW50ZXJzX2ZpeGVkOyBpZHgrKykgeworCQljaGVja2luZ193cm1zcmwoTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFIwICsgaWR4LCAwdWxsKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworLyoKKyAqIFRoaXMgaGFuZGxlciBpcyB0cmlnZ2VyZWQgYnkgdGhlIGxvY2FsIEFQSUMsIHNvIHRoZSBBUElDIElSUSBoYW5kbGluZworICogcnVsZXMgYXBwbHk6CisgKi8KK3N0YXRpYyBpbnQgaW50ZWxfcG11X2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVjOworCWludCBiaXQsIGNwdSwgbG9vcHM7CisJdTY0IGFjaywgc3RhdHVzOworCisJZGF0YS5yZWdzID0gcmVnczsKKwlkYXRhLmFkZHIgPSAwOworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWNwdWMgPSAmcGVyX2NwdShjcHVfaHdfY291bnRlcnMsIGNwdSk7CisKKwlwZXJmX2Rpc2FibGUoKTsKKwlzdGF0dXMgPSBpbnRlbF9wbXVfZ2V0X3N0YXR1cygpOworCWlmICghc3RhdHVzKSB7CisJCXBlcmZfZW5hYmxlKCk7CisJCXJldHVybiAwOworCX0KKworCWxvb3BzID0gMDsKK2FnYWluOgorCWlmICgrK2xvb3BzID4gMTAwKSB7CisJCVdBUk5fT05DRSgxLCAicGVyZmNvdW50ZXJzOiBpcnEgbG9vcCBzdHVjayFcbiIpOworCQlwZXJmX2NvdW50ZXJfcHJpbnRfZGVidWcoKTsKKwkJaW50ZWxfcG11X3Jlc2V0KCk7CisJCXBlcmZfZW5hYmxlKCk7CisJCXJldHVybiAxOworCX0KKworCWluY19pcnFfc3RhdChhcGljX3BlcmZfaXJxcyk7CisJYWNrID0gc3RhdHVzOworCWZvcl9lYWNoX2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopJnN0YXR1cywgWDg2X1BNQ19JRFhfTUFYKSB7CisJCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBjcHVjLT5jb3VudGVyc1tiaXRdOworCisJCWNsZWFyX2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopICZzdGF0dXMpOworCQlpZiAoIXRlc3RfYml0KGJpdCwgY3B1Yy0+YWN0aXZlX21hc2spKQorCQkJY29udGludWU7CisKKwkJaWYgKCFpbnRlbF9wbXVfc2F2ZV9hbmRfcmVzdGFydChjb3VudGVyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwZXJmX2NvdW50ZXJfb3ZlcmZsb3coY291bnRlciwgMSwgJmRhdGEpKQorCQkJaW50ZWxfcG11X2Rpc2FibGVfY291bnRlcigmY291bnRlci0+aHcsIGJpdCk7CisJfQorCisJaW50ZWxfcG11X2Fja19zdGF0dXMoYWNrKTsKKworCS8qCisJICogUmVwZWF0IGlmIHRoZXJlIGlzIG1vcmUgd29yayB0byBiZSBkb25lOgorCSAqLworCXN0YXR1cyA9IGludGVsX3BtdV9nZXRfc3RhdHVzKCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBhZ2FpbjsKKworCXBlcmZfZW5hYmxlKCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhbWRfcG11X2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVjOworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjOworCWludCBjcHUsIGlkeCwgaGFuZGxlZCA9IDA7CisJdTY0IHZhbDsKKworCWRhdGEucmVncyA9IHJlZ3M7CisJZGF0YS5hZGRyID0gMDsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwljcHVjID0gJnBlcl9jcHUoY3B1X2h3X2NvdW50ZXJzLCBjcHUpOworCisJZm9yIChpZHggPSAwOyBpZHggPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaWR4KyspIHsKKwkJaWYgKCF0ZXN0X2JpdChpZHgsIGNwdWMtPmFjdGl2ZV9tYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCWNvdW50ZXIgPSBjcHVjLT5jb3VudGVyc1tpZHhdOworCQlod2MgPSAmY291bnRlci0+aHc7CisKKwkJdmFsID0geDg2X3BlcmZfY291bnRlcl91cGRhdGUoY291bnRlciwgaHdjLCBpZHgpOworCQlpZiAodmFsICYgKDFVTEwgPDwgKHg4Nl9wbXUuY291bnRlcl9iaXRzIC0gMSkpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogY291bnRlciBvdmVyZmxvdworCQkgKi8KKwkJaGFuZGxlZAkJPSAxOworCQlkYXRhLnBlcmlvZAk9IGNvdW50ZXItPmh3Lmxhc3RfcGVyaW9kOworCisJCWlmICgheDg2X3BlcmZfY291bnRlcl9zZXRfcGVyaW9kKGNvdW50ZXIsIGh3YywgaWR4KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwZXJmX2NvdW50ZXJfb3ZlcmZsb3coY291bnRlciwgMSwgJmRhdGEpKQorCQkJYW1kX3BtdV9kaXNhYmxlX2NvdW50ZXIoaHdjLCBpZHgpOworCX0KKworCWlmIChoYW5kbGVkKQorCQlpbmNfaXJxX3N0YXQoYXBpY19wZXJmX2lycXMpOworCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3ZvaWQgc21wX3BlcmZfcGVuZGluZ19pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaXJxX2VudGVyKCk7CisJYWNrX0FQSUNfaXJxKCk7CisJaW5jX2lycV9zdGF0KGFwaWNfcGVuZGluZ19pcnFzKTsKKwlwZXJmX2NvdW50ZXJfZG9fcGVuZGluZygpOworCWlycV9leGl0KCk7Cit9CisKK3ZvaWQgc2V0X3BlcmZfY291bnRlcl9wZW5kaW5nKHZvaWQpCit7CisJYXBpYy0+c2VuZF9JUElfc2VsZihMT0NBTF9QRU5ESU5HX1ZFQ1RPUik7Cit9CisKK3ZvaWQgcGVyZl9jb3VudGVyc19sYXBpY19pbml0KHZvaWQpCit7CisJaWYgKCF4ODZfcG11X2luaXRpYWxpemVkKCkpCisJCXJldHVybjsKKworCS8qCisJICogQWx3YXlzIHVzZSBOTUkgZm9yIFBNVQorCSAqLworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworfQorCitzdGF0aWMgaW50IF9fa3Byb2JlcworcGVyZl9jb3VudGVyX25taV9oYW5kbGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCSB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqX19hcmdzKQoreworCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IF9fYXJnczsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKworCWlmICghYXRvbWljX3JlYWQoJmFjdGl2ZV9jb3VudGVycykpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBESUVfTk1JOgorCWNhc2UgRElFX05NSV9JUEk6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KKworCXJlZ3MgPSBhcmdzLT5yZWdzOworCisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJLyoKKwkgKiBDYW4ndCByZWx5IG9uIHRoZSBoYW5kbGVkIHJldHVybiB2YWx1ZSB0byBzYXkgaXQgd2FzIG91ciBOTUksIHR3bworCSAqIGNvdW50ZXJzIGNvdWxkIHRyaWdnZXIgJ3NpbXVsdGFuZW91c2x5JyByYWlzaW5nIHR3byBiYWNrLXRvLWJhY2sgTk1Jcy4KKwkgKgorCSAqIElmIHRoZSBmaXJzdCBOTUkgaGFuZGxlcyBib3RoLCB0aGUgbGF0dGVyIHdpbGwgYmUgZW1wdHkgYW5kIGRhemUKKwkgKiB0aGUgQ1BVLgorCSAqLworCXg4Nl9wbXUuaGFuZGxlX2lycShyZWdzKTsKKworCXJldHVybiBOT1RJRllfU1RPUDsKK30KKworc3RhdGljIF9fcmVhZF9tb3N0bHkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBlcmZfY291bnRlcl9ubWlfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJCT0gcGVyZl9jb3VudGVyX25taV9oYW5kbGVyLAorCS5uZXh0CQkJPSBOVUxMLAorCS5wcmlvcml0eQkJPSAxCit9OworCitzdGF0aWMgc3RydWN0IHg4Nl9wbXUgaW50ZWxfcG11ID0geworCS5uYW1lCQkJPSAiSW50ZWwiLAorCS5oYW5kbGVfaXJxCQk9IGludGVsX3BtdV9oYW5kbGVfaXJxLAorCS5kaXNhYmxlX2FsbAkJPSBpbnRlbF9wbXVfZGlzYWJsZV9hbGwsCisJLmVuYWJsZV9hbGwJCT0gaW50ZWxfcG11X2VuYWJsZV9hbGwsCisJLmVuYWJsZQkJCT0gaW50ZWxfcG11X2VuYWJsZV9jb3VudGVyLAorCS5kaXNhYmxlCQk9IGludGVsX3BtdV9kaXNhYmxlX2NvdW50ZXIsCisJLmV2ZW50c2VsCQk9IE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLAorCS5wZXJmY3RyCQk9IE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjAsCisJLmV2ZW50X21hcAkJPSBpbnRlbF9wbXVfZXZlbnRfbWFwLAorCS5yYXdfZXZlbnQJCT0gaW50ZWxfcG11X3Jhd19ldmVudCwKKwkubWF4X2V2ZW50cwkJPSBBUlJBWV9TSVpFKGludGVsX3BlcmZtb25fZXZlbnRfbWFwKSwKKwkvKgorCSAqIEludGVsIFBNQ3MgY2Fubm90IGJlIGFjY2Vzc2VkIHNhbmVseSBhYm92ZSAzMiBiaXQgd2lkdGgsCisJICogc28gd2UgaW5zdGFsbCBhbiBhcnRpZmljaWFsIDE8PDMxIHBlcmlvZCByZWdhcmRsZXNzIG9mCisJICogdGhlIGdlbmVyaWMgY291bnRlciBwZXJpb2Q6CisJICovCisJLm1heF9wZXJpb2QJCT0gKDFVTEwgPDwgMzEpIC0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeDg2X3BtdSBhbWRfcG11ID0geworCS5uYW1lCQkJPSAiQU1EIiwKKwkuaGFuZGxlX2lycQkJPSBhbWRfcG11X2hhbmRsZV9pcnEsCisJLmRpc2FibGVfYWxsCQk9IGFtZF9wbXVfZGlzYWJsZV9hbGwsCisJLmVuYWJsZV9hbGwJCT0gYW1kX3BtdV9lbmFibGVfYWxsLAorCS5lbmFibGUJCQk9IGFtZF9wbXVfZW5hYmxlX2NvdW50ZXIsCisJLmRpc2FibGUJCT0gYW1kX3BtdV9kaXNhYmxlX2NvdW50ZXIsCisJLmV2ZW50c2VsCQk9IE1TUl9LN19FVk5UU0VMMCwKKwkucGVyZmN0cgkJPSBNU1JfSzdfUEVSRkNUUjAsCisJLmV2ZW50X21hcAkJPSBhbWRfcG11X2V2ZW50X21hcCwKKwkucmF3X2V2ZW50CQk9IGFtZF9wbXVfcmF3X2V2ZW50LAorCS5tYXhfZXZlbnRzCQk9IEFSUkFZX1NJWkUoYW1kX3BlcmZtb25fZXZlbnRfbWFwKSwKKwkubnVtX2NvdW50ZXJzCQk9IDQsCisJLmNvdW50ZXJfYml0cwkJPSA0OCwKKwkuY291bnRlcl9tYXNrCQk9ICgxVUxMIDw8IDQ4KSAtIDEsCisJLyogdXNlIGhpZ2hlc3QgYml0IHRvIGRldGVjdCBvdmVyZmxvdyAqLworCS5tYXhfcGVyaW9kCQk9ICgxVUxMIDw8IDQ3KSAtIDEsCit9OworCitzdGF0aWMgaW50IGludGVsX3BtdV9pbml0KHZvaWQpCit7CisJdW5pb24gY3B1aWQxMF9lZHggZWR4OworCXVuaW9uIGNwdWlkMTBfZWF4IGVheDsKKwl1bnNpZ25lZCBpbnQgdW51c2VkOworCXVuc2lnbmVkIGludCBlYng7CisJaW50IHZlcnNpb247CisKKwlpZiAoIWNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSBBcmNoaXRlY3R1cmFsIFBlcmZNb24gc3VwcG9ydHMKKwkgKiBCcmFuY2ggTWlzc2VzIFJldGlyZWQgRXZlbnQgb3Igbm90LgorCSAqLworCWNwdWlkKDEwLCAmZWF4LmZ1bGwsICZlYngsICZ1bnVzZWQsICZlZHguZnVsbCk7CisJaWYgKGVheC5zcGxpdC5tYXNrX2xlbmd0aCA8PSBBUkNIX1BFUkZNT05fQlJBTkNIX01JU1NFU19SRVRJUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZlcnNpb24gPSBlYXguc3BsaXQudmVyc2lvbl9pZDsKKwlpZiAodmVyc2lvbiA8IDIpCisJCXJldHVybiAtRU5PREVWOworCisJeDg2X3BtdQkJCQk9IGludGVsX3BtdTsKKwl4ODZfcG11LnZlcnNpb24JCQk9IHZlcnNpb247CisJeDg2X3BtdS5udW1fY291bnRlcnMJCT0gZWF4LnNwbGl0Lm51bV9jb3VudGVyczsKKwl4ODZfcG11LmNvdW50ZXJfYml0cwkJPSBlYXguc3BsaXQuYml0X3dpZHRoOworCXg4Nl9wbXUuY291bnRlcl9tYXNrCQk9ICgxVUxMIDw8IGVheC5zcGxpdC5iaXRfd2lkdGgpIC0gMTsKKworCS8qCisJICogUXVpcms6IHYyIHBlcmZtb24gZG9lcyBub3QgcmVwb3J0IGZpeGVkLXB1cnBvc2UgY291bnRlcnMsIHNvCisJICogYXNzdW1lIGF0IGxlYXN0IDMgY291bnRlcnM6CisJICovCisJeDg2X3BtdS5udW1fY291bnRlcnNfZml4ZWQJPSBtYXgoKGludCllZHguc3BsaXQubnVtX2NvdW50ZXJzX2ZpeGVkLCAzKTsKKworCXJkbXNybChNU1JfQ09SRV9QRVJGX0dMT0JBTF9DVFJMLCB4ODZfcG11LmludGVsX2N0cmwpOworCisJLyoKKwkgKiBJbnN0YWxsIHRoZSBody1jYWNoZS1ldmVudHMgdGFibGU6CisJICovCisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCkgeworCWNhc2UgMTU6IC8qIG9yaWdpbmFsIDY1IG5tIGNlbGVyb24vcGVudGl1bS9jb3JlMi94ZW9uLCAiTWVyb20iLyJDb25yb2UiICovCisJY2FzZSAyMjogLyogc2luZ2xlLWNvcmUgNjUgbm0gY2VsZXJvbi9jb3JlMnNvbG8gIk1lcm9tLUwiLyJDb25yb2UtTCIgKi8KKwljYXNlIDIzOiAvKiBjdXJyZW50IDQ1IG5tIGNlbGVyb24vY29yZTIveGVvbiAiUGVucnluIi8iV29sZmRhbGUiICovCisJY2FzZSAyOTogLyogc2l4LWNvcmUgNDUgbm0geGVvbiAiRHVubmluZ3RvbiIgKi8KKwkJbWVtY3B5KGh3X2NhY2hlX2V2ZW50X2lkcywgY29yZTJfaHdfY2FjaGVfZXZlbnRfaWRzLAorCQkgICAgICAgc2l6ZW9mKGh3X2NhY2hlX2V2ZW50X2lkcykpOworCisJCXByX2NvbnQoIkNvcmUyIGV2ZW50cywgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSAyNjoKKwkJbWVtY3B5KGh3X2NhY2hlX2V2ZW50X2lkcywgbmVoYWxlbV9od19jYWNoZV9ldmVudF9pZHMsCisJCSAgICAgICBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7CisKKwkJcHJfY29udCgiTmVoYWxlbS9Db3JlaTcgZXZlbnRzLCAiKTsKKwkJYnJlYWs7CisJY2FzZSAyODoKKwkJbWVtY3B5KGh3X2NhY2hlX2V2ZW50X2lkcywgYXRvbV9od19jYWNoZV9ldmVudF9pZHMsCisJCSAgICAgICBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7CisKKwkJcHJfY29udCgiQXRvbSBldmVudHMsICIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3BtdV9pbml0KHZvaWQpCit7CisJeDg2X3BtdSA9IGFtZF9wbXU7CisKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2KSB7CisJY2FzZSAweDBmOgorCWNhc2UgMHgxMDoKKwljYXNlIDB4MTE6CisJCW1lbWNweShod19jYWNoZV9ldmVudF9pZHMsIGFtZF8wZl9od19jYWNoZV9ldmVudF9pZHMsCisJCSAgICAgICBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7CisKKwkJcHJfY29udCgiQU1EIEZhbWlseSAwZi8xMC8xMSBldmVudHMsICIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IGluaXRfaHdfcGVyZl9jb3VudGVycyh2b2lkKQoreworCWludCBlcnI7CisKKwlwcl9pbmZvKCJQZXJmb3JtYW5jZSBDb3VudGVyczogIik7CisKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJZXJyID0gaW50ZWxfcG11X2luaXQoKTsKKwkJYnJlYWs7CisJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJZXJyID0gYW1kX3BtdV9pbml0KCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJaWYgKGVyciAhPSAwKSB7CisJCXByX2NvbnQoIm5vIFBNVSBkcml2ZXIsIHNvZnR3YXJlIGNvdW50ZXJzIG9ubHkuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByX2NvbnQoIiVzIFBNVSBkcml2ZXIuXG4iLCB4ODZfcG11Lm5hbWUpOworCisJaWYgKHg4Nl9wbXUubnVtX2NvdW50ZXJzID4gWDg2X1BNQ19NQVhfR0VORVJJQykgeworCQl4ODZfcG11Lm51bV9jb3VudGVycyA9IFg4Nl9QTUNfTUFYX0dFTkVSSUM7CisJCVdBUk4oMSwgS0VSTl9FUlIgImh3IHBlcmYgY291bnRlcnMgJWQgPiBtYXgoJWQpLCBjbGlwcGluZyEiLAorCQkgICAgIHg4Nl9wbXUubnVtX2NvdW50ZXJzLCBYODZfUE1DX01BWF9HRU5FUklDKTsKKwl9CisJcGVyZl9jb3VudGVyX21hc2sgPSAoMSA8PCB4ODZfcG11Lm51bV9jb3VudGVycykgLSAxOworCXBlcmZfbWF4X2NvdW50ZXJzID0geDg2X3BtdS5udW1fY291bnRlcnM7CisKKwlpZiAoeDg2X3BtdS5udW1fY291bnRlcnNfZml4ZWQgPiBYODZfUE1DX01BWF9GSVhFRCkgeworCQl4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZCA9IFg4Nl9QTUNfTUFYX0ZJWEVEOworCQlXQVJOKDEsIEtFUk5fRVJSICJodyBwZXJmIGNvdW50ZXJzIGZpeGVkICVkID4gbWF4KCVkKSwgY2xpcHBpbmchIiwKKwkJICAgICB4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZCwgWDg2X1BNQ19NQVhfRklYRUQpOworCX0KKworCXBlcmZfY291bnRlcl9tYXNrIHw9CisJCSgoMUxMIDw8IHg4Nl9wbXUubnVtX2NvdW50ZXJzX2ZpeGVkKS0xKSA8PCBYODZfUE1DX0lEWF9GSVhFRDsKKworCXBlcmZfY291bnRlcnNfbGFwaWNfaW5pdCgpOworCXJlZ2lzdGVyX2RpZV9ub3RpZmllcigmcGVyZl9jb3VudGVyX25taV9ub3RpZmllcik7CisKKwlwcl9pbmZvKCIuLi4gdmVyc2lvbjogICAgICAgICAgICAgICAgICVkXG4iLCAgICAgeDg2X3BtdS52ZXJzaW9uKTsKKwlwcl9pbmZvKCIuLi4gYml0IHdpZHRoOiAgICAgICAgICAgICAgICVkXG4iLCAgICAgeDg2X3BtdS5jb3VudGVyX2JpdHMpOworCXByX2luZm8oIi4uLiBnZW5lcmljIGNvdW50ZXJzOiAgICAgICAgJWRcbiIsICAgICB4ODZfcG11Lm51bV9jb3VudGVycyk7CisJcHJfaW5mbygiLi4uIHZhbHVlIG1hc2s6ICAgICAgICAgICAgICAlMDE2THhcbiIsIHg4Nl9wbXUuY291bnRlcl9tYXNrKTsKKwlwcl9pbmZvKCIuLi4gbWF4IHBlcmlvZDogICAgICAgICAgICAgICUwMTZMeFxuIiwgeDg2X3BtdS5tYXhfcGVyaW9kKTsKKwlwcl9pbmZvKCIuLi4gZml4ZWQtcHVycG9zZSBjb3VudGVyczogICVkXG4iLCAgICAgeDg2X3BtdS5udW1fY291bnRlcnNfZml4ZWQpOworCXByX2luZm8oIi4uLiBjb3VudGVyIG1hc2s6ICAgICAgICAgICAgJTAxNkx4XG4iLCBwZXJmX2NvdW50ZXJfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ODZfcG11X3JlYWQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwl4ODZfcGVyZl9jb3VudGVyX3VwZGF0ZShjb3VudGVyLCAmY291bnRlci0+aHcsIGNvdW50ZXItPmh3LmlkeCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG11IHBtdSA9IHsKKwkuZW5hYmxlCQk9IHg4Nl9wbXVfZW5hYmxlLAorCS5kaXNhYmxlCT0geDg2X3BtdV9kaXNhYmxlLAorCS5yZWFkCQk9IHg4Nl9wbXVfcmVhZCwKKwkudW50aHJvdHRsZQk9IHg4Nl9wbXVfdW50aHJvdHRsZSwKK307CisKK2NvbnN0IHN0cnVjdCBwbXUgKmh3X3BlcmZfY291bnRlcl9pbml0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJaW50IGVycjsKKworCWVyciA9IF9faHdfcGVyZl9jb3VudGVyX2luaXQoY291bnRlcik7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCXJldHVybiAmcG11OworfQorCisvKgorICogY2FsbGNoYWluIHN1cHBvcnQKKyAqLworCitzdGF0aWMgaW5saW5lCit2b2lkIGNhbGxjaGFpbl9zdG9yZShzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIGlwKQoreworCWlmIChlbnRyeS0+bnIgPCBNQVhfU1RBQ0tfREVQVEgpCisJCWVudHJ5LT5pcFtlbnRyeS0+bnIrK10gPSBpcDsKK30KKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSwgaXJxX2VudHJ5KTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnksIG5taV9lbnRyeSk7CisKKworc3RhdGljIHZvaWQKK2JhY2t0cmFjZV93YXJuaW5nX3N5bWJvbCh2b2lkICpkYXRhLCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgc3ltYm9sKQoreworCS8qIElnbm9yZSB3YXJuaW5ncyAqLworfQorCitzdGF0aWMgdm9pZCBiYWNrdHJhY2Vfd2FybmluZyh2b2lkICpkYXRhLCBjaGFyICptc2cpCit7CisJLyogSWdub3JlIHdhcm5pbmdzICovCit9CisKK3N0YXRpYyBpbnQgYmFja3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCit7CisJLyogRG9uJ3QgYm90aGVyIHdpdGggSVJRIHN0YWNrcyBmb3Igbm93ICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBiYWNrdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKK3sKKwlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5ID0gZGF0YTsKKworCWlmIChyZWxpYWJsZSkKKwkJY2FsbGNoYWluX3N0b3JlKGVudHJ5LCBhZGRyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyBiYWNrdHJhY2Vfb3BzID0geworCS53YXJuaW5nCQk9IGJhY2t0cmFjZV93YXJuaW5nLAorCS53YXJuaW5nX3N5bWJvbAkJPSBiYWNrdHJhY2Vfd2FybmluZ19zeW1ib2wsCisJLnN0YWNrCQkJPSBiYWNrdHJhY2Vfc3RhY2ssCisJLmFkZHJlc3MJCT0gYmFja3RyYWNlX2FkZHJlc3MsCit9OworCitzdGF0aWMgdm9pZAorcGVyZl9jYWxsY2hhaW5fa2VybmVsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgYnA7CisJY2hhciAqc3RhY2s7CisJaW50IG5yID0gZW50cnktPm5yOworCisJY2FsbGNoYWluX3N0b3JlKGVudHJ5LCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKTsKKworCXN0YWNrID0gKChjaGFyICopcmVncyArIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJYnAgPSBmcmFtZV9wb2ludGVyKHJlZ3MpOworI2Vsc2UKKwlicCA9IDA7CisjZW5kaWYKKworCWR1bXBfdHJhY2UoTlVMTCwgcmVncywgKHZvaWQgKilzdGFjaywgYnAsICZiYWNrdHJhY2Vfb3BzLCBlbnRyeSk7CisKKwllbnRyeS0+a2VybmVsID0gZW50cnktPm5yIC0gbnI7Cit9CisKKworc3RydWN0IHN0YWNrX2ZyYW1lIHsKKwljb25zdCB2b2lkIF9fdXNlcgkqbmV4dF9mcDsKKwl1bnNpZ25lZCBsb25nCQlyZXR1cm5fYWRkcmVzczsKK307CisKK3N0YXRpYyBpbnQgY29weV9zdGFja19mcmFtZShjb25zdCB2b2lkIF9fdXNlciAqZnAsIHN0cnVjdCBzdGFja19mcmFtZSAqZnJhbWUpCit7CisJaW50IHJldDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcCwgc2l6ZW9mKCpmcmFtZSkpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IDE7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhmcmFtZSwgZnAsIHNpemVvZigqZnJhbWUpKSkKKwkJcmV0ID0gMDsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorcGVyZl9jYWxsY2hhaW5fdXNlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3Qgc3RhY2tfZnJhbWUgZnJhbWU7CisJY29uc3Qgdm9pZCBfX3VzZXIgKmZwOworCWludCBuciA9IGVudHJ5LT5ucjsKKworCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKiljdXJyZW50LT50aHJlYWQuc3AwIC0gMTsKKwlmcCAgID0gKHZvaWQgX191c2VyICopcmVncy0+YnA7CisKKwljYWxsY2hhaW5fc3RvcmUoZW50cnksIHJlZ3MtPmlwKTsKKworCXdoaWxlIChlbnRyeS0+bnIgPCBNQVhfU1RBQ0tfREVQVEgpIHsKKwkJZnJhbWUubmV4dF9mcAkgICAgID0gTlVMTDsKKwkJZnJhbWUucmV0dXJuX2FkZHJlc3MgPSAwOworCisJCWlmICghY29weV9zdGFja19mcmFtZShmcCwgJmZyYW1lKSkKKwkJCWJyZWFrOworCisJCWlmICgodW5zaWduZWQgbG9uZylmcCA8IHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKSkKKwkJCWJyZWFrOworCisJCWNhbGxjaGFpbl9zdG9yZShlbnRyeSwgZnJhbWUucmV0dXJuX2FkZHJlc3MpOworCQlmcCA9IGZyYW1lLm5leHRfZnA7CisJfQorCisJZW50cnktPnVzZXIgPSBlbnRyeS0+bnIgLSBucjsKK30KKworc3RhdGljIHZvaWQKK3BlcmZfZG9fY2FsbGNoYWluKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5KQoreworCWludCBpc191c2VyOworCisJaWYgKCFyZWdzKQorCQlyZXR1cm47CisKKwlpc191c2VyID0gdXNlcl9tb2RlKHJlZ3MpOworCisJaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQtPnBpZCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoaXNfdXNlciAmJiBjdXJyZW50LT5zdGF0ZSAhPSBUQVNLX1JVTk5JTkcpCisJCXJldHVybjsKKworCWlmICghaXNfdXNlcikKKwkJcGVyZl9jYWxsY2hhaW5fa2VybmVsKHJlZ3MsIGVudHJ5KTsKKworCWlmIChjdXJyZW50LT5tbSkKKwkJcGVyZl9jYWxsY2hhaW5fdXNlcihyZWdzLCBlbnRyeSk7Cit9CisKK3N0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqcGVyZl9jYWxsY2hhaW4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeTsKKworCWlmIChpbl9ubWkoKSkKKwkJZW50cnkgPSAmX19nZXRfY3B1X3ZhcihubWlfZW50cnkpOworCWVsc2UKKwkJZW50cnkgPSAmX19nZXRfY3B1X3ZhcihpcnFfZW50cnkpOworCisJZW50cnktPm5yID0gMDsKKwllbnRyeS0+aHYgPSAwOworCWVudHJ5LT5rZXJuZWwgPSAwOworCWVudHJ5LT51c2VyID0gMDsKKworCXBlcmZfZG9fY2FsbGNoYWluKHJlZ3MsIGVudHJ5KTsKKworCXJldHVybiBlbnRyeTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZmN0ci13YXRjaGRvZy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKaW5kZXggZjZjNzBhMS4uZDZmNWI5ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKQEAgLTE5LDggKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC9ubWkuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAKLSNpbmNsdWRlIDxhc20vZ2VuYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9pbnRlbF9hcmNoX3BlcmZtb24uaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9wZXJmX2NvdW50ZXIuaD4KIAogc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgewogCXVuc2lnbmVkIGludCBjY2NyX21zcjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kcy5jIGIvYXJjaC94ODYva2VybmVsL2RzLmMKaW5kZXggODdiNjdlMy4uNDhiZmUxMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2RzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2RzLmMKQEAgLTE5LDQ1ICsxOSw2MSBAQAogICogTWFya3VzIE1ldHpnZXIgPG1hcmt1cy50Lm1ldHpnZXJAaW50ZWwuY29tPiwgMjAwNy0yMDA5CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZV9jbG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2RzLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KKyNpbmNsdWRlICJkc19zZWxmdGVzdC5oIgogCiAvKgotICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgcGFydGljdWxhciBEUyBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoZSBjb25maWd1cmF0aW9uIGZvciBhIHBhcnRpY3VsYXIgRFMgaGFyZHdhcmUgaW1wbGVtZW50YXRpb246CiAgKi8KIHN0cnVjdCBkc19jb25maWd1cmF0aW9uIHsKLQkvKiB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JLyogdGhlIHNpemUgb2Ygb25lIHBvaW50ZXItdHlwZWQgZmllbGQgaW4gdGhlIERTIHN0cnVjdHVyZSBhbmQKLQkgICBpbiB0aGUgQlRTIGFuZCBQRUJTIGJ1ZmZlcnMgaW4gYnl0ZXM7Ci0JICAgdGhpcyBjb3ZlcnMgdGhlIGZpcnN0IDggRFMgZmllbGRzIHJlbGF0ZWQgdG8gYnVmZmVyIG1hbmFnZW1lbnQuICovCi0JdW5zaWduZWQgY2hhciAgc2l6ZW9mX2ZpZWxkOwotCS8qIHRoZSBzaXplIG9mIGEgQlRTL1BFQlMgcmVjb3JkIGluIGJ5dGVzICovCi0JdW5zaWduZWQgY2hhciAgc2l6ZW9mX3JlY1syXTsKLQkvKiBhIHNlcmllcyBvZiBiaXQtbWFza3MgdG8gY29udHJvbCB2YXJpb3VzIGZlYXR1cmVzIGluZGV4ZWQKLQkgKiBieSBlbnVtIGRzX2ZlYXR1cmUgKi8KLQl1bnNpZ25lZCBsb25nIGN0bFtkc2ZfY3RsX21heF07CisJLyogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb246ICovCisJY29uc3QgY2hhcgkJKm5hbWU7CisKKwkvKiBUaGUgc2l6ZSBvZiBwb2ludGVyLXR5cGVkIGZpZWxkcyBpbiBEUywgQlRTLCBhbmQgUEVCUzogKi8KKwl1bnNpZ25lZCBjaGFyCQlzaXplb2ZfcHRyX2ZpZWxkOworCisJLyogVGhlIHNpemUgb2YgYSBCVFMvUEVCUyByZWNvcmQgaW4gYnl0ZXM6ICovCisJdW5zaWduZWQgY2hhcgkJc2l6ZW9mX3JlY1syXTsKKworCS8qIFRoZSBudW1iZXIgb2YgcGVicyBjb3VudGVyIHJlc2V0IHZhbHVlcyBpbiB0aGUgRFMgc3RydWN0dXJlLiAqLworCXVuc2lnbmVkIGNoYXIJCW5yX2NvdW50ZXJfcmVzZXQ7CisKKwkvKiBDb250cm9sIGJpdC1tYXNrcyBpbmRleGVkIGJ5IGVudW0gZHNfZmVhdHVyZTogKi8KKwl1bnNpZ25lZCBsb25nCQljdGxbZHNmX2N0bF9tYXhdOwogfTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiwgZHNfY2ZnX2FycmF5KTsKK3N0YXRpYyBzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiBkc19jZmcgX19yZWFkX21vc3RseTsKIAotI2RlZmluZSBkc19jZmcgcGVyX2NwdShkc19jZmdfYXJyYXksIHNtcF9wcm9jZXNzb3JfaWQoKSkKIAotI2RlZmluZSBNQVhfU0laRU9GX0RTICgxMiAqIDgpCS8qIG1heGltYWwgc2l6ZSBvZiBhIERTIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgTUFYX1NJWkVPRl9CVFMgKDMgKiA4KQkvKiBtYXhpbWFsIHNpemUgb2YgYSBCVFMgcmVjb3JkICovCi0jZGVmaW5lIERTX0FMSUdOTUVOVCAoMSA8PCAzKQkvKiBCVFMgYW5kIFBFQlMgYnVmZmVyIGFsaWdubWVudCAqLworLyogTWF4aW1hbCBzaXplIG9mIGEgRFMgY29uZmlndXJhdGlvbjogKi8KKyNkZWZpbmUgTUFYX1NJWkVPRl9EUwkJMHg4MAogCi0jZGVmaW5lIEJUU19DT05UUk9MIFwKLSAoZHNfY2ZnLmN0bFtkc2ZfYnRzXSB8IGRzX2NmZy5jdGxbZHNmX2J0c19rZXJuZWxdIHwgZHNfY2ZnLmN0bFtkc2ZfYnRzX3VzZXJdIHxcCi0gIGRzX2NmZy5jdGxbZHNmX2J0c19vdmVyZmxvd10pCisvKiBNYXhpbWFsIHNpemUgb2YgYSBCVFMgcmVjb3JkOiAqLworI2RlZmluZSBNQVhfU0laRU9GX0JUUwkJKDMgKiA4KQogCisvKiBCVFMgYW5kIFBFQlMgYnVmZmVyIGFsaWdubWVudDogKi8KKyNkZWZpbmUgRFNfQUxJR05NRU5UCQkoMSA8PCAzKQorCisvKiBOdW1iZXIgb2YgYnVmZmVyIHBvaW50ZXJzIGluIERTOiAqLworI2RlZmluZSBOVU1fRFNfUFRSX0ZJRUxEUwk4CisKKy8qIFNpemUgb2YgYSBwZWJzIHJlc2V0IHZhbHVlIGluIERTOiAqLworI2RlZmluZSBQRUJTX1JFU0VUX0ZJRUxEX1NJWkUJOAorCisvKiBNYXNrIG9mIGNvbnRyb2wgYml0cyBpbiB0aGUgRFMgTVNSIHJlZ2lzdGVyOiAqLworI2RlZmluZSBCVFNfQ09OVFJPTAkJCQkgIFwKKwkoIGRzX2NmZy5jdGxbZHNmX2J0c10JCQl8IFwKKwkgIGRzX2NmZy5jdGxbZHNmX2J0c19rZXJuZWxdCQl8IFwKKwkgIGRzX2NmZy5jdGxbZHNmX2J0c191c2VyXQkJfCBcCisJICBkc19jZmcuY3RsW2RzZl9idHNfb3ZlcmZsb3ddICkKIAogLyoKICAqIEEgQlRTIG9yIFBFQlMgdHJhY2VyLgpAQCAtNjYsMjkgKzgyLDM2IEBACiAgKiB0byBpZGVudGlmeSB0cmFjZXJzLgogICovCiBzdHJ1Y3QgZHNfdHJhY2VyIHsKLQkvKiB0aGUgRFMgY29udGV4dCAocGFydGlhbGx5KSBvd25lZCBieSB0aGlzIHRyYWNlciAqLwotCXN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0OwotCS8qIHRoZSBidWZmZXIgcHJvdmlkZWQgb24gZHNfcmVxdWVzdCgpIGFuZCBpdHMgc2l6ZSBpbiBieXRlcyAqLwotCXZvaWQgKmJ1ZmZlcjsKLQlzaXplX3Qgc2l6ZTsKKwkvKiBUaGUgRFMgY29udGV4dCAocGFydGlhbGx5KSBvd25lZCBieSB0aGlzIHRyYWNlci4gKi8KKwlzdHJ1Y3QgZHNfY29udGV4dAkqY29udGV4dDsKKwkvKiBUaGUgYnVmZmVyIHByb3ZpZGVkIG9uIGRzX3JlcXVlc3QoKSBhbmQgaXRzIHNpemUgaW4gYnl0ZXMuICovCisJdm9pZAkJCSpidWZmZXI7CisJc2l6ZV90CQkJc2l6ZTsKIH07CiAKIHN0cnVjdCBidHNfdHJhY2VyIHsKLQkvKiB0aGUgY29tbW9uIERTIHBhcnQgKi8KLQlzdHJ1Y3QgZHNfdHJhY2VyIGRzOwotCS8qIHRoZSB0cmFjZSBpbmNsdWRpbmcgdGhlIERTIGNvbmZpZ3VyYXRpb24gKi8KLQlzdHJ1Y3QgYnRzX3RyYWNlIHRyYWNlOwotCS8qIGJ1ZmZlciBvdmVyZmxvdyBub3RpZmljYXRpb24gZnVuY3Rpb24gKi8KLQlidHNfb3ZmbF9jYWxsYmFja190IG92Zmw7CisJLyogVGhlIGNvbW1vbiBEUyBwYXJ0OiAqLworCXN0cnVjdCBkc190cmFjZXIJZHM7CisKKwkvKiBUaGUgdHJhY2UgaW5jbHVkaW5nIHRoZSBEUyBjb25maWd1cmF0aW9uOiAqLworCXN0cnVjdCBidHNfdHJhY2UJdHJhY2U7CisKKwkvKiBCdWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGZ1bmN0aW9uOiAqLworCWJ0c19vdmZsX2NhbGxiYWNrX3QJb3ZmbDsKKworCS8qIEFjdGl2ZSBmbGFncyBhZmZlY3RpbmcgdHJhY2UgY29sbGVjdGlvbi4gKi8KKwl1bnNpZ25lZCBpbnQJCWZsYWdzOwogfTsKIAogc3RydWN0IHBlYnNfdHJhY2VyIHsKLQkvKiB0aGUgY29tbW9uIERTIHBhcnQgKi8KLQlzdHJ1Y3QgZHNfdHJhY2VyIGRzOwotCS8qIHRoZSB0cmFjZSBpbmNsdWRpbmcgdGhlIERTIGNvbmZpZ3VyYXRpb24gKi8KLQlzdHJ1Y3QgcGVic190cmFjZSB0cmFjZTsKLQkvKiBidWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGZ1bmN0aW9uICovCi0JcGVic19vdmZsX2NhbGxiYWNrX3Qgb3ZmbDsKKwkvKiBUaGUgY29tbW9uIERTIHBhcnQ6ICovCisJc3RydWN0IGRzX3RyYWNlcglkczsKKworCS8qIFRoZSB0cmFjZSBpbmNsdWRpbmcgdGhlIERTIGNvbmZpZ3VyYXRpb246ICovCisJc3RydWN0IHBlYnNfdHJhY2UJdHJhY2U7CisKKwkvKiBCdWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGZ1bmN0aW9uOiAqLworCXBlYnNfb3ZmbF9jYWxsYmFja190CW92Zmw7CiB9OwogCiAvKgpAQCAtOTcsNiArMTIwLDcgQEAKICAqCiAgKiBUaGUgRFMgY29uZmlndXJhdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkczsgZGlmZmVyZW50CiAgKiBhcmNoaXRldHVyZXMgdmFyeSBpbiB0aGUgc2l6ZSBvZiB0aG9zZSBmaWVsZHMuCisgKgogICogLSBkb3VibGUtd29yZCBhbGlnbmVkIGJhc2UgbGluZWFyIGFkZHJlc3Mgb2YgdGhlIEJUUyBidWZmZXIKICAqIC0gd3JpdGUgcG9pbnRlciBpbnRvIHRoZSBCVFMgYnVmZmVyCiAgKiAtIGVuZCBsaW5lYXIgYWRkcmVzcyBvZiB0aGUgQlRTIGJ1ZmZlciAob25lIGJ5dGUgYmV5b25kIHRoZSBlbmQgb2YKQEAgLTEzNSwyMSArMTU5LDIyIEBACiB9OwogCiBlbnVtIGRzX3F1YWxpZmllciB7Ci0JZHNfYnRzICA9IDAsCisJZHNfYnRzID0gMCwKIAlkc19wZWJzCiB9OwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZHNfZ2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2UsCi0JCQkJICAgZW51bSBkc19xdWFsaWZpZXIgcXVhbCwgZW51bSBkc19maWVsZCBmaWVsZCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworZHNfZ2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2UsIGVudW0gZHNfcXVhbGlmaWVyIHF1YWwsIGVudW0gZHNfZmllbGQgZmllbGQpCiB7Ci0JYmFzZSArPSAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIChmaWVsZCArICg0ICogcXVhbCkpKTsKKwliYXNlICs9IChkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCAqIChmaWVsZCArICg0ICogcXVhbCkpKTsKIAlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopYmFzZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRzX3NldCh1bnNpZ25lZCBjaGFyICpiYXNlLCBlbnVtIGRzX3F1YWxpZmllciBxdWFsLAotCQkJICBlbnVtIGRzX2ZpZWxkIGZpZWxkLCB1bnNpZ25lZCBsb25nIHZhbHVlKQorc3RhdGljIGlubGluZSB2b2lkCitkc19zZXQodW5zaWduZWQgY2hhciAqYmFzZSwgZW51bSBkc19xdWFsaWZpZXIgcXVhbCwgZW51bSBkc19maWVsZCBmaWVsZCwKKyAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotCWJhc2UgKz0gKGRzX2NmZy5zaXplb2ZfZmllbGQgKiAoZmllbGQgKyAoNCAqIHF1YWwpKSk7CisJYmFzZSArPSAoZHNfY2ZnLnNpemVvZl9wdHJfZmllbGQgKiAoZmllbGQgKyAoNCAqIHF1YWwpKSk7CiAJKCoodW5zaWduZWQgbG9uZyAqKWJhc2UpID0gdmFsdWU7CiB9CiAKQEAgLTE1OSw3ICsxODQsNiBAQAogICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRzX2xvY2spOwogCi0KIC8qCiAgKiBXZSBlaXRoZXIgc3VwcG9ydCAoc3lzdGVtLXdpZGUpIHBlci1jcHUgb3IgcGVyLXRocmVhZCBhbGxvY2F0aW9uLgogICogV2UgZGlzdGluZ3Vpc2ggdGhlIHR3byBiYXNlZCBvbiB0aGUgdGFza19zdHJ1Y3QgcG9pbnRlciwgd2hlcmUgYQpAQCAtMTc4LDEyICsyMDIsMjggQEAKICAqLwogc3RhdGljIGF0b21pY190IHRyYWNlcnMgPSBBVE9NSUNfSU5JVCgwKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGdldF90cmFjZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorc3RhdGljIGlubGluZSBpbnQgZ2V0X3RyYWNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JaWYgKHRhc2spCisJaW50IGVycm9yOworCisJc3Bpbl9sb2NrX2lycSgmZHNfbG9jayk7CisKKwlpZiAodGFzaykgeworCQllcnJvciA9IC1FUEVSTTsKKwkJaWYgKGF0b21pY19yZWFkKCZ0cmFjZXJzKSA8IDApCisJCQlnb3RvIG91dDsKIAkJYXRvbWljX2luYygmdHJhY2Vycyk7Ci0JZWxzZQorCX0gZWxzZSB7CisJCWVycm9yID0gLUVQRVJNOworCQlpZiAoYXRvbWljX3JlYWQoJnRyYWNlcnMpID4gMCkKKwkJCWdvdG8gb3V0OwogCQlhdG9taWNfZGVjKCZ0cmFjZXJzKTsKKwl9CisKKwllcnJvciA9IDA7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZkc19sb2NrKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdHJhY2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTE5NCwxNCArMjM0LDYgQEAKIAkJYXRvbWljX2luYygmdHJhY2Vycyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3RyYWNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0JcmV0dXJuIHRhc2sgPwotCQkoYXRvbWljX3JlYWQoJnRyYWNlcnMpID49IDApIDoKLQkJKGF0b21pY19yZWFkKCZ0cmFjZXJzKSA8PSAwKTsKLX0KLQotCiAvKgogICogVGhlIERTIGNvbnRleHQgaXMgZWl0aGVyIGF0dGFjaGVkIHRvIGEgdGhyZWFkIG9yIHRvIGEgY3B1OgogICogLSBpbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSB0aHJlYWRfc3RydWN0IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUKQEAgLTIxMyw2MSArMjQ1LDU4IEBACiAgKiBkZWFsbG9jYXRlZCB3aGVuIHRoZSBsYXN0IHVzZXIgcHV0cyB0aGUgY29udGV4dC4KICAqLwogc3RydWN0IGRzX2NvbnRleHQgewotCS8qIHBvaW50ZXIgdG8gdGhlIERTIGNvbmZpZ3VyYXRpb247IGdvZXMgaW50byBNU1JfSUEzMl9EU19BUkVBICovCi0JdW5zaWduZWQgY2hhciBkc1tNQVhfU0laRU9GX0RTXTsKLQkvKiB0aGUgb3duZXIgb2YgdGhlIEJUUyBhbmQgUEVCUyBjb25maWd1cmF0aW9uLCByZXNwZWN0aXZlbHkgKi8KLQlzdHJ1Y3QgYnRzX3RyYWNlciAqYnRzX21hc3RlcjsKLQlzdHJ1Y3QgcGVic190cmFjZXIgKnBlYnNfbWFzdGVyOwotCS8qIHVzZSBjb3VudCAqLwotCXVuc2lnbmVkIGxvbmcgY291bnQ7Ci0JLyogYSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGxvY2F0aW9uIGluc2lkZSB0aGUgdGhyZWFkX3N0cnVjdAotCSAqIG9yIHRoZSBwZXJfY3B1IGNvbnRleHQgYXJyYXkgKi8KLQlzdHJ1Y3QgZHNfY29udGV4dCAqKnRoaXM7Ci0JLyogYSBwb2ludGVyIHRvIHRoZSB0YXNrIG93bmluZyB0aGlzIGNvbnRleHQsIG9yIE5VTEwsIGlmIHRoZQotCSAqIGNvbnRleHQgaXMgb3duZWQgYnkgYSBjcHUgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJLyogVGhlIERTIGNvbmZpZ3VyYXRpb247IGdvZXMgaW50byBNU1JfSUEzMl9EU19BUkVBOiAqLworCXVuc2lnbmVkIGNoYXIJCWRzW01BWF9TSVpFT0ZfRFNdOworCisJLyogVGhlIG93bmVyIG9mIHRoZSBCVFMgYW5kIFBFQlMgY29uZmlndXJhdGlvbiwgcmVzcGVjdGl2ZWx5OiAqLworCXN0cnVjdCBidHNfdHJhY2VyCSpidHNfbWFzdGVyOworCXN0cnVjdCBwZWJzX3RyYWNlcgkqcGVic19tYXN0ZXI7CisKKwkvKiBVc2UgY291bnQ6ICovCisJdW5zaWduZWQgbG9uZwkJY291bnQ7CisKKwkvKiBQb2ludGVyIHRvIHRoZSBjb250ZXh0IHBvaW50ZXIgZmllbGQ6ICovCisJc3RydWN0IGRzX2NvbnRleHQJKip0aGlzOworCisJLyogVGhlIHRyYWNlZCB0YXNrOyBOVUxMIGZvciBjcHUgdHJhY2luZzogKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CisKKwkvKiBUaGUgdHJhY2VkIGNwdTsgb25seSB2YWxpZCBpZiB0YXNrIGlzIE5VTEw6ICovCisJaW50CQkJY3B1OwogfTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBkc19jb250ZXh0ICosIHN5c3RlbV9jb250ZXh0X2FycmF5KTsKLQotI2RlZmluZSBzeXN0ZW1fY29udGV4dCBwZXJfY3B1KHN5c3RlbV9jb250ZXh0X2FycmF5LCBzbXBfcHJvY2Vzc29yX2lkKCkpCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGRzX2NvbnRleHQgKiwgY3B1X2NvbnRleHQpOwogCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRzX2NvbnRleHQgKmRzX2dldF9jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyBzdHJ1Y3QgZHNfY29udGV4dCAqZHNfZ2V0X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQogewogCXN0cnVjdCBkc19jb250ZXh0ICoqcF9jb250ZXh0ID0KLQkJKHRhc2sgPyAmdGFzay0+dGhyZWFkLmRzX2N0eCA6ICZzeXN0ZW1fY29udGV4dCk7CisJCSh0YXNrID8gJnRhc2stPnRocmVhZC5kc19jdHggOiAmcGVyX2NwdShjcHVfY29udGV4dCwgY3B1KSk7CiAJc3RydWN0IGRzX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOwogCXN0cnVjdCBkc19jb250ZXh0ICpuZXdfY29udGV4dCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBpcnE7CiAKIAkvKiBDaGFuY2VzIGFyZSBzbWFsbCB0aGF0IHdlIGFscmVhZHkgaGF2ZSBhIGNvbnRleHQuICovCiAJbmV3X2NvbnRleHQgPSBremFsbG9jKHNpemVvZigqbmV3X2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19jb250ZXh0KQogCQlyZXR1cm4gTlVMTDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBpcnEpOworCXNwaW5fbG9ja19pcnEoJmRzX2xvY2spOwogCiAJY29udGV4dCA9ICpwX2NvbnRleHQ7Ci0JaWYgKCFjb250ZXh0KSB7CisJaWYgKGxpa2VseSghY29udGV4dCkpIHsKIAkJY29udGV4dCA9IG5ld19jb250ZXh0OwogCiAJCWNvbnRleHQtPnRoaXMgPSBwX2NvbnRleHQ7CiAJCWNvbnRleHQtPnRhc2sgPSB0YXNrOworCQljb250ZXh0LT5jcHUgPSBjcHU7CiAJCWNvbnRleHQtPmNvdW50ID0gMDsKIAotCQlpZiAodGFzaykKLQkJCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0RTX0FSRUFfTVNSKTsKLQotCQlpZiAoIXRhc2sgfHwgKHRhc2sgPT0gY3VycmVudCkpCi0JCQl3cm1zcmwoTVNSX0lBMzJfRFNfQVJFQSwgKHVuc2lnbmVkIGxvbmcpY29udGV4dC0+ZHMpOwotCiAJCSpwX2NvbnRleHQgPSBjb250ZXh0OwogCX0KIAogCWNvbnRleHQtPmNvdW50Kys7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBpcnEpOworCXNwaW5fdW5sb2NrX2lycSgmZHNfbG9jayk7CiAKIAlpZiAoY29udGV4dCAhPSBuZXdfY29udGV4dCkKIAkJa2ZyZWUobmV3X2NvbnRleHQpOwpAQCAtMjc1LDggKzMwNCw5IEBACiAJcmV0dXJuIGNvbnRleHQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkc19wdXRfY29udGV4dChzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dCkKK3N0YXRpYyB2b2lkIGRzX3B1dF9jb250ZXh0KHN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0KQogeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAl1bnNpZ25lZCBsb25nIGlycTsKIAogCWlmICghY29udGV4dCkKQEAgLTI5MSwxNyArMzIxLDU1IEBACiAKIAkqKGNvbnRleHQtPnRoaXMpID0gTlVMTDsKIAotCWlmIChjb250ZXh0LT50YXNrKQotCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY29udGV4dC0+dGFzaywgVElGX0RTX0FSRUFfTVNSKTsKKwl0YXNrID0gY29udGV4dC0+dGFzazsKIAotCWlmICghY29udGV4dC0+dGFzayB8fCAoY29udGV4dC0+dGFzayA9PSBjdXJyZW50KSkKLQkJd3Jtc3JsKE1TUl9JQTMyX0RTX0FSRUEsIDApOworCWlmICh0YXNrKQorCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0RTX0FSRUFfTVNSKTsKKworCS8qCisJICogV2UgbGVhdmUgdGhlIChub3cgZGFuZ2xpbmcpIHBvaW50ZXIgdG8gdGhlIERTIGNvbmZpZ3VyYXRpb24gaW4KKwkgKiB0aGUgRFNfQVJFQSBtc3IuIFRoaXMgaXMgYXMgZ29vZCBvciBhcyBiYWQgYXMgcmVwbGFjaW5nIGl0IHdpdGgKKwkgKiBOVUxMIC0gdGhlIGhhcmR3YXJlIHdvdWxkIGNyYXNoIGlmIHdlIGVuYWJsZWQgdHJhY2luZy4KKwkgKgorCSAqIFRoaXMgc2F2ZXMgdXMgc29tZSBwcm9ibGVtcyB3aXRoIGhhdmluZyB0byB3cml0ZSBhbiBtc3Igb24gYQorCSAqIGRpZmZlcmVudCBjcHUgd2hpbGUgcHJldmVudGluZyBvdGhlcnMgZnJvbSBkb2luZyB0aGUgc2FtZSBmb3IgdGhlCisJICogbmV4dCBjb250ZXh0IGZvciB0aGF0IHNhbWUgY3B1LgorCSAqLwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgaXJxKTsKIAorCS8qIFRoZSBjb250ZXh0IG1pZ2h0IHN0aWxsIGJlIGluIHVzZSBmb3IgY29udGV4dCBzd2l0Y2hpbmcuICovCisJaWYgKHRhc2sgJiYgKHRhc2sgIT0gY3VycmVudCkpCisJCXdhaXRfdGFza19jb250ZXh0X3N3aXRjaCh0YXNrKTsKKwogCWtmcmVlKGNvbnRleHQpOwogfQogCitzdGF0aWMgdm9pZCBkc19pbnN0YWxsX2RzX2FyZWEoc3RydWN0IGRzX2NvbnRleHQgKmNvbnRleHQpCit7CisJdW5zaWduZWQgbG9uZyBkczsKKworCWRzID0gKHVuc2lnbmVkIGxvbmcpY29udGV4dC0+ZHM7CisKKwkvKgorCSAqIFRoZXJlIGlzIGEgcmFjZSBiZXR3ZWVuIHRoZSBidHMgbWFzdGVyIGFuZCB0aGUgcGVicyBtYXN0ZXIuCisJICoKKwkgKiBUaGUgdGhyZWFkL2NwdSBhY2Nlc3MgaXMgc3luY2hyb25pemVkIHZpYSBnZXQvcHV0X2NwdSgpIGZvcgorCSAqIHRhc2sgdHJhY2luZyBhbmQgdmlhIHdybXNyX29uX2NwdSBmb3IgY3B1IHRyYWNpbmcuCisJICoKKwkgKiBJZiBidHMgYW5kIHBlYnMgYXJlIGNvbGxlY3RlZCBmb3IgdGhlIHNhbWUgdGFzayBvciBzYW1lIGNwdSwKKwkgKiB0aGUgc2FtZSBjb25maXVyYXRpb24gaXMgd3JpdHRlbiB0d2ljZS4KKwkgKi8KKwlpZiAoY29udGV4dC0+dGFzaykgeworCQlnZXRfY3B1KCk7CisJCWlmIChjb250ZXh0LT50YXNrID09IGN1cnJlbnQpCisJCQl3cm1zcmwoTVNSX0lBMzJfRFNfQVJFQSwgZHMpOworCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNvbnRleHQtPnRhc2ssIFRJRl9EU19BUkVBX01TUik7CisJCXB1dF9jcHUoKTsKKwl9IGVsc2UKKwkJd3Jtc3Jfb25fY3B1KGNvbnRleHQtPmNwdSwgTVNSX0lBMzJfRFNfQVJFQSwKKwkJCSAgICAgKHUzMikoKHU2NClkcyksICh1MzIpKCh1NjQpZHMgPj4gMzIpKTsKK30KIAogLyoKICAqIENhbGwgdGhlIHRyYWNlcidzIGNhbGxiYWNrIG9uIGEgYnVmZmVyIG92ZXJmbG93LgpAQCAtMzMyLDkgKzQwMCw5IEBACiAgKiBUaGUgcmVtYWluZGVyIG9mIGFueSBwYXJ0aWFsbHkgd3JpdHRlbiByZWNvcmQgaXMgemVyb2VkIG91dC4KICAqCiAgKiBjb250ZXh0OiB0aGUgRFMgY29udGV4dAotICogcXVhbDogdGhlIGJ1ZmZlciB0eXBlCi0gKiByZWNvcmQ6IHRoZSBkYXRhIHRvIHdyaXRlCi0gKiBzaXplOiB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICogcXVhbDogICAgdGhlIGJ1ZmZlciB0eXBlCisgKiByZWNvcmQ6ICB0aGUgZGF0YSB0byB3cml0ZQorICogc2l6ZTogICAgdGhlIHNpemUgb2YgdGhlIGRhdGEKICAqLwogc3RhdGljIGludCBkc193cml0ZShzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dCwgZW51bSBkc19xdWFsaWZpZXIgcXVhbCwKIAkJICAgIGNvbnN0IHZvaWQgKnJlY29yZCwgc2l6ZV90IHNpemUpCkBAIC0zNDksMTQgKzQxNywxNCBAQAogCQl1bnNpZ25lZCBsb25nIHdyaXRlX3NpemUsIGFkal93cml0ZV9zaXplOwogCiAJCS8qCi0JCSAqIHdyaXRlIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dCBwcm9kdWNpbmcgYW4KKwkJICogV3JpdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aXRob3V0IHByb2R1Y2luZyBhbgogCQkgKiBvdmVyZmxvdyBpbnRlcnJ1cHQuCiAJCSAqCi0JCSAqIGludGVycnVwdF90aHJlc2hvbGQgbXVzdCBlaXRoZXIgYmUKKwkJICogSW50ZXJydXB0X3RocmVzaG9sZCBtdXN0IGVpdGhlciBiZQogCQkgKiAtIGJpZ2dlciB0aGFuIGFic29sdXRlX21heGltdW0gb3IKIAkJICogLSBwb2ludCB0byBhIHJlY29yZCBiZXR3ZWVuIGJ1ZmZlcl9iYXNlIGFuZCBhYnNvbHV0ZV9tYXhpbXVtCiAJCSAqCi0JCSAqIGluZGV4IHBvaW50cyB0byBhIHZhbGlkIHJlY29yZC4KKwkJICogSW5kZXggcG9pbnRzIHRvIGEgdmFsaWQgcmVjb3JkLgogCQkgKi8KIAkJYmFzZSAgID0gZHNfZ2V0KGNvbnRleHQtPmRzLCBxdWFsLCBkc19idWZmZXJfYmFzZSk7CiAJCWluZGV4ICA9IGRzX2dldChjb250ZXh0LT5kcywgcXVhbCwgZHNfaW5kZXgpOwpAQCAtMzY1LDggKzQzMywxMCBAQAogCiAJCXdyaXRlX2VuZCA9IG1pbihlbmQsIGludF90aCk7CiAKLQkJLyogaWYgd2UgYXJlIGFscmVhZHkgYmV5b25kIHRoZSBpbnRlcnJ1cHQgdGhyZXNob2xkLAotCQkgKiB3ZSBmaWxsIHRoZSBlbnRpcmUgYnVmZmVyICovCisJCS8qCisJCSAqIElmIHdlIGFyZSBhbHJlYWR5IGJleW9uZCB0aGUgaW50ZXJydXB0IHRocmVzaG9sZCwKKwkJICogd2UgZmlsbCB0aGUgZW50aXJlIGJ1ZmZlci4KKwkJICovCiAJCWlmICh3cml0ZV9lbmQgPD0gaW5kZXgpCiAJCQl3cml0ZV9lbmQgPSBlbmQ7CiAKQEAgLTM4Myw3ICs0NTMsNyBAQAogCQlhZGpfd3JpdGVfc2l6ZSA9IHdyaXRlX3NpemUgLyBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXTsKIAkJYWRqX3dyaXRlX3NpemUgKj0gZHNfY2ZnLnNpemVvZl9yZWNbcXVhbF07CiAKLQkJLyogemVybyBvdXQgdHJhaWxpbmcgYnl0ZXMgKi8KKwkJLyogWmVybyBvdXQgdHJhaWxpbmcgYnl0ZXMuICovCiAJCW1lbXNldCgoY2hhciAqKWluZGV4ICsgd3JpdGVfc2l6ZSwgMCwKIAkJICAgICAgIGFkal93cml0ZV9zaXplIC0gd3JpdGVfc2l6ZSk7CiAJCWluZGV4ICs9IGFkal93cml0ZV9zaXplOwpAQCAtNDEwLDcgKzQ4MCw3IEBACiAgKiBMYXRlciBhcmNoaXRlY3R1cmVzIHVzZSA2NGJpdCBwb2ludGVycyB0aHJvdWdob3V0LCB3aGVyZWFzIGVhcmxpZXIKICAqIGFyY2hpdGVjdHVyZXMgdXNlIDMyYml0IHBvaW50ZXJzIGluIDMyYml0IG1vZGUuCiAgKgotICogV2UgY29tcHV0ZSB0aGUgYmFzZSBhZGRyZXNzIGZvciB0aGUgZmlyc3QgOCBmaWVsZHMgYmFzZWQgb246CisgKiBXZSBjb21wdXRlIHRoZSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBmaWVsZHMgYmFzZWQgb246CiAgKiAtIHRoZSBmaWVsZCBzaXplIHN0b3JlZCBpbiB0aGUgRFMgY29uZmlndXJhdGlvbgogICogLSB0aGUgcmVsYXRpdmUgZmllbGQgcG9zaXRpb24KICAqCkBAIC00MzEsMjMgKzUwMSwyMyBAQAogCWJ0c190bywKIAlidHNfZmxhZ3MsCiAKLQlidHNfcXVhbCA9IGJ0c19mcm9tLAotCWJ0c19qaWZmaWVzID0gYnRzX3RvLAotCWJ0c19waWQgPSBidHNfZmxhZ3MsCisJYnRzX3F1YWwJCT0gYnRzX2Zyb20sCisJYnRzX2Nsb2NrCQk9IGJ0c190bywKKwlidHNfcGlkCQkJPSBidHNfZmxhZ3MsCiAKLQlidHNfcXVhbF9tYXNrID0gKGJ0c19xdWFsX21heCAtIDEpLAotCWJ0c19lc2NhcGUgPSAoKHVuc2lnbmVkIGxvbmcpLTEgJiB+YnRzX3F1YWxfbWFzaykKKwlidHNfcXVhbF9tYXNrCQk9IChidHNfcXVhbF9tYXggLSAxKSwKKwlidHNfZXNjYXBlCQk9ICgodW5zaWduZWQgbG9uZyktMSAmIH5idHNfcXVhbF9tYXNrKQogfTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJ0c19nZXQoY29uc3QgY2hhciAqYmFzZSwgZW51bSBidHNfZmllbGQgZmllbGQpCiB7Ci0JYmFzZSArPSAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIGZpZWxkKTsKKwliYXNlICs9IChkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCAqIGZpZWxkKTsKIAlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopYmFzZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGJ0c19zZXQoY2hhciAqYmFzZSwgZW51bSBidHNfZmllbGQgZmllbGQsIHVuc2lnbmVkIGxvbmcgdmFsKQogewotCWJhc2UgKz0gKGRzX2NmZy5zaXplb2ZfZmllbGQgKiBmaWVsZCk7OworCWJhc2UgKz0gKGRzX2NmZy5zaXplb2ZfcHRyX2ZpZWxkICogZmllbGQpOzsKIAkoKih1bnNpZ25lZCBsb25nICopYmFzZSkgPSB2YWw7CiB9CiAKQEAgLTQ2Myw4ICs1MzMsOCBAQAogICoKICAqIHJldHVybjogYnl0ZXMgcmVhZC93cml0dGVuIG9uIHN1Y2Nlc3M7IC1FZXJybm8sIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW50IGJ0c19yZWFkKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIsIGNvbnN0IHZvaWQgKmF0LAotCQkgICAgc3RydWN0IGJ0c19zdHJ1Y3QgKm91dCkKK3N0YXRpYyBpbnQKK2J0c19yZWFkKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIsIGNvbnN0IHZvaWQgKmF0LCBzdHJ1Y3QgYnRzX3N0cnVjdCAqb3V0KQogewogCWlmICghdHJhY2VyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ3OCw4ICs1NDgsOCBAQAogCW1lbXNldChvdXQsIDAsIHNpemVvZigqb3V0KSk7CiAJaWYgKChidHNfZ2V0KGF0LCBidHNfcXVhbCkgJiB+YnRzX3F1YWxfbWFzaykgPT0gYnRzX2VzY2FwZSkgewogCQlvdXQtPnF1YWxpZmllciA9IChidHNfZ2V0KGF0LCBidHNfcXVhbCkgJiBidHNfcXVhbF9tYXNrKTsKLQkJb3V0LT52YXJpYW50LnRpbWVzdGFtcC5qaWZmaWVzID0gYnRzX2dldChhdCwgYnRzX2ppZmZpZXMpOwotCQlvdXQtPnZhcmlhbnQudGltZXN0YW1wLnBpZCA9IGJ0c19nZXQoYXQsIGJ0c19waWQpOworCQlvdXQtPnZhcmlhbnQuZXZlbnQuY2xvY2sgPSBidHNfZ2V0KGF0LCBidHNfY2xvY2spOworCQlvdXQtPnZhcmlhbnQuZXZlbnQucGlkID0gYnRzX2dldChhdCwgYnRzX3BpZCk7CiAJfSBlbHNlIHsKIAkJb3V0LT5xdWFsaWZpZXIgPSBidHNfYnJhbmNoOwogCQlvdXQtPnZhcmlhbnQubGJyLmZyb20gPSBidHNfZ2V0KGF0LCBidHNfZnJvbSk7CkBAIC01MTYsOCArNTg2LDggQEAKIAljYXNlIGJ0c190YXNrX2Fycml2ZXM6CiAJY2FzZSBidHNfdGFza19kZXBhcnRzOgogCQlidHNfc2V0KHJhdywgYnRzX3F1YWwsIChidHNfZXNjYXBlIHwgaW4tPnF1YWxpZmllcikpOwotCQlidHNfc2V0KHJhdywgYnRzX2ppZmZpZXMsIGluLT52YXJpYW50LnRpbWVzdGFtcC5qaWZmaWVzKTsKLQkJYnRzX3NldChyYXcsIGJ0c19waWQsIGluLT52YXJpYW50LnRpbWVzdGFtcC5waWQpOworCQlidHNfc2V0KHJhdywgYnRzX2Nsb2NrLCBpbi0+dmFyaWFudC5ldmVudC5jbG9jayk7CisJCWJ0c19zZXQocmF3LCBidHNfcGlkLCBpbi0+dmFyaWFudC5ldmVudC5waWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU1NSw3ICs2MjUsOCBAQAogCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKIAl1bnNpZ25lZCBsb25nIGJ1ZmZlciwgYWRqOwogCi0JLyogYWRqdXN0IHRoZSBidWZmZXIgYWRkcmVzcyBhbmQgc2l6ZSB0byBtZWV0IGFsaWdubWVudAorCS8qCisJICogQWRqdXN0IHRoZSBidWZmZXIgYWRkcmVzcyBhbmQgc2l6ZSB0byBtZWV0IGFsaWdubWVudAogCSAqIGNvbnN0cmFpbnRzOgogCSAqIC0gYnVmZmVyIGlzIGRvdWJsZS13b3JkIGFsaWduZWQKIAkgKiAtIHNpemUgaXMgbXVsdGlwbGUgb2YgcmVjb3JkIHNpemUKQEAgLTU3Nyw5ICs2NDgsMTEgQEAKIAl0cmFjZS0+YmVnaW4gPSAodm9pZCAqKWJ1ZmZlcjsKIAl0cmFjZS0+dG9wID0gdHJhY2UtPmJlZ2luOwogCXRyYWNlLT5lbmQgPSAodm9pZCAqKShidWZmZXIgKyBzaXplKTsKLQkvKiBUaGUgdmFsdWUgZm9yICdubyB0aHJlc2hvbGQnIGlzIC0xLCB3aGljaCB3aWxsIHNldCB0aGUKKwkvKgorCSAqIFRoZSB2YWx1ZSBmb3IgJ25vIHRocmVzaG9sZCcgaXMgLTEsIHdoaWNoIHdpbGwgc2V0IHRoZQogCSAqIHRocmVzaG9sZCBvdXRzaWRlIG9mIHRoZSBidWZmZXIsIGp1c3QgbGlrZSB3ZSB3YW50IGl0LgogCSAqLworCWl0aCAqPSBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXTsKIAl0cmFjZS0+aXRoID0gKHZvaWQgKikoYnVmZmVyICsgc2l6ZSAtIGl0aCk7CiAKIAl0cmFjZS0+ZmxhZ3MgPSBmbGFnczsKQEAgLTU4OCwxOCArNjYxLDI3IEBACiAKIHN0YXRpYyBpbnQgZHNfcmVxdWVzdChzdHJ1Y3QgZHNfdHJhY2VyICp0cmFjZXIsIHN0cnVjdCBkc190cmFjZSAqdHJhY2UsCiAJCSAgICAgIGVudW0gZHNfcXVhbGlmaWVyIHF1YWwsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJICAgICAgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsIHNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKQorCQkgICAgICBpbnQgY3B1LCB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHRoKQogewogCXN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0OwogCWludCBlcnJvcjsKKwlzaXplX3QgcmVxX3NpemU7CisKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmICghZHNfY2ZnLnNpemVvZl9yZWNbcXVhbF0pCisJCWdvdG8gb3V0OwogCiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmICghYmFzZSkKIAkJZ290byBvdXQ7CiAKLQkvKiB3ZSByZXF1aXJlIHNvbWUgc3BhY2UgdG8gZG8gYWxpZ25tZW50IGFkanVzdG1lbnRzIGJlbG93ICovCisJcmVxX3NpemUgPSBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXTsKKwkvKiBXZSBtaWdodCBuZWVkIHNwYWNlIGZvciBhbGlnbm1lbnQgYWRqdXN0bWVudHMuICovCisJaWYgKCFJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKWJhc2UsIERTX0FMSUdOTUVOVCkpCisJCXJlcV9zaXplICs9IERTX0FMSUdOTUVOVDsKKwogCWVycm9yID0gLUVJTlZBTDsKLQlpZiAoc2l6ZSA8IChEU19BTElHTk1FTlQgKyBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXSkpCisJaWYgKHNpemUgPCByZXFfc2l6ZSkKIAkJZ290byBvdXQ7CiAKIAlpZiAodGggIT0gKHNpemVfdCktMSkgewpAQCAtNjE0LDE4MiArNjk2LDMxOCBAQAogCXRyYWNlci0+c2l6ZSA9IHNpemU7CiAKIAllcnJvciA9IC1FTk9NRU07Ci0JY29udGV4dCA9IGRzX2dldF9jb250ZXh0KHRhc2spOworCWNvbnRleHQgPSBkc19nZXRfY29udGV4dCh0YXNrLCBjcHUpOwogCWlmICghY29udGV4dCkKIAkJZ290byBvdXQ7CiAJdHJhY2VyLT5jb250ZXh0ID0gY29udGV4dDsKIAotCWRzX2luaXRfZHNfdHJhY2UodHJhY2UsIHF1YWwsIGJhc2UsIHNpemUsIHRoLCBmbGFncyk7CisJLyoKKwkgKiBEZWZlciBhbnkgdHJhY2VyLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHdvcmsgZm9yIHRoZSBjb250ZXh0IHVudGlsCisJICogY29udGV4dCBvd25lcnNoaXAgaGFzIGJlZW4gY2xhcmlmaWVkLgorCSAqLwogCiAJZXJyb3IgPSAwOwogIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkJICB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKLQkJCQkgIGJ0c19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwgc2l6ZV90IHRoLAotCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjcHUsCisJCQkJCSB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJCQkJIGJ0c19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwgc2l6ZV90IHRoLAorCQkJCQkgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXI7Ci0JdW5zaWduZWQgbG9uZyBpcnE7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSAtRU9QTk9UU1VQUDsKLQlpZiAoIWRzX2NmZy5jdGxbZHNmX2J0c10pCi0JCWdvdG8gb3V0OwotCi0JLyogYnVmZmVyIG92ZXJmbG93IG5vdGlmaWNhdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkICovCisJLyogQnVmZmVyIG92ZXJmbG93IG5vdGlmaWNhdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkLiAqLwogCWVycm9yID0gLUVPUE5PVFNVUFA7CiAJaWYgKG92ZmwpCiAJCWdvdG8gb3V0OwogCisJZXJyb3IgPSBnZXRfdHJhY2VyKHRhc2spOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCiAJZXJyb3IgPSAtRU5PTUVNOwogCXRyYWNlciA9IGt6YWxsb2Moc2l6ZW9mKCp0cmFjZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYWNlcikKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3B1dF90cmFjZXI7CiAJdHJhY2VyLT5vdmZsID0gb3ZmbDsKIAorCS8qIERvIHNvbWUgbW9yZSBlcnJvciBjaGVja2luZyBhbmQgYWNxdWlyZSBhIHRyYWNpbmcgY29udGV4dC4gKi8KIAllcnJvciA9IGRzX3JlcXVlc3QoJnRyYWNlci0+ZHMsICZ0cmFjZXItPnRyYWNlLmRzLAotCQkJICAgZHNfYnRzLCB0YXNrLCBiYXNlLCBzaXplLCB0aCwgZmxhZ3MpOworCQkJICAgZHNfYnRzLCB0YXNrLCBjcHUsIGJhc2UsIHNpemUsIHRoKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dF90cmFjZXI7CiAKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBpcnEpOwotCi0JZXJyb3IgPSAtRVBFUk07Ci0JaWYgKCFjaGVja190cmFjZXIodGFzaykpCi0JCWdvdG8gb3V0X3VubG9jazsKLQlnZXRfdHJhY2VyKHRhc2spOworCS8qIENsYWltIHRoZSBidHMgcGFydCBvZiB0aGUgdHJhY2luZyBjb250ZXh0IHdlIGFjcXVpcmVkIGFib3ZlLiAqLworCXNwaW5fbG9ja19pcnEoJmRzX2xvY2spOwogCiAJZXJyb3IgPSAtRVBFUk07CiAJaWYgKHRyYWNlci0+ZHMuY29udGV4dC0+YnRzX21hc3RlcikKLQkJZ290byBvdXRfcHV0X3RyYWNlcjsKKwkJZ290byBvdXRfdW5sb2NrOwogCXRyYWNlci0+ZHMuY29udGV4dC0+YnRzX21hc3RlciA9IHRyYWNlcjsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGlycSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkc19sb2NrKTsKIAorCS8qCisJICogTm93IHRoYXQgd2Ugb3duIHRoZSBidHMgcGFydCBvZiB0aGUgY29udGV4dCwgbGV0J3MgY29tcGxldGUgdGhlCisJICogaW5pdGlhbGl6YXRpb24gZm9yIHRoYXQgcGFydC4KKwkgKi8KKwlkc19pbml0X2RzX3RyYWNlKCZ0cmFjZXItPnRyYWNlLmRzLCBkc19idHMsIGJhc2UsIHNpemUsIHRoLCBmbGFncyk7CisJZHNfd3JpdGVfY29uZmlnKHRyYWNlci0+ZHMuY29udGV4dCwgJnRyYWNlci0+dHJhY2UuZHMsIGRzX2J0cyk7CisJZHNfaW5zdGFsbF9kc19hcmVhKHRyYWNlci0+ZHMuY29udGV4dCk7CiAKIAl0cmFjZXItPnRyYWNlLnJlYWQgID0gYnRzX3JlYWQ7CiAJdHJhY2VyLT50cmFjZS53cml0ZSA9IGJ0c193cml0ZTsKIAotCWRzX3dyaXRlX2NvbmZpZyh0cmFjZXItPmRzLmNvbnRleHQsICZ0cmFjZXItPnRyYWNlLmRzLCBkc19idHMpOworCS8qIFN0YXJ0IHRyYWNpbmcuICovCiAJZHNfcmVzdW1lX2J0cyh0cmFjZXIpOwogCiAJcmV0dXJuIHRyYWNlcjsKIAotIG91dF9wdXRfdHJhY2VyOgotCXB1dF90cmFjZXIodGFzayk7CiAgb3V0X3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBpcnEpOworCXNwaW5fdW5sb2NrX2lycSgmZHNfbG9jayk7CiAJZHNfcHV0X2NvbnRleHQodHJhY2VyLT5kcy5jb250ZXh0KTsKICBvdXRfdHJhY2VyOgogCWtmcmVlKHRyYWNlcik7Cisgb3V0X3B1dF90cmFjZXI6CisJcHV0X3RyYWNlcih0YXNrKTsKICBvdXQ6CiAJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogfQogCi1zdHJ1Y3QgcGVic190cmFjZXIgKmRzX3JlcXVlc3RfcGVicyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkJICAgIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAotCQkJCSAgICBwZWJzX292ZmxfY2FsbGJhY2tfdCBvdmZsLCBzaXplX3QgdGgsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncykKK3N0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0c190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgICAgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGJ0c19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwKKwkJCQkgICAgICAgc2l6ZV90IHRoLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGRzX3JlcXVlc3RfYnRzKHRhc2ssIDAsIGJhc2UsIHNpemUsIG92ZmwsIHRoLCBmbGFncyk7Cit9CisKK3N0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0c19jcHUoaW50IGNwdSwgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgYnRzX292ZmxfY2FsbGJhY2tfdCBvdmZsLAorCQkJCSAgICAgIHNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBkc19yZXF1ZXN0X2J0cyhOVUxMLCBjcHUsIGJhc2UsIHNpemUsIG92ZmwsIHRoLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVic190cmFjZXIgKmRzX3JlcXVlc3RfcGVicyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjcHUsCisJCQkJCSAgIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAorCQkJCQkgICBwZWJzX292ZmxfY2FsbGJhY2tfdCBvdmZsLCBzaXplX3QgdGgsCisJCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcjsKLQl1bnNpZ25lZCBsb25nIGlycTsKIAlpbnQgZXJyb3I7CiAKLQkvKiBidWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwkvKiBCdWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuICovCiAJZXJyb3IgPSAtRU9QTk9UU1VQUDsKIAlpZiAob3ZmbCkKIAkJZ290byBvdXQ7CiAKKwllcnJvciA9IGdldF90cmFjZXIodGFzayk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKIAllcnJvciA9IC1FTk9NRU07CiAJdHJhY2VyID0ga3phbGxvYyhzaXplb2YoKnRyYWNlciksIEdGUF9LRVJORUwpOwogCWlmICghdHJhY2VyKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcHV0X3RyYWNlcjsKIAl0cmFjZXItPm92ZmwgPSBvdmZsOwogCisJLyogRG8gc29tZSBtb3JlIGVycm9yIGNoZWNraW5nIGFuZCBhY3F1aXJlIGEgdHJhY2luZyBjb250ZXh0LiAqLwogCWVycm9yID0gZHNfcmVxdWVzdCgmdHJhY2VyLT5kcywgJnRyYWNlci0+dHJhY2UuZHMsCi0JCQkgICBkc19wZWJzLCB0YXNrLCBiYXNlLCBzaXplLCB0aCwgZmxhZ3MpOworCQkJICAgZHNfcGVicywgdGFzaywgY3B1LCBiYXNlLCBzaXplLCB0aCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXRfdHJhY2VyOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGlycSk7Ci0KLQllcnJvciA9IC1FUEVSTTsKLQlpZiAoIWNoZWNrX3RyYWNlcih0YXNrKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCWdldF90cmFjZXIodGFzayk7CisJLyogQ2xhaW0gdGhlIHBlYnMgcGFydCBvZiB0aGUgdHJhY2luZyBjb250ZXh0IHdlIGFjcXVpcmVkIGFib3ZlLiAqLworCXNwaW5fbG9ja19pcnEoJmRzX2xvY2spOwogCiAJZXJyb3IgPSAtRVBFUk07CiAJaWYgKHRyYWNlci0+ZHMuY29udGV4dC0+cGVic19tYXN0ZXIpCi0JCWdvdG8gb3V0X3B1dF90cmFjZXI7CisJCWdvdG8gb3V0X3VubG9jazsKIAl0cmFjZXItPmRzLmNvbnRleHQtPnBlYnNfbWFzdGVyID0gdHJhY2VyOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgaXJxKTsKKwlzcGluX3VubG9ja19pcnEoJmRzX2xvY2spOwogCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBvd24gdGhlIHBlYnMgcGFydCBvZiB0aGUgY29udGV4dCwgbGV0J3MgY29tcGxldGUgdGhlCisJICogaW5pdGlhbGl6YXRpb24gZm9yIHRoYXQgcGFydC4KKwkgKi8KKwlkc19pbml0X2RzX3RyYWNlKCZ0cmFjZXItPnRyYWNlLmRzLCBkc19wZWJzLCBiYXNlLCBzaXplLCB0aCwgZmxhZ3MpOwogCWRzX3dyaXRlX2NvbmZpZyh0cmFjZXItPmRzLmNvbnRleHQsICZ0cmFjZXItPnRyYWNlLmRzLCBkc19wZWJzKTsKKwlkc19pbnN0YWxsX2RzX2FyZWEodHJhY2VyLT5kcy5jb250ZXh0KTsKKworCS8qIFN0YXJ0IHRyYWNpbmcuICovCiAJZHNfcmVzdW1lX3BlYnModHJhY2VyKTsKIAogCXJldHVybiB0cmFjZXI7CiAKLSBvdXRfcHV0X3RyYWNlcjoKLQlwdXRfdHJhY2VyKHRhc2spOwogIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgaXJxKTsKKwlzcGluX3VubG9ja19pcnEoJmRzX2xvY2spOwogCWRzX3B1dF9jb250ZXh0KHRyYWNlci0+ZHMuY29udGV4dCk7CiAgb3V0X3RyYWNlcjoKIAlrZnJlZSh0cmFjZXIpOworIG91dF9wdXRfdHJhY2VyOgorCXB1dF90cmFjZXIodGFzayk7CiAgb3V0OgogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIH0KIAotdm9pZCBkc19yZWxlYXNlX2J0cyhzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQorc3RydWN0IHBlYnNfdHJhY2VyICpkc19yZXF1ZXN0X3BlYnNfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJCQkJIHBlYnNfb3ZmbF9jYWxsYmFja190IG92ZmwsCisJCQkJCSBzaXplX3QgdGgsIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlpZiAoIXRyYWNlcikKLQkJcmV0dXJuOworCXJldHVybiBkc19yZXF1ZXN0X3BlYnModGFzaywgMCwgYmFzZSwgc2l6ZSwgb3ZmbCwgdGgsIGZsYWdzKTsKK30KIAotCWRzX3N1c3BlbmRfYnRzKHRyYWNlcik7CitzdHJ1Y3QgcGVic190cmFjZXIgKmRzX3JlcXVlc3RfcGVic19jcHUoaW50IGNwdSwgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJCXBlYnNfb3ZmbF9jYWxsYmFja190IG92ZmwsCisJCQkJCXNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBkc19yZXF1ZXN0X3BlYnMoTlVMTCwgY3B1LCBiYXNlLCBzaXplLCBvdmZsLCB0aCwgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkc19mcmVlX2J0cyhzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKworCXRhc2sgPSB0cmFjZXItPmRzLmNvbnRleHQtPnRhc2s7CiAKIAlXQVJOX09OX09OQ0UodHJhY2VyLT5kcy5jb250ZXh0LT5idHNfbWFzdGVyICE9IHRyYWNlcik7CiAJdHJhY2VyLT5kcy5jb250ZXh0LT5idHNfbWFzdGVyID0gTlVMTDsKIAotCXB1dF90cmFjZXIodHJhY2VyLT5kcy5jb250ZXh0LT50YXNrKTsKKwkvKiBNYWtlIHN1cmUgdHJhY2luZyBzdG9wcGVkIGFuZCB0aGUgdHJhY2VyIGlzIG5vdCBpbiB1c2UuICovCisJaWYgKHRhc2sgJiYgKHRhc2sgIT0gY3VycmVudCkpCisJCXdhaXRfdGFza19jb250ZXh0X3N3aXRjaCh0YXNrKTsKKwogCWRzX3B1dF9jb250ZXh0KHRyYWNlci0+ZHMuY29udGV4dCk7CisJcHV0X3RyYWNlcih0YXNrKTsKIAogCWtmcmVlKHRyYWNlcik7CiB9CiAKK3ZvaWQgZHNfcmVsZWFzZV9idHMoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcikKK3sKKwltaWdodF9zbGVlcCgpOworCisJaWYgKCF0cmFjZXIpCisJCXJldHVybjsKKworCWRzX3N1c3BlbmRfYnRzKHRyYWNlcik7CisJZHNfZnJlZV9idHModHJhY2VyKTsKK30KKworaW50IGRzX3JlbGVhc2VfYnRzX25vaXJxKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXVuc2lnbmVkIGxvbmcgaXJxOworCWludCBlcnJvcjsKKworCWlmICghdHJhY2VyKQorCQlyZXR1cm4gMDsKKworCXRhc2sgPSB0cmFjZXItPmRzLmNvbnRleHQtPnRhc2s7CisKKwlsb2NhbF9pcnFfc2F2ZShpcnEpOworCisJZXJyb3IgPSAtRVBFUk07CisJaWYgKCF0YXNrICYmCisJICAgICh0cmFjZXItPmRzLmNvbnRleHQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVQRVJNOworCWlmICh0YXNrICYmICh0YXNrICE9IGN1cnJlbnQpKQorCQlnb3RvIG91dDsKKworCWRzX3N1c3BlbmRfYnRzX25vaXJxKHRyYWNlcik7CisJZHNfZnJlZV9idHModHJhY2VyKTsKKworCWVycm9yID0gMDsKKyBvdXQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoaXJxKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90YXNrX2RlYnVnY3RsbXNyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBkZWJ1Z2N0bG1zcikKK3sKKwl0YXNrLT50aHJlYWQuZGVidWdjdGxtc3IgPSBkZWJ1Z2N0bG1zcjsKKworCWdldF9jcHUoKTsKKwlpZiAodGFzayA9PSBjdXJyZW50KQorCQl1cGRhdGVfZGVidWdjdGxtc3IoZGVidWdjdGxtc3IpOworCXB1dF9jcHUoKTsKK30KKwogdm9pZCBkc19zdXNwZW5kX2J0cyhzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwl1bnNpZ25lZCBsb25nIGRlYnVnY3RsbXNyOworCWludCBjcHU7CiAKIAlpZiAoIXRyYWNlcikKIAkJcmV0dXJuOwogCisJdHJhY2VyLT5mbGFncyA9IDA7CisKIAl0YXNrID0gdHJhY2VyLT5kcy5jb250ZXh0LT50YXNrOworCWNwdSAgPSB0cmFjZXItPmRzLmNvbnRleHQtPmNwdTsKIAotCWlmICghdGFzayB8fCAodGFzayA9PSBjdXJyZW50KSkKLQkJdXBkYXRlX2RlYnVnY3RsbXNyKGdldF9kZWJ1Z2N0bG1zcigpICYgfkJUU19DT05UUk9MKTsKKwlXQVJOX09OKCF0YXNrICYmIGlycXNfZGlzYWJsZWQoKSk7CiAKLQlpZiAodGFzaykgewotCQl0YXNrLT50aHJlYWQuZGVidWdjdGxtc3IgJj0gfkJUU19DT05UUk9MOworCWRlYnVnY3RsbXNyID0gKHRhc2sgPworCQkgICAgICAgdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIDoKKwkJICAgICAgIGdldF9kZWJ1Z2N0bG1zcl9vbl9jcHUoY3B1KSk7CisJZGVidWdjdGxtc3IgJj0gfkJUU19DT05UUk9MOwogCi0JCWlmICghdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyKQotCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9ERUJVR0NUTE1TUik7Ci0JfQorCWlmICh0YXNrKQorCQl1cGRhdGVfdGFza19kZWJ1Z2N0bG1zcih0YXNrLCBkZWJ1Z2N0bG1zcik7CisJZWxzZQorCQl1cGRhdGVfZGVidWdjdGxtc3Jfb25fY3B1KGNwdSwgZGVidWdjdGxtc3IpOwogfQogCi12b2lkIGRzX3Jlc3VtZV9idHMoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcikKK2ludCBkc19zdXNwZW5kX2J0c19ub2lycShzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQl1bnNpZ25lZCBsb25nIGNvbnRyb2w7CisJdW5zaWduZWQgbG9uZyBkZWJ1Z2N0bG1zciwgaXJxOworCWludCBjcHUsIGVycm9yID0gMDsKIAogCWlmICghdHJhY2VyKQotCQlyZXR1cm47CisJCXJldHVybiAwOworCisJdHJhY2VyLT5mbGFncyA9IDA7CiAKIAl0YXNrID0gdHJhY2VyLT5kcy5jb250ZXh0LT50YXNrOworCWNwdSAgPSB0cmFjZXItPmRzLmNvbnRleHQtPmNwdTsKKworCWxvY2FsX2lycV9zYXZlKGlycSk7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoIXRhc2sgJiYgKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQlnb3RvIG91dDsKKworCWRlYnVnY3RsbXNyID0gKHRhc2sgPworCQkgICAgICAgdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIDoKKwkJICAgICAgIGdldF9kZWJ1Z2N0bG1zcigpKTsKKwlkZWJ1Z2N0bG1zciAmPSB+QlRTX0NPTlRST0w7CisKKwlpZiAodGFzaykKKwkJdXBkYXRlX3Rhc2tfZGVidWdjdGxtc3IodGFzaywgZGVidWdjdGxtc3IpOworCWVsc2UKKwkJdXBkYXRlX2RlYnVnY3RsbXNyKGRlYnVnY3RsbXNyKTsKKworCWVycm9yID0gMDsKKyBvdXQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoaXJxKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRzX2J0c19jb250cm9sKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpCit7CisJdW5zaWduZWQgbG9uZyBjb250cm9sOwogCiAJY29udHJvbCA9IGRzX2NmZy5jdGxbZHNmX2J0c107CiAJaWYgKCEodHJhY2VyLT50cmFjZS5kcy5mbGFncyAmIEJUU19LRVJORUwpKQpAQCAtNzk3LDQxICsxMDE1LDE0OSBAQAogCWlmICghKHRyYWNlci0+dHJhY2UuZHMuZmxhZ3MgJiBCVFNfVVNFUikpCiAJCWNvbnRyb2wgfD0gZHNfY2ZnLmN0bFtkc2ZfYnRzX3VzZXJdOwogCi0JaWYgKHRhc2spIHsKLQkJdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIHw9IGNvbnRyb2w7Ci0JCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0RFQlVHQ1RMTVNSKTsKLQl9Ci0KLQlpZiAoIXRhc2sgfHwgKHRhc2sgPT0gY3VycmVudCkpCi0JCXVwZGF0ZV9kZWJ1Z2N0bG1zcihnZXRfZGVidWdjdGxtc3IoKSB8IGNvbnRyb2wpOworCXJldHVybiBjb250cm9sOwogfQogCi12b2lkIGRzX3JlbGVhc2VfcGVicyhzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcikKK3ZvaWQgZHNfcmVzdW1lX2J0cyhzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQogeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwl1bnNpZ25lZCBsb25nIGRlYnVnY3RsbXNyOworCWludCBjcHU7CisKIAlpZiAoIXRyYWNlcikKIAkJcmV0dXJuOwogCi0JZHNfc3VzcGVuZF9wZWJzKHRyYWNlcik7CisJdHJhY2VyLT5mbGFncyA9IHRyYWNlci0+dHJhY2UuZHMuZmxhZ3M7CisKKwl0YXNrID0gdHJhY2VyLT5kcy5jb250ZXh0LT50YXNrOworCWNwdSAgPSB0cmFjZXItPmRzLmNvbnRleHQtPmNwdTsKKworCVdBUk5fT04oIXRhc2sgJiYgaXJxc19kaXNhYmxlZCgpKTsKKworCWRlYnVnY3RsbXNyID0gKHRhc2sgPworCQkgICAgICAgdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIDoKKwkJICAgICAgIGdldF9kZWJ1Z2N0bG1zcl9vbl9jcHUoY3B1KSk7CisJZGVidWdjdGxtc3IgfD0gZHNfYnRzX2NvbnRyb2wodHJhY2VyKTsKKworCWlmICh0YXNrKQorCQl1cGRhdGVfdGFza19kZWJ1Z2N0bG1zcih0YXNrLCBkZWJ1Z2N0bG1zcik7CisJZWxzZQorCQl1cGRhdGVfZGVidWdjdGxtc3Jfb25fY3B1KGNwdSwgZGVidWdjdGxtc3IpOworfQorCitpbnQgZHNfcmVzdW1lX2J0c19ub2lycShzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwl1bnNpZ25lZCBsb25nIGRlYnVnY3RsbXNyLCBpcnE7CisJaW50IGNwdSwgZXJyb3IgPSAwOworCisJaWYgKCF0cmFjZXIpCisJCXJldHVybiAwOworCisJdHJhY2VyLT5mbGFncyA9IHRyYWNlci0+dHJhY2UuZHMuZmxhZ3M7CisKKwl0YXNrID0gdHJhY2VyLT5kcy5jb250ZXh0LT50YXNrOworCWNwdSAgPSB0cmFjZXItPmRzLmNvbnRleHQtPmNwdTsKKworCWxvY2FsX2lycV9zYXZlKGlycSk7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoIXRhc2sgJiYgKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQlnb3RvIG91dDsKKworCWRlYnVnY3RsbXNyID0gKHRhc2sgPworCQkgICAgICAgdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIDoKKwkJICAgICAgIGdldF9kZWJ1Z2N0bG1zcigpKTsKKwlkZWJ1Z2N0bG1zciB8PSBkc19idHNfY29udHJvbCh0cmFjZXIpOworCisJaWYgKHRhc2spCisJCXVwZGF0ZV90YXNrX2RlYnVnY3RsbXNyKHRhc2ssIGRlYnVnY3RsbXNyKTsKKwllbHNlCisJCXVwZGF0ZV9kZWJ1Z2N0bG1zcihkZWJ1Z2N0bG1zcik7CisKKwllcnJvciA9IDA7Cisgb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGlycSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBkc19mcmVlX3BlYnMoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCisJdGFzayA9IHRyYWNlci0+ZHMuY29udGV4dC0+dGFzazsKIAogCVdBUk5fT05fT05DRSh0cmFjZXItPmRzLmNvbnRleHQtPnBlYnNfbWFzdGVyICE9IHRyYWNlcik7CiAJdHJhY2VyLT5kcy5jb250ZXh0LT5wZWJzX21hc3RlciA9IE5VTEw7CiAKLQlwdXRfdHJhY2VyKHRyYWNlci0+ZHMuY29udGV4dC0+dGFzayk7CiAJZHNfcHV0X2NvbnRleHQodHJhY2VyLT5kcy5jb250ZXh0KTsKKwlwdXRfdHJhY2VyKHRhc2spOwogCiAJa2ZyZWUodHJhY2VyKTsKIH0KIAordm9pZCBkc19yZWxlYXNlX3BlYnMoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIpCit7CisJbWlnaHRfc2xlZXAoKTsKKworCWlmICghdHJhY2VyKQorCQlyZXR1cm47CisKKwlkc19zdXNwZW5kX3BlYnModHJhY2VyKTsKKwlkc19mcmVlX3BlYnModHJhY2VyKTsKK30KKworaW50IGRzX3JlbGVhc2VfcGVic19ub2lycShzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcikKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJdW5zaWduZWQgbG9uZyBpcnE7CisJaW50IGVycm9yOworCisJaWYgKCF0cmFjZXIpCisJCXJldHVybiAwOworCisJdGFzayA9IHRyYWNlci0+ZHMuY29udGV4dC0+dGFzazsKKworCWxvY2FsX2lycV9zYXZlKGlycSk7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoIXRhc2sgJiYKKwkgICAgKHRyYWNlci0+ZHMuY29udGV4dC0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRVBFUk07CisJaWYgKHRhc2sgJiYgKHRhc2sgIT0gY3VycmVudCkpCisJCWdvdG8gb3V0OworCisJZHNfc3VzcGVuZF9wZWJzX25vaXJxKHRyYWNlcik7CisJZHNfZnJlZV9wZWJzKHRyYWNlcik7CisKKwllcnJvciA9IDA7Cisgb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGlycSk7CisJcmV0dXJuIGVycm9yOworfQorCiB2b2lkIGRzX3N1c3BlbmRfcGVicyhzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcikKIHsKIAogfQogCitpbnQgZHNfc3VzcGVuZF9wZWJzX25vaXJxKHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyKQoreworCXJldHVybiAwOworfQorCiB2b2lkIGRzX3Jlc3VtZV9wZWJzKHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyKQogewogCiB9CiAKK2ludCBkc19yZXN1bWVfcGVic19ub2lycShzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcikKK3sKKwlyZXR1cm4gMDsKK30KKwogY29uc3Qgc3RydWN0IGJ0c190cmFjZSAqZHNfcmVhZF9idHMoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcikKIHsKIAlpZiAoIXRyYWNlcikKQEAgLTg0Nyw4ICsxMTczLDEyIEBACiAJCXJldHVybiBOVUxMOwogCiAJZHNfcmVhZF9jb25maWcodHJhY2VyLT5kcy5jb250ZXh0LCAmdHJhY2VyLT50cmFjZS5kcywgZHNfcGVicyk7Ci0JdHJhY2VyLT50cmFjZS5yZXNldF92YWx1ZSA9Ci0JCSoodTY0ICopKHRyYWNlci0+ZHMuY29udGV4dC0+ZHMgKyAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIDgpKTsKKworCXRyYWNlci0+dHJhY2UuY291bnRlcnMgPSBkc19jZmcubnJfY291bnRlcl9yZXNldDsKKwltZW1jcHkodHJhY2VyLT50cmFjZS5jb3VudGVyX3Jlc2V0LAorCSAgICAgICB0cmFjZXItPmRzLmNvbnRleHQtPmRzICsKKwkgICAgICAgKE5VTV9EU19QVFJfRklFTERTICogZHNfY2ZnLnNpemVvZl9wdHJfZmllbGQpLAorCSAgICAgICBkc19jZmcubnJfY291bnRlcl9yZXNldCAqIFBFQlNfUkVTRVRfRklFTERfU0laRSk7CiAKIAlyZXR1cm4gJnRyYWNlci0+dHJhY2U7CiB9CkBAIC04NzMsMTggKzEyMDMsMjQgQEAKIAogCXRyYWNlci0+dHJhY2UuZHMudG9wID0gdHJhY2VyLT50cmFjZS5kcy5iZWdpbjsKIAotCWRzX3NldCh0cmFjZXItPmRzLmNvbnRleHQtPmRzLCBkc19idHMsIGRzX2luZGV4LAorCWRzX3NldCh0cmFjZXItPmRzLmNvbnRleHQtPmRzLCBkc19wZWJzLCBkc19pbmRleCwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcpdHJhY2VyLT50cmFjZS5kcy50b3ApOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBkc19zZXRfcGVic19yZXNldChzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlciwgdTY0IHZhbHVlKQoraW50IGRzX3NldF9wZWJzX3Jlc2V0KHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnRlciwgdTY0IHZhbHVlKQogewogCWlmICghdHJhY2VyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSoodTY0ICopKHRyYWNlci0+ZHMuY29udGV4dC0+ZHMgKyAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIDgpKSA9IHZhbHVlOworCWlmIChkc19jZmcubnJfY291bnRlcl9yZXNldCA8IGNvdW50ZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJKih1NjQgKikodHJhY2VyLT5kcy5jb250ZXh0LT5kcyArCisJCSAoTlVNX0RTX1BUUl9GSUVMRFMgKiBkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCkgKworCQkgKGNvdW50ZXIgKiBQRUJTX1JFU0VUX0ZJRUxEX1NJWkUpKSA9IHZhbHVlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04OTQsNzMgKzEyMzAsMTE3IEBACiAJLmN0bFtkc2ZfYnRzXQkJPSAoMSA8PCAyKSB8ICgxIDw8IDMpLAogCS5jdGxbZHNmX2J0c19rZXJuZWxdCT0gKDEgPDwgNSksCiAJLmN0bFtkc2ZfYnRzX3VzZXJdCT0gKDEgPDwgNiksCi0KLQkuc2l6ZW9mX2ZpZWxkCQk9IHNpemVvZihsb25nKSwKLQkuc2l6ZW9mX3JlY1tkc19idHNdCT0gc2l6ZW9mKGxvbmcpICogMywKLSNpZmRlZiBfX2kzODZfXwotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gc2l6ZW9mKGxvbmcpICogMTAsCi0jZWxzZQotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gc2l6ZW9mKGxvbmcpICogMTgsCi0jZW5kaWYKKwkubnJfY291bnRlcl9yZXNldAk9IDEsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBkc19jb25maWd1cmF0aW9uIGRzX2NmZ19wZW50aXVtX20gPSB7CiAJLm5hbWUgPSAiUGVudGl1bSBNIiwKIAkuY3RsW2RzZl9idHNdCQk9ICgxIDw8IDYpIHwgKDEgPDwgNyksCi0KLQkuc2l6ZW9mX2ZpZWxkCQk9IHNpemVvZihsb25nKSwKLQkuc2l6ZW9mX3JlY1tkc19idHNdCT0gc2l6ZW9mKGxvbmcpICogMywKLSNpZmRlZiBfX2kzODZfXwotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gc2l6ZW9mKGxvbmcpICogMTAsCi0jZWxzZQotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gc2l6ZW9mKGxvbmcpICogMTgsCi0jZW5kaWYKKwkubnJfY291bnRlcl9yZXNldAk9IDEsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBkc19jb25maWd1cmF0aW9uIGRzX2NmZ19jb3JlMl9hdG9tID0gewogCS5uYW1lID0gIkNvcmUgMi9BdG9tIiwKIAkuY3RsW2RzZl9idHNdCQk9ICgxIDw8IDYpIHwgKDEgPDwgNyksCiAJLmN0bFtkc2ZfYnRzX2tlcm5lbF0JPSAoMSA8PCA5KSwKIAkuY3RsW2RzZl9idHNfdXNlcl0JPSAoMSA8PCAxMCksCi0KLQkuc2l6ZW9mX2ZpZWxkCQk9IDgsCi0JLnNpemVvZl9yZWNbZHNfYnRzXQk9IDggKiAzLAotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gOCAqIDE4LAorCS5ucl9jb3VudGVyX3Jlc2V0CT0gMSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGRzX2NvbmZpZ3VyYXRpb24gZHNfY2ZnX2NvcmVfaTcgPSB7CisJLm5hbWUgPSAiQ29yZSBpNyIsCisJLmN0bFtkc2ZfYnRzXQkJPSAoMSA8PCA2KSB8ICgxIDw8IDcpLAorCS5jdGxbZHNmX2J0c19rZXJuZWxdCT0gKDEgPDwgOSksCisJLmN0bFtkc2ZfYnRzX3VzZXJdCT0gKDEgPDwgMTApLAorCS5ucl9jb3VudGVyX3Jlc2V0CT0gNCwKIH07CiAKIHN0YXRpYyB2b2lkCi1kc19jb25maWd1cmUoY29uc3Qgc3RydWN0IGRzX2NvbmZpZ3VyYXRpb24gKmNmZykKK2RzX2NvbmZpZ3VyZShjb25zdCBzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiAqY2ZnLAorCSAgICAgc3RydWN0IGNwdWluZm9feDg2ICpjcHUpCiB7CisJdW5zaWduZWQgbG9uZyBucl9wZWJzX2ZpZWxkcyA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJbZHNdIHVzaW5nICVzIGNvbmZpZ3VyYXRpb25cbiIsIGNmZy0+bmFtZSk7CisKKyNpZmRlZiBfX2kzODZfXworCW5yX3BlYnNfZmllbGRzID0gMTA7CisjZWxzZQorCW5yX3BlYnNfZmllbGRzID0gMTg7CisjZW5kaWYKKworCS8qCisJICogU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIsIGFyY2hpdGVjdHVyYWwgcGVyZm9ybWFuY2UKKwkgKiBtb25pdG9yaW5nIHN1cHBvcnRzIGEgZm9ybWF0IHNwZWNpZmllci4KKwkgKi8KKwlpZiAoKGNwdWlkX2VheCgweGEpICYgMHhmZikgPiAxKSB7CisJCXVuc2lnbmVkIGxvbmcgcGVyZl9jYXBhYmlsaXRpZXMsIGZvcm1hdDsKKworCQlyZG1zcmwoTVNSX0lBMzJfUEVSRl9DQVBBQklMSVRJRVMsIHBlcmZfY2FwYWJpbGl0aWVzKTsKKworCQlmb3JtYXQgPSAocGVyZl9jYXBhYmlsaXRpZXMgPj4gOCkgJiAweGY7CisKKwkJc3dpdGNoIChmb3JtYXQpIHsKKwkJY2FzZSAwOgorCQkJbnJfcGVic19maWVsZHMgPSAxODsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlucl9wZWJzX2ZpZWxkcyA9IDIyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIltkc10gdW5rbm93biBQRUJTIGZvcm1hdDogJWx1XG4iLCBmb3JtYXQpOworCQkJbnJfcGVic19maWVsZHMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKIAltZW1zZXQoJmRzX2NmZywgMCwgc2l6ZW9mKGRzX2NmZykpOwogCWRzX2NmZyA9ICpjZmc7CiAKLQlwcmludGsoS0VSTl9JTkZPICJbZHNdIHVzaW5nICVzIGNvbmZpZ3VyYXRpb25cbiIsIGRzX2NmZy5uYW1lKTsKKwlkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCA9CisJCShjcHVfaGFzKGNwdSwgWDg2X0ZFQVRVUkVfRFRFUzY0KSA/IDggOiA0KTsKIAotCWlmICghY3B1X2hhc19idHMpIHsKLQkJZHNfY2ZnLmN0bFtkc2ZfYnRzXSA9IDA7CisJZHNfY2ZnLnNpemVvZl9yZWNbZHNfYnRzXSAgPSBkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCAqIDM7CisJZHNfY2ZnLnNpemVvZl9yZWNbZHNfcGVic10gPSBkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCAqIG5yX3BlYnNfZmllbGRzOworCisJaWYgKCFjcHVfaGFzKGNwdSwgWDg2X0ZFQVRVUkVfQlRTKSkgeworCQlkc19jZmcuc2l6ZW9mX3JlY1tkc19idHNdID0gMDsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiW2RzXSBidHMgbm90IGF2YWlsYWJsZVxuIik7CiAJfQotCWlmICghY3B1X2hhc19wZWJzKQorCWlmICghY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX1BFQlMpKSB7CisJCWRzX2NmZy5zaXplb2ZfcmVjW2RzX3BlYnNdID0gMDsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiW2RzXSBwZWJzIG5vdCBhdmFpbGFibGVcbiIpOworCX0KIAotCVdBUk5fT05fT05DRShNQVhfU0laRU9GX0RTIDwgKDEyICogZHNfY2ZnLnNpemVvZl9maWVsZCkpOworCXByaW50ayhLRVJOX0lORk8gIltkc10gc2l6ZXM6IGFkZHJlc3M6ICV1IGJpdCwgIiwKKwkgICAgICAgOCAqIGRzX2NmZy5zaXplb2ZfcHRyX2ZpZWxkKTsKKwlwcmludGsoImJ0cy9wZWJzIHJlY29yZDogJXUvJXUgYnl0ZXNcbiIsCisJICAgICAgIGRzX2NmZy5zaXplb2ZfcmVjW2RzX2J0c10sIGRzX2NmZy5zaXplb2ZfcmVjW2RzX3BlYnNdKTsKKworCVdBUk5fT05fT05DRShNQVhfUEVCU19DT1VOVEVSUyA8IGRzX2NmZy5ucl9jb3VudGVyX3Jlc2V0KTsKIH0KIAogdm9pZCBfX2NwdWluaXQgZHNfaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CisJLyogT25seSBjb25maWd1cmUgdGhlIGZpcnN0IGNwdS4gT3RoZXJzIGFyZSBpZGVudGljYWwuICovCisJaWYgKGRzX2NmZy5uYW1lKQorCQlyZXR1cm47CisKIAlzd2l0Y2ggKGMtPng4NikgewogCWNhc2UgMHg2OgogCQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgewogCQljYXNlIDB4OToKIAkJY2FzZSAweGQ6IC8qIFBlbnRpdW0gTSAqLwotCQkJZHNfY29uZmlndXJlKCZkc19jZmdfcGVudGl1bV9tKTsKKwkJCWRzX2NvbmZpZ3VyZSgmZHNfY2ZnX3BlbnRpdW1fbSwgYyk7CiAJCQlicmVhazsKIAkJY2FzZSAweGY6CiAJCWNhc2UgMHgxNzogLyogQ29yZTIgKi8KIAkJY2FzZSAweDFjOiAvKiBBdG9tICovCi0JCQlkc19jb25maWd1cmUoJmRzX2NmZ19jb3JlMl9hdG9tKTsKKwkJCWRzX2NvbmZpZ3VyZSgmZHNfY2ZnX2NvcmUyX2F0b20sIGMpOwogCQkJYnJlYWs7Ci0JCWNhc2UgMHgxYTogLyogaTcgKi8KKwkJY2FzZSAweDFhOiAvKiBDb3JlIGk3ICovCisJCQlkc19jb25maWd1cmUoJmRzX2NmZ19jb3JlX2k3LCBjKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJLyogc29ycnksIGRvbid0IGtub3cgYWJvdXQgdGhlbSAqLworCQkJLyogU29ycnksIGRvbid0IGtub3cgYWJvdXQgdGhlbS4gKi8KIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtOTY5LDY0ICsxMzQ5LDg5IEBACiAJCWNhc2UgMHgwOgogCQljYXNlIDB4MToKIAkJY2FzZSAweDI6IC8qIE5ldGJ1cnN0ICovCi0JCQlkc19jb25maWd1cmUoJmRzX2NmZ19uZXRidXJzdCk7CisJCQlkc19jb25maWd1cmUoJmRzX2NmZ19uZXRidXJzdCwgYyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCS8qIHNvcnJ5LCBkb24ndCBrbm93IGFib3V0IHRoZW0gKi8KKwkJCS8qIFNvcnJ5LCBkb24ndCBrbm93IGFib3V0IHRoZW0uICovCiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQkvKiBzb3JyeSwgZG9uJ3Qga25vdyBhYm91dCB0aGVtICovCisJCS8qIFNvcnJ5LCBkb24ndCBrbm93IGFib3V0IHRoZW0uICovCiAJCWJyZWFrOwogCX0KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGRzX3Rha2VfdGltZXN0YW1wKHN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0LAorCQkJCSAgICAgZW51bSBidHNfcXVhbGlmaWVyIHF1YWxpZmllciwKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyID0gY29udGV4dC0+YnRzX21hc3RlcjsKKwlzdHJ1Y3QgYnRzX3N0cnVjdCB0czsKKworCS8qIFByZXZlbnQgY29tcGlsZXJzIGZyb20gcmVhZGluZyB0aGUgdHJhY2VyIHBvaW50ZXIgdHdpY2UuICovCisJYmFycmllcigpOworCisJaWYgKCF0cmFjZXIgfHwgISh0cmFjZXItPmZsYWdzICYgQlRTX1RJTUVTVEFNUFMpKQorCQlyZXR1cm47CisKKwltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKKwl0cy5xdWFsaWZpZXIJCT0gcXVhbGlmaWVyOworCXRzLnZhcmlhbnQuZXZlbnQuY2xvY2sJPSB0cmFjZV9jbG9ja19nbG9iYWwoKTsKKwl0cy52YXJpYW50LmV2ZW50LnBpZAk9IHRhc2stPnBpZDsKKworCWJ0c193cml0ZSh0cmFjZXIsICZ0cyk7Cit9CisKIC8qCiAgKiBDaGFuZ2UgdGhlIERTIGNvbmZpZ3VyYXRpb24gZnJvbSB0cmFjaW5nIHByZXYgdG8gdHJhY2luZyBuZXh0LgogICovCiB2b2lkIGRzX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlzdHJ1Y3QgZHNfY29udGV4dCAqcHJldl9jdHggPSBwcmV2LT50aHJlYWQuZHNfY3R4OwotCXN0cnVjdCBkc19jb250ZXh0ICpuZXh0X2N0eCA9IG5leHQtPnRocmVhZC5kc19jdHg7CisJc3RydWN0IGRzX2NvbnRleHQgKnByZXZfY3R4CT0gcHJldi0+dGhyZWFkLmRzX2N0eDsKKwlzdHJ1Y3QgZHNfY29udGV4dCAqbmV4dF9jdHgJPSBuZXh0LT50aHJlYWQuZHNfY3R4OworCXVuc2lnbmVkIGxvbmcgZGVidWdjdGxtc3IJPSBuZXh0LT50aHJlYWQuZGVidWdjdGxtc3I7CisKKwkvKiBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgcmVhZCBiZWZvcmUgd2Ugc3RhcnQuICovCisJYmFycmllcigpOwogCiAJaWYgKHByZXZfY3R4KSB7CiAJCXVwZGF0ZV9kZWJ1Z2N0bG1zcigwKTsKIAotCQlpZiAocHJldl9jdHgtPmJ0c19tYXN0ZXIgJiYKLQkJICAgIChwcmV2X2N0eC0+YnRzX21hc3Rlci0+dHJhY2UuZHMuZmxhZ3MgJiBCVFNfVElNRVNUQU1QUykpIHsKLQkJCXN0cnVjdCBidHNfc3RydWN0IHRzID0gewotCQkJCS5xdWFsaWZpZXIgPSBidHNfdGFza19kZXBhcnRzLAotCQkJCS52YXJpYW50LnRpbWVzdGFtcC5qaWZmaWVzID0gamlmZmllc182NCwKLQkJCQkudmFyaWFudC50aW1lc3RhbXAucGlkID0gcHJldi0+cGlkCi0JCQl9OwotCQkJYnRzX3dyaXRlKHByZXZfY3R4LT5idHNfbWFzdGVyLCAmdHMpOwotCQl9CisJCWRzX3Rha2VfdGltZXN0YW1wKHByZXZfY3R4LCBidHNfdGFza19kZXBhcnRzLCBwcmV2KTsKIAl9CiAKIAlpZiAobmV4dF9jdHgpIHsKLQkJaWYgKG5leHRfY3R4LT5idHNfbWFzdGVyICYmCi0JCSAgICAobmV4dF9jdHgtPmJ0c19tYXN0ZXItPnRyYWNlLmRzLmZsYWdzICYgQlRTX1RJTUVTVEFNUFMpKSB7Ci0JCQlzdHJ1Y3QgYnRzX3N0cnVjdCB0cyA9IHsKLQkJCQkucXVhbGlmaWVyID0gYnRzX3Rhc2tfYXJyaXZlcywKLQkJCQkudmFyaWFudC50aW1lc3RhbXAuamlmZmllcyA9IGppZmZpZXNfNjQsCi0JCQkJLnZhcmlhbnQudGltZXN0YW1wLnBpZCA9IG5leHQtPnBpZAotCQkJfTsKLQkJCWJ0c193cml0ZShuZXh0X2N0eC0+YnRzX21hc3RlciwgJnRzKTsKLQkJfQorCQlkc190YWtlX3RpbWVzdGFtcChuZXh0X2N0eCwgYnRzX3Rhc2tfYXJyaXZlcywgbmV4dCk7CiAKIAkJd3Jtc3JsKE1TUl9JQTMyX0RTX0FSRUEsICh1bnNpZ25lZCBsb25nKW5leHRfY3R4LT5kcyk7CiAJfQogCi0JdXBkYXRlX2RlYnVnY3RsbXNyKG5leHQtPnRocmVhZC5kZWJ1Z2N0bG1zcik7CisJdXBkYXRlX2RlYnVnY3RsbXNyKGRlYnVnY3RsbXNyKTsKIH0KIAotdm9pZCBkc19jb3B5X3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHRhc2tfc3RydWN0ICpmYXRoZXIpCitzdGF0aWMgX19pbml0IGludCBkc19zZWxmdGVzdCh2b2lkKQogewotCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9EU19BUkVBX01TUik7Ci0JdHNrLT50aHJlYWQuZHNfY3R4ID0gTlVMTDsKLX0KKwlpZiAoZHNfY2ZnLnNpemVvZl9yZWNbZHNfYnRzXSkgeworCQlpbnQgZXJyb3I7CiAKLXZvaWQgZHNfZXhpdF90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17CisJCWVycm9yID0gZHNfc2VsZnRlc3RfYnRzKCk7CisJCWlmIChlcnJvcikgeworCQkJV0FSTigxLCAiW2RzXSBzZWxmdGVzdCBmYWlsZWQuIGRpc2FibGluZyBidHMuXG4iKTsKKwkJCWRzX2NmZy5zaXplb2ZfcmVjW2RzX2J0c10gPSAwOworCQl9CisJfQorCisJaWYgKGRzX2NmZy5zaXplb2ZfcmVjW2RzX3BlYnNdKSB7CisJCWludCBlcnJvcjsKKworCQllcnJvciA9IGRzX3NlbGZ0ZXN0X3BlYnMoKTsKKwkJaWYgKGVycm9yKSB7CisJCQlXQVJOKDEsICJbZHNdIHNlbGZ0ZXN0IGZhaWxlZC4gZGlzYWJsaW5nIHBlYnMuXG4iKTsKKwkJCWRzX2NmZy5zaXplb2ZfcmVjW2RzX3BlYnNdID0gMDsKKwkJfQorCX0KKworCXJldHVybiAwOwogfQorZGV2aWNlX2luaXRjYWxsKGRzX3NlbGZ0ZXN0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kc19zZWxmdGVzdC5jIGIvYXJjaC94ODYva2VybmVsL2RzX3NlbGZ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjN2MxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kc19zZWxmdGVzdC5jCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogRGVidWcgU3RvcmUgc3VwcG9ydCAtIHNlbGZ0ZXN0CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIE1hcmt1cyBNZXR6Z2VyIDxtYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbT4sIDIwMDkKKyAqLworCisjaW5jbHVkZSAiZHNfc2VsZnRlc3QuaCIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL2RzLmg+CisKKworI2RlZmluZSBCVUZGRVJfU0laRQkJNTIxCS8qIEludGVudGlvbmFsbHkgY2hvc2UgYW4gb2RkIHNpemUuICovCisjZGVmaW5lIFNNQUxMX0JVRkZFUl9TSVpFCTI0CS8qIEEgc2luZ2xlIGJ0cyBlbnRyeS4gKi8KKworc3RydWN0IGRzX3NlbGZ0ZXN0X2J0c19jb25mIHsKKwlzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyOworCWludCBlcnJvcjsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgYnRzX3RyYWNlciAqKTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBidHNfdHJhY2VyICopOworfTsKKworc3RhdGljIGludCBkc19zZWxmdGVzdF9idHNfY29uc2lzdGVuY3koY29uc3Qgc3RydWN0IGJ0c190cmFjZSAqdHJhY2UpCit7CisJaW50IGVycm9yID0gMDsKKworCWlmICghdHJhY2UpIHsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiZmFpbGVkIHRvIGFjY2VzcyB0cmFjZS4uLiIpOworCQkvKiBCYWlsIG91dC4gT3RoZXIgdGVzdHMgYXJlIHBvaW50bGVzcy4gKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghdHJhY2UtPnJlYWQpIHsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiYnRzIHJlYWQgbm90IGF2YWlsYWJsZS4uLiIpOworCQllcnJvciA9IC0xOworCX0KKworCS8qIERvIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiB0aGUgdHJhY2UgY29uZmlndXJhdGlvbi4gKi8KKwlpZiAoIXRyYWNlLT5kcy5uKSB7CisJCXByaW50ayhLRVJOX0NPTlQgImVtcHR5IGJ0cyBidWZmZXIuLi4iKTsKKwkJZXJyb3IgPSAtMTsKKwl9CisJaWYgKCF0cmFjZS0+ZHMuc2l6ZSkgeworCQlwcmludGsoS0VSTl9DT05UICJiYWQgYnRzIHRyYWNlIHNldHVwLi4uIik7CisJCWVycm9yID0gLTE7CisJfQorCWlmICh0cmFjZS0+ZHMuZW5kICE9CisJICAgIChjaGFyICopdHJhY2UtPmRzLmJlZ2luICsgKHRyYWNlLT5kcy5uICogdHJhY2UtPmRzLnNpemUpKSB7CisJCXByaW50ayhLRVJOX0NPTlQgImJhZCBidHMgYnVmZmVyIHNldHVwLi4uIik7CisJCWVycm9yID0gLTE7CisJfQorCS8qCisJICogV2UgYWxsb3cgdG9wIGluIFtiZWdpbjsgZW5kXSwgc2luY2UgaXRzIG5vdCBjbGVhciB3aGVuIHRoZQorCSAqIG92ZXJmbG93IGFkanVzdG1lbnQgaGFwcGVuczogYWZ0ZXIgdGhlIGluY3JlbWVudCBvciBiZWZvcmUgdGhlCisJICogd3JpdGUuCisJICovCisJaWYgKCh0cmFjZS0+ZHMudG9wIDwgdHJhY2UtPmRzLmJlZ2luKSB8fAorCSAgICAodHJhY2UtPmRzLmVuZCA8IHRyYWNlLT5kcy50b3ApKSB7CisJCXByaW50ayhLRVJOX0NPTlQgImJ0cyB0b3Agb3V0IG9mIGJvdW5kcy4uLiIpOworCQllcnJvciA9IC0xOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBkc19zZWxmdGVzdF9idHNfcmVhZChzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyLAorCQkJCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlLAorCQkJCWNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmF0OworCisJLyoKKwkgKiBDaGVjayBhIGZldyB0aGluZ3Mgd2hpY2ggZG8gbm90IGJlbG9uZyB0byB0aGlzIHRlc3QuCisJICogVGhleSBzaG91bGQgYmUgY292ZXJlZCBieSBvdGhlciB0ZXN0cy4KKwkgKi8KKwlpZiAoIXRyYWNlKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXRyYWNlLT5yZWFkKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodG8gPCBmcm9tKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZnJvbSA8IHRyYWNlLT5kcy5iZWdpbikKKwkJcmV0dXJuIC0xOworCisJaWYgKHRyYWNlLT5kcy5lbmQgPCB0bykKKwkJcmV0dXJuIC0xOworCisJaWYgKCF0cmFjZS0+ZHMuc2l6ZSkKKwkJcmV0dXJuIC0xOworCisJLyogTm93IHRvIHRoZSB0ZXN0IGl0c2VsZi4gKi8KKwlmb3IgKGF0ID0gZnJvbTsgKHZvaWQgKilhdCA8IHRvOyBhdCArPSB0cmFjZS0+ZHMuc2l6ZSkgeworCQlzdHJ1Y3QgYnRzX3N0cnVjdCBidHM7CisJCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJCWludCBlcnJvcjsKKworCQlpZiAoKCh2b2lkICopYXQgLSB0cmFjZS0+ZHMuYmVnaW4pICUgdHJhY2UtPmRzLnNpemUpIHsKKwkJCXByaW50ayhLRVJOX0NPTlQKKwkJCSAgICAgICAicmVhZCBmcm9tIG5vbi1pbnRlZ2VyIGluZGV4Li4uIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaW5kZXggPSAoKHZvaWQgKilhdCAtIHRyYWNlLT5kcy5iZWdpbikgLyB0cmFjZS0+ZHMuc2l6ZTsKKworCQltZW1zZXQoJmJ0cywgMCwgc2l6ZW9mKGJ0cykpOworCQllcnJvciA9IHRyYWNlLT5yZWFkKHRyYWNlciwgYXQsICZidHMpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQlwcmludGsoS0VSTl9DT05UCisJCQkgICAgICAgImVycm9yIHJlYWRpbmcgYnRzIHRyYWNlIGF0IFslbHVdICgweCVwKS4uLiIsCisJCQkgICAgICAgaW5kZXgsIGF0KTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCisJCXN3aXRjaCAoYnRzLnF1YWxpZmllcikgeworCQljYXNlIEJUU19CUkFOQ0g6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0NPTlQKKwkJCSAgICAgICAidW5leHBlY3RlZCBidHMgZW50cnkgJWxsdSBhdCBbJWx1XSAoMHglcCkuLi4iLAorCQkJICAgICAgIGJ0cy5xdWFsaWZpZXIsIGluZGV4LCBhdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNfc2VsZnRlc3RfYnRzX2NwdSh2b2lkICphcmcpCit7CisJc3RydWN0IGRzX3NlbGZ0ZXN0X2J0c19jb25mICpjb25mID0gYXJnOworCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlOworCXZvaWQgKnRvcDsKKworCWlmIChJU19FUlIoY29uZi0+dHJhY2VyKSkgeworCQljb25mLT5lcnJvciA9IFBUUl9FUlIoY29uZi0+dHJhY2VyKTsKKwkJY29uZi0+dHJhY2VyID0gTlVMTDsKKworCQlwcmludGsoS0VSTl9DT05UCisJCSAgICAgICAiaW5pdGlhbGl6YXRpb24gZmFpbGVkIChlcnI6ICVkKS4uLiIsIGNvbmYtPmVycm9yKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIHNob3VsZCBtZWFud2hpbGUgaGF2ZSBlbm91Z2ggdHJhY2UuICovCisJY29uZi0+ZXJyb3IgPSBjb25mLT5zdXNwZW5kKGNvbmYtPnRyYWNlcik7CisJaWYgKGNvbmYtPmVycm9yIDwgMCkKKwkJcmV0dXJuOworCisJLyogTGV0J3Mgc2VlIGlmIHdlIGNhbiBhY2Nlc3MgdGhlIHRyYWNlLiAqLworCXRyYWNlID0gZHNfcmVhZF9idHMoY29uZi0+dHJhY2VyKTsKKworCWNvbmYtPmVycm9yID0gZHNfc2VsZnRlc3RfYnRzX2NvbnNpc3RlbmN5KHRyYWNlKTsKKwlpZiAoY29uZi0+ZXJyb3IgPCAwKQorCQlyZXR1cm47CisKKwkvKiBJZiBldmVyeXRoaW5nIHdlbnQgd2VsbCwgd2Ugc2hvdWxkIGhhdmUgYSBmZXcgdHJhY2UgZW50cmllcy4gKi8KKwlpZiAodHJhY2UtPmRzLnRvcCA9PSB0cmFjZS0+ZHMuYmVnaW4pIHsKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgYnV0IGhpZ2hseSB1bmxpa2VseSB0aGF0IHdlIGdvdCBhCisJCSAqIGJ1ZmZlciBvdmVyZmxvdyBhbmQgZW5kIHVwIGF0IGV4YWN0bHkgdGhlIHNhbWUKKwkJICogcG9zaXRpb24gd2Ugc3RhcnRlZCBmcm9tLgorCQkgKiBMZXQncyBpc3N1ZSBhIHdhcm5pbmcsIGJ1dCBjb250aW51ZS4KKwkJICovCisJCXByaW50ayhLRVJOX0NPTlQgIm5vIHRyYWNlL292ZXJmbG93Li4uIik7CisJfQorCisJLyogTGV0J3MgdHJ5IHRvIHJlYWQgdGhlIHRyYWNlIHdlIGNvbGxlY3RlZC4gKi8KKwljb25mLT5lcnJvciA9CisJCWRzX3NlbGZ0ZXN0X2J0c19yZWFkKGNvbmYtPnRyYWNlciwgdHJhY2UsCisJCQkJICAgICB0cmFjZS0+ZHMuYmVnaW4sIHRyYWNlLT5kcy50b3ApOworCWlmIChjb25mLT5lcnJvciA8IDApCisJCXJldHVybjsKKworCS8qCisJICogTGV0J3MgcmVhZCB0aGUgdHJhY2UgYWdhaW4uCisJICogU2luY2Ugd2Ugc3VzcGVuZGVkIHRyYWNpbmcsIHdlIHNob3VsZCBnZXQgdGhlIHNhbWUgcmVzdWx0LgorCSAqLworCXRvcCA9IHRyYWNlLT5kcy50b3A7CisKKwl0cmFjZSA9IGRzX3JlYWRfYnRzKGNvbmYtPnRyYWNlcik7CisJY29uZi0+ZXJyb3IgPSBkc19zZWxmdGVzdF9idHNfY29uc2lzdGVuY3kodHJhY2UpOworCWlmIChjb25mLT5lcnJvciA8IDApCisJCXJldHVybjsKKworCWlmICh0b3AgIT0gdHJhY2UtPmRzLnRvcCkgeworCQlwcmludGsoS0VSTl9DT05UICJzdXNwZW5kIG5vdCB3b3JraW5nLi4uIik7CisJCWNvbmYtPmVycm9yID0gLTE7CisJCXJldHVybjsKKwl9CisKKwkvKiBMZXQncyBjb2xsZWN0IHNvbWUgbW9yZSB0cmFjZSAtIHNlZSBpZiByZXN1bWUgaXMgd29ya2luZy4gKi8KKwljb25mLT5lcnJvciA9IGNvbmYtPnJlc3VtZShjb25mLT50cmFjZXIpOworCWlmIChjb25mLT5lcnJvciA8IDApCisJCXJldHVybjsKKworCWNvbmYtPmVycm9yID0gY29uZi0+c3VzcGVuZChjb25mLT50cmFjZXIpOworCWlmIChjb25mLT5lcnJvciA8IDApCisJCXJldHVybjsKKworCXRyYWNlID0gZHNfcmVhZF9idHMoY29uZi0+dHJhY2VyKTsKKworCWNvbmYtPmVycm9yID0gZHNfc2VsZnRlc3RfYnRzX2NvbnNpc3RlbmN5KHRyYWNlKTsKKwlpZiAoY29uZi0+ZXJyb3IgPCAwKQorCQlyZXR1cm47CisKKwlpZiAodHJhY2UtPmRzLnRvcCA9PSB0b3ApIHsKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgYnV0IGhpZ2hseSB1bmxpa2VseSB0aGF0IHdlIGdvdCBhCisJCSAqIGJ1ZmZlciBvdmVyZmxvdyBhbmQgZW5kIHVwIGF0IGV4YWN0bHkgdGhlIHNhbWUKKwkJICogcG9zaXRpb24gd2Ugc3RhcnRlZCBmcm9tLgorCQkgKiBMZXQncyBpc3N1ZSBhIHdhcm5pbmcgYW5kIGNoZWNrIHRoZSBmdWxsIHRyYWNlLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fQ09OVAorCQkgICAgICAgIm5vIHJlc3VtZSBwcm9ncmVzcy9vdmVyZmxvdy4uLiIpOworCisJCWNvbmYtPmVycm9yID0KKwkJCWRzX3NlbGZ0ZXN0X2J0c19yZWFkKGNvbmYtPnRyYWNlciwgdHJhY2UsCisJCQkJCSAgICAgdHJhY2UtPmRzLmJlZ2luLCB0cmFjZS0+ZHMuZW5kKTsKKwl9IGVsc2UgaWYgKHRyYWNlLT5kcy50b3AgPCB0b3ApIHsKKwkJLyoKKwkJICogV2UgaGFkIGEgYnVmZmVyIG92ZXJmbG93IC0gdGhlIGVudGlyZSBidWZmZXIgc2hvdWxkCisJCSAqIGNvbnRhaW4gdHJhY2UgcmVjb3Jkcy4KKwkJICovCisJCWNvbmYtPmVycm9yID0KKwkJCWRzX3NlbGZ0ZXN0X2J0c19yZWFkKGNvbmYtPnRyYWNlciwgdHJhY2UsCisJCQkJCSAgICAgdHJhY2UtPmRzLmJlZ2luLCB0cmFjZS0+ZHMuZW5kKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJdCBpcyBxdWl0ZSBsaWtlbHkgdGhhdCB0aGUgYnVmZmVyIGRpZCBub3Qgb3ZlcmZsb3cuCisJCSAqIExldCdzIGp1c3QgY2hlY2sgdGhlIGRlbHRhIHRyYWNlLgorCQkgKi8KKwkJY29uZi0+ZXJyb3IgPQorCQkJZHNfc2VsZnRlc3RfYnRzX3JlYWQoY29uZi0+dHJhY2VyLCB0cmFjZSwgdG9wLAorCQkJCQkgICAgIHRyYWNlLT5kcy50b3ApOworCX0KKwlpZiAoY29uZi0+ZXJyb3IgPCAwKQorCQlyZXR1cm47CisKKwljb25mLT5lcnJvciA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfc3VzcGVuZF9idHNfd3JhcChzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQoreworCWRzX3N1c3BlbmRfYnRzKHRyYWNlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfcmVzdW1lX2J0c193cmFwKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpCit7CisJZHNfcmVzdW1lX2J0cyh0cmFjZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc19yZWxlYXNlX2J0c19ub2lycV93cmFwKHZvaWQgKnRyYWNlcikKK3sKKwkodm9pZClkc19yZWxlYXNlX2J0c19ub2lycSh0cmFjZXIpOworfQorCitzdGF0aWMgaW50IGRzX3NlbGZ0ZXN0X2J0c19iYWRfcmVsZWFzZV9ub2lycShpbnQgY3B1LAorCQkJCQkgICAgIHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpCit7CisJaW50IGVycm9yID0gLUVQRVJNOworCisJLyogVHJ5IHRvIHJlbGVhc2UgdGhlIHRyYWNlciBvbiB0aGUgd3JvbmcgY3B1LiAqLworCWdldF9jcHUoKTsKKwlpZiAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQllcnJvciA9IGRzX3JlbGVhc2VfYnRzX25vaXJxKHRyYWNlcik7CisJCWlmIChlcnJvciAhPSAtRVBFUk0pCisJCQlwcmludGsoS0VSTl9DT05UICJyZWxlYXNlIG9uIHdyb25nIGNwdS4uLiIpOworCX0KKwlwdXRfY3B1KCk7CisKKwlyZXR1cm4gZXJyb3IgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgZHNfc2VsZnRlc3RfYnRzX2JhZF9yZXF1ZXN0X2NwdShpbnQgY3B1LCB2b2lkICpidWZmZXIpCit7CisJc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcjsKKwlpbnQgZXJyb3I7CisKKwkvKiBUcnkgdG8gcmVxdWVzdCBjcHUgdHJhY2luZyB3aGlsZSB0YXNrIHRyYWNpbmcgaXMgYWN0aXZlLiAqLworCXRyYWNlciA9IGRzX3JlcXVlc3RfYnRzX2NwdShjcHUsIGJ1ZmZlciwgQlVGRkVSX1NJWkUsIE5VTEwsCisJCQkJICAgIChzaXplX3QpLTEsIEJUU19LRVJORUwpOworCWVycm9yID0gUFRSX0VSUih0cmFjZXIpOworCWlmICghSVNfRVJSKHRyYWNlcikpIHsKKwkJZHNfcmVsZWFzZV9idHModHJhY2VyKTsKKwkJZXJyb3IgPSAwOworCX0KKworCWlmIChlcnJvciAhPSAtRVBFUk0pCisJCXByaW50ayhLRVJOX0NPTlQgImNwdS90YXNrIHRyYWNpbmcgb3ZlcmxhcC4uLiIpOworCisJcmV0dXJuIGVycm9yID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGRzX3NlbGZ0ZXN0X2J0c19iYWRfcmVxdWVzdF90YXNrKHZvaWQgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyOworCWludCBlcnJvcjsKKworCS8qIFRyeSB0byByZXF1ZXN0IGNwdSB0cmFjaW5nIHdoaWxlIHRhc2sgdHJhY2luZyBpcyBhY3RpdmUuICovCisJdHJhY2VyID0gZHNfcmVxdWVzdF9idHNfdGFzayhjdXJyZW50LCBidWZmZXIsIEJVRkZFUl9TSVpFLCBOVUxMLAorCQkJCSAgICAoc2l6ZV90KS0xLCBCVFNfS0VSTkVMKTsKKwllcnJvciA9IFBUUl9FUlIodHJhY2VyKTsKKwlpZiAoIUlTX0VSUih0cmFjZXIpKSB7CisJCWVycm9yID0gMDsKKwkJZHNfcmVsZWFzZV9idHModHJhY2VyKTsKKwl9CisKKwlpZiAoZXJyb3IgIT0gLUVQRVJNKQorCQlwcmludGsoS0VSTl9DT05UICJ0YXNrL2NwdSB0cmFjaW5nIG92ZXJsYXAuLi4iKTsKKworCXJldHVybiBlcnJvciA/IDAgOiAtMTsKK30KKworaW50IGRzX3NlbGZ0ZXN0X2J0cyh2b2lkKQoreworCXN0cnVjdCBkc19zZWxmdGVzdF9idHNfY29uZiBjb25mOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgKnNtYWxsX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGlycTsKKwlpbnQgY3B1OworCisJcHJpbnRrKEtFUk5fSU5GTyAiW2RzXSBidHMgc2VsZnRlc3QuLi4iKTsKKwljb25mLmVycm9yID0gMDsKKworCXNtYWxsX2J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopQUxJR04oKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCA4KSArIDg7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQljb25mLnN1c3BlbmQgPSBkc19zdXNwZW5kX2J0c193cmFwOworCQljb25mLnJlc3VtZSA9IGRzX3Jlc3VtZV9idHNfd3JhcDsKKwkJY29uZi50cmFjZXIgPQorCQkJZHNfcmVxdWVzdF9idHNfY3B1KGNwdSwgYnVmZmVyLCBCVUZGRVJfU0laRSwKKwkJCQkJICAgTlVMTCwgKHNpemVfdCktMSwgQlRTX0tFUk5FTCk7CisJCWRzX3NlbGZ0ZXN0X2J0c19jcHUoJmNvbmYpOworCQlpZiAoY29uZi5lcnJvciA+PSAwKQorCQkJY29uZi5lcnJvciA9IGRzX3NlbGZ0ZXN0X2J0c19iYWRfcmVxdWVzdF90YXNrKGJ1ZmZlcik7CisJCWRzX3JlbGVhc2VfYnRzKGNvbmYudHJhY2VyKTsKKwkJaWYgKGNvbmYuZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJY29uZi5zdXNwZW5kID0gZHNfc3VzcGVuZF9idHNfbm9pcnE7CisJCWNvbmYucmVzdW1lID0gZHNfcmVzdW1lX2J0c19ub2lycTsKKwkJY29uZi50cmFjZXIgPQorCQkJZHNfcmVxdWVzdF9idHNfY3B1KGNwdSwgYnVmZmVyLCBCVUZGRVJfU0laRSwKKwkJCQkJICAgTlVMTCwgKHNpemVfdCktMSwgQlRTX0tFUk5FTCk7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGRzX3NlbGZ0ZXN0X2J0c19jcHUsICZjb25mLCAxKTsKKwkJaWYgKGNvbmYuZXJyb3IgPj0gMCkgeworCQkJY29uZi5lcnJvciA9CisJCQkJZHNfc2VsZnRlc3RfYnRzX2JhZF9yZWxlYXNlX25vaXJxKGNwdSwKKwkJCQkJCQkJICBjb25mLnRyYWNlcik7CisJCQkvKiBXZSBtdXN0IG5vdCByZWxlYXNlIHRoZSB0cmFjZXIgdHdpY2UuICovCisJCQlpZiAoY29uZi5lcnJvciA8IDApCisJCQkJY29uZi50cmFjZXIgPSBOVUxMOworCQl9CisJCWlmIChjb25mLmVycm9yID49IDApCisJCQljb25mLmVycm9yID0gZHNfc2VsZnRlc3RfYnRzX2JhZF9yZXF1ZXN0X3Rhc2soYnVmZmVyKTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgZHNfcmVsZWFzZV9idHNfbm9pcnFfd3JhcCwKKwkJCQkJIGNvbmYudHJhY2VyLCAxKTsKKwkJaWYgKGNvbmYuZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJY29uZi5zdXNwZW5kID0gZHNfc3VzcGVuZF9idHNfd3JhcDsKKwljb25mLnJlc3VtZSA9IGRzX3Jlc3VtZV9idHNfd3JhcDsKKwljb25mLnRyYWNlciA9CisJCWRzX3JlcXVlc3RfYnRzX3Rhc2soY3VycmVudCwgYnVmZmVyLCBCVUZGRVJfU0laRSwKKwkJCQkgICAgTlVMTCwgKHNpemVfdCktMSwgQlRTX0tFUk5FTCk7CisJZHNfc2VsZnRlc3RfYnRzX2NwdSgmY29uZik7CisJaWYgKGNvbmYuZXJyb3IgPj0gMCkKKwkJY29uZi5lcnJvciA9IGRzX3NlbGZ0ZXN0X2J0c19iYWRfcmVxdWVzdF9jcHUoMCwgYnVmZmVyKTsKKwlkc19yZWxlYXNlX2J0cyhjb25mLnRyYWNlcik7CisJaWYgKGNvbmYuZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWNvbmYuc3VzcGVuZCA9IGRzX3N1c3BlbmRfYnRzX25vaXJxOworCWNvbmYucmVzdW1lID0gZHNfcmVzdW1lX2J0c19ub2lycTsKKwljb25mLnRyYWNlciA9CisJCWRzX3JlcXVlc3RfYnRzX3Rhc2soY3VycmVudCwgc21hbGxfYnVmZmVyLCBTTUFMTF9CVUZGRVJfU0laRSwKKwkJCQkgICBOVUxMLCAoc2l6ZV90KS0xLCBCVFNfS0VSTkVMKTsKKwlsb2NhbF9pcnFfc2F2ZShpcnEpOworCWRzX3NlbGZ0ZXN0X2J0c19jcHUoJmNvbmYpOworCWlmIChjb25mLmVycm9yID49IDApCisJCWNvbmYuZXJyb3IgPSBkc19zZWxmdGVzdF9idHNfYmFkX3JlcXVlc3RfY3B1KDAsIGJ1ZmZlcik7CisJZHNfcmVsZWFzZV9idHNfbm9pcnEoY29uZi50cmFjZXIpOworCWxvY2FsX2lycV9yZXN0b3JlKGlycSk7CisJaWYgKGNvbmYuZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWNvbmYuZXJyb3IgPSAwOworIG91dDoKKwlwdXRfb25saW5lX2NwdXMoKTsKKwlwcmludGsoS0VSTl9DT05UICIlcy5cbiIsIChjb25mLmVycm9yID8gImZhaWxlZCIgOiAicGFzc2VkIikpOworCisJcmV0dXJuIGNvbmYuZXJyb3I7Cit9CisKK2ludCBkc19zZWxmdGVzdF9wZWJzKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHNfc2VsZnRlc3QuaCBiL2FyY2gveDg2L2tlcm5lbC9kc19zZWxmdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTg3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHNfc2VsZnRlc3QuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogRGVidWcgU3RvcmUgc3VwcG9ydCAtIHNlbGZ0ZXN0CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIE1hcmt1cyBNZXR6Z2VyIDxtYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbT4sIDIwMDkKKyAqLworCisjaWZkZWYgQ09ORklHX1g4Nl9EU19TRUxGVEVTVAorZXh0ZXJuIGludCBkc19zZWxmdGVzdF9idHModm9pZCk7CitleHRlcm4gaW50IGRzX3NlbGZ0ZXN0X3BlYnModm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZHNfc2VsZnRlc3RfYnRzKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRzX3NlbGZ0ZXN0X3BlYnModm9pZCkgeyByZXR1cm4gMDsgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmggYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmgKaW5kZXggZGE4NzU5MGIuLjgxMDg2YzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmgKQEAgLTI5LDcgKzI5LDYgQEAKIAkJdW5zaWduZWQgbG9uZyAqc3AsIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpOwogCiBleHRlcm4gdW5zaWduZWQgaW50IGNvZGVfYnl0ZXM7Ci1leHRlcm4gaW50IGtzdGFja19kZXB0aF90b19wcmludDsKIAogLyogVGhlIGZvcm0gb2YgdGhlIHRvcCBvZiB0aGUgZnJhbWUgb24gdGhlIHN0YWNrICovCiBzdHJ1Y3Qgc3RhY2tfZnJhbWUgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2U4MjAuYyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKaW5kZXggMDA2MjgxMy4uNzI3MWZhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2U4MjAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCkBAIC02MTcsNyArNjE3LDcgQEAKICAqLwogX19pbml0IHZvaWQgZTgyMF9zZXR1cF9nYXAodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGdhcHN0YXJ0LCBnYXBzaXplLCByb3VuZDsKKwl1bnNpZ25lZCBsb25nIGdhcHN0YXJ0LCBnYXBzaXplOwogCWludCBmb3VuZDsKIAogCWdhcHN0YXJ0ID0gMHgxMDAwMDAwMDsKQEAgLTYzNSwxNCArNjM1LDkgQEAKICNlbmRpZgogCiAJLyoKLQkgKiBTZWUgaG93IG11Y2ggd2Ugd2FudCB0byByb3VuZCB1cDogc3RhcnQgb2ZmIHdpdGgKLQkgKiByb3VuZGluZyB0byB0aGUgbmV4dCAxTUIgYXJlYS4KKwkgKiBlODIwX3Jlc2VydmVfcmVzb3VyY2VzX2xhdGUgcHJvdGVjdCBzdG9sZW4gUkFNIGFscmVhZHkKIAkgKi8KLQlyb3VuZCA9IDB4MTAwMDAwOwotCXdoaWxlICgoZ2Fwc2l6ZSA+PiA0KSA+IHJvdW5kKQotCQlyb3VuZCArPSByb3VuZDsKLQkvKiBGdW4gd2l0aCB0d28ncyBjb21wbGVtZW50ICovCi0JcGNpX21lbV9zdGFydCA9IChnYXBzdGFydCArIHJvdW5kKSAmIC1yb3VuZDsKKwlwY2lfbWVtX3N0YXJ0ID0gZ2Fwc3RhcnQ7CiAKIAlwcmludGsoS0VSTl9JTkZPCiAJICAgICAgICJBbGxvY2F0aW5nIFBDSSByZXNvdXJjZXMgc3RhcnRpbmcgYXQgJWx4IChnYXA6ICVseDolbHgpXG4iLApAQCAtMTM3MSw2ICsxMzY2LDIzIEBACiAJfQogfQogCisvKiBIb3cgbXVjaCBzaG91bGQgd2UgcGFkIFJBTSBlbmRpbmcgZGVwZW5kaW5nIG9uIHdoZXJlIGl0IGlzPyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFtX2FsaWdubWVudChyZXNvdXJjZV9zaXplX3QgcG9zKQoreworCXVuc2lnbmVkIGxvbmcgbWIgPSBwb3MgPj4gMjA7CisKKwkvKiBUbyA2NGtCIGluIHRoZSBmaXJzdCBtZWdhYnl0ZSAqLworCWlmICghbWIpCisJCXJldHVybiA2NCoxMDI0OworCisJLyogVG8gMU1CIGluIHRoZSBmaXJzdCAxNk1CICovCisJaWYgKG1iIDwgMTYpCisJCXJldHVybiAxMDI0KjEwMjQ7CisKKwkvKiBUbyAzMk1CIGZvciBhbnl0aGluZyBhYm92ZSB0aGF0ICovCisJcmV0dXJuIDMyKjEwMjQqMTAyNDsKK30KKwogdm9pZCBfX2luaXQgZTgyMF9yZXNlcnZlX3Jlc291cmNlc19sYXRlKHZvaWQpCiB7CiAJaW50IGk7CkBAIC0xMzgyLDYgKzEzOTQsMjQgQEAKIAkJCWluc2VydF9yZXNvdXJjZV9leHBhbmRfdG9fZml0KCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKIAkJcmVzKys7CiAJfQorCisJLyoKKwkgKiBUcnkgdG8gYnVtcCB1cCBSQU0gcmVnaW9ucyB0byByZWFzb25hYmxlIGJvdW5kYXJpZXMgdG8KKwkgKiBhdm9pZCBzdG9sZW4gUkFNOgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVudHJ5ID0gJmU4MjBfc2F2ZWQubWFwW2ldOworCQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZDsKKworCQlpZiAoZW50cnktPnR5cGUgIT0gRTgyMF9SQU0pCisJCQljb250aW51ZTsKKwkJc3RhcnQgPSBlbnRyeS0+YWRkciArIGVudHJ5LT5zaXplOworCQllbmQgPSByb3VuZF91cChzdGFydCwgcmFtX2FsaWdubWVudChzdGFydCkpOworCQlpZiAoc3RhcnQgPT0gZW5kKQorCQkJY29udGludWU7CisJCXJlc2VydmVfcmVnaW9uX3dpdGhfc3BsaXQoJmlvbWVtX3Jlc291cmNlLCBzdGFydCwKKwkJCQkJCSAgZW5kIC0gMSwgIlJBTSBidWZmZXIiKTsKKwl9CiB9CiAKIGNoYXIgKl9faW5pdCBkZWZhdWx0X21hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKaW5kZXggNzZiOGNkOS4uZWJkYjg1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwpAQCAtOTcsNiArOTcsNyBAQAogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgJiYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgJiYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpCiBzdGF0aWMgdTMyIF9faW5pdCBhdGlfaXhwNHgwX3JldihpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMpCiB7CiAJdTMyIGQ7CkBAIC0xMTQsNiArMTE1LDcgQEAKIAlkICY9IDB4ZmY7CiAJcmV0dXJuIGQ7CiB9CisjZW5kaWYKIAogc3RhdGljIHZvaWQgX19pbml0IGF0aV9idWdzKGludCBudW0sIGludCBzbG90LCBpbnQgZnVuYykKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggMzg5NDZjNi4uYTQ3NDJhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKQEAgLTE0NywyNyArMTQ3LDE0IEBACiBHTE9CQUwocmV0dXJuX3RvX2hhbmRsZXIpCiAJc3VicSAgJDgwLCAlcnNwCiAKKwkvKiBTYXZlIHRoZSByZXR1cm4gdmFsdWVzICovCiAJbW92cSAlcmF4LCAoJXJzcCkKLQltb3ZxICVyY3gsIDgoJXJzcCkKLQltb3ZxICVyZHgsIDE2KCVyc3ApCi0JbW92cSAlcnNpLCAyNCglcnNwKQotCW1vdnEgJXJkaSwgMzIoJXJzcCkKLQltb3ZxICVyOCwgNDAoJXJzcCkKLQltb3ZxICVyOSwgNDgoJXJzcCkKLQltb3ZxICVyMTAsIDU2KCVyc3ApCi0JbW92cSAlcjExLCA2NCglcnNwKQorCW1vdnEgJXJkeCwgOCglcnNwKQogCiAJY2FsbCBmdHJhY2VfcmV0dXJuX3RvX2hhbmRsZXIKIAogCW1vdnEgJXJheCwgNzIoJXJzcCkKLQltb3ZxIDY0KCVyc3ApLCAlcjExCi0JbW92cSA1NiglcnNwKSwgJXIxMAotCW1vdnEgNDgoJXJzcCksICVyOQotCW1vdnEgNDAoJXJzcCksICVyOAotCW1vdnEgMzIoJXJzcCksICVyZGkKLQltb3ZxIDI0KCVyc3ApLCAlcnNpCi0JbW92cSAxNiglcnNwKSwgJXJkeAotCW1vdnEgOCglcnNwKSwgJXJjeAorCW1vdnEgOCglcnNwKSwgJXJkeAogCW1vdnEgKCVyc3ApLCAlcmF4CiAJYWRkcSAkNzIsICVyc3AKIAlyZXRxCkBAIC0xMDI1LDYgKzEwMTIsMTEgQEAKIGFwaWNpbnRlcnJ1cHQgU1BVUklPVVNfQVBJQ19WRUNUT1IgXAogCXNwdXJpb3VzX2ludGVycnVwdCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0CiAKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworYXBpY2ludGVycnVwdCBMT0NBTF9QRU5ESU5HX1ZFQ1RPUiBcCisJcGVyZl9wZW5kaW5nX2ludGVycnVwdCBzbXBfcGVyZl9wZW5kaW5nX2ludGVycnVwdAorI2VuZGlmCisKIC8qCiAgKiBFeGNlcHRpb24gZW50cnkgcG9pbnRzLgogICovCkBAIC0xMzc5LDYgKzEzNzEsMTEgQEAKIHBhcmFub2lkemVyb2VudHJ5X2lzdCBkZWJ1ZyBkb19kZWJ1ZyBERUJVR19TVEFDSwogcGFyYW5vaWR6ZXJvZW50cnlfaXN0IGludDMgZG9faW50MyBERUJVR19TVEFDSwogcGFyYW5vaWRlcnJvcmVudHJ5IHN0YWNrX3NlZ21lbnQgZG9fc3RhY2tfc2VnbWVudAorI2lmZGVmIENPTkZJR19YRU4KK3plcm9lbnRyeSB4ZW5fZGVidWcgZG9fZGVidWcKK3plcm9lbnRyeSB4ZW5faW50MyBkb19pbnQzCitlcnJvcmVudHJ5IHhlbl9zdGFja19zZWdtZW50IGRvX3N0YWNrX3NlZ21lbnQKKyNlbmRpZgogZXJyb3JlbnRyeSBnZW5lcmFsX3Byb3RlY3Rpb24gZG9fZ2VuZXJhbF9wcm90ZWN0aW9uCiBlcnJvcmVudHJ5IHBhZ2VfZmF1bHQgZG9fcGFnZV9mYXVsdAogI2lmZGVmIENPTkZJR19YODZfTUNFCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUwppbmRleCAzMDY4Mzg4Li5kYzVlZDRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKQEAgLTYwOCwxMyArNjA4LDYgQEAKIEVOVFJZKGluaXRpYWxfY29kZSkKIAkubG9uZyBpMzg2X3N0YXJ0X2tlcm5lbAogCi0uc2VjdGlvbiAudGV4dAotLyoKLSAqIFJlYWwgYmVnaW5uaW5nIG9mIG5vcm1hbCAidGV4dCIgc2VnbWVudAotICovCi1FTlRSWShzdGV4dCkKLUVOVFJZKF9zdGV4dCkKLQogLyoKICAqIEJTUyBzZWN0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwppbmRleCBjM2ZlMDEwLi4zODI4N2I1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lkbGUuaD4KKyNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAKIGF0b21pY190IGlycV9lcnJfY291bnQ7CiAKQEAgLTI0LDkgKzI1LDkgQEAKICAqLwogdm9pZCBhY2tfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBJUlEgdHJhcCBhdCB2ZWN0b3IgJTAyeFxuIiwgaXJxKTsKKwlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQlwcl9lcnIoInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAkvKgogCSAqIEN1cnJlbnRseSB1bmV4cGVjdGVkIHZlY3RvcnMgaGFwcGVuIG9ubHkgb24gU01QIGFuZCBBUElDLgogCSAqIFdlIF9tdXN0XyBhY2sgdGhlc2UgYmVjYXVzZSBldmVyeSBsb2NhbCBBUElDIGhhcyBvbmx5IE4KQEAgLTM2LDkgKzM3LDcgQEAKIAkgKiBjb21wbGV0ZWx5LgogCSAqIEJ1dCBvbmx5IGFjayB3aGVuIHRoZSBBUElDIGlzIGVuYWJsZWQgLUFLCiAJICovCi0JaWYgKGNwdV9oYXNfYXBpYykKLQkJYWNrX0FQSUNfaXJxKCk7Ci0jZW5kaWYKKwlhY2tfQVBJQ19pcnEoKTsKIH0KIAogI2RlZmluZSBpcnFfc3RhdHMoeCkJCSgmcGVyX2NwdShpcnFfc3RhdCwgeCkpCkBAIC02Myw2ICs2MiwxNCBAQAogCWZvcl9lYWNoX29ubGluZV9jcHUoaikKIAkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBpcnFfc3RhdHMoaiktPmlycV9zcHVyaW91c19jb3VudCk7CiAJc2VxX3ByaW50ZihwLCAiICBTcHVyaW91cyBpbnRlcnJ1cHRzXG4iKTsKKwlzZXFfcHJpbnRmKHAsICIlKnM6ICIsIHByZWMsICJDTlQiKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgaXJxX3N0YXRzKGopLT5hcGljX3BlcmZfaXJxcyk7CisJc2VxX3ByaW50ZihwLCAiICBQZXJmb3JtYW5jZSBjb3VudGVyIGludGVycnVwdHNcbiIpOworCXNlcV9wcmludGYocCwgIiUqczogIiwgcHJlYywgIlBORCIpOworCWZvcl9lYWNoX29ubGluZV9jcHUoaikKKwkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBpcnFfc3RhdHMoaiktPmFwaWNfcGVuZGluZ19pcnFzKTsKKwlzZXFfcHJpbnRmKHAsICIgIFBlcmZvcm1hbmNlIHBlbmRpbmcgd29ya1xuIik7CiAjZW5kaWYKIAlpZiAoZ2VuZXJpY19pbnRlcnJ1cHRfZXh0ZW5zaW9uKSB7CiAJCXNlcV9wcmludGYocCwgIiUqczogIiwgcHJlYywgIlBMVCIpOwpAQCAtMTY2LDYgKzE3Myw4IEBACiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5hcGljX3RpbWVyX2lycXM7CiAJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5pcnFfc3B1cmlvdXNfY291bnQ7CisJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5hcGljX3BlcmZfaXJxczsKKwlzdW0gKz0gaXJxX3N0YXRzKGNwdSktPmFwaWNfcGVuZGluZ19pcnFzOwogI2VuZGlmCiAJaWYgKGdlbmVyaWNfaW50ZXJydXB0X2V4dGVuc2lvbikKIAkJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5nZW5lcmljX2lycXM7CkBAIC0xNzgsNyArMTg3LDcgQEAKIAlzdW0gKz0gaXJxX3N0YXRzKGNwdSktPmlycV90aGVybWFsX2NvdW50OwogIyBpZmRlZiBDT05GSUdfWDg2XzY0CiAJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5pcnFfdGhyZXNob2xkX2NvdW50OwotI2VuZGlmCisjIGVuZGlmCiAjZW5kaWYKIAlyZXR1cm4gc3VtOwogfQpAQCAtMjEzLDE0ICsyMjIsMTEgQEAKIAlpcnEgPSBfX2dldF9jcHVfdmFyKHZlY3Rvcl9pcnEpW3ZlY3Rvcl07CiAKIAlpZiAoIWhhbmRsZV9pcnEoaXJxLCByZWdzKSkgewotI2lmZGVmIENPTkZJR19YODZfNjQKLQkJaWYgKCFkaXNhYmxlX2FwaWMpCi0JCQlhY2tfQVBJQ19pcnEoKTsKLSNlbmRpZgorCQlhY2tfQVBJQ19pcnEoKTsKIAogCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiAlZC4lZCBObyBpcnEgaGFuZGxlciBmb3IgdmVjdG9yIChpcnEgJWQpXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBzbXBfcHJvY2Vzc29yX2lkKCksIHZlY3RvciwgaXJxKTsKKwkJCXByX2VtZXJnKCIlczogJWQuJWQgTm8gaXJxIGhhbmRsZXIgZm9yIHZlY3RvciAoaXJxICVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgc21wX3Byb2Nlc3Nvcl9pZCgpLCB2ZWN0b3IsIGlycSk7CiAJfQogCiAJaXJxX2V4aXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdC5jCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIGFyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMKcmVuYW1lIHRvIGFyY2gveDg2L2tlcm5lbC9pcnFpbml0LmMKaW5kZXggMzY4YjBhOC4uMjY3YzY2MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycWluaXRfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdC5jCkBAIC0xLDIwICsxLDI1IEBACisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgpAQCAtMjIsOCArMjcsMjQgQEAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIAorLyoKKyAqIElTQSBQSUMgb3IgbG93IElPLUFQSUMgdHJpZ2dlcmVkIChJTlRBLWN5Y2xlIG9yIEFQSUMpIGludGVycnVwdHM6CisgKiAodGhlc2UgYXJlIHVzdWFsbHkgbWFwcGVkIHRvIHZlY3RvcnMgMHgzMC0weDNmKQorICovCiAKIC8qCisgKiBUaGUgSU8tQVBJQyBnaXZlcyB1cyBtYW55IG1vcmUgaW50ZXJydXB0IHNvdXJjZXMuIE1vc3Qgb2YgdGhlc2UKKyAqIGFyZSB1bnVzZWQgYnV0IGFuIFNNUCBzeXN0ZW0gaXMgc3VwcG9zZWQgdG8gaGF2ZSBlbm91Z2ggbWVtb3J5IC4uLgorICogc29tZXRpbWVzIChtb3N0bHkgd3J0LiBodyBidWdzKSB3ZSBnZXQgY29ycnVwdGVkIHZlY3RvcnMgYWxsCisgKiBhY3Jvc3MgdGhlIHNwZWN0cnVtLCBzbyB3ZSByZWFsbHkgd2FudCB0byBiZSBwcmVwYXJlZCB0byBnZXQgYWxsCisgKiBvZiB0aGVzZS4gUGx1cywgbW9yZSBwb3dlcmZ1bCBzeXN0ZW1zIG1pZ2h0IGhhdmUgbW9yZSB0aGFuIDY0CisgKiBJTy1BUElDIHJlZ2lzdGVycy4KKyAqCisgKiAodGhlc2UgYXJlIHVzdWFsbHkgbWFwcGVkIGludG8gdGhlIDB4MzAtMHhmZiB2ZWN0b3IgcmFuZ2UpCisgKi8KKworI2lmZGVmIENPTkZJR19YODZfMzIKKy8qCiAgKiBOb3RlIHRoYXQgb24gYSA0ODYsIHdlIGRvbid0IHdhbnQgdG8gZG8gYSBTSUdGUEUgb24gYW4gaXJxMTMKICAqIGFzIHRoZSBpcnEgaXMgdW5yZWxpYWJsZSwgYW5kIGV4Y2VwdGlvbiAxNiB3b3JrcyBjb3JyZWN0bHkKICAqIChpZSBhcyBleHBsYWluZWQgaW4gdGhlIGludGVsIGxpdGVyYXR1cmUpLiBPbiBhIDM4NiwgeW91CkBAIC01MiwzMCArNzMsNyBAQAogCS5oYW5kbGVyID0gbWF0aF9lcnJvcl9pcnEsCiAJLm5hbWUgPSAiZnB1IiwKIH07Ci0KLXZvaWQgX19pbml0IGluaXRfSVNBX2lycXModm9pZCkKLXsKLQlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCWluaXRfYnNwX0FQSUMoKTsKICNlbmRpZgotCWluaXRfODI1OUEoMCk7Ci0KLQkvKgotCSAqIDE2IG9sZC1zdHlsZSBJTlRBLWN5Y2xlIGludGVycnVwdHM6Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVNfTEVHQUNZOyBpKyspIHsKLQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaSk7Ci0KLQkJZGVzYy0+c3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlkZXNjLT5hY3Rpb24gPSBOVUxMOwotCQlkZXNjLT5kZXB0aCA9IDE7Ci0KLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaSwgJmk4MjU5QV9jaGlwLAotCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAiWFQiKTsKLQl9Ci19CiAKIC8qCiAgKiBJUlEyIGlzIGNhc2NhZGUgaW50ZXJydXB0IHRvIHNlY29uZCBpbnRlcnJ1cHQgY29udHJvbGxlcgpAQCAtMTE4LDI5ICsxMTYsMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogT3ZlcnJpZGRlbiBpbiBwYXJhdmlydC5jICovCi12b2lkIGluaXRfSVJRKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJuYXRpdmVfaW5pdF9JUlEiKSkpOwotCi12b2lkIF9faW5pdCBuYXRpdmVfaW5pdF9JUlEodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X0lTQV9pcnFzKHZvaWQpCiB7CiAJaW50IGk7CiAKLQkvKiBFeGVjdXRlIGFueSBxdWlya3MgYmVmb3JlIHRoZSBjYWxsIGdhdGVzIGFyZSBpbml0aWFsaXNlZDogKi8KLQl4ODZfcXVpcmtfcHJlX2ludHJfaW5pdCgpOworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCisJaW5pdF9ic3BfQVBJQygpOworI2VuZGlmCisJaW5pdF84MjU5QSgwKTsKIAogCS8qCi0JICogQ292ZXIgdGhlIHdob2xlIHZlY3RvciBzcGFjZSwgbm8gdmVjdG9yIGNhbiBlc2NhcGUKLQkgKiB1cy4gKHNvbWUgb2YgdGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGFuZCBiZWNvbWUKLQkgKiAnc3BlY2lhbCcgU01QIGludGVycnVwdHMpCisJICogMTYgb2xkLXN0eWxlIElOVEEtY3ljbGUgaW50ZXJydXB0czoKIAkgKi8KLQlmb3IgKGkgPSAgRklSU1RfRVhURVJOQUxfVkVDVE9SOyBpIDwgTlJfVkVDVE9SUzsgaSsrKSB7Ci0JCS8qIFNZU0NBTExfVkVDVE9SIHdhcyByZXNlcnZlZCBpbiB0cmFwX2luaXQuICovCi0JCWlmIChpICE9IFNZU0NBTExfVkVDVE9SKQotCQkJc2V0X2ludHJfZ2F0ZShpLCBpbnRlcnJ1cHRbaS1GSVJTVF9FWFRFUk5BTF9WRUNUT1JdKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRU19MRUdBQ1k7IGkrKykgeworCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpKTsKKworCQlkZXNjLT5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7CisJCWRlc2MtPmFjdGlvbiA9IE5VTEw7CisJCWRlc2MtPmRlcHRoID0gMTsKKworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpLCAmaTgyNTlBX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJYVCIpOwogCX0KK30KIAorLyogT3ZlcnJpZGRlbiBpbiBwYXJhdmlydC5jICovCit2b2lkIGluaXRfSVJRKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJuYXRpdmVfaW5pdF9JUlEiKSkpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfaW50cl9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCiAJLyoKIAkgKiBUaGUgcmVzY2hlZHVsZSBpbnRlcnJ1cHQgaXMgYSBDUFUtdG8tQ1BVIHJlc2NoZWR1bGUtaGVscGVyCiAJICogSVBJLCBkcml2ZW4gYnkgd2FrZXVwLgpAQCAtMTYwLDE2ICsxNjYsMzIgQEAKIAkvKiBJUEkgZm9yIGdlbmVyaWMgZnVuY3Rpb24gY2FsbCAqLwogCWFsbG9jX2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1ZFQ1RPUiwgY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQpOwogCi0JLyogSVBJIGZvciBzaW5nbGUgY2FsbCBmdW5jdGlvbiAqLworCS8qIElQSSBmb3IgZ2VuZXJpYyBzaW5nbGUgZnVuY3Rpb24gY2FsbCAqLwogCWFsbG9jX2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1NJTkdMRV9WRUNUT1IsCi0JCQkJIGNhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCk7CisJCQljYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQpOwogCiAJLyogTG93IHByaW9yaXR5IElQSSB0byBjbGVhbnVwIGFmdGVyIG1vdmluZyBhbiBpcnEgKi8KIAlzZXRfaW50cl9nYXRlKElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SLCBpcnFfbW92ZV9jbGVhbnVwX2ludGVycnVwdCk7CiAJc2V0X2JpdChJUlFfTU9WRV9DTEVBTlVQX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKICNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KK30KIAotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworc3RhdGljIHZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCit7CisJc21wX2ludHJfaW5pdCgpOworCisjaWZkZWYgQ09ORklHX1g4Nl9USEVSTUFMX1ZFQ1RPUgorCWFsbG9jX2ludHJfZ2F0ZShUSEVSTUFMX0FQSUNfVkVDVE9SLCB0aGVybWFsX2ludGVycnVwdCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2X1RIUkVTSE9MRAorCWFsbG9jX2ludHJfZ2F0ZShUSFJFU0hPTERfQVBJQ19WRUNUT1IsIHRocmVzaG9sZF9pbnRlcnJ1cHQpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X05FV19NQ0UpICYmIGRlZmluZWQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQorCWFsbG9jX2ludHJfZ2F0ZShNQ0VfU0VMRl9WRUNUT1IsIG1jZV9zZWxmX2ludGVycnVwdCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCiAJLyogc2VsZiBnZW5lcmF0ZWQgSVBJIGZvciBsb2NhbCBBUElDIHRpbWVyICovCiAJYWxsb2NfaW50cl9nYXRlKExPQ0FMX1RJTUVSX1ZFQ1RPUiwgYXBpY190aW1lcl9pbnRlcnJ1cHQpOwogCkBAIC0xNzksMTYgKzIwMSw1OSBAQAogCS8qIElQSSB2ZWN0b3JzIGZvciBBUElDIHNwdXJpb3VzIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCiAJYWxsb2NfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOwogCWFsbG9jX2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKLSNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMKQotCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCi0JYWxsb2NfaW50cl9nYXRlKFRIRVJNQUxfQVBJQ19WRUNUT1IsIHRoZXJtYWxfaW50ZXJydXB0KTsKKwkvKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGludGVycnVwdHM6ICovCisjIGlmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCisJYWxsb2NfaW50cl9nYXRlKExPQ0FMX1BFTkRJTkdfVkVDVE9SLCBwZXJmX3BlbmRpbmdfaW50ZXJydXB0KTsKKyMgZW5kaWYKKwogI2VuZGlmCit9CisKKy8qKgorICogeDg2X3F1aXJrX3ByZV9pbnRyX2luaXQgLSBpbml0aWFsaXNhdGlvbiBwcmlvciB0byBzZXR0aW5nIHVwIGludGVycnVwdCB2ZWN0b3JzCisgKgorICogRGVzY3JpcHRpb246CisgKglQZXJmb3JtIGFueSBuZWNlc3NhcnkgaW50ZXJydXB0IGluaXRpYWxpc2F0aW9uIHByaW9yIHRvIHNldHRpbmcgdXAKKyAqCXRoZSAib3JkaW5hcnkiIGludGVycnVwdCBjYWxsIGdhdGVzLiAgRm9yIGxlZ2FjeSByZWFzb25zLCB0aGUgSVNBCisgKglpbnRlcnJ1cHRzIHNob3VsZCBiZSBpbml0aWFsaXNlZCBoZXJlIGlmIHRoZSBtYWNoaW5lIGVtdWxhdGVzIGEgUEMKKyAqCWluIGFueSB3YXkuCisgKiovCitzdGF0aWMgdm9pZCBfX2luaXQgeDg2X3F1aXJrX3ByZV9pbnRyX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJaWYgKHg4Nl9xdWlya3MtPmFyY2hfcHJlX2ludHJfaW5pdCkgeworCQlpZiAoeDg2X3F1aXJrcy0+YXJjaF9wcmVfaW50cl9pbml0KCkpCisJCQlyZXR1cm47CisJfQorI2VuZGlmCisJaW5pdF9JU0FfaXJxcygpOworfQorCit2b2lkIF9faW5pdCBuYXRpdmVfaW5pdF9JUlEodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIEV4ZWN1dGUgYW55IHF1aXJrcyBiZWZvcmUgdGhlIGNhbGwgZ2F0ZXMgYXJlIGluaXRpYWxpc2VkOiAqLworCXg4Nl9xdWlya19wcmVfaW50cl9pbml0KCk7CisKKwlhcGljX2ludHJfaW5pdCgpOworCisJLyoKKwkgKiBDb3ZlciB0aGUgd2hvbGUgdmVjdG9yIHNwYWNlLCBubyB2ZWN0b3IgY2FuIGVzY2FwZQorCSAqIHVzLiAoc29tZSBvZiB0aGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIGJlY29tZQorCSAqICdzcGVjaWFsJyBTTVAgaW50ZXJydXB0cykKKwkgKi8KKwlmb3IgKGkgPSBGSVJTVF9FWFRFUk5BTF9WRUNUT1I7IGkgPCBOUl9WRUNUT1JTOyBpKyspIHsKKwkJLyogSUEzMl9TWVNDQUxMX1ZFQ1RPUiBjb3VsZCBiZSB1c2VkIGluIHRyYXBfaW5pdCBhbHJlYWR5LiAqLworCQlpZiAoIXRlc3RfYml0KGksIHVzZWRfdmVjdG9ycykpCisJCQlzZXRfaW50cl9nYXRlKGksIGludGVycnVwdFtpLUZJUlNUX0VYVEVSTkFMX1ZFQ1RPUl0pOworCX0KIAogCWlmICghYWNwaV9pb2FwaWMpCiAJCXNldHVwX2lycSgyLCAmaXJxMik7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzMyCiAJLyoKIAkgKiBDYWxsIHF1aXJrcyBhZnRlciBjYWxsIGdhdGVzIGFyZSBpbml0aWFsaXNlZCAodXN1YWxseSBhZGQgaW4KIAkgKiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGdhdGVzKToKQEAgLTIwMyw0ICsyNjgsNSBAQAogCQlzZXR1cF9pcnEoRlBVX0lSUSwgJmZwdV9pcnEpOwogCiAJaXJxX2N0eF9pbml0KHNtcF9wcm9jZXNzb3JfaWQoKSk7CisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF82NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2QxMDUzLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2h3X2lycS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2Rlc2MuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9pODI1OS5oPgotCi0vKgotICogSVNBIFBJQyBvciBsb3cgSU8tQVBJQyB0cmlnZ2VyZWQgKElOVEEtY3ljbGUgb3IgQVBJQykgaW50ZXJydXB0czoKLSAqICh0aGVzZSBhcmUgdXN1YWxseSBtYXBwZWQgdG8gdmVjdG9ycyAweDMwLTB4M2YpCi0gKi8KLQotLyoKLSAqIFRoZSBJTy1BUElDIGdpdmVzIHVzIG1hbnkgbW9yZSBpbnRlcnJ1cHQgc291cmNlcy4gTW9zdCBvZiB0aGVzZQotICogYXJlIHVudXNlZCBidXQgYW4gU01QIHN5c3RlbSBpcyBzdXBwb3NlZCB0byBoYXZlIGVub3VnaCBtZW1vcnkgLi4uCi0gKiBzb21ldGltZXMgKG1vc3RseSB3cnQuIGh3IGJ1Z3MpIHdlIGdldCBjb3JydXB0ZWQgdmVjdG9ycyBhbGwKLSAqIGFjcm9zcyB0aGUgc3BlY3RydW0sIHNvIHdlIHJlYWxseSB3YW50IHRvIGJlIHByZXBhcmVkIHRvIGdldCBhbGwKLSAqIG9mIHRoZXNlLiBQbHVzLCBtb3JlIHBvd2VyZnVsIHN5c3RlbXMgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gNjQKLSAqIElPLUFQSUMgcmVnaXN0ZXJzLgotICoKLSAqICh0aGVzZSBhcmUgdXN1YWxseSBtYXBwZWQgaW50byB0aGUgMHgzMC0weGZmIHZlY3RvciByYW5nZSkKLSAqLwotCi0vKgotICogSVJRMiBpcyBjYXNjYWRlIGludGVycnVwdCB0byBzZWNvbmQgaW50ZXJydXB0IGNvbnRyb2xsZXIKLSAqLwotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEyID0gewotCS5oYW5kbGVyID0gbm9fYWN0aW9uLAotCS5uYW1lID0gImNhc2NhZGUiLAotfTsKLURFRklORV9QRVJfQ1BVKHZlY3Rvcl9pcnFfdCwgdmVjdG9yX2lycSkgPSB7Ci0JWzAgLi4uIElSUTBfVkVDVE9SIC0gMV0gPSAtMSwKLQlbSVJRMF9WRUNUT1JdID0gMCwKLQlbSVJRMV9WRUNUT1JdID0gMSwKLQlbSVJRMl9WRUNUT1JdID0gMiwKLQlbSVJRM19WRUNUT1JdID0gMywKLQlbSVJRNF9WRUNUT1JdID0gNCwKLQlbSVJRNV9WRUNUT1JdID0gNSwKLQlbSVJRNl9WRUNUT1JdID0gNiwKLQlbSVJRN19WRUNUT1JdID0gNywKLQlbSVJROF9WRUNUT1JdID0gOCwKLQlbSVJROV9WRUNUT1JdID0gOSwKLQlbSVJRMTBfVkVDVE9SXSA9IDEwLAotCVtJUlExMV9WRUNUT1JdID0gMTEsCi0JW0lSUTEyX1ZFQ1RPUl0gPSAxMiwKLQlbSVJRMTNfVkVDVE9SXSA9IDEzLAotCVtJUlExNF9WRUNUT1JdID0gMTQsCi0JW0lSUTE1X1ZFQ1RPUl0gPSAxNSwKLQlbSVJRMTVfVkVDVE9SICsgMSAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTEKLX07Ci0KLWludCB2ZWN0b3JfdXNlZF9ieV9wZXJjcHVfaXJxKHVuc2lnbmVkIGludCB2ZWN0b3IpCi17Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWlmIChwZXJfY3B1KHZlY3Rvcl9pcnEsIGNwdSlbdmVjdG9yXSAhPSAtMSkKLQkJCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9JU0FfaXJxcyh2b2lkKQotewotCWludCBpOwotCi0JaW5pdF9ic3BfQVBJQygpOwotCWluaXRfODI1OUEoMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRU19MRUdBQ1k7IGkrKykgewotCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpKTsKLQotCQlkZXNjLT5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWRlc2MtPmFjdGlvbiA9IE5VTEw7Ci0JCWRlc2MtPmRlcHRoID0gMTsKLQotCQkvKgotCQkgKiAxNiBvbGQtc3R5bGUgSU5UQS1jeWNsZSBpbnRlcnJ1cHRzOgotCQkgKi8KLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaSwgJmk4MjU5QV9jaGlwLAotCQkJCQkJICAgICAgaGFuZGxlX2xldmVsX2lycSwgIlhUIik7Ci0JfQotfQotCi12b2lkIGluaXRfSVJRKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJuYXRpdmVfaW5pdF9JUlEiKSkpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc21wX2ludHJfaW5pdCh2b2lkKQotewotI2lmZGVmIENPTkZJR19TTVAKLQkvKgotCSAqIFRoZSByZXNjaGVkdWxlIGludGVycnVwdCBpcyBhIENQVS10by1DUFUgcmVzY2hlZHVsZS1oZWxwZXIKLQkgKiBJUEksIGRyaXZlbiBieSB3YWtldXAuCi0JICovCi0JYWxsb2NfaW50cl9nYXRlKFJFU0NIRURVTEVfVkVDVE9SLCByZXNjaGVkdWxlX2ludGVycnVwdCk7Ci0KLQkvKiBJUElzIGZvciBpbnZhbGlkYXRpb24gKi8KLQlhbGxvY19pbnRyX2dhdGUoSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUKzAsIGludmFsaWRhdGVfaW50ZXJydXB0MCk7Ci0JYWxsb2NfaW50cl9nYXRlKElOVkFMSURBVEVfVExCX1ZFQ1RPUl9TVEFSVCsxLCBpbnZhbGlkYXRlX2ludGVycnVwdDEpOwotCWFsbG9jX2ludHJfZ2F0ZShJTlZBTElEQVRFX1RMQl9WRUNUT1JfU1RBUlQrMiwgaW52YWxpZGF0ZV9pbnRlcnJ1cHQyKTsKLQlhbGxvY19pbnRyX2dhdGUoSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUKzMsIGludmFsaWRhdGVfaW50ZXJydXB0Myk7Ci0JYWxsb2NfaW50cl9nYXRlKElOVkFMSURBVEVfVExCX1ZFQ1RPUl9TVEFSVCs0LCBpbnZhbGlkYXRlX2ludGVycnVwdDQpOwotCWFsbG9jX2ludHJfZ2F0ZShJTlZBTElEQVRFX1RMQl9WRUNUT1JfU1RBUlQrNSwgaW52YWxpZGF0ZV9pbnRlcnJ1cHQ1KTsKLQlhbGxvY19pbnRyX2dhdGUoSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUKzYsIGludmFsaWRhdGVfaW50ZXJydXB0Nik7Ci0JYWxsb2NfaW50cl9nYXRlKElOVkFMSURBVEVfVExCX1ZFQ1RPUl9TVEFSVCs3LCBpbnZhbGlkYXRlX2ludGVycnVwdDcpOwotCi0JLyogSVBJIGZvciBnZW5lcmljIGZ1bmN0aW9uIGNhbGwgKi8KLQlhbGxvY19pbnRyX2dhdGUoQ0FMTF9GVU5DVElPTl9WRUNUT1IsIGNhbGxfZnVuY3Rpb25faW50ZXJydXB0KTsKLQotCS8qIElQSSBmb3IgZ2VuZXJpYyBzaW5nbGUgZnVuY3Rpb24gY2FsbCAqLwotCWFsbG9jX2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1NJTkdMRV9WRUNUT1IsCi0JCQljYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQpOwotCi0JLyogTG93IHByaW9yaXR5IElQSSB0byBjbGVhbnVwIGFmdGVyIG1vdmluZyBhbiBpcnEgKi8KLQlzZXRfaW50cl9nYXRlKElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SLCBpcnFfbW92ZV9jbGVhbnVwX2ludGVycnVwdCk7Ci0Jc2V0X2JpdChJUlFfTU9WRV9DTEVBTlVQX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXBpY19pbnRyX2luaXQodm9pZCkKLXsKLQlzbXBfaW50cl9pbml0KCk7Ci0KLQlhbGxvY19pbnRyX2dhdGUoVEhFUk1BTF9BUElDX1ZFQ1RPUiwgdGhlcm1hbF9pbnRlcnJ1cHQpOwotCWFsbG9jX2ludHJfZ2F0ZShUSFJFU0hPTERfQVBJQ19WRUNUT1IsIHRocmVzaG9sZF9pbnRlcnJ1cHQpOwotCi0JLyogc2VsZiBnZW5lcmF0ZWQgSVBJIGZvciBsb2NhbCBBUElDIHRpbWVyICovCi0JYWxsb2NfaW50cl9nYXRlKExPQ0FMX1RJTUVSX1ZFQ1RPUiwgYXBpY190aW1lcl9pbnRlcnJ1cHQpOwotCi0JLyogZ2VuZXJpYyBJUEkgZm9yIHBsYXRmb3JtIHNwZWNpZmljIHVzZSAqLwotCWFsbG9jX2ludHJfZ2F0ZShHRU5FUklDX0lOVEVSUlVQVF9WRUNUT1IsIGdlbmVyaWNfaW50ZXJydXB0KTsKLQotCS8qIElQSSB2ZWN0b3JzIGZvciBBUElDIHNwdXJpb3VzIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCi0JYWxsb2NfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOwotCWFsbG9jX2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKLX0KLQotdm9pZCBfX2luaXQgbmF0aXZlX2luaXRfSVJRKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpbml0X0lTQV9pcnFzKCk7Ci0JLyoKLQkgKiBDb3ZlciB0aGUgd2hvbGUgdmVjdG9yIHNwYWNlLCBubyB2ZWN0b3IgY2FuIGVzY2FwZQotCSAqIHVzLiAoc29tZSBvZiB0aGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIGJlY29tZQotCSAqICdzcGVjaWFsJyBTTVAgaW50ZXJydXB0cykKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgKE5SX1ZFQ1RPUlMgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpOyBpKyspIHsKLQkJaW50IHZlY3RvciA9IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiArIGk7Ci0JCWlmICh2ZWN0b3IgIT0gSUEzMl9TWVNDQUxMX1ZFQ1RPUikKLQkJCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbaV0pOwotCX0KLQotCWFwaWNfaW50cl9pbml0KCk7Ci0KLQlpZiAoIWFjcGlfaW9hcGljKQotCQlzZXR1cF9pcnEoMiwgJmlycTIpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggYjFmNGRmZi4uOGQ4MmE3NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlnZGJfcmVnczMyW0dEQl9QU10JPSAqKHVuc2lnbmVkIGxvbmcgKikocC0+dGhyZWFkLnNwICsgOCk7CiAJZ2RiX3JlZ3MzMltHREJfQ1NdCT0gX19LRVJORUxfQ1M7CiAJZ2RiX3JlZ3MzMltHREJfU1NdCT0gX19LRVJORUxfRFM7Ci0JZ2RiX3JlZ3NbR0RCX1BDXQk9IHAtPnRocmVhZC5pcDsKKwlnZGJfcmVnc1tHREJfUENdCT0gMDsKIAlnZGJfcmVnc1tHREJfUjhdCT0gMDsKIAlnZGJfcmVnc1tHREJfUjldCT0gMDsKIAlnZGJfcmVnc1tHREJfUjEwXQk9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKaW5kZXggMzMwMTlkZC4uYTc4ZWNhZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2t2bS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rdm0uYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxhc20vdGltZXIuaD4KIAogI2RlZmluZSBNTVVfUVVFVUVfU0laRSAxMDI0CiAKQEAgLTE5NSw3ICsxOTYsNyBAQAogCXN0cnVjdCBrdm1fcGFyYV9zdGF0ZSAqc3RhdGUgPSBrdm1fcGFyYV9zdGF0ZSgpOwogCiAJbW11X3F1ZXVlX2ZsdXNoKHN0YXRlKTsKLQlwYXJhdmlydF9sZWF2ZV9sYXp5KHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSk7CisJcGFyYXZpcnRfbGVhdmVfbGF6eV9tbXUoKTsKIAlzdGF0ZS0+bW9kZSA9IHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKTsKIH0KIApAQCAtMjMwLDYgKzIzMSw5IEBACiAJCXB2X21tdV9vcHMubGF6eV9tb2RlLmVudGVyID0ga3ZtX2VudGVyX2xhenlfbW11OwogCQlwdl9tbXVfb3BzLmxhenlfbW9kZS5sZWF2ZSA9IGt2bV9sZWF2ZV9sYXp5X21tdTsKIAl9CisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJbm9fdGltZXJfY2hlY2sgPSAxOworI2VuZGlmCiB9CiAKIHZvaWQgX19pbml0IGt2bV9ndWVzdF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9hbWQuYwppbmRleCA0NTNiNTc5Li4zNjZiYWExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMKQEAgLTEzLDI1ICsxMywxMyBAQAogICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiAgTGljZW5zZSB2ZXJzaW9uIDIuIFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL21pY3JvY29kZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTc5LDkgKzY3LDYgQEAKICNkZWZpbmUgVUNPREVfQ09OVEFJTkVSX1NFQ1RJT05fSERSCTgKICNkZWZpbmUgVUNPREVfQ09OVEFJTkVSX0hFQURFUl9TSVpFCTEyCiAKLS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pY3JvY29kZV91cGRhdGVfbG9jayk7Ci0KIHN0YXRpYyBzdHJ1Y3QgZXF1aXZfY3B1X2VudHJ5ICplcXVpdl9jcHVfdGFibGU7CiAKIHN0YXRpYyBpbnQgY29sbGVjdF9jcHVfaW5mb19hbWQoaW50IGNwdSwgc3RydWN0IGNwdV9zaWduYXR1cmUgKmNzaWcpCkBAIC0xNDQsOSArMTI5LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgYXBwbHlfbWljcm9jb2RlX2FtZChpbnQgY3B1KQorc3RhdGljIGludCBhcHBseV9taWNyb2NvZGVfYW1kKGludCBjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgcmV2LCBkdW1teTsKIAlpbnQgY3B1X251bSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CkBAIC0xNTYsMjUgKzE0MCwyNSBAQAogCUJVR19PTihjcHVfbnVtICE9IGNwdSk7CiAKIAlpZiAobWNfYW1kID09IE5VTEwpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWljcm9jb2RlX3VwZGF0ZV9sb2NrLCBmbGFncyk7CiAJd3Jtc3JsKE1TUl9BTUQ2NF9QQVRDSF9MT0FERVIsICh1NjQpKGxvbmcpJm1jX2FtZC0+aGRyLmRhdGFfY29kZSk7CiAJLyogZ2V0IHBhdGNoIGlkIGFmdGVyIHBhdGNoaW5nICovCiAJcmRtc3IoTVNSX0FNRDY0X1BBVENIX0xFVkVMLCByZXYsIGR1bW15KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKIAogCS8qIGNoZWNrIGN1cnJlbnQgcGF0Y2ggaWQgYW5kIHBhdGNoJ3MgaWQgZm9yIG1hdGNoICovCiAJaWYgKHJldiAhPSBtY19hbWQtPmhkci5wYXRjaF9pZCkgewogCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQ6IHVwZGF0ZSBmYWlsZWQgIgogCQkgICAgICAgIihmb3IgcGF0Y2hfbGV2ZWw9MHgleClcbiIsIGNwdSwgbWNfYW1kLT5oZHIucGF0Y2hfaWQpOwotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkOiB1cGRhdGVkIChuZXcgcGF0Y2hfbGV2ZWw9MHgleClcbiIsCiAJICAgICAgIGNwdSwgcmV2KTsKIAogCXVjaS0+Y3B1X3NpZy5yZXYgPSByZXY7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBnZXRfdWNvZGVfZGF0YSh2b2lkICp0bywgY29uc3QgdTggKmZyb20sIHNpemVfdCBuKQpAQCAtMjU3LDEzICsyNDEsMTIgQEAKIAogc3RhdGljIHZvaWQgZnJlZV9lcXVpdl9jcHVfdGFibGUodm9pZCkKIHsKLQlpZiAoZXF1aXZfY3B1X3RhYmxlKSB7Ci0JCXZmcmVlKGVxdWl2X2NwdV90YWJsZSk7Ci0JCWVxdWl2X2NwdV90YWJsZSA9IE5VTEw7Ci0JfQorCXZmcmVlKGVxdWl2X2NwdV90YWJsZSk7CisJZXF1aXZfY3B1X3RhYmxlID0gTlVMTDsKIH0KIAotc3RhdGljIGludCBnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBlbnVtIHVjb2RlX3N0YXRlCitnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCWNvbnN0IHU4ICp1Y29kZV9wdHIgPSBkYXRhOwpAQCAtMjcyLDEyICsyNTUsMTMgQEAKIAlpbnQgbmV3X3JldiA9IHVjaS0+Y3B1X3NpZy5yZXY7CiAJdW5zaWduZWQgaW50IGxlZnRvdmVyOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWVudW0gdWNvZGVfc3RhdGUgc3RhdGUgPSBVQ09ERV9PSzsKIAogCW9mZnNldCA9IGluc3RhbGxfZXF1aXZfY3B1X3RhYmxlKHVjb2RlX3B0cik7CiAJaWYgKCFvZmZzZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGZhaWxlZCB0byBjcmVhdGUgIgogCQkgICAgICAgImVxdWl2YWxlbnQgY3B1IHRhYmxlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBVQ09ERV9FUlJPUjsKIAl9CiAKIAl1Y29kZV9wdHIgKz0gb2Zmc2V0OwpAQCAtMjkzLDggKzI3Nyw3IEBACiAKIAkJbWNfaGVhZGVyID0gKHN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2FtZCAqKW1jOwogCQlpZiAoZ2V0X21hdGNoaW5nX21pY3JvY29kZShjcHUsIG1jLCBuZXdfcmV2KSkgewotCQkJaWYgKG5ld19tYykKLQkJCQl2ZnJlZShuZXdfbWMpOworCQkJdmZyZWUobmV3X21jKTsKIAkJCW5ld19yZXYgPSBtY19oZWFkZXItPnBhdGNoX2lkOwogCQkJbmV3X21jICA9IG1jOwogCQl9IGVsc2UKQEAgLTMwNiwzNCArMjg5LDMyIEBACiAKIAlpZiAobmV3X21jKSB7CiAJCWlmICghbGVmdG92ZXIpIHsKLQkJCWlmICh1Y2ktPm1jKQotCQkJCXZmcmVlKHVjaS0+bWMpOworCQkJdmZyZWUodWNpLT5tYyk7CiAJCQl1Y2ktPm1jID0gbmV3X21jOwogCQkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgZm91bmQgYSBtYXRjaGluZyBtaWNyb2NvZGUgIgogCQkJCSAidXBkYXRlIHdpdGggdmVyc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLAogCQkJCSBjcHUsIG5ld19yZXYsIHVjaS0+Y3B1X3NpZy5yZXYpOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXZmcmVlKG5ld19tYyk7Ci0JfQorCQkJc3RhdGUgPSBVQ09ERV9FUlJPUjsKKwkJfQorCX0gZWxzZQorCQlzdGF0ZSA9IFVDT0RFX05GT1VORDsKIAogCWZyZWVfZXF1aXZfY3B1X3RhYmxlKCk7CiAKLQlyZXR1cm4gKGludClsZWZ0b3ZlcjsKKwlyZXR1cm4gc3RhdGU7CiB9CiAKLXN0YXRpYyBpbnQgcmVxdWVzdF9taWNyb2NvZGVfZncoaW50IGNwdSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGVudW0gdWNvZGVfc3RhdGUgcmVxdWVzdF9taWNyb2NvZGVfZncoaW50IGNwdSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWNvbnN0IGNoYXIgKmZ3X25hbWUgPSAiYW1kLXVjb2RlL21pY3JvY29kZV9hbWQuYmluIjsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwotCWludCByZXQ7CisJZW51bSB1Y29kZV9zdGF0ZSByZXQ7CiAKLQkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCi0JQlVHX09OKGNwdSAhPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBmd19uYW1lLCBkZXZpY2UpOwotCWlmIChyZXQpIHsKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIGZ3X25hbWUsIGRldmljZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGZhaWxlZCB0byBsb2FkIGZpbGUgJXNcbiIsIGZ3X25hbWUpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gVUNPREVfTkZPVU5EOwogCX0KIAogCXJldCA9IGdlbmVyaWNfbG9hZF9taWNyb2NvZGUoY3B1LCBmaXJtd2FyZS0+ZGF0YSwgZmlybXdhcmUtPnNpemUpOwpAQCAtMzQzLDExICszMjQsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJlcXVlc3RfbWljcm9jb2RlX3VzZXIoaW50IGNwdSwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpCitzdGF0aWMgZW51bSB1Y29kZV9zdGF0ZQorcmVxdWVzdF9taWNyb2NvZGVfdXNlcihpbnQgY3B1LCBjb25zdCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IEFNRCBtaWNyb2NvZGUgdXBkYXRlIHZpYSAiCiAJICAgICAgICIvZGV2L2NwdS9taWNyb2NvZGUgbm90IHN1cHBvcnRlZFxuIik7Ci0JcmV0dXJuIC0xOworCXJldHVybiBVQ09ERV9FUlJPUjsKIH0KIAogc3RhdGljIHZvaWQgbWljcm9jb2RlX2ZpbmlfY3B1X2FtZChpbnQgY3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYwppbmRleCA5OGM0NzBjLi45YzQ0NjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYwpAQCAtNzEsMjcgKzcxLDE4IEBACiAgKgkJVGhhbmtzIHRvIFN0dWFydCBTd2FsZXMgZm9yIHBvaW50aW5nIG91dCB0aGlzIGJ1Zy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9taWNyb2NvZGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL21zci5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk1pY3JvY29kZSBVcGRhdGUgRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az4iKTsKQEAgLTEwMSwzNiArOTIsMTEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWljcm9jb2RlX29wcwkqbWljcm9jb2RlX29wczsKIAotLyogbm8gY29uY3VycmVudCAtPndyaXRlKClzIGFyZSBhbGxvd2VkIG9uIC9kZXYvY3B1L21pY3JvY29kZSAqLworLyoKKyAqIFN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBBbGwgbm9uIGNwdS1ob3RwbHVnLWNhbGxiYWNrIGNhbGwgc2l0ZXMgdXNlOgorICoKKyAqIC0gbWljcm9jb2RlX211dGV4IHRvIHN5bmNocm9uaXplIHdpdGggZWFjaCBvdGhlcjsKKyAqIC0gZ2V0L3B1dF9vbmxpbmVfY3B1cygpIHRvIHN5bmNocm9uaXplIHdpdGgKKyAqICAgdGhlIGNwdS1ob3RwbHVnLWNhbGxiYWNrIGNhbGwgc2l0ZXMuCisgKgorICogV2UgZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBjcHUgaXMgYmVpbmcKKyAqIHVwZGF0ZWQgYXQgYW55IHBhcnRpY3VsYXIgbW9tZW50IG9mIHRpbWUuCisgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgobWljcm9jb2RlX211dGV4KTsKIAogc3RydWN0IHVjb2RlX2NwdV9pbmZvCQl1Y29kZV9jcHVfaW5mb1tOUl9DUFVTXTsKIEVYUE9SVF9TWU1CT0xfR1BMKHVjb2RlX2NwdV9pbmZvKTsKIAorLyoKKyAqIE9wZXJhdGlvbnMgdGhhdCBhcmUgcnVuIG9uIGEgdGFyZ2V0IGNwdToKKyAqLworCitzdHJ1Y3QgY3B1X2luZm9fY3R4IHsKKwlzdHJ1Y3QgY3B1X3NpZ25hdHVyZQkqY3B1X3NpZzsKKwlpbnQJCQllcnI7Cit9OworCitzdGF0aWMgdm9pZCBjb2xsZWN0X2NwdV9pbmZvX2xvY2FsKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgY3B1X2luZm9fY3R4ICpjdHggPSBhcmc7CisKKwljdHgtPmVyciA9IG1pY3JvY29kZV9vcHMtPmNvbGxlY3RfY3B1X2luZm8oc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQkJCQkJICAgY3R4LT5jcHVfc2lnKTsKK30KKworc3RhdGljIGludCBjb2xsZWN0X2NwdV9pbmZvX29uX3RhcmdldChpbnQgY3B1LCBzdHJ1Y3QgY3B1X3NpZ25hdHVyZSAqY3B1X3NpZykKK3sKKwlzdHJ1Y3QgY3B1X2luZm9fY3R4IGN0eCA9IHsgLmNwdV9zaWcgPSBjcHVfc2lnLCAuZXJyID0gMCB9OworCWludCByZXQ7CisKKwlyZXQgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBjb2xsZWN0X2NwdV9pbmZvX2xvY2FsLCAmY3R4LCAxKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gY3R4LmVycjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29sbGVjdF9jcHVfaW5mbyhpbnQgY3B1KQoreworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CisJaW50IHJldDsKKworCW1lbXNldCh1Y2ksIDAsIHNpemVvZigqdWNpKSk7CisKKwlyZXQgPSBjb2xsZWN0X2NwdV9pbmZvX29uX3RhcmdldChjcHUsICZ1Y2ktPmNwdV9zaWcpOworCWlmICghcmV0KQorCQl1Y2ktPnZhbGlkID0gMTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBhcHBseV9taWNyb2NvZGVfY3R4IHsKKwlpbnQgZXJyOworfTsKKworc3RhdGljIHZvaWQgYXBwbHlfbWljcm9jb2RlX2xvY2FsKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYXBwbHlfbWljcm9jb2RlX2N0eCAqY3R4ID0gYXJnOworCisJY3R4LT5lcnIgPSBtaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworc3RhdGljIGludCBhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGludCBjcHUpCit7CisJc3RydWN0IGFwcGx5X21pY3JvY29kZV9jdHggY3R4ID0geyAuZXJyID0gMCB9OworCWludCByZXQ7CisKKwlyZXQgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBhcHBseV9taWNyb2NvZGVfbG9jYWwsICZjdHgsIDEpOworCWlmICghcmV0KQorCQlyZXQgPSBjdHguZXJyOworCisJcmV0dXJuIHJldDsKK30KKwogI2lmZGVmIENPTkZJR19NSUNST0NPREVfT0xEX0lOVEVSRkFDRQogc3RhdGljIGludCBkb19taWNyb2NvZGVfdXBkYXRlKGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBzaXplKQogewotCWNwdW1hc2tfdCBvbGQ7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgY3B1OwogCi0Jb2xkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwotCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKKwkJZW51bSB1Y29kZV9zdGF0ZSB1c3RhdGU7CiAKIAkJaWYgKCF1Y2ktPnZhbGlkKQogCQkJY29udGludWU7CiAKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJmNwdW1hc2tfb2ZfY3B1KGNwdSkpOwotCQllcnJvciA9IG1pY3JvY29kZV9vcHMtPnJlcXVlc3RfbWljcm9jb2RlX3VzZXIoY3B1LCBidWYsIHNpemUpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBvdXQ7Ci0JCWlmICghZXJyb3IpCi0JCQltaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoY3B1KTsKKwkJdXN0YXRlID0gbWljcm9jb2RlX29wcy0+cmVxdWVzdF9taWNyb2NvZGVfdXNlcihjcHUsIGJ1Ziwgc2l6ZSk7CisJCWlmICh1c3RhdGUgPT0gVUNPREVfRVJST1IpIHsKKwkJCWVycm9yID0gLTE7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICh1c3RhdGUgPT0gVUNPREVfT0spCisJCQlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CiAJfQotb3V0OgotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZvbGQpOworCiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xNDMsMTkgKzIwOCwxNyBAQAogc3RhdGljIHNzaXplX3QgbWljcm9jb2RlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKIHsKLQlzc2l6ZV90IHJldDsKKwlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKIAlpZiAoKGxlbiA+PiBQQUdFX1NISUZUKSA+IG51bV9waHlzcGFnZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IHRvbyBtdWNoIGRhdGEgKG1heCAlbGQgcGFnZXMpXG4iLAotCQkgICAgICAgbnVtX3BoeXNwYWdlcyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlwcl9lcnIoIm1pY3JvY29kZTogdG9vIG11Y2ggZGF0YSAobWF4ICVsZCBwYWdlcylcbiIsIG51bV9waHlzcGFnZXMpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWdldF9vbmxpbmVfY3B1cygpOwogCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CiAKLQlyZXQgPSBkb19taWNyb2NvZGVfdXBkYXRlKGJ1ZiwgbGVuKTsKLQlpZiAoIXJldCkKKwlpZiAoZG9fbWljcm9jb2RlX3VwZGF0ZShidWYsIGxlbikgPT0gMCkKIAkJcmV0ID0gKHNzaXplX3QpbGVuOwogCiAJbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwpAQCAtMTY1LDE1ICsyMjgsMTUgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWljcm9jb2RlX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS53cml0ZQkJPSBtaWNyb2NvZGVfd3JpdGUsCi0JLm9wZW4JCT0gbWljcm9jb2RlX29wZW4sCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJCQk9IG1pY3JvY29kZV93cml0ZSwKKwkub3BlbgkJCT0gbWljcm9jb2RlX29wZW4sCiB9OwogCiBzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbWljcm9jb2RlX2RldiA9IHsKLQkubWlub3IJCT0gTUlDUk9DT0RFX01JTk9SLAotCS5uYW1lCQk9ICJtaWNyb2NvZGUiLAotCS5mb3BzCQk9ICZtaWNyb2NvZGVfZm9wcywKKwkubWlub3IJCQk9IE1JQ1JPQ09ERV9NSU5PUiwKKwkubmFtZQkJCT0gIm1pY3JvY29kZSIsCisJLmZvcHMJCQk9ICZtaWNyb2NvZGVfZm9wcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG1pY3JvY29kZV9kZXZfaW5pdCh2b2lkKQpAQCAtMTgyLDkgKzI0NSw3IEBACiAKIAllcnJvciA9IG1pc2NfcmVnaXN0ZXIoJm1pY3JvY29kZV9kZXYpOwogCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIKLQkJCSJtaWNyb2NvZGU6IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCi0JCQlNSUNST0NPREVfTUlOT1IpOworCQlwcl9lcnIoIm1pY3JvY29kZTogY2FuJ3QgbWlzY19yZWdpc3RlciBvbiBtaW5vcj0lZFxuIiwgTUlDUk9DT0RFX01JTk9SKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMjA1LDQyICsyNjYsNTEgQEAKIC8qIGZha2UgZGV2aWNlIGZvciByZXF1ZXN0X2Zpcm13YXJlICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZQkqbWljcm9jb2RlX3BkZXY7CiAKLXN0YXRpYyBsb25nIHJlbG9hZF9mb3JfY3B1KHZvaWQgKnVudXNlZCkKK3N0YXRpYyBpbnQgcmVsb2FkX2Zvcl9jcHUoaW50IGNwdSkKIHsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CiAJaW50IGVyciA9IDA7CiAKIAltdXRleF9sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwogCWlmICh1Y2ktPnZhbGlkKSB7Ci0JCWVyciA9IG1pY3JvY29kZV9vcHMtPnJlcXVlc3RfbWljcm9jb2RlX2Z3KHNtcF9wcm9jZXNzb3JfaWQoKSwKLQkJCQkJCQkgICZtaWNyb2NvZGVfcGRldi0+ZGV2KTsKLQkJaWYgKCFlcnIpCi0JCQltaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJZW51bSB1Y29kZV9zdGF0ZSB1c3RhdGU7CisKKwkJdXN0YXRlID0gbWljcm9jb2RlX29wcy0+cmVxdWVzdF9taWNyb2NvZGVfZncoY3B1LCAmbWljcm9jb2RlX3BkZXYtPmRldik7CisJCWlmICh1c3RhdGUgPT0gVUNPREVfT0spCisJCQlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CisJCWVsc2UKKwkJCWlmICh1c3RhdGUgPT0gVUNPREVfRVJST1IpCisJCQkJZXJyID0gLUVJTlZBTDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOworCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHNzaXplX3QgcmVsb2FkX3N0b3JlKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc3opCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICplbmQ7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmQsIDApOwotCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCBjcHUgPSBkZXYtPmlkOworCWludCByZXQgPSAwOworCWNoYXIgKmVuZDsKIAorCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZCwgMCk7CiAJaWYgKGVuZCA9PSBidWYpCiAJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKHZhbCA9PSAxKSB7CiAJCWdldF9vbmxpbmVfY3B1cygpOwogCQlpZiAoY3B1X29ubGluZShjcHUpKQotCQkJZXJyID0gd29ya19vbl9jcHUoY3B1LCByZWxvYWRfZm9yX2NwdSwgTlVMTCk7CisJCQlyZXQgPSByZWxvYWRfZm9yX2NwdShjcHUpOwogCQlwdXRfb25saW5lX2NwdXMoKTsKIAl9Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gc3o7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2l6ZTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LApAQCAtMjcxLDExICszNDEsMTEgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1jX2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzCQk9IG1jX2RlZmF1bHRfYXR0cnMsCi0JLm5hbWUJCT0gIm1pY3JvY29kZSIsCisJLmF0dHJzCQkJPSBtY19kZWZhdWx0X2F0dHJzLAorCS5uYW1lCQkJPSAibWljcm9jb2RlIiwKIH07CiAKLXN0YXRpYyB2b2lkIF9fbWljcm9jb2RlX2ZpbmlfY3B1KGludCBjcHUpCitzdGF0aWMgdm9pZCBtaWNyb2NvZGVfZmluaV9jcHUoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCkBAIC0yODMsMTAzICszNTMsNjggQEAKIAl1Y2ktPnZhbGlkID0gMDsKIH0KIAotc3RhdGljIHZvaWQgbWljcm9jb2RlX2ZpbmlfY3B1KGludCBjcHUpCi17Ci0JbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKLQlfX21pY3JvY29kZV9maW5pX2NwdShjcHUpOwotCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgY29sbGVjdF9jcHVfaW5mbyhpbnQgY3B1KQorc3RhdGljIGVudW0gdWNvZGVfc3RhdGUgbWljcm9jb2RlX3Jlc3VtZV9jcHUoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCi0JbWVtc2V0KHVjaSwgMCwgc2l6ZW9mKCp1Y2kpKTsKLQlpZiAoIW1pY3JvY29kZV9vcHMtPmNvbGxlY3RfY3B1X2luZm8oY3B1LCAmdWNpLT5jcHVfc2lnKSkKLQkJdWNpLT52YWxpZCA9IDE7Ci19Ci0KLXN0YXRpYyBpbnQgbWljcm9jb2RlX3Jlc3VtZV9jcHUoaW50IGNwdSkKLXsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwotCXN0cnVjdCBjcHVfc2lnbmF0dXJlIG5zaWc7Ci0KLQlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUlZCByZXN1bWVkXG4iLCBjcHUpOwotCiAJaWYgKCF1Y2ktPm1jKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIFVDT0RFX05GT1VORDsKIAotCS8qCi0JICogTGV0J3MgdmVyaWZ5IHRoYXQgdGhlICdjYWNoZWQnIHVjb2RlIGRvZXMgYmVsb25nCi0JICogdG8gdGhpcyBjcHUgKGEgYml0IG9mIHBhcmFub2lhKToKLQkgKi8KLQlpZiAobWljcm9jb2RlX29wcy0+Y29sbGVjdF9jcHVfaW5mbyhjcHUsICZuc2lnKSkgewotCQlfX21pY3JvY29kZV9maW5pX2NwdShjcHUpOwotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBjb2xsZWN0X2NwdV9pbmZvIGZvciByZXN1bWluZyBjcHUgIyVkXG4iLAotCQkJCWNwdSk7Ci0JCXJldHVybiAtMTsKLQl9CisJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgdXBkYXRlZCB1cG9uIHJlc3VtZVxuIiwgY3B1KTsKKwlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CiAKLQlpZiAoKG5zaWcuc2lnICE9IHVjaS0+Y3B1X3NpZy5zaWcpIHx8IChuc2lnLnBmICE9IHVjaS0+Y3B1X3NpZy5wZikpIHsKLQkJX19taWNyb2NvZGVfZmluaV9jcHUoY3B1KTsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYWNoZWQgdWNvZGUgZG9lc24ndCBtYXRjaCB0aGUgcmVzdW1pbmcgY3B1ICMlZFxuIiwKLQkJCQljcHUpOwotCQkvKiBTaG91bGQgd2UgbG9vayBmb3IgYSBuZXcgdWNvZGUgaGVyZT8gKi8KLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIFVDT0RFX09LOwogfQogCi1zdGF0aWMgbG9uZyBtaWNyb2NvZGVfdXBkYXRlX2NwdSh2b2lkICp1bnVzZWQpCitzdGF0aWMgZW51bSB1Y29kZV9zdGF0ZSBtaWNyb2NvZGVfaW5pdF9jcHUoaW50IGNwdSkKIHsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBlcnIgPSAwOworCWVudW0gdWNvZGVfc3RhdGUgdXN0YXRlOwogCi0JLyoKLQkgKiBDaGVjayBpZiB0aGUgc3lzdGVtIHJlc3VtZSBpcyBpbiBwcm9ncmVzcyAodWNpLT52YWxpZCAhPSBOVUxMKSwKLQkgKiBvdGhlcndpc2UganVzdCByZXF1ZXN0IGEgZmlybXdhcmU6Ci0JICovCi0JaWYgKHVjaS0+dmFsaWQpIHsKLQkJZXJyID0gbWljcm9jb2RlX3Jlc3VtZV9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQl9IGVsc2UgewotCQljb2xsZWN0X2NwdV9pbmZvKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JCWlmICh1Y2ktPnZhbGlkICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKLQkJCWVyciA9IG1pY3JvY29kZV9vcHMtPnJlcXVlc3RfbWljcm9jb2RlX2Z3KAotCQkJCQlzbXBfcHJvY2Vzc29yX2lkKCksCi0JCQkJCSZtaWNyb2NvZGVfcGRldi0+ZGV2KTsKKwlpZiAoY29sbGVjdF9jcHVfaW5mbyhjcHUpKQorCQlyZXR1cm4gVUNPREVfRVJST1I7CisKKwkvKiAtLWRpbW0uIFRyaWdnZXIgYSBkZWxheWVkIHVwZGF0ZT8gKi8KKwlpZiAoc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SVU5OSU5HKQorCQlyZXR1cm4gVUNPREVfTkZPVU5EOworCisJdXN0YXRlID0gbWljcm9jb2RlX29wcy0+cmVxdWVzdF9taWNyb2NvZGVfZncoY3B1LCAmbWljcm9jb2RlX3BkZXYtPmRldik7CisKKwlpZiAodXN0YXRlID09IFVDT0RFX09LKSB7CisJCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZWQgdXBvbiBpbml0XG4iLCBjcHUpOworCQlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CiAJfQotCWlmICghZXJyKQotCQltaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHVzdGF0ZTsKIH0KIAotc3RhdGljIGludCBtaWNyb2NvZGVfaW5pdF9jcHUoaW50IGNwdSkKK3N0YXRpYyBlbnVtIHVjb2RlX3N0YXRlIG1pY3JvY29kZV91cGRhdGVfY3B1KGludCBjcHUpCiB7Ci0JaW50IGVycjsKLQltdXRleF9sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwotCWVyciA9IHdvcmtfb25fY3B1KGNwdSwgbWljcm9jb2RlX3VwZGF0ZV9jcHUsIE5VTEwpOwotCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OworCWVudW0gdWNvZGVfc3RhdGUgdXN0YXRlOwogCi0JcmV0dXJuIGVycjsKKwlpZiAodWNpLT52YWxpZCkKKwkJdXN0YXRlID0gbWljcm9jb2RlX3Jlc3VtZV9jcHUoY3B1KTsKKwllbHNlCisJCXVzdGF0ZSA9IG1pY3JvY29kZV9pbml0X2NwdShjcHUpOworCisJcmV0dXJuIHVzdGF0ZTsKIH0KIAogc3RhdGljIGludCBtY19zeXNkZXZfYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQogewogCWludCBlcnIsIGNwdSA9IHN5c19kZXYtPmlkOwotCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CiAKIAlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKIAkJcmV0dXJuIDA7CiAKIAlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUlZCBhZGRlZFxuIiwgY3B1KTsKLQltZW1zZXQodWNpLCAwLCBzaXplb2YoKnVjaSkpOwogCiAJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IG1pY3JvY29kZV9pbml0X2NwdShjcHUpOworCWlmIChtaWNyb2NvZGVfaW5pdF9jcHUoY3B1KSA9PSBVQ09ERV9FUlJPUikKKwkJZXJyID0gLUVJTlZBTDsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00MDAsMTkgKzQzNSwzMCBAQAogc3RhdGljIGludCBtY19zeXNkZXZfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IGNwdSA9IGRldi0+aWQ7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKIAogCWlmICghY3B1X29ubGluZShjcHUpKQogCQlyZXR1cm4gMDsKIAotCS8qIG9ubHkgQ1BVIDAgd2lsbCBhcHBseSB1Y29kZSBoZXJlICovCi0JbWljcm9jb2RlX3VwZGF0ZV9jcHUoTlVMTCk7CisJLyoKKwkgKiBBbGwgbm9uLWJvb3R1cCBjcHVzIGFyZSBzdGlsbCBkaXNhYmxlZCwKKwkgKiBzbyBvbmx5IENQVSAwIHdpbGwgYXBwbHkgdWNvZGUgaGVyZS4KKwkgKgorCSAqIE1vcmVvdmVyLCB0aGVyZSBjYW4gYmUgbm8gY29uY3VycmVudAorCSAqIHVwZGF0ZXMgZnJvbSBhbnkgb3RoZXIgcGxhY2VzIGF0IHRoaXMgcG9pbnQuCisJICovCisJV0FSTl9PTihjcHUgIT0gMCk7CisKKwlpZiAodWNpLT52YWxpZCAmJiB1Y2ktPm1jKQorCQltaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoY3B1KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgbWNfc3lzZGV2X2RyaXZlciA9IHsKLQkuYWRkCQk9IG1jX3N5c2Rldl9hZGQsCi0JLnJlbW92ZQkJPSBtY19zeXNkZXZfcmVtb3ZlLAotCS5yZXN1bWUJCT0gbWNfc3lzZGV2X3Jlc3VtZSwKKwkuYWRkCQkJPSBtY19zeXNkZXZfYWRkLAorCS5yZW1vdmUJCQk9IG1jX3N5c2Rldl9yZW1vdmUsCisJLnJlc3VtZQkJCT0gbWNfc3lzZGV2X3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBfX2NwdWluaXQgaW50CkBAIC00MjUsMTUgKzQ3MSwxMiBAQAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfT05MSU5FOgogCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCWlmIChtaWNyb2NvZGVfaW5pdF9jcHUoY3B1KSkKLQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBmYWlsZWQgdG8gaW5pdCBDUFUlZFxuIiwKLQkJCSAgICAgICBjcHUpOworCQltaWNyb2NvZGVfdXBkYXRlX2NwdShjcHUpOwogCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgogCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKIAkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgYWRkZWRcbiIsIGNwdSk7CiAJCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKSkKLQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBGYWlsZWQgdG8gY3JlYXRlIHRoZSBzeXNmcyAiCi0JCQkJImdyb3VwIGZvciBDUFUlZFxuIiwgY3B1KTsKKwkJCXByX2VycigibWljcm9jb2RlOiBGYWlsZWQgdG8gY3JlYXRlIGdyb3VwIGZvciBDUFUlZFxuIiwgY3B1KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CkBAIC00NjUsMTMgKzUwOCwxMCBAQAogCQltaWNyb2NvZGVfb3BzID0gaW5pdF9hbWRfbWljcm9jb2RlKCk7CiAKIAlpZiAoIW1pY3JvY29kZV9vcHMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IG5vIHN1cHBvcnQgZm9yIHRoaXMgQ1BVIHZlbmRvclxuIik7CisJCXByX2VycigibWljcm9jb2RlOiBubyBzdXBwb3J0IGZvciB0aGlzIENQVSB2ZW5kb3JcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllcnJvciA9IG1pY3JvY29kZV9kZXZfaW5pdCgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwogCW1pY3JvY29kZV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgibWljcm9jb2RlIiwgLTEsCiAJCQkJCQkJIE5VTEwsIDApOwogCWlmIChJU19FUlIobWljcm9jb2RlX3BkZXYpKSB7CkBAIC00ODAsMjMgKzUyMCwzMSBAQAogCX0KIAogCWdldF9vbmxpbmVfY3B1cygpOworCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CisKIAllcnJvciA9IHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZtY19zeXNkZXZfZHJpdmVyKTsKKworCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKIAlwdXRfb25saW5lX2NwdXMoKTsKKwogCWlmIChlcnJvcikgewotCQltaWNyb2NvZGVfZGV2X2V4aXQoKTsKIAkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWljcm9jb2RlX3BkZXYpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCisJZXJyb3IgPSBtaWNyb2NvZGVfZGV2X2luaXQoKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwogCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmbWNfY3B1X25vdGlmaWVyKTsKIAotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgIk1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTgorCXByX2luZm8oIk1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTgogCSAgICAgICAiIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+LCIKIAkgICAgICAgIiBQZXRlciBPcnViYVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KK21vZHVsZV9pbml0KG1pY3JvY29kZV9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IG1pY3JvY29kZV9leGl0KHZvaWQpCiB7CkBAIC01MDUsMTYgKzU1MywxNyBAQAogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZtY19jcHVfbm90aWZpZXIpOwogCiAJZ2V0X29ubGluZV9jcHVzKCk7CisJbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKKwogCXN5c2Rldl9kcml2ZXJfdW5yZWdpc3RlcigmY3B1X3N5c2Rldl9jbGFzcywgJm1jX3N5c2Rldl9kcml2ZXIpOworCisJbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWljcm9jb2RlX3BkZXYpOwogCiAJbWljcm9jb2RlX29wcyA9IE5VTEw7CiAKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJNaWNyb2NvZGUgVXBkYXRlIERyaXZlcjogdiIgTUlDUk9DT0RFX1ZFUlNJT04gIiByZW1vdmVkLlxuIik7CisJcHJfaW5mbygiTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXI6IHYiIE1JQ1JPQ09ERV9WRVJTSU9OICIgcmVtb3ZlZC5cbiIpOwogfQotCi1tb2R1bGVfaW5pdChtaWNyb2NvZGVfaW5pdCk7CiBtb2R1bGVfZXhpdChtaWNyb2NvZGVfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMKaW5kZXggMTQ5YjllYy4uMGQzMzRkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfaW50ZWwuYwpAQCAtNzAsMjQgKzcwLDExIEBACiAgKgkJRml4IHNpZ21hdGNoKCkgbWFjcm8gdG8gaGFuZGxlIG9sZCBDUFVzIHdpdGggcGYgPT0gMC4KICAqCQlUaGFua3MgdG8gU3R1YXJ0IFN3YWxlcyBmb3IgcG9pbnRpbmcgb3V0IHRoaXMgYnVnLgogICovCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8YXNtL21pY3JvY29kZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTE1MCwxMyArMTM3LDkgQEAKIAogI2RlZmluZSBleHR0YWJsZV9zaXplKGV0KSAoKGV0KS0+Y291bnQgKiBFWFRfU0lHTkFUVVJFX1NJWkUgKyBFWFRfSEVBREVSX1NJWkUpCiAKLS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlIHRvIE1TUiAweDc5ICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pY3JvY29kZV91cGRhdGVfbG9jayk7Ci0KIHN0YXRpYyBpbnQgY29sbGVjdF9jcHVfaW5mbyhpbnQgY3B1X251bSwgc3RydWN0IGNwdV9zaWduYXR1cmUgKmNzaWcpCiB7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKGNwdV9udW0pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHZhbFsyXTsKIAogCW1lbXNldChjc2lnLCAwLCBzaXplb2YoKmNzaWcpKTsKQEAgLTE3NiwxOCArMTU5LDE0IEBACiAJCWNzaWctPnBmID0gMSA8PCAoKHZhbFsxXSA+PiAxOCkgJiA3KTsKIAl9CiAKLQkvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwaHlzaWNhbCB3cml0ZSB0byBNU1IgMHg3OSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKLQogCXdybXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgMCwgMCk7CiAJLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KIAlzeW5jX2NvcmUoKTsKIAkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLwogCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCBjc2lnLT5yZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOwogCi0JcHJfZGVidWcoIm1pY3JvY29kZTogY29sbGVjdF9jcHVfaW5mbyA6IHNpZz0weCV4LCBwZj0weCV4LCByZXY9MHgleFxuIiwKLQkJCWNzaWctPnNpZywgY3NpZy0+cGYsIGNzaWctPnJldik7CisJcHJpbnRrKEtFUk5fSU5GTyAibWljcm9jb2RlOiBDUFUlZCBzaWc9MHgleCwgcGY9MHgleCwgcmV2aXNpb249MHgleFxuIiwKKwkJCWNwdV9udW0sIGNzaWctPnNpZywgY3NpZy0+cGYsIGNzaWctPnJldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMxOCwxMSArMjk3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGFwcGx5X21pY3JvY29kZShpbnQgY3B1KQorc3RhdGljIGludCBhcHBseV9taWNyb2NvZGUoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICptY19pbnRlbDsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCB2YWxbMl07CiAJaW50IGNwdV9udW07CiAKQEAgLTMzNCwxMCArMzEyLDcgQEAKIAlCVUdfT04oY3B1X251bSAhPSBjcHUpOwogCiAJaWYgKG1jX2ludGVsID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlIHRvIE1TUiAweDc5ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKIAogCS8qIHdyaXRlIG1pY3JvY29kZSB2aWEgTVNSIDB4NzkgKi8KIAl3cm1zcihNU1JfSUEzMl9VQ09ERV9XUklURSwKQEAgLTM1MSwzMCArMzI2LDMyIEBACiAJLyogZ2V0IHRoZSBjdXJyZW50IHJldmlzaW9uIGZyb20gTVNSIDB4OEIgKi8KIAlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIHZhbFswXSwgdmFsWzFdKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOwogCWlmICh2YWxbMV0gIT0gbWNfaW50ZWwtPmhkci5yZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZSBmcm9tIHJldmlzaW9uICIKLQkJCQkiMHgleCB0byAweCV4IGZhaWxlZFxuIiwKLQkJCWNwdV9udW0sIHVjaS0+Y3B1X3NpZy5yZXYsIHZhbFsxXSk7Ci0JCXJldHVybjsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZSAiCisJCQkJInRvIHJldmlzaW9uIDB4JXggZmFpbGVkXG4iLAorCQkJY3B1X251bSwgbWNfaW50ZWwtPmhkci5yZXYpOworCQlyZXR1cm4gLTE7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIm1pY3JvY29kZTogQ1BVJWQgdXBkYXRlZCBmcm9tIHJldmlzaW9uICIKLQkJCSAiMHgleCB0byAweCV4LCBkYXRlID0gJTA0eC0lMDJ4LSUwMnggXG4iLAotCQljcHVfbnVtLCB1Y2ktPmNwdV9zaWcucmV2LCB2YWxbMV0sCisJcHJpbnRrKEtFUk5fSU5GTyAibWljcm9jb2RlOiBDUFUlZCB1cGRhdGVkIHRvIHJldmlzaW9uICIKKwkJCSAiMHgleCwgZGF0ZSA9ICUwNHgtJTAyeC0lMDJ4IFxuIiwKKwkJY3B1X251bSwgdmFsWzFdLAogCQltY19pbnRlbC0+aGRyLmRhdGUgJiAweGZmZmYsCiAJCW1jX2ludGVsLT5oZHIuZGF0ZSA+PiAyNCwKIAkJKG1jX2ludGVsLT5oZHIuZGF0ZSA+PiAxNikgJiAweGZmKTsKIAogCXVjaS0+Y3B1X3NpZy5yZXYgPSB2YWxbMV07CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAotCQlpbnQgKCpnZXRfdWNvZGVfZGF0YSkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCkpCitzdGF0aWMgZW51bSB1Y29kZV9zdGF0ZSBnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorCQkJCWludCAoKmdldF91Y29kZV9kYXRhKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSkKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCXU4ICp1Y29kZV9wdHIgPSBkYXRhLCAqbmV3X21jID0gTlVMTCwgKm1jOwogCWludCBuZXdfcmV2ID0gdWNpLT5jcHVfc2lnLnJldjsKIAl1bnNpZ25lZCBpbnQgbGVmdG92ZXIgPSBzaXplOworCWVudW0gdWNvZGVfc3RhdGUgc3RhdGUgPSBVQ09ERV9PSzsKIAogCXdoaWxlIChsZWZ0b3ZlcikgewogCQlzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCBtY19oZWFkZXI7CkBAIC00MTIsMTEgKzM4OSwxNSBAQAogCQlsZWZ0b3ZlciAgLT0gbWNfc2l6ZTsKIAl9CiAKLQlpZiAoIW5ld19tYykKLQkJZ290byBvdXQ7Ci0KIAlpZiAobGVmdG92ZXIpIHsKLQkJdmZyZWUobmV3X21jKTsKKwkJaWYgKG5ld19tYykKKwkJCXZmcmVlKG5ld19tYyk7CisJCXN0YXRlID0gVUNPREVfRVJST1I7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbmV3X21jKSB7CisJCXN0YXRlID0gVUNPREVfTkZPVU5EOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQyNyw5ICs0MDgsOCBAQAogCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIGZvdW5kIGEgbWF0Y2hpbmcgbWljcm9jb2RlIHVwZGF0ZSB3aXRoIgogCQkgIiB2ZXJzaW9uIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsCiAJCQljcHUsIG5ld19yZXYsIHVjaS0+Y3B1X3NpZy5yZXYpOwotCi0gb3V0OgotCXJldHVybiAoaW50KWxlZnRvdmVyOworb3V0OgorCXJldHVybiBzdGF0ZTsKIH0KIAogc3RhdGljIGludCBnZXRfdWNvZGVfZncodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBuKQpAQCAtNDM4LDIxICs0MTgsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZXF1ZXN0X21pY3JvY29kZV9mdyhpbnQgY3B1LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgZW51bSB1Y29kZV9zdGF0ZSByZXF1ZXN0X21pY3JvY29kZV9mdyhpbnQgY3B1LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJY2hhciBuYW1lWzMwXTsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwotCWludCByZXQ7CisJZW51bSB1Y29kZV9zdGF0ZSByZXQ7CiAKLQkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCi0JQlVHX09OKGNwdSAhPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlzcHJpbnRmKG5hbWUsICJpbnRlbC11Y29kZS8lMDJ4LSUwMngtJTAyeCIsCiAJCWMtPng4NiwgYy0+eDg2X21vZGVsLCBjLT54ODZfbWFzayk7Ci0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIG5hbWUsIGRldmljZSk7Ci0JaWYgKHJldCkgeworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBuYW1lLCBkZXZpY2UpKSB7CiAJCXByX2RlYnVnKCJtaWNyb2NvZGU6IGRhdGEgZmlsZSAlcyBsb2FkIGZhaWxlZFxuIiwgbmFtZSk7Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiBVQ09ERV9ORk9VTkQ7CiAJfQogCiAJcmV0ID0gZ2VuZXJpY19sb2FkX21pY3JvY29kZShjcHUsICh2b2lkICopZmlybXdhcmUtPmRhdGEsCkBAIC00NjgsMTEgKzQ0Niw5IEBACiAJcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKIH0KIAotc3RhdGljIGludCByZXF1ZXN0X21pY3JvY29kZV91c2VyKGludCBjcHUsIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGVudW0gdWNvZGVfc3RhdGUKK3JlcXVlc3RfbWljcm9jb2RlX3VzZXIoaW50IGNwdSwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JLyogV2Ugc2hvdWxkIGJpbmQgdGhlIHRhc2sgdG8gdGhlIENQVSAqLwotCUJVR19PTihjcHUgIT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7Ci0KIAlyZXR1cm4gZ2VuZXJpY19sb2FkX21pY3JvY29kZShjcHUsICh2b2lkICopYnVmLCBzaXplLCAmZ2V0X3Vjb2RlX3VzZXIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYwppbmRleCA3MGZkN2U0Li42NTFjOTNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KQEAgLTg3MCwyNCArODcxLDE3IEBACiBpbmxpbmUgdm9pZCBfX2luaXQgY2hlY2tfaXJxX3NyYyhzdHJ1Y3QgbXBjX2ludHNyYyAqbSwgaW50ICpucl9tX3NwYXJlKSB7fQogI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLwogCi1zdGF0aWMgaW50IGNoZWNrX3Nsb3QodW5zaWduZWQgbG9uZyBtcGNfbmV3X3BoeXMsIHVuc2lnbmVkIGxvbmcgbXBjX25ld19sZW5ndGgsCi0JCSAgICAgIGludCBjb3VudCkKK3N0YXRpYyBpbnQKK2NoZWNrX3Nsb3QodW5zaWduZWQgbG9uZyBtcGNfbmV3X3BoeXMsIHVuc2lnbmVkIGxvbmcgbXBjX25ld19sZW5ndGgsIGludCBjb3VudCkKIHsKLQlpZiAoIW1wY19uZXdfcGh5cykgewotCQlwcl9pbmZvKCJObyBzcGFyZSBzbG90cywgdHJ5IHRvIGFwcGVuZC4uLnRha2UgeW91ciByaXNrLCAiCi0JCQkibmV3IG1wY19sZW5ndGggJXhcbiIsIGNvdW50KTsKLQl9IGVsc2UgewotCQlpZiAoY291bnQgPD0gbXBjX25ld19sZW5ndGgpCi0JCQlwcl9pbmZvKCJObyBzcGFyZSBzbG90cywgdHJ5IHRvIGFwcGVuZC4uLiwgIgotCQkJCSJuZXcgbXBjX2xlbmd0aCAleFxuIiwgY291bnQpOwotCQllbHNlIHsKLQkJCXByX2VycigibXBjX25ld19sZW5ndGggJWx4IGlzIHRvbyBzbWFsbFxuIiwKLQkJCQltcGNfbmV3X2xlbmd0aCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKwlpbnQgcmV0ID0gMDsKKworCWlmICghbXBjX25ld19waHlzIHx8IGNvdW50IDw9IG1wY19uZXdfbGVuZ3RoKSB7CisJCVdBUk4oMSwgInVwZGF0ZV9tcHRhYmxlOiBObyBzcGFyZSBzbG90cyAobGVuZ3RoOiAleClcbiIsIGNvdW50KTsKKwkJcmV0dXJuIC0xOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgIF9faW5pdCByZXBsYWNlX2ludHNyY19hbGwoc3RydWN0IG1wY190YWJsZSAqbXBjLApAQCAtOTQ2LDcgKzk0MCw3IEBACiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgbXBjX2ludHNyYyAqbSA9IChzdHJ1Y3QgbXBjX2ludHNyYyAqKW1wdDsKIAkJCWNvdW50ICs9IHNpemVvZihzdHJ1Y3QgbXBjX2ludHNyYyk7Ci0JCQlpZiAoIWNoZWNrX3Nsb3QobXBjX25ld19waHlzLCBtcGNfbmV3X2xlbmd0aCwgY291bnQpKQorCQkJaWYgKGNoZWNrX3Nsb3QobXBjX25ld19waHlzLCBtcGNfbmV3X2xlbmd0aCwgY291bnQpIDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJCWFzc2lnbl90b19tcGNfaW50c3JjKCZtcF9pcnFzW2ldLCBtKTsKIAkJCW1wYy0+bGVuZ3RoID0gY291bnQ7CkBAIC05NjMsMTEgKzk1NywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgZW5hYmxlX3VwZGF0ZV9tcHRhYmxlOworaW50IGVuYWJsZV91cGRhdGVfbXB0YWJsZTsKIAogc3RhdGljIGludCBfX2luaXQgdXBkYXRlX21wdGFibGVfc2V0dXAoY2hhciAqc3RyKQogewogCWVuYWJsZV91cGRhdGVfbXB0YWJsZSA9IDE7CisjaWZkZWYgQ09ORklHX1BDSQorCXBjaV9yb3V0ZWlycSA9IDE7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X3BhcmFtKCJ1cGRhdGVfbXB0YWJsZSIsIHVwZGF0ZV9tcHRhYmxlX3NldHVwKTsKQEAgLTk4MCw2ICs5NzcsOSBAQAogc3RhdGljIGludCBfX2luaXQgcGFyc2VfYWxsb2NfbXB0YWJsZV9vcHQoY2hhciAqcCkKIHsKIAllbmFibGVfdXBkYXRlX21wdGFibGUgPSAxOworI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfcm91dGVpcnEgPSAxOworI2VuZGlmCiAJYWxsb2NfbXB0YWJsZSA9IDE7CiAJaWYgKCFwKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKaW5kZXggOWZhZjQzYi4uNzBlYzliOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKQEAgLTI0OCwxOCArMjQ4LDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbnRlcl9sYXp5KGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpCiB7Ci0JQlVHX09OKF9fZ2V0X2NwdV92YXIocGFyYXZpcnRfbGF6eV9tb2RlKSAhPSBQQVJBVklSVF9MQVpZX05PTkUpOwotCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKKwlCVUdfT04ocGVyY3B1X3JlYWQocGFyYXZpcnRfbGF6eV9tb2RlKSAhPSBQQVJBVklSVF9MQVpZX05PTkUpOwogCi0JX19nZXRfY3B1X3ZhcihwYXJhdmlydF9sYXp5X21vZGUpID0gbW9kZTsKKwlwZXJjcHVfd3JpdGUocGFyYXZpcnRfbGF6eV9tb2RlLCBtb2RlKTsKIH0KIAotdm9pZCBwYXJhdmlydF9sZWF2ZV9sYXp5KGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpCitzdGF0aWMgdm9pZCBsZWF2ZV9sYXp5KGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpCiB7Ci0JQlVHX09OKF9fZ2V0X2NwdV92YXIocGFyYXZpcnRfbGF6eV9tb2RlKSAhPSBtb2RlKTsKLQlCVUdfT04ocHJlZW1wdGlibGUoKSk7CisJQlVHX09OKHBlcmNwdV9yZWFkKHBhcmF2aXJ0X2xhenlfbW9kZSkgIT0gbW9kZSk7CiAKLQlfX2dldF9jcHVfdmFyKHBhcmF2aXJ0X2xhenlfbW9kZSkgPSBQQVJBVklSVF9MQVpZX05PTkU7CisJcGVyY3B1X3dyaXRlKHBhcmF2aXJ0X2xhenlfbW9kZSwgUEFSQVZJUlRfTEFaWV9OT05FKTsKIH0KIAogdm9pZCBwYXJhdmlydF9lbnRlcl9sYXp5X21tdSh2b2lkKQpAQCAtMjY5LDIyICsyNjcsMzYgQEAKIAogdm9pZCBwYXJhdmlydF9sZWF2ZV9sYXp5X21tdSh2b2lkKQogewotCXBhcmF2aXJ0X2xlYXZlX2xhenkoUEFSQVZJUlRfTEFaWV9NTVUpOworCWxlYXZlX2xhenkoUEFSQVZJUlRfTEFaWV9NTVUpOwogfQogCi12b2lkIHBhcmF2aXJ0X2VudGVyX2xhenlfY3B1KHZvaWQpCit2b2lkIHBhcmF2aXJ0X3N0YXJ0X2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKKwlCVUdfT04ocHJlZW1wdGlibGUoKSk7CisKKwlpZiAocGVyY3B1X3JlYWQocGFyYXZpcnRfbGF6eV9tb2RlKSA9PSBQQVJBVklSVF9MQVpZX01NVSkgeworCQlhcmNoX2xlYXZlX2xhenlfbW11X21vZGUoKTsKKwkJc2V0X3RpX3RocmVhZF9mbGFnKHRhc2tfdGhyZWFkX2luZm8ocHJldiksIFRJRl9MQVpZX01NVV9VUERBVEVTKTsKKwl9CiAJZW50ZXJfbGF6eShQQVJBVklSVF9MQVpZX0NQVSk7CiB9CiAKLXZvaWQgcGFyYXZpcnRfbGVhdmVfbGF6eV9jcHUodm9pZCkKK3ZvaWQgcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlwYXJhdmlydF9sZWF2ZV9sYXp5KFBBUkFWSVJUX0xBWllfQ1BVKTsKKwlCVUdfT04ocHJlZW1wdGlibGUoKSk7CisKKwlsZWF2ZV9sYXp5KFBBUkFWSVJUX0xBWllfQ1BVKTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl90aV90aHJlYWRfZmxhZyh0YXNrX3RocmVhZF9pbmZvKG5leHQpLCBUSUZfTEFaWV9NTVVfVVBEQVRFUykpCisJCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOwogfQogCiBlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSBwYXJhdmlydF9nZXRfbGF6eV9tb2RlKHZvaWQpCiB7Ci0JcmV0dXJuIF9fZ2V0X2NwdV92YXIocGFyYXZpcnRfbGF6eV9tb2RlKTsKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXJldHVybiBQQVJBVklSVF9MQVpZX05PTkU7CisKKwlyZXR1cm4gcGVyY3B1X3JlYWQocGFyYXZpcnRfbGF6eV9tb2RlKTsKIH0KIAogdm9pZCBhcmNoX2ZsdXNoX2xhenlfbW11X21vZGUodm9pZCkKQEAgLTI5Miw3ICszMDQsNiBAQAogCXByZWVtcHRfZGlzYWJsZSgpOwogCiAJaWYgKHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSA9PSBQQVJBVklSVF9MQVpZX01NVSkgewotCQlXQVJOX09OKHByZWVtcHRfY291bnQoKSA9PSAxKTsKIAkJYXJjaF9sZWF2ZV9sYXp5X21tdV9tb2RlKCk7CiAJCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOwogCX0KQEAgLTMwMCwxOSArMzExLDYgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi12b2lkIGFyY2hfZmx1c2hfbGF6eV9jcHVfbW9kZSh2b2lkKQotewotCXByZWVtcHRfZGlzYWJsZSgpOwotCi0JaWYgKHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSA9PSBQQVJBVklSVF9MQVpZX0NQVSkgewotCQlXQVJOX09OKHByZWVtcHRfY291bnQoKSA9PSAxKTsKLQkJYXJjaF9sZWF2ZV9sYXp5X2NwdV9tb2RlKCk7Ci0JCWFyY2hfZW50ZXJfbGF6eV9jcHVfbW9kZSgpOwotCX0KLQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KIHN0cnVjdCBwdl9pbmZvIHB2X2luZm8gPSB7CiAJLm5hbWUgPSAiYmFyZSBoYXJkd2FyZSIsCiAJLnBhcmF2aXJ0X2VuYWJsZWQgPSAwLApAQCAtNDA0LDEwICs0MDIsOCBAQAogCS5zZXRfaW9wbF9tYXNrID0gbmF0aXZlX3NldF9pb3BsX21hc2ssCiAJLmlvX2RlbGF5ID0gbmF0aXZlX2lvX2RlbGF5LAogCi0JLmxhenlfbW9kZSA9IHsKLQkJLmVudGVyID0gcGFyYXZpcnRfbm9wLAotCQkubGVhdmUgPSBwYXJhdmlydF9ub3AsCi0JfSwKKwkuc3RhcnRfY29udGV4dF9zd2l0Y2ggPSBwYXJhdmlydF9ub3AsCisJLmVuZF9jb250ZXh0X3N3aXRjaCA9IHBhcmF2aXJ0X25vcCwKIH07CiAKIHN0cnVjdCBwdl9hcGljX29wcyBwdl9hcGljX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wY2ktY2FsZ2FyeV82NC5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKaW5kZXggNzU1YzIxZS4uOTcxYTNiZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKQEAgLTE4NiwzNyArMTg2LDYgQEAKIAogc3RhdGljIHN0cnVjdCBjYWxnYXJ5X2J1c19pbmZvIGJ1c19pbmZvW01BWF9QSEJfQlVTX05VTV0gPSB7IHsgTlVMTCwgMCwgMCB9LCB9OwogCi0vKiBlbmFibGUgdGhpcyB0byBzdHJlc3MgdGVzdCB0aGUgY2hpcCdzIFRDRSBjYWNoZSAqLwotI2lmZGVmIENPTkZJR19JT01NVV9ERUJVRwotc3RhdGljIGludCBkZWJ1Z2dpbmcgPSAxOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmVyaWZ5X2JpdF9yYW5nZSh1bnNpZ25lZCBsb25nKiBiaXRtYXAsCi0JaW50IGV4cGVjdGVkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQl1bnNpZ25lZCBsb25nIGlkeCA9IHN0YXJ0OwotCi0JQlVHX09OKHN0YXJ0ID49IGVuZCk7Ci0KLQl3aGlsZSAoaWR4IDwgZW5kKSB7Ci0JCWlmICghIXRlc3RfYml0KGlkeCwgYml0bWFwKSAhPSBleHBlY3RlZCkKLQkJCXJldHVybiBpZHg7Ci0JCSsraWR4OwotCX0KLQotCS8qIGFsbCBiaXRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlICovCi0JcmV0dXJuIH4wVUw7Ci19Ci0jZWxzZSAvKiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQgKi8KLXN0YXRpYyBpbnQgZGVidWdnaW5nOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmVyaWZ5X2JpdF9yYW5nZSh1bnNpZ25lZCBsb25nKiBiaXRtYXAsCi0JaW50IGV4cGVjdGVkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlyZXR1cm4gfjBVTDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19JT01NVV9ERUJVRyAqLwotCiBzdGF0aWMgaW5saW5lIGludCB0cmFuc2xhdGlvbl9lbmFibGVkKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsKQogewogCS8qIG9ubHkgUEhCcyB3aXRoIHRyYW5zbGF0aW9uIGVuYWJsZWQgaGF2ZSBhbiBJT01NVSB0YWJsZSAqLwpAQCAtMjI4LDcgKzE5Nyw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBpbmRleDsKIAl1bnNpZ25lZCBsb25nIGVuZDsKLQl1bnNpZ25lZCBsb25nIGJhZGJpdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaW5kZXggPSBzdGFydF9hZGRyID4+IFBBR0VfU0hJRlQ7CkBAIC0yNDMsMTQgKzIxMSw2IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdGJsLT5pdF9sb2NrLCBmbGFncyk7CiAKLQliYWRiaXQgPSB2ZXJpZnlfYml0X3JhbmdlKHRibC0+aXRfbWFwLCAwLCBpbmRleCwgZW5kKTsKLQlpZiAoYmFkYml0ICE9IH4wVUwpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogZW50cnkgYWxyZWFkeSBhbGxvY2F0ZWQgYXQgIgotCQkJICAgICAgICIweCVseCB0YmwgJXAgZG1hIDB4JWx4IG5wYWdlcyAldVxuIiwKLQkJCSAgICAgICBiYWRiaXQsIHRibCwgc3RhcnRfYWRkciwgbnBhZ2VzKTsKLQl9Ci0KIAlpb21tdV9hcmVhX3Jlc2VydmUodGJsLT5pdF9tYXAsIGluZGV4LCBucGFnZXMpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGJsLT5pdF9sb2NrLCBmbGFncyk7CkBAIC0zMjYsNyArMjg2LDYgQEAKIAl1bnNpZ25lZCBpbnQgbnBhZ2VzKQogewogCXVuc2lnbmVkIGxvbmcgZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBiYWRiaXQ7CiAJdW5zaWduZWQgbG9uZyBiYWRlbmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMzQ2LDE0ICszMDUsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRibC0+aXRfbG9jaywgZmxhZ3MpOwogCi0JYmFkYml0ID0gdmVyaWZ5X2JpdF9yYW5nZSh0YmwtPml0X21hcCwgMSwgZW50cnksIGVudHJ5ICsgbnBhZ2VzKTsKLQlpZiAoYmFkYml0ICE9IH4wVUwpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogYml0IGlzIG9mZiBhdCAweCVseCAiCi0JCQkgICAgICAgInRibCAlcCBkbWEgMHglTHggZW50cnkgMHglbHggbnBhZ2VzICV1XG4iLAotCQkJICAgICAgIGJhZGJpdCwgdGJsLCBkbWFfYWRkciwgZW50cnksIG5wYWdlcyk7Ci0JfQotCiAJaW9tbXVfYXJlYV9mcmVlKHRibC0+aXRfbWFwLCBlbnRyeSwgbnBhZ2VzKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRibC0+aXRfbG9jaywgZmxhZ3MpOwpAQCAtMTQ4OCw5ICsxNDM5LDggQEAKIAkJaW9tbXVfZGV0ZWN0ZWQgPSAxOwogCQljYWxnYXJ5X2RldGVjdGVkID0gMTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogQ2FsZ2FyeSBJT01NVSBkZXRlY3RlZC5cbiIpOwotCQlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiBDYWxnYXJ5IFRDRSB0YWJsZSBzcGVjIGlzICVkLCAiCi0JCSAgICAgICAiQ09ORklHX0lPTU1VX0RFQlVHIGlzICVzLlxuIiwgc3BlY2lmaWVkX3RhYmxlX3NpemUsCi0JCSAgICAgICBkZWJ1Z2dpbmcgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogQ2FsZ2FyeSBUQ0UgdGFibGUgc3BlYyBpcyAlZFxuIiwKKwkJICAgICAgIHNwZWNpZmllZF90YWJsZV9zaXplKTsKIAogCQkvKiBzd2lvdGxiIGZvciBkZXZpY2VzIHRoYXQgYXJlbid0IGJlaGluZCB0aGUgQ2FsZ2FyeS4gKi8KIAkJaWYgKG1heF9wZm4gPiBNQVhfRE1BMzJfUEZOKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1nYXJ0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYwppbmRleCBiMjg0YjU4Li5jZmQ5ZjkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYwpAQCAtMTQ0LDQ4ICsxNDQsMjEgQEAKIH0KIAogI2lmZGVmIENPTkZJR19JT01NVV9MRUFLCi0KLSNkZWZpbmUgU0VUX0xFQUsoeCkJCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKGlvbW11X2xlYWtfdGFiKQkJCQkJXAotCQkJaW9tbXVfbGVha190YWJbeF0gPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7XAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0xFQVJfTEVBSyh4KQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoaW9tbXVfbGVha190YWIpCQkJCQlcCi0JCQlpb21tdV9sZWFrX3RhYlt4XSA9IE5VTEw7CQkJXAotCX0gd2hpbGUgKDApCi0KIC8qIERlYnVnZ2luZyBhaWQgZm9yIGRyaXZlcnMgdGhhdCBkb24ndCBmcmVlIHRoZWlyIElPTU1VIHRhYmxlcyAqLwotc3RhdGljIHZvaWQgKippb21tdV9sZWFrX3RhYjsKIHN0YXRpYyBpbnQgbGVha190cmFjZTsKIHN0YXRpYyBpbnQgaW9tbXVfbGVha19wYWdlcyA9IDIwOwogCiBzdGF0aWMgdm9pZCBkdW1wX2xlYWsodm9pZCkKIHsKLQlpbnQgaTsKIAlzdGF0aWMgaW50IGR1bXA7CiAKLQlpZiAoZHVtcCB8fCAhaW9tbXVfbGVha190YWIpCisJaWYgKGR1bXApCiAJCXJldHVybjsKIAlkdW1wID0gMTsKLQlzaG93X3N0YWNrKE5VTEwsIE5VTEwpOwogCi0JLyogVmVyeSBjcnVkZS4gZHVtcCBzb21lIGZyb20gdGhlIGVuZCBvZiB0aGUgdGFibGUgdG9vICovCi0JcHJpbnRrKEtFUk5fREVCVUcgIkR1bXBpbmcgJWQgcGFnZXMgZnJvbSBlbmQgb2YgSU9NTVU6XG4iLAotCSAgICAgICBpb21tdV9sZWFrX3BhZ2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgaW9tbXVfbGVha19wYWdlczsgaSArPSAyKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlbHU6ICIsIGlvbW11X3BhZ2VzLWkpOwotCQlwcmludGtfYWRkcmVzcygodW5zaWduZWQgbG9uZykgaW9tbXVfbGVha190YWJbaW9tbXVfcGFnZXMtaV0sCi0JCQkJMCk7Ci0JCXByaW50ayhLRVJOX0NPTlQgIiVjIiwgKGkrMSklMiA9PSAwID8gJ1xuJyA6ICcgJyk7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworCXNob3dfc3RhY2soTlVMTCwgTlVMTCk7CisJZGVidWdfZG1hX2R1bXBfbWFwcGluZ3MoTlVMTCk7CiB9Ci0jZWxzZQotIyBkZWZpbmUgU0VUX0xFQUsoeCkKLSMgZGVmaW5lIENMRUFSX0xFQUsoeCkKICNlbmRpZgogCiBzdGF0aWMgdm9pZCBpb21tdV9mdWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGludCBkaXIpCkBAIC0yNDgsNyArMjIxLDYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewogCQlpb21tdV9nYXR0X2Jhc2VbaW9tbXVfcGFnZSArIGldID0gR1BURV9FTkNPREUocGh5c19tZW0pOwotCQlTRVRfTEVBSyhpb21tdV9wYWdlICsgaSk7CiAJCXBoeXNfbWVtICs9IFBBR0VfU0laRTsKIAl9CiAJcmV0dXJuIGlvbW11X2J1c19iYXNlICsgaW9tbXVfcGFnZSpQQUdFX1NJWkUgKyAocGh5c19tZW0gJiB+UEFHRV9NQVNLKTsKQEAgLTI5NCw3ICsyNjYsNiBAQAogCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhkbWFfYWRkciwgc2l6ZSwgUEFHRV9TSVpFKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKIAkJaW9tbXVfZ2F0dF9iYXNlW2lvbW11X3BhZ2UgKyBpXSA9IGdhcnRfdW5tYXBwZWRfZW50cnk7Ci0JCUNMRUFSX0xFQUsoaW9tbXVfcGFnZSArIGkpOwogCX0KIAlmcmVlX2lvbW11KGlvbW11X3BhZ2UsIG5wYWdlcyk7CiB9CkBAIC0zNzcsNyArMzQ4LDYgQEAKIAkJcGFnZXMgPSBpb21tdV9udW1fcGFnZXMocy0+b2Zmc2V0LCBzLT5sZW5ndGgsIFBBR0VfU0laRSk7CiAJCXdoaWxlIChwYWdlcy0tKSB7CiAJCQlpb21tdV9nYXR0X2Jhc2VbaW9tbXVfcGFnZV0gPSBHUFRFX0VOQ09ERShhZGRyKTsKLQkJCVNFVF9MRUFLKGlvbW11X3BhZ2UpOwogCQkJYWRkciArPSBQQUdFX1NJWkU7CiAJCQlpb21tdV9wYWdlKys7CiAJCX0KQEAgLTY4OCw4ICs2NTgsNiBAQAogCiAJYWdwX2dhdHRfdGFibGUgPSBnYXR0OwogCi0JZW5hYmxlX2dhcnRfdHJhbnNsYXRpb25zKCk7Ci0KIAllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmZ2FydF9zeXNkZXZfY2xhc3MpOwogCWlmICghZXJyb3IpCiAJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfZ2FydCk7CkBAIC04MDEsMTEgKzc2OSwxMiBAQAogCiAjaWZkZWYgQ09ORklHX0lPTU1VX0xFQUsKIAlpZiAobGVha190cmFjZSkgewotCQlpb21tdV9sZWFrX3RhYiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCi0JCQkJICBnZXRfb3JkZXIoaW9tbXVfcGFnZXMqc2l6ZW9mKHZvaWQgKikpKTsKLQkJaWYgKCFpb21tdV9sZWFrX3RhYikKKwkJaW50IHJldDsKKworCQlyZXQgPSBkbWFfZGVidWdfcmVzaXplX2VudHJpZXMoaW9tbXVfcGFnZXMpOworCQlpZiAocmV0KQogCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCSAgICAgICAiUENJLURNQTogQ2Fubm90IGFsbG9jYXRlIGxlYWsgdHJhY2UgYXJlYVxuIik7CisJCQkgICAgICAgIlBDSS1ETUE6IENhbm5vdCB0cmFjZSBhbGwgdGhlIGVudHJpZXNcbiIpOwogCX0KICNlbmRpZgogCkBAIC04NDUsNiArODE0LDE0IEBACiAJICogdGhlIHBhZ2VzIGFzIE5vdC1QcmVzZW50OgogCSAqLwogCXdiaW52ZCgpOworCQorCS8qCisJICogTm93IGFsbCBjYWNoZXMgYXJlIGZsdXNoZWQgYW5kIHdlIGNhbiBzYWZlbHkgZW5hYmxlCisJICogR0FSVCBoYXJkd2FyZS4gIERvaW5nIGl0IGVhcmx5IGxlYXZlcyB0aGUgcG9zc2liaWxpdHkKKwkgKiBvZiBzdGFsZSBjYWNoZSBlbnRyaWVzIHRoYXQgY2FuIGxlYWQgdG8gR0FSVCBQVEUKKwkgKiBlcnJvcnMuCisJICovCisJZW5hYmxlX2dhcnRfdHJhbnNsYXRpb25zKCk7CiAKIAkvKgogCSAqIFRyeSB0byB3b3JrYXJvdW5kIGEgYnVnICh0aGFua3MgdG8gQmVuSCk6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGIuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYi5jCmluZGV4IDIyMWEzODUuLmExNzEyZjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYi5jCkBAIC0yOCw3ICsyOCw3IEBACiAJcmV0dXJuIHBhZGRyOwogfQogCi1waHlzX2FkZHJfdCBzd2lvdGxiX2J1c190b19waHlzKGRtYV9hZGRyX3QgYmFkZHIpCitwaHlzX2FkZHJfdCBzd2lvdGxiX2J1c190b19waHlzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGJhZGRyKQogewogCXJldHVybiBiYWRkcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGNhOTg5MTUuLjNiYjJiZTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtOCwxMiArOCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPHRyYWNlL3Bvd2VyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8YXNtL2lkbGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL2RzLmg+CiAKIHVuc2lnbmVkIGxvbmcgaWRsZV9oYWx0OwogRVhQT1JUX1NZTUJPTChpZGxlX2hhbHQpOwpAQCAtNDUsNiArNDgsOCBAQAogCQlrbWVtX2NhY2hlX2ZyZWUodGFza194c3RhdGVfY2FjaGVwLCB0c2stPnRocmVhZC54c3RhdGUpOwogCQl0c2stPnRocmVhZC54c3RhdGUgPSBOVUxMOwogCX0KKworCVdBUk4odHNrLT50aHJlYWQuZHNfY3R4LCAibGVha2luZyBEUyBjb250ZXh0XG4iKTsKIH0KIAogdm9pZCBmcmVlX3RocmVhZF9pbmZvKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCkBAIC04Myw4ICs4OCw2IEBACiAJCXB1dF9jcHUoKTsKIAkJa2ZyZWUoYnApOwogCX0KLQotCWRzX2V4aXRfdGhyZWFkKGN1cnJlbnQpOwogfQogCiB2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQpAQCAtNjEzLDMgKzYxNiwxNiBAQAogfQogZWFybHlfcGFyYW0oImlkbGUiLCBpZGxlX3NldHVwKTsKIAordW5zaWduZWQgbG9uZyBhcmNoX2FsaWduX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3ApCit7CisJaWYgKCEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBBRERSX05PX1JBTkRPTUlaRSkgJiYgcmFuZG9taXplX3ZhX3NwYWNlKQorCQlzcCAtPSBnZXRfcmFuZG9tX2ludCgpICUgODE5MjsKKwlyZXR1cm4gc3AgJiB+MHhmOworfQorCit1bnNpZ25lZCBsb25nIGFyY2hfcmFuZG9taXplX2JyayhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIHJhbmdlX2VuZCA9IG1tLT5icmsgKyAweDAyMDAwMDAwOworCXJldHVybiByYW5kb21pemVfcmFuZ2UobW0tPmJyaywgcmFuZ2VfZW5kLCAwKSA/IDogbW0tPmJyazsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKaW5kZXggNzZmOGY4NC4uNTlmNDUyNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC05LDggKzksNiBAQAogICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgcHJvY2VzcyBoYW5kbGluZy4uCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCiAjaW5jbHVkZSA8bGludXgvc3RhY2twcm90ZWN0b3IuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtMzMsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CkBAIC0yOTAsNyArMjg3LDggQEAKIAkJcC0+dGhyZWFkLmlvX2JpdG1hcF9tYXggPSAwOwogCX0KIAotCWRzX2NvcHlfdGhyZWFkKHAsIGN1cnJlbnQpOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhwLCBUSUZfRFNfQVJFQV9NU1IpOworCXAtPnRocmVhZC5kc19jdHggPSBOVUxMOwogCiAJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9ERUJVR0NUTE1TUik7CiAJcC0+dGhyZWFkLmRlYnVnY3RsbXNyID0gMDsKQEAgLTQwNyw3ICs0MDUsNyBAQAogCSAqIGRvbmUgYmVmb3JlIG1hdGhfc3RhdGVfcmVzdG9yZSwgc28gdGhlIFRTIGJpdCBpcyB1cAogCSAqIHRvIGRhdGUuCiAJICovCi0JYXJjaF9sZWF2ZV9sYXp5X2NwdV9tb2RlKCk7CisJYXJjaF9lbmRfY29udGV4dF9zd2l0Y2gobmV4dF9wKTsKIAogCS8qIElmIHRoZSB0YXNrIGhhcyB1c2VkIGZwdSB0aGUgbGFzdCA1IHRpbWVzbGljZXMsIGp1c3QgZG8gYSBmdWxsCiAJICogcmVzdG9yZSBvZiB0aGUgbWF0aCBzdGF0ZSBpbW1lZGlhdGVseSB0byBhdm9pZCB0aGUgdHJhcDsgdGhlCkBAIC00OTcsMTUgKzQ5NSwzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbl9zdGFjayh1bnNpZ25lZCBsb25nIHNwKQotewotCWlmICghKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9OT19SQU5ET01JWkUpICYmIHJhbmRvbWl6ZV92YV9zcGFjZSkKLQkJc3AgLT0gZ2V0X3JhbmRvbV9pbnQoKSAlIDgxOTI7Ci0JcmV0dXJuIHNwICYgfjB4ZjsKLX0KLQotdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JdW5zaWduZWQgbG9uZyByYW5nZV9lbmQgPSBtbS0+YnJrICsgMHgwMjAwMDAwMDsKLQlyZXR1cm4gcmFuZG9taXplX3JhbmdlKG1tLT5icmssIHJhbmdlX2VuZCwgMCkgPyA6IG1tLT5icms7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCBiNzUxYTQxLi5lYmVmYjU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTE0LDggKzE0LDYgQEAKICAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIHByb2Nlc3MgaGFuZGxpbmcuLgogICovCiAKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQogI2luY2x1ZGUgPGxpbnV4L3N0YWNrcHJvdGVjdG9yLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTMyLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgpAQCAtMzM1LDcgKzMzMiw4IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQlkc19jb3B5X3RocmVhZChwLCBtZSk7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9EU19BUkVBX01TUik7CisJcC0+dGhyZWFkLmRzX2N0eCA9IE5VTEw7CiAKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcocCwgVElGX0RFQlVHQ1RMTVNSKTsKIAlwLT50aHJlYWQuZGVidWdjdGxtc3IgPSAwOwpAQCAtNDI4LDcgKzQyNiw3IEBACiAJICogZG9uZSBiZWZvcmUgbWF0aF9zdGF0ZV9yZXN0b3JlLCBzbyB0aGUgVFMgYml0IGlzIHVwCiAJICogdG8gZGF0ZS4KIAkgKi8KLQlhcmNoX2xlYXZlX2xhenlfY3B1X21vZGUoKTsKKwlhcmNoX2VuZF9jb250ZXh0X3N3aXRjaChuZXh0X3ApOwogCiAJLyoKIAkgKiBTd2l0Y2ggRlMgYW5kIEdTLgpAQCAtNjYwLDE1ICs2NTgsMyBAQAogCXJldHVybiBkb19hcmNoX3ByY3RsKGN1cnJlbnQsIGNvZGUsIGFkZHIpOwogfQogCi11bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCkKLXsKLQlpZiAoIShjdXJyZW50LT5wZXJzb25hbGl0eSAmIEFERFJfTk9fUkFORE9NSVpFKSAmJiByYW5kb21pemVfdmFfc3BhY2UpCi0JCXNwIC09IGdldF9yYW5kb21faW50KCkgJSA4MTkyOwotCXJldHVybiBzcCAmIH4weGY7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgYXJjaF9yYW5kb21pemVfYnJrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCXVuc2lnbmVkIGxvbmcgcmFuZ2VfZW5kID0gbW0tPmJyayArIDB4MDIwMDAwMDA7Ci0JcmV0dXJuIHJhbmRvbWl6ZV9yYW5nZShtbS0+YnJrLCByYW5nZV9lbmQsIDApID8gOiBtbS0+YnJrOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCmluZGV4IDIzYjdjOGYuLjA5ZWNiZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTU3OCwxNyArNTc5LDEzMCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl9QVFJBQ0VfQlRTCisvKgorICogQSBicmFuY2ggdHJhY2Ugc3RvcmUgY29udGV4dC4KKyAqCisgKiBDb250ZXh0cyBtYXkgb25seSBiZSBpbnN0YWxsZWQgYnkgcHRyYWNlX2J0c19jb25maWcoKSBhbmQgb25seSBmb3IKKyAqIHB0cmFjZWQgdGFza3MuCisgKgorICogQ29udGV4dHMgYXJlIGRlc3Ryb3llZCB3aGVuIHRoZSB0cmFjZWUgaXMgZGV0YWNoZWQgZnJvbSB0aGUgdHJhY2VyLgorICogVGhlIGFjdHVhbCBkZXN0cnVjdGlvbiB3b3JrIHJlcXVpcmVzIGludGVycnVwdHMgZW5hYmxlZCwgc28gdGhlCisgKiB3b3JrIGlzIGRlZmVycmVkIGFuZCB3aWxsIGJlIHNjaGVkdWxlZCBkdXJpbmcgX19wdHJhY2VfdW5saW5rKCkuCisgKgorICogQ29udGV4dHMgaG9sZCBhbiBhZGRpdGlvbmFsIHRhc2tfc3RydWN0IHJlZmVyZW5jZSBvbiB0aGUgdHJhY2VkCisgKiB0YXNrLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlIG9uIHRoZSB0cmFjZXIncyBtbS4KKyAqCisgKiBQdHJhY2UgYWxyZWFkeSBob2xkcyBhIHRhc2tfc3RydWN0IGZvciB0aGUgZHVyYXRpb24gb2YgcHRyYWNlIG9wZXJhdGlvbnMsCisgKiBidXQgc2luY2UgZGVzdHJ1Y3Rpb24gaXMgZGVmZXJyZWQsIGl0IG1heSBiZSBleGVjdXRlZCBhZnRlciBib3RoCisgKiB0cmFjZXIgYW5kIHRyYWNlZSBleGl0ZWQuCisgKi8KK3N0cnVjdCBidHNfY29udGV4dCB7CisJLyogVGhlIGJyYW5jaCB0cmFjZSBoYW5kbGUuICovCisJc3RydWN0IGJ0c190cmFjZXIJKnRyYWNlcjsKKworCS8qIFRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSB0aGUgYnJhbmNoIHRyYWNlIGFuZCBpdHMgc2l6ZS4gKi8KKwl2b2lkCQkJKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQJCXNpemU7CisKKwkvKiBUaGUgbW0gdGhhdCBwYWlkIGZvciB0aGUgYWJvdmUgYnVmZmVyLiAqLworCXN0cnVjdCBtbV9zdHJ1Y3QJKm1tOworCisJLyogVGhlIHRhc2sgdGhpcyBjb250ZXh0IGJlbG9uZ3MgdG8uICovCisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworCisJLyogVGhlIHNpZ25hbCB0byBzZW5kIG9uIGEgYnRzIGJ1ZmZlciBvdmVyZmxvdy4gKi8KKwl1bnNpZ25lZCBpbnQJCWJ0c19vdmZsX3NpZ25hbDsKKworCS8qIFRoZSB3b3JrIHN0cnVjdCB0byBkZXN0cm95IGEgY29udGV4dC4gKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKK307CisKK3N0YXRpYyBpbnQgYWxsb2NfYnRzX2J1ZmZlcihzdHJ1Y3QgYnRzX2NvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBzaXplKQoreworCXZvaWQgKmJ1ZmZlciA9IE5VTEw7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwllcnIgPSBhY2NvdW50X2xvY2tlZF9tZW1vcnkoY3VycmVudC0+bW0sIGN1cnJlbnQtPnNpZ25hbC0+cmxpbSwgc2l6ZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlidWZmZXIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlnb3RvIG91dF9yZWZ1bmQ7CisKKwljb250ZXh0LT5idWZmZXIgPSBidWZmZXI7CisJY29udGV4dC0+c2l6ZSA9IHNpemU7CisJY29udGV4dC0+bW0gPSBnZXRfdGFza19tbShjdXJyZW50KTsKKworCXJldHVybiAwOworCisgb3V0X3JlZnVuZDoKKwlyZWZ1bmRfbG9ja2VkX21lbW9yeShjdXJyZW50LT5tbSwgc2l6ZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYnRzX2J1ZmZlcihzdHJ1Y3QgYnRzX2NvbnRleHQgKmNvbnRleHQpCit7CisJaWYgKCFjb250ZXh0LT5idWZmZXIpCisJCXJldHVybjsKKworCWtmcmVlKGNvbnRleHQtPmJ1ZmZlcik7CisJY29udGV4dC0+YnVmZmVyID0gTlVMTDsKKworCXJlZnVuZF9sb2NrZWRfbWVtb3J5KGNvbnRleHQtPm1tLCBjb250ZXh0LT5zaXplKTsKKwljb250ZXh0LT5zaXplID0gMDsKKworCW1tcHV0KGNvbnRleHQtPm1tKTsKKwljb250ZXh0LT5tbSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYnRzX2NvbnRleHRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJc3RydWN0IGJ0c19jb250ZXh0ICpjb250ZXh0OworCisJY29udGV4dCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYnRzX2NvbnRleHQsIHdvcmspOworCisJZHNfcmVsZWFzZV9idHMoY29udGV4dC0+dHJhY2VyKTsKKwlwdXRfdGFza19zdHJ1Y3QoY29udGV4dC0+dGFzayk7CisJZnJlZV9idHNfYnVmZmVyKGNvbnRleHQpOworCWtmcmVlKGNvbnRleHQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9idHNfY29udGV4dChzdHJ1Y3QgYnRzX2NvbnRleHQgKmNvbnRleHQpCit7CisJSU5JVF9XT1JLKCZjb250ZXh0LT53b3JrLCBmcmVlX2J0c19jb250ZXh0X3dvcmspOworCXNjaGVkdWxlX3dvcmsoJmNvbnRleHQtPndvcmspOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidHNfY29udGV4dCAqYWxsb2NfYnRzX2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCBidHNfY29udGV4dCAqY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKCpjb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvbnRleHQpIHsKKwkJY29udGV4dC0+dGFzayA9IHRhc2s7CisJCXRhc2stPmJ0cyA9IGNvbnRleHQ7CisKKwkJZ2V0X3Rhc2tfc3RydWN0KHRhc2spOworCX0KKworCXJldHVybiBjb250ZXh0OworfQorCiBzdGF0aWMgaW50IHB0cmFjZV9idHNfcmVhZF9yZWNvcmQoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgc2l6ZV90IGluZGV4LAogCQkJCSAgc3RydWN0IGJ0c19zdHJ1Y3QgX191c2VyICpvdXQpCiB7CisJc3RydWN0IGJ0c19jb250ZXh0ICpjb250ZXh0OwogCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlOwogCXN0cnVjdCBidHNfc3RydWN0IGJ0czsKIAljb25zdCB1bnNpZ25lZCBjaGFyICphdDsKIAlpbnQgZXJyb3I7CiAKLQl0cmFjZSA9IGRzX3JlYWRfYnRzKGNoaWxkLT5idHMpOworCWNvbnRleHQgPSBjaGlsZC0+YnRzOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuIC1FU1JDSDsKKworCXRyYWNlID0gZHNfcmVhZF9idHMoY29udGV4dC0+dHJhY2VyKTsKIAlpZiAoIXRyYWNlKQotCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gLUVTUkNIOwogCiAJYXQgPSB0cmFjZS0+ZHMudG9wIC0gKChpbmRleCArIDEpICogdHJhY2UtPmRzLnNpemUpOwogCWlmICgodm9pZCAqKWF0IDwgdHJhY2UtPmRzLmJlZ2luKQpAQCAtNTk3LDcgKzcxMSw3IEBACiAJaWYgKCF0cmFjZS0+cmVhZCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JZXJyb3IgPSB0cmFjZS0+cmVhZChjaGlsZC0+YnRzLCBhdCwgJmJ0cyk7CisJZXJyb3IgPSB0cmFjZS0+cmVhZChjb250ZXh0LT50cmFjZXIsIGF0LCAmYnRzKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTYxMSwxMyArNzI1LDE4IEBACiAJCQkgICAgbG9uZyBzaXplLAogCQkJICAgIHN0cnVjdCBidHNfc3RydWN0IF9fdXNlciAqb3V0KQogeworCXN0cnVjdCBidHNfY29udGV4dCAqY29udGV4dDsKIAljb25zdCBzdHJ1Y3QgYnRzX3RyYWNlICp0cmFjZTsKIAljb25zdCB1bnNpZ25lZCBjaGFyICphdDsKIAlpbnQgZXJyb3IsIGRyYWluZWQgPSAwOwogCi0JdHJhY2UgPSBkc19yZWFkX2J0cyhjaGlsZC0+YnRzKTsKKwljb250ZXh0ID0gY2hpbGQtPmJ0czsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAtRVNSQ0g7CisKKwl0cmFjZSA9IGRzX3JlYWRfYnRzKGNvbnRleHQtPnRyYWNlcik7CiAJaWYgKCF0cmFjZSkKLQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIC1FU1JDSDsKIAogCWlmICghdHJhY2UtPnJlYWQpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTYyOCw5ICs3NDcsOCBAQAogCWZvciAoYXQgPSB0cmFjZS0+ZHMuYmVnaW47ICh2b2lkICopYXQgPCB0cmFjZS0+ZHMudG9wOwogCSAgICAgb3V0KyssIGRyYWluZWQrKywgYXQgKz0gdHJhY2UtPmRzLnNpemUpIHsKIAkJc3RydWN0IGJ0c19zdHJ1Y3QgYnRzOwotCQlpbnQgZXJyb3I7CiAKLQkJZXJyb3IgPSB0cmFjZS0+cmVhZChjaGlsZC0+YnRzLCBhdCwgJmJ0cyk7CisJCWVycm9yID0gdHJhY2UtPnJlYWQoY29udGV4dC0+dHJhY2VyLCBhdCwgJmJ0cyk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTY0MCwzNSArNzU4LDE4IEBACiAKIAltZW1zZXQodHJhY2UtPmRzLmJlZ2luLCAwLCB0cmFjZS0+ZHMubiAqIHRyYWNlLT5kcy5zaXplKTsKIAotCWVycm9yID0gZHNfcmVzZXRfYnRzKGNoaWxkLT5idHMpOworCWVycm9yID0gZHNfcmVzZXRfYnRzKGNvbnRleHQtPnRyYWNlcik7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCiAJcmV0dXJuIGRyYWluZWQ7CiB9CiAKLXN0YXRpYyBpbnQgcHRyYWNlX2J0c19hbGxvY2F0ZV9idWZmZXIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgc2l6ZV90IHNpemUpCi17Ci0JY2hpbGQtPmJ0c19idWZmZXIgPSBhbGxvY19sb2NrZWRfYnVmZmVyKHNpemUpOwotCWlmICghY2hpbGQtPmJ0c19idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2hpbGQtPmJ0c19zaXplID0gc2l6ZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwdHJhY2VfYnRzX2ZyZWVfYnVmZmVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCi17Ci0JZnJlZV9sb2NrZWRfYnVmZmVyKGNoaWxkLT5idHNfYnVmZmVyLCBjaGlsZC0+YnRzX3NpemUpOwotCWNoaWxkLT5idHNfYnVmZmVyID0gTlVMTDsKLQljaGlsZC0+YnRzX3NpemUgPSAwOwotfQotCiBzdGF0aWMgaW50IHB0cmFjZV9idHNfY29uZmlnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCiAJCQkgICAgIGxvbmcgY2ZnX3NpemUsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBfX3VzZXIgKnVjZmcpCiB7CisJc3RydWN0IGJ0c19jb250ZXh0ICpjb250ZXh0OwogCXN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBjZmc7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKIApAQCAtNjc4LDI4ICs3NzksMzMgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgdWNmZywgc2l6ZW9mKGNmZykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChjaGlsZC0+YnRzKSB7Ci0JCWRzX3JlbGVhc2VfYnRzKGNoaWxkLT5idHMpOwotCQljaGlsZC0+YnRzID0gTlVMTDsKLQl9CisJY29udGV4dCA9IGNoaWxkLT5idHM7CisJaWYgKCFjb250ZXh0KQorCQljb250ZXh0ID0gYWxsb2NfYnRzX2NvbnRleHQoY2hpbGQpOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoY2ZnLmZsYWdzICYgUFRSQUNFX0JUU19PX1NJR05BTCkgewogCQlpZiAoIWNmZy5zaWduYWwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQljaGlsZC0+dGhyZWFkLmJ0c19vdmZsX3NpZ25hbCA9IGNmZy5zaWduYWw7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJY29udGV4dC0+YnRzX292Zmxfc2lnbmFsID0gY2ZnLnNpZ25hbDsKIAl9CiAKLQlpZiAoKGNmZy5mbGFncyAmIFBUUkFDRV9CVFNfT19BTExPQykgJiYKLQkgICAgKGNmZy5zaXplICE9IGNoaWxkLT5idHNfc2l6ZSkpIHsKLQkJaW50IGVycm9yOworCWRzX3JlbGVhc2VfYnRzKGNvbnRleHQtPnRyYWNlcik7CisJY29udGV4dC0+dHJhY2VyID0gTlVMTDsKIAotCQlwdHJhY2VfYnRzX2ZyZWVfYnVmZmVyKGNoaWxkKTsKKwlpZiAoKGNmZy5mbGFncyAmIFBUUkFDRV9CVFNfT19BTExPQykgJiYgKGNmZy5zaXplICE9IGNvbnRleHQtPnNpemUpKSB7CisJCWludCBlcnI7CiAKLQkJZXJyb3IgPSBwdHJhY2VfYnRzX2FsbG9jYXRlX2J1ZmZlcihjaGlsZCwgY2ZnLnNpemUpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJcmV0dXJuIGVycm9yOworCQlmcmVlX2J0c19idWZmZXIoY29udGV4dCk7CisJCWlmICghY2ZnLnNpemUpCisJCQlyZXR1cm4gMDsKKworCQllcnIgPSBhbGxvY19idHNfYnVmZmVyKGNvbnRleHQsIGNmZy5zaXplKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmIChjZmcuZmxhZ3MgJiBQVFJBQ0VfQlRTX09fVFJBQ0UpCkBAIC03MDgsMTUgKzgxNCwxNCBAQAogCWlmIChjZmcuZmxhZ3MgJiBQVFJBQ0VfQlRTX09fU0NIRUQpCiAJCWZsYWdzIHw9IEJUU19USU1FU1RBTVBTOwogCi0JY2hpbGQtPmJ0cyA9IGRzX3JlcXVlc3RfYnRzKGNoaWxkLCBjaGlsZC0+YnRzX2J1ZmZlciwgY2hpbGQtPmJ0c19zaXplLAotCQkJCSAgICAvKiBvdmZsID0gKi8gTlVMTCwgLyogdGggPSAqLyAoc2l6ZV90KS0xLAotCQkJCSAgICBmbGFncyk7Ci0JaWYgKElTX0VSUihjaGlsZC0+YnRzKSkgewotCQlpbnQgZXJyb3IgPSBQVFJfRVJSKGNoaWxkLT5idHMpOworCWNvbnRleHQtPnRyYWNlciA9CisJCWRzX3JlcXVlc3RfYnRzX3Rhc2soY2hpbGQsIGNvbnRleHQtPmJ1ZmZlciwgY29udGV4dC0+c2l6ZSwKKwkJCQkgICAgTlVMTCwgKHNpemVfdCktMSwgZmxhZ3MpOworCWlmICh1bmxpa2VseShJU19FUlIoY29udGV4dC0+dHJhY2VyKSkpIHsKKwkJaW50IGVycm9yID0gUFRSX0VSUihjb250ZXh0LT50cmFjZXIpOwogCi0JCXB0cmFjZV9idHNfZnJlZV9idWZmZXIoY2hpbGQpOwotCQljaGlsZC0+YnRzID0gTlVMTDsKLQorCQlmcmVlX2J0c19idWZmZXIoY29udGV4dCk7CisJCWNvbnRleHQtPnRyYWNlciA9IE5VTEw7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTcyNywyMCArODMyLDI1IEBACiAJCQkgICAgIGxvbmcgY2ZnX3NpemUsCiAJCQkgICAgIHN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBfX3VzZXIgKnVjZmcpCiB7CisJc3RydWN0IGJ0c19jb250ZXh0ICpjb250ZXh0OwogCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlOwogCXN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBjZmc7CiAKKwljb250ZXh0ID0gY2hpbGQtPmJ0czsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAtRVNSQ0g7CisKIAlpZiAoY2ZnX3NpemUgPCBzaXplb2YoY2ZnKSkKIAkJcmV0dXJuIC1FSU87CiAKLQl0cmFjZSA9IGRzX3JlYWRfYnRzKGNoaWxkLT5idHMpOworCXRyYWNlID0gZHNfcmVhZF9idHMoY29udGV4dC0+dHJhY2VyKTsKIAlpZiAoIXRyYWNlKQotCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gLUVTUkNIOwogCiAJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQljZmcuc2l6ZSA9IHRyYWNlLT5kcy5lbmQgLSB0cmFjZS0+ZHMuYmVnaW47Ci0JY2ZnLnNpZ25hbCA9IGNoaWxkLT50aHJlYWQuYnRzX292Zmxfc2lnbmFsOwotCWNmZy5idHNfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnRzX3N0cnVjdCk7CisJY2ZnLnNpemUJPSB0cmFjZS0+ZHMuZW5kIC0gdHJhY2UtPmRzLmJlZ2luOworCWNmZy5zaWduYWwJPSBjb250ZXh0LT5idHNfb3ZmbF9zaWduYWw7CisJY2ZnLmJ0c19zaXplCT0gc2l6ZW9mKHN0cnVjdCBidHNfc3RydWN0KTsKIAogCWlmIChjZmcuc2lnbmFsKQogCQljZmcuZmxhZ3MgfD0gUFRSQUNFX0JUU19PX1NJR05BTDsKQEAgLTc1OSw4MCArODY5LDUxIEBACiAKIHN0YXRpYyBpbnQgcHRyYWNlX2J0c19jbGVhcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogeworCXN0cnVjdCBidHNfY29udGV4dCAqY29udGV4dDsKIAljb25zdCBzdHJ1Y3QgYnRzX3RyYWNlICp0cmFjZTsKIAotCXRyYWNlID0gZHNfcmVhZF9idHMoY2hpbGQtPmJ0cyk7CisJY29udGV4dCA9IGNoaWxkLT5idHM7CisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gLUVTUkNIOworCisJdHJhY2UgPSBkc19yZWFkX2J0cyhjb250ZXh0LT50cmFjZXIpOwogCWlmICghdHJhY2UpCi0JCXJldHVybiAtRVBFUk07CisJCXJldHVybiAtRVNSQ0g7CiAKIAltZW1zZXQodHJhY2UtPmRzLmJlZ2luLCAwLCB0cmFjZS0+ZHMubiAqIHRyYWNlLT5kcy5zaXplKTsKIAotCXJldHVybiBkc19yZXNldF9idHMoY2hpbGQtPmJ0cyk7CisJcmV0dXJuIGRzX3Jlc2V0X2J0cyhjb250ZXh0LT50cmFjZXIpOwogfQogCiBzdGF0aWMgaW50IHB0cmFjZV9idHNfc2l6ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogeworCXN0cnVjdCBidHNfY29udGV4dCAqY29udGV4dDsKIAljb25zdCBzdHJ1Y3QgYnRzX3RyYWNlICp0cmFjZTsKIAotCXRyYWNlID0gZHNfcmVhZF9idHMoY2hpbGQtPmJ0cyk7CisJY29udGV4dCA9IGNoaWxkLT5idHM7CisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gLUVTUkNIOworCisJdHJhY2UgPSBkc19yZWFkX2J0cyhjb250ZXh0LT50cmFjZXIpOwogCWlmICghdHJhY2UpCi0JCXJldHVybiAtRVBFUk07CisJCXJldHVybiAtRVNSQ0g7CiAKIAlyZXR1cm4gKHRyYWNlLT5kcy50b3AgLSB0cmFjZS0+ZHMuYmVnaW4pIC8gdHJhY2UtPmRzLnNpemU7CiB9CiAKLXN0YXRpYyB2b2lkIHB0cmFjZV9idHNfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQl0c2stPmJ0cyA9IE5VTEw7Ci0JdHNrLT5idHNfYnVmZmVyID0gTlVMTDsKLQl0c2stPmJ0c19zaXplID0gMDsKLQl0c2stPnRocmVhZC5idHNfb3ZmbF9zaWduYWwgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBwdHJhY2VfYnRzX3VudHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKKy8qCisgKiBDYWxsZWQgZnJvbSBfX3B0cmFjZV91bmxpbmsoKSBhZnRlciB0aGUgY2hpbGQgaGFzIGJlZW4gbW92ZWQgYmFjaworICogdG8gaXRzIG9yaWdpbmFsIHBhcmVudC4KKyAqLwordm9pZCBwdHJhY2VfYnRzX3VudHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKIAlpZiAodW5saWtlbHkoY2hpbGQtPmJ0cykpIHsKLQkJZHNfcmVsZWFzZV9idHMoY2hpbGQtPmJ0cyk7CisJCWZyZWVfYnRzX2NvbnRleHQoY2hpbGQtPmJ0cyk7CiAJCWNoaWxkLT5idHMgPSBOVUxMOwotCi0JCS8qIFdlIGNhbm5vdCB1cGRhdGUgdG90YWxfdm0gYW5kIGxvY2tlZF92bSBzaW5jZQotCQkgICBjaGlsZCdzIG1tIGlzIGFscmVhZHkgZ29uZS4gQnV0IHdlIGNhbiByZWNsYWltIHRoZQotCQkgICBtZW1vcnkuICovCi0JCWtmcmVlKGNoaWxkLT5idHNfYnVmZmVyKTsKLQkJY2hpbGQtPmJ0c19idWZmZXIgPSBOVUxMOwotCQljaGlsZC0+YnRzX3NpemUgPSAwOwogCX0KIH0KLQotc3RhdGljIHZvaWQgcHRyYWNlX2J0c19kZXRhY2goc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQkvKgotCSAqIFB0cmFjZV9kZXRhY2goKSByYWNlcyB3aXRoIHB0cmFjZV91bnRyYWNlKCkgaW4gY2FzZQotCSAqIHRoZSBjaGlsZCBkaWVzIGFuZCBpcyByZWFwZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0JICoKLQkgKiBXZSBvbmx5IGRvIHRoZSBtZW1vcnkgYWNjb3VudGluZyBhdCB0aGlzIHBvaW50IGFuZAotCSAqIGxlYXZlIHRoZSBidWZmZXIgZGVhbGxvY2F0aW9uIGFuZCB0aGUgYnRzIHRyYWNlcgotCSAqIHJlbGVhc2UgdG8gcHRyYWNlX2J0c191bnRyYWNlKCkgd2hpY2ggd2lsbCBiZSBjYWxsZWQKLQkgKiBsYXRlciBvbiB3aXRoIHRhc2tsaXN0X2xvY2sgaGVsZC4KLQkgKi8KLQlyZWxlYXNlX2xvY2tlZF9idWZmZXIoY2hpbGQtPmJ0c19idWZmZXIsIGNoaWxkLT5idHNfc2l6ZSk7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHB0cmFjZV9idHNfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdHJhY2VfYnRzX2RldGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHB0cmFjZV9idHNfdW50cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKSB7fQogI2VuZGlmIC8qIENPTkZJR19YODZfUFRSQUNFX0JUUyAqLwogCi12b2lkIHg4Nl9wdHJhY2VfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzKQotewotCXB0cmFjZV9idHNfZm9yayhjaGlsZCk7Ci19Ci0KLXZvaWQgeDg2X3B0cmFjZV91bnRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCi17Ci0JcHRyYWNlX2J0c191bnRyYWNlKGNoaWxkKTsKLX0KLQogLyoKICAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgogICoKQEAgLTg0NCw3ICs5MjUsNiBAQAogI2lmZGVmIFRJRl9TWVNDQUxMX0VNVQogCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfRU1VKTsKICNlbmRpZgotCXB0cmFjZV9idHNfZGV0YWNoKGNoaWxkKTsKIH0KIAogI2lmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCmluZGV4IDc1NjNiMzEuLmFmNzFkMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKQEAgLTQ5MSw1ICs0OTEsNDIgQEAKIAkJYnJlYWs7CiAJfQogfQorI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ09ORklHX05VTUEpCisvKiBTZXQgY29ycmVjdCBudW1hX25vZGUgaW5mb3JtYXRpb24gZm9yIEFNRCBOQiBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBxdWlya19hbWRfbmJfbm9kZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpuYl9odDsKKwl1bnNpZ25lZCBpbnQgZGV2Zm47CisJdTMyIHZhbDsKKworCWRldmZuID0gUENJX0RFVkZOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCAwKTsKKwluYl9odCA9IHBjaV9nZXRfc2xvdChkZXYtPmJ1cywgZGV2Zm4pOworCWlmICghbmJfaHQpCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChuYl9odCwgMHg2MCwgJnZhbCk7CisJc2V0X2Rldl9ub2RlKCZkZXYtPmRldiwgdmFsICYgNyk7CisJcGNpX2Rldl9wdXQoZGV2KTsKK30KKworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CLAorCQkJcXVpcmtfYW1kX25iX25vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX0FERFJNQVAsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfSzhfTkJfTUVNQ1RMLAorCQkJcXVpcmtfYW1kX25iX25vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX01JU0MsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX0hULAorCQkJcXVpcmtfYW1kX25iX25vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzEwSF9OQl9NQVAsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX0RSQU0sCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX01JU0MsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX0xJTkssCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwppbmRleCA2NjcxODhlLi5kMmQxY2U4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCkBAIC0xOTIsNiArMTkyLDE1IEBACiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICIwS1A1NjEiKSwKIAkJfSwKIAl9LAorCXsgICAvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gRGVsbCBPcHRpcGxleCAzNjAgd2l0aCAwVDY1NkYgKi8KKwkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LAorCQkuaWRlbnQgPSAiRGVsbCBPcHRpUGxleCAzNjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJPcHRpUGxleCAzNjAiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIjBUNjU2RiIpLAorCQl9LAorCX0sCiAJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gRGVsbCAyNDAwJ3MgKi8KIAkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LAogCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMjQwMCIsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCmluZGV4IGI0MTU4NDMuLmQxYzYzNmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCkBAIC0xMTIsNiArMTEyLDE0IEBACiAjZGVmaW5lIEFSQ0hfU0VUVVAKICNlbmRpZgogCisvKgorICogZW5kX3BmbiBvbmx5IGluY2x1ZGVzIFJBTSwgd2hpbGUgbWF4X3Bmbl9tYXBwZWQgaW5jbHVkZXMgYWxsIGU4MjAgZW50cmllcy4KKyAqIFRoZSBkaXJlY3QgbWFwcGluZyBleHRlbmRzIHRvIG1heF9wZm5fbWFwcGVkLCBzbyB0aGF0IHdlIGNhbiBkaXJlY3RseSBhY2Nlc3MKKyAqIGFwZXJ0dXJlcywgQUNQSSBhbmQgb3RoZXIgdGFibGVzIHdpdGhvdXQgaGF2aW5nIHRvIHBsYXkgd2l0aCBmaXhtYXBzLgorICovCit1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuX21hcHBlZDsKK3Vuc2lnbmVkIGxvbmcgbWF4X3Bmbl9tYXBwZWQ7CisKIFJFU0VSVkVfQlJLKGRtaV9hbGxvYywgNjU1MzYpOwogCiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfaWQgX19yZWFkX21vc3RseTsKQEAgLTIxNCw4ICsyMjIsOCBAQAogdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzID0gWDg2X0NSNF9QQUU7CiAjZW5kaWYKIAotLyogQm9vdCBsb2FkZXIgSUQgYXMgYW4gaW50ZWdlciwgZm9yIHRoZSBiZW5lZml0IG9mIHByb2NfZG9pbnR2ZWMgKi8KLWludCBib290bG9hZGVyX3R5cGU7CisvKiBCb290IGxvYWRlciBJRCBhbmQgdmVyc2lvbiBhcyBpbnRlZ2VycywgZm9yIHRoZSBiZW5lZml0IG9mIHByb2NfZG9pbnR2ZWMgKi8KK2ludCBib290bG9hZGVyX3R5cGUsIGJvb3Rsb2FkZXJfdmVyc2lvbjsKIAogLyoKICAqIFNldHVwIG9wdGlvbnMKQEAgLTcwNiw2ICs3MTQsMTIgQEAKICNlbmRpZgogCXNhdmVkX3ZpZGVvX21vZGUgPSBib290X3BhcmFtcy5oZHIudmlkX21vZGU7CiAJYm9vdGxvYWRlcl90eXBlID0gYm9vdF9wYXJhbXMuaGRyLnR5cGVfb2ZfbG9hZGVyOworCWlmICgoYm9vdGxvYWRlcl90eXBlID4+IDQpID09IDB4ZSkgeworCQlib290bG9hZGVyX3R5cGUgJj0gMHhmOworCQlib290bG9hZGVyX3R5cGUgfD0gKGJvb3RfcGFyYW1zLmhkci5leHRfbG9hZGVyX3R5cGUrMHgxMCkgPDwgNDsKKwl9CisJYm9vdGxvYWRlcl92ZXJzaW9uICA9IGJvb3Rsb2FkZXJfdHlwZSAmIDB4ZjsKKwlib290bG9hZGVyX3ZlcnNpb24gfD0gYm9vdF9wYXJhbXMuaGRyLmV4dF9sb2FkZXJfdmVyIDw8IDQ7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KIAlyZF9pbWFnZV9zdGFydCA9IGJvb3RfcGFyYW1zLmhkci5yYW1fc2l6ZSAmIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSzsKQEAgLTg1NCwxMiArODY4LDE2IEBACiAJCW1heF9sb3dfcGZuID0gbWF4X3BmbjsKIAogCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKilfX3ZhKG1heF9wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7CisJbWF4X3Bmbl9tYXBwZWQgPSBLRVJORUxfSU1BR0VfU0laRSA+PiBQQUdFX1NISUZUOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2X0NIRUNLX0JJT1NfQ09SUlVQVElPTgogCXNldHVwX2Jpb3NfY29ycnVwdGlvbl9jaGVjaygpOwogI2VuZGlmCiAKKwlwcmludGsoS0VSTl9ERUJVRyAiaW5pdGlhbCBtZW1vcnkgbWFwcGVkIDogMCAtICUwOGx4XG4iLAorCQkJbWF4X3Bmbl9tYXBwZWQ8PFBBR0VfU0hJRlQpOworCiAJcmVzZXJ2ZV9icmsoKTsKIAogCS8qIG1heF9wZm5fbWFwcGVkIGlzIHVwZGF0ZWQgaGVyZSAqLwpAQCAtOTk3LDI0ICsxMDE1LDYgQEAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAKIC8qKgotICogeDg2X3F1aXJrX3ByZV9pbnRyX2luaXQgLSBpbml0aWFsaXNhdGlvbiBwcmlvciB0byBzZXR0aW5nIHVwIGludGVycnVwdCB2ZWN0b3JzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKglQZXJmb3JtIGFueSBuZWNlc3NhcnkgaW50ZXJydXB0IGluaXRpYWxpc2F0aW9uIHByaW9yIHRvIHNldHRpbmcgdXAKLSAqCXRoZSAib3JkaW5hcnkiIGludGVycnVwdCBjYWxsIGdhdGVzLiAgRm9yIGxlZ2FjeSByZWFzb25zLCB0aGUgSVNBCi0gKglpbnRlcnJ1cHRzIHNob3VsZCBiZSBpbml0aWFsaXNlZCBoZXJlIGlmIHRoZSBtYWNoaW5lIGVtdWxhdGVzIGEgUEMKLSAqCWluIGFueSB3YXkuCi0gKiovCi12b2lkIF9faW5pdCB4ODZfcXVpcmtfcHJlX2ludHJfaW5pdCh2b2lkKQotewotCWlmICh4ODZfcXVpcmtzLT5hcmNoX3ByZV9pbnRyX2luaXQpIHsKLQkJaWYgKHg4Nl9xdWlya3MtPmFyY2hfcHJlX2ludHJfaW5pdCgpKQotCQkJcmV0dXJuOwotCX0KLQlpbml0X0lTQV9pcnFzKCk7Ci19Ci0KLS8qKgogICogeDg2X3F1aXJrX2ludHJfaW5pdCAtIHBvc3QgZ2F0ZSBzZXR1cCBpbnRlcnJ1cHQgaW5pdGlhbGlzYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYwppbmRleCA4ZjBlMTNiLi45YzNmMDgyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jCkBAIC00MjUsNiArNDI1LDE0IEBACiAJZWFybHlfcGVyX2NwdV9wdHIoeDg2X2NwdV90b19ub2RlX21hcCkgPSBOVUxMOwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpICYmIGRlZmluZWQoQ09ORklHX05VTUEpCisJLyoKKwkgKiBtYWtlIHN1cmUgYm9vdCBjcHUgbm9kZV9udW1iZXIgaXMgcmlnaHQsIHdoZW4gYm9vdCBjcHUgaXMgb24gdGhlCisJICogbm9kZSB0aGF0IGRvZXNuJ3QgaGF2ZSBtZW0gaW5zdGFsbGVkCisJICovCisJcGVyX2NwdShub2RlX251bWJlciwgYm9vdF9jcHVfaWQpID0gY3B1X3RvX25vZGUoYm9vdF9jcHVfaWQpOworI2VuZGlmCisKIAkvKiBTZXR1cCBub2RlIHRvIGNwdW1hc2sgbWFwICovCiAJc2V0dXBfbm9kZV90b19jcHVtYXNrX21hcCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMTQ0MjUxNi4uMGE4MTNiMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWwuYwpAQCAtNiw3ICs2LDYgQEAKICAqICAyMDAwLTA2LTIwICBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydCBieSBHYXJldGggSHVnaGVzCiAgKiAgMjAwMC0yMDAyICAgeDg2LTY0IHN1cHBvcnQgYnkgQW5kaSBLbGVlbgogICovCi0KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wLmMKaW5kZXggMTNmMzNlYS4uMjhmNWZiNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXAuYwpAQCAtMTcyLDYgKzE3Miw5IEBACiB7CiAJYWNrX0FQSUNfaXJxKCk7CiAJaW5jX2lycV9zdGF0KGlycV9yZXNjaGVkX2NvdW50KTsKKwkvKgorCSAqIEtWTSB1c2VzIHRoaXMgaW50ZXJydXB0IHRvIGZvcmNlIGEgY3B1IG91dCBvZiBndWVzdCBtb2RlCisJICovCiB9CiAKIHZvaWQgc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMTkzLDE5ICsxOTYsMTkgQEAKIH0KIAogc3RydWN0IHNtcF9vcHMgc21wX29wcyA9IHsKLQkuc21wX3ByZXBhcmVfYm9vdF9jcHUgPSBuYXRpdmVfc21wX3ByZXBhcmVfYm9vdF9jcHUsCi0JLnNtcF9wcmVwYXJlX2NwdXMgPSBuYXRpdmVfc21wX3ByZXBhcmVfY3B1cywKLQkuc21wX2NwdXNfZG9uZSA9IG5hdGl2ZV9zbXBfY3B1c19kb25lLAorCS5zbXBfcHJlcGFyZV9ib290X2NwdQk9IG5hdGl2ZV9zbXBfcHJlcGFyZV9ib290X2NwdSwKKwkuc21wX3ByZXBhcmVfY3B1cwk9IG5hdGl2ZV9zbXBfcHJlcGFyZV9jcHVzLAorCS5zbXBfY3B1c19kb25lCQk9IG5hdGl2ZV9zbXBfY3B1c19kb25lLAogCi0JLnNtcF9zZW5kX3N0b3AgPSBuYXRpdmVfc21wX3NlbmRfc3RvcCwKLQkuc21wX3NlbmRfcmVzY2hlZHVsZSA9IG5hdGl2ZV9zbXBfc2VuZF9yZXNjaGVkdWxlLAorCS5zbXBfc2VuZF9zdG9wCQk9IG5hdGl2ZV9zbXBfc2VuZF9zdG9wLAorCS5zbXBfc2VuZF9yZXNjaGVkdWxlCT0gbmF0aXZlX3NtcF9zZW5kX3Jlc2NoZWR1bGUsCiAKLQkuY3B1X3VwID0gbmF0aXZlX2NwdV91cCwKLQkuY3B1X2RpZSA9IG5hdGl2ZV9jcHVfZGllLAotCS5jcHVfZGlzYWJsZSA9IG5hdGl2ZV9jcHVfZGlzYWJsZSwKLQkucGxheV9kZWFkID0gbmF0aXZlX3BsYXlfZGVhZCwKKwkuY3B1X3VwCQkJPSBuYXRpdmVfY3B1X3VwLAorCS5jcHVfZGllCQk9IG5hdGl2ZV9jcHVfZGllLAorCS5jcHVfZGlzYWJsZQkJPSBuYXRpdmVfY3B1X2Rpc2FibGUsCisJLnBsYXlfZGVhZAkJPSBuYXRpdmVfcGxheV9kZWFkLAogCi0JLnNlbmRfY2FsbF9mdW5jX2lwaSA9IG5hdGl2ZV9zZW5kX2NhbGxfZnVuY19pcGksCisJLnNlbmRfY2FsbF9mdW5jX2lwaQk9IG5hdGl2ZV9zZW5kX2NhbGxfZnVuY19pcGksCiAJLnNlbmRfY2FsbF9mdW5jX3NpbmdsZV9pcGkgPSBuYXRpdmVfc2VuZF9jYWxsX2Z1bmNfc2luZ2xlX2lwaSwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChzbXBfb3BzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDU4ZDI0ZWYuLjdjODAwMDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAgKiBJTklULCBJTklULCBTVEFSVFVQIHNlcXVlbmNlIHdpbGwgcmVzZXQgdGhlIGNoaXAgaGFyZCBmb3IgdXMsIGFuZCB0aGlzCiAgKiB3b24ndCAuLi4gcmVtZW1iZXIgdG8gY2xlYXIgZG93biB0aGUgQVBJQywgZXRjIGxhdGVyLgogICovCi1pbnQgX19kZXZpbml0CitpbnQgX19jcHVpbml0CiB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfbm1pKGludCBsb2dpY2FsX2FwaWNpZCwgdW5zaWduZWQgbG9uZyBzdGFydF9laXApCiB7CiAJdW5zaWduZWQgbG9uZyBzZW5kX3N0YXR1cywgYWNjZXB0X3N0YXR1cyA9IDA7CkBAIC01MzgsNyArNTM4LDcgQEAKIAlyZXR1cm4gKHNlbmRfc3RhdHVzIHwgYWNjZXB0X3N0YXR1cyk7CiB9CiAKLWludCBfX2RldmluaXQKK3N0YXRpYyBpbnQgX19jcHVpbml0CiB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfaW5pdChpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwKQogewogCXVuc2lnbmVkIGxvbmcgc2VuZF9zdGF0dXMsIGFjY2VwdF9zdGF0dXMgPSAwOwpAQCAtODIyLDEwICs4MjIsMTIgQEAKIAkvKiBtYXJrICJzdHVjayIgYXJlYSBhcyBub3Qgc3R1Y2sgKi8KIAkqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopdHJhbXBvbGluZV9iYXNlKSA9IDA7CiAKLQkvKgotCSAqIENsZWFudXAgcG9zc2libGUgZGFuZ2xpbmcgZW5kcy4uLgotCSAqLwotCXNtcGJvb3RfcmVzdG9yZV93YXJtX3Jlc2V0X3ZlY3RvcigpOworCWlmIChnZXRfdXZfc3lzdGVtX3R5cGUoKSAhPSBVVl9OT05fVU5JUVVFX0FQSUMpIHsKKwkJLyoKKwkJICogQ2xlYW51cCBwb3NzaWJsZSBkYW5nbGluZyBlbmRzLi4uCisJCSAqLworCQlzbXBib290X3Jlc3RvcmVfd2FybV9yZXNldF92ZWN0b3IoKTsKKwl9CiAKIAlyZXR1cm4gYm9vdF9lcnJvcjsKIH0KQEAgLTk5MCwxMCArOTkyLDEyIEBACiAJICovCiAJaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkgJiYKIAkgICAgIWNwdV9oYXNfYXBpYykgewotCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBsb2NhbCBBUElDICMlZCBub3QgZGV0ZWN0ZWQhLi4uXG4iLAotCQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIuLi4gZm9yY2luZyB1c2Ugb2YgZHVtbXkgQVBJQyBlbXVsYXRpb24uIgorCQlpZiAoIWRpc2FibGVfYXBpYykgeworCQkJcHJfZXJyKCJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAjJWQgbm90IGRldGVjdGVkIS4uLlxuIiwKKwkJCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQkJcHJfZXJyKCIuLi4gZm9yY2luZyB1c2Ugb2YgZHVtbXkgQVBJQyBlbXVsYXRpb24uIgogCQkJCSIodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIpOworCQl9CiAJCXNtcGJvb3RfY2xlYXJfaW9fYXBpYygpOwogCQlhcmNoX2Rpc2FibGVfc21wX3N1cHBvcnQoKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggZjdiZGRjMi4uNGFhZjdlNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC0yMCw3ICsyMCw3IEBACiAKIHN0YXRpYyBpbnQgc2F2ZV9zdGFja19zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQogewotCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2F2ZV9zdGFja19hZGRyZXNzKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMKaW5kZXggZmY1Yzg3My4uZDUxMzIxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TCkBAIC0zMzQsMyArMzM0LDUgQEAKIAkubG9uZyBzeXNfaW5vdGlmeV9pbml0MQogCS5sb25nIHN5c19wcmVhZHYKIAkubG9uZyBzeXNfcHdyaXRldgorCS5sb25nIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbwkvKiAzMzUgKi8KKwkubG9uZyBzeXNfcGVyZl9jb3VudGVyX29wZW4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90bGJfdXYuYyBiL2FyY2gveDg2L2tlcm5lbC90bGJfdXYuYwppbmRleCA4YzdiMDNiLi4xMjRkNDBjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGxiX3V2LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RsYl91di5jCkBAIC03MTUsNyArNzE1LDEyIEBACiAJc3RydWN0IGJhdV9kZXNjICphZHA7CiAJc3RydWN0IGJhdV9kZXNjICphZDI7CiAKLQlhZHAgPSAoc3RydWN0IGJhdV9kZXNjICopa21hbGxvY19ub2RlKDE2Mzg0LCBHRlBfS0VSTkVMLCBub2RlKTsKKwkvKgorCSAqIGVhY2ggYmF1X2Rlc2MgaXMgNjQgYnl0ZXM7IHRoZXJlIGFyZSA4IChVVl9JVEVNU19QRVJfREVTQ1JJUFRPUikKKwkgKiBwZXIgY3B1OyBhbmQgdXAgdG8gMzIgKFVWX0FEUF9TSVpFKSBjcHUncyBwZXIgYmxhZGUKKwkgKi8KKwlhZHAgPSAoc3RydWN0IGJhdV9kZXNjICopa21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgYmF1X2Rlc2MpKgorCQlVVl9BRFBfU0laRSpVVl9JVEVNU19QRVJfREVTQ1JJUFRPUiwgR0ZQX0tFUk5FTCwgbm9kZSk7CiAJQlVHX09OKCFhZHApOwogCiAJcGEgPSB1dl9ncGEoYWRwKTsgLyogbmVlZCB0aGUgcmVhbCBuYXNpZCovCkBAIC03MjksNyArNzM0LDEzIEBACiAJCQkJICAgICAgKG4gPDwgVVZfREVTQ19CQVNFX1BOT0RFX1NISUZUIHwgbSkpOwogCX0KIAotCWZvciAoaSA9IDAsIGFkMiA9IGFkcDsgaSA8IFVWX0FDVElWQVRJT05fREVTQ1JJUFRPUl9TSVpFOyBpKyssIGFkMisrKSB7CisJLyoKKwkgKiBpbml0aWFsaXppbmcgYWxsIDggKFVWX0lURU1TX1BFUl9ERVNDUklQVE9SKSBkZXNjcmlwdG9ycyBmb3IgZWFjaAorCSAqIGNwdSBldmVuIHRob3VnaCB3ZSBvbmx5IHVzZSB0aGUgZmlyc3Qgb25lOyBvbmUgZGVzY3JpcHRvciBjYW4KKwkgKiBkZXNjcmliZSBhIGJyb2FkY2FzdCB0byAyNTYgbm9kZXMuCisJICovCisJZm9yIChpID0gMCwgYWQyID0gYWRwOyBpIDwgKFVWX0FEUF9TSVpFKlVWX0lURU1TX1BFUl9ERVNDUklQVE9SKTsKKwkJaSsrLCBhZDIrKykgewogCQltZW1zZXQoYWQyLCAwLCBzaXplb2Yoc3RydWN0IGJhdV9kZXNjKSk7CiAJCWFkMi0+aGVhZGVyLnN3X2Fja19mbGFnID0gMTsKIAkJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggYTFkMjg4My4uMDdkNjBjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKQEAgLTgzOSw5ICs4MzksNiBAQAogCX0KIAogCWNsdHMoKTsJCQkJLyogQWxsb3cgbWF0aHMgb3BzIChvciB3ZSByZWN1cnNlKSAqLwotI2lmZGVmIENPTkZJR19YODZfMzIKLQlyZXN0b3JlX2ZwdSh0c2spOwotI2Vsc2UKIAkvKgogCSAqIFBhcmFub2lkIHJlc3RvcmUuIHNlbmQgYSBTSUdTRUdWIGlmIHdlIGZhaWwgdG8gcmVzdG9yZSB0aGUgc3RhdGUuCiAJICovCkBAIC04NTAsNyArODQ3LDcgQEAKIAkJZm9yY2Vfc2lnKFNJR1NFR1YsIHRzayk7CiAJCXJldHVybjsKIAl9Ci0jZW5kaWYKKwogCXRocmVhZC0+c3RhdHVzIHw9IFRTX1VTRURGUFU7CS8qIFNvIHdlIGZuc2F2ZSBvbiBzd2l0Y2hfdG8oKSAqLwogCXRzay0+ZnB1X2NvdW50ZXIrKzsKIH0KQEAgLTk0NSw4ICs5NDIsMTMgQEAKICNlbmRpZgogCXNldF9pbnRyX2dhdGUoMTksICZzaW1kX2NvcHJvY2Vzc29yX2Vycm9yKTsKIAorCS8qIFJlc2VydmUgYWxsIHRoZSBidWlsdGluIGFuZCB0aGUgc3lzY2FsbCB2ZWN0b3I6ICovCisJZm9yIChpID0gMDsgaSA8IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUjsgaSsrKQorCQlzZXRfYml0KGksIHVzZWRfdmVjdG9ycyk7CisKICNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KIAlzZXRfc3lzdGVtX2ludHJfZ2F0ZShJQTMyX1NZU0NBTExfVkVDVE9SLCBpYTMyX3N5c2NhbGwpOworCXNldF9iaXQoSUEzMl9TWVNDQUxMX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgpAQCAtOTYzLDE3ICs5NjUsOSBAQAogCX0KIAogCXNldF9zeXN0ZW1fdHJhcF9nYXRlKFNZU0NBTExfVkVDVE9SLCAmc3lzdGVtX2NhbGwpOwotI2VuZGlmCi0KLQkvKiBSZXNlcnZlIGFsbCB0aGUgYnVpbHRpbiBhbmQgdGhlIHN5c2NhbGwgdmVjdG9yOiAqLwotCWZvciAoaSA9IDA7IGkgPCBGSVJTVF9FWFRFUk5BTF9WRUNUT1I7IGkrKykKLQkJc2V0X2JpdChpLCB1c2VkX3ZlY3RvcnMpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCXNldF9iaXQoSUEzMl9TWVNDQUxMX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKLSNlbHNlCiAJc2V0X2JpdChTWVNDQUxMX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKICNlbmRpZgorCiAJLyoKIAkgKiBTaG91bGQgYmUgYSBiYXJyaWVyIGZvciBhbnkgZXh0ZXJuYWwgQ1BVIHN0YXRlOgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RzYy5jIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCmluZGV4IGQ1N2RlMDUuLjNlMWMwNTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90c2MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKQEAgLTM4NCwxMyArMzg0LDEzIEBACiB7CiAJdTY0IHRzYzEsIHRzYzIsIGRlbHRhLCByZWYxLCByZWYyOwogCXVuc2lnbmVkIGxvbmcgdHNjX3BpdF9taW4gPSBVTE9OR19NQVgsIHRzY19yZWZfbWluID0gVUxPTkdfTUFYOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGxhdGNoLCBtcywgZmFzdF9jYWxpYnJhdGUsIHRzY19raHo7CisJdW5zaWduZWQgbG9uZyBmbGFncywgbGF0Y2gsIG1zLCBmYXN0X2NhbGlicmF0ZSwgaHZfdHNjX2toejsKIAlpbnQgaHBldCA9IGlzX2hwZXRfZW5hYmxlZCgpLCBpLCBsb29wbWluOwogCi0JdHNjX2toeiA9IGdldF9oeXBlcnZpc29yX3RzY19mcmVxKCk7Ci0JaWYgKHRzY19raHopIHsKKwlodl90c2Nfa2h6ID0gZ2V0X2h5cGVydmlzb3JfdHNjX2ZyZXEoKTsKKwlpZiAoaHZfdHNjX2toeikgewogCQlwcmludGsoS0VSTl9JTkZPICJUU0M6IEZyZXF1ZW5jeSByZWFkIGZyb20gdGhlIGh5cGVydmlzb3JcbiIpOwotCQlyZXR1cm4gdHNjX2toejsKKwkJcmV0dXJuIGh2X3RzY19raHo7CiAJfQogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtNzEwLDcgKzcxMCwxNiBAQAogI2lmZGVmIENPTkZJR19YODZfNjQKIHN0YXRpYyBjeWNsZV90IF9fdnN5c2NhbGxfZm4gdnJlYWRfdHNjKHZvaWQpCiB7Ci0JY3ljbGVfdCByZXQgPSAoY3ljbGVfdCl2Z2V0X2N5Y2xlcygpOworCWN5Y2xlX3QgcmV0OworCisJLyoKKwkgKiBTdXJyb3VuZCB0aGUgUkRUU0MgYnkgYmFycmllcnMsIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdAorCSAqIHNwZWN1bGF0ZWQgdG8gb3V0c2lkZSB0aGUgc2VxbG9jayBjcml0aWNhbCBzZWN0aW9uIGFuZAorCSAqIGRvZXMgbm90IGNhdXNlIHRpbWUgd2FycHM6CisJICovCisJcmR0c2NfYmFycmllcigpOworCXJldCA9IChjeWNsZV90KXZnZXRfY3ljbGVzKCk7CisJcmR0c2NfYmFycmllcigpOwogCiAJcmV0dXJuIHJldCA+PSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5jeWNsZV9sYXN0ID8KIAkJcmV0IDogX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2suY3ljbGVfbGFzdDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2Nfc3luYy5jIGIvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKaW5kZXggYmYzNjMyOC4uMDI3YjViNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKQEAgLTM0LDYgKzM0LDcgQEAKICAqIG9mIGEgY3JpdGljYWwgc2VjdGlvbiwgdG8gYmUgYWJsZSB0byBwcm92ZSBUU0MgdGltZS13YXJwczoKICAqLwogc3RhdGljIF9fY3B1aW5pdGRhdGEgcmF3X3NwaW5sb2NrX3Qgc3luY19sb2NrID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEOworCiBzdGF0aWMgX19jcHVpbml0ZGF0YSBjeWNsZXNfdCBsYXN0X3RzYzsKIHN0YXRpYyBfX2NwdWluaXRkYXRhIGN5Y2xlc190IG1heF93YXJwOwogc3RhdGljIF9fY3B1aW5pdGRhdGEgaW50IG5yX3dhcnBzOwpAQCAtMTEzLDEzICsxMTQsMTIgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9UU0NfUkVMSUFCTEUpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJTa2lwcGluZyBzeW5jaHJvbml6YXRpb24gY2hlY2tzIGFzIFRTQyBpcyByZWxpYWJsZS5cbiIpOworCQlwcl9pbmZvKCJTa2lwcGluZyBzeW5jaHJvbml6YXRpb24gY2hlY2tzIGFzIFRTQyBpcyByZWxpYWJsZS5cbiIpOwogCQlyZXR1cm47CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiY2hlY2tpbmcgVFNDIHN5bmNocm9uaXphdGlvbiBbQ1BVIyVkIC0+IENQVSMlZF06IiwKLQkJCSAgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHUpOworCXByX2luZm8oImNoZWNraW5nIFRTQyBzeW5jaHJvbml6YXRpb24gW0NQVSMlZCAtPiBDUFUjJWRdOiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1KTsKIAogCS8qCiAJICogUmVzZXQgaXQgLSBpbiBjYXNlIHRoaXMgaXMgYSBzZWNvbmQgYm9vdHVwOgpAQCAtMTQzLDggKzE0Myw4IEBACiAKIAlpZiAobnJfd2FycHMpIHsKIAkJcHJpbnRrKCJcbiIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJNZWFzdXJlZCAlTGQgY3ljbGVzIFRTQyB3YXJwIGJldHdlZW4gQ1BVcywiCi0JCQkJICAgICIgdHVybmluZyBvZmYgVFNDIGNsb2NrLlxuIiwgbWF4X3dhcnApOworCQlwcl93YXJuaW5nKCJNZWFzdXJlZCAlTGQgY3ljbGVzIFRTQyB3YXJwIGJldHdlZW4gQ1BVcywgIgorCQkJICAgInR1cm5pbmcgb2ZmIFRTQyBjbG9jay5cbiIsIG1heF93YXJwKTsKIAkJbWFya190c2NfdW5zdGFibGUoImNoZWNrX3RzY19zeW5jX3NvdXJjZSBmYWlsZWQiKTsKIAl9IGVsc2UgewogCQlwcmludGsoIiBwYXNzZWQuXG4iKTsKQEAgLTE5NSw1ICsxOTUsMyBAQAogCXdoaWxlIChhdG9taWNfcmVhZCgmc3RvcF9jb3VudCkgIT0gY3B1cykKIAkJY3B1X3JlbGF4KCk7CiB9Ci0jdW5kZWYgTlJfTE9PUFMKLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtODZfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC92bTg2XzMyLmMKaW5kZXggZDdhYzg0ZS4uOWM0ZTYyNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZtODZfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm04Nl8zMi5jCkBAIC0yODcsMTAgKzI4Nyw5IEBACiAJaW5mby0+cmVncy5wdC5kcyA9IDA7CiAJaW5mby0+cmVncy5wdC5lcyA9IDA7CiAJaW5mby0+cmVncy5wdC5mcyA9IDA7Ci0KLS8qIHdlIGFyZSBjbGVhcmluZyBncyBsYXRlciBqdXN0IGJlZm9yZSAiam1wIHJlc3VtZV91c2Vyc3BhY2UiLAotICogYmVjYXVzZSBpdCBpcyBub3Qgc2F2ZWQvcmVzdG9yZWQuCi0gKi8KKyNpZm5kZWYgQ09ORklHX1g4Nl8zMl9MQVpZX0dTCisJaW5mby0+cmVncy5wdC5ncyA9IDA7CisjZW5kaWYKIAogLyoKICAqIFRoZSBmbGFncyByZWdpc3RlciBpcyBhbHNvIHNwZWNpYWw6IHdlIGNhbm5vdCB0cnVzdCB0aGF0IHRoZSB1c2VyCkBAIC0zMTgsOSArMzE3LDkgQEAKIAl9CiAKIC8qCi0gKiBTYXZlIG9sZCBzdGF0ZSwgc2V0IGRlZmF1bHQgcmV0dXJuIHZhbHVlICglYXgpIHRvIDAKKyAqIFNhdmUgb2xkIHN0YXRlLCBzZXQgZGVmYXVsdCByZXR1cm4gdmFsdWUgKCVheCkgdG8gMCAoVk04Nl9TSUdOQUwpCiAgKi8KLQlpbmZvLT5yZWdzMzItPmF4ID0gMDsKKwlpbmZvLT5yZWdzMzItPmF4ID0gVk04Nl9TSUdOQUw7CiAJdHNrLT50aHJlYWQuc2F2ZWRfc3AwID0gdHNrLT50aHJlYWQuc3AwOwogCXRzay0+dGhyZWFkLnNhdmVkX2ZzID0gaW5mby0+cmVnczMyLT5mczsKIAl0c2stPnRocmVhZC5zYXZlZF9ncyA9IGdldF91c2VyX2dzKGluZm8tPnJlZ3MzMik7CkBAIC0zNDMsNyArMzQyLDkgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIm1vdmwgJTAsJSVlc3Bcblx0IgogCQkibW92bCAlMSwlJWVicFxuXHQiCisjaWZkZWYgQ09ORklHX1g4Nl8zMl9MQVpZX0dTCiAJCSJtb3YgICUyLCAlJWdzXG5cdCIKKyNlbmRpZgogCQkiam1wIHJlc3VtZV91c2Vyc3BhY2UiCiAJCTogLyogbm8gb3V0cHV0cyAqLwogCQk6InIiICgmaW5mby0+cmVncyksICJyIiAodGFza190aHJlYWRfaW5mbyh0c2spKSwgInIiICgwKSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMKaW5kZXggOTVkZWI5ZjIuLmIyNjM0MjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92bWlfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMKQEAgLTQ2MiwyMiArNDYyLDI4IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgdm1pX2VudGVyX2xhenlfY3B1KHZvaWQpCitzdGF0aWMgdm9pZCB2bWlfc3RhcnRfY29udGV4dF9zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewotCXBhcmF2aXJ0X2VudGVyX2xhenlfY3B1KCk7CisJcGFyYXZpcnRfc3RhcnRfY29udGV4dF9zd2l0Y2gocHJldik7CiAJdm1pX29wcy5zZXRfbGF6eV9tb2RlKDIpOwogfQogCitzdGF0aWMgdm9pZCB2bWlfZW5kX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3sKKwl2bWlfb3BzLnNldF9sYXp5X21vZGUoMCk7CisJcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKG5leHQpOworfQorCiBzdGF0aWMgdm9pZCB2bWlfZW50ZXJfbGF6eV9tbXUodm9pZCkKIHsKIAlwYXJhdmlydF9lbnRlcl9sYXp5X21tdSgpOwogCXZtaV9vcHMuc2V0X2xhenlfbW9kZSgxKTsKIH0KIAotc3RhdGljIHZvaWQgdm1pX2xlYXZlX2xhenkodm9pZCkKK3N0YXRpYyB2b2lkIHZtaV9sZWF2ZV9sYXp5X21tdSh2b2lkKQogewotCXBhcmF2aXJ0X2xlYXZlX2xhenkocGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpKTsKIAl2bWlfb3BzLnNldF9sYXp5X21vZGUoMCk7CisJcGFyYXZpcnRfbGVhdmVfbGF6eV9tbXUoKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19pbml0IGNoZWNrX3ZtaV9yb20oc3RydWN0IHZyb21faGVhZGVyICpyb20pCkBAIC03MTEsMTQgKzcxNywxNCBAQAogCXBhcmFfZmlsbChwdl9jcHVfb3BzLnNldF9pb3BsX21hc2ssIFNldElPUExNYXNrKTsKIAlwYXJhX2ZpbGwocHZfY3B1X29wcy5pb19kZWxheSwgSU9EZWxheSk7CiAKLQlwYXJhX3dyYXAocHZfY3B1X29wcy5sYXp5X21vZGUuZW50ZXIsIHZtaV9lbnRlcl9sYXp5X2NwdSwKKwlwYXJhX3dyYXAocHZfY3B1X29wcy5zdGFydF9jb250ZXh0X3N3aXRjaCwgdm1pX3N0YXJ0X2NvbnRleHRfc3dpdGNoLAogCQkgIHNldF9sYXp5X21vZGUsIFNldExhenlNb2RlKTsKLQlwYXJhX3dyYXAocHZfY3B1X29wcy5sYXp5X21vZGUubGVhdmUsIHZtaV9sZWF2ZV9sYXp5LAorCXBhcmFfd3JhcChwdl9jcHVfb3BzLmVuZF9jb250ZXh0X3N3aXRjaCwgdm1pX2VuZF9jb250ZXh0X3N3aXRjaCwKIAkJICBzZXRfbGF6eV9tb2RlLCBTZXRMYXp5TW9kZSk7CiAKIAlwYXJhX3dyYXAocHZfbW11X29wcy5sYXp5X21vZGUuZW50ZXIsIHZtaV9lbnRlcl9sYXp5X21tdSwKIAkJICBzZXRfbGF6eV9tb2RlLCBTZXRMYXp5TW9kZSk7Ci0JcGFyYV93cmFwKHB2X21tdV9vcHMubGF6eV9tb2RlLmxlYXZlLCB2bWlfbGVhdmVfbGF6eSwKKwlwYXJhX3dyYXAocHZfbW11X29wcy5sYXp5X21vZGUubGVhdmUsIHZtaV9sZWF2ZV9sYXp5X21tdSwKIAkJICBzZXRfbGF6eV9tb2RlLCBTZXRMYXp5TW9kZSk7CiAKIAkvKiB1c2VyIGFuZCBrZXJuZWwgZmx1c2ggYXJlIGp1c3QgaGFuZGxlZCB3aXRoIGRpZmZlcmVudCBmbGFncyB0byBGbHVzaFRMQiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA4NDllZTYxLi40Yzg1YjJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMSw1ICsxLDQzMSBAQAorLyoKKyAqIGxkIHNjcmlwdCBmb3IgdGhlIHg4NiBrZXJuZWwKKyAqCisgKiBIaXN0b3JpYyAzMi1iaXQgdmVyc2lvbiB3cml0dGVuIGJ5IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PgorICoKKyAqIE1vZGVybmlzYXRpb24sIHVuaWZpY2F0aW9uIGFuZCBvdGhlciBjaGFuZ2VzIGFuZCBmaXhlczoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIFNhbSBSYXZuYm9yZyA8c2FtQHJhdm5ib3JnLm9yZz4KKyAqCisgKgorICogRG9uJ3QgZGVmaW5lIGFic29sdXRlIHN5bWJvbHMgdW50aWwgYW5kIHVubGVzcyB5b3Uga25vdyB0aGF0IHN5bWJvbAorICogdmFsdWUgaXMgc2hvdWxkIHJlbWFpbiBjb25zdGFudCBldmVuIGlmIGtlcm5lbCBpbWFnZSBpcyByZWxvY2F0ZWQKKyAqIGF0IHJ1biB0aW1lLiBBYnNvbHV0ZSBzeW1ib2xzIGFyZSBub3QgcmVsb2NhdGVkLiBJZiBzeW1ib2wgdmFsdWUgc2hvdWxkCisgKiBjaGFuZ2UgaWYga2VybmVsIGlzIHJlbG9jYXRlZCwgbWFrZSB0aGUgc3ltYm9sIHNlY3Rpb24gcmVsYXRpdmUgYW5kCisgKiBwdXQgaXQgaW5zaWRlIHRoZSBzZWN0aW9uIGRlZmluaXRpb24uCisgKi8KKwogI2lmZGVmIENPTkZJR19YODZfMzIKLSMgaW5jbHVkZSAidm1saW51eF8zMi5sZHMuUyIKKyNkZWZpbmUgTE9BRF9PRkZTRVQgX19QQUdFX09GRlNFVAogI2Vsc2UKLSMgaW5jbHVkZSAidm1saW51eF82NC5sZHMuUyIKKyNkZWZpbmUgTE9BRF9PRkZTRVQgX19TVEFSVF9LRVJORUxfbWFwCiAjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYm9vdC5oPgorCisjdW5kZWYgaTM4NiAgICAgLyogaW4gY2FzZSB0aGUgcHJlcHJvY2Vzc29yIGlzIGEgMzJiaXQgb25lICovCisKK09VVFBVVF9GT1JNQVQoQ09ORklHX09VVFBVVF9GT1JNQVQsIENPTkZJR19PVVRQVVRfRk9STUFULCBDT05GSUdfT1VUUFVUX0ZPUk1BVCkKKworI2lmZGVmIENPTkZJR19YODZfMzIKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShwaHlzX3N0YXJ0dXBfMzIpCitqaWZmaWVzID0gamlmZmllc182NDsKKyNlbHNlCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKHBoeXNfc3RhcnR1cF82NCkKK2ppZmZpZXNfNjQgPSBqaWZmaWVzOworI2VuZGlmCisKK1BIRFJTIHsKKwl0ZXh0IFBUX0xPQUQgRkxBR1MoNSk7ICAgICAgICAgIC8qIFJfRSAqLworCWRhdGEgUFRfTE9BRCBGTEFHUyg3KTsgICAgICAgICAgLyogUldFICovCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXVzZXIgUFRfTE9BRCBGTEFHUyg3KTsgICAgICAgICAgLyogUldFICovCisJZGF0YS5pbml0IFBUX0xPQUQgRkxBR1MoNyk7ICAgICAvKiBSV0UgKi8KKyNpZmRlZiBDT05GSUdfU01QCisJcGVyY3B1IFBUX0xPQUQgRkxBR1MoNyk7ICAgICAgICAvKiBSV0UgKi8KKyNlbmRpZgorCWRhdGEuaW5pdDIgUFRfTE9BRCBGTEFHUyg3KTsgICAgLyogUldFICovCisjZW5kaWYKKwlub3RlIFBUX05PVEUgRkxBR1MoMCk7ICAgICAgICAgIC8qIF9fXyAqLworfQorCitTRUNUSU9OUworeworI2lmZGVmIENPTkZJR19YODZfMzIKKyAgICAgICAgLiA9IExPQURfT0ZGU0VUICsgTE9BRF9QSFlTSUNBTF9BRERSOworICAgICAgICBwaHlzX3N0YXJ0dXBfMzIgPSBzdGFydHVwXzMyIC0gTE9BRF9PRkZTRVQ7CisjZWxzZQorICAgICAgICAuID0gX19TVEFSVF9LRVJORUw7CisgICAgICAgIHBoeXNfc3RhcnR1cF82NCA9IHN0YXJ0dXBfNjQgLSBMT0FEX09GRlNFVDsKKyNlbmRpZgorCisJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KKworCS8qIGJvb3RzdHJhcHBpbmcgY29kZSAqLworCS50ZXh0LmhlYWQgOiBBVChBRERSKC50ZXh0LmhlYWQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX3RleHQgPSAuOworCQkqKC50ZXh0LmhlYWQpCisJfSA6dGV4dCA9IDB4OTA5MAorCisJLyogVGhlIHJlc3Qgb2YgdGhlIHRleHQgKi8KKwkudGV4dCA6ICBBVChBRERSKC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCQkvKiBub3QgcmVhbGx5IG5lZWRlZCwgYWxyZWFkeSBwYWdlIGFsaWduZWQgKi8KKwkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJCSooLnRleHQucGFnZV9hbGlnbmVkKQorI2VuZGlmCisJCS4gPSBBTElHTig4KTsKKwkJX3N0ZXh0ID0gLjsKKwkJVEVYVF9URVhUCisJCVNDSEVEX1RFWFQKKwkJTE9DS19URVhUCisJCUtQUk9CRVNfVEVYVAorCQlJUlFFTlRSWV9URVhUCisJCSooLmZpeHVwKQorCQkqKC5nbnUud2FybmluZykKKwkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworCQlfZXRleHQgPSAuOworCX0gOnRleHQgPSAweDkwOTAKKworCU5PVEVTIDp0ZXh0IDpub3RlCisKKwkvKiBFeGNlcHRpb24gdGFibGUgKi8KKwkuID0gQUxJR04oMTYpOworCV9fZXhfdGFibGUgOiBBVChBRERSKF9fZXhfdGFibGUpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKwkJKihfX2V4X3RhYmxlKQorCQlfX3N0b3BfX19leF90YWJsZSA9IC47CisJfSA6dGV4dCA9IDB4OTA5MAorCisJUk9EQVRBCisKKwkvKiBEYXRhICovCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJLmRhdGEgOiBBVChBRERSKC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7CisJCURBVEFfREFUQQorCQlDT05TVFJVQ1RPUlMKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLworCQlfZWRhdGEgPSAuOworI2VuZGlmCisJfSA6ZGF0YQorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCS8qIDMyIGJpdCBoYXMgbm9zYXZlIGJlZm9yZSBfZWRhdGEgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuZGF0YV9ub3NhdmUgOiBBVChBRERSKC5kYXRhX25vc2F2ZSkgLSBMT0FEX09GRlNFVCkgeworCQlfX25vc2F2ZV9iZWdpbiA9IC47CisJCSooLmRhdGEubm9zYXZlKQorCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkJX19ub3NhdmVfZW5kID0gLjsKKwl9CisjZW5kaWYKKworCS4gPSBBTElHTihQQUdFX1NJWkUpOworCS5kYXRhLnBhZ2VfYWxpZ25lZCA6IEFUKEFERFIoLmRhdGEucGFnZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CisJCSooLmRhdGEucGFnZV9hbGlnbmVkKQorCQkqKC5kYXRhLmlkdCkKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJLiA9IEFMSUdOKDMyKTsKKyNlbHNlCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworI2VuZGlmCisJLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOgorCQlBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CisJCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCisJfQorCisJLyogcmFyZWx5IGNoYW5nZWQgZGF0YSBsaWtlIGNwdSBtYXBzICovCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCS4gPSBBTElHTigzMik7CisjZWxzZQorCS4gPSBBTElHTihDT05GSUdfWDg2X0lOVEVSTk9ERV9DQUNIRV9CWVRFUyk7CisjZW5kaWYKKwkuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsKKwkJKiguZGF0YS5yZWFkX21vc3RseSkKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLworCQlfZWRhdGEgPSAuOworI2VuZGlmCisJfQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCisjZGVmaW5lIFZTWVNDQUxMX0FERFIgKC0xMCoxMDI0KjEwMjQpCisjZGVmaW5lIFZTWVNDQUxMX1BIWVNfQUREUiAoKExPQURBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFT0YoLmRhdGEucmVhZF9tb3N0bHkpICsgNDA5NSkgJiB+KDQwOTUpKQorI2RlZmluZSBWU1lTQ0FMTF9WSVJUX0FERFIgKChBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFT0YoLmRhdGEucmVhZF9tb3N0bHkpICsgNDA5NSkgJiB+KDQwOTUpKQorCisjZGVmaW5lIFZMT0FEX09GRlNFVCAoVlNZU0NBTExfQUREUiAtIFZTWVNDQUxMX1BIWVNfQUREUikKKyNkZWZpbmUgVkxPQUQoeCkgKEFERFIoeCkgLSBWTE9BRF9PRkZTRVQpCisKKyNkZWZpbmUgVlZJUlRfT0ZGU0VUIChWU1lTQ0FMTF9BRERSIC0gVlNZU0NBTExfVklSVF9BRERSKQorI2RlZmluZSBWVklSVCh4KSAoQUREUih4KSAtIFZWSVJUX09GRlNFVCkKKworCS4gPSBWU1lTQ0FMTF9BRERSOworCS52c3lzY2FsbF8wIDogQVQoVlNZU0NBTExfUEhZU19BRERSKSB7CisJCSooLnZzeXNjYWxsXzApCisJfSA6dXNlcgorCisJX192c3lzY2FsbF8wID0gVlNZU0NBTExfVklSVF9BRERSOworCisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworCS52c3lzY2FsbF9mbiA6IEFUKFZMT0FEKC52c3lzY2FsbF9mbikpIHsKKwkJKigudnN5c2NhbGxfZm4pCisJfQorCisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworCS52c3lzY2FsbF9ndG9kX2RhdGEgOiBBVChWTE9BRCgudnN5c2NhbGxfZ3RvZF9kYXRhKSkgeworCQkqKC52c3lzY2FsbF9ndG9kX2RhdGEpCisJfQorCisJdnN5c2NhbGxfZ3RvZF9kYXRhID0gVlZJUlQoLnZzeXNjYWxsX2d0b2RfZGF0YSk7CisJLnZzeXNjYWxsX2Nsb2NrIDogQVQoVkxPQUQoLnZzeXNjYWxsX2Nsb2NrKSkgeworCQkqKC52c3lzY2FsbF9jbG9jaykKKwl9CisJdnN5c2NhbGxfY2xvY2sgPSBWVklSVCgudnN5c2NhbGxfY2xvY2spOworCisKKwkudnN5c2NhbGxfMSBBRERSKC52c3lzY2FsbF8wKSArIDEwMjQ6IEFUKFZMT0FEKC52c3lzY2FsbF8xKSkgeworCQkqKC52c3lzY2FsbF8xKQorCX0KKwkudnN5c2NhbGxfMiBBRERSKC52c3lzY2FsbF8wKSArIDIwNDg6IEFUKFZMT0FEKC52c3lzY2FsbF8yKSkgeworCQkqKC52c3lzY2FsbF8yKQorCX0KKworCS52Z2V0Y3B1X21vZGUgOiBBVChWTE9BRCgudmdldGNwdV9tb2RlKSkgeworCQkqKC52Z2V0Y3B1X21vZGUpCisJfQorCXZnZXRjcHVfbW9kZSA9IFZWSVJUKC52Z2V0Y3B1X21vZGUpOworCisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworCS5qaWZmaWVzIDogQVQoVkxPQUQoLmppZmZpZXMpKSB7CisJCSooLmppZmZpZXMpCisJfQorCWppZmZpZXMgPSBWVklSVCguamlmZmllcyk7CisKKwkudnN5c2NhbGxfMyBBRERSKC52c3lzY2FsbF8wKSArIDMwNzI6IEFUKFZMT0FEKC52c3lzY2FsbF8zKSkgeworCQkqKC52c3lzY2FsbF8zKQorCX0KKworCS4gPSBWU1lTQ0FMTF9WSVJUX0FERFIgKyBQQUdFX1NJWkU7CisKKyN1bmRlZiBWU1lTQ0FMTF9BRERSCisjdW5kZWYgVlNZU0NBTExfUEhZU19BRERSCisjdW5kZWYgVlNZU0NBTExfVklSVF9BRERSCisjdW5kZWYgVkxPQURfT0ZGU0VUCisjdW5kZWYgVkxPQUQKKyN1bmRlZiBWVklSVF9PRkZTRVQKKyN1bmRlZiBWVklSVAorCisjZW5kaWYgLyogQ09ORklHX1g4Nl82NCAqLworCisJLyogaW5pdF90YXNrICovCisJLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsKKwkuZGF0YS5pbml0X3Rhc2sgOiBBVChBRERSKC5kYXRhLmluaXRfdGFzaykgLSBMT0FEX09GRlNFVCkgeworCQkqKC5kYXRhLmluaXRfdGFzaykKKwl9CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCSA6ZGF0YS5pbml0CisjZW5kaWYKKworCS8qCisJICogc21wX2xvY2tzIG1pZ2h0IGJlIGZyZWVkIGFmdGVyIGluaXQKKwkgKiBzdGFydC9lbmQgbXVzdCBiZSBwYWdlIGFsaWduZWQKKwkgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuc21wX2xvY2tzIDogQVQoQUREUiguc21wX2xvY2tzKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fc21wX2xvY2tzID0gLjsKKwkJKiguc21wX2xvY2tzKQorCQlfX3NtcF9sb2Nrc19lbmQgPSAuOworCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwl9CisKKwkvKiBJbml0IGNvZGUgYW5kIGRhdGEgLSB3aWxsIGJlIGZyZWVkIGFmdGVyIGluaXQgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuaW5pdC50ZXh0IDogQVQoQUREUiguaW5pdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7CisJCV9faW5pdF9iZWdpbiA9IC47IC8qIHBhaXJlZCB3aXRoIF9faW5pdF9lbmQgKi8KKwkJX3Npbml0dGV4dCA9IC47CisJCUlOSVRfVEVYVAorCQlfZWluaXR0ZXh0ID0gLjsKKwl9CisKKwkuaW5pdC5kYXRhIDogQVQoQUREUiguaW5pdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7CisJCUlOSVRfREFUQQorCX0KKworCS4gPSBBTElHTigxNik7CisJLmluaXQuc2V0dXAgOiBBVChBRERSKC5pbml0LnNldHVwKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fc2V0dXBfc3RhcnQgPSAuOworCQkqKC5pbml0LnNldHVwKQorCQlfX3NldHVwX2VuZCA9IC47CisJfQorCS5pbml0Y2FsbC5pbml0IDogQVQoQUREUiguaW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKKwkJSU5JVENBTExTCisJCV9faW5pdGNhbGxfZW5kID0gLjsKKwl9CisKKwkuY29uX2luaXRjYWxsLmluaXQgOiBBVChBRERSKC5jb25faW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CisJCSooLmNvbl9pbml0Y2FsbC5pbml0KQorCQlfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOworCX0KKworCS54ODZfY3B1X2Rldi5pbml0IDogQVQoQUREUigueDg2X2NwdV9kZXYuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX3g4Nl9jcHVfZGV2X3N0YXJ0ID0gLjsKKwkJKigueDg2X2NwdV9kZXYuaW5pdCkKKwkJX194ODZfY3B1X2Rldl9lbmQgPSAuOworCX0KKworCVNFQ1VSSVRZX0lOSVQKKworCS4gPSBBTElHTig4KTsKKwkucGFyYWluc3RydWN0aW9ucyA6IEFUKEFERFIoLnBhcmFpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19wYXJhaW5zdHJ1Y3Rpb25zID0gLjsKKwkJKigucGFyYWluc3RydWN0aW9ucykKKwkJX19wYXJhaW5zdHJ1Y3Rpb25zX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDgpOworCS5hbHRpbnN0cnVjdGlvbnMgOiBBVChBRERSKC5hbHRpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19hbHRfaW5zdHJ1Y3Rpb25zID0gLjsKKwkJKiguYWx0aW5zdHJ1Y3Rpb25zKQorCQlfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsKKwl9CisKKwkuYWx0aW5zdHJfcmVwbGFjZW1lbnQgOiBBVChBRERSKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgLSBMT0FEX09GRlNFVCkgeworCQkqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkKKwl9CisKKwkvKgorCSAqIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGgKKwkgKiAgcmVmZXJlbmNlcyBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZQorCSAqLworCS5leGl0LnRleHQgOiBBVChBRERSKC5leGl0LnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJRVhJVF9URVhUCisJfQorCisJLmV4aXQuZGF0YSA6IEFUKEFERFIoLmV4aXQuZGF0YSkgLSBMT0FEX09GRlNFVCkgeworCQlFWElUX0RBVEEKKwl9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuaW5pdC5yYW1mcyA6IEFUKEFERFIoLmluaXQucmFtZnMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19pbml0cmFtZnNfc3RhcnQgPSAuOworCQkqKC5pbml0LnJhbWZzKQorCQlfX2luaXRyYW1mc19lbmQgPSAuOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJLyoKKwkgKiBwZXJjcHUgb2Zmc2V0cyBhcmUgemVyby1iYXNlZCBvbiBTTVAuICBQRVJDUFVfVkFERFIoKSBjaGFuZ2VzIHRoZQorCSAqIG91dHB1dCBQSERSLCBzbyB0aGUgbmV4dCBvdXRwdXQgc2VjdGlvbiAtIF9fZGF0YV9ub3NhdmUgLSBzaG91bGQKKwkgKiBzdGFydCBhbm90aGVyIHNlY3Rpb24gZGF0YS5pbml0Mi4gIEFsc28sIHBkYSBzaG91bGQgYmUgYXQgdGhlIGhlYWQgb2YKKwkgKiBwZXJjcHUgYXJlYS4gIFByZWFsbG9jYXRlIGl0IGFuZCBkZWZpbmUgdGhlIHBlcmNwdSBvZmZzZXQgc3ltYm9sCisJICogc28gdGhhdCBpdCBjYW4gYmUgYWNjZXNzZWQgYXMgYSBwZXJjcHUgdmFyaWFibGUuCisJICovCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJUEVSQ1BVX1ZBRERSKDAsIDpwZXJjcHUpCisjZWxzZQorCVBFUkNQVShQQUdFX1NJWkUpCisjZW5kaWYKKworCS4gPSBBTElHTihQQUdFX1NJWkUpOworCisJLyogZnJlZWQgYWZ0ZXIgaW5pdCBlbmRzIGhlcmUgKi8KKwkuaW5pdC5lbmQgOiBBVChBRERSKC5pbml0LmVuZCkgLSBMT0FEX09GRlNFVCkgeworCQlfX2luaXRfZW5kID0gLjsKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLmRhdGFfbm9zYXZlIDogQVQoQUREUiguZGF0YV9ub3NhdmUpIC0gTE9BRF9PRkZTRVQpIHsKKwkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJCV9fbm9zYXZlX2JlZ2luID0gLjsKKwkJKiguZGF0YS5ub3NhdmUpCisJCS4gPSBBTElHTihQQUdFX1NJWkUpOworCQlfX25vc2F2ZV9lbmQgPSAuOworCX0gOmRhdGEuaW5pdDIKKwkvKiB1c2UgYW5vdGhlciBzZWN0aW9uIGRhdGEuaW5pdDIsIHNlZSBQRVJDUFVfVkFERFIoKSBhYm92ZSAqLworI2VuZGlmCisKKwkvKiBCU1MgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuYnNzIDogQVQoQUREUiguYnNzKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fYnNzX3N0YXJ0ID0gLjsKKwkJKiguYnNzLnBhZ2VfYWxpZ25lZCkKKwkJKiguYnNzKQorCQkuID0gQUxJR04oNCk7CisJCV9fYnNzX3N0b3AgPSAuOworCX0KKworCS4gPSBBTElHTihQQUdFX1NJWkUpOworCS5icmsgOiBBVChBRERSKC5icmspIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19icmtfYmFzZSA9IC47CisJCS4gKz0gNjQgKiAxMDI0OwkJLyogNjRrIGFsaWdubWVudCBzbG9wIHNwYWNlICovCisJCSooLmJya19yZXNlcnZhdGlvbikJLyogYXJlYXMgYnJrIHVzZXJzIGhhdmUgcmVzZXJ2ZWQgKi8KKwkJX19icmtfbGltaXQgPSAuOworCX0KKworCS5lbmQgOiBBVChBRERSKC5lbmQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX2VuZCA9IC47CisJfQorCisJLyogU2VjdGlvbnMgdG8gYmUgZGlzY2FyZGVkICovCisJL0RJU0NBUkQvIDogeworCQkqKC5leGl0Y2FsbC5leGl0KQorCQkqKC5laF9mcmFtZSkKKwkJKiguZGlzY2FyZCkKKwl9CisKKyAgICAgICAgU1RBQlNfREVCVUcKKyAgICAgICAgRFdBUkZfREVCVUcKK30KKworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorQVNTRVJUKChfZW5kIC0gTE9BRF9PRkZTRVQgPD0gS0VSTkVMX0lNQUdFX1NJWkUpLAorICAgICAgICAia2VybmVsIGltYWdlIGJpZ2dlciB0aGFuIEtFUk5FTF9JTUFHRV9TSVpFIikKKyNlbHNlCisvKgorICogUGVyLWNwdSBzeW1ib2xzIHdoaWNoIG5lZWQgdG8gYmUgb2Zmc2V0IGZyb20gX19wZXJfY3B1X2xvYWQKKyAqIGZvciB0aGUgYm9vdCBwcm9jZXNzb3IuCisgKi8KKyNkZWZpbmUgSU5JVF9QRVJfQ1BVKHgpIGluaXRfcGVyX2NwdV9fIyN4ID0gcGVyX2NwdV9fIyN4ICsgX19wZXJfY3B1X2xvYWQKK0lOSVRfUEVSX0NQVShnZHRfcGFnZSk7CitJTklUX1BFUl9DUFUoaXJxX3N0YWNrX3VuaW9uKTsKKworLyoKKyAqIEJ1aWxkLXRpbWUgY2hlY2sgb24gdGhlIGltYWdlIHNpemU6CisgKi8KK0FTU0VSVCgoX2VuZCAtIF90ZXh0IDw9IEtFUk5FTF9JTUFHRV9TSVpFKSwKKwkia2VybmVsIGltYWdlIGJpZ2dlciB0aGFuIEtFUk5FTF9JTUFHRV9TSVpFIikKKworI2lmZGVmIENPTkZJR19TTVAKK0FTU0VSVCgocGVyX2NwdV9faXJxX3N0YWNrX3VuaW9uID09IDApLAorICAgICAgICAiaXJxX3N0YWNrX3VuaW9uIGlzIG5vdCBhdCBzdGFydCBvZiBwZXItY3B1IGFyZWEiKTsKKyNlbmRpZgorCisjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLworCisjaWZkZWYgQ09ORklHX0tFWEVDCisjaW5jbHVkZSA8YXNtL2tleGVjLmg+CisKK0FTU0VSVChrZXhlY19jb250cm9sX2NvZGVfc2l6ZSA8PSBLRVhFQ19DT05UUk9MX0NPREVfTUFYX1NJWkUsCisgICAgICAgImtleGVjIGNvbnRyb2wgY29kZSBzaXplIGlzIHRvbyBiaWciKQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92bWxpbnV4XzMyLmxkcy5TIGIvYXJjaC94ODYva2VybmVsL3ZtbGludXhfMzIubGRzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYWQ1MDAuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZtbGludXhfMzIubGRzLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyogbGQgc2NyaXB0IHRvIG1ha2UgaTM4NiBMaW51eCBrZXJuZWwKLSAqIFdyaXR0ZW4gYnkgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+OwotICoKLSAqIERvbid0IGRlZmluZSBhYnNvbHV0ZSBzeW1ib2xzIHVudGlsIGFuZCB1bmxlc3MgeW91IGtub3cgdGhhdCBzeW1ib2wKLSAqIHZhbHVlIGlzIHNob3VsZCByZW1haW4gY29uc3RhbnQgZXZlbiBpZiBrZXJuZWwgaW1hZ2UgaXMgcmVsb2NhdGVkCi0gKiBhdCBydW4gdGltZS4gQWJzb2x1dGUgc3ltYm9scyBhcmUgbm90IHJlbG9jYXRlZC4gSWYgc3ltYm9sIHZhbHVlIHNob3VsZAotICogY2hhbmdlIGlmIGtlcm5lbCBpcyByZWxvY2F0ZWQsIG1ha2UgdGhlIHN5bWJvbCBzZWN0aW9uIHJlbGF0aXZlIGFuZAotICogcHV0IGl0IGluc2lkZSB0aGUgc2VjdGlvbiBkZWZpbml0aW9uLgotICovCi0KLSNkZWZpbmUgTE9BRF9PRkZTRVQgX19QQUdFX09GRlNFVAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KLSNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgotI2luY2x1ZGUgPGFzbS9ib290Lmg+Ci0KLU9VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKLU9VVFBVVF9BUkNIKGkzODYpCi1FTlRSWShwaHlzX3N0YXJ0dXBfMzIpCi1qaWZmaWVzID0gamlmZmllc182NDsKLQotUEhEUlMgewotCXRleHQgUFRfTE9BRCBGTEFHUyg1KTsJLyogUl9FICovCi0JZGF0YSBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KLQlub3RlIFBUX05PVEUgRkxBR1MoMCk7CS8qIF9fXyAqLwotfQotU0VDVElPTlMKLXsKLSAgLiA9IExPQURfT0ZGU0VUICsgTE9BRF9QSFlTSUNBTF9BRERSOwotICBwaHlzX3N0YXJ0dXBfMzIgPSBzdGFydHVwXzMyIC0gTE9BRF9PRkZTRVQ7Ci0KLSAgLnRleHQuaGVhZCA6IEFUKEFERFIoLnRleHQuaGVhZCkgLSBMT0FEX09GRlNFVCkgewotICAJX3RleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCi0JKigudGV4dC5oZWFkKQotICB9IDp0ZXh0ID0gMHg5MDkwCi0KLSAgLyogcmVhZC1vbmx5ICovCi0gIC50ZXh0IDogQVQoQUREUigudGV4dCkgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOyAvKiBub3QgcmVhbGx5IG5lZWRlZCwgYWxyZWFkeSBwYWdlIGFsaWduZWQgKi8KLQkqKC50ZXh0LnBhZ2VfYWxpZ25lZCkKLQlURVhUX1RFWFQKLQlTQ0hFRF9URVhUCi0JTE9DS19URVhUCi0JS1BST0JFU19URVhUCi0JSVJRRU5UUllfVEVYVAotCSooLmZpeHVwKQotCSooLmdudS53YXJuaW5nKQotICAJX2V0ZXh0ID0gLjsJCQkvKiBFbmQgb2YgdGV4dCBzZWN0aW9uICovCi0gIH0gOnRleHQgPSAweDkwOTAKLQotICBOT1RFUyA6dGV4dCA6bm90ZQotCi0gIC4gPSBBTElHTigxNik7CQkvKiBFeGNlcHRpb24gdGFibGUgKi8KLSAgX19leF90YWJsZSA6IEFUKEFERFIoX19leF90YWJsZSkgLSBMT0FEX09GRlNFVCkgewotICAJX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLQkgKihfX2V4X3RhYmxlKQotICAJX19zdG9wX19fZXhfdGFibGUgPSAuOwotICB9IDp0ZXh0ID0gMHg5MDkwCi0KLSAgUk9EQVRBCi0KLSAgLyogd3JpdGVhYmxlICovCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuZGF0YSA6IEFUKEFERFIoLmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsJLyogRGF0YSAqLwotCURBVEFfREFUQQotCUNPTlNUUlVDVE9SUwotCX0gOmRhdGEKLQotICAuID0gQUxJR04oUEFHRV9TSVpFKTsKLSAgLmRhdGFfbm9zYXZlIDogQVQoQUREUiguZGF0YV9ub3NhdmUpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fbm9zYXZlX2JlZ2luID0gLjsKLQkqKC5kYXRhLm5vc2F2ZSkKLSAgCS4gPSBBTElHTihQQUdFX1NJWkUpOwotICAJX19ub3NhdmVfZW5kID0gLjsKLSAgfQotCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuZGF0YS5wYWdlX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLnBhZ2VfYWxpZ25lZCkgLSBMT0FEX09GRlNFVCkgewotCSooLmRhdGEucGFnZV9hbGlnbmVkKQotCSooLmRhdGEuaWR0KQotICB9Ci0KLSAgLiA9IEFMSUdOKDMyKTsKLSAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7Ci0JKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKLSAgfQotCi0gIC8qIHJhcmVseSBjaGFuZ2VkIGRhdGEgbGlrZSBjcHUgbWFwcyAqLwotICAuID0gQUxJR04oMzIpOwotICAuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsKLQkqKC5kYXRhLnJlYWRfbW9zdGx5KQotCV9lZGF0YSA9IC47CQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIH0KLQotICAuID0gQUxJR04oVEhSRUFEX1NJWkUpOwkvKiBpbml0X3Rhc2sgKi8KLSAgLmRhdGEuaW5pdF90YXNrIDogQVQoQUREUiguZGF0YS5pbml0X3Rhc2spIC0gTE9BRF9PRkZTRVQpIHsKLQkqKC5kYXRhLmluaXRfdGFzaykKLSAgfQotCi0gIC8qIG1pZ2h0IGdldCBmcmVlZCBhZnRlciBpbml0ICovCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuc21wX2xvY2tzIDogQVQoQUREUiguc21wX2xvY2tzKSAtIExPQURfT0ZGU0VUKSB7Ci0gIAlfX3NtcF9sb2NrcyA9IC47Ci0JKiguc21wX2xvY2tzKQotCV9fc21wX2xvY2tzX2VuZCA9IC47Ci0gIH0KLSAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0Ci0gICAqIEZvbGxvd2luZyBBTElHTigpIGlzIHJlcXVpcmVkIHRvIG1ha2Ugc3VyZSBubyBvdGhlciBkYXRhIGZhbGxzIG9uIHRoZQotICAgKiBzYW1lIHBhZ2Ugd2hlcmUgX19zbXBfYWx0X2VuZCBpcyBwb2ludGluZyBhcyB0aGF0IHBhZ2UgbWlnaHQgYmUgZnJlZWQKLSAgICogYWZ0ZXIgYm9vdC4gQWx3YXlzIG1ha2Ugc3VyZSB0aGF0IEFMSUdOKCkgZGlyZWN0aXZlIGlzIHByZXNlbnQgYWZ0ZXIKLSAgICogdGhlIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgX19zbXBfYWx0X2VuZC4KLSAgICovCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotCi0gIC8qIHdpbGwgYmUgZnJlZWQgYWZ0ZXIgaW5pdCAqLwotICAuID0gQUxJR04oUEFHRV9TSVpFKTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwotICAuaW5pdC50ZXh0IDogQVQoQUREUiguaW5pdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0gIAlfX2luaXRfYmVnaW4gPSAuOwotCV9zaW5pdHRleHQgPSAuOwotCUlOSVRfVEVYVAotCV9laW5pdHRleHQgPSAuOwotICB9Ci0gIC5pbml0LmRhdGEgOiBBVChBRERSKC5pbml0LmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsKLQlJTklUX0RBVEEKLSAgfQotICAuID0gQUxJR04oMTYpOwotICAuaW5pdC5zZXR1cCA6IEFUKEFERFIoLmluaXQuc2V0dXApIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fc2V0dXBfc3RhcnQgPSAuOwotCSooLmluaXQuc2V0dXApCi0gIAlfX3NldHVwX2VuZCA9IC47Ci0gICB9Ci0gIC5pbml0Y2FsbC5pbml0IDogQVQoQUREUiguaW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgewotICAJX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JSU5JVENBTExTCi0gIAlfX2luaXRjYWxsX2VuZCA9IC47Ci0gIH0KLSAgLmNvbl9pbml0Y2FsbC5pbml0IDogQVQoQUREUiguY29uX2luaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkqKC5jb25faW5pdGNhbGwuaW5pdCkKLSAgCV9fY29uX2luaXRjYWxsX2VuZCA9IC47Ci0gIH0KLSAgLng4Nl9jcHVfZGV2LmluaXQgOiBBVChBRERSKC54ODZfY3B1X2Rldi5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX194ODZfY3B1X2Rldl9zdGFydCA9IC47Ci0JKigueDg2X2NwdV9kZXYuaW5pdCkKLQlfX3g4Nl9jcHVfZGV2X2VuZCA9IC47Ci0gIH0KLSAgU0VDVVJJVFlfSU5JVAotICAuID0gQUxJR04oNCk7Ci0gIC5hbHRpbnN0cnVjdGlvbnMgOiBBVChBRERSKC5hbHRpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fYWx0X2luc3RydWN0aW9ucyA9IC47Ci0JKiguYWx0aW5zdHJ1Y3Rpb25zKQotCV9fYWx0X2luc3RydWN0aW9uc19lbmQgPSAuOwotICB9Ci0gIC5hbHRpbnN0cl9yZXBsYWNlbWVudCA6IEFUKEFERFIoLmFsdGluc3RyX3JlcGxhY2VtZW50KSAtIExPQURfT0ZGU0VUKSB7Ci0JKiguYWx0aW5zdHJfcmVwbGFjZW1lbnQpCi0gIH0KLSAgLiA9IEFMSUdOKDQpOwotICAucGFyYWluc3RydWN0aW9ucyA6IEFUKEFERFIoLnBhcmFpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fcGFyYWluc3RydWN0aW9ucyA9IC47Ci0JKigucGFyYWluc3RydWN0aW9ucykKLSAgCV9fcGFyYWluc3RydWN0aW9uc19lbmQgPSAuOwotICB9Ci0gIC8qIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcwotICAgICBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZSAqLwotICAuZXhpdC50ZXh0IDogQVQoQUREUiguZXhpdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0JRVhJVF9URVhUCi0gIH0KLSAgLmV4aXQuZGF0YSA6IEFUKEFERFIoLmV4aXQuZGF0YSkgLSBMT0FEX09GRlNFVCkgewotCUVYSVRfREFUQQotICB9Ci0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTklUUkQpCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuaW5pdC5yYW1mcyA6IEFUKEFERFIoLmluaXQucmFtZnMpIC0gTE9BRF9PRkZTRVQpIHsKLQlfX2luaXRyYW1mc19zdGFydCA9IC47Ci0JKiguaW5pdC5yYW1mcykKLQlfX2luaXRyYW1mc19lbmQgPSAuOwotICB9Ci0jZW5kaWYKLSAgUEVSQ1BVKFBBR0VfU0laRSkKLSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0gIC8qIGZyZWVkIGFmdGVyIGluaXQgZW5kcyBoZXJlICovCi0KLSAgLmJzcyA6IEFUKEFERFIoLmJzcykgLSBMT0FEX09GRlNFVCkgewotCV9faW5pdF9lbmQgPSAuOwotCV9fYnNzX3N0YXJ0ID0gLjsJCS8qIEJTUyAqLwotCSooLmJzcy5wYWdlX2FsaWduZWQpCi0JKiguYnNzKQotCS4gPSBBTElHTig0KTsKLQlfX2Jzc19zdG9wID0gLjsKLSAgfQotCi0gIC5icmsgOiBBVChBRERSKC5icmspIC0gTE9BRF9PRkZTRVQpIHsKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX2Jya19iYXNlID0gLiA7Ci0gCS4gKz0gNjQgKiAxMDI0IDsJLyogNjRrIGFsaWdubWVudCBzbG9wIHNwYWNlICovCi0JKiguYnJrX3Jlc2VydmF0aW9uKQkvKiBhcmVhcyBicmsgdXNlcnMgaGF2ZSByZXNlcnZlZCAqLwotCV9fYnJrX2xpbWl0ID0gLiA7Ci0gIH0KLQotICAuZW5kIDogQVQoQUREUiguZW5kKSAtIExPQURfT0ZGU0VUKSB7Ci0JX2VuZCA9IC4gOwotICB9Ci0KLSAgLyogU2VjdGlvbnMgdG8gYmUgZGlzY2FyZGVkICovCi0gIC9ESVNDQVJELyA6IHsKLQkqKC5leGl0Y2FsbC5leGl0KQotCSooLmRpc2NhcmQpCi0JfQotCi0gIFNUQUJTX0RFQlVHCi0KLSAgRFdBUkZfREVCVUcKLX0KLQotLyoKLSAqIEJ1aWxkLXRpbWUgY2hlY2sgb24gdGhlIGltYWdlIHNpemU6Ci0gKi8KLUFTU0VSVCgoX2VuZCAtIExPQURfT0ZGU0VUIDw9IEtFUk5FTF9JTUFHRV9TSVpFKSwKLQkia2VybmVsIGltYWdlIGJpZ2dlciB0aGFuIEtFUk5FTF9JTUFHRV9TSVpFIikKLQotI2lmZGVmIENPTkZJR19LRVhFQwotLyogTGluayB0aW1lIGNoZWNrcyAqLwotI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgotCi1BU1NFUlQoa2V4ZWNfY29udHJvbF9jb2RlX3NpemUgPD0gS0VYRUNfQ09OVFJPTF9DT0RFX01BWF9TSVpFLAotICAgICAgICJrZXhlYyBjb250cm9sIGNvZGUgc2l6ZSBpcyB0b28gYmlnIikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtbGludXhfNjQubGRzLlMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF82NC5sZHMuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3NDI1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF82NC5sZHMuUworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKiBsZCBzY3JpcHQgdG8gbWFrZSB4ODYtNjQgTGludXgga2VybmVsCi0gKiBXcml0dGVuIGJ5IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PjsKLSAqLwotCi0jZGVmaW5lIExPQURfT0ZGU0VUIF9fU1RBUlRfS0VSTkVMX21hcAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgotCi0jdW5kZWYgaTM4NgkvKiBpbiBjYXNlIHRoZSBwcmVwcm9jZXNzb3IgaXMgYSAzMmJpdCBvbmUgKi8KLQotT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiKQotT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCi1FTlRSWShwaHlzX3N0YXJ0dXBfNjQpCi1qaWZmaWVzXzY0ID0gamlmZmllczsKLVBIRFJTIHsKLQl0ZXh0IFBUX0xPQUQgRkxBR1MoNSk7CS8qIFJfRSAqLwotCWRhdGEgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCi0JdXNlciBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KLQlkYXRhLmluaXQgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCi0jaWZkZWYgQ09ORklHX1NNUAotCXBlcmNwdSBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KLSNlbmRpZgotCWRhdGEuaW5pdDIgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCi0Jbm90ZSBQVF9OT1RFIEZMQUdTKDApOwkvKiBfX18gKi8KLX0KLVNFQ1RJT05TCi17Ci0gIC4gPSBfX1NUQVJUX0tFUk5FTDsKLSAgcGh5c19zdGFydHVwXzY0ID0gc3RhcnR1cF82NCAtIExPQURfT0ZGU0VUOwotICAudGV4dCA6ICBBVChBRERSKC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX3RleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCi0JLyogRmlyc3QgdGhlIGNvZGUgdGhhdCBoYXMgdG8gYmUgZmlyc3QgZm9yIGJvb3RzdHJhcHBpbmcgKi8KLQkqKC50ZXh0LmhlYWQpCi0JX3N0ZXh0ID0gLjsKLQkvKiBUaGVuIHRoZSByZXN0ICovCi0JVEVYVF9URVhUCi0JU0NIRURfVEVYVAotCUxPQ0tfVEVYVAotCUtQUk9CRVNfVEVYVAotCUlSUUVOVFJZX1RFWFQKLQkqKC5maXh1cCkKLQkqKC5nbnUud2FybmluZykKLQlfZXRleHQgPSAuOwkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLwotICB9IDp0ZXh0ID0gMHg5MDkwCi0KLSAgTk9URVMgOnRleHQgOm5vdGUKLQotICAuID0gQUxJR04oMTYpOwkJLyogRXhjZXB0aW9uIHRhYmxlICovCi0gIF9fZXhfdGFibGUgOiBBVChBRERSKF9fZXhfdGFibGUpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0JICooX19leF90YWJsZSkKLSAgCV9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLSAgfSA6dGV4dCA9IDB4OTA5MAotCi0gIFJPREFUQQotCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwkJLyogQWxpZ24gZGF0YSBzZWdtZW50IHRvIHBhZ2Ugc2l6ZSBib3VuZGFyeSAqLwotCQkJCS8qIERhdGEgKi8KLSAgLmRhdGEgOiBBVChBRERSKC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7Ci0JREFUQV9EQVRBCi0JQ09OU1RSVUNUT1JTCi0JX2VkYXRhID0gLjsJCQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCi0JfSA6ZGF0YQotCi0KLSAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7Ci0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOwotCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0gIH0KLSAgLiA9IEFMSUdOKENPTkZJR19YODZfSU5URVJOT0RFX0NBQ0hFX0JZVEVTKTsKLSAgLmRhdGEucmVhZF9tb3N0bHkgOiBBVChBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSAtIExPQURfT0ZGU0VUKSB7Ci0gIAkqKC5kYXRhLnJlYWRfbW9zdGx5KQotICB9Ci0KLSNkZWZpbmUgVlNZU0NBTExfQUREUiAoLTEwKjEwMjQqMTAyNCkKLSNkZWZpbmUgVlNZU0NBTExfUEhZU19BRERSICgoTE9BREFERFIoLmRhdGEucmVhZF9tb3N0bHkpICsgU0laRU9GKC5kYXRhLnJlYWRfbW9zdGx5KSArIDQwOTUpICYgfig0MDk1KSkKLSNkZWZpbmUgVlNZU0NBTExfVklSVF9BRERSICgoQUREUiguZGF0YS5yZWFkX21vc3RseSkgKyBTSVpFT0YoLmRhdGEucmVhZF9tb3N0bHkpICsgNDA5NSkgJiB+KDQwOTUpKQotCi0jZGVmaW5lIFZMT0FEX09GRlNFVCAoVlNZU0NBTExfQUREUiAtIFZTWVNDQUxMX1BIWVNfQUREUikKLSNkZWZpbmUgVkxPQUQoeCkgKEFERFIoeCkgLSBWTE9BRF9PRkZTRVQpCi0KLSNkZWZpbmUgVlZJUlRfT0ZGU0VUIChWU1lTQ0FMTF9BRERSIC0gVlNZU0NBTExfVklSVF9BRERSKQotI2RlZmluZSBWVklSVCh4KSAoQUREUih4KSAtIFZWSVJUX09GRlNFVCkKLQotICAuID0gVlNZU0NBTExfQUREUjsKLSAgLnZzeXNjYWxsXzAgOgkgQVQoVlNZU0NBTExfUEhZU19BRERSKSB7ICooLnZzeXNjYWxsXzApIH0gOnVzZXIKLSAgX192c3lzY2FsbF8wID0gVlNZU0NBTExfVklSVF9BRERSOwotCi0gIC4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKLSAgLnZzeXNjYWxsX2ZuIDogQVQoVkxPQUQoLnZzeXNjYWxsX2ZuKSkgeyAqKC52c3lzY2FsbF9mbikgfQotICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7Ci0gIC52c3lzY2FsbF9ndG9kX2RhdGEgOiBBVChWTE9BRCgudnN5c2NhbGxfZ3RvZF9kYXRhKSkKLQkJeyAqKC52c3lzY2FsbF9ndG9kX2RhdGEpIH0KLSAgdnN5c2NhbGxfZ3RvZF9kYXRhID0gVlZJUlQoLnZzeXNjYWxsX2d0b2RfZGF0YSk7Ci0gIC52c3lzY2FsbF9jbG9jayA6IEFUKFZMT0FEKC52c3lzY2FsbF9jbG9jaykpCi0JCXsgKigudnN5c2NhbGxfY2xvY2spIH0KLSAgdnN5c2NhbGxfY2xvY2sgPSBWVklSVCgudnN5c2NhbGxfY2xvY2spOwotCi0KLSAgLnZzeXNjYWxsXzEgQUREUigudnN5c2NhbGxfMCkgKyAxMDI0OiBBVChWTE9BRCgudnN5c2NhbGxfMSkpCi0JCXsgKigudnN5c2NhbGxfMSkgfQotICAudnN5c2NhbGxfMiBBRERSKC52c3lzY2FsbF8wKSArIDIwNDg6IEFUKFZMT0FEKC52c3lzY2FsbF8yKSkKLQkJeyAqKC52c3lzY2FsbF8yKSB9Ci0KLSAgLnZnZXRjcHVfbW9kZSA6IEFUKFZMT0FEKC52Z2V0Y3B1X21vZGUpKSB7ICooLnZnZXRjcHVfbW9kZSkgfQotICB2Z2V0Y3B1X21vZGUgPSBWVklSVCgudmdldGNwdV9tb2RlKTsKLQotICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7Ci0gIC5qaWZmaWVzIDogQVQoVkxPQUQoLmppZmZpZXMpKSB7ICooLmppZmZpZXMpIH0KLSAgamlmZmllcyA9IFZWSVJUKC5qaWZmaWVzKTsKLQotICAudnN5c2NhbGxfMyBBRERSKC52c3lzY2FsbF8wKSArIDMwNzI6IEFUKFZMT0FEKC52c3lzY2FsbF8zKSkKLQkJeyAqKC52c3lzY2FsbF8zKSB9Ci0KLSAgLiA9IFZTWVNDQUxMX1ZJUlRfQUREUiArIFBBR0VfU0laRTsKLQotI3VuZGVmIFZTWVNDQUxMX0FERFIKLSN1bmRlZiBWU1lTQ0FMTF9QSFlTX0FERFIKLSN1bmRlZiBWU1lTQ0FMTF9WSVJUX0FERFIKLSN1bmRlZiBWTE9BRF9PRkZTRVQKLSN1bmRlZiBWTE9BRAotI3VuZGVmIFZWSVJUX09GRlNFVAotI3VuZGVmIFZWSVJUCi0KLSAgLmRhdGEuaW5pdF90YXNrIDogQVQoQUREUiguZGF0YS5pbml0X3Rhc2spIC0gTE9BRF9PRkZTRVQpIHsKLQkuID0gQUxJR04oVEhSRUFEX1NJWkUpOwkvKiBpbml0X3Rhc2sgKi8KLQkqKC5kYXRhLmluaXRfdGFzaykKLSAgfTpkYXRhLmluaXQKLQotICAuZGF0YS5wYWdlX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLnBhZ2VfYWxpZ25lZCkgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCSooLmRhdGEucGFnZV9hbGlnbmVkKQotICB9Ci0KLSAgLnNtcF9sb2NrcyA6IEFUKEFERFIoLnNtcF9sb2NrcykgLSBMT0FEX09GRlNFVCkgewotCS8qIG1pZ2h0IGdldCBmcmVlZCBhZnRlciBpbml0ICovCi0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JX19zbXBfYWx0X2JlZ2luID0gLjsKLQlfX3NtcF9sb2NrcyA9IC47Ci0JKiguc21wX2xvY2tzKQotCV9fc21wX2xvY2tzX2VuZCA9IC47Ci0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JX19zbXBfYWx0X2VuZCA9IC47Ci0gIH0KLQotICAuID0gQUxJR04oUEFHRV9TSVpFKTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwotICBfX2luaXRfYmVnaW4gPSAuOwkvKiBwYWlyZWQgd2l0aCBfX2luaXRfZW5kICovCi0gIC5pbml0LnRleHQgOiBBVChBRERSKC5pbml0LnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKLQlfc2luaXR0ZXh0ID0gLjsKLQlJTklUX1RFWFQKLQlfZWluaXR0ZXh0ID0gLjsKLSAgfQotICAuaW5pdC5kYXRhIDogQVQoQUREUiguaW5pdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7Ci0JX19pbml0ZGF0YV9iZWdpbiA9IC47Ci0JSU5JVF9EQVRBCi0JX19pbml0ZGF0YV9lbmQgPSAuOwotICAgfQotCi0gIC5pbml0LnNldHVwIDogQVQoQUREUiguaW5pdC5zZXR1cCkgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTigxNik7Ci0JX19zZXR1cF9zdGFydCA9IC47Ci0JKiguaW5pdC5zZXR1cCkKLQlfX3NldHVwX2VuZCA9IC47Ci0gIH0KLSAgLmluaXRjYWxsLmluaXQgOiBBVChBRERSKC5pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JSU5JVENBTExTCi0JX19pbml0Y2FsbF9lbmQgPSAuOwotICB9Ci0gIC5jb25faW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmNvbl9pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotCSooLmNvbl9pbml0Y2FsbC5pbml0KQotCV9fY29uX2luaXRjYWxsX2VuZCA9IC47Ci0gIH0KLSAgLng4Nl9jcHVfZGV2LmluaXQgOiBBVChBRERSKC54ODZfY3B1X2Rldi5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX194ODZfY3B1X2Rldl9zdGFydCA9IC47Ci0JKigueDg2X2NwdV9kZXYuaW5pdCkKLQlfX3g4Nl9jcHVfZGV2X2VuZCA9IC47Ci0gIH0KLSAgU0VDVVJJVFlfSU5JVAotCi0gIC4gPSBBTElHTig4KTsKLSAgLnBhcmFpbnN0cnVjdGlvbnMgOiBBVChBRERSKC5wYXJhaW5zdHJ1Y3Rpb25zKSAtIExPQURfT0ZGU0VUKSB7Ci0JX19wYXJhaW5zdHJ1Y3Rpb25zID0gLjsKLSAgICAgICAqKC5wYXJhaW5zdHJ1Y3Rpb25zKQotCV9fcGFyYWluc3RydWN0aW9uc19lbmQgPSAuOwotICB9Ci0KLSAgLmFsdGluc3RydWN0aW9ucyA6IEFUKEFERFIoLmFsdGluc3RydWN0aW9ucykgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTig4KTsKLQlfX2FsdF9pbnN0cnVjdGlvbnMgPSAuOwotCSooLmFsdGluc3RydWN0aW9ucykKLQlfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsKLSAgfQotICAuYWx0aW5zdHJfcmVwbGFjZW1lbnQgOiBBVChBRERSKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgLSBMT0FEX09GRlNFVCkgewotCSooLmFsdGluc3RyX3JlcGxhY2VtZW50KQotICB9Ci0gIC8qIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcwotICAgICBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZSAqLwotICAuZXhpdC50ZXh0IDogQVQoQUREUiguZXhpdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0JRVhJVF9URVhUCi0gIH0KLSAgLmV4aXQuZGF0YSA6IEFUKEFERFIoLmV4aXQuZGF0YSkgLSBMT0FEX09GRlNFVCkgewotCUVYSVRfREFUQQotICB9Ci0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0gIC5pbml0LnJhbWZzIDogQVQoQUREUiguaW5pdC5yYW1mcykgLSBMT0FEX09GRlNFVCkgewotCV9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKLQkqKC5pbml0LnJhbWZzKQotCV9faW5pdHJhbWZzX2VuZCA9IC47Ci0gIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NNUAotICAvKgotICAgKiBwZXJjcHUgb2Zmc2V0cyBhcmUgemVyby1iYXNlZCBvbiBTTVAuICBQRVJDUFVfVkFERFIoKSBjaGFuZ2VzIHRoZQotICAgKiBvdXRwdXQgUEhEUiwgc28gdGhlIG5leHQgb3V0cHV0IHNlY3Rpb24gLSBfX2RhdGFfbm9zYXZlIC0gc2hvdWxkCi0gICAqIHN0YXJ0IGFub3RoZXIgc2VjdGlvbiBkYXRhLmluaXQyLiAgQWxzbywgcGRhIHNob3VsZCBiZSBhdCB0aGUgaGVhZCBvZgotICAgKiBwZXJjcHUgYXJlYS4gIFByZWFsbG9jYXRlIGl0IGFuZCBkZWZpbmUgdGhlIHBlcmNwdSBvZmZzZXQgc3ltYm9sCi0gICAqIHNvIHRoYXQgaXQgY2FuIGJlIGFjY2Vzc2VkIGFzIGEgcGVyY3B1IHZhcmlhYmxlLgotICAgKi8KLSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0gIFBFUkNQVV9WQUREUigwLCA6cGVyY3B1KQotI2Vsc2UKLSAgUEVSQ1BVKFBBR0VfU0laRSkKLSNlbmRpZgotCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICBfX2luaXRfZW5kID0gLjsKLQotICAuZGF0YV9ub3NhdmUgOiBBVChBRERSKC5kYXRhX25vc2F2ZSkgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCV9fbm9zYXZlX2JlZ2luID0gLjsKLQkqKC5kYXRhLm5vc2F2ZSkKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX25vc2F2ZV9lbmQgPSAuOwotICB9IDpkYXRhLmluaXQyIC8qIHVzZSBhbm90aGVyIHNlY3Rpb24gZGF0YS5pbml0Miwgc2VlIFBFUkNQVV9WQUREUigpIGFib3ZlICovCi0KLSAgLmJzcyA6IEFUKEFERFIoLmJzcykgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCV9fYnNzX3N0YXJ0ID0gLjsJCS8qIEJTUyAqLwotCSooLmJzcy5wYWdlX2FsaWduZWQpCi0JKiguYnNzKQotCV9fYnNzX3N0b3AgPSAuOwotICB9Ci0KLSAgLmJyayA6IEFUKEFERFIoLmJyaykgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCV9fYnJrX2Jhc2UgPSAuIDsKLSAJLiArPSA2NCAqIDEwMjQgOwkvKiA2NGsgYWxpZ25tZW50IHNsb3Agc3BhY2UgKi8KLQkqKC5icmtfcmVzZXJ2YXRpb24pCS8qIGFyZWFzIGJyayB1c2VycyBoYXZlIHJlc2VydmVkICovCi0JX19icmtfbGltaXQgPSAuIDsKLSAgfQotCi0gIF9lbmQgPSAuIDsKLQotICAvKiBTZWN0aW9ucyB0byBiZSBkaXNjYXJkZWQgKi8KLSAgL0RJU0NBUkQvIDogewotCSooLmV4aXRjYWxsLmV4aXQpCi0JKiguZWhfZnJhbWUpCi0JKiguZGlzY2FyZCkKLQl9Ci0KLSAgU1RBQlNfREVCVUcKLQotICBEV0FSRl9ERUJVRwotfQotCi0gLyoKLSAgKiBQZXItY3B1IHN5bWJvbHMgd2hpY2ggbmVlZCB0byBiZSBvZmZzZXQgZnJvbSBfX3Blcl9jcHVfbG9hZAotICAqIGZvciB0aGUgYm9vdCBwcm9jZXNzb3IuCi0gICovCi0jZGVmaW5lIElOSVRfUEVSX0NQVSh4KSBpbml0X3Blcl9jcHVfXyMjeCA9IHBlcl9jcHVfXyMjeCArIF9fcGVyX2NwdV9sb2FkCi1JTklUX1BFUl9DUFUoZ2R0X3BhZ2UpOwotSU5JVF9QRVJfQ1BVKGlycV9zdGFja191bmlvbik7Ci0KLS8qCi0gKiBCdWlsZC10aW1lIGNoZWNrIG9uIHRoZSBpbWFnZSBzaXplOgotICovCi1BU1NFUlQoKF9lbmQgLSBfdGV4dCA8PSBLRVJORUxfSU1BR0VfU0laRSksCi0JImtlcm5lbCBpbWFnZSBiaWdnZXIgdGhhbiBLRVJORUxfSU1BR0VfU0laRSIpCi0KLSNpZmRlZiBDT05GSUdfU01QCi1BU1NFUlQoKHBlcl9jcHVfX2lycV9zdGFja191bmlvbiA9PSAwKSwKLSAgICAgICAgImlycV9zdGFja191bmlvbiBpcyBub3QgYXQgc3RhcnQgb2YgcGVyLWNwdSBhcmVhIik7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19LRVhFQwotI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgotCi1BU1NFUlQoa2V4ZWNfY29udHJvbF9jb2RlX3NpemUgPD0gS0VYRUNfQ09OVFJPTF9DT0RFX01BWF9TSVpFLAotICAgICAgICJrZXhlYyBjb250cm9sIGNvZGUgc2l6ZSBpcyB0b28gYmlnIikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwppbmRleCA0NDE1M2FmLi4yNWVlMDZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwpAQCAtMTMyLDE1ICsxMzIsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJLyoKLQkJICogU3Vycm91bmQgdGhlIFJEVFNDIGJ5IGJhcnJpZXJzLCB0byBtYWtlIHN1cmUgaXQncyBub3QKLQkJICogc3BlY3VsYXRlZCB0byBvdXRzaWRlIHRoZSBzZXFsb2NrIGNyaXRpY2FsIHNlY3Rpb24gYW5kCi0JCSAqIGRvZXMgbm90IGNhdXNlIHRpbWUgd2FycHM6Ci0JCSAqLwotCQlyZHRzY19iYXJyaWVyKCk7CiAJCW5vdyA9IHZyZWFkKCk7Ci0JCXJkdHNjX2JhcnJpZXIoKTsKLQogCQliYXNlID0gX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2suY3ljbGVfbGFzdDsKIAkJbWFzayA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLm1hc2s7CiAJCW11bHQgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5tdWx0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL0tjb25maWcgYi9hcmNoL3g4Ni9rdm0vS2NvbmZpZwppbmRleCBhNTg1MDRlLi44NjAwYTA5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vS2NvbmZpZworKysgYi9hcmNoL3g4Ni9rdm0vS2NvbmZpZwpAQCAtNTAsNiArNTAsOSBAQAogCSAgUHJvdmlkZXMgc3VwcG9ydCBmb3IgS1ZNIG9uIEludGVsIHByb2Nlc3NvcnMgZXF1aXBwZWQgd2l0aCB0aGUgVlQKIAkgIGV4dGVuc2lvbnMuCiAKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQga3ZtLWludGVsLgorCiBjb25maWcgS1ZNX0FNRAogCXRyaXN0YXRlICJLVk0gZm9yIEFNRCBwcm9jZXNzb3JzIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBLVk0KQEAgLTU3LDYgKzYwLDkgQEAKIAkgIFByb3ZpZGVzIHN1cHBvcnQgZm9yIEtWTSBvbiBBTUQgcHJvY2Vzc29ycyBlcXVpcHBlZCB3aXRoIHRoZSBBTUQtVgogCSAgKFNWTSkgZXh0ZW5zaW9ucy4KIAorCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBrdm0tYW1kLgorCiBjb25maWcgS1ZNX1RSQUNFCiAJYm9vbCAiS1ZNIHRyYWNlIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBLVk0gJiYgU1lTRlMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9NYWtlZmlsZSBiL2FyY2gveDg2L2t2bS9NYWtlZmlsZQppbmRleCBkM2VjMjkyLi5iNDNjNGVmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva3ZtL01ha2VmaWxlCkBAIC0xNCw3ICsxNCw3IEBACiBFWFRSQV9DRkxBR1MgKz0gLUl2aXJ0L2t2bSAtSWFyY2gveDg2L2t2bQogCiBrdm0tb2JqcyA6PSAkKGNvbW1vbi1vYmpzKSB4ODYubyBtbXUubyB4ODZfZW11bGF0ZS5vIGk4MjU5Lm8gaXJxLm8gbGFwaWMubyBcCi0JaTgyNTQubworCWk4MjU0Lm8gdGltZXIubwogb2JqLSQoQ09ORklHX0tWTSkgKz0ga3ZtLm8KIGt2bS1pbnRlbC1vYmpzID0gdm14Lm8KIG9iai0kKENPTkZJR19LVk1fSU5URUwpICs9IGt2bS1pbnRlbC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaTgyNTQuYyBiL2FyY2gveDg2L2t2bS9pODI1NC5jCmluZGV4IGMxM2JiOTIuLjRkNmYwZDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pODI1NC5jCisrKyBiL2FyY2gveDg2L2t2bS9pODI1NC5jCkBAIC05OCw2ICs5OCwzNyBAQAogCXJldHVybiBrdm0tPmFyY2gudnBpdC0+cGl0X3N0YXRlLmNoYW5uZWxzW2NoYW5uZWxdLmdhdGU7CiB9CiAKK3N0YXRpYyBzNjQgX19rcGl0X2VsYXBzZWQoc3RydWN0IGt2bSAqa3ZtKQoreworCXM2NCBlbGFwc2VkOworCWt0aW1lX3QgcmVtYWluaW5nOworCXN0cnVjdCBrdm1fa3BpdF9zdGF0ZSAqcHMgPSAma3ZtLT5hcmNoLnZwaXQtPnBpdF9zdGF0ZTsKKworCS8qCisJICogVGhlIENvdW50ZXIgZG9lcyBub3Qgc3RvcCB3aGVuIGl0IHJlYWNoZXMgemVyby4gSW4KKwkgKiBNb2RlcyAwLCAxLCA0LCBhbmQgNSB0aGUgQ291bnRlciBgYHdyYXBzIGFyb3VuZCcnIHRvCisJICogdGhlIGhpZ2hlc3QgY291bnQsIGVpdGhlciBGRkZGIGhleCBmb3IgYmluYXJ5IGNvdW50aW5nCisJICogb3IgOTk5OSBmb3IgQkNEIGNvdW50aW5nLCBhbmQgY29udGludWVzIGNvdW50aW5nLgorCSAqIE1vZGVzIDIgYW5kIDMgYXJlIHBlcmlvZGljOyB0aGUgQ291bnRlciByZWxvYWRzCisJICogaXRzZWxmIHdpdGggdGhlIGluaXRpYWwgY291bnQgYW5kIGNvbnRpbnVlcyBjb3VudGluZworCSAqIGZyb20gdGhlcmUuCisJICovCisJcmVtYWluaW5nID0gaHJ0aW1lcl9leHBpcmVzX3JlbWFpbmluZygmcHMtPnBpdF90aW1lci50aW1lcik7CisJZWxhcHNlZCA9IHBzLT5waXRfdGltZXIucGVyaW9kIC0ga3RpbWVfdG9fbnMocmVtYWluaW5nKTsKKwllbGFwc2VkID0gbW9kXzY0KGVsYXBzZWQsIHBzLT5waXRfdGltZXIucGVyaW9kKTsKKworCXJldHVybiBlbGFwc2VkOworfQorCitzdGF0aWMgczY0IGtwaXRfZWxhcHNlZChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fa3BpdF9jaGFubmVsX3N0YXRlICpjLAorCQkJaW50IGNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwgPT0gMCkKKwkJcmV0dXJuIF9fa3BpdF9lbGFwc2VkKGt2bSk7CisKKwlyZXR1cm4ga3RpbWVfdG9fbnMoa3RpbWVfc3ViKGt0aW1lX2dldCgpLCBjLT5jb3VudF9sb2FkX3RpbWUpKTsKK30KKwogc3RhdGljIGludCBwaXRfZ2V0X2NvdW50KHN0cnVjdCBrdm0gKmt2bSwgaW50IGNoYW5uZWwpCiB7CiAJc3RydWN0IGt2bV9rcGl0X2NoYW5uZWxfc3RhdGUgKmMgPQpAQCAtMTA3LDcgKzEzOCw3IEBACiAKIAlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmt2bS0+YXJjaC52cGl0LT5waXRfc3RhdGUubG9jaykpOwogCi0JdCA9IGt0aW1lX3RvX25zKGt0aW1lX3N1YihrdGltZV9nZXQoKSwgYy0+Y291bnRfbG9hZF90aW1lKSk7CisJdCA9IGtwaXRfZWxhcHNlZChrdm0sIGMsIGNoYW5uZWwpOwogCWQgPSBtdWxkaXY2NCh0LCBLVk1fUElUX0ZSRVEsIE5TRUNfUEVSX1NFQyk7CiAKIAlzd2l0Y2ggKGMtPm1vZGUpIHsKQEAgLTEzNyw3ICsxNjgsNyBAQAogCiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZrdm0tPmFyY2gudnBpdC0+cGl0X3N0YXRlLmxvY2spKTsKIAotCXQgPSBrdGltZV90b19ucyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksIGMtPmNvdW50X2xvYWRfdGltZSkpOworCXQgPSBrcGl0X2VsYXBzZWQoa3ZtLCBjLCBjaGFubmVsKTsKIAlkID0gbXVsZGl2NjQodCwgS1ZNX1BJVF9GUkVRLCBOU0VDX1BFUl9TRUMpOwogCiAJc3dpdGNoIChjLT5tb2RlKSB7CkBAIC0xOTMsMjggKzIyNCw2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9fcGl0X3RpbWVyX2ZuKHN0cnVjdCBrdm1fa3BpdF9zdGF0ZSAqcHMpCi17Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1MCA9IHBzLT5waXQtPmt2bS0+dmNwdXNbMF07Ci0Jc3RydWN0IGt2bV9rcGl0X3RpbWVyICpwdCA9ICZwcy0+cGl0X3RpbWVyOwotCi0JaWYgKCFhdG9taWNfaW5jX2FuZF90ZXN0KCZwdC0+cGVuZGluZykpCi0JCXNldF9iaXQoS1ZNX1JFUV9QRU5ESU5HX1RJTUVSLCAmdmNwdTAtPnJlcXVlc3RzKTsKLQotCWlmICghcHQtPnJlaW5qZWN0KQotCQlhdG9taWNfc2V0KCZwdC0+cGVuZGluZywgMSk7Ci0KLQlpZiAodmNwdTAgJiYgd2FpdHF1ZXVlX2FjdGl2ZSgmdmNwdTAtPndxKSkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y3B1MC0+d3EpOwotCi0JaHJ0aW1lcl9hZGRfZXhwaXJlc19ucygmcHQtPnRpbWVyLCBwdC0+cGVyaW9kKTsKLQlwdC0+c2NoZWR1bGVkID0gaHJ0aW1lcl9nZXRfZXhwaXJlc19ucygmcHQtPnRpbWVyKTsKLQlpZiAocHQtPnBlcmlvZCkKLQkJcHMtPmNoYW5uZWxzWzBdLmNvdW50X2xvYWRfdGltZSA9IGt0aW1lX2dldCgpOwotCi0JcmV0dXJuIChwdC0+cGVyaW9kID09IDAgPyAwIDogMSk7Ci19Ci0KIGludCBwaXRfaGFzX3BlbmRpbmdfdGltZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCBrdm1fcGl0ICpwaXQgPSB2Y3B1LT5rdm0tPmFyY2gudnBpdDsKQEAgLTIzNSwyMSArMjQ0LDYgQEAKIAlzcGluX3VubG9jaygmcHMtPmluamVjdF9sb2NrKTsKIH0KIAotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHBpdF90aW1lcl9mbihzdHJ1Y3QgaHJ0aW1lciAqZGF0YSkKLXsKLQlzdHJ1Y3Qga3ZtX2twaXRfc3RhdGUgKnBzOwotCWludCByZXN0YXJ0X3RpbWVyID0gMDsKLQotCXBzID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBrdm1fa3BpdF9zdGF0ZSwgcGl0X3RpbWVyLnRpbWVyKTsKLQotCXJlc3RhcnRfdGltZXIgPSBfX3BpdF90aW1lcl9mbihwcyk7Ci0KLQlpZiAocmVzdGFydF90aW1lcikKLQkJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKLQllbHNlCi0JCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKLX0KLQogdm9pZCBfX2t2bV9taWdyYXRlX3BpdF90aW1lcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9waXQgKnBpdCA9IHZjcHUtPmt2bS0+YXJjaC52cGl0OwpAQCAtMjYzLDE1ICsyNTcsMjYgQEAKIAkJaHJ0aW1lcl9zdGFydF9leHBpcmVzKHRpbWVyLCBIUlRJTUVSX01PREVfQUJTKTsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9waXRfdGltZXIoc3RydWN0IGt2bV9rcGl0X3RpbWVyICpwdCkKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfcGl0X3RpbWVyKHN0cnVjdCBrdm1fdGltZXIgKnB0KQogewogCXByX2RlYnVnKCJwaXQ6IGV4ZWN1dGUgZGVsIHRpbWVyIVxuIik7CiAJaHJ0aW1lcl9jYW5jZWwoJnB0LT50aW1lcik7CiB9CiAKK3N0YXRpYyBib29sIGtwaXRfaXNfcGVyaW9kaWMoc3RydWN0IGt2bV90aW1lciAqa3RpbWVyKQoreworCXN0cnVjdCBrdm1fa3BpdF9zdGF0ZSAqcHMgPSBjb250YWluZXJfb2Yoa3RpbWVyLCBzdHJ1Y3Qga3ZtX2twaXRfc3RhdGUsCisJCQkJCQkgcGl0X3RpbWVyKTsKKwlyZXR1cm4gcHMtPmlzX3BlcmlvZGljOworfQorCitzdGF0aWMgc3RydWN0IGt2bV90aW1lcl9vcHMga3BpdF9vcHMgPSB7CisJLmlzX3BlcmlvZGljID0ga3BpdF9pc19wZXJpb2RpYywKK307CisKIHN0YXRpYyB2b2lkIGNyZWF0ZV9waXRfdGltZXIoc3RydWN0IGt2bV9rcGl0X3N0YXRlICpwcywgdTMyIHZhbCwgaW50IGlzX3BlcmlvZCkKIHsKLQlzdHJ1Y3Qga3ZtX2twaXRfdGltZXIgKnB0ID0gJnBzLT5waXRfdGltZXI7CisJc3RydWN0IGt2bV90aW1lciAqcHQgPSAmcHMtPnBpdF90aW1lcjsKIAlzNjQgaW50ZXJ2YWw7CiAKIAlpbnRlcnZhbCA9IG11bGRpdjY0KHZhbCwgTlNFQ19QRVJfU0VDLCBLVk1fUElUX0ZSRVEpOwpAQCAtMjgwLDggKzI4NSwxNCBAQAogCiAJLyogVE9ETyBUaGUgbmV3IHZhbHVlIG9ubHkgYWZmZWN0ZWQgYWZ0ZXIgdGhlIHJldHJpZ2dlcmVkICovCiAJaHJ0aW1lcl9jYW5jZWwoJnB0LT50aW1lcik7Ci0JcHQtPnBlcmlvZCA9IChpc19wZXJpb2QgPT0gMCkgPyAwIDogaW50ZXJ2YWw7Ci0JcHQtPnRpbWVyLmZ1bmN0aW9uID0gcGl0X3RpbWVyX2ZuOworCXB0LT5wZXJpb2QgPSBpbnRlcnZhbDsKKwlwcy0+aXNfcGVyaW9kaWMgPSBpc19wZXJpb2Q7CisKKwlwdC0+dGltZXIuZnVuY3Rpb24gPSBrdm1fdGltZXJfZm47CisJcHQtPnRfb3BzID0gJmtwaXRfb3BzOworCXB0LT5rdm0gPSBwcy0+cGl0LT5rdm07CisJcHQtPnZjcHVfaWQgPSAwOworCiAJYXRvbWljX3NldCgmcHQtPnBlbmRpbmcsIDApOwogCXBzLT5pcnFfYWNrID0gMTsKIApAQCAtMjk4LDIzICszMDksMjMgQEAKIAlwcl9kZWJ1ZygicGl0OiBsb2FkX2NvdW50IHZhbCBpcyAlZCwgY2hhbm5lbCBpcyAlZFxuIiwgdmFsLCBjaGFubmVsKTsKIAogCS8qCi0JICogVGhvdWdoIHNwZWMgc2FpZCB0aGUgc3RhdGUgb2YgODI1NCBpcyB1bmRlZmluZWQgYWZ0ZXIgcG93ZXItdXAsCi0JICogc2VlbXMgc29tZSB0cmlja3kgT1MgbGlrZSBXaW5kb3dzIFhQIGRlcGVuZHMgb24gSVJRMCBpbnRlcnJ1cHQKLQkgKiB3aGVuIGJvb3RpbmcgdXAuCi0JICogU28gaGVyZSBzZXR0aW5nIGluaXRpYWxpemUgcmF0ZSBmb3IgaXQsIGFuZCBub3QgYSBzcGVjaWZpYyBudW1iZXIKKwkgKiBUaGUgbGFyZ2VzdCBwb3NzaWJsZSBpbml0aWFsIGNvdW50IGlzIDA7IHRoaXMgaXMgZXF1aXZhbGVudAorCSAqIHRvIDIxNiBmb3IgYmluYXJ5IGNvdW50aW5nIGFuZCAxMDQgZm9yIEJDRCBjb3VudGluZy4KIAkgKi8KIAlpZiAodmFsID09IDApCiAJCXZhbCA9IDB4MTAwMDA7CiAKLQlwcy0+Y2hhbm5lbHNbY2hhbm5lbF0uY291bnRfbG9hZF90aW1lID0ga3RpbWVfZ2V0KCk7CiAJcHMtPmNoYW5uZWxzW2NoYW5uZWxdLmNvdW50ID0gdmFsOwogCi0JaWYgKGNoYW5uZWwgIT0gMCkKKwlpZiAoY2hhbm5lbCAhPSAwKSB7CisJCXBzLT5jaGFubmVsc1tjaGFubmVsXS5jb3VudF9sb2FkX3RpbWUgPSBrdGltZV9nZXQoKTsKIAkJcmV0dXJuOworCX0KIAogCS8qIFR3byB0eXBlcyBvZiB0aW1lcgogCSAqIG1vZGUgMSBpcyBvbmUgc2hvdCwgbW9kZSAyIGlzIHBlcmlvZCwgb3RoZXJ3aXNlIGRlbCB0aW1lciAqLwogCXN3aXRjaCAocHMtPmNoYW5uZWxzWzBdLm1vZGUpIHsKKwljYXNlIDA6CiAJY2FzZSAxOgogICAgICAgICAvKiBGSVhNRTogZW5oYW5jZSBtb2RlIDQgcHJlY2lzaW9uICovCiAJY2FzZSA0OgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2k4MjU0LmggYi9hcmNoL3g4Ni9rdm0vaTgyNTQuaAppbmRleCA2YWNiZTRiLi5iYmQ4NjNmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaTgyNTQuaAorKysgYi9hcmNoL3g4Ni9rdm0vaTgyNTQuaApAQCAtMywxNSArMyw2IEBACiAKICNpbmNsdWRlICJpb2Rldi5oIgogCi1zdHJ1Y3Qga3ZtX2twaXRfdGltZXIgewotCXN0cnVjdCBocnRpbWVyIHRpbWVyOwotCWludCBpcnE7Ci0JczY0IHBlcmlvZDsgLyogdW5pdDogbnMgKi8KLQlzNjQgc2NoZWR1bGVkOwotCWF0b21pY190IHBlbmRpbmc7Ci0JYm9vbCByZWluamVjdDsKLX07Ci0KIHN0cnVjdCBrdm1fa3BpdF9jaGFubmVsX3N0YXRlIHsKIAl1MzIgY291bnQ7IC8qIGNhbiBiZSA2NTUzNiAqLwogCXUxNiBsYXRjaGVkX2NvdW50OwpAQCAtMzAsNyArMjEsOCBAQAogCiBzdHJ1Y3Qga3ZtX2twaXRfc3RhdGUgewogCXN0cnVjdCBrdm1fa3BpdF9jaGFubmVsX3N0YXRlIGNoYW5uZWxzWzNdOwotCXN0cnVjdCBrdm1fa3BpdF90aW1lciBwaXRfdGltZXI7CisJc3RydWN0IGt2bV90aW1lciBwaXRfdGltZXI7CisJYm9vbCBpc19wZXJpb2RpYzsKIAl1MzIgICAgc3BlYWtlcl9kYXRhX29uOwogCXN0cnVjdCBtdXRleCBsb2NrOwogCXN0cnVjdCBrdm1fcGl0ICpwaXQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaXJxLmMgYi9hcmNoL3g4Ni9rdm0vaXJxLmMKaW5kZXggY2YxN2VkNS4uOTZkZmJiNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2lycS5jCisrKyBiL2FyY2gveDg2L2t2bS9pcnEuYwpAQCAtMjQsNiArMjQsNyBAQAogCiAjaW5jbHVkZSAiaXJxLmgiCiAjaW5jbHVkZSAiaTgyNTQuaCIKKyNpbmNsdWRlICJ4ODYuaCIKIAogLyoKICAqIGNoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIHRpbWVyIGV2ZW50cwpAQCAtNDgsNiArNDksOSBAQAogewogCXN0cnVjdCBrdm1fcGljICpzOwogCisJaWYgKCFpcnFjaGlwX2luX2tlcm5lbCh2LT5rdm0pKQorCQlyZXR1cm4gdi0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZzsKKwogCWlmIChrdm1fYXBpY19oYXNfaW50ZXJydXB0KHYpID09IC0xKSB7CS8qIExBUElDICovCiAJCWlmIChrdm1fYXBpY19hY2NlcHRfcGljX2ludHIodikpIHsKIAkJCXMgPSBwaWNfaXJxY2hpcCh2LT5rdm0pOwkvKiBQSUMgKi8KQEAgLTY3LDYgKzcxLDkgQEAKIAlzdHJ1Y3Qga3ZtX3BpYyAqczsKIAlpbnQgdmVjdG9yOwogCisJaWYgKCFpcnFjaGlwX2luX2tlcm5lbCh2LT5rdm0pKQorCQlyZXR1cm4gdi0+YXJjaC5pbnRlcnJ1cHQubnI7CisKIAl2ZWN0b3IgPSBrdm1fZ2V0X2FwaWNfaW50ZXJydXB0KHYpOwkvKiBBUElDICovCiAJaWYgKHZlY3RvciA9PSAtMSkgewogCQlpZiAoa3ZtX2FwaWNfYWNjZXB0X3BpY19pbnRyKHYpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0va3ZtX3RpbWVyLmggYi9hcmNoL3g4Ni9rdm0va3ZtX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiZDZiYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2t2bS9rdm1fdGltZXIuaApAQCAtMCwwICsxLDE4IEBACisKK3N0cnVjdCBrdm1fdGltZXIgeworCXN0cnVjdCBocnRpbWVyIHRpbWVyOworCXM2NCBwZXJpb2Q7IAkJCQkvKiB1bml0OiBucyAqLworCWF0b21pY190IHBlbmRpbmc7CQkJLyogYWNjdW11bGF0ZWQgdHJpZ2dlcmVkIHRpbWVycyAqLworCWJvb2wgcmVpbmplY3Q7CisJc3RydWN0IGt2bV90aW1lcl9vcHMgKnRfb3BzOworCXN0cnVjdCBrdm0gKmt2bTsKKwlpbnQgdmNwdV9pZDsKK307CisKK3N0cnVjdCBrdm1fdGltZXJfb3BzIHsKKyAgICAgICAgYm9vbCAoKmlzX3BlcmlvZGljKShzdHJ1Y3Qga3ZtX3RpbWVyICopOworfTsKKworCitlbnVtIGhydGltZXJfcmVzdGFydCBrdm1fdGltZXJfZm4oc3RydWN0IGhydGltZXIgKmRhdGEpOworCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vbGFwaWMuYyBiL2FyY2gveDg2L2t2bS9sYXBpYy5jCmluZGV4IGYwYjY3ZjIuLmFlOTlkODMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9sYXBpYy5jCisrKyBiL2FyY2gveDg2L2t2bS9sYXBpYy5jCkBAIC0xOTYsMjAgKzE5NiwxNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2xhcGljX2ZpbmRfaGlnaGVzdF9pcnIpOwogCi1pbnQga3ZtX2FwaWNfc2V0X2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU4IHZlYywgdTggdHJpZykKK3N0YXRpYyBpbnQgX19hcGljX2FjY2VwdF9pcnEoc3RydWN0IGt2bV9sYXBpYyAqYXBpYywgaW50IGRlbGl2ZXJ5X21vZGUsCisJCQkgICAgIGludCB2ZWN0b3IsIGludCBsZXZlbCwgaW50IHRyaWdfbW9kZSk7CisKK2ludCBrdm1fYXBpY19zZXRfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9sYXBpY19pcnEgKmlycSkKIHsKIAlzdHJ1Y3Qga3ZtX2xhcGljICphcGljID0gdmNwdS0+YXJjaC5hcGljOwogCi0JaWYgKCFhcGljX3Rlc3RfYW5kX3NldF9pcnIodmVjLCBhcGljKSkgewotCQkvKiBhIG5ldyBwZW5kaW5nIGlycSBpcyBzZXQgaW4gSVJSICovCi0JCWlmICh0cmlnKQotCQkJYXBpY19zZXRfdmVjdG9yKHZlYywgYXBpYy0+cmVncyArIEFQSUNfVE1SKTsKLQkJZWxzZQotCQkJYXBpY19jbGVhcl92ZWN0b3IodmVjLCBhcGljLT5yZWdzICsgQVBJQ19UTVIpOwotCQlrdm1fdmNwdV9raWNrKGFwaWMtPnZjcHUpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIF9fYXBpY19hY2NlcHRfaXJxKGFwaWMsIGlycS0+ZGVsaXZlcnlfbW9kZSwgaXJxLT52ZWN0b3IsCisJCQlpcnEtPmxldmVsLCBpcnEtPnRyaWdfbW9kZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFwaWNfZmluZF9oaWdoZXN0X2lzcihzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQpAQCAtMjUwLDcgKzI0NSw3IEBACiAKIGludCBrdm1fYXBpY19tYXRjaF9waHlzaWNhbF9hZGRyKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMsIHUxNiBkZXN0KQogewotCXJldHVybiBrdm1fYXBpY19pZChhcGljKSA9PSBkZXN0OworCXJldHVybiBkZXN0ID09IDB4ZmYgfHwga3ZtX2FwaWNfaWQoYXBpYykgPT0gZGVzdDsKIH0KIAogaW50IGt2bV9hcGljX21hdGNoX2xvZ2ljYWxfYWRkcihzdHJ1Y3Qga3ZtX2xhcGljICphcGljLCB1OCBtZGEpCkBAIC0yNzksMzcgKzI3NCwzNCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgYXBpY19tYXRjaF9kZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9sYXBpYyAqc291cmNlLAoraW50IGt2bV9hcGljX21hdGNoX2Rlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2xhcGljICpzb3VyY2UsCiAJCQkgICBpbnQgc2hvcnRfaGFuZCwgaW50IGRlc3QsIGludCBkZXN0X21vZGUpCiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGt2bV9sYXBpYyAqdGFyZ2V0ID0gdmNwdS0+YXJjaC5hcGljOwogCiAJYXBpY19kZWJ1ZygidGFyZ2V0ICVwLCBzb3VyY2UgJXAsIGRlc3QgMHgleCwgIgotCQkgICAiZGVzdF9tb2RlIDB4JXgsIHNob3J0X2hhbmQgMHgleCIsCisJCSAgICJkZXN0X21vZGUgMHgleCwgc2hvcnRfaGFuZCAweCV4XG4iLAogCQkgICB0YXJnZXQsIHNvdXJjZSwgZGVzdCwgZGVzdF9tb2RlLCBzaG9ydF9oYW5kKTsKIAogCUFTU0VSVCghdGFyZ2V0KTsKIAlzd2l0Y2ggKHNob3J0X2hhbmQpIHsKIAljYXNlIEFQSUNfREVTVF9OT1NIT1JUOgotCQlpZiAoZGVzdF9tb2RlID09IDApIHsKKwkJaWYgKGRlc3RfbW9kZSA9PSAwKQogCQkJLyogUGh5c2ljYWwgbW9kZS4gKi8KLQkJCWlmICgoZGVzdCA9PSAweEZGKSB8fCAoZGVzdCA9PSBrdm1fYXBpY19pZCh0YXJnZXQpKSkKLQkJCQlyZXN1bHQgPSAxOwotCQl9IGVsc2UKKwkJCXJlc3VsdCA9IGt2bV9hcGljX21hdGNoX3BoeXNpY2FsX2FkZHIodGFyZ2V0LCBkZXN0KTsKKwkJZWxzZQogCQkJLyogTG9naWNhbCBtb2RlLiAqLwogCQkJcmVzdWx0ID0ga3ZtX2FwaWNfbWF0Y2hfbG9naWNhbF9hZGRyKHRhcmdldCwgZGVzdCk7CiAJCWJyZWFrOwogCWNhc2UgQVBJQ19ERVNUX1NFTEY6Ci0JCWlmICh0YXJnZXQgPT0gc291cmNlKQotCQkJcmVzdWx0ID0gMTsKKwkJcmVzdWx0ID0gKHRhcmdldCA9PSBzb3VyY2UpOwogCQlicmVhazsKIAljYXNlIEFQSUNfREVTVF9BTExJTkM6CiAJCXJlc3VsdCA9IDE7CiAJCWJyZWFrOwogCWNhc2UgQVBJQ19ERVNUX0FMTEJVVDoKLQkJaWYgKHRhcmdldCAhPSBzb3VyY2UpCi0JCQlyZXN1bHQgPSAxOworCQlyZXN1bHQgPSAodGFyZ2V0ICE9IHNvdXJjZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkJhZCBkZXN0IHNob3J0aGFuZCB2YWx1ZSAleFxuIiwKQEAgLTMyNywyMCArMzE5LDIyIEBACiBzdGF0aWMgaW50IF9fYXBpY19hY2NlcHRfaXJxKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMsIGludCBkZWxpdmVyeV9tb2RlLAogCQkJICAgICBpbnQgdmVjdG9yLCBpbnQgbGV2ZWwsIGludCB0cmlnX21vZGUpCiB7Ci0JaW50IG9yaWdfaXJyLCByZXN1bHQgPSAwOworCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSA9IGFwaWMtPnZjcHU7CiAKIAlzd2l0Y2ggKGRlbGl2ZXJ5X21vZGUpIHsKLQljYXNlIEFQSUNfRE1fRklYRUQ6CiAJY2FzZSBBUElDX0RNX0xPV0VTVDoKKwkJdmNwdS0+YXJjaC5hcGljX2FyYl9wcmlvKys7CisJY2FzZSBBUElDX0RNX0ZJWEVEOgogCQkvKiBGSVhNRSBhZGQgbG9naWMgZm9yIHZjcHUgb24gcmVzZXQgKi8KIAkJaWYgKHVubGlrZWx5KCFhcGljX2VuYWJsZWQoYXBpYykpKQogCQkJYnJlYWs7CiAKLQkJb3JpZ19pcnIgPSBhcGljX3Rlc3RfYW5kX3NldF9pcnIodmVjdG9yLCBhcGljKTsKLQkJaWYgKG9yaWdfaXJyICYmIHRyaWdfbW9kZSkgewotCQkJYXBpY19kZWJ1ZygibGV2ZWwgdHJpZyBtb2RlIHJlcGVhdGVkbHkgZm9yIHZlY3RvciAlZCIsCi0JCQkJICAgdmVjdG9yKTsKKwkJcmVzdWx0ID0gIWFwaWNfdGVzdF9hbmRfc2V0X2lycih2ZWN0b3IsIGFwaWMpOworCQlpZiAoIXJlc3VsdCkgeworCQkJaWYgKHRyaWdfbW9kZSkKKwkJCQlhcGljX2RlYnVnKCJsZXZlbCB0cmlnIG1vZGUgcmVwZWF0ZWRseSBmb3IgIgorCQkJCQkJInZlY3RvciAlZCIsIHZlY3Rvcik7CiAJCQlicmVhazsKIAkJfQogCkBAIC0zNDksMTAgKzM0Myw3IEBACiAJCQlhcGljX3NldF92ZWN0b3IodmVjdG9yLCBhcGljLT5yZWdzICsgQVBJQ19UTVIpOwogCQl9IGVsc2UKIAkJCWFwaWNfY2xlYXJfdmVjdG9yKHZlY3RvciwgYXBpYy0+cmVncyArIEFQSUNfVE1SKTsKLQogCQlrdm1fdmNwdV9raWNrKHZjcHUpOwotCi0JCXJlc3VsdCA9IChvcmlnX2lyciA9PSAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFQSUNfRE1fUkVNUkQ6CkBAIC0zNjQsMTIgKzM1NSwxNCBAQAogCQlicmVhazsKIAogCWNhc2UgQVBJQ19ETV9OTUk6CisJCXJlc3VsdCA9IDE7CiAJCWt2bV9pbmplY3Rfbm1pKHZjcHUpOwogCQlrdm1fdmNwdV9raWNrKHZjcHUpOwogCQlicmVhazsKIAogCWNhc2UgQVBJQ19ETV9JTklUOgogCQlpZiAobGV2ZWwpIHsKKwkJCXJlc3VsdCA9IDE7CiAJCQlpZiAodmNwdS0+YXJjaC5tcF9zdGF0ZSA9PSBLVk1fTVBfU1RBVEVfUlVOTkFCTEUpCiAJCQkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCQkgICAgICAgIklOSVQgb24gYSBydW5uYWJsZSB2Y3B1ICVkXG4iLApAQCAtMzg2LDYgKzM3OSw3IEBACiAJCWFwaWNfZGVidWcoIlNJUEkgdG8gdmNwdSAlZCB2ZWN0b3IgMHglMDJ4XG4iLAogCQkJICAgdmNwdS0+dmNwdV9pZCwgdmVjdG9yKTsKIAkJaWYgKHZjcHUtPmFyY2gubXBfc3RhdGUgPT0gS1ZNX01QX1NUQVRFX0lOSVRfUkVDRUlWRUQpIHsKKwkJCXJlc3VsdCA9IDE7CiAJCQl2Y3B1LT5hcmNoLnNpcGlfdmVjdG9yID0gdmVjdG9yOwogCQkJdmNwdS0+YXJjaC5tcF9zdGF0ZSA9IEtWTV9NUF9TVEFURV9TSVBJX1JFQ0VJVkVEOwogCQkJa3ZtX3ZjcHVfa2ljayh2Y3B1KTsKQEAgLTQwOCw0MyArNDAyLDkgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgc3RydWN0IGt2bV9sYXBpYyAqa3ZtX2FwaWNfcm91bmRfcm9iaW4oc3RydWN0IGt2bSAqa3ZtLCB1OCB2ZWN0b3IsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYml0bWFwKQoraW50IGt2bV9hcGljX2NvbXBhcmVfcHJpbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUxLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUyKQogewotCWludCBsYXN0OwotCWludCBuZXh0OwotCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSBOVUxMOwotCi0JbGFzdCA9IGt2bS0+YXJjaC5yb3VuZF9yb2Jpbl9wcmV2X3ZjcHU7Ci0JbmV4dCA9IGxhc3Q7Ci0KLQlkbyB7Ci0JCWlmICgrK25leHQgPT0gS1ZNX01BWF9WQ1BVUykKLQkJCW5leHQgPSAwOwotCQlpZiAoa3ZtLT52Y3B1c1tuZXh0XSA9PSBOVUxMIHx8ICF0ZXN0X2JpdChuZXh0LCAmYml0bWFwKSkKLQkJCWNvbnRpbnVlOwotCQlhcGljID0ga3ZtLT52Y3B1c1tuZXh0XS0+YXJjaC5hcGljOwotCQlpZiAoYXBpYyAmJiBhcGljX2VuYWJsZWQoYXBpYykpCi0JCQlicmVhazsKLQkJYXBpYyA9IE5VTEw7Ci0JfSB3aGlsZSAobmV4dCAhPSBsYXN0KTsKLQlrdm0tPmFyY2gucm91bmRfcm9iaW5fcHJldl92Y3B1ID0gbmV4dDsKLQotCWlmICghYXBpYykKLQkJcHJpbnRrKEtFUk5fREVCVUcgInZjcHUgbm90IHJlYWR5IGZvciBhcGljX3JvdW5kX3JvYmluXG4iKTsKLQotCXJldHVybiBhcGljOwotfQotCi1zdHJ1Y3Qga3ZtX3ZjcHUgKmt2bV9nZXRfbG93ZXN0X3ByaW9fdmNwdShzdHJ1Y3Qga3ZtICprdm0sIHU4IHZlY3RvciwKLQkJdW5zaWduZWQgbG9uZyBiaXRtYXApCi17Ci0Jc3RydWN0IGt2bV9sYXBpYyAqYXBpYzsKLQotCWFwaWMgPSBrdm1fYXBpY19yb3VuZF9yb2Jpbihrdm0sIHZlY3RvciwgYml0bWFwKTsKLQlpZiAoYXBpYykKLQkJcmV0dXJuIGFwaWMtPnZjcHU7Ci0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHZjcHUxLT5hcmNoLmFwaWNfYXJiX3ByaW8gLSB2Y3B1Mi0+YXJjaC5hcGljX2FyYl9wcmlvOwogfQogCiBzdGF0aWMgdm9pZCBhcGljX3NldF9lb2koc3RydWN0IGt2bV9sYXBpYyAqYXBpYykKQEAgLTQ3Miw0NyArNDMyLDI0IEBACiB7CiAJdTMyIGljcl9sb3cgPSBhcGljX2dldF9yZWcoYXBpYywgQVBJQ19JQ1IpOwogCXUzMiBpY3JfaGlnaCA9IGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0lDUjIpOworCXN0cnVjdCBrdm1fbGFwaWNfaXJxIGlycTsKIAotCXVuc2lnbmVkIGludCBkZXN0ID0gR0VUX0FQSUNfREVTVF9GSUVMRChpY3JfaGlnaCk7Ci0JdW5zaWduZWQgaW50IHNob3J0X2hhbmQgPSBpY3JfbG93ICYgQVBJQ19TSE9SVF9NQVNLOwotCXVuc2lnbmVkIGludCB0cmlnX21vZGUgPSBpY3JfbG93ICYgQVBJQ19JTlRfTEVWRUxUUklHOwotCXVuc2lnbmVkIGludCBsZXZlbCA9IGljcl9sb3cgJiBBUElDX0lOVF9BU1NFUlQ7Ci0JdW5zaWduZWQgaW50IGRlc3RfbW9kZSA9IGljcl9sb3cgJiBBUElDX0RFU1RfTUFTSzsKLQl1bnNpZ25lZCBpbnQgZGVsaXZlcnlfbW9kZSA9IGljcl9sb3cgJiBBUElDX01PREVfTUFTSzsKLQl1bnNpZ25lZCBpbnQgdmVjdG9yID0gaWNyX2xvdyAmIEFQSUNfVkVDVE9SX01BU0s7Ci0KLQlzdHJ1Y3Qga3ZtX3ZjcHUgKnRhcmdldDsKLQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7Ci0JdW5zaWduZWQgbG9uZyBscHJfbWFwID0gMDsKLQlpbnQgaTsKKwlpcnEudmVjdG9yID0gaWNyX2xvdyAmIEFQSUNfVkVDVE9SX01BU0s7CisJaXJxLmRlbGl2ZXJ5X21vZGUgPSBpY3JfbG93ICYgQVBJQ19NT0RFX01BU0s7CisJaXJxLmRlc3RfbW9kZSA9IGljcl9sb3cgJiBBUElDX0RFU1RfTUFTSzsKKwlpcnEubGV2ZWwgPSBpY3JfbG93ICYgQVBJQ19JTlRfQVNTRVJUOworCWlycS50cmlnX21vZGUgPSBpY3JfbG93ICYgQVBJQ19JTlRfTEVWRUxUUklHOworCWlycS5zaG9ydGhhbmQgPSBpY3JfbG93ICYgQVBJQ19TSE9SVF9NQVNLOworCWlycS5kZXN0X2lkID0gR0VUX0FQSUNfREVTVF9GSUVMRChpY3JfaGlnaCk7CiAKIAlhcGljX2RlYnVnKCJpY3JfaGlnaCAweCV4LCBpY3JfbG93IDB4JXgsICIKIAkJICAgInNob3J0X2hhbmQgMHgleCwgZGVzdCAweCV4LCB0cmlnX21vZGUgMHgleCwgbGV2ZWwgMHgleCwgIgogCQkgICAiZGVzdF9tb2RlIDB4JXgsIGRlbGl2ZXJ5X21vZGUgMHgleCwgdmVjdG9yIDB4JXhcbiIsCi0JCSAgIGljcl9oaWdoLCBpY3JfbG93LCBzaG9ydF9oYW5kLCBkZXN0LAotCQkgICB0cmlnX21vZGUsIGxldmVsLCBkZXN0X21vZGUsIGRlbGl2ZXJ5X21vZGUsIHZlY3Rvcik7CisJCSAgIGljcl9oaWdoLCBpY3JfbG93LCBpcnEuc2hvcnRoYW5kLCBpcnEuZGVzdF9pZCwKKwkJICAgaXJxLnRyaWdfbW9kZSwgaXJxLmxldmVsLCBpcnEuZGVzdF9tb2RlLCBpcnEuZGVsaXZlcnlfbW9kZSwKKwkJICAgaXJxLnZlY3Rvcik7CiAKLQlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgaSsrKSB7Ci0JCXZjcHUgPSBhcGljLT52Y3B1LT5rdm0tPnZjcHVzW2ldOwotCQlpZiAoIXZjcHUpCi0JCQljb250aW51ZTsKLQotCQlpZiAodmNwdS0+YXJjaC5hcGljICYmCi0JCSAgICBhcGljX21hdGNoX2Rlc3QodmNwdSwgYXBpYywgc2hvcnRfaGFuZCwgZGVzdCwgZGVzdF9tb2RlKSkgewotCQkJaWYgKGRlbGl2ZXJ5X21vZGUgPT0gQVBJQ19ETV9MT1dFU1QpCi0JCQkJc2V0X2JpdCh2Y3B1LT52Y3B1X2lkLCAmbHByX21hcCk7Ci0JCQllbHNlCi0JCQkJX19hcGljX2FjY2VwdF9pcnEodmNwdS0+YXJjaC5hcGljLCBkZWxpdmVyeV9tb2RlLAotCQkJCQkJICB2ZWN0b3IsIGxldmVsLCB0cmlnX21vZGUpOwotCQl9Ci0JfQotCi0JaWYgKGRlbGl2ZXJ5X21vZGUgPT0gQVBJQ19ETV9MT1dFU1QpIHsKLQkJdGFyZ2V0ID0ga3ZtX2dldF9sb3dlc3RfcHJpb192Y3B1KHZjcHUtPmt2bSwgdmVjdG9yLCBscHJfbWFwKTsKLQkJaWYgKHRhcmdldCAhPSBOVUxMKQotCQkJX19hcGljX2FjY2VwdF9pcnEodGFyZ2V0LT5hcmNoLmFwaWMsIGRlbGl2ZXJ5X21vZGUsCi0JCQkJCSAgdmVjdG9yLCBsZXZlbCwgdHJpZ19tb2RlKTsKLQl9CisJa3ZtX2lycV9kZWxpdmVyeV90b19hcGljKGFwaWMtPnZjcHUtPmt2bSwgYXBpYywgJmlycSk7CiB9CiAKIHN0YXRpYyB1MzIgYXBpY19nZXRfdG1jY3Qoc3RydWN0IGt2bV9sYXBpYyAqYXBpYykKQEAgLTUyNywxMiArNDY0LDEzIEBACiAJaWYgKGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1RNSUNUKSA9PSAwKQogCQlyZXR1cm4gMDsKIAotCXJlbWFpbmluZyA9IGhydGltZXJfZXhwaXJlc19yZW1haW5pbmcoJmFwaWMtPnRpbWVyLmRldik7CisJcmVtYWluaW5nID0gaHJ0aW1lcl9leHBpcmVzX3JlbWFpbmluZygmYXBpYy0+bGFwaWNfdGltZXIudGltZXIpOwogCWlmIChrdGltZV90b19ucyhyZW1haW5pbmcpIDwgMCkKIAkJcmVtYWluaW5nID0ga3RpbWVfc2V0KDAsIDApOwogCi0JbnMgPSBtb2RfNjQoa3RpbWVfdG9fbnMocmVtYWluaW5nKSwgYXBpYy0+dGltZXIucGVyaW9kKTsKLQl0bWNjdCA9IGRpdjY0X3U2NChucywgKEFQSUNfQlVTX0NZQ0xFX05TICogYXBpYy0+dGltZXIuZGl2aWRlX2NvdW50KSk7CisJbnMgPSBtb2RfNjQoa3RpbWVfdG9fbnMocmVtYWluaW5nKSwgYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kKTsKKwl0bWNjdCA9IGRpdjY0X3U2NChucywKKwkJCSAoQVBJQ19CVVNfQ1lDTEVfTlMgKiBhcGljLT5kaXZpZGVfY291bnQpKTsKIAogCXJldHVybiB0bWNjdDsKIH0KQEAgLTYxOSwyNSArNTU3LDI1IEBACiAJdGRjciA9IGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1REQ1IpOwogCXRtcDEgPSB0ZGNyICYgMHhmOwogCXRtcDIgPSAoKHRtcDEgJiAweDMpIHwgKCh0bXAxICYgMHg4KSA+PiAxKSkgKyAxOwotCWFwaWMtPnRpbWVyLmRpdmlkZV9jb3VudCA9IDB4MSA8PCAodG1wMiAmIDB4Nyk7CisJYXBpYy0+ZGl2aWRlX2NvdW50ID0gMHgxIDw8ICh0bXAyICYgMHg3KTsKIAogCWFwaWNfZGVidWcoInRpbWVyIGRpdmlkZSBjb3VudCBpcyAweCV4XG4iLAotCQkJCSAgIGFwaWMtPnRpbWVyLmRpdmlkZV9jb3VudCk7CisJCQkJICAgYXBpYy0+ZGl2aWRlX2NvdW50KTsKIH0KIAogc3RhdGljIHZvaWQgc3RhcnRfYXBpY190aW1lcihzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQogewotCWt0aW1lX3Qgbm93ID0gYXBpYy0+dGltZXIuZGV2LmJhc2UtPmdldF90aW1lKCk7CisJa3RpbWVfdCBub3cgPSBhcGljLT5sYXBpY190aW1lci50aW1lci5iYXNlLT5nZXRfdGltZSgpOwogCi0JYXBpYy0+dGltZXIucGVyaW9kID0gYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfVE1JQ1QpICoKLQkJICAgIEFQSUNfQlVTX0NZQ0xFX05TICogYXBpYy0+dGltZXIuZGl2aWRlX2NvdW50OwotCWF0b21pY19zZXQoJmFwaWMtPnRpbWVyLnBlbmRpbmcsIDApOworCWFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCA9IGFwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1RNSUNUKSAqCisJCSAgICBBUElDX0JVU19DWUNMRV9OUyAqIGFwaWMtPmRpdmlkZV9jb3VudDsKKwlhdG9taWNfc2V0KCZhcGljLT5sYXBpY190aW1lci5wZW5kaW5nLCAwKTsKIAotCWlmICghYXBpYy0+dGltZXIucGVyaW9kKQorCWlmICghYXBpYy0+bGFwaWNfdGltZXIucGVyaW9kKQogCQlyZXR1cm47CiAKLQlocnRpbWVyX3N0YXJ0KCZhcGljLT50aW1lci5kZXYsCi0JCSAgICAgIGt0aW1lX2FkZF9ucyhub3csIGFwaWMtPnRpbWVyLnBlcmlvZCksCisJaHJ0aW1lcl9zdGFydCgmYXBpYy0+bGFwaWNfdGltZXIudGltZXIsCisJCSAgICAgIGt0aW1lX2FkZF9ucyhub3csIGFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCksCiAJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwogCiAJYXBpY19kZWJ1ZygiJXM6IGJ1cyBjeWNsZSBpcyAlIiBQUklkNjQgIm5zLCBub3cgMHglMDE2IgpAQCAtNjQ2LDkgKzU4NCw5IEBACiAJCQkgICAiZXhwaXJlIEAgMHglMDE2IiBQUkl4NjQgIi5cbiIsIF9fZnVuY19fLAogCQkJICAgQVBJQ19CVVNfQ1lDTEVfTlMsIGt0aW1lX3RvX25zKG5vdyksCiAJCQkgICBhcGljX2dldF9yZWcoYXBpYywgQVBJQ19UTUlDVCksCi0JCQkgICBhcGljLT50aW1lci5wZXJpb2QsCisJCQkgICBhcGljLT5sYXBpY190aW1lci5wZXJpb2QsCiAJCQkgICBrdGltZV90b19ucyhrdGltZV9hZGRfbnMobm93LAotCQkJCQlhcGljLT50aW1lci5wZXJpb2QpKSk7CisJCQkJCWFwaWMtPmxhcGljX3RpbWVyLnBlcmlvZCkpKTsKIH0KIAogc3RhdGljIHZvaWQgYXBpY19tYW5hZ2Vfbm1pX3dhdGNoZG9nKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMsIHUzMiBsdnQwX3ZhbCkKQEAgLTczMCw3ICs2NjgsNyBAQAogCQkJCWFwaWNfc2V0X3JlZyhhcGljLCBBUElDX0xWVFQgKyAweDEwICogaSwKIAkJCQkJICAgICBsdnRfdmFsIHwgQVBJQ19MVlRfTUFTS0VEKTsKIAkJCX0KLQkJCWF0b21pY19zZXQoJmFwaWMtPnRpbWVyLnBlbmRpbmcsIDApOworCQkJYXRvbWljX3NldCgmYXBpYy0+bGFwaWNfdGltZXIucGVuZGluZywgMCk7CiAKIAkJfQogCQlicmVhazsKQEAgLTc2Miw3ICs3MDAsNyBAQAogCQlicmVhazsKIAogCWNhc2UgQVBJQ19UTUlDVDoKLQkJaHJ0aW1lcl9jYW5jZWwoJmFwaWMtPnRpbWVyLmRldik7CisJCWhydGltZXJfY2FuY2VsKCZhcGljLT5sYXBpY190aW1lci50aW1lcik7CiAJCWFwaWNfc2V0X3JlZyhhcGljLCBBUElDX1RNSUNULCB2YWwpOwogCQlzdGFydF9hcGljX3RpbWVyKGFwaWMpOwogCQlyZXR1cm47CkBAIC04MDIsNyArNzQwLDcgQEAKIAlpZiAoIXZjcHUtPmFyY2guYXBpYykKIAkJcmV0dXJuOwogCi0JaHJ0aW1lcl9jYW5jZWwoJnZjcHUtPmFyY2guYXBpYy0+dGltZXIuZGV2KTsKKwlocnRpbWVyX2NhbmNlbCgmdmNwdS0+YXJjaC5hcGljLT5sYXBpY190aW1lci50aW1lcik7CiAKIAlpZiAodmNwdS0+YXJjaC5hcGljLT5yZWdzX3BhZ2UpCiAJCV9fZnJlZV9wYWdlKHZjcHUtPmFyY2guYXBpYy0+cmVnc19wYWdlKTsKQEAgLTg4MCw3ICs4MTgsNyBAQAogCUFTU0VSVChhcGljICE9IE5VTEwpOwogCiAJLyogU3RvcCB0aGUgdGltZXIgaW4gY2FzZSBpdCdzIGEgcmVzZXQgdG8gYW4gYWN0aXZlIGFwaWMgKi8KLQlocnRpbWVyX2NhbmNlbCgmYXBpYy0+dGltZXIuZGV2KTsKKwlocnRpbWVyX2NhbmNlbCgmYXBpYy0+bGFwaWNfdGltZXIudGltZXIpOwogCiAJYXBpY19zZXRfcmVnKGFwaWMsIEFQSUNfSUQsIHZjcHUtPnZjcHVfaWQgPDwgMjQpOwogCWFwaWNfc2V0X3JlZyhhcGljLCBBUElDX0xWUiwgQVBJQ19WRVJTSU9OKTsKQEAgLTkwNSwxMSArODQzLDEzIEBACiAJCWFwaWNfc2V0X3JlZyhhcGljLCBBUElDX1RNUiArIDB4MTAgKiBpLCAwKTsKIAl9CiAJdXBkYXRlX2RpdmlkZV9jb3VudChhcGljKTsKLQlhdG9taWNfc2V0KCZhcGljLT50aW1lci5wZW5kaW5nLCAwKTsKKwlhdG9taWNfc2V0KCZhcGljLT5sYXBpY190aW1lci5wZW5kaW5nLCAwKTsKIAlpZiAodmNwdS0+dmNwdV9pZCA9PSAwKQogCQl2Y3B1LT5hcmNoLmFwaWNfYmFzZSB8PSBNU1JfSUEzMl9BUElDQkFTRV9CU1A7CiAJYXBpY191cGRhdGVfcHByKGFwaWMpOwogCisJdmNwdS0+YXJjaC5hcGljX2FyYl9wcmlvID0gMDsKKwogCWFwaWNfZGVidWcoS0VSTl9JTkZPICIlczogdmNwdT0lcCwgaWQ9JWQsIGJhc2VfbXNyPSIKIAkJICAgIjB4JTAxNiIgUFJJeDY0ICIsIGJhc2VfYWRkcmVzcz0weCUwbHguXG4iLCBfX2Z1bmNfXywKIAkJICAgdmNwdSwga3ZtX2FwaWNfaWQoYXBpYyksCkBAIC05MTcsMTYgKzg1NywxNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2xhcGljX3Jlc2V0KTsKIAorYm9vbCBrdm1fYXBpY19wcmVzZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+YXJjaC5hcGljICYmIGFwaWNfaHdfZW5hYmxlZCh2Y3B1LT5hcmNoLmFwaWMpOworfQorCiBpbnQga3ZtX2xhcGljX2VuYWJsZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSB2Y3B1LT5hcmNoLmFwaWM7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoIWFwaWMpCi0JCXJldHVybiAwOwotCXJldCA9IGFwaWNfZW5hYmxlZChhcGljKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGt2bV9hcGljX3ByZXNlbnQodmNwdSkgJiYgYXBpY19zd19lbmFibGVkKHZjcHUtPmFyY2guYXBpYyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fbGFwaWNfZW5hYmxlZCk7CiAKQEAgLTkzNiwyMiArODc0LDExIEBACiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogCi0vKiBUT0RPOiBtYWtlIHN1cmUgX19hcGljX3RpbWVyX2ZuIHJ1bnMgaW4gY3VycmVudCBwQ1BVICovCi1zdGF0aWMgaW50IF9fYXBpY190aW1lcl9mbihzdHJ1Y3Qga3ZtX2xhcGljICphcGljKQorc3RhdGljIGJvb2wgbGFwaWNfaXNfcGVyaW9kaWMoc3RydWN0IGt2bV90aW1lciAqa3RpbWVyKQogewotCWludCByZXN1bHQgPSAwOwotCXdhaXRfcXVldWVfaGVhZF90ICpxID0gJmFwaWMtPnZjcHUtPndxOwotCi0JaWYoIWF0b21pY19pbmNfYW5kX3Rlc3QoJmFwaWMtPnRpbWVyLnBlbmRpbmcpKQotCQlzZXRfYml0KEtWTV9SRVFfUEVORElOR19USU1FUiwgJmFwaWMtPnZjcHUtPnJlcXVlc3RzKTsKLQlpZiAod2FpdHF1ZXVlX2FjdGl2ZShxKSkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKHEpOwotCi0JaWYgKGFwaWNfbHZ0dF9wZXJpb2QoYXBpYykpIHsKLQkJcmVzdWx0ID0gMTsKLQkJaHJ0aW1lcl9hZGRfZXhwaXJlc19ucygmYXBpYy0+dGltZXIuZGV2LCBhcGljLT50aW1lci5wZXJpb2QpOwotCX0KLQlyZXR1cm4gcmVzdWx0OworCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSBjb250YWluZXJfb2Yoa3RpbWVyLCBzdHJ1Y3Qga3ZtX2xhcGljLAorCQkJCQkgICAgICBsYXBpY190aW1lcik7CisJcmV0dXJuIGFwaWNfbHZ0dF9wZXJpb2QoYXBpYyk7CiB9CiAKIGludCBhcGljX2hhc19wZW5kaW5nX3RpbWVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTk1OSw3ICs4ODYsNyBAQAogCXN0cnVjdCBrdm1fbGFwaWMgKmxhcGljID0gdmNwdS0+YXJjaC5hcGljOwogCiAJaWYgKGxhcGljICYmIGFwaWNfZW5hYmxlZChsYXBpYykgJiYgYXBpY19sdnRfZW5hYmxlZChsYXBpYywgQVBJQ19MVlRUKSkKLQkJcmV0dXJuIGF0b21pY19yZWFkKCZsYXBpYy0+dGltZXIucGVuZGluZyk7CisJCXJldHVybiBhdG9taWNfcmVhZCgmbGFwaWMtPmxhcGljX3RpbWVyLnBlbmRpbmcpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05ODYsMjAgKzkxMyw5IEBACiAJCWt2bV9hcGljX2xvY2FsX2RlbGl2ZXIoYXBpYywgQVBJQ19MVlQwKTsKIH0KIAotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGFwaWNfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKmRhdGEpCi17Ci0Jc3RydWN0IGt2bV9sYXBpYyAqYXBpYzsKLQlpbnQgcmVzdGFydF90aW1lciA9IDA7Ci0KLQlhcGljID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBrdm1fbGFwaWMsIHRpbWVyLmRldik7Ci0KLQlyZXN0YXJ0X3RpbWVyID0gX19hcGljX3RpbWVyX2ZuKGFwaWMpOwotCi0JaWYgKHJlc3RhcnRfdGltZXIpCi0JCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7Ci0JZWxzZQotCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Ci19CitzdGF0aWMgc3RydWN0IGt2bV90aW1lcl9vcHMgbGFwaWNfdGltZXJfb3BzID0geworCS5pc19wZXJpb2RpYyA9IGxhcGljX2lzX3BlcmlvZGljLAorfTsKIAogaW50IGt2bV9jcmVhdGVfbGFwaWMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtMTAyNCw4ICs5NDAsMTMgQEAKIAltZW1zZXQoYXBpYy0+cmVncywgMCwgUEFHRV9TSVpFKTsKIAlhcGljLT52Y3B1ID0gdmNwdTsKIAotCWhydGltZXJfaW5pdCgmYXBpYy0+dGltZXIuZGV2LCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9BQlMpOwotCWFwaWMtPnRpbWVyLmRldi5mdW5jdGlvbiA9IGFwaWNfdGltZXJfZm47CisJaHJ0aW1lcl9pbml0KCZhcGljLT5sYXBpY190aW1lci50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLAorCQkgICAgIEhSVElNRVJfTU9ERV9BQlMpOworCWFwaWMtPmxhcGljX3RpbWVyLnRpbWVyLmZ1bmN0aW9uID0ga3ZtX3RpbWVyX2ZuOworCWFwaWMtPmxhcGljX3RpbWVyLnRfb3BzID0gJmxhcGljX3RpbWVyX29wczsKKwlhcGljLT5sYXBpY190aW1lci5rdm0gPSB2Y3B1LT5rdm07CisJYXBpYy0+bGFwaWNfdGltZXIudmNwdV9pZCA9IHZjcHUtPnZjcHVfaWQ7CisKIAlhcGljLT5iYXNlX2FkZHJlc3MgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwogCXZjcHUtPmFyY2guYXBpY19iYXNlID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKIApAQCAtMTA3OCw5ICs5OTksOSBAQAogewogCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSB2Y3B1LT5hcmNoLmFwaWM7CiAKLQlpZiAoYXBpYyAmJiBhdG9taWNfcmVhZCgmYXBpYy0+dGltZXIucGVuZGluZykgPiAwKSB7CisJaWYgKGFwaWMgJiYgYXRvbWljX3JlYWQoJmFwaWMtPmxhcGljX3RpbWVyLnBlbmRpbmcpID4gMCkgewogCQlpZiAoa3ZtX2FwaWNfbG9jYWxfZGVsaXZlcihhcGljLCBBUElDX0xWVFQpKQotCQkJYXRvbWljX2RlYygmYXBpYy0+dGltZXIucGVuZGluZyk7CisJCQlhdG9taWNfZGVjKCZhcGljLT5sYXBpY190aW1lci5wZW5kaW5nKTsKIAl9CiB9CiAKQEAgLTExMDYsNyArMTAyNyw3IEBACiAJCQkgICAgIE1TUl9JQTMyX0FQSUNCQVNFX0JBU0U7CiAJYXBpY19zZXRfcmVnKGFwaWMsIEFQSUNfTFZSLCBBUElDX1ZFUlNJT04pOwogCWFwaWNfdXBkYXRlX3BwcihhcGljKTsKLQlocnRpbWVyX2NhbmNlbCgmYXBpYy0+dGltZXIuZGV2KTsKKwlocnRpbWVyX2NhbmNlbCgmYXBpYy0+bGFwaWNfdGltZXIudGltZXIpOwogCXVwZGF0ZV9kaXZpZGVfY291bnQoYXBpYyk7CiAJc3RhcnRfYXBpY190aW1lcihhcGljKTsKIH0KQEAgLTExMTksNyArMTA0MCw3IEBACiAJaWYgKCFhcGljKQogCQlyZXR1cm47CiAKLQl0aW1lciA9ICZhcGljLT50aW1lci5kZXY7CisJdGltZXIgPSAmYXBpYy0+bGFwaWNfdGltZXIudGltZXI7CiAJaWYgKGhydGltZXJfY2FuY2VsKHRpbWVyKSkKIAkJaHJ0aW1lcl9zdGFydF9leHBpcmVzKHRpbWVyLCBIUlRJTUVSX01PREVfQUJTKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9sYXBpYy5oIGIvYXJjaC94ODYva3ZtL2xhcGljLmgKaW5kZXggNDVhYjZlZS4uYTU4N2Y4MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2xhcGljLmgKKysrIGIvYXJjaC94ODYva3ZtL2xhcGljLmgKQEAgLTIsMTggKzIsMTUgQEAKICNkZWZpbmUgX19LVk1fWDg2X0xBUElDX0gKIAogI2luY2x1ZGUgImlvZGV2LmgiCisjaW5jbHVkZSAia3ZtX3RpbWVyLmgiCiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogCiBzdHJ1Y3Qga3ZtX2xhcGljIHsKIAl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcmVzczsKIAlzdHJ1Y3Qga3ZtX2lvX2RldmljZSBkZXY7Ci0Jc3RydWN0IHsKLQkJYXRvbWljX3QgcGVuZGluZzsKLQkJczY0IHBlcmlvZDsJLyogdW5pdDogbnMgKi8KLQkJdTMyIGRpdmlkZV9jb3VudDsKLQkJc3RydWN0IGhydGltZXIgZGV2OwotCX0gdGltZXI7CisJc3RydWN0IGt2bV90aW1lciBsYXBpY190aW1lcjsKKwl1MzIgZGl2aWRlX2NvdW50OwogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKIAlzdHJ1Y3QgcGFnZSAqcmVnc19wYWdlOwogCXZvaWQgKnJlZ3M7CkBAIC0zNCwxMiArMzEsMTMgQEAKIAogaW50IGt2bV9hcGljX21hdGNoX3BoeXNpY2FsX2FkZHIoc3RydWN0IGt2bV9sYXBpYyAqYXBpYywgdTE2IGRlc3QpOwogaW50IGt2bV9hcGljX21hdGNoX2xvZ2ljYWxfYWRkcihzdHJ1Y3Qga3ZtX2xhcGljICphcGljLCB1OCBtZGEpOwotaW50IGt2bV9hcGljX3NldF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1OCB2ZWMsIHU4IHRyaWcpOworaW50IGt2bV9hcGljX3NldF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2xhcGljX2lycSAqaXJxKTsKIAogdTY0IGt2bV9nZXRfYXBpY19iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9zZXRfYXBpY19iYXNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGRhdGEpOwogdm9pZCBrdm1fYXBpY19wb3N0X3N0YXRlX3Jlc3RvcmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fbGFwaWNfZW5hYmxlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworYm9vbCBrdm1fYXBpY19wcmVzZW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiBpbnQga3ZtX2xhcGljX2ZpbmRfaGlnaGVzdF9pcnIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogdm9pZCBrdm1fbGFwaWNfc2V0X3ZhcGljX2FkZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBncGFfdCB2YXBpY19hZGRyKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9tbXUuYyBiL2FyY2gveDg2L2t2bS9tbXUuYwppbmRleCAzMmNmMTFlLi41YzNkNmU4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbW11LmMKKysrIGIvYXJjaC94ODYva3ZtL21tdS5jCkBAIC0xMjYsNiArMTI2LDcgQEAKICNkZWZpbmUgUEZFUlJfUFJFU0VOVF9NQVNLICgxVSA8PCAwKQogI2RlZmluZSBQRkVSUl9XUklURV9NQVNLICgxVSA8PCAxKQogI2RlZmluZSBQRkVSUl9VU0VSX01BU0sgKDFVIDw8IDIpCisjZGVmaW5lIFBGRVJSX1JTVkRfTUFTSyAoMVUgPDwgMykKICNkZWZpbmUgUEZFUlJfRkVUQ0hfTUFTSyAoMVUgPDwgNCkKIAogI2RlZmluZSBQVF9ESVJFQ1RPUllfTEVWRUwgMgpAQCAtMTc3LDcgKzE3OCwxMSBAQAogc3RhdGljIHU2NCBfX3JlYWRfbW9zdGx5IHNoYWRvd191c2VyX21hc2s7CiBzdGF0aWMgdTY0IF9fcmVhZF9tb3N0bHkgc2hhZG93X2FjY2Vzc2VkX21hc2s7CiBzdGF0aWMgdTY0IF9fcmVhZF9tb3N0bHkgc2hhZG93X2RpcnR5X21hc2s7Ci1zdGF0aWMgdTY0IF9fcmVhZF9tb3N0bHkgc2hhZG93X210X21hc2s7CisKK3N0YXRpYyBpbmxpbmUgdTY0IHJzdmRfYml0cyhpbnQgcywgaW50IGUpCit7CisJcmV0dXJuICgoMVVMTCA8PCAoZSAtIHMgKyAxKSkgLSAxKSA8PCBzOworfQogCiB2b2lkIGt2bV9tbXVfc2V0X25vbnByZXNlbnRfcHRlcyh1NjQgdHJhcF9wdGUsIHU2NCBub3RyYXBfcHRlKQogewpAQCAtMTkzLDE0ICsxOTgsMTMgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9tbXVfc2V0X2Jhc2VfcHRlcyk7CiAKIHZvaWQga3ZtX21tdV9zZXRfbWFza19wdGVzKHU2NCB1c2VyX21hc2ssIHU2NCBhY2Nlc3NlZF9tYXNrLAotCQl1NjQgZGlydHlfbWFzaywgdTY0IG54X21hc2ssIHU2NCB4X21hc2ssIHU2NCBtdF9tYXNrKQorCQl1NjQgZGlydHlfbWFzaywgdTY0IG54X21hc2ssIHU2NCB4X21hc2spCiB7CiAJc2hhZG93X3VzZXJfbWFzayA9IHVzZXJfbWFzazsKIAlzaGFkb3dfYWNjZXNzZWRfbWFzayA9IGFjY2Vzc2VkX21hc2s7CiAJc2hhZG93X2RpcnR5X21hc2sgPSBkaXJ0eV9tYXNrOwogCXNoYWRvd19ueF9tYXNrID0gbnhfbWFzazsKIAlzaGFkb3dfeF9tYXNrID0geF9tYXNrOwotCXNoYWRvd19tdF9tYXNrID0gbXRfbWFzazsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9tbXVfc2V0X21hc2tfcHRlcyk7CiAKQEAgLTIxOSwxMSArMjIzLDYgQEAKIAlyZXR1cm4gdmNwdS0+YXJjaC5zaGFkb3dfZWZlciAmIEVGRVJfTlg7CiB9CiAKLXN0YXRpYyBpbnQgaXNfcHJlc2VudF9wdGUodW5zaWduZWQgbG9uZyBwdGUpCi17Ci0JcmV0dXJuIHB0ZSAmIFBUX1BSRVNFTlRfTUFTSzsKLX0KLQogc3RhdGljIGludCBpc19zaGFkb3dfcHJlc2VudF9wdGUodTY0IHB0ZSkKIHsKIAlyZXR1cm4gcHRlICE9IHNoYWRvd190cmFwX25vbnByZXNlbnRfcHRlCkBAIC0xMDc0LDE4ICsxMDczLDEwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGt2bV91bmxpbmtfdW5zeW5jX2dsb2JhbChzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQotewotCWxpc3RfZGVsKCZzcC0+b29zX2xpbmspOwotCS0ta3ZtLT5zdGF0Lm1tdV91bnN5bmNfZ2xvYmFsOwotfQotCiBzdGF0aWMgdm9pZCBrdm1fdW5saW5rX3Vuc3luY19wYWdlKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9tbXVfcGFnZSAqc3ApCiB7CiAJV0FSTl9PTighc3AtPnVuc3luYyk7CiAJc3AtPnVuc3luYyA9IDA7Ci0JaWYgKHNwLT5nbG9iYWwpCi0JCWt2bV91bmxpbmtfdW5zeW5jX2dsb2JhbChrdm0sIHNwKTsKIAktLWt2bS0+c3RhdC5tbXVfdW5zeW5jOwogfQogCkBAIC0xMjQ4LDcgKzEyMzksNiBAQAogCXBncHJpbnRrKCIlczogYWRkaW5nIGdmbiAlbHggcm9sZSAleFxuIiwgX19mdW5jX18sIGdmbiwgcm9sZS53b3JkKTsKIAlzcC0+Z2ZuID0gZ2ZuOwogCXNwLT5yb2xlID0gcm9sZTsKLQlzcC0+Z2xvYmFsID0gMDsKIAlobGlzdF9hZGRfaGVhZCgmc3AtPmhhc2hfbGluaywgYnVja2V0KTsKIAlpZiAoIWRpcmVjdCkgewogCQlpZiAocm1hcF93cml0ZV9wcm90ZWN0KHZjcHUtPmt2bSwgZ2ZuKSkKQEAgLTE2MTYsNyArMTYwNiw3IEBACiAJcmV0dXJuIG10cnJfc3RhdGUtPmRlZl90eXBlOwogfQogCi1zdGF0aWMgdTggZ2V0X21lbW9yeV90eXBlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgZ2ZuKQordTgga3ZtX2dldF9ndWVzdF9tZW1vcnlfdHlwZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdmbl90IGdmbikKIHsKIAl1OCBtdHJyOwogCkBAIC0xNjI2LDYgKzE2MTYsNyBAQAogCQltdHJyID0gTVRSUl9UWVBFX1dSQkFDSzsKIAlyZXR1cm4gbXRycjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV9nZXRfZ3Vlc3RfbWVtb3J5X3R5cGUpOwogCiBzdGF0aWMgaW50IGt2bV91bnN5bmNfcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwKQogewpAQCAtMTY0NiwxMSArMTYzNyw3IEBACiAJKyt2Y3B1LT5rdm0tPnN0YXQubW11X3Vuc3luYzsKIAlzcC0+dW5zeW5jID0gMTsKIAotCWlmIChzcC0+Z2xvYmFsKSB7Ci0JCWxpc3RfYWRkKCZzcC0+b29zX2xpbmssICZ2Y3B1LT5rdm0tPmFyY2gub29zX2dsb2JhbF9wYWdlcyk7Ci0JCSsrdmNwdS0+a3ZtLT5zdGF0Lm1tdV91bnN5bmNfZ2xvYmFsOwotCX0gZWxzZQotCQlrdm1fbW11X21hcmtfcGFyZW50c191bnN5bmModmNwdSwgc3ApOworCWt2bV9tbXVfbWFya19wYXJlbnRzX3Vuc3luYyh2Y3B1LCBzcCk7CiAKIAltbXVfY29udmVydF9ub3RyYXAoc3ApOwogCXJldHVybiAwOwpAQCAtMTY3NywyMSArMTY2NCwxMSBAQAogc3RhdGljIGludCBzZXRfc3B0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCAqc2hhZG93X3B0ZSwKIAkJICAgIHVuc2lnbmVkIHB0ZV9hY2Nlc3MsIGludCB1c2VyX2ZhdWx0LAogCQkgICAgaW50IHdyaXRlX2ZhdWx0LCBpbnQgZGlydHksIGludCBsYXJnZXBhZ2UsCi0JCSAgICBpbnQgZ2xvYmFsLCBnZm5fdCBnZm4sIHBmbl90IHBmbiwgYm9vbCBzcGVjdWxhdGl2ZSwKKwkJICAgIGdmbl90IGdmbiwgcGZuX3QgcGZuLCBib29sIHNwZWN1bGF0aXZlLAogCQkgICAgYm9vbCBjYW5fdW5zeW5jKQogewogCXU2NCBzcHRlOwogCWludCByZXQgPSAwOwotCXU2NCBtdF9tYXNrID0gc2hhZG93X210X21hc2s7Ci0Jc3RydWN0IGt2bV9tbXVfcGFnZSAqc3AgPSBwYWdlX2hlYWRlcihfX3BhKHNoYWRvd19wdGUpKTsKLQotCWlmICghZ2xvYmFsICYmIHNwLT5nbG9iYWwpIHsKLQkJc3AtPmdsb2JhbCA9IDA7Ci0JCWlmIChzcC0+dW5zeW5jKSB7Ci0JCQlrdm1fdW5saW5rX3Vuc3luY19nbG9iYWwodmNwdS0+a3ZtLCBzcCk7Ci0JCQlrdm1fbW11X21hcmtfcGFyZW50c191bnN5bmModmNwdSwgc3ApOwotCQl9Ci0JfQogCiAJLyoKIAkgKiBXZSBkb24ndCBzZXQgdGhlIGFjY2Vzc2VkIGJpdCwgc2luY2Ugd2Ugc29tZXRpbWVzIHdhbnQgdG8gc2VlCkBAIC0xNzExLDE2ICsxNjg4LDkgQEAKIAkJc3B0ZSB8PSBzaGFkb3dfdXNlcl9tYXNrOwogCWlmIChsYXJnZXBhZ2UpCiAJCXNwdGUgfD0gUFRfUEFHRV9TSVpFX01BU0s7Ci0JaWYgKG10X21hc2spIHsKLQkJaWYgKCFrdm1faXNfbW1pb19wZm4ocGZuKSkgewotCQkJbXRfbWFzayA9IGdldF9tZW1vcnlfdHlwZSh2Y3B1LCBnZm4pIDw8Ci0JCQkJa3ZtX3g4Nl9vcHMtPmdldF9tdF9tYXNrX3NoaWZ0KCk7Ci0JCQltdF9tYXNrIHw9IFZNWF9FUFRfSUdNVF9CSVQ7Ci0JCX0gZWxzZQotCQkJbXRfbWFzayA9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFIDw8Ci0JCQkJa3ZtX3g4Nl9vcHMtPmdldF9tdF9tYXNrX3NoaWZ0KCk7Ci0JCXNwdGUgfD0gbXRfbWFzazsKLQl9CisJaWYgKHRkcF9lbmFibGVkKQorCQlzcHRlIHw9IGt2bV94ODZfb3BzLT5nZXRfbXRfbWFzayh2Y3B1LCBnZm4sCisJCQlrdm1faXNfbW1pb19wZm4ocGZuKSk7CiAKIAlzcHRlIHw9ICh1NjQpcGZuIDw8IFBBR0VfU0hJRlQ7CiAKQEAgLTE3NjUsOCArMTczNSw4IEBACiBzdGF0aWMgdm9pZCBtbXVfc2V0X3NwdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgKnNoYWRvd19wdGUsCiAJCQkgdW5zaWduZWQgcHRfYWNjZXNzLCB1bnNpZ25lZCBwdGVfYWNjZXNzLAogCQkJIGludCB1c2VyX2ZhdWx0LCBpbnQgd3JpdGVfZmF1bHQsIGludCBkaXJ0eSwKLQkJCSBpbnQgKnB0d3JpdGUsIGludCBsYXJnZXBhZ2UsIGludCBnbG9iYWwsCi0JCQkgZ2ZuX3QgZ2ZuLCBwZm5fdCBwZm4sIGJvb2wgc3BlY3VsYXRpdmUpCisJCQkgaW50ICpwdHdyaXRlLCBpbnQgbGFyZ2VwYWdlLCBnZm5fdCBnZm4sCisJCQkgcGZuX3QgcGZuLCBib29sIHNwZWN1bGF0aXZlKQogewogCWludCB3YXNfcm1hcHBlZCA9IDA7CiAJaW50IHdhc193cml0ZWJsZSA9IGlzX3dyaXRlYmxlX3B0ZSgqc2hhZG93X3B0ZSk7CkBAIC0xNzk1LDcgKzE3NjUsNyBAQAogCQkJd2FzX3JtYXBwZWQgPSAxOwogCX0KIAlpZiAoc2V0X3NwdGUodmNwdSwgc2hhZG93X3B0ZSwgcHRlX2FjY2VzcywgdXNlcl9mYXVsdCwgd3JpdGVfZmF1bHQsCi0JCSAgICAgIGRpcnR5LCBsYXJnZXBhZ2UsIGdsb2JhbCwgZ2ZuLCBwZm4sIHNwZWN1bGF0aXZlLCB0cnVlKSkgeworCQkgICAgICBkaXJ0eSwgbGFyZ2VwYWdlLCBnZm4sIHBmbiwgc3BlY3VsYXRpdmUsIHRydWUpKSB7CiAJCWlmICh3cml0ZV9mYXVsdCkKIAkJCSpwdHdyaXRlID0gMTsKIAkJa3ZtX3g4Nl9vcHMtPnRsYl9mbHVzaCh2Y3B1KTsKQEAgLTE4NDMsNyArMTgxMyw3IEBACiAJCSAgICB8fCAobGFyZ2VwYWdlICYmIGl0ZXJhdG9yLmxldmVsID09IFBUX0RJUkVDVE9SWV9MRVZFTCkpIHsKIAkJCW1tdV9zZXRfc3B0ZSh2Y3B1LCBpdGVyYXRvci5zcHRlcCwgQUNDX0FMTCwgQUNDX0FMTCwKIAkJCQkgICAgIDAsIHdyaXRlLCAxLCAmcHRfd3JpdGUsCi0JCQkJICAgICBsYXJnZXBhZ2UsIDAsIGdmbiwgcGZuLCBmYWxzZSk7CisJCQkJICAgICBsYXJnZXBhZ2UsIGdmbiwgcGZuLCBmYWxzZSk7CiAJCQkrK3ZjcHUtPnN0YXQucGZfZml4ZWQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMTk0Miw3ICsxOTEyLDE5IEBACiAJdmNwdS0+YXJjaC5tbXUucm9vdF9ocGEgPSBJTlZBTElEX1BBR0U7CiB9CiAKLXN0YXRpYyB2b2lkIG1tdV9hbGxvY19yb290cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW50IG1tdV9jaGVja19yb290KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3Qgcm9vdF9nZm4pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWt2bV9pc192aXNpYmxlX2dmbih2Y3B1LT5rdm0sIHJvb3RfZ2ZuKSkgeworCQlzZXRfYml0KEtWTV9SRVFfVFJJUExFX0ZBVUxULCAmdmNwdS0+cmVxdWVzdHMpOworCQlyZXQgPSAxOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbW11X2FsbG9jX3Jvb3RzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlpbnQgaTsKIAlnZm5fdCByb290X2dmbjsKQEAgLTE5NTcsMTMgKzE5MzksMTUgQEAKIAkJQVNTRVJUKCFWQUxJRF9QQUdFKHJvb3QpKTsKIAkJaWYgKHRkcF9lbmFibGVkKQogCQkJZGlyZWN0ID0gMTsKKwkJaWYgKG1tdV9jaGVja19yb290KHZjcHUsIHJvb3RfZ2ZuKSkKKwkJCXJldHVybiAxOwogCQlzcCA9IGt2bV9tbXVfZ2V0X3BhZ2UodmNwdSwgcm9vdF9nZm4sIDAsCiAJCQkJICAgICAgUFQ2NF9ST09UX0xFVkVMLCBkaXJlY3QsCiAJCQkJICAgICAgQUNDX0FMTCwgTlVMTCk7CiAJCXJvb3QgPSBfX3BhKHNwLT5zcHQpOwogCQkrK3NwLT5yb290X2NvdW50OwogCQl2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSA9IHJvb3Q7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCWRpcmVjdCA9ICFpc19wYWdpbmcodmNwdSk7CiAJaWYgKHRkcF9lbmFibGVkKQpAQCAtMTk4MCw2ICsxOTY0LDggQEAKIAkJCXJvb3RfZ2ZuID0gdmNwdS0+YXJjaC5wZHB0cnNbaV0gPj4gUEFHRV9TSElGVDsKIAkJfSBlbHNlIGlmICh2Y3B1LT5hcmNoLm1tdS5yb290X2xldmVsID09IDApCiAJCQlyb290X2dmbiA9IDA7CisJCWlmIChtbXVfY2hlY2tfcm9vdCh2Y3B1LCByb290X2dmbikpCisJCQlyZXR1cm4gMTsKIAkJc3AgPSBrdm1fbW11X2dldF9wYWdlKHZjcHUsIHJvb3RfZ2ZuLCBpIDw8IDMwLAogCQkJCSAgICAgIFBUMzJfUk9PVF9MRVZFTCwgZGlyZWN0LAogCQkJCSAgICAgIEFDQ19BTEwsIE5VTEwpOwpAQCAtMTk4OCw2ICsxOTc0LDcgQEAKIAkJdmNwdS0+YXJjaC5tbXUucGFlX3Jvb3RbaV0gPSByb290IHwgUFRfUFJFU0VOVF9NQVNLOwogCX0KIAl2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSA9IF9fcGEodmNwdS0+YXJjaC5tbXUucGFlX3Jvb3QpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBtbXVfc3luY19yb290cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0yMDA2LDcgKzE5OTMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKIAkJaHBhX3Qgcm9vdCA9IHZjcHUtPmFyY2gubW11LnBhZV9yb290W2ldOwogCi0JCWlmIChyb290KSB7CisJCWlmIChyb290ICYmIFZBTElEX1BBR0Uocm9vdCkpIHsKIAkJCXJvb3QgJj0gUFQ2NF9CQVNFX0FERFJfTUFTSzsKIAkJCXNwID0gcGFnZV9oZWFkZXIocm9vdCk7CiAJCQltbXVfc3luY19jaGlsZHJlbih2Y3B1LCBzcCk7CkBAIC0yMDE0LDE1ICsyMDAxLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG1tdV9zeW5jX2dsb2JhbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0Jc3RydWN0IGt2bSAqa3ZtID0gdmNwdS0+a3ZtOwotCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwLCAqbjsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcCwgbiwgJmt2bS0+YXJjaC5vb3NfZ2xvYmFsX3BhZ2VzLCBvb3NfbGluaykKLQkJa3ZtX3N5bmNfcGFnZSh2Y3B1LCBzcCk7Ci19Ci0KIHZvaWQga3ZtX21tdV9zeW5jX3Jvb3RzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzcGluX2xvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOwpAQCAtMjAzMCwxMyArMjAwOCw2IEBACiAJc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOwogfQogCi12b2lkIGt2bV9tbXVfc3luY19nbG9iYWwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7Ci0JbW11X3N5bmNfZ2xvYmFsKHZjcHUpOwotCXNwaW5fdW5sb2NrKCZ2Y3B1LT5rdm0tPm1tdV9sb2NrKTsKLX0KLQogc3RhdGljIGdwYV90IG5vbnBhZ2luZ19ndmFfdG9fZ3BhKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ3ZhX3QgdmFkZHIpCiB7CiAJcmV0dXJuIHZhZGRyOwpAQCAtMjE1MSw2ICsyMTIyLDE0IEBACiAJbm9ucGFnaW5nX2ZyZWUodmNwdSk7CiB9CiAKK3N0YXRpYyBib29sIGlzX3JzdmRfYml0c19zZXQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgZ3B0ZSwgaW50IGxldmVsKQoreworCWludCBiaXQ3OworCisJYml0NyA9IChncHRlID4+IDcpICYgMTsKKwlyZXR1cm4gKGdwdGUgJiB2Y3B1LT5hcmNoLm1tdS5yc3ZkX2JpdHNfbWFza1tiaXQ3XVtsZXZlbC0xXSkgIT0gMDsKK30KKwogI2RlZmluZSBQVFRZUEUgNjQKICNpbmNsdWRlICJwYWdpbmdfdG1wbC5oIgogI3VuZGVmIFBUVFlQRQpAQCAtMjE1OSw2ICsyMTM4LDU5IEBACiAjaW5jbHVkZSAicGFnaW5nX3RtcGwuaCIKICN1bmRlZiBQVFRZUEUKIAorc3RhdGljIHZvaWQgcmVzZXRfcnN2ZHNfYml0c19tYXNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGxldmVsKQoreworCXN0cnVjdCBrdm1fbW11ICpjb250ZXh0ID0gJnZjcHUtPmFyY2gubW11OworCWludCBtYXhwaHlhZGRyID0gY3B1aWRfbWF4cGh5YWRkcih2Y3B1KTsKKwl1NjQgZXhiX2JpdF9yc3ZkID0gMDsKKworCWlmICghaXNfbngodmNwdSkpCisJCWV4Yl9iaXRfcnN2ZCA9IHJzdmRfYml0cyg2MywgNjMpOworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIFBUMzJfUk9PVF9MRVZFTDoKKwkJLyogbm8gcnN2ZCBiaXRzIGZvciAyIGxldmVsIDRLIHBhZ2UgdGFibGUgZW50cmllcyAqLworCQljb250ZXh0LT5yc3ZkX2JpdHNfbWFza1swXVsxXSA9IDA7CisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzBdWzBdID0gMDsKKwkJaWYgKGlzX2NwdWlkX1BTRTM2KCkpCisJCQkvKiAzNmJpdHMgUFNFIDRNQiBwYWdlICovCisJCQljb250ZXh0LT5yc3ZkX2JpdHNfbWFza1sxXVsxXSA9IHJzdmRfYml0cygxNywgMjEpOworCQllbHNlCisJCQkvKiAzMiBiaXRzIFBTRSA0TUIgcGFnZSAqLworCQkJY29udGV4dC0+cnN2ZF9iaXRzX21hc2tbMV1bMV0gPSByc3ZkX2JpdHMoMTMsIDIxKTsKKwkJY29udGV4dC0+cnN2ZF9iaXRzX21hc2tbMV1bMF0gPSB+MHVsbDsKKwkJYnJlYWs7CisJY2FzZSBQVDMyRV9ST09UX0xFVkVMOgorCQljb250ZXh0LT5yc3ZkX2JpdHNfbWFza1swXVsyXSA9CisJCQlyc3ZkX2JpdHMobWF4cGh5YWRkciwgNjMpIHwKKwkJCXJzdmRfYml0cyg3LCA4KSB8IHJzdmRfYml0cygxLCAyKTsJLyogUERQVEUgKi8KKwkJY29udGV4dC0+cnN2ZF9iaXRzX21hc2tbMF1bMV0gPSBleGJfYml0X3JzdmQgfAorCQkJcnN2ZF9iaXRzKG1heHBoeWFkZHIsIDYyKTsJLyogUERFICovCisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzBdWzBdID0gZXhiX2JpdF9yc3ZkIHwKKwkJCXJzdmRfYml0cyhtYXhwaHlhZGRyLCA2Mik7IAkvKiBQVEUgKi8KKwkJY29udGV4dC0+cnN2ZF9iaXRzX21hc2tbMV1bMV0gPSBleGJfYml0X3JzdmQgfAorCQkJcnN2ZF9iaXRzKG1heHBoeWFkZHIsIDYyKSB8CisJCQlyc3ZkX2JpdHMoMTMsIDIwKTsJCS8qIGxhcmdlIHBhZ2UgKi8KKwkJY29udGV4dC0+cnN2ZF9iaXRzX21hc2tbMV1bMF0gPSB+MHVsbDsKKwkJYnJlYWs7CisJY2FzZSBQVDY0X1JPT1RfTEVWRUw6CisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzBdWzNdID0gZXhiX2JpdF9yc3ZkIHwKKwkJCXJzdmRfYml0cyhtYXhwaHlhZGRyLCA1MSkgfCByc3ZkX2JpdHMoNywgOCk7CisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzBdWzJdID0gZXhiX2JpdF9yc3ZkIHwKKwkJCXJzdmRfYml0cyhtYXhwaHlhZGRyLCA1MSkgfCByc3ZkX2JpdHMoNywgOCk7CisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzBdWzFdID0gZXhiX2JpdF9yc3ZkIHwKKwkJCXJzdmRfYml0cyhtYXhwaHlhZGRyLCA1MSk7CisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzBdWzBdID0gZXhiX2JpdF9yc3ZkIHwKKwkJCXJzdmRfYml0cyhtYXhwaHlhZGRyLCA1MSk7CisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzFdWzNdID0gY29udGV4dC0+cnN2ZF9iaXRzX21hc2tbMF1bM107CisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzFdWzJdID0gY29udGV4dC0+cnN2ZF9iaXRzX21hc2tbMF1bMl07CisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzFdWzFdID0gZXhiX2JpdF9yc3ZkIHwKKwkJCXJzdmRfYml0cyhtYXhwaHlhZGRyLCA1MSkgfAorCQkJcnN2ZF9iaXRzKDEzLCAyMCk7CQkvKiBsYXJnZSBwYWdlICovCisJCWNvbnRleHQtPnJzdmRfYml0c19tYXNrWzFdWzBdID0gfjB1bGw7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIGludCBwYWdpbmc2NF9pbml0X2NvbnRleHRfY29tbW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGxldmVsKQogewogCXN0cnVjdCBrdm1fbW11ICpjb250ZXh0ID0gJnZjcHUtPmFyY2gubW11OwpAQCAtMjE3OSw2ICsyMjExLDcgQEAKIAogc3RhdGljIGludCBwYWdpbmc2NF9pbml0X2NvbnRleHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCXJlc2V0X3JzdmRzX2JpdHNfbWFzayh2Y3B1LCBQVDY0X1JPT1RfTEVWRUwpOwogCXJldHVybiBwYWdpbmc2NF9pbml0X2NvbnRleHRfY29tbW9uKHZjcHUsIFBUNjRfUk9PVF9MRVZFTCk7CiB9CiAKQEAgLTIxODYsNiArMjIxOSw3IEBACiB7CiAJc3RydWN0IGt2bV9tbXUgKmNvbnRleHQgPSAmdmNwdS0+YXJjaC5tbXU7CiAKKwlyZXNldF9yc3Zkc19iaXRzX21hc2sodmNwdSwgUFQzMl9ST09UX0xFVkVMKTsKIAljb250ZXh0LT5uZXdfY3IzID0gcGFnaW5nX25ld19jcjM7CiAJY29udGV4dC0+cGFnZV9mYXVsdCA9IHBhZ2luZzMyX3BhZ2VfZmF1bHQ7CiAJY29udGV4dC0+Z3ZhX3RvX2dwYSA9IHBhZ2luZzMyX2d2YV90b19ncGE7CkBAIC0yMjAxLDYgKzIyMzUsNyBAQAogCiBzdGF0aWMgaW50IHBhZ2luZzMyRV9pbml0X2NvbnRleHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCXJlc2V0X3JzdmRzX2JpdHNfbWFzayh2Y3B1LCBQVDMyRV9ST09UX0xFVkVMKTsKIAlyZXR1cm4gcGFnaW5nNjRfaW5pdF9jb250ZXh0X2NvbW1vbih2Y3B1LCBQVDMyRV9ST09UX0xFVkVMKTsKIH0KIApAQCAtMjIyMSwxMiArMjI1NiwxNSBAQAogCQljb250ZXh0LT5ndmFfdG9fZ3BhID0gbm9ucGFnaW5nX2d2YV90b19ncGE7CiAJCWNvbnRleHQtPnJvb3RfbGV2ZWwgPSAwOwogCX0gZWxzZSBpZiAoaXNfbG9uZ19tb2RlKHZjcHUpKSB7CisJCXJlc2V0X3JzdmRzX2JpdHNfbWFzayh2Y3B1LCBQVDY0X1JPT1RfTEVWRUwpOwogCQljb250ZXh0LT5ndmFfdG9fZ3BhID0gcGFnaW5nNjRfZ3ZhX3RvX2dwYTsKIAkJY29udGV4dC0+cm9vdF9sZXZlbCA9IFBUNjRfUk9PVF9MRVZFTDsKIAl9IGVsc2UgaWYgKGlzX3BhZSh2Y3B1KSkgeworCQlyZXNldF9yc3Zkc19iaXRzX21hc2sodmNwdSwgUFQzMkVfUk9PVF9MRVZFTCk7CiAJCWNvbnRleHQtPmd2YV90b19ncGEgPSBwYWdpbmc2NF9ndmFfdG9fZ3BhOwogCQljb250ZXh0LT5yb290X2xldmVsID0gUFQzMkVfUk9PVF9MRVZFTDsKIAl9IGVsc2UgeworCQlyZXNldF9yc3Zkc19iaXRzX21hc2sodmNwdSwgUFQzMl9ST09UX0xFVkVMKTsKIAkJY29udGV4dC0+Z3ZhX3RvX2dwYSA9IHBhZ2luZzMyX2d2YV90b19ncGE7CiAJCWNvbnRleHQtPnJvb3RfbGV2ZWwgPSBQVDMyX1JPT1RfTEVWRUw7CiAJfQpAQCAtMjI5MCw5ICsyMzI4LDExIEBACiAJCWdvdG8gb3V0OwogCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CiAJa3ZtX21tdV9mcmVlX3NvbWVfcGFnZXModmNwdSk7Ci0JbW11X2FsbG9jX3Jvb3RzKHZjcHUpOworCXIgPSBtbXVfYWxsb2Nfcm9vdHModmNwdSk7CiAJbW11X3N5bmNfcm9vdHModmNwdSk7CiAJc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOworCWlmIChyKQorCQlnb3RvIG91dDsKIAlrdm1feDg2X29wcy0+c2V0X2NyMyh2Y3B1LCB2Y3B1LT5hcmNoLm1tdS5yb290X2hwYSk7CiAJa3ZtX21tdV9mbHVzaF90bGIodmNwdSk7CiBvdXQ6CkBAIC0yNjM4LDE0ICsyNjc4LDYgQEAKIAogc3RhdGljIHZvaWQgZnJlZV9tbXVfcGFnZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXN0cnVjdCBrdm1fbW11X3BhZ2UgKnNwOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZ2Y3B1LT5rdm0tPmFyY2guYWN0aXZlX21tdV9wYWdlcykpIHsKLQkJc3AgPSBjb250YWluZXJfb2YodmNwdS0+a3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMubmV4dCwKLQkJCQkgIHN0cnVjdCBrdm1fbW11X3BhZ2UsIGxpbmspOwotCQlrdm1fbW11X3phcF9wYWdlKHZjcHUtPmt2bSwgc3ApOwotCQljb25kX3Jlc2NoZWQoKTsKLQl9CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZjcHUtPmFyY2gubW11LnBhZV9yb290KTsKIH0KIApAQCAtMjcxMCw3ICsyNzQyLDYgQEAKIHsKIAlzdHJ1Y3Qga3ZtX21tdV9wYWdlICpzcDsKIAotCXNwaW5fbG9jaygma3ZtLT5tbXVfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzcCwgJmt2bS0+YXJjaC5hY3RpdmVfbW11X3BhZ2VzLCBsaW5rKSB7CiAJCWludCBpOwogCQl1NjQgKnB0OwpAQCAtMjcyNSw3ICsyNzU2LDYgQEAKIAkJCQlwdFtpXSAmPSB+UFRfV1JJVEFCTEVfTUFTSzsKIAl9CiAJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7Ci0Jc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogfQogCiB2b2lkIGt2bV9tbXVfemFwX2FsbChzdHJ1Y3Qga3ZtICprdm0pCkBAIC0zMDA3LDExICszMDM3LDEzIEBACiAJCQkJICAgICAgICIgaW4gbm9ubGVhZiBsZXZlbDogbGV2ZWxzICVkIGd2YSAlbHgiCiAJCQkJICAgICAgICIgbGV2ZWwgJWQgcHRlICVsbHhcbiIsIGF1ZGl0X21zZywKIAkJCQkgICAgICAgdmNwdS0+YXJjaC5tbXUucm9vdF9sZXZlbCwgdmEsIGxldmVsLCBlbnQpOwotCi0JCQlhdWRpdF9tYXBwaW5nc19wYWdlKHZjcHUsIGVudCwgdmEsIGxldmVsIC0gMSk7CisJCQllbHNlCisJCQkJYXVkaXRfbWFwcGluZ3NfcGFnZSh2Y3B1LCBlbnQsIHZhLCBsZXZlbCAtIDEpOwogCQl9IGVsc2UgewogCQkJZ3BhX3QgZ3BhID0gdmNwdS0+YXJjaC5tbXUuZ3ZhX3RvX2dwYSh2Y3B1LCB2YSk7Ci0JCQlocGFfdCBocGEgPSAoaHBhX3QpZ3BhX3RvX3Bmbih2Y3B1LCBncGEpIDw8IFBBR0VfU0hJRlQ7CisJCQlnZm5fdCBnZm4gPSBncGEgPj4gUEFHRV9TSElGVDsKKwkJCXBmbl90IHBmbiA9IGdmbl90b19wZm4odmNwdS0+a3ZtLCBnZm4pOworCQkJaHBhX3QgaHBhID0gKGhwYV90KXBmbiA8PCBQQUdFX1NISUZUOwogCiAJCQlpZiAoaXNfc2hhZG93X3ByZXNlbnRfcHRlKGVudCkKIAkJCSAgICAmJiAoZW50ICYgUFQ2NF9CQVNFX0FERFJfTUFTSykgIT0gaHBhKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL21tdS5oIGIvYXJjaC94ODYva3ZtL21tdS5oCmluZGV4IGVhYWIyMTQuLjM0OTRhMmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9tbXUuaAorKysgYi9hcmNoL3g4Ni9rdm0vbW11LmgKQEAgLTc1LDQgKzc1LDkgQEAKIAlyZXR1cm4gdmNwdS0+YXJjaC5jcjAgJiBYODZfQ1IwX1BHOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19wcmVzZW50X3B0ZSh1bnNpZ25lZCBsb25nIHB0ZSkKK3sKKwlyZXR1cm4gcHRlICYgUFRfUFJFU0VOVF9NQVNLOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9wYWdpbmdfdG1wbC5oIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKaW5kZXggNmJkNzAyMC4uMjU4ZTQ1OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKKysrIGIvYXJjaC94ODYva3ZtL3BhZ2luZ190bXBsLmgKQEAgLTEyMyw2ICsxMjMsNyBAQAogCWdmbl90IHRhYmxlX2dmbjsKIAl1bnNpZ25lZCBpbmRleCwgcHRfYWNjZXNzLCBwdGVfYWNjZXNzOwogCWdwYV90IHB0ZV9ncGE7CisJaW50IHJzdmRfZmF1bHQgPSAwOwogCiAJcGdwcmludGsoIiVzOiBhZGRyICVseFxuIiwgX19mdW5jX18sIGFkZHIpOwogd2FsazoKQEAgLTE1Nyw2ICsxNTgsMTAgQEAKIAkJaWYgKCFpc19wcmVzZW50X3B0ZShwdGUpKQogCQkJZ290byBub3RfcHJlc2VudDsKIAorCQlyc3ZkX2ZhdWx0ID0gaXNfcnN2ZF9iaXRzX3NldCh2Y3B1LCBwdGUsIHdhbGtlci0+bGV2ZWwpOworCQlpZiAocnN2ZF9mYXVsdCkKKwkJCWdvdG8gYWNjZXNzX2Vycm9yOworCiAJCWlmICh3cml0ZV9mYXVsdCAmJiAhaXNfd3JpdGVibGVfcHRlKHB0ZSkpCiAJCQlpZiAodXNlcl9mYXVsdCB8fCBpc193cml0ZV9wcm90ZWN0aW9uKHZjcHUpKQogCQkJCWdvdG8gYWNjZXNzX2Vycm9yOwpAQCAtMjA5LDcgKzIxNCw2IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIHdhbGs7CiAJCXB0ZSB8PSBQVF9ESVJUWV9NQVNLOwotCQlrdm1fbW11X3B0ZV93cml0ZSh2Y3B1LCBwdGVfZ3BhLCAodTggKikmcHRlLCBzaXplb2YocHRlKSwgMCk7CiAJCXdhbGtlci0+cHRlc1t3YWxrZXItPmxldmVsIC0gMV0gPSBwdGU7CiAJfQogCkBAIC0yMzMsNiArMjM3LDggQEAKIAkJd2Fsa2VyLT5lcnJvcl9jb2RlIHw9IFBGRVJSX1VTRVJfTUFTSzsKIAlpZiAoZmV0Y2hfZmF1bHQpCiAJCXdhbGtlci0+ZXJyb3JfY29kZSB8PSBQRkVSUl9GRVRDSF9NQVNLOworCWlmIChyc3ZkX2ZhdWx0KQorCQl3YWxrZXItPmVycm9yX2NvZGUgfD0gUEZFUlJfUlNWRF9NQVNLOwogCXJldHVybiAwOwogfQogCkBAIC0yNjIsOCArMjY4LDcgQEAKIAlrdm1fZ2V0X3BmbihwZm4pOwogCW1tdV9zZXRfc3B0ZSh2Y3B1LCBzcHRlLCBwYWdlLT5yb2xlLmFjY2VzcywgcHRlX2FjY2VzcywgMCwgMCwKIAkJICAgICBncHRlICYgUFRfRElSVFlfTUFTSywgTlVMTCwgbGFyZ2VwYWdlLAotCQkgICAgIGdwdGUgJiBQVF9HTE9CQUxfTUFTSywgZ3B0ZV90b19nZm4oZ3B0ZSksCi0JCSAgICAgcGZuLCB0cnVlKTsKKwkJICAgICBncHRlX3RvX2dmbihncHRlKSwgcGZuLCB0cnVlKTsKIH0KIAogLyoKQEAgLTI5Nyw3ICszMDIsNiBAQAogCQkJCSAgICAgdXNlcl9mYXVsdCwgd3JpdGVfZmF1bHQsCiAJCQkJICAgICBndy0+cHRlc1tndy0+bGV2ZWwtMV0gJiBQVF9ESVJUWV9NQVNLLAogCQkJCSAgICAgcHR3cml0ZSwgbGFyZ2VwYWdlLAotCQkJCSAgICAgZ3ctPnB0ZXNbZ3ctPmxldmVsLTFdICYgUFRfR0xPQkFMX01BU0ssCiAJCQkJICAgICBndy0+Z2ZuLCBwZm4sIGZhbHNlKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0zODAsNyArMzg0LDcgQEAKIAkJcmV0dXJuIHI7CiAKIAkvKgotCSAqIExvb2sgdXAgdGhlIHNoYWRvdyBwdGUgZm9yIHRoZSBmYXVsdGluZyBhZGRyZXNzLgorCSAqIExvb2sgdXAgdGhlIGd1ZXN0IHB0ZSBmb3IgdGhlIGZhdWx0aW5nIGFkZHJlc3MuCiAJICovCiAJciA9IEZOQU1FKHdhbGtfYWRkcikoJndhbGtlciwgdmNwdSwgYWRkciwgd3JpdGVfZmF1bHQsIHVzZXJfZmF1bHQsCiAJCQkgICAgIGZldGNoX2ZhdWx0KTsKQEAgLTU4Niw3ICs1OTAsNyBAQAogCQlucl9wcmVzZW50Kys7CiAJCXB0ZV9hY2Nlc3MgPSBzcC0+cm9sZS5hY2Nlc3MgJiBGTkFNRShncHRlX2FjY2VzcykodmNwdSwgZ3B0ZSk7CiAJCXNldF9zcHRlKHZjcHUsICZzcC0+c3B0W2ldLCBwdGVfYWNjZXNzLCAwLCAwLAotCQkJIGlzX2RpcnR5X3B0ZShncHRlKSwgMCwgZ3B0ZSAmIFBUX0dMT0JBTF9NQVNLLCBnZm4sCisJCQkgaXNfZGlydHlfcHRlKGdwdGUpLCAwLCBnZm4sCiAJCQkgc3B0ZV90b19wZm4oc3AtPnNwdFtpXSksIHRydWUsIGZhbHNlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9zdm0uYyBiL2FyY2gveDg2L2t2bS9zdm0uYwppbmRleCAxZjg1MTBjLi43MTUxMGUwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vc3ZtLmMKKysrIGIvYXJjaC94ODYva3ZtL3N2bS5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAiaXJxLmgiCiAjaW5jbHVkZSAibW11LmgiCiAjaW5jbHVkZSAia3ZtX2NhY2hlX3JlZ3MuaCIKKyNpbmNsdWRlICJ4ODYuaCIKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNjksNyArNzAsNiBAQAogc3RhdGljIGludCBuZXN0ZWQgPSAwOwogbW9kdWxlX3BhcmFtKG5lc3RlZCwgaW50LCBTX0lSVUdPKTsKIAotc3RhdGljIHZvaWQga3ZtX3JlcHV0X2lycShzdHJ1Y3QgdmNwdV9zdm0gKnN2bSk7CiBzdGF0aWMgdm9pZCBzdm1fZmx1c2hfdGxiKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKIHN0YXRpYyBpbnQgbmVzdGVkX3N2bV9leGl0X2hhbmRsZWQoc3RydWN0IHZjcHVfc3ZtICpzdm0sIGJvb2wga3ZtX292ZXJyaWRlKTsKQEAgLTEzMiwyNCArMTMyLDYgQEAKIAlyZXR1cm4gc3ZtX2ZlYXR1cmVzICYgZmVhdDsKIH0KIAotc3RhdGljIGlubGluZSB1OCBwb3BfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlpbnQgd29yZF9pbmRleCA9IF9fZmZzKHZjcHUtPmFyY2guaXJxX3N1bW1hcnkpOwotCWludCBiaXRfaW5kZXggPSBfX2Zmcyh2Y3B1LT5hcmNoLmlycV9wZW5kaW5nW3dvcmRfaW5kZXhdKTsKLQlpbnQgaXJxID0gd29yZF9pbmRleCAqIEJJVFNfUEVSX0xPTkcgKyBiaXRfaW5kZXg7Ci0KLQljbGVhcl9iaXQoYml0X2luZGV4LCAmdmNwdS0+YXJjaC5pcnFfcGVuZGluZ1t3b3JkX2luZGV4XSk7Ci0JaWYgKCF2Y3B1LT5hcmNoLmlycV9wZW5kaW5nW3dvcmRfaW5kZXhdKQotCQljbGVhcl9iaXQod29yZF9pbmRleCwgJnZjcHUtPmFyY2guaXJxX3N1bW1hcnkpOwotCXJldHVybiBpcnE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXNoX2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU4IGlycSkKLXsKLQlzZXRfYml0KGlycSwgdmNwdS0+YXJjaC5pcnFfcGVuZGluZyk7Ci0Jc2V0X2JpdChpcnEgLyBCSVRTX1BFUl9MT05HLCAmdmNwdS0+YXJjaC5pcnFfc3VtbWFyeSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbGdpKHZvaWQpCiB7CiAJYXNtIHZvbGF0aWxlIChfX2V4KFNWTV9DTEdJKSk7CkBAIC0yMTQsMjUgKzE5Niw0MSBAQAogCXN2bS0+dm1jYi0+Y29udHJvbC5ldmVudF9pbmpfZXJyID0gZXJyb3JfY29kZTsKIH0KIAotc3RhdGljIGJvb2wgc3ZtX2V4Y2VwdGlvbl9pbmplY3RlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0Jc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7Ci0KLQlyZXR1cm4gIShzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbyAmIFNWTV9FWElUSU5USU5GT19WQUxJRCk7Ci19Ci0KIHN0YXRpYyBpbnQgaXNfZXh0ZXJuYWxfaW50ZXJydXB0KHUzMiBpbmZvKQogewogCWluZm8gJj0gU1ZNX0VWVElOSl9UWVBFX01BU0sgfCBTVk1fRVZUSU5KX1ZBTElEOwogCXJldHVybiBpbmZvID09IChTVk1fRVZUSU5KX1ZBTElEIHwgU1ZNX0VWVElOSl9UWVBFX0lOVFIpOwogfQogCitzdGF0aWMgdTMyIHN2bV9nZXRfaW50ZXJydXB0X3NoYWRvdyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBtYXNrKQoreworCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOworCXUzMiByZXQgPSAwOworCisJaWYgKHN2bS0+dm1jYi0+Y29udHJvbC5pbnRfc3RhdGUgJiBTVk1fSU5URVJSVVBUX1NIQURPV19NQVNLKQorCQlyZXQgfD0gWDg2X1NIQURPV19JTlRfU1RJIHwgWDg2X1NIQURPV19JTlRfTU9WX1NTOworCXJldHVybiByZXQgJiBtYXNrOworfQorCitzdGF0aWMgdm9pZCBzdm1fc2V0X2ludGVycnVwdF9zaGFkb3coc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKKworCWlmIChtYXNrID09IDApCisJCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRfc3RhdGUgJj0gflNWTV9JTlRFUlJVUFRfU0hBRE9XX01BU0s7CisJZWxzZQorCQlzdm0tPnZtY2ItPmNvbnRyb2wuaW50X3N0YXRlIHw9IFNWTV9JTlRFUlJVUFRfU0hBRE9XX01BU0s7CisKK30KKwogc3RhdGljIHZvaWQgc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CiAKIAlpZiAoIXN2bS0+bmV4dF9yaXApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBOT1BcbiIsIF9fZnVuY19fKTsKKwkJaWYgKGVtdWxhdGVfaW5zdHJ1Y3Rpb24odmNwdSwgdmNwdS0+cnVuLCAwLCAwLCBFTVVMVFlQRV9TS0lQKSAhPQorCQkJCUVNVUxBVEVfRE9ORSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogTk9QXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJaWYgKHN2bS0+bmV4dF9yaXAgLSBrdm1fcmlwX3JlYWQodmNwdSkgPiBNQVhfSU5TVF9TSVpFKQpAQCAtMjQwLDkgKzIzOCw3IEBACiAJCSAgICAgICBfX2Z1bmNfXywga3ZtX3JpcF9yZWFkKHZjcHUpLCBzdm0tPm5leHRfcmlwKTsKIAogCWt2bV9yaXBfd3JpdGUodmNwdSwgc3ZtLT5uZXh0X3JpcCk7Ci0Jc3ZtLT52bWNiLT5jb250cm9sLmludF9zdGF0ZSAmPSB+U1ZNX0lOVEVSUlVQVF9TSEFET1dfTUFTSzsKLQotCXZjcHUtPmFyY2guaW50ZXJydXB0X3dpbmRvd19vcGVuID0gKHN2bS0+dmNwdS5hcmNoLmhmbGFncyAmIEhGX0dJRl9NQVNLKTsKKwlzdm1fc2V0X2ludGVycnVwdF9zaGFkb3codmNwdSwgMCk7CiB9CiAKIHN0YXRpYyBpbnQgaGFzX3N2bSh2b2lkKQpAQCAtODMwLDYgKzgyNiwxNSBAQAogCQlpZiAoIXZhci0+dW51c2FibGUpCiAJCQl2YXItPnR5cGUgfD0gMHgxOwogCQlicmVhazsKKwljYXNlIFZDUFVfU1JFR19TUzoKKwkJLyogT24gQU1EIENQVXMgc29tZXRpbWVzIHRoZSBEQiBiaXQgaW4gdGhlIHNlZ21lbnQKKwkJICogZGVzY3JpcHRvciBpcyBsZWZ0IGFzIDEsIGFsdGhvdWdoIHRoZSB3aG9sZSBzZWdtZW50IGhhcworCQkgKiBiZWVuIG1hZGUgdW51c2FibGUuIENsZWFyIGl0IGhlcmUgdG8gcGFzcyBhbiBJbnRlbCBWTVgKKwkJICogZW50cnkgY2hlY2sgd2hlbiBjcm9zcyB2ZW5kb3IgbWlncmF0aW5nLgorCQkgKi8KKwkJaWYgKHZhci0+dW51c2FibGUpCisJCQl2YXItPmRiID0gMDsKKwkJYnJlYWs7CiAJfQogfQogCkBAIC05NjAsMTUgKzk2NSwxNiBAQAogCiB9CiAKLXN0YXRpYyBpbnQgc3ZtX2d1ZXN0X2RlYnVnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ndWVzdF9kZWJ1ZyAqZGJnKQorc3RhdGljIHZvaWQgdXBkYXRlX2RiX2ludGVyY2VwdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JaW50IG9sZF9kZWJ1ZyA9IHZjcHUtPmd1ZXN0X2RlYnVnOwogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCi0JdmNwdS0+Z3Vlc3RfZGVidWcgPSBkYmctPmNvbnRyb2w7Ci0KIAlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2V4Y2VwdGlvbnMgJj0KIAkJfigoMSA8PCBEQl9WRUNUT1IpIHwgKDEgPDwgQlBfVkVDVE9SKSk7CisKKwlpZiAodmNwdS0+YXJjaC5zaW5nbGVzdGVwKQorCQlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2V4Y2VwdGlvbnMgfD0gKDEgPDwgREJfVkVDVE9SKTsKKwogCWlmICh2Y3B1LT5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19FTkFCTEUpIHsKIAkJaWYgKHZjcHUtPmd1ZXN0X2RlYnVnICYKIAkJICAgIChLVk1fR1VFU1REQkdfU0lOR0xFU1RFUCB8IEtWTV9HVUVTVERCR19VU0VfSFdfQlApKQpAQCAtOTc5LDYgKzk4NSwxNiBAQAogCQkJCTEgPDwgQlBfVkVDVE9SOwogCX0gZWxzZQogCQl2Y3B1LT5ndWVzdF9kZWJ1ZyA9IDA7Cit9CisKK3N0YXRpYyBpbnQgc3ZtX2d1ZXN0X2RlYnVnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ndWVzdF9kZWJ1ZyAqZGJnKQoreworCWludCBvbGRfZGVidWcgPSB2Y3B1LT5ndWVzdF9kZWJ1ZzsKKwlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKKworCXZjcHUtPmd1ZXN0X2RlYnVnID0gZGJnLT5jb250cm9sOworCisJdXBkYXRlX2RiX2ludGVyY2VwdCh2Y3B1KTsKIAogCWlmICh2Y3B1LT5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19VU0VfSFdfQlApCiAJCXN2bS0+dm1jYi0+c2F2ZS5kcjcgPSBkYmctPmFyY2guZGVidWdyZWdbN107CkBAIC05OTMsMTYgKzEwMDksNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN2bV9nZXRfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKLQl1MzIgZXhpdF9pbnRfaW5mbyA9IHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvOwotCi0JaWYgKGlzX2V4dGVybmFsX2ludGVycnVwdChleGl0X2ludF9pbmZvKSkKLQkJcmV0dXJuIGV4aXRfaW50X2luZm8gJiBTVk1fRVZUSU5KX1ZFQ19NQVNLOwotCXJldHVybiAtMTsKLX0KLQogc3RhdGljIHZvaWQgbG9hZF9ob3N0X21zcnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTExMDcsMTcgKzExMTMsOCBAQAogCiBzdGF0aWMgaW50IHBmX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7Ci0JdTMyIGV4aXRfaW50X2luZm8gPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbzsKLQlzdHJ1Y3Qga3ZtICprdm0gPSBzdm0tPnZjcHUua3ZtOwogCXU2NCBmYXVsdF9hZGRyZXNzOwogCXUzMiBlcnJvcl9jb2RlOwotCWJvb2wgZXZlbnRfaW5qZWN0aW9uID0gZmFsc2U7Ci0KLQlpZiAoIWlycWNoaXBfaW5fa2VybmVsKGt2bSkgJiYKLQkgICAgaXNfZXh0ZXJuYWxfaW50ZXJydXB0KGV4aXRfaW50X2luZm8pKSB7Ci0JCWV2ZW50X2luamVjdGlvbiA9IHRydWU7Ci0JCXB1c2hfaXJxKCZzdm0tPnZjcHUsIGV4aXRfaW50X2luZm8gJiBTVk1fRVZUSU5KX1ZFQ19NQVNLKTsKLQl9CiAKIAlmYXVsdF9hZGRyZXNzICA9IHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMjsKIAllcnJvcl9jb2RlID0gc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18xOwpAQCAtMTEzNywyMyArMTEzNCw0MCBAQAogCSAqLwogCWlmIChucHRfZW5hYmxlZCkKIAkJc3ZtX2ZsdXNoX3RsYigmc3ZtLT52Y3B1KTsKLQotCWlmICghbnB0X2VuYWJsZWQgJiYgZXZlbnRfaW5qZWN0aW9uKQotCQlrdm1fbW11X3VucHJvdGVjdF9wYWdlX3ZpcnQoJnN2bS0+dmNwdSwgZmF1bHRfYWRkcmVzcyk7CisJZWxzZSB7CisJCWlmIChrdm1fZXZlbnRfbmVlZHNfcmVpbmplY3Rpb24oJnN2bS0+dmNwdSkpCisJCQlrdm1fbW11X3VucHJvdGVjdF9wYWdlX3ZpcnQoJnN2bS0+dmNwdSwgZmF1bHRfYWRkcmVzcyk7CisJfQogCXJldHVybiBrdm1fbW11X3BhZ2VfZmF1bHQoJnN2bS0+dmNwdSwgZmF1bHRfYWRkcmVzcywgZXJyb3JfY29kZSk7CiB9CiAKIHN0YXRpYyBpbnQgZGJfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKIHsKIAlpZiAoIShzdm0tPnZjcHUuZ3Vlc3RfZGVidWcgJgotCSAgICAgIChLVk1fR1VFU1REQkdfU0lOR0xFU1RFUCB8IEtWTV9HVUVTVERCR19VU0VfSFdfQlApKSkgeworCSAgICAgIChLVk1fR1VFU1REQkdfU0lOR0xFU1RFUCB8IEtWTV9HVUVTVERCR19VU0VfSFdfQlApKSAmJgorCQkhc3ZtLT52Y3B1LmFyY2guc2luZ2xlc3RlcCkgewogCQlrdm1fcXVldWVfZXhjZXB0aW9uKCZzdm0tPnZjcHUsIERCX1ZFQ1RPUik7CiAJCXJldHVybiAxOwogCX0KLQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0RFQlVHOwotCWt2bV9ydW4tPmRlYnVnLmFyY2gucGMgPSBzdm0tPnZtY2ItPnNhdmUuY3MuYmFzZSArIHN2bS0+dm1jYi0+c2F2ZS5yaXA7Ci0Ja3ZtX3J1bi0+ZGVidWcuYXJjaC5leGNlcHRpb24gPSBEQl9WRUNUT1I7Ci0JcmV0dXJuIDA7CisKKwlpZiAoc3ZtLT52Y3B1LmFyY2guc2luZ2xlc3RlcCkgeworCQlzdm0tPnZjcHUuYXJjaC5zaW5nbGVzdGVwID0gZmFsc2U7CisJCWlmICghKHN2bS0+dmNwdS5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19TSU5HTEVTVEVQKSkKKwkJCXN2bS0+dm1jYi0+c2F2ZS5yZmxhZ3MgJj0KKwkJCQl+KFg4Nl9FRkxBR1NfVEYgfCBYODZfRUZMQUdTX1JGKTsKKwkJdXBkYXRlX2RiX2ludGVyY2VwdCgmc3ZtLT52Y3B1KTsKKwl9CisKKwlpZiAoc3ZtLT52Y3B1Lmd1ZXN0X2RlYnVnICYKKwkgICAgKEtWTV9HVUVTVERCR19TSU5HTEVTVEVQIHwgS1ZNX0dVRVNUREJHX1VTRV9IV19CUCkpeworCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0RFQlVHOworCQlrdm1fcnVuLT5kZWJ1Zy5hcmNoLnBjID0KKwkJCXN2bS0+dm1jYi0+c2F2ZS5jcy5iYXNlICsgc3ZtLT52bWNiLT5zYXZlLnJpcDsKKwkJa3ZtX3J1bi0+ZGVidWcuYXJjaC5leGNlcHRpb24gPSBEQl9WRUNUT1I7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50IGJwX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCkBAIC0xODQyLDE3ICsxODU2LDUxIEBACiAJCQkJICAgIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewogCXUxNiB0c3Nfc2VsZWN0b3I7CisJaW50IHJlYXNvbjsKKwlpbnQgaW50X3R5cGUgPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbyAmCisJCVNWTV9FWElUSU5USU5GT19UWVBFX01BU0s7CisJaW50IGludF92ZWMgPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbyAmIFNWTV9FVlRJTkpfVkVDX01BU0s7CisJdWludDMyX3QgdHlwZSA9CisJCXN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvICYgU1ZNX0VYSVRJTlRJTkZPX1RZUEVfTUFTSzsKKwl1aW50MzJfdCBpZHRfdiA9CisJCXN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvICYgU1ZNX0VYSVRJTlRJTkZPX1ZBTElEOwogCiAJdHNzX3NlbGVjdG9yID0gKHUxNilzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbmZvXzE7CisKIAlpZiAoc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18yICYKIAkgICAgKDFVTEwgPDwgU1ZNX0VYSVRJTkZPU0hJRlRfVFNfUkVBU09OX0lSRVQpKQotCQlyZXR1cm4ga3ZtX3Rhc2tfc3dpdGNoKCZzdm0tPnZjcHUsIHRzc19zZWxlY3RvciwKLQkJCQkgICAgICAgVEFTS19TV0lUQ0hfSVJFVCk7Ci0JaWYgKHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2luZm9fMiAmCi0JICAgICgxVUxMIDw8IFNWTV9FWElUSU5GT1NISUZUX1RTX1JFQVNPTl9KTVApKQotCQlyZXR1cm4ga3ZtX3Rhc2tfc3dpdGNoKCZzdm0tPnZjcHUsIHRzc19zZWxlY3RvciwKLQkJCQkgICAgICAgVEFTS19TV0lUQ0hfSk1QKTsKLQlyZXR1cm4ga3ZtX3Rhc2tfc3dpdGNoKCZzdm0tPnZjcHUsIHRzc19zZWxlY3RvciwgVEFTS19TV0lUQ0hfQ0FMTCk7CisJCXJlYXNvbiA9IFRBU0tfU1dJVENIX0lSRVQ7CisJZWxzZSBpZiAoc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18yICYKKwkJICgxVUxMIDw8IFNWTV9FWElUSU5GT1NISUZUX1RTX1JFQVNPTl9KTVApKQorCQlyZWFzb24gPSBUQVNLX1NXSVRDSF9KTVA7CisJZWxzZSBpZiAoaWR0X3YpCisJCXJlYXNvbiA9IFRBU0tfU1dJVENIX0dBVEU7CisJZWxzZQorCQlyZWFzb24gPSBUQVNLX1NXSVRDSF9DQUxMOworCisJaWYgKHJlYXNvbiA9PSBUQVNLX1NXSVRDSF9HQVRFKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFNWTV9FWElUSU5USU5GT19UWVBFX05NSToKKwkJCXN2bS0+dmNwdS5hcmNoLm5taV9pbmplY3RlZCA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgU1ZNX0VYSVRJTlRJTkZPX1RZUEVfRVhFUFQ6CisJCQlrdm1fY2xlYXJfZXhjZXB0aW9uX3F1ZXVlKCZzdm0tPnZjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgU1ZNX0VYSVRJTlRJTkZPX1RZUEVfSU5UUjoKKwkJCWt2bV9jbGVhcl9pbnRlcnJ1cHRfcXVldWUoJnN2bS0+dmNwdSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJlYXNvbiAhPSBUQVNLX1NXSVRDSF9HQVRFIHx8CisJICAgIGludF90eXBlID09IFNWTV9FWElUSU5USU5GT19UWVBFX1NPRlQgfHwKKwkgICAgKGludF90eXBlID09IFNWTV9FWElUSU5USU5GT19UWVBFX0VYRVBUICYmCisJICAgICAoaW50X3ZlYyA9PSBPRl9WRUNUT1IgfHwgaW50X3ZlYyA9PSBCUF9WRUNUT1IpKSkKKwkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1KTsKKworCXJldHVybiBrdm1fdGFza19zd2l0Y2goJnN2bS0+dmNwdSwgdHNzX3NlbGVjdG9yLCByZWFzb24pOwogfQogCiBzdGF0aWMgaW50IGNwdWlkX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCkBAIC0xODYyLDYgKzE5MTAsMTQgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBpcmV0X2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJKytzdm0tPnZjcHUuc3RhdC5ubWlfd2luZG93X2V4aXRzOworCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRlcmNlcHQgJj0gfigxVUwgPDwgSU5URVJDRVBUX0lSRVQpOworCXN2bS0+dmNwdS5hcmNoLmhmbGFncyB8PSBIRl9JUkVUX01BU0s7CisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgaW52bHBnX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7CiAJaWYgKGVtdWxhdGVfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSwga3ZtX3J1biwgMCwgMCwgMCkgIT0gRU1VTEFURV9ET05FKQpAQCAtMTg3OSw4ICsxOTM1LDE0IEBACiAKIHN0YXRpYyBpbnQgY3I4X3dyaXRlX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7CisJdTggY3I4X3ByZXYgPSBrdm1fZ2V0X2NyOCgmc3ZtLT52Y3B1KTsKKwkvKiBpbnN0cnVjdGlvbiBlbXVsYXRpb24gY2FsbHMga3ZtX3NldF9jcjgoKSAqLwogCWVtdWxhdGVfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSwgTlVMTCwgMCwgMCwgMCk7Ci0JaWYgKGlycWNoaXBfaW5fa2VybmVsKHN2bS0+dmNwdS5rdm0pKQorCWlmIChpcnFjaGlwX2luX2tlcm5lbChzdm0tPnZjcHUua3ZtKSkgeworCQlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3dyaXRlICY9IH5JTlRFUkNFUFRfQ1I4X01BU0s7CisJCXJldHVybiAxOworCX0KKwlpZiAoY3I4X3ByZXYgPD0ga3ZtX2dldF9jcjgoJnN2bS0+dmNwdSkpCiAJCXJldHVybiAxOwogCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfU0VUX1RQUjsKIAlyZXR1cm4gMDsKQEAgLTIwOTAsOCArMjE1Miw5IEBACiAJICogSWYgdGhlIHVzZXIgc3BhY2Ugd2FpdHMgdG8gaW5qZWN0IGludGVycnVwdHMsIGV4aXQgYXMgc29vbiBhcwogCSAqIHBvc3NpYmxlCiAJICovCi0JaWYgKGt2bV9ydW4tPnJlcXVlc3RfaW50ZXJydXB0X3dpbmRvdyAmJgotCSAgICAhc3ZtLT52Y3B1LmFyY2guaXJxX3N1bW1hcnkpIHsKKwlpZiAoIWlycWNoaXBfaW5fa2VybmVsKHN2bS0+dmNwdS5rdm0pICYmCisJICAgIGt2bV9ydW4tPnJlcXVlc3RfaW50ZXJydXB0X3dpbmRvdyAmJgorCSAgICAha3ZtX2NwdV9oYXNfaW50ZXJydXB0KCZzdm0tPnZjcHUpKSB7CiAJCSsrc3ZtLT52Y3B1LnN0YXQuaXJxX3dpbmRvd19leGl0czsKIAkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JUlFfV0lORE9XX09QRU47CiAJCXJldHVybiAwOwpAQCAtMjEzNCw2ICsyMTk3LDcgQEAKIAlbU1ZNX0VYSVRfVklOVFJdCQkJPSBpbnRlcnJ1cHRfd2luZG93X2ludGVyY2VwdGlvbiwKIAkvKiBbU1ZNX0VYSVRfQ1IwX1NFTF9XUklURV0JCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sICovCiAJW1NWTV9FWElUX0NQVUlEXQkJCT0gY3B1aWRfaW50ZXJjZXB0aW9uLAorCVtTVk1fRVhJVF9JUkVUXSAgICAgICAgICAgICAgICAgICAgICAgICA9IGlyZXRfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9JTlZEXSAgICAgICAgICAgICAgICAgICAgICAgICA9IGVtdWxhdGVfb25faW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9ITFRdCQkJCT0gaGFsdF9pbnRlcmNlcHRpb24sCiAJW1NWTV9FWElUX0lOVkxQR10JCQk9IGludmxwZ19pbnRlcmNlcHRpb24sCkBAIC0yMTk0LDcgKzIyNTgsNiBAQAogCQl9CiAJfQogCi0Ja3ZtX3JlcHV0X2lycShzdm0pOwogCiAJaWYgKHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2NvZGUgPT0gU1ZNX0VYSVRfRVJSKSB7CiAJCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfRkFJTF9FTlRSWTsKQEAgLTIyMDUsNyArMjI2OCw3IEBACiAKIAlpZiAoaXNfZXh0ZXJuYWxfaW50ZXJydXB0KHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvKSAmJgogCSAgICBleGl0X2NvZGUgIT0gU1ZNX0VYSVRfRVhDUF9CQVNFICsgUEZfVkVDVE9SICYmCi0JICAgIGV4aXRfY29kZSAhPSBTVk1fRVhJVF9OUEYpCisJICAgIGV4aXRfY29kZSAhPSBTVk1fRVhJVF9OUEYgJiYgZXhpdF9jb2RlICE9IFNWTV9FWElUX1RBU0tfU1dJVENIKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkIGV4aXRfaW5pX2luZm8gMHgleCAiCiAJCSAgICAgICAiZXhpdF9jb2RlIDB4JXhcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW50X2luZm8sCkBAIC0yMjQyLDYgKzIzMDUsMTUgQEAKIAkJbmV3X2FzaWQoc3ZtLCBzdm1fZGF0YSk7CiB9CiAKK3N0YXRpYyB2b2lkIHN2bV9pbmplY3Rfbm1pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKKworCXN2bS0+dm1jYi0+Y29udHJvbC5ldmVudF9pbmogPSBTVk1fRVZUSU5KX1ZBTElEIHwgU1ZNX0VWVElOSl9UWVBFX05NSTsKKwl2Y3B1LT5hcmNoLmhmbGFncyB8PSBIRl9OTUlfTUFTSzsKKwlzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0IHw9ICgxVUwgPDwgSU5URVJDRVBUX0lSRVQpOworCSsrdmNwdS0+c3RhdC5ubWlfaW5qZWN0aW9uczsKK30KIAogc3RhdGljIGlubGluZSB2b2lkIHN2bV9pbmplY3RfaXJxKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCBpbnQgaXJxKQogewpAQCAtMjI1NywxMzQgKzIzMjksNzEgQEAKIAkJKCgvKmNvbnRyb2wtPmludF92ZWN0b3IgPj4gNCovIDB4ZikgPDwgVl9JTlRSX1BSSU9fU0hJRlQpOwogfQogCi1zdGF0aWMgdm9pZCBzdm1fc2V0X2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBpcnEpCitzdGF0aWMgdm9pZCBzdm1fcXVldWVfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbnIpCit7CisJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CisKKwlzdm0tPnZtY2ItPmNvbnRyb2wuZXZlbnRfaW5qID0gbnIgfAorCQlTVk1fRVZUSU5KX1ZBTElEIHwgU1ZNX0VWVElOSl9UWVBFX0lOVFI7Cit9CisKK3N0YXRpYyB2b2lkIHN2bV9zZXRfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKIAogCW5lc3RlZF9zdm1faW50cihzdm0pOwogCi0Jc3ZtX2luamVjdF9pcnEoc3ZtLCBpcnEpOworCXN2bV9xdWV1ZV9pcnEodmNwdSwgdmNwdS0+YXJjaC5pbnRlcnJ1cHQubnIpOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfY3I4X2ludGVyY2VwdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgdm9pZCB1cGRhdGVfY3I4X2ludGVyY2VwdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCB0cHIsIGludCBpcnIpCit7CisJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CisKKwlpZiAoaXJyID09IC0xKQorCQlyZXR1cm47CisKKwlpZiAodHByID49IGlycikKKwkJc3ZtLT52bWNiLT5jb250cm9sLmludGVyY2VwdF9jcl93cml0ZSB8PSBJTlRFUkNFUFRfQ1I4X01BU0s7Cit9CisKK3N0YXRpYyBpbnQgc3ZtX25taV9hbGxvd2VkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3QgdmNwdV9zdm0gKnN2bSA9IHRvX3N2bSh2Y3B1KTsKIAlzdHJ1Y3Qgdm1jYiAqdm1jYiA9IHN2bS0+dm1jYjsKLQlpbnQgbWF4X2lyciwgdHByOwotCi0JaWYgKCFpcnFjaGlwX2luX2tlcm5lbCh2Y3B1LT5rdm0pIHx8IHZjcHUtPmFyY2guYXBpYy0+dmFwaWNfYWRkcikKLQkJcmV0dXJuOwotCi0Jdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3Jfd3JpdGUgJj0gfklOVEVSQ0VQVF9DUjhfTUFTSzsKLQotCW1heF9pcnIgPSBrdm1fbGFwaWNfZmluZF9oaWdoZXN0X2lycih2Y3B1KTsKLQlpZiAobWF4X2lyciA9PSAtMSkKLQkJcmV0dXJuOwotCi0JdHByID0ga3ZtX2xhcGljX2dldF9jcjgodmNwdSkgPDwgNDsKLQotCWlmICh0cHIgPj0gKG1heF9pcnIgJiAweGYwKSkKLQkJdm1jYi0+Y29udHJvbC5pbnRlcmNlcHRfY3Jfd3JpdGUgfD0gSU5URVJDRVBUX0NSOF9NQVNLOworCXJldHVybiAhKHZtY2ItPmNvbnRyb2wuaW50X3N0YXRlICYgU1ZNX0lOVEVSUlVQVF9TSEFET1dfTUFTSykgJiYKKwkJIShzdm0tPnZjcHUuYXJjaC5oZmxhZ3MgJiBIRl9OTUlfTUFTSyk7CiB9CiAKLXN0YXRpYyB2b2lkIHN2bV9pbnRyX2Fzc2lzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW50IHN2bV9pbnRlcnJ1cHRfYWxsb3dlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7CiAJc3RydWN0IHZtY2IgKnZtY2IgPSBzdm0tPnZtY2I7Ci0JaW50IGludHJfdmVjdG9yID0gLTE7Ci0KLQlpZiAoKHZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbyAmIFNWTV9FVlRJTkpfVkFMSUQpICYmCi0JICAgICgodm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvICYgU1ZNX0VWVElOSl9UWVBFX01BU0spID09IDApKSB7Ci0JCWludHJfdmVjdG9yID0gdm1jYi0+Y29udHJvbC5leGl0X2ludF9pbmZvICYKLQkJCSAgICAgIFNWTV9FVlRJTkpfVkVDX01BU0s7Ci0JCXZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbyA9IDA7Ci0JCXN2bV9pbmplY3RfaXJxKHN2bSwgaW50cl92ZWN0b3IpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAodm1jYi0+Y29udHJvbC5pbnRfY3RsICYgVl9JUlFfTUFTSykKLQkJZ290byBvdXQ7Ci0KLQlpZiAoIWt2bV9jcHVfaGFzX2ludGVycnVwdCh2Y3B1KSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAobmVzdGVkX3N2bV9pbnRyKHN2bSkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCEoc3ZtLT52Y3B1LmFyY2guaGZsYWdzICYgSEZfR0lGX01BU0spKQotCQlnb3RvIG91dDsKLQotCWlmICghKHZtY2ItPnNhdmUucmZsYWdzICYgWDg2X0VGTEFHU19JRikgfHwKLQkgICAgKHZtY2ItPmNvbnRyb2wuaW50X3N0YXRlICYgU1ZNX0lOVEVSUlVQVF9TSEFET1dfTUFTSykgfHwKLQkgICAgKHZtY2ItPmNvbnRyb2wuZXZlbnRfaW5qICYgU1ZNX0VWVElOSl9WQUxJRCkpIHsKLQkJLyogdW5hYmxlIHRvIGRlbGl2ZXIgaXJxLCBzZXQgcGVuZGluZyBpcnEgKi8KLQkJc3ZtX3NldF92aW50cihzdm0pOwotCQlzdm1faW5qZWN0X2lycShzdm0sIDB4MCk7Ci0JCWdvdG8gb3V0OwotCX0KLQkvKiBPa2F5LCB3ZSBjYW4gZGVsaXZlciB0aGUgaW50ZXJydXB0OiBncmFiIGl0IGFuZCB1cGRhdGUgUElDIHN0YXRlLiAqLwotCWludHJfdmVjdG9yID0ga3ZtX2NwdV9nZXRfaW50ZXJydXB0KHZjcHUpOwotCXN2bV9pbmplY3RfaXJxKHN2bSwgaW50cl92ZWN0b3IpOwotb3V0OgotCXVwZGF0ZV9jcjhfaW50ZXJjZXB0KHZjcHUpOworCXJldHVybiAodm1jYi0+c2F2ZS5yZmxhZ3MgJiBYODZfRUZMQUdTX0lGKSAmJgorCQkhKHZtY2ItPmNvbnRyb2wuaW50X3N0YXRlICYgU1ZNX0lOVEVSUlVQVF9TSEFET1dfTUFTSykgJiYKKwkJKHN2bS0+dmNwdS5hcmNoLmhmbGFncyAmIEhGX0dJRl9NQVNLKTsKIH0KIAotc3RhdGljIHZvaWQga3ZtX3JlcHV0X2lycShzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKK3N0YXRpYyB2b2lkIGVuYWJsZV9pcnFfd2luZG93KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlzdHJ1Y3Qgdm1jYl9jb250cm9sX2FyZWEgKmNvbnRyb2wgPSAmc3ZtLT52bWNiLT5jb250cm9sOwotCi0JaWYgKChjb250cm9sLT5pbnRfY3RsICYgVl9JUlFfTUFTSykKLQkgICAgJiYgIWlycWNoaXBfaW5fa2VybmVsKHN2bS0+dmNwdS5rdm0pKSB7Ci0JCWNvbnRyb2wtPmludF9jdGwgJj0gflZfSVJRX01BU0s7Ci0JCXB1c2hfaXJxKCZzdm0tPnZjcHUsIGNvbnRyb2wtPmludF92ZWN0b3IpOwotCX0KLQotCXN2bS0+dmNwdS5hcmNoLmludGVycnVwdF93aW5kb3dfb3BlbiA9Ci0JCSEoY29udHJvbC0+aW50X3N0YXRlICYgU1ZNX0lOVEVSUlVQVF9TSEFET1dfTUFTSykgJiYKLQkJIChzdm0tPnZjcHUuYXJjaC5oZmxhZ3MgJiBIRl9HSUZfTUFTSyk7CisJc3ZtX3NldF92aW50cih0b19zdm0odmNwdSkpOworCXN2bV9pbmplY3RfaXJxKHRvX3N2bSh2Y3B1KSwgMHgwKTsKIH0KIAotc3RhdGljIHZvaWQgc3ZtX2RvX2luamVjdF92ZWN0b3Ioc3RydWN0IHZjcHVfc3ZtICpzdm0pCi17Ci0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gJnN2bS0+dmNwdTsKLQlpbnQgd29yZF9pbmRleCA9IF9fZmZzKHZjcHUtPmFyY2guaXJxX3N1bW1hcnkpOwotCWludCBiaXRfaW5kZXggPSBfX2Zmcyh2Y3B1LT5hcmNoLmlycV9wZW5kaW5nW3dvcmRfaW5kZXhdKTsKLQlpbnQgaXJxID0gd29yZF9pbmRleCAqIEJJVFNfUEVSX0xPTkcgKyBiaXRfaW5kZXg7Ci0KLQljbGVhcl9iaXQoYml0X2luZGV4LCAmdmNwdS0+YXJjaC5pcnFfcGVuZGluZ1t3b3JkX2luZGV4XSk7Ci0JaWYgKCF2Y3B1LT5hcmNoLmlycV9wZW5kaW5nW3dvcmRfaW5kZXhdKQotCQljbGVhcl9iaXQod29yZF9pbmRleCwgJnZjcHUtPmFyY2guaXJxX3N1bW1hcnkpOwotCXN2bV9pbmplY3RfaXJxKHN2bSwgaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZG9faW50ZXJydXB0X3JlcXVlc3RzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkgICAgICAgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCitzdGF0aWMgdm9pZCBlbmFibGVfbm1pX3dpbmRvdyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IHZjcHVfc3ZtICpzdm0gPSB0b19zdm0odmNwdSk7Ci0Jc3RydWN0IHZtY2JfY29udHJvbF9hcmVhICpjb250cm9sID0gJnN2bS0+dm1jYi0+Y29udHJvbDsKIAotCWlmIChuZXN0ZWRfc3ZtX2ludHIoc3ZtKSkKLQkJcmV0dXJuOworCWlmICgoc3ZtLT52Y3B1LmFyY2guaGZsYWdzICYgKEhGX05NSV9NQVNLIHwgSEZfSVJFVF9NQVNLKSkKKwkgICAgPT0gSEZfTk1JX01BU0spCisJCXJldHVybjsgLyogSVJFVCB3aWxsIGNhdXNlIGEgdm0gZXhpdCAqLwogCi0Jc3ZtLT52Y3B1LmFyY2guaW50ZXJydXB0X3dpbmRvd19vcGVuID0KLQkJKCEoY29udHJvbC0+aW50X3N0YXRlICYgU1ZNX0lOVEVSUlVQVF9TSEFET1dfTUFTSykgJiYKLQkJIChzdm0tPnZtY2ItPnNhdmUucmZsYWdzICYgWDg2X0VGTEFHU19JRikgJiYKLQkJIChzdm0tPnZjcHUuYXJjaC5oZmxhZ3MgJiBIRl9HSUZfTUFTSykpOwotCi0JaWYgKHN2bS0+dmNwdS5hcmNoLmludGVycnVwdF93aW5kb3dfb3BlbiAmJiBzdm0tPnZjcHUuYXJjaC5pcnFfc3VtbWFyeSkKLQkJLyoKLQkJICogSWYgaW50ZXJydXB0cyBlbmFibGVkLCBhbmQgbm90IGJsb2NrZWQgYnkgc3RpIG9yIG1vdiBzcy4gR29vZC4KLQkJICovCi0JCXN2bV9kb19pbmplY3RfdmVjdG9yKHN2bSk7Ci0KLQkvKgotCSAqIEludGVycnVwdHMgYmxvY2tlZC4gIFdhaXQgZm9yIHVuYmxvY2suCi0JICovCi0JaWYgKCFzdm0tPnZjcHUuYXJjaC5pbnRlcnJ1cHRfd2luZG93X29wZW4gJiYKLQkgICAgKHN2bS0+dmNwdS5hcmNoLmlycV9zdW1tYXJ5IHx8IGt2bV9ydW4tPnJlcXVlc3RfaW50ZXJydXB0X3dpbmRvdykpCi0JCXN2bV9zZXRfdmludHIoc3ZtKTsKLQllbHNlCi0JCXN2bV9jbGVhcl92aW50cihzdm0pOworCS8qIFNvbWV0aGluZyBwcmV2ZW50cyBOTUkgZnJvbSBiZWVuIGluamVjdGVkLiBTaW5nbGUgc3RlcCBvdmVyCisJICAgcG9zc2libGUgcHJvYmxlbSAoSVJFVCBvciBleGNlcHRpb24gaW5qZWN0aW9uIG9yIGludGVycnVwdAorCSAgIHNoYWRvdykgKi8KKwl2Y3B1LT5hcmNoLnNpbmdsZXN0ZXAgPSB0cnVlOworCXN2bS0+dm1jYi0+c2F2ZS5yZmxhZ3MgfD0gKFg4Nl9FRkxBR1NfVEYgfCBYODZfRUZMQUdTX1JGKTsKKwl1cGRhdGVfZGJfaW50ZXJjZXB0KHZjcHUpOwogfQogCiBzdGF0aWMgaW50IHN2bV9zZXRfdHNzX2FkZHIoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpbnQgYWRkcikKQEAgLTI0MDcsNyArMjQxNiw3IEBACiAKIAlpZiAoIShzdm0tPnZtY2ItPmNvbnRyb2wuaW50ZXJjZXB0X2NyX3dyaXRlICYgSU5URVJDRVBUX0NSOF9NQVNLKSkgewogCQlpbnQgY3I4ID0gc3ZtLT52bWNiLT5jb250cm9sLmludF9jdGwgJiBWX1RQUl9NQVNLOwotCQlrdm1fbGFwaWNfc2V0X3Rwcih2Y3B1LCBjcjgpOworCQlrdm1fc2V0X2NyOCh2Y3B1LCBjcjgpOwogCX0KIH0KIApAQCAtMjQxNiwxNCArMjQyNSw1NCBAQAogCXN0cnVjdCB2Y3B1X3N2bSAqc3ZtID0gdG9fc3ZtKHZjcHUpOwogCXU2NCBjcjg7CiAKLQlpZiAoIWlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkpCi0JCXJldHVybjsKLQogCWNyOCA9IGt2bV9nZXRfY3I4KHZjcHUpOwogCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRfY3RsICY9IH5WX1RQUl9NQVNLOwogCXN2bS0+dm1jYi0+Y29udHJvbC5pbnRfY3RsIHw9IGNyOCAmIFZfVFBSX01BU0s7CiB9CiAKK3N0YXRpYyB2b2lkIHN2bV9jb21wbGV0ZV9pbnRlcnJ1cHRzKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQoreworCXU4IHZlY3RvcjsKKwlpbnQgdHlwZTsKKwl1MzIgZXhpdGludGluZm8gPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mbzsKKworCWlmIChzdm0tPnZjcHUuYXJjaC5oZmxhZ3MgJiBIRl9JUkVUX01BU0spCisJCXN2bS0+dmNwdS5hcmNoLmhmbGFncyAmPSB+KEhGX05NSV9NQVNLIHwgSEZfSVJFVF9NQVNLKTsKKworCXN2bS0+dmNwdS5hcmNoLm5taV9pbmplY3RlZCA9IGZhbHNlOworCWt2bV9jbGVhcl9leGNlcHRpb25fcXVldWUoJnN2bS0+dmNwdSk7CisJa3ZtX2NsZWFyX2ludGVycnVwdF9xdWV1ZSgmc3ZtLT52Y3B1KTsKKworCWlmICghKGV4aXRpbnRpbmZvICYgU1ZNX0VYSVRJTlRJTkZPX1ZBTElEKSkKKwkJcmV0dXJuOworCisJdmVjdG9yID0gZXhpdGludGluZm8gJiBTVk1fRVhJVElOVElORk9fVkVDX01BU0s7CisJdHlwZSA9IGV4aXRpbnRpbmZvICYgU1ZNX0VYSVRJTlRJTkZPX1RZUEVfTUFTSzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1ZNX0VYSVRJTlRJTkZPX1RZUEVfTk1JOgorCQlzdm0tPnZjcHUuYXJjaC5ubWlfaW5qZWN0ZWQgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFNWTV9FWElUSU5USU5GT19UWVBFX0VYRVBUOgorCQkvKiBJbiBjYXNlIG9mIHNvZnR3YXJlIGV4Y2VwdGlvbiBkbyBub3QgcmVpbmplY3QgYW4gZXhjZXB0aW9uCisJCSAgIHZlY3RvciwgYnV0IHJlLWV4ZWN1dGUgYW5kIGluc3RydWN0aW9uIGluc3RlYWQgKi8KKwkJaWYgKGt2bV9leGNlcHRpb25faXNfc29mdCh2ZWN0b3IpKQorCQkJYnJlYWs7CisJCWlmIChleGl0aW50aW5mbyAmIFNWTV9FWElUSU5USU5GT19WQUxJRF9FUlIpIHsKKwkJCXUzMiBlcnIgPSBzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9pbnRfaW5mb19lcnI7CisJCQlrdm1fcXVldWVfZXhjZXB0aW9uX2UoJnN2bS0+dmNwdSwgdmVjdG9yLCBlcnIpOworCisJCX0gZWxzZQorCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbigmc3ZtLT52Y3B1LCB2ZWN0b3IpOworCQlicmVhazsKKwljYXNlIFNWTV9FWElUSU5USU5GT19UWVBFX0lOVFI6CisJCWt2bV9xdWV1ZV9pbnRlcnJ1cHQoJnN2bS0+dmNwdSwgdmVjdG9yLCBmYWxzZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwogI2lmZGVmIENPTkZJR19YODZfNjQKICNkZWZpbmUgUiAiciIKICNlbHNlCkBAIC0yNTUyLDYgKzI2MDEsOCBAQAogCXN5bmNfY3I4X3RvX2xhcGljKHZjcHUpOwogCiAJc3ZtLT5uZXh0X3JpcCA9IDA7CisKKwlzdm1fY29tcGxldGVfaW50ZXJydXB0cyhzdm0pOwogfQogCiAjdW5kZWYgUgpAQCAtMjYxNyw3ICsyNjY4LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW50IHN2bV9nZXRfbXRfbWFza19zaGlmdCh2b2lkKQorc3RhdGljIHU2NCBzdm1fZ2V0X210X21hc2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBnZm5fdCBnZm4sIGJvb2wgaXNfbW1pbykKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2NjcsMTcgKzI3MTgsMjEgQEAKIAkucnVuID0gc3ZtX3ZjcHVfcnVuLAogCS5oYW5kbGVfZXhpdCA9IGhhbmRsZV9leGl0LAogCS5za2lwX2VtdWxhdGVkX2luc3RydWN0aW9uID0gc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbiwKKwkuc2V0X2ludGVycnVwdF9zaGFkb3cgPSBzdm1fc2V0X2ludGVycnVwdF9zaGFkb3csCisJLmdldF9pbnRlcnJ1cHRfc2hhZG93ID0gc3ZtX2dldF9pbnRlcnJ1cHRfc2hhZG93LAogCS5wYXRjaF9oeXBlcmNhbGwgPSBzdm1fcGF0Y2hfaHlwZXJjYWxsLAotCS5nZXRfaXJxID0gc3ZtX2dldF9pcnEsCiAJLnNldF9pcnEgPSBzdm1fc2V0X2lycSwKKwkuc2V0X25taSA9IHN2bV9pbmplY3Rfbm1pLAogCS5xdWV1ZV9leGNlcHRpb24gPSBzdm1fcXVldWVfZXhjZXB0aW9uLAotCS5leGNlcHRpb25faW5qZWN0ZWQgPSBzdm1fZXhjZXB0aW9uX2luamVjdGVkLAotCS5pbmplY3RfcGVuZGluZ19pcnEgPSBzdm1faW50cl9hc3Npc3QsCi0JLmluamVjdF9wZW5kaW5nX3ZlY3RvcnMgPSBkb19pbnRlcnJ1cHRfcmVxdWVzdHMsCisJLmludGVycnVwdF9hbGxvd2VkID0gc3ZtX2ludGVycnVwdF9hbGxvd2VkLAorCS5ubWlfYWxsb3dlZCA9IHN2bV9ubWlfYWxsb3dlZCwKKwkuZW5hYmxlX25taV93aW5kb3cgPSBlbmFibGVfbm1pX3dpbmRvdywKKwkuZW5hYmxlX2lycV93aW5kb3cgPSBlbmFibGVfaXJxX3dpbmRvdywKKwkudXBkYXRlX2NyOF9pbnRlcmNlcHQgPSB1cGRhdGVfY3I4X2ludGVyY2VwdCwKIAogCS5zZXRfdHNzX2FkZHIgPSBzdm1fc2V0X3Rzc19hZGRyLAogCS5nZXRfdGRwX2xldmVsID0gZ2V0X25wdF9sZXZlbCwKLQkuZ2V0X210X21hc2tfc2hpZnQgPSBzdm1fZ2V0X210X21hc2tfc2hpZnQsCisJLmdldF9tdF9tYXNrID0gc3ZtX2dldF9tdF9tYXNrLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc3ZtX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS90aW1lci5jIGIvYXJjaC94ODYva3ZtL3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkYmFjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2t2bS90aW1lci5jCkBAIC0wLDAgKzEsNDYgQEAKKyNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t2bS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSAia3ZtX3RpbWVyLmgiCisKK3N0YXRpYyBpbnQgX19rdm1fdGltZXJfZm4oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3RpbWVyICprdGltZXIpCit7CisJaW50IHJlc3RhcnRfdGltZXIgPSAwOworCXdhaXRfcXVldWVfaGVhZF90ICpxID0gJnZjcHUtPndxOworCisJLyogRklYTUU6IHRoaXMgY29kZSBzaG91bGQgbm90IGtub3cgYW55dGhpbmcgYWJvdXQgdmNwdXMgKi8KKwlpZiAoIWF0b21pY19pbmNfYW5kX3Rlc3QoJmt0aW1lci0+cGVuZGluZykpCisJCXNldF9iaXQoS1ZNX1JFUV9QRU5ESU5HX1RJTUVSLCAmdmNwdS0+cmVxdWVzdHMpOworCisJaWYgKCFrdGltZXItPnJlaW5qZWN0KQorCQlhdG9taWNfc2V0KCZrdGltZXItPnBlbmRpbmcsIDEpOworCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUocSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShxKTsKKworCWlmIChrdGltZXItPnRfb3BzLT5pc19wZXJpb2RpYyhrdGltZXIpKSB7CisJCWhydGltZXJfYWRkX2V4cGlyZXNfbnMoJmt0aW1lci0+dGltZXIsIGt0aW1lci0+cGVyaW9kKTsKKwkJcmVzdGFydF90aW1lciA9IDE7CisJfQorCisJcmV0dXJuIHJlc3RhcnRfdGltZXI7Cit9CisKK2VudW0gaHJ0aW1lcl9yZXN0YXJ0IGt2bV90aW1lcl9mbihzdHJ1Y3QgaHJ0aW1lciAqZGF0YSkKK3sKKwlpbnQgcmVzdGFydF90aW1lcjsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CisJc3RydWN0IGt2bV90aW1lciAqa3RpbWVyID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBrdm1fdGltZXIsIHRpbWVyKTsKKworCXZjcHUgPSBrdGltZXItPmt2bS0+dmNwdXNba3RpbWVyLT52Y3B1X2lkXTsKKwlpZiAoIXZjcHUpCisJCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKKworCXJlc3RhcnRfdGltZXIgPSBfX2t2bV90aW1lcl9mbih2Y3B1LCBrdGltZXIpOworCWlmIChyZXN0YXJ0X3RpbWVyKQorCQlyZXR1cm4gSFJUSU1FUl9SRVNUQVJUOworCWVsc2UKKwkJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOworfQorCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vdm14LmMgYi9hcmNoL3g4Ni9rdm0vdm14LmMKaW5kZXggYmI0ODEzMy4uMzJkNmFlOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3ZteC5jCisrKyBiL2FyY2gveDg2L2t2bS92bXguYwpAQCAtMzIsMjYgKzMyLDI3IEBACiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vdm14Lmg+CiAjaW5jbHVkZSA8YXNtL3ZpcnRleHQuaD4KKyNpbmNsdWRlIDxhc20vbWNlLmg+CiAKICNkZWZpbmUgX19leCh4KSBfX2t2bV9oYW5kbGVfZmF1bHRfb25fcmVib290KHgpCiAKIE1PRFVMRV9BVVRIT1IoIlF1bXJhbmV0Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgYnlwYXNzX2d1ZXN0X3BmID0gMTsKLW1vZHVsZV9wYXJhbShieXBhc3NfZ3Vlc3RfcGYsIGJvb2wsIDApOworc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGJ5cGFzc19ndWVzdF9wZiA9IDE7Cittb2R1bGVfcGFyYW0oYnlwYXNzX2d1ZXN0X3BmLCBib29sLCBTX0lSVUdPKTsKIAotc3RhdGljIGludCBlbmFibGVfdnBpZCA9IDE7Ci1tb2R1bGVfcGFyYW0oZW5hYmxlX3ZwaWQsIGJvb2wsIDApOworc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGVuYWJsZV92cGlkID0gMTsKK21vZHVsZV9wYXJhbV9uYW1lZCh2cGlkLCBlbmFibGVfdnBpZCwgYm9vbCwgMDQ0NCk7CiAKLXN0YXRpYyBpbnQgZmxleHByaW9yaXR5X2VuYWJsZWQgPSAxOwotbW9kdWxlX3BhcmFtKGZsZXhwcmlvcml0eV9lbmFibGVkLCBib29sLCAwKTsKK3N0YXRpYyBpbnQgX19yZWFkX21vc3RseSBmbGV4cHJpb3JpdHlfZW5hYmxlZCA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoZmxleHByaW9yaXR5LCBmbGV4cHJpb3JpdHlfZW5hYmxlZCwgYm9vbCwgU19JUlVHTyk7CiAKLXN0YXRpYyBpbnQgZW5hYmxlX2VwdCA9IDE7Ci1tb2R1bGVfcGFyYW0oZW5hYmxlX2VwdCwgYm9vbCwgMCk7CitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgZW5hYmxlX2VwdCA9IDE7Cittb2R1bGVfcGFyYW1fbmFtZWQoZXB0LCBlbmFibGVfZXB0LCBib29sLCBTX0lSVUdPKTsKIAotc3RhdGljIGludCBlbXVsYXRlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUgPSAwOwotbW9kdWxlX3BhcmFtKGVtdWxhdGVfaW52YWxpZF9ndWVzdF9zdGF0ZSwgYm9vbCwgMCk7CitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgZW11bGF0ZV9pbnZhbGlkX2d1ZXN0X3N0YXRlID0gMDsKK21vZHVsZV9wYXJhbShlbXVsYXRlX2ludmFsaWRfZ3Vlc3Rfc3RhdGUsIGJvb2wsIFNfSVJVR08pOwogCiBzdHJ1Y3Qgdm1jcyB7CiAJdTMyIHJldmlzaW9uX2lkOwpAQCAtOTcsNiArOTgsNyBAQAogCWludCBzb2Z0X3ZubWlfYmxvY2tlZDsKIAlrdGltZV90IGVudHJ5X3RpbWU7CiAJczY0IHZubWlfYmxvY2tlZF90aW1lOworCXUzMiBleGl0X3JlYXNvbjsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHZjcHVfdm14ICp0b192bXgoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMTExLDkgKzExMywxMCBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB2bWNzICosIGN1cnJlbnRfdm1jcyk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgdmNwdXNfb25fY3B1KTsKIAotc3RhdGljIHN0cnVjdCBwYWdlICp2bXhfaW9fYml0bWFwX2E7Ci1zdGF0aWMgc3RydWN0IHBhZ2UgKnZteF9pb19iaXRtYXBfYjsKLXN0YXRpYyBzdHJ1Y3QgcGFnZSAqdm14X21zcl9iaXRtYXA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X2lvX2JpdG1hcF9hOworc3RhdGljIHVuc2lnbmVkIGxvbmcgKnZteF9pb19iaXRtYXBfYjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nICp2bXhfbXNyX2JpdG1hcF9sZWdhY3k7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAqdm14X21zcl9iaXRtYXBfbG9uZ21vZGU7CiAKIHN0YXRpYyBERUNMQVJFX0JJVE1BUCh2bXhfdnBpZF9iaXRtYXAsIFZNWF9OUl9WUElEUyk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZteF92cGlkX2xvY2spOwpAQCAtMjEzLDcwICsyMTYsNzggQEAKIAkJPT0gKElOVFJfVFlQRV9FWFRfSU5UUiB8IElOVFJfSU5GT19WQUxJRF9NQVNLKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgaXNfbWFjaGluZV9jaGVjayh1MzIgaW50cl9pbmZvKQoreworCXJldHVybiAoaW50cl9pbmZvICYgKElOVFJfSU5GT19JTlRSX1RZUEVfTUFTSyB8IElOVFJfSU5GT19WRUNUT1JfTUFTSyB8CisJCQkgICAgIElOVFJfSU5GT19WQUxJRF9NQVNLKSkgPT0KKwkJKElOVFJfVFlQRV9IQVJEX0VYQ0VQVElPTiB8IE1DX1ZFQ1RPUiB8IElOVFJfSU5GT19WQUxJRF9NQVNLKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgY3B1X2hhc192bXhfbXNyX2JpdG1hcCh2b2lkKQogewotCXJldHVybiAodm1jc19jb25maWcuY3B1X2Jhc2VkX2V4ZWNfY3RybCAmIENQVV9CQVNFRF9VU0VfTVNSX0JJVE1BUFMpOworCXJldHVybiB2bWNzX2NvbmZpZy5jcHVfYmFzZWRfZXhlY19jdHJsICYgQ1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUzsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3B1X2hhc192bXhfdHByX3NoYWRvdyh2b2lkKQogewotCXJldHVybiAodm1jc19jb25maWcuY3B1X2Jhc2VkX2V4ZWNfY3RybCAmIENQVV9CQVNFRF9UUFJfU0hBRE9XKTsKKwlyZXR1cm4gdm1jc19jb25maWcuY3B1X2Jhc2VkX2V4ZWNfY3RybCAmIENQVV9CQVNFRF9UUFJfU0hBRE9XOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB2bV9uZWVkX3Rwcl9zaGFkb3coc3RydWN0IGt2bSAqa3ZtKQogewotCXJldHVybiAoKGNwdV9oYXNfdm14X3Rwcl9zaGFkb3coKSkgJiYgKGlycWNoaXBfaW5fa2VybmVsKGt2bSkpKTsKKwlyZXR1cm4gKGNwdV9oYXNfdm14X3Rwcl9zaGFkb3coKSkgJiYgKGlycWNoaXBfaW5fa2VybmVsKGt2bSkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBjcHVfaGFzX3NlY29uZGFyeV9leGVjX2N0cmxzKHZvaWQpCiB7Ci0JcmV0dXJuICh2bWNzX2NvbmZpZy5jcHVfYmFzZWRfZXhlY19jdHJsICYKLQkJQ1BVX0JBU0VEX0FDVElWQVRFX1NFQ09OREFSWV9DT05UUk9MUyk7CisJcmV0dXJuIHZtY3NfY29uZmlnLmNwdV9iYXNlZF9leGVjX2N0cmwgJgorCQlDUFVfQkFTRURfQUNUSVZBVEVfU0VDT05EQVJZX0NPTlRST0xTOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgY3B1X2hhc192bXhfdmlydHVhbGl6ZV9hcGljX2FjY2Vzc2VzKHZvaWQpCiB7Ci0JcmV0dXJuIGZsZXhwcmlvcml0eV9lbmFibGVkCi0JCSYmICh2bWNzX2NvbmZpZy5jcHVfYmFzZWRfMm5kX2V4ZWNfY3RybCAmCi0JCSAgICBTRUNPTkRBUllfRVhFQ19WSVJUVUFMSVpFX0FQSUNfQUNDRVNTRVMpOworCXJldHVybiB2bWNzX2NvbmZpZy5jcHVfYmFzZWRfMm5kX2V4ZWNfY3RybCAmCisJCVNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfQVBJQ19BQ0NFU1NFUzsKK30KKworc3RhdGljIGlubGluZSBib29sIGNwdV9oYXNfdm14X2ZsZXhwcmlvcml0eSh2b2lkKQoreworCXJldHVybiBjcHVfaGFzX3ZteF90cHJfc2hhZG93KCkgJiYKKwkJY3B1X2hhc192bXhfdmlydHVhbGl6ZV9hcGljX2FjY2Vzc2VzKCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdV9oYXNfdm14X2ludmVwdF9pbmRpdmlkdWFsX2FkZHIodm9pZCkKIHsKLQlyZXR1cm4gKCEhKHZteF9jYXBhYmlsaXR5LmVwdCAmIFZNWF9FUFRfRVhURU5UX0lORElWSURVQUxfQklUKSk7CisJcmV0dXJuICEhKHZteF9jYXBhYmlsaXR5LmVwdCAmIFZNWF9FUFRfRVhURU5UX0lORElWSURVQUxfQklUKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3B1X2hhc192bXhfaW52ZXB0X2NvbnRleHQodm9pZCkKIHsKLQlyZXR1cm4gKCEhKHZteF9jYXBhYmlsaXR5LmVwdCAmIFZNWF9FUFRfRVhURU5UX0NPTlRFWFRfQklUKSk7CisJcmV0dXJuICEhKHZteF9jYXBhYmlsaXR5LmVwdCAmIFZNWF9FUFRfRVhURU5UX0NPTlRFWFRfQklUKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3B1X2hhc192bXhfaW52ZXB0X2dsb2JhbCh2b2lkKQogewotCXJldHVybiAoISEodm14X2NhcGFiaWxpdHkuZXB0ICYgVk1YX0VQVF9FWFRFTlRfR0xPQkFMX0JJVCkpOworCXJldHVybiAhISh2bXhfY2FwYWJpbGl0eS5lcHQgJiBWTVhfRVBUX0VYVEVOVF9HTE9CQUxfQklUKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3B1X2hhc192bXhfZXB0KHZvaWQpCiB7Ci0JcmV0dXJuICh2bWNzX2NvbmZpZy5jcHVfYmFzZWRfMm5kX2V4ZWNfY3RybCAmCi0JCVNFQ09OREFSWV9FWEVDX0VOQUJMRV9FUFQpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB2bV9uZWVkX2VwdCh2b2lkKQotewotCXJldHVybiAoY3B1X2hhc192bXhfZXB0KCkgJiYgZW5hYmxlX2VwdCk7CisJcmV0dXJuIHZtY3NfY29uZmlnLmNwdV9iYXNlZF8ybmRfZXhlY19jdHJsICYKKwkJU0VDT05EQVJZX0VYRUNfRU5BQkxFX0VQVDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgdm1fbmVlZF92aXJ0dWFsaXplX2FwaWNfYWNjZXNzZXMoc3RydWN0IGt2bSAqa3ZtKQogewotCXJldHVybiAoKGNwdV9oYXNfdm14X3ZpcnR1YWxpemVfYXBpY19hY2Nlc3NlcygpKSAmJgotCQkoaXJxY2hpcF9pbl9rZXJuZWwoa3ZtKSkpOworCXJldHVybiBmbGV4cHJpb3JpdHlfZW5hYmxlZCAmJgorCQkoY3B1X2hhc192bXhfdmlydHVhbGl6ZV9hcGljX2FjY2Vzc2VzKCkpICYmCisJCShpcnFjaGlwX2luX2tlcm5lbChrdm0pKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3B1X2hhc192bXhfdnBpZCh2b2lkKQogewotCXJldHVybiAodm1jc19jb25maWcuY3B1X2Jhc2VkXzJuZF9leGVjX2N0cmwgJgotCQlTRUNPTkRBUllfRVhFQ19FTkFCTEVfVlBJRCk7CisJcmV0dXJuIHZtY3NfY29uZmlnLmNwdV9iYXNlZF8ybmRfZXhlY19jdHJsICYKKwkJU0VDT05EQVJZX0VYRUNfRU5BQkxFX1ZQSUQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdV9oYXNfdmlydHVhbF9ubWlzKHZvaWQpCkBAIC0yODQsNiArMjk1LDExIEBACiAJcmV0dXJuIHZtY3NfY29uZmlnLnBpbl9iYXNlZF9leGVjX2N0cmwgJiBQSU5fQkFTRURfVklSVFVBTF9OTUlTOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgcmVwb3J0X2ZsZXhwcmlvcml0eSh2b2lkKQoreworCXJldHVybiBmbGV4cHJpb3JpdHlfZW5hYmxlZDsKK30KKwogc3RhdGljIGludCBfX2ZpbmRfbXNyX2luZGV4KHN0cnVjdCB2Y3B1X3ZteCAqdm14LCB1MzIgbXNyKQogewogCWludCBpOwpAQCAtMzgxLDcgKzM5Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlcHRfc3luY19jb250ZXh0KHU2NCBlcHRwKQogewotCWlmICh2bV9uZWVkX2VwdCgpKSB7CisJaWYgKGVuYWJsZV9lcHQpIHsKIAkJaWYgKGNwdV9oYXNfdm14X2ludmVwdF9jb250ZXh0KCkpCiAJCQlfX2ludmVwdChWTVhfRVBUX0VYVEVOVF9DT05URVhULCBlcHRwLCAwKTsKIAkJZWxzZQpAQCAtMzkxLDcgKzQwNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlcHRfc3luY19pbmRpdmlkdWFsX2FkZHIodTY0IGVwdHAsIGdwYV90IGdwYSkKIHsKLQlpZiAodm1fbmVlZF9lcHQoKSkgeworCWlmIChlbmFibGVfZXB0KSB7CiAJCWlmIChjcHVfaGFzX3ZteF9pbnZlcHRfaW5kaXZpZHVhbF9hZGRyKCkpCiAJCQlfX2ludmVwdChWTVhfRVBUX0VYVEVOVF9JTkRJVklEVUFMX0FERFIsCiAJCQkJCWVwdHAsIGdwYSk7CkBAIC00NzgsNyArNDk0LDcgQEAKIHsKIAl1MzIgZWI7CiAKLQllYiA9ICgxdSA8PCBQRl9WRUNUT1IpIHwgKDF1IDw8IFVEX1ZFQ1RPUik7CisJZWIgPSAoMXUgPDwgUEZfVkVDVE9SKSB8ICgxdSA8PCBVRF9WRUNUT1IpIHwgKDF1IDw8IE1DX1ZFQ1RPUik7CiAJaWYgKCF2Y3B1LT5mcHVfYWN0aXZlKQogCQllYiB8PSAxdSA8PCBOTV9WRUNUT1I7CiAJaWYgKHZjcHUtPmd1ZXN0X2RlYnVnICYgS1ZNX0dVRVNUREJHX0VOQUJMRSkgewpAQCAtNDg4LDkgKzUwNCw5IEBACiAJCWlmICh2Y3B1LT5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19VU0VfU1dfQlApCiAJCQllYiB8PSAxdSA8PCBCUF9WRUNUT1I7CiAJfQotCWlmICh2Y3B1LT5hcmNoLnJtb2RlLmFjdGl2ZSkKKwlpZiAodmNwdS0+YXJjaC5ybW9kZS52bTg2X2FjdGl2ZSkKIAkJZWIgPSB+MDsKLQlpZiAodm1fbmVlZF9lcHQoKSkKKwlpZiAoZW5hYmxlX2VwdCkKIAkJZWIgJj0gfigxdSA8PCBQRl9WRUNUT1IpOyAvKiBieXBhc3NfZ3Vlc3RfcGYgPSAwICovCiAJdm1jc193cml0ZTMyKEVYQ0VQVElPTl9CSVRNQVAsIGViKTsKIH0KQEAgLTcyNCwyOSArNzQwLDUwIEBACiAKIHN0YXRpYyB2b2lkIHZteF9zZXRfcmZsYWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyByZmxhZ3MpCiB7Ci0JaWYgKHZjcHUtPmFyY2gucm1vZGUuYWN0aXZlKQorCWlmICh2Y3B1LT5hcmNoLnJtb2RlLnZtODZfYWN0aXZlKQogCQlyZmxhZ3MgfD0gWDg2X0VGTEFHU19JT1BMIHwgWDg2X0VGTEFHU19WTTsKIAl2bWNzX3dyaXRlbChHVUVTVF9SRkxBR1MsIHJmbGFncyk7CiB9CiAKK3N0YXRpYyB1MzIgdm14X2dldF9pbnRlcnJ1cHRfc2hhZG93KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IG1hc2spCit7CisJdTMyIGludGVycnVwdGliaWxpdHkgPSB2bWNzX3JlYWQzMihHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8pOworCWludCByZXQgPSAwOworCisJaWYgKGludGVycnVwdGliaWxpdHkgJiBHVUVTVF9JTlRSX1NUQVRFX1NUSSkKKwkJcmV0IHw9IFg4Nl9TSEFET1dfSU5UX1NUSTsKKwlpZiAoaW50ZXJydXB0aWJpbGl0eSAmIEdVRVNUX0lOVFJfU1RBVEVfTU9WX1NTKQorCQlyZXQgfD0gWDg2X1NIQURPV19JTlRfTU9WX1NTOworCisJcmV0dXJuIHJldCAmIG1hc2s7Cit9CisKK3N0YXRpYyB2b2lkIHZteF9zZXRfaW50ZXJydXB0X3NoYWRvdyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBtYXNrKQoreworCXUzMiBpbnRlcnJ1cHRpYmlsaXR5X29sZCA9IHZtY3NfcmVhZDMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTyk7CisJdTMyIGludGVycnVwdGliaWxpdHkgPSBpbnRlcnJ1cHRpYmlsaXR5X29sZDsKKworCWludGVycnVwdGliaWxpdHkgJj0gfihHVUVTVF9JTlRSX1NUQVRFX1NUSSB8IEdVRVNUX0lOVFJfU1RBVEVfTU9WX1NTKTsKKworCWlmIChtYXNrICYgWDg2X1NIQURPV19JTlRfTU9WX1NTKQorCQlpbnRlcnJ1cHRpYmlsaXR5IHw9IEdVRVNUX0lOVFJfU1RBVEVfTU9WX1NTOworCWlmIChtYXNrICYgWDg2X1NIQURPV19JTlRfU1RJKQorCQlpbnRlcnJ1cHRpYmlsaXR5IHw9IEdVRVNUX0lOVFJfU1RBVEVfU1RJOworCisJaWYgKChpbnRlcnJ1cHRpYmlsaXR5ICE9IGludGVycnVwdGliaWxpdHlfb2xkKSkKKwkJdm1jc193cml0ZTMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTywgaW50ZXJydXB0aWJpbGl0eSk7Cit9CisKIHN0YXRpYyB2b2lkIHNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXVuc2lnbmVkIGxvbmcgcmlwOwotCXUzMiBpbnRlcnJ1cHRpYmlsaXR5OwogCiAJcmlwID0ga3ZtX3JpcF9yZWFkKHZjcHUpOwogCXJpcCArPSB2bWNzX3JlYWQzMihWTV9FWElUX0lOU1RSVUNUSU9OX0xFTik7CiAJa3ZtX3JpcF93cml0ZSh2Y3B1LCByaXApOwogCi0JLyoKLQkgKiBXZSBlbXVsYXRlZCBhbiBpbnN0cnVjdGlvbiwgc28gdGVtcG9yYXJ5IGludGVycnVwdCBibG9ja2luZwotCSAqIHNob3VsZCBiZSByZW1vdmVkLCBpZiBzZXQuCi0JICovCi0JaW50ZXJydXB0aWJpbGl0eSA9IHZtY3NfcmVhZDMyKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTyk7Ci0JaWYgKGludGVycnVwdGliaWxpdHkgJiAzKQotCQl2bWNzX3dyaXRlMzIoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLAotCQkJICAgICBpbnRlcnJ1cHRpYmlsaXR5ICYgfjMpOwotCXZjcHUtPmFyY2guaW50ZXJydXB0X3dpbmRvd19vcGVuID0gMTsKKwkvKiBza2lwcGluZyBhbiBlbXVsYXRlZCBpbnN0cnVjdGlvbiBhbHNvIGNvdW50cyAqLworCXZteF9zZXRfaW50ZXJydXB0X3NoYWRvdyh2Y3B1LCAwKTsKIH0KIAogc3RhdGljIHZvaWQgdm14X3F1ZXVlX2V4Y2VwdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIG5yLApAQCAtNzYwLDcgKzc5Nyw3IEBACiAJCWludHJfaW5mbyB8PSBJTlRSX0lORk9fREVMSVZFUl9DT0RFX01BU0s7CiAJfQogCi0JaWYgKHZjcHUtPmFyY2gucm1vZGUuYWN0aXZlKSB7CisJaWYgKHZjcHUtPmFyY2gucm1vZGUudm04Nl9hY3RpdmUpIHsKIAkJdm14LT5ybW9kZS5pcnEucGVuZGluZyA9IHRydWU7CiAJCXZteC0+cm1vZGUuaXJxLnZlY3RvciA9IG5yOwogCQl2bXgtPnJtb2RlLmlycS5yaXAgPSBrdm1fcmlwX3JlYWQodmNwdSk7CkBAIC03NzMsOCArODEwLDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChuciA9PSBCUF9WRUNUT1IgfHwgbnIgPT0gT0ZfVkVDVE9SKSB7Ci0JCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9JTlNUUlVDVElPTl9MRU4sIDEpOworCWlmIChrdm1fZXhjZXB0aW9uX2lzX3NvZnQobnIpKSB7CisJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9JTlNUUlVDVElPTl9MRU4sCisJCQkgICAgIHZteC0+dmNwdS5hcmNoLmV2ZW50X2V4aXRfaW5zdF9sZW4pOwogCQlpbnRyX2luZm8gfD0gSU5UUl9UWVBFX1NPRlRfRVhDRVBUSU9OOwogCX0gZWxzZQogCQlpbnRyX2luZm8gfD0gSU5UUl9UWVBFX0hBUkRfRVhDRVBUSU9OOwpAQCAtNzgyLDExICs4MjAsNiBAQAogCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9JTlRSX0lORk9fRklFTEQsIGludHJfaW5mbyk7CiB9CiAKLXN0YXRpYyBib29sIHZteF9leGNlcHRpb25faW5qZWN0ZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXJldHVybiBmYWxzZTsKLX0KLQogLyoKICAqIFN3YXAgTVNSIGVudHJ5IGluIGhvc3QvZ3Vlc3QgTVNSIGVudHJ5IGFycmF5LgogICovCkBAIC04MTIsNiArODQ1LDcgQEAKIHN0YXRpYyB2b2lkIHNldHVwX21zcnMoc3RydWN0IHZjcHVfdm14ICp2bXgpCiB7CiAJaW50IHNhdmVfbm1zcnM7CisJdW5zaWduZWQgbG9uZyAqbXNyX2JpdG1hcDsKIAogCXZteF9sb2FkX2hvc3Rfc3RhdGUodm14KTsKIAlzYXZlX25tc3JzID0gMDsKQEAgLTg0Nyw2ICs4ODEsMTUgQEAKIAkJX19maW5kX21zcl9pbmRleCh2bXgsIE1TUl9LRVJORUxfR1NfQkFTRSk7CiAjZW5kaWYKIAl2bXgtPm1zcl9vZmZzZXRfZWZlciA9IF9fZmluZF9tc3JfaW5kZXgodm14LCBNU1JfRUZFUik7CisKKwlpZiAoY3B1X2hhc192bXhfbXNyX2JpdG1hcCgpKSB7CisJCWlmIChpc19sb25nX21vZGUoJnZteC0+dmNwdSkpCisJCQltc3JfYml0bWFwID0gdm14X21zcl9iaXRtYXBfbG9uZ21vZGU7CisJCWVsc2UKKwkJCW1zcl9iaXRtYXAgPSB2bXhfbXNyX2JpdG1hcF9sZWdhY3k7CisKKwkJdm1jc193cml0ZTY0KE1TUl9CSVRNQVAsIF9fcGEobXNyX2JpdG1hcCkpOworCX0KIH0KIAogLyoKQEAgLTEwMzQsMTMgKzEwNzcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZteF9nZXRfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlpZiAoIXZjcHUtPmFyY2guaW50ZXJydXB0LnBlbmRpbmcpCi0JCXJldHVybiAtMTsKLQlyZXR1cm4gdmNwdS0+YXJjaC5pbnRlcnJ1cHQubnI7Ci19Ci0KIHN0YXRpYyBfX2luaXQgaW50IGNwdV9oYXNfa3ZtX3N1cHBvcnQodm9pZCkKIHsKIAlyZXR1cm4gY3B1X2hhc192bXgoKTsKQEAgLTEyOTQsNiArMTMzMCwxOCBAQAogCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTlgpKQogCQlrdm1fZW5hYmxlX2VmZXJfYml0cyhFRkVSX05YKTsKIAorCWlmICghY3B1X2hhc192bXhfdnBpZCgpKQorCQllbmFibGVfdnBpZCA9IDA7CisKKwlpZiAoIWNwdV9oYXNfdm14X2VwdCgpKQorCQllbmFibGVfZXB0ID0gMDsKKworCWlmICghY3B1X2hhc192bXhfZmxleHByaW9yaXR5KCkpCisJCWZsZXhwcmlvcml0eV9lbmFibGVkID0gMDsKKworCWlmICghY3B1X2hhc192bXhfdHByX3NoYWRvdygpKQorCQlrdm1feDg2X29wcy0+dXBkYXRlX2NyOF9pbnRlcmNlcHQgPSBOVUxMOworCiAJcmV0dXJuIGFsbG9jX2t2bV9hcmVhKCk7CiB9CiAKQEAgLTEzMjQsNyArMTM3Miw3IEBACiAJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CiAKIAl2bXgtPmVtdWxhdGlvbl9yZXF1aXJlZCA9IDE7Ci0JdmNwdS0+YXJjaC5ybW9kZS5hY3RpdmUgPSAwOworCXZjcHUtPmFyY2gucm1vZGUudm04Nl9hY3RpdmUgPSAwOwogCiAJdm1jc193cml0ZWwoR1VFU1RfVFJfQkFTRSwgdmNwdS0+YXJjaC5ybW9kZS50ci5iYXNlKTsKIAl2bWNzX3dyaXRlMzIoR1VFU1RfVFJfTElNSVQsIHZjcHUtPmFyY2gucm1vZGUudHIubGltaXQpOwpAQCAtMTM4Niw3ICsxNDM0LDcgQEAKIAlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKIAogCXZteC0+ZW11bGF0aW9uX3JlcXVpcmVkID0gMTsKLQl2Y3B1LT5hcmNoLnJtb2RlLmFjdGl2ZSA9IDE7CisJdmNwdS0+YXJjaC5ybW9kZS52bTg2X2FjdGl2ZSA9IDE7CiAKIAl2Y3B1LT5hcmNoLnJtb2RlLnRyLmJhc2UgPSB2bWNzX3JlYWRsKEdVRVNUX1RSX0JBU0UpOwogCXZtY3Nfd3JpdGVsKEdVRVNUX1RSX0JBU0UsIHJtb2RlX3Rzc19iYXNlKHZjcHUtPmt2bSkpOwpAQCAtMTQ4NSw3ICsxNTMzLDcgQEAKIHN0YXRpYyB2b2lkIHZteF9mbHVzaF90bGIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXZwaWRfc3luY192Y3B1X2FsbCh0b192bXgodmNwdSkpOwotCWlmICh2bV9uZWVkX2VwdCgpKQorCWlmIChlbmFibGVfZXB0KQogCQllcHRfc3luY19jb250ZXh0KGNvbnN0cnVjdF9lcHRwKHZjcHUtPmFyY2gubW11LnJvb3RfaHBhKSk7CiB9CiAKQEAgLTE1NTUsMTAgKzE2MDMsMTAgQEAKIAogCXZteF9mcHVfZGVhY3RpdmF0ZSh2Y3B1KTsKIAotCWlmICh2Y3B1LT5hcmNoLnJtb2RlLmFjdGl2ZSAmJiAoY3IwICYgWDg2X0NSMF9QRSkpCisJaWYgKHZjcHUtPmFyY2gucm1vZGUudm04Nl9hY3RpdmUgJiYgKGNyMCAmIFg4Nl9DUjBfUEUpKQogCQllbnRlcl9wbW9kZSh2Y3B1KTsKIAotCWlmICghdmNwdS0+YXJjaC5ybW9kZS5hY3RpdmUgJiYgIShjcjAgJiBYODZfQ1IwX1BFKSkKKwlpZiAoIXZjcHUtPmFyY2gucm1vZGUudm04Nl9hY3RpdmUgJiYgIShjcjAgJiBYODZfQ1IwX1BFKSkKIAkJZW50ZXJfcm1vZGUodmNwdSk7CiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC0xNTcwLDcgKzE2MTgsNyBAQAogCX0KICNlbmRpZgogCi0JaWYgKHZtX25lZWRfZXB0KCkpCisJaWYgKGVuYWJsZV9lcHQpCiAJCWVwdF91cGRhdGVfcGFnaW5nX21vZGVfY3IwKCZod19jcjAsIGNyMCwgdmNwdSk7CiAKIAl2bWNzX3dyaXRlbChDUjBfUkVBRF9TSEFET1csIGNyMCk7CkBAIC0xNTk5LDcgKzE2NDcsNyBAQAogCXU2NCBlcHRwOwogCiAJZ3Vlc3RfY3IzID0gY3IzOwotCWlmICh2bV9uZWVkX2VwdCgpKSB7CisJaWYgKGVuYWJsZV9lcHQpIHsKIAkJZXB0cCA9IGNvbnN0cnVjdF9lcHRwKGNyMyk7CiAJCXZtY3Nfd3JpdGU2NChFUFRfUE9JTlRFUiwgZXB0cCk7CiAJCWVwdF9zeW5jX2NvbnRleHQoZXB0cCk7CkBAIC0xNjE2LDExICsxNjY0LDExIEBACiAKIHN0YXRpYyB2b2lkIHZteF9zZXRfY3I0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBjcjQpCiB7Ci0JdW5zaWduZWQgbG9uZyBod19jcjQgPSBjcjQgfCAodmNwdS0+YXJjaC5ybW9kZS5hY3RpdmUgPworCXVuc2lnbmVkIGxvbmcgaHdfY3I0ID0gY3I0IHwgKHZjcHUtPmFyY2gucm1vZGUudm04Nl9hY3RpdmUgPwogCQkgICAgS1ZNX1JNT0RFX1ZNX0NSNF9BTFdBWVNfT04gOiBLVk1fUE1PREVfVk1fQ1I0X0FMV0FZU19PTik7CiAKIAl2Y3B1LT5hcmNoLmNyNCA9IGNyNDsKLQlpZiAodm1fbmVlZF9lcHQoKSkKKwlpZiAoZW5hYmxlX2VwdCkKIAkJZXB0X3VwZGF0ZV9wYWdpbmdfbW9kZV9jcjQoJmh3X2NyNCwgdmNwdSk7CiAKIAl2bWNzX3dyaXRlbChDUjRfUkVBRF9TSEFET1csIGNyNCk7CkBAIC0xNjk5LDcgKzE3NDcsNyBAQAogCXN0cnVjdCBrdm1fdm14X3NlZ21lbnRfZmllbGQgKnNmID0gJmt2bV92bXhfc2VnbWVudF9maWVsZHNbc2VnXTsKIAl1MzIgYXI7CiAKLQlpZiAodmNwdS0+YXJjaC5ybW9kZS5hY3RpdmUgJiYgc2VnID09IFZDUFVfU1JFR19UUikgeworCWlmICh2Y3B1LT5hcmNoLnJtb2RlLnZtODZfYWN0aXZlICYmIHNlZyA9PSBWQ1BVX1NSRUdfVFIpIHsKIAkJdmNwdS0+YXJjaC5ybW9kZS50ci5zZWxlY3RvciA9IHZhci0+c2VsZWN0b3I7CiAJCXZjcHUtPmFyY2gucm1vZGUudHIuYmFzZSA9IHZhci0+YmFzZTsKIAkJdmNwdS0+YXJjaC5ybW9kZS50ci5saW1pdCA9IHZhci0+bGltaXQ7CkBAIC0xNzA5LDcgKzE3NTcsNyBAQAogCXZtY3Nfd3JpdGVsKHNmLT5iYXNlLCB2YXItPmJhc2UpOwogCXZtY3Nfd3JpdGUzMihzZi0+bGltaXQsIHZhci0+bGltaXQpOwogCXZtY3Nfd3JpdGUxNihzZi0+c2VsZWN0b3IsIHZhci0+c2VsZWN0b3IpOwotCWlmICh2Y3B1LT5hcmNoLnJtb2RlLmFjdGl2ZSAmJiB2YXItPnMpIHsKKwlpZiAodmNwdS0+YXJjaC5ybW9kZS52bTg2X2FjdGl2ZSAmJiB2YXItPnMpIHsKIAkJLyoKIAkJICogSGFjayByZWFsLW1vZGUgc2VnbWVudHMgaW50byB2bTg2IGNvbXBhdGliaWxpdHkuCiAJCSAqLwpAQCAtMTk4Miw3ICsyMDMwLDcgQEAKIAlwZm5fdCBpZGVudGl0eV9tYXBfcGZuOwogCXUzMiB0bXA7CiAKLQlpZiAoIXZtX25lZWRfZXB0KCkpCisJaWYgKCFlbmFibGVfZXB0KQogCQlyZXR1cm4gMTsKIAlpZiAodW5saWtlbHkoIWt2bS0+YXJjaC5lcHRfaWRlbnRpdHlfcGFnZXRhYmxlKSkgewogCQlwcmludGsoS0VSTl9FUlIgIkVQVDogaWRlbnRpdHktbWFwcGluZyBwYWdldGFibGUgIgpAQCAtMjA3MSw3ICsyMTE5LDcgQEAKIAlpbnQgdnBpZDsKIAogCXZteC0+dnBpZCA9IDA7Ci0JaWYgKCFlbmFibGVfdnBpZCB8fCAhY3B1X2hhc192bXhfdnBpZCgpKQorCWlmICghZW5hYmxlX3ZwaWQpCiAJCXJldHVybjsKIAlzcGluX2xvY2soJnZteF92cGlkX2xvY2spOwogCXZwaWQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KHZteF92cGlkX2JpdG1hcCwgVk1YX05SX1ZQSURTKTsKQEAgLTIwODIsOSArMjEzMCw5IEBACiAJc3Bpbl91bmxvY2soJnZteF92cGlkX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCB2bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcihzdHJ1Y3QgcGFnZSAqbXNyX2JpdG1hcCwgdTMyIG1zcikKK3N0YXRpYyB2b2lkIF9fdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3IodW5zaWduZWQgbG9uZyAqbXNyX2JpdG1hcCwgdTMyIG1zcikKIHsKLQl2b2lkICp2YTsKKwlpbnQgZiA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKIAogCWlmICghY3B1X2hhc192bXhfbXNyX2JpdG1hcCgpKQogCQlyZXR1cm47CkBAIC0yMDk0LDE2ICsyMTQyLDIxIEBACiAJICogaGF2ZSB0aGUgd3JpdGUtbG93IGFuZCByZWFkLWhpZ2ggYml0bWFwIG9mZnNldHMgdGhlIHdyb25nIHdheSByb3VuZC4KIAkgKiBXZSBjYW4gY29udHJvbCBNU1JzIDB4MDAwMDAwMDAtMHgwMDAwMWZmZiBhbmQgMHhjMDAwMDAwMC0weGMwMDAxZmZmLgogCSAqLwotCXZhID0ga21hcChtc3JfYml0bWFwKTsKIAlpZiAobXNyIDw9IDB4MWZmZikgewotCQlfX2NsZWFyX2JpdChtc3IsIHZhICsgMHgwMDApOyAvKiByZWFkLWxvdyAqLwotCQlfX2NsZWFyX2JpdChtc3IsIHZhICsgMHg4MDApOyAvKiB3cml0ZS1sb3cgKi8KKwkJX19jbGVhcl9iaXQobXNyLCBtc3JfYml0bWFwICsgMHgwMDAgLyBmKTsgLyogcmVhZC1sb3cgKi8KKwkJX19jbGVhcl9iaXQobXNyLCBtc3JfYml0bWFwICsgMHg4MDAgLyBmKTsgLyogd3JpdGUtbG93ICovCiAJfSBlbHNlIGlmICgobXNyID49IDB4YzAwMDAwMDApICYmIChtc3IgPD0gMHhjMDAwMWZmZikpIHsKIAkJbXNyICY9IDB4MWZmZjsKLQkJX19jbGVhcl9iaXQobXNyLCB2YSArIDB4NDAwKTsgLyogcmVhZC1oaWdoICovCi0JCV9fY2xlYXJfYml0KG1zciwgdmEgKyAweGMwMCk7IC8qIHdyaXRlLWhpZ2ggKi8KKwkJX19jbGVhcl9iaXQobXNyLCBtc3JfYml0bWFwICsgMHg0MDAgLyBmKTsgLyogcmVhZC1oaWdoICovCisJCV9fY2xlYXJfYml0KG1zciwgbXNyX2JpdG1hcCArIDB4YzAwIC8gZik7IC8qIHdyaXRlLWhpZ2ggKi8KIAl9Ci0Ja3VubWFwKG1zcl9iaXRtYXApOworfQorCitzdGF0aWMgdm9pZCB2bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih1MzIgbXNyLCBib29sIGxvbmdtb2RlX29ubHkpCit7CisJaWYgKCFsb25nbW9kZV9vbmx5KQorCQlfX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xlZ2FjeSwgbXNyKTsKKwlfX3ZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwX2xvbmdtb2RlLCBtc3IpOwogfQogCiAvKgpAQCAtMjEyMSwxMSArMjE3NCwxMSBAQAogCXUzMiBleGVjX2NvbnRyb2w7CiAKIAkvKiBJL08gKi8KLQl2bWNzX3dyaXRlNjQoSU9fQklUTUFQX0EsIHBhZ2VfdG9fcGh5cyh2bXhfaW9fYml0bWFwX2EpKTsKLQl2bWNzX3dyaXRlNjQoSU9fQklUTUFQX0IsIHBhZ2VfdG9fcGh5cyh2bXhfaW9fYml0bWFwX2IpKTsKKwl2bWNzX3dyaXRlNjQoSU9fQklUTUFQX0EsIF9fcGEodm14X2lvX2JpdG1hcF9hKSk7CisJdm1jc193cml0ZTY0KElPX0JJVE1BUF9CLCBfX3BhKHZteF9pb19iaXRtYXBfYikpOwogCiAJaWYgKGNwdV9oYXNfdm14X21zcl9iaXRtYXAoKSkKLQkJdm1jc193cml0ZTY0KE1TUl9CSVRNQVAsIHBhZ2VfdG9fcGh5cyh2bXhfbXNyX2JpdG1hcCkpOworCQl2bWNzX3dyaXRlNjQoTVNSX0JJVE1BUCwgX19wYSh2bXhfbXNyX2JpdG1hcF9sZWdhY3kpKTsKIAogCXZtY3Nfd3JpdGU2NChWTUNTX0xJTktfUE9JTlRFUiwgLTF1bGwpOyAvKiAyMi4zLjEuNSAqLwogCkBAIC0yMTQxLDcgKzIxOTQsNyBAQAogCQkJCUNQVV9CQVNFRF9DUjhfTE9BRF9FWElUSU5HOwogI2VuZGlmCiAJfQotCWlmICghdm1fbmVlZF9lcHQoKSkKKwlpZiAoIWVuYWJsZV9lcHQpCiAJCWV4ZWNfY29udHJvbCB8PSBDUFVfQkFTRURfQ1IzX1NUT1JFX0VYSVRJTkcgfAogCQkJCUNQVV9CQVNFRF9DUjNfTE9BRF9FWElUSU5HICB8CiAJCQkJQ1BVX0JBU0VEX0lOVkxQR19FWElUSU5HOwpAQCAtMjE1NCw3ICsyMjA3LDcgQEAKIAkJCQl+U0VDT05EQVJZX0VYRUNfVklSVFVBTElaRV9BUElDX0FDQ0VTU0VTOwogCQlpZiAodm14LT52cGlkID09IDApCiAJCQlleGVjX2NvbnRyb2wgJj0gflNFQ09OREFSWV9FWEVDX0VOQUJMRV9WUElEOwotCQlpZiAoIXZtX25lZWRfZXB0KCkpCisJCWlmICghZW5hYmxlX2VwdCkKIAkJCWV4ZWNfY29udHJvbCAmPSB+U0VDT05EQVJZX0VYRUNfRU5BQkxFX0VQVDsKIAkJdm1jc193cml0ZTMyKFNFQ09OREFSWV9WTV9FWEVDX0NPTlRST0wsIGV4ZWNfY29udHJvbCk7CiAJfQpAQCAtMjI3Myw3ICsyMzI2LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jdm14LT52Y3B1LmFyY2gucm1vZGUuYWN0aXZlID0gMDsKKwl2bXgtPnZjcHUuYXJjaC5ybW9kZS52bTg2X2FjdGl2ZSA9IDA7CiAKIAl2bXgtPnNvZnRfdm5taV9ibG9ja2VkID0gMDsKIApAQCAtMjQwMiwxNCArMjQ1NSwxNiBAQAogCXZtY3Nfd3JpdGUzMihDUFVfQkFTRURfVk1fRVhFQ19DT05UUk9MLCBjcHVfYmFzZWRfdm1fZXhlY19jb250cm9sKTsKIH0KIAotc3RhdGljIHZvaWQgdm14X2luamVjdF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgaXJxKQorc3RhdGljIHZvaWQgdm14X2luamVjdF9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCXN0cnVjdCB2Y3B1X3ZteCAqdm14ID0gdG9fdm14KHZjcHUpOworCXVpbnQzMl90IGludHI7CisJaW50IGlycSA9IHZjcHUtPmFyY2guaW50ZXJydXB0Lm5yOwogCiAJS1ZNVFJBQ0VfMUQoSU5KX1ZJUlEsIHZjcHUsICh1MzIpaXJxLCBoYW5kbGVyKTsKIAogCSsrdmNwdS0+c3RhdC5pcnFfaW5qZWN0aW9uczsKLQlpZiAodmNwdS0+YXJjaC5ybW9kZS5hY3RpdmUpIHsKKwlpZiAodmNwdS0+YXJjaC5ybW9kZS52bTg2X2FjdGl2ZSkgewogCQl2bXgtPnJtb2RlLmlycS5wZW5kaW5nID0gdHJ1ZTsKIAkJdm14LT5ybW9kZS5pcnEudmVjdG9yID0gaXJxOwogCQl2bXgtPnJtb2RlLmlycS5yaXAgPSBrdm1fcmlwX3JlYWQodmNwdSk7CkBAIC0yNDE5LDggKzI0NzQsMTQgQEAKIAkJa3ZtX3JpcF93cml0ZSh2Y3B1LCB2bXgtPnJtb2RlLmlycS5yaXAgLSAxKTsKIAkJcmV0dXJuOwogCX0KLQl2bWNzX3dyaXRlMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxELAotCQkJaXJxIHwgSU5UUl9UWVBFX0VYVF9JTlRSIHwgSU5UUl9JTkZPX1ZBTElEX01BU0spOworCWludHIgPSBpcnEgfCBJTlRSX0lORk9fVkFMSURfTUFTSzsKKwlpZiAodmNwdS0+YXJjaC5pbnRlcnJ1cHQuc29mdCkgeworCQlpbnRyIHw9IElOVFJfVFlQRV9TT0ZUX0lOVFI7CisJCXZtY3Nfd3JpdGUzMihWTV9FTlRSWV9JTlNUUlVDVElPTl9MRU4sCisJCQkgICAgIHZteC0+dmNwdS5hcmNoLmV2ZW50X2V4aXRfaW5zdF9sZW4pOworCX0gZWxzZQorCQlpbnRyIHw9IElOVFJfVFlQRV9FWFRfSU5UUjsKKwl2bWNzX3dyaXRlMzIoVk1fRU5UUllfSU5UUl9JTkZPX0ZJRUxELCBpbnRyKTsKIH0KIAogc3RhdGljIHZvaWQgdm14X2luamVjdF9ubWkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMjQ0MSw3ICsyNTAyLDcgQEAKIAl9CiAKIAkrK3ZjcHUtPnN0YXQubm1pX2luamVjdGlvbnM7Ci0JaWYgKHZjcHUtPmFyY2gucm1vZGUuYWN0aXZlKSB7CisJaWYgKHZjcHUtPmFyY2gucm1vZGUudm04Nl9hY3RpdmUpIHsKIAkJdm14LT5ybW9kZS5pcnEucGVuZGluZyA9IHRydWU7CiAJCXZteC0+cm1vZGUuaXJxLnZlY3RvciA9IE5NSV9WRUNUT1I7CiAJCXZteC0+cm1vZGUuaXJxLnJpcCA9IGt2bV9yaXBfcmVhZCh2Y3B1KTsKQEAgLTI0NTYsNzYgKzI1MTcsMjEgQEAKIAkJCUlOVFJfVFlQRV9OTUlfSU5UUiB8IElOVFJfSU5GT19WQUxJRF9NQVNLIHwgTk1JX1ZFQ1RPUik7CiB9CiAKLXN0YXRpYyB2b2lkIHZteF91cGRhdGVfd2luZG93X3N0YXRlcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW50IHZteF9ubWlfYWxsb3dlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JdTMyIGd1ZXN0X2ludHIgPSB2bWNzX3JlYWQzMihHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8pOwotCi0JdmNwdS0+YXJjaC5ubWlfd2luZG93X29wZW4gPQotCQkhKGd1ZXN0X2ludHIgJiAoR1VFU1RfSU5UUl9TVEFURV9TVEkgfAotCQkJCUdVRVNUX0lOVFJfU1RBVEVfTU9WX1NTIHwKLQkJCQlHVUVTVF9JTlRSX1NUQVRFX05NSSkpOwogCWlmICghY3B1X2hhc192aXJ0dWFsX25taXMoKSAmJiB0b192bXgodmNwdSktPnNvZnRfdm5taV9ibG9ja2VkKQotCQl2Y3B1LT5hcmNoLm5taV93aW5kb3dfb3BlbiA9IDA7CisJCXJldHVybiAwOwogCi0JdmNwdS0+YXJjaC5pbnRlcnJ1cHRfd2luZG93X29wZW4gPQotCQkoKHZtY3NfcmVhZGwoR1VFU1RfUkZMQUdTKSAmIFg4Nl9FRkxBR1NfSUYpICYmCi0JCSAhKGd1ZXN0X2ludHIgJiAoR1VFU1RfSU5UUl9TVEFURV9TVEkgfAotCQkJCSBHVUVTVF9JTlRSX1NUQVRFX01PVl9TUykpKTsKKwlyZXR1cm4JISh2bWNzX3JlYWQzMihHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8pICYKKwkJCShHVUVTVF9JTlRSX1NUQVRFX1NUSSB8IEdVRVNUX0lOVFJfU1RBVEVfTU9WX1NTIHwKKwkJCQlHVUVTVF9JTlRSX1NUQVRFX05NSSkpOwogfQogCi1zdGF0aWMgdm9pZCBrdm1fZG9faW5qZWN0X2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW50IHZteF9pbnRlcnJ1cHRfYWxsb3dlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JaW50IHdvcmRfaW5kZXggPSBfX2Zmcyh2Y3B1LT5hcmNoLmlycV9zdW1tYXJ5KTsKLQlpbnQgYml0X2luZGV4ID0gX19mZnModmNwdS0+YXJjaC5pcnFfcGVuZGluZ1t3b3JkX2luZGV4XSk7Ci0JaW50IGlycSA9IHdvcmRfaW5kZXggKiBCSVRTX1BFUl9MT05HICsgYml0X2luZGV4OwotCi0JY2xlYXJfYml0KGJpdF9pbmRleCwgJnZjcHUtPmFyY2guaXJxX3BlbmRpbmdbd29yZF9pbmRleF0pOwotCWlmICghdmNwdS0+YXJjaC5pcnFfcGVuZGluZ1t3b3JkX2luZGV4XSkKLQkJY2xlYXJfYml0KHdvcmRfaW5kZXgsICZ2Y3B1LT5hcmNoLmlycV9zdW1tYXJ5KTsKLQlrdm1fcXVldWVfaW50ZXJydXB0KHZjcHUsIGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX2ludGVycnVwdF9yZXF1ZXN0cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJICAgICAgIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQotewotCXZteF91cGRhdGVfd2luZG93X3N0YXRlcyh2Y3B1KTsKLQotCWlmICh2Y3B1LT5ndWVzdF9kZWJ1ZyAmIEtWTV9HVUVTVERCR19TSU5HTEVTVEVQKQotCQl2bWNzX2NsZWFyX2JpdHMoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLAotCQkJCUdVRVNUX0lOVFJfU1RBVEVfU1RJIHwKLQkJCQlHVUVTVF9JTlRSX1NUQVRFX01PVl9TUyk7Ci0KLQlpZiAodmNwdS0+YXJjaC5ubWlfcGVuZGluZyAmJiAhdmNwdS0+YXJjaC5ubWlfaW5qZWN0ZWQpIHsKLQkJaWYgKHZjcHUtPmFyY2guaW50ZXJydXB0LnBlbmRpbmcpIHsKLQkJCWVuYWJsZV9ubWlfd2luZG93KHZjcHUpOwotCQl9IGVsc2UgaWYgKHZjcHUtPmFyY2gubm1pX3dpbmRvd19vcGVuKSB7Ci0JCQl2Y3B1LT5hcmNoLm5taV9wZW5kaW5nID0gZmFsc2U7Ci0JCQl2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQllbmFibGVfbm1pX3dpbmRvdyh2Y3B1KTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQlpZiAodmNwdS0+YXJjaC5ubWlfaW5qZWN0ZWQpIHsKLQkJdm14X2luamVjdF9ubWkodmNwdSk7Ci0JCWlmICh2Y3B1LT5hcmNoLm5taV9wZW5kaW5nKQotCQkJZW5hYmxlX25taV93aW5kb3codmNwdSk7Ci0JCWVsc2UgaWYgKHZjcHUtPmFyY2guaXJxX3N1bW1hcnkKLQkJCSB8fCBrdm1fcnVuLT5yZXF1ZXN0X2ludGVycnVwdF93aW5kb3cpCi0JCQllbmFibGVfaXJxX3dpbmRvdyh2Y3B1KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh2Y3B1LT5hcmNoLmludGVycnVwdF93aW5kb3dfb3BlbikgewotCQlpZiAodmNwdS0+YXJjaC5pcnFfc3VtbWFyeSAmJiAhdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZykKLQkJCWt2bV9kb19pbmplY3RfaXJxKHZjcHUpOwotCi0JCWlmICh2Y3B1LT5hcmNoLmludGVycnVwdC5wZW5kaW5nKQotCQkJdm14X2luamVjdF9pcnEodmNwdSwgdmNwdS0+YXJjaC5pbnRlcnJ1cHQubnIpOwotCX0KLQlpZiAoIXZjcHUtPmFyY2guaW50ZXJydXB0X3dpbmRvd19vcGVuICYmCi0JICAgICh2Y3B1LT5hcmNoLmlycV9zdW1tYXJ5IHx8IGt2bV9ydW4tPnJlcXVlc3RfaW50ZXJydXB0X3dpbmRvdykpCi0JCWVuYWJsZV9pcnFfd2luZG93KHZjcHUpOworCXJldHVybiAodm1jc19yZWFkbChHVUVTVF9SRkxBR1MpICYgWDg2X0VGTEFHU19JRikgJiYKKwkJISh2bWNzX3JlYWQzMihHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8pICYKKwkJCShHVUVTVF9JTlRSX1NUQVRFX1NUSSB8IEdVRVNUX0lOVFJfU1RBVEVfTU9WX1NTKSk7CiB9CiAKIHN0YXRpYyBpbnQgdm14X3NldF90c3NfYWRkcihzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGludCBhZGRyKQpAQCAtMjU4NSw2ICsyNTkxLDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBUcmlnZ2VyIG1hY2hpbmUgY2hlY2sgb24gdGhlIGhvc3QuIFdlIGFzc3VtZSBhbGwgdGhlIE1TUnMgYXJlIGFscmVhZHkgc2V0IHVwCisgKiBieSB0aGUgQ1BVIGFuZCB0aGF0IHdlIHN0aWxsIHJ1biBvbiB0aGUgc2FtZSBDUFUgYXMgdGhlIE1DRSBvY2N1cnJlZCBvbi4KKyAqIFdlIHBhc3MgYSBmYWtlIGVudmlyb25tZW50IHRvIHRoZSBtYWNoaW5lIGNoZWNrIGhhbmRsZXIgYmVjYXVzZSB3ZSB3YW50CisgKiB0aGUgZ3Vlc3QgdG8gYmUgYWx3YXlzIHRyZWF0ZWQgbGlrZSB1c2VyIHNwYWNlLCBubyBtYXR0ZXIgd2hhdCBjb250ZXh0CisgKiBpdCB1c2VkIGludGVybmFsbHkuCisgKi8KK3N0YXRpYyB2b2lkIGt2bV9tYWNoaW5lX2NoZWNrKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfWDg2X01DRSkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQorCXN0cnVjdCBwdF9yZWdzIHJlZ3MgPSB7CisJCS5jcyA9IDMsIC8qIEZha2UgcmluZyAzIG5vIG1hdHRlciB3aGF0IHRoZSBndWVzdCByYW4gb24gKi8KKwkJLmZsYWdzID0gWDg2X0VGTEFHU19JRiwKKwl9OworCisJZG9fbWFjaGluZV9jaGVjaygmcmVncywgMCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBoYW5kbGVfbWFjaGluZV9jaGVjayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQoreworCS8qIGFscmVhZHkgaGFuZGxlZCBieSB2Y3B1X3J1biAqLworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50IGhhbmRsZV9leGNlcHRpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKIHsKIAlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKQEAgLTI1OTYsMTcgKzI2MjcsMTQgQEAKIAl2ZWN0X2luZm8gPSB2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbzsKIAlpbnRyX2luZm8gPSB2bWNzX3JlYWQzMihWTV9FWElUX0lOVFJfSU5GTyk7CiAKKwlpZiAoaXNfbWFjaGluZV9jaGVjayhpbnRyX2luZm8pKQorCQlyZXR1cm4gaGFuZGxlX21hY2hpbmVfY2hlY2sodmNwdSwga3ZtX3J1bik7CisKIAlpZiAoKHZlY3RfaW5mbyAmIFZFQ1RPUklOR19JTkZPX1ZBTElEX01BU0spICYmCiAJCQkJCQkhaXNfcGFnZV9mYXVsdChpbnRyX2luZm8pKQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmV4cGVjdGVkLCB2ZWN0b3JpbmcgaW5mbyAweCV4ICIKIAkJICAgICAgICJpbnRyIGluZm8gMHgleFxuIiwgX19mdW5jX18sIHZlY3RfaW5mbywgaW50cl9pbmZvKTsKIAotCWlmICghaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSAmJiBpc19leHRlcm5hbF9pbnRlcnJ1cHQodmVjdF9pbmZvKSkgewotCQlpbnQgaXJxID0gdmVjdF9pbmZvICYgVkVDVE9SSU5HX0lORk9fVkVDVE9SX01BU0s7Ci0JCXNldF9iaXQoaXJxLCB2Y3B1LT5hcmNoLmlycV9wZW5kaW5nKTsKLQkJc2V0X2JpdChpcnEgLyBCSVRTX1BFUl9MT05HLCAmdmNwdS0+YXJjaC5pcnFfc3VtbWFyeSk7Ci0JfQotCiAJaWYgKChpbnRyX2luZm8gJiBJTlRSX0lORk9fSU5UUl9UWVBFX01BU0spID09IElOVFJfVFlQRV9OTUlfSU5UUikKIAkJcmV0dXJuIDE7ICAvKiBhbHJlYWR5IGhhbmRsZWQgYnkgdm14X3ZjcHVfcnVuKCkgKi8KIApAQCAtMjYyOCwxNyArMjY1NiwxNyBAQAogCQllcnJvcl9jb2RlID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlRSX0VSUk9SX0NPREUpOwogCWlmIChpc19wYWdlX2ZhdWx0KGludHJfaW5mbykpIHsKIAkJLyogRVBUIHdvbid0IGNhdXNlIHBhZ2UgZmF1bHQgZGlyZWN0bHkgKi8KLQkJaWYgKHZtX25lZWRfZXB0KCkpCisJCWlmIChlbmFibGVfZXB0KQogCQkJQlVHKCk7CiAJCWNyMiA9IHZtY3NfcmVhZGwoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKIAkJS1ZNVFJBQ0VfM0QoUEFHRV9GQVVMVCwgdmNwdSwgZXJyb3JfY29kZSwgKHUzMiljcjIsCiAJCQkgICAgKHUzMikoKHU2NCljcjIgPj4gMzIpLCBoYW5kbGVyKTsKLQkJaWYgKHZjcHUtPmFyY2guaW50ZXJydXB0LnBlbmRpbmcgfHwgdmNwdS0+YXJjaC5leGNlcHRpb24ucGVuZGluZykKKwkJaWYgKGt2bV9ldmVudF9uZWVkc19yZWluamVjdGlvbih2Y3B1KSkKIAkJCWt2bV9tbXVfdW5wcm90ZWN0X3BhZ2VfdmlydCh2Y3B1LCBjcjIpOwogCQlyZXR1cm4ga3ZtX21tdV9wYWdlX2ZhdWx0KHZjcHUsIGNyMiwgZXJyb3JfY29kZSk7CiAJfQogCi0JaWYgKHZjcHUtPmFyY2gucm1vZGUuYWN0aXZlICYmCisJaWYgKHZjcHUtPmFyY2gucm1vZGUudm04Nl9hY3RpdmUgJiYKIAkgICAgaGFuZGxlX3Jtb2RlX2V4Y2VwdGlvbih2Y3B1LCBpbnRyX2luZm8gJiBJTlRSX0lORk9fVkVDVE9SX01BU0ssCiAJCQkJCQkJCWVycm9yX2NvZGUpKSB7CiAJCWlmICh2Y3B1LT5hcmNoLmhhbHRfcmVxdWVzdCkgewpAQCAtMjc1MywxMyArMjc4MSwxOCBAQAogCQkJa3ZtX3NldF9jcjQodmNwdSwga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgcmVnKSk7CiAJCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOwogCQkJcmV0dXJuIDE7Ci0JCWNhc2UgODoKLQkJCWt2bV9zZXRfY3I4KHZjcHUsIGt2bV9yZWdpc3Rlcl9yZWFkKHZjcHUsIHJlZykpOwotCQkJc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKLQkJCWlmIChpcnFjaGlwX2luX2tlcm5lbCh2Y3B1LT5rdm0pKQotCQkJCXJldHVybiAxOwotCQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9TRVRfVFBSOwotCQkJcmV0dXJuIDA7CisJCWNhc2UgODogeworCQkJCXU4IGNyOF9wcmV2ID0ga3ZtX2dldF9jcjgodmNwdSk7CisJCQkJdTggY3I4ID0ga3ZtX3JlZ2lzdGVyX3JlYWQodmNwdSwgcmVnKTsKKwkJCQlrdm1fc2V0X2NyOCh2Y3B1LCBjcjgpOworCQkJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJCQkJaWYgKGlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkpCisJCQkJCXJldHVybiAxOworCQkJCWlmIChjcjhfcHJldiA8PSBjcjgpCisJCQkJCXJldHVybiAxOworCQkJCWt2bV9ydW4tPmV4aXRfcmVhc29uID0gS1ZNX0VYSVRfU0VUX1RQUjsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJfTsKIAkJYnJlYWs7CiAJY2FzZSAyOiAvKiBjbHRzICovCkBAIC0yOTU3LDggKzI5OTAsOSBAQAogCSAqIElmIHRoZSB1c2VyIHNwYWNlIHdhaXRzIHRvIGluamVjdCBpbnRlcnJ1cHRzLCBleGl0IGFzIHNvb24gYXMKIAkgKiBwb3NzaWJsZQogCSAqLwotCWlmIChrdm1fcnVuLT5yZXF1ZXN0X2ludGVycnVwdF93aW5kb3cgJiYKLQkgICAgIXZjcHUtPmFyY2guaXJxX3N1bW1hcnkpIHsKKwlpZiAoIWlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkgJiYKKwkgICAga3ZtX3J1bi0+cmVxdWVzdF9pbnRlcnJ1cHRfd2luZG93ICYmCisJICAgICFrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkpIHsKIAkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JUlFfV0lORE9XX09QRU47CiAJCXJldHVybiAwOwogCX0KQEAgLTI5ODAsNyArMzAxNCw3IEBACiAKIHN0YXRpYyBpbnQgaGFuZGxlX2ludmxwZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewotCXU2NCBleGl0X3F1YWxpZmljYXRpb24gPSB2bWNzX3JlYWQ2NChFWElUX1FVQUxJRklDQVRJT04pOworCXVuc2lnbmVkIGxvbmcgZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkbChFWElUX1FVQUxJRklDQVRJT04pOwogCiAJa3ZtX21tdV9pbnZscGcodmNwdSwgZXhpdF9xdWFsaWZpY2F0aW9uKTsKIAlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOwpAQCAtMjk5NiwxMSArMzAzMCwxMSBAQAogCiBzdGF0aWMgaW50IGhhbmRsZV9hcGljX2FjY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICprdm1fcnVuKQogewotCXU2NCBleGl0X3F1YWxpZmljYXRpb247CisJdW5zaWduZWQgbG9uZyBleGl0X3F1YWxpZmljYXRpb247CiAJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCi0JZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkNjQoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKKwlleGl0X3F1YWxpZmljYXRpb24gPSB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTik7CiAJb2Zmc2V0ID0gZXhpdF9xdWFsaWZpY2F0aW9uICYgMHhmZmZ1bDsKIAogCWVyID0gZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCBrdm1fcnVuLCAwLCAwLCAwKTsKQEAgLTMwMTksMjIgKzMwNTMsNDEgQEAKIAlzdHJ1Y3QgdmNwdV92bXggKnZteCA9IHRvX3ZteCh2Y3B1KTsKIAl1bnNpZ25lZCBsb25nIGV4aXRfcXVhbGlmaWNhdGlvbjsKIAl1MTYgdHNzX3NlbGVjdG9yOwotCWludCByZWFzb247CisJaW50IHJlYXNvbiwgdHlwZSwgaWR0X3Y7CisKKwlpZHRfdiA9ICh2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbyAmIFZFQ1RPUklOR19JTkZPX1ZBTElEX01BU0spOworCXR5cGUgPSAodm14LT5pZHRfdmVjdG9yaW5nX2luZm8gJiBWRUNUT1JJTkdfSU5GT19UWVBFX01BU0spOwogCiAJZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkbChFWElUX1FVQUxJRklDQVRJT04pOwogCiAJcmVhc29uID0gKHUzMilleGl0X3F1YWxpZmljYXRpb24gPj4gMzA7Ci0JaWYgKHJlYXNvbiA9PSBUQVNLX1NXSVRDSF9HQVRFICYmIHZteC0+dmNwdS5hcmNoLm5taV9pbmplY3RlZCAmJgotCSAgICAodm14LT5pZHRfdmVjdG9yaW5nX2luZm8gJiBWRUNUT1JJTkdfSU5GT19WQUxJRF9NQVNLKSAmJgotCSAgICAodm14LT5pZHRfdmVjdG9yaW5nX2luZm8gJiBWRUNUT1JJTkdfSU5GT19UWVBFX01BU0spCi0JICAgID09IElOVFJfVFlQRV9OTUlfSU5UUikgewotCQl2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCA9IGZhbHNlOwotCQlpZiAoY3B1X2hhc192aXJ0dWFsX25taXMoKSkKLQkJCXZtY3Nfc2V0X2JpdHMoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLAotCQkJCSAgICAgIEdVRVNUX0lOVFJfU1RBVEVfTk1JKTsKKwlpZiAocmVhc29uID09IFRBU0tfU1dJVENIX0dBVEUgJiYgaWR0X3YpIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgSU5UUl9UWVBFX05NSV9JTlRSOgorCQkJdmNwdS0+YXJjaC5ubWlfaW5qZWN0ZWQgPSBmYWxzZTsKKwkJCWlmIChjcHVfaGFzX3ZpcnR1YWxfbm1pcygpKQorCQkJCXZtY3Nfc2V0X2JpdHMoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLAorCQkJCQkgICAgICBHVUVTVF9JTlRSX1NUQVRFX05NSSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlRSX1RZUEVfRVhUX0lOVFI6CisJCWNhc2UgSU5UUl9UWVBFX1NPRlRfSU5UUjoKKwkJCWt2bV9jbGVhcl9pbnRlcnJ1cHRfcXVldWUodmNwdSk7CisJCQlicmVhazsKKwkJY2FzZSBJTlRSX1RZUEVfSEFSRF9FWENFUFRJT046CisJCWNhc2UgSU5UUl9UWVBFX1NPRlRfRVhDRVBUSU9OOgorCQkJa3ZtX2NsZWFyX2V4Y2VwdGlvbl9xdWV1ZSh2Y3B1KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KIAl9CiAJdHNzX3NlbGVjdG9yID0gZXhpdF9xdWFsaWZpY2F0aW9uOwogCisJaWYgKCFpZHRfdiB8fCAodHlwZSAhPSBJTlRSX1RZUEVfSEFSRF9FWENFUFRJT04gJiYKKwkJICAgICAgIHR5cGUgIT0gSU5UUl9UWVBFX0VYVF9JTlRSICYmCisJCSAgICAgICB0eXBlICE9IElOVFJfVFlQRV9OTUlfSU5UUikpCisJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisKIAlpZiAoIWt2bV90YXNrX3N3aXRjaCh2Y3B1LCB0c3Nfc2VsZWN0b3IsIHJlYXNvbikpCiAJCXJldHVybiAwOwogCkBAIC0zMDUxLDExICszMTA0LDExIEBACiAKIHN0YXRpYyBpbnQgaGFuZGxlX2VwdF92aW9sYXRpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKIHsKLQl1NjQgZXhpdF9xdWFsaWZpY2F0aW9uOworCXVuc2lnbmVkIGxvbmcgZXhpdF9xdWFsaWZpY2F0aW9uOwogCWdwYV90IGdwYTsKIAlpbnQgZ2xhX3ZhbGlkaXR5OwogCi0JZXhpdF9xdWFsaWZpY2F0aW9uID0gdm1jc19yZWFkNjQoRVhJVF9RVUFMSUZJQ0FUSU9OKTsKKwlleGl0X3F1YWxpZmljYXRpb24gPSB2bWNzX3JlYWRsKEVYSVRfUVVBTElGSUNBVElPTik7CiAKIAlpZiAoZXhpdF9xdWFsaWZpY2F0aW9uICYgKDEgPDwgNikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFUFQ6IEdQQSBleGNlZWRzIEdBVyFcbiIpOwpAQCAtMzA2Nyw3ICszMTIwLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJFUFQ6IEhhbmRsaW5nIEVQVCB2aW9sYXRpb24gZmFpbGVkIVxuIik7CiAJCXByaW50ayhLRVJOX0VSUiAiRVBUOiBHUEE6IDB4JWx4LCBHVkE6IDB4JWx4XG4iLAogCQkJKGxvbmcgdW5zaWduZWQgaW50KXZtY3NfcmVhZDY0KEdVRVNUX1BIWVNJQ0FMX0FERFJFU1MpLAotCQkJKGxvbmcgdW5zaWduZWQgaW50KXZtY3NfcmVhZDY0KEdVRVNUX0xJTkVBUl9BRERSRVNTKSk7CisJCQl2bWNzX3JlYWRsKEdVRVNUX0xJTkVBUl9BRERSRVNTKSk7CiAJCXByaW50ayhLRVJOX0VSUiAiRVBUOiBFeGl0IHF1YWxpZmljYXRpb24gaXMgMHglbHhcbiIsCiAJCQkobG9uZyB1bnNpZ25lZCBpbnQpZXhpdF9xdWFsaWZpY2F0aW9uKTsKIAkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9VTktOT1dOOwpAQCAtMzE1MCw2ICszMjAzLDcgQEAKIAlbRVhJVF9SRUFTT05fV0JJTlZEXSAgICAgICAgICAgICAgICAgID0gaGFuZGxlX3diaW52ZCwKIAlbRVhJVF9SRUFTT05fVEFTS19TV0lUQ0hdICAgICAgICAgICAgID0gaGFuZGxlX3Rhc2tfc3dpdGNoLAogCVtFWElUX1JFQVNPTl9FUFRfVklPTEFUSU9OXQkgICAgICA9IGhhbmRsZV9lcHRfdmlvbGF0aW9uLAorCVtFWElUX1JFQVNPTl9NQ0VfRFVSSU5HX1ZNRU5UUlldICAgICAgPSBoYW5kbGVfbWFjaGluZV9jaGVjaywKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQga3ZtX3ZteF9tYXhfZXhpdF9oYW5kbGVycyA9CkBAIC0zMTU5LDEwICszMjEzLDEwIEBACiAgKiBUaGUgZ3Vlc3QgaGFzIGV4aXRlZC4gIFNlZSBpZiB3ZSBjYW4gZml4IGl0IG9yIGlmIHdlIG5lZWQgdXNlcnNwYWNlCiAgKiBhc3Npc3RhbmNlLgogICovCi1zdGF0aWMgaW50IGt2bV9oYW5kbGVfZXhpdChzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1biwgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIGludCB2bXhfaGFuZGxlX2V4aXQoc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQl1MzIgZXhpdF9yZWFzb24gPSB2bWNzX3JlYWQzMihWTV9FWElUX1JFQVNPTik7CiAJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CisJdTMyIGV4aXRfcmVhc29uID0gdm14LT5leGl0X3JlYXNvbjsKIAl1MzIgdmVjdG9yaW5nX2luZm8gPSB2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbzsKIAogCUtWTVRSQUNFXzNEKFZNRVhJVCwgdmNwdSwgZXhpdF9yZWFzb24sICh1MzIpa3ZtX3JpcF9yZWFkKHZjcHUpLApAQCAtMzE3OCw3ICszMjMyLDcgQEAKIAogCS8qIEFjY2VzcyBDUjMgZG9uJ3QgY2F1c2UgVk1FeGl0IGluIHBhZ2luZyBtb2RlLCBzbyB3ZSBuZWVkCiAJICogdG8gc3luYyB3aXRoIGd1ZXN0IHJlYWwgQ1IzLiAqLwotCWlmICh2bV9uZWVkX2VwdCgpICYmIGlzX3BhZ2luZyh2Y3B1KSkgeworCWlmIChlbmFibGVfZXB0ICYmIGlzX3BhZ2luZyh2Y3B1KSkgewogCQl2Y3B1LT5hcmNoLmNyMyA9IHZtY3NfcmVhZGwoR1VFU1RfQ1IzKTsKIAkJZXB0X2xvYWRfcGRwdHJzKHZjcHUpOwogCX0KQEAgLTMxOTksOSArMzI1Myw4IEBACiAJCSAgICAgICBfX2Z1bmNfXywgdmVjdG9yaW5nX2luZm8sIGV4aXRfcmVhc29uKTsKIAogCWlmICh1bmxpa2VseSghY3B1X2hhc192aXJ0dWFsX25taXMoKSAmJiB2bXgtPnNvZnRfdm5taV9ibG9ja2VkKSkgewotCQlpZiAodmNwdS0+YXJjaC5pbnRlcnJ1cHRfd2luZG93X29wZW4pIHsKKwkJaWYgKHZteF9pbnRlcnJ1cHRfYWxsb3dlZCh2Y3B1KSkgewogCQkJdm14LT5zb2Z0X3ZubWlfYmxvY2tlZCA9IDA7Ci0JCQl2Y3B1LT5hcmNoLm5taV93aW5kb3dfb3BlbiA9IDE7CiAJCX0gZWxzZSBpZiAodm14LT52bm1pX2Jsb2NrZWRfdGltZSA+IDEwMDAwMDAwMDBMTCAmJgogCQkJICAgdmNwdS0+YXJjaC5ubWlfcGVuZGluZykgewogCQkJLyoKQEAgLTMyMTQsNyArMzI2Nyw2IEBACiAJCQkgICAgICAgInN0YXRlIG9uIFZDUFUgJWQgYWZ0ZXIgMSBzIHRpbWVvdXRcbiIsCiAJCQkgICAgICAgX19mdW5jX18sIHZjcHUtPnZjcHVfaWQpOwogCQkJdm14LT5zb2Z0X3ZubWlfYmxvY2tlZCA9IDA7Ci0JCQl2bXgtPnZjcHUuYXJjaC5ubWlfd2luZG93X29wZW4gPSAxOwogCQl9CiAJfQogCkBAIC0zMjI4LDEyMiArMzI4MCwxMDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX3Rwcl90aHJlc2hvbGQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIHZvaWQgdXBkYXRlX2NyOF9pbnRlcmNlcHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgdHByLCBpbnQgaXJyKQogewotCWludCBtYXhfaXJyLCB0cHI7Ci0KLQlpZiAoIXZtX25lZWRfdHByX3NoYWRvdyh2Y3B1LT5rdm0pKQotCQlyZXR1cm47Ci0KLQlpZiAoIWt2bV9sYXBpY19lbmFibGVkKHZjcHUpIHx8Ci0JICAgICgobWF4X2lyciA9IGt2bV9sYXBpY19maW5kX2hpZ2hlc3RfaXJyKHZjcHUpKSA9PSAtMSkpIHsKKwlpZiAoaXJyID09IC0xIHx8IHRwciA8IGlycikgewogCQl2bWNzX3dyaXRlMzIoVFBSX1RIUkVTSE9MRCwgMCk7CiAJCXJldHVybjsKIAl9CiAKLQl0cHIgPSAoa3ZtX2xhcGljX2dldF9jcjgodmNwdSkgJiAweDBmKSA8PCA0OwotCXZtY3Nfd3JpdGUzMihUUFJfVEhSRVNIT0xELCAobWF4X2lyciA+IHRwcikgPyB0cHIgPj4gNCA6IG1heF9pcnIgPj4gNCk7CisJdm1jc193cml0ZTMyKFRQUl9USFJFU0hPTEQsIGlycik7CiB9CiAKIHN0YXRpYyB2b2lkIHZteF9jb21wbGV0ZV9pbnRlcnJ1cHRzKHN0cnVjdCB2Y3B1X3ZteCAqdm14KQogewogCXUzMiBleGl0X2ludHJfaW5mbzsKLQl1MzIgaWR0X3ZlY3RvcmluZ19pbmZvOworCXUzMiBpZHRfdmVjdG9yaW5nX2luZm8gPSB2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbzsKIAlib29sIHVuYmxvY2tfbm1pOwogCXU4IHZlY3RvcjsKIAlpbnQgdHlwZTsKIAlib29sIGlkdHZfaW5mb192YWxpZDsKLQl1MzIgZXJyb3I7CiAKIAlleGl0X2ludHJfaW5mbyA9IHZtY3NfcmVhZDMyKFZNX0VYSVRfSU5UUl9JTkZPKTsKKworCXZteC0+ZXhpdF9yZWFzb24gPSB2bWNzX3JlYWQzMihWTV9FWElUX1JFQVNPTik7CisKKwkvKiBIYW5kbGUgbWFjaGluZSBjaGVja3MgYmVmb3JlIGludGVycnVwdHMgYXJlIGVuYWJsZWQgKi8KKwlpZiAoKHZteC0+ZXhpdF9yZWFzb24gPT0gRVhJVF9SRUFTT05fTUNFX0RVUklOR19WTUVOVFJZKQorCSAgICB8fCAodm14LT5leGl0X3JlYXNvbiA9PSBFWElUX1JFQVNPTl9FWENFUFRJT05fTk1JCisJCSYmIGlzX21hY2hpbmVfY2hlY2soZXhpdF9pbnRyX2luZm8pKSkKKwkJa3ZtX21hY2hpbmVfY2hlY2soKTsKKworCS8qIFdlIG5lZWQgdG8gaGFuZGxlIE5NSXMgYmVmb3JlIGludGVycnVwdHMgYXJlIGVuYWJsZWQgKi8KKwlpZiAoKGV4aXRfaW50cl9pbmZvICYgSU5UUl9JTkZPX0lOVFJfVFlQRV9NQVNLKSA9PSBJTlRSX1RZUEVfTk1JX0lOVFIgJiYKKwkgICAgKGV4aXRfaW50cl9pbmZvICYgSU5UUl9JTkZPX1ZBTElEX01BU0spKSB7CisJCUtWTVRSQUNFXzBEKE5NSSwgJnZteC0+dmNwdSwgaGFuZGxlcik7CisJCWFzbSgiaW50ICQyIik7CisJfQorCisJaWR0dl9pbmZvX3ZhbGlkID0gaWR0X3ZlY3RvcmluZ19pbmZvICYgVkVDVE9SSU5HX0lORk9fVkFMSURfTUFTSzsKKwogCWlmIChjcHVfaGFzX3ZpcnR1YWxfbm1pcygpKSB7CiAJCXVuYmxvY2tfbm1pID0gKGV4aXRfaW50cl9pbmZvICYgSU5UUl9JTkZPX1VOQkxPQ0tfTk1JKSAhPSAwOwogCQl2ZWN0b3IgPSBleGl0X2ludHJfaW5mbyAmIElOVFJfSU5GT19WRUNUT1JfTUFTSzsKIAkJLyoKLQkJICogU0RNIDM6IDI1LjcuMS4yCisJCSAqIFNETSAzOiAyNy43LjEuMiAoU2VwdGVtYmVyIDIwMDgpCiAJCSAqIFJlLXNldCBiaXQgImJsb2NrIGJ5IE5NSSIgYmVmb3JlIFZNIGVudHJ5IGlmIHZtZXhpdCBjYXVzZWQgYnkKIAkJICogYSBndWVzdCBJUkVUIGZhdWx0LgorCQkgKiBTRE0gMzogMjMuMi4yIChTZXB0ZW1iZXIgMjAwOCkKKwkJICogQml0IDEyIGlzIHVuZGVmaW5lZCBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjYXNlczoKKwkJICogIElmIHRoZSBWTSBleGl0IHNldHMgdGhlIHZhbGlkIGJpdCBpbiB0aGUgSURULXZlY3RvcmluZworCQkgKiAgIGluZm9ybWF0aW9uIGZpZWxkLgorCQkgKiAgSWYgdGhlIFZNIGV4aXQgaXMgZHVlIHRvIGEgZG91YmxlIGZhdWx0LgogCQkgKi8KLQkJaWYgKHVuYmxvY2tfbm1pICYmIHZlY3RvciAhPSBERl9WRUNUT1IpCisJCWlmICgoZXhpdF9pbnRyX2luZm8gJiBJTlRSX0lORk9fVkFMSURfTUFTSykgJiYgdW5ibG9ja19ubWkgJiYKKwkJICAgIHZlY3RvciAhPSBERl9WRUNUT1IgJiYgIWlkdHZfaW5mb192YWxpZCkKIAkJCXZtY3Nfc2V0X2JpdHMoR1VFU1RfSU5URVJSVVBUSUJJTElUWV9JTkZPLAogCQkJCSAgICAgIEdVRVNUX0lOVFJfU1RBVEVfTk1JKTsKIAl9IGVsc2UgaWYgKHVubGlrZWx5KHZteC0+c29mdF92bm1pX2Jsb2NrZWQpKQogCQl2bXgtPnZubWlfYmxvY2tlZF90aW1lICs9CiAJCQlrdGltZV90b19ucyhrdGltZV9zdWIoa3RpbWVfZ2V0KCksIHZteC0+ZW50cnlfdGltZSkpOwogCi0JaWR0X3ZlY3RvcmluZ19pbmZvID0gdm14LT5pZHRfdmVjdG9yaW5nX2luZm87Ci0JaWR0dl9pbmZvX3ZhbGlkID0gaWR0X3ZlY3RvcmluZ19pbmZvICYgVkVDVE9SSU5HX0lORk9fVkFMSURfTUFTSzsKKwl2bXgtPnZjcHUuYXJjaC5ubWlfaW5qZWN0ZWQgPSBmYWxzZTsKKwlrdm1fY2xlYXJfZXhjZXB0aW9uX3F1ZXVlKCZ2bXgtPnZjcHUpOworCWt2bV9jbGVhcl9pbnRlcnJ1cHRfcXVldWUoJnZteC0+dmNwdSk7CisKKwlpZiAoIWlkdHZfaW5mb192YWxpZCkKKwkJcmV0dXJuOworCiAJdmVjdG9yID0gaWR0X3ZlY3RvcmluZ19pbmZvICYgVkVDVE9SSU5HX0lORk9fVkVDVE9SX01BU0s7CiAJdHlwZSA9IGlkdF92ZWN0b3JpbmdfaW5mbyAmIFZFQ1RPUklOR19JTkZPX1RZUEVfTUFTSzsKLQlpZiAodm14LT52Y3B1LmFyY2gubm1pX2luamVjdGVkKSB7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElOVFJfVFlQRV9OTUlfSU5UUjoKKwkJdm14LT52Y3B1LmFyY2gubm1pX2luamVjdGVkID0gdHJ1ZTsKIAkJLyoKLQkJICogU0RNIDM6IDI1LjcuMS4yCi0JCSAqIENsZWFyIGJpdCAiYmxvY2sgYnkgTk1JIiBiZWZvcmUgVk0gZW50cnkgaWYgYSBOTUkgZGVsaXZlcnkKLQkJICogZmF1bHRlZC4KKwkJICogU0RNIDM6IDI3LjcuMS4yIChTZXB0ZW1iZXIgMjAwOCkKKwkJICogQ2xlYXIgYml0ICJibG9jayBieSBOTUkiIGJlZm9yZSBWTSBlbnRyeSBpZiBhIE5NSQorCQkgKiBkZWxpdmVyeSBmYXVsdGVkLgogCQkgKi8KLQkJaWYgKGlkdHZfaW5mb192YWxpZCAmJiB0eXBlID09IElOVFJfVFlQRV9OTUlfSU5UUikKLQkJCXZtY3NfY2xlYXJfYml0cyhHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8sCi0JCQkJCUdVRVNUX0lOVFJfU1RBVEVfTk1JKTsKLQkJZWxzZQotCQkJdm14LT52Y3B1LmFyY2gubm1pX2luamVjdGVkID0gZmFsc2U7Ci0JfQotCWt2bV9jbGVhcl9leGNlcHRpb25fcXVldWUoJnZteC0+dmNwdSk7Ci0JaWYgKGlkdHZfaW5mb192YWxpZCAmJiAodHlwZSA9PSBJTlRSX1RZUEVfSEFSRF9FWENFUFRJT04gfHwKLQkJCQl0eXBlID09IElOVFJfVFlQRV9TT0ZUX0VYQ0VQVElPTikpIHsKKwkJdm1jc19jbGVhcl9iaXRzKEdVRVNUX0lOVEVSUlVQVElCSUxJVFlfSU5GTywKKwkJCQlHVUVTVF9JTlRSX1NUQVRFX05NSSk7CisJCWJyZWFrOworCWNhc2UgSU5UUl9UWVBFX1NPRlRfRVhDRVBUSU9OOgorCQl2bXgtPnZjcHUuYXJjaC5ldmVudF9leGl0X2luc3RfbGVuID0KKwkJCXZtY3NfcmVhZDMyKFZNX0VYSVRfSU5TVFJVQ1RJT05fTEVOKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBJTlRSX1RZUEVfSEFSRF9FWENFUFRJT046CiAJCWlmIChpZHRfdmVjdG9yaW5nX2luZm8gJiBWRUNUT1JJTkdfSU5GT19ERUxJVkVSX0NPREVfTUFTSykgewotCQkJZXJyb3IgPSB2bWNzX3JlYWQzMihJRFRfVkVDVE9SSU5HX0VSUk9SX0NPREUpOwotCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbl9lKCZ2bXgtPnZjcHUsIHZlY3RvciwgZXJyb3IpOworCQkJdTMyIGVyciA9IHZtY3NfcmVhZDMyKElEVF9WRUNUT1JJTkdfRVJST1JfQ09ERSk7CisJCQlrdm1fcXVldWVfZXhjZXB0aW9uX2UoJnZteC0+dmNwdSwgdmVjdG9yLCBlcnIpOwogCQl9IGVsc2UKIAkJCWt2bV9xdWV1ZV9leGNlcHRpb24oJnZteC0+dmNwdSwgdmVjdG9yKTsKLQkJdm14LT5pZHRfdmVjdG9yaW5nX2luZm8gPSAwOwotCX0KLQlrdm1fY2xlYXJfaW50ZXJydXB0X3F1ZXVlKCZ2bXgtPnZjcHUpOwotCWlmIChpZHR2X2luZm9fdmFsaWQgJiYgdHlwZSA9PSBJTlRSX1RZUEVfRVhUX0lOVFIpIHsKLQkJa3ZtX3F1ZXVlX2ludGVycnVwdCgmdm14LT52Y3B1LCB2ZWN0b3IpOwotCQl2bXgtPmlkdF92ZWN0b3JpbmdfaW5mbyA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB2bXhfaW50cl9hc3Npc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXVwZGF0ZV90cHJfdGhyZXNob2xkKHZjcHUpOwotCi0Jdm14X3VwZGF0ZV93aW5kb3dfc3RhdGVzKHZjcHUpOwotCi0JaWYgKHZjcHUtPmd1ZXN0X2RlYnVnICYgS1ZNX0dVRVNUREJHX1NJTkdMRVNURVApCi0JCXZtY3NfY2xlYXJfYml0cyhHVUVTVF9JTlRFUlJVUFRJQklMSVRZX0lORk8sCi0JCQkJR1VFU1RfSU5UUl9TVEFURV9TVEkgfAotCQkJCUdVRVNUX0lOVFJfU1RBVEVfTU9WX1NTKTsKLQotCWlmICh2Y3B1LT5hcmNoLm5taV9wZW5kaW5nICYmICF2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCkgewotCQlpZiAodmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZykgewotCQkJZW5hYmxlX25taV93aW5kb3codmNwdSk7Ci0JCX0gZWxzZSBpZiAodmNwdS0+YXJjaC5ubWlfd2luZG93X29wZW4pIHsKLQkJCXZjcHUtPmFyY2gubm1pX3BlbmRpbmcgPSBmYWxzZTsKLQkJCXZjcHUtPmFyY2gubm1pX2luamVjdGVkID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCWVuYWJsZV9ubWlfd2luZG93KHZjcHUpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCWlmICh2Y3B1LT5hcmNoLm5taV9pbmplY3RlZCkgewotCQl2bXhfaW5qZWN0X25taSh2Y3B1KTsKLQkJaWYgKHZjcHUtPmFyY2gubm1pX3BlbmRpbmcpCi0JCQllbmFibGVfbm1pX3dpbmRvdyh2Y3B1KTsKLQkJZWxzZSBpZiAoa3ZtX2NwdV9oYXNfaW50ZXJydXB0KHZjcHUpKQotCQkJZW5hYmxlX2lycV93aW5kb3codmNwdSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCF2Y3B1LT5hcmNoLmludGVycnVwdC5wZW5kaW5nICYmIGt2bV9jcHVfaGFzX2ludGVycnVwdCh2Y3B1KSkgewotCQlpZiAodmNwdS0+YXJjaC5pbnRlcnJ1cHRfd2luZG93X29wZW4pCi0JCQlrdm1fcXVldWVfaW50ZXJydXB0KHZjcHUsIGt2bV9jcHVfZ2V0X2ludGVycnVwdCh2Y3B1KSk7Ci0JCWVsc2UKLQkJCWVuYWJsZV9pcnFfd2luZG93KHZjcHUpOwotCX0KLQlpZiAodmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZykgewotCQl2bXhfaW5qZWN0X2lycSh2Y3B1LCB2Y3B1LT5hcmNoLmludGVycnVwdC5ucik7Ci0JCWlmIChrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkpCi0JCQllbmFibGVfaXJxX3dpbmRvdyh2Y3B1KTsKKwkJYnJlYWs7CisJY2FzZSBJTlRSX1RZUEVfU09GVF9JTlRSOgorCQl2bXgtPnZjcHUuYXJjaC5ldmVudF9leGl0X2luc3RfbGVuID0KKwkJCXZtY3NfcmVhZDMyKFZNX0VYSVRfSU5TVFJVQ1RJT05fTEVOKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBJTlRSX1RZUEVfRVhUX0lOVFI6CisJCWt2bV9xdWV1ZV9pbnRlcnJ1cHQoJnZteC0+dmNwdSwgdmVjdG9yLAorCQkJdHlwZSA9PSBJTlRSX1RZUEVfU09GVF9JTlRSKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogfQogCkBAIC0zMzgxLDcgKzM0MTgsNiBAQAogc3RhdGljIHZvaWQgdm14X3ZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7CiAJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7Ci0JdTMyIGludHJfaW5mbzsKIAogCS8qIFJlY29yZCB0aGUgZ3Vlc3QncyBuZXQgdmNwdSB0aW1lIGZvciBlbmZvcmNlZCBOTUkgaW5qZWN0aW9ucy4gKi8KIAlpZiAodW5saWtlbHkoIWNwdV9oYXNfdmlydHVhbF9ubWlzKCkgJiYgdm14LT5zb2Z0X3ZubWlfYmxvY2tlZCkpCkBAIC0zNTA1LDIwICszNTQxLDkgQEAKIAlpZiAodm14LT5ybW9kZS5pcnEucGVuZGluZykKIAkJZml4dXBfcm1vZGVfaXJxKHZteCk7CiAKLQl2bXhfdXBkYXRlX3dpbmRvd19zdGF0ZXModmNwdSk7Ci0KIAlhc20oIm1vdiAlMCwgJSVkczsgbW92ICUwLCAlJWVzIiA6IDogInIiKF9fVVNFUl9EUykpOwogCXZteC0+bGF1bmNoZWQgPSAxOwogCi0JaW50cl9pbmZvID0gdm1jc19yZWFkMzIoVk1fRVhJVF9JTlRSX0lORk8pOwotCi0JLyogV2UgbmVlZCB0byBoYW5kbGUgTk1JcyBiZWZvcmUgaW50ZXJydXB0cyBhcmUgZW5hYmxlZCAqLwotCWlmICgoaW50cl9pbmZvICYgSU5UUl9JTkZPX0lOVFJfVFlQRV9NQVNLKSA9PSBJTlRSX1RZUEVfTk1JX0lOVFIgJiYKLQkgICAgKGludHJfaW5mbyAmIElOVFJfSU5GT19WQUxJRF9NQVNLKSkgewotCQlLVk1UUkFDRV8wRChOTUksIHZjcHUsIGhhbmRsZXIpOwotCQlhc20oImludCAkMiIpOwotCX0KLQogCXZteF9jb21wbGV0ZV9pbnRlcnJ1cHRzKHZteCk7CiB9CiAKQEAgLTM1OTMsNyArMzYxOCw3IEBACiAJCWlmIChhbGxvY19hcGljX2FjY2Vzc19wYWdlKGt2bSkgIT0gMCkKIAkJCWdvdG8gZnJlZV92bWNzOwogCi0JaWYgKHZtX25lZWRfZXB0KCkpCisJaWYgKGVuYWJsZV9lcHQpCiAJCWlmIChhbGxvY19pZGVudGl0eV9wYWdldGFibGUoa3ZtKSAhPSAwKQogCQkJZ290byBmcmVlX3ZtY3M7CiAKQEAgLTM2MzEsOSArMzY1NiwzMiBAQAogCXJldHVybiBWTVhfRVBUX0RFRkFVTFRfR0FXICsgMTsKIH0KIAotc3RhdGljIGludCB2bXhfZ2V0X210X21hc2tfc2hpZnQodm9pZCkKK3N0YXRpYyB1NjQgdm14X2dldF9tdF9tYXNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZ2ZuX3QgZ2ZuLCBib29sIGlzX21taW8pCiB7Ci0JcmV0dXJuIFZNWF9FUFRfTVRfRVBURV9TSElGVDsKKwl1NjQgcmV0OworCisJLyogRm9yIFZULWQgYW5kIEVQVCBjb21iaW5hdGlvbgorCSAqIDEuIE1NSU86IGFsd2F5cyBtYXAgYXMgVUMKKwkgKiAyLiBFUFQgd2l0aCBWVC1kOgorCSAqICAgYS4gVlQtZCB3aXRob3V0IHNub29waW5nIGNvbnRyb2wgZmVhdHVyZTogY2FuJ3QgZ3VhcmFudGVlIHRoZQorCSAqCXJlc3VsdCwgdHJ5IHRvIHRydXN0IGd1ZXN0LgorCSAqICAgYi4gVlQtZCB3aXRoIHNub29waW5nIGNvbnRyb2wgZmVhdHVyZTogc25vb3BpbmcgY29udHJvbCBmZWF0dXJlIG9mCisJICoJVlQtZCBlbmdpbmUgY2FuIGd1YXJhbnRlZSB0aGUgY2FjaGUgY29ycmVjdG5lc3MuIEp1c3Qgc2V0IGl0CisJICoJdG8gV0IgdG8ga2VlcCBjb25zaXN0ZW50IHdpdGggaG9zdC4gU28gdGhlIHNhbWUgYXMgaXRlbSAzLgorCSAqIDMuIEVQVCB3aXRob3V0IFZULWQ6IGFsd2F5cyBtYXAgYXMgV0IgYW5kIHNldCBJR01UPTEgdG8ga2VlcAorCSAqICAgIGNvbnNpc3RlbnQgd2l0aCBob3N0IE1UUlIKKwkgKi8KKwlpZiAoaXNfbW1pbykKKwkJcmV0ID0gTVRSUl9UWVBFX1VOQ0FDSEFCTEUgPDwgVk1YX0VQVF9NVF9FUFRFX1NISUZUOworCWVsc2UgaWYgKHZjcHUtPmt2bS0+YXJjaC5pb21tdV9kb21haW4gJiYKKwkJISh2Y3B1LT5rdm0tPmFyY2guaW9tbXVfZmxhZ3MgJiBLVk1fSU9NTVVfQ0FDSEVfQ09IRVJFTkNZKSkKKwkJcmV0ID0ga3ZtX2dldF9ndWVzdF9tZW1vcnlfdHlwZSh2Y3B1LCBnZm4pIDw8CisJCSAgICAgIFZNWF9FUFRfTVRfRVBURV9TSElGVDsKKwllbHNlCisJCXJldCA9IChNVFJSX1RZUEVfV1JCQUNLIDw8IFZNWF9FUFRfTVRfRVBURV9TSElGVCkKKwkJCXwgVk1YX0VQVF9JR01UX0JJVDsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qga3ZtX3g4Nl9vcHMgdm14X3g4Nl9vcHMgPSB7CkBAIC0zNjQ0LDcgKzM2OTIsNyBAQAogCS5jaGVja19wcm9jZXNzb3JfY29tcGF0aWJpbGl0eSA9IHZteF9jaGVja19wcm9jZXNzb3JfY29tcGF0LAogCS5oYXJkd2FyZV9lbmFibGUgPSBoYXJkd2FyZV9lbmFibGUsCiAJLmhhcmR3YXJlX2Rpc2FibGUgPSBoYXJkd2FyZV9kaXNhYmxlLAotCS5jcHVfaGFzX2FjY2VsZXJhdGVkX3RwciA9IGNwdV9oYXNfdm14X3ZpcnR1YWxpemVfYXBpY19hY2Nlc3NlcywKKwkuY3B1X2hhc19hY2NlbGVyYXRlZF90cHIgPSByZXBvcnRfZmxleHByaW9yaXR5LAogCiAJLnZjcHVfY3JlYXRlID0gdm14X2NyZWF0ZV92Y3B1LAogCS52Y3B1X2ZyZWUgPSB2bXhfZnJlZV92Y3B1LApAQCAtMzY3OCw3OCArMzcyNiw4MiBAQAogCS50bGJfZmx1c2ggPSB2bXhfZmx1c2hfdGxiLAogCiAJLnJ1biA9IHZteF92Y3B1X3J1biwKLQkuaGFuZGxlX2V4aXQgPSBrdm1faGFuZGxlX2V4aXQsCisJLmhhbmRsZV9leGl0ID0gdm14X2hhbmRsZV9leGl0LAogCS5za2lwX2VtdWxhdGVkX2luc3RydWN0aW9uID0gc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbiwKKwkuc2V0X2ludGVycnVwdF9zaGFkb3cgPSB2bXhfc2V0X2ludGVycnVwdF9zaGFkb3csCisJLmdldF9pbnRlcnJ1cHRfc2hhZG93ID0gdm14X2dldF9pbnRlcnJ1cHRfc2hhZG93LAogCS5wYXRjaF9oeXBlcmNhbGwgPSB2bXhfcGF0Y2hfaHlwZXJjYWxsLAotCS5nZXRfaXJxID0gdm14X2dldF9pcnEsCiAJLnNldF9pcnEgPSB2bXhfaW5qZWN0X2lycSwKKwkuc2V0X25taSA9IHZteF9pbmplY3Rfbm1pLAogCS5xdWV1ZV9leGNlcHRpb24gPSB2bXhfcXVldWVfZXhjZXB0aW9uLAotCS5leGNlcHRpb25faW5qZWN0ZWQgPSB2bXhfZXhjZXB0aW9uX2luamVjdGVkLAotCS5pbmplY3RfcGVuZGluZ19pcnEgPSB2bXhfaW50cl9hc3Npc3QsCi0JLmluamVjdF9wZW5kaW5nX3ZlY3RvcnMgPSBkb19pbnRlcnJ1cHRfcmVxdWVzdHMsCisJLmludGVycnVwdF9hbGxvd2VkID0gdm14X2ludGVycnVwdF9hbGxvd2VkLAorCS5ubWlfYWxsb3dlZCA9IHZteF9ubWlfYWxsb3dlZCwKKwkuZW5hYmxlX25taV93aW5kb3cgPSBlbmFibGVfbm1pX3dpbmRvdywKKwkuZW5hYmxlX2lycV93aW5kb3cgPSBlbmFibGVfaXJxX3dpbmRvdywKKwkudXBkYXRlX2NyOF9pbnRlcmNlcHQgPSB1cGRhdGVfY3I4X2ludGVyY2VwdCwKIAogCS5zZXRfdHNzX2FkZHIgPSB2bXhfc2V0X3Rzc19hZGRyLAogCS5nZXRfdGRwX2xldmVsID0gZ2V0X2VwdF9sZXZlbCwKLQkuZ2V0X210X21hc2tfc2hpZnQgPSB2bXhfZ2V0X210X21hc2tfc2hpZnQsCisJLmdldF9tdF9tYXNrID0gdm14X2dldF9tdF9tYXNrLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdm14X2luaXQodm9pZCkKIHsKLQl2b2lkICp2YTsKIAlpbnQgcjsKIAotCXZteF9pb19iaXRtYXBfYSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0pOworCXZteF9pb19iaXRtYXBfYSA9ICh1bnNpZ25lZCBsb25nICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghdm14X2lvX2JpdG1hcF9hKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXZteF9pb19iaXRtYXBfYiA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0pOworCXZteF9pb19iaXRtYXBfYiA9ICh1bnNpZ25lZCBsb25nICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghdm14X2lvX2JpdG1hcF9iKSB7CiAJCXIgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CiAKLQl2bXhfbXNyX2JpdG1hcCA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0pOwotCWlmICghdm14X21zcl9iaXRtYXApIHsKKwl2bXhfbXNyX2JpdG1hcF9sZWdhY3kgPSAodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXZteF9tc3JfYml0bWFwX2xlZ2FjeSkgewogCQlyID0gLUVOT01FTTsKIAkJZ290byBvdXQxOwogCX0KIAorCXZteF9tc3JfYml0bWFwX2xvbmdtb2RlID0gKHVuc2lnbmVkIGxvbmcgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCF2bXhfbXNyX2JpdG1hcF9sb25nbW9kZSkgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBvdXQyOworCX0KKwogCS8qCiAJICogQWxsb3cgZGlyZWN0IGFjY2VzcyB0byB0aGUgUEMgZGVidWcgcG9ydCAoaXQgaXMgb2Z0ZW4gdXNlZCBmb3IgSS9PCiAJICogZGVsYXlzLCBidXQgdGhlIHZtZXhpdHMgc2ltcGx5IHNsb3cgdGhpbmdzIGRvd24pLgogCSAqLwotCXZhID0ga21hcCh2bXhfaW9fYml0bWFwX2EpOwotCW1lbXNldCh2YSwgMHhmZiwgUEFHRV9TSVpFKTsKLQljbGVhcl9iaXQoMHg4MCwgdmEpOwotCWt1bm1hcCh2bXhfaW9fYml0bWFwX2EpOworCW1lbXNldCh2bXhfaW9fYml0bWFwX2EsIDB4ZmYsIFBBR0VfU0laRSk7CisJY2xlYXJfYml0KDB4ODAsIHZteF9pb19iaXRtYXBfYSk7CiAKLQl2YSA9IGttYXAodm14X2lvX2JpdG1hcF9iKTsKLQltZW1zZXQodmEsIDB4ZmYsIFBBR0VfU0laRSk7Ci0Ja3VubWFwKHZteF9pb19iaXRtYXBfYik7CisJbWVtc2V0KHZteF9pb19iaXRtYXBfYiwgMHhmZiwgUEFHRV9TSVpFKTsKIAotCXZhID0ga21hcCh2bXhfbXNyX2JpdG1hcCk7Ci0JbWVtc2V0KHZhLCAweGZmLCBQQUdFX1NJWkUpOwotCWt1bm1hcCh2bXhfbXNyX2JpdG1hcCk7CisJbWVtc2V0KHZteF9tc3JfYml0bWFwX2xlZ2FjeSwgMHhmZiwgUEFHRV9TSVpFKTsKKwltZW1zZXQodm14X21zcl9iaXRtYXBfbG9uZ21vZGUsIDB4ZmYsIFBBR0VfU0laRSk7CiAKIAlzZXRfYml0KDAsIHZteF92cGlkX2JpdG1hcCk7IC8qIDAgaXMgcmVzZXJ2ZWQgZm9yIGhvc3QgKi8KIAogCXIgPSBrdm1faW5pdCgmdm14X3g4Nl9vcHMsIHNpemVvZihzdHJ1Y3QgdmNwdV92bXgpLCBUSElTX01PRFVMRSk7CiAJaWYgKHIpCi0JCWdvdG8gb3V0MjsKKwkJZ290byBvdXQzOwogCi0Jdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXAsIE1TUl9GU19CQVNFKTsKLQl2bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcih2bXhfbXNyX2JpdG1hcCwgTVNSX0dTX0JBU0UpOwotCXZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKHZteF9tc3JfYml0bWFwLCBNU1JfSUEzMl9TWVNFTlRFUl9DUyk7Ci0Jdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXAsIE1TUl9JQTMyX1NZU0VOVEVSX0VTUCk7Ci0Jdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3Iodm14X21zcl9iaXRtYXAsIE1TUl9JQTMyX1NZU0VOVEVSX0VJUCk7CisJdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3IoTVNSX0ZTX0JBU0UsIGZhbHNlKTsKKwl2bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcihNU1JfR1NfQkFTRSwgZmFsc2UpOworCXZteF9kaXNhYmxlX2ludGVyY2VwdF9mb3JfbXNyKE1TUl9LRVJORUxfR1NfQkFTRSwgdHJ1ZSk7CisJdm14X2Rpc2FibGVfaW50ZXJjZXB0X2Zvcl9tc3IoTVNSX0lBMzJfU1lTRU5URVJfQ1MsIGZhbHNlKTsKKwl2bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcihNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIGZhbHNlKTsKKwl2bXhfZGlzYWJsZV9pbnRlcmNlcHRfZm9yX21zcihNU1JfSUEzMl9TWVNFTlRFUl9FSVAsIGZhbHNlKTsKIAotCWlmICh2bV9uZWVkX2VwdCgpKSB7CisJaWYgKGVuYWJsZV9lcHQpIHsKIAkJYnlwYXNzX2d1ZXN0X3BmID0gMDsKIAkJa3ZtX21tdV9zZXRfYmFzZV9wdGVzKFZNWF9FUFRfUkVBREFCTEVfTUFTSyB8CiAJCQlWTVhfRVBUX1dSSVRBQkxFX01BU0spOwogCQlrdm1fbW11X3NldF9tYXNrX3B0ZXMoMHVsbCwgMHVsbCwgMHVsbCwgMHVsbCwKLQkJCQlWTVhfRVBUX0VYRUNVVEFCTEVfTUFTSywKLQkJCQlWTVhfRVBUX0RFRkFVTFRfTVQgPDwgVk1YX0VQVF9NVF9FUFRFX1NISUZUKTsKKwkJCQlWTVhfRVBUX0VYRUNVVEFCTEVfTUFTSyk7CiAJCWt2bV9lbmFibGVfdGRwKCk7CiAJfSBlbHNlCiAJCWt2bV9kaXNhYmxlX3RkcCgpOwpAQCAtMzc2MSwyMCArMzgxMywyMyBAQAogCiAJcmV0dXJuIDA7CiAKK291dDM6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xvbmdtb2RlKTsKIG91dDI6Ci0JX19mcmVlX3BhZ2Uodm14X21zcl9iaXRtYXApOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfbXNyX2JpdG1hcF9sZWdhY3kpOwogb3V0MToKLQlfX2ZyZWVfcGFnZSh2bXhfaW9fYml0bWFwX2IpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl2bXhfaW9fYml0bWFwX2IpOwogb3V0OgotCV9fZnJlZV9wYWdlKHZteF9pb19iaXRtYXBfYSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9pb19iaXRtYXBfYSk7CiAJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCB2bXhfZXhpdCh2b2lkKQogewotCV9fZnJlZV9wYWdlKHZteF9tc3JfYml0bWFwKTsKLQlfX2ZyZWVfcGFnZSh2bXhfaW9fYml0bWFwX2IpOwotCV9fZnJlZV9wYWdlKHZteF9pb19iaXRtYXBfYSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xlZ2FjeSk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXZteF9tc3JfYml0bWFwX2xvbmdtb2RlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X2lvX2JpdG1hcF9iKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdm14X2lvX2JpdG1hcF9hKTsKIAogCWt2bV9leGl0KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0veDg2LmMgYi9hcmNoL3g4Ni9rdm0veDg2LmMKaW5kZXggMzk0NGU5MS4uMjQ5NTQwZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL3g4Ni5jCisrKyBiL2FyY2gveDg2L2t2bS94ODYuYwpAQCAtOTEsNyArOTEsNiBAQAogCXsgImhhbHRfd2FrZXVwIiwgVkNQVV9TVEFUKGhhbHRfd2FrZXVwKSB9LAogCXsgImh5cGVyY2FsbHMiLCBWQ1BVX1NUQVQoaHlwZXJjYWxscykgfSwKIAl7ICJyZXF1ZXN0X2lycSIsIFZDUFVfU1RBVChyZXF1ZXN0X2lycV9leGl0cykgfSwKLQl7ICJyZXF1ZXN0X25taSIsIFZDUFVfU1RBVChyZXF1ZXN0X25taV9leGl0cykgfSwKIAl7ICJpcnFfZXhpdHMiLCBWQ1BVX1NUQVQoaXJxX2V4aXRzKSB9LAogCXsgImhvc3Rfc3RhdGVfcmVsb2FkIiwgVkNQVV9TVEFUKGhvc3Rfc3RhdGVfcmVsb2FkKSB9LAogCXsgImVmZXJfcmVsb2FkIiwgVkNQVV9TVEFUKGVmZXJfcmVsb2FkKSB9LApAQCAtMTA4LDcgKzEwNyw2IEBACiAJeyAibW11X3JlY3ljbGVkIiwgVk1fU1RBVChtbXVfcmVjeWNsZWQpIH0sCiAJeyAibW11X2NhY2hlX21pc3MiLCBWTV9TVEFUKG1tdV9jYWNoZV9taXNzKSB9LAogCXsgIm1tdV91bnN5bmMiLCBWTV9TVEFUKG1tdV91bnN5bmMpIH0sCi0JeyAibW11X3Vuc3luY19nbG9iYWwiLCBWTV9TVEFUKG1tdV91bnN5bmNfZ2xvYmFsKSB9LAogCXsgInJlbW90ZV90bGJfZmx1c2giLCBWTV9TVEFUKHJlbW90ZV90bGJfZmx1c2gpIH0sCiAJeyAibGFyZ2VwYWdlcyIsIFZNX1NUQVQobHBhZ2VzKSB9LAogCXsgTlVMTCB9CkBAIC0yMzQsNyArMjMyLDggQEAKIAkJZ290byBvdXQ7CiAJfQogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBkcHRlKTsgKytpKSB7Ci0JCWlmICgocGRwdGVbaV0gJiAxKSAmJiAocGRwdGVbaV0gJiAweGZmZmZmZmYwMDAwMDAxZTZ1bGwpKSB7CisJCWlmIChpc19wcmVzZW50X3B0ZShwZHB0ZVtpXSkgJiYKKwkJICAgIChwZHB0ZVtpXSAmIHZjcHUtPmFyY2gubW11LnJzdmRfYml0c19tYXNrWzBdWzJdKSkgewogCQkJcmV0ID0gMDsKIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0zMjEsNyArMzIwLDYgQEAKIAlrdm1feDg2X29wcy0+c2V0X2NyMCh2Y3B1LCBjcjApOwogCXZjcHUtPmFyY2guY3IwID0gY3IwOwogCi0Ja3ZtX21tdV9zeW5jX2dsb2JhbCh2Y3B1KTsKIAlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CiAJcmV0dXJuOwogfQpAQCAtMzcwLDcgKzM2OCw2IEBACiAJa3ZtX3g4Nl9vcHMtPnNldF9jcjQodmNwdSwgY3I0KTsKIAl2Y3B1LT5hcmNoLmNyNCA9IGNyNDsKIAl2Y3B1LT5hcmNoLm1tdS5iYXNlX3JvbGUuY3I0X3BnZSA9IChjcjQgJiBYODZfQ1I0X1BHRSkgJiYgIXRkcF9lbmFibGVkOwotCWt2bV9tbXVfc3luY19nbG9iYWwodmNwdSk7CiAJa3ZtX21tdV9yZXNldF9jb250ZXh0KHZjcHUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX3NldF9jcjQpOwpAQCAtNTIzLDYgKzUyMCw5IEBACiAJZWZlciB8PSB2Y3B1LT5hcmNoLnNoYWRvd19lZmVyICYgRUZFUl9MTUE7CiAKIAl2Y3B1LT5hcmNoLnNoYWRvd19lZmVyID0gZWZlcjsKKworCXZjcHUtPmFyY2gubW11LmJhc2Vfcm9sZS5ueGUgPSAoZWZlciAmIEVGRVJfTlgpICYmICF0ZHBfZW5hYmxlZDsKKwlrdm1fbW11X3Jlc2V0X2NvbnRleHQodmNwdSk7CiB9CiAKIHZvaWQga3ZtX2VuYWJsZV9lZmVyX2JpdHModTY0IG1hc2spCkBAIC02MzAsMTQgKzYzMCwxNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGt2bV92Y3B1X2FyY2ggKnZjcHUgPSAmdi0+YXJjaDsKIAl2b2lkICpzaGFyZWRfa2FkZHI7CisJdW5zaWduZWQgbG9uZyB0aGlzX3RzY19raHo7CiAKIAlpZiAoKCF2Y3B1LT50aW1lX3BhZ2UpKQogCQlyZXR1cm47CiAKLQlpZiAodW5saWtlbHkodmNwdS0+aHZfY2xvY2tfdHNjX2toeiAhPSBfX2dldF9jcHVfdmFyKGNwdV90c2Nfa2h6KSkpIHsKLQkJa3ZtX3NldF90aW1lX3NjYWxlKF9fZ2V0X2NwdV92YXIoY3B1X3RzY19raHopLCAmdmNwdS0+aHZfY2xvY2spOwotCQl2Y3B1LT5odl9jbG9ja190c2Nfa2h6ID0gX19nZXRfY3B1X3ZhcihjcHVfdHNjX2toeik7CisJdGhpc190c2Nfa2h6ID0gZ2V0X2NwdV92YXIoY3B1X3RzY19raHopOworCWlmICh1bmxpa2VseSh2Y3B1LT5odl9jbG9ja190c2Nfa2h6ICE9IHRoaXNfdHNjX2toeikpIHsKKwkJa3ZtX3NldF90aW1lX3NjYWxlKHRoaXNfdHNjX2toeiwgJnZjcHUtPmh2X2Nsb2NrKTsKKwkJdmNwdS0+aHZfY2xvY2tfdHNjX2toeiA9IHRoaXNfdHNjX2toejsKIAl9CisJcHV0X2NwdV92YXIoY3B1X3RzY19raHopOwogCiAJLyogS2VlcCBpcnEgZGlzYWJsZWQgdG8gcHJldmVudCBjaGFuZ2VzIHRvIHRoZSBjbG9jayAqLwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKQEAgLTg5Myw2ICs4OTYsOCBAQAogCWNhc2UgTVNSX0lBMzJfTEFTVElOVEZST01JUDoKIAljYXNlIE1TUl9JQTMyX0xBU1RJTlRUT0lQOgogCWNhc2UgTVNSX1ZNX0hTQVZFX1BBOgorCWNhc2UgTVNSX1A2X0VWTlRTRUwwOgorCWNhc2UgTVNSX1A2X0VWTlRTRUwxOgogCQlkYXRhID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBNU1JfTVRSUmNhcDoKQEAgLTEwMjQsNiArMTAyOSw3IEBACiAJY2FzZSBLVk1fQ0FQX1NZTkNfTU1VOgogCWNhc2UgS1ZNX0NBUF9SRUlOSkVDVF9DT05UUk9MOgogCWNhc2UgS1ZNX0NBUF9JUlFfSU5KRUNUX1NUQVRVUzoKKwljYXNlIEtWTV9DQVBfQVNTSUdOX0RFVl9JUlE6CiAJCXIgPSAxOwogCQlicmVhazsKIAljYXNlIEtWTV9DQVBfQ09BTEVTQ0VEX01NSU86CkBAIC0xMjQxLDQxICsxMjQ3LDUzIEBACiAJZW50cnktPmZsYWdzID0gMDsKIH0KIAorI2RlZmluZSBGKHgpIGJpdChYODZfRkVBVFVSRV8jI3gpCisKIHN0YXRpYyB2b2lkIGRvX2NwdWlkX2VudChzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqZW50cnksIHUzMiBmdW5jdGlvbiwKIAkJCSB1MzIgaW5kZXgsIGludCAqbmVudCwgaW50IG1heG5lbnQpCiB7Ci0JY29uc3QgdTMyIGt2bV9zdXBwb3J0ZWRfd29yZDBfeDg2X2ZlYXR1cmVzID0gYml0KFg4Nl9GRUFUVVJFX0ZQVSkgfAotCQliaXQoWDg2X0ZFQVRVUkVfVk1FKSB8IGJpdChYODZfRkVBVFVSRV9ERSkgfAotCQliaXQoWDg2X0ZFQVRVUkVfUFNFKSB8IGJpdChYODZfRkVBVFVSRV9UU0MpIHwKLQkJYml0KFg4Nl9GRUFUVVJFX01TUikgfCBiaXQoWDg2X0ZFQVRVUkVfUEFFKSB8Ci0JCWJpdChYODZfRkVBVFVSRV9DWDgpIHwgYml0KFg4Nl9GRUFUVVJFX0FQSUMpIHwKLQkJYml0KFg4Nl9GRUFUVVJFX1NFUCkgfCBiaXQoWDg2X0ZFQVRVUkVfUEdFKSB8Ci0JCWJpdChYODZfRkVBVFVSRV9DTU9WKSB8IGJpdChYODZfRkVBVFVSRV9QU0UzNikgfAotCQliaXQoWDg2X0ZFQVRVUkVfQ0xGTFNIKSB8IGJpdChYODZfRkVBVFVSRV9NTVgpIHwKLQkJYml0KFg4Nl9GRUFUVVJFX0ZYU1IpIHwgYml0KFg4Nl9GRUFUVVJFX1hNTSkgfAotCQliaXQoWDg2X0ZFQVRVUkVfWE1NMikgfCBiaXQoWDg2X0ZFQVRVUkVfU0VMRlNOT09QKTsKLQljb25zdCB1MzIga3ZtX3N1cHBvcnRlZF93b3JkMV94ODZfZmVhdHVyZXMgPSBiaXQoWDg2X0ZFQVRVUkVfRlBVKSB8Ci0JCWJpdChYODZfRkVBVFVSRV9WTUUpIHwgYml0KFg4Nl9GRUFUVVJFX0RFKSB8Ci0JCWJpdChYODZfRkVBVFVSRV9QU0UpIHwgYml0KFg4Nl9GRUFUVVJFX1RTQykgfAotCQliaXQoWDg2X0ZFQVRVUkVfTVNSKSB8IGJpdChYODZfRkVBVFVSRV9QQUUpIHwKLQkJYml0KFg4Nl9GRUFUVVJFX0NYOCkgfCBiaXQoWDg2X0ZFQVRVUkVfQVBJQykgfAotCQliaXQoWDg2X0ZFQVRVUkVfUEdFKSB8Ci0JCWJpdChYODZfRkVBVFVSRV9DTU9WKSB8IGJpdChYODZfRkVBVFVSRV9QU0UzNikgfAotCQliaXQoWDg2X0ZFQVRVUkVfTU1YKSB8IGJpdChYODZfRkVBVFVSRV9GWFNSKSB8Ci0JCWJpdChYODZfRkVBVFVSRV9TWVNDQUxMKSB8Ci0JCShpc19lZmVyX254KCkgPyBiaXQoWDg2X0ZFQVRVUkVfTlgpIDogMCkgfAorCXVuc2lnbmVkIGZfbnggPSBpc19lZmVyX254KCkgPyBGKE5YKSA6IDA7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAotCQliaXQoWDg2X0ZFQVRVUkVfTE0pIHwKKwl1bnNpZ25lZCBmX2xtID0gRihMTSk7CisjZWxzZQorCXVuc2lnbmVkIGZfbG0gPSAwOwogI2VuZGlmCi0JCWJpdChYODZfRkVBVFVSRV9GWFNSX09QVCkgfAotCQliaXQoWDg2X0ZFQVRVUkVfTU1YRVhUKSB8Ci0JCWJpdChYODZfRkVBVFVSRV8zRE5PV0VYVCkgfAotCQliaXQoWDg2X0ZFQVRVUkVfM0ROT1cpOwotCWNvbnN0IHUzMiBrdm1fc3VwcG9ydGVkX3dvcmQzX3g4Nl9mZWF0dXJlcyA9Ci0JCWJpdChYODZfRkVBVFVSRV9YTU0zKSB8IGJpdChYODZfRkVBVFVSRV9DWDE2KTsKKworCS8qIGNwdWlkIDEuZWR4ICovCisJY29uc3QgdTMyIGt2bV9zdXBwb3J0ZWRfd29yZDBfeDg2X2ZlYXR1cmVzID0KKwkJRihGUFUpIHwgRihWTUUpIHwgRihERSkgfCBGKFBTRSkgfAorCQlGKFRTQykgfCBGKE1TUikgfCBGKFBBRSkgfCBGKE1DRSkgfAorCQlGKENYOCkgfCBGKEFQSUMpIHwgMCAvKiBSZXNlcnZlZCAqLyB8IEYoU0VQKSB8CisJCUYoTVRSUikgfCBGKFBHRSkgfCBGKE1DQSkgfCBGKENNT1YpIHwKKwkJRihQQVQpIHwgRihQU0UzNikgfCAwIC8qIFBTTiAqLyB8IEYoQ0xGTFNIKSB8CisJCTAgLyogUmVzZXJ2ZWQsIERTLCBBQ1BJICovIHwgRihNTVgpIHwKKwkJRihGWFNSKSB8IEYoWE1NKSB8IEYoWE1NMikgfCBGKFNFTEZTTk9PUCkgfAorCQkwIC8qIEhUVCwgVE0sIFJlc2VydmVkLCBQQkUgKi87CisJLyogY3B1aWQgMHg4MDAwMDAwMS5lZHggKi8KKwljb25zdCB1MzIga3ZtX3N1cHBvcnRlZF93b3JkMV94ODZfZmVhdHVyZXMgPQorCQlGKEZQVSkgfCBGKFZNRSkgfCBGKERFKSB8IEYoUFNFKSB8CisJCUYoVFNDKSB8IEYoTVNSKSB8IEYoUEFFKSB8IEYoTUNFKSB8CisJCUYoQ1g4KSB8IEYoQVBJQykgfCAwIC8qIFJlc2VydmVkICovIHwgRihTWVNDQUxMKSB8CisJCUYoTVRSUikgfCBGKFBHRSkgfCBGKE1DQSkgfCBGKENNT1YpIHwKKwkJRihQQVQpIHwgRihQU0UzNikgfCAwIC8qIFJlc2VydmVkICovIHwKKwkJZl9ueCB8IDAgLyogUmVzZXJ2ZWQgKi8gfCBGKE1NWEVYVCkgfCBGKE1NWCkgfAorCQlGKEZYU1IpIHwgRihGWFNSX09QVCkgfCAwIC8qIEdCUEFHRVMgKi8gfCAwIC8qIFJEVFNDUCAqLyB8CisJCTAgLyogUmVzZXJ2ZWQgKi8gfCBmX2xtIHwgRigzRE5PV0VYVCkgfCBGKDNETk9XKTsKKwkvKiBjcHVpZCAxLmVjeCAqLworCWNvbnN0IHUzMiBrdm1fc3VwcG9ydGVkX3dvcmQ0X3g4Nl9mZWF0dXJlcyA9CisJCUYoWE1NMykgfCAwIC8qIFJlc2VydmVkLCBEVEVTNjQsIE1PTklUT1IgKi8gfAorCQkwIC8qIERTLUNQTCwgVk1YLCBTTVgsIEVTVCAqLyB8CisJCTAgLyogVE0yICovIHwgRihTU1NFMykgfCAwIC8qIENOWFQtSUQgKi8gfCAwIC8qIFJlc2VydmVkICovIHwKKwkJMCAvKiBSZXNlcnZlZCAqLyB8IEYoQ1gxNikgfCAwIC8qIHhUUFIgVXBkYXRlLCBQRENNICovIHwKKwkJMCAvKiBSZXNlcnZlZCwgRENBICovIHwgRihYTU00XzEpIHwKKwkJRihYTU00XzIpIHwgMCAvKiB4MkFQSUMgKi8gfCBGKE1PVkJFKSB8IEYoUE9QQ05UKSB8CisJCTAgLyogUmVzZXJ2ZWQsIFhTQVZFLCBPU1hTQVZFICovOworCS8qIGNwdWlkIDB4ODAwMDAwMDEuZWN4ICovCiAJY29uc3QgdTMyIGt2bV9zdXBwb3J0ZWRfd29yZDZfeDg2X2ZlYXR1cmVzID0KLQkJYml0KFg4Nl9GRUFUVVJFX0xBSEZfTE0pIHwgYml0KFg4Nl9GRUFUVVJFX0NNUF9MRUdBQ1kpIHwKLQkJYml0KFg4Nl9GRUFUVVJFX1NWTSk7CisJCUYoTEFIRl9MTSkgfCBGKENNUF9MRUdBQ1kpIHwgRihTVk0pIHwgMCAvKiBFeHRBcGljU3BhY2UgKi8gfAorCQlGKENSOF9MRUdBQ1kpIHwgRihBQk0pIHwgRihTU0U0QSkgfCBGKE1JU0FMSUdOU1NFKSB8CisJCUYoM0ROT1dQUkVGRVRDSCkgfCAwIC8qIE9TVlcgKi8gfCAwIC8qIElCUyAqLyB8IEYoU1NFNSkgfAorCQkwIC8qIFNLSU5JVCAqLyB8IDAgLyogV0RUICovOwogCiAJLyogYWxsIGNhbGxzIHRvIGNwdWlkX2NvdW50KCkgc2hvdWxkIGJlIG1hZGUgb24gdGhlIHNhbWUgY3B1ICovCiAJZ2V0X2NwdSgpOwpAQCAtMTI4OCw3ICsxMzA2LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSAxOgogCQllbnRyeS0+ZWR4ICY9IGt2bV9zdXBwb3J0ZWRfd29yZDBfeDg2X2ZlYXR1cmVzOwotCQllbnRyeS0+ZWN4ICY9IGt2bV9zdXBwb3J0ZWRfd29yZDNfeDg2X2ZlYXR1cmVzOworCQllbnRyeS0+ZWN4ICY9IGt2bV9zdXBwb3J0ZWRfd29yZDRfeDg2X2ZlYXR1cmVzOwogCQlicmVhazsKIAkvKiBmdW5jdGlvbiAyIGVudHJpZXMgYXJlIFNUQVRFRlVMLiBUaGF0IGlzLCByZXBlYXRlZCBjcHVpZCBjb21tYW5kcwogCSAqIG1heSByZXR1cm4gZGlmZmVyZW50IHZhbHVlcy4gVGhpcyBmb3JjZXMgdXMgdG8gZ2V0X2NwdSgpIGJlZm9yZQpAQCAtMTM1MCw2ICsxMzY4LDggQEAKIAlwdXRfY3B1KCk7CiB9CiAKKyN1bmRlZiBGCisKIHN0YXRpYyBpbnQga3ZtX2Rldl9pb2N0bF9nZXRfc3VwcG9ydGVkX2NwdWlkKHN0cnVjdCBrdm1fY3B1aWQyICpjcHVpZCwKIAkJCQkgICAgIHN0cnVjdCBrdm1fY3B1aWRfZW50cnkyIF9fdXNlciAqZW50cmllcykKIHsKQEAgLTE0MjEsOCArMTQ0MSw3IEBACiAJCXJldHVybiAtRU5YSU87CiAJdmNwdV9sb2FkKHZjcHUpOwogCi0Jc2V0X2JpdChpcnEtPmlycSwgdmNwdS0+YXJjaC5pcnFfcGVuZGluZyk7Ci0Jc2V0X2JpdChpcnEtPmlycSAvIEJJVFNfUEVSX0xPTkcsICZ2Y3B1LT5hcmNoLmlycV9zdW1tYXJ5KTsKKwlrdm1fcXVldWVfaW50ZXJydXB0KHZjcHUsIGlycS0+aXJxLCBmYWxzZSk7CiAKIAl2Y3B1X3B1dCh2Y3B1KTsKIApAQCAtMTU4NCw4ICsxNjAzLDcgQEAKIAkJciA9IC1FSU5WQUw7CiAJfQogb3V0OgotCWlmIChsYXBpYykKLQkJa2ZyZWUobGFwaWMpOworCWtmcmVlKGxhcGljKTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtMTYwNiwxMCArMTYyNCwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRvd25fd3JpdGUoJmt2bS0+c2xvdHNfbG9jayk7CisJc3Bpbl9sb2NrKCZrdm0tPm1tdV9sb2NrKTsKIAogCWt2bV9tbXVfY2hhbmdlX21tdV9wYWdlcyhrdm0sIGt2bV9ucl9tbXVfcGFnZXMpOwogCWt2bS0+YXJjaC5uX3JlcXVlc3RlZF9tbXVfcGFnZXMgPSBrdm1fbnJfbW11X3BhZ2VzOwogCisJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogCXVwX3dyaXRlKCZrdm0tPnNsb3RzX2xvY2spOwogCXJldHVybiAwOwogfQpAQCAtMTc4NSw3ICsxODA1LDkgQEAKIAogCS8qIElmIG5vdGhpbmcgaXMgZGlydHksIGRvbid0IGJvdGhlciBtZXNzaW5nIHdpdGggcGFnZSB0YWJsZXMuICovCiAJaWYgKGlzX2RpcnR5KSB7CisJCXNwaW5fbG9jaygma3ZtLT5tbXVfbG9jayk7CiAJCWt2bV9tbXVfc2xvdF9yZW1vdmVfd3JpdGVfYWNjZXNzKGt2bSwgbG9nLT5zbG90KTsKKwkJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogCQlrdm1fZmx1c2hfcmVtb3RlX3RsYnMoa3ZtKTsKIAkJbWVtc2xvdCA9ICZrdm0tPm1lbXNsb3RzW2xvZy0+c2xvdF07CiAJCW4gPSBBTElHTihtZW1zbG90LT5ucGFnZXMsIEJJVFNfUEVSX0xPTkcpIC8gODsKQEAgLTIzNjAsNyArMjM4Miw3IEBACiAJCQl1MTYgZXJyb3JfY29kZSwKIAkJCWludCBlbXVsYXRpb25fdHlwZSkKIHsKLQlpbnQgcjsKKwlpbnQgciwgc2hhZG93X21hc2s7CiAJc3RydWN0IGRlY29kZV9jYWNoZSAqYzsKIAogCWt2bV9jbGVhcl9leGNlcHRpb25fcXVldWUodmNwdSk7CkBAIC0yNDA4LDcgKzI0MzAsMTYgQEAKIAkJfQogCX0KIAorCWlmIChlbXVsYXRpb25fdHlwZSAmIEVNVUxUWVBFX1NLSVApIHsKKwkJa3ZtX3JpcF93cml0ZSh2Y3B1LCB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5kZWNvZGUuZWlwKTsKKwkJcmV0dXJuIEVNVUxBVEVfRE9ORTsKKwl9CisKIAlyID0geDg2X2VtdWxhdGVfaW5zbigmdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQsICZlbXVsYXRlX29wcyk7CisJc2hhZG93X21hc2sgPSB2Y3B1LT5hcmNoLmVtdWxhdGVfY3R4dC5pbnRlcnJ1cHRpYmlsaXR5OworCisJaWYgKHIgPT0gMCkKKwkJa3ZtX3g4Nl9vcHMtPnNldF9pbnRlcnJ1cHRfc2hhZG93KHZjcHUsIHNoYWRvd19tYXNrKTsKIAogCWlmICh2Y3B1LT5hcmNoLnBpby5zdHJpbmcpCiAJCXJldHVybiBFTVVMQVRFX0RPX01NSU87CkBAIC0yNzYxLDcgKzI3OTIsNyBAQAogCWt2bV9tbXVfc2V0X25vbnByZXNlbnRfcHRlcygwdWxsLCAwdWxsKTsKIAlrdm1fbW11X3NldF9iYXNlX3B0ZXMoUFRfUFJFU0VOVF9NQVNLKTsKIAlrdm1fbW11X3NldF9tYXNrX3B0ZXMoUFRfVVNFUl9NQVNLLCBQVF9BQ0NFU1NFRF9NQVNLLAotCQkJUFRfRElSVFlfTUFTSywgUFQ2NF9OWF9NQVNLLCAwLCAwKTsKKwkJCVBUX0RJUlRZX01BU0ssIFBUNjRfTlhfTUFTSywgMCk7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQogCQlwZXJfY3B1KGNwdV90c2Nfa2h6LCBjcHUpID0gdHNjX2toejsKQEAgLTMwMTIsNiArMzA0MywxNiBAQAogCXJldHVybiBiZXN0OwogfQogCitpbnQgY3B1aWRfbWF4cGh5YWRkcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgKmJlc3Q7CisKKwliZXN0ID0ga3ZtX2ZpbmRfY3B1aWRfZW50cnkodmNwdSwgMHg4MDAwMDAwOCwgMCk7CisJaWYgKGJlc3QpCisJCXJldHVybiBiZXN0LT5lYXggJiAweGZmOworCXJldHVybiAzNjsKK30KKwogdm9pZCBrdm1fZW11bGF0ZV9jcHVpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJdTMyIGZ1bmN0aW9uLCBpbmRleDsKQEAgLTMwNDgsMTAgKzMwODksOSBAQAogc3RhdGljIGludCBkbV9yZXF1ZXN0X2Zvcl9pcnFfaW5qZWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkJICBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKIHsKLQlyZXR1cm4gKCF2Y3B1LT5hcmNoLmlycV9zdW1tYXJ5ICYmCisJcmV0dXJuICghaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSAmJiAha3ZtX2NwdV9oYXNfaW50ZXJydXB0KHZjcHUpICYmCiAJCWt2bV9ydW4tPnJlcXVlc3RfaW50ZXJydXB0X3dpbmRvdyAmJgotCQl2Y3B1LT5hcmNoLmludGVycnVwdF93aW5kb3dfb3BlbiAmJgotCQkoa3ZtX3g4Nl9vcHMtPmdldF9yZmxhZ3ModmNwdSkgJiBYODZfRUZMQUdTX0lGKSk7CisJCWt2bV9hcmNoX2ludGVycnVwdF9hbGxvd2VkKHZjcHUpKTsKIH0KIAogc3RhdGljIHZvaWQgcG9zdF9rdm1fcnVuX3NhdmUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LApAQCAtMzA2NCw4ICszMTA0LDkgQEAKIAkJa3ZtX3J1bi0+cmVhZHlfZm9yX2ludGVycnVwdF9pbmplY3Rpb24gPSAxOwogCWVsc2UKIAkJa3ZtX3J1bi0+cmVhZHlfZm9yX2ludGVycnVwdF9pbmplY3Rpb24gPQotCQkJCQkodmNwdS0+YXJjaC5pbnRlcnJ1cHRfd2luZG93X29wZW4gJiYKLQkJCQkJIHZjcHUtPmFyY2guaXJxX3N1bW1hcnkgPT0gMCk7CisJCQlrdm1fYXJjaF9pbnRlcnJ1cHRfYWxsb3dlZCh2Y3B1KSAmJgorCQkJIWt2bV9jcHVfaGFzX2ludGVycnVwdCh2Y3B1KSAmJgorCQkJIWt2bV9ldmVudF9uZWVkc19yZWluamVjdGlvbih2Y3B1KTsKIH0KIAogc3RhdGljIHZvaWQgdmFwaWNfZW50ZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtMzA5NCw5ICszMTM1LDYzIEBACiAJdXBfcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKIH0KIAorc3RhdGljIHZvaWQgdXBkYXRlX2NyOF9pbnRlcmNlcHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWludCBtYXhfaXJyLCB0cHI7CisKKwlpZiAoIWt2bV94ODZfb3BzLT51cGRhdGVfY3I4X2ludGVyY2VwdCkKKwkJcmV0dXJuOworCisJaWYgKCF2Y3B1LT5hcmNoLmFwaWMtPnZhcGljX2FkZHIpCisJCW1heF9pcnIgPSBrdm1fbGFwaWNfZmluZF9oaWdoZXN0X2lycih2Y3B1KTsKKwllbHNlCisJCW1heF9pcnIgPSAtMTsKKworCWlmIChtYXhfaXJyICE9IC0xKQorCQltYXhfaXJyID4+PSA0OworCisJdHByID0ga3ZtX2xhcGljX2dldF9jcjgodmNwdSk7CisKKwlrdm1feDg2X29wcy0+dXBkYXRlX2NyOF9pbnRlcmNlcHQodmNwdSwgdHByLCBtYXhfaXJyKTsKK30KKworc3RhdGljIHZvaWQgaW5qZWN0X3BlbmRpbmdfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCit7CisJaWYgKHZjcHUtPmd1ZXN0X2RlYnVnICYgS1ZNX0dVRVNUREJHX1NJTkdMRVNURVApCisJCWt2bV94ODZfb3BzLT5zZXRfaW50ZXJydXB0X3NoYWRvdyh2Y3B1LCAwKTsKKworCS8qIHRyeSB0byByZWluamVjdCBwcmV2aW91cyBldmVudHMgaWYgYW55ICovCisJaWYgKHZjcHUtPmFyY2gubm1pX2luamVjdGVkKSB7CisJCWt2bV94ODZfb3BzLT5zZXRfbm1pKHZjcHUpOworCQlyZXR1cm47CisJfQorCisJaWYgKHZjcHUtPmFyY2guaW50ZXJydXB0LnBlbmRpbmcpIHsKKwkJa3ZtX3g4Nl9vcHMtPnNldF9pcnEodmNwdSk7CisJCXJldHVybjsKKwl9CisKKwkvKiB0cnkgdG8gaW5qZWN0IG5ldyBldmVudCBpZiBwZW5kaW5nICovCisJaWYgKHZjcHUtPmFyY2gubm1pX3BlbmRpbmcpIHsKKwkJaWYgKGt2bV94ODZfb3BzLT5ubWlfYWxsb3dlZCh2Y3B1KSkgeworCQkJdmNwdS0+YXJjaC5ubWlfcGVuZGluZyA9IGZhbHNlOworCQkJdmNwdS0+YXJjaC5ubWlfaW5qZWN0ZWQgPSB0cnVlOworCQkJa3ZtX3g4Nl9vcHMtPnNldF9ubWkodmNwdSk7CisJCX0KKwl9IGVsc2UgaWYgKGt2bV9jcHVfaGFzX2ludGVycnVwdCh2Y3B1KSkgeworCQlpZiAoa3ZtX3g4Nl9vcHMtPmludGVycnVwdF9hbGxvd2VkKHZjcHUpKSB7CisJCQlrdm1fcXVldWVfaW50ZXJydXB0KHZjcHUsIGt2bV9jcHVfZ2V0X2ludGVycnVwdCh2Y3B1KSwKKwkJCQkJICAgIGZhbHNlKTsKKwkJCWt2bV94ODZfb3BzLT5zZXRfaXJxKHZjcHUpOworCQl9CisJfQorfQorCiBzdGF0aWMgaW50IHZjcHVfZW50ZXJfZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqa3ZtX3J1bikKIHsKIAlpbnQgcjsKKwlib29sIHJlcV9pbnRfd2luID0gIWlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkgJiYKKwkJa3ZtX3J1bi0+cmVxdWVzdF9pbnRlcnJ1cHRfd2luZG93OwogCiAJaWYgKHZjcHUtPnJlcXVlc3RzKQogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEtWTV9SRVFfTU1VX1JFTE9BRCwgJnZjcHUtPnJlcXVlc3RzKSkKQEAgLTMxMjgsOSArMzIyMyw2IEBACiAJCX0KIAl9CiAKLQljbGVhcl9iaXQoS1ZNX1JFUV9QRU5ESU5HX1RJTUVSLCAmdmNwdS0+cmVxdWVzdHMpOwotCWt2bV9pbmplY3RfcGVuZGluZ190aW1lcl9pcnFzKHZjcHUpOwotCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAKIAlrdm1feDg2X29wcy0+cHJlcGFyZV9ndWVzdF9zd2l0Y2godmNwdSk7CkBAIC0zMTM4LDYgKzMyMzAsOSBAQAogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAorCWNsZWFyX2JpdChLVk1fUkVRX0tJQ0ssICZ2Y3B1LT5yZXF1ZXN0cyk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKwogCWlmICh2Y3B1LT5yZXF1ZXN0cyB8fCBuZWVkX3Jlc2NoZWQoKSB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJCXByZWVtcHRfZW5hYmxlKCk7CkBAIC0zMTQ1LDIxICszMjQwLDIxIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXZjcHUtPmd1ZXN0X21vZGUgPSAxOwotCS8qCi0JICogTWFrZSBzdXJlIHRoYXQgZ3Vlc3RfbW9kZSBhc3NpZ25tZW50IHdvbid0IGhhcHBlbiBhZnRlcgotCSAqIHRlc3RpbmcgdGhlIHBlbmRpbmcgSVJRIHZlY3RvciBiaXRtYXAuCi0JICovCi0Jc21wX3dtYigpOwotCiAJaWYgKHZjcHUtPmFyY2guZXhjZXB0aW9uLnBlbmRpbmcpCiAJCV9fcXVldWVfZXhjZXB0aW9uKHZjcHUpOwotCWVsc2UgaWYgKGlycWNoaXBfaW5fa2VybmVsKHZjcHUtPmt2bSkpCi0JCWt2bV94ODZfb3BzLT5pbmplY3RfcGVuZGluZ19pcnEodmNwdSk7CiAJZWxzZQotCQlrdm1feDg2X29wcy0+aW5qZWN0X3BlbmRpbmdfdmVjdG9ycyh2Y3B1LCBrdm1fcnVuKTsKKwkJaW5qZWN0X3BlbmRpbmdfaXJxKHZjcHUsIGt2bV9ydW4pOwogCi0Ja3ZtX2xhcGljX3N5bmNfdG9fdmFwaWModmNwdSk7CisJLyogZW5hYmxlIE5NSS9JUlEgd2luZG93IG9wZW4gZXhpdHMgaWYgbmVlZGVkICovCisJaWYgKHZjcHUtPmFyY2gubm1pX3BlbmRpbmcpCisJCWt2bV94ODZfb3BzLT5lbmFibGVfbm1pX3dpbmRvdyh2Y3B1KTsKKwllbHNlIGlmIChrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkgfHwgcmVxX2ludF93aW4pCisJCWt2bV94ODZfb3BzLT5lbmFibGVfaXJxX3dpbmRvdyh2Y3B1KTsKKworCWlmIChrdm1fbGFwaWNfZW5hYmxlZCh2Y3B1KSkgeworCQl1cGRhdGVfY3I4X2ludGVyY2VwdCh2Y3B1KTsKKwkJa3ZtX2xhcGljX3N5bmNfdG9fdmFwaWModmNwdSk7CisJfQogCiAJdXBfcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKIApAQCAtMzE5Myw3ICszMjg4LDcgQEAKIAlzZXRfZGVidWdyZWcodmNwdS0+YXJjaC5ob3N0X2RyNiwgNik7CiAJc2V0X2RlYnVncmVnKHZjcHUtPmFyY2guaG9zdF9kcjcsIDcpOwogCi0JdmNwdS0+Z3Vlc3RfbW9kZSA9IDA7CisJc2V0X2JpdChLVk1fUkVRX0tJQ0ssICZ2Y3B1LT5yZXF1ZXN0cyk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJKyt2Y3B1LT5zdGF0LmV4aXRzOwpAQCAtMzIyMCw4ICszMzE1LDYgQEAKIAkJcHJvZmlsZV9oaXQoS1ZNX1BST0ZJTElORywgKHZvaWQgKilyaXApOwogCX0KIAotCWlmICh2Y3B1LT5hcmNoLmV4Y2VwdGlvbi5wZW5kaW5nICYmIGt2bV94ODZfb3BzLT5leGNlcHRpb25faW5qZWN0ZWQodmNwdSkpCi0JCXZjcHUtPmFyY2guZXhjZXB0aW9uLnBlbmRpbmcgPSBmYWxzZTsKIAogCWt2bV9sYXBpY19zeW5jX2Zyb21fdmFwaWModmNwdSk7CiAKQEAgLTMyMzAsNiArMzMyMyw3IEBACiAJcmV0dXJuIHI7CiB9CiAKKwogc3RhdGljIGludCBfX3ZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKmt2bV9ydW4pCiB7CiAJaW50IHI7CkBAIC0zMjU2LDI5ICszMzUwLDQyIEBACiAJCQlrdm1fdmNwdV9ibG9jayh2Y3B1KTsKIAkJCWRvd25fcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS1ZNX1JFUV9VTkhBTFQsICZ2Y3B1LT5yZXF1ZXN0cykpCi0JCQkJaWYgKHZjcHUtPmFyY2gubXBfc3RhdGUgPT0gS1ZNX01QX1NUQVRFX0hBTFRFRCkKKwkJCXsKKwkJCQlzd2l0Y2godmNwdS0+YXJjaC5tcF9zdGF0ZSkgeworCQkJCWNhc2UgS1ZNX01QX1NUQVRFX0hBTFRFRDoKIAkJCQkJdmNwdS0+YXJjaC5tcF9zdGF0ZSA9Ci0JCQkJCQkJS1ZNX01QX1NUQVRFX1JVTk5BQkxFOwotCQkJaWYgKHZjcHUtPmFyY2gubXBfc3RhdGUgIT0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFKQotCQkJCXIgPSAtRUlOVFI7CisJCQkJCQlLVk1fTVBfU1RBVEVfUlVOTkFCTEU7CisJCQkJY2FzZSBLVk1fTVBfU1RBVEVfUlVOTkFCTEU6CisJCQkJCWJyZWFrOworCQkJCWNhc2UgS1ZNX01QX1NUQVRFX1NJUElfUkVDRUlWRUQ6CisJCQkJZGVmYXVsdDoKKwkJCQkJciA9IC1FSU5UUjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQogCQl9CiAKLQkJaWYgKHIgPiAwKSB7Ci0JCQlpZiAoZG1fcmVxdWVzdF9mb3JfaXJxX2luamVjdGlvbih2Y3B1LCBrdm1fcnVuKSkgewotCQkJCXIgPSAtRUlOVFI7Ci0JCQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwotCQkJCSsrdmNwdS0+c3RhdC5yZXF1ZXN0X2lycV9leGl0czsKLQkJCX0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCXIgPSAtRUlOVFI7Ci0JCQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwotCQkJCSsrdmNwdS0+c3RhdC5zaWduYWxfZXhpdHM7Ci0JCQl9Ci0JCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKLQkJCQl1cF9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOwotCQkJCWt2bV9yZXNjaGVkKHZjcHUpOwotCQkJCWRvd25fcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKLQkJCX0KKwkJaWYgKHIgPD0gMCkKKwkJCWJyZWFrOworCisJCWNsZWFyX2JpdChLVk1fUkVRX1BFTkRJTkdfVElNRVIsICZ2Y3B1LT5yZXF1ZXN0cyk7CisJCWlmIChrdm1fY3B1X2hhc19wZW5kaW5nX3RpbWVyKHZjcHUpKQorCQkJa3ZtX2luamVjdF9wZW5kaW5nX3RpbWVyX2lycXModmNwdSk7CisKKwkJaWYgKGRtX3JlcXVlc3RfZm9yX2lycV9pbmplY3Rpb24odmNwdSwga3ZtX3J1bikpIHsKKwkJCXIgPSAtRUlOVFI7CisJCQlrdm1fcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CisJCQkrK3ZjcHUtPnN0YXQucmVxdWVzdF9pcnFfZXhpdHM7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyID0gLUVJTlRSOworCQkJa3ZtX3J1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOworCQkJKyt2Y3B1LT5zdGF0LnNpZ25hbF9leGl0czsKKwkJfQorCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKKwkJCXVwX3JlYWQoJnZjcHUtPmt2bS0+c2xvdHNfbG9jayk7CisJCQlrdm1fcmVzY2hlZCh2Y3B1KTsKKwkJCWRvd25fcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKIAkJfQogCX0KIApAQCAtMzQ0Miw3ICszNTQ5LDYgQEAKIAkJCQkgIHN0cnVjdCBrdm1fc3JlZ3MgKnNyZWdzKQogewogCXN0cnVjdCBkZXNjcmlwdG9yX3RhYmxlIGR0OwotCWludCBwZW5kaW5nX3ZlYzsKIAogCXZjcHVfbG9hZCh2Y3B1KTsKIApAQCAtMzQ3MiwxNiArMzU3OCwxMSBAQAogCXNyZWdzLT5lZmVyID0gdmNwdS0+YXJjaC5zaGFkb3dfZWZlcjsKIAlzcmVncy0+YXBpY19iYXNlID0ga3ZtX2dldF9hcGljX2Jhc2UodmNwdSk7CiAKLQlpZiAoaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSkgewotCQltZW1zZXQoc3JlZ3MtPmludGVycnVwdF9iaXRtYXAsIDAsCi0JCSAgICAgICBzaXplb2Ygc3JlZ3MtPmludGVycnVwdF9iaXRtYXApOwotCQlwZW5kaW5nX3ZlYyA9IGt2bV94ODZfb3BzLT5nZXRfaXJxKHZjcHUpOwotCQlpZiAocGVuZGluZ192ZWMgPj0gMCkKLQkJCXNldF9iaXQocGVuZGluZ192ZWMsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKilzcmVncy0+aW50ZXJydXB0X2JpdG1hcCk7Ci0JfSBlbHNlCi0JCW1lbWNweShzcmVncy0+aW50ZXJydXB0X2JpdG1hcCwgdmNwdS0+YXJjaC5pcnFfcGVuZGluZywKLQkJICAgICAgIHNpemVvZiBzcmVncy0+aW50ZXJydXB0X2JpdG1hcCk7CisJbWVtc2V0KHNyZWdzLT5pbnRlcnJ1cHRfYml0bWFwLCAwLCBzaXplb2Ygc3JlZ3MtPmludGVycnVwdF9iaXRtYXApOworCisJaWYgKHZjcHUtPmFyY2guaW50ZXJydXB0LnBlbmRpbmcgJiYgIXZjcHUtPmFyY2guaW50ZXJydXB0LnNvZnQpCisJCXNldF9iaXQodmNwdS0+YXJjaC5pbnRlcnJ1cHQubnIsCisJCQkodW5zaWduZWQgbG9uZyAqKXNyZWdzLT5pbnRlcnJ1cHRfYml0bWFwKTsKIAogCXZjcHVfcHV0KHZjcHUpOwogCkBAIC0zNjg4LDcgKzM3ODksNiBAQAogCXRzcy0+ZnMgPSBnZXRfc2VnbWVudF9zZWxlY3Rvcih2Y3B1LCBWQ1BVX1NSRUdfRlMpOwogCXRzcy0+Z3MgPSBnZXRfc2VnbWVudF9zZWxlY3Rvcih2Y3B1LCBWQ1BVX1NSRUdfR1MpOwogCXRzcy0+bGR0X3NlbGVjdG9yID0gZ2V0X3NlZ21lbnRfc2VsZWN0b3IodmNwdSwgVkNQVV9TUkVHX0xEVFIpOwotCXRzcy0+cHJldl90YXNrX2xpbmsgPSBnZXRfc2VnbWVudF9zZWxlY3Rvcih2Y3B1LCBWQ1BVX1NSRUdfVFIpOwogfQogCiBzdGF0aWMgaW50IGxvYWRfc3RhdGVfZnJvbV90c3MzMihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCkBAIC0zNzg1LDggKzM4ODUsOCBAQAogfQogCiBzdGF0aWMgaW50IGt2bV90YXNrX3N3aXRjaF8xNihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHUxNiB0c3Nfc2VsZWN0b3IsCi0JCSAgICAgICB1MzIgb2xkX3Rzc19iYXNlLAotCQkgICAgICAgc3RydWN0IGRlc2Nfc3RydWN0ICpuc2VnX2Rlc2MpCisJCQkgICAgICB1MTYgb2xkX3Rzc19zZWwsIHUzMiBvbGRfdHNzX2Jhc2UsCisJCQkgICAgICBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKm5zZWdfZGVzYykKIHsKIAlzdHJ1Y3QgdHNzX3NlZ21lbnRfMTYgdHNzX3NlZ21lbnRfMTY7CiAJaW50IHJldCA9IDA7CkBAIC0zODA1LDYgKzM5MDUsMTYgQEAKIAkJCSAgICZ0c3Nfc2VnbWVudF8xNiwgc2l6ZW9mIHRzc19zZWdtZW50XzE2KSkKIAkJZ290byBvdXQ7CiAKKwlpZiAob2xkX3Rzc19zZWwgIT0gMHhmZmZmKSB7CisJCXRzc19zZWdtZW50XzE2LnByZXZfdGFza19saW5rID0gb2xkX3Rzc19zZWw7CisKKwkJaWYgKGt2bV93cml0ZV9ndWVzdCh2Y3B1LT5rdm0sCisJCQkJICAgIGdldF90c3NfYmFzZV9hZGRyKHZjcHUsIG5zZWdfZGVzYyksCisJCQkJICAgICZ0c3Nfc2VnbWVudF8xNi5wcmV2X3Rhc2tfbGluaywKKwkJCQkgICAgc2l6ZW9mIHRzc19zZWdtZW50XzE2LnByZXZfdGFza19saW5rKSkKKwkJCWdvdG8gb3V0OworCX0KKwogCWlmIChsb2FkX3N0YXRlX2Zyb21fdHNzMTYodmNwdSwgJnRzc19zZWdtZW50XzE2KSkKIAkJZ290byBvdXQ7CiAKQEAgLTM4MTQsNyArMzkyNCw3IEBACiB9CiAKIHN0YXRpYyBpbnQga3ZtX3Rhc2tfc3dpdGNoXzMyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTE2IHRzc19zZWxlY3RvciwKLQkJICAgICAgIHUzMiBvbGRfdHNzX2Jhc2UsCisJCSAgICAgICB1MTYgb2xkX3Rzc19zZWwsIHUzMiBvbGRfdHNzX2Jhc2UsCiAJCSAgICAgICBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKm5zZWdfZGVzYykKIHsKIAlzdHJ1Y3QgdHNzX3NlZ21lbnRfMzIgdHNzX3NlZ21lbnRfMzI7CkBAIC0zODM0LDYgKzM5NDQsMTYgQEAKIAkJCSAgICZ0c3Nfc2VnbWVudF8zMiwgc2l6ZW9mIHRzc19zZWdtZW50XzMyKSkKIAkJZ290byBvdXQ7CiAKKwlpZiAob2xkX3Rzc19zZWwgIT0gMHhmZmZmKSB7CisJCXRzc19zZWdtZW50XzMyLnByZXZfdGFza19saW5rID0gb2xkX3Rzc19zZWw7CisKKwkJaWYgKGt2bV93cml0ZV9ndWVzdCh2Y3B1LT5rdm0sCisJCQkJICAgIGdldF90c3NfYmFzZV9hZGRyKHZjcHUsIG5zZWdfZGVzYyksCisJCQkJICAgICZ0c3Nfc2VnbWVudF8zMi5wcmV2X3Rhc2tfbGluaywKKwkJCQkgICAgc2l6ZW9mIHRzc19zZWdtZW50XzMyLnByZXZfdGFza19saW5rKSkKKwkJCWdvdG8gb3V0OworCX0KKwogCWlmIChsb2FkX3N0YXRlX2Zyb21fdHNzMzIodmNwdSwgJnRzc19zZWdtZW50XzMyKSkKIAkJZ290byBvdXQ7CiAKQEAgLTM4ODcsMTQgKzQwMDcsMjIgQEAKIAkJa3ZtX3g4Nl9vcHMtPnNldF9yZmxhZ3ModmNwdSwgZWZsYWdzICYgflg4Nl9FRkxBR1NfTlQpOwogCX0KIAotCWt2bV94ODZfb3BzLT5za2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCS8qIHNldCBiYWNrIGxpbmsgdG8gcHJldiB0YXNrIG9ubHkgaWYgTlQgYml0IGlzIHNldCBpbiBlZmxhZ3MKKwkgICBub3RlIHRoYXQgb2xkX3Rzc19zZWwgaXMgbm90IHVzZWQgYWZldHIgdGhpcyBwb2ludCAqLworCWlmIChyZWFzb24gIT0gVEFTS19TV0lUQ0hfQ0FMTCAmJiByZWFzb24gIT0gVEFTS19TV0lUQ0hfR0FURSkKKwkJb2xkX3Rzc19zZWwgPSAweGZmZmY7CisKKwkvKiBzZXQgYmFjayBsaW5rIHRvIHByZXYgdGFzayBvbmx5IGlmIE5UIGJpdCBpcyBzZXQgaW4gZWZsYWdzCisJICAgbm90ZSB0aGF0IG9sZF90c3Nfc2VsIGlzIG5vdCB1c2VkIGFmZXRyIHRoaXMgcG9pbnQgKi8KKwlpZiAocmVhc29uICE9IFRBU0tfU1dJVENIX0NBTEwgJiYgcmVhc29uICE9IFRBU0tfU1dJVENIX0dBVEUpCisJCW9sZF90c3Nfc2VsID0gMHhmZmZmOwogCiAJaWYgKG5zZWdfZGVzYy50eXBlICYgOCkKLQkJcmV0ID0ga3ZtX3Rhc2tfc3dpdGNoXzMyKHZjcHUsIHRzc19zZWxlY3Rvciwgb2xkX3Rzc19iYXNlLAotCQkJCQkgJm5zZWdfZGVzYyk7CisJCXJldCA9IGt2bV90YXNrX3N3aXRjaF8zMih2Y3B1LCB0c3Nfc2VsZWN0b3IsIG9sZF90c3Nfc2VsLAorCQkJCQkgb2xkX3Rzc19iYXNlLCAmbnNlZ19kZXNjKTsKIAllbHNlCi0JCXJldCA9IGt2bV90YXNrX3N3aXRjaF8xNih2Y3B1LCB0c3Nfc2VsZWN0b3IsIG9sZF90c3NfYmFzZSwKLQkJCQkJICZuc2VnX2Rlc2MpOworCQlyZXQgPSBrdm1fdGFza19zd2l0Y2hfMTYodmNwdSwgdHNzX3NlbGVjdG9yLCBvbGRfdHNzX3NlbCwKKwkJCQkJIG9sZF90c3NfYmFzZSwgJm5zZWdfZGVzYyk7CiAKIAlpZiAocmVhc29uID09IFRBU0tfU1dJVENIX0NBTEwgfHwgcmVhc29uID09IFRBU0tfU1dJVENIX0dBVEUpIHsKIAkJdTMyIGVmbGFncyA9IGt2bV94ODZfb3BzLT5nZXRfcmZsYWdzKHZjcHUpOwpAQCAtMzkyMCw3ICs0MDQ4LDcgQEAKIAkJCQkgIHN0cnVjdCBrdm1fc3JlZ3MgKnNyZWdzKQogewogCWludCBtbXVfcmVzZXRfbmVlZGVkID0gMDsKLQlpbnQgaSwgcGVuZGluZ192ZWMsIG1heF9iaXRzOworCWludCBwZW5kaW5nX3ZlYywgbWF4X2JpdHM7CiAJc3RydWN0IGRlc2NyaXB0b3JfdGFibGUgZHQ7CiAKIAl2Y3B1X2xvYWQodmNwdSk7CkBAIC0zOTM0LDcgKzQwNjIsMTMgQEAKIAogCXZjcHUtPmFyY2guY3IyID0gc3JlZ3MtPmNyMjsKIAltbXVfcmVzZXRfbmVlZGVkIHw9IHZjcHUtPmFyY2guY3IzICE9IHNyZWdzLT5jcjM7Ci0JdmNwdS0+YXJjaC5jcjMgPSBzcmVncy0+Y3IzOworCisJZG93bl9yZWFkKCZ2Y3B1LT5rdm0tPnNsb3RzX2xvY2spOworCWlmIChnZm5fdG9fbWVtc2xvdCh2Y3B1LT5rdm0sIHNyZWdzLT5jcjMgPj4gUEFHRV9TSElGVCkpCisJCXZjcHUtPmFyY2guY3IzID0gc3JlZ3MtPmNyMzsKKwllbHNlCisJCXNldF9iaXQoS1ZNX1JFUV9UUklQTEVfRkFVTFQsICZ2Y3B1LT5yZXF1ZXN0cyk7CisJdXBfcmVhZCgmdmNwdS0+a3ZtLT5zbG90c19sb2NrKTsKIAogCWt2bV9zZXRfY3I4KHZjcHUsIHNyZWdzLT5jcjgpOwogCkBAIC0zOTU2LDI1ICs0MDkwLDE0IEBACiAJaWYgKG1tdV9yZXNldF9uZWVkZWQpCiAJCWt2bV9tbXVfcmVzZXRfY29udGV4dCh2Y3B1KTsKIAotCWlmICghaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSkgewotCQltZW1jcHkodmNwdS0+YXJjaC5pcnFfcGVuZGluZywgc3JlZ3MtPmludGVycnVwdF9iaXRtYXAsCi0JCSAgICAgICBzaXplb2YgdmNwdS0+YXJjaC5pcnFfcGVuZGluZyk7Ci0JCXZjcHUtPmFyY2guaXJxX3N1bW1hcnkgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2Y3B1LT5hcmNoLmlycV9wZW5kaW5nKTsgKytpKQotCQkJaWYgKHZjcHUtPmFyY2guaXJxX3BlbmRpbmdbaV0pCi0JCQkJX19zZXRfYml0KGksICZ2Y3B1LT5hcmNoLmlycV9zdW1tYXJ5KTsKLQl9IGVsc2UgewotCQltYXhfYml0cyA9IChzaXplb2Ygc3JlZ3MtPmludGVycnVwdF9iaXRtYXApIDw8IDM7Ci0JCXBlbmRpbmdfdmVjID0gZmluZF9maXJzdF9iaXQoCi0JCQkoY29uc3QgdW5zaWduZWQgbG9uZyAqKXNyZWdzLT5pbnRlcnJ1cHRfYml0bWFwLAotCQkJbWF4X2JpdHMpOwotCQkvKiBPbmx5IHBlbmRpbmcgZXh0ZXJuYWwgaXJxIGlzIGhhbmRsZWQgaGVyZSAqLwotCQlpZiAocGVuZGluZ192ZWMgPCBtYXhfYml0cykgewotCQkJa3ZtX3g4Nl9vcHMtPnNldF9pcnEodmNwdSwgcGVuZGluZ192ZWMpOwotCQkJcHJfZGVidWcoIlNldCBiYWNrIHBlbmRpbmcgaXJxICVkXG4iLAotCQkJCSBwZW5kaW5nX3ZlYyk7Ci0JCX0KLQkJa3ZtX3BpY19jbGVhcl9pc3JfYWNrKHZjcHUtPmt2bSk7CisJbWF4X2JpdHMgPSAoc2l6ZW9mIHNyZWdzLT5pbnRlcnJ1cHRfYml0bWFwKSA8PCAzOworCXBlbmRpbmdfdmVjID0gZmluZF9maXJzdF9iaXQoCisJCShjb25zdCB1bnNpZ25lZCBsb25nICopc3JlZ3MtPmludGVycnVwdF9iaXRtYXAsIG1heF9iaXRzKTsKKwlpZiAocGVuZGluZ192ZWMgPCBtYXhfYml0cykgeworCQlrdm1fcXVldWVfaW50ZXJydXB0KHZjcHUsIHBlbmRpbmdfdmVjLCBmYWxzZSk7CisJCXByX2RlYnVnKCJTZXQgYmFjayBwZW5kaW5nIGlycSAlZFxuIiwgcGVuZGluZ192ZWMpOworCQlpZiAoaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSkKKwkJCWt2bV9waWNfY2xlYXJfaXNyX2Fjayh2Y3B1LT5rdm0pOwogCX0KIAogCWt2bV9zZXRfc2VnbWVudCh2Y3B1LCAmc3JlZ3MtPmNzLCBWQ1BVX1NSRUdfQ1MpOwpAQCAtNDMwOCw3ICs0NDMxLDYgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlJTklUX0xJU1RfSEVBRCgma3ZtLT5hcmNoLmFjdGl2ZV9tbXVfcGFnZXMpOwotCUlOSVRfTElTVF9IRUFEKCZrdm0tPmFyY2gub29zX2dsb2JhbF9wYWdlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJmt2bS0+YXJjaC5hc3NpZ25lZF9kZXZfaGVhZCk7CiAKIAkvKiBSZXNlcnZlIGJpdCAwIG9mIGlycV9zb3VyY2VzX2JpdG1hcCBmb3IgdXNlcnNwYWNlIGlycSBzb3VyY2UgKi8KQEAgLTQ0MTEsMTIgKzQ1MzMsMTQgQEAKIAkJfQogCX0KIAorCXNwaW5fbG9jaygma3ZtLT5tbXVfbG9jayk7CiAJaWYgKCFrdm0tPmFyY2gubl9yZXF1ZXN0ZWRfbW11X3BhZ2VzKSB7CiAJCXVuc2lnbmVkIGludCBucl9tbXVfcGFnZXMgPSBrdm1fbW11X2NhbGN1bGF0ZV9tbXVfcGFnZXMoa3ZtKTsKIAkJa3ZtX21tdV9jaGFuZ2VfbW11X3BhZ2VzKGt2bSwgbnJfbW11X3BhZ2VzKTsKIAl9CiAKIAlrdm1fbW11X3Nsb3RfcmVtb3ZlX3dyaXRlX2FjY2Vzcyhrdm0sIG1lbS0+c2xvdCk7CisJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogCWt2bV9mbHVzaF9yZW1vdGVfdGxicyhrdm0pOwogCiAJcmV0dXJuIDA7CkBAIC00NDI1LDYgKzQ1NDksNyBAQAogdm9pZCBrdm1fYXJjaF9mbHVzaF9zaGFkb3coc3RydWN0IGt2bSAqa3ZtKQogewogCWt2bV9tbXVfemFwX2FsbChrdm0pOworCWt2bV9yZWxvYWRfcmVtb3RlX21tdXMoa3ZtKTsKIH0KIAogaW50IGt2bV9hcmNoX3ZjcHVfcnVubmFibGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtNDQzNCwyOCArNDU1OSwyNCBAQAogCSAgICAgICB8fCB2Y3B1LT5hcmNoLm5taV9wZW5kaW5nOwogfQogCi1zdGF0aWMgdm9pZCB2Y3B1X2tpY2tfaW50cih2b2lkICppbmZvKQotewotI2lmZGVmIERFQlVHCi0Jc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gKHN0cnVjdCBrdm1fdmNwdSAqKWluZm87Ci0JcHJpbnRrKEtFUk5fREVCVUcgInZjcHVfa2lja19pbnRyICVwIFxuIiwgdmNwdSk7Ci0jZW5kaWYKLX0KLQogdm9pZCBrdm1fdmNwdV9raWNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlpbnQgaXBpX3BjcHUgPSB2Y3B1LT5jcHU7Ci0JaW50IGNwdSA9IGdldF9jcHUoKTsKKwlpbnQgbWU7CisJaW50IGNwdSA9IHZjcHUtPmNwdTsKIAogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ2Y3B1LT53cSkpIHsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y3B1LT53cSk7CiAJCSsrdmNwdS0+c3RhdC5oYWx0X3dha2V1cDsKIAl9Ci0JLyoKLQkgKiBXZSBtYXkgYmUgY2FsbGVkIHN5bmNocm9ub3VzbHkgd2l0aCBpcnFzIGRpc2FibGVkIGluIGd1ZXN0IG1vZGUsCi0JICogU28gbmVlZCBub3QgdG8gY2FsbCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoKSBpbiB0aGF0IGNhc2UuCi0JICovCi0JaWYgKHZjcHUtPmd1ZXN0X21vZGUgJiYgdmNwdS0+Y3B1ICE9IGNwdSkKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGlwaV9wY3B1LCB2Y3B1X2tpY2tfaW50ciwgdmNwdSwgMCk7CisKKwltZSA9IGdldF9jcHUoKTsKKwlpZiAoY3B1ICE9IG1lICYmICh1bnNpZ25lZCljcHUgPCBucl9jcHVfaWRzICYmIGNwdV9vbmxpbmUoY3B1KSkKKwkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEtWTV9SRVFfS0lDSywgJnZjcHUtPnJlcXVlc3RzKSkKKwkJCXNtcF9zZW5kX3Jlc2NoZWR1bGUoY3B1KTsKIAlwdXRfY3B1KCk7CiB9CisKK2ludCBrdm1fYXJjaF9pbnRlcnJ1cHRfYWxsb3dlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIGt2bV94ODZfb3BzLT5pbnRlcnJ1cHRfYWxsb3dlZCh2Y3B1KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS94ODYuaCBiL2FyY2gveDg2L2t2bS94ODYuaAppbmRleCA2YTRiZTc4Li40YzhlMTBhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0veDg2LmgKKysrIGIvYXJjaC94ODYva3ZtL3g4Ni5oCkBAIC04LDkgKzgsMTEgQEAKIAl2Y3B1LT5hcmNoLmV4Y2VwdGlvbi5wZW5kaW5nID0gZmFsc2U7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fcXVldWVfaW50ZXJydXB0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTggdmVjdG9yKQorc3RhdGljIGlubGluZSB2b2lkIGt2bV9xdWV1ZV9pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1OCB2ZWN0b3IsCisJYm9vbCBzb2Z0KQogewogCXZjcHUtPmFyY2guaW50ZXJydXB0LnBlbmRpbmcgPSB0cnVlOworCXZjcHUtPmFyY2guaW50ZXJydXB0LnNvZnQgPSBzb2Z0OwogCXZjcHUtPmFyY2guaW50ZXJydXB0Lm5yID0gdmVjdG9yOwogfQogCkBAIC0xOSw0ICsyMSwxNCBAQAogCXZjcHUtPmFyY2guaW50ZXJydXB0LnBlbmRpbmcgPSBmYWxzZTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGt2bV9ldmVudF9uZWVkc19yZWluamVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZjcHUtPmFyY2guZXhjZXB0aW9uLnBlbmRpbmcgfHwgdmNwdS0+YXJjaC5pbnRlcnJ1cHQucGVuZGluZyB8fAorCQl2Y3B1LT5hcmNoLm5taV9pbmplY3RlZDsKK30KKworc3RhdGljIGlubGluZSBib29sIGt2bV9leGNlcHRpb25faXNfc29mdCh1bnNpZ25lZCBpbnQgbnIpCit7CisJcmV0dXJuIChuciA9PSBCUF9WRUNUT1IpIHx8IChuciA9PSBPRl9WRUNUT1IpOworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0veDg2X2VtdWxhdGUuYyBiL2FyY2gveDg2L2t2bS94ODZfZW11bGF0ZS5jCmluZGV4IGNhOTE3NDkuLmMxYjZjMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODZfZW11bGF0ZS5jCisrKyBiL2FyY2gveDg2L2t2bS94ODZfZW11bGF0ZS5jCkBAIC01OSwxMyArNTksMTQgQEAKICNkZWZpbmUgU3JjSW1tICAgICAgKDU8PDQpCS8qIEltbWVkaWF0ZSBvcGVyYW5kLiAqLwogI2RlZmluZSBTcmNJbW1CeXRlICAoNjw8NCkJLyogOC1iaXQgc2lnbi1leHRlbmRlZCBpbW1lZGlhdGUgb3BlcmFuZC4gKi8KICNkZWZpbmUgU3JjT25lICAgICAgKDc8PDQpCS8qIEltcGxpZWQgJzEnICovCi0jZGVmaW5lIFNyY01hc2sgICAgICg3PDw0KQorI2RlZmluZSBTcmNJbW1VQnl0ZSAoODw8NCkgICAgICAvKiA4LWJpdCB1bnNpZ25lZCBpbW1lZGlhdGUgb3BlcmFuZC4gKi8KKyNkZWZpbmUgU3JjTWFzayAgICAgKDB4Zjw8NCkKIC8qIEdlbmVyaWMgTW9kUk0gZGVjb2RlLiAqLwotI2RlZmluZSBNb2RSTSAgICAgICAoMTw8NykKKyNkZWZpbmUgTW9kUk0gICAgICAgKDE8PDgpCiAvKiBEZXN0aW5hdGlvbiBpcyBvbmx5IHdyaXR0ZW47IG5ldmVyIHJlYWQuICovCi0jZGVmaW5lIE1vdiAgICAgICAgICgxPDw4KQotI2RlZmluZSBCaXRPcCAgICAgICAoMTw8OSkKLSNkZWZpbmUgTWVtQWJzICAgICAgKDE8PDEwKSAgICAgIC8qIE1lbW9yeSBvcGVyYW5kIGlzIGFic29sdXRlIGRpc3BsYWNlbWVudCAqLworI2RlZmluZSBNb3YgICAgICAgICAoMTw8OSkKKyNkZWZpbmUgQml0T3AgICAgICAgKDE8PDEwKQorI2RlZmluZSBNZW1BYnMgICAgICAoMTw8MTEpICAgICAgLyogTWVtb3J5IG9wZXJhbmQgaXMgYWJzb2x1dGUgZGlzcGxhY2VtZW50ICovCiAjZGVmaW5lIFN0cmluZyAgICAgICgxPDwxMikgICAgIC8qIFN0cmluZyBpbnN0cnVjdGlvbiAocmVwIGNhcGFibGUpICovCiAjZGVmaW5lIFN0YWNrICAgICAgICgxPDwxMykgICAgIC8qIFN0YWNrIGluc3RydWN0aW9uIChwdXNoL3BvcCkgKi8KICNkZWZpbmUgR3JvdXAgICAgICAgKDE8PDE0KSAgICAgLyogQml0cyAzOjUgb2YgbW9kcm0gYnl0ZSBleHRlbmQgb3Bjb2RlICovCkBAIC03Niw2ICs3Nyw3IEBACiAjZGVmaW5lIFNyYzJDTCAgICAgICgxPDwyOSkKICNkZWZpbmUgU3JjMkltbUJ5dGUgKDI8PDI5KQogI2RlZmluZSBTcmMyT25lICAgICAoMzw8MjkpCisjZGVmaW5lIFNyYzJJbW0xNiAgICg0PDwyOSkKICNkZWZpbmUgU3JjMk1hc2sgICAgKDc8PDI5KQogCiBlbnVtIHsKQEAgLTEzNSwxMSArMTM3LDExIEBACiAJU3JjTm9uZSAgfCBCeXRlT3AgIHwgSW1wbGljaXRPcHMsIFNyY05vbmUgIHwgSW1wbGljaXRPcHMsIC8qIGluc2IsIGluc3cvaW5zZCAqLwogCVNyY05vbmUgIHwgQnl0ZU9wICB8IEltcGxpY2l0T3BzLCBTcmNOb25lICB8IEltcGxpY2l0T3BzLCAvKiBvdXRzYiwgb3V0c3cvb3V0c2QgKi8KIAkvKiAweDcwIC0gMHg3NyAqLwotCUltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLAotCUltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLAorCVNyY0ltbUJ5dGUsIFNyY0ltbUJ5dGUsIFNyY0ltbUJ5dGUsIFNyY0ltbUJ5dGUsCisJU3JjSW1tQnl0ZSwgU3JjSW1tQnl0ZSwgU3JjSW1tQnl0ZSwgU3JjSW1tQnl0ZSwKIAkvKiAweDc4IC0gMHg3RiAqLwotCUltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLAotCUltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLAorCVNyY0ltbUJ5dGUsIFNyY0ltbUJ5dGUsIFNyY0ltbUJ5dGUsIFNyY0ltbUJ5dGUsCisJU3JjSW1tQnl0ZSwgU3JjSW1tQnl0ZSwgU3JjSW1tQnl0ZSwgU3JjSW1tQnl0ZSwKIAkvKiAweDgwIC0gMHg4NyAqLwogCUdyb3VwIHwgR3JvdXAxXzgwLCBHcm91cCB8IEdyb3VwMV84MSwKIAlHcm91cCB8IEdyb3VwMV84MiwgR3JvdXAgfCBHcm91cDFfODMsCkBAIC0xNTMsNyArMTU1LDggQEAKIAkvKiAweDkwIC0gMHg5NyAqLwogCURzdFJlZywgRHN0UmVnLCBEc3RSZWcsIERzdFJlZywJRHN0UmVnLCBEc3RSZWcsIERzdFJlZywgRHN0UmVnLAogCS8qIDB4OTggLSAweDlGICovCi0JMCwgMCwgMCwgMCwgSW1wbGljaXRPcHMgfCBTdGFjaywgSW1wbGljaXRPcHMgfCBTdGFjaywgMCwgMCwKKwkwLCAwLCBTcmNJbW0gfCBTcmMySW1tMTYsIDAsCisJSW1wbGljaXRPcHMgfCBTdGFjaywgSW1wbGljaXRPcHMgfCBTdGFjaywgMCwgMCwKIAkvKiAweEEwIC0gMHhBNyAqLwogCUJ5dGVPcCB8IERzdFJlZyB8IFNyY01lbSB8IE1vdiB8IE1lbUFicywgRHN0UmVnIHwgU3JjTWVtIHwgTW92IHwgTWVtQWJzLAogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY1JlZyB8IE1vdiB8IE1lbUFicywgRHN0TWVtIHwgU3JjUmVnIHwgTW92IHwgTWVtQWJzLApAQCAtMTc4LDcgKzE4MSw4IEBACiAJMCwgSW1wbGljaXRPcHMgfCBTdGFjaywgMCwgMCwKIAlCeXRlT3AgfCBEc3RNZW0gfCBTcmNJbW0gfCBNb2RSTSB8IE1vdiwgRHN0TWVtIHwgU3JjSW1tIHwgTW9kUk0gfCBNb3YsCiAJLyogMHhDOCAtIDB4Q0YgKi8KLQkwLCAwLCAwLCBJbXBsaWNpdE9wcyB8IFN0YWNrLCAwLCAwLCAwLCAwLAorCTAsIDAsIDAsIEltcGxpY2l0T3BzIHwgU3RhY2ssCisJSW1wbGljaXRPcHMsIFNyY0ltbUJ5dGUsIEltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywKIAkvKiAweEQwIC0gMHhENyAqLwogCUJ5dGVPcCB8IERzdE1lbSB8IFNyY0ltcGxpY2l0IHwgTW9kUk0sIERzdE1lbSB8IFNyY0ltcGxpY2l0IHwgTW9kUk0sCiAJQnl0ZU9wIHwgRHN0TWVtIHwgU3JjSW1wbGljaXQgfCBNb2RSTSwgRHN0TWVtIHwgU3JjSW1wbGljaXQgfCBNb2RSTSwKQEAgLTE4NywxMSArMTkxLDExIEBACiAJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIAkvKiAweEUwIC0gMHhFNyAqLwogCTAsIDAsIDAsIDAsCi0JU3JjTm9uZSB8IEJ5dGVPcCB8IEltcGxpY2l0T3BzLCBTcmNOb25lIHwgSW1wbGljaXRPcHMsCi0JU3JjTm9uZSB8IEJ5dGVPcCB8IEltcGxpY2l0T3BzLCBTcmNOb25lIHwgSW1wbGljaXRPcHMsCisJQnl0ZU9wIHwgU3JjSW1tVUJ5dGUsIFNyY0ltbVVCeXRlLAorCUJ5dGVPcCB8IFNyY0ltbVVCeXRlLCBTcmNJbW1VQnl0ZSwKIAkvKiAweEU4IC0gMHhFRiAqLwotCUltcGxpY2l0T3BzIHwgU3RhY2ssIFNyY0ltbSB8IEltcGxpY2l0T3BzLAotCUltcGxpY2l0T3BzLCBTcmNJbW1CeXRlIHwgSW1wbGljaXRPcHMsCisJU3JjSW1tIHwgU3RhY2ssIFNyY0ltbSB8IEltcGxpY2l0T3BzLAorCVNyY0ltbSB8IFNyYzJJbW0xNiwgU3JjSW1tQnl0ZSB8IEltcGxpY2l0T3BzLAogCVNyY05vbmUgfCBCeXRlT3AgfCBJbXBsaWNpdE9wcywgU3JjTm9uZSB8IEltcGxpY2l0T3BzLAogCVNyY05vbmUgfCBCeXRlT3AgfCBJbXBsaWNpdE9wcywgU3JjTm9uZSB8IEltcGxpY2l0T3BzLAogCS8qIDB4RjAgLSAweEY3ICovCkBAIC0yMzAsMTAgKzIzNCw4IEBACiAJLyogMHg3MCAtIDB4N0YgKi8KIAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogCS8qIDB4ODAgLSAweDhGICovCi0JSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsCi0JSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsCi0JSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsCi0JSW1wbGljaXRPcHMsIEltcGxpY2l0T3BzLCBJbXBsaWNpdE9wcywgSW1wbGljaXRPcHMsCisJU3JjSW1tLCBTcmNJbW0sIFNyY0ltbSwgU3JjSW1tLCBTcmNJbW0sIFNyY0ltbSwgU3JjSW1tLCBTcmNJbW0sCisJU3JjSW1tLCBTcmNJbW0sIFNyY0ltbSwgU3JjSW1tLCBTcmNJbW0sIFNyY0ltbSwgU3JjSW1tLCBTcmNJbW0sCiAJLyogMHg5MCAtIDB4OUYgKi8KIAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogCS8qIDB4QTAgLSAweEE3ICovCkBAIC0xMDQ0LDEwICsxMDQ2LDE0IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTcmNJbW1CeXRlOgorCWNhc2UgU3JjSW1tVUJ5dGU6CiAJCWMtPnNyYy50eXBlID0gT1BfSU1NOwogCQljLT5zcmMucHRyID0gKHVuc2lnbmVkIGxvbmcgKiljLT5laXA7CiAJCWMtPnNyYy5ieXRlcyA9IDE7Ci0JCWMtPnNyYy52YWwgPSBpbnNuX2ZldGNoKHM4LCAxLCBjLT5laXApOworCQlpZiAoKGMtPmQgJiBTcmNNYXNrKSA9PSBTcmNJbW1CeXRlKQorCQkJYy0+c3JjLnZhbCA9IGluc25fZmV0Y2goczgsIDEsIGMtPmVpcCk7CisJCWVsc2UKKwkJCWMtPnNyYy52YWwgPSBpbnNuX2ZldGNoKHU4LCAxLCBjLT5laXApOwogCQlicmVhazsKIAljYXNlIFNyY09uZToKIAkJYy0+c3JjLmJ5dGVzID0gMTsKQEAgLTEwNzIsNiArMTA3OCwxMiBAQAogCQljLT5zcmMyLmJ5dGVzID0gMTsKIAkJYy0+c3JjMi52YWwgPSBpbnNuX2ZldGNoKHU4LCAxLCBjLT5laXApOwogCQlicmVhazsKKwljYXNlIFNyYzJJbW0xNjoKKwkJYy0+c3JjMi50eXBlID0gT1BfSU1NOworCQljLT5zcmMyLnB0ciA9ICh1bnNpZ25lZCBsb25nICopYy0+ZWlwOworCQljLT5zcmMyLmJ5dGVzID0gMjsKKwkJYy0+c3JjMi52YWwgPSBpbnNuX2ZldGNoKHUxNiwgMiwgYy0+ZWlwKTsKKwkJYnJlYWs7CiAJY2FzZSBTcmMyT25lOgogCQljLT5zcmMyLmJ5dGVzID0gMTsKIAkJYy0+c3JjMi52YWwgPSAxOwpAQCAtMTM0OSw2ICsxMzYxLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgdG9nZ2xlX2ludGVycnVwdGliaWxpdHkoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHUzMiBtYXNrKQoreworCXUzMiBpbnRfc2hhZG93ID0ga3ZtX3g4Nl9vcHMtPmdldF9pbnRlcnJ1cHRfc2hhZG93KGN0eHQtPnZjcHUsIG1hc2spOworCS8qCisJICogYW4gc3RpOyBzdGk7IHNlcXVlbmNlIG9ubHkgZGlzYWJsZSBpbnRlcnJ1cHRzIGZvciB0aGUgZmlyc3QKKwkgKiBpbnN0cnVjdGlvbi4gU28sIGlmIHRoZSBsYXN0IGluc3RydWN0aW9uLCBiZSBpdCBlbXVsYXRlZCBvcgorCSAqIG5vdCwgbGVmdCB0aGUgc3lzdGVtIHdpdGggdGhlIElOVF9TVEkgZmxhZyBlbmFibGVkLCBpdAorCSAqIG1lYW5zIHRoYXQgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gaXMgYW4gc3RpLiBXZSBzaG91bGQgbm90CisJICogbGVhdmUgdGhlIGZsYWcgb24gaW4gdGhpcyBjYXNlLiBUaGUgc2FtZSBnb2VzIGZvciBtb3Ygc3MKKwkgKi8KKwlpZiAoIShpbnRfc2hhZG93ICYgbWFzaykpCisJCWN0eHQtPmludGVycnVwdGliaWxpdHkgPSBtYXNrOworfQorCiBpbnQKIHg4Nl9lbXVsYXRlX2luc24oc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgKm9wcykKIHsKQEAgLTEzNjAsNiArMTM4Niw4IEBACiAJaW50IGlvX2Rpcl9pbjsKIAlpbnQgcmMgPSAwOwogCisJY3R4dC0+aW50ZXJydXB0aWJpbGl0eSA9IDA7CisKIAkvKiBTaGFkb3cgY29weSBvZiByZWdpc3RlciBzdGF0ZS4gQ29tbWl0dGVkIG9uIHN1Y2Nlc3NmdWwgZW11bGF0aW9uLgogCSAqIE5PVEU6IHdlIGNhbiBjb3B5IHRoZW0gZnJvbSB2Y3B1IGFzIHg4Nl9kZWNvZGVfaW5zbigpIGRvZXNuJ3QKIAkgKiBtb2RpZnkgdGhlbS4KQEAgLTE1MzEsMTMgKzE1NTksMTAgQEAKIAkJCXJldHVybiAtMTsKIAkJfQogCQlyZXR1cm4gMDsKLQljYXNlIDB4NzAgLi4uIDB4N2Y6IC8qIGpjYyAoc2hvcnQpICovIHsKLQkJaW50IHJlbCA9IGluc25fZmV0Y2goczgsIDEsIGMtPmVpcCk7Ci0KKwljYXNlIDB4NzAgLi4uIDB4N2Y6IC8qIGpjYyAoc2hvcnQpICovCiAJCWlmICh0ZXN0X2NjKGMtPmIsIGN0eHQtPmVmbGFncykpCi0JCQlqbXBfcmVsKGMsIHJlbCk7CisJCQlqbXBfcmVsKGMsIGMtPnNyYy52YWwpOwogCQlicmVhazsKLQl9CiAJY2FzZSAweDgwIC4uLiAweDgzOgkvKiBHcnAxICovCiAJCXN3aXRjaCAoYy0+bW9kcm1fcmVnKSB7CiAJCWNhc2UgMDoKQEAgLTE2MDksNiArMTYzNCw5IEBACiAJCWludCBlcnI7CiAKIAkJc2VsID0gYy0+c3JjLnZhbDsKKwkJaWYgKGMtPm1vZHJtX3JlZyA9PSBWQ1BVX1NSRUdfU1MpCisJCQl0b2dnbGVfaW50ZXJydXB0aWJpbGl0eShjdHh0LCBYODZfU0hBRE9XX0lOVF9NT1ZfU1MpOworCiAJCWlmIChjLT5tb2RybV9yZWcgPD0gNSkgewogCQkJdHlwZV9iaXRzID0gKGMtPm1vZHJtX3JlZyA9PSAxKSA/IDkgOiAxOwogCQkJZXJyID0ga3ZtX2xvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQtPnZjcHUsIHNlbCwKQEAgLTE3NjksNTkgKzE3OTcsMzIgQEAKIAkJYnJlYWs7CiAJY2FzZSAweGU0OiAJLyogaW5iICovCiAJY2FzZSAweGU1OiAJLyogaW4gKi8KLQkJcG9ydCA9IGluc25fZmV0Y2godTgsIDEsIGMtPmVpcCk7CisJCXBvcnQgPSBjLT5zcmMudmFsOwogCQlpb19kaXJfaW4gPSAxOwogCQlnb3RvIGRvX2lvOwogCWNhc2UgMHhlNjogLyogb3V0YiAqLwogCWNhc2UgMHhlNzogLyogb3V0ICovCi0JCXBvcnQgPSBpbnNuX2ZldGNoKHU4LCAxLCBjLT5laXApOworCQlwb3J0ID0gYy0+c3JjLnZhbDsKIAkJaW9fZGlyX2luID0gMDsKIAkJZ290byBkb19pbzsKIAljYXNlIDB4ZTg6IC8qIGNhbGwgKG5lYXIpICovIHsKLQkJbG9uZyBpbnQgcmVsOwotCQlzd2l0Y2ggKGMtPm9wX2J5dGVzKSB7Ci0JCWNhc2UgMjoKLQkJCXJlbCA9IGluc25fZmV0Y2goczE2LCAyLCBjLT5laXApOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCXJlbCA9IGluc25fZmV0Y2goczMyLCA0LCBjLT5laXApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlEUFJJTlRGKCJDYWxsOiBJbnZhbGlkIG9wX2J5dGVzXG4iKTsKLQkJCWdvdG8gY2Fubm90X2VtdWxhdGU7Ci0JCX0KKwkJbG9uZyBpbnQgcmVsID0gYy0+c3JjLnZhbDsKIAkJYy0+c3JjLnZhbCA9ICh1bnNpZ25lZCBsb25nKSBjLT5laXA7CiAJCWptcF9yZWwoYywgcmVsKTsKLQkJYy0+b3BfYnl0ZXMgPSBjLT5hZF9ieXRlczsKIAkJZW11bGF0ZV9wdXNoKGN0eHQpOwogCQlicmVhazsKIAl9CiAJY2FzZSAweGU5OiAvKiBqbXAgcmVsICovCiAJCWdvdG8gam1wOwotCWNhc2UgMHhlYTogLyogam1wIGZhciAqLyB7Ci0JCXVpbnQzMl90IGVpcDsKLQkJdWludDE2X3Qgc2VsOwotCi0JCXN3aXRjaCAoYy0+b3BfYnl0ZXMpIHsKLQkJY2FzZSAyOgotCQkJZWlwID0gaW5zbl9mZXRjaCh1MTYsIDIsIGMtPmVpcCk7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJZWlwID0gaW5zbl9mZXRjaCh1MzIsIDQsIGMtPmVpcCk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCURQUklOVEYoImptcCBmYXI6IEludmFsaWQgb3BfYnl0ZXNcbiIpOwotCQkJZ290byBjYW5ub3RfZW11bGF0ZTsKLQkJfQotCQlzZWwgPSBpbnNuX2ZldGNoKHUxNiwgMiwgYy0+ZWlwKTsKLQkJaWYgKGt2bV9sb2FkX3NlZ21lbnRfZGVzY3JpcHRvcihjdHh0LT52Y3B1LCBzZWwsIDksIFZDUFVfU1JFR19DUykgPCAwKSB7CisJY2FzZSAweGVhOiAvKiBqbXAgZmFyICovCisJCWlmIChrdm1fbG9hZF9zZWdtZW50X2Rlc2NyaXB0b3IoY3R4dC0+dmNwdSwgYy0+c3JjMi52YWwsIDksCisJCQkJCVZDUFVfU1JFR19DUykgPCAwKSB7CiAJCQlEUFJJTlRGKCJqbXAgZmFyOiBGYWlsZWQgdG8gbG9hZCBDUyBkZXNjcmlwdG9yXG4iKTsKIAkJCWdvdG8gY2Fubm90X2VtdWxhdGU7CiAJCX0KIAotCQljLT5laXAgPSBlaXA7CisJCWMtPmVpcCA9IGMtPnNyYy52YWw7CiAJCWJyZWFrOwotCX0KIAljYXNlIDB4ZWI6CiAJICAgICAgam1wOgkJLyogam1wIHJlbCBzaG9ydCAqLwogCQlqbXBfcmVsKGMsIGMtPnNyYy52YWwpOwpAQCAtMTg2NSw2ICsxODY2LDcgQEAKIAkJYy0+ZHN0LnR5cGUgPSBPUF9OT05FOwkvKiBEaXNhYmxlIHdyaXRlYmFjay4gKi8KIAkJYnJlYWs7CiAJY2FzZSAweGZiOiAvKiBzdGkgKi8KKwkJdG9nZ2xlX2ludGVycnVwdGliaWxpdHkoY3R4dCwgWDg2X1NIQURPV19JTlRfU1RJKTsKIAkJY3R4dC0+ZWZsYWdzIHw9IFg4Nl9FRkxBR1NfSUY7CiAJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsJLyogRGlzYWJsZSB3cml0ZWJhY2suICovCiAJCWJyZWFrOwpAQCAtMjAzOSwyOCArMjA0MSwxMSBAQAogCQlpZiAoIXRlc3RfY2MoYy0+YiwgY3R4dC0+ZWZsYWdzKSkKIAkJCWMtPmRzdC50eXBlID0gT1BfTk9ORTsgLyogbm8gd3JpdGViYWNrICovCiAJCWJyZWFrOwotCWNhc2UgMHg4MCAuLi4gMHg4ZjogLyogam56IHJlbCwgZXRjKi8gewotCQlsb25nIGludCByZWw7Ci0KLQkJc3dpdGNoIChjLT5vcF9ieXRlcykgewotCQljYXNlIDI6Ci0JCQlyZWwgPSBpbnNuX2ZldGNoKHMxNiwgMiwgYy0+ZWlwKTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlyZWwgPSBpbnNuX2ZldGNoKHMzMiwgNCwgYy0+ZWlwKTsKLQkJCWJyZWFrOwotCQljYXNlIDg6Ci0JCQlyZWwgPSBpbnNuX2ZldGNoKHM2NCwgOCwgYy0+ZWlwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJRFBSSU5URigiam56OiBJbnZhbGlkIG9wX2J5dGVzXG4iKTsKLQkJCWdvdG8gY2Fubm90X2VtdWxhdGU7Ci0JCX0KKwljYXNlIDB4ODAgLi4uIDB4OGY6IC8qIGpueiByZWwsIGV0YyovCiAJCWlmICh0ZXN0X2NjKGMtPmIsIGN0eHQtPmVmbGFncykpCi0JCQlqbXBfcmVsKGMsIHJlbCk7CisJCQlqbXBfcmVsKGMsIGMtPnNyYy52YWwpOwogCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CiAJCWJyZWFrOwotCX0KIAljYXNlIDB4YTM6CiAJICAgICAgYnQ6CQkvKiBidCAqLwogCQljLT5kc3QudHlwZSA9IE9QX05PTkU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jIGIvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYwppbmRleCAzM2E5M2I0Li40ZTBjMjY1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCisrKyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKQEAgLTE2NywxMCArMTY3LDE2IEBACiAKIC8qIFdoZW4gbGF6eSBtb2RlIGlzIHR1cm5lZCBvZmYgcmVzZXQgdGhlIHBlci1jcHUgbGF6eSBtb2RlIHZhcmlhYmxlIGFuZCB0aGVuCiAgKiBpc3N1ZSB0aGUgZG8tbm90aGluZyBoeXBlcmNhbGwgdG8gZmx1c2ggYW55IHN0b3JlZCBjYWxscy4gKi8KLXN0YXRpYyB2b2lkIGxndWVzdF9sZWF2ZV9sYXp5X21vZGUodm9pZCkKK3N0YXRpYyB2b2lkIGxndWVzdF9sZWF2ZV9sYXp5X21tdV9tb2RlKHZvaWQpCiB7Ci0JcGFyYXZpcnRfbGVhdmVfbGF6eShwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkpOwogCWt2bV9oeXBlcmNhbGwwKExIQ0FMTF9GTFVTSF9BU1lOQyk7CisJcGFyYXZpcnRfbGVhdmVfbGF6eV9tbXUoKTsKK30KKworc3RhdGljIHZvaWQgbGd1ZXN0X2VuZF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7CisJa3ZtX2h5cGVyY2FsbDAoTEhDQUxMX0ZMVVNIX0FTWU5DKTsKKwlwYXJhdmlydF9lbmRfY29udGV4dF9zd2l0Y2gobmV4dCk7CiB9CiAKIC8qRzowMzMKQEAgLTYzNyw3ICs2NDMsNyBAQAogCiB2b2lkIGxndWVzdF9zZXR1cF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpcnFfdG9fZGVzY19hbGxvY19jcHUoaXJxLCAwKTsKKwlpcnFfdG9fZGVzY19hbGxvY19ub2RlKGlycSwgMCk7CiAJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmbGd1ZXN0X2lycV9jb250cm9sbGVyLAogCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJsZXZlbCIpOwogfQpAQCAtMTA1NCw4ICsxMDYwLDggQEAKIAlwdl9jcHVfb3BzLndyaXRlX2dkdF9lbnRyeSA9IGxndWVzdF93cml0ZV9nZHRfZW50cnk7CiAJcHZfY3B1X29wcy53cml0ZV9pZHRfZW50cnkgPSBsZ3Vlc3Rfd3JpdGVfaWR0X2VudHJ5OwogCXB2X2NwdV9vcHMud2JpbnZkID0gbGd1ZXN0X3diaW52ZDsKLQlwdl9jcHVfb3BzLmxhenlfbW9kZS5lbnRlciA9IHBhcmF2aXJ0X2VudGVyX2xhenlfY3B1OwotCXB2X2NwdV9vcHMubGF6eV9tb2RlLmxlYXZlID0gbGd1ZXN0X2xlYXZlX2xhenlfbW9kZTsKKwlwdl9jcHVfb3BzLnN0YXJ0X2NvbnRleHRfc3dpdGNoID0gcGFyYXZpcnRfc3RhcnRfY29udGV4dF9zd2l0Y2g7CisJcHZfY3B1X29wcy5lbmRfY29udGV4dF9zd2l0Y2ggPSBsZ3Vlc3RfZW5kX2NvbnRleHRfc3dpdGNoOwogCiAJLyogcGFnZXRhYmxlIG1hbmFnZW1lbnQgKi8KIAlwdl9tbXVfb3BzLndyaXRlX2NyMyA9IGxndWVzdF93cml0ZV9jcjM7CkBAIC0xMDY4LDcgKzEwNzQsNyBAQAogCXB2X21tdV9vcHMucmVhZF9jcjIgPSBsZ3Vlc3RfcmVhZF9jcjI7CiAJcHZfbW11X29wcy5yZWFkX2NyMyA9IGxndWVzdF9yZWFkX2NyMzsKIAlwdl9tbXVfb3BzLmxhenlfbW9kZS5lbnRlciA9IHBhcmF2aXJ0X2VudGVyX2xhenlfbW11OwotCXB2X21tdV9vcHMubGF6eV9tb2RlLmxlYXZlID0gbGd1ZXN0X2xlYXZlX2xhenlfbW9kZTsKKwlwdl9tbXVfb3BzLmxhenlfbW9kZS5sZWF2ZSA9IGxndWVzdF9sZWF2ZV9sYXp5X21tdV9tb2RlOwogCXB2X21tdV9vcHMucHRlX3VwZGF0ZSA9IGxndWVzdF9wdGVfdXBkYXRlOwogCXB2X21tdV9vcHMucHRlX3VwZGF0ZV9kZWZlciA9IGxndWVzdF9wdGVfdXBkYXRlOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvTWFrZWZpbGUgYi9hcmNoL3g4Ni9saWIvTWFrZWZpbGUKaW5kZXggNTVlMTFhYS4uZjlkMzU2MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2xpYi9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHg4NiBzcGVjaWZpYyBsaWJyYXJ5IGZpbGVzLgogIwogCi1vYmotJChDT05GSUdfU01QKSA6PSBtc3Itb24tY3B1Lm8KK29iai0kKENPTkZJR19TTVApIDo9IG1zci5vCiAKIGxpYi15IDo9IGRlbGF5Lm8KIGxpYi15ICs9IHRodW5rXyQoQklUUykubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL21zci1vbi1jcHUuYyBiL2FyY2gveDg2L2xpYi9tc3Itb24tY3B1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMWNmNzIuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvbGliL21zci1vbi1jcHUuYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8YXNtL21zci5oPgotCi1zdHJ1Y3QgbXNyX2luZm8gewotCXUzMiBtc3Jfbm87Ci0JdTMyIGwsIGg7Ci0JaW50IGVycjsKLX07Ci0KLXN0YXRpYyB2b2lkIF9fcmRtc3Jfb25fY3B1KHZvaWQgKmluZm8pCi17Ci0Jc3RydWN0IG1zcl9pbmZvICpydiA9IGluZm87Ci0KLQlyZG1zcihydi0+bXNyX25vLCBydi0+bCwgcnYtPmgpOwotfQotCi1zdGF0aWMgdm9pZCBfX3dybXNyX29uX2NwdSh2b2lkICppbmZvKQotewotCXN0cnVjdCBtc3JfaW5mbyAqcnYgPSBpbmZvOwotCi0Jd3Jtc3IocnYtPm1zcl9ubywgcnYtPmwsIHJ2LT5oKTsKLX0KLQotaW50IHJkbXNyX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgKmwsIHUzMiAqaCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBtc3JfaW5mbyBydjsKLQotCXJ2Lm1zcl9ubyA9IG1zcl9ubzsKLQllcnIgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBfX3JkbXNyX29uX2NwdSwgJnJ2LCAxKTsKLQkqbCA9IHJ2Lmw7Ci0JKmggPSBydi5oOwotCi0JcmV0dXJuIGVycjsKLX0KLQotaW50IHdybXNyX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgbCwgdTMyIGgpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgbXNyX2luZm8gcnY7Ci0KLQlydi5tc3Jfbm8gPSBtc3Jfbm87Ci0JcnYubCA9IGw7Ci0JcnYuaCA9IGg7Ci0JZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX193cm1zcl9vbl9jcHUsICZydiwgMSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKiBUaGVzZSAic2FmZSIgdmFyaWFudHMgYXJlIHNsb3dlciBhbmQgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgdGFyZ2V0IE1TUgotICAgbWF5IG5vdCBhY3R1YWxseSBleGlzdC4gKi8KLXN0YXRpYyB2b2lkIF9fcmRtc3Jfc2FmZV9vbl9jcHUodm9pZCAqaW5mbykKLXsKLQlzdHJ1Y3QgbXNyX2luZm8gKnJ2ID0gaW5mbzsKLQotCXJ2LT5lcnIgPSByZG1zcl9zYWZlKHJ2LT5tc3Jfbm8sICZydi0+bCwgJnJ2LT5oKTsKLX0KLQotc3RhdGljIHZvaWQgX193cm1zcl9zYWZlX29uX2NwdSh2b2lkICppbmZvKQotewotCXN0cnVjdCBtc3JfaW5mbyAqcnYgPSBpbmZvOwotCi0JcnYtPmVyciA9IHdybXNyX3NhZmUocnYtPm1zcl9ubywgcnYtPmwsIHJ2LT5oKTsKLX0KLQotaW50IHJkbXNyX3NhZmVfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sIHUzMiAqbCwgdTMyICpoKQotewotCWludCBlcnI7Ci0Jc3RydWN0IG1zcl9pbmZvIHJ2OwotCi0JcnYubXNyX25vID0gbXNyX25vOwotCWVyciA9IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIF9fcmRtc3Jfc2FmZV9vbl9jcHUsICZydiwgMSk7Ci0JKmwgPSBydi5sOwotCSpoID0gcnYuaDsKLQotCXJldHVybiBlcnIgPyBlcnIgOiBydi5lcnI7Ci19Ci0KLWludCB3cm1zcl9zYWZlX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgbCwgdTMyIGgpCi17Ci0JaW50IGVycjsKLQlzdHJ1Y3QgbXNyX2luZm8gcnY7Ci0KLQlydi5tc3Jfbm8gPSBtc3Jfbm87Ci0JcnYubCA9IGw7Ci0JcnYuaCA9IGg7Ci0JZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX193cm1zcl9zYWZlX29uX2NwdSwgJnJ2LCAxKTsKLQotCXJldHVybiBlcnIgPyBlcnIgOiBydi5lcnI7Ci19Ci0KLUVYUE9SVF9TWU1CT0wocmRtc3Jfb25fY3B1KTsKLUVYUE9SVF9TWU1CT0wod3Jtc3Jfb25fY3B1KTsKLUVYUE9SVF9TWU1CT0wocmRtc3Jfc2FmZV9vbl9jcHUpOwotRVhQT1JUX1NZTUJPTCh3cm1zcl9zYWZlX29uX2NwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvbXNyLmMgYi9hcmNoL3g4Ni9saWIvbXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0MGI5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2xpYi9tc3IuYwpAQCAtMCwwICsxLDE4MyBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWVtcHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxhc20vbXNyLmg+CisKK3N0cnVjdCBtc3JfaW5mbyB7CisJdTMyIG1zcl9ubzsKKwlzdHJ1Y3QgbXNyIHJlZzsKKwlzdHJ1Y3QgbXNyICptc3JzOworCWludCBvZmY7CisJaW50IGVycjsKK307CisKK3N0YXRpYyB2b2lkIF9fcmRtc3Jfb25fY3B1KHZvaWQgKmluZm8pCit7CisJc3RydWN0IG1zcl9pbmZvICpydiA9IGluZm87CisJc3RydWN0IG1zciAqcmVnOworCWludCB0aGlzX2NwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAocnYtPm1zcnMpCisJCXJlZyA9ICZydi0+bXNyc1t0aGlzX2NwdSAtIHJ2LT5vZmZdOworCWVsc2UKKwkJcmVnID0gJnJ2LT5yZWc7CisKKwlyZG1zcihydi0+bXNyX25vLCByZWctPmwsIHJlZy0+aCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fd3Jtc3Jfb25fY3B1KHZvaWQgKmluZm8pCit7CisJc3RydWN0IG1zcl9pbmZvICpydiA9IGluZm87CisJc3RydWN0IG1zciAqcmVnOworCWludCB0aGlzX2NwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAocnYtPm1zcnMpCisJCXJlZyA9ICZydi0+bXNyc1t0aGlzX2NwdSAtIHJ2LT5vZmZdOworCWVsc2UKKwkJcmVnID0gJnJ2LT5yZWc7CisKKwl3cm1zcihydi0+bXNyX25vLCByZWctPmwsIHJlZy0+aCk7Cit9CisKK2ludCByZG1zcl9vbl9jcHUodW5zaWduZWQgaW50IGNwdSwgdTMyIG1zcl9ubywgdTMyICpsLCB1MzIgKmgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbXNyX2luZm8gcnY7CisKKwltZW1zZXQoJnJ2LCAwLCBzaXplb2YocnYpKTsKKworCXJ2Lm1zcl9ubyA9IG1zcl9ubzsKKwllcnIgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBfX3JkbXNyX29uX2NwdSwgJnJ2LCAxKTsKKwkqbCA9IHJ2LnJlZy5sOworCSpoID0gcnYucmVnLmg7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChyZG1zcl9vbl9jcHUpOworCitpbnQgd3Jtc3Jfb25fY3B1KHVuc2lnbmVkIGludCBjcHUsIHUzMiBtc3Jfbm8sIHUzMiBsLCB1MzIgaCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtc3JfaW5mbyBydjsKKworCW1lbXNldCgmcnYsIDAsIHNpemVvZihydikpOworCisJcnYubXNyX25vID0gbXNyX25vOworCXJ2LnJlZy5sID0gbDsKKwlydi5yZWcuaCA9IGg7CisJZXJyID0gc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX193cm1zcl9vbl9jcHUsICZydiwgMSk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTCh3cm1zcl9vbl9jcHUpOworCisvKiByZG1zciBvbiBhIGJ1bmNoIG9mIENQVXMKKyAqCisgKiBAbWFzazogICAgICAgd2hpY2ggQ1BVcworICogQG1zcl9ubzogICAgIHdoaWNoIE1TUgorICogQG1zcnM6ICAgICAgIGFycmF5IG9mIE1TUiB2YWx1ZXMKKyAqCisgKi8KK3ZvaWQgcmRtc3Jfb25fY3B1cyhjb25zdCBjcHVtYXNrX3QgKm1hc2ssIHUzMiBtc3Jfbm8sIHN0cnVjdCBtc3IgKm1zcnMpCit7CisJc3RydWN0IG1zcl9pbmZvIHJ2OworCWludCB0aGlzX2NwdTsKKworCW1lbXNldCgmcnYsIDAsIHNpemVvZihydikpOworCisJcnYub2ZmICAgID0gY3B1bWFza19maXJzdChtYXNrKTsKKwlydi5tc3JzCSAgPSBtc3JzOworCXJ2Lm1zcl9ubyA9IG1zcl9ubzsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCS8qCisJICogRklYTUU6IGhhbmRsZSB0aGUgQ1BVIHdlJ3JlIGV4ZWN1dGluZyBvbiBzZXBhcmF0ZWx5IGZvciBub3cgdW50aWwKKwkgKiBzbXBfY2FsbF9mdW5jdGlvbl9tYW55IGhhcyBiZWVuIGZpeGVkIHRvIG5vdCBza2lwIGl0LgorCSAqLworCXRoaXNfY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUodGhpc19jcHUsIF9fcmRtc3Jfb25fY3B1LCAmcnYsIDEpOworCisJc21wX2NhbGxfZnVuY3Rpb25fbWFueShtYXNrLCBfX3JkbXNyX29uX2NwdSwgJnJ2LCAxKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorRVhQT1JUX1NZTUJPTChyZG1zcl9vbl9jcHVzKTsKKworLyoKKyAqIHdybXNyIG9uIGEgYnVuY2ggb2YgQ1BVcworICoKKyAqIEBtYXNrOiAgICAgICB3aGljaCBDUFVzCisgKiBAbXNyX25vOiAgICAgd2hpY2ggTVNSCisgKiBAbXNyczogICAgICAgYXJyYXkgb2YgTVNSIHZhbHVlcworICoKKyAqLwordm9pZCB3cm1zcl9vbl9jcHVzKGNvbnN0IGNwdW1hc2tfdCAqbWFzaywgdTMyIG1zcl9ubywgc3RydWN0IG1zciAqbXNycykKK3sKKwlzdHJ1Y3QgbXNyX2luZm8gcnY7CisJaW50IHRoaXNfY3B1OworCisJbWVtc2V0KCZydiwgMCwgc2l6ZW9mKHJ2KSk7CisKKwlydi5vZmYgICAgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOworCXJ2Lm1zcnMgICA9IG1zcnM7CisJcnYubXNyX25vID0gbXNyX25vOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJLyoKKwkgKiBGSVhNRTogaGFuZGxlIHRoZSBDUFUgd2UncmUgZXhlY3V0aW5nIG9uIHNlcGFyYXRlbHkgZm9yIG5vdyB1bnRpbAorCSAqIHNtcF9jYWxsX2Z1bmN0aW9uX21hbnkgaGFzIGJlZW4gZml4ZWQgdG8gbm90IHNraXAgaXQuCisJICovCisJdGhpc19jcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSh0aGlzX2NwdSwgX193cm1zcl9vbl9jcHUsICZydiwgMSk7CisKKwlzbXBfY2FsbF9mdW5jdGlvbl9tYW55KG1hc2ssIF9fd3Jtc3Jfb25fY3B1LCAmcnYsIDEpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CitFWFBPUlRfU1lNQk9MKHdybXNyX29uX2NwdXMpOworCisvKiBUaGVzZSAic2FmZSIgdmFyaWFudHMgYXJlIHNsb3dlciBhbmQgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgdGFyZ2V0IE1TUgorICAgbWF5IG5vdCBhY3R1YWxseSBleGlzdC4gKi8KK3N0YXRpYyB2b2lkIF9fcmRtc3Jfc2FmZV9vbl9jcHUodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3QgbXNyX2luZm8gKnJ2ID0gaW5mbzsKKworCXJ2LT5lcnIgPSByZG1zcl9zYWZlKHJ2LT5tc3Jfbm8sICZydi0+cmVnLmwsICZydi0+cmVnLmgpOworfQorCitzdGF0aWMgdm9pZCBfX3dybXNyX3NhZmVfb25fY3B1KHZvaWQgKmluZm8pCit7CisJc3RydWN0IG1zcl9pbmZvICpydiA9IGluZm87CisKKwlydi0+ZXJyID0gd3Jtc3Jfc2FmZShydi0+bXNyX25vLCBydi0+cmVnLmwsIHJ2LT5yZWcuaCk7Cit9CisKK2ludCByZG1zcl9zYWZlX29uX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCB1MzIgbXNyX25vLCB1MzIgKmwsIHUzMiAqaCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtc3JfaW5mbyBydjsKKworCW1lbXNldCgmcnYsIDAsIHNpemVvZihydikpOworCisJcnYubXNyX25vID0gbXNyX25vOworCWVyciA9IHNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIF9fcmRtc3Jfc2FmZV9vbl9jcHUsICZydiwgMSk7CisJKmwgPSBydi5yZWcubDsKKwkqaCA9IHJ2LnJlZy5oOworCisJcmV0dXJuIGVyciA/IGVyciA6IHJ2LmVycjsKK30KK0VYUE9SVF9TWU1CT0wocmRtc3Jfc2FmZV9vbl9jcHUpOworCitpbnQgd3Jtc3Jfc2FmZV9vbl9jcHUodW5zaWduZWQgaW50IGNwdSwgdTMyIG1zcl9ubywgdTMyIGwsIHUzMiBoKQoreworCWludCBlcnI7CisJc3RydWN0IG1zcl9pbmZvIHJ2OworCisJbWVtc2V0KCZydiwgMCwgc2l6ZW9mKHJ2KSk7CisKKwlydi5tc3Jfbm8gPSBtc3Jfbm87CisJcnYucmVnLmwgPSBsOworCXJ2LnJlZy5oID0gaDsKKwllcnIgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBfX3dybXNyX3NhZmVfb25fY3B1LCAmcnYsIDEpOworCisJcmV0dXJuIGVyciA/IGVyciA6IHJ2LmVycjsKK30KK0VYUE9SVF9TWU1CT0wod3Jtc3Jfc2FmZV9vbl9jcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZHVtcF9wYWdldGFibGVzLmMgYi9hcmNoL3g4Ni9tbS9kdW1wX3BhZ2V0YWJsZXMuYwppbmRleCBlNzI3N2NiLi5hNzI1YjdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9kdW1wX3BhZ2V0YWJsZXMuYworKysgYi9hcmNoL3g4Ni9tbS9kdW1wX3BhZ2V0YWJsZXMuYwpAQCAtMTYxLDEzICsxNjEsMTQgQEAKIAkJICAgc3QtPmN1cnJlbnRfYWRkcmVzcyA+PSBzdC0+bWFya2VyWzFdLnN0YXJ0X2FkZHJlc3MpIHsKIAkJY29uc3QgY2hhciAqdW5pdCA9IHVuaXRzOwogCQl1bnNpZ25lZCBsb25nIGRlbHRhOworCQlpbnQgd2lkdGggPSBzaXplb2YodW5zaWduZWQgbG9uZykgKiAyOwogCiAJCS8qCiAJCSAqIE5vdyBwcmludCB0aGUgYWN0dWFsIGZpbmlzaGVkIHNlcmllcwogCQkgKi8KLQkJc2VxX3ByaW50ZihtLCAiMHglcC0weCVwICAgIiwKLQkJCSAgICh2b2lkICopc3QtPnN0YXJ0X2FkZHJlc3MsCi0JCQkgICAodm9pZCAqKXN0LT5jdXJyZW50X2FkZHJlc3MpOworCQlzZXFfcHJpbnRmKG0sICIweCUwKmx4LTB4JTAqbHggICAiLAorCQkJICAgd2lkdGgsIHN0LT5zdGFydF9hZGRyZXNzLAorCQkJICAgd2lkdGgsIHN0LT5jdXJyZW50X2FkZHJlc3MpOwogCiAJCWRlbHRhID0gKHN0LT5jdXJyZW50X2FkZHJlc3MgLSBzdC0+c3RhcnRfYWRkcmVzcykgPj4gMTA7CiAJCXdoaWxlICghKGRlbHRhICYgMTAyMykgJiYgdW5pdFsxXSkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZmF1bHQuYyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKaW5kZXggYTAzYjcyNy4uYzZhY2M2MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCkBAIC0zLDQwICszLDE3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgUmVkIEhhdCBJbmMuLCBJbmdvIE1vbG5hcgogICovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW1pb3RyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgkJLyogU1RBQ0tfRU5EX01BR0lDCQkqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiB0ZXN0X3RocmVhZF9mbGFnKCksIC4uLgkqLworI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgkJLyogb29wc19iZWdpbi9lbmQsIC4uLgkJKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JCS8qIHNlYXJjaF9leGNlcHRpb25fdGFibGUJKi8KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CQkvKiBtYXhfbG93X3BmbgkJCSovCisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgkJLyogX19rcHJvYmVzLCAuLi4JCSovCisjaW5jbHVkZSA8bGludXgvbW1pb3RyYWNlLmg+CQkvKiBrbW1pb19oYW5kbGVyLCAuLi4JCSovCisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CQkvKiBwZXJmX3N3Y291bnRlcl9ldmVudAkJKi8KIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlY3Rpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wcm90by5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CQkJLyogZG90cmFwbGlua2FnZSwgLi4uCQkqLworI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CQkvKiBwZ2RfKigpLCAuLi4JCQkqLwogCiAvKgogICogUGFnZSBmYXVsdCBlcnJvciBjb2RlIGJpdHM6CkBAIC0yMjUsMTIgKzIwMiwxMCBAQAogCWlmICghcG1kX3ByZXNlbnQoKnBtZF9rKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIXBtZF9wcmVzZW50KCpwbWQpKSB7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSkKIAkJc2V0X3BtZChwbWQsICpwbWRfayk7Ci0JCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwotCX0gZWxzZSB7CisJZWxzZQogCQlCVUdfT04ocG1kX3BhZ2UoKnBtZCkgIT0gcG1kX3BhZ2UoKnBtZF9rKSk7Ci0JfQogCiAJcmV0dXJuIHBtZF9rOwogfQpAQCAtNTM4LDggKzUxMyw2IEBACiBzdGF0aWMgaW50IGlzX2VycmF0YTkzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAotCXN0YXRpYyBpbnQgb25jZTsKLQogCWlmIChhZGRyZXNzICE9IHJlZ3MtPmlwKQogCQlyZXR1cm4gMDsKIApAQCAtNTQ5LDEwICs1MjIsNyBAQAogCWFkZHJlc3MgfD0gMHhmZmZmZmZmZlVMIDw8IDMyOwogCWlmICgoYWRkcmVzcyA+PSAodTY0KV9zdGV4dCAmJiBhZGRyZXNzIDw9ICh1NjQpX2V0ZXh0KSB8fAogCSAgICAoYWRkcmVzcyA+PSBNT0RVTEVTX1ZBRERSICYmIGFkZHJlc3MgPD0gTU9EVUxFU19FTkQpKSB7Ci0JCWlmICghb25jZSkgewotCQkJcHJpbnRrKGVycmF0YTkzX3dhcm5pbmcpOwotCQkJb25jZSA9IDE7Ci0JCX0KKwkJcHJpbnRrX29uY2UoZXJyYXRhOTNfd2FybmluZyk7CiAJCXJlZ3MtPmlwID0gYWRkcmVzczsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTA0NCw2ICsxMDE0LDggQEAKIAlpZiAodW5saWtlbHkoZXJyb3JfY29kZSAmIFBGX1JTVkQpKQogCQlwZ3RhYmxlX2JhZChyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKIAorCXBlcmZfc3djb3VudGVyX2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIDAsIHJlZ3MsIGFkZHJlc3MpOworCiAJLyoKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQsIGhhdmUgbm8gdXNlciBjb250ZXh0IG9yIGFyZSBydW5uaW5nCiAJICogaW4gYW4gYXRvbWljIHJlZ2lvbiB0aGVuIHdlIG11c3Qgbm90IHRha2UgdGhlIGZhdWx0OgpAQCAtMTEzNywxMCArMTEwOSwxNSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGZhdWx0ICYgVk1fRkFVTFRfTUFKT1IpCisJaWYgKGZhdWx0ICYgVk1fRkFVTFRfTUFKT1IpIHsKIAkJdHNrLT5tYWpfZmx0Kys7Ci0JZWxzZQorCQlwZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwgMCwKKwkJCQkgICAgIHJlZ3MsIGFkZHJlc3MpOworCX0gZWxzZSB7CiAJCXRzay0+bWluX2ZsdCsrOworCQlwZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTiwgMSwgMCwKKwkJCQkgICAgIHJlZ3MsIGFkZHJlc3MpOworCX0KIAogCWNoZWNrX3Y4MDg2X21vZGUocmVncywgYWRkcmVzcywgdHNrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaGlnaG1lbV8zMi5jIGIvYXJjaC94ODYvbW0vaGlnaG1lbV8zMi5jCmluZGV4IDgxMjZlOGQuLjU4ZjYyMWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2hpZ2htZW1fMzIuYworKysgYi9hcmNoL3g4Ni9tbS9oaWdobWVtXzMyLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKIAl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4gKyBpZHgpOwogCUJVR19PTighcHRlX25vbmUoKihrbWFwX3B0ZS1pZHgpKSk7CiAJc2V0X3B0ZShrbWFwX3B0ZS1pZHgsIG1rX3B0ZShwYWdlLCBwcm90KSk7Ci0JYXJjaF9mbHVzaF9sYXp5X21tdV9tb2RlKCk7CiAKIAlyZXR1cm4gKHZvaWQgKil2YWRkcjsKIH0KQEAgLTc0LDcgKzczLDYgQEAKICNlbmRpZgogCX0KIAotCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwogCXBhZ2VmYXVsdF9lbmFibGUoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdC5jIGIvYXJjaC94ODYvbW0vaW5pdC5jCmluZGV4IGFlNGY3YjUuLjM0YzFiZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0LmMKQEAgLTEsMyArMSw0IEBACisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogCkBAIC0xMCw2ICsxMSw5IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKworREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKIAogdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGU4MjBfdGFibGVfc3RhcnQ7CiB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgZTgyMF90YWJsZV9lbmQ7CkBAIC0yMyw2ICsyNyw2OSBAQAogI2VuZGlmCiA7CiAKK2ludCBueF9lbmFibGVkOworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSB8fCBkZWZpbmVkKENPTkZJR19YODZfUEFFKQorc3RhdGljIGludCBkaXNhYmxlX254IF9fY3B1aW5pdGRhdGE7CisKKy8qCisgKiBub2V4ZWMgPSBvbnxvZmYKKyAqCisgKiBDb250cm9sIG5vbi1leGVjdXRhYmxlIG1hcHBpbmdzIGZvciBwcm9jZXNzZXMuCisgKgorICogb24gICAgICBFbmFibGUKKyAqIG9mZiAgICAgRGlzYWJsZQorICovCitzdGF0aWMgaW50IF9faW5pdCBub2V4ZWNfc2V0dXAoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXN0cm5jbXAoc3RyLCAib24iLCAyKSkgeworCQlfX3N1cHBvcnRlZF9wdGVfbWFzayB8PSBfUEFHRV9OWDsKKwkJZGlzYWJsZV9ueCA9IDA7CisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJvZmYiLCAzKSkgeworCQlkaXNhYmxlX254ID0gMTsKKwkJX19zdXBwb3J0ZWRfcHRlX21hc2sgJj0gfl9QQUdFX05YOworCX0KKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub2V4ZWMiLCBub2V4ZWNfc2V0dXApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorc3RhdGljIHZvaWQgX19pbml0IHNldF9ueCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2WzRdLCBsLCBoOworCisJaWYgKGNwdV9oYXNfcGFlICYmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPiAweDgwMDAwMDAxKSkgeworCQljcHVpZCgweDgwMDAwMDAxLCAmdlswXSwgJnZbMV0sICZ2WzJdLCAmdlszXSk7CisKKwkJaWYgKCh2WzNdICYgKDEgPDwgMjApKSAmJiAhZGlzYWJsZV9ueCkgeworCQkJcmRtc3IoTVNSX0VGRVIsIGwsIGgpOworCQkJbCB8PSBFRkVSX05YOworCQkJd3Jtc3IoTVNSX0VGRVIsIGwsIGgpOworCQkJbnhfZW5hYmxlZCA9IDE7CisJCQlfX3N1cHBvcnRlZF9wdGVfbWFzayB8PSBfUEFHRV9OWDsKKwkJfQorCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X254KHZvaWQpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfNjQKK3ZvaWQgX19jcHVpbml0IGNoZWNrX2VmZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGVmZXI7CisKKwlyZG1zcmwoTVNSX0VGRVIsIGVmZXIpOworCWlmICghKGVmZXIgJiBFRkVSX05YKSB8fCBkaXNhYmxlX254KQorCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IGZpbmRfZWFybHlfdGFibGVfc3BhY2UodW5zaWduZWQgbG9uZyBlbmQsIGludCB1c2VfcHNlLAogCQkJCQkgIGludCB1c2VfZ2JwYWdlcykKIHsKQEAgLTY2LDEyICsxMzMsMTEgQEAKIAkgKi8KICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJc3RhcnQgPSAweDcwMDA7CisjZWxzZQorCXN0YXJ0ID0gMHg4MDAwOworI2VuZGlmCiAJZTgyMF90YWJsZV9zdGFydCA9IGZpbmRfZTgyMF9hcmVhKHN0YXJ0LCBtYXhfcGZuX21hcHBlZDw8UEFHRV9TSElGVCwKIAkJCQkJdGFibGVzLCBQQUdFX1NJWkUpOwotI2Vsc2UgLyogQ09ORklHX1g4Nl82NCAqLwotCXN0YXJ0ID0gMHg4MDAwOwotCWU4MjBfdGFibGVfc3RhcnQgPSBmaW5kX2U4MjBfYXJlYShzdGFydCwgZW5kLCB0YWJsZXMsIFBBR0VfU0laRSk7Ci0jZW5kaWYKIAlpZiAoZTgyMF90YWJsZV9zdGFydCA9PSAtMVVMKQogCQlwYW5pYygiQ2Fubm90IGZpbmQgc3BhY2UgZm9yIHRoZSBrZXJuZWwgcGFnZSB0YWJsZXMiKTsKIApAQCAtMTU5LDEyICsyMjUsOSBAQAogCXVzZV9nYnBhZ2VzID0gZGlyZWN0X2dicGFnZXM7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfMzIKLSNpZmRlZiBDT05GSUdfWDg2X1BBRQogCXNldF9ueCgpOwogCWlmIChueF9lbmFibGVkKQogCQlwcmludGsoS0VSTl9JTkZPICJOWCAoRXhlY3V0ZSBEaXNhYmxlKSBwcm90ZWN0aW9uOiBhY3RpdmVcbiIpOwotI2VuZGlmCiAKIAkvKiBFbmFibGUgUFNFIGlmIGF2YWlsYWJsZSAqLwogCWlmIChjcHVfaGFzX3BzZSkKQEAgLTE3NSw3ICsyMzgsNiBAQAogCQlzZXRfaW5fY3I0KFg4Nl9DUjRfUEdFKTsKIAkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfR0xPQkFMOwogCX0KLSNlbmRpZgogCiAJaWYgKHVzZV9nYnBhZ2VzKQogCQlwYWdlX3NpemVfbWFzayB8PSAxIDw8IFBHX0xFVkVMXzFHOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCmluZGV4IDc0OTU1OWUuLjk0OTcwOGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKQEAgLTQ5LDEyICs0OSw5IEBACiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pbml0Lmg+CiAKLXVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm5fbWFwcGVkOwotdW5zaWduZWQgbG9uZyBtYXhfcGZuX21hcHBlZDsKLQotREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKIHVuc2lnbmVkIGxvbmcgaGlnaHN0YXJ0X3BmbiwgaGlnaGVuZF9wZm47CiAKIHN0YXRpYyBub2lubGluZSBpbnQgZG9fdGVzdF93cF9iaXQodm9pZCk7CkBAIC01ODcsNjEgKzU4NCw5IEBACiAJZmx1c2hfdGxiX2FsbCgpOwogfQogCi1pbnQgbnhfZW5hYmxlZDsKLQogcHRldmFsX3QgX19zdXBwb3J0ZWRfcHRlX21hc2sgX19yZWFkX21vc3RseSA9IH4oX1BBR0VfTlggfCBfUEFHRV9HTE9CQUwgfCBfUEFHRV9JT01BUCk7CiBFWFBPUlRfU1lNQk9MX0dQTChfX3N1cHBvcnRlZF9wdGVfbWFzayk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X1BBRQotCi1zdGF0aWMgaW50IGRpc2FibGVfbnggX19pbml0ZGF0YTsKLQotLyoKLSAqIG5vZXhlYyA9IG9ufG9mZgotICoKLSAqIENvbnRyb2wgbm9uIGV4ZWN1dGFibGUgbWFwcGluZ3MuCi0gKgotICogb24gICAgICBFbmFibGUKLSAqIG9mZiAgICAgRGlzYWJsZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBub2V4ZWNfc2V0dXAoY2hhciAqc3RyKQotewotCWlmICghc3RyIHx8ICFzdHJjbXAoc3RyLCAib24iKSkgewotCQlpZiAoY3B1X2hhc19ueCkgewotCQkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfTlg7Ci0JCQlkaXNhYmxlX254ID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghc3RyY21wKHN0ciwgIm9mZiIpKSB7Ci0JCQlkaXNhYmxlX254ID0gMTsKLQkJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9OWDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgibm9leGVjIiwgbm9leGVjX3NldHVwKTsKLQotdm9pZCBfX2luaXQgc2V0X254KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHZbNF0sIGwsIGg7Ci0KLQlpZiAoY3B1X2hhc19wYWUgJiYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+IDB4ODAwMDAwMDEpKSB7Ci0JCWNwdWlkKDB4ODAwMDAwMDEsICZ2WzBdLCAmdlsxXSwgJnZbMl0sICZ2WzNdKTsKLQotCQlpZiAoKHZbM10gJiAoMSA8PCAyMCkpICYmICFkaXNhYmxlX254KSB7Ci0JCQlyZG1zcihNU1JfRUZFUiwgbCwgaCk7Ci0JCQlsIHw9IEVGRVJfTlg7Ci0JCQl3cm1zcihNU1JfRUZFUiwgbCwgaCk7Ci0JCQlueF9lbmFibGVkID0gMTsKLQkJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOwotCQl9Ci0JfQotfQotI2VuZGlmCi0KIC8qIHVzZXItZGVmaW5lZCBoaWdobWVtIHNpemUgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGlnaG1lbV9wYWdlcyA9IC0xOwogCkBAIC03NjEsMTUgKzcwNiwxNSBAQAogCWhpZ2hzdGFydF9wZm4gPSBoaWdoZW5kX3BmbiA9IG1heF9wZm47CiAJaWYgKG1heF9wZm4gPiBtYXhfbG93X3BmbikKIAkJaGlnaHN0YXJ0X3BmbiA9IG1heF9sb3dfcGZuOwotCW1lbW9yeV9wcmVzZW50KDAsIDAsIGhpZ2hlbmRfcGZuKTsKIAllODIwX3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKDAsIDAsIGhpZ2hlbmRfcGZuKTsKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucygwKTsKIAlwcmludGsoS0VSTl9OT1RJQ0UgIiVsZE1CIEhJR0hNRU0gYXZhaWxhYmxlLlxuIiwKIAkJcGFnZXNfdG9fbWIoaGlnaGVuZF9wZm4gLSBoaWdoc3RhcnRfcGZuKSk7CiAJbnVtX3BoeXNwYWdlcyA9IGhpZ2hlbmRfcGZuOwogCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShoaWdoc3RhcnRfcGZuICogUEFHRV9TSVpFIC0gMSkgKyAxOwogI2Vsc2UKLQltZW1vcnlfcHJlc2VudCgwLCAwLCBtYXhfbG93X3Bmbik7CiAJZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucygwLCAwLCBtYXhfbG93X3Bmbik7CisJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMoMCk7CiAJbnVtX3BoeXNwYWdlcyA9IG1heF9sb3dfcGZuOwogCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShtYXhfbG93X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF82NC5jIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCmluZGV4IDE3NTNlODAuLjUyYmI5NTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKQEAgLTUwLDE4ICs1MCw4IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vaW5pdC5oPgogCi0vKgotICogZW5kX3BmbiBvbmx5IGluY2x1ZGVzIFJBTSwgd2hpbGUgbWF4X3Bmbl9tYXBwZWQgaW5jbHVkZXMgYWxsIGU4MjAgZW50cmllcy4KLSAqIFRoZSBkaXJlY3QgbWFwcGluZyBleHRlbmRzIHRvIG1heF9wZm5fbWFwcGVkLCBzbyB0aGF0IHdlIGNhbiBkaXJlY3RseSBhY2Nlc3MKLSAqIGFwZXJ0dXJlcywgQUNQSSBhbmQgb3RoZXIgdGFibGVzIHdpdGhvdXQgaGF2aW5nIHRvIHBsYXkgd2l0aCBmaXhtYXBzLgotICovCi11bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuX21hcHBlZDsKLXVuc2lnbmVkIGxvbmcgbWF4X3Bmbl9tYXBwZWQ7Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9yZXNlcnZlIF9faW5pdGRhdGE7CiAKLURFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2RpcmVjdF9nYnBhZ2VzX29mZihjaGFyICphcmcpCiB7CiAJZGlyZWN0X2dicGFnZXMgPSAwOwpAQCAtODUsMzkgKzc1LDYgQEAKIHB0ZXZhbF90IF9fc3VwcG9ydGVkX3B0ZV9tYXNrIF9fcmVhZF9tb3N0bHkgPSB+X1BBR0VfSU9NQVA7CiBFWFBPUlRfU1lNQk9MX0dQTChfX3N1cHBvcnRlZF9wdGVfbWFzayk7CiAKLXN0YXRpYyBpbnQgZGlzYWJsZV9ueCBfX2NwdWluaXRkYXRhOwotCi0vKgotICogbm9leGVjPW9ufG9mZgotICogQ29udHJvbCBub24tZXhlY3V0YWJsZSBtYXBwaW5ncyBmb3IgNjQtYml0IHByb2Nlc3Nlcy4KLSAqCi0gKiBvbglFbmFibGUgKGRlZmF1bHQpCi0gKiBvZmYJRGlzYWJsZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBub254X3NldHVwKGNoYXIgKnN0cikKLXsKLQlpZiAoIXN0cikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFzdHJuY21wKHN0ciwgIm9uIiwgMikpIHsKLQkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfTlg7Ci0JCWRpc2FibGVfbnggPSAwOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAib2ZmIiwgMykpIHsKLQkJZGlzYWJsZV9ueCA9IDE7Ci0JCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9OWDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgibm9leGVjIiwgbm9ueF9zZXR1cCk7Ci0KLXZvaWQgX19jcHVpbml0IGNoZWNrX2VmZXIodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGVmZXI7Ci0KLQlyZG1zcmwoTVNSX0VGRVIsIGVmZXIpOwotCWlmICghKGVmZXIgJiBFRkVSX05YKSB8fCBkaXNhYmxlX254KQotCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7Ci19Ci0KIGludCBmb3JjZV9wZXJzb25hbGl0eTMyOwogCiAvKgpAQCAtNjI4LDYgKzU4NSw3IEBACiAJZWFybHlfcmVzX3RvX2Jvb3RtZW0oMCwgZW5kX3Bmbjw8UEFHRV9TSElGVCk7CiAJcmVzZXJ2ZV9ib290bWVtKGJvb3RtYXAsIGJvb3RtYXBfc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIH0KKyNlbmRpZgogCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogewpAQCAtNjM4LDExICs1OTYsMTAgQEAKIAltYXhfem9uZV9wZm5zW1pPTkVfRE1BMzJdID0gTUFYX0RNQTMyX1BGTjsKIAltYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA9IG1heF9wZm47CiAKLQltZW1vcnlfcHJlc2VudCgwLCAwLCBtYXhfcGZuKTsKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucyhNQVhfTlVNTk9ERVMpOwogCXNwYXJzZV9pbml0KCk7CiAJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiB9Ci0jZW5kaWYKIAogLyoKICAqIE1lbW9yeSBob3RwbHVnIHNwZWNpZmljIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW9tYXBfMzIuYyBiL2FyY2gveDg2L21tL2lvbWFwXzMyLmMKaW5kZXggODA1NjU0NS4uZmU2Zjg0YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW9tYXBfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9pb21hcF8zMi5jCkBAIC04Miw3ICs4Miw2IEBACiAJaWYgKHZhZGRyID09IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4raWR4KSkKIAkJa3B0ZV9jbGVhcl9mbHVzaChrbWFwX3B0ZS1pZHgsIHZhZGRyKTsKIAotCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwogCXBhZ2VmYXVsdF9lbmFibGUoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvdW5tYXBfYXRvbWljKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2ttbWlvLmMgYi9hcmNoL3g4Ni9tbS9rbW1pby5jCmluZGV4IDUwZGM4MDIuLjE2Y2NiZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ttbWlvLmMKKysrIGIvYXJjaC94ODYvbW0va21taW8uYwpAQCAtMzIsNyArMzIsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqcmVsZWFzZV9uZXh0OwogCXVuc2lnbmVkIGxvbmcgcGFnZTsgLyogbG9jYXRpb24gb2YgdGhlIGZhdWx0IHBhZ2UgKi8KLQlib29sIG9sZF9wcmVzZW5jZTsgLyogcGFnZSBwcmVzZW5jZSBwcmlvciB0byBhcm1pbmcgKi8KKwlwdGV2YWxfdCBvbGRfcHJlc2VuY2U7IC8qIHBhZ2UgcHJlc2VuY2UgcHJpb3IgdG8gYXJtaW5nICovCiAJYm9vbCBhcm1lZDsKIAogCS8qCkBAIC05Nyw2MCArOTcsNjIgQEAKIHN0YXRpYyBzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqZ2V0X2ttbWlvX2ZhdWx0X3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKnA7CisJc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKmY7CiAKIAlwYWdlICY9IFBBR0VfTUFTSzsKIAloZWFkID0ga21taW9fcGFnZV9saXN0KHBhZ2UpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIGhlYWQsIGxpc3QpIHsKLQkJaWYgKHAtPnBhZ2UgPT0gcGFnZSkKLQkJCXJldHVybiBwOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGYsIGhlYWQsIGxpc3QpIHsKKwkJaWYgKGYtPnBhZ2UgPT0gcGFnZSkKKwkJCXJldHVybiBmOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3BtZF9wcmVzZW5jZShwbWRfdCAqcG1kLCBib29sIHByZXNlbnQsIGJvb2wgKm9sZCkKK3N0YXRpYyB2b2lkIGNsZWFyX3BtZF9wcmVzZW5jZShwbWRfdCAqcG1kLCBib29sIGNsZWFyLCBwbWR2YWxfdCAqb2xkKQogewogCXBtZHZhbF90IHYgPSBwbWRfdmFsKCpwbWQpOwotCSpvbGQgPSAhISh2ICYgX1BBR0VfUFJFU0VOVCk7Ci0JdiAmPSB+X1BBR0VfUFJFU0VOVDsKLQlpZiAocHJlc2VudCkKLQkJdiB8PSBfUEFHRV9QUkVTRU5UOworCWlmIChjbGVhcikgeworCQkqb2xkID0gdiAmIF9QQUdFX1BSRVNFTlQ7CisJCXYgJj0gfl9QQUdFX1BSRVNFTlQ7CisJfSBlbHNlCS8qIHByZXN1bWUgdGhpcyBoYXMgYmVlbiBjYWxsZWQgd2l0aCBjbGVhcj09dHJ1ZSBwcmV2aW91c2x5ICovCisJCXYgfD0gKm9sZDsKIAlzZXRfcG1kKHBtZCwgX19wbWQodikpOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfcHRlX3ByZXNlbmNlKHB0ZV90ICpwdGUsIGJvb2wgcHJlc2VudCwgYm9vbCAqb2xkKQorc3RhdGljIHZvaWQgY2xlYXJfcHRlX3ByZXNlbmNlKHB0ZV90ICpwdGUsIGJvb2wgY2xlYXIsIHB0ZXZhbF90ICpvbGQpCiB7CiAJcHRldmFsX3QgdiA9IHB0ZV92YWwoKnB0ZSk7Ci0JKm9sZCA9ICEhKHYgJiBfUEFHRV9QUkVTRU5UKTsKLQl2ICY9IH5fUEFHRV9QUkVTRU5UOwotCWlmIChwcmVzZW50KQotCQl2IHw9IF9QQUdFX1BSRVNFTlQ7CisJaWYgKGNsZWFyKSB7CisJCSpvbGQgPSB2ICYgX1BBR0VfUFJFU0VOVDsKKwkJdiAmPSB+X1BBR0VfUFJFU0VOVDsKKwl9IGVsc2UJLyogcHJlc3VtZSB0aGlzIGhhcyBiZWVuIGNhbGxlZCB3aXRoIGNsZWFyPT10cnVlIHByZXZpb3VzbHkgKi8KKwkJdiB8PSAqb2xkOwogCXNldF9wdGVfYXRvbWljKHB0ZSwgX19wdGUodikpOwogfQogCi1zdGF0aWMgaW50IHNldF9wYWdlX3ByZXNlbmNlKHVuc2lnbmVkIGxvbmcgYWRkciwgYm9vbCBwcmVzZW50LCBib29sICpvbGQpCitzdGF0aWMgaW50IGNsZWFyX3BhZ2VfcHJlc2VuY2Uoc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKmYsIGJvb2wgY2xlYXIpCiB7CiAJdW5zaWduZWQgaW50IGxldmVsOwotCXB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyLCAmbGV2ZWwpOworCXB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhmLT5wYWdlLCAmbGV2ZWwpOwogCiAJaWYgKCFwdGUpIHsKLQkJcHJfZXJyKCJrbW1pbzogbm8gcHRlIGZvciBwYWdlIDB4JTA4bHhcbiIsIGFkZHIpOworCQlwcl9lcnIoImttbWlvOiBubyBwdGUgZm9yIHBhZ2UgMHglMDhseFxuIiwgZi0+cGFnZSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBQR19MRVZFTF8yTToKLQkJc2V0X3BtZF9wcmVzZW5jZSgocG1kX3QgKilwdGUsIHByZXNlbnQsIG9sZCk7CisJCWNsZWFyX3BtZF9wcmVzZW5jZSgocG1kX3QgKilwdGUsIGNsZWFyLCAmZi0+b2xkX3ByZXNlbmNlKTsKIAkJYnJlYWs7CiAJY2FzZSBQR19MRVZFTF80SzoKLQkJc2V0X3B0ZV9wcmVzZW5jZShwdGUsIHByZXNlbnQsIG9sZCk7CisJCWNsZWFyX3B0ZV9wcmVzZW5jZShwdGUsIGNsZWFyLCAmZi0+b2xkX3ByZXNlbmNlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJrbW1pbzogdW5leHBlY3RlZCBwYWdlIGxldmVsIDB4JXguXG4iLCBsZXZlbCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlfX2ZsdXNoX3RsYl9vbmUoYWRkcik7CisJX19mbHVzaF90bGJfb25lKGYtPnBhZ2UpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzEsOSArMTczLDkgQEAKIAlXQVJOX09OQ0UoZi0+YXJtZWQsIEtFUk5fRVJSICJrbW1pbyBwYWdlIGFscmVhZHkgYXJtZWQuXG4iKTsKIAlpZiAoZi0+YXJtZWQpIHsKIAkJcHJfd2FybmluZygia21taW8gZG91YmxlLWFybTogcGFnZSAweCUwOGx4LCByZWYgJWQsIG9sZCAlZFxuIiwKLQkJCQkJZi0+cGFnZSwgZi0+Y291bnQsIGYtPm9sZF9wcmVzZW5jZSk7CisJCQkJCWYtPnBhZ2UsIGYtPmNvdW50LCAhIWYtPm9sZF9wcmVzZW5jZSk7CiAJfQotCXJldCA9IHNldF9wYWdlX3ByZXNlbmNlKGYtPnBhZ2UsIGZhbHNlLCAmZi0+b2xkX3ByZXNlbmNlKTsKKwlyZXQgPSBjbGVhcl9wYWdlX3ByZXNlbmNlKGYsIHRydWUpOwogCVdBUk5fT05DRShyZXQgPCAwLCBLRVJOX0VSUiAia21taW8gYXJtaW5nIDB4JTA4bHggZmFpbGVkLlxuIiwgZi0+cGFnZSk7CiAJZi0+YXJtZWQgPSB0cnVlOwogCXJldHVybiByZXQ7CkBAIC0xODIsOCArMTg0LDcgQEAKIC8qKiBSZXN0b3JlIHRoZSBnaXZlbiBwYWdlIHRvIHNhdmVkIHByZXNlbmNlIHN0YXRlLiAqLwogc3RhdGljIHZvaWQgZGlzYXJtX2ttbWlvX2ZhdWx0X3BhZ2Uoc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKmYpCiB7Ci0JYm9vbCB0bXA7Ci0JaW50IHJldCA9IHNldF9wYWdlX3ByZXNlbmNlKGYtPnBhZ2UsIGYtPm9sZF9wcmVzZW5jZSwgJnRtcCk7CisJaW50IHJldCA9IGNsZWFyX3BhZ2VfcHJlc2VuY2UoZiwgZmFsc2UpOwogCVdBUk5fT05DRShyZXQgPCAwLAogCQkJS0VSTl9FUlIgImttbWlvIGRpc2FybWluZyAweCUwOGx4IGZhaWxlZC5cbiIsIGYtPnBhZ2UpOwogCWYtPmFybWVkID0gZmFsc2U7CkBAIC0zMTAsNyArMzExLDEyIEBACiAJc3RydWN0IGttbWlvX2NvbnRleHQgKmN0eCA9ICZnZXRfY3B1X3ZhcihrbW1pb19jdHgpOwogCiAJaWYgKCFjdHgtPmFjdGl2ZSkgewotCQlwcl9kZWJ1Zygia21taW86IHNwdXJpb3VzIGRlYnVnIHRyYXAgb24gQ1BVICVkLlxuIiwKKwkJLyoKKwkJICogZGVidWcgdHJhcHMgd2l0aG91dCBhbiBhY3RpdmUgY29udGV4dCBhcmUgZHVlIHRvIGVpdGhlcgorCQkgKiBzb21ldGhpbmcgZXh0ZXJuYWwgY2F1c2luZyB0aGVtIChmLmUuIHVzaW5nIGEgZGVidWdnZXIgd2hpbGUKKwkJICogbW1pbyB0cmFjaW5nIGVuYWJsZWQpLCBvciBlcnJvbmVvdXMgYmVoYXZpb3VyCisJCSAqLworCQlwcl93YXJuaW5nKCJrbW1pbzogdW5leHBlY3RlZCBkZWJ1ZyB0cmFwIG9uIENQVSAlZC5cbiIsCiAJCQkJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDM5LDEyICs0NDUsMTIgQEAKIAkJCQkJCWhlYWQsCiAJCQkJCQlzdHJ1Y3Qga21taW9fZGVsYXllZF9yZWxlYXNlLAogCQkJCQkJcmN1KTsKLQlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqcCA9IGRyLT5yZWxlYXNlX2xpc3Q7Ci0Jd2hpbGUgKHApIHsKLQkJc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKm5leHQgPSBwLT5yZWxlYXNlX25leHQ7Ci0JCUJVR19PTihwLT5jb3VudCk7Ci0JCWtmcmVlKHApOwotCQlwID0gbmV4dDsKKwlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqZiA9IGRyLT5yZWxlYXNlX2xpc3Q7CisJd2hpbGUgKGYpIHsKKwkJc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKm5leHQgPSBmLT5yZWxlYXNlX25leHQ7CisJCUJVR19PTihmLT5jb3VudCk7CisJCWtmcmVlKGYpOworCQlmID0gbmV4dDsKIAl9CiAJa2ZyZWUoZHIpOwogfQpAQCAtNDUzLDE5ICs0NTksMTkgQEAKIHsKIAlzdHJ1Y3Qga21taW9fZGVsYXllZF9yZWxlYXNlICpkciA9CiAJCWNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3Qga21taW9fZGVsYXllZF9yZWxlYXNlLCByY3UpOwotCXN0cnVjdCBrbW1pb19mYXVsdF9wYWdlICpwID0gZHItPnJlbGVhc2VfbGlzdDsKKwlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqZiA9IGRyLT5yZWxlYXNlX2xpc3Q7CiAJc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKipwcmV2cCA9ICZkci0+cmVsZWFzZV9saXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgma21taW9fbG9jaywgZmxhZ3MpOwotCXdoaWxlIChwKSB7Ci0JCWlmICghcC0+Y291bnQpIHsKLQkJCWxpc3RfZGVsX3JjdSgmcC0+bGlzdCk7Ci0JCQlwcmV2cCA9ICZwLT5yZWxlYXNlX25leHQ7CisJd2hpbGUgKGYpIHsKKwkJaWYgKCFmLT5jb3VudCkgeworCQkJbGlzdF9kZWxfcmN1KCZmLT5saXN0KTsKKwkJCXByZXZwID0gJmYtPnJlbGVhc2VfbmV4dDsKIAkJfSBlbHNlIHsKLQkJCSpwcmV2cCA9IHAtPnJlbGVhc2VfbmV4dDsKKwkJCSpwcmV2cCA9IGYtPnJlbGVhc2VfbmV4dDsKIAkJfQotCQlwID0gcC0+cmVsZWFzZV9uZXh0OworCQlmID0gZi0+cmVsZWFzZV9uZXh0OwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrbW1pb19sb2NrLCBmbGFncyk7CiAKQEAgLTUyOCw4ICs1MzQsOCBAQAogfQogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2ttbWlvX3Byb2JlKTsKIAotc3RhdGljIGludCBrbW1pb19kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCi0JCQkJCQkJCXZvaWQgKmFyZ3MpCitzdGF0aWMgaW50CitrbW1pb19kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmFyZ3MpCiB7CiAJc3RydWN0IGRpZV9hcmdzICphcmcgPSBhcmdzOwogCkBAIC01NDQsMTEgKzU1MCwyMyBAQAogCS5ub3RpZmllcl9jYWxsID0ga21taW9fZGllX25vdGlmaWVyCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2ttbWlvKHZvaWQpCitpbnQga21taW9faW5pdCh2b2lkKQogewogCWludCBpOworCiAJZm9yIChpID0gMDsgaSA8IEtNTUlPX1BBR0VfVEFCTEVfU0laRTsgaSsrKQogCQlJTklUX0xJU1RfSEVBRCgma21taW9fcGFnZV90YWJsZVtpXSk7CisKIAlyZXR1cm4gcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZuYl9kaWUpOwogfQotZnNfaW5pdGNhbGwoaW5pdF9rbW1pbyk7IC8qIHNob3VsZCBiZSBiZWZvcmUgZGV2aWNlX2luaXRjYWxsKCkgKi8KKwordm9pZCBrbW1pb19jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmbmJfZGllKTsKKwlmb3IgKGkgPSAwOyBpIDwgS01NSU9fUEFHRV9UQUJMRV9TSVpFOyBpKyspIHsKKwkJV0FSTl9PTkNFKCFsaXN0X2VtcHR5KCZrbW1pb19wYWdlX3RhYmxlW2ldKSwKKwkJCUtFUk5fRVJSICJrbW1pb19wYWdlX3RhYmxlIG5vdCBlbXB0eSBhdCBjbGVhbnVwLCBhbnkgZnVydGhlciB0cmFjaW5nIHdpbGwgbGVhayBtZW1vcnkuXG4iKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9tZW10ZXN0LmMgYi9hcmNoL3g4Ni9tbS9tZW10ZXN0LmMKaW5kZXggNjA1YzhiZS4uMThkMjQ0ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbWVtdGVzdC5jCisrKyBiL2FyY2gveDg2L21tL21lbXRlc3QuYwpAQCAtNDAsMjMgKzQwLDIyIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtZW10ZXN0KHU2NCBwYXR0ZXJuLCB1NjQgc3RhcnRfcGh5cywgdTY0IHNpemUpCiB7Ci0JdTY0IGksIGNvdW50OwotCXU2NCAqc3RhcnQ7CisJdTY0ICpwLCAqc3RhcnQsICplbmQ7CiAJdTY0IHN0YXJ0X2JhZCwgbGFzdF9iYWQ7CiAJdTY0IHN0YXJ0X3BoeXNfYWxpZ25lZDsKLQlzaXplX3QgaW5jcjsKKwljb25zdCBzaXplX3QgaW5jciA9IHNpemVvZihwYXR0ZXJuKTsKIAotCWluY3IgPSBzaXplb2YocGF0dGVybik7CiAJc3RhcnRfcGh5c19hbGlnbmVkID0gQUxJR04oc3RhcnRfcGh5cywgaW5jcik7Ci0JY291bnQgPSAoc2l6ZSAtIChzdGFydF9waHlzX2FsaWduZWQgLSBzdGFydF9waHlzKSkvaW5jcjsKIAlzdGFydCA9IF9fdmEoc3RhcnRfcGh5c19hbGlnbmVkKTsKKwllbmQgPSBzdGFydCArIChzaXplIC0gKHN0YXJ0X3BoeXNfYWxpZ25lZCAtIHN0YXJ0X3BoeXMpKSAvIGluY3I7CiAJc3RhcnRfYmFkID0gMDsKIAlsYXN0X2JhZCA9IDA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJc3RhcnRbaV0gPSBwYXR0ZXJuOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBzdGFydCsrLCBzdGFydF9waHlzX2FsaWduZWQgKz0gaW5jcikgewotCQlpZiAoKnN0YXJ0ID09IHBhdHRlcm4pCisJZm9yIChwID0gc3RhcnQ7IHAgPCBlbmQ7IHArKykKKwkJKnAgPSBwYXR0ZXJuOworCisJZm9yIChwID0gc3RhcnQ7IHAgPCBlbmQ7IHArKywgc3RhcnRfcGh5c19hbGlnbmVkICs9IGluY3IpIHsKKwkJaWYgKCpwID09IHBhdHRlcm4pCiAJCQljb250aW51ZTsKIAkJaWYgKHN0YXJ0X3BoeXNfYWxpZ25lZCA9PSBsYXN0X2JhZCArIGluY3IpIHsKIAkJCWxhc3RfYmFkICs9IGluY3I7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9tbWlvLW1vZC5jIGIvYXJjaC94ODYvbW0vbW1pby1tb2QuYwppbmRleCBjOTM0MmVkLi4xMzI3NzJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9tbWlvLW1vZC5jCisrKyBiL2FyY2gveDg2L21tL21taW8tbW9kLmMKQEAgLTQ1MSw2ICs0NTEsNyBAQAogCiAJaWYgKG5vbW1pb3RyYWNlKQogCQlwcl9pbmZvKE5BTUUgIk1NSU8gdHJhY2luZyBkaXNhYmxlZC5cbiIpOworCWttbWlvX2luaXQoKTsKIAllbnRlcl91bmlwcm9jZXNzb3IoKTsKIAlzcGluX2xvY2tfaXJxKCZ0cmFjZV9sb2NrKTsKIAlhdG9taWNfaW5jKCZtbWlvdHJhY2VfZW5hYmxlZCk7CkBAIC00NzMsNiArNDc0LDcgQEAKIAogCWNsZWFyX3RyYWNlX2xpc3QoKTsgLyogZ3VhcmFudGVlczogbm8gbW9yZSBrbW1pbyBjYWxsYmFja3MgKi8KIAlsZWF2ZV91bmlwcm9jZXNzb3IoKTsKKwlrbW1pb19jbGVhbnVwKCk7CiAJcHJfaW5mbyhOQU1FICJkaXNhYmxlZC5cbiIpOwogb3V0OgogCW11dGV4X3VubG9jaygmbW1pb3RyYWNlX211dGV4KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWFfNjQuYyBiL2FyY2gveDg2L21tL251bWFfNjQuYwppbmRleCAyZDA1YTEyLi40NTk5MTNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hXzY0LmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYV82NC5jCkBAIC0xNzksMTggKzE3OSwyNSBAQAogfQogCiAvKiBJbml0aWFsaXplIGJvb3RtZW0gYWxsb2NhdG9yIGZvciBhIG5vZGUgKi8KLXZvaWQgX19pbml0IHNldHVwX25vZGVfYm9vdG1lbShpbnQgbm9kZWlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQordm9pZCBfX2luaXQKK3NldHVwX25vZGVfYm9vdG1lbShpbnQgbm9kZWlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgbGFzdF9wZm4sIGJvb3RtYXBfcGFnZXMsIGJvb3RtYXBfc2l6ZTsKKwljb25zdCBpbnQgcGdkYXRfc2l6ZSA9IHJvdW5kdXAoc2l6ZW9mKHBnX2RhdGFfdCksIFBBR0VfU0laRSk7CiAJdW5zaWduZWQgbG9uZyBib290bWFwX3N0YXJ0LCBub2RlZGF0YV9waHlzOwogCXZvaWQgKmJvb3RtYXA7Ci0JY29uc3QgaW50IHBnZGF0X3NpemUgPSByb3VuZHVwKHNpemVvZihwZ19kYXRhX3QpLCBQQUdFX1NJWkUpOwogCWludCBuaWQ7CiAKIAlpZiAoIWVuZCkKIAkJcmV0dXJuOwogCisJLyoKKwkgKiBEb24ndCBjb25mdXNlIFZNIHdpdGggYSBub2RlIHRoYXQgZG9lc24ndCBoYXZlIHRoZQorCSAqIG1pbmltdW0gYW1vdW50IG9mIG1lbW9yeToKKwkgKi8KKwlpZiAoZW5kICYmIChlbmQgLSBzdGFydCkgPCBOT0RFX01JTl9TSVpFKQorCQlyZXR1cm47CisKIAlzdGFydCA9IHJvdW5kdXAoc3RhcnQsIFpPTkVfQUxJR04pOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiQm9vdG1lbSBzZXR1cCBub2RlICVkICUwMTZseC0lMDE2bHhcbiIsIG5vZGVpZCwKQEAgLTI3Miw5ICsyNzksNiBAQAogCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZWlkKSwgYm9vdG1hcF9zdGFydCwKIAkJCQkgYm9vdG1hcF9wYWdlczw8UEFHRV9TSElGVCwgQk9PVE1FTV9ERUZBVUxUKTsKIAotI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKLQlzcmF0X3Jlc2VydmVfYWRkX2FyZWEobm9kZWlkKTsKLSNlbmRpZgogCW5vZGVfc2V0X29ubGluZShub2RlaWQpOwogfQogCkBAIC01NzgsMjEgKzU4Miw2IEBACiAJcmV0dXJuIHBhZ2VzOwogfQogCi12b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwotCi0JbWVtc2V0KG1heF96b25lX3BmbnMsIDAsIHNpemVvZihtYXhfem9uZV9wZm5zKSk7Ci0JbWF4X3pvbmVfcGZuc1taT05FX0RNQV0gPSBNQVhfRE1BX1BGTjsKLQltYXhfem9uZV9wZm5zW1pPTkVfRE1BMzJdID0gTUFYX0RNQTMyX1BGTjsKLQltYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA9IG1heF9wZm47Ci0KLQlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucyhNQVhfTlVNTk9ERVMpOwotCXNwYXJzZV9pbml0KCk7Ci0KLQlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKLX0KLQogc3RhdGljIF9faW5pdCBpbnQgbnVtYV9zZXR1cChjaGFyICpvcHQpCiB7CiAJaWYgKCFvcHQpCkBAIC02MDYsOCArNTk1LDYgQEAKICNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCiAJaWYgKCFzdHJuY21wKG9wdCwgIm5vYWNwaSIsIDYpKQogCQlhY3BpX251bWEgPSAtMTsKLQlpZiAoIXN0cm5jbXAob3B0LCAiaG90YWRkPSIsIDcpKQotCQlob3RhZGRfcGVyY2VudCA9IHNpbXBsZV9zdHJ0b3VsKG9wdCs3LCBOVUxMLCAxMCk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCmluZGV4IGUxN2VmZWQuLjZjZTk1MTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC94ODYvbW0vcGFnZWF0dHIuYwpAQCAtODM5LDEzICs4MzksNiBAQAogCiAJdm1fdW5tYXBfYWxpYXNlcygpOwogCi0JLyoKLQkgKiBJZiB3ZSdyZSBjYWxsZWQgd2l0aCBsYXp5IG1tdSB1cGRhdGVzIGVuYWJsZWQsIHRoZQotCSAqIGluLW1lbW9yeSBwdGUgc3RhdGUgbWF5IGJlIHN0YWxlLiAgRmx1c2ggcGVuZGluZyB1cGRhdGVzIHRvCi0JICogYnJpbmcgdGhlbSB1cCB0byBkYXRlLgotCSAqLwotCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwotCiAJY3BhLnZhZGRyID0gYWRkcjsKIAljcGEucGFnZXMgPSBwYWdlczsKIAljcGEubnVtcGFnZXMgPSBudW1wYWdlczsKQEAgLTg5MCwxMyArODgzLDYgQEAKIAl9IGVsc2UKIAkJY3BhX2ZsdXNoX2FsbChjYWNoZSk7CiAKLQkvKgotCSAqIElmIHdlJ3ZlIGJlZW4gY2FsbGVkIHdpdGggbGF6eSBtbXUgdXBkYXRlcyBlbmFibGVkLCB0aGVuCi0JICogbWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyBnZXRzIGZsdXNoZWQgb3V0IGJlZm9yZSB3ZQotCSAqIHJldHVybi4KLQkgKi8KLQlhcmNoX2ZsdXNoX2xhenlfbW11X21vZGUoKTsKLQogb3V0OgogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9zcmF0XzY0LmMgYi9hcmNoL3g4Ni9tbS9zcmF0XzY0LmMKaW5kZXggMDE3NjU5NS4uMmRmY2JmOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vc3JhdF82NC5jCisrKyBiL2FyY2gveDg2L21tL3NyYXRfNjQuYwpAQCAtMzEsMTcgKzMxLDExIEBACiBzdGF0aWMgbm9kZW1hc2tfdCBjcHVfbm9kZXNfcGFyc2VkIF9faW5pdGRhdGE7CiBzdGF0aWMgc3RydWN0IGJvb3Rub2RlIG5vZGVzW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKIHN0YXRpYyBzdHJ1Y3QgYm9vdG5vZGUgbm9kZXNfYWRkW01BWF9OVU1OT0RFU107Ci1zdGF0aWMgaW50IGZvdW5kX2FkZF9hcmVhIF9faW5pdGRhdGE7Ci1pbnQgaG90YWRkX3BlcmNlbnQgX19pbml0ZGF0YSA9IDA7CiAKIHN0YXRpYyBpbnQgbnVtX25vZGVfbWVtYmxrcyBfX2luaXRkYXRhOwogc3RhdGljIHN0cnVjdCBib290bm9kZSBub2RlX21lbWJsa19yYW5nZVtOUl9OT0RFX01FTUJMS1NdIF9faW5pdGRhdGE7CiBzdGF0aWMgaW50IG1lbWJsa19ub2RlaWRbTlJfTk9ERV9NRU1CTEtTXSBfX2luaXRkYXRhOwogCi0vKiBUb28gc21hbGwgbm9kZXMgY29uZnVzZSB0aGUgVk0gYmFkbHkuIFVzdWFsbHkgdGhleSByZXN1bHQKLSAgIGZyb20gQklPUyBidWdzLiAqLwotI2RlZmluZSBOT0RFX01JTl9TSVpFICg0KjEwMjQqMTAyNCkKLQogc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm9kZShpbnQgcHhtKQogewogCXJldHVybiBhY3BpX21hcF9weG1fdG9fbm9kZShweG0pOwpAQCAtNjYsOSArNjAsNiBAQAogewogCXN0cnVjdCBib290bm9kZSAqbmQgPSAmbm9kZXNbaV07CiAKLQlpZiAoZm91bmRfYWRkX2FyZWEpCi0JCXJldHVybjsKLQogCWlmIChuZC0+c3RhcnQgPCBzdGFydCkgewogCQluZC0+c3RhcnQgPSBzdGFydDsKIAkJaWYgKG5kLT5lbmQgPCBuZC0+c3RhcnQpCkBAIC04Niw3ICs3Nyw2IEBACiAJaW50IGk7CiAJcHJpbnRrKEtFUk5fRVJSICJTUkFUOiBTUkFUIG5vdCB1c2VkLlxuIik7CiAJYWNwaV9udW1hID0gLTE7Ci0JZm91bmRfYWRkX2FyZWEgPSAwOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9DQUxfQVBJQzsgaSsrKQogCQlhcGljaWRfdG9fbm9kZVtpXSA9IE5VTUFfTk9fTk9ERTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspCkBAIC0xODIsMjQgKzE3MiwyMSBAQAogCSAgICAgICBweG0sIGFwaWNfaWQsIG5vZGUpOwogfQogCi1zdGF0aWMgaW50IHVwZGF0ZV9lbmRfb2ZfbWVtb3J5KHVuc2lnbmVkIGxvbmcgZW5kKSB7cmV0dXJuIC0xO30KLXN0YXRpYyBpbnQgaG90YWRkX2Vub3VnaF9tZW1vcnkoc3RydWN0IGJvb3Rub2RlICpuZCkge3JldHVybiAxO30KICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFCiBzdGF0aWMgaW5saW5lIGludCBzYXZlX2FkZF9pbmZvKHZvaWQpIHtyZXR1cm4gMTt9CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgc2F2ZV9hZGRfaW5mbyh2b2lkKSB7cmV0dXJuIDA7fQogI2VuZGlmCiAvKgotICogVXBkYXRlIG5vZGVzX2FkZCBhbmQgZGVjaWRlIGlmIHRvIGluY2x1ZGUgYWRkIGFyZSBpbiB0aGUgem9uZS4KLSAqIEJvdGggU1BBUlNFIGFuZCBSRVNFUlZFIG5lZWQgbm9kZXNfYWRkIGluZm9ybWF0aW9uLgotICogVGhpcyBjb2RlIHN1cHBvcnRzIG9uZSBjb250aWd1b3VzIGhvdCBhZGQgYXJlYSBwZXIgbm9kZS4KKyAqIFVwZGF0ZSBub2Rlc19hZGRbXQorICogVGhpcyBjb2RlIHN1cHBvcnRzIG9uZSBjb250aWd1b3VzIGhvdCBhZGQgYXJlYSBwZXIgbm9kZQogICovCi1zdGF0aWMgaW50IF9faW5pdAotcmVzZXJ2ZV9ob3RhZGQoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQorc3RhdGljIHZvaWQgX19pbml0Cit1cGRhdGVfbm9kZXNfYWRkKGludCBub2RlLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNfcGZuID0gc3RhcnQgPj4gUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIGVfcGZuID0gZW5kID4+IFBBR0VfU0hJRlQ7Ci0JaW50IHJldCA9IDAsIGNoYW5nZWQgPSAwOworCWludCBjaGFuZ2VkID0gMDsKIAlzdHJ1Y3QgYm9vdG5vZGUgKm5kID0gJm5vZGVzX2FkZFtub2RlXTsKIAogCS8qIEkgaGFkIHNvbWUgdHJvdWJsZSB3aXRoIHN0cmFuZ2UgbWVtb3J5IGhvdGFkZCByZWdpb25zIGJyZWFraW5nCkBAIC0yMTAsNyArMTk3LDcgQEAKIAkgICBtaXN0YWtlcyAqLwogCWlmICgoc2lnbmVkIGxvbmcpKGVuZCAtIHN0YXJ0KSA8IE5PREVfTUlOX1NJWkUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTUkFUOiBIb3RwbHVnIGFyZWEgdG9vIHNtYWxsXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm47CiAJfQogCiAJLyogVGhpcyBjaGVjayBtaWdodCBiZSBhIGJpdCB0b28gc3RyaWN0LCBidXQgSSdtIGtlZXBpbmcgaXQgZm9yIG5vdy4gKi8KQEAgLTIxOCwxMiArMjA1LDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSCiAJCQkiU1JBVDogSG90cGx1ZyBhcmVhICVsdSAtPiAlbHUgaGFzIGV4aXN0aW5nIG1lbW9yeVxuIiwKIAkJCXNfcGZuLCBlX3Bmbik7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlpZiAoIWhvdGFkZF9lbm91Z2hfbWVtb3J5KCZub2Rlc19hZGRbbm9kZV0pKSAgewotCQlwcmludGsoS0VSTl9FUlIgIlNSQVQ6IEhvdHBsdWcgYXJlYSB0b28gbGFyZ2VcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybjsKIAl9CiAKIAkvKiBMb29rcyBnb29kICovCkBAIC0yNDUsMTEgKzIyNyw5IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIlNSQVQ6IEhvdHBsdWcgem9uZSBub3QgY29udGludW91cy4gUGFydGx5IGlnbm9yZWRcbiIpOwogCX0KIAotCXJldCA9IHVwZGF0ZV9lbmRfb2ZfbWVtb3J5KG5kLT5lbmQpOwotCiAJaWYgKGNoYW5nZWQpCi0JIAlwcmludGsoS0VSTl9JTkZPICJTUkFUOiBob3QgcGx1ZyB6b25lIGZvdW5kICVMeCAtICVMeFxuIiwgbmQtPnN0YXJ0LCBuZC0+ZW5kKTsKLQlyZXR1cm4gcmV0OworCQlwcmludGsoS0VSTl9JTkZPICJTUkFUOiBob3QgcGx1ZyB6b25lIGZvdW5kICVMeCAtICVMeFxuIiwKKwkJCQkgbmQtPnN0YXJ0LCBuZC0+ZW5kKTsKIH0KIAogLyogQ2FsbGJhY2sgZm9yIHBhcnNpbmcgb2YgdGhlIFByb3hpbWl0eSBEb21haW4gPC0+IE1lbW9yeSBBcmVhIG1hcHBpbmdzICovCkBAIC0zMTAsMTMgKzI5MCwxMCBAQAogCSAgICAgICBzdGFydCwgZW5kKTsKIAllODIwX3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKG5vZGUsIHN0YXJ0ID4+IFBBR0VfU0hJRlQsCiAJCQkJICAgICBlbmQgPj4gUEFHRV9TSElGVCk7Ci0JcHVzaF9ub2RlX2JvdW5kYXJpZXMobm9kZSwgbmQtPnN0YXJ0ID4+IFBBR0VfU0hJRlQsCi0JCQkJCQluZC0+ZW5kID4+IFBBR0VfU0hJRlQpOwogCi0JaWYgKChtYS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfTUVNX0hPVF9QTFVHR0FCTEUpICYmCi0JICAgIChyZXNlcnZlX2hvdGFkZChub2RlLCBzdGFydCwgZW5kKSA8IDApKSB7Ci0JCS8qIElnbm9yZSBob3RhZGQgcmVnaW9uLiBVbmRvIGRhbWFnZSAqLwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlNSQVQ6IEhvdHBsdWcgcmVnaW9uIGlnbm9yZWRcbiIpOworCWlmIChtYS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfTUVNX0hPVF9QTFVHR0FCTEUpIHsKKwkJdXBkYXRlX25vZGVzX2FkZChub2RlLCBzdGFydCwgZW5kKTsKKwkJLyogcmVzdG9yZSBub2Rlc1tub2RlXSAqLwogCQkqbmQgPSBvbGRub2RlOwogCQlpZiAoKG5kLT5zdGFydCB8IG5kLT5lbmQpID09IDApCiAJCQlub2RlX2NsZWFyKG5vZGUsIG5vZGVzX3BhcnNlZCk7CkBAIC0zNDUsOSArMzIyLDkgQEAKIAkJCXB4bXJhbSA9IDA7CiAJfQogCi0JZTgyMHJhbSA9IG1heF9wZm4gLSBhYnNlbnRfcGFnZXNfaW5fcmFuZ2UoMCwgbWF4X3Bmbik7Ci0JLyogV2Ugc2VlbSB0byBsb3NlIDMgcGFnZXMgc29tZXdoZXJlLiBBbGxvdyBhIGJpdCBvZiBzbGFjay4gKi8KLQlpZiAoKGxvbmcpKGU4MjByYW0gLSBweG1yYW0pID49IDEqMTAyNCoxMDI0KSB7CisJZTgyMHJhbSA9IG1heF9wZm4gLSAoZTgyMF9ob2xlX3NpemUoMCwgbWF4X3Bmbjw8UEFHRV9TSElGVCk+PlBBR0VfU0hJRlQpOworCS8qIFdlIHNlZW0gdG8gbG9zZSAzIHBhZ2VzIHNvbWV3aGVyZS4gQWxsb3cgMU0gb2Ygc2xhY2suICovCisJaWYgKChsb25nKShlODIwcmFtIC0gcHhtcmFtKSA+PSAoMTw8KDIwIC0gUEFHRV9TSElGVCkpKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCSJTUkFUOiBQWE1zIG9ubHkgY292ZXIgJWx1TUIgb2YgeW91ciAlbHVNQiBlODIwIFJBTS4gTm90IHVzZWQuXG4iLAogCQkJKHB4bXJhbSA8PCBQQUdFX1NISUZUKSA+PiAyMCwKQEAgLTM1NywxNyArMzM0LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHVucGFyc2Vfbm9kZShpbnQgbm9kZSkKLXsKLQlpbnQgaTsKLQlub2RlX2NsZWFyKG5vZGUsIG5vZGVzX3BhcnNlZCk7Ci0Jbm9kZV9jbGVhcihub2RlLCBjcHVfbm9kZXNfcGFyc2VkKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xPQ0FMX0FQSUM7IGkrKykgewotCQlpZiAoYXBpY2lkX3RvX25vZGVbaV0gPT0gbm9kZSkKLQkJCWFwaWNpZF90b19ub2RlW2ldID0gTlVNQV9OT19OT0RFOwotCX0KLX0KLQogdm9pZCBfX2luaXQgYWNwaV9udW1hX2FyY2hfZml4dXAodm9pZCkge30KIAogLyogVXNlIHRoZSBpbmZvcm1hdGlvbiBkaXNjb3ZlcmVkIGFib3ZlIHRvIGFjdHVhbGx5IHNldCB1cCB0aGUgbm9kZXMuICovCkBAIC0zNzksMTggKzM0NSw4IEBACiAJCXJldHVybiAtMTsKIAogCS8qIEZpcnN0IGNsZWFuIHVwIHRoZSBub2RlIGxpc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspCiAJCWN1dG9mZl9ub2RlKGksIHN0YXJ0LCBlbmQpOwotCQkvKgotCQkgKiBkb24ndCBjb25mdXNlIFZNIHdpdGggYSBub2RlIHRoYXQgZG9lc24ndCBoYXZlIHRoZQotCQkgKiBtaW5pbXVtIG1lbW9yeS4KLQkJICovCi0JCWlmIChub2Rlc1tpXS5lbmQgJiYKLQkJCShub2Rlc1tpXS5lbmQgLSBub2Rlc1tpXS5zdGFydCkgPCBOT0RFX01JTl9TSVpFKSB7Ci0JCQl1bnBhcnNlX25vZGUoaSk7Ci0JCQlub2RlX3NldF9vZmZsaW5lKGkpOwotCQl9Ci0JfQogCiAJaWYgKCFub2Rlc19jb3Zlcl9tZW1vcnkobm9kZXMpKSB7CiAJCWJhZF9zcmF0KCk7CkBAIC00MjMsNyArMzc5LDcgQEAKIAogCQlpZiAobm9kZSA9PSBOVU1BX05PX05PREUpCiAJCQljb250aW51ZTsKLQkJaWYgKCFub2RlX2lzc2V0KG5vZGUsIG5vZGVfcG9zc2libGVfbWFwKSkKKwkJaWYgKCFub2RlX29ubGluZShub2RlKSkKIAkJCW51bWFfY2xlYXJfbm9kZShpKTsKIAl9CiAJbnVtYV9pbml0X2FycmF5KCk7CkBAIC01MTAsMjYgKzQ2Niw2IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX05VTUFfRU1VICovCiAKLXZvaWQgX19pbml0IHNyYXRfcmVzZXJ2ZV9hZGRfYXJlYShpbnQgbm9kZWlkKQotewotCWlmIChmb3VuZF9hZGRfYXJlYSAmJiBub2Rlc19hZGRbbm9kZWlkXS5lbmQpIHsKLQkJdTY0IHRvdGFsX21iOwotCi0JCXByaW50ayhLRVJOX0lORk8gIlNSQVQ6IFJlc2VydmluZyBob3QtYWRkIG1lbW9yeSBzcGFjZSAiCi0JCQkJImZvciBub2RlICVkIGF0ICVMeC0lTHhcbiIsCi0JCQlub2RlaWQsIG5vZGVzX2FkZFtub2RlaWRdLnN0YXJ0LCBub2Rlc19hZGRbbm9kZWlkXS5lbmQpOwotCQl0b3RhbF9tYiA9IChub2Rlc19hZGRbbm9kZWlkXS5lbmQgLSBub2Rlc19hZGRbbm9kZWlkXS5zdGFydCkKLQkJCQkJPj4gUEFHRV9TSElGVDsKLQkJdG90YWxfbWIgKj0gc2l6ZW9mKHN0cnVjdCBwYWdlKTsKLQkJdG90YWxfbWIgPj49IDIwOwotCQlwcmludGsoS0VSTl9JTkZPICJTUkFUOiBUaGlzIHdpbGwgY29zdCB5b3UgJUx1IE1CIG9mICIKLQkJCQkicHJlLWFsbG9jYXRlZCBtZW1vcnkuXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXRvdGFsX21iKTsKLQkJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGVpZCksIG5vZGVzX2FkZFtub2RlaWRdLnN0YXJ0LAotCQkJICAgICAgIG5vZGVzX2FkZFtub2RlaWRdLmVuZCAtIG5vZGVzX2FkZFtub2RlaWRdLnN0YXJ0LAotCQkJICAgICAgIEJPT1RNRU1fREVGQVVMVCk7Ci0JfQotfQotCiBpbnQgX19ub2RlX2Rpc3RhbmNlKGludCBhLCBpbnQgYikKIHsKIAlpbnQgaW5kZXg7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKaW5kZXggMjAyODY0YS4uYjA3ZGQ4ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwpAQCAtNDAsOCArNDAsOSBAQAogCiAJc3dpdGNoICh2YWwpIHsKIAljYXNlIERJRV9OTUk6Ci0JCWlmIChtb2RlbC0+Y2hlY2tfY3RycyhhcmdzLT5yZWdzLCAmcGVyX2NwdShjcHVfbXNycywgY3B1KSkpCi0JCQlyZXQgPSBOT1RJRllfU1RPUDsKKwljYXNlIERJRV9OTUlfSVBJOgorCQltb2RlbC0+Y2hlY2tfY3RycyhhcmdzLT5yZWdzLCAmcGVyX2NwdShjcHVfbXNycywgY3B1KSk7CisJCXJldCA9IE5PVElGWV9TVE9QOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTEzNCw3ICsxMzUsNyBAQAogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwcm9maWxlX2V4Y2VwdGlvbnNfbmIgPSB7CiAJLm5vdGlmaWVyX2NhbGwgPSBwcm9maWxlX2V4Y2VwdGlvbnNfbm90aWZ5LAogCS5uZXh0ID0gTlVMTCwKLQkucHJpb3JpdHkgPSAwCisJLnByaW9yaXR5ID0gMgogfTsKIAogc3RhdGljIGludCBubWlfc2V0dXAodm9pZCkKQEAgLTM1NiwxNCArMzU3LDExIEBACiAjZGVmaW5lIGV4aXRfc3lzZnMoKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLXN0YXRpYyBpbnQgcDRmb3JjZTsKLW1vZHVsZV9wYXJhbShwNGZvcmNlLCBpbnQsIDApOwotCiBzdGF0aWMgaW50IF9faW5pdCBwNF9pbml0KGNoYXIgKipjcHVfdHlwZSkKIHsKIAlfX3U4IGNwdV9tb2RlbCA9IGJvb3RfY3B1X2RhdGEueDg2X21vZGVsOwogCi0JaWYgKCFwNGZvcmNlICYmIChjcHVfbW9kZWwgPiA2IHx8IGNwdV9tb2RlbCA9PSA1KSkKKwlpZiAoY3B1X21vZGVsID4gNiB8fCBjcHVfbW9kZWwgPT0gNSkKIAkJcmV0dXJuIDA7CiAKICNpZm5kZWYgQ09ORklHX1NNUApAQCAtMzg5LDEwICszODcsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmb3JjZV9hcmNoX3BlcmZtb247CitzdGF0aWMgaW50IGZvcmNlX2NwdV90eXBlKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJaWYgKCFzdHJjbXAoc3RyLCAiYXJjaHBlcmZtb24iKSkgeworCQlmb3JjZV9hcmNoX3BlcmZtb24gPSAxOworCQlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogZm9yY2luZyBhcmNoaXRlY3R1cmFsIHBlcmZtb25cbiIpOworCX0KKworCXJldHVybiAwOworfQorbW9kdWxlX3BhcmFtX2NhbGwoY3B1X3R5cGUsIGZvcmNlX2NwdV90eXBlLCBOVUxMLCBOVUxMLCAwKTsKKwogc3RhdGljIGludCBfX2luaXQgcHByb19pbml0KGNoYXIgKipjcHVfdHlwZSkKIHsKIAlfX3U4IGNwdV9tb2RlbCA9IGJvb3RfY3B1X2RhdGEueDg2X21vZGVsOwogCisJaWYgKGZvcmNlX2FyY2hfcGVyZm1vbiAmJiBjcHVfaGFzX2FyY2hfcGVyZm1vbikKKwkJcmV0dXJuIDA7CisKIAlzd2l0Y2ggKGNwdV9tb2RlbCkgewogCWNhc2UgMCAuLi4gMjoKIAkJKmNwdV90eXBlID0gImkzODYvcHBybyI7CkBAIC00MTQsNiArNDI3LDEzIEBACiAJY2FzZSAxNTogY2FzZSAyMzoKIAkJKmNwdV90eXBlID0gImkzODYvY29yZV8yIjsKIAkJYnJlYWs7CisJY2FzZSAyNjoKKwkJYXJjaF9wZXJmbW9uX3NldHVwX2NvdW50ZXJzKCk7CisJCSpjcHVfdHlwZSA9ICJpMzg2L2NvcmVfaTciOworCQlicmVhazsKKwljYXNlIDI4OgorCQkqY3B1X3R5cGUgPSAiaTM4Ni9hdG9tIjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogVW5rbm93biAqLwogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYwppbmRleCAxMDEzMWZiLi40ZGE3MjMwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wcHJvLmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvb3BfbW9kZWxfcHByby5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgotI2luY2x1ZGUgPGFzbS9pbnRlbF9hcmNoX3BlcmZtb24uaD4KKyNpbmNsdWRlIDxhc20vcGVyZl9jb3VudGVyLmg+CiAKICNpbmNsdWRlICJvcF94ODZfbW9kZWwuaCIKICNpbmNsdWRlICJvcF9jb3VudGVyLmgiCkBAIC0xMzYsNiArMTM2LDEzIEBACiAJdTY0IHZhbDsKIAlpbnQgaTsKIAorCS8qCisJICogVGhpcyBjYW4gaGFwcGVuIGlmIHBlcmYgY291bnRlcnMgYXJlIGluIHVzZSB3aGVuCisJICogd2Ugc3RlYWwgdGhlIGRpZSBub3RpZmllciBOTUkuCisJICovCisJaWYgKHVubGlrZWx5KCFyZXNldF92YWx1ZSkpCisJCWdvdG8gb3V0OworCiAJZm9yIChpID0gMCA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgewogCQlpZiAoIXJlc2V0X3ZhbHVlW2ldKQogCQkJY29udGludWU7CkBAIC0xNDYsNiArMTUzLDcgQEAKIAkJfQogCX0KIAorb3V0OgogCS8qIE9ubHkgUDYgYmFzZWQgUGVudGl1bSBNIG5lZWQgdG8gcmUtdW5tYXNrIHRoZSBhcGljIHZlY3RvciBidXQgaXQKIAkgKiBkb2Vzbid0IGh1cnQgb3RoZXIgUDYgdmFyaWFudCAqLwogCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgYXBpY19yZWFkKEFQSUNfTFZUUEMpICYgfkFQSUNfTFZUX01BU0tFRCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvaXJxLmMgYi9hcmNoL3g4Ni9wY2kvaXJxLmMKaW5kZXggZmVjYmNlNi4uMDY5NmQ1MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2lycS5jCisrKyBiL2FyY2gveDg2L3BjaS9pcnEuYwpAQCAtODg5LDYgKzg4OSw5IEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcykKKwkJcmV0dXJuIDA7CisKIAkvKiBGaW5kIElSUSByb3V0aW5nIGVudHJ5ICovCiAKIAlpZiAoIXBpcnFfdGFibGUpCkBAIC0xMDM5LDU2ICsxMDQyLDE1IEBACiAJCXBpcnFfcGVuYWx0eVtkZXYtPmlycV0rKzsKIAl9CiAKKwlpZiAoaW9fYXBpY19hc3NpZ25fcGNpX2lycXMpCisJCXJldHVybjsKKwogCWRldiA9IE5VTEw7CiAJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9QSU4sICZwaW4pOwogCQlpZiAoIXBpbikKIAkJCWNvbnRpbnVlOwogCi0jaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi0JCS8qCi0JCSAqIFJlY2FsY3VsYXRlIElSUSBudW1iZXJzIGlmIHdlIHVzZSB0aGUgSS9PIEFQSUMuCi0JCSAqLwotCQlpZiAoaW9fYXBpY19hc3NpZ25fcGNpX2lycXMpIHsKLQkJCWludCBpcnE7Ci0KLQkJCS8qCi0JCQkgKiBpbnRlcnJ1cHQgcGlucyBhcmUgbnVtYmVyZWQgc3RhcnRpbmcgZnJvbSAxCi0JCQkgKi8KLQkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGRldi0+YnVzLT5udW1iZXIsCi0JCQkJUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbiAtIDEpOwotCQkJLyoKLQkJCSAqIEJ1c3NlcyBiZWhpbmQgYnJpZGdlcyBhcmUgdHlwaWNhbGx5IG5vdCBsaXN0ZWQgaW4gdGhlCi0JCQkgKiBNUC10YWJsZS4gIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGxvb2sgdXAgdGhlIElSUQotCQkJICogYmFzZWQgb24gdGhlIHBhcmVudCBidXMsIHBhcmVudCBzbG90LCBhbmQgcGluIG51bWJlci4KLQkJCSAqIFRoZSBTTVAgY29kZSBkZXRlY3RzIHN1Y2ggYnJpZGdlZCBidXNzZXMgaXRzZWxmIHNvIHdlCi0JCQkgKiBzaG91bGQgZ2V0IGludG8gdGhpcyBicmFuY2ggcmVsaWFibHkuCi0JCQkgKi8KLQkJCWlmIChpcnEgPCAwICYmIGRldi0+YnVzLT5wYXJlbnQpIHsKLQkJCQkvKiBnbyBiYWNrIHRvIHRoZSBicmlkZ2UgKi8KLQkJCQlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlID0gZGV2LT5idXMtPnNlbGY7Ci0JCQkJaW50IGJ1czsKLQotCQkJCXBpbiA9IHBjaV9zd2l6emxlX2ludGVycnVwdF9waW4oZGV2LCBwaW4pOwotCQkJCWJ1cyA9IGJyaWRnZS0+YnVzLT5udW1iZXI7Ci0JCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoYnVzLAotCQkJCQkJUENJX1NMT1QoYnJpZGdlLT5kZXZmbiksIHBpbiAtIDEpOwotCQkJCWlmIChpcnEgPj0gMCkKLQkJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LAotCQkJCQkJInVzaW5nIGJyaWRnZSAlcyBJTlQgJWMgdG8gIgotCQkJCQkJCSJnZXQgSVJRICVkXG4iLAotCQkJCQkJIHBjaV9uYW1lKGJyaWRnZSksCi0JCQkJCQkgJ0EnICsgcGluIC0gMSwgaXJxKTsKLQkJCX0KLQkJCWlmIChpcnEgPj0gMCkgewotCQkJCWRldl9pbmZvKCZkZXYtPmRldiwKLQkJCQkJIlBDSS0+QVBJQyBJUlEgdHJhbnNmb3JtOiBJTlQgJWMgIgotCQkJCQkJIi0+IElSUSAlZFxuIiwKLQkJCQkJJ0EnICsgcGluIC0gMSwgaXJxKTsKLQkJCQlkZXYtPmlycSA9IGlycTsKLQkJCX0KLQkJfQotI2VuZGlmCiAJCS8qCiAJCSAqIFN0aWxsIG5vIElSUT8gVHJ5IHRvIGxvb2t1cCBvbmUuLi4KIAkJICovCkBAIC0xMTgzLDYgKzExNDUsMTkgQEAKIAlwY2liaW9zX2VuYWJsZV9pcnEgPSBwaXJxX2VuYWJsZV9pcnE7CiAKIAlwY2liaW9zX2ZpeHVwX2lycXMoKTsKKworCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcyAmJiBwY2lfcm91dGVpcnEpIHsKKwkJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CisJCS8qCisJCSAqIFBDSSBJUlEgcm91dGluZyBpcyBzZXQgdXAgYnkgcGNpX2VuYWJsZV9kZXZpY2UoKSwgYnV0IHdlCisJCSAqIGFsc28gZG8gaXQgaGVyZSBpbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBicm9rZW4gZHJpdmVycyB0aGF0CisJCSAqIGRvbid0IHVzZSBwY2lfZW5hYmxlX2RldmljZSgpLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBSb3V0aW5nIFBDSSBpbnRlcnJ1cHRzIGZvciBhbGwgZGV2aWNlcyBiZWNhdXNlIFwicGNpPXJvdXRlaXJxXCIgc3BlY2lmaWVkXG4iKTsKKwkJZm9yX2VhY2hfcGNpX2RldihkZXYpCisJCQlwaXJxX2VuYWJsZV9pcnEoZGV2KTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIxMywxNiArMTE4OCwyMyBAQAogc3RhdGljIGludCBwaXJxX2VuYWJsZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1OCBwaW47Ci0Jc3RydWN0IHBjaV9kZXYgKnRlbXBfZGV2OwogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7Ci0JaWYgKHBpbiAmJiAhcGNpYmlvc19sb29rdXBfaXJxKGRldiwgMSkgJiYgIWRldi0+aXJxKSB7CisJaWYgKHBpbiAmJiAhcGNpYmlvc19sb29rdXBfaXJxKGRldiwgMSkpIHsKIAkJY2hhciAqbXNnID0gIiI7CiAKLQkJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzKSB7Ci0JCQlpbnQgaXJxOworCQlpZiAoIWlvX2FwaWNfYXNzaWduX3BjaV9pcnFzICYmIGRldi0+aXJxKQorCQkJcmV0dXJuIDA7CiAKLQkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4gLSAxKTsKKwkJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzKSB7CisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCisJCQlzdHJ1Y3QgcGNpX2RldiAqdGVtcF9kZXY7CisJCQlpbnQgaXJxOworCQkJc3RydWN0IGlvX2FwaWNfaXJxX2F0dHIgaXJxX2F0dHI7CisKKwkJCWlycSA9IElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKGRldi0+YnVzLT5udW1iZXIsCisJCQkJCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwKKwkJCQkJCXBpbiAtIDEsICZpcnFfYXR0cik7CiAJCQkvKgogCQkJICogQnVzc2VzIGJlaGluZCBicmlkZ2VzIGFyZSB0eXBpY2FsbHkgbm90IGxpc3RlZCBpbiB0aGUgTVAtdGFibGUuCiAJCQkgKiBJbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBsb29rIHVwIHRoZSBJUlEgYmFzZWQgb24gdGhlIHBhcmVudCBidXMsCkBAIC0xMjM1LDcgKzEyMTcsOCBAQAogCiAJCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7CiAJCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoYnJpZGdlLT5idXMtPm51bWJlciwKLQkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLCBwaW4gLSAxKTsKKwkJCQkJCVBDSV9TTE9UKGJyaWRnZS0+ZGV2Zm4pLAorCQkJCQkJcGluIC0gMSwgJmlycV9hdHRyKTsKIAkJCQlpZiAoaXJxID49IDApCiAJCQkJCWRldl93YXJuKCZkZXYtPmRldiwgInVzaW5nIGJyaWRnZSAlcyAiCiAJCQkJCQkgIklOVCAlYyB0byBnZXQgSVJRICVkXG4iLApAQCAtMTI0NSwxMiArMTIyOCwxNSBAQAogCQkJfQogCQkJZGV2ID0gdGVtcF9kZXY7CiAJCQlpZiAoaXJxID49IDApIHsKKwkJCQlpb19hcGljX3NldF9wY2lfcm91dGluZygmZGV2LT5kZXYsIGlycSwKKwkJCQkJCQkgJmlycV9hdHRyKTsKKwkJCQlkZXYtPmlycSA9IGlycTsKIAkJCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQQ0ktPkFQSUMgSVJRIHRyYW5zZm9ybTogIgogCQkJCQkgIklOVCAlYyAtPiBJUlEgJWRcbiIsICdBJyArIHBpbiAtIDEsIGlycSk7Ci0JCQkJZGV2LT5pcnEgPSBpcnE7CiAJCQkJcmV0dXJuIDA7CiAJCQl9IGVsc2UKIAkJCQltc2cgPSAiOyBwcm9iYWJseSBidWdneSBNUCB0YWJsZSI7CisjZW5kaWYKIAkJfSBlbHNlIGlmIChwY2lfcHJvYmUgJiBQQ0lfQklPU19JUlFfU0NBTikKIAkJCW1zZyA9ICIiOwogCQllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi1zZXR1cC5jIGIvYXJjaC94ODYvdmRzby92ZHNvMzItc2V0dXAuYwppbmRleCAxMjQxZjExLi41OGJjMDBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi1zZXR1cC5jCisrKyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMKQEAgLTMzOCw2ICszMzgsOCBAQAogCQl9CiAJfQogCisJY3VycmVudC0+bW0tPmNvbnRleHQudmRzbyA9ICh2b2lkICopYWRkcjsKKwogCWlmIChjb21wYXRfdXNlc192bWEgfHwgIWNvbXBhdCkgewogCQkvKgogCQkgKiBNQVlXUklURSB0byBhbGxvdyBnZGIgdG8gQ09XIGFuZCBzZXQgYnJlYWtwb2ludHMKQEAgLTM1OCwxMSArMzYwLDEzIEBACiAJCQlnb3RvIHVwX2ZhaWw7CiAJfQogCi0JY3VycmVudC0+bW0tPmNvbnRleHQudmRzbyA9ICh2b2lkICopYWRkcjsKIAljdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c2VudGVyX3JldHVybiA9CiAJCVZEU08zMl9TWU1CT0woYWRkciwgU1lTRU5URVJfUkVUVVJOKTsKIAogICB1cF9mYWlsOgorCWlmIChyZXQpCisJCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28gPSBOVUxMOworCiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92bWEuYyBiL2FyY2gveDg2L3Zkc28vdm1hLmMKaW5kZXggNzEzM2NkZi4uMjFlMWFlYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdmRzby92bWEuYworKysgYi9hcmNoL3g4Ni92ZHNvL3ZtYS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS92Z3RvZC5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgpAQCAtMTE1LDE1ICsxMTYsMTggQEAKIAkJZ290byB1cF9mYWlsOwogCX0KIAorCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28gPSAodm9pZCAqKWFkZHI7CisKIAlyZXQgPSBpbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgYWRkciwgdmRzb19zaXplLAogCQkJCSAgICAgIFZNX1JFQUR8Vk1fRVhFQ3wKIAkJCQkgICAgICBWTV9NQVlSRUFEfFZNX01BWVdSSVRFfFZNX01BWUVYRUN8CiAJCQkJICAgICAgVk1fQUxXQVlTRFVNUCwKIAkJCQkgICAgICB2ZHNvX3BhZ2VzKTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJY3VycmVudC0+bW0tPmNvbnRleHQudmRzbyA9IE5VTEw7CiAJCWdvdG8gdXBfZmFpbDsKKwl9CiAKLQljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvID0gKHZvaWQgKilhZGRyOwogdXBfZmFpbDoKIAl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCmluZGV4IGYwOWU4YzMuLjBhMTcwMGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXJ0X2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtNDQsNiArNDUsNyBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vbXNyLWluZGV4Lmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgpAQCAtMjQwLDEwICsyNDIsMTAgQEAKIAlyZXR1cm4gSFlQRVJWSVNPUl9nZXRfZGVidWdyZWcocmVnKTsKIH0KIAotdm9pZCB4ZW5fbGVhdmVfbGF6eSh2b2lkKQorc3RhdGljIHZvaWQgeGVuX2VuZF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCiB7Ci0JcGFyYXZpcnRfbGVhdmVfbGF6eShwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkpOwogCXhlbl9tY19mbHVzaCgpOworCXBhcmF2aXJ0X2VuZF9jb250ZXh0X3N3aXRjaChuZXh0KTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3N0b3JlX3RyKHZvaWQpCkBAIC00MjgsMTEgKzQzMCw0NCBAQAogc3RhdGljIGludCBjdnRfZ2F0ZV90b190cmFwKGludCB2ZWN0b3IsIGNvbnN0IGdhdGVfZGVzYyAqdmFsLAogCQkJICAgIHN0cnVjdCB0cmFwX2luZm8gKmluZm8pCiB7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCiAJaWYgKHZhbC0+dHlwZSAhPSBHQVRFX1RSQVAgJiYgdmFsLT50eXBlICE9IEdBVEVfSU5URVJSVVBUKQogCQlyZXR1cm4gMDsKIAogCWluZm8tPnZlY3RvciA9IHZlY3RvcjsKLQlpbmZvLT5hZGRyZXNzID0gZ2F0ZV9vZmZzZXQoKnZhbCk7CisKKwlhZGRyID0gZ2F0ZV9vZmZzZXQoKnZhbCk7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS8qCisJICogTG9vayBmb3Iga25vd24gdHJhcHMgdXNpbmcgSVNULCBhbmQgc3Vic3RpdHV0ZSB0aGVtCisJICogYXBwcm9wcmlhdGVseS4gIFRoZSBkZWJ1Z2dlciBvbmVzIGFyZSB0aGUgb25seSBvbmVzIHdlIGNhcmUKKwkgKiBhYm91dC4gIFhlbiB3aWxsIGhhbmRsZSBmYXVsdHMgbGlrZSBkb3VibGVfZmF1bHQgYW5kCisJICogbWFjaGluZV9jaGVjaywgc28gd2Ugc2hvdWxkIG5ldmVyIHNlZSB0aGVtLiAgV2FybiBpZgorCSAqIHRoZXJlJ3MgYW4gdW5leHBlY3RlZCBJU1QtdXNpbmcgZmF1bHQgaGFuZGxlci4KKwkgKi8KKwlpZiAoYWRkciA9PSAodW5zaWduZWQgbG9uZylkZWJ1ZykKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKXhlbl9kZWJ1ZzsKKwllbHNlIGlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKWludDMpCisJCWFkZHIgPSAodW5zaWduZWQgbG9uZyl4ZW5faW50MzsKKwllbHNlIGlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKXN0YWNrX3NlZ21lbnQpCisJCWFkZHIgPSAodW5zaWduZWQgbG9uZyl4ZW5fc3RhY2tfc2VnbWVudDsKKwllbHNlIGlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKWRvdWJsZV9mYXVsdCB8fAorCQkgYWRkciA9PSAodW5zaWduZWQgbG9uZylubWkpIHsKKwkJLyogRG9uJ3QgbmVlZCB0byBoYW5kbGUgdGhlc2UgKi8KKwkJcmV0dXJuIDA7CisjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKKwl9IGVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpbWFjaGluZV9jaGVjaykgeworCQlyZXR1cm4gMDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qIFNvbWUgb3RoZXIgdHJhcCB1c2luZyBJU1Q/ICovCisJCWlmIChXQVJOX09OKHZhbC0+aXN0ICE9IDApKQorCQkJcmV0dXJuIDA7CisJfQorI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KKwlpbmZvLT5hZGRyZXNzID0gYWRkcjsKKwogCWluZm8tPmNzID0gZ2F0ZV9zZWdtZW50KCp2YWwpOwogCWluZm8tPmZsYWdzID0gdmFsLT5kcGw7CiAJLyogaW50ZXJydXB0IGdhdGVzIGNsZWFyIElGICovCkBAIC02MjMsMTAgKzY1OCwyNiBAQAogCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7CiB9CiAKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB4ZW5fY3IwX3ZhbHVlKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3IwKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjcjAgPSBwZXJjcHVfcmVhZCh4ZW5fY3IwX3ZhbHVlKTsKKworCWlmICh1bmxpa2VseShjcjAgPT0gMCkpIHsKKwkJY3IwID0gbmF0aXZlX3JlYWRfY3IwKCk7CisJCXBlcmNwdV93cml0ZSh4ZW5fY3IwX3ZhbHVlLCBjcjApOworCX0KKworCXJldHVybiBjcjA7Cit9CisKIHN0YXRpYyB2b2lkIHhlbl93cml0ZV9jcjAodW5zaWduZWQgbG9uZyBjcjApCiB7CiAJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CiAKKwlwZXJjcHVfd3JpdGUoeGVuX2NyMF92YWx1ZSwgY3IwKTsKKwogCS8qIE9ubHkgcGF5IGF0dGVudGlvbiB0byBjcjAuVFM7IGV2ZXJ5dGhpbmcgZWxzZSBpcwogCSAgIGlnbm9yZWQuICovCiAJbWNzID0geGVuX21jX2VudHJ5KDApOwpAQCAtODEyLDcgKzg2Myw3IEBACiAKIAkuY2x0cyA9IHhlbl9jbHRzLAogCi0JLnJlYWRfY3IwID0gbmF0aXZlX3JlYWRfY3IwLAorCS5yZWFkX2NyMCA9IHhlbl9yZWFkX2NyMCwKIAkud3JpdGVfY3IwID0geGVuX3dyaXRlX2NyMCwKIAogCS5yZWFkX2NyNCA9IG5hdGl2ZV9yZWFkX2NyNCwKQEAgLTg2MCwxMCArOTExLDggQEAKIAkvKiBYZW4gdGFrZXMgY2FyZSBvZiAlZ3Mgd2hlbiBzd2l0Y2hpbmcgdG8gdXNlcm1vZGUgZm9yIHVzICovCiAJLnN3YXBncyA9IHBhcmF2aXJ0X25vcCwKIAotCS5sYXp5X21vZGUgPSB7Ci0JCS5lbnRlciA9IHBhcmF2aXJ0X2VudGVyX2xhenlfY3B1LAotCQkubGVhdmUgPSB4ZW5fbGVhdmVfbGF6eSwKLQl9LAorCS5zdGFydF9jb250ZXh0X3N3aXRjaCA9IHBhcmF2aXJ0X3N0YXJ0X2NvbnRleHRfc3dpdGNoLAorCS5lbmRfY29udGV4dF9zd2l0Y2ggPSB4ZW5fZW5kX2NvbnRleHRfc3dpdGNoLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9hcGljX29wcyB4ZW5fYXBpY19vcHMgX19pbml0ZGF0YSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9tbXUuYyBiL2FyY2gveDg2L3hlbi9tbXUuYwppbmRleCBmYmE1NWIxLi40Y2ViMjg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vbW11LmMKKysrIGIvYXJjaC94ODYveGVuL21tdS5jCkBAIC00NTIsMTAgKzQ1Miw2IEBACiB2b2lkIHhlbl9zZXRfcHRlX2F0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCSAgICBwdGVfdCAqcHRlcCwgcHRlX3QgcHRldmFsKQogewotCS8qIHVwZGF0ZXMgdG8gaW5pdF9tbSBtYXkgYmUgZG9uZSB3aXRob3V0IGxvY2sgKi8KLQlpZiAobW0gPT0gJmluaXRfbW0pCi0JCXByZWVtcHRfZGlzYWJsZSgpOwotCiAJQUREX1NUQVRTKHNldF9wdGVfYXQsIDEpOwogLy8JQUREX1NUQVRTKHNldF9wdGVfYXRfcGlubmVkLCB4ZW5fcGFnZV9waW5uZWQocHRlcCkpOwogCUFERF9TVEFUUyhzZXRfcHRlX2F0X2N1cnJlbnQsIG1tID09IGN1cnJlbnQtPm1tKTsKQEAgLTQ3Niw5ICs0NzIsNyBAQAogCX0KIAl4ZW5fc2V0X3B0ZShwdGVwLCBwdGV2YWwpOwogCi1vdXQ6Ci0JaWYgKG1tID09ICZpbml0X21tKQotCQlwcmVlbXB0X2VuYWJsZSgpOworb3V0OglyZXR1cm47CiB9CiAKIHB0ZV90IHhlbl9wdGVwX21vZGlmeV9wcm90X3N0YXJ0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLApAQCAtMTE1MiwxMCArMTE0Niw4IEBACiAKIAkvKiBJZiB0aGlzIGNwdSBzdGlsbCBoYXMgYSBzdGFsZSBjcjMgcmVmZXJlbmNlLCB0aGVuIG1ha2Ugc3VyZQogCSAgIGl0IGhhcyBiZWVuIGZsdXNoZWQuICovCi0JaWYgKHBlcmNwdV9yZWFkKHhlbl9jdXJyZW50X2NyMykgPT0gX19wYShtbS0+cGdkKSkgeworCWlmIChwZXJjcHVfcmVhZCh4ZW5fY3VycmVudF9jcjMpID09IF9fcGEobW0tPnBnZCkpCiAJCWxvYWRfY3IzKHN3YXBwZXJfcGdfZGlyKTsKLQkJYXJjaF9mbHVzaF9sYXp5X2NwdV9tb2RlKCk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCB4ZW5fZHJvcF9tbV9yZWYoc3RydWN0IG1tX3N0cnVjdCAqbW0pCkBAIC0xMTY4LDcgKzExNjAsNiBAQAogCQkJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOwogCQllbHNlCiAJCQlsZWF2ZV9tbShzbXBfcHJvY2Vzc29yX2lkKCkpOwotCQlhcmNoX2ZsdXNoX2xhenlfY3B1X21vZGUoKTsKIAl9CiAKIAkvKiBHZXQgdGhlICJvZmZpY2lhbCIgc2V0IG9mIGNwdXMgcmVmZXJyaW5nIHRvIG91ciBwYWdldGFibGUuICovCkBAIC0xODc2LDYgKzE4NjcsMTQgQEAKIAl4ZW5fbWFya19pbml0X21tX3Bpbm5lZCgpOwogfQogCitzdGF0aWMgdm9pZCB4ZW5fbGVhdmVfbGF6eV9tbXUodm9pZCkKK3sKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwl4ZW5fbWNfZmx1c2goKTsKKwlwYXJhdmlydF9sZWF2ZV9sYXp5X21tdSgpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKIGNvbnN0IHN0cnVjdCBwdl9tbXVfb3BzIHhlbl9tbXVfb3BzIF9faW5pdGRhdGEgPSB7CiAJLnBhZ2V0YWJsZV9zZXR1cF9zdGFydCA9IHhlbl9wYWdldGFibGVfc2V0dXBfc3RhcnQsCiAJLnBhZ2V0YWJsZV9zZXR1cF9kb25lID0geGVuX3BhZ2V0YWJsZV9zZXR1cF9kb25lLApAQCAtMTk0OSw3ICsxOTQ4LDcgQEAKIAogCS5sYXp5X21vZGUgPSB7CiAJCS5lbnRlciA9IHBhcmF2aXJ0X2VudGVyX2xhenlfbW11LAotCQkubGVhdmUgPSB4ZW5fbGVhdmVfbGF6eSwKKwkJLmxlYXZlID0geGVuX2xlYXZlX2xhenlfbW11LAogCX0sCiAKIAkuc2V0X2ZpeG1hcCA9IHhlbl9zZXRfZml4bWFwLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NldHVwLmMgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwppbmRleCAxNWM2YzY4Li5hZDAwNDdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwpAQCAtNjEsOSArNjEsOSBAQAogCSAqICAtIHhlbl9zdGFydF9pbmZvCiAJICogU2VlIGNvbW1lbnQgYWJvdmUgInN0cnVjdCBzdGFydF9pbmZvIiBpbiA8eGVuL2ludGVyZmFjZS94ZW4uaD4KIAkgKi8KLQllODIwX2FkZF9yZWdpb24oX19wYSh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpLAotCQkJeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UgLSB4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QsCi0JCQlFODIwX1JFU0VSVkVEKTsKKwlyZXNlcnZlX2Vhcmx5KF9fcGEoeGVuX3N0YXJ0X2luZm8tPm1mbl9saXN0KSwKKwkJICAgICAgX19wYSh4ZW5fc3RhcnRfaW5mby0+cHRfYmFzZSksCisJCQkiWEVOIFNUQVJUIElORk8iKTsKIAogCXNhbml0aXplX2U4MjBfbWFwKGU4MjAubWFwLCBBUlJBWV9TSVpFKGU4MjAubWFwKSwgJmU4MjAubnJfbWFwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3hlbi1vcHMuaCBiL2FyY2gveDg2L3hlbi94ZW4tb3BzLmgKaW5kZXggY2E2NTk2Yi4uMjI0OTRmZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3hlbi1vcHMuaAorKysgYi9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oCkBAIC0zMCw3ICszMCw2IEBACiB2b2lkIHhlbl9pZGVudF9tYXBfSVNBKHZvaWQpOwogdm9pZCB4ZW5fcmVzZXJ2ZV90b3Aodm9pZCk7CiAKLXZvaWQgeGVuX2xlYXZlX2xhenkodm9pZCk7CiB2b2lkIHhlbl9wb3N0X2FsbG9jYXRvcl9pbml0KHZvaWQpOwogCiBjaGFyICogX19pbml0IHhlbl9tZW1vcnlfc2V0dXAodm9pZCk7CmRpZmYgLS1naXQgYS9ibG9jay9LY29uZmlnIGIvYmxvY2svS2NvbmZpZwppbmRleCBlN2QxMjc4Li4yYzM5NTI3IDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnCisrKyBiL2Jsb2NrL0tjb25maWcKQEAgLTI2LDYgKzI2LDcgQEAKIGNvbmZpZyBMQkQKIAlib29sICJTdXBwb3J0IGZvciBsYXJnZSBibG9jayBkZXZpY2VzIGFuZCBmaWxlcyIKIAlkZXBlbmRzIG9uICE2NEJJVAorCWRlZmF1bHQgeQogCWhlbHAKIAkgIEVuYWJsZSBibG9jayBkZXZpY2VzIG9yIGZpbGVzIG9mIHNpemUgMlRCIGFuZCBsYXJnZXIuCiAKQEAgLTM4LDExICszOSwxMyBAQAogCiAJICBUaGUgZXh0NCBmaWxlc3lzdGVtIHJlcXVpcmVzIHRoYXQgdGhpcyBmZWF0dXJlIGJlIGVuYWJsZWQgaW4KIAkgIG9yZGVyIHRvIHN1cHBvcnQgZmlsZXN5c3RlbXMgdGhhdCBoYXZlIHRoZSBodWdlX2ZpbGUgZmVhdHVyZQotCSAgZW5hYmxlZC4gICAgT3RoZXJ3aXNlLCBpdCB3aWxsIHJlZnVzZSB0byBtb3VudCBhbnkgZmlsZXN5c3RlbXMKLQkgIHRoYXQgdXNlIHRoZSBodWdlX2ZpbGUgZmVhdHVyZSwgd2hpY2ggaXMgZW5hYmxlZCBieSBkZWZhdWx0Ci0JICBieSBta2UyZnMuZXh0NC4gICBUaGUgR0ZTMiBmaWxlc3lzdGVtIGFsc28gcmVxdWlyZXMgdGhpcyBmZWF0dXJlLgorCSAgZW5hYmxlZC4gIE90aGVyd2lzZSwgaXQgd2lsbCByZWZ1c2UgdG8gbW91bnQgaW4gdGhlIHJlYWQtd3JpdGUKKwkgIG1vZGUgYW55IGZpbGVzeXN0ZW1zIHRoYXQgdXNlIHRoZSBodWdlX2ZpbGUgZmVhdHVyZSwgd2hpY2ggaXMKKwkgIGVuYWJsZWQgYnkgZGVmYXVsdCBieSBta2UyZnMuZXh0NC4KIAotCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwkgIFRoZSBHRlMyIGZpbGVzeXN0ZW0gYWxzbyByZXF1aXJlcyB0aGlzIGZlYXR1cmUuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCiAKIGNvbmZpZyBCTEtfREVWX0JTRwogCWJvb2wgIkJsb2NrIGxheWVyIFNHIHN1cHBvcnQgdjQgKEVYUEVSSU1FTlRBTCkiCmRpZmYgLS1naXQgYS9ibG9jay9hcy1pb3NjaGVkLmMgYi9ibG9jay9hcy1pb3NjaGVkLmMKaW5kZXggYzQ4ZmE2Ny4uN2ExMmNmNiAxMDA2NDQKLS0tIGEvYmxvY2svYXMtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2FzLWlvc2NoZWQuYwpAQCAtMzA2LDggKzMwNiw4IEBACiAJZGF0YV9kaXIgPSBycV9pc19zeW5jKHJxMSk7CiAKIAlsYXN0ID0gYWQtPmxhc3Rfc2VjdG9yW2RhdGFfZGlyXTsKLQlzMSA9IHJxMS0+c2VjdG9yOwotCXMyID0gcnEyLT5zZWN0b3I7CisJczEgPSBibGtfcnFfcG9zKHJxMSk7CisJczIgPSBibGtfcnFfcG9zKHJxMik7CiAKIAlCVUdfT04oZGF0YV9kaXIgIT0gcnFfaXNfc3luYyhycTIpKTsKIApAQCAtNTY2LDEzICs1NjYsMTUgQEAKIAkJCWFzX3VwZGF0ZV90aGlua3RpbWUoYWQsIGFpYywgdGhpbmt0aW1lKTsKIAogCQkJLyogQ2FsY3VsYXRlIHJlYWQgLT4gcmVhZCBzZWVrIGRpc3RhbmNlICovCi0JCQlpZiAoYWljLT5sYXN0X3JlcXVlc3RfcG9zIDwgcnEtPnNlY3RvcikKLQkJCQlzZWVrX2Rpc3QgPSBycS0+c2VjdG9yIC0gYWljLT5sYXN0X3JlcXVlc3RfcG9zOworCQkJaWYgKGFpYy0+bGFzdF9yZXF1ZXN0X3BvcyA8IGJsa19ycV9wb3MocnEpKQorCQkJCXNlZWtfZGlzdCA9IGJsa19ycV9wb3MocnEpIC0KKwkJCQkJICAgIGFpYy0+bGFzdF9yZXF1ZXN0X3BvczsKIAkJCWVsc2UKLQkJCQlzZWVrX2Rpc3QgPSBhaWMtPmxhc3RfcmVxdWVzdF9wb3MgLSBycS0+c2VjdG9yOworCQkJCXNlZWtfZGlzdCA9IGFpYy0+bGFzdF9yZXF1ZXN0X3BvcyAtCisJCQkJCSAgICBibGtfcnFfcG9zKHJxKTsKIAkJCWFzX3VwZGF0ZV9zZWVrZGlzdChhZCwgYWljLCBzZWVrX2Rpc3QpOwogCQl9Ci0JCWFpYy0+bGFzdF9yZXF1ZXN0X3BvcyA9IHJxLT5zZWN0b3IgKyBycS0+bnJfc2VjdG9yczsKKwkJYWljLT5sYXN0X3JlcXVlc3RfcG9zID0gYmxrX3JxX3BvcyhycSkgKyBibGtfcnFfc2VjdG9ycyhycSk7CiAJCXNldF9iaXQoQVNfVEFTS19JT1NUQVJURUQsICZhaWMtPnN0YXRlKTsKIAkJc3Bpbl91bmxvY2soJmFpYy0+bG9jayk7CiAJfQpAQCAtNTg3LDcgKzU4OSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBkZWxheTsJLyogamlmZmllcyAqLwogCXNlY3Rvcl90IGxhc3QgPSBhZC0+bGFzdF9zZWN0b3JbYWQtPmJhdGNoX2RhdGFfZGlyXTsKLQlzZWN0b3JfdCBuZXh0ID0gcnEtPnNlY3RvcjsKKwlzZWN0b3JfdCBuZXh0ID0gYmxrX3JxX3BvcyhycSk7CiAJc2VjdG9yX3QgZGVsdGE7IC8qIGFjY2VwdGFibGUgY2xvc2Ugb2Zmc2V0IChpbiBzZWN0b3JzKSAqLwogCXNlY3Rvcl90IHM7CiAKQEAgLTk4MSw3ICs5ODMsNyBAQAogCSAqIFRoaXMgaGFzIHRvIGJlIHNldCBpbiBvcmRlciB0byBiZSBjb3JyZWN0bHkgdXBkYXRlZCBieQogCSAqIGFzX2ZpbmRfbmV4dF9ycQogCSAqLwotCWFkLT5sYXN0X3NlY3RvcltkYXRhX2Rpcl0gPSBycS0+c2VjdG9yICsgcnEtPm5yX3NlY3RvcnM7CisJYWQtPmxhc3Rfc2VjdG9yW2RhdGFfZGlyXSA9IGJsa19ycV9wb3MocnEpICsgYmxrX3JxX3NlY3RvcnMocnEpOwogCiAJaWYgKGRhdGFfZGlyID09IEJMS19SV19TWU5DKSB7CiAJCXN0cnVjdCBpb19jb250ZXh0ICppb2MgPSBSUV9JT0MocnEpOwpAQCAtMTMxMiwxMiArMTMxNCw4IEBACiBzdGF0aWMgdm9pZCBhc193b3JrX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCXN0cnVjdCBhc19kYXRhICphZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXNfZGF0YSwgYW50aWNfd29yayk7Ci0Jc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBhZC0+cTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwotCWJsa19zdGFydF9xdWV1ZWluZyhxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlibGtfcnVuX3F1ZXVlKGFkLT5xKTsKIH0KIAogc3RhdGljIGludCBhc19tYXlfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBydykKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1iYXJyaWVyLmMgYi9ibG9jay9ibGstYmFycmllci5jCmluZGV4IDIwYjQxMTEuLjMwMDIyYjQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1iYXJyaWVyLmMKKysrIGIvYmxvY2svYmxrLWJhcnJpZXIuYwpAQCAtMTA2LDEwICsxMDYsNyBAQAogCSAqLwogCXEtPm9yZHNlcSA9IDA7CiAJcnEgPSBxLT5vcmlnX2Jhcl9ycTsKLQotCWlmIChfX2Jsa19lbmRfcmVxdWVzdChycSwgcS0+b3JkZXJyLCBibGtfcnFfYnl0ZXMocnEpKSkKLQkJQlVHKCk7Ci0KKwlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocnEsIHEtPm9yZGVycik7CiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTE2Niw3ICsxNjMsNyBAQAogCSAqIEZvciBhbiBlbXB0eSBiYXJyaWVyLCB0aGVyZSdzIG5vIGFjdHVhbCBCQVIgcmVxdWVzdCwgd2hpY2gKIAkgKiBpbiB0dXJuIG1ha2VzIFBPU1RGTFVTSCB1bm5lY2Vzc2FyeS4gIE1hc2sgdGhlbSBvZmYuCiAJICovCi0JaWYgKCFycS0+aGFyZF9ucl9zZWN0b3JzKSB7CisJaWYgKCFibGtfcnFfc2VjdG9ycyhycSkpIHsKIAkJcS0+b3JkZXJlZCAmPSB+KFFVRVVFX09SREVSRURfRE9fQkFSIHwKIAkJCQlRVUVVRV9PUkRFUkVEX0RPX1BPU1RGTFVTSCk7CiAJCS8qCkBAIC0xODMsNyArMTgwLDcgQEAKIAl9CiAKIAkvKiBzdGFzaCBhd2F5IHRoZSBvcmlnaW5hbCByZXF1ZXN0ICovCi0JZWx2X2RlcXVldWVfcmVxdWVzdChxLCBycSk7CisJYmxrX2RlcXVldWVfcmVxdWVzdChycSk7CiAJcS0+b3JpZ19iYXJfcnEgPSBycTsKIAlycSA9IE5VTEw7CiAKQEAgLTIyMSw3ICsyMTgsNyBAQAogCX0gZWxzZQogCQlza2lwIHw9IFFVRVVFX09SRFNFUV9QUkVGTFVTSDsKIAotCWlmICgocS0+b3JkZXJlZCAmIFFVRVVFX09SREVSRURfQllfRFJBSU4pICYmIHEtPmluX2ZsaWdodCkKKwlpZiAoKHEtPm9yZGVyZWQgJiBRVUVVRV9PUkRFUkVEX0JZX0RSQUlOKSAmJiBxdWV1ZV9pbl9mbGlnaHQocSkpCiAJCXJxID0gTlVMTDsKIAllbHNlCiAJCXNraXAgfD0gUVVFVUVfT1JEU0VRX0RSQUlOOwpAQCAtMjUxLDEwICsyNDgsOCBAQAogCQkJICogUXVldWUgb3JkZXJpbmcgbm90IHN1cHBvcnRlZC4gIFRlcm1pbmF0ZQogCQkJICogd2l0aCBwcmVqdWRpY2UuCiAJCQkgKi8KLQkJCWVsdl9kZXF1ZXVlX3JlcXVlc3QocSwgcnEpOwotCQkJaWYgKF9fYmxrX2VuZF9yZXF1ZXN0KHJxLCAtRU9QTk9UU1VQUCwKLQkJCQkJICAgICAgYmxrX3JxX2J5dGVzKHJxKSkpCi0JCQkJQlVHKCk7CisJCQlibGtfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChycSwgLUVPUE5PVFNVUFApOwogCQkJKnJxcCA9IE5VTEw7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTMyOSw3ICszMjQsNyBAQAogCS8qCiAJICogVGhlIGRyaXZlciBtdXN0IHN0b3JlIHRoZSBlcnJvciBsb2NhdGlvbiBpbiAtPmJpX3NlY3RvciwgaWYKIAkgKiBpdCBzdXBwb3J0cyBpdC4gRm9yIG5vbi1zdGFja2VkIGRyaXZlcnMsIHRoaXMgc2hvdWxkIGJlIGNvcGllZAotCSAqIGZyb20gcnEtPnNlY3Rvci4KKwkgKiBmcm9tIGJsa19ycV9wb3MocnEpLgogCSAqLwogCWlmIChlcnJvcl9zZWN0b3IpCiAJCSplcnJvcl9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKQEAgLTM5MywxMCArMzg4LDEwIEBACiAKIAkJYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3I7CiAKLQkJaWYgKG5yX3NlY3RzID4gcS0+bWF4X2h3X3NlY3RvcnMpIHsKLQkJCWJpby0+Ymlfc2l6ZSA9IHEtPm1heF9od19zZWN0b3JzIDw8IDk7Ci0JCQlucl9zZWN0cyAtPSBxLT5tYXhfaHdfc2VjdG9yczsKLQkJCXNlY3RvciArPSBxLT5tYXhfaHdfc2VjdG9yczsKKwkJaWYgKG5yX3NlY3RzID4gcXVldWVfbWF4X2h3X3NlY3RvcnMocSkpIHsKKwkJCWJpby0+Ymlfc2l6ZSA9IHF1ZXVlX21heF9od19zZWN0b3JzKHEpIDw8IDk7CisJCQlucl9zZWN0cyAtPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKTsKKwkJCXNlY3RvciArPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKTsKIAkJfSBlbHNlIHsKIAkJCWJpby0+Ymlfc2l6ZSA9IG5yX3NlY3RzIDw8IDk7CiAJCQlucl9zZWN0cyA9IDA7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCBjODk4ODNiLi5kMTdkNzFjIDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTI4LDIyICsyOCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3Rhc2tfaW9fYWNjb3VudGluZ19vcHMuaD4KICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KICNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KLSNpbmNsdWRlIDx0cmFjZS9ibG9jay5oPgorCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYmxvY2suaD4KIAogI2luY2x1ZGUgImJsay5oIgogCi1ERUZJTkVfVFJBQ0UoYmxvY2tfcGx1Zyk7Ci1ERUZJTkVfVFJBQ0UoYmxvY2tfdW5wbHVnX2lvKTsKLURFRklORV9UUkFDRShibG9ja191bnBsdWdfdGltZXIpOwotREVGSU5FX1RSQUNFKGJsb2NrX2dldHJxKTsKLURFRklORV9UUkFDRShibG9ja19zbGVlcHJxKTsKLURFRklORV9UUkFDRShibG9ja19ycV9yZXF1ZXVlKTsKLURFRklORV9UUkFDRShibG9ja19iaW9fYmFja21lcmdlKTsKLURFRklORV9UUkFDRShibG9ja19iaW9fZnJvbnRtZXJnZSk7Ci1ERUZJTkVfVFJBQ0UoYmxvY2tfYmlvX3F1ZXVlKTsKLURFRklORV9UUkFDRShibG9ja19ycV9jb21wbGV0ZSk7Ci1ERUZJTkVfVFJBQ0UoYmxvY2tfcmVtYXApOwkvKiBBbHNvIHVzZWQgaW4gZHJpdmVycy9tZC9kbS5jICovCiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGJsb2NrX3JlbWFwKTsKK0VYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmxvY2tfYmlvX2NvbXBsZXRlKTsKIAogc3RhdGljIGludCBfX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKTsKIApAQCAtNjgsMTEgKzYwLDExIEBACiAJaW50IHJ3ID0gcnFfZGF0YV9kaXIocnEpOwogCWludCBjcHU7CiAKLQlpZiAoIWJsa19mc19yZXF1ZXN0KHJxKSB8fCAhYmxrX2RvX2lvX3N0YXQocnEpKQorCWlmICghYmxrX2RvX2lvX3N0YXQocnEpKQogCQlyZXR1cm47CiAKIAljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCXBhcnQgPSBkaXNrX21hcF9zZWN0b3JfcmN1KHJxLT5ycV9kaXNrLCBycS0+c2VjdG9yKTsKKwlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShycS0+cnFfZGlzaywgYmxrX3JxX3BvcyhycSkpOwogCiAJaWYgKCFuZXdfaW8pCiAJCXBhcnRfc3RhdF9pbmMoY3B1LCBwYXJ0LCBtZXJnZXNbcnddKTsKQEAgLTEyNywxMyArMTE5LDE0IEBACiAJSU5JVF9MSVNUX0hFQUQoJnJxLT50aW1lb3V0X2xpc3QpOwogCXJxLT5jcHUgPSAtMTsKIAlycS0+cSA9IHE7Ci0JcnEtPnNlY3RvciA9IHJxLT5oYXJkX3NlY3RvciA9IChzZWN0b3JfdCkgLTE7CisJcnEtPl9fc2VjdG9yID0gKHNlY3Rvcl90KSAtMTsKIAlJTklUX0hMSVNUX05PREUoJnJxLT5oYXNoKTsKIAlSQl9DTEVBUl9OT0RFKCZycS0+cmJfbm9kZSk7CiAJcnEtPmNtZCA9IHJxLT5fX2NtZDsKIAlycS0+Y21kX2xlbiA9IEJMS19NQVhfQ0RCOwogCXJxLT50YWcgPSAtMTsKIAlycS0+cmVmX2NvdW50ID0gMTsKKwlycS0+c3RhcnRfdGltZSA9IGppZmZpZXM7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19ycV9pbml0KTsKIApAQCAtMTg0LDE0ICsxNzcsMTEgQEAKIAkJcnEtPnJxX2Rpc2sgPyBycS0+cnFfZGlzay0+ZGlza19uYW1lIDogIj8iLCBycS0+Y21kX3R5cGUsCiAJCXJxLT5jbWRfZmxhZ3MpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiICBzZWN0b3IgJWxsdSwgbnIvY25yICVsdS8ldVxuIiwKLQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcnEtPnNlY3RvciwKLQkJCQkJCXJxLT5ucl9zZWN0b3JzLAotCQkJCQkJcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiICBiaW8gJXAsIGJpb3RhaWwgJXAsIGJ1ZmZlciAlcCwgZGF0YSAlcCwgbGVuICV1XG4iLAotCQkJCQkJcnEtPmJpbywgcnEtPmJpb3RhaWwsCi0JCQkJCQlycS0+YnVmZmVyLCBycS0+ZGF0YSwKLQkJCQkJCXJxLT5kYXRhX2xlbik7CisJcHJpbnRrKEtFUk5fSU5GTyAiICBzZWN0b3IgJWxsdSwgbnIvY25yICV1LyV1XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa19ycV9wb3MocnEpLAorCSAgICAgICBibGtfcnFfc2VjdG9ycyhycSksIGJsa19ycV9jdXJfc2VjdG9ycyhycSkpOworCXByaW50ayhLRVJOX0lORk8gIiAgYmlvICVwLCBiaW90YWlsICVwLCBidWZmZXIgJXAsIGxlbiAldVxuIiwKKwkgICAgICAgcnEtPmJpbywgcnEtPmJpb3RhaWwsIHJxLT5idWZmZXIsIGJsa19ycV9ieXRlcyhycSkpOwogCiAJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgewogCQlwcmludGsoS0VSTl9JTkZPICIgIGNkYjogIik7CkBAIC0zMzMsMjQgKzMyMyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGJsa191bnBsdWcpOwogCi1zdGF0aWMgdm9pZCBibGtfaW52b2tlX3JlcXVlc3RfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCi17Ci0JaWYgKHVubGlrZWx5KGJsa19xdWV1ZV9zdG9wcGVkKHEpKSkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBvbmUgbGV2ZWwgb2YgcmVjdXJzaW9uIGlzIG9rIGFuZCBpcyBtdWNoIGZhc3RlciB0aGFuIGtpY2tpbmcKLQkgKiB0aGUgdW5wbHVnIGhhbmRsaW5nCi0JICovCi0JaWYgKCFxdWV1ZV9mbGFnX3Rlc3RfYW5kX3NldChRVUVVRV9GTEFHX1JFRU5URVIsIHEpKSB7Ci0JCXEtPnJlcXVlc3RfZm4ocSk7Ci0JCXF1ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19SRUVOVEVSLCBxKTsKLQl9IGVsc2UgewotCQlxdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1BMVUdHRUQsIHEpOwotCQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsocSwgJnEtPnVucGx1Z193b3JrKTsKLQl9Ci19Ci0KIC8qKgogICogYmxrX3N0YXJ0X3F1ZXVlIC0gcmVzdGFydCBhIHByZXZpb3VzbHkgc3RvcHBlZCBxdWV1ZQogICogQHE6ICAgIFRoZSAmc3RydWN0IHJlcXVlc3RfcXVldWUgaW4gcXVlc3Rpb24KQEAgLTM2NSw3ICszMzcsNyBAQAogCVdBUk5fT04oIWlycXNfZGlzYWJsZWQoKSk7CiAKIAlxdWV1ZV9mbGFnX2NsZWFyKFFVRVVFX0ZMQUdfU1RPUFBFRCwgcSk7Ci0JYmxrX2ludm9rZV9yZXF1ZXN0X2ZuKHEpOworCV9fYmxrX3J1bl9xdWV1ZShxKTsKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3N0YXJ0X3F1ZXVlKTsKIApAQCAtNDI1LDEyICszOTcsMjMgQEAKIHsKIAlibGtfcmVtb3ZlX3BsdWcocSk7CiAKKwlpZiAodW5saWtlbHkoYmxrX3F1ZXVlX3N0b3BwZWQocSkpKQorCQlyZXR1cm47CisKKwlpZiAoZWx2X3F1ZXVlX2VtcHR5KHEpKQorCQlyZXR1cm47CisKIAkvKgogCSAqIE9ubHkgcmVjdXJzZSBvbmNlIHRvIGF2b2lkIG92ZXJydW5uaW5nIHRoZSBzdGFjaywgbGV0IHRoZSB1bnBsdWcKIAkgKiBoYW5kbGluZyByZWludm9rZSB0aGUgaGFuZGxlciBzaG9ydGx5IGlmIHdlIGFscmVhZHkgZ290IHRoZXJlLgogCSAqLwotCWlmICghZWx2X3F1ZXVlX2VtcHR5KHEpKQotCQlibGtfaW52b2tlX3JlcXVlc3RfZm4ocSk7CisJaWYgKCFxdWV1ZV9mbGFnX3Rlc3RfYW5kX3NldChRVUVVRV9GTEFHX1JFRU5URVIsIHEpKSB7CisJCXEtPnJlcXVlc3RfZm4ocSk7CisJCXF1ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19SRUVOVEVSLCBxKTsKKwl9IGVsc2UgeworCQlxdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1BMVUdHRUQsIHEpOworCQlrYmxvY2tkX3NjaGVkdWxlX3dvcmsocSwgJnEtPnVucGx1Z193b3JrKTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MKF9fYmxrX3J1bl9xdWV1ZSk7CiAKQEAgLTQ0MCw5ICs0MjMsNyBAQAogICoKICAqIERlc2NyaXB0aW9uOgogICogICAgSW52b2tlIHJlcXVlc3QgaGFuZGxpbmcgb24gdGhpcyBxdWV1ZSwgaWYgaXQgaGFzIHBlbmRpbmcgd29yayB0byBkby4KLSAqICAgIE1heSBiZSB1c2VkIHRvIHJlc3RhcnQgcXVldWVpbmcgd2hlbiBhIHJlcXVlc3QgaGFzIGNvbXBsZXRlZC4gQWxzbwotICogICAgU2VlIEBibGtfc3RhcnRfcXVldWVpbmcuCi0gKgorICogICAgTWF5IGJlIHVzZWQgdG8gcmVzdGFydCBxdWV1ZWluZyB3aGVuIGEgcmVxdWVzdCBoYXMgY29tcGxldGVkLgogICovCiB2b2lkIGJsa19ydW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CkBAIC05MDIsMjYgKzg4Myw1OCBAQAogRVhQT1JUX1NZTUJPTChibGtfZ2V0X3JlcXVlc3QpOwogCiAvKioKLSAqIGJsa19zdGFydF9xdWV1ZWluZyAtIGluaXRpYXRlIGRpc3BhdGNoIG9mIHJlcXVlc3RzIHRvIGRldmljZQotICogQHE6CQlyZXF1ZXN0IHF1ZXVlIHRvIGtpY2sgaW50byBnZWFyCisgKiBibGtfbWFrZV9yZXF1ZXN0IC0gZ2l2ZW4gYSBiaW8sIGFsbG9jYXRlIGEgY29ycmVzcG9uZGluZyBzdHJ1Y3QgcmVxdWVzdC4KICAqCi0gKiBUaGlzIGlzIGJhc2ljYWxseSBhIGhlbHBlciB0byByZW1vdmUgdGhlIG5lZWQgdG8ga25vdyB3aGV0aGVyIGEgcXVldWUKLSAqIGlzIHBsdWdnZWQgb3Igbm90IGlmIHNvbWVvbmUganVzdCB3YW50cyB0byBpbml0aWF0ZSBkaXNwYXRjaCBvZiByZXF1ZXN0cwotICogZm9yIHRoaXMgcXVldWUuIFNob3VsZCBiZSB1c2VkIHRvIHN0YXJ0IHF1ZXVlaW5nIG9uIGEgZGV2aWNlIG91dHNpZGUKLSAqIG9mIC0+cmVxdWVzdF9mbigpIGNvbnRleHQuIEFsc28gc2VlIEBibGtfcnVuX3F1ZXVlLgorICogQGJpbzogIFRoZSBiaW8gZGVzY3JpYmluZyB0aGUgbWVtb3J5IG1hcHBpbmdzIHRoYXQgd2lsbCBiZSBzdWJtaXR0ZWQgZm9yIElPLgorICogICAgICAgIEl0IG1heSBiZSBhIGNoYWluZWQtYmlvIHByb3Blcmx5IGNvbnN0cnVjdGVkIGJ5IGJsb2NrL2JpbyBsYXllci4KICAqCi0gKiBUaGUgcXVldWUgbG9jayBtdXN0IGJlIGhlbGQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICogYmxrX21ha2VfcmVxdWVzdCBpcyB0aGUgcGFyYWxsZWwgb2YgZ2VuZXJpY19tYWtlX3JlcXVlc3QgZm9yIEJMT0NLX1BDCisgKiB0eXBlIGNvbW1hbmRzLiBXaGVyZSB0aGUgc3RydWN0IHJlcXVlc3QgbmVlZHMgdG8gYmUgZmFydGhlciBpbml0aWFsaXplZCBieQorICogdGhlIGNhbGxlci4gSXQgaXMgcGFzc2VkIGEgJnN0cnVjdCBiaW8sIHdoaWNoIGRlc2NyaWJlcyB0aGUgbWVtb3J5IGluZm8gb2YKKyAqIHRoZSBJL08gdHJhbnNmZXIuCisgKgorICogVGhlIGNhbGxlciBvZiBibGtfbWFrZV9yZXF1ZXN0IG11c3QgbWFrZSBzdXJlIHRoYXQgYmlfaW9fdmVjCisgKiBhcmUgc2V0IHRvIGRlc2NyaWJlIHRoZSBtZW1vcnkgYnVmZmVycy4gVGhhdCBiaW9fZGF0YV9kaXIoKSB3aWxsIHJldHVybgorICogdGhlIG5lZWRlZCBkaXJlY3Rpb24gb2YgdGhlIHJlcXVlc3QuIChBbmQgYWxsIGJpbydzIGluIHRoZSBwYXNzZWQgYmlvLWNoYWluCisgKiBhcmUgcHJvcGVybHkgc2V0IGFjY29yZGluZ2x5KQorICoKKyAqIElmIGNhbGxlZCB1bmRlciBub25lLXNsZWVwYWJsZSBjb25kaXRpb25zLCBtYXBwZWQgYmlvIGJ1ZmZlcnMgbXVzdCBub3QKKyAqIG5lZWQgYm91bmNpbmcsIGJ5IGNhbGxpbmcgdGhlIGFwcHJvcHJpYXRlIG1hc2tlZCBvciBmbGFnZ2VkIGFsbG9jYXRvciwKKyAqIHN1aXRhYmxlIGZvciB0aGUgdGFyZ2V0IGRldmljZS4gT3RoZXJ3aXNlIHRoZSBjYWxsIHRvIGJsa19xdWV1ZV9ib3VuY2Ugd2lsbAorICogQlVHLgorICoKKyAqIFdBUk5JTkc6IFdoZW4gYWxsb2NhdGluZy9jbG9uaW5nIGEgYmlvLWNoYWluLCBjYXJlZnVsIGNvbnNpZGVyYXRpb24gc2hvdWxkIGJlCisgKiBnaXZlbiB0byBob3cgeW91IGFsbG9jYXRlIGJpb3MuIEluIHBhcnRpY3VsYXIsIHlvdSBjYW5ub3QgdXNlIF9fR0ZQX1dBSVQgZm9yCisgKiBhbnl0aGluZyBidXQgdGhlIGZpcnN0IGJpbyBpbiB0aGUgY2hhaW4uIE90aGVyd2lzZSB5b3UgcmlzayB3YWl0aW5nIGZvciBJTworICogY29tcGxldGlvbiBvZiBhIGJpbyB0aGF0IGhhc24ndCBiZWVuIHN1Ym1pdHRlZCB5ZXQsIHRodXMgcmVzdWx0aW5nIGluIGEKKyAqIGRlYWRsb2NrLiBBbHRlcm5hdGl2ZWx5IGJpb3Mgc2hvdWxkIGJlIGFsbG9jYXRlZCB1c2luZyBiaW9fa21hbGxvYygpIGluc3RlYWQKKyAqIG9mIGJpb19hbGxvYygpLCBhcyB0aGF0IGF2b2lkcyB0aGUgbWVtcG9vbCBkZWFkbG9jay4KKyAqIElmIHBvc3NpYmxlIGEgYmlnIElPIHNob3VsZCBiZSBzcGxpdCBpbnRvIHNtYWxsZXIgcGFydHMgd2hlbiBhbGxvY2F0aW9uCisgKiBmYWlscy4gUGFydGlhbCBhbGxvY2F0aW9uIHNob3VsZCBub3QgYmUgYW4gZXJyb3IsIG9yIHlvdSByaXNrIGEgbGl2ZS1sb2NrLgogICovCi12b2lkIGJsa19zdGFydF9xdWV1ZWluZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3N0cnVjdCByZXF1ZXN0ICpibGtfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sCisJCQkJIGdmcF90IGdmcF9tYXNrKQogewotCWlmICghYmxrX3F1ZXVlX3BsdWdnZWQocSkpIHsKLQkJaWYgKHVubGlrZWx5KGJsa19xdWV1ZV9zdG9wcGVkKHEpKSkKLQkJCXJldHVybjsKLQkJcS0+cmVxdWVzdF9mbihxKTsKLQl9IGVsc2UKLQkJX19nZW5lcmljX3VucGx1Z19kZXZpY2UocSk7CisJc3RydWN0IHJlcXVlc3QgKnJxID0gYmxrX2dldF9yZXF1ZXN0KHEsIGJpb19kYXRhX2RpcihiaW8pLCBnZnBfbWFzayk7CisKKwlpZiAodW5saWtlbHkoIXJxKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlmb3JfZWFjaF9iaW8oYmlvKSB7CisJCXN0cnVjdCBiaW8gKmJvdW5jZV9iaW8gPSBiaW87CisJCWludCByZXQ7CisKKwkJYmxrX3F1ZXVlX2JvdW5jZShxLCAmYm91bmNlX2Jpbyk7CisJCXJldCA9IGJsa19ycV9hcHBlbmRfYmlvKHEsIHJxLCBib3VuY2VfYmlvKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCWJsa19wdXRfcmVxdWVzdChycSk7CisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCQl9CisJfQorCisJcmV0dXJuIHJxOwogfQotRVhQT1JUX1NZTUJPTChibGtfc3RhcnRfcXVldWVpbmcpOworRVhQT1JUX1NZTUJPTChibGtfbWFrZV9yZXF1ZXN0KTsKIAogLyoqCiAgKiBibGtfcmVxdWV1ZV9yZXF1ZXN0IC0gcHV0IGEgcmVxdWVzdCBiYWNrIG9uIHF1ZXVlCkBAIC05NDIsNiArOTU1LDggQEAKIAlpZiAoYmxrX3JxX3RhZ2dlZChycSkpCiAJCWJsa19xdWV1ZV9lbmRfdGFnKHEsIHJxKTsKIAorCUJVR19PTihibGtfcXVldWVkX3JxKHJxKSk7CisKIAllbHZfcmVxdWV1ZV9yZXF1ZXN0KHEsIHJxKTsKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3JlcXVldWVfcmVxdWVzdCk7CkBAIC05NzcsNyArOTkyLDYgQEAKIAkgKiBiYXJyaWVyCiAJICovCiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfU1BFQ0lBTDsKLQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9TT0ZUQkFSUklFUjsKIAogCXJxLT5zcGVjaWFsID0gZGF0YTsKIApAQCAtOTkxLDcgKzEwMDUsNyBAQAogCiAJZHJpdmVfc3RhdF9hY2N0KHJxLCAxKTsKIAlfX2Vsdl9hZGRfcmVxdWVzdChxLCBycSwgd2hlcmUsIDApOwotCWJsa19zdGFydF9xdWV1ZWluZyhxKTsKKwlfX2Jsa19ydW5fcXVldWUocSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19pbnNlcnRfcmVxdWVzdCk7CkBAIC0xMTEzLDE2ICsxMTI3LDEzIEBACiAJaWYgKGJpb19mYWlsZmFzdF9kcml2ZXIoYmlvKSkKIAkJcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX0ZBSUxGQVNUX0RSSVZFUjsKIAotCS8qCi0JICogUkVRX0JBUlJJRVIgaW1wbGllcyBubyBtZXJnaW5nLCBidXQgbGV0cyBtYWtlIGl0IGV4cGxpY2l0Ci0JICovCiAJaWYgKHVubGlrZWx5KGJpb19kaXNjYXJkKGJpbykpKSB7CiAJCXJlcS0+Y21kX2ZsYWdzIHw9IFJFUV9ESVNDQVJEOwogCQlpZiAoYmlvX2JhcnJpZXIoYmlvKSkKIAkJCXJlcS0+Y21kX2ZsYWdzIHw9IFJFUV9TT0ZUQkFSUklFUjsKIAkJcmVxLT5xLT5wcmVwYXJlX2Rpc2NhcmRfZm4ocmVxLT5xLCByZXEpOwogCX0gZWxzZSBpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmlvKSkpCi0JCXJlcS0+Y21kX2ZsYWdzIHw9IChSRVFfSEFSREJBUlJJRVIgfCBSRVFfTk9NRVJHRSk7CisJCXJlcS0+Y21kX2ZsYWdzIHw9IFJFUV9IQVJEQkFSUklFUjsKIAogCWlmIChiaW9fc3luYyhiaW8pKQogCQlyZXEtPmNtZF9mbGFncyB8PSBSRVFfUldfU1lOQzsKQEAgLTExMzIsOSArMTE0Myw4IEBACiAJCXJlcS0+Y21kX2ZsYWdzIHw9IFJFUV9OT0lETEU7CiAKIAlyZXEtPmVycm9ycyA9IDA7Ci0JcmVxLT5oYXJkX3NlY3RvciA9IHJlcS0+c2VjdG9yID0gYmlvLT5iaV9zZWN0b3I7CisJcmVxLT5fX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCXJlcS0+aW9wcmlvID0gYmlvX3ByaW8oYmlvKTsKLQlyZXEtPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCWJsa19ycV9iaW9fcHJlcChyZXEtPnEsIHJlcSwgYmlvKTsKIH0KIApAQCAtMTE1MCwxNCArMTE2MCwxMyBAQAogc3RhdGljIGludCBfX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKQogewogCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0JaW50IGVsX3JldCwgbnJfc2VjdG9yczsKKwlpbnQgZWxfcmV0OworCXVuc2lnbmVkIGludCBieXRlcyA9IGJpby0+Ymlfc2l6ZTsKIAljb25zdCB1bnNpZ25lZCBzaG9ydCBwcmlvID0gYmlvX3ByaW8oYmlvKTsKIAljb25zdCBpbnQgc3luYyA9IGJpb19zeW5jKGJpbyk7CiAJY29uc3QgaW50IHVucGx1ZyA9IGJpb191bnBsdWcoYmlvKTsKIAlpbnQgcndfZmxhZ3M7CiAKLQlucl9zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKLQogCS8qCiAJICogbG93IGxldmVsIGRyaXZlciBjYW4gaW5kaWNhdGUgdGhhdCBpdCB3YW50cyBwYWdlcyBhYm92ZSBhCiAJICogY2VydGFpbiBsaW1pdCBib3VuY2VkIHRvIGxvdyBtZW1vcnkgKGllIGZvciBoaWdobWVtLCBvciBldmVuCkBAIC0xMTgyLDcgKzExOTEsNyBAQAogCiAJCXJlcS0+YmlvdGFpbC0+YmlfbmV4dCA9IGJpbzsKIAkJcmVxLT5iaW90YWlsID0gYmlvOwotCQlyZXEtPm5yX3NlY3RvcnMgPSByZXEtPmhhcmRfbnJfc2VjdG9ycyArPSBucl9zZWN0b3JzOworCQlyZXEtPl9fZGF0YV9sZW4gKz0gYnl0ZXM7CiAJCXJlcS0+aW9wcmlvID0gaW9wcmlvX2Jlc3QocmVxLT5pb3ByaW8sIHByaW8pOwogCQlpZiAoIWJsa19ycV9jcHVfdmFsaWQocmVxKSkKIAkJCXJlcS0+Y3B1ID0gYmlvLT5iaV9jb21wX2NwdTsKQEAgLTEyMDgsMTAgKzEyMTcsOCBAQAogCQkgKiBub3QgdG91Y2ggcmVxLT5idWZmZXIgZWl0aGVyLi4uCiAJCSAqLwogCQlyZXEtPmJ1ZmZlciA9IGJpb19kYXRhKGJpbyk7Ci0JCXJlcS0+Y3VycmVudF9ucl9zZWN0b3JzID0gYmlvX2N1cl9zZWN0b3JzKGJpbyk7Ci0JCXJlcS0+aGFyZF9jdXJfc2VjdG9ycyA9IHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzOwotCQlyZXEtPnNlY3RvciA9IHJlcS0+aGFyZF9zZWN0b3IgPSBiaW8tPmJpX3NlY3RvcjsKLQkJcmVxLT5ucl9zZWN0b3JzID0gcmVxLT5oYXJkX25yX3NlY3RvcnMgKz0gbnJfc2VjdG9yczsKKwkJcmVxLT5fX3NlY3RvciA9IGJpby0+Ymlfc2VjdG9yOworCQlyZXEtPl9fZGF0YV9sZW4gKz0gYnl0ZXM7CiAJCXJlcS0+aW9wcmlvID0gaW9wcmlvX2Jlc3QocmVxLT5pb3ByaW8sIHByaW8pOwogCQlpZiAoIWJsa19ycV9jcHVfdmFsaWQocmVxKSkKIAkJCXJlcS0+Y3B1ID0gYmlvLT5iaV9jb21wX2NwdTsKQEAgLTEyNzcsNyArMTI4NCw3IEBACiAJCWJpby0+YmlfYmRldiA9IGJkZXYtPmJkX2NvbnRhaW5zOwogCiAJCXRyYWNlX2Jsb2NrX3JlbWFwKGJkZXZfZ2V0X3F1ZXVlKGJpby0+YmlfYmRldiksIGJpbywKLQkJCQkgICAgYmRldi0+YmRfZGV2LCBiaW8tPmJpX3NlY3RvciwKKwkJCQkgICAgYmRldi0+YmRfZGV2LAogCQkJCSAgICBiaW8tPmJpX3NlY3RvciAtIHAtPnN0YXJ0X3NlY3QpOwogCX0KIH0KQEAgLTE0MjIsMTEgKzE0MjksMTEgQEAKIAkJCWdvdG8gZW5kX2lvOwogCQl9CiAKLQkJaWYgKHVubGlrZWx5KG5yX3NlY3RvcnMgPiBxLT5tYXhfaHdfc2VjdG9ycykpIHsKKwkJaWYgKHVubGlrZWx5KG5yX3NlY3RvcnMgPiBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSkpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiYmlvIHRvbyBiaWcgZGV2aWNlICVzICgldSA+ICV1KVxuIiwKLQkJCQliZGV2bmFtZShiaW8tPmJpX2JkZXYsIGIpLAotCQkJCWJpb19zZWN0b3JzKGJpbyksCi0JCQkJcS0+bWF4X2h3X3NlY3RvcnMpOworCQkJICAgICAgIGJkZXZuYW1lKGJpby0+YmlfYmRldiwgYiksCisJCQkgICAgICAgYmlvX3NlY3RvcnMoYmlvKSwKKwkJCSAgICAgICBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSk7CiAJCQlnb3RvIGVuZF9pbzsKIAkJfQogCkBAIC0xNDQ2LDggKzE0NTMsNyBAQAogCQkJZ290byBlbmRfaW87CiAKIAkJaWYgKG9sZF9zZWN0b3IgIT0gLTEpCi0JCQl0cmFjZV9ibG9ja19yZW1hcChxLCBiaW8sIG9sZF9kZXYsIGJpby0+Ymlfc2VjdG9yLAotCQkJCQkgICAgb2xkX3NlY3Rvcik7CisJCQl0cmFjZV9ibG9ja19yZW1hcChxLCBiaW8sIG9sZF9kZXYsIG9sZF9zZWN0b3IpOwogCiAJCXRyYWNlX2Jsb2NrX2Jpb19xdWV1ZShxLCBiaW8pOwogCkBAIC0xNTkzLDggKzE1OTksOCBAQAogICovCiBpbnQgYmxrX3JxX2NoZWNrX2xpbWl0cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCWlmIChycS0+bnJfc2VjdG9ycyA+IHEtPm1heF9zZWN0b3JzIHx8Ci0JICAgIHJxLT5kYXRhX2xlbiA+IHEtPm1heF9od19zZWN0b3JzIDw8IDkpIHsKKwlpZiAoYmxrX3JxX3NlY3RvcnMocnEpID4gcXVldWVfbWF4X3NlY3RvcnMocSkgfHwKKwkgICAgYmxrX3JxX2J5dGVzKHJxKSA+IHF1ZXVlX21heF9od19zZWN0b3JzKHEpIDw8IDkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogb3ZlciBtYXggc2l6ZSBsaW1pdC5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTYwNiw4ICsxNjEyLDggQEAKIAkgKiBsaW1pdGF0aW9uLgogCSAqLwogCWJsa19yZWNhbGNfcnFfc2VnbWVudHMocnEpOwotCWlmIChycS0+bnJfcGh5c19zZWdtZW50cyA+IHEtPm1heF9waHlzX3NlZ21lbnRzIHx8Ci0JICAgIHJxLT5ucl9waHlzX3NlZ21lbnRzID4gcS0+bWF4X2h3X3NlZ21lbnRzKSB7CisJaWYgKHJxLT5ucl9waHlzX3NlZ21lbnRzID4gcXVldWVfbWF4X3BoeXNfc2VnbWVudHMocSkgfHwKKwkgICAgcnEtPm5yX3BoeXNfc2VnbWVudHMgPiBxdWV1ZV9tYXhfaHdfc2VnbWVudHMocSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogb3ZlciBtYXggc2VnbWVudHMgbGltaXQuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE2NTEsNDAgKzE2NTcsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJsa19pbnNlcnRfY2xvbmVkX3JlcXVlc3QpOwogCi0vKioKLSAqIGJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QgLSBkZXF1ZXVlIHJlcXVlc3QgYW5kIHN0YXJ0IHRpbWVvdXQgdGltZXIKLSAqIEByZXE6IHJlcXVlc3QgdG8gZGVxdWV1ZQotICoKLSAqIERlcXVldWUgQHJlcSBhbmQgc3RhcnQgdGltZW91dCB0aW1lciBvbiBpdC4gIFRoaXMgaGFuZHMgb2ZmIHRoZQotICogcmVxdWVzdCB0byB0aGUgZHJpdmVyLgotICoKLSAqIEJsb2NrIGludGVybmFsIGZ1bmN0aW9ucyB3aGljaCBkb24ndCB3YW50IHRvIHN0YXJ0IHRpbWVyIHNob3VsZAotICogY2FsbCBlbHZfZGVxdWV1ZV9yZXF1ZXN0KCkuCi0gKi8KLXZvaWQgYmxrZGV2X2RlcXVldWVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQotewotCWVsdl9kZXF1ZXVlX3JlcXVlc3QocmVxLT5xLCByZXEpOwotCi0JLyoKLQkgKiBXZSBhcmUgbm93IGhhbmRpbmcgdGhlIHJlcXVlc3QgdG8gdGhlIGhhcmR3YXJlLCBhZGQgdGhlCi0JICogdGltZW91dCBoYW5kbGVyLgotCSAqLwotCWJsa19hZGRfdGltZXIocmVxKTsKLX0KLUVYUE9SVF9TWU1CT0woYmxrZGV2X2RlcXVldWVfcmVxdWVzdCk7Ci0KIHN0YXRpYyB2b2lkIGJsa19hY2NvdW50X2lvX2NvbXBsZXRpb24oc3RydWN0IHJlcXVlc3QgKnJlcSwgdW5zaWduZWQgaW50IGJ5dGVzKQogewotCWlmICghYmxrX2RvX2lvX3N0YXQocmVxKSkKLQkJcmV0dXJuOwotCi0JaWYgKGJsa19mc19yZXF1ZXN0KHJlcSkpIHsKKwlpZiAoYmxrX2RvX2lvX3N0YXQocmVxKSkgewogCQljb25zdCBpbnQgcncgPSBycV9kYXRhX2RpcihyZXEpOwogCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OwogCQlpbnQgY3B1OwogCiAJCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7Ci0JCXBhcnQgPSBkaXNrX21hcF9zZWN0b3JfcmN1KHJlcS0+cnFfZGlzaywgcmVxLT5zZWN0b3IpOworCQlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShyZXEtPnJxX2Rpc2ssIGJsa19ycV9wb3MocmVxKSk7CiAJCXBhcnRfc3RhdF9hZGQoY3B1LCBwYXJ0LCBzZWN0b3JzW3J3XSwgYnl0ZXMgPj4gOSk7CiAJCXBhcnRfc3RhdF91bmxvY2soKTsKIAl9CkBAIC0xNjkyLDIyICsxNjczLDE5IEBACiAKIHN0YXRpYyB2b2lkIGJsa19hY2NvdW50X2lvX2RvbmUoc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKLQlpZiAoIWJsa19kb19pb19zdGF0KHJlcSkpCi0JCXJldHVybjsKLQogCS8qCiAJICogQWNjb3VudCBJTyBjb21wbGV0aW9uLiAgYmFyX3JxIGlzbid0IGFjY291bnRlZCBhcyBhIG5vcm1hbAogCSAqIElPIG9uIHF1ZXVlaW5nIG5vciBjb21wbGV0aW9uLiAgQWNjb3VudGluZyB0aGUgY29udGFpbmluZwogCSAqIHJlcXVlc3QgaXMgZW5vdWdoLgogCSAqLwotCWlmIChibGtfZnNfcmVxdWVzdChyZXEpICYmIHJlcSAhPSAmcmVxLT5xLT5iYXJfcnEpIHsKKwlpZiAoYmxrX2RvX2lvX3N0YXQocmVxKSAmJiByZXEgIT0gJnJlcS0+cS0+YmFyX3JxKSB7CiAJCXVuc2lnbmVkIGxvbmcgZHVyYXRpb24gPSBqaWZmaWVzIC0gcmVxLT5zdGFydF90aW1lOwogCQljb25zdCBpbnQgcncgPSBycV9kYXRhX2RpcihyZXEpOwogCQlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0OwogCQlpbnQgY3B1OwogCiAJCWNwdSA9IHBhcnRfc3RhdF9sb2NrKCk7Ci0JCXBhcnQgPSBkaXNrX21hcF9zZWN0b3JfcmN1KHJlcS0+cnFfZGlzaywgcmVxLT5zZWN0b3IpOworCQlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShyZXEtPnJxX2Rpc2ssIGJsa19ycV9wb3MocmVxKSk7CiAKIAkJcGFydF9zdGF0X2luYyhjcHUsIHBhcnQsIGlvc1tyd10pOwogCQlwYXJ0X3N0YXRfYWRkKGNwdSwgcGFydCwgdGlja3NbcnddLCBkdXJhdGlvbik7CkBAIC0xNzE5LDM4ICsxNjk3LDIyNiBAQAogfQogCiAvKioKLSAqIF9fZW5kX3RoYXRfcmVxdWVzdF9maXJzdCAtIGVuZCBJL08gb24gYSByZXF1ZXN0Ci0gKiBAcmVxOiAgICAgIHRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAotICogQGVycm9yOiAgICAlMCBmb3Igc3VjY2VzcywgPCAlMCBmb3IgZXJyb3IKLSAqIEBucl9ieXRlczogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlCisgKiBibGtfcGVla19yZXF1ZXN0IC0gcGVlayBhdCB0aGUgdG9wIG9mIGEgcmVxdWVzdCBxdWV1ZQorICogQHE6IHJlcXVlc3QgcXVldWUgdG8gcGVlayBhdAogICoKICAqIERlc2NyaXB0aW9uOgotICogICAgIEVuZHMgSS9PIG9uIGEgbnVtYmVyIG9mIGJ5dGVzIGF0dGFjaGVkIHRvIEByZXEsIGFuZCBzZXRzIGl0IHVwCi0gKiAgICAgZm9yIHRoZSBuZXh0IHJhbmdlIG9mIHNlZ21lbnRzIChpZiBhbnkpIGluIHRoZSBjbHVzdGVyLgorICogICAgIFJldHVybiB0aGUgcmVxdWVzdCBhdCB0aGUgdG9wIG9mIEBxLiAgVGhlIHJldHVybmVkIHJlcXVlc3QKKyAqICAgICBzaG91bGQgYmUgc3RhcnRlZCB1c2luZyBibGtfc3RhcnRfcmVxdWVzdCgpIGJlZm9yZSBMTEQgc3RhcnRzCisgKiAgICAgcHJvY2Vzc2luZyBpdC4KICAqCiAgKiBSZXR1cm46Ci0gKiAgICAgJTAgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdCwgY2FsbCBlbmRfdGhhdF9yZXF1ZXN0X2xhc3QoKQotICogICAgICUxIC0gc3RpbGwgYnVmZmVycyBwZW5kaW5nIGZvciB0aGlzIHJlcXVlc3QKKyAqICAgICBQb2ludGVyIHRvIHRoZSByZXF1ZXN0IGF0IHRoZSB0b3Agb2YgQHEgaWYgYXZhaWxhYmxlLiAgTnVsbAorICogICAgIG90aGVyd2lzZS4KKyAqCisgKiBDb250ZXh0OgorICogICAgIHF1ZXVlX2xvY2sgbXVzdCBiZSBoZWxkLgorICovCitzdHJ1Y3QgcmVxdWVzdCAqYmxrX3BlZWtfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisJaW50IHJldDsKKworCXdoaWxlICgocnEgPSBfX2Vsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpIHsKKwkJaWYgKCEocnEtPmNtZF9mbGFncyAmIFJFUV9TVEFSVEVEKSkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIGRldmljZSBkcml2ZXIKKwkJCSAqIHNlZXMgdGhpcyByZXF1ZXN0IChwb3NzaWJseSBhZnRlcgorCQkJICogcmVxdWV1ZWluZykuICBOb3RpZnkgSU8gc2NoZWR1bGVyLgorCQkJICovCisJCQlpZiAoYmxrX3NvcnRlZF9ycShycSkpCisJCQkJZWx2X2FjdGl2YXRlX3JxKHEsIHJxKTsKKworCQkJLyoKKwkJCSAqIGp1c3QgbWFyayBhcyBzdGFydGVkIGV2ZW4gaWYgd2UgZG9uJ3Qgc3RhcnQKKwkJCSAqIGl0LCBhIHJlcXVlc3QgdGhhdCBoYXMgYmVlbiBkZWxheWVkIHNob3VsZAorCQkJICogbm90IGJlIHBhc3NlZCBieSBuZXcgaW5jb21pbmcgcmVxdWVzdHMKKwkJCSAqLworCQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfU1RBUlRFRDsKKwkJCXRyYWNlX2Jsb2NrX3JxX2lzc3VlKHEsIHJxKTsKKwkJfQorCisJCWlmICghcS0+Ym91bmRhcnlfcnEgfHwgcS0+Ym91bmRhcnlfcnEgPT0gcnEpIHsKKwkJCXEtPmVuZF9zZWN0b3IgPSBycV9lbmRfc2VjdG9yKHJxKTsKKwkJCXEtPmJvdW5kYXJ5X3JxID0gTlVMTDsKKwkJfQorCisJCWlmIChycS0+Y21kX2ZsYWdzICYgUkVRX0RPTlRQUkVQKQorCQkJYnJlYWs7CisKKwkJaWYgKHEtPmRtYV9kcmFpbl9zaXplICYmIGJsa19ycV9ieXRlcyhycSkpIHsKKwkJCS8qCisJCQkgKiBtYWtlIHN1cmUgc3BhY2UgZm9yIHRoZSBkcmFpbiBhcHBlYXJzIHdlCisJCQkgKiBrbm93IHdlIGNhbiBkbyB0aGlzIGJlY2F1c2UgbWF4X2h3X3NlZ21lbnRzCisJCQkgKiBoYXMgYmVlbiBhZGp1c3RlZCB0byBiZSBvbmUgZmV3ZXIgdGhhbiB0aGUKKwkJCSAqIGRldmljZSBjYW4gaGFuZGxlCisJCQkgKi8KKwkJCXJxLT5ucl9waHlzX3NlZ21lbnRzKys7CisJCX0KKworCQlpZiAoIXEtPnByZXBfcnFfZm4pCisJCQlicmVhazsKKworCQlyZXQgPSBxLT5wcmVwX3JxX2ZuKHEsIHJxKTsKKwkJaWYgKHJldCA9PSBCTEtQUkVQX09LKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChyZXQgPT0gQkxLUFJFUF9ERUZFUikgeworCQkJLyoKKwkJCSAqIHRoZSByZXF1ZXN0IG1heSBoYXZlIGJlZW4gKHBhcnRpYWxseSkgcHJlcHBlZC4KKwkJCSAqIHdlIG5lZWQgdG8ga2VlcCB0aGlzIHJlcXVlc3QgaW4gdGhlIGZyb250IHRvCisJCQkgKiBhdm9pZCByZXNvdXJjZSBkZWFkbG9jay4gIFJFUV9TVEFSVEVEIHdpbGwKKwkJCSAqIHByZXZlbnQgb3RoZXIgZnMgcmVxdWVzdHMgZnJvbSBwYXNzaW5nIHRoaXMgb25lLgorCQkJICovCisJCQlpZiAocS0+ZG1hX2RyYWluX3NpemUgJiYgYmxrX3JxX2J5dGVzKHJxKSAmJgorCQkJICAgICEocnEtPmNtZF9mbGFncyAmIFJFUV9ET05UUFJFUCkpIHsKKwkJCQkvKgorCQkJCSAqIHJlbW92ZSB0aGUgc3BhY2UgZm9yIHRoZSBkcmFpbiB3ZSBhZGRlZAorCQkJCSAqIHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IGFnYWluCisJCQkJICovCisJCQkJLS1ycS0+bnJfcGh5c19zZWdtZW50czsKKwkJCX0KKworCQkJcnEgPSBOVUxMOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAocmV0ID09IEJMS1BSRVBfS0lMTCkgeworCQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfUVVJRVQ7CisJCQkvKgorCQkJICogTWFyayB0aGlzIHJlcXVlc3QgYXMgc3RhcnRlZCBzbyB3ZSBkb24ndCB0cmlnZ2VyCisJCQkgKiBhbnkgZGVidWcgbG9naWMgaW4gdGhlIGVuZCBJL08gcGF0aC4KKwkJCSAqLworCQkJYmxrX3N0YXJ0X3JlcXVlc3QocnEpOworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJxLCAtRUlPKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGJhZCByZXR1cm49JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcnE7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19wZWVrX3JlcXVlc3QpOworCit2b2lkIGJsa19kZXF1ZXVlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcnEtPnE7CisKKwlCVUdfT04obGlzdF9lbXB0eSgmcnEtPnF1ZXVlbGlzdCkpOworCUJVR19PTihFTFZfT05fSEFTSChycSkpOworCisJbGlzdF9kZWxfaW5pdCgmcnEtPnF1ZXVlbGlzdCk7CisKKwkvKgorCSAqIHRoZSB0aW1lIGZyYW1lIGJldHdlZW4gYSByZXF1ZXN0IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgbGlzdHMKKwkgKiBhbmQgdG8gaXQgaXMgZnJlZWQgaXMgYWNjb3VudGVkIGFzIGlvIHRoYXQgaXMgaW4gcHJvZ3Jlc3MgYXQKKwkgKiB0aGUgZHJpdmVyIHNpZGUuCisJICovCisJaWYgKGJsa19hY2NvdW50X3JxKHJxKSkKKwkJcS0+aW5fZmxpZ2h0W3JxX2lzX3N5bmMocnEpXSsrOworfQorCisvKioKKyAqIGJsa19zdGFydF9yZXF1ZXN0IC0gc3RhcnQgcmVxdWVzdCBwcm9jZXNzaW5nIG9uIHRoZSBkcml2ZXIKKyAqIEByZXE6IHJlcXVlc3QgdG8gZGVxdWV1ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIERlcXVldWUgQHJlcSBhbmQgc3RhcnQgdGltZW91dCB0aW1lciBvbiBpdC4gIFRoaXMgaGFuZHMgb2ZmIHRoZQorICogICAgIHJlcXVlc3QgdG8gdGhlIGRyaXZlci4KKyAqCisgKiAgICAgQmxvY2sgaW50ZXJuYWwgZnVuY3Rpb25zIHdoaWNoIGRvbid0IHdhbnQgdG8gc3RhcnQgdGltZXIgc2hvdWxkCisgKiAgICAgY2FsbCBibGtfZGVxdWV1ZV9yZXF1ZXN0KCkuCisgKgorICogQ29udGV4dDoKKyAqICAgICBxdWV1ZV9sb2NrIG11c3QgYmUgaGVsZC4KKyAqLwordm9pZCBibGtfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQoreworCWJsa19kZXF1ZXVlX3JlcXVlc3QocmVxKTsKKworCS8qCisJICogV2UgYXJlIG5vdyBoYW5kaW5nIHRoZSByZXF1ZXN0IHRvIHRoZSBoYXJkd2FyZSwgaW5pdGlhbGl6ZQorCSAqIHJlc2lkX2xlbiB0byBmdWxsIGNvdW50IGFuZCBhZGQgdGhlIHRpbWVvdXQgaGFuZGxlci4KKwkgKi8KKwlyZXEtPnJlc2lkX2xlbiA9IGJsa19ycV9ieXRlcyhyZXEpOworCWlmICh1bmxpa2VseShibGtfYmlkaV9ycShyZXEpKSkKKwkJcmVxLT5uZXh0X3JxLT5yZXNpZF9sZW4gPSBibGtfcnFfYnl0ZXMocmVxLT5uZXh0X3JxKTsKKworCWJsa19hZGRfdGltZXIocmVxKTsKK30KK0VYUE9SVF9TWU1CT0woYmxrX3N0YXJ0X3JlcXVlc3QpOworCisvKioKKyAqIGJsa19mZXRjaF9yZXF1ZXN0IC0gZmV0Y2ggYSByZXF1ZXN0IGZyb20gYSByZXF1ZXN0IHF1ZXVlCisgKiBAcTogcmVxdWVzdCBxdWV1ZSB0byBmZXRjaCBhIHJlcXVlc3QgZnJvbQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIFJldHVybiB0aGUgcmVxdWVzdCBhdCB0aGUgdG9wIG9mIEBxLiAgVGhlIHJlcXVlc3QgaXMgc3RhcnRlZCBvbgorICogICAgIHJldHVybiBhbmQgTExEIGNhbiBzdGFydCBwcm9jZXNzaW5nIGl0IGltbWVkaWF0ZWx5LgorICoKKyAqIFJldHVybjoKKyAqICAgICBQb2ludGVyIHRvIHRoZSByZXF1ZXN0IGF0IHRoZSB0b3Agb2YgQHEgaWYgYXZhaWxhYmxlLiAgTnVsbAorICogICAgIG90aGVyd2lzZS4KKyAqCisgKiBDb250ZXh0OgorICogICAgIHF1ZXVlX2xvY2sgbXVzdCBiZSBoZWxkLgorICovCitzdHJ1Y3QgcmVxdWVzdCAqYmxrX2ZldGNoX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJc3RydWN0IHJlcXVlc3QgKnJxOworCisJcnEgPSBibGtfcGVla19yZXF1ZXN0KHEpOworCWlmIChycSkKKwkJYmxrX3N0YXJ0X3JlcXVlc3QocnEpOworCXJldHVybiBycTsKK30KK0VYUE9SVF9TWU1CT0woYmxrX2ZldGNoX3JlcXVlc3QpOworCisvKioKKyAqIGJsa191cGRhdGVfcmVxdWVzdCAtIFNwZWNpYWwgaGVscGVyIGZ1bmN0aW9uIGZvciByZXF1ZXN0IHN0YWNraW5nIGRyaXZlcnMKKyAqIEBycToJICAgICAgdGhlIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkCisgKiBAZXJyb3I6ICAgICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgorICogQG5yX2J5dGVzOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUgQHJxCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgRW5kcyBJL08gb24gYSBudW1iZXIgb2YgYnl0ZXMgYXR0YWNoZWQgdG8gQHJxLCBidXQgZG9lc24ndCBjb21wbGV0ZQorICogICAgIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSBldmVuIGlmIEBycSBkb2Vzbid0IGhhdmUgbGVmdG92ZXIuCisgKiAgICAgSWYgQHJxIGhhcyBsZWZ0b3Zlciwgc2V0cyBpdCB1cCBmb3IgdGhlIG5leHQgcmFuZ2Ugb2Ygc2VnbWVudHMuCisgKgorICogICAgIFRoaXMgc3BlY2lhbCBoZWxwZXIgZnVuY3Rpb24gaXMgb25seSBmb3IgcmVxdWVzdCBzdGFja2luZyBkcml2ZXJzCisgKiAgICAgKGUuZy4gcmVxdWVzdC1iYXNlZCBkbSkgc28gdGhhdCB0aGV5IGNhbiBoYW5kbGUgcGFydGlhbCBjb21wbGV0aW9uLgorICogICAgIEFjdHVhbCBkZXZpY2UgZHJpdmVycyBzaG91bGQgdXNlIGJsa19lbmRfcmVxdWVzdCBpbnN0ZWFkLgorICoKKyAqICAgICBQYXNzaW5nIHRoZSByZXN1bHQgb2YgYmxrX3JxX2J5dGVzKCkgYXMgQG5yX2J5dGVzIGd1YXJhbnRlZXMKKyAqICAgICAlZmFsc2UgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgJWZhbHNlIC0gdGhpcyByZXF1ZXN0IGRvZXNuJ3QgaGF2ZSBhbnkgbW9yZSBkYXRhCisgKiAgICAgJXRydWUgIC0gdGhpcyByZXF1ZXN0IGhhcyBtb3JlIGRhdGEKICAqKi8KLXN0YXRpYyBpbnQgX19lbmRfdGhhdF9yZXF1ZXN0X2ZpcnN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIGludCBlcnJvciwKLQkJCQkgICAgaW50IG5yX2J5dGVzKQorYm9vbCBibGtfdXBkYXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yLCB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpCiB7CiAJaW50IHRvdGFsX2J5dGVzLCBiaW9fbmJ5dGVzLCBuZXh0X2lkeCA9IDA7CiAJc3RydWN0IGJpbyAqYmlvOwogCisJaWYgKCFyZXEtPmJpbykKKwkJcmV0dXJuIGZhbHNlOworCiAJdHJhY2VfYmxvY2tfcnFfY29tcGxldGUocmVxLT5xLCByZXEpOwogCiAJLyoKLQkgKiBmb3IgYSBSRVFfVFlQRV9CTE9DS19QQyByZXF1ZXN0LCB3ZSB3YW50IHRvIGNhcnJ5IGFueSBldmVudHVhbAotCSAqIHNlbnNlIGtleSB3aXRoIHVzIGFsbCB0aGUgd2F5IHRocm91Z2gKKwkgKiBGb3IgZnMgcmVxdWVzdHMsIHJxIGlzIGp1c3QgY2FycmllciBvZiBpbmRlcGVuZGVudCBiaW8ncworCSAqIGFuZCBlYWNoIHBhcnRpYWwgY29tcGxldGlvbiBzaG91bGQgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5LgorCSAqIFJlc2V0IHBlci1yZXF1ZXN0IGVycm9yIG9uIGVhY2ggcGFydGlhbCBjb21wbGV0aW9uLgorCSAqCisJICogVE9ETzogdGo6IFRoaXMgaXMgdG9vIHN1YnRsZS4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBsZXQKKwkgKiBsb3cgbGV2ZWwgZHJpdmVycyBkbyB3aGF0IHRoZXkgc2VlIGZpdC4KIAkgKi8KLQlpZiAoIWJsa19wY19yZXF1ZXN0KHJlcSkpCisJaWYgKGJsa19mc19yZXF1ZXN0KHJlcSkpCiAJCXJlcS0+ZXJyb3JzID0gMDsKIAogCWlmIChlcnJvciAmJiAoYmxrX2ZzX3JlcXVlc3QocmVxKSAmJiAhKHJlcS0+Y21kX2ZsYWdzICYgUkVRX1FVSUVUKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlbmRfcmVxdWVzdDogSS9PIGVycm9yLCBkZXYgJXMsIHNlY3RvciAlbGx1XG4iLAogCQkJCXJlcS0+cnFfZGlzayA/IHJlcS0+cnFfZGlzay0+ZGlza19uYW1lIDogIj8iLAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVxLT5zZWN0b3IpOworCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxrX3JxX3BvcyhyZXEpKTsKIAl9CiAKIAlibGtfYWNjb3VudF9pb19jb21wbGV0aW9uKHJlcSwgbnJfYnl0ZXMpOwpAQCAtMTgxMCw4ICsxOTc2LDE1IEBACiAJLyoKIAkgKiBjb21wbGV0ZWx5IGRvbmUKIAkgKi8KLQlpZiAoIXJlcS0+YmlvKQotCQlyZXR1cm4gMDsKKwlpZiAoIXJlcS0+YmlvKSB7CisJCS8qCisJCSAqIFJlc2V0IGNvdW50ZXJzIHNvIHRoYXQgdGhlIHJlcXVlc3Qgc3RhY2tpbmcgZHJpdmVyCisJCSAqIGNhbiBmaW5kIGhvdyBtYW55IGJ5dGVzIHJlbWFpbiBpbiB0aGUgcmVxdWVzdAorCQkgKiBsYXRlci4KKwkJICovCisJCXJlcS0+X19kYXRhX2xlbiA9IDA7CisJCXJldHVybiBmYWxzZTsKKwl9CiAKIAkvKgogCSAqIGlmIHRoZSByZXF1ZXN0IHdhc24ndCBjb21wbGV0ZWQsIHVwZGF0ZSBzdGF0ZQpAQCAtMTgyMywyMSArMTk5Niw1NSBAQAogCQliaW9faW92ZWMoYmlvKS0+YnZfbGVuIC09IG5yX2J5dGVzOwogCX0KIAotCWJsa19yZWNhbGNfcnFfc2VjdG9ycyhyZXEsIHRvdGFsX2J5dGVzID4+IDkpOworCXJlcS0+X19kYXRhX2xlbiAtPSB0b3RhbF9ieXRlczsKKwlyZXEtPmJ1ZmZlciA9IGJpb19kYXRhKHJlcS0+YmlvKTsKKworCS8qIHVwZGF0ZSBzZWN0b3Igb25seSBmb3IgcmVxdWVzdHMgd2l0aCBjbGVhciBkZWZpbml0aW9uIG9mIHNlY3RvciAqLworCWlmIChibGtfZnNfcmVxdWVzdChyZXEpIHx8IGJsa19kaXNjYXJkX3JxKHJlcSkpCisJCXJlcS0+X19zZWN0b3IgKz0gdG90YWxfYnl0ZXMgPj4gOTsKKworCS8qCisJICogSWYgdG90YWwgbnVtYmVyIG9mIHNlY3RvcnMgaXMgbGVzcyB0aGFuIHRoZSBmaXJzdCBzZWdtZW50CisJICogc2l6ZSwgc29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nLgorCSAqLworCWlmIChibGtfcnFfYnl0ZXMocmVxKSA8IGJsa19ycV9jdXJfYnl0ZXMocmVxKSkgeworCQlwcmludGsoS0VSTl9FUlIgImJsazogcmVxdWVzdCBib3RjaGVkXG4iKTsKKwkJcmVxLT5fX2RhdGFfbGVuID0gYmxrX3JxX2N1cl9ieXRlcyhyZXEpOworCX0KKworCS8qIHJlY2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMgKi8KIAlibGtfcmVjYWxjX3JxX3NlZ21lbnRzKHJlcSk7Ci0JcmV0dXJuIDE7CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsa191cGRhdGVfcmVxdWVzdCk7CisKK3N0YXRpYyBib29sIGJsa191cGRhdGVfYmlkaV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMsCisJCQkJICAgIHVuc2lnbmVkIGludCBiaWRpX2J5dGVzKQoreworCWlmIChibGtfdXBkYXRlX3JlcXVlc3QocnEsIGVycm9yLCBucl9ieXRlcykpCisJCXJldHVybiB0cnVlOworCisJLyogQmlkaSByZXF1ZXN0IG11c3QgYmUgY29tcGxldGVkIGFzIGEgd2hvbGUgKi8KKwlpZiAodW5saWtlbHkoYmxrX2JpZGlfcnEocnEpKSAmJgorCSAgICBibGtfdXBkYXRlX3JlcXVlc3QocnEtPm5leHRfcnEsIGVycm9yLCBiaWRpX2J5dGVzKSkKKwkJcmV0dXJuIHRydWU7CisKKwlhZGRfZGlza19yYW5kb21uZXNzKHJxLT5ycV9kaXNrKTsKKworCXJldHVybiBmYWxzZTsKIH0KIAogLyoKICAqIHF1ZXVlIGxvY2sgbXVzdCBiZSBoZWxkCiAgKi8KLXN0YXRpYyB2b2lkIGVuZF90aGF0X3JlcXVlc3RfbGFzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgZXJyb3IpCitzdGF0aWMgdm9pZCBibGtfZmluaXNoX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yKQogewogCWlmIChibGtfcnFfdGFnZ2VkKHJlcSkpCiAJCWJsa19xdWV1ZV9lbmRfdGFnKHJlcS0+cSwgcmVxKTsKIAotCWlmIChibGtfcXVldWVkX3JxKHJlcSkpCi0JCWVsdl9kZXF1ZXVlX3JlcXVlc3QocmVxLT5xLCByZXEpOworCUJVR19PTihibGtfcXVldWVkX3JxKHJlcSkpOwogCiAJaWYgKHVubGlrZWx5KGxhcHRvcF9tb2RlKSAmJiBibGtfZnNfcmVxdWVzdChyZXEpKQogCQlsYXB0b3BfaW9fY29tcGxldGlvbigpOwpAQCAtMTg1NywxMTcgKzIwNjQsNjIgQEAKIH0KIAogLyoqCi0gKiBibGtfcnFfYnl0ZXMgLSBSZXR1cm5zIGJ5dGVzIGxlZnQgdG8gY29tcGxldGUgaW4gdGhlIGVudGlyZSByZXF1ZXN0Ci0gKiBAcnE6IHRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAotICoqLwotdW5zaWduZWQgaW50IGJsa19ycV9ieXRlcyhzdHJ1Y3QgcmVxdWVzdCAqcnEpCi17Ci0JaWYgKGJsa19mc19yZXF1ZXN0KHJxKSkKLQkJcmV0dXJuIHJxLT5oYXJkX25yX3NlY3RvcnMgPDwgOTsKLQotCXJldHVybiBycS0+ZGF0YV9sZW47Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChibGtfcnFfYnl0ZXMpOwotCi0vKioKLSAqIGJsa19ycV9jdXJfYnl0ZXMgLSBSZXR1cm5zIGJ5dGVzIGxlZnQgdG8gY29tcGxldGUgaW4gdGhlIGN1cnJlbnQgc2VnbWVudAotICogQHJxOiB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKLSAqKi8KLXVuc2lnbmVkIGludCBibGtfcnFfY3VyX2J5dGVzKHN0cnVjdCByZXF1ZXN0ICpycSkKLXsKLQlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpKQotCQlyZXR1cm4gcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyA8PCA5OwotCi0JaWYgKHJxLT5iaW8pCi0JCXJldHVybiBycS0+YmlvLT5iaV9zaXplOwotCi0JcmV0dXJuIHJxLT5kYXRhX2xlbjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJsa19ycV9jdXJfYnl0ZXMpOwotCi0vKioKLSAqIGVuZF9yZXF1ZXN0IC0gZW5kIEkvTyBvbiB0aGUgY3VycmVudCBzZWdtZW50IG9mIHRoZSByZXF1ZXN0Ci0gKiBAcmVxOgl0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKLSAqIEB1cHRvZGF0ZToJZXJyb3IgdmFsdWUgb3IgJTAvJTEgdXB0b2RhdGUgZmxhZwotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgIEVuZHMgSS9PIG9uIHRoZSBjdXJyZW50IHNlZ21lbnQgb2YgYSByZXF1ZXN0LiBJZiB0aGF0IGlzIHRoZSBvbmx5Ci0gKiAgICAgcmVtYWluaW5nIHNlZ21lbnQsIHRoZSByZXF1ZXN0IGlzIGFsc28gY29tcGxldGVkIGFuZCBmcmVlZC4KLSAqCi0gKiAgICAgVGhpcyBpcyBhIHJlbW5hbnQgb2YgaG93IG9sZGVyIGJsb2NrIGRyaXZlcnMgaGFuZGxlZCBJL08gY29tcGxldGlvbnMuCi0gKiAgICAgTW9kZXJuIGRyaXZlcnMgdHlwaWNhbGx5IGVuZCBJL08gb24gdGhlIGZ1bGwgcmVxdWVzdCBpbiBvbmUgZ28sIHVubGVzcwotICogICAgIHRoZXkgaGF2ZSBhIHJlc2lkdWFsIHZhbHVlIHRvIGFjY291bnQgZm9yLiBGb3IgdGhhdCBjYXNlIHRoaXMgZnVuY3Rpb24KLSAqICAgICBpc24ndCByZWFsbHkgdXNlZnVsLCB1bmxlc3MgdGhlIHJlc2lkdWFsIGp1c3QgaGFwcGVucyB0byBiZSB0aGUKLSAqICAgICBmdWxsIGN1cnJlbnQgc2VnbWVudC4gSW4gb3RoZXIgd29yZHMsIGRvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGluIG5ldwotICogICAgIGNvZGUuIFVzZSBibGtfZW5kX3JlcXVlc3QoKSBvciBfX2Jsa19lbmRfcmVxdWVzdCgpIHRvIGVuZCBhIHJlcXVlc3QuCi0gKiovCi12b2lkIGVuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIGludCB1cHRvZGF0ZSkKLXsKLQlpbnQgZXJyb3IgPSAwOwotCi0JaWYgKHVwdG9kYXRlIDw9IDApCi0JCWVycm9yID0gdXB0b2RhdGUgPyB1cHRvZGF0ZSA6IC1FSU87Ci0KLQlfX2Jsa19lbmRfcmVxdWVzdChyZXEsIGVycm9yLCByZXEtPmhhcmRfY3VyX3NlY3RvcnMgPDwgOSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGVuZF9yZXF1ZXN0KTsKLQotc3RhdGljIGludCBlbmRfdGhhdF9yZXF1ZXN0X2RhdGEoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsCi0JCQkJIHVuc2lnbmVkIGludCBucl9ieXRlcywgdW5zaWduZWQgaW50IGJpZGlfYnl0ZXMpCi17Ci0JaWYgKHJxLT5iaW8pIHsKLQkJaWYgKF9fZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgZXJyb3IsIG5yX2J5dGVzKSkKLQkJCXJldHVybiAxOwotCi0JCS8qIEJpZGkgcmVxdWVzdCBtdXN0IGJlIGNvbXBsZXRlZCBhcyBhIHdob2xlICovCi0JCWlmIChibGtfYmlkaV9ycShycSkgJiYKLQkJICAgIF9fZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycS0+bmV4dF9ycSwgZXJyb3IsIGJpZGlfYnl0ZXMpKQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogYmxrX2VuZF9pbyAtIEdlbmVyaWMgZW5kX2lvIGZ1bmN0aW9uIHRvIGNvbXBsZXRlIGEgcmVxdWVzdC4KLSAqIEBycTogICAgICAgICAgIHRoZSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAotICogQGVycm9yOiAgICAgICAgJTAgZm9yIHN1Y2Nlc3MsIDwgJTAgZm9yIGVycm9yCi0gKiBAbnJfYnl0ZXM6ICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUgQHJxCi0gKiBAYmlkaV9ieXRlczogICBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUgQHJxLT5uZXh0X3JxCi0gKiBAZHJ2X2NhbGxiYWNrOiBmdW5jdGlvbiBjYWxsZWQgYmV0d2VlbiBjb21wbGV0aW9uIG9mIGJpb3MgaW4gdGhlIHJlcXVlc3QKLSAqICAgICAgICAgICAgICAgIGFuZCBjb21wbGV0aW9uIG9mIHRoZSByZXF1ZXN0LgotICogICAgICAgICAgICAgICAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgbm9uICUwLCB0aGlzIGhlbHBlciByZXR1cm5zIHdpdGhvdXQKLSAqICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gb2YgdGhlIHJlcXVlc3QuCisgKiBibGtfZW5kX2JpZGlfcmVxdWVzdCAtIENvbXBsZXRlIGEgYmlkaSByZXF1ZXN0CisgKiBAcnE6ICAgICAgICAgdGhlIHJlcXVlc3QgdG8gY29tcGxldGUKKyAqIEBlcnJvcjogICAgICAlMCBmb3Igc3VjY2VzcywgPCAlMCBmb3IgZXJyb3IKKyAqIEBucl9ieXRlczogICBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUgQHJxCisgKiBAYmlkaV9ieXRlczogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlIEBycS0+bmV4dF9ycQogICoKICAqIERlc2NyaXB0aW9uOgogICogICAgIEVuZHMgSS9PIG9uIGEgbnVtYmVyIG9mIGJ5dGVzIGF0dGFjaGVkIHRvIEBycSBhbmQgQHJxLT5uZXh0X3JxLgotICogICAgIElmIEBycSBoYXMgbGVmdG92ZXIsIHNldHMgaXQgdXAgZm9yIHRoZSBuZXh0IHJhbmdlIG9mIHNlZ21lbnRzLgorICogICAgIERyaXZlcnMgdGhhdCBzdXBwb3J0cyBiaWRpIGNhbiBzYWZlbHkgY2FsbCB0aGlzIG1lbWJlciBmb3IgYW55CisgKiAgICAgdHlwZSBvZiByZXF1ZXN0LCBiaWRpIG9yIHVuaS4gIEluIHRoZSBsYXRlciBjYXNlIEBiaWRpX2J5dGVzIGlzCisgKiAgICAganVzdCBpZ25vcmVkLgogICoKICAqIFJldHVybjoKLSAqICAgICAlMCAtIHdlIGFyZSBkb25lIHdpdGggdGhpcyByZXF1ZXN0Ci0gKiAgICAgJTEgLSB0aGlzIHJlcXVlc3QgaXMgbm90IGZyZWVkIHlldCwgaXQgc3RpbGwgaGFzIHBlbmRpbmcgYnVmZmVycy4KKyAqICAgICAlZmFsc2UgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAorICogICAgICV0cnVlICAtIHN0aWxsIGJ1ZmZlcnMgcGVuZGluZyBmb3IgdGhpcyByZXF1ZXN0CiAgKiovCi1zdGF0aWMgaW50IGJsa19lbmRfaW8oc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcywKLQkJICAgICAgdW5zaWduZWQgaW50IGJpZGlfYnl0ZXMsCi0JCSAgICAgIGludCAoZHJ2X2NhbGxiYWNrKShzdHJ1Y3QgcmVxdWVzdCAqKSkKK3N0YXRpYyBib29sIGJsa19lbmRfYmlkaV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLAorCQkJCSB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMsIHVuc2lnbmVkIGludCBiaWRpX2J5dGVzKQogewogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcnEtPnE7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDBVTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKGVuZF90aGF0X3JlcXVlc3RfZGF0YShycSwgZXJyb3IsIG5yX2J5dGVzLCBiaWRpX2J5dGVzKSkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBTcGVjaWFsIGZlYXR1cmUgZm9yIHRyaWNreSBkcml2ZXJzICovCi0JaWYgKGRydl9jYWxsYmFjayAmJiBkcnZfY2FsbGJhY2socnEpKQotCQlyZXR1cm4gMTsKLQotCWFkZF9kaXNrX3JhbmRvbW5lc3MocnEtPnJxX2Rpc2spOworCWlmIChibGtfdXBkYXRlX2JpZGlfcmVxdWVzdChycSwgZXJyb3IsIG5yX2J5dGVzLCBiaWRpX2J5dGVzKSkKKwkJcmV0dXJuIHRydWU7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJxLCBlcnJvcik7CisJYmxrX2ZpbmlzaF9yZXF1ZXN0KHJxLCBlcnJvcik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogX19ibGtfZW5kX2JpZGlfcmVxdWVzdCAtIENvbXBsZXRlIGEgYmlkaSByZXF1ZXN0IHdpdGggcXVldWUgbG9jayBoZWxkCisgKiBAcnE6ICAgICAgICAgdGhlIHJlcXVlc3QgdG8gY29tcGxldGUKKyAqIEBlcnJvcjogICAgICAlMCBmb3Igc3VjY2VzcywgPCAlMCBmb3IgZXJyb3IKKyAqIEBucl9ieXRlczogICBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUgQHJxCisgKiBAYmlkaV9ieXRlczogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlIEBycS0+bmV4dF9ycQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIElkZW50aWNhbCB0byBibGtfZW5kX2JpZGlfcmVxdWVzdCgpIGV4Y2VwdCB0aGF0IHF1ZXVlIGxvY2sgaXMKKyAqICAgICBhc3N1bWVkIHRvIGJlIGxvY2tlZCBvbiBlbnRyeSBhbmQgcmVtYWlucyBzbyBvbiByZXR1cm4uCisgKgorICogUmV0dXJuOgorICogICAgICVmYWxzZSAtIHdlIGFyZSBkb25lIHdpdGggdGhpcyByZXF1ZXN0CisgKiAgICAgJXRydWUgIC0gc3RpbGwgYnVmZmVycyBwZW5kaW5nIGZvciB0aGlzIHJlcXVlc3QKKyAqKi8KK3N0YXRpYyBib29sIF9fYmxrX2VuZF9iaWRpX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsCisJCQkJICAgdW5zaWduZWQgaW50IG5yX2J5dGVzLCB1bnNpZ25lZCBpbnQgYmlkaV9ieXRlcykKK3sKKwlpZiAoYmxrX3VwZGF0ZV9iaWRpX3JlcXVlc3QocnEsIGVycm9yLCBucl9ieXRlcywgYmlkaV9ieXRlcykpCisJCXJldHVybiB0cnVlOworCisJYmxrX2ZpbmlzaF9yZXF1ZXN0KHJxLCBlcnJvcik7CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qKgpAQCAtMTk4MSwxNiArMjEzMyw1NSBAQAogICogICAgIElmIEBycSBoYXMgbGVmdG92ZXIsIHNldHMgaXQgdXAgZm9yIHRoZSBuZXh0IHJhbmdlIG9mIHNlZ21lbnRzLgogICoKICAqIFJldHVybjoKLSAqICAgICAlMCAtIHdlIGFyZSBkb25lIHdpdGggdGhpcyByZXF1ZXN0Ci0gKiAgICAgJTEgLSBzdGlsbCBidWZmZXJzIHBlbmRpbmcgZm9yIHRoaXMgcmVxdWVzdAorICogICAgICVmYWxzZSAtIHdlIGFyZSBkb25lIHdpdGggdGhpcyByZXF1ZXN0CisgKiAgICAgJXRydWUgIC0gc3RpbGwgYnVmZmVycyBwZW5kaW5nIGZvciB0aGlzIHJlcXVlc3QKICAqKi8KLWludCBibGtfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcykKK2Jvb2wgYmxrX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLCB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpCiB7Ci0JcmV0dXJuIGJsa19lbmRfaW8ocnEsIGVycm9yLCBucl9ieXRlcywgMCwgTlVMTCk7CisJcmV0dXJuIGJsa19lbmRfYmlkaV9yZXF1ZXN0KHJxLCBlcnJvciwgbnJfYnl0ZXMsIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmxrX2VuZF9yZXF1ZXN0KTsKIAogLyoqCisgKiBibGtfZW5kX3JlcXVlc3RfYWxsIC0gSGVscGVyIGZ1bmN0aW9uIGZvciBkcml2ZXMgdG8gZmluaXNoIHRoZSByZXF1ZXN0LgorICogQHJxOiB0aGUgcmVxdWVzdCB0byBmaW5pc2gKKyAqIEBlcnI6ICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIENvbXBsZXRlbHkgZmluaXNoIEBycS4KKyAqLwordm9pZCBibGtfZW5kX3JlcXVlc3RfYWxsKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yKQoreworCWJvb2wgcGVuZGluZzsKKwl1bnNpZ25lZCBpbnQgYmlkaV9ieXRlcyA9IDA7CisKKwlpZiAodW5saWtlbHkoYmxrX2JpZGlfcnEocnEpKSkKKwkJYmlkaV9ieXRlcyA9IGJsa19ycV9ieXRlcyhycS0+bmV4dF9ycSk7CisKKwlwZW5kaW5nID0gYmxrX2VuZF9iaWRpX3JlcXVlc3QocnEsIGVycm9yLCBibGtfcnFfYnl0ZXMocnEpLCBiaWRpX2J5dGVzKTsKKwlCVUdfT04ocGVuZGluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChibGtfZW5kX3JlcXVlc3RfYWxsKTsKKworLyoqCisgKiBibGtfZW5kX3JlcXVlc3RfY3VyIC0gSGVscGVyIGZ1bmN0aW9uIHRvIGZpbmlzaCB0aGUgY3VycmVudCByZXF1ZXN0IGNodW5rLgorICogQHJxOiB0aGUgcmVxdWVzdCB0byBmaW5pc2ggdGhlIGN1cnJlbnQgY2h1bmsgZm9yCisgKiBAZXJyOiAlMCBmb3Igc3VjY2VzcywgPCAlMCBmb3IgZXJyb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBDb21wbGV0ZSB0aGUgY3VycmVudCBjb25zZWN1dGl2ZWx5IG1hcHBlZCBjaHVuayBmcm9tIEBycS4KKyAqCisgKiBSZXR1cm46CisgKiAgICAgJWZhbHNlIC0gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHJlcXVlc3QKKyAqICAgICAldHJ1ZSAgLSBzdGlsbCBidWZmZXJzIHBlbmRpbmcgZm9yIHRoaXMgcmVxdWVzdAorICovCitib29sIGJsa19lbmRfcmVxdWVzdF9jdXIoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IpCit7CisJcmV0dXJuIGJsa19lbmRfcmVxdWVzdChycSwgZXJyb3IsIGJsa19ycV9jdXJfYnl0ZXMocnEpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsa19lbmRfcmVxdWVzdF9jdXIpOworCisvKioKICAqIF9fYmxrX2VuZF9yZXF1ZXN0IC0gSGVscGVyIGZ1bmN0aW9uIGZvciBkcml2ZXJzIHRvIGNvbXBsZXRlIHRoZSByZXF1ZXN0LgogICogQHJxOiAgICAgICB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKICAqIEBlcnJvcjogICAgJTAgZm9yIHN1Y2Nlc3MsIDwgJTAgZm9yIGVycm9yCkBAIC0yMDAwLDEwNSArMjE5MSw1NCBAQAogICogICAgIE11c3QgYmUgY2FsbGVkIHdpdGggcXVldWUgbG9jayBoZWxkIHVubGlrZSBibGtfZW5kX3JlcXVlc3QoKS4KICAqCiAgKiBSZXR1cm46Ci0gKiAgICAgJTAgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAotICogICAgICUxIC0gc3RpbGwgYnVmZmVycyBwZW5kaW5nIGZvciB0aGlzIHJlcXVlc3QKKyAqICAgICAlZmFsc2UgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAorICogICAgICV0cnVlICAtIHN0aWxsIGJ1ZmZlcnMgcGVuZGluZyBmb3IgdGhpcyByZXF1ZXN0CiAgKiovCi1pbnQgX19ibGtfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcykKK2Jvb2wgX19ibGtfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcykKIHsKLQlpZiAocnEtPmJpbyAmJiBfX2VuZF90aGF0X3JlcXVlc3RfZmlyc3QocnEsIGVycm9yLCBucl9ieXRlcykpCi0JCXJldHVybiAxOwotCi0JYWRkX2Rpc2tfcmFuZG9tbmVzcyhycS0+cnFfZGlzayk7Ci0KLQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocnEsIGVycm9yKTsKLQotCXJldHVybiAwOworCXJldHVybiBfX2Jsa19lbmRfYmlkaV9yZXF1ZXN0KHJxLCBlcnJvciwgbnJfYnl0ZXMsIDApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19ibGtfZW5kX3JlcXVlc3QpOwogCiAvKioKLSAqIGJsa19lbmRfYmlkaV9yZXF1ZXN0IC0gSGVscGVyIGZ1bmN0aW9uIGZvciBkcml2ZXJzIHRvIGNvbXBsZXRlIGJpZGkgcmVxdWVzdC4KLSAqIEBycTogICAgICAgICB0aGUgYmlkaSByZXF1ZXN0IGJlaW5nIHByb2Nlc3NlZAotICogQGVycm9yOiAgICAgICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgotICogQG5yX2J5dGVzOiAgIG51bWJlciBvZiBieXRlcyB0byBjb21wbGV0ZSBAcnEKLSAqIEBiaWRpX2J5dGVzOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGxldGUgQHJxLT5uZXh0X3JxCisgKiBfX2Jsa19lbmRfcmVxdWVzdF9hbGwgLSBIZWxwZXIgZnVuY3Rpb24gZm9yIGRyaXZlcyB0byBmaW5pc2ggdGhlIHJlcXVlc3QuCisgKiBAcnE6IHRoZSByZXF1ZXN0IHRvIGZpbmlzaAorICogQGVycjogJTAgZm9yIHN1Y2Nlc3MsIDwgJTAgZm9yIGVycm9yCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgICAgRW5kcyBJL08gb24gYSBudW1iZXIgb2YgYnl0ZXMgYXR0YWNoZWQgdG8gQHJxIGFuZCBAcnEtPm5leHRfcnEuCi0gKgotICogUmV0dXJuOgotICogICAgICUwIC0gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHJlcXVlc3QKLSAqICAgICAlMSAtIHN0aWxsIGJ1ZmZlcnMgcGVuZGluZyBmb3IgdGhpcyByZXF1ZXN0Ci0gKiovCi1pbnQgYmxrX2VuZF9iaWRpX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcywKLQkJCSB1bnNpZ25lZCBpbnQgYmlkaV9ieXRlcykKLXsKLQlyZXR1cm4gYmxrX2VuZF9pbyhycSwgZXJyb3IsIG5yX2J5dGVzLCBiaWRpX2J5dGVzLCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJsa19lbmRfYmlkaV9yZXF1ZXN0KTsKLQotLyoqCi0gKiBibGtfdXBkYXRlX3JlcXVlc3QgLSBTcGVjaWFsIGhlbHBlciBmdW5jdGlvbiBmb3IgcmVxdWVzdCBzdGFja2luZyBkcml2ZXJzCi0gKiBAcnE6ICAgICAgICAgICB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKLSAqIEBlcnJvcjogICAgICAgICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgotICogQG5yX2J5dGVzOiAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlIEBycQotICoKLSAqIERlc2NyaXB0aW9uOgotICogICAgIEVuZHMgSS9PIG9uIGEgbnVtYmVyIG9mIGJ5dGVzIGF0dGFjaGVkIHRvIEBycSwgYnV0IGRvZXNuJ3QgY29tcGxldGUKLSAqICAgICB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgZXZlbiBpZiBAcnEgZG9lc24ndCBoYXZlIGxlZnRvdmVyLgotICogICAgIElmIEBycSBoYXMgbGVmdG92ZXIsIHNldHMgaXQgdXAgZm9yIHRoZSBuZXh0IHJhbmdlIG9mIHNlZ21lbnRzLgotICoKLSAqICAgICBUaGlzIHNwZWNpYWwgaGVscGVyIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIHJlcXVlc3Qgc3RhY2tpbmcgZHJpdmVycwotICogICAgIChlLmcuIHJlcXVlc3QtYmFzZWQgZG0pIHNvIHRoYXQgdGhleSBjYW4gaGFuZGxlIHBhcnRpYWwgY29tcGxldGlvbi4KLSAqICAgICBBY3R1YWwgZGV2aWNlIGRyaXZlcnMgc2hvdWxkIHVzZSBibGtfZW5kX3JlcXVlc3QgaW5zdGVhZC4KKyAqICAgICBDb21wbGV0ZWx5IGZpbmlzaCBAcnEuICBNdXN0IGJlIGNhbGxlZCB3aXRoIHF1ZXVlIGxvY2sgaGVsZC4KICAqLwotdm9pZCBibGtfdXBkYXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsIHVuc2lnbmVkIGludCBucl9ieXRlcykKK3ZvaWQgX19ibGtfZW5kX3JlcXVlc3RfYWxsKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yKQogewotCWlmICghZW5kX3RoYXRfcmVxdWVzdF9kYXRhKHJxLCBlcnJvciwgbnJfYnl0ZXMsIDApKSB7Ci0JCS8qCi0JCSAqIFRoZXNlIG1lbWJlcnMgYXJlIG5vdCB1cGRhdGVkIGluIGVuZF90aGF0X3JlcXVlc3RfZGF0YSgpCi0JCSAqIHdoZW4gYWxsIGJpb3MgYXJlIGNvbXBsZXRlZC4KLQkJICogVXBkYXRlIHRoZW0gc28gdGhhdCB0aGUgcmVxdWVzdCBzdGFja2luZyBkcml2ZXIgY2FuIGZpbmQKLQkJICogaG93IG1hbnkgYnl0ZXMgcmVtYWluIGluIHRoZSByZXF1ZXN0IGxhdGVyLgotCQkgKi8KLQkJcnEtPm5yX3NlY3RvcnMgPSBycS0+aGFyZF9ucl9zZWN0b3JzID0gMDsKLQkJcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyA9IHJxLT5oYXJkX2N1cl9zZWN0b3JzID0gMDsKLQl9CisJYm9vbCBwZW5kaW5nOworCXVuc2lnbmVkIGludCBiaWRpX2J5dGVzID0gMDsKKworCWlmICh1bmxpa2VseShibGtfYmlkaV9ycShycSkpKQorCQliaWRpX2J5dGVzID0gYmxrX3JxX2J5dGVzKHJxLT5uZXh0X3JxKTsKKworCXBlbmRpbmcgPSBfX2Jsa19lbmRfYmlkaV9yZXF1ZXN0KHJxLCBlcnJvciwgYmxrX3JxX2J5dGVzKHJxKSwgYmlkaV9ieXRlcyk7CisJQlVHX09OKHBlbmRpbmcpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYmxrX3VwZGF0ZV9yZXF1ZXN0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKF9fYmxrX2VuZF9yZXF1ZXN0X2FsbCk7CiAKIC8qKgotICogYmxrX2VuZF9yZXF1ZXN0X2NhbGxiYWNrIC0gU3BlY2lhbCBoZWxwZXIgZnVuY3Rpb24gZm9yIHRyaWNreSBkcml2ZXJzCi0gKiBAcnE6ICAgICAgICAgICB0aGUgcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQKLSAqIEBlcnJvcjogICAgICAgICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgotICogQG5yX2J5dGVzOiAgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBsZXRlCi0gKiBAZHJ2X2NhbGxiYWNrOiBmdW5jdGlvbiBjYWxsZWQgYmV0d2VlbiBjb21wbGV0aW9uIG9mIGJpb3MgaW4gdGhlIHJlcXVlc3QKLSAqICAgICAgICAgICAgICAgIGFuZCBjb21wbGV0aW9uIG9mIHRoZSByZXF1ZXN0LgotICogICAgICAgICAgICAgICAgSWYgdGhlIGNhbGxiYWNrIHJldHVybnMgbm9uICUwLCB0aGlzIGhlbHBlciByZXR1cm5zIHdpdGhvdXQKLSAqICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gb2YgdGhlIHJlcXVlc3QuCisgKiBfX2Jsa19lbmRfcmVxdWVzdF9jdXIgLSBIZWxwZXIgZnVuY3Rpb24gdG8gZmluaXNoIHRoZSBjdXJyZW50IHJlcXVlc3QgY2h1bmsuCisgKiBAcnE6IHRoZSByZXF1ZXN0IHRvIGZpbmlzaCB0aGUgY3VycmVudCBjaHVuayBmb3IKKyAqIEBlcnI6ICUwIGZvciBzdWNjZXNzLCA8ICUwIGZvciBlcnJvcgogICoKICAqIERlc2NyaXB0aW9uOgotICogICAgIEVuZHMgSS9PIG9uIGEgbnVtYmVyIG9mIGJ5dGVzIGF0dGFjaGVkIHRvIEBycS4KLSAqICAgICBJZiBAcnEgaGFzIGxlZnRvdmVyLCBzZXRzIGl0IHVwIGZvciB0aGUgbmV4dCByYW5nZSBvZiBzZWdtZW50cy4KLSAqCi0gKiAgICAgVGhpcyBzcGVjaWFsIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgZm9yIGV4aXN0aW5nIHRyaWNreSBkcml2ZXJzLgotICogICAgIChlLmcuIGNkcm9tX25ld3BjX2ludHIoKSBvZiBpZGUtY2QpCi0gKiAgICAgVGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSByZW1vdmVkIHdoZW4gc3VjaCBkcml2ZXJzIGFyZSByZXdyaXR0ZW4uCi0gKiAgICAgRG9uJ3QgdXNlIHRoaXMgaW50ZXJmYWNlIGluIG90aGVyIHBsYWNlcyBhbnltb3JlLgorICogICAgIENvbXBsZXRlIHRoZSBjdXJyZW50IGNvbnNlY3V0aXZlbHkgbWFwcGVkIGNodW5rIGZyb20gQHJxLiAgTXVzdAorICogICAgIGJlIGNhbGxlZCB3aXRoIHF1ZXVlIGxvY2sgaGVsZC4KICAqCiAgKiBSZXR1cm46Ci0gKiAgICAgJTAgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAotICogICAgICUxIC0gdGhpcyByZXF1ZXN0IGlzIG5vdCBmcmVlZCB5ZXQuCi0gKiAgICAgICAgICB0aGlzIHJlcXVlc3Qgc3RpbGwgaGFzIHBlbmRpbmcgYnVmZmVycyBvcgotICogICAgICAgICAgdGhlIGRyaXZlciBkb2Vzbid0IHdhbnQgdG8gZmluaXNoIHRoaXMgcmVxdWVzdCB5ZXQuCi0gKiovCi1pbnQgYmxrX2VuZF9yZXF1ZXN0X2NhbGxiYWNrKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLAotCQkJICAgICB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMsCi0JCQkgICAgIGludCAoZHJ2X2NhbGxiYWNrKShzdHJ1Y3QgcmVxdWVzdCAqKSkKKyAqICAgICAlZmFsc2UgLSB3ZSBhcmUgZG9uZSB3aXRoIHRoaXMgcmVxdWVzdAorICogICAgICV0cnVlICAtIHN0aWxsIGJ1ZmZlcnMgcGVuZGluZyBmb3IgdGhpcyByZXF1ZXN0CisgKi8KK2Jvb2wgX19ibGtfZW5kX3JlcXVlc3RfY3VyKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yKQogewotCXJldHVybiBibGtfZW5kX2lvKHJxLCBlcnJvciwgbnJfYnl0ZXMsIDAsIGRydl9jYWxsYmFjayk7CisJcmV0dXJuIF9fYmxrX2VuZF9yZXF1ZXN0KHJxLCBlcnJvciwgYmxrX3JxX2N1cl9ieXRlcyhycSkpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYmxrX2VuZF9yZXF1ZXN0X2NhbGxiYWNrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKF9fYmxrX2VuZF9yZXF1ZXN0X2N1cik7CiAKIHZvaWQgYmxrX3JxX2Jpb19wcmVwKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCSAgICAgc3RydWN0IGJpbyAqYmlvKQpAQCAtMjExMSwxMSArMjI1MSw3IEBACiAJCXJxLT5ucl9waHlzX3NlZ21lbnRzID0gYmlvX3BoeXNfc2VnbWVudHMocSwgYmlvKTsKIAkJcnEtPmJ1ZmZlciA9IGJpb19kYXRhKGJpbyk7CiAJfQotCXJxLT5jdXJyZW50X25yX3NlY3RvcnMgPSBiaW9fY3VyX3NlY3RvcnMoYmlvKTsKLQlycS0+aGFyZF9jdXJfc2VjdG9ycyA9IHJxLT5jdXJyZW50X25yX3NlY3RvcnM7Ci0JcnEtPmhhcmRfbnJfc2VjdG9ycyA9IHJxLT5ucl9zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKLQlycS0+ZGF0YV9sZW4gPSBiaW8tPmJpX3NpemU7Ci0KKwlycS0+X19kYXRhX2xlbiA9IGJpby0+Ymlfc2l6ZTsKIAlycS0+YmlvID0gcnEtPmJpb3RhaWwgPSBiaW87CiAKIAlpZiAoYmlvLT5iaV9iZGV2KQpAQCAtMjE1MCw2ICsyMjg2LDEwNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYmxrX2xsZF9idXN5KTsKIAorLyoqCisgKiBibGtfcnFfdW5wcmVwX2Nsb25lIC0gSGVscGVyIGZ1bmN0aW9uIHRvIGZyZWUgYWxsIGJpb3MgaW4gYSBjbG9uZWQgcmVxdWVzdAorICogQHJxOiB0aGUgY2xvbmUgcmVxdWVzdCB0byBiZSBjbGVhbmVkIHVwCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgRnJlZSBhbGwgYmlvcyBpbiBAcnEgZm9yIGEgY2xvbmVkIHJlcXVlc3QuCisgKi8KK3ZvaWQgYmxrX3JxX3VucHJlcF9jbG9uZShzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJd2hpbGUgKChiaW8gPSBycS0+YmlvKSAhPSBOVUxMKSB7CisJCXJxLT5iaW8gPSBiaW8tPmJpX25leHQ7CisKKwkJYmlvX3B1dChiaW8pOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJsa19ycV91bnByZXBfY2xvbmUpOworCisvKgorICogQ29weSBhdHRyaWJ1dGVzIG9mIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHRvIHRoZSBjbG9uZSByZXF1ZXN0LgorICogVGhlIGFjdHVhbCBkYXRhIHBhcnRzIChlLmcuIC0+Y21kLCAtPmJ1ZmZlciwgLT5zZW5zZSkgYXJlIG5vdCBjb3BpZWQuCisgKi8KK3N0YXRpYyB2b2lkIF9fYmxrX3JxX3ByZXBfY2xvbmUoc3RydWN0IHJlcXVlc3QgKmRzdCwgc3RydWN0IHJlcXVlc3QgKnNyYykKK3sKKwlkc3QtPmNwdSA9IHNyYy0+Y3B1OworCWRzdC0+Y21kX2ZsYWdzID0gKHJxX2RhdGFfZGlyKHNyYykgfCBSRVFfTk9NRVJHRSk7CisJZHN0LT5jbWRfdHlwZSA9IHNyYy0+Y21kX3R5cGU7CisJZHN0LT5fX3NlY3RvciA9IGJsa19ycV9wb3Moc3JjKTsKKwlkc3QtPl9fZGF0YV9sZW4gPSBibGtfcnFfYnl0ZXMoc3JjKTsKKwlkc3QtPm5yX3BoeXNfc2VnbWVudHMgPSBzcmMtPm5yX3BoeXNfc2VnbWVudHM7CisJZHN0LT5pb3ByaW8gPSBzcmMtPmlvcHJpbzsKKwlkc3QtPmV4dHJhX2xlbiA9IHNyYy0+ZXh0cmFfbGVuOworfQorCisvKioKKyAqIGJsa19ycV9wcmVwX2Nsb25lIC0gSGVscGVyIGZ1bmN0aW9uIHRvIHNldHVwIGNsb25lIHJlcXVlc3QKKyAqIEBycTogdGhlIHJlcXVlc3QgdG8gYmUgc2V0dXAKKyAqIEBycV9zcmM6IG9yaWdpbmFsIHJlcXVlc3QgdG8gYmUgY2xvbmVkCisgKiBAYnM6IGJpb19zZXQgdGhhdCBiaW9zIGZvciBjbG9uZSBhcmUgYWxsb2NhdGVkIGZyb20KKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gbWFzayBmb3IgYmlvCisgKiBAYmlvX2N0cjogc2V0dXAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGZvciBlYWNoIGNsb25lIGJpby4KKyAqICAgICAgICAgICBSZXR1cm5zICUwIGZvciBzdWNjZXNzLCBub24gJTAgZm9yIGZhaWx1cmUuCisgKiBAZGF0YTogcHJpdmF0ZSBkYXRhIHRvIGJlIHBhc3NlZCB0byBAYmlvX2N0cgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIENsb25lcyBiaW9zIGluIEBycV9zcmMgdG8gQHJxLCBhbmQgY29waWVzIGF0dHJpYnV0ZXMgb2YgQHJxX3NyYyB0byBAcnEuCisgKiAgICAgVGhlIGFjdHVhbCBkYXRhIHBhcnRzIG9mIEBycV9zcmMgKGUuZy4gLT5jbWQsIC0+YnVmZmVyLCAtPnNlbnNlKQorICogICAgIGFyZSBub3QgY29waWVkLCBhbmQgY29weWluZyBzdWNoIHBhcnRzIGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS4KKyAqICAgICBBbHNvLCBwYWdlcyB3aGljaCB0aGUgb3JpZ2luYWwgYmlvcyBhcmUgcG9pbnRpbmcgdG8gYXJlIG5vdCBjb3BpZWQKKyAqICAgICBhbmQgdGhlIGNsb25lZCBiaW9zIGp1c3QgcG9pbnQgc2FtZSBwYWdlcy4KKyAqICAgICBTbyBjbG9uZWQgYmlvcyBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgb3JpZ2luYWwgYmlvcywgd2hpY2ggbWVhbnMKKyAqICAgICB0aGUgY2FsbGVyIG11c3QgY29tcGxldGUgQHJxIGJlZm9yZSBAcnFfc3JjLgorICovCitpbnQgYmxrX3JxX3ByZXBfY2xvbmUoc3RydWN0IHJlcXVlc3QgKnJxLCBzdHJ1Y3QgcmVxdWVzdCAqcnFfc3JjLAorCQkgICAgICBzdHJ1Y3QgYmlvX3NldCAqYnMsIGdmcF90IGdmcF9tYXNrLAorCQkgICAgICBpbnQgKCpiaW9fY3RyKShzdHJ1Y3QgYmlvICosIHN0cnVjdCBiaW8gKiwgdm9pZCAqKSwKKwkJICAgICAgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmlvICpiaW8sICpiaW9fc3JjOworCisJaWYgKCFicykKKwkJYnMgPSBmc19iaW9fc2V0OworCisJYmxrX3JxX2luaXQoTlVMTCwgcnEpOworCisJX19ycV9mb3JfZWFjaF9iaW8oYmlvX3NyYywgcnFfc3JjKSB7CisJCWJpbyA9IGJpb19hbGxvY19iaW9zZXQoZ2ZwX21hc2ssIGJpb19zcmMtPmJpX21heF92ZWNzLCBicyk7CisJCWlmICghYmlvKQorCQkJZ290byBmcmVlX2FuZF9vdXQ7CisKKwkJX19iaW9fY2xvbmUoYmlvLCBiaW9fc3JjKTsKKworCQlpZiAoYmlvX2ludGVncml0eShiaW9fc3JjKSAmJgorCQkgICAgYmlvX2ludGVncml0eV9jbG9uZShiaW8sIGJpb19zcmMsIGdmcF9tYXNrKSkKKwkJCWdvdG8gZnJlZV9hbmRfb3V0OworCisJCWlmIChiaW9fY3RyICYmIGJpb19jdHIoYmlvLCBiaW9fc3JjLCBkYXRhKSkKKwkJCWdvdG8gZnJlZV9hbmRfb3V0OworCisJCWlmIChycS0+YmlvKSB7CisJCQlycS0+YmlvdGFpbC0+YmlfbmV4dCA9IGJpbzsKKwkJCXJxLT5iaW90YWlsID0gYmlvOworCQl9IGVsc2UKKwkJCXJxLT5iaW8gPSBycS0+YmlvdGFpbCA9IGJpbzsKKwl9CisKKwlfX2Jsa19ycV9wcmVwX2Nsb25lKHJxLCBycV9zcmMpOworCisJcmV0dXJuIDA7CisKK2ZyZWVfYW5kX291dDoKKwlpZiAoYmlvKQorCQliaW9fZnJlZShiaW8sIGJzKTsKKwlibGtfcnFfdW5wcmVwX2Nsb25lKHJxKTsKKworCXJldHVybiAtRU5PTUVNOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmxrX3JxX3ByZXBfY2xvbmUpOworCiBpbnQga2Jsb2NrZF9zY2hlZHVsZV93b3JrKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJcmV0dXJuIHF1ZXVlX3dvcmsoa2Jsb2NrZF93b3JrcXVldWUsIHdvcmspOwpAQCAtMjE1OCw2ICsyMzk0LDkgQEAKIAogaW50IF9faW5pdCBibGtfZGV2X2luaXQodm9pZCkKIHsKKwlCVUlMRF9CVUdfT04oX19SRVFfTlJfQklUUyA+IDggKgorCQkJc2l6ZW9mKCgoc3RydWN0IHJlcXVlc3QgKikwKS0+Y21kX2ZsYWdzKSk7CisKIAlrYmxvY2tkX3dvcmtxdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoImtibG9ja2QiKTsKIAlpZiAoIWtibG9ja2Rfd29ya3F1ZXVlKQogCQlwYW5pYygiRmFpbGVkIHRvIGNyZWF0ZSBrYmxvY2tkXG4iKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1leGVjLmMgYi9ibG9jay9ibGstZXhlYy5jCmluZGV4IDZhZjcxNmQuLjQ5NTU3ZTkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1leGVjLmMKKysrIGIvYmxvY2svYmxrLWV4ZWMuYwpAQCAtNTEsNyArNTEsNiBAQAogCWludCB3aGVyZSA9IGF0X2hlYWQgPyBFTEVWQVRPUl9JTlNFUlRfRlJPTlQgOiBFTEVWQVRPUl9JTlNFUlRfQkFDSzsKIAogCXJxLT5ycV9kaXNrID0gYmRfZGlzazsKLQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9OT01FUkdFOwogCXJxLT5lbmRfaW8gPSBkb25lOwogCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWludGVncml0eS5jIGIvYmxvY2svYmxrLWludGVncml0eS5jCmluZGV4IDkxZmE4ZTAuLjczZTI4ZDMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYworKysgYi9ibG9jay9ibGstaW50ZWdyaXR5LmMKQEAgLTM0MCw3ICszNDAsNyBAQAogCQlrb2JqZWN0X3VldmVudCgmYmktPmtvYmosIEtPQkpfQUREKTsKIAogCQliaS0+ZmxhZ3MgfD0gSU5URUdSSVRZX0ZMQUdfUkVBRCB8IElOVEVHUklUWV9GTEFHX1dSSVRFOwotCQliaS0+c2VjdG9yX3NpemUgPSBkaXNrLT5xdWV1ZS0+aGFyZHNlY3Rfc2l6ZTsKKwkJYmktPnNlY3Rvcl9zaXplID0gcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGRpc2stPnF1ZXVlKTsKIAkJZGlzay0+aW50ZWdyaXR5ID0gYmk7CiAJfSBlbHNlCiAJCWJpID0gZGlzay0+aW50ZWdyaXR5OwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWlvYy5jIGIvYmxvY2svYmxrLWlvYy5jCmluZGV4IDAxMmYwNjUuLmQ0ZWQ2MDAgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1pb2MuYworKysgYi9ibG9jay9ibGstaW9jLmMKQEAgLTM1LDkgKzM1LDkgQEAKIAlpZiAoaW9jID09IE5VTEwpCiAJCXJldHVybiAxOwogCi0JQlVHX09OKGF0b21pY19yZWFkKCZpb2MtPnJlZmNvdW50KSA9PSAwKTsKKwlCVUdfT04oYXRvbWljX2xvbmdfcmVhZCgmaW9jLT5yZWZjb3VudCkgPT0gMCk7CiAKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmaW9jLT5yZWZjb3VudCkpIHsKKwlpZiAoYXRvbWljX2xvbmdfZGVjX2FuZF90ZXN0KCZpb2MtPnJlZmNvdW50KSkgewogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWlmIChpb2MtPmFpYyAmJiBpb2MtPmFpYy0+ZHRvcikKIAkJCWlvYy0+YWljLT5kdG9yKGlvYy0+YWljKTsKQEAgLTkwLDcgKzkwLDcgQEAKIAogCXJldCA9IGttZW1fY2FjaGVfYWxsb2Nfbm9kZShpb2NvbnRleHRfY2FjaGVwLCBnZnBfZmxhZ3MsIG5vZGUpOwogCWlmIChyZXQpIHsKLQkJYXRvbWljX3NldCgmcmV0LT5yZWZjb3VudCwgMSk7CisJCWF0b21pY19sb25nX3NldCgmcmV0LT5yZWZjb3VudCwgMSk7CiAJCWF0b21pY19zZXQoJnJldC0+bnJfdGFza3MsIDEpOwogCQlzcGluX2xvY2tfaW5pdCgmcmV0LT5sb2NrKTsKIAkJcmV0LT5pb3ByaW9fY2hhbmdlZCA9IDA7CkBAIC0xNTEsNyArMTUxLDcgQEAKIAkJcmV0ID0gY3VycmVudF9pb19jb250ZXh0KGdmcF9mbGFncywgbm9kZSk7CiAJCWlmICh1bmxpa2VseSghcmV0KSkKIAkJCWJyZWFrOwotCX0gd2hpbGUgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZyZXQtPnJlZmNvdW50KSk7CisJfSB3aGlsZSAoIWF0b21pY19sb25nX2luY19ub3RfemVybygmcmV0LT5yZWZjb3VudCkpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2Myw4ICsxNjMsOCBAQAogCXN0cnVjdCBpb19jb250ZXh0ICpkc3QgPSAqcGRzdDsKIAogCWlmIChzcmMpIHsKLQkJQlVHX09OKGF0b21pY19yZWFkKCZzcmMtPnJlZmNvdW50KSA9PSAwKTsKLQkJYXRvbWljX2luYygmc3JjLT5yZWZjb3VudCk7CisJCUJVR19PTihhdG9taWNfbG9uZ19yZWFkKCZzcmMtPnJlZmNvdW50KSA9PSAwKTsKKwkJYXRvbWljX2xvbmdfaW5jKCZzcmMtPnJlZmNvdW50KTsKIAkJcHV0X2lvX2NvbnRleHQoZHN0KTsKIAkJKnBkc3QgPSBzcmM7CiAJfQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1hcC5jIGIvYmxvY2svYmxrLW1hcC5jCmluZGV4IGYxMDM3MjkuLjkwODNjZjAgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tYXAuYworKysgYi9ibG9jay9ibGstbWFwLmMKQEAgLTIwLDExICsyMCwxMCBAQAogCQlycS0+YmlvdGFpbC0+YmlfbmV4dCA9IGJpbzsKIAkJcnEtPmJpb3RhaWwgPSBiaW87CiAKLQkJcnEtPmRhdGFfbGVuICs9IGJpby0+Ymlfc2l6ZTsKKwkJcnEtPl9fZGF0YV9sZW4gKz0gYmlvLT5iaV9zaXplOwogCX0KIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0woYmxrX3JxX2FwcGVuZF9iaW8pOwogCiBzdGF0aWMgaW50IF9fYmxrX3JxX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqYmlvKQogewpAQCAtMTE2LDcgKzExNSw3IEBACiAJc3RydWN0IGJpbyAqYmlvID0gTlVMTDsKIAlpbnQgcmV0OwogCi0JaWYgKGxlbiA+IChxLT5tYXhfaHdfc2VjdG9ycyA8PCA5KSkKKwlpZiAobGVuID4gKHF1ZXVlX21heF9od19zZWN0b3JzKHEpIDw8IDkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNTYsNyArMTU1LDcgQEAKIAlpZiAoIWJpb19mbGFnZ2VkKGJpbywgQklPX1VTRVJfTUFQUEVEKSkKIAkJcnEtPmNtZF9mbGFncyB8PSBSRVFfQ09QWV9VU0VSOwogCi0JcnEtPmJ1ZmZlciA9IHJxLT5kYXRhID0gTlVMTDsKKwlycS0+YnVmZmVyID0gTlVMTDsKIAlyZXR1cm4gMDsKIHVubWFwX3JxOgogCWJsa19ycV91bm1hcF91c2VyKGJpbyk7CkBAIC0yMzUsNyArMjM0LDcgQEAKIAlibGtfcXVldWVfYm91bmNlKHEsICZiaW8pOwogCWJpb19nZXQoYmlvKTsKIAlibGtfcnFfYmlvX3ByZXAocSwgcnEsIGJpbyk7Ci0JcnEtPmJ1ZmZlciA9IHJxLT5kYXRhID0gTlVMTDsKKwlycS0+YnVmZmVyID0gTlVMTDsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3JxX21hcF91c2VyX2lvdik7CkBAIC0yODIsNyArMjgxLDggQEAKICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgIERhdGEgd2lsbCBiZSBtYXBwZWQgZGlyZWN0bHkgaWYgcG9zc2libGUuIE90aGVyd2lzZSBhIGJvdW5jZQotICogICAgYnVmZmVyIGlzIHVzZWQuCisgKiAgICBidWZmZXIgaXMgdXNlZC4gQ2FuIGJlIGNhbGxlZCBtdWx0cGxlIHRpbWVzIHRvIGFwcGVuZCBtdWx0cGxlCisgKiAgICBidWZmZXJzLgogICovCiBpbnQgYmxrX3JxX21hcF9rZXJuKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsIHZvaWQgKmtidWYsCiAJCSAgICB1bnNpZ25lZCBpbnQgbGVuLCBnZnBfdCBnZnBfbWFzaykKQEAgLTI5MCw4ICsyOTAsOSBAQAogCWludCByZWFkaW5nID0gcnFfZGF0YV9kaXIocnEpID09IFJFQUQ7CiAJaW50IGRvX2NvcHkgPSAwOwogCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgcmV0OwogCi0JaWYgKGxlbiA+IChxLT5tYXhfaHdfc2VjdG9ycyA8PCA5KSkKKwlpZiAobGVuID4gKHF1ZXVlX21heF9od19zZWN0b3JzKHEpIDw8IDkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIWxlbiB8fCAha2J1ZikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMTEsOSArMzEyLDE1IEBACiAJaWYgKGRvX2NvcHkpCiAJCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX0NPUFlfVVNFUjsKIAotCWJsa19ycV9iaW9fcHJlcChxLCBycSwgYmlvKTsKKwlyZXQgPSBibGtfcnFfYXBwZW5kX2JpbyhxLCBycSwgYmlvKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQkvKiByZXF1ZXN0IGlzIHRvbyBiaWcgKi8KKwkJYmlvX3B1dChiaW8pOworCQlyZXR1cm4gcmV0OworCX0KKwogCWJsa19xdWV1ZV9ib3VuY2UocSwgJnJxLT5iaW8pOwotCXJxLT5idWZmZXIgPSBycS0+ZGF0YSA9IE5VTEw7CisJcnEtPmJ1ZmZlciA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19ycV9tYXBfa2Vybik7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbWVyZ2UuYyBiL2Jsb2NrL2Jsay1tZXJnZS5jCmluZGV4IDIzZDJhNmYuLjM5Y2U2NDQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tZXJnZS5jCisrKyBiL2Jsb2NrL2Jsay1tZXJnZS5jCkBAIC05LDM1ICs5LDYgQEAKIAogI2luY2x1ZGUgImJsay5oIgogCi12b2lkIGJsa19yZWNhbGNfcnFfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBuc2VjdCkKLXsKLQlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpIHx8IGJsa19kaXNjYXJkX3JxKHJxKSkgewotCQlycS0+aGFyZF9zZWN0b3IgKz0gbnNlY3Q7Ci0JCXJxLT5oYXJkX25yX3NlY3RvcnMgLT0gbnNlY3Q7Ci0KLQkJLyoKLQkJICogTW92ZSB0aGUgSS9PIHN1Ym1pc3Npb24gcG9pbnRlcnMgYWhlYWQgaWYgcmVxdWlyZWQuCi0JCSAqLwotCQlpZiAoKHJxLT5ucl9zZWN0b3JzID49IHJxLT5oYXJkX25yX3NlY3RvcnMpICYmCi0JCSAgICAocnEtPnNlY3RvciA8PSBycS0+aGFyZF9zZWN0b3IpKSB7Ci0JCQlycS0+c2VjdG9yID0gcnEtPmhhcmRfc2VjdG9yOwotCQkJcnEtPm5yX3NlY3RvcnMgPSBycS0+aGFyZF9ucl9zZWN0b3JzOwotCQkJcnEtPmhhcmRfY3VyX3NlY3RvcnMgPSBiaW9fY3VyX3NlY3RvcnMocnEtPmJpbyk7Ci0JCQlycS0+Y3VycmVudF9ucl9zZWN0b3JzID0gcnEtPmhhcmRfY3VyX3NlY3RvcnM7Ci0JCQlycS0+YnVmZmVyID0gYmlvX2RhdGEocnEtPmJpbyk7Ci0JCX0KLQotCQkvKgotCQkgKiBpZiB0b3RhbCBudW1iZXIgb2Ygc2VjdG9ycyBpcyBsZXNzIHRoYW4gdGhlIGZpcnN0IHNlZ21lbnQKLQkJICogc2l6ZSwgc29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nCi0JCSAqLwotCQlpZiAocnEtPm5yX3NlY3RvcnMgPCBycS0+Y3VycmVudF9ucl9zZWN0b3JzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImJsazogcmVxdWVzdCBib3RjaGVkXG4iKTsKLQkJCXJxLT5ucl9zZWN0b3JzID0gcnEtPmN1cnJlbnRfbnJfc2VjdG9yczsKLQkJfQotCX0KLX0KLQogc3RhdGljIHVuc2lnbmVkIGludCBfX2Jsa19yZWNhbGNfcnFfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCQkJCSAgICAgc3RydWN0IGJpbyAqYmlvKQogewpAQCAtNjEsMTEgKzMyLDEyIEBACiAJCQkgKiBuZXZlciBjb25zaWRlcmVkIHBhcnQgb2YgYW5vdGhlciBzZWdtZW50LCBzaW5jZSB0aGF0CiAJCQkgKiBtaWdodCBjaGFuZ2Ugd2l0aCB0aGUgYm91bmNlIHBhZ2UuCiAJCQkgKi8KLQkJCWhpZ2ggPSBwYWdlX3RvX3Bmbihidi0+YnZfcGFnZSkgPiBxLT5ib3VuY2VfcGZuOworCQkJaGlnaCA9IHBhZ2VfdG9fcGZuKGJ2LT5idl9wYWdlKSA+IHF1ZXVlX2JvdW5jZV9wZm4ocSk7CiAJCQlpZiAoaGlnaCB8fCBoaWdocHJ2KQogCQkJCWdvdG8gbmV3X3NlZ21lbnQ7CiAJCQlpZiAoY2x1c3RlcikgewotCQkJCWlmIChzZWdfc2l6ZSArIGJ2LT5idl9sZW4gPiBxLT5tYXhfc2VnbWVudF9zaXplKQorCQkJCWlmIChzZWdfc2l6ZSArIGJ2LT5idl9sZW4KKwkJCQkgICAgPiBxdWV1ZV9tYXhfc2VnbWVudF9zaXplKHEpKQogCQkJCQlnb3RvIG5ld19zZWdtZW50OwogCQkJCWlmICghQklPVkVDX1BIWVNfTUVSR0VBQkxFKGJ2cHJ2LCBidikpCiAJCQkJCWdvdG8gbmV3X3NlZ21lbnQ7CkBAIC0xMjAsNyArOTIsNyBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChiaW8tPmJpX3NlZ19iYWNrX3NpemUgKyBueHQtPmJpX3NlZ19mcm9udF9zaXplID4KLQkgICAgcS0+bWF4X3NlZ21lbnRfc2l6ZSkKKwkgICAgcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShxKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIWJpb19oYXNfZGF0YShiaW8pKQpAQCAtMTYzLDcgKzEzNSw3IEBACiAJCWludCBuYnl0ZXMgPSBidmVjLT5idl9sZW47CiAKIAkJaWYgKGJ2cHJ2ICYmIGNsdXN0ZXIpIHsKLQkJCWlmIChzZy0+bGVuZ3RoICsgbmJ5dGVzID4gcS0+bWF4X3NlZ21lbnRfc2l6ZSkKKwkJCWlmIChzZy0+bGVuZ3RoICsgbmJ5dGVzID4gcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShxKSkKIAkJCQlnb3RvIG5ld19zZWdtZW50OwogCiAJCQlpZiAoIUJJT1ZFQ19QSFlTX01FUkdFQUJMRShidnBydiwgYnZlYykpCkBAIC0xOTksOCArMTcxLDkgQEAKIAogCiAJaWYgKHVubGlrZWx5KHJxLT5jbWRfZmxhZ3MgJiBSRVFfQ09QWV9VU0VSKSAmJgotCSAgICAocnEtPmRhdGFfbGVuICYgcS0+ZG1hX3BhZF9tYXNrKSkgewotCQl1bnNpZ25lZCBpbnQgcGFkX2xlbiA9IChxLT5kbWFfcGFkX21hc2sgJiB+cnEtPmRhdGFfbGVuKSArIDE7CisJICAgIChibGtfcnFfYnl0ZXMocnEpICYgcS0+ZG1hX3BhZF9tYXNrKSkgeworCQl1bnNpZ25lZCBpbnQgcGFkX2xlbiA9CisJCQkocS0+ZG1hX3BhZF9tYXNrICYgfmJsa19ycV9ieXRlcyhycSkpICsgMTsKIAogCQlzZy0+bGVuZ3RoICs9IHBhZF9sZW47CiAJCXJxLT5leHRyYV9sZW4gKz0gcGFkX2xlbjsKQEAgLTIzMyw4ICsyMDYsOCBAQAogewogCWludCBucl9waHlzX3NlZ3MgPSBiaW9fcGh5c19zZWdtZW50cyhxLCBiaW8pOwogCi0JaWYgKHJlcS0+bnJfcGh5c19zZWdtZW50cyArIG5yX3BoeXNfc2VncyA+IHEtPm1heF9od19zZWdtZW50cwotCSAgICB8fCByZXEtPm5yX3BoeXNfc2VnbWVudHMgKyBucl9waHlzX3NlZ3MgPiBxLT5tYXhfcGh5c19zZWdtZW50cykgeworCWlmIChyZXEtPm5yX3BoeXNfc2VnbWVudHMgKyBucl9waHlzX3NlZ3MgPiBxdWV1ZV9tYXhfaHdfc2VnbWVudHMocSkgfHwKKwkgICAgcmVxLT5ucl9waHlzX3NlZ21lbnRzICsgbnJfcGh5c19zZWdzID4gcXVldWVfbWF4X3BoeXNfc2VnbWVudHMocSkpIHsKIAkJcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX05PTUVSR0U7CiAJCWlmIChyZXEgPT0gcS0+bGFzdF9tZXJnZSkKIAkJCXEtPmxhc3RfbWVyZ2UgPSBOVUxMOwpAQCAtMjU1LDExICsyMjgsMTEgQEAKIAl1bnNpZ25lZCBzaG9ydCBtYXhfc2VjdG9yczsKIAogCWlmICh1bmxpa2VseShibGtfcGNfcmVxdWVzdChyZXEpKSkKLQkJbWF4X3NlY3RvcnMgPSBxLT5tYXhfaHdfc2VjdG9yczsKKwkJbWF4X3NlY3RvcnMgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKTsKIAllbHNlCi0JCW1heF9zZWN0b3JzID0gcS0+bWF4X3NlY3RvcnM7CisJCW1heF9zZWN0b3JzID0gcXVldWVfbWF4X3NlY3RvcnMocSk7CiAKLQlpZiAocmVxLT5ucl9zZWN0b3JzICsgYmlvX3NlY3RvcnMoYmlvKSA+IG1heF9zZWN0b3JzKSB7CisJaWYgKGJsa19ycV9zZWN0b3JzKHJlcSkgKyBiaW9fc2VjdG9ycyhiaW8pID4gbWF4X3NlY3RvcnMpIHsKIAkJcmVxLT5jbWRfZmxhZ3MgfD0gUkVRX05PTUVSR0U7CiAJCWlmIChyZXEgPT0gcS0+bGFzdF9tZXJnZSkKIAkJCXEtPmxhc3RfbWVyZ2UgPSBOVUxMOwpAQCAtMjc5LDEyICsyNTIsMTIgQEAKIAl1bnNpZ25lZCBzaG9ydCBtYXhfc2VjdG9yczsKIAogCWlmICh1bmxpa2VseShibGtfcGNfcmVxdWVzdChyZXEpKSkKLQkJbWF4X3NlY3RvcnMgPSBxLT5tYXhfaHdfc2VjdG9yczsKKwkJbWF4X3NlY3RvcnMgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKTsKIAllbHNlCi0JCW1heF9zZWN0b3JzID0gcS0+bWF4X3NlY3RvcnM7CisJCW1heF9zZWN0b3JzID0gcXVldWVfbWF4X3NlY3RvcnMocSk7CiAKIAotCWlmIChyZXEtPm5yX3NlY3RvcnMgKyBiaW9fc2VjdG9ycyhiaW8pID4gbWF4X3NlY3RvcnMpIHsKKwlpZiAoYmxrX3JxX3NlY3RvcnMocmVxKSArIGJpb19zZWN0b3JzKGJpbykgPiBtYXhfc2VjdG9ycykgewogCQlyZXEtPmNtZF9mbGFncyB8PSBSRVFfTk9NRVJHRTsKIAkJaWYgKHJlcSA9PSBxLT5sYXN0X21lcmdlKQogCQkJcS0+bGFzdF9tZXJnZSA9IE5VTEw7CkBAIC0zMTUsNyArMjg4LDcgQEAKIAkvKgogCSAqIFdpbGwgaXQgYmVjb21lIHRvbyBsYXJnZT8KIAkgKi8KLQlpZiAoKHJlcS0+bnJfc2VjdG9ycyArIG5leHQtPm5yX3NlY3RvcnMpID4gcS0+bWF4X3NlY3RvcnMpCisJaWYgKChibGtfcnFfc2VjdG9ycyhyZXEpICsgYmxrX3JxX3NlY3RvcnMobmV4dCkpID4gcXVldWVfbWF4X3NlY3RvcnMocSkpCiAJCXJldHVybiAwOwogCiAJdG90YWxfcGh5c19zZWdtZW50cyA9IHJlcS0+bnJfcGh5c19zZWdtZW50cyArIG5leHQtPm5yX3BoeXNfc2VnbWVudHM7CkBAIC0zMjcsMTAgKzMwMCwxMCBAQAogCQl0b3RhbF9waHlzX3NlZ21lbnRzLS07CiAJfQogCi0JaWYgKHRvdGFsX3BoeXNfc2VnbWVudHMgPiBxLT5tYXhfcGh5c19zZWdtZW50cykKKwlpZiAodG90YWxfcGh5c19zZWdtZW50cyA+IHF1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEpKQogCQlyZXR1cm4gMDsKIAotCWlmICh0b3RhbF9waHlzX3NlZ21lbnRzID4gcS0+bWF4X2h3X3NlZ21lbnRzKQorCWlmICh0b3RhbF9waHlzX3NlZ21lbnRzID4gcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEpKQogCQlyZXR1cm4gMDsKIAogCS8qIE1lcmdlIGlzIE9LLi4uICovCkBAIC0zNDUsNyArMzE4LDcgQEAKIAkJaW50IGNwdTsKIAogCQljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOwotCQlwYXJ0ID0gZGlza19tYXBfc2VjdG9yX3JjdShyZXEtPnJxX2Rpc2ssIHJlcS0+c2VjdG9yKTsKKwkJcGFydCA9IGRpc2tfbWFwX3NlY3Rvcl9yY3UocmVxLT5ycV9kaXNrLCBibGtfcnFfcG9zKHJlcSkpOwogCiAJCXBhcnRfcm91bmRfc3RhdHMoY3B1LCBwYXJ0KTsKIAkJcGFydF9kZWNfaW5fZmxpZ2h0KHBhcnQpOwpAQCAtMzY2LDcgKzMzOSw3IEBACiAJLyoKIAkgKiBub3QgY29udGlndW91cwogCSAqLwotCWlmIChyZXEtPnNlY3RvciArIHJlcS0+bnJfc2VjdG9ycyAhPSBuZXh0LT5zZWN0b3IpCisJaWYgKGJsa19ycV9wb3MocmVxKSArIGJsa19ycV9zZWN0b3JzKHJlcSkgIT0gYmxrX3JxX3BvcyhuZXh0KSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAocnFfZGF0YV9kaXIocmVxKSAhPSBycV9kYXRhX2RpcihuZXh0KQpAQCAtMzk4LDcgKzM3MSw3IEBACiAJcmVxLT5iaW90YWlsLT5iaV9uZXh0ID0gbmV4dC0+YmlvOwogCXJlcS0+YmlvdGFpbCA9IG5leHQtPmJpb3RhaWw7CiAKLQlyZXEtPm5yX3NlY3RvcnMgPSByZXEtPmhhcmRfbnJfc2VjdG9ycyArPSBuZXh0LT5oYXJkX25yX3NlY3RvcnM7CisJcmVxLT5fX2RhdGFfbGVuICs9IGJsa19ycV9ieXRlcyhuZXh0KTsKIAogCWVsdl9tZXJnZV9yZXF1ZXN0cyhxLCByZXEsIG5leHQpOwogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstc2V0dGluZ3MuYyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCmluZGV4IDU3YWY3MjguLjFjNGRmOWIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCisrKyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIAlxLT5iYWNraW5nX2Rldl9pbmZvLnN0YXRlID0gMDsKIAlxLT5iYWNraW5nX2Rldl9pbmZvLmNhcGFiaWxpdGllcyA9IEJESV9DQVBfTUFQX0NPUFk7CiAJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHEsIFNBRkVfTUFYX1NFQ1RPUlMpOwotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHEsIDUxMik7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShxLCA1MTIpOwogCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHEsIDUxMSk7CiAJYmxrX3F1ZXVlX2Nvbmdlc3Rpb25fdGhyZXNob2xkKHEpOwogCXEtPm5yX2JhdGNoaW5nID0gQkxLX0JBVENIX1JFUTsKQEAgLTE3OSwxNiArMTc5LDE2IEBACiAJICovCiAJaWYgKGJfcGZuIDwgKG1pbl90KHU2NCwgMHhmZmZmZmZmZlVMLCBCTEtfQk9VTkNFX0hJR0gpID4+IFBBR0VfU0hJRlQpKQogCQlkbWEgPSAxOwotCXEtPmJvdW5jZV9wZm4gPSBtYXhfbG93X3BmbjsKKwlxLT5saW1pdHMuYm91bmNlX3BmbiA9IG1heF9sb3dfcGZuOwogI2Vsc2UKIAlpZiAoYl9wZm4gPCBibGtfbWF4X2xvd19wZm4pCiAJCWRtYSA9IDE7Ci0JcS0+Ym91bmNlX3BmbiA9IGJfcGZuOworCXEtPmxpbWl0cy5ib3VuY2VfcGZuID0gYl9wZm47CiAjZW5kaWYKIAlpZiAoZG1hKSB7CiAJCWluaXRfZW1lcmdlbmN5X2lzYV9wb29sKCk7CiAJCXEtPmJvdW5jZV9nZnAgPSBHRlBfTk9JTyB8IEdGUF9ETUE7Ci0JCXEtPmJvdW5jZV9wZm4gPSBiX3BmbjsKKwkJcS0+bGltaXRzLmJvdW5jZV9wZm4gPSBiX3BmbjsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9ib3VuY2VfbGltaXQpOwpAQCAtMjExLDE0ICsyMTEsMjMgQEAKIAl9CiAKIAlpZiAoQkxLX0RFRl9NQVhfU0VDVE9SUyA+IG1heF9zZWN0b3JzKQotCQlxLT5tYXhfaHdfc2VjdG9ycyA9IHEtPm1heF9zZWN0b3JzID0gbWF4X3NlY3RvcnM7CisJCXEtPmxpbWl0cy5tYXhfaHdfc2VjdG9ycyA9IHEtPmxpbWl0cy5tYXhfc2VjdG9ycyA9IG1heF9zZWN0b3JzOwogCWVsc2UgewotCQlxLT5tYXhfc2VjdG9ycyA9IEJMS19ERUZfTUFYX1NFQ1RPUlM7Ci0JCXEtPm1heF9od19zZWN0b3JzID0gbWF4X3NlY3RvcnM7CisJCXEtPmxpbWl0cy5tYXhfc2VjdG9ycyA9IEJMS19ERUZfTUFYX1NFQ1RPUlM7CisJCXEtPmxpbWl0cy5tYXhfaHdfc2VjdG9ycyA9IG1heF9zZWN0b3JzOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX21heF9zZWN0b3JzKTsKIAordm9pZCBibGtfcXVldWVfbWF4X2h3X3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIGludCBtYXhfc2VjdG9ycykKK3sKKwlpZiAoQkxLX0RFRl9NQVhfU0VDVE9SUyA+IG1heF9zZWN0b3JzKQorCQlxLT5saW1pdHMubWF4X2h3X3NlY3RvcnMgPSBCTEtfREVGX01BWF9TRUNUT1JTOworCWVsc2UKKwkJcS0+bGltaXRzLm1heF9od19zZWN0b3JzID0gbWF4X3NlY3RvcnM7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyk7CisKIC8qKgogICogYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzIC0gc2V0IG1heCBwaHlzIHNlZ21lbnRzIGZvciBhIHJlcXVlc3QgZm9yIHRoaXMgcXVldWUKICAqIEBxOiAgdGhlIHJlcXVlc3QgcXVldWUgZm9yIHRoZSBkZXZpY2UKQEAgLTIzOCw3ICsyNDcsNyBAQAogCQkgICAgICAgX19mdW5jX18sIG1heF9zZWdtZW50cyk7CiAJfQogCi0JcS0+bWF4X3BoeXNfc2VnbWVudHMgPSBtYXhfc2VnbWVudHM7CisJcS0+bGltaXRzLm1heF9waHlzX3NlZ21lbnRzID0gbWF4X3NlZ21lbnRzOwogfQogRVhQT1JUX1NZTUJPTChibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHMpOwogCkBAIC0yNjIsNyArMjcxLDcgQEAKIAkJICAgICAgIF9fZnVuY19fLCBtYXhfc2VnbWVudHMpOwogCX0KIAotCXEtPm1heF9od19zZWdtZW50cyA9IG1heF9zZWdtZW50czsKKwlxLT5saW1pdHMubWF4X2h3X3NlZ21lbnRzID0gbWF4X3NlZ21lbnRzOwogfQogRVhQT1JUX1NZTUJPTChibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKTsKIApAQCAtMjgzLDI2ICsyOTIsMTEwIEBACiAJCSAgICAgICBfX2Z1bmNfXywgbWF4X3NpemUpOwogCX0KIAotCXEtPm1heF9zZWdtZW50X3NpemUgPSBtYXhfc2l6ZTsKKwlxLT5saW1pdHMubWF4X3NlZ21lbnRfc2l6ZSA9IG1heF9zaXplOwogfQogRVhQT1JUX1NZTUJPTChibGtfcXVldWVfbWF4X3NlZ21lbnRfc2l6ZSk7CiAKIC8qKgotICogYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUgLSBzZXQgaGFyZHdhcmUgc2VjdG9yIHNpemUgZm9yIHRoZSBxdWV1ZQorICogYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZSAtIHNldCBsb2dpY2FsIGJsb2NrIHNpemUgZm9yIHRoZSBxdWV1ZQogICogQHE6ICB0aGUgcmVxdWVzdCBxdWV1ZSBmb3IgdGhlIGRldmljZQotICogQHNpemU6ICB0aGUgaGFyZHdhcmUgc2VjdG9yIHNpemUsIGluIGJ5dGVzCisgKiBAc2l6ZTogIHRoZSBsb2dpY2FsIGJsb2NrIHNpemUsIGluIGJ5dGVzCiAgKgogICogRGVzY3JpcHRpb246Ci0gKiAgIFRoaXMgc2hvdWxkIHR5cGljYWxseSBiZSBzZXQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSBzZWN0b3Igc2l6ZQotICogICB0aGF0IHRoZSBoYXJkd2FyZSBjYW4gb3BlcmF0ZSBvbiAocG9zc2libGUgd2l0aG91dCByZXZlcnRpbmcgdG8KLSAqICAgZXZlbiBpbnRlcm5hbCByZWFkLW1vZGlmeS13cml0ZSBvcGVyYXRpb25zKS4gVXN1YWxseSB0aGUgZGVmYXVsdAotICogICBvZiA1MTIgY292ZXJzIG1vc3QgaGFyZHdhcmUuCisgKiAgIFRoaXMgc2hvdWxkIGJlIHNldCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIGJsb2NrIHNpemUgdGhhdCB0aGUKKyAqICAgc3RvcmFnZSBkZXZpY2UgY2FuIGFkZHJlc3MuICBUaGUgZGVmYXVsdCBvZiA1MTIgY292ZXJzIG1vc3QKKyAqICAgaGFyZHdhcmUuCiAgKiovCi12b2lkIGJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB1bnNpZ25lZCBzaG9ydCBzaXplKQordm9pZCBibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB1bnNpZ25lZCBzaG9ydCBzaXplKQogewotCXEtPmhhcmRzZWN0X3NpemUgPSBzaXplOworCXEtPmxpbWl0cy5sb2dpY2FsX2Jsb2NrX3NpemUgPSBzaXplOworCisJaWYgKHEtPmxpbWl0cy5waHlzaWNhbF9ibG9ja19zaXplIDwgc2l6ZSkKKwkJcS0+bGltaXRzLnBoeXNpY2FsX2Jsb2NrX3NpemUgPSBzaXplOworCisJaWYgKHEtPmxpbWl0cy5pb19taW4gPCBxLT5saW1pdHMucGh5c2ljYWxfYmxvY2tfc2l6ZSkKKwkJcS0+bGltaXRzLmlvX21pbiA9IHEtPmxpbWl0cy5waHlzaWNhbF9ibG9ja19zaXplOwogfQotRVhQT1JUX1NZTUJPTChibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZSk7CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUpOworCisvKioKKyAqIGJsa19xdWV1ZV9waHlzaWNhbF9ibG9ja19zaXplIC0gc2V0IHBoeXNpY2FsIGJsb2NrIHNpemUgZm9yIHRoZSBxdWV1ZQorICogQHE6ICB0aGUgcmVxdWVzdCBxdWV1ZSBmb3IgdGhlIGRldmljZQorICogQHNpemU6ICB0aGUgcGh5c2ljYWwgYmxvY2sgc2l6ZSwgaW4gYnl0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBsb3dlc3QgcG9zc2libGUgc2VjdG9yIHNpemUgdGhhdCB0aGUKKyAqICAgaGFyZHdhcmUgY2FuIG9wZXJhdGUgb24gd2l0aG91dCByZXZlcnRpbmcgdG8gcmVhZC1tb2RpZnktd3JpdGUKKyAqICAgb3BlcmF0aW9ucy4KKyAqLwordm9pZCBibGtfcXVldWVfcGh5c2ljYWxfYmxvY2tfc2l6ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgc2hvcnQgc2l6ZSkKK3sKKwlxLT5saW1pdHMucGh5c2ljYWxfYmxvY2tfc2l6ZSA9IHNpemU7CisKKwlpZiAocS0+bGltaXRzLnBoeXNpY2FsX2Jsb2NrX3NpemUgPCBxLT5saW1pdHMubG9naWNhbF9ibG9ja19zaXplKQorCQlxLT5saW1pdHMucGh5c2ljYWxfYmxvY2tfc2l6ZSA9IHEtPmxpbWl0cy5sb2dpY2FsX2Jsb2NrX3NpemU7CisKKwlpZiAocS0+bGltaXRzLmlvX21pbiA8IHEtPmxpbWl0cy5waHlzaWNhbF9ibG9ja19zaXplKQorCQlxLT5saW1pdHMuaW9fbWluID0gcS0+bGltaXRzLnBoeXNpY2FsX2Jsb2NrX3NpemU7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9waHlzaWNhbF9ibG9ja19zaXplKTsKKworLyoqCisgKiBibGtfcXVldWVfYWxpZ25tZW50X29mZnNldCAtIHNldCBwaHlzaWNhbCBibG9jayBhbGlnbm1lbnQgb2Zmc2V0CisgKiBAcToJdGhlIHJlcXVlc3QgcXVldWUgZm9yIHRoZSBkZXZpY2UKKyAqIEBhbGlnbm1lbnQ6CWFsaWdubWVudCBvZmZzZXQgaW4gYnl0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgU29tZSBkZXZpY2VzIGFyZSBuYXR1cmFsbHkgbWlzYWxpZ25lZCB0byBjb21wZW5zYXRlIGZvciB0aGluZ3MgbGlrZQorICogICB0aGUgbGVnYWN5IERPUyBwYXJ0aXRpb24gdGFibGUgNjMtc2VjdG9yIG9mZnNldC4gIExvdy1sZXZlbCBkcml2ZXJzCisgKiAgIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gZm9yIGRldmljZXMgd2hvc2UgZmlyc3Qgc2VjdG9yIGlzIG5vdAorICogICBuYXR1cmFsbHkgYWxpZ25lZC4KKyAqLwordm9pZCBibGtfcXVldWVfYWxpZ25tZW50X29mZnNldChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlxLT5saW1pdHMuYWxpZ25tZW50X29mZnNldCA9CisJCW9mZnNldCAmIChxLT5saW1pdHMucGh5c2ljYWxfYmxvY2tfc2l6ZSAtIDEpOworCXEtPmxpbWl0cy5taXNhbGlnbmVkID0gMDsKK30KK0VYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX2FsaWdubWVudF9vZmZzZXQpOworCisvKioKKyAqIGJsa19xdWV1ZV9pb19taW4gLSBzZXQgbWluaW11bSByZXF1ZXN0IHNpemUgZm9yIHRoZSBxdWV1ZQorICogQHE6CXRoZSByZXF1ZXN0IHF1ZXVlIGZvciB0aGUgZGV2aWNlCisgKiBAaW9fbWluOiAgc21hbGxlc3QgSS9PIHNpemUgaW4gYnl0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgU29tZSBkZXZpY2VzIGhhdmUgYW4gaW50ZXJuYWwgYmxvY2sgc2l6ZSBiaWdnZXIgdGhhbiB0aGUgcmVwb3J0ZWQKKyAqICAgaGFyZHdhcmUgc2VjdG9yIHNpemUuICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHNpZ25hbCB0aGUKKyAqICAgc21hbGxlc3QgSS9PIHRoZSBkZXZpY2UgY2FuIHBlcmZvcm0gd2l0aG91dCBpbmN1cnJpbmcgYSBwZXJmb3JtYW5jZQorICogICBwZW5hbHR5LgorICovCit2b2lkIGJsa19xdWV1ZV9pb19taW4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIGludCBtaW4pCit7CisJcS0+bGltaXRzLmlvX21pbiA9IG1pbjsKKworCWlmIChxLT5saW1pdHMuaW9fbWluIDwgcS0+bGltaXRzLmxvZ2ljYWxfYmxvY2tfc2l6ZSkKKwkJcS0+bGltaXRzLmlvX21pbiA9IHEtPmxpbWl0cy5sb2dpY2FsX2Jsb2NrX3NpemU7CisKKwlpZiAocS0+bGltaXRzLmlvX21pbiA8IHEtPmxpbWl0cy5waHlzaWNhbF9ibG9ja19zaXplKQorCQlxLT5saW1pdHMuaW9fbWluID0gcS0+bGltaXRzLnBoeXNpY2FsX2Jsb2NrX3NpemU7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9pb19taW4pOworCisvKioKKyAqIGJsa19xdWV1ZV9pb19vcHQgLSBzZXQgb3B0aW1hbCByZXF1ZXN0IHNpemUgZm9yIHRoZSBxdWV1ZQorICogQHE6CXRoZSByZXF1ZXN0IHF1ZXVlIGZvciB0aGUgZGV2aWNlCisgKiBAaW9fb3B0OiAgb3B0aW1hbCByZXF1ZXN0IHNpemUgaW4gYnl0ZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgRHJpdmVycyBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIHNldCB0aGUgcHJlZmVycmVkIEkvTyByZXF1ZXN0CisgKiAgIHNpemUgZm9yIGRldmljZXMgdGhhdCByZXBvcnQgc3VjaCBhIHZhbHVlLgorICovCit2b2lkIGJsa19xdWV1ZV9pb19vcHQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHVuc2lnbmVkIGludCBvcHQpCit7CisJcS0+bGltaXRzLmlvX29wdCA9IG9wdDsKK30KK0VYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX2lvX29wdCk7CiAKIC8qCiAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHRoYXQgaXMgX25vdF8gemVybywgdW5sZXNzIGJvdGggYXJlIHplcm8uCkBAIC0zMTcsMTQgKzQxMCwyNyBAQAogdm9pZCBibGtfcXVldWVfc3RhY2tfbGltaXRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICp0LCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYikKIHsKIAkvKiB6ZXJvIGlzICJpbmZpbml0eSIgKi8KLQl0LT5tYXhfc2VjdG9ycyA9IG1pbl9ub3RfemVybyh0LT5tYXhfc2VjdG9ycywgYi0+bWF4X3NlY3RvcnMpOwotCXQtPm1heF9od19zZWN0b3JzID0gbWluX25vdF96ZXJvKHQtPm1heF9od19zZWN0b3JzLCBiLT5tYXhfaHdfc2VjdG9ycyk7Ci0JdC0+c2VnX2JvdW5kYXJ5X21hc2sgPSBtaW5fbm90X3plcm8odC0+c2VnX2JvdW5kYXJ5X21hc2ssIGItPnNlZ19ib3VuZGFyeV9tYXNrKTsKKwl0LT5saW1pdHMubWF4X3NlY3RvcnMgPSBtaW5fbm90X3plcm8ocXVldWVfbWF4X3NlY3RvcnModCksCisJCQkJCSAgICAgcXVldWVfbWF4X3NlY3RvcnMoYikpOwogCi0JdC0+bWF4X3BoeXNfc2VnbWVudHMgPSBtaW5fbm90X3plcm8odC0+bWF4X3BoeXNfc2VnbWVudHMsIGItPm1heF9waHlzX3NlZ21lbnRzKTsKLQl0LT5tYXhfaHdfc2VnbWVudHMgPSBtaW5fbm90X3plcm8odC0+bWF4X2h3X3NlZ21lbnRzLCBiLT5tYXhfaHdfc2VnbWVudHMpOwotCXQtPm1heF9zZWdtZW50X3NpemUgPSBtaW5fbm90X3plcm8odC0+bWF4X3NlZ21lbnRfc2l6ZSwgYi0+bWF4X3NlZ21lbnRfc2l6ZSk7Ci0JdC0+aGFyZHNlY3Rfc2l6ZSA9IG1heCh0LT5oYXJkc2VjdF9zaXplLCBiLT5oYXJkc2VjdF9zaXplKTsKKwl0LT5saW1pdHMubWF4X2h3X3NlY3RvcnMgPSBtaW5fbm90X3plcm8ocXVldWVfbWF4X2h3X3NlY3RvcnModCksCisJCQkJCQlxdWV1ZV9tYXhfaHdfc2VjdG9ycyhiKSk7CisKKwl0LT5saW1pdHMuc2VnX2JvdW5kYXJ5X21hc2sgPSBtaW5fbm90X3plcm8ocXVldWVfc2VnbWVudF9ib3VuZGFyeSh0KSwKKwkJCQkJCSAgIHF1ZXVlX3NlZ21lbnRfYm91bmRhcnkoYikpOworCisJdC0+bGltaXRzLm1heF9waHlzX3NlZ21lbnRzID0gbWluX25vdF96ZXJvKHF1ZXVlX21heF9waHlzX3NlZ21lbnRzKHQpLAorCQkJCQkJICAgcXVldWVfbWF4X3BoeXNfc2VnbWVudHMoYikpOworCisJdC0+bGltaXRzLm1heF9od19zZWdtZW50cyA9IG1pbl9ub3RfemVybyhxdWV1ZV9tYXhfaHdfc2VnbWVudHModCksCisJCQkJCQkgcXVldWVfbWF4X2h3X3NlZ21lbnRzKGIpKTsKKworCXQtPmxpbWl0cy5tYXhfc2VnbWVudF9zaXplID0gbWluX25vdF96ZXJvKHF1ZXVlX21heF9zZWdtZW50X3NpemUodCksCisJCQkJCQkgIHF1ZXVlX21heF9zZWdtZW50X3NpemUoYikpOworCisJdC0+bGltaXRzLmxvZ2ljYWxfYmxvY2tfc2l6ZSA9IG1heChxdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUodCksCisJCQkJCSAgIHF1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShiKSk7CisKIAlpZiAoIXQtPnF1ZXVlX2xvY2spCiAJCVdBUk5fT05fT05DRSgxKTsKIAllbHNlIGlmICghdGVzdF9iaXQoUVVFVUVfRkxBR19DTFVTVEVSLCAmYi0+cXVldWVfZmxhZ3MpKSB7CkBAIC0zMzcsNiArNDQzLDEwOSBAQAogRVhQT1JUX1NZTUJPTChibGtfcXVldWVfc3RhY2tfbGltaXRzKTsKIAogLyoqCisgKiBibGtfc3RhY2tfbGltaXRzIC0gYWRqdXN0IHF1ZXVlX2xpbWl0cyBmb3Igc3RhY2tlZCBkZXZpY2VzCisgKiBAdDoJdGhlIHN0YWNraW5nIGRyaXZlciBsaW1pdHMgKHRvcCkKKyAqIEBiOiAgdGhlIHVuZGVybHlpbmcgcXVldWUgbGltaXRzIChib3R0b20pCisgKiBAb2Zmc2V0OiAgb2Zmc2V0IHRvIGJlZ2lubmluZyBvZiBkYXRhIHdpdGhpbiBjb21wb25lbnQgZGV2aWNlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBNZXJnZXMgdHdvIHF1ZXVlX2xpbWl0IHN0cnVjdHMuICBSZXR1cm5zIDAgaWYgYWxpZ25tZW50IGRpZG4ndAorICogICAgY2hhbmdlLiAgUmV0dXJucyAtMSBpZiBhZGRpbmcgdGhlIGJvdHRvbSBkZXZpY2UgY2F1c2VkCisgKiAgICBtaXNhbGlnbm1lbnQuCisgKi8KK2ludCBibGtfc3RhY2tfbGltaXRzKHN0cnVjdCBxdWV1ZV9saW1pdHMgKnQsIHN0cnVjdCBxdWV1ZV9saW1pdHMgKmIsCisJCSAgICAgc2VjdG9yX3Qgb2Zmc2V0KQoreworCXQtPm1heF9zZWN0b3JzID0gbWluX25vdF96ZXJvKHQtPm1heF9zZWN0b3JzLCBiLT5tYXhfc2VjdG9ycyk7CisJdC0+bWF4X2h3X3NlY3RvcnMgPSBtaW5fbm90X3plcm8odC0+bWF4X2h3X3NlY3RvcnMsIGItPm1heF9od19zZWN0b3JzKTsKKwl0LT5ib3VuY2VfcGZuID0gbWluX25vdF96ZXJvKHQtPmJvdW5jZV9wZm4sIGItPmJvdW5jZV9wZm4pOworCisJdC0+c2VnX2JvdW5kYXJ5X21hc2sgPSBtaW5fbm90X3plcm8odC0+c2VnX2JvdW5kYXJ5X21hc2ssCisJCQkJCSAgICBiLT5zZWdfYm91bmRhcnlfbWFzayk7CisKKwl0LT5tYXhfcGh5c19zZWdtZW50cyA9IG1pbl9ub3RfemVybyh0LT5tYXhfcGh5c19zZWdtZW50cywKKwkJCQkJICAgIGItPm1heF9waHlzX3NlZ21lbnRzKTsKKworCXQtPm1heF9od19zZWdtZW50cyA9IG1pbl9ub3RfemVybyh0LT5tYXhfaHdfc2VnbWVudHMsCisJCQkJCSAgYi0+bWF4X2h3X3NlZ21lbnRzKTsKKworCXQtPm1heF9zZWdtZW50X3NpemUgPSBtaW5fbm90X3plcm8odC0+bWF4X3NlZ21lbnRfc2l6ZSwKKwkJCQkJICAgYi0+bWF4X3NlZ21lbnRfc2l6ZSk7CisKKwl0LT5sb2dpY2FsX2Jsb2NrX3NpemUgPSBtYXgodC0+bG9naWNhbF9ibG9ja19zaXplLAorCQkJCSAgICBiLT5sb2dpY2FsX2Jsb2NrX3NpemUpOworCisJdC0+cGh5c2ljYWxfYmxvY2tfc2l6ZSA9IG1heCh0LT5waHlzaWNhbF9ibG9ja19zaXplLAorCQkJCSAgICAgYi0+cGh5c2ljYWxfYmxvY2tfc2l6ZSk7CisKKwl0LT5pb19taW4gPSBtYXgodC0+aW9fbWluLCBiLT5pb19taW4pOworCXQtPm5vX2NsdXN0ZXIgfD0gYi0+bm9fY2x1c3RlcjsKKworCS8qIEJvdHRvbSBkZXZpY2Ugb2Zmc2V0IGFsaWduZWQ/ICovCisJaWYgKG9mZnNldCAmJgorCSAgICAob2Zmc2V0ICYgKGItPnBoeXNpY2FsX2Jsb2NrX3NpemUgLSAxKSkgIT0gYi0+YWxpZ25tZW50X29mZnNldCkgeworCQl0LT5taXNhbGlnbmVkID0gMTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIElmIHRvcCBoYXMgbm8gYWxpZ25tZW50IG9mZnNldCwgaW5oZXJpdCBmcm9tIGJvdHRvbSAqLworCWlmICghdC0+YWxpZ25tZW50X29mZnNldCkKKwkJdC0+YWxpZ25tZW50X29mZnNldCA9CisJCQliLT5hbGlnbm1lbnRfb2Zmc2V0ICYgKGItPnBoeXNpY2FsX2Jsb2NrX3NpemUgLSAxKTsKKworCS8qIFRvcCBkZXZpY2UgYWxpZ25lZCBvbiBsb2dpY2FsIGJsb2NrIGJvdW5kYXJ5PyAqLworCWlmICh0LT5hbGlnbm1lbnRfb2Zmc2V0ICYgKHQtPmxvZ2ljYWxfYmxvY2tfc2l6ZSAtIDEpKSB7CisJCXQtPm1pc2FsaWduZWQgPSAxOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19zdGFja19saW1pdHMpOworCisvKioKKyAqIGRpc2tfc3RhY2tfbGltaXRzIC0gYWRqdXN0IHF1ZXVlIGxpbWl0cyBmb3Igc3RhY2tlZCBkcml2ZXJzCisgKiBAZGlzazogIE1EL0RNIGdlbmRpc2sgKHRvcCkKKyAqIEBiZGV2OiAgdGhlIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlIChib3R0b20pCisgKiBAb2Zmc2V0OiAgb2Zmc2V0IHRvIGJlZ2lubmluZyBvZiBkYXRhIHdpdGhpbiBjb21wb25lbnQgZGV2aWNlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICBNZXJnZXMgdGhlIGxpbWl0cyBmb3IgdHdvIHF1ZXVlcy4gIFJldHVybnMgMCBpZiBhbGlnbm1lbnQKKyAqICAgIGRpZG4ndCBjaGFuZ2UuICBSZXR1cm5zIC0xIGlmIGFkZGluZyB0aGUgYm90dG9tIGRldmljZSBjYXVzZWQKKyAqICAgIG1pc2FsaWdubWVudC4KKyAqLwordm9pZCBkaXNrX3N0YWNrX2xpbWl0cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJICAgICAgIHNlY3Rvcl90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqdCA9IGRpc2stPnF1ZXVlOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpiID0gYmRldl9nZXRfcXVldWUoYmRldik7CisKKwlvZmZzZXQgKz0gZ2V0X3N0YXJ0X3NlY3QoYmRldikgPDwgOTsKKworCWlmIChibGtfc3RhY2tfbGltaXRzKCZ0LT5saW1pdHMsICZiLT5saW1pdHMsIG9mZnNldCkgPCAwKSB7CisJCWNoYXIgdG9wW0JERVZOQU1FX1NJWkVdLCBib3R0b21bQkRFVk5BTUVfU0laRV07CisKKwkJZGlza19uYW1lKGRpc2ssIDAsIHRvcCk7CisJCWJkZXZuYW1lKGJkZXYsIGJvdHRvbSk7CisKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogV2FybmluZzogRGV2aWNlICVzIGlzIG1pc2FsaWduZWRcbiIsCisJCSAgICAgICB0b3AsIGJvdHRvbSk7CisJfQorCisJaWYgKCF0LT5xdWV1ZV9sb2NrKQorCQlXQVJOX09OX09OQ0UoMSk7CisJZWxzZSBpZiAoIXRlc3RfYml0KFFVRVVFX0ZMQUdfQ0xVU1RFUiwgJmItPnF1ZXVlX2ZsYWdzKSkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKHQtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCF0ZXN0X2JpdChRVUVVRV9GTEFHX0NMVVNURVIsICZiLT5xdWV1ZV9mbGFncykpCisJCQlxdWV1ZV9mbGFnX2NsZWFyKFFVRVVFX0ZMQUdfQ0xVU1RFUiwgdCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUodC0+cXVldWVfbG9jaywgZmxhZ3MpOworCX0KK30KK0VYUE9SVF9TWU1CT0woZGlza19zdGFja19saW1pdHMpOworCisvKioKICAqIGJsa19xdWV1ZV9kbWFfcGFkIC0gc2V0IHBhZCBtYXNrCiAgKiBAcTogICAgIHRoZSByZXF1ZXN0IHF1ZXVlIGZvciB0aGUgZGV2aWNlCiAgKiBAbWFzazogIHBhZCBtYXNrCkBAIC0zOTYsMTEgKzYwNSwxMSBAQAogCQkJICAgICAgIGRtYV9kcmFpbl9uZWVkZWRfZm4gKmRtYV9kcmFpbl9uZWVkZWQsCiAJCQkgICAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKLQlpZiAocS0+bWF4X2h3X3NlZ21lbnRzIDwgMiB8fCBxLT5tYXhfcGh5c19zZWdtZW50cyA8IDIpCisJaWYgKHF1ZXVlX21heF9od19zZWdtZW50cyhxKSA8IDIgfHwgcXVldWVfbWF4X3BoeXNfc2VnbWVudHMocSkgPCAyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBtYWtlIHJvb20gZm9yIGFwcGVuZGluZyB0aGUgZHJhaW4gKi8KLQktLXEtPm1heF9od19zZWdtZW50czsKLQktLXEtPm1heF9waHlzX3NlZ21lbnRzOworCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEpIC0gMSk7CisJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIHF1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEpIC0gMSk7CiAJcS0+ZG1hX2RyYWluX25lZWRlZCA9IGRtYV9kcmFpbl9uZWVkZWQ7CiAJcS0+ZG1hX2RyYWluX2J1ZmZlciA9IGJ1ZjsKIAlxLT5kbWFfZHJhaW5fc2l6ZSA9IHNpemU7CkBAIC00MjIsNyArNjMxLDcgQEAKIAkJICAgICAgIF9fZnVuY19fLCBtYXNrKTsKIAl9CiAKLQlxLT5zZWdfYm91bmRhcnlfbWFzayA9IG1hc2s7CisJcS0+bGltaXRzLnNlZ19ib3VuZGFyeV9tYXNrID0gbWFzazsKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX3NlZ21lbnRfYm91bmRhcnkpOwogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstc3lzZnMuYyBiL2Jsb2NrL2Jsay1zeXNmcy5jCmluZGV4IDNmZjliYmEuLmIxY2QwNDAgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zeXNmcy5jCisrKyBiL2Jsb2NrL2Jsay1zeXNmcy5jCkBAIC05NSwyMSArOTUsMzYgQEAKIAogc3RhdGljIHNzaXplX3QgcXVldWVfbWF4X3NlY3RvcnNfc2hvdyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqcGFnZSkKIHsKLQlpbnQgbWF4X3NlY3RvcnNfa2IgPSBxLT5tYXhfc2VjdG9ycyA+PiAxOworCWludCBtYXhfc2VjdG9yc19rYiA9IHF1ZXVlX21heF9zZWN0b3JzKHEpID4+IDE7CiAKIAlyZXR1cm4gcXVldWVfdmFyX3Nob3cobWF4X3NlY3RvcnNfa2IsIChwYWdlKSk7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHF1ZXVlX2h3X3NlY3Rvcl9zaXplX3Nob3coc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKnBhZ2UpCitzdGF0aWMgc3NpemVfdCBxdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemVfc2hvdyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqcGFnZSkKIHsKLQlyZXR1cm4gcXVldWVfdmFyX3Nob3cocS0+aGFyZHNlY3Rfc2l6ZSwgcGFnZSk7CisJcmV0dXJuIHF1ZXVlX3Zhcl9zaG93KHF1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShxKSwgcGFnZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHF1ZXVlX3BoeXNpY2FsX2Jsb2NrX3NpemVfc2hvdyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gcXVldWVfdmFyX3Nob3cocXVldWVfcGh5c2ljYWxfYmxvY2tfc2l6ZShxKSwgcGFnZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHF1ZXVlX2lvX21pbl9zaG93KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpwYWdlKQoreworCXJldHVybiBxdWV1ZV92YXJfc2hvdyhxdWV1ZV9pb19taW4ocSksIHBhZ2UpOworfQorCitzdGF0aWMgc3NpemVfdCBxdWV1ZV9pb19vcHRfc2hvdyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqcGFnZSkKK3sKKwlyZXR1cm4gcXVldWVfdmFyX3Nob3cocXVldWVfaW9fb3B0KHEpLCBwYWdlKTsKIH0KIAogc3RhdGljIHNzaXplX3QKIHF1ZXVlX21heF9zZWN0b3JzX3N0b3JlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjb25zdCBjaGFyICpwYWdlLCBzaXplX3QgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXhfc2VjdG9yc19rYiwKLQkJCW1heF9od19zZWN0b3JzX2tiID0gcS0+bWF4X2h3X3NlY3RvcnMgPj4gMSwKKwkJbWF4X2h3X3NlY3RvcnNfa2IgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSA+PiAxLAogCQkJcGFnZV9rYiA9IDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSAxMCk7CiAJc3NpemVfdCByZXQgPSBxdWV1ZV92YXJfc3RvcmUoJm1heF9zZWN0b3JzX2tiLCBwYWdlLCBjb3VudCk7CiAKQEAgLTExNyw3ICsxMzIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JcS0+bWF4X3NlY3RvcnMgPSBtYXhfc2VjdG9yc19rYiA8PCAxOworCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCBtYXhfc2VjdG9yc19rYiA8PCAxKTsKIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTI1LDcgKzE0MCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IHF1ZXVlX21heF9od19zZWN0b3JzX3Nob3coc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKnBhZ2UpCiB7Ci0JaW50IG1heF9od19zZWN0b3JzX2tiID0gcS0+bWF4X2h3X3NlY3RvcnMgPj4gMTsKKwlpbnQgbWF4X2h3X3NlY3RvcnNfa2IgPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSA+PiAxOwogCiAJcmV0dXJuIHF1ZXVlX3Zhcl9zaG93KG1heF9od19zZWN0b3JzX2tiLCAocGFnZSkpOwogfQpAQCAtMjQ5LDcgKzI2NCwyNyBAQAogCiBzdGF0aWMgc3RydWN0IHF1ZXVlX3N5c2ZzX2VudHJ5IHF1ZXVlX2h3X3NlY3Rvcl9zaXplX2VudHJ5ID0gewogCS5hdHRyID0gey5uYW1lID0gImh3X3NlY3Rvcl9zaXplIiwgLm1vZGUgPSBTX0lSVUdPIH0sCi0JLnNob3cgPSBxdWV1ZV9od19zZWN0b3Jfc2l6ZV9zaG93LAorCS5zaG93ID0gcXVldWVfbG9naWNhbF9ibG9ja19zaXplX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IHF1ZXVlX3N5c2ZzX2VudHJ5IHF1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZV9lbnRyeSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJsb2dpY2FsX2Jsb2NrX3NpemUiLCAubW9kZSA9IFNfSVJVR08gfSwKKwkuc2hvdyA9IHF1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZV9zaG93LAorfTsKKworc3RhdGljIHN0cnVjdCBxdWV1ZV9zeXNmc19lbnRyeSBxdWV1ZV9waHlzaWNhbF9ibG9ja19zaXplX2VudHJ5ID0geworCS5hdHRyID0gey5uYW1lID0gInBoeXNpY2FsX2Jsb2NrX3NpemUiLCAubW9kZSA9IFNfSVJVR08gfSwKKwkuc2hvdyA9IHF1ZXVlX3BoeXNpY2FsX2Jsb2NrX3NpemVfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXVldWVfc3lzZnNfZW50cnkgcXVldWVfaW9fbWluX2VudHJ5ID0geworCS5hdHRyID0gey5uYW1lID0gIm1pbmltdW1faW9fc2l6ZSIsIC5tb2RlID0gU19JUlVHTyB9LAorCS5zaG93ID0gcXVldWVfaW9fbWluX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IHF1ZXVlX3N5c2ZzX2VudHJ5IHF1ZXVlX2lvX29wdF9lbnRyeSA9IHsKKwkuYXR0ciA9IHsubmFtZSA9ICJvcHRpbWFsX2lvX3NpemUiLCAubW9kZSA9IFNfSVJVR08gfSwKKwkuc2hvdyA9IHF1ZXVlX2lvX29wdF9zaG93LAogfTsKIAogc3RhdGljIHN0cnVjdCBxdWV1ZV9zeXNmc19lbnRyeSBxdWV1ZV9ub25yb3RfZW50cnkgPSB7CkBAIC0yODMsNiArMzE4LDEwIEBACiAJJnF1ZXVlX21heF9zZWN0b3JzX2VudHJ5LmF0dHIsCiAJJnF1ZXVlX2lvc2NoZWRfZW50cnkuYXR0ciwKIAkmcXVldWVfaHdfc2VjdG9yX3NpemVfZW50cnkuYXR0ciwKKwkmcXVldWVfbG9naWNhbF9ibG9ja19zaXplX2VudHJ5LmF0dHIsCisJJnF1ZXVlX3BoeXNpY2FsX2Jsb2NrX3NpemVfZW50cnkuYXR0ciwKKwkmcXVldWVfaW9fbWluX2VudHJ5LmF0dHIsCisJJnF1ZXVlX2lvX29wdF9lbnRyeS5hdHRyLAogCSZxdWV1ZV9ub25yb3RfZW50cnkuYXR0ciwKIAkmcXVldWVfbm9tZXJnZXNfZW50cnkuYXR0ciwKIAkmcXVldWVfcnFfYWZmaW5pdHlfZW50cnkuYXR0ciwKQEAgLTM4MywyMiArNDIyLDI2IEBACiBpbnQgYmxrX3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCBnZW5kaXNrICpkaXNrKQogewogCWludCByZXQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGlza190b19kZXYoZGlzayk7CiAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRpc2stPnF1ZXVlOwogCiAJaWYgKFdBUk5fT04oIXEpKQogCQlyZXR1cm4gLUVOWElPOwogCi0JaWYgKCFxLT5yZXF1ZXN0X2ZuKQotCQlyZXR1cm4gMDsKKwlyZXQgPSBibGtfdHJhY2VfaW5pdF9zeXNmcyhkZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBrb2JqZWN0X2FkZCgmcS0+a29iaiwga29iamVjdF9nZXQoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqKSwKLQkJCSAgIiVzIiwgInF1ZXVlIik7CisJcmV0ID0ga29iamVjdF9hZGQoJnEtPmtvYmosIGtvYmplY3RfZ2V0KCZkZXYtPmtvYmopLCAiJXMiLCAicXVldWUiKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCWtvYmplY3RfdWV2ZW50KCZxLT5rb2JqLCBLT0JKX0FERCk7CiAKKwlpZiAoIXEtPnJlcXVlc3RfZm4pCisJCXJldHVybiAwOworCiAJcmV0ID0gZWx2X3JlZ2lzdGVyX3F1ZXVlKHEpOwogCWlmIChyZXQpIHsKIAkJa29iamVjdF91ZXZlbnQoJnEtPmtvYmosIEtPQkpfUkVNT1ZFKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay10YWcuYyBiL2Jsb2NrL2Jsay10YWcuYwppbmRleCAzYzUxOGUzLi4yZTVjZmViIDEwMDY0NAotLS0gYS9ibG9jay9ibGstdGFnLmMKKysrIGIvYmxvY2svYmxrLXRhZy5jCkBAIC0zMzYsNyArMzM2LDcgQEAKIGludCBibGtfcXVldWVfc3RhcnRfdGFnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IGJsa19xdWV1ZV90YWcgKmJxdCA9IHEtPnF1ZXVlX3RhZ3M7Ci0JdW5zaWduZWQgbWF4X2RlcHRoLCBvZmZzZXQ7CisJdW5zaWduZWQgbWF4X2RlcHRoOwogCWludCB0YWc7CiAKIAlpZiAodW5saWtlbHkoKHJxLT5jbWRfZmxhZ3MgJiBSRVFfUVVFVUVEKSkpIHsKQEAgLTM1NSwxMyArMzU1LDE2IEBACiAJICogdG8gc3RhcnZlIHN5bmMgSU8gb24gYmVoYWxmIG9mIGZsb29kaW5nIGFzeW5jIElPLgogCSAqLwogCW1heF9kZXB0aCA9IGJxdC0+bWF4X2RlcHRoOwotCWlmIChycV9pc19zeW5jKHJxKSkKLQkJb2Zmc2V0ID0gMDsKLQllbHNlCi0JCW9mZnNldCA9IG1heF9kZXB0aCA+PiAyOworCWlmICghcnFfaXNfc3luYyhycSkgJiYgbWF4X2RlcHRoID4gMSkgeworCQltYXhfZGVwdGggLT0gMjsKKwkJaWYgKCFtYXhfZGVwdGgpCisJCQltYXhfZGVwdGggPSAxOworCQlpZiAocS0+aW5fZmxpZ2h0WzBdID4gbWF4X2RlcHRoKQorCQkJcmV0dXJuIDE7CisJfQogCiAJZG8gewotCQl0YWcgPSBmaW5kX25leHRfemVyb19iaXQoYnF0LT50YWdfbWFwLCBtYXhfZGVwdGgsIG9mZnNldCk7CisJCXRhZyA9IGZpbmRfZmlyc3RfemVyb19iaXQoYnF0LT50YWdfbWFwLCBtYXhfZGVwdGgpOwogCQlpZiAodGFnID49IG1heF9kZXB0aCkKIAkJCXJldHVybiAxOwogCkBAIC0zNzQsNyArMzc3LDcgQEAKIAlycS0+Y21kX2ZsYWdzIHw9IFJFUV9RVUVVRUQ7CiAJcnEtPnRhZyA9IHRhZzsKIAlicXQtPnRhZ19pbmRleFt0YWddID0gcnE7Ci0JYmxrZGV2X2RlcXVldWVfcmVxdWVzdChycSk7CisJYmxrX3N0YXJ0X3JlcXVlc3QocnEpOwogCWxpc3RfYWRkKCZycS0+cXVldWVsaXN0LCAmcS0+dGFnX2J1c3lfbGlzdCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9ibG9jay9ibGstdGltZW91dC5jIGIvYmxvY2svYmxrLXRpbWVvdXQuYwppbmRleCAxZWMwZDUwLi4xYmE3ZTBhIDEwMDY0NAotLS0gYS9ibG9jay9ibGstdGltZW91dC5jCisrKyBiL2Jsb2NrL2Jsay10aW1lb3V0LmMKQEAgLTEyMiwxMCArMTIyLDggQEAKIAkJCWlmIChibGtfbWFya19ycV9jb21wbGV0ZShycSkpCiAJCQkJY29udGludWU7CiAJCQlibGtfcnFfdGltZWRfb3V0KHJxKTsKLQkJfSBlbHNlIHsKLQkJCWlmICghbmV4dCB8fCB0aW1lX2FmdGVyKG5leHQsIHJxLT5kZWFkbGluZSkpCi0JCQkJbmV4dCA9IHJxLT5kZWFkbGluZTsKLQkJfQorCQl9IGVsc2UgaWYgKCFuZXh0IHx8IHRpbWVfYWZ0ZXIobmV4dCwgcnEtPmRlYWRsaW5lKSkKKwkJCW5leHQgPSBycS0+ZGVhZGxpbmU7CiAJfQogCiAJLyoKQEAgLTE3NiwxNiArMTc0LDE0IEBACiAJQlVHX09OKCFsaXN0X2VtcHR5KCZyZXEtPnRpbWVvdXRfbGlzdCkpOwogCUJVR19PTih0ZXN0X2JpdChSRVFfQVRPTV9DT01QTEVURSwgJnJlcS0+YXRvbWljX2ZsYWdzKSk7CiAKLQlpZiAocmVxLT50aW1lb3V0KQotCQlyZXEtPmRlYWRsaW5lID0gamlmZmllcyArIHJlcS0+dGltZW91dDsKLQllbHNlIHsKLQkJcmVxLT5kZWFkbGluZSA9IGppZmZpZXMgKyBxLT5ycV90aW1lb3V0OwotCQkvKgotCQkgKiBTb21lIExMRHMsIGxpa2Ugc2NzaSwgcGVlayBhdCB0aGUgdGltZW91dCB0byBwcmV2ZW50Ci0JCSAqIGEgY29tbWFuZCBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlci4KLQkJICovCisJLyoKKwkgKiBTb21lIExMRHMsIGxpa2Ugc2NzaSwgcGVlayBhdCB0aGUgdGltZW91dCB0byBwcmV2ZW50IGEKKwkgKiBjb21tYW5kIGZyb20gYmVpbmcgcmV0cmllZCBmb3JldmVyLgorCSAqLworCWlmICghcmVxLT50aW1lb3V0KQogCQlyZXEtPnRpbWVvdXQgPSBxLT5ycV90aW1lb3V0OwotCX0KKworCXJlcS0+ZGVhZGxpbmUgPSBqaWZmaWVzICsgcmVxLT50aW1lb3V0OwogCWxpc3RfYWRkX3RhaWwoJnJlcS0+dGltZW91dF9saXN0LCAmcS0+dGltZW91dF9saXN0KTsKIAogCS8qCmRpZmYgLS1naXQgYS9ibG9jay9ibGsuaCBiL2Jsb2NrL2Jsay5oCmluZGV4IDc5Yzg1ZjcuLjNmYWU2YWQgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay5oCisrKyBiL2Jsb2NrL2Jsay5oCkBAIC0xMyw2ICsxMyw5IEBACiB2b2lkIGluaXRfcmVxdWVzdF9mcm9tX2JpbyhzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBzdHJ1Y3QgYmlvICpiaW8pOwogdm9pZCBibGtfcnFfYmlvX3ByZXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCXN0cnVjdCBiaW8gKmJpbyk7CitpbnQgYmxrX3JxX2FwcGVuZF9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKKwkJICAgICAgc3RydWN0IGJpbyAqYmlvKTsKK3ZvaWQgYmxrX2RlcXVldWVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcnEpOwogdm9pZCBfX2Jsa19xdWV1ZV9mcmVlX3RhZ3Moc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwogCiB2b2lkIGJsa191bnBsdWdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwpAQCAtNDMsNiArNDYsNDMgQEAKIAljbGVhcl9iaXQoUkVRX0FUT01fQ09NUExFVEUsICZycS0+YXRvbWljX2ZsYWdzKTsKIH0KIAorLyoKKyAqIEludGVybmFsIGVsZXZhdG9yIGludGVyZmFjZQorICovCisjZGVmaW5lIEVMVl9PTl9IQVNIKHJxKQkJKCFobGlzdF91bmhhc2hlZCgmKHJxKS0+aGFzaCkpCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3QgKl9fZWx2X25leHRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcnE7CisKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlX2hlYWQpKSB7CisJCQlycSA9IGxpc3RfZW50cnlfcnEocS0+cXVldWVfaGVhZC5uZXh0KTsKKwkJCWlmIChibGtfZG9fb3JkZXJlZChxLCAmcnEpKQorCQkJCXJldHVybiBycTsKKwkJfQorCisJCWlmICghcS0+ZWxldmF0b3ItPm9wcy0+ZWxldmF0b3JfZGlzcGF0Y2hfZm4ocSwgMCkpCisJCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbHZfYWN0aXZhdGVfcnEoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUgPSBxLT5lbGV2YXRvcjsKKworCWlmIChlLT5vcHMtPmVsZXZhdG9yX2FjdGl2YXRlX3JlcV9mbikKKwkJZS0+b3BzLT5lbGV2YXRvcl9hY3RpdmF0ZV9yZXFfZm4ocSwgcnEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZWx2X2RlYWN0aXZhdGVfcnEoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUgPSBxLT5lbGV2YXRvcjsKKworCWlmIChlLT5vcHMtPmVsZXZhdG9yX2RlYWN0aXZhdGVfcmVxX2ZuKQorCQllLT5vcHMtPmVsZXZhdG9yX2RlYWN0aXZhdGVfcmVxX2ZuKHEsIHJxKTsKK30KKwogI2lmZGVmIENPTkZJR19GQUlMX0lPX1RJTUVPVVQKIGludCBibGtfc2hvdWxkX2Zha2VfdGltZW91dChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIHNzaXplX3QgcGFydF90aW1lb3V0X3Nob3coc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqLCBjaGFyICopOwpAQCAtNjQsNyArMTA0LDYgQEAKIGludCBhdHRlbXB0X2JhY2tfbWVyZ2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSk7CiBpbnQgYXR0ZW1wdF9mcm9udF9tZXJnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKTsKIHZvaWQgYmxrX3JlY2FsY19ycV9zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdCAqcnEpOwotdm9pZCBibGtfcmVjYWxjX3JxX3NlY3RvcnMoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgbnNlY3QpOwogCiB2b2lkIGJsa19xdWV1ZV9jb25nZXN0aW9uX3RocmVzaG9sZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAKQEAgLTExMiw5ICsxNTEsMTcgQEAKICNlbmRpZgogfQogCisvKgorICogQ29udHJpYnV0ZSB0byBJTyBzdGF0aXN0aWNzIElGRjoKKyAqCisgKglhKSBpdCdzIGF0dGFjaGVkIHRvIGEgZ2VuZGlzaywgYW5kCisgKgliKSB0aGUgcXVldWUgaGFkIElPIHN0YXRzIGVuYWJsZWQgd2hlbiB0aGlzIHJlcXVlc3Qgd2FzIHN0YXJ0ZWQsIGFuZAorICoJYykgaXQncyBhIGZpbGUgc3lzdGVtIHJlcXVlc3Qgb3IgYSBkaXNjYXJkIHJlcXVlc3QKKyAqLwogc3RhdGljIGlubGluZSBpbnQgYmxrX2RvX2lvX3N0YXQoc3RydWN0IHJlcXVlc3QgKnJxKQogewotCXJldHVybiBycS0+cnFfZGlzayAmJiBibGtfcnFfaW9fc3RhdChycSk7CisJcmV0dXJuIHJxLT5ycV9kaXNrICYmIGJsa19ycV9pb19zdGF0KHJxKSAmJgorCSAgICAgICAoYmxrX2ZzX3JlcXVlc3QocnEpIHx8IGJsa19kaXNjYXJkX3JxKHJxKSk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYmxvY2svYnNnLmMgYi9ibG9jay9ic2cuYwppbmRleCBkZDgxYmU0Li41MzU4ZjlhIDEwMDY0NAotLS0gYS9ibG9jay9ic2cuYworKysgYi9ibG9jay9ic2cuYwpAQCAtNDQ2LDE1ICs0NDYsMTUgQEAKIAl9CiAKIAlpZiAocnEtPm5leHRfcnEpIHsKLQkJaGRyLT5kb3V0X3Jlc2lkID0gcnEtPmRhdGFfbGVuOwotCQloZHItPmRpbl9yZXNpZCA9IHJxLT5uZXh0X3JxLT5kYXRhX2xlbjsKKwkJaGRyLT5kb3V0X3Jlc2lkID0gcnEtPnJlc2lkX2xlbjsKKwkJaGRyLT5kaW5fcmVzaWQgPSBycS0+bmV4dF9ycS0+cmVzaWRfbGVuOwogCQlibGtfcnFfdW5tYXBfdXNlcihiaWRpX2Jpbyk7CiAJCXJxLT5uZXh0X3JxLT5iaW8gPSBOVUxMOwogCQlibGtfcHV0X3JlcXVlc3QocnEtPm5leHRfcnEpOwogCX0gZWxzZSBpZiAocnFfZGF0YV9kaXIocnEpID09IFJFQUQpCi0JCWhkci0+ZGluX3Jlc2lkID0gcnEtPmRhdGFfbGVuOworCQloZHItPmRpbl9yZXNpZCA9IHJxLT5yZXNpZF9sZW47CiAJZWxzZQotCQloZHItPmRvdXRfcmVzaWQgPSBycS0+ZGF0YV9sZW47CisJCWhkci0+ZG91dF9yZXNpZCA9IHJxLT5yZXNpZF9sZW47CiAKIAkvKgogCSAqIElmIHRoZSByZXF1ZXN0IGdlbmVyYXRlZCBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciwgcmV0dXJuIGl0CmRpZmYgLS1naXQgYS9ibG9jay9jZnEtaW9zY2hlZC5jIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCBhNTVhOWJkLi5lZjJmNzJkIDEwMDY0NAotLS0gYS9ibG9jay9jZnEtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTM0OSw4ICszNDksOCBAQAogCWVsc2UgaWYgKHJxX2lzX21ldGEocnEyKSAmJiAhcnFfaXNfbWV0YShycTEpKQogCQlyZXR1cm4gcnEyOwogCi0JczEgPSBycTEtPnNlY3RvcjsKLQlzMiA9IHJxMi0+c2VjdG9yOworCXMxID0gYmxrX3JxX3BvcyhycTEpOworCXMyID0gYmxrX3JxX3BvcyhycTIpOwogCiAJbGFzdCA9IGNmcWQtPmxhc3RfcG9zaXRpb247CiAKQEAgLTU3OSw5ICs1NzksOSBAQAogCQkgKiBTb3J0IHN0cmljdGx5IGJhc2VkIG9uIHNlY3Rvci4gIFNtYWxsZXN0IHRvIHRoZSBsZWZ0LAogCQkgKiBsYXJnZXN0IHRvIHRoZSByaWdodC4KIAkJICovCi0JCWlmIChzZWN0b3IgPiBjZnFxLT5uZXh0X3JxLT5zZWN0b3IpCisJCWlmIChzZWN0b3IgPiBibGtfcnFfcG9zKGNmcXEtPm5leHRfcnEpKQogCQkJbiA9ICYoKnApLT5yYl9yaWdodDsKLQkJZWxzZSBpZiAoc2VjdG9yIDwgY2ZxcS0+bmV4dF9ycS0+c2VjdG9yKQorCQllbHNlIGlmIChzZWN0b3IgPCBibGtfcnFfcG9zKGNmcXEtPm5leHRfcnEpKQogCQkJbiA9ICYoKnApLT5yYl9sZWZ0OwogCQllbHNlCiAJCQlicmVhazsKQEAgLTYxMSw4ICs2MTEsOCBAQAogCQlyZXR1cm47CiAKIAljZnFxLT5wX3Jvb3QgPSAmY2ZxZC0+cHJpb190cmVlc1tjZnFxLT5vcmdfaW9wcmlvXTsKLQlfX2NmcXEgPSBjZnFfcHJpb190cmVlX2xvb2t1cChjZnFkLCBjZnFxLT5wX3Jvb3QsIGNmcXEtPm5leHRfcnEtPnNlY3RvciwKLQkJCQkJICZwYXJlbnQsICZwKTsKKwlfX2NmcXEgPSBjZnFfcHJpb190cmVlX2xvb2t1cChjZnFkLCBjZnFxLT5wX3Jvb3QsCisJCQkJICAgICAgYmxrX3JxX3BvcyhjZnFxLT5uZXh0X3JxKSwgJnBhcmVudCwgJnApOwogCWlmICghX19jZnFxKSB7CiAJCXJiX2xpbmtfbm9kZSgmY2ZxcS0+cF9ub2RlLCBwYXJlbnQsIHApOwogCQlyYl9pbnNlcnRfY29sb3IoJmNmcXEtPnBfbm9kZSwgY2ZxcS0+cF9yb290KTsKQEAgLTc2MCw3ICs3NjAsNyBAQAogCWNmcV9sb2dfY2ZxcShjZnFkLCBSUV9DRlFRKHJxKSwgImFjdGl2YXRlIHJxLCBkcnY9JWQiLAogCQkJCQkJY2ZxZC0+cnFfaW5fZHJpdmVyKTsKIAotCWNmcWQtPmxhc3RfcG9zaXRpb24gPSBycS0+aGFyZF9zZWN0b3IgKyBycS0+aGFyZF9ucl9zZWN0b3JzOworCWNmcWQtPmxhc3RfcG9zaXRpb24gPSBibGtfcnFfcG9zKHJxKSArIGJsa19ycV9zZWN0b3JzKHJxKTsKIH0KIAogc3RhdGljIHZvaWQgY2ZxX2RlYWN0aXZhdGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQpAQCAtOTQ5LDEwICs5NDksMTAgQEAKIHN0YXRpYyBpbmxpbmUgc2VjdG9yX3QgY2ZxX2Rpc3RfZnJvbV9sYXN0KHN0cnVjdCBjZnFfZGF0YSAqY2ZxZCwKIAkJCQkJICBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JaWYgKHJxLT5zZWN0b3IgPj0gY2ZxZC0+bGFzdF9wb3NpdGlvbikKLQkJcmV0dXJuIHJxLT5zZWN0b3IgLSBjZnFkLT5sYXN0X3Bvc2l0aW9uOworCWlmIChibGtfcnFfcG9zKHJxKSA+PSBjZnFkLT5sYXN0X3Bvc2l0aW9uKQorCQlyZXR1cm4gYmxrX3JxX3BvcyhycSkgLSBjZnFkLT5sYXN0X3Bvc2l0aW9uOwogCWVsc2UKLQkJcmV0dXJuIGNmcWQtPmxhc3RfcG9zaXRpb24gLSBycS0+c2VjdG9yOworCQlyZXR1cm4gY2ZxZC0+bGFzdF9wb3NpdGlvbiAtIGJsa19ycV9wb3MocnEpOwogfQogCiAjZGVmaW5lIENJQ19TRUVLX1RIUgk4ICogMTAyNApAQCAtOTk2LDcgKzk5Niw3IEBACiAJaWYgKGNmcV9ycV9jbG9zZShjZnFkLCBfX2NmcXEtPm5leHRfcnEpKQogCQlyZXR1cm4gX19jZnFxOwogCi0JaWYgKF9fY2ZxcS0+bmV4dF9ycS0+c2VjdG9yIDwgc2VjdG9yKQorCWlmIChibGtfcnFfcG9zKF9fY2ZxcS0+bmV4dF9ycSkgPCBzZWN0b3IpCiAJCW5vZGUgPSByYl9uZXh0KCZfX2NmcXEtPnBfbm9kZSk7CiAJZWxzZQogCQlub2RlID0gcmJfcHJldigmX19jZnFxLT5wX25vZGUpOwpAQCAtMTI4Miw3ICsxMjgyLDcgQEAKIAlpZiAoIWNmcWQtPmFjdGl2ZV9jaWMpIHsKIAkJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWMgPSBSUV9DSUMocnEpOwogCi0JCWF0b21pY19pbmMoJmNpYy0+aW9jLT5yZWZjb3VudCk7CisJCWF0b21pY19sb25nX2luYygmY2ljLT5pb2MtPnJlZmNvdW50KTsKIAkJY2ZxZC0+YWN0aXZlX2NpYyA9IGNpYzsKIAl9CiB9CkBAIC0xOTE4LDEwICsxOTE4LDEwIEBACiAKIAlpZiAoIWNpYy0+bGFzdF9yZXF1ZXN0X3BvcykKIAkJc2Rpc3QgPSAwOwotCWVsc2UgaWYgKGNpYy0+bGFzdF9yZXF1ZXN0X3BvcyA8IHJxLT5zZWN0b3IpCi0JCXNkaXN0ID0gcnEtPnNlY3RvciAtIGNpYy0+bGFzdF9yZXF1ZXN0X3BvczsKKwllbHNlIGlmIChjaWMtPmxhc3RfcmVxdWVzdF9wb3MgPCBibGtfcnFfcG9zKHJxKSkKKwkJc2Rpc3QgPSBibGtfcnFfcG9zKHJxKSAtIGNpYy0+bGFzdF9yZXF1ZXN0X3BvczsKIAllbHNlCi0JCXNkaXN0ID0gY2ljLT5sYXN0X3JlcXVlc3RfcG9zIC0gcnEtPnNlY3RvcjsKKwkJc2Rpc3QgPSBjaWMtPmxhc3RfcmVxdWVzdF9wb3MgLSBibGtfcnFfcG9zKHJxKTsKIAogCS8qCiAJICogRG9uJ3QgYWxsb3cgdGhlIHNlZWsgZGlzdGFuY2UgdG8gZ2V0IHRvbyBsYXJnZSBmcm9tIHRoZQpAQCAtMjA3MSw3ICsyMDcxLDcgQEAKIAljZnFfdXBkYXRlX2lvX3NlZWt0aW1lKGNmcWQsIGNpYywgcnEpOwogCWNmcV91cGRhdGVfaWRsZV93aW5kb3coY2ZxZCwgY2ZxcSwgY2ljKTsKIAotCWNpYy0+bGFzdF9yZXF1ZXN0X3BvcyA9IHJxLT5zZWN0b3IgKyBycS0+bnJfc2VjdG9yczsKKwljaWMtPmxhc3RfcmVxdWVzdF9wb3MgPSBibGtfcnFfcG9zKHJxKSArIGJsa19ycV9zZWN0b3JzKHJxKTsKIAogCWlmIChjZnFxID09IGNmcWQtPmFjdGl2ZV9xdWV1ZSkgewogCQkvKgpAQCAtMjA4OCw3ICsyMDg4LDcgQEAKIAkJCWlmIChibGtfcnFfYnl0ZXMocnEpID4gUEFHRV9DQUNIRV9TSVpFIHx8CiAJCQkgICAgY2ZxZC0+YnVzeV9xdWV1ZXMgPiAxKSB7CiAJCQkJZGVsX3RpbWVyKCZjZnFkLT5pZGxlX3NsaWNlX3RpbWVyKTsKLQkJCQlibGtfc3RhcnRfcXVldWVpbmcoY2ZxZC0+cXVldWUpOworCQkJX19ibGtfcnVuX3F1ZXVlKGNmcWQtPnF1ZXVlKTsKIAkJCX0KIAkJCWNmcV9tYXJrX2NmcXFfbXVzdF9kaXNwYXRjaChjZnFxKTsKIAkJfQpAQCAtMjEwMCw3ICsyMTAwLDcgQEAKIAkJICogdGhpcyBuZXcgcXVldWUgaXMgUlQgYW5kIHRoZSBjdXJyZW50IG9uZSBpcyBCRQogCQkgKi8KIAkJY2ZxX3ByZWVtcHRfcXVldWUoY2ZxZCwgY2ZxcSk7Ci0JCWJsa19zdGFydF9xdWV1ZWluZyhjZnFkLT5xdWV1ZSk7CisJCV9fYmxrX3J1bl9xdWV1ZShjZnFkLT5xdWV1ZSk7CiAJfQogfQogCkBAIC0yMzQ1LDcgKzIzNDUsNyBAQAogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gY2ZxZC0+cXVldWU7CiAKIAlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwotCWJsa19zdGFydF9xdWV1ZWluZyhxKTsKKwlfX2Jsa19ydW5fcXVldWUoY2ZxZC0+cXVldWUpOwogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIH0KIApkaWZmIC0tZ2l0IGEvYmxvY2svY29tcGF0X2lvY3RsLmMgYi9ibG9jay9jb21wYXRfaW9jdGwuYwppbmRleCBmODc2MTVkLi43ODY1YTM0IDEwMDY0NAotLS0gYS9ibG9jay9jb21wYXRfaW9jdGwuYworKysgYi9ibG9jay9jb21wYXRfaW9jdGwuYwpAQCAtNTY4LDcgKzU2OCw3IEBACiAJbWVtY3B5KCZidXRzLm5hbWUsICZjYnV0cy5uYW1lLCAzMik7CiAKIAltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7Ci0JcmV0ID0gZG9fYmxrX3RyYWNlX3NldHVwKHEsIGIsIGJkZXYtPmJkX2RldiwgJmJ1dHMpOworCXJldCA9IGRvX2Jsa190cmFjZV9zZXR1cChxLCBiLCBiZGV2LT5iZF9kZXYsIGJkZXYsICZidXRzKTsKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNzYzLDEwICs3NjMsMTAgQEAKIAljYXNlIEJMS0JTWkdFVF8zMjogLyogZ2V0IHRoZSBsb2dpY2FsIGJsb2NrIHNpemUgKGNmLiBCTEtTU1pHRVQpICovCiAJCXJldHVybiBjb21wYXRfcHV0X2ludChhcmcsIGJsb2NrX3NpemUoYmRldikpOwogCWNhc2UgQkxLU1NaR0VUOiAvKiBnZXQgYmxvY2sgZGV2aWNlIGhhcmR3YXJlIHNlY3RvciBzaXplICovCi0JCXJldHVybiBjb21wYXRfcHV0X2ludChhcmcsIGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KSk7CisJCXJldHVybiBjb21wYXRfcHV0X2ludChhcmcsIGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpKTsKIAljYXNlIEJMS1NFQ1RHRVQ6CiAJCXJldHVybiBjb21wYXRfcHV0X3VzaG9ydChhcmcsCi0JCQkJCSBiZGV2X2dldF9xdWV1ZShiZGV2KS0+bWF4X3NlY3RvcnMpOworCQkJCQkgcXVldWVfbWF4X3NlY3RvcnMoYmRldl9nZXRfcXVldWUoYmRldikpKTsKIAljYXNlIEJMS1JBU0VUOiAvKiBjb21wYXRpYmxlLCBidXQgbm8gY29tcGF0X3B0ciAoISkgKi8KIAljYXNlIEJMS0ZSQVNFVDoKIAkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQpkaWZmIC0tZ2l0IGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCmluZGV4IGM0ZDk5MWQuLmI1NDdjYmMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYworKysgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiAJCV9fcnEgPSBlbHZfcmJfZmluZCgmZGQtPnNvcnRfbGlzdFtiaW9fZGF0YV9kaXIoYmlvKV0sIHNlY3Rvcik7CiAJCWlmIChfX3JxKSB7Ci0JCQlCVUdfT04oc2VjdG9yICE9IF9fcnEtPnNlY3Rvcik7CisJCQlCVUdfT04oc2VjdG9yICE9IGJsa19ycV9wb3MoX19ycSkpOwogCiAJCQlpZiAoZWx2X3JxX21lcmdlX29rKF9fcnEsIGJpbykpIHsKIAkJCQlyZXQgPSBFTEVWQVRPUl9GUk9OVF9NRVJHRTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2VsZXZhdG9yLmMgYi9ibG9jay9lbGV2YXRvci5jCmluZGV4IDcwNzNhOTAuLmNhODYxOTIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2VsZXZhdG9yLmMKKysrIGIvYmxvY2svZWxldmF0b3IuYwpAQCAtMzMsMTcgKzMzLDE2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3RyYWNlX2FwaS5oPgotI2luY2x1ZGUgPHRyYWNlL2Jsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9ibG9jay5oPgorCiAjaW5jbHVkZSAiYmxrLmgiCiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZWx2X2xpc3RfbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKGVsdl9saXN0KTsKIAotREVGSU5FX1RSQUNFKGJsb2NrX3JxX2Fib3J0KTsKLQogLyoKICAqIE1lcmdlIGhhc2ggc3R1ZmYuCiAgKi8KQEAgLTUyLDExICs1MSw3IEBACiAjZGVmaW5lIEVMVl9IQVNIX0ZOKHNlYykJXAogCQkoaGFzaF9sb25nKEVMVl9IQVNIX0JMT0NLKChzZWMpKSwgZWx2X2hhc2hfc2hpZnQpKQogI2RlZmluZSBFTFZfSEFTSF9FTlRSSUVTCSgxIDw8IGVsdl9oYXNoX3NoaWZ0KQotI2RlZmluZSBycV9oYXNoX2tleShycSkJCSgocnEpLT5zZWN0b3IgKyAocnEpLT5ucl9zZWN0b3JzKQotI2RlZmluZSBFTFZfT05fSEFTSChycSkJCSghaGxpc3RfdW5oYXNoZWQoJihycSktPmhhc2gpKQotCi1ERUZJTkVfVFJBQ0UoYmxvY2tfcnFfaW5zZXJ0KTsKLURFRklORV9UUkFDRShibG9ja19ycV9pc3N1ZSk7CisjZGVmaW5lIHJxX2hhc2hfa2V5KHJxKQkJKGJsa19ycV9wb3MocnEpICsgYmxrX3JxX3NlY3RvcnMocnEpKQogCiAvKgogICogUXVlcnkgaW8gc2NoZWR1bGVyIHRvIHNlZSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGlzc3VpbmcgYmlvIG1heSBiZQpAQCAtMTIwLDkgKzExNSw5IEBACiAJICogd2UgY2FuIG1lcmdlIGFuZCBzZXF1ZW5jZSBpcyBvaywgY2hlY2sgaWYgaXQncyBwb3NzaWJsZQogCSAqLwogCWlmIChlbHZfcnFfbWVyZ2Vfb2soX19ycSwgYmlvKSkgewotCQlpZiAoX19ycS0+c2VjdG9yICsgX19ycS0+bnJfc2VjdG9ycyA9PSBiaW8tPmJpX3NlY3RvcikKKwkJaWYgKGJsa19ycV9wb3MoX19ycSkgKyBibGtfcnFfc2VjdG9ycyhfX3JxKSA9PSBiaW8tPmJpX3NlY3RvcikKIAkJCXJldCA9IEVMRVZBVE9SX0JBQ0tfTUVSR0U7Ci0JCWVsc2UgaWYgKF9fcnEtPnNlY3RvciAtIGJpb19zZWN0b3JzKGJpbykgPT0gYmlvLT5iaV9zZWN0b3IpCisJCWVsc2UgaWYgKGJsa19ycV9wb3MoX19ycSkgLSBiaW9fc2VjdG9ycyhiaW8pID09IGJpby0+Ymlfc2VjdG9yKQogCQkJcmV0ID0gRUxFVkFUT1JfRlJPTlRfTUVSR0U7CiAJfQogCkBAIC0zMTAsMjIgKzMwNSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGVsZXZhdG9yX2V4aXQpOwogCi1zdGF0aWMgdm9pZCBlbHZfYWN0aXZhdGVfcnEoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKLXsKLQlzdHJ1Y3QgZWxldmF0b3JfcXVldWUgKmUgPSBxLT5lbGV2YXRvcjsKLQotCWlmIChlLT5vcHMtPmVsZXZhdG9yX2FjdGl2YXRlX3JlcV9mbikKLQkJZS0+b3BzLT5lbGV2YXRvcl9hY3RpdmF0ZV9yZXFfZm4ocSwgcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbHZfZGVhY3RpdmF0ZV9ycShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKQotewotCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwotCi0JaWYgKGUtPm9wcy0+ZWxldmF0b3JfZGVhY3RpdmF0ZV9yZXFfZm4pCi0JCWUtPm9wcy0+ZWxldmF0b3JfZGVhY3RpdmF0ZV9yZXFfZm4ocSwgcnEpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgX19lbHZfcnFoYXNoX2RlbChzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaGxpc3RfZGVsX2luaXQoJnJxLT5oYXNoKTsKQEAgLTM4Nyw5ICszNjYsOSBAQAogCQlwYXJlbnQgPSAqcDsKIAkJX19ycSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHJlcXVlc3QsIHJiX25vZGUpOwogCi0JCWlmIChycS0+c2VjdG9yIDwgX19ycS0+c2VjdG9yKQorCQlpZiAoYmxrX3JxX3BvcyhycSkgPCBibGtfcnFfcG9zKF9fcnEpKQogCQkJcCA9ICYoKnApLT5yYl9sZWZ0OwotCQllbHNlIGlmIChycS0+c2VjdG9yID4gX19ycS0+c2VjdG9yKQorCQllbHNlIGlmIChibGtfcnFfcG9zKHJxKSA+IGJsa19ycV9wb3MoX19ycSkpCiAJCQlwID0gJigqcCktPnJiX3JpZ2h0OwogCQllbHNlCiAJCQlyZXR1cm4gX19ycTsKQEAgLTQxNyw5ICszOTYsOSBAQAogCXdoaWxlIChuKSB7CiAJCXJxID0gcmJfZW50cnkobiwgc3RydWN0IHJlcXVlc3QsIHJiX25vZGUpOwogCi0JCWlmIChzZWN0b3IgPCBycS0+c2VjdG9yKQorCQlpZiAoc2VjdG9yIDwgYmxrX3JxX3BvcyhycSkpCiAJCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoc2VjdG9yID4gcnEtPnNlY3RvcikKKwkJZWxzZSBpZiAoc2VjdG9yID4gYmxrX3JxX3BvcyhycSkpCiAJCQluID0gbi0+cmJfcmlnaHQ7CiAJCWVsc2UKIAkJCXJldHVybiBycTsKQEAgLTQ1OCwxNCArNDM3LDE0IEBACiAJCQlicmVhazsKIAkJaWYgKHBvcy0+Y21kX2ZsYWdzICYgc3RvcF9mbGFncykKIAkJCWJyZWFrOwotCQlpZiAocnEtPnNlY3RvciA+PSBib3VuZGFyeSkgewotCQkJaWYgKHBvcy0+c2VjdG9yIDwgYm91bmRhcnkpCisJCWlmIChibGtfcnFfcG9zKHJxKSA+PSBib3VuZGFyeSkgeworCQkJaWYgKGJsa19ycV9wb3MocG9zKSA8IGJvdW5kYXJ5KQogCQkJCWNvbnRpbnVlOwogCQl9IGVsc2UgewotCQkJaWYgKHBvcy0+c2VjdG9yID49IGJvdW5kYXJ5KQorCQkJaWYgKGJsa19ycV9wb3MocG9zKSA+PSBib3VuZGFyeSkKIAkJCQlicmVhazsKIAkJfQotCQlpZiAocnEtPnNlY3RvciA+PSBwb3MtPnNlY3RvcikKKwkJaWYgKGJsa19ycV9wb3MocnEpID49IGJsa19ycV9wb3MocG9zKSkKIAkJCWJyZWFrOwogCX0KIApAQCAtNTYzLDcgKzU0Miw3IEBACiAJICogaW5fZmxpZ2h0IGNvdW50IGFnYWluCiAJICovCiAJaWYgKGJsa19hY2NvdW50X3JxKHJxKSkgewotCQlxLT5pbl9mbGlnaHQtLTsKKwkJcS0+aW5fZmxpZ2h0W3JxX2lzX3N5bmMocnEpXS0tOwogCQlpZiAoYmxrX3NvcnRlZF9ycShycSkpCiAJCQllbHZfZGVhY3RpdmF0ZV9ycShxLCBycSk7CiAJfQpAQCAtNTkyLDYgKzU3MSw5IEBACiAgKi8KIHZvaWQgZWx2X3F1aWVzY2Vfc3RhcnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CisJaWYgKCFxLT5lbGV2YXRvcikKKwkJcmV0dXJuOworCiAJcXVldWVfZmxhZ19zZXQoUVVFVUVfRkxBR19FTFZTV0lUQ0gsIHEpOwogCiAJLyoKQEAgLTU5OSw3ICs1ODEsNyBAQAogCSAqLwogCWVsdl9kcmFpbl9lbGV2YXRvcihxKTsKIAl3aGlsZSAocS0+cnEuZWx2cHJpdikgewotCQlibGtfc3RhcnRfcXVldWVpbmcocSk7CisJCV9fYmxrX3J1bl9xdWV1ZShxKTsKIAkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCQltc2xlZXAoMTApOwogCQlzcGluX2xvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwpAQCAtNjQzLDggKzYyNSw3IEBACiAJCSAqICAgd2l0aCBhbnl0aGluZy4gIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gZGVsYXlpbmcgcXVldWUKIAkJICogICBwcm9jZXNzaW5nLgogCQkgKi8KLQkJYmxrX3JlbW92ZV9wbHVnKHEpOwotCQlibGtfc3RhcnRfcXVldWVpbmcocSk7CisJCV9fYmxrX3J1bl9xdWV1ZShxKTsKIAkJYnJlYWs7CiAKIAljYXNlIEVMRVZBVE9SX0lOU0VSVF9TT1JUOgpAQCAtNzAzLDcgKzY4NCw3IEBACiAKIAlpZiAodW5wbHVnX2l0ICYmIGJsa19xdWV1ZV9wbHVnZ2VkKHEpKSB7CiAJCWludCBucnEgPSBxLT5ycS5jb3VudFtCTEtfUldfU1lOQ10gKyBxLT5ycS5jb3VudFtCTEtfUldfQVNZTkNdCi0JCQktIHEtPmluX2ZsaWdodDsKKwkJCQktIHF1ZXVlX2luX2ZsaWdodChxKTsKIAogCQlpZiAobnJxID49IHEtPnVucGx1Z190aHJlc2gpCiAJCQlfX2dlbmVyaWNfdW5wbHVnX2RldmljZShxKTsKQEAgLTc1OSwxMTcgKzc0MCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGVsdl9hZGRfcmVxdWVzdCk7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHJlcXVlc3QgKl9fZWx2X25leHRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKLXsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnE7Ci0KLQl3aGlsZSAoMSkgewotCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlX2hlYWQpKSB7Ci0JCQlycSA9IGxpc3RfZW50cnlfcnEocS0+cXVldWVfaGVhZC5uZXh0KTsKLQkJCWlmIChibGtfZG9fb3JkZXJlZChxLCAmcnEpKQotCQkJCXJldHVybiBycTsKLQkJfQotCi0JCWlmICghcS0+ZWxldmF0b3ItPm9wcy0+ZWxldmF0b3JfZGlzcGF0Y2hfZm4ocSwgMCkpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci19Ci0KLXN0cnVjdCByZXF1ZXN0ICplbHZfbmV4dF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQotewotCXN0cnVjdCByZXF1ZXN0ICpycTsKLQlpbnQgcmV0OwotCi0Jd2hpbGUgKChycSA9IF9fZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgewotCQlpZiAoIShycS0+Y21kX2ZsYWdzICYgUkVRX1NUQVJURUQpKSB7Ci0JCQkvKgotCQkJICogVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGUgZGV2aWNlIGRyaXZlcgotCQkJICogc2VlcyB0aGlzIHJlcXVlc3QgKHBvc3NpYmx5IGFmdGVyCi0JCQkgKiByZXF1ZXVlaW5nKS4gIE5vdGlmeSBJTyBzY2hlZHVsZXIuCi0JCQkgKi8KLQkJCWlmIChibGtfc29ydGVkX3JxKHJxKSkKLQkJCQllbHZfYWN0aXZhdGVfcnEocSwgcnEpOwotCi0JCQkvKgotCQkJICoganVzdCBtYXJrIGFzIHN0YXJ0ZWQgZXZlbiBpZiB3ZSBkb24ndCBzdGFydAotCQkJICogaXQsIGEgcmVxdWVzdCB0aGF0IGhhcyBiZWVuIGRlbGF5ZWQgc2hvdWxkCi0JCQkgKiBub3QgYmUgcGFzc2VkIGJ5IG5ldyBpbmNvbWluZyByZXF1ZXN0cwotCQkJICovCi0JCQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9TVEFSVEVEOwotCQkJdHJhY2VfYmxvY2tfcnFfaXNzdWUocSwgcnEpOwotCQl9Ci0KLQkJaWYgKCFxLT5ib3VuZGFyeV9ycSB8fCBxLT5ib3VuZGFyeV9ycSA9PSBycSkgewotCQkJcS0+ZW5kX3NlY3RvciA9IHJxX2VuZF9zZWN0b3IocnEpOwotCQkJcS0+Ym91bmRhcnlfcnEgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKHJxLT5jbWRfZmxhZ3MgJiBSRVFfRE9OVFBSRVApCi0JCQlicmVhazsKLQotCQlpZiAocS0+ZG1hX2RyYWluX3NpemUgJiYgcnEtPmRhdGFfbGVuKSB7Ci0JCQkvKgotCQkJICogbWFrZSBzdXJlIHNwYWNlIGZvciB0aGUgZHJhaW4gYXBwZWFycyB3ZQotCQkJICoga25vdyB3ZSBjYW4gZG8gdGhpcyBiZWNhdXNlIG1heF9od19zZWdtZW50cwotCQkJICogaGFzIGJlZW4gYWRqdXN0ZWQgdG8gYmUgb25lIGZld2VyIHRoYW4gdGhlCi0JCQkgKiBkZXZpY2UgY2FuIGhhbmRsZQotCQkJICovCi0JCQlycS0+bnJfcGh5c19zZWdtZW50cysrOwotCQl9Ci0KLQkJaWYgKCFxLT5wcmVwX3JxX2ZuKQotCQkJYnJlYWs7Ci0KLQkJcmV0ID0gcS0+cHJlcF9ycV9mbihxLCBycSk7Ci0JCWlmIChyZXQgPT0gQkxLUFJFUF9PSykgewotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAocmV0ID09IEJMS1BSRVBfREVGRVIpIHsKLQkJCS8qCi0JCQkgKiB0aGUgcmVxdWVzdCBtYXkgaGF2ZSBiZWVuIChwYXJ0aWFsbHkpIHByZXBwZWQuCi0JCQkgKiB3ZSBuZWVkIHRvIGtlZXAgdGhpcyByZXF1ZXN0IGluIHRoZSBmcm9udCB0bwotCQkJICogYXZvaWQgcmVzb3VyY2UgZGVhZGxvY2suICBSRVFfU1RBUlRFRCB3aWxsCi0JCQkgKiBwcmV2ZW50IG90aGVyIGZzIHJlcXVlc3RzIGZyb20gcGFzc2luZyB0aGlzIG9uZS4KLQkJCSAqLwotCQkJaWYgKHEtPmRtYV9kcmFpbl9zaXplICYmIHJxLT5kYXRhX2xlbiAmJgotCQkJICAgICEocnEtPmNtZF9mbGFncyAmIFJFUV9ET05UUFJFUCkpIHsKLQkJCQkvKgotCQkJCSAqIHJlbW92ZSB0aGUgc3BhY2UgZm9yIHRoZSBkcmFpbiB3ZSBhZGRlZAotCQkJCSAqIHNvIHRoYXQgd2UgZG9uJ3QgYWRkIGl0IGFnYWluCi0JCQkJICovCi0JCQkJLS1ycS0+bnJfcGh5c19zZWdtZW50czsKLQkJCX0KLQotCQkJcnEgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCX0gZWxzZSBpZiAocmV0ID09IEJMS1BSRVBfS0lMTCkgewotCQkJcnEtPmNtZF9mbGFncyB8PSBSRVFfUVVJRVQ7Ci0JCQlfX2Jsa19lbmRfcmVxdWVzdChycSwgLUVJTywgYmxrX3JxX2J5dGVzKHJxKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgcmV0dXJuPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJxOwotfQotRVhQT1JUX1NZTUJPTChlbHZfbmV4dF9yZXF1ZXN0KTsKLQotdm9pZCBlbHZfZGVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCi17Ci0JQlVHX09OKGxpc3RfZW1wdHkoJnJxLT5xdWV1ZWxpc3QpKTsKLQlCVUdfT04oRUxWX09OX0hBU0gocnEpKTsKLQotCWxpc3RfZGVsX2luaXQoJnJxLT5xdWV1ZWxpc3QpOwotCi0JLyoKLQkgKiB0aGUgdGltZSBmcmFtZSBiZXR3ZWVuIGEgcmVxdWVzdCBiZWluZyByZW1vdmVkIGZyb20gdGhlIGxpc3RzCi0JICogYW5kIHRvIGl0IGlzIGZyZWVkIGlzIGFjY291bnRlZCBhcyBpbyB0aGF0IGlzIGluIHByb2dyZXNzIGF0Ci0JICogdGhlIGRyaXZlciBzaWRlLgotCSAqLwotCWlmIChibGtfYWNjb3VudF9ycShycSkpCi0JCXEtPmluX2ZsaWdodCsrOwotfQotCiBpbnQgZWx2X3F1ZXVlX2VtcHR5KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewogCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwpAQCAtOTM5LDcgKzgwOSwxMiBAQAogCQlycSA9IGxpc3RfZW50cnlfcnEocS0+cXVldWVfaGVhZC5uZXh0KTsKIAkJcnEtPmNtZF9mbGFncyB8PSBSRVFfUVVJRVQ7CiAJCXRyYWNlX2Jsb2NrX3JxX2Fib3J0KHEsIHJxKTsKLQkJX19ibGtfZW5kX3JlcXVlc3QocnEsIC1FSU8sIGJsa19ycV9ieXRlcyhycSkpOworCQkvKgorCQkgKiBNYXJrIHRoaXMgcmVxdWVzdCBhcyBzdGFydGVkIHNvIHdlIGRvbid0IHRyaWdnZXIKKwkJICogYW55IGRlYnVnIGxvZ2ljIGluIHRoZSBlbmQgSS9PIHBhdGguCisJCSAqLworCQlibGtfc3RhcnRfcmVxdWVzdChycSk7CisJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChycSwgLUVJTyk7CiAJfQogfQogRVhQT1JUX1NZTUJPTChlbHZfYWJvcnRfcXVldWUpOwpAQCAtOTUyLDcgKzgyNyw3IEBACiAJICogcmVxdWVzdCBpcyByZWxlYXNlZCBmcm9tIHRoZSBkcml2ZXIsIGlvIG11c3QgYmUgZG9uZQogCSAqLwogCWlmIChibGtfYWNjb3VudF9ycShycSkpIHsKLQkJcS0+aW5fZmxpZ2h0LS07CisJCXEtPmluX2ZsaWdodFtycV9pc19zeW5jKHJxKV0tLTsKIAkJaWYgKGJsa19zb3J0ZWRfcnEocnEpICYmIGUtPm9wcy0+ZWxldmF0b3JfY29tcGxldGVkX3JlcV9mbikKIAkJCWUtPm9wcy0+ZWxldmF0b3JfY29tcGxldGVkX3JlcV9mbihxLCBycSk7CiAJfQpAQCAtOTY3LDExICs4NDIsMTEgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZV9oZWFkKSkKIAkJCW5leHQgPSBsaXN0X2VudHJ5X3JxKHEtPnF1ZXVlX2hlYWQubmV4dCk7CiAKLQkJaWYgKCFxLT5pbl9mbGlnaHQgJiYKKwkJaWYgKCFxdWV1ZV9pbl9mbGlnaHQocSkgJiYKIAkJICAgIGJsa19vcmRlcmVkX2N1cl9zZXEocSkgPT0gUVVFVUVfT1JEU0VRX0RSQUlOICYmCiAJCSAgICAoIW5leHQgfHwgYmxrX29yZGVyZWRfcmVxX3NlcShuZXh0KSA+IFFVRVVFX09SRFNFUV9EUkFJTikpIHsKIAkJCWJsa19vcmRlcmVkX2NvbXBsZXRlX3NlcShxLCBRVUVVRV9PUkRTRVFfRFJBSU4sIDApOwotCQkJYmxrX3N0YXJ0X3F1ZXVlaW5nKHEpOworCQkJX19ibGtfcnVuX3F1ZXVlKHEpOwogCQl9CiAJfQogfQpAQCAtMTE3OSw2ICsxMDU0LDkgQEAKIAljaGFyIGVsZXZhdG9yX25hbWVbRUxWX05BTUVfTUFYXTsKIAlzdHJ1Y3QgZWxldmF0b3JfdHlwZSAqZTsKIAorCWlmICghcS0+ZWxldmF0b3IpCisJCXJldHVybiBjb3VudDsKKwogCXN0cmxjcHkoZWxldmF0b3JfbmFtZSwgbmFtZSwgc2l6ZW9mKGVsZXZhdG9yX25hbWUpKTsKIAlzdHJzdHJpcChlbGV2YXRvcl9uYW1lKTsKIApAQCAtMTIwMiwxMCArMTA4MCwxNSBAQAogc3NpemVfdCBlbHZfaW9zY2hlZF9zaG93KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBlbGV2YXRvcl9xdWV1ZSAqZSA9IHEtPmVsZXZhdG9yOwotCXN0cnVjdCBlbGV2YXRvcl90eXBlICplbHYgPSBlLT5lbGV2YXRvcl90eXBlOworCXN0cnVjdCBlbGV2YXRvcl90eXBlICplbHY7CiAJc3RydWN0IGVsZXZhdG9yX3R5cGUgKl9fZTsKIAlpbnQgbGVuID0gMDsKIAorCWlmICghcS0+ZWxldmF0b3IpCisJCXJldHVybiBzcHJpbnRmKG5hbWUsICJub25lXG4iKTsKKworCWVsdiA9IGUtPmVsZXZhdG9yX3R5cGU7CisKIAlzcGluX2xvY2soJmVsdl9saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoX19lLCAmZWx2X2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFzdHJjbXAoZWx2LT5lbGV2YXRvcl9uYW1lLCBfX2UtPmVsZXZhdG9yX25hbWUpKQpkaWZmIC0tZ2l0IGEvYmxvY2svZ2VuaGQuYyBiL2Jsb2NrL2dlbmhkLmMKaW5kZXggMWE0OTE2ZS4uZmU3Y2NjMCAxMDA2NDQKLS0tIGEvYmxvY2svZ2VuaGQuYworKysgYi9ibG9jay9nZW5oZC5jCkBAIC04NTIsMTEgKzg1MiwyMSBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBkaXNrLT5mbGFncyk7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGRpc2tfYWxpZ25tZW50X29mZnNldF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBkZXZfdG9fZGlzayhkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHF1ZXVlX2FsaWdubWVudF9vZmZzZXQoZGlzay0+cXVldWUpKTsKK30KKwogc3RhdGljIERFVklDRV9BVFRSKHJhbmdlLCBTX0lSVUdPLCBkaXNrX3JhbmdlX3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGV4dF9yYW5nZSwgU19JUlVHTywgZGlza19leHRfcmFuZ2Vfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIocmVtb3ZhYmxlLCBTX0lSVUdPLCBkaXNrX3JlbW92YWJsZV9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihybywgU19JUlVHTywgZGlza19yb19zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzaXplLCBTX0lSVUdPLCBwYXJ0X3NpemVfc2hvdywgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoYWxpZ25tZW50X29mZnNldCwgU19JUlVHTywgZGlza19hbGlnbm1lbnRfb2Zmc2V0X3Nob3csIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKGNhcGFiaWxpdHksIFNfSVJVR08sIGRpc2tfY2FwYWJpbGl0eV9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzdGF0LCBTX0lSVUdPLCBwYXJ0X3N0YXRfc2hvdywgTlVMTCk7CiAjaWZkZWYgQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUCkBAIC04NzUsNiArODg1LDcgQEAKIAkmZGV2X2F0dHJfcmVtb3ZhYmxlLmF0dHIsCiAJJmRldl9hdHRyX3JvLmF0dHIsCiAJJmRldl9hdHRyX3NpemUuYXR0ciwKKwkmZGV2X2F0dHJfYWxpZ25tZW50X29mZnNldC5hdHRyLAogCSZkZXZfYXR0cl9jYXBhYmlsaXR5LmF0dHIsCiAJJmRldl9hdHRyX3N0YXQuYXR0ciwKICNpZmRlZiBDT05GSUdfRkFJTF9NQUtFX1JFUVVFU1QKZGlmZiAtLWdpdCBhL2Jsb2NrL2lvY3RsLmMgYi9ibG9jay9pb2N0bC5jCmluZGV4IGFkNDc0ZDQuLjUwMGU0YzcgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2lvY3RsLmMKKysrIGIvYmxvY2svaW9jdGwuYwpAQCAtMTUyLDEwICsxNTIsMTAgQEAKIAkJYmlvLT5iaV9wcml2YXRlID0gJndhaXQ7CiAJCWJpby0+Ymlfc2VjdG9yID0gc3RhcnQ7CiAKLQkJaWYgKGxlbiA+IHEtPm1heF9od19zZWN0b3JzKSB7Ci0JCQliaW8tPmJpX3NpemUgPSBxLT5tYXhfaHdfc2VjdG9ycyA8PCA5OwotCQkJbGVuIC09IHEtPm1heF9od19zZWN0b3JzOwotCQkJc3RhcnQgKz0gcS0+bWF4X2h3X3NlY3RvcnM7CisJCWlmIChsZW4gPiBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKSkgeworCQkJYmlvLT5iaV9zaXplID0gcXVldWVfbWF4X2h3X3NlY3RvcnMocSkgPDwgOTsKKwkJCWxlbiAtPSBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhxKTsKKwkJCXN0YXJ0ICs9IHF1ZXVlX21heF9od19zZWN0b3JzKHEpOwogCQl9IGVsc2UgewogCQkJYmlvLT5iaV9zaXplID0gbGVuIDw8IDk7CiAJCQlsZW4gPSAwOwpAQCAtMzExLDkgKzMxMSw5IEBACiAJY2FzZSBCTEtCU1pHRVQ6IC8qIGdldCB0aGUgbG9naWNhbCBibG9jayBzaXplIChjZi4gQkxLU1NaR0VUKSAqLwogCQlyZXR1cm4gcHV0X2ludChhcmcsIGJsb2NrX3NpemUoYmRldikpOwogCWNhc2UgQkxLU1NaR0VUOiAvKiBnZXQgYmxvY2sgZGV2aWNlIGhhcmR3YXJlIHNlY3RvciBzaXplICovCi0JCXJldHVybiBwdXRfaW50KGFyZywgYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpKTsKKwkJcmV0dXJuIHB1dF9pbnQoYXJnLCBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KSk7CiAJY2FzZSBCTEtTRUNUR0VUOgotCQlyZXR1cm4gcHV0X3VzaG9ydChhcmcsIGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5tYXhfc2VjdG9ycyk7CisJCXJldHVybiBwdXRfdXNob3J0KGFyZywgcXVldWVfbWF4X3NlY3RvcnMoYmRldl9nZXRfcXVldWUoYmRldikpKTsKIAljYXNlIEJMS1JBU0VUOgogCWNhc2UgQkxLRlJBU0VUOgogCQlpZighY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKZGlmZiAtLWdpdCBhL2Jsb2NrL3Njc2lfaW9jdGwuYyBiL2Jsb2NrL3Njc2lfaW9jdGwuYwppbmRleCA4MmEwY2EyLi41ZjhlNzk4IDEwMDY0NAotLS0gYS9ibG9jay9zY3NpX2lvY3RsLmMKKysrIGIvYmxvY2svc2NzaV9pb2N0bC5jCkBAIC03NSw3ICs3NSw3IEBACiAKIHN0YXRpYyBpbnQgc2dfZ2V0X3Jlc2VydmVkX3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGludCBfX3VzZXIgKnApCiB7Ci0JdW5zaWduZWQgdmFsID0gbWluKHEtPnNnX3Jlc2VydmVkX3NpemUsIHEtPm1heF9zZWN0b3JzIDw8IDkpOworCXVuc2lnbmVkIHZhbCA9IG1pbihxLT5zZ19yZXNlcnZlZF9zaXplLCBxdWV1ZV9tYXhfc2VjdG9ycyhxKSA8PCA5KTsKIAogCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwogfQpAQCAtODksOCArODksOCBAQAogCiAJaWYgKHNpemUgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoc2l6ZSA+IChxLT5tYXhfc2VjdG9ycyA8PCA5KSkKLQkJc2l6ZSA9IHEtPm1heF9zZWN0b3JzIDw8IDk7CisJaWYgKHNpemUgPiAocXVldWVfbWF4X3NlY3RvcnMocSkgPDwgOSkpCisJCXNpemUgPSBxdWV1ZV9tYXhfc2VjdG9ycyhxKSA8PCA5OwogCiAJcS0+c2dfcmVzZXJ2ZWRfc2l6ZSA9IHNpemU7CiAJcmV0dXJuIDA7CkBAIC0yMzAsNyArMjMwLDcgQEAKIAloZHItPmluZm8gPSAwOwogCWlmIChoZHItPm1hc2tlZF9zdGF0dXMgfHwgaGRyLT5ob3N0X3N0YXR1cyB8fCBoZHItPmRyaXZlcl9zdGF0dXMpCiAJCWhkci0+aW5mbyB8PSBTR19JTkZPX0NIRUNLOwotCWhkci0+cmVzaWQgPSBycS0+ZGF0YV9sZW47CisJaGRyLT5yZXNpZCA9IHJxLT5yZXNpZF9sZW47CiAJaGRyLT5zYl9sZW5fd3IgPSAwOwogCiAJaWYgKHJxLT5zZW5zZV9sZW4gJiYgaGRyLT5zYnApIHsKQEAgLTI2NCw3ICsyNjQsNyBAQAogCWlmIChoZHItPmNtZF9sZW4gPiBCTEtfTUFYX0NEQikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaGRyLT5keGZlcl9sZW4gPiAocS0+bWF4X2h3X3NlY3RvcnMgPDwgOSkpCisJaWYgKGhkci0+ZHhmZXJfbGVuID4gKHF1ZXVlX21heF9od19zZWN0b3JzKHEpIDw8IDkpKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmIChoZHItPmR4ZmVyX2xlbikKQEAgLTUwMCw5ICs1MDAsNiBAQAogCiAJcnEgPSBibGtfZ2V0X3JlcXVlc3QocSwgV1JJVEUsIF9fR0ZQX1dBSVQpOwogCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX0JMT0NLX1BDOwotCXJxLT5kYXRhID0gTlVMTDsKLQlycS0+ZGF0YV9sZW4gPSAwOwotCXJxLT5leHRyYV9sZW4gPSAwOwogCXJxLT50aW1lb3V0ID0gQkxLX0RFRkFVTFRfU0dfVElNRU9VVDsKIAlycS0+Y21kWzBdID0gY21kOwogCXJxLT5jbWRbNF0gPSBkYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKaW5kZXggNTFiOWY4Mi4uMmZhYTllMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCkBAIC00MDEsNyArNDAxLDggQEAKIAkJLyogSW50ZXJydXB0IExpbmUgdmFsdWVzIGFib3ZlIDB4RiBhcmUgZm9yYmlkZGVuICovCiAJCWlmIChkZXYtPmlycSA+IDAgJiYgKGRldi0+aXJxIDw9IDB4RikpIHsKIAkJCXByaW50aygiIC0gdXNpbmcgSVJRICVkXG4iLCBkZXYtPmlycSk7Ci0JCQlhY3BpX3JlZ2lzdGVyX2dzaShkZXYtPmlycSwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsCisJCQlhY3BpX3JlZ2lzdGVyX2dzaSgmZGV2LT5kZXYsIGRldi0+aXJxLAorCQkJCQkgIEFDUElfTEVWRUxfU0VOU0lUSVZFLAogCQkJCQkgIEFDUElfQUNUSVZFX0xPVyk7CiAJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIHsKQEAgLTQxMCw3ICs0MTEsNyBAQAogCQl9CiAJfQogCi0JcmMgPSBhY3BpX3JlZ2lzdGVyX2dzaShnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKKwlyYyA9IGFjcGlfcmVnaXN0ZXJfZ3NpKCZkZXYtPmRldiwgZ3NpLCB0cmlnZ2VyaW5nLCBwb2xhcml0eSk7CiAJaWYgKHJjIDwgMCkgewogCQlkZXZfd2FybigmZGV2LT5kZXYsICJQQ0kgSU5UICVjOiBmYWlsZWQgdG8gcmVnaXN0ZXIgR1NJXG4iLAogCQkJIHBpbl9uYW1lKHBpbikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYWhjaS5jIGIvZHJpdmVycy9hdGEvYWhjaS5jCmluZGV4IDZiOTFjMjYuLjE1YTIzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2FoY2kuYworKysgYi9kcml2ZXJzL2F0YS9haGNpLmMKQEAgLTc3LDggKzc3LDYgQEAKIAkJCSAgICAgIHNpemVfdCBzaXplKTsKIHN0YXRpYyBzc2l6ZV90IGFoY2lfdHJhbnNtaXRfbGVkX21lc3NhZ2Uoc3RydWN0IGF0YV9wb3J0ICphcCwgdTMyIHN0YXRlLAogCQkJCQlzc2l6ZV90IHNpemUpOwotI2RlZmluZSBNQVhfU0xPVFMgOAotI2RlZmluZSBNQVhfUkVUUlkgMTUKIAogZW51bSB7CiAJQUhDSV9QQ0lfQkFSCQk9IDUsCkBAIC0yMzEsNiArMjI5LDEwIEBACiAKIAlJQ0hfTUFQCQkJCT0gMHg5MCwgLyogSUNIIE1BUCByZWdpc3RlciAqLwogCisJLyogZW0gY29uc3RhbnRzICovCisJRU1fTUFYX1NMT1RTCQkJPSA4LAorCUVNX01BWF9SRVRSWQkJCT0gNSwKKwogCS8qIGVtX2N0bCBiaXRzICovCiAJRU1fQ1RMX1JTVAkJCT0gKDEgPDwgOSksIC8qIFJlc2V0ICovCiAJRU1fQ1RMX1RNCQkJPSAoMSA8PCA4KSwgLyogVHJhbnNtaXQgTWVzc2FnZSAqLwpAQCAtMjgyLDggKzI4NCw4IEBACiAJdW5zaWduZWQgaW50CQluY3Ffc2F3X2RtYXM6MTsKIAl1bnNpZ25lZCBpbnQJCW5jcV9zYXdfc2RiOjE7CiAJdTMyIAkJCWludHJfbWFzazsJLyogaW50ZXJydXB0cyB0byBlbmFibGUgKi8KLQlzdHJ1Y3QgYWhjaV9lbV9wcml2CWVtX3ByaXZbTUFYX1NMT1RTXTsvKiBlbmNsb3N1cmUgbWFuYWdlbWVudCBpbmZvCi0JCQkJCSAJICogcGVyIFBNIHNsb3QgKi8KKwkvKiBlbmNsb3N1cmUgbWFuYWdlbWVudCBpbmZvIHBlciBQTSBzbG90ICovCisJc3RydWN0IGFoY2lfZW1fcHJpdgllbV9wcml2W0VNX01BWF9TTE9UU107CiB9OwogCiBzdGF0aWMgaW50IGFoY2lfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCk7CkBAIC0zMTMsNyArMzE1LDYgQEAKIHN0YXRpYyB2b2lkIGFoY2lfcG9zdF9pbnRlcm5hbF9jbWQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgaW50IGFoY2lfcG9ydF9yZXN1bWUoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBhaGNpX2Rldl9jb25maWcoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGFoY2lfZmlsbF9zZyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB2b2lkICpjbWRfdGJsKTsKIHN0YXRpYyB2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1bnNpZ25lZCBpbnQgdGFnLAogCQkJICAgICAgIHUzMiBvcHRzKTsKICNpZmRlZiBDT05GSUdfUE0KQEAgLTQwNCwxNCArNDA1LDE0IEBACiAjZGVmaW5lIEFIQ0lfSEZMQUdTKGZsYWdzKQkucHJpdmF0ZV9kYXRhCT0gKHZvaWQgKikoZmxhZ3MpCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBhaGNpX3BvcnRfaW5mb1tdID0gewotCS8qIGJvYXJkX2FoY2kgKi8KKwlbYm9hcmRfYWhjaV0gPQogCXsKIAkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCiAJCS5waW9fbWFzawk9IEFUQV9QSU80LAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCiAJfSwKLQkvKiBib2FyZF9haGNpX3Z0ODI1MSAqLworCVtib2FyZF9haGNpX3Z0ODI1MV0gPQogCXsKIAkJQUhDSV9IRkxBR1MJKEFIQ0lfSEZMQUdfTk9fTkNRIHwgQUhDSV9IRkxBR19OT19QTVApLAogCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKQEAgLTQxOSw3ICs0MjAsNyBAQAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAogCQkucG9ydF9vcHMJPSAmYWhjaV92dDgyNTFfb3BzLAogCX0sCi0JLyogYm9hcmRfYWhjaV9pZ25faWZlcnIgKi8KKwlbYm9hcmRfYWhjaV9pZ25faWZlcnJdID0KIAl7CiAJCUFIQ0lfSEZMQUdTCShBSENJX0hGTEFHX0lHTl9JUlFfSUZfRVJSKSwKIAkJLmZsYWdzCQk9IEFIQ0lfRkxBR19DT01NT04sCkBAIC00MjcsMTcgKzQyOCwxNiBAQAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCiAJfSwKLQkvKiBib2FyZF9haGNpX3NiNjAwICovCisJW2JvYXJkX2FoY2lfc2I2MDBdID0KIAl7CiAJCUFIQ0lfSEZMQUdTCShBSENJX0hGTEFHX0lHTl9TRVJSX0lOVEVSTkFMIHwKLQkJCQkgQUhDSV9IRkxBR18zMkJJVF9PTkxZIHwgQUhDSV9IRkxBR19OT19NU0kgfAotCQkJCSBBSENJX0hGTEFHX1NFQ1QyNTUpLAorCQkJCSBBSENJX0hGTEFHX05PX01TSSB8IEFIQ0lfSEZMQUdfU0VDVDI1NSksCiAJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLAogCQkucGlvX21hc2sJPSBBVEFfUElPNCwKIAkJLnVkbWFfbWFzawk9IEFUQV9VRE1BNiwKIAkJLnBvcnRfb3BzCT0gJmFoY2lfc2I2MDBfb3BzLAogCX0sCi0JLyogYm9hcmRfYWhjaV9tdiAqLworCVtib2FyZF9haGNpX212XSA9CiAJewogCQlBSENJX0hGTEFHUwkoQUhDSV9IRkxBR19OT19OQ1EgfCBBSENJX0hGTEFHX05PX01TSSB8CiAJCQkJIEFIQ0lfSEZMQUdfTVZfUEFUQSB8IEFIQ0lfSEZMQUdfTk9fUE1QKSwKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCiAJfSwKLQkvKiBib2FyZF9haGNpX3NiNzAwLCBmb3IgU0I3MDAgYW5kIFNCODAwICovCisJW2JvYXJkX2FoY2lfc2I3MDBdID0JLyogZm9yIFNCNzAwIGFuZCBTQjgwMCAqLwogCXsKIAkJQUhDSV9IRkxBR1MJKEFIQ0lfSEZMQUdfSUdOX1NFUlJfSU5URVJOQUwpLAogCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAogCQkucG9ydF9vcHMJPSAmYWhjaV9zYjYwMF9vcHMsCiAJfSwKLQkvKiBib2FyZF9haGNpX21jcDY1ICovCisJW2JvYXJkX2FoY2lfbWNwNjVdID0KIAl7CiAJCUFIQ0lfSEZMQUdTCShBSENJX0hGTEFHX1lFU19OQ1EpLAogCQkuZmxhZ3MJCT0gQUhDSV9GTEFHX0NPTU1PTiwKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCQkudWRtYV9tYXNrCT0gQVRBX1VETUE2LAogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCiAJfSwKLQkvKiBib2FyZF9haGNpX25vcG1wICovCisJW2JvYXJkX2FoY2lfbm9wbXBdID0KIAl7CiAJCUFIQ0lfSEZMQUdTCShBSENJX0hGTEFHX05PX1BNUCksCiAJCS5mbGFncwkJPSBBSENJX0ZMQUdfQ09NTU9OLApAQCAtMTE0MSwxMiArMTE0MSwxMiBAQAogCQkJZW1wID0gJnBwLT5lbV9wcml2W2xpbmstPnBtcF07CiAKIAkJCS8qIEVNIFRyYW5zbWl0IGJpdCBtYXliZSBidXN5IGR1cmluZyBpbml0ICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBFTV9NQVhfUkVUUlk7IGkrKykgewogCQkJCXJjID0gYWhjaV90cmFuc21pdF9sZWRfbWVzc2FnZShhcCwKIAkJCQkJCQkgICAgICAgZW1wLT5sZWRfc3RhdGUsCiAJCQkJCQkJICAgICAgIDQpOwogCQkJCWlmIChyYyA9PSAtRUJVU1kpCi0JCQkJCXVkZWxheSgxMDApOworCQkJCQltc2xlZXAoMSk7CiAJCQkJZWxzZQogCQkJCQlicmVhazsKIAkJCX0KQEAgLTEzNDAsNyArMTM0MCw3IEBACiAKIAkvKiBnZXQgdGhlIHNsb3QgbnVtYmVyIGZyb20gdGhlIG1lc3NhZ2UgKi8KIAlwbXAgPSAoc3RhdGUgJiBFTV9NU0dfTEVEX1BNUF9TTE9UKSA+PiA4OwotCWlmIChwbXAgPCBNQVhfU0xPVFMpCisJaWYgKHBtcCA8IEVNX01BWF9TTE9UUykKIAkJZW1wID0gJnBwLT5lbV9wcml2W3BtcF07CiAJZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0MDgsNyArMTQwOCw3IEBACiAKIAkvKiBnZXQgdGhlIHNsb3QgbnVtYmVyIGZyb20gdGhlIG1lc3NhZ2UgKi8KIAlwbXAgPSAoc3RhdGUgJiBFTV9NU0dfTEVEX1BNUF9TTE9UKSA+PiA4OwotCWlmIChwbXAgPCBNQVhfU0xPVFMpCisJaWYgKHBtcCA8IEVNX01BWF9TTE9UUykKIAkJZW1wID0gJnBwLT5lbV9wcml2W3BtcF07CiAJZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI1ODQsNiArMjU4NCw1MSBAQAogCX0KIH0KIAorLyoKKyAqIFNCNjAwIGFoY2kgY29udHJvbGxlciBvbiBBU1VTIE0yQS1WTSBjYW4ndCBkbyA2NGJpdCBETUEgd2l0aCBvbGRlcgorICogQklPUy4gIFRoZSBvbGRlc3QgdmVyc2lvbiBrbm93biB0byBiZSBicm9rZW4gaXMgMDkwMSBhbmQgd29ya2luZyBpcworICogMTUwMSB3aGljaCB3YXMgcmVsZWFzZWQgb24gMjAwNy0xMC0yNi4gIEZvcmNlIDMyYml0IERNQSBvbiBhbnl0aGluZworICogb2xkZXIgdGhhbiAxNTAxLiAgUGxlYXNlIHJlYWQgYmtvIzk0MTIgZm9yIG1vcmUgaW5mby4KKyAqLworc3RhdGljIGJvb2wgYWhjaV9hc3VzX20yYV92bV8zMmJpdF9vbmx5KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBzeXNpZHNbXSA9IHsKKwkJeworCQkJLmlkZW50ID0gIkFTVVMgTTJBLVZNIiwKKwkJCS5tYXRjaGVzID0geworCQkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLAorCQkJCQkgICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJNMkEtVk0iKSwKKwkJCX0sCisJCX0sCisJCXsgfQorCX07CisJY29uc3QgY2hhciAqY3V0b2ZmX21tZGQgPSAiMTAvMjYiOworCWNvbnN0IGNoYXIgKmRhdGU7CisJaW50IHllYXI7CisKKwlpZiAocGRldi0+YnVzLT5udW1iZXIgIT0gMCB8fCBwZGV2LT5kZXZmbiAhPSBQQ0lfREVWRk4oMHgxMiwgMCkgfHwKKwkgICAgIWRtaV9jaGVja19zeXN0ZW0oc3lzaWRzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBBcmdoLi4uLiBib3RoIHZlcnNpb24gYW5kIGRhdGUgYXJlIGZyZWUgZm9ybSBzdHJpbmdzLgorCSAqIExldCdzIGhvcGUgdGhleSdyZSB1c2luZyB0aGUgc2FtZSBkYXRlIGZvcm1hdCBhY3Jvc3MKKwkgKiBkaWZmZXJlbnQgdmVyc2lvbnMuCisJICovCisJZGF0ZSA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JJT1NfREFURSk7CisJeWVhciA9IGRtaV9nZXRfeWVhcihETUlfQklPU19EQVRFKTsKKwlpZiAoZGF0ZSAmJiBzdHJsZW4oZGF0ZSkgPj0gMTAgJiYgZGF0ZVsyXSA9PSAnLycgJiYgZGF0ZVs1XSA9PSAnLycgJiYKKwkgICAgKHllYXIgPiAyMDA3IHx8CisJICAgICAoeWVhciA9PSAyMDA3ICYmIHN0cm5jbXAoZGF0ZSwgY3V0b2ZmX21tZGQsIDUpID49IDApKSkKKwkJcmV0dXJuIGZhbHNlOworCisJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZwZGV2LT5kZXYsICJBU1VTIE0yQS1WTTogQklPUyB0b28gb2xkLCAiCisJCSAgICJmb3JjaW5nIDMyYml0IERNQSwgdXBkYXRlIEJJT1NcbiIpOworCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBib29sIGFoY2lfYnJva2VuX3N5c3RlbV9wb3dlcm9mZihzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgYnJva2VuX3N5c3RlbXNbXSA9IHsKQEAgLTI3NDQsNiArMjc4OSwxMCBAQAogCWlmIChib2FyZF9pZCA9PSBib2FyZF9haGNpX3NiNzAwICYmIHBkZXYtPnJldmlzaW9uID49IDB4NDApCiAJCWhwcml2LT5mbGFncyAmPSB+QUhDSV9IRkxBR19JR05fU0VSUl9JTlRFUk5BTDsKIAorCS8qIGFwcGx5IEFTVVMgTTJBX1ZNIHF1aXJrICovCisJaWYgKGFoY2lfYXN1c19tMmFfdm1fMzJiaXRfb25seShwZGV2KSkKKwkJaHByaXYtPmZsYWdzIHw9IEFIQ0lfSEZMQUdfMzJCSVRfT05MWTsKKwogCWlmICghKGhwcml2LT5mbGFncyAmIEFIQ0lfSEZMQUdfTk9fTVNJKSkKIAkJcGNpX2VuYWJsZV9tc2kocGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCmluZGV4IDFhZWI3MDguLmQwYTE0Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvYXRhX3BpaXguYwpAQCAtMjIzLDEwICsyMjMsOCBAQAogCS8qIElDSDggTW9iaWxlIFBBVEEgQ29udHJvbGxlciAqLwogCXsgMHg4MDg2LCAweDI4NTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaF9wYXRhXzEwMCB9LAogCi0JLyogTk9URTogVGhlIGZvbGxvd2luZyBQQ0kgaWRzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogbGlzdCBpbiBkcml2ZXJzL3BjaS9xdWlya3MuYy4KLQkgKi8KLQorCS8qIFNBVEEgcG9ydHMgKi8KKwkKIAkvKiA4MjgwMUVCIChJQ0g1KSAqLwogCXsgMHg4MDg2LCAweDI0ZDEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIGljaDVfc2F0YSB9LAogCS8qIDgyODAxRUIgKElDSDUpICovCkBAIC0xNTA5LDggKzE1MDcsOCBAQAogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsCiAJCQkgICAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCi0JLyogbm8gaG90cGx1Z2dpbmcgc3VwcG9ydCAoRklYTUUpICovCi0JaWYgKCFpbl9tb2R1bGVfaW5pdCkKKwkvKiBubyBob3RwbHVnZ2luZyBzdXBwb3J0IGZvciBsYXRlciBkZXZpY2VzIChGSVhNRSkgKi8KKwlpZiAoIWluX21vZHVsZV9pbml0ICYmIGVudC0+ZHJpdmVyX2RhdGEgPj0gaWNoNV9zYXRhKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmIChwaWl4X2Jyb2tlbl9zeXN0ZW1fcG93ZXJvZmYocGRldikpIHsKQEAgLTE1OTEsNiArMTU4OSw3IEBACiAJCWhvc3QtPnBvcnRzWzFdLT5td2RtYV9tYXNrID0gMDsKIAkJaG9zdC0+cG9ydHNbMV0tPnVkbWFfbWFzayA9IDA7CiAJfQorCWhvc3QtPmZsYWdzIHw9IEFUQV9IT1NUX1BBUkFMTEVMX1NDQU47CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAlyZXR1cm4gYXRhX3BjaV9zZmZfYWN0aXZhdGVfaG9zdChob3N0LCBhdGFfc2ZmX2ludGVycnVwdCwgJnBpaXhfc2h0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCmluZGV4IGM5MjQyMzAuLmNhNGQyMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwpAQCAtNTAzMSw3ICs1MDMxLDYgQEAKIHsKIAlpbnQgbnJfZG9uZSA9IDA7CiAJdTMyIGRvbmVfbWFzazsKLQlpbnQgaTsKIAogCWRvbmVfbWFzayA9IGFwLT5xY19hY3RpdmUgXiBxY19hY3RpdmU7CiAKQEAgLTUwNDEsMTYgKzUwNDAsMTYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfUVVFVUU7IGkrKykgeworCXdoaWxlIChkb25lX21hc2spIHsKIAkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKKwkJdW5zaWduZWQgaW50IHRhZyA9IF9fZmZzKGRvbmVfbWFzayk7CiAKLQkJaWYgKCEoZG9uZV9tYXNrICYgKDEgPDwgaSkpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKChxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgaSkpKSB7CisJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCB0YWcpOworCQlpZiAocWMpIHsKIAkJCWF0YV9xY19jb21wbGV0ZShxYyk7CiAJCQlucl9kb25lKys7CiAJCX0KKwkJZG9uZV9tYXNrICY9IH4oMSA8PCB0YWcpOwogCX0KIAogCXJldHVybiBucl9kb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKaW5kZXggMzQyMzE2MC4uZDBkZmVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCkBAIC0xMDg0LDcgKzEwODQsNyBAQAogCWlmIChsaWtlbHkoIWJsa19wY19yZXF1ZXN0KHJxKSkpCiAJCXJldHVybiAwOwogCi0JaWYgKCFycS0+ZGF0YV9sZW4gfHwgKHJxLT5jbWRfZmxhZ3MgJiBSRVFfUlcpKQorCWlmICghYmxrX3JxX2J5dGVzKHJxKSB8fCAocnEtPmNtZF9mbGFncyAmIFJFUV9SVykpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIGF0YXBpX2NtZF90eXBlKHJxLT5jbWRbMF0pID09IEFUQVBJX01JU0M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKaW5kZXggYmIxODQxNS4uYmJiYjFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwpAQCAtNzI3LDE3ICs3MjcsMjMgQEAKIAllbHNlCiAJCWlvd3JpdGUxNl9yZXAoZGF0YV9hZGRyLCBidWYsIHdvcmRzKTsKIAotCS8qIFRyYW5zZmVyIHRyYWlsaW5nIDEgYnl0ZSwgaWYgYW55LiAqLworCS8qIFRyYW5zZmVyIHRyYWlsaW5nIGJ5dGUsIGlmIGFueS4gKi8KIAlpZiAodW5saWtlbHkoYnVmbGVuICYgMHgwMSkpIHsKLQkJX19sZTE2IGFsaWduX2J1ZlsxXSA9IHsgMCB9OwotCQl1bnNpZ25lZCBjaGFyICp0cmFpbGluZ19idWYgPSBidWYgKyBidWZsZW4gLSAxOworCQl1bnNpZ25lZCBjaGFyIHBhZFsyXTsKIAorCQkvKiBQb2ludCBidWYgdG8gdGhlIHRhaWwgb2YgYnVmZmVyICovCisJCWJ1ZiArPSBidWZsZW4gLSAxOworCisJCS8qCisJCSAqIFVzZSBpbyoxNl9yZXAoKSBhY2Nlc3NvcnMgaGVyZSBhcyB3ZWxsIHRvIGF2b2lkIHBvaW50bGVzc2x5CisJCSAqIHN3YXBwaW5nIGJ5dGVzIHRvIGFuZCBmcm8gb24gdGhlIGJpZyBlbmRpYW4gbWFjaGluZXMuLi4KKwkJICovCiAJCWlmIChydyA9PSBSRUFEKSB7Ci0JCQlhbGlnbl9idWZbMF0gPSBjcHVfdG9fbGUxNihpb3JlYWQxNihkYXRhX2FkZHIpKTsKLQkJCW1lbWNweSh0cmFpbGluZ19idWYsIGFsaWduX2J1ZiwgMSk7CisJCQlpb3JlYWQxNl9yZXAoZGF0YV9hZGRyLCBwYWQsIDEpOworCQkJKmJ1ZiA9IHBhZFswXTsKIAkJfSBlbHNlIHsKLQkJCW1lbWNweShhbGlnbl9idWYsIHRyYWlsaW5nX2J1ZiwgMSk7Ci0JCQlpb3dyaXRlMTYobGUxNl90b19jcHUoYWxpZ25fYnVmWzBdKSwgZGF0YV9hZGRyKTsKKwkJCXBhZFswXSA9ICpidWY7CisJCQlpb3dyaXRlMTZfcmVwKGRhdGFfYWRkciwgcGFkLCAxKTsKIAkJfQogCQl3b3JkcysrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwppbmRleCA2Y2RhMTJiLi5iMmQxMWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCkBAIC0zMDUsOCArMzA1LDggQEAKIHN0YXRpYyBpbnQgbnZfc2NyX3JlYWQoc3RydWN0IGF0YV9saW5rICpsaW5rLCB1bnNpZ25lZCBpbnQgc2NfcmVnLCB1MzIgKnZhbCk7CiBzdGF0aWMgaW50IG52X3Njcl93cml0ZShzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOwogCi1zdGF0aWMgaW50IG52X25vY2xhc3NpZnlfaGFyZHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKLQkJCQkgICB1bnNpZ25lZCBsb25nIGRlYWRsaW5lKTsKK3N0YXRpYyBpbnQgbnZfaGFyZHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKKwkJCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpOwogc3RhdGljIHZvaWQgbnZfbmYyX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyB2b2lkIG52X25mMl90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgbnZfY2s4MDRfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApOwpAQCAtNDA2LDQ5ICs0MDYsODIgQEAKIAkuc2xhdmVfY29uZmlndXJlCT0gbnZfc3duY3Ffc2xhdmVfY29uZmlnLAogfTsKIAotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X2NvbW1vbl9vcHMgPSB7CisvKgorICogTlYgU0FUQSBjb250cm9sbGVycyBoYXZlIHZhcmlvdXMgZGlmZmVyZW50IHByb2JsZW1zIHdpdGggaGFyZHJlc2V0CisgKiBwcm90b2NvbCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmljIGNvbnRyb2xsZXIgYW5kIGRldmljZS4KKyAqCisgKiBHRU5FUklDOgorICoKKyAqICBia28xMTE5NSByZXBvcnRzIHRoYXQgbGluayBkb2Vzbid0IGNvbWUgb25saW5lIGFmdGVyIGhhcmRyZXNldCBvbgorICogIGdlbmVyaWMgbnYncyBhbmQgdGhlcmUgaGF2ZSBiZWVuIHNldmVyYWwgb3RoZXIgc2ltaWxhciByZXBvcnRzIG9uCisgKiAgbGludXgtaWRlLgorICoKKyAqICBia28xMjM1MSNjMjMgcmVwb3J0cyB0aGF0IHdhcm1wbHVnIG9uIE1DUDYxIGRvZXNuJ3Qgd29yayB3aXRoCisgKiAgc29mdHJlc2V0LgorICoKKyAqIE5GMi8zOgorICoKKyAqICBia28zMzUyIHJlcG9ydHMgbmYyLzMgY29udHJvbGxlcnMgY2FuJ3QgZGV0ZXJtaW5lIGRldmljZSBzaWduYXR1cmUKKyAqICByZWxpYWJseSBhZnRlciBoYXJkcmVzZXQuICBUaGUgZm9sbG93aW5nIHRocmVhZCByZXBvcnRzIGRldGVjdGlvbgorICogIGZhaWx1cmUgb24gY29sZCBib290IHdpdGggdGhlIHN0YW5kYXJkIGRlYm91bmNpbmcgdGltaW5nLgorICoKKyAqICBodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5saW51eC5pZGUvMzQwOTgKKyAqCisgKiAgYmtvMTIxNzYgcmVwb3J0cyB0aGF0IGhhcmRyZXNldCBmYWlscyB0byBicmluZyB1cCB0aGUgbGluayBkdXJpbmcKKyAqICBib290IG9uIG5mMi4KKyAqCisgKiBDSzgwNDoKKyAqCisgKiAgRm9yIGluaXRpYWwgcHJvYmluZyBhZnRlciBib290IGFuZCBob3QgcGx1Z2dpbmcsIGhhcmRyZXNldCBtb3N0bHkKKyAqICB3b3JrcyBmaW5lIG9uIENLODA0IGJ1dCBjdXJpb3VzbHksIHJlcHJvYmluZyBvbiB0aGUgaW5pdGlhbCBwb3J0CisgKiAgYnkgcmVzY2FubmluZyBvciBybW1vZC9pbnNtb2QgZmFpbHMgdG8gYWNxdWlyZSB0aGUgaW5pdGlhbCBEMkggUmVnCisgKiAgRklTIGluIHNvbWV3aGF0IHVuZGV0ZXJtaW5pc3RpYyB3YXkuCisgKgorICogU1dOQ1E6CisgKgorICogIGJrbzEyMzUxIHJlcG9ydHMgdGhhdCB3aGVuIFNXTkNRIGlzIGVuYWJsZWQsIGZvciBob3RwbHVnIHRvIHdvcmssCisgKiAgaGFyZHJlc2V0IHNob3VsZCBiZSB1c2VkIGFuZCBoYXJkcmVzZXQgY2FuJ3QgcmVwb3J0IHByb3BlcgorICogIHNpZ25hdHVyZSwgd2hpY2ggc3VnZ2VzdHMgdGhhdCBtY3A1eCBpcyBjbG9zZXIgdG8gbmYyIGFzIGxvbmcgYXMKKyAqICByZXNldCBxdWlya2luZXNzIGlzIGNvbmNlcm5lZC4KKyAqCisgKiAgYmtvMTI3MDMgcmVwb3J0cyB0aGF0IGJvb3QgcHJvYmluZyBmYWlscyBmb3IgaW50ZWwgU1NEIHdpdGgKKyAqICBoYXJkcmVzZXQuICBMaW5rIGZhaWxzIHRvIGNvbWUgb25saW5lLiAgU29mdHJlc2V0IHdvcmtzIGZpbmUuCisgKgorICogVGhlIGZhaWx1cmVzIGFyZSB2YXJpZWQgYnV0IHRoZSBmb2xsb3dpbmcgcGF0dGVybnMgc2VlbSB0cnVlIGZvcgorICogYWxsIGZsYXZvcnMuCisgKgorICogLSBTb2Z0cmVzZXQgZHVyaW5nIGJvb3QgYWx3YXlzIHdvcmtzLgorICoKKyAqIC0gSGFyZHJlc2V0IGR1cmluZyBib290IHNvbWV0aW1lcyBmYWlscyB0byBicmluZyB1cCB0aGUgbGluayBvbgorICogICBjZXJ0YWluIGNvbWlibmF0aW9ucyBhbmQgZGV2aWNlIHNpZ25hdHVyZSBhY3F1aXNpdGlvbiBpcworICogICB1bnJlbGlhYmxlLgorICoKKyAqIC0gSGFyZHJlc2V0IGlzIG9mdGVuIG5lY2Vzc2FyeSBhZnRlciBob3RwbHVnLgorICoKKyAqIFNvLCBwcmVmZXJyaW5nIHNvZnRyZXNldCBmb3IgYm9vdCBwcm9iaW5nIGFuZCBlcnJvciBoYW5kbGluZyAoYXMKKyAqIGhhcmRyZXNldCBtaWdodCBicmluZyBkb3duIHRoZSBsaW5rKSBidXQgdXNpbmcgaGFyZHJlc2V0IGZvcgorICogcG9zdC1ib290IHByb2Jpbmcgc2hvdWxkIHdvcmsgYXJvdW5kIHRoZSBhYm92ZSBpc3N1ZXMgaW4gbW9zdAorICogY2FzZXMuICBEZWZpbmUgbnZfaGFyZHJlc2V0KCkgd2hpY2ggb25seSBraWNrcyBpbiBmb3IgcG9zdC1ib290CisgKiBwcm9iaW5nIGFuZCB1c2UgaXQgZm9yIGFsbCB2YXJpYW50cy4KKyAqLworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X2dlbmVyaWNfb3BzID0gewogCS5pbmhlcml0cwkJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAogCS5sb3N0X2ludGVycnVwdAkJPSBBVEFfT1BfTlVMTCwKIAkuc2NyX3JlYWQJCT0gbnZfc2NyX3JlYWQsCiAJLnNjcl93cml0ZQkJPSBudl9zY3Jfd3JpdGUsCisJLmhhcmRyZXNldAkJPSBudl9oYXJkcmVzZXQsCiB9OwogCi0vKiBPU0RMIGJ6MTExOTUgcmVwb3J0cyB0aGF0IGxpbmsgZG9lc24ndCBjb21lIG9ubGluZSBhZnRlciBoYXJkcmVzZXQKLSAqIG9uIGdlbmVyaWMgbnYncyBhbmQgdGhlcmUgaGF2ZSBiZWVuIHNldmVyYWwgb3RoZXIgc2ltaWxhciByZXBvcnRzCi0gKiBvbiBsaW51eC1pZGUuICBEaXNhYmxlIGhhcmRyZXNldCBmb3IgZ2VuZXJpYyBudidzLgotICovCi1zdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfZ2VuZXJpY19vcHMgPSB7Ci0JLmluaGVyaXRzCQk9ICZudl9jb21tb25fb3BzLAotCS5oYXJkcmVzZXQJCT0gQVRBX09QX05VTEwsCi19OwotCi0vKiBuZjIgaXMgcmlwZSB3aXRoIGhhcmRyZXNldCByZWxhdGVkIHByb2JsZW1zLgotICoKLSAqIGtlcm5lbCBieiMzMzUyIHJlcG9ydHMgbmYyLzMgY29udHJvbGxlcnMgY2FuJ3QgZGV0ZXJtaW5lIGRldmljZQotICogc2lnbmF0dXJlIHJlbGlhYmx5LiAgVGhlIGZvbGxvd2luZyB0aHJlYWQgcmVwb3J0cyBkZXRlY3Rpb24gZmFpbHVyZQotICogb24gY29sZCBib290IHdpdGggdGhlIHN0YW5kYXJkIGRlYm91bmNpbmcgdGltaW5nLgotICoKLSAqIGh0dHA6Ly90aHJlYWQuZ21hbmUub3JnL2dtYW5lLmxpbnV4LmlkZS8zNDA5OAotICoKLSAqIEFuZCBieiMxMjE3NiByZXBvcnRzIHRoYXQgaGFyZHJlc2V0IHNpbXBseSBkb2Vzbid0IHdvcmsgb24gbmYyLgotICogR2l2ZSB1cCBvbiBpdCBhbmQganVzdCBkb24ndCBkbyBoYXJkcmVzZXQuCi0gKi8KIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBudl9uZjJfb3BzID0gewogCS5pbmhlcml0cwkJPSAmbnZfZ2VuZXJpY19vcHMsCiAJLmZyZWV6ZQkJCT0gbnZfbmYyX2ZyZWV6ZSwKIAkudGhhdwkJCT0gbnZfbmYyX3RoYXcsCiB9OwogCi0vKiBGb3IgaW5pdGlhbCBwcm9iaW5nIGFmdGVyIGJvb3QgYW5kIGhvdCBwbHVnZ2luZywgaGFyZHJlc2V0IG1vc3RseQotICogd29ya3MgZmluZSBvbiBDSzgwNCBidXQgY3VyaW91c2x5LCByZXByb2Jpbmcgb24gdGhlIGluaXRpYWwgcG9ydCBieQotICogcmVzY2FubmluZyBvciBybW1vZC9pbnNtb2QgZmFpbHMgdG8gYWNxdWlyZSB0aGUgaW5pdGlhbCBEMkggUmVnIEZJUwotICogaW4gc29tZXdoYXQgdW5kZXRlcm1pbmlzdGljIHdheS4gIFVzZSBub2NsYXNzaWZ5IGhhcmRyZXNldC4KLSAqLwogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zIG52X2NrODA0X29wcyA9IHsKLQkuaW5oZXJpdHMJCT0gJm52X2NvbW1vbl9vcHMsCisJLmluaGVyaXRzCQk9ICZudl9nZW5lcmljX29wcywKIAkuZnJlZXplCQkJPSBudl9jazgwNF9mcmVlemUsCiAJLnRoYXcJCQk9IG52X2NrODA0X3RoYXcsCi0JLmhhcmRyZXNldAkJPSBudl9ub2NsYXNzaWZ5X2hhcmRyZXNldCwKIAkuaG9zdF9zdG9wCQk9IG52X2NrODA0X2hvc3Rfc3RvcCwKIH07CiAKQEAgLTQ3NiwxOSArNTA5LDggQEAKIAkuaG9zdF9zdG9wCQk9IG52X2FkbWFfaG9zdF9zdG9wLAogfTsKIAotLyogS2VybmVsIGJ6IzEyMzUxIHJlcG9ydHMgdGhhdCB3aGVuIFNXTkNRIGlzIGVuYWJsZWQsIGZvciBob3RwbHVnIHRvCi0gKiB3b3JrLCBoYXJkcmVzZXQgc2hvdWxkIGJlIHVzZWQgYW5kIGhhcmRyZXNldCBjYW4ndCByZXBvcnQgcHJvcGVyCi0gKiBzaWduYXR1cmUsIHdoaWNoIHN1Z2dlc3RzIHRoYXQgbWNwNXggaXMgY2xvc2VyIHRvIG5mMiBhcyBsb25nIGFzCi0gKiByZXNldCBxdWlya2luZXNzIGlzIGNvbmNlcm5lZC4gIERlZmluZSBzZXBhcmF0ZSBvcHMgZm9yIG1jcDV4IHdpdGgKLSAqIG52X25vY2xhc3NpZnlfaGFyZHJlc2V0KCkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBudl9tY3A1eF9vcHMgPSB7Ci0JLmluaGVyaXRzCQk9ICZudl9jb21tb25fb3BzLAotCS5oYXJkcmVzZXQJCT0gbnZfbm9jbGFzc2lmeV9oYXJkcmVzZXQsCi19OwotCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfc3duY3Ffb3BzID0gewotCS5pbmhlcml0cwkJPSAmbnZfbWNwNXhfb3BzLAorCS5pbmhlcml0cwkJPSAmbnZfZ2VuZXJpY19vcHMsCiAKIAkucWNfZGVmZXIJCT0gYXRhX3N0ZF9xY19kZWZlciwKIAkucWNfcHJlcAkJPSBudl9zd25jcV9xY19wcmVwLApAQCAtNTU3LDcgKzU3OSw3IEBACiAJCS5waW9fbWFzawk9IE5WX1BJT19NQVNLLAogCQkubXdkbWFfbWFzawk9IE5WX01XRE1BX01BU0ssCiAJCS51ZG1hX21hc2sJPSBOVl9VRE1BX01BU0ssCi0JCS5wb3J0X29wcwk9ICZudl9tY3A1eF9vcHMsCisJCS5wb3J0X29wcwk9ICZudl9nZW5lcmljX29wcywKIAkJLnByaXZhdGVfZGF0YQk9IE5WX1BJX1BSSVYobnZfZ2VuZXJpY19pbnRlcnJ1cHQsICZudl9zaHQpLAogCX0sCiAJLyogU1dOQ1EgKi8KQEAgLTE1NTksMTUgKzE1ODEsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBudl9ub2NsYXNzaWZ5X2hhcmRyZXNldChzdHJ1Y3QgYXRhX2xpbmsgKmxpbmssIHVuc2lnbmVkIGludCAqY2xhc3MsCi0JCQkJICAgdW5zaWduZWQgbG9uZyBkZWFkbGluZSkKK3N0YXRpYyBpbnQgbnZfaGFyZHJlc2V0KHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50ICpjbGFzcywKKwkJCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmUpCiB7Ci0JYm9vbCBvbmxpbmU7Ci0JaW50IHJjOworCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmxpbmstPmVoX2NvbnRleHQ7CiAKLQlyYyA9IHNhdGFfbGlua19oYXJkcmVzZXQobGluaywgc2F0YV9kZWJfdGltaW5nX2hvdHBsdWcsIGRlYWRsaW5lLAotCQkJCSAmb25saW5lLCBOVUxMKTsKLQlyZXR1cm4gb25saW5lID8gLUVBR0FJTiA6IHJjOworCS8qIERvIGhhcmRyZXNldCBpZmYgaXQncyBwb3N0LWJvb3QgcHJvYmluZywgcGxlYXNlIHJlYWQgdGhlCisJICogY29tbWVudCBhYm92ZSBwb3J0IG9wcyBmb3IgZGV0YWlscy4KKwkgKi8KKwlpZiAoIShsaW5rLT5hcC0+cGZsYWdzICYgQVRBX1BGTEFHX0xPQURJTkcpICYmCisJICAgICFhdGFfZGV2X2VuYWJsZWQobGluay0+ZGV2aWNlKSkKKwkJc2F0YV9saW5rX2hhcmRyZXNldChsaW5rLCBzYXRhX2RlYl90aW1pbmdfaG90cGx1ZywgZGVhZGxpbmUsCisJCQkJICAgIE5VTEwsIE5VTEwpOworCWVsc2UgaWYgKCEoZWhjLT5pLmZsYWdzICYgQVRBX0VISV9RVUlFVCkpCisJCWF0YV9saW5rX3ByaW50ayhsaW5rLCBLRVJOX0lORk8sCisJCQkJIm52OiBza2lwcGluZyBoYXJkcmVzZXQgb24gb2NjdXBpZWQgcG9ydFxuIik7CisKKwkvKiBkZXZpY2Ugc2lnbmF0dXJlIGFjcXVpc2l0aW9uIGlzIHVucmVsaWFibGUgKi8KKwlyZXR1cm4gLUVBR0FJTjsKIH0KIAogc3RhdGljIHZvaWQgbnZfbmYyX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaWwuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKaW5kZXggZTY3Y2U4ZS4uMDMwZWMwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zaWwuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCkBAIC0xODMsNyArMTgzLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBzaWxfb3BzID0gewotCS5pbmhlcml0cwkJPSAmYXRhX2JtZG1hX3BvcnRfb3BzLAorCS5pbmhlcml0cwkJPSAmYXRhX2JtZG1hMzJfcG9ydF9vcHMsCiAJLmRldl9jb25maWcJCT0gc2lsX2Rldl9jb25maWcsCiAJLnNldF9tb2RlCQk9IHNpbF9zZXRfbW9kZSwKIAkuYm1kbWFfc2V0dXAgICAgICAgICAgICA9IHNpbF9ibWRtYV9zZXR1cCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfc3g0LmMgYi9kcml2ZXJzL2F0YS9zYXRhX3N4NC5jCmluZGV4IGViMDVhM2MuLmJiY2Y5NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc3g0LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9zeDQuYwpAQCAtMTkzLDYgKzE5Myw3IEBACiAJCQkJCSAgUERDX1RJTUVSX01BU0tfSU5ULAogfTsKIAorI2RlZmluZSBFQ0NfRVJBU0VfQlVGX1NaICgxMjggKiAxMDI0KQogCiBzdHJ1Y3QgcGRjX3BvcnRfcHJpdiB7CiAJdTgJCQlkaW1tX2J1ZlsoQVRBX1BSRF9TWiAqIEFUQV9NQVhfUFJEKSArIDUxMl07CkBAIC0xMjgwLDcgKzEyODEsNiBAQAogewogCWludCBzcGVlZCwgc2l6ZSwgbGVuZ3RoOwogCXUzMiBhZGRyLCBzcGQwLCBwY2lfc3RhdHVzOwotCXUzMiB0bXAgPSAwOwogCXUzMiB0aW1lX3BlcmlvZCA9IDA7CiAJdTMyIHRjb3VudCA9IDA7CiAJdTMyIHRpY2tzID0gMDsKQEAgLTEzOTUsMTQgKzEzOTUsMTcgQEAKIAlwZGMyMDYyMV9pMmNfcmVhZChob3N0LCBQRENfRElNTTBfU1BEX0RFVl9BRERSRVNTLAogCQkJICBQRENfRElNTV9TUERfVFlQRSwgJnNwZDApOwogCWlmIChzcGQwID09IDB4MDIpIHsKKwkJdm9pZCAqYnVmOwogCQlWUFJJTlRLKCJTdGFydCBFQ0MgaW5pdGlhbGl6YXRpb25cbiIpOwogCQlhZGRyID0gMDsKIAkJbGVuZ3RoID0gc2l6ZSAqIDEwMjQgKiAxMDI0OworCQlidWYgPSBremFsbG9jKEVDQ19FUkFTRV9CVUZfU1osIEdGUF9LRVJORUwpOwogCQl3aGlsZSAoYWRkciA8IGxlbmd0aCkgewotCQkJcGRjMjA2MjFfcHV0X3RvX2RpbW0oaG9zdCwgKHZvaWQgKikgJnRtcCwgYWRkciwKLQkJCQkJICAgICBzaXplb2YodTMyKSk7Ci0JCQlhZGRyICs9IHNpemVvZih1MzIpOworCQkJcGRjMjA2MjFfcHV0X3RvX2RpbW0oaG9zdCwgYnVmLCBhZGRyLAorCQkJCQkgICAgIEVDQ19FUkFTRV9CVUZfU1opOworCQkJYWRkciArPSBFQ0NfRVJBU0VfQlVGX1NaOwogCQl9CisJCWtmcmVlKGJ1Zik7CiAJCVZQUklOVEsoIkZpbmlzaCBFQ0MgaW5pdGlhbGl6YXRpb25cbiIpOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svREFDOTYwLmMgYi9kcml2ZXJzL2Jsb2NrL0RBQzk2MC5jCmluZGV4IGYyMmVkNmMuLjY2OGRjMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svREFDOTYwLmMKKysrIGIvZHJpdmVycy9ibG9jay9EQUM5NjAuYwpAQCAtMzMyMSw3ICszMzIxLDcgQEAKIAlEQUM5NjBfQ29tbWFuZF9UICpDb21tYW5kOwogCiAgICB3aGlsZSgxKSB7Ci0JUmVxdWVzdCA9IGVsdl9uZXh0X3JlcXVlc3QocmVxX3EpOworCVJlcXVlc3QgPSBibGtfcGVla19yZXF1ZXN0KHJlcV9xKTsKIAlpZiAoIVJlcXVlc3QpCiAJCXJldHVybiAxOwogCkBAIC0zMzM4LDEwICszMzM4LDEwIEBACiAJfQogCUNvbW1hbmQtPkNvbXBsZXRpb24gPSBSZXF1ZXN0LT5lbmRfaW9fZGF0YTsKIAlDb21tYW5kLT5Mb2dpY2FsRHJpdmVOdW1iZXIgPSAobG9uZylSZXF1ZXN0LT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7Ci0JQ29tbWFuZC0+QmxvY2tOdW1iZXIgPSBSZXF1ZXN0LT5zZWN0b3I7Ci0JQ29tbWFuZC0+QmxvY2tDb3VudCA9IFJlcXVlc3QtPm5yX3NlY3RvcnM7CisJQ29tbWFuZC0+QmxvY2tOdW1iZXIgPSBibGtfcnFfcG9zKFJlcXVlc3QpOworCUNvbW1hbmQtPkJsb2NrQ291bnQgPSBibGtfcnFfc2VjdG9ycyhSZXF1ZXN0KTsKIAlDb21tYW5kLT5SZXF1ZXN0ID0gUmVxdWVzdDsKLQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KFJlcXVlc3QpOworCWJsa19zdGFydF9yZXF1ZXN0KFJlcXVlc3QpOwogCUNvbW1hbmQtPlNlZ21lbnRDb3VudCA9IGJsa19ycV9tYXBfc2cocmVxX3EsCiAJCSAgQ29tbWFuZC0+UmVxdWVzdCwgQ29tbWFuZC0+Y21kX3NnbGlzdCk7CiAJLyogcGNpX21hcF9zZyBNQVkgY2hhbmdlIHRoZSB2YWx1ZSBvZiBTZWdDb3VudCAqLwpAQCAtMzQzMSw3ICszNDMxLDcgQEAKICAgICogc3VjY2Vzc2Z1bGx5IGFzIHBvc3NpYmxlLgogICAgKi8KICAgQ29tbWFuZC0+U2VnbWVudENvdW50ID0gMTsKLSAgQ29tbWFuZC0+QmxvY2tOdW1iZXIgPSBSZXF1ZXN0LT5zZWN0b3I7CisgIENvbW1hbmQtPkJsb2NrTnVtYmVyID0gYmxrX3JxX3BvcyhSZXF1ZXN0KTsKICAgQ29tbWFuZC0+QmxvY2tDb3VudCA9IDE7CiAgIERBQzk2MF9RdWV1ZVJlYWRXcml0ZUNvbW1hbmQoQ29tbWFuZCk7CiAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svS2NvbmZpZyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwppbmRleCBkZGVhOGU0Li5mNDJmYTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcKKysrIGIvZHJpdmVycy9ibG9jay9LY29uZmlnCkBAIC00MTIsNyArNDEyLDcgQEAKIAogY29uZmlnIE1HX0RJU0sKIAl0cmlzdGF0ZSAibUdpbmUgbWZsYXNoLCBnZmxhc2ggc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEFSTSAmJiBBVEEgJiYgR1BJT0xJQgorCWRlcGVuZHMgb24gQVJNICYmIEdQSU9MSUIKIAloZWxwCiAJICBtR2luZSBtRmxhc2goZ0ZsYXNoKSBibG9jayBkZXZpY2UgZHJpdmVyCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svYW1pZmxvcC5jIGIvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKaW5kZXggOGRmNDM2Zi4uOWM2ZTViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKKysrIGIvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMKQEAgLTExMiw4ICsxMTIsNiBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgc3RydWN0IHJlcXVlc3RfcXVldWUgKmZsb3BweV9xdWV1ZTsKLSNkZWZpbmUgUVVFVUUgKGZsb3BweV9xdWV1ZSkKLSNkZWZpbmUgQ1VSUkVOVCBlbHZfbmV4dF9yZXF1ZXN0KGZsb3BweV9xdWV1ZSkKIAogLyoKICAqICBNYWNyb3MKQEAgLTEzMzUsNjQgKzEzMzMsNjAgQEAKIAogc3RhdGljIHZvaWQgcmVkb19mZF9yZXF1ZXN0KHZvaWQpCiB7CisJc3RydWN0IHJlcXVlc3QgKnJxOwogCXVuc2lnbmVkIGludCBjbnQsIGJsb2NrLCB0cmFjaywgc2VjdG9yOwogCWludCBkcml2ZTsKIAlzdHJ1Y3QgYW1pZ2FfZmxvcHB5X3N0cnVjdCAqZmxvcHB5OwogCWNoYXIgKmRhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOwogCi0gcmVwZWF0OgotCWlmICghQ1VSUkVOVCkgeworbmV4dF9yZXE6CisJcnEgPSBibGtfZmV0Y2hfcmVxdWVzdChmbG9wcHlfcXVldWUpOworCWlmICghcnEpIHsKIAkJLyogTm90aGluZyBsZWZ0IHRvIGRvICovCiAJCXJldHVybjsKIAl9CiAKLQlmbG9wcHkgPSBDVVJSRU5ULT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJZmxvcHB5ID0gcnEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKIAlkcml2ZSA9IGZsb3BweSAtIHVuaXQ7CiAKK25leHRfc2VnbWVudDoKIAkvKiBIZXJlIHNvbWVvbmUgY291bGQgaW52ZXN0aWdhdGUgdG8gYmUgbW9yZSBlZmZpY2llbnQgKi8KLQlmb3IgKGNudCA9IDA7IGNudCA8IENVUlJFTlQtPmN1cnJlbnRfbnJfc2VjdG9yczsgY250KyspIHsgCisJZm9yIChjbnQgPSAwLCBlcnIgPSAwOyBjbnQgPCBibGtfcnFfY3VyX3NlY3RvcnMocnEpOyBjbnQrKykgewogI2lmZGVmIERFQlVHCiAJCXByaW50aygiZmQ6IHNlY3RvciAlbGQgKyAlZCByZXF1ZXN0ZWQgZm9yICVzXG4iLAotCQkgICAgICAgQ1VSUkVOVC0+c2VjdG9yLGNudCwKLQkJICAgICAgIChycV9kYXRhX2RpcihDVVJSRU5UKSA9PSBSRUFEKSA/ICJyZWFkIiA6ICJ3cml0ZSIpOworCQkgICAgICAgYmxrX3JxX3BvcyhycSksIGNudCwKKwkJICAgICAgIChycV9kYXRhX2RpcihycSkgPT0gUkVBRCkgPyAicmVhZCIgOiAid3JpdGUiKTsKICNlbmRpZgotCQlibG9jayA9IENVUlJFTlQtPnNlY3RvciArIGNudDsKKwkJYmxvY2sgPSBibGtfcnFfcG9zKHJxKSArIGNudDsKIAkJaWYgKChpbnQpYmxvY2sgPiBmbG9wcHktPmJsb2NrcykgewotCQkJZW5kX3JlcXVlc3QoQ1VSUkVOVCwgMCk7Ci0JCQlnb3RvIHJlcGVhdDsKKwkJCWVyciA9IC1FSU87CisJCQlicmVhazsKIAkJfQogCiAJCXRyYWNrID0gYmxvY2sgLyAoZmxvcHB5LT5kdHlwZS0+c2VjdHMgKiBmbG9wcHktPnR5cGUtPnNlY3RfbXVsdCk7CiAJCXNlY3RvciA9IGJsb2NrICUgKGZsb3BweS0+ZHR5cGUtPnNlY3RzICogZmxvcHB5LT50eXBlLT5zZWN0X211bHQpOwotCQlkYXRhID0gQ1VSUkVOVC0+YnVmZmVyICsgNTEyICogY250OworCQlkYXRhID0gcnEtPmJ1ZmZlciArIDUxMiAqIGNudDsKICNpZmRlZiBERUJVRwogCQlwcmludGsoImFjY2VzcyB0byB0cmFjayAlZCwgc2VjdG9yICVkLCB3aXRoIGJ1ZmZlciBhdCAiCiAJCSAgICAgICAiMHglMDhseFxuIiwgdHJhY2ssIHNlY3RvciwgZGF0YSk7CiAjZW5kaWYKIAotCQlpZiAoKHJxX2RhdGFfZGlyKENVUlJFTlQpICE9IFJFQUQpICYmIChycV9kYXRhX2RpcihDVVJSRU5UKSAhPSBXUklURSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImRvX2ZkX3JlcXVlc3Q6IHVua25vd24gY29tbWFuZFxuIik7Ci0JCQllbmRfcmVxdWVzdChDVVJSRU5ULCAwKTsKLQkJCWdvdG8gcmVwZWF0OwotCQl9CiAJCWlmIChnZXRfdHJhY2soZHJpdmUsIHRyYWNrKSA9PSAtMSkgewotCQkJZW5kX3JlcXVlc3QoQ1VSUkVOVCwgMCk7Ci0JCQlnb3RvIHJlcGVhdDsKKwkJCWVyciA9IC1FSU87CisJCQlicmVhazsKIAkJfQogCi0JCXN3aXRjaCAocnFfZGF0YV9kaXIoQ1VSUkVOVCkpIHsKLQkJY2FzZSBSRUFEOgorCQlpZiAocnFfZGF0YV9kaXIocnEpID09IFJFQUQpIHsKIAkJCW1lbWNweShkYXRhLCBmbG9wcHktPnRyYWNrYnVmICsgc2VjdG9yICogNTEyLCA1MTIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBXUklURToKKwkJfSBlbHNlIHsKIAkJCW1lbWNweShmbG9wcHktPnRyYWNrYnVmICsgc2VjdG9yICogNTEyLCBkYXRhLCA1MTIpOwogCiAJCQkvKiBrZWVwIHRoZSBkcml2ZSBzcGlubmluZyB3aGlsZSB3cml0ZXMgYXJlIHNjaGVkdWxlZCAqLwogCQkJaWYgKCFmZF9tb3Rvcl9vbihkcml2ZSkpIHsKLQkJCQllbmRfcmVxdWVzdChDVVJSRU5ULCAwKTsKLQkJCQlnb3RvIHJlcGVhdDsKKwkJCQllcnIgPSAtRUlPOworCQkJCWJyZWFrOwogCQkJfQogCQkJLyoKIAkJCSAqIHNldHVwIGEgY2FsbGJhY2sgdG8gd3JpdGUgdGhlIHRyYWNrIGJ1ZmZlcgpAQCAtMTQwNCwxNCArMTM5OCwxMiBAQAogCQkgICAgICAgIC8qIHJlc2V0IHRoZSB0aW1lciAqLwogCQkJbW9kX3RpbWVyIChmbHVzaF90cmFja190aW1lciArIGRyaXZlLCBqaWZmaWVzICsgMSk7CiAJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlicmVhazsKIAkJfQogCX0KLQlDVVJSRU5ULT5ucl9zZWN0b3JzIC09IENVUlJFTlQtPmN1cnJlbnRfbnJfc2VjdG9yczsKLQlDVVJSRU5ULT5zZWN0b3IgKz0gQ1VSUkVOVC0+Y3VycmVudF9ucl9zZWN0b3JzOwogCi0JZW5kX3JlcXVlc3QoQ1VSUkVOVCwgMSk7Ci0JZ290byByZXBlYXQ7CisJaWYgKF9fYmxrX2VuZF9yZXF1ZXN0X2N1cihycSwgZXJyKSkKKwkJZ290byBuZXh0X3NlZ21lbnQ7CisJZ290byBuZXh0X3JlcTsKIH0KIAogc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2F0YWZsb3AuYyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCmluZGV4IDQyMzRjMTEuLmY1ZTcxODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svYXRhZmxvcC5jCkBAIC03OSw5ICs3OSw3IEBACiAjdW5kZWYgREVCVUcKIAogc3RhdGljIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpmbG9wcHlfcXVldWU7Ci0KLSNkZWZpbmUgUVVFVUUgKGZsb3BweV9xdWV1ZSkKLSNkZWZpbmUgQ1VSUkVOVCBlbHZfbmV4dF9yZXF1ZXN0KGZsb3BweV9xdWV1ZSkKK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqZmRfcmVxdWVzdDsKIAogLyogRGlzayB0eXBlczogREQsIEhELCBFRCAqLwogc3RhdGljIHN0cnVjdCBhdGFyaV9kaXNrX3R5cGUgewpAQCAtMzc2LDYgKzM3NCwxMiBAQAogc3RhdGljIERFRklORV9USU1FUih0aW1lb3V0X3RpbWVyLCBmZF90aW1lc19vdXQsIDAsIDApOwogc3RhdGljIERFRklORV9USU1FUihmZF90aW1lciwgY2hlY2tfY2hhbmdlLCAwLCAwKTsKIAkKK3N0YXRpYyB2b2lkIGZkX2VuZF9yZXF1ZXN0X2N1cihpbnQgZXJyKQoreworCWlmICghX19ibGtfZW5kX3JlcXVlc3RfY3VyKGZkX3JlcXVlc3QsIGVycikpCisJCWZkX3JlcXVlc3QgPSBOVUxMOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfbW90b3Jfb2ZmX3RpbWVyKHZvaWQpCiB7CiAJbW9kX3RpbWVyKCZtb3Rvcl9vZmZfdGltZXIsIGppZmZpZXMgKyBGRF9NT1RPUl9PRkZfREVMQVkpOwpAQCAtNjA2LDE1ICs2MTAsMTUgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghQ1VSUkVOVCkKKwlpZiAoIWZkX3JlcXVlc3QpCiAJCXJldHVybjsKIAotCUNVUlJFTlQtPmVycm9ycysrOwotCWlmIChDVVJSRU5ULT5lcnJvcnMgPj0gTUFYX0VSUk9SUykgeworCWZkX3JlcXVlc3QtPmVycm9ycysrOworCWlmIChmZF9yZXF1ZXN0LT5lcnJvcnMgPj0gTUFYX0VSUk9SUykgewogCQlwcmludGsoS0VSTl9FUlIgImZkJWQ6IHRvbyBtYW55IGVycm9ycy5cbiIsIFNlbGVjdGVkRHJpdmUgKTsKLQkJZW5kX3JlcXVlc3QoQ1VSUkVOVCwgMCk7CisJCWZkX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKIAl9Ci0JZWxzZSBpZiAoQ1VSUkVOVC0+ZXJyb3JzID09IFJFQ0FMSUJSQVRFX0VSUk9SUykgeworCWVsc2UgaWYgKGZkX3JlcXVlc3QtPmVycm9ycyA9PSBSRUNBTElCUkFURV9FUlJPUlMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZmQlZDogcmVjYWxpYnJhdGluZ1xuIiwgU2VsZWN0ZWREcml2ZSApOwogCQlpZiAoU2VsZWN0ZWREcml2ZSAhPSAtMSkKIAkJCVNVRC50cmFjayA9IC0xOwpAQCAtNzI1LDE2ICs3MjksMTQgQEAKIAkgICAgaWYgKElTX0JVRkZFUkVEKCBkcml2ZSwgUmVxU2lkZSwgUmVxVHJhY2sgKSkgewogCQlpZiAoUmVxQ21kID09IFJFQUQpIHsKIAkJICAgIGNvcHlfYnVmZmVyKCBTRUNUT1JfQlVGRkVSKFJlcVNlY3RvciksIFJlcURhdGEgKTsKLQkJICAgIGlmICgrK1JlcUNudCA8IENVUlJFTlQtPmN1cnJlbnRfbnJfc2VjdG9ycykgeworCQkgICAgaWYgKCsrUmVxQ250IDwgYmxrX3JxX2N1cl9zZWN0b3JzKGZkX3JlcXVlc3QpKSB7CiAJCQkvKiByZWFkIG5leHQgc2VjdG9yICovCiAJCQlzZXR1cF9yZXFfcGFyYW1zKCBkcml2ZSApOwogCQkJZ290byByZXBlYXQ7CiAJCSAgICB9CiAJCSAgICBlbHNlIHsKIAkJCS8qIGFsbCBzZWN0b3JzIGZpbmlzaGVkICovCi0JCQlDVVJSRU5ULT5ucl9zZWN0b3JzIC09IENVUlJFTlQtPmN1cnJlbnRfbnJfc2VjdG9yczsKLQkJCUNVUlJFTlQtPnNlY3RvciArPSBDVVJSRU5ULT5jdXJyZW50X25yX3NlY3RvcnM7Ci0JCQllbmRfcmVxdWVzdChDVVJSRU5ULCAxKTsKKwkJCWZkX2VuZF9yZXF1ZXN0X2N1cigwKTsKIAkJCXJlZG9fZmRfcmVxdWVzdCgpOwogCQkJcmV0dXJuOwogCQkgICAgfQpAQCAtMTEzMiwxNiArMTEzNCwxNCBAQAogCQl9CiAJfQogICAKLQlpZiAoKytSZXFDbnQgPCBDVVJSRU5ULT5jdXJyZW50X25yX3NlY3RvcnMpIHsKKwlpZiAoKytSZXFDbnQgPCBibGtfcnFfY3VyX3NlY3RvcnMoZmRfcmVxdWVzdCkpIHsKIAkJLyogcmVhZCBuZXh0IHNlY3RvciAqLwogCQlzZXR1cF9yZXFfcGFyYW1zKCBTZWxlY3RlZERyaXZlICk7CiAJCWRvX2ZkX2FjdGlvbiggU2VsZWN0ZWREcml2ZSApOwogCX0KIAllbHNlIHsKIAkJLyogYWxsIHNlY3RvcnMgZmluaXNoZWQgKi8KLQkJQ1VSUkVOVC0+bnJfc2VjdG9ycyAtPSBDVVJSRU5ULT5jdXJyZW50X25yX3NlY3RvcnM7Ci0JCUNVUlJFTlQtPnNlY3RvciArPSBDVVJSRU5ULT5jdXJyZW50X25yX3NlY3RvcnM7Ci0JCWVuZF9yZXF1ZXN0KENVUlJFTlQsIDEpOworCQlmZF9lbmRfcmVxdWVzdF9jdXIoMCk7CiAJCXJlZG9fZmRfcmVxdWVzdCgpOwogCX0KIAlyZXR1cm47CkBAIC0xMzgyLDcgKzEzODIsNyBAQAogCVJlcURhdGEgPSBSZXFCdWZmZXIgKyA1MTIgKiBSZXFDbnQ7CiAKIAlpZiAoVXNlVHJhY2tidWZmZXIpCi0JCXJlYWRfdHJhY2sgPSAoUmVxQ21kID09IFJFQUQgJiYgQ1VSUkVOVC0+ZXJyb3JzID09IDApOworCQlyZWFkX3RyYWNrID0gKFJlcUNtZCA9PSBSRUFEICYmIGZkX3JlcXVlc3QtPmVycm9ycyA9PSAwKTsKIAllbHNlCiAJCXJlYWRfdHJhY2sgPSAwOwogCkBAIC0xMzk2LDI1ICsxMzk2LDI3IEBACiAJaW50IGRyaXZlLCB0eXBlOwogCXN0cnVjdCBhdGFyaV9mbG9wcHlfc3RydWN0ICpmbG9wcHk7CiAKLQlEUFJJTlQoKCJyZWRvX2ZkX3JlcXVlc3Q6IENVUlJFTlQ9JXAgZGV2PSVzIENVUlJFTlQtPnNlY3Rvcj0lbGRcbiIsCi0JCUNVUlJFTlQsIENVUlJFTlQgPyBDVVJSRU5ULT5ycV9kaXNrLT5kaXNrX25hbWUgOiAiIiwKLQkJQ1VSUkVOVCA/IENVUlJFTlQtPnNlY3RvciA6IDAgKSk7CisJRFBSSU5UKCgicmVkb19mZF9yZXF1ZXN0OiBmZF9yZXF1ZXN0PSVwIGRldj0lcyBmZF9yZXF1ZXN0LT5zZWN0b3I9JWxkXG4iLAorCQlmZF9yZXF1ZXN0LCBmZF9yZXF1ZXN0ID8gZmRfcmVxdWVzdC0+cnFfZGlzay0+ZGlza19uYW1lIDogIiIsCisJCWZkX3JlcXVlc3QgPyBibGtfcnFfcG9zKGZkX3JlcXVlc3QpIDogMCApKTsKIAogCUlzRm9ybWF0dGluZyA9IDA7CiAKIHJlcGVhdDoKKwlpZiAoIWZkX3JlcXVlc3QpIHsKKwkJZmRfcmVxdWVzdCA9IGJsa19mZXRjaF9yZXF1ZXN0KGZsb3BweV9xdWV1ZSk7CisJCWlmICghZmRfcmVxdWVzdCkKKwkJCWdvdG8gdGhlX2VuZDsKKwl9CiAKLQlpZiAoIUNVUlJFTlQpCi0JCWdvdG8gdGhlX2VuZDsKLQotCWZsb3BweSA9IENVUlJFTlQtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwlmbG9wcHkgPSBmZF9yZXF1ZXN0LT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAJZHJpdmUgPSBmbG9wcHkgLSB1bml0OwogCXR5cGUgPSBmbG9wcHktPnR5cGU7CiAJCiAJaWYgKCFVRC5jb25uZWN0ZWQpIHsKIAkJLyogZHJpdmUgbm90IGNvbm5lY3RlZCAqLwogCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gRGV2aWNlOiBmZCVkXG4iLCBkcml2ZSApOwotCQllbmRfcmVxdWVzdChDVVJSRU5ULCAwKTsKKwkJZmRfZW5kX3JlcXVlc3RfY3VyKC1FSU8pOwogCQlnb3RvIHJlcGVhdDsKIAl9CiAJCQpAQCAtMTQzMCwxMiArMTQzMiwxMiBAQAogCQkvKiB1c2VyIHN1cHBsaWVkIGRpc2sgdHlwZSAqLwogCQlpZiAoLS10eXBlID49IE5VTV9ESVNLX01JTk9SUykgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZmQlZDogaW52YWxpZCBkaXNrIGZvcm1hdCIsIGRyaXZlICk7Ci0JCQllbmRfcmVxdWVzdChDVVJSRU5ULCAwKTsKKwkJCWZkX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKIAkJCWdvdG8gcmVwZWF0OwogCQl9CiAJCWlmIChtaW5vcjJkaXNrdHlwZVt0eXBlXS5kcml2ZV90eXBlcyA+IERyaXZlVHlwZSkgIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImZkJWQ6IHVuc3VwcG9ydGVkIGRpc2sgZm9ybWF0IiwgZHJpdmUgKTsKLQkJCWVuZF9yZXF1ZXN0KENVUlJFTlQsIDApOworCQkJZmRfZW5kX3JlcXVlc3RfY3VyKC1FSU8pOwogCQkJZ290byByZXBlYXQ7CiAJCX0KIAkJdHlwZSA9IG1pbm9yMmRpc2t0eXBlW3R5cGVdLmluZGV4OwpAQCAtMTQ0NCw4ICsxNDQ2LDggQEAKIAkJVUQuYXV0b3Byb2JlID0gMDsKIAl9CiAJCi0JaWYgKENVUlJFTlQtPnNlY3RvciArIDEgPiBVRFQtPmJsb2NrcykgewotCQllbmRfcmVxdWVzdChDVVJSRU5ULCAwKTsKKwlpZiAoYmxrX3JxX3BvcyhmZF9yZXF1ZXN0KSArIDEgPiBVRFQtPmJsb2NrcykgeworCQlmZF9lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CiAJCWdvdG8gcmVwZWF0OwogCX0KIApAQCAtMTQ1Myw5ICsxNDU1LDkgQEAKIAlkZWxfdGltZXIoICZtb3Rvcl9vZmZfdGltZXIgKTsKIAkJCiAJUmVxQ250ID0gMDsKLQlSZXFDbWQgPSBycV9kYXRhX2RpcihDVVJSRU5UKTsKLQlSZXFCbG9jayA9IENVUlJFTlQtPnNlY3RvcjsKLQlSZXFCdWZmZXIgPSBDVVJSRU5ULT5idWZmZXI7CisJUmVxQ21kID0gcnFfZGF0YV9kaXIoZmRfcmVxdWVzdCk7CisJUmVxQmxvY2sgPSBibGtfcnFfcG9zKGZkX3JlcXVlc3QpOworCVJlcUJ1ZmZlciA9IGZkX3JlcXVlc3QtPmJ1ZmZlcjsKIAlzZXR1cF9yZXFfcGFyYW1zKCBkcml2ZSApOwogCWRvX2ZkX2FjdGlvbiggZHJpdmUgKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9icmQuYyBiL2RyaXZlcnMvYmxvY2svYnJkLmMKaW5kZXggNWY3ZTY0Yi4uNGJmODcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9icmQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2JyZC5jCkBAIC00MDcsMTIgKzQwNyw3IEBACiAJcmRfc2l6ZSA9IHNpbXBsZV9zdHJ0b2woc3RyLCBOVUxMLCAwKTsKIAlyZXR1cm4gMTsKIH0KLXN0YXRpYyBpbnQgX19pbml0IHJhbWRpc2tfc2l6ZTIoY2hhciAqc3RyKQotewotCXJldHVybiByYW1kaXNrX3NpemUoc3RyKTsKLX0KLV9fc2V0dXAoInJhbWRpc2s9IiwgcmFtZGlza19zaXplKTsKLV9fc2V0dXAoInJhbWRpc2tfc2l6ZT0iLCByYW1kaXNrX3NpemUyKTsKK19fc2V0dXAoInJhbWRpc2tfc2l6ZT0iLCByYW1kaXNrX3NpemUpOwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggNGQ0ZDVlMC4uYjIyY2VjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMTgwLDExICsxODAsMTMgQEAKIAkJCQkJICAgX191MzIpOwogc3RhdGljIHZvaWQgc3RhcnRfaW8oY3Rscl9pbmZvX3QgKmgpOwogc3RhdGljIGludCBzZW5kY21kKF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsCi0JCSAgIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sIHVuc2lnbmVkIGludCBsb2dfdW5pdCwKIAkJICAgX191OCBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgaW50IGNtZF90eXBlKTsKIHN0YXRpYyBpbnQgc2VuZGNtZF93aXRoaXJxKF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsCi0JCQkgICB1bnNpZ25lZCBpbnQgdXNlX3VuaXRfbnVtLCB1bnNpZ25lZCBpbnQgbG9nX3VuaXQsCi0JCQkgICBfX3U4IHBhZ2VfY29kZSwgaW50IGNtZF90eXBlKTsKKwkJCV9fdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcltdLAorCQkJaW50IGNtZF90eXBlKTsKK3N0YXRpYyBpbnQgc2VuZGNtZF93aXRoaXJxX2NvcmUoY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqYywKKwlpbnQgYXR0ZW1wdF9yZXRyeSk7CitzdGF0aWMgaW50IHByb2Nlc3Nfc2VuZGNtZF9lcnJvcihjdGxyX2luZm9fdCAqaCwgQ29tbWFuZExpc3Rfc3RydWN0ICpjKTsKIAogc3RhdGljIHZvaWQgZmFpbF9hbGxfY21kcyh1bnNpZ25lZCBsb25nIGN0bHIpOwogc3RhdGljIGludCBzY2FuX3RocmVhZCh2b2lkICpkYXRhKTsKQEAgLTQzNyw2ICs0MzksMTk0IEBACiB9CiAjZW5kaWYJCQkJLyogQ09ORklHX1BST0NfRlMgKi8KIAorI2RlZmluZSBNQVhfUFJPRFVDVF9OQU1FX0xFTiAxOQorCisjZGVmaW5lIHRvX2hiYShuKSBjb250YWluZXJfb2Yobiwgc3RydWN0IGN0bHJfaW5mbywgZGV2KQorI2RlZmluZSB0b19kcnYobikgY29udGFpbmVyX29mKG4sIGRyaXZlX2luZm9fc3RydWN0LCBkZXYpCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX3R5cGUgY2Npc3NfaG9zdF90eXBlID0geworCS5uYW1lCQk9ICJjY2lzc19ob3N0IiwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRldl9zaG93X3VuaXF1ZV9pZChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9IHRvX2RydihkZXYpOworCXN0cnVjdCBjdGxyX2luZm8gKmggPSB0b19oYmEoZHJ2LT5kZXYucGFyZW50KTsKKwlfX3U4IHNuWzE2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOworCWlmIChoLT5idXN5X2NvbmZpZ3VyaW5nKQorCQlyZXQgPSAtRUJVU1k7CisJZWxzZQorCQltZW1jcHkoc24sIGRydi0+c2VyaWFsX25vLCBzaXplb2Yoc24pKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJZWxzZQorCQlyZXR1cm4gc25wcmludGYoYnVmLCAxNiAqIDIgKyAyLAorCQkJCSIlMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCIKKwkJCQkiJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlhcbiIsCisJCQkJc25bMF0sIHNuWzFdLCBzblsyXSwgc25bM10sCisJCQkJc25bNF0sIHNuWzVdLCBzbls2XSwgc25bN10sCisJCQkJc25bOF0sIHNuWzldLCBzblsxMF0sIHNuWzExXSwKKwkJCQlzblsxMl0sIHNuWzEzXSwgc25bMTRdLCBzblsxNV0pOworfQorREVWSUNFX0FUVFIodW5pcXVlX2lkLCBTX0lSVUdPLCBkZXZfc2hvd191bmlxdWVfaWQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBkZXZfc2hvd192ZW5kb3Ioc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2ID0gdG9fZHJ2KGRldik7CisJc3RydWN0IGN0bHJfaW5mbyAqaCA9IHRvX2hiYShkcnYtPmRldi5wYXJlbnQpOworCWNoYXIgdmVuZG9yW1ZFTkRPUl9MRU4gKyAxXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOworCWlmIChoLT5idXN5X2NvbmZpZ3VyaW5nKQorCQlyZXQgPSAtRUJVU1k7CisJZWxzZQorCQltZW1jcHkodmVuZG9yLCBkcnYtPnZlbmRvciwgVkVORE9SX0xFTiArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiBzbnByaW50ZihidWYsIHNpemVvZih2ZW5kb3IpICsgMSwgIiVzXG4iLCBkcnYtPnZlbmRvcik7Cit9CitERVZJQ0VfQVRUUih2ZW5kb3IsIFNfSVJVR08sIGRldl9zaG93X3ZlbmRvciwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90IGRldl9zaG93X21vZGVsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY2hhciAqYnVmKQoreworCWRyaXZlX2luZm9fc3RydWN0ICpkcnYgPSB0b19kcnYoZGV2KTsKKwlzdHJ1Y3QgY3Rscl9pbmZvICpoID0gdG9faGJhKGRydi0+ZGV2LnBhcmVudCk7CisJY2hhciBtb2RlbFtNT0RFTF9MRU4gKyAxXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOworCWlmIChoLT5idXN5X2NvbmZpZ3VyaW5nKQorCQlyZXQgPSAtRUJVU1k7CisJZWxzZQorCQltZW1jcHkobW9kZWwsIGRydi0+bW9kZWwsIE1PREVMX0xFTiArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwllbHNlCisJCXJldHVybiBzbnByaW50ZihidWYsIHNpemVvZihtb2RlbCkgKyAxLCAiJXNcbiIsIGRydi0+bW9kZWwpOworfQorREVWSUNFX0FUVFIobW9kZWwsIFNfSVJVR08sIGRldl9zaG93X21vZGVsLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QgZGV2X3Nob3dfcmV2KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjaGFyICpidWYpCit7CisJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9IHRvX2RydihkZXYpOworCXN0cnVjdCBjdGxyX2luZm8gKmggPSB0b19oYmEoZHJ2LT5kZXYucGFyZW50KTsKKwljaGFyIHJldltSRVZfTEVOICsgMV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKKwlpZiAoaC0+YnVzeV9jb25maWd1cmluZykKKwkJcmV0ID0gLUVCVVNZOworCWVsc2UKKwkJbWVtY3B5KHJldiwgZHJ2LT5yZXYsIFJFVl9MRU4gKyAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJZWxzZQorCQlyZXR1cm4gc25wcmludGYoYnVmLCBzaXplb2YocmV2KSArIDEsICIlc1xuIiwgZHJ2LT5yZXYpOworfQorREVWSUNFX0FUVFIocmV2LCBTX0lSVUdPLCBkZXZfc2hvd19yZXYsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2Npc3NfZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3VuaXF1ZV9pZC5hdHRyLAorCSZkZXZfYXR0cl9tb2RlbC5hdHRyLAorCSZkZXZfYXR0cl92ZW5kb3IuYXR0ciwKKwkmZGV2X2F0dHJfcmV2LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY2Npc3NfZGV2X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gY2Npc3NfZGV2X2F0dHJzLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmNjaXNzX2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZjY2lzc19kZXZfYXR0cl9ncm91cCwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIGNjaXNzX2Rldl90eXBlID0geworCS5uYW1lCQk9ICJjY2lzc19kZXZpY2UiLAorCS5ncm91cHMJCT0gY2Npc3NfZGV2X2F0dHJfZ3JvdXBzLAorfTsKKworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBjY2lzc19idXNfdHlwZSA9IHsKKwkubmFtZQkJPSAiY2Npc3MiLAorfTsKKworCisvKgorICogSW5pdGlhbGl6ZSBzeXNmcyBlbnRyeSBmb3IgZWFjaCBjb250cm9sbGVyLiAgVGhpcyBzZXRzIHVwIGFuZCByZWdpc3RlcnMKKyAqIHRoZSAnY2Npc3MjJyBkaXJlY3RvcnkgZm9yIGVhY2ggaW5kaXZpZHVhbCBjb250cm9sbGVyIHVuZGVyCisgKiAvc3lzL2J1cy9wY2kvZGV2aWNlcy88ZGV2Pi8uCisgKi8KK3N0YXRpYyBpbnQgY2Npc3NfY3JlYXRlX2hiYV9zeXNmc19lbnRyeShzdHJ1Y3QgY3Rscl9pbmZvICpoKQoreworCWRldmljZV9pbml0aWFsaXplKCZoLT5kZXYpOworCWgtPmRldi50eXBlID0gJmNjaXNzX2hvc3RfdHlwZTsKKwloLT5kZXYuYnVzID0gJmNjaXNzX2J1c190eXBlOworCWRldl9zZXRfbmFtZSgmaC0+ZGV2LCAiJXMiLCBoLT5kZXZuYW1lKTsKKwloLT5kZXYucGFyZW50ID0gJmgtPnBkZXYtPmRldjsKKworCXJldHVybiBkZXZpY2VfYWRkKCZoLT5kZXYpOworfQorCisvKgorICogUmVtb3ZlIHN5c2ZzIGVudHJpZXMgZm9yIGFuIGhiYS4KKyAqLworc3RhdGljIHZvaWQgY2Npc3NfZGVzdHJveV9oYmFfc3lzZnNfZW50cnkoc3RydWN0IGN0bHJfaW5mbyAqaCkKK3sKKwlkZXZpY2VfZGVsKCZoLT5kZXYpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBzeXNmcyBmb3IgZWFjaCBsb2dpY2FsIGRyaXZlLiAgVGhpcyBzZXRzIHVwIGFuZCByZWdpc3RlcnMKKyAqIHRoZSAnYyNkIycgZGlyZWN0b3J5IGZvciBlYWNoIGluZGl2aWR1YWwgbG9naWNhbCBkcml2ZSB1bmRlcgorICogL3N5cy9idXMvcGNpL2RldmljZXMvPGRldi9jY2lzIy8uIFdlIGFsc28gY3JlYXRlIGEgbGluayBmcm9tCisgKiAvc3lzL2Jsb2NrL2NjaXNzIWMjZCMgdG8gdGhpcyBlbnRyeS4KKyAqLworc3RhdGljIGludCBjY2lzc19jcmVhdGVfbGRfc3lzZnNfZW50cnkoc3RydWN0IGN0bHJfaW5mbyAqaCwKKwkJCQkgICAgICAgZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiwKKwkJCQkgICAgICAgaW50IGRydl9pbmRleCkKK3sKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmZHJ2LT5kZXYpOworCWRydi0+ZGV2LnR5cGUgPSAmY2Npc3NfZGV2X3R5cGU7CisJZHJ2LT5kZXYuYnVzID0gJmNjaXNzX2J1c190eXBlOworCWRldl9zZXRfbmFtZSgmZHJ2LT5kZXYsICJjJWRkJWQiLCBoLT5jdGxyLCBkcnZfaW5kZXgpOworCWRydi0+ZGV2LnBhcmVudCA9ICZoLT5kZXY7CisJcmV0dXJuIGRldmljZV9hZGQoJmRydi0+ZGV2KTsKK30KKworLyoKKyAqIFJlbW92ZSBzeXNmcyBlbnRyaWVzIGZvciBhIGxvZ2ljYWwgZHJpdmUuCisgKi8KK3N0YXRpYyB2b2lkIGNjaXNzX2Rlc3Ryb3lfbGRfc3lzZnNfZW50cnkoZHJpdmVfaW5mb19zdHJ1Y3QgKmRydikKK3sKKwlkZXZpY2VfZGVsKCZkcnYtPmRldik7Cit9CisKIC8qCiAgKiBGb3Igb3BlcmF0aW9ucyB0aGF0IGNhbm5vdCBzbGVlcCwgYSBjb21tYW5kIGJsb2NrIGlzIGFsbG9jYXRlZCBhdCBpbml0LAogICogYW5kIG1hbmFnZWQgYnkgY21kX2FsbG9jKCkgYW5kIGNtZF9mcmVlKCkgdXNpbmcgYSBzaW1wbGUgYml0bWFwIHRvIHRyYWNrCkBAIC0xMjk5LDcgKzE0ODksNiBAQAogewogCUNvbW1hbmRMaXN0X3N0cnVjdCAqY21kID0gcnEtPmNvbXBsZXRpb25fZGF0YTsKIAljdGxyX2luZm9fdCAqaCA9IGhiYVtjbWQtPmN0bHJdOwotCXVuc2lnbmVkIGludCBucl9ieXRlczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU2NGJpdCB0ZW1wNjQ7CiAJaW50IGksIGRkaXI7CkBAIC0xMzIxLDE1ICsxNTEwLDExIEBACiAJcHJpbnRrKCJEb25lIHdpdGggJXBcbiIsIHJxKTsKICNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCi0JLyoKLQkgKiBTdG9yZSB0aGUgZnVsbCBzaXplIGFuZCBzZXQgdGhlIHJlc2lkdWFsIGNvdW50IGZvciBwYyByZXF1ZXN0cwotCSAqLwotCW5yX2J5dGVzID0gYmxrX3JxX2J5dGVzKHJxKTsKKwkvKiBzZXQgdGhlIHJlc2lkdWFsIGNvdW50IGZvciBwYyByZXF1ZXN0cyAqLwogCWlmIChibGtfcGNfcmVxdWVzdChycSkpCi0JCXJxLT5kYXRhX2xlbiA9IGNtZC0+ZXJyX2luZm8tPlJlc2lkdWFsQ250OworCQlycS0+cmVzaWRfbGVuID0gY21kLT5lcnJfaW5mby0+UmVzaWR1YWxDbnQ7CiAKLQlpZiAoYmxrX2VuZF9yZXF1ZXN0KHJxLCAocnEtPmVycm9ycyA9PSAwKSA/IDAgOiAtRUlPLCBucl9ieXRlcykpCi0JCUJVRygpOworCWJsa19lbmRfcmVxdWVzdF9hbGwocnEsIChycS0+ZXJyb3JzID09IDApID8gMCA6IC1FSU8pOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmgtPmxvY2ssIGZsYWdzKTsKIAljbWRfZnJlZShoLCBjbWQsIDEpOwpAQCAtMTMzNyw2ICsxNTIyLDU2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaC0+bG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBsb2dfdW5pdF90b19zY3NpM2FkZHIoY3Rscl9pbmZvX3QgKmgsIHVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyW10sCisJdWludDMyX3QgbG9nX3VuaXQpCit7CisJbG9nX3VuaXQgPSBoLT5kcnZbbG9nX3VuaXRdLkx1bklEICYgMHgwM2ZmZjsKKwltZW1zZXQoJnNjc2kzYWRkcls0XSwgMCwgNCk7CisJbWVtY3B5KCZzY3NpM2FkZHJbMF0sICZsb2dfdW5pdCwgNCk7CisJc2NzaTNhZGRyWzNdIHw9IDB4NDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgU0NTSSB2ZW5kb3IsIG1vZGVsLCBhbmQgcmV2aXNpb24gb2YgYSBsb2dpY2FsIGRyaXZlCisgKiB2aWEgdGhlIGlucXVpcnkgcGFnZSAwLiAgTW9kZWwsIHZlbmRvciwgYW5kIHJldiBhcmUgc2V0IHRvIGVtcHR5IHN0cmluZ3MgaWYKKyAqIHRoZXkgY2Fubm90IGJlIHJlYWQuCisgKi8KK3N0YXRpYyB2b2lkIGNjaXNzX2dldF9kZXZpY2VfZGVzY3IoaW50IGN0bHIsIGludCBsb2d2b2wsIGludCB3aXRoaXJxLAorCQkJCSAgIGNoYXIgKnZlbmRvciwgY2hhciAqbW9kZWwsIGNoYXIgKnJldikKK3sKKwlpbnQgcmM7CisJSW5xdWlyeURhdGFfc3RydWN0ICppbnFfYnVmOworCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyWzhdOworCisJKnZlbmRvciA9ICdcMCc7CisJKm1vZGVsID0gJ1wwJzsKKwkqcmV2ID0gJ1wwJzsKKworCWlucV9idWYgPSBremFsbG9jKHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlucV9idWYpCisJCXJldHVybjsKKworCWxvZ191bml0X3RvX3Njc2kzYWRkcihoYmFbY3Rscl0sIHNjc2kzYWRkciwgbG9ndm9sKTsKKwlpZiAod2l0aGlycSkKKwkJcmMgPSBzZW5kY21kX3dpdGhpcnEoQ0lTU19JTlFVSVJZLCBjdGxyLCBpbnFfYnVmLAorCQkJICAgICBzaXplb2YoSW5xdWlyeURhdGFfc3RydWN0KSwgMCwKKwkJCQlzY3NpM2FkZHIsIFRZUEVfQ01EKTsKKwllbHNlCisJCXJjID0gc2VuZGNtZChDSVNTX0lOUVVJUlksIGN0bHIsIGlucV9idWYsCisJCQkgICAgIHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCAwLAorCQkJCXNjc2kzYWRkciwgVFlQRV9DTUQpOworCWlmIChyYyA9PSBJT19PSykgeworCQltZW1jcHkodmVuZG9yLCAmaW5xX2J1Zi0+ZGF0YV9ieXRlWzhdLCBWRU5ET1JfTEVOKTsKKwkJdmVuZG9yW1ZFTkRPUl9MRU5dID0gJ1wwJzsKKwkJbWVtY3B5KG1vZGVsLCAmaW5xX2J1Zi0+ZGF0YV9ieXRlWzE2XSwgTU9ERUxfTEVOKTsKKwkJbW9kZWxbTU9ERUxfTEVOXSA9ICdcMCc7CisJCW1lbWNweShyZXYsICZpbnFfYnVmLT5kYXRhX2J5dGVbMzJdLCBSRVZfTEVOKTsKKwkJcmV2W1JFVl9MRU5dID0gJ1wwJzsKKwl9CisKKwlrZnJlZShpbnFfYnVmKTsKKwlyZXR1cm47Cit9CisKIC8qIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgc2VyaWFsIG51bWJlciBvZiBhIGxvZ2ljYWwgZHJpdmUgdmlhCiAgKiBpbnF1aXJ5IHBhZ2UgMHg4My4gIFNlcmlhbCBuby4gaXMgMTYgYnl0ZXMuICBJZiB0aGUgc2VyaWFsCiAgKiBudW1iZXIgY2Fubm90IGJlIGhhZCwgZm9yIHdoYXRldmVyIHJlYXNvbiwgMTYgYnl0ZXMgb2YgMHhmZgpAQCAtMTM0OCw2ICsxNTgzLDcgQEAKICNkZWZpbmUgUEFHRV84M19JTlFfQllURVMgNjQKIAlpbnQgcmM7CiAJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyWzhdOwogCiAJaWYgKGJ1ZmxlbiA+IDE2KQogCQlidWZsZW4gPSAxNjsKQEAgLTEzNTYsMTIgKzE1OTIsMTMgQEAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuOwogCW1lbXNldChzZXJpYWxfbm8sIDAsIGJ1Zmxlbik7CisJbG9nX3VuaXRfdG9fc2NzaTNhZGRyKGhiYVtjdGxyXSwgc2NzaTNhZGRyLCBsb2d2b2wpOwogCWlmICh3aXRoaXJxKQogCQlyYyA9IHNlbmRjbWRfd2l0aGlycShDSVNTX0lOUVVJUlksIGN0bHIsIGJ1ZiwKLQkJCVBBR0VfODNfSU5RX0JZVEVTLCAxLCBsb2d2b2wsIDB4ODMsIFRZUEVfQ01EKTsKKwkJCVBBR0VfODNfSU5RX0JZVEVTLCAweDgzLCBzY3NpM2FkZHIsIFRZUEVfQ01EKTsKIAllbHNlCiAJCXJjID0gc2VuZGNtZChDSVNTX0lOUVVJUlksIGN0bHIsIGJ1ZiwKLQkJCVBBR0VfODNfSU5RX0JZVEVTLCAxLCBsb2d2b2wsIDB4ODMsIE5VTEwsIFRZUEVfQ01EKTsKKwkJCVBBR0VfODNfSU5RX0JZVEVTLCAweDgzLCBzY3NpM2FkZHIsIFRZUEVfQ01EKTsKIAlpZiAocmMgPT0gSU9fT0spCiAJCW1lbWNweShzZXJpYWxfbm8sICZidWZbOF0sIGJ1Zmxlbik7CiAJa2ZyZWUoYnVmKTsKQEAgLTEzNzcsNyArMTYxNCw3IEBACiAJZGlzay0+Zmlyc3RfbWlub3IgPSBkcnZfaW5kZXggPDwgTldEX1NISUZUOwogCWRpc2stPmZvcHMgPSAmY2Npc3NfZm9wczsKIAlkaXNrLT5wcml2YXRlX2RhdGEgPSAmaC0+ZHJ2W2Rydl9pbmRleF07Ci0JZGlzay0+ZHJpdmVyZnNfZGV2ID0gJmgtPnBkZXYtPmRldjsKKwlkaXNrLT5kcml2ZXJmc19kZXYgPSAmaC0+ZHJ2W2Rydl9pbmRleF0uZGV2OwogCiAJLyogU2V0IHVwIHF1ZXVlIGluZm9ybWF0aW9uICovCiAJYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChkaXNrLT5xdWV1ZSwgaC0+cGRldi0+ZG1hX21hc2spOwpAQCAtMTM5NCw4ICsxNjMxLDggQEAKIAogCWRpc2stPnF1ZXVlLT5xdWV1ZWRhdGEgPSBoOwogCi0JYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZGlzay0+cXVldWUsCi0JCQkJaC0+ZHJ2W2Rydl9pbmRleF0uYmxvY2tfc2l6ZSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShkaXNrLT5xdWV1ZSwKKwkJCQkgICAgIGgtPmRydltkcnZfaW5kZXhdLmJsb2NrX3NpemUpOwogCiAJLyogTWFrZSBzdXJlIGFsbCBxdWV1ZSBkYXRhIGlzIHdyaXR0ZW4gb3V0IGJlZm9yZSAqLwogCS8qIHNldHRpbmcgaC0+ZHJ2W2Rydl9pbmRleF0ucXVldWUsIGFzIHNldHRpbmcgdGhpcyAqLwpAQCAtMTQ2OCw2ICsxNzA1LDggQEAKIAlkcnZpbmZvLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKIAlkcnZpbmZvLT5ucl9ibG9ja3MgPSB0b3RhbF9zaXplICsgMTsKIAorCWNjaXNzX2dldF9kZXZpY2VfZGVzY3IoY3RsciwgZHJ2X2luZGV4LCAxLCBkcnZpbmZvLT52ZW5kb3IsCisJCQkJZHJ2aW5mby0+bW9kZWwsIGRydmluZm8tPnJldik7CiAJY2Npc3NfZ2V0X3NlcmlhbF9ubyhjdGxyLCBkcnZfaW5kZXgsIDEsIGRydmluZm8tPnNlcmlhbF9ubywKIAkJCXNpemVvZihkcnZpbmZvLT5zZXJpYWxfbm8pKTsKIApAQCAtMTUxNyw2ICsxNzU2LDkgQEAKIAloLT5kcnZbZHJ2X2luZGV4XS5jeWxpbmRlcnMgPSBkcnZpbmZvLT5jeWxpbmRlcnM7CiAJaC0+ZHJ2W2Rydl9pbmRleF0ucmFpZF9sZXZlbCA9IGRydmluZm8tPnJhaWRfbGV2ZWw7CiAJbWVtY3B5KGgtPmRydltkcnZfaW5kZXhdLnNlcmlhbF9ubywgZHJ2aW5mby0+c2VyaWFsX25vLCAxNik7CisJbWVtY3B5KGgtPmRydltkcnZfaW5kZXhdLnZlbmRvciwgZHJ2aW5mby0+dmVuZG9yLCBWRU5ET1JfTEVOICsgMSk7CisJbWVtY3B5KGgtPmRydltkcnZfaW5kZXhdLm1vZGVsLCBkcnZpbmZvLT5tb2RlbCwgTU9ERUxfTEVOICsgMSk7CisJbWVtY3B5KGgtPmRydltkcnZfaW5kZXhdLnJldiwgZHJ2aW5mby0+cmV2LCBSRVZfTEVOICsgMSk7CiAKIAkrK2gtPm51bV9sdW5zOwogCWRpc2sgPSBoLT5nZW5kaXNrW2Rydl9pbmRleF07CkBAIC0xNTkxLDYgKzE4MzMsOCBAQAogCQl9CiAJfQogCWgtPmRydltkcnZfaW5kZXhdLkx1bklEID0gbHVuaWQ7CisJaWYgKGNjaXNzX2NyZWF0ZV9sZF9zeXNmc19lbnRyeShoLCAmaC0+ZHJ2W2Rydl9pbmRleF0sIGRydl9pbmRleCkpCisJCWdvdG8gZXJyX2ZyZWVfZGlzazsKIAogCS8qIERvbid0IG5lZWQgdG8gbWFyayB0aGlzIGJ1c3kgYmVjYXVzZSBub2JvZHkgKi8KIAkvKiBlbHNlIGtub3dzIGFib3V0IHRoaXMgZGlzayB5ZXQgdG8gY29udGVuZCAqLwpAQCAtMTU5OCw2ICsxODQyLDExIEBACiAJaC0+ZHJ2W2Rydl9pbmRleF0uYnVzeV9jb25maWd1cmluZyA9IDA7CiAJd21iKCk7CiAJcmV0dXJuIGRydl9pbmRleDsKKworZXJyX2ZyZWVfZGlzazoKKwlwdXRfZGlzayhoLT5nZW5kaXNrW2Rydl9pbmRleF0pOworCWgtPmdlbmRpc2tbZHJ2X2luZGV4XSA9IE5VTEw7CisJcmV0dXJuIC0xOwogfQogCiAvKiBUaGlzIGlzIGZvciB0aGUgc3BlY2lhbCBjYXNlIG9mIGEgY29udHJvbGxlciB3aGljaApAQCAtMTY2OCw4ICsxOTE3LDggQEAKIAkJZ290byBtZW1fbXNnOwogCiAJcmV0dXJuX2NvZGUgPSBzZW5kY21kX3dpdGhpcnEoQ0lTU19SRVBPUlRfTE9HLCBjdGxyLCBsZF9idWZmLAotCQkJCSAgICAgIHNpemVvZihSZXBvcnRMdW5EYXRhX3N0cnVjdCksIDAsCi0JCQkJICAgICAgMCwgMCwgVFlQRV9DTUQpOworCQkJCSAgICAgIHNpemVvZihSZXBvcnRMdW5EYXRhX3N0cnVjdCksCisJCQkJICAgICAgMCwgQ1RMUl9MVU5JRCwgVFlQRV9DTUQpOwogCiAJaWYgKHJldHVybl9jb2RlID09IElPX09LKQogCQlsaXN0bGVuZ3RoID0gYmUzMl90b19jcHUoKihfX2JlMzIgKikgbGRfYnVmZi0+TFVOTGlzdExlbmd0aCk7CkBAIC0xNzE4LDYgKzE5NjcsNyBAQAogCQkJaC0+ZHJ2W2ldLmJ1c3lfY29uZmlndXJpbmcgPSAxOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CiAJCQlyZXR1cm5fY29kZSA9IGRlcmVnaXN0ZXJfZGlzayhoLCBpLCAxKTsKKwkJCWNjaXNzX2Rlc3Ryb3lfbGRfc3lzZnNfZW50cnkoJmgtPmRydltpXSk7CiAJCQloLT5kcnZbaV0uYnVzeV9jb25maWd1cmluZyA9IDA7CiAJCX0KIAl9CkBAIC0xODc3LDExICsyMTI3LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaWxsX2NtZChDb21tYW5kTGlzdF9zdHJ1Y3QgKmMsIF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sCS8qIDA6IGFkZHJlc3MgdGhlIGNvbnRyb2xsZXIsCi0JCQkJCQkJCQkJCQkJCQkgICAxOiBhZGRyZXNzIGxvZ2ljYWwgdm9sdW1lIGxvZ191bml0LAotCQkJCQkJCQkJCQkJCQkJICAgMjogcGVyaXBoIGRldmljZSBhZGRyZXNzIGlzIHNjc2kzYWRkciAqLwotCQkgICAgdW5zaWduZWQgaW50IGxvZ191bml0LCBfX3U4IHBhZ2VfY29kZSwKLQkJICAgIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgaW50IGNtZF90eXBlKQorc3RhdGljIGludCBmaWxsX2NtZChDb21tYW5kTGlzdF9zdHJ1Y3QgKmMsIF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwKKwkJc2l6ZV90IHNpemUsIF9fdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCisJCWludCBjbWRfdHlwZSkKIHsKIAljdGxyX2luZm9fdCAqaCA9IGhiYVtjdGxyXTsKIAl1NjRiaXQgYnVmZl9kbWFfaGFuZGxlOwpAQCAtMTg5NywyNyArMjE0NSwxMiBAQAogCQljLT5IZWFkZXIuU0dUb3RhbCA9IDA7CiAJfQogCWMtPkhlYWRlci5UYWcubG93ZXIgPSBjLT5idXNhZGRyOworCW1lbWNweShjLT5IZWFkZXIuTFVOLkx1bkFkZHJCeXRlcywgc2NzaTNhZGRyLCA4KTsKIAogCWMtPlJlcXVlc3QuVHlwZS5UeXBlID0gY21kX3R5cGU7CiAJaWYgKGNtZF90eXBlID09IFRZUEVfQ01EKSB7CiAJCXN3aXRjaCAoY21kKSB7CiAJCWNhc2UgQ0lTU19JTlFVSVJZOgotCQkJLyogSWYgdGhlIGxvZ2ljYWwgdW5pdCBudW1iZXIgaXMgMCB0aGVuLCB0aGlzIGlzIGdvaW5nCi0JCQkgICB0byBjb250cm9sbGVyIHNvIEl0J3MgYSBwaHlzaWNhbCBjb21tYW5kCi0JCQkgICBtb2RlID0gMCB0YXJnZXQgPSAwLiAgU28gd2UgaGF2ZSBub3RoaW5nIHRvIHdyaXRlLgotCQkJICAgb3RoZXJ3aXNlLCBpZiB1c2VfdW5pdF9udW0gPT0gMSwKLQkJCSAgIG1vZGUgPSAxKHZvbHVtZSBzZXQgYWRkcmVzc2luZykgdGFyZ2V0ID0gTFVOSUQKLQkJCSAgIG90aGVyd2lzZSwgaWYgdXNlX3VuaXRfbnVtID09IDIsCi0JCQkgICBtb2RlID0gMChwZXJpcGggZGV2IGFkZHIpIHRhcmdldCA9IHNjc2kzYWRkciAqLwotCQkJaWYgKHVzZV91bml0X251bSA9PSAxKSB7Ci0JCQkJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuVm9sSWQgPQotCQkJCSAgICBoLT5kcnZbbG9nX3VuaXRdLkx1bklEOwotCQkJCWMtPkhlYWRlci5MVU4uTG9nRGV2Lk1vZGUgPSAxOwotCQkJfSBlbHNlIGlmICh1c2VfdW5pdF9udW0gPT0gMikgewotCQkJCW1lbWNweShjLT5IZWFkZXIuTFVOLkx1bkFkZHJCeXRlcywgc2NzaTNhZGRyLAotCQkJCSAgICAgICA4KTsKLQkJCQljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Nb2RlID0gMDsKLQkJCX0KIAkJCS8qIGFyZSB3ZSB0cnlpbmcgdG8gcmVhZCBhIHZpdGFsIHByb2R1Y3QgcGFnZSAqLwogCQkJaWYgKHBhZ2VfY29kZSAhPSAwKSB7CiAJCQkJYy0+UmVxdWVzdC5DREJbMV0gPSAweDAxOwpAQCAtMTk0Nyw4ICsyMTgwLDYgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgQ0NJU1NfUkVBRF9DQVBBQ0lUWToKLQkJCWMtPkhlYWRlci5MVU4uTG9nRGV2LlZvbElkID0gaC0+ZHJ2W2xvZ191bml0XS5MdW5JRDsKLQkJCWMtPkhlYWRlci5MVU4uTG9nRGV2Lk1vZGUgPSAxOwogCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxMDsKIAkJCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKIAkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX1JFQUQ7CkBAIC0xOTU2LDggKzIxODcsNiBAQAogCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBjbWQ7CiAJCQlicmVhazsKIAkJY2FzZSBDQ0lTU19SRUFEX0NBUEFDSVRZXzE2OgotCQkJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuVm9sSWQgPSBoLT5kcnZbbG9nX3VuaXRdLkx1bklEOwotCQkJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuTW9kZSA9IDE7CiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDE2OwogCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOwogCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKQEAgLTE5NzksNiArMjIwOCwxMiBAQAogCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBCTUlDX1dSSVRFOwogCQkJYy0+UmVxdWVzdC5DREJbNl0gPSBCTUlDX0NBQ0hFX0ZMVVNIOwogCQkJYnJlYWs7CisJCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQkJYy0+UmVxdWVzdC5DREJMZW4gPSA2OworCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOworCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfTk9ORTsKKwkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJCSAgICAgICAiY2Npc3MlZDogIFVua25vd24gQ29tbWFuZCAweCVjXG4iLCBjdGxyLCBjbWQpOwpAQCAtMTk5NywxMyArMjIzMiwxMyBAQAogCQkJbWVtY3B5KCZjLT5SZXF1ZXN0LkNEQls0XSwgYnVmZiwgOCk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgkvKiBSRVNFVCBtZXNzYWdlICovCi0JCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDEyOworCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxNjsKIAkJCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKLQkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX1dSSVRFOworCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfTk9ORTsKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CiAJCQltZW1zZXQoJmMtPlJlcXVlc3QuQ0RCWzBdLCAwLCBzaXplb2YoYy0+UmVxdWVzdC5DREIpKTsKIAkJCWMtPlJlcXVlc3QuQ0RCWzBdID0gY21kOwkvKiByZXNldCAqLwotCQkJYy0+UmVxdWVzdC5DREJbMV0gPSAweDA0OwkvKiByZXNldCBhIExVTiAqLworCQkJYy0+UmVxdWVzdC5DREJbMV0gPSAweDAzOwkvKiByZXNldCBhIHRhcmdldCAqLwogCQkJYnJlYWs7CiAJCWNhc2UgMzoJLyogTm8tT3AgbWVzc2FnZSAqLwogCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxOwpAQCAtMjAzNSwxMTQgKzIyNzAsMTUyIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBzZW5kY21kX3dpdGhpcnEoX191OCBjbWQsCi0JCQkgICBpbnQgY3RsciwKLQkJCSAgIHZvaWQgKmJ1ZmYsCi0JCQkgICBzaXplX3Qgc2l6ZSwKLQkJCSAgIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sCi0JCQkgICB1bnNpZ25lZCBpbnQgbG9nX3VuaXQsIF9fdTggcGFnZV9jb2RlLCBpbnQgY21kX3R5cGUpCitzdGF0aWMgaW50IGNoZWNrX3RhcmdldF9zdGF0dXMoY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKIHsKLQljdGxyX2luZm9fdCAqaCA9IGhiYVtjdGxyXTsKLQlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7CisJc3dpdGNoIChjLT5lcnJfaW5mby0+U2NzaVN0YXR1cykgeworCWNhc2UgU0FNX1NUQVRfR09PRDoKKwkJcmV0dXJuIElPX09LOworCWNhc2UgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOgorCQlzd2l0Y2ggKDB4ZiAmIGMtPmVycl9pbmZvLT5TZW5zZUluZm9bMl0pIHsKKwkJY2FzZSAwOiByZXR1cm4gSU9fT0s7IC8qIG5vIHNlbnNlICovCisJCWNhc2UgMTogcmV0dXJuIElPX09LOyAvKiByZWNvdmVyZWQgZXJyb3IgKi8KKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IGNtZCAweCUwMnggIgorCQkJCSJjaGVjayBjb25kaXRpb24sIHNlbnNlIGtleSA9IDB4JTAyeFxuIiwKKwkJCQloLT5jdGxyLCBjLT5SZXF1ZXN0LkNEQlswXSwKKwkJCQljLT5lcnJfaW5mby0+U2Vuc2VJbmZvWzJdKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiBjbWQgMHglMDJ4IgorCQkJInNjc2kgc3RhdHVzID0gMHglMDJ4XG4iLCBoLT5jdGxyLAorCQkJYy0+UmVxdWVzdC5DREJbMF0sIGMtPmVycl9pbmZvLT5TY3NpU3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBJT19FUlJPUjsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3NlbmRjbWRfZXJyb3IoY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKK3sKKwlpbnQgcmV0dXJuX3N0YXR1cyA9IElPX09LOworCisJaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09IENNRF9TVUNDRVNTKQorCQlyZXR1cm4gSU9fT0s7CisKKwlzd2l0Y2ggKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKSB7CisJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKKwkJcmV0dXJuX3N0YXR1cyA9IGNoZWNrX3RhcmdldF9zdGF0dXMoaCwgYyk7CisJCWJyZWFrOworCWNhc2UgQ01EX0RBVEFfVU5ERVJSVU46CisJY2FzZSBDTURfREFUQV9PVkVSUlVOOgorCQkvKiBleHBlY3RlZCBmb3IgaW5xdWlyeSBhbmQgcmVwb3J0IGx1biBjb21tYW5kcyAqLworCQlicmVhazsKKwljYXNlIENNRF9JTlZBTElEOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kIDB4JTAyeCBpcyAiCisJCSAgICAgICAicmVwb3J0ZWQgaW52YWxpZFxuIiwgYy0+UmVxdWVzdC5DREJbMF0pOworCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWJyZWFrOworCWNhc2UgQ01EX1BST1RPQ09MX0VSUjoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAweCUwMnggaGFzICIKKwkJICAgICAgICJwcm90b2NvbCBlcnJvciBcbiIsIGMtPlJlcXVlc3QuQ0RCWzBdKTsKKwkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOworCQlicmVhazsKKwljYXNlIENNRF9IQVJEV0FSRV9FUlI6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgMHglMDJ4IGhhZCAiCisJCSAgICAgICAiIGhhcmR3YXJlIGVycm9yXG4iLCBjLT5SZXF1ZXN0LkNEQlswXSk7CisJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKKwkJYnJlYWs7CisJY2FzZSBDTURfQ09OTkVDVElPTl9MT1NUOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kIDB4JTAyeCBoYWQgIgorCQkgICAgICAgImNvbm5lY3Rpb24gbG9zdFxuIiwgYy0+UmVxdWVzdC5DREJbMF0pOworCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWJyZWFrOworCWNhc2UgQ01EX0FCT1JURUQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgMHglMDJ4IHdhcyAiCisJCSAgICAgICAiYWJvcnRlZFxuIiwgYy0+UmVxdWVzdC5DREJbMF0pOworCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWJyZWFrOworCWNhc2UgQ01EX0FCT1JUX0ZBSUxFRDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAweCUwMnggcmVwb3J0cyAiCisJCSAgICAgICAiYWJvcnQgZmFpbGVkXG4iLCBjLT5SZXF1ZXN0LkNEQlswXSk7CisJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKKwkJYnJlYWs7CisJY2FzZSBDTURfVU5TT0xJQ0lURURfQUJPUlQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJjY2lzcyVkOiB1bnNvbGljaXRlZCBhYm9ydCAweCUwMnhcbiIsIGgtPmN0bHIsCisJCQljLT5SZXF1ZXN0LkNEQlswXSk7CisJCXJldHVybl9zdGF0dXMgPSBJT19ORUVEU19SRVRSWTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAweCUwMnggcmV0dXJuZWQgIgorCQkgICAgICAgInVua25vd24gc3RhdHVzICV4XG4iLCBjLT5SZXF1ZXN0LkNEQlswXSwKKwkJICAgICAgIGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKTsKKwkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOworCX0KKwlyZXR1cm4gcmV0dXJuX3N0YXR1czsKK30KKworc3RhdGljIGludCBzZW5kY21kX3dpdGhpcnFfY29yZShjdGxyX2luZm9fdCAqaCwgQ29tbWFuZExpc3Rfc3RydWN0ICpjLAorCWludCBhdHRlbXB0X3JldHJ5KQoreworCURFQ0xBUkVfQ09NUExFVElPTl9PTlNUQUNLKHdhaXQpOwogCXU2NGJpdCBidWZmX2RtYV9oYW5kbGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0dXJuX3N0YXR1czsKLQlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyh3YWl0KTsKKwlpbnQgcmV0dXJuX3N0YXR1cyA9IElPX09LOwogCi0JaWYgKChjID0gY21kX2FsbG9jKGgsIDApKSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXR1cm5fc3RhdHVzID0gZmlsbF9jbWQoYywgY21kLCBjdGxyLCBidWZmLCBzaXplLCB1c2VfdW5pdF9udW0sCi0JCQkJIGxvZ191bml0LCBwYWdlX2NvZGUsIE5VTEwsIGNtZF90eXBlKTsKLQlpZiAocmV0dXJuX3N0YXR1cyAhPSBJT19PSykgewotCQljbWRfZnJlZShoLCBjLCAwKTsKLQkJcmV0dXJuIHJldHVybl9zdGF0dXM7Ci0JfQotICAgICAgcmVzZW5kX2NtZDI6CityZXNlbmRfY21kMjoKIAljLT53YWl0aW5nID0gJndhaXQ7Ci0KIAkvKiBQdXQgdGhlIHJlcXVlc3Qgb24gdGhlIHRhaWwgb2YgdGhlIHF1ZXVlIGFuZCBzZW5kIGl0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKIAlhZGRRKCZoLT5yZXFRLCBjKTsKIAloLT5RZGVwdGgrKzsKIAlzdGFydF9pbyhoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKIAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCi0JaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzICE9IDApIHsJLyogYW4gZXJyb3IgaGFzIG9jY3VycmVkICovCi0JCXN3aXRjaCAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpIHsKLQkJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFzICIKLQkJCSAgICAgICAiIGNvbXBsZXRlZCB3aXRoIGVycm9yc1xuIiwgYyk7Ci0JCQlpZiAoYy0+ZXJyX2luZm8tPlNjc2lTdGF0dXMpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwICIKLQkJCQkgICAgICAgImhhcyBTQ1NJIFN0YXR1cyA9ICV4XG4iLAotCQkJCSAgICAgICBjLCBjLT5lcnJfaW5mby0+U2NzaVN0YXR1cyk7Ci0JCQl9CisJaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09IDAgfHwgIWF0dGVtcHRfcmV0cnkpCisJCWdvdG8gY29tbWFuZF9kb25lOwogCi0JCQlicmVhazsKLQkJY2FzZSBDTURfREFUQV9VTkRFUlJVTjoKLQkJY2FzZSBDTURfREFUQV9PVkVSUlVOOgotCQkJLyogZXhwZWN0ZWQgZm9yIGlucXVpcmUgYW5kIHJlcG9ydCBsdW4gY29tbWFuZHMgKi8KLQkJCWJyZWFrOwotCQljYXNlIENNRF9JTlZBTElEOgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IENtZCAlcCBpcyAiCi0JCQkgICAgICAgInJlcG9ydGVkIGludmFsaWRcbiIsIGMpOwotCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX1BST1RPQ09MX0VSUjoKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFzICIKLQkJCSAgICAgICAicHJvdG9jb2wgZXJyb3IgXG4iLCBjKTsKLQkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKLQkJCWJyZWFrOwotCQljYXNlIENNRF9IQVJEV0FSRV9FUlI6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhZCAiCi0JCQkgICAgICAgIiBoYXJkd2FyZSBlcnJvclxuIiwgYyk7Ci0JCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7Ci0JCQlicmVhazsKLQkJY2FzZSBDTURfQ09OTkVDVElPTl9MT1NUOgotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYWQgIgotCQkJICAgICAgICJjb25uZWN0aW9uIGxvc3RcbiIsIGMpOwotCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX0FCT1JURUQ6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHdhcyAiCi0JCQkgICAgICAgImFib3J0ZWRcbiIsIGMpOwotCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ01EX0FCT1JUX0ZBSUxFRDoKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmVwb3J0cyAiCi0JCQkgICAgICAgImFib3J0IGZhaWxlZFxuIiwgYyk7Ci0JCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7Ci0JCQlicmVhazsKLQkJY2FzZSBDTURfVU5TT0xJQ0lURURfQUJPUlQ6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgImNjaXNzJWQ6IHVuc29saWNpdGVkIGFib3J0ICVwXG4iLCBjdGxyLCBjKTsKLQkJCWlmIChjLT5yZXRyeV9jb3VudCA8IE1BWF9DTURfUkVUUklFUykgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkgICAgICAgImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLCBjdGxyLCBjKTsKLQkJCQljLT5yZXRyeV9jb3VudCsrOwotCQkJCS8qIGVyYXNlIHRoZSBvbGQgZXJyb3IgaW5mb3JtYXRpb24gKi8KLQkJCQltZW1zZXQoYy0+ZXJyX2luZm8sIDAsCi0JCQkJICAgICAgIHNpemVvZihFcnJvckluZm9fc3RydWN0KSk7Ci0JCQkJcmV0dXJuX3N0YXR1cyA9IElPX09LOwotCQkJCUlOSVRfQ09NUExFVElPTih3YWl0KTsKLQkJCQlnb3RvIHJlc2VuZF9jbWQyOwotCQkJfQotCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHJldHVybmVkICIKLQkJCSAgICAgICAidW5rbm93biBzdGF0dXMgJXhcbiIsIGMsCi0JCQkgICAgICAgYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOwotCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwotCQl9CisJcmV0dXJuX3N0YXR1cyA9IHByb2Nlc3Nfc2VuZGNtZF9lcnJvcihoLCBjKTsKKworCWlmIChyZXR1cm5fc3RhdHVzID09IElPX05FRURTX1JFVFJZICYmCisJCWMtPnJldHJ5X2NvdW50IDwgTUFYX0NNRF9SRVRSSUVTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IHJldHJ5aW5nIDB4JTAyeFxuIiwgaC0+Y3RsciwKKwkJCWMtPlJlcXVlc3QuQ0RCWzBdKTsKKwkJYy0+cmV0cnlfY291bnQrKzsKKwkJLyogZXJhc2UgdGhlIG9sZCBlcnJvciBpbmZvcm1hdGlvbiAqLworCQltZW1zZXQoYy0+ZXJyX2luZm8sIDAsIHNpemVvZihFcnJvckluZm9fc3RydWN0KSk7CisJCXJldHVybl9zdGF0dXMgPSBJT19PSzsKKwkJSU5JVF9DT01QTEVUSU9OKHdhaXQpOworCQlnb3RvIHJlc2VuZF9jbWQyOwogCX0KKworY29tbWFuZF9kb25lOgogCS8qIHVubG9jayB0aGUgYnVmZmVycyBmcm9tIERNQSAqLwogCWJ1ZmZfZG1hX2hhbmRsZS52YWwzMi5sb3dlciA9IGMtPlNHWzBdLkFkZHIubG93ZXI7CiAJYnVmZl9kbWFfaGFuZGxlLnZhbDMyLnVwcGVyID0gYy0+U0dbMF0uQWRkci51cHBlcjsKIAlwY2lfdW5tYXBfc2luZ2xlKGgtPnBkZXYsIChkbWFfYWRkcl90KSBidWZmX2RtYV9oYW5kbGUudmFsLAogCQkJIGMtPlNHWzBdLkxlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlyZXR1cm4gcmV0dXJuX3N0YXR1czsKK30KKworc3RhdGljIGludCBzZW5kY21kX3dpdGhpcnEoX191OCBjbWQsIGludCBjdGxyLCB2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwKKwkJCSAgIF9fdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcltdLAorCQkJaW50IGNtZF90eXBlKQoreworCWN0bHJfaW5mb190ICpoID0gaGJhW2N0bHJdOworCUNvbW1hbmRMaXN0X3N0cnVjdCAqYzsKKwlpbnQgcmV0dXJuX3N0YXR1czsKKworCWMgPSBjbWRfYWxsb2MoaCwgMCk7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm5fc3RhdHVzID0gZmlsbF9jbWQoYywgY21kLCBjdGxyLCBidWZmLCBzaXplLCBwYWdlX2NvZGUsCisJCXNjc2kzYWRkciwgY21kX3R5cGUpOworCWlmIChyZXR1cm5fc3RhdHVzID09IElPX09LKQorCQlyZXR1cm5fc3RhdHVzID0gc2VuZGNtZF93aXRoaXJxX2NvcmUoaCwgYywgMSk7CisKIAljbWRfZnJlZShoLCBjLCAwKTsKIAlyZXR1cm4gcmV0dXJuX3N0YXR1czsKIH0KQEAgLTIxNTUsMTUgKzI0MjgsMTcgQEAKIHsKIAlpbnQgcmV0dXJuX2NvZGU7CiAJdW5zaWduZWQgbG9uZyB0OworCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyWzhdOwogCiAJbWVtc2V0KGlucV9idWZmLCAwLCBzaXplb2YoSW5xdWlyeURhdGFfc3RydWN0KSk7CisJbG9nX3VuaXRfdG9fc2NzaTNhZGRyKGhiYVtjdGxyXSwgc2NzaTNhZGRyLCBsb2d2b2wpOwogCWlmICh3aXRoaXJxKQogCQlyZXR1cm5fY29kZSA9IHNlbmRjbWRfd2l0aGlycShDSVNTX0lOUVVJUlksIGN0bHIsCi0JCQkJCSAgICAgIGlucV9idWZmLCBzaXplb2YoKmlucV9idWZmKSwgMSwKLQkJCQkJICAgICAgbG9ndm9sLCAweEMxLCBUWVBFX0NNRCk7CisJCQkJCSAgICAgIGlucV9idWZmLCBzaXplb2YoKmlucV9idWZmKSwKKwkJCQkJICAgICAgMHhDMSwgc2NzaTNhZGRyLCBUWVBFX0NNRCk7CiAJZWxzZQogCQlyZXR1cm5fY29kZSA9IHNlbmRjbWQoQ0lTU19JTlFVSVJZLCBjdGxyLCBpbnFfYnVmZiwKLQkJCQkgICAgICBzaXplb2YoKmlucV9idWZmKSwgMSwgbG9ndm9sLCAweEMxLCBOVUxMLAorCQkJCSAgICAgIHNpemVvZigqaW5xX2J1ZmYpLCAweEMxLCBzY3NpM2FkZHIsCiAJCQkJICAgICAgVFlQRV9DTUQpOwogCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewogCQlpZiAoaW5xX2J1ZmYtPmRhdGFfYnl0ZVs4XSA9PSAweEZGKSB7CkBAIC0yMjA0LDYgKzI0NzksNyBAQAogewogCVJlYWRDYXBkYXRhX3N0cnVjdCAqYnVmOwogCWludCByZXR1cm5fY29kZTsKKwl1bnNpZ25lZCBjaGFyIHNjc2kzYWRkcls4XTsKIAogCWJ1ZiA9IGt6YWxsb2Moc2l6ZW9mKFJlYWRDYXBkYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CkBAIC0yMjExLDE0ICsyNDg3LDE1IEBACiAJCXJldHVybjsKIAl9CiAKKwlsb2dfdW5pdF90b19zY3NpM2FkZHIoaGJhW2N0bHJdLCBzY3NpM2FkZHIsIGxvZ3ZvbCk7CiAJaWYgKHdpdGhpcnEpCiAJCXJldHVybl9jb2RlID0gc2VuZGNtZF93aXRoaXJxKENDSVNTX1JFQURfQ0FQQUNJVFksCiAJCQkJY3RsciwgYnVmLCBzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0KSwKLQkJCQkJMSwgbG9ndm9sLCAwLCBUWVBFX0NNRCk7CisJCQkJCTAsIHNjc2kzYWRkciwgVFlQRV9DTUQpOwogCWVsc2UKIAkJcmV0dXJuX2NvZGUgPSBzZW5kY21kKENDSVNTX1JFQURfQ0FQQUNJVFksCiAJCQkJY3RsciwgYnVmLCBzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0KSwKLQkJCQkJMSwgbG9ndm9sLCAwLCBOVUxMLCBUWVBFX0NNRCk7CisJCQkJCTAsIHNjc2kzYWRkciwgVFlQRV9DTUQpOwogCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewogCQkqdG90YWxfc2l6ZSA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopIGJ1Zi0+dG90YWxfc2l6ZSk7CiAJCSpibG9ja19zaXplID0gYmUzMl90b19jcHUoKihfX2JlMzIgKikgYnVmLT5ibG9ja19zaXplKTsKQEAgLTIyMzgsNiArMjUxNSw3IEBACiB7CiAJUmVhZENhcGRhdGFfc3RydWN0XzE2ICpidWY7CiAJaW50IHJldHVybl9jb2RlOworCXVuc2lnbmVkIGNoYXIgc2NzaTNhZGRyWzhdOwogCiAJYnVmID0ga3phbGxvYyhzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0XzE2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKQEAgLTIyNDUsMTUgKzI1MjMsMTYgQEAKIAkJcmV0dXJuOwogCX0KIAorCWxvZ191bml0X3RvX3Njc2kzYWRkcihoYmFbY3Rscl0sIHNjc2kzYWRkciwgbG9ndm9sKTsKIAlpZiAod2l0aGlycSkgewogCQlyZXR1cm5fY29kZSA9IHNlbmRjbWRfd2l0aGlycShDQ0lTU19SRUFEX0NBUEFDSVRZXzE2LAogCQkJY3RsciwgYnVmLCBzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0XzE2KSwKLQkJCQkxLCBsb2d2b2wsIDAsIFRZUEVfQ01EKTsKKwkJCQkwLCBzY3NpM2FkZHIsIFRZUEVfQ01EKTsKIAl9CiAJZWxzZSB7CiAJCXJldHVybl9jb2RlID0gc2VuZGNtZChDQ0lTU19SRUFEX0NBUEFDSVRZXzE2LAogCQkJY3RsciwgYnVmLCBzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0XzE2KSwKLQkJCQkxLCBsb2d2b2wsIDAsIE5VTEwsIFRZUEVfQ01EKTsKKwkJCQkwLCBzY3NpM2FkZHIsIFRZUEVfQ01EKTsKIAl9CiAJaWYgKHJldHVybl9jb2RlID09IElPX09LKSB7CiAJCSp0b3RhbF9zaXplID0gYmU2NF90b19jcHUoKihfX2JlNjQgKikgYnVmLT50b3RhbF9zaXplKTsKQEAgLTIzMDMsNyArMjU4Miw3IEBACiAJY2Npc3NfZ2VvbWV0cnlfaW5xdWlyeShoLT5jdGxyLCBsb2d2b2wsIDEsIHRvdGFsX3NpemUsIGJsb2NrX3NpemUsCiAJCQkgICAgICAgaW5xX2J1ZmYsIGRydik7CiAKLQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShkcnYtPnF1ZXVlLCBkcnYtPmJsb2NrX3NpemUpOworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoZHJ2LT5xdWV1ZSwgZHJ2LT5ibG9ja19zaXplKTsKIAlzZXRfY2FwYWNpdHkoZGlzaywgZHJ2LT5ucl9ibG9ja3MpOwogCiAJa2ZyZWUoaW5xX2J1ZmYpOwpAQCAtMjMzMyw4NiArMjYxMiwyMSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGFkZF9zZW5kY21kX3JlamVjdChfX3U4IGNtZCwgaW50IGN0bHIsIHVuc2lnbmVkIGxvbmcgY29tcGxldGUpCi17Ci0JLyogV2UgZ2V0IGluIGhlcmUgaWYgc2VuZGNtZCgpIGlzIHBvbGxpbmcgZm9yIGNvbXBsZXRpb25zCi0JICAgYW5kIGdldHMgc29tZSBjb21tYW5kIGJhY2sgdGhhdCBpdCB3YXNuJ3QgZXhwZWN0aW5nIC0tCi0JICAgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhhdCB3aGljaCBpdCBqdXN0IHNlbnQgZG93bi4KLQkgICBPcmRpbmFyaWx5LCB0aGF0IHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBpdCBjYW4gaGFwcGVuIHdoZW4KLQkgICB0aGUgc2NzaSB0YXBlIHN0dWZmIGdldHMgaW50byBlcnJvciBoYW5kbGluZyBtb2RlLCBhbmQKLQkgICBzdGFydHMgdXNpbmcgc2VuZGNtZCgpIHRvIHRyeSB0byBhYm9ydCBjb21tYW5kcyBhbmQKLQkgICByZXNldCB0YXBlIGRyaXZlcy4gIEluIHRoYXQgY2FzZSwgc2VuZGNtZCBtYXkgcGljayB1cAotCSAgIGNvbXBsZXRpb25zIG9mIGNvbW1hbmRzIHRoYXQgd2VyZSBzZW50IHRvIGxvZ2ljYWwgZHJpdmVzCi0JICAgdGhyb3VnaCB0aGUgYmxvY2sgaS9vIHN5c3RlbSwgb3IgY2Npc3MgaW9jdGxzIGNvbXBsZXRpbmcsIGV0Yy4KLQkgICBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gc2F2ZSB0aG9zZSBjb21wbGV0aW9ucyBmb3IgbGF0ZXIKLQkgICBwcm9jZXNzaW5nIGJ5IHRoZSBpbnRlcnJ1cHQgaGFuZGxlci4KLQkgKi8KLQotI2lmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQotCXN0cnVjdCBzZW5kY21kX3JlamVjdF9saXN0ICpzcmwgPSAmaGJhW2N0bHJdLT5zY3NpX3JlamVjdHM7Ci0KLQkvKiBJZiBpdCdzIG5vdCB0aGUgc2NzaSB0YXBlIHN0dWZmIGRvaW5nIGVycm9yIGhhbmRsaW5nLCAoYWJvcnQgKi8KLQkvKiBvciByZXNldCkgdGhlbiB3ZSBkb24ndCBleHBlY3QgYW55dGhpbmcgd2VpcmQuICovCi0JaWYgKGNtZCAhPSBDQ0lTU19SRVNFVF9NU0cgJiYgY21kICE9IENDSVNTX0FCT1JUX01TRykgewotI2VuZGlmCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzIGNjaXNzJWQ6IFNlbmRDbWQgIgotCQkgICAgICAgIkludmFsaWQgY29tbWFuZCBsaXN0IGFkZHJlc3MgcmV0dXJuZWQhICglbHgpXG4iLAotCQkgICAgICAgY3RsciwgY29tcGxldGUpOwotCQkvKiBub3QgbXVjaCB3ZSBjYW4gZG8uICovCi0jaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCi0JCXJldHVybiAxOwotCX0KLQotCS8qIFdlJ3ZlIHNlbnQgZG93biBhbiBhYm9ydCBvciByZXNldCwgYnV0IHNvbWV0aGluZyBlbHNlCi0JICAgaGFzIGNvbXBsZXRlZCAqLwotCWlmIChzcmwtPm5jb21wbGV0aW9ucyA+PSAoaGJhW2N0bHJdLT5ucl9jbWRzICsgMikpIHsKLQkJLyogVWggb2guICBObyByb29tIHRvIHNhdmUgaXQgZm9yIGxhdGVyLi4uICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IFNlbmRjbWQ6IEludmFsaWQgY29tbWFuZCBhZGRyLCAiCi0JCSAgICAgICAicmVqZWN0IGxpc3Qgb3ZlcmZsb3csIGNvbW1hbmQgbG9zdCFcbiIsIGN0bHIpOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyogU2F2ZSBpdCBmb3IgbGF0ZXIgKi8KLQlzcmwtPmNvbXBsZXRlW3NybC0+bmNvbXBsZXRpb25zXSA9IGNvbXBsZXRlOwotCXNybC0+bmNvbXBsZXRpb25zKys7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLCBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuCi0gKiBPbmx5IHVzZWQgYXQgaW5pdCB0aW1lLgorLyogU2VuZCBjb21tYW5kIGMgdG8gY29udHJvbGxlciBoIGFuZCBwb2xsIGZvciBpdCB0byBjb21wbGV0ZS4KKyAqIFR1cm5zIGludGVycnVwdHMgb2ZmIG9uIHRoZSBib2FyZC4gIFVzZWQgYXQgZHJpdmVyIGluaXQgdGltZQorICogYW5kIGR1cmluZyBTQ1NJIGVycm9yIHJlY292ZXJ5LgogICovCi1zdGF0aWMgaW50IHNlbmRjbWQoX191OCBjbWQsIGludCBjdGxyLCB2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IHVzZV91bml0X251bSwJLyogMDogYWRkcmVzcyB0aGUgY29udHJvbGxlciwKLQkJCQkJCQkJCQkJCSAgIDE6IGFkZHJlc3MgbG9naWNhbCB2b2x1bWUgbG9nX3VuaXQsCi0JCQkJCQkJCQkJCQkgICAyOiBwZXJpcGggZGV2aWNlIGFkZHJlc3MgaXMgc2NzaTNhZGRyICovCi0JCSAgIHVuc2lnbmVkIGludCBsb2dfdW5pdCwKLQkJICAgX191OCBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgaW50IGNtZF90eXBlKQorc3RhdGljIGludCBzZW5kY21kX2NvcmUoY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKIHsKLQlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBjb21wbGV0ZTsKLQljdGxyX2luZm9fdCAqaW5mb19wID0gaGJhW2N0bHJdOworCWludCBzdGF0dXMgPSBJT19FUlJPUjsKIAl1NjRiaXQgYnVmZl9kbWFfaGFuZGxlOwotCWludCBzdGF0dXMsIGRvbmUgPSAwOwogCi0JaWYgKChjID0gY21kX2FsbG9jKGluZm9fcCwgMSkpID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IHVuYWJsZSB0byBnZXQgbWVtb3J5Iik7Ci0JCXJldHVybiBJT19FUlJPUjsKLQl9Ci0Jc3RhdHVzID0gZmlsbF9jbWQoYywgY21kLCBjdGxyLCBidWZmLCBzaXplLCB1c2VfdW5pdF9udW0sCi0JCQkgIGxvZ191bml0LCBwYWdlX2NvZGUsIHNjc2kzYWRkciwgY21kX3R5cGUpOwotCWlmIChzdGF0dXMgIT0gSU9fT0spIHsKLQkJY21kX2ZyZWUoaW5mb19wLCBjLCAxKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0gICAgICByZXNlbmRfY21kMToKLQkvKgotCSAqIERpc2FibGUgaW50ZXJydXB0Ci0JICovCi0jaWZkZWYgQ0NJU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiY2Npc3M6IHR1cm5pbmcgaW50ciBvZmZcbiIpOwotI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCi0JaW5mb19wLT5hY2Nlc3Muc2V0X2ludHJfbWFzayhpbmZvX3AsIENDSVNTX0lOVFJfT0ZGKTsKK3Jlc2VuZF9jbWQxOgorCisJLyogRGlzYWJsZSBpbnRlcnJ1cHQgb24gdGhlIGJvYXJkLiAqLworCWgtPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGgsIENDSVNTX0lOVFJfT0ZGKTsKIAogCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyByb29tIGluIHRoZSBjb21tYW5kIEZJRk8gKi8KIAkvKiBBY3R1YWxseSBpdCBzaG91bGQgYmUgY29tcGxldGVseSBlbXB0eSBhdCB0aGlzIHRpbWUgKi8KQEAgLTI0MjAsMjEgKzI2MzQsMTUgQEAKIAkvKiB0YXBlIHNpZGUgb2YgdGhlIGRyaXZlci4gKi8KIAlmb3IgKGkgPSAyMDAwMDA7IGkgPiAwOyBpLS0pIHsKIAkJLyogaWYgZmlmbyBpc24ndCBmdWxsIGdvICovCi0JCWlmICghKGluZm9fcC0+YWNjZXNzLmZpZm9fZnVsbChpbmZvX3ApKSkgewotCisJCWlmICghKGgtPmFjY2Vzcy5maWZvX2Z1bGwoaCkpKQogCQkJYnJlYWs7Ci0JCX0KIAkJdWRlbGF5KDEwKTsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MgY2Npc3MlZDogU2VuZENtZCBGSUZPIGZ1bGwsIgotCQkgICAgICAgIiB3YWl0aW5nIVxuIiwgY3Rscik7CisJCSAgICAgICAiIHdhaXRpbmchXG4iLCBoLT5jdGxyKTsKIAl9Ci0JLyoKLQkgKiBTZW5kIHRoZSBjbWQKLQkgKi8KLQlpbmZvX3AtPmFjY2Vzcy5zdWJtaXRfY29tbWFuZChpbmZvX3AsIGMpOwotCWRvbmUgPSAwOworCWgtPmFjY2Vzcy5zdWJtaXRfY29tbWFuZChoLCBjKTsgLyogU2VuZCB0aGUgY21kICovCiAJZG8gewotCQljb21wbGV0ZSA9IHBvbGxjb21wbGV0ZShjdGxyKTsKKwkJY29tcGxldGUgPSBwb2xsY29tcGxldGUoaC0+Y3Rscik7CiAKICNpZmRlZiBDQ0lTU19ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiY2Npc3M6IGNvbW1hbmQgY29tcGxldGVkXG4iKTsKQEAgLTI0NDMsOTcgKzI2NTEsMTAyIEBACiAJCWlmIChjb21wbGV0ZSA9PSAxKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkgICAgICAgImNjaXNzIGNjaXNzJWQ6IFNlbmRDbWQgVGltZW91dCBvdXQsICIKLQkJCSAgICAgICAiTm8gY29tbWFuZCBsaXN0IGFkZHJlc3MgcmV0dXJuZWQhXG4iLCBjdGxyKTsKKwkJCSAgICAgICAiTm8gY29tbWFuZCBsaXN0IGFkZHJlc3MgcmV0dXJuZWQhXG4iLCBoLT5jdGxyKTsKIAkJCXN0YXR1cyA9IElPX0VSUk9SOwotCQkJZG9uZSA9IDE7CiAJCQlicmVhazsKIAkJfQogCi0JCS8qIFRoaXMgd2lsbCBuZWVkIHRvIGNoYW5nZSBmb3IgZGlyZWN0IGxvb2t1cCBjb21wbGV0aW9ucyAqLwotCQlpZiAoKGNvbXBsZXRlICYgQ0lTU19FUlJPUl9CSVQpCi0JCSAgICAmJiAoY29tcGxldGUgJiB+Q0lTU19FUlJPUl9CSVQpID09IGMtPmJ1c2FkZHIpIHsKLQkJCS8qIGlmIGRhdGEgb3ZlcnJ1biBvciB1bmRlcnVuIG9uIFJlcG9ydCBjb21tYW5kCi0JCQkgICBpZ25vcmUgaXQKLQkJCSAqLwotCQkJaWYgKCgoYy0+UmVxdWVzdC5DREJbMF0gPT0gQ0lTU19SRVBPUlRfTE9HKSB8fAotCQkJICAgICAoYy0+UmVxdWVzdC5DREJbMF0gPT0gQ0lTU19SRVBPUlRfUEhZUykgfHwKLQkJCSAgICAgKGMtPlJlcXVlc3QuQ0RCWzBdID09IENJU1NfSU5RVUlSWSkpICYmCi0JCQkgICAgKChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9PQotCQkJICAgICAgQ01EX0RBVEFfT1ZFUlJVTikgfHwKLQkJCSAgICAgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09IENNRF9EQVRBX1VOREVSUlVOKQotCQkJICAgICkpIHsKLQkJCQljb21wbGV0ZSA9IGMtPmJ1c2FkZHI7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9PQotCQkJCSAgICBDTURfVU5TT0xJQ0lURURfQUJPUlQpIHsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogIgotCQkJCQkgICAgICAgInVuc29saWNpdGVkIGFib3J0ICVwXG4iLAotCQkJCQkgICAgICAgY3RsciwgYyk7Ci0JCQkJCWlmIChjLT5yZXRyeV9jb3VudCA8IE1BWF9DTURfUkVUUklFUykgewotCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJICAgICAgICJjY2lzcyVkOiByZXRyeWluZyAlcFxuIiwKLQkJCQkJCSAgICAgICBjdGxyLCBjKTsKLQkJCQkJCWMtPnJldHJ5X2NvdW50Kys7Ci0JCQkJCQkvKiBlcmFzZSB0aGUgb2xkIGVycm9yICovCi0JCQkJCQkvKiBpbmZvcm1hdGlvbiAqLwotCQkJCQkJbWVtc2V0KGMtPmVycl9pbmZvLCAwLAotCQkJCQkJICAgICAgIHNpemVvZgotCQkJCQkJICAgICAgIChFcnJvckluZm9fc3RydWN0KSk7Ci0JCQkJCQlnb3RvIHJlc2VuZF9jbWQxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJICAgICAgICJjY2lzcyVkOiByZXRyaWVkICVwIHRvbyAiCi0JCQkJCQkgICAgICAgIm1hbnkgdGltZXNcbiIsIGN0bHIsIGMpOwotCQkJCQkJc3RhdHVzID0gSU9fRVJST1I7Ci0JCQkJCQlnb3RvIGNsZWFudXAxOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9PQotCQkJCQkgICBDTURfVU5BQk9SVEFCTEUpIHsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkgICAgICAgImNjaXNzJWQ6IGNvbW1hbmQgY291bGQgbm90IGJlIGFib3J0ZWQuXG4iLAotCQkJCQkgICAgICAgY3Rscik7Ci0JCQkJCXN0YXR1cyA9IElPX0VSUk9SOwotCQkJCQlnb3RvIGNsZWFudXAxOwotCQkJCX0KLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjaXNzIGNpc3MlZDogc2VuZGNtZCIKLQkJCQkgICAgICAgIiBFcnJvciAleCBcbiIsIGN0bHIsCi0JCQkJICAgICAgIGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKTsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjaXNzIGNpc3MlZDogc2VuZGNtZCIKLQkJCQkgICAgICAgIiBvZmZlbnNpdmUgaW5mb1xuIgotCQkJCSAgICAgICAiICBzaXplICV4XG4gICBudW0gJXggICB2YWx1ZSAleFxuIiwKLQkJCQkgICAgICAgY3RsciwKLQkJCQkgICAgICAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLgotCQkJCSAgICAgICBvZmZlbnNlX3NpemUsCi0JCQkJICAgICAgIGMtPmVycl9pbmZvLT5Nb3JlRXJySW5mby5JbnZhbGlkX0NtZC4KLQkJCQkgICAgICAgb2ZmZW5zZV9udW0sCi0JCQkJICAgICAgIGMtPmVycl9pbmZvLT5Nb3JlRXJySW5mby5JbnZhbGlkX0NtZC4KLQkJCQkgICAgICAgb2ZmZW5zZV92YWx1ZSk7Ci0JCQkJc3RhdHVzID0gSU9fRVJST1I7Ci0JCQkJZ290byBjbGVhbnVwMTsKLQkJCX0KLQkJfQotCQkvKiBUaGlzIHdpbGwgbmVlZCBjaGFuZ2luZyBmb3IgZGlyZWN0IGxvb2t1cCBjb21wbGV0aW9ucyAqLwotCQlpZiAoY29tcGxldGUgIT0gYy0+YnVzYWRkcikgewotCQkJaWYgKGFkZF9zZW5kY21kX3JlamVjdChjbWQsIGN0bHIsIGNvbXBsZXRlKSAhPSAwKSB7Ci0JCQkJQlVHKCk7CS8qIHdlIGFyZSBwcmV0dHkgbXVjaCBob3NlZCBpZiB3ZSBnZXQgaGVyZS4gKi8KLQkJCX0KKwkJLyogTWFrZSBzdXJlIGl0J3MgdGhlIGNvbW1hbmQgd2UncmUgZXhwZWN0aW5nLiAqLworCQlpZiAoKGNvbXBsZXRlICYgfkNJU1NfRVJST1JfQklUKSAhPSBjLT5idXNhZGRyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiBVbmV4cGVjdGVkIGNvbW1hbmQgIgorCQkJCSJjb21wbGV0aW9uLlxuIiwgaC0+Y3Rscik7CiAJCQljb250aW51ZTsKLQkJfSBlbHNlCi0JCQlkb25lID0gMTsKLQl9IHdoaWxlICghZG9uZSk7CisJCX0KIAotICAgICAgY2xlYW51cDE6CisJCS8qIEl0IGlzIG91ciBjb21tYW5kLiAgSWYgbm8gZXJyb3IsIHdlJ3JlIGRvbmUuICovCisJCWlmICghKGNvbXBsZXRlICYgQ0lTU19FUlJPUl9CSVQpKSB7CisJCQlzdGF0dXMgPSBJT19PSzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVGhlcmUgaXMgYW4gZXJyb3IuLi4gKi8KKworCQkvKiBpZiBkYXRhIG92ZXJydW4gb3IgdW5kZXJ1biBvbiBSZXBvcnQgY29tbWFuZCBpZ25vcmUgaXQgKi8KKwkJaWYgKCgoYy0+UmVxdWVzdC5DREJbMF0gPT0gQ0lTU19SRVBPUlRfTE9HKSB8fAorCQkgICAgIChjLT5SZXF1ZXN0LkNEQlswXSA9PSBDSVNTX1JFUE9SVF9QSFlTKSB8fAorCQkgICAgIChjLT5SZXF1ZXN0LkNEQlswXSA9PSBDSVNTX0lOUVVJUlkpKSAmJgorCQkJKChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9PSBDTURfREFUQV9PVkVSUlVOKSB8fAorCQkJIChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9PSBDTURfREFUQV9VTkRFUlJVTikpKSB7CisJCQljb21wbGV0ZSA9IGMtPmJ1c2FkZHI7CisJCQlzdGF0dXMgPSBJT19PSzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09IENNRF9VTlNPTElDSVRFRF9BQk9SVCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogdW5zb2xpY2l0ZWQgYWJvcnQgJXBcbiIsCisJCQkJaC0+Y3RsciwgYyk7CisJCQlpZiAoYy0+cmV0cnlfY291bnQgPCBNQVhfQ01EX1JFVFJJRVMpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiByZXRyeWluZyAlcFxuIiwKKwkJCQkgICBoLT5jdGxyLCBjKTsKKwkJCQljLT5yZXRyeV9jb3VudCsrOworCQkJCS8qIGVyYXNlIHRoZSBvbGQgZXJyb3IgaW5mb3JtYXRpb24gKi8KKwkJCQltZW1zZXQoYy0+ZXJyX2luZm8sIDAsIHNpemVvZihjLT5lcnJfaW5mbykpOworCQkJCWdvdG8gcmVzZW5kX2NtZDE7CisJCQl9CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiByZXRyaWVkICVwIHRvbyBtYW55ICIKKwkJCQkidGltZXNcbiIsIGgtPmN0bHIsIGMpOworCQkJc3RhdHVzID0gSU9fRVJST1I7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9PSBDTURfVU5BQk9SVEFCTEUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IGNvbW1hbmQgY291bGQgbm90IGJlICIKKwkJCQkiYWJvcnRlZC5cbiIsIGgtPmN0bHIpOworCQkJc3RhdHVzID0gSU9fRVJST1I7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9PSBDTURfVEFSR0VUX1NUQVRVUykgeworCQkJc3RhdHVzID0gY2hlY2tfdGFyZ2V0X3N0YXR1cyhoLCBjKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogc2VuZGNtZCBlcnJvclxuIiwgaC0+Y3Rscik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNtZCA9IDB4JTAyeCwgQ29tbWFuZFN0YXR1cyA9IDB4JTAyeFxuIiwKKwkJCWMtPlJlcXVlc3QuQ0RCWzBdLCBjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyk7CisJCXN0YXR1cyA9IElPX0VSUk9SOworCQlicmVhazsKKworCX0gd2hpbGUgKDEpOworCiAJLyogdW5sb2NrIHRoZSBkYXRhIGJ1ZmZlciBmcm9tIERNQSAqLwogCWJ1ZmZfZG1hX2hhbmRsZS52YWwzMi5sb3dlciA9IGMtPlNHWzBdLkFkZHIubG93ZXI7CiAJYnVmZl9kbWFfaGFuZGxlLnZhbDMyLnVwcGVyID0gYy0+U0dbMF0uQWRkci51cHBlcjsKLQlwY2lfdW5tYXBfc2luZ2xlKGluZm9fcC0+cGRldiwgKGRtYV9hZGRyX3QpIGJ1ZmZfZG1hX2hhbmRsZS52YWwsCisJcGNpX3VubWFwX3NpbmdsZShoLT5wZGV2LCAoZG1hX2FkZHJfdCkgYnVmZl9kbWFfaGFuZGxlLnZhbCwKIAkJCSBjLT5TR1swXS5MZW4sIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0jaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCi0JLyogaWYgd2Ugc2F2ZWQgc29tZSBjb21tYW5kcyBmb3IgbGF0ZXIsIHByb2Nlc3MgdGhlbSBub3cuICovCi0JaWYgKGluZm9fcC0+c2NzaV9yZWplY3RzLm5jb21wbGV0aW9ucyA+IDApCi0JCWRvX2NjaXNzX2ludHIoMCwgaW5mb19wKTsKLSNlbmRpZgotCWNtZF9mcmVlKGluZm9fcCwgYywgMSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLCBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuCisgKiBVc2VkIGF0IGluaXQgdGltZSwgYW5kIGR1cmluZyBTQ1NJIGVycm9yIHJlY292ZXJ5LgorICovCitzdGF0aWMgaW50IHNlbmRjbWQoX191OCBjbWQsIGludCBjdGxyLCB2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwKKwlfX3U4IHBhZ2VfY29kZSwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLCBpbnQgY21kX3R5cGUpCit7CisJQ29tbWFuZExpc3Rfc3RydWN0ICpjOworCWludCBzdGF0dXM7CisKKwljID0gY21kX2FsbG9jKGhiYVtjdGxyXSwgMSk7CisJaWYgKCFjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiB1bmFibGUgdG8gZ2V0IG1lbW9yeSIpOworCQlyZXR1cm4gSU9fRVJST1I7CisJfQorCXN0YXR1cyA9IGZpbGxfY21kKGMsIGNtZCwgY3RsciwgYnVmZiwgc2l6ZSwgcGFnZV9jb2RlLAorCQlzY3NpM2FkZHIsIGNtZF90eXBlKTsKKwlpZiAoc3RhdHVzID09IElPX09LKQorCQlzdGF0dXMgPSBzZW5kY21kX2NvcmUoaGJhW2N0bHJdLCBjKTsKKwljbWRfZnJlZShoYmFbY3Rscl0sIGMsIDEpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTI2OTEsNyArMjkwNCw3IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyIKIAkJCSAgICAgICAiIGNvbXBsZXRlZCB3aXRoIGRhdGEgdW5kZXJydW4gIgogCQkJICAgICAgICJyZXBvcnRlZFxuIiwgY21kKTsKLQkJCWNtZC0+cnEtPmRhdGFfbGVuID0gY21kLT5lcnJfaW5mby0+UmVzaWR1YWxDbnQ7CisJCQljbWQtPnJxLT5yZXNpZF9sZW4gPSBjbWQtPmVycl9pbmZvLT5SZXNpZHVhbENudDsKIAkJfQogCQlicmVhazsKIAljYXNlIENNRF9EQVRBX09WRVJSVU46CkBAIC0yODA2LDcgKzMwMTksNyBAQAogCQlnb3RvIHN0YXJ0aW87CiAKICAgICAgIHF1ZXVlOgotCWNyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCWNyZXEgPSBibGtfcGVla19yZXF1ZXN0KHEpOwogCWlmICghY3JlcSkKIAkJZ290byBzdGFydGlvOwogCkBAIC0yODE1LDcgKzMwMjgsNyBAQAogCWlmICgoYyA9IGNtZF9hbGxvYyhoLCAxKSkgPT0gTlVMTCkKIAkJZ290byBmdWxsOwogCi0JYmxrZGV2X2RlcXVldWVfcmVxdWVzdChjcmVxKTsKKwlibGtfc3RhcnRfcmVxdWVzdChjcmVxKTsKIAogCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIApAQCAtMjg0MCwxMCArMzA1MywxMCBAQAogCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CS8vIERvbid0IHRpbWUgb3V0CiAJYy0+UmVxdWVzdC5DREJbMF0gPQogCSAgICAocnFfZGF0YV9kaXIoY3JlcSkgPT0gUkVBRCkgPyBoLT5jY2lzc19yZWFkIDogaC0+Y2Npc3Nfd3JpdGU7Ci0Jc3RhcnRfYmxrID0gY3JlcS0+c2VjdG9yOworCXN0YXJ0X2JsayA9IGJsa19ycV9wb3MoY3JlcSk7CiAjaWZkZWYgQ0NJU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiY2lzczogc2VjdG9yID0lZCBucl9zZWN0b3JzPSVkXG4iLCAoaW50KWNyZXEtPnNlY3RvciwKLQkgICAgICAgKGludCljcmVxLT5ucl9zZWN0b3JzKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY2lzczogc2VjdG9yID0lZCBucl9zZWN0b3JzPSVkXG4iLAorCSAgICAgICAoaW50KWJsa19ycV9wb3MoY3JlcSksIChpbnQpYmxrX3JxX3NlY3RvcnMoY3JlcSkpOwogI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKIAlzZ19pbml0X3RhYmxlKHRtcF9zZywgTUFYU0dFTlRSSUVTKTsKQEAgLTI4NjksOCArMzA4Miw4IEBACiAJCWgtPm1heFNHID0gc2VnOwogCiAjaWZkZWYgQ0NJU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiY2Npc3M6IFN1Ym1pdHRpbmcgJWx1IHNlY3RvcnMgaW4gJWQgc2VnbWVudHNcbiIsCi0JICAgICAgIGNyZXEtPm5yX3NlY3RvcnMsIHNlZyk7CisJcHJpbnRrKEtFUk5fREVCVUcgImNjaXNzOiBTdWJtaXR0aW5nICV1IHNlY3RvcnMgaW4gJWQgc2VnbWVudHNcbiIsCisJICAgICAgIGJsa19ycV9zZWN0b3JzKGNyZXEpLCBzZWcpOwogI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKIAljLT5IZWFkZXIuU0dMaXN0ID0gYy0+SGVhZGVyLlNHVG90YWwgPSBzZWc7CkBAIC0yODgyLDggKzMwOTUsOCBAQAogCQkJYy0+UmVxdWVzdC5DREJbNF0gPSAoc3RhcnRfYmxrID4+IDgpICYgMHhmZjsKIAkJCWMtPlJlcXVlc3QuQ0RCWzVdID0gc3RhcnRfYmxrICYgMHhmZjsKIAkJCWMtPlJlcXVlc3QuQ0RCWzZdID0gMDsJLy8gKHNlY3QgPj4gMjQpICYgMHhmZjsgTVNCCi0JCQljLT5SZXF1ZXN0LkNEQls3XSA9IChjcmVxLT5ucl9zZWN0b3JzID4+IDgpICYgMHhmZjsKLQkJCWMtPlJlcXVlc3QuQ0RCWzhdID0gY3JlcS0+bnJfc2VjdG9ycyAmIDB4ZmY7CisJCQljLT5SZXF1ZXN0LkNEQls3XSA9IChibGtfcnFfc2VjdG9ycyhjcmVxKSA+PiA4KSAmIDB4ZmY7CisJCQljLT5SZXF1ZXN0LkNEQls4XSA9IGJsa19ycV9zZWN0b3JzKGNyZXEpICYgMHhmZjsKIAkJCWMtPlJlcXVlc3QuQ0RCWzldID0gYy0+UmVxdWVzdC5DREJbMTFdID0gYy0+UmVxdWVzdC5DREJbMTJdID0gMDsKIAkJfSBlbHNlIHsKIAkJCXUzMiB1cHBlcjMyID0gdXBwZXJfMzJfYml0cyhzdGFydF9ibGspOwpAQCAtMjg5OCwxMCArMzExMSwxMCBAQAogCQkJYy0+UmVxdWVzdC5DREJbN109IChzdGFydF9ibGsgPj4gMTYpICYgMHhmZjsKIAkJCWMtPlJlcXVlc3QuQ0RCWzhdPSAoc3RhcnRfYmxrID4+ICA4KSAmIDB4ZmY7CiAJCQljLT5SZXF1ZXN0LkNEQls5XT0gc3RhcnRfYmxrICYgMHhmZjsKLQkJCWMtPlJlcXVlc3QuQ0RCWzEwXT0gKGNyZXEtPm5yX3NlY3RvcnMgPj4gIDI0KSAmIDB4ZmY7Ci0JCQljLT5SZXF1ZXN0LkNEQlsxMV09IChjcmVxLT5ucl9zZWN0b3JzID4+ICAxNikgJiAweGZmOwotCQkJYy0+UmVxdWVzdC5DREJbMTJdPSAoY3JlcS0+bnJfc2VjdG9ycyA+PiAgOCkgJiAweGZmOwotCQkJYy0+UmVxdWVzdC5DREJbMTNdPSBjcmVxLT5ucl9zZWN0b3JzICYgMHhmZjsKKwkJCWMtPlJlcXVlc3QuQ0RCWzEwXT0gKGJsa19ycV9zZWN0b3JzKGNyZXEpID4+IDI0KSAmIDB4ZmY7CisJCQljLT5SZXF1ZXN0LkNEQlsxMV09IChibGtfcnFfc2VjdG9ycyhjcmVxKSA+PiAxNikgJiAweGZmOworCQkJYy0+UmVxdWVzdC5DREJbMTJdPSAoYmxrX3JxX3NlY3RvcnMoY3JlcSkgPj4gIDgpICYgMHhmZjsKKwkJCWMtPlJlcXVlc3QuQ0RCWzEzXT0gYmxrX3JxX3NlY3RvcnMoY3JlcSkgJiAweGZmOwogCQkJYy0+UmVxdWVzdC5DREJbMTRdID0gYy0+UmVxdWVzdC5DREJbMTVdID0gMDsKIAkJfQogCX0gZWxzZSBpZiAoYmxrX3BjX3JlcXVlc3QoY3JlcSkpIHsKQEAgLTI5MzEsNDQgKzMxNDQsMTggQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9uZXh0X2NvbXBsZXRpb24oY3Rscl9pbmZvX3QgKmgpCiB7Ci0jaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCi0JLyogQW55IHJlamVjdHMgZnJvbSBzZW5kY21kKCkgbHlpbmcgYXJvdW5kPyBQcm9jZXNzIHRoZW0gZmlyc3QgKi8KLQlpZiAoaC0+c2NzaV9yZWplY3RzLm5jb21wbGV0aW9ucyA9PSAwKQotCQlyZXR1cm4gaC0+YWNjZXNzLmNvbW1hbmRfY29tcGxldGVkKGgpOwotCWVsc2UgewotCQlzdHJ1Y3Qgc2VuZGNtZF9yZWplY3RfbGlzdCAqc3JsOwotCQlpbnQgbjsKLQkJc3JsID0gJmgtPnNjc2lfcmVqZWN0czsKLQkJbiA9IC0tc3JsLT5uY29tcGxldGlvbnM7Ci0JCS8qIHByaW50aygiY2Npc3MlZDogcHJvY2Vzc2luZyBzYXZlZCByZWplY3RcbiIsIGgtPmN0bHIpOyAqLwotCQlwcmludGsoInAiKTsKLQkJcmV0dXJuIHNybC0+Y29tcGxldGVbbl07Ci0JfQotI2Vsc2UKIAlyZXR1cm4gaC0+YWNjZXNzLmNvbW1hbmRfY29tcGxldGVkKGgpOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGludGVycnVwdF9wZW5kaW5nKGN0bHJfaW5mb190ICpoKQogewotI2lmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQotCXJldHVybiAoaC0+YWNjZXNzLmludHJfcGVuZGluZyhoKQotCQl8fCAoaC0+c2NzaV9yZWplY3RzLm5jb21wbGV0aW9ucyA+IDApKTsKLSNlbHNlCiAJcmV0dXJuIGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSBsb25nIGludGVycnVwdF9ub3RfZm9yX3VzKGN0bHJfaW5mb190ICpoKQogewotI2lmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQotCXJldHVybiAoKChoLT5hY2Nlc3MuaW50cl9wZW5kaW5nKGgpID09IDApIHx8Ci0JCSAoaC0+aW50ZXJydXB0c19lbmFibGVkID09IDApKQotCQkmJiAoaC0+c2NzaV9yZWplY3RzLm5jb21wbGV0aW9ucyA9PSAwKSk7Ci0jZWxzZQogCXJldHVybiAoKChoLT5hY2Nlc3MuaW50cl9wZW5kaW5nKGgpID09IDApIHx8CiAJCSAoaC0+aW50ZXJydXB0c19lbmFibGVkID09IDApKSk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGlycXJldHVybl90IGRvX2NjaXNzX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpAQCAtMzcyMywxMiArMzkxMCwxNSBAQAogCUlOSVRfSExJU1RfSEVBRCgmaGJhW2ldLT5yZXFRKTsKIAogCWlmIChjY2lzc19wY2lfaW5pdChoYmFbaV0sIHBkZXYpICE9IDApCi0JCWdvdG8gY2xlYW4xOworCQlnb3RvIGNsZWFuMDsKIAogCXNwcmludGYoaGJhW2ldLT5kZXZuYW1lLCAiY2Npc3MlZCIsIGkpOwogCWhiYVtpXS0+Y3RsciA9IGk7CiAJaGJhW2ldLT5wZGV2ID0gcGRldjsKIAorCWlmIChjY2lzc19jcmVhdGVfaGJhX3N5c2ZzX2VudHJ5KGhiYVtpXSkpCisJCWdvdG8gY2xlYW4wOworCiAJLyogY29uZmlndXJlIFBDSSBETUEgc3R1ZmYgKi8KIAlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkpCiAJCWRhYyA9IDE7CkBAIC0zNzg3LDE1ICszOTc3LDYgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeSIpOwogCQlnb3RvIGNsZWFuNDsKIAl9Ci0jaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCi0JaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGUgPQotCSAgICBrbWFsbG9jKHNpemVvZihoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZVswXSkgKgotCQkgICAgKGhiYVtpXS0+bnJfY21kcyArIDUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGUgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBvdXQgb2YgbWVtb3J5Iik7Ci0JCWdvdG8gY2xlYW40OwotCX0KLSNlbmRpZgogCXNwaW5fbG9ja19pbml0KCZoYmFbaV0tPmxvY2spOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgcGRldiBkcml2ZXIgcHJpdmF0ZSBkYXRhLgpAQCAtMzgyOCw3ICs0MDA5LDcgQEAKIAl9CiAKIAlyZXR1cm5fY29kZSA9IHNlbmRjbWRfd2l0aGlycShDSVNTX0lOUVVJUlksIGksIGlucV9idWZmLAotCQlzaXplb2YoSW5xdWlyeURhdGFfc3RydWN0KSwgMCwgMCAsIDAsIFRZUEVfQ01EKTsKKwkJc2l6ZW9mKElucXVpcnlEYXRhX3N0cnVjdCksIDAsIENUTFJfTFVOSUQsIFRZUEVfQ01EKTsKIAlpZiAocmV0dXJuX2NvZGUgPT0gSU9fT0spIHsKIAkJaGJhW2ldLT5maXJtX3ZlclswXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzJdOwogCQloYmFbaV0tPmZpcm1fdmVyWzFdID0gaW5xX2J1ZmYtPmRhdGFfYnl0ZVszM107CkBAIC0zODU1LDkgKzQwMzYsNiBAQAogCiBjbGVhbjQ6CiAJa2ZyZWUoaW5xX2J1ZmYpOwotI2lmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQotCWtmcmVlKGhiYVtpXS0+c2NzaV9yZWplY3RzLmNvbXBsZXRlKTsKLSNlbmRpZgogCWtmcmVlKGhiYVtpXS0+Y21kX3Bvb2xfYml0cyk7CiAJaWYgKGhiYVtpXS0+Y21kX3Bvb2wpCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LApAQCAtMzg3Miw2ICs0MDUwLDggQEAKIGNsZWFuMjoKIAl1bnJlZ2lzdGVyX2Jsa2RldihoYmFbaV0tPm1ham9yLCBoYmFbaV0tPmRldm5hbWUpOwogY2xlYW4xOgorCWNjaXNzX2Rlc3Ryb3lfaGJhX3N5c2ZzX2VudHJ5KGhiYVtpXSk7CitjbGVhbjA6CiAJaGJhW2ldLT5idXN5X2luaXRpYWxpemluZyA9IDA7CiAJLyogY2xlYW51cCBhbnkgcXVldWVzIHRoYXQgbWF5IGhhdmUgYmVlbiBpbml0aWFsaXplZCAqLwogCWZvciAoaj0wOyBqIDw9IGhiYVtpXS0+aGlnaGVzdF9sdW47IGorKyl7CkBAIC0zOTA3LDggKzQwODcsOCBAQAogCS8qIHNlbmRjbWQgd2lsbCB0dXJuIG9mZiBpbnRlcnJ1cHQsIGFuZCBzZW5kIHRoZSBmbHVzaC4uLgogCSAqIFRvIHdyaXRlIGFsbCBkYXRhIGluIHRoZSBiYXR0ZXJ5IGJhY2tlZCBjYWNoZSB0byBkaXNrcyAqLwogCW1lbXNldChmbHVzaF9idWYsIDAsIDQpOwotCXJldHVybl9jb2RlID0gc2VuZGNtZChDQ0lTU19DQUNIRV9GTFVTSCwgaSwgZmx1c2hfYnVmLCA0LCAwLCAwLCAwLCBOVUxMLAotCQkJICAgICAgVFlQRV9DTUQpOworCXJldHVybl9jb2RlID0gc2VuZGNtZChDQ0lTU19DQUNIRV9GTFVTSCwgaSwgZmx1c2hfYnVmLCA0LCAwLAorCQlDVExSX0xVTklELCBUWVBFX0NNRCk7CiAJaWYgKHJldHVybl9jb2RlID09IElPX09LKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkNvbXBsZXRlZCBmbHVzaGluZyBjYWNoZSBvbiBjb250cm9sbGVyICVkXG4iLCBpKTsKIAl9IGVsc2UgewpAQCAtMzk3MywxNSArNDE1MywxMyBAQAogCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LCBoYmFbaV0tPm5yX2NtZHMgKiBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCksCiAJCQkgICAgaGJhW2ldLT5lcnJpbmZvX3Bvb2wsIGhiYVtpXS0+ZXJyaW5mb19wb29sX2RoYW5kbGUpOwogCWtmcmVlKGhiYVtpXS0+Y21kX3Bvb2xfYml0cyk7Ci0jaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCi0Ja2ZyZWUoaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGUpOwotI2VuZGlmCiAJLyoKIAkgKiBEZWxpYmVyYXRlbHkgb21pdCBwY2lfZGlzYWJsZV9kZXZpY2UoKTogaXQgZG9lcyBzb21ldGhpbmcgbmFzdHkgdG8KIAkgKiBTbWFydCBBcnJheSBjb250cm9sbGVycyB0aGF0IHBjaV9lbmFibGVfZGV2aWNlIGRvZXMgbm90IHVuZG8KIAkgKi8KIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwljY2lzc19kZXN0cm95X2hiYV9zeXNmc19lbnRyeShoYmFbaV0pOwogCWZyZWVfaGJhKGkpOwogfQogCkBAIC0zOTk5LDYgKzQxNzcsOCBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBjY2lzc19pbml0KHZvaWQpCiB7CisJaW50IGVycjsKKwogCS8qCiAJICogVGhlIGhhcmR3YXJlIHJlcXVpcmVzIHRoYXQgY29tbWFuZHMgYXJlIGFsaWduZWQgb24gYSA2NC1iaXQKIAkgKiBib3VuZGFyeS4gR2l2ZW4gdGhhdCB3ZSB1c2UgcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSB0byBhbGxvY2F0ZSBhbgpAQCAtNDAwOCw4ICs0MTg4LDIwIEBACiAKIAlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FICJcbiIpOwogCisJZXJyID0gYnVzX3JlZ2lzdGVyKCZjY2lzc19idXNfdHlwZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwogCS8qIFJlZ2lzdGVyIGZvciBvdXIgUENJIGRldmljZXMgKi8KLQlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2Npc3NfcGNpX2RyaXZlcik7CisJZXJyID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2Npc3NfcGNpX2RyaXZlcik7CisJaWYgKGVycikKKwkJZ290byBlcnJfYnVzX3JlZ2lzdGVyOworCisJcmV0dXJuIDA7CisKK2Vycl9idXNfcmVnaXN0ZXI6CisJYnVzX3VucmVnaXN0ZXIoJmNjaXNzX2J1c190eXBlKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2Npc3NfY2xlYW51cCh2b2lkKQpAQCAtNDAyNiw2ICs0MjE4LDcgQEAKIAkJfQogCX0KIAlyZW1vdmVfcHJvY19lbnRyeSgiZHJpdmVyL2NjaXNzIiwgTlVMTCk7CisJYnVzX3VucmVnaXN0ZXIoJmNjaXNzX2J1c190eXBlKTsKIH0KIAogc3RhdGljIHZvaWQgZmFpbF9hbGxfY21kcyh1bnNpZ25lZCBsb25nIGN0bHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmggYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKaW5kZXggNzAzZTA4MC4uMDZhNWRiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5oCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaApAQCAtMTEsNiArMTEsMTEgQEAKIAogI2RlZmluZSBJT19PSwkJMAogI2RlZmluZSBJT19FUlJPUgkxCisjZGVmaW5lIElPX05FRURTX1JFVFJZICAzCisKKyNkZWZpbmUgVkVORE9SX0xFTgk4CisjZGVmaW5lIE1PREVMX0xFTgkxNgorI2RlZmluZSBSRVZfTEVOCQk0CiAKIHN0cnVjdCBjdGxyX2luZm87CiB0eXBlZGVmIHN0cnVjdCBjdGxyX2luZm8gY3Rscl9pbmZvX3Q7CkBAIC0zNCwyMyArMzksMjAgQEAKIAlpbnQgCWN5bGluZGVyczsKIAlpbnQJcmFpZF9sZXZlbDsgLyogc2V0IHRvIC0xIHRvIGluZGljYXRlIHRoYXQKIAkJCSAgICAgKiB0aGUgZHJpdmUgaXMgbm90IGluIHVzZS9jb25maWd1cmVkCi0JCQkgICAgKi8KLQlpbnQJYnVzeV9jb25maWd1cmluZzsgLypUaGlzIGlzIHNldCB3aGVuIHRoZSBkcml2ZSBpcyBiZWluZyByZW1vdmVkCi0JCQkJICAgKnRvIHByZXZlbnQgaXQgZnJvbSBiZWluZyBvcGVuZWQgb3IgaXQncyBxdWV1ZQotCQkJCSAgICpmcm9tIGJlaW5nIHN0YXJ0ZWQuCi0JCQkJICAqLwotCV9fdTggc2VyaWFsX25vWzE2XTsgLyogZnJvbSBpbnF1aXJ5IHBhZ2UgMHg4MywgKi8KLQkJCSAgICAvKiBub3QgbmVjYy4gbnVsbCB0ZXJtaW5hdGVkLiAqLworCQkJICAgICAqLworCWludAlidXN5X2NvbmZpZ3VyaW5nOyAvKiBUaGlzIGlzIHNldCB3aGVuIGEgZHJpdmUgaXMgYmVpbmcgcmVtb3ZlZAorCQkJCSAgICogdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIG9wZW5lZCBvciBpdCdzCisJCQkJICAgKiBxdWV1ZSBmcm9tIGJlaW5nIHN0YXJ0ZWQuCisJCQkJICAgKi8KKwlzdHJ1Y3QJZGV2aWNlIGRldjsKKwlfX3U4IHNlcmlhbF9ub1sxNl07IC8qIGZyb20gaW5xdWlyeSBwYWdlIDB4ODMsCisJCQkgICAgICogbm90IG5lY2MuIG51bGwgdGVybWluYXRlZC4KKwkJCSAgICAgKi8KKwljaGFyIHZlbmRvcltWRU5ET1JfTEVOICsgMV07IC8qIFNDU0kgdmVuZG9yIHN0cmluZyAqLworCWNoYXIgbW9kZWxbTU9ERUxfTEVOICsgMV07ICAgLyogU0NTSSBtb2RlbCBzdHJpbmcgKi8KKwljaGFyIHJldltSRVZfTEVOICsgMV07ICAgICAgIC8qIFNDU0kgcmV2aXNpb24gc3RyaW5nICovCiB9IGRyaXZlX2luZm9fc3RydWN0OwogCi0jaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCi0KLXN0cnVjdCBzZW5kY21kX3JlamVjdF9saXN0IHsKLQlpbnQgbmNvbXBsZXRpb25zOwotCXVuc2lnbmVkIGxvbmcgKmNvbXBsZXRlOyAvKiBhcnJheSBvZiBOUl9DTURTIHRhZ3MgKi8KLX07Ci0KLSNlbmRpZgogc3RydWN0IGN0bHJfaW5mbyAKIHsKIAlpbnQJY3RscjsKQEAgLTExOCwxMSArMTIwLDExIEBACiAJdm9pZCAqc2NzaV9jdGxyOyAvKiBwdHIgdG8gc3RydWN0dXJlIGNvbnRhaW5pbmcgc2NzaSByZWxhdGVkIHN0dWZmICovCiAJLyogbGlzdCBvZiBibG9jayBzaWRlIGNvbW1hbmRzIHRoZSBzY3NpIGVycm9yIGhhbmRsaW5nIHN1Y2tlZCB1cCAqLwogCS8qIGFuZCBzYXZlZCBmb3IgbGF0ZXIgcHJvY2Vzc2luZyAqLwotCXN0cnVjdCBzZW5kY21kX3JlamVjdF9saXN0IHNjc2lfcmVqZWN0czsKICNlbmRpZgogCXVuc2lnbmVkIGNoYXIgYWxpdmU7CiAJc3RydWN0IGNvbXBsZXRpb24gKnJlc2Nhbl93YWl0OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2Npc3Nfc2Nhbl90aHJlYWQ7CisJc3RydWN0IGRldmljZSBkZXY7CiB9OwogCiAvKiAgRGVmaW5pbmcgdGhlIGRpZmZlbnQgYWNjZXNzX21lbnRob2RzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX2NtZC5oIGIvZHJpdmVycy9ibG9jay9jY2lzc19jbWQuaAppbmRleCA0MGIxYjkyLi5jZDY2NWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX2NtZC5oCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3NfY21kLmgKQEAgLTIxNyw2ICsyMTcsOCBAQAogICBMb2dEZXZBZGRyX3N0cnVjdCAgTG9nRGV2OwogfSBMVU5BZGRyX3N0cnVjdDsKIAorI2RlZmluZSBDVExSX0xVTklEICJcMFwwXDBcMFwwXDBcMFwwIgorCiB0eXBlZGVmIHN0cnVjdCBfQ29tbWFuZExpc3RIZWFkZXJfc3RydWN0IHsKICAgQllURSAgICAgICAgICAgICAgUmVwbHlRdWV1ZTsKICAgQllURSAgICAgICAgICAgICAgU0dMaXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jY2lzc19zY3NpLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuYwppbmRleCBhM2ZkODdiLi4zMzE1MjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzX3Njc2kuYwpAQCAtNDQsMjAgKzQ0LDEzIEBACiAjZGVmaW5lIENDSVNTX0FCT1JUX01TRyAweDAwCiAjZGVmaW5lIENDSVNTX1JFU0VUX01TRyAweDAxCiAKLS8qIHNvbWUgcHJvdG90eXBlcy4uLiAqLyAKLXN0YXRpYyBpbnQgc2VuZGNtZCgKLQlfX3U4CWNtZCwKLQlpbnQJY3RsciwKLQl2b2lkCSpidWZmLAotCXNpemVfdAlzaXplLAotCXVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sIC8qIDA6IGFkZHJlc3MgdGhlIGNvbnRyb2xsZXIsCi0JCQkJICAgICAgMTogYWRkcmVzcyBsb2dpY2FsIHZvbHVtZSBsb2dfdW5pdCwgCi0JCQkJICAgICAgMjogYWRkcmVzcyBpcyBpbiBzY3NpM2FkZHIgKi8KLQl1bnNpZ25lZCBpbnQgbG9nX3VuaXQsCi0JX191OAlwYWdlX2NvZGUsCi0JdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLAorc3RhdGljIGludCBmaWxsX2NtZChDb21tYW5kTGlzdF9zdHJ1Y3QgKmMsIF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwKKwlzaXplX3Qgc2l6ZSwKKwlfX3U4IHBhZ2VfY29kZSwgdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLAogCWludCBjbWRfdHlwZSk7CiAKK3N0YXRpYyBDb21tYW5kTGlzdF9zdHJ1Y3QgKmNtZF9hbGxvYyhjdGxyX2luZm9fdCAqaCwgaW50IGdldF9mcm9tX3Bvb2wpOworc3RhdGljIHZvaWQgY21kX2ZyZWUoY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqYywgaW50IGdvdF9mcm9tX3Bvb2wpOwogCiBzdGF0aWMgaW50IGNjaXNzX3Njc2lfcHJvY19pbmZvKAogCQlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaCwKQEAgLTE1NzUsNiArMTU2OCw3NSBAQAogCUNQUV9UQVBFX1VOTE9DSyhjdGxyLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBpbnQgd2FpdF9mb3JfZGV2aWNlX3RvX2JlY29tZV9yZWFkeShjdGxyX2luZm9fdCAqaCwKKwl1bnNpZ25lZCBjaGFyIGx1bmFkZHJbXSkKK3sKKwlpbnQgcmM7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgd2FpdHRpbWUgPSBIWjsKKwlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7CisKKwljID0gY21kX2FsbG9jKGgsIDEpOworCWlmICghYykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiBvdXQgb2YgbWVtb3J5IGluICIKKwkJCSJ3YWl0X2Zvcl9kZXZpY2VfdG9fYmVjb21lX3JlYWR5LlxuIiwgaC0+Y3Rscik7CisJCXJldHVybiBJT19FUlJPUjsKKwl9CisKKwkvKiBTZW5kIHRlc3QgdW5pdCByZWFkeSB1bnRpbCBkZXZpY2UgcmVhZHksIG9yIGdpdmUgdXAuICovCisJd2hpbGUgKGNvdW50IDwgMjApIHsKKworCQkvKiBXYWl0IGZvciBhIGJpdC4gIGRvIHRoaXMgZmlyc3QsIGJlY2F1c2UgaWYgd2Ugc2VuZAorCQkgKiB0aGUgVFVSIHJpZ2h0IGF3YXksIHRoZSByZXNldCB3aWxsIGp1c3QgYWJvcnQgaXQuCisJCSAqLworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSh3YWl0dGltZSk7CisJCWNvdW50Kys7CisKKwkJLyogSW5jcmVhc2Ugd2FpdCB0aW1lIHdpdGggZWFjaCB0cnksIHVwIHRvIGEgcG9pbnQuICovCisJCWlmICh3YWl0dGltZSA8IChIWiAqIDMwKSkKKwkJCXdhaXR0aW1lID0gd2FpdHRpbWUgKiAyOworCisJCS8qIFNlbmQgdGhlIFRlc3QgVW5pdCBSZWFkeSAqLworCQlyYyA9IGZpbGxfY21kKGMsIFRFU1RfVU5JVF9SRUFEWSwgaC0+Y3RsciwgTlVMTCwgMCwgMCwKKwkJCWx1bmFkZHIsIFRZUEVfQ01EKTsKKwkJaWYgKHJjID09IDApCisJCQlyYyA9IHNlbmRjbWRfd2l0aGlycV9jb3JlKGgsIGMsIDApOworCisJCSh2b2lkKSBwcm9jZXNzX3NlbmRjbWRfZXJyb3IoaCwgYyk7CisKKwkJaWYgKHJjICE9IDApCisJCQlnb3RvIHJldHJ5X3R1cjsKKworCQlpZiAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPT0gQ01EX1NVQ0NFU1MpCisJCQlicmVhazsKKworCQlpZiAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPT0gQ01EX1RBUkdFVF9TVEFUVVMgJiYKKwkJCWMtPmVycl9pbmZvLT5TY3NpU3RhdHVzID09IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTikgeworCQkJaWYgKGMtPmVycl9pbmZvLT5TZW5zZUluZm9bMl0gPT0gTk9fU0VOU0UpCisJCQkJYnJlYWs7CisJCQlpZiAoYy0+ZXJyX2luZm8tPlNlbnNlSW5mb1syXSA9PSBVTklUX0FUVEVOVElPTikgeworCQkJCXVuc2lnbmVkIGNoYXIgYXNjOworCQkJCWFzYyA9IGMtPmVycl9pbmZvLT5TZW5zZUluZm9bMTJdOworCQkJCWNoZWNrX2Zvcl91bml0X2F0dGVudGlvbihoLCBjKTsKKwkJCQlpZiAoYXNjID09IFBPV0VSX09SX1JFU0VUKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorcmV0cnlfdHVyOgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiBXYWl0aW5nICVkIHNlY3MgIgorCQkJImZvciBkZXZpY2UgdG8gYmVjb21lIHJlYWR5LlxuIiwKKwkJCWgtPmN0bHIsIHdhaXR0aW1lIC8gSFopOworCQlyYyA9IDE7IC8qIGRldmljZSBub3QgcmVhZHkuICovCisJfQorCisJaWYgKHJjKQorCQlwcmludGsoImNjaXNzJWQ6IGdpdmluZyB1cCBvbiBkZXZpY2UuXG4iLCBoLT5jdGxyKTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IGRldmljZSBpcyByZWFkeS5cbiIsIGgtPmN0bHIpOworCisJY21kX2ZyZWUoaCwgYywgMSk7CisJcmV0dXJuIHJjOworfQogCiAvKiBOZWVkIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBlcnJvciBoYW5kbGVycyB0byBrZWVwIC4uL3Njc2kvaG9zdHMuYyBmcm9tIAogICogY29tcGxhaW5pbmcuICBEb2luZyBhIGhvc3QtIG9yIGJ1cy1yZXNldCBjYW4ndCBkbyBhbnl0aGluZyBnb29kIGhlcmUuIApAQCAtMTU5MSw2ICsxNjUzLDcgQEAKIHsKIAlpbnQgcmM7CiAJQ29tbWFuZExpc3Rfc3RydWN0ICpjbWRfaW5fdHJvdWJsZTsKKwl1bnNpZ25lZCBjaGFyIGx1bmFkZHJbOF07CiAJY3Rscl9pbmZvX3QgKipjOwogCWludCBjdGxyOwogCkBAIC0xNjAwLDE5ICsxNjYzLDE1IEBACiAJCXJldHVybiBGQUlMRUQ7CiAJY3RsciA9ICgqYyktPmN0bHI7CiAJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogcmVzZXR0aW5nIHRhcGUgZHJpdmUgb3IgbWVkaXVtIGNoYW5nZXIuXG4iLCBjdGxyKTsKLQogCS8qIGZpbmQgdGhlIGNvbW1hbmQgdGhhdCdzIGdpdmluZyB1cyB0cm91YmxlICovCiAJY21kX2luX3Ryb3VibGUgPSAoQ29tbWFuZExpc3Rfc3RydWN0ICopIHNjc2ljbWQtPmhvc3Rfc2NyaWJibGU7Ci0JaWYgKGNtZF9pbl90cm91YmxlID09IE5VTEwpIHsgLyogcGFyYW5vaWEgKi8KKwlpZiAoY21kX2luX3Ryb3VibGUgPT0gTlVMTCkgLyogcGFyYW5vaWEgKi8KIAkJcmV0dXJuIEZBSUxFRDsKLQl9CisJbWVtY3B5KGx1bmFkZHIsICZjbWRfaW5fdHJvdWJsZS0+SGVhZGVyLkxVTi5MdW5BZGRyQnl0ZXNbMF0sIDgpOwogCS8qIHNlbmQgYSByZXNldCB0byB0aGUgU0NTSSBMVU4gd2hpY2ggdGhlIGNvbW1hbmQgd2FzIHNlbnQgdG8gKi8KLQlyYyA9IHNlbmRjbWQoQ0NJU1NfUkVTRVRfTVNHLCBjdGxyLCBOVUxMLCAwLCAyLCAwLCAwLCAKLQkJKHVuc2lnbmVkIGNoYXIgKikgJmNtZF9pbl90cm91YmxlLT5IZWFkZXIuTFVOLkx1bkFkZHJCeXRlc1swXSwgCisJcmMgPSBzZW5kY21kX3dpdGhpcnEoQ0NJU1NfUkVTRVRfTVNHLCBjdGxyLCBOVUxMLCAwLCAwLCBsdW5hZGRyLAogCQlUWVBFX01TRyk7Ci0JLyogc2VuZGNtZCB0dXJuZWQgb2ZmIGludGVycnVwdHMgb24gdGhlIGJvYXJkLCB0dXJuICdlbSBiYWNrIG9uLiAqLwotCSgqYyktPmFjY2Vzcy5zZXRfaW50cl9tYXNrKCpjLCBDQ0lTU19JTlRSX09OKTsKLQlpZiAocmMgPT0gMCkKKwlpZiAocmMgPT0gMCAmJiB3YWl0X2Zvcl9kZXZpY2VfdG9fYmVjb21lX3JlYWR5KCpjLCBsdW5hZGRyKSA9PSAwKQogCQlyZXR1cm4gU1VDQ0VTUzsKIAlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiByZXNldHRpbmcgZGV2aWNlIGZhaWxlZC5cbiIsIGN0bHIpOwogCXJldHVybiBGQUlMRUQ7CkBAIC0xNjIyLDYgKzE2ODEsNyBAQAogewogCWludCByYzsKIAlDb21tYW5kTGlzdF9zdHJ1Y3QgKmNtZF90b19hYm9ydDsKKwl1bnNpZ25lZCBjaGFyIGx1bmFkZHJbOF07CiAJY3Rscl9pbmZvX3QgKipjOwogCWludCBjdGxyOwogCkBAIC0xNjM2LDEyICsxNjk2LDkgQEAKIAljbWRfdG9fYWJvcnQgPSAoQ29tbWFuZExpc3Rfc3RydWN0ICopIHNjc2ljbWQtPmhvc3Rfc2NyaWJibGU7CiAJaWYgKGNtZF90b19hYm9ydCA9PSBOVUxMKSAvKiBwYXJhbm9pYSAqLwogCQlyZXR1cm4gRkFJTEVEOwotCXJjID0gc2VuZGNtZChDQ0lTU19BQk9SVF9NU0csIGN0bHIsICZjbWRfdG9fYWJvcnQtPkhlYWRlci5UYWcsIAotCQkwLCAyLCAwLCAwLCAKLQkJKHVuc2lnbmVkIGNoYXIgKikgJmNtZF90b19hYm9ydC0+SGVhZGVyLkxVTi5MdW5BZGRyQnl0ZXNbMF0sIAotCQlUWVBFX01TRyk7Ci0JLyogc2VuZGNtZCB0dXJuZWQgb2ZmIGludGVycnVwdHMgb24gdGhlIGJvYXJkLCB0dXJuICdlbSBiYWNrIG9uLiAqLwotCSgqYyktPmFjY2Vzcy5zZXRfaW50cl9tYXNrKCpjLCBDQ0lTU19JTlRSX09OKTsKKwltZW1jcHkobHVuYWRkciwgJmNtZF90b19hYm9ydC0+SGVhZGVyLkxVTi5MdW5BZGRyQnl0ZXNbMF0sIDgpOworCXJjID0gc2VuZGNtZF93aXRoaXJxKENDSVNTX0FCT1JUX01TRywgY3RsciwgJmNtZF90b19hYm9ydC0+SGVhZGVyLlRhZywKKwkJMCwgMCwgbHVuYWRkciwgVFlQRV9NU0cpOwogCWlmIChyYyA9PSAwKQogCQlyZXR1cm4gU1VDQ0VTUzsKIAlyZXR1cm4gRkFJTEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jIGIvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCmluZGV4IGNhMjY4Y2EuLjQ0ZmEyMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYworKysgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKQEAgLTQ3NCw3ICs0NzQsNyBAQAogCQlkaXNrLT5mb3BzID0gJmlkYV9mb3BzOwogCQlpZiAoaiAmJiAhZHJ2LT5ucl9ibGtzKQogCQkJY29udGludWU7Ci0JCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGhiYVtpXS0+cXVldWUsIGRydi0+YmxrX3NpemUpOworCQlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGhiYVtpXS0+cXVldWUsIGRydi0+YmxrX3NpemUpOwogCQlzZXRfY2FwYWNpdHkoZGlzaywgZHJ2LT5ucl9ibGtzKTsKIAkJZGlzay0+cXVldWUgPSBoYmFbaV0tPnF1ZXVlOwogCQlkaXNrLT5wcml2YXRlX2RhdGEgPSBkcnY7CkBAIC05MDMsNyArOTAzLDcgQEAKIAkJZ290byBzdGFydGlvOwogCiBxdWV1ZV9uZXh0OgotCWNyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCWNyZXEgPSBibGtfcGVla19yZXF1ZXN0KHEpOwogCWlmICghY3JlcSkKIAkJZ290byBzdGFydGlvOwogCkBAIC05MTIsMTcgKzkxMiwxOCBAQAogCWlmICgoYyA9IGNtZF9hbGxvYyhoLDEpKSA9PSBOVUxMKQogCQlnb3RvIHN0YXJ0aW87CiAKLQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KGNyZXEpOworCWJsa19zdGFydF9yZXF1ZXN0KGNyZXEpOwogCiAJYy0+Y3RsciA9IGgtPmN0bHI7CiAJYy0+aGRyLnVuaXQgPSAoZHJ2X2luZm9fdCAqKShjcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGEpIC0gaC0+ZHJ2OwogCWMtPmhkci5zaXplID0gc2l6ZW9mKHJibGtfdCkgPj4gMjsKIAljLT5zaXplICs9IHNpemVvZihyYmxrX3QpOwogCi0JYy0+cmVxLmhkci5ibGsgPSBjcmVxLT5zZWN0b3I7CisJYy0+cmVxLmhkci5ibGsgPSBibGtfcnFfcG9zKGNyZXEpOwogCWMtPnJxID0gY3JlcTsKIERCR1BYKAotCXByaW50aygic2VjdG9yPSVkLCBucl9zZWN0b3JzPSVkXG4iLCBjcmVxLT5zZWN0b3IsIGNyZXEtPm5yX3NlY3RvcnMpOworCXByaW50aygic2VjdG9yPSVkLCBucl9zZWN0b3JzPSV1XG4iLAorCSAgICAgICBibGtfcnFfcG9zKGNyZXEpLCBibGtfcnFfc2VjdG9ycyhjcmVxKSk7CiApOwogCXNnX2luaXRfdGFibGUodG1wX3NnLCBTR19NQVgpOwogCXNlZyA9IGJsa19ycV9tYXBfc2cocSwgY3JlcSwgdG1wX3NnKTsKQEAgLTk0MCw5ICs5NDEsOSBAQAogCQkJCQkJIHRtcF9zZ1tpXS5vZmZzZXQsCiAJCQkJCQkgdG1wX3NnW2ldLmxlbmd0aCwgZGlyKTsKIAl9Ci1EQkdQWCgJcHJpbnRrKCJTdWJtaXR0aW5nICVkIHNlY3RvcnMgaW4gJWQgc2VnbWVudHNcbiIsIGNyZXEtPm5yX3NlY3RvcnMsIHNlZyk7ICk7CitEQkdQWCgJcHJpbnRrKCJTdWJtaXR0aW5nICV1IHNlY3RvcnMgaW4gJWQgc2VnbWVudHNcbiIsIGJsa19ycV9zZWN0b3JzKGNyZXEpLCBzZWcpOyApOwogCWMtPnJlcS5oZHIuc2dfY250ID0gc2VnOwotCWMtPnJlcS5oZHIuYmxrX2NudCA9IGNyZXEtPm5yX3NlY3RvcnM7CisJYy0+cmVxLmhkci5ibGtfY250ID0gYmxrX3JxX3NlY3RvcnMoY3JlcSk7CiAJYy0+cmVxLmhkci5jbWQgPSAocnFfZGF0YV9kaXIoY3JlcSkgPT0gUkVBRCkgPyBJREFfUkVBRCA6IElEQV9XUklURTsKIAljLT50eXBlID0gQ01EX1JXUkVROwogCkBAIC0xMDI0LDggKzEwMjUsNyBAQAogCQkJCWNtZC0+cmVxLnNnW2ldLnNpemUsIGRkaXIpOwogCiAJREJHUFgocHJpbnRrKCJEb25lIHdpdGggJXBcbiIsIHJxKTspOwotCWlmIChfX2Jsa19lbmRfcmVxdWVzdChycSwgZXJyb3IsIGJsa19ycV9ieXRlcyhycSkpKQotCQlCVUcoKTsKKwlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocnEsIGVycm9yKTsKIH0KIAogLyoKQEAgLTE1NDYsNyArMTU0Niw3IEBACiAJCWRydl9pbmZvX3QgKmRydiA9ICZob3N0LT5kcnZbaV07CiAJCWlmIChpICYmICFkcnYtPm5yX2Jsa3MpCiAJCQljb250aW51ZTsKLQkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoaG9zdC0+cXVldWUsIGRydi0+YmxrX3NpemUpOworCQlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGhvc3QtPnF1ZXVlLCBkcnYtPmJsa19zaXplKTsKIAkJc2V0X2NhcGFjaXR5KGRpc2ssIGRydi0+bnJfYmxrcyk7CiAJCWRpc2stPnF1ZXVlID0gaG9zdC0+cXVldWU7CiAJCWRpc2stPnByaXZhdGVfZGF0YSA9IGRydjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMgYi9kcml2ZXJzL2Jsb2NrL2Zsb3BweS5jCmluZGV4IDEzMDBkZjYuLjg2MmI0MGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svZmxvcHB5LmMKKysrIGIvZHJpdmVycy9ibG9jay9mbG9wcHkuYwpAQCAtOTMxLDcgKzkzMSw3IEBACiAJZGVsX3RpbWVyKCZmZF90aW1lb3V0KTsKIAljb250ID0gTlVMTDsKIAljbGVhcl9iaXQoMCwgJmZkY19idXN5KTsKLQlpZiAoZWx2X25leHRfcmVxdWVzdChmbG9wcHlfcXVldWUpKQorCWlmIChjdXJyZW50X3JlcSB8fCBibGtfcGVla19yZXF1ZXN0KGZsb3BweV9xdWV1ZSkpCiAJCWRvX2ZkX3JlcXVlc3QoZmxvcHB5X3F1ZXVlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmbG9wcHlfbG9jaywgZmxhZ3MpOwogCXdha2VfdXAoJmZkY193YWl0KTsKQEAgLTIzMDMsNyArMjMwMyw3IEBACiAKIAkvKiBjdXJyZW50X2NvdW50X3NlY3RvcnMgY2FuIGJlIHplcm8gaWYgdHJhbnNmZXIgZmFpbGVkICovCiAJaWYgKGVycm9yKQotCQlucl9zZWN0b3JzID0gcmVxLT5jdXJyZW50X25yX3NlY3RvcnM7CisJCW5yX3NlY3RvcnMgPSBibGtfcnFfY3VyX3NlY3RvcnMocmVxKTsKIAlpZiAoX19ibGtfZW5kX3JlcXVlc3QocmVxLCBlcnJvciwgbnJfc2VjdG9ycyA8PCA5KSkKIAkJcmV0dXJuOwogCkBAIC0yMzMyLDcgKzIzMzIsNyBAQAogCWlmICh1cHRvZGF0ZSkgewogCQkvKiBtYWludGFpbiB2YWx1ZXMgZm9yIGludmFsaWRhdGlvbiBvbiBnZW9tZXRyeQogCQkgKiBjaGFuZ2UgKi8KLQkJYmxvY2sgPSBjdXJyZW50X2NvdW50X3NlY3RvcnMgKyByZXEtPnNlY3RvcjsKKwkJYmxvY2sgPSBjdXJyZW50X2NvdW50X3NlY3RvcnMgKyBibGtfcnFfcG9zKHJlcSk7CiAJCUlORkJPVU5EKERSUy0+bWF4YmxvY2ssIGJsb2NrKTsKIAkJaWYgKGJsb2NrID4gX2Zsb3BweS0+c2VjdCkKIAkJCURSUy0+bWF4dHJhY2sgPSAxOwpAQCAtMjM0NiwxMCArMjM0NiwxMCBAQAogCQkJLyogcmVjb3JkIHdyaXRlIGVycm9yIGluZm9ybWF0aW9uICovCiAJCQlEUldFLT53cml0ZV9lcnJvcnMrKzsKIAkJCWlmIChEUldFLT53cml0ZV9lcnJvcnMgPT0gMSkgewotCQkJCURSV0UtPmZpcnN0X2Vycm9yX3NlY3RvciA9IHJlcS0+c2VjdG9yOworCQkJCURSV0UtPmZpcnN0X2Vycm9yX3NlY3RvciA9IGJsa19ycV9wb3MocmVxKTsKIAkJCQlEUldFLT5maXJzdF9lcnJvcl9nZW5lcmF0aW9uID0gRFJTLT5nZW5lcmF0aW9uOwogCQkJfQotCQkJRFJXRS0+bGFzdF9lcnJvcl9zZWN0b3IgPSByZXEtPnNlY3RvcjsKKwkJCURSV0UtPmxhc3RfZXJyb3Jfc2VjdG9yID0gYmxrX3JxX3BvcyhyZXEpOwogCQkJRFJXRS0+bGFzdF9lcnJvcl9nZW5lcmF0aW9uID0gRFJTLT5nZW5lcmF0aW9uOwogCQl9CiAJCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKQEAgLTI1MDMsMjQgKzI1MDMsMjMgQEAKIAogCW1heF9zZWN0b3IgPSB0cmFuc2Zlcl9zaXplKHNzaXplLAogCQkJCSAgIG1pbihtYXhfc2VjdG9yLCBtYXhfc2VjdG9yXzIpLAotCQkJCSAgIGN1cnJlbnRfcmVxLT5ucl9zZWN0b3JzKTsKKwkJCQkgICBibGtfcnFfc2VjdG9ycyhjdXJyZW50X3JlcSkpOwogCiAJaWYgKGN1cnJlbnRfY291bnRfc2VjdG9ycyA8PSAwICYmIENUKENPTU1BTkQpID09IEZEX1dSSVRFICYmCi0JICAgIGJ1ZmZlcl9tYXggPiBmc2VjdG9yX3QgKyBjdXJyZW50X3JlcS0+bnJfc2VjdG9ycykKKwkgICAgYnVmZmVyX21heCA+IGZzZWN0b3JfdCArIGJsa19ycV9zZWN0b3JzKGN1cnJlbnRfcmVxKSkKIAkJY3VycmVudF9jb3VudF9zZWN0b3JzID0gbWluX3QoaW50LCBidWZmZXJfbWF4IC0gZnNlY3Rvcl90LAotCQkJCQkgICAgICBjdXJyZW50X3JlcS0+bnJfc2VjdG9ycyk7CisJCQkJCSAgICAgIGJsa19ycV9zZWN0b3JzKGN1cnJlbnRfcmVxKSk7CiAKIAlyZW1haW5pbmcgPSBjdXJyZW50X2NvdW50X3NlY3RvcnMgPDwgOTsKICNpZmRlZiBGTE9QUFlfU0FOSVRZX0NIRUNLCi0JaWYgKChyZW1haW5pbmcgPj4gOSkgPiBjdXJyZW50X3JlcS0+bnJfc2VjdG9ycyAmJgotCSAgICBDVChDT01NQU5EKSA9PSBGRF9XUklURSkgeworCWlmIChyZW1haW5pbmcgPiBibGtfcnFfYnl0ZXMoY3VycmVudF9yZXEpICYmIENUKENPTU1BTkQpID09IEZEX1dSSVRFKSB7CiAJCURQUklOVCgiaW4gY29weSBidWZmZXJcbiIpOwogCQlwcmludGsoImN1cnJlbnRfY291bnRfc2VjdG9ycz0lbGRcbiIsIGN1cnJlbnRfY291bnRfc2VjdG9ycyk7CiAJCXByaW50aygicmVtYWluaW5nPSVkXG4iLCByZW1haW5pbmcgPj4gOSk7Ci0JCXByaW50aygiY3VycmVudF9yZXEtPm5yX3NlY3RvcnM9JWxkXG4iLAotCQkgICAgICAgY3VycmVudF9yZXEtPm5yX3NlY3RvcnMpOworCQlwcmludGsoImN1cnJlbnRfcmVxLT5ucl9zZWN0b3JzPSV1XG4iLAorCQkgICAgICAgYmxrX3JxX3NlY3RvcnMoY3VycmVudF9yZXEpKTsKIAkJcHJpbnRrKCJjdXJyZW50X3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzPSV1XG4iLAotCQkgICAgICAgY3VycmVudF9yZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisJCSAgICAgICBibGtfcnFfY3VyX3NlY3RvcnMoY3VycmVudF9yZXEpKTsKIAkJcHJpbnRrKCJtYXhfc2VjdG9yPSVkXG4iLCBtYXhfc2VjdG9yKTsKIAkJcHJpbnRrKCJzc2l6ZT0lZFxuIiwgc3NpemUpOwogCX0KQEAgLTI1MzAsNyArMjUyOSw3IEBACiAKIAlkbWFfYnVmZmVyID0gZmxvcHB5X3RyYWNrX2J1ZmZlciArICgoZnNlY3Rvcl90IC0gYnVmZmVyX21pbikgPDwgOSk7CiAKLQlzaXplID0gY3VycmVudF9yZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA8PCA5OworCXNpemUgPSBibGtfcnFfY3VyX2J5dGVzKGN1cnJlbnRfcmVxKTsKIAogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIGN1cnJlbnRfcmVxLCBpdGVyKSB7CiAJCWlmICghcmVtYWluaW5nKQpAQCAtMjY0OCwxMCArMjY0NywxMCBAQAogCiAJbWF4X3NlY3RvciA9IF9mbG9wcHktPnNlY3QgKiBfZmxvcHB5LT5oZWFkOwogCi0JVFJBQ0sgPSAoaW50KWN1cnJlbnRfcmVxLT5zZWN0b3IgLyBtYXhfc2VjdG9yOwotCWZzZWN0b3JfdCA9IChpbnQpY3VycmVudF9yZXEtPnNlY3RvciAlIG1heF9zZWN0b3I7CisJVFJBQ0sgPSAoaW50KWJsa19ycV9wb3MoY3VycmVudF9yZXEpIC8gbWF4X3NlY3RvcjsKKwlmc2VjdG9yX3QgPSAoaW50KWJsa19ycV9wb3MoY3VycmVudF9yZXEpICUgbWF4X3NlY3RvcjsKIAlpZiAoX2Zsb3BweS0+dHJhY2sgJiYgVFJBQ0sgPj0gX2Zsb3BweS0+dHJhY2spIHsKLQkJaWYgKGN1cnJlbnRfcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgJiAxKSB7CisJCWlmIChibGtfcnFfY3VyX3NlY3RvcnMoY3VycmVudF9yZXEpICYgMSkgewogCQkJY3VycmVudF9jb3VudF9zZWN0b3JzID0gMTsKIAkJCXJldHVybiAxOwogCQl9IGVsc2UKQEAgLTI2NjksNyArMjY2OCw3IEBACiAJCWlmIChmc2VjdG9yX3QgPj0gbWF4X3NlY3RvcikgewogCQkJY3VycmVudF9jb3VudF9zZWN0b3JzID0KIAkJCSAgICBtaW5fdChpbnQsIF9mbG9wcHktPnNlY3QgLSBmc2VjdG9yX3QsCi0JCQkJICBjdXJyZW50X3JlcS0+bnJfc2VjdG9ycyk7CisJCQkJICBibGtfcnFfc2VjdG9ycyhjdXJyZW50X3JlcSkpOwogCQkJcmV0dXJuIDE7CiAJCX0KIAkJU0laRUNPREUgPSAyOwpAQCAtMjcyMCw3ICsyNzE5LDcgQEAKIAogCWluX3NlY3Rvcl9vZmZzZXQgPSAoZnNlY3Rvcl90ICUgX2Zsb3BweS0+c2VjdCkgJSBzc2l6ZTsKIAlhbGlnbmVkX3NlY3Rvcl90ID0gZnNlY3Rvcl90IC0gaW5fc2VjdG9yX29mZnNldDsKLQltYXhfc2l6ZSA9IGN1cnJlbnRfcmVxLT5ucl9zZWN0b3JzOworCW1heF9zaXplID0gYmxrX3JxX3NlY3RvcnMoY3VycmVudF9yZXEpOwogCWlmICgocmF3X2NtZC0+dHJhY2sgPT0gYnVmZmVyX3RyYWNrKSAmJgogCSAgICAoY3VycmVudF9kcml2ZSA9PSBidWZmZXJfZHJpdmUpICYmCiAJICAgIChmc2VjdG9yX3QgPj0gYnVmZmVyX21pbikgJiYgKGZzZWN0b3JfdCA8IGJ1ZmZlcl9tYXgpKSB7CkBAIC0yNzI5LDEwICsyNzI4LDEwIEBACiAJCQljb3B5X2J1ZmZlcigxLCBtYXhfc2VjdG9yLCBidWZmZXJfbWF4KTsKIAkJCXJldHVybiAxOwogCQl9Ci0JfSBlbHNlIGlmIChpbl9zZWN0b3Jfb2Zmc2V0IHx8IGN1cnJlbnRfcmVxLT5ucl9zZWN0b3JzIDwgc3NpemUpIHsKKwl9IGVsc2UgaWYgKGluX3NlY3Rvcl9vZmZzZXQgfHwgYmxrX3JxX3NlY3RvcnMoY3VycmVudF9yZXEpIDwgc3NpemUpIHsKIAkJaWYgKENUKENPTU1BTkQpID09IEZEX1dSSVRFKSB7Ci0JCQlpZiAoZnNlY3Rvcl90ICsgY3VycmVudF9yZXEtPm5yX3NlY3RvcnMgPiBzc2l6ZSAmJgotCQkJICAgIGZzZWN0b3JfdCArIGN1cnJlbnRfcmVxLT5ucl9zZWN0b3JzIDwgc3NpemUgKyBzc2l6ZSkKKwkJCWlmIChmc2VjdG9yX3QgKyBibGtfcnFfc2VjdG9ycyhjdXJyZW50X3JlcSkgPiBzc2l6ZSAmJgorCQkJICAgIGZzZWN0b3JfdCArIGJsa19ycV9zZWN0b3JzKGN1cnJlbnRfcmVxKSA8IHNzaXplICsgc3NpemUpCiAJCQkJbWF4X3NpemUgPSBzc2l6ZSArIHNzaXplOwogCQkJZWxzZQogCQkJCW1heF9zaXplID0gc3NpemU7CkBAIC0yNzc2LDcgKzI3NzUsNyBAQAogCQkgICAgKGluZGlyZWN0ICogMiA+IGRpcmVjdCAqIDMgJiYKIAkJICAgICAqZXJyb3JzIDwgRFAtPm1heF9lcnJvcnMucmVhZF90cmFjayAmJiAoKCFwcm9iaW5nCiAJCSAgICAgICB8fCAoRFAtPnJlYWRfdHJhY2sgJiAoMSA8PCBEUlMtPnByb2JlZF9mb3JtYXQpKSkpKSkgewotCQkJbWF4X3NpemUgPSBjdXJyZW50X3JlcS0+bnJfc2VjdG9yczsKKwkJCW1heF9zaXplID0gYmxrX3JxX3NlY3RvcnMoY3VycmVudF9yZXEpOwogCQl9IGVsc2UgewogCQkJcmF3X2NtZC0+a2VybmVsX2RhdGEgPSBjdXJyZW50X3JlcS0+YnVmZmVyOwogCQkJcmF3X2NtZC0+bGVuZ3RoID0gY3VycmVudF9jb3VudF9zZWN0b3JzIDw8IDk7CkBAIC0yODAxLDcgKzI4MDAsNyBAQAogCSAgICBmc2VjdG9yX3QgPiBidWZmZXJfbWF4IHx8CiAJICAgIGZzZWN0b3JfdCA8IGJ1ZmZlcl9taW4gfHwKIAkgICAgKChDVChDT01NQU5EKSA9PSBGRF9SRUFEIHx8Ci0JICAgICAgKCFpbl9zZWN0b3Jfb2Zmc2V0ICYmIGN1cnJlbnRfcmVxLT5ucl9zZWN0b3JzID49IHNzaXplKSkgJiYKKwkgICAgICAoIWluX3NlY3Rvcl9vZmZzZXQgJiYgYmxrX3JxX3NlY3RvcnMoY3VycmVudF9yZXEpID49IHNzaXplKSkgJiYKIAkgICAgIG1heF9zZWN0b3IgPiAyICogbWF4X2J1ZmZlcl9zZWN0b3JzICsgYnVmZmVyX21pbiAmJgogCSAgICAgbWF4X3NpemUgKyBmc2VjdG9yX3QgPiAyICogbWF4X2J1ZmZlcl9zZWN0b3JzICsgYnVmZmVyX21pbikKIAkgICAgLyogbm90IGVub3VnaCBzcGFjZSAqLwpAQCAtMjg3OSw4ICsyODc4LDggQEAKIAkJCQlwcmludGsoIndyaXRlXG4iKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JfSBlbHNlIGlmIChyYXdfY21kLT5sZW5ndGggPiBjdXJyZW50X3JlcS0+bnJfc2VjdG9ycyA8PCA5IHx8Ci0JCSAgIGN1cnJlbnRfY291bnRfc2VjdG9ycyA+IGN1cnJlbnRfcmVxLT5ucl9zZWN0b3JzKSB7CisJfSBlbHNlIGlmIChyYXdfY21kLT5sZW5ndGggPiBibGtfcnFfYnl0ZXMoY3VycmVudF9yZXEpIHx8CisJCSAgIGN1cnJlbnRfY291bnRfc2VjdG9ycyA+IGJsa19ycV9zZWN0b3JzKGN1cnJlbnRfcmVxKSkgewogCQlEUFJJTlQoImJ1ZmZlciBvdmVycnVuIGluIGRpcmVjdCB0cmFuc2ZlclxuIik7CiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAocmF3X2NtZC0+bGVuZ3RoIDwgY3VycmVudF9jb3VudF9zZWN0b3JzIDw8IDkpIHsKQEAgLTI5MTMsNyArMjkxMiw3IEBACiAJCQlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCiAJCQlzcGluX2xvY2tfaXJxKGZsb3BweV9xdWV1ZS0+cXVldWVfbG9jayk7Ci0JCQlyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KGZsb3BweV9xdWV1ZSk7CisJCQlyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChmbG9wcHlfcXVldWUpOwogCQkJc3Bpbl91bmxvY2tfaXJxKGZsb3BweV9xdWV1ZS0+cXVldWVfbG9jayk7CiAJCQlpZiAoIXJlcSkgewogCQkJCWRvX2Zsb3BweSA9IE5VTEw7CkBAIC0yOTkwLDggKzI5ODksOSBAQAogCWlmICh1c2FnZV9jb3VudCA9PSAwKSB7CiAJCXByaW50aygid2FybmluZzogdXNhZ2UgY291bnQ9MCwgY3VycmVudF9yZXE9JXAgZXhpdGluZ1xuIiwKIAkJICAgICAgIGN1cnJlbnRfcmVxKTsKLQkJcHJpbnRrKCJzZWN0PSVsZCB0eXBlPSV4IGZsYWdzPSV4XG4iLCAobG9uZyljdXJyZW50X3JlcS0+c2VjdG9yLAotCQkgICAgICAgY3VycmVudF9yZXEtPmNtZF90eXBlLCBjdXJyZW50X3JlcS0+Y21kX2ZsYWdzKTsKKwkJcHJpbnRrKCJzZWN0PSVsZCB0eXBlPSV4IGZsYWdzPSV4XG4iLAorCQkgICAgICAgKGxvbmcpYmxrX3JxX3BvcyhjdXJyZW50X3JlcSksIGN1cnJlbnRfcmVxLT5jbWRfdHlwZSwKKwkJICAgICAgIGN1cnJlbnRfcmVxLT5jbWRfZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCWlmICh0ZXN0X2JpdCgwLCAmZmRjX2J1c3kpKSB7CkBAIC00MTQ4LDYgKzQxNDgsMjQgQEAKIHsKIH0KIAorc3RhdGljIGludCBmbG9wcHlfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgZmRjOworCisJZm9yIChmZGMgPSAwOyBmZGMgPCBOX0ZEQzsgZmRjKyspCisJCWlmIChGRENTLT5hZGRyZXNzICE9IC0xKQorCQkJdXNlcl9yZXNldF9mZGMoLTEsIEZEX1JFU0VUX0FMV0FZUywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZmxvcHB5X2RyaXZlciA9IHsKKwkucmVzdW1lID0gZmxvcHB5X3Jlc3VtZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJmbG9wcHkiLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBmbG9wcHlfZGV2aWNlW05fRFJJVkVdOwogCiBzdGF0aWMgc3RydWN0IGtvYmplY3QgKmZsb3BweV9maW5kKGRldl90IGRldiwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQpAQCAtNDE5NiwxMCArNDIxNCwxNCBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0X3B1dF9kaXNrOwogCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZmbG9wcHlfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnJlZ19ibGtkZXY7CisKIAlmbG9wcHlfcXVldWUgPSBibGtfaW5pdF9xdWV1ZShkb19mZF9yZXF1ZXN0LCAmZmxvcHB5X2xvY2spOwogCWlmICghZmxvcHB5X3F1ZXVlKSB7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3VucmVnX2Jsa2RldjsKKwkJZ290byBvdXRfdW5yZWdfZHJpdmVyOwogCX0KIAlibGtfcXVldWVfbWF4X3NlY3RvcnMoZmxvcHB5X3F1ZXVlLCA2NCk7CiAKQEAgLTQzNDYsNiArNDM2OCw4IEBACiBvdXRfdW5yZWdfcmVnaW9uOgogCWJsa191bnJlZ2lzdGVyX3JlZ2lvbihNS0RFVihGTE9QUFlfTUFKT1IsIDApLCAyNTYpOwogCWJsa19jbGVhbnVwX3F1ZXVlKGZsb3BweV9xdWV1ZSk7CitvdXRfdW5yZWdfZHJpdmVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmbG9wcHlfZHJpdmVyKTsKIG91dF91bnJlZ19ibGtkZXY6CiAJdW5yZWdpc3Rlcl9ibGtkZXYoRkxPUFBZX01BSk9SLCAiZmQiKTsKIG91dF9wdXRfZGlzazoKQEAgLTQ1NjYsNiArNDU5MCw3IEBACiAKIAlibGtfdW5yZWdpc3Rlcl9yZWdpb24oTUtERVYoRkxPUFBZX01BSk9SLCAwKSwgMjU2KTsKIAl1bnJlZ2lzdGVyX2Jsa2RldihGTE9QUFlfTUFKT1IsICJmZCIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmbG9wcHlfZHJpdmVyKTsKIAogCWZvciAoZHJpdmUgPSAwOyBkcml2ZSA8IE5fRFJJVkU7IGRyaXZlKyspIHsKIAkJZGVsX3RpbWVyX3N5bmMoJm1vdG9yX29mZl90aW1lcltkcml2ZV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9oZC5jIGIvZHJpdmVycy9ibG9jay9oZC5jCmluZGV4IGJhYWE5ZTQuLmY2NWIzZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svaGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL2hkLmMKQEAgLTk4LDEwICs5OCw5IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaGRfbG9jayk7CiBzdGF0aWMgc3RydWN0IHJlcXVlc3RfcXVldWUgKmhkX3F1ZXVlOworc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpoZF9yZXE7CiAKICNkZWZpbmUgTUFKT1JfTlIgSERfTUFKT1IKLSNkZWZpbmUgUVVFVUUgKGhkX3F1ZXVlKQotI2RlZmluZSBDVVJSRU5UIGVsdl9uZXh0X3JlcXVlc3QoaGRfcXVldWUpCiAKICNkZWZpbmUgVElNRU9VVF9WQUxVRQkoNipIWikKICNkZWZpbmUJSERfREVMQVkJMApAQCAtMTk1LDExICsxOTQsMjQgQEAKIAlOUl9IRCA9IGhkaW5kKzE7CiB9CiAKK3N0YXRpYyBib29sIGhkX2VuZF9yZXF1ZXN0KGludCBlcnIsIHVuc2lnbmVkIGludCBieXRlcykKK3sKKwlpZiAoX19ibGtfZW5kX3JlcXVlc3QoaGRfcmVxLCBlcnIsIGJ5dGVzKSkKKwkJcmV0dXJuIHRydWU7CisJaGRfcmVxID0gTlVMTDsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGhkX2VuZF9yZXF1ZXN0X2N1cihpbnQgZXJyKQoreworCXJldHVybiBoZF9lbmRfcmVxdWVzdChlcnIsIGJsa19ycV9jdXJfYnl0ZXMoaGRfcmVxKSk7Cit9CisKIHN0YXRpYyB2b2lkIGR1bXBfc3RhdHVzKGNvbnN0IGNoYXIgKm1zZywgdW5zaWduZWQgaW50IHN0YXQpCiB7CiAJY2hhciAqbmFtZSA9ICJoZD8iOwotCWlmIChDVVJSRU5UKQotCQluYW1lID0gQ1VSUkVOVC0+cnFfZGlzay0+ZGlza19uYW1lOworCWlmIChoZF9yZXEpCisJCW5hbWUgPSBoZF9yZXEtPnJxX2Rpc2stPmRpc2tfbmFtZTsKIAogI2lmZGVmIFZFUkJPU0VfRVJST1JTCiAJcHJpbnRrKCIlczogJXM6IHN0YXR1cz0weCUwMnggeyAiLCBuYW1lLCBtc2csIHN0YXQgJiAweGZmKTsKQEAgLTIyNyw4ICsyMzksOCBAQAogCQlpZiAoaGRfZXJyb3IgJiAoQkJEX0VSUnxFQ0NfRVJSfElEX0VSUnxNQVJLX0VSUikpIHsKIAkJCXByaW50aygiLCBDSFM9JWQvJWQvJWQiLCAoaW5iKEhEX0hDWUwpPDw4KSArIGluYihIRF9MQ1lMKSwKIAkJCQlpbmIoSERfQ1VSUkVOVCkgJiAweGYsIGluYihIRF9TRUNUT1IpKTsKLQkJCWlmIChDVVJSRU5UKQotCQkJCXByaW50aygiLCBzZWN0b3I9JWxkIiwgQ1VSUkVOVC0+c2VjdG9yKTsKKwkJCWlmIChoZF9yZXEpCisJCQkJcHJpbnRrKCIsIHNlY3Rvcj0lbGQiLCBibGtfcnFfcG9zKGhkX3JlcSkpOwogCQl9CiAJCXByaW50aygiXG4iKTsKIAl9CkBAIC00MDYsMTEgKzQxOCwxMiBAQAogICovCiBzdGF0aWMgdm9pZCBiYWRfcndfaW50cih2b2lkKQogewotCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBDVVJSRU5UOworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBoZF9yZXE7CisKIAlpZiAocmVxICE9IE5VTEwpIHsKIAkJc3RydWN0IGhkX2lfc3RydWN0ICpkaXNrID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAJCWlmICgrK3JlcS0+ZXJyb3JzID49IE1BWF9FUlJPUlMgfHwgKGhkX2Vycm9yICYgQkJEX0VSUikpIHsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJCQloZF9lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CiAJCQlkaXNrLT5zcGVjaWFsX29wID0gZGlzay0+cmVjYWxpYnJhdGUgPSAxOwogCQl9IGVsc2UgaWYgKHJlcS0+ZXJyb3JzICUgUkVTRVRfRlJFUSA9PSAwKQogCQkJcmVzZXQgPSAxOwpAQCAtNDUyLDM3ICs0NjUsMzAgQEAKIAliYWRfcndfaW50cigpOwogCWhkX3JlcXVlc3QoKTsKIAlyZXR1cm47CisKIG9rX3RvX3JlYWQ6Ci0JcmVxID0gQ1VSUkVOVDsKKwlyZXEgPSBoZF9yZXE7CiAJaW5zdyhIRF9EQVRBLCByZXEtPmJ1ZmZlciwgMjU2KTsKLQlyZXEtPnNlY3RvcisrOwotCXJlcS0+YnVmZmVyICs9IDUxMjsKLQlyZXEtPmVycm9ycyA9IDA7Ci0JaSA9IC0tcmVxLT5ucl9zZWN0b3JzOwotCS0tcmVxLT5jdXJyZW50X25yX3NlY3RvcnM7CiAjaWZkZWYgREVCVUcKLQlwcmludGsoIiVzOiByZWFkOiBzZWN0b3IgJWxkLCByZW1haW5pbmcgPSAlbGQsIGJ1ZmZlcj0lcFxuIiwKLQkJcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIHJlcS0+c2VjdG9yLCByZXEtPm5yX3NlY3RvcnMsCi0JCXJlcS0+YnVmZmVyKzUxMik7CisJcHJpbnRrKCIlczogcmVhZDogc2VjdG9yICVsZCwgcmVtYWluaW5nID0gJXUsIGJ1ZmZlcj0lcFxuIiwKKwkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGJsa19ycV9wb3MocmVxKSArIDEsCisJICAgICAgIGJsa19ycV9zZWN0b3JzKHJlcSkgLSAxLCByZXEtPmJ1ZmZlcis1MTIpOwogI2VuZGlmCi0JaWYgKHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw9IDApCi0JCWVuZF9yZXF1ZXN0KHJlcSwgMSk7Ci0JaWYgKGkgPiAwKSB7CisJaWYgKGhkX2VuZF9yZXF1ZXN0KDAsIDUxMikpIHsKIAkJU0VUX0hBTkRMRVIoJnJlYWRfaW50cik7CiAJCXJldHVybjsKIAl9CisKIAkodm9pZCkgaW5iX3AoSERfU1RBVFVTKTsKICNpZiAoSERfREVMQVkgPiAwKQogCWxhc3RfcmVxID0gcmVhZF90aW1lcigpOwogI2VuZGlmCi0JaWYgKGVsdl9uZXh0X3JlcXVlc3QoUVVFVUUpKQotCQloZF9yZXF1ZXN0KCk7Ci0JcmV0dXJuOworCWhkX3JlcXVlc3QoKTsKIH0KIAogc3RhdGljIHZvaWQgd3JpdGVfaW50cih2b2lkKQogewotCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBDVVJSRU5UOworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBoZF9yZXE7CiAJaW50IGk7CiAJaW50IHJldHJpZXMgPSAxMDAwMDA7CiAKQEAgLTQ5MiwzMCArNDk4LDI1IEBACiAJCQljb250aW51ZTsKIAkJaWYgKCFPS19TVEFUVVMoaSkpCiAJCQlicmVhazsKLQkJaWYgKChyZXEtPm5yX3NlY3RvcnMgPD0gMSkgfHwgKGkgJiBEUlFfU1RBVCkpCisJCWlmICgoYmxrX3JxX3NlY3RvcnMocmVxKSA8PSAxKSB8fCAoaSAmIERSUV9TVEFUKSkKIAkJCWdvdG8gb2tfdG9fd3JpdGU7CiAJfSB3aGlsZSAoLS1yZXRyaWVzID4gMCk7CiAJZHVtcF9zdGF0dXMoIndyaXRlX2ludHIiLCBpKTsKIAliYWRfcndfaW50cigpOwogCWhkX3JlcXVlc3QoKTsKIAlyZXR1cm47CisKIG9rX3RvX3dyaXRlOgotCXJlcS0+c2VjdG9yKys7Ci0JaSA9IC0tcmVxLT5ucl9zZWN0b3JzOwotCS0tcmVxLT5jdXJyZW50X25yX3NlY3RvcnM7Ci0JcmVxLT5idWZmZXIgKz0gNTEyOwotCWlmICghaSB8fCAocmVxLT5iaW8gJiYgcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgPD0gMCkpCi0JCWVuZF9yZXF1ZXN0KHJlcSwgMSk7Ci0JaWYgKGkgPiAwKSB7CisJaWYgKGhkX2VuZF9yZXF1ZXN0KDAsIDUxMikpIHsKIAkJU0VUX0hBTkRMRVIoJndyaXRlX2ludHIpOwogCQlvdXRzdyhIRF9EQVRBLCByZXEtPmJ1ZmZlciwgMjU2KTsKLQl9IGVsc2UgewotI2lmIChIRF9ERUxBWSA+IDApCi0JCWxhc3RfcmVxID0gcmVhZF90aW1lcigpOwotI2VuZGlmCi0JCWhkX3JlcXVlc3QoKTsKKwkJcmV0dXJuOwogCX0KLQlyZXR1cm47CisKKyNpZiAoSERfREVMQVkgPiAwKQorCWxhc3RfcmVxID0gcmVhZF90aW1lcigpOworI2VuZGlmCisJaGRfcmVxdWVzdCgpOwogfQogCiBzdGF0aWMgdm9pZCByZWNhbF9pbnRyKHZvaWQpCkBAIC01MzcsMTggKzUzOCwxOCBAQAogCiAJZG9faGQgPSBOVUxMOwogCi0JaWYgKCFDVVJSRU5UKQorCWlmICghaGRfcmVxKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxKGhkX3F1ZXVlLT5xdWV1ZV9sb2NrKTsKIAlyZXNldCA9IDE7Ci0JbmFtZSA9IENVUlJFTlQtPnJxX2Rpc2stPmRpc2tfbmFtZTsKKwluYW1lID0gaGRfcmVxLT5ycV9kaXNrLT5kaXNrX25hbWU7CiAJcHJpbnRrKCIlczogdGltZW91dFxuIiwgbmFtZSk7Ci0JaWYgKCsrQ1VSUkVOVC0+ZXJyb3JzID49IE1BWF9FUlJPUlMpIHsKKwlpZiAoKytoZF9yZXEtPmVycm9ycyA+PSBNQVhfRVJST1JTKSB7CiAjaWZkZWYgREVCVUcKIAkJcHJpbnRrKCIlczogdG9vIG1hbnkgZXJyb3JzXG4iLCBuYW1lKTsKICNlbmRpZgotCQllbmRfcmVxdWVzdChDVVJSRU5ULCAwKTsKKwkJaGRfZW5kX3JlcXVlc3RfY3VyKC1FSU8pOwogCX0KIAloZF9yZXF1ZXN0KCk7CiAJc3Bpbl91bmxvY2tfaXJxKGhkX3F1ZXVlLT5xdWV1ZV9sb2NrKTsKQEAgLTU2Myw3ICs1NjQsNyBAQAogCX0KIAlpZiAoZGlzay0+aGVhZCA+IDE2KSB7CiAJCXByaW50aygiJXM6IGNhbm5vdCBoYW5kbGUgZGV2aWNlIHdpdGggbW9yZSB0aGFuIDE2IGhlYWRzIC0gZ2l2aW5nIHVwXG4iLCByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSk7Ci0JCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJCWhkX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKIAl9CiAJZGlzay0+c3BlY2lhbF9vcCA9IDA7CiAJcmV0dXJuIDE7CkBAIC01OTAsMjQgKzU5MSwyNyBAQAogcmVwZWF0OgogCWRlbF90aW1lcigmZGV2aWNlX3RpbWVyKTsKIAotCXJlcSA9IENVUlJFTlQ7Ci0JaWYgKCFyZXEpIHsKLQkJZG9faGQgPSBOVUxMOwotCQlyZXR1cm47CisJaWYgKCFoZF9yZXEpIHsKKwkJaGRfcmVxID0gYmxrX2ZldGNoX3JlcXVlc3QoaGRfcXVldWUpOworCQlpZiAoIWhkX3JlcSkgeworCQkJZG9faGQgPSBOVUxMOworCQkJcmV0dXJuOworCQl9CiAJfQorCXJlcSA9IGhkX3JlcTsKIAogCWlmIChyZXNldCkgewogCQlyZXNldF9oZCgpOwogCQlyZXR1cm47CiAJfQogCWRpc2sgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQlibG9jayA9IHJlcS0+c2VjdG9yOwotCW5zZWN0ID0gcmVxLT5ucl9zZWN0b3JzOworCWJsb2NrID0gYmxrX3JxX3BvcyhyZXEpOworCW5zZWN0ID0gYmxrX3JxX3NlY3RvcnMocmVxKTsKIAlpZiAoYmxvY2sgPj0gZ2V0X2NhcGFjaXR5KHJlcS0+cnFfZGlzaykgfHwKIAkgICAgKChibG9jaytuc2VjdCkgPiBnZXRfY2FwYWNpdHkocmVxLT5ycV9kaXNrKSkpIHsKIAkJcHJpbnRrKCIlczogYmFkIGFjY2VzczogYmxvY2s9JWQsIGNvdW50PSVkXG4iLAogCQkJcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGJsb2NrLCBuc2VjdCk7Ci0JCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJCWhkX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKIAkJZ290byByZXBlYXQ7CiAJfQogCkBAIC02NDcsNyArNjUxLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKCJ1bmtub3duIGhkLWNvbW1hbmRcbiIpOwotCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwkJCWhkX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNzIwLDcgKzcyNCw3IEBACiAJYmxrX3F1ZXVlX21heF9zZWN0b3JzKGhkX3F1ZXVlLCAyNTUpOwogCWluaXRfdGltZXIoJmRldmljZV90aW1lcik7CiAJZGV2aWNlX3RpbWVyLmZ1bmN0aW9uID0gaGRfdGltZXNfb3V0OwotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGhkX3F1ZXVlLCA1MTIpOworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoaGRfcXVldWUsIDUxMik7CiAKIAlpZiAoIU5SX0hEKSB7CiAJCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCmluZGV4IGRkYWU4MDguLjgwMWY0YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbG9vcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCkBAIC01MTEsMTEgKzUxMSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGxvb3BfYWRkX2JpbyhzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvLCBzdHJ1Y3QgYmlvICpiaW8pCiB7Ci0JaWYgKGxvLT5sb19iaW90YWlsKSB7Ci0JCWxvLT5sb19iaW90YWlsLT5iaV9uZXh0ID0gYmlvOwotCQlsby0+bG9fYmlvdGFpbCA9IGJpbzsKLQl9IGVsc2UKLQkJbG8tPmxvX2JpbyA9IGxvLT5sb19iaW90YWlsID0gYmlvOworCWJpb19saXN0X2FkZCgmbG8tPmxvX2Jpb19saXN0LCBiaW8pOwogfQogCiAvKgpAQCAtNTIzLDE2ICs1MTksNyBAQAogICovCiBzdGF0aWMgc3RydWN0IGJpbyAqbG9vcF9nZXRfYmlvKHN0cnVjdCBsb29wX2RldmljZSAqbG8pCiB7Ci0Jc3RydWN0IGJpbyAqYmlvOwotCi0JaWYgKChiaW8gPSBsby0+bG9fYmlvKSkgewotCQlpZiAoYmlvID09IGxvLT5sb19iaW90YWlsKQotCQkJbG8tPmxvX2Jpb3RhaWwgPSBOVUxMOwotCQlsby0+bG9fYmlvID0gYmlvLT5iaV9uZXh0OwotCQliaW8tPmJpX25leHQgPSBOVUxMOwotCX0KLQotCXJldHVybiBiaW87CisJcmV0dXJuIGJpb19saXN0X3BvcCgmbG8tPmxvX2Jpb19saXN0KTsKIH0KIAogc3RhdGljIGludCBsb29wX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqb2xkX2JpbykKQEAgLTYwOSwxMiArNTk2LDEzIEBACiAKIAlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIC0yMCk7CiAKLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCBsby0+bG9fYmlvKSB7CisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgIWJpb19saXN0X2VtcHR5KCZsby0+bG9fYmlvX2xpc3QpKSB7CiAKIAkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGxvLT5sb19ldmVudCwKLQkJCQlsby0+bG9fYmlvIHx8IGt0aHJlYWRfc2hvdWxkX3N0b3AoKSk7CisJCQkJIWJpb19saXN0X2VtcHR5KCZsby0+bG9fYmlvX2xpc3QpIHx8CisJCQkJa3RocmVhZF9zaG91bGRfc3RvcCgpKTsKIAotCQlpZiAoIWxvLT5sb19iaW8pCisJCWlmIChiaW9fbGlzdF9lbXB0eSgmbG8tPmxvX2Jpb19saXN0KSkKIAkJCWNvbnRpbnVlOwogCQlzcGluX2xvY2tfaXJxKCZsby0+bG9fbG9jayk7CiAJCWJpbyA9IGxvb3BfZ2V0X2Jpbyhsbyk7CkBAIC03MjEsMTAgKzcwOSw2IEBACiAJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmICFTX0lTQkxLKGlub2RlLT5pX21vZGUpKQogCQlnb3RvIG91dF9wdXRmOwogCi0JLyogbmV3IGJhY2tpbmcgc3RvcmUgbmVlZHMgdG8gc3VwcG9ydCBsb29wIChlZyBzcGxpY2VfcmVhZCkgKi8KLQlpZiAoIWlub2RlLT5pX2ZvcC0+c3BsaWNlX3JlYWQpCi0JCWdvdG8gb3V0X3B1dGY7Ci0KIAkvKiBzaXplIG9mIHRoZSBuZXcgYmFja2luZyBzdG9yZSBuZWVkcyB0byBiZSB0aGUgc2FtZSAqLwogCWlmIChnZXRfbG9vcF9zaXplKGxvLCBmaWxlKSAhPSBnZXRfbG9vcF9zaXplKGxvLCBvbGRfZmlsZSkpCiAJCWdvdG8gb3V0X3B1dGY7CkBAIC04MDAsMTIgKzc4NCw3IEBACiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKIAkJY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYW9wcyA9IG1hcHBpbmctPmFfb3BzOwotCQkvKgotCQkgKiBJZiB3ZSBjYW4ndCByZWFkIC0gc29ycnkuIElmIHdlIG9ubHkgY2FuJ3Qgd3JpdGUgLSB3ZWxsLAotCQkgKiBpdCdzIGdvaW5nIHRvIGJlIHJlYWQtb25seS4KLQkJICovCi0JCWlmICghZmlsZS0+Zl9vcC0+c3BsaWNlX3JlYWQpCi0JCQlnb3RvIG91dF9wdXRmOworCiAJCWlmIChhb3BzLT53cml0ZV9iZWdpbikKIAkJCWxvX2ZsYWdzIHw9IExPX0ZMQUdTX1VTRV9BT1BTOwogCQlpZiAoIShsb19mbGFncyAmIExPX0ZMQUdTX1VTRV9BT1BTKSAmJiAhZmlsZS0+Zl9vcC0+d3JpdGUpCkBAIC04NDEsNyArODIwLDcgQEAKIAlsby0+b2xkX2dmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKIAltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBsby0+b2xkX2dmcF9tYXNrICYgfihfX0dGUF9JT3xfX0dGUF9GUykpOwogCi0JbG8tPmxvX2JpbyA9IGxvLT5sb19iaW90YWlsID0gTlVMTDsKKwliaW9fbGlzdF9pbml0KCZsby0+bG9fYmlvX2xpc3QpOwogCiAJLyoKIAkgKiBzZXQgcXVldWUgbWFrZV9yZXF1ZXN0X2ZuLCBhbmQgYWRkIGxpbWl0cyBiYXNlZCBvbiBsb3dlciBsZXZlbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9tZ19kaXNrLmMgYi9kcml2ZXJzL2Jsb2NrL21nX2Rpc2suYwppbmRleCBmMzg5ODM1Li42MGRlNWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL21nX2Rpc2suYworKysgYi9kcml2ZXJzL2Jsb2NrL21nX2Rpc2suYwpAQCAtMTcsNzEgKzE3LDIyMCBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KLSNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9hdGEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tZ19kaXNrLmg+CiAKICNkZWZpbmUgTUdfUkVTX1NFQyAoQ09ORklHX01HX0RJU0tfUkVTIDw8IDEpCiAKKy8qIG5hbWUgZm9yIGJsb2NrIGRldmljZSAqLworI2RlZmluZSBNR19ESVNLX05BTUUgIm1nZCIKKy8qIG5hbWUgZm9yIHBsYXRmb3JtIGRldmljZSAqLworI2RlZmluZSBNR19ERVZfTkFNRSAibWdfZGlzayIKKworI2RlZmluZSBNR19ESVNLX01BSiAwCisjZGVmaW5lIE1HX0RJU0tfTUFYX1BBUlQgMTYKKyNkZWZpbmUgTUdfU0VDVE9SX1NJWkUgNTEyCisjZGVmaW5lIE1HX01BWF9TRUNUUyAyNTYKKworLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBNR19CVUZGX09GRlNFVAkJCTB4ODAwMAorI2RlZmluZSBNR19TVE9SQUdFX0JVRkZFUl9TSVpFCQkweDIwMAorI2RlZmluZSBNR19SRUdfT0ZGU0VUCQkJMHhDMDAwCisjZGVmaW5lIE1HX1JFR19GRUFUVVJFCQkJKE1HX1JFR19PRkZTRVQgKyAyKQkvKiB3cml0ZSBjYXNlICovCisjZGVmaW5lIE1HX1JFR19FUlJPUgkJCShNR19SRUdfT0ZGU0VUICsgMikJLyogcmVhZCBjYXNlICovCisjZGVmaW5lIE1HX1JFR19TRUNUX0NOVAkJCShNR19SRUdfT0ZGU0VUICsgNCkKKyNkZWZpbmUgTUdfUkVHX1NFQ1RfTlVNCQkJKE1HX1JFR19PRkZTRVQgKyA2KQorI2RlZmluZSBNR19SRUdfQ1lMX0xPVwkJCShNR19SRUdfT0ZGU0VUICsgOCkKKyNkZWZpbmUgTUdfUkVHX0NZTF9ISUdICQkJKE1HX1JFR19PRkZTRVQgKyAweEEpCisjZGVmaW5lIE1HX1JFR19EUlZfSEVBRAkJCShNR19SRUdfT0ZGU0VUICsgMHhDKQorI2RlZmluZSBNR19SRUdfQ09NTUFORAkJCShNR19SRUdfT0ZGU0VUICsgMHhFKQkvKiB3cml0ZSBjYXNlICovCisjZGVmaW5lIE1HX1JFR19TVEFUVVMJCQkoTUdfUkVHX09GRlNFVCArIDB4RSkJLyogcmVhZCAgY2FzZSAqLworI2RlZmluZSBNR19SRUdfRFJWX0NUUkwJCQkoTUdfUkVHX09GRlNFVCArIDB4MTApCisjZGVmaW5lIE1HX1JFR19CVVJTVF9DVFJMCQkoTUdfUkVHX09GRlNFVCArIDB4MTIpCisKKy8qIGhhbmR5IHN0YXR1cyAqLworI2RlZmluZSBNR19TVEFUX1JFQURZCShBVEFfRFJEWSB8IEFUQV9EU0MpCisjZGVmaW5lIE1HX1JFQURZX09LKHMpCSgoKHMpICYgKE1HX1NUQVRfUkVBRFkgfCAoQVRBX0JVU1kgfCBBVEFfREYgfCBcCisJCQkJIEFUQV9FUlIpKSkgPT0gTUdfU1RBVF9SRUFEWSkKKworLyogZXJyb3IgY29kZSBmb3Igb3RoZXJzICovCisjZGVmaW5lIE1HX0VSUl9OT05FCQkwCisjZGVmaW5lIE1HX0VSUl9USU1FT1VUCQkweDEwMAorI2RlZmluZSBNR19FUlJfSU5JVF9TVEFUCTB4MTAxCisjZGVmaW5lIE1HX0VSUl9UUkFOU0xBVElPTgkweDEwMgorI2RlZmluZSBNR19FUlJfQ1RSTF9SU1QJCTB4MTAzCisjZGVmaW5lIE1HX0VSUl9JTlZfU1RBVAkJMHgxMDQKKyNkZWZpbmUgTUdfRVJSX1JTVE9VVAkJMHgxMDUKKworI2RlZmluZSBNR19NQVhfRVJST1JTCTYJLyogTWF4IHJlYWQvd3JpdGUgZXJyb3JzICovCisKKy8qIGNvbW1hbmQgKi8KKyNkZWZpbmUgTUdfQ01EX1JEIDB4MjAKKyNkZWZpbmUgTUdfQ01EX1dSIDB4MzAKKyNkZWZpbmUgTUdfQ01EX1NMRUVQIDB4OTkKKyNkZWZpbmUgTUdfQ01EX1dBS0VVUCAweEMzCisjZGVmaW5lIE1HX0NNRF9JRCAweEVDCisjZGVmaW5lIE1HX0NNRF9XUl9DT05GIDB4M0MKKyNkZWZpbmUgTUdfQ01EX1JEX0NPTkYgMHg0MAorCisvKiBvcGVyYXRpb24gbW9kZSAqLworI2RlZmluZSBNR19PUF9DQVNDQURFICgxIDw8IDApCisjZGVmaW5lIE1HX09QX0NBU0NBREVfU1lOQ19SRCAoMSA8PCAxKQorI2RlZmluZSBNR19PUF9DQVNDQURFX1NZTkNfV1IgKDEgPDwgMikKKyNkZWZpbmUgTUdfT1BfSU5URVJMRUFWRSAoMSA8PCAzKQorCisvKiBzeW5jaHJvbm91cyAqLworI2RlZmluZSBNR19CVVJTVF9MQVRfNCAoMyA8PCA0KQorI2RlZmluZSBNR19CVVJTVF9MQVRfNSAoNCA8PCA0KQorI2RlZmluZSBNR19CVVJTVF9MQVRfNiAoNSA8PCA0KQorI2RlZmluZSBNR19CVVJTVF9MQVRfNyAoNiA8PCA0KQorI2RlZmluZSBNR19CVVJTVF9MQVRfOCAoNyA8PCA0KQorI2RlZmluZSBNR19CVVJTVF9MRU5fNCAoMSA8PCAxKQorI2RlZmluZSBNR19CVVJTVF9MRU5fOCAoMiA8PCAxKQorI2RlZmluZSBNR19CVVJTVF9MRU5fMTYgKDMgPDwgMSkKKyNkZWZpbmUgTUdfQlVSU1RfTEVOXzMyICg0IDw8IDEpCisjZGVmaW5lIE1HX0JVUlNUX0xFTl9DT05UICgwIDw8IDEpCisKKy8qIHRpbWVvdXQgdmFsdWUgKHVuaXQ6IG1zKSAqLworI2RlZmluZSBNR19UTUFYX0NPTkZfVE9fQ01ECTEKKyNkZWZpbmUgTUdfVE1BWF9XQUlUX1JEX0RSUQkxMAorI2RlZmluZSBNR19UTUFYX1dBSVRfV1JfRFJRCTUwMAorI2RlZmluZSBNR19UTUFYX1JTVF9UT19CVVNZCTEwCisjZGVmaW5lIE1HX1RNQVhfSERSU1RfVE9fUkRZCTUwMAorI2RlZmluZSBNR19UTUFYX1NXUlNUX1RPX1JEWQk1MDAKKyNkZWZpbmUgTUdfVE1BWF9SU1RPVVQJCTMwMDAKKworLyogZGV2aWNlIGF0dHJpYnV0aW9uICovCisvKiB1c2UgbWZsYXNoIGFzIGJvb3QgZGV2aWNlICovCisjZGVmaW5lIE1HX0JPT1RfREVWCQkoMSA8PCAwKQorLyogdXNlIG1mbGFzaCBhcyBzdG9yYWdlIGRldmljZSAqLworI2RlZmluZSBNR19TVE9SQUdFX0RFVgkJKDEgPDwgMSkKKy8qIHNhbWUgYXMgTUdfU1RPUkFHRV9ERVYsIGJ1dCBib290bG9hZGVyIGFscmVhZHkgZG9uZSByZXNldCBzZXF1ZW5jZSAqLworI2RlZmluZSBNR19TVE9SQUdFX0RFVl9TS0lQX1JTVAkoMSA8PCAyKQorCisjZGVmaW5lIE1HX0RFVl9NQVNLIChNR19CT09UX0RFViB8IE1HX1NUT1JBR0VfREVWIHwgTUdfU1RPUkFHRV9ERVZfU0tJUF9SU1QpCisKKy8qIG5hbWVzIG9mIEdQSU8gcmVzb3VyY2UgKi8KKyNkZWZpbmUgTUdfUlNUX1BJTgkibWdfcnN0IgorLyogZXhjZXB0IE1HX0JPT1RfREVWLCByZXNldC1vdXQgcGluIHNob3VsZCBiZSBhc3NpZ25lZCAqLworI2RlZmluZSBNR19SU1RPVVRfUElOCSJtZ19yc3RvdXQiCisKKy8qIHByaXZhdGUgZHJpdmVyIGRhdGEgKi8KK3N0cnVjdCBtZ19kcnZfZGF0YSB7CisJLyogZGlzayByZXNvdXJjZSAqLworCXUzMiB1c2VfcG9sbGluZzsKKworCS8qIGRldmljZSBhdHRyaWJ1dGlvbiAqLworCXUzMiBkZXZfYXR0cjsKKworCS8qIGludGVybmFsbHkgdXNlZCAqLworCXN0cnVjdCBtZ19ob3N0ICpob3N0OworfTsKKworLyogbWFpbiBzdHJ1Y3R1cmUgZm9yIG1mbGFzaCBkcml2ZXIgKi8KK3N0cnVjdCBtZ19ob3N0IHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYnJlcTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwl2b2lkICgqbWdfZG9faW50cikgKHN0cnVjdCBtZ19ob3N0ICopOworCisJdTE2IGlkW0FUQV9JRF9XT1JEU107CisKKwl1MTYgY3lsczsKKwl1MTYgaGVhZHM7CisJdTE2IHNlY3RvcnM7CisJdTMyIG5fc2VjdG9yczsKKwl1MzIgbnJlc19zZWN0b3JzOworCisJdm9pZCBfX2lvbWVtICpkZXZfYmFzZTsKKwl1bnNpZ25lZCBpbnQgaXJxOworCXVuc2lnbmVkIGludCByc3Q7CisJdW5zaWduZWQgaW50IHJzdG91dDsKKworCXUzMiBtYWpvcjsKKwl1MzIgZXJyb3I7Cit9OworCisvKgorICogRGVidWdnaW5nIG1hY3JvIGFuZCBkZWZpbmVzCisgKi8KKyN1bmRlZiBET19NR19ERUJVRworI2lmZGVmIERPX01HX0RFQlVHCisjICBkZWZpbmUgTUdfREJHKGZtdCwgYXJncy4uLikgXAorCXByaW50ayhLRVJOX0RFQlVHICIlczolZCAiZm10LCBfX2Z1bmNfXywgX19MSU5FX18sICMjYXJncykKKyNlbHNlIC8qIENPTkZJR19NR19ERUJVRyAqLworIyAgZGVmaW5lIE1HX0RCRyhmbXQsIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfTUdfREVCVUcgKi8KKwogc3RhdGljIHZvaWQgbWdfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIAorc3RhdGljIGJvb2wgbWdfZW5kX3JlcXVlc3Qoc3RydWN0IG1nX2hvc3QgKmhvc3QsIGludCBlcnIsIHVuc2lnbmVkIGludCBucl9ieXRlcykKK3sKKwlpZiAoX19ibGtfZW5kX3JlcXVlc3QoaG9zdC0+cmVxLCBlcnIsIG5yX2J5dGVzKSkKKwkJcmV0dXJuIHRydWU7CisKKwlob3N0LT5yZXEgPSBOVUxMOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgbWdfZW5kX3JlcXVlc3RfY3VyKHN0cnVjdCBtZ19ob3N0ICpob3N0LCBpbnQgZXJyKQoreworCXJldHVybiBtZ19lbmRfcmVxdWVzdChob3N0LCBlcnIsIGJsa19ycV9jdXJfYnl0ZXMoaG9zdC0+cmVxKSk7Cit9CisKIHN0YXRpYyB2b2lkIG1nX2R1bXBfc3RhdHVzKGNvbnN0IGNoYXIgKm1zZywgdW5zaWduZWQgaW50IHN0YXQsCiAJCXN0cnVjdCBtZ19ob3N0ICpob3N0KQogewogCWNoYXIgKm5hbWUgPSBNR19ESVNLX05BTUU7Ci0Jc3RydWN0IHJlcXVlc3QgKnJlcTsKIAotCWlmIChob3N0LT5icmVxKSB7Ci0JCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QoaG9zdC0+YnJlcSk7Ci0JCWlmIChyZXEpCi0JCQluYW1lID0gcmVxLT5ycV9kaXNrLT5kaXNrX25hbWU7Ci0JfQorCWlmIChob3N0LT5yZXEpCisJCW5hbWUgPSBob3N0LT5yZXEtPnJxX2Rpc2stPmRpc2tfbmFtZTsKIAogCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBzdGF0dXM9MHglMDJ4IHsgIiwgbmFtZSwgbXNnLCBzdGF0ICYgMHhmZik7Ci0JaWYgKHN0YXQgJiBNR19SRUdfU1RBVFVTX0JJVF9CVVNZKQorCWlmIChzdGF0ICYgQVRBX0JVU1kpCiAJCXByaW50aygiQnVzeSAiKTsKLQlpZiAoc3RhdCAmIE1HX1JFR19TVEFUVVNfQklUX1JFQURZKQorCWlmIChzdGF0ICYgQVRBX0RSRFkpCiAJCXByaW50aygiRHJpdmVSZWFkeSAiKTsKLQlpZiAoc3RhdCAmIE1HX1JFR19TVEFUVVNfQklUX1dSSVRFX0ZBVUxUKQorCWlmIChzdGF0ICYgQVRBX0RGKQogCQlwcmludGsoIldyaXRlRmF1bHQgIik7Ci0JaWYgKHN0YXQgJiBNR19SRUdfU1RBVFVTX0JJVF9TRUVLX0RPTkUpCisJaWYgKHN0YXQgJiBBVEFfRFNDKQogCQlwcmludGsoIlNlZWtDb21wbGV0ZSAiKTsKLQlpZiAoc3RhdCAmIE1HX1JFR19TVEFUVVNfQklUX0RBVEFfUkVRKQorCWlmIChzdGF0ICYgQVRBX0RSUSkKIAkJcHJpbnRrKCJEYXRhUmVxdWVzdCAiKTsKLQlpZiAoc3RhdCAmIE1HX1JFR19TVEFUVVNfQklUX0NPUlJFQ1RFRF9FUlJPUikKKwlpZiAoc3RhdCAmIEFUQV9DT1JSKQogCQlwcmludGsoIkNvcnJlY3RlZEVycm9yICIpOwotCWlmIChzdGF0ICYgTUdfUkVHX1NUQVRVU19CSVRfRVJST1IpCisJaWYgKHN0YXQgJiBBVEFfRVJSKQogCQlwcmludGsoIkVycm9yICIpOwogCXByaW50aygifVxuIik7Ci0JaWYgKChzdGF0ICYgTUdfUkVHX1NUQVRVU19CSVRfRVJST1IpID09IDApIHsKKwlpZiAoKHN0YXQgJiBBVEFfRVJSKSA9PSAwKSB7CiAJCWhvc3QtPmVycm9yID0gMDsKIAl9IGVsc2UgewogCQlob3N0LT5lcnJvciA9IGluYigodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArIE1HX1JFR19FUlJPUik7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiBlcnJvcj0weCUwMnggeyAiLCBuYW1lLCBtc2csCiAJCQkJaG9zdC0+ZXJyb3IgJiAweGZmKTsKLQkJaWYgKGhvc3QtPmVycm9yICYgTUdfUkVHX0VSUl9CQkspCisJCWlmIChob3N0LT5lcnJvciAmIEFUQV9CQkspCiAJCQlwcmludGsoIkJhZFNlY3RvciAiKTsKLQkJaWYgKGhvc3QtPmVycm9yICYgTUdfUkVHX0VSUl9VTkMpCisJCWlmIChob3N0LT5lcnJvciAmIEFUQV9VTkMpCiAJCQlwcmludGsoIlVuY29ycmVjdGFibGVFcnJvciAiKTsKLQkJaWYgKGhvc3QtPmVycm9yICYgTUdfUkVHX0VSUl9JRE5GKQorCQlpZiAoaG9zdC0+ZXJyb3IgJiBBVEFfSURORikKIAkJCXByaW50aygiU2VjdG9ySWROb3RGb3VuZCAiKTsKLQkJaWYgKGhvc3QtPmVycm9yICYgTUdfUkVHX0VSUl9BQlJUKQorCQlpZiAoaG9zdC0+ZXJyb3IgJiBBVEFfQUJPUlRFRCkKIAkJCXByaW50aygiRHJpdmVTdGF0dXNFcnJvciAiKTsKLQkJaWYgKGhvc3QtPmVycm9yICYgTUdfUkVHX0VSUl9BTU5GKQorCQlpZiAoaG9zdC0+ZXJyb3IgJiBBVEFfQU1ORikKIAkJCXByaW50aygiQWRkck1hcmtOb3RGb3VuZCAiKTsKIAkJcHJpbnRrKCJ9Iik7Ci0JCWlmIChob3N0LT5lcnJvciAmCi0JCQkJKE1HX1JFR19FUlJfQkJLIHwgTUdfUkVHX0VSUl9VTkMgfAotCQkJCSBNR19SRUdfRVJSX0lETkYgfCBNR19SRUdfRVJSX0FNTkYpKSB7Ci0JCQlpZiAoaG9zdC0+YnJlcSkgewotCQkJCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QoaG9zdC0+YnJlcSk7Ci0JCQkJaWYgKHJlcSkKLQkJCQkJcHJpbnRrKCIsIHNlY3Rvcj0ldSIsICh1MzIpcmVxLT5zZWN0b3IpOwotCQkJfQotCisJCWlmIChob3N0LT5lcnJvciAmIChBVEFfQkJLIHwgQVRBX1VOQyB8IEFUQV9JRE5GIHwgQVRBX0FNTkYpKSB7CisJCQlpZiAoaG9zdC0+cmVxKQorCQkJCXByaW50aygiLCBzZWN0b3I9JXUiLAorCQkJCSAgICAgICAodW5zaWduZWQgaW50KWJsa19ycV9wb3MoaG9zdC0+cmVxKSk7CiAJCX0KIAkJcHJpbnRrKCJcbiIpOwogCX0KQEAgLTEwMCwxMiArMjQ5LDEyIEBACiAKIAlkbyB7CiAJCWN1cl9qaWZmaWVzID0gamlmZmllczsKLQkJaWYgKHN0YXR1cyAmIE1HX1JFR19TVEFUVVNfQklUX0JVU1kpIHsKLQkJCWlmIChleHBlY3QgPT0gTUdfUkVHX1NUQVRVU19CSVRfQlVTWSkKKwkJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKSB7CisJCQlpZiAoZXhwZWN0ID09IEFUQV9CVVNZKQogCQkJCWJyZWFrOwogCQl9IGVsc2UgewogCQkJLyogQ2hlY2sgdGhlIGVycm9yIGNvbmRpdGlvbiEgKi8KLQkJCWlmIChzdGF0dXMgJiBNR19SRUdfU1RBVFVTX0JJVF9FUlJPUikgeworCQkJaWYgKHN0YXR1cyAmIEFUQV9FUlIpIHsKIAkJCQltZ19kdW1wX3N0YXR1cygibWdfd2FpdCIsIHN0YXR1cywgaG9zdCk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xMTQsOCArMjYzLDggQEAKIAkJCQlpZiAoTUdfUkVBRFlfT0soc3RhdHVzKSkKIAkJCQkJYnJlYWs7CiAKLQkJCWlmIChleHBlY3QgPT0gTUdfUkVHX1NUQVRVU19CSVRfREFUQV9SRVEpCi0JCQkJaWYgKHN0YXR1cyAmIE1HX1JFR19TVEFUVVNfQklUX0RBVEFfUkVRKQorCQkJaWYgKGV4cGVjdCA9PSBBVEFfRFJRKQorCQkJCWlmIChzdGF0dXMgJiBBVEFfRFJRKQogCQkJCQlicmVhazsKIAkJfQogCQlpZiAoIW1zZWMpIHsKQEAgLTE3Myw2ICszMjIsNDIgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKKy8qIGxvY2FsIGNvcHkgb2YgYXRhX2lkX3N0cmluZygpICovCitzdGF0aWMgdm9pZCBtZ19pZF9zdHJpbmcoY29uc3QgdTE2ICppZCwgdW5zaWduZWQgY2hhciAqcywKKwkJCSB1bnNpZ25lZCBpbnQgb2ZzLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBjOworCisJQlVHX09OKGxlbiAmIDEpOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJYyA9IGlkW29mc10gPj4gODsKKwkJKnMgPSBjOworCQlzKys7CisKKwkJYyA9IGlkW29mc10gJiAweGZmOworCQkqcyA9IGM7CisJCXMrKzsKKworCQlvZnMrKzsKKwkJbGVuIC09IDI7CisJfQorfQorCisvKiBsb2NhbCBjb3B5IG9mIGF0YV9pZF9jX3N0cmluZygpICovCitzdGF0aWMgdm9pZCBtZ19pZF9jX3N0cmluZyhjb25zdCB1MTYgKmlkLCB1bnNpZ25lZCBjaGFyICpzLAorCQkJICAgdW5zaWduZWQgaW50IG9mcywgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwOworCisJbWdfaWRfc3RyaW5nKGlkLCBzLCBvZnMsIGxlbiAtIDEpOworCisJcCA9IHMgKyBzdHJubGVuKHMsIGxlbiAtIDEpOworCXdoaWxlIChwID4gcyAmJiBwWy0xXSA9PSAnICcpCisJCXAtLTsKKwkqcCA9ICdcMCc7Cit9CisKIHN0YXRpYyBpbnQgbWdfZ2V0X2Rpc2tfaWQoc3RydWN0IG1nX2hvc3QgKmhvc3QpCiB7CiAJdTMyIGk7CkBAIC0xODQsMTIgKzM2OSwxMCBAQAogCWNoYXIgc2VyaWFsW0FUQV9JRF9TRVJOT19MRU4gKyAxXTsKIAogCWlmICghcHJ2X2RhdGEtPnVzZV9wb2xsaW5nKQotCQlvdXRiKE1HX1JFR19DVFJMX0lOVFJfRElTQUJMRSwKLQkJCQkodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArCi0JCQkJTUdfUkVHX0RSVl9DVFJMKTsKKwkJb3V0YihBVEFfTklFTiwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKyBNR19SRUdfRFJWX0NUUkwpOwogCiAJb3V0YihNR19DTURfSUQsICh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsgTUdfUkVHX0NPTU1BTkQpOwotCWVyciA9IG1nX3dhaXQoaG9zdCwgTUdfUkVHX1NUQVRVU19CSVRfREFUQV9SRVEsIE1HX1RNQVhfV0FJVF9SRF9EUlEpOworCWVyciA9IG1nX3dhaXQoaG9zdCwgQVRBX0RSUSwgTUdfVE1BWF9XQUlUX1JEX0RSUSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjE5LDkgKzQwMiw5IEBACiAJCWhvc3QtPm5fc2VjdG9ycyAtPSBob3N0LT5ucmVzX3NlY3RvcnM7CiAJfQogCi0JYXRhX2lkX2Nfc3RyaW5nKGlkLCBmd3JldiwgQVRBX0lEX0ZXX1JFViwgc2l6ZW9mKGZ3cmV2KSk7Ci0JYXRhX2lkX2Nfc3RyaW5nKGlkLCBtb2RlbCwgQVRBX0lEX1BST0QsIHNpemVvZihtb2RlbCkpOwotCWF0YV9pZF9jX3N0cmluZyhpZCwgc2VyaWFsLCBBVEFfSURfU0VSTk8sIHNpemVvZihzZXJpYWwpKTsKKwltZ19pZF9jX3N0cmluZyhpZCwgZndyZXYsIEFUQV9JRF9GV19SRVYsIHNpemVvZihmd3JldikpOworCW1nX2lkX2Nfc3RyaW5nKGlkLCBtb2RlbCwgQVRBX0lEX1BST0QsIHNpemVvZihtb2RlbCkpOworCW1nX2lkX2Nfc3RyaW5nKGlkLCBzZXJpYWwsIEFUQV9JRF9TRVJOTywgc2l6ZW9mKHNlcmlhbCkpOwogCXByaW50ayhLRVJOX0lORk8gIm1nX2Rpc2s6IG1vZGVsOiAlc1xuIiwgbW9kZWwpOwogCXByaW50ayhLRVJOX0lORk8gIm1nX2Rpc2s6IGZpcm06ICUuOHNcbiIsIGZ3cmV2KTsKIAlwcmludGsoS0VSTl9JTkZPICJtZ19kaXNrOiBzZXJpYWw6ICVzXG4iLCBzZXJpYWwpOwpAQCAtMjI5LDggKzQxMiw3IEBACiAJCQlob3N0LT5uX3NlY3RvcnMsIGhvc3QtPm5yZXNfc2VjdG9ycyk7CiAKIAlpZiAoIXBydl9kYXRhLT51c2VfcG9sbGluZykKLQkJb3V0YihNR19SRUdfQ1RSTF9JTlRSX0VOQUJMRSwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKwotCQkJCU1HX1JFR19EUlZfQ1RSTCk7CisJCW91dGIoMCwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKyBNR19SRUdfRFJWX0NUUkwpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI0NCw3ICs0MjYsNyBAQAogCiAJLyogaGRkIHJzdCBsb3cgKi8KIAlncGlvX3NldF92YWx1ZShob3N0LT5yc3QsIDApOwotCWVyciA9IG1nX3dhaXQoaG9zdCwgTUdfUkVHX1NUQVRVU19CSVRfQlVTWSwgTUdfVE1BWF9SU1RfVE9fQlVTWSk7CisJZXJyID0gbWdfd2FpdChob3N0LCBBVEFfQlVTWSwgTUdfVE1BWF9SU1RfVE9fQlVTWSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjU1LDE3ICs0MzcsMTQgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIHNvZnQgcmVzZXQgb24gKi8KLQlvdXRiKE1HX1JFR19DVFJMX1JFU0VUIHwKLQkJCShwcnZfZGF0YS0+dXNlX3BvbGxpbmcgPyBNR19SRUdfQ1RSTF9JTlRSX0RJU0FCTEUgOgotCQkJIE1HX1JFR19DVFJMX0lOVFJfRU5BQkxFKSwKKwlvdXRiKEFUQV9TUlNUIHwgKHBydl9kYXRhLT51c2VfcG9sbGluZyA/IEFUQV9OSUVOIDogMCksCiAJCQkodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArIE1HX1JFR19EUlZfQ1RSTCk7Ci0JZXJyID0gbWdfd2FpdChob3N0LCBNR19SRUdfU1RBVFVTX0JJVF9CVVNZLCBNR19UTUFYX1JTVF9UT19CVVNZKTsKKwllcnIgPSBtZ193YWl0KGhvc3QsIEFUQV9CVVNZLCBNR19UTUFYX1JTVF9UT19CVVNZKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJLyogc29mdCByZXNldCBvZmYgKi8KLQlvdXRiKHBydl9kYXRhLT51c2VfcG9sbGluZyA/IE1HX1JFR19DVFJMX0lOVFJfRElTQUJMRSA6Ci0JCQlNR19SRUdfQ1RSTF9JTlRSX0VOQUJMRSwKKwlvdXRiKHBydl9kYXRhLT51c2VfcG9sbGluZyA/IEFUQV9OSUVOIDogMCwKIAkJCSh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsgTUdfUkVHX0RSVl9DVFJMKTsKIAllcnIgPSBtZ193YWl0KGhvc3QsIE1HX1NUQVRfUkVBRFksIE1HX1RNQVhfU1dSU1RfVE9fUkRZKTsKIAlpZiAoZXJyKQpAQCAtMjgxLDExICs0NjAsMTAgQEAKIAogc3RhdGljIHZvaWQgbWdfYmFkX3J3X2ludHIoc3RydWN0IG1nX2hvc3QgKmhvc3QpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJlcSA9IGVsdl9uZXh0X3JlcXVlc3QoaG9zdC0+YnJlcSk7Ci0JaWYgKHJlcSAhPSBOVUxMKQotCQlpZiAoKytyZXEtPmVycm9ycyA+PSBNR19NQVhfRVJST1JTIHx8Ci0JCQkJaG9zdC0+ZXJyb3IgPT0gTUdfRVJSX1RJTUVPVVQpCi0JCQllbmRfcmVxdWVzdChyZXEsIDApOworCWlmIChob3N0LT5yZXEpCisJCWlmICgrK2hvc3QtPnJlcS0+ZXJyb3JzID49IE1HX01BWF9FUlJPUlMgfHwKKwkJICAgIGhvc3QtPmVycm9yID09IE1HX0VSUl9USU1FT1VUKQorCQkJbWdfZW5kX3JlcXVlc3RfY3VyKGhvc3QsIC1FSU8pOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IG1nX291dChzdHJ1Y3QgbWdfaG9zdCAqaG9zdCwKQEAgLTMxMSw3ICs0ODksNyBAQAogCQkJTUdfUkVHX0NZTF9MT1cpOwogCW91dGIoKHU4KShzZWN0X251bSA+PiAxNiksICh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsKIAkJCU1HX1JFR19DWUxfSElHSCk7Ci0Jb3V0YigodTgpKChzZWN0X251bSA+PiAyNCkgfCBNR19SRUdfSEVBRF9MQkFfTU9ERSksCisJb3V0YigodTgpKChzZWN0X251bSA+PiAyNCkgfCBBVEFfTEJBIHwgQVRBX0RFVklDRV9PQlMpLAogCQkJKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKyBNR19SRUdfRFJWX0hFQUQpOwogCW91dGIoY21kLCAodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArIE1HX1JFR19DT01NQU5EKTsKIAlyZXR1cm4gTUdfRVJSX05PTkU7CkBAIC0zMTksMTA1ICs0OTcsNzcgQEAKIAogc3RhdGljIHZvaWQgbWdfcmVhZChzdHJ1Y3QgcmVxdWVzdCAqcmVxKQogewotCXUzMiByZW1haW5zLCBqOworCXUzMiBqOwogCXN0cnVjdCBtZ19ob3N0ICpob3N0ID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAKLQlyZW1haW5zID0gcmVxLT5ucl9zZWN0b3JzOwotCi0JaWYgKG1nX291dChob3N0LCByZXEtPnNlY3RvciwgcmVxLT5ucl9zZWN0b3JzLCBNR19DTURfUkQsIE5VTEwpICE9Ci0JCQlNR19FUlJfTk9ORSkKKwlpZiAobWdfb3V0KGhvc3QsIGJsa19ycV9wb3MocmVxKSwgYmxrX3JxX3NlY3RvcnMocmVxKSwKKwkJICAgTUdfQ01EX1JELCBOVUxMKSAhPSBNR19FUlJfTk9ORSkKIAkJbWdfYmFkX3J3X2ludHIoaG9zdCk7CiAKIAlNR19EQkcoInJlcXVlc3RlZCAlZCBzZWN0cyAoZnJvbSAlbGQpLCBidWZmZXI9MHglcFxuIiwKLQkJCXJlbWFpbnMsIHJlcS0+c2VjdG9yLCByZXEtPmJ1ZmZlcik7CisJICAgICAgIGJsa19ycV9zZWN0b3JzKHJlcSksIGJsa19ycV9wb3MocmVxKSwgcmVxLT5idWZmZXIpOwogCi0Jd2hpbGUgKHJlbWFpbnMpIHsKLQkJaWYgKG1nX3dhaXQoaG9zdCwgTUdfUkVHX1NUQVRVU19CSVRfREFUQV9SRVEsCi0JCQkJCU1HX1RNQVhfV0FJVF9SRF9EUlEpICE9IE1HX0VSUl9OT05FKSB7CisJZG8geworCQl1MTYgKmJ1ZmYgPSAodTE2ICopcmVxLT5idWZmZXI7CisKKwkJaWYgKG1nX3dhaXQoaG9zdCwgQVRBX0RSUSwKKwkJCSAgICBNR19UTUFYX1dBSVRfUkRfRFJRKSAhPSBNR19FUlJfTk9ORSkgewogCQkJbWdfYmFkX3J3X2ludHIoaG9zdCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJZm9yIChqID0gMDsgaiA8IE1HX1NFQ1RPUl9TSVpFID4+IDE7IGorKykgewotCQkJKih1MTYgKilyZXEtPmJ1ZmZlciA9Ci0JCQkJaW53KCh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsKLQkJCQkJCU1HX0JVRkZfT0ZGU0VUICsgKGogPDwgMSkpOwotCQkJcmVxLT5idWZmZXIgKz0gMjsKLQkJfQotCi0JCXJlcS0+c2VjdG9yKys7Ci0JCXJlcS0+ZXJyb3JzID0gMDsKLQkJcmVtYWlucyA9IC0tcmVxLT5ucl9zZWN0b3JzOwotCQktLXJlcS0+Y3VycmVudF9ucl9zZWN0b3JzOwotCi0JCWlmIChyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA8PSAwKSB7Ci0JCQlNR19EQkcoInJlbWFpbiA6ICVkIHNlY3RzXG4iLCByZW1haW5zKTsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMSk7Ci0JCQlpZiAocmVtYWlucyA+IDApCi0JCQkJcmVxID0gZWx2X25leHRfcmVxdWVzdChob3N0LT5icmVxKTsKLQkJfQorCQlmb3IgKGogPSAwOyBqIDwgTUdfU0VDVE9SX1NJWkUgPj4gMTsgaisrKQorCQkJKmJ1ZmYrKyA9IGludygodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArCisJCQkJICAgICAgTUdfQlVGRl9PRkZTRVQgKyAoaiA8PCAxKSk7CiAKIAkJb3V0YihNR19DTURfUkRfQ09ORiwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKwogCQkJCU1HX1JFR19DT01NQU5EKTsKLQl9CisJfSB3aGlsZSAobWdfZW5kX3JlcXVlc3QoaG9zdCwgMCwgTUdfU0VDVE9SX1NJWkUpKTsKIH0KIAogc3RhdGljIHZvaWQgbWdfd3JpdGUoc3RydWN0IHJlcXVlc3QgKnJlcSkKIHsKLQl1MzIgcmVtYWlucywgajsKKwl1MzIgajsKIAlzdHJ1Y3QgbWdfaG9zdCAqaG9zdCA9IHJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwogCi0JcmVtYWlucyA9IHJlcS0+bnJfc2VjdG9yczsKLQotCWlmIChtZ19vdXQoaG9zdCwgcmVxLT5zZWN0b3IsIHJlcS0+bnJfc2VjdG9ycywgTUdfQ01EX1dSLCBOVUxMKSAhPQotCQkJTUdfRVJSX05PTkUpIHsKKwlpZiAobWdfb3V0KGhvc3QsIGJsa19ycV9wb3MocmVxKSwgYmxrX3JxX3NlY3RvcnMocmVxKSwKKwkJICAgTUdfQ01EX1dSLCBOVUxMKSAhPSBNR19FUlJfTk9ORSkgewogCQltZ19iYWRfcndfaW50cihob3N0KTsKIAkJcmV0dXJuOwogCX0KIAotCiAJTUdfREJHKCJyZXF1ZXN0ZWQgJWQgc2VjdHMgKGZyb20gJWxkKSwgYnVmZmVyPTB4JXBcbiIsCi0JCQlyZW1haW5zLCByZXEtPnNlY3RvciwgcmVxLT5idWZmZXIpOwotCXdoaWxlIChyZW1haW5zKSB7Ci0JCWlmIChtZ193YWl0KGhvc3QsIE1HX1JFR19TVEFUVVNfQklUX0RBVEFfUkVRLAotCQkJCQlNR19UTUFYX1dBSVRfV1JfRFJRKSAhPSBNR19FUlJfTk9ORSkgeworCSAgICAgICBibGtfcnFfc2VjdG9ycyhyZXEpLCBibGtfcnFfcG9zKHJlcSksIHJlcS0+YnVmZmVyKTsKKworCWRvIHsKKwkJdTE2ICpidWZmID0gKHUxNiAqKXJlcS0+YnVmZmVyOworCisJaWYgKG1nX3dhaXQoaG9zdCwgQVRBX0RSUSwgTUdfVE1BWF9XQUlUX1dSX0RSUSkgIT0gTUdfRVJSX05PTkUpIHsKIAkJCW1nX2JhZF9yd19pbnRyKGhvc3QpOwogCQkJcmV0dXJuOwogCQl9Ci0JCWZvciAoaiA9IDA7IGogPCBNR19TRUNUT1JfU0laRSA+PiAxOyBqKyspIHsKLQkJCW91dHcoKih1MTYgKilyZXEtPmJ1ZmZlciwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKwotCQkJCQlNR19CVUZGX09GRlNFVCArIChqIDw8IDEpKTsKLQkJCXJlcS0+YnVmZmVyICs9IDI7Ci0JCX0KLQkJcmVxLT5zZWN0b3IrKzsKLQkJcmVtYWlucyA9IC0tcmVxLT5ucl9zZWN0b3JzOwotCQktLXJlcS0+Y3VycmVudF9ucl9zZWN0b3JzOwotCi0JCWlmIChyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA8PSAwKSB7Ci0JCQlNR19EQkcoInJlbWFpbiA6ICVkIHNlY3RzXG4iLCByZW1haW5zKTsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMSk7Ci0JCQlpZiAocmVtYWlucyA+IDApCi0JCQkJcmVxID0gZWx2X25leHRfcmVxdWVzdChob3N0LT5icmVxKTsKLQkJfQorCQlmb3IgKGogPSAwOyBqIDwgTUdfU0VDVE9SX1NJWkUgPj4gMTsgaisrKQorCQkJb3V0dygqYnVmZisrLCAodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArCisJCQkJICAgICAgTUdfQlVGRl9PRkZTRVQgKyAoaiA8PCAxKSk7CiAKIAkJb3V0YihNR19DTURfV1JfQ09ORiwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKwogCQkJCU1HX1JFR19DT01NQU5EKTsKLQl9CisJfSB3aGlsZSAobWdfZW5kX3JlcXVlc3QoaG9zdCwgMCwgTUdfU0VDVE9SX1NJWkUpKTsKIH0KIAogc3RhdGljIHZvaWQgbWdfcmVhZF9pbnRyKHN0cnVjdCBtZ19ob3N0ICpob3N0KQogeworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBob3N0LT5yZXE7CiAJdTMyIGk7Ci0Jc3RydWN0IHJlcXVlc3QgKnJlcTsKKwl1MTYgKmJ1ZmY7CiAKIAkvKiBjaGVjayBzdGF0dXMgKi8KIAlkbyB7CiAJCWkgPSBpbmIoKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKyBNR19SRUdfU1RBVFVTKTsKLQkJaWYgKGkgJiBNR19SRUdfU1RBVFVTX0JJVF9CVVNZKQorCQlpZiAoaSAmIEFUQV9CVVNZKQogCQkJYnJlYWs7CiAJCWlmICghTUdfUkVBRFlfT0soaSkpCiAJCQlicmVhazsKLQkJaWYgKGkgJiBNR19SRUdfU1RBVFVTX0JJVF9EQVRBX1JFUSkKKwkJaWYgKGkgJiBBVEFfRFJRKQogCQkJZ290byBva190b19yZWFkOwogCX0gd2hpbGUgKDApOwogCW1nX2R1bXBfc3RhdHVzKCJtZ19yZWFkX2ludHIiLCBpLCBob3N0KTsKQEAgLTQyNyw2MCArNTc3LDQyIEBACiAKIG9rX3RvX3JlYWQ6CiAJLyogZ2V0IGN1cnJlbnQgc2VnbWVudCBvZiByZXF1ZXN0ICovCi0JcmVxID0gZWx2X25leHRfcmVxdWVzdChob3N0LT5icmVxKTsKKwlidWZmID0gKHUxNiAqKXJlcS0+YnVmZmVyOwogCiAJLyogcmVhZCAxIHNlY3RvciAqLwotCWZvciAoaSA9IDA7IGkgPCBNR19TRUNUT1JfU0laRSA+PiAxOyBpKyspIHsKLQkJKih1MTYgKilyZXEtPmJ1ZmZlciA9Ci0JCQlpbncoKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKyBNR19CVUZGX09GRlNFVCArCi0JCQkJCShpIDw8IDEpKTsKLQkJcmVxLT5idWZmZXIgKz0gMjsKLQl9CisJZm9yIChpID0gMDsgaSA8IE1HX1NFQ1RPUl9TSVpFID4+IDE7IGkrKykKKwkJKmJ1ZmYrKyA9IGludygodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArIE1HX0JVRkZfT0ZGU0VUICsKKwkJCSAgICAgIChpIDw8IDEpKTsKIAotCS8qIG1hbmlwdWxhdGUgcmVxdWVzdCAqLwogCU1HX0RCRygic2VjdG9yICVsZCwgcmVtYWluaW5nPSVsZCwgYnVmZmVyPTB4JXBcbiIsCi0JCQlyZXEtPnNlY3RvciwgcmVxLT5ucl9zZWN0b3JzIC0gMSwgcmVxLT5idWZmZXIpOwotCi0JcmVxLT5zZWN0b3IrKzsKLQlyZXEtPmVycm9ycyA9IDA7Ci0JaSA9IC0tcmVxLT5ucl9zZWN0b3JzOwotCS0tcmVxLT5jdXJyZW50X25yX3NlY3RvcnM7Ci0KLQkvKiBsZXQga25vdyBpZiBjdXJyZW50IHNlZ21lbnQgZG9uZSAqLwotCWlmIChyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA8PSAwKQotCQllbmRfcmVxdWVzdChyZXEsIDEpOwotCi0JLyogc2V0IGhhbmRsZXIgaWYgcmVhZCByZW1haW5zICovCi0JaWYgKGkgPiAwKSB7Ci0JCWhvc3QtPm1nX2RvX2ludHIgPSBtZ19yZWFkX2ludHI7Ci0JCW1vZF90aW1lcigmaG9zdC0+dGltZXIsIGppZmZpZXMgKyAzICogSFopOwotCX0KKwkgICAgICAgYmxrX3JxX3BvcyhyZXEpLCBibGtfcnFfc2VjdG9ycyhyZXEpIC0gMSwgcmVxLT5idWZmZXIpOwogCiAJLyogc2VuZCByZWFkIGNvbmZpcm0gKi8KIAlvdXRiKE1HX0NNRF9SRF9DT05GLCAodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArIE1HX1JFR19DT01NQU5EKTsKIAotCS8qIGdvdG8gbmV4dCByZXF1ZXN0ICovCi0JaWYgKCFpKQorCWlmIChtZ19lbmRfcmVxdWVzdChob3N0LCAwLCBNR19TRUNUT1JfU0laRSkpIHsKKwkJLyogc2V0IGhhbmRsZXIgaWYgcmVhZCByZW1haW5zICovCisJCWhvc3QtPm1nX2RvX2ludHIgPSBtZ19yZWFkX2ludHI7CisJCW1vZF90aW1lcigmaG9zdC0+dGltZXIsIGppZmZpZXMgKyAzICogSFopOworCX0gZWxzZSAvKiBnb3RvIG5leHQgcmVxdWVzdCAqLwogCQltZ19yZXF1ZXN0KGhvc3QtPmJyZXEpOwogfQogCiBzdGF0aWMgdm9pZCBtZ193cml0ZV9pbnRyKHN0cnVjdCBtZ19ob3N0ICpob3N0KQogeworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBob3N0LT5yZXE7CiAJdTMyIGksIGo7CiAJdTE2ICpidWZmOwotCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0KLQkvKiBnZXQgY3VycmVudCBzZWdtZW50IG9mIHJlcXVlc3QgKi8KLQlyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KGhvc3QtPmJyZXEpOworCWJvb2wgcmVtOwogCiAJLyogY2hlY2sgc3RhdHVzICovCiAJZG8gewogCQlpID0gaW5iKCh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsgTUdfUkVHX1NUQVRVUyk7Ci0JCWlmIChpICYgTUdfUkVHX1NUQVRVU19CSVRfQlVTWSkKKwkJaWYgKGkgJiBBVEFfQlVTWSkKIAkJCWJyZWFrOwogCQlpZiAoIU1HX1JFQURZX09LKGkpKQogCQkJYnJlYWs7Ci0JCWlmICgocmVxLT5ucl9zZWN0b3JzIDw9IDEpIHx8IChpICYgTUdfUkVHX1NUQVRVU19CSVRfREFUQV9SRVEpKQorCQlpZiAoKGJsa19ycV9zZWN0b3JzKHJlcSkgPD0gMSkgfHwgKGkgJiBBVEFfRFJRKSkKIAkJCWdvdG8gb2tfdG9fd3JpdGU7CiAJfSB3aGlsZSAoMCk7CiAJbWdfZHVtcF9zdGF0dXMoIm1nX3dyaXRlX2ludHIiLCBpLCBob3N0KTsKQEAgLTQ4OSwxOCArNjIxLDggQEAKIAlyZXR1cm47CiAKIG9rX3RvX3dyaXRlOgotCS8qIG1hbmlwdWxhdGUgcmVxdWVzdCAqLwotCXJlcS0+c2VjdG9yKys7Ci0JaSA9IC0tcmVxLT5ucl9zZWN0b3JzOwotCS0tcmVxLT5jdXJyZW50X25yX3NlY3RvcnM7Ci0JcmVxLT5idWZmZXIgKz0gTUdfU0VDVE9SX1NJWkU7Ci0KLQkvKiBsZXQga25vdyBpZiBjdXJyZW50IHNlZ21lbnQgb3IgYWxsIGRvbmUgKi8KLQlpZiAoIWkgfHwgKHJlcS0+YmlvICYmIHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw9IDApKQotCQllbmRfcmVxdWVzdChyZXEsIDEpOwotCi0JLyogd3JpdGUgMSBzZWN0b3IgYW5kIHNldCBoYW5kbGVyIGlmIHJlbWFpbnMgKi8KLQlpZiAoaSA+IDApIHsKKwlpZiAoKHJlbSA9IG1nX2VuZF9yZXF1ZXN0KGhvc3QsIDAsIE1HX1NFQ1RPUl9TSVpFKSkpIHsKKwkJLyogd3JpdGUgMSBzZWN0b3IgYW5kIHNldCBoYW5kbGVyIGlmIHJlbWFpbnMgKi8KIAkJYnVmZiA9ICh1MTYgKilyZXEtPmJ1ZmZlcjsKIAkJZm9yIChqID0gMDsgaiA8IE1HX1NUT1JBR0VfQlVGRkVSX1NJWkUgPj4gMTsgaisrKSB7CiAJCQlvdXR3KCpidWZmLCAodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArCkBAIC01MDgsNyArNjMwLDcgQEAKIAkJCWJ1ZmYrKzsKIAkJfQogCQlNR19EQkcoInNlY3RvciAlbGQsIHJlbWFpbmluZz0lbGQsIGJ1ZmZlcj0weCVwXG4iLAotCQkJCXJlcS0+c2VjdG9yLCByZXEtPm5yX3NlY3RvcnMsIHJlcS0+YnVmZmVyKTsKKwkJICAgICAgIGJsa19ycV9wb3MocmVxKSwgYmxrX3JxX3NlY3RvcnMocmVxKSwgcmVxLT5idWZmZXIpOwogCQlob3N0LT5tZ19kb19pbnRyID0gbWdfd3JpdGVfaW50cjsKIAkJbW9kX3RpbWVyKCZob3N0LT50aW1lciwgamlmZmllcyArIDMgKiBIWik7CiAJfQpAQCAtNTE2LDcgKzYzOCw3IEBACiAJLyogc2VuZCB3cml0ZSBjb25maXJtICovCiAJb3V0YihNR19DTURfV1JfQ09ORiwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKyBNR19SRUdfQ09NTUFORCk7CiAKLQlpZiAoIWkpCisJaWYgKCFyZW0pCiAJCW1nX3JlcXVlc3QoaG9zdC0+YnJlcSk7CiB9CiAKQEAgLTUyNCw0OSArNjQ2LDQ1IEBACiB7CiAJc3RydWN0IG1nX2hvc3QgKmhvc3QgPSAoc3RydWN0IG1nX2hvc3QgKilkYXRhOwogCWNoYXIgKm5hbWU7Ci0Jc3RydWN0IHJlcXVlc3QgKnJlcTsKIAogCXNwaW5fbG9ja19pcnEoJmhvc3QtPmxvY2spOwogCi0JcmVxID0gZWx2X25leHRfcmVxdWVzdChob3N0LT5icmVxKTsKLQlpZiAoIXJlcSkKKwlpZiAoIWhvc3QtPnJlcSkKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJaG9zdC0+bWdfZG9faW50ciA9IE5VTEw7CiAKLQluYW1lID0gcmVxLT5ycV9kaXNrLT5kaXNrX25hbWU7CisJbmFtZSA9IGhvc3QtPnJlcS0+cnFfZGlzay0+ZGlza19uYW1lOwogCXByaW50ayhLRVJOX0RFQlVHICIlczogdGltZW91dFxuIiwgbmFtZSk7CiAKIAlob3N0LT5lcnJvciA9IE1HX0VSUl9USU1FT1VUOwogCW1nX2JhZF9yd19pbnRyKGhvc3QpOwogCi0JbWdfcmVxdWVzdChob3N0LT5icmVxKTsKIG91dF91bmxvY2s6CisJbWdfcmVxdWVzdChob3N0LT5icmVxKTsKIAlzcGluX3VubG9ja19pcnEoJmhvc3QtPmxvY2spOwogfQogCiBzdGF0aWMgdm9pZCBtZ19yZXF1ZXN0X3BvbGwoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJlcTsKLQlzdHJ1Y3QgbWdfaG9zdCAqaG9zdDsKKwlzdHJ1Y3QgbWdfaG9zdCAqaG9zdCA9IHEtPnF1ZXVlZGF0YTsKIAotCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgewotCQlob3N0ID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7Ci0JCWlmIChibGtfZnNfcmVxdWVzdChyZXEpKSB7Ci0JCQlzd2l0Y2ggKHJxX2RhdGFfZGlyKHJlcSkpIHsKLQkJCWNhc2UgUkVBRDoKLQkJCQltZ19yZWFkKHJlcSk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCFob3N0LT5yZXEpIHsKKwkJCWhvc3QtPnJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOworCQkJaWYgKCFob3N0LT5yZXEpCiAJCQkJYnJlYWs7Ci0JCQljYXNlIFdSSVRFOgotCQkJCW1nX3dyaXRlKHJlcSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiVkIHVua25vd24gY29tbWFuZFxuIiwKLQkJCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKLQkJCQlicmVhazsKLQkJCX0KIAkJfQorCisJCWlmICh1bmxpa2VseSghYmxrX2ZzX3JlcXVlc3QoaG9zdC0+cmVxKSkpIHsKKwkJCW1nX2VuZF9yZXF1ZXN0X2N1cihob3N0LCAtRUlPKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHJxX2RhdGFfZGlyKGhvc3QtPnJlcSkgPT0gUkVBRCkKKwkJCW1nX3JlYWQoaG9zdC0+cmVxKTsKKwkJZWxzZQorCQkJbWdfd3JpdGUoaG9zdC0+cmVxKTsKIAl9CiB9CiAKQEAgLTU4OCwxOCArNzA2LDE1IEBACiAJCWJyZWFrOwogCWNhc2UgV1JJVEU6CiAJCS8qIFRPRE8gOiBoYW5kbGVyICovCi0JCW91dGIoTUdfUkVHX0NUUkxfSU5UUl9ESVNBQkxFLAotCQkJCSh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsKLQkJCQlNR19SRUdfRFJWX0NUUkwpOworCQlvdXRiKEFUQV9OSUVOLCAodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArIE1HX1JFR19EUlZfQ1RSTCk7CiAJCWlmIChtZ19vdXQoaG9zdCwgc2VjdF9udW0sIHNlY3RfY250LCBNR19DTURfV1IsICZtZ193cml0ZV9pbnRyKQogCQkJCSE9IE1HX0VSUl9OT05FKSB7CiAJCQltZ19iYWRfcndfaW50cihob3N0KTsKIAkJCXJldHVybiBob3N0LT5lcnJvcjsKIAkJfQogCQlkZWxfdGltZXIoJmhvc3QtPnRpbWVyKTsKLQkJbWdfd2FpdChob3N0LCBNR19SRUdfU1RBVFVTX0JJVF9EQVRBX1JFUSwgTUdfVE1BWF9XQUlUX1dSX0RSUSk7Ci0JCW91dGIoTUdfUkVHX0NUUkxfSU5UUl9FTkFCTEUsICh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsKLQkJCQlNR19SRUdfRFJWX0NUUkwpOworCQltZ193YWl0KGhvc3QsIEFUQV9EUlEsIE1HX1RNQVhfV0FJVF9XUl9EUlEpOworCQlvdXRiKDAsICh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsgTUdfUkVHX0RSVl9DVFJMKTsKIAkJaWYgKGhvc3QtPmVycm9yKSB7CiAJCQltZ19iYWRfcndfaW50cihob3N0KTsKIAkJCXJldHVybiBob3N0LT5lcnJvcjsKQEAgLTYxNCwxMSArNzI5LDYgQEAKIAkJb3V0YihNR19DTURfV1JfQ09ORiwgKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKwogCQkJCU1HX1JFR19DT01NQU5EKTsKIAkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6JWQgdW5rbm93biBjb21tYW5kXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7Ci0JCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCWJyZWFrOwogCX0KIAlyZXR1cm4gTUdfRVJSX05PTkU7CiB9CkBAIC02MjYsMTYgKzczNiwxNyBAQAogLyogVGhpcyBmdW5jdGlvbiBhbHNvIGNhbGxlZCBmcm9tIElSUSBjb250ZXh0ICovCiBzdGF0aWMgdm9pZCBtZ19yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogeworCXN0cnVjdCBtZ19ob3N0ICpob3N0ID0gcS0+cXVldWVkYXRhOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0Jc3RydWN0IG1nX2hvc3QgKmhvc3Q7CiAJdTMyIHNlY3RfbnVtLCBzZWN0X2NudDsKIAogCXdoaWxlICgxKSB7Ci0JCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7Ci0JCWlmICghcmVxKQotCQkJcmV0dXJuOwotCi0JCWhvc3QgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKKwkJaWYgKCFob3N0LT5yZXEpIHsKKwkJCWhvc3QtPnJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOworCQkJaWYgKCFob3N0LT5yZXEpCisJCQkJYnJlYWs7CisJCX0KKwkJcmVxID0gaG9zdC0+cmVxOwogCiAJCS8qIGNoZWNrIHVud2FudGVkIHJlcXVlc3QgY2FsbCAqLwogCQlpZiAoaG9zdC0+bWdfZG9faW50cikKQEAgLTY0Myw5ICs3NTQsOSBAQAogCiAJCWRlbF90aW1lcigmaG9zdC0+dGltZXIpOwogCi0JCXNlY3RfbnVtID0gcmVxLT5zZWN0b3I7CisJCXNlY3RfbnVtID0gYmxrX3JxX3BvcyhyZXEpOwogCQkvKiBkZWFsIHdob2xlIHNlZ21lbnRzICovCi0JCXNlY3RfY250ID0gcmVxLT5ucl9zZWN0b3JzOworCQlzZWN0X2NudCA9IGJsa19ycV9zZWN0b3JzKHJlcSk7CiAKIAkJLyogc2FuaXR5IGNoZWNrICovCiAJCWlmIChzZWN0X251bSA+PSBnZXRfY2FwYWNpdHkocmVxLT5ycV9kaXNrKSB8fApAQCAtNjU1LDEyICs3NjYsMTQgQEAKIAkJCQkJIiVzOiBiYWQgYWNjZXNzOiBzZWN0b3I9JWQsIGNvdW50PSVkXG4iLAogCQkJCQlyZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwKIAkJCQkJc2VjdF9udW0sIHNlY3RfY250KTsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJCQltZ19lbmRfcmVxdWVzdF9jdXIoaG9zdCwgLUVJTyk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmICghYmxrX2ZzX3JlcXVlc3QocmVxKSkKLQkJCXJldHVybjsKKwkJaWYgKHVubGlrZWx5KCFibGtfZnNfcmVxdWVzdChyZXEpKSkgeworCQkJbWdfZW5kX3JlcXVlc3RfY3VyKGhvc3QsIC1FSU8pOworCQkJY29udGludWU7CisJCX0KIAogCQlpZiAoIW1nX2lzc3VlX3JlcShyZXEsIGhvc3QsIHNlY3RfbnVtLCBzZWN0X2NudCkpCiAJCQlyZXR1cm47CkBAIC02OTAsOSArODAzLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoIXBydl9kYXRhLT51c2VfcG9sbGluZykKLQkJb3V0YihNR19SRUdfQ1RSTF9JTlRSX0RJU0FCTEUsCi0JCQkJKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKwotCQkJCU1HX1JFR19EUlZfQ1RSTCk7CisJCW91dGIoQVRBX05JRU4sICh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsgTUdfUkVHX0RSVl9DVFJMKTsKIAogCW91dGIoTUdfQ01EX1NMRUVQLCAodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArIE1HX1JFR19DT01NQU5EKTsKIAkvKiB3YWl0IHVudGlsIG1mbGFzaCBkZWVwIHNsZWVwICovCkBAIC03MDAsOSArODExLDcgQEAKIAogCWlmIChtZ193YWl0KGhvc3QsIE1HX1NUQVRfUkVBRFksIE1HX1RNQVhfQ09ORl9UT19DTUQpKSB7CiAJCWlmICghcHJ2X2RhdGEtPnVzZV9wb2xsaW5nKQotCQkJb3V0YihNR19SRUdfQ1RSTF9JTlRSX0VOQUJMRSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpaG9zdC0+ZGV2X2Jhc2UgKwotCQkJCQlNR19SRUdfRFJWX0NUUkwpOworCQkJb3V0YigwLCAodW5zaWduZWQgbG9uZylob3N0LT5kZXZfYmFzZSArIE1HX1JFR19EUlZfQ1RSTCk7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtNzI1LDggKzgzNCw3IEBACiAJCXJldHVybiAtRUlPOwogCiAJaWYgKCFwcnZfZGF0YS0+dXNlX3BvbGxpbmcpCi0JCW91dGIoTUdfUkVHX0NUUkxfSU5UUl9FTkFCTEUsICh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsKLQkJCQlNR19SRUdfRFJWX0NUUkwpOworCQlvdXRiKDAsICh1bnNpZ25lZCBsb25nKWhvc3QtPmRldl9iYXNlICsgTUdfUkVHX0RSVl9DVFJMKTsKIAogCXJldHVybiAwOwogfQpAQCAtODc3LDYgKzk4NSw3IEBACiAJCQkJX19mdW5jX18sIF9fTElORV9fKTsKIAkJZ290byBwcm9iZV9lcnJfNTsKIAl9CisJaG9zdC0+YnJlcS0+cXVldWVkYXRhID0gaG9zdDsKIAogCS8qIG1mbGFzaCBpcyByYW5kb20gZGV2aWNlLCB0aGFueCBmb3IgdGhlIG5vb3AgKi8KIAllbGV2YXRvcl9leGl0KGhvc3QtPmJyZXEtPmVsZXZhdG9yKTsKQEAgLTg4Nyw3ICs5OTYsNyBAQAogCQlnb3RvIHByb2JlX2Vycl82OwogCX0KIAlibGtfcXVldWVfbWF4X3NlY3RvcnMoaG9zdC0+YnJlcSwgTUdfTUFYX1NFQ1RTKTsKLQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShob3N0LT5icmVxLCBNR19TRUNUT1JfU0laRSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShob3N0LT5icmVxLCBNR19TRUNUT1JfU0laRSk7CiAKIAlpbml0X3RpbWVyKCZob3N0LT50aW1lcik7CiAJaG9zdC0+dGltZXIuZnVuY3Rpb24gPSBtZ190aW1lc19vdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCA0ZDZkZTRmLi41ZDIzZmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL25iZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCQkJcmVxLCBlcnJvciA/ICJmYWlsZWQiIDogImRvbmUiKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQlfX2Jsa19lbmRfcmVxdWVzdChyZXEsIGVycm9yLCByZXEtPm5yX3NlY3RvcnMgPDwgOSk7CisJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgZXJyb3IpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0yMzEsMTkgKzIzMSwxOSBAQAogewogCWludCByZXN1bHQsIGZsYWdzOwogCXN0cnVjdCBuYmRfcmVxdWVzdCByZXF1ZXN0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IHJlcS0+bnJfc2VjdG9ycyA8PCA5OworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGJsa19ycV9ieXRlcyhyZXEpOwogCiAJcmVxdWVzdC5tYWdpYyA9IGh0b25sKE5CRF9SRVFVRVNUX01BR0lDKTsKIAlyZXF1ZXN0LnR5cGUgPSBodG9ubChuYmRfY21kKHJlcSkpOwotCXJlcXVlc3QuZnJvbSA9IGNwdV90b19iZTY0KCh1NjQpIHJlcS0+c2VjdG9yIDw8IDkpOworCXJlcXVlc3QuZnJvbSA9IGNwdV90b19iZTY0KCh1NjQpYmxrX3JxX3BvcyhyZXEpIDw8IDkpOwogCXJlcXVlc3QubGVuID0gaHRvbmwoc2l6ZSk7CiAJbWVtY3B5KHJlcXVlc3QuaGFuZGxlLCAmcmVxLCBzaXplb2YocmVxKSk7CiAKLQlkcHJpbnRrKERCR19UWCwgIiVzOiByZXF1ZXN0ICVwOiBzZW5kaW5nIGNvbnRyb2wgKCVzQCVsbHUsJWx1QilcbiIsCisJZHByaW50ayhEQkdfVFgsICIlczogcmVxdWVzdCAlcDogc2VuZGluZyBjb250cm9sICglc0AlbGx1LCV1QilcbiIsCiAJCQlsby0+ZGlzay0+ZGlza19uYW1lLCByZXEsCiAJCQluYmRjbWRfdG9fYXNjaWkobmJkX2NtZChyZXEpKSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVxLT5zZWN0b3IgPDwgOSwKLQkJCXJlcS0+bnJfc2VjdG9ycyA8PCA5KTsKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxrX3JxX3BvcyhyZXEpIDw8IDksCisJCQlibGtfcnFfYnl0ZXMocmVxKSk7CiAJcmVzdWx0ID0gc29ja194bWl0KGxvLCAxLCAmcmVxdWVzdCwgc2l6ZW9mKHJlcXVlc3QpLAogCQkJKG5iZF9jbWQocmVxKSA9PSBOQkRfQ01EX1dSSVRFKSA/IE1TR19NT1JFIDogMCk7CiAJaWYgKHJlc3VsdCA8PSAwKSB7CkBAIC01MzMsMTEgKzUzMyw5IEBACiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAkKLQl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpIHsKKwl3aGlsZSAoKHJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpKSAhPSBOVUxMKSB7CiAJCXN0cnVjdCBuYmRfZGV2aWNlICpsbzsKIAotCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7Ci0KIAkJc3Bpbl91bmxvY2tfaXJxKHEtPnF1ZXVlX2xvY2spOwogCiAJCWRwcmludGsoREJHX0JMS0RFViwgIiVzOiByZXF1ZXN0ICVwOiBkZXF1ZXVlZCAoZmxhZ3M9JXgpXG4iLApAQCAtNTgwLDEzICs1NzgsNiBAQAogCQlibGtfcnFfaW5pdChOVUxMLCAmc3JlcSk7CiAJCXNyZXEuY21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwogCQluYmRfY21kKCZzcmVxKSA9IE5CRF9DTURfRElTQzsKLQkJLyoKLQkJICogU2V0IHRoZXNlIHRvIHNhbmUgdmFsdWVzIGluIGNhc2Ugc2VydmVyIGltcGxlbWVudGF0aW9uCi0JCSAqIGZhaWxzIHRvIGNoZWNrIHRoZSByZXF1ZXN0IHR5cGUgZmlyc3QgYW5kIGFsc28gdG8ga2VlcAotCQkgKiBkZWJ1Z2dpbmcgb3V0cHV0IGNsZWFuZXIuCi0JCSAqLwotCQlzcmVxLnNlY3RvciA9IDA7Ci0JCXNyZXEubnJfc2VjdG9ycyA9IDA7CiAJCWlmICghbG8tPnNvY2spCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbmJkX3NlbmRfcmVxKGxvLCAmc3JlcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wY2QuYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCmluZGV4IGU5MWQ0YjQuLjkxMWRmZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BjZC5jCkBAIC03MTksMzIgKzcxOSwzNyBAQAogCWlmIChwY2RfYnVzeSkKIAkJcmV0dXJuOwogCXdoaWxlICgxKSB7Ci0JCXBjZF9yZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOwotCQlpZiAoIXBjZF9yZXEpCi0JCQlyZXR1cm47CisJCWlmICghcGNkX3JlcSkgeworCQkJcGNkX3JlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOworCQkJaWYgKCFwY2RfcmVxKQorCQkJCXJldHVybjsKKwkJfQogCiAJCWlmIChycV9kYXRhX2RpcihwY2RfcmVxKSA9PSBSRUFEKSB7CiAJCQlzdHJ1Y3QgcGNkX3VuaXQgKmNkID0gcGNkX3JlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwogCQkJaWYgKGNkICE9IHBjZF9jdXJyZW50KQogCQkJCXBjZF9idWZibGsgPSAtMTsKIAkJCXBjZF9jdXJyZW50ID0gY2Q7Ci0JCQlwY2Rfc2VjdG9yID0gcGNkX3JlcS0+c2VjdG9yOwotCQkJcGNkX2NvdW50ID0gcGNkX3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzOworCQkJcGNkX3NlY3RvciA9IGJsa19ycV9wb3MocGNkX3JlcSk7CisJCQlwY2RfY291bnQgPSBibGtfcnFfY3VyX3NlY3RvcnMocGNkX3JlcSk7CiAJCQlwY2RfYnVmID0gcGNkX3JlcS0+YnVmZmVyOwogCQkJcGNkX2J1c3kgPSAxOwogCQkJcHNfc2V0X2ludHIoZG9fcGNkX3JlYWQsIE5VTEwsIDAsIG5pY2UpOwogCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCWVuZF9yZXF1ZXN0KHBjZF9yZXEsIDApOworCQl9IGVsc2UgeworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHBjZF9yZXEsIC1FSU8pOworCQkJcGNkX3JlcSA9IE5VTEw7CisJCX0KIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuZXh0X3JlcXVlc3QoaW50IHN1Y2Nlc3MpCitzdGF0aWMgaW5saW5lIHZvaWQgbmV4dF9yZXF1ZXN0KGludCBlcnIpCiB7CiAJdW5zaWduZWQgbG9uZyBzYXZlZF9mbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwY2RfbG9jaywgc2F2ZWRfZmxhZ3MpOwotCWVuZF9yZXF1ZXN0KHBjZF9yZXEsIHN1Y2Nlc3MpOworCWlmICghX19ibGtfZW5kX3JlcXVlc3RfY3VyKHBjZF9yZXEsIGVycikpCisJCXBjZF9yZXEgPSBOVUxMOwogCXBjZF9idXN5ID0gMDsKIAlkb19wY2RfcmVxdWVzdChwY2RfcXVldWUpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjZF9sb2NrLCBzYXZlZF9mbGFncyk7CkBAIC03ODEsNyArNzg2LDcgQEAKIAogCWlmIChwY2RfY29tbWFuZChwY2RfY3VycmVudCwgcmRfY21kLCAyMDQ4LCAicmVhZCBibG9jayIpKSB7CiAJCXBjZF9idWZibGsgPSAtMTsKLQkJbmV4dF9yZXF1ZXN0KDApOworCQluZXh0X3JlcXVlc3QoLUVJTyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTc5Niw3ICs4MDEsNyBAQAogCXBjZF9yZXRyaWVzID0gMDsKIAlwY2RfdHJhbnNmZXIoKTsKIAlpZiAoIXBjZF9jb3VudCkgewotCQluZXh0X3JlcXVlc3QoMSk7CisJCW5leHRfcmVxdWVzdCgwKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtODE1LDcgKzgyMCw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJcGNkX2J1ZmJsayA9IC0xOwotCQluZXh0X3JlcXVlc3QoMCk7CisJCW5leHRfcmVxdWVzdCgtRUlPKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGQuYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BkLmMKaW5kZXggOTI5OTQ1NS4uYmY1OTU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZC5jCkBAIC00MTAsMTAgKzQxMCwxMiBAQAogCQkJCXBkX2NsYWltZWQgPSAwOwogCQkJCXBoYXNlID0gTlVMTDsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRfbG9jaywgc2F2ZWRfZmxhZ3MpOwotCQkJCWVuZF9yZXF1ZXN0KHBkX3JlcSwgcmVzKTsKLQkJCQlwZF9yZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHBkX3F1ZXVlKTsKLQkJCQlpZiAoIXBkX3JlcSkKLQkJCQkJc3RvcCA9IDE7CisJCQkJaWYgKCFfX2Jsa19lbmRfcmVxdWVzdF9jdXIocGRfcmVxLAorCQkJCQkJcmVzID09IE9rID8gMCA6IC1FSU8pKSB7CisJCQkJCXBkX3JlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHBkX3F1ZXVlKTsKKwkJCQkJaWYgKCFwZF9yZXEpCisJCQkJCQlzdG9wID0gMTsKKwkJCQl9CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRfbG9jaywgc2F2ZWRfZmxhZ3MpOwogCQkJCWlmIChzdG9wKQogCQkJCQlyZXR1cm47CkBAIC00NDMsMTEgKzQ0NSwxMSBAQAogCiAJcGRfY21kID0gcnFfZGF0YV9kaXIocGRfcmVxKTsKIAlpZiAocGRfY21kID09IFJFQUQgfHwgcGRfY21kID09IFdSSVRFKSB7Ci0JCXBkX2Jsb2NrID0gcGRfcmVxLT5zZWN0b3I7Ci0JCXBkX2NvdW50ID0gcGRfcmVxLT5jdXJyZW50X25yX3NlY3RvcnM7CisJCXBkX2Jsb2NrID0gYmxrX3JxX3BvcyhwZF9yZXEpOworCQlwZF9jb3VudCA9IGJsa19ycV9jdXJfc2VjdG9ycyhwZF9yZXEpOwogCQlpZiAocGRfYmxvY2sgKyBwZF9jb3VudCA+IGdldF9jYXBhY2l0eShwZF9yZXEtPnJxX2Rpc2spKQogCQkJcmV0dXJuIEZhaWw7Ci0JCXBkX3J1biA9IHBkX3JlcS0+bnJfc2VjdG9yczsKKwkJcGRfcnVuID0gYmxrX3JxX3NlY3RvcnMocGRfcmVxKTsKIAkJcGRfYnVmID0gcGRfcmVxLT5idWZmZXI7CiAJCXBkX3JldHJpZXMgPSAwOwogCQlpZiAocGRfY21kID09IFJFQUQpCkBAIC00NzcsOCArNDc5LDggQEAKIAlpZiAocGRfY291bnQpCiAJCXJldHVybiAwOwogCXNwaW5fbG9ja19pcnFzYXZlKCZwZF9sb2NrLCBzYXZlZF9mbGFncyk7Ci0JZW5kX3JlcXVlc3QocGRfcmVxLCAxKTsKLQlwZF9jb3VudCA9IHBkX3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzOworCV9fYmxrX2VuZF9yZXF1ZXN0X2N1cihwZF9yZXEsIDApOworCXBkX2NvdW50ID0gYmxrX3JxX2N1cl9zZWN0b3JzKHBkX3JlcSk7CiAJcGRfYnVmID0gcGRfcmVxLT5idWZmZXI7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRfbG9jaywgc2F2ZWRfZmxhZ3MpOwogCXJldHVybiAwOwpAQCAtNzAyLDcgKzcwNCw3IEBACiB7CiAJaWYgKHBkX3JlcSkKIAkJcmV0dXJuOwotCXBkX3JlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CisJcGRfcmVxID0gYmxrX2ZldGNoX3JlcXVlc3QocSk7CiAJaWYgKCFwZF9yZXEpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9wYXJpZGUvcGYuYyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMKaW5kZXggYmVmM2I5OS4uNjhhOTA4MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BmLmMKKysrIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGYuYwpAQCAtNzUwLDEyICs3NTAsMTAgQEAKIAogc3RhdGljIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpwZl9xdWV1ZTsKIAotc3RhdGljIHZvaWQgcGZfZW5kX3JlcXVlc3QoaW50IHVwdG9kYXRlKQorc3RhdGljIHZvaWQgcGZfZW5kX3JlcXVlc3QoaW50IGVycikKIHsKLQlpZiAocGZfcmVxKSB7Ci0JCWVuZF9yZXF1ZXN0KHBmX3JlcSwgdXB0b2RhdGUpOworCWlmIChwZl9yZXEgJiYgIV9fYmxrX2VuZF9yZXF1ZXN0X2N1cihwZl9yZXEsIGVycikpCiAJCXBmX3JlcSA9IE5VTEw7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBkb19wZl9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICogcSkKQEAgLTc2MywxNyArNzYxLDE5IEBACiAJaWYgKHBmX2J1c3kpCiAJCXJldHVybjsKIHJlcGVhdDoKLQlwZl9yZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOwotCWlmICghcGZfcmVxKQotCQlyZXR1cm47CisJaWYgKCFwZl9yZXEpIHsKKwkJcGZfcmVxID0gYmxrX2ZldGNoX3JlcXVlc3QocSk7CisJCWlmICghcGZfcmVxKQorCQkJcmV0dXJuOworCX0KIAogCXBmX2N1cnJlbnQgPSBwZl9yZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQlwZl9ibG9jayA9IHBmX3JlcS0+c2VjdG9yOwotCXBmX3J1biA9IHBmX3JlcS0+bnJfc2VjdG9yczsKLQlwZl9jb3VudCA9IHBmX3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzOworCXBmX2Jsb2NrID0gYmxrX3JxX3BvcyhwZl9yZXEpOworCXBmX3J1biA9IGJsa19ycV9zZWN0b3JzKHBmX3JlcSk7CisJcGZfY291bnQgPSBibGtfcnFfY3VyX3NlY3RvcnMocGZfcmVxKTsKIAogCWlmIChwZl9ibG9jayArIHBmX2NvdW50ID4gZ2V0X2NhcGFjaXR5KHBmX3JlcS0+cnFfZGlzaykpIHsKLQkJcGZfZW5kX3JlcXVlc3QoMCk7CisJCXBmX2VuZF9yZXF1ZXN0KC1FSU8pOwogCQlnb3RvIHJlcGVhdDsKIAl9CiAKQEAgLTc4OCw3ICs3ODgsNyBAQAogCQlwaV9kb19jbGFpbWVkKHBmX2N1cnJlbnQtPnBpLCBkb19wZl93cml0ZSk7CiAJZWxzZSB7CiAJCXBmX2J1c3kgPSAwOwotCQlwZl9lbmRfcmVxdWVzdCgwKTsKKwkJcGZfZW5kX3JlcXVlc3QoLUVJTyk7CiAJCWdvdG8gcmVwZWF0OwogCX0KIH0KQEAgLTgwNSwyMyArODA1LDIyIEBACiAJCXJldHVybiAxOwogCWlmICghcGZfY291bnQpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBmX3NwaW5fbG9jaywgc2F2ZWRfZmxhZ3MpOwotCQlwZl9lbmRfcmVxdWVzdCgxKTsKLQkJcGZfcmVxID0gZWx2X25leHRfcmVxdWVzdChwZl9xdWV1ZSk7CisJCXBmX2VuZF9yZXF1ZXN0KDApOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZl9zcGluX2xvY2ssIHNhdmVkX2ZsYWdzKTsKIAkJaWYgKCFwZl9yZXEpCiAJCQlyZXR1cm4gMTsKLQkJcGZfY291bnQgPSBwZl9yZXEtPmN1cnJlbnRfbnJfc2VjdG9yczsKKwkJcGZfY291bnQgPSBibGtfcnFfY3VyX3NlY3RvcnMocGZfcmVxKTsKIAkJcGZfYnVmID0gcGZfcmVxLT5idWZmZXI7CiAJfQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV4dF9yZXF1ZXN0KGludCBzdWNjZXNzKQorc3RhdGljIGlubGluZSB2b2lkIG5leHRfcmVxdWVzdChpbnQgZXJyKQogewogCXVuc2lnbmVkIGxvbmcgc2F2ZWRfZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGZfc3Bpbl9sb2NrLCBzYXZlZF9mbGFncyk7Ci0JcGZfZW5kX3JlcXVlc3Qoc3VjY2Vzcyk7CisJcGZfZW5kX3JlcXVlc3QoZXJyKTsKIAlwZl9idXN5ID0gMDsKIAlkb19wZl9yZXF1ZXN0KHBmX3F1ZXVlKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZl9zcGluX2xvY2ssIHNhdmVkX2ZsYWdzKTsKQEAgLTg0NCw3ICs4NDMsNyBAQAogCQkJcGlfZG9fY2xhaW1lZChwZl9jdXJyZW50LT5waSwgZG9fcGZfcmVhZF9zdGFydCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJbmV4dF9yZXF1ZXN0KDApOworCQluZXh0X3JlcXVlc3QoLUVJTyk7CiAJCXJldHVybjsKIAl9CiAJcGZfbWFzayA9IFNUQVRfRFJROwpAQCAtODYzLDcgKzg2Miw3IEBACiAJCQkJcGlfZG9fY2xhaW1lZChwZl9jdXJyZW50LT5waSwgZG9fcGZfcmVhZF9zdGFydCk7CiAJCQkJcmV0dXJuOwogCQkJfQotCQkJbmV4dF9yZXF1ZXN0KDApOworCQkJbmV4dF9yZXF1ZXN0KC1FSU8pOwogCQkJcmV0dXJuOwogCQl9CiAJCXBpX3JlYWRfYmxvY2socGZfY3VycmVudC0+cGksIHBmX2J1ZiwgNTEyKTsKQEAgLTg3MSw3ICs4NzAsNyBAQAogCQkJYnJlYWs7CiAJfQogCXBpX2Rpc2Nvbm5lY3QocGZfY3VycmVudC0+cGkpOwotCW5leHRfcmVxdWVzdCgxKTsKKwluZXh0X3JlcXVlc3QoMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRvX3BmX3dyaXRlKHZvaWQpCkBAIC04OTAsNyArODg5LDcgQEAKIAkJCXBpX2RvX2NsYWltZWQocGZfY3VycmVudC0+cGksIGRvX3BmX3dyaXRlX3N0YXJ0KTsKIAkJCXJldHVybjsKIAkJfQotCQluZXh0X3JlcXVlc3QoMCk7CisJCW5leHRfcmVxdWVzdCgtRUlPKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTAzLDcgKzkwMiw3IEBACiAJCQkJcGlfZG9fY2xhaW1lZChwZl9jdXJyZW50LT5waSwgZG9fcGZfd3JpdGVfc3RhcnQpOwogCQkJCXJldHVybjsKIAkJCX0KLQkJCW5leHRfcmVxdWVzdCgwKTsKKwkJCW5leHRfcmVxdWVzdCgtRUlPKTsKIAkJCXJldHVybjsKIAkJfQogCQlwaV93cml0ZV9ibG9jayhwZl9jdXJyZW50LT5waSwgcGZfYnVmLCA1MTIpOwpAQCAtOTIzLDExICs5MjIsMTEgQEAKIAkJCXBpX2RvX2NsYWltZWQocGZfY3VycmVudC0+cGksIGRvX3BmX3dyaXRlX3N0YXJ0KTsKIAkJCXJldHVybjsKIAkJfQotCQluZXh0X3JlcXVlc3QoMCk7CisJCW5leHRfcmVxdWVzdCgtRUlPKTsKIAkJcmV0dXJuOwogCX0KIAlwaV9kaXNjb25uZWN0KHBmX2N1cnJlbnQtPnBpKTsKLQluZXh0X3JlcXVlc3QoMSk7CisJbmV4dF9yZXF1ZXN0KDApOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBwZl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BrdGNkdmQuYyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCmluZGV4IGRjN2E4YzMuLmQ1N2YxMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGt0Y2R2ZC5jCkBAIC05OTEsMTMgKzk5MSwxNSBAQAogICovCiBzdGF0aWMgaW50IHBrdF9zZXRfc2VnbWVudF9tZXJnaW5nKHN0cnVjdCBwa3RjZHZkX2RldmljZSAqcGQsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewotCWlmICgocGQtPnNldHRpbmdzLnNpemUgPDwgOSkgLyBDRF9GUkFNRVNJWkUgPD0gcS0+bWF4X3BoeXNfc2VnbWVudHMpIHsKKwlpZiAoKHBkLT5zZXR0aW5ncy5zaXplIDw8IDkpIC8gQ0RfRlJBTUVTSVpFCisJICAgIDw9IHF1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEpKSB7CiAJCS8qCiAJCSAqIFRoZSBjZHJvbSBkZXZpY2UgY2FuIGhhbmRsZSBvbmUgc2VnbWVudC9mcmFtZQogCQkgKi8KIAkJY2xlYXJfYml0KFBBQ0tFVF9NRVJHRV9TRUdTLCAmcGQtPmZsYWdzKTsKIAkJcmV0dXJuIDA7Ci0JfSBlbHNlIGlmICgocGQtPnNldHRpbmdzLnNpemUgPDwgOSkgLyBQQUdFX1NJWkUgPD0gcS0+bWF4X3BoeXNfc2VnbWVudHMpIHsKKwl9IGVsc2UgaWYgKChwZC0+c2V0dGluZ3Muc2l6ZSA8PCA5KSAvIFBBR0VfU0laRQorCQkgICA8PSBxdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxKSkgewogCQkvKgogCQkgKiBXZSBjYW4gaGFuZGxlIHRoaXMgY2FzZSBhdCB0aGUgZXhwZW5zZSBvZiBzb21lIGV4dHJhIG1lbW9yeQogCQkgKiBjb3BpZXMgZHVyaW5nIHdyaXRlIG9wZXJhdGlvbnMKQEAgLTI2NTcsNyArMjY1OSw3IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBwZC0+ZGlzay0+cXVldWU7CiAKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KHEsIHBrdF9tYWtlX3JlcXVlc3QpOwotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHEsIENEX0ZSQU1FU0laRSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShxLCBDRF9GUkFNRVNJWkUpOwogCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCBQQUNLRVRfTUFYX1NFQ1RPUlMpOwogCWJsa19xdWV1ZV9tZXJnZV9idmVjKHEsIHBrdF9tZXJnZV9idmVjKTsKIAlxLT5xdWV1ZWRhdGEgPSBwZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcHMzZGlzay5jIGIvZHJpdmVycy9ibG9jay9wczNkaXNrLmMKaW5kZXggYmNjYzQyYi4uYWFlZWI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9wczNkaXNrLmMKKysrIGIvZHJpdmVycy9ibG9jay9wczNkaXNrLmMKQEAgLTEzNCwxMyArMTM0LDEyIEBACiAJcnFfZm9yX2VhY2hfc2VnbWVudChidiwgcmVxLCBpdGVyKQogCQluKys7CiAJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwKLQkJIiVzOiV1OiAlcyByZXEgaGFzICV1IGJ2ZWNzIGZvciAlbHUgc2VjdG9ycyAlbHUgaGFyZCBzZWN0b3JzXG4iLAotCQlfX2Z1bmNfXywgX19MSU5FX18sIG9wLCBuLCByZXEtPm5yX3NlY3RvcnMsCi0JCXJlcS0+aGFyZF9ucl9zZWN0b3JzKTsKKwkJIiVzOiV1OiAlcyByZXEgaGFzICV1IGJ2ZWNzIGZvciAldSBzZWN0b3JzXG4iLAorCQlfX2Z1bmNfXywgX19MSU5FX18sIG9wLCBuLCBibGtfcnFfc2VjdG9ycyhyZXEpKTsKICNlbmRpZgogCi0Jc3RhcnRfc2VjdG9yID0gcmVxLT5zZWN0b3IgKiBwcml2LT5ibG9ja2luZ19mYWN0b3I7Ci0Jc2VjdG9ycyA9IHJlcS0+bnJfc2VjdG9ycyAqIHByaXYtPmJsb2NraW5nX2ZhY3RvcjsKKwlzdGFydF9zZWN0b3IgPSBibGtfcnFfcG9zKHJlcSkgKiBwcml2LT5ibG9ja2luZ19mYWN0b3I7CisJc2VjdG9ycyA9IGJsa19ycV9zZWN0b3JzKHJlcSkgKiBwcml2LT5ibG9ja2luZ19mYWN0b3I7CiAJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiAlcyAlbGx1IHNlY3RvcnMgc3RhcnRpbmcgYXQgJWxsdVxuIiwKIAkJX19mdW5jX18sIF9fTElORV9fLCBvcCwgc2VjdG9ycywgc3RhcnRfc2VjdG9yKTsKIApAQCAtMTU4LDcgKzE1Nyw3IEBACiAJaWYgKHJlcykgewogCQlkZXZfZXJyKCZkZXYtPnNiZC5jb3JlLCAiJXM6JXU6ICVzIGZhaWxlZCAlZFxuIiwgX19mdW5jX18sCiAJCQlfX0xJTkVfXywgb3AsIHJlcyk7Ci0JCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE4MCw3ICsxNzksNyBAQAogCWlmIChyZXMpIHsKIAkJZGV2X2VycigmZGV2LT5zYmQuY29yZSwgIiVzOiV1OiBzeW5jIGNhY2hlIGZhaWxlZCAweCVsbHhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcyk7Ci0JCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE5NSw3ICsxOTQsNyBAQAogCiAJZGV2X2RiZygmZGV2LT5zYmQuY29yZSwgIiVzOiV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0Jd2hpbGUgKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSkgeworCXdoaWxlICgocmVxID0gYmxrX2ZldGNoX3JlcXVlc3QocSkpKSB7CiAJCWlmIChibGtfZnNfcmVxdWVzdChyZXEpKSB7CiAJCQlpZiAocHMzZGlza19zdWJtaXRfcmVxdWVzdF9zZyhkZXYsIHJlcSkpCiAJCQkJYnJlYWs7CkBAIC0yMDUsNyArMjA0LDcgQEAKIAkJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCWJsa19kdW1wX3JxX2ZsYWdzKHJlcSwgREVWSUNFX05BTUUgIiBiYWQgcmVxdWVzdCIpOwotCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQkJY29udGludWU7CiAJCX0KIAl9CkBAIC0yMzEsNyArMjMwLDYgQEAKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCWludCByZXMsIHJlYWQsIGVycm9yOwogCXU2NCB0YWcsIHN0YXR1czsKLQl1bnNpZ25lZCBsb25nIG51bV9zZWN0b3JzOwogCWNvbnN0IGNoYXIgKm9wOwogCiAJcmVzID0gbHYxX3N0b3JhZ2VfZ2V0X2FzeW5jX3N0YXR1cyhkZXYtPnNiZC5kZXZfaWQsICZ0YWcsICZzdGF0dXMpOwpAQCAtMjYxLDExICsyNTksOSBAQAogCWlmIChyZXEtPmNtZF90eXBlID09IFJFUV9UWVBFX0xJTlVYX0JMT0NLICYmCiAJICAgIHJlcS0+Y21kWzBdID09IFJFUV9MQl9PUF9GTFVTSCkgewogCQlyZWFkID0gMDsKLQkJbnVtX3NlY3RvcnMgPSByZXEtPmhhcmRfY3VyX3NlY3RvcnM7CiAJCW9wID0gImZsdXNoIjsKIAl9IGVsc2UgewogCQlyZWFkID0gIXJxX2RhdGFfZGlyKHJlcSk7Ci0JCW51bV9zZWN0b3JzID0gcmVxLT5ucl9zZWN0b3JzOwogCQlvcCA9IHJlYWQgPyAicmVhZCIgOiAid3JpdGUiOwogCX0KIAlpZiAoc3RhdHVzKSB7CkBAIC0yODEsNyArMjc3LDcgQEAKIAl9CiAKIAlzcGluX2xvY2soJnByaXYtPmxvY2spOwotCV9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyb3IsIG51bV9zZWN0b3JzIDw8IDkpOworCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIGVycm9yKTsKIAlwcml2LT5yZXEgPSBOVUxMOwogCXBzM2Rpc2tfZG9fcmVxdWVzdChkZXYsIHByaXYtPnF1ZXVlKTsKIAlzcGluX3VubG9jaygmcHJpdi0+bG9jayk7CkBAIC00ODEsNyArNDc3LDcgQEAKIAlibGtfcXVldWVfbWF4X3NlY3RvcnMocXVldWUsIGRldi0+Ym91bmNlX3NpemUgPj4gOSk7CiAJYmxrX3F1ZXVlX3NlZ21lbnRfYm91bmRhcnkocXVldWUsIC0xVUwpOwogCWJsa19xdWV1ZV9kbWFfYWxpZ25tZW50KHF1ZXVlLCBkZXYtPmJsa19zaXplLTEpOwotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHF1ZXVlLCBkZXYtPmJsa19zaXplKTsKKwlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHF1ZXVlLCBkZXYtPmJsa19zaXplKTsKIAogCWJsa19xdWV1ZV9vcmRlcmVkKHF1ZXVlLCBRVUVVRV9PUkRFUkVEX0RSQUlOX0ZMVVNILAogCQkJICBwczNkaXNrX3ByZXBhcmVfZmx1c2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9zdW52ZGMuYyBiL2RyaXZlcnMvYmxvY2svc3VudmRjLmMKaW5kZXggNTg2MWUzMy4uY2JmZDljMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zdW52ZGMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N1bnZkYy5jCkBAIC0yMTIsMTEgKzIxMiw2IEBACiAJdmRjX2ZpbmlzaCgmcG9ydC0+dmlvLCAtZXJyLCBXQUlUSU5HX0ZPUl9HRU5fQ01EKTsKIH0KIAotc3RhdGljIHZvaWQgdmRjX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIGludCBlcnJvciwgaW50IG51bV9zZWN0b3JzKQotewotCV9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyb3IsIG51bV9zZWN0b3JzIDw8IDkpOwotfQotCiBzdGF0aWMgdm9pZCB2ZGNfZW5kX29uZShzdHJ1Y3QgdmRjX3BvcnQgKnBvcnQsIHN0cnVjdCB2aW9fZHJpbmdfc3RhdGUgKmRyLAogCQkJdW5zaWduZWQgaW50IGluZGV4KQogewpAQCAtMjM5LDcgKzIzNCw3IEBACiAKIAlycWUtPnJlcSA9IE5VTEw7CiAKLQl2ZGNfZW5kX3JlcXVlc3QocmVxLCAoZGVzYy0+c3RhdHVzID8gLUVJTyA6IDApLCBkZXNjLT5zaXplID4+IDkpOworCV9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgKGRlc2MtPnN0YXR1cyA/IC1FSU8gOiAwKSwgZGVzYy0+c2l6ZSk7CiAKIAlpZiAoYmxrX3F1ZXVlX3N0b3BwZWQocG9ydC0+ZGlzay0+cXVldWUpKQogCQlibGtfc3RhcnRfcXVldWUocG9ydC0+ZGlzay0+cXVldWUpOwpAQCAtNDIxLDcgKzQxNiw3IEBACiAJCWRlc2MtPnNsaWNlID0gMDsKIAl9CiAJZGVzYy0+c3RhdHVzID0gfjA7Ci0JZGVzYy0+b2Zmc2V0ID0gKHJlcS0+c2VjdG9yIDw8IDkpIC8gcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZTsKKwlkZXNjLT5vZmZzZXQgPSAoYmxrX3JxX3BvcyhyZXEpIDw8IDkpIC8gcG9ydC0+dmRpc2tfYmxvY2tfc2l6ZTsKIAlkZXNjLT5zaXplID0gbGVuOwogCWRlc2MtPm5jb29raWVzID0gZXJyOwogCkBAIC00NDYsMTQgKzQ0MSwxMyBAQAogc3RhdGljIHZvaWQgZG9fdmRjX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJd2hpbGUgKDEpIHsKLQkJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CisJCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKTsKIAogCQlpZiAoIXJlcSkKIAkJCWJyZWFrOwogCi0JCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKIAkJaWYgKF9fc2VuZF9yZXF1ZXN0KHJlcSkgPCAwKQotCQkJdmRjX2VuZF9yZXF1ZXN0KHJlcSwgLUVJTywgcmVxLT5oYXJkX25yX3NlY3RvcnMpOworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N3aW0uYyBiL2RyaXZlcnMvYmxvY2svc3dpbS5jCmluZGV4IGQyMmNjMzguLmNmNzg3N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3dpbS5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3dpbS5jCkBAIC01MTQsNyArNTE0LDcgQEAKIAkJCXJldCA9IHN3aW1fcmVhZF9zZWN0b3IoZnMsIHNpZGUsIHRyYWNrLCBzZWN0b3IsCiAJCQkJCQlidWZmZXIpOwogCQkJaWYgKHRyeS0tID09IDApCi0JCQkJcmV0dXJuIC0xOworCQkJCXJldHVybiAtRUlPOwogCQl9IHdoaWxlIChyZXQgIT0gNTEyKTsKIAogCQlidWZmZXIgKz0gcmV0OwpAQCAtNTI4LDQ1ICs1MjgsMzEgQEAKIAlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwogCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzOwogCi0Jd2hpbGUgKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSkgeworCXJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOworCXdoaWxlIChyZXEpIHsKKwkJaW50IGVyciA9IC1FSU87CiAKIAkJZnMgPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQkJaWYgKHJlcS0+c2VjdG9yIDwgMCB8fCByZXEtPnNlY3RvciA+PSBmcy0+dG90YWxfc2VjcykgewotCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA9PSAwKSB7Ci0JCQllbmRfcmVxdWVzdChyZXEsIDEpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFmcy0+ZGlza19pbikgewotCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKSB7Ci0JCQlpZiAoZnMtPndyaXRlX3Byb3RlY3RlZCkgewotCQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KKwkJaWYgKGJsa19ycV9wb3MocmVxKSA+PSBmcy0+dG90YWxfc2VjcykKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKCFmcy0+ZGlza19pbikKKwkJCWdvdG8gZG9uZTsKKwkJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUgJiYgZnMtPndyaXRlX3Byb3RlY3RlZCkKKwkJCWdvdG8gZG9uZTsKKwogCQlzd2l0Y2ggKHJxX2RhdGFfZGlyKHJlcSkpIHsKIAkJY2FzZSBXUklURToKIAkJCS8qIE5PVCBJTVBMRU1FTlRFRCAqLwotCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIFJFQUQ6Ci0JCQlpZiAoZmxvcHB5X3JlYWRfc2VjdG9ycyhmcywgcmVxLT5zZWN0b3IsCi0JCQkJCQlyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycywKLQkJCQkJCXJlcS0+YnVmZmVyKSkgewotCQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXEtPm5yX3NlY3RvcnMgLT0gcmVxLT5jdXJyZW50X25yX3NlY3RvcnM7Ci0JCQlyZXEtPnNlY3RvciArPSByZXEtPmN1cnJlbnRfbnJfc2VjdG9yczsKLQkJCXJlcS0+YnVmZmVyICs9IHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzICogNTEyOwotCQkJZW5kX3JlcXVlc3QocmVxLCAxKTsKKwkJCWVyciA9IGZsb3BweV9yZWFkX3NlY3RvcnMoZnMsIGJsa19ycV9wb3MocmVxKSwKKwkJCQkJCSAgYmxrX3JxX2N1cl9zZWN0b3JzKHJlcSksCisJCQkJCQkgIHJlcS0+YnVmZmVyKTsKIAkJCWJyZWFrOwogCQl9CisJZG9uZToKKwkJaWYgKCFfX2Jsa19lbmRfcmVxdWVzdF9jdXIocmVxLCBlcnIpKQorCQkJcmVxID0gYmxrX2ZldGNoX3JlcXVlc3QocSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKaW5kZXggNjEyOTY1MzAuLjgwZGY5M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3dpbTMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKQEAgLTI1MSw2ICsyNTEsMjAgQEAKIHN0YXRpYyBpbnQgZmxvcHB5X2NoZWNrX2NoYW5nZShzdHJ1Y3QgZ2VuZGlzayAqZGlzayk7CiBzdGF0aWMgaW50IGZsb3BweV9yZXZhbGlkYXRlKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKIAorc3RhdGljIGJvb2wgc3dpbTNfZW5kX3JlcXVlc3QoaW50IGVyciwgdW5zaWduZWQgaW50IG5yX2J5dGVzKQoreworCWlmIChfX2Jsa19lbmRfcmVxdWVzdChmZF9yZXEsIGVyciwgbnJfYnl0ZXMpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWZkX3JlcSA9IE5VTEw7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBzd2ltM19lbmRfcmVxdWVzdF9jdXIoaW50IGVycikKK3sKKwlyZXR1cm4gc3dpbTNfZW5kX3JlcXVlc3QoZXJyLCBibGtfcnFfY3VyX2J5dGVzKGZkX3JlcSkpOworfQorCiBzdGF0aWMgdm9pZCBzd2ltM19zZWxlY3Qoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGludCBzZWwpCiB7CiAJc3RydWN0IHN3aW0zIF9faW9tZW0gKnN3ID0gZnMtPnN3aW0zOwpAQCAtMzEwLDI1ICszMjQsMjcgQEAKIAkJd2FrZV91cCgmZnMtPndhaXQpOwogCQlyZXR1cm47CiAJfQotCXdoaWxlIChmcy0+c3RhdGUgPT0gaWRsZSAmJiAocmVxID0gZWx2X25leHRfcmVxdWVzdChzd2ltM19xdWV1ZSkpKSB7CisJd2hpbGUgKGZzLT5zdGF0ZSA9PSBpZGxlKSB7CisJCWlmICghZmRfcmVxKSB7CisJCQlmZF9yZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChzd2ltM19xdWV1ZSk7CisJCQlpZiAoIWZkX3JlcSkKKwkJCQlicmVhazsKKwkJfQorCQlyZXEgPSBmZF9yZXE7CiAjaWYgMAotCQlwcmludGsoImRvX2ZkX3JlcTogZGV2PSVzIGNtZD0lZCBzZWM9JWxkIG5yX3NlYz0lbGQgYnVmPSVwXG4iLAorCQlwcmludGsoImRvX2ZkX3JlcTogZGV2PSVzIGNtZD0lZCBzZWM9JWxkIG5yX3NlYz0ldSBidWY9JXBcbiIsCiAJCSAgICAgICByZXEtPnJxX2Rpc2stPmRpc2tfbmFtZSwgcmVxLT5jbWQsCi0JCSAgICAgICAobG9uZylyZXEtPnNlY3RvciwgcmVxLT5ucl9zZWN0b3JzLCByZXEtPmJ1ZmZlcik7Ci0JCXByaW50aygiICAgICAgICAgICBlcnJvcnM9JWQgY3VycmVudF9ucl9zZWN0b3JzPSVsZFxuIiwKLQkJICAgICAgIHJlcS0+ZXJyb3JzLCByZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisJCSAgICAgICAobG9uZylibGtfcnFfcG9zKHJlcSksIGJsa19ycV9zZWN0b3JzKHJlcSksIHJlcS0+YnVmZmVyKTsKKwkJcHJpbnRrKCIgICAgICAgICAgIGVycm9ycz0lZCBjdXJyZW50X25yX3NlY3RvcnM9JXVcbiIsCisJCSAgICAgICByZXEtPmVycm9ycywgYmxrX3JxX2N1cl9zZWN0b3JzKHJlcSkpOwogI2VuZGlmCiAKLQkJaWYgKHJlcS0+c2VjdG9yIDwgMCB8fCByZXEtPnNlY3RvciA+PSBmcy0+dG90YWxfc2VjcykgewotCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChyZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA9PSAwKSB7Ci0JCQllbmRfcmVxdWVzdChyZXEsIDEpOworCQlpZiAoYmxrX3JxX3BvcyhyZXEpID49IGZzLT50b3RhbF9zZWNzKSB7CisJCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoZnMtPmVqZWN0ZWQpIHsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7CisJCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0zMzYsMTggKzM1MiwxOSBAQAogCQkJaWYgKGZzLT53cml0ZV9wcm90IDwgMCkKIAkJCQlmcy0+d3JpdGVfcHJvdCA9IHN3aW0zX3JlYWRiaXQoZnMsIFdSSVRFX1BST1QpOwogCQkJaWYgKGZzLT53cml0ZV9wcm90KSB7Ci0JCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwkJCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KIAotCQkvKiBEbyBub3QgcmVtb3ZlIHRoZSBjYXN0LiByZXEtPnNlY3RvciBpcyBub3cgYSBzZWN0b3JfdCBhbmQKLQkJICogY2FuIGJlIDY0IGJpdHMsIGJ1dCBpdCB3aWxsIG5ldmVyIGdvIHBhc3QgMzIgYml0cyBmb3IgdGhpcwotCQkgKiBkcml2ZXIgYW55d2F5LCBzbyB3ZSBjYW4gc2FmZWx5IGNhc3QgaXQgZG93biBhbmQgbm90IGhhdmUKLQkJICogdG8gZG8gYSA2NC8zMiBkaXZpc2lvbgorCQkvKiBEbyBub3QgcmVtb3ZlIHRoZSBjYXN0LiBibGtfcnFfcG9zKHJlcSkgaXMgbm93IGEKKwkJICogc2VjdG9yX3QgYW5kIGNhbiBiZSA2NCBiaXRzLCBidXQgaXQgd2lsbCBuZXZlciBnbworCQkgKiBwYXN0IDMyIGJpdHMgZm9yIHRoaXMgZHJpdmVyIGFueXdheSwgc28gd2UgY2FuCisJCSAqIHNhZmVseSBjYXN0IGl0IGRvd24gYW5kIG5vdCBoYXZlIHRvIGRvIGEgNjQvMzIKKwkJICogZGl2aXNpb24KIAkJICovCi0JCWZzLT5yZXFfY3lsID0gKChsb25nKXJlcS0+c2VjdG9yKSAvIGZzLT5zZWNwZXJjeWw7Ci0JCXggPSAoKGxvbmcpcmVxLT5zZWN0b3IpICUgZnMtPnNlY3BlcmN5bDsKKwkJZnMtPnJlcV9jeWwgPSAoKGxvbmcpYmxrX3JxX3BvcyhyZXEpKSAvIGZzLT5zZWNwZXJjeWw7CisJCXggPSAoKGxvbmcpYmxrX3JxX3BvcyhyZXEpKSAlIGZzLT5zZWNwZXJjeWw7CiAJCWZzLT5oZWFkID0geCAvIGZzLT5zZWNwZXJ0cmFjazsKIAkJZnMtPnJlcV9zZWN0b3IgPSB4ICUgZnMtPnNlY3BlcnRyYWNrICsgMTsKIAkJZmRfcmVxID0gcmVxOwpAQCAtNDI0LDcgKzQ0MSw3IEBACiAJc3RydWN0IGRiZG1hX2NtZCAqY3AgPSBmcy0+ZG1hX2NtZDsKIAlzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkciA9IGZzLT5kbWE7CiAKLQlpZiAoZmRfcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgPD0gMCkgeworCWlmIChibGtfcnFfY3VyX3NlY3RvcnMoZmRfcmVxKSA8PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAic3dpbTM6IHRyYW5zZmVyIDAgc2VjdG9ycz9cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtNDMyLDggKzQ0OSw4IEBACiAJCW4gPSAxOwogCWVsc2UgewogCQluID0gZnMtPnNlY3BlcnRyYWNrIC0gZnMtPnJlcV9zZWN0b3IgKyAxOwotCQlpZiAobiA+IGZkX3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzKQotCQkJbiA9IGZkX3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzOworCQlpZiAobiA+IGJsa19ycV9jdXJfc2VjdG9ycyhmZF9yZXEpKQorCQkJbiA9IGJsa19ycV9jdXJfc2VjdG9ycyhmZF9yZXEpOwogCX0KIAlmcy0+c2NvdW50ID0gbjsKIAlzd2ltM19zZWxlY3QoZnMsIGZzLT5oZWFkPyBSRUFEX0RBVEFfMTogUkVBRF9EQVRBXzApOwpAQCAtNTA4LDcgKzUyNSw3IEBACiAJCWNhc2UgZG9fdHJhbnNmZXI6CiAJCQlpZiAoZnMtPmN1cl9jeWwgIT0gZnMtPnJlcV9jeWwpIHsKIAkJCQlpZiAoZnMtPnJldHJpZXMgPiA1KSB7Ci0JCQkJCWVuZF9yZXF1ZXN0KGZkX3JlcSwgMCk7CisJCQkJCXN3aW0zX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKIAkJCQkJZnMtPnN0YXRlID0gaWRsZTsKIAkJCQkJcmV0dXJuOwogCQkJCX0KQEAgLTU0MCw3ICs1NTcsNyBAQAogCW91dF84KCZzdy0+aW50cl9lbmFibGUsIDApOwogCWZzLT5jdXJfY3lsID0gLTE7CiAJaWYgKGZzLT5yZXRyaWVzID4gNSkgewotCQllbmRfcmVxdWVzdChmZF9yZXEsIDApOworCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CiAJCWZzLT5zdGF0ZSA9IGlkbGU7CiAJCXN0YXJ0X3JlcXVlc3QoZnMpOwogCX0gZWxzZSB7CkBAIC01NTksNyArNTc2LDcgQEAKIAlvdXRfOCgmc3ctPnNlbGVjdCwgUkVMQVgpOwogCW91dF84KCZzdy0+aW50cl9lbmFibGUsIDApOwogCXByaW50ayhLRVJOX0VSUiAic3dpbTM6IHNlZWsgdGltZW91dFxuIik7Ci0JZW5kX3JlcXVlc3QoZmRfcmVxLCAwKTsKKwlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CiAJZnMtPnN0YXRlID0gaWRsZTsKIAlzdGFydF9yZXF1ZXN0KGZzKTsKIH0KQEAgLTU4Myw3ICs2MDAsNyBAQAogCQlyZXR1cm47CiAJfQogCXByaW50ayhLRVJOX0VSUiAic3dpbTM6IHNlZWsgc2V0dGxlIHRpbWVvdXRcbiIpOwotCWVuZF9yZXF1ZXN0KGZkX3JlcSwgMCk7CisJc3dpbTNfZW5kX3JlcXVlc3RfY3VyKC1FSU8pOwogCWZzLT5zdGF0ZSA9IGlkbGU7CiAJc3RhcnRfcmVxdWVzdChmcyk7CiB9CkBAIC01OTMsOCArNjEwLDYgQEAKIAlzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyA9IChzdHJ1Y3QgZmxvcHB5X3N0YXRlICopIGRhdGE7CiAJc3RydWN0IHN3aW0zIF9faW9tZW0gKnN3ID0gZnMtPnN3aW0zOwogCXN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRyID0gZnMtPmRtYTsKLQlzdHJ1Y3QgZGJkbWFfY21kICpjcCA9IGZzLT5kbWFfY21kOwotCXVuc2lnbmVkIGxvbmcgczsKIAlpbnQgbjsKIAogCWZzLT50aW1lb3V0X3BlbmRpbmcgPSAwOwpAQCAtNjA1LDE3ICs2MjAsMTAgQEAKIAlvdXRfOCgmc3ctPmludHJfZW5hYmxlLCAwKTsKIAlvdXRfOCgmc3ctPmNvbnRyb2xfYmljLCBXUklURV9TRUNUT1JTIHwgRE9fQUNUSU9OKTsKIAlvdXRfOCgmc3ctPnNlbGVjdCwgUkVMQVgpOwotCWlmIChycV9kYXRhX2RpcihmZF9yZXEpID09IFdSSVRFKQotCQkrK2NwOwotCWlmIChsZF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMpICE9IDApCi0JCXMgPSBmcy0+c2NvdW50IC0gKChsZF9sZTE2KCZjcC0+cmVzX2NvdW50KSArIDUxMSkgPj4gOSk7Ci0JZWxzZQotCQlzID0gMDsKLQlmZF9yZXEtPnNlY3RvciArPSBzOwotCWZkX3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzIC09IHM7CiAJcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogdGltZW91dCAlc2luZyBzZWN0b3IgJWxkXG4iLAotCSAgICAgICAocnFfZGF0YV9kaXIoZmRfcmVxKT09V1JJVEU/ICJ3cml0IjogInJlYWQiKSwgKGxvbmcpZmRfcmVxLT5zZWN0b3IpOwotCWVuZF9yZXF1ZXN0KGZkX3JlcSwgMCk7CisJICAgICAgIChycV9kYXRhX2RpcihmZF9yZXEpPT1XUklURT8gIndyaXQiOiAicmVhZCIpLAorCSAgICAgICAobG9uZylibGtfcnFfcG9zKGZkX3JlcSkpOworCXN3aW0zX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKIAlmcy0+c3RhdGUgPSBpZGxlOwogCXN0YXJ0X3JlcXVlc3QoZnMpOwogfQpAQCAtNjQ2LDcgKzY1NCw3IEBACiAJCQkJcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogc2VlbiBzZWN0b3IgYnV0IGN5bD1mZj9cbiIpOwogCQkJCWZzLT5jdXJfY3lsID0gLTE7CiAJCQkJaWYgKGZzLT5yZXRyaWVzID4gNSkgewotCQkJCQllbmRfcmVxdWVzdChmZF9yZXEsIDApOworCQkJCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CiAJCQkJCWZzLT5zdGF0ZSA9IGlkbGU7CiAJCQkJCXN0YXJ0X3JlcXVlc3QoZnMpOwogCQkJCX0gZWxzZSB7CkBAIC03MTksOSArNzI3LDcgQEAKIAkJaWYgKGludHIgJiBFUlJPUl9JTlRSKSB7CiAJCQluID0gZnMtPnNjb3VudCAtIDEgLSByZXNpZCAvIDUxMjsKIAkJCWlmIChuID4gMCkgewotCQkJCWZkX3JlcS0+c2VjdG9yICs9IG47Ci0JCQkJZmRfcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgLT0gbjsKLQkJCQlmZF9yZXEtPmJ1ZmZlciArPSBuICogNTEyOworCQkJCWJsa191cGRhdGVfcmVxdWVzdChmZF9yZXEsIDAsIG4gPDwgOSk7CiAJCQkJZnMtPnJlcV9zZWN0b3IgKz0gbjsKIAkJCX0KIAkJCWlmIChmcy0+cmV0cmllcyA8IDUpIHsKQEAgLTczMCw4ICs3MzYsOCBAQAogCQkJfSBlbHNlIHsKIAkJCQlwcmludGsoInN3aW0zOiBlcnJvciAlc2luZyBibG9jayAlbGQgKGVycj0leClcbiIsCiAJCQkJICAgICAgIHJxX2RhdGFfZGlyKGZkX3JlcSkgPT0gV1JJVEU/ICJ3cml0IjogInJlYWQiLAotCQkJCSAgICAgICAobG9uZylmZF9yZXEtPnNlY3RvciwgZXJyKTsKLQkJCQllbmRfcmVxdWVzdChmZF9yZXEsIDApOworCQkJCSAgICAgICAobG9uZylibGtfcnFfcG9zKGZkX3JlcSksIGVycik7CisJCQkJc3dpbTNfZW5kX3JlcXVlc3RfY3VyKC1FSU8pOwogCQkJCWZzLT5zdGF0ZSA9IGlkbGU7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC03NDAsMTggKzc0NiwxMiBAQAogCQkJCXByaW50ayhLRVJOX0VSUiAic3dpbTM6IGZkIGRtYTogc3RhdD0leCByZXNpZD0lZFxuIiwgc3RhdCwgcmVzaWQpOwogCQkJCXByaW50ayhLRVJOX0VSUiAiICBzdGF0ZT0lZCwgZGlyPSV4LCBpbnRyPSV4LCBlcnI9JXhcbiIsCiAJCQkJICAgICAgIGZzLT5zdGF0ZSwgcnFfZGF0YV9kaXIoZmRfcmVxKSwgaW50ciwgZXJyKTsKLQkJCQllbmRfcmVxdWVzdChmZF9yZXEsIDApOworCQkJCXN3aW0zX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKIAkJCQlmcy0+c3RhdGUgPSBpZGxlOwogCQkJCXN0YXJ0X3JlcXVlc3QoZnMpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJZmRfcmVxLT5zZWN0b3IgKz0gZnMtPnNjb3VudDsKLQkJCWZkX3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzIC09IGZzLT5zY291bnQ7Ci0JCQlmZF9yZXEtPmJ1ZmZlciArPSBmcy0+c2NvdW50ICogNTEyOwotCQkJaWYgKGZkX3JlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw9IDApIHsKLQkJCQllbmRfcmVxdWVzdChmZF9yZXEsIDEpOwotCQkJCWZzLT5zdGF0ZSA9IGlkbGU7Ci0JCQl9IGVsc2UgeworCQkJaWYgKHN3aW0zX2VuZF9yZXF1ZXN0KDAsIGZzLT5zY291bnQgPDwgOSkpIHsKIAkJCQlmcy0+cmVxX3NlY3RvciArPSBmcy0+c2NvdW50OwogCQkJCWlmIChmcy0+cmVxX3NlY3RvciA+IGZzLT5zZWNwZXJ0cmFjaykgewogCQkJCQlmcy0+cmVxX3NlY3RvciAtPSBmcy0+c2VjcGVydHJhY2s7CkBAIC03NjEsNyArNzYxLDggQEAKIAkJCQkJfQogCQkJCX0KIAkJCQlhY3QoZnMpOwotCQkJfQorCQkJfSBlbHNlCisJCQkJZnMtPnN0YXRlID0gaWRsZTsKIAkJfQogCQlpZiAoZnMtPnN0YXRlID09IGlkbGUpCiAJCQlzdGFydF9yZXF1ZXN0KGZzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svc3g4LmMgYi9kcml2ZXJzL2Jsb2NrL3N4OC5jCmluZGV4IGZmMDQ0OGUuLmRhNDAzYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svc3g4LmMKKysrIGIvZHJpdmVycy9ibG9jay9zeDguYwpAQCAtNzQ5LDggKzc0OSw3IEBACiAJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGNycS0+cnE7CiAJaW50IHJjOwogCi0JcmMgPSBfX2Jsa19lbmRfcmVxdWVzdChyZXEsIGVycm9yLCBibGtfcnFfYnl0ZXMocmVxKSk7Ci0JYXNzZXJ0KHJjID09IDApOworCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIGVycm9yKTsKIAogCXJjID0gY2FybV9wdXRfcmVxdWVzdChob3N0LCBjcnEpOwogCWFzc2VydChyYyA9PSAwKTsKQEAgLTgxMSwxMiArODEwLDEwIEBACiAKIAl3aGlsZSAoMSkgewogCQlEUFJJTlRLKCJnZXQgcmVxXG4iKTsKLQkJcnEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCQlycSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOwogCQlpZiAoIXJxKQogCQkJYnJlYWs7CiAKLQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChycSk7Ci0KIAkJY3JxID0gcnEtPnNwZWNpYWw7CiAJCWFzc2VydChjcnEgIT0gTlVMTCk7CiAJCWFzc2VydChjcnEtPnJxID09IHJxKTsKQEAgLTg0Nyw3ICs4NDQsNyBAQAogCiBxdWV1ZV9vbmVfcmVxdWVzdDoKIAlWUFJJTlRLKCJnZXQgcmVxXG4iKTsKLQlycSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CisJcnEgPSBibGtfcGVla19yZXF1ZXN0KHEpOwogCWlmICghcnEpCiAJCXJldHVybjsKIApAQCAtODU4LDcgKzg1NSw3IEBACiAJfQogCWNycS0+cnEgPSBycTsKIAotCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOworCWJsa19zdGFydF9yZXF1ZXN0KHJxKTsKIAogCWlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpIHsKIAkJd3JpdGluZyA9IDE7CkBAIC05MDQsMTAgKzkwMSwxMCBAQAogCW1zZy0+c2dfY291bnQJPSBuX2VsZW07CiAJbXNnLT5zZ190eXBlCT0gU0dUXzMyQklUOwogCW1zZy0+aGFuZGxlCT0gY3B1X3RvX2xlMzIoVEFHX0VOQ09ERShjcnEtPnRhZykpOwotCW1zZy0+bGJhCT0gY3B1X3RvX2xlMzIocnEtPnNlY3RvciAmIDB4ZmZmZmZmZmYpOwotCXRtcAkJPSAocnEtPnNlY3RvciA+PiAxNikgPj4gMTY7CisJbXNnLT5sYmEJPSBjcHVfdG9fbGUzMihibGtfcnFfcG9zKHJxKSAmIDB4ZmZmZmZmZmYpOworCXRtcAkJPSAoYmxrX3JxX3BvcyhycSkgPj4gMTYpID4+IDE2OwogCW1zZy0+bGJhX2hpZ2gJPSBjcHVfdG9fbGUxNiggKHUxNikgdG1wICk7Ci0JbXNnLT5sYmFfY291bnQJPSBjcHVfdG9fbGUxNihycS0+bnJfc2VjdG9ycyk7CisJbXNnLT5sYmFfY291bnQJPSBjcHVfdG9fbGUxNihibGtfcnFfc2VjdG9ycyhycSkpOwogCiAJbXNnX3NpemUgPSBzaXplb2Yoc3RydWN0IGNhcm1fbXNnX3J3KSAtIHNpemVvZihtc2ctPnNnKTsKIAlmb3IgKGkgPSAwOyBpIDwgbl9lbGVtOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svdWIuYyBiL2RyaXZlcnMvYmxvY2svdWIuYwppbmRleCA2ODljZDI3Li5jYzU0NDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3ViLmMKKysrIGIvZHJpdmVycy9ibG9jay91Yi5jCkBAIC0zNjAsOCArMzYwLDcgQEAKIHN0YXRpYyB2b2lkIHViX2NtZF9idWlsZF9wYWNrZXQoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9sdW4gKmx1biwKICAgICBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCwgc3RydWN0IHViX3JlcXVlc3QgKnVycSk7CiBzdGF0aWMgdm9pZCB1Yl9yd19jbWRfZG9uZShzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwotc3RhdGljIHZvaWQgdWJfZW5kX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgdW5zaWduZWQgaW50IHN0YXR1cywKLSAgICB1bnNpZ25lZCBpbnQgY21kX2xlbik7CitzdGF0aWMgdm9pZCB1Yl9lbmRfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCB1bnNpZ25lZCBpbnQgc3RhdHVzKTsKIHN0YXRpYyBpbnQgdWJfcndfY21kX3JldHJ5KHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfbHVuICpsdW4sCiAgICAgc3RydWN0IHViX3JlcXVlc3QgKnVycSwgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwogc3RhdGljIGludCB1Yl9zdWJtaXRfc2NzaShzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwpAQCAtNjI3LDcgKzYyNiw3IEBACiAJc3RydWN0IHViX2x1biAqbHVuID0gcS0+cXVldWVkYXRhOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKIAotCXdoaWxlICgocnEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKSB7CisJd2hpbGUgKChycSA9IGJsa19wZWVrX3JlcXVlc3QocSkpICE9IE5VTEwpIHsKIAkJaWYgKHViX3JlcXVlc3RfZm5fMShsdW4sIHJxKSAhPSAwKSB7CiAJCQlibGtfc3RvcF9xdWV1ZShxKTsKIAkJCWJyZWFrOwpAQCAtNjQzLDE0ICs2NDIsMTQgQEAKIAlpbnQgbl9lbGVtOwogCiAJaWYgKGF0b21pY19yZWFkKCZzYy0+cG9pc29uKSkgewotCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKLQkJdWJfZW5kX3JxKHJxLCBESURfTk9fQ09OTkVDVCA8PCAxNiwgYmxrX3JxX2J5dGVzKHJxKSk7CisJCWJsa19zdGFydF9yZXF1ZXN0KHJxKTsKKwkJdWJfZW5kX3JxKHJxLCBESURfTk9fQ09OTkVDVCA8PCAxNik7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChsdW4tPmNoYW5nZWQgJiYgIWJsa19wY19yZXF1ZXN0KHJxKSkgewotCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKLQkJdWJfZW5kX3JxKHJxLCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04sIGJsa19ycV9ieXRlcyhycSkpOworCQlibGtfc3RhcnRfcmVxdWVzdChycSk7CisJCXViX2VuZF9ycShycSwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02NjAsNyArNjU5LDcgQEAKIAkJcmV0dXJuIC0xOwogCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3QgdWJfc2NzaV9jbWQpKTsKIAotCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOworCWJsa19zdGFydF9yZXF1ZXN0KHJxKTsKIAogCXVycSA9ICZsdW4tPnVycTsKIAltZW1zZXQodXJxLCAwLCBzaXplb2Yoc3RydWN0IHViX3JlcXVlc3QpKTsKQEAgLTcwMiw3ICs3MDEsNyBAQAogCiBkcm9wOgogCXViX3B1dF9jbWQobHVuLCBjbWQpOwotCXViX2VuZF9ycShycSwgRElEX0VSUk9SIDw8IDE2LCBibGtfcnFfYnl0ZXMocnEpKTsKKwl1Yl9lbmRfcnEocnEsIERJRF9FUlJPUiA8PCAxNik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcyMywxMSArNzIyLDExIEBACiAJLyoKIAkgKiBidWlsZCB0aGUgY29tbWFuZAogCSAqCi0JICogVGhlIGNhbGwgdG8gYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoKSBndWFyYW50ZWVzIHRoYXQgcmVxdWVzdAorCSAqIFRoZSBjYWxsIHRvIGJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoKSBndWFyYW50ZWVzIHRoYXQgcmVxdWVzdAogCSAqIGlzIGFsaWduZWQsIGJ1dCBpdCBpcyBnaXZlbiBpbiB0ZXJtcyBvZiA1MTIgYnl0ZSB1bml0cywgYWx3YXlzLgogCSAqLwotCWJsb2NrID0gcnEtPnNlY3RvciA+PiBsdW4tPmNhcGFjaXR5LmJzaGlmdDsKLQluYmxrcyA9IHJxLT5ucl9zZWN0b3JzID4+IGx1bi0+Y2FwYWNpdHkuYnNoaWZ0OworCWJsb2NrID0gYmxrX3JxX3BvcyhycSkgPj4gbHVuLT5jYXBhY2l0eS5ic2hpZnQ7CisJbmJsa3MgPSBibGtfcnFfc2VjdG9ycyhycSkgPj4gbHVuLT5jYXBhY2l0eS5ic2hpZnQ7CiAKIAljbWQtPmNkYlswXSA9IChjbWQtPmRpciA9PSBVQl9ESVJfUkVBRCk/IFJFQURfMTA6IFdSSVRFXzEwOwogCS8qIDEwLWJ5dGUgdXNlcyA0IGJ5dGVzIG9mIExCQTogMjE0NzQ4MzY0OEtCLCAyMDk3MTUyTUIsIDIwNDhHQiAqLwpAQCAtNzM5LDcgKzczOCw3IEBACiAJY21kLT5jZGJbOF0gPSBuYmxrczsKIAljbWQtPmNkYl9sZW4gPSAxMDsKIAotCWNtZC0+bGVuID0gcnEtPm5yX3NlY3RvcnMgKiA1MTI7CisJY21kLT5sZW4gPSBibGtfcnFfYnl0ZXMocnEpOwogfQogCiBzdGF0aWMgdm9pZCB1Yl9jbWRfYnVpbGRfcGFja2V0KHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfbHVuICpsdW4sCkBAIC03NDcsNyArNzQ2LDcgQEAKIHsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSB1cnEtPnJxOwogCi0JaWYgKHJxLT5kYXRhX2xlbiA9PSAwKSB7CisJaWYgKGJsa19ycV9ieXRlcyhycSkgPT0gMCkgewogCQljbWQtPmRpciA9IFVCX0RJUl9OT05FOwogCX0gZWxzZSB7CiAJCWlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCkBAIC03NjIsNyArNzYxLDcgQEAKIAltZW1jcHkoJmNtZC0+Y2RiLCBycS0+Y21kLCBycS0+Y21kX2xlbik7CiAJY21kLT5jZGJfbGVuID0gcnEtPmNtZF9sZW47CiAKLQljbWQtPmxlbiA9IHJxLT5kYXRhX2xlbjsKKwljbWQtPmxlbiA9IGJsa19ycV9ieXRlcyhycSk7CiAKIAkvKgogCSAqIFRvIHJlYXBwbHkgdGhpcyB0byBldmVyeSBVUkIgaXMgbm90IGFzIGluY29ycmVjdCBhcyBpdCBsb29rcy4KQEAgLTc3NywxNiArNzc2LDE1IEBACiAJc3RydWN0IHViX3JlcXVlc3QgKnVycSA9IGNtZC0+YmFjazsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJdW5zaWduZWQgaW50IHNjc2lfc3RhdHVzOwotCXVuc2lnbmVkIGludCBjbWRfbGVuOwogCiAJcnEgPSB1cnEtPnJxOwogCiAJaWYgKGNtZC0+ZXJyb3IgPT0gMCkgewogCQlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKSB7Ci0JCQlpZiAoY21kLT5hY3RfbGVuID49IHJxLT5kYXRhX2xlbikKLQkJCQlycS0+ZGF0YV9sZW4gPSAwOworCQkJaWYgKGNtZC0+YWN0X2xlbiA+PSBycS0+cmVzaWRfbGVuKQorCQkJCXJxLT5yZXNpZF9sZW4gPSAwOwogCQkJZWxzZQotCQkJCXJxLT5kYXRhX2xlbiAtPSBjbWQtPmFjdF9sZW47CisJCQkJcnEtPnJlc2lkX2xlbiAtPSBjbWQtPmFjdF9sZW47CiAJCQlzY3NpX3N0YXR1cyA9IDA7CiAJCX0gZWxzZSB7CiAJCQlpZiAoY21kLT5hY3RfbGVuICE9IGNtZC0+bGVuKSB7CkBAIC04MTgsMTcgKzgxNiwxNCBAQAogCiAJdXJxLT5ycSA9IE5VTEw7CiAKLQljbWRfbGVuID0gY21kLT5sZW47CiAJdWJfcHV0X2NtZChsdW4sIGNtZCk7Ci0JdWJfZW5kX3JxKHJxLCBzY3NpX3N0YXR1cywgY21kX2xlbik7CisJdWJfZW5kX3JxKHJxLCBzY3NpX3N0YXR1cyk7CiAJYmxrX3N0YXJ0X3F1ZXVlKGx1bi0+ZGlzay0+cXVldWUpOwogfQogCi1zdGF0aWMgdm9pZCB1Yl9lbmRfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCB1bnNpZ25lZCBpbnQgc2NzaV9zdGF0dXMsCi0gICAgdW5zaWduZWQgaW50IGNtZF9sZW4pCitzdGF0aWMgdm9pZCB1Yl9lbmRfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCB1bnNpZ25lZCBpbnQgc2NzaV9zdGF0dXMpCiB7CiAJaW50IGVycm9yOwotCWxvbmcgcnFsZW47CiAKIAlpZiAoc2NzaV9zdGF0dXMgPT0gMCkgewogCQllcnJvciA9IDA7CkBAIC04MzYsMTIgKzgzMSw3IEBACiAJCWVycm9yID0gLUVJTzsKIAkJcnEtPmVycm9ycyA9IHNjc2lfc3RhdHVzOwogCX0KLQlycWxlbiA9IGJsa19ycV9ieXRlcyhycSk7ICAgIC8qIE9kZGx5IGVub3VnaCwgdGhpcyBpcyB0aGUgcmVzaWR1ZS4gKi8KLQlpZiAoX19ibGtfZW5kX3JlcXVlc3QocnEsIGVycm9yLCBjbWRfbGVuKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCi0JCSAgICAiOiBfX2Jsa19lbmRfcmVxdWVzdCBibGV3LCAlcy1jbWQgdG90YWwgJXUgcnFsZW4gJWxkXG4iLAotCQkgICAgYmxrX3BjX3JlcXVlc3QocnEpPyAicGMiOiAiZnMiLCBjbWRfbGVuLCBycWxlbik7Ci0JfQorCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChycSwgZXJyb3IpOwogfQogCiBzdGF0aWMgaW50IHViX3J3X2NtZF9yZXRyeShzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX2x1biAqbHVuLApAQCAtMTc1OSw3ICsxNzQ5LDcgQEAKIAl1Yl9yZXZhbGlkYXRlKGx1bi0+dWRldiwgbHVuKTsKIAogCS8qIFhYWCBTdXBwb3J0IHNlY3RvciBzaXplIHN3aXRjaGluZyBsaWtlIGluIHNyLmMgKi8KLQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShkaXNrLT5xdWV1ZSwgbHVuLT5jYXBhY2l0eS5ic2l6ZSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShkaXNrLT5xdWV1ZSwgbHVuLT5jYXBhY2l0eS5ic2l6ZSk7CiAJc2V0X2NhcGFjaXR5KGRpc2ssIGx1bi0+Y2FwYWNpdHkubnNlYyk7CiAJLy8gc2V0X2Rpc2tfcm8oc2RrcC0+ZGlzaywgbHVuLT5yZWFkb25seSk7CiAKQEAgLTIzMzQsNyArMjMyNCw3IEBACiAJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIFVCX01BWF9SRVFfU0cpOwogCWJsa19xdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KHEsIDB4ZmZmZmZmZmYpOwkvKiBEdWJpb3VzLiAqLwogCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCBVQl9NQVhfU0VDVE9SUyk7Ci0JYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUocSwgbHVuLT5jYXBhY2l0eS5ic2l6ZSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShxLCBsdW4tPmNhcGFjaXR5LmJzaXplKTsKIAogCWx1bi0+ZGlzayA9IGRpc2s7CiAJcS0+cXVldWVkYXRhID0gbHVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMgYi9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYwppbmRleCBlY2NjZjY1Li4zOTBkNjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYworKysgYi9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYwpAQCAtMjUyLDcgKzI1Miw3IEBACiAJc3RydWN0IHZpb2Rhc2RfZGV2aWNlICpkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzdGFydCA9ICh1NjQpcmVxLT5zZWN0b3IgPDwgOTsKKwlzdGFydCA9ICh1NjQpYmxrX3JxX3BvcyhyZXEpIDw8IDk7CiAKIAlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBSRUFEKSB7CiAJCWRpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKQEAgLTM2MSwxOSArMzYxLDE3IEBACiAJICogYmFjayBsYXRlci4KIAkgKi8KIAl3aGlsZSAobnVtX3JlcV9vdXRzdGFuZGluZyA8IFZJT01BWFJFUSkgewotCQlyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCQlyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKTsKIAkJaWYgKHJlcSA9PSBOVUxMKQogCQkJcmV0dXJuOwotCQkvKiBkZXF1ZXVlIHRoZSBjdXJyZW50IHJlcXVlc3QgZnJvbSB0aGUgcXVldWUgKi8KLQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOwogCQkvKiBjaGVjayB0aGF0IHJlcXVlc3QgY29udGFpbnMgYSB2YWxpZCBjb21tYW5kICovCiAJCWlmICghYmxrX2ZzX3JlcXVlc3QocmVxKSkgewotCQkJdmlvZGFzZF9lbmRfcmVxdWVzdChyZXEsIC1FSU8sIHJlcS0+aGFyZF9ucl9zZWN0b3JzKTsKKwkJCXZpb2Rhc2RfZW5kX3JlcXVlc3QocmVxLCAtRUlPLCBibGtfcnFfc2VjdG9ycyhyZXEpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCS8qIFRyeSBzZW5kaW5nIHRoZSByZXF1ZXN0ICovCiAJCWlmIChzZW5kX3JlcXVlc3QocmVxKSAhPSAwKQotCQkJdmlvZGFzZF9lbmRfcmVxdWVzdChyZXEsIC1FSU8sIHJlcS0+aGFyZF9ucl9zZWN0b3JzKTsKKwkJCXZpb2Rhc2RfZW5kX3JlcXVlc3QocmVxLCAtRUlPLCBibGtfcnFfc2VjdG9ycyhyZXEpKTsKIAl9CiB9CiAKQEAgLTU5MCw3ICs1ODgsNyBAQAogCQllcnIgPSB2aW9fbG9va3VwX3JjKHZpb2Rhc2RfZXJyX3RhYmxlLCBiZXZlbnQtPnN1Yl9yZXN1bHQpOwogCQlwcmludGsoVklPRF9LRVJOX1dBUk5JTkcgInJlYWQvd3JpdGUgZXJyb3IgJWQ6MHglMDR4ICglcylcbiIsCiAJCQkJZXZlbnQtPnhSYywgYmV2ZW50LT5zdWJfcmVzdWx0LCBlcnItPm1zZyk7Ci0JCW51bV9zZWN0ID0gcmVxLT5oYXJkX25yX3NlY3RvcnM7CisJCW51bV9zZWN0ID0gYmxrX3JxX3NlY3RvcnMocmVxKTsKIAl9CiAJcWxvY2sgPSByZXEtPnEtPnF1ZXVlX2xvY2s7CiAJc3Bpbl9sb2NrX2lycXNhdmUocWxvY2ssIGlycV9mbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCmluZGV4IDVkMzQ3NjQuLmMwZmFjYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCisrKyBiL2RyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jCkBAIC0zNyw2ICszNyw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAJc3RydWN0IHZpcnRpb19ibGtfb3V0aGRyIG91dF9oZHI7CisJc3RydWN0IHZpcnRpb19zY3NpX2luaGRyIGluX2hkcjsKIAl1OCBzdGF0dXM7CiB9OwogCkBAIC01MCw2ICs1MSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZibGstPmxvY2ssIGZsYWdzKTsKIAl3aGlsZSAoKHZiciA9IHZibGstPnZxLT52cV9vcHMtPmdldF9idWYodmJsay0+dnEsICZsZW4pKSAhPSBOVUxMKSB7CiAJCWludCBlcnJvcjsKKwogCQlzd2l0Y2ggKHZici0+c3RhdHVzKSB7CiAJCWNhc2UgVklSVElPX0JMS19TX09LOgogCQkJZXJyb3IgPSAwOwpAQCAtNjIsNyArNjQsMTMgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJX19ibGtfZW5kX3JlcXVlc3QodmJyLT5yZXEsIGVycm9yLCBibGtfcnFfYnl0ZXModmJyLT5yZXEpKTsKKwkJaWYgKGJsa19wY19yZXF1ZXN0KHZici0+cmVxKSkgeworCQkJdmJyLT5yZXEtPnJlc2lkX2xlbiA9IHZici0+aW5faGRyLnJlc2lkdWFsOworCQkJdmJyLT5yZXEtPnNlbnNlX2xlbiA9IHZici0+aW5faGRyLnNlbnNlX2xlbjsKKwkJCXZici0+cmVxLT5lcnJvcnMgPSB2YnItPmluX2hkci5lcnJvcnM7CisJCX0KKworCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwodmJyLT5yZXEsIGVycm9yKTsKIAkJbGlzdF9kZWwoJnZici0+bGlzdCk7CiAJCW1lbXBvb2xfZnJlZSh2YnIsIHZibGstPnBvb2wpOwogCX0KQEAgLTc0LDcgKzgyLDcgQEAKIHN0YXRpYyBib29sIGRvX3JlcShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHZpcnRpb19ibGsgKnZibGssCiAJCSAgIHN0cnVjdCByZXF1ZXN0ICpyZXEpCiB7Ci0JdW5zaWduZWQgbG9uZyBudW0sIG91dCwgaW47CisJdW5zaWduZWQgbG9uZyBudW0sIG91dCA9IDAsIGluID0gMDsKIAlzdHJ1Y3QgdmlydGJsa19yZXEgKnZicjsKIAogCXZiciA9IG1lbXBvb2xfYWxsb2ModmJsay0+cG9vbCwgR0ZQX0FUT01JQyk7CkBAIC04NSw3ICs5Myw3IEBACiAJdmJyLT5yZXEgPSByZXE7CiAJaWYgKGJsa19mc19yZXF1ZXN0KHZici0+cmVxKSkgewogCQl2YnItPm91dF9oZHIudHlwZSA9IDA7Ci0JCXZici0+b3V0X2hkci5zZWN0b3IgPSB2YnItPnJlcS0+c2VjdG9yOworCQl2YnItPm91dF9oZHIuc2VjdG9yID0gYmxrX3JxX3Bvcyh2YnItPnJlcSk7CiAJCXZici0+b3V0X2hkci5pb3ByaW8gPSByZXFfZ2V0X2lvcHJpbyh2YnItPnJlcSk7CiAJfSBlbHNlIGlmIChibGtfcGNfcmVxdWVzdCh2YnItPnJlcSkpIHsKIAkJdmJyLT5vdXRfaGRyLnR5cGUgPSBWSVJUSU9fQkxLX1RfU0NTSV9DTUQ7CkBAIC05OSwxOCArMTA3LDM2IEBACiAJaWYgKGJsa19iYXJyaWVyX3JxKHZici0+cmVxKSkKIAkJdmJyLT5vdXRfaGRyLnR5cGUgfD0gVklSVElPX0JMS19UX0JBUlJJRVI7CiAKLQlzZ19zZXRfYnVmKCZ2YmxrLT5zZ1swXSwgJnZici0+b3V0X2hkciwgc2l6ZW9mKHZici0+b3V0X2hkcikpOwotCW51bSA9IGJsa19ycV9tYXBfc2cocSwgdmJyLT5yZXEsIHZibGstPnNnKzEpOwotCXNnX3NldF9idWYoJnZibGstPnNnW251bSsxXSwgJnZici0+c3RhdHVzLCBzaXplb2YodmJyLT5zdGF0dXMpKTsKKwlzZ19zZXRfYnVmKCZ2YmxrLT5zZ1tvdXQrK10sICZ2YnItPm91dF9oZHIsIHNpemVvZih2YnItPm91dF9oZHIpKTsKIAotCWlmIChycV9kYXRhX2Rpcih2YnItPnJlcSkgPT0gV1JJVEUpIHsKLQkJdmJyLT5vdXRfaGRyLnR5cGUgfD0gVklSVElPX0JMS19UX09VVDsKLQkJb3V0ID0gMSArIG51bTsKLQkJaW4gPSAxOwotCX0gZWxzZSB7Ci0JCXZici0+b3V0X2hkci50eXBlIHw9IFZJUlRJT19CTEtfVF9JTjsKLQkJb3V0ID0gMTsKLQkJaW4gPSAxICsgbnVtOworCS8qCisJICogSWYgdGhpcyBpcyBhIHBhY2tldCBjb21tYW5kIHdlIG5lZWQgYSBjb3VwbGUgb2YgYWRkaXRpb25hbCBoZWFkZXJzLgorCSAqIEJlaGluZCB0aGUgbm9ybWFsIG91dGhkciB3ZSBwdXQgYSBzZWdtZW50IHdpdGggdGhlIHNjc2kgY29tbWFuZAorCSAqIGJsb2NrLCBhbmQgYmVmb3JlIHRoZSBub3JtYWwgaW5oZHIgd2UgcHV0IHRoZSBzZW5zZSBkYXRhIGFuZCB0aGUKKwkgKiBpbmhkciB3aXRoIGFkZGl0aW9uYWwgc3RhdHVzIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgbm9ybWFsIGluaGRyLgorCSAqLworCWlmIChibGtfcGNfcmVxdWVzdCh2YnItPnJlcSkpCisJCXNnX3NldF9idWYoJnZibGstPnNnW291dCsrXSwgdmJyLT5yZXEtPmNtZCwgdmJyLT5yZXEtPmNtZF9sZW4pOworCisJbnVtID0gYmxrX3JxX21hcF9zZyhxLCB2YnItPnJlcSwgdmJsay0+c2cgKyBvdXQpOworCisJaWYgKGJsa19wY19yZXF1ZXN0KHZici0+cmVxKSkgeworCQlzZ19zZXRfYnVmKCZ2YmxrLT5zZ1tudW0gKyBvdXQgKyBpbisrXSwgdmJyLT5yZXEtPnNlbnNlLCA5Nik7CisJCXNnX3NldF9idWYoJnZibGstPnNnW251bSArIG91dCArIGluKytdLCAmdmJyLT5pbl9oZHIsCisJCQkgICBzaXplb2YodmJyLT5pbl9oZHIpKTsKKwl9CisKKwlzZ19zZXRfYnVmKCZ2YmxrLT5zZ1tudW0gKyBvdXQgKyBpbisrXSwgJnZici0+c3RhdHVzLAorCQkgICBzaXplb2YodmJyLT5zdGF0dXMpKTsKKworCWlmIChudW0pIHsKKwkJaWYgKHJxX2RhdGFfZGlyKHZici0+cmVxKSA9PSBXUklURSkgeworCQkJdmJyLT5vdXRfaGRyLnR5cGUgfD0gVklSVElPX0JMS19UX09VVDsKKwkJCW91dCArPSBudW07CisJCX0gZWxzZSB7CisJCQl2YnItPm91dF9oZHIudHlwZSB8PSBWSVJUSU9fQkxLX1RfSU47CisJCQlpbiArPSBudW07CisJCX0KIAl9CiAKIAlpZiAodmJsay0+dnEtPnZxX29wcy0+YWRkX2J1Zih2YmxrLT52cSwgdmJsay0+c2csIG91dCwgaW4sIHZicikpIHsKQEAgLTEyNCwxMiArMTUwLDExIEBACiAKIHN0YXRpYyB2b2lkIGRvX3ZpcnRibGtfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKLQlzdHJ1Y3QgdmlydGlvX2JsayAqdmJsayA9IE5VTEw7CisJc3RydWN0IHZpcnRpb19ibGsgKnZibGsgPSBxLT5xdWV1ZWRhdGE7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAl1bnNpZ25lZCBpbnQgaXNzdWVkID0gMDsKIAotCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgewotCQl2YmxrID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CisJd2hpbGUgKChyZXEgPSBibGtfcGVla19yZXF1ZXN0KHEpKSAhPSBOVUxMKSB7CiAJCUJVR19PTihyZXEtPm5yX3BoeXNfc2VnbWVudHMgKyAyID4gdmJsay0+c2dfZWxlbXMpOwogCiAJCS8qIElmIHRoaXMgcmVxdWVzdCBmYWlscywgc3RvcCBxdWV1ZSBhbmQgd2FpdCBmb3Igc29tZXRoaW5nIHRvCkBAIC0xMzgsNyArMTYzLDcgQEAKIAkJCWJsa19zdG9wX3F1ZXVlKHEpOwogCQkJYnJlYWs7CiAJCX0KLQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCQlibGtfc3RhcnRfcmVxdWVzdChyZXEpOwogCQlpc3N1ZWQrKzsKIAl9CiAKQEAgLTE0NiwxMiArMTcxLDUxIEBACiAJCXZibGstPnZxLT52cV9vcHMtPmtpY2sodmJsay0+dnEpOwogfQogCisvKiByZXR1cm4gQVRBIGlkZW50aWZ5IGRhdGEKKyAqLworc3RhdGljIGludCB2aXJ0YmxrX2lkZW50aWZ5KHN0cnVjdCBnZW5kaXNrICpkaXNrLCB2b2lkICphcmdwKQoreworCXN0cnVjdCB2aXJ0aW9fYmxrICp2YmxrID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKm9wYXF1ZTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCW9wYXF1ZSA9IGttYWxsb2MoVklSVElPX0JMS19JRF9CWVRFUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcGFxdWUpCisJCWdvdG8gb3V0OworCisJZXJyID0gdmlydGlvX2NvbmZpZ19idWYodmJsay0+dmRldiwgVklSVElPX0JMS19GX0lERU5USUZZLAorCQlvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX2Jsa19jb25maWcsIGlkZW50aWZ5KSwgb3BhcXVlLAorCQlWSVJUSU9fQkxLX0lEX0JZVEVTKTsKKworCWlmIChlcnIpCisJCWdvdG8gb3V0X2tmcmVlOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBvcGFxdWUsIFZJUlRJT19CTEtfSURfQllURVMpKQorCQllcnIgPSAtRUZBVUxUOworCitvdXRfa2ZyZWU6CisJa2ZyZWUob3BhcXVlKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgaW50IHZpcnRibGtfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlLAogCQkJIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBkYXRhKQogewotCXJldHVybiBzY3NpX2NtZF9pb2N0bChiZGV2LT5iZF9kaXNrLT5xdWV1ZSwKLQkJCSAgICAgIGJkZXYtPmJkX2Rpc2ssIG1vZGUsIGNtZCwKLQkJCSAgICAgICh2b2lkIF9fdXNlciAqKWRhdGEpOworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgdmlydGlvX2JsayAqdmJsayA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWRhdGE7CisKKwlpZiAoY21kID09IEhESU9fR0VUX0lERU5USVRZKQorCQlyZXR1cm4gdmlydGJsa19pZGVudGlmeShkaXNrLCBhcmdwKTsKKworCS8qCisJICogT25seSBhbGxvdyB0aGUgZ2VuZXJpYyBTQ1NJIGlvY3RscyBpZiB0aGUgaG9zdCBjYW4gc3VwcG9ydCBpdC4KKwkgKi8KKwlpZiAoIXZpcnRpb19oYXNfZmVhdHVyZSh2YmxrLT52ZGV2LCBWSVJUSU9fQkxLX0ZfU0NTSSkpCisJCXJldHVybiAtRU5PSU9DVExDTUQ7CisKKwlyZXR1cm4gc2NzaV9jbWRfaW9jdGwoZGlzay0+cXVldWUsIGRpc2ssIG1vZGUsIGNtZCwgYXJncCk7CiB9CiAKIC8qIFdlIHByb3ZpZGUgZ2V0Z2VvIG9ubHkgdG8gcGxlYXNlIHNvbWUgb2xkIGJvb3Rsb2FkZXIvcGFydGl0aW9uaW5nIHRvb2xzICovCkBAIC0yNDksNiArMzEzLDcgQEAKIAkJZ290byBvdXRfcHV0X2Rpc2s7CiAJfQogCisJdmJsay0+ZGlzay0+cXVldWUtPnF1ZXVlZGF0YSA9IHZibGs7CiAJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19WSVJULCB2YmxrLT5kaXNrLT5xdWV1ZSk7CiAKIAlpZiAoaW5kZXggPCAyNikgewpAQCAtMzEzLDcgKzM3OCw3IEBACiAJCQkJb2Zmc2V0b2Yoc3RydWN0IHZpcnRpb19ibGtfY29uZmlnLCBibGtfc2l6ZSksCiAJCQkJJmJsa19zaXplKTsKIAlpZiAoIWVycikKLQkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUodmJsay0+ZGlzay0+cXVldWUsIGJsa19zaXplKTsKKwkJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZSh2YmxrLT5kaXNrLT5xdWV1ZSwgYmxrX3NpemUpOwogCiAJYWRkX2Rpc2sodmJsay0+ZGlzayk7CiAJcmV0dXJuIDA7CkBAIC0zNTYsNiArNDIxLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZmVhdHVyZXNbXSA9IHsKIAlWSVJUSU9fQkxLX0ZfQkFSUklFUiwgVklSVElPX0JMS19GX1NFR19NQVgsIFZJUlRJT19CTEtfRl9TSVpFX01BWCwKIAlWSVJUSU9fQkxLX0ZfR0VPTUVUUlksIFZJUlRJT19CTEtfRl9STywgVklSVElPX0JMS19GX0JMS19TSVpFLAorCVZJUlRJT19CTEtfRl9TQ1NJLCBWSVJUSU9fQkxLX0ZfSURFTlRJRlkKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdmlydGlvX2RyaXZlciB2aXJ0aW9fYmxrID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZC5jIGIvZHJpdmVycy9ibG9jay94ZC5jCmluZGV4IDY0YjQ5NmYuLmNlMjQyOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hkLmMKQEAgLTMwNSwzMCArMzA1LDI1IEBACiAJaWYgKHhkY19idXN5KQogCQlyZXR1cm47CiAKLQl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpIHsKLQkJdW5zaWduZWQgYmxvY2sgPSByZXEtPnNlY3RvcjsKLQkJdW5zaWduZWQgY291bnQgPSByZXEtPm5yX3NlY3RvcnM7Ci0JCWludCBydyA9IHJxX2RhdGFfZGlyKHJlcSk7CisJcmVxID0gYmxrX2ZldGNoX3JlcXVlc3QocSk7CisJd2hpbGUgKHJlcSkgeworCQl1bnNpZ25lZCBibG9jayA9IGJsa19ycV9wb3MocmVxKTsKKwkJdW5zaWduZWQgY291bnQgPSBibGtfcnFfY3VyX3NlY3RvcnMocmVxKTsKIAkJWERfSU5GTyAqZGlzayA9IHJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOwotCQlpbnQgcmVzID0gMDsKKwkJaW50IHJlcyA9IC1FSU87CiAJCWludCByZXRyeTsKIAotCQlpZiAoIWJsa19mc19yZXF1ZXN0KHJlcSkpIHsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoYmxvY2sgKyBjb3VudCA+IGdldF9jYXBhY2l0eShyZXEtPnJxX2Rpc2spKSB7Ci0JCQllbmRfcmVxdWVzdChyZXEsIDApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHJ3ICE9IFJFQUQgJiYgcncgIT0gV1JJVEUpIHsKLQkJCXByaW50aygiZG9feGRfcmVxdWVzdDogdW5rbm93biByZXF1ZXN0XG4iKTsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCQljb250aW51ZTsKLQkJfQorCQlpZiAoIWJsa19mc19yZXF1ZXN0KHJlcSkpCisJCQlnb3RvIGRvbmU7CisJCWlmIChibG9jayArIGNvdW50ID4gZ2V0X2NhcGFjaXR5KHJlcS0+cnFfZGlzaykpCisJCQlnb3RvIGRvbmU7CiAJCWZvciAocmV0cnkgPSAwOyAocmV0cnkgPCBYRF9SRVRSSUVTKSAmJiAhcmVzOyByZXRyeSsrKQotCQkJcmVzID0geGRfcmVhZHdyaXRlKHJ3LCBkaXNrLCByZXEtPmJ1ZmZlciwgYmxvY2ssIGNvdW50KTsKLQkJZW5kX3JlcXVlc3QocmVxLCByZXMpOwkvKiB3cmFwIHVwLCAwID0gZmFpbCwgMSA9IHN1Y2Nlc3MgKi8KKwkJCXJlcyA9IHhkX3JlYWR3cml0ZShycV9kYXRhX2RpcihyZXEpLCBkaXNrLCByZXEtPmJ1ZmZlciwKKwkJCQkJICAgYmxvY2ssIGNvdW50KTsKKwlkb25lOgorCQkvKiB3cmFwIHVwLCAwID0gc3VjY2VzcywgLWVycm5vID0gZmFpbCAqLworCQlpZiAoIV9fYmxrX2VuZF9yZXF1ZXN0X2N1cihyZXEsIHJlcykpCisJCQlyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKTsKIAl9CiB9CiAKQEAgLTQxOCw3ICs0MTMsNyBAQAogCQkJCXByaW50aygieGQlYzogJXMgdGltZW91dCwgcmVjYWxpYnJhdGluZyBkcml2ZVxuIiwnYScrZHJpdmUsKG9wZXJhdGlvbiA9PSBSRUFEID8gInJlYWQiIDogIndyaXRlIikpOwogCQkJCXhkX3JlY2FsaWJyYXRlKGRyaXZlKTsKIAkJCQlzcGluX2xvY2tfaXJxKCZ4ZF9sb2NrKTsKLQkJCQlyZXR1cm4gKDApOworCQkJCXJldHVybiAtRUlPOwogCQkJY2FzZSAyOgogCQkJCWlmIChzZW5zZVswXSAmIDB4MzApIHsKIAkJCQkJcHJpbnRrKCJ4ZCVjOiAlcyAtICIsJ2EnK2RyaXZlLChvcGVyYXRpb24gPT0gUkVBRCA/ICJyZWFkaW5nIiA6ICJ3cml0aW5nIikpOwpAQCAtNDM5LDcgKzQzNCw3IEBACiAJCQkJZWxzZQogCQkJCQlwcmludGsoIiAtIG5vIHZhbGlkIGRpc2sgYWRkcmVzc1xuIik7CiAJCQkJc3Bpbl9sb2NrX2lycSgmeGRfbG9jayk7Ci0JCQkJcmV0dXJuICgwKTsKKwkJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlpZiAoeGRfZG1hX2J1ZmZlcikKIAkJCWZvciAoaT0wOyBpIDwgKHRlbXAgKiAweDIwMCk7IGkrKykKQEAgLTQ0OCw3ICs0NDMsNyBAQAogCQljb3VudCAtPSB0ZW1wLCBidWZmZXIgKz0gdGVtcCAqIDB4MjAwLCBibG9jayArPSB0ZW1wOwogCX0KIAlzcGluX2xvY2tfaXJxKCZ4ZF9sb2NrKTsKLQlyZXR1cm4gKDEpOworCXJldHVybiAwOwogfQogCiAvKiB4ZF9yZWNhbGlicmF0ZTogcmVjYWxpYnJhdGUgYSBnaXZlbiBkcml2ZSBhbmQgcmVzZXQgY29udHJvbGxlciBpZiBuZWNlc3NhcnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMgYi9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtmcm9udC5jCmluZGV4IGE2Y2JmN2IuLmMxOTk2ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Zyb250LmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiBzdGF0aWMgaW50IGdldF9pZF9mcm9tX2ZyZWVsaXN0KHN0cnVjdCBibGtmcm9udF9pbmZvICppbmZvKQogewogCXVuc2lnbmVkIGxvbmcgZnJlZSA9IGluZm8tPnNoYWRvd19mcmVlOwotCUJVR19PTihmcmVlID4gQkxLX1JJTkdfU0laRSk7CisJQlVHX09OKGZyZWUgPj0gQkxLX1JJTkdfU0laRSk7CiAJaW5mby0+c2hhZG93X2ZyZWUgPSBpbmZvLT5zaGFkb3dbZnJlZV0ucmVxLmlkOwogCWluZm8tPnNoYWRvd1tmcmVlXS5yZXEuaWQgPSAweDBmZmZmZmVlOyAvKiBkZWJ1ZyAqLwogCXJldHVybiBmcmVlOwpAQCAtMjMxLDcgKzIzMSw3IEBACiAJaW5mby0+c2hhZG93W2lkXS5yZXF1ZXN0ID0gKHVuc2lnbmVkIGxvbmcpcmVxOwogCiAJcmluZ19yZXEtPmlkID0gaWQ7Ci0JcmluZ19yZXEtPnNlY3Rvcl9udW1iZXIgPSAoYmxraWZfc2VjdG9yX3QpcmVxLT5zZWN0b3I7CisJcmluZ19yZXEtPnNlY3Rvcl9udW1iZXIgPSAoYmxraWZfc2VjdG9yX3QpYmxrX3JxX3BvcyhyZXEpOwogCXJpbmdfcmVxLT5oYW5kbGUgPSBpbmZvLT5oYW5kbGU7CiAKIAlyaW5nX3JlcS0+b3BlcmF0aW9uID0gcnFfZGF0YV9kaXIocmVxKSA/CkBAIC0yOTksMjUgKzI5OSwyNSBAQAogCiAJcXVldWVkID0gMDsKIAotCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChycSkpICE9IE5VTEwpIHsKKwl3aGlsZSAoKHJlcSA9IGJsa19wZWVrX3JlcXVlc3QocnEpKSAhPSBOVUxMKSB7CiAJCWluZm8gPSByZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQkJaWYgKCFibGtfZnNfcmVxdWVzdChyZXEpKSB7Ci0JCQllbmRfcmVxdWVzdChyZXEsIDApOwotCQkJY29udGludWU7Ci0JCX0KIAogCQlpZiAoUklOR19GVUxMKCZpbmZvLT5yaW5nKSkKIAkJCWdvdG8gd2FpdDsKIAorCQlibGtfc3RhcnRfcmVxdWVzdChyZXEpOworCisJCWlmICghYmxrX2ZzX3JlcXVlc3QocmVxKSkgeworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCXByX2RlYnVnKCJkb19ibGtfcmVxICVwOiBjbWQgJXAsIHNlYyAlbHgsICIKLQkJCSAiKCV1LyVsaSkgYnVmZmVyOiVwIFslc11cbiIsCi0JCQkgcmVxLCByZXEtPmNtZCwgKHVuc2lnbmVkIGxvbmcpcmVxLT5zZWN0b3IsCi0JCQkgcmVxLT5jdXJyZW50X25yX3NlY3RvcnMsCi0JCQkgcmVxLT5ucl9zZWN0b3JzLCByZXEtPmJ1ZmZlciwKLQkJCSBycV9kYXRhX2RpcihyZXEpID8gIndyaXRlIiA6ICJyZWFkIik7CisJCQkgIigldS8ldSkgYnVmZmVyOiVwIFslc11cbiIsCisJCQkgcmVxLCByZXEtPmNtZCwgKHVuc2lnbmVkIGxvbmcpYmxrX3JxX3BvcyhyZXEpLAorCQkJIGJsa19ycV9jdXJfc2VjdG9ycyhyZXEpLCBibGtfcnFfc2VjdG9ycyhyZXEpLAorCQkJIHJlcS0+YnVmZmVyLCBycV9kYXRhX2RpcihyZXEpID8gIndyaXRlIiA6ICJyZWFkIik7CiAKLQotCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CiAJCWlmIChibGtpZl9xdWV1ZV9yZXF1ZXN0KHJlcSkpIHsKIAkJCWJsa19yZXF1ZXVlX3JlcXVlc3QocnEsIHJlcSk7CiB3YWl0OgpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19WSVJULCBycSk7CiAKIAkvKiBIYXJkIHNlY3RvciBzaXplIGFuZCBtYXggc2VjdG9ycyBpbXBlcnNvbmF0ZSB0aGUgZXF1aXYuIGhhcmR3YXJlLiAqLwotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHJxLCBzZWN0b3Jfc2l6ZSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShycSwgc2VjdG9yX3NpemUpOwogCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhycSwgNTEyKTsKIAogCS8qIEVhY2ggc2VnbWVudCBpbiBhIHJlcXVlc3QgaXMgdXAgdG8gYW4gYWxpZ25lZCBwYWdlIGluIHNpemUuICovCkBAIC01NTEsNyArNTUxLDYgQEAKIAogCWZvciAoaSA9IGluZm8tPnJpbmcucnNwX2NvbnM7IGkgIT0gcnA7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIGlkOwotCQlpbnQgcmV0OwogCiAJCWJyZXQgPSBSSU5HX0dFVF9SRVNQT05TRSgmaW5mby0+cmluZywgaSk7CiAJCWlkICAgPSBicmV0LT5pZDsKQEAgLTU3OCw4ICs1NzcsNyBAQAogCQkJCWRldl9kYmcoJmluZm8tPnhiZGV2LT5kZXYsICJCYWQgcmV0dXJuIGZyb20gYmxrZGV2IGRhdGEgIgogCQkJCQkicmVxdWVzdDogJXhcbiIsIGJyZXQtPnN0YXR1cyk7CiAKLQkJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyb3IsIGJsa19ycV9ieXRlcyhyZXEpKTsKLQkJCUJVR19PTihyZXQpOworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgZXJyb3IpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlCVUcoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveHN5c2FjZS5jIGIvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKaW5kZXggNGFlY2Y1ZC4uZjA4NDkxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKKysrIGIvZHJpdmVycy9ibG9jay94c3lzYWNlLmMKQEAgLTQ2MywxMCArNDYzLDExIEBACiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAotCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgeworCXdoaWxlICgocmVxID0gYmxrX3BlZWtfcmVxdWVzdChxKSkgIT0gTlVMTCkgewogCQlpZiAoYmxrX2ZzX3JlcXVlc3QocmVxKSkKIAkJCWJyZWFrOwotCQllbmRfcmVxdWVzdChyZXEsIDApOworCQlibGtfc3RhcnRfcmVxdWVzdChyZXEpOworCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAtRUlPKTsKIAl9CiAJcmV0dXJuIHJlcTsKIH0KQEAgLTQ5Miw5ICs0OTMsMTMgQEAKIAkJc2V0X2NhcGFjaXR5KGFjZS0+Z2QsIDApOwogCQlkZXZfaW5mbyhhY2UtPmRldiwgIk5vIENGIGluIHNsb3RcbiIpOwogCi0JCS8qIERyb3AgYWxsIHBlbmRpbmcgcmVxdWVzdHMgKi8KLQkJd2hpbGUgKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KGFjZS0+cXVldWUpKSAhPSBOVUxMKQotCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwkJLyogRHJvcCBhbGwgaW4tZmxpZ2h0IGFuZCBwZW5kaW5nIHJlcXVlc3RzICovCisJCWlmIChhY2UtPnJlcSkgeworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKGFjZS0+cmVxLCAtRUlPKTsKKwkJCWFjZS0+cmVxID0gTlVMTDsKKwkJfQorCQl3aGlsZSAoKHJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KGFjZS0+cXVldWUpKSAhPSBOVUxMKQorCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CiAKIAkJLyogRHJvcCBiYWNrIHRvIElETEUgc3RhdGUgYW5kIG5vdGlmeSB3YWl0ZXJzICovCiAJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JRExFOwpAQCAtNjQyLDE5ICs2NDcsMjEgQEAKIAkJCWFjZS0+ZnNtX3N0YXRlID0gQUNFX0ZTTV9TVEFURV9JRExFOwogCQkJYnJlYWs7CiAJCX0KKwkJYmxrX3N0YXJ0X3JlcXVlc3QocmVxKTsKIAogCQkvKiBPa2F5LCBpdCdzIGEgZGF0YSByZXF1ZXN0LCBzZXQgaXQgdXAgZm9yIHRyYW5zZmVyICovCiAJCWRldl9kYmcoYWNlLT5kZXYsCi0JCQkicmVxdWVzdDogc2VjPSVsbHggaGNudD0lbHgsIGNjbnQ9JXgsIGRpcj0laVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHJlcS0+c2VjdG9yLCByZXEtPmhhcmRfbnJfc2VjdG9ycywKLQkJCXJlcS0+Y3VycmVudF9ucl9zZWN0b3JzLCBycV9kYXRhX2RpcihyZXEpKTsKKwkJCSJyZXF1ZXN0OiBzZWM9JWxseCBoY250PSV4LCBjY250PSV4LCBkaXI9JWlcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWJsa19ycV9wb3MocmVxKSwKKwkJCWJsa19ycV9zZWN0b3JzKHJlcSksIGJsa19ycV9jdXJfc2VjdG9ycyhyZXEpLAorCQkJcnFfZGF0YV9kaXIocmVxKSk7CiAKIAkJYWNlLT5yZXEgPSByZXE7CiAJCWFjZS0+ZGF0YV9wdHIgPSByZXEtPmJ1ZmZlcjsKLQkJYWNlLT5kYXRhX2NvdW50ID0gcmVxLT5jdXJyZW50X25yX3NlY3RvcnMgKiBBQ0VfQlVGX1BFUl9TRUNUT1I7Ci0JCWFjZV9vdXQzMihhY2UsIEFDRV9NUFVMQkEsIHJlcS0+c2VjdG9yICYgMHgwRkZGRkZGRik7CisJCWFjZS0+ZGF0YV9jb3VudCA9IGJsa19ycV9jdXJfc2VjdG9ycyhyZXEpICogQUNFX0JVRl9QRVJfU0VDVE9SOworCQlhY2Vfb3V0MzIoYWNlLCBBQ0VfTVBVTEJBLCBibGtfcnFfcG9zKHJlcSkgJiAweDBGRkZGRkZGKTsKIAotCQljb3VudCA9IHJlcS0+aGFyZF9ucl9zZWN0b3JzOworCQljb3VudCA9IGJsa19ycV9zZWN0b3JzKHJlcSk7CiAJCWlmIChycV9kYXRhX2RpcihyZXEpKSB7CiAJCQkvKiBLaWNrIG9mZiB3cml0ZSByZXF1ZXN0ICovCiAJCQlkZXZfZGJnKGFjZS0+ZGV2LCAid3JpdGUgZGF0YVxuIik7CkBAIC02ODgsNyArNjk1LDcgQEAKIAkJCWRldl9kYmcoYWNlLT5kZXYsCiAJCQkJIkNGQlNZIHNldDsgdD0laSBpdGVyPSVpIGM9JWkgZGM9JWkgaXJxPSVpXG4iLAogCQkJCWFjZS0+ZnNtX3Rhc2ssIGFjZS0+ZnNtX2l0ZXJfbnVtLAotCQkJCWFjZS0+cmVxLT5jdXJyZW50X25yX3NlY3RvcnMgKiAxNiwKKwkJCQlibGtfcnFfY3VyX3NlY3RvcnMoYWNlLT5yZXEpICogMTYsCiAJCQkJYWNlLT5kYXRhX2NvdW50LCBhY2UtPmluX2lycSk7CiAJCQlhY2VfZnNtX3lpZWxkKGFjZSk7CS8qIG5lZWQgdG8gcG9sbCBDRkJTWSBiaXQgKi8KIAkJCWJyZWFrOwpAQCAtNjk3LDcgKzcwNCw3IEBACiAJCQlkZXZfZGJnKGFjZS0+ZGV2LAogCQkJCSJEQVRBQlVGIG5vdCBzZXQ7IHQ9JWkgaXRlcj0laSBjPSVpIGRjPSVpIGlycT0laVxuIiwKIAkJCQlhY2UtPmZzbV90YXNrLCBhY2UtPmZzbV9pdGVyX251bSwKLQkJCQlhY2UtPnJlcS0+Y3VycmVudF9ucl9zZWN0b3JzICogMTYsCisJCQkJYmxrX3JxX2N1cl9zZWN0b3JzKGFjZS0+cmVxKSAqIDE2LAogCQkJCWFjZS0+ZGF0YV9jb3VudCwgYWNlLT5pbl9pcnEpOwogCQkJYWNlX2ZzbV95aWVsZGlycShhY2UpOwogCQkJYnJlYWs7CkBAIC03MTcsMTQgKzcyNCwxMyBAQAogCQl9CiAKIAkJLyogYmlvIGZpbmlzaGVkOyBpcyB0aGVyZSBhbm90aGVyIG9uZT8gKi8KLQkJaWYgKF9fYmxrX2VuZF9yZXF1ZXN0KGFjZS0+cmVxLCAwLAotCQkJCQlibGtfcnFfY3VyX2J5dGVzKGFjZS0+cmVxKSkpIHsKLQkJCS8qIGRldl9kYmcoYWNlLT5kZXYsICJuZXh0IGJsb2NrOyBoPSVsaSBjPSVpXG4iLAotCQkJICogICAgICBhY2UtPnJlcS0+aGFyZF9ucl9zZWN0b3JzLAotCQkJICogICAgICBhY2UtPnJlcS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKKwkJaWYgKF9fYmxrX2VuZF9yZXF1ZXN0X2N1cihhY2UtPnJlcSwgMCkpIHsKKwkJCS8qIGRldl9kYmcoYWNlLT5kZXYsICJuZXh0IGJsb2NrOyBoPSV1IGM9JXVcbiIsCisJCQkgKiAgICAgIGJsa19ycV9zZWN0b3JzKGFjZS0+cmVxKSwKKwkJCSAqICAgICAgYmxrX3JxX2N1cl9zZWN0b3JzKGFjZS0+cmVxKSk7CiAJCQkgKi8KIAkJCWFjZS0+ZGF0YV9wdHIgPSBhY2UtPnJlcS0+YnVmZmVyOwotCQkJYWNlLT5kYXRhX2NvdW50ID0gYWNlLT5yZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyAqIDE2OworCQkJYWNlLT5kYXRhX2NvdW50ID0gYmxrX3JxX2N1cl9zZWN0b3JzKGFjZS0+cmVxKSAqIDE2OwogCQkJYWNlX2ZzbV95aWVsZGlycShhY2UpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTk3OCw3ICs5ODQsNyBAQAogCWFjZS0+cXVldWUgPSBibGtfaW5pdF9xdWV1ZShhY2VfcmVxdWVzdCwgJmFjZS0+bG9jayk7CiAJaWYgKGFjZS0+cXVldWUgPT0gTlVMTCkKIAkJZ290byBlcnJfYmxrX2luaXRxOwotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGFjZS0+cXVldWUsIDUxMik7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShhY2UtPnF1ZXVlLCA1MTIpOwogCiAJLyoKIAkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBHRCBzdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svejJyYW0uYyBiL2RyaXZlcnMvYmxvY2svejJyYW0uYwppbmRleCA4MDc1NGNkLi40NTc1MTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3oycmFtLmMKKysrIGIvZHJpdmVycy9ibG9jay96MnJhbS5jCkBAIC03MCwxNSArNzAsMTggQEAKIHN0YXRpYyB2b2lkIGRvX3oyX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKLQl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpIHsKLQkJdW5zaWduZWQgbG9uZyBzdGFydCA9IHJlcS0+c2VjdG9yIDw8IDk7Ci0JCXVuc2lnbmVkIGxvbmcgbGVuICA9IHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw8IDk7CisKKwlyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKTsKKwl3aGlsZSAocmVxKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBibGtfcnFfcG9zKHJlcSkgPDwgOTsKKwkJdW5zaWduZWQgbG9uZyBsZW4gID0gYmxrX3JxX2N1cl9ieXRlcyhyZXEpOworCQlpbnQgZXJyID0gMDsKIAogCQlpZiAoc3RhcnQgKyBsZW4gPiB6MnJhbV9zaXplKSB7CiAJCQlwcmludGsoIEtFUk5fRVJSIERFVklDRV9OQU1FICI6IGJhZCBhY2Nlc3M6IGJsb2NrPSVsdSwgY291bnQ9JXVcbiIsCi0JCQkJcmVxLT5zZWN0b3IsIHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzKTsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCQljb250aW51ZTsKKwkJCQlibGtfcnFfcG9zKHJlcSksIGJsa19ycV9jdXJfc2VjdG9ycyhyZXEpKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGRvbmU7CiAJCX0KIAkJd2hpbGUgKGxlbikgewogCQkJdW5zaWduZWQgbG9uZyBhZGRyID0gc3RhcnQgJiBaMlJBTV9DSFVOS01BU0s7CkBAIC05Myw3ICs5Niw5IEBACiAJCQlzdGFydCArPSBzaXplOwogCQkJbGVuIC09IHNpemU7CiAJCX0KLQkJZW5kX3JlcXVlc3QocmVxLCAxKTsKKwlkb25lOgorCQlpZiAoIV9fYmxrX2VuZF9yZXF1ZXN0X2N1cihyZXEsIGVycikpCisJCQlyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKaW5kZXggYWY3NjFkYy4uNDg5NWYwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xkaXNjLmMKQEAgLTI3Nyw4ICsyNzcsOCBAQAogCS8qIEZJWE1FOiB3aHkgaXMgdGhpcyBuZWVkZWQuIE5vdGUgZG9uJ3QgdXNlIGxkaXNjX3JlZiBoZXJlIGFzIHRoZQogCSAgIG9wZW4gcGF0aCBpcyBiZWZvcmUgdGhlIGxkaXNjIGlzIHJlZmVyZW5jYWJsZSAqLwogCi0JaWYgKHR0eS0+bGRpc2Mub3BzLT5mbHVzaF9idWZmZXIpCi0JCXR0eS0+bGRpc2Mub3BzLT5mbHVzaF9idWZmZXIodHR5KTsKKwlpZiAodHR5LT5sZGlzYy0+b3BzLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+bGRpc2MtPm9wcy0+Zmx1c2hfYnVmZmVyKHR0eSk7CiAJdHR5X2RyaXZlcl9mbHVzaF9idWZmZXIodHR5KTsKIAogCXJldHVybiAwOwpAQCAtNDYzLDcgKzQ2Myw2IEBACiAJCQkJY2xlYXJfYml0KEhDSV9VQVJUX1BST1RPX1NFVCwgJmh1LT5mbGFncyk7CiAJCQkJcmV0dXJuIGVycjsKIAkJCX0KLQkJCXR0eS0+bG93X2xhdGVuY3kgPSAxOwogCQl9IGVsc2UKIAkJCXJldHVybiAtRUJVU1k7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9jZHJvbS5jIGIvZHJpdmVycy9jZHJvbS9jZHJvbS5jCmluZGV4IGNjZWFjZTYuLjcxZDFiOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vY2Ryb20uYworKysgYi9kcml2ZXJzL2Nkcm9tL2Nkcm9tLmMKQEAgLTIxMDEsOCArMjEwMSw4IEBACiAJCW5yID0gbmZyYW1lczsKIAkJaWYgKGNkaS0+Y2RkYV9tZXRob2QgPT0gQ0REQV9CUENfU0lOR0xFKQogCQkJbnIgPSAxOwotCQlpZiAobnIgKiBDRF9GUkFNRVNJWkVfUkFXID4gKHEtPm1heF9zZWN0b3JzIDw8IDkpKQotCQkJbnIgPSAocS0+bWF4X3NlY3RvcnMgPDwgOSkgLyBDRF9GUkFNRVNJWkVfUkFXOworCQlpZiAobnIgKiBDRF9GUkFNRVNJWkVfUkFXID4gKHF1ZXVlX21heF9zZWN0b3JzKHEpIDw8IDkpKQorCQkJbnIgPSAocXVldWVfbWF4X3NlY3RvcnMocSkgPDwgOSkgLyBDRF9GUkFNRVNJWkVfUkFXOwogCiAJCWxlbiA9IG5yICogQ0RfRlJBTUVTSVpFX1JBVzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jZHJvbS9nZHJvbS5jIGIvZHJpdmVycy9jZHJvbS9nZHJvbS5jCmluZGV4IDJlZWNiNzcuLmI1NjIxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vZ2Ryb20uYworKysgYi9kcml2ZXJzL2Nkcm9tL2dkcm9tLmMKQEAgLTU4NCw4ICs1ODQsOCBAQAogCWxpc3RfZm9yX2VhY2hfc2FmZShlbGVtLCBuZXh0LCAmZ2Ryb21fZGVmZXJyZWQpIHsKIAkJcmVxID0gbGlzdF9lbnRyeShlbGVtLCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KTsKIAkJc3Bpbl91bmxvY2soJmdkcm9tX2xvY2spOwotCQlibG9jayA9IHJlcS0+c2VjdG9yL0dEX1RPX0JMSyArIEdEX1NFU1NJT05fT0ZGU0VUOwotCQlibG9ja19jbnQgPSByZXEtPm5yX3NlY3RvcnMvR0RfVE9fQkxLOworCQlibG9jayA9IGJsa19ycV9wb3MocmVxKS9HRF9UT19CTEsgKyBHRF9TRVNTSU9OX09GRlNFVDsKKwkJYmxvY2tfY250ID0gYmxrX3JxX3NlY3RvcnMocmVxKS9HRF9UT19CTEs7CiAJCWN0cmxfb3V0bChQSFlTQUREUihyZXEtPmJ1ZmZlciksIEdEUk9NX0RNQV9TVEFSVEFERFJfUkVHKTsKIAkJY3RybF9vdXRsKGJsb2NrX2NudCAqIEdEUk9NX0hBUkRfU0VDVE9SLCBHRFJPTV9ETUFfTEVOR1RIX1JFRyk7CiAJCWN0cmxfb3V0bCgxLCBHRFJPTV9ETUFfRElSRUNUSU9OX1JFRyk7CkBAIC02MzIsMzkgKzYzMiwzNSBAQAogCQkqIGJlZm9yZSBoYW5kbGluZyBlbmRpbmcgdGhlIHJlcXVlc3QgKi8KIAkJc3Bpbl9sb2NrKCZnZHJvbV9sb2NrKTsKIAkJbGlzdF9kZWxfaW5pdCgmcmVxLT5xdWV1ZWxpc3QpOwotCQlfX2Jsa19lbmRfcmVxdWVzdChyZXEsIGVyciwgYmxrX3JxX2J5dGVzKHJlcSkpOworCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCBlcnIpOwogCX0KIAlzcGluX3VubG9jaygmZ2Ryb21fbG9jayk7CiAJa2ZyZWUocmVhZF9jb21tYW5kKTsKIH0KIAotc3RhdGljIHZvaWQgZ2Ryb21fcmVxdWVzdF9oYW5kbGVyX2RtYShzdHJ1Y3QgcmVxdWVzdCAqcmVxKQotewotCS8qIGRlcXVldWUsIGFkZCB0byBsaXN0IG9mIGRlZmVycmVkIHdvcmsKLQkqIGFuZCB0aGVuIHNjaGVkdWxlIHdvcmtxdWV1ZSAqLwotCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKLQlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlbGlzdCwgJmdkcm9tX2RlZmVycmVkKTsKLQlzY2hlZHVsZV93b3JrKCZ3b3JrKTsKLX0KLQogc3RhdGljIHZvaWQgZ2Ryb21fcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcnEpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAotCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChycSkpICE9IE5VTEwpIHsKKwl3aGlsZSAoKHJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHJxKSkgIT0gTlVMTCkgewogCQlpZiAoIWJsa19mc19yZXF1ZXN0KHJlcSkpIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHICJHRFJPTTogTm9uLWZzIHJlcXVlc3QgaWdub3JlZFxuIik7Ci0JCQllbmRfcmVxdWVzdChyZXEsIDApOworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CisJCQljb250aW51ZTsKIAkJfQogCQlpZiAocnFfZGF0YV9kaXIocmVxKSAhPSBSRUFEKSB7CiAJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkdEUk9NOiBSZWFkIG9ubHkgZGV2aWNlIC0iKTsKIAkJCXByaW50aygiIHdyaXRlIHJlcXVlc3QgaWdub3JlZFxuIik7Ci0JCQllbmRfcmVxdWVzdChyZXEsIDApOworCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CisJCQljb250aW51ZTsKIAkJfQotCQlpZiAocmVxLT5ucl9zZWN0b3JzKQotCQkJZ2Ryb21fcmVxdWVzdF9oYW5kbGVyX2RtYShyZXEpOwotCQllbHNlCi0JCQllbmRfcmVxdWVzdChyZXEsIDApOworCisJCS8qCisJCSAqIEFkZCB0byBsaXN0IG9mIGRlZmVycmVkIHdvcmsgYW5kIHRoZW4gc2NoZWR1bGUKKwkJICogd29ya3F1ZXVlLgorCQkgKi8KKwkJbGlzdF9hZGRfdGFpbCgmcmVxLT5xdWV1ZWxpc3QsICZnZHJvbV9kZWZlcnJlZCk7CisJCXNjaGVkdWxlX3dvcmsoJndvcmspOwogCX0KIH0KIApAQCAtNzQzLDcgKzczOSw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHByb2JlX2dkcm9tX3NldHVwcXVldWUodm9pZCkKIHsKLQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShnZC5nZHJvbV9ycSwgR0RST01fSEFSRF9TRUNUT1IpOworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoZ2QuZ2Ryb21fcnEsIEdEUk9NX0hBUkRfU0VDVE9SKTsKIAkvKiB1c2luZyBETUEgc28gbWVtb3J5IHdpbGwgbmVlZCB0byBiZSBjb250aWd1b3VzICovCiAJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhnZC5nZHJvbV9ycSwgMSk7CiAJLyogc2V0IGEgbGFyZ2UgbWF4IHNpemUgdG8gZ2V0IG1vc3QgZnJvbSBETUEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYyBiL2RyaXZlcnMvY2Ryb20vdmlvY2QuYwppbmRleCA5YjE2MjRlLi4wZmZmNjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKKysrIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAkJCXZpb3BhdGhfdGFyZ2V0aW5zdCh2aW9wYXRoX2hvc3RMcCksCiAJCQkodTY0KXJlcSwgVklPVkVSU0lPTiA8PCAxNiwKIAkJCSgodTY0KURFVklDRV9OUihkaXNraW5mbykgPDwgNDgpIHwgZG1hYWRkciwKLQkJCSh1NjQpcmVxLT5zZWN0b3IgKiA1MTIsIGxlbiwgMCk7CisJCQkodTY0KWJsa19ycV9wb3MocmVxKSAqIDUxMiwgbGVuLCAwKTsKIAlpZiAoaHZyYyAhPSBIdkxwRXZlbnRfUmNfR29vZCkgewogCQlwcmludGsoVklPQ0RfS0VSTl9XQVJOSU5HICJodiBlcnJvciBvbiBvcCAlZFxuIiwgKGludClodnJjKTsKIAkJcmV0dXJuIC0xOwpAQCAtMjkxLDM2ICsyOTEsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdmlvY2RfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJlcSwgaW50IGVycm9yKQotewotCWludCBuc2VjdG9ycyA9IHJlcS0+aGFyZF9ucl9zZWN0b3JzOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgaXQncyBmdWxseSBlbmRlZCwgYW5kIGVuc3VyZSB0aGF0IHdlIHByb2Nlc3MKLQkgKiBhdCBsZWFzdCBvbmUgc2VjdG9yLgotCSAqLwotCWlmIChibGtfcGNfcmVxdWVzdChyZXEpKQotCQluc2VjdG9ycyA9IChyZXEtPmRhdGFfbGVuICsgNTExKSA+PiA5OwotCWlmICghbnNlY3RvcnMpCi0JCW5zZWN0b3JzID0gMTsKLQotCWlmIChfX2Jsa19lbmRfcmVxdWVzdChyZXEsIGVycm9yLCBuc2VjdG9ycyA8PCA5KSkKLQkJQlVHKCk7Ci19Ci0KIHN0YXRpYyBpbnQgcndyZXE7CiAKIHN0YXRpYyB2b2lkIGRvX3Zpb2NkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAotCXdoaWxlICgocndyZXEgPT0gMCkgJiYgKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKSkgeworCXdoaWxlICgocndyZXEgPT0gMCkgJiYgKChyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKSkgIT0gTlVMTCkpIHsKIAkJaWYgKCFibGtfZnNfcmVxdWVzdChyZXEpKQotCQkJdmlvY2RfZW5kX3JlcXVlc3QocmVxLCAtRUlPKTsKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQllbHNlIGlmIChzZW5kX3JlcXVlc3QocmVxKSA8IDApIHsKIAkJCXByaW50ayhWSU9DRF9LRVJOX1dBUk5JTkcKIAkJCQkJInVuYWJsZSB0byBzZW5kIG1lc3NhZ2UgdG8gT1MvNDAwISIpOwotCQkJdmlvY2RfZW5kX3JlcXVlc3QocmVxLCAtRUlPKTsKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQl9IGVsc2UKIAkJCXJ3cmVxKys7CiAJfQpAQCAtNDg2LDggKzQ2OSw4IEBACiAJY2FzZSB2aW9jZG9wZW46CiAJCWlmIChldmVudC0+eFJjID09IDApIHsKIAkJCWRpID0gJnZpb2NkX2Rpc2tpbmZvW2JldmVudC0+ZGlza107Ci0JCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShkaS0+dmlvY2RfZGlzay0+cXVldWUsCi0JCQkJCWJldmVudC0+YmxvY2tfc2l6ZSk7CisJCQlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGRpLT52aW9jZF9kaXNrLT5xdWV1ZSwKKwkJCQkJCSAgICAgYmV2ZW50LT5ibG9ja19zaXplKTsKIAkJCXNldF9jYXBhY2l0eShkaS0+dmlvY2RfZGlzaywKIAkJCQkJYmV2ZW50LT5tZWRpYV9zaXplICoKIAkJCQkJYmV2ZW50LT5ibG9ja19zaXplIC8gNTEyKTsKQEAgLTUzMSw5ICs1MTQsOSBAQAogCQkJCQkid2l0aCByYyAlZDoweCUwNFg6ICVzXG4iLAogCQkJCQlyZXEsIGV2ZW50LT54UmMsCiAJCQkJCWJldmVudC0+c3ViX3Jlc3VsdCwgZXJyLT5tc2cpOwotCQkJdmlvY2RfZW5kX3JlcXVlc3QocmVxLCAtRUlPKTsKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQl9IGVsc2UKLQkJCXZpb2NkX2VuZF9yZXF1ZXN0KHJlcSwgMCk7CisJCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAwKTsKIAogCQkvKiByZXN0YXJ0IGhhbmRsaW5nIG9mIGluY29taW5nIHJlcXVlc3RzICovCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpb2NkX3JlcWxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9LY29uZmlnIGIvZHJpdmVycy9jaGFyL0tjb25maWcKaW5kZXggNzM1YmJlMi4uMDJlY2ZkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL0tjb25maWcKQEAgLTk3LDYgKzk3LDE5IEBACiAJICBraW5kIG9mIGtlcm5lbCBkZWJ1Z2dpbmcgb3BlcmF0aW9ucy4KIAkgIFdoZW4gaW4gZG91YnQsIHNheSAiTiIuCiAKK2NvbmZpZyBCRklOX0pUQUdfQ09NTQorCXRyaXN0YXRlICJCbGFja2ZpbiBKVEFHIENvbW11bmljYXRpb24iCisJZGVwZW5kcyBvbiBCTEFDS0ZJTgorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciBlbXVsYXRpbmcgYSBUVFkgZGV2aWNlIG92ZXIgdGhlIEJsYWNrZmluIEpUQUcuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGJmaW5fanRhZ19jb21tLgorCitjb25maWcgQkZJTl9KVEFHX0NPTU1fQ09OU09MRQorCWJvb2wgIkNvbnNvbGUgb24gQmxhY2tmaW4gSlRBRyIKKwlkZXBlbmRzIG9uIEJGSU5fSlRBR19DT01NPXkKKwogY29uZmlnIFNFUklBTF9OT05TVEFOREFSRAogCWJvb2wgIk5vbi1zdGFuZGFyZCBzZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggOWNhZjViNS4uMTg5ZWZjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtMTMsNiArMTMsNyBAQAogb2JqLSQoQ09ORklHX1VOSVg5OF9QVFlTKQkrPSBwdHkubwogb2JqLXkJCQkJKz0gbWlzYy5vCiBvYmotJChDT05GSUdfVlQpCQkrPSB2dF9pb2N0bC5vIHZjX3NjcmVlbi5vIHNlbGVjdGlvbi5vIGtleWJvYXJkLm8KK29iai0kKENPTkZJR19CRklOX0pUQUdfQ09NTSkJKz0gYmZpbl9qdGFnX2NvbW0ubwogb2JqLSQoQ09ORklHX0NPTlNPTEVfVFJBTlNMQVRJT05TKSArPSBjb25zb2xlbWFwLm8gY29uc29sZW1hcF9kZWZ0Ymwubwogb2JqLSQoQ09ORklHX0hXX0NPTlNPTEUpCSs9IHZ0Lm8gZGVma2V5bWFwLm8KIG9iai0kKENPTkZJR19BVURJVCkJCSs9IHR0eV9hdWRpdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYmZpbl9qdGFnX2NvbW0uYyBiL2RyaXZlcnMvY2hhci9iZmluX2p0YWdfY29tbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzExM2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NoYXIvYmZpbl9qdGFnX2NvbW0uYwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIFRUWSBvdmVyIEJsYWNrZmluIEpUQUcgQ29tbXVuaWNhdGlvbgorICoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIEVudGVyIGJ1Z3MgYXQgaHR0cDovL2JsYWNrZmluLnVjbGludXgub3JnLworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworLyogU2VlIHRoZSBEZWJ1Zy9FbXVsYXRpb24gY2hhcHRlciBpbiB0aGUgSFJNICovCisjZGVmaW5lIEVNVURPRiAgIDB4MDAwMDAwMDEJLyogRU1VREFUX09VVCBmdWxsICYgdmFsaWQgKi8KKyNkZWZpbmUgRU1VRElGICAgMHgwMDAwMDAwMgkvKiBFTVVEQVRfSU4gZnVsbCAmIHZhbGlkICovCisjZGVmaW5lIEVNVURPT1ZGIDB4MDAwMDAwMDQJLyogRU1VREFUX09VVCBvdmVyZmxvdyAqLworI2RlZmluZSBFTVVESU9WRiAweDAwMDAwMDA4CS8qIEVNVURBVF9JTiBvdmVyZmxvdyAqLworCisjZGVmaW5lIERSVl9OQU1FICJiZmluLWp0YWctY29tbSIKKyNkZWZpbmUgREVWX05BTUUgInR0eUJGSkMiCisKKyNkZWZpbmUgcHJfaW5pdChmbXQsIGFyZ3MuLi4pICh7IHN0YXRpYyBjb25zdCBfX2luaXRkYXRhIGNoYXIgX19mbXRbXSA9IGZtdDsgcHJpbnRrKF9fZm10LCAjIyBhcmdzKTsgfSkKKyNkZWZpbmUgZGVidWcoZm10LCBhcmdzLi4uKSBwcl9kZWJ1ZyhEUlZfTkFNRSAiOiAiIGZtdCwgIyMgYXJncykKKworc3RhdGljIGlubGluZSB1aW50MzJfdCBiZmluX3dyaXRlX2VtdWRhdCh1aW50MzJfdCBlbXVkYXQpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oImVtdWRhdCA9ICUwOyIgOiA6ICJkIihlbXVkYXQpKTsKKwlyZXR1cm4gZW11ZGF0OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGJmaW5fcmVhZF9lbXVkYXQodm9pZCkKK3sKKwl1aW50MzJfdCBlbXVkYXQ7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oIiUwID0gZW11ZGF0OyIgOiAiPWQiKGVtdWRhdCkpOworCXJldHVybiBlbXVkYXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgYmZpbl93cml0ZV9lbXVkYXRfY2hhcnMoY2hhciBhLCBjaGFyIGIsIGNoYXIgYywgY2hhciBkKQoreworCXJldHVybiBiZmluX3dyaXRlX2VtdWRhdCgoYSA8PCAwKSB8IChiIDw8IDgpIHwgKGMgPDwgMTYpIHwgKGQgPDwgMjQpKTsKK30KKworI2RlZmluZSBDSVJDX1NJWkUgMjA0OAkvKiBzZWUgY29tbWVudCBpbiB0dHlfaW8uYzpkb190dHlfd3JpdGUoKSAqLworI2RlZmluZSBDSVJDX01BU0sgKENJUkNfU0laRSAtIDEpCisjZGVmaW5lIGNpcmNfZW1wdHkoY2lyYykgICAgICgoY2lyYyktPmhlYWQgPT0gKGNpcmMpLT50YWlsKQorI2RlZmluZSBjaXJjX2ZyZWUoY2lyYykgICAgICBDSVJDX1NQQUNFKChjaXJjKS0+aGVhZCwgKGNpcmMpLT50YWlsLCBDSVJDX1NJWkUpCisjZGVmaW5lIGNpcmNfY250KGNpcmMpICAgICAgIENJUkNfQ05UKChjaXJjKS0+aGVhZCwgKGNpcmMpLT50YWlsLCBDSVJDX1NJWkUpCisjZGVmaW5lIGNpcmNfYnl0ZShjaXJjLCBpZHgpICgoY2lyYyktPmJ1ZlsoaWR4KSAmIENJUkNfTUFTS10pCisKK3N0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqYmZpbl9qY19kcml2ZXI7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpiZmluX2pjX2t0aHJlYWQ7CitzdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKiB2b2xhdGlsZSBiZmluX2pjX3R0eTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJmaW5famNfY291bnQ7CitzdGF0aWMgREVGSU5FX01VVEVYKGJmaW5famNfdHR5X211dGV4KTsKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgY2lyY19idWYgYmZpbl9qY193cml0ZV9idWY7CisKK3N0YXRpYyBpbnQKK2JmaW5famNfZW11ZGF0X21hbmFnZXIodm9pZCAqYXJnKQoreworCXVpbnQzMl90IGluYm91bmRfbGVuID0gMCwgb3V0Ym91bmRfbGVuID0gMDsKKworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCS8qIG5vIG9uZSBsZWZ0IHRvIGdpdmUgZGF0YSB0bywgc28gc2xlZXAgKi8KKwkJaWYgKGJmaW5famNfdHR5ID09IE5VTEwgJiYgY2lyY19lbXB0eSgmYmZpbl9qY193cml0ZV9idWYpKSB7CisJCQlkZWJ1Zygid2FpdGluZyBmb3IgcmVhZGVyc1xuIik7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCX0KKworCQkvKiBubyBkYXRhIGF2YWlsYWJsZSwgc28ganVzdCBjaGlsbCAqLworCQlpZiAoIShiZmluX3JlYWRfREJHU1RBVCgpICYgRU1VRElGKSAmJiBjaXJjX2VtcHR5KCZiZmluX2pjX3dyaXRlX2J1ZikpIHsKKwkJCWRlYnVnKCJ3YWl0aW5nIGZvciBkYXRhIChpbl9sZW4gPSAlaSkgKGNpcmM6ICVpICVpKVxuIiwKKwkJCQlpbmJvdW5kX2xlbiwgYmZpbl9qY193cml0ZV9idWYudGFpbCwgYmZpbl9qY193cml0ZV9idWYuaGVhZCk7CisJCQlpZiAoaW5ib3VuZF9sZW4pCisJCQkJc2NoZWR1bGUoKTsKKwkJCWVsc2UKKwkJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoSFopOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBpZiBpbmNvbWluZyBkYXRhIGlzIHJlYWR5LCBlYXQgaXQgKi8KKwkJaWYgKGJmaW5fcmVhZF9EQkdTVEFUKCkgJiBFTVVESUYpIHsKKwkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisJCQltdXRleF9sb2NrKCZiZmluX2pjX3R0eV9tdXRleCk7CisJCQl0dHkgPSAoc3RydWN0IHR0eV9zdHJ1Y3QgKiliZmluX2pjX3R0eTsKKwkJCWlmICh0dHkgIT0gTlVMTCkgeworCQkJCXVpbnQzMl90IGVtdWRhdCA9IGJmaW5fcmVhZF9lbXVkYXQoKTsKKwkJCQlpZiAoaW5ib3VuZF9sZW4gPT0gMCkgeworCQkJCQlkZWJ1ZygiaW5jb21pbmcgbGVuZ3RoOiAweCUwOHhcbiIsIGVtdWRhdCk7CisJCQkJCWluYm91bmRfbGVuID0gZW11ZGF0OworCQkJCX0gZWxzZSB7CisJCQkJCXNpemVfdCBudW1fY2hhcnMgPSAoNCA8PSBpbmJvdW5kX2xlbiA/IDQgOiBpbmJvdW5kX2xlbik7CisJCQkJCWRlYnVnKCIgIGluY29taW5nIGRhdGE6IDB4JTA4eCAocHVzaGluZyAlenUpXG4iLCBlbXVkYXQsIG51bV9jaGFycyk7CisJCQkJCWluYm91bmRfbGVuIC09IG51bV9jaGFyczsKKwkJCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksICh1bnNpZ25lZCBjaGFyICopJmVtdWRhdCwgbnVtX2NoYXJzKTsKKwkJCQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwkJCQl9CisJCQl9CisJCQltdXRleF91bmxvY2soJmJmaW5famNfdHR5X211dGV4KTsKKwkJfQorCisJCS8qIGlmIG91dGdvaW5nIGRhdGEgaXMgcmVhZHksIHBvc3QgaXQgKi8KKwkJaWYgKCEoYmZpbl9yZWFkX0RCR1NUQVQoKSAmIEVNVURPRikgJiYgIWNpcmNfZW1wdHkoJmJmaW5famNfd3JpdGVfYnVmKSkgeworCQkJaWYgKG91dGJvdW5kX2xlbiA9PSAwKSB7CisJCQkJb3V0Ym91bmRfbGVuID0gY2lyY19jbnQoJmJmaW5famNfd3JpdGVfYnVmKTsKKwkJCQliZmluX3dyaXRlX2VtdWRhdChvdXRib3VuZF9sZW4pOworCQkJCWRlYnVnKCJvdXRnb2luZyBsZW5ndGg6IDB4JTA4eFxuIiwgb3V0Ym91bmRfbGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwkJCQlpbnQgdGFpbCA9IGJmaW5famNfd3JpdGVfYnVmLnRhaWw7CisJCQkJc2l6ZV90IGF0ZSA9ICg0IDw9IG91dGJvdW5kX2xlbiA/IDQgOiBvdXRib3VuZF9sZW4pOworCQkJCXVpbnQzMl90IGVtdWRhdCA9CisJCQkJYmZpbl93cml0ZV9lbXVkYXRfY2hhcnMoCisJCQkJCWNpcmNfYnl0ZSgmYmZpbl9qY193cml0ZV9idWYsIHRhaWwgKyAwKSwKKwkJCQkJY2lyY19ieXRlKCZiZmluX2pjX3dyaXRlX2J1ZiwgdGFpbCArIDEpLAorCQkJCQljaXJjX2J5dGUoJmJmaW5famNfd3JpdGVfYnVmLCB0YWlsICsgMiksCisJCQkJCWNpcmNfYnl0ZSgmYmZpbl9qY193cml0ZV9idWYsIHRhaWwgKyAzKQorCQkJCSk7CisJCQkJYmZpbl9qY193cml0ZV9idWYudGFpbCArPSBhdGU7CisJCQkJb3V0Ym91bmRfbGVuIC09IGF0ZTsKKwkJCQltdXRleF9sb2NrKCZiZmluX2pjX3R0eV9tdXRleCk7CisJCQkJdHR5ID0gKHN0cnVjdCB0dHlfc3RydWN0ICopYmZpbl9qY190dHk7CisJCQkJaWYgKHR0eSkKKwkJCQkJdHR5X3dha2V1cCh0dHkpOworCQkJCW11dGV4X3VubG9jaygmYmZpbl9qY190dHlfbXV0ZXgpOworCQkJCWRlYnVnKCIgIG91dGdvaW5nIGRhdGE6IDB4JTA4eCAocHVzaGluZyAlenUpXG4iLCBlbXVkYXQsIGF0ZSk7CisJCQl9CisJCX0KKwl9CisKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JmaW5famNfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwltdXRleF9sb2NrKCZiZmluX2pjX3R0eV9tdXRleCk7CisJZGVidWcoIm9wZW4gJWx1XG4iLCBiZmluX2pjX2NvdW50KTsKKwkrK2JmaW5famNfY291bnQ7CisJYmZpbl9qY190dHkgPSB0dHk7CisJd2FrZV91cF9wcm9jZXNzKGJmaW5famNfa3RocmVhZCk7CisJbXV0ZXhfdW5sb2NrKCZiZmluX2pjX3R0eV9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitiZmluX2pjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCW11dGV4X2xvY2soJmJmaW5famNfdHR5X211dGV4KTsKKwlkZWJ1ZygiY2xvc2UgJWx1XG4iLCBiZmluX2pjX2NvdW50KTsKKwlpZiAoLS1iZmluX2pjX2NvdW50ID09IDApCisJCWJmaW5famNfdHR5ID0gTlVMTDsKKwl3YWtlX3VwX3Byb2Nlc3MoYmZpbl9qY19rdGhyZWFkKTsKKwltdXRleF91bmxvY2soJmJmaW5famNfdHR5X211dGV4KTsKK30KKworLyogWFhYOiB3ZSBkb250IGhhbmRsZSB0aGUgcHV0X2NoYXIoKSBjYXNlIHdoZXJlIHdlIG11c3QgaGFuZGxlIGNvdW50ID0gMSAqLworc3RhdGljIGludAorYmZpbl9qY19jaXJjX3dyaXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBpOworCWNvdW50ID0gbWluKGNvdW50LCBjaXJjX2ZyZWUoJmJmaW5famNfd3JpdGVfYnVmKSk7CisJZGVidWcoImdvaW5nIHRvIHdyaXRlIGNodW5rIG9mICVpIGJ5dGVzXG4iLCBjb3VudCk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCisJCWNpcmNfYnl0ZSgmYmZpbl9qY193cml0ZV9idWYsIGJmaW5famNfd3JpdGVfYnVmLmhlYWQgKyBpKSA9IGJ1ZltpXTsKKwliZmluX2pjX3dyaXRlX2J1Zi5oZWFkICs9IGk7CisJcmV0dXJuIGk7Cit9CisKKyNpZm5kZWYgQ09ORklHX0JGSU5fSlRBR19DT01NX0NPTlNPTEUKKyMgZGVmaW5lIGFjcXVpcmVfY29uc29sZV9zZW0oKQorIyBkZWZpbmUgcmVsZWFzZV9jb25zb2xlX3NlbSgpCisjZW5kaWYKK3N0YXRpYyBpbnQKK2JmaW5famNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGk7CisJYWNxdWlyZV9jb25zb2xlX3NlbSgpOworCWkgPSBiZmluX2pjX2NpcmNfd3JpdGUoYnVmLCBjb3VudCk7CisJcmVsZWFzZV9jb25zb2xlX3NlbSgpOworCXdha2VfdXBfcHJvY2VzcyhiZmluX2pjX2t0aHJlYWQpOworCXJldHVybiBpOworfQorCitzdGF0aWMgdm9pZAorYmZpbl9qY19mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXdha2VfdXBfcHJvY2VzcyhiZmluX2pjX2t0aHJlYWQpOworfQorCitzdGF0aWMgaW50CitiZmluX2pjX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlyZXR1cm4gY2lyY19mcmVlKCZiZmluX2pjX3dyaXRlX2J1Zik7Cit9CisKK3N0YXRpYyBpbnQKK2JmaW5famNfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJcmV0dXJuIGNpcmNfY250KCZiZmluX2pjX3dyaXRlX2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkCitiZmluX2pjX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKK3sKKwl1bnNpZ25lZCBsb25nIGV4cGlyZSA9IGppZmZpZXMgKyB0aW1lb3V0OworCXdoaWxlICghY2lyY19lbXB0eSgmYmZpbl9qY193cml0ZV9idWYpKSB7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBleHBpcmUpKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHR0eV9vcGVyYXRpb25zIGJmaW5famNfb3BzID0geworCS5vcGVuICAgICAgICAgICAgPSBiZmluX2pjX29wZW4sCisJLmNsb3NlICAgICAgICAgICA9IGJmaW5famNfY2xvc2UsCisJLndyaXRlICAgICAgICAgICA9IGJmaW5famNfd3JpdGUsCisJLyoucHV0X2NoYXIgICAgICAgID0gYmZpbl9qY19wdXRfY2hhciwqLworCS5mbHVzaF9jaGFycyAgICAgPSBiZmluX2pjX2ZsdXNoX2NoYXJzLAorCS53cml0ZV9yb29tICAgICAgPSBiZmluX2pjX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9IGJmaW5famNfY2hhcnNfaW5fYnVmZmVyLAorCS53YWl0X3VudGlsX3NlbnQgPSBiZmluX2pjX3dhaXRfdW50aWxfc2VudCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJmaW5famNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwliZmluX2pjX2t0aHJlYWQgPSBrdGhyZWFkX2NyZWF0ZShiZmluX2pjX2VtdWRhdF9tYW5hZ2VyLCBOVUxMLCBEUlZfTkFNRSk7CisJaWYgKElTX0VSUihiZmluX2pjX2t0aHJlYWQpKQorCQlyZXR1cm4gUFRSX0VSUihiZmluX2pjX2t0aHJlYWQpOworCisJcmV0ID0gLUVOT01FTTsKKworCWJmaW5famNfd3JpdGVfYnVmLmhlYWQgPSBiZmluX2pjX3dyaXRlX2J1Zi50YWlsID0gMDsKKwliZmluX2pjX3dyaXRlX2J1Zi5idWYgPSBrbWFsbG9jKENJUkNfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiZmluX2pjX3dyaXRlX2J1Zi5idWYpCisJCWdvdG8gZXJyOworCisJYmZpbl9qY19kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKDEpOworCWlmICghYmZpbl9qY19kcml2ZXIpCisJCWdvdG8gZXJyOworCisJYmZpbl9qY19kcml2ZXItPm93bmVyICAgICAgICA9IFRISVNfTU9EVUxFOworCWJmaW5famNfZHJpdmVyLT5kcml2ZXJfbmFtZSAgPSBEUlZfTkFNRTsKKwliZmluX2pjX2RyaXZlci0+bmFtZSAgICAgICAgID0gREVWX05BTUU7CisJYmZpbl9qY19kcml2ZXItPnR5cGUgICAgICAgICA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CisJYmZpbl9qY19kcml2ZXItPnN1YnR5cGUgICAgICA9IFNFUklBTF9UWVBFX05PUk1BTDsKKwliZmluX2pjX2RyaXZlci0+aW5pdF90ZXJtaW9zID0gdHR5X3N0ZF90ZXJtaW9zOworCXR0eV9zZXRfb3BlcmF0aW9ucyhiZmluX2pjX2RyaXZlciwgJmJmaW5famNfb3BzKTsKKworCXJldCA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIoYmZpbl9qY19kcml2ZXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJcHJfaW5pdChLRVJOX0lORk8gRFJWX05BTUUgIjogaW5pdGlhbGl6ZWRcbiIpOworCisJcmV0dXJuIDA7CisKKyBlcnI6CisJcHV0X3R0eV9kcml2ZXIoYmZpbl9qY19kcml2ZXIpOworCWtmcmVlKGJmaW5famNfd3JpdGVfYnVmLmJ1Zik7CisJa3RocmVhZF9zdG9wKGJmaW5famNfa3RocmVhZCk7CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGJmaW5famNfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBiZmluX2pjX2V4aXQodm9pZCkKK3sKKwlrdGhyZWFkX3N0b3AoYmZpbl9qY19rdGhyZWFkKTsKKwlrZnJlZShiZmluX2pjX3dyaXRlX2J1Zi5idWYpOworCXR0eV91bnJlZ2lzdGVyX2RyaXZlcihiZmluX2pjX2RyaXZlcik7CisJcHV0X3R0eV9kcml2ZXIoYmZpbl9qY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoYmZpbl9qY19leGl0KTsKKworI2lmIGRlZmluZWQoQ09ORklHX0JGSU5fSlRBR19DT01NX0NPTlNPTEUpIHx8IGRlZmluZWQoQ09ORklHX0VBUkxZX1BSSU5USykKK3N0YXRpYyB2b2lkCitiZmluX2pjX3N0cmFpZ2h0X2J1ZmZlcl93cml0ZShjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGNvdW50KQoreworCXVuc2lnbmVkIGF0ZSA9IDA7CisJd2hpbGUgKGJmaW5fcmVhZF9EQkdTVEFUKCkgJiBFTVVET0YpCisJCWNvbnRpbnVlOworCWJmaW5fd3JpdGVfZW11ZGF0KGNvdW50KTsKKwl3aGlsZSAoYXRlIDwgY291bnQpIHsKKwkJd2hpbGUgKGJmaW5fcmVhZF9EQkdTVEFUKCkgJiBFTVVET0YpCisJCQljb250aW51ZTsKKwkJYmZpbl93cml0ZV9lbXVkYXRfY2hhcnMoYnVmW2F0ZV0sIGJ1ZlthdGUrMV0sIGJ1ZlthdGUrMl0sIGJ1ZlthdGUrM10pOworCQlhdGUgKz0gNDsKKwl9Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19CRklOX0pUQUdfQ09NTV9DT05TT0xFCitzdGF0aWMgdm9pZAorYmZpbl9qY19jb25zb2xlX3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlpZiAoYmZpbl9qY19rdGhyZWFkID09IE5VTEwpCisJCWJmaW5famNfc3RyYWlnaHRfYnVmZmVyX3dyaXRlKGJ1ZiwgY291bnQpOworCWVsc2UKKwkJYmZpbl9qY19jaXJjX3dyaXRlKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKgorYmZpbl9qY19jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqY28sIGludCAqaW5kZXgpCit7CisJKmluZGV4ID0gY28tPmluZGV4OworCXJldHVybiBiZmluX2pjX2RyaXZlcjsKK30KKworc3RhdGljIHN0cnVjdCBjb25zb2xlIGJmaW5famNfY29uc29sZSA9IHsKKwkubmFtZSAgICA9IERFVl9OQU1FLAorCS53cml0ZSAgID0gYmZpbl9qY19jb25zb2xlX3dyaXRlLAorCS5kZXZpY2UgID0gYmZpbl9qY19jb25zb2xlX2RldmljZSwKKwkuZmxhZ3MgICA9IENPTl9BTllUSU1FIHwgQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleCAgID0gLTEsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBiZmluX2pjX2NvbnNvbGVfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX2NvbnNvbGUoJmJmaW5famNfY29uc29sZSk7CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKGJmaW5famNfY29uc29sZV9pbml0KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USworc3RhdGljIHZvaWQgX19pbml0CitiZmluX2pjX2Vhcmx5X3dyaXRlKHN0cnVjdCBjb25zb2xlICpjbywgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJYmZpbl9qY19zdHJhaWdodF9idWZmZXJfd3JpdGUoYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBjb25zb2xlIGJmaW5famNfZWFybHlfY29uc29sZSA9IHsKKwkubmFtZSAgID0gImVhcmx5X0JGSkMiLAorCS53cml0ZSAgID0gYmZpbl9qY19lYXJseV93cml0ZSwKKwkuZmxhZ3MgICA9IENPTl9BTllUSU1FIHwgQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleCAgID0gLTEsCit9OworCitzdHJ1Y3QgY29uc29sZSAqIF9faW5pdAorYmZpbl9qY19lYXJseV9pbml0KHVuc2lnbmVkIGludCBwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCit7CisJcmV0dXJuICZiZmluX2pjX2Vhcmx5X2NvbnNvbGU7Cit9CisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUVFkgb3ZlciBCbGFja2ZpbiBKVEFHIENvbW11bmljYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKaW5kZXggMWZkYjlmNi4uZjMzNjZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKKysrIGIvZHJpdmVycy9jaGFyL2N5Y2xhZGVzLmMKQEAgLTYwNCw3ICs2MDQsNiBAQAogCiAjZGVmaW5lIE5SX1BPUlRTCTI1NgogCi0jZGVmaW5lIFpFX1YxX05QT1JUUwk2NAogI2RlZmluZSBaT19WMQkwCiAjZGVmaW5lIFpPX1YyCTEKICNkZWZpbmUgWkVfVjEJMgpAQCAtNjYzLDE4ICs2NjIsNiBAQAogc3RhdGljIHZvaWQgY3lfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBzdGF0aWMgdm9pZCBjeV9zZW5kX3hjaGFyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNoYXIgY2gpOwogCi0jZGVmaW5lIElTX0NZQ19aKGNhcmQpICgoY2FyZCkubnVtX2NoaXBzID09ICh1bnNpZ25lZCBpbnQpLTEpCi0KLSNkZWZpbmUgWl9GUEdBX0NIRUNLKGNhcmQpIFwKLQkoKHJlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSBcCi0JCSgoY2FyZCkuY3RsX2FkZHIpKS0+aW5pdF9jdHJsKSAmICgxPDwxNykpICE9IDApCi0KLSNkZWZpbmUgSVNaTE9BREVEKGNhcmQpCSgoKFpPX1YxID09IHJlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKSBcCi0JCQkoKGNhcmQpLmN0bF9hZGRyKSktPm1haWxfYm94XzApKSB8fCBcCi0JCQlaX0ZQR0FfQ0hFQ0soY2FyZCkpICYmIFwKLQkJCShaRklSTV9JRCA9PSByZWFkbCgmKChzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICopIFwKLQkJCSgoY2FyZCkuYmFzZV9hZGRyK0lEX0FERFJFU1MpKS0+c2lnbmF0dXJlKSkpCi0KICNpZm5kZWYgU0VSSUFMX1hNSVRfU0laRQogI2RlZmluZQlTRVJJQUxfWE1JVF9TSVpFCShtaW4oUEFHRV9TSVpFLCA0MDk2KSkKICNlbmRpZgpAQCAtNjg3LDggKzY3NCw2IEBACiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OCTB4MDIwMTAyMDMKICNkZWZpbmUgUkFNX1NJWkUgMHg4MDAwMAogCi0jZGVmaW5lIFpfRlBHQV9MT0FERUQoWCkJKChyZWFkbCgmKFgpLT5pbml0X2N0cmwpICYgKDE8PDE3KSkgIT0gMCkKLQogZW51bSB6YmxvY2tfdHlwZSB7CiAJWkJMT0NLX1BSRyA9IDAsCiAJWkJMT0NLX0ZQR0EgPSAxCkBAIC04ODMsNiArODY4LDI5IEBACiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgY3l6X3J4X2Z1bGxfdGltZXJbTlJfUE9SVFNdOwogI2VuZGlmCQkJCS8qIENPTkZJR19DWVpfSU5UUiAqLwogCitzdGF0aWMgaW5saW5lIGJvb2wgY3lfaXNfWihzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2FyZCkKK3sKKwlyZXR1cm4gY2FyZC0+bnVtX2NoaXBzID09ICh1bnNpZ25lZCBpbnQpLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2N5el9mcGdhX2xvYWRlZChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKmN0bF9hZGRyKQoreworCXJldHVybiByZWFkbCgmY3RsX2FkZHItPmluaXRfY3RybCkgJiAoMSA8PCAxNyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjeXpfZnBnYV9sb2FkZWQoc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNhcmQpCit7CisJcmV0dXJuIF9fY3l6X2ZwZ2FfbG9hZGVkKGNhcmQtPmN0bF9hZGRyLnA5MDYwKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGN5el9pc19sb2FkZWQoc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZndfaWQgPSBjYXJkLT5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOworCisJcmV0dXJuIChjYXJkLT5od192ZXIgPT0gWk9fVjEgfHwgY3l6X2ZwZ2FfbG9hZGVkKGNhcmQpKSAmJgorCQkJcmVhZGwoJmZ3X2lkLT5zaWduYXR1cmUpID09IFpGSVJNX0lEOworfQorCiBzdGF0aWMgaW5saW5lIGludCBzZXJpYWxfcGFyYW5vaWFfY2hlY2soc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm8sCiAJCWNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnJvdXRpbmUpCiB7CkBAIC0xMzk1LDE5ICsxNDAzLDE1IEBACiAJdW5zaWduZWQgbG9uZyBsb2NfZG9vcmJlbGw7CiAKIAlmaXJtX2lkID0gY2luZm8tPmJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0JaWYgKCFJU1pMT0FERUQoKmNpbmZvKSkKLQkJcmV0dXJuIC0xOwogCXpmd19jdHJsID0gY2luZm8tPmJhc2VfYWRkciArIChyZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwogCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CiAKLQlsb2NfZG9vcmJlbGwgPSByZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikKLQkJCQkgIChjaW5mby0+Y3RsX2FkZHIpKS0+bG9jX2Rvb3JiZWxsKTsKKwlsb2NfZG9vcmJlbGwgPSByZWFkbCgmY2luZm8tPmN0bF9hZGRyLnA5MDYwLT5sb2NfZG9vcmJlbGwpOwogCWlmIChsb2NfZG9vcmJlbGwpIHsKIAkJKmNtZCA9IChjaGFyKSgweGZmICYgbG9jX2Rvb3JiZWxsKTsKIAkJKmNoYW5uZWwgPSByZWFkbCgmYm9hcmRfY3RybC0+ZndjbWRfY2hhbm5lbCk7CiAJCSpwYXJhbSA9IChfX3UzMikgcmVhZGwoJmJvYXJkX2N0cmwtPmZ3Y21kX3BhcmFtKTsKLQkJY3lfd3JpdGVsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKShjaW5mby0+Y3RsX2FkZHIpKS0+Ci0JCQkgIGxvY19kb29yYmVsbCwgMHhmZmZmZmZmZik7CisJCWN5X3dyaXRlbCgmY2luZm8tPmN0bF9hZGRyLnA5MDYwLT5sb2NfZG9vcmJlbGwsIDB4ZmZmZmZmZmYpOwogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNDI0LDE1ICsxNDI4LDE0IEBACiAJdW5zaWduZWQgaW50IGluZGV4OwogCiAJZmlybV9pZCA9IGNpbmZvLT5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOwotCWlmICghSVNaTE9BREVEKCpjaW5mbykpCisJaWYgKCFjeXpfaXNfbG9hZGVkKGNpbmZvKSkKIAkJcmV0dXJuIC0xOwogCiAJemZ3X2N0cmwgPSBjaW5mby0+YmFzZV9hZGRyICsgKHJlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7CiAJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKIAogCWluZGV4ID0gMDsKLQlwY2lfZG9vcmJlbGwgPQotCSAgICAmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikoY2luZm8tPmN0bF9hZGRyKSktPnBjaV9kb29yYmVsbDsKKwlwY2lfZG9vcmJlbGwgPSAmY2luZm8tPmN0bF9hZGRyLnA5MDYwLT5wY2lfZG9vcmJlbGw7CiAJd2hpbGUgKChyZWFkbChwY2lfZG9vcmJlbGwpICYgMHhmZikgIT0gMCkgewogCQlpZiAoaW5kZXgrKyA9PSAxMDAwKQogCQkJcmV0dXJuIChpbnQpKHJlYWRsKHBjaV9kb29yYmVsbCkgJiAweGZmKTsKQEAgLTE2MjQsMTAgKzE2MjcsOCBAQAogCXN0YXRpYyBzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOwogCXN0YXRpYyBzdHJ1Y3QgQ0hfQ1RSTCBfX2lvbWVtICpjaF9jdHJsOwogCXN0YXRpYyBzdHJ1Y3QgQlVGX0NUUkwgX19pb21lbSAqYnVmX2N0cmw7Ci0JX191MzIgY2hhbm5lbDsKKwlfX3UzMiBjaGFubmVsLCBwYXJhbSwgZndfdmVyOwogCV9fdTggY21kOwotCV9fdTMyIHBhcmFtOwotCV9fdTMyIGh3X3ZlciwgZndfdmVyOwogCWludCBzcGVjaWFsX2NvdW50OwogCWludCBkZWx0YV9jb3VudDsKIApAQCAtMTYzNSw4ICsxNjM2LDYgQEAKIAl6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKyAocmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKIAlib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOwogCWZ3X3ZlciA9IHJlYWRsKCZib2FyZF9jdHJsLT5md192ZXJzaW9uKTsKLQlod192ZXIgPSByZWFkbCgmKChzdHJ1Y3QgUlVOVElNRV85MDYwIF9faW9tZW0gKikoY2luZm8tPmN0bF9hZGRyKSktPgotCQkJbWFpbF9ib3hfMCk7CiAKIAl3aGlsZSAoY3l6X2ZldGNoX21zZyhjaW5mbywgJmNoYW5uZWwsICZjbWQsICZwYXJhbSkgPT0gMSkgewogCQlzcGVjaWFsX2NvdW50ID0gMDsKQEAgLTE3MzcsMTUgKzE3MzYsNyBAQAogewogCXN0cnVjdCBjeWNsYWRlc19jYXJkICpjaW5mbyA9IGRldl9pZDsKIAotCWlmICh1bmxpa2VseShjaW5mbyA9PSBOVUxMKSkgewotI2lmZGVmIENZX0RFQlVHX0lOVEVSUlVQVFMKLQkJcHJpbnRrKEtFUk5fREVCVUcgImN5el9pbnRlcnJ1cHQ6IHNwdXJpb3VzIGludGVycnVwdCAlZFxuIiwKLQkJCQkJCQkJCWlycSk7Ci0jZW5kaWYKLQkJcmV0dXJuIElSUV9OT05FOwkvKiBzcHVyaW91cyBpbnRlcnJ1cHQgKi8KLQl9Ci0KLQlpZiAodW5saWtlbHkoIUlTWkxPQURFRCgqY2luZm8pKSkgeworCWlmICh1bmxpa2VseSghY3l6X2lzX2xvYWRlZChjaW5mbykpKSB7CiAjaWZkZWYgQ1lfREVCVUdfSU5URVJSVVBUUwogCQlwcmludGsoS0VSTl9ERUJVRyAiY3l6X2ludGVycnVwdDogYm9hcmQgbm90IHlldCBsb2FkZWQgIgogCQkJCSIoSVJRJWQpLlxuIiwgaXJxKTsKQEAgLTE3ODUsNyArMTc3Niw2IEBACiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOwogCXN0cnVjdCBaRldfQ1RSTCBfX2lvbWVtICp6ZndfY3RybDsKLQlzdHJ1Y3QgQk9BUkRfQ1RSTCBfX2lvbWVtICpib2FyZF9jdHJsOwogCXN0cnVjdCBCVUZfQ1RSTCBfX2lvbWVtICpidWZfY3RybDsKIAl1bnNpZ25lZCBsb25nIGV4cGlyZXMgPSBqaWZmaWVzICsgSFo7CiAJdW5zaWduZWQgaW50IHBvcnQsIGNhcmQ7CkBAIC0xNzkzLDE5ICsxNzgzLDE3IEBACiAJZm9yIChjYXJkID0gMDsgY2FyZCA8IE5SX0NBUkRTOyBjYXJkKyspIHsKIAkJY2luZm8gPSAmY3lfY2FyZFtjYXJkXTsKIAotCQlpZiAoIUlTX0NZQ19aKCpjaW5mbykpCisJCWlmICghY3lfaXNfWihjaW5mbykpCiAJCQljb250aW51ZTsKLQkJaWYgKCFJU1pMT0FERUQoKmNpbmZvKSkKKwkJaWYgKCFjeXpfaXNfbG9hZGVkKGNpbmZvKSkKIAkJCWNvbnRpbnVlOwogCiAJCWZpcm1faWQgPSBjaW5mby0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKIAkJemZ3X2N0cmwgPSBjaW5mby0+YmFzZV9hZGRyICsKIAkJCQkocmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKLQkJYm9hcmRfY3RybCA9ICYoemZ3X2N0cmwtPmJvYXJkX2N0cmwpOwogCiAJLyogU2tpcCBmaXJzdCBwb2xsaW5nIGN5Y2xlIHRvIGF2b2lkIHJhY2luZyBjb25kaXRpb25zIHdpdGggdGhlIEZXICovCiAJCWlmICghY2luZm8tPmludHJfZW5hYmxlZCkgewotCQkJY2luZm8tPm5wb3J0cyA9IChpbnQpcmVhZGwoJmJvYXJkX2N0cmwtPm5fY2hhbm5lbCk7CiAJCQljaW5mby0+aW50cl9lbmFibGVkID0gMTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xODc0LDcgKzE4NjIsNyBAQAogCiAJc2V0X2xpbmVfY2hhcihpbmZvKTsKIAotCWlmICghSVNfQ1lDX1ooKmNhcmQpKSB7CisJaWYgKCFjeV9pc19aKGNhcmQpKSB7CiAJCWNoaXAgPSBjaGFubmVsID4+IDI7CiAJCWNoYW5uZWwgJj0gMHgwMzsKIAkJaW5kZXggPSBjYXJkLT5idXNfaW5kZXg7CkBAIC0xOTMxLDcgKzE5MTksNyBAQAogCQliYXNlX2FkZHIgPSBjYXJkLT5iYXNlX2FkZHI7CiAKIAkJZmlybV9pZCA9IGJhc2VfYWRkciArIElEX0FERFJFU1M7Ci0JCWlmICghSVNaTE9BREVEKCpjYXJkKSkKKwkJaWYgKCFjeXpfaXNfbG9hZGVkKGNhcmQpKQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJemZ3X2N0cmwgPSBjYXJkLT5iYXNlX2FkZHIgKwpAQCAtMjAyNiw3ICsyMDE0LDcgQEAKIAogCWNhcmQgPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2FyZC0+Zmlyc3RfbGluZTsKLQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCWlmICghY3lfaXNfWihjYXJkKSkgewogCQljaGlwID0gY2hhbm5lbCA+PiAyOwogCQljaGFubmVsICY9IDB4MDM7CiAJCWluZGV4ID0gY2FyZC0+YnVzX2luZGV4OwpAQCAtMjA3MCw3ICsyMDU4LDcgQEAKIAogCWNhcmQgPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2FyZC0+Zmlyc3RfbGluZTsKLQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCWlmICghY3lfaXNfWihjYXJkKSkgewogCQljaGlwID0gY2hhbm5lbCA+PiAyOwogCQljaGFubmVsICY9IDB4MDM7CiAJCWluZGV4ID0gY2FyZC0+YnVzX2luZGV4OwpAQCAtMjEyNiw3ICsyMTE0LDcgQEAKICNlbmRpZgogCiAJCWZpcm1faWQgPSBiYXNlX2FkZHIgKyBJRF9BRERSRVNTOwotCQlpZiAoIUlTWkxPQURFRCgqY2FyZCkpCisJCWlmICghY3l6X2lzX2xvYWRlZChjYXJkKSkKIAkJCXJldHVybjsKIAogCQl6ZndfY3RybCA9IGNhcmQtPmJhc2VfYWRkciArCkBAIC0yMjMzLDcgKzIyMjEsNyBAQAogI2VuZGlmCiAJaW5mby0+cG9ydC5ibG9ja2VkX29wZW4rKzsKIAotCWlmICghSVNfQ1lDX1ooKmNpbmZvKSkgeworCWlmICghY3lfaXNfWihjaW5mbykpIHsKIAkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKIAkJY2hhbm5lbCAmPSAweDAzOwogCQlpbmRleCA9IGNpbmZvLT5idXNfaW5kZXg7CkBAIC0yMjk2LDcgKzIyODQsNyBAQAogCiAJCWJhc2VfYWRkciA9IGNpbmZvLT5iYXNlX2FkZHI7CiAJCWZpcm1faWQgPSBiYXNlX2FkZHIgKyBJRF9BRERSRVNTOwotCQlpZiAoIUlTWkxPQURFRCgqY2luZm8pKSB7CisJCWlmICghY3l6X2lzX2xvYWRlZChjaW5mbykpIHsKIAkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCXJlbW92ZV93YWl0X3F1ZXVlKCZpbmZvLT5wb3J0Lm9wZW5fd2FpdCwgJndhaXQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMzk3LDE2ICsyMzg1LDE0IEBACiAJICAgdHJlYXQgaXQgYXMgYWJzZW50IGZyb20gdGhlIHN5c3RlbS4gIFRoaXMKIAkgICB3aWxsIG1ha2UgdGhlIHVzZXIgcGF5IGF0dGVudGlvbi4KIAkgKi8KLQlpZiAoSVNfQ1lDX1ooKmluZm8tPmNhcmQpKSB7CisJaWYgKGN5X2lzX1ooaW5mby0+Y2FyZCkpIHsKIAkJc3RydWN0IGN5Y2xhZGVzX2NhcmQgKmNpbmZvID0gaW5mby0+Y2FyZDsKIAkJc3RydWN0IEZJUk1fSUQgX19pb21lbSAqZmlybV9pZCA9IGNpbmZvLT5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOwogCi0JCWlmICghSVNaTE9BREVEKCpjaW5mbykpIHsKLQkJCWlmICgoKFpFX1YxID09IHJlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKQotCQkJCQkgKGNpbmZvLT5jdGxfYWRkcikpLT5tYWlsX2JveF8wKSkgJiYKLQkJCQkJWl9GUEdBX0NIRUNLKCpjaW5mbykpICYmCi0JCQkJCShaRklSTV9ITFQgPT0gcmVhZGwoCi0JCQkJCQkmZmlybV9pZC0+c2lnbmF0dXJlKSkpIHsKKwkJaWYgKCFjeXpfaXNfbG9hZGVkKGNpbmZvKSkgeworCQkJaWYgKGNpbmZvLT5od192ZXIgPT0gWkVfVjEgJiYgY3l6X2ZwZ2FfbG9hZGVkKGNpbmZvKSAmJgorCQkJCQlyZWFkbCgmZmlybV9pZC0+c2lnbmF0dXJlKSA9PQorCQkJCQlaRklSTV9ITFQpIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgImN5YzpDeWNsYWRlcy1aIEVycm9yOiB5b3UgIgogCQkJCQkibmVlZCBhbiBleHRlcm5hbCBwb3dlciBzdXBwbHkgZm9yICIKIAkJCQkJInRoaXMgbnVtYmVyIG9mIHBvcnRzLlxuRmlybXdhcmUgIgpAQCAtMjQyMywxOCArMjQwOSwxMyBAQAogCQkgICBpbnRlcnJ1cHRzIHNob3VsZCBiZSBlbmFibGVkIGFzIHNvb24gYXMgdGhlIGZpcnN0IG9wZW4KIAkJICAgaGFwcGVucyB0byBvbmUgb2YgaXRzIHBvcnRzLiAqLwogCQkJaWYgKCFjaW5mby0+aW50cl9lbmFibGVkKSB7Ci0JCQkJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnpmd19jdHJsOwotCQkJCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7Ci0KLQkJCQl6ZndfY3RybCA9IGNpbmZvLT5iYXNlX2FkZHIgKwotCQkJCQkocmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJgotCQkJCQkgMHhmZmZmZik7Ci0KLQkJCQlib2FyZF9jdHJsID0gJnpmd19jdHJsLT5ib2FyZF9jdHJsOworCQkJCXUxNiBpbnRyOwogCiAJCQkJLyogRW5hYmxlIGludGVycnVwdHMgb24gdGhlIFBMWCBjaGlwICovCi0JCQkJY3lfd3JpdGV3KGNpbmZvLT5jdGxfYWRkciArIDB4NjgsCi0JCQkJCXJlYWR3KGNpbmZvLT5jdGxfYWRkciArIDB4NjgpIHwgMHgwOTAwKTsKKwkJCQlpbnRyID0gcmVhZHcoJmNpbmZvLT5jdGxfYWRkci5wOTA2MC0+CisJCQkJCQlpbnRyX2N0cmxfc3RhdCkgfCAweDA5MDA7CisJCQkJY3lfd3JpdGV3KCZjaW5mby0+Y3RsX2FkZHIucDkwNjAtPgorCQkJCQkJaW50cl9jdHJsX3N0YXQsIGludHIpOwogCQkJCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBGVyAqLwogCQkJCXJldHZhbCA9IGN5el9pc3N1ZV9jbWQoY2luZm8sIDAsCiAJCQkJCQlDX0NNX0lSUV9FTkJMLCAwTCk7CkBAIC0yNDQyLDggKzI0MjMsNiBAQAogCQkJCQlwcmludGsoS0VSTl9FUlIgImN5YzpJUlEgZW5hYmxlIHJldHZhbCAiCiAJCQkJCQkid2FzICV4XG4iLCByZXR2YWwpOwogCQkJCX0KLQkJCQljaW5mby0+bnBvcnRzID0KLQkJCQkJKGludClyZWFkbCgmYm9hcmRfY3RybC0+bl9jaGFubmVsKTsKIAkJCQljaW5mby0+aW50cl9lbmFibGVkID0gMTsKIAkJCX0KIAkJfQpAQCAtMjU1Niw3ICsyNTM1LDcgQEAKICNlbmRpZgogCWNhcmQgPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY2FyZC0+Zmlyc3RfbGluZSk7Ci0JaWYgKCFJU19DWUNfWigqY2FyZCkpIHsKKwlpZiAoIWN5X2lzX1ooY2FyZCkpIHsKIAkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKIAkJY2hhbm5lbCAmPSAweDAzOwogCQlpbmRleCA9IGNhcmQtPmJ1c19pbmRleDsKQEAgLTI2MDEsNyArMjU4MCw3IEBACiAJaW5mby0+eG1pdF9jbnQgPSBpbmZvLT54bWl0X2hlYWQgPSBpbmZvLT54bWl0X3RhaWwgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwogCi0JaWYgKElTX0NZQ19aKCpjYXJkKSkgewkvKiBJZiBpdCBpcyBhIFogY2FyZCwgZmx1c2ggdGhlIG9uLWJvYXJkCisJaWYgKGN5X2lzX1ooY2FyZCkpIHsJLyogSWYgaXQgaXMgYSBaIGNhcmQsIGZsdXNoIHRoZSBvbi1ib2FyZAogCQkJCQkgICBidWZmZXJzIGFzIHdlbGwgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmNhcmRfbG9jaywgZmxhZ3MpOwogCQlyZXR2YWwgPSBjeXpfaXNzdWVfY21kKGNhcmQsIGNoYW5uZWwsIENfQ01fRkxVU0hfVFgsIDBMKTsKQEAgLTI2ODIsNyArMjY2MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7CiAKLQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCWlmICghY3lfaXNfWihjYXJkKSkgewogCQlpbnQgY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjYXJkLT5maXJzdF9saW5lOwogCQlpbnQgaW5kZXggPSBjYXJkLT5idXNfaW5kZXg7CiAJCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyID0gY2FyZC0+YmFzZV9hZGRyICsKQEAgLTI5MDIsNyArMjg4MSw3IEBACiAJY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjYXJkLT5maXJzdF9saW5lKTsKIAogI2lmZGVmIFpfRVhUX0NIQVJTX0lOX0JVRkZFUgotCWlmICghSVNfQ1lDX1ooY3lfY2FyZFtjYXJkXSkpIHsKKwlpZiAoIWN5X2lzX1ooY2FyZCkpIHsKICNlbmRpZgkJCQkvKiBaX0VYVF9DSEFSU19JTl9CVUZGRVIgKi8KICNpZmRlZiBDWV9ERUJVR19JTwogCQlwcmludGsoS0VSTl9ERUJVRyAiY3ljOmN5X2NoYXJzX2luX2J1ZmZlciB0dHlDJWQgJWRcbiIsCkBAIC0yOTg0LDcgKzI5NjMsNiBAQAogCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyOwogCWludCBjaGlwLCBjaGFubmVsLCBpbmRleDsKIAl1bnNpZ25lZCBjZmxhZywgaWZsYWc7Ci0JdW5zaWduZWQgc2hvcnQgY2hpcF9udW1iZXI7CiAJaW50IGJhdWQsIGJhdWRfcmF0ZSA9IDA7CiAJaW50IGk7CiAKQEAgLTMwMTMsOSArMjk5MSw4IEBACiAKIAljYXJkID0gaW5mby0+Y2FyZDsKIAljaGFubmVsID0gaW5mby0+bGluZSAtIGNhcmQtPmZpcnN0X2xpbmU7Ci0JY2hpcF9udW1iZXIgPSBjaGFubmVsIC8gNDsKIAotCWlmICghSVNfQ1lDX1ooKmNhcmQpKSB7CisJaWYgKCFjeV9pc19aKGNhcmQpKSB7CiAKIAkJaW5kZXggPSBjYXJkLT5idXNfaW5kZXg7CiAKQEAgLTMyMzMsMjEgKzMyMTAsMTcgQEAKIAl9IGVsc2UgewogCQlzdHJ1Y3QgRklSTV9JRCBfX2lvbWVtICpmaXJtX2lkOwogCQlzdHJ1Y3QgWkZXX0NUUkwgX19pb21lbSAqemZ3X2N0cmw7Ci0JCXN0cnVjdCBCT0FSRF9DVFJMIF9faW9tZW0gKmJvYXJkX2N0cmw7CiAJCXN0cnVjdCBDSF9DVFJMIF9faW9tZW0gKmNoX2N0cmw7Ci0JCXN0cnVjdCBCVUZfQ1RSTCBfX2lvbWVtICpidWZfY3RybDsKIAkJX191MzIgc3dfZmxvdzsKIAkJaW50IHJldHZhbDsKIAogCQlmaXJtX2lkID0gY2FyZC0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKLQkJaWYgKCFJU1pMT0FERUQoKmNhcmQpKQorCQlpZiAoIWN5el9pc19sb2FkZWQoY2FyZCkpCiAJCQlyZXR1cm47CiAKIAkJemZ3X2N0cmwgPSBjYXJkLT5iYXNlX2FkZHIgKwogCQkJKHJlYWRsKCZmaXJtX2lkLT56ZndjdHJsX2FkZHIpICYgMHhmZmZmZik7Ci0JCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CiAJCWNoX2N0cmwgPSAmKHpmd19jdHJsLT5jaF9jdHJsW2NoYW5uZWxdKTsKLQkJYnVmX2N0cmwgPSAmemZ3X2N0cmwtPmJ1Zl9jdHJsW2NoYW5uZWxdOwogCiAJCS8qIGJhdWQgcmF0ZSAqLwogCQliYXVkID0gdHR5X2dldF9iYXVkX3JhdGUoaW5mby0+cG9ydC50dHkpOwpAQCAtMzQ1Nyw3ICszNDMwLDcgQEAKIAogCWNhcmQgPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSAoaW5mby0+bGluZSkgLSAoY2FyZC0+Zmlyc3RfbGluZSk7Ci0JaWYgKCFJU19DWUNfWigqY2FyZCkpIHsKKwlpZiAoIWN5X2lzX1ooY2FyZCkpIHsKIAkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKIAkJY2hhbm5lbCAmPSAweDAzOwogCQlpbmRleCA9IGNhcmQtPmJ1c19pbmRleDsKQEAgLTM0OTcsNyArMzQ3MCw3IEBACiAKIAljYXJkID0gaW5mby0+Y2FyZDsKIAljaGFubmVsID0gaW5mby0+bGluZSAtIGNhcmQtPmZpcnN0X2xpbmU7Ci0JaWYgKCFJU19DWUNfWigqY2FyZCkpIHsKKwlpZiAoIWN5X2lzX1ooY2FyZCkpIHsKIAkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKIAkJY2hhbm5lbCAmPSAweDAzOwogCQlpbmRleCA9IGNhcmQtPmJ1c19pbmRleDsKQEAgLTM1MjMsNyArMzQ5Niw3IEBACiAJfSBlbHNlIHsKIAkJYmFzZV9hZGRyID0gY2FyZC0+YmFzZV9hZGRyOwogCQlmaXJtX2lkID0gY2FyZC0+YmFzZV9hZGRyICsgSURfQUREUkVTUzsKLQkJaWYgKElTWkxPQURFRCgqY2FyZCkpIHsKKwkJaWYgKGN5el9pc19sb2FkZWQoY2FyZCkpIHsKIAkJCXpmd19jdHJsID0gY2FyZC0+YmFzZV9hZGRyICsKIAkJCQkocmVhZGwoJmZpcm1faWQtPnpmd2N0cmxfYWRkcikgJiAweGZmZmZmKTsKIAkJCWJvYXJkX2N0cmwgPSAmemZ3X2N0cmwtPmJvYXJkX2N0cmw7CkBAIC0zNTY2LDcgKzM1MzksNyBAQAogCiAJY2FyZCA9IGluZm8tPmNhcmQ7CiAJY2hhbm5lbCA9IChpbmZvLT5saW5lKSAtIChjYXJkLT5maXJzdF9saW5lKTsKLQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCWlmICghY3lfaXNfWihjYXJkKSkgewogCQljaGlwID0gY2hhbm5lbCA+PiAyOwogCQljaGFubmVsICY9IDB4MDM7CiAJCWluZGV4ID0gY2FyZC0+YnVzX2luZGV4OwpAQCAtMzY0MSw3ICszNjE0LDcgQEAKIAkJYmFzZV9hZGRyID0gY2FyZC0+YmFzZV9hZGRyOwogCiAJCWZpcm1faWQgPSBjYXJkLT5iYXNlX2FkZHIgKyBJRF9BRERSRVNTOwotCQlpZiAoSVNaTE9BREVEKCpjYXJkKSkgeworCQlpZiAoY3l6X2lzX2xvYWRlZChjYXJkKSkgewogCQkJemZ3X2N0cmwgPSBjYXJkLT5iYXNlX2FkZHIgKwogCQkJCShyZWFkbCgmZmlybV9pZC0+emZ3Y3RybF9hZGRyKSAmIDB4ZmZmZmYpOwogCQkJYm9hcmRfY3RybCA9ICZ6ZndfY3RybC0+Ym9hcmRfY3RybDsKQEAgLTM3MTMsNyArMzY4Niw3IEBACiAJY2FyZCA9IGluZm8tPmNhcmQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+Y2FyZF9sb2NrLCBmbGFncyk7Ci0JaWYgKCFJU19DWUNfWigqY2FyZCkpIHsKKwlpZiAoIWN5X2lzX1ooY2FyZCkpIHsKIAkJLyogTGV0IHRoZSB0cmFuc21pdCBJU1IgdGFrZSBjYXJlIG9mIHRoaXMgKHNpbmNlIGl0CiAJCSAgIHJlcXVpcmVzIHN0dWZmaW5nIGNoYXJhY3RlcnMgaW50byB0aGUgb3V0cHV0IHN0cmVhbSkuCiAJCSAqLwpAQCAtMzc4Miw3ICszNzU1LDcgQEAKIAogCWNhcmQgPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2FyZC0+Zmlyc3RfbGluZTsKLQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCWlmICghY3lfaXNfWihjYXJkKSkgewogCQljaGlwID0gY2hhbm5lbCA+PiAyOwogCQljaGFubmVsICY9IDB4MDM7CiAJCWluZGV4ID0gY2FyZC0+YnVzX2luZGV4OwpAQCAtMzgxMCw3ICszNzgzLDcgQEAKIAogCWNhcmQgPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2FyZC0+Zmlyc3RfbGluZTsKLQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCWlmICghY3lfaXNfWihjYXJkKSkgewogCQljaGlwID0gY2hhbm5lbCA+PiAyOwogCQljaGFubmVsICY9IDB4MDM7CiAJCWluZGV4ID0gY2FyZC0+YnVzX2luZGV4OwpAQCAtMzg0NCw3ICszODE3LDcgQEAKIAogCWNhcmQgPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2FyZC0+Zmlyc3RfbGluZTsKLQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCWlmICghY3lfaXNfWihjYXJkKSkgewogCQljaGlwID0gY2hhbm5lbCA+PiAyOwogCQljaGFubmVsICY9IDB4MDM7CiAJCWluZGV4ID0gY2FyZC0+YnVzX2luZGV4OwpAQCAtMzg2Nyw3ICszODQwLDcgQEAKIAogCWNhcmQgPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2FyZC0+Zmlyc3RfbGluZTsKLQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCWlmICghY3lfaXNfWihjYXJkKSkgewogCQljaGlwID0gY2hhbm5lbCA+PiAyOwogCQljaGFubmVsICY9IDB4MDM7CiAJCWluZGV4ID0gY2FyZC0+YnVzX2luZGV4OwpAQCAtNDEyMSw3ICs0MDk0LDcgQEAKIAljYXJkID0gaW5mby0+Y2FyZDsKIAljaGFubmVsID0gaW5mby0+bGluZSAtIGNhcmQtPmZpcnN0X2xpbmU7CiAKLQlpZiAoSVNfQ1lDX1ooKmNhcmQpKSB7CisJaWYgKGN5X2lzX1ooY2FyZCkpIHsKIAkJaWYgKGNoID09IFNUT1BfQ0hBUih0dHkpKQogCQkJY3l6X2lzc3VlX2NtZChjYXJkLCBjaGFubmVsLCBDX0NNX1NFTkRYT0ZGLCAwTCk7CiAJCWVsc2UgaWYgKGNoID09IFNUQVJUX0NIQVIodHR5KSkKQEAgLTQxNTQsNyArNDEyNyw3IEBACiAJY2FyZCA9IGluZm8tPmNhcmQ7CiAKIAlpZiAoSV9JWE9GRih0dHkpKSB7Ci0JCWlmICghSVNfQ1lDX1ooKmNhcmQpKQorCQlpZiAoIWN5X2lzX1ooY2FyZCkpCiAJCQljeV9zZW5kX3hjaGFyKHR0eSwgU1RPUF9DSEFSKHR0eSkpOwogCQllbHNlCiAJCQlpbmZvLT50aHJvdHRsZSA9IDE7CkBAIC00MTYyLDcgKzQxMzUsNyBAQAogCiAJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKIAkJY2hhbm5lbCA9IGluZm8tPmxpbmUgLSBjYXJkLT5maXJzdF9saW5lOwotCQlpZiAoIUlTX0NZQ19aKCpjYXJkKSkgeworCQlpZiAoIWN5X2lzX1ooY2FyZCkpIHsKIAkJCWNoaXAgPSBjaGFubmVsID4+IDI7CiAJCQljaGFubmVsICY9IDB4MDM7CiAJCQlpbmRleCA9IGNhcmQtPmJ1c19pbmRleDsKQEAgLTQyMTksNyArNDE5Miw3IEBACiAJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKIAkJY2FyZCA9IGluZm8tPmNhcmQ7CiAJCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2FyZC0+Zmlyc3RfbGluZTsKLQkJaWYgKCFJU19DWUNfWigqY2FyZCkpIHsKKwkJaWYgKCFjeV9pc19aKGNhcmQpKSB7CiAJCQljaGlwID0gY2hhbm5lbCA+PiAyOwogCQkJY2hhbm5lbCAmPSAweDAzOwogCQkJaW5kZXggPSBjYXJkLT5idXNfaW5kZXg7CkBAIC00MjYzLDcgKzQyMzYsNyBAQAogCiAJY2luZm8gPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2luZm8tPmZpcnN0X2xpbmU7Ci0JaWYgKCFJU19DWUNfWigqY2luZm8pKSB7CisJaWYgKCFjeV9pc19aKGNpbmZvKSkgewogCQlpbmRleCA9IGNpbmZvLT5idXNfaW5kZXg7CiAJCWNoaXAgPSBjaGFubmVsID4+IDI7CiAJCWNoYW5uZWwgJj0gMHgwMzsKQEAgLTQyOTYsNyArNDI2OSw3IEBACiAJY2luZm8gPSBpbmZvLT5jYXJkOwogCWNoYW5uZWwgPSBpbmZvLT5saW5lIC0gY2luZm8tPmZpcnN0X2xpbmU7CiAJaW5kZXggPSBjaW5mby0+YnVzX2luZGV4OwotCWlmICghSVNfQ1lDX1ooKmNpbmZvKSkgeworCWlmICghY3lfaXNfWihjaW5mbykpIHsKIAkJY2hpcCA9IGNoYW5uZWwgPj4gMjsKIAkJY2hhbm5lbCAmPSAweDAzOwogCQliYXNlX2FkZHIgPSBjaW5mby0+YmFzZV9hZGRyICsgKGN5X2NoaXBfb2Zmc2V0W2NoaXBdIDw8IGluZGV4KTsKQEAgLTQzNDcsMzMgKzQzMjAsMjAgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGN5X2luaXRfY2FyZChzdHJ1Y3QgY3ljbGFkZXNfY2FyZCAqY2luZm8pCiB7CiAJc3RydWN0IGN5Y2xhZGVzX3BvcnQgKmluZm87Ci0JdTMyIHVuaW5pdGlhbGl6ZWRfdmFyKG1haWxib3gpOwotCXVuc2lnbmVkIGludCBucG9ydHMsIHBvcnQ7CisJdW5zaWduZWQgaW50IHBvcnQ7CiAJdW5zaWduZWQgc2hvcnQgY2hpcF9udW1iZXI7Ci0JaW50IHVuaW5pdGlhbGl6ZWRfdmFyKGluZGV4KTsKIAogCXNwaW5fbG9ja19pbml0KCZjaW5mby0+Y2FyZF9sb2NrKTsKKwljaW5mby0+aW50cl9lbmFibGVkID0gMDsKIAotCWlmIChJU19DWUNfWigqY2luZm8pKSB7CS8qIEN5Y2xhZGVzLVogKi8KLQkJbWFpbGJveCA9IHJlYWRsKCYoKHN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqKQotCQkJCSAgICAgY2luZm8tPmN0bF9hZGRyKS0+bWFpbF9ib3hfMCk7Ci0JCW5wb3J0cyA9IChtYWlsYm94ID09IFpFX1YxKSA/IFpFX1YxX05QT1JUUyA6IDg7Ci0JCWNpbmZvLT5pbnRyX2VuYWJsZWQgPSAwOwotCQljaW5mby0+bnBvcnRzID0gMDsJLyogV2lsbCBiZSBjb3JyZWN0bHkgc2V0IGxhdGVyLCBhZnRlcgotCQkJCQkgICBaIEZXIGlzIGxvYWRlZCAqLwotCX0gZWxzZSB7Ci0JCWluZGV4ID0gY2luZm8tPmJ1c19pbmRleDsKLQkJbnBvcnRzID0gY2luZm8tPm5wb3J0cyA9IEN5UE9SVFNfUEVSX0NISVAgKiBjaW5mby0+bnVtX2NoaXBzOwotCX0KLQotCWNpbmZvLT5wb3J0cyA9IGt6YWxsb2Moc2l6ZW9mKCpjaW5mby0+cG9ydHMpICogbnBvcnRzLCBHRlBfS0VSTkVMKTsKKwljaW5mby0+cG9ydHMgPSBrY2FsbG9jKGNpbmZvLT5ucG9ydHMsIHNpemVvZigqY2luZm8tPnBvcnRzKSwKKwkJCUdGUF9LRVJORUwpOwogCWlmIChjaW5mby0+cG9ydHMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkN5Y2xhZGVzOiBjYW5ub3QgYWxsb2NhdGUgcG9ydHNcbiIpOwotCQljaW5mby0+bnBvcnRzID0gMDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZm9yIChwb3J0ID0gY2luZm8tPmZpcnN0X2xpbmU7IHBvcnQgPCBjaW5mby0+Zmlyc3RfbGluZSArIG5wb3J0czsKKwlmb3IgKHBvcnQgPSBjaW5mby0+Zmlyc3RfbGluZTsgcG9ydCA8IGNpbmZvLT5maXJzdF9saW5lICsgY2luZm8tPm5wb3J0czsKIAkJCXBvcnQrKykgewogCQlpbmZvID0gJmNpbmZvLT5wb3J0c1twb3J0IC0gY2luZm8tPmZpcnN0X2xpbmVdOwogCQl0dHlfcG9ydF9pbml0KCZpbmZvLT5wb3J0KTsKQEAgLTQzODcsOSArNDM0Nyw5IEBACiAJCWluaXRfY29tcGxldGlvbigmaW5mby0+c2h1dGRvd25fd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmluZm8tPmRlbHRhX21zcl93YWl0KTsKIAotCQlpZiAoSVNfQ1lDX1ooKmNpbmZvKSkgeworCQlpZiAoY3lfaXNfWihjaW5mbykpIHsKIAkJCWluZm8tPnR5cGUgPSBQT1JUX1NUQVJURUNIOwotCQkJaWYgKG1haWxib3ggPT0gWk9fVjEpCisJCQlpZiAoY2luZm8tPmh3X3ZlciA9PSBaT19WMSkKIAkJCQlpbmZvLT54bWl0X2ZpZm9fc2l6ZSA9IENZWl9GSUZPX1NJWkU7CiAJCQllbHNlCiAJCQkJaW5mby0+eG1pdF9maWZvX3NpemUgPSA0ICogQ1laX0ZJRk9fU0laRTsKQEAgLTQzOTgsNiArNDM1OCw3IEBACiAJCQkJY3l6X3J4X3Jlc3RhcnQsICh1bnNpZ25lZCBsb25nKWluZm8pOwogI2VuZGlmCiAJCX0gZWxzZSB7CisJCQlpbnQgaW5kZXggPSBjaW5mby0+YnVzX2luZGV4OwogCQkJaW5mby0+dHlwZSA9IFBPUlRfQ0lSUlVTOwogCQkJaW5mby0+eG1pdF9maWZvX3NpemUgPSBDeU1BWF9DSEFSX0ZJRk87CiAJCQlpbmZvLT5jb3IxID0gQ3lQQVJJVFlfTk9ORSB8IEN5XzFfU1RPUCB8IEN5XzhfQklUUzsKQEAgLTQ0MzAsNyArNDM5MSw3IEBACiAJfQogCiAjaWZuZGVmIENPTkZJR19DWVpfSU5UUgotCWlmIChJU19DWUNfWigqY2luZm8pICYmICF0aW1lcl9wZW5kaW5nKCZjeXpfdGltZXJsaXN0KSkgeworCWlmIChjeV9pc19aKGNpbmZvKSAmJiAhdGltZXJfcGVuZGluZygmY3l6X3RpbWVybGlzdCkpIHsKIAkJbW9kX3RpbWVyKCZjeXpfdGltZXJsaXN0LCBqaWZmaWVzICsgMSk7CiAjaWZkZWYgQ1lfUENJX0RFQlVHCiAJCXByaW50ayhLRVJOX0RFQlVHICJDeWNsYWRlcy1aIHBvbGxpbmcgaW5pdGlhbGl6ZWRcbiIpOwpAQCAtNDYyMSwxMSArNDU4MiwxMiBAQAogCiAJCS8qIHNldCBjeV9jYXJkICovCiAJCWN5X2NhcmRbal0uYmFzZV9hZGRyID0gY3lfaXNhX2FkZHJlc3M7Ci0JCWN5X2NhcmRbal0uY3RsX2FkZHIgPSBOVUxMOworCQljeV9jYXJkW2pdLmN0bF9hZGRyLnA5MDUwID0gTlVMTDsKIAkJY3lfY2FyZFtqXS5pcnEgPSAoaW50KWN5X2lzYV9pcnE7CiAJCWN5X2NhcmRbal0uYnVzX2luZGV4ID0gMDsKIAkJY3lfY2FyZFtqXS5maXJzdF9saW5lID0gY3lfbmV4dF9jaGFubmVsOwotCQljeV9jYXJkW2pdLm51bV9jaGlwcyA9IGN5X2lzYV9uY2hhbiAvIDQ7CisJCWN5X2NhcmRbal0ubnVtX2NoaXBzID0gY3lfaXNhX25jaGFuIC8gQ3lQT1JUU19QRVJfQ0hJUDsKKwkJY3lfY2FyZFtqXS5ucG9ydHMgPSBjeV9pc2FfbmNoYW47CiAJCWlmIChjeV9pbml0X2NhcmQoJmN5X2NhcmRbal0pKSB7CiAJCQljeV9jYXJkW2pdLmJhc2VfYWRkciA9IE5VTEw7CiAJCQlmcmVlX2lycShjeV9pc2FfaXJxLCAmY3lfY2FyZFtqXSk7CkBAIC00NzgxLDcgKzQ3NDMsNyBAQAogCXN0cnVjdCBDVVNUT01fUkVHIF9faW9tZW0gKmN1c3QgPSBiYXNlX2FkZHI7CiAJc3RydWN0IFpGV19DVFJMIF9faW9tZW0gKnB0X3pmd2N0cmw7CiAJdm9pZCBfX2lvbWVtICp0bXA7Ci0JdTMyIG1haWxib3gsIHN0YXR1czsKKwl1MzIgbWFpbGJveCwgc3RhdHVzLCBuY2hhbjsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0dmFsOwogCkBAIC00NzkzLDcgKzQ3NTUsNyBAQAogCiAJLyogQ2hlY2sgd2hldGhlciB0aGUgZmlybXdhcmUgaXMgYWxyZWFkeSBsb2FkZWQgYW5kIHJ1bm5pbmcuIElmCiAJICAgcG9zaXRpdmUsIHNraXAgdGhpcyBib2FyZCAqLwotCWlmIChaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSAmJiByZWFkbCgmZmlkLT5zaWduYXR1cmUpID09IFpGSVJNX0lEKSB7CisJaWYgKF9fY3l6X2ZwZ2FfbG9hZGVkKGN0bF9hZGRyKSAmJiByZWFkbCgmZmlkLT5zaWduYXR1cmUpID09IFpGSVJNX0lEKSB7CiAJCXUzMiBjbnR2YWwgPSByZWFkbChiYXNlX2FkZHIgKyAweDE5MCk7CiAKIAkJdWRlbGF5KDEwMCk7CkBAIC00ODEyLDcgKzQ3NzQsNyBAQAogCiAJbWFpbGJveCA9IHJlYWRsKCZjdGxfYWRkci0+bWFpbF9ib3hfMCk7CiAKLQlpZiAobWFpbGJveCA9PSAwIHx8IFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpKSB7CisJaWYgKG1haWxib3ggPT0gMCB8fCBfX2N5el9mcGdhX2xvYWRlZChjdGxfYWRkcikpIHsKIAkJLyogc3RvcHMgQ1BVIGFuZCBzZXQgd2luZG93IHRvIGJlZ2lubmluZyBvZiBSQU0gKi8KIAkJY3lfd3JpdGVsKCZjdGxfYWRkci0+bG9jX2FkZHJfYmFzZSwgV0lOX0NSRUcpOwogCQljeV93cml0ZWwoJmN1c3QtPmNwdV9zdG9wLCAwKTsKQEAgLTQ4MjgsNyArNDc5MCw3IEBACiAJCQkJYmFzZV9hZGRyKTsKIAkJaWYgKHJldHZhbCkKIAkJCWdvdG8gZXJyX3JlbDsKLQkJaWYgKCFaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSkgeworCQlpZiAoIV9fY3l6X2ZwZ2FfbG9hZGVkKGN0bF9hZGRyKSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZncgdXBsb2FkIHN1Y2Nlc3NmdWwsIGJ1dCBmdyBpcyAiCiAJCQkJCSJub3QgbG9hZGVkXG4iKTsKIAkJCWdvdG8gZXJyX3JlbDsKQEAgLTQ4ODcsNyArNDg0OSw3IEBACiAJCQkJInN5c3RlbSBiZWZvcmUgbG9hZGluZyB0aGUgbmV3IEZXIHRvIHRoZSAiCiAJCQkJIkN5Y2xhZGVzLVouXG4iKTsKIAotCQkJaWYgKFpfRlBHQV9MT0FERUQoY3RsX2FkZHIpKQorCQkJaWYgKF9fY3l6X2ZwZ2FfbG9hZGVkKGN0bF9hZGRyKSkKIAkJCQlwbHhfaW5pdChwZGV2LCBpcnEsIGN0bF9hZGRyKTsKIAogCQkJcmV0dmFsID0gLUVJTzsKQEAgLTQ5MDIsMTYgKzQ4NjQsMTYgQEAKIAkJCWJhc2VfYWRkciArIElEX0FERFJFU1MsIHJlYWRsKCZmaWQtPnpmd2N0cmxfYWRkciksCiAJCQliYXNlX2FkZHIgKyByZWFkbCgmZmlkLT56ZndjdHJsX2FkZHIpKTsKIAorCW5jaGFuID0gcmVhZGwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwubl9jaGFubmVsKTsKIAlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQ3ljbGFkZXMtWiBGVyBsb2FkZWQ6IHZlcnNpb24gPSAleCwgcG9ydHMgPSAldVxuIiwKLQkJcmVhZGwoJnB0X3pmd2N0cmwtPmJvYXJkX2N0cmwuZndfdmVyc2lvbiksCi0JCXJlYWRsKCZwdF96ZndjdHJsLT5ib2FyZF9jdHJsLm5fY2hhbm5lbCkpOworCQlyZWFkbCgmcHRfemZ3Y3RybC0+Ym9hcmRfY3RybC5md192ZXJzaW9uKSwgbmNoYW4pOwogCi0JaWYgKHJlYWRsKCZwdF96ZndjdHJsLT5ib2FyZF9jdHJsLm5fY2hhbm5lbCkgPT0gMCkgeworCWlmIChuY2hhbiA9PSAwKSB7CiAJCWRldl93YXJuKCZwZGV2LT5kZXYsICJubyBDeWNsYWRlcy1aIHBvcnRzIHdlcmUgZm91bmQuIFBsZWFzZSAiCiAJCQkiY2hlY2sgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgWiBob3N0IGNhcmQgYW5kIHRoZSAiCiAJCQkic2VyaWFsIGV4cGFuZGVycy5cbiIpOwogCi0JCWlmIChaX0ZQR0FfTE9BREVEKGN0bF9hZGRyKSkKKwkJaWYgKF9fY3l6X2ZwZ2FfbG9hZGVkKGN0bF9hZGRyKSkKIAkJCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOwogCiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJOdWxsIG51bWJlciBvZiBwb3J0cyBkZXRlY3RlZC4gQm9hcmQgIgpAQCAtNDkzMiw5ICs0ODk0LDcgQEAKIAljeV93cml0ZWwoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCwgcmVhZGwoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCkgfAogCQkJMHgwMDAzMDgwMFVMKTsKIAotCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIG5jaGFuOwogZXJyX3JlbDoKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIGVycjoKQEAgLTQ5NDYsNyArNDkwNiw3IEBACiB7CiAJdm9pZCBfX2lvbWVtICphZGRyMCA9IE5VTEwsICphZGRyMiA9IE5VTEw7CiAJY2hhciAqY2FyZF9uYW1lID0gTlVMTDsKLQl1MzIgbWFpbGJveDsKKwl1MzIgdW5pbml0aWFsaXplZF92YXIobWFpbGJveCk7CiAJdW5zaWduZWQgaW50IGRldmljZV9pZCwgbmNoYW4gPSAwLCBjYXJkX25vLCBpOwogCXVuc2lnbmVkIGNoYXIgcGx4X3ZlcjsKIAlpbnQgcmV0dmFsLCBpcnE7CkBAIC01MDIzLDExICs0OTgzLDEyIEBACiAJCX0KIAogCQkvKiBEaXNhYmxlIGludGVycnVwdHMgb24gdGhlIFBMWCBiZWZvcmUgcmVzZXR0aW5nIGl0ICovCi0JCWN5X3dyaXRldyhhZGRyMCArIDB4NjgsIHJlYWR3KGFkZHIwICsgMHg2OCkgJiB+MHgwOTAwKTsKKwkJY3lfd3JpdGV3KCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQsCisJCQkJcmVhZHcoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCkgJiB+MHgwOTAwKTsKIAogCQlwbHhfaW5pdChwZGV2LCBpcnEsIGFkZHIwKTsKIAotCQltYWlsYm94ID0gKHUzMilyZWFkbCgmY3RsX2FkZHItPm1haWxfYm94XzApOworCQltYWlsYm94ID0gcmVhZGwoJmN0bF9hZGRyLT5tYWlsX2JveF8wKTsKIAogCQlhZGRyMiA9IGlvcmVtYXBfbm9jYWNoZShwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksCiAJCQkJbWFpbGJveCA9PSBaRV9WMSA/IEN5UENJX1plX3dpbiA6IEN5UENJX1p3aW4pOwpAQCAtNTAzOCwxMiArNDk5OSw4IEBACiAKIAkJaWYgKG1haWxib3ggPT0gWkVfVjEpIHsKIAkJCWNhcmRfbmFtZSA9ICJDeWNsYWRlcy1aZSI7Ci0KLQkJCXJlYWRsKCZjdGxfYWRkci0+bWFpbF9ib3hfMCk7Ci0JCQluY2hhbiA9IFpFX1YxX05QT1JUUzsKIAkJfSBlbHNlIHsKIAkJCWNhcmRfbmFtZSA9ICJDeWNsYWRlcy04Wm8iOwotCiAjaWZkZWYgQ1lfUENJX0RFQlVHCiAJCQlpZiAobWFpbGJveCA9PSBaT19WMSkgewogCQkJCWN5X3dyaXRlbCgmY3RsX2FkZHItPmxvY19hZGRyX2Jhc2UsIFdJTl9DUkVHKTsKQEAgLTUwNjUsMTUgKzUwMjIsMTIgQEAKIAkJCSAqLwogCQkJaWYgKChtYWlsYm94ID09IFpPX1YxKSB8fCAobWFpbGJveCA9PSBaT19WMikpCiAJCQkJY3lfd3JpdGVsKGFkZHIyICsgSURfQUREUkVTUywgMEwpOwotCi0JCQlyZXR2YWwgPSBjeXpfbG9hZF9mdyhwZGV2LCBhZGRyMiwgYWRkcjAsIGlycSk7Ci0JCQlpZiAocmV0dmFsKQotCQkJCWdvdG8gZXJyX3VubWFwOwotCQkJLyogVGhpcyBtdXN0IGJlIGEgQ3ljbGFkZXMtOFpvL1BDSS4gIFRoZSBleHRlbmRhYmxlCi0JCQkgICB2ZXJzaW9uIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBkZXZpY2VfaWQgYW5kIHdpbGwKLQkJCSAgIGJlIGFsbG9jYXRlZCBpdHMgbWF4aW11bSBudW1iZXIgb2YgcG9ydHMuICovCi0JCQluY2hhbiA9IDg7CiAJCX0KKworCQlyZXR2YWwgPSBjeXpfbG9hZF9mdyhwZGV2LCBhZGRyMiwgYWRkcjAsIGlycSk7CisJCWlmIChyZXR2YWwgPD0gMCkKKwkJCWdvdG8gZXJyX3VubWFwOworCQluY2hhbiA9IHJldHZhbDsKIAl9CiAKIAlpZiAoKGN5X25leHRfY2hhbm5lbCArIG5jaGFuKSA+IE5SX1BPUlRTKSB7CkBAIC01MTAzLDggKzUwNTcsMTAgQEAKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBJUlFcbiIpOwogCQkJZ290byBlcnJfdW5tYXA7CiAJCX0KLQkJY3lfY2FyZFtjYXJkX25vXS5udW1fY2hpcHMgPSBuY2hhbiAvIDQ7CisJCWN5X2NhcmRbY2FyZF9ub10ubnVtX2NoaXBzID0gbmNoYW4gLyBDeVBPUlRTX1BFUl9DSElQOwogCX0gZWxzZSB7CisJCWN5X2NhcmRbY2FyZF9ub10uaHdfdmVyID0gbWFpbGJveDsKKwkJY3lfY2FyZFtjYXJkX25vXS5udW1fY2hpcHMgPSAodW5zaWduZWQgaW50KS0xOwogI2lmZGVmIENPTkZJR19DWVpfSU5UUgogCQkvKiBhbGxvY2F0ZSBJUlEgb25seSBpZiBib2FyZCBoYXMgYW4gSVJRICovCiAJCWlmIChpcnEgIT0gMCAmJiBpcnEgIT0gMjU1KSB7CkBAIC01MTE3LDE1ICs1MDczLDE1IEBACiAJCQl9CiAJCX0KICNlbmRpZgkJCQkvKiBDT05GSUdfQ1laX0lOVFIgKi8KLQkJY3lfY2FyZFtjYXJkX25vXS5udW1fY2hpcHMgPSAodW5zaWduZWQgaW50KS0xOwogCX0KIAogCS8qIHNldCBjeV9jYXJkICovCiAJY3lfY2FyZFtjYXJkX25vXS5iYXNlX2FkZHIgPSBhZGRyMjsKLQljeV9jYXJkW2NhcmRfbm9dLmN0bF9hZGRyID0gYWRkcjA7CisJY3lfY2FyZFtjYXJkX25vXS5jdGxfYWRkci5wOTA1MCA9IGFkZHIwOwogCWN5X2NhcmRbY2FyZF9ub10uaXJxID0gaXJxOwogCWN5X2NhcmRbY2FyZF9ub10uYnVzX2luZGV4ID0gMTsKIAljeV9jYXJkW2NhcmRfbm9dLmZpcnN0X2xpbmUgPSBjeV9uZXh0X2NoYW5uZWw7CisJY3lfY2FyZFtjYXJkX25vXS5ucG9ydHMgPSBuY2hhbjsKIAlyZXR2YWwgPSBjeV9pbml0X2NhcmQoJmN5X2NhcmRbY2FyZF9ub10pOwogCWlmIChyZXR2YWwpCiAJCWdvdG8gZXJyX251bGw7CkBAIC01MTM4LDE3ICs1MDk0LDIwIEBACiAJCXBseF92ZXIgPSByZWFkYihhZGRyMiArIEN5UExYX1ZFUikgJiAweDBmOwogCQlzd2l0Y2ggKHBseF92ZXIpIHsKIAkJY2FzZSBQTFhfOTA1MDoKLQogCQkJY3lfd3JpdGViKGFkZHIwICsgMHg0YywgMHg0Myk7CiAJCQlicmVhazsKIAogCQljYXNlIFBMWF85MDYwOgogCQljYXNlIFBMWF85MDgwOgogCQlkZWZhdWx0OgkvKiBPbGQgYm9hcmRzLCB1c2UgUExYXzkwNjAgKi8KLQkJCXBseF9pbml0KHBkZXYsIGlycSwgYWRkcjApOwotCQkJY3lfd3JpdGV3KGFkZHIwICsgMHg2OCwgcmVhZHcoYWRkcjAgKyAweDY4KSB8IDB4MDkwMCk7CisJCXsKKwkJCXN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqY3RsX2FkZHIgPSBhZGRyMDsKKwkJCXBseF9pbml0KHBkZXYsIGlycSwgY3RsX2FkZHIpOworCQkJY3lfd3JpdGV3KCZjdGxfYWRkci0+aW50cl9jdHJsX3N0YXQsCisJCQkJcmVhZHcoJmN0bF9hZGRyLT5pbnRyX2N0cmxfc3RhdCkgfCAweDA5MDApOwogCQkJYnJlYWs7CiAJCX0KKwkJfQogCX0KIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICIlcy9QQ0kgIyVkIGZvdW5kOiAlZCBjaGFubmVscyBzdGFydGluZyBmcm9tICIKQEAgLTUxNzksMjIgKzUxMzgsMjMgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCS8qIG5vbi1aIHdpdGggb2xkIFBMWCAqLwotCWlmICghSVNfQ1lDX1ooKmNpbmZvKSAmJiAocmVhZGIoY2luZm8tPmJhc2VfYWRkciArIEN5UExYX1ZFUikgJiAweDBmKSA9PQorCWlmICghY3lfaXNfWihjaW5mbykgJiYgKHJlYWRiKGNpbmZvLT5iYXNlX2FkZHIgKyBDeVBMWF9WRVIpICYgMHgwZikgPT0KIAkJCVBMWF85MDUwKQotCQljeV93cml0ZWIoY2luZm8tPmN0bF9hZGRyICsgMHg0YywgMCk7CisJCWN5X3dyaXRlYihjaW5mby0+Y3RsX2FkZHIucDkwNTAgKyAweDRjLCAwKTsKIAllbHNlCiAjaWZuZGVmIENPTkZJR19DWVpfSU5UUgotCQlpZiAoIUlTX0NZQ19aKCpjaW5mbykpCisJCWlmICghY3lfaXNfWihjaW5mbykpCiAjZW5kaWYKLQkJY3lfd3JpdGV3KGNpbmZvLT5jdGxfYWRkciArIDB4NjgsCi0JCQkJcmVhZHcoY2luZm8tPmN0bF9hZGRyICsgMHg2OCkgJiB+MHgwOTAwKTsKKwkJY3lfd3JpdGV3KCZjaW5mby0+Y3RsX2FkZHIucDkwNjAtPmludHJfY3RybF9zdGF0LAorCQkJcmVhZHcoJmNpbmZvLT5jdGxfYWRkci5wOTA2MC0+aW50cl9jdHJsX3N0YXQpICYKKwkJCX4weDA5MDApOwogCiAJaW91bm1hcChjaW5mby0+YmFzZV9hZGRyKTsKLQlpZiAoY2luZm8tPmN0bF9hZGRyKQotCQlpb3VubWFwKGNpbmZvLT5jdGxfYWRkcik7CisJaWYgKGNpbmZvLT5jdGxfYWRkci5wOTA1MCkKKwkJaW91bm1hcChjaW5mby0+Y3RsX2FkZHIucDkwNTApOwogCWlmIChjaW5mby0+aXJxCiAjaWZuZGVmIENPTkZJR19DWVpfSU5UUgotCQkmJiAhSVNfQ1lDX1ooKmNpbmZvKQorCQkmJiAhY3lfaXNfWihjaW5mbykKICNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KIAkJKQogCQlmcmVlX2lycShjaW5mby0+aXJxLCBjaW5mbyk7CkBAIC01MjQwLDcgKzUyMDAsNyBAQAogCQkJCQkoY3VyX2ppZnMgLSBpbmZvLT5pZGxlX3N0YXRzLnJlY3ZfaWRsZSkvCiAJCQkJCUhaLCBpbmZvLT5pZGxlX3N0YXRzLm92ZXJydW5zLAogCQkJCQkvKiBGSVhNRTogZG91YmxlIGNoZWNrIGxvY2tpbmcgKi8KLQkJCQkJKGxvbmcpaW5mby0+cG9ydC50dHktPmxkaXNjLm9wcy0+bnVtKTsKKwkJCQkJKGxvbmcpaW5mby0+cG9ydC50dHktPmxkaXNjLT5vcHMtPm51bSk7CiAJCQllbHNlCiAJCQkJc2VxX3ByaW50ZihtLCAiJTNkICU4bHUgJTEwbHUgJThsdSAiCiAJCQkJCSIlMTBsdSAlOGx1ICU5bHUgJTZsZFxuIiwKQEAgLTUzODYsMTEgKzUzNDYsMTEgQEAKIAkJCS8qIGNsZWFyIGludGVycnVwdCAqLwogCQkJY3lfd3JpdGViKGNhcmQtPmJhc2VfYWRkciArIEN5X0NsckludHIsIDApOwogCQkJaW91bm1hcChjYXJkLT5iYXNlX2FkZHIpOwotCQkJaWYgKGNhcmQtPmN0bF9hZGRyKQotCQkJCWlvdW5tYXAoY2FyZC0+Y3RsX2FkZHIpOworCQkJaWYgKGNhcmQtPmN0bF9hZGRyLnA5MDUwKQorCQkJCWlvdW5tYXAoY2FyZC0+Y3RsX2FkZHIucDkwNTApOwogCQkJaWYgKGNhcmQtPmlycQogI2lmbmRlZiBDT05GSUdfQ1laX0lOVFIKLQkJCQkmJiAhSVNfQ1lDX1ooKmNhcmQpCisJCQkJJiYgIWN5X2lzX1ooY2FyZCkKICNlbmRpZiAvKiBDT05GSUdfQ1laX0lOVFIgKi8KIAkJCQkpCiAJCQkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lcGNhLmMgYi9kcml2ZXJzL2NoYXIvZXBjYS5jCmluZGV4IGFmN2MxM2MuLmFiZWYxZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9lcGNhLmMKKysrIGIvZHJpdmVycy9jaGFyL2VwY2EuYwpAQCAtNzQ1LDcgKzc0NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGVwY2FfcmFpc2VfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBlcGNhX2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBpbnQgb25vZmYpCiB7CiB9CiAKQEAgLTkyNSw3ICs5MjUsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgZXBjYV9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQgPSBlcGNhX2NhcnJpZXJfcmFpc2VkLAotCS5yYWlzZV9kdHJfcnRzID0gZXBjYV9yYWlzZV9kdHJfcnRzLAorCS5kdHJfcnRzID0gZXBjYV9kdHJfcnRzLAogfTsKIAogc3RhdGljIGludCBpbmZvX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCkBAIC0xNTE4LDcgKzE1MTgsNyBAQAogCQlpZiAoZXZlbnQgJiBNT0RFTUNIR19JTkQpIHsKIAkJCS8qIEEgbW9kZW0gc2lnbmFsIGNoYW5nZSBoYXMgYmVlbiBpbmRpY2F0ZWQgKi8KIAkJCWNoLT5pbW9kZW0gPSBtc3RhdDsKLQkJCWlmICh0ZXN0X2JpdChBU1lOQ19DSEVDS19DRCwgJmNoLT5wb3J0LmZsYWdzKSkgeworCQkJaWYgKHRlc3RfYml0KEFTWU5DQl9DSEVDS19DRCwgJmNoLT5wb3J0LmZsYWdzKSkgewogCQkJCS8qIFdlIGFyZSBub3cgcmVjZWl2aW5nIGRjZCAqLwogCQkJCWlmIChtc3RhdCAmIGNoLT5kY2QpCiAJCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPnBvcnQub3Blbl93YWl0KTsKQEAgLTE3NjUsOSArMTc2NSw5IEBACiAJCSAqIHRoYXQgdGhlIGRyaXZlciB3aWxsIHdhaXQgb24gY2FycmllciBkZXRlY3QuCiAJCSAqLwogCQlpZiAodHMtPmNfY2ZsYWcgJiBDTE9DQUwpCi0JCQljbGVhcl9iaXQoQVNZTkNfQ0hFQ0tfQ0QsICZjaC0+cG9ydC5mbGFncyk7CisJCQljbGVhcl9iaXQoQVNZTkNCX0NIRUNLX0NELCAmY2gtPnBvcnQuZmxhZ3MpOwogCQllbHNlCi0JCQlzZXRfYml0KEFTWU5DX0NIRUNLX0NELCAmY2gtPnBvcnQuZmxhZ3MpOworCQkJc2V0X2JpdChBU1lOQ0JfQ0hFQ0tfQ0QsICZjaC0+cG9ydC5mbGFncyk7CiAJCW12YWwgPSBjaC0+bV9kdHIgfCBjaC0+bV9ydHM7CiAJfSAvKiBFbmQgQ0JBVUQgbm90IGRldGVjdGVkICovCiAJaWZsYWcgPSB0ZXJtaW9zMmRpZ2lfaShjaCwgdHMtPmNfaWZsYWcpOwpAQCAtMjExNCw4ICsyMTE0LDggQEAKIAkJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGxkaXNjIGxvY2sgYWxyZWFkeSBoZWxkIGluIGlvY3RsICovCi0JCQlpZiAodHR5LT5sZGlzYy5vcHMtPmZsdXNoX2J1ZmZlcikKLQkJCQl0dHktPmxkaXNjLm9wcy0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCQlpZiAodHR5LT5sZGlzYy0+b3BzLT5mbHVzaF9idWZmZXIpCisJCQkJdHR5LT5sZGlzYy0+b3BzLT5mbHVzaF9idWZmZXIodHR5KTsKIAkJfQogCQl1bmxvY2tfa2VybmVsKCk7CiAJCS8qIEZhbGwgVGhydSAqLwpAQCAtMjI0NCw3ICsyMjQ0LDggQEAKIAkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRVBDQV9FVkVOVF9IQU5HVVAsICZjaC0+ZXZlbnQpKSB7CiAJCQkJdHR5X2hhbmd1cCh0dHkpOwogCQkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2gtPnBvcnQub3Blbl93YWl0KTsKLQkJCQljbGVhcl9iaXQoQVNZTkNfTk9STUFMX0FDVElWRSwgJmNoLT5wb3J0LmZsYWdzKTsKKwkJCQljbGVhcl9iaXQoQVNZTkNCX05PUk1BTF9BQ1RJVkUsCisJCQkJCQkmY2gtPnBvcnQuZmxhZ3MpOwogCQkJfQogCQl9CiAJCXR0eV9rcmVmX3B1dCh0dHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2hwZXQuYyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKaW5kZXggMzQwYmE0Zi4uNGE5ZjM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2hwZXQuYworKysgYi9kcml2ZXJzL2NoYXIvaHBldC5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJZ3NpID0gYWNwaV9yZWdpc3Rlcl9nc2koaXJxLCBBQ1BJX0xFVkVMX1NFTlNJVElWRSwKKwkJZ3NpID0gYWNwaV9yZWdpc3Rlcl9nc2koTlVMTCwgaXJxLCBBQ1BJX0xFVkVMX1NFTlNJVElWRSwKIAkJCQkJQUNQSV9BQ1RJVkVfTE9XKTsKIAkJaWYgKGdzaSA+IDApCiAJCQlicmVhazsKQEAgLTkzOSw3ICs5MzksNyBAQAogCQlpcnFwID0gJnJlcy0+ZGF0YS5leHRlbmRlZF9pcnE7CiAKIAkJZm9yIChpID0gMDsgaSA8IGlycXAtPmludGVycnVwdF9jb3VudDsgaSsrKSB7Ci0JCQlpcnEgPSBhY3BpX3JlZ2lzdGVyX2dzaShpcnFwLT5pbnRlcnJ1cHRzW2ldLAorCQkJaXJxID0gYWNwaV9yZWdpc3Rlcl9nc2koTlVMTCwgaXJxcC0+aW50ZXJydXB0c1tpXSwKIAkJCQkgICAgICBpcnFwLT50cmlnZ2VyaW5nLCBpcnFwLT5wb2xhcml0eSk7CiAJCQlpZiAoaXJxIDwgMCkKIAkJCQlyZXR1cm4gQUVfRVJST1I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2kybGliLmMKaW5kZXggMDA2MWUxOC4uMGQxMGI4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwMi9pMmxpYi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcDIvaTJsaWIuYwpAQCAtODY4LDExICs4NjgsMTEgQEAKIAkJYW1vdW50VG9Nb3ZlID0gY291bnQ7CiAJfQogCS8vIE1vdmUgdGhlIGZpcnN0IGJsb2NrCi0JcENoLT5wVFRZLT5sZGlzYy5vcHMtPnJlY2VpdmVfYnVmKCBwQ2gtPnBUVFksCisJcENoLT5wVFRZLT5sZGlzYy0+b3BzLT5yZWNlaXZlX2J1ZiggcENoLT5wVFRZLAogCQkgJihwQ2gtPklidWZbc3RyaXBJbmRleF0pLCBOVUxMLCBhbW91bnRUb01vdmUgKTsKIAkvLyBJZiB3ZSBuZWVkZWQgdG8gd3JhcCwgZG8gdGhlIHNlY29uZCBkYXRhIG1vdmUKIAlpZiAoY291bnQgPiBhbW91bnRUb01vdmUpIHsKLQkJcENoLT5wVFRZLT5sZGlzYy5vcHMtPnJlY2VpdmVfYnVmKCBwQ2gtPnBUVFksCisJCXBDaC0+cFRUWS0+bGRpc2MtPm9wcy0+cmVjZWl2ZV9idWYoIHBDaC0+cFRUWSwKIAkJIHBDaC0+SWJ1ZiwgTlVMTCwgY291bnQgLSBhbW91bnRUb01vdmUgKTsKIAl9CiAJLy8gQnVtcCBhbmQgd3JhcCB0aGUgc3RyaXBJbmRleCBhbGwgYXQgb25jZSBieSB0aGUgYW1vdW50IG9mIGRhdGEgcmVhZC4gVGhpcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pcDJtYWluLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwppbmRleCBhZmQ5MjQ3Li41MTcyNzFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYworKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwpAQCAtMTMxNSw4ICsxMzE1LDggQEAKIAlpZiAodHR5LT5wZ3JwKQogCQlraWxsX3BncnAodHR5LT5wZ3JwLCBzaWcsIDEpOwogCWlmIChmbHVzaCB8fCAhTF9OT0ZMU0godHR5KSkgewotCQlpZiAoIHR0eS0+bGRpc2Mub3BzLT5mbHVzaF9idWZmZXIgKSAgCi0JCQl0dHktPmxkaXNjLm9wcy0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCWlmICggdHR5LT5sZGlzYy0+b3BzLT5mbHVzaF9idWZmZXIgKSAgCisJCQl0dHktPmxkaXNjLT5vcHMtPmZsdXNoX2J1ZmZlcih0dHkpOwogCQlpMklucHV0Rmx1c2goIHR0eS0+ZHJpdmVyX2RhdGEgKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKaW5kZXggYTU5ZWFjNS4uNGQ3NDVhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwpAQCAtMzI5LDcgKzMyOSw3IEBACiAKIC8qIGNhcmQtPmxvY2sgTVVTVCBOT1QgYmUgaGVsZCAqLwogCi1zdGF0aWMgdm9pZCBpc2ljb21fcmFpc2VfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBpc2ljb21fZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbikKIHsKIAlzdHJ1Y3QgaXNpX3BvcnQgKmlwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBpc2lfcG9ydCwgcG9ydCk7CiAJc3RydWN0IGlzaV9ib2FyZCAqY2FyZCA9IGlwLT5jYXJkOwpAQCAtMzM5LDEwICszMzksMTcgQEAKIAlpZiAoIWxvY2tfY2FyZChjYXJkKSkKIAkJcmV0dXJuOwogCi0Jb3V0dygweDgwMDAgfCAoY2hhbm5lbCA8PCBjYXJkLT5zaGlmdF9jb3VudCkgfCAweDAyLCBiYXNlKTsKLQlvdXR3KDB4MGYwNCwgYmFzZSk7Ci0JSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKLQlpcC0+c3RhdHVzIHw9IChJU0lfRFRSIHwgSVNJX1JUUyk7CisJaWYgKG9uKSB7CisJCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiwgYmFzZSk7CisJCW91dHcoMHgwZjA0LCBiYXNlKTsKKwkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJaXAtPnN0YXR1cyB8PSAoSVNJX0RUUiB8IElTSV9SVFMpOworCX0gZWxzZSB7CisJCW91dHcoMHg4MDAwIHwgKGNoYW5uZWwgPDwgY2FyZC0+c2hpZnRfY291bnQpIHwgMHgwMiwgYmFzZSk7CisJCW91dHcoMHgwQzA0LCBiYXNlKTsKKwkJSW50ZXJydXB0VGhlQ2FyZChiYXNlKTsKKwkJaXAtPnN0YXR1cyAmPSB+KElTSV9EVFIgfCBJU0lfUlRTKTsKKwl9CiAJdW5sb2NrX2NhcmQoY2FyZCk7CiB9CiAKQEAgLTEzMzksNyArMTM0Niw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBpc2ljb21fcG9ydF9vcHMgPSB7CiAJLmNhcnJpZXJfcmFpc2VkCQk9IGlzaWNvbV9jYXJyaWVyX3JhaXNlZCwKLQkucmFpc2VfZHRyX3J0cwkJPSBpc2ljb21fcmFpc2VfZHRyX3J0cywKKwkuZHRyX3J0cwkJPSBpc2ljb21fZHRyX3J0cywKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHJlc2V0X2NhcmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMgYi9kcml2ZXJzL2NoYXIvaXN0YWxsaW9uLmMKaW5kZXggZmZmMTlmNy4uZTE4ODAwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9pc3RhbGxpb24uYwpAQCAtMTE0MCwxNCArMTE0MCwxNCBAQAogCXJldHVybiAocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPyAxIDogMDsKIH0KIAotc3RhdGljIHZvaWQgc3RsaV9yYWlzZV9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIHN0bGlfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbikKIHsKIAlzdHJ1Y3Qgc3RsaXBvcnQgKnBvcnRwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBzdGxpcG9ydCwgcG9ydCk7CiAJc3RydWN0IHN0bGlicmQgKmJyZHAgPSBzdGxpX2JyZHNbcG9ydHAtPmJyZG5yXTsKLQlzdGxpX21rYXN5c2lncygmcG9ydHAtPmFzaWcsIDEsIDEpOworCXN0bGlfbWthc3lzaWdzKCZwb3J0cC0+YXNpZywgb24sIG9uKTsKIAlpZiAoc3RsaV9jbWR3YWl0KGJyZHAsIHBvcnRwLCBBX1NFVFNJR05BTFMsICZwb3J0cC0+YXNpZywKIAkJc2l6ZW9mKGFzeXNpZ3NfdCksIDApIDwgMCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlzdGFsbGlvbjogZHRyIHJhaXNlIGZhaWxlZC5cbiIpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaXN0YWxsaW9uOiBkdHIgc2V0IGZhaWxlZC5cbiIpOwogfQogCiAKQEAgLTQ0MTcsNyArNDQxNyw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBzdGxpX3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IHN0bGlfY2Fycmllcl9yYWlzZWQsCi0JLnJhaXNlX2R0cl9ydHMgPSBzdGxpX3JhaXNlX2R0cl9ydHMsCisJLmR0cl9ydHMgPSBzdGxpX2R0cl9ydHMsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWVtLmMgYi9kcml2ZXJzL2NoYXIvbWVtLmMKaW5kZXggNjVlMTJiYy4uZjk2ZDBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9tZW0uYwpAQCAtNjk0LDkgKzY5NCw4IEBACiAJCXdyaXR0ZW4gKz0gY2h1bmsgLSB1bndyaXR0ZW47CiAJCWlmICh1bndyaXR0ZW4pCiAJCQlicmVhazsKLQkJLyogQ29uc2lkZXIgY2hhbmdpbmcgdGhpcyB0byBqdXN0ICdzaWduYWxfcGVuZGluZygpJyB3aXRoIGxvdHMgb2YgdGVzdGluZyAqLwotCQlpZiAoZmF0YWxfc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlyZXR1cm4gd3JpdHRlbiA/IHdyaXR0ZW4gOiAtRUlOVFI7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiB3cml0dGVuID8gd3JpdHRlbiA6IC1FUkVTVEFSVFNZUzsKIAkJYnVmICs9IGNodW5rOwogCQljb3VudCAtPSBjaHVuazsKIAkJY29uZF9yZXNjaGVkKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbW94YS5jIGIvZHJpdmVycy9jaGFyL21veGEuYwppbmRleCA0YTRjYWI3Li42NWI2ZmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvbW94YS5jCisrKyBiL2RyaXZlcnMvY2hhci9tb3hhLmMKQEAgLTExODQsNiArMTE4NCwxMSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwlpZiAocG9ydCAlIE1BWF9QT1JUU19QRVJfQk9BUkQgPj0gYnJkLT5udW1Qb3J0cykgeworCQltdXRleF91bmxvY2soJm1veGFfb3BlbmxvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKIAljaCA9ICZicmQtPnBvcnRzW3BvcnQgJSBNQVhfUE9SVFNfUEVSX0JPQVJEXTsKIAljaC0+cG9ydC5jb3VudCsrOwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBjaDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9teHNlci5jIGIvZHJpdmVycy9jaGFyL214c2VyLmMKaW5kZXggMTNmODg3MS4uOTUzM2Y0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL214c2VyLmMKKysrIGIvZHJpdmVycy9jaGFyL214c2VyLmMKQEAgLTU0NywxNCArNTQ3LDE4IEBACiAJcmV0dXJuIChpbmIobXAtPmlvYWRkciArIFVBUlRfTVNSKSAmIFVBUlRfTVNSX0RDRCk/MTowOwogfQogCi1zdGF0aWMgdm9pZCBteHNlcl9yYWlzZV9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIG14c2VyX2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBpbnQgb24pCiB7CiAJc3RydWN0IG14c2VyX3BvcnQgKm1wID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBteHNlcl9wb3J0LCBwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm1wLT5zbG9jaywgZmxhZ3MpOwotCW91dGIoaW5iKG1wLT5pb2FkZHIgKyBVQVJUX01DUikgfAotCQlVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMsIG1wLT5pb2FkZHIgKyBVQVJUX01DUik7CisJaWYgKG9uKQorCQlvdXRiKGluYihtcC0+aW9hZGRyICsgVUFSVF9NQ1IpIHwKKwkJCVVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUywgbXAtPmlvYWRkciArIFVBUlRfTUNSKTsKKwllbHNlCisJCW91dGIoaW5iKG1wLT5pb2FkZHIgKyBVQVJUX01DUikmfihVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMpLAorCQkJbXAtPmlvYWRkciArIFVBUlRfTUNSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcC0+c2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjM1Niw3ICsyMzYwLDcgQEAKIAogc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgbXhzZXJfcG9ydF9vcHMgPSB7CiAJLmNhcnJpZXJfcmFpc2VkID0gbXhzZXJfY2Fycmllcl9yYWlzZWQsCi0JLnJhaXNlX2R0cl9ydHMgPSBteHNlcl9yYWlzZV9kdHJfcnRzLAorCS5kdHJfcnRzID0gbXhzZXJfZHRyX3J0cywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbl9oZGxjLmMgYi9kcml2ZXJzL2NoYXIvbl9oZGxjLmMKaW5kZXggYmFjYjNlMi4uNDYxZWNlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25faGRsYy5jCisrKyBiL2RyaXZlcnMvY2hhci9uX2hkbGMuYwpAQCAtMzQyLDggKzM0Miw4IEBACiAjZW5kaWYKIAkKIAkvKiBGbHVzaCBhbnkgcGVuZGluZyBjaGFyYWN0ZXJzIGluIHRoZSBkcml2ZXIgYW5kIGRpc2NpcGxpbmUuICovCi0JaWYgKHR0eS0+bGRpc2Mub3BzLT5mbHVzaF9idWZmZXIpCi0JCXR0eS0+bGRpc2Mub3BzLT5mbHVzaF9idWZmZXIodHR5KTsKKwlpZiAodHR5LT5sZGlzYy0+b3BzLT5mbHVzaF9idWZmZXIpCisJCXR0eS0+bGRpc2MtPm9wcy0+Zmx1c2hfYnVmZmVyKHR0eSk7CiAKIAl0dHlfZHJpdmVyX2ZsdXNoX2J1ZmZlcih0dHkpOwogCQkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9uX3R0eS5jIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKaW5kZXggZjZmMGU0ZS4uOTRhNWQ1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25fdHR5LmMKKysrIGIvZHJpdmVycy9jaGFyL25fdHR5LmMKQEAgLTczLDI0ICs3Myw2IEBACiAjZGVmaW5lIEVDSE9fT1BfU0VUX0NBTk9OX0NPTCAweDgxCiAjZGVmaW5lIEVDSE9fT1BfRVJBU0VfVEFCIDB4ODIKIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICphbGxvY19idWYodm9pZCkKLXsKLQlnZnBfdCBwcmlvID0gaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTDsKLQotCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCi0JCXJldHVybiBrbWFsbG9jKE5fVFRZX0JVRl9TSVpFLCBwcmlvKTsKLQllbHNlCi0JCXJldHVybiAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShwcmlvKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYnVmKHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLQlpZiAoUEFHRV9TSVpFICE9IE5fVFRZX0JVRl9TSVpFKQotCQlrZnJlZShidWYpOwotCWVsc2UKLQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCB0dHlfcHV0X3VzZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciB4LAogCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgX191c2VyICpwdHIpCiB7CkBAIC0xNTU4LDExICsxNTQwLDExIEBACiB7CiAJbl90dHlfZmx1c2hfYnVmZmVyKHR0eSk7CiAJaWYgKHR0eS0+cmVhZF9idWYpIHsKLQkJZnJlZV9idWYodHR5LT5yZWFkX2J1Zik7CisJCWtmcmVlKHR0eS0+cmVhZF9idWYpOwogCQl0dHktPnJlYWRfYnVmID0gTlVMTDsKIAl9CiAJaWYgKHR0eS0+ZWNob19idWYpIHsKLQkJZnJlZV9idWYodHR5LT5lY2hvX2J1Zik7CisJCWtmcmVlKHR0eS0+ZWNob19idWYpOwogCQl0dHktPmVjaG9fYnVmID0gTlVMTDsKIAl9CiB9CkBAIC0xNTg0LDE3ICsxNTY2LDE2IEBACiAKIAkvKiBUaGVzZSBhcmUgdWdseS4gQ3VycmVudGx5IGEgbWFsbG9jIGZhaWx1cmUgaGVyZSBjYW4gcGFuaWMgKi8KIAlpZiAoIXR0eS0+cmVhZF9idWYpIHsKLQkJdHR5LT5yZWFkX2J1ZiA9IGFsbG9jX2J1ZigpOworCQl0dHktPnJlYWRfYnVmID0ga3phbGxvYyhOX1RUWV9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdHR5LT5yZWFkX2J1ZikKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KIAlpZiAoIXR0eS0+ZWNob19idWYpIHsKLQkJdHR5LT5lY2hvX2J1ZiA9IGFsbG9jX2J1ZigpOworCQl0dHktPmVjaG9fYnVmID0ga3phbGxvYyhOX1RUWV9CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisKIAkJaWYgKCF0dHktPmVjaG9fYnVmKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCW1lbXNldCh0dHktPnJlYWRfYnVmLCAwLCBOX1RUWV9CVUZfU0laRSk7Ci0JbWVtc2V0KHR0eS0+ZWNob19idWYsIDAsIE5fVFRZX0JVRl9TSVpFKTsKIAlyZXNldF9idWZmZXJfZmxhZ3ModHR5KTsKIAl0dHktPmNvbHVtbiA9IDA7CiAJbl90dHlfc2V0X3Rlcm1pb3ModHR5LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYyBiL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYwppbmRleCAxOWQ3OWZjLi43N2IzNjQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKKysrIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCkBAIC0zODMsNyArMzgzLDcgQEAKIHN0YXRpYyB2b2lkIHR4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KTsKIAogc3RhdGljIGludCBjYXJyaWVyX3JhaXNlZChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOwotc3RhdGljIHZvaWQgcmFpc2VfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbm9mZik7CiAKICNpZiBTWU5DTElOS19HRU5FUklDX0hETEMKICNkZWZpbmUgZGV2X3RvX3BvcnQoRCkgKGRldl90b19oZGxjKEQpLT5wcml2KQpAQCAtNTEzLDcgKzUxMyw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBtZ3NscGNfcG9ydF9vcHMgPSB7CiAJLmNhcnJpZXJfcmFpc2VkID0gY2Fycmllcl9yYWlzZWQsCi0JLnJhaXNlX2R0cl9ydHMgPSByYWlzZV9kdHJfcnRzCisJLmR0cl9ydHMgPSBkdHJfcnRzCiB9OwogCiBzdGF0aWMgaW50IG1nc2xwY19wcm9iZShzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKQEAgLTI1MjgsMTMgKzI1MjgsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcmFpc2VfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCitzdGF0aWMgdm9pZCBkdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgaW50IG9ub2ZmKQogewogCU1HU0xQQ19JTkZPICppbmZvID0gY29udGFpbmVyX29mKHBvcnQsIE1HU0xQQ19JTkZPLCBwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOwotCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCWlmIChvbm9mZikKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJZWxzZQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyAmPSB+U2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CiAJc2V0X3NpZ25hbHMoaW5mbyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jayxmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcHR5LmMgYi9kcml2ZXJzL2NoYXIvcHR5LmMKaW5kZXggMzEwMzhhMC4uNWFjZDI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3B0eS5jCisrKyBiL2RyaXZlcnMvY2hhci9wdHkuYwpAQCAtMzAsNyArMzAsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCi0vKiBUaGVzZSBhcmUgZ2xvYmFsIGJlY2F1c2UgdGhleSBhcmUgYWNjZXNzZWQgaW4gdHR5X2lvLmMgKi8KICNpZmRlZiBDT05GSUdfVU5JWDk4X1BUWVMKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRtX2RyaXZlcjsKIHN0YXRpYyBzdHJ1Y3QgdHR5X2RyaXZlciAqcHRzX2RyaXZlcjsKQEAgLTExMSw3ICsxMTAsNyBAQAogCWMgPSB0by0+cmVjZWl2ZV9yb29tOwogCWlmIChjID4gY291bnQpCiAJCWMgPSBjb3VudDsKLQl0by0+bGRpc2Mub3BzLT5yZWNlaXZlX2J1Zih0bywgYnVmLCBOVUxMLCBjKTsKKwl0by0+bGRpc2MtPm9wcy0+cmVjZWl2ZV9idWYodG8sIGJ1ZiwgTlVMTCwgYyk7CiAKIAlyZXR1cm4gYzsKIH0KQEAgLTE0OSwxMSArMTQ4LDExIEBACiAJaW50IGNvdW50OwogCiAJLyogV2Ugc2hvdWxkIGdldCB0aGUgbGluZSBkaXNjaXBsaW5lIGxvY2sgZm9yICJ0dHktPmxpbmsiICovCi0JaWYgKCF0byB8fCAhdG8tPmxkaXNjLm9wcy0+Y2hhcnNfaW5fYnVmZmVyKQorCWlmICghdG8gfHwgIXRvLT5sZGlzYy0+b3BzLT5jaGFyc19pbl9idWZmZXIpCiAJCXJldHVybiAwOwogCiAJLyogVGhlIGxkaXNjIG11c3QgcmVwb3J0IDAgaWYgbm8gY2hhcmFjdGVycyBhdmFpbGFibGUgdG8gYmUgcmVhZCAqLwotCWNvdW50ID0gdG8tPmxkaXNjLm9wcy0+Y2hhcnNfaW5fYnVmZmVyKHRvKTsKKwljb3VudCA9IHRvLT5sZGlzYy0+b3BzLT5jaGFyc19pbl9idWZmZXIodG8pOwogCiAJaWYgKHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX1NMQVZFKQogCQlyZXR1cm4gY291bnQ7CkBAIC0xODcsOCArMTg2LDggQEAKIAlpZiAoIXRvKQogCQlyZXR1cm47CiAKLQlpZiAodG8tPmxkaXNjLm9wcy0+Zmx1c2hfYnVmZmVyKQotCQl0by0+bGRpc2Mub3BzLT5mbHVzaF9idWZmZXIodG8pOworCWlmICh0by0+bGRpc2MtPm9wcy0+Zmx1c2hfYnVmZmVyKQorCQl0by0+bGRpc2MtPm9wcy0+Zmx1c2hfYnVmZmVyKHRvKTsKIAogCWlmICh0by0+cGFja2V0KSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPmN0cmxfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jhdy5jIGIvZHJpdmVycy9jaGFyL3Jhdy5jCmluZGV4IDIwZDkwZTYuLmRiMzJmMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9yYXcuYworKysgYi9kcml2ZXJzL2NoYXIvcmF3LmMKQEAgLTcxLDcgKzcxLDcgQEAKIAllcnIgPSBiZF9jbGFpbShiZGV2LCByYXdfb3Blbik7CiAJaWYgKGVycikKIAkJZ290byBvdXQxOwotCWVyciA9IHNldF9ibG9ja3NpemUoYmRldiwgYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpKTsKKwllcnIgPSBzZXRfYmxvY2tzaXplKGJkZXYsIGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDI7CiAJZmlscC0+Zl9mbGFncyB8PSBPX0RJUkVDVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuYyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwppbmRleCBmNTlmYzVjLi42M2Q1YjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCkBAIC04NzIsMTEgKzg3MiwxNiBAQAogCXJldHVybiAoc0dldENoYW5TdGF0dXNMbygmaW5mby0+Y2hhbm5lbCkgJiBDRF9BQ1QpID8gMSA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhaXNlX2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbikKIHsKIAlzdHJ1Y3Qgcl9wb3J0ICppbmZvID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCByX3BvcnQsIHBvcnQpOwotCXNTZXREVFIoJmluZm8tPmNoYW5uZWwpOwotCXNTZXRSVFMoJmluZm8tPmNoYW5uZWwpOworCWlmIChvbikgeworCQlzU2V0RFRSKCZpbmZvLT5jaGFubmVsKTsKKwkJc1NldFJUUygmaW5mby0+Y2hhbm5lbCk7CisJfSBlbHNlIHsKKwkJc0NsckRUUigmaW5mby0+Y2hhbm5lbCk7CisJCXNDbHJSVFMoJmluZm8tPmNoYW5uZWwpOworCX0KIH0KIAogLyoKQEAgLTkzNCw3ICs5MzksNyBAQAogCS8qCiAJICogSW5mby0+Y291bnQgaXMgbm93IDE7IHNvIGl0J3Mgc2FmZSB0byBzbGVlcCBub3cuCiAJICovCi0JaWYgKCF0ZXN0X2JpdChBU1lOQ19JTklUSUFMSVpFRCwgJnBvcnQtPmZsYWdzKSkgeworCWlmICghdGVzdF9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmcG9ydC0+ZmxhZ3MpKSB7CiAJCWNwID0gJmluZm8tPmNoYW5uZWw7CiAJCXNTZXRSeFRyaWdnZXIoY3AsIFRSSUdfMSk7CiAJCWlmIChzR2V0Q2hhblN0YXR1cyhjcCkgJiBDRF9BQ1QpCkBAIC05NTgsNyArOTYzLDcgQEAKIAkJc0VuUnhGSUZPKGNwKTsKIAkJc0VuVHJhbnNtaXQoY3ApOwogCi0JCXNldF9iaXQoQVNZTkNfSU5JVElBTElaRUQsICZpbmZvLT5wb3J0LmZsYWdzKTsKKwkJc2V0X2JpdChBU1lOQ0JfSU5JVElBTElaRUQsICZpbmZvLT5wb3J0LmZsYWdzKTsKIAogCQkvKgogCQkgKiBTZXQgdXAgdGhlIHR0eS0+YWx0X3NwZWVkIGtsdWRnZQpAQCAtMTY0MSw3ICsxNjQ2LDcgQEAKIAkvKiAgV3JpdGUgcmVtYWluaW5nIGRhdGEgaW50byB0aGUgcG9ydCdzIHhtaXRfYnVmICovCiAJd2hpbGUgKDEpIHsKIAkJLyogSHVuZyB1cCA/ICovCi0JCWlmICghdGVzdF9iaXQoQVNZTkNfTk9STUFMX0FDVElWRSwgJmluZm8tPnBvcnQuZmxhZ3MpKQorCQlpZiAoIXRlc3RfYml0KEFTWU5DQl9OT1JNQUxfQUNUSVZFLCAmaW5mby0+cG9ydC5mbGFncykpCiAJCQlnb3RvIGVuZDsKIAkJYyA9IG1pbihjb3VudCwgWE1JVF9CVUZfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSk7CiAJCWMgPSBtaW4oYywgWE1JVF9CVUZfU0laRSAtIGluZm8tPnhtaXRfaGVhZCk7CkBAIC0yMjUwLDcgKzIyNTUsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgcm9ja2V0X3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IGNhcnJpZXJfcmFpc2VkLAotCS5yYWlzZV9kdHJfcnRzID0gcmFpc2VfZHRyX3J0cywKKwkuZHRyX3J0cyA9IGR0cl9ydHMsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jIGIvZHJpdmVycy9jaGFyL3NlbGVjdGlvbi5jCmluZGV4IGNiOGNhNTYuLmY5N2I5ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zZWxlY3Rpb24uYworKysgYi9kcml2ZXJzL2NoYXIvc2VsZWN0aW9uLmMKQEAgLTMyNyw3ICszMjcsNyBAQAogCQl9CiAJCWNvdW50ID0gc2VsX2J1ZmZlcl9sdGggLSBwYXN0ZWQ7CiAJCWNvdW50ID0gbWluKGNvdW50LCB0dHktPnJlY2VpdmVfcm9vbSk7Ci0JCXR0eS0+bGRpc2Mub3BzLT5yZWNlaXZlX2J1Zih0dHksIHNlbF9idWZmZXIgKyBwYXN0ZWQsCisJCXR0eS0+bGRpc2MtPm9wcy0+cmVjZWl2ZV9idWYodHR5LCBzZWxfYnVmZmVyICsgcGFzdGVkLAogCQkJCQkJCQlOVUxMLCBjb3VudCk7CiAJCXBhc3RlZCArPSBjb3VudDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3RhbGxpb24uYyBiL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCmluZGV4IDJhZDgxM2EuLjUzZTUwNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCisrKyBiL2RyaXZlcnMvY2hhci9zdGFsbGlvbi5jCkBAIC03NzIsMTEgKzc3MiwxMSBAQAogCXJldHVybiAocG9ydHAtPnNpZ3MgJiBUSU9DTV9DRCkgPyAxIDogMDsKIH0KIAotc3RhdGljIHZvaWQgc3RsX3JhaXNlX2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgc3RsX2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBpbnQgb24pCiB7CiAJc3RydWN0IHN0bHBvcnQgKnBvcnRwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCBzdGxwb3J0LCBwb3J0KTsKIAkvKiBUYWtlcyBicmRfbG9jayBpbnRlcm5hbGx5ICovCi0Jc3RsX3NldHNpZ25hbHMocG9ydHAsIDEsIDEpOworCXN0bF9zZXRzaWduYWxzKHBvcnRwLCBvbiwgb24pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNTQ3LDcgKzI1NDcsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgc3RsX3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IHN0bF9jYXJyaWVyX3JhaXNlZCwKLQkucmFpc2VfZHRyX3J0cyA9IHN0bF9yYWlzZV9kdHJfcnRzLAorCS5kdHJfcnRzID0gc3RsX2R0cl9ydHMsCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmsuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCmluZGV4IGFmZDBiMjYuLmFmZGVkM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGluay5jCkBAIC0zMjQ3LDEzICszMjQ3LDE2IEBACiAJcmV0dXJuIChpbmZvLT5zZXJpYWxfc2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gMSA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhaXNlX2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbikKIHsKIAlzdHJ1Y3QgbWdzbF9zdHJ1Y3QgKmluZm8gPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IG1nc2xfc3RydWN0LCBwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7Ci0JaW5mby0+c2VyaWFsX3NpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJaWYgKG9uKQorCQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwllbHNlCisJCWluZm8tPnNlcmlhbF9zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFIpOwogIAl1c2Nfc2V0X3NlcmlhbF9zaWduYWxzKGluZm8pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmlycV9zcGlubG9jayxmbGFncyk7CiB9CkBAIC00MjU4LDcgKzQyNjEsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgbWdzbF9wb3J0X29wcyA9IHsKIAkuY2Fycmllcl9yYWlzZWQgPSBjYXJyaWVyX3JhaXNlZCwKLQkucmFpc2VfZHRyX3J0cyA9IHJhaXNlX2R0cl9ydHMsCisJLmR0cl9ydHMgPSBkdHJfcnRzLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCmluZGV4IDVlMjU2NDkuLjEzODY2MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCisrKyBiL2RyaXZlcnMvY2hhci9zeW5jbGlua19ndC5jCkBAIC0yMTQsNiArMjE0LDcgQEAKICNkZWZpbmUgc2V0X2Rlc2NfbmV4dChhLGIpIChhKS5uZXh0ICAgPSBjcHVfdG9fbGUzMigodW5zaWduZWQgaW50KShiKSkKICNkZWZpbmUgc2V0X2Rlc2NfY291bnQoYSxiKShhKS5jb3VudCAgPSBjcHVfdG9fbGUxNigodW5zaWduZWQgc2hvcnQpKGIpKQogI2RlZmluZSBzZXRfZGVzY19lb2YoYSxiKSAgKGEpLnN0YXR1cyA9IGNwdV90b19sZTE2KChiKSA/IChsZTE2X3RvX2NwdSgoYSkuc3RhdHVzKSB8IEJJVDApIDogKGxlMTZfdG9fY3B1KChhKS5zdGF0dXMpICYgfkJJVDApKQorI2RlZmluZSBzZXRfZGVzY19zdGF0dXMoYSwgYikgKGEpLnN0YXR1cyA9IGNwdV90b19sZTE2KCh1bnNpZ25lZCBzaG9ydCkoYikpCiAjZGVmaW5lIGRlc2NfY291bnQoYSkgICAgICAobGUxNl90b19jcHUoKGEpLmNvdW50KSkKICNkZWZpbmUgZGVzY19zdGF0dXMoYSkgICAgIChsZTE2X3RvX2NwdSgoYSkuc3RhdHVzKSkKICNkZWZpbmUgZGVzY19jb21wbGV0ZShhKSAgIChsZTE2X3RvX2NwdSgoYSkuc3RhdHVzKSAmIEJJVDE1KQpAQCAtMjk3LDYgKzI5OCw3IEBACiAJdTMyIG1heF9mcmFtZV9zaXplOyAgICAgICAvKiBhcyBzZXQgYnkgZGV2aWNlIGNvbmZpZyAqLwogCiAJdW5zaWduZWQgaW50IHJidWZfZmlsbF9sZXZlbDsKKwl1bnNpZ25lZCBpbnQgcnhfcGlvOwogCXVuc2lnbmVkIGludCBpZl9tb2RlOwogCXVuc2lnbmVkIGludCBiYXNlX2Nsb2NrOwogCkBAIC0zMzEsNiArMzMzLDggQEAKIAlzdHJ1Y3Qgc2xndF9kZXNjICpyYnVmczsKIAl1bnNpZ25lZCBpbnQgcmJ1Zl9jdXJyZW50OwogCXVuc2lnbmVkIGludCByYnVmX2luZGV4OworCXVuc2lnbmVkIGludCByYnVmX2ZpbGxfaW5kZXg7CisJdW5zaWduZWQgc2hvcnQgcmJ1Zl9maWxsX2NvdW50OwogCiAJdW5zaWduZWQgaW50IHRidWZfY291bnQ7CiAJc3RydWN0IHNsZ3RfZGVzYyAqdGJ1ZnM7CkBAIC0yMTEwLDYgKzIxMTQsNDAgQEAKIAlpbmZvLT5wZW5kaW5nX2JoIHw9IEJIX1NUQVRVUzsKIH0KIAorc3RhdGljIHZvaWQgaXNyX3J4ZGF0YShzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IGluZm8tPnJidWZfZmlsbF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgaSA9IGluZm8tPnJidWZfZmlsbF9pbmRleDsKKwl1bnNpZ25lZCBzaG9ydCByZWc7CisKKwl3aGlsZSAocmRfcmVnMTYoaW5mbywgU1NSKSAmIElSUV9SWERBVEEpIHsKKwkJcmVnID0gcmRfcmVnMTYoaW5mbywgUkRSKTsKKwkJREJHSVNSKCgiaXNyX3J4ZGF0YSAlcyBSRFI9JTA0WFxuIiwgaW5mby0+ZGV2aWNlX25hbWUsIHJlZykpOworCQlpZiAoZGVzY19jb21wbGV0ZShpbmZvLT5yYnVmc1tpXSkpIHsKKwkJCS8qIGFsbCBidWZmZXJzIGZ1bGwgKi8KKwkJCXJ4X3N0b3AoaW5mbyk7CisJCQlpbmZvLT5yeF9yZXN0YXJ0ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWluZm8tPnJidWZzW2ldLmJ1Zltjb3VudCsrXSA9ICh1bnNpZ25lZCBjaGFyKXJlZzsKKwkJLyogYXN5bmMgbW9kZSBzYXZlcyBzdGF0dXMgYnl0ZSB0byBidWZmZXIgZm9yIGVhY2ggZGF0YSBieXRlICovCisJCWlmIChpbmZvLT5wYXJhbXMubW9kZSA9PSBNR1NMX01PREVfQVNZTkMpCisJCQlpbmZvLT5yYnVmc1tpXS5idWZbY291bnQrK10gPSAodW5zaWduZWQgY2hhcikocmVnID4+IDgpOworCQlpZiAoY291bnQgPT0gaW5mby0+cmJ1Zl9maWxsX2xldmVsIHx8IChyZWcgJiBCSVQxMCkpIHsKKwkJCS8qIGJ1ZmZlciBmdWxsIG9yIGVuZCBvZiBmcmFtZSAqLworCQkJc2V0X2Rlc2NfY291bnQoaW5mby0+cmJ1ZnNbaV0sIGNvdW50KTsKKwkJCXNldF9kZXNjX3N0YXR1cyhpbmZvLT5yYnVmc1tpXSwgQklUMTUgfCAocmVnID4+IDgpKTsKKwkJCWluZm8tPnJidWZfZmlsbF9jb3VudCA9IGNvdW50ID0gMDsKKwkJCWlmICgrK2kgPT0gaW5mby0+cmJ1Zl9jb3VudCkKKwkJCQlpID0gMDsKKwkJCWluZm8tPnBlbmRpbmdfYmggfD0gQkhfUkVDRUlWRTsKKwkJfQorCX0KKworCWluZm8tPnJidWZfZmlsbF9pbmRleCA9IGk7CisJaW5mby0+cmJ1Zl9maWxsX2NvdW50ID0gY291bnQ7Cit9CisKIHN0YXRpYyB2b2lkIGlzcl9zZXJpYWwoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKIHsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSByZF9yZWcxNihpbmZvLCBTU1IpOwpAQCAtMjEyNSw2ICsyMTYzLDggQEAKIAkJCWlmIChpbmZvLT50eF9jb3VudCkKIAkJCQlpc3JfdHhlb20oaW5mbywgc3RhdHVzKTsKIAkJfQorCQlpZiAoaW5mby0+cnhfcGlvICYmIChzdGF0dXMgJiBJUlFfUlhEQVRBKSkKKwkJCWlzcl9yeGRhdGEoaW5mbyk7CiAJCWlmICgoc3RhdHVzICYgSVJRX1JYQlJFQUspICYmIChzdGF0dXMgJiBSWEJSRUFLKSkgewogCQkJaW5mby0+aWNvdW50LmJyaysrOwogCQkJLyogcHJvY2VzcyBicmVhayBkZXRlY3Rpb24gaWYgdHR5IGNvbnRyb2wgYWxsb3dzICovCkBAIC0yMTQxLDcgKzIxODEsOCBAQAogCX0gZWxzZSB7CiAJCWlmIChzdGF0dXMgJiAoSVJRX1RYSURMRSArIElSUV9UWFVOREVSKSkKIAkJCWlzcl90eGVvbShpbmZvLCBzdGF0dXMpOwotCisJCWlmIChpbmZvLT5yeF9waW8gJiYgKHN0YXR1cyAmIElSUV9SWERBVEEpKQorCQkJaXNyX3J4ZGF0YShpbmZvKTsKIAkJaWYgKHN0YXR1cyAmIElSUV9SWElETEUpIHsKIAkJCWlmIChzdGF0dXMgJiBSWElETEUpCiAJCQkJaW5mby0+aWNvdW50LnJ4aWRsZSsrOwpAQCAtMjY0Miw2ICsyNjgzLDEwIEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpbmZvLT5yYnVmX2ZpbGxfbGV2ZWwgPSByYnVmX2ZpbGxfbGV2ZWw7CisJCWlmIChyYnVmX2ZpbGxfbGV2ZWwgPCAxMjgpCisJCQlpbmZvLT5yeF9waW8gPSAxOyAvKiBQSU8gbW9kZSAqLworCQllbHNlCisJCQlpbmZvLT5yeF9waW8gPSAwOyAvKiBETUEgbW9kZSAqLwogCQlyeF9zdG9wKGluZm8pOyAvKiByZXN0YXJ0IHJlY2VpdmVyIHRvIHVzZSBuZXcgZmlsbCBsZXZlbCAqLwogCX0KIApAQCAtMzA5OSwxMyArMzE0NCwxNiBAQAogCXJldHVybiAoaW5mby0+c2lnbmFscyAmIFNlcmlhbFNpZ25hbF9EQ0QpID8gMSA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJhaXNlX2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzbGd0X2luZm8gKmluZm8gPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHNsZ3RfaW5mbywgcG9ydCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7Ci0JaW5mby0+c2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwlpZiAob24pCisJCWluZm8tPnNpZ25hbHMgfD0gU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFI7CisJZWxzZQorCQlpbmZvLT5zaWduYWxzICY9IH4oU2VyaWFsU2lnbmFsX1JUUyArIFNlcmlhbFNpZ25hbF9EVFIpOwogIAlzZXRfc2lnbmFscyhpbmZvKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKIH0KQEAgLTM0MTksNyArMzQ2Nyw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBzbGd0X3BvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IGNhcnJpZXJfcmFpc2VkLAotCS5yYWlzZV9kdHJfcnRzID0gcmFpc2VfZHRyX3J0cywKKwkuZHRyX3J0cyA9IGR0cl9ydHMsCiB9OwogCiAvKgpAQCAtMzg0MSwxNSArMzg4OSwyNyBAQAogCXJkbWFfcmVzZXQoaW5mbyk7CiAJcmVzZXRfcmJ1ZnMoaW5mbyk7CiAKLQkvKiBzZXQgMXN0IGRlc2NyaXB0b3IgYWRkcmVzcyAqLwotCXdyX3JlZzMyKGluZm8sIFJEREFSLCBpbmZvLT5yYnVmc1swXS5wZGVzYyk7Ci0KLQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DKSB7Ci0JCS8qIGVuYWJsZSByeCBETUEgYW5kIERNQSBpbnRlcnJ1cHQgKi8KLQkJd3JfcmVnMzIoaW5mbywgUkRDU1IsIChCSVQyICsgQklUMCkpOworCWlmIChpbmZvLT5yeF9waW8pIHsKKwkJLyogcnggcmVxdWVzdCB3aGVuIHJ4IEZJRk8gbm90IGVtcHR5ICovCisJCXdyX3JlZzE2KGluZm8sIFNDUiwgKHVuc2lnbmVkIHNob3J0KShyZF9yZWcxNihpbmZvLCBTQ1IpICYgfkJJVDE0KSk7CisJCXNsZ3RfaXJxX29uKGluZm8sIElSUV9SWERBVEEpOworCQlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0FTWU5DKSB7CisJCQkvKiBlbmFibGUgc2F2aW5nIG9mIHJ4IHN0YXR1cyAqLworCQkJd3JfcmVnMzIoaW5mbywgUkRDU1IsIEJJVDYpOworCQl9CiAJfSBlbHNlIHsKLQkJLyogZW5hYmxlIHNhdmluZyBvZiByeCBzdGF0dXMsIHJ4IERNQSBhbmQgRE1BIGludGVycnVwdCAqLwotCQl3cl9yZWczMihpbmZvLCBSRENTUiwgKEJJVDYgKyBCSVQyICsgQklUMCkpOworCQkvKiByeCByZXF1ZXN0IHdoZW4gcnggRklGTyBoYWxmIGZ1bGwgKi8KKwkJd3JfcmVnMTYoaW5mbywgU0NSLCAodW5zaWduZWQgc2hvcnQpKHJkX3JlZzE2KGluZm8sIFNDUikgfCBCSVQxNCkpOworCQkvKiBzZXQgMXN0IGRlc2NyaXB0b3IgYWRkcmVzcyAqLworCQl3cl9yZWczMihpbmZvLCBSRERBUiwgaW5mby0+cmJ1ZnNbMF0ucGRlc2MpOworCisJCWlmIChpbmZvLT5wYXJhbXMubW9kZSAhPSBNR1NMX01PREVfQVNZTkMpIHsKKwkJCS8qIGVuYWJsZSByeCBETUEgYW5kIERNQSBpbnRlcnJ1cHQgKi8KKwkJCXdyX3JlZzMyKGluZm8sIFJEQ1NSLCAoQklUMiArIEJJVDApKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGVuYWJsZSBzYXZpbmcgb2Ygcnggc3RhdHVzLCByeCBETUEgYW5kIERNQSBpbnRlcnJ1cHQgKi8KKwkJCXdyX3JlZzMyKGluZm8sIFJEQ1NSLCAoQklUNiArIEJJVDIgKyBCSVQwKSk7CisJCX0KIAl9CiAKIAlzbGd0X2lycV9vbihpbmZvLCBJUlFfUlhPVkVSKTsKQEAgLTQ0NjcsNiArNDUyNyw4IEBACiBzdGF0aWMgdm9pZCByZXNldF9yYnVmcyhzdHJ1Y3Qgc2xndF9pbmZvICppbmZvKQogewogCWZyZWVfcmJ1ZnMoaW5mbywgMCwgaW5mby0+cmJ1Zl9jb3VudCAtIDEpOworCWluZm8tPnJidWZfZmlsbF9pbmRleCA9IDA7CisJaW5mby0+cmJ1Zl9maWxsX2NvdW50ID0gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCmluZGV4IDI2ZGU2MGUuLjZmNzI3ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwpAQCAtMzI3NywxMyArMzI3NywxNiBAQAogCXJldHVybiAoaW5mby0+c2VyaWFsX3NpZ25hbHMgJiBTZXJpYWxTaWduYWxfRENEKSA/IDEgOiAwOwogfQogCi1zdGF0aWMgdm9pZCByYWlzZV9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIGR0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0LCBpbnQgb24pCiB7CiAJU0xNUF9JTkZPICppbmZvID0gY29udGFpbmVyX29mKHBvcnQsIFNMTVBfSU5GTywgcG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLGZsYWdzKTsKLQlpbmZvLT5zZXJpYWxfc2lnbmFscyB8PSBTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUjsKKwlpZiAob24pCisJCWluZm8tPnNlcmlhbF9zaWduYWxzIHw9IFNlcmlhbFNpZ25hbF9SVFMgKyBTZXJpYWxTaWduYWxfRFRSOworCWVsc2UKKwkJaW5mby0+c2VyaWFsX3NpZ25hbHMgJj0gfihTZXJpYWxTaWduYWxfUlRTICsgU2VyaWFsU2lnbmFsX0RUUik7CiAgCXNldF9zaWduYWxzKGluZm8pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssZmxhZ3MpOwogfQpAQCAtMzc0Niw3ICszNzQ5LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfcG9ydF9vcGVyYXRpb25zIHBvcnRfb3BzID0gewogCS5jYXJyaWVyX3JhaXNlZCA9IGNhcnJpZXJfcmFpc2VkLAotCS5yYWlzZV9kdHJfcnRzID0gcmFpc2VfZHRyX3J0cywKKwkuZHRyX3J0cyA9IGR0cl9ydHMsCiB9OwogCiAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGRldmljZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeXNycS5jIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKaW5kZXggZDZhODA3Zi4uMzlhMDViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3N5c3JxLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYmRfa2Vybi5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KQEAgLTI0Myw2ICsyNDQsNyBAQAogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X2lycV9yZWdzKCk7CiAJaWYgKHJlZ3MpCiAJCXNob3dfcmVncyhyZWdzKTsKKwlwZXJmX2NvdW50ZXJfcHJpbnRfZGVidWcoKTsKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dyZWdzX29wID0gewogCS5oYW5kbGVyCT0gc3lzcnFfaGFuZGxlX3Nob3dyZWdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3R0eV9hdWRpdC5jIGIvZHJpdmVycy9jaGFyL3R0eV9hdWRpdC5jCmluZGV4IDU1YmE2ZjEuLmFjMTZmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90dHlfYXVkaXQuYworKysgYi9kcml2ZXJzL2NoYXIvdHR5X2F1ZGl0LmMKQEAgLTI5LDEwICsyOSw3IEBACiAJYnVmID0ga21hbGxvYyhzaXplb2YoKmJ1ZiksIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlnb3RvIGVycjsKLQlpZiAoUEFHRV9TSVpFICE9IE5fVFRZX0JVRl9TSVpFKQotCQlidWYtPmRhdGEgPSBrbWFsbG9jKE5fVFRZX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKLQllbHNlCi0JCWJ1Zi0+ZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWJ1Zi0+ZGF0YSA9IGttYWxsb2MoTl9UVFlfQlVGX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmLT5kYXRhKQogCQlnb3RvIGVycl9idWY7CiAJYXRvbWljX3NldCgmYnVmLT5jb3VudCwgMSk7CkBAIC01MiwxMCArNDksNyBAQAogc3RhdGljIHZvaWQgdHR5X2F1ZGl0X2J1Zl9mcmVlKHN0cnVjdCB0dHlfYXVkaXRfYnVmICpidWYpCiB7CiAJV0FSTl9PTihidWYtPnZhbGlkICE9IDApOwotCWlmIChQQUdFX1NJWkUgIT0gTl9UVFlfQlVGX1NJWkUpCi0JCWtmcmVlKGJ1Zi0+ZGF0YSk7Ci0JZWxzZQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmLT5kYXRhKTsKKwlrZnJlZShidWYtPmRhdGEpOwogCWtmcmVlKGJ1Zik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW8uYyBiL2RyaXZlcnMvY2hhci90dHlfaW8uYwppbmRleCA2NmI5OWEyLi45MzllMTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2lvLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9pby5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAlzdHJ1Y3QgdHR5X2RyaXZlciAqcCwgKnJlcyA9IE5VTEw7CiAJaW50IHR0eV9saW5lID0gMDsKIAlpbnQgbGVuOwotCWNoYXIgKnN0cjsKKwljaGFyICpzdHIsICpzdHA7CiAKIAlmb3IgKHN0ciA9IG5hbWU7ICpzdHI7IHN0cisrKQogCQlpZiAoKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKSB8fCAqc3RyID09ICcsJykKQEAgLTMxMSwxMyArMzExLDE0IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmdHR5X2RyaXZlcnMsIHR0eV9kcml2ZXJzKSB7CiAJCWlmIChzdHJuY21wKG5hbWUsIHAtPm5hbWUsIGxlbikgIT0gMCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoKnN0ciA9PSAnLCcpCi0JCQlzdHIrKzsKLQkJaWYgKCpzdHIgPT0gJ1wwJykKLQkJCXN0ciA9IE5VTEw7CisJCXN0cCA9IHN0cjsKKwkJaWYgKCpzdHAgPT0gJywnKQorCQkJc3RwKys7CisJCWlmICgqc3RwID09ICdcMCcpCisJCQlzdHAgPSBOVUxMOwogCiAJCWlmICh0dHlfbGluZSA+PSAwICYmIHR0eV9saW5lIDw9IHAtPm51bSAmJiBwLT5vcHMgJiYKLQkJICAgIHAtPm9wcy0+cG9sbF9pbml0ICYmICFwLT5vcHMtPnBvbGxfaW5pdChwLCB0dHlfbGluZSwgc3RyKSkgeworCQkgICAgcC0+b3BzLT5wb2xsX2luaXQgJiYgIXAtPm9wcy0+cG9sbF9pbml0KHAsIHR0eV9saW5lLCBzdHApKSB7CiAJCQlyZXMgPSB0dHlfZHJpdmVyX2tyZWZfZ2V0KHApOwogCQkJKmxpbmUgPSB0dHlfbGluZTsKIAkJCWJyZWFrOwpAQCAtNDcwLDQzICs0NzEsNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwodHR5X3dha2V1cCk7CiAKIC8qKgotICoJdHR5X2xkaXNjX2ZsdXNoCS0JZmx1c2ggbGluZSBkaXNjaXBsaW5lIHF1ZXVlCi0gKglAdHR5OiB0dHkKLSAqCi0gKglGbHVzaCB0aGUgbGluZSBkaXNjaXBsaW5lIHF1ZXVlIChpZiBhbnkpIGZvciB0aGlzIHR0eS4gSWYgdGhlcmUKLSAqCWlzIG5vIGxpbmUgZGlzY2lwbGluZSBhY3RpdmUgdGhpcyBpcyBhIG5vLW9wLgotICovCi0KLXZvaWQgdHR5X2xkaXNjX2ZsdXNoKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCi17Ci0Jc3RydWN0IHR0eV9sZGlzYyAqbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7Ci0JaWYgKGxkKSB7Ci0JCWlmIChsZC0+b3BzLT5mbHVzaF9idWZmZXIpCi0JCQlsZC0+b3BzLT5mbHVzaF9idWZmZXIodHR5KTsKLQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKLQl9Ci0JdHR5X2J1ZmZlcl9mbHVzaCh0dHkpOwotfQotCi1FWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfZmx1c2gpOwotCi0vKioKLSAqCXR0eV9yZXNldF90ZXJtaW9zCS0JcmVzZXQgdGVybWluYWwgc3RhdGUKLSAqCUB0dHk6IHR0eSB0byByZXNldAotICoKLSAqCVJlc3RvcmUgYSB0ZXJtaW5hbCB0byB0aGUgZHJpdmVyIGRlZmF1bHQgc3RhdGUKLSAqLwotCi1zdGF0aWMgdm9pZCB0dHlfcmVzZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQotewotCW11dGV4X2xvY2soJnR0eS0+dGVybWlvc19tdXRleCk7Ci0JKnR0eS0+dGVybWlvcyA9IHR0eS0+ZHJpdmVyLT5pbml0X3Rlcm1pb3M7Ci0JdHR5LT50ZXJtaW9zLT5jX2lzcGVlZCA9IHR0eV90ZXJtaW9zX2lucHV0X2JhdWRfcmF0ZSh0dHktPnRlcm1pb3MpOwotCXR0eS0+dGVybWlvcy0+Y19vc3BlZWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodHR5LT50ZXJtaW9zKTsKLQltdXRleF91bmxvY2soJnR0eS0+dGVybWlvc19tdXRleCk7Ci19Ci0KLS8qKgogICoJZG9fdHR5X2hhbmd1cAkJLQlhY3R1YWwgaGFuZGxlciBmb3IgaGFuZ3VwIGV2ZW50cwogICoJQHdvcms6IHR0eSBkZXZpY2UKICAqCkBAIC01MzUsNyArNDk5LDYgQEAKIAlzdHJ1Y3QgZmlsZSAqY29uc19maWxwID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZSAqZmlscCwgKmYgPSBOVUxMOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKIAlpbnQgICAgY2xvc2Vjb3VudCA9IDAsIG47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmVmcyA9IDA7CkBAIC01NjYsNDAgKzUyOSw4IEBACiAJCWZpbHAtPmZfb3AgPSAmaHVuZ191cF90dHlfZm9wczsKIAl9CiAJZmlsZV9saXN0X3VubG9jaygpOwotCS8qCi0JICogRklYTUUhIFdoYXQgYXJlIHRoZSBsb2NraW5nIGlzc3VlcyBoZXJlPyBUaGlzIG1heSBtZSBvdmVyZG9pbmcKLQkgKiB0aGluZ3MuLi4gVGhpcyBxdWVzdGlvbiBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBub3cgdGhhdCB3ZSd2ZQotCSAqIHJlbW92ZWQgdGhlIGlycWxvY2suCi0JICovCi0JbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7Ci0JaWYgKGxkICE9IE5VTEwpIHsKLQkJLyogV2UgbWF5IGhhdmUgbm8gbGluZSBkaXNjaXBsaW5lIGF0IHRoaXMgcG9pbnQgKi8KLQkJaWYgKGxkLT5vcHMtPmZsdXNoX2J1ZmZlcikKLQkJCWxkLT5vcHMtPmZsdXNoX2J1ZmZlcih0dHkpOwotCQl0dHlfZHJpdmVyX2ZsdXNoX2J1ZmZlcih0dHkpOwotCQlpZiAoKHRlc3RfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKSkgJiYKLQkJICAgIGxkLT5vcHMtPndyaXRlX3dha2V1cCkKLQkJCWxkLT5vcHMtPndyaXRlX3dha2V1cCh0dHkpOwotCQlpZiAobGQtPm9wcy0+aGFuZ3VwKQotCQkJbGQtPm9wcy0+aGFuZ3VwKHR0eSk7Ci0JfQotCS8qCi0JICogRklYTUU6IE9uY2Ugd2UgdHJ1c3QgdGhlIExESVNDIGNvZGUgYmV0dGVyIHdlIGNhbiB3YWl0IGhlcmUgZm9yCi0JICogbGRpc2MgY29tcGxldGlvbiBhbmQgZml4IHRoZSBkcml2ZXIgY2FsbCByYWNlCi0JICovCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoJnR0eS0+d3JpdGVfd2FpdCwgUE9MTE9VVCk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoJnR0eS0+cmVhZF93YWl0LCBQT0xMSU4pOwotCS8qCi0JICogU2h1dGRvd24gdGhlIGN1cnJlbnQgbGluZSBkaXNjaXBsaW5lLCBhbmQgcmVzZXQgaXQgdG8KLQkgKiBOX1RUWS4KLQkgKi8KLQlpZiAodHR5LT5kcml2ZXItPmZsYWdzICYgVFRZX0RSSVZFUl9SRVNFVF9URVJNSU9TKQotCQl0dHlfcmVzZXRfdGVybWlvcyh0dHkpOwotCS8qIERlZmVyIGxkaXNjIHN3aXRjaCAqLwotCS8qIHR0eV9kZWZlcnJlZF9sZGlzY19zd2l0Y2goTl9UVFkpOwogCi0JICBUaGlzIHNob3VsZCBnZXQgZG9uZSBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIHBvcnQgY2xvc2VzIGFuZAotCSAgdHR5X3JlbGVhc2UgaXMgY2FsbGVkICovCisJdHR5X2xkaXNjX2hhbmd1cCh0dHkpOwogCiAJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAlpZiAodHR5LT5zZXNzaW9uKSB7CkBAIC02MjgsMTIgKzU1OSwxNSBAQAogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHktPmN0cmxfbG9jaywgZmxhZ3MpOwotCXR0eS0+ZmxhZ3MgPSAwOworCWNsZWFyX2JpdChUVFlfVEhST1RUTEVELCAmdHR5LT5mbGFncyk7CisJY2xlYXJfYml0KFRUWV9QVVNILCAmdHR5LT5mbGFncyk7CisJY2xlYXJfYml0KFRUWV9ET19XUklURV9XQUtFVVAsICZ0dHktPmZsYWdzKTsKIAlwdXRfcGlkKHR0eS0+c2Vzc2lvbik7CiAJcHV0X3BpZCh0dHktPnBncnApOwogCXR0eS0+c2Vzc2lvbiA9IE5VTEw7CiAJdHR5LT5wZ3JwID0gTlVMTDsKIAl0dHktPmN0cmxfc3RhdHVzID0gMDsKKwlzZXRfYml0KFRUWV9IVVBQRUQsICZ0dHktPmZsYWdzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHktPmN0cmxfbG9jaywgZmxhZ3MpOwogCiAJLyogQWNjb3VudCBmb3IgdGhlIHAtPnNpZ25hbCByZWZlcmVuY2VzIHdlIGtpbGxlZCAqLwpAQCAtNjU5LDEwICs1OTMsNyBAQAogCSAqIGNhbid0IHlldCBndWFyYW50ZWUgYWxsIHRoYXQuCiAJICovCiAJc2V0X2JpdChUVFlfSFVQUEVELCAmdHR5LT5mbGFncyk7Ci0JaWYgKGxkKSB7Ci0JCXR0eV9sZGlzY19lbmFibGUodHR5KTsKLQkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKLQl9CisJdHR5X2xkaXNjX2VuYWJsZSh0dHkpOwogCXVubG9ja19rZXJuZWwoKTsKIAlpZiAoZikKIAkJZnB1dChmKTsKQEAgLTI0ODAsNiArMjQxMSwyNCBAQAogCXJldHVybiB0dHktPm9wcy0+dGlvY21zZXQodHR5LCBmaWxlLCBzZXQsIGNsZWFyKTsKIH0KIAorc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9wYWlyX2dldF90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAodHR5LT5kcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgorCSAgICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCisJCXR0eSA9IHR0eS0+bGluazsKKwlyZXR1cm4gdHR5OworfQorRVhQT1JUX1NZTUJPTCh0dHlfcGFpcl9nZXRfdHR5KTsKKworc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9wYWlyX2dldF9wdHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlpZiAodHR5LT5kcml2ZXItPnR5cGUgPT0gVFRZX0RSSVZFUl9UWVBFX1BUWSAmJgorCSAgICB0dHktPmRyaXZlci0+c3VidHlwZSA9PSBQVFlfVFlQRV9NQVNURVIpCisJICAgIHJldHVybiB0dHk7CisJcmV0dXJuIHR0eS0+bGluazsKK30KK0VYUE9SVF9TWU1CT0wodHR5X3BhaXJfZ2V0X3B0eSk7CisKIC8qCiAgKiBTcGxpdCB0aGlzIHVwLCBhcyBnY2MgY2FuIGNob2tlIG9uIGl0IG90aGVyd2lzZS4uCiAgKi8KQEAgLTI0OTUsMTEgKzI0NDQsNyBAQAogCWlmICh0dHlfcGFyYW5vaWFfY2hlY2sodHR5LCBpbm9kZSwgInR0eV9pb2N0bCIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJlYWxfdHR5ID0gdHR5OwotCWlmICh0dHktPmRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZICYmCi0JICAgIHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikKLQkJcmVhbF90dHkgPSB0dHktPmxpbms7Ci0KKwlyZWFsX3R0eSA9IHR0eV9wYWlyX2dldF90dHkodHR5KTsKIAogCS8qCiAJICogRmFjdG9yIG91dCBzb21lIGNvbW1vbiBwcmVwIHdvcmsKQEAgLTI1NTUsNyArMjUwMCw3IEBACiAJY2FzZSBUSU9DR1NJRDoKIAkJcmV0dXJuIHRpb2Nnc2lkKHR0eSwgcmVhbF90dHksIHApOwogCWNhc2UgVElPQ0dFVEQ6Ci0JCXJldHVybiBwdXRfdXNlcih0dHktPmxkaXNjLm9wcy0+bnVtLCAoaW50IF9fdXNlciAqKXApOworCQlyZXR1cm4gcHV0X3VzZXIodHR5LT5sZGlzYy0+b3BzLT5udW0sIChpbnQgX191c2VyICopcCk7CiAJY2FzZSBUSU9DU0VURDoKIAkJcmV0dXJuIHRpb2NzZXRkKHR0eSwgcCk7CiAJLyoKQEAgLTI3NzAsNiArMjcxNSw3IEBACiAJdHR5LT5idWYuaGVhZCA9IHR0eS0+YnVmLnRhaWwgPSBOVUxMOwogCXR0eV9idWZmZXJfaW5pdCh0dHkpOwogCW11dGV4X2luaXQoJnR0eS0+dGVybWlvc19tdXRleCk7CisJbXV0ZXhfaW5pdCgmdHR5LT5sZGlzY19tdXRleCk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmdHR5LT53cml0ZV93YWl0KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ0dHktPnJlYWRfd2FpdCk7CiAJSU5JVF9XT1JLKCZ0dHktPmhhbmd1cF93b3JrLCBkb190dHlfaGFuZ3VwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYyBiL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYwppbmRleCA2ZjRjN2QwLi44MTE2YmIxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9pb2N0bC5jCisrKyBiL2RyaXZlcnMvY2hhci90dHlfaW9jdGwuYwpAQCAtOTcsMTQgKzk3LDE5IEBACiAgKglAdHR5OiB0ZXJtaW5hbAogICoKICAqCUluZGljYXRlIHRoYXQgYSB0dHkgc2hvdWxkIHN0b3AgdHJhbnNtaXR0aW5nIGRhdGEgZG93biB0aGUgc3RhY2suCisgKglUYWtlcyB0aGUgdGVybWlvcyBtdXRleCB0byBwcm90ZWN0IGFnYWluc3QgcGFyYWxsZWwgdGhyb3R0bGUvdW50aHJvdHRsZQorICoJYW5kIGFsc28gdG8gZW5zdXJlIHRoZSBkcml2ZXIgY2FuIGNvbnNpc3RlbnRseSByZWZlcmVuY2UgaXRzIG93bgorICoJdGVybWlvcyBkYXRhIGF0IHRoaXMgcG9pbnQgd2hlbiBpbXBsZW1lbnRpbmcgc29mdHdhcmUgZmxvdyBjb250cm9sLgogICovCiAKIHZvaWQgdHR5X3Rocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CisJbXV0ZXhfbG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKIAkvKiBjaGVjayBUVFlfVEhST1RUTEVEIGZpcnN0IHNvIGl0IGluZGljYXRlcyBvdXIgc3RhdGUgKi8KIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVFRZX1RIUk9UVExFRCwgJnR0eS0+ZmxhZ3MpICYmCiAJICAgIHR0eS0+b3BzLT50aHJvdHRsZSkKIAkJdHR5LT5vcHMtPnRocm90dGxlKHR0eSk7CisJbXV0ZXhfdW5sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTCh0dHlfdGhyb3R0bGUpOwogCkBAIC0xMTMsMTMgKzExOCwyMSBAQAogICoJQHR0eTogdGVybWluYWwKICAqCiAgKglJbmRpY2F0ZSB0aGF0IGEgdHR5IG1heSBjb250aW51ZSB0cmFuc21pdHRpbmcgZGF0YSBkb3duIHRoZSBzdGFjay4KKyAqCVRha2VzIHRoZSB0ZXJtaW9zIG11dGV4IHRvIHByb3RlY3QgYWdhaW5zdCBwYXJhbGxlbCB0aHJvdHRsZS91bnRocm90dGxlCisgKglhbmQgYWxzbyB0byBlbnN1cmUgdGhlIGRyaXZlciBjYW4gY29uc2lzdGVudGx5IHJlZmVyZW5jZSBpdHMgb3duCisgKgl0ZXJtaW9zIGRhdGEgYXQgdGhpcyBwb2ludCB3aGVuIGltcGxlbWVudGluZyBzb2Z0d2FyZSBmbG93IGNvbnRyb2wuCisgKgorICoJRHJpdmVycyBzaG91bGQgaG93ZXZlciByZW1lbWJlciB0aGF0IHRoZSBzdGFjayBjYW4gaXNzdWUgYSB0aHJvdHRsZSwKKyAqCXRoZW4gY2hhbmdlIGZsb3cgY29udHJvbCBtZXRob2QsIHRoZW4gdW50aHJvdHRsZS4KICAqLwogCiB2b2lkIHR0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7CisJbXV0ZXhfbG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFRUWV9USFJPVFRMRUQsICZ0dHktPmZsYWdzKSAmJgogCSAgICB0dHktPm9wcy0+dW50aHJvdHRsZSkKIAkJdHR5LT5vcHMtPnVudGhyb3R0bGUodHR5KTsKKwltdXRleF91bmxvY2soJnR0eS0+dGVybWlvc19tdXRleCk7CiB9CiBFWFBPUlRfU1lNQk9MKHR0eV91bnRocm90dGxlKTsKIApAQCAtNjEzLDkgKzYyNiwyNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBjb3B5X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICprdGVybSkKK3sKKwltdXRleF9sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOworCW1lbWNweShrdGVybSwgdHR5LT50ZXJtaW9zLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CisJbXV0ZXhfdW5sb2NrKCZ0dHktPnRlcm1pb3NfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBjb3B5X3Rlcm1pb3NfbG9ja2VkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBrdGVybWlvcyAqa3Rlcm0pCit7CisJbXV0ZXhfbG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKKwltZW1jcHkoa3Rlcm0sIHR0eS0+dGVybWlvc19sb2NrZWQsIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKTsKKwltdXRleF91bmxvY2soJnR0eS0+dGVybWlvc19tdXRleCk7Cit9CisKIHN0YXRpYyBpbnQgZ2V0X3Rlcm1pbyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvIF9fdXNlciAqdGVybWlvKQogewotCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pbyh0ZXJtaW8sIHR0eS0+dGVybWlvcykpCisJc3RydWN0IGt0ZXJtaW9zIGt0ZXJtOworCWNvcHlfdGVybWlvcyh0dHksICZrdGVybSk7CisJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvKHRlcm1pbywgJmt0ZXJtKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CiB9CkBAIC05MTcsNiArOTQ2LDggQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqcmVhbF90dHk7CiAJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IHJldCA9IDA7CisJc3RydWN0IGt0ZXJtaW9zIGt0ZXJtOworCXN0cnVjdCB0ZXJtaW94IGt0ZXJteDsKIAogCWlmICh0dHktPmRyaXZlci0+dHlwZSA9PSBUVFlfRFJJVkVSX1RZUEVfUFRZICYmCiAJICAgIHR0eS0+ZHJpdmVyLT5zdWJ0eXBlID09IFBUWV9UWVBFX01BU1RFUikKQEAgLTk1MiwyMyArOTgzLDIwIEBACiAJCXJldHVybiBzZXRfdGVybWlvcyhyZWFsX3R0eSwgcCwgVEVSTUlPU19PTEQpOwogI2lmbmRlZiBUQ0dFVFMyCiAJY2FzZSBUQ0dFVFM6Ci0JCW11dGV4X2xvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKLQkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvcykpCisJCWNvcHlfdGVybWlvcyhyZWFsX3R0eSwgJmt0ZXJtKTsKKwkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCAma3Rlcm0pKQogCQkJcmV0ID0gLUVGQVVMVDsKLQkJbXV0ZXhfdW5sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CiAJCXJldHVybiByZXQ7CiAjZWxzZQogCWNhc2UgVENHRVRTOgotCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7Ci0JCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSgoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvcykpCisJCWNvcHlfdGVybWlvcyhyZWFsX3R0eSwgJmt0ZXJtKTsKKwkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvc18xKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsICZrdGVybSkpCiAJCQlyZXQgPSAtRUZBVUxUOwotCQltdXRleF91bmxvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKIAkJcmV0dXJuIHJldDsKIAljYXNlIFRDR0VUUzI6Ci0JCW11dGV4X2xvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKLQkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MyIF9fdXNlciAqKWFyZywgcmVhbF90dHktPnRlcm1pb3MpKQorCQljb3B5X3Rlcm1pb3MocmVhbF90dHksICZrdGVybSk7CisJCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3MoKHN0cnVjdCB0ZXJtaW9zMiBfX3VzZXIgKilhcmcsICZrdGVybSkpCiAJCQlyZXQgPSAtRUZBVUxUOwotCQltdXRleF91bmxvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKIAkJcmV0dXJuIHJldDsKIAljYXNlIFRDU0VUU0YyOgogCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsICBURVJNSU9TX0ZMVVNIIHwgVEVSTUlPU19XQUlUKTsKQEAgLTk4NywzNCArMTAxNSwzNiBAQAogCQlyZXR1cm4gc2V0X3Rlcm1pb3MocmVhbF90dHksIHAsIFRFUk1JT1NfVEVSTUlPKTsKICNpZm5kZWYgVENHRVRTMgogCWNhc2UgVElPQ0dMQ0tUUk1JT1M6Ci0JCW11dGV4X2xvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKLQkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcygoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvc19sb2NrZWQpKQorCQljb3B5X3Rlcm1pb3NfbG9ja2VkKHJlYWxfdHR5LCAma3Rlcm0pOworCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsICZrdGVybSkpCiAJCQlyZXQgPSAtRUZBVUxUOwotCQltdXRleF91bmxvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKIAkJcmV0dXJuIHJldDsKIAljYXNlIFRJT0NTTENLVFJNSU9TOgogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVQRVJNOwotCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7Ci0JCWlmICh1c2VyX3Rlcm1pb3NfdG9fa2VybmVsX3Rlcm1pb3MocmVhbF90dHktPnRlcm1pb3NfbG9ja2VkLAorCQljb3B5X3Rlcm1pb3NfbG9ja2VkKHJlYWxfdHR5LCAma3Rlcm0pOworCQlpZiAodXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zKCZrdGVybSwKIAkJCQkJICAgICAgIChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKikgYXJnKSkKLQkJCXJldCA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbXV0ZXhfbG9jaygmcmVhbF90dHktPnRlcm1pb3NfbXV0ZXgpOworCQltZW1jcHkocmVhbF90dHktPnRlcm1pb3NfbG9ja2VkLCAma3Rlcm0sIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiAwOwogI2Vsc2UKIAljYXNlIFRJT0NHTENLVFJNSU9TOgotCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7Ci0JCWlmIChrZXJuZWxfdGVybWlvc190b191c2VyX3Rlcm1pb3NfMSgoc3RydWN0IHRlcm1pb3MgX191c2VyICopYXJnLCByZWFsX3R0eS0+dGVybWlvc19sb2NrZWQpKQorCQljb3B5X3Rlcm1pb3NfbG9ja2VkKHJlYWxfdHR5LCAma3Rlcm0pOworCQlpZiAoa2VybmVsX3Rlcm1pb3NfdG9fdXNlcl90ZXJtaW9zXzEoKHN0cnVjdCB0ZXJtaW9zIF9fdXNlciAqKWFyZywgJmt0ZXJtKSkKIAkJCXJldCA9IC1FRkFVTFQ7Ci0JCW11dGV4X3VubG9jaygmcmVhbF90dHktPnRlcm1pb3NfbXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCWNhc2UgVElPQ1NMQ0tUUk1JT1M6CiAJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKLQkJCXJldCA9IC1FUEVSTTsKLQkJbXV0ZXhfbG9jaygmcmVhbF90dHktPnRlcm1pb3NfbXV0ZXgpOwotCQlpZiAodXNlcl90ZXJtaW9zX3RvX2tlcm5lbF90ZXJtaW9zXzEocmVhbF90dHktPnRlcm1pb3NfbG9ja2VkLAorCQkJcmV0dXJuIC1FUEVSTTsKKwkJY29weV90ZXJtaW9zX2xvY2tlZChyZWFsX3R0eSwgJmt0ZXJtKTsKKwkJaWYgKHVzZXJfdGVybWlvc190b19rZXJuZWxfdGVybWlvc18xKCZrdGVybSwKIAkJCQkJICAgICAgIChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKikgYXJnKSkKLQkJCXJldCA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbXV0ZXhfbG9jaygmcmVhbF90dHktPnRlcm1pb3NfbXV0ZXgpOworCQltZW1jcHkocmVhbF90dHktPnRlcm1pb3NfbG9ja2VkLCAma3Rlcm0sIHNpemVvZihzdHJ1Y3Qga3Rlcm1pb3MpKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CiAJCXJldHVybiByZXQ7CiAjZW5kaWYKQEAgLTEwMjMsOSArMTA1MywxMCBAQAogCQlpZiAocmVhbF90dHktPnRlcm1pb3ggPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwogCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIocCwgcmVhbF90dHktPnRlcm1pb3gsIHNpemVvZihzdHJ1Y3QgdGVybWlveCkpKQotCQkJcmV0ID0gLUVGQVVMVDsKKwkJbWVtY3B5KCZrdGVybXgsIHJlYWxfdHR5LT50ZXJtaW94LCBzaXplb2Yoc3RydWN0IHRlcm1pb3gpKTsKIAkJbXV0ZXhfdW5sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7CisJCWlmIChjb3B5X3RvX3VzZXIocCwgJmt0ZXJteCwgc2l6ZW9mKHN0cnVjdCB0ZXJtaW94KSkpCisJCQlyZXQgPSAtRUZBVUxUOwogCQlyZXR1cm4gcmV0OwogCWNhc2UgVENTRVRYOgogCQlyZXR1cm4gc2V0X3Rlcm1pb3gocmVhbF90dHksIHAsIDApOwpAQCAtMTAzNSwxMCArMTA2Niw5IEBACiAJCXJldHVybiBzZXRfdGVybWlveChyZWFsX3R0eSwgcCwgVEVSTUlPU19GTFVTSCk7CiAjZW5kaWYJCQogCWNhc2UgVElPQ0dTT0ZUQ0FSOgotCQltdXRleF9sb2NrKCZyZWFsX3R0eS0+dGVybWlvc19tdXRleCk7Ci0JCXJldCA9IHB1dF91c2VyKENfQ0xPQ0FMKHJlYWxfdHR5KSA/IDEgOiAwLAorCQljb3B5X3Rlcm1pb3MocmVhbF90dHksICZrdGVybSk7CisJCXJldCA9IHB1dF91c2VyKChrdGVybS5jX2NmbGFnICYgQ0xPQ0FMKSA/IDEgOiAwLAogCQkJCQkJKGludCBfX3VzZXIgKilhcmcpOwotCQltdXRleF91bmxvY2soJnJlYWxfdHR5LT50ZXJtaW9zX211dGV4KTsKIAkJcmV0dXJuIHJldDsKIAljYXNlIFRJT0NTU09GVENBUjoKIAkJaWYgKGdldF91c2VyKGFyZywgKHVuc2lnbmVkIGludCBfX3VzZXIgKikgYXJnKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfbGRpc2MuYyBiL2RyaXZlcnMvY2hhci90dHlfbGRpc2MuYwppbmRleCBmNzhmNWIwLi4zOWM4Zjg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHR5X2xkaXNjLmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9sZGlzYy5jCkBAIC0xMTUsMTkgKzExNSwyMiBAQAogLyoqCiAgKgl0dHlfbGRpc2NfdHJ5X2dldAktCXRyeSBhbmQgcmVmZXJlbmNlIGFuIGxkaXNjCiAgKglAZGlzYzogbGRpc2MgbnVtYmVyCi0gKglAbGQ6IHR0eSBsZGlzYyBzdHJ1Y3R1cmUgdG8gY29tcGxldGUKICAqCiAgKglBdHRlbXB0IHRvIG9wZW4gYW5kIGxvY2sgYSBsaW5lIGRpc2NpcGxpbmUgaW50byBwbGFjZS4gUmV0dXJuCi0gKgl0aGUgbGluZSBkaXNjaXBsaW5lIHJlZmNvdW50ZWQgYW5kIGFzc2lnbmVkIGluIGxkLiBPbiBhbiBlcnJvcgotICoJcmVwb3J0IHRoZSBlcnJvciBjb2RlIGJhY2sKKyAqCXRoZSBsaW5lIGRpc2NpcGxpbmUgcmVmY291bnRlZCBvciBhbiBlcnJvci4KICAqLwogCi1zdGF0aWMgaW50IHR0eV9sZGlzY190cnlfZ2V0KGludCBkaXNjLCBzdHJ1Y3QgdHR5X2xkaXNjICpsZCkKK3N0YXRpYyBzdHJ1Y3QgdHR5X2xkaXNjICp0dHlfbGRpc2NfdHJ5X2dldChpbnQgZGlzYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwogCXN0cnVjdCB0dHlfbGRpc2Nfb3BzICpsZG9wczsKIAlpbnQgZXJyID0gLUVJTlZBTDsKLQkKKworCWxkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHR0eV9sZGlzYyksIEdGUF9LRVJORUwpOworCWlmIChsZCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwogCWxkLT5vcHMgPSBOVUxMOwogCWxkb3BzID0gdHR5X2xkaXNjc1tkaXNjXTsKQEAgLTE0MCwxNyArMTQzLDE5IEBACiAJCQkvKiBsb2NrIGl0ICovCiAJCQlsZG9wcy0+cmVmY291bnQrKzsKIAkJCWxkLT5vcHMgPSBsZG9wczsKKwkJCWxkLT5yZWZjb3VudCA9IDA7CiAJCQllcnIgPSAwOwogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGVycjsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCXJldHVybiBsZDsKIH0KIAogLyoqCiAgKgl0dHlfbGRpc2NfZ2V0CQktCXRha2UgYSByZWZlcmVuY2UgdG8gYW4gbGRpc2MKICAqCUBkaXNjOiBsZGlzYyBudW1iZXIKLSAqCUBsZDogdHR5IGxpbmUgZGlzY2lwbGluZSBzdHJ1Y3R1cmUgdG8gdXNlCiAgKgogICoJVGFrZXMgYSByZWZlcmVuY2UgdG8gYSBsaW5lIGRpc2NpcGxpbmUuIERlYWxzIHdpdGggcmVmY291bnRzIGFuZAogICoJbW9kdWxlIGxvY2tpbmcgY291bnRzLiBSZXR1cm5zIE5VTEwgaWYgdGhlIGRpc2NpcGxpbmUgaXMgbm90IGF2YWlsYWJsZS4KQEAgLTE2MSw1MiArMTY2LDU0IEBACiAgKgkJdGFrZXMgdHR5X2xkaXNjX2xvY2sgdG8gZ3VhcmQgYWdhaW5zdCBsZGlzYyByYWNlcwogICovCiAKLXN0YXRpYyBpbnQgdHR5X2xkaXNjX2dldChpbnQgZGlzYywgc3RydWN0IHR0eV9sZGlzYyAqbGQpCitzdGF0aWMgc3RydWN0IHR0eV9sZGlzYyAqdHR5X2xkaXNjX2dldChpbnQgZGlzYykKIHsKLQlpbnQgZXJyOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwogCiAJaWYgKGRpc2MgPCBOX1RUWSB8fCBkaXNjID49IE5SX0xESVNDUykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZXJyID0gdHR5X2xkaXNjX3RyeV9nZXQoZGlzYywgbGQpOwotCWlmIChlcnIgPCAwKSB7CisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWxkID0gdHR5X2xkaXNjX3RyeV9nZXQoZGlzYyk7CisJaWYgKElTX0VSUihsZCkpIHsKIAkJcmVxdWVzdF9tb2R1bGUoInR0eS1sZGlzYy0lZCIsIGRpc2MpOwotCQllcnIgPSB0dHlfbGRpc2NfdHJ5X2dldChkaXNjLCBsZCk7CisJCWxkID0gdHR5X2xkaXNjX3RyeV9nZXQoZGlzYyk7CiAJfQotCXJldHVybiBlcnI7CisJcmV0dXJuIGxkOwogfQogCiAvKioKICAqCXR0eV9sZGlzY19wdXQJCS0JZHJvcCBsZGlzYyByZWZlcmVuY2UKLSAqCUBkaXNjOiBsZGlzYyBudW1iZXIKKyAqCUBsZDogbGRpc2MKICAqCiAgKglEcm9wIGEgcmVmZXJlbmNlIHRvIGEgbGluZSBkaXNjaXBsaW5lLiBNYW5hZ2UgcmVmY291bnRzIGFuZAotICoJbW9kdWxlIHVzYWdlIGNvdW50cworICoJbW9kdWxlIHVzYWdlIGNvdW50cy4gRnJlZSB0aGUgbGRpc2Mgb25jZSB0aGUgcmVjb3VudCBoaXRzIHplcm8uCiAgKgogICoJTG9ja2luZzoKICAqCQl0YWtlcyB0dHlfbGRpc2NfbG9jayB0byBndWFyZCBhZ2FpbnN0IGxkaXNjIHJhY2VzCiAgKi8KIAotc3RhdGljIHZvaWQgdHR5X2xkaXNjX3B1dChzdHJ1Y3QgdHR5X2xkaXNjX29wcyAqbGQpCitzdGF0aWMgdm9pZCB0dHlfbGRpc2NfcHV0KHN0cnVjdCB0dHlfbGRpc2MgKmxkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGRpc2MgPSBsZC0+bnVtOworCWludCBkaXNjID0gbGQtPm9wcy0+bnVtOworCXN0cnVjdCB0dHlfbGRpc2Nfb3BzICpsZG87CiAKIAlCVUdfT04oZGlzYyA8IE5fVFRZIHx8IGRpc2MgPj0gTlJfTERJU0NTKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwotCWxkID0gdHR5X2xkaXNjc1tkaXNjXTsKLQlCVUdfT04obGQtPnJlZmNvdW50ID09IDApOwotCWxkLT5yZWZjb3VudC0tOwotCW1vZHVsZV9wdXQobGQtPm93bmVyKTsKKwlsZG8gPSB0dHlfbGRpc2NzW2Rpc2NdOworCUJVR19PTihsZG8tPnJlZmNvdW50ID09IDApOworCWxkby0+cmVmY291bnQtLTsKKwltb2R1bGVfcHV0KGxkby0+b3duZXIpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJa2ZyZWUobGQpOwogfQogCi1zdGF0aWMgdm9pZCAqIHR0eV9sZGlzY3Nfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqdHR5X2xkaXNjc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKIAlyZXR1cm4gKCpwb3MgPCBOUl9MRElTQ1MpID8gcG9zIDogTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgKiB0dHlfbGRpc2NzX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCitzdGF0aWMgdm9pZCAqdHR5X2xkaXNjc19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewogCSgqcG9zKSsrOwogCXJldHVybiAoKnBvcyA8IE5SX0xESVNDUykgPyBwb3MgOiBOVUxMOwpAQCAtMjE5LDEyICsyMjYsMTMgQEAKIHN0YXRpYyBpbnQgdHR5X2xkaXNjc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CiAJaW50IGkgPSAqKGxvZmZfdCAqKXY7Ci0Jc3RydWN0IHR0eV9sZGlzYyBsZDsKLQkKLQlpZiAodHR5X2xkaXNjX2dldChpLCAmbGQpIDwgMCkKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKworCWxkID0gdHR5X2xkaXNjX3RyeV9nZXQoaSk7CisJaWYgKElTX0VSUihsZCkpCiAJCXJldHVybiAwOwotCXNlcV9wcmludGYobSwgIiUtMTBzICUyZFxuIiwgbGQub3BzLT5uYW1lID8gbGQub3BzLT5uYW1lIDogIj8/PyIsIGkpOwotCXR0eV9sZGlzY19wdXQobGQub3BzKTsKKwlzZXFfcHJpbnRmKG0sICIlLTEwcyAlMmRcbiIsIGxkLT5vcHMtPm5hbWUgPyBsZC0+b3BzLT5uYW1lIDogIj8/PyIsIGkpOworCXR0eV9sZGlzY19wdXQobGQpOwogCXJldHVybiAwOwogfQogCkBAIC0yNjMsOCArMjcxLDcgQEAKIAogc3RhdGljIHZvaWQgdHR5X2xkaXNjX2Fzc2lnbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X2xkaXNjICpsZCkKIHsKLQlsZC0+cmVmY291bnQgPSAwOwotCXR0eS0+bGRpc2MgPSAqbGQ7CisJdHR5LT5sZGlzYyA9IGxkOwogfQogCiAvKioKQEAgLTI4Niw3ICsyOTMsNyBAQAogCWludCByZXQgPSAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Ci0JbGQgPSAmdHR5LT5sZGlzYzsKKwlsZCA9IHR0eS0+bGRpc2M7CiAJaWYgKHRlc3RfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpKSB7CiAJCWxkLT5yZWZjb3VudCsrOwogCQlyZXQgPSAxOwpAQCAtMzE1LDEwICszMjIsOSBAQAogewogCS8qIHdhaXRfZXZlbnQgaXMgYSBtYWNybyAqLwogCXdhaXRfZXZlbnQodHR5X2xkaXNjX3dhaXQsIHR0eV9sZGlzY190cnkodHR5KSk7Ci0JV0FSTl9PTih0dHktPmxkaXNjLnJlZmNvdW50ID09IDApOwotCXJldHVybiAmdHR5LT5sZGlzYzsKKwlXQVJOX09OKHR0eS0+bGRpc2MtPnJlZmNvdW50ID09IDApOworCXJldHVybiB0dHktPmxkaXNjOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfcmVmX3dhaXQpOwogCiAvKioKQEAgLTMzNSwxMCArMzQxLDkgQEAKIHN0cnVjdCB0dHlfbGRpc2MgKnR0eV9sZGlzY19yZWYoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKIAlpZiAodHR5X2xkaXNjX3RyeSh0dHkpKQotCQlyZXR1cm4gJnR0eS0+bGRpc2M7CisJCXJldHVybiB0dHktPmxkaXNjOwogCXJldHVybiBOVUxMOwogfQotCiBFWFBPUlRfU1lNQk9MX0dQTCh0dHlfbGRpc2NfcmVmKTsKIAogLyoqCkBAIC0zNjYsNyArMzcxLDYgQEAKIAkJd2FrZV91cCgmdHR5X2xkaXNjX3dhaXQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CiB9Ci0KIEVYUE9SVF9TWU1CT0xfR1BMKHR0eV9sZGlzY19kZXJlZik7CiAKIC8qKgpAQCAtMzg5LDYgKzM5MywyNiBAQAogfQogCiAvKioKKyAqCXR0eV9sZGlzY19mbHVzaAktCWZsdXNoIGxpbmUgZGlzY2lwbGluZSBxdWV1ZQorICoJQHR0eTogdHR5CisgKgorICoJRmx1c2ggdGhlIGxpbmUgZGlzY2lwbGluZSBxdWV1ZSAoaWYgYW55KSBmb3IgdGhpcyB0dHkuIElmIHRoZXJlCisgKglpcyBubyBsaW5lIGRpc2NpcGxpbmUgYWN0aXZlIHRoaXMgaXMgYSBuby1vcC4KKyAqLworCit2b2lkIHR0eV9sZGlzY19mbHVzaChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkID0gdHR5X2xkaXNjX3JlZih0dHkpOworCWlmIChsZCkgeworCQlpZiAobGQtPm9wcy0+Zmx1c2hfYnVmZmVyKQorCQkJbGQtPm9wcy0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJfQorCXR0eV9idWZmZXJfZmx1c2godHR5KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHR0eV9sZGlzY19mbHVzaCk7CisKKy8qKgogICoJdHR5X3NldF90ZXJtaW9zX2xkaXNjCQktCXNldCBsZGlzYyBmaWVsZAogICoJQHR0eTogdHR5IHN0cnVjdHVyZQogICoJQG51bTogbGluZSBkaXNjaXBsaW5lIG51bWJlcgpAQCAtNDA3LDYgKzQzMSwzOSBAQAogCW11dGV4X3VubG9jaygmdHR5LT50ZXJtaW9zX211dGV4KTsKIH0KIAorLyoqCisgKgl0dHlfbGRpc2Nfb3BlbgkJLQlvcGVuIGEgbGluZSBkaXNjaXBsaW5lCisgKglAdHR5OiB0dHkgd2UgYXJlIG9wZW5pbmcgdGhlIGxkaXNjIG9uCisgKglAbGQ6IGRpc2NpcGxpbmUgdG8gb3BlbgorICoKKyAqCUEgaGVscGVyIG9wZW5pbmcgbWV0aG9kLiBBbHNvIGEgY29udmVuaWVudCBkZWJ1Z2dpbmcgYW5kIGNoZWNrCisgKglwb2ludC4KKyAqLworCitzdGF0aWMgaW50IHR0eV9sZGlzY19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfbGRpc2MgKmxkKQoreworCVdBUk5fT04odGVzdF9hbmRfc2V0X2JpdChUVFlfTERJU0NfT1BFTiwgJnR0eS0+ZmxhZ3MpKTsKKwlpZiAobGQtPm9wcy0+b3BlbikKKwkJcmV0dXJuIGxkLT5vcHMtPm9wZW4odHR5KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl0dHlfbGRpc2NfY2xvc2UJCS0JY2xvc2UgYSBsaW5lIGRpc2NpcGxpbmUKKyAqCUB0dHk6IHR0eSB3ZSBhcmUgb3BlbmluZyB0aGUgbGRpc2Mgb24KKyAqCUBsZDogZGlzY2lwbGluZSB0byBjbG9zZQorICoKKyAqCUEgaGVscGVyIGNsb3NlIG1ldGhvZC4gQWxzbyBhIGNvbnZlbmllbnQgZGVidWdnaW5nIGFuZCBjaGVjaworICoJcG9pbnQuCisgKi8KKworc3RhdGljIHZvaWQgdHR5X2xkaXNjX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfbGRpc2MgKmxkKQoreworCVdBUk5fT04oIXRlc3RfYml0KFRUWV9MRElTQ19PUEVOLCAmdHR5LT5mbGFncykpOworCWNsZWFyX2JpdChUVFlfTERJU0NfT1BFTiwgJnR0eS0+ZmxhZ3MpOworCWlmIChsZC0+b3BzLT5jbG9zZSkKKwkJbGQtPm9wcy0+Y2xvc2UodHR5KTsKK30KIAogLyoqCiAgKgl0dHlfbGRpc2NfcmVzdG9yZQktCWhlbHBlciBmb3IgdHR5IGxkaXNjIGNoYW5nZQpAQCAtNDIwLDY2ICs0NzcsMTM2IEBACiBzdGF0aWMgdm9pZCB0dHlfbGRpc2NfcmVzdG9yZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdHR5X2xkaXNjICpvbGQpCiB7CiAJY2hhciBidWZbNjRdOwotCXN0cnVjdCB0dHlfbGRpc2MgbmV3X2xkaXNjOworCXN0cnVjdCB0dHlfbGRpc2MgKm5ld19sZGlzYzsKKwlpbnQgcjsKIAogCS8qIFRoZXJlIGlzIGFuIG91dHN0YW5kaW5nIHJlZmVyZW5jZSBoZXJlIHNvIHRoaXMgaXMgc2FmZSAqLwotCXR0eV9sZGlzY19nZXQob2xkLT5vcHMtPm51bSwgb2xkKTsKKwlvbGQgPSB0dHlfbGRpc2NfZ2V0KG9sZC0+b3BzLT5udW0pOworCVdBUk5fT04oSVNfRVJSKG9sZCkpOwogCXR0eV9sZGlzY19hc3NpZ24odHR5LCBvbGQpOwogCXR0eV9zZXRfdGVybWlvc19sZGlzYyh0dHksIG9sZC0+b3BzLT5udW0pOwotCWlmIChvbGQtPm9wcy0+b3BlbiAmJiAob2xkLT5vcHMtPm9wZW4odHR5KSA8IDApKSB7Ci0JCXR0eV9sZGlzY19wdXQob2xkLT5vcHMpOworCWlmICh0dHlfbGRpc2Nfb3Blbih0dHksIG9sZCkgPCAwKSB7CisJCXR0eV9sZGlzY19wdXQob2xkKTsKIAkJLyogVGhpcyBkcml2ZXIgaXMgYWx3YXlzIHByZXNlbnQgKi8KLQkJaWYgKHR0eV9sZGlzY19nZXQoTl9UVFksICZuZXdfbGRpc2MpIDwgMCkKKwkJbmV3X2xkaXNjID0gdHR5X2xkaXNjX2dldChOX1RUWSk7CisJCWlmIChJU19FUlIobmV3X2xkaXNjKSkKIAkJCXBhbmljKCJuX3R0eTogZ2V0Iik7Ci0JCXR0eV9sZGlzY19hc3NpZ24odHR5LCAmbmV3X2xkaXNjKTsKKwkJdHR5X2xkaXNjX2Fzc2lnbih0dHksIG5ld19sZGlzYyk7CiAJCXR0eV9zZXRfdGVybWlvc19sZGlzYyh0dHksIE5fVFRZKTsKLQkJaWYgKG5ld19sZGlzYy5vcHMtPm9wZW4pIHsKLQkJCWludCByID0gbmV3X2xkaXNjLm9wcy0+b3Blbih0dHkpOwotCQkJCWlmIChyIDwgMCkKLQkJCQlwYW5pYygiQ291bGRuJ3Qgb3BlbiBOX1RUWSBsZGlzYyBmb3IgIgotCQkJCSAgICAgICIlcyAtLS0gZXJyb3IgJWQuIiwKLQkJCQkgICAgICB0dHlfbmFtZSh0dHksIGJ1ZiksIHIpOwotCQl9CisJCXIgPSB0dHlfbGRpc2Nfb3Blbih0dHksIG5ld19sZGlzYyk7CisJCWlmIChyIDwgMCkKKwkJCXBhbmljKCJDb3VsZG4ndCBvcGVuIE5fVFRZIGxkaXNjIGZvciAiCisJCQkgICAgICAiJXMgLS0tIGVycm9yICVkLiIsCisJCQkgICAgICB0dHlfbmFtZSh0dHksIGJ1ZiksIHIpOwogCX0KIH0KIAogLyoqCisgKgl0dHlfbGRpc2NfaGFsdAkJLQlzaHV0IGRvd24gdGhlIGxpbmUgZGlzY2lwbGluZQorICoJQHR0eTogdHR5IGRldmljZQorICoKKyAqCVNodXQgZG93biB0aGUgbGluZSBkaXNjaXBsaW5lIGFuZCB3b3JrIHF1ZXVlIGZvciB0aGlzIHR0eSBkZXZpY2UuCisgKglUaGUgVFRZX0xESVNDIGZsYWcgYmVpbmcgY2xlYXJlZCBlbnN1cmVzIG5vIGZ1cnRoZXIgcmVmZXJlbmNlcyBjYW4KKyAqCWJlIG9idGFpbmVkIHdoaWxlIHRoZSBkZWxheWVkIHdvcmsgcXVldWUgaGFsdCBlbnN1cmVzIHRoYXQgbm8gbW9yZQorICoJZGF0YSBpcyBmZWQgdG8gdGhlIGxkaXNjLgorICoKKyAqCUluIG9yZGVyIHRvIHdhaXQgZm9yIGFueSBleGlzdGluZyByZWZlcmVuY2VzIHRvIGNvbXBsZXRlIHNlZQorICoJdHR5X2xkaXNjX3dhaXRfaWRsZS4KKyAqLworCitzdGF0aWMgaW50IHR0eV9sZGlzY19oYWx0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJY2xlYXJfYml0KFRUWV9MRElTQywgJnR0eS0+ZmxhZ3MpOworCXJldHVybiBjYW5jZWxfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrKTsKK30KKworLyoqCisgKgl0dHlfbGRpc2Nfd2FpdF9pZGxlCS0Jd2FpdCBmb3IgdGhlIGxkaXNjIHRvIGJlY29tZSBpZGxlCisgKglAdHR5OiB0dHkgdG8gd2FpdCBmb3IKKyAqCisgKglXYWl0IGZvciB0aGUgbGluZSBkaXNjaXBsaW5lIHRvIGJlY29tZSBpZGxlLiBUaGUgZGlzY2lwbGluZSBtdXN0CisgKgloYXZlIGJlZW4gaGFsdGVkIGZvciB0aGlzIHRvIGd1YXJhbnRlZSBpdCByZW1haW5zIGlkbGUuCisgKgorICoJdHR5X2xkaXNjX2xvY2sgcHJvdGVjdHMgdGhlIHJlZiBjb3VudHMgY3VycmVudGx5LgorICovCisKK3N0YXRpYyBpbnQgdHR5X2xkaXNjX3dhaXRfaWRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJd2hpbGUgKHR0eS0+bGRpc2MtPnJlZmNvdW50KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJCWlmICh3YWl0X2V2ZW50X3RpbWVvdXQodHR5X2xkaXNjX3dhaXQsCisJCQkJdHR5LT5sZGlzYy0+cmVmY291bnQgPT0gMCwgNSAqIEhaKSA9PSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgogICoJdHR5X3NldF9sZGlzYwkJLQlzZXQgbGluZSBkaXNjaXBsaW5lCiAgKglAdHR5OiB0aGUgdGVybWluYWwgdG8gc2V0CiAgKglAbGRpc2M6IHRoZSBsaW5lIGRpc2NpcGxpbmUKICAqCiAgKglTZXQgdGhlIGRpc2NpcGxpbmUgb2YgYSB0dHkgbGluZS4gTXVzdCBiZSBjYWxsZWQgZnJvbSBhIHByb2Nlc3MKLSAqCWNvbnRleHQuCisgKgljb250ZXh0LiBUaGUgbGRpc2MgY2hhbmdlIGxvZ2ljIGhhcyB0byBwcm90ZWN0IGl0c2VsZiBhZ2FpbnN0IGFueQorICoJb3ZlcmxhcHBpbmcgbGRpc2MgY2hhbmdlIChpbmNsdWRpbmcgb24gdGhlIG90aGVyIGVuZCBvZiBwdHkgcGFpcnMpLAorICoJdGhlIGNsb3NlIG9mIG9uZSBzaWRlIG9mIGEgdHR5L3B0eSBwYWlyLCBhbmQgZXZlbnR1YWxseSBoYW5ndXAuCiAgKgotICoJTG9ja2luZzogdGFrZXMgdHR5X2xkaXNjX2xvY2suCi0gKgkJIGNhbGxlZCBmdW5jdGlvbnMgdGFrZSB0ZXJtaW9zX211dGV4CisgKglMb2NraW5nOiB0YWtlcyB0dHlfbGRpc2NfbG9jaywgdGVybWlvc19tdXRleAogICovCiAKIGludCB0dHlfc2V0X2xkaXNjKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBsZGlzYykKIHsKIAlpbnQgcmV0dmFsOwotCXN0cnVjdCB0dHlfbGRpc2Mgb19sZGlzYywgbmV3X2xkaXNjOwotCWludCB3b3JrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHR0eV9sZGlzYyAqb19sZGlzYywgKm5ld19sZGlzYzsKKwlpbnQgd29yaywgb193b3JrID0gMDsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqb190dHk7CiAKLXJlc3RhcnQ6Ci0JLyogVGhpcyBpcyBhIGJpdCB1Z2x5IGZvciBub3cgYnV0IG1lYW5zIHdlIGNhbiBicmVhayB0aGUgJ2xkaXNjCi0JICAgaXMgcGFydCBvZiB0aGUgdHR5IHN0cnVjdCcgYXNzdW1wdGlvbiBsYXRlciAqLwotCXJldHZhbCA9IHR0eV9sZGlzY19nZXQobGRpc2MsICZuZXdfbGRpc2MpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisJbmV3X2xkaXNjID0gdHR5X2xkaXNjX2dldChsZGlzYyk7CisJaWYgKElTX0VSUihuZXdfbGRpc2MpKQorCQlyZXR1cm4gUFRSX0VSUihuZXdfbGRpc2MpOworCisJLyoKKwkgKglXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIHR0eSBsb2NraW5nIGhlcmUgZm9yIHB0eS90dHkgcGFpcnMKKwkgKgl3aGVuIGJvdGggc2lkZXMgdHJ5IHRvIGNoYW5nZSBpbiBwYXJhbGxlbC4KKwkgKi8KKworCW9fdHR5ID0gdHR5LT5saW5rOwkvKiBvX3R0eSBpcyB0aGUgcHR5IHNpZGUgb3IgTlVMTCAqLworCisKKwkvKgorCSAqCUNoZWNrIHRoZSBuby1vcCBjYXNlCisJICovCisKKwlpZiAodHR5LT5sZGlzYy0+b3BzLT5udW0gPT0gbGRpc2MpIHsKKwkJdHR5X2xkaXNjX3B1dChuZXdfbGRpc2MpOworCQlyZXR1cm4gMDsKKwl9CiAKIAkvKgogCSAqCVByb2JsZW06IFdoYXQgZG8gd2UgZG8gaWYgdGhpcyBibG9ja3MgPworCSAqCVdlIGNvdWxkIGRlYWRsb2NrIGhlcmUKIAkgKi8KIAogCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKIAotCWlmICh0dHktPmxkaXNjLm9wcy0+bnVtID09IGxkaXNjKSB7Ci0JCXR0eV9sZGlzY19wdXQobmV3X2xkaXNjLm9wcyk7Ci0JCXJldHVybiAwOworCW11dGV4X2xvY2soJnR0eS0+bGRpc2NfbXV0ZXgpOworCisJLyoKKwkgKglXZSBjb3VsZCBiZSBtaWRzdHJlYW0gb2YgYW5vdGhlciBsZGlzYyBjaGFuZ2Ugd2hpY2ggaGFzCisJICoJZHJvcHBlZCB0aGUgbG9jayBkdXJpbmcgcHJvY2Vzc2luZy4gSWYgc28gd2UgbmVlZCB0byB3YWl0LgorCSAqLworCisJd2hpbGUgKHRlc3RfYml0KFRUWV9MRElTQ19DSEFOR0lORywgJnR0eS0+ZmxhZ3MpKSB7CisJCW11dGV4X3VubG9jaygmdHR5LT5sZGlzY19tdXRleCk7CisJCXdhaXRfZXZlbnQodHR5X2xkaXNjX3dhaXQsCisJCQl0ZXN0X2JpdChUVFlfTERJU0NfQ0hBTkdJTkcsICZ0dHktPmZsYWdzKSA9PSAwKTsKKwkJbXV0ZXhfbG9jaygmdHR5LT5sZGlzY19tdXRleCk7CiAJfQorCXNldF9iaXQoVFRZX0xESVNDX0NIQU5HSU5HLCAmdHR5LT5mbGFncyk7CiAKIAkvKgogCSAqCU5vIG1vcmUgaW5wdXQgcGxlYXNlLCB3ZSBhcmUgc3dpdGNoaW5nLiBUaGUgbmV3IGxkaXNjCkBAIC00ODksOCArNjE2LDYgQEAKIAl0dHktPnJlY2VpdmVfcm9vbSA9IDA7CiAKIAlvX2xkaXNjID0gdHR5LT5sZGlzYzsKLQlvX3R0eSA9IHR0eS0+bGluazsKLQogCS8qCiAJICoJTWFrZSBzdXJlIHdlIGRvbid0IGNoYW5nZSB3aGlsZSBzb21lb25lIGhvbGRzIGEKIAkgKglyZWZlcmVuY2UgdG8gdGhlIGxpbmUgZGlzY2lwbGluZS4gVGhlIFRUWV9MRElTQyBiaXQKQEAgLTUwMSwxMDggKzYyNiwxODEgQEAKIAkgKgl3aXRoIGEgdXNlcnNwYWNlIGFwcCBjb250aW51YWxseSB0cnlpbmcgdG8gdXNlIHRoZSB0dHkgaW4KIAkgKglwYXJhbGxlbCB0byB0aGUgY2hhbmdlIGFuZCByZS1yZWZlcmVuY2luZyB0aGUgdHR5LgogCSAqLwotCWNsZWFyX2JpdChUVFlfTERJU0MsICZ0dHktPmZsYWdzKTsKLQlpZiAob190dHkpCi0JCWNsZWFyX2JpdChUVFlfTERJU0MsICZvX3R0eS0+ZmxhZ3MpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Ci0JaWYgKHR0eS0+bGRpc2MucmVmY291bnQgfHwgKG9fdHR5ICYmIG9fdHR5LT5sZGlzYy5yZWZjb3VudCkpIHsKLQkJaWYgKHR0eS0+bGRpc2MucmVmY291bnQpIHsKLQkJCS8qIEZyZWUgdGhlIG5ldyBsZGlzYyB3ZSBncmFiYmVkLiBNdXN0IGRyb3AgdGhlIGxvY2sKLQkJCSAgIGZpcnN0LiAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHR5X2xkaXNjX2xvY2ssIGZsYWdzKTsKLQkJCXR0eV9sZGlzY19wdXQob19sZGlzYy5vcHMpOwotCQkJLyoKLQkJCSAqIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2UgbWF5IGJlIGJ1c3ksIGluY2x1ZGluZwotCQkJICogcmFuZG9tIG1vbWVudGFyeSBJL08gdHJhZmZpYy4gV2UgbXVzdCB0aGVyZWZvcmUKLQkJCSAqIHJldHJ5LiBXZSBjb3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGJsb2NraW5nIG9wcwotCQkJICogYW5kIHJldHJpZXMgaWYgd2UgbWFkZSB0dHlfbGRpc2Nfd2FpdCgpIHNtYXJ0ZXIuCi0JCQkgKiBUaGF0IGlzIHVwIGZvciBkaXNjdXNzaW9uLgotCQkJICovCi0JCQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHR0eV9sZGlzY193YWl0LCB0dHktPmxkaXNjLnJlZmNvdW50ID09IDApIDwgMCkKLQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQkJZ290byByZXN0YXJ0OwotCQl9Ci0JCWlmIChvX3R0eSAmJiBvX3R0eS0+bGRpc2MucmVmY291bnQpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Ci0JCQl0dHlfbGRpc2NfcHV0KG9fdHR5LT5sZGlzYy5vcHMpOwotCQkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSh0dHlfbGRpc2Nfd2FpdCwgb190dHktPmxkaXNjLnJlZmNvdW50ID09IDApIDwgMCkKLQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQkJZ290byByZXN0YXJ0OwotCQl9Ci0JfQotCS8qCi0JICoJSWYgdGhlIFRUWV9MRElTQyBiaXQgaXMgc2V0LCB0aGVuIHdlIGFyZSByYWNpbmcgYWdhaW5zdAotCSAqCWFub3RoZXIgbGRpc2MgY2hhbmdlCi0JICovCi0JaWYgKHRlc3RfYml0KFRUWV9MRElTQ19DSEFOR0lORywgJnR0eS0+ZmxhZ3MpKSB7Ci0JCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwotCQl0dHlfbGRpc2NfcHV0KG5ld19sZGlzYy5vcHMpOwotCQlsZCA9IHR0eV9sZGlzY19yZWZfd2FpdCh0dHkpOwotCQl0dHlfbGRpc2NfZGVyZWYobGQpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCS8qCi0JICoJVGhpcyBmbGFnIGlzIHVzZWQgdG8gYXZvaWQgdHdvIHBhcmFsbGVsIGxkaXNjIGNoYW5nZXMuIE9uY2UKLQkgKglvcGVuIGFuZCBjbG9zZSBhcmUgZmluZSBncmFpbmVkIGxvY2tlZCB0aGlzIG1heSB3b3JrIGJldHRlcgotCSAqCWFzIGEgbXV0ZXggc2hhcmVkIHdpdGggdGhlIG9wZW4vY2xvc2UvaHVwIHBhdGhzCi0JICovCi0Jc2V0X2JpdChUVFlfTERJU0NfQ0hBTkdJTkcsICZ0dHktPmZsYWdzKTsKKwl3b3JrID0gdHR5X2xkaXNjX2hhbHQodHR5KTsKIAlpZiAob190dHkpCi0JCXNldF9iaXQoVFRZX0xESVNDX0NIQU5HSU5HLCAmb190dHktPmZsYWdzKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwotCQorCQlvX3dvcmsgPSB0dHlfbGRpc2NfaGFsdChvX3R0eSk7CisKIAkvKgotCSAqCUZyb20gdGhpcyBwb2ludCBvbiB3ZSBrbm93IG5vYm9keSBoYXMgYW4gbGRpc2MKLQkgKgl1c2FnZSByZWZlcmVuY2UsIG5vciBjYW4gdGhleSBvYnRhaW4gb25lIHVudGlsCi0JICoJd2Ugc2F5IHNvIGxhdGVyIG9uLgorCSAqIFdhaXQgZm9yIC0+aGFuZ3VwX3dvcmsgYW5kIC0+YnVmLndvcmsgaGFuZGxlcnMgdG8gdGVybWluYXRlLgorCSAqIFdlIG11c3QgZHJvcCB0aGUgbXV0ZXggaGVyZSBpbiBjYXNlIGEgaGFuZ3VwIGlzIGFsc28gaW4gcHJvY2Vzcy4KIAkgKi8KIAotCXdvcmsgPSBjYW5jZWxfZGVsYXllZF93b3JrKCZ0dHktPmJ1Zi53b3JrKTsKLQkvKgotCSAqIFdhaXQgZm9yIC0+aGFuZ3VwX3dvcmsgYW5kIC0+YnVmLndvcmsgaGFuZGxlcnMgdG8gdGVybWluYXRlCi0JICogTVVTVCBOT1QgaG9sZCBsb2NrcyBoZXJlLgotCSAqLworCW11dGV4X3VubG9jaygmdHR5LT5sZGlzY19tdXRleCk7CisKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCisJLyogTGV0IGFueSBleGlzdGluZyByZWZlcmVuY2UgaG9sZGVycyBmaW5pc2ggKi8KKwlyZXR2YWwgPSB0dHlfbGRpc2Nfd2FpdF9pZGxlKHR0eSk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJY2xlYXJfYml0KFRUWV9MRElTQ19DSEFOR0lORywgJnR0eS0+ZmxhZ3MpOworCQl0dHlfbGRpc2NfcHV0KG5ld19sZGlzYyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJbXV0ZXhfbG9jaygmdHR5LT5sZGlzY19tdXRleCk7CisJaWYgKHRlc3RfYml0KFRUWV9IVVBQRUQsICZ0dHktPmZsYWdzKSkgeworCQkvKiBXZSB3ZXJlIHJhY2VkIGJ5IHRoZSBoYW5ndXAgbWV0aG9kLiBJdCB3aWxsIGhhdmUgc3RvbXBlZAorCQkgICB0aGUgbGRpc2MgZGF0YSBhbmQgY2xvc2VkIHRoZSBsZGlzYyBkb3duICovCisJCWNsZWFyX2JpdChUVFlfTERJU0NfQ0hBTkdJTkcsICZ0dHktPmZsYWdzKTsKKwkJbXV0ZXhfdW5sb2NrKCZ0dHktPmxkaXNjX211dGV4KTsKKwkJdHR5X2xkaXNjX3B1dChuZXdfbGRpc2MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKIAkvKiBTaHV0ZG93biB0aGUgY3VycmVudCBkaXNjaXBsaW5lLiAqLwotCWlmIChvX2xkaXNjLm9wcy0+Y2xvc2UpCi0JCShvX2xkaXNjLm9wcy0+Y2xvc2UpKHR0eSk7CisJdHR5X2xkaXNjX2Nsb3NlKHR0eSwgb19sZGlzYyk7CiAKIAkvKiBOb3cgc2V0IHVwIHRoZSBuZXcgbGluZSBkaXNjaXBsaW5lLiAqLwotCXR0eV9sZGlzY19hc3NpZ24odHR5LCAmbmV3X2xkaXNjKTsKKwl0dHlfbGRpc2NfYXNzaWduKHR0eSwgbmV3X2xkaXNjKTsKIAl0dHlfc2V0X3Rlcm1pb3NfbGRpc2ModHR5LCBsZGlzYyk7Ci0JaWYgKG5ld19sZGlzYy5vcHMtPm9wZW4pCi0JCXJldHZhbCA9IChuZXdfbGRpc2Mub3BzLT5vcGVuKSh0dHkpOworCisJcmV0dmFsID0gdHR5X2xkaXNjX29wZW4odHR5LCBuZXdfbGRpc2MpOwogCWlmIChyZXR2YWwgPCAwKSB7Ci0JCXR0eV9sZGlzY19wdXQobmV3X2xkaXNjLm9wcyk7Ci0JCXR0eV9sZGlzY19yZXN0b3JlKHR0eSwgJm9fbGRpc2MpOworCQkvKiBCYWNrIHRvIHRoZSBvbGQgb25lIG9yIE5fVFRZIGlmIHdlIGNhbid0ICovCisJCXR0eV9sZGlzY19wdXQobmV3X2xkaXNjKTsKKwkJdHR5X2xkaXNjX3Jlc3RvcmUodHR5LCBvX2xkaXNjKTsKIAl9CisKIAkvKiBBdCB0aGlzIHBvaW50IHdlIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIG5ldyBsZGlzYyBhbmQgYQogCSAgIGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgbGRpc2MuIElmIHdlIGVuZGVkIHVwIGZsaXBwaW5nIGJhY2sKIAkgICB0byB0aGUgZXhpc3RpbmcgbGRpc2Mgd2UgaGF2ZSB0d28gcmVmZXJlbmNlcyB0byBpdCAqLwogCi0JaWYgKHR0eS0+bGRpc2Mub3BzLT5udW0gIT0gb19sZGlzYy5vcHMtPm51bSAmJiB0dHktPm9wcy0+c2V0X2xkaXNjKQorCWlmICh0dHktPmxkaXNjLT5vcHMtPm51bSAhPSBvX2xkaXNjLT5vcHMtPm51bSAmJiB0dHktPm9wcy0+c2V0X2xkaXNjKQogCQl0dHktPm9wcy0+c2V0X2xkaXNjKHR0eSk7CiAKLQl0dHlfbGRpc2NfcHV0KG9fbGRpc2Mub3BzKTsKKwl0dHlfbGRpc2NfcHV0KG9fbGRpc2MpOwogCiAJLyoKLQkgKglBbGxvdyBsZGlzYyByZWZlcmVuY2luZyB0byBvY2N1ciBhcyBzb29uIGFzIHRoZSBkcml2ZXIKLQkgKglsZGlzYyBjYWxsYmFjayBjb21wbGV0ZXMuCisJICoJQWxsb3cgbGRpc2MgcmVmZXJlbmNpbmcgdG8gb2NjdXIgYWdhaW4KIAkgKi8KIAogCXR0eV9sZGlzY19lbmFibGUodHR5KTsKIAlpZiAob190dHkpCiAJCXR0eV9sZGlzY19lbmFibGUob190dHkpOwogCi0JLyogUmVzdGFydCBpdCBpbiBjYXNlIG5vIGNoYXJhY3RlcnMga2ljayBpdCBvZmYuIFNhZmUgaWYKKwkvKiBSZXN0YXJ0IHRoZSB3b3JrIHF1ZXVlIGluIGNhc2Ugbm8gY2hhcmFjdGVycyBraWNrIGl0IG9mZi4gU2FmZSBpZgogCSAgIGFscmVhZHkgcnVubmluZyAqLwogCWlmICh3b3JrKQogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnR0eS0+YnVmLndvcmssIDEpOworCWlmIChvX3dvcmspCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmb190dHktPmJ1Zi53b3JrLCAxKTsKKwltdXRleF91bmxvY2soJnR0eS0+bGRpc2NfbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKKy8qKgorICoJdHR5X3Jlc2V0X3Rlcm1pb3MJLQlyZXNldCB0ZXJtaW5hbCBzdGF0ZQorICoJQHR0eTogdHR5IHRvIHJlc2V0CisgKgorICoJUmVzdG9yZSBhIHRlcm1pbmFsIHRvIHRoZSBkcml2ZXIgZGVmYXVsdCBzdGF0ZS4KKyAqLworCitzdGF0aWMgdm9pZCB0dHlfcmVzZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCW11dGV4X2xvY2soJnR0eS0+dGVybWlvc19tdXRleCk7CisJKnR0eS0+dGVybWlvcyA9IHR0eS0+ZHJpdmVyLT5pbml0X3Rlcm1pb3M7CisJdHR5LT50ZXJtaW9zLT5jX2lzcGVlZCA9IHR0eV90ZXJtaW9zX2lucHV0X2JhdWRfcmF0ZSh0dHktPnRlcm1pb3MpOworCXR0eS0+dGVybWlvcy0+Y19vc3BlZWQgPSB0dHlfdGVybWlvc19iYXVkX3JhdGUodHR5LT50ZXJtaW9zKTsKKwltdXRleF91bmxvY2soJnR0eS0+dGVybWlvc19tdXRleCk7Cit9CisKKworLyoqCisgKgl0dHlfbGRpc2NfcmVpbml0CS0JcmVpbml0aWFsaXNlIHRoZSB0dHkgbGRpc2MKKyAqCUB0dHk6IHR0eSB0byByZWluaXQKKyAqCisgKglTd2l0Y2ggdGhlIHR0eSBiYWNrIHRvIE5fVFRZIGxpbmUgZGlzY2lwbGluZSBhbmQgbGVhdmUgdGhlCisgKglsZGlzYyBzdGF0ZSBjbG9zZWQKKyAqLworCitzdGF0aWMgdm9pZCB0dHlfbGRpc2NfcmVpbml0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHR0eV9sZGlzYyAqbGQ7CisKKwl0dHlfbGRpc2NfY2xvc2UodHR5LCB0dHktPmxkaXNjKTsKKwl0dHlfbGRpc2NfcHV0KHR0eS0+bGRpc2MpOworCXR0eS0+bGRpc2MgPSBOVUxMOworCS8qCisJICoJU3dpdGNoIHRoZSBsaW5lIGRpc2NpcGxpbmUgYmFjaworCSAqLworCWxkID0gdHR5X2xkaXNjX2dldChOX1RUWSk7CisJQlVHX09OKElTX0VSUihsZCkpOworCXR0eV9sZGlzY19hc3NpZ24odHR5LCBsZCk7CisJdHR5X3NldF90ZXJtaW9zX2xkaXNjKHR0eSwgTl9UVFkpOworfQorCisvKioKKyAqCXR0eV9sZGlzY19oYW5ndXAJCS0JaGFuZ3VwIGxkaXNjIHJlc2V0CisgKglAdHR5OiB0dHkgYmVpbmcgaHVuZyB1cAorICoKKyAqCVNvbWUgdHR5IGRldmljZXMgcmVzZXQgdGhlaXIgdGVybWlvcyB3aGVuIHRoZXkgcmVjZWl2ZSBhIGhhbmd1cAorICoJZXZlbnQuIEluIHRoYXQgc2l0dWF0aW9uIHdlIG11c3QgYWxzbyBzd2l0Y2ggYmFjayB0byBOX1RUWSBwcm9wZXJseQorICoJYmVmb3JlIHdlIHJlc2V0IHRoZSB0ZXJtaW9zIGRhdGEuCisgKgorICoJTG9ja2luZzogV2UgY2FuIHRha2UgdGhlIGxkaXNjIG11dGV4IGFzIHRoZSByZXN0IG9mIHRoZSBjb2RlIGlzCisgKgljYXJlZnVsIHRvIGFsbG93IGZvciB0aGlzLgorICoKKyAqCUluIHRoZSBwdHkgcGFpciBjYXNlIHRoaXMgb2NjdXJzIGluIHRoZSBjbG9zZSgpIHBhdGggb2YgdGhlCisgKgl0dHkgaXRzZWxmIHNvIHdlIG11c3QgYmUgY2FyZWZ1bCBhYm91dCBsb2NraW5nIHJ1bGVzLgorICovCisKK3ZvaWQgdHR5X2xkaXNjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCisJLyoKKwkgKiBGSVhNRSEgV2hhdCBhcmUgdGhlIGxvY2tpbmcgaXNzdWVzIGhlcmU/IFRoaXMgbWF5IG1lIG92ZXJkb2luZworCSAqIHRoaW5ncy4uLiBUaGlzIHF1ZXN0aW9uIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IG5vdyB0aGF0IHdlJ3ZlCisJICogcmVtb3ZlZCB0aGUgaXJxbG9jay4KKwkgKi8KKwlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwlpZiAobGQgIT0gTlVMTCkgeworCQkvKiBXZSBtYXkgaGF2ZSBubyBsaW5lIGRpc2NpcGxpbmUgYXQgdGhpcyBwb2ludCAqLworCQlpZiAobGQtPm9wcy0+Zmx1c2hfYnVmZmVyKQorCQkJbGQtPm9wcy0+Zmx1c2hfYnVmZmVyKHR0eSk7CisJCXR0eV9kcml2ZXJfZmx1c2hfYnVmZmVyKHR0eSk7CisJCWlmICgodGVzdF9iaXQoVFRZX0RPX1dSSVRFX1dBS0VVUCwgJnR0eS0+ZmxhZ3MpKSAmJgorCQkgICAgbGQtPm9wcy0+d3JpdGVfd2FrZXVwKQorCQkJbGQtPm9wcy0+d3JpdGVfd2FrZXVwKHR0eSk7CisJCWlmIChsZC0+b3BzLT5oYW5ndXApCisJCQlsZC0+b3BzLT5oYW5ndXAodHR5KTsKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwl9CisJLyoKKwkgKiBGSVhNRTogT25jZSB3ZSB0cnVzdCB0aGUgTERJU0MgY29kZSBiZXR0ZXIgd2UgY2FuIHdhaXQgaGVyZSBmb3IKKwkgKiBsZGlzYyBjb21wbGV0aW9uIGFuZCBmaXggdGhlIGRyaXZlciBjYWxsIHJhY2UKKwkgKi8KKwl3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbCgmdHR5LT53cml0ZV93YWl0LCBQT0xMT1VUKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfcG9sbCgmdHR5LT5yZWFkX3dhaXQsIFBPTExJTik7CisJLyoKKwkgKiBTaHV0ZG93biB0aGUgY3VycmVudCBsaW5lIGRpc2NpcGxpbmUsIGFuZCByZXNldCBpdCB0bworCSAqIE5fVFRZLgorCSAqLworCWlmICh0dHktPmRyaXZlci0+ZmxhZ3MgJiBUVFlfRFJJVkVSX1JFU0VUX1RFUk1JT1MpIHsKKwkJLyogQXZvaWQgcmFjaW5nIHNldF9sZGlzYyAqLworCQltdXRleF9sb2NrKCZ0dHktPmxkaXNjX211dGV4KTsKKwkJLyogU3dpdGNoIGJhY2sgdG8gTl9UVFkgKi8KKwkJdHR5X2xkaXNjX3JlaW5pdCh0dHkpOworCQkvKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSBjbG9zZWQgbGRpc2MgYW5kIHdlIHdhbnQgdG8KKwkJICAgcmVvcGVuIGl0LiBXZSBjb3VsZCBkZWZlciB0aGlzIHRvIHRoZSBuZXh0IG9wZW4gYnV0CisJCSAgIGl0IG1lYW5zIGF1ZGl0aW5nIGEgbG90IG9mIG90aGVyIHBhdGhzIHNvIHRoaXMgaXMgYSBGSVhNRSAqLworCQlXQVJOX09OKHR0eV9sZGlzY19vcGVuKHR0eSwgdHR5LT5sZGlzYykpOworCQl0dHlfbGRpc2NfZW5hYmxlKHR0eSk7CisJCW11dGV4X3VubG9jaygmdHR5LT5sZGlzY19tdXRleCk7CisJCXR0eV9yZXNldF90ZXJtaW9zKHR0eSk7CisJfQorfQogCiAvKioKICAqCXR0eV9sZGlzY19zZXR1cAkJCS0Jb3BlbiBsaW5lIGRpc2NpcGxpbmUKQEAgLTYxMCwyNCArODA4LDIzIEBACiAgKglAb190dHk6IHBhaXIgdHR5IGZvciBwdHkvdHR5IHBhaXJzCiAgKgogICoJQ2FsbGVkIGR1cmluZyB0aGUgaW5pdGlhbCBvcGVuIG9mIGEgdHR5L3B0eSBwYWlyIGluIG9yZGVyIHRvIHNldCB1cCB0aGUKLSAqCWxpbmUgZGlzY3BsaW5lcyBhbmQgYmluZCB0aGVtIHRvIHRoZSB0dHkuCisgKglsaW5lIGRpc2NpcGxpbmVzIGFuZCBiaW5kIHRoZW0gdG8gdGhlIHR0eS4gVGhpcyBoYXMgbm8gbG9ja2luZyBpc3N1ZXMKKyAqCWFzIHRoZSBkZXZpY2UgaXNuJ3QgeWV0IGFjdGl2ZS4KICAqLwogCiBpbnQgdHR5X2xkaXNjX3NldHVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB0dHlfc3RydWN0ICpvX3R0eSkKIHsKLQlzdHJ1Y3QgdHR5X2xkaXNjICpsZCA9ICZ0dHktPmxkaXNjOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkID0gdHR5LT5sZGlzYzsKIAlpbnQgcmV0dmFsOwogCi0JaWYgKGxkLT5vcHMtPm9wZW4pIHsKLQkJcmV0dmFsID0gKGxkLT5vcHMtPm9wZW4pKHR0eSk7Ci0JCWlmIChyZXR2YWwpCi0JCQlyZXR1cm4gcmV0dmFsOwotCX0KLQlpZiAob190dHkgJiYgb190dHktPmxkaXNjLm9wcy0+b3BlbikgewotCQlyZXR2YWwgPSAob190dHktPmxkaXNjLm9wcy0+b3Blbikob190dHkpOworCXJldHZhbCA9IHR0eV9sZGlzY19vcGVuKHR0eSwgbGQpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAob190dHkpIHsKKwkJcmV0dmFsID0gdHR5X2xkaXNjX29wZW4ob190dHksIG9fdHR5LT5sZGlzYyk7CiAJCWlmIChyZXR2YWwpIHsKLQkJCWlmIChsZC0+b3BzLT5jbG9zZSkKLQkJCQkobGQtPm9wcy0+Y2xvc2UpKHR0eSk7CisJCQl0dHlfbGRpc2NfY2xvc2UodHR5LCBsZCk7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CiAJCXR0eV9sZGlzY19lbmFibGUob190dHkpOwpAQCAtNjM1LDMyICs4MzIsMjUgQEAKIAl0dHlfbGRpc2NfZW5hYmxlKHR0eSk7CiAJcmV0dXJuIDA7CiB9Ci0KIC8qKgogICoJdHR5X2xkaXNjX3JlbGVhc2UJCS0JcmVsZWFzZSBsaW5lIGRpc2NpcGxpbmUKICAqCUB0dHk6IHR0eSBiZWluZyBzaHV0IGRvd24KICAqCUBvX3R0eTogcGFpciB0dHkgZm9yIHB0eS90dHkgcGFpcnMKICAqCi0gKglDYWxsZWQgZHVyaW5nIHRoZSBmaW5hbCBjbG9zZSBvZiBhIHR0eS9wdHkgcGFpciBpbiBvcmRlciB0byBzaHV0IGRvd24gdGhlCi0gKglsaW5lIGRpc2NwbGluZSBsYXllci4KKyAqCUNhbGxlZCBkdXJpbmcgdGhlIGZpbmFsIGNsb3NlIG9mIGEgdHR5L3B0eSBwYWlyIGluIG9yZGVyIHRvIHNodXQgZG93bgorICoJdGhlIGxpbmUgZGlzY3BsaW5lIGxheWVyLiBPbiBleGl0IHRoZSBsZGlzYyBhc3NpZ25lZCBpcyBOX1RUWSBhbmQgdGhlCisgKglsZGlzYyBoYXMgbm90IGJlZW4gb3BlbmVkLgogICovCiAKIHZvaWQgdHR5X2xkaXNjX3JlbGVhc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHR0eV9zdHJ1Y3QgKm9fdHR5KQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHR0eV9sZGlzYyBsZDsKIAkvKgogCSAqIFByZXZlbnQgZmx1c2hfdG9fbGRpc2MoKSBmcm9tIHJlc2NoZWR1bGluZyB0aGUgd29yayBmb3IgbGF0ZXIuICBUaGVuCiAJICoga2lsbCBhbnkgZGVsYXllZCB3b3JrLiBBcyB0aGlzIGlzIHRoZSBmaW5hbCBjbG9zZSBpdCBkb2VzIG5vdAogCSAqIHJhY2Ugd2l0aCB0aGUgc2V0X2xkaXNjIGNvZGUgcGF0aC4KIAkgKi8KLQljbGVhcl9iaXQoVFRZX0xESVNDLCAmdHR5LT5mbGFncyk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmdHR5LT5idWYud29yayk7CiAKLQkvKgotCSAqIFdhaXQgZm9yIC0+aGFuZ3VwX3dvcmsgYW5kIC0+YnVmLndvcmsgaGFuZGxlcnMgdG8gdGVybWluYXRlCi0JICovCi0KKwl0dHlfbGRpc2NfaGFsdCh0dHkpOwogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAKIAkvKgpAQCAtNjY4LDM4ICs4NTgsMTkgQEAKIAkgKiBzaWRlIHdhaXRlcnMgYXMgdGhlIGZpbGUgaXMgY2xvc2luZyBzbyB1c2VyIGNvdW50IG9uIHRoZSBmaWxlCiAJICogc2lkZSBpcyB6ZXJvLgogCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwotCXdoaWxlICh0dHktPmxkaXNjLnJlZmNvdW50KSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnR0eV9sZGlzY19sb2NrLCBmbGFncyk7Ci0JCXdhaXRfZXZlbnQodHR5X2xkaXNjX3dhaXQsIHR0eS0+bGRpc2MucmVmY291bnQgPT0gMCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0dHlfbGRpc2NfbG9jaywgZmxhZ3MpOworCisJdHR5X2xkaXNjX3dhaXRfaWRsZSh0dHkpOworCiAJLyoKIAkgKiBTaHV0ZG93biB0aGUgY3VycmVudCBsaW5lIGRpc2NpcGxpbmUsIGFuZCByZXNldCBpdCB0byBOX1RUWS4KIAkgKgogCSAqIEZJWE1FOiB0aGlzIE1VU1QgZ2V0IGZpeGVkIGZvciB0aGUgbmV3IHJlZmxvY2tpbmcKIAkgKi8KLQlpZiAodHR5LT5sZGlzYy5vcHMtPmNsb3NlKQotCQkodHR5LT5sZGlzYy5vcHMtPmNsb3NlKSh0dHkpOwotCXR0eV9sZGlzY19wdXQodHR5LT5sZGlzYy5vcHMpOwogCi0JLyoKLQkgKglTd2l0Y2ggdGhlIGxpbmUgZGlzY2lwbGluZSBiYWNrCi0JICovCi0JV0FSTl9PTih0dHlfbGRpc2NfZ2V0KE5fVFRZLCAmbGQpKTsKLQl0dHlfbGRpc2NfYXNzaWduKHR0eSwgJmxkKTsKLQl0dHlfc2V0X3Rlcm1pb3NfbGRpc2ModHR5LCBOX1RUWSk7Ci0JaWYgKG9fdHR5KSB7Ci0JCS8qIEZJWE1FOiBjb3VsZCBvX3R0eSBiZSBpbiBzZXRsZGlzYyBoZXJlID8gKi8KLQkJY2xlYXJfYml0KFRUWV9MRElTQywgJm9fdHR5LT5mbGFncyk7Ci0JCWlmIChvX3R0eS0+bGRpc2Mub3BzLT5jbG9zZSkKLQkJCShvX3R0eS0+bGRpc2Mub3BzLT5jbG9zZSkob190dHkpOwotCQl0dHlfbGRpc2NfcHV0KG9fdHR5LT5sZGlzYy5vcHMpOwotCQlXQVJOX09OKHR0eV9sZGlzY19nZXQoTl9UVFksICZsZCkpOwotCQl0dHlfbGRpc2NfYXNzaWduKG9fdHR5LCAmbGQpOwotCQl0dHlfc2V0X3Rlcm1pb3NfbGRpc2Mob190dHksIE5fVFRZKTsKLQl9CisJdHR5X2xkaXNjX3JlaW5pdCh0dHkpOworCS8qIFRoaXMgd2lsbCBuZWVkIGRvaW5nIGRpZmZlcmVudGx5IGlmIHdlIG5lZWQgdG8gbG9jayAqLworCWlmIChvX3R0eSkKKwkJdHR5X2xkaXNjX3JlbGVhc2Uob190dHksIE5VTEwpOwogfQogCiAvKioKQEAgLTcxMiwxMCArODgzLDEwIEBACiAKIHZvaWQgdHR5X2xkaXNjX2luaXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgdHR5X2xkaXNjIGxkOwotCWlmICh0dHlfbGRpc2NfZ2V0KE5fVFRZLCAmbGQpIDwgMCkKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZCA9IHR0eV9sZGlzY19nZXQoTl9UVFkpOworCWlmIChJU19FUlIobGQpKQogCQlwYW5pYygibl90dHk6IGluaXRfdHR5Iik7Ci0JdHR5X2xkaXNjX2Fzc2lnbih0dHksICZsZCk7CisJdHR5X2xkaXNjX2Fzc2lnbih0dHksIGxkKTsKIH0KIAogdm9pZCB0dHlfbGRpc2NfYmVnaW4odm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90dHlfcG9ydC5jIGIvZHJpdmVycy9jaGFyL3R0eV9wb3J0LmMKaW5kZXggOWI4MDA0Yy4uNjJkYWRmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3R0eV9wb3J0LmMKKysrIGIvZHJpdmVycy9jaGFyL3R0eV9wb3J0LmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogRVhQT1JUX1NZTUJPTCh0dHlfcG9ydF9jYXJyaWVyX3JhaXNlZCk7CiAKIC8qKgotICoJdHR5X3BvcnRfcmFpc2VfZHRyX3J0cwktCVJpYXNlIERUUi9SVFMKKyAqCXR0eV9wb3J0X3JhaXNlX2R0cl9ydHMJLQlSYWlzZSBEVFIvUlRTCiAgKglAcG9ydDogdHR5IHBvcnQKICAqCiAgKglXcmFwcGVyIGZvciB0aGUgRFRSL1JUUyByYWlzZSBsb2dpYy4gRm9yIHRoZSBtb21lbnQgdGhpcyBpcyB1c2VkCkBAIC0xNDcsMTIgKzE0NywyOCBAQAogCiB2b2lkIHR0eV9wb3J0X3JhaXNlX2R0cl9ydHMoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQogewotCWlmIChwb3J0LT5vcHMtPnJhaXNlX2R0cl9ydHMpCi0JCXBvcnQtPm9wcy0+cmFpc2VfZHRyX3J0cyhwb3J0KTsKKwlpZiAocG9ydC0+b3BzLT5kdHJfcnRzKQorCQlwb3J0LT5vcHMtPmR0cl9ydHMocG9ydCwgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X3JhaXNlX2R0cl9ydHMpOwogCiAvKioKKyAqCXR0eV9wb3J0X2xvd2VyX2R0cl9ydHMJLQlMb3dlciBEVFIvUlRTCisgKglAcG9ydDogdHR5IHBvcnQKKyAqCisgKglXcmFwcGVyIGZvciB0aGUgRFRSL1JUUyByYWlzZSBsb2dpYy4gRm9yIHRoZSBtb21lbnQgdGhpcyBpcyB1c2VkCisgKgl0byBoaWRlIHNvbWUgaW50ZXJuYWwgZGV0YWlscy4gVGhpcyB3aWxsIGV2ZW50dWFsbHkgYmVjb21lIGVudGlyZWx5CisgKglpbnRlcm5hbCB0byB0aGUgdHR5IHBvcnQuCisgKi8KKwordm9pZCB0dHlfcG9ydF9sb3dlcl9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+b3BzLT5kdHJfcnRzKQorCQlwb3J0LT5vcHMtPmR0cl9ydHMocG9ydCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X2xvd2VyX2R0cl9ydHMpOworCisvKioKICAqCXR0eV9wb3J0X2Jsb2NrX3RpbF9yZWFkeQktCVdhaXRpbmcgbG9naWMgZm9yIHR0eSBvcGVuCiAgKglAcG9ydDogdGhlIHR0eSBwb3J0IGJlaW5nIG9wZW5lZAogICoJQHR0eTogdGhlIHR0eSBkZXZpY2UgYmVpbmcgYm91bmQKQEAgLTE2Nyw3ICsxODMsNyBAQAogICoJCS0gcG9ydCBmbGFncyBhbmQgY291bnRzCiAgKgogICoJVGhlIHBhc3NlZCB0dHlfcG9ydCBtdXN0IGltcGxlbWVudCB0aGUgY2Fycmllcl9yYWlzZWQgbWV0aG9kIGlmIGl0IGNhbgotICoJZG8gY2FycmllciBkZXRlY3QgYW5kIHRoZSByYWlzZV9kdHJfcnRzIG1ldGhvZCBpZiBpdCBzdXBwb3J0cyBzb2Z0d2FyZQorICoJZG8gY2FycmllciBkZXRlY3QgYW5kIHRoZSBkdHJfcnRzIG1ldGhvZCBpZiBpdCBzdXBwb3J0cyBzb2Z0d2FyZQogICoJbWFuYWdlbWVudCBvZiB0aGVzZSBsaW5lcy4gTm90ZSB0aGF0IHRoZSBkdHIvcnRzIHJhaXNlIGlzIGRvbmUgZWFjaAogICoJaXRlcmF0aW9uIGFzIGEgaGFuZ3VwIG1heSBoYXZlIHByZXZpb3VzbHkgZHJvcHBlZCB0aGVtIHdoaWxlIHdlIHdhaXQuCiAgKi8KQEAgLTE4Miw3ICsxOTgsOCBAQAogCiAJLyogYmxvY2sgaWYgcG9ydCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBjbG9zZWQgKi8KIAlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSB8fCBwb3J0LT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpIHsKLQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcG9ydC0+Y2xvc2Vfd2FpdCk7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShwb3J0LT5jbG9zZV93YWl0LAorCQkJCSEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSk7CiAJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJZWxzZQpAQCAtMjA1LDcgKzIyMiw2IEBACiAJICAgYmVmb3JlIHRoZSBuZXh0IG9wZW4gbWF5IGNvbXBsZXRlICovCiAKIAlyZXR2YWwgPSAwOwotCWFkZF93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKIAogCS8qIFRoZSBwb3J0IGxvY2sgcHJvdGVjdHMgdGhlIHBvcnQgY291bnRzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKQEAgLTIxOSw3ICsyMzUsNyBAQAogCQlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpCiAJCQl0dHlfcG9ydF9yYWlzZV9kdHJfcnRzKHBvcnQpOwogCi0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXByZXBhcmVfdG9fd2FpdCgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJLyogQ2hlY2sgZm9yIGEgaGFuZ3VwIG9yIHVuaW5pdGlhbGlzZWQgcG9ydC4gUmV0dXJuIGFjY29yZGluZ2x5ICovCiAJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKIAkJCWlmIChwb3J0LT5mbGFncyAmIEFTWU5DX0hVUF9OT1RJRlkpCkBAIC0yNDAsOCArMjU2LDcgQEAKIAkJfQogCQlzY2hlZHVsZSgpOwogCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT5vcGVuX3dhaXQsICZ3YWl0KTsKKwlmaW5pc2hfd2FpdCgmcG9ydC0+b3Blbl93YWl0LCAmd2FpdCk7CiAKIAkvKiBVcGRhdGUgY291bnRzLiBBIHBhcmFsbGVsIGhhbmd1cCB3aWxsIGhhdmUgc2V0IGNvdW50IHRvIHplcm8gYW5kCiAJICAgd2UgbXVzdCBub3QgbWVzcyB0aGF0IHVwIGZ1cnRoZXIgKi8KQEAgLTI5Miw2ICszMDcsMTcgQEAKIAlpZiAocG9ydC0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCAmJgogCQkJcG9ydC0+Y2xvc2luZ193YWl0ICE9IEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FKQogCQl0dHlfd2FpdF91bnRpbF9zZW50KHR0eSwgcG9ydC0+Y2xvc2luZ193YWl0KTsKKwlpZiAocG9ydC0+ZHJhaW5fZGVsYXkpIHsKKwkJdW5zaWduZWQgaW50IGJwcyA9IHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSk7CisJCWxvbmcgdGltZW91dDsKKworCQlpZiAoYnBzID4gMTIwMCkKKwkJCXRpbWVvdXQgPSBtYXhfdChsb25nLCAoSFogKiAxMCAqIHBvcnQtPmRyYWluX2RlbGF5KSAvIGJwcywKKwkJCQkJCQkJSFogLyAxMCk7CisJCWVsc2UKKwkJCXRpbWVvdXQgPSAyICogSFo7CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKKwl9CiAJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KTsKQEAgLTMwMiw2ICszMjgsOSBAQAogCiAJdHR5X2xkaXNjX2ZsdXNoKHR0eSk7CiAKKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgSFVQQ0wpCisJCXR0eV9wb3J0X2xvd2VyX2R0cl9ydHMocG9ydCk7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCXR0eS0+Y2xvc2luZyA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci92dC5jIGIvZHJpdmVycy9jaGFyL3Z0LmMKaW5kZXggMDgxNTFkNC4uZGU5ZWJlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3Z0LmMKKysrIGIvZHJpdmVycy9jaGFyL3Z0LmMKQEAgLTk1LDcgKzk1LDYgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZvbnQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KQEAgLTEwNCw2ICsxMDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgogCiAjZGVmaW5lIE1BWF9OUl9DT05fRFJJVkVSIDE2CiAKQEAgLTI4NzUsMTQgKzI4NzUsMTEgQEAKIAkJbW9kX3RpbWVyKCZjb25zb2xlX3RpbWVyLCBqaWZmaWVzICsgYmxhbmtpbnRlcnZhbCk7CiAJfQogCi0JLyoKLQkgKiBrbWFsbG9jIGlzIG5vdCBydW5uaW5nIHlldCAtIHdlIHVzZSB0aGUgYm9vdG1lbSBhbGxvY2F0b3IuCi0JICovCiAJZm9yIChjdXJyY29ucyA9IDA7IGN1cnJjb25zIDwgTUlOX05SX0NPTlNPTEVTOyBjdXJyY29ucysrKSB7Ci0JCXZjX2NvbnNbY3VycmNvbnNdLmQgPSB2YyA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCB2Y19kYXRhKSk7CisJCXZjX2NvbnNbY3VycmNvbnNdLmQgPSB2YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2Y19kYXRhKSwgR0ZQX05PV0FJVCk7CiAJCUlOSVRfV09SSygmdmNfY29uc1tjdXJyY29uc10uU0FLX3dvcmssIHZjX1NBSyk7CiAJCXZpc3VhbF9pbml0KHZjLCBjdXJyY29ucywgMSk7Ci0JCXZjLT52Y19zY3JlZW5idWYgPSAodW5zaWduZWQgc2hvcnQgKilhbGxvY19ib290bWVtKHZjLT52Y19zY3JlZW5idWZfc2l6ZSk7CisJCXZjLT52Y19zY3JlZW5idWYgPSBremFsbG9jKHZjLT52Y19zY3JlZW5idWZfc2l6ZSwgR0ZQX05PV0FJVCk7CiAJCXZjLT52Y19rbWFsbG9jZWQgPSAwOwogCQl2Y19pbml0KHZjLCB2Yy0+dmNfcm93cywgdmMtPnZjX2NvbHMsCiAJCQljdXJyY29ucyB8fCAhdmMtPnZjX3N3LT5jb25fc2F2ZV9zY3JlZW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZSBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvTWFrZWZpbGUKaW5kZXggMWVmYjI4Ny4uZWVmMjE2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL01ha2VmaWxlCkBAIC0zLDMgKzMsNSBAQAogb2JqLSQoQ09ORklHX1g4Nl9QTV9USU1FUikJKz0gYWNwaV9wbS5vCiBvYmotJChDT05GSUdfU0N4MjAwSFJfVElNRVIpCSs9IHNjeDIwMF9ocnQubwogb2JqLSQoQ09ORklHX1NIX1RJTUVSX0NNVCkJKz0gc2hfY210Lm8KK29iai0kKENPTkZJR19TSF9USU1FUl9NVFUyKQkrPSBzaF9tdHUyLm8KK29iai0kKENPTkZJR19TSF9USU1FUl9UTVUpCSs9IHNoX3RtdS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF9jbXQuYwppbmRleCAxYzkyYzM5Li5jZjU2YTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfY210LmMKQEAgLTE4LDcgKzE4LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtMjksNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NoX2NtdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAKIHN0cnVjdCBzaF9jbXRfcHJpdiB7CiAJdm9pZCBfX2lvbWVtICptYXBiYXNlOwpAQCAtNDcsNiArNDYsNyBAQAogCXVuc2lnbmVkIGxvbmcgcmF0ZTsKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBjZWQ7CisJc3RydWN0IGNsb2Nrc291cmNlIGNzOwogCXVuc2lnbmVkIGxvbmcgdG90YWxfY3ljbGVzOwogfTsKIApAQCAtNTksNyArNTksNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2hfY210X3JlYWQoc3RydWN0IHNoX2NtdF9wcml2ICpwLCBpbnQgcmVnX25yKQogewotCXN0cnVjdCBzaF9jbXRfY29uZmlnICpjZmcgPSBwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnICpjZmcgPSBwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBwLT5tYXBiYXNlOwogCXVuc2lnbmVkIGxvbmcgb2ZmczsKIApAQCAtODMsNyArODMsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIHNoX2NtdF93cml0ZShzdHJ1Y3Qgc2hfY210X3ByaXYgKnAsIGludCByZWdfbnIsCiAJCQkJdW5zaWduZWQgbG9uZyB2YWx1ZSkKIHsKLQlzdHJ1Y3Qgc2hfY210X2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNoX3RpbWVyX2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gcC0+bWFwYmFzZTsKIAl1bnNpZ25lZCBsb25nIG9mZnM7CiAKQEAgLTExMCwyMyArMTEwLDI4IEBACiAJCQkJCWludCAqaGFzX3dyYXBwZWQpCiB7CiAJdW5zaWduZWQgbG9uZyB2MSwgdjIsIHYzOworCWludCBvMSwgbzI7CisKKwlvMSA9IHNoX2NtdF9yZWFkKHAsIENNQ1NSKSAmIHAtPm92ZXJmbG93X2JpdDsKIAogCS8qIE1ha2Ugc3VyZSB0aGUgdGltZXIgdmFsdWUgaXMgc3RhYmxlLiBTdG9sZW4gZnJvbSBhY3BpX3BtLmMgKi8KIAlkbyB7CisJCW8yID0gbzE7CiAJCXYxID0gc2hfY210X3JlYWQocCwgQ01DTlQpOwogCQl2MiA9IHNoX2NtdF9yZWFkKHAsIENNQ05UKTsKIAkJdjMgPSBzaF9jbXRfcmVhZChwLCBDTUNOVCk7Ci0JfSB3aGlsZSAodW5saWtlbHkoKHYxID4gdjIgJiYgdjEgPCB2MykgfHwgKHYyID4gdjMgJiYgdjIgPCB2MSkKLQkJCSAgfHwgKHYzID4gdjEgJiYgdjMgPCB2MikpKTsKKwkJbzEgPSBzaF9jbXRfcmVhZChwLCBDTUNTUikgJiBwLT5vdmVyZmxvd19iaXQ7CisJfSB3aGlsZSAodW5saWtlbHkoKG8xICE9IG8yKSB8fCAodjEgPiB2MiAmJiB2MSA8IHYzKQorCQkJICB8fCAodjIgPiB2MyAmJiB2MiA8IHYxKSB8fCAodjMgPiB2MSAmJiB2MyA8IHYyKSkpOwogCi0JKmhhc193cmFwcGVkID0gc2hfY210X3JlYWQocCwgQ01DU1IpICYgcC0+b3ZlcmZsb3dfYml0OworCSpoYXNfd3JhcHBlZCA9IG8xOwogCXJldHVybiB2MjsKIH0KIAogCiBzdGF0aWMgdm9pZCBzaF9jbXRfc3RhcnRfc3RvcF9jaChzdHJ1Y3Qgc2hfY210X3ByaXYgKnAsIGludCBzdGFydCkKIHsKLQlzdHJ1Y3Qgc2hfY210X2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNoX3RpbWVyX2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgdmFsdWU7CiAKIAkvKiBzdGFydCBzdG9wIHJlZ2lzdGVyIHNoYXJlZCBieSBtdWx0aXBsZSB0aW1lciBjaGFubmVscyAqLwpAQCAtMTQ0LDcgKzE0OSw3IEBACiAKIHN0YXRpYyBpbnQgc2hfY210X2VuYWJsZShzdHJ1Y3Qgc2hfY210X3ByaXYgKnAsIHVuc2lnbmVkIGxvbmcgKnJhdGUpCiB7Ci0Jc3RydWN0IHNoX2NtdF9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzaF90aW1lcl9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCWludCByZXQ7CiAKIAkvKiBlbmFibGUgY2xvY2sgKi8KQEAgLTE1MywxNiArMTU4LDE4IEBACiAJCXByX2Vycigic2hfY210OiBjYW5ub3QgZW5hYmxlIGNsb2NrIFwiJXNcIlxuIiwgY2ZnLT5jbGspOwogCQlyZXR1cm4gcmV0OwogCX0KLQkqcmF0ZSA9IGNsa19nZXRfcmF0ZShwLT5jbGspIC8gODsKIAogCS8qIG1ha2Ugc3VyZSBjaGFubmVsIGlzIGRpc2FibGVkICovCiAJc2hfY210X3N0YXJ0X3N0b3BfY2gocCwgMCk7CiAKIAkvKiBjb25maWd1cmUgY2hhbm5lbCwgcGVyaW9kaWMgbW9kZSBhbmQgbWF4aW11bSB0aW1lb3V0ICovCi0JaWYgKHAtPndpZHRoID09IDE2KQotCQlzaF9jbXRfd3JpdGUocCwgQ01DU1IsIDApOwotCWVsc2UKKwlpZiAocC0+d2lkdGggPT0gMTYpIHsKKwkJKnJhdGUgPSBjbGtfZ2V0X3JhdGUocC0+Y2xrKSAvIDUxMjsKKwkJc2hfY210X3dyaXRlKHAsIENNQ1NSLCAweDQzKTsKKwl9IGVsc2UgeworCQkqcmF0ZSA9IGNsa19nZXRfcmF0ZShwLT5jbGspIC8gODsKIAkJc2hfY210X3dyaXRlKHAsIENNQ1NSLCAweDAxYTQpOworCX0KIAogCXNoX2NtdF93cml0ZShwLCBDTUNPUiwgMHhmZmZmZmZmZik7CiAJc2hfY210X3dyaXRlKHAsIENNQ05ULCAwKTsKQEAgLTM3Niw2ICszODMsNjggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5sb2NrLCBmbGFncyk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2hfY210X3ByaXYgKmNzX3RvX3NoX2NtdChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXJldHVybiBjb250YWluZXJfb2YoY3MsIHN0cnVjdCBzaF9jbXRfcHJpdiwgY3MpOworfQorCitzdGF0aWMgY3ljbGVfdCBzaF9jbXRfY2xvY2tzb3VyY2VfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXN0cnVjdCBzaF9jbXRfcHJpdiAqcCA9IGNzX3RvX3NoX2NtdChjcyk7CisJdW5zaWduZWQgbG9uZyBmbGFncywgcmF3OworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJaW50IGhhc193cmFwcGVkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPmxvY2ssIGZsYWdzKTsKKwl2YWx1ZSA9IHAtPnRvdGFsX2N5Y2xlczsKKwlyYXcgPSBzaF9jbXRfZ2V0X2NvdW50ZXIocCwgJmhhc193cmFwcGVkKTsKKworCWlmICh1bmxpa2VseShoYXNfd3JhcHBlZCkpCisJCXJhdyArPSBwLT5tYXRjaF92YWx1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdmFsdWUgKyByYXc7Cit9CisKK3N0YXRpYyBpbnQgc2hfY210X2Nsb2Nrc291cmNlX2VuYWJsZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXN0cnVjdCBzaF9jbXRfcHJpdiAqcCA9IGNzX3RvX3NoX2NtdChjcyk7CisJaW50IHJldDsKKworCXAtPnRvdGFsX2N5Y2xlcyA9IDA7CisKKwlyZXQgPSBzaF9jbXRfc3RhcnQocCwgRkxBR19DTE9DS1NPVVJDRSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFRPRE86IGNhbGN1bGF0ZSBnb29kIHNoaWZ0IGZyb20gcmF0ZSBhbmQgY291bnRlciBiaXQgd2lkdGggKi8KKwljcy0+c2hpZnQgPSAwOworCWNzLT5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChwLT5yYXRlLCBjcy0+c2hpZnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaF9jbXRfY2xvY2tzb3VyY2VfZGlzYWJsZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXNoX2NtdF9zdG9wKGNzX3RvX3NoX2NtdChjcyksIEZMQUdfQ0xPQ0tTT1VSQ0UpOworfQorCitzdGF0aWMgaW50IHNoX2NtdF9yZWdpc3Rlcl9jbG9ja3NvdXJjZShzdHJ1Y3Qgc2hfY210X3ByaXYgKnAsCisJCQkJICAgICAgIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgcmF0aW5nKQoreworCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3MgPSAmcC0+Y3M7CisKKwljcy0+bmFtZSA9IG5hbWU7CisJY3MtPnJhdGluZyA9IHJhdGluZzsKKwljcy0+cmVhZCA9IHNoX2NtdF9jbG9ja3NvdXJjZV9yZWFkOworCWNzLT5lbmFibGUgPSBzaF9jbXRfY2xvY2tzb3VyY2VfZW5hYmxlOworCWNzLT5kaXNhYmxlID0gc2hfY210X2Nsb2Nrc291cmNlX2Rpc2FibGU7CisJY3MtPm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpOworCWNzLT5mbGFncyA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTOworCXByX2luZm8oInNoX2NtdDogJXMgdXNlZCBhcyBjbG9jayBzb3VyY2VcbiIsIGNzLT5uYW1lKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcihjcyk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3Qgc2hfY210X3ByaXYgKmNlZF90b19zaF9jbXQoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2VkKQogewogCXJldHVybiBjb250YWluZXJfb2YoY2VkLCBzdHJ1Y3Qgc2hfY210X3ByaXYsIGNlZCk7CkBAIC00NjgsOSArNTM3LDkgQEAKIAljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2VkKTsKIH0KIAotaW50IHNoX2NtdF9yZWdpc3RlcihzdHJ1Y3Qgc2hfY210X3ByaXYgKnAsIGNoYXIgKm5hbWUsCi0JCSAgICB1bnNpZ25lZCBsb25nIGNsb2NrZXZlbnRfcmF0aW5nLAotCQkgICAgdW5zaWduZWQgbG9uZyBjbG9ja3NvdXJjZV9yYXRpbmcpCitzdGF0aWMgaW50IHNoX2NtdF9yZWdpc3RlcihzdHJ1Y3Qgc2hfY210X3ByaXYgKnAsIGNoYXIgKm5hbWUsCisJCQkgICB1bnNpZ25lZCBsb25nIGNsb2NrZXZlbnRfcmF0aW5nLAorCQkJICAgdW5zaWduZWQgbG9uZyBjbG9ja3NvdXJjZV9yYXRpbmcpCiB7CiAJaWYgKHAtPndpZHRoID09IChzaXplb2YocC0+bWF4X21hdGNoX3ZhbHVlKSAqIDgpKQogCQlwLT5tYXhfbWF0Y2hfdmFsdWUgPSB+MDsKQEAgLTQ4MywxMiArNTUyLDE1IEBACiAJaWYgKGNsb2NrZXZlbnRfcmF0aW5nKQogCQlzaF9jbXRfcmVnaXN0ZXJfY2xvY2tldmVudChwLCBuYW1lLCBjbG9ja2V2ZW50X3JhdGluZyk7CiAKKwlpZiAoY2xvY2tzb3VyY2VfcmF0aW5nKQorCQlzaF9jbXRfcmVnaXN0ZXJfY2xvY2tzb3VyY2UocCwgbmFtZSwgY2xvY2tzb3VyY2VfcmF0aW5nKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNoX2NtdF9zZXR1cChzdHJ1Y3Qgc2hfY210X3ByaXYgKnAsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHNoX2NtdF9jb25maWcgKmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBzaF90aW1lcl9jb25maWcgKmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCBpcnEsIHJldDsKIAlyZXQgPSAtRU5YSU87CkBAIC01NDUsNyArNjE3LDcgQEAKIAlpZiAocmVzb3VyY2Vfc2l6ZShyZXMpID09IDYpIHsKIAkJcC0+d2lkdGggPSAxNjsKIAkJcC0+b3ZlcmZsb3dfYml0ID0gMHg4MDsKLQkJcC0+Y2xlYXJfYml0cyA9IH4weGMwOworCQlwLT5jbGVhcl9iaXRzID0gfjB4ODA7CiAJfSBlbHNlIHsKIAkJcC0+d2lkdGggPSAzMjsKIAkJcC0+b3ZlcmZsb3dfYml0ID0gMHg4MDAwOwpAQCAtNTY2LDggKzYzOCwxNCBAQAogc3RhdGljIGludCBfX2RldmluaXQgc2hfY210X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHNoX2NtdF9wcml2ICpwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNoX3RpbWVyX2NvbmZpZyAqY2ZnID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IHJldDsKIAorCWlmIChwKSB7CisJCXByX2luZm8oInNoX2NtdDogJXMga2VwdCBhcyBlYXJseXRpbWVyXG4iLCBjZmctPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKIAlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKIAlpZiAocCA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBkcml2ZXIgZGF0YVxuIik7CkBAIC01NzcsNyArNjU1LDYgQEAKIAlyZXQgPSBzaF9jbXRfc2V0dXAocCwgcGRldik7CiAJaWYgKHJldCkgewogCQlrZnJlZShwKTsKLQogCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAl9CiAJcmV0dXJuIHJldDsKQEAgLTYwNiw2ICs2ODMsNyBAQAogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaF9jbXRfZGV2aWNlX2RyaXZlcik7CiB9CiAKK2Vhcmx5X3BsYXRmb3JtX2luaXQoImVhcmx5dGltZXIiLCAmc2hfY210X2RldmljZV9kcml2ZXIpOwogbW9kdWxlX2luaXQoc2hfY210X2luaXQpOwogbW9kdWxlX2V4aXQoc2hfY210X2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX210dTIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfbXR1Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYWU3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX210dTIuYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIFN1cGVySCBUaW1lciBTdXBwb3J0IC0gTVRVMgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDkgTWFnbnVzIERhbW0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CisKK3N0cnVjdCBzaF9tdHUyX3ByaXYgeworCXZvaWQgX19pb21lbSAqbWFwYmFzZTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGlycWFjdGlvbiBpcnFhY3Rpb247CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJdW5zaWduZWQgbG9uZyBwZXJpb2RpYzsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNlZDsKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2hfbXR1Ml9sb2NrKTsKKworI2RlZmluZSBUU1RSIC0xIC8qIHNoYXJlZCByZWdpc3RlciAqLworI2RlZmluZSBUQ1IgIDAgLyogY2hhbm5lbCByZWdpc3RlciAqLworI2RlZmluZSBUTURSIDEgLyogY2hhbm5lbCByZWdpc3RlciAqLworI2RlZmluZSBUSU9SIDIgLyogY2hhbm5lbCByZWdpc3RlciAqLworI2RlZmluZSBUSUVSIDMgLyogY2hhbm5lbCByZWdpc3RlciAqLworI2RlZmluZSBUU1IgIDQgLyogY2hhbm5lbCByZWdpc3RlciAqLworI2RlZmluZSBUQ05UIDUgLyogY2hhbm5lbCByZWdpc3RlciAqLworI2RlZmluZSBUR1IgIDYgLyogY2hhbm5lbCByZWdpc3RlciAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtdHUyX3JlZ19vZmZzW10gPSB7CisJW1RDUl0gPSAwLAorCVtUTURSXSA9IDEsCisJW1RJT1JdID0gMiwKKwlbVElFUl0gPSA0LAorCVtUU1JdID0gNSwKKwlbVENOVF0gPSA2LAorCVtUR1JdID0gOCwKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzaF9tdHUyX3JlYWQoc3RydWN0IHNoX210dTJfcHJpdiAqcCwgaW50IHJlZ19ucikKK3sKKwlzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnICpjZmcgPSBwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBwLT5tYXBiYXNlOworCXVuc2lnbmVkIGxvbmcgb2ZmczsKKworCWlmIChyZWdfbnIgPT0gVFNUUikKKwkJcmV0dXJuIGlvcmVhZDgoYmFzZSArIGNmZy0+Y2hhbm5lbF9vZmZzZXQpOworCisJb2ZmcyA9IG10dTJfcmVnX29mZnNbcmVnX25yXTsKKworCWlmICgocmVnX25yID09IFRDTlQpIHx8IChyZWdfbnIgPT0gVEdSKSkKKwkJcmV0dXJuIGlvcmVhZDE2KGJhc2UgKyBvZmZzKTsKKwllbHNlCisJCXJldHVybiBpb3JlYWQ4KGJhc2UgKyBvZmZzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNoX210dTJfd3JpdGUoc3RydWN0IHNoX210dTJfcHJpdiAqcCwgaW50IHJlZ19uciwKKwkJCQl1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCXN0cnVjdCBzaF90aW1lcl9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHAtPm1hcGJhc2U7CisJdW5zaWduZWQgbG9uZyBvZmZzOworCisJaWYgKHJlZ19uciA9PSBUU1RSKSB7CisJCWlvd3JpdGU4KHZhbHVlLCBiYXNlICsgY2ZnLT5jaGFubmVsX29mZnNldCk7CisJCXJldHVybjsKKwl9CisKKwlvZmZzID0gbXR1Ml9yZWdfb2Zmc1tyZWdfbnJdOworCisJaWYgKChyZWdfbnIgPT0gVENOVCkgfHwgKHJlZ19uciA9PSBUR1IpKQorCQlpb3dyaXRlMTYodmFsdWUsIGJhc2UgKyBvZmZzKTsKKwllbHNlCisJCWlvd3JpdGU4KHZhbHVlLCBiYXNlICsgb2Zmcyk7Cit9CisKK3N0YXRpYyB2b2lkIHNoX210dTJfc3RhcnRfc3RvcF9jaChzdHJ1Y3Qgc2hfbXR1Ml9wcml2ICpwLCBpbnQgc3RhcnQpCit7CisJc3RydWN0IHNoX3RpbWVyX2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFncywgdmFsdWU7CisKKwkvKiBzdGFydCBzdG9wIHJlZ2lzdGVyIHNoYXJlZCBieSBtdWx0aXBsZSB0aW1lciBjaGFubmVscyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzaF9tdHUyX2xvY2ssIGZsYWdzKTsKKwl2YWx1ZSA9IHNoX210dTJfcmVhZChwLCBUU1RSKTsKKworCWlmIChzdGFydCkKKwkJdmFsdWUgfD0gMSA8PCBjZmctPnRpbWVyX2JpdDsKKwllbHNlCisJCXZhbHVlICY9IH4oMSA8PCBjZmctPnRpbWVyX2JpdCk7CisKKwlzaF9tdHUyX3dyaXRlKHAsIFRTVFIsIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaF9tdHUyX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzaF9tdHUyX2VuYWJsZShzdHJ1Y3Qgc2hfbXR1Ml9wcml2ICpwKQoreworCXN0cnVjdCBzaF90aW1lcl9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisKKwkvKiBlbmFibGUgY2xvY2sgKi8KKwlyZXQgPSBjbGtfZW5hYmxlKHAtPmNsayk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInNoX210dTI6IGNhbm5vdCBlbmFibGUgY2xvY2sgXCIlc1wiXG4iLCBjZmctPmNsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbWFrZSBzdXJlIGNoYW5uZWwgaXMgZGlzYWJsZWQgKi8KKwlzaF9tdHUyX3N0YXJ0X3N0b3BfY2gocCwgMCk7CisKKwlwLT5yYXRlID0gY2xrX2dldF9yYXRlKHAtPmNsaykgLyA2NDsKKwlwLT5wZXJpb2RpYyA9IChwLT5yYXRlICsgSFovMikgLyBIWjsKKworCS8qICJQZXJpb2RpYyBDb3VudGVyIE9wZXJhdGlvbiIgKi8KKwlzaF9tdHUyX3dyaXRlKHAsIFRDUiwgMHgyMyk7IC8qIFRHUkEgY2xlYXIsIGRpdmlkZSBjbG9jayBieSA2NCAqLworCXNoX210dTJfd3JpdGUocCwgVElPUiwgMCk7CisJc2hfbXR1Ml93cml0ZShwLCBUR1IsIHAtPnBlcmlvZGljKTsKKwlzaF9tdHUyX3dyaXRlKHAsIFRDTlQsIDApOworCXNoX210dTJfd3JpdGUocCwgVE1EUiwgMCk7CisJc2hfbXR1Ml93cml0ZShwLCBUSUVSLCAweDAxKTsKKworCS8qIGVuYWJsZSBjaGFubmVsICovCisJc2hfbXR1Ml9zdGFydF9zdG9wX2NoKHAsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNoX210dTJfZGlzYWJsZShzdHJ1Y3Qgc2hfbXR1Ml9wcml2ICpwKQoreworCS8qIGRpc2FibGUgY2hhbm5lbCAqLworCXNoX210dTJfc3RhcnRfc3RvcF9jaChwLCAwKTsKKworCS8qIHN0b3AgY2xvY2sgKi8KKwljbGtfZGlzYWJsZShwLT5jbGspOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2hfbXR1Ml9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBzaF9tdHUyX3ByaXYgKnAgPSBkZXZfaWQ7CisKKwkvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwlzaF9tdHUyX3JlYWQocCwgVFNSKTsKKwlzaF9tdHUyX3dyaXRlKHAsIFRTUiwgMHhmZSk7CisKKwkvKiBub3RpZnkgY2xvY2tldmVudCBsYXllciAqLworCXAtPmNlZC5ldmVudF9oYW5kbGVyKCZwLT5jZWQpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBzaF9tdHUyX3ByaXYgKmNlZF90b19zaF9tdHUyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNlZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNlZCwgc3RydWN0IHNoX210dTJfcHJpdiwgY2VkKTsKK30KKworc3RhdGljIHZvaWQgc2hfbXR1Ml9jbG9ja19ldmVudF9tb2RlKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZWQpCit7CisJc3RydWN0IHNoX210dTJfcHJpdiAqcCA9IGNlZF90b19zaF9tdHUyKGNlZCk7CisJaW50IGRpc2FibGVkID0gMDsKKworCS8qIGRlYWwgd2l0aCBvbGQgc2V0dGluZyBmaXJzdCAqLworCXN3aXRjaCAoY2VkLT5tb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwkJc2hfbXR1Ml9kaXNhYmxlKHApOworCQlkaXNhYmxlZCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCXByX2luZm8oInNoX210dTI6ICVzIHVzZWQgZm9yIHBlcmlvZGljIGNsb2NrIGV2ZW50c1xuIiwKKwkJCWNlZC0+bmFtZSk7CisJCXNoX210dTJfZW5hYmxlKHApOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwkJaWYgKCFkaXNhYmxlZCkKKwkJCXNoX210dTJfZGlzYWJsZShwKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9TSFVURE9XTjoKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNoX210dTJfcmVnaXN0ZXJfY2xvY2tldmVudChzdHJ1Y3Qgc2hfbXR1Ml9wcml2ICpwLAorCQkJCSAgICAgICBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIHJhdGluZykKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZWQgPSAmcC0+Y2VkOworCWludCByZXQ7CisKKwltZW1zZXQoY2VkLCAwLCBzaXplb2YoKmNlZCkpOworCisJY2VkLT5uYW1lID0gbmFtZTsKKwljZWQtPmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUM7CisJY2VkLT5yYXRpbmcgPSByYXRpbmc7CisJY2VkLT5jcHVtYXNrID0gY3B1bWFza19vZigwKTsKKwljZWQtPnNldF9tb2RlID0gc2hfbXR1Ml9jbG9ja19ldmVudF9tb2RlOworCisJcmV0ID0gc2V0dXBfaXJxKHAtPmlycWFjdGlvbi5pcnEsICZwLT5pcnFhY3Rpb24pOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJzaF9tdHUyOiBmYWlsZWQgdG8gcmVxdWVzdCBpcnEgJWRcbiIsCisJCSAgICAgICBwLT5pcnFhY3Rpb24uaXJxKTsKKwkJcmV0dXJuOworCX0KKworCXByX2luZm8oInNoX210dTI6ICVzIHVzZWQgZm9yIGNsb2NrIGV2ZW50c1xuIiwgY2VkLT5uYW1lKTsKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2VkKTsKK30KKworc3RhdGljIGludCBzaF9tdHUyX3JlZ2lzdGVyKHN0cnVjdCBzaF9tdHUyX3ByaXYgKnAsIGNoYXIgKm5hbWUsCisJCQkgICAgdW5zaWduZWQgbG9uZyBjbG9ja2V2ZW50X3JhdGluZykKK3sKKwlpZiAoY2xvY2tldmVudF9yYXRpbmcpCisJCXNoX210dTJfcmVnaXN0ZXJfY2xvY2tldmVudChwLCBuYW1lLCBjbG9ja2V2ZW50X3JhdGluZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF9tdHUyX3NldHVwKHN0cnVjdCBzaF9tdHUyX3ByaXYgKnAsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNoX3RpbWVyX2NvbmZpZyAqY2ZnID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycSwgcmV0OworCXJldCA9IC1FTlhJTzsKKworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwlwLT5wZGV2ID0gcGRldjsKKworCWlmICghY2ZnKSB7CisJCWRldl9lcnIoJnAtPnBkZXYtPmRldiwgIm1pc3NpbmcgcGxhdGZvcm0gZGF0YVxuIik7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwLT5wZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcC0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBJL08gbWVtb3J5XG4iKTsKKwkJZ290byBlcnIwOworCX0KKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocC0+cGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcC0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpcnFcbiIpOworCQlnb3RvIGVycjA7CisJfQorCisJLyogbWFwIG1lbW9yeSwgbGV0IG1hcGJhc2UgcG9pbnQgdG8gb3VyIGNoYW5uZWwgKi8KKwlwLT5tYXBiYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKHAtPm1hcGJhc2UgPT0gTlVMTCkgeworCQlwcl9lcnIoInNoX210dTI6IGZhaWxlZCB0byByZW1hcCBJL08gbWVtb3J5XG4iKTsKKwkJZ290byBlcnIwOworCX0KKworCS8qIHNldHVwIGRhdGEgZm9yIHNldHVwX2lycSgpICh0b28gZWFybHkgZm9yIHJlcXVlc3RfaXJxKCkpICovCisJcC0+aXJxYWN0aW9uLm5hbWUgPSBjZmctPm5hbWU7CisJcC0+aXJxYWN0aW9uLmhhbmRsZXIgPSBzaF9tdHUyX2ludGVycnVwdDsKKwlwLT5pcnFhY3Rpb24uZGV2X2lkID0gcDsKKwlwLT5pcnFhY3Rpb24uaXJxID0gaXJxOworCXAtPmlycWFjdGlvbi5mbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1RJTUVSIHwgSVJRRl9JUlFQT0xMOworCXAtPmlycWFjdGlvbi5tYXNrID0gQ1BVX01BU0tfTk9ORTsKKworCS8qIGdldCBob2xkIG9mIGNsb2NrICovCisJcC0+Y2xrID0gY2xrX2dldCgmcC0+cGRldi0+ZGV2LCBjZmctPmNsayk7CisJaWYgKElTX0VSUihwLT5jbGspKSB7CisJCXByX2Vycigic2hfbXR1MjogY2Fubm90IGdldCBjbG9jayBcIiVzXCJcbiIsIGNmZy0+Y2xrKTsKKwkJcmV0ID0gUFRSX0VSUihwLT5jbGspOworCQlnb3RvIGVycjE7CisJfQorCisJcmV0dXJuIHNoX210dTJfcmVnaXN0ZXIocCwgY2ZnLT5uYW1lLCBjZmctPmNsb2NrZXZlbnRfcmF0aW5nKTsKKyBlcnIxOgorCWlvdW5tYXAocC0+bWFwYmFzZSk7CisgZXJyMDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaF9tdHUyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNoX210dTJfcHJpdiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzaF90aW1lcl9jb25maWcgKmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisKKwlpZiAocCkgeworCQlwcl9pbmZvKCJzaF9tdHUyOiAlcyBrZXB0IGFzIGVhcmx5dGltZXJcbiIsIGNmZy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUwpOworCWlmIChwID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGRyaXZlciBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gc2hfbXR1Ml9zZXR1cChwLCBwZGV2KTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKHApOworCQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc2hfbXR1Ml9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gLUVCVVNZOyAvKiBjYW5ub3QgdW5yZWdpc3RlciBjbG9ja2V2ZW50ICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNoX210dTJfZGV2aWNlX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc2hfbXR1Ml9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNoX210dTJfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAic2hfbXR1MiIsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgc2hfbXR1Ml9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2hfbXR1Ml9kZXZpY2VfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNoX210dTJfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaF9tdHUyX2RldmljZV9kcml2ZXIpOworfQorCitlYXJseV9wbGF0Zm9ybV9pbml0KCJlYXJseXRpbWVyIiwgJnNoX210dTJfZGV2aWNlX2RyaXZlcik7Cittb2R1bGVfaW5pdChzaF9tdHUyX2luaXQpOworbW9kdWxlX2V4aXQoc2hfbXR1Ml9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFnbnVzIERhbW0iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwZXJIIE1UVTIgVGltZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX3RtdS5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmVhNDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYwpAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqIFN1cGVySCBUaW1lciBTdXBwb3J0IC0gVE1VCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBNYWdudXMgRGFtbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgorCitzdHJ1Y3Qgc2hfdG11X3ByaXYgeworCXZvaWQgX19pb21lbSAqbWFwYmFzZTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGlycWFjdGlvbiBpcnFhY3Rpb247CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJdW5zaWduZWQgbG9uZyBwZXJpb2RpYzsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGNlZDsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgY3M7Cit9OworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNoX3RtdV9sb2NrKTsKKworI2RlZmluZSBUU1RSIC0xIC8qIHNoYXJlZCByZWdpc3RlciAqLworI2RlZmluZSBUQ09SICAwIC8qIGNoYW5uZWwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVENOVCAxIC8qIGNoYW5uZWwgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgVENSIDIgLyogY2hhbm5lbCByZWdpc3RlciAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2hfdG11X3JlYWQoc3RydWN0IHNoX3RtdV9wcml2ICpwLCBpbnQgcmVnX25yKQoreworCXN0cnVjdCBzaF90aW1lcl9jb25maWcgKmNmZyA9IHAtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHAtPm1hcGJhc2U7CisJdW5zaWduZWQgbG9uZyBvZmZzOworCisJaWYgKHJlZ19uciA9PSBUU1RSKQorCQlyZXR1cm4gaW9yZWFkOChiYXNlIC0gY2ZnLT5jaGFubmVsX29mZnNldCk7CisKKwlvZmZzID0gcmVnX25yIDw8IDI7CisKKwlpZiAocmVnX25yID09IFRDUikKKwkJcmV0dXJuIGlvcmVhZDE2KGJhc2UgKyBvZmZzKTsKKwllbHNlCisJCXJldHVybiBpb3JlYWQzMihiYXNlICsgb2Zmcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaF90bXVfd3JpdGUoc3RydWN0IHNoX3RtdV9wcml2ICpwLCBpbnQgcmVnX25yLAorCQkJCXVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJc3RydWN0IHNoX3RpbWVyX2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJdm9pZCBfX2lvbWVtICpiYXNlID0gcC0+bWFwYmFzZTsKKwl1bnNpZ25lZCBsb25nIG9mZnM7CisKKwlpZiAocmVnX25yID09IFRTVFIpIHsKKwkJaW93cml0ZTgodmFsdWUsIGJhc2UgLSBjZmctPmNoYW5uZWxfb2Zmc2V0KTsKKwkJcmV0dXJuOworCX0KKworCW9mZnMgPSByZWdfbnIgPDwgMjsKKworCWlmIChyZWdfbnIgPT0gVENSKQorCQlpb3dyaXRlMTYodmFsdWUsIGJhc2UgKyBvZmZzKTsKKwllbHNlCisJCWlvd3JpdGUzMih2YWx1ZSwgYmFzZSArIG9mZnMpOworfQorCitzdGF0aWMgdm9pZCBzaF90bXVfc3RhcnRfc3RvcF9jaChzdHJ1Y3Qgc2hfdG11X3ByaXYgKnAsIGludCBzdGFydCkKK3sKKwlzdHJ1Y3Qgc2hfdGltZXJfY29uZmlnICpjZmcgPSBwLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWx1ZTsKKworCS8qIHN0YXJ0IHN0b3AgcmVnaXN0ZXIgc2hhcmVkIGJ5IG11bHRpcGxlIHRpbWVyIGNoYW5uZWxzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNoX3RtdV9sb2NrLCBmbGFncyk7CisJdmFsdWUgPSBzaF90bXVfcmVhZChwLCBUU1RSKTsKKworCWlmIChzdGFydCkKKwkJdmFsdWUgfD0gMSA8PCBjZmctPnRpbWVyX2JpdDsKKwllbHNlCisJCXZhbHVlICY9IH4oMSA8PCBjZmctPnRpbWVyX2JpdCk7CisKKwlzaF90bXVfd3JpdGUocCwgVFNUUiwgdmFsdWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNoX3RtdV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgc2hfdG11X2VuYWJsZShzdHJ1Y3Qgc2hfdG11X3ByaXYgKnApCit7CisJc3RydWN0IHNoX3RpbWVyX2NvbmZpZyAqY2ZnID0gcC0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IHJldDsKKworCS8qIGVuYWJsZSBjbG9jayAqLworCXJldCA9IGNsa19lbmFibGUocC0+Y2xrKTsKKwlpZiAocmV0KSB7CisJCXByX2Vycigic2hfdG11OiBjYW5ub3QgZW5hYmxlIGNsb2NrIFwiJXNcIlxuIiwgY2ZnLT5jbGspOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIG1ha2Ugc3VyZSBjaGFubmVsIGlzIGRpc2FibGVkICovCisJc2hfdG11X3N0YXJ0X3N0b3BfY2gocCwgMCk7CisKKwkvKiBtYXhpbXVtIHRpbWVvdXQgKi8KKwlzaF90bXVfd3JpdGUocCwgVENPUiwgMHhmZmZmZmZmZik7CisJc2hfdG11X3dyaXRlKHAsIFRDTlQsIDB4ZmZmZmZmZmYpOworCisJLyogY29uZmlndXJlIGNoYW5uZWwgdG8gcGFyZW50IGNsb2NrIC8gNCwgaXJxIG9mZiAqLworCXAtPnJhdGUgPSBjbGtfZ2V0X3JhdGUocC0+Y2xrKSAvIDQ7CisJc2hfdG11X3dyaXRlKHAsIFRDUiwgMHgwMDAwKTsKKworCS8qIGVuYWJsZSBjaGFubmVsICovCisJc2hfdG11X3N0YXJ0X3N0b3BfY2gocCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hfdG11X2Rpc2FibGUoc3RydWN0IHNoX3RtdV9wcml2ICpwKQoreworCS8qIGRpc2FibGUgY2hhbm5lbCAqLworCXNoX3RtdV9zdGFydF9zdG9wX2NoKHAsIDApOworCisJLyogc3RvcCBjbG9jayAqLworCWNsa19kaXNhYmxlKHAtPmNsayk7Cit9CisKK3N0YXRpYyB2b2lkIHNoX3RtdV9zZXRfbmV4dChzdHJ1Y3Qgc2hfdG11X3ByaXYgKnAsIHVuc2lnbmVkIGxvbmcgZGVsdGEsCisJCQkgICAgaW50IHBlcmlvZGljKQoreworCS8qIHN0b3AgdGltZXIgKi8KKwlzaF90bXVfc3RhcnRfc3RvcF9jaChwLCAwKTsKKworCS8qIGFja25vd2xlZGdlIGludGVycnVwdCAqLworCXNoX3RtdV9yZWFkKHAsIFRDUik7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0ICovCisJc2hfdG11X3dyaXRlKHAsIFRDUiwgMHgwMDIwKTsKKworCS8qIHJlbG9hZCBkZWx0YSB2YWx1ZSBpbiBjYXNlIG9mIHBlcmlvZGljIHRpbWVyICovCisJaWYgKHBlcmlvZGljKQorCQlzaF90bXVfd3JpdGUocCwgVENPUiwgZGVsdGEpOworCWVsc2UKKwkJc2hfdG11X3dyaXRlKHAsIFRDT1IsIDApOworCisJc2hfdG11X3dyaXRlKHAsIFRDTlQsIGRlbHRhKTsKKworCS8qIHN0YXJ0IHRpbWVyICovCisJc2hfdG11X3N0YXJ0X3N0b3BfY2gocCwgMSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaF90bXVfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3Qgc2hfdG11X3ByaXYgKnAgPSBkZXZfaWQ7CisKKwkvKiBkaXNhYmxlIG9yIGFja25vd2xlZGdlIGludGVycnVwdCAqLworCWlmIChwLT5jZWQubW9kZSA9PSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKQorCQlzaF90bXVfd3JpdGUocCwgVENSLCAweDAwMDApOworCWVsc2UKKwkJc2hfdG11X3dyaXRlKHAsIFRDUiwgMHgwMDIwKTsKKworCS8qIG5vdGlmeSBjbG9ja2V2ZW50IGxheWVyICovCisJcC0+Y2VkLmV2ZW50X2hhbmRsZXIoJnAtPmNlZCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3RydWN0IHNoX3RtdV9wcml2ICpjc190b19zaF90bXUoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNzLCBzdHJ1Y3Qgc2hfdG11X3ByaXYsIGNzKTsKK30KKworc3RhdGljIGN5Y2xlX3Qgc2hfdG11X2Nsb2Nrc291cmNlX3JlYWQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKK3sKKwlzdHJ1Y3Qgc2hfdG11X3ByaXYgKnAgPSBjc190b19zaF90bXUoY3MpOworCisJcmV0dXJuIHNoX3RtdV9yZWFkKHAsIFRDTlQpIF4gMHhmZmZmZmZmZjsKK30KKworc3RhdGljIGludCBzaF90bXVfY2xvY2tzb3VyY2VfZW5hYmxlKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJc3RydWN0IHNoX3RtdV9wcml2ICpwID0gY3NfdG9fc2hfdG11KGNzKTsKKwlpbnQgcmV0OworCisJcmV0ID0gc2hfdG11X2VuYWJsZShwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogVE9ETzogY2FsY3VsYXRlIGdvb2Qgc2hpZnQgZnJvbSByYXRlIGFuZCBjb3VudGVyIGJpdCB3aWR0aCAqLworCWNzLT5zaGlmdCA9IDEwOworCWNzLT5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChwLT5yYXRlLCBjcy0+c2hpZnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzaF90bXVfY2xvY2tzb3VyY2VfZGlzYWJsZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXNoX3RtdV9kaXNhYmxlKGNzX3RvX3NoX3RtdShjcykpOworfQorCitzdGF0aWMgaW50IHNoX3RtdV9yZWdpc3Rlcl9jbG9ja3NvdXJjZShzdHJ1Y3Qgc2hfdG11X3ByaXYgKnAsCisJCQkJICAgICAgIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgcmF0aW5nKQoreworCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3MgPSAmcC0+Y3M7CisKKwljcy0+bmFtZSA9IG5hbWU7CisJY3MtPnJhdGluZyA9IHJhdGluZzsKKwljcy0+cmVhZCA9IHNoX3RtdV9jbG9ja3NvdXJjZV9yZWFkOworCWNzLT5lbmFibGUgPSBzaF90bXVfY2xvY2tzb3VyY2VfZW5hYmxlOworCWNzLT5kaXNhYmxlID0gc2hfdG11X2Nsb2Nrc291cmNlX2Rpc2FibGU7CisJY3MtPm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKTsKKwljcy0+ZmxhZ3MgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUzsKKwlwcl9pbmZvKCJzaF90bXU6ICVzIHVzZWQgYXMgY2xvY2sgc291cmNlXG4iLCBjcy0+bmFtZSk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXIoY3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNoX3RtdV9wcml2ICpjZWRfdG9fc2hfdG11KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNlZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNlZCwgc3RydWN0IHNoX3RtdV9wcml2LCBjZWQpOworfQorCitzdGF0aWMgdm9pZCBzaF90bXVfY2xvY2tfZXZlbnRfc3RhcnQoc3RydWN0IHNoX3RtdV9wcml2ICpwLCBpbnQgcGVyaW9kaWMpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2VkID0gJnAtPmNlZDsKKworCXNoX3RtdV9lbmFibGUocCk7CisKKwkvKiBUT0RPOiBjYWxjdWxhdGUgZ29vZCBzaGlmdCBmcm9tIHJhdGUgYW5kIGNvdW50ZXIgYml0IHdpZHRoICovCisKKwljZWQtPnNoaWZ0ID0gMzI7CisJY2VkLT5tdWx0ID0gZGl2X3NjKHAtPnJhdGUsIE5TRUNfUEVSX1NFQywgY2VkLT5zaGlmdCk7CisJY2VkLT5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4ZmZmZmZmZmYsIGNlZCk7CisJY2VkLT5taW5fZGVsdGFfbnMgPSA1MDAwOworCisJaWYgKHBlcmlvZGljKSB7CisJCXAtPnBlcmlvZGljID0gKHAtPnJhdGUgKyBIWi8yKSAvIEhaOworCQlzaF90bXVfc2V0X25leHQocCwgcC0+cGVyaW9kaWMsIDEpOworCX0KK30KKworc3RhdGljIHZvaWQgc2hfdG11X2Nsb2NrX2V2ZW50X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNlZCkKK3sKKwlzdHJ1Y3Qgc2hfdG11X3ByaXYgKnAgPSBjZWRfdG9fc2hfdG11KGNlZCk7CisJaW50IGRpc2FibGVkID0gMDsKKworCS8qIGRlYWwgd2l0aCBvbGQgc2V0dGluZyBmaXJzdCAqLworCXN3aXRjaCAoY2VkLT5tb2RlKSB7CisJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKKwljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6CisJCXNoX3RtdV9kaXNhYmxlKHApOworCQlkaXNhYmxlZCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCXByX2luZm8oInNoX3RtdTogJXMgdXNlZCBmb3IgcGVyaW9kaWMgY2xvY2sgZXZlbnRzXG4iLAorCQkJY2VkLT5uYW1lKTsKKwkJc2hfdG11X2Nsb2NrX2V2ZW50X3N0YXJ0KHAsIDEpOworCQlicmVhazsKKwljYXNlIENMT0NLX0VWVF9NT0RFX09ORVNIT1Q6CisJCXByX2luZm8oInNoX3RtdTogJXMgdXNlZCBmb3Igb25lc2hvdCBjbG9jayBldmVudHNcbiIsCisJCQljZWQtPm5hbWUpOworCQlzaF90bXVfY2xvY2tfZXZlbnRfc3RhcnQocCwgMCk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCQlpZiAoIWRpc2FibGVkKQorCQkJc2hfdG11X2Rpc2FibGUocCk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNoX3RtdV9jbG9ja19ldmVudF9uZXh0KHVuc2lnbmVkIGxvbmcgZGVsdGEsCisJCQkJICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2VkKQoreworCXN0cnVjdCBzaF90bXVfcHJpdiAqcCA9IGNlZF90b19zaF90bXUoY2VkKTsKKworCUJVR19PTihjZWQtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisKKwkvKiBwcm9ncmFtIG5ldyBkZWx0YSB2YWx1ZSAqLworCXNoX3RtdV9zZXRfbmV4dChwLCBkZWx0YSwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNoX3RtdV9yZWdpc3Rlcl9jbG9ja2V2ZW50KHN0cnVjdCBzaF90bXVfcHJpdiAqcCwKKwkJCQkgICAgICAgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyByYXRpbmcpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2VkID0gJnAtPmNlZDsKKwlpbnQgcmV0OworCisJbWVtc2V0KGNlZCwgMCwgc2l6ZW9mKCpjZWQpKTsKKworCWNlZC0+bmFtZSA9IG5hbWU7CisJY2VkLT5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDOworCWNlZC0+ZmVhdHVyZXMgfD0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKKwljZWQtPnJhdGluZyA9IHJhdGluZzsKKwljZWQtPmNwdW1hc2sgPSBjcHVtYXNrX29mKDApOworCWNlZC0+c2V0X25leHRfZXZlbnQgPSBzaF90bXVfY2xvY2tfZXZlbnRfbmV4dDsKKwljZWQtPnNldF9tb2RlID0gc2hfdG11X2Nsb2NrX2V2ZW50X21vZGU7CisKKwlyZXQgPSBzZXR1cF9pcnEocC0+aXJxYWN0aW9uLmlycSwgJnAtPmlycWFjdGlvbik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoInNoX3RtdTogZmFpbGVkIHRvIHJlcXVlc3QgaXJxICVkXG4iLAorCQkgICAgICAgcC0+aXJxYWN0aW9uLmlycSk7CisJCXJldHVybjsKKwl9CisKKwlwcl9pbmZvKCJzaF90bXU6ICVzIHVzZWQgZm9yIGNsb2NrIGV2ZW50c1xuIiwgY2VkLT5uYW1lKTsKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoY2VkKTsKK30KKworc3RhdGljIGludCBzaF90bXVfcmVnaXN0ZXIoc3RydWN0IHNoX3RtdV9wcml2ICpwLCBjaGFyICpuYW1lLAorCQkgICAgdW5zaWduZWQgbG9uZyBjbG9ja2V2ZW50X3JhdGluZywKKwkJICAgIHVuc2lnbmVkIGxvbmcgY2xvY2tzb3VyY2VfcmF0aW5nKQoreworCWlmIChjbG9ja2V2ZW50X3JhdGluZykKKwkJc2hfdG11X3JlZ2lzdGVyX2Nsb2NrZXZlbnQocCwgbmFtZSwgY2xvY2tldmVudF9yYXRpbmcpOworCWVsc2UgaWYgKGNsb2Nrc291cmNlX3JhdGluZykKKwkJc2hfdG11X3JlZ2lzdGVyX2Nsb2Nrc291cmNlKHAsIG5hbWUsIGNsb2Nrc291cmNlX3JhdGluZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF90bXVfc2V0dXAoc3RydWN0IHNoX3RtdV9wcml2ICpwLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaF90aW1lcl9jb25maWcgKmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpcnEsIHJldDsKKwlyZXQgPSAtRU5YSU87CisKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJcC0+cGRldiA9IHBkZXY7CisKKwlpZiAoIWNmZykgeworCQlkZXZfZXJyKCZwLT5wZGV2LT5kZXYsICJtaXNzaW5nIHBsYXRmb3JtIGRhdGFcbiIpOworCQlnb3RvIGVycjA7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcCk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocC0+cGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnAtPnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgSS9PIG1lbW9yeVxuIik7CisJCWdvdG8gZXJyMDsKKwl9CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHAtPnBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoJnAtPnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXJxXG4iKTsKKwkJZ290byBlcnIwOworCX0KKworCS8qIG1hcCBtZW1vcnksIGxldCBtYXBiYXNlIHBvaW50IHRvIG91ciBjaGFubmVsICovCisJcC0+bWFwYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChwLT5tYXBiYXNlID09IE5VTEwpIHsKKwkJcHJfZXJyKCJzaF90bXU6IGZhaWxlZCB0byByZW1hcCBJL08gbWVtb3J5XG4iKTsKKwkJZ290byBlcnIwOworCX0KKworCS8qIHNldHVwIGRhdGEgZm9yIHNldHVwX2lycSgpICh0b28gZWFybHkgZm9yIHJlcXVlc3RfaXJxKCkpICovCisJcC0+aXJxYWN0aW9uLm5hbWUgPSBjZmctPm5hbWU7CisJcC0+aXJxYWN0aW9uLmhhbmRsZXIgPSBzaF90bXVfaW50ZXJydXB0OworCXAtPmlycWFjdGlvbi5kZXZfaWQgPSBwOworCXAtPmlycWFjdGlvbi5pcnEgPSBpcnE7CisJcC0+aXJxYWN0aW9uLmZsYWdzID0gSVJRRl9ESVNBQkxFRCB8IElSUUZfVElNRVIgfCBJUlFGX0lSUVBPTEw7CisJcC0+aXJxYWN0aW9uLm1hc2sgPSBDUFVfTUFTS19OT05FOworCisJLyogZ2V0IGhvbGQgb2YgY2xvY2sgKi8KKwlwLT5jbGsgPSBjbGtfZ2V0KCZwLT5wZGV2LT5kZXYsIGNmZy0+Y2xrKTsKKwlpZiAoSVNfRVJSKHAtPmNsaykpIHsKKwkJcHJfZXJyKCJzaF90bXU6IGNhbm5vdCBnZXQgY2xvY2sgXCIlc1wiXG4iLCBjZmctPmNsayk7CisJCXJldCA9IFBUUl9FUlIocC0+Y2xrKTsKKwkJZ290byBlcnIxOworCX0KKworCXJldHVybiBzaF90bXVfcmVnaXN0ZXIocCwgY2ZnLT5uYW1lLAorCQkJICAgICAgIGNmZy0+Y2xvY2tldmVudF9yYXRpbmcsCisJCQkgICAgICAgY2ZnLT5jbG9ja3NvdXJjZV9yYXRpbmcpOworIGVycjE6CisJaW91bm1hcChwLT5tYXBiYXNlKTsKKyBlcnIwOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNoX3RtdV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzaF90bXVfcHJpdiAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzaF90aW1lcl9jb25maWcgKmNmZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWludCByZXQ7CisKKwlpZiAocCkgeworCQlwcl9pbmZvKCJzaF90bXU6ICVzIGtlcHQgYXMgZWFybHl0aW1lclxuIiwgY2ZnLT5uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcCA9IGttYWxsb2Moc2l6ZW9mKCpwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZHJpdmVyIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBzaF90bXVfc2V0dXAocCwgcGRldik7CisJaWYgKHJldCkgeworCQlrZnJlZShwKTsKKwkJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNoX3RtdV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gLUVCVVNZOyAvKiBjYW5ub3QgdW5yZWdpc3RlciBjbG9ja2V2ZW50IGFuZCBjbG9ja3NvdXJjZSAqLworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzaF90bXVfZGV2aWNlX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc2hfdG11X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2hfdG11X3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNoX3RtdSIsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgc2hfdG11X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaF90bXVfZGV2aWNlX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzaF90bXVfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaF90bXVfZGV2aWNlX2RyaXZlcik7Cit9CisKK2Vhcmx5X3BsYXRmb3JtX2luaXQoImVhcmx5dGltZXIiLCAmc2hfdG11X2RldmljZV9kcml2ZXIpOworbW9kdWxlX2luaXQoc2hfdG11X2luaXQpOworbW9kdWxlX2V4aXQoc2hfdG11X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYWdudXMgRGFtbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggVE1VIFRpbWVyIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwppbmRleCA5NTY5ODJmLi5hYjRmMzU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwpAQCAtNDksNyArNDksNiBAQAogCiBjb25maWcgRURBQ19NTV9FREFDCiAJdHJpc3RhdGUgIk1haW4gTWVtb3J5IEVEQUMgKEVycm9yIERldGVjdGlvbiBBbmQgQ29ycmVjdGlvbikgcmVwb3J0aW5nIgotCWRlZmF1bHQgeQogCWhlbHAKIAkgIFNvbWUgc3lzdGVtcyBhcmUgYWJsZSB0byBkZXRlY3QgYW5kIGNvcnJlY3QgZXJyb3JzIGluIG1haW4KIAkgIG1lbW9yeS4gIEVEQUMgY2FuIHJlcG9ydCBzdGF0aXN0aWNzIG9uIG1lbW9yeSBlcnJvcgpAQCAtNTgsNiArNTcsMzEgQEAKIAkgIG9jY3VycmVkIHNvIHRoYXQgYSBwYXJ0aWN1bGFyIGZhaWxpbmcgbWVtb3J5IG1vZHVsZSBjYW4gYmUKIAkgIHJlcGxhY2VkLiAgSWYgdW5zdXJlLCBzZWxlY3QgJ1knLgogCitjb25maWcgRURBQ19BTUQ2NAorCXRyaXN0YXRlICJBTUQ2NCAoT3B0ZXJvbiwgQXRobG9uNjQpIEs4LCBGMTBoLCBGMTFoIgorCWRlcGVuZHMgb24gRURBQ19NTV9FREFDICYmIEs4X05CICYmIFg4Nl82NCAmJiBQQ0kKKwloZWxwCisJICBTdXBwb3J0IGZvciBlcnJvciBkZXRlY3Rpb24gYW5kIGNvcnJlY3Rpb24gb24gdGhlIEFNRCA2NAorCSAgRmFtaWxpZXMgb2YgTWVtb3J5IENvbnRyb2xsZXJzIChLOCwgRjEwaCBhbmQgRjExaCkKKworY29uZmlnIEVEQUNfQU1ENjRfRVJST1JfSU5KRUNUSU9OCisJYm9vbCAiU3lzZnMgRXJyb3IgSW5qZWN0aW9uIGZhY2lsaXRpZXMiCisJZGVwZW5kcyBvbiBFREFDX0FNRDY0CisJaGVscAorCSAgUmVjZW50IE9wdGVyb25zIChGYW1pbHkgMTBoIGFuZCBsYXRlcikgcHJvdmlkZSBmb3IgTWVtb3J5IEVycm9yCisJICBJbmplY3Rpb24gaW50byB0aGUgRUNDIGRldGVjdGlvbiBjaXJjdWl0cy4gVGhlIGFtZDY0X2VkYWMgbW9kdWxlCisJICBhbGxvd3MgdGhlIG9wZXJhdG9yL3VzZXIgdG8gaW5qZWN0IFVuY29ycmVjdGFibGUgYW5kIENvcnJlY3RhYmxlCisJICBlcnJvcnMgaW50byBEUkFNLgorCisJICBXaGVuIGVuYWJsZWQsIGluIGVhY2ggb2YgdGhlIHJlc3BlY3RpdmUgbWVtb3J5IGNvbnRyb2xsZXIgZGlyZWN0b3JpZXMKKwkgICgvc3lzL2RldmljZXMvc3lzdGVtL2VkYWMvbWMvbWNYKSwgdGhlcmUgYXJlIDMgaW5wdXQgZmlsZXM6CisKKwkgIC0gaW5qZWN0X3NlY3Rpb24gKDAuLjMsIDE2LWJ5dGUgc2VjdGlvbiBvZiA2NC1ieXRlIGNhY2hlbGluZSksCisJICAtIGluamVjdF93b3JkICgwLi44LCAxNi1iaXQgd29yZCBvZiAxNi1ieXRlIHNlY3Rpb24pLAorCSAgLSBpbmplY3RfZWNjX3ZlY3RvciAoaGV4IGVjYyB2ZWN0b3I6IHNlbGVjdCBiaXRzIG9mIGluamVjdCB3b3JkKQorCisJICBJbiBhZGRpdGlvbiwgdGhlcmUgYXJlIHR3byBjb250cm9sIGZpbGVzLCBpbmplY3RfcmVhZCBhbmQgaW5qZWN0X3dyaXRlLAorCSAgd2hpY2ggdHJpZ2dlciB0aGUgRFJBTSBFQ0MgUmVhZCBhbmQgV3JpdGUgcmVzcGVjdGl2ZWx5LgogCiBjb25maWcgRURBQ19BTUQ3NlgKIAl0cmlzdGF0ZSAiQU1EIDc2eCAoNzYwLCA3NjIsIDc2OCkiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUgYi9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKaW5kZXggNTkwNzY4MS4uNjMzZGM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQpAQCAtMzAsNiArMzAsMTMgQEAKIG9iai0kKENPTkZJR19FREFDX1gzOCkJCQkrPSB4MzhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19JODI4NjApCQkrPSBpODI4NjBfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19SODI2MDApCQkrPSByODI2MDBfZWRhYy5vCisKK2FtZDY0X2VkYWNfbW9kLXkgOj0gIGFtZDY0X2VkYWNfZXJyX3R5cGVzLm8gYW1kNjRfZWRhYy5vCithbWQ2NF9lZGFjX21vZC0kKENPTkZJR19FREFDX0RFQlVHKSArPSBhbWQ2NF9lZGFjX2RiZy5vCithbWQ2NF9lZGFjX21vZC0kKENPTkZJR19FREFDX0FNRDY0X0VSUk9SX0lOSkVDVElPTikgKz0gYW1kNjRfZWRhY19pbmoubworCitvYmotJChDT05GSUdfRURBQ19BTUQ2NCkJCSs9IGFtZDY0X2VkYWNfbW9kLm8KKwogb2JqLSQoQ09ORklHX0VEQUNfUEFTRU1JKQkJKz0gcGFzZW1pX2VkYWMubwogb2JqLSQoQ09ORklHX0VEQUNfTVBDODVYWCkJCSs9IG1wYzg1eHhfZWRhYy5vCiBvYmotJChDT05GSUdfRURBQ19NVjY0WDYwKQkJKz0gbXY2NHg2MF9lZGFjLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNmJmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCkBAIC0wLDAgKzEsMzM1NCBAQAorI2luY2x1ZGUgImFtZDY0X2VkYWMuaCIKKyNpbmNsdWRlIDxhc20vazguaD4KKworc3RhdGljIHN0cnVjdCBlZGFjX3BjaV9jdGxfaW5mbyAqYW1kNjRfY3RsX3BjaTsKKworc3RhdGljIGludCByZXBvcnRfZ2FydF9lcnJvcnM7Cittb2R1bGVfcGFyYW0ocmVwb3J0X2dhcnRfZXJyb3JzLCBpbnQsIDA2NDQpOworCisvKgorICogU2V0IGJ5IGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuIElmIEJJT1MgaGFzIGVuYWJsZWQgdGhlIEVDQywgdGhpcyBvdmVycmlkZSBpcworICogY2xlYXJlZCB0byBwcmV2ZW50IHJlLWVuYWJsaW5nIHRoZSBoYXJkd2FyZSBieSB0aGlzIGRyaXZlci4KKyAqLworc3RhdGljIGludCBlY2NfZW5hYmxlX292ZXJyaWRlOworbW9kdWxlX3BhcmFtKGVjY19lbmFibGVfb3ZlcnJpZGUsIGludCwgMDY0NCk7CisKKy8qIExvb2t1cCB0YWJsZSBmb3IgYWxsIHBvc3NpYmxlIE1DIGNvbnRyb2wgaW5zdGFuY2VzICovCitzdHJ1Y3QgYW1kNjRfcHZ0Oworc3RhdGljIHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaV9sb29rdXBbTUFYX05VTU5PREVTXTsKK3N0YXRpYyBzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnRfbG9va3VwW01BWF9OVU1OT0RFU107CisKKy8qCisgKiBNZW1vcnkgc2NydWJiZXIgY29udHJvbCBpbnRlcmZhY2UuIEZvciBLOCwgbWVtb3J5IHNjcnViYmluZyBpcyBoYW5kbGVkIGJ5CisgKiBoYXJkd2FyZSBhbmQgY2FuIGludm9sdmUgTDIgY2FjaGUsIGRjYWNoZSBhcyB3ZWxsIGFzIHRoZSBtYWluIG1lbW9yeS4gV2l0aAorICogRjEwLCB0aGlzIGlzIGV4dGVuZGVkIHRvIEwzIGNhY2hlIHNjcnViYmluZyBvbiBDUFUgbW9kZWxzIHNwb3J0aW5nIHRoYXQKKyAqIGZ1bmN0aW9uYWxpdHkuCisgKgorICogVGhpcyBjYXVzZXMgdGhlICJ1bml0cyIgZm9yIHRoZSBzY3J1YmJpbmcgc3BlZWQgdG8gdmFyeSBmcm9tIDY0IGJ5dGUgYmxvY2tzCisgKiAoZHJhbSkgb3ZlciB0byBjYWNoZSBsaW5lcy4gVGhpcyBpcyBuYXN0eSwgc28gd2Ugd2lsbCB1c2UgYmFuZHdpZHRoIGluCisgKiBieXRlcy9zZWMgZm9yIHRoZSBzZXR0aW5nLgorICoKKyAqIEN1cnJlbnRseSwgd2Ugb25seSBkbyBkcmFtIHNjcnViYmluZy4gSWYgdGhlIHNjcnViYmluZyBpcyBkb25lIGluIHNvZnR3YXJlIG9uCisgKiBvdGhlciBhcmNocywgd2UgbWlnaHQgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBjYWNoZXMgZGlyZWN0bHkuCisgKi8KKworLyoKKyAqIHNjYW4gdGhlIHNjcnViIHJhdGUgbWFwcGluZyB0YWJsZSBmb3IgYSBjbG9zZSBvciBtYXRjaGluZyBiYW5kd2lkdGggdmFsdWUgdG8KKyAqIGlzc3VlLiBJZiByZXF1ZXN0ZWQgaXMgdG9vIGJpZywgdGhlbiB1c2UgbGFzdCBtYXhpbXVtIHZhbHVlIGZvdW5kLgorICovCitzdGF0aWMgaW50IGFtZDY0X3NlYXJjaF9zZXRfc2NydWJfcmF0ZShzdHJ1Y3QgcGNpX2RldiAqY3RsLCB1MzIgbmV3X2J3LAorCQkJCSAgICAgICB1MzIgbWluX3NjcnVicmF0ZSkKK3sKKwl1MzIgc2NydWJ2YWw7CisJaW50IGk7CisKKwkvKgorCSAqIG1hcCB0aGUgY29uZmlndXJlZCByYXRlIChuZXdfYncpIHRvIGEgdmFsdWUgc3BlY2lmaWMgdG8gdGhlIEFNRDY0CisJICogbWVtb3J5IGNvbnRyb2xsZXIgYW5kIGFwcGx5IHRvIHJlZ2lzdGVyLiBTZWFyY2ggZm9yIHRoZSBmaXJzdAorCSAqIGJhbmR3aWR0aCBlbnRyeSB0aGF0IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGUgc2V0dGluZyByZXF1ZXN0ZWQKKwkgKiBhbmQgcHJvZ3JhbSB0aGF0LiBJZiBhdCBsYXN0IGVudHJ5LCB0dXJuIG9mZiBEUkFNIHNjcnViYmluZy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzY3J1YnJhdGVzKTsgaSsrKSB7CisJCS8qCisJCSAqIHNraXAgc2NydWIgcmF0ZXMgd2hpY2ggYXJlbid0IHJlY29tbWVuZGVkCisJCSAqIChzZWUgRjEwIEJLREcsIEYzeDU4KQorCQkgKi8KKwkJaWYgKHNjcnVicmF0ZXNbaV0uc2NydWJ2YWwgPCBtaW5fc2NydWJyYXRlKQorCQkJY29udGludWU7CisKKwkJaWYgKHNjcnVicmF0ZXNbaV0uYmFuZHdpZHRoIDw9IG5ld19idykKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIGlmIG5vIHN1aXRhYmxlIGJhbmR3aWR0aCBmb3VuZCwgdHVybiBvZmYgRFJBTSBzY3J1YmJpbmcKKwkJICogZW50aXJlbHkgYnkgZmFsbGluZyBiYWNrIHRvIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlCisJCSAqIHNjcnVicmF0ZXMgYXJyYXkuCisJCSAqLworCX0KKworCXNjcnVidmFsID0gc2NydWJyYXRlc1tpXS5zY3J1YnZhbDsKKwlpZiAoc2NydWJ2YWwpCisJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfTUMsCisJCQkgICAgIlNldHRpbmcgc2NydWIgcmF0ZSBiYW5kd2lkdGg6ICV1XG4iLAorCQkJICAgIHNjcnVicmF0ZXNbaV0uYmFuZHdpZHRoKTsKKwllbHNlCisJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfTUMsICJUdXJuaW5nIHNjcnViYmluZyBvZmYuXG4iKTsKKworCXBjaV93cml0ZV9iaXRzMzIoY3RsLCBLOF9TQ1JDVFJMLCBzY3J1YnZhbCwgMHgwMDFGKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZDY0X3NldF9zY3J1Yl9yYXRlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdTMyICpiYW5kd2lkdGgpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgbWluX3NjcnVicmF0ZSA9IDB4MDsKKworCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODYpIHsKKwljYXNlIDB4ZjoKKwkJbWluX3NjcnVicmF0ZSA9IEs4X01JTl9TQ1JVQl9SQVRFX0JJVFM7CisJCWJyZWFrOworCWNhc2UgMHgxMDoKKwkJbWluX3NjcnVicmF0ZSA9IEYxMF9NSU5fU0NSVUJfUkFURV9CSVRTOworCQlicmVhazsKKwljYXNlIDB4MTE6CisJCW1pbl9zY3J1YnJhdGUgPSBGMTFfTUlOX1NDUlVCX1JBVEVfQklUUzsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhbWQ2NF9wcmludGsoS0VSTl9FUlIsICJVbnN1cHBvcnRlZCBmYW1pbHkhXG4iKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBhbWQ2NF9zZWFyY2hfc2V0X3NjcnViX3JhdGUocHZ0LT5taXNjX2YzX2N0bCwgKmJhbmR3aWR0aCwKKwkJCW1pbl9zY3J1YnJhdGUpOworfQorCitzdGF0aWMgaW50IGFtZDY0X2dldF9zY3J1Yl9yYXRlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdTMyICpidykKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXUzMiBzY3J1YnZhbCA9IDA7CisJaW50IHN0YXR1cyA9IC0xLCBpLCByZXQgPSAwOworCisJcmV0ID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X1NDUkNUUkwsICZzY3J1YnZhbCk7CisJaWYgKHJldCkKKwkJZGVidWdmMCgiUmVhZGluZyBLOF9TQ1JDVFJMIGZhaWxlZFxuIik7CisKKwlzY3J1YnZhbCA9IHNjcnVidmFsICYgMHgwMDFGOworCisJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywKKwkJICAgICJwY2ktcmVhZCwgc2RyYW0gc2NydWIgY29udHJvbCB2YWx1ZTogJWQgXG4iLCBzY3J1YnZhbCk7CisKKwlmb3IgKGkgPSAwOyBBUlJBWV9TSVpFKHNjcnVicmF0ZXMpOyBpKyspIHsKKwkJaWYgKHNjcnVicmF0ZXNbaV0uc2NydWJ2YWwgPT0gc2NydWJ2YWwpIHsKKwkJCSpidyA9IHNjcnVicmF0ZXNbaV0uYmFuZHdpZHRoOworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogTWFwIGZyb20gYSBDU1JPVyBlbnRyeSB0byB0aGUgbWFzayBlbnRyeSB0aGF0IG9wZXJhdGVzIG9uIGl0ICovCitzdGF0aWMgaW5saW5lIHUzMiBhbWQ2NF9tYXBfdG9fZGNzX21hc2soc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgY3Nyb3cpCit7CisJcmV0dXJuIGNzcm93ID4+IChwdnQtPm51bV9kY3NtID4+IDMpOworfQorCisvKiByZXR1cm4gdGhlICdiYXNlJyBhZGRyZXNzIHRoZSBpJ3RoIENTIGVudHJ5IG9mIHRoZSAnZGN0JyBEUkFNIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyB1MzIgYW1kNjRfZ2V0X2RjdF9iYXNlKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGRjdCwgaW50IGNzcm93KQoreworCWlmIChkY3QgPT0gMCkKKwkJcmV0dXJuIHB2dC0+ZGNzYjBbY3Nyb3ddOworCWVsc2UKKwkJcmV0dXJuIHB2dC0+ZGNzYjFbY3Nyb3ddOworfQorCisvKgorICogUmV0dXJuIHRoZSAnbWFzaycgYWRkcmVzcyB0aGUgaSd0aCBDUyBlbnRyeS4gVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgYmVjYXVzZQorICogdGhlcmUgbnVtYmVyIG9mIERDU00gcmVnaXN0ZXJzIG9uIFJldiBFIGFuZCBwcmlvciB2cyBSZXYgRiBhbmQgbGF0ZXIgaXMKKyAqIGRpZmZlcmVudC4KKyAqLworc3RhdGljIHUzMiBhbWQ2NF9nZXRfZGN0X21hc2soc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgZGN0LCBpbnQgY3Nyb3cpCit7CisJaWYgKGRjdCA9PSAwKQorCQlyZXR1cm4gcHZ0LT5kY3NtMFthbWQ2NF9tYXBfdG9fZGNzX21hc2socHZ0LCBjc3JvdyldOworCWVsc2UKKwkJcmV0dXJuIHB2dC0+ZGNzbTFbYW1kNjRfbWFwX3RvX2Rjc19tYXNrKHB2dCwgY3Nyb3cpXTsKK30KKworCisvKgorICogSW4gKmJhc2UgYW5kICpsaW1pdCwgcGFzcyBiYWNrIHRoZSBmdWxsIDQwLWJpdCBiYXNlIGFuZCBsaW1pdCBwaHlzaWNhbAorICogYWRkcmVzc2VzIGZvciB0aGUgbm9kZSBnaXZlbiBieSBub2RlX2lkLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBmcm9tCisgKiBEUkFNIEJhc2UgKHNlY3Rpb24gMy40LjQuMSkgYW5kIERSQU0gTGltaXQgKHNlY3Rpb24gMy40LjQuMikgcmVnaXN0ZXJzLiBUaGUKKyAqIGJhc2UgYW5kIGxpbWl0IGFkZHJlc3NlcyBhcmUgb2YgdHlwZSBTeXNBZGRyLCBhcyBkZWZpbmVkIGF0IHRoZSBzdGFydCBvZgorICogc2VjdGlvbiAzLjQuNCAocC4gNzApLiAgVGhleSBhcmUgdGhlIGxvd2VzdCBhbmQgaGlnaGVzdCBwaHlzaWNhbCBhZGRyZXNzZXMKKyAqIGluIHRoZSBhZGRyZXNzIHJhbmdlIHRoZXkgcmVwcmVzZW50LgorICovCitzdGF0aWMgdm9pZCBhbWQ2NF9nZXRfYmFzZV9hbmRfbGltaXQoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgbm9kZV9pZCwKKwkJCSAgICAgICB1NjQgKmJhc2UsIHU2NCAqbGltaXQpCit7CisJKmJhc2UgPSBwdnQtPmRyYW1fYmFzZVtub2RlX2lkXTsKKwkqbGltaXQgPSBwdnQtPmRyYW1fbGltaXRbbm9kZV9pZF07Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiB0aGUgU3lzQWRkciBnaXZlbiBieSBzeXNfYWRkciBtYXRjaGVzIHRoZSBiYXNlL2xpbWl0IGFzc29jaWF0ZWQKKyAqIHdpdGggbm9kZV9pZAorICovCitzdGF0aWMgaW50IGFtZDY0X2Jhc2VfbGltaXRfbWF0Y2goc3RydWN0IGFtZDY0X3B2dCAqcHZ0LAorCQkJCQl1NjQgc3lzX2FkZHIsIGludCBub2RlX2lkKQoreworCXU2NCBiYXNlLCBsaW1pdCwgYWRkcjsKKworCWFtZDY0X2dldF9iYXNlX2FuZF9saW1pdChwdnQsIG5vZGVfaWQsICZiYXNlLCAmbGltaXQpOworCisJLyogVGhlIEs4IHRyZWF0cyB0aGlzIGFzIGEgNDAtYml0IHZhbHVlLiAgSG93ZXZlciwgYml0cyA2My00MCB3aWxsIGJlCisJICogYWxsIG9uZXMgaWYgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgaW1wbGVtZW50ZWQgYWRkcmVzcyBiaXQgaXMgMS4KKwkgKiBIZXJlIHdlIGRpc2NhcmQgYml0cyA2My00MC4gIFNlZSBzZWN0aW9uIDMuNC4yIG9mIEFNRCBwdWJsaWNhdGlvbgorCSAqIDI0NTkyOiBBTUQgeDg2LTY0IEFyY2hpdGVjdHVyZSBQcm9ncmFtbWVyJ3MgTWFudWFsIFZvbHVtZSAxCisJICogQXBwbGljYXRpb24gUHJvZ3JhbW1pbmcuCisJICovCisJYWRkciA9IHN5c19hZGRyICYgMHgwMDAwMDBmZmZmZmZmZmZmdWxsOworCisJcmV0dXJuIChhZGRyID49IGJhc2UpICYmIChhZGRyIDw9IGxpbWl0KTsKK30KKworLyoKKyAqIEF0dGVtcHQgdG8gbWFwIGEgU3lzQWRkciB0byBhIG5vZGUuIE9uIHN1Y2Nlc3MsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlCisgKiBtZW1fY3RsX2luZm8gc3RydWN0dXJlIGZvciB0aGUgbm9kZSB0aGF0IHRoZSBTeXNBZGRyIG1hcHMgdG8uCisgKgorICogT24gZmFpbHVyZSwgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWVtX2N0bF9pbmZvICpmaW5kX21jX2J5X3N5c19hZGRyKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJCXU2NCBzeXNfYWRkcikKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQ7CisJaW50IG5vZGVfaWQ7CisJdTMyIGludGx2X2VuLCBiaXRzOworCisJLyoKKwkgKiBIZXJlIHdlIHVzZSB0aGUgRFJBTSBCYXNlIChzZWN0aW9uIDMuNC40LjEpIGFuZCBEUkFNIExpbWl0IChzZWN0aW9uCisJICogMy40LjQuMikgcmVnaXN0ZXJzIHRvIG1hcCB0aGUgU3lzQWRkciB0byBhIG5vZGUgSUQuCisJICovCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qCisJICogVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hvdWxkIGJlIHRoZSBzYW1lIGZvciBhbGwgRFJBTSBCYXNlCisJICogcmVnaXN0ZXJzLiAgVGhlcmVmb3JlIHdlIGFyYml0cmFyaWx5IGNob29zZSB0byByZWFkIGl0IGZyb20gdGhlCisJICogcmVnaXN0ZXIgZm9yIG5vZGUgMC4KKwkgKi8KKwlpbnRsdl9lbiA9IHB2dC0+ZHJhbV9JbnRsdkVuWzBdOworCisJaWYgKGludGx2X2VuID09IDApIHsKKwkJZm9yIChub2RlX2lkID0gMDsgOyApIHsKKwkJCWlmIChhbWQ2NF9iYXNlX2xpbWl0X21hdGNoKHB2dCwgc3lzX2FkZHIsIG5vZGVfaWQpKQorCQkJCWJyZWFrOworCisJCQlpZiAoKytub2RlX2lkID49IERSQU1fUkVHX0NPVU5UKQorCQkJCWdvdG8gZXJyX25vX21hdGNoOworCQl9CisJCWdvdG8gZm91bmQ7CisJfQorCisJaWYgKHVubGlrZWx5KChpbnRsdl9lbiAhPSAoMHgwMSA8PCA4KSkgJiYKKwkJICAgICAoaW50bHZfZW4gIT0gKDB4MDMgPDwgOCkpICYmCisJCSAgICAgKGludGx2X2VuICE9ICgweDA3IDw8IDgpKSkpIHsKKwkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywgImp1bmsgdmFsdWUgb2YgMHgleCBleHRyYWN0ZWQgZnJvbSAiCisJCQkgICAgICJJbnRsdkVuIGZpZWxkIG9mIERSQU0gQmFzZSBSZWdpc3RlciBmb3Igbm9kZSAwOiAiCisJCQkgICAgICJUaGlzIHByb2JhYmx5IGluZGljYXRlcyBhIEJJT1MgYnVnLlxuIiwgaW50bHZfZW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwliaXRzID0gKCgodTMyKSBzeXNfYWRkcikgPj4gMTIpICYgaW50bHZfZW47CisKKwlmb3IgKG5vZGVfaWQgPSAwOyA7ICkgeworCQlpZiAoKHB2dC0+ZHJhbV9saW1pdFtub2RlX2lkXSAmIGludGx2X2VuKSA9PSBiaXRzKQorCQkJYnJlYWs7CS8qIGludGx2X3NlbCBmaWVsZCBtYXRjaGVzICovCisKKwkJaWYgKCsrbm9kZV9pZCA+PSBEUkFNX1JFR19DT1VOVCkKKwkJCWdvdG8gZXJyX25vX21hdGNoOworCX0KKworCS8qIHNhbml0eSB0ZXN0IGZvciBzeXNfYWRkciAqLworCWlmICh1bmxpa2VseSghYW1kNjRfYmFzZV9saW1pdF9tYXRjaChwdnQsIHN5c19hZGRyLCBub2RlX2lkKSkpIHsKKwkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywKKwkJCSAgIiVzKCk6IHN5c19hZGRyIDB4JWx4IGZhbGxzIG91dHNpZGUgYmFzZS9saW1pdCAiCisJCQkgICJhZGRyZXNzIHJhbmdlIGZvciBub2RlICVkIHdpdGggbm9kZSBpbnRlcmxlYXZpbmcgIgorCQkJICAiZW5hYmxlZC5cbiIsIF9fZnVuY19fLCAodW5zaWduZWQgbG9uZylzeXNfYWRkciwKKwkJCSAgbm9kZV9pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworZm91bmQ6CisJcmV0dXJuIGVkYWNfbWNfZmluZChub2RlX2lkKTsKKworZXJyX25vX21hdGNoOgorCWRlYnVnZjIoInN5c19hZGRyIDB4JWx4IGRvZXNuJ3QgbWF0Y2ggYW55IG5vZGVcbiIsCisJCSh1bnNpZ25lZCBsb25nKXN5c19hZGRyKTsKKworCXJldHVybiBOVUxMOworfQorCisvKgorICogRXh0cmFjdCB0aGUgRFJBTSBDUyBiYXNlIGFkZHJlc3MgZnJvbSBzZWxlY3RlZCBjc3JvdyByZWdpc3Rlci4KKyAqLworc3RhdGljIHU2NCBiYXNlX2Zyb21fZGN0X2Jhc2Uoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgY3Nyb3cpCit7CisJcmV0dXJuICgodTY0KSAoYW1kNjRfZ2V0X2RjdF9iYXNlKHB2dCwgMCwgY3Nyb3cpICYgcHZ0LT5kY3NiX2Jhc2UpKSA8PAorCQkJCXB2dC0+ZGNzX3NoaWZ0OworfQorCisvKgorICogRXh0cmFjdCB0aGUgbWFzayBmcm9tIHRoZSBkY3NiMFtjc3Jvd10gZW50cnkgaW4gYSBDUFUgcmV2aXNpb24tc3BlY2lmaWMgd2F5LgorICovCitzdGF0aWMgdTY0IG1hc2tfZnJvbV9kY3RfbWFzayhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsIGludCBjc3JvdykKK3sKKwl1NjQgZGNzbV9iaXRzLCBvdGhlcl9iaXRzOworCXU2NCBtYXNrOworCisJLyogRXh0cmFjdCBiaXRzIGZyb20gRFJBTSBDUyBNYXNrLiAqLworCWRjc21fYml0cyA9IGFtZDY0X2dldF9kY3RfbWFzayhwdnQsIDAsIGNzcm93KSAmIHB2dC0+ZGNzbV9tYXNrOworCisJb3RoZXJfYml0cyA9IHB2dC0+ZGNzbV9tYXNrOworCW90aGVyX2JpdHMgPSB+KG90aGVyX2JpdHMgPDwgcHZ0LT5kY3Nfc2hpZnQpOworCisJLyoKKwkgKiBUaGUgZXh0cmFjdGVkIGJpdHMgZnJvbSBEQ1NNIGJlbG9uZyBpbiB0aGUgc3BhY2VzIHJlcHJlc2VudGVkIGJ5CisJICogdGhlIGNsZWFyZWQgYml0cyBpbiBvdGhlcl9iaXRzLgorCSAqLworCW1hc2sgPSAoZGNzbV9iaXRzIDw8IHB2dC0+ZGNzX3NoaWZ0KSB8IG90aGVyX2JpdHM7CisKKwlyZXR1cm4gbWFzazsKK30KKworLyoKKyAqIEBpbnB1dF9hZGRyIGlzIGFuIElucHV0QWRkciBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUgZ2l2ZW4gYnkgbWNpLiBSZXR1cm4gdGhlCisgKiBjc3JvdyB0aGF0IGlucHV0X2FkZHIgbWFwcyB0bywgb3IgLTEgb24gZmFpbHVyZSAobm8gY3Nyb3cgY2xhaW1zIGlucHV0X2FkZHIpLgorICovCitzdGF0aWMgaW50IGlucHV0X2FkZHJfdG9fY3Nyb3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1NjQgaW5wdXRfYWRkcikKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQ7CisJaW50IGNzcm93OworCXU2NCBiYXNlLCBtYXNrOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qCisJICogSGVyZSB3ZSB1c2UgdGhlIERSQU0gQ1MgQmFzZSBhbmQgRFJBTSBDUyBNYXNrIHJlZ2lzdGVycy4gRm9yIGVhY2ggQ1MKKwkgKiBiYXNlL21hc2sgcmVnaXN0ZXIgcGFpciwgdGVzdCB0aGUgY29uZGl0aW9uIHNob3duIG5lYXIgdGhlIHN0YXJ0IG9mCisJICogc2VjdGlvbiAzLjUuNCAocC4gODQsIEJLREcgIzI2MDk0LCBLOCwgcmV2QS1FKS4KKwkgKi8KKwlmb3IgKGNzcm93ID0gMDsgY3Nyb3cgPCBDSElQU0VMRUNUX0NPVU5UOyBjc3JvdysrKSB7CisKKwkJLyogVGhpcyBEUkFNIGNoaXAgc2VsZWN0IGlzIGRpc2FibGVkIG9uIHRoaXMgbm9kZSAqLworCQlpZiAoKHB2dC0+ZGNzYjBbY3Nyb3ddICYgSzhfRENTQl9DU19FTkFCTEUpID09IDApCisJCQljb250aW51ZTsKKworCQliYXNlID0gYmFzZV9mcm9tX2RjdF9iYXNlKHB2dCwgY3Nyb3cpOworCQltYXNrID0gfm1hc2tfZnJvbV9kY3RfbWFzayhwdnQsIGNzcm93KTsKKworCQlpZiAoKGlucHV0X2FkZHIgJiBtYXNrKSA9PSAoYmFzZSAmIG1hc2spKSB7CisJCQlkZWJ1Z2YyKCJJbnB1dEFkZHIgMHglbHggbWF0Y2hlcyBjc3JvdyAlZCAobm9kZSAlZClcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpaW5wdXRfYWRkciwgY3Nyb3csCisJCQkJcHZ0LT5tY19ub2RlX2lkKTsKKworCQkJcmV0dXJuIGNzcm93OworCQl9CisJfQorCisJZGVidWdmMigibm8gbWF0Y2hpbmcgY3Nyb3cgZm9yIElucHV0QWRkciAweCVseCAoTUMgbm9kZSAlZClcbiIsCisJCSh1bnNpZ25lZCBsb25nKWlucHV0X2FkZHIsIHB2dC0+bWNfbm9kZV9pZCk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGJhc2UgdmFsdWUgZGVmaW5lZCBieSB0aGUgRFJBTSBCYXNlIHJlZ2lzdGVyIGZvciB0aGUgbm9kZQorICogcmVwcmVzZW50ZWQgYnkgbWNpLiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmdWxsIDQwLWJpdCB2YWx1ZSBkZXNwaXRlIHRoZQorICogZmFjdCB0aGF0IHRoZSByZWdpc3RlciBvbmx5IHN0b3JlcyBiaXRzIDM5LTI0IG9mIHRoZSB2YWx1ZS4gU2VlIHNlY3Rpb24KKyAqIDMuNC40LjEgKEJLREcgIzI2MDk0LCBLOCwgcmV2QS1FKQorICovCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfZHJhbV9iYXNlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJcmV0dXJuIHB2dC0+ZHJhbV9iYXNlW3B2dC0+bWNfbm9kZV9pZF07Cit9CisKKy8qCisgKiBPYnRhaW4gaW5mbyBmcm9tIHRoZSBEUkFNIEhvbGUgQWRkcmVzcyBSZWdpc3RlciAoc2VjdGlvbiAzLjQuOCwgcHViICMyNjA5NCkKKyAqIGZvciB0aGUgbm9kZSByZXByZXNlbnRlZCBieSBtY2kuIEluZm8gaXMgcGFzc2VkIGJhY2sgaW4gKmhvbGVfYmFzZSwKKyAqICpob2xlX29mZnNldCwgYW5kICpob2xlX3NpemUuICBGdW5jdGlvbiByZXR1cm5zIDAgaWYgaW5mbyBpcyB2YWxpZCBvciAxIGlmCisgKiBpbmZvIGlzIGludmFsaWQuIEluZm8gbWF5IGJlIGludmFsaWQgZm9yIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6CisgKgorICogLSBUaGUgcmV2aXNpb24gb2YgdGhlIG5vZGUgaXMgbm90IEUgb3IgZ3JlYXRlci4gIEluIHRoaXMgY2FzZSwgdGhlIERSQU0gSG9sZQorICogICBBZGRyZXNzIFJlZ2lzdGVyIGRvZXMgbm90IGV4aXN0LgorICoKKyAqIC0gVGhlIERyYW1Ib2xlVmFsaWQgYml0IGlzIGNsZWFyZWQgaW4gdGhlIERSQU0gSG9sZSBBZGRyZXNzIFJlZ2lzdGVyLAorICogICBpbmRpY2F0aW5nIHRoYXQgaXRzIGNvbnRlbnRzIGFyZSBub3QgdmFsaWQuCisgKgorICogVGhlIHZhbHVlcyBwYXNzZWQgYmFjayBpbiAqaG9sZV9iYXNlLCAqaG9sZV9vZmZzZXQsIGFuZCAqaG9sZV9zaXplIGFyZQorICogY29tcGxldGUgMzItYml0IHZhbHVlcyBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIGJpdGZpZWxkcyBpbiB0aGUgREhBUgorICogb25seSByZXByZXNlbnQgYml0cyAzMS0yNCBvZiB0aGUgYmFzZSBhbmQgb2Zmc2V0IHZhbHVlcy4KKyAqLworaW50IGFtZDY0X2dldF9kcmFtX2hvbGVfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHU2NCAqaG9sZV9iYXNlLAorCQkJICAgICB1NjQgKmhvbGVfb2Zmc2V0LCB1NjQgKmhvbGVfc2l6ZSkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXU2NCBiYXNlOworCisJLyogb25seSByZXZFIGFuZCBsYXRlciBoYXZlIHRoZSBEUkFNIEhvbGUgQWRkcmVzcyBSZWdpc3RlciAqLworCWlmIChib290X2NwdV9kYXRhLng4NiA9PSAweGYgJiYgcHZ0LT5leHRfbW9kZWwgPCBPUFRFUk9OX0NQVV9SRVZfRSkgeworCQlkZWJ1Z2YxKCIgIHJldmlzaW9uICVkIGZvciBub2RlICVkIGRvZXMgbm90IHN1cHBvcnQgREhBUlxuIiwKKwkJCXB2dC0+ZXh0X21vZGVsLCBwdnQtPm1jX25vZGVfaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBvbmx5IHZhbGlkIGZvciBGYW0xMGggKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxMCAmJgorCSAgICAocHZ0LT5kaGFyICYgRjEwX0RSQU1fTUVNX0hPSVNUX1ZBTElEKSA9PSAwKSB7CisJCWRlYnVnZjEoIiAgRHJhbSBNZW1vcnkgSG9pc3RpbmcgaXMgRElTQUJMRUQgb24gdGhpcyBzeXN0ZW1cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoKHB2dC0+ZGhhciAmIERIQVJfVkFMSUQpID09IDApIHsKKwkJZGVidWdmMSgiICBEcmFtIE1lbW9yeSBIb2lzdGluZyBpcyBESVNBQkxFRCBvbiB0aGlzIG5vZGUgJWRcbiIsCisJCQlwdnQtPm1jX25vZGVfaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBUaGlzIG5vZGUgaGFzIE1lbW9yeSBIb2lzdGluZyAqLworCisJLyogKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLQorCSAqIHwgbWVtb3J5ICAgICAgICAgICB8IERSQU0gaG9sZSAgICAgICAgICB8IHJlbG9jYXRlZCAgICAgICAgICB8CisJICogfCBbMCwgKHggLSAxKV0gICAgIHwgW3gsIDB4ZmZmZmZmZmZdICAgIHwgYWRkcmVzc2VzIGZyb20gICAgIHwKKwkgKiB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCBEUkFNIGhvbGUgICAgICAgICAgfAorCSAqIHwgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8IFsweDEwMDAwMDAwMCwgICAgICB8CisJICogfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICgweDEwMDAwMDAwMCsgICAgIHwKKwkgKiB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgfCAgICgweGZmZmZmZmZmLXgpKV0gfAorCSAqICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0KKwkgKgorCSAqIEFib3ZlIGlzIGEgZGlhZ3JhbSBvZiBwaHlzaWNhbCBtZW1vcnkgc2hvd2luZyB0aGUgRFJBTSBob2xlIGFuZCB0aGUKKwkgKiByZWxvY2F0ZWQgYWRkcmVzc2VzIGZyb20gdGhlIERSQU0gaG9sZS4gIEFzIHNob3duLCB0aGUgRFJBTSBob2xlCisJICogc3RhcnRzIGF0IGFkZHJlc3MgeCAodGhlIGJhc2UgYWRkcmVzcykgYW5kIGV4dGVuZHMgdGhyb3VnaCBhZGRyZXNzCisJICogMHhmZmZmZmZmZi4gIFRoZSBEUkFNIEhvbGUgQWRkcmVzcyBSZWdpc3RlciAoREhBUikgcmVsb2NhdGVzIHRoZQorCSAqIGFkZHJlc3NlcyBpbiB0aGUgaG9sZSBzbyB0aGF0IHRoZXkgc3RhcnQgYXQgMHgxMDAwMDAwMDAuCisJICovCisKKwliYXNlID0gZGhhcl9iYXNlKHB2dC0+ZGhhcik7CisKKwkqaG9sZV9iYXNlID0gYmFzZTsKKwkqaG9sZV9zaXplID0gKDB4MXVsbCA8PCAzMikgLSBiYXNlOworCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMHhmKQorCQkqaG9sZV9vZmZzZXQgPSBmMTBfZGhhcl9vZmZzZXQocHZ0LT5kaGFyKTsKKwllbHNlCisJCSpob2xlX29mZnNldCA9IGs4X2RoYXJfb2Zmc2V0KHB2dC0+ZGhhcik7CisKKwlkZWJ1Z2YxKCIgIERIQVIgaW5mbyBmb3Igbm9kZSAlZCBiYXNlIDB4JWx4IG9mZnNldCAweCVseCBzaXplIDB4JWx4XG4iLAorCQlwdnQtPm1jX25vZGVfaWQsICh1bnNpZ25lZCBsb25nKSpob2xlX2Jhc2UsCisJCSh1bnNpZ25lZCBsb25nKSpob2xlX29mZnNldCwgKHVuc2lnbmVkIGxvbmcpKmhvbGVfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFtZDY0X2dldF9kcmFtX2hvbGVfaW5mbyk7CisKKy8qCisgKiBSZXR1cm4gdGhlIERyYW1BZGRyIHRoYXQgdGhlIFN5c0FkZHIgZ2l2ZW4gYnkgQHN5c19hZGRyIG1hcHMgdG8uICBJdCBpcworICogYXNzdW1lZCB0aGF0IHN5c19hZGRyIG1hcHMgdG8gdGhlIG5vZGUgZ2l2ZW4gYnkgbWNpLgorICoKKyAqIFRoZSBmaXJzdCBwYXJ0IG9mIHNlY3Rpb24gMy40LjQgKHAuIDcwKSBzaG93cyBob3cgdGhlIERSQU0gQmFzZSAoc2VjdGlvbgorICogMy40LjQuMSkgYW5kIERSQU0gTGltaXQgKHNlY3Rpb24gMy40LjQuMikgcmVnaXN0ZXJzIGFyZSB1c2VkIHRvIHRyYW5zbGF0ZSBhCisgKiBTeXNBZGRyIHRvIGEgRHJhbUFkZHIuIElmIHRoZSBEUkFNIEhvbGUgQWRkcmVzcyBSZWdpc3RlciAoREhBUikgaXMgZW5hYmxlZCwKKyAqIHRoZW4gaXQgaXMgYWxzbyBpbnZvbHZlZCBpbiB0cmFuc2xhdGluZyBhIFN5c0FkZHIgdG8gYSBEcmFtQWRkci4gU2VjdGlvbnMKKyAqIDMuNC44IGFuZCAzLjUuOC4yIGRlc2NyaWJlIHRoZSBESEFSIGFuZCBob3cgaXQgaXMgdXNlZCBmb3IgbWVtb3J5IGhvaXN0aW5nLgorICogVGhlc2UgcGFydHMgb2YgdGhlIGRvY3VtZW50YXRpb24gYXJlIHVuY2xlYXIuIEkgaW50ZXJwcmV0IHRoZW0gYXMgZm9sbG93czoKKyAqCisgKiBXaGVuIG5vZGUgbiByZWNlaXZlcyBhIFN5c0FkZHIsIGl0IHByb2Nlc3NlcyB0aGUgU3lzQWRkciBhcyBmb2xsb3dzOgorICoKKyAqIDEuIEl0IGV4dHJhY3RzIHRoZSBEUkFNQmFzZSBhbmQgRFJBTUxpbWl0IHZhbHVlcyBmcm9tIHRoZSBEUkFNIEJhc2UgYW5kIERSQU0KKyAqICAgIExpbWl0IHJlZ2lzdGVycyBmb3Igbm9kZSBuLiBJZiB0aGUgU3lzQWRkciBpcyBub3Qgd2l0aGluIHRoZSByYW5nZQorICogICAgc3BlY2lmaWVkIGJ5IHRoZSBiYXNlIGFuZCBsaW1pdCB2YWx1ZXMsIHRoZW4gbm9kZSBuIGlnbm9yZXMgdGhlIFN5c2FkZHIKKyAqICAgIChzaW5jZSBpdCBkb2VzIG5vdCBtYXAgdG8gbm9kZSBuKS4gT3RoZXJ3aXNlIGNvbnRpbnVlIHRvIHN0ZXAgMiBiZWxvdy4KKyAqCisgKiAyLiBJZiB0aGUgRHJhbUhvbGVWYWxpZCBiaXQgb2YgdGhlIERIQVIgZm9yIG5vZGUgbiBpcyBjbGVhciwgdGhlIERIQVIgaXMKKyAqICAgIGRpc2FibGVkIHNvIHNraXAgdG8gc3RlcCAzIGJlbG93LiBPdGhlcndpc2Ugc2VlIGlmIHRoZSBTeXNBZGRyIGlzIHdpdGhpbgorICogICAgdGhlIHJhbmdlIG9mIHJlbG9jYXRlZCBhZGRyZXNzZXMgKHN0YXJ0aW5nIGF0IDB4MTAwMDAwMDAwKSBmcm9tIHRoZSBEUkFNCisgKiAgICBob2xlLiBJZiBub3QsIHNraXAgdG8gc3RlcCAzIGJlbG93LiBFbHNlIGdldCB0aGUgdmFsdWUgb2YgdGhlCisgKiAgICBEcmFtSG9sZU9mZnNldCBmaWVsZCBmcm9tIHRoZSBESEFSLiBUbyBvYnRhaW4gdGhlIERyYW1BZGRyLCBzdWJ0cmFjdCB0aGUKKyAqICAgIG9mZnNldCBkZWZpbmVkIGJ5IHRoaXMgdmFsdWUgZnJvbSB0aGUgU3lzQWRkci4KKyAqCisgKiAzLiBPYnRhaW4gdGhlIGJhc2UgYWRkcmVzcyBmb3Igbm9kZSBuIGZyb20gdGhlIERSQU1CYXNlIGZpZWxkIG9mIHRoZSBEUkFNCisgKiAgICBCYXNlIHJlZ2lzdGVyIGZvciBub2RlIG4uIFRvIG9idGFpbiB0aGUgRHJhbUFkZHIsIHN1YnRyYWN0IHRoZSBiYXNlCisgKiAgICBhZGRyZXNzIGZyb20gdGhlIFN5c0FkZHIsIGFzIHNob3duIG5lYXIgdGhlIHN0YXJ0IG9mIHNlY3Rpb24gMy40LjQgKHAuNzApLgorICovCitzdGF0aWMgdTY0IHN5c19hZGRyX3RvX2RyYW1fYWRkcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHU2NCBzeXNfYWRkcikKK3sKKwl1NjQgZHJhbV9iYXNlLCBob2xlX2Jhc2UsIGhvbGVfb2Zmc2V0LCBob2xlX3NpemUsIGRyYW1fYWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCWRyYW1fYmFzZSA9IGdldF9kcmFtX2Jhc2UobWNpKTsKKworCXJldCA9IGFtZDY0X2dldF9kcmFtX2hvbGVfaW5mbyhtY2ksICZob2xlX2Jhc2UsICZob2xlX29mZnNldCwKKwkJCQkgICAgICAmaG9sZV9zaXplKTsKKwlpZiAoIXJldCkgeworCQlpZiAoKHN5c19hZGRyID49ICgxdWxsIDw8IDMyKSkgJiYKKwkJICAgIChzeXNfYWRkciA8ICgoMXVsbCA8PCAzMikgKyBob2xlX3NpemUpKSkgeworCQkJLyogdXNlIERIQVIgdG8gdHJhbnNsYXRlIFN5c0FkZHIgdG8gRHJhbUFkZHIgKi8KKwkJCWRyYW1fYWRkciA9IHN5c19hZGRyIC0gaG9sZV9vZmZzZXQ7CisKKwkJCWRlYnVnZjIoInVzaW5nIERIQVIgdG8gdHJhbnNsYXRlIFN5c0FkZHIgMHglbHggdG8gIgorCQkJCSJEcmFtQWRkciAweCVseFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZylzeXNfYWRkciwKKwkJCQkodW5zaWduZWQgbG9uZylkcmFtX2FkZHIpOworCisJCQlyZXR1cm4gZHJhbV9hZGRyOworCQl9CisJfQorCisJLyoKKwkgKiBUcmFuc2xhdGUgdGhlIFN5c0FkZHIgdG8gYSBEcmFtQWRkciBhcyBzaG93biBuZWFyIHRoZSBzdGFydCBvZgorCSAqIHNlY3Rpb24gMy40LjQgKHAuIDcwKS4gIEFsdGhvdWdoIHN5c19hZGRyIGlzIGEgNjQtYml0IHZhbHVlLCB0aGUgazgKKwkgKiBvbmx5IGRlYWxzIHdpdGggNDAtYml0IHZhbHVlcy4gIFRoZXJlZm9yZSB3ZSBkaXNjYXJkIGJpdHMgNjMtNDAgb2YKKwkgKiBzeXNfYWRkciBiZWxvdy4gIElmIGJpdCAzOSBvZiBzeXNfYWRkciBpcyAxIHRoZW4gdGhlIGJpdHMgd2UKKwkgKiBkaXNjYXJkIGFyZSBhbGwgMXMuICBPdGhlcndpc2UgdGhlIGJpdHMgd2UgZGlzY2FyZCBhcmUgYWxsIDBzLiAgU2VlCisJICogc2VjdGlvbiAzLjQuMiBvZiBBTUQgcHVibGljYXRpb24gMjQ1OTI6IEFNRCB4ODYtNjQgQXJjaGl0ZWN0dXJlCisJICogUHJvZ3JhbW1lcidzIE1hbnVhbCBWb2x1bWUgMSBBcHBsaWNhdGlvbiBQcm9ncmFtbWluZy4KKwkgKi8KKwlkcmFtX2FkZHIgPSAoc3lzX2FkZHIgJiAweGZmZmZmZmZmZmZ1bGwpIC0gZHJhbV9iYXNlOworCisJZGVidWdmMigidXNpbmcgRFJBTSBCYXNlIHJlZ2lzdGVyIHRvIHRyYW5zbGF0ZSBTeXNBZGRyIDB4JWx4IHRvICIKKwkJIkRyYW1BZGRyIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylzeXNfYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcpZHJhbV9hZGRyKTsKKwlyZXR1cm4gZHJhbV9hZGRyOworfQorCisvKgorICogQGludGx2X2VuIGlzIHRoZSB2YWx1ZSBvZiB0aGUgSW50bHZFbiBmaWVsZCBmcm9tIGEgRFJBTSBCYXNlIHJlZ2lzdGVyCisgKiAoc2VjdGlvbiAzLjQuNC4xKS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgZnJvbSBhIFN5c0FkZHIgdGhhdCBhcmUgdXNlZAorICogZm9yIG5vZGUgaW50ZXJsZWF2aW5nLgorICovCitzdGF0aWMgaW50IG51bV9ub2RlX2ludGVybGVhdmVfYml0cyh1bnNpZ25lZCBpbnRsdl9lbikKK3sKKwlzdGF0aWMgY29uc3QgaW50IGludGx2X3NoaWZ0X3RhYmxlW10gPSB7IDAsIDEsIDAsIDIsIDAsIDAsIDAsIDMgfTsKKwlpbnQgbjsKKworCUJVR19PTihpbnRsdl9lbiA+IDcpOworCW4gPSBpbnRsdl9zaGlmdF90YWJsZVtpbnRsdl9lbl07CisJcmV0dXJuIG47Cit9CisKKy8qIFRyYW5zbGF0ZSB0aGUgRHJhbUFkZHIgZ2l2ZW4gYnkgQGRyYW1fYWRkciB0byBhbiBJbnB1dEFkZHIuICovCitzdGF0aWMgdTY0IGRyYW1fYWRkcl90b19pbnB1dF9hZGRyKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdTY0IGRyYW1fYWRkcikKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQ7CisJaW50IGludGx2X3NoaWZ0OworCXU2NCBpbnB1dF9hZGRyOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCS8qCisJICogU2VlIHRoZSBzdGFydCBvZiBzZWN0aW9uIDMuNC40IChwLiA3MCwgQktERyAjMjYwOTQsIEs4LCByZXZBLUUpCisJICogY29uY2VybmluZyB0cmFuc2xhdGluZyBhIERyYW1BZGRyIHRvIGFuIElucHV0QWRkci4KKwkgKi8KKwlpbnRsdl9zaGlmdCA9IG51bV9ub2RlX2ludGVybGVhdmVfYml0cyhwdnQtPmRyYW1fSW50bHZFblswXSk7CisJaW5wdXRfYWRkciA9ICgoZHJhbV9hZGRyID4+IGludGx2X3NoaWZ0KSAmIDB4ZmZmZmZmMDAwdWxsKSArCisJICAgIChkcmFtX2FkZHIgJiAweGZmZik7CisKKwlkZWJ1Z2YyKCIgIEludGx2IFNoaWZ0PSVkIERyYW1BZGRyPTB4JWx4IG1hcHMgdG8gSW5wdXRBZGRyPTB4JWx4XG4iLAorCQlpbnRsdl9zaGlmdCwgKHVuc2lnbmVkIGxvbmcpZHJhbV9hZGRyLAorCQkodW5zaWduZWQgbG9uZylpbnB1dF9hZGRyKTsKKworCXJldHVybiBpbnB1dF9hZGRyOworfQorCisvKgorICogVHJhbnNsYXRlIHRoZSBTeXNBZGRyIHJlcHJlc2VudGVkIGJ5IEBzeXNfYWRkciB0byBhbiBJbnB1dEFkZHIuICBJdCBpcworICogYXNzdW1lZCB0aGF0IEBzeXNfYWRkciBtYXBzIHRvIHRoZSBub2RlIGdpdmVuIGJ5IG1jaS4KKyAqLworc3RhdGljIHU2NCBzeXNfYWRkcl90b19pbnB1dF9hZGRyKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdTY0IHN5c19hZGRyKQoreworCXU2NCBpbnB1dF9hZGRyOworCisJaW5wdXRfYWRkciA9CisJICAgIGRyYW1fYWRkcl90b19pbnB1dF9hZGRyKG1jaSwgc3lzX2FkZHJfdG9fZHJhbV9hZGRyKG1jaSwgc3lzX2FkZHIpKTsKKworCWRlYnVnZjIoIlN5c0FkZGRyIDB4JWx4IHRyYW5zbGF0ZXMgdG8gSW5wdXRBZGRyIDB4JWx4XG4iLAorCQkodW5zaWduZWQgbG9uZylzeXNfYWRkciwgKHVuc2lnbmVkIGxvbmcpaW5wdXRfYWRkcik7CisKKwlyZXR1cm4gaW5wdXRfYWRkcjsKK30KKworCisvKgorICogQGlucHV0X2FkZHIgaXMgYW4gSW5wdXRBZGRyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZSByZXByZXNlbnRlZCBieSBtY2kuCisgKiBUcmFuc2xhdGUgQGlucHV0X2FkZHIgdG8gYSBEcmFtQWRkciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCisgKi8KK3N0YXRpYyB1NjQgaW5wdXRfYWRkcl90b19kcmFtX2FkZHIoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1NjQgaW5wdXRfYWRkcikKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQ7CisJaW50IG5vZGVfaWQsIGludGx2X3NoaWZ0OworCXU2NCBiaXRzLCBkcmFtX2FkZHI7CisJdTMyIGludGx2X3NlbDsKKworCS8qCisJICogTmVhciB0aGUgc3RhcnQgb2Ygc2VjdGlvbiAzLjQuNCAocC4gNzAsIEJLREcgIzI2MDk0LCBLOCwgcmV2QS1FKQorCSAqIHNob3dzIGhvdyB0byB0cmFuc2xhdGUgYSBEcmFtQWRkciB0byBhbiBJbnB1dEFkZHIuIEhlcmUgd2UgcmV2ZXJzZQorCSAqIHRoaXMgcHJvY2VkdXJlLiBXaGVuIHRyYW5zbGF0aW5nIGZyb20gYSBEcmFtQWRkciB0byBhbiBJbnB1dEFkZHIsIHRoZQorCSAqIGJpdHMgdXNlZCBmb3Igbm9kZSBpbnRlcmxlYXZpbmcgYXJlIGRpc2NhcmRlZC4gIEhlcmUgd2UgcmVjb3ZlciB0aGVzZQorCSAqIGJpdHMgZnJvbSB0aGUgSW50bHZTZWwgZmllbGQgb2YgdGhlIERSQU0gTGltaXQgcmVnaXN0ZXIgKHNlY3Rpb24KKwkgKiAzLjQuNC4yKSBmb3IgdGhlIG5vZGUgdGhhdCBpbnB1dF9hZGRyIGlzIGFzc29jaWF0ZWQgd2l0aC4KKwkgKi8KKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCW5vZGVfaWQgPSBwdnQtPm1jX25vZGVfaWQ7CisJQlVHX09OKChub2RlX2lkIDwgMCkgfHwgKG5vZGVfaWQgPiA3KSk7CisKKwlpbnRsdl9zaGlmdCA9IG51bV9ub2RlX2ludGVybGVhdmVfYml0cyhwdnQtPmRyYW1fSW50bHZFblswXSk7CisKKwlpZiAoaW50bHZfc2hpZnQgPT0gMCkgeworCQlkZWJ1Z2YxKCIgICAgSW5wdXRBZGRyIDB4JWx4IHRyYW5zbGF0ZXMgdG8gRHJhbUFkZHIgb2YgIgorCQkJInNhbWUgdmFsdWVcbiIsCSh1bnNpZ25lZCBsb25nKWlucHV0X2FkZHIpOworCisJCXJldHVybiBpbnB1dF9hZGRyOworCX0KKworCWJpdHMgPSAoKGlucHV0X2FkZHIgJiAweGZmZmZmZjAwMHVsbCkgPDwgaW50bHZfc2hpZnQpICsKKwkgICAgKGlucHV0X2FkZHIgJiAweGZmZik7CisKKwlpbnRsdl9zZWwgPSBwdnQtPmRyYW1fSW50bHZTZWxbbm9kZV9pZF0gJiAoKDEgPDwgaW50bHZfc2hpZnQpIC0gMSk7CisJZHJhbV9hZGRyID0gYml0cyArIChpbnRsdl9zZWwgPDwgMTIpOworCisJZGVidWdmMSgiSW5wdXRBZGRyIDB4JWx4IHRyYW5zbGF0ZXMgdG8gRHJhbUFkZHIgMHglbHggIgorCQkiKCVkIG5vZGUgaW50ZXJsZWF2ZSBiaXRzKVxuIiwgKHVuc2lnbmVkIGxvbmcpaW5wdXRfYWRkciwKKwkJKHVuc2lnbmVkIGxvbmcpZHJhbV9hZGRyLCBpbnRsdl9zaGlmdCk7CisKKwlyZXR1cm4gZHJhbV9hZGRyOworfQorCisvKgorICogQGRyYW1fYWRkciBpcyBhIERyYW1BZGRyIHRoYXQgbWFwcyB0byB0aGUgbm9kZSByZXByZXNlbnRlZCBieSBtY2kuIENvbnZlcnQKKyAqIEBkcmFtX2FkZHIgdG8gYSBTeXNBZGRyLgorICovCitzdGF0aWMgdTY0IGRyYW1fYWRkcl90b19zeXNfYWRkcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIHU2NCBkcmFtX2FkZHIpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1NjQgaG9sZV9iYXNlLCBob2xlX29mZnNldCwgaG9sZV9zaXplLCBiYXNlLCBsaW1pdCwgc3lzX2FkZHI7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBhbWQ2NF9nZXRfZHJhbV9ob2xlX2luZm8obWNpLCAmaG9sZV9iYXNlLCAmaG9sZV9vZmZzZXQsCisJCQkJICAgICAgJmhvbGVfc2l6ZSk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKChkcmFtX2FkZHIgPj0gaG9sZV9iYXNlKSAmJgorCQkgICAgKGRyYW1fYWRkciA8IChob2xlX2Jhc2UgKyBob2xlX3NpemUpKSkgeworCQkJc3lzX2FkZHIgPSBkcmFtX2FkZHIgKyBob2xlX29mZnNldDsKKworCQkJZGVidWdmMSgidXNpbmcgREhBUiB0byB0cmFuc2xhdGUgRHJhbUFkZHIgMHglbHggdG8gIgorCQkJCSJTeXNBZGRyIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylkcmFtX2FkZHIsCisJCQkJKHVuc2lnbmVkIGxvbmcpc3lzX2FkZHIpOworCisJCQlyZXR1cm4gc3lzX2FkZHI7CisJCX0KKwl9CisKKwlhbWQ2NF9nZXRfYmFzZV9hbmRfbGltaXQocHZ0LCBwdnQtPm1jX25vZGVfaWQsICZiYXNlLCAmbGltaXQpOworCXN5c19hZGRyID0gZHJhbV9hZGRyICsgYmFzZTsKKworCS8qCisJICogVGhlIHN5c19hZGRyIHdlIGhhdmUgY29tcHV0ZWQgdXAgdG8gdGhpcyBwb2ludCBpcyBhIDQwLWJpdCB2YWx1ZQorCSAqIGJlY2F1c2UgdGhlIGs4IGRlYWxzIHdpdGggNDAtYml0IHZhbHVlcy4gIEhvd2V2ZXIsIHRoZSB2YWx1ZSB3ZSBhcmUKKwkgKiBzdXBwb3NlZCB0byByZXR1cm4gaXMgYSBmdWxsIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzLiAgVGhlIEFNRAorCSAqIHg4Ni02NCBhcmNoaXRlY3R1cmUgc3BlY2lmaWVzIHRoYXQgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgaW1wbGVtZW50ZWQKKwkgKiBhZGRyZXNzIGJpdCB0aHJvdWdoIGJpdCA2MyBvZiBhIHBoeXNpY2FsIGFkZHJlc3MgbXVzdCBiZSBlaXRoZXIgYWxsCisJICogMHMgb3IgYWxsIDFzLiAgVGhlcmVmb3JlIHdlIHNpZ24tZXh0ZW5kIHRoZSA0MC1iaXQgc3lzX2FkZHIgdG8gYQorCSAqIDY0LWJpdCB2YWx1ZSBiZWxvdy4gIFNlZSBzZWN0aW9uIDMuNC4yIG9mIEFNRCBwdWJsaWNhdGlvbiAyNDU5MjoKKwkgKiBBTUQgeDg2LTY0IEFyY2hpdGVjdHVyZSBQcm9ncmFtbWVyJ3MgTWFudWFsIFZvbHVtZSAxIEFwcGxpY2F0aW9uCisJICogUHJvZ3JhbW1pbmcuCisJICovCisJc3lzX2FkZHIgfD0gfigoc3lzX2FkZHIgJiAoMXVsbCA8PCAzOSkpIC0gMSk7CisKKwlkZWJ1Z2YxKCIgICAgTm9kZSAlZCwgRHJhbUFkZHIgMHglbHggdG8gU3lzQWRkciAweCVseFxuIiwKKwkJcHZ0LT5tY19ub2RlX2lkLCAodW5zaWduZWQgbG9uZylkcmFtX2FkZHIsCisJCSh1bnNpZ25lZCBsb25nKXN5c19hZGRyKTsKKworCXJldHVybiBzeXNfYWRkcjsKK30KKworLyoKKyAqIEBpbnB1dF9hZGRyIGlzIGFuIElucHV0QWRkciBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUgZ2l2ZW4gYnkgbWNpLiBUcmFuc2xhdGUKKyAqIEBpbnB1dF9hZGRyIHRvIGEgU3lzQWRkci4KKyAqLworc3RhdGljIGlubGluZSB1NjQgaW5wdXRfYWRkcl90b19zeXNfYWRkcihzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCSB1NjQgaW5wdXRfYWRkcikKK3sKKwlyZXR1cm4gZHJhbV9hZGRyX3RvX3N5c19hZGRyKG1jaSwKKwkJCQkgICAgIGlucHV0X2FkZHJfdG9fZHJhbV9hZGRyKG1jaSwgaW5wdXRfYWRkcikpOworfQorCisvKgorICogRmluZCB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBJbnB1dEFkZHIgdmFsdWVzIHRoYXQgbWFwIHRvIHRoZSBnaXZlbiBAY3Nyb3cuCisgKiBQYXNzIGJhY2sgdGhlc2UgdmFsdWVzIGluICppbnB1dF9hZGRyX21pbiBhbmQgKmlucHV0X2FkZHJfbWF4LgorICovCitzdGF0aWMgdm9pZCBmaW5kX2Nzcm93X2xpbWl0cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGludCBjc3JvdywKKwkJCSAgICAgIHU2NCAqaW5wdXRfYWRkcl9taW4sIHU2NCAqaW5wdXRfYWRkcl9tYXgpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0OworCXU2NCBiYXNlLCBtYXNrOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwlCVUdfT04oKGNzcm93IDwgMCkgfHwgKGNzcm93ID49IENISVBTRUxFQ1RfQ09VTlQpKTsKKworCWJhc2UgPSBiYXNlX2Zyb21fZGN0X2Jhc2UocHZ0LCBjc3Jvdyk7CisJbWFzayA9IG1hc2tfZnJvbV9kY3RfbWFzayhwdnQsIGNzcm93KTsKKworCSppbnB1dF9hZGRyX21pbiA9IGJhc2UgJiB+bWFzazsKKwkqaW5wdXRfYWRkcl9tYXggPSBiYXNlIHwgbWFzayB8IHB2dC0+ZGNzX21hc2tfbm90dXNlZDsKK30KKworLyoKKyAqIEV4dHJhY3QgZXJyb3IgYWRkcmVzcyBmcm9tIE1DQSBOQiBBZGRyZXNzIExvdyAoc2VjdGlvbiAzLjYuNC41KSBhbmQgTUNBIE5CCisgKiBBZGRyZXNzIEhpZ2ggKHNlY3Rpb24gMy42LjQuNikgcmVnaXN0ZXIgdmFsdWVzIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gQWRkcmVzcworICogaXMgbG9jYXRlZCBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUgKG5iZWFoIGFuZCBuYmVhbCksIHRoZSBlbmNvZGluZyBpcyBkZXZpY2UKKyAqIHNwZWNpZmljLgorICovCitzdGF0aWMgdTY0IGV4dHJhY3RfZXJyb3JfYWRkcmVzcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJIHN0cnVjdCBhbWQ2NF9lcnJvcl9pbmZvX3JlZ3MgKmluZm8pCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCXJldHVybiBwdnQtPm9wcy0+Z2V0X2Vycm9yX2FkZHJlc3MobWNpLCBpbmZvKTsKK30KKworCisvKiBNYXAgdGhlIEVycm9yIGFkZHJlc3MgdG8gYSBQQUdFIGFuZCBQQUdFIE9GRlNFVC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBlcnJvcl9hZGRyZXNzX3RvX3BhZ2VfYW5kX29mZnNldCh1NjQgZXJyb3JfYWRkcmVzcywKKwkJCQkJCSAgICB1MzIgKnBhZ2UsIHUzMiAqb2Zmc2V0KQoreworCSpwYWdlID0gKHUzMikgKGVycm9yX2FkZHJlc3MgPj4gUEFHRV9TSElGVCk7CisJKm9mZnNldCA9ICgodTMyKSBlcnJvcl9hZGRyZXNzKSAmIH5QQUdFX01BU0s7Cit9CisKKy8qCisgKiBAc3lzX2FkZHIgaXMgYW4gZXJyb3IgYWRkcmVzcyAoYSBTeXNBZGRyKSBleHRyYWN0ZWQgZnJvbSB0aGUgTUNBIE5CIEFkZHJlc3MKKyAqIExvdyAoc2VjdGlvbiAzLjYuNC41KSBhbmQgTUNBIE5CIEFkZHJlc3MgSGlnaCAoc2VjdGlvbiAzLjYuNC42KSByZWdpc3RlcnMKKyAqIG9mIGEgbm9kZSB0aGF0IGRldGVjdGVkIGFuIEVDQyBtZW1vcnkgZXJyb3IuICBtY2kgcmVwcmVzZW50cyB0aGUgbm9kZSB0aGF0CisgKiB0aGUgZXJyb3IgYWRkcmVzcyBtYXBzIHRvIChwb3NzaWJseSBkaWZmZXJlbnQgZnJvbSB0aGUgbm9kZSB0aGF0IGRldGVjdGVkCisgKiB0aGUgZXJyb3IpLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGNzcm93IHRoYXQgc3lzX2FkZHIgbWFwcyB0bywgb3IgLTEgb24KKyAqIGVycm9yLgorICovCitzdGF0aWMgaW50IHN5c19hZGRyX3RvX2Nzcm93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgdTY0IHN5c19hZGRyKQoreworCWludCBjc3JvdzsKKworCWNzcm93ID0gaW5wdXRfYWRkcl90b19jc3JvdyhtY2ksIHN5c19hZGRyX3RvX2lucHV0X2FkZHIobWNpLCBzeXNfYWRkcikpOworCisJaWYgKGNzcm93ID09IC0xKQorCQlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJCSAgICAgIkZhaWxlZCB0byB0cmFuc2xhdGUgSW5wdXRBZGRyIHRvIGNzcm93IGZvciAiCisJCQkgICAgICJhZGRyZXNzIDB4JWx4XG4iLCAodW5zaWduZWQgbG9uZylzeXNfYWRkcik7CisJcmV0dXJuIGNzcm93OworfQorCitzdGF0aWMgaW50IGdldF9jaGFubmVsX2Zyb21fZWNjX3N5bmRyb21lKHVuc2lnbmVkIHNob3J0IHN5bmRyb21lKTsKKworc3RhdGljIHZvaWQgYW1kNjRfY3B1X2Rpc3BsYXlfaW5mbyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCit7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDB4MTEpCisJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfTUMsICJGMTFoIENQVSBkZXRlY3RlZFxuIik7CisJZWxzZSBpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxMCkKKwkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19NQywgIkYxMGggQ1BVIGRldGVjdGVkXG4iKTsKKwllbHNlIGlmIChib290X2NwdV9kYXRhLng4NiA9PSAweGYpCisJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfTUMsICIlcyBkZXRlY3RlZFxuIiwKKwkJCShwdnQtPmV4dF9tb2RlbCA+PSBPUFRFUk9OX0NQVV9SRVZfRikgPworCQkJIlJldiBGIG9yIGxhdGVyIiA6ICJSZXYgRSBvciBlYXJsaWVyIik7CisJZWxzZQorCQkvKiB3ZSdsbCBoYXJkbHkgZXZlciBldmVyIGdldCBoZXJlICovCisJCWVkYWNfcHJpbnRrKEtFUk5fRVJSLCBFREFDX01DLCAiVW5rbm93biBjcHUhXG4iKTsKK30KKworLyoKKyAqIERldGVybWluZSBpZiB0aGUgRElNTXMgaGF2ZSBFQ0MgZW5hYmxlZC4gRUNDIGlzIGVuYWJsZWQgT05MWSBpZiBhbGwgdGhlIERJTU1zCisgKiBhcmUgRUNDIGNhcGFibGUuCisgKi8KK3N0YXRpYyBlbnVtIGVkYWNfdHlwZSBhbWQ2NF9kZXRlcm1pbmVfZWRhY19jYXAoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQoreworCWludCBiaXQ7CisJZW51bSBkZXZfdHlwZSBlZGFjX2NhcCA9IEVEQUNfTk9ORTsKKworCWJpdCA9IChib290X2NwdV9kYXRhLng4NiA+IDB4ZiB8fCBwdnQtPmV4dF9tb2RlbCA+PSBPUFRFUk9OX0NQVV9SRVZfRikKKwkJPyAxOQorCQk6IDE3OworCisJaWYgKHB2dC0+ZGNscjAgPj4gQklUKGJpdCkpCisJCWVkYWNfY2FwID0gRURBQ19GTEFHX1NFQ0RFRDsKKworCXJldHVybiBlZGFjX2NhcDsKK30KKworCitzdGF0aWMgdm9pZCBmMTBfZGVidWdfZGlzcGxheV9kaW1tX3NpemVzKGludCBjdHJsLCBzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsCisJCQkJCSBpbnQgZ2FuZ2VkKTsKKworLyogRGlzcGxheSBhbmQgZGVjb2RlIHZhcmlvdXMgTkIgcmVnaXN0ZXJzIGZvciBkZWJ1ZyBwdXJwb3Nlcy4gKi8KK3N0YXRpYyB2b2lkIGFtZDY0X2R1bXBfbWlzY19yZWdzKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKK3sKKwlpbnQgZ2FuZ2VkOworCisJZGVidWdmMSgiICBuYmNhcDoweCU4LjA4eCBEY3REdWFsQ2FwPSVzIER1YWxOb2RlPSVzIDgtTm9kZT0lc1xuIiwKKwkJcHZ0LT5uYmNhcCwKKwkJKHB2dC0+bmJjYXAgJiBLOF9OQkNBUF9EQ1RfRFVBTCkgPyAiVHJ1ZSIgOiAiRmFsc2UiLAorCQkocHZ0LT5uYmNhcCAmIEs4X05CQ0FQX0RVQUxfTk9ERSkgPyAiVHJ1ZSIgOiAiRmFsc2UiLAorCQkocHZ0LT5uYmNhcCAmIEs4X05CQ0FQXzhfTk9ERSkgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKKwlkZWJ1Z2YxKCIgICAgRUNDIENhcGFibGU9JXMgICBDaGlwS2lsbCBDYXBhYmxlPSVzXG4iLAorCQkocHZ0LT5uYmNhcCAmIEs4X05CQ0FQX1NFQ0RFRCkgPyAiVHJ1ZSIgOiAiRmFsc2UiLAorCQkocHZ0LT5uYmNhcCAmIEs4X05CQ0FQX0NISVBLSUxMKSA/ICJUcnVlIiA6ICJGYWxzZSIpOworCWRlYnVnZjEoIiAgRHJhbUNmZzAtbG93PTB4JTA4eCBESU1NLUVDQz0lcyBQYXJpdHk9JXMgV2lkdGg9JXNcbiIsCisJCXB2dC0+ZGNscjAsCisJCShwdnQtPmRjbHIwICYgQklUKDE5KSkgPyAgIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKKwkJKHB2dC0+ZGNscjAgJiBCSVQoOCkpID8gICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsCisJCShwdnQtPmRjbHIwICYgQklUKDExKSkgPyAgIjEyOGIiIDogIjY0YiIpOworCWRlYnVnZjEoIiAgICBESU1NIHg0IFByZXNlbnQ6IEwwPSVzIEwxPSVzIEwyPSVzIEwzPSVzICBESU1NIFR5cGU9JXNcbiIsCisJCShwdnQtPmRjbHIwICYgQklUKDEyKSkgPyAgIlkiIDogIk4iLAorCQkocHZ0LT5kY2xyMCAmIEJJVCgxMykpID8gICJZIiA6ICJOIiwKKwkJKHB2dC0+ZGNscjAgJiBCSVQoMTQpKSA/ICAiWSIgOiAiTiIsCisJCShwdnQtPmRjbHIwICYgQklUKDE1KSkgPyAgIlkiIDogIk4iLAorCQkocHZ0LT5kY2xyMCAmIEJJVCgxNikpID8gICJVTi1CdWZmZXJlZCIgOiAiQnVmZmVyZWQiKTsKKworCisJZGVidWdmMSgiICBvbmxpbmUtc3BhcmU6IDB4JTguMDh4XG4iLCBwdnQtPm9ubGluZV9zcGFyZSk7CisKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHhmKSB7CisJCWRlYnVnZjEoIiAgZGhhcjogMHglOC4wOHggQmFzZT0weCUwOHggT2Zmc2V0PTB4JTA4eFxuIiwKKwkJCXB2dC0+ZGhhciwgZGhhcl9iYXNlKHB2dC0+ZGhhciksCisJCQlrOF9kaGFyX29mZnNldChwdnQtPmRoYXIpKTsKKwkJZGVidWdmMSgiICAgICAgRHJhbUhvbGVWYWxpZD0lc1xuIiwKKwkJCShwdnQtPmRoYXIgJiBESEFSX1ZBTElEKSA/ICAiVHJ1ZSIgOiAiRmFsc2UiKTsKKworCQlkZWJ1Z2YxKCIgIGRiYW0tZGt0OiAweCU4LjA4eFxuIiwgcHZ0LT5kYmFtMCk7CisKKwkJLyogZXZlcnl0aGluZyBiZWxvdyB0aGlzIHBvaW50IGlzIEZhbTEwaCBhbmQgYWJvdmUgKi8KKwkJcmV0dXJuOworCisJfSBlbHNlIHsKKwkJZGVidWdmMSgiICBkaGFyOiAweCU4LjA4eCBCYXNlPTB4JTA4eCBPZmZzZXQ9MHglMDh4XG4iLAorCQkJcHZ0LT5kaGFyLCBkaGFyX2Jhc2UocHZ0LT5kaGFyKSwKKwkJCWYxMF9kaGFyX29mZnNldChwdnQtPmRoYXIpKTsKKwkJZGVidWdmMSgiICAgIERyYW1NZW1Ib2lzdFZhbGlkPSVzIERyYW1Ib2xlVmFsaWQ9JXNcbiIsCisJCQkocHZ0LT5kaGFyICYgRjEwX0RSQU1fTUVNX0hPSVNUX1ZBTElEKSA/CisJCQkiVHJ1ZSIgOiAiRmFsc2UiLAorCQkJKHB2dC0+ZGhhciAmIERIQVJfVkFMSUQpID8KKwkJCSJUcnVlIiA6ICJGYWxzZSIpOworCX0KKworCS8qIE9ubHkgaWYgTk9UIGdhbmdlZCBkb2VzIGRjbDEgaGF2ZSB2YWxpZCBpbmZvICovCisJaWYgKCFkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkpIHsKKwkJZGVidWdmMSgiICBEcmFtQ2ZnMS1sb3c9MHglMDh4IERJTU0tRUNDPSVzIFBhcml0eT0lcyAiCisJCQkiV2lkdGg9JXNcbiIsIHB2dC0+ZGNscjEsCisJCQkocHZ0LT5kY2xyMSAmIEJJVCgxOSkpID8gICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsCisJCQkocHZ0LT5kY2xyMSAmIEJJVCg4KSkgPyAgIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKKwkJCShwdnQtPmRjbHIxICYgQklUKDExKSkgPyAgIjEyOGIiIDogIjY0YiIpOworCQlkZWJ1Z2YxKCIgICAgRElNTSB4NCBQcmVzZW50OiBMMD0lcyBMMT0lcyBMMj0lcyBMMz0lcyAgIgorCQkJIkRJTU0gVHlwZT0lc1xuIiwKKwkJCShwdnQtPmRjbHIxICYgQklUKDEyKSkgPyAgIlkiIDogIk4iLAorCQkJKHB2dC0+ZGNscjEgJiBCSVQoMTMpKSA/ICAiWSIgOiAiTiIsCisJCQkocHZ0LT5kY2xyMSAmIEJJVCgxNCkpID8gICJZIiA6ICJOIiwKKwkJCShwdnQtPmRjbHIxICYgQklUKDE1KSkgPyAgIlkiIDogIk4iLAorCQkJKHB2dC0+ZGNscjEgJiBCSVQoMTYpKSA/ICAiVU4tQnVmZmVyZWQiIDogIkJ1ZmZlcmVkIik7CisJfQorCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgZ2FuZ2VkIGFuZCB0aGVuIGR1bXAgbWVtb3J5IHNpemVzIGZvciBmaXJzdCBjb250cm9sbGVyLAorCSAqIGFuZCBpZiBOT1QgZ2FuZ2VkIGR1bXAgaW5mbyBmb3IgMm5kIGNvbnRyb2xsZXIuCisJICovCisJZ2FuZ2VkID0gZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpOworCisJZjEwX2RlYnVnX2Rpc3BsYXlfZGltbV9zaXplcygwLCBwdnQsIGdhbmdlZCk7CisKKwlpZiAoIWdhbmdlZCkKKwkJZjEwX2RlYnVnX2Rpc3BsYXlfZGltbV9zaXplcygxLCBwdnQsIGdhbmdlZCk7Cit9CisKKy8qIFJlYWQgaW4gYm90aCBvZiBEQkFNIHJlZ2lzdGVycyAqLworc3RhdGljIHZvaWQgYW1kNjRfcmVhZF9kYmFtX3JlZyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCit7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgaW50IHJlZzsKKworCXJlZyA9IERCQU0wOworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmRyYW1fZjJfY3RsLCByZWcsICZwdnQtPmRiYW0wKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWc7CisKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPj0gMHgxMCkgeworCQlyZWcgPSBEQkFNMTsKKwkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIHJlZywgJnB2dC0+ZGJhbTEpOworCisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9yZWc7CisJfQorCitlcnJfcmVnOgorCWRlYnVnZjAoIkVycm9yIHJlYWRpbmcgRjJ4JTAzeC5cbiIsIHJlZyk7Cit9CisKKy8qCisgKiBOT1RFOiBDUFUgUmV2aXNpb24gRGVwZW5kZW50IGNvZGU6IFJldiBFIGFuZCBSZXYgRgorICoKKyAqIFNldCB0aGUgRENTQiBhbmQgRENTTSBtYXNrIHZhbHVlcyBkZXBlbmRpbmcgb24gdGhlIENQVSByZXZpc2lvbiB2YWx1ZS4gQWxzbworICogc2V0IHRoZSBzaGlmdCBmYWN0b3IgZm9yIHRoZSBEQ1NCIGFuZCBEQ1NNIHZhbHVlcy4KKyAqCisgKiAtPmRjc19tYXNrX25vdHVzZWQsIFJldkU6CisgKgorICogVG8gZmluZCB0aGUgbWF4IElucHV0QWRkciBmb3IgdGhlIGNzcm93LCBzdGFydCB3aXRoIHRoZSBiYXNlIGFkZHJlc3MgYW5kIHNldAorICogYWxsIGJpdHMgdGhhdCBhcmUgImRvbid0IGNhcmUiIGJpdHMgaW4gdGhlIHRlc3QgYXQgdGhlIHN0YXJ0IG9mIHNlY3Rpb24KKyAqIDMuNS40IChwLiA4NCkuCisgKgorICogVGhlICJkb24ndCBjYXJlIiBiaXRzIGFyZSBhbGwgc2V0IGJpdHMgaW4gdGhlIG1hc2sgYW5kIGFsbCBiaXRzIGluIHRoZSBnYXBzCisgKiBiZXR3ZWVuIGJpdCByYW5nZXMgWzM1OjI1XSBhbmQgWzE5OjEzXS4gVGhlIHZhbHVlIFJFVl9FX0RDU19OT1RVU0VEX0JJVFMKKyAqIHJlcHJlc2VudHMgYml0cyBbMjQ6MjBdIGFuZCBbMTI6MF0sIHdoaWNoIGFyZSBhbGwgYml0cyBpbiB0aGUgYWJvdmUtbWVudGlvbmVkCisgKiBnYXBzLgorICoKKyAqIC0+ZGNzX21hc2tfbm90dXNlZCwgUmV2RiBhbmQgbGF0ZXI6CisgKgorICogVG8gZmluZCB0aGUgbWF4IElucHV0QWRkciBmb3IgdGhlIGNzcm93LCBzdGFydCB3aXRoIHRoZSBiYXNlIGFkZHJlc3MgYW5kIHNldAorICogYWxsIGJpdHMgdGhhdCBhcmUgImRvbid0IGNhcmUiIGJpdHMgaW4gdGhlIHRlc3QgYXQgdGhlIHN0YXJ0IG9mIE5QVCBzZWN0aW9uCisgKiA0LjUuNCAocC4gODcpLgorICoKKyAqIFRoZSAiZG9uJ3QgY2FyZSIgYml0cyBhcmUgYWxsIHNldCBiaXRzIGluIHRoZSBtYXNrIGFuZCBhbGwgYml0cyBpbiB0aGUgZ2FwcworICogYmV0d2VlbiBiaXQgcmFuZ2VzIFszNjoyN10gYW5kIFsyMToxM10uCisgKgorICogVGhlIHZhbHVlIFJFVl9GX0YxWGhfRENTX05PVFVTRURfQklUUyByZXByZXNlbnRzIGJpdHMgWzI2OjIyXSBhbmQgWzEyOjBdLAorICogd2hpY2ggYXJlIGFsbCBiaXRzIGluIHRoZSBhYm92ZS1tZW50aW9uZWQgZ2Fwcy4KKyAqLworc3RhdGljIHZvaWQgYW1kNjRfc2V0X2RjdF9iYXNlX2FuZF9tYXNrKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKK3sKKwlpZiAocHZ0LT5leHRfbW9kZWwgPj0gT1BURVJPTl9DUFVfUkVWX0YpIHsKKwkJcHZ0LT5kY3NiX2Jhc2UJCT0gUkVWX0ZfRjFYaF9EQ1NCX0JBU0VfQklUUzsKKwkJcHZ0LT5kY3NtX21hc2sJCT0gUkVWX0ZfRjFYaF9EQ1NNX01BU0tfQklUUzsKKwkJcHZ0LT5kY3NfbWFza19ub3R1c2VkCT0gUkVWX0ZfRjFYaF9EQ1NfTk9UVVNFRF9CSVRTOworCQlwdnQtPmRjc19zaGlmdAkJPSBSRVZfRl9GMVhoX0RDU19TSElGVDsKKworCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2KSB7CisJCWNhc2UgMHhmOgorCQkJcHZ0LT5udW1fZGNzbSA9IFJFVl9GX0RDU01fQ09VTlQ7CisJCQlicmVhazsKKworCQljYXNlIDB4MTA6CisJCQlwdnQtPm51bV9kY3NtID0gRjEwX0RDU01fQ09VTlQ7CisJCQlicmVhazsKKworCQljYXNlIDB4MTE6CisJCQlwdnQtPm51bV9kY3NtID0gRjExX0RDU01fQ09VTlQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYW1kNjRfcHJpbnRrKEtFUk5fRVJSLCAiVW5zdXBwb3J0ZWQgZmFtaWx5IVxuIik7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXB2dC0+ZGNzYl9iYXNlCQk9IFJFVl9FX0RDU0JfQkFTRV9CSVRTOworCQlwdnQtPmRjc21fbWFzawkJPSBSRVZfRV9EQ1NNX01BU0tfQklUUzsKKwkJcHZ0LT5kY3NfbWFza19ub3R1c2VkCT0gUkVWX0VfRENTX05PVFVTRURfQklUUzsKKwkJcHZ0LT5kY3Nfc2hpZnQJCT0gUkVWX0VfRENTX1NISUZUOworCQlwdnQtPm51bV9kY3NtCQk9IFJFVl9FX0RDU01fQ09VTlQ7CisJfQorfQorCisvKgorICogRnVuY3Rpb24gMiBPZmZzZXQgRjEwX0RDU0IwOyByZWFkIGluIHRoZSBEQ1MgQmFzZSBhbmQgRENTIE1hc2sgaHcgcmVnaXN0ZXJzCisgKi8KK3N0YXRpYyB2b2lkIGFtZDY0X3JlYWRfZGN0X2Jhc2VfbWFzayhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCit7CisJaW50IGNzLCByZWcsIGVyciA9IDA7CisKKwlhbWQ2NF9zZXRfZGN0X2Jhc2VfYW5kX21hc2socHZ0KTsKKworCWZvciAoY3MgPSAwOyBjcyA8IENISVBTRUxFQ1RfQ09VTlQ7IGNzKyspIHsKKwkJcmVnID0gSzhfRENTQjAgKyAoY3MgKiA0KTsKKwkJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIHJlZywKKwkJCQkJCSZwdnQtPmRjc2IwW2NzXSk7CisJCWlmICh1bmxpa2VseShlcnIpKQorCQkJZGVidWdmMCgiUmVhZGluZyBLOF9EQ1NCMFslZF0gZmFpbGVkXG4iLCBjcyk7CisJCWVsc2UKKwkJCWRlYnVnZjAoIiAgRENTQjBbJWRdPTB4JTA4eCByZWc6IEYyeCV4XG4iLAorCQkJCWNzLCBwdnQtPmRjc2IwW2NzXSwgcmVnKTsKKworCQkvKiBJZiBEQ1QgYXJlIE5PVCBnYW5nZWQsIHRoZW4gcmVhZCBpbiBEQ1QxJ3MgYmFzZSAqLworCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPj0gMHgxMCAmJiAhZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpKSB7CisJCQlyZWcgPSBGMTBfRENTQjEgKyAoY3MgKiA0KTsKKwkJCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmRyYW1fZjJfY3RsLCByZWcsCisJCQkJCQkJJnB2dC0+ZGNzYjFbY3NdKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCWRlYnVnZjAoIlJlYWRpbmcgRjEwX0RDU0IxWyVkXSBmYWlsZWRcbiIsIGNzKTsKKwkJCWVsc2UKKwkJCQlkZWJ1Z2YwKCIgIERDU0IxWyVkXT0weCUwOHggcmVnOiBGMngleFxuIiwKKwkJCQkJY3MsIHB2dC0+ZGNzYjFbY3NdLCByZWcpOworCQl9IGVsc2UgeworCQkJcHZ0LT5kY3NiMVtjc10gPSAwOworCQl9CisJfQorCisJZm9yIChjcyA9IDA7IGNzIDwgcHZ0LT5udW1fZGNzbTsgY3MrKykgeworCQlyZWcgPSBLOF9EQ1NCMCArIChjcyAqIDQpOworCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgcmVnLAorCQkJCQkmcHZ0LT5kY3NtMFtjc10pOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWRlYnVnZjAoIlJlYWRpbmcgSzhfRENTTTAgZmFpbGVkXG4iKTsKKwkJZWxzZQorCQkJZGVidWdmMCgiICAgIERDU00wWyVkXT0weCUwOHggcmVnOiBGMngleFxuIiwKKwkJCQljcywgcHZ0LT5kY3NtMFtjc10sIHJlZyk7CisKKwkJLyogSWYgRENUIGFyZSBOT1QgZ2FuZ2VkLCB0aGVuIHJlYWQgaW4gRENUMSdzIG1hc2sgKi8KKwkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID49IDB4MTAgJiYgIWRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KSkgeworCQkJcmVnID0gRjEwX0RDU00xICsgKGNzICogNCk7CisJCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgcmVnLAorCQkJCQkmcHZ0LT5kY3NtMVtjc10pOworCQkJaWYgKHVubGlrZWx5KGVycikpCisJCQkJZGVidWdmMCgiUmVhZGluZyBGMTBfRENTTTFbJWRdIGZhaWxlZFxuIiwgY3MpOworCQkJZWxzZQorCQkJCWRlYnVnZjAoIiAgICBEQ1NNMVslZF09MHglMDh4IHJlZzogRjJ4JXhcbiIsCisJCQkJCWNzLCBwdnQtPmRjc20xW2NzXSwgcmVnKTsKKwkJfSBlbHNlCisJCQlwdnQtPmRjc20xW2NzXSA9IDA7CisJfQorfQorCitzdGF0aWMgZW51bSBtZW1fdHlwZSBhbWQ2NF9kZXRlcm1pbmVfbWVtb3J5X3R5cGUoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQoreworCWVudW0gbWVtX3R5cGUgdHlwZTsKKworCWlmIChib290X2NwdV9kYXRhLng4NiA+PSAweDEwIHx8IHB2dC0+ZXh0X21vZGVsID49IE9QVEVST05fQ1BVX1JFVl9GKSB7CisJCS8qIFJldiBGIGFuZCBsYXRlciAqLworCQl0eXBlID0gKHB2dC0+ZGNscjAgJiBCSVQoMTYpKSA/IE1FTV9ERFIyIDogTUVNX1JERFIyOworCX0gZWxzZSB7CisJCS8qIFJldiBFIGFuZCBlYXJsaWVyICovCisJCXR5cGUgPSAocHZ0LT5kY2xyMCAmIEJJVCgxOCkpID8gTUVNX0REUiA6IE1FTV9SRERSOworCX0KKworCWRlYnVnZjEoIiAgTWVtb3J5IHR5cGUgaXM6ICVzXG4iLAorCQkodHlwZSA9PSBNRU1fRERSMikgPyAiTUVNX0REUjIiIDoKKwkJKHR5cGUgPT0gTUVNX1JERFIyKSA/ICJNRU1fUkREUjIiIDoKKwkJKHR5cGUgPT0gTUVNX0REUikgPyAiTUVNX0REUiIgOiAiTUVNX1JERFIiKTsKKworCXJldHVybiB0eXBlOworfQorCisvKgorICogUmVhZCB0aGUgRFJBTSBDb25maWd1cmF0aW9uIExvdyByZWdpc3Rlci4gSXQgZGlmZmVycyBiZXR3ZWVuIENHLCBEICYgRSByZXZzCisgKiBhbmQgdGhlIGxhdGVyIFJldkYgbWVtb3J5IGNvbnRyb2xsZXJzIChERFIgdnMgRERSMikKKyAqCisgKiBSZXR1cm46CisgKiAgICAgIG51bWJlciBvZiBtZW1vcnkgY2hhbm5lbHMgaW4gb3BlcmF0aW9uCisgKiBQYXNzIGJhY2s6CisgKiAgICAgIGNvbnRlbnRzIG9mIHRoZSBEQ0wwX0xPVyByZWdpc3RlcgorICovCitzdGF0aWMgaW50IGs4X2Vhcmx5X2NoYW5uZWxfY291bnQoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQoreworCWludCBmbGFnLCBlcnIgPSAwOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0xSXzAsICZwdnQtPmRjbHIwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+PiA0KSA+PSBPUFRFUk9OX0NQVV9SRVZfRikgeworCQkvKiBSZXZGIChOUFQpIGFuZCBsYXRlciAqLworCQlmbGFnID0gcHZ0LT5kY2xyMCAmIEYxMF9XSURUSF8xMjg7CisJfSBlbHNlIHsKKwkJLyogUmV2RSBhbmQgZWFybGllciAqLworCQlmbGFnID0gcHZ0LT5kY2xyMCAmIFJFVkVfV0lEVEhfMTI4OworCX0KKworCS8qIG5vdCB1c2VkICovCisJcHZ0LT5kY2xyMSA9IDA7CisKKwlyZXR1cm4gKGZsYWcpID8gMiA6IDE7Cit9CisKKy8qIGV4dHJhY3QgdGhlIEVSUk9SIEFERFJFU1MgZm9yIHRoZSBLOCBDUFVzICovCitzdGF0aWMgdTY0IGs4X2dldF9lcnJvcl9hZGRyZXNzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQlzdHJ1Y3QgYW1kNjRfZXJyb3JfaW5mb19yZWdzICppbmZvKQoreworCXJldHVybiAoKCh1NjQpIChpbmZvLT5uYmVhaCAmIDB4ZmYpKSA8PCAzMikgKworCQkJKGluZm8tPm5iZWFsICYgfjB4MDMpOworfQorCisvKgorICogUmVhZCB0aGUgQmFzZSBhbmQgTGltaXQgcmVnaXN0ZXJzIGZvciBLOCBiYXNlZCBNZW1vcnkgY29udHJvbGxlcnM7IGV4dHJhY3QKKyAqIGZpZWxkcyBmcm9tIHRoZSAncmF3JyByZWcgaW50byBzZXBhcmF0ZSBkYXRhIGZpZWxkcworICoKKyAqIElzb2xhdGVzOiBCQVNFLCBMSU1JVCwgSW50bHZFbiwgSW50bHZTZWwsIFJXX0VOCisgKi8KK3N0YXRpYyB2b2lkIGs4X3JlYWRfZHJhbV9iYXNlX2xpbWl0KHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGRyYW0pCit7CisJdTMyIGxvdzsKKwl1MzIgb2ZmID0gZHJhbSA8PCAzOwkvKiA4IGJ5dGVzIGJldHdlZW4gRFJBTSBlbnRyaWVzICovCisJaW50IGVycjsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmFkZHJfZjFfY3RsLAorCQkJCSAgICBLOF9EUkFNX0JBU0VfTE9XICsgb2ZmLCAmbG93KTsKKwlpZiAoZXJyKQorCQlkZWJ1Z2YwKCJSZWFkaW5nIEs4X0RSQU1fQkFTRV9MT1cgZmFpbGVkXG4iKTsKKworCS8qIEV4dHJhY3QgcGFydHMgaW50byBzZXBhcmF0ZSBkYXRhIGVudHJpZXMgKi8KKwlwdnQtPmRyYW1fYmFzZVtkcmFtXSA9ICgodTY0KSBsb3cgJiAweEZGRkYwMDAwKSA8PCA4OworCXB2dC0+ZHJhbV9JbnRsdkVuW2RyYW1dID0gKGxvdyA+PiA4KSAmIDB4NzsKKwlwdnQtPmRyYW1fcndfZW5bZHJhbV0gPSAobG93ICYgMHgzKTsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmFkZHJfZjFfY3RsLAorCQkJCSAgICBLOF9EUkFNX0xJTUlUX0xPVyArIG9mZiwgJmxvdyk7CisJaWYgKGVycikKKwkJZGVidWdmMCgiUmVhZGluZyBLOF9EUkFNX0xJTUlUX0xPVyBmYWlsZWRcbiIpOworCisJLyoKKwkgKiBFeHRyYWN0IHBhcnRzIGludG8gc2VwYXJhdGUgZGF0YSBlbnRyaWVzLiBMaW1pdCBpcyB0aGUgSElHSEVTVCBtZW1vcnkKKwkgKiBsb2NhdGlvbiBvZiB0aGUgcmVnaW9uLCBzbyBsb3dlciAyNCBiaXRzIG5lZWQgdG8gYmUgYWxsIG9uZXMKKwkgKi8KKwlwdnQtPmRyYW1fbGltaXRbZHJhbV0gPSAoKCh1NjQpIGxvdyAmIDB4RkZGRjAwMDApIDw8IDgpIHwgMHgwMEZGRkZGRjsKKwlwdnQtPmRyYW1fSW50bHZTZWxbZHJhbV0gPSAobG93ID4+IDgpICYgMHg3OworCXB2dC0+ZHJhbV9Ec3ROb2RlW2RyYW1dID0gKGxvdyAmIDB4Nyk7Cit9CisKK3N0YXRpYyB2b2lkIGs4X21hcF9zeXNhZGRyX3RvX2Nzcm93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJc3RydWN0IGFtZDY0X2Vycm9yX2luZm9fcmVncyAqaW5mbywKKwkJCQkJdTY0IFN5c3RlbUFkZHJlc3MpCit7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqc3JjX21jaTsKKwl1bnNpZ25lZCBzaG9ydCBzeW5kcm9tZTsKKwlpbnQgY2hhbm5lbCwgY3Nyb3c7CisJdTMyIHBhZ2UsIG9mZnNldDsKKworCS8qIEV4dHJhY3QgdGhlIHN5bmRyb21lIHBhcnRzIGFuZCBmb3JtIGEgMTYtYml0IHN5bmRyb21lICovCisJc3luZHJvbWUgPSBFWFRSQUNUX0hJR0hfU1lORFJPTUUoaW5mby0+bmJzbCkgPDwgODsKKwlzeW5kcm9tZSB8PSBFWFRSQUNUX0xPV19TWU5EUk9NRShpbmZvLT5uYnNoKTsKKworCS8qIENISVBLSUxMIGVuYWJsZWQgKi8KKwlpZiAoaW5mby0+bmJjZmcgJiBLOF9OQkNGR19DSElQS0lMTCkgeworCQljaGFubmVsID0gZ2V0X2NoYW5uZWxfZnJvbV9lY2Nfc3luZHJvbWUoc3luZHJvbWUpOworCQlpZiAoY2hhbm5lbCA8IDApIHsKKwkJCS8qCisJCQkgKiBTeW5kcm9tZSBkaWRuJ3QgbWFwLCBzbyB3ZSBkb24ndCBrbm93IHdoaWNoIG9mIHRoZQorCQkJICogMiBESU1NcyBpcyBpbiBlcnJvci4gU28gd2UgbmVlZCB0byBJRCAnYm90aCcgb2YgdGhlbQorCQkJICogYXMgc3VzcGVjdC4KKwkJCSAqLworCQkJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9XQVJOSU5HLAorCQkJCSAgICAgICAidW5rbm93biBzeW5kcm9tZSAweCV4IC0gcG9zc2libGUgZXJyb3IgIgorCQkJCSAgICAgICAicmVwb3J0aW5nIHJhY2VcbiIsIHN5bmRyb21lKTsKKwkJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBFREFDX01PRF9TVFIpOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogbm9uLWNoaXBraWxsIGVjYyBtb2RlCisJCSAqCisJCSAqIFRoZSBrOCBkb2N1bWVudGF0aW9uIGlzIHVuY2xlYXIgYWJvdXQgaG93IHRvIGRldGVybWluZSB0aGUKKwkJICogY2hhbm5lbCBudW1iZXIgd2hlbiB1c2luZyBub24tY2hpcGtpbGwgbWVtb3J5LiAgVGhpcyBtZXRob2QKKwkJICogd2FzIG9idGFpbmVkIGZyb20gZW1haWwgY29tbXVuaWNhdGlvbiB3aXRoIHNvbWVvbmUgYXQgQU1ELgorCQkgKiAoV2lzaCB0aGUgZW1haWwgd2FzIHBsYWNlZCBpbiB0aGlzIGNvbW1lbnQgLSBub3JzaykKKwkJICovCisJCWNoYW5uZWwgPSAoKFN5c3RlbUFkZHJlc3MgJiBCSVQoMykpICE9IDApOworCX0KKworCS8qCisJICogRmluZCBvdXQgd2hpY2ggbm9kZSB0aGUgZXJyb3IgYWRkcmVzcyBiZWxvbmdzIHRvLiBUaGlzIG1heSBiZQorCSAqIGRpZmZlcmVudCBmcm9tIHRoZSBub2RlIHRoYXQgZGV0ZWN0ZWQgdGhlIGVycm9yLgorCSAqLworCXNyY19tY2kgPSBmaW5kX21jX2J5X3N5c19hZGRyKG1jaSwgU3lzdGVtQWRkcmVzcyk7CisJaWYgKHNyY19tY2kpIHsKKwkJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCisJCQkgICAgICJmYWlsZWQgdG8gbWFwIGVycm9yIGFkZHJlc3MgMHglbHggdG8gYSBub2RlXG4iLAorCQkJICAgICAodW5zaWduZWQgbG9uZylTeXN0ZW1BZGRyZXNzKTsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIEVEQUNfTU9EX1NUUik7CisJCXJldHVybjsKKwl9CisKKwkvKiBOb3cgbWFwIHRoZSBTeXN0ZW1BZGRyZXNzIHRvIGEgQ1NST1cgKi8KKwljc3JvdyA9IHN5c19hZGRyX3RvX2Nzcm93KHNyY19tY2ksIFN5c3RlbUFkZHJlc3MpOworCWlmIChjc3JvdyA8IDApIHsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhzcmNfbWNpLCBFREFDX01PRF9TVFIpOworCX0gZWxzZSB7CisJCWVycm9yX2FkZHJlc3NfdG9fcGFnZV9hbmRfb2Zmc2V0KFN5c3RlbUFkZHJlc3MsICZwYWdlLCAmb2Zmc2V0KTsKKworCQllZGFjX21jX2hhbmRsZV9jZShzcmNfbWNpLCBwYWdlLCBvZmZzZXQsIHN5bmRyb21lLCBjc3JvdywKKwkJCQkgIGNoYW5uZWwsIEVEQUNfTU9EX1NUUik7CisJfQorfQorCisvKgorICogZGV0ZXJtcmluZSB0aGUgbnVtYmVyIG9mIFBBR0VTIGluIGZvciB0aGlzIERJTU0ncyBzaXplIGJhc2VkIG9uIGl0cyBEUkFNCisgKiBBZGRyZXNzIE1hcHBpbmcuCisgKgorICogRmlyc3Qgc3RlcCBpcyB0byBjYWxjIHRoZSBudW1iZXIgb2YgYml0cyB0byBzaGlmdCBhIHZhbHVlIG9mIDEgbGVmdCB0bworICogaW5kaWNhdGUgc2hvdyBtYW55IHBhZ2VzLiBTdGFydCB3aXRoIHRoZSBEQkFNIHZhbHVlIGFzIHRoZSBzdGFydGluZyBiaXRzLAorICogdGhlbiBwcm9jZWVkIHRvIGFkanVzdCB0aG9zZSBzaGlmdCBiaXRzLCBiYXNlZCBvbiBDUFUgcmV2IGFuZCB0aGUgdGFibGUuCisgKiBTZWUgQktERyBvbiB0aGUgREJBTQorICovCitzdGF0aWMgaW50IGs4X2RiYW1fbWFwX3RvX3BhZ2VzKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGRyYW1fbWFwKQoreworCWludCBucl9wYWdlczsKKworCWlmIChwdnQtPmV4dF9tb2RlbCA+PSBPUFRFUk9OX0NQVV9SRVZfRikgeworCQlucl9wYWdlcyA9IDEgPDwgKHJldmZfcXVhZF9kZHIyX3NoaWZ0W2RyYW1fbWFwXSAtIFBBR0VfU0hJRlQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJldkUgYW5kIGxlc3Mgc2VjdGlvbjsgdGhpcyBsaW5lIGlzIHRyaWNreS4gSXQgY29sbGFwc2VzIHRoZQorCQkgKiB0YWJsZSB1c2VkIGJ5IFJldkQgYW5kIGxhdGVyIHRvIG9uZSB0aGF0IG1hdGNoZXMgcmV2aXNpb25zIENHCisJCSAqIGFuZCBlYXJsaWVyLgorCQkgKi8KKwkJZHJhbV9tYXAgLT0gKHB2dC0+ZXh0X21vZGVsID49IE9QVEVST05fQ1BVX1JFVl9EKSA/CisJCQkJKGRyYW1fbWFwID4gOCA/IDQgOiAoZHJhbV9tYXAgPiA1ID8KKwkJCQkzIDogKGRyYW1fbWFwID4gMiA/IDEgOiAwKSkpIDogMDsKKworCQkvKiAyNSBzaGlmdCBpcyAzMk1pQiBtaW5pbXVtIERJTU0gc2l6ZSBpbiBSZXZFIGFuZCBwcmlvciAqLworCQlucl9wYWdlcyA9IDEgPDwgKGRyYW1fbWFwICsgMjUgLSBQQUdFX1NISUZUKTsKKwl9CisKKwlyZXR1cm4gbnJfcGFnZXM7Cit9CisKKy8qCisgKiBHZXQgdGhlIG51bWJlciBvZiBEQ1QgY2hhbm5lbHMgaW4gdXNlLgorICoKKyAqIFJldHVybjoKKyAqCW51bWJlciBvZiBNZW1vcnkgQ2hhbm5lbHMgaW4gb3BlcmF0aW9uCisgKiBQYXNzIGJhY2s6CisgKgljb250ZW50cyBvZiB0aGUgRENMMF9MT1cgcmVnaXN0ZXIKKyAqLworc3RhdGljIGludCBmMTBfZWFybHlfY2hhbm5lbF9jb3VudChzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCit7CisJaW50IGVyciA9IDAsIGNoYW5uZWxzID0gMDsKKwl1MzIgZGJhbTsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENMUl8wLCAmcHZ0LT5kY2xyMCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVnOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0xSXzEsICZwdnQtPmRjbHIxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWc7CisKKwkvKiBJZiB3ZSBhcmUgaW4gMTI4IGJpdCBtb2RlLCB0aGVuIHdlIGFyZSB1c2luZyAyIGNoYW5uZWxzICovCisJaWYgKHB2dC0+ZGNscjAgJiBGMTBfV0lEVEhfMTI4KSB7CisJCWRlYnVnZjAoIkRhdGEgV0lEVEggaXMgMTI4IGJpdHMgLSAyIGNoYW5uZWxzXG4iKTsKKwkJY2hhbm5lbHMgPSAyOworCQlyZXR1cm4gY2hhbm5lbHM7CisJfQorCisJLyoKKwkgKiBOZWVkIHRvIGNoZWNrIGlmIGluIFVOLWdhbmdlZCBtb2RlOiBJbiBzdWNoLCB0aGVyZSBhcmUgMiBjaGFubmVscywKKwkgKiBidXQgdGhleSBhcmUgTk9UIGluIDEyOCBiaXQgbW9kZSBhbmQgdGh1cyB0aGUgYWJvdmUgJ2RjbDAnIHN0YXR1cyBiaXQKKwkgKiB3aWxsIGJlIE9GRi4KKwkgKgorCSAqIE5lZWQgdG8gY2hlY2sgRENUMFswXSBhbmQgRENUMVswXSB0byBzZWUgaWYgb25seSBvbmUgb2YgdGhlbSBoYXMKKwkgKiB0aGVpciBDU0VuYWJsZSBiaXQgb24uIElmIHNvLCB0aGVuIFNJTkdMRSBESU1NIGNhc2UuCisJICovCisJZGVidWdmMCgiRGF0YSBXSURUSCBpcyBOT1QgMTI4IGJpdHMgLSBuZWVkIG1vcmUgZGVjb2RpbmdcbiIpOworCisJLyoKKwkgKiBDaGVjayBEUkFNIEJhbmsgQWRkcmVzcyBNYXBwaW5nIHZhbHVlcyBmb3IgZWFjaCBESU1NIHRvIHNlZSBpZiB0aGVyZQorCSAqIGlzIG1vcmUgdGhhbiBqdXN0IG9uZSBESU1NIHByZXNlbnQgaW4gdW5nYW5nZWQgbW9kZS4gTmVlZCB0byBjaGVjaworCSAqIGJvdGggY29udHJvbGxlcnMgc2luY2UgRElNTXMgY2FuIGJlIHBsYWNlZCBpbiBlaXRoZXIgb25lLgorCSAqLworCWNoYW5uZWxzID0gMDsKKwllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgREJBTTAsICZkYmFtKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWc7CisKKwlpZiAoREJBTV9ESU1NKDAsIGRiYW0pID4gMCkKKwkJY2hhbm5lbHMrKzsKKwlpZiAoREJBTV9ESU1NKDEsIGRiYW0pID4gMCkKKwkJY2hhbm5lbHMrKzsKKwlpZiAoREJBTV9ESU1NKDIsIGRiYW0pID4gMCkKKwkJY2hhbm5lbHMrKzsKKwlpZiAoREJBTV9ESU1NKDMsIGRiYW0pID4gMCkKKwkJY2hhbm5lbHMrKzsKKworCS8qIElmIG1vcmUgdGhhbiAyIERJTU1zIGFyZSBwcmVzZW50LCB0aGVuIHdlIGhhdmUgMiBjaGFubmVscyAqLworCWlmIChjaGFubmVscyA+IDIpCisJCWNoYW5uZWxzID0gMjsKKwllbHNlIGlmIChjaGFubmVscyA9PSAwKSB7CisJCS8qIE5vIERJTU1zIG9uIERDVDAsIHNvIGxvb2sgYXQgRENUMSAqLworCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgREJBTTEsICZkYmFtKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3JlZzsKKworCQlpZiAoREJBTV9ESU1NKDAsIGRiYW0pID4gMCkKKwkJCWNoYW5uZWxzKys7CisJCWlmIChEQkFNX0RJTU0oMSwgZGJhbSkgPiAwKQorCQkJY2hhbm5lbHMrKzsKKwkJaWYgKERCQU1fRElNTSgyLCBkYmFtKSA+IDApCisJCQljaGFubmVscysrOworCQlpZiAoREJBTV9ESU1NKDMsIGRiYW0pID4gMCkKKwkJCWNoYW5uZWxzKys7CisKKwkJaWYgKGNoYW5uZWxzID4gMikKKwkJCWNoYW5uZWxzID0gMjsKKwl9CisKKwkvKiBJZiB3ZSBmb3VuZCBBTEwgMCB2YWx1ZXMsIHRoZW4gYXNzdW1lIGp1c3QgT05FIERJTU0tT05FIENoYW5uZWwgKi8KKwlpZiAoY2hhbm5lbHMgPT0gMCkKKwkJY2hhbm5lbHMgPSAxOworCisJZGVidWdmMCgiRElNTSBjb3VudD0gJWRcbiIsIGNoYW5uZWxzKTsKKworCXJldHVybiBjaGFubmVsczsKKworZXJyX3JlZzoKKwlyZXR1cm4gLTE7CisKK30KKworc3RhdGljIGludCBmMTBfZGJhbV9tYXBfdG9fcGFnZXMoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgZHJhbV9tYXApCit7CisJcmV0dXJuIDEgPDwgKHJldmZfcXVhZF9kZHIyX3NoaWZ0W2RyYW1fbWFwXSAtIFBBR0VfU0hJRlQpOworfQorCisvKiBFbmFibGUgZXh0ZW5kZWQgY29uZmlndXJhdGlvbiBhY2Nlc3MgdmlhIDB4Q0Y4IGZlYXR1cmUgKi8KK3N0YXRpYyB2b2lkIGFtZDY0X3NldHVwKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKK3sKKwl1MzIgcmVnOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEYxMF9OQl9DRkdfSElHSCwgJnJlZyk7CisKKwlwdnQtPmZsYWdzLmNmOF9leHRjZmcgPSAhIShyZWcgJiBGMTBfTkJfQ0ZHX0xPV19FTkFCTEVfRVhUX0NGRyk7CisJcmVnIHw9IEYxMF9OQl9DRkdfTE9XX0VOQUJMRV9FWFRfQ0ZHOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwgRjEwX05CX0NGR19ISUdILCByZWcpOworfQorCisvKiBSZXN0b3JlIHRoZSBleHRlbmRlZCBjb25maWd1cmF0aW9uIGFjY2VzcyB2aWEgMHhDRjggZmVhdHVyZSAqLworc3RhdGljIHZvaWQgYW1kNjRfdGVhcmRvd24oc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQoreworCXUzMiByZWc7CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwgRjEwX05CX0NGR19ISUdILCAmcmVnKTsKKworCXJlZyAmPSB+RjEwX05CX0NGR19MT1dfRU5BQkxFX0VYVF9DRkc7CisJaWYgKHB2dC0+ZmxhZ3MuY2Y4X2V4dGNmZykKKwkJcmVnIHw9IEYxMF9OQl9DRkdfTE9XX0VOQUJMRV9FWFRfQ0ZHOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwgRjEwX05CX0NGR19ISUdILCByZWcpOworfQorCitzdGF0aWMgdTY0IGYxMF9nZXRfZXJyb3JfYWRkcmVzcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQlzdHJ1Y3QgYW1kNjRfZXJyb3JfaW5mb19yZWdzICppbmZvKQoreworCXJldHVybiAoKCh1NjQpIChpbmZvLT5uYmVhaCAmIDB4ZmZmZikpIDw8IDMyKSArCisJCQkoaW5mby0+bmJlYWwgJiB+MHgwMSk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBCYXNlIGFuZCBMaW1pdCByZWdpc3RlcnMgZm9yIEYxMCBiYXNlZCBNZW1vcnkgY29udHJvbGxlcnMuIEV4dHJhY3QKKyAqIGZpZWxkcyBmcm9tIHRoZSAncmF3JyByZWcgaW50byBzZXBhcmF0ZSBkYXRhIGZpZWxkcy4KKyAqCisgKiBJc29sYXRlczogQkFTRSwgTElNSVQsIEludGx2RW4sIEludGx2U2VsLCBSV19FTi4KKyAqLworc3RhdGljIHZvaWQgZjEwX3JlYWRfZHJhbV9iYXNlX2xpbWl0KHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGRyYW0pCit7CisJdTMyIGhpZ2hfb2Zmc2V0LCBsb3dfb2Zmc2V0LCBoaWdoX2Jhc2UsIGxvd19iYXNlLCBoaWdoX2xpbWl0LCBsb3dfbGltaXQ7CisKKwlsb3dfb2Zmc2V0ID0gSzhfRFJBTV9CQVNFX0xPVyArIChkcmFtIDw8IDMpOworCWhpZ2hfb2Zmc2V0ID0gRjEwX0RSQU1fQkFTRV9ISUdIICsgKGRyYW0gPDwgMyk7CisKKwkvKiByZWFkIHRoZSAncmF3JyBEUkFNIEJBU0UgQWRkcmVzcyByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmFkZHJfZjFfY3RsLCBsb3dfb2Zmc2V0LCAmbG93X2Jhc2UpOworCisJLyogUmVhZCBmcm9tIHRoZSBFQ1MgZGF0YSByZWdpc3RlciAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmFkZHJfZjFfY3RsLCBoaWdoX29mZnNldCwgJmhpZ2hfYmFzZSk7CisKKwkvKiBFeHRyYWN0IHBhcnRzIGludG8gc2VwYXJhdGUgZGF0YSBlbnRyaWVzICovCisJcHZ0LT5kcmFtX3J3X2VuW2RyYW1dID0gKGxvd19iYXNlICYgMHgzKTsKKworCWlmIChwdnQtPmRyYW1fcndfZW5bZHJhbV0gPT0gMCkKKwkJcmV0dXJuOworCisJcHZ0LT5kcmFtX0ludGx2RW5bZHJhbV0gPSAobG93X2Jhc2UgPj4gOCkgJiAweDc7CisKKwlwdnQtPmRyYW1fYmFzZVtkcmFtXSA9ICgoKCgodTY0KSBoaWdoX2Jhc2UgJiAweDAwMDAwMEZGKSA8PCAzMikgfAorCQkJCSgodTY0KSBsb3dfYmFzZSAmIDB4RkZGRjAwMDApKSkgPDwgODsKKworCWxvd19vZmZzZXQgPSBLOF9EUkFNX0xJTUlUX0xPVyArIChkcmFtIDw8IDMpOworCWhpZ2hfb2Zmc2V0ID0gRjEwX0RSQU1fTElNSVRfSElHSCArIChkcmFtIDw8IDMpOworCisJLyogcmVhZCB0aGUgJ3JhdycgTElNSVQgcmVnaXN0ZXJzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+YWRkcl9mMV9jdGwsIGxvd19vZmZzZXQsICZsb3dfbGltaXQpOworCisJLyogUmVhZCBmcm9tIHRoZSBFQ1MgZGF0YSByZWdpc3RlciBmb3IgdGhlIEhJR0ggcG9ydGlvbiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmFkZHJfZjFfY3RsLCBoaWdoX29mZnNldCwgJmhpZ2hfbGltaXQpOworCisJZGVidWdmMCgiICBIVyBSZWdzOiBCQVNFPTB4JTA4eC0lMDh4ICAgICAgTElNSVQ9ICAweCUwOHgtJTA4eFxuIiwKKwkJaGlnaF9iYXNlLCBsb3dfYmFzZSwgaGlnaF9saW1pdCwgbG93X2xpbWl0KTsKKworCXB2dC0+ZHJhbV9Ec3ROb2RlW2RyYW1dID0gKGxvd19saW1pdCAmIDB4Nyk7CisJcHZ0LT5kcmFtX0ludGx2U2VsW2RyYW1dID0gKGxvd19saW1pdCA+PiA4KSAmIDB4NzsKKworCS8qCisJICogRXh0cmFjdCBhZGRyZXNzIHZhbHVlcyBhbmQgZm9ybSBhIExJTUlUIGFkZHJlc3MuIExpbWl0IGlzIHRoZSBISUdIRVNUCisJICogbWVtb3J5IGxvY2F0aW9uIG9mIHRoZSByZWdpb24sIHNvIGxvdyAyNCBiaXRzIG5lZWQgdG8gYmUgYWxsIG9uZXMuCisJICovCisJbG93X2xpbWl0IHw9IDB4MDAwMEZGRkY7CisJcHZ0LT5kcmFtX2xpbWl0W2RyYW1dID0KKwkJKCgoKHU2NCkgaGlnaF9saW1pdCA8PCAzMikgKyAodTY0KSBsb3dfbGltaXQpIDw8IDgpIHwgKDB4RkYpOworfQorCitzdGF0aWMgdm9pZCBmMTBfcmVhZF9kcmFtX2N0bF9yZWdpc3RlcihzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDVExfU0VMX0xPVywKKwkJCQkgICAgJnB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdyk7CisJaWYgKGVycikgeworCQlkZWJ1Z2YwKCJSZWFkaW5nIEYxMF9EQ1RMX1NFTF9MT1cgZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQlkZWJ1Z2YwKCJEUkFNX0RDVExfU0VMX0xPVz0weCV4ICBEY3RTZWxCYXNlQWRkcj0weCV4XG4iLAorCQkJcHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93LCBkY3Rfc2VsX2Jhc2VhZGRyKHB2dCkpOworCisJCWRlYnVnZjAoIiAgRFJBTSBEQ1RzIGFyZT0lcyBEUkFNIElzPSVzIERSQU0tQ3RsLSIKKwkJCQkic2VsLWhpLXJhbmdlPSVzXG4iLAorCQkJKGRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KSA/ICJHQU5HRUQiIDogIk5PVCBHQU5HRUQiKSwKKwkJCShkY3RfZHJhbV9lbmFibGVkKHB2dCkgPyAiRW5hYmxlZCIgICA6ICJEaXNhYmxlZCIpLAorCQkJKGRjdF9oaWdoX3JhbmdlX2VuYWJsZWQocHZ0KSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpKTsKKworCQlkZWJ1Z2YwKCIgIERjdERhdEludEx2PSVzIE1lbUNsZWFyZWQ9JXMgRGN0U2VsSW50THZBZGRyPTB4JXhcbiIsCisJCQkoZGN0X2RhdGFfaW50bHZfZW5hYmxlZChwdnQpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIiksCisJCQkoZGN0X21lbW9yeV9jbGVhcmVkKHB2dCkgPyAiVHJ1ZSAiIDogIkZhbHNlICIpLAorCQkJZGN0X3NlbF9pbnRlcmxlYXZlX2FkZHIocHZ0KSk7CisJfQorCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ1RMX1NFTF9ISUdILAorCQkJCSAgICAmcHZ0LT5kcmFtX2N0bF9zZWxlY3RfaGlnaCk7CisJaWYgKGVycikKKwkJZGVidWdmMCgiUmVhZGluZyBGMTBfRENUTF9TRUxfSElHSCBmYWlsZWRcbiIpOworfQorCisvKgorICogZGV0ZXJtaW5lIGNoYW5uZWwgYmFzZWQgb24gdGhlIGludGVybGVhdmluZyBtb2RlOiBGMTBoIEJLREcsIDIuOC45IE1lbW9yeQorICogSW50ZXJsZWF2aW5nIE1vZGVzLgorICovCitzdGF0aWMgdTMyIGYxMF9kZXRlcm1pbmVfY2hhbm5lbChzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsIHU2NCBzeXNfYWRkciwKKwkJCQlpbnQgaGlfcmFuZ2Vfc2VsLCB1MzIgaW50bHZfZW4pCit7CisJdTMyIGNzLCB0ZW1wLCBkY3Rfc2VsX2hpZ2ggPSAocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ID4+IDEpICYgMTsKKworCWlmIChkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkpCisJCWNzID0gMDsKKwllbHNlIGlmIChoaV9yYW5nZV9zZWwpCisJCWNzID0gZGN0X3NlbF9oaWdoOworCWVsc2UgaWYgKGRjdF9pbnRlcmxlYXZlX2VuYWJsZWQocHZ0KSkgeworCQkvKgorCQkgKiBzZWUgRjJ4MTEwW0RjdFNlbEludEx2QWRkcl0gLSBjaGFubmVsIGludGVybGVhdmUgbW9kZQorCQkgKi8KKwkJaWYgKGRjdF9zZWxfaW50ZXJsZWF2ZV9hZGRyKHB2dCkgPT0gMCkKKwkJCWNzID0gc3lzX2FkZHIgPj4gNiAmIDE7CisJCWVsc2UgaWYgKChkY3Rfc2VsX2ludGVybGVhdmVfYWRkcihwdnQpID4+IDEpICYgMSkgeworCQkJdGVtcCA9IGh3ZWlnaHRfbG9uZygodTMyKSAoKHN5c19hZGRyID4+IDE2KSAmIDB4MUYpKSAlIDI7CisKKwkJCWlmIChkY3Rfc2VsX2ludGVybGVhdmVfYWRkcihwdnQpICYgMSkKKwkJCQljcyA9IChzeXNfYWRkciA+PiA5ICYgMSkgXiB0ZW1wOworCQkJZWxzZQorCQkJCWNzID0gKHN5c19hZGRyID4+IDYgJiAxKSBeIHRlbXA7CisJCX0gZWxzZSBpZiAoaW50bHZfZW4gJiA0KQorCQkJY3MgPSBzeXNfYWRkciA+PiAxNSAmIDE7CisJCWVsc2UgaWYgKGludGx2X2VuICYgMikKKwkJCWNzID0gc3lzX2FkZHIgPj4gMTQgJiAxOworCQllbHNlIGlmIChpbnRsdl9lbiAmIDEpCisJCQljcyA9IHN5c19hZGRyID4+IDEzICYgMTsKKwkJZWxzZQorCQkJY3MgPSBzeXNfYWRkciA+PiAxMiAmIDE7CisJfSBlbHNlIGlmIChkY3RfaGlnaF9yYW5nZV9lbmFibGVkKHB2dCkgJiYgIWRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KSkKKwkJY3MgPSB+ZGN0X3NlbF9oaWdoICYgMTsKKwllbHNlCisJCWNzID0gMDsKKworCXJldHVybiBjczsKK30KKworc3RhdGljIGlubGluZSB1MzIgZjEwX21hcF9pbnRsdl9lbl90b19zaGlmdCh1MzIgaW50bHZfZW4pCit7CisJaWYgKGludGx2X2VuID09IDEpCisJCXJldHVybiAxOworCWVsc2UgaWYgKGludGx2X2VuID09IDMpCisJCXJldHVybiAyOworCWVsc2UgaWYgKGludGx2X2VuID09IDcpCisJCXJldHVybiAzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFNlZSBGMTBoIEJLREcsIDIuOC4xMC4yIERjdFNlbEJhc2VPZmZzZXQgUHJvZ3JhbW1pbmcgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IGYxMF9nZXRfYmFzZV9hZGRyX29mZnNldCh1NjQgc3lzX2FkZHIsIGludCBoaV9yYW5nZV9zZWwsCisJCQkJCQkgdTMyIGRjdF9zZWxfYmFzZV9hZGRyLAorCQkJCQkJIHU2NCBkY3Rfc2VsX2Jhc2Vfb2ZmLAorCQkJCQkJIHUzMiBob2xlX3ZhbGlkLCB1MzIgaG9sZV9vZmYsCisJCQkJCQkgdTY0IGRyYW1fYmFzZSkKK3sKKwl1NjQgY2hhbl9vZmY7CisKKwlpZiAoaGlfcmFuZ2Vfc2VsKSB7CisJCWlmICghKGRjdF9zZWxfYmFzZV9hZGRyICYgMHhGRkZGRjgwMCkgJiYKKwkJICAgaG9sZV92YWxpZCAmJiAoc3lzX2FkZHIgPj0gMHgxMDAwMDAwMDBVTEwpKQorCQkJY2hhbl9vZmYgPSBob2xlX29mZiA8PCAxNjsKKwkJZWxzZQorCQkJY2hhbl9vZmYgPSBkY3Rfc2VsX2Jhc2Vfb2ZmOworCX0gZWxzZSB7CisJCWlmIChob2xlX3ZhbGlkICYmIChzeXNfYWRkciA+PSAweDEwMDAwMDAwMFVMTCkpCisJCQljaGFuX29mZiA9IGhvbGVfb2ZmIDw8IDE2OworCQllbHNlCisJCQljaGFuX29mZiA9IGRyYW1fYmFzZSAmIDB4RkZGRkY4MDAwMDAwVUxMOworCX0KKworCXJldHVybiAoc3lzX2FkZHIgJiAweDAwMDBGRkZGRkZGRkZGQzBVTEwpIC0KKwkJCShjaGFuX29mZiAmIDB4MDAwMEZGRkZGRjgwMDAwMFVMTCk7Cit9CisKKy8qIEhhY2sgZm9yIHRoZSB0aW1lIGJlaW5nIC0gQ2FuIHdlIGdldCB0aGlzIGZyb20gQklPUz8/ICovCisjZGVmaW5lCUNIMFNQQVJFX1JBTksJMAorI2RlZmluZQlDSDFTUEFSRV9SQU5LCTEKKworLyoKKyAqIGNoZWNrcyBpZiB0aGUgY3Nyb3cgcGFzc2VkIGluIGlzIG1hcmtlZCBhcyBTUEFSRUQsIGlmIHNvIHJldHVybnMgdGhlIG5ldworICogc3BhcmUgcm93CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGYxMF9wcm9jZXNzX3Bvc3NpYmxlX3NwYXJlKGludCBjc3JvdywKKwkJCQl1MzIgY3MsIHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKK3sKKwl1MzIgc3dhcF9kb25lOworCXUzMiBiYWRfZHJhbV9jczsKKworCS8qIERlcGVuZGluZyBvbiBjaGFubmVsLCBpc29sYXRlIHJlc3BlY3RpdmUgU1BBUklORyBpbmZvICovCisJaWYgKGNzKSB7CisJCXN3YXBfZG9uZSA9IEYxMF9PTkxJTkVfU1BBUkVfU1dBUERPTkUxKHB2dC0+b25saW5lX3NwYXJlKTsKKwkJYmFkX2RyYW1fY3MgPSBGMTBfT05MSU5FX1NQQVJFX0JBRERSQU1fQ1MxKHB2dC0+b25saW5lX3NwYXJlKTsKKwkJaWYgKHN3YXBfZG9uZSAmJiAoY3Nyb3cgPT0gYmFkX2RyYW1fY3MpKQorCQkJY3Nyb3cgPSBDSDFTUEFSRV9SQU5LOworCX0gZWxzZSB7CisJCXN3YXBfZG9uZSA9IEYxMF9PTkxJTkVfU1BBUkVfU1dBUERPTkUwKHB2dC0+b25saW5lX3NwYXJlKTsKKwkJYmFkX2RyYW1fY3MgPSBGMTBfT05MSU5FX1NQQVJFX0JBRERSQU1fQ1MwKHB2dC0+b25saW5lX3NwYXJlKTsKKwkJaWYgKHN3YXBfZG9uZSAmJiAoY3Nyb3cgPT0gYmFkX2RyYW1fY3MpKQorCQkJY3Nyb3cgPSBDSDBTUEFSRV9SQU5LOworCX0KKwlyZXR1cm4gY3Nyb3c7Cit9CisKKy8qCisgKiBJdGVyYXRlIG92ZXIgdGhlIERSQU0gRENUICJiYXNlIiBhbmQgIm1hc2siIHJlZ2lzdGVycyBsb29raW5nIGZvciBhCisgKiBTeXN0ZW1BZGRyIG1hdGNoIG9uIHRoZSBzcGVjaWZpZWQgJ0NoYW5uZWxTZWxlY3QnIGFuZCAnTm9kZUlEJworICoKKyAqIFJldHVybjoKKyAqCS1FSU5WQUw6ICBOT1QgRk9VTkQKKyAqCTAuLmNzcm93ID0gQ2hpcC1TZWxlY3QgUm93CisgKi8KK3N0YXRpYyBpbnQgZjEwX2xvb2t1cF9hZGRyX2luX2RjdCh1MzIgaW5fYWRkciwgdTMyIG5pZCwgdTMyIGNzKQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQ7CisJdTMyIGNzX2Jhc2UsIGNzX21hc2s7CisJaW50IGNzX2ZvdW5kID0gLUVJTlZBTDsKKwlpbnQgY3Nyb3c7CisKKwltY2kgPSBtY2lfbG9va3VwW25pZF07CisJaWYgKCFtY2kpCisJCXJldHVybiBjc19mb3VuZDsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwlkZWJ1Z2YxKCJJbnB1dEFkZHI9MHgleCAgY2hhbm5lbHNlbGVjdD0lZFxuIiwgaW5fYWRkciwgY3MpOworCisJZm9yIChjc3JvdyA9IDA7IGNzcm93IDwgQ0hJUFNFTEVDVF9DT1VOVDsgY3Nyb3crKykgeworCisJCWNzX2Jhc2UgPSBhbWQ2NF9nZXRfZGN0X2Jhc2UocHZ0LCBjcywgY3Nyb3cpOworCQlpZiAoIShjc19iYXNlICYgSzhfRENTQl9DU19FTkFCTEUpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhbiBFTkFCTEVEIENTUk9XLCBJc29sYXRlIGp1c3QgdGhlIE1BU0sgYml0cyBvZiB0aGUKKwkJICogdGFyZ2V0OiBbMjg6MTldIGFuZCBbMTM6NV0sIHdoaWNoIG1hcCB0byBbMzY6MjddIGFuZCBbMjE6MTNdCisJCSAqIG9mIHRoZSBhY3R1YWwgYWRkcmVzcy4KKwkJICovCisJCWNzX2Jhc2UgJj0gUkVWX0ZfRjFYaF9EQ1NCX0JBU0VfQklUUzsKKworCQkvKgorCQkgKiBHZXQgdGhlIERDVCBNYXNrLCBhbmQgRU5BQkxFIHRoZSByZXNlcnZlZCBiaXRzOiBbMTg6MTZdIGFuZAorCQkgKiBbNDowXSB0byBiZWNvbWUgT04uIFRoZW4gbWFzayBvZmYgYml0cyBbMjg6MF0gKFszNjo4XSkKKwkJICovCisJCWNzX21hc2sgPSBhbWQ2NF9nZXRfZGN0X21hc2socHZ0LCBjcywgY3Nyb3cpOworCisJCWRlYnVnZjEoIiAgICBDU1JPVz0lZCBDU0Jhc2U9MHgleCBSQVcgQ1NNYXNrPTB4JXhcbiIsCisJCQkJY3Nyb3csIGNzX2Jhc2UsIGNzX21hc2spOworCisJCWNzX21hc2sgPSAoY3NfbWFzayB8IDB4MDAwN0MwMUYpICYgMHgxRkZGRkZGRjsKKworCQlkZWJ1Z2YxKCIgICAgICAgICAgICAgIEZpbmFsIENTTWFzaz0weCV4XG4iLCBjc19tYXNrKTsKKwkJZGVidWdmMSgiICAgIChJbnB1dEFkZHIgJiB+Q1NNYXNrKT0weCV4ICIKKwkJCQkiKENTQmFzZSAmIH5DU01hc2spPTB4JXhcbiIsCisJCQkJKGluX2FkZHIgJiB+Y3NfbWFzayksIChjc19iYXNlICYgfmNzX21hc2spKTsKKworCQlpZiAoKGluX2FkZHIgJiB+Y3NfbWFzaykgPT0gKGNzX2Jhc2UgJiB+Y3NfbWFzaykpIHsKKwkJCWNzX2ZvdW5kID0gZjEwX3Byb2Nlc3NfcG9zc2libGVfc3BhcmUoY3Nyb3csIGNzLCBwdnQpOworCisJCQlkZWJ1Z2YxKCIgTUFUQ0ggY3Nyb3c9JWRcbiIsIGNzX2ZvdW5kKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBjc19mb3VuZDsKK30KKworLyogRm9yIGEgZ2l2ZW4gQGRyYW1fcmFuZ2UsIGNoZWNrIGlmIEBzeXNfYWRkciBmYWxscyB3aXRoaW4gaXQuICovCitzdGF0aWMgaW50IGYxMF9tYXRjaF90b190aGlzX25vZGUoc3RydWN0IGFtZDY0X3B2dCAqcHZ0LCBpbnQgZHJhbV9yYW5nZSwKKwkJCQkgIHU2NCBzeXNfYWRkciwgaW50ICpuaWQsIGludCAqY2hhbl9zZWwpCit7CisJaW50IG5vZGVfaWQsIGNzX2ZvdW5kID0gLUVJTlZBTCwgaGlnaF9yYW5nZSA9IDA7CisJdTMyIGludGx2X2VuLCBpbnRsdl9zZWwsIGludGx2X3NoaWZ0LCBob2xlX29mZjsKKwl1MzIgaG9sZV92YWxpZCwgdG1wLCBkY3Rfc2VsX2Jhc2UsIGNoYW5uZWw7CisJdTY0IGRyYW1fYmFzZSwgY2hhbl9hZGRyLCBkY3Rfc2VsX2Jhc2Vfb2ZmOworCisJZHJhbV9iYXNlID0gcHZ0LT5kcmFtX2Jhc2VbZHJhbV9yYW5nZV07CisJaW50bHZfZW4gPSBwdnQtPmRyYW1fSW50bHZFbltkcmFtX3JhbmdlXTsKKworCW5vZGVfaWQgPSBwdnQtPmRyYW1fRHN0Tm9kZVtkcmFtX3JhbmdlXTsKKwlpbnRsdl9zZWwgPSBwdnQtPmRyYW1fSW50bHZTZWxbZHJhbV9yYW5nZV07CisKKwlkZWJ1Z2YxKCIoZHJhbT0lZCkgQmFzZT0weCVsbHggU3lzdGVtQWRkcj0gMHglbGx4IExpbWl0PTB4JWxseFxuIiwKKwkJZHJhbV9yYW5nZSwgZHJhbV9iYXNlLCBzeXNfYWRkciwgcHZ0LT5kcmFtX2xpbWl0W2RyYW1fcmFuZ2VdKTsKKworCS8qCisJICogVGhpcyBhc3N1bWVzIHRoYXQgb25lIG5vZGUncyBESEFSIGlzIHRoZSBzYW1lIGFzIGFsbCB0aGUgb3RoZXIKKwkgKiBub2RlcycgREhBUi4KKwkgKi8KKwlob2xlX29mZiA9IChwdnQtPmRoYXIgJiAweDAwMDBGRjgwKTsKKwlob2xlX3ZhbGlkID0gKHB2dC0+ZGhhciAmIDB4MSk7CisJZGN0X3NlbF9iYXNlX29mZiA9IChwdnQtPmRyYW1fY3RsX3NlbGVjdF9oaWdoICYgMHhGRkZGRkMwMCkgPDwgMTY7CisKKwlkZWJ1Z2YxKCIgICBIb2xlT2Zmc2V0PTB4JXggIEhvbGVWYWxpZD0weCV4IEludGx2U2VsPTB4JXhcbiIsCisJCQlob2xlX29mZiwgaG9sZV92YWxpZCwgaW50bHZfc2VsKTsKKworCWlmIChpbnRsdl9lbiB8fAorCSAgICAoaW50bHZfc2VsICE9ICgoc3lzX2FkZHIgPj4gMTIpICYgaW50bHZfZW4pKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkY3Rfc2VsX2Jhc2UgPSBkY3Rfc2VsX2Jhc2VhZGRyKHB2dCk7CisKKwkvKgorCSAqIGNoZWNrIHdoZXRoZXIgYWRkcmVzc2VzID49IERjdFNlbEJhc2VBZGRyWzQ3OjI3XSBhcmUgdG8gYmUgdXNlZCB0bworCSAqIHNlbGVjdCBiZXR3ZWVuIERDVDAgYW5kIERDVDEuCisJICovCisJaWYgKGRjdF9oaWdoX3JhbmdlX2VuYWJsZWQocHZ0KSAmJgorCSAgICFkY3RfZ2FuZ2luZ19lbmFibGVkKHB2dCkgJiYKKwkgICAoKHN5c19hZGRyID4+IDI3KSA+PSAoZGN0X3NlbF9iYXNlID4+IDExKSkpCisJCWhpZ2hfcmFuZ2UgPSAxOworCisJY2hhbm5lbCA9IGYxMF9kZXRlcm1pbmVfY2hhbm5lbChwdnQsIHN5c19hZGRyLCBoaWdoX3JhbmdlLCBpbnRsdl9lbik7CisKKwljaGFuX2FkZHIgPSBmMTBfZ2V0X2Jhc2VfYWRkcl9vZmZzZXQoc3lzX2FkZHIsIGhpZ2hfcmFuZ2UsIGRjdF9zZWxfYmFzZSwKKwkJCQkJICAgICBkY3Rfc2VsX2Jhc2Vfb2ZmLCBob2xlX3ZhbGlkLAorCQkJCQkgICAgIGhvbGVfb2ZmLCBkcmFtX2Jhc2UpOworCisJaW50bHZfc2hpZnQgPSBmMTBfbWFwX2ludGx2X2VuX3RvX3NoaWZ0KGludGx2X2VuKTsKKworCS8qIHJlbW92ZSBOb2RlIElEIChpbiBjYXNlIG9mIG1lbW9yeSBpbnRlcmxlYXZpbmcpICovCisJdG1wID0gY2hhbl9hZGRyICYgMHhGQzA7CisKKwljaGFuX2FkZHIgPSAoKGNoYW5fYWRkciA+PiBpbnRsdl9zaGlmdCkgJiAweEZGRkZGRkZGRjAwMFVMTCkgfCB0bXA7CisKKwkvKiByZW1vdmUgY2hhbm5lbCBpbnRlcmxlYXZlIGFuZCBoYXNoICovCisJaWYgKGRjdF9pbnRlcmxlYXZlX2VuYWJsZWQocHZ0KSAmJgorCSAgICFkY3RfaGlnaF9yYW5nZV9lbmFibGVkKHB2dCkgJiYKKwkgICAhZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpKSB7CisJCWlmIChkY3Rfc2VsX2ludGVybGVhdmVfYWRkcihwdnQpICE9IDEpCisJCQljaGFuX2FkZHIgPSAoY2hhbl9hZGRyID4+IDEpICYgMHhGRkZGRkZGRkZGRkZGRkMwVUxMOworCQllbHNlIHsKKwkJCXRtcCA9IGNoYW5fYWRkciAmIDB4RkMwOworCQkJY2hhbl9hZGRyID0gKChjaGFuX2FkZHIgJiAweEZGRkZGRkZGRkZGRkMwMDBVTEwpID4+IDEpCisJCQkJCXwgdG1wOworCQl9CisJfQorCisJZGVidWdmMSgiICAgKENoYW5uZWxBZGRyTG9uZz0weCVsbHgpID4+IDggYmVjb21lcyBJbnB1dEFkZHI9MHgleFxuIiwKKwkJY2hhbl9hZGRyLCAodTMyKShjaGFuX2FkZHIgPj4gOCkpOworCisJY3NfZm91bmQgPSBmMTBfbG9va3VwX2FkZHJfaW5fZGN0KGNoYW5fYWRkciA+PiA4LCBub2RlX2lkLCBjaGFubmVsKTsKKworCWlmIChjc19mb3VuZCA+PSAwKSB7CisJCSpuaWQgPSBub2RlX2lkOworCQkqY2hhbl9zZWwgPSBjaGFubmVsOworCX0KKwlyZXR1cm4gY3NfZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgZjEwX3RyYW5zbGF0ZV9zeXNhZGRyX3RvX2NzKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgdTY0IHN5c19hZGRyLAorCQkJCSAgICAgICBpbnQgKm5vZGUsIGludCAqY2hhbl9zZWwpCit7CisJaW50IGRyYW1fcmFuZ2UsIGNzX2ZvdW5kID0gLUVJTlZBTDsKKwl1NjQgZHJhbV9iYXNlLCBkcmFtX2xpbWl0OworCisJZm9yIChkcmFtX3JhbmdlID0gMDsgZHJhbV9yYW5nZSA8IERSQU1fUkVHX0NPVU5UOyBkcmFtX3JhbmdlKyspIHsKKworCQlpZiAoIXB2dC0+ZHJhbV9yd19lbltkcmFtX3JhbmdlXSkKKwkJCWNvbnRpbnVlOworCisJCWRyYW1fYmFzZSA9IHB2dC0+ZHJhbV9iYXNlW2RyYW1fcmFuZ2VdOworCQlkcmFtX2xpbWl0ID0gcHZ0LT5kcmFtX2xpbWl0W2RyYW1fcmFuZ2VdOworCisJCWlmICgoZHJhbV9iYXNlIDw9IHN5c19hZGRyKSAmJiAoc3lzX2FkZHIgPD0gZHJhbV9saW1pdCkpIHsKKworCQkJY3NfZm91bmQgPSBmMTBfbWF0Y2hfdG9fdGhpc19ub2RlKHB2dCwgZHJhbV9yYW5nZSwKKwkJCQkJCQkgIHN5c19hZGRyLCBub2RlLAorCQkJCQkJCSAgY2hhbl9zZWwpOworCQkJaWYgKGNzX2ZvdW5kID49IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNzX2ZvdW5kOworfQorCisvKgorICogVGhpcyB0aGUgRjEwaCByZWZlcmVuY2UgY29kZSBmcm9tIEFNRCB0byBtYXAgYSBAc3lzX2FkZHIgdG8gTm9kZUlELAorICogQ1NST1csIENoYW5uZWwuCisgKgorICogVGhlIEBzeXNfYWRkciBpcyB1c3VhbGx5IGFuIGVycm9yIGFkZHJlc3MgcmVjZWl2ZWQgZnJvbSB0aGUgaGFyZHdhcmUuCisgKi8KK3N0YXRpYyB2b2lkIGYxMF9tYXBfc3lzYWRkcl90b19jc3JvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJICAgICBzdHJ1Y3QgYW1kNjRfZXJyb3JfaW5mb19yZWdzICppbmZvLAorCQkJCSAgICAgdTY0IHN5c19hZGRyKQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJdTMyIHBhZ2UsIG9mZnNldDsKKwl1bnNpZ25lZCBzaG9ydCBzeW5kcm9tZTsKKwlpbnQgbmlkLCBjc3JvdywgY2hhbiA9IDA7CisKKwljc3JvdyA9IGYxMF90cmFuc2xhdGVfc3lzYWRkcl90b19jcyhwdnQsIHN5c19hZGRyLCAmbmlkLCAmY2hhbik7CisKKwlpZiAoY3Nyb3cgPj0gMCkgeworCQllcnJvcl9hZGRyZXNzX3RvX3BhZ2VfYW5kX29mZnNldChzeXNfYWRkciwgJnBhZ2UsICZvZmZzZXQpOworCisJCXN5bmRyb21lID0gRVhUUkFDVF9ISUdIX1NZTkRST01FKGluZm8tPm5ic2wpIDw8IDg7CisJCXN5bmRyb21lIHw9IEVYVFJBQ1RfTE9XX1NZTkRST01FKGluZm8tPm5ic2gpOworCisJCS8qCisJCSAqIElzIENISVBLSUxMIG9uPyBJZiBzbywgdGhlbiB3ZSBjYW4gYXR0ZW1wdCB0byB1c2UgdGhlCisJCSAqIHN5bmRyb21lIHRvIGlzb2xhdGUgd2hpY2ggY2hhbm5lbCB0aGUgZXJyb3Igd2FzIG9uLgorCQkgKi8KKwkJaWYgKHB2dC0+bmJjZmcgJiBLOF9OQkNGR19DSElQS0lMTCkKKwkJCWNoYW4gPSBnZXRfY2hhbm5lbF9mcm9tX2VjY19zeW5kcm9tZShzeW5kcm9tZSk7CisKKwkJaWYgKGNoYW4gPj0gMCkgeworCQkJZWRhY19tY19oYW5kbGVfY2UobWNpLCBwYWdlLCBvZmZzZXQsIHN5bmRyb21lLAorCQkJCQljc3JvdywgY2hhbiwgRURBQ19NT0RfU1RSKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBDaGFubmVsIHVua25vd24sIHJlcG9ydCBhbGwgY2hhbm5lbHMgb24gdGhpcworCQkJICogQ1NST1cgYXMgZmFpbGVkLgorCQkJICovCisJCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgbWNpLT5jc3Jvd3NbY3Nyb3ddLm5yX2NoYW5uZWxzOworCQkJCQkJCQljaGFuKyspIHsKKwkJCQkJZWRhY19tY19oYW5kbGVfY2UobWNpLCBwYWdlLCBvZmZzZXQsCisJCQkJCQkJc3luZHJvbWUsCisJCQkJCQkJY3Nyb3csIGNoYW4sCisJCQkJCQkJRURBQ19NT0RfU1RSKTsKKwkJCX0KKwkJfQorCisJfSBlbHNlIHsKKwkJZWRhY19tY19oYW5kbGVfY2Vfbm9faW5mbyhtY2ksIEVEQUNfTU9EX1NUUik7CisJfQorfQorCisvKgorICogSW5wdXQgKEBpbmRleCkgaXMgdGhlIERCQU0gRElNTSB2YWx1ZSAoMSBvZiA0KSB1c2VkIGFzIGFuIGluZGV4IGludG8gYSBzaGlmdAorICogdGFibGUgKHJldmZfcXVhZF9kZHIyX3NoaWZ0KSB3aGljaCBzdGFydHMgYXQgMTI4TUIgRElNTSBzaXplLiBJbmRleCBvZiAwCisgKiBpbmRpY2F0ZXMgYW4gZW1wdHkgRElNTSBzbG90LCBhcyByZXBvcnRlZCBieSBIYXJkd2FyZSBvbiBlbXB0eSBzbG90cy4KKyAqCisgKiBOb3JtYWxpemUgdG8gMTI4TUIgYnkgc3VicmFjdGluZyAyNyBiaXQgc2hpZnQuCisgKi8KK3N0YXRpYyBpbnQgbWFwX2RiYW1fdG9fY3Nyb3dfc2l6ZShpbnQgaW5kZXgpCit7CisJaW50IG1lZ2FfYnl0ZXMgPSAwOworCisJaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8PSBEQkFNX01BWF9WQUxVRSkKKwkJbWVnYV9ieXRlcyA9ICgoMTI4IDw8IChyZXZmX3F1YWRfZGRyMl9zaGlmdFtpbmRleF0tMjcpKSk7CisKKwlyZXR1cm4gbWVnYV9ieXRlczsKK30KKworLyoKKyAqIGRlYnVnIHJvdXRpbmUgdG8gZGlzcGxheSB0aGUgbWVtb3J5IHNpemVzIG9mIGEgRElNTSAoZ2FuZ2VkIG9yIG5vdCkgYW5kIGl0CisgKiBDU1JPV3MgYXMgd2VsbAorICovCitzdGF0aWMgdm9pZCBmMTBfZGVidWdfZGlzcGxheV9kaW1tX3NpemVzKGludCBjdHJsLCBzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsCisJCQkJCSBpbnQgZ2FuZ2VkKQoreworCWludCBkaW1tLCBzaXplMCwgc2l6ZTE7CisJdTMyIGRiYW07CisJdTMyICpkY3NiOworCisJZGVidWdmMSgiICBkYmFtJWQ6IDB4JTguMDh4ICBDU1JPVyBpcyAlc1xuIiwgY3RybCwKKwkJCWN0cmwgPyBwdnQtPmRiYW0xIDogcHZ0LT5kYmFtMCwKKwkJCWdhbmdlZCA/ICJHQU5HRUQgLSBkYmFtMSBub3QgdXNlZCIgOiAiTk9OLUdBTkdFRCIpOworCisJZGJhbSA9IGN0cmwgPyBwdnQtPmRiYW0xIDogcHZ0LT5kYmFtMDsKKwlkY3NiID0gY3RybCA/IHB2dC0+ZGNzYjEgOiBwdnQtPmRjc2IwOworCisJLyogRHVtcCBtZW1vcnkgc2l6ZXMgZm9yIERJTU0gYW5kIGl0cyBDU1JPV3MgKi8KKwlmb3IgKGRpbW0gPSAwOyBkaW1tIDwgNDsgZGltbSsrKSB7CisKKwkJc2l6ZTAgPSAwOworCQlpZiAoZGNzYltkaW1tKjJdICYgSzhfRENTQl9DU19FTkFCTEUpCisJCQlzaXplMCA9IG1hcF9kYmFtX3RvX2Nzcm93X3NpemUoREJBTV9ESU1NKGRpbW0sIGRiYW0pKTsKKworCQlzaXplMSA9IDA7CisJCWlmIChkY3NiW2RpbW0qMiArIDFdICYgSzhfRENTQl9DU19FTkFCTEUpCisJCQlzaXplMSA9IG1hcF9kYmFtX3RvX2Nzcm93X3NpemUoREJBTV9ESU1NKGRpbW0sIGRiYW0pKTsKKworCQlkZWJ1Z2YxKCIgICAgIENUUkwtJWQgRElNTS0lZD0lNWRNQiAgIENTUk9XLSVkPSU1ZE1CICIKKwkJCQkiQ1NST1ctJWQ9JTVkTUJcbiIsCisJCQkJY3RybCwKKwkJCQlkaW1tLAorCQkJCXNpemUwICsgc2l6ZTEsCisJCQkJZGltbSAqIDIsCisJCQkJc2l6ZTAsCisJCQkJZGltbSAqIDIgKyAxLAorCQkJCXNpemUxKTsKKwl9Cit9CisKKy8qCisgKiBWZXJ5IGVhcmx5IGhhcmR3YXJlIHByb2JlIG9uIHBjaV9wcm9iZSB0aHJlYWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgbW9kdWxlCisgKiBzdXBwb3J0cyB0aGUgaGFyZHdhcmUuCisgKgorICogUmV0dXJuOgorICogICAgICAwIGZvciBPSworICogICAgICAxIGZvciBlcnJvcgorICovCitzdGF0aWMgaW50IGYxMF9wcm9iZV92YWxpZF9oYXJkd2FyZShzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCit7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIElmIHdlIGFyZSBvbiBhIEREUjMgbWFjaGluZSwgd2UgZG9uJ3Qga25vdyB5ZXQgaWYKKwkgKiB3ZSBzdXBwb3J0IHRoYXQgcHJvcGVybHkgYXQgdGhpcyB0aW1lCisJICovCisJaWYgKChwdnQtPmRjaHIwICYgRjEwX0RDSFJfRGRyM01vZGUpIHx8CisJICAgIChwdnQtPmRjaHIxICYgRjEwX0RDSFJfRGRyM01vZGUpKSB7CisKKwkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywKKwkJCSIlcygpIFRoaXMgbWFjaGluZSBpcyBydW5uaW5nIHdpdGggRERSMyBtZW1vcnkuICIKKwkJCSJUaGlzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiAiCisJCQkiRENIUjA9MHgleCBEQ0hSMT0weCV4XG4iLAorCQkJX19mdW5jX18sIHB2dC0+ZGNocjAsIHB2dC0+ZGNocjEpOworCisJCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCQkiICAgQ29udGFjdCAnJXMnIG1vZHVsZSBNQUlOVEFJTkVSIHRvIGhlbHAgYWRkIgorCQkJIiBzdXBwb3J0LlxuIiwKKwkJCUVEQUNfTU9EX1NUUik7CisKKwkJcmV0ID0gMTsKKworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhlcmUgY3VycmVudGx5IGFyZSAzIHR5cGVzIHR5cGUgb2YgTUMgZGV2aWNlcyBmb3IgQU1EIEF0aGxvbi9PcHRlcm9ucworICogKGFzIHBlciBQQ0kgREVWSUNFX0lEcyk6CisgKgorICogRmFtaWx5IEs4OiBUaGF0IGlzIHRoZSBBdGhsb242NCBhbmQgT3B0ZXJvbiBDUFVzLiBUaGV5IGFsbCBoYXZlIHRoZSBzYW1lIFBDSQorICogREVWSUNFIElELCBldmVuIHRob3VnaCB0aGVyZSBpcyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgUmV2aXNpb25zCisgKiAoQ0csRCxFLEYpLgorICoKKyAqIEZhbWlseSBGMTBoIGFuZCBGMTFoLgorICoKKyAqLworc3RhdGljIHN0cnVjdCBhbWQ2NF9mYW1pbHlfdHlwZSBhbWQ2NF9mYW1pbHlfdHlwZXNbXSA9IHsKKwlbSzhfQ1BVU10gPSB7CisJCS5jdGxfbmFtZSA9ICJSZXZGIiwKKwkJLmFkZHJfZjFfY3RsID0gUENJX0RFVklDRV9JRF9BTURfSzhfTkJfQUREUk1BUCwKKwkJLm1pc2NfZjNfY3RsID0gUENJX0RFVklDRV9JRF9BTURfSzhfTkJfTUlTQywKKwkJLm9wcyA9IHsKKwkJCS5lYXJseV9jaGFubmVsX2NvdW50ID0gazhfZWFybHlfY2hhbm5lbF9jb3VudCwKKwkJCS5nZXRfZXJyb3JfYWRkcmVzcyA9IGs4X2dldF9lcnJvcl9hZGRyZXNzLAorCQkJLnJlYWRfZHJhbV9iYXNlX2xpbWl0ID0gazhfcmVhZF9kcmFtX2Jhc2VfbGltaXQsCisJCQkubWFwX3N5c2FkZHJfdG9fY3Nyb3cgPSBrOF9tYXBfc3lzYWRkcl90b19jc3JvdywKKwkJCS5kYmFtX21hcF90b19wYWdlcyA9IGs4X2RiYW1fbWFwX3RvX3BhZ2VzLAorCQl9CisJfSwKKwlbRjEwX0NQVVNdID0geworCQkuY3RsX25hbWUgPSAiRmFtaWx5IDEwaCIsCisJCS5hZGRyX2YxX2N0bCA9IFBDSV9ERVZJQ0VfSURfQU1EXzEwSF9OQl9NQVAsCisJCS5taXNjX2YzX2N0bCA9IFBDSV9ERVZJQ0VfSURfQU1EXzEwSF9OQl9NSVNDLAorCQkub3BzID0geworCQkJLnByb2JlX3ZhbGlkX2hhcmR3YXJlID0gZjEwX3Byb2JlX3ZhbGlkX2hhcmR3YXJlLAorCQkJLmVhcmx5X2NoYW5uZWxfY291bnQgPSBmMTBfZWFybHlfY2hhbm5lbF9jb3VudCwKKwkJCS5nZXRfZXJyb3JfYWRkcmVzcyA9IGYxMF9nZXRfZXJyb3JfYWRkcmVzcywKKwkJCS5yZWFkX2RyYW1fYmFzZV9saW1pdCA9IGYxMF9yZWFkX2RyYW1fYmFzZV9saW1pdCwKKwkJCS5yZWFkX2RyYW1fY3RsX3JlZ2lzdGVyID0gZjEwX3JlYWRfZHJhbV9jdGxfcmVnaXN0ZXIsCisJCQkubWFwX3N5c2FkZHJfdG9fY3Nyb3cgPSBmMTBfbWFwX3N5c2FkZHJfdG9fY3Nyb3csCisJCQkuZGJhbV9tYXBfdG9fcGFnZXMgPSBmMTBfZGJhbV9tYXBfdG9fcGFnZXMsCisJCX0KKwl9LAorCVtGMTFfQ1BVU10gPSB7CisJCS5jdGxfbmFtZSA9ICJGYW1pbHkgMTFoIiwKKwkJLmFkZHJfZjFfY3RsID0gUENJX0RFVklDRV9JRF9BTURfMTFIX05CX01BUCwKKwkJLm1pc2NfZjNfY3RsID0gUENJX0RFVklDRV9JRF9BTURfMTFIX05CX01JU0MsCisJCS5vcHMgPSB7CisJCQkucHJvYmVfdmFsaWRfaGFyZHdhcmUgPSBmMTBfcHJvYmVfdmFsaWRfaGFyZHdhcmUsCisJCQkuZWFybHlfY2hhbm5lbF9jb3VudCA9IGYxMF9lYXJseV9jaGFubmVsX2NvdW50LAorCQkJLmdldF9lcnJvcl9hZGRyZXNzID0gZjEwX2dldF9lcnJvcl9hZGRyZXNzLAorCQkJLnJlYWRfZHJhbV9iYXNlX2xpbWl0ID0gZjEwX3JlYWRfZHJhbV9iYXNlX2xpbWl0LAorCQkJLnJlYWRfZHJhbV9jdGxfcmVnaXN0ZXIgPSBmMTBfcmVhZF9kcmFtX2N0bF9yZWdpc3RlciwKKwkJCS5tYXBfc3lzYWRkcl90b19jc3JvdyA9IGYxMF9tYXBfc3lzYWRkcl90b19jc3JvdywKKwkJCS5kYmFtX21hcF90b19wYWdlcyA9IGYxMF9kYmFtX21hcF90b19wYWdlcywKKwkJfQorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKnBjaV9nZXRfcmVsYXRlZF9mdW5jdGlvbih1bnNpZ25lZCBpbnQgdmVuZG9yLAorCQkJCQkJdW5zaWduZWQgaW50IGRldmljZSwKKwkJCQkJCXN0cnVjdCBwY2lfZGV2ICpyZWxhdGVkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOworCisJZGV2ID0gcGNpX2dldF9kZXZpY2UodmVuZG9yLCBkZXZpY2UsIGRldik7CisJd2hpbGUgKGRldikgeworCQlpZiAoKGRldi0+YnVzLT5udW1iZXIgPT0gcmVsYXRlZC0+YnVzLT5udW1iZXIpICYmCisJCSAgICAoUENJX1NMT1QoZGV2LT5kZXZmbikgPT0gUENJX1NMT1QocmVsYXRlZC0+ZGV2Zm4pKSkKKwkJCWJyZWFrOworCQlkZXYgPSBwY2lfZ2V0X2RldmljZSh2ZW5kb3IsIGRldmljZSwgZGV2KTsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCisvKgorICogc3luZHJvbWUgbWFwcGluZyB0YWJsZSBmb3IgRUNDIENoaXBLaWxsIGRldmljZXMKKyAqCisgKiBUaGUgY29tbWVudCBpbiBlYWNoIHJvdyBpcyB0aGUgdG9rZW4gKG5pYmJsZSkgbnVtYmVyIHRoYXQgaXMgaW4gZXJyb3IuCisgKiBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgbmliYmxlIG9mIHRoZSBzeW5kcm9tZSBpcyB0aGUgbWFzayBmb3IgdGhlIGJpdHMKKyAqIHRoYXQgYXJlIGluIGVycm9yIChuZWVkIHRvIGJlIHRvZ2dsZWQpIGZvciB0aGUgcGFydGljdWxhciBuaWJibGUuCisgKgorICogRWFjaCByb3cgY29udGFpbnMgMTYgZW50cmllcy4KKyAqIFRoZSBmaXJzdCBlbnRyeSAoMHRoKSBpcyB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIHRoYXQgcm93IG9mIHN5bmRyb21lcy4KKyAqIFRoZSByZW1haW5pbmcgMTUgZW50cmllcyBhcmUgdGhlIHN5bmRyb21lcyBmb3IgdGhlIHJlc3BlY3RpdmUgRXJyb3IKKyAqIGJpdCBtYXNrIGluZGV4LgorICoKKyAqIDFzdCBpbmRleCBlbnRyeSBpcyAweDAwMDEgbWFzaywgaW5kaWNhdGluZyB0aGF0IHRoZSByaWdodG1vc3QgYml0IGlzIHRoZQorICogYml0IGluIGVycm9yLgorICogVGhlIDJuZCBpbmRleCBlbnRyeSBpcyAweDAwMTAgdGhhdCB0aGUgc2Vjb25kIGJpdCBpcyBkYW1hZ2VkLgorICogVGhlIDNyZCBpbmRleCBlbnRyeSBpcyAweDAwMTEgaW5kaWNhdGluZyB0aGF0IHRoZSByaWdodG1vc3QgMiBiaXRzCisgKiBhcmUgZGFtYWdlZC4KKyAqIFRodXMgc28gb24gdW50aWwgaW5kZXggMTUsIDB4MTExMSwgd2hvc2UgZW50cnkgaGFzIHRoZSBzeW5kcm9tZQorICogaW5kaWNhdGluZyB0aGF0IGFsbCA0IGJpdHMgYXJlIGRhbWFnZWQuCisgKgorICogQSBzZWFyY2ggaXMgcGVyZm9ybWVkIG9uIHRoaXMgdGFibGUgbG9va2luZyBmb3IgYSBnaXZlbiBzeW5kcm9tZS4KKyAqCisgKiBTZWUgdGhlIEFNRCBkb2N1bWVudGF0aW9uIGZvciBFQ0Mgc3luZHJvbWVzLiBUaGlzIEVDQyB0YWJsZSBpcyB2YWxpZAorICogYWNyb3NzIGFsbCB0aGUgdmVyc2lvbnMgb2YgdGhlIEFNRDY0IHByb2Nlc3NvcnMuCisgKgorICogQSBmYXN0IGxvb2t1cCBpcyB0byB1c2UgdGhlIExBU1QgZm91ciBiaXRzIG9mIHRoZSAxNi1iaXQgc3luZHJvbWUgYXMgYQorICogQ09MVU1OIGluZGV4LCB0aGVuIHNlYXJjaCBhbGwgUk9XUyBvZiB0aGF0IGNvbHVtbiwgbG9va2luZyBmb3IgYSBtYXRjaAorICogd2l0aCB0aGUgaW5wdXQgc3luZHJvbWUuIFRoZSBST1cgdmFsdWUgd2lsbCBiZSB0aGUgdG9rZW4gbnVtYmVyLgorICoKKyAqIFRoZSAwJ3RoIGVudHJ5IG9uIHRoYXQgcm93LCBjYW4gYmUgcmV0dXJuZWQgYXMgdGhlIENIQU5ORUwgKDAgb3IgMSkgb2YgdGhpcworICogZXJyb3IuCisgKi8KKyNkZWZpbmUgTlVNQkVSX0VDQ19ST1dTICAzNgorc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGVjY19jaGlwa2lsbF9zeW5kcm9tZXNbTlVNQkVSX0VDQ19ST1dTXVsxNl0gPSB7CisJLyogQ2hhbm5lbCAwIHN5bmRyb21lcyAqLworCXsvKjAqLyAgMCwgMHhlODIxLCAweDdjMzIsIDB4OTQxMywgMHhiYjQ0LCAweDUzNjUsIDB4Yzc3NiwgMHgyZjU3LAorCSAgIDB4ZGQ4OCwgMHgzNWE5LCAweGExYmEsIDB4NDk5YiwgMHg2NmNjLCAweDhlZWQsIDB4MWFmZSwgMHhmMmRmIH0sCisJey8qMSovICAwLCAweDVkMzEsIDB4YTYxMiwgMHhmYjIzLCAweDk1ODQsIDB4YzhiNSwgMHgzMzk2LCAweDZlYTcsCisJICAgMHhlYWM4LCAweGI3ZjksIDB4NGNkYSwgMHgxMWViLCAweDdmNGMsIDB4MjI3ZCwgMHhkOTVlLCAweDg0NmYgfSwKKwl7LyoyKi8gIDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkgICAweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsIDB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiB9LAorCXsvKjMqLyAgMCwgMHgyMDIxLCAweDMwMzIsIDB4MTAxMywgMHg0MDQ0LCAweDYwNjUsIDB4NzA3NiwgMHg1MDU3LAorCSAgIDB4ODA4OCwgMHhhMGE5LCAweGIwYmEsIDB4OTA5YiwgMHhjMGNjLCAweGUwZWQsIDB4ZjBmZSwgMHhkMGRmIH0sCisJey8qNCovICAwLCAweDUwNDEsIDB4YTA4MiwgMHhmMGMzLCAweDkwNTQsIDB4YzAxNSwgMHgzMGQ2LCAweDYwOTcsCisJICAgMHhlMGE4LCAweGIwZTksIDB4NDAyYSwgMHgxMDZiLCAweDcwZmMsIDB4MjBiZCwgMHhkMDdlLCAweDgwM2YgfSwKKwl7Lyo1Ki8gIDAsIDB4YmUyMSwgMHhkNzMyLCAweDY5MTMsIDB4MjE0NCwgMHg5ZjY1LCAweGY2NzYsIDB4NDg1NywKKwkgICAweDMyODgsIDB4OGNhOSwgMHhlNWJhLCAweDViOWIsIDB4MTNjYywgMHhhZGVkLCAweGM0ZmUsIDB4N2FkZiB9LAorCXsvKjYqLyAgMCwgMHg0OTUxLCAweDhlYTIsIDB4YzdmMywgMHg1Mzk0LCAweDFhYzUsIDB4ZGQzNiwgMHg5NDY3LAorCSAgIDB4YTFlOCwgMHhlOGI5LCAweDJmNGEsIDB4NjYxYiwgMHhmMjdjLCAweGJiMmQsIDB4N2NkZSwgMHgzNThmIH0sCisJey8qNyovICAwLCAweDc0ZTEsIDB4OTg3MiwgMHhlYzkzLCAweGQ2YjQsIDB4YTI1NSwgMHg0ZWM2LCAweDNhMjcsCisJICAgMHg2YmQ4LCAweDFmMzksIDB4ZjNhYSwgMHg4NzRiLCAweGJkNmMsIDB4Yzk4ZCwgMHgyNTFlLCAweDUxZmYgfSwKKwl7Lyo4Ki8gIDAsIDB4MTVjMSwgMHgyYTQyLCAweDNmODMsIDB4Y2VmNCwgMHhkYjM1LCAweGU0YjYsIDB4ZjE3NywKKwkgICAweDQ3NTgsIDB4NTI5OSwgMHg2ZDFhLCAweDc4ZGIsIDB4ODlhYywgMHg5YzZkLCAweGEzZWUsIDB4YjYyZiB9LAorCXsvKjkqLyAgMCwgMHgzZDAxLCAweDE2MDIsIDB4MmIwMywgMHg4NTA0LCAweGI4MDUsIDB4OTMwNiwgMHhhZTA3LAorCSAgIDB4Y2EwOCwgMHhmNzA5LCAweGRjMGEsIDB4ZTEwYiwgMHg0ZjBjLCAweDcyMGQsIDB4NTkwZSwgMHg2NDBmIH0sCisJey8qYSovICAwLCAweDk4MDEsIDB4ZWMwMiwgMHg3NDAzLCAweDZiMDQsIDB4ZjMwNSwgMHg4NzA2LCAweDFmMDcsCisJICAgMHhiZDA4LCAweDI1MDksIDB4NTEwYSwgMHhjOTBiLCAweGQ2MGMsIDB4NGUwZCwgMHgzYTBlLCAweGEyMGYgfSwKKwl7LypiKi8gIDAsIDB4ZDEzMSwgMHg2MjEyLCAweGIzMjMsIDB4Mzg4NCwgMHhlOWI1LCAweDVhOTYsIDB4OGJhNywKKwkgICAweDFjYzgsIDB4Y2RmOSwgMHg3ZWRhLCAweGFmZWIsIDB4MjQ0YywgMHhmNTdkLCAweDQ2NWUsIDB4OTc2ZiB9LAorCXsvKmMqLyAgMCwgMHhlMWQxLCAweDcyNjIsIDB4OTNiMywgMHhiODM0LCAweDU5ZTUsIDB4Y2E1NiwgMHgyYjg3LAorCSAgIDB4ZGMxOCwgMHgzZGM5LCAweGFlN2EsIDB4NGZhYiwgMHg1NDJjLCAweDg1ZmQsIDB4MTY0ZSwgMHhmNzlmIH0sCisJey8qZCovICAwLCAweDYwNTEsIDB4YjBhMiwgMHhkMGYzLCAweDEwOTQsIDB4NzBjNSwgMHhhMDM2LCAweGMwNjcsCisJICAgMHgyMGU4LCAweDQwYjksIDB4OTA0YSwgMHg2MDFiLCAweDMwN2MsIDB4NTAyZCwgMHg4MGRlLCAweGUwOGYgfSwKKwl7LyplKi8gIDAsIDB4YTRjMSwgMHhmODQyLCAweDVjODMsIDB4ZTZmNCwgMHg0MjM1LCAweDFlYjYsIDB4YmE3NywKKwkgICAweDdiNTgsIDB4ZGY5OSwgMHg4MzFhLCAweDI3ZGIsIDB4OWRhYywgMHgzOTZkLCAweDY1ZWUsIDB4YzEyZiB9LAorCXsvKmYqLyAgMCwgMHgxMWMxLCAweDIyNDIsIDB4MzM4MywgMHhjOGY0LCAweGQ5MzUsIDB4ZWFiNiwgMHhmYjc3LAorCSAgIDB4NGM1OCwgMHg1ZDk5LCAweDZlMWEsIDB4N2ZkYiwgMHg4NGFjLCAweDk1NmQsIDB4YTZlZSwgMHhiNzJmIH0sCisKKwkvKiBDaGFubmVsIDEgc3luZHJvbWVzICovCisJey8qMTAqLyAxLCAweDQ1ZDEsIDB4OGE2MiwgMHhjZmIzLCAweDVlMzQsIDB4MWJlNSwgMHhkNDU2LCAweDkxODcsCisJICAgMHhhNzE4LCAweGUyYzksIDB4MmQ3YSwgMHg2OGFiLCAweGY5MmMsIDB4YmNmZCwgMHg3MzRlLCAweDM2OWYgfSwKKwl7LyoxMSovIDEsIDB4NjNlMSwgMHhiMTcyLCAweGQyOTMsIDB4MTRiNCwgMHg3NzU1LCAweGE1YzYsIDB4YzYyNywKKwkgICAweDI4ZDgsIDB4NGIzOSwgMHg5OWFhLCAweGZhNGIsIDB4M2M2YywgMHg1ZjhkLCAweDhkMWUsIDB4ZWVmZiB9LAorCXsvKjEyKi8gMSwgMHhiNzQxLCAweGQ5ODIsIDB4NmVjMywgMHgyMjU0LCAweDk1MTUsIDB4ZmJkNiwgMHg0Yzk3LAorCSAgIDB4MzNhOCwgMHg4NGU5LCAweGVhMmEsIDB4NWQ2YiwgMHgxMWZjLCAweGE2YmQsIDB4Yzg3ZSwgMHg3ZjNmIH0sCisJey8qMTMqLyAxLCAweGRkNDEsIDB4NjY4MiwgMHhiYmMzLCAweDM1NTQsIDB4ZTgxNSwgMHg1M2Q2LCAweGNlOTcsCisJICAgMHgxYWE4LCAweGM3ZTksIDB4N2MyYSwgMHhhMWZiLCAweDJmZmMsIDB4ZjJiZCwgMHg0OTdlLCAweDk0M2YgfSwKKwl7LyoxNCovIDEsIDB4MmJkMSwgMHgzZDYyLCAweDE2YjMsIDB4NGYzNCwgMHg2NGU1LCAweDcyNTYsIDB4NTk4NywKKwkgICAweDg1MTgsIDB4YWVjOSwgMHhiODdhLCAweDkzYWIsIDB4Y2EyYywgMHhlMWZkLCAweGY3NGUsIDB4ZGM5ZiB9LAorCXsvKjE1Ki8gMSwgMHg4M2MxLCAweGMxNDIsIDB4NDI4MywgMHhhNGY0LCAweDI3MzUsIDB4NjViNiwgMHhlNjc3LAorCSAgIDB4Zjg1OCwgMHg3Yjk5LCAweDM5MWEsIDB4YmFkYiwgMHg1Y2FjLCAweGRmNmQsIDB4OWRlZSwgMHgxZTJmIH0sCisJey8qMTYqLyAxLCAweDhmZDEsIDB4YzU2MiwgMHg0YWIzLCAweGE5MzQsIDB4MjZlNSwgMHg2YzU2LCAweGUzODcsCisJICAgMHhmZTE4LCAweDcxYzksIDB4M2I3YSwgMHhiNGFiLCAweDU3MmMsIDB4ZDhmZCwgMHg5MjRlLCAweDFkOWYgfSwKKwl7LyoxNyovIDEsIDB4NDc5MSwgMHg4OWUyLCAweGNlNzMsIDB4NTI2NCwgMHgxNWY1LCAweGRiODYsIDB4OWMxNywKKwkgICAweGEzYjgsIDB4ZTQyOSwgMHgyYTVhLCAweDZkY2IsIDB4ZjFkYywgMHhiNjRkLCAweDc4M2UsIDB4M2ZhZiB9LAorCXsvKjE4Ki8gMSwgMHg1NzgxLCAweGE5YzIsIDB4ZmU0MywgMHg5MmE0LCAweGM1MjUsIDB4M2I2NiwgMHg2Y2U3LAorCSAgIDB4ZTNmOCwgMHhiNDc5LCAweDRhM2EsIDB4MWRiYiwgMHg3MTVjLCAweDI2ZGQsIDB4ZDg5ZSwgMHg4ZjFmIH0sCisJey8qMTkqLyAxLCAweGJmNDEsIDB4ZDU4MiwgMHg2YWMzLCAweDI5NTQsIDB4OTYxNSwgMHhmY2Q2LCAweDQzOTcsCisJICAgMHgzZWE4LCAweDgxZTksIDB4ZWIyYSwgMHg1NDZiLCAweDE3ZmMsIDB4YThiZCwgMHhjMjdlLCAweDdkM2YgfSwKKwl7LyoxYSovIDEsIDB4OTg5MSwgMHhlMWUyLCAweDcyNzMsIDB4NjQ2NCwgMHhmN2Y1LCAweDg1ODYsIDB4MTYxNywKKwkgICAweGI4YjgsIDB4MmIyOSwgMHg1OTVhLCAweGNhY2IsIDB4ZGNkYywgMHg0ZjRkLCAweDNkM2UsIDB4YWVhZiB9LAorCXsvKjFiKi8gMSwgMHhjY2UxLCAweDQ0NzIsIDB4ODg5MywgMHhmZGI0LCAweDNmNTUsIDB4YjljNiwgMHg3NTI3LAorCSAgIDB4NTZkOCwgMHg5YTM5LCAweDEyYWEsIDB4ZGU0YiwgMHhhYjZjLCAweDY3OGQsIDB4ZWYxZSwgMHgyM2ZmIH0sCisJey8qMWMqLyAxLCAweGE3NjEsIDB4ZjliMiwgMHg1ZWQzLCAweGUyMTQsIDB4NDU3NSwgMHgxYmE2LCAweGJjYzcsCisJICAgMHg3MzI4LCAweGQ0NDksIDB4OGE5YSwgMHgyZGZiLCAweDkxM2MsIDB4MzY1ZCwgMHg2ODhlLCAweGNmZWYgfSwKKwl7LyoxZCovIDEsIDB4ZmY2MSwgMHg1NWIyLCAweGFhZDMsIDB4NzkxNCwgMHg4Njc1LCAweDJjYTYsIDB4ZDNjNywKKwkgICAweDllMjgsIDB4NjE0OSwgMHhjYjlhLCAweDM0ZmIsIDB4ZTczYywgMHgxODVkLCAweGIyOGUsIDB4NGRlZiB9LAorCXsvKjFlKi8gMSwgMHg1NDUxLCAweGE4YTIsIDB4ZmNmMywgMHg5Njk0LCAweGMyYzUsIDB4M2UzNiwgMHg2YTY3LAorCSAgIDB4ZWJlOCwgMHhiZmI5LCAweDQzNGEsIDB4MTcxYiwgMHg3ZDdjLCAweDI5MmQsIDB4ZDVkZSwgMHg4MThmIH0sCisJey8qMWYqLyAxLCAweDZmYzEsIDB4YjU0MiwgMHhkYTgzLCAweDE5ZjQsIDB4NzYzNSwgMHhhY2I2LCAweGMzNzcsCisJICAgMHgyZTU4LCAweDQxOTksIDB4OWIxYSwgMHhmNGRiLCAweDM3YWMsIDB4NTg2ZCwgMHg4MmVlLCAweGVkMmYgfSwKKworCS8qIEVDQyBiaXRzIGFyZSBhbHNvIGluIHRoZSBzZXQgb2YgdG9rZW5zIGFuZCB0aGV5IHRvbyBjYW4gZ28gYmFkCisJICogZmlyc3QgMiBjb3ZlciBjaGFubmVsIDAsIHdoaWxlIHRoZSBzZWNvbmQgMiBjb3ZlciBjaGFubmVsIDEKKwkgKi8KKwl7LyoyMCovIDAsIDB4YmUwMSwgMHhkNzAyLCAweDY5MDMsIDB4MjEwNCwgMHg5ZjA1LCAweGY2MDYsIDB4NDgwNywKKwkgICAweDMyMDgsIDB4OGMwOSwgMHhlNTBhLCAweDViMGIsIDB4MTMwYywgMHhhZDBkLCAweGM0MGUsIDB4N2EwZiB9LAorCXsvKjIxKi8gMCwgMHg0MTAxLCAweDgyMDIsIDB4YzMwMywgMHg1ODA0LCAweDE5MDUsIDB4ZGEwNiwgMHg5YjA3LAorCSAgIDB4YWMwOCwgMHhlZDA5LCAweDJlMGEsIDB4NmYwYiwgMHg2NDBjLCAweGI1MGQsIDB4NzYwZSwgMHgzNzBmIH0sCisJey8qMjIqLyAxLCAweGM0NDEsIDB4NDg4MiwgMHg4Y2MzLCAweGY2NTQsIDB4MzIxNSwgMHhiZWQ2LCAweDdhOTcsCisJICAgMHg1YmE4LCAweDlmZTksIDB4MTMyYSwgMHhkNzZiLCAweGFkZmMsIDB4NjliZCwgMHhlNTdlLCAweDIxM2YgfSwKKwl7LyoyMyovIDEsIDB4NzYyMSwgMHg5YjMyLCAweGVkMTMsIDB4ZGE0NCwgMHhhYzY1LCAweDQxNzYsIDB4Mzc1NywKKwkgICAweDZmODgsIDB4MTlhOSwgMHhmNGJhLCAweDgyOWIsIDB4YjVjYywgMHhjM2VkLCAweDJlZmUsIDB4NThkZiB9Cit9OworCisvKgorICogR2l2ZW4gdGhlIHN5bmRyb21lIGFyZ3VtZW50LCBzY2FuIGVhY2ggb2YgdGhlIGNoYW5uZWwgdGFibGVzIGZvciBhIHN5bmRyb21lCisgKiBtYXRjaC4gRGVwZW5kaW5nIG9uIHdoaWNoIHRhYmxlIGl0IGlzIGZvdW5kLCByZXR1cm4gdGhlIGNoYW5uZWwgbnVtYmVyLgorICovCitzdGF0aWMgaW50IGdldF9jaGFubmVsX2Zyb21fZWNjX3N5bmRyb21lKHVuc2lnbmVkIHNob3J0IHN5bmRyb21lKQoreworCWludCByb3c7CisJaW50IGNvbHVtbjsKKworCS8qIERldGVybWluZSBjb2x1bW4gdG8gc2NhbiAqLworCWNvbHVtbiA9IHN5bmRyb21lICYgMHhGOworCisJLyogU2NhbiBhbGwgcm93cywgbG9va2luZyBmb3Igc3luZHJvbWUsIG9yIGVuZCBvZiB0YWJsZSAqLworCWZvciAocm93ID0gMDsgcm93IDwgTlVNQkVSX0VDQ19ST1dTOyByb3crKykgeworCQlpZiAoZWNjX2NoaXBraWxsX3N5bmRyb21lc1tyb3ddW2NvbHVtbl0gPT0gc3luZHJvbWUpCisJCQlyZXR1cm4gZWNjX2NoaXBraWxsX3N5bmRyb21lc1tyb3ddWzBdOworCX0KKworCWRlYnVnZjAoInN5bmRyb21lKCV4KSBub3QgZm91bmRcbiIsIHN5bmRyb21lKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBDaGVjayBmb3IgdmFsaWQgZXJyb3IgaW4gdGhlIE5CIFN0YXR1cyBIaWdoIHJlZ2lzdGVyLiBJZiBzbywgcHJvY2VlZCB0byByZWFkCisgKiBOQiBTdGF0dXMgTG93LCBOQiBBZGRyZXNzIExvdyBhbmQgTkIgQWRkcmVzcyBIaWdoIHJlZ2lzdGVycyBhbmQgc3RvcmUgZGF0YQorICogaW50byBlcnJvciBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuczoKKyAqCS0gMTogaWYgaGFyZHdhcmUgcmVncyBjb250YWlucyB2YWxpZCBlcnJvciBpbmZvCisgKgktIDA6IGlmIG5vIHZhbGlkIGVycm9yIGlzIGluZGljYXRlZAorICovCitzdGF0aWMgaW50IGFtZDY0X2dldF9lcnJvcl9pbmZvX3JlZ3Moc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgICAgc3RydWN0IGFtZDY0X2Vycm9yX2luZm9fcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQ7CisJc3RydWN0IHBjaV9kZXYgKm1pc2NfZjNfY3RsOworCWludCBlcnIgPSAwOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwltaXNjX2YzX2N0bCA9IHB2dC0+bWlzY19mM19jdGw7CisKKwllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQobWlzY19mM19jdGwsIEs4X05CU0gsICZyZWdzLT5uYnNoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWc7CisKKwlpZiAoIShyZWdzLT5uYnNoICYgSzhfTkJTSF9WQUxJRF9CSVQpKQorCQlyZXR1cm4gMDsKKworCS8qIHZhbGlkIGVycm9yLCByZWFkIHJlbWFpbmluZyBlcnJvciBpbmZvcm1hdGlvbiByZWdpc3RlcnMgKi8KKwllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQobWlzY19mM19jdGwsIEs4X05CU0wsICZyZWdzLT5uYnNsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWc7CisKKwllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQobWlzY19mM19jdGwsIEs4X05CRUFMLCAmcmVncy0+bmJlYWwpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlZzsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChtaXNjX2YzX2N0bCwgSzhfTkJFQUgsICZyZWdzLT5uYmVhaCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVnOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKG1pc2NfZjNfY3RsLCBLOF9OQkNGRywgJnJlZ3MtPm5iY2ZnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWc7CisKKwlyZXR1cm4gMTsKKworZXJyX3JlZzoKKwlkZWJ1Z2YwKCJSZWFkaW5nIGVycm9yIGluZm8gcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIHJldHJpZXZlIHRoZSBlcnJvciBkYXRhIGZyb20gaGFyZHdhcmUgYW5kIHN0b3JlIGl0CisgKiBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuczoKKyAqCS0gMTogaWYgYSB2YWxpZCBlcnJvciBpcyBmb3VuZAorICoJLSAwOiBpZiBubyBlcnJvciBpcyBmb3VuZAorICovCitzdGF0aWMgaW50IGFtZDY0X2dldF9lcnJvcl9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQlzdHJ1Y3QgYW1kNjRfZXJyb3JfaW5mb19yZWdzICppbmZvKQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dDsKKwlzdHJ1Y3QgYW1kNjRfZXJyb3JfaW5mb19yZWdzIHJlZ3M7CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJaWYgKCFhbWQ2NF9nZXRfZXJyb3JfaW5mb19yZWdzKG1jaSwgaW5mbykpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBIZXJlJ3MgdGhlIHByb2JsZW0gd2l0aCB0aGUgSzgncyBFREFDIHJlcG9ydGluZzogVGhlcmUgYXJlIGZvdXIKKwkgKiByZWdpc3RlcnMgd2hpY2ggcmVwb3J0IHBpZWNlcyBvZiBlcnJvciBpbmZvcm1hdGlvbi4gVGhleSBhcmUgc2hhcmVkCisJICogYmV0d2VlbiBDRXMgYW5kIFVFcy4gRnVydGhlcm1vcmUsIGNvbnRyYXJ5IHRvIHdoYXQgaXMgc3RhdGVkIGluIHRoZQorCSAqIEJLREcsIHRoZSBvdmVyZmxvdyBiaXQgaXMgbmV2ZXIgdXNlZCEgRXZlcnkgZXJyb3IgYWx3YXlzIHVwZGF0ZXMgdGhlCisJICogcmVwb3J0aW5nIHJlZ2lzdGVycy4KKwkgKgorCSAqIENhbiB5b3Ugc2VlIHRoZSByYWNlIGNvbmRpdGlvbj8gQWxsIGZvdXIgZXJyb3IgcmVwb3J0aW5nIHJlZ2lzdGVycworCSAqIG11c3QgYmUgcmVhZCBiZWZvcmUgYSBuZXcgZXJyb3IgdXBkYXRlcyB0aGVtISBUaGVyZSBpcyBubyB3YXkgdG8gcmVhZAorCSAqIGFsbCBmb3VyIHJlZ2lzdGVycyBhdG9taWNhbGx5LiBUaGUgYmVzdCB0aGFuIGNhbiBiZSBkb25lIGlzIHRvIGRldGVjdAorCSAqIHRoYXQgYSByYWNlIGhhcyBvY2N1cmVkIGFuZCB0aGVuIHJlcG9ydCB0aGUgZXJyb3Igd2l0aG91dCBhbnkga2luZCBvZgorCSAqIHByZWNpc2lvbi4KKwkgKgorCSAqIFdoYXQgaXMgc3RpbGwgcG9zaXRpdmUgaXMgdGhhdCBlcnJvcnMgYXJlIHN0aWxsIHJlcG9ydGVkIGFuZCB0aHVzCisJICogcHJvYmxlbXMgY2FuIHN0aWxsIGJlIGRldGVjdGVkIC0ganVzdCBub3QgbG9jYWxpemVkIGJlY2F1c2UgdGhlCisJICogc3luZHJvbWUgYW5kIGFkZHJlc3MgYXJlIHNwcmVhZCBvdXQgYWNyb3NzIHJlZ2lzdGVycy4KKwkgKgorCSAqIEdycnJyciEhISEhICBIZXJlJ3MgaG9waW5nIHRoYXQgQU1EIGZpeGVzIHRoaXMgaW4gc29tZSBmdXR1cmUgSzggcmV2LgorCSAqIFVFcyBhbmQgQ0VzIHNob3VsZCBoYXZlIHNlcGFyYXRlIHJlZ2lzdGVyIHNldHMgd2l0aCBwcm9wZXIgb3ZlcmZsb3cKKwkgKiBiaXRzIHRoYXQgYXJlIHVzZWQhIEF0IHZlcnkgbGVhc3QgdGhlIHByb2JsZW0gY2FuIGJlIGZpeGVkIGJ5CisJICogaG9ub3JpbmcgdGhlIEVyclZhbGlkIGJpdCBpbiAnbmJzaCcgYW5kIG5vdCB1cGRhdGluZyByZWdpc3RlcnMgLSBqdXN0CisJICogc2V0IHRoZSBvdmVyZmxvdyBiaXQgLSB1bmxlc3MgdGhlIGN1cnJlbnQgZXJyb3IgaXMgQ0UgYW5kIHRoZSBuZXcKKwkgKiBlcnJvciBpcyBVRSB3aGljaCB3b3VsZCBiZSB0aGUgb25seSBzaXR1YXRpb24gZm9yIG92ZXJ3cml0aW5nIHRoZQorCSAqIGN1cnJlbnQgdmFsdWVzLgorCSAqLworCisJcmVncyA9ICppbmZvOworCisJLyogVXNlIGluZm8gZnJvbSB0aGUgc2Vjb25kIHJlYWQgLSBtb3N0IGN1cnJlbnQgKi8KKwlpZiAodW5saWtlbHkoIWFtZDY0X2dldF9lcnJvcl9pbmZvX3JlZ3MobWNpLCBpbmZvKSkpCisJCXJldHVybiAwOworCisJLyogY2xlYXIgdGhlIGVycm9yIGJpdHMgaW4gaGFyZHdhcmUgKi8KKwlwY2lfd3JpdGVfYml0czMyKHB2dC0+bWlzY19mM19jdGwsIEs4X05CU0gsIDAsIEs4X05CU0hfVkFMSURfQklUKTsKKworCS8qIENoZWNrIGZvciB0aGUgcG9zc2libGUgcmFjZSBjb25kaXRpb24gKi8KKwlpZiAoKHJlZ3MubmJzaCAhPSBpbmZvLT5uYnNoKSB8fAorCSAgICAgKHJlZ3MubmJzbCAhPSBpbmZvLT5uYnNsKSB8fAorCSAgICAgKHJlZ3MubmJlYWggIT0gaW5mby0+bmJlYWgpIHx8CisJICAgICAocmVncy5uYmVhbCAhPSBpbmZvLT5uYmVhbCkpIHsKKwkJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9XQVJOSU5HLAorCQkJCSJoYXJkd2FyZSBTVEFUVVMgcmVhZCBhY2Nlc3MgcmFjZSBjb25kaXRpb24gIgorCQkJCSJkZXRlY3RlZCFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhbWQ2NF9kZWNvZGVfZ2FydF90bGJfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCQkgc3RydWN0IGFtZDY0X2Vycm9yX2luZm9fcmVncyAqaW5mbykKK3sKKwl1MzIgZXJyX2NvZGU7CisJdTMyIGVjX3R0OwkJLyogZXJyb3IgY29kZSB0cmFuc2FjdGlvbiB0eXBlICgyYikgKi8KKwl1MzIgZWNfbGw7CQkvKiBlcnJvciBjb2RlIGNhY2hlIGxldmVsICgyYikgKi8KKworCWVycl9jb2RlID0gRVhUUkFDVF9FUlJPUl9DT0RFKGluZm8tPm5ic2wpOworCWVjX2xsID0gRVhUUkFDVF9MTF9DT0RFKGVycl9jb2RlKTsKKwllY190dCA9IEVYVFJBQ1RfVFRfQ09ERShlcnJfY29kZSk7CisKKwlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJICAgICAiR0FSVCBUTEIgZXZlbnQ6IHRyYW5zYWN0aW9uIHR5cGUoJXMpLCAiCisJCSAgICAgImNhY2hlIGxldmVsKCVzKVxuIiwgdHRfbXNnc1tlY190dF0sIGxsX21zZ3NbZWNfbGxdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFtZDY0X2RlY29kZV9tZW1fY2FjaGVfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgICAgIHN0cnVjdCBhbWQ2NF9lcnJvcl9pbmZvX3JlZ3MgKmluZm8pCit7CisJdTMyIGVycl9jb2RlOworCXUzMiBlY19ycnJyOwkJLyogZXJyb3IgY29kZSBtZW1vcnkgdHJhbnNhY3Rpb24gKDRiKSAqLworCXUzMiBlY190dDsJCS8qIGVycm9yIGNvZGUgdHJhbnNhY3Rpb24gdHlwZSAoMmIpICovCisJdTMyIGVjX2xsOwkJLyogZXJyb3IgY29kZSBjYWNoZSBsZXZlbCAoMmIpICovCisKKwllcnJfY29kZSA9IEVYVFJBQ1RfRVJST1JfQ09ERShpbmZvLT5uYnNsKTsKKwllY19sbCA9IEVYVFJBQ1RfTExfQ09ERShlcnJfY29kZSk7CisJZWNfdHQgPSBFWFRSQUNUX1RUX0NPREUoZXJyX2NvZGUpOworCWVjX3JycnIgPSBFWFRSQUNUX1JSUlJfQ09ERShlcnJfY29kZSk7CisKKwlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJICAgICAiY2FjaGUgaGllcmFyY2h5IGVycm9yOiBtZW1vcnkgdHJhbnNhY3Rpb24gdHlwZSglcyksICIKKwkJICAgICAidHJhbnNhY3Rpb24gdHlwZSglcyksIGNhY2hlIGxldmVsKCVzKVxuIiwKKwkJICAgICBycnJyX21zZ3NbZWNfcnJycl0sIHR0X21zZ3NbZWNfdHRdLCBsbF9tc2dzW2VjX2xsXSk7Cit9CisKKworLyoKKyAqIEhhbmRsZSBhbnkgQ29ycmVjdGFibGUgRXJyb3JzIChDRXMpIHRoYXQgaGF2ZSBvY2N1cnJlZC4gQ2hlY2sgZm9yIHZhbGlkIEVSUk9SCisgKiBBRERSRVNTIGFuZCBwcm9jZXNzLgorICovCitzdGF0aWMgdm9pZCBhbWQ2NF9oYW5kbGVfY2Uoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJICAgIHN0cnVjdCBhbWQ2NF9lcnJvcl9pbmZvX3JlZ3MgKmluZm8pCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1NjQgU3lzdGVtQWRkcmVzczsKKworCS8qIEVuc3VyZSB0aGF0IHRoZSBFcnJvciBBZGRyZXNzIGlzIFZBTElEICovCisJaWYgKChpbmZvLT5uYnNoICYgSzhfTkJTSF9WQUxJRF9FUlJPUl9BRERSKSA9PSAwKSB7CisJCWFtZDY0X21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLAorCQkJIkhXIGhhcyBubyBFUlJPUl9BRERSRVNTIGF2YWlsYWJsZVxuIik7CisJCWVkYWNfbWNfaGFuZGxlX2NlX25vX2luZm8obWNpLCBFREFDX01PRF9TVFIpOworCQlyZXR1cm47CisJfQorCisJU3lzdGVtQWRkcmVzcyA9IGV4dHJhY3RfZXJyb3JfYWRkcmVzcyhtY2ksIGluZm8pOworCisJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCisJCSJDRSBFUlJPUl9BRERSRVNTPSAweCVsbHhcbiIsIFN5c3RlbUFkZHJlc3MpOworCisJcHZ0LT5vcHMtPm1hcF9zeXNhZGRyX3RvX2Nzcm93KG1jaSwgaW5mbywgU3lzdGVtQWRkcmVzcyk7Cit9CisKKy8qIEhhbmRsZSBhbnkgVW4tY29ycmVjdGFibGUgRXJyb3JzIChVRXMpICovCitzdGF0aWMgdm9pZCBhbWQ2NF9oYW5kbGVfdWUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJICAgIHN0cnVjdCBhbWQ2NF9lcnJvcl9pbmZvX3JlZ3MgKmluZm8pCit7CisJaW50IGNzcm93OworCXU2NCBTeXN0ZW1BZGRyZXNzOworCXUzMiBwYWdlLCBvZmZzZXQ7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbG9nX21jaSwgKnNyY19tY2kgPSBOVUxMOworCisJbG9nX21jaSA9IG1jaTsKKworCWlmICgoaW5mby0+bmJzaCAmIEs4X05CU0hfVkFMSURfRVJST1JfQUREUikgPT0gMCkgeworCQlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX0NSSVQsCisJCQkiSFcgaGFzIG5vIEVSUk9SX0FERFJFU1MgYXZhaWxhYmxlXG4iKTsKKwkJZWRhY19tY19oYW5kbGVfdWVfbm9faW5mbyhsb2dfbWNpLCBFREFDX01PRF9TVFIpOworCQlyZXR1cm47CisJfQorCisJU3lzdGVtQWRkcmVzcyA9IGV4dHJhY3RfZXJyb3JfYWRkcmVzcyhtY2ksIGluZm8pOworCisJLyoKKwkgKiBGaW5kIG91dCB3aGljaCBub2RlIHRoZSBlcnJvciBhZGRyZXNzIGJlbG9uZ3MgdG8uIFRoaXMgbWF5IGJlCisJICogZGlmZmVyZW50IGZyb20gdGhlIG5vZGUgdGhhdCBkZXRlY3RlZCB0aGUgZXJyb3IuCisJICovCisJc3JjX21jaSA9IGZpbmRfbWNfYnlfc3lzX2FkZHIobWNpLCBTeXN0ZW1BZGRyZXNzKTsKKwlpZiAoIXNyY19tY2kpIHsKKwkJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9DUklULAorCQkJIkVSUk9SIEFERFJFU1MgKDB4JWx4KSB2YWx1ZSBOT1QgbWFwcGVkIHRvIGEgTUNcbiIsCisJCQkodW5zaWduZWQgbG9uZylTeXN0ZW1BZGRyZXNzKTsKKwkJZWRhY19tY19oYW5kbGVfdWVfbm9faW5mbyhsb2dfbWNpLCBFREFDX01PRF9TVFIpOworCQlyZXR1cm47CisJfQorCisJbG9nX21jaSA9IHNyY19tY2k7CisKKwljc3JvdyA9IHN5c19hZGRyX3RvX2Nzcm93KGxvZ19tY2ksIFN5c3RlbUFkZHJlc3MpOworCWlmIChjc3JvdyA8IDApIHsKKwkJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9DUklULAorCQkJIkVSUk9SX0FERFJFU1MgKDB4JWx4KSB2YWx1ZSBOT1QgbWFwcGVkIHRvICdjc3JvdydcbiIsCisJCQkodW5zaWduZWQgbG9uZylTeXN0ZW1BZGRyZXNzKTsKKwkJZWRhY19tY19oYW5kbGVfdWVfbm9faW5mbyhsb2dfbWNpLCBFREFDX01PRF9TVFIpOworCX0gZWxzZSB7CisJCWVycm9yX2FkZHJlc3NfdG9fcGFnZV9hbmRfb2Zmc2V0KFN5c3RlbUFkZHJlc3MsICZwYWdlLCAmb2Zmc2V0KTsKKwkJZWRhY19tY19oYW5kbGVfdWUobG9nX21jaSwgcGFnZSwgb2Zmc2V0LCBjc3JvdywgRURBQ19NT0RfU1RSKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFtZDY0X2RlY29kZV9idXNfZXJyb3Ioc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgIHN0cnVjdCBhbWQ2NF9lcnJvcl9pbmZvX3JlZ3MgKmluZm8pCit7CisJdTMyIGVycl9jb2RlLCBleHRfZWM7CisJdTMyIGVjX3BwOwkJLyogZXJyb3IgY29kZSBwYXJ0aWNpcGF0aW5nIHByb2Nlc3NvciAoMnApICovCisJdTMyIGVjX3RvOwkJLyogZXJyb3IgY29kZSB0aW1lZCBvdXQgKDFiKSAqLworCXUzMiBlY19ycnJyOwkJLyogZXJyb3IgY29kZSBtZW1vcnkgdHJhbnNhY3Rpb24gKDRiKSAqLworCXUzMiBlY19paTsJCS8qIGVycm9yIGNvZGUgbWVtb3J5IG9yIEkvTyAoMmIpICovCisJdTMyIGVjX2xsOwkJLyogZXJyb3IgY29kZSBjYWNoZSBsZXZlbCAoMmIpICovCisKKwlleHRfZWMgPSBFWFRSQUNUX0VYVF9FUlJPUl9DT0RFKGluZm8tPm5ic2wpOworCWVycl9jb2RlID0gRVhUUkFDVF9FUlJPUl9DT0RFKGluZm8tPm5ic2wpOworCisJZWNfbGwgPSBFWFRSQUNUX0xMX0NPREUoZXJyX2NvZGUpOworCWVjX2lpID0gRVhUUkFDVF9JSV9DT0RFKGVycl9jb2RlKTsKKwllY19ycnJyID0gRVhUUkFDVF9SUlJSX0NPREUoZXJyX2NvZGUpOworCWVjX3RvID0gRVhUUkFDVF9UT19DT0RFKGVycl9jb2RlKTsKKwllY19wcCA9IEVYVFJBQ1RfUFBfQ09ERShlcnJfY29kZSk7CisKKwlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJIkJVUyBFUlJPUjpcbiIKKwkJIiAgdGltZS1vdXQoJXMpIG1lbSBvciBpL28oJXMpXG4iCisJCSIgIHBhcnRpY2lwYXRpbmcgcHJvY2Vzc29yKCVzKVxuIgorCQkiICBtZW1vcnkgdHJhbnNhY3Rpb24gdHlwZSglcylcbiIKKwkJIiAgY2FjaGUgbGV2ZWwoJXMpIEVycm9yIEZvdW5kIGJ5OiAlc1xuIiwKKwkJdG9fbXNnc1tlY190b10sCisJCWlpX21zZ3NbZWNfaWldLAorCQlwcF9tc2dzW2VjX3BwXSwKKwkJcnJycl9tc2dzW2VjX3JycnJdLAorCQlsbF9tc2dzW2VjX2xsXSwKKwkJKGluZm8tPm5ic2ggJiBLOF9OQlNIX0VSUl9TQ1JVQkVSKSA/CisJCQkiU2NydWJiZXIiIDogIk5vcm1hbCBPcGVyYXRpb24iKTsKKworCS8qIElmIHRoaXMgd2FzIGFuICdvYnNlcnZlZCcgZXJyb3IsIGVhcmx5IG91dCAqLworCWlmIChlY19wcCA9PSBLOF9OQlNMX1BQX09CUykKKwkJcmV0dXJuOwkJLyogV2UgYXJlbid0IHRoZSBub2RlIGludm9sdmVkICovCisKKwkvKiBQYXJzZSBvdXQgdGhlIGV4dGVuZGVkIGVycm9yIGNvZGUgZm9yIEVDQyBldmVudHMgKi8KKwlzd2l0Y2ggKGV4dF9lYykgeworCS8qIEYxMCBjaGFuZ2VkIHRvIG9uZSBFeHRlbmRlZCBFQ0MgZXJyb3IgY29kZSAqLworCWNhc2UgRjEwX05CU0xfRVhUX0VSUl9SRVM6CQkvKiBSZXNlcnZlZCBmaWVsZCAqLworCWNhc2UgRjEwX05CU0xfRVhUX0VSUl9FQ0M6CQkvKiBGMTAgRUNDIGV4dCBlcnIgY29kZSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFtZDY0X21jX3ByaW50ayhtY2ksIEtFUk5fRVJSLCAiTk9UIEVDQzogbm8gc3BlY2lhbCBlcnJvciAiCisJCQkJCSAgICAgICAiaGFuZGxpbmcgZm9yIHRoaXMgZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGluZm8tPm5ic2ggJiBLOF9OQlNIX0NFQ0MpCisJCWFtZDY0X2hhbmRsZV9jZShtY2ksIGluZm8pOworCWVsc2UgaWYgKGluZm8tPm5ic2ggJiBLOF9OQlNIX1VFQ0MpCisJCWFtZDY0X2hhbmRsZV91ZShtY2ksIGluZm8pOworCisJLyoKKwkgKiBJZiBtYWluIGVycm9yIGlzIENFIHRoZW4gb3ZlcmZsb3cgbXVzdCBiZSBDRS4gIElmIG1haW4gZXJyb3IgaXMgVUUKKwkgKiB0aGVuIG92ZXJmbG93IGlzIHVua25vd24uICBXZSdsbCBjYWxsIHRoZSBvdmVyZmxvdyBhIENFIC0gaWYKKwkgKiBwYW5pY19vbl91ZSBpcyBzZXQgdGhlbiB3ZSdyZSBhbHJlYWR5IHBhbmljJ2VkIGFuZCB3b24ndCBhcnJpdmUKKwkgKiBoZXJlLiBFbHNlLCB0aGVuIGFwcGFyZW50bHkgc29tZW9uZSBkb2Vzbid0IHRoaW5rIHRoYXQgVUUncyBhcmUKKwkgKiBjYXRhc3Ryb3BoaWMuCisJICovCisJaWYgKGluZm8tPm5ic2ggJiBLOF9OQlNIX09WRVJGTE9XKQorCQllZGFjX21jX2hhbmRsZV9jZV9ub19pbmZvKG1jaSwgRURBQ19NT0RfU1RSCisJCQkJCSAgIkVycm9yIE92ZXJmbG93IHNldCIpOworfQorCitpbnQgYW1kNjRfcHJvY2Vzc19lcnJvcl9pbmZvKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCSAgICAgc3RydWN0IGFtZDY0X2Vycm9yX2luZm9fcmVncyAqaW5mbywKKwkJCSAgICAgaW50IGhhbmRsZV9lcnJvcnMpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0OworCXN0cnVjdCBhbWQ2NF9lcnJvcl9pbmZvX3JlZ3MgKnJlZ3M7CisJdTMyIGVycl9jb2RlLCBleHRfZWM7CisJaW50IGdhcnRfdGxiX2Vycm9yID0gMDsKKworCXB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwkvKiBJZiBjYWxsZXIgZG9lc24ndCB3YW50IHVzIHRvIHByb2Nlc3MgdGhlIGVycm9yLCByZXR1cm4gKi8KKwlpZiAoIWhhbmRsZV9lcnJvcnMpCisJCXJldHVybiAxOworCisJcmVncyA9IGluZm87CisKKwlkZWJ1Z2YxKCJOb3J0aEJyaWRnZSBFUlJPUjogbWNpKDB4JXApXG4iLCBtY2kpOworCWRlYnVnZjEoIiAgTUMgbm9kZSglZCkgRXJyb3ItQWRkcmVzcygweCUuOHgtJS44eClcbiIsCisJCXB2dC0+bWNfbm9kZV9pZCwgcmVncy0+bmJlYWgsIHJlZ3MtPm5iZWFsKTsKKwlkZWJ1Z2YxKCIgIG5ic2goMHglLjh4KSBuYnNsKDB4JS44eClcbiIsCisJCXJlZ3MtPm5ic2gsIHJlZ3MtPm5ic2wpOworCWRlYnVnZjEoIiAgVmFsaWQgRXJyb3I9JXMgT3ZlcmZsb3c9JXNcbiIsCisJCShyZWdzLT5uYnNoICYgSzhfTkJTSF9WQUxJRF9CSVQpID8gIlRydWUiIDogIkZhbHNlIiwKKwkJKHJlZ3MtPm5ic2ggJiBLOF9OQlNIX09WRVJGTE9XKSA/ICJUcnVlIiA6ICJGYWxzZSIpOworCWRlYnVnZjEoIiAgRXJyIFVuY29ycmVjdGVkPSVzIE1DQSBFcnJvciBSZXBvcnRpbmc9JXNcbiIsCisJCShyZWdzLT5uYnNoICYgSzhfTkJTSF9VTkNPUlJFQ1RFRF9FUlIpID8KKwkJCSJUcnVlIiA6ICJGYWxzZSIsCisJCShyZWdzLT5uYnNoICYgSzhfTkJTSF9FUlJfRU5BQkxFKSA/CisJCQkiVHJ1ZSIgOiAiRmFsc2UiKTsKKwlkZWJ1Z2YxKCIgIE1pc2NFcnIgVmFsaWQ9JXMgRXJyQWRkciBWYWxpZD0lcyBQQ0M9JXNcbiIsCisJCShyZWdzLT5uYnNoICYgSzhfTkJTSF9NSVNDX0VSUl9WQUxJRCkgPworCQkJIlRydWUiIDogIkZhbHNlIiwKKwkJKHJlZ3MtPm5ic2ggJiBLOF9OQlNIX1ZBTElEX0VSUk9SX0FERFIpID8KKwkJCSJUcnVlIiA6ICJGYWxzZSIsCisJCShyZWdzLT5uYnNoICYgSzhfTkJTSF9QQ0MpID8KKwkJCSJUcnVlIiA6ICJGYWxzZSIpOworCWRlYnVnZjEoIiAgQ0VDQz0lcyBVRUNDPSVzIEZvdW5kIGJ5IFNjcnViZXI9JXNcbiIsCisJCShyZWdzLT5uYnNoICYgSzhfTkJTSF9DRUNDKSA/CisJCQkiVHJ1ZSIgOiAiRmFsc2UiLAorCQkocmVncy0+bmJzaCAmIEs4X05CU0hfVUVDQykgPworCQkJIlRydWUiIDogIkZhbHNlIiwKKwkJKHJlZ3MtPm5ic2ggJiBLOF9OQlNIX0VSUl9TQ1JVQkVSKSA/CisJCQkiVHJ1ZSIgOiAiRmFsc2UiKTsKKwlkZWJ1Z2YxKCIgIENPUkUwPSVzIENPUkUxPSVzIENPUkUyPSVzIENPUkUzPSVzXG4iLAorCQkocmVncy0+bmJzaCAmIEs4X05CU0hfQ09SRTApID8gIlRydWUiIDogIkZhbHNlIiwKKwkJKHJlZ3MtPm5ic2ggJiBLOF9OQlNIX0NPUkUxKSA/ICJUcnVlIiA6ICJGYWxzZSIsCisJCShyZWdzLT5uYnNoICYgSzhfTkJTSF9DT1JFMikgPyAiVHJ1ZSIgOiAiRmFsc2UiLAorCQkocmVncy0+bmJzaCAmIEs4X05CU0hfQ09SRTMpID8gIlRydWUiIDogIkZhbHNlIik7CisKKworCWVycl9jb2RlID0gRVhUUkFDVF9FUlJPUl9DT0RFKHJlZ3MtPm5ic2wpOworCisJLyogRGV0ZXJtaW5lIHdoaWNoIGVycm9yIHR5cGU6CisJICoJMSkgR0FSVCBlcnJvcnMgLSBub24tZmF0YWwsIGRldmVsb3BtZW50YWwgZXZlbnRzCisJICoJMikgTUVNT1JZIGVycm9ycworCSAqCTMpIEJVUyBlcnJvcnMKKwkgKgk0KSBVbmtub3duIGVycm9yCisJICovCisJaWYgKFRFU1RfVExCX0VSUk9SKGVycl9jb2RlKSkgeworCQkvKgorCQkgKiBHQVJUIGVycm9ycyBhcmUgaW50ZW5kZWQgdG8gaGVscCBncmFwaGljcyBkcml2ZXIgZGV2ZWxvcGVycworCQkgKiB0byBkZXRlY3QgYmFkIEdBUlQgUFRFcy4gSXQgaXMgcmVjb21tZW5kZWQgYnkgQU1EIHRvIGRpc2FibGUKKwkJICogR0FSVCB0YWJsZSB3YWxrIGVycm9yIHJlcG9ydGluZyBieSBkZWZhdWx0WzFdIChjdXJyZW50bHkKKwkJICogYmVpbmcgZGlzYWJsZWQgaW4gbWNlX2NwdV9xdWlya3MoKSkgYW5kIGFjY29yZGluZyB0byB0aGUKKwkJICogY29tbWVudCBpbiBtY2VfY3B1X3F1aXJrcygpLCBzdWNoIEdBUlQgZXJyb3JzIGNhbiBiZQorCQkgKiBpbmNvcnJlY3RseSB0cmlnZ2VyZWQuIFdlIG1heSBzZWUgdGhlc2UgZXJyb3JzIGFueXdheSBhbmQKKwkJICogdW5sZXNzIHJlcXVlc3RlZCBieSB0aGUgdXNlciwgdGhleSB3b24ndCBiZSByZXBvcnRlZC4KKwkJICoKKwkJICogWzFdIHNlY3Rpb24gMTMuMTAuMSBvbiBCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVycyBHdWlkZSBmb3IKKwkJICogICAgIEFNRCBOUFQgZmFtaWx5IDBGaCBwcm9jZXNzb3JzCisJCSAqLworCQlpZiAocmVwb3J0X2dhcnRfZXJyb3JzID09IDApCisJCQlyZXR1cm4gMTsKKworCQkvKgorCQkgKiBPbmx5IGlmIEdBUlQgZXJyb3IgcmVwb3J0aW5nIGlzIHJlcXVlc3RlZCBzaG91bGQgd2UgZ2VuZXJhdGUKKwkJICogYW55IGxvZ3MuCisJCSAqLworCQlnYXJ0X3RsYl9lcnJvciA9IDE7CisKKwkJZGVidWdmMSgiR0FSVCBUTEIgZXJyb3JcbiIpOworCQlhbWQ2NF9kZWNvZGVfZ2FydF90bGJfZXJyb3IobWNpLCBpbmZvKTsKKwl9IGVsc2UgaWYgKFRFU1RfTUVNX0VSUk9SKGVycl9jb2RlKSkgeworCQlkZWJ1Z2YxKCJNZW1vcnkvQ2FjaGUgZXJyb3JcbiIpOworCQlhbWQ2NF9kZWNvZGVfbWVtX2NhY2hlX2Vycm9yKG1jaSwgaW5mbyk7CisJfSBlbHNlIGlmIChURVNUX0JVU19FUlJPUihlcnJfY29kZSkpIHsKKwkJZGVidWdmMSgiQnVzIChMaW5rL0RSQU0pIGVycm9yXG4iKTsKKwkJYW1kNjRfZGVjb2RlX2J1c19lcnJvcihtY2ksIGluZm8pOworCX0gZWxzZSB7CisJCS8qIHNob3VsZG4ndCByZWFjaCBoZXJlISAqLworCQlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX1dBUk5JTkcsCisJCQkgICAgICIlcygpOiB1bmtub3duIE1DRSBlcnJvciAweCV4XG4iLCBfX2Z1bmNfXywKKwkJCSAgICAgZXJyX2NvZGUpOworCX0KKworCWV4dF9lYyA9IEVYVFJBQ1RfRVhUX0VSUk9SX0NPREUocmVncy0+bmJzbCk7CisJYW1kNjRfbWNfcHJpbnRrKG1jaSwgS0VSTl9FUlIsCisJCSJFeHRFcnI9KDB4JXgpICVzXG4iLCBleHRfZWMsIGV4dF9tc2dzW2V4dF9lY10pOworCisJaWYgKCgoZXh0X2VjID49IEYxMF9OQlNMX0VYVF9FUlJfQ1JDICYmCisJCQlleHRfZWMgPD0gRjEwX05CU0xfRVhUX0VSUl9UR1QpIHx8CisJCQkoZXh0X2VjID09IEYxMF9OQlNMX0VYVF9FUlJfUk1XKSkgJiYKKwkJCUVYVFJBQ1RfTERUX0xJTksoaW5mby0+bmJzaCkpIHsKKworCQlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX0VSUiwKKwkJCSJFcnJvciBvbiBoeXBlcnRyYW5zcG9ydCBsaW5rOiAlc1xuIiwKKwkJCWh0bGlua19tc2dzWworCQkJRVhUUkFDVF9MRFRfTElOSyhpbmZvLT5uYnNoKV0pOworCX0KKworCS8qCisJICogQ2hlY2sgdGhlIFVFIGJpdCBvZiB0aGUgTkIgc3RhdHVzIGhpZ2ggcmVnaXN0ZXIsIGlmIHNldCBnZW5lcmF0ZSBzb21lCisJICogbG9ncy4gSWYgTk9UIGEgR0FSVCBlcnJvciwgdGhlbiBwcm9jZXNzIHRoZSBldmVudCBhcyBhIE5PLUlORk8gZXZlbnQuCisJICogSWYgaXQgd2FzIGEgR0FSVCBlcnJvciwgc2tpcCB0aGF0IHByb2Nlc3MuCisJICovCisJaWYgKHJlZ3MtPm5ic2ggJiBLOF9OQlNIX1VOQ09SUkVDVEVEX0VSUikgeworCQlhbWQ2NF9tY19wcmludGsobWNpLCBLRVJOX0NSSVQsICJ1bmNvcnJlY3RlZCBlcnJvclxuIik7CisJCWlmICghZ2FydF90bGJfZXJyb3IpCisJCQllZGFjX21jX2hhbmRsZV91ZV9ub19pbmZvKG1jaSwgIlVFIGJpdCBpcyBzZXRcbiIpOworCX0KKworCWlmIChyZWdzLT5uYnNoICYgSzhfTkJTSF9QQ0MpCisJCWFtZDY0X21jX3ByaW50ayhtY2ksIEtFUk5fQ1JJVCwKKwkJCSJQQ0MgKHByb2Nlc3NvciBjb250ZXh0IGNvcnJ1cHQpIHNldFxuIik7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFtZDY0X3Byb2Nlc3NfZXJyb3JfaW5mbyk7CisKKy8qCisgKiBUaGUgbWFpbiBwb2xsaW5nICdjaGVjaycgZnVuY3Rpb24sIGNhbGxlZCBGUk9NIHRoZSBlZGFjIGNvcmUgdG8gcGVyZm9ybSB0aGUKKyAqIGVycm9yIGNoZWNraW5nIGFuZCBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCwgZXJyb3IgcHJvY2Vzc2luZy4KKyAqLworc3RhdGljIHZvaWQgYW1kNjRfY2hlY2soc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoreworCXN0cnVjdCBhbWQ2NF9lcnJvcl9pbmZvX3JlZ3MgaW5mbzsKKworCWlmIChhbWQ2NF9nZXRfZXJyb3JfaW5mbyhtY2ksICZpbmZvKSkKKwkJYW1kNjRfcHJvY2Vzc19lcnJvcl9pbmZvKG1jaSwgJmluZm8sIDEpOworfQorCisvKgorICogSW5wdXQ6CisgKgkxKSBzdHJ1Y3QgYW1kNjRfcHZ0IHdoaWNoIGNvbnRhaW5zIHB2dC0+ZHJhbV9mMl9jdGwgcG9pbnRlcgorICoJMikgQU1EIEZhbWlseSBpbmRleCB2YWx1ZQorICoKKyAqIE91cHV0OgorICoJVXBvbiByZXR1cm4gb2YgMCwgdGhlIGZvbGxvd2luZyBmaWxsZWQgaW46CisgKgorICoJCXN0cnVjdCBwdnQtPmFkZHJfZjFfY3RsCisgKgkJc3RydWN0IHB2dC0+bWlzY19mM19jdGwKKyAqCisgKglGaWxsZWQgaW4gd2l0aCByZWxhdGVkIGRldmljZSBmdW5jaXRpb25zIG9mICdkcmFtX2YyX2N0bCcKKyAqCVRoZXNlIGRldmljZXMgYXJlICJyZXNlcnZlZCIgdmlhIHRoZSBwY2lfZ2V0X2RldmljZSgpCisgKgorICoJVXBvbiByZXR1cm4gb2YgMSAoZXJyb3Igc3RhdHVzKToKKyAqCisgKgkJTm90aGluZyByZXNlcnZlZAorICovCitzdGF0aWMgaW50IGFtZDY0X3Jlc2VydmVfbWNfc2libGluZ19kZXZpY2VzKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IG1jX2lkeCkKK3sKKwljb25zdCBzdHJ1Y3QgYW1kNjRfZmFtaWx5X3R5cGUgKmFtZDY0X2RldiA9ICZhbWQ2NF9mYW1pbHlfdHlwZXNbbWNfaWR4XTsKKworCS8qIFJlc2VydmUgdGhlIEFERFJFU1MgTUFQIERldmljZSAqLworCXB2dC0+YWRkcl9mMV9jdGwgPSBwY2lfZ2V0X3JlbGF0ZWRfZnVuY3Rpb24ocHZ0LT5kcmFtX2YyX2N0bC0+dmVuZG9yLAorCQkJCQkJICAgIGFtZDY0X2Rldi0+YWRkcl9mMV9jdGwsCisJCQkJCQkgICAgcHZ0LT5kcmFtX2YyX2N0bCk7CisKKwlpZiAoIXB2dC0+YWRkcl9mMV9jdGwpIHsKKwkJYW1kNjRfcHJpbnRrKEtFUk5fRVJSLCAiZXJyb3IgYWRkcmVzcyBtYXAgZGV2aWNlIG5vdCBmb3VuZDogIgorCQkJICAgICAidmVuZG9yICV4IGRldmljZSAweCV4IChicm9rZW4gQklPUz8pXG4iLAorCQkJICAgICBQQ0lfVkVORE9SX0lEX0FNRCwgYW1kNjRfZGV2LT5hZGRyX2YxX2N0bCk7CisJCXJldHVybiAxOworCX0KKworCS8qIFJlc2VydmUgdGhlIE1JU0MgRGV2aWNlICovCisJcHZ0LT5taXNjX2YzX2N0bCA9IHBjaV9nZXRfcmVsYXRlZF9mdW5jdGlvbihwdnQtPmRyYW1fZjJfY3RsLT52ZW5kb3IsCisJCQkJCQkgICAgYW1kNjRfZGV2LT5taXNjX2YzX2N0bCwKKwkJCQkJCSAgICBwdnQtPmRyYW1fZjJfY3RsKTsKKworCWlmICghcHZ0LT5taXNjX2YzX2N0bCkgeworCQlwY2lfZGV2X3B1dChwdnQtPmFkZHJfZjFfY3RsKTsKKwkJcHZ0LT5hZGRyX2YxX2N0bCA9IE5VTEw7CisKKwkJYW1kNjRfcHJpbnRrKEtFUk5fRVJSLCAiZXJyb3IgbWlzY2VsbGFuZW91cyBkZXZpY2Ugbm90IGZvdW5kOiAiCisJCQkgICAgICJ2ZW5kb3IgJXggZGV2aWNlIDB4JXggKGJyb2tlbiBCSU9TPylcbiIsCisJCQkgICAgIFBDSV9WRU5ET1JfSURfQU1ELCBhbWQ2NF9kZXYtPm1pc2NfZjNfY3RsKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGVidWdmMSgiICAgIEFkZHIgTWFwIGRldmljZSBQQ0kgQnVzIElEOlx0JXNcbiIsCisJCXBjaV9uYW1lKHB2dC0+YWRkcl9mMV9jdGwpKTsKKwlkZWJ1Z2YxKCIgICAgRFJBTSBNRU0tQ1RMIFBDSSBCdXMgSUQ6XHQlc1xuIiwKKwkJcGNpX25hbWUocHZ0LT5kcmFtX2YyX2N0bCkpOworCWRlYnVnZjEoIiAgICBNaXNjIGRldmljZSBQQ0kgQnVzIElEOlx0JXNcbiIsCisJCXBjaV9uYW1lKHB2dC0+bWlzY19mM19jdGwpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWQ2NF9mcmVlX21jX3NpYmxpbmdfZGV2aWNlcyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCit7CisJcGNpX2Rldl9wdXQocHZ0LT5hZGRyX2YxX2N0bCk7CisJcGNpX2Rldl9wdXQocHZ0LT5taXNjX2YzX2N0bCk7Cit9CisKKy8qCisgKiBSZXRyaWV2ZSB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzIG9mIHRoZSBtZW1vcnkgY29udHJvbGxlciAodGhpcyBpbmNsdWRlcyB0aGUKKyAqICdBZGRyZXNzIE1hcCcgYW5kICdNaXNjJyBkZXZpY2UgcmVncykKKyAqLworc3RhdGljIHZvaWQgYW1kNjRfcmVhZF9tY19yZWdpc3RlcnMoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQoreworCXU2NCBtc3JfdmFsOworCWludCBkcmFtLCBlcnIgPSAwOworCisJLyoKKwkgKiBSZXRyaWV2ZSBUT1BfTUVNIGFuZCBUT1BfTUVNMjsgbm8gbWFza2luZyBvZmYgb2YgcmVzZXJ2ZWQgYml0cyBzaW5jZQorCSAqIHRob3NlIGFyZSBSZWFkLUFzLVplcm8KKwkgKi8KKwlyZG1zcmwoTVNSX0s4X1RPUF9NRU0xLCBtc3JfdmFsKTsKKwlwdnQtPnRvcF9tZW0gPSBtc3JfdmFsID4+IDIzOworCWRlYnVnZjAoIiAgVE9QX01FTT0weCUwOGxseFxuIiwgcHZ0LT50b3BfbWVtKTsKKworCS8qIGNoZWNrIGZpcnN0IHdoZXRoZXIgVE9QX01FTTIgaXMgZW5hYmxlZCAqLworCXJkbXNybChNU1JfSzhfU1lTQ0ZHLCBtc3JfdmFsKTsKKwlpZiAobXNyX3ZhbCAmICgxVSA8PCAyMSkpIHsKKwkJcmRtc3JsKE1TUl9LOF9UT1BfTUVNMiwgbXNyX3ZhbCk7CisJCXB2dC0+dG9wX21lbTIgPSBtc3JfdmFsID4+IDIzOworCQlkZWJ1Z2YwKCIgIFRPUF9NRU0yPTB4JTA4bGx4XG4iLCBwdnQtPnRvcF9tZW0yKTsKKwl9IGVsc2UKKwkJZGVidWdmMCgiICBUT1BfTUVNMiBkaXNhYmxlZC5cbiIpOworCisJYW1kNjRfY3B1X2Rpc3BsYXlfaW5mbyhwdnQpOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ0FQLCAmcHZ0LT5uYmNhcCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVnOworCisJaWYgKHB2dC0+b3BzLT5yZWFkX2RyYW1fY3RsX3JlZ2lzdGVyKQorCQlwdnQtPm9wcy0+cmVhZF9kcmFtX2N0bF9yZWdpc3RlcihwdnQpOworCisJZm9yIChkcmFtID0gMDsgZHJhbSA8IERSQU1fUkVHX0NPVU5UOyBkcmFtKyspIHsKKwkJLyoKKwkJICogQ2FsbCBDUFUgc3BlY2lmaWMgUkVBRCBmdW5jdGlvbiB0byBnZXQgdGhlIERSQU0gQmFzZSBhbmQKKwkJICogTGltaXQgdmFsdWVzIGZyb20gdGhlIERDVC4KKwkJICovCisJCXB2dC0+b3BzLT5yZWFkX2RyYW1fYmFzZV9saW1pdChwdnQsIGRyYW0pOworCisJCS8qCisJCSAqIE9ubHkgcHJpbnQgb3V0IGRlYnVnIGluZm8gb24gcm93cyB3aXRoIGJvdGggUiBhbmQgVyBFbmFibGVkLgorCQkgKiBOb3JtYWwgcHJvY2Vzc2luZywgY29tcGlsZXIgc2hvdWxkIG9wdGltaXplIHRoaXMgd2hvbGUgJ2lmJworCQkgKiBkZWJ1ZyBvdXRwdXQgYmxvY2sgYXdheS4KKwkJICovCisJCWlmIChwdnQtPmRyYW1fcndfZW5bZHJhbV0gIT0gMCkgeworCQkJZGVidWdmMSgiICBEUkFNX0JBU0VbJWRdOiAweCU4LjA4eC0lOC4wOHggIgorCQkJCSJEUkFNX0xJTUlUOiAgMHglOC4wOHgtJTguMDh4XG4iLAorCQkJCWRyYW0sCisJCQkJKHUzMikocHZ0LT5kcmFtX2Jhc2VbZHJhbV0gPj4gMzIpLAorCQkJCSh1MzIpKHB2dC0+ZHJhbV9iYXNlW2RyYW1dICYgMHhGRkZGRkZGRiksCisJCQkJKHUzMikocHZ0LT5kcmFtX2xpbWl0W2RyYW1dID4+IDMyKSwKKwkJCQkodTMyKShwdnQtPmRyYW1fbGltaXRbZHJhbV0gJiAweEZGRkZGRkZGKSk7CisJCQlkZWJ1Z2YxKCIgICAgICAgIEludGx2RW49JXMgJXMgJXMgIgorCQkJCSJJbnRsdlNlbD0lZCBEc3ROb2RlPSVkXG4iLAorCQkJCXB2dC0+ZHJhbV9JbnRsdkVuW2RyYW1dID8KKwkJCQkJIkVuYWJsZWQiIDogIkRpc2FibGVkIiwKKwkJCQkocHZ0LT5kcmFtX3J3X2VuW2RyYW1dICYgMHgyKSA/ICJXIiA6ICIhVyIsCisJCQkJKHB2dC0+ZHJhbV9yd19lbltkcmFtXSAmIDB4MSkgPyAiUiIgOiAiIVIiLAorCQkJCXB2dC0+ZHJhbV9JbnRsdlNlbFtkcmFtXSwKKwkJCQlwdnQtPmRyYW1fRHN0Tm9kZVtkcmFtXSk7CisJCX0KKwl9CisKKwlhbWQ2NF9yZWFkX2RjdF9iYXNlX21hc2socHZ0KTsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmFkZHJfZjFfY3RsLCBLOF9ESEFSLCAmcHZ0LT5kaGFyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWc7CisKKwlhbWQ2NF9yZWFkX2RiYW1fcmVnKHB2dCk7CisKKwllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwKKwkJCQlGMTBfT05MSU5FX1NQQVJFLCAmcHZ0LT5vbmxpbmVfc3BhcmUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlZzsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPmRyYW1fZjJfY3RsLCBGMTBfRENMUl8wLCAmcHZ0LT5kY2xyMCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVnOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+ZHJhbV9mMl9jdGwsIEYxMF9EQ0hSXzAsICZwdnQtPmRjaHIwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWc7CisKKwlpZiAoIWRjdF9nYW5naW5nX2VuYWJsZWQocHZ0KSkgeworCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDTFJfMSwKKwkJCQkJCSZwdnQtPmRjbHIxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3JlZzsKKworCQllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5kcmFtX2YyX2N0bCwgRjEwX0RDSFJfMSwKKwkJCQkJCSZwdnQtPmRjaHIxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3JlZzsKKwl9CisKKwlhbWQ2NF9kdW1wX21pc2NfcmVncyhwdnQpOworCitlcnJfcmVnOgorCWRlYnVnZjAoIlJlYWRpbmcgYW4gTUMgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKworfQorCisvKgorICogTk9URTogQ1BVIFJldmlzaW9uIERlcGVuZGVudCBjb2RlCisgKgorICogSW5wdXQ6CisgKglAY3Nyb3dfbnIgQ2hpcFNlbGVjdCBSb3cgTnVtYmVyICgwLi5DSElQU0VMRUNUX0NPVU5ULTEpCisgKglrOCBwcml2YXRlIHBvaW50ZXIgdG8gLS0+CisgKgkJCURSQU0gQmFuayBBZGRyZXNzIG1hcHBpbmcgcmVnaXN0ZXIKKyAqCQkJbm9kZV9pZAorICoJCQlEQ0wgcmVnaXN0ZXIgd2hlcmUgZHVhbF9jaGFubmVsX2FjdGl2ZSBpcworICoKKyAqIFRoZSBEQkFNIHJlZ2lzdGVyIGNvbnNpc3RzIG9mIDQgc2V0cyBvZiA0IGJpdHMgZWFjaCBkZWZpbml0aW9uczoKKyAqCisgKiBCaXRzOglDU1JPV3MKKyAqIDAtMwkJQ1NST1dzIDAgYW5kIDEKKyAqIDQtNwkJQ1NST1dzIDIgYW5kIDMKKyAqIDgtMTEJCUNTUk9XcyA0IGFuZCA1CisgKiAxMi0xNQlDU1JPV3MgNiBhbmQgNworICoKKyAqIFZhbHVlcyByYW5nZSBmcm9tOiAwIHRvIDE1CisgKiBUaGUgbWVhbmluZyBvZiB0aGUgdmFsdWVzIGRlcGVuZHMgb24gQ1BVIHJldmlzaW9uIGFuZCBkdWFsLWNoYW5uZWwgc3RhdGUsCisgKiBzZWUgcmVsZXZhbnQgQktERyBtb3JlIGluZm8uCisgKgorICogVGhlIG1lbW9yeSBjb250cm9sbGVyIHByb3ZpZGVzIGZvciB0b3RhbCBvZiBvbmx5IDggQ1NST1dzIGluIGl0cyBjdXJyZW50CisgKiBhcmNoaXRlY3R1cmUuIEVhY2ggInBhaXIiIG9mIENTUk9XcyBub3JtYWxseSByZXByZXNlbnRzIGp1c3Qgb25lIERJTU0gaW4KKyAqIHNpbmdsZSBjaGFubmVsIG9yIHR3byAoMikgRElNTXMgaW4gZHVhbCBjaGFubmVsIG1vZGUuCisgKgorICogVGhlIGZvbGxvd2luZyBjb2RlIGxvZ2ljIGNvbGxhcHNlcyB0aGUgdmFyaW91cyB0YWJsZXMgZm9yIENTUk9XIGJhc2VkIG9uIENQVQorICogcmV2aXNpb24uCisgKgorICogUmV0dXJuczoKKyAqCVRoZSBudW1iZXIgb2YgUEFHRV9TSVpFIHBhZ2VzIG9uIHRoZSBzcGVjaWZpZWQgQ1NST1cgbnVtYmVyIGl0CisgKgllbmNvbXBhc3NlcworICoKKyAqLworc3RhdGljIHUzMiBhbWQ2NF9jc3Jvd19ucl9wYWdlcyhpbnQgY3Nyb3dfbnIsIHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKK3sKKwl1MzIgZHJhbV9tYXAsIG5yX3BhZ2VzOworCisJLyoKKwkgKiBUaGUgbWF0aCBvbiB0aGlzIGRvZXNuJ3QgbG9vayByaWdodCBvbiB0aGUgc3VyZmFjZSBiZWNhdXNlIHgvMio0IGNhbgorCSAqIGJlIHNpbXBsaWZpZWQgdG8geCoyIGJ1dCB0aGlzIGV4cHJlc3Npb24gbWFrZXMgdXNlIG9mIHRoZSBmYWN0IHRoYXQKKwkgKiBpdCBpcyBpbnRlZ3JhbCBtYXRoIHdoZXJlIDEvMj0wLiBUaGlzIGludGVybWVkaWF0ZSB2YWx1ZSBiZWNvbWVzIHRoZQorCSAqIG51bWJlciBvZiBiaXRzIHRvIHNoaWZ0IHRoZSBEQkFNIHJlZ2lzdGVyIHRvIGV4dHJhY3QgdGhlIHByb3BlciBDU1JPVworCSAqIGZpZWxkLgorCSAqLworCWRyYW1fbWFwID0gKHB2dC0+ZGJhbTAgPj4gKChjc3Jvd19uciAvIDIpICogNCkpICYgMHhGOworCisJbnJfcGFnZXMgPSBwdnQtPm9wcy0+ZGJhbV9tYXBfdG9fcGFnZXMocHZ0LCBkcmFtX21hcCk7CisKKwkvKgorCSAqIElmIGR1YWwgY2hhbm5lbCB0aGVuIGRvdWJsZSB0aGUgbWVtb3J5IHNpemUgb2Ygc2luZ2xlIGNoYW5uZWwuCisJICogQ2hhbm5lbCBjb3VudCBpcyAxIG9yIDIKKwkgKi8KKwlucl9wYWdlcyA8PD0gKHB2dC0+Y2hhbm5lbF9jb3VudCAtIDEpOworCisJZGVidWdmMCgiICAoY3Nyb3c9JWQpIERCQU0gbWFwIGluZGV4PSAlZFxuIiwgY3Nyb3dfbnIsIGRyYW1fbWFwKTsKKwlkZWJ1Z2YwKCIgICAgbnJfcGFnZXM9ICV1ICBjaGFubmVsLWNvdW50ID0gJWRcbiIsCisJCW5yX3BhZ2VzLCBwdnQtPmNoYW5uZWxfY291bnQpOworCisJcmV0dXJuIG5yX3BhZ2VzOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgYXJyYXkgb2YgY3Nyb3cgYXR0cmlidXRlIGluc3RhbmNlcywgYmFzZWQgb24gdGhlIHZhbHVlcworICogZnJvbSBwY2kgY29uZmlnIGhhcmR3YXJlIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCBhbWQ2NF9pbml0X2Nzcm93cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGNzcm93X2luZm8gKmNzcm93OworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dDsKKwl1NjQgaW5wdXRfYWRkcl9taW4sIGlucHV0X2FkZHJfbWF4LCBzeXNfYWRkcjsKKwlpbnQgaSwgZXJyID0gMCwgZW1wdHkgPSAxOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNGRywgJnB2dC0+bmJjZmcpOworCWlmIChlcnIpCisJCWRlYnVnZjAoIlJlYWRpbmcgSzhfTkJDRkcgZmFpbGVkXG4iKTsKKworCWRlYnVnZjAoIk5CQ0ZHPSAweCV4ICBDSElQS0lMTD0gJXMgRFJBTSBFQ0M9ICVzXG4iLCBwdnQtPm5iY2ZnLAorCQkocHZ0LT5uYmNmZyAmIEs4X05CQ0ZHX0NISVBLSUxMKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsCisJCShwdnQtPm5iY2ZnICYgSzhfTkJDRkdfRUNDX0VOQUJMRSkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiCisJCSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ0hJUFNFTEVDVF9DT1VOVDsgaSsrKSB7CisJCWNzcm93ID0gJm1jaS0+Y3Nyb3dzW2ldOworCisJCWlmICgocHZ0LT5kY3NiMFtpXSAmIEs4X0RDU0JfQ1NfRU5BQkxFKSA9PSAwKSB7CisJCQlkZWJ1Z2YxKCItLS0tQ1NST1cgJWQgRU1QVFkgZm9yIG5vZGUgJWRcbiIsIGksCisJCQkJcHZ0LT5tY19ub2RlX2lkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGVidWdmMSgiLS0tLUNTUk9XICVkIFZBTElEIGZvciBNQyBub2RlICVkXG4iLAorCQkJaSwgcHZ0LT5tY19ub2RlX2lkKTsKKworCQllbXB0eSA9IDA7CisJCWNzcm93LT5ucl9wYWdlcyA9IGFtZDY0X2Nzcm93X25yX3BhZ2VzKGksIHB2dCk7CisJCWZpbmRfY3Nyb3dfbGltaXRzKG1jaSwgaSwgJmlucHV0X2FkZHJfbWluLCAmaW5wdXRfYWRkcl9tYXgpOworCQlzeXNfYWRkciA9IGlucHV0X2FkZHJfdG9fc3lzX2FkZHIobWNpLCBpbnB1dF9hZGRyX21pbik7CisJCWNzcm93LT5maXJzdF9wYWdlID0gKHUzMikgKHN5c19hZGRyID4+IFBBR0VfU0hJRlQpOworCQlzeXNfYWRkciA9IGlucHV0X2FkZHJfdG9fc3lzX2FkZHIobWNpLCBpbnB1dF9hZGRyX21heCk7CisJCWNzcm93LT5sYXN0X3BhZ2UgPSAodTMyKSAoc3lzX2FkZHIgPj4gUEFHRV9TSElGVCk7CisJCWNzcm93LT5wYWdlX21hc2sgPSB+bWFza19mcm9tX2RjdF9tYXNrKHB2dCwgaSk7CisJCS8qIDggYnl0ZXMgb2YgcmVzb2x1dGlvbiAqLworCisJCWNzcm93LT5tdHlwZSA9IGFtZDY0X2RldGVybWluZV9tZW1vcnlfdHlwZShwdnQpOworCisJCWRlYnVnZjEoIiAgZm9yIE1DIG5vZGUgJWQgY3Nyb3cgJWQ6XG4iLCBwdnQtPm1jX25vZGVfaWQsIGkpOworCQlkZWJ1Z2YxKCIgICAgaW5wdXRfYWRkcl9taW46IDB4JWx4IGlucHV0X2FkZHJfbWF4OiAweCVseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKWlucHV0X2FkZHJfbWluLAorCQkJKHVuc2lnbmVkIGxvbmcpaW5wdXRfYWRkcl9tYXgpOworCQlkZWJ1Z2YxKCIgICAgc3lzX2FkZHI6IDB4JWx4ICBwYWdlX21hc2s6IDB4JWx4XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpc3lzX2FkZHIsIGNzcm93LT5wYWdlX21hc2spOworCQlkZWJ1Z2YxKCIgICAgbnJfcGFnZXM6ICV1ICBmaXJzdF9wYWdlOiAweCVseCAiCisJCQkibGFzdF9wYWdlOiAweCVseFxuIiwKKwkJCSh1bnNpZ25lZCljc3Jvdy0+bnJfcGFnZXMsCisJCQljc3Jvdy0+Zmlyc3RfcGFnZSwgY3Nyb3ctPmxhc3RfcGFnZSk7CisKKwkJLyoKKwkJICogZGV0ZXJtaW5lIHdoZXRoZXIgQ0hJUEtJTEwgb3IgSlVTVCBFQ0Mgb3IgTk8gRUNDIGlzIG9wZXJhdGluZworCQkgKi8KKwkJaWYgKHB2dC0+bmJjZmcgJiBLOF9OQkNGR19FQ0NfRU5BQkxFKQorCQkJY3Nyb3ctPmVkYWNfbW9kZSA9CisJCQkgICAgKHB2dC0+bmJjZmcgJiBLOF9OQkNGR19DSElQS0lMTCkgPworCQkJICAgIEVEQUNfUzRFQ0Q0RUQgOiBFREFDX1NFQ0RFRDsKKwkJZWxzZQorCQkJY3Nyb3ctPmVkYWNfbW9kZSA9IEVEQUNfTk9ORTsKKwl9CisKKwlyZXR1cm4gZW1wdHk7Cit9CisKKy8qCisgKiBPbmx5IGlmICdlY2NfZW5hYmxlX292ZXJyaWRlJyBpcyBzZXQgQU5EIEJJT1MgaGFkIEVDQyBkaXNhYmxlZCwgZG8gIndlIgorICogZW5hYmxlIGl0LgorICovCitzdGF0aWMgdm9pZCBhbWQ2NF9lbmFibGVfZWNjX2Vycm9yX3JlcG9ydGluZyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwljb25zdCBjcHVtYXNrX3QgKmNwdW1hc2sgPSBjcHVtYXNrX29mX25vZGUocHZ0LT5tY19ub2RlX2lkKTsKKwlpbnQgY3B1LCBpZHggPSAwLCBlcnIgPSAwOworCXN0cnVjdCBtc3IgbXNyc1tjcHVtYXNrX3dlaWdodChjcHVtYXNrKV07CisJdTMyIHZhbHVlOworCXUzMiBtYXNrID0gSzhfTkJDVExfQ0VDQ0VuIHwgSzhfTkJDVExfVUVDQ0VuOworCisJaWYgKCFlY2NfZW5hYmxlX292ZXJyaWRlKQorCQlyZXR1cm47CisKKwltZW1zZXQobXNycywgMCwgc2l6ZW9mKG1zcnMpKTsKKworCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCSInZWNjX2VuYWJsZV9vdmVycmlkZScgcGFyYW1ldGVyIGlzIGFjdGl2ZSwgIgorCQkiRW5hYmxpbmcgQU1EIEVDQyBoYXJkd2FyZSBub3c6IENBVVRJT05cbiIpOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ1RMLCAmdmFsdWUpOworCWlmIChlcnIpCisJCWRlYnVnZjAoIlJlYWRpbmcgSzhfTkJDVEwgZmFpbGVkXG4iKTsKKworCS8qIHR1cm4gb24gVUVDQ24gYW5kIENFQ0NFbiBiaXRzICovCisJcHZ0LT5vbGRfbmJjdGwgPSB2YWx1ZSAmIG1hc2s7CisJcHZ0LT5uYmN0bF9tY2djdGxfc2F2ZWQgPSAxOworCisJdmFsdWUgfD0gbWFzazsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ1RMLCB2YWx1ZSk7CisKKwlyZG1zcl9vbl9jcHVzKGNwdW1hc2ssIEs4X01TUl9NQ0dDVEwsIG1zcnMpOworCisJZm9yX2VhY2hfY3B1KGNwdSwgY3B1bWFzaykgeworCQlpZiAobXNyc1tpZHhdLmwgJiBLOF9NU1JfTUNHQ1RMX05CRSkKKwkJCXNldF9iaXQoaWR4LCAmcHZ0LT5vbGRfbWNnY3RsKTsKKworCQltc3JzW2lkeF0ubCB8PSBLOF9NU1JfTUNHQ1RMX05CRTsKKwkJaWR4Kys7CisJfQorCXdybXNyX29uX2NwdXMoY3B1bWFzaywgSzhfTVNSX01DR0NUTCwgbXNycyk7CisKKwllcnIgPSBwY2lfcmVhZF9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwgSzhfTkJDRkcsICZ2YWx1ZSk7CisJaWYgKGVycikKKwkJZGVidWdmMCgiUmVhZGluZyBLOF9OQkNGRyBmYWlsZWRcbiIpOworCisJZGVidWdmMCgiTkJDRkcoMSk9IDB4JXggIENISVBLSUxMPSAlcyBFQ0NfRU5BQkxFPSAlc1xuIiwgdmFsdWUsCisJCSh2YWx1ZSAmIEs4X05CQ0ZHX0NISVBLSUxMKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsCisJCSh2YWx1ZSAmIEs4X05CQ0ZHX0VDQ19FTkFCTEUpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisKKwlpZiAoISh2YWx1ZSAmIEs4X05CQ0ZHX0VDQ19FTkFCTEUpKSB7CisJCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsCisJCQkiVGhpcyBub2RlIHJlcG9ydHMgdGhhdCBEUkFNIEVDQyBpcyAiCisJCQkiY3VycmVudGx5IERpc2FibGVkOyBFTkFCTElORyBub3dcbiIpOworCisJCS8qIEF0dGVtcHQgdG8gdHVybiBvbiBEUkFNIEVDQyBFbmFibGUgKi8KKwkJdmFsdWUgfD0gSzhfTkJDRkdfRUNDX0VOQUJMRTsKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNGRywgdmFsdWUpOworCisJCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNGRywgJnZhbHVlKTsKKwkJaWYgKGVycikKKwkJCWRlYnVnZjAoIlJlYWRpbmcgSzhfTkJDRkcgZmFpbGVkXG4iKTsKKworCQlpZiAoISh2YWx1ZSAmIEs4X05CQ0ZHX0VDQ19FTkFCTEUpKSB7CisJCQlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLAorCQkJCSJIYXJkd2FyZSByZWplY3RzIEVuYWJsaW5nIERSQU0gRUNDIGNoZWNraW5nXG4iCisJCQkJIkNoZWNrIG1lbW9yeSBESU1NIGNvbmZpZ3VyYXRpb25cbiIpOworCQl9IGVsc2UgeworCQkJYW1kNjRfcHJpbnRrKEtFUk5fREVCVUcsCisJCQkJIkhhcmR3YXJlIGFjY2VwdGVkIERSQU0gRUNDIEVuYWJsZVxuIik7CisJCX0KKwl9CisJZGVidWdmMCgiTkJDRkcoMik9IDB4JXggIENISVBLSUxMPSAlcyBFQ0NfRU5BQkxFPSAlc1xuIiwgdmFsdWUsCisJCSh2YWx1ZSAmIEs4X05CQ0ZHX0NISVBLSUxMKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIsCisJCSh2YWx1ZSAmIEs4X05CQ0ZHX0VDQ19FTkFCTEUpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisKKwlwdnQtPmN0bF9lcnJvcl9pbmZvLm5iY2ZnID0gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGFtZDY0X3Jlc3RvcmVfZWNjX2Vycm9yX3JlcG9ydGluZyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpCit7CisJY29uc3QgY3B1bWFza190ICpjcHVtYXNrID0gY3B1bWFza19vZl9ub2RlKHB2dC0+bWNfbm9kZV9pZCk7CisJaW50IGNwdSwgaWR4ID0gMCwgZXJyID0gMDsKKwlzdHJ1Y3QgbXNyIG1zcnNbY3B1bWFza193ZWlnaHQoY3B1bWFzayldOworCXUzMiB2YWx1ZTsKKwl1MzIgbWFzayA9IEs4X05CQ1RMX0NFQ0NFbiB8IEs4X05CQ1RMX1VFQ0NFbjsKKworCWlmICghcHZ0LT5uYmN0bF9tY2djdGxfc2F2ZWQpCisJCXJldHVybjsKKworCW1lbXNldChtc3JzLCAwLCBzaXplb2YobXNycykpOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ1RMLCAmdmFsdWUpOworCWlmIChlcnIpCisJCWRlYnVnZjAoIlJlYWRpbmcgSzhfTkJDVEwgZmFpbGVkXG4iKTsKKwl2YWx1ZSAmPSB+bWFzazsKKwl2YWx1ZSB8PSBwdnQtPm9sZF9uYmN0bDsKKworCS8qIHJlc3RvcmUgdGhlIE5CIEVuYWJsZSBNQ0dDVEwgYml0ICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLCBLOF9OQkNUTCwgdmFsdWUpOworCisJcmRtc3Jfb25fY3B1cyhjcHVtYXNrLCBLOF9NU1JfTUNHQ1RMLCBtc3JzKTsKKworCWZvcl9lYWNoX2NwdShjcHUsIGNwdW1hc2spIHsKKwkJbXNyc1tpZHhdLmwgJj0gfks4X01TUl9NQ0dDVExfTkJFOworCQltc3JzW2lkeF0ubCB8PQorCQkJdGVzdF9iaXQoaWR4LCAmcHZ0LT5vbGRfbWNnY3RsKSA8PCBLOF9NU1JfTUNHQ1RMX05CRTsKKwkJaWR4Kys7CisJfQorCisJd3Jtc3Jfb25fY3B1cyhjcHVtYXNrLCBLOF9NU1JfTUNHQ1RMLCBtc3JzKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfbWNnX2N0bCh2b2lkICpyZXQpCit7CisJdTY0IG1zcl92YWwgPSAwOworCXU4IG5iZTsKKworCXJkbXNybChNU1JfSUEzMl9NQ0dfQ1RMLCBtc3JfdmFsKTsKKwluYmUgPSBtc3JfdmFsICYgSzhfTVNSX01DR0NUTF9OQkU7CisKKwlkZWJ1Z2YwKCJjb3JlOiAldSwgTUNHX0NUTDogMHglbGx4LCBOQiBNU1IgaXMgJXNcbiIsCisJCXJhd19zbXBfcHJvY2Vzc29yX2lkKCksIG1zcl92YWwsCisJCShuYmUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7CisKKwlpZiAoIW5iZSkKKwkJKihpbnQgKilyZXQgPSAwOworfQorCisvKiBjaGVjayBNQ0dfQ1RMIG9uIGFsbCB0aGUgY3B1cyBvbiB0aGlzIG5vZGUgKi8KK3N0YXRpYyBpbnQgYW1kNjRfbWNnX2N0bF9lbmFibGVkX29uX2NwdXMoY29uc3QgY3B1bWFza190ICptYXNrKQoreworCWludCByZXQgPSAxOworCXByZWVtcHRfZGlzYWJsZSgpOworCXNtcF9jYWxsX2Z1bmN0aW9uX21hbnkobWFzaywgY2hlY2tfbWNnX2N0bCwgJnJldCwgMSk7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBFREFDIHJlcXVpcmVzIHRoYXQgdGhlIEJJT1MgaGF2ZSBFQ0MgZW5hYmxlZCBiZWZvcmUgdGFraW5nIG92ZXIgdGhlCisgKiBwcm9jZXNzaW5nIG9mIEVDQyBlcnJvcnMuIFRoaXMgaXMgYmVjYXVzZSB0aGUgQklPUyBjYW4gcHJvcGVybHkgaW5pdGlhbGl6ZQorICogdGhlIG1lbW9yeSBzeXN0ZW0gY29tcGxldGVseS4gQSBjb21tYW5kIGxpbmUgb3B0aW9uIGFsbG93cyB0byBmb3JjZS1lbmFibGUKKyAqIGhhcmR3YXJlIEVDQyBsYXRlciBpbiBhbWQ2NF9lbmFibGVfZWNjX2Vycm9yX3JlcG9ydGluZygpLgorICovCitzdGF0aWMgaW50IGFtZDY0X2NoZWNrX2VjY19lbmFibGVkKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCkKK3sKKwl1MzIgdmFsdWU7CisJaW50IGVyciA9IDAsIHJldCA9IDA7CisJdTggZWNjX2VuYWJsZWQgPSAwOworCisJZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsIEs4X05CQ0ZHLCAmdmFsdWUpOworCWlmIChlcnIpCisJCWRlYnVnZjAoIlJlYWRpbmcgSzhfTkJDVEwgZmFpbGVkXG4iKTsKKworCWVjY19lbmFibGVkID0gISEodmFsdWUgJiBLOF9OQkNGR19FQ0NfRU5BQkxFKTsKKworCXJldCA9IGFtZDY0X21jZ19jdGxfZW5hYmxlZF9vbl9jcHVzKGNwdW1hc2tfb2Zfbm9kZShwdnQtPm1jX25vZGVfaWQpKTsKKworCWRlYnVnZjAoIks4X05CQ0ZHPTB4JXgsICBEUkFNIEVDQyBpcyAlc1xuIiwgdmFsdWUsCisJCQkodmFsdWUgJiBLOF9OQkNGR19FQ0NfRU5BQkxFID8gImVuYWJsZWQiIDogImRpc2FibGVkIikpOworCisJaWYgKCFlY2NfZW5hYmxlZCB8fCAhcmV0KSB7CisJCWlmICghZWNjX2VuYWJsZWQpIHsKKwkJCWFtZDY0X3ByaW50ayhLRVJOX1dBUk5JTkcsICJUaGlzIG5vZGUgcmVwb3J0cyB0aGF0ICIKKwkJCQkJCSAgICJNZW1vcnkgRUNDIGlzIGN1cnJlbnRseSAiCisJCQkJCQkgICAiZGlzYWJsZWQuXG4iKTsKKworCQkJYW1kNjRfcHJpbnRrKEtFUk5fV0FSTklORywgImJpdCAweCVseCBpbiByZWdpc3RlciAiCisJCQkJIkYzeCV4IG9mIHRoZSBNSVNDX0NPTlRST0wgZGV2aWNlICglcykgIgorCQkJCSJzaG91bGQgYmUgZW5hYmxlZFxuIiwgSzhfTkJDRkdfRUNDX0VOQUJMRSwKKwkJCQlLOF9OQkNGRywgcGNpX25hbWUocHZ0LT5taXNjX2YzX2N0bCkpOworCQl9CisJCWlmICghcmV0KSB7CisJCQlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLCAiYml0IDB4JTAxNmx4IGluIE1TUiAweCUwOHggIgorCQkJCQkib2Ygbm9kZSAlZCBzaG91bGQgYmUgZW5hYmxlZFxuIiwKKwkJCQkJSzhfTVNSX01DR0NUTF9OQkUsIE1TUl9JQTMyX01DR19DVEwsCisJCQkJCXB2dC0+bWNfbm9kZV9pZCk7CisJCX0KKwkJaWYgKCFlY2NfZW5hYmxlX292ZXJyaWRlKSB7CisJCQlhbWQ2NF9wcmludGsoS0VSTl9XQVJOSU5HLCAiV0FSTklORzogRUNDIGlzIE5PVCAiCisJCQkJImN1cnJlbnRseSBlbmFibGVkIGJ5IHRoZSBCSU9TLiBNb2R1bGUgIgorCQkJCSJ3aWxsIE5PVCBiZSBsb2FkZWQuXG4iCisJCQkJIiAgICBFaXRoZXIgRW5hYmxlIEVDQyBpbiB0aGUgQklPUywgIgorCQkJCSJvciB1c2UgdGhlICdlY2NfZW5hYmxlX292ZXJyaWRlJyAiCisJCQkJInBhcmFtZXRlci5cbiIKKwkJCQkiICAgIE1pZ2h0IGJlIGEgQklPUyBidWcsIGlmIEJJT1Mgc2F5cyAiCisJCQkJIkVDQyBpcyBlbmFibGVkXG4iCisJCQkJIiAgICBVc2Ugb2YgdGhlIG92ZXJyaWRlIGNhbiBjYXVzZSAiCisJCQkJInVua25vd24gc2lkZSBlZmZlY3RzLlxuIik7CisJCQlyZXQgPSAtRU5PREVWOworCQl9CisJfSBlbHNlIHsKKwkJYW1kNjRfcHJpbnRrKEtFUk5fSU5GTywKKwkJCSJFQ0MgaXMgZW5hYmxlZCBieSBCSU9TLCBQcm9jZWVkaW5nICIKKwkJCSJ3aXRoIEVEQUMgbW9kdWxlIGluaXRpYWxpemF0aW9uXG4iKTsKKworCQkvKiBDTEVBUiB0aGUgb3ZlcnJpZGUsIHNpbmNlIEJJT1MgY29udHJvbGxlZCBpdCAqLworCQllY2NfZW5hYmxlX292ZXJyaWRlID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgbWNpZGV2X3N5c2ZzX2F0dHJpYnV0ZSBzeXNmc19hdHRyc1tBUlJBWV9TSVpFKGFtZDY0X2RiZ19hdHRycykgKworCQkJCQkgIEFSUkFZX1NJWkUoYW1kNjRfaW5qX2F0dHJzKSArCisJCQkJCSAgMV07CisKK3N0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlIHRlcm1pbmF0b3IgPSB7IC5hdHRyID0geyAubmFtZSA9IE5VTEwgfSB9OworCitzdGF0aWMgdm9pZCBhbWQ2NF9zZXRfbWNfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCit7CisJdW5zaWduZWQgaW50IGkgPSAwLCBqID0gMDsKKworCWZvciAoOyBpIDwgQVJSQVlfU0laRShhbWQ2NF9kYmdfYXR0cnMpOyBpKyspCisJCXN5c2ZzX2F0dHJzW2ldID0gYW1kNjRfZGJnX2F0dHJzW2ldOworCisJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYW1kNjRfaW5qX2F0dHJzKTsgaisrLCBpKyspCisJCXN5c2ZzX2F0dHJzW2ldID0gYW1kNjRfaW5qX2F0dHJzW2pdOworCisJc3lzZnNfYXR0cnNbaV0gPSB0ZXJtaW5hdG9yOworCisJbWNpLT5tY19kcml2ZXJfc3lzZnNfYXR0cmlidXRlcyA9IHN5c2ZzX2F0dHJzOworfQorCitzdGF0aWMgdm9pZCBhbWQ2NF9zZXR1cF9tY2lfbWlzY19hdHRyaWJ1dGVzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJbWNpLT5tdHlwZV9jYXAJCT0gTUVNX0ZMQUdfRERSMiB8IE1FTV9GTEFHX1JERFIyOworCW1jaS0+ZWRhY19jdGxfY2FwCT0gRURBQ19GTEFHX05PTkU7CisJbWNpLT5lZGFjX2NhcAkJPSBFREFDX0ZMQUdfTk9ORTsKKworCWlmIChwdnQtPm5iY2FwICYgSzhfTkJDQVBfU0VDREVEKQorCQltY2ktPmVkYWNfY3RsX2NhcCB8PSBFREFDX0ZMQUdfU0VDREVEOworCisJaWYgKHB2dC0+bmJjYXAgJiBLOF9OQkNBUF9DSElQS0lMTCkKKwkJbWNpLT5lZGFjX2N0bF9jYXAgfD0gRURBQ19GTEFHX1M0RUNENEVEOworCisJbWNpLT5lZGFjX2NhcAkJPSBhbWQ2NF9kZXRlcm1pbmVfZWRhY19jYXAocHZ0KTsKKwltY2ktPm1vZF9uYW1lCQk9IEVEQUNfTU9EX1NUUjsKKwltY2ktPm1vZF92ZXIJCT0gRURBQ19BTUQ2NF9WRVJTSU9OOworCW1jaS0+Y3RsX25hbWUJCT0gZ2V0X2FtZF9mYW1pbHlfbmFtZShwdnQtPm1jX3R5cGVfaW5kZXgpOworCW1jaS0+ZGV2X25hbWUJCT0gcGNpX25hbWUocHZ0LT5kcmFtX2YyX2N0bCk7CisJbWNpLT5jdGxfcGFnZV90b19waHlzCT0gTlVMTDsKKworCS8qIElNUE9SVEFOVDogU2V0IHRoZSBwb2xsaW5nICdjaGVjaycgZnVuY3Rpb24gaW4gdGhpcyBtb2R1bGUgKi8KKwltY2ktPmVkYWNfY2hlY2sJCT0gYW1kNjRfY2hlY2s7CisKKwkvKiBtZW1vcnkgc2NydWJiZXIgaW50ZXJmYWNlICovCisJbWNpLT5zZXRfc2RyYW1fc2NydWJfcmF0ZSA9IGFtZDY0X3NldF9zY3J1Yl9yYXRlOworCW1jaS0+Z2V0X3NkcmFtX3NjcnViX3JhdGUgPSBhbWQ2NF9nZXRfc2NydWJfcmF0ZTsKK30KKworLyoKKyAqIEluaXQgc3R1ZmYgZm9yIHRoaXMgRFJBTSBDb250cm9sbGVyIGRldmljZS4KKyAqCisgKiBEdWUgdG8gYSBoYXJkd2FyZSBmZWF0dXJlIG9uIEZhbTEwaCBDUFVzLCB0aGUgRW5hYmxlIEV4dGVuZGVkIENvbmZpZ3VyYXRpb24KKyAqIFNwYWNlIGZlYXR1cmUgTVVTVCBiZSBlbmFibGVkIG9uIEFMTCBQcm9jZXNzb3JzIHByaW9yIHRvIGFjdHVhbGx5IHJlYWRpbmcKKyAqIGZyb20gdGhlIEVDUyByZWdpc3RlcnMuIFNpbmNlIHRoZSBsb2FkaW5nIG9mIHRoZSBtb2R1bGUgY2FuIG9jY3VyIG9uIGFueQorICogJ2NvcmUnLCBhbmQgY29yZXMgZG9uJ3QgJ3NlZScgYWxsIHRoZSBvdGhlciBwcm9jZXNzb3JzIEVDUyBkYXRhIHdoZW4gdGhlCisgKiBvdGhlcnMgYXJlIE5PVCBlbmFibGVkLiBPdXIgc29sdXRpb24gaXMgdG8gZmlyc3QgZW5hYmxlIEVDUyBhY2Nlc3MgaW4gdGhpcworICogcm91dGluZSBvbiBhbGwgcHJvY2Vzc29ycywgZ2F0aGVyIHNvbWUgZGF0YSBpbiBhIGFtZDY0X3B2dCBzdHJ1Y3R1cmUgYW5kCisgKiBsYXRlciBjb21lIGJhY2sgaW4gYSBmaW5pc2gtc2V0dXAgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGF0IGZpbmFsCisgKiBpbml0aWFsaXphdGlvbi4gU2VlIGFsc28gYW1kNjRfaW5pdF8ybmRfc3RhZ2UoKSBmb3IgdGhhdC4KKyAqLworc3RhdGljIGludCBhbWQ2NF9wcm9iZV9vbmVfaW5zdGFuY2Uoc3RydWN0IHBjaV9kZXYgKmRyYW1fZjJfY3RsLAorCQkJCSAgICBpbnQgbWNfdHlwZV9pbmRleCkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBOVUxMOworCWludCBlcnIgPSAwLCByZXQ7CisKKwlyZXQgPSAtRU5PTUVNOworCXB2dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbWQ2NF9wdnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB2dCkKKwkJZ290byBlcnJfZXhpdDsKKworCXB2dC0+bWNfbm9kZV9pZCA9IGdldF9tY19ub2RlX2lkX2Zyb21fcGRldihkcmFtX2YyX2N0bCk7CisKKwlwdnQtPmRyYW1fZjJfY3RsCT0gZHJhbV9mMl9jdGw7CisJcHZ0LT5leHRfbW9kZWwJCT0gYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj4gNDsKKwlwdnQtPm1jX3R5cGVfaW5kZXgJPSBtY190eXBlX2luZGV4OworCXB2dC0+b3BzCQk9IGZhbWlseV9vcHMobWNfdHlwZV9pbmRleCk7CisJcHZ0LT5vbGRfbWNnY3RsCQk9IDA7CisKKwkvKgorCSAqIFdlIGhhdmUgdGhlIGRyYW1fZjJfY3RsIGRldmljZSBhcyBhbiBhcmd1bWVudCwgbm93IGdvIHJlc2VydmUgaXRzCisJICogc2libGluZyBkZXZpY2VzIGZyb20gdGhlIFBDSSBzeXN0ZW0uCisJICovCisJcmV0ID0gLUVOT0RFVjsKKwllcnIgPSBhbWQ2NF9yZXNlcnZlX21jX3NpYmxpbmdfZGV2aWNlcyhwdnQsIG1jX3R5cGVfaW5kZXgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2ZyZWU7CisKKwlyZXQgPSAtRUlOVkFMOworCWVyciA9IGFtZDY0X2NoZWNrX2VjY19lbmFibGVkKHB2dCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcHV0OworCisJLyoKKwkgKiBLZXkgb3BlcmF0aW9uIGhlcmU6IHNldHVwIG9mIEhXIHByaW9yIHRvIHBlcmZvcm1pbmcgb3BzIG9uIGl0LiBTb21lCisJICogc2V0dXAgaXMgcmVxdWlyZWQgdG8gYWNjZXNzIEVDUyBkYXRhLiBBZnRlciB0aGlzIGlzIHBlcmZvcm1lZCwgdGhlCisJICogJ3RlYXJkb3duJyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB1cG9uIGVycm9yIGFuZCBub3JtYWwgZXhpdCBwYXRocy4KKwkgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPj0gMHgxMCkKKwkJYW1kNjRfc2V0dXAocHZ0KTsKKworCS8qCisJICogU2F2ZSB0aGUgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBkYXRhIGZvciB1c2UgaW4gMm5kIGluaXRpYWxpemF0aW9uCisJICogc3RhZ2UKKwkgKi8KKwlwdnRfbG9va3VwW3B2dC0+bWNfbm9kZV9pZF0gPSBwdnQ7CisKKwlyZXR1cm4gMDsKKworZXJyX3B1dDoKKwlhbWQ2NF9mcmVlX21jX3NpYmxpbmdfZGV2aWNlcyhwdnQpOworCitlcnJfZnJlZToKKwlrZnJlZShwdnQpOworCitlcnJfZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBpcyB0aGUgZmluaXNoaW5nIHN0YWdlIG9mIHRoZSBpbml0IGNvZGUuIE5lZWRzIHRvIGJlIHBlcmZvcm1lZCBhZnRlciBhbGwKKyAqIE1DcycgaGFyZHdhcmUgaGF2ZSBiZWVuIHByZXBwZWQgZm9yIGFjY2Vzc2luZyBleHRlbmRlZCBjb25maWcgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgYW1kNjRfaW5pdF8ybmRfc3RhZ2Uoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KQoreworCWludCBub2RlX2lkID0gcHZ0LT5tY19ub2RlX2lkOworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlpbnQgcmV0LCBlcnIgPSAwOworCisJYW1kNjRfcmVhZF9tY19yZWdpc3RlcnMocHZ0KTsKKworCXJldCA9IC1FTk9ERVY7CisJaWYgKHB2dC0+b3BzLT5wcm9iZV92YWxpZF9oYXJkd2FyZSkgeworCQllcnIgPSBwdnQtPm9wcy0+cHJvYmVfdmFsaWRfaGFyZHdhcmUocHZ0KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX2V4aXQ7CisJfQorCisJLyoKKwkgKiBXZSBuZWVkIHRvIGRldGVybWluZSBob3cgbWFueSBtZW1vcnkgY2hhbm5lbHMgdGhlcmUgYXJlLiBUaGVuIHVzZQorCSAqIHRoYXQgaW5mb3JtYXRpb24gZm9yIGNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIHRoZSBkeW5hbWljIGluc3RhbmNlCisJICogdGFibGVzIGluIHRoZSAnbWNpJyBzdHJ1Y3R1cmUKKwkgKi8KKwlwdnQtPmNoYW5uZWxfY291bnQgPSBwdnQtPm9wcy0+ZWFybHlfY2hhbm5lbF9jb3VudChwdnQpOworCWlmIChwdnQtPmNoYW5uZWxfY291bnQgPCAwKQorCQlnb3RvIGVycl9leGl0OworCisJcmV0ID0gLUVOT01FTTsKKwltY2kgPSBlZGFjX21jX2FsbG9jKDAsIENISVBTRUxFQ1RfQ09VTlQsIHB2dC0+Y2hhbm5lbF9jb3VudCwgbm9kZV9pZCk7CisJaWYgKCFtY2kpCisJCWdvdG8gZXJyX2V4aXQ7CisKKwltY2ktPnB2dF9pbmZvID0gcHZ0OworCisJbWNpLT5kZXYgPSAmcHZ0LT5kcmFtX2YyX2N0bC0+ZGV2OworCWFtZDY0X3NldHVwX21jaV9taXNjX2F0dHJpYnV0ZXMobWNpKTsKKworCWlmIChhbWQ2NF9pbml0X2Nzcm93cyhtY2kpKQorCQltY2ktPmVkYWNfY2FwID0gRURBQ19GTEFHX05PTkU7CisKKwlhbWQ2NF9lbmFibGVfZWNjX2Vycm9yX3JlcG9ydGluZyhtY2kpOworCWFtZDY0X3NldF9tY19zeXNmc19hdHRyaWJ1dGVzKG1jaSk7CisKKwlyZXQgPSAtRU5PREVWOworCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpKSB7CisJCWRlYnVnZjEoImZhaWxlZCBlZGFjX21jX2FkZF9tYygpXG4iKTsKKwkJZ290byBlcnJfYWRkX21jOworCX0KKworCW1jaV9sb29rdXBbbm9kZV9pZF0gPSBtY2k7CisJcHZ0X2xvb2t1cFtub2RlX2lkXSA9IE5VTEw7CisJcmV0dXJuIDA7CisKK2Vycl9hZGRfbWM6CisJZWRhY19tY19mcmVlKG1jaSk7CisKK2Vycl9leGl0OgorCWRlYnVnZjAoImZhaWx1cmUgdG8gaW5pdCAybmQgc3RhZ2U6IHJldD0lZFxuIiwgcmV0KTsKKworCWFtZDY0X3Jlc3RvcmVfZWNjX2Vycm9yX3JlcG9ydGluZyhwdnQpOworCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID4gMHhmKQorCQlhbWQ2NF90ZWFyZG93bihwdnQpOworCisJYW1kNjRfZnJlZV9tY19zaWJsaW5nX2RldmljZXMocHZ0KTsKKworCWtmcmVlKHB2dF9sb29rdXBbcHZ0LT5tY19ub2RlX2lkXSk7CisJcHZ0X2xvb2t1cFtub2RlX2lkXSA9IE5VTEw7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFtZDY0X2luaXRfb25lX2luc3RhbmNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqbWNfdHlwZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRlYnVnZjAoIihNQyBub2RlPSVkLG1jX3R5cGU9JyVzJylcbiIsCisJCWdldF9tY19ub2RlX2lkX2Zyb21fcGRldihwZGV2KSwKKwkJZ2V0X2FtZF9mYW1pbHlfbmFtZShtY190eXBlLT5kcml2ZXJfZGF0YSkpOworCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCA8IDApCisJCXJldCA9IC1FSU87CisJZWxzZQorCQlyZXQgPSBhbWQ2NF9wcm9iZV9vbmVfaW5zdGFuY2UocGRldiwgbWNfdHlwZS0+ZHJpdmVyX2RhdGEpOworCisJaWYgKHJldCA8IDApCisJCWRlYnVnZjAoInJldD0lZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhbWQ2NF9yZW1vdmVfb25lX2luc3RhbmNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaTsKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQ7CisKKwkvKiBSZW1vdmUgZnJvbSBFREFDIENPUkUgdHJhY2tpbmcgbGlzdCAqLworCW1jaSA9IGVkYWNfbWNfZGVsX21jKCZwZGV2LT5kZXYpOworCWlmICghbWNpKQorCQlyZXR1cm47CisKKwlwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJYW1kNjRfcmVzdG9yZV9lY2NfZXJyb3JfcmVwb3J0aW5nKHB2dCk7CisKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPiAweGYpCisJCWFtZDY0X3RlYXJkb3duKHB2dCk7CisKKwlhbWQ2NF9mcmVlX21jX3NpYmxpbmdfZGV2aWNlcyhwdnQpOworCisJa2ZyZWUocHZ0KTsKKwltY2ktPnB2dF9pbmZvID0gTlVMTDsKKworCW1jaV9sb29rdXBbcHZ0LT5tY19ub2RlX2lkXSA9IE5VTEw7CisKKwkvKiBGcmVlIHRoZSBFREFDIENPUkUgcmVzb3VyY2VzICovCisJZWRhY19tY19mcmVlKG1jaSk7Cit9CisKKy8qCisgKiBUaGlzIHRhYmxlIGlzIHBhcnQgb2YgdGhlIGludGVyZmFjZSBmb3IgbG9hZGluZyBkcml2ZXJzIGZvciBQQ0kgZGV2aWNlcy4gVGhlCisgKiBQQ0kgY29yZSBpZGVudGlmaWVzIHdoYXQgZGV2aWNlcyBhcmUgb24gYSBzeXN0ZW0gZHVyaW5nIGJvb3QsIGFuZCB0aGVuCisgKiBpbnF1aXJ5IHRoaXMgdGFibGUgdG8gc2VlIGlmIHRoaXMgZHJpdmVyIGlzIGZvciBhIGdpdmVuIGRldmljZSBmb3VuZC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFtZDY0X3BjaV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQU1ELAorCQkuZGV2aWNlCQk9IFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX01FTUNUTCwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuY2xhc3MJCT0gMCwKKwkJLmNsYXNzX21hc2sJPSAwLAorCQkuZHJpdmVyX2RhdGEJPSBLOF9DUFVTCisJfSwKKwl7CisJCS52ZW5kb3IJCT0gUENJX1ZFTkRPUl9JRF9BTUQsCisJCS5kZXZpY2UJCT0gUENJX0RFVklDRV9JRF9BTURfMTBIX05CX0RSQU0sCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwkJLmNsYXNzCQk9IDAsCisJCS5jbGFzc19tYXNrCT0gMCwKKwkJLmRyaXZlcl9kYXRhCT0gRjEwX0NQVVMKKwl9LAorCXsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0FNRCwKKwkJLmRldmljZQkJPSBQQ0lfREVWSUNFX0lEX0FNRF8xMUhfTkJfRFJBTSwKKwkJLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UJPSBQQ0lfQU5ZX0lELAorCQkuY2xhc3MJCT0gMCwKKwkJLmNsYXNzX21hc2sJPSAwLAorCQkuZHJpdmVyX2RhdGEJPSBGMTFfQ1BVUworCX0sCisJezAsIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYW1kNjRfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGFtZDY0X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gRURBQ19NT0RfU1RSLAorCS5wcm9iZQkJPSBhbWQ2NF9pbml0X29uZV9pbnN0YW5jZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGFtZDY0X3JlbW92ZV9vbmVfaW5zdGFuY2UpLAorCS5pZF90YWJsZQk9IGFtZDY0X3BjaV90YWJsZSwKK307CisKK3N0YXRpYyB2b2lkIGFtZDY0X3NldHVwX3BjaV9kZXZpY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2k7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0OworCisJaWYgKGFtZDY0X2N0bF9wY2kpCisJCXJldHVybjsKKworCW1jaSA9IG1jaV9sb29rdXBbMF07CisJaWYgKG1jaSkgeworCisJCXB2dCA9IG1jaS0+cHZ0X2luZm87CisJCWFtZDY0X2N0bF9wY2kgPQorCQkJZWRhY19wY2lfY3JlYXRlX2dlbmVyaWNfY3RsKCZwdnQtPmRyYW1fZjJfY3RsLT5kZXYsCisJCQkJCQkgICAgRURBQ19NT0RfU1RSKTsKKworCQlpZiAoIWFtZDY0X2N0bF9wY2kpIHsKKwkJCXByX3dhcm5pbmcoIiVzKCk6IFVuYWJsZSB0byBjcmVhdGUgUENJIGNvbnRyb2xcbiIsCisJCQkJICAgX19mdW5jX18pOworCisJCQlwcl93YXJuaW5nKCIlcygpOiBQQ0kgZXJyb3IgcmVwb3J0IHZpYSBFREFDIG5vdCBzZXRcbiIsCisJCQkJICAgX19mdW5jX18pOworCQkJfQorCX0KK30KKworc3RhdGljIGludCBfX2luaXQgYW1kNjRfZWRhY19pbml0KHZvaWQpCit7CisJaW50IG5iLCBlcnIgPSAtRU5PREVWOworCisJZWRhY19wcmludGsoS0VSTl9JTkZPLCBFREFDX01PRF9TVFIsIEVEQUNfQU1ENjRfVkVSU0lPTiAiXG4iKTsKKworCW9wc3RhdGVfaW5pdCgpOworCisJaWYgKGNhY2hlX2s4X25vcnRoYnJpZGdlcygpIDwgMCkKKwkJZ290byBlcnJfZXhpdDsKKworCWVyciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFtZDY0X3BjaV9kcml2ZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHRoZSBhcnJheSAncHZ0X2xvb2t1cFtdJyBjb250YWlucyBwb2ludGVycyB0byBhbGxvYydkCisJICogYW1kNjRfcHZ0IHN0cnVjdHMuIFRoZXNlIHdpbGwgYmUgdXNlZCBpbiB0aGUgMm5kIHN0YWdlIGluaXQgZnVuY3Rpb24KKwkgKiB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgdGhlIE1DIGluc3RhbmNlcy4KKwkgKi8KKwlmb3IgKG5iID0gMDsgbmIgPCBudW1fazhfbm9ydGhicmlkZ2VzOyBuYisrKSB7CisJCWlmICghcHZ0X2xvb2t1cFtuYl0pCisJCQljb250aW51ZTsKKworCQllcnIgPSBhbWQ2NF9pbml0XzJuZF9zdGFnZShwdnRfbG9va3VwW25iXSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9leGl0OworCX0KKworCWFtZDY0X3NldHVwX3BjaV9kZXZpY2UoKTsKKworCXJldHVybiAwOworCitlcnJfZXhpdDoKKwlkZWJ1Z2YwKCInZmluaXNoX3NldHVwJyBzdGFnZSBmYWlsZWRcbiIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYW1kNjRfcGNpX2RyaXZlcik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYW1kNjRfZWRhY19leGl0KHZvaWQpCit7CisJaWYgKGFtZDY0X2N0bF9wY2kpCisJCWVkYWNfcGNpX3JlbGVhc2VfZ2VuZXJpY19jdGwoYW1kNjRfY3RsX3BjaSk7CisKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmFtZDY0X3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbWQ2NF9lZGFjX2luaXQpOworbW9kdWxlX2V4aXQoYW1kNjRfZWRhY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiU29mdHdhcmVCaXRNYWtlcjogRG91ZyBUaG9tcHNvbiwgIgorCQkiRGF2ZSBQZXRlcnNvbiwgVGhheW5lIEhhcmJhdWdoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1DIHN1cHBvcnQgZm9yIEFNRDY0IG1lbW9yeSBjb250cm9sbGVycyAtICIKKwkJRURBQ19BTUQ2NF9WRVJTSU9OKTsKKworbW9kdWxlX3BhcmFtKGVkYWNfb3Bfc3RhdGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGVkYWNfb3Bfc3RhdGUsICJFREFDIEVycm9yIFJlcG9ydGluZyBzdGF0ZTogMD1Qb2xsLDE9Tk1JIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTU5OTU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaApAQCAtMCwwICsxLDY0NCBAQAorLyoKKyAqIEFNRDY0IGNsYXNzIE1lbW9yeSBDb250cm9sbGVyIGtlcm5lbCBtb2R1bGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgU29mdHdhcmVCaXRNYWtlci4KKyAqIENvcHlyaWdodCAoYykgMjAwOSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKglPcmlnaW5hbGx5IFdyaXR0ZW4gYnkgVGhheW5lIEhhcmJhdWdoCisgKgorICogICAgICBDaGFuZ2VzIGJ5IERvdWdsYXMgIm5vcnNrIiBUaG9tcHNvbiAgPGRvdWd0aG9tcHNvbkB4bWlzc2lvbi5jb20+OgorICoJCS0gSzggQ1BVIFJldmlzaW9uIEQgYW5kIGdyZWF0ZXIgc3VwcG9ydAorICoKKyAqICAgICAgQ2hhbmdlcyBieSBEYXZlIFBldGVyc29uIDxkc3BAbGxubC5nb3Y+IDxkYXZlX3BldGVyc29uQHBvYm94LmNvbT46CisgKgkJLSBNb2R1bGUgbGFyZ2VseSByZXdyaXR0ZW4sIHdpdGggbmV3IChhbmQgaG9wZWZ1bGx5IGNvcnJlY3QpCisgKgkJY29kZSBmb3IgZGVhbGluZyB3aXRoIG5vZGUgYW5kIGNoaXAgc2VsZWN0IGludGVybGVhdmluZywKKyAqCQl2YXJpb3VzIGNvZGUgY2xlYW51cCwgYW5kIGJ1ZyBmaXhlcworICoJCS0gQWRkZWQgc3VwcG9ydCBmb3IgbWVtb3J5IGhvaXN0aW5nIHVzaW5nIERSQU0gaG9sZSBhZGRyZXNzCisgKgkJcmVnaXN0ZXIKKyAqCisgKglDaGFuZ2VzIGJ5IERvdWdsYXMgIm5vcnNrIiBUaG9tcHNvbiA8ZG91Z3Rob21wc29uQHhtaXNzaW9uLmNvbT46CisgKgkJLUs4IFJldiAoMTIwNykgcmV2aXNpb24gc3VwcG9ydCBhZGRlZCwgcmVxdWlyZWQgUmV2aXNpb24KKyAqCQlzcGVjaWZpYyBtaW5pLWRyaXZlciBjb2RlIHRvIHN1cHBvcnQgUmV2IEYgYXMgd2VsbCBhcworICoJCXByaW9yIHJldmlzaW9ucworICoKKyAqCUNoYW5nZXMgYnkgRG91Z2xhcyAibm9yc2siIFRob21wc29uIDxkb3VndGhvbXBzb25AeG1pc3Npb24uY29tPjoKKyAqCQktRmFtaWx5IDEwaCByZXZpc2lvbiBzdXBwb3J0IGFkZGVkLiBOZXcgUENJIERldmljZSBJRHMsCisgKgkJaW5kaWNhdGluZyBuZXcgY2hhbmdlcy4gQWN0dWFsIHJlZ2lzdGVycyBtb2RpZmllZAorICoJCXdlcmUgc2xpZ2h0LCBsZXNzIHRoYW4gdGhlIFJldiBFIHRvIFJldiBGIHRyYW5zaXRpb24KKyAqCQlidXQgY2hhbmdpbmcgdGhlIFBDSSBEZXZpY2UgSUQgd2FzIHRoZSBwcm9wZXIgdGhpbmcgdG8KKyAqCQlkbywgYXMgaXQgcHJvdmlkZXMgZm9yIGFsbW9zdCBhdXRvbWFjdGljIGZhbWlseQorICoJCWRldGVjdGlvbi4gVGhlIG1vZHMgdG8gUmV2IEYgcmVxdWlyZWQgbW9yZSBmYW1pbHkKKyAqCQlpbmZvcm1hdGlvbiBkZXRlY3Rpb24uCisgKgorICoJQ2hhbmdlcy9GaXhlcyBieSBCb3Jpc2xhdiBQZXRrb3YgPGJvcmlzbGF2LnBldGtvdkBhbWQuY29tPjoKKyAqCQktIG1pc2MgZml4ZXMgYW5kIGNvZGUgY2xlYW51cHMKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGRvY3VtZW50cworICogKGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cuYW1kLmNvbS8pOgorICoKKyAqCVRpdGxlOglCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgZm9yIEFNRCBBdGhsb24gNjQgYW5kIEFNRAorICoJCU9wdGVyb24gUHJvY2Vzc29ycworICoJQU1EIHB1YmxpY2F0aW9uICM6IDI2MDk0CisgKmAJUmV2aXNpb246IDMuMjYKKyAqCisgKglUaXRsZToJQklPUyBhbmQgS2VybmVsIERldmVsb3BlcidzIEd1aWRlIGZvciBBTUQgTlBUIEZhbWlseSAwRmgKKyAqCQlQcm9jZXNzb3JzCisgKglBTUQgcHVibGljYXRpb24gIzogMzI1NTkKKyAqCVJldmlzaW9uOiAzLjAwCisgKglJc3N1ZSBEYXRlOiBNYXkgMjAwNgorICoKKyAqCVRpdGxlOglCSU9TIGFuZCBLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgKEJLREcpIEZvciBBTUQgRmFtaWx5IDEwaAorICoJCVByb2Nlc3NvcnMKKyAqCUFNRCBwdWJsaWNhdGlvbiAjOiAzMTExNgorICoJUmV2aXNpb246IDMuMDAKKyAqCUlzc3VlIERhdGU6IFNlcHRlbWJlciAwNywgMjAwNworICoKKyAqIFNlY3Rpb25zIGluIHRoZSBmaXJzdCAyIGRvY3VtZW50cyBhcmUgbm8gbG9uZ2VyIGluIHN5bmMgd2l0aCBlYWNoIG90aGVyLgorICogVGhlIEZhbWlseSAxMGggQktERyB3YXMgdG90YWxseSByZS13cml0dGVuIGZyb20gc2NyYXRjaCB3aXRoIGEgbmV3CisgKiBwcmVzZW50YXRpb24gbW9kZWwuCisgKiBUaGVyZWZvcmUsIGNvbW1lbnRzIHRoYXQgcmVmZXIgdG8gYSBEb2N1bWVudCBzZWN0aW9uIG1pZ2h0IGJlIG9mZi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9lZGFjLmg+CisjaW5jbHVkZSA8YXNtL21zci5oPgorI2luY2x1ZGUgImVkYWNfY29yZS5oIgorCisjZGVmaW5lIGFtZDY0X3ByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pIFwKKwllZGFjX3ByaW50ayhsZXZlbCwgImFtZDY0IiwgZm10LCAjI2FyZykKKworI2RlZmluZSBhbWQ2NF9tY19wcmludGsobWNpLCBsZXZlbCwgZm10LCBhcmcuLi4pIFwKKwllZGFjX21jX2NoaXBzZXRfcHJpbnRrKG1jaSwgbGV2ZWwsICJhbWQ2NCIsIGZtdCwgIyNhcmcpCisKKy8qCisgKiBUaHJvdWdob3V0IHRoZSBjb21tZW50cyBpbiB0aGlzIGNvZGUsIHRoZSBmb2xsb3dpbmcgdGVybXMgYXJlIHVzZWQ6CisgKgorICoJU3lzQWRkciwgRHJhbUFkZHIsIGFuZCBJbnB1dEFkZHIKKyAqCisgKiAgVGhlc2UgdGVybXMgY29tZSBkaXJlY3RseSBmcm9tIHRoZSBhbWQ2NCBkb2N1bWVudGF0aW9uCisgKiAoQU1EIHB1YmxpY2F0aW9uICMyNjA5NCkuICBUaGV5IGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKgorICogICAgIFN5c0FkZHI6CisgKiAgICAgICAgIFRoaXMgaXMgYSBwaHlzaWNhbCBhZGRyZXNzIGdlbmVyYXRlZCBieSBhIENQVSBjb3JlIG9yIGEgZGV2aWNlCisgKiAgICAgICAgIGRvaW5nIERNQS4gIElmIGdlbmVyYXRlZCBieSBhIENQVSBjb3JlLCBhIFN5c0FkZHIgaXMgdGhlIHJlc3VsdCBvZgorICogICAgICAgICBhIHZpcnR1YWwgdG8gcGh5c2ljYWwgYWRkcmVzcyB0cmFuc2xhdGlvbiBieSB0aGUgQ1BVIGNvcmUncyBhZGRyZXNzCisgKiAgICAgICAgIHRyYW5zbGF0aW9uIG1lY2hhbmlzbSAoTU1VKS4KKyAqCisgKiAgICAgRHJhbUFkZHI6CisgKiAgICAgICAgIEEgRHJhbUFkZHIgaXMgZGVyaXZlZCBmcm9tIGEgU3lzQWRkciBieSBzdWJ0cmFjdGluZyBhbiBvZmZzZXQgdGhhdAorICogICAgICAgICBkZXBlbmRzIG9uIHdoaWNoIG5vZGUgdGhlIFN5c0FkZHIgbWFwcyB0byBhbmQgd2hldGhlciB0aGUgU3lzQWRkcgorICogICAgICAgICBpcyB3aXRoaW4gYSByYW5nZSBhZmZlY3RlZCBieSBtZW1vcnkgaG9pc3RpbmcuICBUaGUgRFJBTSBCYXNlCisgKiAgICAgICAgIChzZWN0aW9uIDMuNC40LjEpIGFuZCBEUkFNIExpbWl0IChzZWN0aW9uIDMuNC40LjIpIHJlZ2lzdGVycworICogICAgICAgICBkZXRlcm1pbmUgd2hpY2ggbm9kZSBhIFN5c0FkZHIgbWFwcyB0by4KKyAqCisgKiAgICAgICAgIElmIHRoZSBEUkFNIEhvbGUgQWRkcmVzcyBSZWdpc3RlciAoREhBUikgaXMgZW5hYmxlZCBhbmQgdGhlIFN5c0FkZHIKKyAqICAgICAgICAgaXMgd2l0aGluIHRoZSByYW5nZSBvZiBhZGRyZXNzZXMgc3BlY2lmaWVkIGJ5IHRoaXMgcmVnaXN0ZXIsIHRoZW4KKyAqICAgICAgICAgYSB2YWx1ZSB4IGZyb20gdGhlIERIQVIgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBTeXNBZGRyIHRvIHByb2R1Y2UgYQorICogICAgICAgICBEcmFtQWRkci4gIEhlcmUsIHggcmVwcmVzZW50cyB0aGUgYmFzZSBhZGRyZXNzIGZvciB0aGUgbm9kZSB0aGF0CisgKiAgICAgICAgIHRoZSBTeXNBZGRyIG1hcHMgdG8gcGx1cyBhbiBvZmZzZXQgZHVlIHRvIG1lbW9yeSBob2lzdGluZy4gIFNlZQorICogICAgICAgICBzZWN0aW9uIDMuNC44IGFuZCB0aGUgY29tbWVudHMgaW4gYW1kNjRfZ2V0X2RyYW1faG9sZV9pbmZvKCkgYW5kCisgKiAgICAgICAgIHN5c19hZGRyX3RvX2RyYW1fYWRkcigpIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqICAgICAgICAgSWYgdGhlIFN5c0FkZHIgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBESEFSIHRoZW4gYSB2YWx1ZSB5IGlzCisgKiAgICAgICAgIHN1YnRyYWN0ZWQgZnJvbSB0aGUgU3lzQWRkciB0byBwcm9kdWNlIGEgRHJhbUFkZHIuICBIZXJlLCB5IGlzIHRoZQorICogICAgICAgICBiYXNlIGFkZHJlc3MgZm9yIHRoZSBub2RlIHRoYXQgdGhlIFN5c0FkZHIgbWFwcyB0by4gIFNlZSBzZWN0aW9uCisgKiAgICAgICAgIDMuNC40IGFuZCB0aGUgY29tbWVudHMgaW4gc3lzX2FkZHJfdG9fZHJhbV9hZGRyKCkgYmVsb3cgZm9yIG1vcmUKKyAqICAgICAgICAgaW5mb3JtYXRpb24uCisgKgorICogICAgIElucHV0QWRkcjoKKyAqICAgICAgICAgQSBEcmFtQWRkciBpcyB0cmFuc2xhdGVkIHRvIGFuIElucHV0QWRkciBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvIHRoZQorICogICAgICAgICBtZW1vcnkgY29udHJvbGxlciBmb3IgdGhlIG5vZGUgdGhhdCB0aGUgRHJhbUFkZHIgaXMgYXNzb2NpYXRlZAorICogICAgICAgICB3aXRoLiAgVGhlIG1lbW9yeSBjb250cm9sbGVyIHRoZW4gbWFwcyB0aGUgSW5wdXRBZGRyIHRvIGEgY3Nyb3cuCisgKiAgICAgICAgIElmIG5vZGUgaW50ZXJsZWF2aW5nIGlzIG5vdCBpbiB1c2UsIHRoZW4gdGhlIElucHV0QWRkciBoYXMgdGhlIHNhbWUKKyAqICAgICAgICAgdmFsdWUgYXMgdGhlIERyYW1BZGRyLiAgT3RoZXJ3aXNlLCB0aGUgSW5wdXRBZGRyIGlzIHByb2R1Y2VkIGJ5CisgKiAgICAgICAgIGRpc2NhcmRpbmcgdGhlIGJpdHMgdXNlZCBmb3Igbm9kZSBpbnRlcmxlYXZpbmcgZnJvbSB0aGUgRHJhbUFkZHIuCisgKiAgICAgICAgIFNlZSBzZWN0aW9uIDMuNC40IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqICAgICAgICAgVGhlIG1lbW9yeSBjb250cm9sbGVyIGZvciBhIGdpdmVuIG5vZGUgdXNlcyBpdHMgRFJBTSBDUyBCYXNlIGFuZAorICogICAgICAgICBEUkFNIENTIE1hc2sgcmVnaXN0ZXJzIHRvIG1hcCBhbiBJbnB1dEFkZHIgdG8gYSBjc3Jvdy4gIFNlZQorICogICAgICAgICBzZWN0aW9ucyAzLjUuNCBhbmQgMy41LjUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworI2RlZmluZSBFREFDX0FNRDY0X1ZFUlNJT04JCSIgVmVyOiAzLjIuMCAiIF9fREFURV9fCisjZGVmaW5lIEVEQUNfTU9EX1NUUgkJCSJhbWQ2NF9lZGFjIgorCisvKiBFeHRlbmRlZCBNb2RlbCBmcm9tIENQVUlELCBmb3IgQ1BVIFJldmlzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgT1BURVJPTl9DUFVfTEVfUkVWX0MJCTAKKyNkZWZpbmUgT1BURVJPTl9DUFVfUkVWX0QJCTEKKyNkZWZpbmUgT1BURVJPTl9DUFVfUkVWX0UJCTIKKworLyogTlBUIHByb2Nlc3NvcnMgaGF2ZSB0aGUgZm9sbG93aW5nIEV4dGVuZGVkIE1vZGVscyAqLworI2RlZmluZSBPUFRFUk9OX0NQVV9SRVZfRgkJNAorI2RlZmluZSBPUFRFUk9OX0NQVV9SRVZfRkEJCTUKKworLyogSGFyZHdhcmUgbGltaXQgb24gQ2hpcFNlbGVjdCByb3dzIHBlciBNQyBhbmQgcHJvY2Vzc29ycyBwZXIgc3lzdGVtICovCisjZGVmaW5lIENISVBTRUxFQ1RfQ09VTlQJCTgKKyNkZWZpbmUgRFJBTV9SRUdfQ09VTlQJCQk4CisKKworLyoKKyAqIFBDSS1kZWZpbmVkIGNvbmZpZ3VyYXRpb24gc3BhY2UgcmVnaXN0ZXJzCisgKi8KKworCisvKgorICogRnVuY3Rpb24gMSAtIEFkZHJlc3MgTWFwCisgKi8KKyNkZWZpbmUgSzhfRFJBTV9CQVNFX0xPVwkJMHg0MAorI2RlZmluZSBLOF9EUkFNX0xJTUlUX0xPVwkJMHg0NAorI2RlZmluZSBLOF9ESEFSCQkJCTB4ZjAKKworI2RlZmluZSBESEFSX1ZBTElECQkJQklUKDApCisjZGVmaW5lIEYxMF9EUkFNX01FTV9IT0lTVF9WQUxJRAlCSVQoMSkKKworI2RlZmluZSBESEFSX0JBU0VfTUFTSwkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgZGhhcl9iYXNlKGRoYXIpCQkJKGRoYXIgJiBESEFSX0JBU0VfTUFTSykKKworI2RlZmluZSBLOF9ESEFSX09GRlNFVF9NQVNLCQkweDAwMDBmZjAwCisjZGVmaW5lIGs4X2RoYXJfb2Zmc2V0KGRoYXIpCQkoKGRoYXIgJiBLOF9ESEFSX09GRlNFVF9NQVNLKSA8PCAxNikKKworI2RlZmluZSBGMTBfREhBUl9PRkZTRVRfTUFTSwkJMHgwMDAwZmY4MAorCQkJCQkvKiBOT1RFOiBFeHRyYSBtYXNrIGJpdCB2cyBLOCAqLworI2RlZmluZSBmMTBfZGhhcl9vZmZzZXQoZGhhcikJCSgoZGhhciAmIEYxMF9ESEFSX09GRlNFVF9NQVNLKSA8PCAxNikKKworCisvKiBGMTAgSGlnaCBCQVNFL0xJTUlUIHJlZ2lzdGVycyAqLworI2RlZmluZSBGMTBfRFJBTV9CQVNFX0hJR0gJCTB4MTQwCisjZGVmaW5lIEYxMF9EUkFNX0xJTUlUX0hJR0gJCTB4MTQ0CisKKworLyoKKyAqIEZ1bmN0aW9uIDIgLSBEUkFNIGNvbnRyb2xsZXIKKyAqLworI2RlZmluZSBLOF9EQ1NCMAkJCTB4NDAKKyNkZWZpbmUgRjEwX0RDU0IxCQkJMHgxNDAKKworI2RlZmluZSBLOF9EQ1NCX0NTX0VOQUJMRQkJQklUKDApCisjZGVmaW5lIEs4X0RDU0JfTlBUX1NQQVJFCQlCSVQoMSkKKyNkZWZpbmUgSzhfRENTQl9OUFRfVEVTVEZBSUwJCUJJVCgyKQorCisvKgorICogUkVWIEU6IHNlbGVjdCBbMzE6MjFdIGFuZCBbMTU6OV0gZnJvbSBEQ1NCIGFuZCB0aGUgc2hpZnQgYW1vdW50IHRvIGZvcm0KKyAqIHRoZSBhZGRyZXNzCisgKi8KKyNkZWZpbmUgUkVWX0VfRENTQl9CQVNFX0JJVFMJCSgweEZGRTBGRTAwVUxMKQorI2RlZmluZSBSRVZfRV9EQ1NfU0hJRlQJCQk0CisjZGVmaW5lIFJFVl9FX0RDU01fQ09VTlQJCTgKKworI2RlZmluZSBSRVZfRl9GMVhoX0RDU0JfQkFTRV9CSVRTCSgweDFGRjgzRkUwVUxMKQorI2RlZmluZSBSRVZfRl9GMVhoX0RDU19TSElGVAkJOAorCisvKgorICogUkVWIEYgYW5kIGxhdGVyOiBzZWxlY3RzIFsyODoxOV0gYW5kIFsxMzo1XSBmcm9tIERDU0IgYW5kIHRoZSBzaGlmdCBhbW91bnQKKyAqIHRvIGZvcm0gdGhlIGFkZHJlc3MKKyAqLworI2RlZmluZSBSRVZfRl9EQ1NCX0JBU0VfQklUUwkJKDB4MUZGODNGRTBVTEwpCisjZGVmaW5lIFJFVl9GX0RDU19TSElGVAkJCTgKKyNkZWZpbmUgUkVWX0ZfRENTTV9DT1VOVAkJNAorI2RlZmluZSBGMTBfRENTTV9DT1VOVAkJCTQKKyNkZWZpbmUgRjExX0RDU01fQ09VTlQJCQkyCisKKy8qIERSQU0gQ1MgTWFzayBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgSzhfRENTTTAJCQkweDYwCisjZGVmaW5lIEYxMF9EQ1NNMQkJCTB4MTYwCisKKy8qIFJFViBFOiBzZWxlY3QgWzI5OjIxXSBhbmQgWzE1OjldIGZyb20gRENTTSAqLworI2RlZmluZSBSRVZfRV9EQ1NNX01BU0tfQklUUwkJMHgzRkUwRkUwMAorCisvKiB1bnVzZWQgYml0cyBbMjQ6MjBdIGFuZCBbMTI6MF0gKi8KKyNkZWZpbmUgUkVWX0VfRENTX05PVFVTRURfQklUUwkJMHgwMUYwMUZGRgorCisvKiBSRVYgRiBhbmQgbGF0ZXI6IHNlbGVjdCBbMjg6MTldIGFuZCBbMTM6NV0gZnJvbSBEQ1NNICovCisjZGVmaW5lIFJFVl9GX0YxWGhfRENTTV9NQVNLX0JJVFMJMHgxRkY4M0ZFMAorCisvKiB1bnVzZWQgYml0cyBbMjY6MjJdIGFuZCBbMTI6MF0gKi8KKyNkZWZpbmUgUkVWX0ZfRjFYaF9EQ1NfTk9UVVNFRF9CSVRTCTB4MDdDMDFGRkYKKworI2RlZmluZSBEQkFNMAkJCQkweDgwCisjZGVmaW5lIERCQU0xCQkJCTB4MTgwCisKKy8qIEV4dHJhY3QgdGhlIERJTU0gJ3R5cGUnIG9uIHRoZSBpJ3RoIERJTU0gZnJvbSB0aGUgREJBTSByZWcgdmFsdWUgcGFzc2VkICovCisjZGVmaW5lIERCQU1fRElNTShpLCByZWcpCQkoKCgocmVnKSA+PiAoNCppKSkpICYgMHhGKQorCisjZGVmaW5lIERCQU1fTUFYX1ZBTFVFCQkJMTEKKworCisjZGVmaW5lIEYxMF9EQ0xSXzAJCQkweDkwCisjZGVmaW5lIEYxMF9EQ0xSXzEJCQkweDE5MAorI2RlZmluZSBSRVZFX1dJRFRIXzEyOAkJCUJJVCgxNikKKyNkZWZpbmUgRjEwX1dJRFRIXzEyOAkJCUJJVCgxMSkKKworCisjZGVmaW5lIEYxMF9EQ0hSXzAJCQkweDk0CisjZGVmaW5lIEYxMF9EQ0hSXzEJCQkweDE5NAorCisjZGVmaW5lIEYxMF9EQ0hSX0ZPVVJfUkFOS19ESU1NCQlCSVQoMTgpCisjZGVmaW5lIEYxMF9EQ0hSX0RkcjNNb2RlCQlCSVQoOCkKKyNkZWZpbmUgRjEwX0RDSFJfTWJsTW9kZQkJQklUKDYpCisKKworI2RlZmluZSBGMTBfRENUTF9TRUxfTE9XCQkweDExMAorCisjZGVmaW5lIGRjdF9zZWxfYmFzZWFkZHIocHZ0KSAgICBcCisJKChwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cpICYgMHhGRkZGRjgwMCkKKworI2RlZmluZSBkY3Rfc2VsX2ludGVybGVhdmVfYWRkcihwdnQpICAgIFwKKwkoKChwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cpID4+IDYpICYgMHgzKQorCitlbnVtIHsKKwlGMTBfRENUTF9TRUxfTE9XX0RjdFNlbEhpUm5nRW4JPSBCSVQoMCksCisJRjEwX0RDVExfU0VMX0xPV19EY3RTZWxJbnRMdkVuCT0gQklUKDIpLAorCUYxMF9EQ1RMX1NFTF9MT1dfRGN0R2FuZ0VuCT0gQklUKDQpLAorCUYxMF9EQ1RMX1NFTF9MT1dfRGN0RGF0SW50THYJPSBCSVQoNSksCisJRjEwX0RDVExfU0VMX0xPV19EcmFtRW5hYmxlCT0gQklUKDgpLAorCUYxMF9EQ1RMX1NFTF9MT1dfTWVtQ2xlYXJlZAk9IEJJVCgxMCksCit9OworCisjZGVmaW5lICAgIGRjdF9oaWdoX3JhbmdlX2VuYWJsZWQocHZ0KSAgICBcCisJKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdyAmIEYxMF9EQ1RMX1NFTF9MT1dfRGN0U2VsSGlSbmdFbikKKworI2RlZmluZSBkY3RfaW50ZXJsZWF2ZV9lbmFibGVkKHB2dCkJICAgXAorCShwdnQtPmRyYW1fY3RsX3NlbGVjdF9sb3cgJiBGMTBfRENUTF9TRUxfTE9XX0RjdFNlbEludEx2RW4pCisKKyNkZWZpbmUgZGN0X2dhbmdpbmdfZW5hYmxlZChwdnQpICAgICAgICBcCisJKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdyAmIEYxMF9EQ1RMX1NFTF9MT1dfRGN0R2FuZ0VuKQorCisjZGVmaW5lIGRjdF9kYXRhX2ludGx2X2VuYWJsZWQocHZ0KSAgICBcCisJKHB2dC0+ZHJhbV9jdGxfc2VsZWN0X2xvdyAmIEYxMF9EQ1RMX1NFTF9MT1dfRGN0RGF0SW50THYpCisKKyNkZWZpbmUgZGN0X2RyYW1fZW5hYmxlZChwdnQpICAgIFwKKwkocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ICYgRjEwX0RDVExfU0VMX0xPV19EcmFtRW5hYmxlKQorCisjZGVmaW5lIGRjdF9tZW1vcnlfY2xlYXJlZChwdnQpICAgIFwKKwkocHZ0LT5kcmFtX2N0bF9zZWxlY3RfbG93ICYgRjEwX0RDVExfU0VMX0xPV19NZW1DbGVhcmVkKQorCisKKyNkZWZpbmUgRjEwX0RDVExfU0VMX0hJR0gJCTB4MTE0CisKKworLyoKKyAqIEZ1bmN0aW9uIDMgLSBNaXNjIENvbnRyb2wKKyAqLworI2RlZmluZSBLOF9OQkNUTAkJCTB4NDAKKworLyogQ29ycmVjdGFibGUgRUNDIGVycm9yIHJlcG9ydGluZyBlbmFibGUgKi8KKyNkZWZpbmUgSzhfTkJDVExfQ0VDQ0VuCQkJQklUKDApCisKKy8qIFVuQ29ycmVjdGFibGUgRUNDIGVycm9yIHJlcG9ydGluZyBlbmFibGUgKi8KKyNkZWZpbmUgSzhfTkJDVExfVUVDQ0VuCQkJQklUKDEpCisKKyNkZWZpbmUgSzhfTkJDRkcJCQkweDQ0CisjZGVmaW5lIEs4X05CQ0ZHX0NISVBLSUxMCQlCSVQoMjMpCisjZGVmaW5lIEs4X05CQ0ZHX0VDQ19FTkFCTEUJCUJJVCgyMikKKworI2RlZmluZSBLOF9OQlNMCQkJCTB4NDgKKworCisjZGVmaW5lIEVYVFJBQ1RfSElHSF9TWU5EUk9NRSh4KQkoKCh4KSA+PiAyNCkgJiAweGZmKQorI2RlZmluZSBFWFRSQUNUX0VYVF9FUlJPUl9DT0RFKHgpCSgoKHgpID4+IDE2KSAmIDB4MWYpCisKKy8qIEZhbWlseSBGMTBoOiBOb3JtYWxpemVkIEV4dGVuZGVkIEVycm9yIENvZGVzICovCisjZGVmaW5lIEYxMF9OQlNMX0VYVF9FUlJfUkVTCQkweDAKKyNkZWZpbmUgRjEwX05CU0xfRVhUX0VSUl9DUkMJCTB4MQorI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX1NZTkMJCTB4MgorI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX01TVAkJMHgzCisjZGVmaW5lIEYxMF9OQlNMX0VYVF9FUlJfVEdUCQkweDQKKyNkZWZpbmUgRjEwX05CU0xfRVhUX0VSUl9HQVJUCQkweDUKKyNkZWZpbmUgRjEwX05CU0xfRVhUX0VSUl9STVcJCTB4NgorI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX1dEVAkJMHg3CisjZGVmaW5lIEYxMF9OQlNMX0VYVF9FUlJfRUNDCQkweDgKKyNkZWZpbmUgRjEwX05CU0xfRVhUX0VSUl9ERVYJCTB4OQorI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX0xJTktfREFUQQkweEEKKworLyogTmV4dCB0d28gYXJlIG92ZXJsb2FkZWQgdmFsdWVzICovCisjZGVmaW5lIEYxMF9OQlNMX0VYVF9FUlJfTElOS19QUk9UTwkweEIKKyNkZWZpbmUgRjEwX05CU0xfRVhUX0VSUl9MM19QUk9UTwkweEIKKworI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX05CX0FSUkFZCTB4QworI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX0RSQU1fUEFSSVRZCTB4RAorI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX0xJTktfUkVUUlkJMHhFCisKKy8qIE5leHQgdHdvIGFyZSBvdmVybG9hZGVkIHZhbHVlcyAqLworI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX0dBUlRfV0FMSwkweEYKKyNkZWZpbmUgRjEwX05CU0xfRVhUX0VSUl9ERVZfV0FMSwkweEYKKworLyogMHgxMCB0byAweDFCOiBSZXNlcnZlZCAqLworI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX0wzX0RBVEEJMHgxQworI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX0wzX1RBRwkJMHgxRAorI2RlZmluZSBGMTBfTkJTTF9FWFRfRVJSX0wzX0xSVQkJMHgxRQorCisvKiBLODogTm9ybWFsaXplZCBFeHRlbmRlZCBFcnJvciBDb2RlcyAqLworI2RlZmluZSBLOF9OQlNMX0VYVF9FUlJfRUNDCQkweDAKKyNkZWZpbmUgSzhfTkJTTF9FWFRfRVJSX0NSQwkJMHgxCisjZGVmaW5lIEs4X05CU0xfRVhUX0VSUl9TWU5DCQkweDIKKyNkZWZpbmUgSzhfTkJTTF9FWFRfRVJSX01TVAkJMHgzCisjZGVmaW5lIEs4X05CU0xfRVhUX0VSUl9UR1QJCTB4NAorI2RlZmluZSBLOF9OQlNMX0VYVF9FUlJfR0FSVAkJMHg1CisjZGVmaW5lIEs4X05CU0xfRVhUX0VSUl9STVcJCTB4NgorI2RlZmluZSBLOF9OQlNMX0VYVF9FUlJfV0RUCQkweDcKKyNkZWZpbmUgSzhfTkJTTF9FWFRfRVJSX0NISVBLSUxMX0VDQwkweDgKKyNkZWZpbmUgSzhfTkJTTF9FWFRfRVJSX0RSQU1fUEFSSVRZCTB4RAorCisjZGVmaW5lIEVYVFJBQ1RfRVJST1JfQ09ERSh4KQkJKCh4KSAmIDB4ZmZmZikKKyNkZWZpbmUJVEVTVF9UTEJfRVJST1IoeCkJCSgoKHgpICYgMHhGRkYwKSA9PSAweDAwMTApCisjZGVmaW5lCVRFU1RfTUVNX0VSUk9SKHgpCQkoKCh4KSAmIDB4RkYwMCkgPT0gMHgwMTAwKQorI2RlZmluZQlURVNUX0JVU19FUlJPUih4KQkJKCgoeCkgJiAweEY4MDApID09IDB4MDgwMCkKKyNkZWZpbmUJRVhUUkFDVF9UVF9DT0RFKHgpCQkoKCh4KSA+PiAyKSAmIDB4MykKKyNkZWZpbmUJRVhUUkFDVF9JSV9DT0RFKHgpCQkoKCh4KSA+PiAyKSAmIDB4MykKKyNkZWZpbmUJRVhUUkFDVF9MTF9DT0RFKHgpCQkoKCh4KSA+PiAwKSAmIDB4MykKKyNkZWZpbmUJRVhUUkFDVF9SUlJSX0NPREUoeCkJCSgoKHgpID4+IDQpICYgMHhmKQorI2RlZmluZQlFWFRSQUNUX1RPX0NPREUoeCkJCSgoKHgpID4+IDgpICYgMHgxKQorI2RlZmluZQlFWFRSQUNUX1BQX0NPREUoeCkJCSgoKHgpID4+IDkpICYgMHgzKQorCisvKgorICogVGhlIGZvbGxvd2luZyBhcmUgZm9yIEJVUyB0eXBlIGVycm9ycyBBRlRFUiB2YWx1ZXMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgYnkKKyAqIHNoaWZ0aW5nIHJpZ2h0CisgKi8KKyNkZWZpbmUgSzhfTkJTTF9QUF9TUkMJCQkweDAKKyNkZWZpbmUgSzhfTkJTTF9QUF9SRVMJCQkweDEKKyNkZWZpbmUgSzhfTkJTTF9QUF9PQlMJCQkweDIKKyNkZWZpbmUgSzhfTkJTTF9QUF9HRU5FUklDCQkweDMKKworCisjZGVmaW5lIEs4X05CU0gJCQkJMHg0QworCisjZGVmaW5lIEs4X05CU0hfVkFMSURfQklUCQlCSVQoMzEpCisjZGVmaW5lIEs4X05CU0hfT1ZFUkZMT1cJCUJJVCgzMCkKKyNkZWZpbmUgSzhfTkJTSF9VTkNPUlJFQ1RFRF9FUlIJCUJJVCgyOSkKKyNkZWZpbmUgSzhfTkJTSF9FUlJfRU5BQkxFCQlCSVQoMjgpCisjZGVmaW5lIEs4X05CU0hfTUlTQ19FUlJfVkFMSUQJCUJJVCgyNykKKyNkZWZpbmUgSzhfTkJTSF9WQUxJRF9FUlJPUl9BRERSCUJJVCgyNikKKyNkZWZpbmUgSzhfTkJTSF9QQ0MJCQlCSVQoMjUpCisjZGVmaW5lIEs4X05CU0hfQ0VDQwkJCUJJVCgxNCkKKyNkZWZpbmUgSzhfTkJTSF9VRUNDCQkJQklUKDEzKQorI2RlZmluZSBLOF9OQlNIX0VSUl9TQ1JVQkVSCQlCSVQoOCkKKyNkZWZpbmUgSzhfTkJTSF9DT1JFMwkJCUJJVCgzKQorI2RlZmluZSBLOF9OQlNIX0NPUkUyCQkJQklUKDIpCisjZGVmaW5lIEs4X05CU0hfQ09SRTEJCQlCSVQoMSkKKyNkZWZpbmUgSzhfTkJTSF9DT1JFMAkJCUJJVCgwKQorCisjZGVmaW5lIEVYVFJBQ1RfTERUX0xJTksoeCkJCSgoKHgpID4+IDQpICYgMHg3KQorI2RlZmluZSBFWFRSQUNUX0VSUl9DUFVfTUFQKHgpCQkoKHgpICYgMHhGKQorI2RlZmluZSBFWFRSQUNUX0xPV19TWU5EUk9NRSh4KQkJKCgoeCkgPj4gMTUpICYgMHhmZikKKworCisjZGVmaW5lIEs4X05CRUFMCQkJMHg1MAorI2RlZmluZSBLOF9OQkVBSAkJCTB4NTQKKyNkZWZpbmUgSzhfU0NSQ1RSTAkJCTB4NTgKKworI2RlZmluZSBGMTBfTkJfQ0ZHX0xPVwkJCTB4ODgKKyNkZWZpbmUJRjEwX05CX0NGR19MT1dfRU5BQkxFX0VYVF9DRkcJQklUKDE0KQorCisjZGVmaW5lIEYxMF9OQl9DRkdfSElHSAkJCTB4OEMKKworI2RlZmluZSBGMTBfT05MSU5FX1NQQVJFCQkweEIwCisjZGVmaW5lIEYxMF9PTkxJTkVfU1BBUkVfU1dBUERPTkUwKHgpCSgoeCkgJiBCSVQoMSkpCisjZGVmaW5lIEYxMF9PTkxJTkVfU1BBUkVfU1dBUERPTkUxKHgpCSgoeCkgJiBCSVQoMykpCisjZGVmaW5lIEYxMF9PTkxJTkVfU1BBUkVfQkFERFJBTV9DUzAoeCkgKCgoeCkgPj4gNCkgJiAweDAwMDAwMDA3KQorI2RlZmluZSBGMTBfT05MSU5FX1NQQVJFX0JBRERSQU1fQ1MxKHgpICgoKHgpID4+IDgpICYgMHgwMDAwMDAwNykKKworI2RlZmluZSBGMTBfTkJfQVJSQVlfQUREUgkJMHhCOAorCisjZGVmaW5lIEYxMF9OQl9BUlJBWV9EUkFNX0VDQwkJMHg4MDAwMDAwMAorCisvKiBCaXRzIFsyOjFdIGFyZSB1c2VkIHRvIHNlbGVjdCAxNi1ieXRlIHNlY3Rpb24gd2l0aGluIGEgNjQtYnl0ZSBjYWNoZWxpbmUgICovCisjZGVmaW5lIFNFVF9OQl9BUlJBWV9BRERSRVNTKHNlY3Rpb24pCSgoKHNlY3Rpb24pICYgMHgzKSA8PCAxKQorCisjZGVmaW5lIEYxMF9OQl9BUlJBWV9EQVRBCQkweEJDCisKKyNkZWZpbmUgU0VUX05CX0RSQU1fSU5KRUNUSU9OX1dSSVRFKHdvcmQsIGJpdHMpICBcCisJCQkJCShCSVQoKCh3b3JkKSAmIDB4RikgKyAyMCkgfCBcCisJCQkJCUJJVCgxNykgfCAgXAorCQkJCQkoKGJpdHMpICYgMHhGKSkKKworI2RlZmluZSBTRVRfTkJfRFJBTV9JTkpFQ1RJT05fUkVBRCh3b3JkLCBiaXRzKSAgXAorCQkJCQkoQklUKCgod29yZCkgJiAweEYpICsgMjApIHwgXAorCQkJCQlCSVQoMTYpIHwgIFwKKwkJCQkJKChiaXRzKSAmIDB4RikpCisKKyNkZWZpbmUgSzhfTkJDQVAJCQkweEU4CisjZGVmaW5lIEs4X05CQ0FQX0NPUkVTCQkJKEJJVCgxMil8QklUKDEzKSkKKyNkZWZpbmUgSzhfTkJDQVBfQ0hJUEtJTEwJCUJJVCg0KQorI2RlZmluZSBLOF9OQkNBUF9TRUNERUQJCQlCSVQoMykKKyNkZWZpbmUgSzhfTkJDQVBfOF9OT0RFCQkJQklUKDIpCisjZGVmaW5lIEs4X05CQ0FQX0RVQUxfTk9ERQkJQklUKDEpCisjZGVmaW5lIEs4X05CQ0FQX0RDVF9EVUFMCQlCSVQoMCkKKworLyoKKyAqIE1TUiBSZWdzCisgKi8KKyNkZWZpbmUgSzhfTVNSX01DR0NUTAkJCTB4MDE3YgorI2RlZmluZSBLOF9NU1JfTUNHQ1RMX05CRQkJQklUKDQpCisKKyNkZWZpbmUgSzhfTVNSX01DNENUTAkJCTB4MDQxMAorI2RlZmluZSBLOF9NU1JfTUM0U1RBVAkJCTB4MDQxMQorI2RlZmluZSBLOF9NU1JfTUM0QUREUgkJCTB4MDQxMgorCisvKiBBTUQgc2V0cyB0aGUgZmlyc3QgTUMgZGV2aWNlIGF0IGRldmljZSBJRCAweDE4LiAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X21jX25vZGVfaWRfZnJvbV9wZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXJldHVybiBQQ0lfU0xPVChwZGV2LT5kZXZmbikgLSAweDE4OworfQorCitlbnVtIGFtZDY0X2NoaXBzZXRfZmFtaWxpZXMgeworCUs4X0NQVVMgPSAwLAorCUYxMF9DUFVTLAorCUYxMV9DUFVTLAorfTsKKworLyoKKyAqIFN0cnVjdHVyZSB0byBob2xkOgorICoKKyAqIDEpIGR5bmFtaWNhbGx5IHJlYWQgc3RhdHVzIGFuZCBlcnJvciBhZGRyZXNzIEhXIHJlZ2lzdGVycworICogMikgc3lzZnMgZW50ZXJlZCB2YWx1ZXMKKyAqIDMpIE1DRSB2YWx1ZXMKKyAqCisgKiBEZXBlbmRzIG9uIGVudHJ5IGludG8gdGhlIG1vZHVsZXMKKyAqLworc3RydWN0IGFtZDY0X2Vycm9yX2luZm9fcmVncyB7CisJdTMyIG5iY2ZnOworCXUzMiBuYnNoOworCXUzMiBuYnNsOworCXUzMiBuYmVhaDsKKwl1MzIgbmJlYWw7Cit9OworCisvKiBFcnJvciBpbmplY3Rpb24gY29udHJvbCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBlcnJvcl9pbmplY3Rpb24geworCXUzMglzZWN0aW9uOworCXUzMgl3b3JkOworCXUzMgliaXRfbWFwOworfTsKKworc3RydWN0IGFtZDY0X3B2dCB7CisJLyogcGNpX2RldmljZSBoYW5kbGVzIHdoaWNoIHdlIHV0aWxpemUgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqYWRkcl9mMV9jdGw7CisJc3RydWN0IHBjaV9kZXYgKmRyYW1fZjJfY3RsOworCXN0cnVjdCBwY2lfZGV2ICptaXNjX2YzX2N0bDsKKworCWludCBtY19ub2RlX2lkOwkJLyogTUMgaW5kZXggb2YgdGhpcyBNQyBub2RlICovCisJaW50IGV4dF9tb2RlbDsJCS8qIGV4dGVuZGVkIG1vZGVsIHZhbHVlIG9mIHRoaXMgbm9kZSAqLworCisJc3RydWN0IGxvd19vcHMgKm9wczsJLyogcG9pbnRlciB0byBwZXIgUENJIERldmljZSBJRCBmdW5jIHRhYmxlICovCisKKwlpbnQgY2hhbm5lbF9jb3VudDsKKworCS8qIFJhdyByZWdpc3RlcnMgKi8KKwl1MzIgZGNscjA7CQkvKiBEUkFNIENvbmZpZ3VyYXRpb24gTG93IERDVDAgcmVnICovCisJdTMyIGRjbHIxOwkJLyogRFJBTSBDb25maWd1cmF0aW9uIExvdyBEQ1QxIHJlZyAqLworCXUzMiBkY2hyMDsJCS8qIERSQU0gQ29uZmlndXJhdGlvbiBIaWdoIERDVDAgcmVnICovCisJdTMyIGRjaHIxOwkJLyogRFJBTSBDb25maWd1cmF0aW9uIEhpZ2ggRENUMSByZWcgKi8KKwl1MzIgbmJjYXA7CQkvKiBOb3J0aCBCcmlkZ2UgQ2FwYWJpbGl0aWVzICovCisJdTMyIG5iY2ZnOwkJLyogRjEwIE5vcnRoIEJyaWRnZSBDb25maWd1cmF0aW9uICovCisJdTMyIGV4dF9uYmNmZzsJCS8qIEV4dGVuZGVkIEYxMCBOb3J0aCBCcmlkZ2UgQ29uZmlndXJhdGlvbiAqLworCXUzMiBkaGFyOwkJLyogRFJBTSBIb2lzdCByZWcgKi8KKwl1MzIgZGJhbTA7CQkvKiBEUkFNIEJhc2UgQWRkcmVzcyBNYXBwaW5nIHJlZyBmb3IgRENUMCAqLworCXUzMiBkYmFtMTsJCS8qIERSQU0gQmFzZSBBZGRyZXNzIE1hcHBpbmcgcmVnIGZvciBEQ1QxICovCisKKwkvKiBEUkFNIENTIEJhc2UgQWRkcmVzcyBSZWdpc3RlcnMgRjJ4WzEsMF1bNUM6NDBdICovCisJdTMyIGRjc2IwW0NISVBTRUxFQ1RfQ09VTlRdOworCXUzMiBkY3NiMVtDSElQU0VMRUNUX0NPVU5UXTsKKworCS8qIERSQU0gQ1MgTWFzayBSZWdpc3RlcnMgRjJ4WzEsMF1bNkM6NjBdICovCisJdTMyIGRjc20wW0NISVBTRUxFQ1RfQ09VTlRdOworCXUzMiBkY3NtMVtDSElQU0VMRUNUX0NPVU5UXTsKKworCS8qCisJICogRGVjb2RlZCBwYXJ0cyBvZiBEUkFNIEJBU0UgYW5kIExJTUlUIFJlZ2lzdGVycworCSAqIEYxeFs3OCw3MCw2OCw2MCw1OCw1MCw0OCw0MF0KKwkgKi8KKwl1NjQgZHJhbV9iYXNlW0RSQU1fUkVHX0NPVU5UXTsKKwl1NjQgZHJhbV9saW1pdFtEUkFNX1JFR19DT1VOVF07CisJdTggIGRyYW1fSW50bHZTZWxbRFJBTV9SRUdfQ09VTlRdOworCXU4ICBkcmFtX0ludGx2RW5bRFJBTV9SRUdfQ09VTlRdOworCXU4ICBkcmFtX0RzdE5vZGVbRFJBTV9SRUdfQ09VTlRdOworCXU4ICBkcmFtX3J3X2VuW0RSQU1fUkVHX0NPVU5UXTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIHNldCBhdCAobG9hZCkgcnVuIHRpbWUsIGFmdGVyIENQVSByZXZpc2lvbgorCSAqIGhhcyBiZWVuIGRldGVybWluZWQsIHNpbmNlIHRoZSBkY3RfYmFzZSBhbmQgZGN0X21hc2sgcmVnaXN0ZXJzIHZhcnkKKwkgKiBiYXNlZCBvbiByZXZpc2lvbgorCSAqLworCXUzMiBkY3NiX2Jhc2U7CQkvKiBEQ1NCIGJhc2UgYml0cyAqLworCXUzMiBkY3NtX21hc2s7CQkvKiBEQ1NNIG1hc2sgYml0cyAqLworCXUzMiBudW1fZGNzbTsJCS8qIE51bWJlciBvZiBEQ1NNIHJlZ2lzdGVycyAqLworCXUzMiBkY3NfbWFza19ub3R1c2VkOwkvKiBEQ1NNIG5vdHVzZWQgbWFzayBiaXRzICovCisJdTMyIGRjc19zaGlmdDsJCS8qIERDU0IgYW5kIERDU00gc2hpZnQgdmFsdWUgKi8KKworCXU2NCB0b3BfbWVtOwkJLyogdG9wIG9mIG1lbW9yeSBiZWxvdyA0R0IgKi8KKwl1NjQgdG9wX21lbTI7CQkvKiB0b3Agb2YgbWVtb3J5IGFib3ZlIDRHQiAqLworCisJdTMyIGRyYW1fY3RsX3NlbGVjdF9sb3c7CS8qIERSQU0gQ29udHJvbGxlciBTZWxlY3QgTG93IFJlZyAqLworCXUzMiBkcmFtX2N0bF9zZWxlY3RfaGlnaDsJLyogRFJBTSBDb250cm9sbGVyIFNlbGVjdCBIaWdoIFJlZyAqLworCXUzMiBvbmxpbmVfc3BhcmU7ICAgICAgICAgICAgICAgLyogT24tTGluZSBzcGFyZSBSZWcgKi8KKworCS8qIHRlbXAgc3RvcmFnZSBmb3Igd2hlbiBpbnB1dCBpcyByZWNlaXZlZCBmcm9tIHN5c2ZzICovCisJc3RydWN0IGFtZDY0X2Vycm9yX2luZm9fcmVncyBjdGxfZXJyb3JfaW5mbzsKKworCS8qIHBsYWNlIHRvIHN0b3JlIGVycm9yIGluamVjdGlvbiBwYXJhbWV0ZXJzIHByaW9yIHRvIGlzc3VlICovCisJc3RydWN0IGVycm9yX2luamVjdGlvbiBpbmplY3Rpb247CisKKwkvKiBTYXZlIG9sZCBodyByZWdpc3RlcnMnIHZhbHVlcyBiZWZvcmUgd2UgbW9kaWZpZWQgdGhlbSAqLworCXUzMiBuYmN0bF9tY2djdGxfc2F2ZWQ7CQkvKiBXaGVuIHRydWUsIGZvbGxvd2luZyAyIGFyZSB2YWxpZCAqLworCXUzMiBvbGRfbmJjdGw7CisJdW5zaWduZWQgbG9uZyBvbGRfbWNnY3RsOwkvKiBwZXIgY29yZSBvbiB0aGlzIG5vZGUgKi8KKworCS8qIE1DIFR5cGUgSW5kZXggdmFsdWU6IHNvY2tldCBGIHZzIEZhbWlseSAxMGggKi8KKwl1MzIgbWNfdHlwZV9pbmRleDsKKworCS8qIG1pc2Mgc2V0dGluZ3MgKi8KKwlzdHJ1Y3QgZmxhZ3MgeworCQl1bnNpZ25lZCBsb25nIGNmOF9leHRjZmc6MTsKKwl9IGZsYWdzOworfTsKKworc3RydWN0IHNjcnVicmF0ZSB7CisgICAgICAgdTMyIHNjcnVidmFsOyAgICAgICAgICAgLyogYml0IHBhdHRlcm4gZm9yIHNjcnViIHJhdGUgKi8KKyAgICAgICB1MzIgYmFuZHdpZHRoOyAgICAgICAgICAvKiBiYW5kd2lkdGggY29uc3VtZWQgKGJ5dGVzL3NlYykgKi8KK307CisKK2V4dGVybiBzdHJ1Y3Qgc2NydWJyYXRlIHNjcnVicmF0ZXNbMjNdOworZXh0ZXJuIHUzMiByZXZmX3F1YWRfZGRyMl9zaGlmdFsxNl07CitleHRlcm4gY29uc3QgY2hhciAqdHRfbXNnc1s0XTsKK2V4dGVybiBjb25zdCBjaGFyICpsbF9tc2dzWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKnJycnJfbXNnc1sxNl07CitleHRlcm4gY29uc3QgY2hhciAqdG9fbXNnc1syXTsKK2V4dGVybiBjb25zdCBjaGFyICpwcF9tc2dzWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmlpX21zZ3NbNF07CitleHRlcm4gY29uc3QgY2hhciAqZXh0X21zZ3NbMzJdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmh0bGlua19tc2dzWzhdOworCisjaWZkZWYgQ09ORklHX0VEQUNfREVCVUcKKyNkZWZpbmUgTlVNX0RCR19BVFRSUyA5CisjZWxzZQorI2RlZmluZSBOVU1fREJHX0FUVFJTIDAKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VEQUNfQU1ENjRfRVJST1JfSU5KRUNUSU9OCisjZGVmaW5lIE5VTV9JTkpfQVRUUlMgNQorI2Vsc2UKKyNkZWZpbmUgTlVNX0lOSl9BVFRSUyAwCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlIGFtZDY0X2RiZ19hdHRyc1tOVU1fREJHX0FUVFJTXSwKKwkJCQkgICAgIGFtZDY0X2lual9hdHRyc1tOVU1fSU5KX0FUVFJTXTsKKworLyoKKyAqIEVhY2ggb2YgdGhlIFBDSSBEZXZpY2UgSURzIHR5cGVzIGhhdmUgdGhlaXIgb3duIHNldCBvZiBoYXJkd2FyZSBhY2Nlc3NvcgorICogZnVuY3Rpb25zIGFuZCBwZXIgZGV2aWNlIGVuY29kaW5nL2RlY29kaW5nIGxvZ2ljLgorICovCitzdHJ1Y3QgbG93X29wcyB7CisJaW50ICgqcHJvYmVfdmFsaWRfaGFyZHdhcmUpKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCk7CisJaW50ICgqZWFybHlfY2hhbm5lbF9jb3VudCkoc3RydWN0IGFtZDY0X3B2dCAqcHZ0KTsKKworCXU2NCAoKmdldF9lcnJvcl9hZGRyZXNzKShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQlzdHJ1Y3QgYW1kNjRfZXJyb3JfaW5mb19yZWdzICppbmZvKTsKKwl2b2lkICgqcmVhZF9kcmFtX2Jhc2VfbGltaXQpKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGRyYW0pOworCXZvaWQgKCpyZWFkX2RyYW1fY3RsX3JlZ2lzdGVyKShzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQpOworCXZvaWQgKCptYXBfc3lzYWRkcl90b19jc3Jvdykoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCQlzdHJ1Y3QgYW1kNjRfZXJyb3JfaW5mb19yZWdzICppbmZvLAorCQkJCQl1NjQgU3lzdGVtQWRkcik7CisJaW50ICgqZGJhbV9tYXBfdG9fcGFnZXMpKHN0cnVjdCBhbWQ2NF9wdnQgKnB2dCwgaW50IGRyYW1fbWFwKTsKK307CisKK3N0cnVjdCBhbWQ2NF9mYW1pbHlfdHlwZSB7CisJY29uc3QgY2hhciAqY3RsX25hbWU7CisJdTE2IGFkZHJfZjFfY3RsOworCXUxNiBtaXNjX2YzX2N0bDsKKwlzdHJ1Y3QgbG93X29wcyBvcHM7Cit9OworCitzdGF0aWMgc3RydWN0IGFtZDY0X2ZhbWlseV90eXBlIGFtZDY0X2ZhbWlseV90eXBlc1tdOworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmdldF9hbWRfZmFtaWx5X25hbWUoaW50IGluZGV4KQoreworCXJldHVybiBhbWQ2NF9mYW1pbHlfdHlwZXNbaW5kZXhdLmN0bF9uYW1lOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsb3dfb3BzICpmYW1pbHlfb3BzKGludCBpbmRleCkKK3sKKwlyZXR1cm4gJmFtZDY0X2ZhbWlseV90eXBlc1tpbmRleF0ub3BzOworfQorCisvKgorICogRm9yIGZ1dHVyZSBDUFUgdmVyc2lvbnMsIHZlcmlmeSB0aGUgZm9sbG93aW5nIGFzIG5ldyAnc2xvdycgcmF0ZXMgYXBwZWFyIGFuZAorICogbW9kaWZ5IHRoZSBuZWNlc3Nhcnkgc2tpcCB2YWx1ZXMgZm9yIHRoZSBzdXBwb3J0ZWQgQ1BVLgorICovCisjZGVmaW5lIEs4X01JTl9TQ1JVQl9SQVRFX0JJVFMJMHgwCisjZGVmaW5lIEYxMF9NSU5fU0NSVUJfUkFURV9CSVRTCTB4NQorI2RlZmluZSBGMTFfTUlOX1NDUlVCX1JBVEVfQklUUwkweDYKKworaW50IGFtZDY0X3Byb2Nlc3NfZXJyb3JfaW5mbyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkgICAgIHN0cnVjdCBhbWQ2NF9lcnJvcl9pbmZvX3JlZ3MgKmluZm8sCisJCQkgICAgIGludCBoYW5kbGVfZXJyb3JzKTsKK2ludCBhbWQ2NF9nZXRfZHJhbV9ob2xlX2luZm8oc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCB1NjQgKmhvbGVfYmFzZSwKKwkJCSAgICAgdTY0ICpob2xlX29mZnNldCwgdTY0ICpob2xlX3NpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWNfZGJnLmMgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19kYmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQxYjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWNfZGJnLmMKQEAgLTAsMCArMSwyNTUgQEAKKyNpbmNsdWRlICJhbWQ2NF9lZGFjLmgiCisKKy8qCisgKiBhY2NlcHQgYSBoZXggdmFsdWUgYW5kIHN0b3JlIGl0IGludG8gdGhlIHZpcnR1YWwgZXJyb3IgcmVnaXN0ZXIgZmlsZSwgZmllbGQ6CisgKiBuYmVhbCBhbmQgbmJlYWguIEFzc3VtZSB2aXJ0dWFsIGVycm9yIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yOiBOQlNMLAorICogTkJTSCBhbmQgTkJDRkcuIFRoZW4gcHJvY2VlZCB0byBtYXAgdGhlIGVycm9yIHZhbHVlcyB0byBhIE1DLCBDU1JPVyBhbmQKKyAqIENIQU5ORUwKKyAqLworc3RhdGljIHNzaXplX3QgYW1kNjRfbmJlYV9zdG9yZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNvbnN0IGNoYXIgKmRhdGEsCisJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlOworCWludCByZXQgPSAwOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWxsKGRhdGEsIDE2LCAmdmFsdWUpOworCWlmIChyZXQgIT0gLUVJTlZBTCkgeworCQlkZWJ1Z2YwKCJyZWNlaXZlZCBOQkVBPSAweCVsbHhcbiIsIHZhbHVlKTsKKworCQkvKiBwbGFjZSB0aGUgdmFsdWUgaW50byB0aGUgdmlydHVhbCBlcnJvciBwYWNrZXQgKi8KKwkJcHZ0LT5jdGxfZXJyb3JfaW5mby5uYmVhbCA9ICh1MzIpIHZhbHVlOworCQl2YWx1ZSA+Pj0gMzI7CisJCXB2dC0+Y3RsX2Vycm9yX2luZm8ubmJlYWggPSAodTMyKSB2YWx1ZTsKKworCQkvKiBQcm9jZXNzIHRoZSBNYXBwaW5nIHJlcXVlc3QgKi8KKwkJLyogVE9ETzogQWRkIHJhY2UgcHJldmVudGlvbiAqLworCQlhbWQ2NF9wcm9jZXNzX2Vycm9yX2luZm8obWNpLCAmcHZ0LT5jdGxfZXJyb3JfaW5mbywgMSk7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBkaXNwbGF5IGJhY2sgd2hhdCB0aGUgbGFzdCBOQkVBIChNQ0EgTkIgQWRkcmVzcyAoTUM0X0FERFIpKSB3YXMgd3JpdHRlbiAqLworc3RhdGljIHNzaXplX3QgYW1kNjRfbmJlYV9zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXU2NCB2YWx1ZTsKKworCXZhbHVlID0gcHZ0LT5jdGxfZXJyb3JfaW5mby5uYmVhaDsKKwl2YWx1ZSA8PD0gMzI7CisJdmFsdWUgfD0gcHZ0LT5jdGxfZXJyb3JfaW5mby5uYmVhbDsKKworCXJldHVybiBzcHJpbnRmKGRhdGEsICIlbGx4XG4iLCB2YWx1ZSk7Cit9CisKKy8qIHN0b3JlIHRoZSBOQlNMIChNQ0EgTkIgU3RhdHVzIExvdyAoTUM0X1NUQVRVUykpIHZhbHVlIHVzZXIgZGVzaXJlcyAqLworc3RhdGljIHNzaXplX3QgYW1kNjRfbmJzbF9zdG9yZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNvbnN0IGNoYXIgKmRhdGEsCisJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGRhdGEsIDE2LCAmdmFsdWUpOworCWlmIChyZXQgIT0gLUVJTlZBTCkgeworCQlkZWJ1Z2YwKCJyZWNlaXZlZCBOQlNMPSAweCVseFxuIiwgdmFsdWUpOworCisJCXB2dC0+Y3RsX2Vycm9yX2luZm8ubmJzbCA9ICh1MzIpIHZhbHVlOworCisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogZGlzcGxheSBiYWNrIHdoYXQgdGhlIGxhc3QgTkJTTCB2YWx1ZSB3cml0dGVuICovCitzdGF0aWMgc3NpemVfdCBhbWQ2NF9uYnNsX3Nob3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJdTMyIHZhbHVlOworCisJdmFsdWUgPSBwdnQtPmN0bF9lcnJvcl9pbmZvLm5ic2w7CisKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiJXhcbiIsIHZhbHVlKTsKK30KKworLyogc3RvcmUgdGhlIE5CU0ggKE1DQSBOQiBTdGF0dXMgSGlnaCkgdmFsdWUgdXNlciBkZXNpcmVzICovCitzdGF0aWMgc3NpemVfdCBhbWQ2NF9uYnNoX3N0b3JlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQgPSAwOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoZGF0YSwgMTYsICZ2YWx1ZSk7CisJaWYgKHJldCAhPSAtRUlOVkFMKSB7CisJCWRlYnVnZjAoInJlY2VpdmVkIE5CU0g9IDB4JWx4XG4iLCB2YWx1ZSk7CisKKwkJcHZ0LT5jdGxfZXJyb3JfaW5mby5uYnNoID0gKHUzMikgdmFsdWU7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBkaXNwbGF5IGJhY2sgd2hhdCB0aGUgbGFzdCBOQlNIIHZhbHVlIHdyaXR0ZW4gKi8KK3N0YXRpYyBzc2l6ZV90IGFtZDY0X25ic2hfc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1MzIgdmFsdWU7CisKKwl2YWx1ZSA9IHB2dC0+Y3RsX2Vycm9yX2luZm8ubmJzaDsKKworCXJldHVybiBzcHJpbnRmKGRhdGEsICIleFxuIiwgdmFsdWUpOworfQorCisvKiBhY2NlcHQgYW5kIHN0b3JlIHRoZSBOQkNGRyAoTUNBIE5CIENvbmZpZ3VyYXRpb24pIHZhbHVlIHVzZXIgZGVzaXJlcyAqLworc3RhdGljIHNzaXplX3QgYW1kNjRfbmJjZmdfc3RvcmUoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCQljb25zdCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQgPSAwOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoZGF0YSwgMTYsICZ2YWx1ZSk7CisJaWYgKHJldCAhPSAtRUlOVkFMKSB7CisJCWRlYnVnZjAoInJlY2VpdmVkIE5CQ0ZHPSAweCVseFxuIiwgdmFsdWUpOworCisJCXB2dC0+Y3RsX2Vycm9yX2luZm8ubmJjZmcgPSAodTMyKSB2YWx1ZTsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIHZhcmlvdXMgc2hvdyByb3V0aW5lcyBmb3IgdGhlIGNvbnRyb2xzIG9mIGEgTUNJICovCitzdGF0aWMgc3NpemVfdCBhbWQ2NF9uYmNmZ19zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJcmV0dXJuIHNwcmludGYoZGF0YSwgIiV4XG4iLCBwdnQtPmN0bF9lcnJvcl9pbmZvLm5iY2ZnKTsKK30KKworCitzdGF0aWMgc3NpemVfdCBhbWQ2NF9kaGFyX3Nob3coc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisKKwlyZXR1cm4gc3ByaW50ZihkYXRhLCAiJXhcbiIsIHB2dC0+ZGhhcik7Cit9CisKKworc3RhdGljIHNzaXplX3QgYW1kNjRfZGJhbV9zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCisJcmV0dXJuIHNwcmludGYoZGF0YSwgIiV4XG4iLCBwdnQtPmRiYW0wKTsKK30KKworCitzdGF0aWMgc3NpemVfdCBhbWQ2NF90b3BtZW1fc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCXJldHVybiBzcHJpbnRmKGRhdGEsICIlbGx4XG4iLCBwdnQtPnRvcF9tZW0pOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGFtZDY0X3RvcG1lbTJfc2hvdyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKKworCXJldHVybiBzcHJpbnRmKGRhdGEsICIlbGx4XG4iLCBwdnQtPnRvcF9tZW0yKTsKK30KKworc3RhdGljIHNzaXplX3QgYW1kNjRfaG9sZV9zaG93KHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwgY2hhciAqZGF0YSkKK3sKKwl1NjQgaG9sZV9iYXNlID0gMDsKKwl1NjQgaG9sZV9vZmZzZXQgPSAwOworCXU2NCBob2xlX3NpemUgPSAwOworCisJYW1kNjRfZ2V0X2RyYW1faG9sZV9pbmZvKG1jaSwgJmhvbGVfYmFzZSwgJmhvbGVfb2Zmc2V0LCAmaG9sZV9zaXplKTsKKworCXJldHVybiBzcHJpbnRmKGRhdGEsICIlbGx4ICVsbHggJWxseFxuIiwgaG9sZV9iYXNlLCBob2xlX29mZnNldCwKKwkJCQkJCSBob2xlX3NpemUpOworfQorCisvKgorICogdXBkYXRlIE5VTV9EQkdfQVRUUlMgaW4gY2FzZSB5b3UgYWRkIG5ldyBtZW1iZXJzCisgKi8KK3N0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlIGFtZDY0X2RiZ19hdHRyc1tdID0geworCisJeworCQkuYXR0ciA9IHsKKwkJCS5uYW1lID0gIm5iZWFfY3RsIiwKKwkJCS5tb2RlID0gKFNfSVJVR08gfCBTX0lXVVNSKQorCQl9LAorCQkuc2hvdyA9IGFtZDY0X25iZWFfc2hvdywKKwkJLnN0b3JlID0gYW1kNjRfbmJlYV9zdG9yZSwKKwl9LAorCXsKKwkJLmF0dHIgPSB7CisJCQkubmFtZSA9ICJuYnNsX2N0bCIsCisJCQkubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUikKKwkJfSwKKwkJLnNob3cgPSBhbWQ2NF9uYnNsX3Nob3csCisJCS5zdG9yZSA9IGFtZDY0X25ic2xfc3RvcmUsCisJfSwKKwl7CisJCS5hdHRyID0geworCQkJLm5hbWUgPSAibmJzaF9jdGwiLAorCQkJLm1vZGUgPSAoU19JUlVHTyB8IFNfSVdVU1IpCisJCX0sCisJCS5zaG93ID0gYW1kNjRfbmJzaF9zaG93LAorCQkuc3RvcmUgPSBhbWQ2NF9uYnNoX3N0b3JlLAorCX0sCisJeworCQkuYXR0ciA9IHsKKwkJCS5uYW1lID0gIm5iY2ZnX2N0bCIsCisJCQkubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUikKKwkJfSwKKwkJLnNob3cgPSBhbWQ2NF9uYmNmZ19zaG93LAorCQkuc3RvcmUgPSBhbWQ2NF9uYmNmZ19zdG9yZSwKKwl9LAorCXsKKwkJLmF0dHIgPSB7CisJCQkubmFtZSA9ICJkaGFyIiwKKwkJCS5tb2RlID0gKFNfSVJVR08pCisJCX0sCisJCS5zaG93ID0gYW1kNjRfZGhhcl9zaG93LAorCQkuc3RvcmUgPSBOVUxMLAorCX0sCisJeworCQkuYXR0ciA9IHsKKwkJCS5uYW1lID0gImRiYW0iLAorCQkJLm1vZGUgPSAoU19JUlVHTykKKwkJfSwKKwkJLnNob3cgPSBhbWQ2NF9kYmFtX3Nob3csCisJCS5zdG9yZSA9IE5VTEwsCisJfSwKKwl7CisJCS5hdHRyID0geworCQkJLm5hbWUgPSAidG9wbWVtIiwKKwkJCS5tb2RlID0gKFNfSVJVR08pCisJCX0sCisJCS5zaG93ID0gYW1kNjRfdG9wbWVtX3Nob3csCisJCS5zdG9yZSA9IE5VTEwsCisJfSwKKwl7CisJCS5hdHRyID0geworCQkJLm5hbWUgPSAidG9wbWVtMiIsCisJCQkubW9kZSA9IChTX0lSVUdPKQorCQl9LAorCQkuc2hvdyA9IGFtZDY0X3RvcG1lbTJfc2hvdywKKwkJLnN0b3JlID0gTlVMTCwKKwl9LAorCXsKKwkJLmF0dHIgPSB7CisJCQkubmFtZSA9ICJkcmFtX2hvbGUiLAorCQkJLm1vZGUgPSAoU19JUlVHTykKKwkJfSwKKwkJLnNob3cgPSBhbWQ2NF9ob2xlX3Nob3csCisJCS5zdG9yZSA9IE5VTEwsCisJfSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19lcnJfdHlwZXMuYyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjX2Vycl90eXBlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMTJmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19lcnJfdHlwZXMuYwpAQCAtMCwwICsxLDE2MSBAQAorI2luY2x1ZGUgImFtZDY0X2VkYWMuaCIKKworLyoKKyAqIFNlZSBGMng4MCBmb3IgSzggYW5kIEYyeFsxLDBdODAgZm9yIEZhbTEwIGFuZCBsYXRlci4gVGhlIHRhYmxlIGJlbG93IGlzIG9ubHkKKyAqIGZvciBERFIyIERSQU0gbWFwcGluZy4KKyAqLwordTMyIHJldmZfcXVhZF9kZHIyX3NoaWZ0W10gPSB7CisJMCwJLyogMDAwMGIgTlVMTCBESU1NICgxMjhtYikgKi8KKwkyOCwJLyogMDAwMWIgMjU2bWIgKi8KKwkyOSwJLyogMDAxMGIgNTEybWIgKi8KKwkyOSwJLyogMDAxMWIgNTEybWIgKi8KKwkyOSwJLyogMDEwMGIgNTEybWIgKi8KKwkzMCwJLyogMDEwMWIgMWdiICovCisJMzAsCS8qIDAxMTBiIDFnYiAqLworCTMxLAkvKiAwMTExYiAyZ2IgKi8KKwkzMSwJLyogMTAwMGIgMmdiICovCisJMzIsCS8qIDEwMDFiIDRnYiAqLworCTMyLAkvKiAxMDEwYiA0Z2IgKi8KKwkzMywJLyogMTAxMWIgOGdiICovCisJMCwJLyogMTEwMGIgZnV0dXJlICovCisJMCwJLyogMTEwMWIgZnV0dXJlICovCisJMCwJLyogMTExMGIgZnV0dXJlICovCisJMAkvKiAxMTExYiBmdXR1cmUgKi8KK307CisKKy8qCisgKiBWYWxpZCBzY3J1YiByYXRlcyBmb3IgdGhlIEs4IGhhcmR3YXJlIG1lbW9yeSBzY3J1YmJlci4gV2UgbWFwIHRoZSBzY3J1YmJpbmcKKyAqIGJhbmR3aWR0aCB0byBhIHZhbGlkIGJpdCBwYXR0ZXJuLiBUaGUgJ3NldCcgb3BlcmF0aW9uIGZpbmRzIHRoZSAnbWF0Y2hpbmctCisgKiBvciBoaWdoZXIgdmFsdWUnLgorICoKKyAqRklYTUU6IFByb2R1Y2UgYSBiZXR0ZXIgbWFwcGluZy9saW5lYXJpc2F0aW9uLgorICovCisKK3N0cnVjdCBzY3J1YnJhdGUgc2NydWJyYXRlc1tdID0geworCXsgMHgwMSwgMTYwMDAwMDAwMFVMfSwKKwl7IDB4MDIsIDgwMDAwMDAwMFVMfSwKKwl7IDB4MDMsIDQwMDAwMDAwMFVMfSwKKwl7IDB4MDQsIDIwMDAwMDAwMFVMfSwKKwl7IDB4MDUsIDEwMDAwMDAwMFVMfSwKKwl7IDB4MDYsIDUwMDAwMDAwVUx9LAorCXsgMHgwNywgMjUwMDAwMDBVTH0sCisJeyAweDA4LCAxMjI4NDA2OVVMfSwKKwl7IDB4MDksIDYyNzQ1MDlVTH0sCisJeyAweDBBLCAzMTIxOTUxVUx9LAorCXsgMHgwQiwgMTU2MDk3NVVMfSwKKwl7IDB4MEMsIDc4MTQ0MFVMfSwKKwl7IDB4MEQsIDM5MDcyMFVMfSwKKwl7IDB4MEUsIDE5NTMwMFVMfSwKKwl7IDB4MEYsIDk3NjUwVUx9LAorCXsgMHgxMCwgNDg4NTRVTH0sCisJeyAweDExLCAyNDQyN1VMfSwKKwl7IDB4MTIsIDEyMjEzVUx9LAorCXsgMHgxMywgNjEwMVVMfSwKKwl7IDB4MTQsIDMwNTFVTH0sCisJeyAweDE1LCAxNTIzVUx9LAorCXsgMHgxNiwgNzYxVUx9LAorCXsgMHgwMCwgMFVMfSwgICAgICAgIC8qIHNjcnViYmluZyBvZmYgKi8KK307CisKKy8qCisgKiBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBkaWZmZXJlbnQgTUNBIHJlcG9ydGVkIGVycm9yIHR5cGVzLCBzZWUgRjN4NDgKKyAqIG9yIE1TUjAwMDBfMDQxMS4KKyAqLworY29uc3QgY2hhciAqdHRfbXNnc1tdID0geyAgICAgICAgLyogdHJhbnNhY3Rpb24gdHlwZSAqLworCSJpbnN0cnVjdGlvbiIsCisJImRhdGEiLAorCSJnZW5lcmljIiwKKwkicmVzZXJ2ZWQiCit9OworCitjb25zdCBjaGFyICpsbF9tc2dzW10gPSB7CS8qIGNhY2hlIGxldmVsICovCisJIkwwIiwKKwkiTDEiLAorCSJMMiIsCisJIkwzL2dlbmVyaWMiCit9OworCitjb25zdCBjaGFyICpycnJyX21zZ3NbXSA9IHsKKwkiZ2VuZXJpYyIsCisJImdlbmVyaWMgcmVhZCIsCisJImdlbmVyaWMgd3JpdGUiLAorCSJkYXRhIHJlYWQiLAorCSJkYXRhIHdyaXRlIiwKKwkiaW5zdCBmZXRjaCIsCisJInByZWZldGNoIiwKKwkiZXZpY3QiLAorCSJzbm9vcCIsCisJInJlc2VydmVkIFJSUlI9IDkiLAorCSJyZXNlcnZlZCBSUlJSPSAxMCIsCisJInJlc2VydmVkIFJSUlI9IDExIiwKKwkicmVzZXJ2ZWQgUlJSUj0gMTIiLAorCSJyZXNlcnZlZCBSUlJSPSAxMyIsCisJInJlc2VydmVkIFJSUlI9IDE0IiwKKwkicmVzZXJ2ZWQgUlJSUj0gMTUiCit9OworCitjb25zdCBjaGFyICpwcF9tc2dzW10gPSB7CS8qIHBhcnRpY2lwYXRpbmcgcHJvY2Vzc29yICovCisJImxvY2FsIG5vZGUgb3JpZ2luYXRlZCAoU1JDKSIsCisJImxvY2FsIG5vZGUgcmVzcG9uZGVkIHRvIHJlcXVlc3QgKFJFUykiLAorCSJsb2NhbCBub2RlIG9ic2VydmVkIGFzIDNyZCBwYXJ0eSAoT0JTKSIsCisJImdlbmVyaWMiCit9OworCitjb25zdCBjaGFyICp0b19tc2dzW10gPSB7CisJIm5vIHRpbWVvdXQiLAorCSJ0aW1lZCBvdXQiCit9OworCitjb25zdCBjaGFyICppaV9tc2dzW10gPSB7CS8qIG1lbW9yeSBvciBpL28gKi8KKwkibWVtIGFjY2VzcyIsCisJInJlc2VydmVkIiwKKwkiaS9vIGFjY2VzcyIsCisJImdlbmVyaWMiCit9OworCisvKiBNYXAgdGhlIDUgYml0cyBvZiBFeHRlbmRlZCBFcnJvciBjb2RlIHRvIHRoZSBzdHJpbmcgdGFibGUuICovCitjb25zdCBjaGFyICpleHRfbXNnc1tdID0gewkvKiBleHRlbmRlZCBlcnJvciAqLworCSJLOCBFQ0MgZXJyb3IvRjEwIHJlc2VydmVkIiwJLyogMF8wMDAwYiAqLworCSJDUkMgZXJyb3IiLAkJCS8qIDBfMDAwMWIgKi8KKwkic3luYyBlcnJvciIsCQkJLyogMF8wMDEwYiAqLworCSJtc3QgYWJvcnQiLAkJCS8qIDBfMDAxMWIgKi8KKwkidGd0IGFib3J0IiwJCQkvKiAwXzAxMDBiICovCisJIkdBUlQgZXJyb3IiLAkJCS8qIDBfMDEwMWIgKi8KKwkiUk1XIGVycm9yIiwJCQkvKiAwXzAxMTBiICovCisJIldkb2cgdGltZXIgZXJyb3IiLAkJLyogMF8wMTExYiAqLworCSJGMTAtRUNDL0s4LUNoaXBraWxsIGVycm9yIiwJLyogMF8xMDAwYiAqLworCSJERVYgRXJyb3IiLAkJCS8qIDBfMTAwMWIgKi8KKwkiTGluayBEYXRhIGVycm9yIiwJCS8qIDBfMTAxMGIgKi8KKwkiTGluayBvciBMMyBQcm90b2NvbCBlcnJvciIsCS8qIDBfMTAxMWIgKi8KKwkiTkIgQXJyYXkgZXJyb3IiLAkJLyogMF8xMTAwYiAqLworCSJEUkFNIFBhcml0eSBlcnJvciIsCQkvKiAwXzExMDFiICovCisJIkxpbmsgUmV0cnkvR0FSVCBUYWJsZSBXYWxrL0RFViBUYWJsZSBXYWxrIGVycm9yIiwgLyogMF8xMTEwYiAqLworCSJSZXMgMHgwZmYgZXJyb3IiLAkJLyogMF8xMTExYiAqLworCSJSZXMgMHgxMDAgZXJyb3IiLAkJLyogMV8wMDAwYiAqLworCSJSZXMgMHgxMDEgZXJyb3IiLAkJLyogMV8wMDAxYiAqLworCSJSZXMgMHgxMDIgZXJyb3IiLAkJLyogMV8wMDEwYiAqLworCSJSZXMgMHgxMDMgZXJyb3IiLAkJLyogMV8wMDExYiAqLworCSJSZXMgMHgxMDQgZXJyb3IiLAkJLyogMV8wMTAwYiAqLworCSJSZXMgMHgxMDUgZXJyb3IiLAkJLyogMV8wMTAxYiAqLworCSJSZXMgMHgxMDYgZXJyb3IiLAkJLyogMV8wMTEwYiAqLworCSJSZXMgMHgxMDcgZXJyb3IiLAkJLyogMV8wMTExYiAqLworCSJSZXMgMHgxMDggZXJyb3IiLAkJLyogMV8xMDAwYiAqLworCSJSZXMgMHgxMDkgZXJyb3IiLAkJLyogMV8xMDAxYiAqLworCSJSZXMgMHgxMEEgZXJyb3IiLAkJLyogMV8xMDEwYiAqLworCSJSZXMgMHgxMEIgZXJyb3IiLAkJLyogMV8xMDExYiAqLworCSJMMyBDYWNoZSBEYXRhIGVycm9yIiwJCS8qIDFfMTEwMGIgKi8KKwkiTDMgQ2FjaGVUYWcgZXJyb3IiLAkJLyogMV8xMTAxYiAqLworCSJMMyBDYWNoZSBMUlUgZXJyb3IiLAkJLyogMV8xMTEwYiAqLworCSJSZXMgMHgxRkYgZXJyb3IiCQkvKiAxXzExMTFiICovCit9OworCitjb25zdCBjaGFyICpodGxpbmtfbXNnc1tdID0geworCSJub25lIiwKKwkiMSIsCisJIjIiLAorCSIxIDIiLAorCSIzIiwKKwkiMSAzIiwKKwkiMiAzIiwKKwkiMSAyIDMiCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWNfaW5qLmMgYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19pbmouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY3NWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWNfaW5qLmMKQEAgLTAsMCArMSwxODUgQEAKKyNpbmNsdWRlICJhbWQ2NF9lZGFjLmgiCisKKy8qCisgKiBzdG9yZSBlcnJvciBpbmplY3Rpb24gc2VjdGlvbiB2YWx1ZSB3aGljaCByZWZlcnMgdG8gb25lIG9mIDQgMTYtYnl0ZSBzZWN0aW9ucworICogd2l0aGluIGEgNjQtYnl0ZSBjYWNoZWxpbmUKKyAqCisgKiByYW5nZTogMC4uMworICovCitzdGF0aWMgc3NpemVfdCBhbWQ2NF9pbmplY3Rfc2VjdGlvbl9zdG9yZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCSAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGRhdGEsIDEwLCAmdmFsdWUpOworCWlmIChyZXQgIT0gLUVJTlZBTCkgeworCQlwdnQtPmluamVjdGlvbi5zZWN0aW9uID0gKHUzMikgdmFsdWU7CisJCXJldHVybiBjb3VudDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHN0b3JlIGVycm9yIGluamVjdGlvbiB3b3JkIHZhbHVlIHdoaWNoIHJlZmVycyB0byBvbmUgb2YgOSAxNi1iaXQgd29yZCBvZiB0aGUKKyAqIDE2LWJ5dGUgKDEyOC1iaXQgKyBFQ0MgYml0cykgc2VjdGlvbgorICoKKyAqIHJhbmdlOiAwLi44CisgKi8KK3N0YXRpYyBzc2l6ZV90IGFtZDY0X2luamVjdF93b3JkX3N0b3JlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGRhdGEsIDEwLCAmdmFsdWUpOworCWlmIChyZXQgIT0gLUVJTlZBTCkgeworCisJCXZhbHVlID0gKHZhbHVlIDw9IDgpID8gdmFsdWUgOiAwOworCQlwdnQtPmluamVjdGlvbi53b3JkID0gKHUzMikgdmFsdWU7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3RvcmUgMTYgYml0IGVycm9yIGluamVjdGlvbiB2ZWN0b3Igd2hpY2ggZW5hYmxlcyBpbmplY3RpbmcgZXJyb3JzIHRvIHRoZQorICogY29ycmVzcG9uZGluZyBiaXQgd2l0aGluIHRoZSBlcnJvciBpbmplY3Rpb24gd29yZCBhYm92ZS4gV2hlbiB1c2VkIGR1cmluZyBhCisgKiBEUkFNIEVDQyByZWFkLCBpdCBob2xkcyB0aGUgY29udGVudHMgb2YgdGhlIG9mIHRoZSBEUkFNIEVDQyBiaXRzLgorICovCitzdGF0aWMgc3NpemVfdCBhbWQ2NF9pbmplY3RfZWNjX3ZlY3Rvcl9zdG9yZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCSAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGRhdGEsIDE2LCAmdmFsdWUpOworCWlmIChyZXQgIT0gLUVJTlZBTCkgeworCisJCXB2dC0+aW5qZWN0aW9uLmJpdF9tYXAgPSAodTMyKSB2YWx1ZSAmIDB4RkZGRjsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEbyBhIERSQU0gRUNDIHJlYWQuIEFzc2VtYmxlIHN0YWdlZCB2YWx1ZXMgaW4gdGhlIHB2dCBhcmVhLCBmb3JtYXQgaW50bworICogZmllbGRzIG5lZWRlZCBieSB0aGUgaW5qZWN0aW9uIHJlZ2lzdGVycyBhbmQgcmVhZCB0aGUgTkIgQXJyYXkgRGF0YSBQb3J0LgorICovCitzdGF0aWMgc3NpemVfdCBhbWQ2NF9pbmplY3RfcmVhZF9zdG9yZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCWNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdTMyIHNlY3Rpb24sIHdvcmRfYml0czsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGRhdGEsIDEwLCAmdmFsdWUpOworCWlmIChyZXQgIT0gLUVJTlZBTCkgeworCisJCS8qIEZvcm0gdmFsdWUgdG8gY2hvb3NlIDE2LWJ5dGUgc2VjdGlvbiBvZiBjYWNoZWxpbmUgKi8KKwkJc2VjdGlvbiA9IEYxMF9OQl9BUlJBWV9EUkFNX0VDQyB8CisJCQkJU0VUX05CX0FSUkFZX0FERFJFU1MocHZ0LT5pbmplY3Rpb24uc2VjdGlvbik7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwKKwkJCQkJRjEwX05CX0FSUkFZX0FERFIsIHNlY3Rpb24pOworCisJCXdvcmRfYml0cyA9IFNFVF9OQl9EUkFNX0lOSkVDVElPTl9SRUFEKHB2dC0+aW5qZWN0aW9uLndvcmQsCisJCQkJCQlwdnQtPmluamVjdGlvbi5iaXRfbWFwKTsKKworCQkvKiBJc3N1ZSAnd29yZCcgYW5kICdiaXQnIGFsb25nIHdpdGggdGhlIFJFQUQgcmVxdWVzdCAqLworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHB2dC0+bWlzY19mM19jdGwsCisJCQkJCUYxMF9OQl9BUlJBWV9EQVRBLCB3b3JkX2JpdHMpOworCisJCWRlYnVnZjAoInNlY3Rpb249MHgleCB3b3JkX2JpdHM9MHgleFxuIiwgc2VjdGlvbiwgd29yZF9iaXRzKTsKKworCQlyZXR1cm4gY291bnQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBEbyBhIERSQU0gRUNDIHdyaXRlLiBBc3NlbWJsZSBzdGFnZWQgdmFsdWVzIGluIHRoZSBwdnQgYXJlYSBhbmQgZm9ybWF0IGludG8KKyAqIGZpZWxkcyBuZWVkZWQgYnkgdGhlIGluamVjdGlvbiByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGFtZDY0X2luamVjdF93cml0ZV9zdG9yZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCisJCQkJCWNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdTMyIHNlY3Rpb24sIHdvcmRfYml0czsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGRhdGEsIDEwLCAmdmFsdWUpOworCWlmIChyZXQgIT0gLUVJTlZBTCkgeworCisJCS8qIEZvcm0gdmFsdWUgdG8gY2hvb3NlIDE2LWJ5dGUgc2VjdGlvbiBvZiBjYWNoZWxpbmUgKi8KKwkJc2VjdGlvbiA9IEYxMF9OQl9BUlJBWV9EUkFNX0VDQyB8CisJCQkJU0VUX05CX0FSUkFZX0FERFJFU1MocHZ0LT5pbmplY3Rpb24uc2VjdGlvbik7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocHZ0LT5taXNjX2YzX2N0bCwKKwkJCQkJRjEwX05CX0FSUkFZX0FERFIsIHNlY3Rpb24pOworCisJCXdvcmRfYml0cyA9IFNFVF9OQl9EUkFNX0lOSkVDVElPTl9XUklURShwdnQtPmluamVjdGlvbi53b3JkLAorCQkJCQkJcHZ0LT5pbmplY3Rpb24uYml0X21hcCk7CisKKwkJLyogSXNzdWUgJ3dvcmQnIGFuZCAnYml0JyBhbG9uZyB3aXRoIHRoZSBSRUFEIHJlcXVlc3QgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwdnQtPm1pc2NfZjNfY3RsLAorCQkJCQlGMTBfTkJfQVJSQVlfREFUQSwgd29yZF9iaXRzKTsKKworCQlkZWJ1Z2YwKCJzZWN0aW9uPTB4JXggd29yZF9iaXRzPTB4JXhcbiIsIHNlY3Rpb24sIHdvcmRfYml0cyk7CisKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogdXBkYXRlIE5VTV9JTkpfQVRUUlMgaW4gY2FzZSB5b3UgYWRkIG5ldyBtZW1iZXJzCisgKi8KK3N0cnVjdCBtY2lkZXZfc3lzZnNfYXR0cmlidXRlIGFtZDY0X2lual9hdHRyc1tdID0geworCisJeworCQkuYXR0ciA9IHsKKwkJCS5uYW1lID0gImluamVjdF9zZWN0aW9uIiwKKwkJCS5tb2RlID0gKFNfSVJVR08gfCBTX0lXVVNSKQorCQl9LAorCQkuc2hvdyA9IE5VTEwsCisJCS5zdG9yZSA9IGFtZDY0X2luamVjdF9zZWN0aW9uX3N0b3JlLAorCX0sCisJeworCQkuYXR0ciA9IHsKKwkJCS5uYW1lID0gImluamVjdF93b3JkIiwKKwkJCS5tb2RlID0gKFNfSVJVR08gfCBTX0lXVVNSKQorCQl9LAorCQkuc2hvdyA9IE5VTEwsCisJCS5zdG9yZSA9IGFtZDY0X2luamVjdF93b3JkX3N0b3JlLAorCX0sCisJeworCQkuYXR0ciA9IHsKKwkJCS5uYW1lID0gImluamVjdF9lY2NfdmVjdG9yIiwKKwkJCS5tb2RlID0gKFNfSVJVR08gfCBTX0lXVVNSKQorCQl9LAorCQkuc2hvdyA9IE5VTEwsCisJCS5zdG9yZSA9IGFtZDY0X2luamVjdF9lY2NfdmVjdG9yX3N0b3JlLAorCX0sCisJeworCQkuYXR0ciA9IHsKKwkJCS5uYW1lID0gImluamVjdF93cml0ZSIsCisJCQkubW9kZSA9IChTX0lSVUdPIHwgU19JV1VTUikKKwkJfSwKKwkJLnNob3cgPSBOVUxMLAorCQkuc3RvcmUgPSBhbWQ2NF9pbmplY3Rfd3JpdGVfc3RvcmUsCisJfSwKKwl7CisJCS5hdHRyID0geworCQkJLm5hbWUgPSAiaW5qZWN0X3JlYWQiLAorCQkJLm1vZGUgPSAoU19JUlVHTyB8IFNfSVdVU1IpCisJCX0sCisJCS5zaG93ID0gTlVMTCwKKwkJLnN0b3JlID0gYW1kNjRfaW5qZWN0X3JlYWRfc3RvcmUsCisJfSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmggYi9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmgKaW5kZXggNmFkOTVjOC4uNDhkM2IxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaApAQCAtNzYsMTAgKzc2LDExIEBACiBleHRlcm4gaW50IGVkYWNfZGVidWdfbGV2ZWw7CiAKICNpZm5kZWYgQ09ORklHX0VEQUNfREVCVUdfVkVSQk9TRQotI2RlZmluZSBlZGFjX2RlYnVnX3ByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJaWYgKGxldmVsIDw9IGVkYWNfZGVidWdfbGV2ZWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJZWRhY19wcmludGsoS0VSTl9ERUJVRywgRURBQ19ERUJVRywgZm10LCAjI2FyZyk7IFwKKyNkZWZpbmUgZWRhY19kZWJ1Z19wcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAobGV2ZWwgPD0gZWRhY19kZWJ1Z19sZXZlbCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWVkYWNfcHJpbnRrKEtFUk5fREVCVUcsIEVEQUNfREVCVUcsCQlcCisJCQkJICAgICIlczogIiBmbXQsIF9fZnVuY19fLCAjI2FyZyk7CVwKIAl9IHdoaWxlICgwKQogI2Vsc2UgIC8qIENPTkZJR19FREFDX0RFQlVHX1ZFUkJPU0UgKi8KICNkZWZpbmUgZWRhY19kZWJ1Z19wcmludGsobGV2ZWwsIGZtdCwgYXJnLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKaW5kZXggNWYxYjU0MC4uMjRjODRhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwpAQCAtNTk2LDYgKzU5Niw3IEBACiAKIAlyZXR1cm4geWVhcjsKIH0KK0VYUE9SVF9TWU1CT0woZG1pX2dldF95ZWFyKTsKIAogLyoqCiAgKglkbWlfd2FsayAtIFdhbGsgdGhlIERNSSB0YWJsZSBhbmQgZ2V0IGNhbGxlZCBiYWNrIGZvciBldmVyeSByZWNvcmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNoNzc2MC5jCmluZGV4IGJhYTI4YjcuLmI5NjgwZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2g3NzYwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaDc3NjAuYwpAQCAtMzk2LDcgKzM5Niw3IEBACiAJc2lnbmVkIGNoYXIgY2RmLCBjZGZtOwogCWludCBzY2dkLCBzY2dkbSwgc2NnZHM7CiAKLQltY2xrID0gY2xrX2dldChOVUxMLCAibW9kdWxlX2NsayIpOworCW1jbGsgPSBjbGtfZ2V0KE5VTEwsICJwZXJpcGhlcmFsX2NsayIpOwogCWlmIChJU19FUlIobWNsaykpIHsKIAkJcmV0dXJuIFBUUl9FUlIobWNsayk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2FsaW0xNXgzLmMgYi9kcml2ZXJzL2lkZS9hbGltMTV4My5jCmluZGV4IDUzN2RhMWMuLmU1OWI2ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2FsaW0xNXgzLmMKKysrIGIvZHJpdmVycy9pZGUvYWxpbTE1eDMuYwpAQCAtNDAyLDI3ICs0MDIsMjMgQEAKIAlyZXR1cm4gY2JsOwogfQogCi0jaWYgIWRlZmluZWQoQ09ORklHX1NQQVJDNjQpICYmICFkZWZpbmVkKENPTkZJR19QUEMpCisjaWZuZGVmIENPTkZJR19TUEFSQzY0CiAvKioKICAqCWluaXRfaHdpZl9hbGkxNXgzCS0JSW5pdGlhbGl6ZSB0aGUgQUxJIElERSB4ODYgc3R1ZmYKICAqCUBod2lmOiBpbnRlcmZhY2UgdG8gY29uZmlndXJlCiAgKgogICoJT2J0YWluIHRoZSBJUlEgdGFibGVzIGZvciBhbiBBTGkgYmFzZWQgSURFIHNvbHV0aW9uIG9uIHRoZSBQQwogICoJY2xhc3MgcGxhdGZvcm1zLiBUaGlzIHBhcnQgb2YgdGhlIGNvZGUgaXNuJ3QgYXBwbGljYWJsZSB0byB0aGUKLSAqCVNwYXJjIGFuZCBQb3dlclBDIHN5c3RlbXMuCisgKglTcGFyYyBzeXN0ZW1zLgogICovCiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2h3aWZfYWxpMTV4MyAoaWRlX2h3aWZfdCAqaHdpZikKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gdG9fcGNpX2Rldihod2lmLT5kZXYpOwogCXU4IGlkZWljLCBpbm1pcjsKIAlzOCBpcnFfcm91dGluZ190YWJsZVtdID0geyAtMSwgIDksIDMsIDEwLCA0LCAgNSwgNywgIDYsCiAJCQkJICAgICAgMSwgMTEsIDAsIDEyLCAwLCAxNCwgMCwgMTUgfTsKIAlpbnQgaXJxID0gLTE7CiAKLQlpZiAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9BTF9NNTIyOSkKLQkJaHdpZi0+aXJxID0gaHdpZi0+Y2hhbm5lbCA/IDE1IDogMTQ7Ci0KIAlpZiAoaXNhX2RldikgewogCQkvKgogCQkgKiByZWFkIElERSBpbnRlcmZhY2UgY29udHJvbApAQCAtNDU1LDcgKzQ1MSw3IEBACiB9CiAjZWxzZQogI2RlZmluZSBpbml0X2h3aWZfYWxpMTV4MyBOVUxMCi0jZW5kaWYgLyogIWRlZmluZWQoQ09ORklHX1NQQVJDNjQpICYmICFkZWZpbmVkKENPTkZJR19QUEMpICovCisjZW5kaWYgLyogQ09ORklHX1NQQVJDNjQgKi8KIAogLyoqCiAgKglpbml0X2RtYV9hbGkxNXgzCS0Jc2V0IHVwIERNQSBvbiBBTGkxNXgzCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtYXRhcGkuYyBiL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCmluZGV4IDcyMDFiMTcuLjc1N2U1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1hdGFwaS5jCkBAIC04MCwzNCArODAsNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2luaXRfcGMpOwogCiAvKgotICogR2VuZXJhdGUgYSBuZXcgcGFja2V0IGNvbW1hbmQgcmVxdWVzdCBpbiBmcm9udCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSwgYmVmb3JlCi0gKiB0aGUgY3VycmVudCByZXF1ZXN0LCBzbyB0aGF0IGl0IHdpbGwgYmUgcHJvY2Vzc2VkIGltbWVkaWF0ZWx5LCBvbiB0aGUgbmV4dAotICogcGFzcyB0aHJvdWdoIHRoZSBkcml2ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIGlkZV9xdWV1ZV9wY19oZWFkKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGdlbmRpc2sgKmRpc2ssCi0JCQkgICAgICBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywgc3RydWN0IHJlcXVlc3QgKnJxKQotewotCWJsa19ycV9pbml0KE5VTEwsIHJxKTsKLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwotCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1BSRUVNUFQ7Ci0JcnEtPmJ1ZmZlciA9IChjaGFyICopcGM7Ci0JcnEtPnJxX2Rpc2sgPSBkaXNrOwotCi0JaWYgKHBjLT5yZXFfeGZlcikgewotCQlycS0+ZGF0YSA9IHBjLT5idWY7Ci0JCXJxLT5kYXRhX2xlbiA9IHBjLT5yZXFfeGZlcjsKLQl9Ci0KLQltZW1jcHkocnEtPmNtZCwgcGMtPmMsIDEyKTsKLQlpZiAoZHJpdmUtPm1lZGlhID09IGlkZV90YXBlKQotCQlycS0+Y21kWzEzXSA9IFJFUV9JREVUQVBFX1BDMTsKLQotCWRyaXZlLT5od2lmLT5ycSA9IE5VTEw7Ci0KLQllbHZfYWRkX3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBycSwgRUxFVkFUT1JfSU5TRVJUX0ZST05ULCAwKTsKLX0KLQotLyoKICAqIEFkZCBhIHNwZWNpYWwgcGFja2V0IGNvbW1hbmQgcmVxdWVzdCB0byB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSwKICAqIGFuZCB3YWl0IGZvciBpdCB0byBiZSBzZXJ2aWNlZC4KICAqLwpAQCAtMTE5LDE5ICs5MSwyMSBAQAogCiAJcnEgPSBibGtfZ2V0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBSRUFELCBfX0dGUF9XQUlUKTsKIAlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TUEVDSUFMOwotCXJxLT5idWZmZXIgPSAoY2hhciAqKXBjOworCXJxLT5zcGVjaWFsID0gKGNoYXIgKilwYzsKIAogCWlmIChwYy0+cmVxX3hmZXIpIHsKLQkJcnEtPmRhdGEgPSBwYy0+YnVmOwotCQlycS0+ZGF0YV9sZW4gPSBwYy0+cmVxX3hmZXI7CisJCWVycm9yID0gYmxrX3JxX21hcF9rZXJuKGRyaXZlLT5xdWV1ZSwgcnEsIHBjLT5idWYsIHBjLT5yZXFfeGZlciwKKwkJCQkJR0ZQX05PSU8pOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIHB1dF9yZXE7CiAJfQogCiAJbWVtY3B5KHJxLT5jbWQsIHBjLT5jLCAxMik7CiAJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfdGFwZSkKIAkJcnEtPmNtZFsxM10gPSBSRVFfSURFVEFQRV9QQzE7CiAJZXJyb3IgPSBibGtfZXhlY3V0ZV9ycShkcml2ZS0+cXVldWUsIGRpc2ssIHJxLCAwKTsKK3B1dF9yZXE6CiAJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKLQogCXJldHVybiBlcnJvcjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9xdWV1ZV9wY190YWlsKTsKQEAgLTE5MSwyMCArMTY1LDExMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZCk7CiAKK3ZvaWQgaWRlX3ByZXBfc2Vuc2UoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJc3RydWN0IHJlcXVlc3Rfc2Vuc2UgKnNlbnNlID0gJmRyaXZlLT5zZW5zZV9kYXRhOworCXN0cnVjdCByZXF1ZXN0ICpzZW5zZV9ycSA9ICZkcml2ZS0+c2Vuc2VfcnE7CisJdW5zaWduZWQgaW50IGNtZF9sZW4sIHNlbnNlX2xlbjsKKwlpbnQgZXJyOworCisJZGVidWdfbG9nKCIlczogZW50ZXJcbiIsIF9fZnVuY19fKTsKKworCXN3aXRjaCAoZHJpdmUtPm1lZGlhKSB7CisJY2FzZSBpZGVfZmxvcHB5OgorCQljbWRfbGVuID0gMjU1OworCQlzZW5zZV9sZW4gPSAxODsKKwkJYnJlYWs7CisJY2FzZSBpZGVfdGFwZToKKwkJY21kX2xlbiA9IDIwOworCQlzZW5zZV9sZW4gPSAyMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY21kX2xlbiA9IDE4OworCQlzZW5zZV9sZW4gPSAxODsKKwl9CisKKwlCVUdfT04oc2Vuc2VfbGVuID4gc2l6ZW9mKCpzZW5zZSkpOworCisJaWYgKGJsa19zZW5zZV9yZXF1ZXN0KHJxKSB8fCBkcml2ZS0+c2Vuc2VfcnFfYXJtZWQpCisJCXJldHVybjsKKworCW1lbXNldChzZW5zZSwgMCwgc2l6ZW9mKCpzZW5zZSkpOworCisJYmxrX3JxX2luaXQocnEtPnEsIHNlbnNlX3JxKTsKKworCWVyciA9IGJsa19ycV9tYXBfa2Vybihkcml2ZS0+cXVldWUsIHNlbnNlX3JxLCBzZW5zZSwgc2Vuc2VfbGVuLAorCQkJICAgICAgR0ZQX05PSU8pOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIG1hcCBzZW5zZSBidWZmZXJcbiIsCisJCQkgICAgICAgZHJpdmUtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJc2Vuc2VfcnEtPnJxX2Rpc2sgPSBycS0+cnFfZGlzazsKKwlzZW5zZV9ycS0+Y21kWzBdID0gR1BDTURfUkVRVUVTVF9TRU5TRTsKKwlzZW5zZV9ycS0+Y21kWzRdID0gY21kX2xlbjsKKwlzZW5zZV9ycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TRU5TRTsKKwlzZW5zZV9ycS0+Y21kX2ZsYWdzIHw9IFJFUV9QUkVFTVBUOworCisJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfdGFwZSkKKwkJc2Vuc2VfcnEtPmNtZFsxM10gPSBSRVFfSURFVEFQRV9QQzE7CisKKwlkcml2ZS0+c2Vuc2VfcnFfYXJtZWQgPSB0cnVlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3ByZXBfc2Vuc2UpOworCitpbnQgaWRlX3F1ZXVlX3NlbnNlX3JxKGlkZV9kcml2ZV90ICpkcml2ZSwgdm9pZCAqc3BlY2lhbCkKK3sKKwkvKiBkZWZlcnJlZCBmYWlsdXJlIGZyb20gaWRlX3ByZXBfc2Vuc2UoKSAqLworCWlmICghZHJpdmUtPnNlbnNlX3JxX2FybWVkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmYWlsZWQgcXVldWUgc2Vuc2UgcmVxdWVzdFxuIiwKKwkJICAgICAgIGRyaXZlLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZHJpdmUtPnNlbnNlX3JxLnNwZWNpYWwgPSBzcGVjaWFsOworCWRyaXZlLT5zZW5zZV9ycV9hcm1lZCA9IGZhbHNlOworCisJZHJpdmUtPmh3aWYtPnJxID0gTlVMTDsKKworCWVsdl9hZGRfcmVxdWVzdChkcml2ZS0+cXVldWUsICZkcml2ZS0+c2Vuc2VfcnEsCisJCQlFTEVWQVRPUl9JTlNFUlRfRlJPTlQsIDApOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3F1ZXVlX3NlbnNlX3JxKTsKKwogLyoKICAqIENhbGxlZCB3aGVuIGFuIGVycm9yIHdhcyBkZXRlY3RlZCBkdXJpbmcgdGhlIGxhc3QgcGFja2V0IGNvbW1hbmQuCi0gKiBXZSBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgcGFja2V0IGNvbW1hbmQgaW4gdGhlIGhlYWQgb2YgdGhlIHJlcXVlc3QgbGlzdC4KKyAqIFdlIHF1ZXVlIGEgcmVxdWVzdCBzZW5zZSBwYWNrZXQgY29tbWFuZCBhdCB0aGUgaGVhZCBvZiB0aGUgcmVxdWVzdAorICogcXVldWUuCiAgKi8KLXZvaWQgaWRlX3JldHJ5X3BjKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGdlbmRpc2sgKmRpc2spCit2b2lkIGlkZV9yZXRyeV9wYyhpZGVfZHJpdmVfdCAqZHJpdmUpCiB7Ci0Jc3RydWN0IHJlcXVlc3QgKnJxID0gJmRyaXZlLT5yZXF1ZXN0X3NlbnNlX3JxOworCXN0cnVjdCByZXF1ZXN0ICpmYWlsZWRfcnEgPSBkcml2ZS0+aHdpZi0+cnE7CisJc3RydWN0IHJlcXVlc3QgKnNlbnNlX3JxID0gJmRyaXZlLT5zZW5zZV9ycTsKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYyA9ICZkcml2ZS0+cmVxdWVzdF9zZW5zZV9wYzsKIAogCSh2b2lkKWlkZV9yZWFkX2Vycm9yKGRyaXZlKTsKLQlpZGVfY3JlYXRlX3JlcXVlc3Rfc2Vuc2VfY21kKGRyaXZlLCBwYyk7CisKKwkvKiBpbml0IHBjIGZyb20gc2Vuc2VfcnEgKi8KKwlpZGVfaW5pdF9wYyhwYyk7CisJbWVtY3B5KHBjLT5jLCBzZW5zZV9ycS0+Y21kLCAxMik7CisJcGMtPmJ1ZiA9IGJpb19kYXRhKHNlbnNlX3JxLT5iaW8pOwkvKiBwb2ludGVyIHRvIG1hcHBlZCBhZGRyZXNzICovCisJcGMtPnJlcV94ZmVyID0gYmxrX3JxX2J5dGVzKHNlbnNlX3JxKTsKKwogCWlmIChkcml2ZS0+bWVkaWEgPT0gaWRlX3RhcGUpCiAJCXNldF9iaXQoSURFX0FGTEFHX0lHTk9SRV9EU0MsICZkcml2ZS0+YXRhcGlfZmxhZ3MpOwotCWlkZV9xdWV1ZV9wY19oZWFkKGRyaXZlLCBkaXNrLCBwYywgcnEpOworCisJLyoKKwkgKiBQdXNoIGJhY2sgdGhlIGZhaWxlZCByZXF1ZXN0IGFuZCBwdXQgcmVxdWVzdCBzZW5zZSBvbiB0b3AKKwkgKiBvZiBpdC4gIFRoZSBmYWlsZWQgY29tbWFuZCB3aWxsIGJlIHJldHJpZWQgYWZ0ZXIgc2Vuc2UgZGF0YQorCSAqIGlzIGFjcXVpcmVkLgorCSAqLworCWJsa19yZXF1ZXVlX3JlcXVlc3QoZmFpbGVkX3JxLT5xLCBmYWlsZWRfcnEpOworCWRyaXZlLT5od2lmLT5ycSA9IE5VTEw7CisJaWYgKGlkZV9xdWV1ZV9zZW5zZV9ycShkcml2ZSwgcGMpKSB7CisJCWJsa19zdGFydF9yZXF1ZXN0KGZhaWxlZF9ycSk7CisJCWlkZV9jb21wbGV0ZV9ycShkcml2ZSwgLUVJTywgYmxrX3JxX2J5dGVzKGZhaWxlZF9ycSkpOworCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9yZXRyeV9wYyk7CiAKQEAgLTI0Niw3ICszMTMsNyBAQAogCQlyZXR1cm4gMzI3Njg7CiAJZWxzZSBpZiAoYmxrX3NlbnNlX3JlcXVlc3QocnEpIHx8IGJsa19wY19yZXF1ZXN0KHJxKSB8fAogCQkJIHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9BVEFfUEMpCi0JCXJldHVybiBycS0+ZGF0YV9sZW47CisJCXJldHVybiBibGtfcnFfYnl0ZXMocnEpOwogCWVsc2UKIAkJcmV0dXJuIDA7CiB9CkBAIC0yNzYsNyArMzQzLDYgQEAKIAlzdHJ1Y3QgaWRlX2NtZCAqY21kID0gJmh3aWYtPmNtZDsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBod2lmLT5ycTsKIAljb25zdCBzdHJ1Y3QgaWRlX3RwX29wcyAqdHBfb3BzID0gaHdpZi0+dHBfb3BzOwotCXhmZXJfZnVuY190ICp4ZmVyZnVuYzsKIAl1bnNpZ25lZCBpbnQgdGltZW91dCwgZG9uZTsKIAl1MTYgYmNvdW50OwogCXU4IHN0YXQsIGlyZWFzb24sIGRzYyA9IDA7CkBAIC0zMDMsMTggKzM2OSwxNCBAQAogCQkJCQlkcml2ZS0+bmFtZSwgcnFfZGF0YV9kaXIocGMtPnJxKQogCQkJCQkJICAgICA/ICJ3cml0ZSIgOiAicmVhZCIpOwogCQkJcGMtPmZsYWdzIHw9IFBDX0ZMQUdfRE1BX0VSUk9SOwotCQl9IGVsc2UgeworCQl9IGVsc2UKIAkJCXBjLT54ZmVycmVkID0gcGMtPnJlcV94ZmVyOwotCQkJaWYgKGRyaXZlLT5wY191cGRhdGVfYnVmZmVycykKLQkJCQlkcml2ZS0+cGNfdXBkYXRlX2J1ZmZlcnMoZHJpdmUsIHBjKTsKLQkJfQogCQlkZWJ1Z19sb2coIiVzOiBETUEgZmluaXNoZWRcbiIsIGRyaXZlLT5uYW1lKTsKIAl9CiAKIAkvKiBObyBtb3JlIGludGVycnVwdHMgKi8KIAlpZiAoKHN0YXQgJiBBVEFfRFJRKSA9PSAwKSB7CiAJCWludCB1cHRvZGF0ZSwgZXJyb3I7Ci0JCXVuc2lnbmVkIGludCBkb25lOwogCiAJCWRlYnVnX2xvZygiUGFja2V0IGNvbW1hbmQgY29tcGxldGVkLCAlZCBieXRlcyB0cmFuc2ZlcnJlZFxuIiwKIAkJCSAgcGMtPnhmZXJyZWQpOwpAQCAtMzQzLDcgKzQwNSw3IEBACiAJCQlkZWJ1Z19sb2coIltjbWQgJXhdOiBjaGVjayBjb25kaXRpb25cbiIsIHJxLT5jbWRbMF0pOwogCiAJCQkvKiBSZXRyeSBvcGVyYXRpb24gKi8KLQkJCWlkZV9yZXRyeV9wYyhkcml2ZSwgcnEtPnJxX2Rpc2spOworCQkJaWRlX3JldHJ5X3BjKGRyaXZlKTsKIAogCQkJLyogcXVldWVkLCBidXQgbm90IHN0YXJ0ZWQgKi8KIAkJCXJldHVybiBpZGVfc3RvcHBlZDsKQEAgLTM1Myw2ICs0MTUsMTIgQEAKIAkJaWYgKChwYy0+ZmxhZ3MgJiBQQ19GTEFHX1dBSVRfRk9SX0RTQykgJiYgKHN0YXQgJiBBVEFfRFNDKSA9PSAwKQogCQkJZHNjID0gMTsKIAorCQkvKgorCQkgKiAtPnBjX2NhbGxiYWNrKCkgbWlnaHQgY2hhbmdlIHJxLT5kYXRhX2xlbiBmb3IKKwkJICogcmVzaWR1YWwgY291bnQsIGNhY2hlIHRvdGFsIGxlbmd0aC4KKwkJICovCisJCWRvbmUgPSBibGtfcnFfYnl0ZXMocnEpOworCiAJCS8qIENvbW1hbmQgZmluaXNoZWQgLSBDYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwogCQl1cHRvZGF0ZSA9IGRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSwgZHNjKTsKIApAQCAtMzYxLDcgKzQyOSw2IEBACiAKIAkJaWYgKGJsa19zcGVjaWFsX3JlcXVlc3QocnEpKSB7CiAJCQlycS0+ZXJyb3JzID0gMDsKLQkJCWRvbmUgPSBibGtfcnFfYnl0ZXMocnEpOwogCQkJZXJyb3IgPSAwOwogCQl9IGVsc2UgewogCkBAIC0zNzAsMTUgKzQzNywxMCBAQAogCQkJCQlycS0+ZXJyb3JzID0gLUVJTzsKIAkJCX0KIAotCQkJaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfdGFwZSkKLQkJCQlkb25lID0gaWRlX3JxX2J5dGVzKHJxKTsgLyogRklYTUUgKi8KLQkJCWVsc2UKLQkJCQlkb25lID0gYmxrX3JxX2J5dGVzKHJxKTsKLQogCQkJZXJyb3IgPSB1cHRvZGF0ZSA/IDAgOiAtRUlPOwogCQl9CiAKLQkJaWRlX2NvbXBsZXRlX3JxKGRyaXZlLCBlcnJvciwgZG9uZSk7CisJCWlkZV9jb21wbGV0ZV9ycShkcml2ZSwgZXJyb3IsIGJsa19ycV9ieXRlcyhycSkpOwogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCkBAIC00MDcsMjEgKzQ2OSwxMSBAQAogCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKIAl9CiAKLQl4ZmVyZnVuYyA9IHdyaXRlID8gdHBfb3BzLT5vdXRwdXRfZGF0YSA6IHRwX29wcy0+aW5wdXRfZGF0YTsKKwlkb25lID0gbWluX3QodW5zaWduZWQgaW50LCBiY291bnQsIGNtZC0+bmxlZnQpOworCWlkZV9waW9fYnl0ZXMoZHJpdmUsIGNtZCwgd3JpdGUsIGRvbmUpOwogCi0JaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfZmxvcHB5ICYmIHBjLT5idWYgPT0gTlVMTCkgewotCQlkb25lID0gbWluX3QodW5zaWduZWQgaW50LCBiY291bnQsIGNtZC0+bmxlZnQpOwotCQlpZGVfcGlvX2J5dGVzKGRyaXZlLCBjbWQsIHdyaXRlLCBkb25lKTsKLQl9IGVsc2UgaWYgKGRyaXZlLT5tZWRpYSA9PSBpZGVfdGFwZSAmJiBwYy0+YmgpIHsKLQkJZG9uZSA9IGRyaXZlLT5wY19pb19idWZmZXJzKGRyaXZlLCBwYywgYmNvdW50LCB3cml0ZSk7Ci0JfSBlbHNlIHsKLQkJZG9uZSA9IG1pbl90KHVuc2lnbmVkIGludCwgYmNvdW50LCBwYy0+cmVxX3hmZXIgLSBwYy0+eGZlcnJlZCk7Ci0JCXhmZXJmdW5jKGRyaXZlLCBOVUxMLCBwYy0+Y3VyX3BvcywgZG9uZSk7Ci0JfQotCi0JLyogVXBkYXRlIHRoZSBjdXJyZW50IHBvc2l0aW9uICovCisJLyogVXBkYXRlIHRyYW5zZmVycmVkIGJ5dGUgY291bnQgKi8KIAlwYy0+eGZlcnJlZCArPSBkb25lOwotCXBjLT5jdXJfcG9zICs9IGRvbmU7CiAKIAliY291bnQgLT0gZG9uZTsKIApAQCAtNTk5LDcgKzY1MSw2IEBACiAKIAkJLyogV2UgaGF2ZW4ndCB0cmFuc2ZlcnJlZCBhbnkgZGF0YSB5ZXQgKi8KIAkJcGMtPnhmZXJyZWQgPSAwOwotCQlwYy0+Y3VyX3BvcyA9IHBjLT5idWY7CiAKIAkJdmFsaWRfdGYgPSBJREVfVkFMSURfREVWSUNFOwogCQliY291bnQgPSAoKGRyaXZlLT5tZWRpYSA9PSBpZGVfdGFwZSkgPwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmMgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwppbmRleCA5MjVlYjllLi40MjQxNDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtY2QuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtY2QuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJCQkJIChzZW5zZS0+aW5mb3JtYXRpb25bMl0gPDwgIDgpIHwKIAkJCQkgKHNlbnNlLT5pbmZvcm1hdGlvblszXSk7CiAKLQkJCWlmIChkcml2ZS0+cXVldWUtPmhhcmRzZWN0X3NpemUgPT0gMjA0OCkKKwkJCWlmIChxdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoZHJpdmUtPnF1ZXVlKSA9PSAyMDQ4KQogCQkJCS8qIGRldmljZSBzZWN0b3Igc2l6ZSBpcyAySyAqLwogCQkJCXNlY3RvciA8PD0gMjsKIApAQCAtMjA2LDU0ICsyMDYsMjUgQEAKIAlpZGVfY2RfbG9nX2Vycm9yKGRyaXZlLT5uYW1lLCBmYWlsZWRfY29tbWFuZCwgc2Vuc2UpOwogfQogCi1zdGF0aWMgdm9pZCBjZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGlkZV9kcml2ZV90ICpkcml2ZSwgdm9pZCAqc2Vuc2UsCi0JCQkJICAgICAgc3RydWN0IHJlcXVlc3QgKmZhaWxlZF9jb21tYW5kKQotewotCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvCQk9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgcmVxdWVzdCAqcnEJCT0gJmRyaXZlLT5yZXF1ZXN0X3NlbnNlX3JxOwotCi0JaWRlX2RlYnVnX2xvZyhJREVfREJHX1NFTlNFLCAiZW50ZXIiKTsKLQotCWlmIChzZW5zZSA9PSBOVUxMKQotCQlzZW5zZSA9ICZpbmZvLT5zZW5zZV9kYXRhOwotCi0JLyogc3R1ZmYgdGhlIHNlbnNlIHJlcXVlc3QgaW4gZnJvbnQgb2Ygb3VyIGN1cnJlbnQgcmVxdWVzdCAqLwotCWJsa19ycV9pbml0KE5VTEwsIHJxKTsKLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9BVEFfUEM7Ci0JcnEtPnJxX2Rpc2sgPSBpbmZvLT5kaXNrOwotCi0JcnEtPmRhdGEgPSBzZW5zZTsKLQlycS0+Y21kWzBdID0gR1BDTURfUkVRVUVTVF9TRU5TRTsKLQlycS0+Y21kWzRdID0gMTg7Ci0JcnEtPmRhdGFfbGVuID0gMTg7Ci0KLQlycS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9TRU5TRTsKLQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9QUkVFTVBUOwotCi0JLyogTk9URSEgU2F2ZSB0aGUgZmFpbGVkIGNvbW1hbmQgaW4gInJxLT5idWZmZXIiICovCi0JcnEtPmJ1ZmZlciA9ICh2b2lkICopIGZhaWxlZF9jb21tYW5kOwotCi0JaWYgKGZhaWxlZF9jb21tYW5kKQotCQlpZGVfZGVidWdfbG9nKElERV9EQkdfU0VOU0UsICJmYWlsZWRfY21kOiAweCV4IiwKLQkJCQkJICAgICBmYWlsZWRfY29tbWFuZC0+Y21kWzBdKTsKLQotCWRyaXZlLT5od2lmLT5ycSA9IE5VTEw7Ci0KLQllbHZfYWRkX3JlcXVlc3QoZHJpdmUtPnF1ZXVlLCBycSwgRUxFVkFUT1JfSU5TRVJUX0ZST05ULCAwKTsKLX0KLQogc3RhdGljIHZvaWQgaWRlX2NkX2NvbXBsZXRlX2ZhaWxlZF9ycShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAkvKgotCSAqIEZvciBSRVFfVFlQRV9TRU5TRSwgInJxLT5idWZmZXIiIHBvaW50cyB0byB0aGUgb3JpZ2luYWwKLQkgKiBmYWlsZWQgcmVxdWVzdAorCSAqIEZvciBSRVFfVFlQRV9TRU5TRSwgInJxLT5zcGVjaWFsIiBwb2ludHMgdG8gdGhlIG9yaWdpbmFsCisJICogZmFpbGVkIHJlcXVlc3QuICBBbHNvLCB0aGUgc2Vuc2UgZGF0YSBzaG91bGQgYmUgcmVhZAorCSAqIGRpcmVjdGx5IGZyb20gcnEgd2hpY2ggbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsCisJICogc2Vuc2UgYnVmZmVyIGlmIGl0IGdvdCBjb3BpZWQgZHVyaW5nIG1hcHBpbmcuCiAJICovCi0Jc3RydWN0IHJlcXVlc3QgKmZhaWxlZCA9IChzdHJ1Y3QgcmVxdWVzdCAqKXJxLT5idWZmZXI7Ci0Jc3RydWN0IGNkcm9tX2luZm8gKmluZm8gPSBkcml2ZS0+ZHJpdmVyX2RhdGE7Ci0Jdm9pZCAqc2Vuc2UgPSAmaW5mby0+c2Vuc2VfZGF0YTsKKwlzdHJ1Y3QgcmVxdWVzdCAqZmFpbGVkID0gKHN0cnVjdCByZXF1ZXN0ICopcnEtPnNwZWNpYWw7CisJdm9pZCAqc2Vuc2UgPSBiaW9fZGF0YShycS0+YmlvKTsKIAogCWlmIChmYWlsZWQpIHsKIAkJaWYgKGZhaWxlZC0+c2Vuc2UpIHsKKwkJCS8qCisJCQkgKiBTZW5zZSBpcyBhbHdheXMgcmVhZCBpbnRvIGRyaXZlLT5zZW5zZV9kYXRhLgorCQkJICogQ29weSBiYWNrIGlmIHRoZSBmYWlsZWQgcmVxdWVzdCBoYXMgaXRzCisJCQkgKiBzZW5zZSBwb2ludGVyIHNldC4KKwkJCSAqLworCQkJbWVtY3B5KGZhaWxlZC0+c2Vuc2UsIHNlbnNlLCAxOCk7CiAJCQlzZW5zZSA9IGZhaWxlZC0+c2Vuc2U7CiAJCQlmYWlsZWQtPnNlbnNlX2xlbiA9IHJxLT5zZW5zZV9sZW47CiAJCX0KQEAgLTQyOCwyMiArMzk5LDEzIEBACiAKIAkvKiBpZiB3ZSBnb3QgYSBDSEVDS19DT05ESVRJT04gc3RhdHVzLCBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZCAqLwogCWlmIChzdGF0ICYgQVRBX0VSUikKLQkJY2Ryb21fcXVldWVfcmVxdWVzdF9zZW5zZShkcml2ZSwgTlVMTCwgTlVMTCk7CisJCXJldHVybiBpZGVfcXVldWVfc2Vuc2VfcnEoZHJpdmUsIE5VTEwpID8gMiA6IDE7CiAJcmV0dXJuIDE7CiAKIGVuZF9yZXF1ZXN0OgogCWlmIChzdGF0ICYgQVRBX0VSUikgewotCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7Ci0JCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocnEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKLQogCQlod2lmLT5ycSA9IE5VTEw7Ci0KLQkJY2Ryb21fcXVldWVfcmVxdWVzdF9zZW5zZShkcml2ZSwgcnEtPnNlbnNlLCBycSk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gaWRlX3F1ZXVlX3NlbnNlX3JxKGRyaXZlLCBycSkgPyAyIDogMTsKIAl9IGVsc2UKIAkJcmV0dXJuIDI7CiB9CkBAIC01MDMsMTQgKzQ2NSw4IEBACiAJICogYW5kIHNvbWUgZHJpdmVzIGRvbid0IHNlbmQgdGhlbS4gIFNpZ2guCiAJICovCiAJaWYgKHJxLT5jbWRbMF0gPT0gR1BDTURfUkVRVUVTVF9TRU5TRSAmJgotCSAgICBjbWQtPm5sZWZ0ID4gMCAmJiBjbWQtPm5sZWZ0IDw9IDUpIHsKLQkJdW5zaWduZWQgaW50IG9mcyA9IGNtZC0+bmJ5dGVzIC0gY21kLT5ubGVmdDsKLQotCQl3aGlsZSAoY21kLT5ubGVmdCA+IDApIHsKLQkJCSooKHU4ICopcnEtPmRhdGEgKyBvZnMrKykgPSAwOwotCQkJY21kLT5ubGVmdC0tOwotCQl9Ci0JfQorCSAgICBjbWQtPm5sZWZ0ID4gMCAmJiBjbWQtPm5sZWZ0IDw9IDUpCisJCWNtZC0+bmxlZnQgPSAwOwogfQogCiBpbnQgaWRlX2NkX3F1ZXVlX3BjKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqY21kLApAQCAtNTQzLDE0ICs0OTksMTggQEAKIAkJcnEtPmNtZF9mbGFncyB8PSBjbWRfZmxhZ3M7CiAJCXJxLT50aW1lb3V0ID0gdGltZW91dDsKIAkJaWYgKGJ1ZmZlcikgewotCQkJcnEtPmRhdGEgPSBidWZmZXI7Ci0JCQlycS0+ZGF0YV9sZW4gPSAqYnVmZmxlbjsKKwkJCWVycm9yID0gYmxrX3JxX21hcF9rZXJuKGRyaXZlLT5xdWV1ZSwgcnEsIGJ1ZmZlciwKKwkJCQkJCSpidWZmbGVuLCBHRlBfTk9JTyk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlibGtfcHV0X3JlcXVlc3QocnEpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KIAkJfQogCiAJCWVycm9yID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBpbmZvLT5kaXNrLCBycSwgMCk7CiAKIAkJaWYgKGJ1ZmZlcikKLQkJCSpidWZmbGVuID0gcnEtPmRhdGFfbGVuOworCQkJKmJ1ZmZsZW4gPSBycS0+cmVzaWRfbGVuOwogCiAJCWZsYWdzID0gcnEtPmNtZF9mbGFnczsKIAkJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKQEAgLTYwOCw3ICs1NjgsNyBAQAogCXN0cnVjdCByZXF1ZXN0ICpycSA9IGh3aWYtPnJxOwogCWlkZV9leHBpcnlfdCAqZXhwaXJ5ID0gTlVMTDsKIAlpbnQgZG1hX2Vycm9yID0gMCwgZG1hLCB0aGlzbGVuLCB1cHRvZGF0ZSA9IDA7Ci0JaW50IHdyaXRlID0gKHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkgPyAxIDogMCwgcmMgPSAwLCBuc2VjdG9yczsKKwlpbnQgd3JpdGUgPSAocnFfZGF0YV9kaXIocnEpID09IFdSSVRFKSA/IDEgOiAwLCByYyA9IDA7CiAJaW50IHNlbnNlID0gYmxrX3NlbnNlX3JlcXVlc3QocnEpOwogCXVuc2lnbmVkIGludCB0aW1lb3V0OwogCXUxNiBsZW47CkBAIC03MzgsMTMgKzY5OCw4IEBACiAKIG91dF9lbmQ6CiAJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSAmJiByYyA9PSAwKSB7Ci0JCXVuc2lnbmVkIGludCBkbGVuID0gcnEtPmRhdGFfbGVuOwotCi0JCXJxLT5kYXRhX2xlbiA9IDA7Ci0KLQkJaWYgKGJsa19lbmRfcmVxdWVzdChycSwgMCwgZGxlbikpCi0JCQlCVUcoKTsKLQorCQlycS0+cmVzaWRfbGVuID0gMDsKKwkJYmxrX2VuZF9yZXF1ZXN0X2FsbChycSwgMCk7CiAJCWh3aWYtPnJxID0gTlVMTDsKIAl9IGVsc2UgewogCQlpZiAoc2Vuc2UgJiYgdXB0b2RhdGUpCkBAIC03NjIsMjEgKzcxNywxMyBAQAogCQkJaWRlX2NkX2Vycm9yX2NtZChkcml2ZSwgY21kKTsKIAogCQkvKiBtYWtlIHN1cmUgaXQncyBmdWxseSBlbmRlZCAqLwotCQlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKQotCQkJbnNlY3RvcnMgPSAocnEtPmRhdGFfbGVuICsgNTExKSA+PiA5OwotCQllbHNlCi0JCQluc2VjdG9ycyA9IHJxLT5oYXJkX25yX3NlY3RvcnM7Ci0KLQkJaWYgKG5zZWN0b3JzID09IDApCi0JCQluc2VjdG9ycyA9IDE7Ci0KIAkJaWYgKGJsa19mc19yZXF1ZXN0KHJxKSA9PSAwKSB7Ci0JCQlycS0+ZGF0YV9sZW4gLT0gKGNtZC0+bmJ5dGVzIC0gY21kLT5ubGVmdCk7CisJCQlycS0+cmVzaWRfbGVuIC09IGNtZC0+bmJ5dGVzIC0gY21kLT5ubGVmdDsKIAkJCWlmICh1cHRvZGF0ZSA9PSAwICYmIChjbWQtPnRmX2ZsYWdzICYgSURFX1RGTEFHX1dSSVRFKSkKLQkJCQlycS0+ZGF0YV9sZW4gKz0gY21kLT5sYXN0X3hmZXJfbGVuOworCQkJCXJxLT5yZXNpZF9sZW4gKz0gY21kLT5sYXN0X3hmZXJfbGVuOwogCQl9CiAKLQkJaWRlX2NvbXBsZXRlX3JxKGRyaXZlLCB1cHRvZGF0ZSA/IDAgOiAtRUlPLCBuc2VjdG9ycyA8PCA5KTsKKwkJaWRlX2NvbXBsZXRlX3JxKGRyaXZlLCB1cHRvZGF0ZSA/IDAgOiAtRUlPLCBibGtfcnFfYnl0ZXMocnEpKTsKIAogCQlpZiAoc2Vuc2UgJiYgcmMgPT0gMikKIAkJCWlkZV9lcnJvcihkcml2ZSwgInJlcXVlc3Qgc2Vuc2UgZmFpbHVyZSIsIHN0YXQpOwpAQCAtNzkwLDcgKzczNyw3IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkcml2ZS0+cXVldWU7CiAJaW50IHdyaXRlID0gcnFfZGF0YV9kaXIocnEpID09IFdSSVRFOwogCXVuc2lnbmVkIHNob3J0IHNlY3RvcnNfcGVyX2ZyYW1lID0KLQkJcXVldWVfaGFyZHNlY3Rfc2l6ZShxKSA+PiBTRUNUT1JfQklUUzsKKwkJcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEpID4+IFNFQ1RPUl9CSVRTOwogCiAJaWRlX2RlYnVnX2xvZyhJREVfREJHX1JRLCAicnEtPmNtZFswXTogMHgleCwgcnEtPmNtZF9mbGFnczogMHgleCwgIgogCQkJCSAgInNlY3NfcGVyX2ZyYW1lOiAldSIsCkBAIC04MDksOCArNzU2LDggQEAKIAl9CiAKIAkvKiBmcyByZXF1ZXN0cyAqbXVzdCogYmUgaGFyZHdhcmUgZnJhbWUgYWxpZ25lZCAqLwotCWlmICgocnEtPm5yX3NlY3RvcnMgJiAoc2VjdG9yc19wZXJfZnJhbWUgLSAxKSkgfHwKLQkgICAgKHJxLT5zZWN0b3IgJiAoc2VjdG9yc19wZXJfZnJhbWUgLSAxKSkpCisJaWYgKChibGtfcnFfc2VjdG9ycyhycSkgJiAoc2VjdG9yc19wZXJfZnJhbWUgLSAxKSkgfHwKKwkgICAgKGJsa19ycV9wb3MocnEpICYgKHNlY3RvcnNfcGVyX2ZyYW1lIC0gMSkpKQogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAKIAkvKiB1c2UgRE1BLCBpZiBwb3NzaWJsZSAqLwpAQCAtODM4LDE1ICs3ODUsMTAgQEAKIAlkcml2ZS0+ZG1hID0gMDsKIAogCS8qIHNnIHJlcXVlc3QgKi8KLQlpZiAocnEtPmJpbyB8fCAoKHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9BVEFfUEMpICYmIHJxLT5kYXRhX2xlbikpIHsKKwlpZiAocnEtPmJpbykgewogCQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKKwkJY2hhciAqYnVmID0gYmlvX2RhdGEocnEtPmJpbyk7CiAJCXVuc2lnbmVkIGludCBhbGlnbm1lbnQ7Ci0JCWNoYXIgKmJ1ZjsKLQotCQlpZiAocnEtPmJpbykKLQkJCWJ1ZiA9IGJpb19kYXRhKHJxLT5iaW8pOwotCQllbHNlCi0JCQlidWYgPSBycS0+ZGF0YTsKIAogCQlkcml2ZS0+ZG1hID0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpOwogCkBAIC04NTgsNyArODAwLDcgQEAKIAkJICovCiAJCWFsaWdubWVudCA9IHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkgfCBxLT5kbWFfcGFkX21hc2s7CiAJCWlmICgodW5zaWduZWQgbG9uZylidWYgJiBhbGlnbm1lbnQKLQkJICAgIHx8IHJxLT5kYXRhX2xlbiAmIHEtPmRtYV9wYWRfbWFzaworCQkgICAgfHwgYmxrX3JxX2J5dGVzKHJxKSAmIHEtPmRtYV9wYWRfbWFzawogCQkgICAgfHwgb2JqZWN0X2lzX29uX3N0YWNrKGJ1ZikpCiAJCQlkcml2ZS0+ZG1hID0gMDsKIAl9CkBAIC04OTYsNiArODM4LDkgQEAKIAkJZ290byBvdXRfZW5kOwogCX0KIAorCS8qIHByZXBhcmUgc2Vuc2UgcmVxdWVzdCBmb3IgdGhpcyBjb21tYW5kICovCisJaWRlX3ByZXBfc2Vuc2UoZHJpdmUsIHJxKTsKKwogCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CiAKIAlpZiAocnFfZGF0YV9kaXIocnEpKQpAQCAtOTAzLDE1ICs4NDgsMTQgQEAKIAogCWNtZC5ycSA9IHJxOwogCi0JaWYgKGJsa19mc19yZXF1ZXN0KHJxKSB8fCBycS0+ZGF0YV9sZW4pIHsKLQkJaWRlX2luaXRfc2dfY21kKCZjbWQsIGJsa19mc19yZXF1ZXN0KHJxKSA/IChycS0+bnJfc2VjdG9ycyA8PCA5KQotCQkJCQkJCSA6IHJxLT5kYXRhX2xlbik7CisJaWYgKGJsa19mc19yZXF1ZXN0KHJxKSB8fCBibGtfcnFfYnl0ZXMocnEpKSB7CisJCWlkZV9pbml0X3NnX2NtZCgmY21kLCBibGtfcnFfYnl0ZXMocnEpKTsKIAkJaWRlX21hcF9zZyhkcml2ZSwgJmNtZCk7CiAJfQogCiAJcmV0dXJuIGlkZV9pc3N1ZV9wYyhkcml2ZSwgJmNtZCk7CiBvdXRfZW5kOgotCW5zZWN0b3JzID0gcnEtPmhhcmRfbnJfc2VjdG9yczsKKwluc2VjdG9ycyA9IGJsa19ycV9zZWN0b3JzKHJxKTsKIAogCWlmIChuc2VjdG9ycyA9PSAwKQogCQluc2VjdG9ycyA9IDE7CkBAIC0xMDc3LDggKzEwMjEsOCBAQAogCS8qIHNhdmUgYSBwcml2YXRlIGNvcHkgb2YgdGhlIFRPQyBjYXBhY2l0eSBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KIAlkcml2ZS0+cHJvYmVkX2NhcGFjaXR5ID0gdG9jLT5jYXBhY2l0eSAqIHNlY3RvcnNfcGVyX2ZyYW1lOwogCi0JYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlLAotCQkJCXNlY3RvcnNfcGVyX2ZyYW1lIDw8IFNFQ1RPUl9CSVRTKTsKKwlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGRyaXZlLT5xdWV1ZSwKKwkJCQkgICAgIHNlY3RvcnNfcGVyX2ZyYW1lIDw8IFNFQ1RPUl9CSVRTKTsKIAogCS8qIGZpcnN0IHJlYWQganVzdCB0aGUgaGVhZGVyLCBzbyB3ZSBrbm93IGhvdyBsb25nIHRoZSBUT0MgaXMgKi8KIAlzdGF0ID0gY2Ryb21fcmVhZF90b2NlbnRyeShkcml2ZSwgMCwgMSwgMCwgKGNoYXIgKikgJnRvYy0+aGRyLApAQCAtMTM5NCw5ICsxMzM4LDkgQEAKIC8qIHN0YW5kYXJkIHByZXBfcnFfZm4gdGhhdCBidWlsZHMgMTAgYnl0ZSBjbWRzICovCiBzdGF0aWMgaW50IGlkZV9jZHJvbV9wcmVwX2ZzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0JaW50IGhhcmRfc2VjdCA9IHF1ZXVlX2hhcmRzZWN0X3NpemUocSk7Ci0JbG9uZyBibG9jayA9IChsb25nKXJxLT5oYXJkX3NlY3RvciAvIChoYXJkX3NlY3QgPj4gOSk7Ci0JdW5zaWduZWQgbG9uZyBibG9ja3MgPSBycS0+aGFyZF9ucl9zZWN0b3JzIC8gKGhhcmRfc2VjdCA+PiA5KTsKKwlpbnQgaGFyZF9zZWN0ID0gcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEpOworCWxvbmcgYmxvY2sgPSAobG9uZylibGtfcnFfcG9zKHJxKSAvIChoYXJkX3NlY3QgPj4gOSk7CisJdW5zaWduZWQgbG9uZyBibG9ja3MgPSBibGtfcnFfc2VjdG9ycyhycSkgLyAoaGFyZF9zZWN0ID4+IDkpOwogCiAJbWVtc2V0KHJxLT5jbWQsIDAsIEJMS19NQVhfQ0RCKTsKIApAQCAtMTU5OSw3ICsxNTQzLDcgQEAKIAogCW5zbG90cyA9IGlkZV9jZHJvbV9wcm9iZV9jYXBhYmlsaXRpZXMoZHJpdmUpOwogCi0JYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUocSwgQ0RfRlJBTUVTSVpFKTsKKwlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEsIENEX0ZSQU1FU0laRSk7CiAKIAlpZiAoaWRlX2Nkcm9tX3JlZ2lzdGVyKGRyaXZlLCBuc2xvdHMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiAlcyBmYWlsZWQgdG8gcmVnaXN0ZXIgZGV2aWNlIHdpdGggdGhlIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWNkLmggYi9kcml2ZXJzL2lkZS9pZGUtY2QuaAppbmRleCAxZDk3MTAxLi45M2EzY2YxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmgKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmgKQEAgLTg3LDEwICs4Nyw2IEBACiAKIAlzdHJ1Y3QgYXRhcGlfdG9jICp0b2M7CiAKLQkvKiBUaGUgcmVzdWx0IG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgcmVxdWVzdCBzZW5zZSBjb21tYW5kCi0JICAgb24gdGhpcyBkZXZpY2UuICovCi0Jc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2VfZGF0YTsKLQogCXU4IG1heF9zcGVlZDsJCS8qIE1heCBzcGVlZCBvZiB0aGUgZHJpdmUuICovCiAJdTggY3VycmVudF9zcGVlZDsJLyogQ3VycmVudCBzcGVlZCBvZiB0aGUgZHJpdmUuICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMgYi9kcml2ZXJzL2lkZS9pZGUtZGlzay5jCmluZGV4IGE5ZmJlMmMuLmM2ZjdmY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kaXNrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWRpc2suYwpAQCAtODIsNyArODIsNyBAQAogCQkJCQlzZWN0b3JfdCBibG9jaykKIHsKIAlpZGVfaHdpZl90ICpod2lmCT0gZHJpdmUtPmh3aWY7Ci0JdTE2IG5zZWN0b3JzCQk9ICh1MTYpcnEtPm5yX3NlY3RvcnM7CisJdTE2IG5zZWN0b3JzCQk9ICh1MTYpYmxrX3JxX3NlY3RvcnMocnEpOwogCXU4IGxiYTQ4CQk9ICEhKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfTEJBNDgpOwogCXU4IGRtYQkJCT0gISEoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19VU0lOR19ETUEpOwogCXN0cnVjdCBpZGVfY21kCQljbWQ7CkBAIC05MCw3ICs5MCw3IEBACiAJaWRlX3N0YXJ0c3RvcF90CQlyYzsKIAogCWlmICgoaHdpZi0+aG9zdF9mbGFncyAmIElERV9IRkxBR19OT19MQkE0OF9ETUEpICYmIGxiYTQ4ICYmIGRtYSkgewotCQlpZiAoYmxvY2sgKyBycS0+bnJfc2VjdG9ycyA+IDFVTEwgPDwgMjgpCisJCWlmIChibG9jayArIGJsa19ycV9zZWN0b3JzKHJxKSA+IDFVTEwgPDwgMjgpCiAJCQlkbWEgPSAwOwogCQllbHNlCiAJCQlsYmE0OCA9IDA7CkBAIC0xOTUsOSArMTk1LDkgQEAKIAogCWxlZHRyaWdfaWRlX2FjdGl2aXR5KCk7CiAKLQlwcl9kZWJ1ZygiJXM6ICVzaW5nOiBibG9jaz0lbGx1LCBzZWN0b3JzPSVsdSwgYnVmZmVyPTB4JTA4bHhcbiIsCisJcHJfZGVidWcoIiVzOiAlc2luZzogYmxvY2s9JWxsdSwgc2VjdG9ycz0ldSwgYnVmZmVyPTB4JTA4bHhcbiIsCiAJCSBkcml2ZS0+bmFtZSwgcnFfZGF0YV9kaXIocnEpID09IFJFQUQgPyAicmVhZCIgOiAid3JpdCIsCi0JCSAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrLCBycS0+bnJfc2VjdG9ycywKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssIGJsa19ycV9zZWN0b3JzKHJxKSwKIAkJICh1bnNpZ25lZCBsb25nKXJxLT5idWZmZXIpOwogCiAJaWYgKGh3aWYtPnJ3X2Rpc2spCkBAIC00MTEsNyArNDExLDYgQEAKIAljbWQtPnByb3RvY29sID0gQVRBX1BST1RfTk9EQVRBOwogCiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfQVRBX1RBU0tGSUxFOwotCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1NPRlRCQVJSSUVSOwogCXJxLT5zcGVjaWFsID0gY21kOwogfQogCkBAIC02NDAsNyArNjM5LDcgQEAKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogbWF4IHJlcXVlc3Qgc2l6ZTogJWRLaUJcbiIsIGRyaXZlLT5uYW1lLAotCQlxLT5tYXhfc2VjdG9ycyAvIDIpOworCSAgICAgICBxdWV1ZV9tYXhfc2VjdG9ycyhxKSAvIDIpOwogCiAJaWYgKGF0YV9pZF9pc19zc2QoaWQpKQogCQlxdWV1ZV9mbGFnX3NldF91bmxvY2tlZChRVUVVRV9GTEFHX05PTlJPVCwgcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZG1hLmMgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKaW5kZXggYTBiOGNhYjEuLjAwMWY2OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kbWEuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCQkJCWlkZV9maW5pc2hfY21kKGRyaXZlLCBjbWQsIHN0YXQpOwogCQkJZWxzZQogCQkJCWlkZV9jb21wbGV0ZV9ycShkcml2ZSwgMCwKLQkJCQkJCWNtZC0+cnEtPm5yX3NlY3RvcnMgPDwgOSk7CisJCQkJCQlibGtfcnFfc2VjdG9ycyhjbWQtPnJxKSA8PCA5KTsKIAkJCXJldHVybiBpZGVfc3RvcHBlZDsKIAkJfQogCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczogYmFkIERNQSBzdGF0dXMgKDB4JTAyeClcbiIsCkBAIC01MTAsMjMgKzUxMCwxMSBAQAogCS8qCiAJICogdW4tYnVzeSBkcml2ZSBldGMgYW5kIG1ha2Ugc3VyZSByZXF1ZXN0IGlzIHNhbmUKIAkgKi8KLQogCXJxID0gaHdpZi0+cnE7Ci0JaWYgKCFycSkKLQkJZ290byBvdXQ7Ci0KLQlod2lmLT5ycSA9IE5VTEw7Ci0KLQlycS0+ZXJyb3JzID0gMDsKLQotCWlmICghcnEtPmJpbykKLQkJZ290byBvdXQ7Ci0KLQlycS0+c2VjdG9yID0gcnEtPmJpby0+Ymlfc2VjdG9yOwotCXJxLT5jdXJyZW50X25yX3NlY3RvcnMgPSBiaW9faW92ZWMocnEtPmJpbyktPmJ2X2xlbiA+PiA5OwotCXJxLT5oYXJkX2N1cl9zZWN0b3JzID0gcnEtPmN1cnJlbnRfbnJfc2VjdG9yczsKLQlycS0+YnVmZmVyID0gYmlvX2RhdGEocnEtPmJpbyk7Ci1vdXQ6CisJaWYgKHJxKSB7CisJCWh3aWYtPnJxID0gTlVMTDsKKwkJcnEtPmVycm9ycyA9IDA7CisJfQogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwppbmRleCAyYjQ4NjhkLi42NTA5ODE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCkBAIC0xMzQsMTMgKzEzNCwxNyBAQAogCWRyaXZlLT5wYyA9IHBjOwogCiAJaWYgKHBjLT5yZXRyaWVzID4gSURFRkxPUFBZX01BWF9QQ19SRVRSSUVTKSB7CisJCXVuc2lnbmVkIGludCBkb25lID0gYmxrX3JxX2J5dGVzKGRyaXZlLT5od2lmLT5ycSk7CisKIAkJaWYgKCEocGMtPmZsYWdzICYgUENfRkxBR19TVVBQUkVTU19FUlJPUikpCiAJCQlpZGVfZmxvcHB5X3JlcG9ydF9lcnJvcihmbG9wcHksIHBjKTsKKwogCQkvKiBHaXZpbmcgdXAgKi8KIAkJcGMtPmVycm9yID0gSURFX0RSVl9FUlJPUl9HRU5FUkFMOwogCiAJCWRyaXZlLT5mYWlsZWRfcGMgPSBOVUxMOwogCQlkcml2ZS0+cGNfY2FsbGJhY2soZHJpdmUsIDApOworCQlpZGVfY29tcGxldGVfcnEoZHJpdmUsIC1FSU8sIGRvbmUpOwogCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJfQogCkBAIC0xOTAsNyArMTk0LDcgQEAKIHsKIAlzdHJ1Y3QgaWRlX2Rpc2tfb2JqICpmbG9wcHkgPSBkcml2ZS0+ZHJpdmVyX2RhdGE7CiAJaW50IGJsb2NrID0gc2VjdG9yIC8gZmxvcHB5LT5ic19mYWN0b3I7Ci0JaW50IGJsb2NrcyA9IHJxLT5ucl9zZWN0b3JzIC8gZmxvcHB5LT5ic19mYWN0b3I7CisJaW50IGJsb2NrcyA9IGJsa19ycV9zZWN0b3JzKHJxKSAvIGZsb3BweS0+YnNfZmFjdG9yOwogCWludCBjbWQgPSBycV9kYXRhX2RpcihycSk7CiAKIAlpZGVfZGVidWdfbG9nKElERV9EQkdfRlVOQywgImJsb2NrOiAlZCwgYmxvY2tzOiAlZCIsIGJsb2NrLCBibG9ja3MpOwpAQCAtMjE2LDE2ICsyMjAsMTQgQEAKIAlpZGVfaW5pdF9wYyhwYyk7CiAJbWVtY3B5KHBjLT5jLCBycS0+Y21kLCBzaXplb2YocGMtPmMpKTsKIAlwYy0+cnEgPSBycTsKLQlpZiAocnEtPmRhdGFfbGVuICYmIHJxX2RhdGFfZGlyKHJxKSA9PSBXUklURSkKLQkJcGMtPmZsYWdzIHw9IFBDX0ZMQUdfV1JJVElORzsKLQlwYy0+YnVmID0gcnEtPmRhdGE7Ci0JaWYgKHJxLT5iaW8pCisJaWYgKGJsa19ycV9ieXRlcyhycSkpIHsKIAkJcGMtPmZsYWdzIHw9IFBDX0ZMQUdfRE1BX09LOwotCS8qCi0JICogcG9zc2libHkgcHJvYmxlbWF0aWMsIGRvZXNuJ3QgbG9vayBsaWtlIGlkZS1mbG9wcHkgY29ycmVjdGx5Ci0JICogaGFuZGxlZCBzY2F0dGVyZWQgcmVxdWVzdHMgaWYgZG1hIGZhaWxzLi4uCi0JICovCi0JcGMtPnJlcV94ZmVyID0gcGMtPmJ1Zl9zaXplID0gcnEtPmRhdGFfbGVuOworCQlpZiAocnFfZGF0YV9kaXIocnEpID09IFdSSVRFKQorCQkJcGMtPmZsYWdzIHw9IFBDX0ZMQUdfV1JJVElORzsKKwl9CisJLyogcGlvIHdpbGwgYmUgcGVyZm9ybWVkIGJ5IGlkZV9waW9fYnl0ZXMoKSB3aGljaCBoYW5kbGVzIHNnIGZpbmUgKi8KKwlwYy0+YnVmID0gTlVMTDsKKwlwYy0+cmVxX3hmZXIgPSBwYy0+YnVmX3NpemUgPSBibGtfcnFfYnl0ZXMocnEpOwogfQogCiBzdGF0aWMgaWRlX3N0YXJ0c3RvcF90IGlkZV9mbG9wcHlfZG9fcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsCkBAIC0yNTcsMTYgKzI1OSwxNiBAQAogCQkJZ290byBvdXRfZW5kOwogCX0KIAlpZiAoYmxrX2ZzX3JlcXVlc3QocnEpKSB7Ci0JCWlmICgoKGxvbmcpcnEtPnNlY3RvciAlIGZsb3BweS0+YnNfZmFjdG9yKSB8fAotCQkgICAgKHJxLT5ucl9zZWN0b3JzICUgZmxvcHB5LT5ic19mYWN0b3IpKSB7CisJCWlmICgoKGxvbmcpYmxrX3JxX3BvcyhycSkgJSBmbG9wcHktPmJzX2ZhY3RvcikgfHwKKwkJICAgIChibGtfcnFfc2VjdG9ycyhycSkgJSBmbG9wcHktPmJzX2ZhY3RvcikpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiB1bnN1cHBvcnRlZCByL3cgcnEgc2l6ZVxuIiwKIAkJCQlkcml2ZS0+bmFtZSk7CiAJCQlnb3RvIG91dF9lbmQ7CiAJCX0KIAkJcGMgPSAmZmxvcHB5LT5xdWV1ZWRfcGM7CiAJCWlkZWZsb3BweV9jcmVhdGVfcndfY21kKGRyaXZlLCBwYywgcnEsICh1bnNpZ25lZCBsb25nKWJsb2NrKTsKLQl9IGVsc2UgaWYgKGJsa19zcGVjaWFsX3JlcXVlc3QocnEpKSB7Ci0JCXBjID0gKHN0cnVjdCBpZGVfYXRhcGlfcGMgKikgcnEtPmJ1ZmZlcjsKKwl9IGVsc2UgaWYgKGJsa19zcGVjaWFsX3JlcXVlc3QocnEpIHx8IGJsa19zZW5zZV9yZXF1ZXN0KHJxKSkgeworCQlwYyA9IChzdHJ1Y3QgaWRlX2F0YXBpX3BjICopcnEtPnNwZWNpYWw7CiAJfSBlbHNlIGlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKIAkJcGMgPSAmZmxvcHB5LT5xdWV1ZWRfcGM7CiAJCWlkZWZsb3BweV9ibG9ja3BjX2NtZChmbG9wcHksIHBjLCBycSk7CkBAIC0yNzUsNiArMjc3LDggQEAKIAkJZ290byBvdXRfZW5kOwogCX0KIAorCWlkZV9wcmVwX3NlbnNlKGRyaXZlLCBycSk7CisKIAltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogCiAJaWYgKHJxX2RhdGFfZGlyKHJxKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1pby5jIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKaW5kZXggNjQxNWEyZS4uYmJhNDI5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWlvLmMKQEAgLTExNiw5ICsxMTYsOSBAQAogdW5zaWduZWQgaW50IGlkZV9ycV9ieXRlcyhzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkKLQkJcmV0dXJuIHJxLT5kYXRhX2xlbjsKKwkJcmV0dXJuIGJsa19ycV9ieXRlcyhycSk7CiAJZWxzZQotCQlyZXR1cm4gcnEtPmhhcmRfY3VyX3NlY3RvcnMgPDwgOTsKKwkJcmV0dXJuIGJsa19ycV9jdXJfc2VjdG9ycyhycSkgPDwgOTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlkZV9ycV9ieXRlcyk7CiAKQEAgLTEzMyw3ICsxMzMsNyBAQAogCSAqIGFuZCBjb21wbGV0ZSB0aGUgd2hvbGUgcmVxdWVzdCByaWdodCBub3cKIAkgKi8KIAlpZiAoYmxrX25vcmV0cnlfcmVxdWVzdChycSkgJiYgZXJyb3IgPD0gMCkKLQkJbnJfYnl0ZXMgPSBycS0+aGFyZF9ucl9zZWN0b3JzIDw8IDk7CisJCW5yX2J5dGVzID0gYmxrX3JxX3NlY3RvcnMocnEpIDw8IDk7CiAKIAlyYyA9IGlkZV9lbmRfcnEoZHJpdmUsIHJxLCBlcnJvciwgbnJfYnl0ZXMpOwogCWlmIChyYyA9PSAwKQpAQCAtMjQ4LDE0ICsyNDgsNyBAQAogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBod2lmLT5zZ190YWJsZTsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnEgPSBjbWQtPnJxOwogCi0JaWYgKHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9BVEFfVEFTS0ZJTEUpIHsKLQkJc2dfaW5pdF9vbmUoc2csIHJxLT5idWZmZXIsIHJxLT5ucl9zZWN0b3JzICogU0VDVE9SX1NJWkUpOwotCQljbWQtPnNnX25lbnRzID0gMTsKLQl9IGVsc2UgaWYgKCFycS0+YmlvKSB7Ci0JCXNnX2luaXRfb25lKHNnLCBycS0+ZGF0YSwgcnEtPmRhdGFfbGVuKTsKLQkJY21kLT5zZ19uZW50cyA9IDE7Ci0JfSBlbHNlCi0JCWNtZC0+c2dfbmVudHMgPSBibGtfcnFfbWFwX3NnKGRyaXZlLT5xdWV1ZSwgcnEsIHNnKTsKKwljbWQtPnNnX25lbnRzID0gYmxrX3JxX21hcF9zZyhkcml2ZS0+cXVldWUsIHJxLCBzZyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZGVfbWFwX3NnKTsKIApAQCAtMjg2LDcgKzI3OSw3IEBACiAKIAlpZiAoY21kKSB7CiAJCWlmIChjbWQtPnByb3RvY29sID09IEFUQV9QUk9UX1BJTykgewotCQkJaWRlX2luaXRfc2dfY21kKGNtZCwgcnEtPm5yX3NlY3RvcnMgPDwgOSk7CisJCQlpZGVfaW5pdF9zZ19jbWQoY21kLCBibGtfcnFfc2VjdG9ycyhycSkgPDwgOSk7CiAJCQlpZGVfbWFwX3NnKGRyaXZlLCBjbWQpOwogCQl9CiAKQEAgLTM3MSw3ICszNjQsNyBAQAogCQlpZiAocnEtPmNtZF90eXBlID09IFJFUV9UWVBFX0FUQV9UQVNLRklMRSkKIAkJCXJldHVybiBleGVjdXRlX2RyaXZlX2NtZChkcml2ZSwgcnEpOwogCQllbHNlIGlmIChibGtfcG1fcmVxdWVzdChycSkpIHsKLQkJCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5kYXRhOworCQkJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgKnBtID0gcnEtPnNwZWNpYWw7CiAjaWZkZWYgREVCVUdfUE0KIAkJCXByaW50aygiJXM6IHN0YXJ0X3Bvd2VyX3N0ZXAoc3RlcDogJWQpXG4iLAogCQkJCWRyaXZlLT5uYW1lLCBwbS0+cG1fc3RlcCk7CkBAIC0zOTQsNyArMzg3LDcgQEAKIAogCQlkcnYgPSAqKHN0cnVjdCBpZGVfZHJpdmVyICoqKXJxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7CiAKLQkJcmV0dXJuIGRydi0+ZG9fcmVxdWVzdChkcml2ZSwgcnEsIHJxLT5zZWN0b3IpOworCQlyZXR1cm4gZHJ2LT5kb19yZXF1ZXN0KGRyaXZlLCBycSwgYmxrX3JxX3BvcyhycSkpOwogCX0KIAlyZXR1cm4gZG9fc3BlY2lhbChkcml2ZSk7CiBraWxsX3JxOgpAQCAtNDg0LDYgKzQ3Nyw5IEBACiAKIAlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKKwkvKiBITEQgZG9fcmVxdWVzdCgpIGNhbGxiYWNrIG1pZ2h0IHNsZWVwLCBtYWtlIHN1cmUgaXQncyBva2F5ICovCisJbWlnaHRfc2xlZXAoKTsKKwogCWlmIChpZGVfbG9ja19ob3N0KGhvc3QsIGh3aWYpKQogCQlnb3RvIHBsdWdfZGV2aWNlXzI7CiAKQEAgLTQ5MSwxMCArNDg3LDEwIEBACiAKIAlpZiAoIWlkZV9sb2NrX3BvcnQoaHdpZikpIHsKIAkJaWRlX2h3aWZfdCAqcHJldl9wb3J0OworCisJCVdBUk5fT05fT05DRShod2lmLT5ycSk7CiByZXBlYXQ6CiAJCXByZXZfcG9ydCA9IGh3aWYtPmhvc3QtPmN1cl9wb3J0OwotCQlod2lmLT5ycSA9IE5VTEw7Ci0KIAkJaWYgKGRyaXZlLT5kZXZfZmxhZ3MgJiBJREVfREZMQUdfU0xFRVBJTkcgJiYKIAkJICAgIHRpbWVfYWZ0ZXIoZHJpdmUtPnNsZWVwLCBqaWZmaWVzKSkgewogCQkJaWRlX3VubG9ja19wb3J0KGh3aWYpOwpAQCAtNTIzLDcgKzUxOSw5IEBACiAJCSAqIHdlIGtub3cgdGhhdCB0aGUgcXVldWUgaXNuJ3QgZW1wdHksIGJ1dCB0aGlzIGNhbiBoYXBwZW4KIAkJICogaWYgdGhlIHEtPnByZXBfcnFfZm4oKSBkZWNpZGVzIHRvIGtpbGwgYSByZXF1ZXN0CiAJCSAqLwotCQlycSA9IGVsdl9uZXh0X3JlcXVlc3QoZHJpdmUtPnF1ZXVlKTsKKwkJaWYgKCFycSkKKwkJCXJxID0gYmxrX2ZldGNoX3JlcXVlc3QoZHJpdmUtPnF1ZXVlKTsKKwogCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCXNwaW5fbG9ja19pcnEoJmh3aWYtPmxvY2spOwogCkBAIC01MzUsNyArNTMzLDcgQEAKIAkJLyoKIAkJICogU2FuaXR5OiBkb24ndCBhY2NlcHQgYSByZXF1ZXN0IHRoYXQgaXNuJ3QgYSBQTSByZXF1ZXN0CiAJCSAqIGlmIHdlIGFyZSBjdXJyZW50bHkgcG93ZXIgbWFuYWdlZC4gVGhpcyBpcyB2ZXJ5IGltcG9ydGFudCBhcwotCQkgKiBibGtfc3RvcF9xdWV1ZSgpIGRvZXNuJ3QgcHJldmVudCB0aGUgZWx2X25leHRfcmVxdWVzdCgpCisJCSAqIGJsa19zdG9wX3F1ZXVlKCkgZG9lc24ndCBwcmV2ZW50IHRoZSBibGtfZmV0Y2hfcmVxdWVzdCgpCiAJCSAqIGFib3ZlIHRvIHJldHVybiB1cyB3aGF0ZXZlciBpcyBpbiB0aGUgcXVldWUuIFNpbmNlIHdlIGNhbGwKIAkJICogaWRlX2RvX3JlcXVlc3QoKSBvdXJzZWx2ZXMsIHdlIGVuZCB1cCB0YWtpbmcgcmVxdWVzdHMgd2hpbGUKIAkJICogdGhlIHF1ZXVlIGlzIGJsb2NrZWQuLi4KQEAgLTU1OSw4ICs1NTcsMTEgQEAKIAkJc3RhcnRzdG9wID0gc3RhcnRfcmVxdWVzdChkcml2ZSwgcnEpOwogCQlzcGluX2xvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAotCQlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkKQorCQlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkKSB7CisJCQlycSA9IGh3aWYtPnJxOworCQkJaHdpZi0+cnEgPSBOVUxMOwogCQkJZ290byByZXBlYXQ7CisJCX0KIAl9IGVsc2UKIAkJZ290byBwbHVnX2RldmljZTsKIG91dDoKQEAgLTU3NiwxOCArNTc3LDI0IEBACiBwbHVnX2RldmljZV8yOgogCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKKwlpZiAocnEpCisJCWJsa19yZXF1ZXVlX3JlcXVlc3QocSwgcnEpOwogCWlmICghZWx2X3F1ZXVlX2VtcHR5KHEpKQogCQlibGtfcGx1Z19kZXZpY2UocSk7CiB9CiAKLXN0YXRpYyB2b2lkIGlkZV9wbHVnX2RldmljZShpZGVfZHJpdmVfdCAqZHJpdmUpCitzdGF0aWMgdm9pZCBpZGVfcmVxdWV1ZV9hbmRfcGx1ZyhpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGRyaXZlLT5xdWV1ZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJaWYgKHJxKQorCQlibGtfcmVxdWV1ZV9yZXF1ZXN0KHEsIHJxKTsKIAlpZiAoIWVsdl9xdWV1ZV9lbXB0eShxKSkKIAkJYmxrX3BsdWdfZGV2aWNlKHEpOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTYzNiw2ICs2NDMsNyBAQAogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAJaW50CQl3YWl0ID0gLTE7CiAJaW50CQlwbHVnX2RldmljZSA9IDA7CisJc3RydWN0IHJlcXVlc3QJKnVuaW5pdGlhbGl6ZWRfdmFyKHJxX2luX2ZsaWdodCk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaHdpZi0+bG9jaywgZmxhZ3MpOwogCkBAIC02OTcsNiArNzA1LDggQEAKIAkJc3Bpbl9sb2NrX2lycSgmaHdpZi0+bG9jayk7CiAJCWVuYWJsZV9pcnEoaHdpZi0+aXJxKTsKIAkJaWYgKHN0YXJ0c3RvcCA9PSBpZGVfc3RvcHBlZCAmJiBod2lmLT5wb2xsaW5nID09IDApIHsKKwkJCXJxX2luX2ZsaWdodCA9IGh3aWYtPnJxOworCQkJaHdpZi0+cnEgPSBOVUxMOwogCQkJaWRlX3VubG9ja19wb3J0KGh3aWYpOwogCQkJcGx1Z19kZXZpY2UgPSAxOwogCQl9CkBAIC03MDUsNyArNzE1LDcgQEAKIAogCWlmIChwbHVnX2RldmljZSkgewogCQlpZGVfdW5sb2NrX2hvc3QoaHdpZi0+aG9zdCk7Ci0JCWlkZV9wbHVnX2RldmljZShkcml2ZSk7CisJCWlkZV9yZXF1ZXVlX2FuZF9wbHVnKGRyaXZlLCBycV9pbl9mbGlnaHQpOwogCX0KIH0KIApAQCAtNzkxLDYgKzgwMSw3IEBACiAJaWRlX3N0YXJ0c3RvcF90IHN0YXJ0c3RvcDsKIAlpcnFyZXR1cm5fdCBpcnFfcmV0ID0gSVJRX05PTkU7CiAJaW50IHBsdWdfZGV2aWNlID0gMDsKKwlzdHJ1Y3QgcmVxdWVzdCAqdW5pbml0aWFsaXplZF92YXIocnFfaW5fZmxpZ2h0KTsKIAogCWlmIChob3N0LT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX1NFUklBTElaRSkgewogCQlpZiAoaHdpZiAhPSBob3N0LT5jdXJfcG9ydCkKQEAgLTg3MCw2ICs4ODEsOCBAQAogCSAqLwogCWlmIChzdGFydHN0b3AgPT0gaWRlX3N0b3BwZWQgJiYgaHdpZi0+cG9sbGluZyA9PSAwKSB7CiAJCUJVR19PTihod2lmLT5oYW5kbGVyKTsKKwkJcnFfaW5fZmxpZ2h0ID0gaHdpZi0+cnE7CisJCWh3aWYtPnJxID0gTlVMTDsKIAkJaWRlX3VubG9ja19wb3J0KGh3aWYpOwogCQlwbHVnX2RldmljZSA9IDE7CiAJfQpAQCAtODc5LDcgKzg5Miw3IEBACiBvdXRfZWFybHk6CiAJaWYgKHBsdWdfZGV2aWNlKSB7CiAJCWlkZV91bmxvY2tfaG9zdChod2lmLT5ob3N0KTsKLQkJaWRlX3BsdWdfZGV2aWNlKGRyaXZlKTsKKwkJaWRlX3JlcXVldWVfYW5kX3BsdWcoZHJpdmUsIHJxX2luX2ZsaWdodCk7CiAJfQogCiAJcmV0dXJuIGlycV9yZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW9jdGxzLmMgYi9kcml2ZXJzL2lkZS9pZGUtaW9jdGxzLmMKaW5kZXggYzFjMjVlYi4uNTk5MWIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvY3Rscy5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pb2N0bHMuYwpAQCAtMjMxLDcgKzIzMSw2IEBACiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfU1BFQ0lBTDsKIAlycS0+Y21kX2xlbiA9IDE7CiAJcnEtPmNtZFswXSA9IFJFUV9EUklWRV9SRVNFVDsKLQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9TT0ZUQkFSUklFUjsKIAlpZiAoYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBOVUxMLCBycSwgMSkpCiAJCXJldCA9IHJxLT5lcnJvcnM7CiAJYmxrX3B1dF9yZXF1ZXN0KHJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwppbmRleCAyMTQ4ZGY4Li5lMzg2YTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCkBAIC05Niw3ICs5Niw3IEBACiAKIAkJaWYgKHJxKQogCQkJcHJpbnRrKEtFUk5fQ09OVCAiLCBzZWN0b3I9JWxsdSIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylycS0+c2VjdG9yKTsKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsa19ycV9wb3MocnEpKTsKIAl9CiAJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMgYi9kcml2ZXJzL2lkZS9pZGUtcGFyay5jCmluZGV4IDMxMGQwM2YuLmE5MTQwMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1wYXJrLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBhcmsuYwpAQCAtMjQsMTEgKzI0LDggQEAKIAkJCXN0YXJ0X3F1ZXVlID0gMTsKIAkJc3Bpbl91bmxvY2tfaXJxKCZod2lmLT5sb2NrKTsKIAotCQlpZiAoc3RhcnRfcXVldWUpIHsKLQkJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JCQlibGtfc3RhcnRfcXVldWVpbmcocSk7Ci0JCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7Ci0JCX0KKwkJaWYgKHN0YXJ0X3F1ZXVlKQorCQkJYmxrX3J1bl9xdWV1ZShxKTsKIAkJcmV0dXJuOwogCX0KIAlzcGluX3VubG9ja19pcnEoJmh3aWYtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXBtLmMgYi9kcml2ZXJzL2lkZS9pZGUtcG0uYwppbmRleCAwZDhhMTUxLi5iYTE0ODhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcG0uYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcG0uYwpAQCAtNyw3ICs3LDYgQEAKIAlpZGVfaHdpZl90ICpod2lmID0gZHJpdmUtPmh3aWY7CiAJc3RydWN0IHJlcXVlc3QgKnJxOwogCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlIHJxcG07Ci0Jc3RydWN0IGlkZV9jbWQgY21kOwogCWludCByZXQ7CiAKIAkvKiBjYWxsIEFDUEkgX0dUTSBvbmx5IG9uY2UgKi8KQEAgLTE1LDExICsxNCw5IEBACiAJCWlkZV9hY3BpX2dldF90aW1pbmcoaHdpZik7CiAKIAltZW1zZXQoJnJxcG0sIDAsIHNpemVvZihycXBtKSk7Ci0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKIAlycSA9IGJsa19nZXRfcmVxdWVzdChkcml2ZS0+cXVldWUsIFJFQUQsIF9fR0ZQX1dBSVQpOwogCXJxLT5jbWRfdHlwZSA9IFJFUV9UWVBFX1BNX1NVU1BFTkQ7Ci0JcnEtPnNwZWNpYWwgPSAmY21kOwotCXJxLT5kYXRhID0gJnJxcG07CisJcnEtPnNwZWNpYWwgPSAmcnFwbTsKIAlycXBtLnBtX3N0ZXAgPSBJREVfUE1fU1RBUlRfU1VTUEVORDsKIAlpZiAobWVzZy5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKQogCQltZXNnLmV2ZW50ID0gUE1fRVZFTlRfRlJFRVpFOwpAQCAtNDEsNyArMzgsNiBAQAogCWlkZV9od2lmX3QgKmh3aWYgPSBkcml2ZS0+aHdpZjsKIAlzdHJ1Y3QgcmVxdWVzdCAqcnE7CiAJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgcnFwbTsKLQlzdHJ1Y3QgaWRlX2NtZCBjbWQ7CiAJaW50IGVycjsKIAogCS8qIGNhbGwgQUNQSSBfUFMwIC8gX1NUTSBvbmx5IG9uY2UgKi8KQEAgLTUzLDEyICs0OSwxMCBAQAogCWlkZV9hY3BpX2V4ZWNfdGZzKGRyaXZlKTsKIAogCW1lbXNldCgmcnFwbSwgMCwgc2l6ZW9mKHJxcG0pKTsKLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwogCXJxID0gYmxrX2dldF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSwgUkVBRCwgX19HRlBfV0FJVCk7CiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfUE1fUkVTVU1FOwogCXJxLT5jbWRfZmxhZ3MgfD0gUkVRX1BSRUVNUFQ7Ci0JcnEtPnNwZWNpYWwgPSAmY21kOwotCXJxLT5kYXRhID0gJnJxcG07CisJcnEtPnNwZWNpYWwgPSAmcnFwbTsKIAlycXBtLnBtX3N0ZXAgPSBJREVfUE1fU1RBUlRfUkVTVU1FOwogCXJxcG0ucG1fc3RhdGUgPSBQTV9FVkVOVF9PTjsKIApAQCAtNzcsNyArNzEsNyBAQAogCiB2b2lkIGlkZV9jb21wbGV0ZV9wb3dlcl9zdGVwKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQogewotCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5kYXRhOworCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5zcGVjaWFsOwogCiAjaWZkZWYgREVCVUdfUE0KIAlwcmludGsoS0VSTl9JTkZPICIlczogY29tcGxldGVfcG93ZXJfc3RlcChzdGVwOiAlZClcbiIsCkBAIC0xMDcsMTAgKzEwMSw4IEBACiAKIGlkZV9zdGFydHN0b3BfdCBpZGVfc3RhcnRfcG93ZXJfc3RlcChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSAqcG0gPSBycS0+ZGF0YTsKLQlzdHJ1Y3QgaWRlX2NtZCAqY21kID0gcnEtPnNwZWNpYWw7Ci0KLQltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5zcGVjaWFsOworCXN0cnVjdCBpZGVfY21kIGNtZCA9IHsgfTsKIAogCXN3aXRjaCAocG0tPnBtX3N0ZXApIHsKIAljYXNlIElERV9QTV9GTFVTSF9DQUNIRToJLyogU3VzcGVuZCBzdGVwIDEgKGZsdXNoIGNhY2hlKSAqLwpAQCAtMTIzLDEyICsxMTUsMTIgQEAKIAkJCXJldHVybiBpZGVfc3RvcHBlZDsKIAkJfQogCQlpZiAoYXRhX2lkX2ZsdXNoX2V4dF9lbmFibGVkKGRyaXZlLT5pZCkpCi0JCQljbWQtPnRmLmNvbW1hbmQgPSBBVEFfQ01EX0ZMVVNIX0VYVDsKKwkJCWNtZC50Zi5jb21tYW5kID0gQVRBX0NNRF9GTFVTSF9FWFQ7CiAJCWVsc2UKLQkJCWNtZC0+dGYuY29tbWFuZCA9IEFUQV9DTURfRkxVU0g7CisJCQljbWQudGYuY29tbWFuZCA9IEFUQV9DTURfRkxVU0g7CiAJCWdvdG8gb3V0X2RvX3RmOwogCWNhc2UgSURFX1BNX1NUQU5EQlk6CQkvKiBTdXNwZW5kIHN0ZXAgMiAoc3RhbmRieSkgKi8KLQkJY21kLT50Zi5jb21tYW5kID0gQVRBX0NNRF9TVEFOREJZTk9XMTsKKwkJY21kLnRmLmNvbW1hbmQgPSBBVEFfQ01EX1NUQU5EQllOT1cxOwogCQlnb3RvIG91dF9kb190ZjsKIAljYXNlIElERV9QTV9SRVNUT1JFX1BJTzoJLyogUmVzdW1lIHN0ZXAgMSAocmVzdG9yZSBQSU8pICovCiAJCWlkZV9zZXRfbWF4X3Bpbyhkcml2ZSk7CkBAIC0xNDEsNyArMTMzLDcgQEAKIAkJCWlkZV9jb21wbGV0ZV9wb3dlcl9zdGVwKGRyaXZlLCBycSk7CiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAljYXNlIElERV9QTV9JRExFOgkJLyogUmVzdW1lIHN0ZXAgMiAoaWRsZSkgKi8KLQkJY21kLT50Zi5jb21tYW5kID0gQVRBX0NNRF9JRExFSU1NRURJQVRFOworCQljbWQudGYuY29tbWFuZCA9IEFUQV9DTURfSURMRUlNTUVESUFURTsKIAkJZ290byBvdXRfZG9fdGY7CiAJY2FzZSBJREVfUE1fUkVTVE9SRV9ETUE6CS8qIFJlc3VtZSBzdGVwIDMgKHJlc3RvcmUgRE1BKSAqLwogCQkvKgpAQCAtMTYzLDExICsxNTUsMTEgQEAKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAKIG91dF9kb190ZjoKLQljbWQtPnZhbGlkLm91dC50ZiA9IElERV9WQUxJRF9PVVRfVEYgfCBJREVfVkFMSURfREVWSUNFOwotCWNtZC0+dmFsaWQuaW4udGYgID0gSURFX1ZBTElEX0lOX1RGICB8IElERV9WQUxJRF9ERVZJQ0U7Ci0JY21kLT5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKKwljbWQudmFsaWQub3V0LnRmID0gSURFX1ZBTElEX09VVF9URiB8IElERV9WQUxJRF9ERVZJQ0U7CisJY21kLnZhbGlkLmluLnRmICA9IElERV9WQUxJRF9JTl9URiAgfCBJREVfVkFMSURfREVWSUNFOworCWNtZC5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKIAotCXJldHVybiBkb19yd190YXNrZmlsZShkcml2ZSwgY21kKTsKKwlyZXR1cm4gZG9fcndfdGFza2ZpbGUoZHJpdmUsICZjbWQpOwogfQogCiAvKioKQEAgLTE4MSw3ICsxNzMsNyBAQAogdm9pZCBpZGVfY29tcGxldGVfcG1fcnEoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkcml2ZS0+cXVldWU7Ci0Jc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgKnBtID0gcnEtPmRhdGE7CisJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgKnBtID0gcnEtPnNwZWNpYWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlkZV9jb21wbGV0ZV9wb3dlcl9zdGVwKGRyaXZlLCBycSk7CkBAIC0yMDcsNyArMTk5LDcgQEAKIAogdm9pZCBpZGVfY2hlY2tfcG1fc3RhdGUoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7Ci0Jc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgKnBtID0gcnEtPmRhdGE7CisJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgKnBtID0gcnEtPnNwZWNpYWw7CiAKIAlpZiAoYmxrX3BtX3N1c3BlbmRfcmVxdWVzdChycSkgJiYKIAkgICAgcG0tPnBtX3N0ZXAgPT0gSURFX1BNX1NUQVJUX1NVU1BFTkQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwppbmRleCAzYTUzZTA4Li5kOTc2NGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKQEAgLTEzMSwxMyArMTMxLDYgQEAKIAlJREVUQVBFX0RJUl9XUklURSA9ICgxIDw8IDIpLAogfTsKIAotc3RydWN0IGlkZXRhcGVfYmggewotCXUzMiBiX3NpemU7Ci0JYXRvbWljX3QgYl9jb3VudDsKLQlzdHJ1Y3QgaWRldGFwZV9iaCAqYl9yZXFuZXh0OwotCWNoYXIgKmJfZGF0YTsKLX07Ci0KIC8qIFRhcGUgZG9vciBzdGF0dXMgKi8KICNkZWZpbmUgRE9PUl9VTkxPQ0tFRAkJCTAKICNkZWZpbmUgRE9PUl9MT0NLRUQJCQkxCkBAIC0yMTksMTggKzIxMiwxMiBAQAogCiAJLyogRGF0YSBidWZmZXIgc2l6ZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRhcGUncyByZWNvbW1lbmRhdGlvbiAqLwogCWludCBidWZmZXJfc2l6ZTsKLQkvKiBtZXJnZSBidWZmZXIgKi8KLQlzdHJ1Y3QgaWRldGFwZV9iaCAqbWVyZ2VfYmg7Ci0JLyogc2l6ZSBvZiB0aGUgbWVyZ2UgYnVmZmVyICovCi0JaW50IG1lcmdlX2JoX3NpemU7Ci0JLyogcG9pbnRlciB0byBjdXJyZW50IGJ1ZmZlciBoZWFkIHdpdGhpbiB0aGUgbWVyZ2UgYnVmZmVyICovCi0Jc3RydWN0IGlkZXRhcGVfYmggKmJoOwotCWNoYXIgKmJfZGF0YTsKLQlpbnQgYl9jb3VudDsKLQotCWludCBwYWdlc19wZXJfYnVmZmVyOwotCS8qIFdhc3RlZCBzcGFjZSBpbiBlYWNoIHN0YWdlICovCi0JaW50IGV4Y2Vzc19iaF9zaXplOworCS8qIFN0YWdpbmcgYnVmZmVyIG9mIGJ1ZmZlcl9zaXplIGJ5dGVzICovCisJdm9pZCAqYnVmOworCS8qIFRoZSByZWFkL3dyaXRlIGN1cnNvciAqLworCXZvaWQgKmN1cjsKKwkvKiBUaGUgbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIGJ1ZiAqLworCXNpemVfdCB2YWxpZDsKIAogCS8qIE1lYXN1cmVzIGF2ZXJhZ2UgdGFwZSBzcGVlZCAqLwogCXVuc2lnbmVkIGxvbmcgYXZnX3RpbWU7CkBAIC0yOTcsODQgKzI4NCw2IEBACiAJcmV0dXJuIHRhcGU7CiB9CiAKLXN0YXRpYyBpbnQgaWRldGFwZV9pbnB1dF9idWZmZXJzKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsCi0JCQkJICB1bnNpZ25lZCBpbnQgYmNvdW50KQotewotCXN0cnVjdCBpZGV0YXBlX2JoICpiaCA9IHBjLT5iaDsKLQlpbnQgY291bnQ7Ci0KLQl3aGlsZSAoYmNvdW50KSB7Ci0JCWlmIChiaCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWNvdW50ID0gbWluKAotCQkJKHVuc2lnbmVkIGludCkoYmgtPmJfc2l6ZSAtIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCkpLAotCQkJYmNvdW50KTsKLQkJZHJpdmUtPmh3aWYtPnRwX29wcy0+aW5wdXRfZGF0YShkcml2ZSwgTlVMTCwgYmgtPmJfZGF0YSArCi0JCQkJCWF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCksIGNvdW50KTsKLQkJYmNvdW50IC09IGNvdW50OwotCQlhdG9taWNfYWRkKGNvdW50LCAmYmgtPmJfY291bnQpOwotCQlpZiAoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSA9PSBiaC0+Yl9zaXplKSB7Ci0JCQliaCA9IGJoLT5iX3JlcW5leHQ7Ci0JCQlpZiAoYmgpCi0JCQkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOwotCQl9Ci0JfQotCi0JcGMtPmJoID0gYmg7Ci0KLQlyZXR1cm4gYmNvdW50OwotfQotCi1zdGF0aWMgaW50IGlkZXRhcGVfb3V0cHV0X2J1ZmZlcnMoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICpwYywKLQkJCQkgICB1bnNpZ25lZCBpbnQgYmNvdW50KQotewotCXN0cnVjdCBpZGV0YXBlX2JoICpiaCA9IHBjLT5iaDsKLQlpbnQgY291bnQ7Ci0KLQl3aGlsZSAoYmNvdW50KSB7Ci0JCWlmIChiaCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWNvdW50ID0gbWluKCh1bnNpZ25lZCBpbnQpcGMtPmJfY291bnQsICh1bnNpZ25lZCBpbnQpYmNvdW50KTsKLQkJZHJpdmUtPmh3aWYtPnRwX29wcy0+b3V0cHV0X2RhdGEoZHJpdmUsIE5VTEwsIHBjLT5iX2RhdGEsIGNvdW50KTsKLQkJYmNvdW50IC09IGNvdW50OwotCQlwYy0+Yl9kYXRhICs9IGNvdW50OwotCQlwYy0+Yl9jb3VudCAtPSBjb3VudDsKLQkJaWYgKCFwYy0+Yl9jb3VudCkgewotCQkJYmggPSBiaC0+Yl9yZXFuZXh0OwotCQkJcGMtPmJoID0gYmg7Ci0JCQlpZiAoYmgpIHsKLQkJCQlwYy0+Yl9kYXRhID0gYmgtPmJfZGF0YTsKLQkJCQlwYy0+Yl9jb3VudCA9IGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gYmNvdW50OwotfQotCi1zdGF0aWMgdm9pZCBpZGV0YXBlX3VwZGF0ZV9idWZmZXJzKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMpCi17Ci0Jc3RydWN0IGlkZXRhcGVfYmggKmJoID0gcGMtPmJoOwotCWludCBjb3VudDsKLQl1bnNpZ25lZCBpbnQgYmNvdW50ID0gcGMtPnhmZXJyZWQ7Ci0KLQlpZiAocGMtPmZsYWdzICYgUENfRkxBR19XUklUSU5HKQotCQlyZXR1cm47Ci0Jd2hpbGUgKGJjb3VudCkgewotCQlpZiAoYmggPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYmggPT0gTlVMTCBpbiAlc1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNvdW50ID0gbWluKCh1bnNpZ25lZCBpbnQpYmgtPmJfc2l6ZSwgKHVuc2lnbmVkIGludCliY291bnQpOwotCQlhdG9taWNfc2V0KCZiaC0+Yl9jb3VudCwgY291bnQpOwotCQlpZiAoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSA9PSBiaC0+Yl9zaXplKQotCQkJYmggPSBiaC0+Yl9yZXFuZXh0OwotCQliY291bnQgLT0gY291bnQ7Ci0JfQotCXBjLT5iaCA9IGJoOwotfQotCiAvKgogICogY2FsbGVkIG9uIGVhY2ggZmFpbGVkIHBhY2tldCBjb21tYW5kIHJldHJ5IHRvIGFuYWx5emUgdGhlIHJlcXVlc3Qgc2Vuc2UuIFdlCiAgKiBjdXJyZW50bHkgZG8gbm90IHV0aWxpemUgdGhpcyBpbmZvcm1hdGlvbi4KQEAgLTM5MiwxMiArMzAxLDEwIEBACiAJCSBwYy0+Y1swXSwgdGFwZS0+c2Vuc2Vfa2V5LCB0YXBlLT5hc2MsIHRhcGUtPmFzY3EpOwogCiAJLyogQ29ycmVjdCBwYy0+eGZlcnJlZCBieSBhc2tpbmcgdGhlIHRhcGUuCSAqLwotCWlmIChwYy0+ZmxhZ3MgJiBQQ19GTEFHX0RNQV9FUlJPUikgeworCWlmIChwYy0+ZmxhZ3MgJiBQQ19GTEFHX0RNQV9FUlJPUikKIAkJcGMtPnhmZXJyZWQgPSBwYy0+cmVxX3hmZXIgLQogCQkJdGFwZS0+YmxrX3NpemUgKgogCQkJZ2V0X3VuYWxpZ25lZF9iZTMyKCZzZW5zZVszXSk7Ci0JCWlkZXRhcGVfdXBkYXRlX2J1ZmZlcnMoZHJpdmUsIHBjKTsKLQl9CiAKIAkvKgogCSAqIElmIGVycm9yIHdhcyB0aGUgcmVzdWx0IG9mIGEgemVyby1sZW5ndGggcmVhZCBvciB3cml0ZSBjb21tYW5kLApAQCAtNDM2LDI5ICszNDMsNiBAQAogCX0KIH0KIAotLyogRnJlZSBkYXRhIGJ1ZmZlcnMgY29tcGxldGVseS4gKi8KLXN0YXRpYyB2b2lkIGlkZV90YXBlX2tmcmVlX2J1ZmZlcihpZGV0YXBlX3RhcGVfdCAqdGFwZSkKLXsKLQlzdHJ1Y3QgaWRldGFwZV9iaCAqcHJldl9iaCwgKmJoID0gdGFwZS0+bWVyZ2VfYmg7Ci0KLQl3aGlsZSAoYmgpIHsKLQkJdTMyIHNpemUgPSBiaC0+Yl9zaXplOwotCi0JCXdoaWxlIChzaXplKSB7Ci0JCQl1bnNpZ25lZCBpbnQgb3JkZXIgPSBmbHMoc2l6ZSA+PiBQQUdFX1NISUZUKS0xOwotCi0JCQlpZiAoYmgtPmJfZGF0YSkKLQkJCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWJoLT5iX2RhdGEsIG9yZGVyKTsKLQotCQkJc2l6ZSAmPSAob3JkZXItMSk7Ci0JCQliaC0+Yl9kYXRhICs9ICgxIDw8IG9yZGVyKSAqIFBBR0VfU0laRTsKLQkJfQotCQlwcmV2X2JoID0gYmg7Ci0JCWJoID0gYmgtPmJfcmVxbmV4dDsKLQkJa2ZyZWUocHJldl9iaCk7Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBpZGVfdGFwZV9oYW5kbGVfZHNjKGlkZV9kcml2ZV90ICopOwogCiBzdGF0aWMgaW50IGlkZV90YXBlX2NhbGxiYWNrKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGRzYykKQEAgLTQ5Niw3ICszODAsNyBAQAogCQl9CiAKIAkJdGFwZS0+Zmlyc3RfZnJhbWUgKz0gYmxvY2tzOwotCQlycS0+Y3VycmVudF9ucl9zZWN0b3JzIC09IGJsb2NrczsKKwkJcnEtPnJlc2lkX2xlbiAtPSBibG9ja3MgKiB0YXBlLT5ibGtfc2l6ZTsKIAogCQlpZiAocGMtPmVycm9yKSB7CiAJCQl1cHRvZGF0ZSA9IDA7CkBAIC01NTgsMTkgKzQ0Miw2IEBACiAJaWRldGFwZV9wb3N0cG9uZV9yZXF1ZXN0KGRyaXZlKTsKIH0KIAotc3RhdGljIGludCBpZGVfdGFwZV9pb19idWZmZXJzKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsCi0JCQkJdW5zaWduZWQgaW50IGJjb3VudCwgaW50IHdyaXRlKQotewotCXVuc2lnbmVkIGludCBibGVmdDsKLQotCWlmICh3cml0ZSkKLQkJYmxlZnQgPSBpZGV0YXBlX291dHB1dF9idWZmZXJzKGRyaXZlLCBwYywgYmNvdW50KTsKLQllbHNlCi0JCWJsZWZ0ID0gaWRldGFwZV9pbnB1dF9idWZmZXJzKGRyaXZlLCBwYywgYmNvdW50KTsKLQotCXJldHVybiBiY291bnQgLSBibGVmdDsKLX0KLQogLyoKICAqIFBhY2tldCBDb21tYW5kIEludGVyZmFjZQogICoKQEAgLTYyMiw2ICs0OTMsOCBAQAogCiAJaWYgKHBjLT5yZXRyaWVzID4gSURFVEFQRV9NQVhfUENfUkVUUklFUyB8fAogCQkocGMtPmZsYWdzICYgUENfRkxBR19BQk9SVCkpIHsKKwkJdW5zaWduZWQgaW50IGRvbmUgPSBibGtfcnFfYnl0ZXMoZHJpdmUtPmh3aWYtPnJxKTsKKwogCQkvKgogCQkgKiBXZSB3aWxsICJhYm9ydCIgcmV0cnlpbmcgYSBwYWNrZXQgY29tbWFuZCBpbiBjYXNlIGxlZ2l0aW1hdGUKIAkJICogZXJyb3IgY29kZSB3YXMgcmVjZWl2ZWQgKGNyb3NzaW5nIGEgZmlsZW1hcmssIG9yIGVuZCBvZiB0aGUKQEAgLTY0MSw4ICs1MTQsMTAgQEAKIAkJCS8qIEdpdmluZyB1cCAqLwogCQkJcGMtPmVycm9yID0gSURFX0RSVl9FUlJPUl9HRU5FUkFMOwogCQl9CisKIAkJZHJpdmUtPmZhaWxlZF9wYyA9IE5VTEw7CiAJCWRyaXZlLT5wY19jYWxsYmFjayhkcml2ZSwgMCk7CisJCWlkZV9jb21wbGV0ZV9ycShkcml2ZSwgLUVJTywgZG9uZSk7CiAJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CiAJZGVidWdfbG9nKERCR19TRU5TRSwgIlJldHJ5ICMlZCwgY21kID0gJTAyWFxuIiwgcGMtPnJldHJpZXMsIHBjLT5jWzBdKTsKQEAgLTY5NSw3ICs1NzAsNyBAQAogCQkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6ICVzOiBJL08gZXJyb3IsICIsCiAJCQkJCQl0YXBlLT5uYW1lKTsKIAkJCS8qIFJldHJ5IG9wZXJhdGlvbiAqLwotCQkJaWRlX3JldHJ5X3BjKGRyaXZlLCB0YXBlLT5kaXNrKTsKKwkJCWlkZV9yZXRyeV9wYyhkcml2ZSk7CiAJCQlyZXR1cm4gaWRlX3N0b3BwZWQ7CiAJCX0KIAkJcGMtPmVycm9yID0gMDsKQEAgLTcxMSwyNyArNTg2LDIyIEBACiAJCQkJICAgc3RydWN0IGlkZV9hdGFwaV9wYyAqcGMsIHN0cnVjdCByZXF1ZXN0ICpycSwKIAkJCQkgICB1OCBvcGNvZGUpCiB7Ci0Jc3RydWN0IGlkZXRhcGVfYmggKmJoID0gKHN0cnVjdCBpZGV0YXBlX2JoICopcnEtPnNwZWNpYWw7Ci0JdW5zaWduZWQgaW50IGxlbmd0aCA9IHJxLT5jdXJyZW50X25yX3NlY3RvcnM7CisJdW5zaWduZWQgaW50IGxlbmd0aCA9IGJsa19ycV9zZWN0b3JzKHJxKTsKIAogCWlkZV9pbml0X3BjKHBjKTsKIAlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTMyKGxlbmd0aCksICh1bnNpZ25lZCBpbnQgKikgJnBjLT5jWzFdKTsKIAlwYy0+Y1sxXSA9IDE7Ci0JcGMtPmJoID0gYmg7CiAJcGMtPmJ1ZiA9IE5VTEw7CiAJcGMtPmJ1Zl9zaXplID0gbGVuZ3RoICogdGFwZS0+YmxrX3NpemU7CiAJcGMtPnJlcV94ZmVyID0gcGMtPmJ1Zl9zaXplOwogCWlmIChwYy0+cmVxX3hmZXIgPT0gdGFwZS0+YnVmZmVyX3NpemUpCiAJCXBjLT5mbGFncyB8PSBQQ19GTEFHX0RNQV9PSzsKIAotCWlmIChvcGNvZGUgPT0gUkVBRF82KSB7CisJaWYgKG9wY29kZSA9PSBSRUFEXzYpCiAJCXBjLT5jWzBdID0gUkVBRF82OwotCQlhdG9taWNfc2V0KCZiaC0+Yl9jb3VudCwgMCk7Ci0JfSBlbHNlIGlmIChvcGNvZGUgPT0gV1JJVEVfNikgeworCWVsc2UgaWYgKG9wY29kZSA9PSBXUklURV82KSB7CiAJCXBjLT5jWzBdID0gV1JJVEVfNjsKIAkJcGMtPmZsYWdzIHw9IFBDX0ZMQUdfV1JJVElORzsKLQkJcGMtPmJfZGF0YSA9IGJoLT5iX2RhdGE7Ci0JCXBjLT5iX2NvdW50ID0gYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KTsKIAl9CiAKIAltZW1jcHkocnEtPmNtZCwgcGMtPmMsIDEyKTsKQEAgLTc0NywxMiArNjE3LDEwIEBACiAJc3RydWN0IGlkZV9jbWQgY21kOwogCXU4IHN0YXQ7CiAKLQlkZWJ1Z19sb2coREJHX1NFTlNFLCAic2VjdG9yOiAlbGx1LCBucl9zZWN0b3JzOiAlbHUsIgotCQkJIiBjdXJyZW50X25yX3NlY3RvcnM6ICV1XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylycS0+c2VjdG9yLCBycS0+bnJfc2VjdG9ycywKLQkJCXJxLT5jdXJyZW50X25yX3NlY3RvcnMpOworCWRlYnVnX2xvZyhEQkdfU0VOU0UsICJzZWN0b3I6ICVsbHUsIG5yX3NlY3RvcnM6ICV1XG4iCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylibGtfcnFfcG9zKHJxKSwgYmxrX3JxX3NlY3RvcnMocnEpKTsKIAotCWlmICghYmxrX3NwZWNpYWxfcmVxdWVzdChycSkpIHsKKwlpZiAoIShibGtfc3BlY2lhbF9yZXF1ZXN0KHJxKSB8fCBibGtfc2Vuc2VfcmVxdWVzdChycSkpKSB7CiAJCS8qIFdlIGRvIG5vdCBzdXBwb3J0IGJ1ZmZlciBjYWNoZSBvcmlnaW5hdGVkIHJlcXVlc3RzLiAqLwogCQlwcmludGsoS0VSTl9OT1RJQ0UgImlkZS10YXBlOiAlczogVW5zdXBwb3J0ZWQgcmVxdWVzdCBpbiAiCiAJCQkicmVxdWVzdCBxdWV1ZSAoJWQpXG4iLCBkcml2ZS0+bmFtZSwgcnEtPmNtZF90eXBlKTsKQEAgLTgyOCw3ICs2OTYsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAJaWYgKHJxLT5jbWRbMTNdICYgUkVRX0lERVRBUEVfUEMxKSB7Ci0JCXBjID0gKHN0cnVjdCBpZGVfYXRhcGlfcGMgKikgcnEtPmJ1ZmZlcjsKKwkJcGMgPSAoc3RydWN0IGlkZV9hdGFwaV9wYyAqKXJxLT5zcGVjaWFsOwogCQlycS0+Y21kWzEzXSAmPSB+KFJFUV9JREVUQVBFX1BDMSk7CiAJCXJxLT5jbWRbMTNdIHw9IFJFUV9JREVUQVBFX1BDMjsKIAkJZ290byBvdXQ7CkBAIC04NDAsNiArNzA4LDkgQEAKIAlCVUcoKTsKIAogb3V0OgorCS8qIHByZXBhcmUgc2Vuc2UgcmVxdWVzdCBmb3IgdGhpcyBjb21tYW5kICovCisJaWRlX3ByZXBfc2Vuc2UoZHJpdmUsIHJxKTsKKwogCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7CiAKIAlpZiAocnFfZGF0YV9kaXIocnEpKQpAQCAtODQ3LDE3MCArNzE4LDEzIEBACiAKIAljbWQucnEgPSBycTsKIAorCWlkZV9pbml0X3NnX2NtZCgmY21kLCBwYy0+cmVxX3hmZXIpOworCWlkZV9tYXBfc2coZHJpdmUsICZjbWQpOworCiAJcmV0dXJuIGlkZV90YXBlX2lzc3VlX3BjKGRyaXZlLCAmY21kLCBwYyk7CiB9CiAKIC8qCi0gKiBUaGUgZnVuY3Rpb24gYmVsb3cgdXNlcyBfX2dldF9mcmVlX3BhZ2VzIHRvIGFsbG9jYXRlIGEgZGF0YSBidWZmZXIgb2Ygc2l6ZQotICogdGFwZS0+YnVmZmVyX3NpemUgKG9yIGEgYml0IG1vcmUpLiBXZSBhdHRlbXB0IHRvIGNvbWJpbmUgc2VxdWVudGlhbCBwYWdlcyBhcwotICogbXVjaCBhcyBwb3NzaWJsZS4KLSAqCi0gKiBJdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciwgb3IgTlVMTCBpbiBjYXNlIG9mCi0gKiBmYWlsdXJlLgotICovCi1zdGF0aWMgc3RydWN0IGlkZXRhcGVfYmggKmlkZV90YXBlX2ttYWxsb2NfYnVmZmVyKGlkZXRhcGVfdGFwZV90ICp0YXBlLAotCQkJCQkJICBpbnQgZnVsbCwgaW50IGNsZWFyKQotewotCXN0cnVjdCBpZGV0YXBlX2JoICpwcmV2X2JoLCAqYmgsICptZXJnZV9iaDsKLQlpbnQgcGFnZXMgPSB0YXBlLT5wYWdlc19wZXJfYnVmZmVyOwotCXVuc2lnbmVkIGludCBvcmRlciwgYl9hbGxvY2Q7Ci0JY2hhciAqYl9kYXRhID0gTlVMTDsKLQotCW1lcmdlX2JoID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlkZXRhcGVfYmgpLCBHRlBfS0VSTkVMKTsKLQliaCA9IG1lcmdlX2JoOwotCWlmIChiaCA9PSBOVUxMKQotCQlnb3RvIGFib3J0OwotCi0Jb3JkZXIgPSBmbHMocGFnZXMpIC0gMTsKLQliaC0+Yl9kYXRhID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7Ci0JaWYgKCFiaC0+Yl9kYXRhKQotCQlnb3RvIGFib3J0OwotCWJfYWxsb2NkID0gKDEgPDwgb3JkZXIpICogUEFHRV9TSVpFOwotCXBhZ2VzICY9IChvcmRlci0xKTsKLQotCWlmIChjbGVhcikKLQkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGJfYWxsb2NkKTsKLQliaC0+Yl9yZXFuZXh0ID0gTlVMTDsKLQliaC0+Yl9zaXplID0gYl9hbGxvY2Q7Ci0JYXRvbWljX3NldCgmYmgtPmJfY291bnQsIGZ1bGwgPyBiaC0+Yl9zaXplIDogMCk7Ci0KLQl3aGlsZSAocGFnZXMpIHsKLQkJb3JkZXIgPSBmbHMocGFnZXMpIC0gMTsKLQkJYl9kYXRhID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7Ci0JCWlmICghYl9kYXRhKQotCQkJZ290byBhYm9ydDsKLQkJYl9hbGxvY2QgPSAoMSA8PCBvcmRlcikgKiBQQUdFX1NJWkU7Ci0KLQkJaWYgKGNsZWFyKQotCQkJbWVtc2V0KGJfZGF0YSwgMCwgYl9hbGxvY2QpOwotCi0JCS8qIG5ld2x5IGFsbG9jYXRlZCBwYWdlIGZyYW1lcyBiZWxvdyBidWZmZXIgaGVhZGVyIG9yIC4uLiovCi0JCWlmIChiaC0+Yl9kYXRhID09IGJfZGF0YSArIGJfYWxsb2NkKSB7Ci0JCQliaC0+Yl9zaXplICs9IGJfYWxsb2NkOwotCQkJYmgtPmJfZGF0YSAtPSBiX2FsbG9jZDsKLQkJCWlmIChmdWxsKQotCQkJCWF0b21pY19hZGQoYl9hbGxvY2QsICZiaC0+Yl9jb3VudCk7Ci0JCQljb250aW51ZTsKLQkJfQotCQkvKiB0aGV5IGFyZSBhYm92ZSB0aGUgaGVhZGVyICovCi0JCWlmIChiX2RhdGEgPT0gYmgtPmJfZGF0YSArIGJoLT5iX3NpemUpIHsKLQkJCWJoLT5iX3NpemUgKz0gYl9hbGxvY2Q7Ci0JCQlpZiAoZnVsbCkKLQkJCQlhdG9taWNfYWRkKGJfYWxsb2NkLCAmYmgtPmJfY291bnQpOwotCQkJY29udGludWU7Ci0JCX0KLQkJcHJldl9iaCA9IGJoOwotCQliaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZGV0YXBlX2JoKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghYmgpIHsKLQkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGJfZGF0YSwgb3JkZXIpOwotCQkJZ290byBhYm9ydDsKLQkJfQotCQliaC0+Yl9yZXFuZXh0ID0gTlVMTDsKLQkJYmgtPmJfZGF0YSA9IGJfZGF0YTsKLQkJYmgtPmJfc2l6ZSA9IGJfYWxsb2NkOwotCQlhdG9taWNfc2V0KCZiaC0+Yl9jb3VudCwgZnVsbCA/IGJoLT5iX3NpemUgOiAwKTsKLQkJcHJldl9iaC0+Yl9yZXFuZXh0ID0gYmg7Ci0KLQkJcGFnZXMgJj0gKG9yZGVyLTEpOwotCX0KLQotCWJoLT5iX3NpemUgLT0gdGFwZS0+ZXhjZXNzX2JoX3NpemU7Ci0JaWYgKGZ1bGwpCi0JCWF0b21pY19zdWIodGFwZS0+ZXhjZXNzX2JoX3NpemUsICZiaC0+Yl9jb3VudCk7Ci0JcmV0dXJuIG1lcmdlX2JoOwotYWJvcnQ6Ci0JaWRlX3RhcGVfa2ZyZWVfYnVmZmVyKHRhcGUpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IGlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIoaWRldGFwZV90YXBlX3QgKnRhcGUsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBuKQotewotCXN0cnVjdCBpZGV0YXBlX2JoICpiaCA9IHRhcGUtPmJoOwotCWludCBjb3VudDsKLQlpbnQgcmV0ID0gMDsKLQotCXdoaWxlIChuKSB7Ci0JCWlmIChiaCA9PSBOVUxMKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBiaCA9PSBOVUxMIGluICVzXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQljb3VudCA9IG1pbigodW5zaWduZWQgaW50KQotCQkJCShiaC0+Yl9zaXplIC0gYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSksCi0JCQkJKHVuc2lnbmVkIGludCluKTsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKGJoLT5iX2RhdGEgKyBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpLCBidWYsCi0JCQkJY291bnQpKQotCQkJcmV0ID0gMTsKLQkJbiAtPSBjb3VudDsKLQkJYXRvbWljX2FkZChjb3VudCwgJmJoLT5iX2NvdW50KTsKLQkJYnVmICs9IGNvdW50OwotCQlpZiAoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSA9PSBiaC0+Yl9zaXplKSB7Ci0JCQliaCA9IGJoLT5iX3JlcW5leHQ7Ci0JCQlpZiAoYmgpCi0JCQkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOwotCQl9Ci0JfQotCXRhcGUtPmJoID0gYmg7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcihpZGV0YXBlX3RhcGVfdCAqdGFwZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgICAgICBpbnQgbikKLXsKLQlzdHJ1Y3QgaWRldGFwZV9iaCAqYmggPSB0YXBlLT5iaDsKLQlpbnQgY291bnQ7Ci0JaW50IHJldCA9IDA7Ci0KLQl3aGlsZSAobikgewotCQlpZiAoYmggPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYmggPT0gTlVMTCBpbiAlc1xuIiwKLQkJCQkJX19mdW5jX18pOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJY291bnQgPSBtaW4odGFwZS0+Yl9jb3VudCwgbik7Ci0JCWlmICAoY29weV90b191c2VyKGJ1ZiwgdGFwZS0+Yl9kYXRhLCBjb3VudCkpCi0JCQlyZXQgPSAxOwotCQluIC09IGNvdW50OwotCQl0YXBlLT5iX2RhdGEgKz0gY291bnQ7Ci0JCXRhcGUtPmJfY291bnQgLT0gY291bnQ7Ci0JCWJ1ZiArPSBjb3VudDsKLQkJaWYgKCF0YXBlLT5iX2NvdW50KSB7Ci0JCQliaCA9IGJoLT5iX3JlcW5leHQ7Ci0JCQl0YXBlLT5iaCA9IGJoOwotCQkJaWYgKGJoKSB7Ci0JCQkJdGFwZS0+Yl9kYXRhID0gYmgtPmJfZGF0YTsKLQkJCQl0YXBlLT5iX2NvdW50ID0gYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KTsKLQkJCX0KLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpZGV0YXBlX2luaXRfbWVyZ2VfYnVmZmVyKGlkZXRhcGVfdGFwZV90ICp0YXBlKQotewotCXN0cnVjdCBpZGV0YXBlX2JoICpiaCA9IHRhcGUtPm1lcmdlX2JoOwotCXRhcGUtPmJoID0gdGFwZS0+bWVyZ2VfYmg7Ci0KLQlpZiAodGFwZS0+Y2hyZGV2X2RpciA9PSBJREVUQVBFX0RJUl9XUklURSkKLQkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOwotCWVsc2UgewotCQl0YXBlLT5iX2RhdGEgPSBiaC0+Yl9kYXRhOwotCQl0YXBlLT5iX2NvdW50ID0gYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KTsKLQl9Ci19Ci0KLS8qCiAgKiBXcml0ZSBhIGZpbGVtYXJrIGlmIHdyaXRlX2ZpbGVtYXJrPTEuIEZsdXNoIHRoZSBkZXZpY2UgYnVmZmVycyB3aXRob3V0CiAgKiB3cml0aW5nIGEgZmlsZW1hcmsgb3RoZXJ3aXNlLgogICovCkBAIC0xMTA3LDEwICs4MjEsMTAgQEAKIAkJcmV0dXJuOwogCiAJY2xlYXJfYml0KElERV9BRkxBR19GSUxFTUFSSywgJmRyaXZlLT5hdGFwaV9mbGFncyk7Ci0JdGFwZS0+bWVyZ2VfYmhfc2l6ZSA9IDA7Ci0JaWYgKHRhcGUtPm1lcmdlX2JoICE9IE5VTEwpIHsKLQkJaWRlX3RhcGVfa2ZyZWVfYnVmZmVyKHRhcGUpOwotCQl0YXBlLT5tZXJnZV9iaCA9IE5VTEw7CisJdGFwZS0+dmFsaWQgPSAwOworCWlmICh0YXBlLT5idWYgIT0gTlVMTCkgeworCQlrZnJlZSh0YXBlLT5idWYpOworCQl0YXBlLT5idWYgPSBOVUxMOwogCX0KIAogCXRhcGUtPmNocmRldl9kaXIgPSBJREVUQVBFX0RJUl9OT05FOwpAQCAtMTE2NCwzNiArODc4LDQ0IEBACiAgKiBHZW5lcmF0ZSBhIHJlYWQvd3JpdGUgcmVxdWVzdCBmb3IgdGhlIGJsb2NrIGRldmljZSBpbnRlcmZhY2UgYW5kIHdhaXQgZm9yIGl0CiAgKiB0byBiZSBzZXJ2aWNlZC4KICAqLwotc3RhdGljIGludCBpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgY21kLCBpbnQgYmxvY2tzLAotCQkJCSBzdHJ1Y3QgaWRldGFwZV9iaCAqYmgpCitzdGF0aWMgaW50IGlkZXRhcGVfcXVldWVfcndfdGFpbChpZGVfZHJpdmVfdCAqZHJpdmUsIGludCBjbWQsIGludCBzaXplKQogewogCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKLQlpbnQgcmV0LCBlcnJvcnM7CisJaW50IHJldDsKIAogCWRlYnVnX2xvZyhEQkdfU0VOU0UsICIlczogY21kPSVkXG4iLCBfX2Z1bmNfXywgY21kKTsKKwlCVUdfT04oY21kICE9IFJFUV9JREVUQVBFX1JFQUQgJiYgY21kICE9IFJFUV9JREVUQVBFX1dSSVRFKTsKKwlCVUdfT04oc2l6ZSA8IDAgfHwgc2l6ZSAlIHRhcGUtPmJsa19zaXplKTsKIAogCXJxID0gYmxrX2dldF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSwgUkVBRCwgX19HRlBfV0FJVCk7CiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfU1BFQ0lBTDsKIAlycS0+Y21kWzEzXSA9IGNtZDsKIAlycS0+cnFfZGlzayA9IHRhcGUtPmRpc2s7Ci0JcnEtPnNwZWNpYWwgPSAodm9pZCAqKWJoOwotCXJxLT5zZWN0b3IgPSB0YXBlLT5maXJzdF9mcmFtZTsKLQlycS0+bnJfc2VjdG9ycyA9IGJsb2NrczsKLQlycS0+Y3VycmVudF9ucl9zZWN0b3JzID0gYmxvY2tzOworCXJxLT5fX3NlY3RvciA9IHRhcGUtPmZpcnN0X2ZyYW1lOworCisJaWYgKHNpemUpIHsKKwkJcmV0ID0gYmxrX3JxX21hcF9rZXJuKGRyaXZlLT5xdWV1ZSwgcnEsIHRhcGUtPmJ1Ziwgc2l6ZSwKKwkJCQkgICAgICBfX0dGUF9XQUlUKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0X3B1dDsKKwl9CisKIAlibGtfZXhlY3V0ZV9ycShkcml2ZS0+cXVldWUsIHRhcGUtPmRpc2ssIHJxLCAwKTsKIAotCWVycm9ycyA9IHJxLT5lcnJvcnM7Ci0JcmV0ID0gdGFwZS0+YmxrX3NpemUgKiAoYmxvY2tzIC0gcnEtPmN1cnJlbnRfbnJfc2VjdG9ycyk7CisJLyogY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMgYW5kIHVwZGF0ZSBidWZmZXIgc3RhdGUgKi8KKwlzaXplIC09IHJxLT5yZXNpZF9sZW47CisJdGFwZS0+Y3VyID0gdGFwZS0+YnVmOworCWlmIChjbWQgPT0gUkVRX0lERVRBUEVfUkVBRCkKKwkJdGFwZS0+dmFsaWQgPSBzaXplOworCWVsc2UKKwkJdGFwZS0+dmFsaWQgPSAwOworCisJcmV0ID0gc2l6ZTsKKwlpZiAocnEtPmVycm9ycyA9PSBJREVfRFJWX0VSUk9SX0dFTkVSQUwpCisJCXJldCA9IC1FSU87CitvdXRfcHV0OgogCWJsa19wdXRfcmVxdWVzdChycSk7Ci0KLQlpZiAoKGNtZCAmIChSRVFfSURFVEFQRV9SRUFEIHwgUkVRX0lERVRBUEVfV1JJVEUpKSA9PSAwKQotCQlyZXR1cm4gMDsKLQotCWlmICh0YXBlLT5tZXJnZV9iaCkKLQkJaWRldGFwZV9pbml0X21lcmdlX2J1ZmZlcih0YXBlKTsKLQlpZiAoZXJyb3JzID09IElERV9EUlZfRVJST1JfR0VORVJBTCkKLQkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTIzMCwxNTMgKzk1Miw4NyBAQAogCXBjLT5mbGFncyB8PSBQQ19GTEFHX1dBSVRfRk9SX0RTQzsKIH0KIAotLyogUXVldWUgdXAgYSBjaGFyYWN0ZXIgZGV2aWNlIG9yaWdpbmF0ZWQgd3JpdGUgcmVxdWVzdC4gKi8KLXN0YXRpYyBpbnQgaWRldGFwZV9hZGRfY2hyZGV2X3dyaXRlX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYmxvY2tzKQotewotCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JZGVidWdfbG9nKERCR19DSFJERVYsICJFbnRlciAlc1xuIiwgX19mdW5jX18pOwotCi0JcmV0dXJuIGlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwgUkVRX0lERVRBUEVfV1JJVEUsCi0JCQkJICAgICBibG9ja3MsIHRhcGUtPm1lcmdlX2JoKTsKLX0KLQogc3RhdGljIHZvaWQgaWRlX3RhcGVfZmx1c2hfbWVyZ2VfYnVmZmVyKGlkZV9kcml2ZV90ICpkcml2ZSkKIHsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQlpbnQgYmxvY2tzLCBtaW47Ci0Jc3RydWN0IGlkZXRhcGVfYmggKmJoOwogCiAJaWYgKHRhcGUtPmNocmRldl9kaXIgIT0gSURFVEFQRV9ESVJfV1JJVEUpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYnVnOiBUcnlpbmcgdG8gZW1wdHkgbWVyZ2UgYnVmZmVyIgogCQkJCSIgYnV0IHdlIGFyZSBub3Qgd3JpdGluZy5cbiIpOwogCQlyZXR1cm47CiAJfQotCWlmICh0YXBlLT5tZXJnZV9iaF9zaXplID4gdGFwZS0+YnVmZmVyX3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYnVnOiBtZXJnZV9idWZmZXIgdG9vIGJpZ1xuIik7Ci0JCXRhcGUtPm1lcmdlX2JoX3NpemUgPSB0YXBlLT5idWZmZXJfc2l6ZTsKLQl9Ci0JaWYgKHRhcGUtPm1lcmdlX2JoX3NpemUpIHsKLQkJYmxvY2tzID0gdGFwZS0+bWVyZ2VfYmhfc2l6ZSAvIHRhcGUtPmJsa19zaXplOwotCQlpZiAodGFwZS0+bWVyZ2VfYmhfc2l6ZSAlIHRhcGUtPmJsa19zaXplKSB7Ci0JCQl1bnNpZ25lZCBpbnQgaTsKKwlpZiAodGFwZS0+YnVmKSB7CisJCXNpemVfdCBhbGlnbmVkID0gcm91bmR1cCh0YXBlLT52YWxpZCwgdGFwZS0+YmxrX3NpemUpOwogCi0JCQlibG9ja3MrKzsKLQkJCWkgPSB0YXBlLT5ibGtfc2l6ZSAtIHRhcGUtPm1lcmdlX2JoX3NpemUgJQotCQkJCXRhcGUtPmJsa19zaXplOwotCQkJYmggPSB0YXBlLT5iaC0+Yl9yZXFuZXh0OwotCQkJd2hpbGUgKGJoKSB7Ci0JCQkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOwotCQkJCWJoID0gYmgtPmJfcmVxbmV4dDsKLQkJCX0KLQkJCWJoID0gdGFwZS0+Ymg7Ci0JCQl3aGlsZSAoaSkgewotCQkJCWlmIChiaCA9PSBOVUxMKSB7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8gImlkZS10YXBlOiBidWcsIgotCQkJCQkJCSAiIGJoIE5VTExcbiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbWluID0gbWluKGksICh1bnNpZ25lZCBpbnQpKGJoLT5iX3NpemUgLQotCQkJCQkJYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSkpOwotCQkJCW1lbXNldChiaC0+Yl9kYXRhICsgYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSwKLQkJCQkJCTAsIG1pbik7Ci0JCQkJYXRvbWljX2FkZChtaW4sICZiaC0+Yl9jb3VudCk7Ci0JCQkJaSAtPSBtaW47Ci0JCQkJYmggPSBiaC0+Yl9yZXFuZXh0OwotCQkJfQotCQl9Ci0JCSh2b2lkKSBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdChkcml2ZSwgYmxvY2tzKTsKLQkJdGFwZS0+bWVyZ2VfYmhfc2l6ZSA9IDA7Ci0JfQotCWlmICh0YXBlLT5tZXJnZV9iaCAhPSBOVUxMKSB7Ci0JCWlkZV90YXBlX2tmcmVlX2J1ZmZlcih0YXBlKTsKLQkJdGFwZS0+bWVyZ2VfYmggPSBOVUxMOworCQltZW1zZXQodGFwZS0+Y3VyLCAwLCBhbGlnbmVkIC0gdGFwZS0+dmFsaWQpOworCQlpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoZHJpdmUsIFJFUV9JREVUQVBFX1dSSVRFLCBhbGlnbmVkKTsKKwkJa2ZyZWUodGFwZS0+YnVmKTsKKwkJdGFwZS0+YnVmID0gTlVMTDsKIAl9CiAJdGFwZS0+Y2hyZGV2X2RpciA9IElERVRBUEVfRElSX05PTkU7CiB9CiAKLXN0YXRpYyBpbnQgaWRldGFwZV9pbml0X3JlYWQoaWRlX2RyaXZlX3QgKmRyaXZlKQorc3RhdGljIGludCBpZGV0YXBlX2luaXRfcncoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgZGlyKQogewogCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCWludCBieXRlc19yZWFkOworCWludCByYzsKIAotCS8qIEluaXRpYWxpemUgcmVhZCBvcGVyYXRpb24gKi8KLQlpZiAodGFwZS0+Y2hyZGV2X2RpciAhPSBJREVUQVBFX0RJUl9SRUFEKSB7Ci0JCWlmICh0YXBlLT5jaHJkZXZfZGlyID09IElERVRBUEVfRElSX1dSSVRFKSB7Ci0JCQlpZGVfdGFwZV9mbHVzaF9tZXJnZV9idWZmZXIoZHJpdmUpOwotCQkJaWRldGFwZV9mbHVzaF90YXBlX2J1ZmZlcnMoZHJpdmUpOwotCQl9Ci0JCWlmICh0YXBlLT5tZXJnZV9iaCB8fCB0YXBlLT5tZXJnZV9iaF9zaXplKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgImlkZS10YXBlOiBtZXJnZV9iaF9zaXplIHNob3VsZCBiZSIKLQkJCQkJICIgMCBub3dcbiIpOwotCQkJdGFwZS0+bWVyZ2VfYmhfc2l6ZSA9IDA7Ci0JCX0KLQkJdGFwZS0+bWVyZ2VfYmggPSBpZGVfdGFwZV9rbWFsbG9jX2J1ZmZlcih0YXBlLCAwLCAwKTsKLQkJaWYgKCF0YXBlLT5tZXJnZV9iaCkKLQkJCXJldHVybiAtRU5PTUVNOwotCQl0YXBlLT5jaHJkZXZfZGlyID0gSURFVEFQRV9ESVJfUkVBRDsKKwlCVUdfT04oZGlyICE9IElERVRBUEVfRElSX1JFQUQgJiYgZGlyICE9IElERVRBUEVfRElSX1dSSVRFKTsKIAotCQkvKgotCQkgKiBJc3N1ZSBhIHJlYWQgMCBjb21tYW5kIHRvIGVuc3VyZSB0aGF0IERTQyBoYW5kc2hha2UgaXMKLQkJICogc3dpdGNoZWQgZnJvbSBjb21wbGV0aW9uIG1vZGUgdG8gYnVmZmVyIGF2YWlsYWJsZSBtb2RlLgotCQkgKiBObyBwb2ludCBpbiBpc3N1aW5nIHRoaXMgaWYgRFNDIG92ZXJsYXAgaXNuJ3Qgc3VwcG9ydGVkLCBzb21lCi0JCSAqIGRyaXZlcyAoU2VhZ2F0ZSBTVFQzNDAxQSkgd2lsbCByZXR1cm4gYW4gZXJyb3IuCi0JCSAqLwotCQlpZiAoZHJpdmUtPmRldl9mbGFncyAmIElERV9ERkxBR19EU0NfT1ZFUkxBUCkgewotCQkJYnl0ZXNfcmVhZCA9IGlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwKLQkJCQkJCQlSRVFfSURFVEFQRV9SRUFELCAwLAotCQkJCQkJCXRhcGUtPm1lcmdlX2JoKTsKLQkJCWlmIChieXRlc19yZWFkIDwgMCkgewotCQkJCWlkZV90YXBlX2tmcmVlX2J1ZmZlcih0YXBlKTsKLQkJCQl0YXBlLT5tZXJnZV9iaCA9IE5VTEw7Ci0JCQkJdGFwZS0+Y2hyZGV2X2RpciA9IElERVRBUEVfRElSX05PTkU7Ci0JCQkJcmV0dXJuIGJ5dGVzX3JlYWQ7Ci0JCQl9CisJaWYgKHRhcGUtPmNocmRldl9kaXIgPT0gZGlyKQorCQlyZXR1cm4gMDsKKworCWlmICh0YXBlLT5jaHJkZXZfZGlyID09IElERVRBUEVfRElSX1JFQUQpCisJCWlkZV90YXBlX2Rpc2NhcmRfbWVyZ2VfYnVmZmVyKGRyaXZlLCAxKTsKKwllbHNlIGlmICh0YXBlLT5jaHJkZXZfZGlyID09IElERVRBUEVfRElSX1dSSVRFKSB7CisJCWlkZV90YXBlX2ZsdXNoX21lcmdlX2J1ZmZlcihkcml2ZSk7CisJCWlkZXRhcGVfZmx1c2hfdGFwZV9idWZmZXJzKGRyaXZlKTsKKwl9CisKKwlpZiAodGFwZS0+YnVmIHx8IHRhcGUtPnZhbGlkKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IHZhbGlkIHNob3VsZCBiZSAwIG5vd1xuIik7CisJCXRhcGUtPnZhbGlkID0gMDsKKwl9CisKKwl0YXBlLT5idWYgPSBrbWFsbG9jKHRhcGUtPmJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRhcGUtPmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJdGFwZS0+Y2hyZGV2X2RpciA9IGRpcjsKKwl0YXBlLT5jdXIgPSB0YXBlLT5idWY7CisKKwkvKgorCSAqIElzc3VlIGEgMCBydyBjb21tYW5kIHRvIGVuc3VyZSB0aGF0IERTQyBoYW5kc2hha2UgaXMKKwkgKiBzd2l0Y2hlZCBmcm9tIGNvbXBsZXRpb24gbW9kZSB0byBidWZmZXIgYXZhaWxhYmxlIG1vZGUuICBObworCSAqIHBvaW50IGluIGlzc3VpbmcgdGhpcyBpZiBEU0Mgb3ZlcmxhcCBpc24ndCBzdXBwb3J0ZWQsIHNvbWUKKwkgKiBkcml2ZXMgKFNlYWdhdGUgU1RUMzQwMUEpIHdpbGwgcmV0dXJuIGFuIGVycm9yLgorCSAqLworCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0RTQ19PVkVSTEFQKSB7CisJCWludCBjbWQgPSBkaXIgPT0gSURFVEFQRV9ESVJfUkVBRCA/IFJFUV9JREVUQVBFX1JFQUQKKwkJCQkJCSAgOiBSRVFfSURFVEFQRV9XUklURTsKKworCQlyYyA9IGlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwgY21kLCAwKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJa2ZyZWUodGFwZS0+YnVmKTsKKwkJCXRhcGUtPmJ1ZiA9IE5VTEw7CisJCQl0YXBlLT5jaHJkZXZfZGlyID0gSURFVEFQRV9ESVJfTk9ORTsKKwkJCXJldHVybiByYzsKIAkJfQogCX0KIAogCXJldHVybiAwOwogfQogCi0vKiBjYWxsZWQgZnJvbSBpZGV0YXBlX2NocmRldl9yZWFkKCkgdG8gc2VydmljZSBhIGNocmRldiByZWFkIHJlcXVlc3QuICovCi1zdGF0aWMgaW50IGlkZXRhcGVfYWRkX2NocmRldl9yZWFkX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBpbnQgYmxvY2tzKQotewotCWlkZXRhcGVfdGFwZV90ICp0YXBlID0gZHJpdmUtPmRyaXZlcl9kYXRhOwotCi0JZGVidWdfbG9nKERCR19QUk9DUywgIkVudGVyICVzLCAlZCBibG9ja3NcbiIsIF9fZnVuY19fLCBibG9ja3MpOwotCi0JLyogSWYgd2UgYXJlIGF0IGEgZmlsZW1hcmssIHJldHVybiBhIHJlYWQgbGVuZ3RoIG9mIDAgKi8KLQlpZiAodGVzdF9iaXQoSURFX0FGTEFHX0ZJTEVNQVJLLCAmZHJpdmUtPmF0YXBpX2ZsYWdzKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZGV0YXBlX2luaXRfcmVhZChkcml2ZSk7Ci0KLQlyZXR1cm4gaWRldGFwZV9xdWV1ZV9yd190YWlsKGRyaXZlLCBSRVFfSURFVEFQRV9SRUFELCBibG9ja3MsCi0JCQkJICAgICB0YXBlLT5tZXJnZV9iaCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGlkZXRhcGVfcGFkX3plcm9zKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGJjb3VudCkKIHsKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKLQlzdHJ1Y3QgaWRldGFwZV9iaCAqYmg7Ci0JaW50IGJsb2NrczsKKworCW1lbXNldCh0YXBlLT5idWYsIDAsIHRhcGUtPmJ1ZmZlcl9zaXplKTsKIAogCXdoaWxlIChiY291bnQpIHsKLQkJdW5zaWduZWQgaW50IGNvdW50OworCQl1bnNpZ25lZCBpbnQgY291bnQgPSBtaW4odGFwZS0+YnVmZmVyX3NpemUsIGJjb3VudCk7CiAKLQkJYmggPSB0YXBlLT5tZXJnZV9iaDsKLQkJY291bnQgPSBtaW4odGFwZS0+YnVmZmVyX3NpemUsIGJjb3VudCk7CisJCWlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwgUkVRX0lERVRBUEVfV1JJVEUsIGNvdW50KTsKIAkJYmNvdW50IC09IGNvdW50OwotCQlibG9ja3MgPSBjb3VudCAvIHRhcGUtPmJsa19zaXplOwotCQl3aGlsZSAoY291bnQpIHsKLQkJCWF0b21pY19zZXQoJmJoLT5iX2NvdW50LAotCQkJCSAgIG1pbihjb3VudCwgKHVuc2lnbmVkIGludCliaC0+Yl9zaXplKSk7Ci0JCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSk7Ci0JCQljb3VudCAtPSBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpOwotCQkJYmggPSBiaC0+Yl9yZXFuZXh0OwotCQl9Ci0JCWlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwgUkVRX0lERVRBUEVfV1JJVEUsIGJsb2NrcywKLQkJCQkgICAgICB0YXBlLT5tZXJnZV9iaCk7CiAJfQogfQogCkBAIC0xNDU2LDcgKzExMTIsNyBAQAogCX0KIAogCWlmICh0YXBlLT5jaHJkZXZfZGlyID09IElERVRBUEVfRElSX1JFQUQpIHsKLQkJdGFwZS0+bWVyZ2VfYmhfc2l6ZSA9IDA7CisJCXRhcGUtPnZhbGlkID0gMDsKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJREVfQUZMQUdfRklMRU1BUkssICZkcml2ZS0+YXRhcGlfZmxhZ3MpKQogCQkJKytjb3VudDsKIAkJaWRlX3RhcGVfZGlzY2FyZF9tZXJnZV9idWZmZXIoZHJpdmUsIDApOwpAQCAtMTUwNSw5ICsxMTYxLDkgQEAKIHsKIAlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlkZV9kcml2ZV90ICpkcml2ZSA9IHRhcGUtPmRyaXZlOwotCXNzaXplX3QgYnl0ZXNfcmVhZCwgdGVtcCwgYWN0dWFsbHlfcmVhZCA9IDAsIHJjOworCXNpemVfdCBkb25lID0gMDsKIAlzc2l6ZV90IHJldCA9IDA7Ci0JdTE2IGN0bCA9ICoodTE2ICopJnRhcGUtPmNhcHNbMTJdOworCWludCByYzsKIAogCWRlYnVnX2xvZyhEQkdfQ0hSREVWLCAiRW50ZXIgJXMsIGNvdW50ICVaZFxuIiwgX19mdW5jX18sIGNvdW50KTsKIApAQCAtMTUxNyw0OSArMTE3Myw0MyBAQAogCQkJICAgIChjb3VudCAlIHRhcGUtPmJsa19zaXplKSA9PSAwKQogCQkJCXRhcGUtPnVzZXJfYnNfZmFjdG9yID0gY291bnQgLyB0YXBlLT5ibGtfc2l6ZTsKIAl9Ci0JcmMgPSBpZGV0YXBlX2luaXRfcmVhZChkcml2ZSk7CisKKwlyYyA9IGlkZXRhcGVfaW5pdF9ydyhkcml2ZSwgSURFVEFQRV9ESVJfUkVBRCk7CiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwotCWlmIChjb3VudCA9PSAwKQotCQlyZXR1cm4gKDApOwotCWlmICh0YXBlLT5tZXJnZV9iaF9zaXplKSB7Ci0JCWFjdHVhbGx5X3JlYWQgPSBtaW4oKHVuc2lnbmVkIGludCkodGFwZS0+bWVyZ2VfYmhfc2l6ZSksCi0JCQkJICAgICh1bnNpZ25lZCBpbnQpY291bnQpOwotCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXIodGFwZSwgYnVmLCBhY3R1YWxseV9yZWFkKSkKKworCXdoaWxlIChkb25lIDwgY291bnQpIHsKKwkJc2l6ZV90IHRvZG87CisKKwkJLyogcmVmaWxsIGlmIHN0YWdpbmcgYnVmZmVyIGlzIGVtcHR5ICovCisJCWlmICghdGFwZS0+dmFsaWQpIHsKKwkJCS8qIElmIHdlIGFyZSBhdCBhIGZpbGVtYXJrLCBub3RoaW5nIG1vcmUgdG8gcmVhZCAqLworCQkJaWYgKHRlc3RfYml0KElERV9BRkxBR19GSUxFTUFSSywgJmRyaXZlLT5hdGFwaV9mbGFncykpCisJCQkJYnJlYWs7CisJCQkvKiByZWFkICovCisJCQlpZiAoaWRldGFwZV9xdWV1ZV9yd190YWlsKGRyaXZlLCBSRVFfSURFVEFQRV9SRUFELAorCQkJCQkJICB0YXBlLT5idWZmZXJfc2l6ZSkgPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIGNvcHkgb3V0ICovCisJCXRvZG8gPSBtaW5fdChzaXplX3QsIGNvdW50IC0gZG9uZSwgdGFwZS0+dmFsaWQpOworCQlpZiAoY29weV90b191c2VyKGJ1ZiArIGRvbmUsIHRhcGUtPmN1ciwgdG9kbykpCiAJCQlyZXQgPSAtRUZBVUxUOwotCQlidWYgKz0gYWN0dWFsbHlfcmVhZDsKLQkJdGFwZS0+bWVyZ2VfYmhfc2l6ZSAtPSBhY3R1YWxseV9yZWFkOwotCQljb3VudCAtPSBhY3R1YWxseV9yZWFkOworCisJCXRhcGUtPmN1ciArPSB0b2RvOworCQl0YXBlLT52YWxpZCAtPSB0b2RvOworCQlkb25lICs9IHRvZG87CiAJfQotCXdoaWxlIChjb3VudCA+PSB0YXBlLT5idWZmZXJfc2l6ZSkgewotCQlieXRlc19yZWFkID0gaWRldGFwZV9hZGRfY2hyZGV2X3JlYWRfcmVxdWVzdChkcml2ZSwgY3RsKTsKLQkJaWYgKGJ5dGVzX3JlYWQgPD0gMCkKLQkJCWdvdG8gZmluaXNoOwotCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXIodGFwZSwgYnVmLCBieXRlc19yZWFkKSkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCWJ1ZiArPSBieXRlc19yZWFkOwotCQljb3VudCAtPSBieXRlc19yZWFkOwotCQlhY3R1YWxseV9yZWFkICs9IGJ5dGVzX3JlYWQ7Ci0JfQotCWlmIChjb3VudCkgewotCQlieXRlc19yZWFkID0gaWRldGFwZV9hZGRfY2hyZGV2X3JlYWRfcmVxdWVzdChkcml2ZSwgY3RsKTsKLQkJaWYgKGJ5dGVzX3JlYWQgPD0gMCkKLQkJCWdvdG8gZmluaXNoOwotCQl0ZW1wID0gbWluKCh1bnNpZ25lZCBsb25nKWNvdW50LCAodW5zaWduZWQgbG9uZylieXRlc19yZWFkKTsKLQkJaWYgKGlkZXRhcGVfY29weV9zdGFnZV90b191c2VyKHRhcGUsIGJ1ZiwgdGVtcCkpCi0JCQlyZXQgPSAtRUZBVUxUOwotCQlhY3R1YWxseV9yZWFkICs9IHRlbXA7Ci0JCXRhcGUtPm1lcmdlX2JoX3NpemUgPSBieXRlc19yZWFkLXRlbXA7Ci0JfQotZmluaXNoOgotCWlmICghYWN0dWFsbHlfcmVhZCAmJiB0ZXN0X2JpdChJREVfQUZMQUdfRklMRU1BUkssICZkcml2ZS0+YXRhcGlfZmxhZ3MpKSB7CisKKwlpZiAoIWRvbmUgJiYgdGVzdF9iaXQoSURFX0FGTEFHX0ZJTEVNQVJLLCAmZHJpdmUtPmF0YXBpX2ZsYWdzKSkgewogCQlkZWJ1Z19sb2coREJHX1NFTlNFLCAiJXM6IHNwYWNpbmcgb3ZlciBmaWxlbWFya1xuIiwgdGFwZS0+bmFtZSk7CiAKIAkJaWRldGFwZV9zcGFjZV9vdmVyX2ZpbGVtYXJrcyhkcml2ZSwgTVRGU0YsIDEpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlyZXR1cm4gcmV0ID8gcmV0IDogYWN0dWFsbHlfcmVhZDsKKwlyZXR1cm4gcmV0ID8gcmV0IDogZG9uZTsKIH0KIAogc3RhdGljIHNzaXplX3QgaWRldGFwZV9jaHJkZXZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCkBAIC0xNTY3LDkgKzEyMTcsOSBAQAogewogCXN0cnVjdCBpZGVfdGFwZV9vYmogKnRhcGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdGFwZS0+ZHJpdmU7Ci0Jc3NpemVfdCBhY3R1YWxseV93cml0dGVuID0gMDsKKwlzaXplX3QgZG9uZSA9IDA7CiAJc3NpemVfdCByZXQgPSAwOwotCXUxNiBjdGwgPSAqKHUxNiAqKSZ0YXBlLT5jYXBzWzEyXTsKKwlpbnQgcmM7CiAKIAkvKiBUaGUgZHJpdmUgaXMgd3JpdGUgcHJvdGVjdGVkLiAqLwogCWlmICh0YXBlLT53cml0ZV9wcm90KQpAQCAtMTU3OCw4MCArMTIyOCwzMSBAQAogCWRlYnVnX2xvZyhEQkdfQ0hSREVWLCAiRW50ZXIgJXMsIGNvdW50ICVaZFxuIiwgX19mdW5jX18sIGNvdW50KTsKIAogCS8qIEluaXRpYWxpemUgd3JpdGUgb3BlcmF0aW9uICovCi0JaWYgKHRhcGUtPmNocmRldl9kaXIgIT0gSURFVEFQRV9ESVJfV1JJVEUpIHsKLQkJaWYgKHRhcGUtPmNocmRldl9kaXIgPT0gSURFVEFQRV9ESVJfUkVBRCkKLQkJCWlkZV90YXBlX2Rpc2NhcmRfbWVyZ2VfYnVmZmVyKGRyaXZlLCAxKTsKLQkJaWYgKHRhcGUtPm1lcmdlX2JoIHx8IHRhcGUtPm1lcmdlX2JoX3NpemUpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IG1lcmdlX2JoX3NpemUgIgotCQkJCSJzaG91bGQgYmUgMCBub3dcbiIpOwotCQkJdGFwZS0+bWVyZ2VfYmhfc2l6ZSA9IDA7Ci0JCX0KLQkJdGFwZS0+bWVyZ2VfYmggPSBpZGVfdGFwZV9rbWFsbG9jX2J1ZmZlcih0YXBlLCAwLCAwKTsKLQkJaWYgKCF0YXBlLT5tZXJnZV9iaCkKLQkJCXJldHVybiAtRU5PTUVNOwotCQl0YXBlLT5jaHJkZXZfZGlyID0gSURFVEFQRV9ESVJfV1JJVEU7Ci0JCWlkZXRhcGVfaW5pdF9tZXJnZV9idWZmZXIodGFwZSk7CisJcmMgPSBpZGV0YXBlX2luaXRfcncoZHJpdmUsIElERVRBUEVfRElSX1dSSVRFKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CiAKLQkJLyoKLQkJICogSXNzdWUgYSB3cml0ZSAwIGNvbW1hbmQgdG8gZW5zdXJlIHRoYXQgRFNDIGhhbmRzaGFrZSBpcwotCQkgKiBzd2l0Y2hlZCBmcm9tIGNvbXBsZXRpb24gbW9kZSB0byBidWZmZXIgYXZhaWxhYmxlIG1vZGUuIE5vCi0JCSAqIHBvaW50IGluIGlzc3VpbmcgdGhpcyBpZiBEU0Mgb3ZlcmxhcCBpc24ndCBzdXBwb3J0ZWQsIHNvbWUKLQkJICogZHJpdmVzIChTZWFnYXRlIFNUVDM0MDFBKSB3aWxsIHJldHVybiBhbiBlcnJvci4KLQkJICovCi0JCWlmIChkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX0RTQ19PVkVSTEFQKSB7Ci0JCQlzc2l6ZV90IHJldHZhbCA9IGlkZXRhcGVfcXVldWVfcndfdGFpbChkcml2ZSwKLQkJCQkJCQlSRVFfSURFVEFQRV9XUklURSwgMCwKLQkJCQkJCQl0YXBlLT5tZXJnZV9iaCk7Ci0JCQlpZiAocmV0dmFsIDwgMCkgewotCQkJCWlkZV90YXBlX2tmcmVlX2J1ZmZlcih0YXBlKTsKLQkJCQl0YXBlLT5tZXJnZV9iaCA9IE5VTEw7Ci0JCQkJdGFwZS0+Y2hyZGV2X2RpciA9IElERVRBUEVfRElSX05PTkU7Ci0JCQkJcmV0dXJuIHJldHZhbDsKLQkJCX0KLQkJfQotCX0KLQlpZiAoY291bnQgPT0gMCkKLQkJcmV0dXJuICgwKTsKLQlpZiAodGFwZS0+bWVyZ2VfYmhfc2l6ZSkgewotCQlpZiAodGFwZS0+bWVyZ2VfYmhfc2l6ZSA+PSB0YXBlLT5idWZmZXJfc2l6ZSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYnVnOiBtZXJnZSBidWYgdG9vIGJpZ1xuIik7Ci0JCQl0YXBlLT5tZXJnZV9iaF9zaXplID0gMDsKLQkJfQotCQlhY3R1YWxseV93cml0dGVuID0gbWluKCh1bnNpZ25lZCBpbnQpCi0JCQkJKHRhcGUtPmJ1ZmZlcl9zaXplIC0gdGFwZS0+bWVyZ2VfYmhfc2l6ZSksCi0JCQkJKHVuc2lnbmVkIGludCljb3VudCk7Ci0JCWlmIChpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyKHRhcGUsIGJ1ZiwgYWN0dWFsbHlfd3JpdHRlbikpCi0JCQkJcmV0ID0gLUVGQVVMVDsKLQkJYnVmICs9IGFjdHVhbGx5X3dyaXR0ZW47Ci0JCXRhcGUtPm1lcmdlX2JoX3NpemUgKz0gYWN0dWFsbHlfd3JpdHRlbjsKLQkJY291bnQgLT0gYWN0dWFsbHlfd3JpdHRlbjsKKwl3aGlsZSAoZG9uZSA8IGNvdW50KSB7CisJCXNpemVfdCB0b2RvOwogCi0JCWlmICh0YXBlLT5tZXJnZV9iaF9zaXplID09IHRhcGUtPmJ1ZmZlcl9zaXplKSB7Ci0JCQlzc2l6ZV90IHJldHZhbDsKLQkJCXRhcGUtPm1lcmdlX2JoX3NpemUgPSAwOwotCQkJcmV0dmFsID0gaWRldGFwZV9hZGRfY2hyZGV2X3dyaXRlX3JlcXVlc3QoZHJpdmUsIGN0bCk7Ci0JCQlpZiAocmV0dmFsIDw9IDApCi0JCQkJcmV0dXJuIChyZXR2YWwpOwotCQl9Ci0JfQotCXdoaWxlIChjb3VudCA+PSB0YXBlLT5idWZmZXJfc2l6ZSkgewotCQlzc2l6ZV90IHJldHZhbDsKLQkJaWYgKGlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIodGFwZSwgYnVmLCB0YXBlLT5idWZmZXJfc2l6ZSkpCisJCS8qIGZsdXNoIGlmIHN0YWdpbmcgYnVmZmVyIGlzIGZ1bGwgKi8KKwkJaWYgKHRhcGUtPnZhbGlkID09IHRhcGUtPmJ1ZmZlcl9zaXplICYmCisJCSAgICBpZGV0YXBlX3F1ZXVlX3J3X3RhaWwoZHJpdmUsIFJFUV9JREVUQVBFX1dSSVRFLAorCQkJCQkgIHRhcGUtPmJ1ZmZlcl9zaXplKSA8PSAwKQorCQkJcmV0dXJuIHJjOworCisJCS8qIGNvcHkgaW4gKi8KKwkJdG9kbyA9IG1pbl90KHNpemVfdCwgY291bnQgLSBkb25lLAorCQkJICAgICB0YXBlLT5idWZmZXJfc2l6ZSAtIHRhcGUtPnZhbGlkKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHRhcGUtPmN1ciwgYnVmICsgZG9uZSwgdG9kbykpCiAJCQlyZXQgPSAtRUZBVUxUOwotCQlidWYgKz0gdGFwZS0+YnVmZmVyX3NpemU7Ci0JCWNvdW50IC09IHRhcGUtPmJ1ZmZlcl9zaXplOwotCQlyZXR2YWwgPSBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdChkcml2ZSwgY3RsKTsKLQkJYWN0dWFsbHlfd3JpdHRlbiArPSB0YXBlLT5idWZmZXJfc2l6ZTsKLQkJaWYgKHJldHZhbCA8PSAwKQotCQkJcmV0dXJuIChyZXR2YWwpOworCisJCXRhcGUtPmN1ciArPSB0b2RvOworCQl0YXBlLT52YWxpZCArPSB0b2RvOworCQlkb25lICs9IHRvZG87CiAJfQotCWlmIChjb3VudCkgewotCQlhY3R1YWxseV93cml0dGVuICs9IGNvdW50OwotCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX2Zyb21fdXNlcih0YXBlLCBidWYsIGNvdW50KSkKLQkJCXJldCA9IC1FRkFVTFQ7Ci0JCXRhcGUtPm1lcmdlX2JoX3NpemUgKz0gY291bnQ7Ci0JfQotCXJldHVybiByZXQgPyByZXQgOiBhY3R1YWxseV93cml0dGVuOworCisJcmV0dXJuIHJldCA/IHJldCA6IGRvbmU7CiB9CiAKIHN0YXRpYyBpbnQgaWRldGFwZV93cml0ZV9maWxlbWFyayhpZGVfZHJpdmVfdCAqZHJpdmUpCkBAIC0xODEyLDcgKzE0MTMsNyBAQAogCQlpZGV0YXBlX2ZsdXNoX3RhcGVfYnVmZmVycyhkcml2ZSk7CiAJfQogCWlmIChjbWQgPT0gTVRJT0NHRVQgfHwgY21kID09IE1USU9DUE9TKSB7Ci0JCWJsb2NrX29mZnNldCA9IHRhcGUtPm1lcmdlX2JoX3NpemUgLworCQlibG9ja19vZmZzZXQgPSB0YXBlLT52YWxpZCAvCiAJCQkodGFwZS0+YmxrX3NpemUgKiB0YXBlLT51c2VyX2JzX2ZhY3Rvcik7CiAJCXBvc2l0aW9uID0gaWRldGFwZV9yZWFkX3Bvc2l0aW9uKGRyaXZlKTsKIAkJaWYgKHBvc2l0aW9uIDwgMCkKQEAgLTE5NjAsMTIgKzE1NjEsMTIgQEAKIAlpZGV0YXBlX3RhcGVfdCAqdGFwZSA9IGRyaXZlLT5kcml2ZXJfZGF0YTsKIAogCWlkZV90YXBlX2ZsdXNoX21lcmdlX2J1ZmZlcihkcml2ZSk7Ci0JdGFwZS0+bWVyZ2VfYmggPSBpZGVfdGFwZV9rbWFsbG9jX2J1ZmZlcih0YXBlLCAxLCAwKTsKLQlpZiAodGFwZS0+bWVyZ2VfYmggIT0gTlVMTCkgeworCXRhcGUtPmJ1ZiA9IGttYWxsb2ModGFwZS0+YnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCWlmICh0YXBlLT5idWYgIT0gTlVMTCkgewogCQlpZGV0YXBlX3BhZF96ZXJvcyhkcml2ZSwgdGFwZS0+YmxrX3NpemUgKgogCQkJCSh0YXBlLT51c2VyX2JzX2ZhY3RvciAtIDEpKTsKLQkJaWRlX3RhcGVfa2ZyZWVfYnVmZmVyKHRhcGUpOwotCQl0YXBlLT5tZXJnZV9iaCA9IE5VTEw7CisJCWtmcmVlKHRhcGUtPmJ1Zik7CisJCXRhcGUtPmJ1ZiA9IE5VTEw7CiAJfQogCWlkZXRhcGVfd3JpdGVfZmlsZW1hcmsoZHJpdmUpOwogCWlkZXRhcGVfZmx1c2hfdGFwZV9idWZmZXJzKGRyaXZlKTsKQEAgLTIxNTksOCArMTc2MCw2IEBACiAJdTE2ICpjdGwgPSAodTE2ICopJnRhcGUtPmNhcHNbMTJdOwogCiAJZHJpdmUtPnBjX2NhbGxiYWNrCSA9IGlkZV90YXBlX2NhbGxiYWNrOwotCWRyaXZlLT5wY191cGRhdGVfYnVmZmVycyA9IGlkZXRhcGVfdXBkYXRlX2J1ZmZlcnM7Ci0JZHJpdmUtPnBjX2lvX2J1ZmZlcnMJID0gaWRlX3RhcGVfaW9fYnVmZmVyczsKIAogCWRyaXZlLT5kZXZfZmxhZ3MgfD0gSURFX0RGTEFHX0RTQ19PVkVSTEFQOwogCkBAIC0yMTkxLDExICsxNzkwLDYgQEAKIAkJdGFwZS0+YnVmZmVyX3NpemUgPSAqY3RsICogdGFwZS0+YmxrX3NpemU7CiAJfQogCWJ1ZmZlcl9zaXplID0gdGFwZS0+YnVmZmVyX3NpemU7Ci0JdGFwZS0+cGFnZXNfcGVyX2J1ZmZlciA9IGJ1ZmZlcl9zaXplIC8gUEFHRV9TSVpFOwotCWlmIChidWZmZXJfc2l6ZSAlIFBBR0VfU0laRSkgewotCQl0YXBlLT5wYWdlc19wZXJfYnVmZmVyKys7Ci0JCXRhcGUtPmV4Y2Vzc19iaF9zaXplID0gUEFHRV9TSVpFIC0gYnVmZmVyX3NpemUgJSBQQUdFX1NJWkU7Ci0JfQogCiAJLyogc2VsZWN0IHRoZSAiYmVzdCIgRFNDIHJlYWQvd3JpdGUgcG9sbGluZyBmcmVxICovCiAJc3BlZWQgPSBtYXgoKih1MTYgKikmdGFwZS0+Y2Fwc1sxNF0sICoodTE2ICopJnRhcGUtPmNhcHNbOF0pOwpAQCAtMjIzOCw3ICsxODMyLDcgQEAKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0YXBlLT5kcml2ZTsKIAlzdHJ1Y3QgZ2VuZGlzayAqZyA9IHRhcGUtPmRpc2s7CiAKLQlCVUdfT04odGFwZS0+bWVyZ2VfYmhfc2l6ZSk7CisJQlVHX09OKHRhcGUtPnZhbGlkKTsKIAogCWRyaXZlLT5kZXZfZmxhZ3MgJj0gfklERV9ERkxBR19EU0NfT1ZFUkxBUDsKIAlkcml2ZS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYwppbmRleCA0YWE2MjIzLi5hMGMzZTFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtdGFza2ZpbGUuYwpAQCAtMzg1LDcgKzM4NSw3IEBACiAJaWYgKChjbWQtPnRmX2ZsYWdzICYgSURFX1RGTEFHX0ZTKSA9PSAwKQogCQlpZGVfZmluaXNoX2NtZChkcml2ZSwgY21kLCBzdGF0KTsKIAllbHNlCi0JCWlkZV9jb21wbGV0ZV9ycShkcml2ZSwgMCwgY21kLT5ycS0+bnJfc2VjdG9ycyA8PCA5KTsKKwkJaWRlX2NvbXBsZXRlX3JxKGRyaXZlLCAwLCBibGtfcnFfc2VjdG9ycyhjbWQtPnJxKSA8PCA5KTsKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiBvdXRfZXJyOgogCWlkZV9lcnJvcl9jbWQoZHJpdmUsIGNtZCk7CkBAIC00MjQsNyArNDI0LDkgQEAKIAogCXJxID0gYmxrX2dldF9yZXF1ZXN0KGRyaXZlLT5xdWV1ZSwgUkVBRCwgX19HRlBfV0FJVCk7CiAJcnEtPmNtZF90eXBlID0gUkVRX1RZUEVfQVRBX1RBU0tGSUxFOwotCXJxLT5idWZmZXIgPSBidWY7CisKKwlpZiAoY21kLT50Zl9mbGFncyAmIElERV9URkxBR19XUklURSkKKwkJcnEtPmNtZF9mbGFncyB8PSBSRVFfUlc7CiAKIAkvKgogCSAqIChrcykgV2UgdHJhbnNmZXIgY3VycmVudGx5IG9ubHkgd2hvbGUgc2VjdG9ycy4KQEAgLTQzMiwxOCArNDM0LDIwIEBACiAJICogaWYgd2Ugd291bGQgZmluZCBhIHNvbHV0aW9uIHRvIHRyYW5zZmVyIGFueSBzaXplLgogCSAqIFRvIHN1cHBvcnQgc3BlY2lhbCBjb21tYW5kcyBsaWtlIFJFQUQgTE9ORy4KIAkgKi8KLQlycS0+aGFyZF9ucl9zZWN0b3JzID0gcnEtPm5yX3NlY3RvcnMgPSBuc2VjdDsKLQlycS0+aGFyZF9jdXJfc2VjdG9ycyA9IHJxLT5jdXJyZW50X25yX3NlY3RvcnMgPSBuc2VjdDsKLQotCWlmIChjbWQtPnRmX2ZsYWdzICYgSURFX1RGTEFHX1dSSVRFKQotCQlycS0+Y21kX2ZsYWdzIHw9IFJFUV9SVzsKKwlpZiAobnNlY3QpIHsKKwkJZXJyb3IgPSBibGtfcnFfbWFwX2tlcm4oZHJpdmUtPnF1ZXVlLCBycSwgYnVmLAorCQkJCQluc2VjdCAqIFNFQ1RPUl9TSVpFLCBfX0dGUF9XQUlUKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBwdXRfcmVxOworCX0KIAogCXJxLT5zcGVjaWFsID0gY21kOwogCWNtZC0+cnEgPSBycTsKIAogCWVycm9yID0gYmxrX2V4ZWN1dGVfcnEoZHJpdmUtPnF1ZXVlLCBOVUxMLCBycSwgMCk7Ci0JYmxrX3B1dF9yZXF1ZXN0KHJxKTsKIAorcHV0X3JlcToKKwlibGtfcHV0X3JlcXVlc3QocnEpOwogCXJldHVybiBlcnJvcjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGRjMjAyeHhfb2xkLmMgYi9kcml2ZXJzL2lkZS9wZGMyMDJ4eF9vbGQuYwppbmRleCBiM2JjOTZmLi5lMjRlY2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wZGMyMDJ4eF9vbGQuYworKysgYi9kcml2ZXJzL2lkZS9wZGMyMDJ4eF9vbGQuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJCXU4IGNsb2NrID0gaW5iKGhpZ2hfMTYgKyAweDExKTsKIAogCQlvdXRiKGNsb2NrIHwgKGh3aWYtPmNoYW5uZWwgPyAweDA4IDogMHgwMiksIGhpZ2hfMTYgKyAweDExKTsKLQkJd29yZF9jb3VudCA9IChycS0+bnJfc2VjdG9ycyA8PCA4KTsKKwkJd29yZF9jb3VudCA9IChibGtfcnFfc2VjdG9ycyhycSkgPDwgOCk7CiAJCXdvcmRfY291bnQgPSAocnFfZGF0YV9kaXIocnEpID09IFJFQUQpID8KIAkJCQkJd29yZF9jb3VudCB8IDB4MDUwMDAwMDAgOgogCQkJCQl3b3JkX2NvdW50IHwgMHgwNjAwMDAwMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMgYi9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jCmluZGV4IGI0Y2Y0MmQuLjA1YTkzZDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS90Yzg2YzAwMS5jCisrKyBiL2RyaXZlcnMvaWRlL3RjODZjMDAxLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCWlkZV9od2lmX3QgKmh3aWYJPSBkcml2ZS0+aHdpZjsKIAl1bnNpZ25lZCBsb25nIHNjX2Jhc2UJPSBod2lmLT5jb25maWdfZGF0YTsKIAl1bnNpZ25lZCBsb25nIHR3Y3JfcG9ydAk9IHNjX2Jhc2UgKyAoZHJpdmUtPmRuID8gMHgwNiA6IDB4MDQpOwotCXVuc2lnbmVkIGxvbmcgbnNlY3RvcnMJPSBod2lmLT5ycS0+bnJfc2VjdG9yczsKKwl1bnNpZ25lZCBsb25nIG5zZWN0b3JzCT0gYmxrX3JxX3NlY3RvcnMoaHdpZi0+cnEpOwogCiAJLyoKIAkgKiBXZSBoYXZlIHRvIG1hbnVhbGx5IGxvYWQgdGhlIHNlY3RvciBjb3VudCBhbmQgc2l6ZSBpbnRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS90eDQ5MzlpZGUuYyBiL2RyaXZlcnMvaWRlL3R4NDkzOWlkZS5jCmluZGV4IDU2NDQyMmQuLjVjYTc2MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3R4NDkzOWlkZS5jCisrKyBiL2RyaXZlcnMvaWRlL3R4NDkzOWlkZS5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAl0eDQ5MzlpZGVfd3JpdGV3KFNFQ1RPUl9TSVpFIC8gMiwgYmFzZSwgZHJpdmUtPmRuID8KIAkJCSBUWDQ5MzlJREVfWGZlcl9DbnRfMiA6IFRYNDkzOUlERV9YZmVyX0NudF8xKTsKIAotCXR4NDkzOWlkZV93cml0ZXcoY21kLT5ycS0+bnJfc2VjdG9ycywgYmFzZSwgVFg0OTM5SURFX1NlY19DbnQpOworCXR4NDkzOWlkZV93cml0ZXcoYmxrX3JxX3NlY3RvcnMoY21kLT5ycSksIGJhc2UsIFRYNDkzOUlERV9TZWNfQ250KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggNTZkZjFjZS4uMzMxOWMyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkJdGFyZ2V0ID0gcmRldi0+c2Jfc3RhcnQgKyBvZmZzZXQgKyBpbmRleCAqIChQQUdFX1NJWkUvNTEyKTsKIAogCQlpZiAoc3luY19wYWdlX2lvKHJkZXYtPmJkZXYsIHRhcmdldCwKLQkJCQkgcm91bmR1cChzaXplLCBiZGV2X2hhcmRzZWN0X3NpemUocmRldi0+YmRldikpLAorCQkJCSByb3VuZHVwKHNpemUsIGJkZXZfbG9naWNhbF9ibG9ja19zaXplKHJkZXYtPmJkZXYpKSwKIAkJCQkgcGFnZSwgUkVBRCkpIHsKIAkJCXBhZ2UtPmluZGV4ID0gaW5kZXg7CiAJCQlhdHRhY2hfcGFnZV9idWZmZXJzKHBhZ2UsIE5VTEwpOyAvKiBzbyB0aGF0IGZyZWVfYnVmZmVyIHdpbGwKQEAgLTI4Nyw3ICsyODcsNyBAQAogCQkJaW50IHNpemUgPSBQQUdFX1NJWkU7CiAJCQlpZiAocGFnZS0+aW5kZXggPT0gYml0bWFwLT5maWxlX3BhZ2VzLTEpCiAJCQkJc2l6ZSA9IHJvdW5kdXAoYml0bWFwLT5sYXN0X3BhZ2Vfc2l6ZSwKLQkJCQkJICAgICAgIGJkZXZfaGFyZHNlY3Rfc2l6ZShyZGV2LT5iZGV2KSk7CisJCQkJCSAgICAgICBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShyZGV2LT5iZGV2KSk7CiAJCQkvKiBKdXN0IG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgY29ycnVwdGluZyBkYXRhIG9yCiAJCQkgKiBtZXRhZGF0YQogCQkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jIGIvZHJpdmVycy9tZC9kbS1leGNlcHRpb24tc3RvcmUuYwppbmRleCBhMmUyNmMyLi43NWQ4MDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWV4Y2VwdGlvbi1zdG9yZS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZXhjZXB0aW9uLXN0b3JlLmMKQEAgLTE3OCw3ICsxNzgsNyBAQAogCX0KIAogCS8qIFZhbGlkYXRlIHRoZSBjaHVuayBzaXplIGFnYWluc3QgdGhlIGRldmljZSBibG9jayBzaXplICovCi0JaWYgKGNodW5rX3NpemVfdWxvbmcgJSAoYmRldl9oYXJkc2VjdF9zaXplKHN0b3JlLT5jb3ctPmJkZXYpID4+IDkpKSB7CisJaWYgKGNodW5rX3NpemVfdWxvbmcgJSAoYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoc3RvcmUtPmNvdy0+YmRldikgPj4gOSkpIHsKIAkJKmVycm9yID0gIkNodW5rIHNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2YgZGV2aWNlIGJsb2Nrc2l6ZSI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLmMgYi9kcml2ZXJzL21kL2RtLWxvZy5jCmluZGV4IGJlMjMzYmMuLjZmYThjY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2cuYwpAQCAtNDEzLDcgKzQxMyw4IEBACiAJCSAqIEJ1ZmZlciBob2xkcyBib3RoIGhlYWRlciBhbmQgYml0c2V0LgogCQkgKi8KIAkJYnVmX3NpemUgPSBkbV9yb3VuZF91cCgoTE9HX09GRlNFVCA8PCBTRUNUT1JfU0hJRlQpICsKLQkJCQkgICAgICAgYml0c2V0X3NpemUsIHRpLT5saW1pdHMuaGFyZHNlY3Rfc2l6ZSk7CisJCQkJICAgICAgIGJpdHNldF9zaXplLAorCQkJCSAgICAgICB0aS0+bGltaXRzLmxvZ2ljYWxfYmxvY2tfc2l6ZSk7CiAKIAkJaWYgKGJ1Zl9zaXplID4gZGV2LT5iZGV2LT5iZF9pbm9kZS0+aV9zaXplKSB7CiAJCQlETVdBUk4oImxvZyBkZXZpY2UgJXMgdG9vIHNtYWxsOiBuZWVkICVsbHUgYnl0ZXMiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYyBiL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMKaW5kZXggZTc1YzZkZC4uMjY2MmE0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAkgKi8KIAlpZiAoIXBzLT5zdG9yZS0+Y2h1bmtfc2l6ZSkgewogCQlwcy0+c3RvcmUtPmNodW5rX3NpemUgPSBtYXgoRE1fQ0hVTktfU0laRV9ERUZBVUxUX1NFQ1RPUlMsCi0JCSAgICBiZGV2X2hhcmRzZWN0X3NpemUocHMtPnN0b3JlLT5jb3ctPmJkZXYpID4+IDkpOworCQkgICAgYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUocHMtPnN0b3JlLT5jb3ctPmJkZXYpID4+IDkpOwogCQlwcy0+c3RvcmUtPmNodW5rX21hc2sgPSBwcy0+c3RvcmUtPmNodW5rX3NpemUgLSAxOwogCQlwcy0+c3RvcmUtPmNodW5rX3NoaWZ0ID0gZmZzKHBzLT5zdG9yZS0+Y2h1bmtfc2l6ZSkgLSAxOwogCQljaHVua19zaXplX3N1cHBsaWVkID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwppbmRleCA0MjliNTBiLi5lOWE3M2JiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC0xMDgsNyArMTA4LDggQEAKIAlsaHMtPm1heF9od19zZWdtZW50cyA9CiAJCW1pbl9ub3RfemVybyhsaHMtPm1heF9od19zZWdtZW50cywgcmhzLT5tYXhfaHdfc2VnbWVudHMpOwogCi0JbGhzLT5oYXJkc2VjdF9zaXplID0gbWF4KGxocy0+aGFyZHNlY3Rfc2l6ZSwgcmhzLT5oYXJkc2VjdF9zaXplKTsKKwlsaHMtPmxvZ2ljYWxfYmxvY2tfc2l6ZSA9IG1heChsaHMtPmxvZ2ljYWxfYmxvY2tfc2l6ZSwKKwkJCQkgICAgICByaHMtPmxvZ2ljYWxfYmxvY2tfc2l6ZSk7CiAKIAlsaHMtPm1heF9zZWdtZW50X3NpemUgPQogCQltaW5fbm90X3plcm8obGhzLT5tYXhfc2VnbWVudF9zaXplLCByaHMtPm1heF9zZWdtZW50X3NpemUpOwpAQCAtNTA5LDcgKzUxMCw3IEBACiAJICogICAgICAgIGNvbWJpbmVfcmVzdHJpY3Rpb25zX2xvdygpCiAJICovCiAJcnMtPm1heF9zZWN0b3JzID0KLQkJbWluX25vdF96ZXJvKHJzLT5tYXhfc2VjdG9ycywgcS0+bWF4X3NlY3RvcnMpOworCQltaW5fbm90X3plcm8ocnMtPm1heF9zZWN0b3JzLCBxdWV1ZV9tYXhfc2VjdG9ycyhxKSk7CiAKIAkvKgogCSAqIENoZWNrIGlmIG1lcmdlIGZuIGlzIHN1cHBvcnRlZC4KQEAgLTUyNCwyNCArNTI1LDI1IEBACiAKIAlycy0+bWF4X3BoeXNfc2VnbWVudHMgPQogCQltaW5fbm90X3plcm8ocnMtPm1heF9waHlzX3NlZ21lbnRzLAotCQkJICAgICBxLT5tYXhfcGh5c19zZWdtZW50cyk7CisJCQkgICAgIHF1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEpKTsKIAogCXJzLT5tYXhfaHdfc2VnbWVudHMgPQotCQltaW5fbm90X3plcm8ocnMtPm1heF9od19zZWdtZW50cywgcS0+bWF4X2h3X3NlZ21lbnRzKTsKKwkJbWluX25vdF96ZXJvKHJzLT5tYXhfaHdfc2VnbWVudHMsIHF1ZXVlX21heF9od19zZWdtZW50cyhxKSk7CiAKLQlycy0+aGFyZHNlY3Rfc2l6ZSA9IG1heChycy0+aGFyZHNlY3Rfc2l6ZSwgcS0+aGFyZHNlY3Rfc2l6ZSk7CisJcnMtPmxvZ2ljYWxfYmxvY2tfc2l6ZSA9IG1heChycy0+bG9naWNhbF9ibG9ja19zaXplLAorCQkJCSAgICAgcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEpKTsKIAogCXJzLT5tYXhfc2VnbWVudF9zaXplID0KLQkJbWluX25vdF96ZXJvKHJzLT5tYXhfc2VnbWVudF9zaXplLCBxLT5tYXhfc2VnbWVudF9zaXplKTsKKwkJbWluX25vdF96ZXJvKHJzLT5tYXhfc2VnbWVudF9zaXplLCBxdWV1ZV9tYXhfc2VnbWVudF9zaXplKHEpKTsKIAogCXJzLT5tYXhfaHdfc2VjdG9ycyA9Ci0JCW1pbl9ub3RfemVybyhycy0+bWF4X2h3X3NlY3RvcnMsIHEtPm1heF9od19zZWN0b3JzKTsKKwkJbWluX25vdF96ZXJvKHJzLT5tYXhfaHdfc2VjdG9ycywgcXVldWVfbWF4X2h3X3NlY3RvcnMocSkpOwogCiAJcnMtPnNlZ19ib3VuZGFyeV9tYXNrID0KIAkJbWluX25vdF96ZXJvKHJzLT5zZWdfYm91bmRhcnlfbWFzaywKLQkJCSAgICAgcS0+c2VnX2JvdW5kYXJ5X21hc2spOworCQkJICAgICBxdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KHEpKTsKIAotCXJzLT5ib3VuY2VfcGZuID0gbWluX25vdF96ZXJvKHJzLT5ib3VuY2VfcGZuLCBxLT5ib3VuY2VfcGZuKTsKKwlycy0+Ym91bmNlX3BmbiA9IG1pbl9ub3RfemVybyhycy0+Ym91bmNlX3BmbiwgcXVldWVfYm91bmNlX3BmbihxKSk7CiAKIAlycy0+bm9fY2x1c3RlciB8PSAhdGVzdF9iaXQoUVVFVUVfRkxBR19DTFVTVEVSLCAmcS0+cXVldWVfZmxhZ3MpOwogfQpAQCAtNjgzLDggKzY4NSw4IEBACiAJCXJzLT5tYXhfcGh5c19zZWdtZW50cyA9IE1BWF9QSFlTX1NFR01FTlRTOwogCWlmICghcnMtPm1heF9od19zZWdtZW50cykKIAkJcnMtPm1heF9od19zZWdtZW50cyA9IE1BWF9IV19TRUdNRU5UUzsKLQlpZiAoIXJzLT5oYXJkc2VjdF9zaXplKQotCQlycy0+aGFyZHNlY3Rfc2l6ZSA9IDEgPDwgU0VDVE9SX1NISUZUOworCWlmICghcnMtPmxvZ2ljYWxfYmxvY2tfc2l6ZSkKKwkJcnMtPmxvZ2ljYWxfYmxvY2tfc2l6ZSA9IDEgPDwgU0VDVE9SX1NISUZUOwogCWlmICghcnMtPm1heF9zZWdtZW50X3NpemUpCiAJCXJzLT5tYXhfc2VnbWVudF9zaXplID0gTUFYX1NFR01FTlRfU0laRTsKIAlpZiAoIXJzLT5zZWdfYm91bmRhcnlfbWFzaykKQEAgLTkxMiwxMyArOTE0LDEzIEBACiAJICogcmVzdHJpY3Rpb25zLgogCSAqLwogCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCB0LT5saW1pdHMubWF4X3NlY3RvcnMpOwotCXEtPm1heF9waHlzX3NlZ21lbnRzID0gdC0+bGltaXRzLm1heF9waHlzX3NlZ21lbnRzOwotCXEtPm1heF9od19zZWdtZW50cyA9IHQtPmxpbWl0cy5tYXhfaHdfc2VnbWVudHM7Ci0JcS0+aGFyZHNlY3Rfc2l6ZSA9IHQtPmxpbWl0cy5oYXJkc2VjdF9zaXplOwotCXEtPm1heF9zZWdtZW50X3NpemUgPSB0LT5saW1pdHMubWF4X3NlZ21lbnRfc2l6ZTsKLQlxLT5tYXhfaHdfc2VjdG9ycyA9IHQtPmxpbWl0cy5tYXhfaHdfc2VjdG9yczsKLQlxLT5zZWdfYm91bmRhcnlfbWFzayA9IHQtPmxpbWl0cy5zZWdfYm91bmRhcnlfbWFzazsKLQlxLT5ib3VuY2VfcGZuID0gdC0+bGltaXRzLmJvdW5jZV9wZm47CisJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHEsIHQtPmxpbWl0cy5tYXhfcGh5c19zZWdtZW50cyk7CisJYmxrX3F1ZXVlX21heF9od19zZWdtZW50cyhxLCB0LT5saW1pdHMubWF4X2h3X3NlZ21lbnRzKTsKKwlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEsIHQtPmxpbWl0cy5sb2dpY2FsX2Jsb2NrX3NpemUpOworCWJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKHEsIHQtPmxpbWl0cy5tYXhfc2VnbWVudF9zaXplKTsKKwlibGtfcXVldWVfbWF4X2h3X3NlY3RvcnMocSwgdC0+bGltaXRzLm1heF9od19zZWN0b3JzKTsKKwlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShxLCB0LT5saW1pdHMuc2VnX2JvdW5kYXJ5X21hc2spOworCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQocSwgdC0+bGltaXRzLmJvdW5jZV9wZm4pOwogCiAJaWYgKHQtPmxpbWl0cy5ub19jbHVzdGVyKQogCQlxdWV1ZV9mbGFnX2NsZWFyX3VubG9ja2VkKFFVRVVFX0ZMQUdfQ0xVU1RFUiwgcSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggNDI0ZjdiMC4uM2ZkOGIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMjAsNyArMjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+Ci0jaW5jbHVkZSA8dHJhY2UvYmxvY2suaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9ibG9jay5oPgogCiAjZGVmaW5lIERNX01TR19QUkVGSVggImNvcmUiCiAKQEAgLTUzLDggKzU0LDYgQEAKIAl1bmlvbiBtYXBfaW5mbyBpbmZvOwogfTsKIAotREVGSU5FX1RSQUNFKGJsb2NrX2Jpb19jb21wbGV0ZSk7Ci0KIC8qCiAgKiBGb3IgcmVxdWVzdC1iYXNlZCBkbS4KICAqIE9uZSBvZiB0aGVzZSBpcyBhbGxvY2F0ZWQgcGVyIHJlcXVlc3QuCkBAIC02NTYsOCArNjU1LDcgQEAKIAkJLyogdGhlIGJpbyBoYXMgYmVlbiByZW1hcHBlZCBzbyBkaXNwYXRjaCBpdCAqLwogCiAJCXRyYWNlX2Jsb2NrX3JlbWFwKGJkZXZfZ2V0X3F1ZXVlKGNsb25lLT5iaV9iZGV2KSwgY2xvbmUsCi0JCQkJICAgIHRpby0+aW8tPmJpby0+YmlfYmRldi0+YmRfZGV2LAotCQkJCSAgICBjbG9uZS0+Ymlfc2VjdG9yLCBzZWN0b3IpOworCQkJCSAgICB0aW8tPmlvLT5iaW8tPmJpX2JkZXYtPmJkX2Rldiwgc2VjdG9yKTsKIAogCQlnZW5lcmljX21ha2VfcmVxdWVzdChjbG9uZSk7CiAJfSBlbHNlIGlmIChyIDwgMCB8fCByID09IERNX01BUElPX1JFUVVFVUUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbGluZWFyLmMgYi9kcml2ZXJzL21kL2xpbmVhci5jCmluZGV4IDdhMzZlMzguLjY0ZjFmM2UwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2xpbmVhci5jCisrKyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogCQkgKiBhIG9uZSBwYWdlIHJlcXVlc3QgaXMgbmV2ZXIgaW4gdmlvbGF0aW9uLgogCQkgKi8KIAkJaWYgKHJkZXYtPmJkZXYtPmJkX2Rpc2stPnF1ZXVlLT5tZXJnZV9idmVjX2ZuICYmCi0JCSAgICBtZGRldi0+cXVldWUtPm1heF9zZWN0b3JzID4gKFBBR0VfU0laRT4+OSkpCisJCSAgICBxdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUpID4gKFBBR0VfU0laRT4+OSkpCiAJCQlibGtfcXVldWVfbWF4X3NlY3RvcnMobWRkZXYtPnF1ZXVlLCBQQUdFX1NJWkU+PjkpOwogCiAJCWRpc2stPm51bV9zZWN0b3JzID0gcmRldi0+c2VjdG9yczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCA2NDFiMjExLi4yMGY2YWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0xMjAyLDcgKzEyMDIsNyBAQAogCWF0b21pY19zZXQoJnJkZXYtPmNvcnJlY3RlZF9lcnJvcnMsIGxlMzJfdG9fY3B1KHNiLT5jbnRfY29ycmVjdGVkX3JlYWQpKTsKIAogCXJkZXYtPnNiX3NpemUgPSBsZTMyX3RvX2NwdShzYi0+bWF4X2RldikgKiAyICsgMjU2OwotCWJtYXNrID0gcXVldWVfaGFyZHNlY3Rfc2l6ZShyZGV2LT5iZGV2LT5iZF9kaXNrLT5xdWV1ZSktMTsKKwlibWFzayA9IHF1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShyZGV2LT5iZGV2LT5iZF9kaXNrLT5xdWV1ZSktMTsKIAlpZiAocmRldi0+c2Jfc2l6ZSAmIGJtYXNrKQogCQlyZGV2LT5zYl9zaXplID0gKHJkZXYtPnNiX3NpemUgfCBibWFzaykgKyAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL211bHRpcGF0aC5jIGIvZHJpdmVycy9tZC9tdWx0aXBhdGguYwppbmRleCA0MWNlZDBjLi40ZWUzMWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL211bHRpcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvbXVsdGlwYXRoLmMKQEAgLTMwMyw3ICszMDMsNyBAQAogCQkgKiBtZXJnZV9idmVjX2ZuIHdpbGwgYmUgaW52b2x2ZWQgaW4gbXVsdGlwYXRoLikKIAkJICovCiAJCQlpZiAocS0+bWVyZ2VfYnZlY19mbiAmJgotCQkJICAgIG1kZGV2LT5xdWV1ZS0+bWF4X3NlY3RvcnMgPiAoUEFHRV9TSVpFPj45KSkKKwkJCSAgICBxdWV1ZV9tYXhfc2VjdG9ycyhxKSA+IChQQUdFX1NJWkU+PjkpKQogCQkJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUsIFBBR0VfU0laRT4+OSk7CiAKIAkJCWNvbmYtPndvcmtpbmdfZGlza3MrKzsKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCQkgKiB2aW9sYXRpbmcgaXQsIG5vdCB0aGF0IHdlIGV2ZXIgZXhwZWN0IGEgZGV2aWNlIHdpdGgKIAkJICogYSBtZXJnZV9idmVjX2ZuIHRvIGJlIGludm9sdmVkIGluIG11bHRpcGF0aCAqLwogCQlpZiAocmRldi0+YmRldi0+YmRfZGlzay0+cXVldWUtPm1lcmdlX2J2ZWNfZm4gJiYKLQkJICAgIG1kZGV2LT5xdWV1ZS0+bWF4X3NlY3RvcnMgPiAoUEFHRV9TSVpFPj45KSkKKwkJICAgIHF1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSkgPiAoUEFHRV9TSVpFPj45KSkKIAkJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUsIFBBR0VfU0laRT4+OSk7CiAKIAkJaWYgKCF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQwLmMgYi9kcml2ZXJzL21kL3JhaWQwLmMKaW5kZXggYzA4ZDc1NS4uOTI1NTA3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMC5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDAuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCSAqLwogCiAJCWlmIChyZGV2MS0+YmRldi0+YmRfZGlzay0+cXVldWUtPm1lcmdlX2J2ZWNfZm4gJiYKLQkJICAgIG1kZGV2LT5xdWV1ZS0+bWF4X3NlY3RvcnMgPiAoUEFHRV9TSVpFPj45KSkKKwkJICAgIHF1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSkgPiAoUEFHRV9TSVpFPj45KSkKIAkJCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUsIFBBR0VfU0laRT4+OSk7CiAKIAkJaWYgKCFzbWFsbGVzdCB8fCAocmRldjEtPnNlY3RvcnMgPCBzbWFsbGVzdC0+c2VjdG9ycykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQxLmMgYi9kcml2ZXJzL21kL3JhaWQxLmMKaW5kZXggMzZkZjkxMC4uZTIzNzU4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMS5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDEuYwpAQCAtMTEzMCw3ICsxMTMwLDcgQEAKIAkJCSAqIGEgb25lIHBhZ2UgcmVxdWVzdCBpcyBuZXZlciBpbiB2aW9sYXRpb24uCiAJCQkgKi8KIAkJCWlmIChyZGV2LT5iZGV2LT5iZF9kaXNrLT5xdWV1ZS0+bWVyZ2VfYnZlY19mbiAmJgotCQkJICAgIG1kZGV2LT5xdWV1ZS0+bWF4X3NlY3RvcnMgPiAoUEFHRV9TSVpFPj45KSkKKwkJCSAgICBxdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUpID4gKFBBR0VfU0laRT4+OSkpCiAJCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSwgUEFHRV9TSVpFPj45KTsKIAogCQkJcC0+aGVhZF9wb3NpdGlvbiA9IDA7CkBAIC0xOTk2LDcgKzE5OTYsNyBAQAogCQkgKiBhIG9uZSBwYWdlIHJlcXVlc3QgaXMgbmV2ZXIgaW4gdmlvbGF0aW9uLgogCQkgKi8KIAkJaWYgKHJkZXYtPmJkZXYtPmJkX2Rpc2stPnF1ZXVlLT5tZXJnZV9idmVjX2ZuICYmCi0JCSAgICBtZGRldi0+cXVldWUtPm1heF9zZWN0b3JzID4gKFBBR0VfU0laRT4+OSkpCisJCSAgICBxdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUpID4gKFBBR0VfU0laRT4+OSkpCiAJCQlibGtfcXVldWVfbWF4X3NlY3RvcnMobWRkZXYtPnF1ZXVlLCBQQUdFX1NJWkU+PjkpOwogCiAJCWRpc2stPmhlYWRfcG9zaXRpb24gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMTAuYyBiL2RyaXZlcnMvbWQvcmFpZDEwLmMKaW5kZXggNDk5NjIwYS4uNzUwNTUwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9yYWlkMTAuYworKysgYi9kcml2ZXJzL21kL3JhaWQxMC5jCkBAIC0xMTU4LDggKzExNTgsOCBAQAogCQkJICogYSBvbmUgcGFnZSByZXF1ZXN0IGlzIG5ldmVyIGluIHZpb2xhdGlvbi4KIAkJCSAqLwogCQkJaWYgKHJkZXYtPmJkZXYtPmJkX2Rpc2stPnF1ZXVlLT5tZXJnZV9idmVjX2ZuICYmCi0JCQkgICAgbWRkZXYtPnF1ZXVlLT5tYXhfc2VjdG9ycyA+IChQQUdFX1NJWkU+PjkpKQotCQkJCW1kZGV2LT5xdWV1ZS0+bWF4X3NlY3RvcnMgPSAoUEFHRV9TSVpFPj45KTsKKwkJCSAgICBxdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUpID4gKFBBR0VfU0laRT4+OSkpCisJCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKG1kZGV2LT5xdWV1ZSwgUEFHRV9TSVpFPj45KTsKIAogCQkJcC0+aGVhZF9wb3NpdGlvbiA9IDA7CiAJCQlyZGV2LT5yYWlkX2Rpc2sgPSBtaXJyb3I7CkBAIC0yMTQ1LDggKzIxNDUsOCBAQAogCQkgKiBhIG9uZSBwYWdlIHJlcXVlc3QgaXMgbmV2ZXIgaW4gdmlvbGF0aW9uLgogCQkgKi8KIAkJaWYgKHJkZXYtPmJkZXYtPmJkX2Rpc2stPnF1ZXVlLT5tZXJnZV9idmVjX2ZuICYmCi0JCSAgICBtZGRldi0+cXVldWUtPm1heF9zZWN0b3JzID4gKFBBR0VfU0laRT4+OSkpCi0JCQltZGRldi0+cXVldWUtPm1heF9zZWN0b3JzID0gKFBBR0VfU0laRT4+OSk7CisJCSAgICBxdWV1ZV9tYXhfc2VjdG9ycyhtZGRldi0+cXVldWUpID4gKFBBR0VfU0laRT4+OSkpCisJCQlibGtfcXVldWVfbWF4X3NlY3RvcnMobWRkZXYtPnF1ZXVlLCBQQUdFX1NJWkU+PjkpOwogCiAJCWRpc2stPmhlYWRfcG9zaXRpb24gPSAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCBiYjM3ZmIxLi5iZWY4NzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC0zNDYzLDEwICszNDYzLDEwIEBACiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiaS0+YmlfYmRldik7CiAKLQlpZiAoKGJpLT5iaV9zaXplPj45KSA+IHEtPm1heF9zZWN0b3JzKQorCWlmICgoYmktPmJpX3NpemU+PjkpID4gcXVldWVfbWF4X3NlY3RvcnMocSkpCiAJCXJldHVybiAwOwogCWJsa19yZWNvdW50X3NlZ21lbnRzKHEsIGJpKTsKLQlpZiAoYmktPmJpX3BoeXNfc2VnbWVudHMgPiBxLT5tYXhfcGh5c19zZWdtZW50cykKKwlpZiAoYmktPmJpX3BoeXNfc2VnbWVudHMgPiBxdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAocS0+bWVyZ2VfYnZlY19mbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVtc3RpY2svY29yZS9tc3Byb19ibG9jay5jIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMKaW5kZXggZGUxNDNkZS4uNzg0N2JiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tZW1zdGljay9jb3JlL21zcHJvX2Jsb2NrLmMKQEAgLTY3MiwxNSArNjcyLDE0IEBACiAJCQkJCSAgICAgICBtc2ItPnJlcV9zZyk7CiAKIAkJaWYgKCFtc2ItPnNlZ19jb3VudCkgewotCQkJY2h1bmsgPSBfX2Jsa19lbmRfcmVxdWVzdChtc2ItPmJsb2NrX3JlcSwgLUVOT01FTSwKLQkJCQkJYmxrX3JxX2N1cl9ieXRlcyhtc2ItPmJsb2NrX3JlcSkpOworCQkJY2h1bmsgPSBfX2Jsa19lbmRfcmVxdWVzdF9jdXIobXNiLT5ibG9ja19yZXEsIC1FTk9NRU0pOwogCQkJY29udGludWU7CiAJCX0KIAotCQl0X3NlYyA9IG1zYi0+YmxvY2tfcmVxLT5zZWN0b3IgPDwgOTsKKwkJdF9zZWMgPSBibGtfcnFfcG9zKG1zYi0+YmxvY2tfcmVxKSA8PCA5OwogCQlzZWN0b3JfZGl2KHRfc2VjLCBtc2ItPnBhZ2Vfc2l6ZSk7CiAKLQkJY291bnQgPSBtc2ItPmJsb2NrX3JlcS0+bnJfc2VjdG9ycyA8PCA5OworCQljb3VudCA9IGJsa19ycV9ieXRlcyhtc2ItPmJsb2NrX3JlcSk7CiAJCWNvdW50IC89IG1zYi0+cGFnZV9zaXplOwogCiAJCXBhcmFtLnN5c3RlbSA9IG1zYi0+c3lzdGVtOwpAQCAtNzA1LDggKzcwNCw4IEBACiAJCXJldHVybiAwOwogCX0KIAotCWRldl9kYmcoJmNhcmQtPmRldiwgImVsdl9uZXh0XG4iKTsKLQltc2ItPmJsb2NrX3JlcSA9IGVsdl9uZXh0X3JlcXVlc3QobXNiLT5xdWV1ZSk7CisJZGV2X2RiZygmY2FyZC0+ZGV2LCAiYmxrX2ZldGNoXG4iKTsKKwltc2ItPmJsb2NrX3JlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KG1zYi0+cXVldWUpOwogCWlmICghbXNiLT5ibG9ja19yZXEpIHsKIAkJZGV2X2RiZygmY2FyZC0+ZGV2LCAiaXNzdWUgZW5kXG4iKTsKIAkJcmV0dXJuIC1FQUdBSU47CkBAIC03NDUsNyArNzQ0LDcgQEAKIAkJCQkJdF9sZW4gKj0gbXNiLT5wYWdlX3NpemU7CiAJCQl9CiAJCX0gZWxzZQotCQkJdF9sZW4gPSBtc2ItPmJsb2NrX3JlcS0+bnJfc2VjdG9ycyA8PCA5OworCQkJdF9sZW4gPSBibGtfcnFfYnl0ZXMobXNiLT5ibG9ja19yZXEpOwogCiAJCWRldl9kYmcoJmNhcmQtPmRldiwgInRyYW5zZmVycmVkICV4ICglZClcbiIsIHRfbGVuLCBlcnJvcik7CiAKQEAgLTgyNSw4ICs4MjQsOCBAQAogCQlyZXR1cm47CiAKIAlpZiAobXNiLT5lamVjdCkgewotCQl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSkpICE9IE5VTEwpCi0JCQlfX2Jsa19lbmRfcmVxdWVzdChyZXEsIC1FTk9ERVYsIGJsa19ycV9ieXRlcyhyZXEpKTsKKwkJd2hpbGUgKChyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKSkgIT0gTlVMTCkKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FTk9ERVYpOwogCiAJCXJldHVybjsKIAl9CkBAIC0xMjQzLDcgKzEyNDIsNyBAQAogCiAJc3ByaW50Zihtc2ItPmRpc2stPmRpc2tfbmFtZSwgIm1zcGJsayVkIiwgZGlza19pZCk7CiAKLQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShtc2ItPnF1ZXVlLCBtc2ItPnBhZ2Vfc2l6ZSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShtc2ItPnF1ZXVlLCBtc2ItPnBhZ2Vfc2l6ZSk7CiAKIAljYXBhY2l0eSA9IGJlMTZfdG9fY3B1KHN5c19pbmZvLT51c2VyX2Jsb2NrX2NvdW50KTsKIAljYXBhY2l0eSAqPSBiZTE2X3RvX2NwdShzeXNfaW5mby0+YmxvY2tfc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzYXMuYwppbmRleCBhOTAxOWYwLi43OWY1NDMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNhcy5jCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2FzLmMKQEAgLTEyNzcsOCArMTI3Nyw4IEBACiAJLyogZG8gd2UgbmVlZCB0byBzdXBwb3J0IG11bHRpcGxlIHNlZ21lbnRzPyAqLwogCWlmIChyZXEtPmJpby0+YmlfdmNudCA+IDEgfHwgcnNwLT5iaW8tPmJpX3ZjbnQgPiAxKSB7CiAJCXByaW50ayhNWUlPQ19zX0VSUl9GTVQgIiVzOiBtdWx0aXBsZSBzZWdtZW50cyByZXEgJXUgJXUsIHJzcCAldSAldVxuIiwKLQkJICAgIGlvYy0+bmFtZSwgX19mdW5jX18sIHJlcS0+YmlvLT5iaV92Y250LCByZXEtPmRhdGFfbGVuLAotCQkgICAgcnNwLT5iaW8tPmJpX3ZjbnQsIHJzcC0+ZGF0YV9sZW4pOworCQkgICAgaW9jLT5uYW1lLCBfX2Z1bmNfXywgcmVxLT5iaW8tPmJpX3ZjbnQsIGJsa19ycV9ieXRlcyhyZXEpLAorCQkgICAgcnNwLT5iaW8tPmJpX3ZjbnQsIGJsa19ycV9ieXRlcyhyc3ApKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjk1LDcgKzEyOTUsNyBAQAogCXNtcHJlcSA9IChTbXBQYXNzdGhyb3VnaFJlcXVlc3RfdCAqKW1mOwogCW1lbXNldChzbXByZXEsIDAsIHNpemVvZigqc21wcmVxKSk7CiAKLQlzbXByZXEtPlJlcXVlc3REYXRhTGVuZ3RoID0gY3B1X3RvX2xlMTYocmVxLT5kYXRhX2xlbiAtIDQpOworCXNtcHJlcS0+UmVxdWVzdERhdGFMZW5ndGggPSBjcHVfdG9fbGUxNihibGtfcnFfYnl0ZXMocmVxKSAtIDQpOwogCXNtcHJlcS0+RnVuY3Rpb24gPSBNUElfRlVOQ1RJT05fU01QX1BBU1NUSFJPVUdIOwogCiAJaWYgKHJwaHkpCkBAIC0xMzIxLDEwICsxMzIxLDEwIEBACiAJCSAgICAgICBNUElfU0dFX0ZMQUdTX0VORF9PRl9CVUZGRVIgfAogCQkgICAgICAgTVBJX1NHRV9GTEFHU19ESVJFQ1RJT04gfAogCQkgICAgICAgbXB0X2FkZHJfc2l6ZSgpKSA8PCBNUElfU0dFX0ZMQUdTX1NISUZUOwotCWZsYWdzTGVuZ3RoIHw9IChyZXEtPmRhdGFfbGVuIC0gNCk7CisJZmxhZ3NMZW5ndGggfD0gKGJsa19ycV9ieXRlcyhyZXEpIC0gNCk7CiAKIAlkbWFfYWRkcl9vdXQgPSBwY2lfbWFwX3NpbmdsZShpb2MtPnBjaWRldiwgYmlvX2RhdGEocmVxLT5iaW8pLAotCQkJCSAgICAgIHJlcS0+ZGF0YV9sZW4sIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQkJICAgICAgYmxrX3JxX2J5dGVzKHJlcSksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJaWYgKCFkbWFfYWRkcl9vdXQpCiAJCWdvdG8gcHV0X21mOwogCW1wdF9hZGRfc2dlKHBzZ2UsIGZsYWdzTGVuZ3RoLCBkbWFfYWRkcl9vdXQpOwpAQCAtMTMzMiw5ICsxMzMyLDkgQEAKIAogCS8qIHJlc3BvbnNlICovCiAJZmxhZ3NMZW5ndGggPSBNUFRfU0dFX0ZMQUdTX1NTSU1QTEVfUkVBRDsKLQlmbGFnc0xlbmd0aCB8PSByc3AtPmRhdGFfbGVuICsgNDsKKwlmbGFnc0xlbmd0aCB8PSBibGtfcnFfYnl0ZXMocnNwKSArIDQ7CiAJZG1hX2FkZHJfaW4gPSAgcGNpX21hcF9zaW5nbGUoaW9jLT5wY2lkZXYsIGJpb19kYXRhKHJzcC0+YmlvKSwKLQkJCQkgICAgICByc3AtPmRhdGFfbGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJCSAgICAgIGJsa19ycV9ieXRlcyhyc3ApLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWlmICghZG1hX2FkZHJfaW4pCiAJCWdvdG8gdW5tYXA7CiAJbXB0X2FkZF9zZ2UocHNnZSwgZmxhZ3NMZW5ndGgsIGRtYV9hZGRyX2luKTsKQEAgLTEzNTcsOCArMTM1Nyw4IEBACiAJCXNtcHJlcCA9IChTbXBQYXNzdGhyb3VnaFJlcGx5X3QgKilpb2MtPnNhc19tZ210LnJlcGx5OwogCQltZW1jcHkocmVxLT5zZW5zZSwgc21wcmVwLCBzaXplb2YoKnNtcHJlcCkpOwogCQlyZXEtPnNlbnNlX2xlbiA9IHNpemVvZigqc21wcmVwKTsKLQkJcmVxLT5kYXRhX2xlbiA9IDA7Ci0JCXJzcC0+ZGF0YV9sZW4gLT0gc21wcmVwLT5SZXNwb25zZURhdGFMZW5ndGg7CisJCXJlcS0+cmVzaWRfbGVuID0gMDsKKwkJcnNwLT5yZXNpZF9sZW4gLT0gc21wcmVwLT5SZXNwb25zZURhdGFMZW5ndGg7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKE1ZSU9DX3NfRVJSX0ZNVCAiJXM6IHNtcCBwYXNzdGhydSByZXBseSBmYWlsZWQgdG8gYmUgcmV0dXJuZWRcbiIsCiAJCSAgICBpb2MtPm5hbWUsIF9fZnVuY19fKTsKQEAgLTEzNjYsMTAgKzEzNjYsMTAgQEAKIAl9CiB1bm1hcDoKIAlpZiAoZG1hX2FkZHJfb3V0KQotCQlwY2lfdW5tYXBfc2luZ2xlKGlvYy0+cGNpZGV2LCBkbWFfYWRkcl9vdXQsIHJlcS0+ZGF0YV9sZW4sCisJCXBjaV91bm1hcF9zaW5nbGUoaW9jLT5wY2lkZXYsIGRtYV9hZGRyX291dCwgYmxrX3JxX2J5dGVzKHJlcSksCiAJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJaWYgKGRtYV9hZGRyX2luKQotCQlwY2lfdW5tYXBfc2luZ2xlKGlvYy0+cGNpZGV2LCBkbWFfYWRkcl9pbiwgcnNwLT5kYXRhX2xlbiwKKwkJcGNpX3VubWFwX3NpbmdsZShpb2MtPnBjaWRldiwgZG1hX2FkZHJfaW4sIGJsa19ycV9ieXRlcyhyc3ApLAogCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogcHV0X21mOgogCWlmIChtZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jCmluZGV4IGE0NDNlMTMuLjMzNWQ0YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwpAQCAtNDI2LDE1ICs0MjYsOSBAQAogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gcmVxLT5xOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyb3IsIG5yX2J5dGVzKSkgewotCQlpbnQgbGVmdG92ZXIgPSAocmVxLT5oYXJkX25yX3NlY3RvcnMgPDwgS0VSTkVMX1NFQ1RPUl9TSElGVCk7Ci0KLQkJaWYgKGJsa19wY19yZXF1ZXN0KHJlcSkpCi0JCQlsZWZ0b3ZlciA9IHJlcS0+ZGF0YV9sZW47Ci0KKwlpZiAoYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyb3IsIG5yX2J5dGVzKSkKIAkJaWYgKGVycm9yKQotCQkJYmxrX2VuZF9yZXF1ZXN0KHJlcSwgLUVJTywgbGVmdG92ZXIpOwotCX0KKwkJCWJsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAtRUlPKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKIApAQCAtNzYxLDcgKzc1NSw3IEBACiAJCQlicmVhazsKIAogCQljYXNlIENBQ0hFX1NNQVJURkVUQ0g6Ci0JCQlpZiAocmVxLT5ucl9zZWN0b3JzID4gMTYpCisJCQlpZiAoYmxrX3JxX3NlY3RvcnMocmVxKSA+IDE2KQogCQkJCWN0bF9mbGFncyA9IDB4MjAxRjAwMDg7CiAJCQllbHNlCiAJCQkJY3RsX2ZsYWdzID0gMHgwMDFGMDAwMDsKQEAgLTc4MSwxMyArNzc1LDEzIEBACiAJCQljdGxfZmxhZ3MgPSAweDAwMUYwMDEwOwogCQkJYnJlYWs7CiAJCWNhc2UgQ0FDSEVfU01BUlRCQUNLOgotCQkJaWYgKHJlcS0+bnJfc2VjdG9ycyA+IDE2KQorCQkJaWYgKGJsa19ycV9zZWN0b3JzKHJlcSkgPiAxNikKIAkJCQljdGxfZmxhZ3MgPSAweDAwMUYwMDA0OwogCQkJZWxzZQogCQkJCWN0bF9mbGFncyA9IDB4MDAxRjAwMTA7CiAJCQlicmVhazsKIAkJY2FzZSBDQUNIRV9TTUFSVFRIUk9VR0g6Ci0JCQlpZiAocmVxLT5ucl9zZWN0b3JzID4gMTYpCisJCQlpZiAoYmxrX3JxX3NlY3RvcnMocmVxKSA+IDE2KQogCQkJCWN0bF9mbGFncyA9IDB4MDAxRjAwMDQ7CiAJCQllbHNlCiAJCQkJY3RsX2ZsYWdzID0gMHgwMDFGMDAxMDsKQEAgLTgwMCw4ICs3OTQsOSBAQAogCWlmIChjLT5hZGFwdGVjKSB7CiAJCXU4IGNtZFsxMF07CiAJCXUzMiBzY3NpX2ZsYWdzOwotCQl1MTYgaHdzZWMgPSBxdWV1ZV9oYXJkc2VjdF9zaXplKHJlcS0+cSkgPj4gS0VSTkVMX1NFQ1RPUl9TSElGVDsKKwkJdTE2IGh3c2VjOwogCisJCWh3c2VjID0gcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHJlcS0+cSkgPj4gS0VSTkVMX1NFQ1RPUl9TSElGVDsKIAkJbWVtc2V0KGNtZCwgMCwgMTApOwogCiAJCXNnbF9vZmZzZXQgPSBTR0xfT0ZGU0VUXzEyOwpAQCAtODI3LDIyICs4MjIsMjIgQEAKIAogCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoc2NzaV9mbGFncyk7CiAKLQkJKigodTMyICopICYgY21kWzJdKSA9IGNwdV90b19iZTMyKHJlcS0+c2VjdG9yICogaHdzZWMpOwotCQkqKCh1MTYgKikgJiBjbWRbN10pID0gY3B1X3RvX2JlMTYocmVxLT5ucl9zZWN0b3JzICogaHdzZWMpOworCQkqKCh1MzIgKikgJiBjbWRbMl0pID0gY3B1X3RvX2JlMzIoYmxrX3JxX3BvcyhyZXEpICogaHdzZWMpOworCQkqKCh1MTYgKikgJiBjbWRbN10pID0gY3B1X3RvX2JlMTYoYmxrX3JxX3NlY3RvcnMocmVxKSAqIGh3c2VjKTsKIAogCQltZW1jcHkobXB0ciwgY21kLCAxMCk7CiAJCW1wdHIgKz0gNDsKLQkJKm1wdHIrKyA9IGNwdV90b19sZTMyKHJlcS0+bnJfc2VjdG9ycyA8PCBLRVJORUxfU0VDVE9SX1NISUZUKTsKKwkJKm1wdHIrKyA9IGNwdV90b19sZTMyKGJsa19ycV9ieXRlcyhyZXEpKTsKIAl9IGVsc2UKICNlbmRpZgogCXsKIAkJbXNnLT51LmhlYWRbMV0gPSBjcHVfdG9fbGUzMihjbWQgfCBIT1NUX1RJRCA8PCAxMiB8IHRpZCk7CiAJCSptcHRyKysgPSBjcHVfdG9fbGUzMihjdGxfZmxhZ3MpOwotCQkqbXB0cisrID0gY3B1X3RvX2xlMzIocmVxLT5ucl9zZWN0b3JzIDw8IEtFUk5FTF9TRUNUT1JfU0hJRlQpOworCQkqbXB0cisrID0gY3B1X3RvX2xlMzIoYmxrX3JxX2J5dGVzKHJlcSkpOwogCQkqbXB0cisrID0KLQkJICAgIGNwdV90b19sZTMyKCh1MzIpIChyZXEtPnNlY3RvciA8PCBLRVJORUxfU0VDVE9SX1NISUZUKSk7CisJCSAgICBjcHVfdG9fbGUzMigodTMyKSAoYmxrX3JxX3BvcyhyZXEpIDw8IEtFUk5FTF9TRUNUT1JfU0hJRlQpKTsKIAkJKm1wdHIrKyA9Ci0JCSAgICBjcHVfdG9fbGUzMihyZXEtPnNlY3RvciA+PiAoMzIgLSBLRVJORUxfU0VDVE9SX1NISUZUKSk7CisJCSAgICBjcHVfdG9fbGUzMihibGtfcnFfcG9zKHJlcSkgPj4gKDMyIC0gS0VSTkVMX1NFQ1RPUl9TSElGVCkpOwogCX0KIAogCWlmICghaTJvX2Jsb2NrX3NnbGlzdF9hbGxvYyhjLCBpcmVxLCAmbXB0cikpIHsKQEAgLTg4Myw3ICs4NzgsNyBAQAogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CiAKIAl3aGlsZSAoIWJsa19xdWV1ZV9wbHVnZ2VkKHEpKSB7Ci0JCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CisJCXJlcSA9IGJsa19wZWVrX3JlcXVlc3QocSk7CiAJCWlmICghcmVxKQogCQkJYnJlYWs7CiAKQEAgLTg5Niw3ICs4OTEsNyBAQAogCiAJCQlpZiAocXVldWVfZGVwdGggPCBJMk9fQkxPQ0tfTUFYX09QRU5fUkVRVUVTVFMpIHsKIAkJCQlpZiAoIWkyb19ibG9ja190cmFuc2ZlcihyZXEpKSB7Ci0JCQkJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKKwkJCQkJYmxrX3N0YXJ0X3JlcXVlc3QocmVxKTsKIAkJCQkJY29udGludWU7CiAJCQkJfSBlbHNlCiAJCQkJCW9zbV9pbmZvKCJ0cmFuc2ZlciBlcnJvclxuIik7CkBAIC05MjIsOCArOTE3LDEwIEBACiAJCQkJYmxrX3N0b3BfcXVldWUocSk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCX0gZWxzZQotCQkJZW5kX3JlcXVlc3QocmVxLCAwKTsKKwkJfSBlbHNlIHsKKwkJCWJsa19zdGFydF9yZXF1ZXN0KHJlcSk7CisJCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAtRUlPKTsKKwkJfQogCX0KIH07CiAKQEAgLTEwODIsNyArMTA3OSw3IEBACiAJICovCiAJaWYgKCFpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMHgwMDA0LCAxLCAmYmxvY2tzaXplLCA0KSB8fAogCSAgICAhaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMywgJmJsb2Nrc2l6ZSwgNCkpIHsKLQkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUocXVldWUsIGxlMzJfdG9fY3B1KGJsb2Nrc2l6ZSkpOworCQlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHF1ZXVlLCBsZTMyX3RvX2NwdShibG9ja3NpemUpKTsKIAl9IGVsc2UKIAkJb3NtX3dhcm4oInVuYWJsZSB0byBnZXQgYmxvY2tzaXplIG9mICVzXG4iLCBnZC0+ZGlza19uYW1lKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCmluZGV4IGIyNWU5YjYuLjk4ZmZjNDFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCkBAIC0yNDMsNyArMjQzLDcgQEAKIAkJYnJxLm1ycS5jbWQgPSAmYnJxLmNtZDsKIAkJYnJxLm1ycS5kYXRhID0gJmJycS5kYXRhOwogCi0JCWJycS5jbWQuYXJnID0gcmVxLT5zZWN0b3I7CisJCWJycS5jbWQuYXJnID0gYmxrX3JxX3BvcyhyZXEpOwogCQlpZiAoIW1tY19jYXJkX2Jsb2NrYWRkcihjYXJkKSkKIAkJCWJycS5jbWQuYXJnIDw8PSA5OwogCQlicnEuY21kLmZsYWdzID0gTU1DX1JTUF9TUElfUjEgfCBNTUNfUlNQX1IxIHwgTU1DX0NNRF9BRFRDOwpAQCAtMjUxLDcgKzI1MSw3IEBACiAJCWJycS5zdG9wLm9wY29kZSA9IE1NQ19TVE9QX1RSQU5TTUlTU0lPTjsKIAkJYnJxLnN0b3AuYXJnID0gMDsKIAkJYnJxLnN0b3AuZmxhZ3MgPSBNTUNfUlNQX1NQSV9SMUIgfCBNTUNfUlNQX1IxQiB8IE1NQ19DTURfQUM7Ci0JCWJycS5kYXRhLmJsb2NrcyA9IHJlcS0+bnJfc2VjdG9yczsKKwkJYnJxLmRhdGEuYmxvY2tzID0gYmxrX3JxX3NlY3RvcnMocmVxKTsKIAogCQkvKgogCQkgKiBUaGUgYmxvY2sgbGF5ZXIgZG9lc24ndCBzdXBwb3J0IGFsbCBzZWN0b3IgY291bnQKQEAgLTMwMSw3ICszMDEsNyBAQAogCQkgKiBBZGp1c3QgdGhlIHNnIGxpc3Qgc28gaXQgaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUKIAkJICogcmVxdWVzdC4KIAkJICovCi0JCWlmIChicnEuZGF0YS5ibG9ja3MgIT0gcmVxLT5ucl9zZWN0b3JzKSB7CisJCWlmIChicnEuZGF0YS5ibG9ja3MgIT0gYmxrX3JxX3NlY3RvcnMocmVxKSkgewogCQkJaW50IGksIGRhdGFfc2l6ZSA9IGJycS5kYXRhLmJsb2NrcyA8PCA5OwogCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIApAQCAtMzUyLDggKzM1Miw4IEBACiAJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCB0cmFuc2ZlcnJpbmcgZGF0YSwiCiAJCQkgICAgICAgIiBzZWN0b3IgJXUsIG5yICV1LCBjYXJkIHN0YXR1cyAlI3hcbiIsCiAJCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIGJycS5kYXRhLmVycm9yLAotCQkJICAgICAgICh1bnNpZ25lZClyZXEtPnNlY3RvciwKLQkJCSAgICAgICAodW5zaWduZWQpcmVxLT5ucl9zZWN0b3JzLCBzdGF0dXMpOworCQkJICAgICAgICh1bnNpZ25lZClibGtfcnFfcG9zKHJlcSksCisJCQkgICAgICAgKHVuc2lnbmVkKWJsa19ycV9zZWN0b3JzKHJlcSksIHN0YXR1cyk7CiAJCX0KIAogCQlpZiAoYnJxLnN0b3AuZXJyb3IpIHsKQEAgLTUyMSw3ICs1MjEsNyBAQAogCiAJc3ByaW50ZihtZC0+ZGlzay0+ZGlza19uYW1lLCAibW1jYmxrJWQiLCBkZXZpZHgpOwogCi0JYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUobWQtPnF1ZXVlLnF1ZXVlLCA1MTIpOworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUobWQtPnF1ZXVlLnF1ZXVlLCA1MTIpOwogCiAJaWYgKCFtbWNfY2FyZF9zZChjYXJkKSAmJiBtbWNfY2FyZF9ibG9ja2FkZHIoY2FyZCkpIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYyBiL2RyaXZlcnMvbW1jL2NhcmQvcXVldWUuYwppbmRleCA3YTcyZTc1Li40OWU1ODIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL3F1ZXVlLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9xdWV1ZS5jCkBAIC01NSw3ICs1NSw3IEBACiAJCXNwaW5fbG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmICghYmxrX3F1ZXVlX3BsdWdnZWQocSkpCi0JCQlyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCQkJcmVxID0gYmxrX2ZldGNoX3JlcXVlc3QocSk7CiAJCW1xLT5yZXEgPSByZXE7CiAJCXNwaW5fdW5sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIApAQCAtODgsMTYgKzg4LDExIEBACiB7CiAJc3RydWN0IG1tY19xdWV1ZSAqbXEgPSBxLT5xdWV1ZWRhdGE7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKLQlpbnQgcmV0OwogCiAJaWYgKCFtcSkgewogCQlwcmludGsoS0VSTl9FUlIgIk1NQzoga2lsbGluZyByZXF1ZXN0cyBmb3IgZGVhZCBxdWV1ZVxuIik7Ci0JCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgewotCQkJZG8gewotCQkJCXJldCA9IF9fYmxrX2VuZF9yZXF1ZXN0KHJlcSwgLUVJTywKLQkJCQkJCQlibGtfcnFfY3VyX2J5dGVzKHJlcSkpOwotCQkJfSB3aGlsZSAocmV0KTsKLQkJfQorCQl3aGlsZSAoKHJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpKSAhPSBOVUxMKQorCQkJX19ibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMgYi9kcml2ZXJzL210ZC9tdGRfYmxrZGV2cy5jCmluZGV4IGE0OWE5YzguLmFhYWMzYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL210ZF9ibGtkZXZzLmMKKysrIGIvZHJpdmVycy9tdGQvbXRkX2Jsa2RldnMuYwpAQCAtNDcsNDAgKzQ3LDQxIEBACiAJdW5zaWduZWQgbG9uZyBibG9jaywgbnNlY3Q7CiAJY2hhciAqYnVmOwogCi0JYmxvY2sgPSByZXEtPnNlY3RvciA8PCA5ID4+IHRyLT5ibGtzaGlmdDsKLQluc2VjdCA9IHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw8IDkgPj4gdHItPmJsa3NoaWZ0OworCWJsb2NrID0gYmxrX3JxX3BvcyhyZXEpIDw8IDkgPj4gdHItPmJsa3NoaWZ0OworCW5zZWN0ID0gYmxrX3JxX2N1cl9ieXRlcyhyZXEpID4+IHRyLT5ibGtzaGlmdDsKIAogCWJ1ZiA9IHJlcS0+YnVmZmVyOwogCiAJaWYgKHJlcS0+Y21kX3R5cGUgPT0gUkVRX1RZUEVfTElOVVhfQkxPQ0sgJiYKIAkgICAgcmVxLT5jbWRbMF0gPT0gUkVRX0xCX09QX0RJU0NBUkQpCi0JCXJldHVybiAhdHItPmRpc2NhcmQoZGV2LCBibG9jaywgbnNlY3QpOworCQlyZXR1cm4gdHItPmRpc2NhcmQoZGV2LCBibG9jaywgbnNlY3QpOwogCiAJaWYgKCFibGtfZnNfcmVxdWVzdChyZXEpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FSU87CiAKLQlpZiAocmVxLT5zZWN0b3IgKyByZXEtPmN1cnJlbnRfbnJfc2VjdG9ycyA+IGdldF9jYXBhY2l0eShyZXEtPnJxX2Rpc2spKQotCQlyZXR1cm4gMDsKKwlpZiAoYmxrX3JxX3BvcyhyZXEpICsgYmxrX3JxX2N1cl9zZWN0b3JzKHJlcSkgPgorCSAgICBnZXRfY2FwYWNpdHkocmVxLT5ycV9kaXNrKSkKKwkJcmV0dXJuIC1FSU87CiAKIAlzd2l0Y2gocnFfZGF0YV9kaXIocmVxKSkgewogCWNhc2UgUkVBRDoKIAkJZm9yICg7IG5zZWN0ID4gMDsgbnNlY3QtLSwgYmxvY2srKywgYnVmICs9IHRyLT5ibGtzaXplKQogCQkJaWYgKHRyLT5yZWFkc2VjdChkZXYsIGJsb2NrLCBidWYpKQotCQkJCXJldHVybiAwOwotCQlyZXR1cm4gMTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIDA7CiAKIAljYXNlIFdSSVRFOgogCQlpZiAoIXRyLT53cml0ZXNlY3QpCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtRUlPOwogCiAJCWZvciAoOyBuc2VjdCA+IDA7IG5zZWN0LS0sIGJsb2NrKyssIGJ1ZiArPSB0ci0+Ymxrc2l6ZSkKIAkJCWlmICh0ci0+d3JpdGVzZWN0KGRldiwgYmxvY2ssIGJ1ZikpCi0JCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAxOworCQkJCXJldHVybiAtRUlPOworCQlyZXR1cm4gMDsKIAogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biByZXF1ZXN0ICV1XG4iLCBycV9kYXRhX2RpcihyZXEpKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlPOwogCX0KIH0KIApAQCAtODgsMTkgKzg5LDE4IEBACiB7CiAJc3RydWN0IG10ZF9ibGt0cmFuc19vcHMgKnRyID0gYXJnOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpycSA9IHRyLT5ibGtjb3JlX3ByaXYtPnJxOworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBOVUxMOwogCiAJLyogd2UgbWlnaHQgZ2V0IGludm9sdmVkIHdoZW4gbWVtb3J5IGdldHMgbG93LCBzbyB1c2UgUEZfTUVNQUxMT0MgKi8KIAljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKIAogCXNwaW5fbG9ja19pcnEocnEtPnF1ZXVlX2xvY2spOworCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAkJc3RydWN0IG10ZF9ibGt0cmFuc19kZXYgKmRldjsKLQkJaW50IHJlcyA9IDA7CisJCWludCByZXM7CiAKLQkJcmVxID0gZWx2X25leHRfcmVxdWVzdChycSk7Ci0KLQkJaWYgKCFyZXEpIHsKKwkJaWYgKCFyZXEgJiYgIShyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChycSkpKSB7CiAJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJc3Bpbl91bmxvY2tfaXJxKHJxLT5xdWV1ZV9sb2NrKTsKIAkJCXNjaGVkdWxlKCk7CkBAIC0xMTksOCArMTE5LDEzIEBACiAKIAkJc3Bpbl9sb2NrX2lycShycS0+cXVldWVfbG9jayk7CiAKLQkJZW5kX3JlcXVlc3QocmVxLCByZXMpOworCQlpZiAoIV9fYmxrX2VuZF9yZXF1ZXN0X2N1cihyZXEsIHJlcykpCisJCQlyZXEgPSBOVUxMOwogCX0KKworCWlmIChyZXEpCisJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOworCiAJc3Bpbl91bmxvY2tfaXJxKHJxLT5xdWV1ZV9sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMzczLDcgKzM3OCw3IEBACiAJfQogCiAJdHItPmJsa2NvcmVfcHJpdi0+cnEtPnF1ZXVlZGF0YSA9IHRyOwotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHRyLT5ibGtjb3JlX3ByaXYtPnJxLCB0ci0+Ymxrc2l6ZSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZSh0ci0+YmxrY29yZV9wcml2LT5ycSwgdHItPmJsa3NpemUpOwogCWlmICh0ci0+ZGlzY2FyZCkKIAkJYmxrX3F1ZXVlX3NldF9kaXNjYXJkKHRyLT5ibGtjb3JlX3ByaXYtPnJxLAogCQkJCSAgICAgIGJsa3RyYW5zX2Rpc2NhcmRfcmVxdWVzdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMgYi9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKaW5kZXggNzMzNDhjNC4uNGE5Y2M5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYwpAQCAtNzAyLDcgKzcwMiw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBpb3NhcGljX3NldF9hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwKK3N0YXRpYyBpbnQgaW9zYXBpY19zZXRfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCkKIHsKIAlzdHJ1Y3QgdmVjdG9yX2luZm8gKnZpID0gaW9zYXBpY19nZXRfdmVjdG9yKGlycSk7CkBAIC03MTIsNyArNzEyLDcgQEAKIAogCWRlc3RfY3B1ID0gY3B1X2NoZWNrX2FmZmluaXR5KGlycSwgZGVzdCk7CiAJaWYgKGRlc3RfY3B1IDwgMCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAljcHVtYXNrX2NvcHkoaXJxX2Rlc2NbaXJxXS5hZmZpbml0eSwgY3B1bWFza19vZihkZXN0X2NwdSkpOwogCXZpLT50eG5fYWRkciA9IHR4bl9hZmZpbml0eV9hZGRyKGlycSwgZGVzdF9jcHUpOwpAQCAtNzI0LDYgKzcyNCw4IEBACiAJaW9zYXBpY19zZXRfaXJ0X2RhdGEodmksICZkdW1teV9kMCwgJmQxKTsKIAlpb3NhcGljX3dyX2lydF9lbnRyeSh2aSwgZDAsIGQxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb3NhcGljX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9wYy5jCmluZGV4IDRlNjNjYzkuLjE1MWJmNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3BjLmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfcGMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIExvdy1sZXZlbCBwYXJhbGxlbC1wb3J0IHJvdXRpbmVzIGZvciA4MjU1LWJhc2VkIFBDLXN0eWxlIGhhcmR3YXJlLgotICogCisgKgogICogQXV0aG9yczogUGhpbCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KICAqICAgICAgICAgIFRpbSBXYXVnaCA8dGltQGN5YmVyZWxrLmRlbW9uLmNvLnVrPgogICoJICAgIEpvc2UgUmVuYXUgPHJlbmF1QGFjbS5vcmc+CkBAIC0xMSw3ICsxMSw3IEBACiAgKiBDbGVhbmVkIHVwIGluY2x1ZGUgZmlsZXMgLSBSdXNzZWxsIEtpbmcgPGxpbnV4QGFybS51ay5saW51eC5vcmc+CiAgKiBETUEgc3VwcG9ydCAtIEJlcnQgRGUgSm9uZ2hlIDxiZXJ0QHNvcGhpcy5iZT4KICAqIE1hbnkgRUNQIGJ1Z3MgZml4ZWQuICBGcmVkIEJhcm5lcyAmIEphbWllIExva2llciwgMTk5OQotICogTW9yZSBQQ0kgc3VwcG9ydCBub3cgY29uZGl0aW9uYWwgb24gQ09ORklHX1BDSSwgMDMvMjAwMSwgUGF1bCBHLiAKKyAqIE1vcmUgUENJIHN1cHBvcnQgbm93IGNvbmRpdGlvbmFsIG9uIENPTkZJR19QQ0ksIDAzLzIwMDEsIFBhdWwgRy4KICAqIFZhcmlvdXMgaGFja3MsIEZyZWQgQmFybmVzLCAwNC8yMDAxCiAgKiBVcGRhdGVkIHByb2JpbmcgbG9naWMgLSBBZGFtIEJlbGF5IDxhbWJ4MUBuZW8ucnIuY29tPgogICovCkBAIC01NiwxMCArNTYsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnRfcGMuaD4KQEAgLTgyLDcgKzgyLDcgQEAKICNkZWZpbmUgRUNSX1RTVCAwNgogI2RlZmluZSBFQ1JfQ05GIDA3CiAjZGVmaW5lIEVDUl9NT0RFX01BU0sgMHhlMAotI2RlZmluZSBFQ1JfV1JJVEUocCx2KSBmcm9iX2Vjb250cm9sKChwKSwweGZmLCh2KSkKKyNkZWZpbmUgRUNSX1dSSVRFKHAsIHYpIGZyb2JfZWNvbnRyb2woKHApLCAweGZmLCAodikpCiAKICN1bmRlZiBERUJVRwogCkBAIC0xMDksMjcgKzEwOSwyNyBAQAogc3RhdGljIGludCBwbnBfcmVnaXN0ZXJlZF9wYXJwb3J0OwogCiAvKiBmcm9iX2NvbnRyb2wsIGJ1dCBmb3IgRUNSICovCi1zdGF0aWMgdm9pZCBmcm9iX2Vjb250cm9sIChzdHJ1Y3QgcGFycG9ydCAqcGIsIHVuc2lnbmVkIGNoYXIgbSwKK3N0YXRpYyB2b2lkIGZyb2JfZWNvbnRyb2woc3RydWN0IHBhcnBvcnQgKnBiLCB1bnNpZ25lZCBjaGFyIG0sCiAJCQkgICB1bnNpZ25lZCBjaGFyIHYpCiB7CiAJdW5zaWduZWQgY2hhciBlY3RyID0gMDsKIAogCWlmIChtICE9IDB4ZmYpCi0JCWVjdHIgPSBpbmIgKEVDT05UUk9MIChwYikpOworCQllY3RyID0gaW5iKEVDT05UUk9MKHBiKSk7CiAKLQlEUFJJTlRLIChLRVJOX0RFQlVHICJmcm9iX2Vjb250cm9sKCUwMngsJTAyeCk6ICUwMnggLT4gJTAyeFxuIiwKKwlEUFJJTlRLKEtFUk5fREVCVUcgImZyb2JfZWNvbnRyb2woJTAyeCwlMDJ4KTogJTAyeCAtPiAlMDJ4XG4iLAogCQltLCB2LCBlY3RyLCAoZWN0ciAmIH5tKSBeIHYpOwogCi0Jb3V0YiAoKGVjdHIgJiB+bSkgXiB2LCBFQ09OVFJPTCAocGIpKTsKKwlvdXRiKChlY3RyICYgfm0pIF4gdiwgRUNPTlRST0wocGIpKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBmcm9iX3NldF9tb2RlIChzdHJ1Y3QgcGFycG9ydCAqcCwgaW50IG1vZGUpCitzdGF0aWMgaW5saW5lIHZvaWQgZnJvYl9zZXRfbW9kZShzdHJ1Y3QgcGFycG9ydCAqcCwgaW50IG1vZGUpCiB7Ci0JZnJvYl9lY29udHJvbCAocCwgRUNSX01PREVfTUFTSywgbW9kZSA8PCA1KTsKKwlmcm9iX2Vjb250cm9sKHAsIEVDUl9NT0RFX01BU0ssIG1vZGUgPDwgNSk7CiB9CiAKICNpZmRlZiBDT05GSUdfUEFSUE9SVF9QQ19GSUZPCi0vKiBTYWZlbHkgY2hhbmdlIHRoZSBtb2RlIGJpdHMgaW4gdGhlIEVDUiAKKy8qIFNhZmVseSBjaGFuZ2UgdGhlIG1vZGUgYml0cyBpbiB0aGUgRUNSCiAgICBSZXR1cm5zOgogCSAgICAwICAgIDogU3VjY2VzcwogCSAgIC1FQlVTWTogQ291bGQgbm90IGRyYWluIEZJRk8gaW4gc29tZSBmaW5pdGUgYW1vdW50IG9mIHRpbWUsCkBAIC0xNDEsMTcgKzE0MSwxOCBAQAogCXVuc2lnbmVkIGNoYXIgb2VjcjsKIAlpbnQgbW9kZTsKIAotCURQUklOVEsoS0VSTl9JTkZPICJwYXJwb3J0IGNoYW5nZV9tb2RlIEVDUC1JU0EgdG8gbW9kZSAweCUwMnhcbiIsbSk7CisJRFBSSU5USyhLRVJOX0lORk8gInBhcnBvcnQgY2hhbmdlX21vZGUgRUNQLUlTQSB0byBtb2RlIDB4JTAyeFxuIiwgbSk7CiAKIAlpZiAoIXByaXYtPmVjcikgewotCQlwcmludGsgKEtFUk5fREVCVUcgImNoYW5nZV9tb2RlOiBidXQgdGhlcmUncyBubyBFQ1IhXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNoYW5nZV9tb2RlOiBidXQgdGhlcmUncyBubyBFQ1IhXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJLyogQml0cyA8Nzo1PiBjb250YWluIHRoZSBtb2RlLiAqLwotCW9lY3IgPSBpbmIgKEVDT05UUk9MIChwKSk7CisJb2VjciA9IGluYihFQ09OVFJPTChwKSk7CiAJbW9kZSA9IChvZWNyID4+IDUpICYgMHg3OwotCWlmIChtb2RlID09IG0pIHJldHVybiAwOworCWlmIChtb2RlID09IG0pCisJCXJldHVybiAwOwogCiAJaWYgKG1vZGUgPj0gMiAmJiAhKHByaXYtPmN0ciAmIDB4MjApKSB7CiAJCS8qIFRoaXMgbW9kZSByZXNldHMgdGhlIEZJRk8sIHNvIHdlIG1heQpAQCAtMTYzLDE5ICsxNjQsMjEgQEAKIAkJY2FzZSBFQ1JfRUNQOiAvKiBFQ1AgUGFyYWxsZWwgUG9ydCBtb2RlICovCiAJCQkvKiBCdXN5IHdhaXQgZm9yIDIwMHVzICovCiAJCQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgNDA7IGNvdW50ZXIrKykgewotCQkJCWlmIChpbmIgKEVDT05UUk9MIChwKSkgJiAweDAxKQorCQkJCWlmIChpbmIoRUNPTlRST0wocCkpICYgMHgwMSkKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgYnJlYWs7Ci0JCQkJdWRlbGF5ICg1KTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCWJyZWFrOworCQkJCXVkZWxheSg1KTsKIAkJCX0KIAogCQkJLyogUG9sbCBzbG93bHkuICovCi0JCQl3aGlsZSAoIShpbmIgKEVDT05UUk9MIChwKSkgJiAweDAxKSkgewotCQkJCWlmICh0aW1lX2FmdGVyX2VxIChqaWZmaWVzLCBleHBpcmUpKQorCQkJd2hpbGUgKCEoaW5iKEVDT05UUk9MKHApKSAmIDB4MDEpKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZXhwaXJlKSkKIAkJCQkJLyogVGhlIEZJRk8gaXMgc3R1Y2suICovCiAJCQkJCXJldHVybiAtRUJVU1k7Ci0JCQkJc2NoZWR1bGVfdGltZW91dF9pbnRlcnJ1cHRpYmxlKG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKLQkJCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKQorCQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgKKwkJCQkJCQltc2Vjc190b19qaWZmaWVzKDEwKSk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTg1LDIwICsxODgsMjAgQEAKIAkJLyogV2UgaGF2ZSB0byBnbyB0aHJvdWdoIG1vZGUgMDAxICovCiAJCW9lY3IgJj0gfig3IDw8IDUpOwogCQlvZWNyIHw9IEVDUl9QUzIgPDwgNTsKLQkJRUNSX1dSSVRFIChwLCBvZWNyKTsKKwkJRUNSX1dSSVRFKHAsIG9lY3IpOwogCX0KIAogCS8qIFNldCB0aGUgbW9kZS4gKi8KIAlvZWNyICY9IH4oNyA8PCA1KTsKIAlvZWNyIHw9IG0gPDwgNTsKLQlFQ1JfV1JJVEUgKHAsIG9lY3IpOworCUVDUl9XUklURShwLCBvZWNyKTsKIAlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QQVJQT1JUXzEyODQKIC8qIEZpbmQgRklGTyBsb3NzYWdlOyBGSUZPIGlzIHJlc2V0ICovCiAjaWYgMAotc3RhdGljIGludCBnZXRfZmlmb19yZXNpZHVlIChzdHJ1Y3QgcGFycG9ydCAqcCkKK3N0YXRpYyBpbnQgZ2V0X2ZpZm9fcmVzaWR1ZShzdHJ1Y3QgcGFycG9ydCAqcCkKIHsKIAlpbnQgcmVzaWR1ZTsKIAlpbnQgY25mZ2E7CkBAIC0yMDYsMjYgKzIwOSwyNiBAQAogCiAJLyogQWRqdXN0IGZvciB0aGUgY29udGVudHMgb2YgdGhlIEZJRk8uICovCiAJZm9yIChyZXNpZHVlID0gcHJpdi0+Zmlmb19kZXB0aDsgOyByZXNpZHVlLS0pIHsKLQkJaWYgKGluYiAoRUNPTlRST0wgKHApKSAmIDB4MikKKwkJaWYgKGluYihFQ09OVFJPTChwKSkgJiAweDIpCiAJCQkJLyogRnVsbCB1cC4gKi8KIAkJCWJyZWFrOwogCi0JCW91dGIgKDAsIEZJRk8gKHApKTsKKwkJb3V0YigwLCBGSUZPKHApKTsKIAl9CiAKLQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiAlZCBQV29yZHMgd2VyZSBsZWZ0IGluIEZJRk9cbiIsIHAtPm5hbWUsCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAlZCBQV29yZHMgd2VyZSBsZWZ0IGluIEZJRk9cbiIsIHAtPm5hbWUsCiAJCXJlc2lkdWUpOwogCiAJLyogUmVzZXQgdGhlIEZJRk8uICovCi0JZnJvYl9zZXRfbW9kZSAocCwgRUNSX1BTMik7CisJZnJvYl9zZXRfbW9kZShwLCBFQ1JfUFMyKTsKIAogCS8qIE5vdyBjaGFuZ2UgdG8gY29uZmlnIG1vZGUgYW5kIGNsZWFuIHVwLiBGSVhNRSAqLwotCWZyb2Jfc2V0X21vZGUgKHAsIEVDUl9DTkYpOwotCWNuZmdhID0gaW5iIChDT05GSUdBIChwKSk7Ci0JcHJpbnRrIChLRVJOX0RFQlVHICIlczogY25mZ0EgY29udGFpbnMgMHglMDJ4XG4iLCBwLT5uYW1lLCBjbmZnYSk7CisJZnJvYl9zZXRfbW9kZShwLCBFQ1JfQ05GKTsKKwljbmZnYSA9IGluYihDT05GSUdBKHApKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGNuZmdBIGNvbnRhaW5zIDB4JTAyeFxuIiwgcC0+bmFtZSwgY25mZ2EpOwogCiAJaWYgKCEoY25mZ2EgJiAoMTw8MikpKSB7Ci0JCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IEFjY291bnRpbmcgZm9yIGV4dHJhIGJ5dGVcbiIsIHAtPm5hbWUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IEFjY291bnRpbmcgZm9yIGV4dHJhIGJ5dGVcbiIsIHAtPm5hbWUpOwogCQlyZXNpZHVlKys7CiAJfQogCkBAIC0yMzMsOSArMjM2LDExIEBACiAJICogUFdvcmQgIT0gMSBieXRlLiAqLwogCiAJLyogQmFjayB0byBQUzIgbW9kZS4gKi8KLQlmcm9iX3NldF9tb2RlIChwLCBFQ1JfUFMyKTsKKwlmcm9iX3NldF9tb2RlKHAsIEVDUl9QUzIpOwogCi0JRFBSSU5USyAoS0VSTl9ERUJVRyAiKioqIGdldF9maWZvX3Jlc2lkdWU6IGRvbmUgcmVzaWR1ZSBjb2xsZWN0aW5nIChlY3IgPSAweCUyLjJ4KVxuIiwgaW5iIChFQ09OVFJPTCAocCkpKTsKKwlEUFJJTlRLKEtFUk5fREVCVUcKKwkgICAgICIqKiogZ2V0X2ZpZm9fcmVzaWR1ZTogZG9uZSByZXNpZHVlIGNvbGxlY3RpbmcgKGVjciA9IDB4JTIuMngpXG4iLAorCQkJCQkJCWluYihFQ09OVFJPTChwKSkpOwogCXJldHVybiByZXNpZHVlOwogfQogI2VuZGlmICAvKiAgMCAqLwpAQCAtMjU3LDggKzI2Miw4IEBACiAJLyogVG8gY2xlYXIgdGltZW91dCBzb21lIGNoaXBzIHJlcXVpcmUgZG91YmxlIHJlYWQgKi8KIAlwYXJwb3J0X3BjX3JlYWRfc3RhdHVzKHBiKTsKIAlyID0gcGFycG9ydF9wY19yZWFkX3N0YXR1cyhwYik7Ci0Jb3V0YiAociB8IDB4MDEsIFNUQVRVUyAocGIpKTsgLyogU29tZSByZXNldCBieSB3cml0aW5nIDEgKi8KLQlvdXRiIChyICYgMHhmZSwgU1RBVFVTIChwYikpOyAvKiBPdGhlcnMgYnkgd3JpdGluZyAwICovCisJb3V0YihyIHwgMHgwMSwgU1RBVFVTKHBiKSk7IC8qIFNvbWUgcmVzZXQgYnkgd3JpdGluZyAxICovCisJb3V0YihyICYgMHhmZSwgU1RBVFVTKHBiKSk7IC8qIE90aGVycyBieSB3cml0aW5nIDAgKi8KIAlyID0gcGFycG9ydF9wY19yZWFkX3N0YXR1cyhwYik7CiAKIAlyZXR1cm4gIShyICYgMHgwMSk7CkBAIC0yNzIsNyArMjc3LDggQEAKICAqIG9mIHRoZXNlIGFyZSBpbiBwYXJwb3J0X3BjLmguCiAgKi8KIAotc3RhdGljIHZvaWQgcGFycG9ydF9wY19pbml0X3N0YXRlKHN0cnVjdCBwYXJkZXZpY2UgKmRldiwgc3RydWN0IHBhcnBvcnRfc3RhdGUgKnMpCitzdGF0aWMgdm9pZCBwYXJwb3J0X3BjX2luaXRfc3RhdGUoc3RydWN0IHBhcmRldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IHBhcnBvcnRfc3RhdGUgKnMpCiB7CiAJcy0+dS5wYy5jdHIgPSAweGM7CiAJaWYgKGRldi0+aXJxX2Z1bmMgJiYKQEAgLTI4OSwyMiArMjk1LDIzIEBACiAJY29uc3Qgc3RydWN0IHBhcnBvcnRfcGNfcHJpdmF0ZSAqcHJpdiA9IHAtPnBoeXNwb3J0LT5wcml2YXRlX2RhdGE7CiAJcy0+dS5wYy5jdHIgPSBwcml2LT5jdHI7CiAJaWYgKHByaXYtPmVjcikKLQkJcy0+dS5wYy5lY3IgPSBpbmIgKEVDT05UUk9MIChwKSk7CisJCXMtPnUucGMuZWNyID0gaW5iKEVDT05UUk9MKHApKTsKIH0KIAotc3RhdGljIHZvaWQgcGFycG9ydF9wY19yZXN0b3JlX3N0YXRlKHN0cnVjdCBwYXJwb3J0ICpwLCBzdHJ1Y3QgcGFycG9ydF9zdGF0ZSAqcykKK3N0YXRpYyB2b2lkIHBhcnBvcnRfcGNfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgcGFycG9ydCAqcCwKKwkJCQkJCXN0cnVjdCBwYXJwb3J0X3N0YXRlICpzKQogewogCXN0cnVjdCBwYXJwb3J0X3BjX3ByaXZhdGUgKnByaXYgPSBwLT5waHlzcG9ydC0+cHJpdmF0ZV9kYXRhOwogCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgYyA9IHMtPnUucGMuY3RyICYgcHJpdi0+Y3RyX3dyaXRhYmxlOwotCW91dGIgKGMsIENPTlRST0wgKHApKTsKKwlvdXRiKGMsIENPTlRST0wocCkpOwogCXByaXYtPmN0ciA9IGM7CiAJaWYgKHByaXYtPmVjcikKLQkJRUNSX1dSSVRFIChwLCBzLT51LnBjLmVjcik7CisJCUVDUl9XUklURShwLCBzLT51LnBjLmVjcik7CiB9CiAKICNpZmRlZiBDT05GSUdfUEFSUE9SVF8xMjg0Ci1zdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfZXBwX3JlYWRfZGF0YSAoc3RydWN0IHBhcnBvcnQgKnBvcnQsIHZvaWQgKmJ1ZiwKLQkJCQkJc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQorc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2VwcF9yZWFkX2RhdGEoc3RydWN0IHBhcnBvcnQgKnBvcnQsIHZvaWQgKmJ1ZiwKKwkJCQkgICAgICAgc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQogewogCXNpemVfdCBnb3QgPSAwOwogCkBAIC0zMTYsNTQgKzMyMyw1MiBAQAogCQkgKiAgbkZhdWx0IGlzIDAgaWYgdGhlcmUgaXMgYXQgbGVhc3QgMSBieXRlIGluIHRoZSBXYXJwJ3MgRklGTwogCQkgKiAgcEVycm9yIGlzIDEgaWYgdGhlcmUgYXJlIDE2IGJ5dGVzIGluIHRoZSBXYXJwJ3MgRklGTwogCQkgKi8KLQkJc3RhdHVzID0gaW5iIChTVEFUVVMgKHBvcnQpKTsKKwkJc3RhdHVzID0gaW5iKFNUQVRVUyhwb3J0KSk7CiAKLQkJd2hpbGUgKCEoc3RhdHVzICYgMHgwOCkgJiYgKGdvdCA8IGxlbmd0aCkpIHsKLQkJCWlmICgobGVmdCA+PSAxNikgJiYgKHN0YXR1cyAmIDB4MjApICYmICEoc3RhdHVzICYgMHgwOCkpIHsKKwkJd2hpbGUgKCEoc3RhdHVzICYgMHgwOCkgJiYgZ290IDwgbGVuZ3RoKSB7CisJCQlpZiAobGVmdCA+PSAxNiAmJiAoc3RhdHVzICYgMHgyMCkgJiYgIShzdGF0dXMgJiAweDA4KSkgewogCQkJCS8qIGNhbiBncmFiIDE2IGJ5dGVzIGZyb20gd2FycCBmaWZvICovCi0JCQkJaWYgKCEoKGxvbmcpYnVmICYgMHgwMykpIHsKLQkJCQkJaW5zbCAoRVBQREFUQSAocG9ydCksIGJ1ZiwgNCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5zYiAoRVBQREFUQSAocG9ydCksIGJ1ZiwgMTYpOwotCQkJCX0KKwkJCQlpZiAoISgobG9uZylidWYgJiAweDAzKSkKKwkJCQkJaW5zbChFUFBEQVRBKHBvcnQpLCBidWYsIDQpOworCQkJCWVsc2UKKwkJCQkJaW5zYihFUFBEQVRBKHBvcnQpLCBidWYsIDE2KTsKIAkJCQlidWYgKz0gMTY7CiAJCQkJZ290ICs9IDE2OwogCQkJCWxlZnQgLT0gMTY7CiAJCQl9IGVsc2UgewogCQkJCS8qIGdyYWIgc2luZ2xlIGJ5dGUgZnJvbSB0aGUgd2FycCBmaWZvICovCi0JCQkJKigoY2hhciAqKWJ1ZikgPSBpbmIgKEVQUERBVEEgKHBvcnQpKTsKKwkJCQkqKChjaGFyICopYnVmKSA9IGluYihFUFBEQVRBKHBvcnQpKTsKIAkJCQlidWYrKzsKIAkJCQlnb3QrKzsKIAkJCQlsZWZ0LS07CiAJCQl9Ci0JCQlzdGF0dXMgPSBpbmIgKFNUQVRVUyAocG9ydCkpOworCQkJc3RhdHVzID0gaW5iKFNUQVRVUyhwb3J0KSk7CiAJCQlpZiAoc3RhdHVzICYgMHgwMSkgewogCQkJCS8qIEVQUCB0aW1lb3V0IHNob3VsZCBuZXZlciBvY2N1ci4uLiAqLwotCQkJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IEVQUCB0aW1lb3V0IG9jY3VycmVkIHdoaWxlIHRhbGtpbmcgdG8gIgotCQkJCQkidzkxMjg0cGljIChzaG91bGQgbm90IGhhdmUgZG9uZSlcbiIsIHBvcnQtPm5hbWUpOwotCQkJCWNsZWFyX2VwcF90aW1lb3V0IChwb3J0KTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworIiVzOiBFUFAgdGltZW91dCBvY2N1cnJlZCB3aGlsZSB0YWxraW5nIHRvIHc5MTI4NHBpYyAoc2hvdWxkIG5vdCBoYXZlIGRvbmUpXG4iLCBwb3J0LT5uYW1lKTsKKwkJCQljbGVhcl9lcHBfdGltZW91dChwb3J0KTsKIAkJCX0KIAkJfQogCQlyZXR1cm4gZ290OwogCX0KIAlpZiAoKGZsYWdzICYgUEFSUE9SVF9FUFBfRkFTVCkgJiYgKGxlbmd0aCA+IDEpKSB7Ci0JCWlmICghKCgobG9uZylidWYgfCBsZW5ndGgpICYgMHgwMykpIHsKLQkJCWluc2wgKEVQUERBVEEgKHBvcnQpLCBidWYsIChsZW5ndGggPj4gMikpOwotCQl9IGVsc2UgewotCQkJaW5zYiAoRVBQREFUQSAocG9ydCksIGJ1ZiwgbGVuZ3RoKTsKLQkJfQotCQlpZiAoaW5iIChTVEFUVVMgKHBvcnQpKSAmIDB4MDEpIHsKLQkJCWNsZWFyX2VwcF90aW1lb3V0IChwb3J0KTsKKwkJaWYgKCEoKChsb25nKWJ1ZiB8IGxlbmd0aCkgJiAweDAzKSkKKwkJCWluc2woRVBQREFUQShwb3J0KSwgYnVmLCAobGVuZ3RoID4+IDIpKTsKKwkJZWxzZQorCQkJaW5zYihFUFBEQVRBKHBvcnQpLCBidWYsIGxlbmd0aCk7CisJCWlmIChpbmIoU1RBVFVTKHBvcnQpKSAmIDB4MDEpIHsKKwkJCWNsZWFyX2VwcF90aW1lb3V0KHBvcnQpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJcmV0dXJuIGxlbmd0aDsKIAl9CiAJZm9yICg7IGdvdCA8IGxlbmd0aDsgZ290KyspIHsKLQkJKigoY2hhciopYnVmKSA9IGluYiAoRVBQREFUQShwb3J0KSk7CisJCSooKGNoYXIgKilidWYpID0gaW5iKEVQUERBVEEocG9ydCkpOwogCQlidWYrKzsKLQkJaWYgKGluYiAoU1RBVFVTIChwb3J0KSkgJiAweDAxKSB7CisJCWlmIChpbmIoU1RBVFVTKHBvcnQpKSAmIDB4MDEpIHsKIAkJCS8qIEVQUCB0aW1lb3V0ICovCi0JCQljbGVhcl9lcHBfdGltZW91dCAocG9ydCk7CisJCQljbGVhcl9lcHBfdGltZW91dChwb3J0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMzcxLDI4ICszNzYsMjcgQEAKIAlyZXR1cm4gZ290OwogfQogCi1zdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfZXBwX3dyaXRlX2RhdGEgKHN0cnVjdCBwYXJwb3J0ICpwb3J0LCBjb25zdCB2b2lkICpidWYsCi0JCQkJCSBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCitzdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfZXBwX3dyaXRlX2RhdGEoc3RydWN0IHBhcnBvcnQgKnBvcnQsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQkJc2l6ZV90IGxlbmd0aCwgaW50IGZsYWdzKQogewogCXNpemVfdCB3cml0dGVuID0gMDsKIAogCWlmICgoZmxhZ3MgJiBQQVJQT1JUX0VQUF9GQVNUKSAmJiAobGVuZ3RoID4gMSkpIHsKLQkJaWYgKCEoKChsb25nKWJ1ZiB8IGxlbmd0aCkgJiAweDAzKSkgewotCQkJb3V0c2wgKEVQUERBVEEgKHBvcnQpLCBidWYsIChsZW5ndGggPj4gMikpOwotCQl9IGVsc2UgewotCQkJb3V0c2IgKEVQUERBVEEgKHBvcnQpLCBidWYsIGxlbmd0aCk7Ci0JCX0KLQkJaWYgKGluYiAoU1RBVFVTIChwb3J0KSkgJiAweDAxKSB7Ci0JCQljbGVhcl9lcHBfdGltZW91dCAocG9ydCk7CisJCWlmICghKCgobG9uZylidWYgfCBsZW5ndGgpICYgMHgwMykpCisJCQlvdXRzbChFUFBEQVRBKHBvcnQpLCBidWYsIChsZW5ndGggPj4gMikpOworCQllbHNlCisJCQlvdXRzYihFUFBEQVRBKHBvcnQpLCBidWYsIGxlbmd0aCk7CisJCWlmIChpbmIoU1RBVFVTKHBvcnQpKSAmIDB4MDEpIHsKKwkJCWNsZWFyX2VwcF90aW1lb3V0KHBvcnQpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJcmV0dXJuIGxlbmd0aDsKIAl9CiAJZm9yICg7IHdyaXR0ZW4gPCBsZW5ndGg7IHdyaXR0ZW4rKykgewotCQlvdXRiICgqKChjaGFyKilidWYpLCBFUFBEQVRBKHBvcnQpKTsKKwkJb3V0YigqKChjaGFyICopYnVmKSwgRVBQREFUQShwb3J0KSk7CiAJCWJ1ZisrOwotCQlpZiAoaW5iIChTVEFUVVMocG9ydCkpICYgMHgwMSkgewotCQkJY2xlYXJfZXBwX3RpbWVvdXQgKHBvcnQpOworCQlpZiAoaW5iKFNUQVRVUyhwb3J0KSkgJiAweDAxKSB7CisJCQljbGVhcl9lcHBfdGltZW91dChwb3J0KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNDAwLDI0ICs0MDQsMjQgQEAKIAlyZXR1cm4gd3JpdHRlbjsKIH0KIAotc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2VwcF9yZWFkX2FkZHIgKHN0cnVjdCBwYXJwb3J0ICpwb3J0LCB2b2lkICpidWYsCitzdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfZXBwX3JlYWRfYWRkcihzdHJ1Y3QgcGFycG9ydCAqcG9ydCwgdm9pZCAqYnVmLAogCQkJCQlzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCiB7CiAJc2l6ZV90IGdvdCA9IDA7CiAKIAlpZiAoKGZsYWdzICYgUEFSUE9SVF9FUFBfRkFTVCkgJiYgKGxlbmd0aCA+IDEpKSB7Ci0JCWluc2IgKEVQUEFERFIgKHBvcnQpLCBidWYsIGxlbmd0aCk7Ci0JCWlmIChpbmIgKFNUQVRVUyAocG9ydCkpICYgMHgwMSkgewotCQkJY2xlYXJfZXBwX3RpbWVvdXQgKHBvcnQpOworCQlpbnNiKEVQUEFERFIocG9ydCksIGJ1ZiwgbGVuZ3RoKTsKKwkJaWYgKGluYihTVEFUVVMocG9ydCkpICYgMHgwMSkgeworCQkJY2xlYXJfZXBwX3RpbWVvdXQocG9ydCk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlyZXR1cm4gbGVuZ3RoOwogCX0KIAlmb3IgKDsgZ290IDwgbGVuZ3RoOyBnb3QrKykgewotCQkqKChjaGFyKilidWYpID0gaW5iIChFUFBBRERSIChwb3J0KSk7CisJCSooKGNoYXIgKilidWYpID0gaW5iKEVQUEFERFIocG9ydCkpOwogCQlidWYrKzsKLQkJaWYgKGluYiAoU1RBVFVTIChwb3J0KSkgJiAweDAxKSB7Ci0JCQljbGVhcl9lcHBfdGltZW91dCAocG9ydCk7CisJCWlmIChpbmIoU1RBVFVTKHBvcnQpKSAmIDB4MDEpIHsKKwkJCWNsZWFyX2VwcF90aW1lb3V0KHBvcnQpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC00MjUsMjUgKzQyOSwyNSBAQAogCXJldHVybiBnb3Q7CiB9CiAKLXN0YXRpYyBzaXplX3QgcGFycG9ydF9wY19lcHBfd3JpdGVfYWRkciAoc3RydWN0IHBhcnBvcnQgKnBvcnQsCitzdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfZXBwX3dyaXRlX2FkZHIoc3RydWN0IHBhcnBvcnQgKnBvcnQsCiAJCQkJCSBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW5ndGgsCiAJCQkJCSBpbnQgZmxhZ3MpCiB7CiAJc2l6ZV90IHdyaXR0ZW4gPSAwOwogCiAJaWYgKChmbGFncyAmIFBBUlBPUlRfRVBQX0ZBU1QpICYmIChsZW5ndGggPiAxKSkgewotCQlvdXRzYiAoRVBQQUREUiAocG9ydCksIGJ1ZiwgbGVuZ3RoKTsKLQkJaWYgKGluYiAoU1RBVFVTIChwb3J0KSkgJiAweDAxKSB7Ci0JCQljbGVhcl9lcHBfdGltZW91dCAocG9ydCk7CisJCW91dHNiKEVQUEFERFIocG9ydCksIGJ1ZiwgbGVuZ3RoKTsKKwkJaWYgKGluYihTVEFUVVMocG9ydCkpICYgMHgwMSkgeworCQkJY2xlYXJfZXBwX3RpbWVvdXQocG9ydCk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlyZXR1cm4gbGVuZ3RoOwogCX0KIAlmb3IgKDsgd3JpdHRlbiA8IGxlbmd0aDsgd3JpdHRlbisrKSB7Ci0JCW91dGIgKCooKGNoYXIqKWJ1ZiksIEVQUEFERFIgKHBvcnQpKTsKKwkJb3V0YigqKChjaGFyICopYnVmKSwgRVBQQUREUihwb3J0KSk7CiAJCWJ1ZisrOwotCQlpZiAoaW5iIChTVEFUVVMgKHBvcnQpKSAmIDB4MDEpIHsKLQkJCWNsZWFyX2VwcF90aW1lb3V0IChwb3J0KTsKKwkJaWYgKGluYihTVEFUVVMocG9ydCkpICYgMHgwMSkgeworCQkJY2xlYXJfZXBwX3RpbWVvdXQocG9ydCk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTQ1MSw3NCArNDU1LDc0IEBACiAJcmV0dXJuIHdyaXR0ZW47CiB9CiAKLXN0YXRpYyBzaXplX3QgcGFycG9ydF9wY19lY3BlcHBfcmVhZF9kYXRhIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCwgdm9pZCAqYnVmLAotCQkJCQkgICBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCitzdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfZWNwZXBwX3JlYWRfZGF0YShzdHJ1Y3QgcGFycG9ydCAqcG9ydCwgdm9pZCAqYnVmLAorCQkJCQkgIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKIHsKIAlzaXplX3QgZ290OwogCi0JZnJvYl9zZXRfbW9kZSAocG9ydCwgRUNSX0VQUCk7Ci0JcGFycG9ydF9wY19kYXRhX3JldmVyc2UgKHBvcnQpOwotCXBhcnBvcnRfcGNfd3JpdGVfY29udHJvbCAocG9ydCwgMHg0KTsKLQlnb3QgPSBwYXJwb3J0X3BjX2VwcF9yZWFkX2RhdGEgKHBvcnQsIGJ1ZiwgbGVuZ3RoLCBmbGFncyk7Ci0JZnJvYl9zZXRfbW9kZSAocG9ydCwgRUNSX1BTMik7CisJZnJvYl9zZXRfbW9kZShwb3J0LCBFQ1JfRVBQKTsKKwlwYXJwb3J0X3BjX2RhdGFfcmV2ZXJzZShwb3J0KTsKKwlwYXJwb3J0X3BjX3dyaXRlX2NvbnRyb2wocG9ydCwgMHg0KTsKKwlnb3QgPSBwYXJwb3J0X3BjX2VwcF9yZWFkX2RhdGEocG9ydCwgYnVmLCBsZW5ndGgsIGZsYWdzKTsKKwlmcm9iX3NldF9tb2RlKHBvcnQsIEVDUl9QUzIpOwogCiAJcmV0dXJuIGdvdDsKIH0KIAotc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2VjcGVwcF93cml0ZV9kYXRhIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKLQkJCQkJICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbmd0aCwKLQkJCQkJICAgIGludCBmbGFncykKK3N0YXRpYyBzaXplX3QgcGFycG9ydF9wY19lY3BlcHBfd3JpdGVfZGF0YShzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKKwkJCQkJICAgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuZ3RoLAorCQkJCQkgICBpbnQgZmxhZ3MpCiB7CiAJc2l6ZV90IHdyaXR0ZW47CiAKLQlmcm9iX3NldF9tb2RlIChwb3J0LCBFQ1JfRVBQKTsKLQlwYXJwb3J0X3BjX3dyaXRlX2NvbnRyb2wgKHBvcnQsIDB4NCk7Ci0JcGFycG9ydF9wY19kYXRhX2ZvcndhcmQgKHBvcnQpOwotCXdyaXR0ZW4gPSBwYXJwb3J0X3BjX2VwcF93cml0ZV9kYXRhIChwb3J0LCBidWYsIGxlbmd0aCwgZmxhZ3MpOwotCWZyb2Jfc2V0X21vZGUgKHBvcnQsIEVDUl9QUzIpOworCWZyb2Jfc2V0X21vZGUocG9ydCwgRUNSX0VQUCk7CisJcGFycG9ydF9wY193cml0ZV9jb250cm9sKHBvcnQsIDB4NCk7CisJcGFycG9ydF9wY19kYXRhX2ZvcndhcmQocG9ydCk7CisJd3JpdHRlbiA9IHBhcnBvcnRfcGNfZXBwX3dyaXRlX2RhdGEocG9ydCwgYnVmLCBsZW5ndGgsIGZsYWdzKTsKKwlmcm9iX3NldF9tb2RlKHBvcnQsIEVDUl9QUzIpOwogCiAJcmV0dXJuIHdyaXR0ZW47CiB9CiAKLXN0YXRpYyBzaXplX3QgcGFycG9ydF9wY19lY3BlcHBfcmVhZF9hZGRyIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCwgdm9pZCAqYnVmLAotCQkJCQkgICBzaXplX3QgbGVuZ3RoLCBpbnQgZmxhZ3MpCitzdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfZWNwZXBwX3JlYWRfYWRkcihzdHJ1Y3QgcGFycG9ydCAqcG9ydCwgdm9pZCAqYnVmLAorCQkJCQkgIHNpemVfdCBsZW5ndGgsIGludCBmbGFncykKIHsKIAlzaXplX3QgZ290OwogCi0JZnJvYl9zZXRfbW9kZSAocG9ydCwgRUNSX0VQUCk7Ci0JcGFycG9ydF9wY19kYXRhX3JldmVyc2UgKHBvcnQpOwotCXBhcnBvcnRfcGNfd3JpdGVfY29udHJvbCAocG9ydCwgMHg0KTsKLQlnb3QgPSBwYXJwb3J0X3BjX2VwcF9yZWFkX2FkZHIgKHBvcnQsIGJ1ZiwgbGVuZ3RoLCBmbGFncyk7Ci0JZnJvYl9zZXRfbW9kZSAocG9ydCwgRUNSX1BTMik7CisJZnJvYl9zZXRfbW9kZShwb3J0LCBFQ1JfRVBQKTsKKwlwYXJwb3J0X3BjX2RhdGFfcmV2ZXJzZShwb3J0KTsKKwlwYXJwb3J0X3BjX3dyaXRlX2NvbnRyb2wocG9ydCwgMHg0KTsKKwlnb3QgPSBwYXJwb3J0X3BjX2VwcF9yZWFkX2FkZHIocG9ydCwgYnVmLCBsZW5ndGgsIGZsYWdzKTsKKwlmcm9iX3NldF9tb2RlKHBvcnQsIEVDUl9QUzIpOwogCiAJcmV0dXJuIGdvdDsKIH0KIAotc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2VjcGVwcF93cml0ZV9hZGRyIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKK3N0YXRpYyBzaXplX3QgcGFycG9ydF9wY19lY3BlcHBfd3JpdGVfYWRkcihzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKIAkJCQkJICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbmd0aCwKIAkJCQkJICAgIGludCBmbGFncykKIHsKIAlzaXplX3Qgd3JpdHRlbjsKIAotCWZyb2Jfc2V0X21vZGUgKHBvcnQsIEVDUl9FUFApOwotCXBhcnBvcnRfcGNfd3JpdGVfY29udHJvbCAocG9ydCwgMHg0KTsKLQlwYXJwb3J0X3BjX2RhdGFfZm9yd2FyZCAocG9ydCk7Ci0Jd3JpdHRlbiA9IHBhcnBvcnRfcGNfZXBwX3dyaXRlX2FkZHIgKHBvcnQsIGJ1ZiwgbGVuZ3RoLCBmbGFncyk7Ci0JZnJvYl9zZXRfbW9kZSAocG9ydCwgRUNSX1BTMik7CisJZnJvYl9zZXRfbW9kZShwb3J0LCBFQ1JfRVBQKTsKKwlwYXJwb3J0X3BjX3dyaXRlX2NvbnRyb2wocG9ydCwgMHg0KTsKKwlwYXJwb3J0X3BjX2RhdGFfZm9yd2FyZChwb3J0KTsKKwl3cml0dGVuID0gcGFycG9ydF9wY19lcHBfd3JpdGVfYWRkcihwb3J0LCBidWYsIGxlbmd0aCwgZmxhZ3MpOworCWZyb2Jfc2V0X21vZGUocG9ydCwgRUNSX1BTMik7CiAKIAlyZXR1cm4gd3JpdHRlbjsKIH0KICNlbmRpZiAvKiBJRUVFIDEyODQgc3VwcG9ydCAqLwogCiAjaWZkZWYgQ09ORklHX1BBUlBPUlRfUENfRklGTwotc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2ZpZm9fd3JpdGVfYmxvY2tfcGlvIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKK3N0YXRpYyBzaXplX3QgcGFycG9ydF9wY19maWZvX3dyaXRlX2Jsb2NrX3BpbyhzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKIAkJCQkJICAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKIHsKIAlpbnQgcmV0ID0gMDsKIAljb25zdCB1bnNpZ25lZCBjaGFyICpidWZwID0gYnVmOwogCXNpemVfdCBsZWZ0ID0gbGVuZ3RoOwogCXVuc2lnbmVkIGxvbmcgZXhwaXJlID0gamlmZmllcyArIHBvcnQtPnBoeXNwb3J0LT5jYWQtPnRpbWVvdXQ7Ci0JY29uc3QgaW50IGZpZm8gPSBGSUZPIChwb3J0KTsKKwljb25zdCBpbnQgZmlmbyA9IEZJRk8ocG9ydCk7CiAJaW50IHBvbGxfZm9yID0gODsgLyogODAgdXNlY3MgKi8KIAljb25zdCBzdHJ1Y3QgcGFycG9ydF9wY19wcml2YXRlICpwcml2ID0gcG9ydC0+cGh5c3BvcnQtPnByaXZhdGVfZGF0YTsKIAljb25zdCBpbnQgZmlmb19kZXB0aCA9IHByaXYtPmZpZm9fZGVwdGg7CkBAIC01MjYsMjUgKzUzMCwyNSBAQAogCXBvcnQgPSBwb3J0LT5waHlzcG9ydDsKIAogCS8qIFdlIGRvbid0IHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgZXZlcnkgY2hhcmFjdGVyLiAqLwotCXBhcnBvcnRfcGNfZGlzYWJsZV9pcnEgKHBvcnQpOworCXBhcnBvcnRfcGNfZGlzYWJsZV9pcnEocG9ydCk7CiAJLyogc2V0IG5FcnJJbnRyRW4gYW5kIHNlcnZpY2VJbnRyICovCi0JZnJvYl9lY29udHJvbCAocG9ydCwgKDE8PDQpIHwgKDE8PDIpLCAoMTw8NCkgfCAoMTw8MikpOworCWZyb2JfZWNvbnRyb2wocG9ydCwgKDE8PDQpIHwgKDE8PDIpLCAoMTw8NCkgfCAoMTw8MikpOwogCiAJLyogRm9yd2FyZCBtb2RlLiAqLwotCXBhcnBvcnRfcGNfZGF0YV9mb3J3YXJkIChwb3J0KTsgLyogTXVzdCBiZSBpbiBQUzIgbW9kZSAqLworCXBhcnBvcnRfcGNfZGF0YV9mb3J3YXJkKHBvcnQpOyAvKiBNdXN0IGJlIGluIFBTMiBtb2RlICovCiAKIAl3aGlsZSAobGVmdCkgewogCQl1bnNpZ25lZCBjaGFyIGJ5dGU7Ci0JCXVuc2lnbmVkIGNoYXIgZWNydmFsID0gaW5iIChFQ09OVFJPTCAocG9ydCkpOworCQl1bnNpZ25lZCBjaGFyIGVjcnZhbCA9IGluYihFQ09OVFJPTChwb3J0KSk7CiAJCWludCBpID0gMDsKIAotCQlpZiAobmVlZF9yZXNjaGVkKCkgJiYgdGltZV9iZWZvcmUgKGppZmZpZXMsIGV4cGlyZSkpCisJCWlmIChuZWVkX3Jlc2NoZWQoKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBleHBpcmUpKQogCQkJLyogQ2FuJ3QgeWllbGQgdGhlIHBvcnQuICovCi0JCQlzY2hlZHVsZSAoKTsKKwkJCXNjaGVkdWxlKCk7CiAKIAkJLyogQW55b25lIGVsc2Ugd2FpdGluZyBmb3IgdGhlIHBvcnQ/ICovCiAJCWlmIChwb3J0LT53YWl0aGVhZCkgewotCQkJcHJpbnRrIChLRVJOX0RFQlVHICJTb21lYm9keSB3YW50cyB0aGUgcG9ydFxuIik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiU29tZWJvZHkgd2FudHMgdGhlIHBvcnRcbiIpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNTUyLDIxICs1NTYsMjIgQEAKIAkJCS8qIEZJRk8gaXMgZnVsbC4gV2FpdCBmb3IgaW50ZXJydXB0LiAqLwogCiAJCQkvKiBDbGVhciBzZXJ2aWNlSW50ciAqLwotCQkJRUNSX1dSSVRFIChwb3J0LCBlY3J2YWwgJiB+KDE8PDIpKTsKLQkJZmFsc2VfYWxhcm06Ci0JCQlyZXQgPSBwYXJwb3J0X3dhaXRfZXZlbnQgKHBvcnQsIEhaKTsKLQkJCWlmIChyZXQgPCAwKSBicmVhazsKKwkJCUVDUl9XUklURShwb3J0LCBlY3J2YWwgJiB+KDE8PDIpKTsKK2ZhbHNlX2FsYXJtOgorCQkJcmV0ID0gcGFycG9ydF93YWl0X2V2ZW50KHBvcnQsIEhaKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWJyZWFrOwogCQkJcmV0ID0gMDsKLQkJCWlmICghdGltZV9iZWZvcmUgKGppZmZpZXMsIGV4cGlyZSkpIHsKKwkJCWlmICghdGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJlKSkgewogCQkJCS8qIFRpbWVkIG91dC4gKi8KLQkJCQlwcmludGsgKEtFUk5fREVCVUcgIkZJRk8gd3JpdGUgdGltZWQgb3V0XG4iKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiRklGTyB3cml0ZSB0aW1lZCBvdXRcbiIpOwogCQkJCWJyZWFrOwogCQkJfQotCQkJZWNydmFsID0gaW5iIChFQ09OVFJPTCAocG9ydCkpOworCQkJZWNydmFsID0gaW5iKEVDT05UUk9MKHBvcnQpKTsKIAkJCWlmICghKGVjcnZhbCAmICgxPDwyKSkpIHsKIAkJCQlpZiAobmVlZF9yZXNjaGVkKCkgJiYKLQkJCQkgICAgdGltZV9iZWZvcmUgKGppZmZpZXMsIGV4cGlyZSkpCi0JCQkJCXNjaGVkdWxlICgpOworCQkJCSAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCBleHBpcmUpKQorCQkJCQlzY2hlZHVsZSgpOwogCiAJCQkJZ290byBmYWxzZV9hbGFybTsKIAkJCX0KQEAgLTU3NywzOCArNTgyLDM4IEBACiAJCS8qIENhbid0IGZhaWwgbm93LiAqLwogCQlleHBpcmUgPSBqaWZmaWVzICsgcG9ydC0+Y2FkLT50aW1lb3V0OwogCi0JcG9sbDoKLQkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkKK3BvbGw6CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwogCiAJCWlmIChlY3J2YWwgJiAweDAxKSB7CiAJCQkvKiBGSUZPIGlzIGVtcHR5LiBCbGFzdCBpdCBmdWxsLiAqLwogCQkJY29uc3QgaW50IG4gPSBsZWZ0IDwgZmlmb19kZXB0aCA/IGxlZnQgOiBmaWZvX2RlcHRoOwotCQkJb3V0c2IgKGZpZm8sIGJ1ZnAsIG4pOworCQkJb3V0c2IoZmlmbywgYnVmcCwgbik7CiAJCQlidWZwICs9IG47CiAJCQlsZWZ0IC09IG47CiAKIAkJCS8qIEFkanVzdCB0aGUgcG9sbCB0aW1lLiAqLwotCQkJaWYgKGkgPCAocG9sbF9mb3IgLSAyKSkgcG9sbF9mb3ItLTsKKwkJCWlmIChpIDwgKHBvbGxfZm9yIC0gMikpCisJCQkJcG9sbF9mb3ItLTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgaWYgKGkrKyA8IHBvbGxfZm9yKSB7Ci0JCQl1ZGVsYXkgKDEwKTsKLQkJCWVjcnZhbCA9IGluYiAoRUNPTlRST0wgKHBvcnQpKTsKKwkJCXVkZWxheSgxMCk7CisJCQllY3J2YWwgPSBpbmIoRUNPTlRST0wocG9ydCkpOwogCQkJZ290byBwb2xsOwogCQl9CiAKLQkJLyogSGFsZi1mdWxsIChjYWxsIG1lIGFuIG9wdGltaXN0KSAqLworCQkvKiBIYWxmLWZ1bGwoY2FsbCBtZSBhbiBvcHRpbWlzdCkgKi8KIAkJYnl0ZSA9ICpidWZwKys7Ci0JCW91dGIgKGJ5dGUsIGZpZm8pOworCQlvdXRiKGJ5dGUsIGZpZm8pOwogCQlsZWZ0LS07Ci0gICAgICAgIH0KLQotZHVtcF9wYXJwb3J0X3N0YXRlICgibGVhdmUgZmlmb193cml0ZV9ibG9ja19waW8iLCBwb3J0KTsKKwl9CisJZHVtcF9wYXJwb3J0X3N0YXRlKCJsZWF2ZSBmaWZvX3dyaXRlX2Jsb2NrX3BpbyIsIHBvcnQpOwogCXJldHVybiBsZW5ndGggLSBsZWZ0OwogfQogCiAjaWZkZWYgSEFTX0RNQQotc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2ZpZm9fd3JpdGVfYmxvY2tfZG1hIChzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKK3N0YXRpYyBzaXplX3QgcGFycG9ydF9wY19maWZvX3dyaXRlX2Jsb2NrX2RtYShzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKIAkJCQkJICAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbmd0aCkKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTYyMSw3ICs2MjYsNyBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZykgYnVmOwogCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVuc2lnbmVkIGxvbmcpIGJ1ZiArIGxlbmd0aCAtIDE7CiAKLWR1bXBfcGFycG9ydF9zdGF0ZSAoImVudGVyIGZpZm9fd3JpdGVfYmxvY2tfZG1hIiwgcG9ydCk7CisJZHVtcF9wYXJwb3J0X3N0YXRlKCJlbnRlciBmaWZvX3dyaXRlX2Jsb2NrX2RtYSIsIHBvcnQpOwogCWlmIChlbmQgPCBNQVhfRE1BX0FERFJFU1MpIHsKIAkJLyogSWYgaXQgd291bGQgY3Jvc3MgYSA2NGsgYm91bmRhcnksIGNhcCBpdCBhdCB0aGUgZW5kLiAqLwogCQlpZiAoKHN0YXJ0IF4gZW5kKSAmIH4weGZmZmZVTCkKQEAgLTYyOSw4ICs2MzQsOSBAQAogCiAJCWRtYV9hZGRyID0gZG1hX2hhbmRsZSA9IGRtYV9tYXBfc2luZ2xlKGRldiwgKHZvaWQgKilidWYsIGxlbmd0aCwKIAkJCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKLSAgICAgICAgfSBlbHNlIHsKLQkJLyogYWJvdmUgMTYgTUIgd2UgdXNlIGEgYm91bmNlIGJ1ZmZlciBhcyBJU0EtRE1BIGlzIG5vdCBwb3NzaWJsZSAqLworCX0gZWxzZSB7CisJCS8qIGFib3ZlIDE2IE1CIHdlIHVzZSBhIGJvdW5jZSBidWZmZXIgYXMgSVNBLURNQQorCQkgICBpcyBub3QgcG9zc2libGUgKi8KIAkJbWF4bGVuICAgPSBQQUdFX1NJWkU7ICAgICAgICAgIC8qIHNpemVvZihwcml2LT5kbWFfYnVmKSAqLwogCQlkbWFfYWRkciA9IHByaXYtPmRtYV9oYW5kbGU7CiAJCWRtYV9oYW5kbGUgPSAwOwpAQCAtNjM5LDEyICs2NDUsMTIgQEAKIAlwb3J0ID0gcG9ydC0+cGh5c3BvcnQ7CiAKIAkvKiBXZSBkb24ndCB3YW50IHRvIGJlIGludGVycnVwdGVkIGV2ZXJ5IGNoYXJhY3Rlci4gKi8KLQlwYXJwb3J0X3BjX2Rpc2FibGVfaXJxIChwb3J0KTsKKwlwYXJwb3J0X3BjX2Rpc2FibGVfaXJxKHBvcnQpOwogCS8qIHNldCBuRXJySW50ckVuIGFuZCBzZXJ2aWNlSW50ciAqLwotCWZyb2JfZWNvbnRyb2wgKHBvcnQsICgxPDw0KSB8ICgxPDwyKSwgKDE8PDQpIHwgKDE8PDIpKTsKKwlmcm9iX2Vjb250cm9sKHBvcnQsICgxPDw0KSB8ICgxPDwyKSwgKDE8PDQpIHwgKDE8PDIpKTsKIAogCS8qIEZvcndhcmQgbW9kZS4gKi8KLQlwYXJwb3J0X3BjX2RhdGFfZm9yd2FyZCAocG9ydCk7IC8qIE11c3QgYmUgaW4gUFMyIG1vZGUgKi8KKwlwYXJwb3J0X3BjX2RhdGFfZm9yd2FyZChwb3J0KTsgLyogTXVzdCBiZSBpbiBQUzIgbW9kZSAqLwogCiAJd2hpbGUgKGxlZnQpIHsKIAkJdW5zaWduZWQgbG9uZyBleHBpcmUgPSBqaWZmaWVzICsgcG9ydC0+cGh5c3BvcnQtPmNhZC0+dGltZW91dDsKQEAgLTY2NSwxMCArNjcxLDEwIEBACiAJCXNldF9kbWFfY291bnQocG9ydC0+ZG1hLCBjb3VudCk7CiAKIAkJLyogU2V0IERNQSBtb2RlICovCi0JCWZyb2JfZWNvbnRyb2wgKHBvcnQsIDE8PDMsIDE8PDMpOworCQlmcm9iX2Vjb250cm9sKHBvcnQsIDE8PDMsIDE8PDMpOwogCiAJCS8qIENsZWFyIHNlcnZpY2VJbnRyICovCi0JCWZyb2JfZWNvbnRyb2wgKHBvcnQsIDE8PDIsIDApOworCQlmcm9iX2Vjb250cm9sKHBvcnQsIDE8PDIsIDApOwogCiAJCWVuYWJsZV9kbWEocG9ydC0+ZG1hKTsKIAkJcmVsZWFzZV9kbWFfbG9jayhkbWFmbGFnKTsKQEAgLTY3NiwyMCArNjgyLDIyIEBACiAJCS8qIGFzc3VtZSBETUEgd2lsbCBiZSBzdWNjZXNzZnVsICovCiAJCWxlZnQgLT0gY291bnQ7CiAJCWJ1ZiAgKz0gY291bnQ7Ci0JCWlmIChkbWFfaGFuZGxlKSBkbWFfYWRkciArPSBjb3VudDsKKwkJaWYgKGRtYV9oYW5kbGUpCisJCQlkbWFfYWRkciArPSBjb3VudDsKIAogCQkvKiBXYWl0IGZvciBpbnRlcnJ1cHQuICovCi0JZmFsc2VfYWxhcm06Ci0JCXJldCA9IHBhcnBvcnRfd2FpdF9ldmVudCAocG9ydCwgSFopOwotCQlpZiAocmV0IDwgMCkgYnJlYWs7CitmYWxzZV9hbGFybToKKwkJcmV0ID0gcGFycG9ydF93YWl0X2V2ZW50KHBvcnQsIEhaKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKIAkJcmV0ID0gMDsKLQkJaWYgKCF0aW1lX2JlZm9yZSAoamlmZmllcywgZXhwaXJlKSkgeworCQlpZiAoIXRpbWVfYmVmb3JlKGppZmZpZXMsIGV4cGlyZSkpIHsKIAkJCS8qIFRpbWVkIG91dC4gKi8KLQkJCXByaW50ayAoS0VSTl9ERUJVRyAiRE1BIHdyaXRlIHRpbWVkIG91dFxuIik7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRE1BIHdyaXRlIHRpbWVkIG91dFxuIik7CiAJCQlicmVhazsKIAkJfQogCQkvKiBJcyBzZXJ2aWNlSW50ciBzZXQ/ICovCi0JCWlmICghKGluYiAoRUNPTlRST0wgKHBvcnQpKSAmICgxPDwyKSkpIHsKKwkJaWYgKCEoaW5iKEVDT05UUk9MKHBvcnQpKSAmICgxPDwyKSkpIHsKIAkJCWNvbmRfcmVzY2hlZCgpOwogCiAJCQlnb3RvIGZhbHNlX2FsYXJtOwpAQCAtNzA1LDE0ICs3MTMsMTUgQEAKIAogCQkvKiBBbnlvbmUgZWxzZSB3YWl0aW5nIGZvciB0aGUgcG9ydD8gKi8KIAkJaWYgKHBvcnQtPndhaXRoZWFkKSB7Ci0JCQlwcmludGsgKEtFUk5fREVCVUcgIlNvbWVib2R5IHdhbnRzIHRoZSBwb3J0XG4iKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJTb21lYm9keSB3YW50cyB0aGUgcG9ydFxuIik7CiAJCQlicmVhazsKIAkJfQogCiAJCS8qIHVwZGF0ZSBmb3IgcG9zc2libGUgRE1BIHJlc2lkdWUgISAqLwogCQlidWYgIC09IGNvdW50OwogCQlsZWZ0ICs9IGNvdW50OwotCQlpZiAoZG1hX2hhbmRsZSkgZG1hX2FkZHIgLT0gY291bnQ7CisJCWlmIChkbWFfaGFuZGxlKQorCQkJZG1hX2FkZHIgLT0gY291bnQ7CiAJfQogCiAJLyogTWF5YmUgZ290IGhlcmUgdGhyb3VnaCBicmVhaywgc28gYWRqdXN0IGZvciBETUEgcmVzaWR1ZSEgKi8KQEAgLTcyMywxMiArNzMyLDEyIEBACiAJcmVsZWFzZV9kbWFfbG9jayhkbWFmbGFnKTsKIAogCS8qIFR1cm4gb2ZmIERNQSBtb2RlICovCi0JZnJvYl9lY29udHJvbCAocG9ydCwgMTw8MywgMCk7CisJZnJvYl9lY29udHJvbChwb3J0LCAxPDwzLCAwKTsKIAogCWlmIChkbWFfaGFuZGxlKQogCQlkbWFfdW5tYXBfc2luZ2xlKGRldiwgZG1hX2hhbmRsZSwgbGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKIAotZHVtcF9wYXJwb3J0X3N0YXRlICgibGVhdmUgZmlmb193cml0ZV9ibG9ja19kbWEiLCBwb3J0KTsKKwlkdW1wX3BhcnBvcnRfc3RhdGUoImxlYXZlIGZpZm9fd3JpdGVfYmxvY2tfZG1hIiwgcG9ydCk7CiAJcmV0dXJuIGxlbmd0aCAtIGxlZnQ7CiB9CiAjZW5kaWYKQEAgLTczOCwxMyArNzQ3LDEzIEBACiB7CiAjaWZkZWYgSEFTX0RNQQogCWlmIChwb3J0LT5kbWEgIT0gUEFSUE9SVF9ETUFfTk9ORSkKLQkJcmV0dXJuIHBhcnBvcnRfcGNfZmlmb193cml0ZV9ibG9ja19kbWEgKHBvcnQsIGJ1ZiwgbGVuZ3RoKTsKKwkJcmV0dXJuIHBhcnBvcnRfcGNfZmlmb193cml0ZV9ibG9ja19kbWEocG9ydCwgYnVmLCBsZW5ndGgpOwogI2VuZGlmCi0JcmV0dXJuIHBhcnBvcnRfcGNfZmlmb193cml0ZV9ibG9ja19waW8gKHBvcnQsIGJ1ZiwgbGVuZ3RoKTsKKwlyZXR1cm4gcGFycG9ydF9wY19maWZvX3dyaXRlX2Jsb2NrX3Bpbyhwb3J0LCBidWYsIGxlbmd0aCk7CiB9CiAKIC8qIFBhcmFsbGVsIFBvcnQgRklGTyBtb2RlIChFQ1AgY2hpcHNldHMpICovCi1zdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfY29tcGF0X3dyaXRlX2Jsb2NrX3BpbyAoc3RydWN0IHBhcnBvcnQgKnBvcnQsCitzdGF0aWMgc2l6ZV90IHBhcnBvcnRfcGNfY29tcGF0X3dyaXRlX2Jsb2NrX3BpbyhzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKIAkJCQkJCSBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW5ndGgsCiAJCQkJCQkgaW50IGZsYWdzKQogewpAQCAtNzU2LDE0ICs3NjUsMTYgQEAKIAkvKiBTcGVjaWFsIGNhc2U6IGEgdGltZW91dCBvZiB6ZXJvIG1lYW5zIHdlIGNhbm5vdCBjYWxsIHNjaGVkdWxlKCkuCiAJICogQWxzbyBpZiBPX05PTkJMT0NLIGlzIHNldCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gKi8KIAlpZiAocG9ydC0+cGh5c3BvcnQtPmNhZC0+dGltZW91dCA8PSBQQVJQT1JUX0lOQUNUSVZJVFlfT19OT05CTE9DSykKLQkJcmV0dXJuIHBhcnBvcnRfaWVlZTEyODRfd3JpdGVfY29tcGF0IChwb3J0LCBidWYsCisJCXJldHVybiBwYXJwb3J0X2llZWUxMjg0X3dyaXRlX2NvbXBhdChwb3J0LCBidWYsCiAJCQkJCQkgICAgICBsZW5ndGgsIGZsYWdzKTsKIAogCS8qIFNldCB1cCBwYXJhbGxlbCBwb3J0IEZJRk8gbW9kZS4qLwotCXBhcnBvcnRfcGNfZGF0YV9mb3J3YXJkIChwb3J0KTsgLyogTXVzdCBiZSBpbiBQUzIgbW9kZSAqLwotCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sIChwb3J0LCBQQVJQT1JUX0NPTlRST0xfU1RST0JFLCAwKTsKLQlyID0gY2hhbmdlX21vZGUgKHBvcnQsIEVDUl9QUEYpOyAvKiBQYXJhbGxlbCBwb3J0IEZJRk8gKi8KLQlpZiAocikgIHByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFdhcm5pbmcgY2hhbmdlX21vZGUgRUNSX1BQRiBmYWlsZWRcbiIsIHBvcnQtPm5hbWUpOworCXBhcnBvcnRfcGNfZGF0YV9mb3J3YXJkKHBvcnQpOyAvKiBNdXN0IGJlIGluIFBTMiBtb2RlICovCisJcGFycG9ydF9wY19mcm9iX2NvbnRyb2wocG9ydCwgUEFSUE9SVF9DT05UUk9MX1NUUk9CRSwgMCk7CisJciA9IGNoYW5nZV9tb2RlKHBvcnQsIEVDUl9QUEYpOyAvKiBQYXJhbGxlbCBwb3J0IEZJRk8gKi8KKwlpZiAocikKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXYXJuaW5nIGNoYW5nZV9tb2RlIEVDUl9QUEYgZmFpbGVkXG4iLAorCQkJCQkJCQlwb3J0LT5uYW1lKTsKIAogCXBvcnQtPnBoeXNwb3J0LT5pZWVlMTI4NC5waGFzZSA9IElFRUUxMjg0X1BIX0ZXRF9EQVRBOwogCkBAIC03NzUsNDAgKzc4NiwzOSBAQAogCSAqIHRoZSBGSUZPIGlzIGVtcHR5LCBzbyBhbGxvdyA0IHNlY29uZHMgZm9yIGVhY2ggcG9zaXRpb24KIAkgKiBpbiB0aGUgZmlmby4KIAkgKi8KLSAgICAgICAgZXhwaXJlID0gamlmZmllcyArIChwcml2LT5maWZvX2RlcHRoICogSFogKiA0KTsKKwlleHBpcmUgPSBqaWZmaWVzICsgKHByaXYtPmZpZm9fZGVwdGggKiBIWiAqIDQpOwogCWRvIHsKIAkJLyogV2FpdCBmb3IgdGhlIEZJRk8gdG8gZW1wdHkgKi8KLQkJciA9IGNoYW5nZV9tb2RlIChwb3J0LCBFQ1JfUFMyKTsKLQkJaWYgKHIgIT0gLUVCVVNZKSB7CisJCXIgPSBjaGFuZ2VfbW9kZShwb3J0LCBFQ1JfUFMyKTsKKwkJaWYgKHIgIT0gLUVCVVNZKQogCQkJYnJlYWs7Ci0JCX0KLQl9IHdoaWxlICh0aW1lX2JlZm9yZSAoamlmZmllcywgZXhwaXJlKSk7CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJlKSk7CiAJaWYgKHIgPT0gLUVCVVNZKSB7CiAKLQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogRklGTyBpcyBzdHVja1xuIiwgcG9ydC0+bmFtZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRklGTyBpcyBzdHVja1xuIiwgcG9ydC0+bmFtZSk7CiAKIAkJLyogUHJldmVudCBmdXJ0aGVyIGRhdGEgdHJhbnNmZXIuICovCi0JCWZyb2Jfc2V0X21vZGUgKHBvcnQsIEVDUl9UU1QpOworCQlmcm9iX3NldF9tb2RlKHBvcnQsIEVDUl9UU1QpOwogCiAJCS8qIEFkanVzdCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBGSUZPLiAqLwogCQlmb3IgKHdyaXR0ZW4gLT0gcHJpdi0+Zmlmb19kZXB0aDsgOyB3cml0dGVuKyspIHsKLQkJCWlmIChpbmIgKEVDT05UUk9MIChwb3J0KSkgJiAweDIpIHsKKwkJCWlmIChpbmIoRUNPTlRST0wocG9ydCkpICYgMHgyKSB7CiAJCQkJLyogRnVsbCB1cC4gKi8KIAkJCQlicmVhazsKIAkJCX0KLQkJCW91dGIgKDAsIEZJRk8gKHBvcnQpKTsKKwkJCW91dGIoMCwgRklGTyhwb3J0KSk7CiAJCX0KIAogCQkvKiBSZXNldCB0aGUgRklGTyBhbmQgcmV0dXJuIHRvIFBTMiBtb2RlLiAqLwotCQlmcm9iX3NldF9tb2RlIChwb3J0LCBFQ1JfUFMyKTsKKwkJZnJvYl9zZXRfbW9kZShwb3J0LCBFQ1JfUFMyKTsKIAl9CiAKLQlyID0gcGFycG9ydF93YWl0X3BlcmlwaGVyYWwgKHBvcnQsCisJciA9IHBhcnBvcnRfd2FpdF9wZXJpcGhlcmFsKHBvcnQsCiAJCQkJICAgICBQQVJQT1JUX1NUQVRVU19CVVNZLAogCQkJCSAgICAgUEFSUE9SVF9TVEFUVVNfQlVTWSk7CiAJaWYgKHIpCi0JCXByaW50ayAoS0VSTl9ERUJVRwotCQkJIiVzOiBCVVNZIHRpbWVvdXQgKCVkKSBpbiBjb21wYXRfd3JpdGVfYmxvY2tfcGlvXG4iLCAKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSIlczogQlVTWSB0aW1lb3V0ICglZCkgaW4gY29tcGF0X3dyaXRlX2Jsb2NrX3Bpb1xuIiwKIAkJCXBvcnQtPm5hbWUsIHIpOwogCiAJcG9ydC0+cGh5c3BvcnQtPmllZWUxMjg0LnBoYXNlID0gSUVFRTEyODRfUEhfRldEX0lETEU7CkBAIC04MTgsNyArODI4LDcgQEAKIAogLyogRUNQICovCiAjaWZkZWYgQ09ORklHX1BBUlBPUlRfMTI4NAotc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2VjcF93cml0ZV9ibG9ja19waW8gKHN0cnVjdCBwYXJwb3J0ICpwb3J0LAorc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2VjcF93cml0ZV9ibG9ja19waW8oc3RydWN0IHBhcnBvcnQgKnBvcnQsCiAJCQkJCSAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbmd0aCwKIAkJCQkJICAgICAgaW50IGZsYWdzKQogewpAQCAtODMwLDM2ICs4NDAsMzggQEAKIAkvKiBTcGVjaWFsIGNhc2U6IGEgdGltZW91dCBvZiB6ZXJvIG1lYW5zIHdlIGNhbm5vdCBjYWxsIHNjaGVkdWxlKCkuCiAJICogQWxzbyBpZiBPX05PTkJMT0NLIGlzIHNldCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbi4gKi8KIAlpZiAocG9ydC0+cGh5c3BvcnQtPmNhZC0+dGltZW91dCA8PSBQQVJQT1JUX0lOQUNUSVZJVFlfT19OT05CTE9DSykKLQkJcmV0dXJuIHBhcnBvcnRfaWVlZTEyODRfZWNwX3dyaXRlX2RhdGEgKHBvcnQsIGJ1ZiwKKwkJcmV0dXJuIHBhcnBvcnRfaWVlZTEyODRfZWNwX3dyaXRlX2RhdGEocG9ydCwgYnVmLAogCQkJCQkJCWxlbmd0aCwgZmxhZ3MpOwogCiAJLyogU3dpdGNoIHRvIGZvcndhcmQgbW9kZSBpZiBuZWNlc3NhcnkuICovCiAJaWYgKHBvcnQtPnBoeXNwb3J0LT5pZWVlMTI4NC5waGFzZSAhPSBJRUVFMTI4NF9QSF9GV0RfSURMRSkgewogCQkvKiBFdmVudCA0NzogU2V0IG5Jbml0IGhpZ2guICovCi0JCXBhcnBvcnRfZnJvYl9jb250cm9sIChwb3J0LAorCQlwYXJwb3J0X2Zyb2JfY29udHJvbChwb3J0LAogCQkJCSAgICAgIFBBUlBPUlRfQ09OVFJPTF9JTklUCiAJCQkJICAgICAgfCBQQVJQT1JUX0NPTlRST0xfQVVUT0ZELAogCQkJCSAgICAgIFBBUlBPUlRfQ09OVFJPTF9JTklUCiAJCQkJICAgICAgfCBQQVJQT1JUX0NPTlRST0xfQVVUT0ZEKTsKIAogCQkvKiBFdmVudCA0OTogUEVycm9yIGdvZXMgaGlnaC4gKi8KLQkJciA9IHBhcnBvcnRfd2FpdF9wZXJpcGhlcmFsIChwb3J0LAorCQlyID0gcGFycG9ydF93YWl0X3BlcmlwaGVyYWwocG9ydCwKIAkJCQkJICAgICBQQVJQT1JUX1NUQVRVU19QQVBFUk9VVCwKIAkJCQkJICAgICBQQVJQT1JUX1NUQVRVU19QQVBFUk9VVCk7CiAJCWlmIChyKSB7Ci0JCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBQRXJyb3IgdGltZW91dCAoJWQpICIKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUEVycm9yIHRpbWVvdXQgKCVkKSAiCiAJCQkJImluIGVjcF93cml0ZV9ibG9ja19waW9cbiIsIHBvcnQtPm5hbWUsIHIpOwogCQl9CiAJfQogCiAJLyogU2V0IHVwIEVDUCBwYXJhbGxlbCBwb3J0IG1vZGUuKi8KLQlwYXJwb3J0X3BjX2RhdGFfZm9yd2FyZCAocG9ydCk7IC8qIE11c3QgYmUgaW4gUFMyIG1vZGUgKi8KLQlwYXJwb3J0X3BjX2Zyb2JfY29udHJvbCAocG9ydCwKKwlwYXJwb3J0X3BjX2RhdGFfZm9yd2FyZChwb3J0KTsgLyogTXVzdCBiZSBpbiBQUzIgbW9kZSAqLworCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sKHBvcnQsCiAJCQkJIFBBUlBPUlRfQ09OVFJPTF9TVFJPQkUgfAogCQkJCSBQQVJQT1JUX0NPTlRST0xfQVVUT0ZELAogCQkJCSAwKTsKLQlyID0gY2hhbmdlX21vZGUgKHBvcnQsIEVDUl9FQ1ApOyAvKiBFQ1AgRklGTyAqLwotCWlmIChyKSBwcmludGsgKEtFUk5fREVCVUcgIiVzOiBXYXJuaW5nIGNoYW5nZV9tb2RlIEVDUl9FQ1AgZmFpbGVkXG4iLCBwb3J0LT5uYW1lKTsKKwlyID0gY2hhbmdlX21vZGUocG9ydCwgRUNSX0VDUCk7IC8qIEVDUCBGSUZPICovCisJaWYgKHIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogV2FybmluZyBjaGFuZ2VfbW9kZSBFQ1JfRUNQIGZhaWxlZFxuIiwKKwkJCQkJCQkJcG9ydC0+bmFtZSk7CiAJcG9ydC0+cGh5c3BvcnQtPmllZWUxMjg0LnBoYXNlID0gSUVFRTEyODRfUEhfRldEX0RBVEE7CiAKIAkvKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgRklGTy4gKi8KQEAgLTg3Myw1NSArODg1LDU0IEBACiAJZXhwaXJlID0gamlmZmllcyArIChwcml2LT5maWZvX2RlcHRoICogKEhaICogNCkpOwogCWRvIHsKIAkJLyogV2FpdCBmb3IgdGhlIEZJRk8gdG8gZW1wdHkgKi8KLQkJciA9IGNoYW5nZV9tb2RlIChwb3J0LCBFQ1JfUFMyKTsKLQkJaWYgKHIgIT0gLUVCVVNZKSB7CisJCXIgPSBjaGFuZ2VfbW9kZShwb3J0LCBFQ1JfUFMyKTsKKwkJaWYgKHIgIT0gLUVCVVNZKQogCQkJYnJlYWs7Ci0JCX0KLQl9IHdoaWxlICh0aW1lX2JlZm9yZSAoamlmZmllcywgZXhwaXJlKSk7CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZXhwaXJlKSk7CiAJaWYgKHIgPT0gLUVCVVNZKSB7CiAKLQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogRklGTyBpcyBzdHVja1xuIiwgcG9ydC0+bmFtZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogRklGTyBpcyBzdHVja1xuIiwgcG9ydC0+bmFtZSk7CiAKIAkJLyogUHJldmVudCBmdXJ0aGVyIGRhdGEgdHJhbnNmZXIuICovCi0JCWZyb2Jfc2V0X21vZGUgKHBvcnQsIEVDUl9UU1QpOworCQlmcm9iX3NldF9tb2RlKHBvcnQsIEVDUl9UU1QpOwogCiAJCS8qIEFkanVzdCBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBGSUZPLiAqLwogCQlmb3IgKHdyaXR0ZW4gLT0gcHJpdi0+Zmlmb19kZXB0aDsgOyB3cml0dGVuKyspIHsKLQkJCWlmIChpbmIgKEVDT05UUk9MIChwb3J0KSkgJiAweDIpIHsKKwkJCWlmIChpbmIoRUNPTlRST0wocG9ydCkpICYgMHgyKSB7CiAJCQkJLyogRnVsbCB1cC4gKi8KIAkJCQlicmVhazsKIAkJCX0KLQkJCW91dGIgKDAsIEZJRk8gKHBvcnQpKTsKKwkJCW91dGIoMCwgRklGTyhwb3J0KSk7CiAJCX0KIAogCQkvKiBSZXNldCB0aGUgRklGTyBhbmQgcmV0dXJuIHRvIFBTMiBtb2RlLiAqLwotCQlmcm9iX3NldF9tb2RlIChwb3J0LCBFQ1JfUFMyKTsKKwkJZnJvYl9zZXRfbW9kZShwb3J0LCBFQ1JfUFMyKTsKIAogCQkvKiBIb3N0IHRyYW5zZmVyIHJlY292ZXJ5LiAqLwotCQlwYXJwb3J0X3BjX2RhdGFfcmV2ZXJzZSAocG9ydCk7IC8qIE11c3QgYmUgaW4gUFMyIG1vZGUgKi8KLQkJdWRlbGF5ICg1KTsKLQkJcGFycG9ydF9mcm9iX2NvbnRyb2wgKHBvcnQsIFBBUlBPUlRfQ09OVFJPTF9JTklULCAwKTsKLQkJciA9IHBhcnBvcnRfd2FpdF9wZXJpcGhlcmFsIChwb3J0LCBQQVJQT1JUX1NUQVRVU19QQVBFUk9VVCwgMCk7CisJCXBhcnBvcnRfcGNfZGF0YV9yZXZlcnNlKHBvcnQpOyAvKiBNdXN0IGJlIGluIFBTMiBtb2RlICovCisJCXVkZWxheSg1KTsKKwkJcGFycG9ydF9mcm9iX2NvbnRyb2wocG9ydCwgUEFSUE9SVF9DT05UUk9MX0lOSVQsIDApOworCQlyID0gcGFycG9ydF93YWl0X3BlcmlwaGVyYWwocG9ydCwgUEFSUE9SVF9TVEFUVVNfUEFQRVJPVVQsIDApOwogCQlpZiAocikKLQkJCXByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFBFLDEgdGltZW91dCAoJWQpICIKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUEUsMSB0aW1lb3V0ICglZCkgIgogCQkJCSJpbiBlY3Bfd3JpdGVfYmxvY2tfcGlvXG4iLCBwb3J0LT5uYW1lLCByKTsKIAotCQlwYXJwb3J0X2Zyb2JfY29udHJvbCAocG9ydCwKKwkJcGFycG9ydF9mcm9iX2NvbnRyb2wocG9ydCwKIAkJCQkgICAgICBQQVJQT1JUX0NPTlRST0xfSU5JVCwKIAkJCQkgICAgICBQQVJQT1JUX0NPTlRST0xfSU5JVCk7Ci0JCXIgPSBwYXJwb3J0X3dhaXRfcGVyaXBoZXJhbCAocG9ydCwKKwkJciA9IHBhcnBvcnRfd2FpdF9wZXJpcGhlcmFsKHBvcnQsCiAJCQkJCSAgICAgUEFSUE9SVF9TVEFUVVNfUEFQRVJPVVQsCiAJCQkJCSAgICAgUEFSUE9SVF9TVEFUVVNfUEFQRVJPVVQpOwotICAgICAgICAgICAgICAgIGlmIChyKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrIChLRVJOX0RFQlVHICIlczogUEUsMiB0aW1lb3V0ICglZCkgIgorCQlpZiAocikKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUEUsMiB0aW1lb3V0ICglZCkgIgogCQkJCSJpbiBlY3Bfd3JpdGVfYmxvY2tfcGlvXG4iLCBwb3J0LT5uYW1lLCByKTsKIAl9CiAKLQlyID0gcGFycG9ydF93YWl0X3BlcmlwaGVyYWwgKHBvcnQsCi0JCQkJICAgICBQQVJQT1JUX1NUQVRVU19CVVNZLCAKKwlyID0gcGFycG9ydF93YWl0X3BlcmlwaGVyYWwocG9ydCwKKwkJCQkgICAgIFBBUlBPUlRfU1RBVFVTX0JVU1ksCiAJCQkJICAgICBQQVJQT1JUX1NUQVRVU19CVVNZKTsKLQlpZihyKQotCQlwcmludGsgKEtFUk5fREVCVUcKKwlpZiAocikKKwkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCSIlczogQlVTWSB0aW1lb3V0ICglZCkgaW4gZWNwX3dyaXRlX2Jsb2NrX3Bpb1xuIiwKIAkJCXBvcnQtPm5hbWUsIHIpOwogCkBAIC05MzEsNyArOTQyLDcgQEAKIH0KIAogI2lmIDAKLXN0YXRpYyBzaXplX3QgcGFycG9ydF9wY19lY3BfcmVhZF9ibG9ja19waW8gKHN0cnVjdCBwYXJwb3J0ICpwb3J0LAorc3RhdGljIHNpemVfdCBwYXJwb3J0X3BjX2VjcF9yZWFkX2Jsb2NrX3BpbyhzdHJ1Y3QgcGFycG9ydCAqcG9ydCwKIAkJCQkJICAgICB2b2lkICpidWYsIHNpemVfdCBsZW5ndGgsCiAJCQkJCSAgICAgaW50IGZsYWdzKQogewpAQCAtOTQ0LDEzICs5NTUsMTMgQEAKIAljaGFyICpidWZwID0gYnVmOwogCiAJcG9ydCA9IHBvcnQtPnBoeXNwb3J0OwotRFBSSU5USyAoS0VSTl9ERUJVRyAicGFycG9ydF9wYzogcGFycG9ydF9wY19lY3BfcmVhZF9ibG9ja19waW9cbiIpOwotZHVtcF9wYXJwb3J0X3N0YXRlICgiZW50ZXIgZmNuIiwgcG9ydCk7CisJRFBSSU5USyhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBwYXJwb3J0X3BjX2VjcF9yZWFkX2Jsb2NrX3Bpb1xuIik7CisJZHVtcF9wYXJwb3J0X3N0YXRlKCJlbnRlciBmY24iLCBwb3J0KTsKIAogCS8qIFNwZWNpYWwgY2FzZTogYSB0aW1lb3V0IG9mIHplcm8gbWVhbnMgd2UgY2Fubm90IGNhbGwgc2NoZWR1bGUoKS4KIAkgKiBBbHNvIGlmIE9fTk9OQkxPQ0sgaXMgc2V0IHRoZW4gdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLiAqLwogCWlmIChwb3J0LT5jYWQtPnRpbWVvdXQgPD0gUEFSUE9SVF9JTkFDVElWSVRZX09fTk9OQkxPQ0spCi0JCXJldHVybiBwYXJwb3J0X2llZWUxMjg0X2VjcF9yZWFkX2RhdGEgKHBvcnQsIGJ1ZiwKKwkJcmV0dXJuIHBhcnBvcnRfaWVlZTEyODRfZWNwX3JlYWRfZGF0YShwb3J0LCBidWYsCiAJCQkJCQkgICAgICAgbGVuZ3RoLCBmbGFncyk7CiAKIAlpZiAocG9ydC0+aWVlZTEyODQubW9kZSA9PSBJRUVFMTI4NF9NT0RFX0VDUFJMRSkgewpAQCAtOTY2LDE3MyArOTc3LDE3OCBAQAogCSAqIGdvIHRocm91Z2ggc29mdHdhcmUgZW11bGF0aW9uLiAgT3RoZXJ3aXNlIHdlIG1heSBoYXZlIHRvIHRocm93CiAJICogYXdheSBkYXRhLiAqLwogCWlmIChsZW5ndGggPCBmaWZvZnVsbCkKLQkJcmV0dXJuIHBhcnBvcnRfaWVlZTEyODRfZWNwX3JlYWRfZGF0YSAocG9ydCwgYnVmLAorCQlyZXR1cm4gcGFycG9ydF9pZWVlMTI4NF9lY3BfcmVhZF9kYXRhKHBvcnQsIGJ1ZiwKIAkJCQkJCSAgICAgICBsZW5ndGgsIGZsYWdzKTsKIAogCWlmIChwb3J0LT5pZWVlMTI4NC5waGFzZSAhPSBJRUVFMTI4NF9QSF9SRVZfSURMRSkgewogCQkvKiBjaGFuZ2UgdG8gcmV2ZXJzZS1pZGxlIHBoYXNlIChtdXN0IGJlIGluIGZvcndhcmQtaWRsZSkgKi8KIAogCQkvKiBFdmVudCAzODogU2V0IG5BdXRvRmQgbG93IChhbHNvIG1ha2Ugc3VyZSBuU3Ryb2JlIGlzIGhpZ2gpICovCi0JCXBhcnBvcnRfZnJvYl9jb250cm9sIChwb3J0LAorCQlwYXJwb3J0X2Zyb2JfY29udHJvbChwb3J0LAogCQkJCSAgICAgIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQKIAkJCQkgICAgICB8IFBBUlBPUlRfQ09OVFJPTF9TVFJPQkUsCiAJCQkJICAgICAgUEFSUE9SVF9DT05UUk9MX0FVVE9GRCk7Ci0JCXBhcnBvcnRfcGNfZGF0YV9yZXZlcnNlIChwb3J0KTsgLyogTXVzdCBiZSBpbiBQUzIgbW9kZSAqLwotCQl1ZGVsYXkgKDUpOworCQlwYXJwb3J0X3BjX2RhdGFfcmV2ZXJzZShwb3J0KTsgLyogTXVzdCBiZSBpbiBQUzIgbW9kZSAqLworCQl1ZGVsYXkoNSk7CiAJCS8qIEV2ZW50IDM5OiBTZXQgbkluaXQgbG93IHRvIGluaXRpYXRlIGJ1cyByZXZlcnNhbCAqLwotCQlwYXJwb3J0X2Zyb2JfY29udHJvbCAocG9ydCwKKwkJcGFycG9ydF9mcm9iX2NvbnRyb2wocG9ydCwKIAkJCQkgICAgICBQQVJQT1JUX0NPTlRST0xfSU5JVCwKIAkJCQkgICAgICAwKTsKIAkJLyogRXZlbnQgNDA6IFdhaXQgZm9yICBuQWNrUmV2ZXJzZSAoUEVycm9yKSB0byBnbyBsb3cgKi8KLQkJciA9IHBhcnBvcnRfd2FpdF9wZXJpcGhlcmFsIChwb3J0LCBQQVJQT1JUX1NUQVRVU19QQVBFUk9VVCwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayAoS0VSTl9ERUJVRyAiJXM6IFBFIHRpbWVvdXQgRXZlbnQgNDAgKCVkKSAiCisJCXIgPSBwYXJwb3J0X3dhaXRfcGVyaXBoZXJhbChwb3J0LCBQQVJQT1JUX1NUQVRVU19QQVBFUk9VVCwgMCk7CisJCWlmIChyKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFBFIHRpbWVvdXQgRXZlbnQgNDAgKCVkKSAiCiAJCQkJImluIGVjcF9yZWFkX2Jsb2NrX3Bpb1xuIiwgcG9ydC0+bmFtZSwgcik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAogCS8qIFNldCB1cCBFQ1AgRklGTyBtb2RlLiovCi0vKglwYXJwb3J0X3BjX2Zyb2JfY29udHJvbCAocG9ydCwKKy8qCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sKHBvcnQsCiAJCQkJIFBBUlBPUlRfQ09OVFJPTF9TVFJPQkUgfAogCQkJCSBQQVJQT1JUX0NPTlRST0xfQVVUT0ZELAogCQkJCSBQQVJQT1JUX0NPTlRST0xfQVVUT0ZEKTsgKi8KLQlyID0gY2hhbmdlX21vZGUgKHBvcnQsIEVDUl9FQ1ApOyAvKiBFQ1AgRklGTyAqLwotCWlmIChyKSBwcmludGsgKEtFUk5fREVCVUcgIiVzOiBXYXJuaW5nIGNoYW5nZV9tb2RlIEVDUl9FQ1AgZmFpbGVkXG4iLCBwb3J0LT5uYW1lKTsKKwlyID0gY2hhbmdlX21vZGUocG9ydCwgRUNSX0VDUCk7IC8qIEVDUCBGSUZPICovCisJaWYgKHIpCisJCXByaW50ayhLRVJOX0RFQlVHICIlczogV2FybmluZyBjaGFuZ2VfbW9kZSBFQ1JfRUNQIGZhaWxlZFxuIiwKKwkJCQkJCQkJcG9ydC0+bmFtZSk7CiAKIAlwb3J0LT5pZWVlMTI4NC5waGFzZSA9IElFRUUxMjg0X1BIX1JFVl9EQVRBOwogCiAJLyogdGhlIGZpcnN0IGJ5dGUgbXVzdCBiZSBjb2xsZWN0ZWQgbWFudWFsbHkgKi8KLWR1bXBfcGFycG9ydF9zdGF0ZSAoInByZSA0MyIsIHBvcnQpOworCWR1bXBfcGFycG9ydF9zdGF0ZSgicHJlIDQzIiwgcG9ydCk7CiAJLyogRXZlbnQgNDM6IFdhaXQgZm9yIG5BY2sgdG8gZ28gbG93ICovCi0JciA9IHBhcnBvcnRfd2FpdF9wZXJpcGhlcmFsIChwb3J0LCBQQVJQT1JUX1NUQVRVU19BQ0ssIDApOworCXIgPSBwYXJwb3J0X3dhaXRfcGVyaXBoZXJhbChwb3J0LCBQQVJQT1JUX1NUQVRVU19BQ0ssIDApOwogCWlmIChyKSB7CiAJCS8qIHRpbWVkIG91dCB3aGlsZSByZWFkaW5nIC0tIG5vIGRhdGEgKi8KLQkJcHJpbnRrIChLRVJOX0RFQlVHICJQSU8gcmVhZCB0aW1lZCBvdXQgKGluaXRpYWwgYnl0ZSlcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiUElPIHJlYWQgdGltZWQgb3V0IChpbml0aWFsIGJ5dGUpXG4iKTsKIAkJZ290byBvdXRfbm9fZGF0YTsKIAl9CiAJLyogcmVhZCBieXRlICovCi0JKmJ1ZnArKyA9IGluYiAoREFUQSAocG9ydCkpOworCSpidWZwKysgPSBpbmIoREFUQShwb3J0KSk7CiAJbGVmdC0tOwotZHVtcF9wYXJwb3J0X3N0YXRlICgiNDMtNDQiLCBwb3J0KTsKKwlkdW1wX3BhcnBvcnRfc3RhdGUoIjQzLTQ0IiwgcG9ydCk7CiAJLyogRXZlbnQgNDQ6IG5BdXRvRmQgKEhvc3RBY2spIGdvZXMgaGlnaCB0byBhY2tub3dsZWRnZSAqLwotCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sIChwb3J0LAorCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sKHBvcnQsCiAJCQkJIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQsCiAJCQkJIDApOwotZHVtcF9wYXJwb3J0X3N0YXRlICgicHJlIDQ1IiwgcG9ydCk7CisJZHVtcF9wYXJwb3J0X3N0YXRlKCJwcmUgNDUiLCBwb3J0KTsKIAkvKiBFdmVudCA0NTogV2FpdCBmb3IgbkFjayB0byBnbyBoaWdoICovCi0vKglyID0gcGFycG9ydF93YWl0X3BlcmlwaGVyYWwgKHBvcnQsIFBBUlBPUlRfU1RBVFVTX0FDSywgUEFSUE9SVF9TVEFUVVNfQUNLKTsgKi8KLWR1bXBfcGFycG9ydF9zdGF0ZSAoInBvc3QgNDUiLCBwb3J0KTsKLXIgPSAwOworCS8qIHIgPSBwYXJwb3J0X3dhaXRfcGVyaXBoZXJhbChwb3J0LCBQQVJQT1JUX1NUQVRVU19BQ0ssCisJCQkJCQlQQVJQT1JUX1NUQVRVU19BQ0spOyAqLworCWR1bXBfcGFycG9ydF9zdGF0ZSgicG9zdCA0NSIsIHBvcnQpOworCXIgPSAwOwogCWlmIChyKSB7CiAJCS8qIHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nIGZvciBwZXJpcGhlcmFsIHRvIHJlc3BvbmQgdG8gYWNrICovCi0JCXByaW50ayAoS0VSTl9ERUJVRyAiRUNQIFBJTyByZWFkIHRpbWVkIG91dCAod2FpdGluZyBmb3IgbkFjaylcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiRUNQIFBJTyByZWFkIHRpbWVkIG91dCAod2FpdGluZyBmb3IgbkFjaylcbiIpOwogCiAJCS8qIGtlZXAgaG9sZCBvZiB0aGUgYnl0ZSB3ZSd2ZSBnb3QgYWxyZWFkeSAqLwogCQlnb3RvIG91dF9ub19kYXRhOwogCX0KIAkvKiBFdmVudCA0NjogbkF1dG9GZCAoSG9zdEFjaykgZ29lcyBsb3cgdG8gYWNjZXB0IG1vcmUgZGF0YSAqLwotCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sIChwb3J0LAorCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sKHBvcnQsCiAJCQkJIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQsCiAJCQkJIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQpOwogCiAKLWR1bXBfcGFycG9ydF9zdGF0ZSAoInJldiBpZGxlIiwgcG9ydCk7CisJZHVtcF9wYXJwb3J0X3N0YXRlKCJyZXYgaWRsZSIsIHBvcnQpOwogCS8qIERvIHRoZSB0cmFuc2Zlci4gKi8KIAl3aGlsZSAobGVmdCA+IGZpZm9mdWxsKSB7CiAJCWludCByZXQ7CiAJCXVuc2lnbmVkIGxvbmcgZXhwaXJlID0gamlmZmllcyArIHBvcnQtPmNhZC0+dGltZW91dDsKLQkJdW5zaWduZWQgY2hhciBlY3J2YWwgPSBpbmIgKEVDT05UUk9MIChwb3J0KSk7CisJCXVuc2lnbmVkIGNoYXIgZWNydmFsID0gaW5iKEVDT05UUk9MKHBvcnQpKTsKIAotCQlpZiAobmVlZF9yZXNjaGVkKCkgJiYgdGltZV9iZWZvcmUgKGppZmZpZXMsIGV4cGlyZSkpCisJCWlmIChuZWVkX3Jlc2NoZWQoKSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBleHBpcmUpKQogCQkJLyogQ2FuJ3QgeWllbGQgdGhlIHBvcnQuICovCi0JCQlzY2hlZHVsZSAoKTsKKwkJCXNjaGVkdWxlKCk7CiAKIAkJLyogQXQgdGhpcyBwb2ludCwgdGhlIEZJRk8gbWF5IGFscmVhZHkgYmUgZnVsbC4gSW4KLSAgICAgICAgICAgICAgICAgKiB0aGF0IGNhc2UgRUNQIGlzIGFscmVhZHkgaG9sZGluZyBiYWNrIHRoZQotICAgICAgICAgICAgICAgICAqIHBlcmlwaGVyYWwgKGFzc3VtaW5nIHByb3BlciBkZXNpZ24pIHdpdGggYSBkZWxheWVkCi0gICAgICAgICAgICAgICAgICogaGFuZHNoYWtlLiAgV29yayBmYXN0IHRvIGF2b2lkIGEgcGVyaXBoZXJhbAotICAgICAgICAgICAgICAgICAqIHRpbWVvdXQuICAqLworCQkgKiB0aGF0IGNhc2UgRUNQIGlzIGFscmVhZHkgaG9sZGluZyBiYWNrIHRoZQorCQkgKiBwZXJpcGhlcmFsIChhc3N1bWluZyBwcm9wZXIgZGVzaWduKSB3aXRoIGEgZGVsYXllZAorCQkgKiBoYW5kc2hha2UuICBXb3JrIGZhc3QgdG8gYXZvaWQgYSBwZXJpcGhlcmFsCisJCSAqIHRpbWVvdXQuICAqLwogCiAJCWlmIChlY3J2YWwgJiAweDAxKSB7CiAJCQkvKiBGSUZPIGlzIGVtcHR5LiBXYWl0IGZvciBpbnRlcnJ1cHQuICovCi1kdW1wX3BhcnBvcnRfc3RhdGUgKCJGSUZPIGVtcHR5IiwgcG9ydCk7CisJCQlkdW1wX3BhcnBvcnRfc3RhdGUoIkZJRk8gZW1wdHkiLCBwb3J0KTsKIAogCQkJLyogQW55b25lIGVsc2Ugd2FpdGluZyBmb3IgdGhlIHBvcnQ/ICovCiAJCQlpZiAocG9ydC0+d2FpdGhlYWQpIHsKLQkJCQlwcmludGsgKEtFUk5fREVCVUcgIlNvbWVib2R5IHdhbnRzIHRoZSBwb3J0XG4iKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiU29tZWJvZHkgd2FudHMgdGhlIHBvcnRcbiIpOwogCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBDbGVhciBzZXJ2aWNlSW50ciAqLwotCQkJRUNSX1dSSVRFIChwb3J0LCBlY3J2YWwgJiB+KDE8PDIpKTsKLQkJZmFsc2VfYWxhcm06Ci1kdW1wX3BhcnBvcnRfc3RhdGUgKCJ3YWl0aW5nIiwgcG9ydCk7Ci0JCQlyZXQgPSBwYXJwb3J0X3dhaXRfZXZlbnQgKHBvcnQsIEhaKTsKLURQUklOVEsgKEtFUk5fREVCVUcgInBhcnBvcnRfd2FpdF9ldmVudCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJCUVDUl9XUklURShwb3J0LCBlY3J2YWwgJiB+KDE8PDIpKTsKK2ZhbHNlX2FsYXJtOgorCQkJZHVtcF9wYXJwb3J0X3N0YXRlKCJ3YWl0aW5nIiwgcG9ydCk7CisJCQlyZXQgPSBwYXJwb3J0X3dhaXRfZXZlbnQocG9ydCwgSFopOworCQkJRFBSSU5USyhLRVJOX0RFQlVHICJwYXJwb3J0X3dhaXRfZXZlbnQgcmV0dXJuZWQgJWRcbiIsCisJCQkJCQkJCQlyZXQpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJYnJlYWs7CiAJCQlyZXQgPSAwOwotCQkJaWYgKCF0aW1lX2JlZm9yZSAoamlmZmllcywgZXhwaXJlKSkgeworCQkJaWYgKCF0aW1lX2JlZm9yZShqaWZmaWVzLCBleHBpcmUpKSB7CiAJCQkJLyogVGltZWQgb3V0LiAqLwotZHVtcF9wYXJwb3J0X3N0YXRlICgidGltZW91dCIsIHBvcnQpOwotCQkJCXByaW50ayAoS0VSTl9ERUJVRyAiUElPIHJlYWQgdGltZWQgb3V0XG4iKTsKKwkJCQlkdW1wX3BhcnBvcnRfc3RhdGUoInRpbWVvdXQiLCBwb3J0KTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiUElPIHJlYWQgdGltZWQgb3V0XG4iKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWVjcnZhbCA9IGluYiAoRUNPTlRST0wgKHBvcnQpKTsKKwkJCWVjcnZhbCA9IGluYihFQ09OVFJPTChwb3J0KSk7CiAJCQlpZiAoIShlY3J2YWwgJiAoMTw8MikpKSB7CiAJCQkJaWYgKG5lZWRfcmVzY2hlZCgpICYmCi0JCQkJICAgIHRpbWVfYmVmb3JlIChqaWZmaWVzLCBleHBpcmUpKSB7Ci0JCQkJCXNjaGVkdWxlICgpOworCQkJCSAgICB0aW1lX2JlZm9yZShqaWZmaWVzLCBleHBpcmUpKSB7CisJCQkJCXNjaGVkdWxlKCk7CiAJCQkJfQogCQkJCWdvdG8gZmFsc2VfYWxhcm07CiAJCQl9CiAKIAkJCS8qIERlcGVuZGluZyBvbiBob3cgdGhlIEZJRk8gdGhyZXNob2xkIHdhcwotICAgICAgICAgICAgICAgICAgICAgICAgICogc2V0LCBob3cgbG9uZyBpbnRlcnJ1cHQgc2VydmljZSB0b29rLCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIGhvdyBmYXN0IHRoZSBwZXJpcGhlcmFsIGlzLCB3ZSBtaWdodCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICogbHVja3kgYW5kIGhhdmUgYSBqdXN0IGZpbGxlZCBGSUZPLiAqLworCQkJICogc2V0LCBob3cgbG9uZyBpbnRlcnJ1cHQgc2VydmljZSB0b29rLCBhbmQKKwkJCSAqIGhvdyBmYXN0IHRoZSBwZXJpcGhlcmFsIGlzLCB3ZSBtaWdodCBiZQorCQkJICogbHVja3kgYW5kIGhhdmUgYSBqdXN0IGZpbGxlZCBGSUZPLiAqLwogCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAoZWNydmFsICYgMHgwMikgewogCQkJLyogRklGTyBpcyBmdWxsLiAqLwotZHVtcF9wYXJwb3J0X3N0YXRlICgiRklGTyBmdWxsIiwgcG9ydCk7Ci0JCQlpbnNiIChmaWZvLCBidWZwLCBmaWZvX2RlcHRoKTsKKwkJCWR1bXBfcGFycG9ydF9zdGF0ZSgiRklGTyBmdWxsIiwgcG9ydCk7CisJCQlpbnNiKGZpZm8sIGJ1ZnAsIGZpZm9fZGVwdGgpOwogCQkJYnVmcCArPSBmaWZvX2RlcHRoOwogCQkJbGVmdCAtPSBmaWZvX2RlcHRoOwogCQkJY29udGludWU7CiAJCX0KIAotRFBSSU5USyAoS0VSTl9ERUJVRyAiKioqIGVjcF9yZWFkX2Jsb2NrX3BpbzogcmVhZGluZyBvbmUgYnl0ZSBmcm9tIHRoZSBGSUZPXG4iKTsKKwkJRFBSSU5USyhLRVJOX0RFQlVHCisJCSAgIioqKiBlY3BfcmVhZF9ibG9ja19waW86IHJlYWRpbmcgb25lIGJ5dGUgZnJvbSB0aGUgRklGT1xuIik7CiAKIAkJLyogRklGTyBub3QgZmlsbGVkLiAgV2Ugd2lsbCBjeWNsZSB0aGlzIGxvb3AgZm9yIGEgd2hpbGUKLSAgICAgICAgICAgICAgICAgKiBhbmQgZWl0aGVyIHRoZSBwZXJpcGhlcmFsIHdpbGwgZmlsbCBpdCBmYXN0ZXIsCi0gICAgICAgICAgICAgICAgICogdHJpcHBpbmcgYSBmYXN0IGVtcHR5IHdpdGggaW5zYiwgb3Igd2UgZW1wdHkgaXQuICovCi0JCSpidWZwKysgPSBpbmIgKGZpZm8pOworCQkgKiBhbmQgZWl0aGVyIHRoZSBwZXJpcGhlcmFsIHdpbGwgZmlsbCBpdCBmYXN0ZXIsCisJCSAqIHRyaXBwaW5nIGEgZmFzdCBlbXB0eSB3aXRoIGluc2IsIG9yIHdlIGVtcHR5IGl0LiAqLworCQkqYnVmcCsrID0gaW5iKGZpZm8pOwogCQlsZWZ0LS07CiAJfQogCiAJLyogc2Nvb3AgdXAgYW55dGhpbmcgbGVmdCBpbiB0aGUgRklGTyAqLwotCXdoaWxlIChsZWZ0ICYmICEoaW5iIChFQ09OVFJPTCAocG9ydCkgJiAweDAxKSkpIHsKLQkJKmJ1ZnArKyA9IGluYiAoZmlmbyk7CisJd2hpbGUgKGxlZnQgJiYgIShpbmIoRUNPTlRST0wocG9ydCkgJiAweDAxKSkpIHsKKwkJKmJ1ZnArKyA9IGluYihmaWZvKTsKIAkJbGVmdC0tOwogCX0KIAogCXBvcnQtPmllZWUxMjg0LnBoYXNlID0gSUVFRTEyODRfUEhfUkVWX0lETEU7Ci1kdW1wX3BhcnBvcnRfc3RhdGUgKCJyZXYgaWRsZTIiLCBwb3J0KTsKKwlkdW1wX3BhcnBvcnRfc3RhdGUoInJldiBpZGxlMiIsIHBvcnQpOwogCiBvdXRfbm9fZGF0YToKIAogCS8qIEdvIHRvIGZvcndhcmQgaWRsZSBtb2RlIHRvIHNodXQgdGhlIHBlcmlwaGVyYWwgdXAgKGV2ZW50IDQ3KS4gKi8KLQlwYXJwb3J0X2Zyb2JfY29udHJvbCAocG9ydCwgUEFSUE9SVF9DT05UUk9MX0lOSVQsIFBBUlBPUlRfQ09OVFJPTF9JTklUKTsKKwlwYXJwb3J0X2Zyb2JfY29udHJvbChwb3J0LCBQQVJQT1JUX0NPTlRST0xfSU5JVCwgUEFSUE9SVF9DT05UUk9MX0lOSVQpOwogCiAJLyogZXZlbnQgNDk6IFBFcnJvciBnb2VzIGhpZ2ggKi8KLQlyID0gcGFycG9ydF93YWl0X3BlcmlwaGVyYWwgKHBvcnQsCisJciA9IHBhcnBvcnRfd2FpdF9wZXJpcGhlcmFsKHBvcnQsCiAJCQkJICAgICBQQVJQT1JUX1NUQVRVU19QQVBFUk9VVCwKIAkJCQkgICAgIFBBUlBPUlRfU1RBVFVTX1BBUEVST1VUKTsKIAlpZiAocikgewotCQlwcmludGsgKEtFUk5fREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcKIAkJCSIlczogUEUgdGltZW91dCBGV0RJRExFICglZCkgaW4gZWNwX3JlYWRfYmxvY2tfcGlvXG4iLAogCQkJcG9ydC0+bmFtZSwgcik7CiAJfQpAQCAtMTE0MSwxNCArMTE1NywxNCBAQAogCiAJLyogRmluaXNoIHVwLiAqLwogCXsKLQkJaW50IGxvc3QgPSBnZXRfZmlmb19yZXNpZHVlIChwb3J0KTsKKwkJaW50IGxvc3QgPSBnZXRfZmlmb19yZXNpZHVlKHBvcnQpOwogCQlpZiAobG9zdCkKIAkJCS8qIFNob3VsZG4ndCBoYXBwZW4gd2l0aCBjb21wbGlhbnQgcGVyaXBoZXJhbHMuICovCi0JCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiBEQVRBIExPU1MgKCVkIGJ5dGVzKSFcbiIsCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IERBVEEgTE9TUyAoJWQgYnl0ZXMpIVxuIiwKIAkJCQlwb3J0LT5uYW1lLCBsb3N0KTsKIAl9CiAKLWR1bXBfcGFycG9ydF9zdGF0ZSAoImZ3ZCBpZGxlIiwgcG9ydCk7CisJZHVtcF9wYXJwb3J0X3N0YXRlKCJmd2QgaWRsZSIsIHBvcnQpOwogCXJldHVybiBsZW5ndGggLSBsZWZ0OwogfQogI2VuZGlmICAvKiAgMCAgKi8KQEAgLTExNjQsOCArMTE4MCw3IEBACiAKIC8qIEdDQyBpcyBub3QgaW5saW5pbmcgZXh0ZXJuIGlubGluZSBmdW5jdGlvbiBsYXRlciBvdmVyd3JpdGVuIHRvIG5vbi1pbmxpbmUsCiAgICBzbyB3ZSB1c2Ugb3V0bGluZWRfIHZhcmlhbnRzIGhlcmUuICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMgcGFycG9ydF9wY19vcHMgPQoteworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMgcGFycG9ydF9wY19vcHMgPSB7CiAJLndyaXRlX2RhdGEJPSBwYXJwb3J0X3BjX3dyaXRlX2RhdGEsCiAJLnJlYWRfZGF0YQk9IHBhcnBvcnRfcGNfcmVhZF9kYXRhLAogCkBAIC0xMjAyLDg4ICsxMjE3LDEwNyBAQAogfTsKIAogI2lmZGVmIENPTkZJR19QQVJQT1JUX1BDX1NVUEVSSU8KKworc3RhdGljIHN0cnVjdCBzdXBlcmlvX3N0cnVjdCAqZmluZF9mcmVlX3N1cGVyaW8odm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfU1VQRVJJT1M7IGkrKykKKwkJaWYgKHN1cGVyaW9zW2ldLmlvID09IDApCisJCQlyZXR1cm4gJnN1cGVyaW9zW2ldOworCXJldHVybiBOVUxMOworfQorCisKIC8qIFN1cGVyLUlPIGNoaXBzZXQgZGV0ZWN0aW9uLCBXaW5ib25kLCBTTVNDICovCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc2hvd19wYXJjb25maWdfc21zYzM3YzY2OShpbnQgaW8sIGludCBrZXkpCiB7Ci0JaW50IGNyMSxjcjQsY3JhLGNyMjMsY3IyNixjcjI3LGk9MDsKLQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbW9kZXNbXT17CisJaW50IGNyMSwgY3I0LCBjcmEsIGNyMjMsIGNyMjYsIGNyMjc7CisJc3RydWN0IHN1cGVyaW9fc3RydWN0ICpzOworCisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1vZGVzW10gPSB7CiAJCSJTUFAgYW5kIEJpZGlyZWN0aW9uYWwgKFBTLzIpIiwKIAkJIkVQUCBhbmQgU1BQIiwKIAkJIkVDUCIsCiAJCSJFQ1AgYW5kIEVQUCIgfTsKIAotCW91dGIoa2V5LGlvKTsKLQlvdXRiKGtleSxpbyk7Ci0Jb3V0YigxLGlvKTsKLQljcjE9aW5iKGlvKzEpOwotCW91dGIoNCxpbyk7Ci0JY3I0PWluYihpbysxKTsKLQlvdXRiKDB4MGEsaW8pOwotCWNyYT1pbmIoaW8rMSk7Ci0Jb3V0YigweDIzLGlvKTsKLQljcjIzPWluYihpbysxKTsKLQlvdXRiKDB4MjYsaW8pOwotCWNyMjY9aW5iKGlvKzEpOwotCW91dGIoMHgyNyxpbyk7Ci0JY3IyNz1pbmIoaW8rMSk7Ci0Jb3V0YigweGFhLGlvKTsKKwlvdXRiKGtleSwgaW8pOworCW91dGIoa2V5LCBpbyk7CisJb3V0YigxLCBpbyk7CisJY3IxID0gaW5iKGlvICsgMSk7CisJb3V0Yig0LCBpbyk7CisJY3I0ID0gaW5iKGlvICsgMSk7CisJb3V0YigweDBhLCBpbyk7CisJY3JhID0gaW5iKGlvICsgMSk7CisJb3V0YigweDIzLCBpbyk7CisJY3IyMyA9IGluYihpbyArIDEpOworCW91dGIoMHgyNiwgaW8pOworCWNyMjYgPSBpbmIoaW8gKyAxKTsKKwlvdXRiKDB4MjcsIGlvKTsKKwljcjI3ID0gaW5iKGlvICsgMSk7CisJb3V0YigweGFhLCBpbyk7CiAKIAlpZiAodmVyYm9zZV9wcm9iaW5nKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJTTVNDIDM3YzY2OSBMUFQgQ29uZmlnOiBjcl8xPTB4JTAyeCwgND0weCUwMngsICIKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIlNNU0MgMzdjNjY5IExQVCBDb25maWc6IGNyXzE9MHglMDJ4LCA0PTB4JTAyeCwgIgogCQkJIkE9MHglMngsIDIzPTB4JTAyeCwgMjY9MHglMDJ4LCAyNz0weCUwMnhcbiIsCi0JCQljcjEsY3I0LGNyYSxjcjIzLGNyMjYsY3IyNyk7Ci0JCQorCQkJY3IxLCBjcjQsIGNyYSwgY3IyMywgY3IyNiwgY3IyNyk7CisKIAkJLyogVGhlIGRvY3VtZW50YXRpb24gY2FsbHMgRE1BIGFuZCBJUlEtTGluZXMgYnkgbGV0dGVycywgc28KIAkJICAgdGhlIGJvYXJkIG1ha2VyIGNhbi93aWxsIHdpcmUgdGhlbQogCQkgICBhcHByb3ByaWF0ZWx5L3JhbmRvbWx5Li4uICBHPXJlc2VydmVkIEg9SURFLWlycSwgKi8KLQkJcHJpbnRrIChLRVJOX0lORk8gIlNNU0MgTFBUIENvbmZpZzogaW89MHglMDR4LCBpcnE9JWMsIGRtYT0lYywgIgotCQkJImZpZm8gdGhyZXNob2xkPSVkXG4iLCBjcjIzKjQsCi0JCQkoY3IyNyAmMHgwZikgPyAnQSctMSsoY3IyNyAmMHgwZik6ICctJywKLQkJCShjcjI2ICYweDBmKSA/ICdBJy0xKyhjcjI2ICYweDBmKTogJy0nLCBjcmEgJiAweDBmKTsKKwkJcHJpbnRrKEtFUk5fSU5GTworCSJTTVNDIExQVCBDb25maWc6IGlvPTB4JTA0eCwgaXJxPSVjLCBkbWE9JWMsIGZpZm8gdGhyZXNob2xkPSVkXG4iLAorCQkJCWNyMjMgKiA0LAorCQkJCShjcjI3ICYgMHgwZikgPyAnQScgLSAxICsgKGNyMjcgJiAweDBmKSA6ICctJywKKwkJCQkoY3IyNiAmIDB4MGYpID8gJ0EnIC0gMSArIChjcjI2ICYgMHgwZikgOiAnLScsCisJCQkJY3JhICYgMHgwZik7CiAJCXByaW50ayhLRVJOX0lORk8gIlNNU0MgTFBUIENvbmZpZzogZW5hYmxlZD0lcyBwb3dlcj0lc1xuIiwKLQkJICAgICAgIChjcjIzKjQgPj0weDEwMCkgPyJ5ZXMiOiJubyIsIChjcjEgJiA0KSA/ICJ5ZXMiIDogIm5vIik7Ci0JCXByaW50ayhLRVJOX0lORk8gIlNNU0MgTFBUIENvbmZpZzogUG9ydCBtb2RlPSVzLCBFUFAgdmVyc2lvbiA9JXNcbiIsCi0JCSAgICAgICAoY3IxICYgMHgwOCApID8gIlN0YW5kYXJkIG1vZGUgb25seSAoU1BQKSIgOiBtb2Rlc1tjcjQgJiAweDAzXSwgCi0JCSAgICAgICAoY3I0ICYgMHg0MCkgPyAiMS43IiA6ICIxLjkiKTsKKwkJICAgICAgIChjcjIzICogNCA+PSAweDEwMCkgPyAieWVzIiA6ICJubyIsCisJCSAgICAgICAoY3IxICYgNCkgPyAieWVzIiA6ICJubyIpOworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiU01TQyBMUFQgQ29uZmlnOiBQb3J0IG1vZGU9JXMsIEVQUCB2ZXJzaW9uID0lc1xuIiwKKwkJCQkoY3IxICYgMHgwOCkgPyAiU3RhbmRhcmQgbW9kZSBvbmx5IChTUFApIgorCQkJCQkgICAgICA6IG1vZGVzW2NyNCAmIDB4MDNdLAorCQkJCShjcjQgJiAweDQwKSA/ICIxLjciIDogIjEuOSIpOwogCX0KLQkJCisKIAkvKiBIZXVyaXN0aWNzICEgIEJJT1Mgc2V0dXAgZm9yIHRoaXMgbWFpbmJvYXJkIGRldmljZSBsaW1pdHMKIAkgICB0aGUgY2hvaWNlcyB0byBzdGFuZGFyZCBzZXR0aW5ncywgaS5lLiBpby1hZGRyZXNzIGFuZCBJUlEKIAkgICBhcmUgcmVsYXRlZCwgaG93ZXZlciBETUEgY2FuIGJlIDEgb3IgMywgYXNzdW1lIERNQV9BPURNQTEsCiAJICAgRE1BX0M9RE1BMyAodGhpcyBpcyB0cnVlIGUuZy4gZm9yIFRZQU4gMTU2NEQgVG9tY2F0IElWKSAqLwotCWlmKGNyMjMqNCA+PTB4MTAwKSB7IC8qIGlmIGFjdGl2ZSAqLwotCQl3aGlsZSgoc3VwZXJpb3NbaV0uaW8hPSAwKSAmJiAoaTxOUl9TVVBFUklPUykpCi0JCQlpKys7Ci0JCWlmKGk9PU5SX1NVUEVSSU9TKQorCWlmIChjcjIzICogNCA+PSAweDEwMCkgeyAvKiBpZiBhY3RpdmUgKi8KKwkJcyA9IGZpbmRfZnJlZV9zdXBlcmlvKCk7CisJCWlmIChzID09IE5VTEwpCiAJCQlwcmludGsoS0VSTl9JTkZPICJTdXBlci1JTzogdG9vIG1hbnkgY2hpcHMhXG4iKTsKIAkJZWxzZSB7CiAJCQlpbnQgZDsKLQkJCXN3aXRjaCAoY3IyMyo0KSB7Ci0JCQkJY2FzZSAweDNiYzoKLQkJCQkJc3VwZXJpb3NbaV0uaW8gPSAweDNiYzsKLQkJCQkJc3VwZXJpb3NbaV0uaXJxID0gNzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDM3ODoKLQkJCQkJc3VwZXJpb3NbaV0uaW8gPSAweDM3ODsKLQkJCQkJc3VwZXJpb3NbaV0uaXJxID0gNzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDI3ODoKLQkJCQkJc3VwZXJpb3NbaV0uaW8gPSAweDI3ODsKLQkJCQkJc3VwZXJpb3NbaV0uaXJxID0gNTsKKwkJCXN3aXRjaCAoY3IyMyAqIDQpIHsKKwkJCWNhc2UgMHgzYmM6CisJCQkJcy0+aW8gPSAweDNiYzsKKwkJCQlzLT5pcnEgPSA3OworCQkJCWJyZWFrOworCQkJY2FzZSAweDM3ODoKKwkJCQlzLT5pbyA9IDB4Mzc4OworCQkJCXMtPmlycSA9IDc7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4Mjc4OgorCQkJCXMtPmlvID0gMHgyNzg7CisJCQkJcy0+aXJxID0gNTsKIAkJCX0KLQkJCWQ9KGNyMjYgJjB4MGYpOwotCQkJaWYoKGQ9PTEpIHx8IChkPT0zKSkgCi0JCQkJc3VwZXJpb3NbaV0uZG1hPSBkOworCQkJZCA9IChjcjI2ICYgMHgwZik7CisJCQlpZiAoZCA9PSAxIHx8IGQgPT0gMykKKwkJCQlzLT5kbWEgPSBkOwogCQkJZWxzZQotCQkJCXN1cGVyaW9zW2ldLmRtYT0gUEFSUE9SVF9ETUFfTk9ORTsKKwkJCQlzLT5kbWEgPSBQQVJQT1JUX0RNQV9OT05FOwogCQl9Ci0gCX0KKwl9CiB9CiAKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHNob3dfcGFyY29uZmlnX3dpbmJvbmQoaW50IGlvLCBpbnQga2V5KQogewotCWludCBjcjMwLGNyNjAsY3I2MSxjcjcwLGNyNzQsY3JmMCxpPTA7CisJaW50IGNyMzAsIGNyNjAsIGNyNjEsIGNyNzAsIGNyNzQsIGNyZjA7CisJc3RydWN0IHN1cGVyaW9fc3RydWN0ICpzOwogCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtb2Rlc1tdID0gewogCQkiU3RhbmRhcmQgKFNQUCkgYW5kIEJpZGlyZWN0aW9uYWwoUFMvMikiLCAvKiAwICovCiAJCSJFUFAtMS45IGFuZCBTUFAiLApAQCAtMTI5NiwxMTAgKzEzMzAsMTM0IEBACiAJc3RhdGljIGNoYXIgKmNvbnN0IGlycXR5cGVzW10gPSB7CiAJCSJwdWxzZWQgbG93LCBoaWdoLVoiLAogCQkiZm9sbG93cyBuQUNLIiB9OwotCQkKKwogCS8qIFRoZSByZWdpc3RlcnMgYXJlIGNhbGxlZCBjb21wYXRpYmxlLVBuUCBiZWNhdXNlIHRoZQotICAgICAgICAgICByZWdpc3RlciBsYXlvdXQgaXMgbW9kZWxsZWQgYWZ0ZXIgSVNBLVBuUCwgdGhlIGFjY2VzcwotICAgICAgICAgICBtZXRob2QgaXMganVzdCBhbm90aGVyIC4uLiAqLwotCW91dGIoa2V5LGlvKTsKLQlvdXRiKGtleSxpbyk7Ci0Jb3V0YigweDA3LGlvKTsgICAvKiBSZWdpc3RlciA3OiBTZWxlY3QgTG9naWNhbCBEZXZpY2UgKi8KLQlvdXRiKDB4MDEsaW8rMSk7IC8qIExEMSBpcyBQYXJhbGxlbCBQb3J0ICovCi0Jb3V0YigweDMwLGlvKTsKLQljcjMwPWluYihpbysxKTsKLQlvdXRiKDB4NjAsaW8pOwotCWNyNjA9aW5iKGlvKzEpOwotCW91dGIoMHg2MSxpbyk7Ci0JY3I2MT1pbmIoaW8rMSk7Ci0Jb3V0YigweDcwLGlvKTsKLQljcjcwPWluYihpbysxKTsKLQlvdXRiKDB4NzQsaW8pOwotCWNyNzQ9aW5iKGlvKzEpOwotCW91dGIoMHhmMCxpbyk7Ci0JY3JmMD1pbmIoaW8rMSk7Ci0Jb3V0YigweGFhLGlvKTsKKwkgICByZWdpc3RlciBsYXlvdXQgaXMgbW9kZWxsZWQgYWZ0ZXIgSVNBLVBuUCwgdGhlIGFjY2VzcworCSAgIG1ldGhvZCBpcyBqdXN0IGFub3RoZXIgLi4uICovCisJb3V0YihrZXksIGlvKTsKKwlvdXRiKGtleSwgaW8pOworCW91dGIoMHgwNywgaW8pOyAgIC8qIFJlZ2lzdGVyIDc6IFNlbGVjdCBMb2dpY2FsIERldmljZSAqLworCW91dGIoMHgwMSwgaW8gKyAxKTsgLyogTEQxIGlzIFBhcmFsbGVsIFBvcnQgKi8KKwlvdXRiKDB4MzAsIGlvKTsKKwljcjMwID0gaW5iKGlvICsgMSk7CisJb3V0YigweDYwLCBpbyk7CisJY3I2MCA9IGluYihpbyArIDEpOworCW91dGIoMHg2MSwgaW8pOworCWNyNjEgPSBpbmIoaW8gKyAxKTsKKwlvdXRiKDB4NzAsIGlvKTsKKwljcjcwID0gaW5iKGlvICsgMSk7CisJb3V0YigweDc0LCBpbyk7CisJY3I3NCA9IGluYihpbyArIDEpOworCW91dGIoMHhmMCwgaW8pOworCWNyZjAgPSBpbmIoaW8gKyAxKTsKKwlvdXRiKDB4YWEsIGlvKTsKIAogCWlmICh2ZXJib3NlX3Byb2JpbmcpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiV2luYm9uZCBMUFQgQ29uZmlnOiBjcl8zMD0lMDJ4IDYwLDYxPSUwMnglMDJ4ICIKLQkJICAgICAgICI3MD0lMDJ4IDc0PSUwMngsIGYwPSUwMnhcbiIsIGNyMzAsY3I2MCxjcjYxLGNyNzAsY3I3NCxjcmYwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiV2luYm9uZCBMUFQgQ29uZmlnOiBhY3RpdmU9JXMsIGlvPTB4JTAyeCUwMnggaXJxPSVkLCAiLCAKLQkJICAgICAgIChjcjMwICYgMHgwMSkgPyAieWVzIjoibm8iLCBjcjYwLGNyNjEsY3I3MCYweDBmICk7CisJCXByaW50ayhLRVJOX0lORk8KKyAgICAiV2luYm9uZCBMUFQgQ29uZmlnOiBjcl8zMD0lMDJ4IDYwLDYxPSUwMnglMDJ4IDcwPSUwMnggNzQ9JTAyeCwgZjA9JTAyeFxuIiwKKwkJCQkJY3IzMCwgY3I2MCwgY3I2MSwgY3I3MCwgY3I3NCwgY3JmMCk7CisJCXByaW50ayhLRVJOX0lORk8gIldpbmJvbmQgTFBUIENvbmZpZzogYWN0aXZlPSVzLCBpbz0weCUwMnglMDJ4IGlycT0lZCwgIiwKKwkJICAgICAgIChjcjMwICYgMHgwMSkgPyAieWVzIiA6ICJubyIsIGNyNjAsIGNyNjEsIGNyNzAgJiAweDBmKTsKIAkJaWYgKChjcjc0ICYgMHgwNykgPiAzKQogCQkJcHJpbnRrKCJkbWE9bm9uZVxuIik7CiAJCWVsc2UKLQkJCXByaW50aygiZG1hPSVkXG4iLGNyNzQgJiAweDA3KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiV2luYm9uZCBMUFQgQ29uZmlnOiBpcnF0eXBlPSVzLCBFQ1AgZmlmbyB0aHJlc2hvbGQ9JWRcbiIsCi0JCSAgICAgICBpcnF0eXBlc1tjcmYwPj43XSwgKGNyZjA+PjMpJjB4MGYpOwotCQlwcmludGsoS0VSTl9JTkZPICJXaW5ib25kIExQVCBDb25maWc6IFBvcnQgbW9kZT0lc1xuIiwgbW9kZXNbY3JmMCAmIDB4MDddKTsKKwkJCXByaW50aygiZG1hPSVkXG4iLCBjcjc0ICYgMHgwNyk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICJXaW5ib25kIExQVCBDb25maWc6IGlycXR5cGU9JXMsIEVDUCBmaWZvIHRocmVzaG9sZD0lZFxuIiwKKwkJCQkJaXJxdHlwZXNbY3JmMD4+N10sIChjcmYwPj4zKSYweDBmKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiV2luYm9uZCBMUFQgQ29uZmlnOiBQb3J0IG1vZGU9JXNcbiIsCisJCQkJCW1vZGVzW2NyZjAgJiAweDA3XSk7CiAJfQogCi0JaWYoY3IzMCAmIDB4MDEpIHsgLyogdGhlIHNldHRpbmdzIGNhbiBiZSBpbnRlcnJvZ2F0ZWQgbGF0ZXIgLi4uICovCi0JCXdoaWxlKChzdXBlcmlvc1tpXS5pbyE9IDApICYmIChpPE5SX1NVUEVSSU9TKSkKLQkJCWkrKzsKLQkJaWYoaT09TlJfU1VQRVJJT1MpIAorCWlmIChjcjMwICYgMHgwMSkgeyAvKiB0aGUgc2V0dGluZ3MgY2FuIGJlIGludGVycm9nYXRlZCBsYXRlciAuLi4gKi8KKwkJcyA9IGZpbmRfZnJlZV9zdXBlcmlvKCk7CisJCWlmIChzID09IE5VTEwpCiAJCQlwcmludGsoS0VSTl9JTkZPICJTdXBlci1JTzogdG9vIG1hbnkgY2hpcHMhXG4iKTsKIAkJZWxzZSB7Ci0JCQlzdXBlcmlvc1tpXS5pbyA9IChjcjYwPDw4KXxjcjYxOwotCQkJc3VwZXJpb3NbaV0uaXJxID0gY3I3MCYweDBmOwotCQkJc3VwZXJpb3NbaV0uZG1hID0gKCgoY3I3NCAmIDB4MDcpID4gMykgPworCQkJcy0+aW8gPSAoY3I2MCA8PCA4KSB8IGNyNjE7CisJCQlzLT5pcnEgPSBjcjcwICYgMHgwZjsKKwkJCXMtPmRtYSA9ICgoKGNyNzQgJiAweDA3KSA+IDMpID8KIAkJCQkJICAgUEFSUE9SVF9ETUFfTk9ORSA6IChjcjc0ICYgMHgwNykpOwogCQl9CiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgZGVjb2RlX3dpbmJvbmQoaW50IGVmZXIsIGludCBrZXksIGludCBkZXZpZCwgaW50IGRldnJldiwgaW50IG9sZGlkKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGRlY29kZV93aW5ib25kKGludCBlZmVyLCBpbnQga2V5LCBpbnQgZGV2aWQsCisJCQkJCQkJaW50IGRldnJldiwgaW50IG9sZGlkKQogewogCWNvbnN0IGNoYXIgKnR5cGUgPSAidW5rbm93biI7Ci0JaW50IGlkLHByb2dpZj0yOworCWludCBpZCwgcHJvZ2lmID0gMjsKIAogCWlmIChkZXZpZCA9PSBkZXZyZXYpCiAJCS8qIHNpbXBsZSBoZXVyaXN0aWNzLCB3ZSBoYXBwZW5lZCB0byByZWFkIHNvbWUKLSAgICAgICAgICAgICAgICAgICBub24td2luYm9uZCByZWdpc3RlciAqLworCQkgICBub24td2luYm9uZCByZWdpc3RlciAqLwogCQlyZXR1cm47CiAKLQlpZD0oZGV2aWQ8PDgpIHwgZGV2cmV2OworCWlkID0gKGRldmlkIDw8IDgpIHwgZGV2cmV2OwogCiAJLyogVmFsdWVzIGFyZSBmcm9tIHB1YmxpYyBkYXRhIHNoZWV0cyBwZGYgZmlsZXMsIEkgY2FuIGp1c3QKLSAgICAgICAgICAgY29uZmlybSA4Mzk3N1RGIGlzIGNvcnJlY3QgOi0pICovCi0JaWYgICAgICAoaWQgPT0gMHg5NzcxKSB0eXBlPSI4Mzk3N0YvQUYiOwotCWVsc2UgaWYgKGlkID09IDB4OTc3MykgdHlwZT0iODM5NzdURiAvIFNNU0MgOTd3MzN4Lzk3dzM0eCI7Ci0JZWxzZSBpZiAoaWQgPT0gMHg5Nzc0KSB0eXBlPSI4Mzk3N0FURiI7Ci0JZWxzZSBpZiAoKGlkICYgfjB4MGYpID09IDB4NTI3MCkgdHlwZT0iODM5NzdDVEYgLyBTTVNDIDk3dzM2eCI7Ci0JZWxzZSBpZiAoKGlkICYgfjB4MGYpID09IDB4NTJmMCkgdHlwZT0iODM5NzdFRiAvIFNNU0MgOTd3MzV4IjsKLQllbHNlIGlmICgoaWQgJiB+MHgwZikgPT0gMHg1MjEwKSB0eXBlPSI4MzYyNyI7Ci0JZWxzZSBpZiAoKGlkICYgfjB4MGYpID09IDB4NjAxMCkgdHlwZT0iODM2OTdIRiI7Ci0JZWxzZSBpZiAoKG9sZGlkICYweDBmICkgPT0gMHgwYSkgeyB0eXBlPSI4Mzg3N0YiOyBwcm9naWY9MTt9Ci0JZWxzZSBpZiAoKG9sZGlkICYweDBmICkgPT0gMHgwYikgeyB0eXBlPSI4Mzg3N0FGIjsgcHJvZ2lmPTE7fQotCWVsc2UgaWYgKChvbGRpZCAmMHgwZiApID09IDB4MGMpIHsgdHlwZT0iODM4NzdURiI7IHByb2dpZj0xO30KLQllbHNlIGlmICgob2xkaWQgJjB4MGYgKSA9PSAweDBkKSB7IHR5cGU9IjgzODc3QVRGIjsgcHJvZ2lmPTE7fQotCWVsc2UgcHJvZ2lmPTA7CisJICAgY29uZmlybSA4Mzk3N1RGIGlzIGNvcnJlY3QgOi0pICovCisJaWYgKGlkID09IDB4OTc3MSkKKwkJdHlwZSA9ICI4Mzk3N0YvQUYiOworCWVsc2UgaWYgKGlkID09IDB4OTc3MykKKwkJdHlwZSA9ICI4Mzk3N1RGIC8gU01TQyA5N3czM3gvOTd3MzR4IjsKKwllbHNlIGlmIChpZCA9PSAweDk3NzQpCisJCXR5cGUgPSAiODM5NzdBVEYiOworCWVsc2UgaWYgKChpZCAmIH4weDBmKSA9PSAweDUyNzApCisJCXR5cGUgPSAiODM5NzdDVEYgLyBTTVNDIDk3dzM2eCI7CisJZWxzZSBpZiAoKGlkICYgfjB4MGYpID09IDB4NTJmMCkKKwkJdHlwZSA9ICI4Mzk3N0VGIC8gU01TQyA5N3czNXgiOworCWVsc2UgaWYgKChpZCAmIH4weDBmKSA9PSAweDUyMTApCisJCXR5cGUgPSAiODM2MjciOworCWVsc2UgaWYgKChpZCAmIH4weDBmKSA9PSAweDYwMTApCisJCXR5cGUgPSAiODM2OTdIRiI7CisJZWxzZSBpZiAoKG9sZGlkICYgMHgwZikgPT0gMHgwYSkgeworCQl0eXBlID0gIjgzODc3RiI7CisJCXByb2dpZiA9IDE7CisJfSBlbHNlIGlmICgob2xkaWQgJiAweDBmKSA9PSAweDBiKSB7CisJCXR5cGUgPSAiODM4NzdBRiI7CisJCXByb2dpZiA9IDE7CisJfSBlbHNlIGlmICgob2xkaWQgJiAweDBmKSA9PSAweDBjKSB7CisJCXR5cGUgPSAiODM4NzdURiI7CisJCXByb2dpZiA9IDE7CisJfSBlbHNlIGlmICgob2xkaWQgJiAweDBmKSA9PSAweDBkKSB7CisJCXR5cGUgPSAiODM4NzdBVEYiOworCQlwcm9naWYgPSAxOworCX0gZWxzZQorCQlwcm9naWYgPSAwOwogCiAJaWYgKHZlcmJvc2VfcHJvYmluZykKIAkJcHJpbnRrKEtFUk5fSU5GTyAiV2luYm9uZCBjaGlwIGF0IEVGRVI9MHgleCBrZXk9MHglMDJ4ICIKLQkJICAgICAgICJkZXZpZD0lMDJ4IGRldnJldj0lMDJ4IG9sZGlkPSUwMnggdHlwZT0lc1xuIiwgCisJCSAgICAgICAiZGV2aWQ9JTAyeCBkZXZyZXY9JTAyeCBvbGRpZD0lMDJ4IHR5cGU9JXNcbiIsCiAJCSAgICAgICBlZmVyLCBrZXksIGRldmlkLCBkZXZyZXYsIG9sZGlkLCB0eXBlKTsKIAogCWlmIChwcm9naWYgPT0gMikKLQkJc2hvd19wYXJjb25maWdfd2luYm9uZChlZmVyLGtleSk7CisJCXNob3dfcGFyY29uZmlnX3dpbmJvbmQoZWZlciwga2V5KTsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGRlY29kZV9zbXNjKGludCBlZmVyLCBpbnQga2V5LCBpbnQgZGV2aWQsIGludCBkZXZyZXYpCiB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnR5cGUgPSAidW5rbm93biI7CisJY29uc3QgY2hhciAqdHlwZSA9ICJ1bmtub3duIjsKIAl2b2lkICgqZnVuYykoaW50IGlvLCBpbnQga2V5KTsKLSAgICAgICAgaW50IGlkOworCWludCBpZDsKIAotICAgICAgICBpZiAoZGV2aWQgPT0gZGV2cmV2KQorCWlmIChkZXZpZCA9PSBkZXZyZXYpCiAJCS8qIHNpbXBsZSBoZXVyaXN0aWNzLCB3ZSBoYXBwZW5lZCB0byByZWFkIHNvbWUKLSAgICAgICAgICAgICAgICAgICBub24tc21zYyByZWdpc3RlciAqLworCQkgICBub24tc21zYyByZWdpc3RlciAqLwogCQlyZXR1cm47CiAKLQlmdW5jPU5VTEw7Ci0gICAgICAgIGlkPShkZXZpZDw8OCkgfCBkZXZyZXY7CisJZnVuYyA9IE5VTEw7CisJaWQgPSAoZGV2aWQgPDwgOCkgfCBkZXZyZXY7CiAKLQlpZgkoaWQ9PTB4MDMwMikge3R5cGU9IjM3YzY2OSI7IGZ1bmM9c2hvd19wYXJjb25maWdfc21zYzM3YzY2OTt9Ci0JZWxzZSBpZgkoaWQ9PTB4NjU4MikgdHlwZT0iMzdjNjY1SVIiOwotCWVsc2UgaWYJKGRldmlkPT0weDY1KSB0eXBlPSIzN2M2NjVHVCI7Ci0JZWxzZSBpZgkoZGV2aWQ9PTB4NjYpIHR5cGU9IjM3YzY2NkdUIjsKKwlpZiAoaWQgPT0gMHgwMzAyKSB7CisJCXR5cGUgPSAiMzdjNjY5IjsKKwkJZnVuYyA9IHNob3dfcGFyY29uZmlnX3Ntc2MzN2M2Njk7CisJfSBlbHNlIGlmIChpZCA9PSAweDY1ODIpCisJCXR5cGUgPSAiMzdjNjY1SVIiOworCWVsc2UgaWYJKGRldmlkID09IDB4NjUpCisJCXR5cGUgPSAiMzdjNjY1R1QiOworCWVsc2UgaWYJKGRldmlkID09IDB4NjYpCisJCXR5cGUgPSAiMzdjNjY2R1QiOwogCiAJaWYgKHZlcmJvc2VfcHJvYmluZykKIAkJcHJpbnRrKEtFUk5fSU5GTyAiU01TQyBjaGlwIGF0IEVGRVI9MHgleCAiCkBAIC0xNDA3LDEzOCArMTQ2NSwxMzggQEAKIAkJICAgICAgIGVmZXIsIGtleSwgZGV2aWQsIGRldnJldiwgdHlwZSk7CiAKIAlpZiAoZnVuYykKLQkJZnVuYyhlZmVyLGtleSk7CisJCWZ1bmMoZWZlciwga2V5KTsKIH0KIAogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgd2luYm9uZF9jaGVjayhpbnQgaW8sIGludCBrZXkpCiB7Ci0JaW50IGRldmlkLGRldnJldixvbGRpZCx4X2RldmlkLHhfZGV2cmV2LHhfb2xkaWQ7CisJaW50IGRldmlkLCBkZXZyZXYsIG9sZGlkLCB4X2RldmlkLCB4X2RldnJldiwgeF9vbGRpZDsKIAogCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDMsIF9fZnVuY19fKSkKIAkJcmV0dXJuOwogCiAJLyogRmlyc3QgcHJvYmUgd2l0aG91dCBrZXkgKi8KLQlvdXRiKDB4MjAsaW8pOwotCXhfZGV2aWQ9aW5iKGlvKzEpOwotCW91dGIoMHgyMSxpbyk7Ci0JeF9kZXZyZXY9aW5iKGlvKzEpOwotCW91dGIoMHgwOSxpbyk7Ci0JeF9vbGRpZD1pbmIoaW8rMSk7CisJb3V0YigweDIwLCBpbyk7CisJeF9kZXZpZCA9IGluYihpbyArIDEpOworCW91dGIoMHgyMSwgaW8pOworCXhfZGV2cmV2ID0gaW5iKGlvICsgMSk7CisJb3V0YigweDA5LCBpbyk7CisJeF9vbGRpZCA9IGluYihpbyArIDEpOwogCi0Jb3V0YihrZXksaW8pOwotCW91dGIoa2V5LGlvKTsgICAgIC8qIFdyaXRlIE1hZ2ljIFNlcXVlbmNlIHRvIEVGRVIsIGV4dGVuZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bnRpb24gZW5hYmxlIHJlZ2lzdGVyICovCi0Jb3V0YigweDIwLGlvKTsgICAgLyogV3JpdGUgRUZJUiwgZXh0ZW5kZWQgZnVuY3Rpb24gaW5kZXggcmVnaXN0ZXIgKi8KLQlkZXZpZD1pbmIoaW8rMSk7ICAvKiBSZWFkIEVGRFIsIGV4dGVuZGVkIGZ1bmN0aW9uIGRhdGEgcmVnaXN0ZXIgKi8KLQlvdXRiKDB4MjEsaW8pOwotCWRldnJldj1pbmIoaW8rMSk7Ci0Jb3V0YigweDA5LGlvKTsKLQlvbGRpZD1pbmIoaW8rMSk7Ci0Jb3V0YigweGFhLGlvKTsgICAgLyogTWFnaWMgU2VhbCAqLworCW91dGIoa2V5LCBpbyk7CisJb3V0YihrZXksIGlvKTsgICAgIC8qIFdyaXRlIE1hZ2ljIFNlcXVlbmNlIHRvIEVGRVIsIGV4dGVuZGVkCisJCQkgICAgICBmdW50aW9uIGVuYWJsZSByZWdpc3RlciAqLworCW91dGIoMHgyMCwgaW8pOyAgICAvKiBXcml0ZSBFRklSLCBleHRlbmRlZCBmdW5jdGlvbiBpbmRleCByZWdpc3RlciAqLworCWRldmlkID0gaW5iKGlvICsgMSk7ICAvKiBSZWFkIEVGRFIsIGV4dGVuZGVkIGZ1bmN0aW9uIGRhdGEgcmVnaXN0ZXIgKi8KKwlvdXRiKDB4MjEsIGlvKTsKKwlkZXZyZXYgPSBpbmIoaW8gKyAxKTsKKwlvdXRiKDB4MDksIGlvKTsKKwlvbGRpZCA9IGluYihpbyArIDEpOworCW91dGIoMHhhYSwgaW8pOyAgICAvKiBNYWdpYyBTZWFsICovCiAKIAlpZiAoKHhfZGV2aWQgPT0gZGV2aWQpICYmICh4X2RldnJldiA9PSBkZXZyZXYpICYmICh4X29sZGlkID09IG9sZGlkKSkKIAkJZ290byBvdXQ7IC8qIHByb3RlY3Rpb24gYWdhaW5zdCBmYWxzZSBwb3NpdGl2ZXMgKi8KIAotCWRlY29kZV93aW5ib25kKGlvLGtleSxkZXZpZCxkZXZyZXYsb2xkaWQpOworCWRlY29kZV93aW5ib25kKGlvLCBrZXksIGRldmlkLCBkZXZyZXYsIG9sZGlkKTsKIG91dDoKIAlyZWxlYXNlX3JlZ2lvbihpbywgMyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCB3aW5ib25kX2NoZWNrMihpbnQgaW8saW50IGtleSkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB3aW5ib25kX2NoZWNrMihpbnQgaW8sIGludCBrZXkpCiB7Ci0gICAgICAgIGludCBkZXZpZCxkZXZyZXYsb2xkaWQseF9kZXZpZCx4X2RldnJldix4X29sZGlkOworCWludCBkZXZpZCwgZGV2cmV2LCBvbGRpZCwgeF9kZXZpZCwgeF9kZXZyZXYsIHhfb2xkaWQ7CiAKIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCAzLCBfX2Z1bmNfXykpCiAJCXJldHVybjsKIAogCS8qIEZpcnN0IHByb2JlIHdpdGhvdXQgdGhlIGtleSAqLwotCW91dGIoMHgyMCxpbysyKTsKLQl4X2RldmlkPWluYihpbysyKTsKLQlvdXRiKDB4MjEsaW8rMSk7Ci0JeF9kZXZyZXY9aW5iKGlvKzIpOwotCW91dGIoMHgwOSxpbysxKTsKLQl4X29sZGlkPWluYihpbysyKTsKKwlvdXRiKDB4MjAsIGlvICsgMik7CisJeF9kZXZpZCA9IGluYihpbyArIDIpOworCW91dGIoMHgyMSwgaW8gKyAxKTsKKwl4X2RldnJldiA9IGluYihpbyArIDIpOworCW91dGIoMHgwOSwgaW8gKyAxKTsKKwl4X29sZGlkID0gaW5iKGlvICsgMik7CiAKLSAgICAgICAgb3V0YihrZXksaW8pOyAgICAgLyogV3JpdGUgTWFnaWMgQnl0ZSB0byBFRkVSLCBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW50aW9uIGVuYWJsZSByZWdpc3RlciAqLwotICAgICAgICBvdXRiKDB4MjAsaW8rMik7ICAvKiBXcml0ZSBFRklSLCBleHRlbmRlZCBmdW5jdGlvbiBpbmRleCByZWdpc3RlciAqLwotICAgICAgICBkZXZpZD1pbmIoaW8rMik7ICAvKiBSZWFkIEVGRFIsIGV4dGVuZGVkIGZ1bmN0aW9uIGRhdGEgcmVnaXN0ZXIgKi8KLSAgICAgICAgb3V0YigweDIxLGlvKzEpOwotICAgICAgICBkZXZyZXY9aW5iKGlvKzIpOwotICAgICAgICBvdXRiKDB4MDksaW8rMSk7Ci0gICAgICAgIG9sZGlkPWluYihpbysyKTsKLSAgICAgICAgb3V0YigweGFhLGlvKTsgICAgLyogTWFnaWMgU2VhbCAqLworCW91dGIoa2V5LCBpbyk7ICAgICAvKiBXcml0ZSBNYWdpYyBCeXRlIHRvIEVGRVIsIGV4dGVuZGVkCisJCQkgICAgICBmdW50aW9uIGVuYWJsZSByZWdpc3RlciAqLworCW91dGIoMHgyMCwgaW8gKyAyKTsgIC8qIFdyaXRlIEVGSVIsIGV4dGVuZGVkIGZ1bmN0aW9uIGluZGV4IHJlZ2lzdGVyICovCisJZGV2aWQgPSBpbmIoaW8gKyAyKTsgIC8qIFJlYWQgRUZEUiwgZXh0ZW5kZWQgZnVuY3Rpb24gZGF0YSByZWdpc3RlciAqLworCW91dGIoMHgyMSwgaW8gKyAxKTsKKwlkZXZyZXYgPSBpbmIoaW8gKyAyKTsKKwlvdXRiKDB4MDksIGlvICsgMSk7CisJb2xkaWQgPSBpbmIoaW8gKyAyKTsKKwlvdXRiKDB4YWEsIGlvKTsgICAgLyogTWFnaWMgU2VhbCAqLwogCi0JaWYgKCh4X2RldmlkID09IGRldmlkKSAmJiAoeF9kZXZyZXYgPT0gZGV2cmV2KSAmJiAoeF9vbGRpZCA9PSBvbGRpZCkpCisJaWYgKHhfZGV2aWQgPT0gZGV2aWQgJiYgeF9kZXZyZXYgPT0gZGV2cmV2ICYmIHhfb2xkaWQgPT0gb2xkaWQpCiAJCWdvdG8gb3V0OyAvKiBwcm90ZWN0aW9uIGFnYWluc3QgZmFsc2UgcG9zaXRpdmVzICovCiAKLQlkZWNvZGVfd2luYm9uZChpbyxrZXksZGV2aWQsZGV2cmV2LG9sZGlkKTsKKwlkZWNvZGVfd2luYm9uZChpbywga2V5LCBkZXZpZCwgZGV2cmV2LCBvbGRpZCk7CiBvdXQ6CiAJcmVsZWFzZV9yZWdpb24oaW8sIDMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgc21zY19jaGVjayhpbnQgaW8sIGludCBrZXkpCiB7Ci0gICAgICAgIGludCBpZCxyZXYsb2xkaWQsb2xkcmV2LHhfaWQseF9yZXYseF9vbGRpZCx4X29sZHJldjsKKwlpbnQgaWQsIHJldiwgb2xkaWQsIG9sZHJldiwgeF9pZCwgeF9yZXYsIHhfb2xkaWQsIHhfb2xkcmV2OwogCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMywgX19mdW5jX18pKQogCQlyZXR1cm47CiAKIAkvKiBGaXJzdCBwcm9iZSB3aXRob3V0IHRoZSBrZXkgKi8KLQlvdXRiKDB4MGQsaW8pOwotCXhfb2xkaWQ9aW5iKGlvKzEpOwotCW91dGIoMHgwZSxpbyk7Ci0JeF9vbGRyZXY9aW5iKGlvKzEpOwotCW91dGIoMHgyMCxpbyk7Ci0JeF9pZD1pbmIoaW8rMSk7Ci0Jb3V0YigweDIxLGlvKTsKLQl4X3Jldj1pbmIoaW8rMSk7CisJb3V0YigweDBkLCBpbyk7CisJeF9vbGRpZCA9IGluYihpbyArIDEpOworCW91dGIoMHgwZSwgaW8pOworCXhfb2xkcmV2ID0gaW5iKGlvICsgMSk7CisJb3V0YigweDIwLCBpbyk7CisJeF9pZCA9IGluYihpbyArIDEpOworCW91dGIoMHgyMSwgaW8pOworCXhfcmV2ID0gaW5iKGlvICsgMSk7CiAKLSAgICAgICAgb3V0YihrZXksaW8pOwotICAgICAgICBvdXRiKGtleSxpbyk7ICAgICAvKiBXcml0ZSBNYWdpYyBTZXF1ZW5jZSB0byBFRkVSLCBleHRlbmRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW50aW9uIGVuYWJsZSByZWdpc3RlciAqLwotICAgICAgICBvdXRiKDB4MGQsaW8pOyAgICAvKiBXcml0ZSBFRklSLCBleHRlbmRlZCBmdW5jdGlvbiBpbmRleCByZWdpc3RlciAqLwotICAgICAgICBvbGRpZD1pbmIoaW8rMSk7ICAvKiBSZWFkIEVGRFIsIGV4dGVuZGVkIGZ1bmN0aW9uIGRhdGEgcmVnaXN0ZXIgKi8KLSAgICAgICAgb3V0YigweDBlLGlvKTsKLSAgICAgICAgb2xkcmV2PWluYihpbysxKTsKLQlvdXRiKDB4MjAsaW8pOwotCWlkPWluYihpbysxKTsKLQlvdXRiKDB4MjEsaW8pOwotCXJldj1pbmIoaW8rMSk7Ci0gICAgICAgIG91dGIoMHhhYSxpbyk7ICAgIC8qIE1hZ2ljIFNlYWwgKi8KKwlvdXRiKGtleSwgaW8pOworCW91dGIoa2V5LCBpbyk7ICAgICAvKiBXcml0ZSBNYWdpYyBTZXF1ZW5jZSB0byBFRkVSLCBleHRlbmRlZAorCQkJICAgICAgZnVudGlvbiBlbmFibGUgcmVnaXN0ZXIgKi8KKwlvdXRiKDB4MGQsIGlvKTsgICAgLyogV3JpdGUgRUZJUiwgZXh0ZW5kZWQgZnVuY3Rpb24gaW5kZXggcmVnaXN0ZXIgKi8KKwlvbGRpZCA9IGluYihpbyArIDEpOyAgLyogUmVhZCBFRkRSLCBleHRlbmRlZCBmdW5jdGlvbiBkYXRhIHJlZ2lzdGVyICovCisJb3V0YigweDBlLCBpbyk7CisJb2xkcmV2ID0gaW5iKGlvICsgMSk7CisJb3V0YigweDIwLCBpbyk7CisJaWQgPSBpbmIoaW8gKyAxKTsKKwlvdXRiKDB4MjEsIGlvKTsKKwlyZXYgPSBpbmIoaW8gKyAxKTsKKwlvdXRiKDB4YWEsIGlvKTsgICAgLyogTWFnaWMgU2VhbCAqLwogCi0JaWYgKCh4X2lkID09IGlkKSAmJiAoeF9vbGRyZXYgPT0gb2xkcmV2KSAmJgotCSAgICAoeF9vbGRpZCA9PSBvbGRpZCkgJiYgKHhfcmV2ID09IHJldikpCisJaWYgKHhfaWQgPT0gaWQgJiYgeF9vbGRyZXYgPT0gb2xkcmV2ICYmCisJICAgIHhfb2xkaWQgPT0gb2xkaWQgJiYgeF9yZXYgPT0gcmV2KQogCQlnb3RvIG91dDsgLyogcHJvdGVjdGlvbiBhZ2FpbnN0IGZhbHNlIHBvc2l0aXZlcyAqLwogCi0gICAgICAgIGRlY29kZV9zbXNjKGlvLGtleSxvbGRpZCxvbGRyZXYpOworCWRlY29kZV9zbXNjKGlvLCBrZXksIG9sZGlkLCBvbGRyZXYpOwogb3V0OgogCXJlbGVhc2VfcmVnaW9uKGlvLCAzKTsKIH0KIAogCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgZGV0ZWN0X2FuZF9yZXBvcnRfd2luYm9uZCAodm9pZCkKLXsgCitzdGF0aWMgdm9pZCBfX2RldmluaXQgZGV0ZWN0X2FuZF9yZXBvcnRfd2luYm9uZCh2b2lkKQorewogCWlmICh2ZXJib3NlX3Byb2JpbmcpCiAJCXByaW50ayhLRVJOX0RFQlVHICJXaW5ib25kIFN1cGVyLUlPIGRldGVjdGlvbiwgbm93IHRlc3RpbmcgcG9ydHMgM0YwLDM3MCwyNTAsNEUsMkUgLi4uXG4iKTsKLQl3aW5ib25kX2NoZWNrKDB4M2YwLDB4ODcpOwotCXdpbmJvbmRfY2hlY2soMHgzNzAsMHg4Nyk7Ci0Jd2luYm9uZF9jaGVjaygweDJlICwweDg3KTsKLQl3aW5ib25kX2NoZWNrKDB4NGUgLDB4ODcpOwotCXdpbmJvbmRfY2hlY2soMHgzZjAsMHg4Nik7Ci0Jd2luYm9uZF9jaGVjazIoMHgyNTAsMHg4OCk7IAotCXdpbmJvbmRfY2hlY2syKDB4MjUwLDB4ODkpOworCXdpbmJvbmRfY2hlY2soMHgzZjAsIDB4ODcpOworCXdpbmJvbmRfY2hlY2soMHgzNzAsIDB4ODcpOworCXdpbmJvbmRfY2hlY2soMHgyZSAsIDB4ODcpOworCXdpbmJvbmRfY2hlY2soMHg0ZSAsIDB4ODcpOworCXdpbmJvbmRfY2hlY2soMHgzZjAsIDB4ODYpOworCXdpbmJvbmRfY2hlY2syKDB4MjUwLCAweDg4KTsKKwl3aW5ib25kX2NoZWNrMigweDI1MCwgMHg4OSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBkZXRlY3RfYW5kX3JlcG9ydF9zbXNjICh2b2lkKQorc3RhdGljIHZvaWQgX19kZXZpbml0IGRldGVjdF9hbmRfcmVwb3J0X3Ntc2Modm9pZCkKIHsKIAlpZiAodmVyYm9zZV9wcm9iaW5nKQogCQlwcmludGsoS0VSTl9ERUJVRyAiU01TQyBTdXBlci1JTyBkZXRlY3Rpb24sIG5vdyB0ZXN0aW5nIFBvcnRzIDJGMCwgMzcwIC4uLlxuIik7Ci0Jc21zY19jaGVjaygweDNmMCwweDU1KTsKLQlzbXNjX2NoZWNrKDB4MzcwLDB4NTUpOwotCXNtc2NfY2hlY2soMHgzZjAsMHg0NCk7Ci0Jc21zY19jaGVjaygweDM3MCwweDQ0KTsKKwlzbXNjX2NoZWNrKDB4M2YwLCAweDU1KTsKKwlzbXNjX2NoZWNrKDB4MzcwLCAweDU1KTsKKwlzbXNjX2NoZWNrKDB4M2YwLCAweDQ0KTsKKwlzbXNjX2NoZWNrKDB4MzcwLCAweDQ0KTsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZpbml0IGRldGVjdF9hbmRfcmVwb3J0X2l0ODcodm9pZCkKQEAgLTE1NzMsMzQgKzE2MzEsMzkgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUEFSUE9SVF9QQ19TVVBFUklPICovCiAKLXN0YXRpYyBpbnQgZ2V0X3N1cGVyaW9fZG1hIChzdHJ1Y3QgcGFycG9ydCAqcCkKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJpb19zdHJ1Y3QgKmZpbmRfc3VwZXJpbyhzdHJ1Y3QgcGFycG9ydCAqcCkKIHsKLQlpbnQgaT0wOwotCXdoaWxlKCAoc3VwZXJpb3NbaV0uaW8gIT0gcC0+YmFzZSkgJiYgKGk8TlJfU1VQRVJJT1MpKQotCQlpKys7Ci0JaWYgKGkhPU5SX1NVUEVSSU9TKQotCQlyZXR1cm4gc3VwZXJpb3NbaV0uZG1hOworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBOUl9TVVBFUklPUzsgaSsrKQorCQlpZiAoc3VwZXJpb3NbaV0uaW8gIT0gcC0+YmFzZSkKKwkJCXJldHVybiAmc3VwZXJpb3NbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3N1cGVyaW9fZG1hKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBzdXBlcmlvX3N0cnVjdCAqcyA9IGZpbmRfc3VwZXJpbyhwKTsKKwlpZiAocykKKwkJcmV0dXJuIHMtPmRtYTsKIAlyZXR1cm4gUEFSUE9SVF9ETUFfTk9ORTsKIH0KIAotc3RhdGljIGludCBnZXRfc3VwZXJpb19pcnEgKHN0cnVjdCBwYXJwb3J0ICpwKQorc3RhdGljIGludCBnZXRfc3VwZXJpb19pcnEoc3RydWN0IHBhcnBvcnQgKnApCiB7Ci0JaW50IGk9MDsKLSAgICAgICAgd2hpbGUoIChzdXBlcmlvc1tpXS5pbyAhPSBwLT5iYXNlKSAmJiAoaTxOUl9TVVBFUklPUykpCi0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICBpZiAoaSE9TlJfU1VQRVJJT1MpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyaW9zW2ldLmlycTsKLSAgICAgICAgcmV0dXJuIFBBUlBPUlRfSVJRX05PTkU7CisJc3RydWN0IHN1cGVyaW9fc3RydWN0ICpzID0gZmluZF9zdXBlcmlvKHApOworCWlmIChzKQorCQlyZXR1cm4gcy0+aXJxOworCXJldHVybiBQQVJQT1JUX0lSUV9OT05FOwogfQotCQorCiAKIC8qIC0tLSBNb2RlIGRldGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qCiAgKiBDaGVja3MgZm9yIHBvcnQgZXhpc3RlbmNlLCBhbGwgcG9ydHMgc3VwcG9ydCBTUFAgTU9ERQotICogUmV0dXJuczogCisgKiBSZXR1cm5zOgogICogICAgICAgICAwICAgICAgICAgICA6ICBObyBwYXJhbGxlbCBwb3J0IGF0IHRoaXMgYWRkcmVzcwotICogIFBBUlBPUlRfTU9ERV9QQ1NQUCA6ICBTUFAgcG9ydCBkZXRlY3RlZCAKKyAqICBQQVJQT1JUX01PREVfUENTUFAgOiAgU1BQIHBvcnQgZGV0ZWN0ZWQKICAqICAgICAgICAgICAgICAgICAgICAgICAgKGlmIHRoZSB1c2VyIHNwZWNpZmllZCBhbiBpb3BvcnQgaGltc2VsZiwKICAqICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2hhbGwgYWx3YXlzIGJlIHRoZSBjYXNlISkKICAqCkBAIC0xNjEwLDcgKzE2NzMsNyBAQAogCXVuc2lnbmVkIGNoYXIgciwgdzsKIAogCS8qCi0JICogZmlyc3QgY2xlYXIgYW4gZXZlbnR1YWxseSBwZW5kaW5nIEVQUCB0aW1lb3V0IAorCSAqIGZpcnN0IGNsZWFyIGFuIGV2ZW50dWFsbHkgcGVuZGluZyBFUFAgdGltZW91dAogCSAqIEkgKHNhaWxlckBpZmUuZWUuZXRoei5jaCkgaGF2ZSBhbiBTTVNDIGNoaXBzZXQKIAkgKiB0aGF0IGRvZXMgbm90IGV2ZW4gcmVzcG9uZCB0byBTUFAgY3ljbGVzIGlmIGFuIEVQUAogCSAqIHRpbWVvdXQgaXMgcGVuZGluZwpAQCAtMTYxOSwxOSArMTY4MiwxOSBAQAogCiAJLyogRG8gYSBzaW1wbGUgcmVhZC13cml0ZSB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGUgcG9ydCBleGlzdHMuICovCiAJdyA9IDB4YzsKLQlvdXRiICh3LCBDT05UUk9MIChwYikpOworCW91dGIodywgQ09OVFJPTChwYikpOwogCiAJLyogSXMgdGhlcmUgYSBjb250cm9sIHJlZ2lzdGVyIHRoYXQgd2UgY2FuIHJlYWQgZnJvbT8gIFNvbWUKIAkgKiBwb3J0cyBkb24ndCBhbGxvdyByZWFkcywgc28gcmVhZF9jb250cm9sIGp1c3QgcmV0dXJucyBhCiAJICogc29mdHdhcmUgY29weS4gU29tZSBwb3J0cyBfZG9fIGFsbG93IHJlYWRzLCBzbyBieXBhc3MgdGhlCiAJICogc29mdHdhcmUgY29weSBoZXJlLiAgSW4gYWRkaXRpb24sIHNvbWUgYml0cyBhcmVuJ3QKIAkgKiB3cml0YWJsZS4gKi8KLQlyID0gaW5iIChDT05UUk9MIChwYikpOworCXIgPSBpbmIoQ09OVFJPTChwYikpOwogCWlmICgociAmIDB4ZikgPT0gdykgewogCQl3ID0gMHhlOwotCQlvdXRiICh3LCBDT05UUk9MIChwYikpOwotCQlyID0gaW5iIChDT05UUk9MIChwYikpOwotCQlvdXRiICgweGMsIENPTlRST0wgKHBiKSk7CisJCW91dGIodywgQ09OVFJPTChwYikpOworCQlyID0gaW5iKENPTlRST0wocGIpKTsKKwkJb3V0YigweGMsIENPTlRST0wocGIpKTsKIAkJaWYgKChyICYgMHhmKSA9PSB3KQogCQkJcmV0dXJuIFBBUlBPUlRfTU9ERV9QQ1NQUDsKIAl9CkBAIC0xNjM5LDE4ICsxNzAyLDE4IEBACiAJaWYgKHVzZXJfc3BlY2lmaWVkKQogCQkvKiBUaGF0IGRpZG4ndCB3b3JrLCBidXQgdGhlIHVzZXIgdGhpbmtzIHRoZXJlJ3MgYQogCQkgKiBwb3J0IGhlcmUuICovCi0JCXByaW50ayAoS0VSTl9JTkZPICJwYXJwb3J0IDB4JWx4IChXQVJOSU5HKTogQ1RSOiAiCisJCXByaW50ayhLRVJOX0lORk8gInBhcnBvcnQgMHglbHggKFdBUk5JTkcpOiBDVFI6ICIKIAkJCSJ3cm90ZSAweCUwMngsIHJlYWQgMHglMDJ4XG4iLCBwYi0+YmFzZSwgdywgcik7CiAKIAkvKiBUcnkgdGhlIGRhdGEgcmVnaXN0ZXIuICBUaGUgZGF0YSBsaW5lcyBhcmVuJ3QgdHJpLXN0YXRlZCBhdAogCSAqIHRoaXMgc3RhZ2UsIHNvIHdlIGV4cGVjdCBiYWNrIHdoYXQgd2Ugd3JvdGUuICovCiAJdyA9IDB4YWE7Ci0JcGFycG9ydF9wY193cml0ZV9kYXRhIChwYiwgdyk7Ci0JciA9IHBhcnBvcnRfcGNfcmVhZF9kYXRhIChwYik7CisJcGFycG9ydF9wY193cml0ZV9kYXRhKHBiLCB3KTsKKwlyID0gcGFycG9ydF9wY19yZWFkX2RhdGEocGIpOwogCWlmIChyID09IHcpIHsKIAkJdyA9IDB4NTU7Ci0JCXBhcnBvcnRfcGNfd3JpdGVfZGF0YSAocGIsIHcpOwotCQlyID0gcGFycG9ydF9wY19yZWFkX2RhdGEgKHBiKTsKKwkJcGFycG9ydF9wY193cml0ZV9kYXRhKHBiLCB3KTsKKwkJciA9IHBhcnBvcnRfcGNfcmVhZF9kYXRhKHBiKTsKIAkJaWYgKHIgPT0gdykKIAkJCXJldHVybiBQQVJQT1JUX01PREVfUENTUFA7CiAJfQpAQCAtMTY1OCw5ICsxNzIxLDkgQEAKIAlpZiAodXNlcl9zcGVjaWZpZWQpIHsKIAkJLyogRGlkbid0IHdvcmssIGJ1dCB0aGUgdXNlciBpcyBjb252aW5jZWQgdGhpcyBpcyB0aGUKIAkJICogcGxhY2UuICovCi0JCXByaW50ayAoS0VSTl9JTkZPICJwYXJwb3J0IDB4JWx4IChXQVJOSU5HKTogREFUQTogIgorCQlwcmludGsoS0VSTl9JTkZPICJwYXJwb3J0IDB4JWx4IChXQVJOSU5HKTogREFUQTogIgogCQkJIndyb3RlIDB4JTAyeCwgcmVhZCAweCUwMnhcbiIsIHBiLT5iYXNlLCB3LCByKTsKLQkJcHJpbnRrIChLRVJOX0lORk8gInBhcnBvcnQgMHglbHg6IFlvdSBnYXZlIHRoaXMgYWRkcmVzcywgIgorCQlwcmludGsoS0VSTl9JTkZPICJwYXJwb3J0IDB4JWx4OiBZb3UgZ2F2ZSB0aGlzIGFkZHJlc3MsICIKIAkJCSJidXQgdGhlcmUgaXMgcHJvYmFibHkgbm8gcGFyYWxsZWwgcG9ydCB0aGVyZSFcbiIsCiAJCQlwYi0+YmFzZSk7CiAJfQpAQCAtMTY5MSwzMyArMTc1NCwzMyBAQAogCXN0cnVjdCBwYXJwb3J0X3BjX3ByaXZhdGUgKnByaXYgPSBwYi0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGNoYXIgciA9IDB4YzsKIAotCW91dGIgKHIsIENPTlRST0wgKHBiKSk7Ci0JaWYgKChpbmIgKEVDT05UUk9MIChwYikpICYgMHgzKSA9PSAociAmIDB4MykpIHsKLQkJb3V0YiAociBeIDB4MiwgQ09OVFJPTCAocGIpKTsgLyogVG9nZ2xlIGJpdCAxICovCisJb3V0YihyLCBDT05UUk9MKHBiKSk7CisJaWYgKChpbmIoRUNPTlRST0wocGIpKSAmIDB4MykgPT0gKHIgJiAweDMpKSB7CisJCW91dGIociBeIDB4MiwgQ09OVFJPTChwYikpOyAvKiBUb2dnbGUgYml0IDEgKi8KIAotCQlyID0gaW5iIChDT05UUk9MIChwYikpOwotCQlpZiAoKGluYiAoRUNPTlRST0wgKHBiKSkgJiAweDIpID09IChyICYgMHgyKSkKKwkJciA9IGluYihDT05UUk9MKHBiKSk7CisJCWlmICgoaW5iKEVDT05UUk9MKHBiKSkgJiAweDIpID09IChyICYgMHgyKSkKIAkJCWdvdG8gbm9fcmVnOyAvKiBTdXJlIHRoYXQgbm8gRUNSIHJlZ2lzdGVyIGV4aXN0cyAqLwogCX0KLQkKLQlpZiAoKGluYiAoRUNPTlRST0wgKHBiKSkgJiAweDMgKSAhPSAweDEpCisKKwlpZiAoKGluYihFQ09OVFJPTChwYikpICYgMHgzKSAhPSAweDEpCiAJCWdvdG8gbm9fcmVnOwogCi0JRUNSX1dSSVRFIChwYiwgMHgzNCk7Ci0JaWYgKGluYiAoRUNPTlRST0wgKHBiKSkgIT0gMHgzNSkKKwlFQ1JfV1JJVEUocGIsIDB4MzQpOworCWlmIChpbmIoRUNPTlRST0wocGIpKSAhPSAweDM1KQogCQlnb3RvIG5vX3JlZzsKIAogCXByaXYtPmVjciA9IDE7Ci0Jb3V0YiAoMHhjLCBDT05UUk9MIChwYikpOwotCQorCW91dGIoMHhjLCBDT05UUk9MKHBiKSk7CisKIAkvKiBHbyB0byBtb2RlIDAwMCAqLwotCWZyb2Jfc2V0X21vZGUgKHBiLCBFQ1JfU1BQKTsKKwlmcm9iX3NldF9tb2RlKHBiLCBFQ1JfU1BQKTsKIAogCXJldHVybiAxOwogCiAgbm9fcmVnOgotCW91dGIgKDB4YywgQ09OVFJPTCAocGIpKTsKLQlyZXR1cm4gMDsgCisJb3V0YigweGMsIENPTlRST0wocGIpKTsKKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19QQVJQT1JUXzEyODQKQEAgLTE3MjcsNyArMTc5MCw3IEBACiAgKiBhbGxvd3MgdXMgdG8gcmVhZCBkYXRhIGZyb20gdGhlIGRhdGEgbGluZXMuICBJbiB0aGVvcnkgd2Ugd291bGQgZ2V0IGJhY2sKICAqIDB4ZmYgYnV0IGFueSBwZXJpcGhlcmFsIGF0dGFjaGVkIHRvIHRoZSBwb3J0IG1heSBkcmFnIHNvbWUgb3IgYWxsIG9mIHRoZQogICogbGluZXMgZG93biB0byB6ZXJvLiAgU28gaWYgd2UgZ2V0IGJhY2sgYW55dGhpbmcgdGhhdCBpc24ndCB0aGUgY29udGVudHMKLSAqIG9mIHRoZSBkYXRhIHJlZ2lzdGVyIHdlIGRlZW0gUFMvMiBzdXBwb3J0IHRvIGJlIHByZXNlbnQuIAorICogb2YgdGhlIGRhdGEgcmVnaXN0ZXIgd2UgZGVlbSBQUy8yIHN1cHBvcnQgdG8gYmUgcHJlc2VudC4KICAqCiAgKiBTb21lIFNQUCBwb3J0cyBoYXZlICJoYWxmIFBTLzIiIGFiaWxpdHkgLSB5b3UgY2FuJ3QgdHVybiBvZmYgdGhlIGxpbmUKICAqIGRyaXZlcnMsIGJ1dCBhbiBleHRlcm5hbCBwZXJpcGhlcmFsIHdpdGggc3VmZmljaWVudGx5IGJlZWZ5IGRyaXZlcnMgb2YKQEAgLTE3MzUsMjYgKzE3OTgsMjggQEAKICAqIHdoZXJlIHRoZXkgY2FuIHRoZW4gYmUgcmVhZCBiYWNrIGFzIG5vcm1hbC4gIFBvcnRzIHdpdGggdGhpcyBwcm9wZXJ0eQogICogYW5kIHRoZSByaWdodCB0eXBlIG9mIGRldmljZSBhdHRhY2hlZCBhcmUgbGlrZWx5IHRvIGZhaWwgdGhlIFNQUCB0ZXN0LAogICogKGFzIHRoZXkgd2lsbCBhcHBlYXIgdG8gaGF2ZSBzdHVjayBiaXRzKSBhbmQgc28gdGhlIGZhY3QgdGhhdCB0aGV5IG1pZ2h0Ci0gKiBiZSBtaXNkZXRlY3RlZCBoZXJlIGlzIHJhdGhlciBhY2FkZW1pYy4gCisgKiBiZSBtaXNkZXRlY3RlZCBoZXJlIGlzIHJhdGhlciBhY2FkZW1pYy4KICAqLwogCiBzdGF0aWMgaW50IHBhcnBvcnRfUFMyX3N1cHBvcnRlZChzdHJ1Y3QgcGFycG9ydCAqcGIpCiB7CiAJaW50IG9rID0gMDsKLSAgCisKIAljbGVhcl9lcHBfdGltZW91dChwYik7CiAKIAkvKiB0cnkgdG8gdHJpLXN0YXRlIHRoZSBidWZmZXIgKi8KLQlwYXJwb3J0X3BjX2RhdGFfcmV2ZXJzZSAocGIpOwotCQorCXBhcnBvcnRfcGNfZGF0YV9yZXZlcnNlKHBiKTsKKwogCXBhcnBvcnRfcGNfd3JpdGVfZGF0YShwYiwgMHg1NSk7Ci0JaWYgKHBhcnBvcnRfcGNfcmVhZF9kYXRhKHBiKSAhPSAweDU1KSBvaysrOworCWlmIChwYXJwb3J0X3BjX3JlYWRfZGF0YShwYikgIT0gMHg1NSkKKwkJb2srKzsKIAogCXBhcnBvcnRfcGNfd3JpdGVfZGF0YShwYiwgMHhhYSk7Ci0JaWYgKHBhcnBvcnRfcGNfcmVhZF9kYXRhKHBiKSAhPSAweGFhKSBvaysrOworCWlmIChwYXJwb3J0X3BjX3JlYWRfZGF0YShwYikgIT0gMHhhYSkKKwkJb2srKzsKIAogCS8qIGNhbmNlbCBpbnB1dCBtb2RlICovCi0JcGFycG9ydF9wY19kYXRhX2ZvcndhcmQgKHBiKTsKKwlwYXJwb3J0X3BjX2RhdGFfZm9yd2FyZChwYik7CiAKIAlpZiAob2spIHsKIAkJcGItPm1vZGVzIHw9IFBBUlBPUlRfTU9ERV9UUklTVEFURTsKQEAgLTE3NzMsNjggKzE4MzgsNjggQEAKIAlpbnQgY29uZmlnLCBjb25maWdiOwogCWludCBwd29yZDsKIAlzdHJ1Y3QgcGFycG9ydF9wY19wcml2YXRlICpwcml2ID0gcGItPnByaXZhdGVfZGF0YTsKLQkvKiBUcmFuc2xhdGUgRUNQIGludHJMaW5lIHRvIElTQSBpcnEgdmFsdWUgKi8JCi0Jc3RhdGljIGNvbnN0IGludCBpbnRybGluZVtdPSB7IDAsIDcsIDksIDEwLCAxMSwgMTQsIDE1LCA1IH07IAorCS8qIFRyYW5zbGF0ZSBFQ1AgaW50ckxpbmUgdG8gSVNBIGlycSB2YWx1ZSAqLworCXN0YXRpYyBjb25zdCBpbnQgaW50cmxpbmVbXSA9IHsgMCwgNywgOSwgMTAsIDExLCAxNCwgMTUsIDUgfTsKIAogCS8qIElmIHRoZXJlIGlzIG5vIEVDUiwgd2UgaGF2ZSBubyBob3BlIG9mIHN1cHBvcnRpbmcgRUNQLiAqLwogCWlmICghcHJpdi0+ZWNyKQogCQlyZXR1cm4gMDsKIAogCS8qIEZpbmQgb3V0IEZJRk8gZGVwdGggKi8KLQlFQ1JfV1JJVEUgKHBiLCBFQ1JfU1BQIDw8IDUpOyAvKiBSZXNldCBGSUZPICovCi0JRUNSX1dSSVRFIChwYiwgRUNSX1RTVCA8PCA1KTsgLyogVEVTVCBGSUZPICovCi0JZm9yIChpPTA7IGkgPCAxMDI0ICYmICEoaW5iIChFQ09OVFJPTCAocGIpKSAmIDB4MDIpOyBpKyspCi0JCW91dGIgKDB4YWEsIEZJRk8gKHBiKSk7CisJRUNSX1dSSVRFKHBiLCBFQ1JfU1BQIDw8IDUpOyAvKiBSZXNldCBGSUZPICovCisJRUNSX1dSSVRFKHBiLCBFQ1JfVFNUIDw8IDUpOyAvKiBURVNUIEZJRk8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAyNCAmJiAhKGluYihFQ09OVFJPTChwYikpICYgMHgwMik7IGkrKykKKwkJb3V0YigweGFhLCBGSUZPKHBiKSk7CiAKIAkvKgogCSAqIFVzaW5nIExHUyBjaGlwc2V0IGl0IHVzZXMgRUNSIHJlZ2lzdGVyLCBidXQKIAkgKiBpdCBkb2Vzbid0IHN1cHBvcnQgRUNQIG9yIEZJRk8gTU9ERQogCSAqLwogCWlmIChpID09IDEwMjQpIHsKLQkJRUNSX1dSSVRFIChwYiwgRUNSX1NQUCA8PCA1KTsKKwkJRUNSX1dSSVRFKHBiLCBFQ1JfU1BQIDw8IDUpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlwcml2LT5maWZvX2RlcHRoID0gaTsKIAlpZiAodmVyYm9zZV9wcm9iaW5nKQotCQlwcmludGsgKEtFUk5fREVCVUcgIjB4JWx4OiBGSUZPIGlzICVkIGJ5dGVzXG4iLCBwYi0+YmFzZSwgaSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIweCVseDogRklGTyBpcyAlZCBieXRlc1xuIiwgcGItPmJhc2UsIGkpOwogCiAJLyogRmluZCBvdXQgd3JpdGVJbnRyVGhyZXNob2xkICovCi0JZnJvYl9lY29udHJvbCAocGIsIDE8PDIsIDE8PDIpOwotCWZyb2JfZWNvbnRyb2wgKHBiLCAxPDwyLCAwKTsKKwlmcm9iX2Vjb250cm9sKHBiLCAxPDwyLCAxPDwyKTsKKwlmcm9iX2Vjb250cm9sKHBiLCAxPDwyLCAwKTsKIAlmb3IgKGkgPSAxOyBpIDw9IHByaXYtPmZpZm9fZGVwdGg7IGkrKykgewotCQlpbmIgKEZJRk8gKHBiKSk7Ci0JCXVkZWxheSAoNTApOwotCQlpZiAoaW5iIChFQ09OVFJPTCAocGIpKSAmICgxPDwyKSkKKwkJaW5iKEZJRk8ocGIpKTsKKwkJdWRlbGF5KDUwKTsKKwkJaWYgKGluYihFQ09OVFJPTChwYikpICYgKDE8PDIpKQogCQkJYnJlYWs7CiAJfQogCiAJaWYgKGkgPD0gcHJpdi0+Zmlmb19kZXB0aCkgewogCQlpZiAodmVyYm9zZV9wcm9iaW5nKQotCQkJcHJpbnRrIChLRVJOX0RFQlVHICIweCVseDogd3JpdGVJbnRyVGhyZXNob2xkIGlzICVkXG4iLAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JWx4OiB3cml0ZUludHJUaHJlc2hvbGQgaXMgJWRcbiIsCiAJCQkJcGItPmJhc2UsIGkpOwogCX0gZWxzZQogCQkvKiBOdW1iZXIgb2YgYnl0ZXMgd2Uga25vdyB3ZSBjYW4gd3JpdGUgaWYgd2UgZ2V0IGFuCi0gICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LiAqLworCQkgICBpbnRlcnJ1cHQuICovCiAJCWkgPSAwOwogCiAJcHJpdi0+d3JpdGVJbnRyVGhyZXNob2xkID0gaTsKIAogCS8qIEZpbmQgb3V0IHJlYWRJbnRyVGhyZXNob2xkICovCi0JZnJvYl9zZXRfbW9kZSAocGIsIEVDUl9QUzIpOyAvKiBSZXNldCBGSUZPIGFuZCBlbmFibGUgUFMyICovCi0JcGFycG9ydF9wY19kYXRhX3JldmVyc2UgKHBiKTsgLyogTXVzdCBiZSBpbiBQUzIgbW9kZSAqLwotCWZyb2Jfc2V0X21vZGUgKHBiLCBFQ1JfVFNUKTsgLyogVGVzdCBGSUZPICovCi0JZnJvYl9lY29udHJvbCAocGIsIDE8PDIsIDE8PDIpOwotCWZyb2JfZWNvbnRyb2wgKHBiLCAxPDwyLCAwKTsKKwlmcm9iX3NldF9tb2RlKHBiLCBFQ1JfUFMyKTsgLyogUmVzZXQgRklGTyBhbmQgZW5hYmxlIFBTMiAqLworCXBhcnBvcnRfcGNfZGF0YV9yZXZlcnNlKHBiKTsgLyogTXVzdCBiZSBpbiBQUzIgbW9kZSAqLworCWZyb2Jfc2V0X21vZGUocGIsIEVDUl9UU1QpOyAvKiBUZXN0IEZJRk8gKi8KKwlmcm9iX2Vjb250cm9sKHBiLCAxPDwyLCAxPDwyKTsKKwlmcm9iX2Vjb250cm9sKHBiLCAxPDwyLCAwKTsKIAlmb3IgKGkgPSAxOyBpIDw9IHByaXYtPmZpZm9fZGVwdGg7IGkrKykgewotCQlvdXRiICgweGFhLCBGSUZPIChwYikpOwotCQlpZiAoaW5iIChFQ09OVFJPTCAocGIpKSAmICgxPDwyKSkKKwkJb3V0YigweGFhLCBGSUZPKHBiKSk7CisJCWlmIChpbmIoRUNPTlRST0wocGIpKSAmICgxPDwyKSkKIAkJCWJyZWFrOwogCX0KIAogCWlmIChpIDw9IHByaXYtPmZpZm9fZGVwdGgpIHsKIAkJaWYgKHZlcmJvc2VfcHJvYmluZykKLQkJCXByaW50ayAoS0VSTl9JTkZPICIweCVseDogcmVhZEludHJUaHJlc2hvbGQgaXMgJWRcbiIsCisJCQlwcmludGsoS0VSTl9JTkZPICIweCVseDogcmVhZEludHJUaHJlc2hvbGQgaXMgJWRcbiIsCiAJCQkJcGItPmJhc2UsIGkpOwogCX0gZWxzZQogCQkvKiBOdW1iZXIgb2YgYnl0ZXMgd2UgY2FuIHJlYWQgaWYgd2UgZ2V0IGFuIGludGVycnVwdC4gKi8KQEAgLTE4NDIsMjMgKzE5MDcsMjMgQEAKIAogCXByaXYtPnJlYWRJbnRyVGhyZXNob2xkID0gaTsKIAotCUVDUl9XUklURSAocGIsIEVDUl9TUFAgPDwgNSk7IC8qIFJlc2V0IEZJRk8gKi8KLQlFQ1JfV1JJVEUgKHBiLCAweGY0KTsgLyogQ29uZmlndXJhdGlvbiBtb2RlICovCi0JY29uZmlnID0gaW5iIChDT05GSUdBIChwYikpOworCUVDUl9XUklURShwYiwgRUNSX1NQUCA8PCA1KTsgLyogUmVzZXQgRklGTyAqLworCUVDUl9XUklURShwYiwgMHhmNCk7IC8qIENvbmZpZ3VyYXRpb24gbW9kZSAqLworCWNvbmZpZyA9IGluYihDT05GSUdBKHBiKSk7CiAJcHdvcmQgPSAoY29uZmlnID4+IDQpICYgMHg3OwogCXN3aXRjaCAocHdvcmQpIHsKIAljYXNlIDA6CiAJCXB3b3JkID0gMjsKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIjB4JWx4OiBVbnN1cHBvcnRlZCBwd29yZCBzaXplIVxuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiMHglbHg6IFVuc3VwcG9ydGVkIHB3b3JkIHNpemUhXG4iLAogCQkJcGItPmJhc2UpOwogCQlicmVhazsKIAljYXNlIDI6CiAJCXB3b3JkID0gNDsKLQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIjB4JWx4OiBVbnN1cHBvcnRlZCBwd29yZCBzaXplIVxuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiMHglbHg6IFVuc3VwcG9ydGVkIHB3b3JkIHNpemUhXG4iLAogCQkJcGItPmJhc2UpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsgKEtFUk5fV0FSTklORyAiMHglbHg6IFVua25vd24gaW1wbGVtZW50YXRpb24gSURcbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjB4JWx4OiBVbmtub3duIGltcGxlbWVudGF0aW9uIElEXG4iLAogCQkJcGItPmJhc2UpOwogCQkvKiBBc3N1bWUgMSAqLwogCWNhc2UgMToKQEAgLTE4NjcsMjggKzE5MzIsMjkgQEAKIAlwcml2LT5wd29yZCA9IHB3b3JkOwogCiAJaWYgKHZlcmJvc2VfcHJvYmluZykgewotCQlwcmludGsgKEtFUk5fREVCVUcgIjB4JWx4OiBQV29yZCBpcyAlZCBiaXRzXG4iLCBwYi0+YmFzZSwgOCAqIHB3b3JkKTsKLQkJCi0JCXByaW50ayAoS0VSTl9ERUJVRyAiMHglbHg6IEludGVycnVwdHMgYXJlIElTQS0lc1xuIiwgcGItPmJhc2UsCisJCXByaW50ayhLRVJOX0RFQlVHICIweCVseDogUFdvcmQgaXMgJWQgYml0c1xuIiwKKwkJCXBiLT5iYXNlLCA4ICogcHdvcmQpOworCisJCXByaW50ayhLRVJOX0RFQlVHICIweCVseDogSW50ZXJydXB0cyBhcmUgSVNBLSVzXG4iLCBwYi0+YmFzZSwKIAkJCWNvbmZpZyAmIDB4ODAgPyAiTGV2ZWwiIDogIlB1bHNlcyIpOwogCi0JCWNvbmZpZ2IgPSBpbmIgKENPTkZJR0IgKHBiKSk7Ci0JCXByaW50ayAoS0VSTl9ERUJVRyAiMHglbHg6IEVDUCBwb3J0IGNmZ0E9MHglMDJ4IGNmZ0I9MHglMDJ4XG4iLAorCQljb25maWdiID0gaW5iKENPTkZJR0IocGIpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JWx4OiBFQ1AgcG9ydCBjZmdBPTB4JTAyeCBjZmdCPTB4JTAyeFxuIiwKIAkJCXBiLT5iYXNlLCBjb25maWcsIGNvbmZpZ2IpOwotCQlwcmludGsgKEtFUk5fREVCVUcgIjB4JWx4OiBFQ1Agc2V0dGluZ3MgaXJxPSIsIHBiLT5iYXNlKTsKLQkJaWYgKChjb25maWdiID4+MykgJiAweDA3KQotCQkJcHJpbnRrKCIlZCIsaW50cmxpbmVbKGNvbmZpZ2IgPj4zKSAmIDB4MDddKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIjB4JWx4OiBFQ1Agc2V0dGluZ3MgaXJxPSIsIHBiLT5iYXNlKTsKKwkJaWYgKChjb25maWdiID4+IDMpICYgMHgwNykKKwkJCXByaW50aygiJWQiLCBpbnRybGluZVsoY29uZmlnYiA+PiAzKSAmIDB4MDddKTsKIAkJZWxzZQogCQkJcHJpbnRrKCI8bm9uZSBvciBzZXQgYnkgb3RoZXIgbWVhbnM+Iik7Ci0JCXByaW50ayAoIiBkbWE9Iik7Ci0JCWlmKCAoY29uZmlnYiAmIDB4MDMgKSA9PSAweDAwKQorCQlwcmludGsoIiBkbWE9Iik7CisJCWlmICgoY29uZmlnYiAmIDB4MDMpID09IDB4MDApCiAJCQlwcmludGsoIjxub25lIG9yIHNldCBieSBvdGhlciBtZWFucz5cbiIpOwogCQllbHNlCi0JCQlwcmludGsoIiVkXG4iLGNvbmZpZ2IgJiAweDA3KTsKKwkJCXByaW50aygiJWRcbiIsIGNvbmZpZ2IgJiAweDA3KTsKIAl9CiAKIAkvKiBHbyBiYWNrIHRvIG1vZGUgMDAwICovCi0JZnJvYl9zZXRfbW9kZSAocGIsIEVDUl9TUFApOworCWZyb2Jfc2V0X21vZGUocGIsIEVDUl9TUFApOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xOTAzLDEwICsxOTY5LDEwIEBACiAJaWYgKCFwcml2LT5lY3IpCiAJCXJldHVybiAwOwogCi0Jb2VjciA9IGluYiAoRUNPTlRST0wgKHBiKSk7Ci0JRUNSX1dSSVRFIChwYiwgRUNSX1BTMiA8PCA1KTsKKwlvZWNyID0gaW5iKEVDT05UUk9MKHBiKSk7CisJRUNSX1dSSVRFKHBiLCBFQ1JfUFMyIDw8IDUpOwogCXJlc3VsdCA9IHBhcnBvcnRfUFMyX3N1cHBvcnRlZChwYik7Ci0JRUNSX1dSSVRFIChwYiwgb2Vjcik7CisJRUNSX1dSSVRFKHBiLCBvZWNyKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xOTMwLDE2ICsxOTk2LDE1IEBACiAJICovCiAKIAkvKiBJZiBFUFAgdGltZW91dCBiaXQgY2xlYXIgdGhlbiBFUFAgYXZhaWxhYmxlICovCi0JaWYgKCFjbGVhcl9lcHBfdGltZW91dChwYikpIHsKKwlpZiAoIWNsZWFyX2VwcF90aW1lb3V0KHBiKSkKIAkJcmV0dXJuIDA7ICAvKiBObyB3YXkgdG8gY2xlYXIgdGltZW91dCAqLwotCX0KIAogCS8qIENoZWNrIGZvciBJbnRlbCBidWcuICovCiAJaWYgKHByaXYtPmVjcikgewogCQl1bnNpZ25lZCBjaGFyIGk7CiAJCWZvciAoaSA9IDB4MDA7IGkgPCAweDgwOyBpICs9IDB4MjApIHsKLQkJCUVDUl9XUklURSAocGIsIGkpOwotCQkJaWYgKGNsZWFyX2VwcF90aW1lb3V0IChwYikpIHsKKwkJCUVDUl9XUklURShwYiwgaSk7CisJCQlpZiAoY2xlYXJfZXBwX3RpbWVvdXQocGIpKSB7CiAJCQkJLyogUGhvbnkgRVBQIGluIEVDUC4gKi8KIAkJCQlyZXR1cm4gMDsKIAkJCX0KQEAgLTE5NjMsMTcgKzIwMjgsMTYgQEAKIAlpbnQgcmVzdWx0OwogCXVuc2lnbmVkIGNoYXIgb2VjcjsKIAotCWlmICghcHJpdi0+ZWNyKSB7CisJaWYgKCFwcml2LT5lY3IpCiAJCXJldHVybiAwOwotCX0KIAotCW9lY3IgPSBpbmIgKEVDT05UUk9MIChwYikpOworCW9lY3IgPSBpbmIoRUNPTlRST0wocGIpKTsKIAkvKiBTZWFyY2ggZm9yIFNNQyBzdHlsZSBFUFArRUNQIG1vZGUgKi8KLQlFQ1JfV1JJVEUgKHBiLCAweDgwKTsKLQlvdXRiICgweDA0LCBDT05UUk9MIChwYikpOworCUVDUl9XUklURShwYiwgMHg4MCk7CisJb3V0YigweDA0LCBDT05UUk9MKHBiKSk7CiAJcmVzdWx0ID0gcGFycG9ydF9FUFBfc3VwcG9ydGVkKHBiKTsKIAotCUVDUl9XUklURSAocGIsIG9lY3IpOworCUVDUl9XUklURShwYiwgb2Vjcik7CiAKIAlpZiAocmVzdWx0KSB7CiAJCS8qIFNldCB1cCBhY2Nlc3MgZnVuY3Rpb25zIHRvIHVzZSBFQ1ArRVBQIGhhcmR3YXJlLiAqLwpAQCAtMTk5MSwxMSArMjA1NSwyNSBAQAogLyogRG9uJ3QgYm90aGVyIHByb2JpbmcgZm9yIG1vZGVzIHdlIGtub3cgd2Ugd29uJ3QgdXNlLiAqLwogc3RhdGljIGludCBfX2RldmluaXQgcGFycG9ydF9QUzJfc3VwcG9ydGVkKHN0cnVjdCBwYXJwb3J0ICpwYikgeyByZXR1cm4gMDsgfQogI2lmZGVmIENPTkZJR19QQVJQT1JUX1BDX0ZJRk8KLXN0YXRpYyBpbnQgcGFycG9ydF9FQ1Bfc3VwcG9ydGVkKHN0cnVjdCBwYXJwb3J0ICpwYikgeyByZXR1cm4gMDsgfQorc3RhdGljIGludCBwYXJwb3J0X0VDUF9zdXBwb3J0ZWQoc3RydWN0IHBhcnBvcnQgKnBiKQoreworCXJldHVybiAwOworfQogI2VuZGlmCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X0VQUF9zdXBwb3J0ZWQoc3RydWN0IHBhcnBvcnQgKnBiKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X0VDUEVQUF9zdXBwb3J0ZWQoc3RydWN0IHBhcnBvcnQgKnBiKXtyZXR1cm4gMDt9Ci1zdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X0VDUFBTMl9zdXBwb3J0ZWQoc3RydWN0IHBhcnBvcnQgKnBiKXtyZXR1cm4gMDt9CitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X0VQUF9zdXBwb3J0ZWQoc3RydWN0IHBhcnBvcnQgKnBiKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X0VDUEVQUF9zdXBwb3J0ZWQoc3RydWN0IHBhcnBvcnQgKnBiKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwYXJwb3J0X0VDUFBTMl9zdXBwb3J0ZWQoc3RydWN0IHBhcnBvcnQgKnBiKQoreworCXJldHVybiAwOworfQogCiAjZW5kaWYgLyogTm8gSUVFRSAxMjg0IHN1cHBvcnQgKi8KIApAQCAtMjAwNSwxNyArMjA4MywxNyBAQAogc3RhdGljIGludCBwcm9ncmFtbWFibGVfaXJxX3N1cHBvcnQoc3RydWN0IHBhcnBvcnQgKnBiKQogewogCWludCBpcnEsIGludHJMaW5lOwotCXVuc2lnbmVkIGNoYXIgb2VjciA9IGluYiAoRUNPTlRST0wgKHBiKSk7CisJdW5zaWduZWQgY2hhciBvZWNyID0gaW5iKEVDT05UUk9MKHBiKSk7CiAJc3RhdGljIGNvbnN0IGludCBsb29rdXBbOF0gPSB7CiAJCVBBUlBPUlRfSVJRX05PTkUsIDcsIDksIDEwLCAxMSwgMTQsIDE1LCA1CiAJfTsKIAotCUVDUl9XUklURSAocGIsIEVDUl9DTkYgPDwgNSk7IC8qIENvbmZpZ3VyYXRpb24gTU9ERSAqLworCUVDUl9XUklURShwYiwgRUNSX0NORiA8PCA1KTsgLyogQ29uZmlndXJhdGlvbiBNT0RFICovCiAKLQlpbnRyTGluZSA9IChpbmIgKENPTkZJR0IgKHBiKSkgPj4gMykgJiAweDA3OworCWludHJMaW5lID0gKGluYihDT05GSUdCKHBiKSkgPj4gMykgJiAweDA3OwogCWlycSA9IGxvb2t1cFtpbnRyTGluZV07CiAKLQlFQ1JfV1JJVEUgKHBiLCBvZWNyKTsKKwlFQ1JfV1JJVEUocGIsIG9lY3IpOwogCXJldHVybiBpcnE7CiB9CiAKQEAgLTIwMjUsMTcgKzIxMDMsMTcgQEAKIAl1bnNpZ25lZCBsb25nIGlycXM7CiAKIAlpcnFzID0gcHJvYmVfaXJxX29uKCk7Ci0JCQotCUVDUl9XUklURSAocGIsIEVDUl9TUFAgPDwgNSk7IC8qIFJlc2V0IEZJRk8gKi8KLQlFQ1JfV1JJVEUgKHBiLCAoRUNSX1RTVCA8PCA1KSB8IDB4MDQpOwotCUVDUl9XUklURSAocGIsIEVDUl9UU1QgPDwgNSk7CisKKwlFQ1JfV1JJVEUocGIsIEVDUl9TUFAgPDwgNSk7IC8qIFJlc2V0IEZJRk8gKi8KKwlFQ1JfV1JJVEUocGIsIChFQ1JfVFNUIDw8IDUpIHwgMHgwNCk7CisJRUNSX1dSSVRFKHBiLCBFQ1JfVFNUIDw8IDUpOwogCiAJLyogSWYgRnVsbCBGSUZPIHN1cmUgdGhhdCB3cml0ZUludHJUaHJlc2hvbGQgaXMgZ2VuZXJhdGVkICovCi0JZm9yIChpPTA7IGkgPCAxMDI0ICYmICEoaW5iIChFQ09OVFJPTCAocGIpKSAmIDB4MDIpIDsgaSsrKSAKLQkJb3V0YiAoMHhhYSwgRklGTyAocGIpKTsKLQkJCisJZm9yIChpID0gMDsgaSA8IDEwMjQgJiYgIShpbmIoRUNPTlRST0wocGIpKSAmIDB4MDIpIDsgaSsrKQorCQlvdXRiKDB4YWEsIEZJRk8ocGIpKTsKKwogCXBiLT5pcnEgPSBwcm9iZV9pcnFfb2ZmKGlycXMpOwotCUVDUl9XUklURSAocGIsIEVDUl9TUFAgPDwgNSk7CisJRUNSX1dSSVRFKHBiLCBFQ1JfU1BQIDw8IDUpOwogCiAJaWYgKHBiLT5pcnEgPD0gMCkKIAkJcGItPmlycSA9IFBBUlBPUlRfSVJRX05PTkU7CkBAIC0yMDQ1LDcgKzIxMjMsNyBAQAogCiAvKgogICogVGhpcyBkZXRlY3Rpb24gc2VlbXMgdGhhdCBvbmx5IHdvcmtzIGluIE5hdGlvbmFsIFNlbWljb25kdWN0b3JzCi0gKiBUaGlzIGRvZXNuJ3Qgd29yayBpbiBTTUMsIExHUywgYW5kIFdpbmJvbmQgCisgKiBUaGlzIGRvZXNuJ3Qgd29yayBpbiBTTUMsIExHUywgYW5kIFdpbmJvbmQKICAqLwogc3RhdGljIGludCBpcnFfcHJvYmVfRVBQKHN0cnVjdCBwYXJwb3J0ICpwYikKIHsKQEAgLTIwNTYsMTYgKzIxMzQsMTYgQEAKIAl1bnNpZ25lZCBjaGFyIG9lY3I7CiAKIAlpZiAocGItPm1vZGVzICYgUEFSUE9SVF9NT0RFX1BDRUNSKQotCQlvZWNyID0gaW5iIChFQ09OVFJPTCAocGIpKTsKKwkJb2VjciA9IGluYihFQ09OVFJPTChwYikpOwogCiAJaXJxcyA9IHByb2JlX2lycV9vbigpOwogCiAJaWYgKHBiLT5tb2RlcyAmIFBBUlBPUlRfTU9ERV9QQ0VDUikKLQkJZnJvYl9lY29udHJvbCAocGIsIDB4MTAsIDB4MTApOwotCQorCQlmcm9iX2Vjb250cm9sKHBiLCAweDEwLCAweDEwKTsKKwogCWNsZWFyX2VwcF90aW1lb3V0KHBiKTsKLQlwYXJwb3J0X3BjX2Zyb2JfY29udHJvbCAocGIsIDB4MjAsIDB4MjApOwotCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sIChwYiwgMHgxMCwgMHgxMCk7CisJcGFycG9ydF9wY19mcm9iX2NvbnRyb2wocGIsIDB4MjAsIDB4MjApOworCXBhcnBvcnRfcGNfZnJvYl9jb250cm9sKHBiLCAweDEwLCAweDEwKTsKIAljbGVhcl9lcHBfdGltZW91dChwYik7CiAKIAkvKiBEZXZpY2UgaXNuJ3QgZXhwZWN0aW5nIGFuIEVQUCByZWFkCkBAIC0yMDc0LDkgKzIxNTIsOSBAQAogCXBhcnBvcnRfcGNfcmVhZF9lcHAocGIpOwogCXVkZWxheSgyMCk7CiAKLQlwYi0+aXJxID0gcHJvYmVfaXJxX29mZiAoaXJxcyk7CisJcGItPmlycSA9IHByb2JlX2lycV9vZmYoaXJxcyk7CiAJaWYgKHBiLT5tb2RlcyAmIFBBUlBPUlRfTU9ERV9QQ0VDUikKLQkJRUNSX1dSSVRFIChwYiwgb2Vjcik7CisJCUVDUl9XUklURShwYiwgb2Vjcik7CiAJcGFycG9ydF9wY193cml0ZV9jb250cm9sKHBiLCAweGMpOwogCiAJaWYgKHBiLT5pcnEgPD0gMCkKQEAgLTIxMzMsMjggKzIyMTEsMjggQEAKIC8qIC0tLSBETUEgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIE9ubHkgaWYgY2hpcHNldCBjb25mb3JtcyB0byBFQ1AgSVNBIEludGVyZmFjZSBTdGFuZGFyZCAqLwotc3RhdGljIGludCBwcm9ncmFtbWFibGVfZG1hX3N1cHBvcnQgKHN0cnVjdCBwYXJwb3J0ICpwKQorc3RhdGljIGludCBwcm9ncmFtbWFibGVfZG1hX3N1cHBvcnQoc3RydWN0IHBhcnBvcnQgKnApCiB7Ci0JdW5zaWduZWQgY2hhciBvZWNyID0gaW5iIChFQ09OVFJPTCAocCkpOworCXVuc2lnbmVkIGNoYXIgb2VjciA9IGluYihFQ09OVFJPTChwKSk7CiAJaW50IGRtYTsKIAotCWZyb2Jfc2V0X21vZGUgKHAsIEVDUl9DTkYpOwotCQotCWRtYSA9IGluYiAoQ09ORklHQihwKSkgJiAweDA3OworCWZyb2Jfc2V0X21vZGUocCwgRUNSX0NORik7CisKKwlkbWEgPSBpbmIoQ09ORklHQihwKSkgJiAweDA3OwogCS8qIDAwMDogSW5kaWNhdGVzIGp1bXBlcmVkIDgtYml0IERNQSBpZiByZWFkLW9ubHkuCiAJICAgMTAwOiBJbmRpY2F0ZXMganVtcGVyZWQgMTYtYml0IERNQSBpZiByZWFkLW9ubHkuICovCiAJaWYgKChkbWEgJiAweDAzKSA9PSAwKQogCQlkbWEgPSBQQVJQT1JUX0RNQV9OT05FOwogCi0JRUNSX1dSSVRFIChwLCBvZWNyKTsKKwlFQ1JfV1JJVEUocCwgb2Vjcik7CiAJcmV0dXJuIGRtYTsKIH0KIAotc3RhdGljIGludCBwYXJwb3J0X2RtYV9wcm9iZSAoc3RydWN0IHBhcnBvcnQgKnApCitzdGF0aWMgaW50IHBhcnBvcnRfZG1hX3Byb2JlKHN0cnVjdCBwYXJwb3J0ICpwKQogewogCWNvbnN0IHN0cnVjdCBwYXJwb3J0X3BjX3ByaXZhdGUgKnByaXYgPSBwLT5wcml2YXRlX2RhdGE7Ci0JaWYgKHByaXYtPmVjcikKLQkJcC0+ZG1hID0gcHJvZ3JhbW1hYmxlX2RtYV9zdXBwb3J0KHApOyAvKiBhc2sgRUNQIGNoaXBzZXQgZmlyc3QgKi8KKwlpZiAocHJpdi0+ZWNyKQkJLyogYXNrIEVDUCBjaGlwc2V0IGZpcnN0ICovCisJCXAtPmRtYSA9IHByb2dyYW1tYWJsZV9kbWFfc3VwcG9ydChwKTsKIAlpZiAocC0+ZG1hID09IFBBUlBPUlRfRE1BX05PTkUpIHsKIAkJLyogYXNrIGtub3duIFN1cGVyLUlPIGNoaXBzIHByb3BlciwgYWx0aG91Z2ggdGhlc2UKIAkJICAgY2xhaW0gRUNQIGNvbXBhdGlibGUsIHNvbWUgZG9uJ3QgcmVwb3J0IHRoZWlyIERNQQpAQCAtMjIxMiw3ICsyMjkwLDcgQEAKIAlpZiAoIWJhc2VfcmVzKQogCQlnb3RvIG91dDQ7CiAKLQltZW1jcHkob3BzLCAmcGFycG9ydF9wY19vcHMsIHNpemVvZiAoc3RydWN0IHBhcnBvcnRfb3BlcmF0aW9ucykpOworCW1lbWNweShvcHMsICZwYXJwb3J0X3BjX29wcywgc2l6ZW9mKHN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMpKTsKIAlwcml2LT5jdHIgPSAweGM7CiAJcHJpdi0+Y3RyX3dyaXRhYmxlID0gfjB4MTA7CiAJcHJpdi0+ZWNyID0gMDsKQEAgLTIyMzksNyArMjMxNyw3IEBACiAJCQlpZiAoIXBhcnBvcnRfRVBQX3N1cHBvcnRlZChwKSkKIAkJCQlwYXJwb3J0X0VDUEVQUF9zdXBwb3J0ZWQocCk7CiAJfQotCWlmICghcGFycG9ydF9TUFBfc3VwcG9ydGVkIChwKSkKKwlpZiAoIXBhcnBvcnRfU1BQX3N1cHBvcnRlZChwKSkKIAkJLyogTm8gcG9ydC4gKi8KIAkJZ290byBvdXQ1OwogCWlmIChwcml2LT5lY3IpCkBAIC0yMjQ3LDcgKzIzMjUsNyBAQAogCWVsc2UKIAkJcGFycG9ydF9QUzJfc3VwcG9ydGVkKHApOwogCi0JcC0+c2l6ZSA9IChwLT5tb2RlcyAmIFBBUlBPUlRfTU9ERV9FUFApPzg6MzsKKwlwLT5zaXplID0gKHAtPm1vZGVzICYgUEFSUE9SVF9NT0RFX0VQUCkgPyA4IDogMzsKIAogCXByaW50ayhLRVJOX0lORk8gIiVzOiBQQy1zdHlsZSBhdCAweCVseCIsIHAtPm5hbWUsIHAtPmJhc2UpOwogCWlmIChwLT5iYXNlX2hpICYmIHByaXYtPmVjcikKQEAgLTIyNzEsNyArMjM0OSw3IEBACiAJCX0KIAl9CiAJaWYgKHAtPmRtYSA9PSBQQVJQT1JUX0RNQV9BVVRPKSAvKiBUbyB1c2UgRE1BLCBnaXZpbmcgdGhlIGlycQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG1hbmRhdG9yeSAoc2VlIGFib3ZlKSAqLworCQkJCQkgICBpcyBtYW5kYXRvcnkgKHNlZSBhYm92ZSkgKi8KIAkJcC0+ZG1hID0gUEFSUE9SVF9ETUFfTk9ORTsKIAogI2lmZGVmIENPTkZJR19QQVJQT1JUX1BDX0ZJRk8KQEAgLTIyODgsMTYgKzIzNjYsMjMgQEAKIAkJaWYgKHAtPmRtYSAhPSBQQVJQT1JUX0RNQV9OT05FKSB7CiAJCQlwcmludGsoIiwgZG1hICVkIiwgcC0+ZG1hKTsKIAkJCXAtPm1vZGVzIHw9IFBBUlBPUlRfTU9ERV9ETUE7Ci0JCX0KLQkJZWxzZSBwcmludGsoIiwgdXNpbmcgRklGTyIpOwotCX0KLQllbHNlCisJCX0gZWxzZQorCQkJcHJpbnRrKCIsIHVzaW5nIEZJRk8iKTsKKwl9IGVsc2UKIAkJLyogV2UgY2FuJ3QgdXNlIHRoZSBETUEgY2hhbm5lbCBhZnRlciBhbGwuICovCiAJCXAtPmRtYSA9IFBBUlBPUlRfRE1BX05PTkU7CiAjZW5kaWYgLyogQWxsb3dlZCB0byB1c2UgRklGTy9ETUEgKi8KIAogCXByaW50aygiIFsiKTsKLSNkZWZpbmUgcHJpbnRtb2RlKHgpIHtpZihwLT5tb2RlcyZQQVJQT1JUX01PREVfIyN4KXtwcmludGsoIiVzJXMiLGY/IiwiOiIiLCN4KTtmKys7fX0KKworI2RlZmluZSBwcmludG1vZGUoeCkgXAorCXtcCisJCWlmIChwLT5tb2RlcyAmIFBBUlBPUlRfTU9ERV8jI3gpIHtcCisJCQlwcmludGsoIiVzJXMiLCBmID8gIiwiIDogIiIsICN4KTtcCisJCQlmKys7XAorCQl9IFwKKwl9CisKIAl7CiAJCWludCBmID0gMDsKIAkJcHJpbnRtb2RlKFBDU1BQKTsKQEAgLTIzMDksMTAgKzIzOTQsMTAgQEAKIAl9CiAjdW5kZWYgcHJpbnRtb2RlCiAjaWZuZGVmIENPTkZJR19QQVJQT1JUXzEyODQKLQlwcmludGsgKCIoLC4uLikiKTsKKwlwcmludGsoIigsLi4uKSIpOwogI2VuZGlmIC8qIENPTkZJR19QQVJQT1JUXzEyODQgKi8KIAlwcmludGsoIl1cbiIpOwotCWlmIChwcm9iZWRpcnEgIT0gUEFSUE9SVF9JUlFfTk9ORSkgCisJaWYgKHByb2JlZGlycSAhPSBQQVJQT1JUX0lSUV9OT05FKQogCQlwcmludGsoS0VSTl9JTkZPICIlczogaXJxICVkIGRldGVjdGVkXG4iLCBwLT5uYW1lLCBwcm9iZWRpcnEpOwogCiAJLyogSWYgTm8gRUNQIHJlbGVhc2UgdGhlIHBvcnRzIGdyYWJiZWQgYWJvdmUuICovCkBAIC0yMzI4LDcgKzI0MTMsNyBAQAogCWlmIChwLT5pcnEgIT0gUEFSUE9SVF9JUlFfTk9ORSkgewogCQlpZiAocmVxdWVzdF9pcnEocC0+aXJxLCBwYXJwb3J0X2lycV9oYW5kbGVyLAogCQkJCSBpcnFmbGFncywgcC0+bmFtZSwgcCkpIHsKLQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogaXJxICVkIGluIHVzZSwgIgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGlycSAlZCBpbiB1c2UsICIKIAkJCQkicmVzb3J0aW5nIHRvIHBvbGxlZCBvcGVyYXRpb25cbiIsCiAJCQkJcC0+bmFtZSwgcC0+aXJxKTsKIAkJCXAtPmlycSA9IFBBUlBPUlRfSVJRX05PTkU7CkBAIC0yMzM4LDggKzI0MjMsOCBAQAogI2lmZGVmIENPTkZJR19QQVJQT1JUX1BDX0ZJRk8KICNpZmRlZiBIQVNfRE1BCiAJCWlmIChwLT5kbWEgIT0gUEFSUE9SVF9ETUFfTk9ORSkgewotCQkJaWYgKHJlcXVlc3RfZG1hIChwLT5kbWEsIHAtPm5hbWUpKSB7Ci0JCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBkbWEgJWQgaW4gdXNlLCAiCisJCQlpZiAocmVxdWVzdF9kbWEocC0+ZG1hLCBwLT5uYW1lKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkbWEgJWQgaW4gdXNlLCAiCiAJCQkJCSJyZXNvcnRpbmcgdG8gUElPIG9wZXJhdGlvblxuIiwKIAkJCQkJcC0+bmFtZSwgcC0+ZG1hKTsKIAkJCQlwLT5kbWEgPSBQQVJQT1JUX0RNQV9OT05FOwpAQCAtMjM0OSw4ICsyNDM0LDggQEAKIAkJCQkJCSAgICAgICBQQUdFX1NJWkUsCiAJCQkJCQkgICAgICAgJnByaXYtPmRtYV9oYW5kbGUsCiAJCQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JCQkJaWYgKCEgcHJpdi0+ZG1hX2J1ZikgewotCQkJCQlwcmludGsgKEtFUk5fV0FSTklORyAiJXM6ICIKKwkJCQlpZiAoIXByaXYtPmRtYV9idWYpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIKIAkJCQkJCSJjYW5ub3QgZ2V0IGJ1ZmZlciBmb3IgRE1BLCAiCiAJCQkJCQkicmVzb3J0aW5nIHRvIFBJTyBvcGVyYXRpb25cbiIsCiAJCQkJCQlwLT5uYW1lKTsKQEAgLTIzNjksMTAgKzI0NTQsMTAgQEAKIAkJICogUHV0IHRoZSBFQ1AgZGV0ZWN0ZWQgcG9ydCBpbiBQUzIgbW9kZS4KIAkJICogRG8gdGhpcyBhbHNvIGZvciBwb3J0cyB0aGF0IGhhdmUgRUNSIGJ1dCBkb24ndCBkbyBFQ1AuCiAJCSAqLwotCQlFQ1JfV1JJVEUgKHAsIDB4MzQpOworCQlFQ1JfV1JJVEUocCwgMHgzNCk7CiAKIAlwYXJwb3J0X3BjX3dyaXRlX2RhdGEocCwgMCk7Ci0JcGFycG9ydF9wY19kYXRhX2ZvcndhcmQgKHApOworCXBhcnBvcnRfcGNfZGF0YV9mb3J3YXJkKHApOwogCiAJLyogTm93IHRoYXQgd2UndmUgdG9sZCB0aGUgc2hhcmluZyBlbmdpbmUgYWJvdXQgdGhlIHBvcnQsIGFuZAogCSAgIGZvdW5kIG91dCBpdHMgY2hhcmFjdGVyaXN0aWNzLCBsZXQgdGhlIGhpZ2gtbGV2ZWwgZHJpdmVycwpAQCAtMjM4MCw3ICsyNDY1LDcgQEAKIAlzcGluX2xvY2soJnBvcnRzX2xvY2spOwogCWxpc3RfYWRkKCZwcml2LT5saXN0LCAmcG9ydHNfbGlzdCk7CiAJc3Bpbl91bmxvY2soJnBvcnRzX2xvY2spOwotCXBhcnBvcnRfYW5ub3VuY2VfcG9ydCAocCk7CisJcGFycG9ydF9hbm5vdW5jZV9wb3J0KHApOwogCiAJcmV0dXJuIHA7CiAKQEAgLTIzOTMsMTggKzI0NzgsMTcgQEAKIG91dDQ6CiAJcGFycG9ydF9wdXRfcG9ydChwKTsKIG91dDM6Ci0Ja2ZyZWUgKHByaXYpOworCWtmcmVlKHByaXYpOwogb3V0MjoKLQlrZnJlZSAob3BzKTsKKwlrZnJlZShvcHMpOwogb3V0MToKIAlpZiAocGRldikKIAkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIocGRldik7CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MKHBhcnBvcnRfcGNfcHJvYmVfcG9ydCk7CiAKLUVYUE9SVF9TWU1CT0wgKHBhcnBvcnRfcGNfcHJvYmVfcG9ydCk7Ci0KLXZvaWQgcGFycG9ydF9wY191bnJlZ2lzdGVyX3BvcnQgKHN0cnVjdCBwYXJwb3J0ICpwKQordm9pZCBwYXJwb3J0X3BjX3VucmVnaXN0ZXJfcG9ydChzdHJ1Y3QgcGFycG9ydCAqcCkKIHsKIAlzdHJ1Y3QgcGFycG9ydF9wY19wcml2YXRlICpwcml2ID0gcC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMgKm9wcyA9IHAtPm9wczsKQEAgLTI0MzAsMTcgKzI1MTQsMTYgQEAKIAkJCQkgICAgcHJpdi0+ZG1hX2J1ZiwKIAkJCQkgICAgcHJpdi0+ZG1hX2hhbmRsZSk7CiAjZW5kaWYKLQlrZnJlZSAocC0+cHJpdmF0ZV9kYXRhKTsKKwlrZnJlZShwLT5wcml2YXRlX2RhdGEpOwogCXBhcnBvcnRfcHV0X3BvcnQocCk7Ci0Ja2ZyZWUgKG9wcyk7IC8qIGhvcGUgbm8tb25lIGNhY2hlZCBpdCAqLworCWtmcmVlKG9wcyk7IC8qIGhvcGUgbm8tb25lIGNhY2hlZCBpdCAqLwogfQotCi1FWFBPUlRfU1lNQk9MIChwYXJwb3J0X3BjX3VucmVnaXN0ZXJfcG9ydCk7CitFWFBPUlRfU1lNQk9MKHBhcnBvcnRfcGNfdW5yZWdpc3Rlcl9wb3J0KTsKIAogI2lmZGVmIENPTkZJR19QQ0kKIAogLyogSVRFIHN1cHBvcnQgbWFpbnRhaW5lZCBieSBSaWNoIExpdSA8cmljaGxpdUBwb29ybWFuLm9yZz4gKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHNpb19pdGVfODg3Ml9wcm9iZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBhdXRvaXJxLAorc3RhdGljIGludCBfX2RldmluaXQgc2lvX2l0ZV84ODcyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYXV0b2lycSwKIAkJCQkJIGludCBhdXRvZG1hLAogCQkJCQkgY29uc3Qgc3RydWN0IHBhcnBvcnRfcGNfdmlhX2RhdGEgKnZpYSkKIHsKQEAgLTI0NTIsNzMgKzI1MzUsNzQgQEAKIAlpbnQgaXJxOwogCWludCBpOwogCi0JRFBSSU5USyAoS0VSTl9ERUJVRyAic2lvX2l0ZV84ODcyX3Byb2JlKClcbiIpOwotCQotCS8vIG1ha2Ugc3VyZSB3aGljaCBvbmUgY2hpcAotCWZvcihpID0gMDsgaSA8IDU7IGkrKykgeworCURQUklOVEsoS0VSTl9ERUJVRyAic2lvX2l0ZV84ODcyX3Byb2JlKClcbiIpOworCisJLyogbWFrZSBzdXJlIHdoaWNoIG9uZSBjaGlwICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQliYXNlX3JlcyA9IHJlcXVlc3RfcmVnaW9uKGludGFfYWRkcltpXSwgMzIsICJpdDg4N3giKTsKIAkJaWYgKGJhc2VfcmVzKSB7CiAJCQlpbnQgdGVzdDsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4NjAsCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NjAsCiAJCQkJCQkweGU1MDAwMDAwIHwgaW50YV9hZGRyW2ldKTsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4NzgsCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NzgsCiAJCQkJCQkweDAwMDAwMDAwIHwgaW50YV9hZGRyW2ldKTsKLQkJCXRlc3QgPSBpbmIgKGludGFfYWRkcltpXSk7Ci0JCQlpZiAodGVzdCAhPSAweGZmKSBicmVhazsKKwkJCXRlc3QgPSBpbmIoaW50YV9hZGRyW2ldKTsKKwkJCWlmICh0ZXN0ICE9IDB4ZmYpCisJCQkJYnJlYWs7CiAJCQlyZWxlYXNlX3JlZ2lvbihpbnRhX2FkZHJbaV0sIDB4OCk7CiAJCX0KIAl9Ci0JaWYoaSA+PSA1KSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPICJwYXJwb3J0X3BjOiBjYW5ub3QgZmluZCBJVEU4ODcyIElOVEFcbiIpOworCWlmIChpID49IDUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicGFycG9ydF9wYzogY2Fubm90IGZpbmQgSVRFODg3MiBJTlRBXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JdHlwZSA9IGluYiAoaW50YV9hZGRyW2ldICsgMHgxOCk7CisJdHlwZSA9IGluYihpbnRhX2FkZHJbaV0gKyAweDE4KTsKIAl0eXBlICY9IDB4MGY7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIDB4MjoKLQkJcHJpbnRrIChLRVJOX0lORk8gInBhcnBvcnRfcGM6IElURTg4NzEgZm91bmQgKDFQKVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInBhcnBvcnRfcGM6IElURTg4NzEgZm91bmQgKDFQKVxuIik7CiAJCWl0ZTg4NzJzZXQgPSAweDY0MjAwMDAwOwogCQlicmVhazsKIAljYXNlIDB4YToKLQkJcHJpbnRrIChLRVJOX0lORk8gInBhcnBvcnRfcGM6IElURTg4NzUgZm91bmQgKDFQKVxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInBhcnBvcnRfcGM6IElURTg4NzUgZm91bmQgKDFQKVxuIik7CiAJCWl0ZTg4NzJzZXQgPSAweDY0MjAwMDAwOwogCQlicmVhazsKIAljYXNlIDB4ZToKLQkJcHJpbnRrIChLRVJOX0lORk8gInBhcnBvcnRfcGM6IElURTg4NzIgZm91bmQgKDJTMVApXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicGFycG9ydF9wYzogSVRFODg3MiBmb3VuZCAoMlMxUClcbiIpOwogCQlpdGU4ODcyc2V0ID0gMHg2NGUwMDAwMDsKIAkJYnJlYWs7CiAJY2FzZSAweDY6Ci0JCXByaW50ayAoS0VSTl9JTkZPICJwYXJwb3J0X3BjOiBJVEU4ODczIGZvdW5kICgxUylcbiIpOworCQlwcmludGsoS0VSTl9JTkZPICJwYXJwb3J0X3BjOiBJVEU4ODczIGZvdW5kICgxUylcbiIpOwogCQlyZXR1cm4gMDsKIAljYXNlIDB4ODoKLQkJRFBSSU5USyAoS0VSTl9ERUJVRyAicGFycG9ydF9wYzogSVRFODg3NCBmb3VuZCAoMlMpXG4iKTsKKwkJRFBSSU5USyhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBJVEU4ODc0IGZvdW5kICgyUylcbiIpOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgotCQlwcmludGsgKEtFUk5fSU5GTyAicGFycG9ydF9wYzogdW5rbm93biBJVEU4ODd4XG4iKTsKLQkJcHJpbnRrIChLRVJOX0lORk8gInBhcnBvcnRfcGM6IHBsZWFzZSBtYWlsICdsc3BjaSAtbnZ2JyAiCisJCXByaW50ayhLRVJOX0lORk8gInBhcnBvcnRfcGM6IHVua25vd24gSVRFODg3eFxuIik7CisJCXByaW50ayhLRVJOX0lORk8gInBhcnBvcnRfcGM6IHBsZWFzZSBtYWlsICdsc3BjaSAtbnZ2JyAiCiAJCQkib3V0cHV0IHRvIFJpY2guTGl1QGl0ZS5jb20udHdcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlwY2lfcmVhZF9jb25maWdfYnl0ZSAocGRldiwgMHgzYywgJml0ZTg4NzJfaXJxKTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQgKHBkZXYsIDB4MWMsICZpdGU4ODcyX2xwdCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHgzYywgJml0ZTg4NzJfaXJxKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHgxYywgJml0ZTg4NzJfbHB0KTsKIAlpdGU4ODcyX2xwdCAmPSAweDAwMDBmZjAwOwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZCAocGRldiwgMHgyMCwgJml0ZTg4NzJfbHB0aGkpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDIwLCAmaXRlODg3Ml9scHRoaSk7CiAJaXRlODg3Ml9scHRoaSAmPSAweDAwMDBmZjAwOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4NmMsIDB4ZTMwMDAwMDAgfCBpdGU4ODcyX2xwdCk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAocGRldiwgMHg3MCwgMHhlMzAwMDAwMCB8IGl0ZTg4NzJfbHB0aGkpOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQgKHBkZXYsIDB4ODAsIChpdGU4ODcyX2xwdGhpPDwxNikgfCBpdGU4ODcyX2xwdCk7Ci0JLy8gU0VUIFNQUCZFUFAgLCBQYXJhbGxlbCBQb3J0IE5PIERNQSAsIEVuYWJsZSBBbGwgRnVuY3Rpb24KLQkvLyBTRVQgUGFyYWxsZWwgSVJRCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZCAocGRldiwgMHg5YywKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NmMsIDB4ZTMwMDAwMDAgfCBpdGU4ODcyX2xwdCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDcwLCAweGUzMDAwMDAwIHwgaXRlODg3Ml9scHRoaSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDgwLCAoaXRlODg3Ml9scHRoaTw8MTYpIHwgaXRlODg3Ml9scHQpOworCS8qIFNFVCBTUFAmRVBQICwgUGFyYWxsZWwgUG9ydCBOTyBETUEgLCBFbmFibGUgQWxsIEZ1bmN0aW9uICovCisJLyogU0VUIFBhcmFsbGVsIElSUSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg5YywKIAkJCQlpdGU4ODcyc2V0IHwgKGl0ZTg4NzJfaXJxICogMHgxMTExMSkpOwogCi0JRFBSSU5USyAoS0VSTl9ERUJVRyAiSVRFODg3eDogVGhlIElSUSBpcyAlZC5cbiIsIGl0ZTg4NzJfaXJxKTsKLQlEUFJJTlRLIChLRVJOX0RFQlVHICJJVEU4ODd4OiBUaGUgUEFSQUxMRUwgSS9PIHBvcnQgaXMgMHgleC5cbiIsCisJRFBSSU5USyhLRVJOX0RFQlVHICJJVEU4ODd4OiBUaGUgSVJRIGlzICVkLlxuIiwgaXRlODg3Ml9pcnEpOworCURQUklOVEsoS0VSTl9ERUJVRyAiSVRFODg3eDogVGhlIFBBUkFMTEVMIEkvTyBwb3J0IGlzIDB4JXguXG4iLAogCQkgaXRlODg3Ml9scHQpOwotCURQUklOVEsgKEtFUk5fREVCVUcgIklURTg4N3g6IFRoZSBQQVJBTExFTCBJL08gcG9ydGhpIGlzIDB4JXguXG4iLAorCURQUklOVEsoS0VSTl9ERUJVRyAiSVRFODg3eDogVGhlIFBBUkFMTEVMIEkvTyBwb3J0aGkgaXMgMHgleC5cbiIsCiAJCSBpdGU4ODcyX2xwdGhpKTsKIAogCS8qIExldCB0aGUgdXNlciAob3IgZGVmYXVsdHMpIHN0ZWVyIHVzIGF3YXkgZnJvbSBpbnRlcnJ1cHRzICovCkBAIC0yNTMwLDE0ICsyNjE0LDE0IEBACiAJICogUmVsZWFzZSB0aGUgcmVzb3VyY2Ugc28gdGhhdCBwYXJwb3J0X3BjX3Byb2JlX3BvcnQgY2FuIGdldCBpdC4KIAkgKi8KIAlyZWxlYXNlX3Jlc291cmNlKGJhc2VfcmVzKTsKLQlpZiAocGFycG9ydF9wY19wcm9iZV9wb3J0IChpdGU4ODcyX2xwdCwgaXRlODg3Ml9scHRoaSwKKwlpZiAocGFycG9ydF9wY19wcm9iZV9wb3J0KGl0ZTg4NzJfbHB0LCBpdGU4ODcyX2xwdGhpLAogCQkJCSAgIGlycSwgUEFSUE9SVF9ETUFfTk9ORSwgJnBkZXYtPmRldiwgMCkpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8KKwkJcHJpbnRrKEtFUk5fSU5GTwogCQkJInBhcnBvcnRfcGM6IElURSA4ODcyIHBhcmFsbGVsIHBvcnQ6IGlvPTB4JVgiLAotCQkJaXRlODg3Ml9scHQpOworCQkJCQkJCQlpdGU4ODcyX2xwdCk7CiAJCWlmIChpcnEgIT0gUEFSUE9SVF9JUlFfTk9ORSkKLQkJCXByaW50ayAoIiwgaXJxPSVkIiwgaXJxKTsKLQkJcHJpbnRrICgiXG4iKTsKKwkJCXByaW50aygiLCBpcnE9JWQiLCBpcnEpOworCQlwcmludGsoIlxuIik7CiAJCXJldHVybiAxOwogCX0KIApAQCAtMjU0Niw3ICsyNjMwLDcgQEAKIAogLyogVklBIDgyMzEgc3VwcG9ydCBieSBQYXZlbCBGZWRpbiA8c29uaWNfYW1pZ2FAcmFtYmxlci5ydT4KICAgIGJhc2VkIG9uIFZJQSA2ODZhIHN1cHBvcnQgY29kZSBieSBKZWZmIEdhcnppayA8amdhcnppa0Bwb2JveC5jb20+ICovCi1zdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgcGFycG9ydF9pbml0X21vZGUgPSAwOworc3RhdGljIGludCBfX2RldmluaXRkYXRhIHBhcnBvcnRfaW5pdF9tb2RlOwogCiAvKiBEYXRhIGZvciB0d28ga25vd24gVklBIGNoaXBzICovCiBzdGF0aWMgc3RydWN0IHBhcnBvcnRfcGNfdmlhX2RhdGEgdmlhXzY4NmFfZGF0YSBfX2RldmluaXRkYXRhID0gewpAQCAtMjU2OCw3ICsyNjUyLDcgQEAKIAkweEY2CiB9OwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzaW9fdmlhX3Byb2JlIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGF1dG9pcnEsCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaW9fdmlhX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYXV0b2lycSwKIAkJCQkgICAgaW50IGF1dG9kbWEsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBwYXJwb3J0X3BjX3ZpYV9kYXRhICp2aWEpCiB7CkBAIC0yNTgwLDM4ICsyNjY0LDM4IEBACiAKIAlwcmludGsoS0VSTl9ERUJVRyAicGFycG9ydF9wYzogVklBIDY4NkEvODIzMSBkZXRlY3RlZFxuIik7CiAKLQlzd2l0Y2gocGFycG9ydF9pbml0X21vZGUpCi0JeworCXN3aXRjaCAocGFycG9ydF9pbml0X21vZGUpIHsKIAljYXNlIDE6Ci0JICAgIHByaW50ayhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBzZXR0aW5nIFNQUCBtb2RlXG4iKTsKLQkgICAgc2lvZnVuYyA9IFZJQV9GVU5DVElPTl9QQVJQT1JUX1NQUDsKLQkgICAgYnJlYWs7CisJCXByaW50ayhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBzZXR0aW5nIFNQUCBtb2RlXG4iKTsKKwkJc2lvZnVuYyA9IFZJQV9GVU5DVElPTl9QQVJQT1JUX1NQUDsKKwkJYnJlYWs7CiAJY2FzZSAyOgotCSAgICBwcmludGsoS0VSTl9ERUJVRyAicGFycG9ydF9wYzogc2V0dGluZyBQUy8yIG1vZGVcbiIpOwotCSAgICBzaW9mdW5jID0gVklBX0ZVTkNUSU9OX1BBUlBPUlRfU1BQOwotCSAgICBwcGNvbnRyb2wgPSBWSUFfUEFSUE9SVF9CSURJUjsKLQkgICAgYnJlYWs7CisJCXByaW50ayhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBzZXR0aW5nIFBTLzIgbW9kZVxuIik7CisJCXNpb2Z1bmMgPSBWSUFfRlVOQ1RJT05fUEFSUE9SVF9TUFA7CisJCXBwY29udHJvbCA9IFZJQV9QQVJQT1JUX0JJRElSOworCQlicmVhazsKIAljYXNlIDM6Ci0JICAgIHByaW50ayhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBzZXR0aW5nIEVQUCBtb2RlXG4iKTsKLQkgICAgc2lvZnVuYyA9IFZJQV9GVU5DVElPTl9QQVJQT1JUX0VQUDsKLQkgICAgcHBjb250cm9sID0gVklBX1BBUlBPUlRfQklESVI7Ci0JICAgIGhhdmVfZXBwID0gMTsKLQkgICAgYnJlYWs7CisJCXByaW50ayhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBzZXR0aW5nIEVQUCBtb2RlXG4iKTsKKwkJc2lvZnVuYyA9IFZJQV9GVU5DVElPTl9QQVJQT1JUX0VQUDsKKwkJcHBjb250cm9sID0gVklBX1BBUlBPUlRfQklESVI7CisJCWhhdmVfZXBwID0gMTsKKwkJYnJlYWs7CiAJY2FzZSA0OgotCSAgICBwcmludGsoS0VSTl9ERUJVRyAicGFycG9ydF9wYzogc2V0dGluZyBFQ1AgbW9kZVxuIik7Ci0JICAgIHNpb2Z1bmMgPSBWSUFfRlVOQ1RJT05fUEFSUE9SVF9FQ1A7Ci0JICAgIHBwY29udHJvbCA9IFZJQV9QQVJQT1JUX0JJRElSOwotCSAgICBicmVhazsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInBhcnBvcnRfcGM6IHNldHRpbmcgRUNQIG1vZGVcbiIpOworCQlzaW9mdW5jID0gVklBX0ZVTkNUSU9OX1BBUlBPUlRfRUNQOworCQlwcGNvbnRyb2wgPSBWSUFfUEFSUE9SVF9CSURJUjsKKwkJYnJlYWs7CiAJY2FzZSA1OgotCSAgICBwcmludGsoS0VSTl9ERUJVRyAicGFycG9ydF9wYzogc2V0dGluZyBFUFArRUNQIG1vZGVcbiIpOwotCSAgICBzaW9mdW5jID0gVklBX0ZVTkNUSU9OX1BBUlBPUlRfRUNQOwotCSAgICBwcGNvbnRyb2wgPSBWSUFfUEFSUE9SVF9CSURJUnxWSUFfUEFSUE9SVF9FQ1BFUFA7Ci0JICAgIGhhdmVfZXBwID0gMTsKLQkgICAgYnJlYWs7Ci0JIGRlZmF1bHQ6Ci0JICAgIHByaW50ayhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBwcm9iaW5nIGN1cnJlbnQgY29uZmlndXJhdGlvblxuIik7Ci0JICAgIHNpb2Z1bmMgPSBWSUFfRlVOQ1RJT05fUFJPQkU7Ci0JICAgIGJyZWFrOworCQlwcmludGsoS0VSTl9ERUJVRyAicGFycG9ydF9wYzogc2V0dGluZyBFUFArRUNQIG1vZGVcbiIpOworCQlzaW9mdW5jID0gVklBX0ZVTkNUSU9OX1BBUlBPUlRfRUNQOworCQlwcGNvbnRyb2wgPSBWSUFfUEFSUE9SVF9CSURJUnxWSUFfUEFSUE9SVF9FQ1BFUFA7CisJCWhhdmVfZXBwID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSJwYXJwb3J0X3BjOiBwcm9iaW5nIGN1cnJlbnQgY29uZmlndXJhdGlvblxuIik7CisJCXNpb2Z1bmMgPSBWSUFfRlVOQ1RJT05fUFJPQkU7CisJCWJyZWFrOwogCX0KIAkvKgogCSAqIHVubG9jayBzdXBlciBpL28gY29uZmlndXJhdGlvbgpAQCAtMjYyMiwzOCArMjcwNiwzNiBAQAogCiAJLyogQml0cyAxLTA6IFBhcmFsbGVsIFBvcnQgTW9kZSAvIEVuYWJsZSAqLwogCW91dGIodmlhLT52aWFjZmdfZnVuY3Rpb24sIFZJQV9DT05GSUdfSU5ERVgpOwotCXRtcCA9IGluYiAoVklBX0NPTkZJR19EQVRBKTsKKwl0bXAgPSBpbmIoVklBX0NPTkZJR19EQVRBKTsKIAkvKiBCaXQgNTogRVBQK0VDUCBlbmFibGU7IGJpdCA3OiBQUy8yIGJpZGlyZWN0aW9uYWwgcG9ydCBlbmFibGUgKi8KIAlvdXRiKHZpYS0+dmlhY2ZnX3BhcnBvcnRfY29udHJvbCwgVklBX0NPTkZJR19JTkRFWCk7Ci0JdG1wMiA9IGluYiAoVklBX0NPTkZJR19EQVRBKTsKLQlpZiAoc2lvZnVuYyA9PSBWSUFfRlVOQ1RJT05fUFJPQkUpCi0JewotCSAgICBzaW9mdW5jID0gdG1wICYgVklBX0ZVTkNUSU9OX1BBUlBPUlRfRElTQUJMRTsKLQkgICAgcHBjb250cm9sID0gdG1wMjsKKwl0bXAyID0gaW5iKFZJQV9DT05GSUdfREFUQSk7CisJaWYgKHNpb2Z1bmMgPT0gVklBX0ZVTkNUSU9OX1BST0JFKSB7CisJCXNpb2Z1bmMgPSB0bXAgJiBWSUFfRlVOQ1RJT05fUEFSUE9SVF9ESVNBQkxFOworCQlwcGNvbnRyb2wgPSB0bXAyOworCX0gZWxzZSB7CisJCXRtcCAmPSB+VklBX0ZVTkNUSU9OX1BBUlBPUlRfRElTQUJMRTsKKwkJdG1wIHw9IHNpb2Z1bmM7CisJCW91dGIodmlhLT52aWFjZmdfZnVuY3Rpb24sIFZJQV9DT05GSUdfSU5ERVgpOworCQlvdXRiKHRtcCwgVklBX0NPTkZJR19EQVRBKTsKKwkJdG1wMiAmPSB+KFZJQV9QQVJQT1JUX0JJRElSfFZJQV9QQVJQT1JUX0VDUEVQUCk7CisJCXRtcDIgfD0gcHBjb250cm9sOworCQlvdXRiKHZpYS0+dmlhY2ZnX3BhcnBvcnRfY29udHJvbCwgVklBX0NPTkZJR19JTkRFWCk7CisJCW91dGIodG1wMiwgVklBX0NPTkZJR19EQVRBKTsKIAl9Ci0JZWxzZQotCXsKLQkgICAgdG1wICY9IH5WSUFfRlVOQ1RJT05fUEFSUE9SVF9ESVNBQkxFOwotCSAgICB0bXAgfD0gc2lvZnVuYzsKLQkgICAgb3V0Yih2aWEtPnZpYWNmZ19mdW5jdGlvbiwgVklBX0NPTkZJR19JTkRFWCk7Ci0JICAgIG91dGIodG1wLCBWSUFfQ09ORklHX0RBVEEpOwotCSAgICB0bXAyICY9IH4oVklBX1BBUlBPUlRfQklESVJ8VklBX1BBUlBPUlRfRUNQRVBQKTsKLQkgICAgdG1wMiB8PSBwcGNvbnRyb2w7Ci0JICAgIG91dGIodmlhLT52aWFjZmdfcGFycG9ydF9jb250cm9sLCBWSUFfQ09ORklHX0lOREVYKTsKLQkgICAgb3V0Yih0bXAyLCBWSUFfQ09ORklHX0RBVEEpOwotCX0KLQkKKwogCS8qIFBhcmFsbGVsIFBvcnQgSS9PIEJhc2UgQWRkcmVzcywgYml0cyA5LTIgKi8KIAlvdXRiKHZpYS0+dmlhY2ZnX3BhcnBvcnRfYmFzZSwgVklBX0NPTkZJR19JTkRFWCk7CiAJcG9ydDEgPSBpbmIoVklBX0NPTkZJR19EQVRBKSA8PCAyOwotCQotCXByaW50ayAoS0VSTl9ERUJVRyAicGFycG9ydF9wYzogQ3VycmVudCBwYXJhbGxlbCBwb3J0IGJhc2U6IDB4JVhcbiIscG9ydDEpOwotCWlmICgocG9ydDEgPT0gMHgzQkMpICYmIGhhdmVfZXBwKQotCXsKLQkgICAgb3V0Yih2aWEtPnZpYWNmZ19wYXJwb3J0X2Jhc2UsIFZJQV9DT05GSUdfSU5ERVgpOwotCSAgICBvdXRiKCgweDM3OCA+PiAyKSwgVklBX0NPTkZJR19EQVRBKTsKLQkgICAgcHJpbnRrKEtFUk5fREVCVUcgInBhcnBvcnRfcGM6IFBhcmFsbGVsIHBvcnQgYmFzZSBjaGFuZ2VkIHRvIDB4Mzc4XG4iKTsKLQkgICAgcG9ydDEgPSAweDM3ODsKKworCXByaW50ayhLRVJOX0RFQlVHICJwYXJwb3J0X3BjOiBDdXJyZW50IHBhcmFsbGVsIHBvcnQgYmFzZTogMHglWFxuIiwKKwkJCQkJCQkJCXBvcnQxKTsKKwlpZiAocG9ydDEgPT0gMHgzQkMgJiYgaGF2ZV9lcHApIHsKKwkJb3V0Yih2aWEtPnZpYWNmZ19wYXJwb3J0X2Jhc2UsIFZJQV9DT05GSUdfSU5ERVgpOworCQlvdXRiKCgweDM3OCA+PiAyKSwgVklBX0NPTkZJR19EQVRBKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSJwYXJwb3J0X3BjOiBQYXJhbGxlbCBwb3J0IGJhc2UgY2hhbmdlZCB0byAweDM3OFxuIik7CisJCXBvcnQxID0gMHgzNzg7CiAJfQogCiAJLyoKQEAgLTI2NjcsMzYgKzI3NDksMzkgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAicGFycG9ydF9wYzogVklBIHBhcmFsbGVsIHBvcnQgZGlzYWJsZWQgaW4gQklPU1xuIik7CiAJCXJldHVybiAwOwogCX0KLQkKKwogCS8qIEJpdHMgNy00OiBQblAgUm91dGluZyBmb3IgUGFyYWxsZWwgUG9ydCBJUlEgKi8KIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCB2aWEtPnZpYV9wY2lfcGFycG9ydF9pcnFfcmVnLCAmdG1wKTsKIAlpcnEgPSAoKHRtcCAmIFZJQV9JUlFDT05UUk9MX1BBUkFMTEVMKSA+PiA0KTsKIAotCWlmIChzaW9mdW5jID09IFZJQV9GVU5DVElPTl9QQVJQT1JUX0VDUCkKLQl7Ci0JICAgIC8qIEJpdHMgMy0yOiBQblAgUm91dGluZyBmb3IgUGFyYWxsZWwgUG9ydCBETUEgKi8KLQkgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgdmlhLT52aWFfcGNpX3BhcnBvcnRfZG1hX3JlZywgJnRtcCk7Ci0JICAgIGRtYSA9ICgodG1wICYgVklBX0RNQUNPTlRST0xfUEFSQUxMRUwpID4+IDIpOwotCX0KLQllbHNlCi0JICAgIC8qIGlmIEVDUCBub3QgZW5hYmxlZCwgRE1BIGlzIG5vdCBlbmFibGVkLCBhc3N1bWVkIGJvZ3VzICdkbWEnIHZhbHVlICovCi0JICAgIGRtYSA9IFBBUlBPUlRfRE1BX05PTkU7CisJaWYgKHNpb2Z1bmMgPT0gVklBX0ZVTkNUSU9OX1BBUlBPUlRfRUNQKSB7CisJCS8qIEJpdHMgMy0yOiBQblAgUm91dGluZyBmb3IgUGFyYWxsZWwgUG9ydCBETUEgKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgdmlhLT52aWFfcGNpX3BhcnBvcnRfZG1hX3JlZywgJnRtcCk7CisJCWRtYSA9ICgodG1wICYgVklBX0RNQUNPTlRST0xfUEFSQUxMRUwpID4+IDIpOworCX0gZWxzZQorCQkvKiBpZiBFQ1Agbm90IGVuYWJsZWQsIERNQSBpcyBub3QgZW5hYmxlZCwgYXNzdW1lZAorCQkgICBib2d1cyAnZG1hJyB2YWx1ZSAqLworCQlkbWEgPSBQQVJQT1JUX0RNQV9OT05FOwogCiAJLyogTGV0IHRoZSB1c2VyIChvciBkZWZhdWx0cykgc3RlZXIgdXMgYXdheSBmcm9tIGludGVycnVwdHMgYW5kIERNQSAqLwogCWlmIChhdXRvaXJxID09IFBBUlBPUlRfSVJRX05PTkUpIHsKLQkgICAgaXJxID0gUEFSUE9SVF9JUlFfTk9ORTsKLQkgICAgZG1hID0gUEFSUE9SVF9ETUFfTk9ORTsKKwkJaXJxID0gUEFSUE9SVF9JUlFfTk9ORTsKKwkJZG1hID0gUEFSUE9SVF9ETUFfTk9ORTsKIAl9CiAJaWYgKGF1dG9kbWEgPT0gUEFSUE9SVF9ETUFfTk9ORSkKLQkgICAgZG1hID0gUEFSUE9SVF9ETUFfTk9ORTsKKwkJZG1hID0gUEFSUE9SVF9ETUFfTk9ORTsKIAogCXN3aXRjaCAocG9ydDEpIHsKLQljYXNlIDB4M2JjOiBwb3J0MiA9IDB4N2JjOyBicmVhazsKLQljYXNlIDB4Mzc4OiBwb3J0MiA9IDB4Nzc4OyBicmVhazsKLQljYXNlIDB4Mjc4OiBwb3J0MiA9IDB4Njc4OyBicmVhazsKKwljYXNlIDB4M2JjOgorCQlwb3J0MiA9IDB4N2JjOyBicmVhazsKKwljYXNlIDB4Mzc4OgorCQlwb3J0MiA9IDB4Nzc4OyBicmVhazsKKwljYXNlIDB4Mjc4OgorCQlwb3J0MiA9IDB4Njc4OyBicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJwYXJwb3J0X3BjOiBXZWlyZCBWSUEgcGFycG9ydCBiYXNlIDB4JVgsIGlnbm9yaW5nXG4iLAotCQkJcG9ydDEpOworCQlwcmludGsoS0VSTl9JTkZPCisJCQkicGFycG9ydF9wYzogV2VpcmQgVklBIHBhcnBvcnQgYmFzZSAweCVYLCBpZ25vcmluZ1xuIiwKKwkJCQkJCQkJCXBvcnQxKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yNzE0LDE3ICsyNzk5LDE3IEBACiAJfQogCiAJLyogZmluYWxseSwgZG8gdGhlIHByb2JlIHdpdGggdmFsdWVzIG9idGFpbmVkICovCi0JaWYgKHBhcnBvcnRfcGNfcHJvYmVfcG9ydCAocG9ydDEsIHBvcnQyLCBpcnEsIGRtYSwgJnBkZXYtPmRldiwgMCkpIHsKLQkJcHJpbnRrIChLRVJOX0lORk8KKwlpZiAocGFycG9ydF9wY19wcm9iZV9wb3J0KHBvcnQxLCBwb3J0MiwgaXJxLCBkbWEsICZwZGV2LT5kZXYsIDApKSB7CisJCXByaW50ayhLRVJOX0lORk8KIAkJCSJwYXJwb3J0X3BjOiBWSUEgcGFyYWxsZWwgcG9ydDogaW89MHglWCIsIHBvcnQxKTsKIAkJaWYgKGlycSAhPSBQQVJQT1JUX0lSUV9OT05FKQotCQkJcHJpbnRrICgiLCBpcnE9JWQiLCBpcnEpOworCQkJcHJpbnRrKCIsIGlycT0lZCIsIGlycSk7CiAJCWlmIChkbWEgIT0gUEFSUE9SVF9ETUFfTk9ORSkKLQkJCXByaW50ayAoIiwgZG1hPSVkIiwgZG1hKTsKLQkJcHJpbnRrICgiXG4iKTsKKwkJCXByaW50aygiLCBkbWE9JWQiLCBkbWEpOworCQlwcmludGsoIlxuIik7CiAJCXJldHVybiAxOwogCX0KLQkKKwogCXByaW50ayhLRVJOX1dBUk5JTkcgInBhcnBvcnRfcGM6IFN0cmFuZ2UsIGNhbid0IHByb2JlIFZJQSBwYXJhbGxlbCBwb3J0OiBpbz0weCVYLCBpcnE9JWQsIGRtYT0lZFxuIiwKIAkJcG9ydDEsIGlycSwgZG1hKTsKIAlyZXR1cm4gMDsKQEAgLTI3MzIsOCArMjgxNyw4IEBACiAKIAogZW51bSBwYXJwb3J0X3BjX3Npb190eXBlcyB7Ci0Jc2lvX3ZpYV82ODZhID0gMCwJLyogVmlhIFZUODJDNjg2QSBtb3RoZXJib2FyZCBTdXBlciBJL08gKi8KLQlzaW9fdmlhXzgyMzEsCQkvKiBWaWEgVlQ4MjMxIHNvdXRoIGJyaWRnZSBpbnRlZ3JhdGVkIFN1cGVyIElPICovCisJc2lvX3ZpYV82ODZhID0gMCwgICAvKiBWaWEgVlQ4MkM2ODZBIG1vdGhlcmJvYXJkIFN1cGVyIEkvTyAqLworCXNpb192aWFfODIzMSwJICAgIC8qIFZpYSBWVDgyMzEgc291dGggYnJpZGdlIGludGVncmF0ZWQgU3VwZXIgSU8gKi8KIAlzaW9faXRlXzg4NzIsCiAJbGFzdF9zaW8KIH07CkBAIC0yODA0LDE1ICsyODg5LDE1IEBACiB9OwogCiAKLS8qIGVhY2ggZWxlbWVudCBkaXJlY3RseSBpbmRleGVkIGZyb20gZW51bSBsaXN0LCBhYm92ZSAKKy8qIGVhY2ggZWxlbWVudCBkaXJlY3RseSBpbmRleGVkIGZyb20gZW51bSBsaXN0LCBhYm92ZQogICogKGJ1dCBvZmZzZXQgYnkgbGFzdF9zaW8pICovCiBzdGF0aWMgc3RydWN0IHBhcnBvcnRfcGNfcGNpIHsKIAlpbnQgbnVtcG9ydHM7CiAJc3RydWN0IHsgLyogQkFSIChiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzKSBudW1iZXJzIGluIHRoZSBjb25maWcKLSAgICAgICAgICAgICAgICAgICAgc3BhY2UgaGVhZGVyICovCisJCSAgICBzcGFjZSBoZWFkZXIgKi8KIAkJaW50IGxvOwotCQlpbnQgaGk7IC8qIC0xIGlmIG5vdCB0aGVyZSwgPjYgZm9yIG9mZnNldC1tZXRob2QgKG1heAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFSIGlzIDYpICovCisJCWludCBoaTsKKwkJLyogLTEgaWYgbm90IHRoZXJlLCA+NiBmb3Igb2Zmc2V0LW1ldGhvZCAobWF4IEJBUiBpcyA2KSAqLwogCX0gYWRkcls0XTsKIAogCS8qIElmIHNldCwgdGhpcyBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcGNpX2VuYWJsZV9kZXZpY2UuCkBAIC0yODU3LDcgKzI5NDIsNyBAQAogCS8qIHRpbWVkaWFfNDAxOCAgKi8gICAgICAgICAgICAgeyAyLCB7IHsgMCwgMSB9LCB7IDIsIDMgfSwgfSB9LAogCS8qIHRpbWVkaWFfOTAxOGEgKi8gICAgICAgICAgICAgeyAyLCB7IHsgMCwgMSB9LCB7IDIsIDMgfSwgfSB9LAogCQkJCQkvKiBTWUJBIHVzZXMgZml4ZWQgb2Zmc2V0cyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgMUsgaW8gd2luZG93ICovCisJCQkJCSAgIGEgMUsgaW8gd2luZG93ICovCiAJLyogc3liYV8ycF9lcHAgQVAxMzhCICovCXsgMiwgeyB7IDAsIDB4MDc4IH0sIHsgMCwgMHgxNzggfSwgfSB9LAogCS8qIHN5YmFfMXBfZWNwIFc4Mzc4NyAqLwl7IDEsIHsgeyAwLCAweDA3OCB9LCB9IH0sCiAJLyogdGl0YW5fMDEwbCAqLwkJeyAxLCB7IHsgMywgLTEgfSwgfSB9LApAQCAtMjg3MywxMSArMjk1OCwxNCBAQAogCS8qIG94c2VtaV9wY2llX3Bwb3J0ICovCQl7IDEsIHsgeyAwLCAxIH0sIH0gfSwKIAkvKiBha3NfMDEwMCAqLyAgICAgICAgICAgICAgICAgIHsgMSwgeyB7IDAsIC0xIH0sIH0gfSwKIAkvKiBtb2JpbGl0eV9wcCAqLwkJeyAxLCB7IHsgMCwgMSB9LCB9IH0sCi0JLyogbmV0bW9zXzk3MDUgKi8gICAgICAgICAgICAgICB7IDEsIHsgeyAwLCAtMSB9LCB9IH0sIC8qIHVudGVzdGVkICovCi0gICAgICAgIC8qIG5ldG1vc185NzE1ICovICAgICAgICAgICAgICAgeyAyLCB7IHsgMCwgMSB9LCB7IDIsIDMgfSx9IH0sIC8qIHVudGVzdGVkICovCi0gICAgICAgIC8qIG5ldG1vc185NzU1ICovICAgICAgICAgICAgICAgeyAyLCB7IHsgMCwgMSB9LCB7IDIsIDMgfSx9IH0sIC8qIHVudGVzdGVkICovCi0JLyogbmV0bW9zXzk4MDUgKi8gICAgICAgICAgICAgICB7IDEsIHsgeyAwLCAtMSB9LCB9IH0sIC8qIHVudGVzdGVkICovCi0JLyogbmV0bW9zXzk4MTUgKi8gICAgICAgICAgICAgICB7IDIsIHsgeyAwLCAtMSB9LCB7IDIsIC0xIH0sIH0gfSwgLyogdW50ZXN0ZWQgKi8KKworCS8qIFRoZSBuZXRtb3MgZW50cmllcyBiZWxvdyBhcmUgdW50ZXN0ZWQgKi8KKwkvKiBuZXRtb3NfOTcwNSAqLyAgICAgICAgICAgICAgIHsgMSwgeyB7IDAsIC0xIH0sIH0gfSwKKwkvKiBuZXRtb3NfOTcxNSAqLyAgICAgICAgICAgICAgIHsgMiwgeyB7IDAsIDEgfSwgeyAyLCAzIH0sfSB9LAorCS8qIG5ldG1vc185NzU1ICovICAgICAgICAgICAgICAgeyAyLCB7IHsgMCwgMSB9LCB7IDIsIDMgfSx9IH0sCisJLyogbmV0bW9zXzk4MDUgKi8gICAgICAgICAgICAgICB7IDEsIHsgeyAwLCAtMSB9LCB9IH0sCisJLyogbmV0bW9zXzk4MTUgKi8gICAgICAgICAgICAgICB7IDIsIHsgeyAwLCAtMSB9LCB7IDIsIC0xIH0sIH0gfSwKKwogCS8qIHF1YXRlY2hfc3BweHAxMDAgKi8JCXsgMSwgeyB7IDAsIDEgfSwgfSB9LAogfTsKIApAQCAtMjkwNiw3ICsyOTk0LDcgQEAKIAl7IFBDSV9WRU5ET1JfSURfTEFWQSwgUENJX0RFVklDRV9JRF9MQVZBX0JPQ0FfSU9QUEFSLAogCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgYm9jYV9pb3BwYXIgfSwKIAl7IFBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAotCSAgUENJX1NVQlZFTkRPUl9JRF9FWFNZUywgUENJX1NVQkRFVklDRV9JRF9FWFNZU180MDE0LCAwLDAsIHBseF85MDUwIH0sCisJICBQQ0lfU1VCVkVORE9SX0lEX0VYU1lTLCBQQ0lfU1VCREVWSUNFX0lEX0VYU1lTXzQwMTQsIDAsIDAsIHBseF85MDUwIH0sCiAJLyogUENJX1ZFTkRPUl9JRF9USU1FRElBL1NVTklYIGhhcyBtYW55IGRpZmZlcmluZyBjYXJkcyAuLi4qLwogCXsgMHgxNDA5LCAweDcxNjgsIDB4MTQwOSwgMHg0MDc4LCAwLCAwLCB0aW1lZGlhXzQwNzhhIH0sCiAJeyAweDE0MDksIDB4NzE2OCwgMHgxNDA5LCAweDQwNzksIDAsIDAsIHRpbWVkaWFfNDA3OWggfSwKQEAgLTI5NDAsNyArMzAyOCw4IEBACiAJeyAweDk3MTAsIDB4OTgwNSwgMHgxMDAwLCAweDAwMTAsIDAsIDAsIHRpdGFuXzEyODRwMSB9LAogCXsgMHg5NzEwLCAweDk4MTUsIDB4MTAwMCwgMHgwMDIwLCAwLCAwLCB0aXRhbl8xMjg0cDIgfSwKIAkvKiBQQ0lfVkVORE9SX0lEX0FWTEFCL0ludGVrMjEgaGFzIGFub3RoZXIgYnVuY2ggb2YgY2FyZHMgLi4uKi8KLQl7IDB4MTRkYiwgMHgyMTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBhdmxhYl8xcH0sIC8qIEFGQVZMQUJfVEs5OTAyICovCisJLyogQUZBVkxBQl9USzk5MDIgKi8KKwl7IDB4MTRkYiwgMHgyMTIwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBhdmxhYl8xcH0sCiAJeyAweDE0ZGIsIDB4MjEyMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgYXZsYWJfMnB9LAogCXsgUENJX1ZFTkRPUl9JRF9PWFNFTUksIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzE2UENJOTUyUFAsCiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBveHNlbWlfOTUyIH0sCkBAIC0yOTgzLDE0ICszMDcyLDE0IEBACiAJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBxdWF0ZWNoX3NwcHhwMTAwIH0sCiAJeyAwLCB9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2kscGFycG9ydF9wY19wY2lfdGJsKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBwYXJwb3J0X3BjX3BjaV90YmwpOwogCiBzdHJ1Y3QgcGNpX3BhcnBvcnRfZGF0YSB7CiAJaW50IG51bTsKIAlzdHJ1Y3QgcGFycG9ydCAqcG9ydHNbMl07CiB9OwogCi1zdGF0aWMgaW50IHBhcnBvcnRfcGNfcGNpX3Byb2JlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorc3RhdGljIGludCBwYXJwb3J0X3BjX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJaW50IGVyciwgY291bnQsIG4sIGkgPSBpZC0+ZHJpdmVyX2RhdGE7CkBAIC0zMDAzLDcgKzMwOTIsOCBAQAogCS8qIFRoaXMgaXMgYSBQQ0kgY2FyZCAqLwogCWkgLT0gbGFzdF9zaW87CiAJY291bnQgPSAwOwotCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UgKGRldikpICE9IDApCisJZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCiAJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwY2lfcGFycG9ydF9kYXRhKSwgR0ZQX0tFUk5FTCk7CkBAIC0zMDExLDcgKzMxMDEsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChjYXJkc1tpXS5wcmVpbml0X2hvb2sgJiYKLQkgICAgY2FyZHNbaV0ucHJlaW5pdF9ob29rIChkZXYsIFBBUlBPUlRfSVJRX05PTkUsIFBBUlBPUlRfRE1BX05PTkUpKSB7CisJICAgIGNhcmRzW2ldLnByZWluaXRfaG9vayhkZXYsIFBBUlBPUlRfSVJRX05PTkUsIFBBUlBPUlRfRE1BX05PTkUpKSB7CiAJCWtmcmVlKGRhdGEpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0zMDIxLDI1ICszMTExLDI1IEBACiAJCWludCBoaSA9IGNhcmRzW2ldLmFkZHJbbl0uaGk7CiAJCWludCBpcnE7CiAJCXVuc2lnbmVkIGxvbmcgaW9fbG8sIGlvX2hpOwotCQlpb19sbyA9IHBjaV9yZXNvdXJjZV9zdGFydCAoZGV2LCBsbyk7CisJCWlvX2xvID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgbG8pOwogCQlpb19oaSA9IDA7CiAJCWlmICgoaGkgPj0gMCkgJiYgKGhpIDw9IDYpKQotCQkJaW9faGkgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKGRldiwgaGkpOworCQkJaW9faGkgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBoaSk7CiAJCWVsc2UgaWYgKGhpID4gNikKIAkJCWlvX2xvICs9IGhpOyAvKiBSZWludGVycHJldCB0aGUgbWVhbmluZyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaSIgYXMgYW4gb2Zmc2V0IChzZWUgU1lCQQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZi4pICovCisJCQkJCSJoaSIgYXMgYW4gb2Zmc2V0IChzZWUgU1lCQQorCQkJCQlkZWYuKSAqLwogCQkvKiBUT0RPOiB0ZXN0IGlmIHNoYXJpbmcgaW50ZXJydXB0cyB3b3JrcyAqLwogCQlpcnEgPSBkZXYtPmlycTsKIAkJaWYgKGlycSA9PSBJUlFfTk9ORSkgewotCQkJcHJpbnRrIChLRVJOX0RFQlVHCisJCQlwcmludGsoS0VSTl9ERUJVRwogCSJQQ0kgcGFyYWxsZWwgcG9ydCBkZXRlY3RlZDogJTA0eDolMDR4LCBJL08gYXQgJSNseCglI2x4KVxuIiwKIAkJCQlwYXJwb3J0X3BjX3BjaV90YmxbaSArIGxhc3Rfc2lvXS52ZW5kb3IsCiAJCQkJcGFycG9ydF9wY19wY2lfdGJsW2kgKyBsYXN0X3Npb10uZGV2aWNlLAogCQkJCWlvX2xvLCBpb19oaSk7CiAJCQlpcnEgPSBQQVJQT1JUX0lSUV9OT05FOwogCQl9IGVsc2UgewotCQkJcHJpbnRrIChLRVJOX0RFQlVHCisJCQlwcmludGsoS0VSTl9ERUJVRwogCSJQQ0kgcGFyYWxsZWwgcG9ydCBkZXRlY3RlZDogJTA0eDolMDR4LCBJL08gYXQgJSNseCglI2x4KSwgSVJRICVkXG4iLAogCQkJCXBhcnBvcnRfcGNfcGNpX3RibFtpICsgbGFzdF9zaW9dLnZlbmRvciwKIAkJCQlwYXJwb3J0X3BjX3BjaV90YmxbaSArIGxhc3Rfc2lvXS5kZXZpY2UsCkBAIC0zMDU2LDcgKzMxNDYsNyBAQAogCWRhdGEtPm51bSA9IGNvdW50OwogCiAJaWYgKGNhcmRzW2ldLnBvc3Rpbml0X2hvb2spCi0JCWNhcmRzW2ldLnBvc3Rpbml0X2hvb2sgKGRldiwgY291bnQgPT0gMCk7CisJCWNhcmRzW2ldLnBvc3Rpbml0X2hvb2soZGV2LCBjb3VudCA9PSAwKTsKIAogCWlmIChjb3VudCkgewogCQlwY2lfc2V0X2RydmRhdGEoZGV2LCBkYXRhKTsKQEAgLTMwOTAsNyArMzE4MCw3IEBACiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChwYXJwb3J0X3BjX3BjaV9yZW1vdmUpLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcGFycG9ydF9wY19pbml0X3N1cGVyaW8gKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkKK3N0YXRpYyBpbnQgX19pbml0IHBhcnBvcnRfcGNfaW5pdF9zdXBlcmlvKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkKIHsKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwpAQCAtMzEwMSw4ICszMTkxLDkgQEAKIAkJaWYgKGlkID09IE5VTEwgfHwgaWQtPmRyaXZlcl9kYXRhID49IGxhc3Rfc2lvKQogCQkJY29udGludWU7CiAKLQkJaWYgKHBhcnBvcnRfcGNfc3VwZXJpb19pbmZvW2lkLT5kcml2ZXJfZGF0YV0ucHJvYmUKLQkJCShwZGV2LCBhdXRvaXJxLCBhdXRvZG1hLHBhcnBvcnRfcGNfc3VwZXJpb19pbmZvW2lkLT5kcml2ZXJfZGF0YV0udmlhKSkgeworCQlpZiAocGFycG9ydF9wY19zdXBlcmlvX2luZm9baWQtPmRyaXZlcl9kYXRhXS5wcm9iZSgKKwkJCXBkZXYsIGF1dG9pcnEsIGF1dG9kbWEsCisJCQlwYXJwb3J0X3BjX3N1cGVyaW9faW5mb1tpZC0+ZHJpdmVyX2RhdGFdLnZpYSkpIHsKIAkJCXJldCsrOwogCQl9CiAJfQpAQCAtMzExMSw3ICszMjAyLDEwIEBACiB9CiAjZWxzZQogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHBhcnBvcnRfcGNfcGNpX2RyaXZlcjsKLXN0YXRpYyBpbnQgX19pbml0IHBhcnBvcnRfcGNfaW5pdF9zdXBlcmlvKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkge3JldHVybiAwO30KK3N0YXRpYyBpbnQgX19pbml0IHBhcnBvcnRfcGNfaW5pdF9zdXBlcmlvKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKICNpZmRlZiBDT05GSUdfUE5QCkBAIC0zMTI0LDQ0ICszMjE4LDQ1IEBACiAJeyB9CiB9OwogCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBucCxwYXJwb3J0X3BjX3BucF90YmwpOworTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIHBhcnBvcnRfcGNfcG5wX3RibCk7CiAKLXN0YXRpYyBpbnQgcGFycG9ydF9wY19wbnBfcHJvYmUoc3RydWN0IHBucF9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBwYXJwb3J0X3BjX3BucF9wcm9iZShzdHJ1Y3QgcG5wX2RldiAqZGV2LAorCQkJCQkJY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBwYXJwb3J0ICpwZGF0YTsKIAl1bnNpZ25lZCBsb25nIGlvX2xvLCBpb19oaTsKIAlpbnQgZG1hLCBpcnE7CiAKLQlpZiAocG5wX3BvcnRfdmFsaWQoZGV2LDApICYmCi0JCSEocG5wX3BvcnRfZmxhZ3MoZGV2LDApICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkpIHsKLQkJaW9fbG8gPSBwbnBfcG9ydF9zdGFydChkZXYsMCk7CisJaWYgKHBucF9wb3J0X3ZhbGlkKGRldiwgMCkgJiYKKwkJIShwbnBfcG9ydF9mbGFncyhkZXYsIDApICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkpIHsKKwkJaW9fbG8gPSBwbnBfcG9ydF9zdGFydChkZXYsIDApOwogCX0gZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChwbnBfcG9ydF92YWxpZChkZXYsMSkgJiYKLQkJIShwbnBfcG9ydF9mbGFncyhkZXYsMSkgJiBJT1JFU09VUkNFX0RJU0FCTEVEKSkgewotCQlpb19oaSA9IHBucF9wb3J0X3N0YXJ0KGRldiwxKTsKKwlpZiAocG5wX3BvcnRfdmFsaWQoZGV2LCAxKSAmJgorCQkhKHBucF9wb3J0X2ZsYWdzKGRldiwgMSkgJiBJT1JFU09VUkNFX0RJU0FCTEVEKSkgeworCQlpb19oaSA9IHBucF9wb3J0X3N0YXJ0KGRldiwgMSk7CiAJfSBlbHNlCiAJCWlvX2hpID0gMDsKIAotCWlmIChwbnBfaXJxX3ZhbGlkKGRldiwwKSAmJgotCQkhKHBucF9pcnFfZmxhZ3MoZGV2LDApICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkpIHsKLQkJaXJxID0gcG5wX2lycShkZXYsMCk7CisJaWYgKHBucF9pcnFfdmFsaWQoZGV2LCAwKSAmJgorCQkhKHBucF9pcnFfZmxhZ3MoZGV2LCAwKSAmIElPUkVTT1VSQ0VfRElTQUJMRUQpKSB7CisJCWlycSA9IHBucF9pcnEoZGV2LCAwKTsKIAl9IGVsc2UKIAkJaXJxID0gUEFSUE9SVF9JUlFfTk9ORTsKIAotCWlmIChwbnBfZG1hX3ZhbGlkKGRldiwwKSAmJgotCQkhKHBucF9kbWFfZmxhZ3MoZGV2LDApICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkpIHsKLQkJZG1hID0gcG5wX2RtYShkZXYsMCk7CisJaWYgKHBucF9kbWFfdmFsaWQoZGV2LCAwKSAmJgorCQkhKHBucF9kbWFfZmxhZ3MoZGV2LCAwKSAmIElPUkVTT1VSQ0VfRElTQUJMRUQpKSB7CisJCWRtYSA9IHBucF9kbWEoZGV2LCAwKTsKIAl9IGVsc2UKIAkJZG1hID0gUEFSUE9SVF9ETUFfTk9ORTsKIAogCWRldl9pbmZvKCZkZXYtPmRldiwgInJlcG9ydGVkIGJ5ICVzXG4iLCBkZXYtPnByb3RvY29sLT5uYW1lKTsKLQlpZiAoIShwZGF0YSA9IHBhcnBvcnRfcGNfcHJvYmVfcG9ydChpb19sbywgaW9faGksCi0JCQkJCWlycSwgZG1hLCAmZGV2LT5kZXYsIDApKSkKKwlwZGF0YSA9IHBhcnBvcnRfcGNfcHJvYmVfcG9ydChpb19sbywgaW9faGksIGlycSwgZG1hLCAmZGV2LT5kZXYsIDApOworCWlmIChwZGF0YSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBucF9zZXRfZHJ2ZGF0YShkZXYscGRhdGEpOworCXBucF9zZXRfZHJ2ZGF0YShkZXYsIHBkYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzIwMyw3ICszMjk4LDcgQEAKIAogLyogVGhpcyBpcyBjYWxsZWQgYnkgcGFycG9ydF9wY19maW5kX25vbnBjaV9wb3J0cyAoaW4gYXNtL3BhcnBvcnQuaCkgKi8KIHN0YXRpYyBpbnQgX19kZXZpbml0IF9fYXR0cmlidXRlX18oKHVudXNlZCkpCi1wYXJwb3J0X3BjX2ZpbmRfaXNhX3BvcnRzIChpbnQgYXV0b2lycSwgaW50IGF1dG9kbWEpCitwYXJwb3J0X3BjX2ZpbmRfaXNhX3BvcnRzKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkKIHsKIAlpbnQgY291bnQgPSAwOwogCkBAIC0zMjI3LDcgKzMzMjIsNyBAQAogICogYXV0b2lycSBpcyBQQVJQT1JUX0lSUV9OT05FLCBQQVJQT1JUX0lSUV9BVVRPLCBvciBQQVJQT1JUX0lSUV9QUk9CRU9OTFkKICAqIGF1dG9kbWEgaXMgUEFSUE9SVF9ETUFfTk9ORSBvciBQQVJQT1JUX0RNQV9BVVRPCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBwYXJwb3J0X3BjX2ZpbmRfcG9ydHMgKGludCBhdXRvaXJxLCBpbnQgYXV0b2RtYSkKK3N0YXRpYyB2b2lkIF9faW5pdCBwYXJwb3J0X3BjX2ZpbmRfcG9ydHMoaW50IGF1dG9pcnEsIGludCBhdXRvZG1hKQogewogCWludCBjb3VudCA9IDAsIGVycjsKIApAQCAtMzI2MSwxMSArMzM1NiwxOCBAQAogICoJc3ludGF4IGFuZCBrZWVwIGluIG1pbmQgdGhhdCBjb2RlIGJlbG93IGlzIGEgY2xlYW5lZCB1cCB2ZXJzaW9uLgogICovCiAKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpb1tQQVJQT1JUX1BDX01BWF9QT1JUUysxXSA9IHsgWzAgLi4uIFBBUlBPUlRfUENfTUFYX1BPUlRTXSA9IDAgfTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBpb19oaVtQQVJQT1JUX1BDX01BWF9QT1JUUysxXSA9Ci0JeyBbMCAuLi4gUEFSUE9SVF9QQ19NQVhfUE9SVFNdID0gUEFSUE9SVF9JT0hJX0FVVE8gfTsKLXN0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWF2YWxbUEFSUE9SVF9QQ19NQVhfUE9SVFNdID0geyBbMCAuLi4gUEFSUE9SVF9QQ19NQVhfUE9SVFMtMV0gPSBQQVJQT1JUX0RNQV9OT05FIH07Ci1zdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxdmFsW1BBUlBPUlRfUENfTUFYX1BPUlRTXSA9IHsgWzAgLi4uIFBBUlBPUlRfUENfTUFYX1BPUlRTLTFdID0gUEFSUE9SVF9JUlFfUFJPQkVPTkxZIH07CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW9bUEFSUE9SVF9QQ19NQVhfUE9SVFMrMV0gPSB7CisJWzAgLi4uIFBBUlBPUlRfUENfTUFYX1BPUlRTXSA9IDAKK307CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW9faGlbUEFSUE9SVF9QQ19NQVhfUE9SVFMrMV0gPSB7CisJWzAgLi4uIFBBUlBPUlRfUENfTUFYX1BPUlRTXSA9IFBBUlBPUlRfSU9ISV9BVVRPCit9Oworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYXZhbFtQQVJQT1JUX1BDX01BWF9QT1JUU10gPSB7CisJWzAgLi4uIFBBUlBPUlRfUENfTUFYX1BPUlRTLTFdID0gUEFSUE9SVF9ETUFfTk9ORQorfTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnF2YWxbUEFSUE9SVF9QQ19NQVhfUE9SVFNdID0geworCVswIC4uLiBQQVJQT1JUX1BDX01BWF9QT1JUUy0xXSA9IFBBUlBPUlRfSVJRX1BST0JFT05MWQorfTsKIAogc3RhdGljIGludCBfX2luaXQgcGFycG9ydF9wYXJzZV9wYXJhbShjb25zdCBjaGFyICpzLCBpbnQgKnZhbCwKIAkJCQlpbnQgYXV0b21hdGljLCBpbnQgbm9uZSwgaW50IG5vZmlmbykKQEAgLTMzMDYsMTggKzM0MDgsMTkgQEAKICNpZmRlZiBDT05GSUdfUENJCiBzdGF0aWMgaW50IF9faW5pdCBwYXJwb3J0X2luaXRfbW9kZV9zZXR1cChjaGFyICpzdHIpCiB7Ci0JcHJpbnRrKEtFUk5fREVCVUcgInBhcnBvcnRfcGMuYzogU3BlY2lmaWVkIHBhcmFtZXRlciBwYXJwb3J0X2luaXRfbW9kZT0lc1xuIiwgc3RyKTsKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgInBhcnBvcnRfcGMuYzogU3BlY2lmaWVkIHBhcmFtZXRlciBwYXJwb3J0X2luaXRfbW9kZT0lc1xuIiwgc3RyKTsKIAotCWlmICghc3RyY21wIChzdHIsICJzcHAiKSkKLQkJcGFycG9ydF9pbml0X21vZGU9MTsKLQlpZiAoIXN0cmNtcCAoc3RyLCAicHMyIikpCi0JCXBhcnBvcnRfaW5pdF9tb2RlPTI7Ci0JaWYgKCFzdHJjbXAgKHN0ciwgImVwcCIpKQotCQlwYXJwb3J0X2luaXRfbW9kZT0zOwotCWlmICghc3RyY21wIChzdHIsICJlY3AiKSkKLQkJcGFycG9ydF9pbml0X21vZGU9NDsKLQlpZiAoIXN0cmNtcCAoc3RyLCAiZWNwZXBwIikpCi0JCXBhcnBvcnRfaW5pdF9tb2RlPTU7CisJaWYgKCFzdHJjbXAoc3RyLCAic3BwIikpCisJCXBhcnBvcnRfaW5pdF9tb2RlID0gMTsKKwlpZiAoIXN0cmNtcChzdHIsICJwczIiKSkKKwkJcGFycG9ydF9pbml0X21vZGUgPSAyOworCWlmICghc3RyY21wKHN0ciwgImVwcCIpKQorCQlwYXJwb3J0X2luaXRfbW9kZSA9IDM7CisJaWYgKCFzdHJjbXAoc3RyLCAiZWNwIikpCisJCXBhcnBvcnRfaW5pdF9tb2RlID0gNDsKKwlpZiAoIXN0cmNtcChzdHIsICJlY3BlcHAiKSkKKwkJcGFycG9ydF9pbml0X21vZGUgPSA1OwogCXJldHVybiAxOwogfQogI2VuZGlmCkBAIC0zMzQxLDcgKzM0NDQsOCBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BDSQogc3RhdGljIGNoYXIgKmluaXRfbW9kZTsKLU1PRFVMRV9QQVJNX0RFU0MoaW5pdF9tb2RlLCAiSW5pdGlhbGlzZSBtb2RlIGZvciBWSUEgVlQ4MjMxIHBvcnQgKHNwcCwgcHMyLCBlcHAsIGVjcCBvciBlY3BlcHApIik7CitNT0RVTEVfUEFSTV9ERVNDKGluaXRfbW9kZSwKKwkiSW5pdGlhbGlzZSBtb2RlIGZvciBWSUEgVlQ4MjMxIHBvcnQgKHNwcCwgcHMyLCBlcHAsIGVjcCBvciBlY3BlcHApIik7CiBtb2R1bGVfcGFyYW0oaW5pdF9tb2RlLCBjaGFycCwgMCk7CiAjZW5kaWYKIApAQCAtMzM3Miw3ICszNDc2LDcgQEAKIAkJCQlpcnF2YWxbMF0gPSB2YWw7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJCQkicGFycG9ydF9wYzogaXJxIHNwZWNpZmllZCAiCiAJCQkJCSJ3aXRob3V0IGJhc2UgYWRkcmVzcy4gIFVzZSAnaW89JyAiCiAJCQkJCSJ0byBzcGVjaWZ5IG9uZVxuIik7CkBAIC0zMzg1LDcgKzM0ODksNyBAQAogCQkJCWRtYXZhbFswXSA9IHZhbDsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCiAJCQkJCSJwYXJwb3J0X3BjOiBkbWEgc3BlY2lmaWVkICIKIAkJCQkJIndpdGhvdXQgYmFzZSBhZGRyZXNzLiAgVXNlICdpbz0nICIKIAkJCQkJInRvIHNwZWNpZnkgb25lXG4iKTsKQEAgLTMzOTYsNyArMzUwMCw3IEBACiAKICNlbHNlCiAKLXN0YXRpYyBpbnQgcGFycG9ydF9zZXR1cF9wdHIgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IHBhcnBvcnRfc2V0dXBfcHRyIF9faW5pdGRhdGE7CiAKIC8qCiAgKiBBY2NlcHRhYmxlIHBhcmFtZXRlcnM6CkBAIC0zNDA3LDcgKzM1MTEsNyBAQAogICoKICAqIElSUS9ETUEgbWF5IGJlIG51bWVyaWMgb3IgJ2F1dG8nIG9yICdub25lJwogICovCi1zdGF0aWMgaW50IF9faW5pdCBwYXJwb3J0X3NldHVwIChjaGFyICpzdHIpCitzdGF0aWMgaW50IF9faW5pdCBwYXJwb3J0X3NldHVwKGNoYXIgKnN0cikKIHsKIAljaGFyICplbmRwdHI7CiAJY2hhciAqc2VwOwpAQCAtMzQxOSwxNSArMzUyMywxNSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlpZiAoIXN0cm5jbXAgKHN0ciwgImF1dG8iLCA0KSkgeworCWlmICghc3RybmNtcChzdHIsICJhdXRvIiwgNCkpIHsKIAkJaXJxdmFsWzBdID0gUEFSUE9SVF9JUlFfQVVUTzsKIAkJZG1hdmFsWzBdID0gUEFSUE9SVF9ETUFfQVVUTzsKIAkJcmV0dXJuIDE7CiAJfQogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwgKHN0ciwgJmVuZHB0ciwgMCk7CisJdmFsID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmZW5kcHRyLCAwKTsKIAlpZiAoZW5kcHRyID09IHN0cikgewotCQlwcmludGsgKEtFUk5fV0FSTklORyAicGFycG9ydD0lcyBub3QgdW5kZXJzdG9vZFxuIiwgc3RyKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicGFycG9ydD0lcyBub3QgdW5kZXJzdG9vZFxuIiwgc3RyKTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0zNDYxLDcgKzM1NjUsNyBAQAogCXJldHVybiBpb1swXSA9PSBQQVJQT1JUX0RJU0FCTEU7CiB9CiAKLV9fc2V0dXAgKCJwYXJwb3J0PSIsIHBhcnBvcnRfc2V0dXApOworX19zZXR1cCgicGFycG9ydD0iLCBwYXJwb3J0X3NldHVwKTsKIAogLyoKICAqIEFjY2VwdGFibGUgcGFyYW1ldGVyczoKQEAgLTM0NjksNyArMzU3Myw3IEBACiAgKiBwYXJwb3J0X2luaXRfbW9kZT1bc3BwfHBzMnxlcHB8ZWNwfGVjcGVwcF0KICAqLwogI2lmZGVmIENPTkZJR19QQ0kKLV9fc2V0dXAoInBhcnBvcnRfaW5pdF9tb2RlPSIscGFycG9ydF9pbml0X21vZGVfc2V0dXApOworX19zZXR1cCgicGFycG9ydF9pbml0X21vZGU9IiwgcGFycG9ydF9pbml0X21vZGVfc2V0dXApOwogI2VuZGlmCiAjZW5kaWYKIApAQCAtMzQ5MywxMyArMzU5NywxMyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgUEFSUE9SVF9QQ19NQVhfUE9SVFM7IGkrKykgewogCQkJaWYgKCFpb1tpXSkKIAkJCQlicmVhazsKLQkJCWlmICgoaW9faGlbaV0pID09IFBBUlBPUlRfSU9ISV9BVVRPKQotCQkJICAgICAgIGlvX2hpW2ldID0gMHg0MDAgKyBpb1tpXTsKKwkJCWlmIChpb19oaVtpXSA9PSBQQVJQT1JUX0lPSElfQVVUTykKKwkJCQlpb19oaVtpXSA9IDB4NDAwICsgaW9baV07CiAJCQlwYXJwb3J0X3BjX3Byb2JlX3BvcnQoaW9baV0sIGlvX2hpW2ldLAotCQkJCQkgIGlycXZhbFtpXSwgZG1hdmFsW2ldLCBOVUxMLCAwKTsKKwkJCQkJaXJxdmFsW2ldLCBkbWF2YWxbaV0sIE5VTEwsIDApOwogCQl9CiAJfSBlbHNlCi0JCXBhcnBvcnRfcGNfZmluZF9wb3J0cyAoaXJxdmFsWzBdLCBkbWF2YWxbMF0pOworCQlwYXJwb3J0X3BjX2ZpbmRfcG9ydHMoaXJxdmFsWzBdLCBkbWF2YWxbMF0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNTA3LDkgKzM2MTEsOSBAQAogc3RhdGljIHZvaWQgX19leGl0IHBhcnBvcnRfcGNfZXhpdCh2b2lkKQogewogCWlmIChwY2lfcmVnaXN0ZXJlZF9wYXJwb3J0KQotCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZwYXJwb3J0X3BjX3BjaV9kcml2ZXIpOworCQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnBhcnBvcnRfcGNfcGNpX2RyaXZlcik7CiAJaWYgKHBucF9yZWdpc3RlcmVkX3BhcnBvcnQpCi0JCXBucF91bnJlZ2lzdGVyX2RyaXZlciAoJnBhcnBvcnRfcGNfcG5wX2RyaXZlcik7CisJCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmcGFycG9ydF9wY19wbnBfZHJpdmVyKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcGFycG9ydF9wY19wbGF0Zm9ybV9kcml2ZXIpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZwb3J0c19saXN0KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfY29yZS5jCmluZGV4IGRkMThmODUuLjQyZTQyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9jb3JlLmMKQEAgLTE1Myw0NSArMTUzLDQ3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJZm9yIChsb29wID0gMDsgbG9vcCA8IGxlbjsgbG9vcCsrKSB7Ci0JCWlmICgoKmN1cl9zbG90KS0+bnVtYmVyID09IHJ0YWJsZS0+c2xvdHNbbG9vcF0uc2xvdCkgewotCQlpZiAoKCpjdXJfc2xvdCktPmJ1cyA9PSBydGFibGUtPnNsb3RzW2xvb3BdLmJ1cykgeworCQlpZiAoKCpjdXJfc2xvdCktPm51bWJlciA9PSBydGFibGUtPnNsb3RzW2xvb3BdLnNsb3QgJiYKKwkJICAgICgqY3VyX3Nsb3QpLT5idXMgPT0gcnRhYmxlLT5zbG90c1tsb29wXS5idXMpIHsKKwkJCXN0cnVjdCBpb19hcGljX2lycV9hdHRyIGlycV9hdHRyOworCiAJCQkoKmN1cl9zbG90KS0+ZGV2aWNlID0gUENJX1NMT1QocnRhYmxlLT5zbG90c1tsb29wXS5kZXZmbik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQkJCSgqY3VyX3Nsb3QpLT5pcnFbaV0gPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcigoaW50KSAoKmN1cl9zbG90KS0+YnVzLAotCQkJCQkJKGludCkgKCpjdXJfc2xvdCktPmRldmljZSwgaSk7CisJCQkJCQkoaW50KSAoKmN1cl9zbG90KS0+ZGV2aWNlLCBpLAorCQkJCQkJJmlycV9hdHRyKTsKIAotCQkJCWRlYnVnKCIoKmN1cl9zbG90KS0+aXJxWzBdID0gJXhcbiIsCi0JCQkJCQkoKmN1cl9zbG90KS0+aXJxWzBdKTsKLQkJCQlkZWJ1ZygiKCpjdXJfc2xvdCktPmlycVsxXSA9ICV4XG4iLAotCQkJCQkJKCpjdXJfc2xvdCktPmlycVsxXSk7Ci0JCQkJZGVidWcoIigqY3VyX3Nsb3QpLT5pcnFbMl0gPSAleFxuIiwKLQkJCQkJCSgqY3VyX3Nsb3QpLT5pcnFbMl0pOwotCQkJCWRlYnVnKCIoKmN1cl9zbG90KS0+aXJxWzNdID0gJXhcbiIsCi0JCQkJCQkoKmN1cl9zbG90KS0+aXJxWzNdKTsKKwkJCWRlYnVnKCIoKmN1cl9zbG90KS0+aXJxWzBdID0gJXhcbiIsCisJCQkJCSgqY3VyX3Nsb3QpLT5pcnFbMF0pOworCQkJZGVidWcoIigqY3VyX3Nsb3QpLT5pcnFbMV0gPSAleFxuIiwKKwkJCQkJKCpjdXJfc2xvdCktPmlycVsxXSk7CisJCQlkZWJ1ZygiKCpjdXJfc2xvdCktPmlycVsyXSA9ICV4XG4iLAorCQkJCQkoKmN1cl9zbG90KS0+aXJxWzJdKTsKKwkJCWRlYnVnKCIoKmN1cl9zbG90KS0+aXJxWzNdID0gJXhcbiIsCisJCQkJCSgqY3VyX3Nsb3QpLT5pcnFbM10pOwogCi0JCQkJZGVidWcoInJ0YWJsZS0+ZXhsdXNpdmVfaXJxcyA9ICV4XG4iLAorCQkJZGVidWcoInJ0YWJsZS0+ZXhsdXNpdmVfaXJxcyA9ICV4XG4iLAogCQkJCQlydGFibGUtPmV4Y2x1c2l2ZV9pcnFzKTsKLQkJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMF0uYml0bWFwID0gJXhcbiIsCisJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMF0uYml0bWFwID0gJXhcbiIsCiAJCQkJCXJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzBdLmJpdG1hcCk7Ci0JCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzFdLmJpdG1hcCA9ICV4XG4iLAorCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzFdLmJpdG1hcCA9ICV4XG4iLAogCQkJCQlydGFibGUtPnNsb3RzW2xvb3BdLmlycVsxXS5iaXRtYXApOwotCQkJCWRlYnVnKCJydGFibGUtPnNsb3RzW2xvb3BdLmlycVsyXS5iaXRtYXAgPSAleFxuIiwKKwkJCWRlYnVnKCJydGFibGUtPnNsb3RzW2xvb3BdLmlycVsyXS5iaXRtYXAgPSAleFxuIiwKIAkJCQkJcnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMl0uYml0bWFwKTsKLQkJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbM10uYml0bWFwID0gJXhcbiIsCisJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbM10uYml0bWFwID0gJXhcbiIsCiAJCQkJCXJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzNdLmJpdG1hcCk7CiAKLQkJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMF0ubGluayA9ICV4XG4iLAorCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzBdLmxpbmsgPSAleFxuIiwKIAkJCQkJcnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMF0ubGluayk7Ci0JCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzFdLmxpbmsgPSAleFxuIiwKKwkJCWRlYnVnKCJydGFibGUtPnNsb3RzW2xvb3BdLmlycVsxXS5saW5rID0gJXhcbiIsCiAJCQkJCXJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzFdLmxpbmspOwotCQkJCWRlYnVnKCJydGFibGUtPnNsb3RzW2xvb3BdLmlycVsyXS5saW5rID0gJXhcbiIsCisJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMl0ubGluayA9ICV4XG4iLAogCQkJCQlydGFibGUtPnNsb3RzW2xvb3BdLmlycVsyXS5saW5rKTsKLQkJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbM10ubGluayA9ICV4XG4iLAorCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzNdLmxpbmsgPSAleFxuIiwKIAkJCQkJcnRhYmxlLT5zbG90c1tsb29wXS5pcnFbM10ubGluayk7Ci0JCQkJZGVidWcoImVuZCBvZiBpbml0X2Rldm5vXG4iKTsKLQkJCQlrZnJlZShydGFibGUpOwotCQkJCXJldHVybiAwOwotCQkJfQorCQkJZGVidWcoImVuZCBvZiBpbml0X2Rldm5vXG4iKTsKKwkJCWtmcmVlKHJ0YWJsZSk7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaHRpcnEuYyBiL2RyaXZlcnMvcGNpL2h0aXJxLmMKaW5kZXggNjgwOGQ4My4uNzM3YTFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaHRpcnEuYworKysgYi9kcml2ZXJzL3BjaS9odGlycS5jCkBAIC05OCw2ICs5OCw3IEBACiAJaW50IG1heF9pcnE7CiAJaW50IHBvczsKIAlpbnQgaXJxOworCWludCBub2RlOwogCiAJcG9zID0gcGNpX2ZpbmRfaHRfY2FwYWJpbGl0eShkZXYsIEhUX0NBUFRZUEVfSVJRKTsKIAlpZiAoIXBvcykKQEAgLTEyNSw3ICsxMjYsOCBAQAogCWNmZy0+bXNnLmFkZHJlc3NfbG8gPSAweGZmZmZmZmZmOwogCWNmZy0+bXNnLmFkZHJlc3NfaGkgPSAweGZmZmZmZmZmOwogCi0JaXJxID0gY3JlYXRlX2lycSgpOworCW5vZGUgPSBkZXZfdG9fbm9kZSgmZGV2LT5kZXYpOworCWlycSA9IGNyZWF0ZV9pcnFfbnIoMCwgbm9kZSk7CiAKIAlpZiAoaXJxIDw9IDApIHsKIAkJa2ZyZWUoY2ZnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMgYi9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCmluZGV4IGE1NjNmYmUuLmNkMzg5MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKKysrIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwpAQCAtMTk3MiwxNSArMTk3Miw2IEBACiAJCX0KIAl9CiAKLSNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAotCWlmICghaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkgewotCQlyZXQgPSBlbmFibGVfaW50cl9yZW1hcHBpbmcoMCk7Ci0JCWlmIChyZXQpCi0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiSU9NTVU6IGVuYWJsZSBpbnRlcnJ1cHQgcmVtYXBwaW5nIGZhaWxlZFxuIik7Ci0JfQotI2VuZGlmCi0KIAkvKgogCSAqIEZvciBlYWNoIHJtcnIKIAkgKiAgIGZvciBlYWNoIGRldiBhdHRhY2hlZCB0byBybXJyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jIGIvZHJpdmVycy9wY2kvaW50cl9yZW1hcHBpbmcuYwppbmRleCBmNWUwZWE3Li4zYTBjYjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCisrKyBiL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMKQEAgLTE1LDYgKzE1LDE0IEBACiBzdGF0aWMgaW50IGlyX2lvYXBpY19udW07CiBpbnQgaW50cl9yZW1hcHBpbmdfZW5hYmxlZDsKIAorc3RhdGljIGludCBkaXNhYmxlX2ludHJlbWFwOworc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm9pbnRyZW1hcChjaGFyICpzdHIpCit7CisJZGlzYWJsZV9pbnRyZW1hcCA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibm9pbnRyZW1hcCIsIHNldHVwX25vaW50cmVtYXApOworCiBzdHJ1Y3QgaXJxXzJfaW9tbXUgewogCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CiAJdTE2IGlydGVfaW5kZXg7CkBAIC0yMywxNSArMzEsMTIgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19IQVJESVJRUwotc3RhdGljIHN0cnVjdCBpcnFfMl9pb21tdSAqZ2V0X29uZV9mcmVlX2lycV8yX2lvbW11KGludCBjcHUpCitzdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICpnZXRfb25lX2ZyZWVfaXJxXzJfaW9tbXUoaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV8yX2lvbW11ICppb21tdTsKLQlpbnQgbm9kZTsKLQotCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwogCiAJaW9tbXUgPSBremFsbG9jX25vZGUoc2l6ZW9mKCppb21tdSksIEdGUF9BVE9NSUMsIG5vZGUpOwotCXByaW50ayhLRVJOX0RFQlVHICJhbGxvYyBpcnFfMl9pb21tdSBvbiBjcHUgJWQgbm9kZSAlZFxuIiwgY3B1LCBub2RlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYWxsb2MgaXJxXzJfaW9tbXUgb24gbm9kZSAlZFxuIiwgbm9kZSk7CiAKIAlyZXR1cm4gaW9tbXU7CiB9CkBAIC00OCw3ICs1Myw3IEBACiAJcmV0dXJuIGRlc2MtPmlycV8yX2lvbW11OwogfQogCi1zdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICppcnFfMl9pb21tdV9hbGxvY19jcHUodW5zaWduZWQgaW50IGlycSwgaW50IGNwdSkKK3N0YXRpYyBzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV8yX2lvbW11X2FsbG9jX25vZGUodW5zaWduZWQgaW50IGlycSwgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXN0cnVjdCBpcnFfMl9pb21tdSAqaXJxX2lvbW11OwpAQCAtNTYsNyArNjEsNyBAQAogCS8qCiAJICogYWxsb2MgaXJxIGRlc2MgaWYgbm90IGFsbG9jYXRlZCBhbHJlYWR5LgogCSAqLwotCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19jcHUoaXJxLCBjcHUpOworCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKGlycSwgbm9kZSk7CiAJaWYgKCFkZXNjKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjIGZvciAlZFxuIiwgaXJxKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC02NSwxNCArNzAsMTQgQEAKIAlpcnFfaW9tbXUgPSBkZXNjLT5pcnFfMl9pb21tdTsKIAogCWlmICghaXJxX2lvbW11KQotCQlkZXNjLT5pcnFfMl9pb21tdSA9IGdldF9vbmVfZnJlZV9pcnFfMl9pb21tdShjcHUpOworCQlkZXNjLT5pcnFfMl9pb21tdSA9IGdldF9vbmVfZnJlZV9pcnFfMl9pb21tdShub2RlKTsKIAogCXJldHVybiBkZXNjLT5pcnFfMl9pb21tdTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfMl9pb21tdSAqaXJxXzJfaW9tbXVfYWxsb2ModW5zaWduZWQgaW50IGlycSkKIHsKLQlyZXR1cm4gaXJxXzJfaW9tbXVfYWxsb2NfY3B1KGlycSwgYm9vdF9jcHVfaWQpOworCXJldHVybiBpcnFfMl9pb21tdV9hbGxvY19ub2RlKGlycSwgY3B1X3RvX25vZGUoYm9vdF9jcHVfaWQpKTsKIH0KIAogI2Vsc2UgLyogIUNPTkZJR19TUEFSU0VfSVJRICovCkBAIC00MjMsMjAgKzQyOCw2IEBACiAJCSAgICAgIHJlYWRsLCAoc3RzICYgRE1BX0dTVFNfSVJUUFMpLCBzdHMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CiAKLQlpZiAobW9kZSA9PSAwKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOwotCi0JCS8qIGVuYWJsZSBjb21hcHRpYmxpdHkgZm9ybWF0IGludGVycnVwdCBwYXNzIHRocm91Z2ggKi8KLQkJY21kID0gaW9tbXUtPmdjbWQgfCBETUFfR0NNRF9DRkk7Ci0JCWlvbW11LT5nY21kIHw9IERNQV9HQ01EX0NGSTsKLQkJd3JpdGVsKGNtZCwgaW9tbXUtPnJlZyArIERNQVJfR0NNRF9SRUcpOwotCi0JCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsCi0JCQkgICAgICByZWFkbCwgKHN0cyAmIERNQV9HU1RTX0NGSVMpLCBzdHMpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0JfQotCiAJLyoKIAkgKiBnbG9iYWwgaW52YWxpZGF0aW9uIG9mIGludGVycnVwdCBlbnRyeSBjYWNoZSBiZWZvcmUgZW5hYmxpbmcKIAkgKiBpbnRlcnJ1cHQtcmVtYXBwaW5nLgpAQCAtNTE2LDYgKzUwNywyMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CiB9CiAKK2ludCBfX2luaXQgaW50cl9yZW1hcHBpbmdfc3VwcG9ydGVkKHZvaWQpCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCisJaWYgKGRpc2FibGVfaW50cmVtYXApCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKKwkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OworCisJCWlmICghZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCiBpbnQgX19pbml0IGVuYWJsZV9pbnRyX3JlbWFwcGluZyhpbnQgZWltKQogewogCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwppbmRleCBhZGYxNzg1Li43ZjIwN2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAl9CiAKIAlmbGFncyA9IGlycV9mbGFncyh0cmlnZ2VyaW5nLCBwb2xhcml0eSwgc2hhcmVhYmxlKTsKLQlpcnEgPSBhY3BpX3JlZ2lzdGVyX2dzaShnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKKwlpcnEgPSBhY3BpX3JlZ2lzdGVyX2dzaSgmZGV2LT5kZXYsIGdzaSwgdHJpZ2dlcmluZywgcG9sYXJpdHkpOwogCWlmIChpcnEgPj0gMCkKIAkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGlycSwgMSk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25maWcKaW5kZXggNGU5ODUxZi4uMjc3ZDM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC02OTIsNyArNjkyLDcgQEAKIAl0cmlzdGF0ZSAiR2VuZXJpYyBSVEMgc3VwcG9ydCIKIAkjIFBsZWFzZSBjb25zaWRlciB3cml0aW5nIGEgbmV3IFJUQyBkcml2ZXIgaW5zdGVhZCBvZiB1c2luZyB0aGUgZ2VuZXJpYwogCSMgUlRDIGFic3RyYWN0aW9uCi0JZGVwZW5kcyBvbiBQQVJJU0MgfHwgTTY4SyB8fCBQUEMKKwlkZXBlbmRzIG9uIFBBUklTQyB8fCBNNjhLIHx8IFBQQyB8fCBTVVBFUkgzMgogCWhlbHAKIAkgIFNheSBZIG9yIE0gaGVyZSB0byBlbmFibGUgUlRDIHN1cHBvcnQgb24gc3lzdGVtcyB1c2luZyB0aGUgZ2VuZXJpYwogCSAgUlRDIGFic3RyYWN0aW9uLiBJZiB5b3UgZG8gbm90IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLCB5b3Ugc2hvdWxkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCBkMTgxNTI3Li4yN2ExYmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTYwMyw3ICs2MDMsNyBAQAogCWlmIChkYXNkX3Byb2ZpbGVfbGV2ZWwgIT0gREFTRF9QUk9GSUxFX09OKQogCQlyZXR1cm47CiAKLQlzZWN0b3JzID0gcmVxLT5ucl9zZWN0b3JzOworCXNlY3RvcnMgPSBibGtfcnFfc2VjdG9ycyhyZXEpOwogCWlmICghY3FyLT5idWlsZGNsayB8fCAhY3FyLT5zdGFydGNsayB8fAogCSAgICAhY3FyLT5zdG9wY2xrIHx8ICFjcXItPmVuZGNsayB8fAogCSAgICAhc2VjdG9ycykKQEAgLTE2MTQsMTUgKzE2MTQsNiBAQAogfQogCiAvKgotICogcG9zdHMgdGhlIGJ1ZmZlcl9jYWNoZSBhYm91dCBhIGZpbmFsaXplZCByZXF1ZXN0Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkYXNkX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEsIGludCBlcnJvcikKLXsKLQlpZiAoX19ibGtfZW5kX3JlcXVlc3QocmVxLCBlcnJvciwgYmxrX3JxX2J5dGVzKHJlcSkpKQotCQlCVUcoKTsKLX0KLQotLyoKICAqIFByb2Nlc3MgZmluaXNoZWQgZXJyb3IgcmVjb3ZlcnkgY2N3LgogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgX19kYXNkX2Jsb2NrX3Byb2Nlc3NfZXJwKHN0cnVjdCBkYXNkX2Jsb2NrICpibG9jaywKQEAgLTE2NjUsMTggKzE2NTYsMTQgQEAKIAlpZiAoYmFzZWRldi0+c3RhdGUgPCBEQVNEX1NUQVRFX1JFQURZKQogCQlyZXR1cm47CiAJLyogTm93IHdlIHRyeSB0byBmZXRjaCByZXF1ZXN0cyBmcm9tIHRoZSByZXF1ZXN0IHF1ZXVlICovCi0Jd2hpbGUgKCFibGtfcXVldWVfcGx1Z2dlZChxdWV1ZSkgJiYKLQkgICAgICAgZWx2X25leHRfcmVxdWVzdChxdWV1ZSkpIHsKLQotCQlyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHF1ZXVlKTsKLQorCXdoaWxlICghYmxrX3F1ZXVlX3BsdWdnZWQocXVldWUpICYmIChyZXEgPSBibGtfcGVla19yZXF1ZXN0KHF1ZXVlKSkpIHsKIAkJaWYgKGJhc2VkZXYtPmZlYXR1cmVzICYgREFTRF9GRUFUVVJFX1JFQURPTkxZICYmCiAJCSAgICBycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKSB7CiAJCQlEQkZfREVWX0VWRU5UKERCRl9FUlIsIGJhc2VkZXYsCiAJCQkJICAgICAgIlJlamVjdGluZyB3cml0ZSByZXF1ZXN0ICVwIiwKIAkJCQkgICAgICByZXEpOwotCQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOwotCQkJZGFzZF9lbmRfcmVxdWVzdChyZXEsIC1FSU8pOworCQkJYmxrX3N0YXJ0X3JlcXVlc3QocmVxKTsKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQkJY29udGludWU7CiAJCX0KIAkJY3FyID0gYmFzZWRldi0+ZGlzY2lwbGluZS0+YnVpbGRfY3AoYmFzZWRldiwgYmxvY2ssIHJlcSk7CkBAIC0xNzA0LDggKzE2OTEsOCBAQAogCQkJCSAgICAgICJDQ1cgY3JlYXRpb24gZmFpbGVkIChyYz0lbGQpICIKIAkJCQkgICAgICAib24gcmVxdWVzdCAlcCIsCiAJCQkJICAgICAgUFRSX0VSUihjcXIpLCByZXEpOwotCQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOwotCQkJZGFzZF9lbmRfcmVxdWVzdChyZXEsIC1FSU8pOworCQkJYmxrX3N0YXJ0X3JlcXVlc3QocmVxKTsKKwkJCV9fYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQkJY29udGludWU7CiAJCX0KIAkJLyoKQEAgLTE3MTQsNyArMTcwMSw3IEBACiAJCSAqLwogCQljcXItPmNhbGxiYWNrX2RhdGEgPSAodm9pZCAqKSByZXE7CiAJCWNxci0+c3RhdHVzID0gREFTRF9DUVJfRklMTEVEOwotCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CisJCWJsa19zdGFydF9yZXF1ZXN0KHJlcSk7CiAJCWxpc3RfYWRkX3RhaWwoJmNxci0+YmxvY2tsaXN0LCAmYmxvY2stPmNjd19xdWV1ZSk7CiAJCWRhc2RfcHJvZmlsZV9zdGFydChibG9jaywgY3FyLCByZXEpOwogCX0KQEAgLTE3MzEsNyArMTcxOCw3IEBACiAJc3RhdHVzID0gY3FyLT5ibG9jay0+YmFzZS0+ZGlzY2lwbGluZS0+ZnJlZV9jcChjcXIsIHJlcSk7CiAJaWYgKHN0YXR1cyA8PSAwKQogCQllcnJvciA9IHN0YXR1cyA/IHN0YXR1cyA6IC1FSU87Ci0JZGFzZF9lbmRfcmVxdWVzdChyZXEsIGVycm9yKTsKKwlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCBlcnJvcik7CiB9CiAKIC8qCkBAIC0yMDAzLDcgKzE5OTAsNyBAQAogewogCWludCBtYXg7CiAKLQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShibG9jay0+cmVxdWVzdF9xdWV1ZSwgYmxvY2stPmJwX2Jsb2NrKTsKKwlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGJsb2NrLT5yZXF1ZXN0X3F1ZXVlLCBibG9jay0+YnBfYmxvY2spOwogCW1heCA9IGJsb2NrLT5iYXNlLT5kaXNjaXBsaW5lLT5tYXhfYmxvY2tzIDw8IGJsb2NrLT5zMmJfc2hpZnQ7CiAJYmxrX3F1ZXVlX21heF9zZWN0b3JzKGJsb2NrLT5yZXF1ZXN0X3F1ZXVlLCBtYXgpOwogCWJsa19xdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhibG9jay0+cmVxdWVzdF9xdWV1ZSwgLTFMKTsKQEAgLTIwMzgsMTAgKzIwMjUsOCBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxKCZibG9jay0+cmVxdWVzdF9xdWV1ZV9sb2NrKTsKLQl3aGlsZSAoKHJlcSA9IGVsdl9uZXh0X3JlcXVlc3QoYmxvY2stPnJlcXVlc3RfcXVldWUpKSkgewotCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7Ci0JCWRhc2RfZW5kX3JlcXVlc3QocmVxLCAtRUlPKTsKLQl9CisJd2hpbGUgKChyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChibG9jay0+cmVxdWVzdF9xdWV1ZSkpKQorCQlfX2Jsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAtRUlPKTsKIAlzcGluX3VubG9ja19pcnEoJmJsb2NrLT5yZXF1ZXN0X3F1ZXVlX2xvY2spOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmMKaW5kZXggYjlhN2Y3Ny4uMmVmYWRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuYwpAQCAtNTA1LDggKzUwNSw5IEBACiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCWJsa3NpemUgPSBibG9jay0+YnBfYmxvY2s7CiAJLyogQ2FsY3VsYXRlIHJlY29yZCBpZCBvZiBmaXJzdCBhbmQgbGFzdCBibG9jay4gKi8KLQlmaXJzdF9yZWMgPSByZXEtPnNlY3RvciA+PiBibG9jay0+czJiX3NoaWZ0OwotCWxhc3RfcmVjID0gKHJlcS0+c2VjdG9yICsgcmVxLT5ucl9zZWN0b3JzIC0gMSkgPj4gYmxvY2stPnMyYl9zaGlmdDsKKwlmaXJzdF9yZWMgPSBibGtfcnFfcG9zKHJlcSkgPj4gYmxvY2stPnMyYl9zaGlmdDsKKwlsYXN0X3JlYyA9CisJCShibGtfcnFfcG9zKHJlcSkgKyBibGtfcnFfc2VjdG9ycyhyZXEpIC0gMSkgPj4gYmxvY2stPnMyYl9zaGlmdDsKIAkvKiBDaGVjayBzdHJ1Y3QgYmlvIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBmb3IgdGhlIHJlcXVlc3QuICovCiAJY291bnQgPSAwOwogCXJxX2Zvcl9lYWNoX3NlZ21lbnQoYnYsIHJlcSwgaXRlcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCmluZGV4IGNiNTJkYTAuLmE0MWM5NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKQEAgLTIzNTQsMTAgKzIzNTQsMTAgQEAKIAlibGtzaXplID0gYmxvY2stPmJwX2Jsb2NrOwogCWJsa19wZXJfdHJrID0gcmVjc19wZXJfdHJhY2soJnByaXZhdGUtPnJkY19kYXRhLCAwLCBibGtzaXplKTsKIAkvKiBDYWxjdWxhdGUgcmVjb3JkIGlkIG9mIGZpcnN0IGFuZCBsYXN0IGJsb2NrLiAqLwotCWZpcnN0X3JlYyA9IGZpcnN0X3RyayA9IHJlcS0+c2VjdG9yID4+IGJsb2NrLT5zMmJfc2hpZnQ7CisJZmlyc3RfcmVjID0gZmlyc3RfdHJrID0gYmxrX3JxX3BvcyhyZXEpID4+IGJsb2NrLT5zMmJfc2hpZnQ7CiAJZmlyc3Rfb2ZmcyA9IHNlY3Rvcl9kaXYoZmlyc3RfdHJrLCBibGtfcGVyX3Ryayk7CiAJbGFzdF9yZWMgPSBsYXN0X3RyayA9Ci0JCShyZXEtPnNlY3RvciArIHJlcS0+bnJfc2VjdG9ycyAtIDEpID4+IGJsb2NrLT5zMmJfc2hpZnQ7CisJCShibGtfcnFfcG9zKHJlcSkgKyBibGtfcnFfc2VjdG9ycyhyZXEpIC0gMSkgPj4gYmxvY2stPnMyYl9zaGlmdDsKIAlsYXN0X29mZnMgPSBzZWN0b3JfZGl2KGxhc3RfdHJrLCBibGtfcGVyX3Ryayk7CiAJY2Rsc3BlY2lhbCA9IChwcml2YXRlLT51c2VzX2NkbCAmJiBmaXJzdF9yZWMgPCAyKmJsa19wZXJfdHJrKTsKIApAQCAtMjQyMCw3ICsyNDIwLDcgQEAKIAlwcml2YXRlID0gKHN0cnVjdCBkYXNkX2Vja2RfcHJpdmF0ZSAqKSBjcXItPmJsb2NrLT5iYXNlLT5wcml2YXRlOwogCWJsa3NpemUgPSBjcXItPmJsb2NrLT5icF9ibG9jazsKIAlibGtfcGVyX3RyayA9IHJlY3NfcGVyX3RyYWNrKCZwcml2YXRlLT5yZGNfZGF0YSwgMCwgYmxrc2l6ZSk7Ci0JcmVjaWQgPSByZXEtPnNlY3RvciA+PiBjcXItPmJsb2NrLT5zMmJfc2hpZnQ7CisJcmVjaWQgPSBibGtfcnFfcG9zKHJlcSkgPj4gY3FyLT5ibG9jay0+czJiX3NoaWZ0OwogCWNjdyA9IGNxci0+Y3BhZGRyOwogCS8qIFNraXAgb3ZlciBkZWZpbmUgZXh0ZW50ICYgbG9jYXRlIHJlY29yZC4gKi8KIAljY3crKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2ZiYS5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKaW5kZXggYTNlYjZmZC4uODkxMjM1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMKQEAgLTI3MCw4ICsyNzAsOSBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAlibGtzaXplID0gYmxvY2stPmJwX2Jsb2NrOwogCS8qIENhbGN1bGF0ZSByZWNvcmQgaWQgb2YgZmlyc3QgYW5kIGxhc3QgYmxvY2suICovCi0JZmlyc3RfcmVjID0gcmVxLT5zZWN0b3IgPj4gYmxvY2stPnMyYl9zaGlmdDsKLQlsYXN0X3JlYyA9IChyZXEtPnNlY3RvciArIHJlcS0+bnJfc2VjdG9ycyAtIDEpID4+IGJsb2NrLT5zMmJfc2hpZnQ7CisJZmlyc3RfcmVjID0gYmxrX3JxX3BvcyhyZXEpID4+IGJsb2NrLT5zMmJfc2hpZnQ7CisJbGFzdF9yZWMgPQorCQkoYmxrX3JxX3BvcyhyZXEpICsgYmxrX3JxX3NlY3RvcnMocmVxKSAtIDEpID4+IGJsb2NrLT5zMmJfc2hpZnQ7CiAJLyogQ2hlY2sgc3RydWN0IGJpbyBhbmQgY291bnQgdGhlIG51bWJlciBvZiBibG9ja3MgZm9yIHRoZSByZXF1ZXN0LiAqLwogCWNvdW50ID0gMDsKIAljaWRhdyA9IDA7CkBAIC0zMDksNyArMzEwLDcgQEAKIAljY3cgPSBjcXItPmNwYWRkcjsKIAkvKiBGaXJzdCBjY3cgaXMgZGVmaW5lIGV4dGVudC4gKi8KIAlkZWZpbmVfZXh0ZW50KGNjdysrLCBjcXItPmRhdGEsIHJxX2RhdGFfZGlyKHJlcSksCi0JCSAgICAgIGJsb2NrLT5icF9ibG9jaywgcmVxLT5zZWN0b3IsIHJlcS0+bnJfc2VjdG9ycyk7CisJCSAgICAgIGJsb2NrLT5icF9ibG9jaywgYmxrX3JxX3BvcyhyZXEpLCBibGtfcnFfc2VjdG9ycyhyZXEpKTsKIAkvKiBCdWlsZCBsb2NhdGVfcmVjb3JkICsgcmVhZC93cml0ZSBjY3dzLiAqLwogCWlkYXdzID0gKHVuc2lnbmVkIGxvbmcgKikgKGNxci0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgREVfZmJhX2RhdGEpKTsKIAlMT19kYXRhID0gKHN0cnVjdCBMT19mYmFfZGF0YSAqKSAoaWRhd3MgKyBjaWRhdyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rjc3NibGsuYwppbmRleCBjZmRjZjFhLi5hNGM3ZmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMKQEAgLTYwMiw3ICs2MDIsNyBAQAogCWRldl9pbmZvLT5nZC0+cHJpdmF0ZV9kYXRhID0gZGV2X2luZm87CiAJZGV2X2luZm8tPmdkLT5kcml2ZXJmc19kZXYgPSAmZGV2X2luZm8tPmRldjsKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KGRldl9pbmZvLT5kY3NzYmxrX3F1ZXVlLCBkY3NzYmxrX21ha2VfcmVxdWVzdCk7Ci0JYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZGV2X2luZm8tPmRjc3NibGtfcXVldWUsIDQwOTYpOworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoZGV2X2luZm8tPmRjc3NibGtfcXVldWUsIDQwOTYpOwogCiAJc2VnX2J5dGVfc2l6ZSA9IChkZXZfaW5mby0+ZW5kIC0gZGV2X2luZm8tPnN0YXJ0ICsgMSk7CiAJc2V0X2NhcGFjaXR5KGRldl9pbmZvLT5nZCwgc2VnX2J5dGVfc2l6ZSA+PiA5KTsgLy8gc2l6ZSBpbiBzZWN0b3JzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2sveHByYW0uYyBiL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCmluZGV4IDc2ODE0ZjMuLjBhZTBjODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay94cHJhbS5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAJCWJsa19xdWV1ZV9tYWtlX3JlcXVlc3QoeHByYW1fcXVldWVzW2ldLCB4cHJhbV9tYWtlX3JlcXVlc3QpOwotCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZSh4cHJhbV9xdWV1ZXNbaV0sIDQwOTYpOworCQlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHhwcmFtX3F1ZXVlc1tpXSwgNDA5Nik7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzR4eC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKaW5kZXggNWY4ZThlZi4uMmQwMGEzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNHh4LmMKQEAgLTExMzQsNyArMTEzNCw3IEBACiAJLyogU2V0dXAgY2N3cy4gKi8KIAlyZXF1ZXN0LT5vcCA9IFRPX0JMT0NLOwogCXN0YXJ0X2Jsb2NrID0gKHN0cnVjdCB0YXBlXzM0eHhfYmxvY2tfaWQgKikgcmVxdWVzdC0+Y3BkYXRhOwotCXN0YXJ0X2Jsb2NrLT5ibG9jayA9IHJlcS0+c2VjdG9yID4+IFRBUEVCTE9DS19IU0VDX1MyQjsKKwlzdGFydF9ibG9jay0+YmxvY2sgPSBibGtfcnFfcG9zKHJlcSkgPj4gVEFQRUJMT0NLX0hTRUNfUzJCOwogCURCRl9FVkVOVCg2LCAic3RhcnRfYmxvY2sgPSAlaVxuIiwgc3RhcnRfYmxvY2stPmJsb2NrKTsKIAogCWNjdyA9IHJlcXVlc3QtPmNwYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfMzU5MC5jIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKaW5kZXggODIzYjA1Yi4uYzQ1M2IyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV8zNTkwLmMKQEAgLTYzMyw3ICs2MzMsNyBAQAogCXN0cnVjdCByZXFfaXRlcmF0b3IgaXRlcjsKIAogCURCRl9FVkVOVCg2LCAieEJSRURpZDoiKTsKLQlzdGFydF9ibG9jayA9IHJlcS0+c2VjdG9yID4+IFRBUEVCTE9DS19IU0VDX1MyQjsKKwlzdGFydF9ibG9jayA9IGJsa19ycV9wb3MocmVxKSA+PiBUQVBFQkxPQ0tfSFNFQ19TMkI7CiAJREJGX0VWRU5UKDYsICJzdGFydF9ibG9jayA9ICVpXG4iLCBzdGFydF9ibG9jayk7CiAKIAlycV9mb3JfZWFjaF9zZWdtZW50KGJ2LCByZXEsIGl0ZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMgYi9kcml2ZXJzL3MzOTAvY2hhci90YXBlX2Jsb2NrLmMKaW5kZXggZjMyZTg5ZS4uNDdmZjY5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvdGFwZV9ibG9jay5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3RhcGVfYmxvY2suYwpAQCAtNzQsMTMgKzc0LDYgQEAKICAqIFBvc3QgZmluaXNoZWQgcmVxdWVzdC4KICAqLwogc3RhdGljIHZvaWQKLXRhcGVibG9ja19lbmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcmVxLCBpbnQgZXJyb3IpCi17Ci0JaWYgKGJsa19lbmRfcmVxdWVzdChyZXEsIGVycm9yLCBibGtfcnFfYnl0ZXMocmVxKSkpCi0JCUJVRygpOwotfQotCi1zdGF0aWMgdm9pZAogX190YXBlYmxvY2tfZW5kX3JlcXVlc3Qoc3RydWN0IHRhcGVfcmVxdWVzdCAqY2N3X3JlcSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgdGFwZV9kZXZpY2UgKmRldmljZTsKQEAgLTkwLDE3ICs4MywxNyBAQAogCiAJZGV2aWNlID0gY2N3X3JlcS0+ZGV2aWNlOwogCXJlcSA9IChzdHJ1Y3QgcmVxdWVzdCAqKSBkYXRhOwotCXRhcGVibG9ja19lbmRfcmVxdWVzdChyZXEsIChjY3dfcmVxLT5yYyA9PSAwKSA/IDAgOiAtRUlPKTsKKwlibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgKGNjd19yZXEtPnJjID09IDApID8gMCA6IC1FSU8pOwogCWlmIChjY3dfcmVxLT5yYyA9PSAwKQogCQkvKiBVcGRhdGUgcG9zaXRpb24uICovCiAJCWRldmljZS0+YmxrX2RhdGEuYmxvY2tfcG9zaXRpb24gPQotCQkJKHJlcS0+c2VjdG9yICsgcmVxLT5ucl9zZWN0b3JzKSA+PiBUQVBFQkxPQ0tfSFNFQ19TMkI7CisJCSAgKGJsa19ycV9wb3MocmVxKSArIGJsa19ycV9zZWN0b3JzKHJlcSkpID4+IFRBUEVCTE9DS19IU0VDX1MyQjsKIAllbHNlCiAJCS8qIFdlIGxvc3QgdGhlIHBvc2l0aW9uIGluZm9ybWF0aW9uIGR1ZSB0byBhbiBlcnJvci4gKi8KIAkJZGV2aWNlLT5ibGtfZGF0YS5ibG9ja19wb3NpdGlvbiA9IC0xOwogCWRldmljZS0+ZGlzY2lwbGluZS0+ZnJlZV9icmVhZChjY3dfcmVxKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmRldmljZS0+cmVxX3F1ZXVlKSB8fAotCSAgICBlbHZfbmV4dF9yZXF1ZXN0KGRldmljZS0+YmxrX2RhdGEucmVxdWVzdF9xdWV1ZSkpCisJICAgIGJsa19wZWVrX3JlcXVlc3QoZGV2aWNlLT5ibGtfZGF0YS5yZXF1ZXN0X3F1ZXVlKSkKIAkJdGFwZWJsb2NrX3RyaWdnZXJfcmVxdWV1ZShkZXZpY2UpOwogfQogCkBAIC0xMTgsNyArMTExLDcgQEAKIAljY3dfcmVxID0gZGV2aWNlLT5kaXNjaXBsaW5lLT5icmVhZChkZXZpY2UsIHJlcSk7CiAJaWYgKElTX0VSUihjY3dfcmVxKSkgewogCQlEQkZfRVZFTlQoMSwgIlRCTE9DSzogYnJlYWQgZmFpbGVkXG4iKTsKLQkJdGFwZWJsb2NrX2VuZF9yZXF1ZXN0KHJlcSwgLUVJTyk7CisJCWJsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAtRUlPKTsKIAkJcmV0dXJuIFBUUl9FUlIoY2N3X3JlcSk7CiAJfQogCWNjd19yZXEtPmNhbGxiYWNrID0gX190YXBlYmxvY2tfZW5kX3JlcXVlc3Q7CkBAIC0xMzEsNyArMTI0LDcgQEAKIAkJICogU3RhcnQvZW5xdWV1ZWluZyBmYWlsZWQuIE5vIHJldHJpZXMgaW4KIAkJICogdGhpcyBjYXNlLgogCQkgKi8KLQkJdGFwZWJsb2NrX2VuZF9yZXF1ZXN0KHJlcSwgLUVJTyk7CisJCWJsa19lbmRfcmVxdWVzdF9hbGwocmVxLCAtRUlPKTsKIAkJZGV2aWNlLT5kaXNjaXBsaW5lLT5mcmVlX2JyZWFkKGNjd19yZXEpOwogCX0KIApAQCAtMTY5LDE5ICsxNjIsMTYgQEAKIAlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmJsa19kYXRhLnJlcXVlc3RfcXVldWVfbG9jayk7CiAJd2hpbGUgKAogCQkhYmxrX3F1ZXVlX3BsdWdnZWQocXVldWUpICYmCi0JCWVsdl9uZXh0X3JlcXVlc3QocXVldWUpICAgJiYKKwkJKHJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHF1ZXVlKSkgJiYKIAkJbnJfcXVldWVkIDwgVEFQRUJMT0NLX01JTl9SRVFVRVVFCiAJKSB7Ci0JCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocXVldWUpOwogCQlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkgewogCQkJREJGX0VWRU5UKDEsICJUQkxPQ0s6IFJlamVjdGluZyB3cml0ZSByZXF1ZXN0XG4iKTsKLQkJCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlLT5ibGtfZGF0YS5yZXF1ZXN0X3F1ZXVlX2xvY2spOwotCQkJdGFwZWJsb2NrX2VuZF9yZXF1ZXN0KHJlcSwgLUVJTyk7CisJCQlibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgLUVJTyk7CiAJCQlzcGluX2xvY2tfaXJxKCZkZXZpY2UtPmJsa19kYXRhLnJlcXVlc3RfcXVldWVfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQotCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CiAJCW5yX3F1ZXVlZCsrOwogCQlzcGluX3VubG9ja19pcnEoJmRldmljZS0+YmxrX2RhdGEucmVxdWVzdF9xdWV1ZV9sb2NrKTsKIAkJcmMgPSB0YXBlYmxvY2tfc3RhcnRfcmVxdWVzdChkZXZpY2UsIHJlcSk7CkBAIC0yMzIsNyArMjIyLDcgQEAKIAlpZiAocmMpCiAJCWdvdG8gY2xlYW51cF9xdWV1ZTsKIAotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGJsa2RhdC0+cmVxdWVzdF9xdWV1ZSwgVEFQRUJMT0NLX0hTRUNfU0laRSk7CisJYmxrX3F1ZXVlX2xvZ2ljYWxfYmxvY2tfc2l6ZShibGtkYXQtPnJlcXVlc3RfcXVldWUsIFRBUEVCTE9DS19IU0VDX1NJWkUpOwogCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhibGtkYXQtPnJlcXVlc3RfcXVldWUsIFRBUEVCTE9DS19NQVhfU0VDKTsKIAlibGtfcXVldWVfbWF4X3BoeXNfc2VnbWVudHMoYmxrZGF0LT5yZXF1ZXN0X3F1ZXVlLCAtMUwpOwogCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMoYmxrZGF0LT5yZXF1ZXN0X3F1ZXVlLCAtMUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvanNmbGFzaC5jCmluZGV4IGE4NWFkMDUuLjZkNDY1MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2pzZmxhc2guYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9qc2ZsYXNoLmMKQEAgLTE4NiwzMSArMTg2LDMxIEBACiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAotCXdoaWxlICgocmVxID0gZWx2X25leHRfcmVxdWVzdChxKSkgIT0gTlVMTCkgeworCXJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOworCXdoaWxlIChyZXEpIHsKIAkJc3RydWN0IGpzZmRfcGFydCAqamRwID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7Ci0JCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcmVxLT5zZWN0b3IgPDwgOTsKLQkJc2l6ZV90IGxlbiA9IHJlcS0+Y3VycmVudF9ucl9zZWN0b3JzIDw8IDk7CisJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gYmxrX3JxX3BvcyhyZXEpIDw8IDk7CisJCXNpemVfdCBsZW4gPSBibGtfcnFfY3VyX2J5dGVzKHJlcSk7CisJCWludCBlcnIgPSAtRUlPOwogCi0JCWlmICgob2Zmc2V0ICsgbGVuKSA+IGpkcC0+ZHNpemUpIHsKLSAgICAgICAgICAgICAgIAkJZW5kX3JlcXVlc3QocmVxLCAwKTsKLQkJCWNvbnRpbnVlOwotCQl9CisJCWlmICgob2Zmc2V0ICsgbGVuKSA+IGpkcC0+ZHNpemUpCisJCQlnb3RvIGVuZDsKIAogCQlpZiAocnFfZGF0YV9kaXIocmVxKSAhPSBSRUFEKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgImpzZmQ6IHdyaXRlXG4iKTsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCQljb250aW51ZTsKKwkJCWdvdG8gZW5kOwogCQl9CiAKIAkJaWYgKChqZHAtPmRiYXNlICYgMHhmZjAwMDAwMCkgIT0gMHgyMDAwMDAwMCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJqc2ZkOiBiYWQgYmFzZSAleFxuIiwgKGludClqZHAtPmRiYXNlKTsKLQkJCWVuZF9yZXF1ZXN0KHJlcSwgMCk7Ci0JCQljb250aW51ZTsKKwkJCWdvdG8gZW5kOwogCQl9CiAKIAkJanNmZF9yZWFkKHJlcS0+YnVmZmVyLCBqZHAtPmRiYXNlICsgb2Zmc2V0LCBsZW4pOwotCi0JCWVuZF9yZXF1ZXN0KHJlcSwgMSk7CisJCWVyciA9IDA7CisJZW5kOgorCQlpZiAoIV9fYmxrX2VuZF9yZXF1ZXN0X2N1cihyZXEsIGVycikpCisJCQlyZXEgPSBibGtfZmV0Y2hfcmVxdWVzdChxKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lYXRhLmMgYi9kcml2ZXJzL3Njc2kvZWF0YS5jCmluZGV4IGJlNTA5OWQuLmM3MDc2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9lYXRhLmMKKysrIGIvZHJpdmVycy9zY3NpL2VhdGEuYwpAQCAtMTgyNSw3ICsxODI1LDcgQEAKIAlpZiAobGlua2VkX2NvbW0gJiYgU0NwbnQtPmRldmljZS0+cXVldWVfZGVwdGggPiAyCiAJICAgICYmIFRMREVWKFNDcG50LT5kZXZpY2UtPnR5cGUpKSB7CiAJCWhhLT5jcF9zdGF0W2ldID0gUkVBRFk7Ci0JCWZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yLCBoYSwgMCk7CisJCWZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KSwgaGEsIDApOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTIxNDQsMTMgKzIxNDQsMTMgQEAKIAkJaWYgKCFjcHAtPmRpbikKIAkJCWlucHV0X29ubHkgPSAwOwogCi0JCWlmIChTQ3BudC0+cmVxdWVzdC0+c2VjdG9yIDwgbWluc2VjKQotCQkJbWluc2VjID0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvcjsKLQkJaWYgKFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IgPiBtYXhzZWMpCi0JCQltYXhzZWMgPSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yOworCQlpZiAoYmxrX3JxX3BvcyhTQ3BudC0+cmVxdWVzdCkgPCBtaW5zZWMpCisJCQltaW5zZWMgPSBibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KTsKKwkJaWYgKGJsa19ycV9wb3MoU0NwbnQtPnJlcXVlc3QpID4gbWF4c2VjKQorCQkJbWF4c2VjID0gYmxrX3JxX3BvcyhTQ3BudC0+cmVxdWVzdCk7CiAKLQkJc2xbbl0gPSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yOwotCQlpb3NlZWsgKz0gU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnM7CisJCXNsW25dID0gYmxrX3JxX3BvcyhTQ3BudC0+cmVxdWVzdCk7CisJCWlvc2VlayArPSBibGtfcnFfc2VjdG9ycyhTQ3BudC0+cmVxdWVzdCk7CiAKIAkJaWYgKCFuKQogCQkJY29udGludWU7CkBAIC0yMTkwLDcgKzIxOTAsNyBAQAogCQkJayA9IGlsW25dOwogCQkJY3BwID0gJmhhLT5jcFtrXTsKIAkJCVNDcG50ID0gY3BwLT5TQ3BudDsKLQkJCWxsW25dID0gU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnM7CisJCQlsbFtuXSA9IGJsa19ycV9zZWN0b3JzKFNDcG50LT5yZXF1ZXN0KTsKIAkJCXBsW25dID0gU0NwbnQtPnNlcmlhbF9udW1iZXI7CiAKIAkJCWlmICghbikKQEAgLTIyMzYsMTIgKzIyMzYsMTIgQEAKIAkJCWNwcCA9ICZoYS0+Y3Bba107CiAJCQlTQ3BudCA9IGNwcC0+U0NwbnQ7CiAJCQlzY21kX3ByaW50ayhLRVJOX0lORk8sIFNDcG50LAotCQkJICAgICIlcyBwaWQgJWxkIG1iICVkIGZjICVkIG5yICVkIHNlYyAlbGQgbnMgJWxkIgorCQkJICAgICIlcyBwaWQgJWxkIG1iICVkIGZjICVkIG5yICVkIHNlYyAlbGQgbnMgJXUiCiAJCQkgICAgICIgY3VyICVsZCBzOiVjIHI6JWMgcmV2OiVjIGluOiVjIG92OiVjIHhkICVkLlxuIiwKIAkJCSAgICAgKGloZGxyID8gImloZGxyIiA6ICJxY29tbSIpLAogCQkJICAgICBTQ3BudC0+c2VyaWFsX251bWJlciwgaywgZmx1c2hjb3VudCwKLQkJCSAgICAgbl9yZWFkeSwgU0NwbnQtPnJlcXVlc3QtPnNlY3RvciwKLQkJCSAgICAgU0NwbnQtPnJlcXVlc3QtPm5yX3NlY3RvcnMsIGN1cnNlYywgWUVTTk8ocyksCisJCQkgICAgIG5fcmVhZHksIGJsa19ycV9wb3MoU0NwbnQtPnJlcXVlc3QpLAorCQkJICAgICBibGtfcnFfc2VjdG9ycyhTQ3BudC0+cmVxdWVzdCksIGN1cnNlYywgWUVTTk8ocyksCiAJCQkgICAgIFlFU05PKHIpLCBZRVNOTyhyZXYpLCBZRVNOTyhpbnB1dF9vbmx5KSwKIAkJCSAgICAgWUVTTk8ob3ZlcmxhcCksIGNwcC0+ZGluKTsKIAkJfQpAQCAtMjQwOCw3ICsyNDA4LDcgQEAKIAogCWlmIChsaW5rZWRfY29tbSAmJiBTQ3BudC0+ZGV2aWNlLT5xdWV1ZV9kZXB0aCA+IDIKIAkgICAgJiYgVExERVYoU0NwbnQtPmRldmljZS0+dHlwZSkpCi0JCWZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yLCBoYSwgMSk7CisJCWZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KSwgaGEsIDEpOwogCiAJdHN0YXR1cyA9IHN0YXR1c19ieXRlKHNwcC0+dGFyZ2V0X3N0YXR1cyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCmluZGV4IDNkYTAyZTQuLjU0ZmExZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYwpAQCAtMTkyNywyMSArMTkyNywyMSBAQAogCS8qIGRvIHdlIG5lZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSBzZWdtZW50cz8gKi8KIAlpZiAocmVxLT5iaW8tPmJpX3ZjbnQgPiAxIHx8IHJzcC0+YmlvLT5iaV92Y250ID4gMSkgewogCQlwcmludGsoIiVzOiBtdWx0aXBsZSBzZWdtZW50cyByZXEgJXUgJXUsIHJzcCAldSAldVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCByZXEtPmJpby0+YmlfdmNudCwgcmVxLT5kYXRhX2xlbiwKLQkJICAgICAgIHJzcC0+YmlvLT5iaV92Y250LCByc3AtPmRhdGFfbGVuKTsKKwkJICAgICAgIF9fZnVuY19fLCByZXEtPmJpby0+YmlfdmNudCwgYmxrX3JxX2J5dGVzKHJlcSksCisJCSAgICAgICByc3AtPmJpby0+YmlfdmNudCwgYmxrX3JxX2J5dGVzKHJzcCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXQgPSBzbXBfZXhlY3V0ZV90YXNrKGRldiwgYmlvX2RhdGEocmVxLT5iaW8pLCByZXEtPmRhdGFfbGVuLAotCQkJICAgICAgIGJpb19kYXRhKHJzcC0+YmlvKSwgcnNwLT5kYXRhX2xlbik7CisJcmV0ID0gc21wX2V4ZWN1dGVfdGFzayhkZXYsIGJpb19kYXRhKHJlcS0+YmlvKSwgYmxrX3JxX2J5dGVzKHJlcSksCisJCQkgICAgICAgYmlvX2RhdGEocnNwLT5iaW8pLCBibGtfcnFfYnl0ZXMocnNwKSk7CiAJaWYgKHJldCA+IDApIHsKIAkJLyogcG9zaXRpdmUgbnVtYmVyIGlzIHRoZSB1bnRyYW5zZmVycmVkIHJlc2lkdWFsICovCi0JCXJzcC0+ZGF0YV9sZW4gPSByZXQ7Ci0JCXJlcS0+ZGF0YV9sZW4gPSAwOworCQlyc3AtPnJlc2lkX2xlbiA9IHJldDsKKwkJcmVxLT5yZXNpZF9sZW4gPSAwOwogCQlyZXQgPSAwOwogCX0gZWxzZSBpZiAocmV0ID09IDApIHsKLQkJcnNwLT5kYXRhX2xlbiA9IDA7Ci0JCXJlcS0+ZGF0YV9sZW4gPSAwOworCQlyc3AtPnJlc2lkX2xlbiA9IDA7CisJCXJlcS0+cmVzaWRfbGVuID0gMDsKIAl9CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2hvc3Rfc21wLmMKaW5kZXggZDExMGEzNi4uMWJjM2I3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfaG9zdF9zbXAuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19ob3N0X3NtcC5jCkBAIC0xMzQsMjQgKzEzNCwyNCBAQAogewogCXU4ICpyZXFfZGF0YSA9IE5VTEwsICpyZXNwX2RhdGEgPSBOVUxMLCAqYnVmOwogCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzYXNfaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOwotCWludCBlcnJvciA9IC1FSU5WQUwsIHJlc3BfZGF0YV9sZW4gPSByc3AtPmRhdGFfbGVuOworCWludCBlcnJvciA9IC1FSU5WQUw7CiAKIAkvKiBlaWdodCBpcyB0aGUgbWluaW11bSBzaXplIGZvciByZXF1ZXN0IGFuZCByZXNwb25zZSBmcmFtZXMgKi8KLQlpZiAocmVxLT5kYXRhX2xlbiA8IDggfHwgcnNwLT5kYXRhX2xlbiA8IDgpCisJaWYgKGJsa19ycV9ieXRlcyhyZXEpIDwgOCB8fCBibGtfcnFfYnl0ZXMocnNwKSA8IDgpCiAJCWdvdG8gb3V0OwogCi0JaWYgKGJpb19vZmZzZXQocmVxLT5iaW8pICsgcmVxLT5kYXRhX2xlbiA+IFBBR0VfU0laRSB8fAotCSAgICBiaW9fb2Zmc2V0KHJzcC0+YmlvKSArIHJzcC0+ZGF0YV9sZW4gPiBQQUdFX1NJWkUpIHsKKwlpZiAoYmlvX29mZnNldChyZXEtPmJpbykgKyBibGtfcnFfYnl0ZXMocmVxKSA+IFBBR0VfU0laRSB8fAorCSAgICBiaW9fb2Zmc2V0KHJzcC0+YmlvKSArIGJsa19ycV9ieXRlcyhyc3ApID4gUEFHRV9TSVpFKSB7CiAJCXNob3N0X3ByaW50ayhLRVJOX0VSUiwgc2hvc3QsCiAJCQkiU01QIHJlcXVlc3QvcmVzcG9uc2UgZnJhbWUgY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5Iik7CiAJCWdvdG8gb3V0OwogCX0KIAotCXJlcV9kYXRhID0ga3phbGxvYyhyZXEtPmRhdGFfbGVuLCBHRlBfS0VSTkVMKTsKKwlyZXFfZGF0YSA9IGt6YWxsb2MoYmxrX3JxX2J5dGVzKHJlcSksIEdGUF9LRVJORUwpOwogCiAJLyogbWFrZSBzdXJlIGZyYW1lIGNhbiBhbHdheXMgYmUgYnVpbHQgLi4uIHdlIGNvcHkKIAkgKiBiYWNrIG9ubHkgdGhlIHJlcXVlc3RlZCBsZW5ndGggKi8KLQlyZXNwX2RhdGEgPSBremFsbG9jKG1heChyc3AtPmRhdGFfbGVuLCAxMjhVKSwgR0ZQX0tFUk5FTCk7CisJcmVzcF9kYXRhID0ga3phbGxvYyhtYXgoYmxrX3JxX2J5dGVzKHJzcCksIDEyOFUpLCBHRlBfS0VSTkVMKTsKIAogCWlmICghcmVxX2RhdGEgfHwgIXJlc3BfZGF0YSkgewogCQllcnJvciA9IC1FTk9NRU07CkBAIC0xNjAsNyArMTYwLDcgQEAKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJYnVmID0ga21hcF9hdG9taWMoYmlvX3BhZ2UocmVxLT5iaW8pLCBLTV9VU0VSMCkgKyBiaW9fb2Zmc2V0KHJlcS0+YmlvKTsKLQltZW1jcHkocmVxX2RhdGEsIGJ1ZiwgcmVxLT5kYXRhX2xlbik7CisJbWVtY3B5KHJlcV9kYXRhLCBidWYsIGJsa19ycV9ieXRlcyhyZXEpKTsKIAlrdW5tYXBfYXRvbWljKGJ1ZiAtIGJpb19vZmZzZXQocmVxLT5iaW8pLCBLTV9VU0VSMCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCkBAIC0xNzgsMTUgKzE3OCwxNSBAQAogCiAJc3dpdGNoIChyZXFfZGF0YVsxXSkgewogCWNhc2UgU01QX1JFUE9SVF9HRU5FUkFMOgotCQlyZXEtPmRhdGFfbGVuIC09IDg7Ci0JCXJlc3BfZGF0YV9sZW4gLT0gMzI7CisJCXJlcS0+cmVzaWRfbGVuIC09IDg7CisJCXJzcC0+cmVzaWRfbGVuIC09IDMyOwogCQlyZXNwX2RhdGFbMl0gPSBTTVBfUkVTUF9GVU5DX0FDQzsKIAkJcmVzcF9kYXRhWzldID0gc2FzX2hhLT5udW1fcGh5czsKIAkJYnJlYWs7CiAKIAljYXNlIFNNUF9SRVBPUlRfTUFOVUZfSU5GTzoKLQkJcmVxLT5kYXRhX2xlbiAtPSA4OwotCQlyZXNwX2RhdGFfbGVuIC09IDY0OworCQlyZXEtPnJlc2lkX2xlbiAtPSA4OworCQlyc3AtPnJlc2lkX2xlbiAtPSA2NDsKIAkJcmVzcF9kYXRhWzJdID0gU01QX1JFU1BfRlVOQ19BQ0M7CiAJCW1lbWNweShyZXNwX2RhdGEgKyAxMiwgc2hvc3QtPmhvc3R0LT5uYW1lLAogCQkgICAgICAgU0FTX0VYUEFOREVSX1ZFTkRPUl9JRF9MRU4pOwpAQCAtMTk5LDEzICsxOTksMTMgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNUF9ESVNDT1ZFUjoKLQkJcmVxLT5kYXRhX2xlbiAtPSAxNjsKLQkJaWYgKChpbnQpcmVxLT5kYXRhX2xlbiA8IDApIHsKLQkJCXJlcS0+ZGF0YV9sZW4gPSAwOworCQlyZXEtPnJlc2lkX2xlbiAtPSAxNjsKKwkJaWYgKChpbnQpcmVxLT5yZXNpZF9sZW4gPCAwKSB7CisJCQlyZXEtPnJlc2lkX2xlbiA9IDA7CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlyZXNwX2RhdGFfbGVuIC09IDU2OworCQlyc3AtPnJlc2lkX2xlbiAtPSA1NjsKIAkJc2FzX2hvc3Rfc21wX2Rpc2NvdmVyKHNhc19oYSwgcmVzcF9kYXRhLCByZXFfZGF0YVs5XSk7CiAJCWJyZWFrOwogCkBAIC0yMTUsMTMgKzIxNSwxMyBAQAogCQlicmVhazsKIAogCWNhc2UgU01QX1JFUE9SVF9QSFlfU0FUQToKLQkJcmVxLT5kYXRhX2xlbiAtPSAxNjsKLQkJaWYgKChpbnQpcmVxLT5kYXRhX2xlbiA8IDApIHsKLQkJCXJlcS0+ZGF0YV9sZW4gPSAwOworCQlyZXEtPnJlc2lkX2xlbiAtPSAxNjsKKwkJaWYgKChpbnQpcmVxLT5yZXNpZF9sZW4gPCAwKSB7CisJCQlyZXEtPnJlc2lkX2xlbiA9IDA7CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlyZXNwX2RhdGFfbGVuIC09IDYwOworCQlyc3AtPnJlc2lkX2xlbiAtPSA2MDsKIAkJc2FzX3JlcG9ydF9waHlfc2F0YShzYXNfaGEsIHJlc3BfZGF0YSwgcmVxX2RhdGFbOV0pOwogCQlicmVhazsKIApAQCAtMjM4LDEzICsyMzgsMTMgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNNUF9QSFlfQ09OVFJPTDoKLQkJcmVxLT5kYXRhX2xlbiAtPSA0NDsKLQkJaWYgKChpbnQpcmVxLT5kYXRhX2xlbiA8IDApIHsKLQkJCXJlcS0+ZGF0YV9sZW4gPSAwOworCQlyZXEtPnJlc2lkX2xlbiAtPSA0NDsKKwkJaWYgKChpbnQpcmVxLT5yZXNpZF9sZW4gPCAwKSB7CisJCQlyZXEtPnJlc2lkX2xlbiA9IDA7CiAJCQllcnJvciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlyZXNwX2RhdGFfbGVuIC09IDg7CisJCXJzcC0+cmVzaWRfbGVuIC09IDg7CiAJCXNhc19waHlfY29udHJvbChzYXNfaGEsIHJlcV9kYXRhWzldLCByZXFfZGF0YVsxMF0sCiAJCQkJcmVxX2RhdGFbMzJdID4+IDQsIHJlcV9kYXRhWzMzXSA+PiA0LAogCQkJCXJlc3BfZGF0YSk7CkBAIC0yNjEsMTEgKzI2MSwxMCBAQAogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAlidWYgPSBrbWFwX2F0b21pYyhiaW9fcGFnZShyc3AtPmJpbyksIEtNX1VTRVIwKSArIGJpb19vZmZzZXQocnNwLT5iaW8pOwotCW1lbWNweShidWYsIHJlc3BfZGF0YSwgcnNwLT5kYXRhX2xlbik7CisJbWVtY3B5KGJ1ZiwgcmVzcF9kYXRhLCBibGtfcnFfYnl0ZXMocnNwKSk7CiAJZmx1c2hfa2VybmVsX2RjYWNoZV9wYWdlKGJpb19wYWdlKHJzcC0+YmlvKSk7CiAJa3VubWFwX2F0b21pYyhidWYgLSBiaW9fb2Zmc2V0KHJzcC0+YmlvKSwgS01fVVNFUjApOwogCWxvY2FsX2lycV9lbmFibGUoKTsKLQlyc3AtPmRhdGFfbGVuID0gcmVzcF9kYXRhX2xlbjsKIAogIG91dDoKIAlrZnJlZShyZXFfZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCmluZGV4IDE2N2I2NmQuLjgwMzJjNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2NzaS5jCkBAIC0xMzEyLDEwICsxMzEyLDEwIEBACiAJdWludDMyX3QgYmdzdGF0ID0gYmdmLT5iZ3N0YXQ7CiAJdWludDY0X3QgZmFpbGluZ19zZWN0b3IgPSAwOwogCi0JcHJpbnRrKEtFUk5fRVJSICJCRyBFUlJPUiBpbiBjbWQgMHgleCBsYmEgMHglbGx4IGJsayBjbnQgMHglbHggIgorCXByaW50ayhLRVJOX0VSUiAiQkcgRVJST1IgaW4gY21kIDB4JXggbGJhIDB4JWxseCBibGsgY250IDB4JXggIgogCQkJImJnc3RhdD0weCV4IGJnaG09MHgleFxuIiwKIAkJCWNtZC0+Y21uZFswXSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzY3NpX2dldF9sYmEoY21kKSwKLQkJCWNtZC0+cmVxdWVzdC0+bnJfc2VjdG9ycywgYmdzdGF0LCBiZ2htKTsKKwkJCWJsa19ycV9zZWN0b3JzKGNtZC0+cmVxdWVzdCksIGJnc3RhdCwgYmdobSk7CiAKIAlzcGluX2xvY2soJl9kdW1wX2J1Zl9sb2NrKTsKIAlpZiAoIV9kdW1wX2J1Zl9kb25lKSB7CkBAIC0yMzc4LDE1ICsyMzc4LDE1IEBACiAJCWlmIChjbW5kLT5jbW5kWzBdID09IFJFQURfMTApCiAJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKIAkJCQkJIjkwMzUgQkxLR1JEOiBSRUFEIEAgc2VjdG9yICVsbHUsICIKLQkJCQkJICJjb3VudCAlbHVcbiIsCi0JCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNjc2lfZ2V0X2xiYShjbW5kKSwKLQkJCQkJY21uZC0+cmVxdWVzdC0+bnJfc2VjdG9ycyk7CisJCQkJCSJjb3VudCAldVxuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzY3NpX2dldF9sYmEoY21uZCksCisJCQkJCWJsa19ycV9zZWN0b3JzKGNtbmQtPnJlcXVlc3QpKTsKIAkJZWxzZSBpZiAoY21uZC0+Y21uZFswXSA9PSBXUklURV8xMCkKIAkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0JHLAogCQkJCQkiOTAzNiBCTEtHUkQ6IFdSSVRFIEAgc2VjdG9yICVsbHUsICIKLQkJCQkJImNvdW50ICVsdSBjbWQ9JXBcbiIsCisJCQkJCSJjb3VudCAldSBjbWQ9JXBcbiIsCiAJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpc2NzaV9nZXRfbGJhKGNtbmQpLAotCQkJCQljbW5kLT5yZXF1ZXN0LT5ucl9zZWN0b3JzLAorCQkJCQlibGtfcnFfc2VjdG9ycyhjbW5kLT5yZXF1ZXN0KSwKIAkJCQkJY21uZCk7CiAKIAkJZXJyID0gbHBmY19iZ19zY3NpX3ByZXBfZG1hX2J1ZihwaGJhLCBscGZjX2NtZCk7CkBAIC0yNDA2LDE1ICsyNDA2LDE1IEBACiAJCWlmIChjbW5kLT5jbW5kWzBdID09IFJFQURfMTApCiAJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKIAkJCQkJICI5MDQwIGRiZzogUkVBRCBAIHNlY3RvciAlbGx1LCAiCi0JCQkJCSAiY291bnQgJWx1XG4iLAorCQkJCQkgImNvdW50ICV1XG4iLAogCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylzY3NpX2dldF9sYmEoY21uZCksCi0JCQkJCSBjbW5kLT5yZXF1ZXN0LT5ucl9zZWN0b3JzKTsKKwkJCQkJIGJsa19ycV9zZWN0b3JzKGNtbmQtPnJlcXVlc3QpKTsKIAkJZWxzZSBpZiAoY21uZC0+Y21uZFswXSA9PSBXUklURV8xMCkKIAkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fV0FSTklORywgTE9HX0JHLAogCQkJCQkgIjkwNDEgZGJnOiBXUklURSBAIHNlY3RvciAlbGx1LCAiCi0JCQkJCSAiY291bnQgJWx1IGNtZD0lcFxuIiwKKwkJCQkJICJjb3VudCAldSBjbWQ9JXBcbiIsCiAJCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXNjc2lfZ2V0X2xiYShjbW5kKSwKLQkJCQkJIGNtbmQtPnJlcXVlc3QtPm5yX3NlY3RvcnMsIGNtbmQpOworCQkJCQkgYmxrX3JxX3NlY3RvcnMoY21uZC0+cmVxdWVzdCksIGNtbmQpOwogCQllbHNlCiAJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX1dBUk5JTkcsIExPR19CRywKIAkJCQkJICI5MDQyIGRiZzogcGFyc2VyIG5vdCBpbXBsZW1lbnRlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc190cmFuc3BvcnQuYwppbmRleCBlMDNkYzBiLi41YzY1ZGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfdHJhbnNwb3J0LmMKQEAgLTEwNDEsNyArMTA0MSw3IEBACiAJaWYgKHJlcS0+YmlvLT5iaV92Y250ID4gMSB8fCByc3AtPmJpby0+YmlfdmNudCA+IDEpIHsKIAkJcHJpbnRrKE1QVDJTQVNfRVJSX0ZNVCAiJXM6IG11bHRpcGxlIHNlZ21lbnRzIHJlcSAldSAldSwgIgogCQkgICAgInJzcCAldSAldVxuIiwgaW9jLT5uYW1lLCBfX2Z1bmNfXywgcmVxLT5iaW8tPmJpX3ZjbnQsCi0JCSAgICByZXEtPmRhdGFfbGVuLCByc3AtPmJpby0+YmlfdmNudCwgcnNwLT5kYXRhX2xlbik7CisJCSAgICBibGtfcnFfYnl0ZXMocmVxKSwgcnNwLT5iaW8tPmJpX3ZjbnQsIGJsa19ycV9ieXRlcyhyc3ApKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMTA0LDcgKzExMDQsNyBAQAogCSooKHU2NCAqKSZtcGlfcmVxdWVzdC0+U0FTQWRkcmVzcykgPSAocnBoeSkgPwogCSAgICBjcHVfdG9fbGU2NChycGh5LT5pZGVudGlmeS5zYXNfYWRkcmVzcykgOgogCSAgICBjcHVfdG9fbGU2NChpb2MtPnNhc19oYmEuc2FzX2FkZHJlc3MpOwotCW1waV9yZXF1ZXN0LT5SZXF1ZXN0RGF0YUxlbmd0aCA9IGNwdV90b19sZTE2KHJlcS0+ZGF0YV9sZW4gLSA0KTsKKwltcGlfcmVxdWVzdC0+UmVxdWVzdERhdGFMZW5ndGggPSBjcHVfdG9fbGUxNihibGtfcnFfYnl0ZXMocmVxKSAtIDQpOwogCXBzZ2UgPSAmbXBpX3JlcXVlc3QtPlNHTDsKIAogCS8qIFdSSVRFIHNnZWwgZmlyc3QgKi8KQEAgLTExMTIsMTMgKzExMTIsMTMgQEAKIAkgICAgTVBJMl9TR0VfRkxBR1NfRU5EX09GX0JVRkZFUiB8IE1QSTJfU0dFX0ZMQUdTX0hPU1RfVE9fSU9DKTsKIAlzZ2xfZmxhZ3MgPSBzZ2xfZmxhZ3MgPDwgTVBJMl9TR0VfRkxBR1NfU0hJRlQ7CiAJZG1hX2FkZHJfb3V0ID0gcGNpX21hcF9zaW5nbGUoaW9jLT5wZGV2LCBiaW9fZGF0YShyZXEtPmJpbyksCi0JICAgICAgcmVxLT5kYXRhX2xlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJYmxrX3JxX2J5dGVzKHJlcSksIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJaWYgKCFkbWFfYWRkcl9vdXQpIHsKIAkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIGxlMTZfdG9fY3B1KHNtaWQpKTsKIAkJZ290byB1bm1hcDsKIAl9CiAKLQlpb2MtPmJhc2VfYWRkX3NnX3NpbmdsZShwc2dlLCBzZ2xfZmxhZ3MgfCAocmVxLT5kYXRhX2xlbiAtIDQpLAorCWlvYy0+YmFzZV9hZGRfc2dfc2luZ2xlKHBzZ2UsIHNnbF9mbGFncyB8IChibGtfcnFfYnl0ZXMocmVxKSAtIDQpLAogCSAgICBkbWFfYWRkcl9vdXQpOwogCiAJLyogaW5jciBzZ2VsICovCkBAIC0xMTI5LDE0ICsxMTI5LDE0IEBACiAJICAgIE1QSTJfU0dFX0ZMQUdTX0xBU1RfRUxFTUVOVCB8IE1QSTJfU0dFX0ZMQUdTX0VORF9PRl9CVUZGRVIgfAogCSAgICBNUEkyX1NHRV9GTEFHU19FTkRfT0ZfTElTVCk7CiAJc2dsX2ZsYWdzID0gc2dsX2ZsYWdzIDw8IE1QSTJfU0dFX0ZMQUdTX1NISUZUOwotCWRtYV9hZGRyX2luID0gIHBjaV9tYXBfc2luZ2xlKGlvYy0+cGRldiwgYmlvX2RhdGEocnNwLT5iaW8pLAotCSAgICAgIHJzcC0+ZGF0YV9sZW4sIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJZG1hX2FkZHJfaW4gPSBwY2lfbWFwX3NpbmdsZShpb2MtPnBkZXYsIGJpb19kYXRhKHJzcC0+YmlvKSwKKwkJCQkgICAgIGJsa19ycV9ieXRlcyhyc3ApLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWlmICghZG1hX2FkZHJfaW4pIHsKIAkJbXB0MnNhc19iYXNlX2ZyZWVfc21pZChpb2MsIGxlMTZfdG9fY3B1KHNtaWQpKTsKIAkJZ290byB1bm1hcDsKIAl9CiAKLQlpb2MtPmJhc2VfYWRkX3NnX3NpbmdsZShwc2dlLCBzZ2xfZmxhZ3MgfCAocnNwLT5kYXRhX2xlbiArIDQpLAorCWlvYy0+YmFzZV9hZGRfc2dfc2luZ2xlKHBzZ2UsIHNnbF9mbGFncyB8IChibGtfcnFfYnl0ZXMocnNwKSArIDQpLAogCSAgICBkbWFfYWRkcl9pbik7CiAKIAlkdHJhbnNwb3J0cHJpbnRrKGlvYywgcHJpbnRrKE1QVDJTQVNfREVCVUdfRk1UICIlcyAtICIKQEAgLTExNzAsOSArMTE3MCw4IEBACiAKIAkJbWVtY3B5KHJlcS0+c2Vuc2UsIG1waV9yZXBseSwgc2l6ZW9mKCptcGlfcmVwbHkpKTsKIAkJcmVxLT5zZW5zZV9sZW4gPSBzaXplb2YoKm1waV9yZXBseSk7Ci0JCXJlcS0+ZGF0YV9sZW4gPSAwOwotCQlyc3AtPmRhdGFfbGVuIC09IG1waV9yZXBseS0+UmVzcG9uc2VEYXRhTGVuZ3RoOwotCisJCXJlcS0+cmVzaWRfbGVuID0gMDsKKwkJcnNwLT5yZXNpZF9sZW4gLT0gbXBpX3JlcGx5LT5SZXNwb25zZURhdGFMZW5ndGg7CiAJfSBlbHNlIHsKIAkJZHRyYW5zcG9ydHByaW50ayhpb2MsIHByaW50ayhNUFQyU0FTX0RFQlVHX0ZNVAogCQkgICAgIiVzIC0gbm8gcmVwbHlcbiIsIGlvYy0+bmFtZSwgX19mdW5jX18pKTsKQEAgLTExODgsMTAgKzExODcsMTAgQEAKIAogIHVubWFwOgogCWlmIChkbWFfYWRkcl9vdXQpCi0JCXBjaV91bm1hcF9zaW5nbGUoaW9jLT5wZGV2LCBkbWFfYWRkcl9vdXQsIHJlcS0+ZGF0YV9sZW4sCisJCXBjaV91bm1hcF9zaW5nbGUoaW9jLT5wZGV2LCBkbWFfYWRkcl9vdXQsIGJsa19ycV9ieXRlcyhyZXEpLAogCQkgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKIAlpZiAoZG1hX2FkZHJfaW4pCi0JCXBjaV91bm1hcF9zaW5nbGUoaW9jLT5wZGV2LCBkbWFfYWRkcl9pbiwgcnNwLT5kYXRhX2xlbiwKKwkJcGNpX3VubWFwX3NpbmdsZShpb2MtPnBkZXYsIGRtYV9hZGRyX2luLCBibGtfcnFfYnl0ZXMocnNwKSwKIAkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAKICBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYyBiL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCmluZGV4IDFjZTZiMjQuLjU3NzZiMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCkBAIC04ODksMjYgKzg4OSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9zZF9yZXFfYWRkX3NldF9hdHRyX2xpc3QpOwogCi1zdGF0aWMgaW50IF9hcHBlbmRfbWFwX2tlcm4oc3RydWN0IHJlcXVlc3QgKnJlcSwKLQl2b2lkICpidWZmLCB1bnNpZ25lZCBsZW4sIGdmcF90IGZsYWdzKQotewotCXN0cnVjdCBiaW8gKmJpbzsKLQlpbnQgcmV0OwotCi0JYmlvID0gYmlvX21hcF9rZXJuKHJlcS0+cSwgYnVmZiwgbGVuLCBmbGFncyk7Ci0JaWYgKElTX0VSUihiaW8pKSB7Ci0JCU9TRF9FUlIoIkZhaWxlZCBiaW9fbWFwX2tlcm4oJXAsICVkKSA9PiAlbGRcbiIsIGJ1ZmYsIGxlbiwKLQkJCVBUUl9FUlIoYmlvKSk7Ci0JCXJldHVybiBQVFJfRVJSKGJpbyk7Ci0JfQotCXJldCA9IGJsa19ycV9hcHBlbmRfYmlvKHJlcS0+cSwgcmVxLCBiaW8pOwotCWlmIChyZXQpIHsKLQkJT1NEX0VSUigiRmFpbGVkIGJsa19ycV9hcHBlbmRfYmlvKCVwKSA9PiAlZFxuIiwgYmlvLCByZXQpOwotCQliaW9fcHV0KGJpbyk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgX3JlcV9hcHBlbmRfc2VnbWVudChzdHJ1Y3Qgb3NkX3JlcXVlc3QgKm9yLAogCXVuc2lnbmVkIHBhZGRpbmcsIHN0cnVjdCBfb3NkX3JlcV9kYXRhX3NlZ21lbnQgKnNlZywKIAlzdHJ1Y3QgX29zZF9yZXFfZGF0YV9zZWdtZW50ICpsYXN0X3NlZywgc3RydWN0IF9vc2RfaW9faW5mbyAqaW8pCkBAIC05MjQsMTQgKzkwNCwxNCBAQAogCQllbHNlCiAJCQlwYWRfYnVmZiA9IGlvLT5wYWRfYnVmZjsKIAotCQlyZXQgPSBfYXBwZW5kX21hcF9rZXJuKGlvLT5yZXEsIHBhZF9idWZmLCBwYWRkaW5nLAorCQlyZXQgPSBibGtfcnFfbWFwX2tlcm4oaW8tPnJlcS0+cSwgaW8tPnJlcSwgcGFkX2J1ZmYsIHBhZGRpbmcsCiAJCQkJICAgICAgIG9yLT5hbGxvY19mbGFncyk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCQlpby0+dG90YWxfYnl0ZXMgKz0gcGFkZGluZzsKIAl9CiAKLQlyZXQgPSBfYXBwZW5kX21hcF9rZXJuKGlvLT5yZXEsIHNlZy0+YnVmZiwgc2VnLT50b3RhbF9ieXRlcywKKwlyZXQgPSBibGtfcnFfbWFwX2tlcm4oaW8tPnJlcS0+cSwgaW8tPnJlcSwgc2VnLT5idWZmLCBzZWctPnRvdGFsX2J5dGVzLAogCQkJICAgICAgIG9yLT5hbGxvY19mbGFncyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTEyOTMsNiArMTI3MywyMSBAQAogLyoKICAqIG9zZF9maW5hbGl6ZV9yZXF1ZXN0IGFuZCBoZWxwZXJzCiAgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgYm9vbCBoYXNfd3JpdGUsCisJCQkgICAgICBzdHJ1Y3QgX29zZF9pb19pbmZvICpvaWksIGdmcF90IGZsYWdzKQoreworCWlmIChvaWktPmJpbykKKwkJcmV0dXJuIGJsa19tYWtlX3JlcXVlc3QocSwgb2lpLT5iaW8sIGZsYWdzKTsKKwllbHNlIHsKKwkJc3RydWN0IHJlcXVlc3QgKnJlcTsKKworCQlyZXEgPSBibGtfZ2V0X3JlcXVlc3QocSwgaGFzX3dyaXRlID8gV1JJVEUgOiBSRUFELCBmbGFncyk7CisJCWlmICh1bmxpa2VseSghcmVxKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJCXJldHVybiByZXE7CisJfQorfQogCiBzdGF0aWMgaW50IF9pbml0X2Jsa19yZXF1ZXN0KHN0cnVjdCBvc2RfcmVxdWVzdCAqb3IsCiAJYm9vbCBoYXNfaW4sIGJvb2wgaGFzX291dCkKQEAgLTEzMDEsMTEgKzEyOTYsMTMgQEAKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2aWNlID0gb3ItPm9zZF9kZXYtPnNjc2lfZGV2aWNlOwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gc2NzaV9kZXZpY2UtPnJlcXVlc3RfcXVldWU7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKLQlpbnQgcmV0ID0gLUVOT01FTTsKKwlpbnQgcmV0OwogCi0JcmVxID0gYmxrX2dldF9yZXF1ZXN0KHEsIGhhc19vdXQsIGZsYWdzKTsKLQlpZiAoIXJlcSkKKwlyZXEgPSBfbWFrZV9yZXF1ZXN0KHEsIGhhc19vdXQsIGhhc19vdXQgPyAmb3ItPm91dCA6ICZvci0+aW4sIGZsYWdzKTsKKwlpZiAoSVNfRVJSKHJlcSkpIHsKKwkJcmV0ID0gUFRSX0VSUihyZXEpOwogCQlnb3RvIG91dDsKKwl9CiAKIAlvci0+cmVxdWVzdCA9IHJlcTsKIAlyZXEtPmNtZF90eXBlID0gUkVRX1RZUEVfQkxPQ0tfUEM7CkBAIC0xMzE4LDkgKzEzMTUsMTAgQEAKIAkJb3ItPm91dC5yZXEgPSByZXE7CiAJCWlmIChoYXNfaW4pIHsKIAkJCS8qIGFsbG9jYXRlIGJpZGkgcmVxdWVzdCAqLwotCQkJcmVxID0gYmxrX2dldF9yZXF1ZXN0KHEsIFJFQUQsIGZsYWdzKTsKLQkJCWlmICghcmVxKSB7CisJCQlyZXEgPSBfbWFrZV9yZXF1ZXN0KHEsIGZhbHNlLCAmb3ItPmluLCBmbGFncyk7CisJCQlpZiAoSVNfRVJSKHJlcSkpIHsKIAkJCQlPU0RfREVCVUcoImJsa19nZXRfcmVxdWVzdCBmb3IgYmlkaSBmYWlsZWRcbiIpOworCQkJCXJldCA9IFBUUl9FUlIocmVxKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCXJlcS0+Y21kX3R5cGUgPSBSRVFfVFlQRV9CTE9DS19QQzsKQEAgLTEzNjQsMjYgKzEzNjIsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmIChvci0+b3V0LmJpbykgewotCQlyZXQgPSBibGtfcnFfYXBwZW5kX2Jpbyhvci0+cmVxdWVzdC0+cSwgb3ItPm91dC5yZXEsCi0JCQkJCW9yLT5vdXQuYmlvKTsKLQkJaWYgKHJldCkgewotCQkJT1NEX0RFQlVHKCJibGtfcnFfYXBwZW5kX2JpbyBvdXQgZmFpbGVkXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJT1NEX0RFQlVHKCJvdXQgYnl0ZXM9JWxsdSAoYnl0ZXNfcmVxPSV1KVxuIiwKLQkJCV9MTFUob3ItPm91dC50b3RhbF9ieXRlcyksIG9yLT5vdXQucmVxLT5kYXRhX2xlbik7Ci0JfQotCWlmIChvci0+aW4uYmlvKSB7Ci0JCXJldCA9IGJsa19ycV9hcHBlbmRfYmlvKG9yLT5yZXF1ZXN0LT5xLCBvci0+aW4ucmVxLCBvci0+aW4uYmlvKTsKLQkJaWYgKHJldCkgewotCQkJT1NEX0RFQlVHKCJibGtfcnFfYXBwZW5kX2JpbyBpbiBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlPU0RfREVCVUcoImluIGJ5dGVzPSVsbHUgKGJ5dGVzX3JlcT0ldSlcbiIsCi0JCQlfTExVKG9yLT5pbi50b3RhbF9ieXRlcyksIG9yLT5pbi5yZXEtPmRhdGFfbGVuKTsKLQl9Ci0KIAlvci0+b3V0LnBhZF9idWZmID0gc2dfb3V0X3BhZF9idWZmZXI7CiAJb3ItPmluLnBhZF9idWZmID0gc2dfaW5fcGFkX2J1ZmZlcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCBiYjIxOGM4Li5kZDNmOWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtMjQwLDExICsyNDAsMTEgQEAKIAkgKiBpcyBpbnZhbGlkLiAgUHJldmVudCB0aGUgZ2FyYmFnZSBmcm9tIGJlaW5nIG1pc2ludGVycHJldGVkCiAJICogYW5kIHByZXZlbnQgc2VjdXJpdHkgbGVha3MgYnkgemVyb2luZyBvdXQgdGhlIGV4Y2VzcyBkYXRhLgogCSAqLwotCWlmICh1bmxpa2VseShyZXEtPmRhdGFfbGVuID4gMCAmJiByZXEtPmRhdGFfbGVuIDw9IGJ1ZmZsZW4pKQotCQltZW1zZXQoYnVmZmVyICsgKGJ1ZmZsZW4gLSByZXEtPmRhdGFfbGVuKSwgMCwgcmVxLT5kYXRhX2xlbik7CisJaWYgKHVubGlrZWx5KHJlcS0+cmVzaWRfbGVuID4gMCAmJiByZXEtPnJlc2lkX2xlbiA8PSBidWZmbGVuKSkKKwkJbWVtc2V0KGJ1ZmZlciArIChidWZmbGVuIC0gcmVxLT5yZXNpZF9sZW4pLCAwLCByZXEtPnJlc2lkX2xlbik7CiAKIAlpZiAocmVzaWQpCi0JCSpyZXNpZCA9IHJlcS0+ZGF0YV9sZW47CisJCSpyZXNpZCA9IHJlcS0+cmVzaWRfbGVuOwogCXJldCA9IHJlcS0+ZXJyb3JzOwogIG91dDoKIAlibGtfcHV0X3JlcXVlc3QocmVxKTsKQEAgLTU0NiwxNCArNTQ2LDkgQEAKIAkgKiB0byBxdWV1ZSB0aGUgcmVtYWluZGVyIG9mIHRoZW0uCiAJICovCiAJaWYgKGJsa19lbmRfcmVxdWVzdChyZXEsIGVycm9yLCBieXRlcykpIHsKLQkJaW50IGxlZnRvdmVyID0gKHJlcS0+aGFyZF9ucl9zZWN0b3JzIDw8IDkpOwotCi0JCWlmIChibGtfcGNfcmVxdWVzdChyZXEpKQotCQkJbGVmdG92ZXIgPSByZXEtPmRhdGFfbGVuOwotCiAJCS8qIGtpbGwgcmVtYWluZGVyIGlmIG5vIHJldHJ5cyAqLwogCQlpZiAoZXJyb3IgJiYgc2NzaV9ub3JldHJ5X2NtZChjbWQpKQotCQkJYmxrX2VuZF9yZXF1ZXN0KHJlcSwgZXJyb3IsIGxlZnRvdmVyKTsKKwkJCWJsa19lbmRfcmVxdWVzdF9hbGwocmVxLCBlcnJvcik7CiAJCWVsc2UgewogCQkJaWYgKHJlcXVldWUpIHsKIAkJCQkvKgpAQCAtNjczLDM0ICs2NjgsNiBAQAogRVhQT1JUX1NZTUJPTChzY3NpX3JlbGVhc2VfYnVmZmVycyk7CiAKIC8qCi0gKiBCaWRpIGNvbW1hbmRzIE11c3QgYmUgY29tcGxldGUgYXMgYSB3aG9sZSwgYm90aCBzaWRlcyBhdCBvbmNlLgotICogSWYgcGFydCBvZiB0aGUgYnl0ZXMgd2VyZSB3cml0dGVuIGFuZCBsbGQgcmV0dXJuZWQKLSAqIHNjc2lfaW4oKS0+cmVzaWQgYW5kL29yIHNjc2lfb3V0KCktPnJlc2lkIHRoaXMgaW5mb3JtYXRpb24gd2lsbCBiZSBsZWZ0Ci0gKiBpbiByZXEtPmRhdGFfbGVuIGFuZCByZXEtPm5leHRfcnEtPmRhdGFfbGVuLiBUaGUgdXBwZXItbGF5ZXIgZHJpdmVyIGNhbgotICogZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGlzIGluZm9ybWF0aW9uLgotICovCi1zdGF0aWMgdm9pZCBzY3NpX2VuZF9iaWRpX3JlcXVlc3Qoc3RydWN0IHNjc2lfY21uZCAqY21kKQotewotCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBjbWQtPnJlcXVlc3Q7Ci0JdW5zaWduZWQgaW50IGRsZW4gPSByZXEtPmRhdGFfbGVuOwotCXVuc2lnbmVkIGludCBuZXh0X2RsZW4gPSByZXEtPm5leHRfcnEtPmRhdGFfbGVuOwotCi0JcmVxLT5kYXRhX2xlbiA9IHNjc2lfb3V0KGNtZCktPnJlc2lkOwotCXJlcS0+bmV4dF9ycS0+ZGF0YV9sZW4gPSBzY3NpX2luKGNtZCktPnJlc2lkOwotCi0JLyogVGhlIHJlcSBhbmQgcmVxLT5uZXh0X3JxIGhhdmUgbm90IGJlZW4gY29tcGxldGVkICovCi0JQlVHX09OKGJsa19lbmRfYmlkaV9yZXF1ZXN0KHJlcSwgMCwgZGxlbiwgbmV4dF9kbGVuKSk7Ci0KLQlzY3NpX3JlbGVhc2VfYnVmZmVycyhjbWQpOwotCi0JLyoKLQkgKiBUaGlzIHdpbGwgZ29vc2UgdGhlIHF1ZXVlIHJlcXVlc3QgZnVuY3Rpb24gYXQgdGhlIGVuZCwgc28gd2UgZG9uJ3QKLQkgKiBuZWVkIHRvIHdvcnJ5IGFib3V0IGxhdW5jaGluZyBhbm90aGVyIGNvbW1hbmQuCi0JICovCi0Jc2NzaV9uZXh0X2NvbW1hbmQoY21kKTsKLX0KLQotLyoKICAqIEZ1bmN0aW9uOiAgICBzY3NpX2lvX2NvbXBsZXRpb24oKQogICoKICAqIFB1cnBvc2U6ICAgICBDb21wbGV0aW9uIHByb2Nlc3NpbmcgZm9yIGJsb2NrIGRldmljZSBJL08gcmVxdWVzdHMuCkBAIC03MzksNyArNzA2LDYgQEAKIHZvaWQgc2NzaV9pb19jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdW5zaWduZWQgaW50IGdvb2RfYnl0ZXMpCiB7CiAJaW50IHJlc3VsdCA9IGNtZC0+cmVzdWx0OwotCWludCB0aGlzX2NvdW50OwogCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gY21kLT5kZXZpY2UtPnJlcXVlc3RfcXVldWU7CiAJc3RydWN0IHJlcXVlc3QgKnJlcSA9IGNtZC0+cmVxdWVzdDsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtNzczLDEyICs3MzksMjIgQEAKIAkJCWlmICghc2Vuc2VfZGVmZXJyZWQpCiAJCQkJZXJyb3IgPSAtRUlPOwogCQl9CisKKwkJcmVxLT5yZXNpZF9sZW4gPSBzY3NpX2dldF9yZXNpZChjbWQpOworCiAJCWlmIChzY3NpX2JpZGlfY21uZChjbWQpKSB7Ci0JCQkvKiB3aWxsIGFsc28gcmVsZWFzZV9idWZmZXJzICovCi0JCQlzY3NpX2VuZF9iaWRpX3JlcXVlc3QoY21kKTsKKwkJCS8qCisJCQkgKiBCaWRpIGNvbW1hbmRzIE11c3QgYmUgY29tcGxldGUgYXMgYSB3aG9sZSwKKwkJCSAqIGJvdGggc2lkZXMgYXQgb25jZS4KKwkJCSAqLworCQkJcmVxLT5uZXh0X3JxLT5yZXNpZF9sZW4gPSBzY3NpX2luKGNtZCktPnJlc2lkOworCisJCQlibGtfZW5kX3JlcXVlc3RfYWxsKHJlcSwgMCk7CisKKwkJCXNjc2lfcmVsZWFzZV9idWZmZXJzKGNtZCk7CisJCQlzY3NpX25leHRfY29tbWFuZChjbWQpOwogCQkJcmV0dXJuOwogCQl9Ci0JCXJlcS0+ZGF0YV9sZW4gPSBzY3NpX2dldF9yZXNpZChjbWQpOwogCX0KIAogCUJVR19PTihibGtfYmlkaV9ycShyZXEpKTsgLyogYmlkaSBub3Qgc3VwcG9ydCBmb3IgIWJsa19wY19yZXF1ZXN0IHlldCAqLwpAQCAtNzg3LDkgKzc2Myw5IEBACiAJICogTmV4dCBkZWFsIHdpdGggYW55IHNlY3RvcnMgd2hpY2ggd2Ugd2VyZSBhYmxlIHRvIGNvcnJlY3RseQogCSAqIGhhbmRsZS4KIAkgKi8KLQlTQ1NJX0xPR19ITENPTVBMRVRFKDEsIHByaW50aygiJWxkIHNlY3RvcnMgdG90YWwsICIKKwlTQ1NJX0xPR19ITENPTVBMRVRFKDEsIHByaW50aygiJXUgc2VjdG9ycyB0b3RhbCwgIgogCQkJCSAgICAgICIlZCBieXRlcyBkb25lLlxuIiwKLQkJCQkgICAgICByZXEtPm5yX3NlY3RvcnMsIGdvb2RfYnl0ZXMpKTsKKwkJCQkgICAgICBibGtfcnFfc2VjdG9ycyhyZXEpLCBnb29kX2J5dGVzKSk7CiAKIAkvKgogCSAqIFJlY292ZXJlZCBlcnJvcnMgbmVlZCByZXBvcnRpbmcsIGJ1dCB0aGV5J3JlIGFsd2F5cyB0cmVhdGVkCkBAIC04MTIsNyArNzg4LDYgQEAKIAkgKi8KIAlpZiAoc2NzaV9lbmRfcmVxdWVzdChjbWQsIGVycm9yLCBnb29kX2J5dGVzLCByZXN1bHQgPT0gMCkgPT0gTlVMTCkKIAkJcmV0dXJuOwotCXRoaXNfY291bnQgPSBibGtfcnFfYnl0ZXMocmVxKTsKIAogCWVycm9yID0gLUVJTzsKIApAQCAtOTIyLDcgKzg5Nyw3IEBACiAJCQlpZiAoZHJpdmVyX2J5dGUocmVzdWx0KSAmIERSSVZFUl9TRU5TRSkKIAkJCQlzY3NpX3ByaW50X3NlbnNlKCIiLCBjbWQpOwogCQl9Ci0JCWJsa19lbmRfcmVxdWVzdChyZXEsIC1FSU8sIGJsa19ycV9ieXRlcyhyZXEpKTsKKwkJYmxrX2VuZF9yZXF1ZXN0X2FsbChyZXEsIC1FSU8pOwogCQlzY3NpX25leHRfY29tbWFuZChjbWQpOwogCQlicmVhazsKIAljYXNlIEFDVElPTl9SRVBSRVA6CkBAIC05NjUsMTAgKzk0MCw3IEBACiAJY291bnQgPSBibGtfcnFfbWFwX3NnKHJlcS0+cSwgcmVxLCBzZGItPnRhYmxlLnNnbCk7CiAJQlVHX09OKGNvdW50ID4gc2RiLT50YWJsZS5uZW50cyk7CiAJc2RiLT50YWJsZS5uZW50cyA9IGNvdW50OwotCWlmIChibGtfcGNfcmVxdWVzdChyZXEpKQotCQlzZGItPmxlbmd0aCA9IHJlcS0+ZGF0YV9sZW47Ci0JZWxzZQotCQlzZGItPmxlbmd0aCA9IHJlcS0+bnJfc2VjdG9ycyA8PCA5OworCXNkYi0+bGVuZ3RoID0gYmxrX3JxX2J5dGVzKHJlcSk7CiAJcmV0dXJuIEJMS1BSRVBfT0s7CiB9CiAKQEAgLTEwODcsMjIgKzEwNTksMjEgQEAKIAkJaWYgKHVubGlrZWx5KHJldCkpCiAJCQlyZXR1cm4gcmV0OwogCX0gZWxzZSB7Ci0JCUJVR19PTihyZXEtPmRhdGFfbGVuKTsKLQkJQlVHX09OKHJlcS0+ZGF0YSk7CisJCUJVR19PTihibGtfcnFfYnl0ZXMocmVxKSk7CiAKIAkJbWVtc2V0KCZjbWQtPnNkYiwgMCwgc2l6ZW9mKGNtZC0+c2RiKSk7CiAJCXJlcS0+YnVmZmVyID0gTlVMTDsKIAl9CiAKIAljbWQtPmNtZF9sZW4gPSByZXEtPmNtZF9sZW47Ci0JaWYgKCFyZXEtPmRhdGFfbGVuKQorCWlmICghYmxrX3JxX2J5dGVzKHJlcSkpCiAJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfTk9ORTsKIAllbHNlIGlmIChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKQogCQljbWQtPnNjX2RhdGFfZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKIAllbHNlCiAJCWNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPSBETUFfRlJPTV9ERVZJQ0U7CiAJCi0JY21kLT50cmFuc2ZlcnNpemUgPSByZXEtPmRhdGFfbGVuOworCWNtZC0+dHJhbnNmZXJzaXplID0gYmxrX3JxX2J5dGVzKHJlcSk7CiAJY21kLT5hbGxvd2VkID0gcmVxLT5yZXRyaWVzOwogCXJldHVybiBCTEtQUkVQX09LOwogfQpAQCAtMTIxMiw3ICsxMTgzLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBCTEtQUkVQX0RFRkVSOgogCQkvKgotCQkgKiBJZiB3ZSBkZWZlciwgdGhlIGVsdl9uZXh0X3JlcXVlc3QoKSByZXR1cm5zIE5VTEwsIGJ1dCB0aGUKKwkJICogSWYgd2UgZGVmZXIsIHRoZSBibGtfcGVla19yZXF1ZXN0KCkgcmV0dXJucyBOVUxMLCBidXQgdGhlCiAJCSAqIHF1ZXVlIG11c3QgYmUgcmVzdGFydGVkLCBzbyB3ZSBwbHVnIGhlcmUgaWYgbm8gcmV0dXJuaW5nCiAJCSAqIGNvbW1hbmQgd2lsbCBhdXRvbWF0aWNhbGx5IGRvIHRoYXQuCiAJCSAqLwpAQCAtMTM4OCw3ICsxMzU5LDcgQEAKIAlzdHJ1Y3Qgc2NzaV90YXJnZXQgKnN0YXJnZXQgPSBzY3NpX3RhcmdldChzZGV2KTsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHNkZXYtPmhvc3Q7CiAKLQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJlcSk7CisJYmxrX3N0YXJ0X3JlcXVlc3QocmVxKTsKIAogCWlmICh1bmxpa2VseShjbWQgPT0gTlVMTCkpIHsKIAkJcHJpbnRrKEtFUk5fQ1JJVCAiaW1wb3NzaWJsZSByZXF1ZXN0IGluICVzLlxuIiwKQEAgLTE0ODAsNyArMTQ1MSw3IEBACiAKIAlpZiAoIXNkZXYpIHsKIAkJcHJpbnRrKCJzY3NpOiBraWxsaW5nIHJlcXVlc3RzIGZvciBkZWFkIHF1ZXVlXG4iKTsKLQkJd2hpbGUgKChyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSAhPSBOVUxMKQorCQl3aGlsZSAoKHJlcSA9IGJsa19wZWVrX3JlcXVlc3QocSkpICE9IE5VTEwpCiAJCQlzY3NpX2tpbGxfcmVxdWVzdChyZXEsIHEpOwogCQlyZXR1cm47CiAJfQpAQCAtMTUwMSw3ICsxNDcyLDcgQEAKIAkJICogdGhhdCB0aGUgcmVxdWVzdCBpcyBmdWxseSBwcmVwYXJlZCBldmVuIGlmIHdlIGNhbm5vdCAKIAkJICogYWNjZXB0IGl0LgogCQkgKi8KLQkJcmVxID0gZWx2X25leHRfcmVxdWVzdChxKTsKKwkJcmVxID0gYmxrX3BlZWtfcmVxdWVzdChxKTsKIAkJaWYgKCFyZXEgfHwgIXNjc2lfZGV2X3F1ZXVlX3JlYWR5KHEsIHNkZXYpKQogCQkJYnJlYWs7CiAKQEAgLTE1MTcsNyArMTQ4OCw3IEBACiAJCSAqIFJlbW92ZSB0aGUgcmVxdWVzdCBmcm9tIHRoZSByZXF1ZXN0IGxpc3QuCiAJCSAqLwogCQlpZiAoIShibGtfcXVldWVfdGFnZ2VkKHEpICYmICFibGtfcXVldWVfc3RhcnRfdGFnKHEsIHJlcSkpKQotCQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCQkJYmxrX3N0YXJ0X3JlcXVlc3QocmVxKTsKIAkJc2Rldi0+ZGV2aWNlX2J1c3krKzsKIAogCQlzcGluX3VubG9jayhxLT5xdWV1ZV9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX3RndF9saWIuYwppbmRleCA0OGJhNDEzLi4xMDMwMzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV90Z3RfbGliLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfdGd0X2xpYi5jCkBAIC0zODcsNyArMzg3LDcgQEAKIAkgKiB3ZSB1c2UgUkVRX1RZUEVfQkxPQ0tfUEMgc28gc2NzaV9pbml0X2lvIGRvZXNuJ3Qgc2V0IHRoZQogCSAqIGxlbmd0aCBmb3IgdXMuCiAJICovCi0JY21kLT5zZGIubGVuZ3RoID0gcnEtPmRhdGFfbGVuOworCWNtZC0+c2RiLmxlbmd0aCA9IGJsa19ycV9ieXRlcyhycSk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3Nhcy5jCmluZGV4IDUwOTg4Y2IuLmQ2MDY0NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zYXMuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc2FzLmMKQEAgLTE2MywxMiArMTYzLDEwIEBACiAJaW50ICgqaGFuZGxlcikoc3RydWN0IFNjc2lfSG9zdCAqLCBzdHJ1Y3Qgc2FzX3JwaHkgKiwgc3RydWN0IHJlcXVlc3QgKik7CiAKIAl3aGlsZSAoIWJsa19xdWV1ZV9wbHVnZ2VkKHEpKSB7Ci0JCXJlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CisJCXJlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHEpOwogCQlpZiAoIXJlcSkKIAkJCWJyZWFrOwogCi0JCWJsa2Rldl9kZXF1ZXVlX3JlcXVlc3QocmVxKTsKLQogCQlzcGluX3VubG9ja19pcnEocS0+cXVldWVfbG9jayk7CiAKIAkJaGFuZGxlciA9IHRvX3Nhc19pbnRlcm5hbChzaG9zdC0+dHJhbnNwb3J0dCktPmYtPnNtcF9oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NkLmMgYi9kcml2ZXJzL3Njc2kvc2QuYwppbmRleCA4NDA0NDIzLi5iY2YzYmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2QuYworKysgYi9kcml2ZXJzL3Njc2kvc2QuYwpAQCAtMzg0LDkgKzM4NCw5IEBACiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZHAgPSBxLT5xdWV1ZWRhdGE7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBycS0+cnFfZGlzazsKIAlzdHJ1Y3Qgc2NzaV9kaXNrICpzZGtwOwotCXNlY3Rvcl90IGJsb2NrID0gcnEtPnNlY3RvcjsKKwlzZWN0b3JfdCBibG9jayA9IGJsa19ycV9wb3MocnEpOwogCXNlY3Rvcl90IHRocmVzaG9sZDsKLQl1bnNpZ25lZCBpbnQgdGhpc19jb3VudCA9IHJxLT5ucl9zZWN0b3JzOworCXVuc2lnbmVkIGludCB0aGlzX2NvdW50ID0gYmxrX3JxX3NlY3RvcnMocnEpOwogCWludCByZXQsIGhvc3RfZGlmOwogCiAJaWYgKHJxLT5jbWRfdHlwZSA9PSBSRVFfVFlQRV9CTE9DS19QQykgewpAQCAtNDEzLDEwICs0MTMsMTAgQEAKIAkJCQkJdGhpc19jb3VudCkpOwogCiAJaWYgKCFzZHAgfHwgIXNjc2lfZGV2aWNlX29ubGluZShzZHApIHx8Ci0gCSAgICBibG9jayArIHJxLT5ucl9zZWN0b3JzID4gZ2V0X2NhcGFjaXR5KGRpc2spKSB7CisJICAgIGJsb2NrICsgYmxrX3JxX3NlY3RvcnMocnEpID4gZ2V0X2NhcGFjaXR5KGRpc2spKSB7CiAJCVNDU0lfTE9HX0hMUVVFVUUoMiwgc2NtZF9wcmludGsoS0VSTl9JTkZPLCBTQ3BudCwKLQkJCQkJCSJGaW5pc2hpbmcgJWxkIHNlY3RvcnNcbiIsCi0JCQkJCQlycS0+bnJfc2VjdG9ycykpOworCQkJCQkJIkZpbmlzaGluZyAldSBzZWN0b3JzXG4iLAorCQkJCQkJYmxrX3JxX3NlY3RvcnMocnEpKSk7CiAJCVNDU0lfTE9HX0hMUVVFVUUoMiwgc2NtZF9wcmludGsoS0VSTl9JTkZPLCBTQ3BudCwKIAkJCQkJCSJSZXRyeSB3aXRoIDB4JXBcbiIsIFNDcG50KSk7CiAJCWdvdG8gb3V0OwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJICogZm9yIHRoaXMuCiAJICovCiAJaWYgKHNkcC0+c2VjdG9yX3NpemUgPT0gMTAyNCkgewotCQlpZiAoKGJsb2NrICYgMSkgfHwgKHJxLT5ucl9zZWN0b3JzICYgMSkpIHsKKwkJaWYgKChibG9jayAmIDEpIHx8IChibGtfcnFfc2VjdG9ycyhycSkgJiAxKSkgewogCQkJc2NtZF9wcmludGsoS0VSTl9FUlIsIFNDcG50LAogCQkJCSAgICAiQmFkIGJsb2NrIG51bWJlciByZXF1ZXN0ZWRcbiIpOwogCQkJZ290byBvdXQ7CkBAIC00NzMsNyArNDczLDcgQEAKIAkJfQogCX0KIAlpZiAoc2RwLT5zZWN0b3Jfc2l6ZSA9PSAyMDQ4KSB7Ci0JCWlmICgoYmxvY2sgJiAzKSB8fCAocnEtPm5yX3NlY3RvcnMgJiAzKSkgeworCQlpZiAoKGJsb2NrICYgMykgfHwgKGJsa19ycV9zZWN0b3JzKHJxKSAmIDMpKSB7CiAJCQlzY21kX3ByaW50ayhLRVJOX0VSUiwgU0NwbnQsCiAJCQkJICAgICJCYWQgYmxvY2sgbnVtYmVyIHJlcXVlc3RlZFxuIik7CiAJCQlnb3RvIG91dDsKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCQl9CiAJfQogCWlmIChzZHAtPnNlY3Rvcl9zaXplID09IDQwOTYpIHsKLQkJaWYgKChibG9jayAmIDcpIHx8IChycS0+bnJfc2VjdG9ycyAmIDcpKSB7CisJCWlmICgoYmxvY2sgJiA3KSB8fCAoYmxrX3JxX3NlY3RvcnMocnEpICYgNykpIHsKIAkJCXNjbWRfcHJpbnRrKEtFUk5fRVJSLCBTQ3BudCwKIAkJCQkgICAgIkJhZCBibG9jayBudW1iZXIgcmVxdWVzdGVkXG4iKTsKIAkJCWdvdG8gb3V0OwpAQCAtNTEyLDEwICs1MTIsMTAgQEAKIAl9CiAKIAlTQ1NJX0xPR19ITFFVRVVFKDIsIHNjbWRfcHJpbnRrKEtFUk5fSU5GTywgU0NwbnQsCi0JCQkJCSIlcyAlZC8lbGQgNTEyIGJ5dGUgYmxvY2tzLlxuIiwKKwkJCQkJIiVzICVkLyV1IDUxMiBieXRlIGJsb2Nrcy5cbiIsCiAJCQkJCShycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpID8KIAkJCQkJIndyaXRpbmciIDogInJlYWRpbmciLCB0aGlzX2NvdW50LAotCQkJCQlycS0+bnJfc2VjdG9ycykpOworCQkJCQlibGtfcnFfc2VjdG9ycyhycSkpKTsKIAogCS8qIFNldCBSRFBST1RFQ1QvV1JQUk9URUNUIGlmIGRpc2sgaXMgZm9ybWF0dGVkIHdpdGggRElGICovCiAJaG9zdF9kaWYgPSBzY3NpX2hvc3RfZGlmX2NhcGFibGUoc2RwLT5ob3N0LCBzZGtwLT5wcm90ZWN0aW9uX3R5cGUpOwpAQCAtOTcxLDggKzk3MSw4IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2RfY29tcGxldGVkX2J5dGVzKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCiB7Ci0JdTY0IHN0YXJ0X2xiYSA9IHNjbWQtPnJlcXVlc3QtPnNlY3RvcjsKLQl1NjQgZW5kX2xiYSA9IHNjbWQtPnJlcXVlc3QtPnNlY3RvciArIChzY3NpX2J1ZmZsZW4oc2NtZCkgLyA1MTIpOworCXU2NCBzdGFydF9sYmEgPSBibGtfcnFfcG9zKHNjbWQtPnJlcXVlc3QpOworCXU2NCBlbmRfbGJhID0gYmxrX3JxX3BvcyhzY21kLT5yZXF1ZXN0KSArIChzY3NpX2J1ZmZsZW4oc2NtZCkgLyA1MTIpOwogCXU2NCBiYWRfbGJhOwogCWludCBpbmZvX3ZhbGlkOwogCkBAIC0xNTEwLDcgKzE1MTAsNyBAQAogCQkgKi8KIAkJc2VjdG9yX3NpemUgPSA1MTI7CiAJfQotCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHNkcC0+cmVxdWVzdF9xdWV1ZSwgc2VjdG9yX3NpemUpOworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoc2RwLT5yZXF1ZXN0X3F1ZXVlLCBzZWN0b3Jfc2l6ZSk7CiAKIAl7CiAJCWNoYXIgY2FwX3N0cl8yWzEwXSwgY2FwX3N0cl8xMFsxMF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2RfZGlmLmMgYi9kcml2ZXJzL3Njc2kvc2RfZGlmLmMKaW5kZXggMTg0ZGZmNC4uODJmMTRhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NkX2RpZi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zZF9kaWYuYwpAQCAtNTA3LDcgKzUwNyw3IEBACiAJc2VjdG9yX3N6ID0gc2NtZC0+ZGV2aWNlLT5zZWN0b3Jfc2l6ZTsKIAlzZWN0b3JzID0gZ29vZF9ieXRlcyAvIHNlY3Rvcl9zejsKIAotCXBoeXMgPSBzY21kLT5yZXF1ZXN0LT5zZWN0b3IgJiAweGZmZmZmZmZmOworCXBoeXMgPSBibGtfcnFfcG9zKHNjbWQtPnJlcXVlc3QpICYgMHhmZmZmZmZmZjsKIAlpZiAoc2VjdG9yX3N6ID09IDQwOTYpCiAJCXBoeXMgPj49IDM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zZy5jIGIvZHJpdmVycy9zY3NpL3NnLmMKaW5kZXggZTE3MTZmMS4uODIwMTM4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NnLmMKKysrIGIvZHJpdmVycy9zY3NpL3NnLmMKQEAgLTI4OSw4ICsyODksOCBAQAogCWlmIChsaXN0X2VtcHR5KCZzZHAtPnNmZHMpKSB7CS8qIG5vIGV4aXN0aW5nIG9wZW5zIG9uIHRoaXMgZGV2aWNlICovCiAJCXNkcC0+c2dkZWJ1ZyA9IDA7CiAJCXEgPSBzZHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKLQkJc2RwLT5zZ190YWJsZXNpemUgPSBtaW4ocS0+bWF4X2h3X3NlZ21lbnRzLAotCQkJCQlxLT5tYXhfcGh5c19zZWdtZW50cyk7CisJCXNkcC0+c2dfdGFibGVzaXplID0gbWluKHF1ZXVlX21heF9od19zZWdtZW50cyhxKSwKKwkJCQkJcXVldWVfbWF4X3BoeXNfc2VnbWVudHMocSkpOwogCX0KIAlpZiAoKHNmcCA9IHNnX2FkZF9zZnAoc2RwLCBkZXYpKSkKIAkJZmlscC0+cHJpdmF0ZV9kYXRhID0gc2ZwOwpAQCAtOTA5LDcgKzkwOSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKHZhbCA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKIAkJdmFsID0gbWluX3QoaW50LCB2YWwsCi0JCQkJc2RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPm1heF9zZWN0b3JzICogNTEyKTsKKwkJCSAgICBxdWV1ZV9tYXhfc2VjdG9ycyhzZHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZSkgKiA1MTIpOwogCQlpZiAodmFsICE9IHNmcC0+cmVzZXJ2ZS5idWZmbGVuKSB7CiAJCQlpZiAoc2dfcmVzX2luX3VzZShzZnApIHx8IHNmcC0+bW1hcF9jYWxsZWQpCiAJCQkJcmV0dXJuIC1FQlVTWTsKQEAgLTkxOSw3ICs5MTksNyBAQAogCQlyZXR1cm4gMDsKIAljYXNlIFNHX0dFVF9SRVNFUlZFRF9TSVpFOgogCQl2YWwgPSBtaW5fdChpbnQsIHNmcC0+cmVzZXJ2ZS5idWZmbGVuLAotCQkJCXNkcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5tYXhfc2VjdG9ycyAqIDUxMik7CisJCQkgICAgcXVldWVfbWF4X3NlY3RvcnMoc2RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUpICogNTEyKTsKIAkJcmV0dXJuIHB1dF91c2VyKHZhbCwgaXApOwogCWNhc2UgU0dfU0VUX0NPTU1BTkRfUToKIAkJcmVzdWx0ID0gZ2V0X3VzZXIodmFsLCBpcCk7CkBAIC0xMDU5LDEyICsxMDU5LDEzIEBACiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJcmV0dXJuIHNjc2lfaW9jdGwoc2RwLT5kZXZpY2UsIGNtZF9pbiwgcCk7CiAJY2FzZSBCTEtTRUNUR0VUOgotCQlyZXR1cm4gcHV0X3VzZXIoc2RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUtPm1heF9zZWN0b3JzICogNTEyLAorCQlyZXR1cm4gcHV0X3VzZXIocXVldWVfbWF4X3NlY3RvcnMoc2RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUpICogNTEyLAogCQkJCWlwKTsKIAljYXNlIEJMS1RSQUNFU0VUVVA6CiAJCXJldHVybiBibGtfdHJhY2Vfc2V0dXAoc2RwLT5kZXZpY2UtPnJlcXVlc3RfcXVldWUsCiAJCQkJICAgICAgIHNkcC0+ZGlzay0+ZGlza19uYW1lLAogCQkJCSAgICAgICBNS0RFVihTQ1NJX0dFTkVSSUNfTUFKT1IsIHNkcC0+aW5kZXgpLAorCQkJCSAgICAgICBOVUxMLAogCQkJCSAgICAgICAoY2hhciAqKWFyZyk7CiAJY2FzZSBCTEtUUkFDRVNUQVJUOgogCQlyZXR1cm4gYmxrX3RyYWNlX3N0YXJ0c3RvcChzZHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZSwgMSk7CkBAIC0xMjYwLDcgKzEyNjEsNyBAQAogCiAJc2Vuc2UgPSBycS0+c2Vuc2U7CiAJcmVzdWx0ID0gcnEtPmVycm9yczsKLQlyZXNpZCA9IHJxLT5kYXRhX2xlbjsKKwlyZXNpZCA9IHJxLT5yZXNpZF9sZW47CiAKIAlTQ1NJX0xPR19USU1FT1VUKDQsIHByaW50aygic2dfY21kX2RvbmU6ICVzLCBwYWNrX2lkPSVkLCByZXM9MHgleFxuIiwKIAkJc2RwLT5kaXNrLT5kaXNrX25hbWUsIHNycC0+aGVhZGVyLnBhY2tfaWQsIHJlc3VsdCkpOwpAQCAtMTM3Nyw3ICsxMzc4LDggQEAKIAlzZHAtPmRldmljZSA9IHNjc2lkcDsKIAlJTklUX0xJU1RfSEVBRCgmc2RwLT5zZmRzKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZHAtPm9fZXhjbF93YWl0KTsKLQlzZHAtPnNnX3RhYmxlc2l6ZSA9IG1pbihxLT5tYXhfaHdfc2VnbWVudHMsIHEtPm1heF9waHlzX3NlZ21lbnRzKTsKKwlzZHAtPnNnX3RhYmxlc2l6ZSA9IG1pbihxdWV1ZV9tYXhfaHdfc2VnbWVudHMocSksCisJCQkJcXVldWVfbWF4X3BoeXNfc2VnbWVudHMocSkpOwogCXNkcC0+aW5kZXggPSBrOwogCWtyZWZfaW5pdCgmc2RwLT5kX3JlZik7CiAKQEAgLTIwNTUsNyArMjA1Nyw3IEBACiAJCXNnX2JpZ19idWZmID0gZGVmX3Jlc2VydmVkX3NpemU7CiAKIAlidWZmbGVuID0gbWluX3QoaW50LCBzZ19iaWdfYnVmZiwKLQkJCXNkcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLT5tYXhfc2VjdG9ycyAqIDUxMik7CisJCQlxdWV1ZV9tYXhfc2VjdG9ycyhzZHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZSkgKiA1MTIpOwogCXNnX2J1aWxkX3Jlc2VydmUoc2ZwLCBidWZmbGVuKTsKIAlTQ1NJX0xPR19USU1FT1VUKDMsIHByaW50aygic2dfYWRkX3NmcDogICBidWZmbGVuPSVkLCBrX3VzZV9zZz0lZFxuIiwKIAkJCSAgIHNmcC0+cmVzZXJ2ZS5idWZmbGVuLCBzZnAtPnJlc2VydmUua191c2Vfc2cpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zci5jIGIvZHJpdmVycy9zY3NpL3NyLmMKaW5kZXggMGUxYTBmMi4uY2QzNTBkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NyLmMKKysrIGIvZHJpdmVycy9zY3NpL3NyLmMKQEAgLTI5Miw3ICsyOTIsOCBAQAogCQkJaWYgKGNkLT5kZXZpY2UtPnNlY3Rvcl9zaXplID09IDIwNDgpCiAJCQkJZXJyb3Jfc2VjdG9yIDw8PSAyOwogCQkJZXJyb3Jfc2VjdG9yICY9IH4oYmxvY2tfc2VjdG9ycyAtIDEpOwotCQkJZ29vZF9ieXRlcyA9IChlcnJvcl9zZWN0b3IgLSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yKSA8PCA5OworCQkJZ29vZF9ieXRlcyA9IChlcnJvcl9zZWN0b3IgLQorCQkJCSAgICAgIGJsa19ycV9wb3MoU0NwbnQtPnJlcXVlc3QpKSA8PCA5OwogCQkJaWYgKGdvb2RfYnl0ZXMgPCAwIHx8IGdvb2RfYnl0ZXMgPj0gdGhpc19jb3VudCkKIAkJCQlnb29kX2J5dGVzID0gMDsKIAkJCS8qCkBAIC0zNDksOCArMzUwLDggQEAKIAkJCQljZC0+ZGlzay0+ZGlza19uYW1lLCBibG9jaykpOwogCiAJaWYgKCFjZC0+ZGV2aWNlIHx8ICFzY3NpX2RldmljZV9vbmxpbmUoY2QtPmRldmljZSkpIHsKLQkJU0NTSV9MT0dfSExRVUVVRSgyLCBwcmludGsoIkZpbmlzaGluZyAlbGQgc2VjdG9yc1xuIiwKLQkJCQkJcnEtPm5yX3NlY3RvcnMpKTsKKwkJU0NTSV9MT0dfSExRVUVVRSgyLCBwcmludGsoIkZpbmlzaGluZyAldSBzZWN0b3JzXG4iLAorCQkJCQkgICBibGtfcnFfc2VjdG9ycyhycSkpKTsKIAkJU0NTSV9MT0dfSExRVUVVRSgyLCBwcmludGsoIlJldHJ5IHdpdGggMHglcFxuIiwgU0NwbnQpKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDEzLDcgKzQxNCw3IEBACiAJLyoKIAkgKiByZXF1ZXN0IGRvZXNuJ3Qgc3RhcnQgb24gaHcgYmxvY2sgYm91bmRhcnksIGFkZCBzY2F0dGVyIHBhZHMKIAkgKi8KLQlpZiAoKCh1bnNpZ25lZCBpbnQpcnEtPnNlY3RvciAlIChzX3NpemUgPj4gOSkpIHx8CisJaWYgKCgodW5zaWduZWQgaW50KWJsa19ycV9wb3MocnEpICUgKHNfc2l6ZSA+PiA5KSkgfHwKIAkgICAgKHNjc2lfYnVmZmxlbihTQ3BudCkgJSBzX3NpemUpKSB7CiAJCXNjbWRfcHJpbnRrKEtFUk5fTk9USUNFLCBTQ3BudCwgInVuYWxpZ25lZCB0cmFuc2ZlclxuIik7CiAJCWdvdG8gb3V0OwpAQCAtNDIyLDE0ICs0MjMsMTQgQEAKIAl0aGlzX2NvdW50ID0gKHNjc2lfYnVmZmxlbihTQ3BudCkgPj4gOSkgLyAoc19zaXplID4+IDkpOwogCiAKLQlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiJXMgOiAlcyAlZC8lbGQgNTEyIGJ5dGUgYmxvY2tzLlxuIiwKKwlTQ1NJX0xPR19ITFFVRVVFKDIsIHByaW50aygiJXMgOiAlcyAlZC8ldSA1MTIgYnl0ZSBibG9ja3MuXG4iLAogCQkJCWNkLT5jZGkubmFtZSwKIAkJCQkocnFfZGF0YV9kaXIocnEpID09IFdSSVRFKSA/CiAJCQkJCSJ3cml0aW5nIiA6ICJyZWFkaW5nIiwKLQkJCQl0aGlzX2NvdW50LCBycS0+bnJfc2VjdG9ycykpOworCQkJCXRoaXNfY291bnQsIGJsa19ycV9zZWN0b3JzKHJxKSkpOwogCiAJU0NwbnQtPmNtbmRbMV0gPSAwOwotCWJsb2NrID0gKHVuc2lnbmVkIGludClycS0+c2VjdG9yIC8gKHNfc2l6ZSA+PiA5KTsKKwlibG9jayA9ICh1bnNpZ25lZCBpbnQpYmxrX3JxX3BvcyhycSkgLyAoc19zaXplID4+IDkpOwogCiAJaWYgKHRoaXNfY291bnQgPiAweGZmZmYpIHsKIAkJdGhpc19jb3VudCA9IDB4ZmZmZjsKQEAgLTcyNiw3ICs3MjcsNyBAQAogCX0KIAogCXF1ZXVlID0gY2QtPmRldmljZS0+cmVxdWVzdF9xdWV1ZTsKLQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShxdWV1ZSwgc2VjdG9yX3NpemUpOworCWJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUocXVldWUsIHNlY3Rvcl9zaXplKTsKIAogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zdC5jIGIvZHJpdmVycy9zY3NpL3N0LmMKaW5kZXggZWIyNGVmZS4uODliZDQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N0LmMKKysrIGIvZHJpdmVycy9zY3NpL3N0LmMKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCXN0cnVjdCBzY3NpX3RhcGUgKlNUcCA9IFNScG50LT5zdHA7CiAKIAlTVHAtPmJ1ZmZlci0+Y21kc3RhdC5taWRsZXZlbF9yZXN1bHQgPSBTUnBudC0+cmVzdWx0ID0gcmVxLT5lcnJvcnM7Ci0JU1RwLT5idWZmZXItPmNtZHN0YXQucmVzaWR1YWwgPSByZXEtPmRhdGFfbGVuOworCVNUcC0+YnVmZmVyLT5jbWRzdGF0LnJlc2lkdWFsID0gcmVxLT5yZXNpZF9sZW47CiAKIAlpZiAoU1JwbnQtPndhaXRpbmcpCiAJCWNvbXBsZXRlKFNScG50LT53YWl0aW5nKTsKQEAgLTM5ODMsOCArMzk4Myw4IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWkgPSBtaW4oU0RwLT5yZXF1ZXN0X3F1ZXVlLT5tYXhfaHdfc2VnbWVudHMsCi0JCVNEcC0+cmVxdWVzdF9xdWV1ZS0+bWF4X3BoeXNfc2VnbWVudHMpOworCWkgPSBtaW4ocXVldWVfbWF4X2h3X3NlZ21lbnRzKFNEcC0+cmVxdWVzdF9xdWV1ZSksCisJCXF1ZXVlX21heF9waHlzX3NlZ21lbnRzKFNEcC0+cmVxdWVzdF9xdWV1ZSkpOwogCWlmIChzdF9tYXhfc2dfc2VncyA8IGkpCiAJCWkgPSBzdF9tYXhfc2dfc2VnczsKIAlidWZmZXIgPSBuZXdfdGFwZV9idWZmZXIoKFNEcC0+aG9zdCktPnVuY2hlY2tlZF9pc2FfZG1hLCBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMgYi9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCmluZGV4IDYwMWU5NTEuLjU0MDIzZDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvdTE0LTM0Zi5jCisrKyBiL2RyaXZlcnMvc2NzaS91MTQtMzRmLmMKQEAgLTEzMDYsNyArMTMwNiw3IEBACiAgICBpZiAobGlua2VkX2NvbW0gJiYgU0NwbnQtPmRldmljZS0+cXVldWVfZGVwdGggPiAyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVExERVYoU0NwbnQtPmRldmljZS0+dHlwZSkpIHsKICAgICAgIEhEKGopLT5jcF9zdGF0W2ldID0gUkVBRFk7Ci0gICAgICBmbHVzaF9kZXYoU0NwbnQtPmRldmljZSwgU0NwbnQtPnJlcXVlc3QtPnNlY3RvciwgaiwgRkFMU0UpOworICAgICAgZmx1c2hfZGV2KFNDcG50LT5kZXZpY2UsIGJsa19ycV9wb3MoU0NwbnQtPnJlcXVlc3QpLCBqLCBGQUxTRSk7CiAgICAgICByZXR1cm4gMDsKICAgICAgIH0KIApAQCAtMTYxMCwxMSArMTYxMCwxMyBAQAogCiAgICAgICBpZiAoIShjcHAtPnhkaXIgPT0gRFREX0lOKSkgaW5wdXRfb25seSA9IEZBTFNFOwogCi0gICAgICBpZiAoU0NwbnQtPnJlcXVlc3QtPnNlY3RvciA8IG1pbnNlYykgbWluc2VjID0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvcjsKLSAgICAgIGlmIChTQ3BudC0+cmVxdWVzdC0+c2VjdG9yID4gbWF4c2VjKSBtYXhzZWMgPSBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yOworICAgICAgaWYgKGJsa19ycV9wb3MoU0NwbnQtPnJlcXVlc3QpIDwgbWluc2VjKQorCSBtaW5zZWMgPSBibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KTsKKyAgICAgIGlmIChibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KSA+IG1heHNlYykKKwkgbWF4c2VjID0gYmxrX3JxX3BvcyhTQ3BudC0+cmVxdWVzdCk7CiAKLSAgICAgIHNsW25dID0gU0NwbnQtPnJlcXVlc3QtPnNlY3RvcjsKLSAgICAgIGlvc2VlayArPSBTQ3BudC0+cmVxdWVzdC0+bnJfc2VjdG9yczsKKyAgICAgIHNsW25dID0gYmxrX3JxX3BvcyhTQ3BudC0+cmVxdWVzdCk7CisgICAgICBpb3NlZWsgKz0gYmxrX3JxX3NlY3RvcnMoU0NwbnQtPnJlcXVlc3QpOwogCiAgICAgICBpZiAoIW4pIGNvbnRpbnVlOwogCkBAIC0xNjQyLDcgKzE2NDQsNyBAQAogCiAgICBpZiAoIWlucHV0X29ubHkpIGZvciAobiA9IDA7IG4gPCBuX3JlYWR5OyBuKyspIHsKICAgICAgIGsgPSBpbFtuXTsgY3BwID0gJkhEKGopLT5jcFtrXTsgU0NwbnQgPSBjcHAtPlNDcG50OwotICAgICAgbGxbbl0gPSBTQ3BudC0+cmVxdWVzdC0+bnJfc2VjdG9yczsgcGxbbl0gPSBTQ3BudC0+c2VyaWFsX251bWJlcjsKKyAgICAgIGxsW25dID0gYmxrX3JxX3NlY3RvcnMoU0NwbnQtPnJlcXVlc3QpOyBwbFtuXSA9IFNDcG50LT5zZXJpYWxfbnVtYmVyOwogCiAgICAgICBpZiAoIW4pIGNvbnRpbnVlOwogCkBAIC0xNjY2LDEyICsxNjY4LDEyIEBACiAgICBpZiAobGlua19zdGF0aXN0aWNzICYmIChvdmVybGFwIHx8ICEoZmx1c2hjb3VudCAlIGxpbmtfc3RhdGlzdGljcykpKQogICAgICAgZm9yIChuID0gMDsgbiA8IG5fcmVhZHk7IG4rKykgewogICAgICAgICAgayA9IGlsW25dOyBjcHAgPSAmSEQoaiktPmNwW2tdOyBTQ3BudCA9IGNwcC0+U0NwbnQ7Ci0gICAgICAgICBwcmludGsoIiVzICVkLiVkOiVkIHBpZCAlbGQgbWIgJWQgZmMgJWQgbnIgJWQgc2VjICVsZCBucyAlbGQiXAorICAgICAgICAgcHJpbnRrKCIlcyAlZC4lZDolZCBwaWQgJWxkIG1iICVkIGZjICVkIG5yICVkIHNlYyAlbGQgbnMgJXUiXAogICAgICAgICAgICAgICAgICIgY3VyICVsZCBzOiVjIHI6JWMgcmV2OiVjIGluOiVjIG92OiVjIHhkICVkLlxuIiwKICAgICAgICAgICAgICAgICAoaWhkbHIgPyAiaWhkbHIiIDogInFjb21tIiksIFNDcG50LT5jaGFubmVsLCBTQ3BudC0+dGFyZ2V0LAogICAgICAgICAgICAgICAgIFNDcG50LT5sdW4sIFNDcG50LT5zZXJpYWxfbnVtYmVyLCBrLCBmbHVzaGNvdW50LCBuX3JlYWR5LAotICAgICAgICAgICAgICAgIFNDcG50LT5yZXF1ZXN0LT5zZWN0b3IsIFNDcG50LT5yZXF1ZXN0LT5ucl9zZWN0b3JzLCBjdXJzZWMsCi0gICAgICAgICAgICAgICAgWUVTTk8ocyksIFlFU05PKHIpLCBZRVNOTyhyZXYpLCBZRVNOTyhpbnB1dF9vbmx5KSwKKyAgICAgICAgICAgICAgICBibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KSwgYmxrX3JxX3NlY3RvcnMoU0NwbnQtPnJlcXVlc3QpLAorCQljdXJzZWMsIFlFU05PKHMpLCBZRVNOTyhyKSwgWUVTTk8ocmV2KSwgWUVTTk8oaW5wdXRfb25seSksCiAgICAgICAgICAgICAgICAgWUVTTk8ob3ZlcmxhcCksIGNwcC0+eGRpcik7CiAgICAgICAgICB9CiAjZW5kaWYKQEAgLTE3OTksNyArMTgwMSw3IEBACiAKICAgIGlmIChsaW5rZWRfY29tbSAmJiBTQ3BudC0+ZGV2aWNlLT5xdWV1ZV9kZXB0aCA+IDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBUTERFVihTQ3BudC0+ZGV2aWNlLT50eXBlKSkKLSAgICAgIGZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBTQ3BudC0+cmVxdWVzdC0+c2VjdG9yLCBqLCBUUlVFKTsKKyAgICAgIGZsdXNoX2RldihTQ3BudC0+ZGV2aWNlLCBibGtfcnFfcG9zKFNDcG50LT5yZXF1ZXN0KSwgaiwgVFJVRSk7CiAKICAgIHRzdGF0dXMgPSBzdGF0dXNfYnl0ZShzcHAtPnRhcmdldF9zdGF0dXMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC84MjUwLmMgYi9kcml2ZXJzL3NlcmlhbC84MjUwLmMKaW5kZXggYTAxMjdlOS4uZmI4NjdhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsLzgyNTAuYwpAQCAtMjg3LDYgKzI4NywxMyBAQAogCQkuZmNyCQk9IFVBUlRfRkNSX0VOQUJMRV9GSUZPIHwgVUFSVF9GQ1JfUl9UUklHXzEwLAogCQkuZmxhZ3MJCT0gVUFSVF9DQVBfRklGTywKIAl9LAorCVtQT1JUX0FSN10gPSB7CisJCS5uYW1lCQk9ICJBUjciLAorCQkuZmlmb19zaXplCT0gMTYsCisJCS50eF9sb2Fkc3oJPSAxNiwKKwkJLmZjcgkJPSBVQVJUX0ZDUl9FTkFCTEVfRklGTyB8IFVBUlRfRkNSX1JfVFJJR18wMCwKKwkJLmZsYWdzCQk9IFVBUlRfQ0FQX0ZJRk8gfCBVQVJUX0NBUF9BRkUsCisJfSwKIH07CiAKICNpZiBkZWZpbmVkIChDT05GSUdfU0VSSUFMXzgyNTBfQVUxWDAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYyBiL2RyaXZlcnMvc2VyaWFsLzgyNTBfcGNpLmMKaW5kZXggOTM4YmMxYi4uZTM3MWE5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvODI1MF9wY2kuYworKysgYi9kcml2ZXJzL3NlcmlhbC84MjUwX3BjaS5jCkBAIC0yNzc2LDYgKzI3NzYsOSBAQAogCXsJUENJX1ZFTkRPUl9JRF9PWFNFTUksIDB4OTUwYSwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IwXzJfMTEzMDAwMCB9LAorCXsJUENJX1ZFTkRPUl9JRF9PWFNFTUksIFBDSV9ERVZJQ0VfSURfT1hTRU1JX0M5NTAsCisJCVBDSV9WRU5ET1JfSURfT1hTRU1JLCBQQ0lfU1VCREVWSUNFX0lEX09YU0VNSV9DOTUwLCAwLCAwLAorCQlwYm5fYjBfMV85MjE2MDAgfSwKIAl7CVBDSV9WRU5ET1JfSURfT1hTRU1JLCBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NCwKIAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkJcGJuX2IwXzRfMTE1MjAwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwppbmRleCAzNDNlM2EzLi42NDFlODAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKQEAgLTgzMyw2ICs4MzMsNyBAQAogCWJvb2wgIklNWCBzZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNICYmIChBUkNIX0lNWCB8fCBBUkNIX01YQykKIAlzZWxlY3QgU0VSSUFMX0NPUkUKKwlzZWxlY3QgUkFUSU9OQUwKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIG1hY2hpbmUgYmFzZWQgb24gYSBNb3Rvcm9sYSBJTVggQ1BVIHlvdQogCSAgY2FuIGVuYWJsZSBpdHMgb25ib2FyZCBzZXJpYWwgcG9ydCBieSBlbmFibGluZyB0aGlzIG9wdGlvbi4KQEAgLTE0MzMsNCArMTQzNCwxMSBAQAogCWRlZmF1bHQgMTkyMDAgaWYgKFNFUklBTF9TUE9SVF9CQVVEX1JBVEVfMTkyMDApCiAJZGVmYXVsdCA5NjAwIGlmIChTRVJJQUxfU1BPUlRfQkFVRF9SQVRFXzk2MDApCiAKK2NvbmZpZyBTRVJJQUxfVElNQkVSREFMRQorCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aW1iZXJkYWxlIFVBUlQiCisJZGVwZW5kcyBvbiBNRkRfVElNQkVSREFMRQorCXNlbGVjdCBTRVJJQUxfQ09SRQorCS0tLWhlbHAtLS0KKwlBZGQgc3VwcG9ydCBmb3IgVUFSVCBjb250cm9sbGVyIG9uIHRpbWJlcmRhbGUuCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKaW5kZXggZDQzOGViMi4uNDVhODY1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTc3LDMgKzc3LDQgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfS1M4Njk1KSArPSBzZXJpYWxfa3M4Njk1Lm8KIG9iai0kKENPTkZJR19LR0RCX1NFUklBTF9DT05TT0xFKSArPSBrZ2Rib2Mubwogb2JqLSQoQ09ORklHX1NFUklBTF9RRSkgKz0gdWNjX3VhcnQubworb2JqLSQoQ09ORklHX1NFUklBTF9USU1CRVJEQUxFKQkrPSB0aW1idWFydC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9iZmluXzV4eC5jIGIvZHJpdmVycy9zZXJpYWwvYmZpbl81eHguYwppbmRleCBkODYxMjNlLi5lMmY2YjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9iZmluXzV4eC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2JmaW5fNXh4LmMKQEAgLTMzMCw2ICszMzAsMTEgQEAKIAkJLyogQ2xlYXIgVEZJIGJpdCAqLwogCQlVQVJUX1BVVF9MU1IodWFydCwgVEZJKTsKICNlbmRpZgorCQkvKiBBbm9tYWx5IG5vdGVzOgorCQkgKiAgMDUwMDAyMTUgLQl3ZSBhbHdheXMgY2xlYXIgRVRCRUkgd2l0aGluIGxhc3QgVUFSVCBUWAorCQkgKgkJaW50ZXJydXB0IHRvIGVuZCBhIHN0cmluZy4gSXQgaXMgYWx3YXlzIHNldAorCQkgKgkJd2hlbiBzdGFydCBhIG5ldyB0eC4KKwkJICovCiAJCVVBUlRfQ0xFQVJfSUVSKHVhcnQsIEVUQkVJKTsKIAkJcmV0dXJuOwogCX0KQEAgLTQxNSw2ICs0MjAsNyBAQAogCXNldF9kbWFfc3RhcnRfYWRkcih1YXJ0LT50eF9kbWFfY2hhbm5lbCwgKHVuc2lnbmVkIGxvbmcpKHhtaXQtPmJ1Zit4bWl0LT50YWlsKSk7CiAJc2V0X2RtYV94X2NvdW50KHVhcnQtPnR4X2RtYV9jaGFubmVsLCB1YXJ0LT50eF9jb3VudCk7CiAJc2V0X2RtYV94X21vZGlmeSh1YXJ0LT50eF9kbWFfY2hhbm5lbCwgMSk7CisJU1NZTkMoKTsKIAllbmFibGVfZG1hKHVhcnQtPnR4X2RtYV9jaGFubmVsKTsKIAogCVVBUlRfU0VUX0lFUih1YXJ0LCBFVEJFSSk7CkBAIC00NzMsMjcgKzQ3OSw0MSBAQAogdm9pZCBiZmluX3NlcmlhbF9yeF9kbWFfdGltZW91dChzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCkKIHsKIAlpbnQgeF9wb3MsIHBvczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVhcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCWRtYV9kaXNhYmxlX2lycSh1YXJ0LT5yeF9kbWFfY2hhbm5lbCk7CisJc3Bpbl9sb2NrX2JoKCZ1YXJ0LT5wb3J0LmxvY2spOwogCisJLyogMkQgRE1BIFJYIGJ1ZmZlciByaW5nIGlzIHVzZWQuIEJlY2F1c2UgY3Vycl95X2NvdW50IGFuZAorCSAqIGN1cnJfeF9jb3VudCBjYW4ndCBiZSByZWFkIGFzIGFuIGF0b21pYyBvcGVyYXRpb24sCisJICogY3Vycl95X2NvdW50IHNob3VsZCBiZSByZWFkIGJlZm9yZSBjdXJyX3hfY291bnQuIFdoZW4KKwkgKiBjdXJyX3hfY291bnQgaXMgcmVhZCwgY3Vycl95X2NvdW50IG1heSBhbHJlYWR5IGluZGljYXRlCisJICogbmV4dCBidWZmZXIgbGluZS4gQnV0LCB0aGUgcG9zaXRpb24gY2FsY3VsYXRlZCBoZXJlIGlzCisJICogc3RpbGwgaW5kaWNhdGUgdGhlIG9sZCBsaW5lLiBUaGUgd3JvbmcgcG9zaXRpb24gZGF0YSBtYXkKKwkgKiBiZSBzbWFsbGVyIHRoYW4gY3VycmVudCBidWZmZXIgdGFpbCwgd2hpY2ggY2F1c2UgZ2FyYmFnZXMKKwkgKiBhcmUgcmVjZWl2ZWQgaWYgaXQgaXMgbm90IHByb2hpYml0LgorCSAqLwogCXVhcnQtPnJ4X2RtYV9ucm93cyA9IGdldF9kbWFfY3Vycl95Y291bnQodWFydC0+cnhfZG1hX2NoYW5uZWwpOwogCXhfcG9zID0gZ2V0X2RtYV9jdXJyX3hjb3VudCh1YXJ0LT5yeF9kbWFfY2hhbm5lbCk7CiAJdWFydC0+cnhfZG1hX25yb3dzID0gRE1BX1JYX1lDT1VOVCAtIHVhcnQtPnJ4X2RtYV9ucm93czsKLQlpZiAodWFydC0+cnhfZG1hX25yb3dzID09IERNQV9SWF9ZQ09VTlQpCisJaWYgKHVhcnQtPnJ4X2RtYV9ucm93cyA9PSBETUFfUlhfWUNPVU5UIHx8IHhfcG9zID09IDApCiAJCXVhcnQtPnJ4X2RtYV9ucm93cyA9IDA7CiAJeF9wb3MgPSBETUFfUlhfWENPVU5UIC0geF9wb3M7CiAJaWYgKHhfcG9zID09IERNQV9SWF9YQ09VTlQpCiAJCXhfcG9zID0gMDsKIAogCXBvcyA9IHVhcnQtPnJ4X2RtYV9ucm93cyAqIERNQV9SWF9YQ09VTlQgKyB4X3BvczsKLQlpZiAocG9zICE9IHVhcnQtPnJ4X2RtYV9idWYudGFpbCkgeworCS8qIElnbm9yZSByZWNlaXZpbmcgZGF0YSBpZiBuZXcgcG9zaXRpb24gaXMgaW4gdGhlIHNhbWUgbGluZSBvZgorCSAqIGN1cnJlbnQgYnVmZmVyIHRhaWwgYW5kIHNtYWxsLgorCSAqLworCWlmIChwb3MgPiB1YXJ0LT5yeF9kbWFfYnVmLnRhaWwgfHwKKwkJdWFydC0+cnhfZG1hX25yb3dzIDwgKHVhcnQtPnJ4X2RtYV9idWYudGFpbC9ETUFfUlhfWENPVU5UKSkgewogCQl1YXJ0LT5yeF9kbWFfYnVmLmhlYWQgPSBwb3M7CiAJCWJmaW5fc2VyaWFsX2RtYV9yeF9jaGFycyh1YXJ0KTsKIAkJdWFydC0+cnhfZG1hX2J1Zi50YWlsID0gdWFydC0+cnhfZG1hX2J1Zi5oZWFkOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVhcnQtPnBvcnQubG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2JoKCZ1YXJ0LT5wb3J0LmxvY2spOworCWRtYV9lbmFibGVfaXJxKHVhcnQtPnJ4X2RtYV9jaGFubmVsKTsKIAogCW1vZF90aW1lcigmKHVhcnQtPnJ4X2RtYV90aW1lciksIGppZmZpZXMgKyBETUFfUlhfRkxVU0hfSklGRklFUyk7CiB9CkBAIC01MTQsNiArNTM0LDExIEBACiAJaWYgKCEoZ2V0X2RtYV9jdXJyX2lycXN0YXQodWFydC0+dHhfZG1hX2NoYW5uZWwpJkRNQV9SVU4pKSB7CiAJCWRpc2FibGVfZG1hKHVhcnQtPnR4X2RtYV9jaGFubmVsKTsKIAkJY2xlYXJfZG1hX2lycXN0YXQodWFydC0+dHhfZG1hX2NoYW5uZWwpOworCQkvKiBBbm9tYWx5IG5vdGVzOgorCQkgKiAgMDUwMDAyMTUgLQl3ZSBhbHdheXMgY2xlYXIgRVRCRUkgd2l0aGluIGxhc3QgVUFSVCBUWAorCQkgKgkJaW50ZXJydXB0IHRvIGVuZCBhIHN0cmluZy4gSXQgaXMgYWx3YXlzIHNldAorCQkgKgkJd2hlbiBzdGFydCBhIG5ldyB0eC4KKwkJICovCiAJCVVBUlRfQ0xFQVJfSUVSKHVhcnQsIEVUQkVJKTsKIAkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgdWFydC0+dHhfY291bnQpICYgKFVBUlRfWE1JVF9TSVpFIC0gMSk7CiAJCXVhcnQtPnBvcnQuaWNvdW50LnR4ICs9IHVhcnQtPnR4X2NvdW50OwpAQCAtNTMyLDExICs1NTcsMjYgQEAKIHsKIAlzdHJ1Y3QgYmZpbl9zZXJpYWxfcG9ydCAqdWFydCA9IGRldl9pZDsKIAl1bnNpZ25lZCBzaG9ydCBpcnFzdGF0OworCWludCB4X3BvcywgcG9zOwogCiAJc3Bpbl9sb2NrKCZ1YXJ0LT5wb3J0LmxvY2spOwogCWlycXN0YXQgPSBnZXRfZG1hX2N1cnJfaXJxc3RhdCh1YXJ0LT5yeF9kbWFfY2hhbm5lbCk7CiAJY2xlYXJfZG1hX2lycXN0YXQodWFydC0+cnhfZG1hX2NoYW5uZWwpOwotCWJmaW5fc2VyaWFsX2RtYV9yeF9jaGFycyh1YXJ0KTsKKworCXVhcnQtPnJ4X2RtYV9ucm93cyA9IGdldF9kbWFfY3Vycl95Y291bnQodWFydC0+cnhfZG1hX2NoYW5uZWwpOworCXhfcG9zID0gZ2V0X2RtYV9jdXJyX3hjb3VudCh1YXJ0LT5yeF9kbWFfY2hhbm5lbCk7CisJdWFydC0+cnhfZG1hX25yb3dzID0gRE1BX1JYX1lDT1VOVCAtIHVhcnQtPnJ4X2RtYV9ucm93czsKKwlpZiAodWFydC0+cnhfZG1hX25yb3dzID09IERNQV9SWF9ZQ09VTlQgfHwgeF9wb3MgPT0gMCkKKwkJdWFydC0+cnhfZG1hX25yb3dzID0gMDsKKworCXBvcyA9IHVhcnQtPnJ4X2RtYV9ucm93cyAqIERNQV9SWF9YQ09VTlQ7CisJaWYgKHBvcyA+IHVhcnQtPnJ4X2RtYV9idWYudGFpbCB8fAorCQl1YXJ0LT5yeF9kbWFfbnJvd3MgPCAodWFydC0+cnhfZG1hX2J1Zi50YWlsL0RNQV9SWF9YQ09VTlQpKSB7CisJCXVhcnQtPnJ4X2RtYV9idWYuaGVhZCA9IHBvczsKKwkJYmZpbl9zZXJpYWxfZG1hX3J4X2NoYXJzKHVhcnQpOworCQl1YXJ0LT5yeF9kbWFfYnVmLnRhaWwgPSB1YXJ0LT5yeF9kbWFfYnVmLmhlYWQ7CisJfQorCiAJc3Bpbl91bmxvY2soJnVhcnQtPnBvcnQubG9jayk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC03ODksOCArODI5LDE2IEBACiAJCQlfX2Z1bmNfXyk7CiAJfQogCi0JaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU1RPUEIpCi0JCWxjciB8PSBTVEI7CisJLyogQW5vbWFseSBub3RlczoKKwkgKiAgMDUwMDAyMzEgLSAgU1RPUCBiaXQgaXMgYWx3YXlzIHNldCB0byAxIHdoYXRldmVyIHRoZSB1c2VyIGlzIHNldC4KKwkgKi8KKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQikgeworCQlpZiAoQU5PTUFMWV8wNTAwMDIzMSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNUT1AgYml0cyBvdGhlciB0aGFuIDEgaXMgbm90ICIKKwkJCQkic3VwcG9ydGVkIGluIGNhc2Ugb2YgYW5vbWFseSAwNTAwMDIzMS5cbiIpOworCQllbHNlCisJCQlsY3IgfD0gU1RCOworCX0KIAlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUkVOQikKIAkJbGNyIHw9IFBFTjsKIAlpZiAoISh0ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REKSkKQEAgLTk0MCw2ICs5ODgsMTAgQEAKIH0KIAogI2lmZGVmIENPTkZJR19DT05TT0xFX1BPTEwKKy8qIEFub21hbHkgbm90ZXM6CisgKiAgMDUwMDAwOTkgLSAgQmVjYXVzZSB3ZSBvbmx5IHVzZSBUSFJFIGluIHBvbGxfcHV0IGFuZCBEUiBpbiBwb2xsX2dldCwKKyAqCQlsb3Npbmcgb3RoZXIgYml0cyBvZiBVQVJUX0xTUiBpcyBub3QgYSBwcm9ibGVtIGhlcmUuCisgKi8KIHN0YXRpYyB2b2lkIGJmaW5fc2VyaWFsX3BvbGxfcHV0X2NoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgY2hhciBjaHIpCiB7CiAJc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKnVhcnQgPSAoc3RydWN0IGJmaW5fc2VyaWFsX3BvcnQgKilwb3J0OwpAQCAtMTI0NSwxMiArMTI5NywxNyBAQAogCX0KIH0KIAorLyoKKyAqIFRoaXMgc2hvdWxkIGhhdmUgYSAuc2V0dXAgb3IgLmVhcmx5X3NldHVwIGluIGl0LCBidXQgdGhlbiB0aGluZ3MgZ2V0IGNhbGxlZAorICogd2l0aG91dCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFuZCB0aGUgYmF1ZCByYXRlIGdldHMgbWVzc2VkIHVwIC0gc28KKyAqIGRvbid0IGxldCB0aGUgY29tbW9uIGluZnJhc3RydWN0dXJlIHBsYXkgd2l0aCB0aGluZ3MuIChzZWUgY2FsbHMgdG8gc2V0dXAKKyAqICYgZWFybHlzZXR1cCBpbiAuL2tlcm5lbC9wcmludGsuYzpyZWdpc3Rlcl9jb25zb2xlKCkKKyAqLwogc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIGNvbnNvbGUgYmZpbl9lYXJseV9zZXJpYWxfY29uc29sZSA9IHsKIAkubmFtZSA9ICJlYXJseV9CRnVhcnQiLAogCS53cml0ZSA9IGVhcmx5X3NlcmlhbF93cml0ZSwKIAkuZGV2aWNlID0gdWFydF9jb25zb2xlX2RldmljZSwKIAkuZmxhZ3MgPSBDT05fUFJJTlRCVUZGRVIsCi0JLnNldHVwID0gYmZpbl9zZXJpYWxfY29uc29sZV9zZXR1cCwKIAkuaW5kZXggPSAtMSwKIAkuZGF0YSAgPSAmYmZpbl9zZXJpYWxfcmVnLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2JmaW5fc3BvcnRfdWFydC5jIGIvZHJpdmVycy9zZXJpYWwvYmZpbl9zcG9ydF91YXJ0LmMKaW5kZXggNTI5YzBmZi4uMzRiNGFlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYmZpbl9zcG9ydF91YXJ0LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvYmZpbl9zcG9ydF91YXJ0LmMKQEAgLTEwMSwxNSArMTAxLDE2IEBACiB7CiAJcHJfZGVidWcoIiVzIHZhbHVlOiV4XG4iLCBfX2Z1bmNfXywgdmFsdWUpOwogCS8qIFBsYWNlIGEgU3RhcnQgYW5kIFN0b3AgYml0ICovCi0JX19hc21fXyB2b2xhdGlsZSAoCi0JCSJSMiA9IGIjMDExMTExMTExMDA7XG5cdCIKLQkJIlIzID0gYiMxMDAwMDAwMDAwMTtcblx0IgotCQkiJTAgPDw9IDI7XG5cdCIKLQkJIiUwID0gJTAgJiBSMjtcblx0IgotCQkiJTAgPSAlMCB8IFIzO1xuXHQiCi0JCToiPXIiKHZhbHVlKQotCQk6IjAiKHZhbHVlKQotCQk6IlIyIiwgIlIzIik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiUjIgPSBiIzAxMTExMTExMTAwOyIKKwkJIlIzID0gYiMxMDAwMDAwMDAwMTsiCisJCSIlMCA8PD0gMjsiCisJCSIlMCA9ICUwICYgUjI7IgorCQkiJTAgPSAlMCB8IFIzOyIKKwkJOiAiPWQiKHZhbHVlKQorCQk6ICJkIih2YWx1ZSkKKwkJOiAiQVNUQVQiLCAiUjIiLCAiUjMiCisJKTsKIAlwcl9kZWJ1ZygiJXMgdmFsdWU6JXhcbiIsIF9fZnVuY19fLCB2YWx1ZSk7CiAKIAlTUE9SVF9QVVRfVFgodXAsIHZhbHVlKTsKQEAgLTExOCwyNyArMTE5LDMwIEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByeF9vbmVfYnl0ZShzdHJ1Y3Qgc3BvcnRfdWFydF9wb3J0ICp1cCkKIHsKIAl1bnNpZ25lZCBpbnQgdmFsdWUsIGV4dHJhY3Q7CisJdTMyIHRtcF9tYXNrMSwgdG1wX21hc2syLCB0bXBfc2hpZnQsIHRtcDsKIAogCXZhbHVlID0gU1BPUlRfR0VUX1JYMzIodXApOwogCXByX2RlYnVnKCIlcyB2YWx1ZToleFxuIiwgX19mdW5jX18sIHZhbHVlKTsKIAogCS8qIEV4dHJhY3QgOCBiaXRzIGRhdGEgKi8KLQlfX2FzbV9fIHZvbGF0aWxlICgKLQkJIlI1ID0gMDtcblx0IgotCQkiUDAgPSA4O1xuXHQiCi0JCSJSMSA9IDB4MTgwMShaKTtcblx0IgotCQkiUjMgPSAweDAzMDAoWik7XG5cdCIKLQkJIlI0ID0gMDtcblx0IgotCQkiTFNFVFVQKGxvb3BfcywgbG9vcF9lKSBMQzAgPSBQMDtcbmxvb3BfczpcdCIKLQkJIlIyID0gZXh0cmFjdCglMSwgUjEuTCkoWik7XG5cdCIKLQkJIlIyIDw8PSBSNDtcblx0IgotCQkiUjUgPSBSNSB8IFIyO1xuXHQiCi0JCSJSMSA9IFIxIC0gUjM7XG5sb29wX2U6XHQiCi0JCSJSNCArPSAxO1xuXHQiCi0JCSIlMCA9IFI1O1xuXHQiCi0JCToiPXIiKGV4dHJhY3QpCi0JCToiciIodmFsdWUpCi0JCToiUDAiLCAiUjEiLCAiUjIiLCJSMyIsIlI0IiwgIlI1Iik7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkiJVtleHRyXSA9IDA7IgorCQkiJVttYXNrMV0gPSAweDE4MDEoWik7IgorCQkiJVttYXNrMl0gPSAweDAzMDAoWik7IgorCQkiJVtzaGlmdF0gPSAwOyIKKwkJIkxTRVRVUCguTGxvb3BfcywgLkxsb29wX2UpIExDMCA9ICVbbGNdOyIKKwkJIi5MbG9vcF9zOiIKKwkJIiVbdG1wXSA9IGV4dHJhY3QoJVt2YWxdLCAlW21hc2sxXS5MKShaKTsiCisJCSIlW3RtcF0gPDw9ICVbc2hpZnRdOyIKKwkJIiVbZXh0cl0gPSAlW2V4dHJdIHwgJVt0bXBdOyIKKwkJIiVbbWFzazFdID0gJVttYXNrMV0gLSAlW21hc2syXTsiCisJCSIuTGxvb3BfZToiCisJCSIlW3NoaWZ0XSArPSAxOyIKKwkJOiBbdmFsXSI9ZCIodmFsdWUpLCBbZXh0cl0iPWQiKGV4dHJhY3QpLCBbc2hpZnRdIj1kIih0bXBfc2hpZnQpLCBbdG1wXSI9ZCIodG1wKSwKKwkJICBbbWFzazFdIj1kIih0bXBfbWFzazEpLCBbbWFzazJdIj1kIih0bXBfbWFzazIpCisJCTogImQiKHZhbHVlKSwgW2xjXSJhIig4KQorCQk6ICJBU1RBVCIsICJMQjAiLCAiTEMwIiwgIkxUMCIKKwkpOwogCiAJcHJfZGVidWcoIglleHRyYWN0OiV4XG4iLCBleHRyYWN0KTsKIAlyZXR1cm4gZXh0cmFjdDsKQEAgLTE0OSw3ICsxNTMsNyBAQAogCWludCB0Y2xrZGl2LCB0ZnNkaXYsIHJjbGtkaXY7CiAKIAkvKiBTZXQgVENSMSBhbmQgVENSMiAqLwotCVNQT1JUX1BVVF9UQ1IxKHVwLCAoTFRGUyB8IElURlMgfCBURlNSIHwgVExTQklUIHwgSVRDTEspKTsKKwlTUE9SVF9QVVRfVENSMSh1cCwgKExBVEZTIHwgSVRGUyB8IFRGU1IgfCBUTFNCSVQgfCBJVENMSykpOwogCVNQT1JUX1BVVF9UQ1IyKHVwLCAxMCk7CiAJcHJfZGVidWcoIiVzIFRDUjE6JXgsIFRDUjI6JXhcbiIsIF9fZnVuY19fLCBTUE9SVF9HRVRfVENSMSh1cCksIFNQT1JUX0dFVF9UQ1IyKHVwKSk7CiAKQEAgLTQxOSw3ICs0MjMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBzcG9ydF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAotCQlzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywgc3RydWN0IHRlcm1pb3MgKm9sZCkKKwkJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCkKIHsKIAlwcl9kZWJ1ZygiJXMgZW50ZXIsIGNfY2ZsYWc6JTA4eFxuIiwgX19mdW5jX18sIHRlcm1pb3MtPmNfY2ZsYWcpOwogCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgQ1M4ICxwb3J0LT51YXJ0Y2xrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL2ljb20uYyBiL2RyaXZlcnMvc2VyaWFsL2ljb20uYwppbmRleCBhNDYxYjNiLi45ZjI4OTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pY29tLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvaWNvbS5jCkBAIC0xMzcsNyArMTM3LDEyIEBACiBzdGF0aWMgc3BpbmxvY2tfdCBpY29tX2xvY2s7CiAKICNpZmRlZiBJQ09NX1RSQUNFCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2Uoc3RydWN0IGljb21fcG9ydCAqLCBjaGFyICosIHVuc2lnbmVkIGxvbmcpIHt9Oworc3RhdGljIGlubGluZSB2b2lkIHRyYWNlKHN0cnVjdCBpY29tX3BvcnQgKmljb21fcG9ydCwgY2hhciAqdHJhY2VfcHQsCisJCQl1bnNpZ25lZCBsb25nIHRyYWNlX2RhdGEpCit7CisJZGV2X2luZm8oJmljb21fcG9ydC0+YWRhcHRlci0+cGNpX2Rldi0+ZGV2LCAiOiVkOiVzIC0gJWx4XG4iLAorCWljb21fcG9ydC0+cG9ydCwgdHJhY2VfcHQsIHRyYWNlX2RhdGEpOworfQogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZShzdHJ1Y3QgaWNvbV9wb3J0ICppY29tX3BvcnQsIGNoYXIgKnRyYWNlX3B0LCB1bnNpZ25lZCBsb25nIHRyYWNlX2RhdGEpIHt9OwogI2VuZGlmCkBAIC00MDgsNyArNDEzLDcgQEAKIAlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAogCS8qIFNldCBIYXJkd2FyZSBsZXZlbCAqLwotCWlmICgoaWNvbV9wb3J0LT5hZGFwdGVyLT52ZXJzaW9uIHwgQURBUFRFUl9WMikgPT0gQURBUFRFUl9WMikKKwlpZiAoaWNvbV9wb3J0LT5hZGFwdGVyLT52ZXJzaW9uID09IEFEQVBURVJfVjIpCiAJCXdyaXRlYihWMl9IQVJEV0FSRSwgJihpY29tX3BvcnQtPmRyYW0tPm1pc2NfZmxhZ3MpKTsKIAogCS8qIFN0YXJ0IHRoZSBwcm9jZXNzb3IgaW4gQWRhcHRlciAqLwpAQCAtODYxLDcgKzg2Niw3IEBACiAJLyogZmluZCBpY29tX3BvcnQgZm9yIHRoaXMgaW50ZXJydXB0ICovCiAJaWNvbV9hZGFwdGVyID0gKHN0cnVjdCBpY29tX2FkYXB0ZXIgKikgZGV2X2lkOwogCi0JaWYgKChpY29tX2FkYXB0ZXItPnZlcnNpb24gfCBBREFQVEVSX1YyKSA9PSBBREFQVEVSX1YyKSB7CisJaWYgKGljb21fYWRhcHRlci0+dmVyc2lvbiA9PSBBREFQVEVSX1YyKSB7CiAJCWludF9yZWcgPSBpY29tX2FkYXB0ZXItPmJhc2VfYWRkciArIDB4ODAyNDsKIAogCQlhZGFwdGVyX2ludGVycnVwdHMgPSByZWFkbChpbnRfcmVnKTsKQEAgLTE2NDcsMTUgKzE2NTIsNiBAQAogbW9kdWxlX2luaXQoaWNvbV9pbml0KTsKIG1vZHVsZV9leGl0KGljb21fZXhpdCk7CiAKLSNpZmRlZiBJQ09NX1RSQUNFCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2Uoc3RydWN0IGljb21fcG9ydCAqaWNvbV9wb3J0LCBjaGFyICp0cmFjZV9wdCwKLQkJICB1bnNpZ25lZCBsb25nIHRyYWNlX2RhdGEpCi17Ci0JZGV2X2luZm8oJmljb21fcG9ydC0+YWRhcHRlci0+cGNpX2Rldi0+ZGV2LCAiOiVkOiVzIC0gJWx4XG4iLAotCQkgaWNvbV9wb3J0LT5wb3J0LCB0cmFjZV9wdCwgdHJhY2VfZGF0YSk7Ci19Ci0jZW5kaWYKLQogTU9EVUxFX0FVVEhPUigiTWljaGFlbCBBbmRlcnNvbiA8bWphbmRlcnNAdXMuaWJtLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSUJNIGlTZXJpZXMgU2VyaWFsIElPQSBkcml2ZXIiKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pbXguYyBiL2RyaXZlcnMvc2VyaWFsL2lteC5jCmluZGV4IDVmMGJlNDAuLjdiNWQxZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2lteC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lteC5jCkBAIC04LDYgKzgsOSBAQAogICogIEF1dGhvcjogU2FzY2hhIEhhdWVyIDxzYXNjaGFAc2FzY2hhaGF1ZXIuZGU+CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA0IFBlbmd1dHJvbml4CiAgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBlbWxpeCBHbWJICisgKiAgQXV0aG9yOiBGYWJpYW4gR29kZWhhcmR0IChhZGRlZCBJckRBIHN1cHBvcnQgZm9yIGlNWCkKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC00MSw2ICs0NCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGlvbmFsLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC0xNDgsNiArMTUzLDcgQEAKICNkZWZpbmUgIFVDUjRfRFJFTiAgCSAoMTw8MCkgIC8qIFJlY3YgZGF0YSByZWFkeSBpbnRlcnJ1cHQgZW5hYmxlICovCiAjZGVmaW5lICBVRkNSX1JYVExfU0hGICAgMCAgICAgICAvKiBSZWNlaXZlciB0cmlnZ2VyIGxldmVsIHNoaWZ0ICovCiAjZGVmaW5lICBVRkNSX1JGRElWICAgICAgKDc8PDcpICAvKiBSZWZlcmVuY2UgZnJlcSBkaXZpZGVyIG1hc2sgKi8KKyNkZWZpbmUgIFVGQ1JfUkZESVZfUkVHKHgpCSgoKHgpIDwgNyA/IDYgLSAoeCkgOiA2KSA8PCA3KQogI2RlZmluZSAgVUZDUl9UWFRMX1NIRiAgIDEwICAgICAgLyogVHJhbnNtaXR0ZXIgdHJpZ2dlciBsZXZlbCBzaGlmdCAqLwogI2RlZmluZSAgVVNSMV9QQVJJVFlFUlIgICgxPDwxNSkgLyogUGFyaXR5IGVycm9yIGludGVycnVwdCBmbGFnICovCiAjZGVmaW5lICBVU1IxX1JUU1MgIAkgKDE8PDE0KSAvKiBSVFMgcGluIHN0YXR1cyAqLwpAQCAtMjExLDEwICsyMTcsMjAgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKIAl1bnNpZ25lZCBpbnQJCW9sZF9zdGF0dXM7CiAJaW50CQkJdHhpcnEscnhpcnEscnRzaXJxOwotCWludAkJCWhhdmVfcnRzY3RzOjE7CisJdW5zaWduZWQgaW50CQloYXZlX3J0c2N0czoxOworCXVuc2lnbmVkIGludAkJdXNlX2lyZGE6MTsKKwl1bnNpZ25lZCBpbnQJCWlyZGFfaW52X3J4OjE7CisJdW5zaWduZWQgaW50CQlpcmRhX2ludl90eDoxOworCXVuc2lnbmVkIHNob3J0CQl0cmN2X2RlbGF5OyAvKiB0cmFuc2NlaXZlciBkZWxheSAqLwogCXN0cnVjdCBjbGsJCSpjbGs7CiB9OwogCisjaWZkZWYgQ09ORklHX0lSREEKKyNkZWZpbmUgVVNFX0lSREEoc3BvcnQpCSgoc3BvcnQpLT51c2VfaXJkYSkKKyNlbHNlCisjZGVmaW5lIFVTRV9JUkRBKHNwb3J0KQkoMCkKKyNlbmRpZgorCiAvKgogICogSGFuZGxlIGFueSBjaGFuZ2Ugb2YgbW9kZW0gc3RhdHVzIHNpZ25hbCBzaW5jZSB3ZSB3ZXJlIGxhc3QgY2FsbGVkLgogICovCkBAIC0yNjgsNiArMjg0LDQ4IEBACiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgaW14X3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAorCWlmIChVU0VfSVJEQShzcG9ydCkpIHsKKwkJLyogaGFsZiBkdXBsZXggLSB3YWl0IGZvciBlbmQgb2YgdHJhbnNtaXNzaW9uICovCisJCWludCBuID0gMjU2OworCQl3aGlsZSAoKC0tbiA+IDApICYmCisJCSAgICAgICEocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjIpICYgVVNSMl9UWERDKSkgeworCQkJdWRlbGF5KDUpOworCQkJYmFycmllcigpOworCQl9CisJCS8qCisJCSAqIGlyZGEgdHJhbnNjZWl2ZXIgLSB3YWl0IGEgYml0IG1vcmUgdG8gYXZvaWQKKwkJICogY3V0b2ZmLCBoYXJkd2FyZSBkZXBlbmRlbnQKKwkJICovCisJCXVkZWxheShzcG9ydC0+dHJjdl9kZWxheSk7CisKKwkJLyoKKwkJICogaGFsZiBkdXBsZXggLSByZWFjdGl2YXRlIHJlY2VpdmUgbW9kZSwKKwkJICogZmx1c2ggcmVjZWl2ZSBwaXBlIGVjaG8gY3JhcAorCQkgKi8KKwkJaWYgKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IyKSAmIFVTUjJfVFhEQykgeworCQkJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKKwkJCXRlbXAgJj0gfihVQ1IxX1RYTVBUWUVOIHwgVUNSMV9UUkRZRU4pOworCQkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKKworCQkJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKKwkJCXRlbXAgJj0gfihVQ1I0X1RDRU4pOworCQkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKKworCQkJd2hpbGUgKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVUlhEMCkgJgorCQkJICAgICAgIFVSWERfQ0hBUlJEWSkKKwkJCQliYXJyaWVyKCk7CisKKwkJCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7CisJCQl0ZW1wIHw9IFVDUjFfUlJEWUVOOworCQkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKKworCQkJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKKwkJCXRlbXAgfD0gVUNSNF9EUkVOOworCQkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKKwkJfQorCQlyZXR1cm47CisJfQorCiAJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKIAl3cml0ZWwodGVtcCAmIH5VQ1IxX1RYTVBUWUVOLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7CiB9CkBAIC0zMDIsMTMgKzM2MCwxNSBAQAogCQkvKiBzZW5kIHhtaXQtPmJ1Zlt4bWl0LT50YWlsXQogCQkgKiBvdXQgdGhlIHBvcnQgaGVyZSAqLwogCQl3cml0ZWwoeG1pdC0+YnVmW3htaXQtPnRhaWxdLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVJUWDApOwotCQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmCi0JCSAgICAgICAgIChVQVJUX1hNSVRfU0laRSAtIDEpOworCQl4bWl0LT50YWlsID0gKHhtaXQtPnRhaWwgKyAxKSAmIChVQVJUX1hNSVRfU0laRSAtIDEpOwogCQlzcG9ydC0+cG9ydC5pY291bnQudHgrKzsKIAkJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSkKIAkJCWJyZWFrOwogCX0KIAorCWlmICh1YXJ0X2NpcmNfY2hhcnNfcGVuZGluZyh4bWl0KSA8IFdBS0VVUF9DSEFSUykKKwkJdWFydF93cml0ZV93YWtldXAoJnNwb3J0LT5wb3J0KTsKKwogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCiAJCWlteF9zdG9wX3R4KCZzcG9ydC0+cG9ydCk7CiB9CkBAIC0zMjEsOSArMzgxLDMwIEBACiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgaW14X3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAorCWlmIChVU0VfSVJEQShzcG9ydCkpIHsKKwkJLyogaGFsZiBkdXBsZXggaW4gSXJEQSBtb2RlOyBoYXZlIHRvIGRpc2FibGUgcmVjZWl2ZSBtb2RlICovCisJCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSNCk7CisJCXRlbXAgJj0gfihVQ1I0X0RSRU4pOworCQl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjQpOworCisJCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7CisJCXRlbXAgJj0gfihVQ1IxX1JSRFlFTik7CisJCXdyaXRlbCh0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7CisJfQorCiAJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKIAl3cml0ZWwodGVtcCB8IFVDUjFfVFhNUFRZRU4sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKIAorCWlmIChVU0VfSVJEQShzcG9ydCkpIHsKKwkJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKKwkJdGVtcCB8PSBVQ1IxX1RSRFlFTjsKKwkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKKworCQl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjQpOworCQl0ZW1wIHw9IFVDUjRfVENFTjsKKwkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1I0KTsKKwl9CisKIAlpZiAocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVUUykgJiBVVFNfVFhFTVBUWSkKIAkJaW14X3RyYW5zbWl0X2J1ZmZlcihzcG9ydCk7CiB9CkBAIC0zOTUsOCArNDc2LDcgQEAKIAkJCQljb250aW51ZTsKIAkJfQogCi0JCWlmICh1YXJ0X2hhbmRsZV9zeXNycV9jaGFyCi0JCSAgICAgICAgICAgICgmc3BvcnQtPnBvcnQsICh1bnNpZ25lZCBjaGFyKXJ4KSkKKwkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIoJnNwb3J0LT5wb3J0LCAodW5zaWduZWQgY2hhcilyeCkpCiAJCQljb250aW51ZTsKIAogCQlpZiAocnggJiAoVVJYRF9QUkVSUiB8IFVSWERfT1ZSUlVOIHwgVVJYRF9GUk1FUlIpICkgewpAQCAtNDcxLDI2ICs1NTEsMjYgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludCBpbXhfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0gICAgICAgIHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGlteF9wb3J0ICopcG9ydDsKLSAgICAgICAgdW5zaWduZWQgaW50IHRtcCA9IFRJT0NNX0RTUiB8IFRJT0NNX0NBUjsKKwlzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0ID0gKHN0cnVjdCBpbXhfcG9ydCAqKXBvcnQ7CisJdW5zaWduZWQgaW50IHRtcCA9IFRJT0NNX0RTUiB8IFRJT0NNX0NBUjsKIAotICAgICAgICBpZiAocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjEpICYgVVNSMV9SVFNTKQotICAgICAgICAgICAgICAgIHRtcCB8PSBUSU9DTV9DVFM7CisJaWYgKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVU1IxKSAmIFVTUjFfUlRTUykKKwkJdG1wIHw9IFRJT0NNX0NUUzsKIAotICAgICAgICBpZiAocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpICYgVUNSMl9DVFMpCi0gICAgICAgICAgICAgICAgdG1wIHw9IFRJT0NNX1JUUzsKKwlpZiAocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpICYgVUNSMl9DVFMpCisJCXRtcCB8PSBUSU9DTV9SVFM7CiAKLSAgICAgICAgcmV0dXJuIHRtcDsKKwlyZXR1cm4gdG1wOwogfQogCiBzdGF0aWMgdm9pZCBpbXhfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKIHsKLSAgICAgICAgc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgaW14X3BvcnQgKilwb3J0OworCXN0cnVjdCBpbXhfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGlteF9wb3J0ICopcG9ydDsKIAl1bnNpZ25lZCBsb25nIHRlbXA7CiAKIAl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpICYgflVDUjJfQ1RTOwogCi0gICAgICAgIGlmIChtY3RybCAmIFRJT0NNX1JUUykKKwlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCiAJCXRlbXAgfD0gVUNSMl9DVFM7CiAKIAl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpOwpAQCAtNTM0LDEyICs2MTQsNyBAQAogCWlmKCF1ZmNyX3JmZGl2KQogCQl1ZmNyX3JmZGl2ID0gMTsKIAotCWlmKHVmY3JfcmZkaXYgPj0gNykKLQkJdWZjcl9yZmRpdiA9IDY7Ci0JZWxzZQotCQl1ZmNyX3JmZGl2ID0gNiAtIHVmY3JfcmZkaXY7Ci0KLQl2YWwgfD0gVUZDUl9SRkRJViAmICh1ZmNyX3JmZGl2IDw8IDcpOworCXZhbCB8PSBVRkNSX1JGRElWX1JFRyh1ZmNyX3JmZGl2KTsKIAogCXdyaXRlbCh2YWwsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVRkNSKTsKIApAQCAtNTU4LDggKzYzMywyNCBAQAogCSAqIHJlcXVlc3RpbmcgSVJRcwogCSAqLwogCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSNCk7CisKKwlpZiAoVVNFX0lSREEoc3BvcnQpKQorCQl0ZW1wIHw9IFVDUjRfSVJTQzsKKwogCXdyaXRlbCh0ZW1wICYgflVDUjRfRFJFTiwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjQpOwogCisJaWYgKFVTRV9JUkRBKHNwb3J0KSkgeworCQkvKiByZXNldCBmaWZvJ3MgYW5kIHN0YXRlIG1hY2hpbmVzICovCisJCWludCBpID0gMTAwOworCQl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjIpOworCQl0ZW1wICY9IH5VQ1IyX1NSU1Q7CisJCXdyaXRlbCh0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMik7CisJCXdoaWxlICghKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IyKSAmIFVDUjJfU1JTVCkgJiYKKwkJICAgICgtLWkgPiAwKSkgeworCQkJdWRlbGF5KDEpOworCQl9CisJfQorCiAJLyoKIAkgKiBBbGxvY2F0ZSB0aGUgSVJRKHMpIGkuTVgxIGhhcyB0aHJlZSBpbnRlcnJ1cHRzIHdoZXJlYXMgbGF0ZXIKIAkgKiBjaGlwcyBvbmx5IGhhdmUgb25lIGludGVycnVwdC4KQEAgLTU3NSwxMiArNjY2LDE2IEBACiAJCWlmIChyZXR2YWwpCiAJCQlnb3RvIGVycm9yX291dDI7CiAKLQkJcmV0dmFsID0gcmVxdWVzdF9pcnEoc3BvcnQtPnJ0c2lycSwgaW14X3J0c2ludCwKLQkJCSAgICAgKHNwb3J0LT5ydHNpcnEgPCBNQVhfSU5URVJOQUxfSVJRKSA/IDAgOgotCQkJICAgICAgIElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOwotCQlpZiAocmV0dmFsKQotCQkJZ290byBlcnJvcl9vdXQzOworCQkvKiBkbyBub3QgdXNlIFJUUyBJUlEgb24gSXJEQSAqLworCQlpZiAoIVVTRV9JUkRBKHNwb3J0KSkgeworCQkJcmV0dmFsID0gcmVxdWVzdF9pcnEoc3BvcnQtPnJ0c2lycSwgaW14X3J0c2ludCwKKwkJCQkgICAgIChzcG9ydC0+cnRzaXJxIDwgTUFYX0lOVEVSTkFMX0lSUSkgPyAwIDoKKwkJCQkgICAgICAgSVJRRl9UUklHR0VSX0ZBTExJTkcgfAorCQkJCSAgICAgICBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJCQlEUklWRVJfTkFNRSwgc3BvcnQpOworCQkJaWYgKHJldHZhbCkKKwkJCQlnb3RvIGVycm9yX291dDM7CisJCX0KIAl9IGVsc2UgewogCQlyZXR2YWwgPSByZXF1ZXN0X2lycShzcG9ydC0+cG9ydC5pcnEsIGlteF9pbnQsIDAsCiAJCQkJRFJJVkVSX05BTUUsIHNwb3J0KTsKQEAgLTU5NywxOCArNjkyLDQ5IEBACiAKIAl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjEpOwogCXRlbXAgfD0gVUNSMV9SUkRZRU4gfCBVQ1IxX1JUU0RFTiB8IFVDUjFfVUFSVEVOOworCisJaWYgKFVTRV9JUkRBKHNwb3J0KSkgeworCQl0ZW1wIHw9IFVDUjFfSVJFTjsKKwkJdGVtcCAmPSB+KFVDUjFfUlRTREVOKTsKKwl9CisKIAl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjEpOwogCiAJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IyKTsKIAl0ZW1wIHw9IChVQ1IyX1JYRU4gfCBVQ1IyX1RYRU4pOwogCXdyaXRlbCh0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMik7CiAKKwlpZiAoVVNFX0lSREEoc3BvcnQpKSB7CisJCS8qIGNsZWFyIFJYLUZJRk8gKi8KKwkJaW50IGkgPSA2NDsKKwkJd2hpbGUgKCgtLWkgPiAwKSAmJgorCQkJKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVUlhEMCkgJiBVUlhEX0NIQVJSRFkpKSB7CisJCQliYXJyaWVyKCk7CisJCX0KKwl9CisKICNpZiBkZWZpbmVkIENPTkZJR19BUkNIX01YMiB8fCBkZWZpbmVkIENPTkZJR19BUkNIX01YMwogCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMyk7CiAJdGVtcCB8PSBVQ1IzX1JYRE1VWFNFTDsKIAl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjMpOwogI2VuZGlmCiAKKwlpZiAoVVNFX0lSREEoc3BvcnQpKSB7CisJCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSNCk7CisJCWlmIChzcG9ydC0+aXJkYV9pbnZfcngpCisJCQl0ZW1wIHw9IFVDUjRfSU5WUjsKKwkJZWxzZQorCQkJdGVtcCAmPSB+KFVDUjRfSU5WUik7CisJCXdyaXRlbCh0ZW1wIHwgVUNSNF9EUkVOLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSNCk7CisKKwkJdGVtcCA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IzKTsKKwkJaWYgKHNwb3J0LT5pcmRhX2ludl90eCkKKwkJCXRlbXAgfD0gVUNSM19JTlZUOworCQllbHNlCisJCQl0ZW1wICY9IH4oVUNSM19JTlZUKTsKKwkJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IzKTsKKwl9CisKIAkvKgogCSAqIEVuYWJsZSBtb2RlbSBzdGF0dXMgaW50ZXJydXB0cwogCSAqLwpAQCAtNjE2LDYgKzc0MiwxNiBAQAogCWlteF9lbmFibGVfbXMoJnNwb3J0LT5wb3J0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcG9ydC0+cG9ydC5sb2NrLGZsYWdzKTsKIAorCWlmIChVU0VfSVJEQShzcG9ydCkpIHsKKwkJc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJCXBkYXRhID0gc3BvcnQtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhOworCQlzcG9ydC0+aXJkYV9pbnZfcnggPSBwZGF0YS0+aXJkYV9pbnZfcng7CisJCXNwb3J0LT5pcmRhX2ludl90eCA9IHBkYXRhLT5pcmRhX2ludl90eDsKKwkJc3BvcnQtPnRyY3ZfZGVsYXkgPSBwZGF0YS0+dHJhbnNjZWl2ZXJfZGVsYXk7CisJCWlmIChwZGF0YS0+aXJkYV9lbmFibGUpCisJCQlwZGF0YS0+aXJkYV9lbmFibGUoMSk7CisJfQorCiAJcmV0dXJuIDA7CiAKIGVycm9yX291dDM6CkBAIC02MzMsNiArNzY5LDE3IEBACiAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IChzdHJ1Y3QgaW14X3BvcnQgKilwb3J0OwogCXVuc2lnbmVkIGxvbmcgdGVtcDsKIAorCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMik7CisJdGVtcCAmPSB+KFVDUjJfVFhFTik7CisJd3JpdGVsKHRlbXAsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IyKTsKKworCWlmIChVU0VfSVJEQShzcG9ydCkpIHsKKwkJc3RydWN0IGlteHVhcnRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJCXBkYXRhID0gc3BvcnQtPnBvcnQuZGV2LT5wbGF0Zm9ybV9kYXRhOworCQlpZiAocGRhdGEtPmlyZGFfZW5hYmxlKQorCQkJcGRhdGEtPmlyZGFfZW5hYmxlKDApOworCX0KKwogCS8qCiAJICogU3RvcCBvdXIgdGltZXIuCiAJICovCkBAIC02NDIsNyArNzg5LDggQEAKIAkgKiBGcmVlIHRoZSBpbnRlcnJ1cHRzCiAJICovCiAJaWYgKHNwb3J0LT50eGlycSA+IDApIHsKLQkJZnJlZV9pcnEoc3BvcnQtPnJ0c2lycSwgc3BvcnQpOworCQlpZiAoIVVTRV9JUkRBKHNwb3J0KSkKKwkJCWZyZWVfaXJxKHNwb3J0LT5ydHNpcnEsIHNwb3J0KTsKIAkJZnJlZV9pcnEoc3BvcnQtPnR4aXJxLCBzcG9ydCk7CiAJCWZyZWVfaXJxKHNwb3J0LT5yeGlycSwgc3BvcnQpOwogCX0gZWxzZQpAQCAtNjU0LDYgKzgwMiw5IEBACiAKIAl0ZW1wID0gcmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjEpOwogCXRlbXAgJj0gfihVQ1IxX1RYTVBUWUVOIHwgVUNSMV9SUkRZRU4gfCBVQ1IxX1JUU0RFTiB8IFVDUjFfVUFSVEVOKTsKKwlpZiAoVVNFX0lSREEoc3BvcnQpKQorCQl0ZW1wICY9IH4oVUNSMV9JUkVOKTsKKwogCXdyaXRlbCh0ZW1wLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMSk7CiB9CiAKQEAgLTY2NSw3ICs4MTYsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHVjcjIsIG9sZF91Y3IxLCBvbGRfdHhyeGVuLCBiYXVkLCBxdW90OwogCXVuc2lnbmVkIGludCBvbGRfY3NpemUgPSBvbGQgPyBvbGQtPmNfY2ZsYWcgJiBDU0laRSA6IENTODsKLQl1bnNpZ25lZCBpbnQgZGl2LCBudW0sIGRlbm9tLCB1ZmNyOworCXVuc2lnbmVkIGludCBkaXYsIHVmY3I7CisJdW5zaWduZWQgbG9uZyBudW0sIGRlbm9tOworCXVpbnQ2NF90IHRkaXY2NDsKIAogCS8qCiAJICogSWYgd2UgZG9uJ3Qgc3VwcG9ydCBtb2RlbSBjb250cm9sIGxpbmVzLCBkb24ndCBhbGxvdwpAQCAtNzYxLDM4ICs5MTQsMzkgQEAKIAkJCXNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IyKTsKIAlvbGRfdHhyeGVuICY9IChVQ1IyX1RYRU4gfCBVQ1IyX1JYRU4pOwogCi0JZGl2ID0gc3BvcnQtPnBvcnQudWFydGNsayAvIChiYXVkICogMTYpOwotCWlmIChkaXYgPiA3KQotCQlkaXYgPSA3OwotCWlmICghZGl2KQorCWlmIChVU0VfSVJEQShzcG9ydCkpIHsKKwkJLyoKKwkJICogdXNlIG1heGltdW0gYXZhaWxhYmxlIHN1Ym1vZHVsZSBmcmVxdWVuY3kgdG8KKwkJICogYXZvaWQgbWlzc2luZyBzaG9ydCBwdWxzZXMgZHVlIHRvIGxvdyBzYW1wbGluZyByYXRlCisJCSAqLwogCQlkaXYgPSAxOwotCi0JbnVtID0gYmF1ZDsKLQlkZW5vbSA9IHBvcnQtPnVhcnRjbGsgLyBkaXYgLyAxNjsKLQotCS8qIHNoaWZ0IG51bSBhbmQgZGVub20gcmlnaHQgdW50aWwgdGhleSBmaXQgaW50byAxNiBiaXRzICovCi0Jd2hpbGUgKG51bSA+IDB4MTAwMDAgfHwgZGVub20gPiAweDEwMDAwKSB7Ci0JCW51bSA+Pj0gMTsKLQkJZGVub20gPj49IDE7CisJfSBlbHNlIHsKKwkJZGl2ID0gc3BvcnQtPnBvcnQudWFydGNsayAvIChiYXVkICogMTYpOworCQlpZiAoZGl2ID4gNykKKwkJCWRpdiA9IDc7CisJCWlmICghZGl2KQorCQkJZGl2ID0gMTsKIAl9Ci0JaWYgKG51bSA+IDApCi0JCW51bSAtPSAxOwotCWlmIChkZW5vbSA+IDApCi0JCWRlbm9tIC09IDE7CisKKwlyYXRpb25hbF9iZXN0X2FwcHJveGltYXRpb24oMTYgKiBkaXYgKiBiYXVkLCBzcG9ydC0+cG9ydC51YXJ0Y2xrLAorCQkxIDw8IDE2LCAxIDw8IDE2LCAmbnVtLCAmZGVub20pOworCisJdGRpdjY0ID0gc3BvcnQtPnBvcnQudWFydGNsazsKKwl0ZGl2NjQgKj0gbnVtOworCWRvX2Rpdih0ZGl2NjQsIGRlbm9tICogMTYgKiBkaXYpOworCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHNwb3J0LT5wb3J0LmluZm8tPnBvcnQudHR5LAorCQkoc3BlZWRfdCl0ZGl2NjQsIChzcGVlZF90KXRkaXY2NCk7CisKKwludW0gLT0gMTsKKwlkZW5vbSAtPSAxOworCisJdWZjciA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVRkNSKTsKKwl1ZmNyID0gKHVmY3IgJiAoflVGQ1JfUkZESVYpKSB8IFVGQ1JfUkZESVZfUkVHKGRpdik7CisJd3JpdGVsKHVmY3IsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVRkNSKTsKIAogCXdyaXRlbChudW0sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQklSKTsKIAl3cml0ZWwoZGVub20sIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQk1SKTsKIAotCWlmIChkaXYgPT0gNykKLQkJZGl2ID0gNjsgLyogNiBpbiBSRkRJViBtZWFucyBkaXZpZGUgYnkgNyAqLwotCWVsc2UKLQkJZGl2ID0gNiAtIGRpdjsKLQotCXVmY3IgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUZDUik7Ci0JdWZjciA9ICh1ZmNyICYgKH5VRkNSX1JGRElWKSkgfAotCSAgICAoZGl2IDw8IDcpOwotCXdyaXRlbCh1ZmNyLCBzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUZDUik7Ci0KICNpZmRlZiBPTkVNUwogCXdyaXRlbChzcG9ydC0+cG9ydC51YXJ0Y2xrIC8gZGl2IC8gMTAwMCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIE9ORU1TKTsKICNlbmRpZgpAQCAtMTA3MiwyMiArMTIyNiwyMiBAQAogCiBzdGF0aWMgaW50IHNlcmlhbF9pbXhfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLSAgICAgICAgc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CiAKLSAgICAgICAgaWYgKHNwb3J0KQotICAgICAgICAgICAgICAgIHVhcnRfc3VzcGVuZF9wb3J0KCZpbXhfcmVnLCAmc3BvcnQtPnBvcnQpOworCWlmIChzcG9ydCkKKwkJdWFydF9zdXNwZW5kX3BvcnQoJmlteF9yZWcsICZzcG9ydC0+cG9ydCk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2VyaWFsX2lteF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewotICAgICAgICBzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKIAotICAgICAgICBpZiAoc3BvcnQpCi0gICAgICAgICAgICAgICAgdWFydF9yZXN1bWVfcG9ydCgmaW14X3JlZywgJnNwb3J0LT5wb3J0KTsKKwlpZiAoc3BvcnQpCisJCXVhcnRfcmVzdW1lX3BvcnQoJmlteF9yZWcsICZzcG9ydC0+cG9ydCk7CiAKLSAgICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgc2VyaWFsX2lteF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtMTE0MywxOSArMTI5NywyOSBAQAogCWlteF9wb3J0c1twZGV2LT5pZF0gPSBzcG9ydDsKIAogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYocGRhdGEgJiYgKHBkYXRhLT5mbGFncyAmIElNWFVBUlRfSEFWRV9SVFNDVFMpKQorCWlmIChwZGF0YSAmJiAocGRhdGEtPmZsYWdzICYgSU1YVUFSVF9IQVZFX1JUU0NUUykpCiAJCXNwb3J0LT5oYXZlX3J0c2N0cyA9IDE7CiAKKyNpZmRlZiBDT05GSUdfSVJEQQorCWlmIChwZGF0YSAmJiAocGRhdGEtPmZsYWdzICYgSU1YVUFSVF9JUkRBKSkKKwkJc3BvcnQtPnVzZV9pcmRhID0gMTsKKyNlbmRpZgorCiAJaWYgKHBkYXRhLT5pbml0KSB7CiAJCXJldCA9IHBkYXRhLT5pbml0KHBkZXYpOwogCQlpZiAocmV0KQogCQkJZ290byBjbGtwdXQ7CiAJfQogCi0JdWFydF9hZGRfb25lX3BvcnQoJmlteF9yZWcsICZzcG9ydC0+cG9ydCk7CisJcmV0ID0gdWFydF9hZGRfb25lX3BvcnQoJmlteF9yZWcsICZzcG9ydC0+cG9ydCk7CisJaWYgKHJldCkKKwkJZ290byBkZWluaXQ7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJnNwb3J0LT5wb3J0KTsKIAogCXJldHVybiAwOworZGVpbml0OgorCWlmIChwZGF0YS0+ZXhpdCkKKwkJcGRhdGEtPmV4aXQocGRldik7CiBjbGtwdXQ6CiAJY2xrX3B1dChzcG9ydC0+Y2xrKTsKIAljbGtfZGlzYWJsZShzcG9ydC0+Y2xrKTsKQEAgLTExOTMsMTMgKzEzNTcsMTMgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2VyaWFsX2lteF9kcml2ZXIgPSB7Ci0gICAgICAgIC5wcm9iZSAgICAgICAgICA9IHNlcmlhbF9pbXhfcHJvYmUsCi0gICAgICAgIC5yZW1vdmUgICAgICAgICA9IHNlcmlhbF9pbXhfcmVtb3ZlLAorCS5wcm9iZQkJPSBzZXJpYWxfaW14X3Byb2JlLAorCS5yZW1vdmUJCT0gc2VyaWFsX2lteF9yZW1vdmUsCiAKIAkuc3VzcGVuZAk9IHNlcmlhbF9pbXhfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHNlcmlhbF9pbXhfcmVzdW1lLAogCS5kcml2ZXIJCT0gewotCSAgICAgICAgLm5hbWUJPSAiaW14LXVhcnQiLAorCQkubmFtZQk9ICJpbXgtdWFydCIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbS5oIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbS5oCmluZGV4IGMwYTNlMjcuLjRlNWYzYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL2pzbS9qc20uaAorKysgYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtLmgKQEAgLTYxLDYgKzYxLDcgQEAKIAlpZiAoKERCR18jI25sZXZlbCAmIGpzbV9kZWJ1ZykpCQkJXAogCWRldl9wcmludGsoS0VSTl8jI2tsZXZlbCwgcGRldi0+ZGV2LCBmbXQsICMjIGFyZ3MpCiAKKyNkZWZpbmUJTUFYTElORVMJMjU2CiAjZGVmaW5lIE1BWFBPUlRTCTgKICNkZWZpbmUgTUFYX1NUT1BTX1NFTlQJNQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jIGIvZHJpdmVycy9zZXJpYWwvanNtL2pzbV90dHkuYwppbmRleCAzMTQ5NmRjMC4uMTA3Y2UyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvanNtL2pzbV90dHkuYworKysgYi9kcml2ZXJzL3NlcmlhbC9qc20vanNtX3R0eS5jCkBAIC0zMyw2ICszMyw4IEBACiAKICNpbmNsdWRlICJqc20uaCIKIAorc3RhdGljIERFQ0xBUkVfQklUTUFQKGxpbmVtYXAsIE1BWExJTkVTKTsKKwogc3RhdGljIHZvaWQganNtX2NhcnJpZXIoc3RydWN0IGpzbV9jaGFubmVsICpjaCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGpzbV9nZXRfbXN0YXQoc3RydWN0IGpzbV9jaGFubmVsICpjaCkKQEAgLTQzMyw2ICs0MzUsNyBAQAogaW50IF9fZGV2aW5pdCBqc21fdWFydF9wb3J0X2luaXQoc3RydWN0IGpzbV9ib2FyZCAqYnJkKQogewogCWludCBpOworCXVuc2lnbmVkIGludCBsaW5lOwogCXN0cnVjdCBqc21fY2hhbm5lbCAqY2g7CiAKIAlpZiAoIWJyZCkKQEAgLTQ1OSw5ICs0NjIsMTUgQEAKIAkJYnJkLT5jaGFubmVsc1tpXS0+dWFydF9wb3J0Lm1lbWJhc2UgPSBicmQtPnJlX21hcF9tZW1iYXNlOwogCQlicmQtPmNoYW5uZWxzW2ldLT51YXJ0X3BvcnQuZmlmb3NpemUgPSAxNjsKIAkJYnJkLT5jaGFubmVsc1tpXS0+dWFydF9wb3J0Lm9wcyA9ICZqc21fb3BzOwotCQlicmQtPmNoYW5uZWxzW2ldLT51YXJ0X3BvcnQubGluZSA9IGJyZC0+Y2hhbm5lbHNbaV0tPmNoX3BvcnRudW0gKyBicmQtPmJvYXJkbnVtICogMjsKKwkJbGluZSA9IGZpbmRfZmlyc3RfemVyb19iaXQobGluZW1hcCwgTUFYTElORVMpOworCQlpZiAobGluZSA+PSBNQVhMSU5FUykgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAianNtOiBsaW5lbWFwIGlzIGZ1bGwsIGFkZGVkIGRldmljZSBmYWlsZWRcbiIpOworCQkJY29udGludWU7CisJCX0gZWxzZQorCQkJc2V0X2JpdCgoaW50KWxpbmUsIGxpbmVtYXApOworCQlicmQtPmNoYW5uZWxzW2ldLT51YXJ0X3BvcnQubGluZSA9IGxpbmU7CiAJCWlmICh1YXJ0X2FkZF9vbmVfcG9ydCAoJmpzbV91YXJ0X2RyaXZlciwgJmJyZC0+Y2hhbm5lbHNbaV0tPnVhcnRfcG9ydCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICJBZGRlZCBkZXZpY2UgZmFpbGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImpzbTogYWRkIGRldmljZSBmYWlsZWRcbiIpOwogCQllbHNlCiAJCQlwcmludGsoS0VSTl9JTkZPICJBZGRlZCBkZXZpY2UgXG4iKTsKIAl9CkBAIC00OTQsNiArNTAzLDcgQEAKIAogCQljaCA9IGJyZC0+Y2hhbm5lbHNbaV07CiAKKwkJY2xlYXJfYml0KChpbnQpKGNoLT51YXJ0X3BvcnQubGluZSksIGxpbmVtYXApOwogCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmanNtX3VhcnRfZHJpdmVyLCAmYnJkLT5jaGFubmVsc1tpXS0+dWFydF9wb3J0KTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKaW5kZXggZGJmNTM1Ny4uYTRjZjEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKQEAgLTQ3LDEyICs0NywxNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAjaWZkZWYgQ09ORklHX1NVUEVSSAogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9zaF9iaW9zLmg+CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19IODMwMAorI2luY2x1ZGUgPGFzbS9ncGlvLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgInNoLXNjaS5oIgogCiBzdHJ1Y3Qgc2NpX3BvcnQgewpAQCAtNzUsMTQgKzgwLDIyIEBACiAJaW50CQkJYnJlYWtfZmxhZzsKIAogI2lmZGVmIENPTkZJR19IQVZFX0NMSwotCS8qIFBvcnQgY2xvY2sgKi8KLQlzdHJ1Y3QgY2xrCQkqY2xrOworCS8qIEludGVyZmFjZSBjbG9jayAqLworCXN0cnVjdCBjbGsJCSppY2xrOworCS8qIERhdGEgY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrCQkqZGNsazsKICNlbmRpZgorCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKIH07CiAKLSNpZmRlZiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFCi1zdGF0aWMgc3RydWN0IHNjaV9wb3J0ICpzZXJpYWxfY29uc29sZV9wb3J0Oworc3RydWN0IHNoX3NjaV9wcml2IHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBwb3J0czsKKworI2lmZGVmIENPTkZJR19IQVZFX0NMSworCXN0cnVjdCBub3RpZmllcl9ibG9jayBjbGtfbmI7CiAjZW5kaWYKK307CiAKIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyB2b2lkIHNjaV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwpAQCAtMTM4LDkgKzE1MSw4IEBACiAJCXN0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ3hTUik7CiAJfSB3aGlsZSAoIShzdGF0dXMgJiBTQ3hTUl9URHhFKHBvcnQpKSk7CiAKLQlzY2lfaW4ocG9ydCwgU0N4U1IpOyAgICAgICAgICAgIC8qIER1bW15IHJlYWQgKi8KLQlzY2lfb3V0KHBvcnQsIFNDeFNSLCBTQ3hTUl9URHhFX0NMRUFSKHBvcnQpICYgflNDeFNSX1RFTkQocG9ydCkpOwogCXNjaV9vdXQocG9ydCwgU0N4VERSLCBjKTsKKwlzY2lfb3V0KHBvcnQsIFNDeFNSLCBTQ3hTUl9URHhFX0NMRUFSKHBvcnQpICYgflNDeFNSX1RFTkQocG9ydCkpOwogfQogI2VuZGlmIC8qIENPTkZJR19DT05TT0xFX1BPTEwgfHwgQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRSAqLwogCkBAIC0xNTksMTIgKzE3MSwxMiBAQAogCQkqbXN0cGNybCAmPSB+bWFzazsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGg4MzAwX3NjaV9lbmFibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIGg4MzAwX3NjaV9lbmFibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAloODMwMF9zY2lfY29uZmlnKHBvcnQsIHNjaV9lbmFibGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaDgzMDBfc2NpX2Rpc2FibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3N0YXRpYyB2b2lkIGg4MzAwX3NjaV9kaXNhYmxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJaDgzMDBfc2NpX2NvbmZpZyhwb3J0LCBzY2lfZGlzYWJsZSk7CiB9CkBAIC02MTEsNyArNjIzLDcgQEAKIAlpbnQgY29waWVkID0gMDsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5pbmZvLT5wb3J0LnR0eTsKLQlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSAmc2NpX3BvcnRzW3BvcnQtPmxpbmVdOworCXN0cnVjdCBzY2lfcG9ydCAqcyA9IHRvX3NjaV9wb3J0KHBvcnQpOwogCiAJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQogCQlyZXR1cm4gMDsKQEAgLTcyNiwxOSArNzM4LDQzIEBACiBzdGF0aWMgaW50IHNjaV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCiAJCQl1bnNpZ25lZCBsb25nIHBoYXNlLCB2b2lkICpwKQogewotCWludCBpOworCXN0cnVjdCBzaF9zY2lfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihzZWxmLAorCQkJCQkJc3RydWN0IHNoX3NjaV9wcml2LCBjbGtfbmIpOworCXN0cnVjdCBzY2lfcG9ydCAqc2NpX3BvcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICgocGhhc2UgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFKSB8fAotCSAgICAocGhhc2UgPT0gQ1BVRlJFUV9SRVNVTUVDSEFOR0UpKQotCQlmb3IgKGkgPSAwOyBpIDwgU0NJX05QT1JUUzsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSAmc2NpX3BvcnRzW2ldOwotCQkJcy0+cG9ydC51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKHMtPmNsayk7Ci0JCX0KKwkgICAgKHBoYXNlID09IENQVUZSRVFfUkVTVU1FQ0hBTkdFKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNjaV9wb3J0LCAmcHJpdi0+cG9ydHMsIG5vZGUpCisJCQlzY2lfcG9ydC0+cG9ydC51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKHNjaV9wb3J0LT5kY2xrKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJfQogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzY2lfbmIgPSB7ICZzY2lfbm90aWZpZXIsIE5VTEwsIDAgfTsKK3N0YXRpYyB2b2lkIHNjaV9jbGtfZW5hYmxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNjaV9wb3J0ICpzY2lfcG9ydCA9IHRvX3NjaV9wb3J0KHBvcnQpOworCisJY2xrX2VuYWJsZShzY2lfcG9ydC0+ZGNsayk7CisJc2NpX3BvcnQtPnBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZShzY2lfcG9ydC0+ZGNsayk7CisKKwlpZiAoc2NpX3BvcnQtPmljbGspCisJCWNsa19lbmFibGUoc2NpX3BvcnQtPmljbGspOworfQorCitzdGF0aWMgdm9pZCBzY2lfY2xrX2Rpc2FibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnNjaV9wb3J0ID0gdG9fc2NpX3BvcnQocG9ydCk7CisKKwlpZiAoc2NpX3BvcnQtPmljbGspCisJCWNsa19kaXNhYmxlKHNjaV9wb3J0LT5pY2xrKTsKKworCWNsa19kaXNhYmxlKHNjaV9wb3J0LT5kY2xrKTsKK30KICNlbmRpZgogCiBzdGF0aWMgaW50IHNjaV9yZXF1ZXN0X2lycShzdHJ1Y3Qgc2NpX3BvcnQgKnBvcnQpCkBAIC04NjUsMTUgKzkwMSwxMSBAQAogCiBzdGF0aWMgaW50IHNjaV9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHNjaV9wb3J0ICpzID0gJnNjaV9wb3J0c1twb3J0LT5saW5lXTsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKIAogCWlmIChzLT5lbmFibGUpCiAJCXMtPmVuYWJsZShwb3J0KTsKIAotI2lmZGVmIENPTkZJR19IQVZFX0NMSwotCXMtPmNsayA9IGNsa19nZXQoTlVMTCwgIm1vZHVsZV9jbGsiKTsKLSNlbmRpZgotCiAJc2NpX3JlcXVlc3RfaXJxKHMpOwogCXNjaV9zdGFydF90eChwb3J0KTsKIAlzY2lfc3RhcnRfcngocG9ydCwgMSk7CkBAIC04ODMsNyArOTE1LDcgQEAKIAogc3RhdGljIHZvaWQgc2NpX3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHNjaV9wb3J0ICpzID0gJnNjaV9wb3J0c1twb3J0LT5saW5lXTsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKIAogCXNjaV9zdG9wX3J4KHBvcnQpOwogCXNjaV9zdG9wX3R4KHBvcnQpOwpAQCAtODkxLDExICs5MjMsNiBAQAogCiAJaWYgKHMtPmRpc2FibGUpCiAJCXMtPmRpc2FibGUocG9ydCk7Ci0KLSNpZmRlZiBDT05GSUdfSEFWRV9DTEsKLQljbGtfcHV0KHMtPmNsayk7Ci0Jcy0+Y2xrID0gTlVMTDsKLSNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBzY2lfc2V0X3Rlcm1pb3Moc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLApAQCAtOTgwLDI1ICsxMDA3LDMxIEBACiAKIHN0YXRpYyB2b2lkIHNjaV9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHNjaV9wb3J0ICpzID0gJnNjaV9wb3J0c1twb3J0LT5saW5lXTsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKIAogCXBvcnQtPnR5cGUgPSBzLT50eXBlOwogCi0JaWYgKHBvcnQtPmZsYWdzICYgVVBGX0lPUkVNQVAgJiYgIXBvcnQtPm1lbWJhc2UpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19TVVBFUkg2NCkKLQkJcG9ydC0+bWFwYmFzZSA9IG9uY2hpcF9yZW1hcChTQ0lGX0FERFJfU0g1LCAxMDI0LCAiU0NJRiIpOwotCQlwb3J0LT5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKXBvcnQtPm1hcGJhc2U7Ci0jZWxzZQotCQlwb3J0LT5tZW1iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHBvcnQtPm1hcGJhc2UsIDB4NDApOwotI2VuZGlmCisJaWYgKHBvcnQtPm1lbWJhc2UpCisJCXJldHVybjsKIAotCQlkZXZfZXJyKHBvcnQtPmRldiwgImNhbid0IHJlbWFwIHBvcnQjJWRcbiIsIHBvcnQtPmxpbmUpOworCWlmIChwb3J0LT5mbGFncyAmIFVQRl9JT1JFTUFQKSB7CisJCXBvcnQtPm1lbWJhc2UgPSBpb3JlbWFwX25vY2FjaGUocG9ydC0+bWFwYmFzZSwgMHg0MCk7CisKKwkJaWYgKElTX0VSUihwb3J0LT5tZW1iYXNlKSkKKwkJCWRldl9lcnIocG9ydC0+ZGV2LCAiY2FuJ3QgcmVtYXAgcG9ydCMlZFxuIiwgcG9ydC0+bGluZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRm9yIHRoZSBzaW1wbGUgKGFuZCBtYWpvcml0eSBvZikgY2FzZXMgd2hlcmUgd2UgZG9uJ3QKKwkJICogbmVlZCB0byBkbyBhbnkgcmVtYXBwaW5nLCBqdXN0IGNhc3QgdGhlIGNvb2tpZQorCQkgKiBkaXJlY3RseS4KKwkJICovCisJCXBvcnQtPm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtICopcG9ydC0+bWFwYmFzZTsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgc2NpX3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCiB7Ci0Jc3RydWN0IHNjaV9wb3J0ICpzID0gJnNjaV9wb3J0c1twb3J0LT5saW5lXTsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKIAogCWlmIChzZXItPmlycSAhPSBzLT5pcnFzW1NDSXhfVFhJX0lSUV0gfHwgc2VyLT5pcnEgPiBucl9pcnFzKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwMzIsNjMgKzEwNjUsNjAgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IHNjaV9pbml0X3BvcnRzKHZvaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgc2NpX2luaXRfc2luZ2xlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBzdHJ1Y3Qgc2NpX3BvcnQgKnNjaV9wb3J0LAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBpbmRleCwKKwkJCQkgICAgICBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCAqcCkKIHsKLQlzdGF0aWMgaW50IGZpcnN0ID0gMTsKLQlpbnQgaTsKLQotCWlmICghZmlyc3QpCi0JCXJldHVybjsKLQotCWZpcnN0ID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBTQ0lfTlBPUlRTOyBpKyspIHsKLQkJc2NpX3BvcnRzW2ldLnBvcnQub3BzCQk9ICZzY2lfdWFydF9vcHM7Ci0JCXNjaV9wb3J0c1tpXS5wb3J0LmlvdHlwZQk9IFVQSU9fTUVNOwotCQlzY2lfcG9ydHNbaV0ucG9ydC5saW5lCQk9IGk7Ci0JCXNjaV9wb3J0c1tpXS5wb3J0LmZpZm9zaXplCT0gMTsKKwlzY2lfcG9ydC0+cG9ydC5vcHMJPSAmc2NpX3VhcnRfb3BzOworCXNjaV9wb3J0LT5wb3J0LmlvdHlwZQk9IFVQSU9fTUVNOworCXNjaV9wb3J0LT5wb3J0LmxpbmUJPSBpbmRleDsKKwlzY2lfcG9ydC0+cG9ydC5maWZvc2l6ZQk9IDE7CiAKICNpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKICNpZmRlZiBfX0g4MzAwU19fCi0JCXNjaV9wb3J0c1tpXS5lbmFibGUJPSBoODMwMF9zY2lfZW5hYmxlOwotCQlzY2lfcG9ydHNbaV0uZGlzYWJsZQk9IGg4MzAwX3NjaV9kaXNhYmxlOworCXNjaV9wb3J0LT5lbmFibGUJPSBoODMwMF9zY2lfZW5hYmxlOworCXNjaV9wb3J0LT5kaXNhYmxlCT0gaDgzMDBfc2NpX2Rpc2FibGU7CiAjZW5kaWYKLQkJc2NpX3BvcnRzW2ldLnBvcnQudWFydGNsayA9IENPTkZJR19DUFVfQ0xPQ0s7CisJc2NpX3BvcnQtPnBvcnQudWFydGNsawk9IENPTkZJR19DUFVfQ0xPQ0s7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19IQVZFX0NMSykKLQkJLyoKLQkJICogWFhYOiBXZSBzaG91bGQgdXNlIGEgcHJvcGVyIFNDSS9TQ0lGIGNsb2NrCi0JCSAqLwotCQl7Ci0JCQlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KE5VTEwsICJtb2R1bGVfY2xrIik7Ci0JCQlzY2lfcG9ydHNbaV0ucG9ydC51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKGNsayk7Ci0JCQljbGtfcHV0KGNsayk7Ci0JCX0KKwlzY2lfcG9ydC0+aWNsawkJPSBwLT5jbGsgPyBjbGtfZ2V0KCZkZXYtPmRldiwgcC0+Y2xrKSA6IE5VTEw7CisJc2NpX3BvcnQtPmRjbGsJCT0gY2xrX2dldCgmZGV2LT5kZXYsICJwZXJpcGhlcmFsX2NsayIpOworCXNjaV9wb3J0LT5lbmFibGUJPSBzY2lfY2xrX2VuYWJsZTsKKwlzY2lfcG9ydC0+ZGlzYWJsZQk9IHNjaV9jbGtfZGlzYWJsZTsKICNlbHNlCiAjZXJyb3IgIk5lZWQgYSB2YWxpZCB1YXJ0Y2xrIgogI2VuZGlmCiAKLQkJc2NpX3BvcnRzW2ldLmJyZWFrX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykmc2NpX3BvcnRzW2ldOwotCQlzY2lfcG9ydHNbaV0uYnJlYWtfdGltZXIuZnVuY3Rpb24gPSBzY2lfYnJlYWtfdGltZXI7CisJc2NpX3BvcnQtPmJyZWFrX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2lfcG9ydDsKKwlzY2lfcG9ydC0+YnJlYWtfdGltZXIuZnVuY3Rpb24gPSBzY2lfYnJlYWtfdGltZXI7CisJaW5pdF90aW1lcigmc2NpX3BvcnQtPmJyZWFrX3RpbWVyKTsKIAotCQlpbml0X3RpbWVyKCZzY2lfcG9ydHNbaV0uYnJlYWtfdGltZXIpOwotCX0KLX0KKwlzY2lfcG9ydC0+cG9ydC5tYXBiYXNlCT0gcC0+bWFwYmFzZTsKKwlzY2lfcG9ydC0+cG9ydC5tZW1iYXNlCT0gcC0+bWVtYmFzZTsKIAotaW50IF9faW5pdCBlYXJseV9zY2lfc2V0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlpZiAodW5saWtlbHkocG9ydC0+bGluZSA+IFNDSV9OUE9SVFMpKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlzY2lfcG9ydC0+cG9ydC5pcnEJPSBwLT5pcnFzW1NDSXhfVFhJX0lSUV07CisJc2NpX3BvcnQtPnBvcnQuZmxhZ3MJPSBwLT5mbGFnczsKKwlzY2lfcG9ydC0+cG9ydC5kZXYJPSAmZGV2LT5kZXY7CisJc2NpX3BvcnQtPnR5cGUJCT0gc2NpX3BvcnQtPnBvcnQudHlwZSA9IHAtPnR5cGU7CiAKLQlzY2lfaW5pdF9wb3J0cygpOworCW1lbWNweSgmc2NpX3BvcnQtPmlycXMsICZwLT5pcnFzLCBzaXplb2YocC0+aXJxcykpOwogCi0Jc2NpX3BvcnRzW3BvcnQtPmxpbmVdLnBvcnQubWVtYmFzZQk9IHBvcnQtPm1lbWJhc2U7Ci0Jc2NpX3BvcnRzW3BvcnQtPmxpbmVdLnBvcnQubWFwYmFzZQk9IHBvcnQtPm1hcGJhc2U7Ci0Jc2NpX3BvcnRzW3BvcnQtPmxpbmVdLnBvcnQudHlwZQkJPSBwb3J0LT50eXBlOwotCi0JcmV0dXJuIDA7CiB9CiAKICNpZmRlZiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFCitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnNlcmlhbF9jb25zb2xlX2RldmljZShzdHJ1Y3QgY29uc29sZSAqY28sIGludCAqaW5kZXgpCit7CisJc3RydWN0IHVhcnRfZHJpdmVyICpwID0gJnNjaV91YXJ0X2RyaXZlcjsKKwkqaW5kZXggPSBjby0+aW5kZXg7CisJcmV0dXJuIHAtPnR0eV9kcml2ZXI7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmlhbF9jb25zb2xlX3B1dGNoYXIoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGNoKQoreworCXNjaV9wb2xsX3B1dF9jaGFyKHBvcnQsIGNoKTsKK30KKwogLyoKICAqCVByaW50IGEgc3RyaW5nIHRvIHRoZSBzZXJpYWwgcG9ydCB0cnlpbmcgbm90IHRvIGRpc3R1cmIKICAqCWFueSBwb3NzaWJsZSByZWFsIHVzZSBvZiB0aGUgcG9ydC4uLgpAQCAtMTA5NiwyNSArMTEyNiwyNyBAQAogc3RhdGljIHZvaWQgc2VyaWFsX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLAogCQkJCSB1bnNpZ25lZCBjb3VudCkKIHsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJnNlcmlhbF9jb25zb2xlX3BvcnQtPnBvcnQ7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IGNvLT5kYXRhOworCXN0cnVjdCBzY2lfcG9ydCAqc2NpX3BvcnQgPSB0b19zY2lfcG9ydChwb3J0KTsKIAl1bnNpZ25lZCBzaG9ydCBiaXRzOwotCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJaWYgKCpzID09IDEwKQotCQkJc2NpX3BvbGxfcHV0X2NoYXIocG9ydCwgJ1xyJyk7CisJaWYgKHNjaV9wb3J0LT5lbmFibGUpCisJCXNjaV9wb3J0LT5lbmFibGUocG9ydCk7CiAKLQkJc2NpX3BvbGxfcHV0X2NoYXIocG9ydCwgKnMrKyk7Ci0JfQorCXVhcnRfY29uc29sZV93cml0ZShwb3J0LCBzLCBjb3VudCwgc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcik7CiAKIAkvKiB3YWl0IHVudGlsIGZpZm8gaXMgZW1wdHkgYW5kIGxhc3QgYml0IGhhcyBiZWVuIHRyYW5zbWl0dGVkICovCiAJYml0cyA9IFNDeFNSX1REeEUocG9ydCkgfCBTQ3hTUl9URU5EKHBvcnQpOwogCXdoaWxlICgoc2NpX2luKHBvcnQsIFNDeFNSKSAmIGJpdHMpICE9IGJpdHMpCiAJCWNwdV9yZWxheCgpOworCisJaWYgKHNjaV9wb3J0LT5kaXNhYmxlKTsKKwkJc2NpX3BvcnQtPmRpc2FibGUocG9ydCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNlcmlhbF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKIHsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnNjaV9wb3J0OwogCXN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQ7CiAJaW50IGJhdWQgPSAxMTUyMDA7CiAJaW50IGJpdHMgPSA4OwpAQCAtMTEzMCw4ICsxMTYyLDkgQEAKIAlpZiAoY28tPmluZGV4ID49IFNDSV9OUE9SVFMpCiAJCWNvLT5pbmRleCA9IDA7CiAKLQlzZXJpYWxfY29uc29sZV9wb3J0ID0gJnNjaV9wb3J0c1tjby0+aW5kZXhdOwotCXBvcnQgPSAmc2VyaWFsX2NvbnNvbGVfcG9ydC0+cG9ydDsKKwlzY2lfcG9ydCA9ICZzY2lfcG9ydHNbY28tPmluZGV4XTsKKwlwb3J0ID0gJnNjaV9wb3J0LT5wb3J0OworCWNvLT5kYXRhID0gcG9ydDsKIAogCS8qCiAJICogQWxzbyBuZWVkIHRvIGNoZWNrIHBvcnQtPnR5cGUsIHdlIGRvbid0IGFjdHVhbGx5IGhhdmUgYW55CkBAIC0xMTQxLDIxICsxMTc0LDExIEBACiAJICovCiAJaWYgKCFwb3J0LT50eXBlKQogCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAoIXBvcnQtPm1lbWJhc2UgfHwgIXBvcnQtPm1hcGJhc2UpCi0JCXJldHVybiAtRU5PREVWOwogCi0JcG9ydC0+dHlwZSA9IHNlcmlhbF9jb25zb2xlX3BvcnQtPnR5cGU7CisJc2NpX2NvbmZpZ19wb3J0KHBvcnQsIDApOwogCi0jaWZkZWYgQ09ORklHX0hBVkVfQ0xLCi0JaWYgKCFzZXJpYWxfY29uc29sZV9wb3J0LT5jbGspCi0JCXNlcmlhbF9jb25zb2xlX3BvcnQtPmNsayA9IGNsa19nZXQoTlVMTCwgIm1vZHVsZV9jbGsiKTsKLSNlbmRpZgotCi0JaWYgKHBvcnQtPmZsYWdzICYgVVBGX0lPUkVNQVApCi0JCXNjaV9jb25maWdfcG9ydChwb3J0LCAwKTsKLQotCWlmIChzZXJpYWxfY29uc29sZV9wb3J0LT5lbmFibGUpCi0JCXNlcmlhbF9jb25zb2xlX3BvcnQtPmVuYWJsZShwb3J0KTsKKwlpZiAoc2NpX3BvcnQtPmVuYWJsZSkKKwkJc2NpX3BvcnQtPmVuYWJsZShwb3J0KTsKIAogCWlmIChvcHRpb25zKQogCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CkBAIC0xMTY2LDIyICsxMTg5LDIxIEBACiAJaWYgKHJldCA9PSAwKQogCQlzY2lfc3RvcF9yeChwb3J0KTsKICNlbmRpZgorCS8qIFRPRE86IGRpc2FibGUgY2xvY2sgKi8KIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IGNvbnNvbGUgc2VyaWFsX2NvbnNvbGUgPSB7CiAJLm5hbWUJCT0gInR0eVNDIiwKLQkuZGV2aWNlCQk9IHVhcnRfY29uc29sZV9kZXZpY2UsCisJLmRldmljZQkJPSBzZXJpYWxfY29uc29sZV9kZXZpY2UsCiAJLndyaXRlCQk9IHNlcmlhbF9jb25zb2xlX3dyaXRlLAogCS5zZXR1cAkJPSBzZXJpYWxfY29uc29sZV9zZXR1cCwKIAkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAogCS5pbmRleAkJPSAtMSwKLQkuZGF0YQkJPSAmc2NpX3VhcnRfZHJpdmVyLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2NpX2NvbnNvbGVfaW5pdCh2b2lkKQogewotCXNjaV9pbml0X3BvcnRzKCk7CiAJcmVnaXN0ZXJfY29uc29sZSgmc2VyaWFsX2NvbnNvbGUpOwogCXJldHVybiAwOwogfQpAQCAtMTIwNyw2ICsxMjI5LDYxIEBACiAJLmNvbnMJCT0gU0NJX0NPTlNPTEUsCiB9OwogCisKK3N0YXRpYyBpbnQgc2NpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNoX3NjaV9wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworI2lmZGVmIENPTkZJR19IQVZFX0NMSworCWNwdWZyZXFfdW5yZWdpc3Rlcl9ub3RpZmllcigmcHJpdi0+Y2xrX25iLCBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJnByaXYtPnBvcnRzLCBub2RlKQorCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2NpX3VhcnRfZHJpdmVyLCAmcC0+cG9ydCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlrZnJlZShwcml2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc2NpX3Byb2JlX3NpbmdsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGluZGV4LAorCQkJCSAgICAgIHN0cnVjdCBwbGF0X3NjaV9wb3J0ICpwLAorCQkJCSAgICAgIHN0cnVjdCBzY2lfcG9ydCAqc2NpcG9ydCkKK3sKKwlzdHJ1Y3Qgc2hfc2NpX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCS8qIFNhbml0eSBjaGVjayAqLworCWlmICh1bmxpa2VseShpbmRleCA+PSBTQ0lfTlBPUlRTKSkgeworCQlkZXZfbm90aWNlKCZkZXYtPmRldiwgIkF0dGVtcHRpbmcgdG8gcmVnaXN0ZXIgcG9ydCAiCisJCQkgICAiJWQgd2hlbiBvbmx5ICVkIGFyZSBhdmFpbGFibGUuXG4iLAorCQkJICAgaW5kZXgrMSwgU0NJX05QT1JUUyk7CisJCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiQ29uc2lkZXIgYnVtcGluZyAiCisJCQkgICAiQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFMhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2NpX2luaXRfc2luZ2xlKGRldiwgc2NpcG9ydCwgaW5kZXgsIHApOworCisJcmV0ID0gdWFydF9hZGRfb25lX3BvcnQoJnNjaV91YXJ0X2RyaXZlciwgJnNjaXBvcnQtPnBvcnQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlJTklUX0xJU1RfSEVBRCgmc2NpcG9ydC0+bm9kZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkKCZzY2lwb3J0LT5ub2RlLCAmcHJpdi0+cG9ydHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCiAvKgogICogUmVnaXN0ZXIgYSBzZXQgb2Ygc2VyaWFsIGRldmljZXMgYXR0YWNoZWQgdG8gYSBwbGF0Zm9ybSBkZXZpY2UuICBUaGUKICAqIGxpc3QgaXMgdGVybWluYXRlZCB3aXRoIGEgemVybyBmbGFncyBlbnRyeSwgd2hpY2ggbWVhbnMgd2UgZXhwZWN0CkBAIC0xMjE2LDU3ICsxMjkzLDM0IEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBwbGF0X3NjaV9wb3J0ICpwID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc2hfc2NpX3ByaXYgKnByaXY7CiAJaW50IGksIHJldCA9IC1FSU5WQUw7CiAKLQlmb3IgKGkgPSAwOyBwICYmIHAtPmZsYWdzICE9IDA7IHArKywgaSsrKSB7Ci0JCXN0cnVjdCBzY2lfcG9ydCAqc2NpcG9ydCA9ICZzY2lfcG9ydHNbaV07CisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQkvKiBTYW5pdHkgY2hlY2sgKi8KLQkJaWYgKHVubGlrZWx5KGkgPT0gU0NJX05QT1JUUykpIHsKLQkJCWRldl9ub3RpY2UoJmRldi0+ZGV2LCAiQXR0ZW1wdGluZyB0byByZWdpc3RlciBwb3J0ICIKLQkJCQkgICAiJWQgd2hlbiBvbmx5ICVkIGFyZSBhdmFpbGFibGUuXG4iLAotCQkJCSAgIGkrMSwgU0NJX05QT1JUUyk7Ci0JCQlkZXZfbm90aWNlKCZkZXYtPmRldiwgIkNvbnNpZGVyIGJ1bXBpbmcgIgotCQkJCSAgICJDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUyFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzY2lwb3J0LT5wb3J0Lm1hcGJhc2UJPSBwLT5tYXBiYXNlOwotCi0JCWlmIChwLT5tYXBiYXNlICYmICFwLT5tZW1iYXNlKSB7Ci0JCQlpZiAocC0+ZmxhZ3MgJiBVUEZfSU9SRU1BUCkgewotCQkJCXAtPm1lbWJhc2UgPSBpb3JlbWFwX25vY2FjaGUocC0+bWFwYmFzZSwgMHg0MCk7Ci0JCQkJaWYgKElTX0VSUihwLT5tZW1iYXNlKSkgewotCQkJCQlyZXQgPSBQVFJfRVJSKHAtPm1lbWJhc2UpOwotCQkJCQlnb3RvIGVycl91bnJlZzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogRm9yIHRoZSBzaW1wbGUgKGFuZCBtYWpvcml0eSBvZikgY2FzZXMKLQkJCQkgKiB3aGVyZSB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSByZW1hcHBpbmcsCi0JCQkJICoganVzdCBjYXN0IHRoZSBjb29raWUgZGlyZWN0bHkuCi0JCQkJICovCi0JCQkJcC0+bWVtYmFzZSA9ICh2b2lkIF9faW9tZW0gKilwLT5tYXBiYXNlOwotCQkJfQotCQl9Ci0KLQkJc2NpcG9ydC0+cG9ydC5tZW1iYXNlCT0gcC0+bWVtYmFzZTsKLQotCQlzY2lwb3J0LT5wb3J0LmlycQk9IHAtPmlycXNbU0NJeF9UWElfSVJRXTsKLQkJc2NpcG9ydC0+cG9ydC5mbGFncwk9IHAtPmZsYWdzOwotCQlzY2lwb3J0LT5wb3J0LmRldgk9ICZkZXYtPmRldjsKLQotCQlzY2lwb3J0LT50eXBlCQk9IHNjaXBvcnQtPnBvcnQudHlwZSA9IHAtPnR5cGU7Ci0KLQkJbWVtY3B5KCZzY2lwb3J0LT5pcnFzLCAmcC0+aXJxcywgc2l6ZW9mKHAtPmlycXMpKTsKLQotCQl1YXJ0X2FkZF9vbmVfcG9ydCgmc2NpX3VhcnRfZHJpdmVyLCAmc2NpcG9ydC0+cG9ydCk7Ci0JfQorCUlOSVRfTElTVF9IRUFEKCZwcml2LT5wb3J0cyk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgcHJpdik7CiAKICNpZmRlZiBDT05GSUdfSEFWRV9DTEsKLQljcHVmcmVxX3JlZ2lzdGVyX25vdGlmaWVyKCZzY2lfbmIsIENQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CisJcHJpdi0+Y2xrX25iLm5vdGlmaWVyX2NhbGwgPSBzY2lfbm90aWZpZXI7CisJY3B1ZnJlcV9yZWdpc3Rlcl9ub3RpZmllcigmcHJpdi0+Y2xrX25iLCBDUFVGUkVRX1RSQU5TSVRJT05fTk9USUZJRVIpOwogI2VuZGlmCiAKKwlpZiAoZGV2LT5pZCAhPSAtMSkgeworCQlyZXQgPSBzY2lfcHJvYmVfc2luZ2xlKGRldiwgZGV2LT5pZCwgcCwgJnNjaV9wb3J0c1tkZXYtPmlkXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl91bnJlZzsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBwICYmIHAtPmZsYWdzICE9IDA7IHArKywgaSsrKSB7CisJCQlyZXQgPSBzY2lfcHJvYmVfc2luZ2xlKGRldiwgaSwgcCwgJnNjaV9wb3J0c1tpXSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyX3VucmVnOworCQl9CisJfQorCiAjaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MKIAlzaF9iaW9zX2dkYl9kZXRhY2goKTsKICNlbmRpZgpAQCAtMTI3NCw1MCArMTMyOCwzNiBAQAogCXJldHVybiAwOwogCiBlcnJfdW5yZWc6Ci0JZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKQotCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2NpX3VhcnRfZHJpdmVyLCAmc2NpX3BvcnRzW2ldLnBvcnQpOwotCisJc2NpX3JlbW92ZShkZXYpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHNjaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQotewotCWludCBpOwotCi0jaWZkZWYgQ09ORklHX0hBVkVfQ0xLCi0JY3B1ZnJlcV91bnJlZ2lzdGVyX25vdGlmaWVyKCZzY2lfbmIsIENQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7Ci0jZW5kaWYKLQotCWZvciAoaSA9IDA7IGkgPCBTQ0lfTlBPUlRTOyBpKyspCi0JCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzY2lfdWFydF9kcml2ZXIsICZzY2lfcG9ydHNbaV0ucG9ydCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBzY2lfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlpbnQgaTsKKwlzdHJ1Y3Qgc2hfc2NpX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzY2lfcG9ydCAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZm9yIChpID0gMDsgaSA8IFNDSV9OUE9SVFM7IGkrKykgewotCQlzdHJ1Y3Qgc2NpX3BvcnQgKnAgPSAmc2NpX3BvcnRzW2ldOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmcHJpdi0+cG9ydHMsIG5vZGUpCisJCXVhcnRfc3VzcGVuZF9wb3J0KCZzY2lfdWFydF9kcml2ZXIsICZwLT5wb3J0KTsKIAotCQlpZiAocC0+dHlwZSAhPSBQT1JUX1VOS05PV04gJiYgcC0+cG9ydC5kZXYgPT0gJmRldi0+ZGV2KQotCQkJdWFydF9zdXNwZW5kX3BvcnQoJnNjaV91YXJ0X2RyaXZlciwgJnAtPnBvcnQpOwotCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzY2lfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQlpbnQgaTsKKwlzdHJ1Y3Qgc2hfc2NpX3ByaXYgKnByaXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzY2lfcG9ydCAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZm9yIChpID0gMDsgaSA8IFNDSV9OUE9SVFM7IGkrKykgewotCQlzdHJ1Y3Qgc2NpX3BvcnQgKnAgPSAmc2NpX3BvcnRzW2ldOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmcHJpdi0+cG9ydHMsIG5vZGUpCisJCXVhcnRfcmVzdW1lX3BvcnQoJnNjaV91YXJ0X2RyaXZlciwgJnAtPnBvcnQpOwogCi0JCWlmIChwLT50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiBwLT5wb3J0LmRldiA9PSAmZGV2LT5kZXYpCi0JCQl1YXJ0X3Jlc3VtZV9wb3J0KCZzY2lfdWFydF9kcml2ZXIsICZwLT5wb3J0KTsKLQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzM5LDggKzEzNzksNiBAQAogCiAJcHJpbnRrKGJhbm5lcik7CiAKLQlzY2lfaW5pdF9wb3J0cygpOwotCiAJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJnNjaV91YXJ0X2RyaXZlcik7CiAJaWYgKGxpa2VseShyZXQgPT0gMCkpIHsKIAkJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzY2lfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5oIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKaW5kZXggZDBhYTgyZC4uMzgwNzJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKKysrIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmgKQEAgLTkxLDYgKzkxLDkgQEAKICMgZGVmaW5lIFNDU1BUUjUgICAgICAgICAgICAgICAgMHhhNDA1MDEyOAogIyBkZWZpbmUgU0NJRl9PUkVSICAgICAgICAgICAgICAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCiAjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAgICAgIDB4MDAzOCAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLworI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0KQorIyBkZWZpbmUgU0NJRl9PUkVSICAgICAgICAgICAgICAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCisjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAgICAgIDB4MDAzOCAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMikKICMgZGVmaW5lIFNDU1BUUjIgMHhmZmU4MDAyMCAvKiAxNiBiaXQgU0NJRiAqLwogIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCkBAIC0zMTQsNyArMzE3LDE4IEBACiAgICAgfQkJCQkJCQkJCVwKICAgfQogCi0jZGVmaW5lIENQVV9TQ0lGX0ZOUyhuYW1lLCBzY2lmX29mZnNldCwgc2NpZl9zaXplKQkJCQlcCisjaWZkZWYgQ09ORklHX0g4MzAwCisvKiBoODMwMCBkb24ndCBoYXZlIFNDSUYgKi8KKyNkZWZpbmUgQ1BVX1NDSUZfRk5TKG5hbWUpCQkJCQkJXAorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzY2lfIyNuYW1lIyNfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkJXAorICB7CQkJCQkJCQkJXAorICAgIHJldHVybiAwOwkJCQkJCQkJXAorICB9CQkJCQkJCQkJXAorICBzdGF0aWMgaW5saW5lIHZvaWQgc2NpXyMjbmFtZSMjX291dChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdmFsdWUpIFwKKyAgewkJCQkJCQkJCVwKKyAgfQorI2Vsc2UKKyNkZWZpbmUgQ1BVX1NDSUZfRk5TKG5hbWUsIHNjaWZfb2Zmc2V0LCBzY2lmX3NpemUpCQkJXAogICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzY2lfIyNuYW1lIyNfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkJXAogICB7CQkJCQkJCQkJXAogICAgIFNDSV9JTihzY2lmX3NpemUsIHNjaWZfb2Zmc2V0KTsJCQkJCVwKQEAgLTMyMyw2ICszMzcsNyBAQAogICB7CQkJCQkJCQkJXAogICAgIFNDSV9PVVQoc2NpZl9zaXplLCBzY2lmX29mZnNldCwgdmFsdWUpOwkJCQlcCiAgIH0KKyNlbmRpZgogCiAjZGVmaW5lIENQVV9TQ0lfRk5TKG5hbWUsIHNjaV9vZmZzZXQsIHNjaV9zaXplKQkJCQlcCiAgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNjaV8jI25hbWUjI19pbihzdHJ1Y3QgdWFydF9wb3J0KiBwb3J0KQlcCkBAIC0zNjAsOCArMzc1LDEwIEBACiAJCSBzaDNfc2NpZl9vZmZzZXQsIHNoM19zY2lmX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSwgXAogICAgICAgICAgICAgICAgICBoOF9zY2lfb2Zmc2V0LCBoOF9zY2lfc2l6ZSkgXAogICBDUFVfU0NJX0ZOUyhuYW1lLCBoOF9zY2lfb2Zmc2V0LCBoOF9zY2lfc2l6ZSkKLSNkZWZpbmUgU0NJRl9GTlMobmFtZSwgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMpCisjZGVmaW5lIFNDSUZfRk5TKG5hbWUsIHNoM19zY2lmX29mZnNldCwgc2gzX3NjaWZfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKSBcCisgIENQVV9TQ0lGX0ZOUyhuYW1lKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzKSB8fFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCkKICAgICAgICAgI2RlZmluZSBTQ0l4X0ZOUyhuYW1lLCBzaDRfc2NpZmFfb2Zmc2V0LCBzaDRfc2NpZmFfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKSBcCiAgICAgICAgICAgICAgICAgQ1BVX1NDSXhfRk5TKG5hbWUsIHNoNF9zY2lmYV9vZmZzZXQsIHNoNF9zY2lmYV9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUpCiAgICAgICAgICNkZWZpbmUgU0NJRl9GTlMobmFtZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKSBcCkBAIC0zOTAsNyArNDA3LDggQEAKIFNDSUZfRk5TKFNDeFREUiwgMHgyMCwgIDgpCiBTQ0lGX0ZOUyhTQ3hSRFIsIDB4MjQsICA4KQogU0NJRl9GTlMoU0NMU1IsICAweDI0LCAxNikKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykgfHxcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCiBTQ0l4X0ZOUyhTQ1NNUiwgIDB4MDAsIDE2LCAweDAwLCAxNikKIFNDSXhfRk5TKFNDQlJSLCAgMHgwNCwgIDgsIDB4MDQsICA4KQogU0NJeF9GTlMoU0NTQ1IsICAweDA4LCAxNiwgMHgwOCwgMTYpCkBAIC02MDQsMTAgKzYyMiwyMSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBjdHJsX2luYihTQ1NQVFI1KSAmIDB4MDAwOCA/IDEgOiAwOyAvKiBTQ0lGNSAqLwogICAgICAgICByZXR1cm4gMTsKIH0KKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCkKKyMgIGRlZmluZSBTQ0ZTUiAgICAweDAwMTAKKyMgIGRlZmluZSBTQ0FTU1IgICAweDAwMTQKK3N0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUYpCisJCXJldHVybiBjdHJsX2ludygocG9ydC0+bWFwYmFzZSArIFNDRlNSKSkgICYgU0NJRl9CUksgPyAxIDogMDsKKwlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUZBKQorCQlyZXR1cm4gY3RybF9pbncoKHBvcnQtPm1hcGJhc2UgKyBTQ0FTU1IpKSAmIFNDSUZfQlJLID8gMSA6IDA7CisJcmV0dXJuIDE7Cit9CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAxKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDVfMTAzKQogc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotICAgICAgICAgcmV0dXJuIHNjaV9pbihwb3J0LCBTQ1NQVFIyKSYweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworICAgICAgICAgcmV0dXJuIHNjaV9pbihwb3J0LCBTQ1NQVFIpJjB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCiB9CiAjZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKIHN0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTc1Nyw3ICs3ODYsOCBAQAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBcCiAgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpCiAjZGVmaW5lIFNDQlJSX1ZBTFVFKGJwcywgY2xrKSAoKChjbGsqMikrMTYqYnBzKS8oMzIqYnBzKS0xKQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzKSB8fFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCkKIHN0YXRpYyBpbmxpbmUgaW50IHNjYnJyX2NhbGMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50IGJwcywgaW50IGNsaykKIHsKIAlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC90aW1idWFydC5jIGIvZHJpdmVycy9zZXJpYWwvdGltYnVhcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzllNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zZXJpYWwvdGltYnVhcnQuYwpAQCAtMCwwICsxLDUyNiBAQAorLyoKKyAqIHRpbWJ1YXJ0LmMgdGltYmVyZGFsZSBGUEdBIFVBUlQgZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBTdXBwb3J0czoKKyAqIFRpbWJlcmRhbGUgRlBHQSBVQVJUCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisKKyNpbmNsdWRlICJ0aW1idWFydC5oIgorCitzdHJ1Y3QgdGltYnVhcnRfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydAlwb3J0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAl0YXNrbGV0OworCWludAkJCXVzZWRtYTsKKwl1OAkJCWxhc3RfaWVyOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgICpkZXY7Cit9OworCitzdGF0aWMgaW50IGJhdWRyYXRlc1tdID0gezk2MDAsIDE5MjAwLCAzODQwMCwgNTc2MDAsIDExNTIwMCwgMjMwNDAwLCA0NjA4MDAsCisJOTIxNjAwLCAxODQzMjAwLCAzMjUwMDAwfTsKKworc3RhdGljIHZvaWQgdGltYnVhcnRfbWN0cmxfY2hlY2soc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdTggaXNyLCB1OCAqaWVyKTsKKworc3RhdGljIGlycXJldHVybl90IHRpbWJ1YXJ0X2hhbmRsZWludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZpZCk7CisKK3N0YXRpYyB2b2lkIHRpbWJ1YXJ0X3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwkvKiBzcGluIGxvY2sgaGVsZCBieSB1cHBlciBsYXllciwgZGlzYWJsZSBhbGwgUlggaW50ZXJydXB0cyAqLworCXU4IGllciA9IGlvcmVhZDgocG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX0lFUikgJiB+UlhGTEFHUzsKKwlpb3dyaXRlOChpZXIsIHBvcnQtPm1lbWJhc2UgKyBUSU1CVUFSVF9JRVIpOworfQorCitzdGF0aWMgdm9pZCB0aW1idWFydF9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogc3BpbmxvY2sgaGVsZCBieSB1cHBlciBsYXllciwgZGlzYWJsZSBUWCBpbnRlcnJ1cHQgKi8KKwl1OCBpZXIgPSBpb3JlYWQ4KHBvcnQtPm1lbWJhc2UgKyBUSU1CVUFSVF9JRVIpICYgflRYQkFFOworCWlvd3JpdGU4KGllciwgcG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX0lFUik7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWJ1YXJ0X3N0YXJ0X3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHRpbWJ1YXJ0X3BvcnQgKnVhcnQgPQorCQljb250YWluZXJfb2YocG9ydCwgc3RydWN0IHRpbWJ1YXJ0X3BvcnQsIHBvcnQpOworCisJLyogZG8gbm90IHRyYW5zZmVyIGFueXRoaW5nIGhlcmUgLT4gZmlyZSBvZmYgdGhlIHRhc2tsZXQgKi8KKwl0YXNrbGV0X3NjaGVkdWxlKCZ1YXJ0LT50YXNrbGV0KTsKK30KKworc3RhdGljIHZvaWQgdGltYnVhcnRfZmx1c2hfYnVmZmVyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdTggY3RsID0gaW9yZWFkOChwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfQ1RSTCkgfCBUSU1CVUFSVF9DVFJMX0ZMU0hUWDsKKworCWlvd3JpdGU4KGN0bCwgcG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX0NUUkwpOworCWlvd3JpdGU4KFRYQkYsIHBvcnQtPm1lbWJhc2UgKyBUSU1CVUFSVF9JU1IpOworfQorCitzdGF0aWMgdm9pZCB0aW1idWFydF9yeF9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5pbmZvLT5wb3J0LnR0eTsKKworCXdoaWxlIChpb3JlYWQ4KHBvcnQtPm1lbWJhc2UgKyBUSU1CVUFSVF9JU1IpICYgUlhEUCkgeworCQl1OCBjaCA9IGlvcmVhZDgocG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX1JYRklGTyk7CisJCXBvcnQtPmljb3VudC5yeCsrOworCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCBUVFlfTk9STUFMKTsKKwl9CisKKwlzcGluX3VubG9jaygmcG9ydC0+bG9jayk7CisJdHR5X2ZsaXBfYnVmZmVyX3B1c2gocG9ydC0+aW5mby0+cG9ydC50dHkpOworCXNwaW5fbG9jaygmcG9ydC0+bG9jayk7CisKKwlkZXZfZGJnKHBvcnQtPmRldiwgIiVzIC0gdG90YWwgcmVhZCAlZCBieXRlc1xuIiwKKwkJX19mdW5jX18sIHBvcnQtPmljb3VudC5yeCk7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWJ1YXJ0X3R4X2NoYXJzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPmluZm8tPnhtaXQ7CisKKwl3aGlsZSAoIShpb3JlYWQ4KHBvcnQtPm1lbWJhc2UgKyBUSU1CVUFSVF9JU1IpICYgVFhCRikgJiYKKwkJIXVhcnRfY2lyY19lbXB0eSh4bWl0KSkgeworCQlpb3dyaXRlOCh4bWl0LT5idWZbeG1pdC0+dGFpbF0sCisJCQlwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfVFhGSUZPKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJiAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwkJcG9ydC0+aWNvdW50LnR4Kys7CisJfQorCisJZGV2X2RiZyhwb3J0LT5kZXYsCisJCSIlcyAtIHRvdGFsIHdyaXR0ZW4gJWQgYnl0ZXMsIENUTDogJXgsIFJUUzogJXgsIGJhdWQ6ICV4XG4iLAorCQkgX19mdW5jX18sCisJCXBvcnQtPmljb3VudC50eCwKKwkJaW9yZWFkOChwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfQ1RSTCksCisJCXBvcnQtPm1jdHJsICYgVElPQ01fUlRTLAorCQlpb3JlYWQ4KHBvcnQtPm1lbWJhc2UgKyBUSU1CVUFSVF9CQVVEUkFURSkpOworfQorCitzdGF0aWMgdm9pZCB0aW1idWFydF9oYW5kbGVfdHhfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1OCBpc3IsIHU4ICppZXIpCit7CisJc3RydWN0IHRpbWJ1YXJ0X3BvcnQgKnVhcnQgPQorCQljb250YWluZXJfb2YocG9ydCwgc3RydWN0IHRpbWJ1YXJ0X3BvcnQsIHBvcnQpOworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OworCisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpCisJCXJldHVybjsKKworCWlmIChwb3J0LT54X2NoYXIpCisJCXJldHVybjsKKworCWlmIChpc3IgJiBUWEZMQUdTKSB7CisJCXRpbWJ1YXJ0X3R4X2NoYXJzKHBvcnQpOworCQkvKiBjbGVhciBhbGwgVFggaW50ZXJydXB0cyAqLworCQlpb3dyaXRlOChUWEZMQUdTLCBwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfSVNSKTsKKworCQlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCQl1YXJ0X3dyaXRlX3dha2V1cChwb3J0KTsKKwl9IGVsc2UKKwkJLyogUmUtZW5hYmxlIGFueSB0eCBpbnRlcnJ1cHQgKi8KKwkJKmllciB8PSB1YXJ0LT5sYXN0X2llciAmIFRYRkxBR1M7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyBpZiB0aGVyZSBhcmUgY2hhcnMgaW4gdGhlIHRyYW5zbWl0IGJ1ZmZlciwKKwkgKiBPciBpZiB3ZSBkZWxpdmVyZWQgc29tZSBieXRlcyBhbmQgd2FudCB0aGUgYWxtb3N0IGVtcHR5IGludGVycnVwdAorCSAqIHdlIHdha2UgdXAgdGhlIHVwcGVyIGxheWVyIGxhdGVyIHdoZW4gd2UgZ290IHRoZSBpbnRlcnJ1cHQKKwkgKiB0byBnaXZlIGl0IHNvbWUgdGltZSB0byBnbyBvdXQuLi4KKwkgKi8KKwlpZiAoIXVhcnRfY2lyY19lbXB0eSh4bWl0KSkKKwkJKmllciB8PSBUWEJBRTsKKworCWRldl9kYmcocG9ydC0+ZGV2LCAiJXMgLSBsZWF2aW5nXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgdGltYnVhcnRfaGFuZGxlX3J4X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdTggaXNyLCB1OCAqaWVyKQoreworCWlmIChpc3IgJiBSWEZMQUdTKSB7CisJCS8qIFNvbWUgUlggc3RhdHVzIGlzIHNldCAqLworCQlpZiAoaXNyICYgUlhCRikgeworCQkJdTggY3RsID0gaW9yZWFkOChwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfQ1RSTCkgfAorCQkJCVRJTUJVQVJUX0NUUkxfRkxTSFJYOworCQkJaW93cml0ZTgoY3RsLCBwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfQ1RSTCk7CisJCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOworCQl9IGVsc2UgaWYgKGlzciAmIChSWERQKSkKKwkJCXRpbWJ1YXJ0X3J4X2NoYXJzKHBvcnQpOworCisJCS8qIGFjayBhbGwgUlggaW50ZXJydXB0cyAqLworCQlpb3dyaXRlOChSWEZMQUdTLCBwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfSVNSKTsKKwl9CisKKwkvKiBhbHdheXMgaGF2ZSB0aGUgUlggaW50ZXJydXB0cyBlbmFibGVkICovCisJKmllciB8PSBSWEJBRiB8IFJYQkYgfCBSWFRUOworCisJZGV2X2RiZyhwb3J0LT5kZXYsICIlcyAtIGxlYXZpbmdcbiIsIF9fZnVuY19fKTsKK30KKwordm9pZCB0aW1idWFydF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0aW1idWFydF9wb3J0ICp1YXJ0ID0gKHN0cnVjdCB0aW1idWFydF9wb3J0ICopYXJnOworCXU4IGlzciwgaWVyID0gMDsKKworCXNwaW5fbG9jaygmdWFydC0+cG9ydC5sb2NrKTsKKworCWlzciA9IGlvcmVhZDgodWFydC0+cG9ydC5tZW1iYXNlICsgVElNQlVBUlRfSVNSKTsKKwlkZXZfZGJnKHVhcnQtPnBvcnQuZGV2LCAiJXMgSVNSOiAleFxuIiwgX19mdW5jX18sIGlzcik7CisKKwlpZiAoIXVhcnQtPnVzZWRtYSkKKwkJdGltYnVhcnRfaGFuZGxlX3R4X3BvcnQoJnVhcnQtPnBvcnQsIGlzciwgJmllcik7CisKKwl0aW1idWFydF9tY3RybF9jaGVjaygmdWFydC0+cG9ydCwgaXNyLCAmaWVyKTsKKworCWlmICghdWFydC0+dXNlZG1hKQorCQl0aW1idWFydF9oYW5kbGVfcnhfcG9ydCgmdWFydC0+cG9ydCwgaXNyLCAmaWVyKTsKKworCWlvd3JpdGU4KGllciwgdWFydC0+cG9ydC5tZW1iYXNlICsgVElNQlVBUlRfSUVSKTsKKworCXNwaW5fdW5sb2NrKCZ1YXJ0LT5wb3J0LmxvY2spOworCWRldl9kYmcodWFydC0+cG9ydC5kZXYsICIlcyBsZWF2aW5nXG4iLCBfX2Z1bmNfXyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdGltYnVhcnRfdHhfZW1wdHkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1OCBpc3IgPSBpb3JlYWQ4KHBvcnQtPm1lbWJhc2UgKyBUSU1CVUFSVF9JU1IpOworCisJcmV0dXJuIChpc3IgJiBUWEJBRSkgPyBUSU9DU0VSX1RFTVQgOiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHRpbWJ1YXJ0X2dldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXU4IGN0cyA9IGlvcmVhZDgocG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX0NUUkwpOworCWRldl9kYmcocG9ydC0+ZGV2LCAiJXMgLSBjdHMgJXhcbiIsIF9fZnVuY19fLCBjdHMpOworCisJaWYgKGN0cyAmIFRJTUJVQVJUX0NUUkxfQ1RTKQorCQlyZXR1cm4gVElPQ01fQ1RTIHwgVElPQ01fRFNSIHwgVElPQ01fQ0FSOworCWVsc2UKKwkJcmV0dXJuIFRJT0NNX0RTUiB8IFRJT0NNX0NBUjsKK30KKworc3RhdGljIHZvaWQgdGltYnVhcnRfc2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBtY3RybCkKK3sKKwlkZXZfZGJnKHBvcnQtPmRldiwgIiVzIC0gJXhcbiIsIF9fZnVuY19fLCBtY3RybCk7CisKKwlpZiAobWN0cmwgJiBUSU9DTV9SVFMpCisJCWlvd3JpdGU4KFRJTUJVQVJUX0NUUkxfUlRTLCBwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfQ1RSTCk7CisJZWxzZQorCQlpb3dyaXRlOChUSU1CVUFSVF9DVFJMX1JUUywgcG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCB0aW1idWFydF9tY3RybF9jaGVjayhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1OCBpc3IsIHU4ICppZXIpCit7CisJdW5zaWduZWQgaW50IGN0czsKKworCWlmIChpc3IgJiBDVFNfREVMVEEpIHsKKwkJLyogYWNrICovCisJCWlvd3JpdGU4KENUU19ERUxUQSwgcG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX0lTUik7CisJCWN0cyA9IHRpbWJ1YXJ0X2dldF9tY3RybChwb3J0KTsKKwkJdWFydF9oYW5kbGVfY3RzX2NoYW5nZShwb3J0LCBjdHMgJiBUSU9DTV9DVFMpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPmluZm8tPmRlbHRhX21zcl93YWl0KTsKKwl9CisKKwkqaWVyIHw9IENUU19ERUxUQTsKK30KKworc3RhdGljIHZvaWQgdGltYnVhcnRfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogTi9BICovCit9CisKK3N0YXRpYyB2b2lkIHRpbWJ1YXJ0X2JyZWFrX2N0bChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgY3RsKQoreworCS8qIE4vQSAqLworfQorCitzdGF0aWMgaW50IHRpbWJ1YXJ0X3N0YXJ0dXAoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdGltYnVhcnRfcG9ydCAqdWFydCA9CisJCWNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgdGltYnVhcnRfcG9ydCwgcG9ydCk7CisKKwlkZXZfZGJnKHBvcnQtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpb3dyaXRlOChUSU1CVUFSVF9DVFJMX0ZMU0hSWCwgcG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX0NUUkwpOworCWlvd3JpdGU4KDB4ZmYsIHBvcnQtPm1lbWJhc2UgKyBUSU1CVUFSVF9JU1IpOworCS8qIEVuYWJsZSBhbGwgYnV0IFRYIGludGVycnVwdHMgKi8KKwlpb3dyaXRlOChSWEJBRiB8IFJYQkYgfCBSWFRUIHwgQ1RTX0RFTFRBLAorCQlwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfSUVSKTsKKworCXJldHVybiByZXF1ZXN0X2lycShwb3J0LT5pcnEsIHRpbWJ1YXJ0X2hhbmRsZWludGVycnVwdCwgSVJRRl9TSEFSRUQsCisJCSJ0aW1iLXVhcnQiLCB1YXJ0KTsKK30KKworc3RhdGljIHZvaWQgdGltYnVhcnRfc2h1dGRvd24oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgdGltYnVhcnRfcG9ydCAqdWFydCA9CisJCWNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgdGltYnVhcnRfcG9ydCwgcG9ydCk7CisJZGV2X2RiZyhwb3J0LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCWZyZWVfaXJxKHBvcnQtPmlycSwgdWFydCk7CisJaW93cml0ZTgoMCwgcG9ydC0+bWVtYmFzZSArIFRJTUJVQVJUX0lFUik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2JpbmRleChpbnQgYmF1ZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJhdWRyYXRlcyk7IGkrKykKKwkJaWYgKGJhdWQgPD0gYmF1ZHJhdGVzW2ldKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWJ1YXJ0X3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zLAorCXN0cnVjdCBrdGVybWlvcyAqb2xkKQoreworCXVuc2lnbmVkIGludCBiYXVkOworCXNob3J0IGJpbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsgLyAxNik7CisJYmluZGV4ID0gZ2V0X2JpbmRleChiYXVkKTsKKwlkZXZfZGJnKHBvcnQtPmRldiwgIiVzIC0gYmluZGV4ICVkXG4iLCBfX2Z1bmNfXywgYmluZGV4KTsKKworCWlmIChiaW5kZXggPCAwKQorCQliaW5kZXggPSAwOworCWJhdWQgPSBiYXVkcmF0ZXNbYmluZGV4XTsKKworCS8qIFRoZSBzZXJpYWwgbGF5ZXIgY2FsbHMgaW50byB0aGlzIG9uY2Ugd2l0aCBvbGQgPSBOVUxMIHdoZW4gc2V0dGluZworCSAgIHVwIGluaXRpYWxseSAqLworCWlmIChvbGQpCisJCXR0eV90ZXJtaW9zX2NvcHlfaHcodGVybWlvcywgb2xkKTsKKwl0dHlfdGVybWlvc19lbmNvZGVfYmF1ZF9yYXRlKHRlcm1pb3MsIGJhdWQsIGJhdWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlpb3dyaXRlOCgodTgpYmluZGV4LCBwb3J0LT5tZW1iYXNlICsgVElNQlVBUlRfQkFVRFJBVEUpOworCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdGltYnVhcnRfdHlwZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBwb3J0LT50eXBlID09IFBPUlRfVU5LTk9XTiA/ICJ0aW1idWFydCIgOiBOVUxMOworfQorCisvKiBXZSBkbyBub3QgcmVxdWVzdC9yZWxlYXNlIG1hcHBpbmdzIG9mIHRoZSByZWdpc3RlcnMgaGVyZSwKKyAqIGN1cnJlbnRseSBpdCdzIGRvbmUgaW4gdGhlIHByb2JsZSBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdGltYnVhcnRfcmVsZWFzZV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShwb3J0LT5kZXYpOworCWludCBzaXplID0KKwkJcmVzb3VyY2Vfc2l6ZShwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApKTsKKworCWlmIChwb3J0LT5mbGFncyAmIFVQRl9JT1JFTUFQKSB7CisJCWlvdW5tYXAocG9ydC0+bWVtYmFzZSk7CisJCXBvcnQtPm1lbWJhc2UgPSBOVUxMOworCX0KKworCXJlbGVhc2VfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBzaXplKTsKK30KKworc3RhdGljIGludCB0aW1idWFydF9yZXF1ZXN0X3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKHBvcnQtPmRldik7CisJaW50IHNpemUgPQorCQlyZXNvdXJjZV9zaXplKHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCkpOworCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgc2l6ZSwgInRpbWItdWFydCIpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKHBvcnQtPmZsYWdzICYgVVBGX0lPUkVNQVApIHsKKwkJcG9ydC0+bWVtYmFzZSA9IGlvcmVtYXAocG9ydC0+bWFwYmFzZSwgc2l6ZSk7CisJCWlmIChwb3J0LT5tZW1iYXNlID09IE5VTEwpIHsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBzaXplKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB0aW1idWFydF9oYW5kbGVpbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IHRpbWJ1YXJ0X3BvcnQgKnVhcnQgPSAoc3RydWN0IHRpbWJ1YXJ0X3BvcnQgKilkZXZpZDsKKworCWlmIChpb3JlYWQ4KHVhcnQtPnBvcnQubWVtYmFzZSArIFRJTUJVQVJUX0lQUikpIHsKKwkJdWFydC0+bGFzdF9pZXIgPSBpb3JlYWQ4KHVhcnQtPnBvcnQubWVtYmFzZSArIFRJTUJVQVJUX0lFUik7CisKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzLCB0aGUgdGFza2xldCBlbmFibGVzIHRoZW0gYWdhaW4gKi8KKwkJaW93cml0ZTgoMCwgdWFydC0+cG9ydC5tZW1iYXNlICsgVElNQlVBUlRfSUVSKTsKKworCQkvKiBmaXJlIG9mZiBib3R0b20gaGFsZiAqLworCQl0YXNrbGV0X3NjaGVkdWxlKCZ1YXJ0LT50YXNrbGV0KTsKKworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfSBlbHNlCisJCXJldHVybiBJUlFfTk9ORTsKK30KKworLyoKKyAqIENvbmZpZ3VyZS9hdXRvY29uZmlndXJlIHRoZSBwb3J0LgorICovCitzdGF0aWMgdm9pZCB0aW1idWFydF9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSkgeworCQlwb3J0LT50eXBlID0gUE9SVF9USU1CVUFSVDsKKwkJdGltYnVhcnRfcmVxdWVzdF9wb3J0KHBvcnQpOworCX0KK30KKworc3RhdGljIGludCB0aW1idWFydF92ZXJpZnlfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAorCXN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCit7CisJLyogd2UgZG9uJ3Qgd2FudCB0aGUgY29yZSBjb2RlIHRvIG1vZGlmeSBhbnkgcG9ydCBwYXJhbXMgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X29wcyB0aW1idWFydF9vcHMgPSB7CisJLnR4X2VtcHR5ID0gdGltYnVhcnRfdHhfZW1wdHksCisJLnNldF9tY3RybCA9IHRpbWJ1YXJ0X3NldF9tY3RybCwKKwkuZ2V0X21jdHJsID0gdGltYnVhcnRfZ2V0X21jdHJsLAorCS5zdG9wX3R4ID0gdGltYnVhcnRfc3RvcF90eCwKKwkuc3RhcnRfdHggPSB0aW1idWFydF9zdGFydF90eCwKKwkuZmx1c2hfYnVmZmVyID0gdGltYnVhcnRfZmx1c2hfYnVmZmVyLAorCS5zdG9wX3J4ID0gdGltYnVhcnRfc3RvcF9yeCwKKwkuZW5hYmxlX21zID0gdGltYnVhcnRfZW5hYmxlX21zLAorCS5icmVha19jdGwgPSB0aW1idWFydF9icmVha19jdGwsCisJLnN0YXJ0dXAgPSB0aW1idWFydF9zdGFydHVwLAorCS5zaHV0ZG93biA9IHRpbWJ1YXJ0X3NodXRkb3duLAorCS5zZXRfdGVybWlvcyA9IHRpbWJ1YXJ0X3NldF90ZXJtaW9zLAorCS50eXBlID0gdGltYnVhcnRfdHlwZSwKKwkucmVsZWFzZV9wb3J0ID0gdGltYnVhcnRfcmVsZWFzZV9wb3J0LAorCS5yZXF1ZXN0X3BvcnQgPSB0aW1idWFydF9yZXF1ZXN0X3BvcnQsCisJLmNvbmZpZ19wb3J0ID0gdGltYnVhcnRfY29uZmlnX3BvcnQsCisJLnZlcmlmeV9wb3J0ID0gdGltYnVhcnRfdmVyaWZ5X3BvcnQKK307CisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgdGltYnVhcnRfZHJpdmVyID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZSA9ICJ0aW1iZXJkYWxlX3VhcnQiLAorCS5kZXZfbmFtZSA9ICJ0dHlUVSIsCisJLm1ham9yID0gVElNQlVBUlRfTUFKT1IsCisJLm1pbm9yID0gVElNQlVBUlRfTUlOT1IsCisJLm5yID0gMQorfTsKKworc3RhdGljIGludCB0aW1idWFydF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdGltYnVhcnRfcG9ydCAqdWFydDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlvbWVtOworCisJZGV2X2RiZygmZGV2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJdWFydCA9IGt6YWxsb2Moc2l6ZW9mKCp1YXJ0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1YXJ0KSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwl1YXJ0LT51c2VkbWEgPSAwOworCisJdWFydC0+cG9ydC51YXJ0Y2xrID0gMzI1MDAwMCAqIDE2OworCXVhcnQtPnBvcnQuZmlmb3NpemUgID0gVElNQlVBUlRfRklGT19TSVpFOworCXVhcnQtPnBvcnQucmVnc2hpZnQgID0gMjsKKwl1YXJ0LT5wb3J0LmlvdHlwZSAgPSBVUElPX01FTTsKKwl1YXJ0LT5wb3J0Lm9wcyA9ICZ0aW1idWFydF9vcHM7CisJdWFydC0+cG9ydC5pcnEgPSAwOworCXVhcnQtPnBvcnQuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiB8IFVQRl9JT1JFTUFQOworCXVhcnQtPnBvcnQubGluZSAgPSAwOworCXVhcnQtPnBvcnQuZGV2CT0gJmRldi0+ZGV2OworCisJaW9tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFpb21lbSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZWdpc3RlcjsKKwl9CisJdWFydC0+cG9ydC5tYXBiYXNlID0gaW9tZW0tPnN0YXJ0OworCXVhcnQtPnBvcnQubWVtYmFzZSA9IE5VTEw7CisKKwl1YXJ0LT5wb3J0LmlycSA9IHBsYXRmb3JtX2dldF9pcnEoZGV2LCAwKTsKKwlpZiAodWFydC0+cG9ydC5pcnEgPCAwKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlZ2lzdGVyOworCX0KKworCXRhc2tsZXRfaW5pdCgmdWFydC0+dGFza2xldCwgdGltYnVhcnRfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpdWFydCk7CisKKwllcnIgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmdGltYnVhcnRfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZWdpc3RlcjsKKworCWVyciA9IHVhcnRfYWRkX29uZV9wb3J0KCZ0aW1idWFydF9kcml2ZXIsICZ1YXJ0LT5wb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9hZGRfcG9ydDsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgdWFydCk7CisKKwlyZXR1cm4gMDsKKworZXJyX2FkZF9wb3J0OgorCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnRpbWJ1YXJ0X2RyaXZlcik7CitlcnJfcmVnaXN0ZXI6CisJa2ZyZWUodWFydCk7CitlcnJfbWVtOgorCXByaW50ayhLRVJOX0VSUiAidGltYmVyZGFsZTogRmFpbGVkIHRvIHJlZ2lzdGVyIFRpbWJlcmRhbGUgVUFSVDogJWRcbiIsCisJCWVycik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRpbWJ1YXJ0X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRpbWJ1YXJ0X3BvcnQgKnVhcnQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCisJdGFza2xldF9raWxsKCZ1YXJ0LT50YXNrbGV0KTsKKwl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmdGltYnVhcnRfZHJpdmVyLCAmdWFydC0+cG9ydCk7CisJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmdGltYnVhcnRfZHJpdmVyKTsKKwlrZnJlZSh1YXJ0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0aW1idWFydF9wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAidGltYi11YXJ0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gdGltYnVhcnRfcHJvYmUsCisJLnJlbW92ZQkJPSB0aW1idWFydF9yZW1vdmUsCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIGludCBfX2luaXQgdGltYnVhcnRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRpbWJ1YXJ0X3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0aW1idWFydF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRpbWJ1YXJ0X3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRpbWJ1YXJ0X2luaXQpOworbW9kdWxlX2V4aXQodGltYnVhcnRfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVGltYmVyZGFsZSBVQVJUIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0aW1iLXVhcnQiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvdGltYnVhcnQuaCBiL2RyaXZlcnMvc2VyaWFsL3RpbWJ1YXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1NjY3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2VyaWFsL3RpbWJ1YXJ0LmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIHRpbWJ1YXJ0LmMgdGltYmVyZGFsZSBGUEdBIEdQSU8gZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBTdXBwb3J0czoKKyAqIFRpbWJlcmRhbGUgRlBHQSBVQVJUCisgKi8KKworI2lmbmRlZiBfVElNQlVBUlRfSAorI2RlZmluZSBfVElNQlVBUlRfSAorCisjZGVmaW5lIFRJTUJVQVJUX0ZJRk9fU0laRQkyMDQ4CisKKyNkZWZpbmUgVElNQlVBUlRfUlhGSUZPCQkweDA4CisjZGVmaW5lIFRJTUJVQVJUX1RYRklGTwkJMHgwYworI2RlZmluZSBUSU1CVUFSVF9JRVIJCTB4MTAKKyNkZWZpbmUgVElNQlVBUlRfSVBSCQkweDE0CisjZGVmaW5lIFRJTUJVQVJUX0lTUgkJMHgxOAorI2RlZmluZSBUSU1CVUFSVF9DVFJMCQkweDFjCisjZGVmaW5lIFRJTUJVQVJUX0JBVURSQVRFCTB4MjAKKworI2RlZmluZSBUSU1CVUFSVF9DVFJMX1JUUwkweDAxCisjZGVmaW5lIFRJTUJVQVJUX0NUUkxfQ1RTCTB4MDIKKyNkZWZpbmUgVElNQlVBUlRfQ1RSTF9GTFNIVFgJMHg0MAorI2RlZmluZSBUSU1CVUFSVF9DVFJMX0ZMU0hSWAkweDgwCisKKyNkZWZpbmUgVFhCRgkJMHgwMQorI2RlZmluZSBUWEJBRQkJMHgwMgorI2RlZmluZSBDVFNfREVMVEEJMHgwNAorI2RlZmluZSBSWERQCQkweDA4CisjZGVmaW5lIFJYQkFGCQkweDEwCisjZGVmaW5lIFJYQkYJCTB4MjAKKyNkZWZpbmUgUlhUVAkJMHg0MAorI2RlZmluZSBSWEJOQUUJCTB4ODAKKyNkZWZpbmUgVFhCRQkJMHgxMDAKKworI2RlZmluZSBSWEZMQUdTIChSWERQIHwgUlhCQUYgfCBSWEJGIHwgUlhUVCB8IFJYQk5BRSkKKyNkZWZpbmUgVFhGTEFHUyAoVFhCRiB8IFRYQkFFKQorCisjZGVmaW5lIFRJTUJVQVJUX01BSk9SIDIwNAorI2RlZmluZSBUSU1CVUFSVF9NSU5PUiAxOTIKKworI2VuZGlmIC8qIF9USU1CVUFSVF9IICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvaW50Yy5jIGIvZHJpdmVycy9zaC9pbnRjLmMKaW5kZXggMTJkMTNkOS4uZDY4N2E5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zaC9pbnRjLmMKKysrIGIvZHJpdmVycy9zaC9pbnRjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zaF9pbnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5Lmg+CiAKICNkZWZpbmUgX0lOVENfTUsoZm4sIG1vZGUsIGFkZHJfZSwgYWRkcl9kLCB3aWR0aCwgc2hpZnQpIFwKIAkoKHNoaWZ0KSB8ICgod2lkdGgpIDw8IDUpIHwgKChmbikgPDwgOSkgfCAoKG1vZGUpIDw8IDEzKSB8IFwKQEAgLTc3MCwxMSArNzcxLDE5IEBACiAJLyogcmVnaXN0ZXIgdGhlIHZlY3RvcnMgb25lIGJ5IG9uZSAqLwogCWZvciAoaSA9IDA7IGkgPCBkZXNjLT5ucl92ZWN0b3JzOyBpKyspIHsKIAkJc3RydWN0IGludGNfdmVjdCAqdmVjdCA9IGRlc2MtPnZlY3RvcnMgKyBpOworCQl1bnNpZ25lZCBpbnQgaXJxID0gZXZ0MmlycSh2ZWN0LT52ZWN0KTsKKwkJc3RydWN0IGlycV9kZXNjICppcnFfZGVzYzsKIAogCQlpZiAoIXZlY3QtPmVudW1faWQpCiAJCQljb250aW51ZTsKIAotCQlpbnRjX3JlZ2lzdGVyX2lycShkZXNjLCBkLCB2ZWN0LT5lbnVtX2lkLCBldnQyaXJxKHZlY3QtPnZlY3QpKTsKKwkJaXJxX2Rlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKGlycSwgbnVtYV9ub2RlX2lkKCkpOworCQlpZiAodW5saWtlbHkoIWlycV9kZXNjKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiY2FuIG5vdCBnZXQgaXJxX2Rlc2MgZm9yICVkXG4iLCBpcnEpOworCQkJY29udGludWU7CisJCX0KKworCQlpbnRjX3JlZ2lzdGVyX2lycShkZXNjLCBkLCB2ZWN0LT5lbnVtX2lkLCBpcnEpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCmluZGV4IDdhMTE2NGQuLmRkZWI2OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYworKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKQEAgLTE2LDcgKzE2LDggQEAKICAqCXYwLjkgIC0gdGhvcm91Z2ggY2xlYW5pbmcsIFVSQmlmaWNhdGlvbiwgYWxtb3N0IGEgcmV3cml0ZQogICoJdjAuMTAgLSBzb21lIG1vcmUgY2xlYW51cHMKICAqCXYwLjExIC0gZml4ZWQgZmxvdyBjb250cm9sLCByZWFkIGVycm9yIGRvZXNuJ3Qgc3RvcCByZWFkcwotICoJdjAuMTIgLSBhZGRlZCBUSU9DTSBpb2N0bHMsIGFkZGVkIGJyZWFrIGhhbmRsaW5nLCBtYWRlIHN0cnVjdCBhY20ga21hbGxvY2VkCisgKgl2MC4xMiAtIGFkZGVkIFRJT0NNIGlvY3RscywgYWRkZWQgYnJlYWsgaGFuZGxpbmcsIG1hZGUgc3RydWN0IGFjbQorICoJCWttYWxsb2NlZAogICoJdjAuMTMgLSBhZGRlZCB0ZXJtaW9zLCBhZGRlZCBoYW5ndXAKICAqCXYwLjE0IC0gc2l6ZWQgZG93biBzdHJ1Y3QgYWNtCiAgKgl2MC4xNSAtIGZpeGVkIGZsb3cgY29udHJvbCBhZ2FpbiAtIGNoYXJhY3RlcnMgY291bGQgYmUgbG9zdApAQCAtNjIsNyArNjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2RjLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgpAQCAtODcsNyArODgsMTAgQEAKIAogc3RhdGljIERFRklORV9NVVRFWChvcGVuX211dGV4KTsKIAotI2RlZmluZSBBQ01fUkVBRFkoYWNtKQkoYWNtICYmIGFjbS0+ZGV2ICYmIGFjbS0+dXNlZCkKKyNkZWZpbmUgQUNNX1JFQURZKGFjbSkJKGFjbSAmJiBhY20tPmRldiAmJiBhY20tPnBvcnQuY291bnQpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBhY21fcG9ydF9vcHMgPSB7Cit9OwogCiAjaWZkZWYgVkVSQk9TRV9ERUJVRwogI2RlZmluZSB2ZXJib3NlCTEKQEAgLTk5LDEzICsxMDMsMTUgQEAKICAqIEZ1bmN0aW9ucyBmb3IgQUNNIGNvbnRyb2wgbWVzc2FnZXMuCiAgKi8KIAotc3RhdGljIGludCBhY21fY3RybF9tc2coc3RydWN0IGFjbSAqYWNtLCBpbnQgcmVxdWVzdCwgaW50IHZhbHVlLCB2b2lkICpidWYsIGludCBsZW4pCitzdGF0aWMgaW50IGFjbV9jdHJsX21zZyhzdHJ1Y3QgYWNtICphY20sIGludCByZXF1ZXN0LCBpbnQgdmFsdWUsCisJCQkJCQkJdm9pZCAqYnVmLCBpbnQgbGVuKQogewogCWludCByZXR2YWwgPSB1c2JfY29udHJvbF9tc2coYWNtLT5kZXYsIHVzYl9zbmRjdHJscGlwZShhY20tPmRldiwgMCksCiAJCXJlcXVlc3QsIFVTQl9SVF9BQ00sIHZhbHVlLAogCQlhY20tPmNvbnRyb2wtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLAogCQlidWYsIGxlbiwgNTAwMCk7Ci0JZGJnKCJhY21fY29udHJvbF9tc2c6IHJxOiAweCUwMnggdmFsOiAlI3ggbGVuOiAlI3ggcmVzdWx0OiAlZCIsIHJlcXVlc3QsIHZhbHVlLCBsZW4sIHJldHZhbCk7CisJZGJnKCJhY21fY29udHJvbF9tc2c6IHJxOiAweCUwMnggdmFsOiAlI3ggbGVuOiAlI3ggcmVzdWx0OiAlZCIsCisJCQkJCQlyZXF1ZXN0LCB2YWx1ZSwgbGVuLCByZXR2YWwpOwogCXJldHVybiByZXR2YWwgPCAwID8gcmV0dmFsIDogMDsKIH0KIApAQCAtMTUwLDkgKzE1Niw4IEBACiAKIAluID0gQUNNX05XOwogCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPndyaXRlX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspCiAJCW4gLT0gYWNtLT53YltpXS51c2U7Ci0JfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwogCXJldHVybiBuOwogfQpAQCAtMTgzLDcgKzE4OCw4IEBACiAJd2ItPnVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHdiLT5sZW47CiAJd2ItPnVyYi0+ZGV2ID0gYWNtLT5kZXY7CiAKLQlpZiAoKHJjID0gdXNiX3N1Ym1pdF91cmIod2ItPnVyYiwgR0ZQX0FUT01JQykpIDwgMCkgeworCXJjID0gdXNiX3N1Ym1pdF91cmIod2ItPnVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJjIDwgMCkgewogCQlkYmcoInVzYl9zdWJtaXRfdXJiKHdyaXRlIGJ1bGspIGZhaWxlZDogJWQiLCByYyk7CiAJCWFjbV93cml0ZV9kb25lKGFjbSwgd2IpOwogCX0KQEAgLTI2Miw2ICsyNjgsNyBAQAogewogCXN0cnVjdCBhY20gKmFjbSA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24gKmRyID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCWludCBuZXdjdHJsOwogCWludCByZXR2YWw7CkBAIC0yODcsNDAgKzI5NCw0NSBAQAogCiAJZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopKGRyICsgMSk7CiAJc3dpdGNoIChkci0+Yk5vdGlmaWNhdGlvblR5cGUpIHsKKwljYXNlIFVTQl9DRENfTk9USUZZX05FVFdPUktfQ09OTkVDVElPTjoKKwkJZGJnKCIlcyBuZXR3b3JrIiwgZHItPndWYWx1ZSA/CisJCQkJCSJjb25uZWN0ZWQgdG8iIDogImRpc2Nvbm5lY3RlZCBmcm9tIik7CisJCWJyZWFrOwogCi0JCWNhc2UgVVNCX0NEQ19OT1RJRllfTkVUV09SS19DT05ORUNUSU9OOgorCWNhc2UgVVNCX0NEQ19OT1RJRllfU0VSSUFMX1NUQVRFOgorCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZhY20tPnBvcnQpOworCQluZXdjdHJsID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGRhdGEpOwogCi0JCQlkYmcoIiVzIG5ldHdvcmsiLCBkci0+d1ZhbHVlID8gImNvbm5lY3RlZCB0byIgOiAiZGlzY29ubmVjdGVkIGZyb20iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgVVNCX0NEQ19OT1RJRllfU0VSSUFMX1NUQVRFOgotCi0JCQluZXdjdHJsID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGRhdGEpOwotCi0JCQlpZiAoYWNtLT50dHkgJiYgIWFjbS0+Y2xvY2FsICYmIChhY20tPmN0cmxpbiAmIH5uZXdjdHJsICYgQUNNX0NUUkxfRENEKSkgeworCQlpZiAodHR5KSB7CisJCQlpZiAoIWFjbS0+Y2xvY2FsICYmCisJCQkJKGFjbS0+Y3RybGluICYgfm5ld2N0cmwgJiBBQ01fQ1RSTF9EQ0QpKSB7CiAJCQkJZGJnKCJjYWxsaW5nIGhhbmd1cCIpOwotCQkJCXR0eV9oYW5ndXAoYWNtLT50dHkpOworCQkJCXR0eV9oYW5ndXAodHR5KTsKIAkJCX0KKwkJCXR0eV9rcmVmX3B1dCh0dHkpOworCQl9CiAKLQkJCWFjbS0+Y3RybGluID0gbmV3Y3RybDsKKwkJYWNtLT5jdHJsaW4gPSBuZXdjdHJsOwogCi0JCQlkYmcoImlucHV0IGNvbnRyb2wgbGluZXM6IGRjZCVjIGRzciVjIGJyZWFrJWMgcmluZyVjIGZyYW1pbmclYyBwYXJpdHklYyBvdmVycnVuJWMiLAotCQkJCWFjbS0+Y3RybGluICYgQUNNX0NUUkxfRENEID8gJysnIDogJy0nLAlhY20tPmN0cmxpbiAmIEFDTV9DVFJMX0RTUiA/ICcrJyA6ICctJywKLQkJCQlhY20tPmN0cmxpbiAmIEFDTV9DVFJMX0JSSyA/ICcrJyA6ICctJywJYWNtLT5jdHJsaW4gJiBBQ01fQ1RSTF9SSSAgPyAnKycgOiAnLScsCi0JCQkJYWNtLT5jdHJsaW4gJiBBQ01fQ1RSTF9GUkFNSU5HID8gJysnIDogJy0nLAlhY20tPmN0cmxpbiAmIEFDTV9DVFJMX1BBUklUWSA/ICcrJyA6ICctJywKLQkJCQlhY20tPmN0cmxpbiAmIEFDTV9DVFJMX09WRVJSVU4gPyAnKycgOiAnLScpOwotCisJCWRiZygiaW5wdXQgY29udHJvbCBsaW5lczogZGNkJWMgZHNyJWMgYnJlYWslYyByaW5nJWMgZnJhbWluZyVjIHBhcml0eSVjIG92ZXJydW4lYyIsCisJCQlhY20tPmN0cmxpbiAmIEFDTV9DVFJMX0RDRCA/ICcrJyA6ICctJywKKwkJCWFjbS0+Y3RybGluICYgQUNNX0NUUkxfRFNSID8gJysnIDogJy0nLAorCQkJYWNtLT5jdHJsaW4gJiBBQ01fQ1RSTF9CUksgPyAnKycgOiAnLScsCisJCQlhY20tPmN0cmxpbiAmIEFDTV9DVFJMX1JJICA/ICcrJyA6ICctJywKKwkJCWFjbS0+Y3RybGluICYgQUNNX0NUUkxfRlJBTUlORyA/ICcrJyA6ICctJywKKwkJCWFjbS0+Y3RybGluICYgQUNNX0NUUkxfUEFSSVRZID8gJysnIDogJy0nLAorCQkJYWNtLT5jdHJsaW4gJiBBQ01fQ1RSTF9PVkVSUlVOID8gJysnIDogJy0nKTsKIAkJCWJyZWFrOwogCi0JCWRlZmF1bHQ6Ci0JCQlkYmcoInVua25vd24gbm90aWZpY2F0aW9uICVkIHJlY2VpdmVkOiBpbmRleCAlZCBsZW4gJWQgZGF0YTAgJWQgZGF0YTEgJWQiLAotCQkJCWRyLT5iTm90aWZpY2F0aW9uVHlwZSwgZHItPndJbmRleCwKLQkJCQlkci0+d0xlbmd0aCwgZGF0YVswXSwgZGF0YVsxXSk7Ci0JCQlicmVhazsKKwlkZWZhdWx0OgorCQlkYmcoInVua25vd24gbm90aWZpY2F0aW9uICVkIHJlY2VpdmVkOiBpbmRleCAlZCBsZW4gJWQgZGF0YTAgJWQgZGF0YTEgJWQiLAorCQkJZHItPmJOb3RpZmljYXRpb25UeXBlLCBkci0+d0luZGV4LAorCQkJZHItPndMZW5ndGgsIGRhdGFbMF0sIGRhdGFbMV0pOworCQlicmVhazsKIAl9CiBleGl0OgogCXVzYl9tYXJrX2xhc3RfYnVzeShhY20tPmRldik7Ci0JcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CisJcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0dmFsKQogCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCAiCiAJCQkicmVzdWx0ICVkIiwgX19mdW5jX18sIHJldHZhbCk7CkBAIC0zNzEsMTUgKzM4MywxNCBAQAogewogCXN0cnVjdCBhY20gKmFjbSA9ICh2b2lkICopX2FjbTsKIAlzdHJ1Y3QgYWNtX3JiICpidWY7Ci0Jc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGFjbS0+dHR5OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAJc3RydWN0IGFjbV9ydSAqcmN2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgY2hhciB0aHJvdHRsZWQ7CiAKIAlkYmcoIkVudGVyaW5nIGFjbV9yeF90YXNrbGV0Iik7CiAKLQlpZiAoIUFDTV9SRUFEWShhY20pKQotCXsKKwlpZiAoIUFDTV9SRUFEWShhY20pKSB7CiAJCWRiZygiYWNtX3J4X3Rhc2tsZXQ6IEFDTSBub3QgcmVhZHkiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM4NywxMiArMzk4LDEzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+dGhyb3R0bGVfbG9jaywgZmxhZ3MpOwogCXRocm90dGxlZCA9IGFjbS0+dGhyb3R0bGU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT50aHJvdHRsZV9sb2NrLCBmbGFncyk7Ci0JaWYgKHRocm90dGxlZCkKLQl7CisJaWYgKHRocm90dGxlZCkgewogCQlkYmcoImFjbV9yeF90YXNrbGV0OiB0aHJvdHRsZWQiKTsKIAkJcmV0dXJuOwogCX0KIAorCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJmFjbS0+cG9ydCk7CisKIG5leHRfYnVmZmVyOgogCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPnJlYWRfbG9jaywgZmxhZ3MpOwogCWlmIChsaXN0X2VtcHR5KCZhY20tPmZpbGxlZF9yZWFkX2J1ZnMpKSB7CkBAIC00MDYsMjAgKzQxOCwyMiBAQAogCiAJZGJnKCJhY21fcnhfdGFza2xldDogcHJvY2VzaW5nIGJ1ZiAweCVwLCBzaXplID0gJWQiLCBidWYsIGJ1Zi0+c2l6ZSk7CiAKLQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGJ1Zi0+c2l6ZSk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+dGhyb3R0bGVfbG9jaywgZmxhZ3MpOwotCXRocm90dGxlZCA9IGFjbS0+dGhyb3R0bGU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT50aHJvdHRsZV9sb2NrLCBmbGFncyk7Ci0JaWYgKCF0aHJvdHRsZWQpCi0JCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcodHR5LCBidWYtPmJhc2UsIGJ1Zi0+c2l6ZSk7Ci0JdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKLQotCWlmICh0aHJvdHRsZWQpIHsKLQkJZGJnKCJUaHJvdHRsaW5nIG5vdGljZWQiKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkKCZidWYtPmxpc3QsICZhY20tPmZpbGxlZF9yZWFkX2J1ZnMpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhY20tPnJlYWRfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47CisJaWYgKHR0eSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT50aHJvdHRsZV9sb2NrLCBmbGFncyk7CisJCXRocm90dGxlZCA9IGFjbS0+dGhyb3R0bGU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+dGhyb3R0bGVfbG9jaywgZmxhZ3MpOworCQlpZiAoIXRocm90dGxlZCkgeworCQkJdHR5X2J1ZmZlcl9yZXF1ZXN0X3Jvb20odHR5LCBidWYtPnNpemUpOworCQkJdHR5X2luc2VydF9mbGlwX3N0cmluZyh0dHksIGJ1Zi0+YmFzZSwgYnVmLT5zaXplKTsKKwkJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisJCX0gZWxzZSB7CisJCQl0dHlfa3JlZl9wdXQodHR5KTsKKwkJCWRiZygiVGhyb3R0bGluZyBub3RpY2VkIik7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCWxpc3RfYWRkKCZidWYtPmxpc3QsICZhY20tPmZpbGxlZF9yZWFkX2J1ZnMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT5yZWFkX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPnJlYWRfbG9jaywgZmxhZ3MpOwpAQCAtNDI4LDYgKzQ0Miw4IEBACiAJZ290byBuZXh0X2J1ZmZlcjsKIAogdXJiczoKKwl0dHlfa3JlZl9wdXQodHR5KTsKKwogCXdoaWxlICghbGlzdF9lbXB0eSgmYWNtLT5zcGFyZV9yZWFkX2J1ZnMpKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZhY20tPnJlYWRfbG9jaywgZmxhZ3MpOwogCQlpZiAobGlzdF9lbXB0eSgmYWNtLT5zcGFyZV9yZWFkX3VyYnMpKSB7CkBAIC00NTQsMTAgKzQ3MCwxMSBAQAogCQlyY3YtPnVyYi0+dHJhbnNmZXJfZG1hID0gYnVmLT5kbWE7CiAJCXJjdi0+dXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKIAotCQkvKiBUaGlzIHNob3VsZG4ndCBraWxsIHRoZSBkcml2ZXIgYXMgdW5zdWNjZXNzZnVsIFVSQnMgYXJlIHJldHVybmVkIHRvIHRoZQotCQkgICBmcmVlLXVyYnMtcG9vbCBhbmQgcmVzdWJtaXRlZCBBU0FQICovCisJCS8qIFRoaXMgc2hvdWxkbid0IGtpbGwgdGhlIGRyaXZlciBhcyB1bnN1Y2Nlc3NmdWwgVVJCcyBhcmUKKwkJICAgcmV0dXJuZWQgdG8gdGhlIGZyZWUtdXJicy1wb29sIGFuZCByZXN1Ym1pdGVkIEFTQVAgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7Ci0JCWlmIChhY20tPnN1c3BfY291bnQgfHwgdXNiX3N1Ym1pdF91cmIocmN2LT51cmIsIEdGUF9BVE9NSUMpIDwgMCkgeworCQlpZiAoYWNtLT5zdXNwX2NvdW50IHx8CisJCQkJdXNiX3N1Ym1pdF91cmIocmN2LT51cmIsIEdGUF9BVE9NSUMpIDwgMCkgewogCQkJbGlzdF9hZGQoJmJ1Zi0+bGlzdCwgJmFjbS0+c3BhcmVfcmVhZF9idWZzKTsKIAkJCWxpc3RfYWRkKCZyY3YtPmxpc3QsICZhY20tPnNwYXJlX3JlYWRfdXJicyk7CiAJCQlhY20tPnByb2Nlc3NpbmcgPSAwOwpAQCAtNDk5LDExICs1MTYsMTQgQEAKIHN0YXRpYyB2b2lkIGFjbV9zb2Z0aW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGFjbSwgd29yayk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgInR4IHdvcmtcbiIpOwogCWlmICghQUNNX1JFQURZKGFjbSkpCiAJCXJldHVybjsKLQl0dHlfd2FrZXVwKGFjbS0+dHR5KTsKKwl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZhY20tPnBvcnQpOworCXR0eV93YWtldXAodHR5KTsKKwl0dHlfa3JlZl9wdXQodHR5KTsKIH0KIAogc3RhdGljIHZvaWQgYWNtX3dha2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd2FrZXIpCkBAIC01NDMsOCArNTYzLDkgQEAKIAkJcnYgPSAwOwogCiAJc2V0X2JpdChUVFlfTk9fV1JJVEVfU1BMSVQsICZ0dHktPmZsYWdzKTsKKwogCXR0eS0+ZHJpdmVyX2RhdGEgPSBhY207Ci0JYWNtLT50dHkgPSB0dHk7CisJdHR5X3BvcnRfdHR5X3NldCgmYWNtLT5wb3J0LCB0dHkpOwogCiAJaWYgKHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShhY20tPmNvbnRyb2wpIDwgMCkKIAkJZ290byBlYXJseV9iYWlsOwpAQCAtNTUyLDExICs1NzMsMTAgQEAKIAkJYWNtLT5jb250cm9sLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMTsKIAogCW11dGV4X2xvY2soJmFjbS0+bXV0ZXgpOwotCWlmIChhY20tPnVzZWQrKykgeworCWlmIChhY20tPnBvcnQuY291bnQrKykgewogCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoYWNtLT5jb250cm9sKTsKIAkJZ290byBkb25lOwotICAgICAgICB9Ci0KKwl9CiAKIAlhY20tPmN0cmx1cmItPmRldiA9IGFjbS0+ZGV2OwogCWlmICh1c2Jfc3VibWl0X3VyYihhY20tPmN0cmx1cmIsIEdGUF9LRVJORUwpKSB7CkBAIC01NjcsMjIgKzU4NywyMiBAQAogCWlmICgwID4gYWNtX3NldF9jb250cm9sKGFjbSwgYWNtLT5jdHJsb3V0ID0gQUNNX0NUUkxfRFRSIHwgQUNNX0NUUkxfUlRTKSAmJgogCSAgICAoYWNtLT5jdHJsX2NhcHMgJiBVU0JfQ0RDX0NBUF9MSU5FKSkKIAkJZ290byBmdWxsX2JhaWxvdXQ7CisKIAl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoYWNtLT5jb250cm9sKTsKIAogCUlOSVRfTElTVF9IRUFEKCZhY20tPnNwYXJlX3JlYWRfdXJicyk7CiAJSU5JVF9MSVNUX0hFQUQoJmFjbS0+c3BhcmVfcmVhZF9idWZzKTsKIAlJTklUX0xJU1RfSEVBRCgmYWNtLT5maWxsZWRfcmVhZF9idWZzKTsKLQlmb3IgKGkgPSAwOyBpIDwgYWNtLT5yeF9idWZsaW1pdDsgaSsrKSB7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWNtLT5yeF9idWZsaW1pdDsgaSsrKQogCQlsaXN0X2FkZCgmKGFjbS0+cnVbaV0ubGlzdCksICZhY20tPnNwYXJlX3JlYWRfdXJicyk7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBhY20tPnJ4X2J1ZmxpbWl0OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgYWNtLT5yeF9idWZsaW1pdDsgaSsrKQogCQlsaXN0X2FkZCgmKGFjbS0+cmJbaV0ubGlzdCksICZhY20tPnNwYXJlX3JlYWRfYnVmcyk7Ci0JfQogCiAJYWNtLT50aHJvdHRsZSA9IDA7CiAKIAl0YXNrbGV0X3NjaGVkdWxlKCZhY20tPnVyYl90YXNrKTsKLQorCXJ2ID0gdHR5X3BvcnRfYmxvY2tfdGlsX3JlYWR5KCZhY20tPnBvcnQsIHR0eSwgZmlscCk7CiBkb25lOgogCW11dGV4X3VubG9jaygmYWNtLT5tdXRleCk7CiBlcnJfb3V0OgpAQCAtNTkzLDE2ICs2MTMsMTcgQEAKIAl1c2Jfa2lsbF91cmIoYWNtLT5jdHJsdXJiKTsKIGJhaWxfb3V0OgogCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShhY20tPmNvbnRyb2wpOwotCWFjbS0+dXNlZC0tOworCWFjbS0+cG9ydC5jb3VudC0tOwogCW11dGV4X3VubG9jaygmYWNtLT5tdXRleCk7CiBlYXJseV9iYWlsOgogCW11dGV4X3VubG9jaygmb3Blbl9tdXRleCk7CisJdHR5X3BvcnRfdHR5X3NldCgmYWNtLT5wb3J0LCBOVUxMKTsKIAlyZXR1cm4gLUVJTzsKIH0KIAogc3RhdGljIHZvaWQgYWNtX3R0eV91bnJlZ2lzdGVyKHN0cnVjdCBhY20gKmFjbSkKIHsKLQlpbnQgaSxucjsKKwlpbnQgaSwgbnI7CiAKIAluciA9IGFjbS0+cnhfYnVmbGltaXQ7CiAJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGFjbV90dHlfZHJpdmVyLCBhY20tPm1pbm9yKTsKQEAgLTYxOSw0MSArNjQwLDU2IEBACiAKIHN0YXRpYyBpbnQgYWNtX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAKLXN0YXRpYyB2b2lkIGFjbV90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBhY21fcG9ydF9kb3duKHN0cnVjdCBhY20gKmFjbSwgaW50IGRyYWluKQogewotCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7Ci0JaW50IGksbnI7Ci0KLQlpZiAoIWFjbSB8fCAhYWNtLT51c2VkKQotCQlyZXR1cm47Ci0KLQluciA9IGFjbS0+cnhfYnVmbGltaXQ7CisJaW50IGksIG5yID0gYWNtLT5yeF9idWZsaW1pdDsKIAltdXRleF9sb2NrKCZvcGVuX211dGV4KTsKLQlpZiAoIS0tYWNtLT51c2VkKSB7Ci0JCWlmIChhY20tPmRldikgewotCQkJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGFjbS0+Y29udHJvbCk7Ci0JCQlhY21fc2V0X2NvbnRyb2woYWNtLCBhY20tPmN0cmxvdXQgPSAwKTsKLQotCQkJLyogdHJ5IGxldHRpbmcgdGhlIGxhc3Qgd3JpdGVzIGRyYWluIG5hdHVyYWxseSAqLworCWlmIChhY20tPmRldikgeworCQl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoYWNtLT5jb250cm9sKTsKKwkJYWNtX3NldF9jb250cm9sKGFjbSwgYWNtLT5jdHJsb3V0ID0gMCk7CisJCS8qIHRyeSBsZXR0aW5nIHRoZSBsYXN0IHdyaXRlcyBkcmFpbiBuYXR1cmFsbHkgKi8KKwkJaWYgKGRyYWluKSB7CiAJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhY20tPmRyYWluX3dhaXQsCi0JCQkJCShBQ01fTlcgPT0gYWNtX3diX2lzX2F2YWlsKGFjbSkpCi0JCQkJCQl8fCAhYWNtLT5kZXYsCisJCQkJKEFDTV9OVyA9PSBhY21fd2JfaXNfYXZhaWwoYWNtKSkgfHwgIWFjbS0+ZGV2LAogCQkJCQlBQ01fQ0xPU0VfVElNRU9VVCAqIEhaKTsKLQotCQkJdXNiX2tpbGxfdXJiKGFjbS0+Y3RybHVyYik7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspCi0JCQkJdXNiX2tpbGxfdXJiKGFjbS0+d2JbaV0udXJiKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQotCQkJCXVzYl9raWxsX3VyYihhY20tPnJ1W2ldLnVyYik7Ci0JCQlhY20tPmNvbnRyb2wtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOwotCQkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGFjbS0+Y29udHJvbCk7Ci0JCX0gZWxzZQotCQkJYWNtX3R0eV91bnJlZ2lzdGVyKGFjbSk7CisJCX0KKwkJdXNiX2tpbGxfdXJiKGFjbS0+Y3RybHVyYik7CisJCWZvciAoaSA9IDA7IGkgPCBBQ01fTlc7IGkrKykKKwkJCXVzYl9raWxsX3VyYihhY20tPndiW2ldLnVyYik7CisJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKQorCQkJdXNiX2tpbGxfdXJiKGFjbS0+cnVbaV0udXJiKTsKKwkJYWNtLT5jb250cm9sLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMDsKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGFjbS0+Y29udHJvbCk7CiAJfQogCW11dGV4X3VubG9jaygmb3Blbl9tdXRleCk7CiB9CiAKLXN0YXRpYyBpbnQgYWNtX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIGFjbV90dHlfaGFuZ3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKKwl0dHlfcG9ydF9oYW5ndXAoJmFjbS0+cG9ydCk7CisJYWNtX3BvcnRfZG93bihhY20sIDApOworfQorCitzdGF0aWMgdm9pZCBhY21fdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwkvKiBQZXJmb3JtIHRoZSBjbG9zaW5nIHByb2Nlc3MgYW5kIHNlZSBpZiB3ZSBuZWVkIHRvIGRvIHRoZSBoYXJkd2FyZQorCSAgIHNodXRkb3duICovCisJaWYgKHR0eV9wb3J0X2Nsb3NlX3N0YXJ0KCZhY20tPnBvcnQsIHR0eSwgZmlscCkgPT0gMCkKKwkJcmV0dXJuOworCWFjbV9wb3J0X2Rvd24oYWNtLCAwKTsKKwl0dHlfcG9ydF9jbG9zZV9lbmQoJmFjbS0+cG9ydCwgdHR5KTsKKwltdXRleF9sb2NrKCZvcGVuX211dGV4KTsKKwl0dHlfcG9ydF90dHlfc2V0KCZhY20tPnBvcnQsIE5VTEwpOworCWlmICghYWNtLT5kZXYpCisJCWFjbV90dHlfdW5yZWdpc3RlcihhY20pOworCW11dGV4X3VubG9jaygmb3Blbl9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgYWNtX3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgYWNtICphY20gPSB0dHktPmRyaXZlcl9kYXRhOwogCWludCBzdGF0OwpAQCAtNjY5LDcgKzcwNSw4IEBACiAJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwotCWlmICgod2JuID0gYWNtX3diX2FsbG9jKGFjbSkpIDwgMCkgeworCXdibiA9IGFjbV93Yl9hbGxvYyhhY20pOworCWlmICh3Ym4gPCAwKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFjbS0+d3JpdGVfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC02ODEsNyArNzE4LDggQEAKIAl3Yi0+bGVuID0gY291bnQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CiAKLQlpZiAoKHN0YXQgPSBhY21fd3JpdGVfc3RhcnQoYWNtLCB3Ym4pKSA8IDApCisJc3RhdCA9IGFjbV93cml0ZV9zdGFydChhY20sIHdibik7CisJaWYgKHN0YXQgPCAwKQogCQlyZXR1cm4gc3RhdDsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC03NjcsOCArODA1LDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJbmV3Y3RybCA9IGFjbS0+Y3RybG91dDsKLQlzZXQgPSAoc2V0ICYgVElPQ01fRFRSID8gQUNNX0NUUkxfRFRSIDogMCkgfCAoc2V0ICYgVElPQ01fUlRTID8gQUNNX0NUUkxfUlRTIDogMCk7Ci0JY2xlYXIgPSAoY2xlYXIgJiBUSU9DTV9EVFIgPyBBQ01fQ1RSTF9EVFIgOiAwKSB8IChjbGVhciAmIFRJT0NNX1JUUyA/IEFDTV9DVFJMX1JUUyA6IDApOworCXNldCA9IChzZXQgJiBUSU9DTV9EVFIgPyBBQ01fQ1RSTF9EVFIgOiAwKSB8CisJCQkJCShzZXQgJiBUSU9DTV9SVFMgPyBBQ01fQ1RSTF9SVFMgOiAwKTsKKwljbGVhciA9IChjbGVhciAmIFRJT0NNX0RUUiA/IEFDTV9DVFJMX0RUUiA6IDApIHwKKwkJCQkJKGNsZWFyICYgVElPQ01fUlRTID8gQUNNX0NUUkxfUlRTIDogMCk7CiAKIAluZXdjdHJsID0gKG5ld2N0cmwgJiB+Y2xlYXIpIHwgc2V0OwogCkBAIC03NzcsNyArODE3LDggQEAKIAlyZXR1cm4gYWNtX3NldF9jb250cm9sKGFjbSwgYWNtLT5jdHJsb3V0ID0gbmV3Y3RybCk7CiB9CiAKLXN0YXRpYyBpbnQgYWNtX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGFjbV90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCXN0cnVjdCBhY20gKmFjbSA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKQEAgLTc5OSw3ICs4NDAsOCBAQAogCTUsIDYsIDcsIDgKIH07CiAKLXN0YXRpYyB2b2lkIGFjbV90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zX29sZCkKK3N0YXRpYyB2b2lkIGFjbV90dHlfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJCQkJCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvc19vbGQpCiB7CiAJc3RydWN0IGFjbSAqYWNtID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3Qga3Rlcm1pb3MgKnRlcm1pb3MgPSB0dHktPnRlcm1pb3M7CkBAIC04MDksMTkgKzg1MSwyMyBAQAogCWlmICghQUNNX1JFQURZKGFjbSkpCiAJCXJldHVybjsKIAorCS8qIEZJWE1FOiBOZWVkcyB0byBzdXBwb3J0IHRoZSB0dHlfYmF1ZCBpbnRlcmZhY2UgKi8KKwkvKiBGSVhNRTogQnJva2VuIG9uIHNwYXJjICovCiAJbmV3bGluZS5kd0RURVJhdGUgPSBjcHVfdG9fbGUzMnAoYWNtX3R0eV9zcGVlZCArCiAJCSh0ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQgJiB+Q0JBVURFWCkgKyAodGVybWlvcy0+Y19jZmxhZyAmIENCQVVERVggPyAxNSA6IDApKTsKIAluZXdsaW5lLmJDaGFyRm9ybWF0ID0gdGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQiA/IDIgOiAwOwogCW5ld2xpbmUuYlBhcml0eVR5cGUgPSB0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CID8KLQkJKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQgPyAxIDogMikgKyAodGVybWlvcy0+Y19jZmxhZyAmIENNU1BBUiA/IDIgOiAwKSA6IDA7CisJCQkJKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQgPyAxIDogMikgKworCQkJCSh0ZXJtaW9zLT5jX2NmbGFnICYgQ01TUEFSID8gMiA6IDApIDogMDsKIAluZXdsaW5lLmJEYXRhQml0cyA9IGFjbV90dHlfc2l6ZVsodGVybWlvcy0+Y19jZmxhZyAmIENTSVpFKSA+PiA0XTsKLQorCS8qIEZJWE1FOiBOZWVkcyB0byBjbGVhciB1bnN1cHBvcnRlZCBiaXRzIGluIHRoZSB0ZXJtaW9zICovCiAJYWNtLT5jbG9jYWwgPSAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDTE9DQUwpICE9IDApOwogCiAJaWYgKCFuZXdsaW5lLmR3RFRFUmF0ZSkgewogCQluZXdsaW5lLmR3RFRFUmF0ZSA9IGFjbS0+bGluZS5kd0RURVJhdGU7CiAJCW5ld2N0cmwgJj0gfkFDTV9DVFJMX0RUUjsKLQl9IGVsc2UgIG5ld2N0cmwgfD0gIEFDTV9DVFJMX0RUUjsKKwl9IGVsc2UKKwkJbmV3Y3RybCB8PSAgQUNNX0NUUkxfRFRSOwogCiAJaWYgKG5ld2N0cmwgIT0gYWNtLT5jdHJsb3V0KQogCQlhY21fc2V0X2NvbnRyb2woYWNtLCBhY20tPmN0cmxvdXQgPSBuZXdjdHJsKTsKQEAgLTg0Niw5ICs4OTIsOCBAQAogCXN0cnVjdCBhY21fd2IgKndiOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihhY20tPmNvbnRyb2wpOwogCi0JZm9yICh3YiA9ICZhY20tPndiWzBdLCBpID0gMDsgaSA8IEFDTV9OVzsgaSsrLCB3YisrKSB7CisJZm9yICh3YiA9ICZhY20tPndiWzBdLCBpID0gMDsgaSA8IEFDTV9OVzsgaSsrLCB3YisrKQogCQl1c2JfYnVmZmVyX2ZyZWUodXNiX2RldiwgYWNtLT53cml0ZXNpemUsIHdiLT5idWYsIHdiLT5kbWFoKTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIGFjbV9yZWFkX2J1ZmZlcnNfZnJlZShzdHJ1Y3QgYWNtICphY20pCkBAIC04NTcsNyArOTAyLDggQEAKIAlpbnQgaSwgbiA9IGFjbS0+cnhfYnVmbGltaXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotCQl1c2JfYnVmZmVyX2ZyZWUodXNiX2RldiwgYWNtLT5yZWFkc2l6ZSwgYWNtLT5yYltpXS5iYXNlLCBhY20tPnJiW2ldLmRtYSk7CisJCXVzYl9idWZmZXJfZnJlZSh1c2JfZGV2LCBhY20tPnJlYWRzaXplLAorCQkJCQlhY20tPnJiW2ldLmJhc2UsIGFjbS0+cmJbaV0uZG1hKTsKIH0KIAogLyogTGl0dGxlIGhlbHBlcjogd3JpdGUgYnVmZmVycyBhbGxvY2F0ZSAqLwpAQCAtODgyLDggKzkyOCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWNtX3Byb2JlIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKLQkJICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQorc3RhdGljIGludCBhY21fcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCB1c2JfY2RjX3VuaW9uX2Rlc2MgKnVuaW9uX2hlYWRlciA9IE5VTEw7CiAJc3RydWN0IHVzYl9jZGNfY291bnRyeV9mdW5jdGlvbmFsX2Rlc2MgKmNmZCA9IE5VTEw7CkBAIC04OTcsNyArOTQzLDcgQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJc3RydWN0IGFjbSAqYWNtOwogCWludCBtaW5vcjsKLQlpbnQgY3RybHNpemUscmVhZHNpemU7CisJaW50IGN0cmxzaXplLCByZWFkc2l6ZTsKIAl1OCAqYnVmOwogCXU4IGFjX21hbmFnZW1lbnRfZnVuY3Rpb24gPSAwOwogCXU4IGNhbGxfbWFuYWdlbWVudF9mdW5jdGlvbiA9IDA7CkBAIC05MTcsNyArOTYzLDcgQEAKIAkJY29udHJvbF9pbnRlcmZhY2UgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgMCk7CiAJCWdvdG8gc2tpcF9ub3JtYWxfcHJvYmU7CiAJfQotCQorCiAJLyogbm9ybWFsIHByb2JpbmcqLwogCWlmICghYnVmZmVyKSB7CiAJCWRldl9lcnIoJmludGYtPmRldiwgIldlaXJkIGRlc2NyaXB0b3IgcmVmZXJlbmNlc1xuIik7CkBAIC05MjUsOCArOTcxLDEwIEBACiAJfQogCiAJaWYgKCFidWZsZW4pIHsKLQkJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludC0+ZXh0cmFsZW4gJiYgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50LT5leHRyYSkgewotCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCJTZWVraW5nIGV4dHJhIGRlc2NyaXB0b3JzIG9uIGVuZHBvaW50XG4iKTsKKwkJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludC0+ZXh0cmFsZW4gJiYKKwkJCQlpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnQtPmV4dHJhKSB7CisJCQlkZXZfZGJnKCZpbnRmLT5kZXYsCisJCQkJIlNlZWtpbmcgZXh0cmEgZGVzY3JpcHRvcnMgb24gZW5kcG9pbnRcbiIpOwogCQkJYnVmbGVuID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50LT5leHRyYWxlbjsKIAkJCWJ1ZmZlciA9IGludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludC0+ZXh0cmE7CiAJCX0gZWxzZSB7CkBAIC05MzcsNDcgKzk4NSw0MyBAQAogCX0KIAogCXdoaWxlIChidWZsZW4gPiAwKSB7Ci0JCWlmIChidWZmZXIgWzFdICE9IFVTQl9EVF9DU19JTlRFUkZBQ0UpIHsKKwkJaWYgKGJ1ZmZlclsxXSAhPSBVU0JfRFRfQ1NfSU5URVJGQUNFKSB7CiAJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJza2lwcGluZyBnYXJiYWdlXG4iKTsKIAkJCWdvdG8gbmV4dF9kZXNjOwogCQl9CiAKLQkJc3dpdGNoIChidWZmZXIgWzJdKSB7Ci0JCQljYXNlIFVTQl9DRENfVU5JT05fVFlQRTogLyogd2UndmUgZm91bmQgaXQgKi8KLQkJCQlpZiAodW5pb25faGVhZGVyKSB7Ci0JCQkJCWRldl9lcnIoJmludGYtPmRldiwgIk1vcmUgdGhhbiBvbmUgIgotCQkJCQkJInVuaW9uIGRlc2NyaXB0b3IsICIKLQkJCQkJCSJza2lwcGluZyAuLi5cbiIpOwotCQkJCQlnb3RvIG5leHRfZGVzYzsKLQkJCQl9Ci0JCQkJdW5pb25faGVhZGVyID0gKHN0cnVjdCB1c2JfY2RjX3VuaW9uX2Rlc2MgKikKLQkJCQkJCQlidWZmZXI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFVTQl9DRENfQ09VTlRSWV9UWVBFOiAvKiBleHBvcnQgdGhyb3VnaCBzeXNmcyovCi0JCQkJY2ZkID0gKHN0cnVjdCB1c2JfY2RjX2NvdW50cnlfZnVuY3Rpb25hbF9kZXNjICopYnVmZmVyOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVU0JfQ0RDX0hFQURFUl9UWVBFOiAvKiBtYXliZSBjaGVjayB2ZXJzaW9uICovIAotCQkJCWJyZWFrOyAvKiBmb3Igbm93IHdlIGlnbm9yZSBpdCAqLyAKLQkJCWNhc2UgVVNCX0NEQ19BQ01fVFlQRToKLQkJCQlhY19tYW5hZ2VtZW50X2Z1bmN0aW9uID0gYnVmZmVyWzNdOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVU0JfQ0RDX0NBTExfTUFOQUdFTUVOVF9UWVBFOgotCQkJCWNhbGxfbWFuYWdlbWVudF9mdW5jdGlvbiA9IGJ1ZmZlclszXTsKLQkJCQljYWxsX2ludGVyZmFjZV9udW0gPSBidWZmZXJbNF07Ci0JCQkJaWYgKChjYWxsX21hbmFnZW1lbnRfZnVuY3Rpb24gJiAzKSAhPSAzKQotCQkJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJUaGlzIGRldmljZSAiCi0JCQkJCQkiY2Fubm90IGRvIGNhbGxzIG9uIGl0cyBvd24uICIKLQkJCQkJCSJJdCBpcyBubyBtb2RlbS5cbiIpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvKiB0aGVyZSBhcmUgTE9UUyBtb3JlIENEQyBkZXNjcmlwdG9ycyB0aGF0Ci0JCQkJICogY291bGQgbGVnaXRpbWF0ZWx5IGJlIGZvdW5kIGhlcmUuCi0JCQkJICovCi0JCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiSWdub3JpbmcgZGVzY3JpcHRvcjogIgotCQkJCQkJInR5cGUgJTAyeCwgbGVuZ3RoICVkXG4iLAotCQkJCQkJYnVmZmVyWzJdLCBidWZmZXJbMF0pOwotCQkJCWJyZWFrOworCQlzd2l0Y2ggKGJ1ZmZlclsyXSkgeworCQljYXNlIFVTQl9DRENfVU5JT05fVFlQRTogLyogd2UndmUgZm91bmQgaXQgKi8KKwkJCWlmICh1bmlvbl9oZWFkZXIpIHsKKwkJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJNb3JlIHRoYW4gb25lICIKKwkJCQkJInVuaW9uIGRlc2NyaXB0b3IsIHNraXBwaW5nIC4uLlxuIik7CisJCQkJZ290byBuZXh0X2Rlc2M7CiAJCQl9CisJCQl1bmlvbl9oZWFkZXIgPSAoc3RydWN0IHVzYl9jZGNfdW5pb25fZGVzYyAqKWJ1ZmZlcjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9DRENfQ09VTlRSWV9UWVBFOiAvKiBleHBvcnQgdGhyb3VnaCBzeXNmcyovCisJCQljZmQgPSAoc3RydWN0IHVzYl9jZGNfY291bnRyeV9mdW5jdGlvbmFsX2Rlc2MgKilidWZmZXI7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfQ0RDX0hFQURFUl9UWVBFOiAvKiBtYXliZSBjaGVjayB2ZXJzaW9uICovCisJCQlicmVhazsgLyogZm9yIG5vdyB3ZSBpZ25vcmUgaXQgKi8KKwkJY2FzZSBVU0JfQ0RDX0FDTV9UWVBFOgorCQkJYWNfbWFuYWdlbWVudF9mdW5jdGlvbiA9IGJ1ZmZlclszXTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9DRENfQ0FMTF9NQU5BR0VNRU5UX1RZUEU6CisJCQljYWxsX21hbmFnZW1lbnRfZnVuY3Rpb24gPSBidWZmZXJbM107CisJCQljYWxsX2ludGVyZmFjZV9udW0gPSBidWZmZXJbNF07CisJCQlpZiAoKGNhbGxfbWFuYWdlbWVudF9mdW5jdGlvbiAmIDMpICE9IDMpCisJCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiVGhpcyBkZXZpY2UgY2Fubm90IGRvIGNhbGxzIG9uIGl0cyBvd24uIEl0IGlzIG5vdCBhIG1vZGVtLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIHRoZXJlIGFyZSBMT1RTIG1vcmUgQ0RDIGRlc2NyaXB0b3JzIHRoYXQKKwkJCSAqIGNvdWxkIGxlZ2l0aW1hdGVseSBiZSBmb3VuZCBoZXJlLgorCQkJICovCisJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJJZ25vcmluZyBkZXNjcmlwdG9yOiAiCisJCQkJCSJ0eXBlICUwMngsIGxlbmd0aCAlZFxuIiwKKwkJCQkJYnVmZmVyWzJdLCBidWZmZXJbMF0pOworCQkJYnJlYWs7CisJCX0KIG5leHRfZGVzYzoKIAkJYnVmbGVuIC09IGJ1ZmZlclswXTsKIAkJYnVmZmVyICs9IGJ1ZmZlclswXTsKQEAgLTk4NSwzMyArMTAyOSwzNiBAQAogCiAJaWYgKCF1bmlvbl9oZWFkZXIpIHsKIAkJaWYgKGNhbGxfaW50ZXJmYWNlX251bSA+IDApIHsKLQkJCWRldl9kYmcoJmludGYtPmRldiwiTm8gdW5pb24gZGVzY3JpcHRvciwgdXNpbmcgY2FsbCBtYW5hZ2VtZW50IGRlc2NyaXB0b3JcbiIpOworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiTm8gdW5pb24gZGVzY3JpcHRvciwgdXNpbmcgY2FsbCBtYW5hZ2VtZW50IGRlc2NyaXB0b3JcbiIpOwogCQkJZGF0YV9pbnRlcmZhY2UgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgKGRhdGFfaW50ZXJmYWNlX251bSA9IGNhbGxfaW50ZXJmYWNlX251bSkpOwogCQkJY29udHJvbF9pbnRlcmZhY2UgPSBpbnRmOwogCQl9IGVsc2UgewotCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCJObyB1bmlvbiBkZXNjcmlwdG9yLCBnaXZpbmcgdXBcbiIpOworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LAorCQkJCQkiTm8gdW5pb24gZGVzY3JpcHRvciwgZ2l2aW5nIHVwXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfSBlbHNlIHsKIAkJY29udHJvbF9pbnRlcmZhY2UgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgdW5pb25faGVhZGVyLT5iTWFzdGVySW50ZXJmYWNlMCk7CiAJCWRhdGFfaW50ZXJmYWNlID0gdXNiX2lmbnVtX3RvX2lmKHVzYl9kZXYsIChkYXRhX2ludGVyZmFjZV9udW0gPSB1bmlvbl9oZWFkZXItPmJTbGF2ZUludGVyZmFjZTApKTsKIAkJaWYgKCFjb250cm9sX2ludGVyZmFjZSB8fCAhZGF0YV9pbnRlcmZhY2UpIHsKLQkJCWRldl9kYmcoJmludGYtPmRldiwibm8gaW50ZXJmYWNlc1xuIik7CisJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJubyBpbnRlcmZhY2VzXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQotCQorCiAJaWYgKGRhdGFfaW50ZXJmYWNlX251bSAhPSBjYWxsX2ludGVyZmFjZV9udW0pCi0JCWRldl9kYmcoJmludGYtPmRldiwiU2VwYXJhdGUgY2FsbCBjb250cm9sIGludGVyZmFjZS4gVGhhdCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkLlxuIik7CisJCWRldl9kYmcoJmludGYtPmRldiwgIlNlcGFyYXRlIGNhbGwgY29udHJvbCBpbnRlcmZhY2UuIFRoYXQgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZC5cbiIpOwogCiBza2lwX25vcm1hbF9wcm9iZToKIAogCS8qd29ya2Fyb3VuZCBmb3Igc3dpdGNoZWQgaW50ZXJmYWNlcyAqLwotCWlmIChkYXRhX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZUNsYXNzICE9IENEQ19EQVRBX0lOVEVSRkFDRV9UWVBFKSB7Ci0JCWlmIChjb250cm9sX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZUNsYXNzID09IENEQ19EQVRBX0lOVEVSRkFDRV9UWVBFKSB7CisJaWYgKGRhdGFfaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MKKwkJCQkJCSE9IENEQ19EQVRBX0lOVEVSRkFDRV9UWVBFKSB7CisJCWlmIChjb250cm9sX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZUNsYXNzCisJCQkJCQk9PSBDRENfREFUQV9JTlRFUkZBQ0VfVFlQRSkgewogCQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnQ7Ci0JCQlkZXZfZGJnKCZpbnRmLT5kZXYsIllvdXIgZGV2aWNlIGhhcyBzd2l0Y2hlZCBpbnRlcmZhY2VzLlxuIik7Ci0KKwkJCWRldl9kYmcoJmludGYtPmRldiwKKwkJCQkiWW91ciBkZXZpY2UgaGFzIHN3aXRjaGVkIGludGVyZmFjZXMuXG4iKTsKIAkJCXQgPSBjb250cm9sX2ludGVyZmFjZTsKIAkJCWNvbnRyb2xfaW50ZXJmYWNlID0gZGF0YV9pbnRlcmZhY2U7CiAJCQlkYXRhX2ludGVyZmFjZSA9IHQ7CkBAIC0xMDIzLDkgKzEwNzAsOSBAQAogCS8qIEFjY2VwdCBwcm9iZSByZXF1ZXN0cyBvbmx5IGZvciB0aGUgY29udHJvbCBpbnRlcmZhY2UgKi8KIAlpZiAoaW50ZiAhPSBjb250cm9sX2ludGVyZmFjZSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JCisKIAlpZiAodXNiX2ludGVyZmFjZV9jbGFpbWVkKGRhdGFfaW50ZXJmYWNlKSkgeyAvKiB2YWxpZCBpbiB0aGlzIGNvbnRleHQgKi8KLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCJUaGUgZGF0YSBpbnRlcmZhY2UgaXNuJ3QgYXZhaWxhYmxlXG4iKTsKKwkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiVGhlIGRhdGEgaW50ZXJmYWNlIGlzbid0IGF2YWlsYWJsZVxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC0xMDQyLDggKzEwODksOCBAQAogCWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbihlcHJlYWQpKSB7CiAJCS8qIGRlc2NyaXB0b3JzIGFyZSBzd2FwcGVkICovCiAJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdDsKLQkJZGV2X2RiZygmaW50Zi0+ZGV2LCJUaGUgZGF0YSBpbnRlcmZhY2UgaGFzIHN3aXRjaGVkIGVuZHBvaW50c1xuIik7Ci0JCQorCQlkZXZfZGJnKCZpbnRmLT5kZXYsCisJCQkiVGhlIGRhdGEgaW50ZXJmYWNlIGhhcyBzd2l0Y2hlZCBlbmRwb2ludHNcbiIpOwogCQl0ID0gZXByZWFkOwogCQllcHJlYWQgPSBlcHdyaXRlOwogCQllcHdyaXRlID0gdDsKQEAgLTEwNTYsMTMgKzExMDMsMTUgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKCEoYWNtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFjbSksIEdGUF9LRVJORUwpKSkgeworCWFjbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoYWNtID09IE5VTEwpIHsKIAkJZGV2X2RiZygmaW50Zi0+ZGV2LCAib3V0IG9mIG1lbW9yeSAoYWNtIGt6YWxsb2MpXG4iKTsKIAkJZ290byBhbGxvY19mYWlsOwogCX0KIAogCWN0cmxzaXplID0gbGUxNl90b19jcHUoZXBjdHJsLT53TWF4UGFja2V0U2l6ZSk7Ci0JcmVhZHNpemUgPSBsZTE2X3RvX2NwdShlcHJlYWQtPndNYXhQYWNrZXRTaXplKSogKCBxdWlya3MgPT0gU0lOR0xFX1JYX1VSQiA/IDEgOiAyKTsKKwlyZWFkc2l6ZSA9IGxlMTZfdG9fY3B1KGVwcmVhZC0+d01heFBhY2tldFNpemUpICoKKwkJCQkocXVpcmtzID09IFNJTkdMRV9SWF9VUkIgPyAxIDogMik7CiAJYWNtLT53cml0ZXNpemUgPSBsZTE2X3RvX2NwdShlcHdyaXRlLT53TWF4UGFja2V0U2l6ZSkgKiAyMDsKIAlhY20tPmNvbnRyb2wgPSBjb250cm9sX2ludGVyZmFjZTsKIAlhY20tPmRhdGEgPSBkYXRhX2ludGVyZmFjZTsKQEAgLTEwODIsNiArMTEzMSw4IEBACiAJc3Bpbl9sb2NrX2luaXQoJmFjbS0+cmVhZF9sb2NrKTsKIAltdXRleF9pbml0KCZhY20tPm11dGV4KTsKIAlhY20tPnJ4X2VuZHBvaW50ID0gdXNiX3JjdmJ1bGtwaXBlKHVzYl9kZXYsIGVwcmVhZC0+YkVuZHBvaW50QWRkcmVzcyk7CisJdHR5X3BvcnRfaW5pdCgmYWNtLT5wb3J0KTsKKwlhY20tPnBvcnQub3BzID0gJmFjbV9wb3J0X29wczsKIAogCWJ1ZiA9IHVzYl9idWZmZXJfYWxsb2ModXNiX2RldiwgY3RybHNpemUsIEdGUF9LRVJORUwsICZhY20tPmN0cmxfZG1hKTsKIAlpZiAoIWJ1ZikgewpAQCAtMTEwMyw4ICsxMTU0LDEwIEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9yeF9idWY7IGkrKykgewogCQlzdHJ1Y3QgYWNtX3J1ICpyY3YgPSAmKGFjbS0+cnVbaV0pOwogCi0JCWlmICghKHJjdi0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkpIHsKLQkJCWRldl9kYmcoJmludGYtPmRldiwgIm91dCBvZiBtZW1vcnkgKHJlYWQgdXJicyB1c2JfYWxsb2NfdXJiKVxuIik7CisJCXJjdi0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHJjdi0+dXJiID09IE5VTEwpIHsKKwkJCWRldl9kYmcoJmludGYtPmRldiwKKwkJCQkib3V0IG9mIG1lbW9yeSAocmVhZCB1cmJzIHVzYl9hbGxvY191cmIpXG4iKTsKIAkJCWdvdG8gYWxsb2NfZmFpbDc7CiAJCX0KIApAQCAtMTExNywyNiArMTE3MCwyOSBAQAogCQlyYi0+YmFzZSA9IHVzYl9idWZmZXJfYWxsb2MoYWNtLT5kZXYsIHJlYWRzaXplLAogCQkJCUdGUF9LRVJORUwsICZyYi0+ZG1hKTsKIAkJaWYgKCFyYi0+YmFzZSkgewotCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAib3V0IG9mIG1lbW9yeSAocmVhZCBidWZzIHVzYl9idWZmZXJfYWxsb2MpXG4iKTsKKwkJCWRldl9kYmcoJmludGYtPmRldiwKKwkJCQkib3V0IG9mIG1lbW9yeSAocmVhZCBidWZzIHVzYl9idWZmZXJfYWxsb2MpXG4iKTsKIAkJCWdvdG8gYWxsb2NfZmFpbDc7CiAJCX0KIAl9Ci0JZm9yKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBBQ01fTlc7IGkrKykgewogCQlzdHJ1Y3QgYWNtX3diICpzbmQgPSAmKGFjbS0+d2JbaV0pOwogCi0JCWlmICghKHNuZC0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkpIHsKLQkJCWRldl9kYmcoJmludGYtPmRldiwgIm91dCBvZiBtZW1vcnkgKHdyaXRlIHVyYnMgdXNiX2FsbG9jX3VyYikiKTsKKwkJc25kLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCQlpZiAoc25kLT51cmIgPT0gTlVMTCkgeworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LAorCQkJCSJvdXQgb2YgbWVtb3J5ICh3cml0ZSB1cmJzIHVzYl9hbGxvY191cmIpIik7CiAJCQlnb3RvIGFsbG9jX2ZhaWw3OwogCQl9CiAKLQkJdXNiX2ZpbGxfYnVsa191cmIoc25kLT51cmIsIHVzYl9kZXYsIHVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LCBlcHdyaXRlLT5iRW5kcG9pbnRBZGRyZXNzKSwKLQkJCQlOVUxMLCBhY20tPndyaXRlc2l6ZSwgYWNtX3dyaXRlX2J1bGssIHNuZCk7CisJCXVzYl9maWxsX2J1bGtfdXJiKHNuZC0+dXJiLCB1c2JfZGV2LAorCQkJdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsIGVwd3JpdGUtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJTlVMTCwgYWNtLT53cml0ZXNpemUsIGFjbV93cml0ZV9idWxrLCBzbmQpOwogCQlzbmQtPnVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAJCXNuZC0+aW5zdGFuY2UgPSBhY207CiAJfQogCi0JdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgYWNtKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGFjbSk7CiAKIAlpID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9ibUNhcGFiaWxpdGllcyk7CiAJaWYgKGkgPCAwKQpAQCAtMTE0Nyw3ICsxMjAzLDggQEAKIAkJaWYgKCFhY20tPmNvdW50cnlfY29kZXMpCiAJCQlnb3RvIHNraXBfY291bnRyaWVzOwogCQlhY20tPmNvdW50cnlfY29kZV9zaXplID0gY2ZkLT5iTGVuZ3RoIC0gNDsKLQkJbWVtY3B5KGFjbS0+Y291bnRyeV9jb2RlcywgKHU4ICopJmNmZC0+d0NvdW50eUNvZGUwLCBjZmQtPmJMZW5ndGggLSA0KTsKKwkJbWVtY3B5KGFjbS0+Y291bnRyeV9jb2RlcywgKHU4ICopJmNmZC0+d0NvdW50eUNvZGUwLAorCQkJCQkJCWNmZC0+Ykxlbmd0aCAtIDQpOwogCQlhY20tPmNvdW50cnlfcmVsX2RhdGUgPSBjZmQtPmlDb3VudHJ5Q29kZVJlbERhdGU7CiAKIAkJaSA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfd0NvdW50cnlDb2Rlcyk7CkBAIC0xMTU2LDcgKzEyMTMsOCBAQAogCQkJZ290byBza2lwX2NvdW50cmllczsKIAkJfQogCi0JCWkgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2lDb3VudHJ5Q29kZVJlbERhdGUpOworCQlpID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsCisJCQkJCQkmZGV2X2F0dHJfaUNvdW50cnlDb2RlUmVsRGF0ZSk7CiAJCWlmIChpIDwgMCkgewogCQkJa2ZyZWUoYWNtLT5jb3VudHJ5X2NvZGVzKTsKIAkJCWdvdG8gc2tpcF9jb3VudHJpZXM7CkBAIC0xMTY0LDggKzEyMjIsMTAgQEAKIAl9CiAKIHNraXBfY291bnRyaWVzOgotCXVzYl9maWxsX2ludF91cmIoYWNtLT5jdHJsdXJiLCB1c2JfZGV2LCB1c2JfcmN2aW50cGlwZSh1c2JfZGV2LCBlcGN0cmwtPmJFbmRwb2ludEFkZHJlc3MpLAotCQkJIGFjbS0+Y3RybF9idWZmZXIsIGN0cmxzaXplLCBhY21fY3RybF9pcnEsIGFjbSwgZXBjdHJsLT5iSW50ZXJ2YWwpOworCXVzYl9maWxsX2ludF91cmIoYWNtLT5jdHJsdXJiLCB1c2JfZGV2LAorCQkJdXNiX3JjdmludHBpcGUodXNiX2RldiwgZXBjdHJsLT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCWFjbS0+Y3RybF9idWZmZXIsIGN0cmxzaXplLCBhY21fY3RybF9pcnEsIGFjbSwKKwkJCWVwY3RybC0+YkludGVydmFsKTsKIAlhY20tPmN0cmx1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwogCWFjbS0+Y3RybHVyYi0+dHJhbnNmZXJfZG1hID0gYWNtLT5jdHJsX2RtYTsKIApAQCAtMTIxMiw3ICsxMjcyLDcgQEAKIAl0YXNrbGV0X2Rpc2FibGUoJmFjbS0+dXJiX3Rhc2spOwogCiAJdXNiX2tpbGxfdXJiKGFjbS0+Y3RybHVyYik7Ci0JZm9yKGkgPSAwOyBpIDwgQUNNX05XOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEFDTV9OVzsgaSsrKQogCQl1c2Jfa2lsbF91cmIoYWNtLT53YltpXS51cmIpOwogCWZvciAoaSA9IDA7IGkgPCBhY20tPnJ4X2J1ZmxpbWl0OyBpKyspCiAJCXVzYl9raWxsX3VyYihhY20tPnJ1W2ldLnVyYik7CkBAIC0xMjI3LDEzICsxMjg3LDE0IEBACiB7CiAJc3RydWN0IGFjbSAqYWNtID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKIAogCS8qIHNpYmxpbmcgaW50ZXJmYWNlIGlzIGFscmVhZHkgY2xlYW5pbmcgdXAgKi8KIAlpZiAoIWFjbSkKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmb3Blbl9tdXRleCk7Ci0JaWYgKGFjbS0+Y291bnRyeV9jb2Rlcyl7CisJaWYgKGFjbS0+Y291bnRyeV9jb2RlcykgewogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmFjbS0+Y29udHJvbC0+ZGV2LAogCQkJCSZkZXZfYXR0cl93Q291bnRyeUNvZGVzKTsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKCZhY20tPmNvbnRyb2wtPmRldiwKQEAgLTEyNDcsMjIgKzEzMDgsMjUgQEAKIAlzdG9wX2RhdGFfdHJhZmZpYyhhY20pOwogCiAJYWNtX3dyaXRlX2J1ZmZlcnNfZnJlZShhY20pOwotCXVzYl9idWZmZXJfZnJlZSh1c2JfZGV2LCBhY20tPmN0cmxzaXplLCBhY20tPmN0cmxfYnVmZmVyLCBhY20tPmN0cmxfZG1hKTsKKwl1c2JfYnVmZmVyX2ZyZWUodXNiX2RldiwgYWNtLT5jdHJsc2l6ZSwgYWNtLT5jdHJsX2J1ZmZlciwKKwkJCQkJCQkJYWNtLT5jdHJsX2RtYSk7CiAJYWNtX3JlYWRfYnVmZmVyc19mcmVlKGFjbSk7CiAKIAl1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKCZhY21fZHJpdmVyLCBpbnRmID09IGFjbS0+Y29udHJvbCA/CiAJCQkJCWFjbS0+ZGF0YSA6IGFjbS0+Y29udHJvbCk7CiAKLQlpZiAoIWFjbS0+dXNlZCkgeworCWlmIChhY20tPnBvcnQuY291bnQgPT0gMCkgewogCQlhY21fdHR5X3VucmVnaXN0ZXIoYWNtKTsKIAkJbXV0ZXhfdW5sb2NrKCZvcGVuX211dGV4KTsKIAkJcmV0dXJuOwogCX0KIAogCW11dGV4X3VubG9jaygmb3Blbl9tdXRleCk7Ci0KLQlpZiAoYWNtLT50dHkpCi0JCXR0eV9oYW5ndXAoYWNtLT50dHkpOworCXR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJmFjbS0+cG9ydCk7CisJaWYgKHR0eSkgeworCQl0dHlfaGFuZ3VwKHR0eSk7CisJCXR0eV9rcmVmX3B1dCh0dHkpOworCX0KIH0KIAogI2lmZGVmIENPTkZJR19QTQpAQCAtMTI5Nyw3ICsxMzYxLDcgQEAKIAkqLwogCW11dGV4X2xvY2soJmFjbS0+bXV0ZXgpOwogCi0JaWYgKGFjbS0+dXNlZCkKKwlpZiAoYWNtLT5wb3J0LmNvdW50KQogCQlzdG9wX2RhdGFfdHJhZmZpYyhhY20pOwogCiAJbXV0ZXhfdW5sb2NrKCZhY20tPm11dGV4KTsKQEAgLTEzMTksNyArMTM4Myw3IEBACiAJCXJldHVybiAwOwogCiAJbXV0ZXhfbG9jaygmYWNtLT5tdXRleCk7Ci0JaWYgKGFjbS0+dXNlZCkgeworCWlmIChhY20tPnBvcnQuY291bnQpIHsKIAkJcnYgPSB1c2Jfc3VibWl0X3VyYihhY20tPmN0cmx1cmIsIEdGUF9OT0lPKTsKIAkJaWYgKHJ2IDwgMCkKIAkJCWdvdG8gZXJyX291dDsKQEAgLTEzOTgsNyArMTQ2Miw3IEBACiAJeyBVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfQUNNLAogCQlVU0JfQ0RDX0FDTV9QUk9UT19BVF9HU00pIH0sCiAJeyBVU0JfSU5URVJGQUNFX0lORk8oVVNCX0NMQVNTX0NPTU0sIFVTQl9DRENfU1VCQ0xBU1NfQUNNLAotCQlVU0JfQ0RDX0FDTV9QUk9UT19BVF8zRwkpIH0sCisJCVVTQl9DRENfQUNNX1BST1RPX0FUXzNHKSB9LAogCXsgVVNCX0lOVEVSRkFDRV9JTkZPKFVTQl9DTEFTU19DT01NLCBVU0JfQ0RDX1NVQkNMQVNTX0FDTSwKIAkJVVNCX0NEQ19BQ01fUFJPVE9fQVRfQ0RNQSkgfSwKIApAQCAtMTQwNiw3ICsxNDcwLDcgQEAKIAl7IH0KIH07CiAKLU1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgYWNtX2lkcyk7CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgYWNtX2lkcyk7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhY21fZHJpdmVyID0gewogCS5uYW1lID0JCSJjZGNfYWNtIiwKQEAgLTE0MjksNiArMTQ5Myw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zIGFjbV9vcHMgPSB7CiAJLm9wZW4gPQkJCWFjbV90dHlfb3BlbiwKIAkuY2xvc2UgPQkJYWNtX3R0eV9jbG9zZSwKKwkuaGFuZ3VwID0JCWFjbV90dHlfaGFuZ3VwLAogCS53cml0ZSA9CQlhY21fdHR5X3dyaXRlLAogCS53cml0ZV9yb29tID0JCWFjbV90dHlfd3JpdGVfcm9vbSwKIAkuaW9jdGwgPQkJYWNtX3R0eV9pb2N0bCwKQEAgLTE0NjAsNyArMTUyNSw4IEBACiAJYWNtX3R0eV9kcml2ZXItPnN1YnR5cGUgPSBTRVJJQUxfVFlQRV9OT1JNQUwsCiAJYWNtX3R0eV9kcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVyB8IFRUWV9EUklWRVJfRFlOQU1JQ19ERVY7CiAJYWNtX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcyA9IHR0eV9zdGRfdGVybWlvczsKLQlhY21fdHR5X2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJYWNtX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8CisJCQkJCQkJCUhVUENMIHwgQ0xPQ0FMOwogCXR0eV9zZXRfb3BlcmF0aW9ucyhhY21fdHR5X2RyaXZlciwgJmFjbV9vcHMpOwogCiAJcmV0dmFsID0gdHR5X3JlZ2lzdGVyX2RyaXZlcihhY21fdHR5X2RyaXZlcik7CkBAIC0xNDkyLDcgKzE1NTgsNyBAQAogbW9kdWxlX2luaXQoYWNtX2luaXQpOwogbW9kdWxlX2V4aXQoYWNtX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBU19DSEFSREVWX01BSk9SKEFDTV9UVFlfTUFKT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5oCmluZGV4IDFmOTVlN2EuLjRjMzg1NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uaAorKysgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmgKQEAgLTg5LDggKzg5LDggQEAKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OwkJCQkvKiB0aGUgY29ycmVzcG9uZGluZyB1c2IgZGV2aWNlICovCiAJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmNvbnRyb2w7CQkJLyogY29udHJvbCBpbnRlcmZhY2UgKi8KIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqZGF0YTsJCQkvKiBkYXRhIGludGVyZmFjZSAqLwotCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CQkJCS8qIHRoZSBjb3JyZXNwb25kaW5nIHR0eSAqLwotCXN0cnVjdCB1cmIgKmN0cmx1cmI7CQkJLyogdXJicyAqLworCXN0cnVjdCB0dHlfcG9ydCBwb3J0OwkJCSAJLyogb3VyIHR0eSBwb3J0IGRhdGEgKi8KKwlzdHJ1Y3QgdXJiICpjdHJsdXJiOwkJCQkvKiB1cmJzICovCiAJdTggKmN0cmxfYnVmZmVyOwkJCQkvKiBidWZmZXJzIG9mIHVyYnMgKi8KIAlkbWFfYWRkcl90IGN0cmxfZG1hOwkJCQkvKiBkbWEgaGFuZGxlcyBvZiBidWZmZXJzICovCiAJdTggKmNvdW50cnlfY29kZXM7CQkJCS8qIGNvdW50cnkgY29kZXMgZnJvbSBkZXZpY2UgKi8KQEAgLTEyMCw3ICsxMjAsNiBAQAogCXVuc2lnbmVkIGludCBjdHJsb3V0OwkJCQkvKiBvdXRwdXQgY29udHJvbCBsaW5lcyAoRFRSLCBSVFMpICovCiAJdW5zaWduZWQgaW50IHdyaXRlc2l6ZTsJCQkJLyogbWF4IHBhY2tldCBzaXplIGZvciB0aGUgb3V0cHV0IGJ1bGsgZW5kcG9pbnQgKi8KIAl1bnNpZ25lZCBpbnQgcmVhZHNpemUsY3RybHNpemU7CQkJLyogYnVmZmVyIHNpemVzIGZvciBmcmVlaW5nICovCi0JdW5zaWduZWQgaW50IHVzZWQ7CQkJCS8qIHNvbWVvbmUgaGFzIHRoaXMgYWNtJ3MgZGV2aWNlIG9wZW4gKi8KIAl1bnNpZ25lZCBpbnQgbWlub3I7CQkJCS8qIGFjbSBtaW5vciBudW1iZXIgKi8KIAl1bnNpZ25lZCBjaGFyIHRocm90dGxlOwkJCQkvKiB0aHJvdHRsZWQgYnkgdHR5IGxheWVyICovCiAJdW5zaWduZWQgY2hhciBjbG9jYWw7CQkJCS8qIHRlcm1pb3MgQ0xPQ0FMICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYmVsa2luX3NhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYmVsa2luX3NhLmMKaW5kZXggYjdlYWNhZC4uMmJmZDZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2JlbGtpbl9zYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9iZWxraW5fc2EuYwpAQCAtOTMsOCArOTMsNyBAQAogc3RhdGljIHZvaWQgYmVsa2luX3NhX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIGludCAgYmVsa2luX3NhX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkIGJlbGtpbl9zYV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgYmVsa2luX3NhX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIHZvaWQgYmVsa2luX3NhX3JlYWRfaW50X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CiBzdGF0aWMgdm9pZCBiZWxraW5fc2Ffc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBrdGVybWlvcyAqIG9sZCk7CkBAIC0yNDQsOCArMjQzLDcgQEAKIH0gLyogYmVsa2luX3NhX29wZW4gKi8KIAogCi1zdGF0aWMgdm9pZCBiZWxraW5fc2FfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgYmVsa2luX3NhX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJZGJnKCIlcyBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jaDM0MS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKaW5kZXggYWI0Y2MyNy4uMjgzMDc2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMKQEAgLTI2MiwzMiArMjYyLDQwIEBACiAJcmV0dXJuIHI7CiB9CiAKLXN0YXRpYyB2b2lkIGNoMzQxX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCQkJc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgaW50IGNoMzQxX2NhcnJpZXJfcmFpc2VkKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGNoMzQxX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaWYgKHByaXYtPmxpbmVfc3RhdHVzICYgQ0gzNDFfQklUX0RDRCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoMzQxX2R0cl9ydHMoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IG9uKQogewogCXN0cnVjdCBjaDM0MV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGNfY2ZsYWc7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOworCS8qIGRyb3AgRFRSIGFuZCBSVFMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmIChvbikKKwkJcHJpdi0+bGluZV9jb250cm9sIHw9IENIMzQxX0JJVF9SVFMgfCBDSDM0MV9CSVRfRFRSOworCWVsc2UKKwkJcHJpdi0+bGluZV9jb250cm9sICY9IH4oQ0gzNDFfQklUX1JUUyB8IENIMzQxX0JJVF9EVFIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwljaDM0MV9zZXRfaGFuZHNoYWtlKHBvcnQtPnNlcmlhbC0+ZGV2LCBwcml2LT5saW5lX2NvbnRyb2wpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOworfQorCitzdGF0aWMgdm9pZCBjaDM0MV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKIAkvKiBzaHV0ZG93biBvdXIgdXJicyAqLwogCWRiZygiJXMgLSBzaHV0dGluZyBkb3duIHVyYnMiLCBfX2Z1bmNfXyk7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7Ci0KLQlpZiAodHR5KSB7Ci0JCWNfY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCWlmIChjX2NmbGFnICYgSFVQQ0wpIHsKLQkJCS8qIGRyb3AgRFRSIGFuZCBSVFMgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlwcml2LT5saW5lX2NvbnRyb2wgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJY2gzNDFfc2V0X2hhbmRzaGFrZShwb3J0LT5zZXJpYWwtPmRldiwgMCk7Ci0JCX0KLQl9Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7CiB9CiAKIApAQCAtMzAyLDcgKzMxMCw2IEBACiAJZGJnKCJjaDM0MV9vcGVuKCkiKTsKIAogCXByaXYtPmJhdWRfcmF0ZSA9IERFRkFVTFRfQkFVRF9SQVRFOwotCXByaXYtPmxpbmVfY29udHJvbCA9IENIMzQxX0JJVF9SVFMgfCBDSDM0MV9CSVRfRFRSOwogCiAJciA9IGNoMzQxX2NvbmZpZ3VyZShzZXJpYWwtPmRldiwgcHJpdik7CiAJaWYgKHIpCkBAIC0zMjIsNyArMzI5LDcgQEAKIAlpZiAocikgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIsIgogCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHIpOwotCQljaDM0MV9jbG9zZSh0dHksIHBvcnQsIE5VTEwpOworCQljaDM0MV9jbG9zZShwb3J0KTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCkBAIC0zNDMsOSArMzUwLDYgQEAKIAogCWRiZygiY2gzNDFfc2V0X3Rlcm1pb3MoKSIpOwogCi0JaWYgKCF0dHkgfHwgIXR0eS0+dGVybWlvcykKLQkJcmV0dXJuOwotCiAJYmF1ZF9yYXRlID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKIAogCXByaXYtPmJhdWRfcmF0ZSA9IGJhdWRfcmF0ZTsKQEAgLTU2OCw2ICs1NzIsOCBAQAogCS51c2JfZHJpdmVyICAgICAgICA9ICZjaDM0MV9kcml2ZXIsCiAJLm51bV9wb3J0cyAgICAgICAgID0gMSwKIAkub3BlbiAgICAgICAgICAgICAgPSBjaDM0MV9vcGVuLAorCS5kdHJfcnRzCSAgID0gY2gzNDFfZHRyX3J0cywKKwkuY2Fycmllcl9yYWlzZWQJICAgPSBjaDM0MV9jYXJyaWVyX3JhaXNlZCwKIAkuY2xvc2UgICAgICAgICAgICAgPSBjaDM0MV9jbG9zZSwKIAkuaW9jdGwgICAgICAgICAgICAgPSBjaDM0MV9pb2N0bCwKIAkuc2V0X3Rlcm1pb3MgICAgICAgPSBjaDM0MV9zZXRfdGVybWlvcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jb25zb2xlLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY29uc29sZS5jCmluZGV4IDE5ZTI0MDQuLjI0N2I2MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jb25zb2xlLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NvbnNvbGUuYwpAQCAtMTY5LDcgKzE2OSw5IEBACiAJCQlrZnJlZSh0dHkpOwogCQl9CiAJfQotCisJLyogU28gd2Uga25vdyBub3QgdG8ga2lsbCB0aGUgaGFyZHdhcmUgb24gYSBoYW5ndXAgb24gdGhpcworCSAgIHBvcnQuIFdlIGhhdmUgYWxzbyBidW1wZWQgdGhlIHVzZSBjb3VudCBieSBvbmUgc28gaXQgd29uJ3QgZ28KKwkgICBpZGxlICovCiAJcG9ydC0+Y29uc29sZSA9IDE7CiAJcmV0dmFsID0gMDsKIApAQCAtMTgyLDcgKzE4NCw3IEBACiAJa2ZyZWUodHR5KTsKIHJlc2V0X29wZW5fY291bnQ6CiAJcG9ydC0+cG9ydC5jb3VudCA9IDA7Ci1nb3RvIG91dDsKKwlnb3RvIG91dDsKIH0KIAogc3RhdGljIHZvaWQgdXNiX2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2NwMjEweC5jCmluZGV4IGU4ZDUxMzMuLjE2YTE1NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jcDIxMHguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3AyMTB4LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogU2lsaWNvbiBMYWJvcmF0b3JpZXMgQ1AyMTAxL0NQMjEwMiBVU0IgdG8gUlMyMzIgc2VyaWFsIGFkYXB0b3IgZHJpdmVyCisgKiBTaWxpY29uIExhYm9yYXRvcmllcyBDUDIxMHggVVNCIHRvIFJTMjMyIHNlcmlhbCBhZGFwdG9yIGRyaXZlcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNSBDcmFpZyBTaGVsbGV5IChjcmFpZ0BtaWNyb3Ryb24ub3JnLnVrKQogICoKQEAgLTI3LDQ0ICsyNyw0NiBAQAogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMDgiCi0jZGVmaW5lIERSSVZFUl9ERVNDICJTaWxpY29uIExhYnMgQ1AyMTAxL0NQMjEwMiBSUzIzMiBzZXJpYWwgYWRhcHRvciBkcml2ZXIiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MC4wOSIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlNpbGljb24gTGFicyBDUDIxMHggUlMyMzIgc2VyaWFsIGFkYXB0b3IgZHJpdmVyIgogCiAvKgogICogRnVuY3Rpb24gUHJvdG90eXBlcwogICovCi1zdGF0aWMgaW50IGNwMjEwMV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiwKK3N0YXRpYyBpbnQgY3AyMTB4X29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqLAogCQkJCQkJCXN0cnVjdCBmaWxlICopOwotc3RhdGljIHZvaWQgY3AyMTAxX2NsZWFudXAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKTsKLXN0YXRpYyB2b2lkIGNwMjEwMV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICosCi0JCQkJCQkJc3RydWN0IGZpbGUqKTsKLXN0YXRpYyB2b2lkIGNwMjEwMV9nZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqLAorc3RhdGljIHZvaWQgY3AyMTB4X2NsZWFudXAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKTsKK3N0YXRpYyB2b2lkIGNwMjEweF9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopOworc3RhdGljIHZvaWQgY3AyMTB4X2dldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosCiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBjcDIxMDFfZ2V0X3Rlcm1pb3NfcG9ydChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorc3RhdGljIHZvaWQgY3AyMTB4X2dldF90ZXJtaW9zX3BvcnQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAl1bnNpZ25lZCBpbnQgKmNmbGFncCwgdW5zaWduZWQgaW50ICpiYXVkcCk7Ci1zdGF0aWMgdm9pZCBjcDIxMDFfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqLAorc3RhdGljIHZvaWQgY3AyMTB4X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiwKIAkJCQkJCQlzdHJ1Y3Qga3Rlcm1pb3MqKTsKLXN0YXRpYyBpbnQgY3AyMTAxX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOwotc3RhdGljIGludCBjcDIxMDFfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwKK3N0YXRpYyBpbnQgY3AyMTB4X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBjcDIxMHhfdGlvY21zZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKiwgc3RydWN0IGZpbGUgKiwKIAkJdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIGludCBjcDIxMDFfdGlvY21zZXRfcG9ydChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqLAorc3RhdGljIGludCBjcDIxMHhfdGlvY21zZXRfcG9ydChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqLAogCQl1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBjcDIxMDFfYnJlYWtfY3RsKHN0cnVjdCB0dHlfc3RydWN0ICosIGludCk7Ci1zdGF0aWMgaW50IGNwMjEwMV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICopOwotc3RhdGljIHZvaWQgY3AyMTAxX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICopOworc3RhdGljIHZvaWQgY3AyMTB4X2JyZWFrX2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqLCBpbnQpOworc3RhdGljIGludCBjcDIxMHhfc3RhcnR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqKTsKK3N0YXRpYyB2b2lkIGNwMjEweF9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqKTsKIAogc3RhdGljIGludCBkZWJ1ZzsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0gewogCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDY2QSkgfSwgLyogQUtUQUtPTSBBQ0UtMTAwMSBjYWJsZSAqLwogCXsgVVNCX0RFVklDRSgweDA0ODksIDB4RTAwMCkgfSwgLyogUGlyZWxsaSBCcm9hZGJhbmQgUy5wLkEsIERQLUwxMCBTSVAvR1NNIE1vYmlsZSAqLworCXsgVVNCX0RFVklDRSgweDA3NDUsIDB4MTAwMCkgfSwgLyogQ2lwaGVyTGFiIFVTQiBDQ0QgQmFyY29kZSBTY2FubmVyIDEwMDAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwOGU2LCAweDU1MDEpIH0sIC8qIEdlbWFsdG8gUHJveC1QVS9DVSBjb250YWN0bGVzcyBzbWFydGNhcmQgcmVhZGVyICovCisJeyBVU0JfREVWSUNFKDB4MDhGRCwgMHgwMDBBKSB9LCAvKiBEaWdpYW5zd2VyIEEvUyAsIFppZ0JlZS84MDIuMTUuNCBNQUMgRGV2aWNlICovCiAJeyBVU0JfREVWSUNFKDB4MEZDRiwgMHgxMDAzKSB9LCAvKiBEeW5hc3RyZWFtIEFOVCBkZXZlbG9wbWVudCBib2FyZCAqLwogCXsgVVNCX0RFVklDRSgweDBGQ0YsIDB4MTAwNCkgfSwgLyogRHluYXN0cmVhbSBBTlQyVVNCICovCiAJeyBVU0JfREVWSUNFKDB4MEZDRiwgMHgxMDA2KSB9LCAvKiBEeW5hc3RyZWFtIEFOVCBkZXZlbG9wbWVudCBib2FyZCAqLwogCXsgVVNCX0RFVklDRSgweDEwQTYsIDB4QUEyNikgfSwgLyogS25vY2stb2ZmIERDVS0xMSBjYWJsZSAqLwogCXsgVVNCX0RFVklDRSgweDEwQUIsIDB4MTBDNSkgfSwgLyogU2llbWVucyBNQzYwIENhYmxlICovCiAJeyBVU0JfREVWSUNFKDB4MTBCNSwgMHhBQzcwKSB9LCAvKiBOb2tpYSBDQS00MiBVU0IgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDBGOTEpIH0sIC8qIFZzdGFiaSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODAwQSkgfSwgLyogU1BPUlRpZGVudCBCU003LUQtVVNCIG1haW4gc3RhdGlvbiAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODAzQikgfSwgLyogUG9sb2x1IFVTQi1zZXJpYWwgY29udmVydGVyICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MDUzKSB9LCAvKiBFbmZvcmEgRURHMTIyOCAqLwpAQCAtODUsMTAgKzg3LDEyIEBACiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MUM4KSB9LCAvKiBMaXBvd3NreSBJbmR1c3RyaWUgRWxla3Ryb25payBHbWJILCBCYWJ5LUpUQUcgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgxRTIpIH0sIC8qIExpcG93c2t5IEluZHVzdHJpZSBFbGVrdHJvbmlrIEdtYkgsIEJhYnktTElOICovCiAJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MUU3KSB9LCAvKiBBZXJvY29tbSBSYWRpbyAqLworCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODFGMikgfSwgLyogQzEwMDcgSEYgYmFuZCBSRklEIGNvbnRyb2xsZXIgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgyMTgpIH0sIC8qIExpcG93c2t5IEluZHVzdHJpZSBFbGVrdHJvbmlrIEdtYkgsIEhBUlAtMSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODIyQikgfSwgLyogTW9kZW0gRURHRShHU00pIENvbWFuZGVyIDIgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweDgyNkIpIH0sIC8qIEN5Z25hbCBJbnRlZ3JhdGVkIFByb2R1Y3RzLCBJbmMuLCBGYXN0dHJheCBHUFMgZGVtb3N0cmF0aW9uIG1vZHVsZSAqLwogCXsgVVNCX0RFVklDRSgweDEwYzQsIDB4ODI5MykgfSwgLyogVGVsZWdlc3lzIEVUUlgyVVNCICovCisJeyBVU0JfREVWSUNFKDB4MTBDNCwgMHg4MkY5KSB9LCAvKiBQcm9jeW9uIEFWUyAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODM0MSkgfSwgLyogU2llbWVucyBNQzM1UFUgR1BSUyBNb2RlbSAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODNBOCkgfSwgLyogQW1iZXIgV2lyZWxlc3MgQU1CMjU2MCAqLwogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4ODQ2RSkgfSwgLyogQkVJIFVTQiBTZW5zb3IgSW50ZXJmYWNlIChWQ1ApICovCkBAIC05OSw3ICsxMDMsOSBAQAogCXsgVVNCX0RFVklDRSgweDEwQzQsIDB4RjAwMykgfSwgLyogRWxhbiBEaWdpdGFsIFN5c3RlbXMgVVNCcHVsc2UxMDAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM0LCAweEYwMDQpIH0sIC8qIEVsYW4gRGlnaXRhbCBTeXN0ZW1zIFVTQmNvdW50NTAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMEM1LCAweEVBNjEpIH0sIC8qIFNpbGljb24gTGFicyBNb2JpRGF0YSBHUFJTIFVTQiBNb2RlbSAqLworCXsgVVNCX0RFVklDRSgweDEwQ0UsIDB4RUE2QSkgfSwgLyogU2lsaWNvbiBMYWJzIE1vYmlEYXRhIEdQUlMgVVNCIE1vZGVtIDEwMEVVICovCiAJeyBVU0JfREVWSUNFKDB4MTNBRCwgMHg5OTk5KSB9LCAvKiBCYWx0ZWNoIGNhcmQgcmVhZGVyICovCisJeyBVU0JfREVWSUNFKDB4MTU1NSwgMHgwMDA0KSB9LCAvKiBPd2VuIEFDNCBVU0ItUlM0ODUgQ29udmVydGVyICovCiAJeyBVU0JfREVWSUNFKDB4MTY2QSwgMHgwMzAzKSB9LCAvKiBDbGlwc2FsIDU1MDBQQ1UgQy1CdXMgVVNCIGludGVyZmFjZSAqLwogCXsgVVNCX0RFVklDRSgweDE2RDYsIDB4MDAwMSkgfSwgLyogSmFibG90cm9uIHNlcmlhbCBpbnRlcmZhY2UgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxOEVGLCAweEUwMEYpIH0sIC8qIEVMViBVU0ItSTJDLUludGVyZmFjZSAqLwpAQCAtMTA4LDUzICsxMTQsNzAgQEAKIAogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKIAotc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGNwMjEwMV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gImNwMjEwMSIsCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgY3AyMTB4X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiY3AyMTB4IiwKIAkucHJvYmUJCT0gdXNiX3NlcmlhbF9wcm9iZSwKIAkuZGlzY29ubmVjdAk9IHVzYl9zZXJpYWxfZGlzY29ubmVjdCwKIAkuaWRfdGFibGUJPSBpZF90YWJsZSwKIAkubm9fZHluYW1pY19pZAk9IAkxLAogfTsKIAotc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBjcDIxMDFfZGV2aWNlID0geworc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBjcDIxMHhfZGV2aWNlID0gewogCS5kcml2ZXIgPSB7CiAJCS5vd25lciA9CVRISVNfTU9EVUxFLAotCQkubmFtZSA9IAkiY3AyMTAxIiwKKwkJLm5hbWUgPSAJImNwMjEweCIsCiAJfSwKLQkudXNiX2RyaXZlcgkJPSAmY3AyMTAxX2RyaXZlciwKKwkudXNiX2RyaXZlcgkJPSAmY3AyMTB4X2RyaXZlciwKIAkuaWRfdGFibGUJCT0gaWRfdGFibGUsCiAJLm51bV9wb3J0cwkJPSAxLAotCS5vcGVuCQkJPSBjcDIxMDFfb3BlbiwKLQkuY2xvc2UJCQk9IGNwMjEwMV9jbG9zZSwKLQkuYnJlYWtfY3RsCQk9IGNwMjEwMV9icmVha19jdGwsCi0JLnNldF90ZXJtaW9zCQk9IGNwMjEwMV9zZXRfdGVybWlvcywKLQkudGlvY21nZXQgCQk9IGNwMjEwMV90aW9jbWdldCwKLQkudGlvY21zZXQJCT0gY3AyMTAxX3Rpb2Ntc2V0LAotCS5hdHRhY2gJCQk9IGNwMjEwMV9zdGFydHVwLAotCS5zaHV0ZG93bgkJPSBjcDIxMDFfc2h1dGRvd24sCisJLm9wZW4JCQk9IGNwMjEweF9vcGVuLAorCS5jbG9zZQkJCT0gY3AyMTB4X2Nsb3NlLAorCS5icmVha19jdGwJCT0gY3AyMTB4X2JyZWFrX2N0bCwKKwkuc2V0X3Rlcm1pb3MJCT0gY3AyMTB4X3NldF90ZXJtaW9zLAorCS50aW9jbWdldCAJCT0gY3AyMTB4X3Rpb2NtZ2V0LAorCS50aW9jbXNldAkJPSBjcDIxMHhfdGlvY21zZXQsCisJLmF0dGFjaAkJCT0gY3AyMTB4X3N0YXJ0dXAsCisJLnNodXRkb3duCQk9IGNwMjEweF9zaHV0ZG93biwKIH07CiAKIC8qIENvbmZpZyByZXF1ZXN0IHR5cGVzICovCiAjZGVmaW5lIFJFUVRZUEVfSE9TVF9UT19ERVZJQ0UJMHg0MQogI2RlZmluZSBSRVFUWVBFX0RFVklDRV9UT19IT1NUCTB4YzEKIAotLyogQ29uZmlnIFNFVCByZXF1ZXN0cy4gVG8gR0VULCBhZGQgMSB0byB0aGUgcmVxdWVzdCBudW1iZXIgKi8KLSNkZWZpbmUgQ1AyMTAxX1VBUlQgCQkweDAwCS8qIEVuYWJsZSAvIERpc2FibGUgKi8KLSNkZWZpbmUgQ1AyMTAxX0JBVURSQVRFCQkweDAxCS8qIChCQVVEX1JBVEVfR0VOX0ZSRVEgLyBiYXVkcmF0ZSkgKi8KLSNkZWZpbmUgQ1AyMTAxX0JJVFMJCTB4MDMJLyogMHgoMCkoZGF0YWJpdHMpKHBhcml0eSkoc3RvcGJpdHMpICovCi0jZGVmaW5lIENQMjEwMV9CUkVBSwkJMHgwNQkvKiBPbiAvIE9mZiAqLwotI2RlZmluZSBDUDIxMDFfQ09OVFJPTAkJMHgwNwkvKiBGbG93IGNvbnRyb2wgbGluZSBzdGF0ZXMgKi8KLSNkZWZpbmUgQ1AyMTAxX01PREVNQ1RMCQkweDEzCS8qIE1vZGVtIGNvbnRyb2xzICovCi0jZGVmaW5lIENQMjEwMV9DT05GSUdfNgkJMHgxOQkvKiA2IGJ5dGVzIG9mIGNvbmZpZyBkYXRhID8/PyAqLworLyogQ29uZmlnIHJlcXVlc3QgY29kZXMgKi8KKyNkZWZpbmUgQ1AyMTBYX0lGQ19FTkFCTEUJMHgwMAorI2RlZmluZSBDUDIxMFhfU0VUX0JBVURESVYJMHgwMQorI2RlZmluZSBDUDIxMFhfR0VUX0JBVURESVYJMHgwMgorI2RlZmluZSBDUDIxMFhfU0VUX0xJTkVfQ1RMCTB4MDMKKyNkZWZpbmUgQ1AyMTBYX0dFVF9MSU5FX0NUTAkweDA0CisjZGVmaW5lIENQMjEwWF9TRVRfQlJFQUsJMHgwNQorI2RlZmluZSBDUDIxMFhfSU1NX0NIQVIJCTB4MDYKKyNkZWZpbmUgQ1AyMTBYX1NFVF9NSFMJCTB4MDcKKyNkZWZpbmUgQ1AyMTBYX0dFVF9NRE1TVFMJMHgwOAorI2RlZmluZSBDUDIxMFhfU0VUX1hPTgkJMHgwOQorI2RlZmluZSBDUDIxMFhfU0VUX1hPRkYJCTB4MEEKKyNkZWZpbmUgQ1AyMTBYX1NFVF9FVkVOVE1BU0sJMHgwQgorI2RlZmluZSBDUDIxMFhfR0VUX0VWRU5UTUFTSwkweDBDCisjZGVmaW5lIENQMjEwWF9TRVRfQ0hBUgkJMHgwRAorI2RlZmluZSBDUDIxMFhfR0VUX0NIQVJTCTB4MEUKKyNkZWZpbmUgQ1AyMTBYX0dFVF9QUk9QUwkweDBGCisjZGVmaW5lIENQMjEwWF9HRVRfQ09NTV9TVEFUVVMJMHgxMAorI2RlZmluZSBDUDIxMFhfUkVTRVQJCTB4MTEKKyNkZWZpbmUgQ1AyMTBYX1BVUkdFCQkweDEyCisjZGVmaW5lIENQMjEwWF9TRVRfRkxPVwkJMHgxMworI2RlZmluZSBDUDIxMFhfR0VUX0ZMT1cJCTB4MTQKKyNkZWZpbmUgQ1AyMTBYX0VNQkVEX0VWRU5UUwkweDE1CisjZGVmaW5lIENQMjEwWF9HRVRfRVZFTlRTVEFURQkweDE2CisjZGVmaW5lIENQMjEwWF9TRVRfQ0hBUlMJMHgxOQogCi0vKiBDUDIxMDFfVUFSVCAqLworLyogQ1AyMTBYX0lGQ19FTkFCTEUgKi8KICNkZWZpbmUgVUFSVF9FTkFCTEUJCTB4MDAwMQogI2RlZmluZSBVQVJUX0RJU0FCTEUJCTB4MDAwMAogCi0vKiBDUDIxMDFfQkFVRFJBVEUgKi8KKy8qIENQMjEwWF8oU0VUfEdFVClfQkFVRERJViAqLwogI2RlZmluZSBCQVVEX1JBVEVfR0VOX0ZSRVEJMHgzODQwMDAKIAotLyogQ1AyMTAxX0JJVFMgKi8KKy8qIENQMjEwWF8oU0VUfEdFVClfTElORV9DVEwgKi8KICNkZWZpbmUgQklUU19EQVRBX01BU0sJCTBYMGYwMAogI2RlZmluZSBCSVRTX0RBVEFfNQkJMFgwNTAwCiAjZGVmaW5lIEJJVFNfREFUQV82CQkwWDA2MDAKQEAgLTE3NCwxMSArMTk3LDExIEBACiAjZGVmaW5lIEJJVFNfU1RPUF8xXzUJCTB4MDAwMQogI2RlZmluZSBCSVRTX1NUT1BfMgkJMHgwMDAyCiAKLS8qIENQMjEwMV9CUkVBSyAqLworLyogQ1AyMTBYX1NFVF9CUkVBSyAqLwogI2RlZmluZSBCUkVBS19PTgkJMHgwMDAwCiAjZGVmaW5lIEJSRUFLX09GRgkJMHgwMDAxCiAKLS8qIENQMjEwMV9DT05UUk9MICovCisvKiBDUDIxMFhfKFNFVF9NSFN8R0VUX01ETVNUUykgKi8KICNkZWZpbmUgQ09OVFJPTF9EVFIJCTB4MDAwMQogI2RlZmluZSBDT05UUk9MX1JUUwkJMHgwMDAyCiAjZGVmaW5lIENPTlRST0xfQ1RTCQkweDAwMTAKQEAgLTE4OSwxMyArMjEyLDEzIEBACiAjZGVmaW5lIENPTlRST0xfV1JJVEVfUlRTCTB4MDIwMAogCiAvKgotICogY3AyMTAxX2dldF9jb25maWcKLSAqIFJlYWRzIGZyb20gdGhlIENQMjEwMSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICogY3AyMTB4X2dldF9jb25maWcKKyAqIFJlYWRzIGZyb20gdGhlIENQMjEweCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycwogICogJ3NpemUnIGlzIHNwZWNpZmllZCBpbiBieXRlcy4KICAqICdkYXRhJyBpcyBhIHBvaW50ZXIgdG8gYSBwcmUtYWxsb2NhdGVkIGFycmF5IG9mIGludGVnZXJzIGxhcmdlCiAgKiBlbm91Z2ggdG8gaG9sZCAnc2l6ZScgYnl0ZXMgKHdpdGggNCBieXRlcyB0byBlYWNoIGludGVnZXIpCiAgKi8KLXN0YXRpYyBpbnQgY3AyMTAxX2dldF9jb25maWcoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdTggcmVxdWVzdCwKK3N0YXRpYyBpbnQgY3AyMTB4X2dldF9jb25maWcoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdTggcmVxdWVzdCwKIAkJdW5zaWduZWQgaW50ICpkYXRhLCBpbnQgc2l6ZSkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwpAQCAtMjExLDkgKzIzNCw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIEZvciBnZXQgcmVxdWVzdHMsIHRoZSByZXF1ZXN0IG51bWJlciBtdXN0IGJlIGluY3JlbWVudGVkICovCi0JcmVxdWVzdCsrOwotCiAJLyogSXNzdWUgdGhlIHJlcXVlc3QsIGF0dGVtcHRpbmcgdG8gcmVhZCAnc2l6ZScgYnl0ZXMgKi8KIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCiAJCQkJcmVxdWVzdCwgUkVRVFlQRV9ERVZJQ0VfVE9fSE9TVCwgMHgwMDAwLApAQCAtMjM2LDEyICsyNTYsMTIgQEAKIH0KIAogLyoKLSAqIGNwMjEwMV9zZXRfY29uZmlnCi0gKiBXcml0ZXMgdG8gdGhlIENQMjEwMSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworICogY3AyMTB4X3NldF9jb25maWcKKyAqIFdyaXRlcyB0byB0aGUgQ1AyMTB4IGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCiAgKiBWYWx1ZXMgbGVzcyB0aGFuIDE2IGJpdHMgd2lkZSBhcmUgc2VudCBkaXJlY3RseQogICogJ3NpemUnIGlzIHNwZWNpZmllZCBpbiBieXRlcy4KICAqLwotc3RhdGljIGludCBjcDIxMDFfc2V0X2NvbmZpZyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCB1OCByZXF1ZXN0LAorc3RhdGljIGludCBjcDIxMHhfc2V0X2NvbmZpZyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCB1OCByZXF1ZXN0LAogCQl1bnNpZ25lZCBpbnQgKmRhdGEsIGludCBzaXplKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CkBAIC0yOTIsMjEgKzMxMiwyMSBAQAogfQogCiAvKgotICogY3AyMTAxX3NldF9jb25maWdfc2luZ2xlCi0gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY2FsbGluZyBjcDIxMDFfc2V0X2NvbmZpZyBvbiBzaW5nbGUgZGF0YSB2YWx1ZXMKKyAqIGNwMjEweF9zZXRfY29uZmlnX3NpbmdsZQorICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGNhbGxpbmcgY3AyMTB4X3NldF9jb25maWcgb24gc2luZ2xlIGRhdGEgdmFsdWVzCiAgKiB3aXRob3V0IHJlcXVpcmluZyBhbiBpbnRlZ2VyIHBvaW50ZXIKICAqLwotc3RhdGljIGlubGluZSBpbnQgY3AyMTAxX3NldF9jb25maWdfc2luZ2xlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCitzdGF0aWMgaW5saW5lIGludCBjcDIxMHhfc2V0X2NvbmZpZ19zaW5nbGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJdTggcmVxdWVzdCwgdW5zaWduZWQgaW50IGRhdGEpCiB7Ci0JcmV0dXJuIGNwMjEwMV9zZXRfY29uZmlnKHBvcnQsIHJlcXVlc3QsICZkYXRhLCAyKTsKKwlyZXR1cm4gY3AyMTB4X3NldF9jb25maWcocG9ydCwgcmVxdWVzdCwgJmRhdGEsIDIpOwogfQogCiAvKgotICogY3AyMTAxX3F1YW50aXNlX2JhdWRyYXRlCisgKiBjcDIxMHhfcXVhbnRpc2VfYmF1ZHJhdGUKICAqIFF1YW50aXNlcyB0aGUgYmF1ZCByYXRlIGFzIHBlciBBTjIwNSBUYWJsZSAxCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3AyMTAxX3F1YW50aXNlX2JhdWRyYXRlKHVuc2lnbmVkIGludCBiYXVkKSB7CitzdGF0aWMgdW5zaWduZWQgaW50IGNwMjEweF9xdWFudGlzZV9iYXVkcmF0ZSh1bnNpZ25lZCBpbnQgYmF1ZCkgewogCWlmICAgICAgKGJhdWQgPD0gNTYpICAgICAgIGJhdWQgPSAwOwogCWVsc2UgaWYgKGJhdWQgPD0gMzAwKSAgICAgIGJhdWQgPSAzMDA7CiAJZWxzZSBpZiAoYmF1ZCA8PSA2MDApICAgICAgYmF1ZCA9IDYwMDsKQEAgLTM0Myw3ICszNjMsNyBAQAogCXJldHVybiBiYXVkOwogfQogCi1zdGF0aWMgaW50IGNwMjEwMV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCitzdGF0aWMgaW50IGNwMjEweF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQkJc3RydWN0IGZpbGUgKmZpbHApCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKQEAgLTM1MSw3ICszNzEsNyBAQAogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCWlmIChjcDIxMDFfc2V0X2NvbmZpZ19zaW5nbGUocG9ydCwgQ1AyMTAxX1VBUlQsIFVBUlRfRU5BQkxFKSkgeworCWlmIChjcDIxMHhfc2V0X2NvbmZpZ19zaW5nbGUocG9ydCwgQ1AyMTBYX0lGQ19FTkFCTEUsIFVBUlRfRU5BQkxFKSkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIFVuYWJsZSB0byBlbmFibGUgVUFSVFxuIiwKIAkJCQlfX2Z1bmNfXyk7CiAJCXJldHVybiAtRVBST1RPOwpAQCAtMzczLDE3ICszOTMsMTcgQEAKIAl9CiAKIAkvKiBDb25maWd1cmUgdGhlIHRlcm1pb3Mgc3RydWN0dXJlICovCi0JY3AyMTAxX2dldF90ZXJtaW9zKHR0eSwgcG9ydCk7CisJY3AyMTB4X2dldF90ZXJtaW9zKHR0eSwgcG9ydCk7CiAKIAkvKiBTZXQgdGhlIERUUiBhbmQgUlRTIHBpbnMgbG93ICovCi0JY3AyMTAxX3Rpb2Ntc2V0X3BvcnQodHR5ID8gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdHR5LT5kcml2ZXJfZGF0YQorCWNwMjEweF90aW9jbXNldF9wb3J0KHR0eSA/IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopIHR0eS0+ZHJpdmVyX2RhdGEKIAkJCTogcG9ydCwKIAkJTlVMTCwgVElPQ01fRFRSIHwgVElPQ01fUlRTLCAwKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjcDIxMDFfY2xlYW51cChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQorc3RhdGljIHZvaWQgY3AyMTB4X2NsZWFudXAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCkBAIC0zOTgsOCArNDE4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGNwMjEwMV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIGNwMjEweF9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTQxMCwyMyArNDI5LDIzIEBACiAKIAltdXRleF9sb2NrKCZwb3J0LT5zZXJpYWwtPmRpc2NfbXV0ZXgpOwogCWlmICghcG9ydC0+c2VyaWFsLT5kaXNjb25uZWN0ZWQpCi0JCWNwMjEwMV9zZXRfY29uZmlnX3NpbmdsZShwb3J0LCBDUDIxMDFfVUFSVCwgVUFSVF9ESVNBQkxFKTsKKwkJY3AyMTB4X3NldF9jb25maWdfc2luZ2xlKHBvcnQsIENQMjEwWF9JRkNfRU5BQkxFLCBVQVJUX0RJU0FCTEUpOwogCW11dGV4X3VubG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKIH0KIAogLyoKLSAqIGNwMjEwMV9nZXRfdGVybWlvcworICogY3AyMTB4X2dldF90ZXJtaW9zCiAgKiBSZWFkcyB0aGUgYmF1ZCByYXRlLCBkYXRhIGJpdHMsIHBhcml0eSwgc3RvcCBiaXRzIGFuZCBmbG93IGNvbnRyb2wgbW9kZQogICogZnJvbSB0aGUgZGV2aWNlLCBjb3JyZWN0cyBhbnkgdW5zdXBwb3J0ZWQgdmFsdWVzLCBhbmQgY29uZmlndXJlcyB0aGUKICAqIHRlcm1pb3Mgc3RydWN0dXJlIHRvIHJlZmxlY3QgdGhlIHN0YXRlIG9mIHRoZSBkZXZpY2UKICAqLwotc3RhdGljIHZvaWQgY3AyMTAxX2dldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCitzdGF0aWMgdm9pZCBjcDIxMHhfZ2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXVuc2lnbmVkIGludCBiYXVkOwogCiAJaWYgKHR0eSkgewotCQljcDIxMDFfZ2V0X3Rlcm1pb3NfcG9ydCh0dHktPmRyaXZlcl9kYXRhLAorCQljcDIxMHhfZ2V0X3Rlcm1pb3NfcG9ydCh0dHktPmRyaXZlcl9kYXRhLAogCQkJJnR0eS0+dGVybWlvcy0+Y19jZmxhZywgJmJhdWQpOwogCQl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWQsIGJhdWQpOwogCX0KQEAgLTQzNCwxNSArNDUzLDE1IEBACiAJZWxzZSB7CiAJCXVuc2lnbmVkIGludCBjZmxhZzsKIAkJY2ZsYWcgPSAwOwotCQljcDIxMDFfZ2V0X3Rlcm1pb3NfcG9ydChwb3J0LCAmY2ZsYWcsICZiYXVkKTsKKwkJY3AyMTB4X2dldF90ZXJtaW9zX3BvcnQocG9ydCwgJmNmbGFnLCAmYmF1ZCk7CiAJfQogfQogCiAvKgotICogY3AyMTAxX2dldF90ZXJtaW9zX3BvcnQKLSAqIFRoaXMgaXMgdGhlIGhlYXJ0IG9mIGNwMjEwMV9nZXRfdGVybWlvcyB3aGljaCBhbHdheXMgdXNlcyBhICZ1c2Jfc2VyaWFsX3BvcnQuCisgKiBjcDIxMHhfZ2V0X3Rlcm1pb3NfcG9ydAorICogVGhpcyBpcyB0aGUgaGVhcnQgb2YgY3AyMTB4X2dldF90ZXJtaW9zIHdoaWNoIGFsd2F5cyB1c2VzIGEgJnVzYl9zZXJpYWxfcG9ydC4KICAqLwotc3RhdGljIHZvaWQgY3AyMTAxX2dldF90ZXJtaW9zX3BvcnQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKK3N0YXRpYyB2b2lkIGNwMjEweF9nZXRfdGVybWlvc19wb3J0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJdW5zaWduZWQgaW50ICpjZmxhZ3AsIHVuc2lnbmVkIGludCAqYmF1ZHApCiB7CiAJdW5zaWduZWQgaW50IGNmbGFnLCBtb2RlbV9jdGxbNF07CkBAIC00NTEsMTcgKzQ3MCwxNyBAQAogCiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCWNwMjEwMV9nZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CQVVEUkFURSwgJmJhdWQsIDIpOworCWNwMjEweF9nZXRfY29uZmlnKHBvcnQsIENQMjEwWF9HRVRfQkFVRERJViwgJmJhdWQsIDIpOwogCS8qIENvbnZlcnQgdG8gYmF1ZHJhdGUgKi8KIAlpZiAoYmF1ZCkKLQkJYmF1ZCA9IGNwMjEwMV9xdWFudGlzZV9iYXVkcmF0ZSgoQkFVRF9SQVRFX0dFTl9GUkVRICsgYmF1ZC8yKS8gYmF1ZCk7CisJCWJhdWQgPSBjcDIxMHhfcXVhbnRpc2VfYmF1ZHJhdGUoKEJBVURfUkFURV9HRU5fRlJFUSArIGJhdWQvMikvIGJhdWQpOwogCiAJZGJnKCIlcyAtIGJhdWQgcmF0ZSA9ICVkIiwgX19mdW5jX18sIGJhdWQpOwogCSpiYXVkcCA9IGJhdWQ7CiAKIAljZmxhZyA9ICpjZmxhZ3A7CiAKLQljcDIxMDFfZ2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQklUUywgJmJpdHMsIDIpOworCWNwMjEweF9nZXRfY29uZmlnKHBvcnQsIENQMjEwWF9HRVRfTElORV9DVEwsICZiaXRzLCAyKTsKIAljZmxhZyAmPSB+Q1NJWkU7CiAJc3dpdGNoIChiaXRzICYgQklUU19EQVRBX01BU0spIHsKIAljYXNlIEJJVFNfREFUQV81OgpAQCAtNDg2LDE0ICs1MDUsMTQgQEAKIAkJY2ZsYWcgfD0gQ1M4OwogCQliaXRzICY9IH5CSVRTX0RBVEFfTUFTSzsKIAkJYml0cyB8PSBCSVRTX0RBVEFfODsKLQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKKwkJY3AyMTB4X3NldF9jb25maWcocG9ydCwgQ1AyMTBYX1NFVF9MSU5FX0NUTCwgJmJpdHMsIDIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkYmcoIiVzIC0gVW5rbm93biBudW1iZXIgb2YgZGF0YSBiaXRzLCB1c2luZyA4IiwgX19mdW5jX18pOwogCQljZmxhZyB8PSBDUzg7CiAJCWJpdHMgJj0gfkJJVFNfREFUQV9NQVNLOwogCQliaXRzIHw9IEJJVFNfREFUQV84OwotCQljcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQklUUywgJmJpdHMsIDIpOworCQljcDIxMHhfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMFhfU0VUX0xJTkVfQ1RMLCAmYml0cywgMik7CiAJCWJyZWFrOwogCX0KIApAQCAtNTE2LDIwICs1MzUsMjAgQEAKIAkJCQlfX2Z1bmNfXyk7CiAJCWNmbGFnICY9IH5QQVJFTkI7CiAJCWJpdHMgJj0gfkJJVFNfUEFSSVRZX01BU0s7Ci0JCWNwMjEwMV9zZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CSVRTLCAmYml0cywgMik7CisJCWNwMjEweF9zZXRfY29uZmlnKHBvcnQsIENQMjEwWF9TRVRfTElORV9DVEwsICZiaXRzLCAyKTsKIAkJYnJlYWs7CiAJY2FzZSBCSVRTX1BBUklUWV9TUEFDRToKIAkJZGJnKCIlcyAtIHBhcml0eSA9IFNQQUNFIChub3Qgc3VwcG9ydGVkLCBkaXNhYmxpbmcgcGFyaXR5KSIsCiAJCQkJX19mdW5jX18pOwogCQljZmxhZyAmPSB+UEFSRU5COwogCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwotCQljcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQklUUywgJmJpdHMsIDIpOworCQljcDIxMHhfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMFhfU0VUX0xJTkVfQ1RMLCAmYml0cywgMik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRiZygiJXMgLSBVbmtub3duIHBhcml0eSBtb2RlLCBkaXNhYmxpbmcgcGFyaXR5IiwgX19mdW5jX18pOwogCQljZmxhZyAmPSB+UEFSRU5COwogCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwotCQljcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQklUUywgJmJpdHMsIDIpOworCQljcDIxMHhfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMFhfU0VUX0xJTkVfQ1RMLCAmYml0cywgMik7CiAJCWJyZWFrOwogCX0KIApAQCAtNTQyLDcgKzU2MSw3IEBACiAJCWRiZygiJXMgLSBzdG9wIGJpdHMgPSAxLjUgKG5vdCBzdXBwb3J0ZWQsIHVzaW5nIDEgc3RvcCBiaXQpIiwKIAkJCQkJCQkJX19mdW5jX18pOwogCQliaXRzICY9IH5CSVRTX1NUT1BfTUFTSzsKLQkJY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKKwkJY3AyMTB4X3NldF9jb25maWcocG9ydCwgQ1AyMTBYX1NFVF9MSU5FX0NUTCwgJmJpdHMsIDIpOwogCQlicmVhazsKIAljYXNlIEJJVFNfU1RPUF8yOgogCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fZnVuY19fKTsKQEAgLTU1MiwxMSArNTcxLDExIEBACiAJCWRiZygiJXMgLSBVbmtub3duIG51bWJlciBvZiBzdG9wIGJpdHMsIHVzaW5nIDEgc3RvcCBiaXQiLAogCQkJCQkJCQlfX2Z1bmNfXyk7CiAJCWJpdHMgJj0gfkJJVFNfU1RPUF9NQVNLOwotCQljcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQklUUywgJmJpdHMsIDIpOworCQljcDIxMHhfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMFhfU0VUX0xJTkVfQ1RMLCAmYml0cywgMik7CiAJCWJyZWFrOwogCX0KIAotCWNwMjEwMV9nZXRfY29uZmlnKHBvcnQsIENQMjEwMV9NT0RFTUNUTCwgbW9kZW1fY3RsLCAxNik7CisJY3AyMTB4X2dldF9jb25maWcocG9ydCwgQ1AyMTBYX0dFVF9GTE9XLCBtb2RlbV9jdGwsIDE2KTsKIAlpZiAobW9kZW1fY3RsWzBdICYgMHgwMDA4KSB7CiAJCWRiZygiJXMgLSBmbG93IGNvbnRyb2wgPSBDUlRTQ1RTIiwgX19mdW5jX18pOwogCQljZmxhZyB8PSBDUlRTQ1RTOwpAQCAtNTY4LDcgKzU4Nyw3IEBACiAJKmNmbGFncCA9IGNmbGFnOwogfQogCi1zdGF0aWMgdm9pZCBjcDIxMDFfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKK3N0YXRpYyB2b2lkIGNwMjEweF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewogCXVuc2lnbmVkIGludCBjZmxhZywgb2xkX2NmbGFnOwpAQCAtNTgzLDEzICs2MDIsMTMgQEAKIAl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJj0gfkNNU1BBUjsKIAljZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAlvbGRfY2ZsYWcgPSBvbGRfdGVybWlvcy0+Y19jZmxhZzsKLQliYXVkID0gY3AyMTAxX3F1YW50aXNlX2JhdWRyYXRlKHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSkpOworCWJhdWQgPSBjcDIxMHhfcXVhbnRpc2VfYmF1ZHJhdGUodHR5X2dldF9iYXVkX3JhdGUodHR5KSk7CiAKIAkvKiBJZiB0aGUgYmF1ZCByYXRlIGlzIHRvIGJlIHVwZGF0ZWQqLwogCWlmIChiYXVkICE9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShvbGRfdGVybWlvcykgJiYgYmF1ZCAhPSAwKSB7CiAJCWRiZygiJXMgLSBTZXR0aW5nIGJhdWQgcmF0ZSB0byAlZCBiYXVkIiwgX19mdW5jX18sCiAJCQkJYmF1ZCk7Ci0JCWlmIChjcDIxMDFfc2V0X2NvbmZpZ19zaW5nbGUocG9ydCwgQ1AyMTAxX0JBVURSQVRFLAorCQlpZiAoY3AyMTB4X3NldF9jb25maWdfc2luZ2xlKHBvcnQsIENQMjEwWF9TRVRfQkFVRERJViwKIAkJCQkJKChCQVVEX1JBVEVfR0VOX0ZSRVEgKyBiYXVkLzIpIC8gYmF1ZCkpKSB7CiAJCQlkYmcoIkJhdWQgcmF0ZSByZXF1ZXN0ZWQgbm90IHN1cHBvcnRlZCBieSBkZXZpY2VcbiIpOwogCQkJYmF1ZCA9IHR0eV90ZXJtaW9zX2JhdWRfcmF0ZShvbGRfdGVybWlvcyk7CkBAIC02MDAsNyArNjE5LDcgQEAKIAogCS8qIElmIHRoZSBudW1iZXIgb2YgZGF0YSBiaXRzIGlzIHRvIGJlIHVwZGF0ZWQgKi8KIAlpZiAoKGNmbGFnICYgQ1NJWkUpICE9IChvbGRfY2ZsYWcgJiBDU0laRSkpIHsKLQkJY3AyMTAxX2dldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKKwkJY3AyMTB4X2dldF9jb25maWcocG9ydCwgQ1AyMTBYX0dFVF9MSU5FX0NUTCwgJmJpdHMsIDIpOwogCQliaXRzICY9IH5CSVRTX0RBVEFfTUFTSzsKIAkJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CiAJCWNhc2UgQ1M1OgpAQCAtNjI0LDE5ICs2NDMsMTkgQEAKIAkJCWRiZygiJXMgLSBkYXRhIGJpdHMgPSA5IiwgX19mdW5jX18pOwogCQkJYnJlYWs7Ki8KIAkJZGVmYXVsdDoKLQkJCWRiZygiY3AyMTAxIGRyaXZlciBkb2VzIG5vdCAiCisJCQlkYmcoImNwMjEweCBkcml2ZXIgZG9lcyBub3QgIgogCQkJCQkic3VwcG9ydCB0aGUgbnVtYmVyIG9mIGJpdHMgcmVxdWVzdGVkLCIKIAkJCQkJIiB1c2luZyA4IGJpdCBtb2RlXG4iKTsKIAkJCQliaXRzIHw9IEJJVFNfREFUQV84OwogCQkJCWJyZWFrOwogCQl9Ci0JCWlmIChjcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQklUUywgJmJpdHMsIDIpKQorCQlpZiAoY3AyMTB4X3NldF9jb25maWcocG9ydCwgQ1AyMTBYX1NFVF9MSU5FX0NUTCwgJmJpdHMsIDIpKQogCQkJZGJnKCJOdW1iZXIgb2YgZGF0YSBiaXRzIHJlcXVlc3RlZCAiCiAJCQkJCSJub3Qgc3VwcG9ydGVkIGJ5IGRldmljZVxuIik7CiAJfQogCiAJaWYgKChjZmxhZyAmIChQQVJFTkJ8UEFST0REKSkgIT0gKG9sZF9jZmxhZyAmIChQQVJFTkJ8UEFST0REKSkpIHsKLQkJY3AyMTAxX2dldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKTsKKwkJY3AyMTB4X2dldF9jb25maWcocG9ydCwgQ1AyMTBYX0dFVF9MSU5FX0NUTCwgJmJpdHMsIDIpOwogCQliaXRzICY9IH5CSVRTX1BBUklUWV9NQVNLOwogCQlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKIAkJCWlmIChjZmxhZyAmIFBBUk9ERCkgewpAQCAtNjQ3LDEzICs2NjYsMTMgQEAKIAkJCQlkYmcoIiVzIC0gcGFyaXR5ID0gRVZFTiIsIF9fZnVuY19fKTsKIAkJCX0KIAkJfQotCQlpZiAoY3AyMTAxX3NldF9jb25maWcocG9ydCwgQ1AyMTAxX0JJVFMsICZiaXRzLCAyKSkKKwkJaWYgKGNwMjEweF9zZXRfY29uZmlnKHBvcnQsIENQMjEwWF9TRVRfTElORV9DVEwsICZiaXRzLCAyKSkKIAkJCWRiZygiUGFyaXR5IG1vZGUgbm90IHN1cHBvcnRlZCAiCiAJCQkJCSJieSBkZXZpY2VcbiIpOwogCX0KIAogCWlmICgoY2ZsYWcgJiBDU1RPUEIpICE9IChvbGRfY2ZsYWcgJiBDU1RPUEIpKSB7Ci0JCWNwMjEwMV9nZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CSVRTLCAmYml0cywgMik7CisJCWNwMjEweF9nZXRfY29uZmlnKHBvcnQsIENQMjEwWF9HRVRfTElORV9DVEwsICZiaXRzLCAyKTsKIAkJYml0cyAmPSB+QklUU19TVE9QX01BU0s7CiAJCWlmIChjZmxhZyAmIENTVE9QQikgewogCQkJYml0cyB8PSBCSVRTX1NUT1BfMjsKQEAgLTY2MiwxMyArNjgxLDEzIEBACiAJCQliaXRzIHw9IEJJVFNfU1RPUF8xOwogCQkJZGJnKCIlcyAtIHN0b3AgYml0cyA9IDEiLCBfX2Z1bmNfXyk7CiAJCX0KLQkJaWYgKGNwMjEwMV9zZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CSVRTLCAmYml0cywgMikpCisJCWlmIChjcDIxMHhfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMFhfU0VUX0xJTkVfQ1RMLCAmYml0cywgMikpCiAJCQlkYmcoIk51bWJlciBvZiBzdG9wIGJpdHMgcmVxdWVzdGVkICIKIAkJCQkJIm5vdCBzdXBwb3J0ZWQgYnkgZGV2aWNlXG4iKTsKIAl9CiAKIAlpZiAoKGNmbGFnICYgQ1JUU0NUUykgIT0gKG9sZF9jZmxhZyAmIENSVFNDVFMpKSB7Ci0JCWNwMjEwMV9nZXRfY29uZmlnKHBvcnQsIENQMjEwMV9NT0RFTUNUTCwgbW9kZW1fY3RsLCAxNik7CisJCWNwMjEweF9nZXRfY29uZmlnKHBvcnQsIENQMjEwWF9HRVRfRkxPVywgbW9kZW1fY3RsLCAxNik7CiAJCWRiZygiJXMgLSByZWFkIG1vZGVtIGNvbnRyb2xzID0gMHglLjR4IDB4JS40eCAweCUuNHggMHglLjR4IiwKIAkJCQlfX2Z1bmNfXywgbW9kZW1fY3RsWzBdLCBtb2RlbV9jdGxbMV0sCiAJCQkJbW9kZW1fY3RsWzJdLCBtb2RlbV9jdGxbM10pOwpAQCAtNjg4LDE5ICs3MDcsMTkgQEAKIAkJZGJnKCIlcyAtIHdyaXRlIG1vZGVtIGNvbnRyb2xzID0gMHglLjR4IDB4JS40eCAweCUuNHggMHglLjR4IiwKIAkJCQlfX2Z1bmNfXywgbW9kZW1fY3RsWzBdLCBtb2RlbV9jdGxbMV0sCiAJCQkJbW9kZW1fY3RsWzJdLCBtb2RlbV9jdGxbM10pOwotCQljcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfTU9ERU1DVEwsIG1vZGVtX2N0bCwgMTYpOworCQljcDIxMHhfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMFhfU0VUX0ZMT1csIG1vZGVtX2N0bCwgMTYpOwogCX0KIAogfQogCi1zdGF0aWMgaW50IGNwMjEwMV90aW9jbXNldCAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCitzdGF0aWMgaW50IGNwMjEweF90aW9jbXNldCAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKLQlyZXR1cm4gY3AyMTAxX3Rpb2Ntc2V0X3BvcnQocG9ydCwgZmlsZSwgc2V0LCBjbGVhcik7CisJcmV0dXJuIGNwMjEweF90aW9jbXNldF9wb3J0KHBvcnQsIGZpbGUsIHNldCwgY2xlYXIpOwogfQogCi1zdGF0aWMgaW50IGNwMjEwMV90aW9jbXNldF9wb3J0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGludCBjcDIxMHhfdGlvY21zZXRfcG9ydChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQogewogCXVuc2lnbmVkIGludCBjb250cm9sID0gMDsKQEAgLTcyNiwxMCArNzQ1LDEwIEBACiAKIAlkYmcoIiVzIC0gY29udHJvbCA9IDB4JS40eCIsIF9fZnVuY19fLCBjb250cm9sKTsKIAotCXJldHVybiBjcDIxMDFfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQ09OVFJPTCwgJmNvbnRyb2wsIDIpOworCXJldHVybiBjcDIxMHhfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMFhfU0VUX01IUywgJmNvbnRyb2wsIDIpOwogfQogCi1zdGF0aWMgaW50IGNwMjEwMV90aW9jbWdldCAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IGNwMjEweF90aW9jbWdldCAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgaW50IGNvbnRyb2w7CkBAIC03MzcsNyArNzU2LDcgQEAKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKLQljcDIxMDFfZ2V0X2NvbmZpZyhwb3J0LCBDUDIxMDFfQ09OVFJPTCwgJmNvbnRyb2wsIDEpOworCWNwMjEweF9nZXRfY29uZmlnKHBvcnQsIENQMjEwWF9HRVRfTURNU1RTLCAmY29udHJvbCwgMSk7CiAKIAlyZXN1bHQgPSAoKGNvbnRyb2wgJiBDT05UUk9MX0RUUikgPyBUSU9DTV9EVFIgOiAwKQogCQl8KChjb250cm9sICYgQ09OVFJPTF9SVFMpID8gVElPQ01fUlRTIDogMCkKQEAgLTc1MSw3ICs3NzAsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNwMjEwMV9icmVha19jdGwgKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKK3N0YXRpYyB2b2lkIGNwMjEweF9icmVha19jdGwgKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CkBAIC03NjMsMTcgKzc4MiwxNyBAQAogCQlzdGF0ZSA9IEJSRUFLX09OOwogCWRiZygiJXMgLSB0dXJuaW5nIGJyZWFrICVzIiwgX19mdW5jX18sCiAJCQlzdGF0ZSA9PSBCUkVBS19PRkYgPyAib2ZmIiA6ICJvbiIpOwotCWNwMjEwMV9zZXRfY29uZmlnKHBvcnQsIENQMjEwMV9CUkVBSywgJnN0YXRlLCAyKTsKKwljcDIxMHhfc2V0X2NvbmZpZyhwb3J0LCBDUDIxMFhfU0VUX0JSRUFLLCAmc3RhdGUsIDIpOwogfQogCi1zdGF0aWMgaW50IGNwMjEwMV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCitzdGF0aWMgaW50IGNwMjEweF9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JLyogQ1AyMTAxIGJ1ZmZlcnMgYmVoYXZlIHN0cmFuZ2VseSB1bmxlc3MgZGV2aWNlIGlzIHJlc2V0ICovCisJLyogY3AyMTB4IGJ1ZmZlcnMgYmVoYXZlIHN0cmFuZ2VseSB1bmxlc3MgZGV2aWNlIGlzIHJlc2V0ICovCiAJdXNiX3Jlc2V0X2RldmljZShzZXJpYWwtPmRldik7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNwMjEwMV9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQorc3RhdGljIHZvaWQgY3AyMTB4X3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJaW50IGk7CiAKQEAgLTc4MSwyMSArODAwLDIxIEBACiAKIAkvKiBTdG9wIHJlYWRzIGFuZCB3cml0ZXMgb24gYWxsIHBvcnRzICovCiAJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyArK2kpCi0JCWNwMjEwMV9jbGVhbnVwKHNlcmlhbC0+cG9ydFtpXSk7CisJCWNwMjEweF9jbGVhbnVwKHNlcmlhbC0+cG9ydFtpXSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGNwMjEwMV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBjcDIxMHhfaW5pdCh2b2lkKQogewogCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZjcDIxMDFfZGV2aWNlKTsKKwlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZjcDIxMHhfZGV2aWNlKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOyAvKiBGYWlsZWQgdG8gcmVnaXN0ZXIgKi8KIAotCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmY3AyMTAxX2RyaXZlcik7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZjcDIxMHhfZHJpdmVyKTsKIAlpZiAocmV0dmFsKSB7CiAJCS8qIEZhaWxlZCB0byByZWdpc3RlciAqLwotCQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmNwMjEwMV9kZXZpY2UpOworCQl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmNwMjEweF9kZXZpY2UpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIApAQCAtODA1LDE0ICs4MjQsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGNwMjEwMV9leGl0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgY3AyMTB4X2V4aXQodm9pZCkKIHsKLQl1c2JfZGVyZWdpc3RlcigmY3AyMTAxX2RyaXZlcik7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZjcDIxMDFfZGV2aWNlKTsKKwl1c2JfZGVyZWdpc3RlcigmY3AyMTB4X2RyaXZlcik7CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZjcDIxMHhfZGV2aWNlKTsKIH0KIAotbW9kdWxlX2luaXQoY3AyMTAxX2luaXQpOwotbW9kdWxlX2V4aXQoY3AyMTAxX2V4aXQpOworbW9kdWxlX2luaXQoY3AyMTB4X2luaXQpOworbW9kdWxlX2V4aXQoY3AyMTB4X2V4aXQpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5YmVyamFjay5jCmluZGV4IGRkNTAxYmIuLjkzM2JhOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9jeWJlcmphY2suYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3liZXJqYWNrLmMKQEAgLTYxLDggKzYxLDcgQEAKIHN0YXRpYyB2b2lkIGN5YmVyamFja19zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKIHN0YXRpYyBpbnQgIGN5YmVyamFja19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgdm9pZCBjeWJlcmphY2tfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIGN5YmVyamFja19jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyBpbnQgY3liZXJqYWNrX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwogc3RhdGljIGludCBjeWJlcmphY2tfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKQEAgLTE4NSw4ICsxODQsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIGN5YmVyamFja19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBjeWJlcmphY2tfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYwppbmRleCBlNTY4NzEwLi42NjlmOTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKQEAgLTE3NCw4ICsxNzQsOCBAQAogc3RhdGljIHZvaWQgY3lwcmVzc19zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKIHN0YXRpYyBpbnQgIGN5cHJlc3Nfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgY3lwcmVzc19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgY3lwcmVzc19jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGN5cHJlc3NfZHRyX3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pOwogc3RhdGljIGludCAgY3lwcmVzc193cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwogc3RhdGljIHZvaWQgY3lwcmVzc19zZW5kKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwpAQCAtMjE4LDYgKzIxOCw3IEBACiAJLnNodXRkb3duID0JCQljeXByZXNzX3NodXRkb3duLAogCS5vcGVuID0JCQkJY3lwcmVzc19vcGVuLAogCS5jbG9zZSA9CQkJY3lwcmVzc19jbG9zZSwKKwkuZHRyX3J0cyA9CQkJY3lwcmVzc19kdHJfcnRzLAogCS53cml0ZSA9CQkJY3lwcmVzc193cml0ZSwKIAkud3JpdGVfcm9vbSA9CQkJY3lwcmVzc193cml0ZV9yb29tLAogCS5pb2N0bCA9CQkJY3lwcmVzc19pb2N0bCwKQEAgLTI0NCw2ICsyNDUsNyBAQAogCS5zaHV0ZG93biA9CQkJY3lwcmVzc19zaHV0ZG93biwKIAkub3BlbiA9CQkJCWN5cHJlc3Nfb3BlbiwKIAkuY2xvc2UgPQkJCWN5cHJlc3NfY2xvc2UsCisJLmR0cl9ydHMgPQkJCWN5cHJlc3NfZHRyX3J0cywKIAkud3JpdGUgPQkJCWN5cHJlc3Nfd3JpdGUsCiAJLndyaXRlX3Jvb20gPQkJCWN5cHJlc3Nfd3JpdGVfcm9vbSwKIAkuaW9jdGwgPQkJCWN5cHJlc3NfaW9jdGwsCkBAIC0yNzAsNiArMjcyLDcgQEAKIAkuc2h1dGRvd24gPQkJCWN5cHJlc3Nfc2h1dGRvd24sCiAJLm9wZW4gPQkJCQljeXByZXNzX29wZW4sCiAJLmNsb3NlID0JCQljeXByZXNzX2Nsb3NlLAorCS5kdHJfcnRzID0JCQljeXByZXNzX2R0cl9ydHMsCiAJLndyaXRlID0JCQljeXByZXNzX3dyaXRlLAogCS53cml0ZV9yb29tID0JCQljeXByZXNzX3dyaXRlX3Jvb20sCiAJLmlvY3RsID0JCQljeXByZXNzX2lvY3RsLApAQCAtNjU2LDExICs2NTksNyBAQAogCXByaXYtPnJ4X2ZsYWdzID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQkvKiByYWlzZSBib3RoIGxpbmVzIGFuZCBzZXQgdGVybWlvcyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+bGluZV9jb250cm9sID0gQ09OVFJPTF9EVFIgfCBDT05UUk9MX1JUUzsKLQlwcml2LT5jbWRfY3RybCA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCS8qIFNldCB0ZXJtaW9zICovCiAJcmVzdWx0ID0gY3lwcmVzc193cml0ZSh0dHksIHBvcnQsIE5VTEwsIDApOwogCiAJaWYgKHJlc3VsdCkgewpAQCAtNjk0LDc2ICs2OTMsNDIgQEAKIAkJCQkJCQlfX2Z1bmNfXywgcmVzdWx0KTsKIAkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAl9Ci0KKwlwb3J0LT5wb3J0LmRyYWluX2RlbGF5ID0gMjU2OwogCXJldHVybiByZXN1bHQ7CiB9IC8qIGN5cHJlc3Nfb3BlbiAqLwogCi0KLXN0YXRpYyB2b2lkIGN5cHJlc3NfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgY3lwcmVzc19kdHJfcnRzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBvbikKIHsKIAlzdHJ1Y3QgY3lwcmVzc19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXVuc2lnbmVkIGludCBjX2NmbGFnOwotCWludCBicHM7Ci0JbG9uZyB0aW1lb3V0OwotCXdhaXRfcXVldWVfdCB3YWl0OworCS8qIGRyb3AgZHRyIGFuZCBydHMgKi8KKwlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCWlmIChvbiA9PSAwKQorCQlwcml2LT5saW5lX2NvbnRyb2wgPSAwOworCWVsc2UgCisJCXByaXYtPmxpbmVfY29udHJvbCA9IENPTlRST0xfRFRSIHwgQ09OVFJPTF9SVFM7CisJcHJpdi0+Y21kX2N0cmwgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJY3lwcmVzc193cml0ZShOVUxMLCBwb3J0LCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQgY3lwcmVzc19jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCi0JLyogd2FpdCBmb3IgZGF0YSB0byBkcmFpbiBmcm9tIGJ1ZmZlciAqLwotCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwotCXRpbWVvdXQgPSBDWVBSRVNTX0NMT1NJTkdfV0FJVDsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7Ci0JYWRkX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKGN5cHJlc3NfYnVmX2RhdGFfYXZhaWwocHJpdi0+YnVmKSA9PSAwCi0JCXx8IHRpbWVvdXQgPT0gMCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KQotCQkvKiB3aXRob3V0IG11dGV4LCBhbGxvd2VkIGR1ZSB0byBoYXJtbGVzcyBmYWlsdXJlIG1vZGUgKi8KLQkJfHwgcG9ydC0+c2VyaWFsLT5kaXNjb25uZWN0ZWQpCi0JCQlicmVhazsKLQkJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwotCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKLQkvKiBjbGVhciBvdXQgYW55IHJlbWFpbmluZyBkYXRhIGluIHRoZSBidWZmZXIgKi8KLQljeXByZXNzX2J1Zl9jbGVhcihwcml2LT5idWYpOwotCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7Ci0KIAkvKiB3cml0aW5nIGlzIHBvdGVudGlhbGx5IGhhcm1mdWwsIGxvY2sgbXVzdCBiZSB0YWtlbiAqLwogCW11dGV4X2xvY2soJnBvcnQtPnNlcmlhbC0+ZGlzY19tdXRleCk7CiAJaWYgKHBvcnQtPnNlcmlhbC0+ZGlzY29ubmVjdGVkKSB7CiAJCW11dGV4X3VubG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKIAkJcmV0dXJuOwogCX0KLQkvKiB3YWl0IGZvciBjaGFyYWN0ZXJzIHRvIGRyYWluIGZyb20gZGV2aWNlICovCi0JaWYgKHR0eSkgewotCQlicHMgPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpOwotCQlpZiAoYnBzID4gMTIwMCkKLQkJCXRpbWVvdXQgPSBtYXgoKEhaICogMjU2MCkgLyBicHMsIEhaIC8gMTApOwotCQllbHNlCi0JCQl0aW1lb3V0ID0gMiAqIEhaOwotCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7Ci0JfQotCisJY3lwcmVzc19idWZfY2xlYXIocHJpdi0+YnVmKTsKIAlkYmcoIiVzIC0gc3RvcHBpbmcgdXJicyIsIF9fZnVuY19fKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9vdXRfdXJiKTsKIAotCWlmICh0dHkpIHsKLQkJY19jZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQkJaWYgKGNfY2ZsYWcgJiBIVVBDTCkgewotCQkJLyogZHJvcCBkdHIgYW5kIHJ0cyAqLwotCQkJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQkJCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOwotCQkJcHJpdi0+bGluZV9jb250cm9sID0gMDsKLQkJCXByaXYtPmNtZF9jdHJsID0gMTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7Ci0JCQljeXByZXNzX3dyaXRlKHR0eSwgcG9ydCwgTlVMTCwgMCk7Ci0JCX0KLQl9CiAKIAlpZiAoc3RhdHMpCiAJCWRldl9pbmZvKCZwb3J0LT5kZXYsICJTdGF0aXN0aWNzOiAlZCBCeXRlcyBJbiB8ICVkIEJ5dGVzIE91dCB8ICVkIENvbW1hbmRzIElzc3VlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9kaWdpX2FjY2VsZXBvcnQuYwppbmRleCAzOGJhNGVhLi4zMGY1MTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZGlnaV9hY2NlbGVwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2RpZ2lfYWNjZWxlcG9ydC5jCkBAIC00MjIsNyArNDIyLDYgQEAKIAlpbnQgZHBfdGhyb3R0bGVkOwogCWludCBkcF90aHJvdHRsZV9yZXN0YXJ0OwogCXdhaXRfcXVldWVfaGVhZF90IGRwX2ZsdXNoX3dhaXQ7Ci0JaW50IGRwX2luX2Nsb3NlOwkJCS8qIGNsb3NlIGluIHByb2dyZXNzICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgZHBfY2xvc2Vfd2FpdDsJLyogd2FpdCBxdWV1ZSBmb3IgY2xvc2UgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZHBfd2FrZXVwX3dvcms7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqZHBfcG9ydDsKQEAgLTQ1Niw4ICs0NTUsOSBAQAogc3RhdGljIGludCBkaWdpX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIHN0YXRpYyBpbnQgZGlnaV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgZGlnaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCXN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIGRpZ2lfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CitzdGF0aWMgaW50IGRpZ2lfY2Fycmllcl9yYWlzZWQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBkaWdpX2R0cl9ydHMoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IG9uKTsKIHN0YXRpYyBpbnQgZGlnaV9zdGFydHVwX2RldmljZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKIHN0YXRpYyBpbnQgZGlnaV9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIHZvaWQgZGlnaV9zaHV0ZG93bihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKQEAgLTUxMCw2ICs1MTAsOCBAQAogCS5udW1fcG9ydHMgPQkJCTMsCiAJLm9wZW4gPQkJCQlkaWdpX29wZW4sCiAJLmNsb3NlID0JCQlkaWdpX2Nsb3NlLAorCS5kdHJfcnRzID0JCQlkaWdpX2R0cl9ydHMsCisJLmNhcnJpZXJfcmFpc2VkID0JCWRpZ2lfY2Fycmllcl9yYWlzZWQsCiAJLndyaXRlID0JCQlkaWdpX3dyaXRlLAogCS53cml0ZV9yb29tID0JCQlkaWdpX3dyaXRlX3Jvb20sCiAJLndyaXRlX2J1bGtfY2FsbGJhY2sgPSAJCWRpZ2lfd3JpdGVfYnVsa19jYWxsYmFjaywKQEAgLTEzMjgsNiArMTMzMCwxOSBAQAogCiB9CiAKK3N0YXRpYyB2b2lkIGRpZ2lfZHRyX3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pCit7CisJLyogQWRqdXN0IERUUiBhbmQgUlRTICovCisJZGlnaV9zZXRfbW9kZW1fc2lnbmFscyhwb3J0LCBvbiAqIChUSU9DTV9EVFJ8VElPQ01fUlRTKSwgMSk7Cit9CisKK3N0YXRpYyBpbnQgZGlnaV9jYXJyaWVyX3JhaXNlZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBkaWdpX3BvcnQgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaWYgKHByaXYtPmRwX21vZGVtX3NpZ25hbHMgJiBUSU9DTV9DRCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyBpbnQgZGlnaV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQkJc3RydWN0IGZpbGUgKmZpbHApCkBAIC0xMzM2LDcgKzEzNTEsNiBAQAogCXVuc2lnbmVkIGNoYXIgYnVmWzMyXTsKIAlzdHJ1Y3QgZGlnaV9wb3J0ICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCBrdGVybWlvcyBub3RfdGVybWlvczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAogCWRiZygiZGlnaV9vcGVuOiBUT1A6IHBvcnQ9JWQsIG9wZW5fY291bnQ9JWQiLAogCQlwcml2LT5kcF9wb3J0X251bSwgcG9ydC0+cG9ydC5jb3VudCk7CkBAIC0xMzQ1LDI2ICsxMzU5LDYgQEAKIAlpZiAoZGlnaV9zdGFydHVwX2RldmljZShwb3J0LT5zZXJpYWwpICE9IDApCiAJCXJldHVybiAtRU5YSU87CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBkb24ndCB3YWl0IG9uIGEgY2xvc2UgaW4gcHJvZ3Jlc3MgZm9yIG5vbi1ibG9ja2luZyBvcGVucyAqLwotCWlmIChwcml2LT5kcF9pbl9jbG9zZSAmJiAoZmlscC0+Zl9mbGFncyYoT19OREVMQVl8T19OT05CTE9DSykpID09IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCS8qIHdhaXQgZm9yIGEgY2xvc2UgaW4gcHJvZ3Jlc3MgdG8gZmluaXNoICovCi0Jd2hpbGUgKHByaXYtPmRwX2luX2Nsb3NlKSB7Ci0JCWNvbmRfd2FpdF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXRfaXJxcmVzdG9yZSgKLQkJCSZwcml2LT5kcF9jbG9zZV93YWl0LCBESUdJX1JFVFJZX1RJTUVPVVQsCi0JCQkmcHJpdi0+ZHBfcG9ydF9sb2NrLCBmbGFncyk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5kcF9wb3J0X2xvY2ssIGZsYWdzKTsKLQogCS8qIHJlYWQgbW9kZW0gc2lnbmFscyBhdXRvbWF0aWNhbGx5IHdoZW5ldmVyIHRoZXkgY2hhbmdlICovCiAJYnVmWzBdID0gRElHSV9DTURfUkVBRF9JTlBVVF9TSUdOQUxTOwogCWJ1ZlsxXSA9IHByaXYtPmRwX3BvcnRfbnVtOwpAQCAtMTM4NywxNiArMTM4MSwxMSBAQAogCQlub3RfdGVybWlvcy5jX2lmbGFnID0gfnR0eS0+dGVybWlvcy0+Y19pZmxhZzsKIAkJZGlnaV9zZXRfdGVybWlvcyh0dHksIHBvcnQsICZub3RfdGVybWlvcyk7CiAJfQotCi0JLyogc2V0IERUUiBhbmQgUlRTICovCi0JZGlnaV9zZXRfbW9kZW1fc2lnbmFscyhwb3J0LCBUSU9DTV9EVFJ8VElPQ01fUlRTLCAxKTsKLQogCXJldHVybiAwOwogfQogCiAKLXN0YXRpYyB2b2lkIGRpZ2lfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIGRpZ2lfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAlpbnQgcmV0OwpAQCAtMTQxMSwyOCArMTQwMCw5IEBACiAJaWYgKHBvcnQtPnNlcmlhbC0+ZGlzY29ubmVjdGVkKQogCQlnb3RvIGV4aXQ7CiAKLQkvKiBkbyBjbGVhbnVwIG9ubHkgYWZ0ZXIgZmluYWwgY2xvc2Ugb24gdGhpcyBwb3J0ICovCi0Jc3Bpbl9sb2NrX2lycSgmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKLQlwcml2LT5kcF9pbl9jbG9zZSA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5kcF9wb3J0X2xvY2spOwotCi0JLyogdGVsbCBsaW5lIGRpc2NpcGxpbmUgdG8gcHJvY2VzcyBvbmx5IFhPTi9YT0ZGICovCi0JdHR5LT5jbG9zaW5nID0gMTsKLQotCS8qIHdhaXQgZm9yIG91dHB1dCB0byBkcmFpbiAqLwotCWlmICgoZmlscC0+Zl9mbGFncyYoT19OREVMQVl8T19OT05CTE9DSykpID09IDApCi0JCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCBESUdJX0NMT1NFX1RJTUVPVVQpOwotCi0JLyogZmx1c2ggZHJpdmVyIGFuZCBsaW5lIGRpc2NpcGxpbmUgYnVmZmVycyAqLwotCXR0eV9kcml2ZXJfZmx1c2hfYnVmZmVyKHR0eSk7Ci0JdHR5X2xkaXNjX2ZsdXNoKHR0eSk7Ci0KIAlpZiAocG9ydC0+c2VyaWFsLT5kZXYpIHsKLQkJLyogd2FpdCBmb3IgdHJhbnNtaXQgaWRsZSAqLwotCQlpZiAoKGZpbHAtPmZfZmxhZ3MmKE9fTkRFTEFZfE9fTk9OQkxPQ0spKSA9PSAwKQotCQkJZGlnaV90cmFuc21pdF9pZGxlKHBvcnQsIERJR0lfQ0xPU0VfVElNRU9VVCk7Ci0JCS8qIGRyb3AgRFRSIGFuZCBSVFMgKi8KLQkJZGlnaV9zZXRfbW9kZW1fc2lnbmFscyhwb3J0LCAwLCAwKTsKKwkJLyogRklYTUU6IFRyYW5zbWl0IGlkbGUgYmVsb25ncyBpbiB0aGUgd2FpdF91bnRpX3NlbnQgcGF0aCAqLworCQlkaWdpX3RyYW5zbWl0X2lkbGUocG9ydCwgRElHSV9DTE9TRV9USU1FT1VUKTsKIAogCQkvKiBkaXNhYmxlIGlucHV0IGZsb3cgY29udHJvbCAqLwogCQlidWZbMF0gPSBESUdJX0NNRF9TRVRfSU5QVVRfRkxPV19DT05UUk9MOwpAQCAtMTQ3NywxMSArMTQ0Nyw5IEBACiAJCS8qIHNodXRkb3duIGFueSBvdXRzdGFuZGluZyBidWxrIHdyaXRlcyAqLwogCQl1c2Jfa2lsbF91cmIocG9ydC0+d3JpdGVfdXJiKTsKIAl9Ci0JdHR5LT5jbG9zaW5nID0gMDsKIGV4aXQ6CiAJc3Bpbl9sb2NrX2lycSgmcHJpdi0+ZHBfcG9ydF9sb2NrKTsKIAlwcml2LT5kcF93cml0ZV91cmJfaW5fdXNlID0gMDsKLQlwcml2LT5kcF9pbl9jbG9zZSA9IDA7CiAJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwcml2LT5kcF9jbG9zZV93YWl0KTsKIAlzcGluX3VubG9ja19pcnEoJnByaXYtPmRwX3BvcnRfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZwb3J0LT5zZXJpYWwtPmRpc2NfbXV0ZXgpOwpAQCAtMTU2MCw3ICsxNTI4LDYgQEAKIAkJcHJpdi0+ZHBfdGhyb3R0bGVkID0gMDsKIAkJcHJpdi0+ZHBfdGhyb3R0bGVfcmVzdGFydCA9IDA7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRwX2ZsdXNoX3dhaXQpOwotCQlwcml2LT5kcF9pbl9jbG9zZSA9IDA7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPmRwX2Nsb3NlX3dhaXQpOwogCQlJTklUX1dPUksoJnByaXYtPmRwX3dha2V1cF93b3JrLCBkaWdpX3dha2V1cF93cml0ZV9sb2NrKTsKIAkJcHJpdi0+ZHBfcG9ydCA9IHNlcmlhbC0+cG9ydFtpXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9lbXBlZy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKaW5kZXggYzcwOWVjNC4uMmIxNDFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2VtcGVnLmMKQEAgLTgxLDggKzgxLDcgQEAKIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGFuIGVtcGVnLWNhciBwbGF5ZXIgKi8KIHN0YXRpYyBpbnQgIGVtcGVnX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCQkJCXN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkIGVtcGVnX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCBlbXBlZ19jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyBpbnQgIGVtcGVnX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsCiAJCQkJCQlpbnQgY291bnQpOwpAQCAtMTgxLDggKzE4MCw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgZW1wZWdfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIGVtcGVnX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwppbmRleCBkOWZjZGFlLi42ODMzMDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwpAQCAtODksNiArODksNyBAQAogCWludCBmb3JjZV9ydHNjdHM7CS8qIGlmIG5vbi16ZXJvLCBmb3JjZSBSVFMtQ1RTIHRvIGFsd2F5cwogCQkJCSAgIGJlIGVuYWJsZWQgKi8KIAorCXVuc2lnbmVkIGludCBsYXRlbmN5OwkJLyogbGF0ZW5jeSBzZXR0aW5nIGluIHVzZSAqLwogCXNwaW5sb2NrX3QgdHhfbG9jazsJLyogc3BpbmxvY2sgZm9yIHRyYW5zbWl0IHN0YXRlICovCiAJdW5zaWduZWQgbG9uZyB0eF9ieXRlczsKIAl1bnNpZ25lZCBsb25nIHR4X291dHN0YW5kaW5nX2J5dGVzOwpAQCAtNzE5LDggKzcyMCw4IEBACiBzdGF0aWMgaW50ICBmdGRpX3Npb19wb3J0X3JlbW92ZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyBpbnQgIGZ0ZGlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgZnRkaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgZnRkaV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGZ0ZGlfZHRyX3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pOwogc3RhdGljIGludCAgZnRkaV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwogc3RhdGljIGludCAgZnRkaV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtNzU4LDYgKzc1OSw3IEBACiAJLnBvcnRfcmVtb3ZlID0JCWZ0ZGlfc2lvX3BvcnRfcmVtb3ZlLAogCS5vcGVuID0JCQlmdGRpX29wZW4sCiAJLmNsb3NlID0JCWZ0ZGlfY2xvc2UsCisJLmR0cl9ydHMgPQkJZnRkaV9kdHJfcnRzLAogCS50aHJvdHRsZSA9CQlmdGRpX3Rocm90dGxlLAogCS51bnRocm90dGxlID0JCWZ0ZGlfdW50aHJvdHRsZSwKIAkud3JpdGUgPQkJZnRkaV93cml0ZSwKQEAgLTEwMzcsNyArMTAzOSw1NCBAQAogCXJldHVybiBydjsKIH0KIAorc3RhdGljIGludCB3cml0ZV9sYXRlbmN5X3RpbWVyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGZ0ZGlfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCWNoYXIgYnVmWzFdOworCWludCBydiA9IDA7CisJaW50IGwgPSBwcml2LT5sYXRlbmN5OwogCisJaWYgKHByaXYtPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpCisJCWwgPSAxOworCisJZGJnKCIlczogc2V0dGluZyBsYXRlbmN5IHRpbWVyID0gJWkiLCBfX2Z1bmNfXywgbCk7CisKKwlydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAorCQkJICAgICB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCisJCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1QsCisJCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1RfVFlQRSwKKwkJCSAgICAgbCwgcHJpdi0+aW50ZXJmYWNlLAorCQkJICAgICBidWYsIDAsIFdEUl9USU1FT1VUKTsKKworCWlmIChydiA8IDApCisJCWRldl9lcnIoJnBvcnQtPmRldiwgIlVuYWJsZSB0byB3cml0ZSBsYXRlbmN5IHRpbWVyOiAlaVxuIiwgcnYpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCByZWFkX2xhdGVuY3lfdGltZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CisJdW5zaWduZWQgc2hvcnQgbGF0ZW5jeSA9IDA7CisJaW50IHJ2ID0gMDsKKworCisJZGJnKCIlcyIsIF9fZnVuY19fKTsKKworCXJ2ID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsCisJCQkgICAgIHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKSwKKwkJCSAgICAgRlRESV9TSU9fR0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVCwKKwkJCSAgICAgRlRESV9TSU9fR0VUX0xBVEVOQ1lfVElNRVJfUkVRVUVTVF9UWVBFLAorCQkJICAgICAwLCBwcml2LT5pbnRlcmZhY2UsCisJCQkgICAgIChjaGFyICopICZsYXRlbmN5LCAxLCBXRFJfVElNRU9VVCk7CisKKwlpZiAocnYgPCAwKSB7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIlVuYWJsZSB0byByZWFkIGxhdGVuY3kgdGltZXI6ICVpXG4iLCBydik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gbGF0ZW5jeTsKK30KIAogc3RhdGljIGludCBnZXRfc2VyaWFsX2luZm8oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCQlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBfX3VzZXIgKnJldGluZm8pCkBAIC0xMDk3LDYgKzExNDYsNyBAQAogCXByaXYtPmN1c3RvbV9kaXZpc29yID0gbmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvcjsKIAogCXR0eS0+bG93X2xhdGVuY3kgPSAocHJpdi0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKKwl3cml0ZV9sYXRlbmN5X3RpbWVyKHBvcnQpOwogCiBjaGVja19hbmRfZXhpdDoKIAlpZiAoKG9sZF9wcml2LmZsYWdzICYgQVNZTkNfU1BEX01BU0spICE9CkBAIC0xMTkyLDI3ICsxMjQyLDEzIEBACiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHRvX3VzYl9zZXJpYWxfcG9ydChkZXYpOwogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKLQl1bnNpZ25lZCBzaG9ydCBsYXRlbmN5ID0gMDsKLQlpbnQgcnYgPSAwOwotCi0KLQlkYmcoIiVzIiwgX19mdW5jX18pOwotCi0JcnYgPSB1c2JfY29udHJvbF9tc2codWRldiwKLQkJCSAgICAgdXNiX3JjdmN0cmxwaXBlKHVkZXYsIDApLAotCQkJICAgICBGVERJX1NJT19HRVRfTEFURU5DWV9USU1FUl9SRVFVRVNULAotCQkJICAgICBGVERJX1NJT19HRVRfTEFURU5DWV9USU1FUl9SRVFVRVNUX1RZUEUsCi0JCQkgICAgIDAsIHByaXYtPmludGVyZmFjZSwKLQkJCSAgICAgKGNoYXIgKikgJmxhdGVuY3ksIDEsIFdEUl9USU1FT1VUKTsKLQotCWlmIChydiA8IDApIHsKLQkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gcmVhZCBsYXRlbmN5IHRpbWVyOiAlaVxuIiwgcnYpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWlcbiIsIGxhdGVuY3kpOworCWlmIChwcml2LT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVpXG4iLCBwcml2LT5sYXRlbmN5KTsKIH0KIAorCiAvKiBXcml0ZSBhIG5ldyB2YWx1ZSBvZiB0aGUgbGF0ZW5jeSB0aW1lciwgaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzLiAqLwogc3RhdGljIHNzaXplX3Qgc3RvcmVfbGF0ZW5jeV90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqdmFsYnVmLApAQCAtMTIyMCwyNSArMTI1NiwxMyBAQAogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0b191c2Jfc2VyaWFsX3BvcnQoZGV2KTsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7Ci0JY2hhciBidWZbMV07CiAJaW50IHYgPSBzaW1wbGVfc3RydG91bCh2YWxidWYsIE5VTEwsIDEwKTsKIAlpbnQgcnYgPSAwOwogCi0JZGJnKCIlczogc2V0dGluZyBsYXRlbmN5IHRpbWVyID0gJWkiLCBfX2Z1bmNfXywgdik7Ci0KLQlydiA9IHVzYl9jb250cm9sX21zZyh1ZGV2LAotCQkJICAgICB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCi0JCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1QsCi0JCQkgICAgIEZURElfU0lPX1NFVF9MQVRFTkNZX1RJTUVSX1JFUVVFU1RfVFlQRSwKLQkJCSAgICAgdiwgcHJpdi0+aW50ZXJmYWNlLAotCQkJICAgICBidWYsIDAsIFdEUl9USU1FT1VUKTsKLQotCWlmIChydiA8IDApIHsKLQkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gd3JpdGUgbGF0ZW5jeSB0aW1lcjogJWlcbiIsIHJ2KTsKKwlwcml2LT5sYXRlbmN5ID0gdjsKKwlydiA9IHdyaXRlX2xhdGVuY3lfdGltZXIocG9ydCk7CisJaWYgKHJ2IDwgMCkKIAkJcmV0dXJuIC1FSU87Ci0JfQotCiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0xMzkyLDYgKzE0MTYsNyBAQAogCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwcml2KTsKIAogCWZ0ZGlfZGV0ZXJtaW5lX3R5cGUocG9ydCk7CisJcmVhZF9sYXRlbmN5X3RpbWVyKHBvcnQpOwogCWNyZWF0ZV9zeXNmc19hdHRycyhwb3J0KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTE1MTQsNiArMTUzOSw4IEBACiAJaWYgKHR0eSkKIAkJdHR5LT5sb3dfbGF0ZW5jeSA9IChwcml2LT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOwogCisJd3JpdGVfbGF0ZW5jeV90aW1lcihwb3J0KTsKKwogCS8qIE5vIGVycm9yIGNoZWNraW5nIGZvciB0aGlzICh3aWxsIGdldCBlcnJvcnMgbGF0ZXIgYW55d2F5KSAqLwogCS8qIFNlZSBmdGRpX3Npby5oIGZvciBkZXNjcmlwdGlvbiBvZiB3aGF0IGlzIHJlc2V0ICovCiAJdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCkBAIC0xNTI5LDExICsxNTU2LDYgQEAKIAlpZiAodHR5KQogCQlmdGRpX3NldF90ZXJtaW9zKHR0eSwgcG9ydCwgdHR5LT50ZXJtaW9zKTsKIAotCS8qIEZJWE1FOiBGbG93IGNvbnRyb2wgbWlnaHQgYmUgZW5hYmxlZCwgc28gaXQgc2hvdWxkIGJlIGNoZWNrZWQgLQotCSAgIHdlIGhhdmUgbm8gY29udHJvbCBvZiBkZWZhdWx0cyEgKi8KLQkvKiBUdXJuIG9uIFJUUyBhbmQgRFRSIHNpbmNlIHdlIGFyZSBub3QgZmxvdyBjb250cm9sbGluZyBieSBkZWZhdWx0ICovCi0Jc2V0X21jdHJsKHBvcnQsIFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7Ci0KIAkvKiBOb3QgdGhyb3R0bGVkICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKIAlwcml2LT5yeF9mbGFncyAmPSB+KFRIUk9UVExFRCB8IEFDVFVBTExZX1RIUk9UVExFRCk7CkBAIC0xNTU4LDYgKzE1ODAsMzAgQEAKIH0gLyogZnRkaV9vcGVuICovCiAKIAorc3RhdGljIHZvaWQgZnRkaV9kdHJfcnRzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBvbikKK3sKKwlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWNoYXIgYnVmWzFdOworCisJbXV0ZXhfbG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKKwlpZiAoIXBvcnQtPnNlcmlhbC0+ZGlzY29ubmVjdGVkKSB7CisJCS8qIERpc2FibGUgZmxvdyBjb250cm9sICovCisJCWlmICghb24gJiYgdXNiX2NvbnRyb2xfbXNnKHBvcnQtPnNlcmlhbC0+ZGV2LAorCQkJICAgIHVzYl9zbmRjdHJscGlwZShwb3J0LT5zZXJpYWwtPmRldiwgMCksCisJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNULAorCQkJICAgIEZURElfU0lPX1NFVF9GTE9XX0NUUkxfUkVRVUVTVF9UWVBFLAorCQkJICAgIDAsIHByaXYtPmludGVyZmFjZSwgYnVmLCAwLAorCQkJICAgIFdEUl9USU1FT1VUKSA8IDApIHsKKwkJCSAgICBkZXZfZXJyKCZwb3J0LT5kZXYsICJlcnJvciBmcm9tIGZsb3djb250cm9sIHVyYlxuIik7CisJCX0KKwkJLyogZHJvcCBSVFMgYW5kIERUUiAqLworCQlpZiAob24pCisJCQlzZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKKwkJZWxzZQorCQkJY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwb3J0LT5zZXJpYWwtPmRpc2NfbXV0ZXgpOworfQogCiAvKgogICogdXNic2VyaWFsOl9fc2VyaWFsX2Nsb3NlICBvbmx5IGNhbGxzIGZ0ZGlfY2xvc2UgaWYgdGhlIHBvaW50IGlzIG9wZW4KQEAgLTE1NjcsMzEgKzE2MTMsMTIgQEAKICAqCiAgKi8KIAotc3RhdGljIHZvaWQgZnRkaV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBmdGRpX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7IC8qIGZ0ZGlfY2xvc2UgKi8KLQl1bnNpZ25lZCBpbnQgY19jZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCWNoYXIgYnVmWzFdOwogCiAJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAotCW11dGV4X2xvY2soJnBvcnQtPnNlcmlhbC0+ZGlzY19tdXRleCk7Ci0JaWYgKGNfY2ZsYWcgJiBIVVBDTCAmJiAhcG9ydC0+c2VyaWFsLT5kaXNjb25uZWN0ZWQpIHsKLQkJLyogRGlzYWJsZSBmbG93IGNvbnRyb2wgKi8KLQkJaWYgKHVzYl9jb250cm9sX21zZyhwb3J0LT5zZXJpYWwtPmRldiwKLQkJCQkgICAgdXNiX3NuZGN0cmxwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKSwKLQkJCQkgICAgRlRESV9TSU9fU0VUX0ZMT1dfQ1RSTF9SRVFVRVNULAotCQkJCSAgICBGVERJX1NJT19TRVRfRkxPV19DVFJMX1JFUVVFU1RfVFlQRSwKLQkJCQkgICAgMCwgcHJpdi0+aW50ZXJmYWNlLCBidWYsIDAsCi0JCQkJICAgIFdEUl9USU1FT1VUKSA8IDApIHsKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgImVycm9yIGZyb20gZmxvd2NvbnRyb2wgdXJiXG4iKTsKLQkJfQotCi0JCS8qIGRyb3AgUlRTIGFuZCBEVFIgKi8KLQkJY2xlYXJfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKLQl9IC8qIE5vdGUgY2hhbmdlIG5vIGxpbmUgaWYgaHVwY2wgaXMgb2ZmICovCi0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5zZXJpYWwtPmRpc2NfbXV0ZXgpOwogCiAJLyogY2FuY2VsIGFueSBzY2hlZHVsZWQgcmVhZGluZyAqLwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+cnhfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwppbmRleCA1ODZkMzBmLi5lZTI1YTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKQEAgLTk5Myw4ICs5OTMsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkIGdhcm1pbl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBnYXJtaW5fY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2VuZXJpYy5jCmluZGV4IDRjZWM5OTAuLmJlODJlYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dlbmVyaWMuYwpAQCAtMTg0LDggKzE4NCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfc2VyaWFsX2dlbmVyaWNfcmVzdW1lKTsKIAotdm9pZCB1c2Jfc2VyaWFsX2dlbmVyaWNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQordm9pZCB1c2Jfc2VyaWFsX2dlbmVyaWNfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCWdlbmVyaWNfY2xlYW51cChwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb19lZGdlcG9ydC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKaW5kZXggZmI0YTczZC4uNTNlZjU5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lvX2VkZ2Vwb3J0LmMKQEAgLTIwNyw4ICsyMDcsNyBAQAogLyogZnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIHVzYnNlcmlhbCBjYWxsYmFja3MgKi8KIHN0YXRpYyBpbnQgZWRnZV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQkJCXN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkIGVkZ2VfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQkJc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgZWRnZV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyBpbnQgZWRnZV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiBzdGF0aWMgaW50IGVkZ2Vfd3JpdGVfcm9vbShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKQEAgLTk2NSw3ICs5NjQsNyBAQAogCiAJaWYgKCFlZGdlX3BvcnQtPnR4Zmlmby5maWZvKSB7CiAJCWRiZygiJXMgLSBubyBtZW1vcnkiLCBfX2Z1bmNfXyk7Ci0JCWVkZ2VfY2xvc2UodHR5LCBwb3J0LCBmaWxwKTsKKwkJZWRnZV9jbG9zZShwb3J0KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC05NzUsNyArOTc0LDcgQEAKIAogCWlmICghZWRnZV9wb3J0LT53cml0ZV91cmIpIHsKIAkJZGJnKCIlcyAtIG5vIG1lbW9yeSIsIF9fZnVuY19fKTsKLQkJZWRnZV9jbG9zZSh0dHksIHBvcnQsIGZpbHApOworCQllZGdlX2Nsb3NlKHBvcnQpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEwOTksOCArMTA5OCw3IEBACiAgKiBlZGdlX2Nsb3NlCiAgKgl0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHR5IGRyaXZlciB3aGVuIGEgcG9ydCBpcyBjbG9zZWQKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIGVkZ2VfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgZWRnZV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKmVkZ2Vfc2VyaWFsOwogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaW9fdGkuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCmluZGV4IDUxM2IyNWUuLmVhYmYyMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pb190aS5jCkBAIC0yMDA5LDggKzIwMDksNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyB2b2lkIGVkZ2VfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgZWRnZV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBlZGdlcG9ydF9zZXJpYWwgKmVkZ2Vfc2VyaWFsOwogCXN0cnVjdCBlZGdlcG9ydF9wb3J0ICplZGdlX3BvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYwppbmRleCBjZDYyODI1Li5jNjEwYTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKQEAgLTc2LDggKzc2LDcgQEAKIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGFuIGlwYXEgKi8KIHN0YXRpYyBpbnQgIGlwYXFfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgaXBhcV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgaXBhcV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyBpbnQgIGlwYXFfY2FsY19udW1fcG9ydHMoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiBzdGF0aWMgaW50ICBpcGFxX3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiBzdGF0aWMgdm9pZCBpcGFxX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwpAQCAtNzE0LDggKzcxMyw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgaXBhcV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBpcGFxX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGlwYXFfcHJpdmF0ZQkqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwdy5jCmluZGV4IGRhMmEyYjQuLjI5YWQwMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcHcuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXB3LmMKQEAgLTMwMiwyMyArMzAyLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGlwd19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBpcHdfZHRyX3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCWludCByZXN1bHQ7CiAKLQlpZiAodHR5X2h1bmdfdXBfcChmaWxwKSkgewotCQlkYmcoIiVzOiB0dHlfaHVuZ191cF9wIC4uLiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQogCS8qLS0xOiBkcm9wIHRoZSBkdHIgKi8KIAlkYmcoIiVzOmRyb3BwaW5nIGR0ciIsIF9fZnVuY19fKTsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwKIAkJCSBJUFdfU0lPX1NFVF9QSU4sCiAJCQkgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9ESVJfT1VULAotCQkJIElQV19QSU5fQ0xSRFRSLAorCQkJIG9uID8gSVBXX1BJTl9TRVREVFIgOiBJUFdfUElOX0NMUkRUUiwKIAkJCSAwLAogCQkJIE5VTEwsCiAJCQkgMCwKQEAgLTMzMiw3ICszMjYsNyBAQAogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAogCQkJIElQV19TSU9fU0VUX1BJTiwgVVNCX1RZUEVfVkVORE9SIHwKIAkJCSAJCVVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0JfRElSX09VVCwKLQkJCSBJUFdfUElOX0NMUlJUUywKKwkJCSBvbiA/IElQV19QSU5fU0VUUlRTIDogSVBXX1BJTl9DTFJSVFMsCiAJCQkgMCwKIAkJCSBOVUxMLAogCQkJIDAsCkBAIC0zNDAsNyArMzM0LDEyIEBACiAJaWYgKHJlc3VsdCA8IDApCiAJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCQkiZHJvcHBpbmcgcnRzIGZhaWxlZCAoZXJyb3IgPSAlZClcbiIsIHJlc3VsdCk7Cit9CiAKK3N0YXRpYyB2b2lkIGlwd19jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwlpbnQgcmVzdWx0OwogCiAJLyotLTM6IHB1cmdlICovCiAJZGJnKCIlczpzZW5kaW5nIHB1cmdlIiwgX19mdW5jX18pOwpAQCAtNDYxLDYgKzQ2MCw3IEBACiAJLm51bV9wb3J0cyA9CQkxLAogCS5vcGVuID0JCQlpcHdfb3BlbiwKIAkuY2xvc2UgPQkJaXB3X2Nsb3NlLAorCS5kdHJfcnRzID0JCWlwd19kdHJfcnRzLAogCS5wb3J0X3Byb2JlID0gCQlpcHdfcHJvYmUsCiAJLnBvcnRfcmVtb3ZlID0JCWlwd19kaXNjb25uZWN0LAogCS53cml0ZSA9CQlpcHdfd3JpdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXItdXNiLmMKaW5kZXggNGUyY2RhOS4uNjYwMDliNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2lyLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9pci11c2IuYwpAQCAtODgsOCArODgsNyBAQAogc3RhdGljIGludCAgaXJfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiBzdGF0aWMgaW50ICBpcl9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQkJCXN0cnVjdCBmaWxlICpmaWxlcCk7Ci1zdGF0aWMgdm9pZCBpcl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZXApOworc3RhdGljIHZvaWQgaXJfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiBzdGF0aWMgaW50ICBpcl93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiBzdGF0aWMgdm9pZCBpcl93cml0ZV9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIpOwpAQCAtMzQ2LDggKzM0NSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgaXJfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyB2b2lkIGlyX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2l1dV9waG9lbml4LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYwppbmRleCA0NDczZDQ0Li43NmEzY2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXV1X3Bob2VuaXguYwpAQCAtNDAsNyArNDAsNyBAQAogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuNSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjEwIgogI2RlZmluZSBEUklWRVJfREVTQyAiSW5maW5pdHkgVVNCIFVubGltaXRlZCBQaG9lbml4IGRyaXZlciIKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CkBAIC03MCw3ICs3MCw2IEBACiBzdHJ1Y3QgaXV1X3ByaXZhdGUgewogCXNwaW5sb2NrX3QgbG9jazsJLyogc3RvcmUgaXJxIHN0YXRlICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgZGVsdGFfbXNyX3dhaXQ7Ci0JdTggbGluZV9jb250cm9sOwogCXU4IGxpbmVfc3RhdHVzOwogCXU4IHRlcm1pb3NfaW5pdGlhbGl6ZWQ7CiAJaW50IHRpb3N0YXR1czsJCS8qIHN0b3JlIElVQVJUIFNJR05BTCBmb3IgdGlvY21nZXQgY2FsbCAqLwpAQCAtNjUxLDMyICs2NTAsMzMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXN1bHQ7CiAJaW50IGk7CisJaW50IGJ1Zl9sZW47CiAJY2hhciAqYnVmX3B0ciA9IHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyOwogCWRiZygiJXMgLSBlbnRlciIsIF9fZnVuY19fKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJKmJ1Zl9wdHIrKyA9IElVVV9VQVJUX0VTQzsKIAkqYnVmX3B0cisrID0gSVVVX1VBUlRfVFg7CiAJKmJ1Zl9wdHIrKyA9IHByaXYtPndyaXRlbGVuOwogCi0JbWVtY3B5KGJ1Zl9wdHIsIHByaXYtPndyaXRlYnVmLAotCSAgICAgICBwcml2LT53cml0ZWxlbik7CisJbWVtY3B5KGJ1Zl9wdHIsIHByaXYtPndyaXRlYnVmLCBwcml2LT53cml0ZWxlbik7CisJYnVmX2xlbiA9IHByaXYtPndyaXRlbGVuOworCXByaXYtPndyaXRlbGVuID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJaWYgKGRlYnVnID09IDEpIHsKLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPndyaXRlbGVuOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuOyBpKyspCiAJCQlzcHJpbnRmKHByaXYtPmRiZ2J1ZiArIGkqMiAsCiAJCQkJIiUwMlgiLCBwcml2LT53cml0ZWJ1ZltpXSk7Ci0JCXByaXYtPmRiZ2J1Zltwcml2LT53cml0ZWxlbitpKjJdID0gMDsKKwkJcHJpdi0+ZGJnYnVmW2J1Zl9sZW4raSoyXSA9IDA7CiAJCWRiZygiJXMgLSB3cml0aW5nICVpIGNoYXJzIDogJXMiLCBfX2Z1bmNfXywKLQkJICAgIHByaXYtPndyaXRlbGVuLCBwcml2LT5kYmdidWYpOworCQkgICAgYnVmX2xlbiwgcHJpdi0+ZGJnYnVmKTsKIAl9CiAJdXNiX2ZpbGxfYnVsa191cmIocG9ydC0+d3JpdGVfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKIAkJCSAgdXNiX3NuZGJ1bGtwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQkgIHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyksCi0JCQkgIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwcml2LT53cml0ZWxlbiArIDMsCisJCQkgIHBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBidWZfbGVuICsgMywKIAkJCSAgaXV1X3J4Y21kLCBwb3J0KTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+d3JpdGVsZW4gPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKIAlyZXR1cm4gcmVzdWx0OwogfQpAQCAtNzcwLDE0ICs3NzAsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWlmIChwcml2LT53cml0ZWxlbiA+IDApIHsKLQkJLyogYnVmZmVyIGFscmVhZHkgZmlsbGVkIGJ1dCBub3QgY29tbWl0ZWQgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9CisKIAkvKiBmaWxsIHRoZSBidWZmZXIgKi8KLQltZW1jcHkocHJpdi0+d3JpdGVidWYsIGJ1ZiwgY291bnQpOwotCXByaXYtPndyaXRlbGVuID0gY291bnQ7CisJbWVtY3B5KHByaXYtPndyaXRlYnVmICsgcHJpdi0+d3JpdGVsZW4sIGJ1ZiwgY291bnQpOworCXByaXYtPndyaXRlbGVuICs9IGNvdW50OwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiBjb3VudDsKQEAgLTgxOSw3ICs4MTUsNyBAQAogCWJ1ZlswXSA9IElVVV9VQVJUX0VOQUJMRTsKIAlidWZbMV0gPSAodTgpICgoSVVVX0JBVURfOTYwMCA+PiA4KSAmIDB4MDBGRik7CiAJYnVmWzJdID0gKHU4KSAoMHgwMEZGICYgSVVVX0JBVURfOTYwMCk7Ci0JYnVmWzNdID0gKHU4KSAoMHgwRjAgJiBJVVVfVFdPX1NUT1BfQklUUykgfCAoMHgwNyAmIElVVV9QQVJJVFlfRVZFTik7CisJYnVmWzNdID0gKHU4KSAoMHgwRjAgJiBJVVVfT05FX1NUT1BfQklUKSB8ICgweDA3ICYgSVVVX1BBUklUWV9FVkVOKTsKIAogCXN0YXR1cyA9IGJ1bGtfaW1tZWRpYXRlKHBvcnQsIGJ1ZiwgNCk7CiAJaWYgKHN0YXR1cyAhPSBJVVVfT1BFUkFUSU9OX09LKSB7CkBAIC05NDYsMTkgKzk0Miw1OSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X2NvbnRyb2xfbGluZXMoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdTggdmFsdWUpCitzdGF0aWMgdm9pZCBpdXVfc2V0X3Rlcm1pb3Moc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGRfdGVybWlvcykKIHsKLQlyZXR1cm4gMDsKKwljb25zdCB1MzIgc3VwcG9ydGVkX21hc2sgPSBDTVNQQVJ8UEFSRU5CfFBBUk9ERDsKKworCXVuc2lnbmVkIGludCBjZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKKwlpbnQgc3RhdHVzOworCXUzMiBhY3R1YWw7CisJdTMyIHBhcml0eTsKKwlpbnQgY3NpemUgPSBDUzc7CisJaW50IGJhdWQgPSA5NjAwOwkvKiBGaXhlZCBmb3IgdGhlIG1vbWVudCAqLworCXUzMiBuZXd2YWwgPSBjZmxhZyAmIHN1cHBvcnRlZF9tYXNrOworCisJLyogY29tcHV0ZSB0aGUgcGFyaXR5IHBhcmFtZXRlciAqLworCXBhcml0eSA9IDA7CisJaWYgKGNmbGFnICYgQ01TUEFSKSB7CS8qIFVzaW5nIG1hcmsgc3BhY2UgKi8KKwkJaWYgKGNmbGFnICYgUEFST0REKQorCQkJcGFyaXR5IHw9IElVVV9QQVJJVFlfU1BBQ0U7CisJCWVsc2UKKwkJCXBhcml0eSB8PSBJVVVfUEFSSVRZX01BUks7CisJfSBlbHNlIGlmICghKGNmbGFnICYgUEFSRU5CKSkgeworCQlwYXJpdHkgfD0gSVVVX1BBUklUWV9OT05FOworCQljc2l6ZSA9IENTODsKKwl9IGVsc2UgaWYgKGNmbGFnICYgUEFST0REKQorCQlwYXJpdHkgfD0gSVVVX1BBUklUWV9PREQ7CisJZWxzZQorCQlwYXJpdHkgfD0gSVVVX1BBUklUWV9FVkVOOworCisJcGFyaXR5IHw9IChjZmxhZyAmIENTVE9QQiA/IElVVV9UV09fU1RPUF9CSVRTIDogSVVVX09ORV9TVE9QX0JJVCk7CisKKwkvKiBzZXQgaXQgKi8KKwlzdGF0dXMgPSBpdXVfdWFydF9iYXVkKHBvcnQsCisJCQkoY2xvY2ttb2RlID09IDIpID8gMTY0NTcgOiA5NjAwICogYm9vc3QgLyAxMDAsCisJCQkmYWN0dWFsLCBwYXJpdHkpOworCisJLyogc2V0IHRoZSB0ZXJtaW9zIHZhbHVlIHRvIHRoZSByZWFsIG9uZSwgc28gdGhlIHVzZXIgbm93IHdoYXQgaGFzCisJICogY2hhbmdlZC4gV2Ugc3VwcG9ydCBmZXcgZmllbGRzIHNvIGl0cyBlYXNpZXMgdG8gY29weSB0aGUgb2xkIGh3CisJICogc2V0dGluZ3MgYmFjayBvdmVyIGFuZCB0aGVuIGFkanVzdCB0aGVtCisJICovCisgCWlmIChvbGRfdGVybWlvcykKKyAJCXR0eV90ZXJtaW9zX2NvcHlfaHcodHR5LT50ZXJtaW9zLCBvbGRfdGVybWlvcyk7CisJaWYgKHN0YXR1cyAhPSAwKQkvKiBTZXQgZmFpbGVkIC0gcmV0dXJuIG9sZCBiaXRzICovCisJCXJldHVybjsKKwkvKiBSZS1lbmNvZGUgc3BlZWQsIHBhcml0eSBhbmQgY3NpemUgKi8KKwl0dHlfZW5jb2RlX2JhdWRfcmF0ZSh0dHksIGJhdWQsIGJhdWQpOworCXR0eS0+dGVybWlvcy0+Y19jZmxhZyAmPSB+KHN1cHBvcnRlZF9tYXNrfENTSVpFKTsKKwl0dHktPnRlcm1pb3MtPmNfY2ZsYWcgfD0gbmV3dmFsIHwgY3NpemU7CiB9CiAKLXN0YXRpYyB2b2lkIGl1dV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBpdXVfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAkvKiBpdXVfbGVkIChwb3J0LDI1NSwwLDAsMCk7ICovCiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKLQlzdHJ1Y3QgaXV1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgY19jZmxhZzsKIAogCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlpZiAoIXNlcmlhbCkKQEAgLTk2OCwxNyArMTAwNCw2IEBACiAKIAlpdXVfdWFydF9vZmYocG9ydCk7CiAJaWYgKHNlcmlhbC0+ZGV2KSB7Ci0JCWlmICh0dHkpIHsKLQkJCWNfY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCQlpZiAoY19jZmxhZyAmIEhVUENMKSB7Ci0JCQkJLyogZHJvcCBEVFIgYW5kIFJUUyAqLwotCQkJCXByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCQlwcml2LT5saW5lX2NvbnRyb2wgPSAwOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCQlzZXRfY29udHJvbF9saW5lcyhwb3J0LT5zZXJpYWwtPmRldiwgMCk7Ci0JCQl9Ci0JCX0KIAkJLyogZnJlZSB3cml0ZWJ1ZiAqLwogCQkvKiBzaHV0ZG93biBvdXIgdXJicyAqLwogCQlkYmcoIiVzIC0gc2h1dHRpbmcgZG93biB1cmJzIiwgX19mdW5jX18pOwpAQCAtMTE1NCw3ICsxMTc5LDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIgogCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7Ci0JCWl1dV9jbG9zZSh0dHksIHBvcnQsIE5VTEwpOworCQlpdXVfY2xvc2UocG9ydCk7CiAJCXJldHVybiAtRVBST1RPOwogCX0gZWxzZSB7CiAJCWRiZygiJXMgLSByeGNtZCBPSyIsIF9fZnVuY19fKTsKQEAgLTExNzUsNiArMTIwMCw3IEBACiAJLnJlYWRfYnVsa19jYWxsYmFjayA9IGl1dV91YXJ0X3JlYWRfY2FsbGJhY2ssCiAJLnRpb2NtZ2V0ID0gaXV1X3Rpb2NtZ2V0LAogCS50aW9jbXNldCA9IGl1dV90aW9jbXNldCwKKwkuc2V0X3Rlcm1pb3MgPSBpdXVfc2V0X3Rlcm1pb3MsCiAJLmF0dGFjaCA9IGl1dV9zdGFydHVwLAogCS5zaHV0ZG93biA9IGl1dV9zaHV0ZG93biwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uYwppbmRleCAwMGRhYThmLi5mMTE5NWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmMKQEAgLTEyOTgsOCArMTI5OCwxNiBAQAogCQl1c2Jfa2lsbF91cmIodXJiKTsKIH0KIAotc3RhdGljIHZvaWQga2V5c3Bhbl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBrZXlzcGFuX2R0cl9ydHMoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IG9uKQoreworCXN0cnVjdCBrZXlzcGFuX3BvcnRfcHJpdmF0ZSAqcF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJcF9wcml2LT5ydHNfc3RhdGUgPSBvbjsKKwlwX3ByaXYtPmR0cl9zdGF0ZSA9IG9uOworCWtleXNwYW5fc2VuZF9zZXR1cChwb3J0LCAwKTsKK30KKworc3RhdGljIHZvaWQga2V5c3Bhbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCWludAkJCWk7CiAJc3RydWN0IHVzYl9zZXJpYWwJKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKQEAgLTEzMzYsNyArMTM0NCw2IEBACiAJCQlzdG9wX3VyYihwX3ByaXYtPm91dF91cmJzW2ldKTsKIAkJfQogCX0KLQl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCBOVUxMKTsKIH0KIAogLyogZG93bmxvYWQgdGhlIGZpcm13YXJlIHRvIGEgcHJlLXJlbnVtZXJhdGlvbiBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbi5oCmluZGV4IDM4YjQ1ODIuLjBkNDU2OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuLmgKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW4uaApAQCAtMzgsOSArMzgsOCBAQAogc3RhdGljIGludCAga2V5c3Bhbl9vcGVuCQkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCQkJIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgdm9pZCBrZXlzcGFuX2Nsb3NlCQkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCQkJIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCQkJCSBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCBrZXlzcGFuX2Nsb3NlCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CitzdGF0aWMgdm9pZCBrZXlzcGFuX2R0cl9ydHMJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pOwogc3RhdGljIGludCAga2V5c3Bhbl9zdGFydHVwCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiBzdGF0aWMgdm9pZCBrZXlzcGFuX3NodXRkb3duCQkoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiBzdGF0aWMgaW50ICBrZXlzcGFuX3dyaXRlX3Jvb20JCShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKQEAgLTU2Miw2ICs1NjEsNyBAQAogCS5udW1fcG9ydHMJCT0gMSwKIAkub3BlbgkJCT0ga2V5c3Bhbl9vcGVuLAogCS5jbG9zZQkJCT0ga2V5c3Bhbl9jbG9zZSwKKwkuZHRyX3J0cwkJPSBrZXlzcGFuX2R0cl9ydHMsCiAJLndyaXRlCQkJPSBrZXlzcGFuX3dyaXRlLAogCS53cml0ZV9yb29tCQk9IGtleXNwYW5fd3JpdGVfcm9vbSwKIAkuc2V0X3Rlcm1pb3MJCT0ga2V5c3Bhbl9zZXRfdGVybWlvcywKQEAgLTU4Miw2ICs1ODIsNyBAQAogCS5udW1fcG9ydHMJCT0gMiwKIAkub3BlbgkJCT0ga2V5c3Bhbl9vcGVuLAogCS5jbG9zZQkJCT0ga2V5c3Bhbl9jbG9zZSwKKwkuZHRyX3J0cwkJPSBrZXlzcGFuX2R0cl9ydHMsCiAJLndyaXRlCQkJPSBrZXlzcGFuX3dyaXRlLAogCS53cml0ZV9yb29tCQk9IGtleXNwYW5fd3JpdGVfcm9vbSwKIAkuc2V0X3Rlcm1pb3MJCT0ga2V5c3Bhbl9zZXRfdGVybWlvcywKQEAgLTYwMiw2ICs2MDMsNyBAQAogCS5udW1fcG9ydHMJCT0gNCwKIAkub3BlbgkJCT0ga2V5c3Bhbl9vcGVuLAogCS5jbG9zZQkJCT0ga2V5c3Bhbl9jbG9zZSwKKwkuZHRyX3J0cwkJPSBrZXlzcGFuX2R0cl9ydHMsCiAJLndyaXRlCQkJPSBrZXlzcGFuX3dyaXRlLAogCS53cml0ZV9yb29tCQk9IGtleXNwYW5fd3JpdGVfcm9vbSwKIAkuc2V0X3Rlcm1pb3MJCT0ga2V5c3Bhbl9zZXRfdGVybWlvcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rZXlzcGFuX3BkYS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKaW5kZXggYmYxYWUyNC4uYWI3NjlkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMKQEAgLTY1MSw2ICs2NTEsMzUgQEAKIH0KIAogCitzdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV9kdHJfcnRzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBvbikKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCisJaWYgKHNlcmlhbC0+ZGV2KSB7CisJCWlmIChvbikKKwkJCWtleXNwYW5fcGRhX3NldF9tb2RlbV9pbmZvKHNlcmlhbCwgKDE8PDcpIHwgKDE8PCAyKSk7CisJCWVsc2UKKwkJCWtleXNwYW5fcGRhX3NldF9tb2RlbV9pbmZvKHNlcmlhbCwgMCk7CisJfQorfQorCitzdGF0aWMgaW50IGtleXNwYW5fcGRhX2NhcnJpZXJfcmFpc2VkKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwl1bnNpZ25lZCBjaGFyIG1vZGVtYml0czsKKworCS8qIElmIHdlIGNhbiByZWFkIHRoZSBtb2RlbSBzdGF0dXMgYW5kIHRoZSBEQ0QgaXMgbG93IHRoZW4KKwkgICBjYXJyaWVyIGlzIG5vdCByYWlzZWQgeWV0ICovCisJaWYgKGtleXNwYW5fcGRhX2dldF9tb2RlbV9pbmZvKHNlcmlhbCwgJm1vZGVtYml0cykgPj0gMCkgeworCQlpZiAoIShtb2RlbWJpdHMgJiAoMT4+NikpKQorCQkJcmV0dXJuIDA7CisJfQorCS8qIENhcnJpZXIgcmFpc2VkLCBvciB3ZSBmYWlsZWQgKGVnIGRpc2Nvbm5lY3RlZCkgc28KKwkgICBwcm9ncmVzcyBhY2NvcmRpbmdseSAqLworCXJldHVybiAxOworfQorCisKIHN0YXRpYyBpbnQga2V5c3Bhbl9wZGFfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCiB7CkBAIC02ODIsMTMgKzcxMSw2IEBACiAJcHJpdi0+dHhfcm9vbSA9IHJvb207CiAJcHJpdi0+dHhfdGhyb3R0bGVkID0gcm9vbSA/IDAgOiAxOwogCi0JLyogdGhlIG5vcm1hbCBzZXJpYWwgZGV2aWNlIHNlZW1zIHRvIGFsd2F5cyB0dXJuIG9uIERUUiBhbmQgUlRTIGhlcmUsCi0JICAgc28gZG8gdGhlIHNhbWUgKi8KLQlpZiAodHR5ICYmICh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkpCi0JCWtleXNwYW5fcGRhX3NldF9tb2RlbV9pbmZvKHNlcmlhbCwgKDE8PDcpIHwgKDE8PDIpKTsKLQllbHNlCi0JCWtleXNwYW5fcGRhX3NldF9tb2RlbV9pbmZvKHNlcmlhbCwgMCk7Ci0KIAkvKlN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgZGV2aWNlKi8KIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlyYyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOwpAQCAtNzAwLDE5ICs3MjIsMTEgQEAKIGVycm9yOgogCXJldHVybiByYzsKIH0KLQotCi1zdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBrZXlzcGFuX3BkYV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAKIAlpZiAoc2VyaWFsLT5kZXYpIHsKLQkJLyogdGhlIG5vcm1hbCBzZXJpYWwgZGV2aWNlIHNlZW1zIHRvIGFsd2F5cyBzaHV0Ci0JCSAgIG9mZiBEVFIgYW5kIFJUUyBub3cgKi8KLQkJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIEhVUENMKQotCQkJa2V5c3Bhbl9wZGFfc2V0X21vZGVtX2luZm8oc2VyaWFsLCAwKTsKLQogCQkvKiBzaHV0ZG93biBvdXIgYnVsayByZWFkcyBhbmQgd3JpdGVzICovCiAJCXVzYl9raWxsX3VyYihwb3J0LT53cml0ZV91cmIpOwogCQl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CkBAIC04MzksNiArODUzLDggQEAKIAkudXNiX2RyaXZlciA9IAkJJmtleXNwYW5fcGRhX2RyaXZlciwKIAkuaWRfdGFibGUgPQkJaWRfdGFibGVfc3RkLAogCS5udW1fcG9ydHMgPQkJMSwKKwkuZHRyX3J0cyA9CQlrZXlzcGFuX3BkYV9kdHJfcnRzLAorCS5jYXJyaWVyX3JhaXNlZAk9CWtleXNwYW5fcGRhX2NhcnJpZXJfcmFpc2VkLAogCS5vcGVuID0JCQlrZXlzcGFuX3BkYV9vcGVuLAogCS5jbG9zZSA9CQlrZXlzcGFuX3BkYV9jbG9zZSwKIAkud3JpdGUgPQkJa2V5c3Bhbl9wZGFfd3JpdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tsNWt1c2IxMDUuYwppbmRleCBmY2Q5MDgyLi5mYTgxN2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2w1a3VzYjEwNS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9rbDVrdXNiMTA1LmMKQEAgLTc2LDggKzc2LDcgQEAKIHN0YXRpYyB2b2lkIGtsc2lfMTA1X3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIGludCAga2xzaV8xMDVfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQga2xzaV8xMDVfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIGtsc2lfMTA1X2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIGludCAga2xzaV8xMDVfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiBzdGF0aWMgdm9pZCBrbHNpXzEwNV93cml0ZV9idWxrX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYik7CkBAIC00NDcsOCArNDQ2LDcgQEAKIH0gLyoga2xzaV8xMDVfb3BlbiAqLwogCiAKLXN0YXRpYyB2b2lkIGtsc2lfMTA1X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIGtsc2lfMTA1X2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IGtsc2lfMTA1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2tvYmlsX3NjdC5jCmluZGV4IGMxNDg1NDQuLjZiNTcwNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9rb2JpbF9zY3QuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwva29iaWxfc2N0LmMKQEAgLTcyLDggKzcyLDcgQEAKIHN0YXRpYyB2b2lkIGtvYmlsX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIGludCAga29iaWxfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQga29iaWxfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCXN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIGtvYmlsX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIGludCAga29iaWxfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiBzdGF0aWMgaW50ICBrb2JpbF93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtMjA5LDcgKzIwOCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewogCQl3aGlsZSAoc2VyaWFsLT5wb3J0W2ldLT5wb3J0LmNvdW50ID4gMCkKLQkJCWtvYmlsX2Nsb3NlKE5VTEwsIHNlcmlhbC0+cG9ydFtpXSwgTlVMTCk7CisJCQlrb2JpbF9jbG9zZShzZXJpYWwtPnBvcnRbaV0pOwogCQlrZnJlZSh1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEoc2VyaWFsLT5wb3J0W2ldKSk7CiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0sIE5VTEwpOwogCX0KQEAgLTM0NiwxMSArMzQ1LDExIEBACiB9CiAKIAotc3RhdGljIHZvaWQga29iaWxfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQga29iaWxfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCisJLyogRklYTUU6IEFkZCBydHMvZHRyIG1ldGhvZHMgKi8KIAlpZiAocG9ydC0+d3JpdGVfdXJiKSB7CiAJCXVzYl9raWxsX3VyYihwb3J0LT53cml0ZV91cmIpOwogCQl1c2JfZnJlZV91cmIocG9ydC0+d3JpdGVfdXJiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9tY3RfdTIzMi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKaW5kZXggODI5MzBhNy4uODczNzk1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21jdF91MjMyLmMKQEAgLTk1LDggKzk1LDggQEAKIHN0YXRpYyB2b2lkIG1jdF91MjMyX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIGludCAgbWN0X3UyMzJfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgbWN0X3UyMzJfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIG1jdF91MjMyX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOworc3RhdGljIHZvaWQgbWN0X3UyMzJfZHRyX3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pOwogc3RhdGljIHZvaWQgbWN0X3UyMzJfcmVhZF9pbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkIG1jdF91MjMyX3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZCk7CkBAIC0xNDAsNiArMTQwLDcgQEAKIAkubnVtX3BvcnRzID0JICAgICAxLAogCS5vcGVuID0JCSAgICAgbWN0X3UyMzJfb3BlbiwKIAkuY2xvc2UgPQkgICAgIG1jdF91MjMyX2Nsb3NlLAorCS5kdHJfcnRzID0JICAgICBtY3RfdTIzMl9kdHJfcnRzLAogCS50aHJvdHRsZSA9CSAgICAgbWN0X3UyMzJfdGhyb3R0bGUsCiAJLnVudGhyb3R0bGUgPQkgICAgIG1jdF91MjMyX3VudGhyb3R0bGUsCiAJLnJlYWRfaW50X2NhbGxiYWNrID0gbWN0X3UyMzJfcmVhZF9pbnRfY2FsbGJhY2ssCkBAIC00OTYsMjkgKzQ5NywyOSBAQAogCXJldHVybiByZXR2YWw7CiB9IC8qIG1jdF91MjMyX29wZW4gKi8KIAotCi1zdGF0aWMgdm9pZCBtY3RfdTIzMl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBtY3RfdTIzMl9kdHJfcnRzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBvbikKIHsKLQl1bnNpZ25lZCBpbnQgY19jZmxhZzsKIAl1bnNpZ25lZCBpbnQgY29udHJvbF9zdGF0ZTsKIAlzdHJ1Y3QgbWN0X3UyMzJfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQlkYmcoIiVzIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCWlmICh0dHkpIHsKLQkJY19jZmxhZyA9IHR0eS0+dGVybWlvcy0+Y19jZmxhZzsKLQkJbXV0ZXhfbG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKLQkJaWYgKGNfY2ZsYWcgJiBIVVBDTCAmJiAhcG9ydC0+c2VyaWFsLT5kaXNjb25uZWN0ZWQpIHsKLQkJCS8qIGRyb3AgRFRSIGFuZCBSVFMgKi8KLQkJCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCW11dGV4X2xvY2soJnBvcnQtPnNlcmlhbC0+ZGlzY19tdXRleCk7CisJaWYgKCFwb3J0LT5zZXJpYWwtPmRpc2Nvbm5lY3RlZCkgeworCQkvKiBkcm9wIERUUiBhbmQgUlRTICovCisJCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCQlpZiAob24pCisJCQlwcml2LT5jb250cm9sX3N0YXRlIHw9IFRJT0NNX0RUUiB8IFRJT0NNX1JUUzsKKwkJZWxzZQogCQkJcHJpdi0+Y29udHJvbF9zdGF0ZSAmPSB+KFRJT0NNX0RUUiB8IFRJT0NNX1JUUyk7Ci0JCQljb250cm9sX3N0YXRlID0gcHJpdi0+Y29udHJvbF9zdGF0ZTsKLQkJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7Ci0JCQltY3RfdTIzMl9zZXRfbW9kZW1fY3RybChwb3J0LT5zZXJpYWwsIGNvbnRyb2xfc3RhdGUpOwotCQl9Ci0JCW11dGV4X3VubG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKKwkJY29udHJvbF9zdGF0ZSA9IHByaXYtPmNvbnRyb2xfc3RhdGU7CisJCXNwaW5fdW5sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJCW1jdF91MjMyX3NldF9tb2RlbV9jdHJsKHBvcnQtPnNlcmlhbCwgY29udHJvbF9zdGF0ZSk7CiAJfQorCW11dGV4X3VubG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKK30KIAorc3RhdGljIHZvaWQgbWN0X3UyMzJfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlkYmcoIiVzIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAogCWlmIChwb3J0LT5zZXJpYWwtPmRldikgewogCQkvKiBzaHV0ZG93biBvdXIgdXJicyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3NzIwLmMKaW5kZXggMjRlM2I1ZC4uOWUxYTAxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc3MjAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzcyMC5jCkBAIC01MzMsOCArNTMzLDcgQEAKIAlyZXR1cm4gY2hhcnM7CiB9CiAKLXN0YXRpYyB2b2lkIG1vczc3MjBfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgbW9zNzcyMF9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWw7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzcyMF9wb3J0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9tb3M3ODQwLmMKaW5kZXggODRmYjFkYy4uMTBiNzhhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jCkBAIC0xMTM1LDU0ICsxMTM1LDEyIEBACiAKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIG1vczc4NDBfYmxvY2tfdW50aWxfdHhfZW1wdHkKLSAqCi0gKglUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdGhlIGNsb3NlIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICoJCTEuIFRYIGNvdW50IGFyZSAwCi0gKgkJMi4gVGhlIG1vczc4NDAgaGFzIHN0b3BwZWQKLSAqCQkzLiBBIHRpbWVvdXQgb2YgMyBzZWNvbmRzIHdpdGhvdXQgYWN0aXZpdHkgaGFzIGV4cGlyZWQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgbW9zNzg0MF9ibG9ja191bnRpbF90eF9lbXB0eShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydCkKLXsKLQlpbnQgdGltZW91dCA9IEhaIC8gMTA7Ci0JaW50IHdhaXQgPSAzMDsKLQlpbnQgY291bnQ7Ci0KLQl3aGlsZSAoMSkgewotCi0JCWNvdW50ID0gbW9zNzg0MF9jaGFyc19pbl9idWZmZXIodHR5KTsKLQotCQkvKiBDaGVjayBmb3IgQnVmZmVyIHN0YXR1cyAqLwotCQlpZiAoY291bnQgPD0gMCkKLQkJCXJldHVybjsKLQotCQkvKiBCbG9jayB0aGUgdGhyZWFkIGZvciBhIHdoaWxlICovCi0JCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmbW9zNzg0MF9wb3J0LT53YWl0X2NoYXNlLAotCQkJCQkgICAgICAgdGltZW91dCk7Ci0KLQkJLyogTm8gYWN0aXZpdHkuLiBjb3VudCBkb3duIHNlY3Rpb24gKi8KLQkJd2FpdC0tOwotCQlpZiAod2FpdCA9PSAwKSB7Ci0JCQlkYmcoIiVzIC0gVElNRU9VVCIsIF9fZnVuY19fKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQkJCS8qIFJlc2V0IHRpbWVvdXQgdmFsdWUgYmFjayB0byBzZWNvbmRzICovCi0JCQl3YWl0ID0gMzA7Ci0JCX0KLQl9Ci19Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogbW9zNzg0MF9jbG9zZQogICoJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgd2hlbiBhIHBvcnQgaXMgY2xvc2VkCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIG1vczc4NDBfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgbW9zNzg0MF9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWw7CiAJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OwpAQCAtMTIyMywxMCArMTE4MSw2IEBACiAJCX0KIAl9CiAKLQlpZiAoc2VyaWFsLT5kZXYpCi0JCS8qIGZsdXNoIGFuZCBibG9jayB1bnRpbCB0eCBpcyBlbXB0eSAqLwotCQltb3M3ODQwX2Jsb2NrX3VudGlsX3R4X2VtcHR5KHR0eSwgbW9zNzg0MF9wb3J0KTsKLQogCS8qIFdoaWxlIGNsb3NpbmcgcG9ydCwgc2h1dGRvd24gYWxsIGJ1bGsgcmVhZCwgd3JpdGUgICoKIAkgKiBhbmQgaW50ZXJydXB0IHJlYWQgaWYgdGhleSBleGlzdHMgICAgICAgICAgICAgICAgICAqLwogCWlmIChzZXJpYWwtPmRldikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jCmluZGV4IGJjZGNiYjguLmY1ZjM3NTFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL25hdm1hbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9uYXZtYW4uYwpAQCAtOTgsOCArOTgsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIG5hdm1hbl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBuYXZtYW5fY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL29tbmluZXQuYwppbmRleCBkZjY1Mzk3Li4xMTA0NjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb21uaW5ldC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vbW5pbmV0LmMKQEAgLTY2LDggKzY2LDcgQEAKIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBpbnQgIG9tbmluZXRfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJCQkJCXN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkIG9tbmluZXRfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQkJCQlzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCBvbW5pbmV0X2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIHZvaWQgb21uaW5ldF9yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKTsKIHN0YXRpYyB2b2lkIG9tbmluZXRfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpOwogc3RhdGljIGludCAgb21uaW5ldF93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LApAQCAtMTg5LDggKzE4OCw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgb21uaW5ldF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBvbW5pbmV0X2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+cmVhZF91cmIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGljb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpY29uLmMKaW5kZXggYjUwMGFkMS4uYzIwNDgwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGljb24uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aWNvbi5jCkBAIC0xNzMsOCArMTczLDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCBvcHRpY29uX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCQkgIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgb3B0aWNvbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBvcHRpY29uX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9kYXRhKHBvcnQtPnNlcmlhbCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwppbmRleCA3ODE3YjgyLi5hMTZkNjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCkBAIC00NSw4ICs0NSw5IEBACiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCiBzdGF0aWMgaW50ICBvcHRpb25fb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJCQkJCXN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkIG9wdGlvbl9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJCQkJCXN0cnVjdCBmaWxlICpmaWxwKTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIG9wdGlvbl9kdHJfcnRzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBvbik7CisKIHN0YXRpYyBpbnQgIG9wdGlvbl9zdGFydHVwKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIHZvaWQgb3B0aW9uX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIGludCAgb3B0aW9uX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CkBAIC02MSw3ICs2Miw3IEBACiBzdGF0aWMgaW50ICBvcHRpb25fdGlvY21nZXQoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCAgb3B0aW9uX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJCXVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcik7Ci1zdGF0aWMgaW50ICBvcHRpb25fc2VuZF9zZXR1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBpbnQgIG9wdGlvbl9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIGludCAgb3B0aW9uX3N1c3BlbmQoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOwogc3RhdGljIGludCAgb3B0aW9uX3Jlc3VtZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKIApAQCAtNTUxLDYgKzU1Miw3IEBACiAJLm51bV9wb3J0cyAgICAgICAgID0gMSwKIAkub3BlbiAgICAgICAgICAgICAgPSBvcHRpb25fb3BlbiwKIAkuY2xvc2UgICAgICAgICAgICAgPSBvcHRpb25fY2xvc2UsCisJLmR0cl9ydHMJICAgPSBvcHRpb25fZHRyX3J0cywKIAkud3JpdGUgICAgICAgICAgICAgPSBvcHRpb25fd3JpdGUsCiAJLndyaXRlX3Jvb20gICAgICAgID0gb3B0aW9uX3dyaXRlX3Jvb20sCiAJLmNoYXJzX2luX2J1ZmZlciAgID0gb3B0aW9uX2NoYXJzX2luX2J1ZmZlciwKQEAgLTYzMCw3ICs2MzIsNyBAQAogCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAJLyogRG9lc24ndCBzdXBwb3J0IG9wdGlvbiBzZXR0aW5nICovCiAJdHR5X3Rlcm1pb3NfY29weV9odyh0dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKTsKLQlvcHRpb25fc2VuZF9zZXR1cCh0dHksIHBvcnQpOworCW9wdGlvbl9zZW5kX3NldHVwKHBvcnQpOwogfQogCiBzdGF0aWMgaW50IG9wdGlvbl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTY2OSw3ICs2NzEsNyBAQAogCQlwb3J0ZGF0YS0+cnRzX3N0YXRlID0gMDsKIAlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCiAJCXBvcnRkYXRhLT5kdHJfc3RhdGUgPSAwOwotCXJldHVybiBvcHRpb25fc2VuZF9zZXR1cCh0dHksIHBvcnQpOworCXJldHVybiBvcHRpb25fc2VuZF9zZXR1cChwb3J0KTsKIH0KIAogLyogV3JpdGUgKi8KQEAgLTg5NywxMCArODk5LDYgQEAKIAogCWRiZygiJXMiLCBfX2Z1bmNfXyk7CiAKLQkvKiBTZXQgc29tZSBzYW5lIGRlZmF1bHRzICovCi0JcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDE7Ci0JcG9ydGRhdGEtPmR0cl9zdGF0ZSA9IDE7Ci0KIAkvKiBSZXNldCBsb3cgbGV2ZWwgZGF0YSB0b2dnbGUgYW5kIHN0YXJ0IHJlYWRpbmcgZnJvbSBlbmRwb2ludHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTl9JTl9VUkI7IGkrKykgewogCQl1cmIgPSBwb3J0ZGF0YS0+aW5fdXJic1tpXTsKQEAgLTkzNiwxMyArOTM0LDI4IEBACiAJCQkJdXNiX3BpcGVvdXQodXJiLT5waXBlKSwgMCk7ICovCiAJfQogCi0Jb3B0aW9uX3NlbmRfc2V0dXAodHR5LCBwb3J0KTsKKwlvcHRpb25fc2VuZF9zZXR1cChwb3J0KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBvcHRpb25fY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgb3B0aW9uX2R0cl9ydHMoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IG9uKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IG9wdGlvbl9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOworCisJZGJnKCIlcyIsIF9fZnVuY19fKTsKKwlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwltdXRleF9sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOworCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSBvbjsKKwlwb3J0ZGF0YS0+ZHRyX3N0YXRlID0gb247CisJaWYgKHNlcmlhbC0+ZGV2KQorCQlvcHRpb25fc2VuZF9zZXR1cChwb3J0KTsKKwltdXRleF91bmxvY2soJnNlcmlhbC0+ZGlzY19tdXRleCk7Cit9CisKKworc3RhdGljIHZvaWQgb3B0aW9uX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJaW50IGk7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKQEAgLTk1MSwyMiArOTY0LDEzIEBACiAJZGJnKCIlcyIsIF9fZnVuY19fKTsKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAotCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAwOwotCXBvcnRkYXRhLT5kdHJfc3RhdGUgPSAwOwotCiAJaWYgKHNlcmlhbC0+ZGV2KSB7Ci0JCW11dGV4X2xvY2soJnNlcmlhbC0+ZGlzY19tdXRleCk7Ci0JCWlmICghc2VyaWFsLT5kaXNjb25uZWN0ZWQpCi0JCQlvcHRpb25fc2VuZF9zZXR1cCh0dHksIHBvcnQpOwotCQltdXRleF91bmxvY2soJnNlcmlhbC0+ZGlzY19tdXRleCk7Ci0KIAkJLyogU3RvcCByZWFkaW5nL3dyaXRpbmcgdXJicyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgTl9JTl9VUkI7IGkrKykKIAkJCXVzYl9raWxsX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tpXSk7CiAJCWZvciAoaSA9IDA7IGkgPCBOX09VVF9VUkI7IGkrKykKIAkJCXVzYl9raWxsX3VyYihwb3J0ZGF0YS0+b3V0X3VyYnNbaV0pOwogCX0KLQl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCBOVUxMKTsKIH0KIAogLyogSGVscGVyIGZ1bmN0aW9ucyB1c2VkIGJ5IG9wdGlvbl9zZXR1cF91cmJzICovCkBAIC0xMDMyLDI4ICsxMDM2LDI0IEBACiAgKiBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgU0VUX0NPTlRST0xfTElORV9TVEFURSBmcm9tIHRoZSBQU1ROCiAgKiBDREMuCiAqLwotc3RhdGljIGludCBvcHRpb25fc2VuZF9zZXR1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3N0YXRpYyBpbnQgb3B0aW9uX3NlbmRfc2V0dXAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBvcHRpb25fcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKIAlpbnQgaWZOdW0gPSBzZXJpYWwtPmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwlpbnQgdmFsID0gMDsKIAlkYmcoIiVzIiwgX19mdW5jX18pOwogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlpZiAodHR5KSB7Ci0JCWludCB2YWwgPSAwOwotCQlpZiAocG9ydGRhdGEtPmR0cl9zdGF0ZSkKLQkJCXZhbCB8PSAweDAxOwotCQlpZiAocG9ydGRhdGEtPnJ0c19zdGF0ZSkKLQkJCXZhbCB8PSAweDAyOworCWlmIChwb3J0ZGF0YS0+ZHRyX3N0YXRlKQorCQl2YWwgfD0gMHgwMTsKKwlpZiAocG9ydGRhdGEtPnJ0c19zdGF0ZSkKKwkJdmFsIHw9IDB4MDI7CiAKLQkJcmV0dXJuIHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwKLQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCi0JCQkweDIyLCAweDIxLCB2YWwsIGlmTnVtLCBOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Ci0JfQotCXJldHVybiAwOworCXJldHVybiB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsCisJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCisJCTB4MjIsIDB4MjEsIHZhbCwgaWZOdW0sIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIH0KIAogc3RhdGljIGludCBvcHRpb25fc3RhcnR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL290aTY4NTguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vdGk2ODU4LmMKaW5kZXggYmE1NTFmMC4uN2RlNTQ3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL290aTY4NTguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3RpNjg1OC5jCkBAIC0xNDMsOCArMTQzLDcgQEAKIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KIHN0YXRpYyBpbnQgb3RpNjg1OF9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCiAJCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7Ci1zdGF0aWMgdm9pZCBvdGk2ODU4X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCBvdGk2ODU4X2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIHZvaWQgb3RpNjg1OF9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGt0ZXJtaW9zICpvbGQpOwogc3RhdGljIGludCBvdGk2ODU4X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNjIyLDY3ICs2MjEsMzAgQEAKIAlpZiAocmVzdWx0ICE9IDApIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMoKTogdXNiX3N1Ym1pdF91cmIoKSBmYWlsZWQiCiAJCQkgICAgICAgIiB3aXRoIGVycm9yICVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKLQkJb3RpNjg1OF9jbG9zZSh0dHksIHBvcnQsIE5VTEwpOworCQlvdGk2ODU4X2Nsb3NlKHBvcnQpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKIAkvKiBzZXR1cCB0ZXJtaW9zICovCiAJaWYgKHR0eSkKIAkJb3RpNjg1OF9zZXRfdGVybWlvcyh0dHksIHBvcnQsICZ0bXBfdGVybWlvcyk7Ci0KKwlwb3J0LT5wb3J0LmRyYWluX2RlbGF5ID0gMjU2OwkvKiBGSVhNRTogY2hlY2sgdGhlIEZJRk8gbGVuZ3RoICovCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG90aTY4NThfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgb3RpNjg1OF9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBvdGk2ODU4X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlsb25nIHRpbWVvdXQ7Ci0Jd2FpdF9xdWV1ZV90IHdhaXQ7CiAKIAlkYmcoIiVzKHBvcnQgPSAlZCkiLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAotCS8qIHdhaXQgZm9yIGRhdGEgdG8gZHJhaW4gZnJvbSB0aGUgYnVmZmVyICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQl0aW1lb3V0ID0gMzAgKiBIWjsJLyogUEwyMzAzX0NMT1NJTkdfV0FJVCAqLwotCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKLQlhZGRfd2FpdF9xdWV1ZSgmdHR5LT53cml0ZV93YWl0LCAmd2FpdCk7Ci0JZGJnKCIlcygpOiBlbnRlcmluZyB3YWl0IGxvb3AiLCBfX2Z1bmNfXyk7Ci0JZm9yICg7OykgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCQlpZiAob3RpNjg1OF9idWZfZGF0YV9hdmFpbChwcml2LT5idWYpID09IDAKLQkJfHwgdGltZW91dCA9PSAwIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpCi0JCXx8IHBvcnQtPnNlcmlhbC0+ZGlzY29ubmVjdGVkKQotCQkJYnJlYWs7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCWRiZygiJXMoKTogYWZ0ZXIgd2FpdCBsb29wIiwgX19mdW5jX18pOwotCiAJLyogY2xlYXIgb3V0IGFueSByZW1haW5pbmcgZGF0YSBpbiB0aGUgYnVmZmVyICovCiAJb3RpNjg1OF9idWZfY2xlYXIocHJpdi0+YnVmKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQkvKiB3YWl0IGZvciBjaGFyYWN0ZXJzIHRvIGRyYWluIGZyb20gdGhlIGRldmljZSAqLwotCS8qICh0aGlzIGlzIGxvbmcgZW5vdWdoIGZvciB0aGUgZW50aXJlIDI1NiBieXRlICovCi0JLyogcGwyMzAzIGhhcmR3YXJlIGJ1ZmZlciB0byBkcmFpbiB3aXRoIG5vIGZsb3cgKi8KLQkvKiBjb250cm9sIGZvciBkYXRhIHJhdGVzIG9mIDEyMDAgYnBzIG9yIG1vcmUsICovCi0JLyogZm9yIGxvd2VyIHJhdGVzIHdlIHNob3VsZCByZWFsbHkga25vdyBob3cgbXVjaCAqLwotCS8qIGRhdGEgaXMgaW4gdGhlIGJ1ZmZlciB0byBjb21wdXRlIGEgZGVsYXkgKi8KLQkvKiB0aGF0IGlzIG5vdCB1bm5lY2Vzc2FyaWx5IGxvbmcpICovCi0JLyogRklYTUUKLQlicHMgPSB0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpOwotCWlmIChicHMgPiAxMjAwKQotCQl0aW1lb3V0ID0gbWF4KChIWioyNTYwKS9icHMsSFovMTApOwotCWVsc2UKLQkqLwotCQl0aW1lb3V0ID0gMipIWjsKLQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7Ci0JZGJnKCIlcygpOiBhZnRlciBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoKSIsIF9fZnVuY19fKTsKKwlkYmcoIiVzKCk6IGFmdGVyIGJ1Zl9jbGVhcigpIiwgX19mdW5jX18pOwogCiAJLyogY2FuY2VsIHNjaGVkdWxlZCBzZXR1cCAqLwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmRlbGF5ZWRfc2V0dXBfd29yayk7CkBAIC02OTQsMTUgKzY1Niw2IEBACiAJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7Ci0KLQkvKgotCWlmICh0dHkgJiYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZykgJiBIVVBDTCkgewotCQkvLyBkcm9wIERUUiBhbmQgUlRTCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXByaXYtPnBlbmRpbmdfc2V0dXAuY29udHJvbCAmPSB+Q09OVFJPTF9NQVNLOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JfQotCSovCiB9CiAKIHN0YXRpYyBpbnQgb3RpNjg1OF90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwppbmRleCA3NTFhNTMzLi5lMDJkYzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCkBAIC02NTIsNjkgKzY1Miw0MSBAQAogCWtmcmVlKGJ1Zik7CiB9CiAKLXN0YXRpYyB2b2lkIHBsMjMwM19jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAotCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCitzdGF0aWMgdm9pZCBwbDIzMDNfZHRyX3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pCiB7CiAJc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGNfY2ZsYWc7Ci0JaW50IGJwczsKLQlsb25nIHRpbWVvdXQ7Ci0Jd2FpdF9xdWV1ZV90IHdhaXQ7CisJdTggY29udHJvbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJLyogQ2hhbmdlIERUUiBhbmQgUlRTICovCisJaWYgKG9uKQorCQlwcml2LT5saW5lX2NvbnRyb2wgfD0gKENPTlRST0xfRFRSIHwgQ09OVFJPTF9SVFMpOworCWVsc2UKKwkJcHJpdi0+bGluZV9jb250cm9sICY9IH4oQ09OVFJPTF9EVFIgfCBDT05UUk9MX1JUUyk7CisJY29udHJvbCA9IHByaXYtPmxpbmVfY29udHJvbDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc2V0X2NvbnRyb2xfbGluZXMocG9ydC0+c2VyaWFsLT5kZXYsIGNvbnRyb2wpOworfQorCitzdGF0aWMgdm9pZCBwbDIzMDNfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKLQkvKiB3YWl0IGZvciBkYXRhIHRvIGRyYWluIGZyb20gdGhlIGJ1ZmZlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JdGltZW91dCA9IFBMMjMwM19DTE9TSU5HX1dBSVQ7Ci0JaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwotCWFkZF93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKLQlmb3IgKDs7KSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCWlmIChwbDIzMDNfYnVmX2RhdGFfYXZhaWwocHJpdi0+YnVmKSA9PSAwIHx8Ci0JCSAgICB0aW1lb3V0ID09IDAgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgfHwKLQkJICAgIHBvcnQtPnNlcmlhbC0+ZGlzY29ubmVjdGVkKQotCQkJYnJlYWs7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwogCS8qIGNsZWFyIG91dCBhbnkgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciAqLwogCXBsMjMwM19idWZfY2xlYXIocHJpdi0+YnVmKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQkvKiB3YWl0IGZvciBjaGFyYWN0ZXJzIHRvIGRyYWluIGZyb20gdGhlIGRldmljZSAqLwotCS8qICh0aGlzIGlzIGxvbmcgZW5vdWdoIGZvciB0aGUgZW50aXJlIDI1NiBieXRlICovCi0JLyogcGwyMzAzIGhhcmR3YXJlIGJ1ZmZlciB0byBkcmFpbiB3aXRoIG5vIGZsb3cgKi8KLQkvKiBjb250cm9sIGZvciBkYXRhIHJhdGVzIG9mIDEyMDAgYnBzIG9yIG1vcmUsICovCi0JLyogZm9yIGxvd2VyIHJhdGVzIHdlIHNob3VsZCByZWFsbHkga25vdyBob3cgbXVjaCAqLwotCS8qIGRhdGEgaXMgaW4gdGhlIGJ1ZmZlciB0byBjb21wdXRlIGEgZGVsYXkgKi8KLQkvKiB0aGF0IGlzIG5vdCB1bm5lY2Vzc2FyaWx5IGxvbmcpICovCi0JYnBzID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKLQlpZiAoYnBzID4gMTIwMCkKLQkJdGltZW91dCA9IG1heCgoSFoqMjU2MCkvYnBzLCBIWi8xMCk7Ci0JZWxzZQotCQl0aW1lb3V0ID0gMipIWjsKLQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7Ci0KIAkvKiBzaHV0ZG93biBvdXIgdXJicyAqLwogCWRiZygiJXMgLSBzaHV0dGluZyBkb3duIHVyYnMiLCBfX2Z1bmNfXyk7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7CiAJdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CiAKLQlpZiAodHR5KSB7Ci0JCWNfY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCWlmIChjX2NmbGFnICYgSFVQQ0wpIHsKLQkJCS8qIGRyb3AgRFRSIGFuZCBSVFMgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlwcml2LT5saW5lX2NvbnRyb2wgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJc2V0X2NvbnRyb2xfbGluZXMocG9ydC0+c2VyaWFsLT5kZXYsIDApOwotCQl9Ci0JfQogfQogCiBzdGF0aWMgaW50IHBsMjMwM19vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCkBAIC03NDgsNyArNzIwLDcgQEAKIAlpZiAocmVzdWx0KSB7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIgogCQkJIiBlcnJvciAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7Ci0JCXBsMjMwM19jbG9zZSh0dHksIHBvcnQsIE5VTEwpOworCQlwbDIzMDNfY2xvc2UocG9ydCk7CiAJCXJldHVybiAtRVBST1RPOwogCX0KIApAQCAtNzU4LDkgKzczMCwxMCBAQAogCWlmIChyZXN1bHQpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiLCIKIAkJCSIgZXJyb3IgJWRcbiIsIF9fZnVuY19fLCByZXN1bHQpOwotCQlwbDIzMDNfY2xvc2UodHR5LCBwb3J0LCBOVUxMKTsKKwkJcGwyMzAzX2Nsb3NlKHBvcnQpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CisJcG9ydC0+cG9ydC5kcmFpbl9kZWxheSA9IDI1NjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODIxLDYgKzc5NCwxNCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgcGwyMzAzX2NhcnJpZXJfcmFpc2VkKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWlmIChwcml2LT5saW5lX3N0YXR1cyAmIFVBUlRfRENEKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB3YWl0X21vZGVtX2luZm8oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGFyZykKIHsKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0xMTI1LDYgKzExMDYsOCBAQAogCS5udW1fcG9ydHMgPQkJMSwKIAkub3BlbiA9CQkJcGwyMzAzX29wZW4sCiAJLmNsb3NlID0JCXBsMjMwM19jbG9zZSwKKwkuZHRyX3J0cyA9IAkJcGwyMzAzX2R0cl9ydHMsCisJLmNhcnJpZXJfcmFpc2VkID0JcGwyMzAzX2NhcnJpZXJfcmFpc2VkLAogCS53cml0ZSA9CQlwbDIzMDNfd3JpdGUsCiAJLmlvY3RsID0JCXBsMjMwM19pb2N0bCwKIAkuYnJlYWtfY3RsID0JCXBsMjMwM19icmVha19jdGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc2llcnJhLmMKaW5kZXggOTEzMjI1Yy4uMTdhYzM0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3NpZXJyYS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zaWVycmEuYwpAQCAtMjYsMTIgKzI2LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KIAogI2RlZmluZSBTV0lNU19VU0JfUkVRVUVTVF9TZXRQb3dlcgkweDAwCiAjZGVmaW5lIFNXSU1TX1VTQl9SRVFVRVNUX1NldE5tZWEJMHgwNwogCi0vKiBwZXIgcG9ydCBwcml2YXRlIGRhdGEgKi8KICNkZWZpbmUgTl9JTl9VUkIJNAogI2RlZmluZSBOX09VVF9VUkIJNAogI2RlZmluZSBJTl9CVUZMRU4JNDA5NgpAQCAtMzksNiArMzcsMTIgQEAKIHN0YXRpYyBpbnQgZGVidWc7CiBzdGF0aWMgaW50IG5tZWE7CiAKKy8qIFVzZWQgaW4gaW50ZXJmYWNlIGJsYWNrbGlzdGluZyAqLworc3RydWN0IHNpZXJyYV9pZmFjZV9pbmZvIHsKKwljb25zdCB1MzIgaW5mb2xlbjsJLyogbnVtYmVyIG9mIGludGVyZmFjZSBudW1iZXJzIG9uIGJsYWNrbGlzdCAqLworCWNvbnN0IHU4ICAqaWZhY2VpbmZvOwkvKiBwb2ludGVyIHRvIHRoZSBhcnJheSBob2xkaW5nIHRoZSBudW1iZXJzICovCit9OworCiBzdGF0aWMgaW50IHNpZXJyYV9zZXRfcG93ZXJfc3RhdGUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIF9fdTE2IHN3aVN0YXRlKQogewogCWludCByZXN1bHQ7CkBAIC04NSw2ICs4OSwyMyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgaXNfYmxhY2tsaXN0ZWQoY29uc3QgdTggaWZudW0sCisJCQkJY29uc3Qgc3RydWN0IHNpZXJyYV9pZmFjZV9pbmZvICpibGFja2xpc3QpCit7CisJY29uc3QgdTggICppbmZvOworCWludCBpOworCisJaWYgKGJsYWNrbGlzdCkgeworCQlpbmZvID0gYmxhY2tsaXN0LT5pZmFjZWluZm87CisKKwkJZm9yIChpID0gMDsgaSA8IGJsYWNrbGlzdC0+aW5mb2xlbjsgaSsrKSB7CisJCQlpZiAoaW5mb1tpXSA9PSBpZm51bSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzaWVycmFfY2FsY19pbnRlcmZhY2Uoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKIAlpbnQgaW50ZXJmYWNlOwpAQCAtMTUzLDkgKzE3NCwyNSBAQAogCSAqLwogCXVzYl9zZXRfc2VyaWFsX2RhdGEoc2VyaWFsLCAodm9pZCAqKW51bV9wb3J0cyk7CiAKKwkvKiBpZm51bSBjb3VsZCBoYXZlIGNoYW5nZWQgLSBieSBjYWxsaW5nIHVzYl9zZXRfaW50ZXJmYWNlICovCisJaWZudW0gPSBzaWVycmFfY2FsY19pbnRlcmZhY2Uoc2VyaWFsKTsKKworCWlmIChpc19ibGFja2xpc3RlZChpZm51bSwKKwkJCQkoc3RydWN0IHNpZXJyYV9pZmFjZV9pbmZvICopaWQtPmRyaXZlcl9pbmZvKSkgeworCQlkZXZfZGJnKCZzZXJpYWwtPmRldi0+ZGV2LAorCQkJIklnbm9yaW5nIGJsYWNrbGlzdGVkIGludGVyZmFjZSAjJWRcbiIsIGlmbnVtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGNvbnN0IHU4IGRpcmVjdF9pcF9ub25fc2VyaWFsX2lmYWNlc1tdID0geyA3LCA4LCA5LCAxMCwgMTEgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2llcnJhX2lmYWNlX2luZm8gZGlyZWN0X2lwX2ludGVyZmFjZV9ibGFja2xpc3QgPSB7CisJLmluZm9sZW4gPSBBUlJBWV9TSVpFKGRpcmVjdF9pcF9ub25fc2VyaWFsX2lmYWNlcyksCisJLmlmYWNlaW5mbyA9IGRpcmVjdF9pcF9ub25fc2VyaWFsX2lmYWNlcywKK307CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTcpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBFTTU2MjUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAwMTgpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjAgKi8KQEAgLTE4OCw5ICsyMjUsMTEgQEAKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4MzMpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3ODEgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4M0EpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3ODUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4M0IpIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBNQzg3ODUgQ29tcG9zaXRlICovCi0JeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODNDKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzkwICovCi0JeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODNEKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzkwICovCi0JeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODNFKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzkwICovCisJLyogU2llcnJhIFdpcmVsZXNzIE1DODc5MCwgTUM4NzkxLCBNQzg3OTIgQ29tcG9zaXRlICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODNDKSB9LAorCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgzRCkgfSwJLyogU2llcnJhIFdpcmVsZXNzIE1DODc5MSBDb21wb3NpdGUgKi8KKwkvKiBTaWVycmEgV2lyZWxlc3MgTUM4NzkwLCBNQzg3OTEsIE1DODc5MiAqLworCXsgVVNCX0RFVklDRSgweDExOTksIDB4NjgzRSkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDY4NTApIH0sCS8qIFNpZXJyYSBXaXJlbGVzcyBBaXJDYXJkIDg4MCAqLwogCXsgVVNCX0RFVklDRSgweDExOTksIDB4Njg1MSkgfSwJLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgODgxICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2ODUyKSB9LAkvKiBTaWVycmEgV2lyZWxlc3MgQWlyQ2FyZCA4ODAgRSAqLwpAQCAtMjExLDYgKzI1MCwxMCBAQAogCXsgVVNCX0RFVklDRSgweDExOTksIDB4MDExMikgfSwgLyogU2llcnJhIFdpcmVsZXNzIEFpckNhcmQgNTgwICovCiAJeyBVU0JfREVWSUNFKDB4MEYzRCwgMHgwMTEyKSB9LCAvKiBBaXJwcmltZS9TaWVycmEgUEMgNTIyMCAqLwogCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHg2OEEzKSwgCS8qIFNpZXJyYSBXaXJlbGVzcyBEaXJlY3QgSVAgbW9kZW1zICovCisJICAuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJmRpcmVjdF9pcF9pbnRlcmZhY2VfYmxhY2tsaXN0CisJfSwKKwogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CkBAIC0yMjksNyArMjcyLDYgQEAKIAogCS8qIElucHV0IGVuZHBvaW50cyBhbmQgYnVmZmVycyBmb3IgdGhpcyBwb3J0ICovCiAJc3RydWN0IHVyYiAqaW5fdXJic1tOX0lOX1VSQl07Ci0JY2hhciAqaW5fYnVmZmVyW05fSU5fVVJCXTsKIAogCS8qIFNldHRpbmdzIGZvciB0aGUgcG9ydCAqLwogCWludCBydHNfc3RhdGU7CS8qIEhhbmRzaGFraW5nIHBpbnMgKG91dHB1dHMpICovCkBAIC0yNDAsNTcgKzI4Miw1MCBAQAogCWludCByaV9zdGF0ZTsKIH07CiAKLXN0YXRpYyBpbnQgc2llcnJhX3NlbmRfc2V0dXAoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IHNpZXJyYV9zZW5kX3NldHVwKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAJX191MTYgaW50ZXJmYWNlID0gMDsKKwlpbnQgdmFsID0gMDsKIAogCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIiwgX19mdW5jX18pOwogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKLQlpZiAodHR5KSB7Ci0JCWludCB2YWwgPSAwOwotCQlpZiAocG9ydGRhdGEtPmR0cl9zdGF0ZSkKLQkJCXZhbCB8PSAweDAxOwotCQlpZiAocG9ydGRhdGEtPnJ0c19zdGF0ZSkKLQkJCXZhbCB8PSAweDAyOworCWlmIChwb3J0ZGF0YS0+ZHRyX3N0YXRlKQorCQl2YWwgfD0gMHgwMTsKKwlpZiAocG9ydGRhdGEtPnJ0c19zdGF0ZSkKKwkJdmFsIHw9IDB4MDI7CiAKLQkJLyogSWYgY29tcG9zaXRlIGRldmljZSB0aGVuIHByb3Blcmx5IHJlcG9ydCBpbnRlcmZhY2UgKi8KLQkJaWYgKHNlcmlhbC0+bnVtX3BvcnRzID09IDEpIHsKLQkJCWludGVyZmFjZSA9IHNpZXJyYV9jYWxjX2ludGVyZmFjZShzZXJpYWwpOwotCi0JCQkvKiBDb250cm9sIG1lc3NhZ2UgaXMgc2VudCBvbmx5IHRvIGludGVyZmFjZXMgd2l0aAotCQkJICogaW50ZXJydXB0X2luIGVuZHBvaW50cwotCQkJICovCi0JCQlpZiAocG9ydC0+aW50ZXJydXB0X2luX3VyYikgewotCQkJCS8qIHNlbmQgY29udHJvbCBtZXNzYWdlICovCi0JCQkJcmV0dXJuIHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwKLQkJCQkJdXNiX3JjdmN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKLQkJCQkJMHgyMiwgMHgyMSwgdmFsLCBpbnRlcmZhY2UsCi0JCQkJCU5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKLQkJCX0KLQkJfQotCi0JCS8qIE90aGVyd2lzZSB0aGUgbmVlZCB0byBkbyBub24tY29tcG9zaXRlIG1hcHBpbmcgKi8KLQkJZWxzZSB7Ci0JCQlpZiAocG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzID09IDIpCi0JCQkJaW50ZXJmYWNlID0gMDsKLQkJCWVsc2UgaWYgKHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyA9PSA0KQotCQkJCWludGVyZmFjZSA9IDE7Ci0JCQllbHNlIGlmIChwb3J0LT5idWxrX291dF9lbmRwb2ludEFkZHJlc3MgPT0gNSkKLQkJCQlpbnRlcmZhY2UgPSAyOwotCisJLyogSWYgY29tcG9zaXRlIGRldmljZSB0aGVuIHByb3Blcmx5IHJlcG9ydCBpbnRlcmZhY2UgKi8KKwlpZiAoc2VyaWFsLT5udW1fcG9ydHMgPT0gMSkgeworCQlpbnRlcmZhY2UgPSBzaWVycmFfY2FsY19pbnRlcmZhY2Uoc2VyaWFsKTsKKwkJLyogQ29udHJvbCBtZXNzYWdlIGlzIHNlbnQgb25seSB0byBpbnRlcmZhY2VzIHdpdGgKKwkJICogaW50ZXJydXB0X2luIGVuZHBvaW50cworCQkgKi8KKwkJaWYgKHBvcnQtPmludGVycnVwdF9pbl91cmIpIHsKKwkJCS8qIHNlbmQgY29udHJvbCBtZXNzYWdlICovCiAJCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAogCQkJCXVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCiAJCQkJMHgyMiwgMHgyMSwgdmFsLCBpbnRlcmZhY2UsCiAJCQkJTlVMTCwgMCwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwotCiAJCX0KIAl9CiAKKwkvKiBPdGhlcndpc2UgdGhlIG5lZWQgdG8gZG8gbm9uLWNvbXBvc2l0ZSBtYXBwaW5nICovCisJZWxzZSB7CisJCWlmIChwb3J0LT5idWxrX291dF9lbmRwb2ludEFkZHJlc3MgPT0gMikKKwkJCWludGVyZmFjZSA9IDA7CisJCWVsc2UgaWYgKHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyA9PSA0KQorCQkJaW50ZXJmYWNlID0gMTsKKwkJZWxzZSBpZiAocG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzID09IDUpCisJCQlpbnRlcmZhY2UgPSAyOworCQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAorCQkJdXNiX3JjdmN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKKwkJCTB4MjIsIDB4MjEsIHZhbCwgaW50ZXJmYWNlLAorCQkJTlVMTCwgMCwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjk5LDcgKzMzNCw3IEBACiB7CiAJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMiLCBfX2Z1bmNfXyk7CiAJdHR5X3Rlcm1pb3NfY29weV9odyh0dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKTsKLQlzaWVycmFfc2VuZF9zZXR1cCh0dHksIHBvcnQpOworCXNpZXJyYV9zZW5kX3NldHVwKHBvcnQpOwogfQogCiBzdGF0aWMgaW50IHNpZXJyYV90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTMzOCw3ICszNzMsMTggQEAKIAkJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDA7CiAJaWYgKGNsZWFyICYgVElPQ01fRFRSKQogCQlwb3J0ZGF0YS0+ZHRyX3N0YXRlID0gMDsKLQlyZXR1cm4gc2llcnJhX3NlbmRfc2V0dXAodHR5LCBwb3J0KTsKKwlyZXR1cm4gc2llcnJhX3NlbmRfc2V0dXAocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZXJyYV9yZWxlYXNlX3VyYihzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKwlpZiAodXJiKSB7CisJCXBvcnQgPSAgdXJiLT5jb250ZXh0OworCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlczogJXBcbiIsIF9fZnVuY19fLCB1cmIpOworCQlrZnJlZSh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJCXVzYl9mcmVlX3VyYih1cmIpOworCX0KIH0KIAogc3RhdGljIHZvaWQgc2llcnJhX291dGRhdF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCkBAIC00NjUsNyArNTExLDcgQEAKIAkJCQkiIHJlY2VpdmVkIiwgX19mdW5jX18pOwogCiAJCS8qIFJlc3VibWl0IHVyYiBzbyB3ZSBjb250aW51ZSByZWNlaXZpbmcgKi8KLQkJaWYgKHBvcnQtPnBvcnQuY291bnQgJiYgc3RhdHVzICE9IC1FU0hVVERPV04pIHsKKwkJaWYgKHBvcnQtPnBvcnQuY291bnQgJiYgc3RhdHVzICE9IC1FU0hVVERPV04gJiYgc3RhdHVzICE9IC1FUEVSTSkgewogCQkJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChlcnIpCiAJCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAicmVzdWJtaXQgcmVhZCB1cmIgZmFpbGVkLiIKQEAgLTU1NywxNCArNjAzLDEyOSBAQAogCXJldHVybiAyMDQ4OwogfQogCitzdGF0aWMgdm9pZCBzaWVycmFfc3RvcF9yeF91cmJzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJaW50IGk7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydGRhdGEtPmluX3VyYnMpOyBpKyspCisJCXVzYl9raWxsX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tpXSk7CisKKwl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7Cit9CisKK3N0YXRpYyBpbnQgc2llcnJhX3N1Ym1pdF9yeF91cmJzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGdmcF90IG1lbV9mbGFncykKK3sKKwlpbnQgb2tfY250OworCWludCBlcnIgPSAtRUlOVkFMOworCWludCBpOworCXN0cnVjdCB1cmIgKnVyYjsKKwlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisKKwlva19jbnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBvcnRkYXRhLT5pbl91cmJzKTsgaSsrKSB7CisJCXVyYiA9IHBvcnRkYXRhLT5pbl91cmJzW2ldOworCQlpZiAoIXVyYikKKwkJCWNvbnRpbnVlOworCQllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIG1lbV9mbGFncyk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzOiBzdWJtaXQgdXJiIGZhaWxlZDogJWRcbiIsCisJCQkJX19mdW5jX18sIGVycik7CisJCX0gZWxzZSB7CisJCQlva19jbnQrKzsKKwkJfQorCX0KKworCWlmIChva19jbnQgJiYgcG9ydC0+aW50ZXJydXB0X2luX3VyYikgeworCQllcnIgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBtZW1fZmxhZ3MpOworCQlpZiAoZXJyKSB7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlczogc3VibWl0IGludHIgdXJiIGZhaWxlZDogJWRcbiIsCisJCQkJX19mdW5jX18sIGVycik7CisJCX0KKwl9CisKKwlpZiAob2tfY250ID4gMCkgLyogYXQgbGVhc3Qgb25lIHJ4IHVyYiBzdWJtaXR0ZWQgKi8KKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IHVyYiAqc2llcnJhX3NldHVwX3VyYihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBpbnQgZW5kcG9pbnQsCisJCQkJCWludCBkaXIsIHZvaWQgKmN0eCwgaW50IGxlbiwKKwkJCQkJZ2ZwX3QgbWVtX2ZsYWdzLAorCQkJCQl1c2JfY29tcGxldGVfdCBjYWxsYmFjaykKK3sKKwlzdHJ1Y3QgdXJiCSp1cmI7CisJdTgJCSpidWY7CisKKwlpZiAoZW5kcG9pbnQgPT0gLTEpCisJCXJldHVybiBOVUxMOworCisJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBtZW1fZmxhZ3MpOworCWlmICh1cmIgPT0gTlVMTCkgeworCQlkZXZfZGJnKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXM6IGFsbG9jIGZvciBlbmRwb2ludCAlZCBmYWlsZWRcbiIsCisJCQlfX2Z1bmNfXywgZW5kcG9pbnQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlidWYgPSBrbWFsbG9jKGxlbiwgbWVtX2ZsYWdzKTsKKwlpZiAoYnVmKSB7CisJCS8qIEZpbGwgVVJCIHVzaW5nIHN1cHBsaWVkIGRhdGEgKi8KKwkJdXNiX2ZpbGxfYnVsa191cmIodXJiLCBzZXJpYWwtPmRldiwKKwkJCXVzYl9zbmRidWxrcGlwZShzZXJpYWwtPmRldiwgZW5kcG9pbnQpIHwgZGlyLAorCQkJYnVmLCBsZW4sIGNhbGxiYWNrLCBjdHgpOworCisJCS8qIGRlYnVnICovCisJCWRldl9kYmcoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyAlYyB1IDogJXAgZDolcFxuIiwgX19mdW5jX18sCisJCQkJZGlyID09IFVTQl9ESVJfSU4gPyAnaScgOiAnbycsIHVyYiwgYnVmKTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZzZXJpYWwtPmRldi0+ZGV2LCAiJXMgJWMgdTolcCBkOiVwXG4iLCBfX2Z1bmNfXywKKwkJCQlkaXIgPT0gVVNCX0RJUl9JTiA/ICdpJyA6ICdvJywgdXJiLCBidWYpOworCisJCXNpZXJyYV9yZWxlYXNlX3VyYih1cmIpOworCQl1cmIgPSBOVUxMOworCX0KKworCXJldHVybiB1cmI7Cit9CisKK3N0YXRpYyB2b2lkIHNpZXJyYV9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWludCBpOworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOworCisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAwOworCXBvcnRkYXRhLT5kdHJfc3RhdGUgPSAwOworCisJaWYgKHNlcmlhbC0+ZGV2KSB7CisJCW11dGV4X2xvY2soJnNlcmlhbC0+ZGlzY19tdXRleCk7CisJCWlmICghc2VyaWFsLT5kaXNjb25uZWN0ZWQpCisJCQlzaWVycmFfc2VuZF9zZXR1cChwb3J0KTsKKwkJbXV0ZXhfdW5sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOworCisJCS8qIFN0b3AgcmVhZGluZyB1cmJzICovCisJCXNpZXJyYV9zdG9wX3J4X3VyYnMocG9ydCk7CisJCS8qIC4uIGFuZCByZWxlYXNlIHRoZW0gKi8KKwkJZm9yIChpID0gMDsgaSA8IE5fSU5fVVJCOyBpKyspIHsKKwkJCXNpZXJyYV9yZWxlYXNlX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tpXSk7CisJCQlwb3J0ZGF0YS0+aW5fdXJic1tpXSA9IE5VTEw7CisJCX0KKwl9Cit9CisKIHN0YXRpYyBpbnQgc2llcnJhX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQogewogCXN0cnVjdCBzaWVycmFfcG9ydF9wcml2YXRlICpwb3J0ZGF0YTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCWludCBpOworCWludCBlcnI7CisJaW50IGVuZHBvaW50OwogCXN0cnVjdCB1cmIgKnVyYjsKLQlpbnQgcmVzdWx0OwogCiAJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKQEAgLTU3NCw3NyArNzM1LDUyIEBACiAJcG9ydGRhdGEtPnJ0c19zdGF0ZSA9IDE7CiAJcG9ydGRhdGEtPmR0cl9zdGF0ZSA9IDE7CiAKLQkvKiBSZXNldCBsb3cgbGV2ZWwgZGF0YSB0b2dnbGUgYW5kIHN0YXJ0IHJlYWRpbmcgZnJvbSBlbmRwb2ludHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTl9JTl9VUkI7IGkrKykgewotCQl1cmIgPSBwb3J0ZGF0YS0+aW5fdXJic1tpXTsKLQkJaWYgKCF1cmIpCi0JCQljb250aW51ZTsKLQkJaWYgKHVyYi0+ZGV2ICE9IHNlcmlhbC0+ZGV2KSB7Ci0JCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlczogZGV2ICVwICE9ICVwIiwKLQkJCQkgX19mdW5jX18sIHVyYi0+ZGV2LCBzZXJpYWwtPmRldik7Ci0JCQljb250aW51ZTsKLQkJfQogCi0JCS8qCi0JCSAqIG1ha2Ugc3VyZSBlbmRwb2ludCBkYXRhIHRvZ2dsZSBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUKLQkJICogZGV2aWNlCi0JCSAqLwotCQl1c2JfY2xlYXJfaGFsdCh1cmItPmRldiwgdXJiLT5waXBlKTsKLQotCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9LRVJORUwpOwotCQlpZiAocmVzdWx0KSB7Ci0JCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJzdWJtaXQgdXJiICVkIGZhaWxlZCAoJWQpICVkXG4iLAotCQkJCWksIHJlc3VsdCwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoKTsKLQkJfQorCWVuZHBvaW50ID0gcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3M7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocG9ydGRhdGEtPmluX3VyYnMpOyBpKyspIHsKKwkJdXJiID0gc2llcnJhX3NldHVwX3VyYihzZXJpYWwsIGVuZHBvaW50LCBVU0JfRElSX0lOLCBwb3J0LAorCQkJCQlJTl9CVUZMRU4sIEdGUF9LRVJORUwsCisJCQkJCXNpZXJyYV9pbmRhdF9jYWxsYmFjayk7CisJCXBvcnRkYXRhLT5pbl91cmJzW2ldID0gdXJiOwogCX0KKwkvKiBjbGVhciBoYWx0IGNvbmRpdGlvbiAqLworCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LAorCQkJdXNiX3NuZGJ1bGtwaXBlKHNlcmlhbC0+ZGV2LCBlbmRwb2ludCkgfCBVU0JfRElSX0lOKTsKIAotCXNpZXJyYV9zZW5kX3NldHVwKHR0eSwgcG9ydCk7Ci0KLQkvKiBzdGFydCB1cCB0aGUgaW50ZXJydXB0IGVuZHBvaW50IGlmIHdlIGhhdmUgb25lICovCi0JaWYgKHBvcnQtPmludGVycnVwdF9pbl91cmIpIHsKLQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChyZXN1bHQpCi0JCQlkZXZfZXJyKCZwb3J0LT5kZXYsICJzdWJtaXQgaXJxX2luIHVyYiBmYWlsZWQgJWRcbiIsCi0JCQkJcmVzdWx0KTsKKwllcnIgPSBzaWVycmFfc3VibWl0X3J4X3VyYnMocG9ydCwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycikgeworCQkvKiBnZXQgcmlkIG9mIGV2ZXJ5dGhpbmcgYXMgaW4gY2xvc2UgKi8KKwkJc2llcnJhX2Nsb3NlKHBvcnQpOworCQlyZXR1cm4gZXJyOwogCX0KKwlzaWVycmFfc2VuZF9zZXR1cChwb3J0KTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzaWVycmFfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorCitzdGF0aWMgdm9pZCBzaWVycmFfZHRyX3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pCiB7Ci0JaW50IGk7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKLQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlcyIsIF9fZnVuY19fKTsKIAlwb3J0ZGF0YSA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKLQotCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSAwOwotCXBvcnRkYXRhLT5kdHJfc3RhdGUgPSAwOworCXBvcnRkYXRhLT5ydHNfc3RhdGUgPSBvbjsKKwlwb3J0ZGF0YS0+ZHRyX3N0YXRlID0gb247CiAKIAlpZiAoc2VyaWFsLT5kZXYpIHsKIAkJbXV0ZXhfbG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKIAkJaWYgKCFzZXJpYWwtPmRpc2Nvbm5lY3RlZCkKLQkJCXNpZXJyYV9zZW5kX3NldHVwKHR0eSwgcG9ydCk7CisJCQlzaWVycmFfc2VuZF9zZXR1cChwb3J0KTsKIAkJbXV0ZXhfdW5sb2NrKCZzZXJpYWwtPmRpc2NfbXV0ZXgpOwotCi0JCS8qIFN0b3AgcmVhZGluZy93cml0aW5nIHVyYnMgKi8KLQkJZm9yIChpID0gMDsgaSA8IE5fSU5fVVJCOyBpKyspCi0JCQl1c2Jfa2lsbF91cmIocG9ydGRhdGEtPmluX3VyYnNbaV0pOwogCX0KLQotCXVzYl9raWxsX3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiKTsKLQl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBzaWVycmFfc3RhcnR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CiAJc3RydWN0IHNpZXJyYV9wb3J0X3ByaXZhdGUgKnBvcnRkYXRhOwotCXN0cnVjdCB1cmIgKnVyYjsKIAlpbnQgaTsKLQlpbnQgajsKIAogCWRldl9kYmcoJnNlcmlhbC0+ZGV2LT5kZXYsICIlcyIsIF9fZnVuY19fKTsKIApAQCAtNjY2LDM0ICs4MDIsOCBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAkJc3Bpbl9sb2NrX2luaXQoJnBvcnRkYXRhLT5sb2NrKTsKLQkJZm9yIChqID0gMDsgaiA8IE5fSU5fVVJCOyBqKyspIHsKLQkJCXBvcnRkYXRhLT5pbl9idWZmZXJbal0gPSBrbWFsbG9jKElOX0JVRkxFTiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAoIXBvcnRkYXRhLT5pbl9idWZmZXJbal0pIHsKLQkJCQlmb3IgKC0tajsgaiA+PSAwOyBqLS0pCi0JCQkJCWtmcmVlKHBvcnRkYXRhLT5pbl9idWZmZXJbal0pOwotCQkJCWtmcmVlKHBvcnRkYXRhKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJfQotCisJCS8qIFNldCB0aGUgcG9ydCBwcml2YXRlIGRhdGEgcG9pbnRlciAqLwogCQl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgcG9ydGRhdGEpOwotCi0JCS8qIGluaXRpYWxpemUgdGhlIGluIHVyYnMgKi8KLQkJZm9yIChqID0gMDsgaiA8IE5fSU5fVVJCOyArK2opIHsKLQkJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCQlkZXZfZGJnKCZwb3J0LT5kZXYsICIlczogYWxsb2MgZm9yIGluICIKLQkJCQkJInBvcnQgZmFpbGVkLiIsIF9fZnVuY19fKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qIEZpbGwgVVJCIHVzaW5nIHN1cHBsaWVkIGRhdGEuICovCi0JCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlcmlhbC0+ZGV2LAotCQkJCQkgIHVzYl9yY3ZidWxrcGlwZShzZXJpYWwtPmRldiwKLQkJCQkJCXBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKLQkJCQkJICBwb3J0ZGF0YS0+aW5fYnVmZmVyW2pdLCBJTl9CVUZMRU4sCi0JCQkJCSAgc2llcnJhX2luZGF0X2NhbGxiYWNrLCBwb3J0KTsKLQkJCXBvcnRkYXRhLT5pbl91cmJzW2pdID0gdXJiOwotCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC03MDEsNyArODExLDcgQEAKIAogc3RhdGljIHZvaWQgc2llcnJhX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7Ci0JaW50IGksIGo7CisJaW50IGk7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIAlzdHJ1Y3Qgc2llcnJhX3BvcnRfcHJpdmF0ZSAqcG9ydGRhdGE7CiAKQEAgLTcxNCwxMiArODI0LDYgQEAKIAkJcG9ydGRhdGEgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJCWlmICghcG9ydGRhdGEpCiAJCQljb250aW51ZTsKLQotCQlmb3IgKGogPSAwOyBqIDwgTl9JTl9VUkI7IGorKykgewotCQkJdXNiX2tpbGxfdXJiKHBvcnRkYXRhLT5pbl91cmJzW2pdKTsKLQkJCXVzYl9mcmVlX3VyYihwb3J0ZGF0YS0+aW5fdXJic1tqXSk7Ci0JCQlrZnJlZShwb3J0ZGF0YS0+aW5fYnVmZmVyW2pdKTsKLQkJfQogCQlrZnJlZShwb3J0ZGF0YSk7CiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBOVUxMKTsKIAl9CkBAIC03MzcsNiArODQxLDcgQEAKIAkucHJvYmUJCSAgID0gc2llcnJhX3Byb2JlLAogCS5vcGVuICAgICAgICAgICAgICA9IHNpZXJyYV9vcGVuLAogCS5jbG9zZSAgICAgICAgICAgICA9IHNpZXJyYV9jbG9zZSwKKwkuZHRyX3J0cwkgICA9IHNpZXJyYV9kdHJfcnRzLAogCS53cml0ZSAgICAgICAgICAgICA9IHNpZXJyYV93cml0ZSwKIAkud3JpdGVfcm9vbSAgICAgICAgPSBzaWVycmFfd3JpdGVfcm9vbSwKIAkuc2V0X3Rlcm1pb3MgICAgICAgPSBzaWVycmFfc2V0X3Rlcm1pb3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3NwY3A4eDUuYwppbmRleCA1ZTc1MjhjLi44ZjdlZDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvc3BjcDh4NS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9zcGNwOHg1LmMKQEAgLTQ0Niw2NiArNDQ2LDQ3IEBACiAJCQkiUlRTQ1RTIHVzYl9jb250cm9sX21zZyhlbmFibGUgZmxvd2N0cmwpID0gJWRcbiIsIHJldCk7CiB9CiAKLS8qIGNsb3NlIHRoZSBzZXJpYWwgcG9ydC4gV2Ugc2hvdWxkIHdhaXQgZm9yIGRhdGEgc2VuZGluZyB0byBkZXZpY2UgMXN0IGFuZAotICogdGhlbiBraWxsIGFsbCB1cmIuICovCi1zdGF0aWMgdm9pZCBzcGNwOHg1X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgc3BjcDh4NV9jYXJyaWVyX3JhaXNlZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBzcGNwOHg1X3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaWYgKHByaXYtPmxpbmVfc3RhdHVzICYgTVNSX1NUQVRVU19MSU5FX0RDRCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNwY3A4eDVfZHRyX3J0cyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgb24pCiB7CiAJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBjX2NmbGFnOwotCWludCBicHM7Ci0JbG9uZyB0aW1lb3V0OwotCXdhaXRfcXVldWVfdCB3YWl0OworCXU4IGNvbnRyb2w7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWlmIChvbikKKwkJcHJpdi0+bGluZV9jb250cm9sID0gTUNSX0NPTlRST0xfTElORV9EVFIKKwkJCQkJCXwgTUNSX0NPTlRST0xfTElORV9SVFM7CisJZWxzZQorCQlwcml2LT5saW5lX2NvbnRyb2wgJj0gfiAoTUNSX0NPTlRST0xfTElORV9EVFIKKwkJCQkJCXwgTUNSX0NPTlRST0xfTElORV9SVFMpOworCWNvbnRyb2wgPSBwcml2LT5saW5lX2NvbnRyb2w7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwY3A4eDVfc2V0X2N0cmxMaW5lKHBvcnQtPnNlcmlhbC0+ZGV2LCBjb250cm9sICwgcHJpdi0+dHlwZSk7Cit9CisKKy8qIGNsb3NlIHRoZSBzZXJpYWwgcG9ydC4gV2Ugc2hvdWxkIHdhaXQgZm9yIGRhdGEgc2VuZGluZyB0byBkZXZpY2UgMXN0IGFuZAorICogdGhlbiBraWxsIGFsbCB1cmIuICovCitzdGF0aWMgdm9pZCBzcGNwOHg1X2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNwY3A4eDVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXN1bHQ7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCi0JLyogd2FpdCBmb3IgZGF0YSB0byBkcmFpbiBmcm9tIHRoZSBidWZmZXIgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXRpbWVvdXQgPSBTUENQOHg1X0NMT1NJTkdfV0FJVDsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7Ci0JYWRkX3dhaXRfcXVldWUoJnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHJpbmdidWZfYXZhaWxfZGF0YShwcml2LT5idWYpID09IDAgfHwKLQkJICAgIHRpbWVvdXQgPT0gMCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCWJyZWFrOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCX0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZ0dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKLQogCS8qIGNsZWFyIG91dCBhbnkgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciAqLwogCWNsZWFyX3JpbmdidWYocHJpdi0+YnVmKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQkvKiB3YWl0IGZvciBjaGFyYWN0ZXJzIHRvIGRyYWluIGZyb20gdGhlIGRldmljZSAodGhpcyBpcyBsb25nIGVub3VnaAotCSAqIGZvciB0aGUgZW50aXJlIGFsbCBieXRlIHNwY3A4eDUgaGFyZHdhcmUgYnVmZmVyIHRvIGRyYWluIHdpdGggbm8KLQkgKiBmbG93IGNvbnRyb2wgZm9yIGRhdGEgcmF0ZXMgb2YgMTIwMCBicHMgb3IgbW9yZSwgZm9yIGxvd2VyIHJhdGVzIHdlCi0JICogc2hvdWxkIHJlYWxseSBrbm93IGhvdyBtdWNoIGRhdGEgaXMgaW4gdGhlIGJ1ZmZlciB0byBjb21wdXRlIGEgZGVsYXkKLQkgKiB0aGF0IGlzIG5vdCB1bm5lY2Vzc2FyaWx5IGxvbmcpICovCi0JYnBzID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKLQlpZiAoYnBzID4gMTIwMCkKLQkJdGltZW91dCA9IG1heCgoSFoqMjU2MCkgLyBicHMsIEhaLzEwKTsKLQllbHNlCi0JCXRpbWVvdXQgPSAyKkhaOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0Jc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKLQotCS8qIGNsZWFyIGNvbnRyb2wgbGluZXMgKi8KLQlpZiAodHR5KSB7Ci0JCWNfY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCWlmIChjX2NmbGFnICYgSFVQQ0wpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlwcml2LT5saW5lX2NvbnRyb2wgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQkJc3BjcDh4NV9zZXRfY3RybExpbmUocG9ydC0+c2VyaWFsLT5kZXYsIDAgLCBwcml2LT50eXBlKTsKLQkJfQotCX0KLQogCS8qIGtpbGwgdXJiICovCiAJaWYgKHBvcnQtPndyaXRlX3VyYiAhPSBOVUxMKSB7CiAJCXJlc3VsdCA9IHVzYl91bmxpbmtfdXJiKHBvcnQtPndyaXRlX3VyYik7CkBAIC02NjUsMTMgKzY0Niw2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaWYgKHR0eSAmJiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0JBVUQpKQotCQlwcml2LT5saW5lX2NvbnRyb2wgPSBNQ1JfRFRSIHwgTUNSX1JUUzsKLQllbHNlCi0JCXByaXYtPmxpbmVfY29udHJvbCA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCiAJc3BjcDh4NV9zZXRfY3RybExpbmUoc2VyaWFsLT5kZXYsIHByaXYtPmxpbmVfY29udHJvbCAsIHByaXYtPnR5cGUpOwogCiAJLyogU2V0dXAgdGVybWlvcyAqLwpAQCAtNjkxLDkgKzY2NSwxMCBAQAogCXBvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKIAlyZXQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJldCkgewotCQlzcGNwOHg1X2Nsb3NlKHR0eSwgcG9ydCwgTlVMTCk7CisJCXNwY3A4eDVfY2xvc2UocG9ydCk7CiAJCXJldHVybiAtRVBST1RPOwogCX0KKwlwb3J0LT5wb3J0LmRyYWluX2RlbGF5ID0gMjU2OwogCXJldHVybiAwOwogfQogCkBAIC0xMDMzLDYgKzEwMDgsOCBAQAogCS5udW1fcG9ydHMJCT0gMSwKIAkub3BlbiAJCQk9IHNwY3A4eDVfb3BlbiwKIAkuY2xvc2UgCQkJPSBzcGNwOHg1X2Nsb3NlLAorCS5kdHJfcnRzCQk9IHNwY3A4eDVfZHRyX3J0cywKKwkuY2Fycmllcl9yYWlzZWQJCT0gc3BjcDh4NV9jYXJyaWVyX3JhaXNlZCwKIAkud3JpdGUgCQkJPSBzcGNwOHg1X3dyaXRlLAogCS5zZXRfdGVybWlvcyAJCT0gc3BjcDh4NV9zZXRfdGVybWlvcywKIAkuaW9jdGwgCQkJPSBzcGNwOHg1X2lvY3RsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3N5bWJvbHNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3N5bWJvbHNlcmlhbC5jCmluZGV4IDY5ODc5ZTQuLjhiMDdlYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9zeW1ib2xzZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvc3ltYm9sc2VyaWFsLmMKQEAgLTE1Miw4ICsxNTIsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyB2b2lkIHN5bWJvbF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJICBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIHN5bWJvbF9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBzeW1ib2xfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX2RhdGEocG9ydC0+c2VyaWFsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC90aV91c2JfMzQxMF81MDUyLmMKaW5kZXggMGE2NGJhYy4uNDJjYjA0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3RpX3VzYl8zNDEwXzUwNTIuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdGlfdXNiXzM0MTBfNTA1Mi5jCkBAIC0xMDAsOCArMTAwLDcgQEAKIHN0YXRpYyB2b2lkIHRpX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwogc3RhdGljIGludCB0aV9vcGVuKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCXN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyB2b2lkIHRpX2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCi0JCXN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkIHRpX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpOwogc3RhdGljIGludCB0aV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY291bnQpOwogc3RhdGljIGludCB0aV93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtNjQ3LDggKzY0Niw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgdGlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSkKK3N0YXRpYyB2b2lkIHRpX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHRpX2RldmljZSAqdGRldjsKIAlzdHJ1Y3QgdGlfcG9ydCAqdHBvcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwppbmRleCBmMzMxZTJiLi4xOTY3YTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKQEAgLTIzOCw5ICsyMzgsMTEgQEAKIAkJCWdvdG8gYmFpbG91dF9pbnRlcmZhY2VfcHV0OwogCQltdXRleF91bmxvY2soJnNlcmlhbC0+ZGlzY19tdXRleCk7CiAJfQotCiAJbXV0ZXhfdW5sb2NrKCZwb3J0LT5tdXRleCk7Ci0JcmV0dXJuIDA7CisJLyogTm93IGRvIHRoZSBjb3JyZWN0IHR0eSBsYXllciBzZW1hbnRpY3MgKi8KKwlyZXR2YWwgPSB0dHlfcG9ydF9ibG9ja190aWxfcmVhZHkoJnBvcnQtPnBvcnQsIHR0eSwgZmlscCk7CisJaWYgKHJldHZhbCA9PSAwKQorCQlyZXR1cm4gMDsKIAogYmFpbG91dF9pbnRlcmZhY2VfcHV0OgogCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzZXJpYWwtPmludGVyZmFjZSk7CkBAIC0yNTksNjQgKzI2MSw4OSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHNlcmlhbF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKKy8qKgorICoJc2VyaWFsX2RvX2Rvd24JCS0Jc2h1dCBkb3duIGhhcmR3YXJlCisgKglAcG9ydDogcG9ydCB0byBzaHV0IGRvd24KKyAqCisgKglTaHV0IGRvd24gYSBVU0IgcG9ydCB1bmxlc3MgaXQgaXMgdGhlIGNvbnNvbGUuIFdlIG5ldmVyIHNodXQgZG93biB0aGUKKyAqCWNvbnNvbGUgaGFyZHdhcmUgYXMgaXQgd2lsbCBhbHdheXMgYmUgaW4gdXNlLgorICoKKyAqCURvbid0IGZyZWUgYW55IHJlc291cmNlcyBhdCB0aGlzIHBvaW50CisgKi8KK3N0YXRpYyB2b2lkIHNlcmlhbF9kb19kb3duKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7Ci0Jc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyICpkcnYgPSBwb3J0LT5zZXJpYWwtPnR5cGU7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKLQlpbnQgY291bnQ7CiAKLQlpZiAoIXBvcnQpCisJLyogVGhlIGNvbnNvbGUgaXMgbWFnaWNhbCwgZG8gbm90IGhhbmcgdXAgdGhlIGNvbnNvbGUgaGFyZHdhcmUKKwkgICBvciB0aGVyZSB3aWxsIGJlIHRlYXJzICovCisJaWYgKHBvcnQtPmNvbnNvbGUpCiAJCXJldHVybjsKIAotCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7Ci0KIAltdXRleF9sb2NrKCZwb3J0LT5tdXRleCk7CiAJc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCW93bmVyID0gc2VyaWFsLT50eXBlLT5kcml2ZXIub3duZXI7CiAKLQlpZiAocG9ydC0+cG9ydC5jb3VudCA9PSAwKSB7Ci0JCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOwotCQlyZXR1cm47Ci0JfQorCWlmIChkcnYtPmNsb3NlKQorCQlkcnYtPmNsb3NlKHBvcnQpOwogCi0JaWYgKHBvcnQtPnBvcnQuY291bnQgPT0gMSkKLQkJLyogb25seSBjYWxsIHRoZSBkZXZpY2Ugc3BlY2lmaWMgY2xvc2UgaWYgdGhpcwotCQkgKiBwb3J0IGlzIGJlaW5nIGNsb3NlZCBieSB0aGUgbGFzdCBvd25lci4gRW5zdXJlIHdlIGRvCi0JCSAqIHRoaXMgYmVmb3JlIHdlIGRyb3AgdGhlIHBvcnQgY291bnQuIFRoZSBjYWxsIGlzIHByb3RlY3RlZAotCQkgKiBieSB0aGUgcG9ydCBtdXRleAotCQkgKi8KLQkJc2VyaWFsLT50eXBlLT5jbG9zZSh0dHksIHBvcnQsIGZpbHApOwotCi0JaWYgKHBvcnQtPnBvcnQuY291bnQgPT0gKHBvcnQtPmNvbnNvbGUgPyAyIDogMSkpIHsKLQkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHR0eV9wb3J0X3R0eV9nZXQoJnBvcnQtPnBvcnQpOwotCQlpZiAodHR5KSB7Ci0JCQkvKiBXZSBtdXN0IGRvIHRoaXMgYmVmb3JlIHdlIGRyb3AgdGhlIHBvcnQgY291bnQgdG8KLQkJCSAgIHplcm8uICovCi0JCQlpZiAodHR5LT5kcml2ZXJfZGF0YSkKLQkJCQl0dHktPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJCXR0eV9wb3J0X3R0eV9zZXQoJnBvcnQtPnBvcnQsIE5VTEwpOwotCQkJdHR5X2tyZWZfcHV0KHR0eSk7Ci0JCX0KLQl9Ci0KLQktLXBvcnQtPnBvcnQuY291bnQ7Ci0JY291bnQgPSBwb3J0LT5wb3J0LmNvdW50OwogCW11dGV4X3VubG9jaygmcG9ydC0+bXV0ZXgpOworfQorCisvKioKKyAqCXNlcmlhbF9kb19mcmVlCQktCWZyZWUgcmVzb3VyY2VzIHBvc3QgY2xvc2UvaGFuZ3VwCisgKglAcG9ydDogcG9ydCB0byBmcmVlIHVwCisgKgorICoJRG8gdGhlIHJlc291cmNlIGZyZWVpbmcgYW5kIHJlZmNvdW50IGRyb3BwaW5nIGZvciB0aGUgcG9ydC4gV2UgbXVzdAorICoJYmUgY2FyZWZ1bCBhYm91dCBvcmRlcmluZyBhbmQgd2UgbXVzdCBhdm9pZCBmcmVlaW5nIHVwIHRoZSBjb25zb2xlLgorICovCisKK3N0YXRpYyB2b2lkIHNlcmlhbF9kb19mcmVlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKworCS8qIFRoZSBjb25zb2xlIGlzIG1hZ2ljYWwsIGRvIG5vdCBoYW5nIHVwIHRoZSBjb25zb2xlIGhhcmR3YXJlCisJICAgb3IgdGhlcmUgd2lsbCBiZSB0ZWFycyAqLworCWlmIChwb3J0LT5jb25zb2xlKQorCQlyZXR1cm47CisKKwlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJb3duZXIgPSBzZXJpYWwtPnR5cGUtPmRyaXZlci5vd25lcjsKIAlwdXRfZGV2aWNlKCZwb3J0LT5kZXYpOwotCiAJLyogTXVzdG4ndCBkZXJlZmVyZW5jZSBwb3J0IGFueSBtb3JlICovCi0JaWYgKGNvdW50ID09IDApIHsKLQkJbXV0ZXhfbG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKLQkJaWYgKCFzZXJpYWwtPmRpc2Nvbm5lY3RlZCkKLQkJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShzZXJpYWwtPmludGVyZmFjZSk7Ci0JCW11dGV4X3VubG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKLQl9CisJbXV0ZXhfbG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKKwlpZiAoIXNlcmlhbC0+ZGlzY29ubmVjdGVkKQorCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc2VyaWFsLT5pbnRlcmZhY2UpOworCW11dGV4X3VubG9jaygmc2VyaWFsLT5kaXNjX211dGV4KTsKIAl1c2Jfc2VyaWFsX3B1dChzZXJpYWwpOwotCiAJLyogTXVzdG4ndCBkZXJlZmVyZW5jZSBzZXJpYWwgYW55IG1vcmUgKi8KLQlpZiAoY291bnQgPT0gMCkKLQkJbW9kdWxlX3B1dChvd25lcik7CisJbW9kdWxlX3B1dChvd25lcik7Cit9CisKK3N0YXRpYyB2b2lkIHNlcmlhbF9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CisKKworCWlmICh0dHlfcG9ydF9jbG9zZV9zdGFydCgmcG9ydC0+cG9ydCwgdHR5LCBmaWxwKSA9PSAwKQorCQlyZXR1cm47CisKKwlzZXJpYWxfZG9fZG93bihwb3J0KTsJCQorCXR0eV9wb3J0X2Nsb3NlX2VuZCgmcG9ydC0+cG9ydCwgdHR5KTsKKwl0dHlfcG9ydF90dHlfc2V0KCZwb3J0LT5wb3J0LCBOVUxMKTsKKwlzZXJpYWxfZG9fZnJlZShwb3J0KTsKK30KKworc3RhdGljIHZvaWQgc2VyaWFsX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXNlcmlhbF9kb19kb3duKHBvcnQpOworCXR0eV9wb3J0X2hhbmd1cCgmcG9ydC0+cG9ydCk7CisJc2VyaWFsX2RvX2ZyZWUocG9ydCk7CiB9CiAKIHN0YXRpYyBpbnQgc2VyaWFsX3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKQEAgLTY0OCw2ICs2NzUsMjkgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCBzZXJpYWxfY2Fycmllcl9yYWlzZWQoc3RydWN0IHR0eV9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnAgPSBjb250YWluZXJfb2YocG9ydCwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCwgcG9ydCk7CisJc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyICpkcnYgPSBwLT5zZXJpYWwtPnR5cGU7CisJaWYgKGRydi0+Y2Fycmllcl9yYWlzZWQpCisJCXJldHVybiBkcnYtPmNhcnJpZXJfcmFpc2VkKHApOworCS8qIE5vIGNhcnJpZXIgY29udHJvbCAtIGRvbid0IGJsb2NrICovCisJcmV0dXJuIDE7CQorfQorCitzdGF0aWMgdm9pZCBzZXJpYWxfZHRyX3J0cyhzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIGludCBvbikKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQsIHBvcnQpOworCXN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciAqZHJ2ID0gcC0+c2VyaWFsLT50eXBlOworCWlmIChkcnYtPmR0cl9ydHMpCisJCWRydi0+ZHRyX3J0cyhwLCBvbik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyBzZXJpYWxfcG9ydF9vcHMgPSB7CisJLmNhcnJpZXJfcmFpc2VkID0gc2VyaWFsX2NhcnJpZXJfcmFpc2VkLAorCS5kdHJfcnRzID0gc2VyaWFsX2R0cl9ydHMsCit9OworCiBpbnQgdXNiX3NlcmlhbF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKQEAgLTg0MSw2ICs4OTEsNyBAQAogCQlpZiAoIXBvcnQpCiAJCQlnb3RvIHByb2JlX2Vycm9yOwogCQl0dHlfcG9ydF9pbml0KCZwb3J0LT5wb3J0KTsKKwkJcG9ydC0+cG9ydC5vcHMgPSAmc2VyaWFsX3BvcnRfb3BzOwogCQlwb3J0LT5zZXJpYWwgPSBzZXJpYWw7CiAJCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKIAkJbXV0ZXhfaW5pdCgmcG9ydC0+bXV0ZXgpOwpAQCAtMTA3MSw2ICsxMTIyLDkgQEAKIAkJaWYgKHBvcnQpIHsKIAkJCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKIAkJCWlmICh0dHkpIHsKKwkJCQkvKiBUaGUgaGFuZ3VwIHdpbGwgb2NjdXIgYXN5bmNocm9ub3VzbHkgYnV0CisJCQkJICAgdGhlIG9iamVjdCByZWZjb3VudHMgd2lsbCBzb3J0IG91dCBhbGwgdGhlCisJCQkJICAgY2xlYW51cCAqLwogCQkJCXR0eV9oYW5ndXAodHR5KTsKIAkJCQl0dHlfa3JlZl9wdXQodHR5KTsKIAkJCX0KQEAgLTExMzUsNiArMTE4OSw3IEBACiAJLm9wZW4gPQkJCXNlcmlhbF9vcGVuLAogCS5jbG9zZSA9CQlzZXJpYWxfY2xvc2UsCiAJLndyaXRlID0JCXNlcmlhbF93cml0ZSwKKwkuaGFuZ3VwID0gCQlzZXJpYWxfaGFuZ3VwLAogCS53cml0ZV9yb29tID0JCXNlcmlhbF93cml0ZV9yb29tLAogCS5pb2N0bCA9CQlzZXJpYWxfaW9jdGwsCiAJLnNldF90ZXJtaW9zID0JCXNlcmlhbF9zZXRfdGVybWlvcywKQEAgLTExNDcsNiArMTIwMiw3IEBACiAJLnByb2NfZm9wcyA9CQkmc2VyaWFsX3Byb2NfZm9wcywKIH07CiAKKwogc3RydWN0IHR0eV9kcml2ZXIgKnVzYl9zZXJpYWxfdHR5X2RyaXZlcjsKIAogc3RhdGljIGludCBfX2luaXQgdXNiX3NlcmlhbF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvdmlzb3IuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCmluZGV4IDVhYzQxNGIuLmIxNWYxYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC92aXNvci5jCkBAIC0zOCw4ICszOCw3IEBACiAvKiBmdW5jdGlvbiBwcm90b3R5cGVzIGZvciBhIGhhbmRzcHJpbmcgdmlzb3IgKi8KIHN0YXRpYyBpbnQgIHZpc29yX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKIAkJCQkJc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgdmlzb3JfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLQkJCQkJc3RydWN0IGZpbGUgKmZpbHApOworc3RhdGljIHZvaWQgdmlzb3JfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiBzdGF0aWMgaW50ICB2aXNvcl93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAogCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiBzdGF0aWMgaW50ICB2aXNvcl93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtMzI0LDggKzMyMyw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgdmlzb3JfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgdmlzb3JfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlzdHJ1Y3Qgdmlzb3JfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAl1bnNpZ25lZCBjaGFyICp0cmFuc2Zlcl9idWZmZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvd2hpdGVoZWF0LmMKaW5kZXggNTMzNWQzMi4uN2M3Mjk1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL3doaXRlaGVhdC5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC93aGl0ZWhlYXQuYwpAQCAtMTQ3LDggKzE0Nyw3IEBACiBzdGF0aWMgdm9pZCB3aGl0ZWhlYXRfc2h1dGRvd24oc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCk7CiBzdGF0aWMgaW50ICB3aGl0ZWhlYXRfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgd2hpdGVoZWF0X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgdm9pZCB3aGl0ZWhlYXRfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiBzdGF0aWMgaW50ICB3aGl0ZWhlYXRfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CkBAIC03MTIsOCArNzExLDcgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCB3aGl0ZWhlYXRfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQorc3RhdGljIHZvaWQgd2hpdGVoZWF0X2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHdoaXRlaGVhdF9wcml2YXRlICppbmZvID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCXN0cnVjdCB3aGl0ZWhlYXRfdXJiX3dyYXAgKndyYXA7CkBAIC03MjMsMzEgKzcyMSw3IEBACiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwogCi0JbXV0ZXhfbG9jaygmcG9ydC0+c2VyaWFsLT5kaXNjX211dGV4KTsKLQkvKiBmaWxwIGlzIE5VTEwgd2hlbiBjYWxsZWQgZnJvbSB1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QgKi8KLQlpZiAoKGZpbHAgJiYgKHR0eV9odW5nX3VwX3AoZmlscCkpKSB8fCBwb3J0LT5zZXJpYWwtPmRpc2Nvbm5lY3RlZCkgewotCQltdXRleF91bmxvY2soJnBvcnQtPnNlcmlhbC0+ZGlzY19tdXRleCk7Ci0JCXJldHVybjsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwb3J0LT5zZXJpYWwtPmRpc2NfbXV0ZXgpOwotCi0JdHR5LT5jbG9zaW5nID0gMTsKLQotLyoKLSAqIE5vdCBjdXJyZW50bHkgaW4gdXNlOyB0dHlfd2FpdF91bnRpbF9zZW50KCkgY2FsbHMKLSAqIHNlcmlhbF9jaGFyc19pbl9idWZmZXIoKSB3aGljaCBkZWFkbG9ja3Mgb24gdGhlIHNlY29uZCBzZW1hcGhvcmUKLSAqIGFjcXVpc2l0aW9uLiBUaGlzIHNob3VsZCBiZSBmaXhlZCBhdCBzb21lIHBvaW50LiBHcmVnJ3MgYmVlbgotICogbm90aWZpZWQuCi0JaWYgKChmaWxwLT5mX2ZsYWdzICYgKE9fTkRFTEFZIHwgT19OT05CTE9DSykpID09IDApIHsKLQkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIENMT1NJTkdfREVMQVkpOwotCX0KLSovCi0KLQl0dHlfZHJpdmVyX2ZsdXNoX2J1ZmZlcih0dHkpOwotCXR0eV9sZGlzY19mbHVzaCh0dHkpOwotCiAJZmlybV9yZXBvcnRfdHhfZG9uZShwb3J0KTsKLQogCWZpcm1fY2xvc2UocG9ydCk7CiAKIAkvKiBzaHV0ZG93biBvdXIgYnVsayByZWFkcyBhbmQgd3JpdGVzICovCkBAIC03NzUsMTAgKzc0OSw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycSgmaW5mby0+bG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZpbmZvLT5kZWF0aHdhcnJhbnQpOwotCiAJc3RvcF9jb21tYW5kX3BvcnQocG9ydC0+c2VyaWFsKTsKLQotCXR0eS0+Y2xvc2luZyA9IDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCmluZGV4IDRjYTNiNTguLmNmYTI2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKQEAgLTEzMiw3ICsxMzIsNyBAQAogCiAJCWlmICh1cy0+ZmZsYWdzICYgVVNfRkxfTUFYX1NFQ1RPUlNfTUlOKQogCQkJbWF4X3NlY3RvcnMgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gOTsKLQkJaWYgKHNkZXYtPnJlcXVlc3RfcXVldWUtPm1heF9zZWN0b3JzID4gbWF4X3NlY3RvcnMpCisJCWlmIChxdWV1ZV9tYXhfc2VjdG9ycyhzZGV2LT5yZXF1ZXN0X3F1ZXVlKSA+IG1heF9zZWN0b3JzKQogCQkJYmxrX3F1ZXVlX21heF9zZWN0b3JzKHNkZXYtPnJlcXVlc3RfcXVldWUsCiAJCQkJCSAgICAgIG1heF9zZWN0b3JzKTsKIAl9IGVsc2UgaWYgKHNkZXYtPnR5cGUgPT0gVFlQRV9UQVBFKSB7CkBAIC00ODMsNyArNDgzLDcgQEAKIHsKIAlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYgPSB0b19zY3NpX2RldmljZShkZXYpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHNkZXYtPnJlcXVlc3RfcXVldWUtPm1heF9zZWN0b3JzKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgcXVldWVfbWF4X3NlY3RvcnMoc2Rldi0+cmVxdWVzdF9xdWV1ZSkpOwogfQogCiAvKiBJbnB1dCByb3V0aW5lIGZvciB0aGUgc3lzZnMgbWF4X3NlY3RvcnMgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCmluZGV4IDM4ZTg2YjguLjU5ZDdkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYworKysgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKQEAgLTE4MCw3ICsxODAsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0sKLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogLyogc29mdHdhcmUgc2Nyb2xsYmFjayAqLwogc3RhdGljIHZvaWQgKnZnYWNvbl9zY3JvbGxiYWNrOwogc3RhdGljIGludCB2Z2Fjb25fc2Nyb2xsYmFja190YWlsOwpAQCAtMjEwLDggKzIxMCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdF9yZWZvayB2Z2Fjb25fc2Nyb2xsYmFja19zdGFydHVwKHZvaWQpCiB7Ci0JdmdhY29uX3Njcm9sbGJhY2sgPSBhbGxvY19ib290bWVtKENPTkZJR19WR0FDT05fU09GVF9TQ1JPTExCQUNLX1NJWkUKLQkJCQkJICAqIDEwMjQpOworCXZnYWNvbl9zY3JvbGxiYWNrID0ga2NhbGxvYyhDT05GSUdfVkdBQ09OX1NPRlRfU0NST0xMQkFDS19TSVpFLCAxMDI0LCBHRlBfTk9XQUlUKTsKIAl2Z2Fjb25fc2Nyb2xsYmFja19pbml0KHZnYV92aWRlb19udW1fY29sdW1ucyAqIDIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2hpdGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2hpdGZiLmMKaW5kZXggZTY0NjdjZi4uMDIwZGI3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9oaXRmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vaGl0ZmIuYwpAQCAtMzM1LDkgKzMzNSw5IEBACiAJaWYgKGZiX2dldF9vcHRpb25zKCJoaXRmYiIsIE5VTEwpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWhpdGZiX2ZpeC5tbWlvX3N0YXJ0ID0gQ09ORklHX0hENjQ0NjFfSU9CQVNFKzB4MTAwMDsKKwloaXRmYl9maXgubW1pb19zdGFydCA9IEhENjQ0NjFfSU9fT0ZGU0VUKDB4MTAwMCk7CiAJaGl0ZmJfZml4Lm1taW9fbGVuID0gMHgxMDAwOwotCWhpdGZiX2ZpeC5zbWVtX3N0YXJ0ID0gQ09ORklHX0hENjQ0NjFfSU9CQVNFICsgMHgwMjAwMDAwMDsKKwloaXRmYl9maXguc21lbV9zdGFydCA9IEhENjQ0NjFfSU9fT0ZGU0VUKDB4MDIwMDAwMDApOwogCWhpdGZiX2ZpeC5zbWVtX2xlbiA9IDUxMiAqIDEwMjQ7CiAKIAlsY2RjbG9yID0gZmJfcmVhZHcoSEQ2NDQ2MV9MQ0RDTE9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL0tjb25maWcgYi9kcml2ZXJzL3hlbi9LY29uZmlnCmluZGV4IDhhYzljZGQuLmNhYjEwMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL0tjb25maWcKKysrIGIvZHJpdmVycy94ZW4vS2NvbmZpZwpAQCAtMTgsNiArMTgsMTYgQEAKIAkgIHNlY3VyZSwgYnV0IHNsaWdodGx5IGxlc3MgZWZmaWNpZW50LgogCSAgSWYgaW4gZG91YnQsIHNheSB5ZXMuCiAKK2NvbmZpZyBYRU5fREVWX0VWVENITgorCXRyaXN0YXRlICJYZW4gL2Rldi94ZW4vZXZ0Y2huIGRldmljZSIKKwlkZXBlbmRzIG9uIFhFTgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBldnRjaG4gZHJpdmVyIGFsbG93cyBhIHVzZXJzcGFjZSBwcm9jZXNzIHRvIHRyaWdlciBldmVudAorCSAgY2hhbm5lbHMgYW5kIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGFuIGV2ZW50IGNoYW5uZWwKKwkgIGZpcmluZy4KKwkgIElmIGluIGRvdWJ0LCBzYXkgeWVzLgorCiBjb25maWcgWEVORlMKIAl0cmlzdGF0ZSAiWGVuIGZpbGVzeXN0ZW0iCiAJZGVwZW5kcyBvbiBYRU4KQEAgLTQxLDMgKzUxLDEzIEBACiAgICAgICAgICBhIHhlbiBwbGF0Zm9ybS4KICAgICAgICAgIElmIGluIGRvdWJ0LCBzYXkgeWVzLgogCitjb25maWcgWEVOX1NZU19IWVBFUlZJU09SCisgICAgICAgYm9vbCAiQ3JlYXRlIHhlbiBlbnRyaWVzIHVuZGVyIC9zeXMvaHlwZXJ2aXNvciIKKyAgICAgICBkZXBlbmRzIG9uIFhFTiAmJiBTWVNGUworICAgICAgIHNlbGVjdCBTWVNfSFlQRVJWSVNPUgorICAgICAgIGRlZmF1bHQgeQorICAgICAgIGhlbHAKKyAgICAgICAgIENyZWF0ZSBlbnRyaWVzIHVuZGVyIC9zeXMvaHlwZXJ2aXNvciBkZXNjcmliaW5nIHRoZSBYZW4KKwkgaHlwZXJ2aXNvciBlbnZpcm9ubWVudC4gIFdoZW4gcnVubmluZyBuYXRpdmUgb3IgaW4gYW5vdGhlcgorCSB2aXJ0dWFsIGVudmlyb25tZW50LCAvc3lzL2h5cGVydmlzb3Igd2lsbCBzdGlsbCBiZSBwcmVzZW50LAorCSBidXQgd2lsbCBoYXZlIG5vIHhlbiBjb250ZW50cy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9NYWtlZmlsZSBiL2RyaXZlcnMveGVuL01ha2VmaWxlCmluZGV4IGZmOGFjY2MuLmVjMmEzOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMveGVuL01ha2VmaWxlCkBAIC00LDQgKzQsNiBAQAogb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBjcHVfaG90cGx1Zy5vCiBvYmotJChDT05GSUdfWEVOX1hFTkNPTU0pCSs9IHhlbmNvbW0ubwogb2JqLSQoQ09ORklHX1hFTl9CQUxMT09OKQkrPSBiYWxsb29uLm8KLW9iai0kKENPTkZJR19YRU5GUykJCSs9IHhlbmZzLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK29iai0kKENPTkZJR19YRU5fREVWX0VWVENITikJKz0gZXZ0Y2huLm8KK29iai0kKENPTkZJR19YRU5GUykJCSs9IHhlbmZzLworb2JqLSQoQ09ORklHX1hFTl9TWVNfSFlQRVJWSVNPUikJKz0gc3lzLWh5cGVydmlzb3IubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2V2ZW50cy5jIGIvZHJpdmVycy94ZW4vZXZlbnRzLmMKaW5kZXggMzA5NjNhZi4uODkxZDJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZXZlbnRzLmMKKysrIGIvZHJpdmVycy94ZW4vZXZlbnRzLmMKQEAgLTE1MSw2ICsxNTEsMTIgQEAKIAlyZXR1cm4gaW5mb19mb3JfaXJxKGlycSktPmV2dGNobjsKIH0KIAordW5zaWduZWQgaXJxX2Zyb21fZXZ0Y2huKHVuc2lnbmVkIGludCBldnRjaG4pCit7CisJcmV0dXJuIGV2dGNobl90b19pcnFbZXZ0Y2huXTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9mcm9tX2V2dGNobik7CisKIHN0YXRpYyBlbnVtIGlwaV92ZWN0b3IgaXBpX2Zyb21faXJxKHVuc2lnbmVkIGlycSkKIHsKIAlzdHJ1Y3QgaXJxX2luZm8gKmluZm8gPSBpbmZvX2Zvcl9pcnEoaXJxKTsKQEAgLTMzNSw3ICszNDEsNyBAQAogCWlmIChpcnEgPT0gbnJfaXJxcykKIAkJcGFuaWMoIk5vIGF2YWlsYWJsZSBJUlEgdG8gYmluZCB0bzogaW5jcmVhc2UgbnJfaXJxcyFcbiIpOwogCi0JZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX2NwdShpcnEsIDApOworCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKGlycSwgMCk7CiAJaWYgKFdBUk5fT04oZGVzYyA9PSBOVUxMKSkKIAkJcmV0dXJuIC0xOwogCkBAIC02ODgsMTMgKzY5NCwxMyBAQAogfQogCiAvKiBSZWJpbmQgYW4gZXZ0Y2huIHNvIHRoYXQgaXQgZ2V0cyBkZWxpdmVyZWQgdG8gYSBzcGVjaWZpYyBjcHUgKi8KLXN0YXRpYyB2b2lkIHJlYmluZF9pcnFfdG9fY3B1KHVuc2lnbmVkIGlycSwgdW5zaWduZWQgdGNwdSkKK3N0YXRpYyBpbnQgcmViaW5kX2lycV90b19jcHUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0Y3B1KQogewogCXN0cnVjdCBldnRjaG5fYmluZF92Y3B1IGJpbmRfdmNwdTsKIAlpbnQgZXZ0Y2huID0gZXZ0Y2huX2Zyb21faXJxKGlycSk7CiAKIAlpZiAoIVZBTElEX0VWVENITihldnRjaG4pKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCS8qIFNlbmQgZnV0dXJlIGluc3RhbmNlcyBvZiB0aGlzIGludGVycnVwdCB0byBvdGhlciB2Y3B1LiAqLwogCWJpbmRfdmNwdS5wb3J0ID0gZXZ0Y2huOwpAQCAtNzA3LDEzICs3MTMsMTUgQEAKIAkgKi8KIAlpZiAoSFlQRVJWSVNPUl9ldmVudF9jaGFubmVsX29wKEVWVENITk9QX2JpbmRfdmNwdSwgJmJpbmRfdmNwdSkgPj0gMCkKIAkJYmluZF9ldnRjaG5fdG9fY3B1KGV2dGNobiwgdGNwdSk7CisKKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBzZXRfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCitzdGF0aWMgaW50IHNldF9hZmZpbml0eV9pcnEodW5zaWduZWQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCkKIHsKIAl1bnNpZ25lZCB0Y3B1ID0gY3B1bWFza19maXJzdChkZXN0KTsKLQlyZWJpbmRfaXJxX3RvX2NwdShpcnEsIHRjcHUpOworCisJcmV0dXJuIHJlYmluZF9pcnFfdG9fY3B1KGlycSwgdGNwdSk7CiB9CiAKIGludCByZXNlbmRfaXJxX29uX2V2dGNobih1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZ0Y2huLmMgYi9kcml2ZXJzL3hlbi9ldnRjaG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjAzMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4vZXZ0Y2huLmMKQEAgLTAsMCArMSw1MDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV2dGNobi5jCisgKgorICogRHJpdmVyIGZvciByZWNlaXZpbmcgYW5kIGRlbXV4aW5nIGV2ZW50LWNoYW5uZWwgc2lnbmFscy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgSyBBIEZyYXNlcgorICogTXVsdGktcHJvY2VzcyBleHRlbnNpb25zIENvcHlyaWdodCAoYykgMjAwNCwgU3RldmVuIFNtaXRoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgorI2luY2x1ZGUgPHhlbi9ldnRjaG4uaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworc3RydWN0IHBlcl91c2VyX2RhdGEgeworCXN0cnVjdCBtdXRleCBiaW5kX211dGV4OyAvKiBzZXJpYWxpemUgYmluZC91bmJpbmQgb3BlcmF0aW9ucyAqLworCisJLyogTm90aWZpY2F0aW9uIHJpbmcsIGFjY2Vzc2VkIHZpYSAvZGV2L3hlbi9ldnRjaG4uICovCisjZGVmaW5lIEVWVENITl9SSU5HX1NJWkUgICAgIChQQUdFX1NJWkUgLyBzaXplb2YoZXZ0Y2huX3BvcnRfdCkpCisjZGVmaW5lIEVWVENITl9SSU5HX01BU0soX2kpICgoX2kpJihFVlRDSE5fUklOR19TSVpFLTEpKQorCWV2dGNobl9wb3J0X3QgKnJpbmc7CisJdW5zaWduZWQgaW50IHJpbmdfY29ucywgcmluZ19wcm9kLCByaW5nX292ZXJmbG93OworCXN0cnVjdCBtdXRleCByaW5nX2NvbnNfbXV0ZXg7IC8qIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHJlYWRlcnMgKi8KKworCS8qIFByb2Nlc3NlcyB3YWl0IG9uIHRoaXMgcXVldWUgd2hlbiByaW5nIGlzIGVtcHR5LiAqLworCXdhaXRfcXVldWVfaGVhZF90IGV2dGNobl93YWl0OworCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpldnRjaG5fYXN5bmNfcXVldWU7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKKy8qIFdobydzIGJvdW5kIHRvIGVhY2ggcG9ydD8gKi8KK3N0YXRpYyBzdHJ1Y3QgcGVyX3VzZXJfZGF0YSAqcG9ydF91c2VyW05SX0VWRU5UX0NIQU5ORUxTXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socG9ydF91c2VyX2xvY2spOyAvKiBwcm90ZWN0cyBwb3J0X3VzZXJbXSBhbmQgcmluZ19wcm9kICovCisKK2lycXJldHVybl90IGV2dGNobl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJc3RydWN0IHBlcl91c2VyX2RhdGEgKnU7CisKKwlzcGluX2xvY2soJnBvcnRfdXNlcl9sb2NrKTsKKworCXUgPSBwb3J0X3VzZXJbcG9ydF07CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKworCWlmICgodS0+cmluZ19wcm9kIC0gdS0+cmluZ19jb25zKSA8IEVWVENITl9SSU5HX1NJWkUpIHsKKwkJdS0+cmluZ1tFVlRDSE5fUklOR19NQVNLKHUtPnJpbmdfcHJvZCldID0gcG9ydDsKKwkJd21iKCk7IC8qIEVuc3VyZSByaW5nIGNvbnRlbnRzIHZpc2libGUgKi8KKwkJaWYgKHUtPnJpbmdfY29ucyA9PSB1LT5yaW5nX3Byb2QrKykgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1LT5ldnRjaG5fd2FpdCk7CisJCQlraWxsX2Zhc3luYygmdS0+ZXZ0Y2huX2FzeW5jX3F1ZXVlLAorCQkJCSAgICBTSUdJTywgUE9MTF9JTik7CisJCX0KKwl9IGVsc2UgeworCQl1LT5yaW5nX292ZXJmbG93ID0gMTsKKwl9CisKKwlzcGluX3VubG9jaygmcG9ydF91c2VyX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3NpemVfdCBldnRjaG5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgYywgcCwgYnl0ZXMxID0gMCwgYnl0ZXMyID0gMDsKKwlzdHJ1Y3QgcGVyX3VzZXJfZGF0YSAqdSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIFdob2xlIG51bWJlciBvZiBwb3J0cy4gKi8KKwljb3VudCAmPSB+KHNpemVvZihldnRjaG5fcG9ydF90KS0xKTsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChjb3VudCA+IFBBR0VfU0laRSkKKwkJY291bnQgPSBQQUdFX1NJWkU7CisKKwlmb3IgKDs7KSB7CisJCW11dGV4X2xvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisKKwkJcmMgPSAtRUZCSUc7CisJCWlmICh1LT5yaW5nX292ZXJmbG93KQorCQkJZ290byB1bmxvY2tfb3V0OworCisJCWMgPSB1LT5yaW5nX2NvbnM7CisJCXAgPSB1LT5yaW5nX3Byb2Q7CisJCWlmIChjICE9IHApCisJCQlicmVhazsKKworCQltdXRleF91bmxvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodS0+ZXZ0Y2huX3dhaXQsCisJCQkJCSAgICAgIHUtPnJpbmdfY29ucyAhPSB1LT5yaW5nX3Byb2QpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogQnl0ZSBsZW5ndGhzIG9mIHR3byBjaHVua3MuIENodW5rIHNwbGl0IChpZiBhbnkpIGlzIGF0IHJpbmcgd3JhcC4gKi8KKwlpZiAoKChjIF4gcCkgJiBFVlRDSE5fUklOR19TSVpFKSAhPSAwKSB7CisJCWJ5dGVzMSA9IChFVlRDSE5fUklOR19TSVpFIC0gRVZUQ0hOX1JJTkdfTUFTSyhjKSkgKgorCQkJc2l6ZW9mKGV2dGNobl9wb3J0X3QpOworCQlieXRlczIgPSBFVlRDSE5fUklOR19NQVNLKHApICogc2l6ZW9mKGV2dGNobl9wb3J0X3QpOworCX0gZWxzZSB7CisJCWJ5dGVzMSA9IChwIC0gYykgKiBzaXplb2YoZXZ0Y2huX3BvcnRfdCk7CisJCWJ5dGVzMiA9IDA7CisJfQorCisJLyogVHJ1bmNhdGUgY2h1bmtzIGFjY29yZGluZyB0byBjYWxsZXIncyBtYXhpbXVtIGJ5dGUgY291bnQuICovCisJaWYgKGJ5dGVzMSA+IGNvdW50KSB7CisJCWJ5dGVzMSA9IGNvdW50OworCQlieXRlczIgPSAwOworCX0gZWxzZSBpZiAoKGJ5dGVzMSArIGJ5dGVzMikgPiBjb3VudCkgeworCQlieXRlczIgPSBjb3VudCAtIGJ5dGVzMTsKKwl9CisKKwlyYyA9IC1FRkFVTFQ7CisJcm1iKCk7IC8qIEVuc3VyZSB0aGF0IHdlIHNlZSB0aGUgcG9ydCBiZWZvcmUgd2UgY29weSBpdC4gKi8KKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJnUtPnJpbmdbRVZUQ0hOX1JJTkdfTUFTSyhjKV0sIGJ5dGVzMSkgfHwKKwkgICAgKChieXRlczIgIT0gMCkgJiYKKwkgICAgIGNvcHlfdG9fdXNlcigmYnVmW2J5dGVzMV0sICZ1LT5yaW5nWzBdLCBieXRlczIpKSkKKwkJZ290byB1bmxvY2tfb3V0OworCisJdS0+cmluZ19jb25zICs9IChieXRlczEgKyBieXRlczIpIC8gc2l6ZW9mKGV2dGNobl9wb3J0X3QpOworCXJjID0gYnl0ZXMxICsgYnl0ZXMyOworCisgdW5sb2NrX291dDoKKwltdXRleF91bmxvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdCBldnRjaG5fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJjLCBpOworCWV2dGNobl9wb3J0X3QgKmtidWYgPSAoZXZ0Y2huX3BvcnRfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgcGVyX3VzZXJfZGF0YSAqdSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChrYnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogV2hvbGUgbnVtYmVyIG9mIHBvcnRzLiAqLworCWNvdW50ICY9IH4oc2l6ZW9mKGV2dGNobl9wb3J0X3QpLTEpOworCisJcmMgPSAwOworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChjb3VudCA+IFBBR0VfU0laRSkKKwkJY291bnQgPSBQQUdFX1NJWkU7CisKKwlyYyA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZiwgY291bnQpICE9IDApCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCAoY291bnQvc2l6ZW9mKGV2dGNobl9wb3J0X3QpKTsgaSsrKQorCQlpZiAoKGtidWZbaV0gPCBOUl9FVkVOVF9DSEFOTkVMUykgJiYgKHBvcnRfdXNlcltrYnVmW2ldXSA9PSB1KSkKKwkJCWVuYWJsZV9pcnEoaXJxX2Zyb21fZXZ0Y2huKGtidWZbaV0pKTsKKwlzcGluX3VubG9ja19pcnEoJnBvcnRfdXNlcl9sb2NrKTsKKworCXJjID0gY291bnQ7CisKKyBvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWtidWYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBldnRjaG5fYmluZF90b191c2VyKHN0cnVjdCBwZXJfdXNlcl9kYXRhICp1LCBpbnQgcG9ydCkKK3sKKwlpbnQgcmMgPSAwOworCisJLyoKKwkgKiBQb3J0cyBhcmUgbmV2ZXIgcmV1c2VkLCBzbyBldmVyeSBjYWxsZXIgc2hvdWxkIHBhc3MgaW4gYQorCSAqIHVuaXF1ZSBwb3J0LgorCSAqCisJICogKExvY2tpbmcgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGhhdmVuJ3QgcmVnaXN0ZXJlZCB0aGUKKwkgKiBpbnRlcnJ1cHQgaGFuZGxlciB5ZXQsIGFuZCBvdXIgY2FsbGVyIGhhcyBhbHJlYWR5CisJICogc2VyaWFsaXplZCBiaW5kIG9wZXJhdGlvbnMuKQorCSAqLworCUJVR19PTihwb3J0X3VzZXJbcG9ydF0gIT0gTlVMTCk7CisJcG9ydF91c2VyW3BvcnRdID0gdTsKKworCXJjID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihwb3J0LCBldnRjaG5faW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCQkJCSAgICAgICB1LT5uYW1lLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBvcnQpOworCWlmIChyYyA+PSAwKQorCQlyYyA9IDA7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGV2dGNobl91bmJpbmRfZnJvbV91c2VyKHN0cnVjdCBwZXJfdXNlcl9kYXRhICp1LCBpbnQgcG9ydCkKK3sKKwlpbnQgaXJxID0gaXJxX2Zyb21fZXZ0Y2huKHBvcnQpOworCisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihpcnEsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcG9ydCk7CisKKwkvKiBtYWtlIHN1cmUgd2UgdW5iaW5kIHRoZSBpcnEgaGFuZGxlciBiZWZvcmUgY2xlYXJpbmcgdGhlIHBvcnQgKi8KKwliYXJyaWVyKCk7CisKKwlwb3J0X3VzZXJbcG9ydF0gPSBOVUxMOworfQorCitzdGF0aWMgbG9uZyBldnRjaG5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJjOworCXN0cnVjdCBwZXJfdXNlcl9kYXRhICp1ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKKworCS8qIFByZXZlbnQgYmluZCBmcm9tIHJhY2luZyB3aXRoIHVuYmluZCAqLworCW11dGV4X2xvY2soJnUtPmJpbmRfbXV0ZXgpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElPQ1RMX0VWVENITl9CSU5EX1ZJUlE6IHsKKwkJc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX3ZpcnEgYmluZDsKKwkJc3RydWN0IGV2dGNobl9iaW5kX3ZpcnEgYmluZF92aXJxOworCisJCXJjID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZiaW5kLCB1YXJnLCBzaXplb2YoYmluZCkpKQorCQkJYnJlYWs7CisKKwkJYmluZF92aXJxLnZpcnEgPSBiaW5kLnZpcnE7CisJCWJpbmRfdmlycS52Y3B1ID0gMDsKKwkJcmMgPSBIWVBFUlZJU09SX2V2ZW50X2NoYW5uZWxfb3AoRVZUQ0hOT1BfYmluZF92aXJxLAorCQkJCQkJICZiaW5kX3ZpcnEpOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOworCisJCXJjID0gZXZ0Y2huX2JpbmRfdG9fdXNlcih1LCBiaW5kX3ZpcnEucG9ydCk7CisJCWlmIChyYyA9PSAwKQorCQkJcmMgPSBiaW5kX3ZpcnEucG9ydDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJT0NUTF9FVlRDSE5fQklORF9JTlRFUkRPTUFJTjogeworCQlzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfaW50ZXJkb21haW4gYmluZDsKKwkJc3RydWN0IGV2dGNobl9iaW5kX2ludGVyZG9tYWluIGJpbmRfaW50ZXJkb21haW47CisKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJpbmQsIHVhcmcsIHNpemVvZihiaW5kKSkpCisJCQlicmVhazsKKworCQliaW5kX2ludGVyZG9tYWluLnJlbW90ZV9kb20gID0gYmluZC5yZW1vdGVfZG9tYWluOworCQliaW5kX2ludGVyZG9tYWluLnJlbW90ZV9wb3J0ID0gYmluZC5yZW1vdGVfcG9ydDsKKwkJcmMgPSBIWVBFUlZJU09SX2V2ZW50X2NoYW5uZWxfb3AoRVZUQ0hOT1BfYmluZF9pbnRlcmRvbWFpbiwKKwkJCQkJCSAmYmluZF9pbnRlcmRvbWFpbik7CisJCWlmIChyYyAhPSAwKQorCQkJYnJlYWs7CisKKwkJcmMgPSBldnRjaG5fYmluZF90b191c2VyKHUsIGJpbmRfaW50ZXJkb21haW4ubG9jYWxfcG9ydCk7CisJCWlmIChyYyA9PSAwKQorCQkJcmMgPSBiaW5kX2ludGVyZG9tYWluLmxvY2FsX3BvcnQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgSU9DVExfRVZUQ0hOX0JJTkRfVU5CT1VORF9QT1JUOiB7CisJCXN0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF91bmJvdW5kX3BvcnQgYmluZDsKKwkJc3RydWN0IGV2dGNobl9hbGxvY191bmJvdW5kIGFsbG9jX3VuYm91bmQ7CisKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJpbmQsIHVhcmcsIHNpemVvZihiaW5kKSkpCisJCQlicmVhazsKKworCQlhbGxvY191bmJvdW5kLmRvbSAgICAgICAgPSBET01JRF9TRUxGOworCQlhbGxvY191bmJvdW5kLnJlbW90ZV9kb20gPSBiaW5kLnJlbW90ZV9kb21haW47CisJCXJjID0gSFlQRVJWSVNPUl9ldmVudF9jaGFubmVsX29wKEVWVENITk9QX2FsbG9jX3VuYm91bmQsCisJCQkJCQkgJmFsbG9jX3VuYm91bmQpOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOworCisJCXJjID0gZXZ0Y2huX2JpbmRfdG9fdXNlcih1LCBhbGxvY191bmJvdW5kLnBvcnQpOworCQlpZiAocmMgPT0gMCkKKwkJCXJjID0gYWxsb2NfdW5ib3VuZC5wb3J0OworCQlicmVhazsKKwl9CisKKwljYXNlIElPQ1RMX0VWVENITl9VTkJJTkQ6IHsKKwkJc3RydWN0IGlvY3RsX2V2dGNobl91bmJpbmQgdW5iaW5kOworCisJCXJjID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1bmJpbmQsIHVhcmcsIHNpemVvZih1bmJpbmQpKSkKKwkJCWJyZWFrOworCisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKHVuYmluZC5wb3J0ID49IE5SX0VWRU5UX0NIQU5ORUxTKQorCQkJYnJlYWs7CisKKwkJc3Bpbl9sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCisJCXJjID0gLUVOT1RDT05OOworCQlpZiAocG9ydF91c2VyW3VuYmluZC5wb3J0XSAhPSB1KSB7CisJCQlzcGluX3VubG9ja19pcnEoJnBvcnRfdXNlcl9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXZ0Y2huX3VuYmluZF9mcm9tX3VzZXIodSwgdW5iaW5kLnBvcnQpOworCisJCXNwaW5fdW5sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJT0NUTF9FVlRDSE5fTk9USUZZOiB7CisJCXN0cnVjdCBpb2N0bF9ldnRjaG5fbm90aWZ5IG5vdGlmeTsKKworCQlyYyA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbm90aWZ5LCB1YXJnLCBzaXplb2Yobm90aWZ5KSkpCisJCQlicmVhazsKKworCQlpZiAobm90aWZ5LnBvcnQgPj0gTlJfRVZFTlRfQ0hBTk5FTFMpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJfSBlbHNlIGlmIChwb3J0X3VzZXJbbm90aWZ5LnBvcnRdICE9IHUpIHsKKwkJCXJjID0gLUVOT1RDT05OOworCQl9IGVsc2UgeworCQkJbm90aWZ5X3JlbW90ZV92aWFfZXZ0Y2huKG5vdGlmeS5wb3J0KTsKKwkJCXJjID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIElPQ1RMX0VWVENITl9SRVNFVDogeworCQkvKiBJbml0aWFsaXNlIHRoZSByaW5nIHRvIGVtcHR5LiBDbGVhciBlcnJvcnMuICovCisJCW11dGV4X2xvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisJCXNwaW5fbG9ja19pcnEoJnBvcnRfdXNlcl9sb2NrKTsKKwkJdS0+cmluZ19jb25zID0gdS0+cmluZ19wcm9kID0gdS0+cmluZ19vdmVyZmxvdyA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCQltdXRleF91bmxvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PU1lTOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1LT5iaW5kX211dGV4KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBldnRjaG5fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCXN0cnVjdCBwZXJfdXNlcl9kYXRhICp1ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZ1LT5ldnRjaG5fd2FpdCwgd2FpdCk7CisJaWYgKHUtPnJpbmdfY29ucyAhPSB1LT5yaW5nX3Byb2QpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAodS0+cmluZ19vdmVyZmxvdykKKwkJbWFzayA9IFBPTExFUlI7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZXZ0Y2huX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCit7CisJc3RydWN0IHBlcl91c2VyX2RhdGEgKnUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmdS0+ZXZ0Y2huX2FzeW5jX3F1ZXVlKTsKK30KKworc3RhdGljIGludCBldnRjaG5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgcGVyX3VzZXJfZGF0YSAqdTsKKworCXUgPSBremFsbG9jKHNpemVvZigqdSksIEdGUF9LRVJORUwpOworCWlmICh1ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdS0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiZXZ0Y2huOiVzIiwgY3VycmVudC0+Y29tbSk7CisJaWYgKHUtPm5hbWUgPT0gTlVMTCkgeworCQlrZnJlZSh1KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmdS0+ZXZ0Y2huX3dhaXQpOworCisJdS0+cmluZyA9IChldnRjaG5fcG9ydF90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICh1LT5yaW5nID09IE5VTEwpIHsKKwkJa2ZyZWUodS0+bmFtZSk7CisJCWtmcmVlKHUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltdXRleF9pbml0KCZ1LT5iaW5kX211dGV4KTsKKwltdXRleF9pbml0KCZ1LT5yaW5nX2NvbnNfbXV0ZXgpOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gdTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV2dGNobl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBpOworCXN0cnVjdCBwZXJfdXNlcl9kYXRhICp1ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXUtPnJpbmcpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0VWRU5UX0NIQU5ORUxTOyBpKyspIHsKKwkJaWYgKHBvcnRfdXNlcltpXSAhPSB1KQorCQkJY29udGludWU7CisKKwkJZXZ0Y2huX3VuYmluZF9mcm9tX3VzZXIocG9ydF91c2VyW2ldLCBpKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnBvcnRfdXNlcl9sb2NrKTsKKworCWtmcmVlKHUtPm5hbWUpOworCWtmcmVlKHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV2dGNobl9mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLnJlYWQgICAgPSBldnRjaG5fcmVhZCwKKwkud3JpdGUgICA9IGV2dGNobl93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBldnRjaG5faW9jdGwsCisJLnBvbGwgICAgPSBldnRjaG5fcG9sbCwKKwkuZmFzeW5jICA9IGV2dGNobl9mYXN5bmMsCisJLm9wZW4gICAgPSBldnRjaG5fb3BlbiwKKwkucmVsZWFzZSA9IGV2dGNobl9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGV2dGNobl9taXNjZGV2ID0geworCS5taW5vciAgICAgICAgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgICAgICAgICA9ICJldnRjaG4iLAorCS5mb3BzICAgICAgICAgPSAmZXZ0Y2huX2ZvcHMsCit9Oworc3RhdGljIGludCBfX2luaXQgZXZ0Y2huX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCF4ZW5fZG9tYWluKCkpCisJCXJldHVybiAtRU5PREVWOworCisJc3Bpbl9sb2NrX2luaXQoJnBvcnRfdXNlcl9sb2NrKTsKKwltZW1zZXQocG9ydF91c2VyLCAwLCBzaXplb2YocG9ydF91c2VyKSk7CisKKwkvKiBDcmVhdGUgJy9kZXYvbWlzYy9ldnRjaG4nLiAqLworCWVyciA9IG1pc2NfcmVnaXN0ZXIoJmV2dGNobl9taXNjZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIkNvdWxkIG5vdCByZWdpc3RlciAvZGV2L21pc2MvZXZ0Y2huXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJFdmVudC1jaGFubmVsIGRldmljZSBpbnN0YWxsZWQuXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXZ0Y2huX2NsZWFudXAodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmV2dGNobl9taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQoZXZ0Y2huX2luaXQpOworbW9kdWxlX2V4aXQoZXZ0Y2huX2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9tYW5hZ2UuYyBiL2RyaXZlcnMveGVuL21hbmFnZS5jCmluZGV4IDRiNWI4NDguLmZkZGMyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL21hbmFnZS5jCisrKyBiL2RyaXZlcnMveGVuL21hbmFnZS5jCkBAIC05OCw5ICs5OCw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXByaW50aygic3VzcGVuZGluZyB4ZW5idXMuLi5cbiIpOwotCS8qIFhYWCB1c2Ugbm9ybWFsIGRldmljZSB0cmVlPyAqLwotCXhlbmJ1c19zdXNwZW5kKCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInN1c3BlbmRpbmcgeGVuc3RvcmUuLi5cbiIpOworCXhzX3N1c3BlbmQoKTsKIAogCWVyciA9IGRldmljZV9wb3dlcl9kb3duKFBNU0dfU1VTUEVORCk7CiAJaWYgKGVycikgewpAQCAtMTE2LDkgKzExNSw5IEBACiAKIAlpZiAoIWNhbmNlbGxlZCkgewogCQl4ZW5fYXJjaF9yZXN1bWUoKTsKLQkJeGVuYnVzX3Jlc3VtZSgpOworCQl4c19yZXN1bWUoKTsKIAl9IGVsc2UKLQkJeGVuYnVzX3N1c3BlbmRfY2FuY2VsKCk7CisJCXhzX3N1c3BlbmRfY2FuY2VsKCk7CiAKIAlkZXZpY2VfcG93ZXJfdXAoUE1TR19SRVNVTUUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9zeXMtaHlwZXJ2aXNvci5jIGIvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE2MGUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYwpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqICBjb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uCisgKiAgQXV0aG9yZWQgYnk6IE1pa2UgRC4gRGF5IDxuY21pa2VAdXMuaWJtLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5oPgorCisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS92ZXJzaW9uLmg+CisKKyNkZWZpbmUgSFlQRVJWSVNPUl9BVFRSX1JPKF9uYW1lKSBcCitzdGF0aWMgc3RydWN0IGh5cF9zeXNmc19hdHRyICBfbmFtZSMjX2F0dHIgPSBfX0FUVFJfUk8oX25hbWUpCisKKyNkZWZpbmUgSFlQRVJWSVNPUl9BVFRSX1JXKF9uYW1lKSBcCitzdGF0aWMgc3RydWN0IGh5cF9zeXNmc19hdHRyIF9uYW1lIyNfYXR0ciA9IFwKKwlfX0FUVFIoX25hbWUsIDA2NDQsIF9uYW1lIyNfc2hvdywgX25hbWUjI19zdG9yZSkKKworc3RydWN0IGh5cF9zeXNmc19hdHRyIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGh5cF9zeXNmc19hdHRyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKKwl2b2lkICpoeXBfYXR0cl9kYXRhOworfTsKKworc3RhdGljIHNzaXplX3QgdHlwZV9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgInhlblxuIik7Cit9CisKK0hZUEVSVklTT1JfQVRUUl9STyh0eXBlKTsKKworc3RhdGljIGludCBfX2luaXQgeGVuX3N5c2ZzX3R5cGVfaW5pdCh2b2lkKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZmlsZShoeXBlcnZpc29yX2tvYmosICZ0eXBlX2F0dHIuYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9zeXNmc190eXBlX2Rlc3Ryb3kodm9pZCkKK3sKKwlzeXNmc19yZW1vdmVfZmlsZShoeXBlcnZpc29yX2tvYmosICZ0eXBlX2F0dHIuYXR0cik7Cit9CisKKy8qIHhlbiB2ZXJzaW9uIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBzc2l6ZV90IG1ham9yX3Nob3coc3RydWN0IGh5cF9zeXNmc19hdHRyICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJaW50IHZlcnNpb24gPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl92ZXJzaW9uLCBOVUxMKTsKKwlpZiAodmVyc2lvbikKKwkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJWRcbiIsIHZlcnNpb24gPj4gMTYpOworCXJldHVybiAtRU5PREVWOworfQorCitIWVBFUlZJU09SX0FUVFJfUk8obWFqb3IpOworCitzdGF0aWMgc3NpemVfdCBtaW5vcl9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCB2ZXJzaW9uID0gSFlQRVJWSVNPUl94ZW5fdmVyc2lvbihYRU5WRVJfdmVyc2lvbiwgTlVMTCk7CisJaWYgKHZlcnNpb24pCisJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVkXG4iLCB2ZXJzaW9uICYgMHhmZik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK0hZUEVSVklTT1JfQVRUUl9STyhtaW5vcik7CisKK3N0YXRpYyBzc2l6ZV90IGV4dHJhX3Nob3coc3RydWN0IGh5cF9zeXNmc19hdHRyICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisJY2hhciAqZXh0cmE7CisKKwlleHRyYSA9IGttYWxsb2MoWEVOX0VYVFJBVkVSU0lPTl9MRU4sIEdGUF9LRVJORUwpOworCWlmIChleHRyYSkgeworCQlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9leHRyYXZlcnNpb24sIGV4dHJhKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBleHRyYSk7CisJCWtmcmVlKGV4dHJhKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitIWVBFUlZJU09SX0FUVFJfUk8oZXh0cmEpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmVyc2lvbl9hdHRyc1tdID0geworCSZtYWpvcl9hdHRyLmF0dHIsCisJJm1pbm9yX2F0dHIuYXR0ciwKKwkmZXh0cmFfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZlcnNpb25fZ3JvdXAgPSB7CisJLm5hbWUgPSAidmVyc2lvbiIsCisJLmF0dHJzID0gdmVyc2lvbl9hdHRycywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9zeXNmc192ZXJzaW9uX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKGh5cGVydmlzb3Jfa29iaiwgJnZlcnNpb25fZ3JvdXApOworfQorCitzdGF0aWMgdm9pZCB4ZW5fc3lzZnNfdmVyc2lvbl9kZXN0cm95KHZvaWQpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKGh5cGVydmlzb3Jfa29iaiwgJnZlcnNpb25fZ3JvdXApOworfQorCisvKiBVVUlEICovCisKK3N0YXRpYyBzc2l6ZV90IHV1aWRfc2hvdyhzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyICp2bSwgKnZhbDsKKwlpbnQgcmV0OworCWV4dGVybiBpbnQgeGVuc3RvcmVkX3JlYWR5OworCisJaWYgKCF4ZW5zdG9yZWRfcmVhZHkpCisJCXJldHVybiAtRUJVU1k7CisKKwl2bSA9IHhlbmJ1c19yZWFkKFhCVF9OSUwsICJ2bSIsICIiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHZtKSkKKwkJcmV0dXJuIFBUUl9FUlIodm0pOworCXZhbCA9IHhlbmJ1c19yZWFkKFhCVF9OSUwsIHZtLCAidXVpZCIsIE5VTEwpOworCWtmcmVlKHZtKTsKKwlpZiAoSVNfRVJSKHZhbCkpCisJCXJldHVybiBQVFJfRVJSKHZhbCk7CisJcmV0ID0gc3ByaW50ZihidWZmZXIsICIlc1xuIiwgdmFsKTsKKwlrZnJlZSh2YWwpOworCXJldHVybiByZXQ7Cit9CisKK0hZUEVSVklTT1JfQVRUUl9STyh1dWlkKTsKKworc3RhdGljIGludCBfX2luaXQgeGVuX3N5c2ZzX3V1aWRfaW5pdCh2b2lkKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZmlsZShoeXBlcnZpc29yX2tvYmosICZ1dWlkX2F0dHIuYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9zeXNmc191dWlkX2Rlc3Ryb3kodm9pZCkKK3sKKwlzeXNmc19yZW1vdmVfZmlsZShoeXBlcnZpc29yX2tvYmosICZ1dWlkX2F0dHIuYXR0cik7Cit9CisKKy8qIHhlbiBjb21waWxhdGlvbiBhdHRyaWJ1dGVzICovCisKK3N0YXRpYyBzc2l6ZV90IGNvbXBpbGVyX3Nob3coc3RydWN0IGh5cF9zeXNmc19hdHRyICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisJc3RydWN0IHhlbl9jb21waWxlX2luZm8gKmluZm87CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHhlbl9jb21waWxlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbykgeworCQlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9jb21waWxlX2luZm8sIGluZm8pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHNwcmludGYoYnVmZmVyLCAiJXNcbiIsIGluZm8tPmNvbXBpbGVyKTsKKwkJa2ZyZWUoaW5mbyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworSFlQRVJWSVNPUl9BVFRSX1JPKGNvbXBpbGVyKTsKKworc3RhdGljIHNzaXplX3QgY29tcGlsZWRfYnlfc2hvdyhzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlzdHJ1Y3QgeGVuX2NvbXBpbGVfaW5mbyAqaW5mbzsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgeGVuX2NvbXBpbGVfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChpbmZvKSB7CisJCXJldCA9IEhZUEVSVklTT1JfeGVuX3ZlcnNpb24oWEVOVkVSX2NvbXBpbGVfaW5mbywgaW5mbyk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gc3ByaW50ZihidWZmZXIsICIlc1xuIiwgaW5mby0+Y29tcGlsZV9ieSk7CisJCWtmcmVlKGluZm8pOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK0hZUEVSVklTT1JfQVRUUl9STyhjb21waWxlZF9ieSk7CisKK3N0YXRpYyBzc2l6ZV90IGNvbXBpbGVfZGF0ZV9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCB4ZW5fY29tcGlsZV9pbmZvICppbmZvOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4ZW5fY29tcGlsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8pIHsKKwkJcmV0ID0gSFlQRVJWSVNPUl94ZW5fdmVyc2lvbihYRU5WRVJfY29tcGlsZV9pbmZvLCBpbmZvKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBpbmZvLT5jb21waWxlX2RhdGUpOworCQlrZnJlZShpbmZvKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitIWVBFUlZJU09SX0FUVFJfUk8oY29tcGlsZV9kYXRlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnhlbl9jb21waWxlX2F0dHJzW10gPSB7CisJJmNvbXBpbGVyX2F0dHIuYXR0ciwKKwkmY29tcGlsZWRfYnlfYXR0ci5hdHRyLAorCSZjb21waWxlX2RhdGVfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHhlbl9jb21waWxhdGlvbl9ncm91cCA9IHsKKwkubmFtZSA9ICJjb21waWxhdGlvbiIsCisJLmF0dHJzID0geGVuX2NvbXBpbGVfYXR0cnMsCit9OworCitpbnQgX19pbml0IHN0YXRpYyB4ZW5fY29tcGlsYXRpb25faW5pdCh2b2lkKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoaHlwZXJ2aXNvcl9rb2JqLCAmeGVuX2NvbXBpbGF0aW9uX2dyb3VwKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2NvbXBpbGF0aW9uX2Rlc3Ryb3kodm9pZCkKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoaHlwZXJ2aXNvcl9rb2JqLCAmeGVuX2NvbXBpbGF0aW9uX2dyb3VwKTsKK30KKworLyogeGVuIHByb3BlcnRpZXMgaW5mbyAqLworCitzdGF0aWMgc3NpemVfdCBjYXBhYmlsaXRpZXNfc2hvdyhzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwljaGFyICpjYXBzOworCisJY2FwcyA9IGttYWxsb2MoWEVOX0NBUEFCSUxJVElFU19JTkZPX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcHMpIHsKKwkJcmV0ID0gSFlQRVJWSVNPUl94ZW5fdmVyc2lvbihYRU5WRVJfY2FwYWJpbGl0aWVzLCBjYXBzKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBjYXBzKTsKKwkJa2ZyZWUoY2Fwcyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworSFlQRVJWSVNPUl9BVFRSX1JPKGNhcGFiaWxpdGllcyk7CisKK3N0YXRpYyBzc2l6ZV90IGNoYW5nZXNldF9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCByZXQgPSAtRU5PTUVNOworCWNoYXIgKmNzZXQ7CisKKwljc2V0ID0ga21hbGxvYyhYRU5fQ0hBTkdFU0VUX0lORk9fTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3NldCkgeworCQlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9jaGFuZ2VzZXQsIGNzZXQpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHNwcmludGYoYnVmZmVyLCAiJXNcbiIsIGNzZXQpOworCQlrZnJlZShjc2V0KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitIWVBFUlZJU09SX0FUVFJfUk8oY2hhbmdlc2V0KTsKKworc3RhdGljIHNzaXplX3QgdmlydHVhbF9zdGFydF9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCB4ZW5fcGxhdGZvcm1fcGFyYW1ldGVycyAqcGFybXM7CisKKwlwYXJtcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4ZW5fcGxhdGZvcm1fcGFyYW1ldGVycyksIEdGUF9LRVJORUwpOworCWlmIChwYXJtcykgeworCQlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9wbGF0Zm9ybV9wYXJhbWV0ZXJzLAorCQkJCQkgICAgIHBhcm1zKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZmZlciwgIiVseFxuIiwgcGFybXMtPnZpcnRfc3RhcnQpOworCQlrZnJlZShwYXJtcyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworSFlQRVJWSVNPUl9BVFRSX1JPKHZpcnR1YWxfc3RhcnQpOworCitzdGF0aWMgc3NpemVfdCBwYWdlc2l6ZV9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCByZXQ7CisKKwlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9wYWdlc2l6ZSwgTlVMTCk7CisJaWYgKHJldCA+IDApCisJCXJldCA9IHNwcmludGYoYnVmZmVyLCAiJXhcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitIWVBFUlZJU09SX0FUVFJfUk8ocGFnZXNpemUpOworCitzdGF0aWMgc3NpemVfdCB4ZW5fZmVhdHVyZV9zaG93KGludCBpbmRleCwgY2hhciAqYnVmZmVyKQoreworCXNzaXplX3QgcmV0OworCXN0cnVjdCB4ZW5fZmVhdHVyZV9pbmZvIGluZm87CisKKwlpbmZvLnN1Ym1hcF9pZHggPSBpbmRleDsKKwlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9nZXRfZmVhdHVyZXMsICZpbmZvKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gc3ByaW50ZihidWZmZXIsICIlMDh4IiwgaW5mby5zdWJtYXApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZmVhdHVyZXNfc2hvdyhzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlzc2l6ZV90IGxlbjsKKwlpbnQgaTsKKworCWxlbiA9IDA7CisJZm9yIChpID0gWEVORkVBVF9OUl9TVUJNQVBTLTE7IGkgPj0gMDsgaS0tKSB7CisJCWludCByZXQgPSB4ZW5fZmVhdHVyZV9zaG93KGksIGJ1ZmZlciArIGxlbik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAobGVuID09IDApCisJCQkJbGVuID0gcmV0OworCQkJYnJlYWs7CisJCX0KKwkJbGVuICs9IHJldDsKKwl9CisJaWYgKGxlbiA+IDApCisJCWJ1ZmZlcltsZW4rK10gPSAnXG4nOworCisJcmV0dXJuIGxlbjsKK30KKworSFlQRVJWSVNPUl9BVFRSX1JPKGZlYXR1cmVzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnhlbl9wcm9wZXJ0aWVzX2F0dHJzW10gPSB7CisJJmNhcGFiaWxpdGllc19hdHRyLmF0dHIsCisJJmNoYW5nZXNldF9hdHRyLmF0dHIsCisJJnZpcnR1YWxfc3RhcnRfYXR0ci5hdHRyLAorCSZwYWdlc2l6ZV9hdHRyLmF0dHIsCisJJmZlYXR1cmVzX2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB4ZW5fcHJvcGVydGllc19ncm91cCA9IHsKKwkubmFtZSA9ICJwcm9wZXJ0aWVzIiwKKwkuYXR0cnMgPSB4ZW5fcHJvcGVydGllc19hdHRycywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9wcm9wZXJ0aWVzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKGh5cGVydmlzb3Jfa29iaiwgJnhlbl9wcm9wZXJ0aWVzX2dyb3VwKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3Byb3BlcnRpZXNfZGVzdHJveSh2b2lkKQoreworCXN5c2ZzX3JlbW92ZV9ncm91cChoeXBlcnZpc29yX2tvYmosICZ4ZW5fcHJvcGVydGllc19ncm91cCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGh5cGVyX3N5c2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCF4ZW5fZG9tYWluKCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0geGVuX3N5c2ZzX3R5cGVfaW5pdCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IHhlbl9zeXNmc192ZXJzaW9uX2luaXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIHZlcnNpb25fb3V0OworCXJldCA9IHhlbl9jb21waWxhdGlvbl9pbml0KCk7CisJaWYgKHJldCkKKwkJZ290byBjb21wX291dDsKKwlyZXQgPSB4ZW5fc3lzZnNfdXVpZF9pbml0KCk7CisJaWYgKHJldCkKKwkJZ290byB1dWlkX291dDsKKwlyZXQgPSB4ZW5fcHJvcGVydGllc19pbml0KCk7CisJaWYgKHJldCkKKwkJZ290byBwcm9wX291dDsKKworCWdvdG8gb3V0OworCitwcm9wX291dDoKKwl4ZW5fc3lzZnNfdXVpZF9kZXN0cm95KCk7Cit1dWlkX291dDoKKwl4ZW5fY29tcGlsYXRpb25fZGVzdHJveSgpOworY29tcF9vdXQ6CisJeGVuX3N5c2ZzX3ZlcnNpb25fZGVzdHJveSgpOwordmVyc2lvbl9vdXQ6CisJeGVuX3N5c2ZzX3R5cGVfZGVzdHJveSgpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoeXBlcl9zeXNmc19leGl0KHZvaWQpCit7CisJeGVuX3Byb3BlcnRpZXNfZGVzdHJveSgpOworCXhlbl9jb21waWxhdGlvbl9kZXN0cm95KCk7CisJeGVuX3N5c2ZzX3V1aWRfZGVzdHJveSgpOworCXhlbl9zeXNmc192ZXJzaW9uX2Rlc3Ryb3koKTsKKwl4ZW5fc3lzZnNfdHlwZV9kZXN0cm95KCk7CisKK30KK21vZHVsZV9pbml0KGh5cGVyX3N5c2ZzX2luaXQpOworbW9kdWxlX2V4aXQoaHlwZXJfc3lzZnNfZXhpdCk7CisKK3N0YXRpYyBzc2l6ZV90IGh5cF9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmh5cF9hdHRyOworCWh5cF9hdHRyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBoeXBfc3lzZnNfYXR0ciwgYXR0cik7CisJaWYgKGh5cF9hdHRyLT5zaG93KQorCQlyZXR1cm4gaHlwX2F0dHItPnNob3coaHlwX2F0dHIsIGJ1ZmZlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh5cF9zeXNmc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqaHlwX2F0dHI7CisJaHlwX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGh5cF9zeXNmc19hdHRyLCBhdHRyKTsKKwlpZiAoaHlwX2F0dHItPnN0b3JlKQorCQlyZXR1cm4gaHlwX2F0dHItPnN0b3JlKGh5cF9hdHRyLCBidWZmZXIsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGh5cF9zeXNmc19vcHMgPSB7CisJLnNob3cgPSBoeXBfc3lzZnNfc2hvdywKKwkuc3RvcmUgPSBoeXBfc3lzZnNfc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBoeXBfc3lzZnNfa29ial90eXBlID0geworCS5zeXNmc19vcHMgPSAmaHlwX3N5c2ZzX29wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh5cGVydmlzb3Jfc3Vic3lzX2luaXQodm9pZCkKK3sKKwlpZiAoIXhlbl9kb21haW4oKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwloeXBlcnZpc29yX2tvYmotPmt0eXBlID0gJmh5cF9zeXNmc19rb2JqX3R5cGU7CisJcmV0dXJuIDA7Cit9CitkZXZpY2VfaW5pdGNhbGwoaHlwZXJ2aXNvcl9zdWJzeXNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggNzczZDFjZi4uZDQyZTI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtNzEsNiArNzEsOSBAQAogCiBzdGF0aWMgdm9pZCB4ZW5idXNfZGV2X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKl9kZXYpOwogCitzdGF0aWMgaW50IHhlbmJ1c19kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHhlbmJ1c19kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CisKIC8qIElmIHNvbWV0aGluZyBpbiBhcnJheSBvZiBpZHMgbWF0Y2hlcyB0aGlzIGRldmljZSwgcmV0dXJuIGl0LiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB4ZW5idXNfZGV2aWNlX2lkICoKIG1hdGNoX2RldmljZShjb25zdCBzdHJ1Y3QgeGVuYnVzX2RldmljZV9pZCAqYXJyLCBzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KQpAQCAtMTg4LDYgKzE5MSw5IEBACiAJCS5yZW1vdmUgICAgPSB4ZW5idXNfZGV2X3JlbW92ZSwKIAkJLnNodXRkb3duICA9IHhlbmJ1c19kZXZfc2h1dGRvd24sCiAJCS5kZXZfYXR0cnMgPSB4ZW5idXNfZGV2X2F0dHJzLAorCisJCS5zdXNwZW5kICAgPSB4ZW5idXNfZGV2X3N1c3BlbmQsCisJCS5yZXN1bWUgICAgPSB4ZW5idXNfZGV2X3Jlc3VtZSwKIAl9LAogfTsKIApAQCAtNjU0LDYgKzY2MCw3IEBACiAKIAlrZnJlZShyb290KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHhlbmJ1c19kZXZfY2hhbmdlZCk7CiAKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2NoYW5nZWQoc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCiAJCQkgICAgIGNvbnN0IGNoYXIgKip2ZWMsIHVuc2lnbmVkIGludCBsZW4pCkBAIC02NjksNyArNjc2LDcgQEAKIAkuY2FsbGJhY2sgPSBmcm9udGVuZF9jaGFuZ2VkLAogfTsKIAotc3RhdGljIGludCBzdXNwZW5kX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHhlbmJ1c19kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgeGVuYnVzX2RyaXZlciAqZHJ2OwpAQCAtNjgyLDM1ICs2ODksMTQgQEAKIAlkcnYgPSB0b194ZW5idXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAl4ZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHhlbmJ1c19kZXZpY2UsIGRldik7CiAJaWYgKGRydi0+c3VzcGVuZCkKLQkJZXJyID0gZHJ2LT5zdXNwZW5kKHhkZXYpOworCQllcnIgPSBkcnYtPnN1c3BlbmQoeGRldiwgc3RhdGUpOwogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJ4ZW5idXM6IHN1c3BlbmQgJXMgZmFpbGVkOiAlaVxuIiwgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzdXNwZW5kX2NhbmNlbF9kZXYoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCWludCBlcnIgPSAwOwotCXN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhkZXY7Ci0KLQlEUFJJTlRLKCIiKTsKLQotCWlmIChkZXYtPmRyaXZlciA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlkcnYgPSB0b194ZW5idXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQl4ZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHhlbmJ1c19kZXZpY2UsIGRldik7Ci0JaWYgKGRydi0+c3VzcGVuZF9jYW5jZWwpCi0JCWVyciA9IGRydi0+c3VzcGVuZF9jYW5jZWwoeGRldik7Ci0JaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgInhlbmJ1czogc3VzcGVuZF9jYW5jZWwgJXMgZmFpbGVkOiAlaVxuIiwKLQkJICAgICAgIGRldl9uYW1lKGRldiksIGVycik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmVzdW1lX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHhlbmJ1c19kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnY7CkBAIC03NTUsMzMgKzc0MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgeGVuYnVzX3N1c3BlbmQodm9pZCkKLXsKLQlEUFJJTlRLKCIiKTsKLQotCWJ1c19mb3JfZWFjaF9kZXYoJnhlbmJ1c19mcm9udGVuZC5idXMsIE5VTEwsIE5VTEwsIHN1c3BlbmRfZGV2KTsKLQl4ZW5idXNfYmFja2VuZF9zdXNwZW5kKHN1c3BlbmRfZGV2KTsKLQl4c19zdXNwZW5kKCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfc3VzcGVuZCk7Ci0KLXZvaWQgeGVuYnVzX3Jlc3VtZSh2b2lkKQotewotCXhiX2luaXRfY29tbXMoKTsKLQl4c19yZXN1bWUoKTsKLQlidXNfZm9yX2VhY2hfZGV2KCZ4ZW5idXNfZnJvbnRlbmQuYnVzLCBOVUxMLCBOVUxMLCByZXN1bWVfZGV2KTsKLQl4ZW5idXNfYmFja2VuZF9yZXN1bWUocmVzdW1lX2Rldik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfcmVzdW1lKTsKLQotdm9pZCB4ZW5idXNfc3VzcGVuZF9jYW5jZWwodm9pZCkKLXsKLQl4c19zdXNwZW5kX2NhbmNlbCgpOwotCWJ1c19mb3JfZWFjaF9kZXYoJnhlbmJ1c19mcm9udGVuZC5idXMsIE5VTEwsIE5VTEwsIHN1c3BlbmRfY2FuY2VsX2Rldik7Ci0JeGVuYnVzX2JhY2tlbmRfcmVzdW1lKHN1c3BlbmRfY2FuY2VsX2Rldik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfc3VzcGVuZF9jYW5jZWwpOwotCiAvKiBBIGZsYWcgdG8gZGV0ZXJtaW5lIGlmIHhlbnN0b3JlZCBpcyAncmVhZHknIChpLmUuIGhhcyBzdGFydGVkKSAqLwogaW50IHhlbnN0b3JlZF9yZWFkeSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYwppbmRleCBlMzI1ZWFiLi5lYWIzM2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3hzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCkBAIC02NzMsNiArNjczLDggQEAKIAlzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaDsKIAljaGFyIHRva2VuW3NpemVvZih3YXRjaCkgKiAyICsgMV07CiAKKwl4Yl9pbml0X2NvbW1zKCk7CisKIAltdXRleF91bmxvY2soJnhzX3N0YXRlLnJlc3BvbnNlX211dGV4KTsKIAltdXRleF91bmxvY2soJnhzX3N0YXRlLnJlcXVlc3RfbXV0ZXgpOwogCXVwX3dyaXRlKCZ4c19zdGF0ZS50cmFuc2FjdGlvbl9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jIGIvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYwppbmRleCA1MTU3NDFhLi42NTU5ZTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKQEAgLTIwLDEwICsyMCwyNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJYZW4gZmlsZXN5c3RlbSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCitzdGF0aWMgc3NpemVfdCBjYXBhYmlsaXRpZXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IHNpemUsIGxvZmZfdCAqb2ZmKQoreworCWNoYXIgKnRtcCA9ICIiOworCisJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKQorCQl0bXAgPSAiY29udHJvbF9kXG4iOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1Ziwgc2l6ZSwgb2ZmLCB0bXAsIHN0cmxlbih0bXApKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2FwYWJpbGl0aWVzX2ZpbGVfb3BzID0geworCS5yZWFkID0gY2FwYWJpbGl0aWVzX3JlYWQsCit9OworCiBzdGF0aWMgaW50IHhlbmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKIAlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgeGVuZnNfZmlsZXNbXSA9IHsKLQkJWzJdID0geyJ4ZW5idXMiLCAmeGVuYnVzX2ZpbGVfb3BzLCBTX0lSVVNSfFNfSVdVU1J9LAorCQlbMV0gPSB7fSwKKwkJeyAieGVuYnVzIiwgJnhlbmJ1c19maWxlX29wcywgU19JUlVTUnxTX0lXVVNSIH0sCisJCXsgImNhcGFiaWxpdGllcyIsICZjYXBhYmlsaXRpZXNfZmlsZV9vcHMsIFNfSVJVR08gfSwKIAkJeyIifSwKIAl9OwogCmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDk4NzExNjQuLjU5MDAwMjEgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC0yNiwxMCArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KLSNpbmNsdWRlIDx0cmFjZS9ibG9jay5oPgogI2luY2x1ZGUgPHNjc2kvc2cuaD4JCS8qIGZvciBzdHJ1Y3Qgc2dfaW92ZWMgKi8KIAotREVGSU5FX1RSQUNFKGJsb2NrX3NwbGl0KTsKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYmxvY2suaD4KIAogLyoKICAqIFRlc3QgcGF0Y2ggdG8gaW5saW5lIGEgY2VydGFpbiBudW1iZXIgb2YgYmlfaW9fdmVjJ3MgaW5zaWRlIHRoZSBiaW8KQEAgLTQ5OSwxMSArNDk4LDExIEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKIAlpbnQgbnJfcGFnZXM7CiAKLQlucl9wYWdlcyA9ICgocS0+bWF4X3NlY3RvcnMgPDwgOSkgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCWlmIChucl9wYWdlcyA+IHEtPm1heF9waHlzX3NlZ21lbnRzKQotCQlucl9wYWdlcyA9IHEtPm1heF9waHlzX3NlZ21lbnRzOwotCWlmIChucl9wYWdlcyA+IHEtPm1heF9od19zZWdtZW50cykKLQkJbnJfcGFnZXMgPSBxLT5tYXhfaHdfc2VnbWVudHM7CisJbnJfcGFnZXMgPSAoKHF1ZXVlX21heF9zZWN0b3JzKHEpIDw8IDkpICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlpZiAobnJfcGFnZXMgPiBxdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxKSkKKwkJbnJfcGFnZXMgPSBxdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxKTsKKwlpZiAobnJfcGFnZXMgPiBxdWV1ZV9tYXhfaHdfc2VnbWVudHMocSkpCisJCW5yX3BhZ2VzID0gcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEpOwogCiAJcmV0dXJuIG5yX3BhZ2VzOwogfQpAQCAtNTYyLDggKzU2MSw4IEBACiAJICogbWFrZSB0aGlzIHRvbyBjb21wbGV4LgogCSAqLwogCi0Jd2hpbGUgKGJpby0+YmlfcGh5c19zZWdtZW50cyA+PSBxLT5tYXhfcGh5c19zZWdtZW50cwotCSAgICAgICB8fCBiaW8tPmJpX3BoeXNfc2VnbWVudHMgPj0gcS0+bWF4X2h3X3NlZ21lbnRzKSB7CisJd2hpbGUgKGJpby0+YmlfcGh5c19zZWdtZW50cyA+PSBxdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhxKQorCSAgICAgICB8fCBiaW8tPmJpX3BoeXNfc2VnbWVudHMgPj0gcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEpKSB7CiAKIAkJaWYgKHJldHJpZWRfc2VnbWVudHMpCiAJCQlyZXR1cm4gMDsKQEAgLTYzNCw3ICs2MzMsOCBAQAogaW50IGJpb19hZGRfcGNfcGFnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7Ci0JcmV0dXJuIF9fYmlvX2FkZF9wYWdlKHEsIGJpbywgcGFnZSwgbGVuLCBvZmZzZXQsIHEtPm1heF9od19zZWN0b3JzKTsKKwlyZXR1cm4gX19iaW9fYWRkX3BhZ2UocSwgYmlvLCBwYWdlLCBsZW4sIG9mZnNldCwKKwkJCSAgICAgIHF1ZXVlX21heF9od19zZWN0b3JzKHEpKTsKIH0KIAogLyoqCkBAIC02NTQsNyArNjU0LDcgQEAKIAkJIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShiaW8tPmJpX2JkZXYpOwotCXJldHVybiBfX2Jpb19hZGRfcGFnZShxLCBiaW8sIHBhZ2UsIGxlbiwgb2Zmc2V0LCBxLT5tYXhfc2VjdG9ycyk7CisJcmV0dXJuIF9fYmlvX2FkZF9wYWdlKHEsIGJpbywgcGFnZSwgbGVuLCBvZmZzZXQsIHF1ZXVlX21heF9zZWN0b3JzKHEpKTsKIH0KIAogc3RydWN0IGJpb19tYXBfZGF0YSB7CkBAIC03MjEsNyArNzIxLDcgQEAKIAogCQl3aGlsZSAoYnZfbGVuICYmIGlvdl9pZHggPCBpb3ZfY291bnQpIHsKIAkJCXVuc2lnbmVkIGludCBieXRlczsKLQkJCWNoYXIgKmlvdl9hZGRyOworCQkJY2hhciBfX3VzZXIgKmlvdl9hZGRyOwogCiAJCQlieXRlcyA9IG1pbl90KHVuc2lnbmVkIGludCwKIAkJCQkgICAgICBpb3ZbaW92X2lkeF0uaW92X2xlbiAtIGlvdl9vZmYsIGJ2X2xlbik7CkBAIC0xMjAxLDcgKzEyMDEsNyBAQAogCQljaGFyICphZGRyID0gcGFnZV9hZGRyZXNzKGJ2ZWMtPmJ2X3BhZ2UpOwogCQlpbnQgbGVuID0gYm1kLT5pb3ZlY3NbaV0uYnZfbGVuOwogCi0JCWlmIChyZWFkICYmICFlcnIpCisJCWlmIChyZWFkKQogCQkJbWVtY3B5KHAsIGFkZHIsIGxlbik7CiAKIAkJX19mcmVlX3BhZ2UoYnZlYy0+YnZfcGFnZSk7CkBAIC0xNDkwLDExICsxNDkwLDEyIEBACiBzZWN0b3JfdCBiaW9fc2VjdG9yX29mZnNldChzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIHNob3J0IGluZGV4LAogCQkJICAgdW5zaWduZWQgaW50IG9mZnNldCkKIHsKLQl1bnNpZ25lZCBpbnQgc2VjdG9yX3N6ID0gcXVldWVfaGFyZHNlY3Rfc2l6ZShiaW8tPmJpX2JkZXYtPmJkX2Rpc2stPnF1ZXVlKTsKKwl1bnNpZ25lZCBpbnQgc2VjdG9yX3N6OwogCXN0cnVjdCBiaW9fdmVjICpidjsKIAlzZWN0b3JfdCBzZWN0b3JzOwogCWludCBpOwogCisJc2VjdG9yX3N6ID0gcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGJpby0+YmlfYmRldi0+YmRfZGlzay0+cXVldWUpOwogCXNlY3RvcnMgPSAwOwogCiAJaWYgKGluZGV4ID49IGJpby0+YmlfaWR4KQpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCBmNDVkYmMxLi45MzFmNmI4IDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC03Niw3ICs3Nyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogU2l6ZSBjYW5ub3QgYmUgc21hbGxlciB0aGFuIHRoZSBzaXplIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlICovCi0JaWYgKHNpemUgPCBiZGV2X2hhcmRzZWN0X3NpemUoYmRldikpCisJaWYgKHNpemUgPCBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAkvKiBEb24ndCBjaGFuZ2UgdGhlIHNpemUgaWYgaXQgaXMgc2FtZSBhcyBjdXJyZW50ICovCkBAIC0xMDYsNyArMTA3LDcgQEAKIAogaW50IHNiX21pbl9ibG9ja3NpemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHNpemUpCiB7Ci0JaW50IG1pbnNpemUgPSBiZGV2X2hhcmRzZWN0X3NpemUoc2ItPnNfYmRldik7CisJaW50IG1pbnNpemUgPSBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShzYi0+c19iZGV2KTsKIAlpZiAoc2l6ZSA8IG1pbnNpemUpCiAJCXNpemUgPSBtaW5zaXplOwogCXJldHVybiBzYl9zZXRfYmxvY2tzaXplKHNiLCBzaXplKTsKQEAgLTQ5Miw2ICs0OTMsMTEgQEAKIAliZF9tbnQgPSBrZXJuX21vdW50KCZiZF90eXBlKTsKIAlpZiAoSVNfRVJSKGJkX21udCkpCiAJCXBhbmljKCJDYW5ub3QgY3JlYXRlIGJkZXYgcHNldWRvLWZzIik7CisJLyoKKwkgKiBUaGlzIHZmc21vdW50IHN0cnVjdHVyZSBpcyBvbmx5IHVzZWQgdG8gb2J0YWluIHRoZQorCSAqIGJsb2NrZGV2X3N1cGVyYmxvY2ssIHNvIHRlbGwga21lbWxlYWsgbm90IHRvIHJlcG9ydCBpdC4KKwkgKi8KKwlrbWVtbGVha19ub3RfbGVhayhiZF9tbnQpOwogCWJsb2NrZGV2X3N1cGVyYmxvY2sgPSBiZF9tbnQtPm1udF9zYjsJLyogRm9yIHdyaXRlYmFjayAqLwogfQogCkBAIC0xMTExLDcgKzExMTcsNyBAQAogCiB2b2lkIGJkX3NldF9zaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGxvZmZfdCBzaXplKQogewotCXVuc2lnbmVkIGJzaXplID0gYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpOworCXVuc2lnbmVkIGJzaXplID0gYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoYmRldik7CiAKIAliZGV2LT5iZF9pbm9kZS0+aV9zaXplID0gc2l6ZTsKIAl3aGlsZSAoYnNpemUgPCBQQUdFX0NBQ0hFX1NJWkUpIHsKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggNDkxMDYxMi4uYTNlZjA5MSAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTEwODUsMTIgKzEwODUsMTIgQEAKIF9fZ2V0YmxrX3Nsb3coc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssIGludCBzaXplKQogewogCS8qIFNpemUgbXVzdCBiZSBtdWx0aXBsZSBvZiBoYXJkIHNlY3RvcnNpemUgKi8KLQlpZiAodW5saWtlbHkoc2l6ZSAmIChiZGV2X2hhcmRzZWN0X3NpemUoYmRldiktMSkgfHwKKwlpZiAodW5saWtlbHkoc2l6ZSAmIChiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KS0xKSB8fAogCQkJKHNpemUgPCA1MTIgfHwgc2l6ZSA+IFBBR0VfU0laRSkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZ2V0YmxrKCk6IGludmFsaWQgYmxvY2sgc2l6ZSAlZCByZXF1ZXN0ZWRcbiIsCiAJCQkJCXNpemUpOwotCQlwcmludGsoS0VSTl9FUlIgImhhcmRzZWN0IHNpemU6ICVkXG4iLAotCQkJCQliZGV2X2hhcmRzZWN0X3NpemUoYmRldikpOworCQlwcmludGsoS0VSTl9FUlIgImxvZ2ljYWwgYmxvY2sgc2l6ZTogJWRcbiIsCisJCQkJCWJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpKTsKIAogCQlkdW1wX3N0YWNrKCk7CiAJCXJldHVybiBOVUxMOwpAQCAtMjkzNSw2ICsyOTM1LDggQEAKIAlCVUdfT04oIWJ1ZmZlcl9sb2NrZWQoYmgpKTsKIAlCVUdfT04oIWJ1ZmZlcl9tYXBwZWQoYmgpKTsKIAlCVUdfT04oIWJoLT5iX2VuZF9pbyk7CisJQlVHX09OKGJ1ZmZlcl9kZWxheShiaCkpOworCUJVR19PTihidWZmZXJfdW53cml0dGVuKGJoKSk7CiAKIAkvKgogCSAqIE1hc2sgaW4gYmFycmllciBiaXQgZm9yIGEgd3JpdGUgKGNvdWxkIGJlIGVpdGhlciBhIFdSSVRFIG9yIGEKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvQ0hBTkdFUyBiL2ZzL2NpZnMvQ0hBTkdFUwppbmRleCBmMjBjNDA2Li5iNDg2ODk4IDEwMDY0NAotLS0gYS9mcy9jaWZzL0NIQU5HRVMKKysrIGIvZnMvY2lmcy9DSEFOR0VTCkBAIC0xLDMgKzEsMTIgQEAKK1ZlcnNpb24gMS41OQorLS0tLS0tLS0tLS0tCitDbGllbnQgdXNlcyBzZXJ2ZXIgaW5vZGUgbnVtYmVycyAod2hpY2ggYXJlIHBlcnNpc3RlbnQpIHJhdGhlciB0aGFuCitjbGllbnQgZ2VuZXJhdGVkIG9uZXMgYnkgZGVmYXVsdCAobW91bnQgb3B0aW9uICJzZXJ2ZXJpbm8iIHR1cm5lZAorb24gYnkgZGVmYXVsdCBpZiBzZXJ2ZXIgc3VwcG9ydHMgaXQpLiAgQWRkIGZvcmNldWlkIGFuZCBmb3JjZWdpZAorbW91bnQgb3B0aW9ucyAoc28gdGhhdCB3aGVuIG5lZ290aWF0aW5nIHVuaXggZXh0ZW5zaW9ucyBzcGVjaWZ5aW5nCit3aGljaCB1aWQgbW91bnRlZCBkb2VzIG5vdCBpbW1lZGlhdGVseSBmb3JjZSB0aGUgc2VydmVyJ3MgcmVwb3J0ZWQKK3VpZHMgdG8gYmUgb3ZlcnJpZGRlbikuCisKIFZlcnNpb24gMS41OAogLS0tLS0tLS0tLS0tCiBHdWFyZCBhZ2FpbnN0IGJ1ZmZlciBvdmVycnVucyBpbiB2YXJpb3VzIFVDUy0yIHRvIFVURi04IHN0cmluZyBjb252ZXJzaW9ucwpAQCAtMTAsNiArMTksOCBAQAogc2Vzc2lvbiBzZXR1cCB0byBkaXN0aW5ndWlzaCBtdWx0aXBsZSBtb3VudHMgdG8gc2FtZSBzZXJ2ZXIgZnJvbSBkaWZmZXJlbnQKIHVzZXJpZHMuIFJhdyBOVExNU1NQIGZpeGVkIChpdCByZXF1aXJlcyAvcHJvYy9mcy9jaWZzL2V4cGVyaW1lbnRhbAogZmxhZyB0byBiZSBzZXQgdG8gMiwgYW5kIG1vdW50IG11c3QgZW5hYmxlIGtyYjUgdG8gdHVybiBvbiBleHRlbmRlZCBzZWN1cml0eSkuCitQZXJmb3JtYW5jZSBvZiBmaWxlIGNyZWF0ZSB0byBTYW1iYSBpbXByb3ZlZCAocG9zaXggY3JlYXRlIG9uIGxvb2t1cAorcmVtb3ZlcyAxIG9mIDIgbmV0d29yayByZXF1ZXN0cyBzZW50IG9uIGZpbGUgY3JlYXRlKQogIAogVmVyc2lvbiAxLjU3CiAtLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvUkVBRE1FIGIvZnMvY2lmcy9SRUFETUUKaW5kZXggZGIyMDhkZGIuLmFkOTI5MjEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvUkVBRE1FCisrKyBiL2ZzL2NpZnMvUkVBRE1FCkBAIC0yNjIsNyArMjYyLDggQEAKIAkJbW91bnQuCQogICBkb21haW4JU2V0IHRoZSBTTUIvQ0lGUyB3b3JrZ3JvdXAgbmFtZSBwcmVwZW5kZWQgdG8gdGhlCiAJCXVzZXJuYW1lIGR1cmluZyBDSUZTIHNlc3Npb24gZXN0YWJsaXNobWVudAotICB1aWQJCVNldCB0aGUgZGVmYXVsdCB1aWQgZm9yIGlub2Rlcy4gRm9yIG1vdW50cyB0byBzZXJ2ZXJzCisgIGZvcmNldWlkCVNldCB0aGUgZGVmYXVsdCB1aWQgZm9yIGlub2RlcyBiYXNlZCBvbiB0aGUgdWlkCisJCXBhc3NlZCBpbi4gRm9yIG1vdW50cyB0byBzZXJ2ZXJzCiAJCXdoaWNoIGRvIHN1cHBvcnQgdGhlIENJRlMgVW5peCBleHRlbnNpb25zLCBzdWNoIGFzIGEKIAkJcHJvcGVybHkgY29uZmlndXJlZCBTYW1iYSBzZXJ2ZXIsIHRoZSBzZXJ2ZXIgcHJvdmlkZXMKIAkJdGhlIHVpZCwgZ2lkIGFuZCBtb2RlIHNvIHRoaXMgcGFyYW1ldGVyIHNob3VsZCAgbm90IGJlCkBAIC0yOTIsNiArMjkzLDEyIEBACiAJCXRoZSBjbGllbnQuICBOb3RlIHRoYXQgdGhlIG1vdW50LmNpZnMgaGVscGVyIG11c3QgYmUKIAkJYXQgdmVyc2lvbiAxLjEwIG9yIGhpZ2hlciB0byBzdXBwb3J0IHNwZWNpZnlpbmcgdGhlIHVpZAogCQkob3IgZ2lkKSBpbiBub24tbnVtZXJpYyBmb3JtLgorICBmb3JjZWdpZAkoc2ltaWxhciB0byBhYm92ZSBidXQgZm9yIHRoZSBncm91cGlkIGluc3RlYWQgb2YgdWlkKQorICB1aWQJCVNldCB0aGUgZGVmYXVsdCB1aWQgZm9yIGlub2RlcywgYW5kIGluZGljYXRlIHRvIHRoZQorCQljaWZzIGtlcm5lbCBkcml2ZXIgd2hpY2ggbG9jYWwgdXNlciBtb3VudGVkIC4gSWYgdGhlIHNlcnZlcgorCQlzdXBwb3J0cyB0aGUgdW5peCBleHRlbnNpb25zIHRoZSBkZWZhdWx0IHVpZCBpcworCQlub3QgdXNlZCB0byBmaWxsIGluIHRoZSBvd25lciBmaWVsZHMgb2YgaW5vZGVzIChmaWxlcykKKwkJdW5sZXNzIHRoZSAiZm9yY2V1aWQiIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQuCiAgIGdpZAkJU2V0IHRoZSBkZWZhdWx0IGdpZCBmb3IgaW5vZGVzIChzaW1pbGFyIHRvIGFib3ZlKS4KICAgZmlsZV9tb2RlICAgICBJZiBDSUZTIFVuaXggZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyCiAJCXRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IG1vZGUgZm9yIGZpbGUgaW5vZGVzLgpAQCAtMzg4LDggKzM5NSwxMyBAQAogCQlvciB0aGUgQ0lGUyBVbml4IEV4dGVuc2lvbnMgZXF1aXZhbGVudCBhbmQgZm9yIHRob3NlCiAJCXRoaXMgbW91bnQgb3B0aW9uIHdpbGwgaGF2ZSBubyBlZmZlY3QuICBFeHBvcnRpbmcgY2lmcyBtb3VudHMKIAkJdW5kZXIgbmZzZCByZXF1aXJlcyB0aGlzIG1vdW50IG9wdGlvbiBvbiB0aGUgY2lmcyBtb3VudC4KKwkJVGhpcyBpcyBub3cgdGhlIGRlZmF1bHQgaWYgc2VydmVyIHN1cHBvcnRzIHRoZSAKKwkJcmVxdWlyZWQgbmV0d29yayBvcGVyYXRpb24uCiAgIG5vc2VydmVyaW5vICAgQ2xpZW50IGdlbmVyYXRlcyBpbm9kZSBudW1iZXJzIChyYXRoZXIgdGhhbiB1c2luZyB0aGUgYWN0dWFsIG9uZQotCQlmcm9tIHRoZSBzZXJ2ZXIpIGJ5IGRlZmF1bHQuCisJCWZyb20gdGhlIHNlcnZlcikuIFRoZXNlIGlub2RlIG51bWJlcnMgd2lsbCB2YXJ5IGFmdGVyCisJCXVubW91bnQgb3IgcmVib290IHdoaWNoIGNhbiBjb25mdXNlIHNvbWUgYXBwbGljYXRpb25zLAorCQlidXQgbm90IGFsbCBzZXJ2ZXIgZmlsZXN5c3RlbXMgc3VwcG9ydCB1bmlxdWUgaW5vZGUKKwkJbnVtYmVycy4KICAgc2V0dWlkcyAgICAgICBJZiB0aGUgQ0lGUyBVbml4IGV4dGVuc2lvbnMgYXJlIG5lZ290aWF0ZWQgd2l0aCB0aGUgc2VydmVyCiAJCXRoZSBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIHNldCB0aGUgZWZmZWN0aXZlIHVpZCBhbmQgZ2lkIG9mCiAJCXRoZSBsb2NhbCBwcm9jZXNzIG9uIG5ld2x5IGNyZWF0ZWQgZmlsZXMsIGRpcmVjdG9yaWVzLCBhbmQKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19zcG5lZ28uYyBiL2ZzL2NpZnMvY2lmc19zcG5lZ28uYwppbmRleCA2N2JmOTNhLi40YTQ1ODFjIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNfc3BuZWdvLmMKKysrIGIvZnMvY2lmcy9jaWZzX3NwbmVnby5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8a2V5cy91c2VyLXR5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXktdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KICNpbmNsdWRlICJjaWZzZ2xvYi5oIgogI2luY2x1ZGUgImNpZnNfc3BuZWdvLmgiCiAjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgpAQCAtNzMsOSArNzQsNiBAQAogICogc3RybGVuKCI7c2VjPW50bG1zc3BpIikgKi8KICNkZWZpbmUgTUFYX01FQ0hfU1RSX0xFTgkxMwogCi0vKiBtYXggcG9zc2libGUgYWRkciBsZW4gZWcgRkVEQzpCQTk4Ojc2NTQ6MzIxMDpGRURDOkJBOTg6NzY1NDozMjEwLzEyOCAqLwotI2RlZmluZSBNQVhfSVBWNl9BRERSX0xFTgk0MwotCiAvKiBzdHJsZW4gb2YgImhvc3Q9IiAqLwogI2RlZmluZSBIT1NUX0tFWV9MRU4JCTUKIApAQCAtMTAyLDcgKzEwMCw3IEBACiAJICAgaG9zdD1ob3N0bmFtZSBzZWM9bWVjaGFuaXNtIHVpZD0weEZGIHVzZXI9dXNlcm5hbWUgKi8KIAlkZXNjX2xlbiA9IE1BWF9WRVJfU1RSX0xFTiArCiAJCSAgIEhPU1RfS0VZX0xFTiArIHN0cmxlbihob3N0bmFtZSkgKwotCQkgICBJUF9LRVlfTEVOICsgTUFYX0lQVjZfQUREUl9MRU4gKworCQkgICBJUF9LRVlfTEVOICsgSU5FVDZfQUREUlNUUkxFTiArCiAJCSAgIE1BWF9NRUNIX1NUUl9MRU4gKwogCQkgICBVSURfS0VZX0xFTiArIChzaXplb2YodWlkX3QpICogMikgKwogCQkgICBVU0VSX0tFWV9MRU4gKyBzdHJsZW4oc2VzSW5mby0+dXNlck5hbWUpICsgMTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2FjbC5jIGIvZnMvY2lmcy9jaWZzYWNsLmMKaW5kZXggNTdlY2RjOC4uMTQwM2I1ZCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzYWNsLmMKKysrIGIvZnMvY2lmcy9jaWZzYWNsLmMKQEAgLTU1MiwxMzAgKzU1MiwxMzggQEAKIAlyZXR1cm4gcmM7CiB9CiAKLQotLyogUmV0cmlldmUgYW4gQUNMIGZyb20gdGhlIHNlcnZlciAqLwotc3RhdGljIHN0cnVjdCBjaWZzX250c2QgKmdldF9jaWZzX2FjbCh1MzIgKnBhY2xsZW4sIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IF9fdTE2ICpwZmlkKQorc3RhdGljIHN0cnVjdCBjaWZzX250c2QgKmdldF9jaWZzX2FjbF9ieV9maWQoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwKKwkJX191MTYgZmlkLCB1MzIgKnBhY2xsZW4pCiB7Ci0Jc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlID0gTlVMTDsKLQlib29sIHVubG9ja19maWxlID0gZmFsc2U7Ci0JaW50IHhpZDsKLQlpbnQgcmMgPSAtRUlPOwotCV9fdTE2IGZpZDsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CiAJc3RydWN0IGNpZnNfbnRzZCAqcG50c2QgPSBOVUxMOwotCi0JY0ZZSSgxLCAoImdldCBtb2RlIGZyb20gQUNMIGZvciAlcyIsIHBhdGgpKTsKLQotCWlmIChpbm9kZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKKwlpbnQgeGlkLCByYzsKIAogCXhpZCA9IEdldFhpZCgpOwotCWlmIChwZmlkID09IE5VTEwpCi0JCW9wZW5fZmlsZSA9IGZpbmRfcmVhZGFibGVfZmlsZShDSUZTX0koaW5vZGUpKTsKLQllbHNlCi0JCWZpZCA9ICpwZmlkOworCXJjID0gQ0lGU1NNQkdldENJRlNBQ0woeGlkLCBjaWZzX3NiLT50Y29uLCBmaWQsICZwbnRzZCwgcGFjbGxlbik7CisJRnJlZVhpZCh4aWQpOwogCi0Jc2IgPSBpbm9kZS0+aV9zYjsKLQlpZiAoc2IgPT0gTlVMTCkgewotCQlGcmVlWGlkKHhpZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQljaWZzX3NiID0gQ0lGU19TQihzYik7CiAKLQlpZiAob3Blbl9maWxlKSB7Ci0JCXVubG9ja19maWxlID0gdHJ1ZTsKLQkJZmlkID0gb3Blbl9maWxlLT5uZXRmaWQ7Ci0JfSBlbHNlIGlmIChwZmlkID09IE5VTEwpIHsKLQkJaW50IG9wbG9jayA9IDA7Ci0JCS8qIG9wZW4gZmlsZSAqLwotCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgY2lmc19zYi0+dGNvbiwgcGF0aCwgRklMRV9PUEVOLAotCQkJCVJFQURfQ09OVFJPTCwgMCwgJmZpZCwgJm9wbG9jaywgTlVMTCwKLQkJCQljaWZzX3NiLT5sb2NhbF9ubHMsIGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYKLQkJCQkJQ0lGU19NT1VOVF9NQVBfU1BFQ0lBTF9DSFIpOwotCQlpZiAocmMgIT0gMCkgewotCQkJY0VSUk9SKDEsICgiVW5hYmxlIHRvIG9wZW4gZmlsZSB0byBnZXQgQUNMIikpOwotCQkJRnJlZVhpZCh4aWQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKwljRllJKDEsICgiR2V0Q0lGU0FDTCByYyA9ICVkIEFDTCBsZW4gJWQiLCByYywgKnBhY2xsZW4pKTsKKwlyZXR1cm4gcG50c2Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2lmc19udHNkICpnZXRfY2lmc19hY2xfYnlfcGF0aChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLAorCQljb25zdCBjaGFyICpwYXRoLCB1MzIgKnBhY2xsZW4pCit7CisJc3RydWN0IGNpZnNfbnRzZCAqcG50c2QgPSBOVUxMOworCWludCBvcGxvY2sgPSAwOworCWludCB4aWQsIHJjOworCV9fdTE2IGZpZDsKKworCXhpZCA9IEdldFhpZCgpOworCisJcmMgPSBDSUZTU01CT3Blbih4aWQsIGNpZnNfc2ItPnRjb24sIHBhdGgsIEZJTEVfT1BFTiwgUkVBRF9DT05UUk9MLCAwLAorCQkJICZmaWQsICZvcGxvY2ssIE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scywKKwkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwlpZiAocmMpIHsKKwkJY0VSUk9SKDEsICgiVW5hYmxlIHRvIG9wZW4gZmlsZSB0byBnZXQgQUNMIikpOworCQlnb3RvIG91dDsKIAl9CiAKIAlyYyA9IENJRlNTTUJHZXRDSUZTQUNMKHhpZCwgY2lmc19zYi0+dGNvbiwgZmlkLCAmcG50c2QsIHBhY2xsZW4pOwogCWNGWUkoMSwgKCJHZXRDSUZTQUNMIHJjID0gJWQgQUNMIGxlbiAlZCIsIHJjLCAqcGFjbGxlbikpOwotCWlmICh1bmxvY2tfZmlsZSA9PSB0cnVlKSAvKiBmaW5kX3JlYWRhYmxlX2ZpbGUgaW5jcmVtZW50cyByZWYgY291bnQgKi8KLQkJYXRvbWljX2RlYygmb3Blbl9maWxlLT53cnRQZW5kaW5nKTsKLQllbHNlIGlmIChwZmlkID09IE5VTEwpIC8qIGlmIG9wZW5lZCBhYm92ZSB3ZSBoYXZlIHRvIGNsb3NlIHRoZSBoYW5kbGUgKi8KLQkJQ0lGU1NNQkNsb3NlKHhpZCwgY2lmc19zYi0+dGNvbiwgZmlkKTsKLQkvKiBlbHNlIGhhbmRsZSB3YXMgcGFzc2VkIGluIGJ5IGNhbGxlciAqLwogCisJQ0lGU1NNQkNsb3NlKHhpZCwgY2lmc19zYi0+dGNvbiwgZmlkKTsKKyBvdXQ6CiAJRnJlZVhpZCh4aWQpOwogCXJldHVybiBwbnRzZDsKIH0KIAorLyogUmV0cmlldmUgYW4gQUNMIGZyb20gdGhlIHNlcnZlciAqLworc3RhdGljIHN0cnVjdCBjaWZzX250c2QgKmdldF9jaWZzX2FjbChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLAorCQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJICAgICAgdTMyICpwYWNsbGVuKQoreworCXN0cnVjdCBjaWZzX250c2QgKnBudHNkID0gTlVMTDsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBOVUxMOworCisJaWYgKGlub2RlKQorCQlvcGVuX2ZpbGUgPSBmaW5kX3JlYWRhYmxlX2ZpbGUoQ0lGU19JKGlub2RlKSk7CisJaWYgKCFvcGVuX2ZpbGUpCisJCXJldHVybiBnZXRfY2lmc19hY2xfYnlfcGF0aChjaWZzX3NiLCBwYXRoLCBwYWNsbGVuKTsKKworCXBudHNkID0gZ2V0X2NpZnNfYWNsX2J5X2ZpZChjaWZzX3NiLCBvcGVuX2ZpbGUtPm5ldGZpZCwgcGFjbGxlbik7CisJYXRvbWljX2RlYygmb3Blbl9maWxlLT53cnRQZW5kaW5nKTsKKwlyZXR1cm4gcG50c2Q7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NpZnNfYWNsX2J5X2ZpZChzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiLCBfX3UxNiBmaWQsCisJCXN0cnVjdCBjaWZzX250c2QgKnBubnRzZCwgdTMyIGFjbGxlbikKK3sKKwlpbnQgeGlkLCByYzsKKworCXhpZCA9IEdldFhpZCgpOworCXJjID0gQ0lGU1NNQlNldENJRlNBQ0woeGlkLCBjaWZzX3NiLT50Y29uLCBmaWQsIHBubnRzZCwgYWNsbGVuKTsKKwlGcmVlWGlkKHhpZCk7CisKKwljRllJKERCRzIsICgiU2V0Q0lGU0FDTCByYyA9ICVkIiwgcmMpKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NpZnNfYWNsX2J5X3BhdGgoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgY29uc3QgY2hhciAqcGF0aCwKKwkJc3RydWN0IGNpZnNfbnRzZCAqcG5udHNkLCB1MzIgYWNsbGVuKQoreworCWludCBvcGxvY2sgPSAwOworCWludCB4aWQsIHJjOworCV9fdTE2IGZpZDsKKworCXhpZCA9IEdldFhpZCgpOworCisJcmMgPSBDSUZTU01CT3Blbih4aWQsIGNpZnNfc2ItPnRjb24sIHBhdGgsIEZJTEVfT1BFTiwgV1JJVEVfREFDLCAwLAorCQkJICZmaWQsICZvcGxvY2ssIE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scywKKwkJCSBjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTUFQX1NQRUNJQUxfQ0hSKTsKKwlpZiAocmMpIHsKKwkJY0VSUk9SKDEsICgiVW5hYmxlIHRvIG9wZW4gZmlsZSB0byBzZXQgQUNMIikpOworCQlnb3RvIG91dDsKKwl9CisKKwlyYyA9IENJRlNTTUJTZXRDSUZTQUNMKHhpZCwgY2lmc19zYi0+dGNvbiwgZmlkLCBwbm50c2QsIGFjbGxlbik7CisJY0ZZSShEQkcyLCAoIlNldENJRlNBQ0wgcmMgPSAlZCIsIHJjKSk7CisKKwlDSUZTU01CQ2xvc2UoeGlkLCBjaWZzX3NiLT50Y29uLCBmaWQpOworIG91dDoKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCiAvKiBTZXQgYW4gQUNMIG9uIHRoZSBzZXJ2ZXIgKi8KIHN0YXRpYyBpbnQgc2V0X2NpZnNfYWNsKHN0cnVjdCBjaWZzX250c2QgKnBubnRzZCwgX191MzIgYWNsbGVuLAogCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgpCiB7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBjaWZzRmlsZUluZm8gKm9wZW5fZmlsZTsKLQlib29sIHVubG9ja19maWxlID0gZmFsc2U7Ci0JaW50IHhpZDsKLQlpbnQgcmMgPSAtRUlPOwotCV9fdTE2IGZpZDsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwotCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJaW50IHJjOwogCiAJY0ZZSShEQkcyLCAoInNldCBBQ0wgZm9yICVzIGZyb20gbW9kZSAweCV4IiwgcGF0aCwgaW5vZGUtPmlfbW9kZSkpOwogCi0JaWYgKCFpbm9kZSkKLQkJcmV0dXJuIHJjOwotCi0Jc2IgPSBpbm9kZS0+aV9zYjsKLQlpZiAoc2IgPT0gTlVMTCkKLQkJcmV0dXJuIHJjOwotCi0JY2lmc19zYiA9IENJRlNfU0Ioc2IpOwotCXhpZCA9IEdldFhpZCgpOwotCiAJb3Blbl9maWxlID0gZmluZF9yZWFkYWJsZV9maWxlKENJRlNfSShpbm9kZSkpOwotCWlmIChvcGVuX2ZpbGUpIHsKLQkJdW5sb2NrX2ZpbGUgPSB0cnVlOwotCQlmaWQgPSBvcGVuX2ZpbGUtPm5ldGZpZDsKLQl9IGVsc2UgewotCQlpbnQgb3Bsb2NrID0gMDsKLQkJLyogb3BlbiBmaWxlICovCi0JCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBjaWZzX3NiLT50Y29uLCBwYXRoLCBGSUxFX09QRU4sCi0JCQkJV1JJVEVfREFDLCAwLCAmZmlkLCAmb3Bsb2NrLCBOVUxMLAotCQkJCWNpZnNfc2ItPmxvY2FsX25scywgY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJgotCQkJCQlDSUZTX01PVU5UX01BUF9TUEVDSUFMX0NIUik7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCQljRVJST1IoMSwgKCJVbmFibGUgdG8gb3BlbiBmaWxlIHRvIHNldCBBQ0wiKSk7Ci0JCQlGcmVlWGlkKHhpZCk7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9CisJaWYgKCFvcGVuX2ZpbGUpCisJCXJldHVybiBzZXRfY2lmc19hY2xfYnlfcGF0aChjaWZzX3NiLCBwYXRoLCBwbm50c2QsIGFjbGxlbik7CiAKLQlyYyA9IENJRlNTTUJTZXRDSUZTQUNMKHhpZCwgY2lmc19zYi0+dGNvbiwgZmlkLCBwbm50c2QsIGFjbGxlbik7Ci0JY0ZZSShEQkcyLCAoIlNldENJRlNBQ0wgcmMgPSAlZCIsIHJjKSk7Ci0JaWYgKHVubG9ja19maWxlKQotCQlhdG9taWNfZGVjKCZvcGVuX2ZpbGUtPndydFBlbmRpbmcpOwotCWVsc2UKLQkJQ0lGU1NNQkNsb3NlKHhpZCwgY2lmc19zYi0+dGNvbiwgZmlkKTsKLQotCUZyZWVYaWQoeGlkKTsKLQorCXJjID0gc2V0X2NpZnNfYWNsX2J5X2ZpZChjaWZzX3NiLCBvcGVuX2ZpbGUtPm5ldGZpZCwgcG5udHNkLCBhY2xsZW4pOworCWF0b21pY19kZWMoJm9wZW5fZmlsZS0+d3J0UGVuZGluZyk7CiAJcmV0dXJuIHJjOwogfQogCiAvKiBUcmFuc2xhdGUgdGhlIENJRlMgQUNMIChzaW1sYXIgdG8gTlRGUyBBQ0wpIGZvciBhIGZpbGUgaW50byBtb2RlIGJpdHMgKi8KLXZvaWQgYWNsX3RvX3VpZF9tb2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IF9fdTE2ICpwZmlkKQordm9pZCBhY2xfdG9fdWlkX21vZGUoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJICAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBfX3UxNiAqcGZpZCkKIHsKIAlzdHJ1Y3QgY2lmc19udHNkICpwbnRzZCA9IE5VTEw7CiAJdTMyIGFjbGxlbiA9IDA7CiAJaW50IHJjID0gMDsKIAogCWNGWUkoREJHMiwgKCJjb252ZXJ0aW5nIEFDTCB0byBtb2RlIGZvciAlcyIsIHBhdGgpKTsKLQlwbnRzZCA9IGdldF9jaWZzX2FjbCgmYWNsbGVuLCBpbm9kZSwgcGF0aCwgcGZpZCk7CisKKwlpZiAocGZpZCkKKwkJcG50c2QgPSBnZXRfY2lmc19hY2xfYnlfZmlkKGNpZnNfc2IsICpwZmlkLCAmYWNsbGVuKTsKKwllbHNlCisJCXBudHNkID0gZ2V0X2NpZnNfYWNsKGNpZnNfc2IsIGlub2RlLCBwYXRoLCAmYWNsbGVuKTsKIAogCS8qIGlmIHdlIGNhbiByZXRyaWV2ZSB0aGUgQUNMLCBub3cgcGFyc2UgQWNjZXNzIENvbnRyb2wgRW50cmllcywgQUNFcyAqLwogCWlmIChwbnRzZCkKQEAgLTY5OCw3ICs3MDYsNyBAQAogCWNGWUkoREJHMiwgKCJzZXQgQUNMIGZyb20gbW9kZSBmb3IgJXMiLCBwYXRoKSk7CiAKIAkvKiBHZXQgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IgKi8KLQlwbnRzZCA9IGdldF9jaWZzX2FjbCgmc2VjZGVzY2xlbiwgaW5vZGUsIHBhdGgsIE5VTEwpOworCXBudHNkID0gZ2V0X2NpZnNfYWNsKENJRlNfU0IoaW5vZGUtPmlfc2IpLCBpbm9kZSwgcGF0aCwgJnNlY2Rlc2NsZW4pOwogCiAJLyogQWRkIHRocmVlIEFDRXMgZm9yIG93bmVyLCBncm91cCwgZXZlcnlvbmUgZ2V0dGluZyByaWQgb2YKIAkgICBvdGhlciBBQ0VzIGFzIGNobW9kIGRpc2FibGVzIEFDRXMgYW5kIHNldCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggNWU2ZDM1OC4uMGExMGE1OSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKICNlbmRpZgogCXNiLT5zX2Jsb2Nrc2l6ZSA9IENJRlNfTUFYX01TR1NJWkU7CiAJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAxNDsJLyogZGVmYXVsdCAyKioxNCA9IENJRlNfTUFYX01TR1NJWkUgKi8KLQlpbm9kZSA9IGNpZnNfaWdldChzYiwgUk9PVF9JKTsKKwlpbm9kZSA9IGNpZnNfcm9vdF9pZ2V0KHNiLCBST09UX0kpOwogCiAJaWYgKElTX0VSUihpbm9kZSkpIHsKIAkJcmMgPSBQVFJfRVJSKGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmggYi9mcy9jaWZzL2NpZnNmcy5oCmluZGV4IDA1MWI3MWMuLjk1NzBhMGUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmgKKysrIGIvZnMvY2lmcy9jaWZzZnMuaApAQCAtMzYsNyArMzYsNyBAQAogCiAvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBpbm9kZXMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9pbm9kZV9vcHM7Ci1leHRlcm4gc3RydWN0IGlub2RlICpjaWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqY2lmc19yb290X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBjaWZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQsCiAJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICopOwogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmNpZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosCkBAIC0xMDAsNSArMTAwLDUgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgY2lmc19leHBvcnRfb3BzOwogI2VuZGlmIC8qIEVYUEVSSU1FTlRBTCAqLwogCi0jZGVmaW5lIENJRlNfVkVSU0lPTiAgICIxLjU4IgorI2RlZmluZSBDSUZTX1ZFUlNJT04gICAiMS41OSIKICNlbmRpZgkJCQkvKiBfQ0lGU0ZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCmluZGV4IGZhZTA4MzkuLmY5NDUyMzIgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc3Byb3RvLmgKKysrIGIvZnMvY2lmcy9jaWZzcHJvdG8uaApAQCAtOTAsMTAgKzkwLDEwIEBACiAJCQkJCQkgc3RydWN0IGNpZnNUY29uSW5mbyAqKTsKIGV4dGVybiB2b2lkIERlbGV0ZU9wbG9ja1FFbnRyeShzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKik7CiBleHRlcm4gdm9pZCBEZWxldGVUY29uT3Bsb2NrUUVudHJpZXMoc3RydWN0IGNpZnNUY29uSW5mbyAqKTsKLWV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgY2lmc19OVHRpbWVUb1VuaXgodTY0IHV0Y19uYW5vc2Vjb25kc19zaW5jZV8xNjAxKTsKK2V4dGVybiBzdHJ1Y3QgdGltZXNwZWMgY2lmc19OVHRpbWVUb1VuaXgoX19sZTY0IHV0Y19uYW5vc2Vjb25kc19zaW5jZV8xNjAxKTsKIGV4dGVybiB1NjQgY2lmc19Vbml4VGltZVRvTlQoc3RydWN0IHRpbWVzcGVjKTsKLWV4dGVybiBfX2xlNjQgY252cnREb3NDaWZzVG0oX191MTYgZGF0ZSwgX191MTYgdGltZSk7Ci1leHRlcm4gc3RydWN0IHRpbWVzcGVjIGNudnJ0RG9zVW5peFRtKF9fdTE2IGRhdGUsIF9fdTE2IHRpbWUpOworZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyBjbnZydERvc1VuaXhUbShfX2xlMTYgbGVfZGF0ZSwgX19sZTE2IGxlX3RpbWUsCisJCQkJICAgICAgaW50IG9mZnNldCk7CiAKIGV4dGVybiBpbnQgY2lmc19wb3NpeF9vcGVuKGNoYXIgKmZ1bGxfcGF0aCwgc3RydWN0IGlub2RlICoqcGlub2RlLAogCQkJICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUsIGludCBvZmxhZ3MsCkBAIC0xMDgsOCArMTA4LDggQEAKIGV4dGVybiBpbnQgY2lmc19nZXRfaW5vZGVfaW5mb191bml4KHN0cnVjdCBpbm9kZSAqKnBpbm9kZSwKIAkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaF9wYXRoLAogCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHhpZCk7Ci1leHRlcm4gdm9pZCBhY2xfdG9fdWlkX21vZGUoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqcGF0aCwKLQkJCSAgICBjb25zdCBfX3UxNiAqcGZpZCk7CitleHRlcm4gdm9pZCBhY2xfdG9fdWlkX21vZGUoc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBjb25zdCBjaGFyICpwYXRoLCBjb25zdCBfX3UxNiAqcGZpZCk7CiBleHRlcm4gaW50IG1vZGVfdG9fYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKnBhdGgsIF9fdTY0KTsKIAogZXh0ZXJuIGludCBjaWZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgY2lmc19zYl9pbmZvICosIGNoYXIgKiwKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3NtYi5jIGIvZnMvY2lmcy9jaWZzc21iLmMKaW5kZXggZDA2MjYwMi4uYjg0YzYxZCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzc21iLmMKKysrIGIvZnMvY2lmcy9jaWZzc21iLmMKQEAgLTUyNCw4ICs1MjQsOCBAQAogCQkJaW50IHZhbCwgc2Vjb25kcywgcmVtYWluLCByZXN1bHQ7CiAJCQlzdHJ1Y3QgdGltZXNwZWMgdHMsIHV0YzsKIAkJCXV0YyA9IENVUlJFTlRfVElNRTsKLQkJCXRzID0gY252cnREb3NVbml4VG0obGUxNl90b19jcHUocnNwLT5TcnZUaW1lLkRhdGUpLAotCQkJCQkJbGUxNl90b19jcHUocnNwLT5TcnZUaW1lLlRpbWUpKTsKKwkJCXRzID0gY252cnREb3NVbml4VG0ocnNwLT5TcnZUaW1lLkRhdGUsCisJCQkJCSAgICByc3AtPlNydlRpbWUuVGltZSwgMCk7CiAJCQljRllJKDEsICgiU3J2VGltZSAlZCBzZWMgc2luY2UgMTk3MCAodXRjOiAlZCkgZGlmZjogJWQiLAogCQkJCShpbnQpdHMudHZfc2VjLCAoaW50KXV0Yy50dl9zZWMsCiAJCQkJKGludCkodXRjLnR2X3NlYyAtIHRzLnR2X3NlYykpKTsKQEAgLTI0MjcsOCArMjQyNyw3IEBACiAJcGFyYW1zID0gMiAvKiBsZXZlbCAqLyAgKyA0IC8qIHJzcnZkICovICArIG5hbWVfbGVuIC8qIGluY2wgbnVsbCAqLyA7CiAJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOwogCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7Ci0JLyogQkIgZmluZCBleGFjdCBtYXggZGF0YSBjb3VudCBiZWxvdyBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCi0JcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUpOwogCXBTTUItPk1heFNldHVwQ291bnQgPSAwOwogCXBTTUItPlJlc2VydmVkID0gMDsKIAlwU01CLT5GbGFncyA9IDA7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IDRhYTgxYTUuLjk3ZjQzMTEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlICJjaWZzcGR1LmgiCiAjaW5jbHVkZSAiY2lmc2dsb2IuaCIKQEAgLTYxLDcgKzYyLDYgQEAKIAljaGFyICpkb21haW5uYW1lOwogCWNoYXIgKlVOQzsKIAljaGFyICpVTkNpcDsKLQljaGFyICppbjZfYWRkcjsgICAvKiBpcHY2IGFkZHJlc3MgYXMgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiBpbjZfYWRkciAqLwogCWNoYXIgKmlvY2hhcnNldDsgIC8qIGxvY2FsIGNvZGUgcGFnZSBmb3IgbWFwcGluZyB0byBhbmQgZnJvbSBVbmljb2RlICovCiAJY2hhciBzb3VyY2VfcmZjMTAwMV9uYW1lWzE2XTsgLyogbmV0YmlvcyBuYW1lIG9mIGNsaWVudCAqLwogCWNoYXIgdGFyZ2V0X3JmYzEwMDFfbmFtZVsxNl07IC8qIG5ldGJpb3MgbmFtZSBvZiBzZXJ2ZXIgZm9yIFdpbjl4L01FICovCkBAIC04MjcsMTQgKzgyNywxNiBAQAogCXZvbC0+dGFyZ2V0X3JmYzEwMDFfbmFtZVswXSA9IDA7CiAJdm9sLT5saW51eF91aWQgPSBjdXJyZW50X3VpZCgpOyAgLyogdXNlIGN1cnJlbnRfZXVpZCgpIGluc3RlYWQ/ICovCiAJdm9sLT5saW51eF9naWQgPSBjdXJyZW50X2dpZCgpOwotCXZvbC0+ZGlyX21vZGUgPSBTX0lSV1hVR087Ci0JLyogMjc2NyBwZXJtcyBpbmRpY2F0ZSBtYW5kYXRvcnkgbG9ja2luZyBzdXBwb3J0ICovCi0Jdm9sLT5maWxlX21vZGUgPSAoU19JUldYVUdPIHwgU19JU0dJRCkgJiAoflNfSVhHUlApOworCisJLyogZGVmYXVsdCB0byBvbmx5IGFsbG93aW5nIHdyaXRlIGFjY2VzcyB0byBvd25lciBvZiB0aGUgbW91bnQgKi8KKwl2b2wtPmRpcl9tb2RlID0gdm9sLT5maWxlX21vZGUgPSBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSVdVU1I7CiAKIAkvKiB2b2wtPnJldHJ5IGRlZmF1bHQgaXMgMCAoaS5lLiAic29mdCIgbGltaXRlZCByZXRyeSBub3QgaGFyZCByZXRyeSkgKi8KIAl2b2wtPnJ3ID0gdHJ1ZTsKIAkvKiBkZWZhdWx0IGlzIGFsd2F5cyB0byByZXF1ZXN0IHBvc2l4IHBhdGhzLiAqLwogCXZvbC0+cG9zaXhfcGF0aHMgPSAxOworCS8qIGRlZmF1bHQgdG8gdXNpbmcgc2VydmVyIGlub2RlIG51bWJlcnMgd2hlcmUgYXZhaWxhYmxlICovCisJdm9sLT5zZXJ2ZXJfaW5vID0gMTsKIAogCWlmICghb3B0aW9ucykKIAkJcmV0dXJuIDE7CkBAIC05NTUsMTAgKzk1NywxMiBAQAogCQkJCX0KIAkJCQlzdHJjcHkodm9sLT5wYXNzd29yZCwgdmFsdWUpOwogCQkJfQotCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJpcCIsIDIpID09IDApIHsKKwkJfSBlbHNlIGlmICghc3RybmljbXAoZGF0YSwgImlwIiwgMikgfHwKKwkJCSAgICFzdHJuaWNtcChkYXRhLCAiYWRkciIsIDQpKSB7CiAJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKIAkJCQl2b2wtPlVOQ2lwID0gTlVMTDsKLQkJCX0gZWxzZSBpZiAoc3Rybmxlbih2YWx1ZSwgMzUpIDwgMzUpIHsKKwkJCX0gZWxzZSBpZiAoc3Rybmxlbih2YWx1ZSwgSU5FVDZfQUREUlNUUkxFTikgPAorCQkJCQkJCUlORVQ2X0FERFJTVFJMRU4pIHsKIAkJCQl2b2wtPlVOQ2lwID0gdmFsdWU7CiAJCQl9IGVsc2UgewogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IGlwIGFkZHJlc3MgIgpAQCAtMTA5MiwxNyArMTA5NiwxNyBAQAogCQkJCXJldHVybiAxOwogCQkJfQogCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJ1aWQiLCAzKSA9PSAwKSB7Ci0JCQlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCQlpZiAodmFsdWUgJiYgKnZhbHVlKQogCQkJCXZvbC0+bGludXhfdWlkID0KIAkJCQkJc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImZvcmNldWlkIiwgOCkgPT0gMCkgewogCQkJCXZvbC0+b3ZlcnJpZGVfdWlkID0gMTsKLQkJCX0KIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZ2lkIiwgMykgPT0gMCkgewotCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkKIAkJCQl2b2wtPmxpbnV4X2dpZCA9CiAJCQkJCXNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJmb3JjZWdpZCIsIDgpID09IDApIHsKIAkJCQl2b2wtPm92ZXJyaWRlX2dpZCA9IDE7Ci0JCQl9CiAJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImZpbGVfbW9kZSIsIDQpID09IDApIHsKIAkJCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKIAkJCQl2b2wtPmZpbGVfbW9kZSA9CkBAIC0xMzE1LDE2ICsxMzE5LDYgQEAKIAkJCXZvbC0+ZGlyZWN0X2lvID0gMTsKIAkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZm9yY2VkaXJlY3RpbyIsIDEzKSA9PSAwKSB7CiAJCQl2b2wtPmRpcmVjdF9pbyA9IDE7Ci0JCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImluNl9hZGRyIiwgOCkgPT0gMCkgewotCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7Ci0JCQkJdm9sLT5pbjZfYWRkciA9IE5VTEw7Ci0JCQl9IGVsc2UgaWYgKHN0cm5sZW4odmFsdWUsIDQ5KSA9PSA0OCkgewotCQkJCXZvbC0+aW42X2FkZHIgPSB2YWx1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogaXAgdjYgYWRkcmVzcyBub3QgIgotCQkJCQkJICAgICI0OCBjaGFyYWN0ZXJzIGxvbmdcbiIpOwotCQkJCXJldHVybiAxOwotCQkJfQogCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub2FjIiwgNCkgPT0gMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogTW91bnQgb3B0aW9uIG5vYWMgbm90ICIKIAkJCQkic3VwcG9ydGVkLiBJbnN0ZWFkIHNldCAiCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IDMwMmVhMTUuLjA2ODY2ODQgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0yNDEsNyArMjQxLDcgQEAKIAkvKiBCQiBuZWVkIHNhbWUgY2hlY2sgaW4gY2lmc19jcmVhdGUgdG9vPyAqLwogCS8qIGlmIG5vdCBvcGxvY2tlZCwgaW52YWxpZGF0ZSBpbm9kZSBwYWdlcyBpZiBtdGltZSBvciBmaWxlCiAJICAgc2l6ZSBjaGFuZ2VkICovCi0JdGVtcCA9IGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KGJ1Zi0+TGFzdFdyaXRlVGltZSkpOworCXRlbXAgPSBjaWZzX05UdGltZVRvVW5peChidWYtPkxhc3RXcml0ZVRpbWUpOwogCWlmICh0aW1lc3BlY19lcXVhbCgmZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZSwgJnRlbXApICYmCiAJCQkgICAoZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplID09CiAJCQkgICAgKGxvZmZfdClsZTY0X3RvX2NwdShidWYtPkVuZE9mRmlsZSkpKSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2lub2RlLmMgYi9mcy9jaWZzL2lub2RlLmMKaW5kZXggOWM4NjlhNi4uZmFkODgyYiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9pbm9kZS5jCisrKyBiL2ZzL2NpZnMvaW5vZGUuYwpAQCAtODUsMTAgKzg1LDEwIEBACiAJX191NjQgbnVtX29mX2J5dGVzID0gbGU2NF90b19jcHUoaW5mby0+TnVtT2ZCeXRlcyk7CiAJX191NjQgZW5kX29mX2ZpbGUgPSBsZTY0X3RvX2NwdShpbmZvLT5FbmRPZkZpbGUpOwogCi0JaW5vZGUtPmlfYXRpbWUgPSBjaWZzX05UdGltZVRvVW5peChsZTY0X3RvX2NwdShpbmZvLT5MYXN0QWNjZXNzVGltZSkpOworCWlub2RlLT5pX2F0aW1lID0gY2lmc19OVHRpbWVUb1VuaXgoaW5mby0+TGFzdEFjY2Vzc1RpbWUpOwogCWlub2RlLT5pX210aW1lID0KLQkJY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUoaW5mby0+TGFzdE1vZGlmaWNhdGlvblRpbWUpKTsKLQlpbm9kZS0+aV9jdGltZSA9IGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KGluZm8tPkxhc3RTdGF0dXNDaGFuZ2UpKTsKKwkJY2lmc19OVHRpbWVUb1VuaXgoaW5mby0+TGFzdE1vZGlmaWNhdGlvblRpbWUpOworCWlub2RlLT5pX2N0aW1lID0gY2lmc19OVHRpbWVUb1VuaXgoaW5mby0+TGFzdFN0YXR1c0NoYW5nZSk7CiAJaW5vZGUtPmlfbW9kZSA9IGxlNjRfdG9fY3B1KGluZm8tPlBlcm1pc3Npb25zKTsKIAogCS8qCkBAIC01NTQsMTQgKzU1NCwxMSBAQAogCiAJLyogTGludXggY2FuIG5vdCBzdG9yZSBmaWxlIGNyZWF0aW9uIHRpbWUgc28gaWdub3JlIGl0ICovCiAJaWYgKHBmaW5kRGF0YS0+TGFzdEFjY2Vzc1RpbWUpCi0JCWlub2RlLT5pX2F0aW1lID0gY2lmc19OVHRpbWVUb1VuaXgKLQkJCShsZTY0X3RvX2NwdShwZmluZERhdGEtPkxhc3RBY2Nlc3NUaW1lKSk7CisJCWlub2RlLT5pX2F0aW1lID0gY2lmc19OVHRpbWVUb1VuaXgocGZpbmREYXRhLT5MYXN0QWNjZXNzVGltZSk7CiAJZWxzZSAvKiBkbyBub3QgbmVlZCB0byB1c2UgY3VycmVudF9mc190aW1lIC0gdGltZSBub3Qgc3RvcmVkICovCiAJCWlub2RlLT5pX2F0aW1lID0gQ1VSUkVOVF9USU1FOwotCWlub2RlLT5pX210aW1lID0KLQkJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlVGltZSkpOwotCWlub2RlLT5pX2N0aW1lID0KLQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5DaGFuZ2VUaW1lKSk7CisJaW5vZGUtPmlfbXRpbWUgPSBjaWZzX05UdGltZVRvVW5peChwZmluZERhdGEtPkxhc3RXcml0ZVRpbWUpOworCWlub2RlLT5pX2N0aW1lID0gY2lmc19OVHRpbWVUb1VuaXgocGZpbmREYXRhLT5DaGFuZ2VUaW1lKTsKIAljRllJKERCRzIsICgiQXR0cmlidXRlcyBjYW1lIGluIGFzIDB4JXgiLCBhdHRyKSk7CiAJaWYgKGFkanVzdFRaICYmIChwVGNvbi0+c2VzKSAmJiAocFRjb24tPnNlcy0+c2VydmVyKSkgewogCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgKz0gcFRjb24tPnNlcy0+c2VydmVyLT50aW1lQWRqOwpAQCAtNjI5LDcgKzYyNiw3IEBACiAJLyogZmlsbCBpbiAwNzc3IGJpdHMgZnJvbSBBQ0wgKi8KIAlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0NJRlNfQUNMKSB7CiAJCWNGWUkoMSwgKCJHZXR0aW5nIG1vZGUgYml0cyBmcm9tIEFDTCIpKTsKLQkJYWNsX3RvX3VpZF9tb2RlKGlub2RlLCBmdWxsX3BhdGgsIHBmaWQpOworCQlhY2xfdG9fdWlkX21vZGUoY2lmc19zYiwgaW5vZGUsIGZ1bGxfcGF0aCwgcGZpZCk7CiAJfQogI2VuZGlmCiAJaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9VTlhfRU1VTCkgewpAQCAtNjk5LDcgKzY5Niw3IEBACiB9CiAKIC8qIGdldHMgcm9vdCBpbm9kZSAqLwotc3RydWN0IGlub2RlICpjaWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCitzdHJ1Y3QgaW5vZGUgKmNpZnNfcm9vdF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQogewogCWludCB4aWQ7CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbmV0bWlzYy5jIGIvZnMvY2lmcy9uZXRtaXNjLmMKaW5kZXggZTJmZTk5OC4uMzJkNmJhYSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9uZXRtaXNjLmMKKysrIGIvZnMvY2lmcy9uZXRtaXNjLmMKQEAgLTg1MywxMiArODUzLDEyIEBACiAKICNkZWZpbmUgTlRGU19USU1FX09GRlNFVCAoKHU2NCkoMzY5KjM2NSArIDg5KSAqIDI0ICogMzYwMCAqIDEwMDAwMDAwKQogCi0gICAgLyoKLSAgICAgKiBDb252ZXJ0IHRoZSBOVCBVVEMgKGJhc2VkIDE2MDEtMDEtMDEsIGluIGh1bmRyZWQgbmFub3NlY29uZCB1bml0cykKLSAgICAgKiBpbnRvIFVuaXggVVRDIChiYXNlZCAxOTcwLTAxLTAxLCBpbiBzZWNvbmRzKS4KLSAgICAgKi8KKy8qCisgKiBDb252ZXJ0IHRoZSBOVCBVVEMgKGJhc2VkIDE2MDEtMDEtMDEsIGluIGh1bmRyZWQgbmFub3NlY29uZCB1bml0cykKKyAqIGludG8gVW5peCBVVEMgKGJhc2VkIDE5NzAtMDEtMDEsIGluIHNlY29uZHMpLgorICovCiBzdHJ1Y3QgdGltZXNwZWMKLWNpZnNfTlR0aW1lVG9Vbml4KHU2NCBudHV0YykKK2NpZnNfTlR0aW1lVG9Vbml4KF9fbGU2NCBudHV0YykKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAJLyogQkIgd2hhdCBhYm91dCB0aGUgdGltZXpvbmU/IEJCICovCkBAIC04NjYsNyArODY2LDcgQEAKIAkvKiBTdWJ0cmFjdCB0aGUgTlRGUyB0aW1lIG9mZnNldCwgdGhlbiBjb252ZXJ0IHRvIDFzIGludGVydmFscy4gKi8KIAl1NjQgdDsKIAotCXQgPSBudHV0YyAtIE5URlNfVElNRV9PRkZTRVQ7CisJdCA9IGxlNjRfdG9fY3B1KG50dXRjKSAtIE5URlNfVElNRV9PRkZTRVQ7CiAJdHMudHZfbnNlYyA9IGRvX2Rpdih0LCAxMDAwMDAwMCkgKiAxMDA7CiAJdHMudHZfc2VjID0gdDsKIAlyZXR1cm4gdHM7CkBAIC04ODMsMTYgKzg4MywxMiBAQAogc3RhdGljIGludCB0b3RhbF9kYXlzX29mX3ByZXZfbW9udGhzW10gPQogezAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0fTsKIAotCi1fX2xlNjQgY252cnREb3NDaWZzVG0oX191MTYgZGF0ZSwgX191MTYgdGltZSkKLXsKLQlyZXR1cm4gY3B1X3RvX2xlNjQoY2lmc19Vbml4VGltZVRvTlQoY252cnREb3NVbml4VG0oZGF0ZSwgdGltZSkpKTsKLX0KLQotc3RydWN0IHRpbWVzcGVjIGNudnJ0RG9zVW5peFRtKF9fdTE2IGRhdGUsIF9fdTE2IHRpbWUpCitzdHJ1Y3QgdGltZXNwZWMgY252cnREb3NVbml4VG0oX19sZTE2IGxlX2RhdGUsIF9fbGUxNiBsZV90aW1lLCBpbnQgb2Zmc2V0KQogewogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAlpbnQgc2VjLCBtaW4sIGRheXMsIG1vbnRoLCB5ZWFyOworCXUxNiBkYXRlID0gbGUxNl90b19jcHUobGVfZGF0ZSk7CisJdTE2IHRpbWUgPSBsZTE2X3RvX2NwdShsZV90aW1lKTsKIAlTTUJfVElNRSAqc3QgPSAoU01CX1RJTUUgKikmdGltZTsKIAlTTUJfREFURSAqc2QgPSAoU01CX0RBVEUgKikmZGF0ZTsKIApAQCAtOTMzLDcgKzkyOSw3IEBACiAJCWRheXMgLT0gKCh5ZWFyICYgMHgwMykgPT0gMCkgJiYgKG1vbnRoIDwgMiA/IDEgOiAwKTsKIAlzZWMgKz0gMjQgKiA2MCAqIDYwICogZGF5czsKIAotCXRzLnR2X3NlYyA9IHNlYzsKKwl0cy50dl9zZWMgPSBzZWMgKyBvZmZzZXQ7CiAKIAkvKiBjRllJKDEsKCJzZWMgYWZ0ZXIgY252cnQgZG9zIHRvIHVuaXggdGltZSAlZCIsc2VjKSk7ICovCiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvcmVhZGRpci5jIGIvZnMvY2lmcy9yZWFkZGlyLmMKaW5kZXggOTY0ZTA5Ny4uODZkMDA1NSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9yZWFkZGlyLmMKKysrIGIvZnMvY2lmcy9yZWFkZGlyLmMKQEAgLTExNSwxNyArMTE1LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIEFkanVzdEZvclRaKHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JaWYgKCh0Y29uKSAmJiAodGNvbi0+c2VzKSAmJiAodGNvbi0+c2VzLT5zZXJ2ZXIpKSB7Ci0JCWlub2RlLT5pX2N0aW1lLnR2X3NlYyArPSB0Y29uLT5zZXMtPnNlcnZlci0+dGltZUFkajsKLQkJaW5vZGUtPmlfbXRpbWUudHZfc2VjICs9IHRjb24tPnNlcy0+c2VydmVyLT50aW1lQWRqOwotCQlpbm9kZS0+aV9hdGltZS50dl9zZWMgKz0gdGNvbi0+c2VzLT5zZXJ2ZXItPnRpbWVBZGo7Ci0JfQotCXJldHVybjsKLX0KLQotCiBzdGF0aWMgdm9pZCBmaWxsX2luX2lub2RlKHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlLCBpbnQgbmV3X2J1Zl90eXBlLAogCQkJICBjaGFyICpidWYsIHVuc2lnbmVkIGludCAqcG9iamVjdF90eXBlLCBpbnQgaXNOZXdJbm9kZSkKIHsKQEAgLTE1MCwyNiArMTM5LDI1IEBACiAJCWFsbG9jYXRpb25fc2l6ZSA9IGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+QWxsb2NhdGlvblNpemUpOwogCQllbmRfb2ZfZmlsZSA9IGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+RW5kT2ZGaWxlKTsKIAkJdG1wX2lub2RlLT5pX2F0aW1lID0KLQkJICAgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0QWNjZXNzVGltZSkpOworCQkJY2lmc19OVHRpbWVUb1VuaXgocGZpbmREYXRhLT5MYXN0QWNjZXNzVGltZSk7CiAJCXRtcF9pbm9kZS0+aV9tdGltZSA9Ci0JCSAgICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlVGltZSkpOworCQkJY2lmc19OVHRpbWVUb1VuaXgocGZpbmREYXRhLT5MYXN0V3JpdGVUaW1lKTsKIAkJdG1wX2lub2RlLT5pX2N0aW1lID0KLQkJICAgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5DaGFuZ2VUaW1lKSk7CisJCQljaWZzX05UdGltZVRvVW5peChwZmluZERhdGEtPkNoYW5nZVRpbWUpOwogCX0gZWxzZSB7IC8qIGxlZ2FjeSwgT1MyIGFuZCBET1Mgc3R5bGUgKi8KLS8qCQlzdHJ1Y3QgdGltZXNwZWMgdHM7Ki8KKwkJaW50IG9mZnNldCA9IGNpZnNfc2ItPnRjb24tPnNlcy0+c2VydmVyLT50aW1lQWRqOwogCQlGSU5EX0ZJTEVfU1RBTkRBUkRfSU5GTyAqcGZpbmREYXRhID0KIAkJCShGSU5EX0ZJTEVfU1RBTkRBUkRfSU5GTyAqKWJ1ZjsKIAotCQl0bXBfaW5vZGUtPmlfbXRpbWUgPSBjbnZydERvc1VuaXhUbSgKLQkJCQlsZTE2X3RvX2NwdShwZmluZERhdGEtPkxhc3RXcml0ZURhdGUpLAotCQkJCWxlMTZfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlVGltZSkpOwotCQl0bXBfaW5vZGUtPmlfYXRpbWUgPSBjbnZydERvc1VuaXhUbSgKLQkJCQlsZTE2X3RvX2NwdShwZmluZERhdGEtPkxhc3RBY2Nlc3NEYXRlKSwKLQkJCQlsZTE2X3RvX2NwdShwZmluZERhdGEtPkxhc3RBY2Nlc3NUaW1lKSk7Ci0JCXRtcF9pbm9kZS0+aV9jdGltZSA9IGNudnJ0RG9zVW5peFRtKAotCQkJCWxlMTZfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlRGF0ZSksCi0JCQkJbGUxNl90b19jcHUocGZpbmREYXRhLT5MYXN0V3JpdGVUaW1lKSk7Ci0JCUFkanVzdEZvclRaKGNpZnNfc2ItPnRjb24sIHRtcF9pbm9kZSk7CisJCXRtcF9pbm9kZS0+aV9tdGltZSA9IGNudnJ0RG9zVW5peFRtKHBmaW5kRGF0YS0+TGFzdFdyaXRlRGF0ZSwKKwkJCQkJCSAgICBwZmluZERhdGEtPkxhc3RXcml0ZVRpbWUsCisJCQkJCQkgICAgb2Zmc2V0KTsKKwkJdG1wX2lub2RlLT5pX2F0aW1lID0gY252cnREb3NVbml4VG0ocGZpbmREYXRhLT5MYXN0QWNjZXNzRGF0ZSwKKwkJCQkJCSAgICBwZmluZERhdGEtPkxhc3RBY2Nlc3NUaW1lLAorCQkJCQkJICAgIG9mZnNldCk7CisJCXRtcF9pbm9kZS0+aV9jdGltZSA9IGNudnJ0RG9zVW5peFRtKHBmaW5kRGF0YS0+TGFzdFdyaXRlRGF0ZSwKKwkJCQkJCSAgICBwZmluZERhdGEtPkxhc3RXcml0ZVRpbWUsCisJCQkJCQkgICAgb2Zmc2V0KTsKIAkJYXR0ciA9IGxlMTZfdG9fY3B1KHBmaW5kRGF0YS0+QXR0cmlidXRlcyk7CiAJCWFsbG9jYXRpb25fc2l6ZSA9IGxlMzJfdG9fY3B1KHBmaW5kRGF0YS0+QWxsb2NhdGlvblNpemUpOwogCQllbmRfb2ZfZmlsZSA9IGxlMzJfdG9fY3B1KHBmaW5kRGF0YS0+RGF0YVNpemUpOwpAQCAtMzMxLDExICszMTksMTEgQEAKIAlsb2NhbF9zaXplICA9IHRtcF9pbm9kZS0+aV9zaXplOwogCiAJdG1wX2lub2RlLT5pX2F0aW1lID0KLQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0QWNjZXNzVGltZSkpOworCSAgICBjaWZzX05UdGltZVRvVW5peChwZmluZERhdGEtPkxhc3RBY2Nlc3NUaW1lKTsKIAl0bXBfaW5vZGUtPmlfbXRpbWUgPQotCSAgICBjaWZzX05UdGltZVRvVW5peChsZTY0X3RvX2NwdShwZmluZERhdGEtPkxhc3RNb2RpZmljYXRpb25UaW1lKSk7CisJICAgIGNpZnNfTlR0aW1lVG9Vbml4KHBmaW5kRGF0YS0+TGFzdE1vZGlmaWNhdGlvblRpbWUpOwogCXRtcF9pbm9kZS0+aV9jdGltZSA9Ci0JICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFN0YXR1c0NoYW5nZSkpOworCSAgICBjaWZzX05UdGltZVRvVW5peChwZmluZERhdGEtPkxhc3RTdGF0dXNDaGFuZ2UpOwogCiAJdG1wX2lub2RlLT5pX21vZGUgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPlBlcm1pc3Npb25zKTsKIAkvKiBzaW5jZSB3ZSBzZXQgdGhlIGlub2RlIHR5cGUgYmVsb3cgd2UgbmVlZCB0byBtYXNrIG9mZiB0eXBlCmRpZmYgLS1naXQgYS9mcy9jb2RhL2ZpbGUuYyBiL2ZzL2NvZGEvZmlsZS5jCmluZGV4IDZhMzQ3ZmIuLmZmZDQyODEgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvZmlsZS5jCisrKyBiL2ZzL2NvZGEvZmlsZS5jCkBAIC00Nyw2ICs0Nyw4IEBACiAJCSAgICAgIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHNpemVfdCBjb3VudCwKIAkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQogeworCXNzaXplX3QgKCpzcGxpY2VfcmVhZCkoc3RydWN0IGZpbGUgKiwgbG9mZl90ICosCisJCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CiAJc3RydWN0IGNvZGFfZmlsZV9pbmZvICpjZmk7CiAJc3RydWN0IGZpbGUgKmhvc3RfZmlsZTsKIApAQCAtNTQsMTAgKzU2LDExIEBACiAJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CiAJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOwogCi0JaWYgKCFob3N0X2ZpbGUtPmZfb3AgfHwgIWhvc3RfZmlsZS0+Zl9vcC0+c3BsaWNlX3JlYWQpCi0JCXJldHVybiAtRUlOVkFMOworCXNwbGljZV9yZWFkID0gaG9zdF9maWxlLT5mX29wLT5zcGxpY2VfcmVhZDsKKwlpZiAoIXNwbGljZV9yZWFkKQorCQlzcGxpY2VfcmVhZCA9IGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZDsKIAotCXJldHVybiBob3N0X2ZpbGUtPmZfb3AtPnNwbGljZV9yZWFkKGhvc3RfZmlsZSwgcHBvcywgcGlwZSwgY291bnQsZmxhZ3MpOworCXJldHVybiBzcGxpY2VfcmVhZChob3N0X2ZpbGUsIHBwb3MsIHBpcGUsIGNvdW50LCBmbGFncyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IDY4MWVkODEuLmJiMmE5YjIgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0xNDg4LDcgKzE0ODgsNyBAQAogCWlmICghYnBybSkKIAkJZ290byBvdXRfZmlsZXM7CiAKLQlyZXR2YWwgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmN1cnJlbnQtPmNyZWRfZXhlY19tdXRleCk7CisJcmV0dmFsID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjdXJyZW50LT5jcmVkX2d1YXJkX211dGV4KTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKIAljdXJyZW50LT5pbl9leGVjdmUgPSAxOwpAQCAtMTU1MCw3ICsxNTUwLDcgQEAKIAkvKiBleGVjdmUgc3VjY2VlZGVkICovCiAJY3VycmVudC0+ZnMtPmluX2V4ZWMgPSAwOwogCWN1cnJlbnQtPmluX2V4ZWN2ZSA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZjdXJyZW50LT5jcmVkX2V4ZWNfbXV0ZXgpOworCW11dGV4X3VubG9jaygmY3VycmVudC0+Y3JlZF9ndWFyZF9tdXRleCk7CiAJYWNjdF91cGRhdGVfaW50ZWdyYWxzKGN1cnJlbnQpOwogCWZyZWVfYnBybShicHJtKTsKIAlpZiAoZGlzcGxhY2VkKQpAQCAtMTU3Myw3ICsxNTczLDcgQEAKIAogb3V0X3VubG9jazoKIAljdXJyZW50LT5pbl9leGVjdmUgPSAwOwotCW11dGV4X3VubG9jaygmY3VycmVudC0+Y3JlZF9leGVjX211dGV4KTsKKwltdXRleF91bmxvY2soJmN1cnJlbnQtPmNyZWRfZ3VhcmRfbXV0ZXgpOwogCiBvdXRfZnJlZToKIAlmcmVlX2Jwcm0oYnBybSk7CmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvaW5vZGUuYyBiL2ZzL2RldnB0cy9pbm9kZS5jCmluZGV4IGM2OGVkYjkuLjliMWQyODUgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9pbm9kZS5jCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC01NTcsOCArNTU3LDEwIEBACiAJaW50IGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmRldnB0c19mc190eXBlKTsKIAlpZiAoIWVycikgewogCQlkZXZwdHNfbW50ID0ga2Vybl9tb3VudCgmZGV2cHRzX2ZzX3R5cGUpOwotCQlpZiAoSVNfRVJSKGRldnB0c19tbnQpKQorCQlpZiAoSVNfRVJSKGRldnB0c19tbnQpKSB7CiAJCQllcnIgPSBQVFJfRVJSKGRldnB0c19tbnQpOworCQkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZkZXZwdHNfZnNfdHlwZSk7CisJCX0KIAl9CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2RpcmVjdC1pby5jIGIvZnMvZGlyZWN0LWlvLmMKaW5kZXggMDU3NjNiYi4uOGIxMGI4NyAxMDA2NDQKLS0tIGEvZnMvZGlyZWN0LWlvLmMKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTExMjcsNyArMTEyNyw3IEBACiAJCXJ3ID0gV1JJVEVfT0RJUkVDVDsKIAogCWlmIChiZGV2KQotCQliZGV2X2Jsa2JpdHMgPSBibGtzaXplX2JpdHMoYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpKTsKKwkJYmRldl9ibGtiaXRzID0gYmxrc2l6ZV9iaXRzKGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpKTsKIAogCWlmIChvZmZzZXQgJiBibG9ja3NpemVfbWFzaykgewogCQlpZiAoYmRldikKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCA4OTU4MjNkLi5lNjM5OTU3IDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KQEAgLTkyMiw2ICs5MjMsNyBAQAogCXRhc2tfbG9jayh0c2spOwogCXN0cmxjcHkodHNrLT5jb21tLCBidWYsIHNpemVvZih0c2stPmNvbW0pKTsKIAl0YXNrX3VubG9jayh0c2spOworCXBlcmZfY291bnRlcl9jb21tKHRzayk7CiB9CiAKIGludCBmbHVzaF9vbGRfZXhlYyhzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSkKQEAgLTk5MCw2ICs5OTIsMTMgQEAKIAogCWN1cnJlbnQtPnBlcnNvbmFsaXR5ICY9IH5icHJtLT5wZXJfY2xlYXI7CiAKKwkvKgorCSAqIEZsdXNoIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHdoZW4gY3Jvc3NpbmcgYQorCSAqIHNlY3VyaXR5IGRvbWFpbjoKKwkgKi8KKwlpZiAoIWdldF9kdW1wYWJsZShjdXJyZW50LT5tbSkpCisJCXBlcmZfY291bnRlcl9leGl0X3Rhc2soY3VycmVudCk7CisKIAkvKiBBbiBleGVjIGNoYW5nZXMgb3VyIGRvbWFpbi4gV2UgYXJlIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSB0aHJlYWQKIAkgICBncm91cCAqLwogCkBAIC0xMDE2LDcgKzEwMjUsNyBAQAogCWNvbW1pdF9jcmVkcyhicHJtLT5jcmVkKTsKIAlicHJtLT5jcmVkID0gTlVMTDsKIAotCS8qIGNyZWRfZXhlY19tdXRleCBtdXN0IGJlIGhlbGQgYXQgbGVhc3QgdG8gdGhpcyBwb2ludCB0byBwcmV2ZW50CisJLyogY3JlZF9ndWFyZF9tdXRleCBtdXN0IGJlIGhlbGQgYXQgbGVhc3QgdG8gdGhpcyBwb2ludCB0byBwcmV2ZW50CiAJICogcHRyYWNlX2F0dGFjaCgpIGZyb20gYWx0ZXJpbmcgb3VyIGRldGVybWluYXRpb24gb2YgdGhlIHRhc2sncwogCSAqIGNyZWRlbnRpYWxzOyBhbnkgdGltZSBhZnRlciB0aGlzIGl0IG1heSBiZSB1bmxvY2tlZCAqLwogCkBAIC0xMDI2LDcgKzEwMzUsNyBAQAogCiAvKgogICogZGV0ZXJtaW5lIGhvdyBzYWZlIGl0IGlzIHRvIGV4ZWN1dGUgdGhlIHByb3Bvc2VkIHByb2dyYW0KLSAqIC0gdGhlIGNhbGxlciBtdXN0IGhvbGQgY3VycmVudC0+Y3JlZF9leGVjX211dGV4IHRvIHByb3RlY3QgYWdhaW5zdAorICogLSB0aGUgY2FsbGVyIG11c3QgaG9sZCBjdXJyZW50LT5jcmVkX2d1YXJkX211dGV4IHRvIHByb3RlY3QgYWdhaW5zdAogICogICBQVFJBQ0VfQVRUQUNICiAgKi8KIGludCBjaGVja191bnNhZmVfZXhlYyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQpAQCAtMTI2OCw3ICsxMjc3LDcgQEAKIAlpZiAoIWJwcm0pCiAJCWdvdG8gb3V0X2ZpbGVzOwogCi0JcmV0dmFsID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjdXJyZW50LT5jcmVkX2V4ZWNfbXV0ZXgpOworCXJldHZhbCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmY3VycmVudC0+Y3JlZF9ndWFyZF9tdXRleCk7CiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gb3V0X2ZyZWU7CiAJY3VycmVudC0+aW5fZXhlY3ZlID0gMTsKQEAgLTEzMzEsNyArMTM0MCw3IEBACiAJLyogZXhlY3ZlIHN1Y2NlZWRlZCAqLwogCWN1cnJlbnQtPmZzLT5pbl9leGVjID0gMDsKIAljdXJyZW50LT5pbl9leGVjdmUgPSAwOwotCW11dGV4X3VubG9jaygmY3VycmVudC0+Y3JlZF9leGVjX211dGV4KTsKKwltdXRleF91bmxvY2soJmN1cnJlbnQtPmNyZWRfZ3VhcmRfbXV0ZXgpOwogCWFjY3RfdXBkYXRlX2ludGVncmFscyhjdXJyZW50KTsKIAlmcmVlX2Jwcm0oYnBybSk7CiAJaWYgKGRpc3BsYWNlZCkKQEAgLTEzNTQsNyArMTM2Myw3IEBACiAKIG91dF91bmxvY2s6CiAJY3VycmVudC0+aW5fZXhlY3ZlID0gMDsKLQltdXRleF91bmxvY2soJmN1cnJlbnQtPmNyZWRfZXhlY19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZjdXJyZW50LT5jcmVkX2d1YXJkX211dGV4KTsKIAogb3V0X2ZyZWU6CiAJZnJlZV9icHJtKGJwcm0pOwpkaWZmIC0tZ2l0IGEvZnMvZXhvZnMvb3NkLmMgYi9mcy9leG9mcy9vc2QuYwppbmRleCBiMjQ5YWU5Li4wNmNhOTI2IDEwMDY0NAotLS0gYS9mcy9leG9mcy9vc2QuYworKysgYi9mcy9leG9mcy9vc2QuYwpAQCAtNTAsMTAgKzUwLDEwIEBACiAKIAkvKiBGSVhNRTogc2hvdWxkIGJlIGluY2x1ZGUgaW4gb3NkX3NlbnNlX2luZm8gKi8KIAlpZiAoaW5fcmVzaWQpCi0JCSppbl9yZXNpZCA9IG9yLT5pbi5yZXEgPyBvci0+aW4ucmVxLT5kYXRhX2xlbiA6IDA7CisJCSppbl9yZXNpZCA9IG9yLT5pbi5yZXEgPyBvci0+aW4ucmVxLT5yZXNpZF9sZW4gOiAwOwogCiAJaWYgKG91dF9yZXNpZCkKLQkJKm91dF9yZXNpZCA9IG9yLT5vdXQucmVxID8gb3ItPm91dC5yZXEtPmRhdGFfbGVuIDogMDsKKwkJKm91dF9yZXNpZCA9IG9yLT5vdXQucmVxID8gb3ItPm91dC5yZXEtPnJlc2lkX2xlbiA6IDA7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9zdXBlci5jIGIvZnMvZXh0Mi9zdXBlci5jCmluZGV4IDVjNGFmZTYuLmUzYzc0OGYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvc3VwZXIuYworKysgYi9mcy9leHQyL3N1cGVyLmMKQEAgLTEwOTMsNiArMTA5Myw3IEBACiAJYnJlbHNlKGJoKTsKIGZhaWxlZF9zYmk6CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jayk7CiAJa2ZyZWUoc2JpKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDU5OWRiZmUuLjNjNzBkNTIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTE2OTYsNyArMTY5Niw3IEBACiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAotCWhibG9jayA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KTsKKwloYmxvY2sgPSBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShzYi0+c19iZGV2KTsKIAlpZiAoc2ItPnNfYmxvY2tzaXplICE9IGJsb2Nrc2l6ZSkgewogCQkvKgogCQkgKiBNYWtlIHN1cmUgdGhlIGJsb2Nrc2l6ZSBmb3IgdGhlIGZpbGVzeXN0ZW0gaXMgbGFyZ2VyCkBAIC0yMDIxLDYgKzIwMjEsNyBAQAogCWJyZWxzZShiaCk7CiBvdXRfZmFpbDoKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAlrZnJlZShzYmkpOwogCWxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIHJldDsKQEAgLTIxMTksNyArMjEyMCw3IEBACiAJfQogCiAJYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWhibG9jayA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KTsKKwloYmxvY2sgPSBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KTsKIAlpZiAoYmxvY2tzaXplIDwgaGJsb2NrKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkJIkVYVDMtZnM6IGJsb2Nrc2l6ZSB0b28gc21hbGwgZm9yIGpvdXJuYWwgZGV2aWNlLlxuIik7CmRpZmYgLS1naXQgYS9mcy9leHQ0L01ha2VmaWxlIGIvZnMvZXh0NC9NYWtlZmlsZQppbmRleCBhOGZmMDAzLi44YTM0NzEwIDEwMDY0NAotLS0gYS9mcy9leHQ0L01ha2VmaWxlCisrKyBiL2ZzL2V4dDQvTWFrZWZpbGUKQEAgLTUsOCArNSw4IEBACiBvYmotJChDT05GSUdfRVhUNF9GUykgKz0gZXh0NC5vCiAKIGV4dDQteQk6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIFwKLQkJICAgaW9jdGwubyBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vIGhhc2gubyByZXNpemUubyBleHRlbnRzLm8gXAotCQkgICBleHQ0X2piZDIubyBtaWdyYXRlLm8gbWJhbGxvYy5vCisJCWlvY3RsLm8gbmFtZWkubyBzdXBlci5vIHN5bWxpbmsubyBoYXNoLm8gcmVzaXplLm8gZXh0ZW50cy5vIFwKKwkJZXh0NF9qYmQyLm8gbWlncmF0ZS5vIG1iYWxsb2MubyBibG9ja192YWxpZGl0eS5vCiAKIGV4dDQtJChDT05GSUdfRVhUNF9GU19YQVRUUikJCSs9IHhhdHRyLm8geGF0dHJfdXNlci5vIHhhdHRyX3RydXN0ZWQubwogZXh0NC0kKENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCkJKz0gYWNsLm8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYmFsbG9jLmMgYi9mcy9leHQ0L2JhbGxvYy5jCmluZGV4IDUzYzcyYWQuLmUyMTI2ZDcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9iYWxsb2MuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSAiZXh0NC5oIgogI2luY2x1ZGUgImV4dDRfamJkMi5oIgotI2luY2x1ZGUgImdyb3VwLmgiCiAjaW5jbHVkZSAibWJhbGxvYy5oIgogCiAvKgpAQCAtODgsNiArODcsNyBAQAogCQkgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwLCBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHApCiB7CiAJaW50IGJpdCwgYml0X21heDsKKwlleHQ0X2dyb3VwX3Qgbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJdW5zaWduZWQgZnJlZV9ibG9ja3MsIGdyb3VwX2Jsb2NrczsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIApAQCAtMTIzLDcgKzEyMyw3IEBACiAJCWJpdF9tYXggKz0gZXh0NF9iZ19udW1fZ2RiKHNiLCBibG9ja19ncm91cCk7CiAJfQogCi0JaWYgKGJsb2NrX2dyb3VwID09IHNiaS0+c19ncm91cHNfY291bnQgLSAxKSB7CisJaWYgKGJsb2NrX2dyb3VwID09IG5ncm91cHMgLSAxKSB7CiAJCS8qCiAJCSAqIEV2ZW4gdGhvdWdoIG1rZTJmcyBhbHdheXMgaW5pdGlhbGl6ZSBmaXJzdCBhbmQgbGFzdCBncm91cAogCQkgKiBpZiBzb21lIG90aGVyIHRvb2wgZW5hYmxlZCB0aGUgRVhUNF9CR19CTE9DS19VTklOSVQgd2UgbmVlZApAQCAtMTMxLDcgKzEzMSw3IEBACiAJCSAqLwogCQlncm91cF9ibG9ja3MgPSBleHQ0X2Jsb2Nrc19jb3VudChzYmktPnNfZXMpIC0KIAkJCWxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSAtCi0JCQkoRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAqIChzYmktPnNfZ3JvdXBzX2NvdW50IC0gMSkpOworCQkJKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikgKiAobmdyb3VwcyAtIDEpKTsKIAl9IGVsc2UgewogCQlncm91cF9ibG9ja3MgPSBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOwogCX0KQEAgLTIwNSwxOCArMjA1LDE4IEBACiB7CiAJdW5zaWduZWQgaW50IGdyb3VwX2Rlc2M7CiAJdW5zaWduZWQgaW50IG9mZnNldDsKKwlleHQ0X2dyb3VwX3Qgbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAotCWlmIChibG9ja19ncm91cCA+PSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CisJaWYgKGJsb2NrX2dyb3VwID49IG5ncm91cHMpIHsKIAkJZXh0NF9lcnJvcihzYiwgImV4dDRfZ2V0X2dyb3VwX2Rlc2MiLAogCQkJICAgImJsb2NrX2dyb3VwID49IGdyb3Vwc19jb3VudCAtICIKIAkJCSAgICJibG9ja19ncm91cCA9ICV1LCBncm91cHNfY291bnQgPSAldSIsCi0JCQkgICBibG9ja19ncm91cCwgc2JpLT5zX2dyb3Vwc19jb3VudCk7CisJCQkgICBibG9ja19ncm91cCwgbmdyb3Vwcyk7CiAKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXNtcF9ybWIoKTsKIAogCWdyb3VwX2Rlc2MgPSBibG9ja19ncm91cCA+PiBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOwogCW9mZnNldCA9IGJsb2NrX2dyb3VwICYgKEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CkBAIC0zMjYsMTYgKzMyNiwxNiBAQAogCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJcmV0dXJuIGJoOwogCX0KLQlzcGluX2xvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGJsb2NrX2dyb3VwKSk7CisJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJaWYgKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKSB7CiAJCWV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc2IsIGJoLCBibG9ja19ncm91cCwgZGVzYyk7CiAJCXNldF9iaXRtYXBfdXB0b2RhdGUoYmgpOwogCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKLQkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGJsb2NrX2dyb3VwKSk7CisJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJCXVubG9ja19idWZmZXIoYmgpOwogCQlyZXR1cm4gYmg7CiAJfQotCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOworCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKIAkJLyoKIAkJICogaWYgbm90IHVuaW5pdCBpZiBiaCBpcyB1cHRvZGF0ZSwKQEAgLTQ1MSw3ICs0NTEsNyBAQAogCWRvd25fd3JpdGUoJmdycC0+YWxsb2Nfc2VtKTsKIAlmb3IgKGkgPSAwLCBibG9ja3NfZnJlZWQgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiY2xlYXIgYml0Iik7Ci0JCWlmICghZXh0NF9jbGVhcl9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLAorCQlpZiAoIWV4dDRfY2xlYXJfYml0X2F0b21pYyhleHQ0X2dyb3VwX2xvY2tfcHRyKHNiLCBibG9ja19ncm91cCksCiAJCQkJCQliaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKIAkJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAogCQkJCSAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBibG9jayAlbGx1IiwKQEAgLTQ2MSwxMSArNDYxLDExIEBACiAJCQlibG9ja3NfZnJlZWQrKzsKIAkJfQogCX0KLQlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOworCWV4dDRfbG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCWJsa19mcmVlX2NvdW50ID0gYmxvY2tzX2ZyZWVkICsgZXh0NF9mcmVlX2Jsa3NfY291bnQoc2IsIGRlc2MpOwogCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZGVzYywgYmxrX2ZyZWVfY291bnQpOwogCWRlc2MtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBibG9ja19ncm91cCwgZGVzYyk7Ci0Jc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOworCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJcGVyY3B1X2NvdW50ZXJfYWRkKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBibG9ja3NfZnJlZWQpOwogCiAJaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CkBAIC02NjUsNyArNjY1LDcgQEAKIAlleHQ0X2ZzYmxrX3QgZGVzY19jb3VudDsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7CiAJZXh0NF9ncm91cF90IGk7Ci0JZXh0NF9ncm91cF90IG5ncm91cHMgPSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJZXh0NF9ncm91cF90IG5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogI2lmZGVmIEVYVDRGU19ERUJVRwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKIAlleHQ0X2ZzYmxrX3QgYml0bWFwX2NvdW50OwpAQCAtNjc3LDcgKzY3Nyw2IEBACiAJYml0bWFwX2NvdW50ID0gMDsKIAlnZHAgPSBOVUxMOwogCi0Jc21wX3JtYigpOwogCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQpAQCAtNzAwLDcgKzY5OSw2IEBACiAJcmV0dXJuIGJpdG1hcF9jb3VudDsKICNlbHNlCiAJZGVzY19jb3VudCA9IDA7Ci0Jc21wX3JtYigpOwogCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9ibG9ja192YWxpZGl0eS5jIGIvZnMvZXh0NC9ibG9ja192YWxpZGl0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzg0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0NC9ibG9ja192YWxpZGl0eS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5CisgKiBUaGVvZG9yZSBUcydvICh0eXRzb0BtaXQuZWR1KQorICoKKyAqIFRyYWNrIHdoaWNoIGJsb2NrcyBpbiB0aGUgZmlsZXN5c3RlbSBhcmUgbWV0YWRhdGEgYmxvY2tzIHRoYXQKKyAqIHNob3VsZCBuZXZlciBiZSB1c2VkIGFzIGRhdGEgYmxvY2tzIGJ5IGZpbGVzIG9yIGRpcmVjdG9yaWVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgImV4dDQuaCIKKworc3RydWN0IGV4dDRfc3lzdGVtX3pvbmUgeworCXN0cnVjdCByYl9ub2RlCW5vZGU7CisJZXh0NF9mc2Jsa190CXN0YXJ0X2JsazsKKwl1bnNpZ25lZCBpbnQJY291bnQ7Cit9OworCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmV4dDRfc3lzdGVtX3pvbmVfY2FjaGVwOworCitpbnQgX19pbml0IGluaXRfZXh0NF9zeXN0ZW1fem9uZSh2b2lkKQoreworCWV4dDRfc3lzdGVtX3pvbmVfY2FjaGVwID0gS01FTV9DQUNIRShleHQ0X3N5c3RlbV96b25lLAorCQkJCQkgICAgIFNMQUJfUkVDTEFJTV9BQ0NPVU5UKTsKKwlpZiAoZXh0NF9zeXN0ZW1fem9uZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZXhpdF9leHQ0X3N5c3RlbV96b25lKHZvaWQpCit7CisJa21lbV9jYWNoZV9kZXN0cm95KGV4dDRfc3lzdGVtX3pvbmVfY2FjaGVwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2FuX21lcmdlKHN0cnVjdCBleHQ0X3N5c3RlbV96b25lICplbnRyeTEsCisJCSAgICAgc3RydWN0IGV4dDRfc3lzdGVtX3pvbmUgKmVudHJ5MikKK3sKKwlpZiAoKGVudHJ5MS0+c3RhcnRfYmxrICsgZW50cnkxLT5jb3VudCkgPT0gZW50cnkyLT5zdGFydF9ibGspCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogTWFyayBhIHJhbmdlIG9mIGJsb2NrcyBhcyBiZWxvbmdpbmcgdG8gdGhlICJzeXN0ZW0gem9uZSIgLS0tIHRoYXQKKyAqIGlzLCBmaWxlc3lzdGVtIG1ldGFkYXRhIGJsb2NrcyB3aGljaCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBieQorICogaW5vZGVzLgorICovCitzdGF0aWMgaW50IGFkZF9zeXN0ZW1fem9uZShzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksCisJCQkgICBleHQ0X2ZzYmxrX3Qgc3RhcnRfYmxrLAorCQkJICAgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBleHQ0X3N5c3RlbV96b25lICpuZXdfZW50cnkgPSBOVUxMLCAqZW50cnk7CisJc3RydWN0IHJiX25vZGUgKipuID0gJnNiaS0+c3lzdGVtX2Jsa3MucmJfbm9kZSwgKm5vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEwsICpuZXdfbm9kZSA9IE5VTEw7CisKKwl3aGlsZSAoKm4pIHsKKwkJcGFyZW50ID0gKm47CisJCWVudHJ5ID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgZXh0NF9zeXN0ZW1fem9uZSwgbm9kZSk7CisJCWlmIChzdGFydF9ibGsgPCBlbnRyeS0+c3RhcnRfYmxrKQorCQkJbiA9ICYoKm4pLT5yYl9sZWZ0OworCQllbHNlIGlmIChzdGFydF9ibGsgPj0gKGVudHJ5LT5zdGFydF9ibGsgKyBlbnRyeS0+Y291bnQpKQorCQkJbiA9ICYoKm4pLT5yYl9yaWdodDsKKwkJZWxzZSB7CisJCQlpZiAoc3RhcnRfYmxrICsgY291bnQgPiAoZW50cnktPnN0YXJ0X2JsayArIAorCQkJCQkJIGVudHJ5LT5jb3VudCkpCisJCQkJZW50cnktPmNvdW50ID0gKHN0YXJ0X2JsayArIGNvdW50IC0gCisJCQkJCQllbnRyeS0+c3RhcnRfYmxrKTsKKwkJCW5ld19ub2RlID0gKm47CisJCQluZXdfZW50cnkgPSByYl9lbnRyeShuZXdfbm9kZSwgc3RydWN0IGV4dDRfc3lzdGVtX3pvbmUsCisJCQkJCSAgICAgbm9kZSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghbmV3X2VudHJ5KSB7CisJCW5ld19lbnRyeSA9IGttZW1fY2FjaGVfYWxsb2MoZXh0NF9zeXN0ZW1fem9uZV9jYWNoZXAsCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3X2VudHJ5KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW5ld19lbnRyeS0+c3RhcnRfYmxrID0gc3RhcnRfYmxrOworCQluZXdfZW50cnktPmNvdW50ID0gY291bnQ7CisJCW5ld19ub2RlID0gJm5ld19lbnRyeS0+bm9kZTsKKworCQlyYl9saW5rX25vZGUobmV3X25vZGUsIHBhcmVudCwgbik7CisJCXJiX2luc2VydF9jb2xvcihuZXdfbm9kZSwgJnNiaS0+c3lzdGVtX2Jsa3MpOworCX0KKworCS8qIENhbiB3ZSBtZXJnZSB0byB0aGUgbGVmdD8gKi8KKwlub2RlID0gcmJfcHJldihuZXdfbm9kZSk7CisJaWYgKG5vZGUpIHsKKwkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0NF9zeXN0ZW1fem9uZSwgbm9kZSk7CisJCWlmIChjYW5fbWVyZ2UoZW50cnksIG5ld19lbnRyeSkpIHsKKwkJCW5ld19lbnRyeS0+c3RhcnRfYmxrID0gZW50cnktPnN0YXJ0X2JsazsKKwkJCW5ld19lbnRyeS0+Y291bnQgKz0gZW50cnktPmNvdW50OworCQkJcmJfZXJhc2Uobm9kZSwgJnNiaS0+c3lzdGVtX2Jsa3MpOworCQkJa21lbV9jYWNoZV9mcmVlKGV4dDRfc3lzdGVtX3pvbmVfY2FjaGVwLCBlbnRyeSk7CisJCX0KKwl9CisKKwkvKiBDYW4gd2UgbWVyZ2UgdG8gdGhlIHJpZ2h0PyAqLworCW5vZGUgPSByYl9uZXh0KG5ld19ub2RlKTsKKwlpZiAobm9kZSkgeworCQllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBleHQ0X3N5c3RlbV96b25lLCBub2RlKTsKKwkJaWYgKGNhbl9tZXJnZShuZXdfZW50cnksIGVudHJ5KSkgeworCQkJbmV3X2VudHJ5LT5jb3VudCArPSBlbnRyeS0+Y291bnQ7CisJCQlyYl9lcmFzZShub2RlLCAmc2JpLT5zeXN0ZW1fYmxrcyk7CisJCQlrbWVtX2NhY2hlX2ZyZWUoZXh0NF9zeXN0ZW1fem9uZV9jYWNoZXAsIGVudHJ5KTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVidWdfcHJpbnRfdHJlZShzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGV4dDRfc3lzdGVtX3pvbmUgKmVudHJ5OworCWludCBmaXJzdCA9IDE7CisKKwlwcmludGsoS0VSTl9JTkZPICJTeXN0ZW0gem9uZXM6ICIpOworCW5vZGUgPSByYl9maXJzdCgmc2JpLT5zeXN0ZW1fYmxrcyk7CisJd2hpbGUgKG5vZGUpIHsKKwkJZW50cnkgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0NF9zeXN0ZW1fem9uZSwgbm9kZSk7CisJCXByaW50aygiJXMlbGx1LSVsbHUiLCBmaXJzdCA/ICIiIDogIiwgIiwKKwkJICAgICAgIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5zdGFydF9ibGsgKyBlbnRyeS0+Y291bnQgLSAxKTsKKwkJZmlyc3QgPSAwOworCQlub2RlID0gcmJfbmV4dChub2RlKTsKKwl9CisJcHJpbnRrKCJcbiIpOworfQorCitpbnQgZXh0NF9zZXR1cF9zeXN0ZW1fem9uZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKKwlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKKwlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7CisJZXh0NF9ncm91cF90IGk7CisJaW50IGZsZXhfc2l6ZSA9IGV4dDRfZmxleF9iZ19zaXplKHNiaSk7CisJaW50IHJldDsKKworCWlmICghdGVzdF9vcHQoc2IsIEJMT0NLX1ZBTElESVRZKSkgeworCQlpZiAoRVhUNF9TQihzYiktPnN5c3RlbV9ibGtzLnJiX25vZGUpCisJCQlleHQ0X3JlbGVhc2Vfc3lzdGVtX3pvbmUoc2IpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEVYVDRfU0Ioc2IpLT5zeXN0ZW1fYmxrcy5yYl9ub2RlKQorCQlyZXR1cm4gMDsKKworCWZvciAoaT0wOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWlmIChleHQ0X2JnX2hhc19zdXBlcihzYiwgaSkgJiYKKwkJICAgICgoaSA8IDUpIHx8ICgoaSAlIGZsZXhfc2l6ZSkgPT0gMCkpKQorCQkJYWRkX3N5c3RlbV96b25lKHNiaSwgZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgaSksCisJCQkJCXNiaS0+c19nZGJfY291bnQgKyAxKTsKKwkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCXJldCA9IGFkZF9zeXN0ZW1fem9uZShzYmksIGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGFkZF9zeXN0ZW1fem9uZShzYmksIGV4dDRfaW5vZGVfYml0bWFwKHNiLCBnZHApLCAxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IGFkZF9zeXN0ZW1fem9uZShzYmksIGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCksCisJCQkJc2JpLT5zX2l0Yl9wZXJfZ3JvdXApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKKwkJZGVidWdfcHJpbnRfdHJlZShFWFQ0X1NCKHNiKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aGVuIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZCAqLwordm9pZCBleHQ0X3JlbGVhc2Vfc3lzdGVtX3pvbmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgcmJfbm9kZQkqbiA9IEVYVDRfU0Ioc2IpLT5zeXN0ZW1fYmxrcy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlCSpwYXJlbnQ7CisJc3RydWN0IGV4dDRfc3lzdGVtX3pvbmUJKmVudHJ5OworCisJd2hpbGUgKG4pIHsKKwkJLyogRG8gdGhlIG5vZGUncyBjaGlsZHJlbiBmaXJzdCAqLworCQlpZiAobi0+cmJfbGVmdCkgeworCQkJbiA9IG4tPnJiX2xlZnQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobi0+cmJfcmlnaHQpIHsKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIFRoZSBub2RlIGhhcyBubyBjaGlsZHJlbjsgZnJlZSBpdCwgYW5kIHRoZW4gemVybworCQkgKiBvdXQgcGFyZW50J3MgbGluayB0byBpdC4gIEZpbmFsbHkgZ28gdG8gdGhlCisJCSAqIGJlZ2lubmluZyBvZiB0aGUgbG9vcCBhbmQgdHJ5IHRvIGZyZWUgdGhlIHBhcmVudAorCQkgKiBub2RlLgorCQkgKi8KKwkJcGFyZW50ID0gcmJfcGFyZW50KG4pOworCQllbnRyeSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBleHQ0X3N5c3RlbV96b25lLCBub2RlKTsKKwkJa21lbV9jYWNoZV9mcmVlKGV4dDRfc3lzdGVtX3pvbmVfY2FjaGVwLCBlbnRyeSk7CisJCWlmICghcGFyZW50KQorCQkJRVhUNF9TQihzYiktPnN5c3RlbV9ibGtzLnJiX25vZGUgPSBOVUxMOworCQllbHNlIGlmIChwYXJlbnQtPnJiX2xlZnQgPT0gbikKKwkJCXBhcmVudC0+cmJfbGVmdCA9IE5VTEw7CisJCWVsc2UgaWYgKHBhcmVudC0+cmJfcmlnaHQgPT0gbikKKwkJCXBhcmVudC0+cmJfcmlnaHQgPSBOVUxMOworCQluID0gcGFyZW50OworCX0KKwlFWFQ0X1NCKHNiKS0+c3lzdGVtX2Jsa3MucmJfbm9kZSA9IE5VTEw7Cit9CisKKy8qCisgKiBSZXR1cm5zIDEgaWYgdGhlIHBhc3NlZC1pbiBibG9jayByZWdpb24gKHN0YXJ0X2JsaywKKyAqIHN0YXJ0X2Jsaytjb3VudCkgaXMgdmFsaWQ7IDAgaWYgc29tZSBwYXJ0IG9mIHRoZSBibG9jayByZWdpb24KKyAqIG92ZXJsYXBzIHdpdGggZmlsZXN5c3RlbSBtZXRhZGF0YSBibG9ja3MuCisgKi8KK2ludCBleHQ0X2RhdGFfYmxvY2tfdmFsaWQoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLCBleHQ0X2ZzYmxrX3Qgc3RhcnRfYmxrLAorCQkJICB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IGV4dDRfc3lzdGVtX3pvbmUgKmVudHJ5OworCXN0cnVjdCByYl9ub2RlICpuID0gc2JpLT5zeXN0ZW1fYmxrcy5yYl9ub2RlOworCisJaWYgKChzdGFydF9ibGsgPD0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSB8fAorCSAgICAoc3RhcnRfYmxrICsgY291bnQgPiBleHQ0X2Jsb2Nrc19jb3VudChzYmktPnNfZXMpKSkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKG4pIHsKKwkJZW50cnkgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZXh0NF9zeXN0ZW1fem9uZSwgbm9kZSk7CisJCWlmIChzdGFydF9ibGsgKyBjb3VudCAtIDEgPCBlbnRyeS0+c3RhcnRfYmxrKQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKHN0YXJ0X2JsayA+PSAoZW50cnktPnN0YXJ0X2JsayArIGVudHJ5LT5jb3VudCkpCisJCQluID0gbi0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9kaXIuYyBiL2ZzL2V4dDQvZGlyLmMKaW5kZXggYjY0Nzg5OS4uOWRjOTMxNjggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZGlyLmMKKysrIGIvZnMvZXh0NC9kaXIuYwpAQCAtMTMxLDggKzEzMSw3IEBACiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOwogCiAJCW1hcF9iaC5iX3N0YXRlID0gMDsKLQkJZXJyID0gZXh0NF9nZXRfYmxvY2tzX3dyYXAoTlVMTCwgaW5vZGUsIGJsaywgMSwgJm1hcF9iaCwKLQkJCQkJCTAsIDAsIDApOworCQllcnIgPSBleHQ0X2dldF9ibG9ja3MoTlVMTCwgaW5vZGUsIGJsaywgMSwgJm1hcF9iaCwgMCk7CiAJCWlmIChlcnIgPiAwKSB7CiAJCQlwZ29mZl90IGluZGV4ID0gbWFwX2JoLmJfYmxvY2tuciA+PgogCQkJCQkoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAppbmRleCBkMGYxNWVmLi5jYzdkNWVkIDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dDQuaAorKysgYi9mcy9leHQ0L2V4dDQuaApAQCAtMjEsNyArMjEsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgogI2luY2x1ZGUgPGxpbnV4L2piZDIuaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YS5oPgotI2luY2x1ZGUgImV4dDRfaS5oIgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxvY2tncm91cF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1X2NvdW50ZXIuaD4KIAogLyoKICAqIFRoZSBmb3VydGggZXh0ZW5kZWQgZmlsZXN5c3RlbSBjb25zdGFudHMvc3RydWN0dXJlcwpAQCAtNDYsNiArNTMsMTkgQEAKICNkZWZpbmUgZXh0NF9kZWJ1ZyhmLCBhLi4uKQlkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCisvKiBkYXRhIHR5cGUgZm9yIGJsb2NrIG9mZnNldCBvZiBibG9jayBncm91cCAqLwordHlwZWRlZiBpbnQgZXh0NF9ncnBibGtfdDsKKworLyogZGF0YSB0eXBlIGZvciBmaWxlc3lzdGVtLXdpZGUgYmxvY2tzIG51bWJlciAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZXh0NF9mc2Jsa190OworCisvKiBkYXRhIHR5cGUgZm9yIGZpbGUgbG9naWNhbCBibG9jayBudW1iZXIgKi8KK3R5cGVkZWYgX191MzIgZXh0NF9sYmxrX3Q7CisKKy8qIGRhdGEgdHlwZSBmb3IgYmxvY2sgZ3JvdXAgbnVtYmVyICovCit0eXBlZGVmIHVuc2lnbmVkIGludCBleHQ0X2dyb3VwX3Q7CisKKwogLyogcHJlZmVyIGdvYWwgYWdhaW4uIGxlbmd0aCAqLwogI2RlZmluZSBFWFQ0X01CX0hJTlRfTUVSR0UJCTEKIC8qIGJsb2NrcyBhbHJlYWR5IHJlc2VydmVkICovCkBAIC0xNzksOSArMTk5LDYgQEAKICNkZWZpbmUgRVhUNF9CR19CTE9DS19VTklOSVQJMHgwMDAyIC8qIEJsb2NrIGJpdG1hcCBub3QgaW4gdXNlICovCiAjZGVmaW5lIEVYVDRfQkdfSU5PREVfWkVST0VECTB4MDAwNCAvKiBPbi1kaXNrIGl0YWJsZSBpbml0aWFsaXplZCB0byB6ZXJvICovCiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSAiZXh0NF9zYi5oIgotI2VuZGlmCiAvKgogICogTWFjcm8taW5zdHJ1Y3Rpb25zIHVzZWQgdG8gbWFuYWdlIGdyb3VwIGRlc2NyaXB0b3JzCiAgKi8KQEAgLTI5NywxMCArMzE0LDIzIEBACiB9OwogCiAvKgotICogRm9sbG93aW5nIGlzIHVzZWQgYnkgcHJlYWxsb2NhdGlvbiBjb2RlIHRvIHRlbGwgZ2V0X2Jsb2NrcygpIHRoYXQgd2UKLSAqIHdhbnQgdW5pbml0aWFsemVkIGV4dGVudHMuCisgKiBGbGFncyB1c2VkIGJ5IGV4dDRfZ2V0X2Jsb2NrcygpCiAgKi8KLSNkZWZpbmUgRVhUNF9DUkVBVEVfVU5JTklUSUFMSVpFRF9FWFQJCTIKKwkvKiBBbGxvY2F0ZSBhbnkgbmVlZGVkIGJsb2NrcyBhbmQvb3IgY29udmVydCBhbiB1bml0aWFsaXplZAorCSAgIGV4dGVudCB0byBiZSBhbiBpbml0aWFsaXplZCBleHQ0ICovCisjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUJCQkweDAwMDEKKwkvKiBSZXF1ZXN0IHRoZSBjcmVhdGlvbiBvZiBhbiB1bml0aWFsaXplZCBleHRlbnQgKi8KKyNkZWZpbmUgRVhUNF9HRVRfQkxPQ0tTX1VOSU5JVF9FWFQJCTB4MDAwMgorI2RlZmluZSBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFX1VOSU5JVF9FWFQJKEVYVDRfR0VUX0JMT0NLU19VTklOSVRfRVhUfFwKKwkJCQkJCSBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKQorCS8qIENhbGxlciBpcyBmcm9tIHRoZSBkZWxheWVkIGFsbG9jYXRpb24gd3JpdGVvdXQgcGF0aCwKKwkgICBzbyBzZXQgdGhlIG1hZ2ljIGlfZGVsYWxsb2NfcmVzZXJ2ZV9mbGFnIGFmdGVyIHRha2luZyB0aGUgCisJICAgaW5vZGUgYWxsb2NhdGlvbiBzZW1hcGhvcmUgZm9yICovCisjZGVmaW5lIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFCTB4MDAwNAorCS8qIENhbGwgZXh0NF9kYV91cGRhdGVfcmVzZXJ2ZV9zcGFjZSgpIGFmdGVyIHN1Y2Nlc3NmdWxseSAKKwkgICBhbGxvY2F0aW5nIHRoZSBibG9ja3MgKi8KKyNkZWZpbmUgRVhUNF9HRVRfQkxPQ0tTX1VQREFURV9SRVNFUlZFX1NQQUNFCTB4MDAwOAorCiAKIC8qCiAgKiBpb2N0bCBjb21tYW5kcwpAQCAtNTE2LDYgKzU0NiwxMTAgQEAKICNlbmRpZiAvKiBkZWZpbmVkKF9fS0VSTkVMX18pIHx8IGRlZmluZWQoX19saW51eF9fKSAqLwogCiAvKgorICogc3RvcmFnZSBmb3IgY2FjaGVkIGV4dGVudAorICovCitzdHJ1Y3QgZXh0NF9leHRfY2FjaGUgeworCWV4dDRfZnNibGtfdAllY19zdGFydDsKKwlleHQ0X2xibGtfdAllY19ibG9jazsKKwlfX3UzMgkJZWNfbGVuOyAvKiBtdXN0IGJlIDMyYml0IHRvIHJldHVybiBob2xlcyAqLworCV9fdTMyCQllY190eXBlOworfTsKKworLyoKKyAqIGZvdXJ0aCBleHRlbmRlZCBmaWxlIHN5c3RlbSBpbm9kZSBkYXRhIGluIG1lbW9yeQorICovCitzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvIHsKKwlfX2xlMzIJaV9kYXRhWzE1XTsJLyogdW5jb252ZXJ0ZWQgKi8KKwlfX3UzMglpX2ZsYWdzOworCWV4dDRfZnNibGtfdAlpX2ZpbGVfYWNsOworCV9fdTMyCWlfZHRpbWU7CisKKwkvKgorCSAqIGlfYmxvY2tfZ3JvdXAgaXMgdGhlIG51bWJlciBvZiB0aGUgYmxvY2sgZ3JvdXAgd2hpY2ggY29udGFpbnMKKwkgKiB0aGlzIGZpbGUncyBpbm9kZS4gIENvbnN0YW50IGFjcm9zcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGlub2RlLAorCSAqIGl0IGlzIHVlZCBmb3IgbWFraW5nIGJsb2NrIGFsbG9jYXRpb24gZGVjaXNpb25zIC0gd2UgdHJ5IHRvCisJICogcGxhY2UgYSBmaWxlJ3MgZGF0YSBibG9ja3MgbmVhciBpdHMgaW5vZGUgYmxvY2ssIGFuZCBuZXcgaW5vZGVzCisJICogbmVhciB0byB0aGVpciBwYXJlbnQgZGlyZWN0b3J5J3MgaW5vZGUuCisJICovCisJZXh0NF9ncm91cF90CWlfYmxvY2tfZ3JvdXA7CisJX191MzIJaV9zdGF0ZTsJCS8qIER5bmFtaWMgc3RhdGUgZmxhZ3MgZm9yIGV4dDQgKi8KKworCWV4dDRfbGJsa190CQlpX2Rpcl9zdGFydF9sb29rdXA7CisjaWZkZWYgQ09ORklHX0VYVDRfRlNfWEFUVFIKKwkvKgorCSAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgY2FuIGJlIHJlYWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgbWFpbiBmaWxlCisJICogZGF0YS4gVGFraW5nIGlfbXV0ZXggZXZlbiB3aGVuIHJlYWRpbmcgd291bGQgY2F1c2UgY29udGVudGlvbgorCSAqIGJldHdlZW4gcmVhZGVycyBvZiBFQXMgYW5kIHdyaXRlcnMgb2YgcmVndWxhciBmaWxlIGRhdGEsIHNvCisJICogaW5zdGVhZCB3ZSBzeW5jaHJvbml6ZSBvbiB4YXR0cl9zZW0gd2hlbiByZWFkaW5nIG9yIGNoYW5naW5nCisJICogRUFzLgorCSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgeGF0dHJfc2VtOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCisJc3RydWN0IHBvc2l4X2FjbAkqaV9hY2w7CisJc3RydWN0IHBvc2l4X2FjbAkqaV9kZWZhdWx0X2FjbDsKKyNlbmRpZgorCisJc3RydWN0IGxpc3RfaGVhZCBpX29ycGhhbjsJLyogdW5saW5rZWQgYnV0IG9wZW4gaW5vZGVzICovCisKKwkvKgorCSAqIGlfZGlza3NpemUga2VlcHMgdHJhY2sgb2Ygd2hhdCB0aGUgaW5vZGUgc2l6ZSBpcyBPTiBESVNLLCBub3QKKwkgKiBpbiBtZW1vcnkuICBEdXJpbmcgdHJ1bmNhdGUsIGlfc2l6ZSBpcyBzZXQgdG8gdGhlIG5ldyBzaXplIGJ5CisJICogdGhlIFZGUyBwcmlvciB0byBjYWxsaW5nIGV4dDRfdHJ1bmNhdGUoKSwgYnV0IHRoZSBmaWxlc3lzdGVtIHdvbid0CisJICogc2V0IGlfZGlza3NpemUgdG8gMCB1bnRpbCB0aGUgdHJ1bmNhdGUgaXMgYWN0dWFsbHkgdW5kZXIgd2F5LgorCSAqCisJICogVGhlIGludGVudCBpcyB0aGF0IGlfZGlza3NpemUgYWx3YXlzIHJlcHJlc2VudHMgdGhlIGJsb2NrcyB3aGljaAorCSAqIGFyZSB1c2VkIGJ5IHRoaXMgZmlsZS4gIFRoaXMgYWxsb3dzIHJlY292ZXJ5IHRvIHJlc3RhcnQgdHJ1bmNhdGUKKwkgKiBvbiBvcnBoYW5zIGlmIHdlIGNyYXNoIGR1cmluZyB0cnVuY2F0ZS4gIFdlIGFjdHVhbGx5IHdyaXRlIGlfZGlza3NpemUKKwkgKiBpbnRvIHRoZSBvbi1kaXNrIGlub2RlIHdoZW4gd3JpdGluZyBpbm9kZXMgb3V0LCBpbnN0ZWFkIG9mIGlfc2l6ZS4KKwkgKgorCSAqIFRoZSBvbmx5IHRpbWUgd2hlbiBpX2Rpc2tzaXplIGFuZCBpX3NpemUgbWF5IGJlIGRpZmZlcmVudCBpcyB3aGVuCisJICogYSB0cnVuY2F0ZSBpcyBpbiBwcm9ncmVzcy4gIFRoZSBvbmx5IHRoaW5ncyB3aGljaCBjaGFuZ2UgaV9kaXNrc2l6ZQorCSAqIGFyZSBleHQ0X2dldF9ibG9jayAoZ3Jvd3RoKSBhbmQgZXh0NF90cnVuY2F0ZSAoc2hyaW5rdGgpLgorCSAqLworCWxvZmZfdAlpX2Rpc2tzaXplOworCisJLyoKKwkgKiBpX2RhdGFfc2VtIGlzIGZvciBzZXJpYWxpc2luZyBleHQ0X3RydW5jYXRlKCkgYWdhaW5zdAorCSAqIGV4dDRfZ2V0YmxvY2soKS4gIEluIHRoZSAyLjQgZXh0MiBkZXNpZ24sIGdyZWF0IGNodW5rcyBvZiBpbm9kZSdzCisJICogZGF0YSB0cmVlIGFyZSBjaG9wcGVkIG9mZiBkdXJpbmcgdHJ1bmNhdGUuIFdlIGNhbid0IGRvIHRoYXQgaW4KKwkgKiBleHQ0IGJlY2F1c2Ugd2hlbmV2ZXIgd2UgcGVyZm9ybSBpbnRlcm1lZGlhdGUgY29tbWl0cyBkdXJpbmcKKwkgKiB0cnVuY2F0ZSwgdGhlIGlub2RlIGFuZCBhbGwgdGhlIG1ldGFkYXRhIGJsb2NrcyAqbXVzdCogYmUgaW4gYQorCSAqIGNvbnNpc3RlbnQgc3RhdGUgd2hpY2ggYWxsb3dzIHRydW5jYXRpb24gb2YgdGhlIG9ycGhhbnMgdG8gcmVzdGFydAorCSAqIGR1cmluZyByZWNvdmVyeS4gIEhlbmNlIHdlIG11c3QgZml4IHRoZSBnZXRfYmxvY2stdnMtdHJ1bmNhdGUgcmFjZQorCSAqIGJ5IG90aGVyIG1lYW5zLCBzbyB3ZSBoYXZlIGlfZGF0YV9zZW0uCisJICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBpX2RhdGFfc2VtOworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7CisJc3RydWN0IGpiZDJfaW5vZGUgamlub2RlOworCisJc3RydWN0IGV4dDRfZXh0X2NhY2hlIGlfY2FjaGVkX2V4dGVudDsKKwkvKgorCSAqIEZpbGUgY3JlYXRpb24gdGltZS4gSXRzIGZ1bmN0aW9uIGlzIHNhbWUgYXMgdGhhdCBvZgorCSAqIHN0cnVjdCB0aW1lc3BlYyBpX3thLGMsbX10aW1lIGluIHRoZSBnZW5lcmljIGlub2RlLgorCSAqLworCXN0cnVjdCB0aW1lc3BlYyBpX2NydGltZTsKKworCS8qIG1iYWxsb2MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGlfcHJlYWxsb2NfbGlzdDsKKwlzcGlubG9ja190IGlfcHJlYWxsb2NfbG9jazsKKworCS8qIGlhbGxvYyAqLworCWV4dDRfZ3JvdXBfdAlpX2xhc3RfYWxsb2NfZ3JvdXA7CisKKwkvKiBhbGxvY2F0aW9uIHJlc2VydmF0aW9uIGluZm8gZm9yIGRlbGFsbG9jICovCisJdW5zaWduZWQgaW50IGlfcmVzZXJ2ZWRfZGF0YV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGlfcmVzZXJ2ZWRfbWV0YV9ibG9ja3M7CisJdW5zaWduZWQgaW50IGlfYWxsb2NhdGVkX21ldGFfYmxvY2tzOworCXVuc2lnbmVkIHNob3J0IGlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZzsKKworCS8qIG9uLWRpc2sgYWRkaXRpb25hbCBsZW5ndGggKi8KKwlfX3UxNiBpX2V4dHJhX2lzaXplOworCisJc3BpbmxvY2tfdCBpX2Jsb2NrX3Jlc2VydmF0aW9uX2xvY2s7Cit9OworCisvKgogICogRmlsZSBzeXN0ZW0gc3RhdGVzCiAgKi8KICNkZWZpbmUJRVhUNF9WQUxJRF9GUwkJCTB4MDAwMQkvKiBVbm1vdW50ZWQgY2xlYW5seSAqLwpAQCAtNTYwLDYgKzY5NCw3IEBACiAjZGVmaW5lIEVYVDRfTU9VTlRfSV9WRVJTSU9OICAgICAgICAgICAgMHgyMDAwMDAwIC8qIGlfdmVyc2lvbiBzdXBwb3J0ICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfREVMQUxMT0MJCTB4ODAwMDAwMCAvKiBEZWxhbGxvYyBzdXBwb3J0ICovCiAjZGVmaW5lIEVYVDRfTU9VTlRfREFUQV9FUlJfQUJPUlQJMHgxMDAwMDAwMCAvKiBBYm9ydCBvbiBmaWxlIGRhdGEgd3JpdGUgKi8KKyNkZWZpbmUgRVhUNF9NT1VOVF9CTE9DS19WQUxJRElUWQkweDIwMDAwMDAwIC8qIEJsb2NrIHZhbGlkaXR5IGNoZWNraW5nICovCiAKIC8qIENvbXBhdGliaWxpdHksIGZvciBoYXZpbmcgYm90aCBleHQyX2ZzLmggYW5kIGV4dDRfZnMuaCBpbmNsdWRlZCBhdCBvbmNlICovCiAjaWZuZGVmIF9MSU5VWF9FWFQyX0ZTX0gKQEAgLTY4OSw2ICs4MjQsMTM3IEBACiB9OwogCiAjaWZkZWYgX19LRVJORUxfXworLyoKKyAqIGZvdXJ0aCBleHRlbmRlZC1mcyBzdXBlci1ibG9jayBkYXRhIGluIG1lbW9yeQorICovCitzdHJ1Y3QgZXh0NF9zYl9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIHNfZGVzY19zaXplOwkvKiBTaXplIG9mIGEgZ3JvdXAgZGVzY3JpcHRvciBpbiBieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgc19pbm9kZXNfcGVyX2Jsb2NrOy8qIE51bWJlciBvZiBpbm9kZXMgcGVyIGJsb2NrICovCisJdW5zaWduZWQgbG9uZyBzX2Jsb2Nrc19wZXJfZ3JvdXA7LyogTnVtYmVyIG9mIGJsb2NrcyBpbiBhIGdyb3VwICovCisJdW5zaWduZWQgbG9uZyBzX2lub2Rlc19wZXJfZ3JvdXA7LyogTnVtYmVyIG9mIGlub2RlcyBpbiBhIGdyb3VwICovCisJdW5zaWduZWQgbG9uZyBzX2l0Yl9wZXJfZ3JvdXA7CS8qIE51bWJlciBvZiBpbm9kZSB0YWJsZSBibG9ja3MgcGVyIGdyb3VwICovCisJdW5zaWduZWQgbG9uZyBzX2dkYl9jb3VudDsJLyogTnVtYmVyIG9mIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2tzICovCisJdW5zaWduZWQgbG9uZyBzX2Rlc2NfcGVyX2Jsb2NrOwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvcnMgcGVyIGJsb2NrICovCisJZXh0NF9ncm91cF90IHNfZ3JvdXBzX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXBzIGluIHRoZSBmcyAqLworCXVuc2lnbmVkIGxvbmcgc19vdmVyaGVhZF9sYXN0OyAgLyogTGFzdCBjYWxjdWxhdGVkIG92ZXJoZWFkICovCisJdW5zaWduZWQgbG9uZyBzX2Jsb2Nrc19sYXN0OyAgICAvKiBMYXN0IHNlZW4gYmxvY2sgY291bnQgKi8KKwlsb2ZmX3Qgc19iaXRtYXBfbWF4Ynl0ZXM7CS8qIG1heCBieXRlcyBmb3IgYml0bWFwIGZpbGVzICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICogc19zYmg7CS8qIEJ1ZmZlciBjb250YWluaW5nIHRoZSBzdXBlciBibG9jayAqLworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICpzX2VzOwkvKiBQb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBpbiB0aGUgYnVmZmVyICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqc19ncm91cF9kZXNjOworCXVuc2lnbmVkIGxvbmcgIHNfbW91bnRfb3B0OworCWV4dDRfZnNibGtfdCBzX3NiX2Jsb2NrOworCXVpZF90IHNfcmVzdWlkOworCWdpZF90IHNfcmVzZ2lkOworCXVuc2lnbmVkIHNob3J0IHNfbW91bnRfc3RhdGU7CisJdW5zaWduZWQgc2hvcnQgc19wYWQ7CisJaW50IHNfYWRkcl9wZXJfYmxvY2tfYml0czsKKwlpbnQgc19kZXNjX3Blcl9ibG9ja19iaXRzOworCWludCBzX2lub2RlX3NpemU7CisJaW50IHNfZmlyc3RfaW5vOworCXVuc2lnbmVkIGludCBzX2lub2RlX3JlYWRhaGVhZF9ibGtzOworCXNwaW5sb2NrX3Qgc19uZXh0X2dlbl9sb2NrOworCXUzMiBzX25leHRfZ2VuZXJhdGlvbjsKKwl1MzIgc19oYXNoX3NlZWRbNF07CisJaW50IHNfZGVmX2hhc2hfdmVyc2lvbjsKKwlpbnQgc19oYXNoX3Vuc2lnbmVkOwkvKiAzIGlmIGhhc2ggc2hvdWxkIGJlIHNpZ25lZCwgMCBpZiBub3QgKi8KKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlYmxvY2tzX2NvdW50ZXI7CisJc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZnJlZWlub2Rlc19jb3VudGVyOworCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnNfY291bnRlcjsKKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19kaXJ0eWJsb2Nrc19jb3VudGVyOworCXN0cnVjdCBibG9ja2dyb3VwX2xvY2sgKnNfYmxvY2tncm91cF9sb2NrOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqc19wcm9jOworCXN0cnVjdCBrb2JqZWN0IHNfa29iajsKKwlzdHJ1Y3QgY29tcGxldGlvbiBzX2tvYmpfdW5yZWdpc3RlcjsKKworCS8qIEpvdXJuYWxpbmcgKi8KKwlzdHJ1Y3QgaW5vZGUgKnNfam91cm5hbF9pbm9kZTsKKwlzdHJ1Y3Qgam91cm5hbF9zICpzX2pvdXJuYWw7CisJc3RydWN0IGxpc3RfaGVhZCBzX29ycGhhbjsKKwlzdHJ1Y3QgbXV0ZXggc19vcnBoYW5fbG9jazsKKwlzdHJ1Y3QgbXV0ZXggc19yZXNpemVfbG9jazsKKwl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOworCXUzMiBzX21heF9iYXRjaF90aW1lOworCXUzMiBzX21pbl9iYXRjaF90aW1lOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmpvdXJuYWxfYmRldjsKKyNpZmRlZiBDT05GSUdfSkJEMl9ERUJVRworCXN0cnVjdCB0aW1lcl9saXN0IHR1cm5fcm9fdGltZXI7CS8qIEZvciB0dXJuaW5nIHJlYWQtb25seSAoY3Jhc2ggc2ltdWxhdGlvbikgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCByb193YWl0X3F1ZXVlOwkvKiBGb3IgcGVvcGxlIHdhaXRpbmcgZm9yIHRoZSBmcyB0byBnbyByZWFkLW9ubHkgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19RVU9UQQorCWNoYXIgKnNfcWZfbmFtZXNbTUFYUVVPVEFTXTsJCS8qIE5hbWVzIG9mIHF1b3RhIGZpbGVzIHdpdGggam91cm5hbGxlZCBxdW90YSAqLworCWludCBzX2pxdW90YV9mbXQ7CQkJLyogRm9ybWF0IG9mIHF1b3RhIHRvIHVzZSAqLworI2VuZGlmCisJdW5zaWduZWQgaW50IHNfd2FudF9leHRyYV9pc2l6ZTsgLyogTmV3IGlub2RlcyBzaG91bGQgcmVzZXJ2ZSAjIGJ5dGVzICovCisJc3RydWN0IHJiX3Jvb3Qgc3lzdGVtX2Jsa3M7CisKKyNpZmRlZiBFWFRFTlRTX1NUQVRTCisJLyogZXh0NCBleHRlbnRzIHN0YXRzICovCisJdW5zaWduZWQgbG9uZyBzX2V4dF9taW47CisJdW5zaWduZWQgbG9uZyBzX2V4dF9tYXg7CisJdW5zaWduZWQgbG9uZyBzX2RlcHRoX21heDsKKwlzcGlubG9ja190IHNfZXh0X3N0YXRzX2xvY2s7CisJdW5zaWduZWQgbG9uZyBzX2V4dF9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyBzX2V4dF9leHRlbnRzOworI2VuZGlmCisKKwkvKiBmb3IgYnVkZHkgYWxsb2NhdG9yICovCisJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqKipzX2dyb3VwX2luZm87CisJc3RydWN0IGlub2RlICpzX2J1ZGR5X2NhY2hlOworCWxvbmcgc19ibG9ja3NfcmVzZXJ2ZWQ7CisJc3BpbmxvY2tfdCBzX3Jlc2VydmVfbG9jazsKKwlzcGlubG9ja190IHNfbWRfbG9jazsKKwl0aWRfdCBzX2xhc3RfdHJhbnNhY3Rpb247CisJdW5zaWduZWQgc2hvcnQgKnNfbWJfb2Zmc2V0czsKKwl1bnNpZ25lZCBpbnQgKnNfbWJfbWF4czsKKworCS8qIHR1bmFibGVzICovCisJdW5zaWduZWQgbG9uZyBzX3N0cmlwZTsKKwl1bnNpZ25lZCBpbnQgc19tYl9zdHJlYW1fcmVxdWVzdDsKKwl1bnNpZ25lZCBpbnQgc19tYl9tYXhfdG9fc2NhbjsKKwl1bnNpZ25lZCBpbnQgc19tYl9taW5fdG9fc2NhbjsKKwl1bnNpZ25lZCBpbnQgc19tYl9zdGF0czsKKwl1bnNpZ25lZCBpbnQgc19tYl9vcmRlcjJfcmVxczsKKwl1bnNpZ25lZCBpbnQgc19tYl9ncm91cF9wcmVhbGxvYzsKKwkvKiB3aGVyZSBsYXN0IGFsbG9jYXRpb24gd2FzIGRvbmUgLSBmb3Igc3RyZWFtIGFsbG9jYXRpb24gKi8KKwl1bnNpZ25lZCBsb25nIHNfbWJfbGFzdF9ncm91cDsKKwl1bnNpZ25lZCBsb25nIHNfbWJfbGFzdF9zdGFydDsKKworCS8qIGhpc3RvcnkgdG8gZGVidWcgcG9saWN5ICovCisJc3RydWN0IGV4dDRfbWJfaGlzdG9yeSAqc19tYl9oaXN0b3J5OworCWludCBzX21iX2hpc3RvcnlfY3VyOworCWludCBzX21iX2hpc3RvcnlfbWF4OworCWludCBzX21iX2hpc3RvcnlfbnVtOworCXNwaW5sb2NrX3Qgc19tYl9oaXN0b3J5X2xvY2s7CisJaW50IHNfbWJfaGlzdG9yeV9maWx0ZXI7CisKKwkvKiBzdGF0cyBmb3IgYnVkZHkgYWxsb2NhdG9yICovCisJc3BpbmxvY2tfdCBzX21iX3BhX2xvY2s7CisJYXRvbWljX3Qgc19iYWxfcmVxczsJLyogbnVtYmVyIG9mIHJlcXMgd2l0aCBsZW4gPiAxICovCisJYXRvbWljX3Qgc19iYWxfc3VjY2VzczsJLyogd2UgZm91bmQgbG9uZyBlbm91Z2ggY2h1bmtzICovCisJYXRvbWljX3Qgc19iYWxfYWxsb2NhdGVkOwkvKiBpbiBibG9ja3MgKi8KKwlhdG9taWNfdCBzX2JhbF9leF9zY2FubmVkOwkvKiB0b3RhbCBleHRlbnRzIHNjYW5uZWQgKi8KKwlhdG9taWNfdCBzX2JhbF9nb2FsczsJLyogZ29hbCBoaXRzICovCisJYXRvbWljX3Qgc19iYWxfYnJlYWtzOwkvKiB0b28gbG9uZyBzZWFyY2hlcyAqLworCWF0b21pY190IHNfYmFsXzJvcmRlcnM7CS8qIDJeb3JkZXIgaGl0cyAqLworCXNwaW5sb2NrX3Qgc19iYWxfbG9jazsKKwl1bnNpZ25lZCBsb25nIHNfbWJfYnVkZGllc19nZW5lcmF0ZWQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHNfbWJfZ2VuZXJhdGlvbl90aW1lOworCWF0b21pY190IHNfbWJfbG9zdF9jaHVua3M7CisJYXRvbWljX3Qgc19tYl9wcmVhbGxvY2F0ZWQ7CisJYXRvbWljX3Qgc19tYl9kaXNjYXJkZWQ7CisKKwkvKiBsb2NhbGl0eSBncm91cHMgKi8KKwlzdHJ1Y3QgZXh0NF9sb2NhbGl0eV9ncm91cCAqc19sb2NhbGl0eV9ncm91cHM7CisKKwkvKiBmb3Igd3JpdGUgc3RhdGlzdGljcyAqLworCXVuc2lnbmVkIGxvbmcgc19zZWN0b3JzX3dyaXR0ZW5fc3RhcnQ7CisJdTY0IHNfa2J5dGVzX3dyaXR0ZW47CisKKwl1bnNpZ25lZCBpbnQgc19sb2dfZ3JvdXBzX3Blcl9mbGV4OworCXN0cnVjdCBmbGV4X2dyb3VwcyAqc19mbGV4X2dyb3VwczsKK307CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGV4dDRfc2JfaW5mbyAqRVhUNF9TQihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXJldHVybiBzYi0+c19mc19pbmZvOwpAQCAtNzA0LDcgKzk3MCw2IEBACiAJCWN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYikgOiBDVVJSRU5UX1RJTUVfU0VDOwogfQogCi0KIHN0YXRpYyBpbmxpbmUgaW50IGV4dDRfdmFsaWRfaW51bShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubykKIHsKIAlyZXR1cm4gaW5vID09IEVYVDRfUk9PVF9JTk8gfHwKQEAgLTEwMTQsNiArMTI3OSwxNCBAQAogCQkJCQkJICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCwKIAkJCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogYmgpOwogZXh0ZXJuIGludCBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpOworc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQ0X3JlYWRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwKTsKK2V4dGVybiB1bnNpZ25lZCBleHQ0X2luaXRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJICAgICAgIGV4dDRfZ3JvdXBfdCBncm91cCwKKwkJCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYyk7CisjZGVmaW5lIGV4dDRfZnJlZV9ibG9ja3NfYWZ0ZXJfaW5pdChzYiwgZ3JvdXAsIGRlc2MpCQkJXAorCQlleHQ0X2luaXRfYmxvY2tfYml0bWFwKHNiLCBOVUxMLCBncm91cCwgZGVzYykKIAogLyogZGlyLmMgKi8KIGV4dGVybiBpbnQgZXh0NF9jaGVja19kaXJfZW50cnkoY29uc3QgY2hhciAqLCBzdHJ1Y3QgaW5vZGUgKiwKQEAgLTEwMzgsNiArMTMxMSwxMSBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBleHQ0X2NvdW50X2RpcnMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgZXh0NF9jaGVja19pbm9kZXNfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB1bnNpZ25lZCBleHQ0X2luaXRfaW5vZGVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJICAgICAgIGV4dDRfZ3JvdXBfdCBncm91cCwKKwkJCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYyk7CitleHRlcm4gdm9pZCBtYXJrX2JpdG1hcF9lbmQoaW50IHN0YXJ0X2JpdCwgaW50IGVuZF9iaXQsIGNoYXIgKmJpdG1hcCk7CiAKIC8qIG1iYWxsb2MuYyAqLwogZXh0ZXJuIGxvbmcgZXh0NF9tYl9zdGF0czsKQEAgLTExMjMsNiArMTQwMSw4IEBACiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOwogZXh0ZXJuIHZvaWQgZXh0NF93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiB2b2lkIGV4dDRfbXNnKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKIGV4dGVybiB2b2lkIGV4dDRfZ3JwX2xvY2tlZF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZXh0NF9ncm91cF90LAogCQkJCWNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOwpAQCAtMTE2MSw2ICsxNDQxLDEwIEBACiAJCQkJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcsIF9fdTMyIGNvdW50KTsKIGV4dGVybiB2b2lkIGV4dDRfaXRhYmxlX3VudXNlZF9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCQkgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpiZywgX191MzIgY291bnQpOworZXh0ZXJuIF9fbGUxNiBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksIF9fdTMyIGdyb3VwLAorCQkJCSAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCk7CitleHRlcm4gaW50IGV4dDRfZ3JvdXBfZGVzY19jc3VtX3ZlcmlmeShzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmksIF9fdTMyIGdyb3VwLAorCQkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHApOwogCiBzdGF0aWMgaW5saW5lIGV4dDRfZnNibGtfdCBleHQ0X2Jsb2Nrc19jb3VudChzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMpCiB7CkBAIC0xMjI4LDYgKzE1MTIsMTggQEAKIAkgcmV0dXJuIGdycF9pbmZvW2luZGV4dl1baW5kZXhoXTsKIH0KIAorLyoKKyAqIFJlYWRpbmcgc19ncm91cHNfY291bnQgcmVxdWlyZXMgdXNpbmcgc21wX3JtYigpIGFmdGVyd2FyZHMuICBTZWUKKyAqIHRoZSBsb2NraW5nIHByb3RvY29sIGRvY3VtZW50ZWQgaW4gdGhlIGNvbW1lbnRzIG9mIGV4dDRfZ3JvdXBfYWRkKCkKKyAqIGluIHJlc2l6ZS5jCisgKi8KK3N0YXRpYyBpbmxpbmUgZXh0NF9ncm91cF90IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWV4dDRfZ3JvdXBfdAluZ3JvdXBzID0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCisJc21wX3JtYigpOworCXJldHVybiBuZ3JvdXBzOworfQogCiBzdGF0aWMgaW5saW5lIGV4dDRfZ3JvdXBfdCBleHQ0X2ZsZXhfZ3JvdXAoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLAogCQkJCQkgICAgIGV4dDRfZ3JvdXBfdCBibG9ja19ncm91cCkKQEAgLTEyODMsMzMgKzE1NzksMjUgQEAKIH07CiAKICNkZWZpbmUgRVhUNF9HUk9VUF9JTkZPX05FRURfSU5JVF9CSVQJMAotI2RlZmluZSBFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVAkxCiAKICNkZWZpbmUgRVhUNF9NQl9HUlBfTkVFRF9JTklUKGdycCkJXAogCSh0ZXN0X2JpdChFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVCwgJigoZ3JwKS0+YmJfc3RhdGUpKSkKIAorc3RhdGljIGlubGluZSBzcGlubG9ja190ICpleHQ0X2dyb3VwX2xvY2tfcHRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJCSAgICAgIGV4dDRfZ3JvdXBfdCBncm91cCkKK3sKKwlyZXR1cm4gYmdsX2xvY2tfcHRyKEVYVDRfU0Ioc2IpLT5zX2Jsb2NrZ3JvdXBfbG9jaywgZ3JvdXApOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZXh0NF9sb2NrX2dyb3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZ3JvdXBfdCBncm91cCkKIHsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncmluZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7Ci0KLQliaXRfc3Bpbl9sb2NrKEVYVDRfR1JPVVBfSU5GT19MT0NLRURfQklULCAmKGdyaW5mby0+YmJfc3RhdGUpKTsKKwlzcGluX2xvY2soZXh0NF9ncm91cF9sb2NrX3B0cihzYiwgZ3JvdXApKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGV4dDRfdW5sb2NrX2dyb3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJCWV4dDRfZ3JvdXBfdCBncm91cCkKIHsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncmluZm8gPSBleHQ0X2dldF9ncm91cF9pbmZvKHNiLCBncm91cCk7Ci0KLQliaXRfc3Bpbl91bmxvY2soRVhUNF9HUk9VUF9JTkZPX0xPQ0tFRF9CSVQsICYoZ3JpbmZvLT5iYl9zdGF0ZSkpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBleHQ0X2lzX2dyb3VwX2xvY2tlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCi17Ci0Jc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgZ3JvdXApOwotCi0JcmV0dXJuIGJpdF9zcGluX2lzX2xvY2tlZChFWFQ0X0dST1VQX0lORk9fTE9DS0VEX0JJVCwKLQkJCQkJCSYoZ3JpbmZvLT5iYl9zdGF0ZSkpOworCXNwaW5fdW5sb2NrKGV4dDRfZ3JvdXBfbG9ja19wdHIoc2IsIGdyb3VwKSk7CiB9CiAKIC8qCkBAIC0xMzI2LDExICsxNjE0LDIxIEBACiAvKiBuYW1laS5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0NF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpleHQ0X2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpOwogCiAvKiBzeW1saW5rLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwogCisvKiBibG9ja192YWxpZGl0eSAqLworZXh0ZXJuIHZvaWQgZXh0NF9yZWxlYXNlX3N5c3RlbV96b25lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworZXh0ZXJuIGludCBleHQ0X3NldHVwX3N5c3RlbV96b25lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworZXh0ZXJuIGludCBfX2luaXQgaW5pdF9leHQ0X3N5c3RlbV96b25lKHZvaWQpOworZXh0ZXJuIHZvaWQgZXhpdF9leHQ0X3N5c3RlbV96b25lKHZvaWQpOworZXh0ZXJuIGludCBleHQ0X2RhdGFfYmxvY2tfdmFsaWQoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLAorCQkJCSBleHQ0X2ZzYmxrX3Qgc3RhcnRfYmxrLAorCQkJCSB1bnNpZ25lZCBpbnQgY291bnQpOworCiAvKiBleHRlbnRzLmMgKi8KIGV4dGVybiBpbnQgZXh0NF9leHRfdHJlZV9pbml0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqKTsKIGV4dGVybiBpbnQgZXh0NF9leHRfd3JpdGVwYWdlX3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKQEAgLTEzMzgsMTcgKzE2MzYsMTUgQEAKIAkJCQkgICAgICAgaW50IGNodW5rKTsKIGV4dGVybiBpbnQgZXh0NF9leHRfZ2V0X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJICAgICAgIGV4dDRfbGJsa190IGlibG9jaywgdW5zaWduZWQgaW50IG1heF9ibG9ja3MsCi0JCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsCi0JCQkgICAgICAgaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSk7CisJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBmbGFncyk7CiBleHRlcm4gdm9pZCBleHQ0X2V4dF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCBleHQ0X2V4dF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiB2b2lkIGV4dDRfZXh0X3JlbGVhc2Uoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIGxvbmcgZXh0NF9mYWxsb2NhdGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1vZGUsIGxvZmZfdCBvZmZzZXQsCiAJCQkgIGxvZmZfdCBsZW4pOwotZXh0ZXJuIGludCBleHQ0X2dldF9ibG9ja3Nfd3JhcChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJc2VjdG9yX3QgYmxvY2ssIHVuc2lnbmVkIGludCBtYXhfYmxvY2tzLAotCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGNyZWF0ZSwKLQkJCWludCBleHRlbmRfZGlza3NpemUsIGludCBmbGFnKTsKK2V4dGVybiBpbnQgZXh0NF9nZXRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICBzZWN0b3JfdCBibG9jaywgdW5zaWduZWQgaW50IG1heF9ibG9ja3MsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBleHQ0X2ZpZW1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmllbWFwX2V4dGVudF9pbmZvICpmaWVpbmZvLAogCQkJX191NjQgc3RhcnQsIF9fdTY0IGxlbik7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9pLmggYi9mcy9leHQ0L2V4dDRfaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UyMTg3Li4wMDAwMDAwCi0tLSBhL2ZzL2V4dDQvZXh0NF9pLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoKLSAqICBleHQ0X2kuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQotICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQotICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKLSAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKLSAqCi0gKiAgZnJvbQotICoKLSAqICBsaW51eC9pbmNsdWRlL2xpbnV4L21pbml4X2ZzX2kuaAotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCi0gKi8KLQotI2lmbmRlZiBfRVhUNF9JCi0jZGVmaW5lIF9FWFQ0X0kKLQotI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+Ci0jaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0KLS8qIGRhdGEgdHlwZSBmb3IgYmxvY2sgb2Zmc2V0IG9mIGJsb2NrIGdyb3VwICovCi10eXBlZGVmIGludCBleHQ0X2dycGJsa190OwotCi0vKiBkYXRhIHR5cGUgZm9yIGZpbGVzeXN0ZW0td2lkZSBibG9ja3MgbnVtYmVyICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBleHQ0X2ZzYmxrX3Q7Ci0KLS8qIGRhdGEgdHlwZSBmb3IgZmlsZSBsb2dpY2FsIGJsb2NrIG51bWJlciAqLwotdHlwZWRlZiBfX3UzMiBleHQ0X2xibGtfdDsKLQotLyogZGF0YSB0eXBlIGZvciBibG9jayBncm91cCBudW1iZXIgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IGV4dDRfZ3JvdXBfdDsKLQotLyoKLSAqIHN0b3JhZ2UgZm9yIGNhY2hlZCBleHRlbnQKLSAqLwotc3RydWN0IGV4dDRfZXh0X2NhY2hlIHsKLQlleHQ0X2ZzYmxrX3QJZWNfc3RhcnQ7Ci0JZXh0NF9sYmxrX3QJZWNfYmxvY2s7Ci0JX191MzIJCWVjX2xlbjsgLyogbXVzdCBiZSAzMmJpdCB0byByZXR1cm4gaG9sZXMgKi8KLQlfX3UzMgkJZWNfdHlwZTsKLX07Ci0KLS8qCi0gKiBmb3VydGggZXh0ZW5kZWQgZmlsZSBzeXN0ZW0gaW5vZGUgZGF0YSBpbiBtZW1vcnkKLSAqLwotc3RydWN0IGV4dDRfaW5vZGVfaW5mbyB7Ci0JX19sZTMyCWlfZGF0YVsxNV07CS8qIHVuY29udmVydGVkICovCi0JX191MzIJaV9mbGFnczsKLQlleHQ0X2ZzYmxrX3QJaV9maWxlX2FjbDsKLQlfX3UzMglpX2R0aW1lOwotCi0JLyoKLQkgKiBpX2Jsb2NrX2dyb3VwIGlzIHRoZSBudW1iZXIgb2YgdGhlIGJsb2NrIGdyb3VwIHdoaWNoIGNvbnRhaW5zCi0JICogdGhpcyBmaWxlJ3MgaW5vZGUuICBDb25zdGFudCBhY3Jvc3MgdGhlIGxpZmV0aW1lIG9mIHRoZSBpbm9kZSwKLQkgKiBpdCBpcyB1ZWQgZm9yIG1ha2luZyBibG9jayBhbGxvY2F0aW9uIGRlY2lzaW9ucyAtIHdlIHRyeSB0bwotCSAqIHBsYWNlIGEgZmlsZSdzIGRhdGEgYmxvY2tzIG5lYXIgaXRzIGlub2RlIGJsb2NrLCBhbmQgbmV3IGlub2RlcwotCSAqIG5lYXIgdG8gdGhlaXIgcGFyZW50IGRpcmVjdG9yeSdzIGlub2RlLgotCSAqLwotCWV4dDRfZ3JvdXBfdAlpX2Jsb2NrX2dyb3VwOwotCV9fdTMyCWlfc3RhdGU7CQkvKiBEeW5hbWljIHN0YXRlIGZsYWdzIGZvciBleHQ0ICovCi0KLQlleHQ0X2xibGtfdAkJaV9kaXJfc3RhcnRfbG9va3VwOwotI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1hBVFRSCi0JLyoKLQkgKiBFeHRlbmRlZCBhdHRyaWJ1dGVzIGNhbiBiZSByZWFkIGluZGVwZW5kZW50bHkgb2YgdGhlIG1haW4gZmlsZQotCSAqIGRhdGEuIFRha2luZyBpX211dGV4IGV2ZW4gd2hlbiByZWFkaW5nIHdvdWxkIGNhdXNlIGNvbnRlbnRpb24KLQkgKiBiZXR3ZWVuIHJlYWRlcnMgb2YgRUFzIGFuZCB3cml0ZXJzIG9mIHJlZ3VsYXIgZmlsZSBkYXRhLCBzbwotCSAqIGluc3RlYWQgd2Ugc3luY2hyb25pemUgb24geGF0dHJfc2VtIHdoZW4gcmVhZGluZyBvciBjaGFuZ2luZwotCSAqIEVBcy4KLQkgKi8KLQlzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX3NlbTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTAotCXN0cnVjdCBwb3NpeF9hY2wJKmlfYWNsOwotCXN0cnVjdCBwb3NpeF9hY2wJKmlfZGVmYXVsdF9hY2w7Ci0jZW5kaWYKLQotCXN0cnVjdCBsaXN0X2hlYWQgaV9vcnBoYW47CS8qIHVubGlua2VkIGJ1dCBvcGVuIGlub2RlcyAqLwotCi0JLyoKLQkgKiBpX2Rpc2tzaXplIGtlZXBzIHRyYWNrIG9mIHdoYXQgdGhlIGlub2RlIHNpemUgaXMgT04gRElTSywgbm90Ci0JICogaW4gbWVtb3J5LiAgRHVyaW5nIHRydW5jYXRlLCBpX3NpemUgaXMgc2V0IHRvIHRoZSBuZXcgc2l6ZSBieQotCSAqIHRoZSBWRlMgcHJpb3IgdG8gY2FsbGluZyBleHQ0X3RydW5jYXRlKCksIGJ1dCB0aGUgZmlsZXN5c3RlbSB3b24ndAotCSAqIHNldCBpX2Rpc2tzaXplIHRvIDAgdW50aWwgdGhlIHRydW5jYXRlIGlzIGFjdHVhbGx5IHVuZGVyIHdheS4KLQkgKgotCSAqIFRoZSBpbnRlbnQgaXMgdGhhdCBpX2Rpc2tzaXplIGFsd2F5cyByZXByZXNlbnRzIHRoZSBibG9ja3Mgd2hpY2gKLQkgKiBhcmUgdXNlZCBieSB0aGlzIGZpbGUuICBUaGlzIGFsbG93cyByZWNvdmVyeSB0byByZXN0YXJ0IHRydW5jYXRlCi0JICogb24gb3JwaGFucyBpZiB3ZSBjcmFzaCBkdXJpbmcgdHJ1bmNhdGUuICBXZSBhY3R1YWxseSB3cml0ZSBpX2Rpc2tzaXplCi0JICogaW50byB0aGUgb24tZGlzayBpbm9kZSB3aGVuIHdyaXRpbmcgaW5vZGVzIG91dCwgaW5zdGVhZCBvZiBpX3NpemUuCi0JICoKLQkgKiBUaGUgb25seSB0aW1lIHdoZW4gaV9kaXNrc2l6ZSBhbmQgaV9zaXplIG1heSBiZSBkaWZmZXJlbnQgaXMgd2hlbgotCSAqIGEgdHJ1bmNhdGUgaXMgaW4gcHJvZ3Jlc3MuICBUaGUgb25seSB0aGluZ3Mgd2hpY2ggY2hhbmdlIGlfZGlza3NpemUKLQkgKiBhcmUgZXh0NF9nZXRfYmxvY2sgKGdyb3d0aCkgYW5kIGV4dDRfdHJ1bmNhdGUgKHNocmlua3RoKS4KLQkgKi8KLQlsb2ZmX3QJaV9kaXNrc2l6ZTsKLQotCS8qCi0JICogaV9kYXRhX3NlbSBpcyBmb3Igc2VyaWFsaXNpbmcgZXh0NF90cnVuY2F0ZSgpIGFnYWluc3QKLQkgKiBleHQ0X2dldGJsb2NrKCkuICBJbiB0aGUgMi40IGV4dDIgZGVzaWduLCBncmVhdCBjaHVua3Mgb2YgaW5vZGUncwotCSAqIGRhdGEgdHJlZSBhcmUgY2hvcHBlZCBvZmYgZHVyaW5nIHRydW5jYXRlLiBXZSBjYW4ndCBkbyB0aGF0IGluCi0JICogZXh0NCBiZWNhdXNlIHdoZW5ldmVyIHdlIHBlcmZvcm0gaW50ZXJtZWRpYXRlIGNvbW1pdHMgZHVyaW5nCi0JICogdHJ1bmNhdGUsIHRoZSBpbm9kZSBhbmQgYWxsIHRoZSBtZXRhZGF0YSBibG9ja3MgKm11c3QqIGJlIGluIGEKLQkgKiBjb25zaXN0ZW50IHN0YXRlIHdoaWNoIGFsbG93cyB0cnVuY2F0aW9uIG9mIHRoZSBvcnBoYW5zIHRvIHJlc3RhcnQKLQkgKiBkdXJpbmcgcmVjb3ZlcnkuICBIZW5jZSB3ZSBtdXN0IGZpeCB0aGUgZ2V0X2Jsb2NrLXZzLXRydW5jYXRlIHJhY2UKLQkgKiBieSBvdGhlciBtZWFucywgc28gd2UgaGF2ZSBpX2RhdGFfc2VtLgotCSAqLwotCXN0cnVjdCByd19zZW1hcGhvcmUgaV9kYXRhX3NlbTsKLQlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwotCXN0cnVjdCBqYmQyX2lub2RlIGppbm9kZTsKLQotCXN0cnVjdCBleHQ0X2V4dF9jYWNoZSBpX2NhY2hlZF9leHRlbnQ7Ci0JLyoKLQkgKiBGaWxlIGNyZWF0aW9uIHRpbWUuIEl0cyBmdW5jdGlvbiBpcyBzYW1lIGFzIHRoYXQgb2YKLQkgKiBzdHJ1Y3QgdGltZXNwZWMgaV97YSxjLG19dGltZSBpbiB0aGUgZ2VuZXJpYyBpbm9kZS4KLQkgKi8KLQlzdHJ1Y3QgdGltZXNwZWMgaV9jcnRpbWU7Ci0KLQkvKiBtYmFsbG9jICovCi0Jc3RydWN0IGxpc3RfaGVhZCBpX3ByZWFsbG9jX2xpc3Q7Ci0Jc3BpbmxvY2tfdCBpX3ByZWFsbG9jX2xvY2s7Ci0KLQkvKiBpYWxsb2MgKi8KLQlleHQ0X2dyb3VwX3QJaV9sYXN0X2FsbG9jX2dyb3VwOwotCi0JLyogYWxsb2NhdGlvbiByZXNlcnZhdGlvbiBpbmZvIGZvciBkZWxhbGxvYyAqLwotCXVuc2lnbmVkIGludCBpX3Jlc2VydmVkX2RhdGFfYmxvY2tzOwotCXVuc2lnbmVkIGludCBpX3Jlc2VydmVkX21ldGFfYmxvY2tzOwotCXVuc2lnbmVkIGludCBpX2FsbG9jYXRlZF9tZXRhX2Jsb2NrczsKLQl1bnNpZ25lZCBzaG9ydCBpX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWc7Ci0KLQkvKiBvbi1kaXNrIGFkZGl0aW9uYWwgbGVuZ3RoICovCi0JX191MTYgaV9leHRyYV9pc2l6ZTsKLQotCXNwaW5sb2NrX3QgaV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrOwotfTsKLQotI2VuZGlmCS8qIF9FWFQ0X0kgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NF9zYi5oIGIvZnMvZXh0NC9leHQ0X3NiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjcxZmUuLjAwMDAwMDAKLS0tIGEvZnMvZXh0NC9leHQ0X3NiLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqICBleHQ0X3NiLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKLSAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKLSAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCi0gKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCi0gKgotICogIGZyb20KLSAqCi0gKiAgbGludXgvaW5jbHVkZS9saW51eC9taW5peF9mc19zYi5oCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKLSAqLwotCi0jaWZuZGVmIF9FWFQ0X1NCCi0jZGVmaW5lIF9FWFQ0X1NCCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYmxvY2tncm91cF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1X2NvdW50ZXIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgotCi0vKgotICogZm91cnRoIGV4dGVuZGVkLWZzIHN1cGVyLWJsb2NrIGRhdGEgaW4gbWVtb3J5Ci0gKi8KLXN0cnVjdCBleHQ0X3NiX2luZm8gewotCXVuc2lnbmVkIGxvbmcgc19kZXNjX3NpemU7CS8qIFNpemUgb2YgYSBncm91cCBkZXNjcmlwdG9yIGluIGJ5dGVzICovCi0JdW5zaWduZWQgbG9uZyBzX2lub2Rlc19wZXJfYmxvY2s7LyogTnVtYmVyIG9mIGlub2RlcyBwZXIgYmxvY2sgKi8KLQl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX3Blcl9ncm91cDsvKiBOdW1iZXIgb2YgYmxvY2tzIGluIGEgZ3JvdXAgKi8KLQl1bnNpZ25lZCBsb25nIHNfaW5vZGVzX3Blcl9ncm91cDsvKiBOdW1iZXIgb2YgaW5vZGVzIGluIGEgZ3JvdXAgKi8KLQl1bnNpZ25lZCBsb25nIHNfaXRiX3Blcl9ncm91cDsJLyogTnVtYmVyIG9mIGlub2RlIHRhYmxlIGJsb2NrcyBwZXIgZ3JvdXAgKi8KLQl1bnNpZ25lZCBsb25nIHNfZ2RiX2NvdW50OwkvKiBOdW1iZXIgb2YgZ3JvdXAgZGVzY3JpcHRvciBibG9ja3MgKi8KLQl1bnNpZ25lZCBsb25nIHNfZGVzY19wZXJfYmxvY2s7CS8qIE51bWJlciBvZiBncm91cCBkZXNjcmlwdG9ycyBwZXIgYmxvY2sgKi8KLQlleHQ0X2dyb3VwX3Qgc19ncm91cHNfY291bnQ7CS8qIE51bWJlciBvZiBncm91cHMgaW4gdGhlIGZzICovCi0JdW5zaWduZWQgbG9uZyBzX292ZXJoZWFkX2xhc3Q7ICAvKiBMYXN0IGNhbGN1bGF0ZWQgb3ZlcmhlYWQgKi8KLQl1bnNpZ25lZCBsb25nIHNfYmxvY2tzX2xhc3Q7ICAgIC8qIExhc3Qgc2VlbiBibG9jayBjb3VudCAqLwotCWxvZmZfdCBzX2JpdG1hcF9tYXhieXRlczsJLyogbWF4IGJ5dGVzIGZvciBiaXRtYXAgZmlsZXMgKi8KLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsJLyogQnVmZmVyIGNvbnRhaW5pbmcgdGhlIHN1cGVyIGJsb2NrICovCi0Jc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKnNfZXM7CS8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrIGluIHRoZSBidWZmZXIgKi8KLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipzX2dyb3VwX2Rlc2M7Ci0JdW5zaWduZWQgbG9uZyAgc19tb3VudF9vcHQ7Ci0JZXh0NF9mc2Jsa190IHNfc2JfYmxvY2s7Ci0JdWlkX3Qgc19yZXN1aWQ7Ci0JZ2lkX3Qgc19yZXNnaWQ7Ci0JdW5zaWduZWQgc2hvcnQgc19tb3VudF9zdGF0ZTsKLQl1bnNpZ25lZCBzaG9ydCBzX3BhZDsKLQlpbnQgc19hZGRyX3Blcl9ibG9ja19iaXRzOwotCWludCBzX2Rlc2NfcGVyX2Jsb2NrX2JpdHM7Ci0JaW50IHNfaW5vZGVfc2l6ZTsKLQlpbnQgc19maXJzdF9pbm87Ci0JdW5zaWduZWQgaW50IHNfaW5vZGVfcmVhZGFoZWFkX2Jsa3M7Ci0Jc3BpbmxvY2tfdCBzX25leHRfZ2VuX2xvY2s7Ci0JdTMyIHNfbmV4dF9nZW5lcmF0aW9uOwotCXUzMiBzX2hhc2hfc2VlZFs0XTsKLQlpbnQgc19kZWZfaGFzaF92ZXJzaW9uOwotCWludCBzX2hhc2hfdW5zaWduZWQ7CS8qIDMgaWYgaGFzaCBzaG91bGQgYmUgc2lnbmVkLCAwIGlmIG5vdCAqLwotCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2ZyZWVibG9ja3NfY291bnRlcjsKLQlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgc19mcmVlaW5vZGVzX2NvdW50ZXI7Ci0Jc3RydWN0IHBlcmNwdV9jb3VudGVyIHNfZGlyc19jb3VudGVyOwotCXN0cnVjdCBwZXJjcHVfY291bnRlciBzX2RpcnR5YmxvY2tzX2NvdW50ZXI7Ci0Jc3RydWN0IGJsb2NrZ3JvdXBfbG9jayAqc19ibG9ja2dyb3VwX2xvY2s7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzX3Byb2M7Ci0Jc3RydWN0IGtvYmplY3Qgc19rb2JqOwotCXN0cnVjdCBjb21wbGV0aW9uIHNfa29ial91bnJlZ2lzdGVyOwotCi0JLyogSm91cm5hbGluZyAqLwotCXN0cnVjdCBpbm9kZSAqc19qb3VybmFsX2lub2RlOwotCXN0cnVjdCBqb3VybmFsX3MgKnNfam91cm5hbDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHNfb3JwaGFuOwotCXVuc2lnbmVkIGxvbmcgc19jb21taXRfaW50ZXJ2YWw7Ci0JdTMyIHNfbWF4X2JhdGNoX3RpbWU7Ci0JdTMyIHNfbWluX2JhdGNoX3RpbWU7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqam91cm5hbF9iZGV2OwotI2lmZGVmIENPTkZJR19KQkQyX0RFQlVHCi0Jc3RydWN0IHRpbWVyX2xpc3QgdHVybl9yb190aW1lcjsJLyogRm9yIHR1cm5pbmcgcmVhZC1vbmx5IChjcmFzaCBzaW11bGF0aW9uKSAqLwotCXdhaXRfcXVldWVfaGVhZF90IHJvX3dhaXRfcXVldWU7CS8qIEZvciBwZW9wbGUgd2FpdGluZyBmb3IgdGhlIGZzIHRvIGdvIHJlYWQtb25seSAqLwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1FVT1RBCi0JY2hhciAqc19xZl9uYW1lc1tNQVhRVU9UQVNdOwkJLyogTmFtZXMgb2YgcXVvdGEgZmlsZXMgd2l0aCBqb3VybmFsbGVkIHF1b3RhICovCi0JaW50IHNfanF1b3RhX2ZtdDsJCQkvKiBGb3JtYXQgb2YgcXVvdGEgdG8gdXNlICovCi0jZW5kaWYKLQl1bnNpZ25lZCBpbnQgc193YW50X2V4dHJhX2lzaXplOyAvKiBOZXcgaW5vZGVzIHNob3VsZCByZXNlcnZlICMgYnl0ZXMgKi8KLQotI2lmZGVmIEVYVEVOVFNfU1RBVFMKLQkvKiBleHQ0IGV4dGVudHMgc3RhdHMgKi8KLQl1bnNpZ25lZCBsb25nIHNfZXh0X21pbjsKLQl1bnNpZ25lZCBsb25nIHNfZXh0X21heDsKLQl1bnNpZ25lZCBsb25nIHNfZGVwdGhfbWF4OwotCXNwaW5sb2NrX3Qgc19leHRfc3RhdHNfbG9jazsKLQl1bnNpZ25lZCBsb25nIHNfZXh0X2Jsb2NrczsKLQl1bnNpZ25lZCBsb25nIHNfZXh0X2V4dGVudHM7Ci0jZW5kaWYKLQotCS8qIGZvciBidWRkeSBhbGxvY2F0b3IgKi8KLQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICoqKnNfZ3JvdXBfaW5mbzsKLQlzdHJ1Y3QgaW5vZGUgKnNfYnVkZHlfY2FjaGU7Ci0JbG9uZyBzX2Jsb2Nrc19yZXNlcnZlZDsKLQlzcGlubG9ja190IHNfcmVzZXJ2ZV9sb2NrOwotCXNwaW5sb2NrX3Qgc19tZF9sb2NrOwotCXRpZF90IHNfbGFzdF90cmFuc2FjdGlvbjsKLQl1bnNpZ25lZCBzaG9ydCAqc19tYl9vZmZzZXRzOwotCXVuc2lnbmVkIGludCAqc19tYl9tYXhzOwotCi0JLyogdHVuYWJsZXMgKi8KLQl1bnNpZ25lZCBsb25nIHNfc3RyaXBlOwotCXVuc2lnbmVkIGludCBzX21iX3N0cmVhbV9yZXF1ZXN0OwotCXVuc2lnbmVkIGludCBzX21iX21heF90b19zY2FuOwotCXVuc2lnbmVkIGludCBzX21iX21pbl90b19zY2FuOwotCXVuc2lnbmVkIGludCBzX21iX3N0YXRzOwotCXVuc2lnbmVkIGludCBzX21iX29yZGVyMl9yZXFzOwotCXVuc2lnbmVkIGludCBzX21iX2dyb3VwX3ByZWFsbG9jOwotCS8qIHdoZXJlIGxhc3QgYWxsb2NhdGlvbiB3YXMgZG9uZSAtIGZvciBzdHJlYW0gYWxsb2NhdGlvbiAqLwotCXVuc2lnbmVkIGxvbmcgc19tYl9sYXN0X2dyb3VwOwotCXVuc2lnbmVkIGxvbmcgc19tYl9sYXN0X3N0YXJ0OwotCi0JLyogaGlzdG9yeSB0byBkZWJ1ZyBwb2xpY3kgKi8KLQlzdHJ1Y3QgZXh0NF9tYl9oaXN0b3J5ICpzX21iX2hpc3Rvcnk7Ci0JaW50IHNfbWJfaGlzdG9yeV9jdXI7Ci0JaW50IHNfbWJfaGlzdG9yeV9tYXg7Ci0JaW50IHNfbWJfaGlzdG9yeV9udW07Ci0Jc3BpbmxvY2tfdCBzX21iX2hpc3RvcnlfbG9jazsKLQlpbnQgc19tYl9oaXN0b3J5X2ZpbHRlcjsKLQotCS8qIHN0YXRzIGZvciBidWRkeSBhbGxvY2F0b3IgKi8KLQlzcGlubG9ja190IHNfbWJfcGFfbG9jazsKLQlhdG9taWNfdCBzX2JhbF9yZXFzOwkvKiBudW1iZXIgb2YgcmVxcyB3aXRoIGxlbiA+IDEgKi8KLQlhdG9taWNfdCBzX2JhbF9zdWNjZXNzOwkvKiB3ZSBmb3VuZCBsb25nIGVub3VnaCBjaHVua3MgKi8KLQlhdG9taWNfdCBzX2JhbF9hbGxvY2F0ZWQ7CS8qIGluIGJsb2NrcyAqLwotCWF0b21pY190IHNfYmFsX2V4X3NjYW5uZWQ7CS8qIHRvdGFsIGV4dGVudHMgc2Nhbm5lZCAqLwotCWF0b21pY190IHNfYmFsX2dvYWxzOwkvKiBnb2FsIGhpdHMgKi8KLQlhdG9taWNfdCBzX2JhbF9icmVha3M7CS8qIHRvbyBsb25nIHNlYXJjaGVzICovCi0JYXRvbWljX3Qgc19iYWxfMm9yZGVyczsJLyogMl5vcmRlciBoaXRzICovCi0Jc3BpbmxvY2tfdCBzX2JhbF9sb2NrOwotCXVuc2lnbmVkIGxvbmcgc19tYl9idWRkaWVzX2dlbmVyYXRlZDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgc19tYl9nZW5lcmF0aW9uX3RpbWU7Ci0JYXRvbWljX3Qgc19tYl9sb3N0X2NodW5rczsKLQlhdG9taWNfdCBzX21iX3ByZWFsbG9jYXRlZDsKLQlhdG9taWNfdCBzX21iX2Rpc2NhcmRlZDsKLQotCS8qIGxvY2FsaXR5IGdyb3VwcyAqLwotCXN0cnVjdCBleHQ0X2xvY2FsaXR5X2dyb3VwICpzX2xvY2FsaXR5X2dyb3VwczsKLQotCS8qIGZvciB3cml0ZSBzdGF0aXN0aWNzICovCi0JdW5zaWduZWQgbG9uZyBzX3NlY3RvcnNfd3JpdHRlbl9zdGFydDsKLQl1NjQgc19rYnl0ZXNfd3JpdHRlbjsKLQotCXVuc2lnbmVkIGludCBzX2xvZ19ncm91cHNfcGVyX2ZsZXg7Ci0Jc3RydWN0IGZsZXhfZ3JvdXBzICpzX2ZsZXhfZ3JvdXBzOwotfTsKLQotc3RhdGljIGlubGluZSBzcGlubG9ja190ICoKLXNiX2JnbF9sb2NrKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwgdW5zaWduZWQgaW50IGJsb2NrX2dyb3VwKQotewotCXJldHVybiBiZ2xfbG9ja19wdHIoc2JpLT5zX2Jsb2NrZ3JvdXBfbG9jaywgYmxvY2tfZ3JvdXApOwotfQotCi0jZW5kaWYJLyogX0VYVDRfU0IgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0ZW50cy5jIGIvZnMvZXh0NC9leHRlbnRzLmMKaW5kZXggZTNhNTVlYi4uMjU5M2Y3NCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHRlbnRzLmMKKysrIGIvZnMvZXh0NC9leHRlbnRzLmMKQEAgLTMyNiwzMiArMzI2LDE4IEBACiAKIHN0YXRpYyBpbnQgZXh0NF92YWxpZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDRfZXh0ZW50ICpleHQpCiB7Ci0JZXh0NF9mc2Jsa190IGJsb2NrID0gZXh0X3BibG9jayhleHQpLCB2YWxpZF9ibG9jazsKKwlleHQ0X2ZzYmxrX3QgYmxvY2sgPSBleHRfcGJsb2NrKGV4dCk7CiAJaW50IGxlbiA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKGV4dCk7Ci0Jc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXM7CiAKLQl2YWxpZF9ibG9jayA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKLQkJRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZ2RiX2NvdW50OwotCWlmICh1bmxpa2VseShibG9jayA8PSB2YWxpZF9ibG9jayB8fAotCQkgICAgICgoYmxvY2sgKyBsZW4pID4gZXh0NF9ibG9ja3NfY291bnQoZXMpKSkpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIDE7CisJcmV0dXJuIGV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwgYmxvY2ssIGxlbik7CiB9CiAKIHN0YXRpYyBpbnQgZXh0NF92YWxpZF9leHRlbnRfaWR4KHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJc3RydWN0IGV4dDRfZXh0ZW50X2lkeCAqZXh0X2lkeCkKIHsKLQlleHQ0X2ZzYmxrX3QgYmxvY2sgPSBpZHhfcGJsb2NrKGV4dF9pZHgpLCB2YWxpZF9ibG9jazsKLQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lczsKKwlleHQ0X2ZzYmxrX3QgYmxvY2sgPSBpZHhfcGJsb2NrKGV4dF9pZHgpOwogCi0JdmFsaWRfYmxvY2sgPSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCi0JCUVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2dkYl9jb3VudDsKLQlpZiAodW5saWtlbHkoYmxvY2sgPD0gdmFsaWRfYmxvY2sgfHwKLQkJICAgICAoYmxvY2sgPj0gZXh0NF9ibG9ja3NfY291bnQoZXMpKSkpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIDE7CisJcmV0dXJuIGV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwgYmxvY2ssIDEpOwogfQogCiBzdGF0aWMgaW50IGV4dDRfdmFsaWRfZXh0ZW50X2VudHJpZXMoc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTIwOTcsMTIgKzIwODMsMTYgQEAKIAlleCA9IEVYVF9MQVNUX0VYVEVOVChlaCk7CiAKIAlleF9lZV9ibG9jayA9IGxlMzJfdG9fY3B1KGV4LT5lZV9ibG9jayk7Ci0JaWYgKGV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQoZXgpKQotCQl1bmluaXRpYWxpemVkID0gMTsKIAlleF9lZV9sZW4gPSBleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihleCk7CiAKIAl3aGlsZSAoZXggPj0gRVhUX0ZJUlNUX0VYVEVOVChlaCkgJiYKIAkJCWV4X2VlX2Jsb2NrICsgZXhfZWVfbGVuID4gc3RhcnQpIHsKKworCQlpZiAoZXh0NF9leHRfaXNfdW5pbml0aWFsaXplZChleCkpCisJCQl1bmluaXRpYWxpemVkID0gMTsKKwkJZWxzZQorCQkJdW5pbml0aWFsaXplZCA9IDA7CisKIAkJZXh0X2RlYnVnKCJyZW1vdmUgZXh0ICVsdToldVxuIiwgZXhfZWVfYmxvY2ssIGV4X2VlX2xlbik7CiAJCXBhdGhbZGVwdGhdLnBfZXh0ID0gZXg7CiAKQEAgLTI3ODQsNyArMjc3NCw3IEBACiBpbnQgZXh0NF9leHRfZ2V0X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJZXh0NF9sYmxrX3QgaWJsb2NrLAogCQkJdW5zaWduZWQgaW50IG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAotCQkJaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSkKKwkJCWludCBmbGFncykKIHsKIAlzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCA9IE5VTEw7CiAJc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CkBAIC0yNzkzLDcgKzI3ODMsNiBAQAogCWludCBlcnIgPSAwLCBkZXB0aCwgcmV0LCBjYWNoZV90eXBlOwogCXVuc2lnbmVkIGludCBhbGxvY2F0ZWQgPSAwOwogCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKLQlsb2ZmX3QgZGlza3NpemU7CiAKIAlfX2NsZWFyX2JpdChCSF9OZXcsICZiaF9yZXN1bHQtPmJfc3RhdGUpOwogCWV4dF9kZWJ1ZygiYmxvY2tzICV1LyV1IHJlcXVlc3RlZCBmb3IgaW5vZGUgJXVcbiIsCkBAIC0yODAzLDcgKzI3OTIsNyBAQAogCWNhY2hlX3R5cGUgPSBleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgaWJsb2NrLCAmbmV3ZXgpOwogCWlmIChjYWNoZV90eXBlKSB7CiAJCWlmIChjYWNoZV90eXBlID09IEVYVDRfRVhUX0NBQ0hFX0dBUCkgewotCQkJaWYgKCFjcmVhdGUpIHsKKwkJCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKSB7CiAJCQkJLyoKIAkJCQkgKiBibG9jayBpc24ndCBhbGxvY2F0ZWQgeWV0IGFuZAogCQkJCSAqIHVzZXIgZG9lc24ndCB3YW50IHRvIGFsbG9jYXRlIGl0CkBAIC0yODY5LDkgKzI4NTgsMTEgQEAKIAkJCQkJCQlFWFQ0X0VYVF9DQUNIRV9FWFRFTlQpOwogCQkJCWdvdG8gb3V0OwogCQkJfQotCQkJaWYgKGNyZWF0ZSA9PSBFWFQ0X0NSRUFURV9VTklOSVRJQUxJWkVEX0VYVCkKKwkJCWlmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19VTklOSVRfRVhUKQogCQkJCWdvdG8gb3V0OwotCQkJaWYgKCFjcmVhdGUpIHsKKwkJCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKSB7CisJCQkJaWYgKGFsbG9jYXRlZCA+IG1heF9ibG9ja3MpCisJCQkJCWFsbG9jYXRlZCA9IG1heF9ibG9ja3M7CiAJCQkJLyoKIAkJCQkgKiBXZSBoYXZlIGJsb2NrcyByZXNlcnZlZCBhbHJlYWR5LiAgV2UKIAkJCQkgKiByZXR1cm4gYWxsb2NhdGVkIGJsb2NrcyBzbyB0aGF0IGRlbGFsbG9jCkBAIC0yODc5LDggKzI4NzAsNiBAQAogCQkJCSAqIHRoZSBidWZmZXIgaGVhZCB3aWxsIGJlIHVubWFwcGVkIHNvIHRoYXQKIAkJCQkgKiBhIHJlYWQgZnJvbSB0aGUgYmxvY2sgcmV0dXJucyAwcy4KIAkJCQkgKi8KLQkJCQlpZiAoYWxsb2NhdGVkID4gbWF4X2Jsb2NrcykKLQkJCQkJYWxsb2NhdGVkID0gbWF4X2Jsb2NrczsKIAkJCQlzZXRfYnVmZmVyX3Vud3JpdHRlbihiaF9yZXN1bHQpOwogCQkJCWJoX3Jlc3VsdC0+Yl9iZGV2ID0gaW5vZGUtPmlfc2ItPnNfYmRldjsKIAkJCQliaF9yZXN1bHQtPmJfYmxvY2tuciA9IG5ld2Jsb2NrOwpAQCAtMjkwMyw3ICsyODkyLDcgQEAKIAkgKiByZXF1ZXN0ZWQgYmxvY2sgaXNuJ3QgYWxsb2NhdGVkIHlldDsKIAkgKiB3ZSBjb3VsZG4ndCB0cnkgdG8gY3JlYXRlIGJsb2NrIGlmIGNyZWF0ZSBmbGFnIGlzIHplcm8KIAkgKi8KLQlpZiAoIWNyZWF0ZSkgeworCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKSB7CiAJCS8qCiAJCSAqIHB1dCBqdXN0IGZvdW5kIGdhcCBpbnRvIGNhY2hlIHRvIHNwZWVkIHVwCiAJCSAqIHN1YnNlcXVlbnQgcmVxdWVzdHMKQEAgLTI5MzIsMTAgKzI5MjEsMTAgQEAKIAkgKiBFWFRfVU5JTklUX01BWF9MRU4uCiAJICovCiAJaWYgKG1heF9ibG9ja3MgPiBFWFRfSU5JVF9NQVhfTEVOICYmCi0JICAgIGNyZWF0ZSAhPSBFWFQ0X0NSRUFURV9VTklOSVRJQUxJWkVEX0VYVCkKKwkgICAgIShmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19VTklOSVRfRVhUKSkKIAkJbWF4X2Jsb2NrcyA9IEVYVF9JTklUX01BWF9MRU47CiAJZWxzZSBpZiAobWF4X2Jsb2NrcyA+IEVYVF9VTklOSVRfTUFYX0xFTiAmJgotCQkgY3JlYXRlID09IEVYVDRfQ1JFQVRFX1VOSU5JVElBTElaRURfRVhUKQorCQkgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX1VOSU5JVF9FWFQpKQogCQltYXhfYmxvY2tzID0gRVhUX1VOSU5JVF9NQVhfTEVOOwogCiAJLyogQ2hlY2sgaWYgd2UgY2FuIHJlYWxseSBpbnNlcnQgKGlibG9jayk6OihpYmxvY2srbWF4X2Jsb2NrcykgZXh0ZW50ICovCkBAIC0yOTY2LDcgKzI5NTUsNyBAQAogCS8qIHRyeSB0byBpbnNlcnQgbmV3IGV4dGVudCBpbnRvIGZvdW5kIGxlYWYgYW5kIHJldHVybiAqLwogCWV4dDRfZXh0X3N0b3JlX3BibG9jaygmbmV3ZXgsIG5ld2Jsb2NrKTsKIAluZXdleC5lZV9sZW4gPSBjcHVfdG9fbGUxNihhci5sZW4pOwotCWlmIChjcmVhdGUgPT0gRVhUNF9DUkVBVEVfVU5JTklUSUFMSVpFRF9FWFQpICAvKiBNYXJrIHVuaW5pdGlhbGl6ZWQgKi8KKwlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfVU5JTklUX0VYVCkgIC8qIE1hcmsgdW5pbml0aWFsaXplZCAqLwogCQlleHQ0X2V4dF9tYXJrX3VuaW5pdGlhbGl6ZWQoJm5ld2V4KTsKIAllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZuZXdleCk7CiAJaWYgKGVycikgewpAQCAtMjk4MywxOCArMjk3MiwxMCBAQAogCW5ld2Jsb2NrID0gZXh0X3BibG9jaygmbmV3ZXgpOwogCWFsbG9jYXRlZCA9IGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKCZuZXdleCk7CiBvdXRuZXc6Ci0JaWYgKGV4dGVuZF9kaXNrc2l6ZSkgewotCQlkaXNrc2l6ZSA9ICgobG9mZl90KSBpYmxvY2sgKyBhci5sZW4pIDw8IGlub2RlLT5pX2Jsa2JpdHM7Ci0JCWlmIChkaXNrc2l6ZSA+IGlfc2l6ZV9yZWFkKGlub2RlKSkKLQkJCWRpc2tzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQlpZiAoZGlza3NpemUgPiBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKQotCQkJRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGRpc2tzaXplOwotCX0KLQogCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CiAKIAkvKiBDYWNoZSBvbmx5IHdoZW4gaXQgaXMgX25vdF8gYW4gdW5pbml0aWFsaXplZCBleHRlbnQgKi8KLQlpZiAoY3JlYXRlICE9IEVYVDRfQ1JFQVRFX1VOSU5JVElBTElaRURfRVhUKQorCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfVU5JTklUX0VYVCkgPT0gMCkKIAkJZXh0NF9leHRfcHV0X2luX2NhY2hlKGlub2RlLCBpYmxvY2ssIGFsbG9jYXRlZCwgbmV3YmxvY2ssCiAJCQkJCQlFWFQ0X0VYVF9DQUNIRV9FWFRFTlQpOwogb3V0OgpAQCAtMzE1MCw5ICszMTMxLDEwIEBACiAJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CiAJCQlicmVhazsKIAkJfQotCQlyZXQgPSBleHQ0X2dldF9ibG9ja3Nfd3JhcChoYW5kbGUsIGlub2RlLCBibG9jaywKLQkJCQkJICBtYXhfYmxvY2tzLCAmbWFwX2JoLAotCQkJCQkgIEVYVDRfQ1JFQVRFX1VOSU5JVElBTElaRURfRVhULCAwLCAwKTsKKwkJbWFwX2JoLmJfc3RhdGUgPSAwOworCQlyZXQgPSBleHQ0X2dldF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmxvY2ssCisJCQkJICAgICAgbWF4X2Jsb2NrcywgJm1hcF9iaCwKKwkJCQkgICAgICBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFX1VOSU5JVF9FWFQpOwogCQlpZiAocmV0IDw9IDApIHsKICNpZmRlZiBFWFQ0RlNfREVCVUcKIAkJCVdBUk5fT04ocmV0IDw9IDApOwpAQCAtMzE5NSw3ICszMTc3LDcgQEAKIAkJICAgICAgIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGZpZW1hcF9leHRlbnRfaW5mbyAqZmllaW5mbyA9IGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBibGtzaXplX2JpdHMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwl1bnNpZ25lZCBjaGFyIGJsa3NpemVfYml0cyA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwogCV9fdTY0CWxvZ2ljYWw7CiAJX191NjQJcGh5c2ljYWw7CiAJX191NjQJbGVuZ3RoOwpAQCAtMzI0Miw5ICszMjI0LDE2IEBACiAJICoKIAkgKiBYWFggdGhpcyBtaWdodCBtaXNzIGEgc2luZ2xlLWJsb2NrIGV4dGVudCBhdCBFWFRfTUFYX0JMT0NLCiAJICovCi0JaWYgKGxvZ2ljYWwgKyBsZW5ndGggLSAxID09IEVYVF9NQVhfQkxPQ0sgfHwKLQkgICAgZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2socGF0aCkgPT0gRVhUX01BWF9CTE9DSykKKwlpZiAoZXh0NF9leHRfbmV4dF9hbGxvY2F0ZWRfYmxvY2socGF0aCkgPT0gRVhUX01BWF9CTE9DSyB8fAorCSAgICBuZXdleC0+ZWNfYmxvY2sgKyBuZXdleC0+ZWNfbGVuIC0gMSA9PSBFWFRfTUFYX0JMT0NLKSB7CisJCWxvZmZfdCBzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCQlsb2ZmX3QgYnMgPSBFWFQ0X0JMT0NLX1NJWkUoaW5vZGUtPmlfc2IpOworCiAJCWZsYWdzIHw9IEZJRU1BUF9FWFRFTlRfTEFTVDsKKwkJaWYgKChmbGFncyAmIEZJRU1BUF9FWFRFTlRfREVMQUxMT0MpICYmCisJCSAgICBsb2dpY2FsK2xlbmd0aCA+IHNpemUpCisJCQlsZW5ndGggPSAoc2l6ZSAtIGxvZ2ljYWwgKyBicyAtIDEpICYgfihicy0xKTsKKwl9CiAKIAllcnJvciA9IGZpZW1hcF9maWxsX25leHRfZXh0ZW50KGZpZWluZm8sIGxvZ2ljYWwsIHBoeXNpY2FsLAogCQkJCQlsZW5ndGgsIGZsYWdzKTsKQEAgLTMzMTgsMTAgKzMzMDcsMTAgQEAKIAkJICogV2FsayB0aGUgZXh0ZW50IHRyZWUgZ2F0aGVyaW5nIGV4dGVudCBpbmZvcm1hdGlvbi4KIAkJICogZXh0NF9leHRfZmllbWFwX2NiIHdpbGwgcHVzaCBleHRlbnRzIGJhY2sgdG8gdXNlci4KIAkJICovCi0JCWRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOworCQlkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOwogCQllcnJvciA9IGV4dDRfZXh0X3dhbGtfc3BhY2UoaW5vZGUsIHN0YXJ0X2JsaywgbGVuX2Jsa3MsCiAJCQkJCSAgZXh0NF9leHRfZmllbWFwX2NiLCBmaWVpbmZvKTsKLQkJdXBfd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pOworCQl1cF9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKTsKIAl9CiAKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2dyb3VwLmggYi9mcy9leHQ0L2dyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzBhOGQuLjAwMDAwMDAKLS0tIGEvZnMvZXh0NC9ncm91cC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqICBsaW51eC9mcy9leHQ0L2dyb3VwLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQ2x1c3RlciBGaWxlIFN5c3RlbXMsIEluYwotICoKLSAqIEF1dGhvcjogQW5kcmVhcyBEaWxnZXIgPGFkaWxnZXJAY2x1c3RlcmZzLmNvbT4KLSAqLwotCi0jaWZuZGVmIF9MSU5VWF9FWFQ0X0dST1VQX0gKLSNkZWZpbmUgX0xJTlVYX0VYVDRfR1JPVVBfSAotCi1leHRlcm4gX19sZTE2IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwgX191MzIgZ3JvdXAsCi0JCQkJICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwKTsKLWV4dGVybiBpbnQgZXh0NF9ncm91cF9kZXNjX2NzdW1fdmVyaWZ5KHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwgX191MzIgZ3JvdXAsCi0JCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCk7Ci1zdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDRfcmVhZF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkgICAgICBleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXApOwotZXh0ZXJuIHVuc2lnbmVkIGV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCQkgICAgICAgZXh0NF9ncm91cF90IGdyb3VwLAotCQkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjKTsKLSNkZWZpbmUgZXh0NF9mcmVlX2Jsb2Nrc19hZnRlcl9pbml0KHNiLCBncm91cCwgZGVzYykJCQlcCi0JCWV4dDRfaW5pdF9ibG9ja19iaXRtYXAoc2IsIE5VTEwsIGdyb3VwLCBkZXNjKQotZXh0ZXJuIHVuc2lnbmVkIGV4dDRfaW5pdF9pbm9kZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCQkgICAgICAgZXh0NF9ncm91cF90IGdyb3VwLAotCQkJCSAgICAgICBzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjKTsKLWV4dGVybiB2b2lkIG1hcmtfYml0bWFwX2VuZChpbnQgc3RhcnRfYml0LCBpbnQgZW5kX2JpdCwgY2hhciAqYml0bWFwKTsKLSNlbmRpZiAvKiBfTElOVVhfRVhUNF9HUk9VUF9IICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lhbGxvYy5jIGIvZnMvZXh0NC9pYWxsb2MuYwppbmRleCBmMThlMGEwLi4zNzQzYmQ4IDEwMDY0NAotLS0gYS9mcy9leHQ0L2lhbGxvYy5jCisrKyBiL2ZzL2V4dDQvaWFsbG9jLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgogI2luY2x1ZGUgImFjbC5oIgotI2luY2x1ZGUgImdyb3VwLmgiCiAKIC8qCiAgKiBpYWxsb2MuYyBjb250YWlucyB0aGUgaW5vZGVzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiByb3V0aW5lcwpAQCAtMTIzLDE2ICsxMjIsMTYgQEAKIAkJdW5sb2NrX2J1ZmZlcihiaCk7CiAJCXJldHVybiBiaDsKIAl9Ci0Jc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOworCWV4dDRfbG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCWlmIChkZXNjLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfSU5PREVfVU5JTklUKSkgewogCQlleHQ0X2luaXRfaW5vZGVfYml0bWFwKHNiLCBiaCwgYmxvY2tfZ3JvdXAsIGRlc2MpOwogCQlzZXRfYml0bWFwX3VwdG9kYXRlKGJoKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBibG9ja19ncm91cCkpOworCQlleHQ0X3VubG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJcmV0dXJuIGJoOwogCX0KLQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgYmxvY2tfZ3JvdXApKTsKKwlleHQ0X3VubG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CiAJCS8qCiAJCSAqIGlmIG5vdCB1bmluaXQgaWYgYmggaXMgdXB0b2RhdGUsCkBAIC0yNDcsOSArMjQ2LDggQEAKIAkJZ290byBlcnJvcl9yZXR1cm47CiAKIAkvKiBPaywgbm93IHdlIGNhbiBhY3R1YWxseSB1cGRhdGUgdGhlIGlub2RlIGJpdG1hcHMuLiAqLwotCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7Ci0JY2xlYXJlZCA9IGV4dDRfY2xlYXJfYml0KGJpdCwgYml0bWFwX2JoLT5iX2RhdGEpOwotCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKKwljbGVhcmVkID0gZXh0NF9jbGVhcl9iaXRfYXRvbWljKGV4dDRfZ3JvdXBfbG9ja19wdHIoc2IsIGJsb2NrX2dyb3VwKSwKKwkJCQkJYml0LCBiaXRtYXBfYmgtPmJfZGF0YSk7CiAJaWYgKCFjbGVhcmVkKQogCQlleHQ0X2Vycm9yKHNiLCAiZXh0NF9mcmVlX2lub2RlIiwKIAkJCSAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBpbm9kZSAlbHUiLCBpbm8pOwpAQCAtMjYxLDcgKzI1OSw3IEBACiAJCWlmIChmYXRhbCkgZ290byBlcnJvcl9yZXR1cm47CiAKIAkJaWYgKGdkcCkgewotCQkJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKKwkJCWV4dDRfbG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCQkJY291bnQgPSBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBnZHApICsgMTsKIAkJCWV4dDRfZnJlZV9pbm9kZXNfc2V0KHNiLCBnZHAsIGNvdW50KTsKIAkJCWlmIChpc19kaXJlY3RvcnkpIHsKQEAgLTI3Nyw3ICsyNzUsNyBAQAogCQkJfQogCQkJZ2RwLT5iZ19jaGVja3N1bSA9IGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwKIAkJCQkJCQlibG9ja19ncm91cCwgZ2RwKTsKLQkJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKKwkJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJCQlwZXJjcHVfY291bnRlcl9pbmMoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOwogCQkJaWYgKGlzX2RpcmVjdG9yeSkKIAkJCQlwZXJjcHVfY291bnRlcl9kZWMoJnNiaS0+c19kaXJzX2NvdW50ZXIpOwpAQCAtMzE2LDcgKzMxNCw3IEBACiBzdGF0aWMgaW50IGZpbmRfZ3JvdXBfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50LAogCQkJCWV4dDRfZ3JvdXBfdCAqYmVzdF9ncm91cCkKIHsKLQlleHQ0X2dyb3VwX3Qgbmdyb3VwcyA9IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKKwlleHQ0X2dyb3VwX3Qgbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJdW5zaWduZWQgaW50IGZyZWVpLCBhdmVmcmVlaTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjLCAqYmVzdF9kZXNjID0gTlVMTDsKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7CkBAIC0zNDksMTEgKzM0NywxMCBAQAogewogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZmxleF9ncm91cHMgKmZsZXhfZ3JvdXAgPSBzYmktPnNfZmxleF9ncm91cHM7CiAJZXh0NF9ncm91cF90IHBhcmVudF9ncm91cCA9IEVYVDRfSShwYXJlbnQpLT5pX2Jsb2NrX2dyb3VwOwogCWV4dDRfZ3JvdXBfdCBwYXJlbnRfZmJnX2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgcGFyZW50X2dyb3VwKTsKLQlleHQ0X2dyb3VwX3Qgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQ7CisJZXh0NF9ncm91cF90IG5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCWludCBmbGV4X3NpemUgPSBleHQ0X2ZsZXhfYmdfc2l6ZShzYmkpOwogCWV4dDRfZ3JvdXBfdCBiZXN0X2ZsZXggPSBwYXJlbnRfZmJnX2dyb3VwOwogCWludCBibG9ja3NfcGVyX2ZsZXggPSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCAqIGZsZXhfc2l6ZTsKQEAgLTM2Miw3ICszNTksNyBAQAogCWV4dDRfZ3JvdXBfdCBuX2ZiZ19ncm91cHM7CiAJZXh0NF9ncm91cF90IGk7CiAKLQluX2ZiZ19ncm91cHMgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIGZsZXhfc2l6ZSAtIDEpID4+CisJbl9mYmdfZ3JvdXBzID0gKG5ncm91cHMgKyBmbGV4X3NpemUgLSAxKSA+PgogCQlzYmktPnNfbG9nX2dyb3Vwc19wZXJfZmxleDsKIAogZmluZF9jbG9zZV90b19wYXJlbnQ6CkBAIC00MDQsNyArNDAxLDcgQEAKIGZvdW5kX2ZsZXhiZzoKIAlmb3IgKGkgPSBiZXN0X2ZsZXggKiBmbGV4X3NpemU7IGkgPCBuZ3JvdXBzICYmCiAJCSAgICAgaSA8IChiZXN0X2ZsZXggKyAxKSAqIGZsZXhfc2l6ZTsgaSsrKSB7Ci0JCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCAmYmgpOworCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmIChleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHNiLCBkZXNjKSkgewogCQkJKmJlc3RfZ3JvdXAgPSBpOwogCQkJZ290byBvdXQ7CkBAIC00NzgsMjAgKzQ3NSwyMSBAQAogewogCWV4dDRfZ3JvdXBfdCBwYXJlbnRfZ3JvdXAgPSBFWFQ0X0kocGFyZW50KS0+aV9ibG9ja19ncm91cDsKIAlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKLQlleHQ0X2dyb3VwX3Qgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQ7CisJZXh0NF9ncm91cF90IHJlYWxfbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJaW50IGlub2Rlc19wZXJfZ3JvdXAgPSBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpOwogCXVuc2lnbmVkIGludCBmcmVlaSwgYXZlZnJlZWk7CiAJZXh0NF9mc2Jsa190IGZyZWViLCBhdmVmcmVlYjsKIAl1bnNpZ25lZCBpbnQgbmRpcnM7CiAJaW50IG1heF9kaXJzLCBtaW5faW5vZGVzOwogCWV4dDRfZ3JwYmxrX3QgbWluX2Jsb2NrczsKLQlleHQ0X2dyb3VwX3QgaSwgZ3JwLCBnOworCWV4dDRfZ3JvdXBfdCBpLCBncnAsIGcsIG5ncm91cHM7CiAJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZGVzYzsKIAlzdHJ1Y3Qgb3Jsb3Zfc3RhdHMgc3RhdHM7CiAJaW50IGZsZXhfc2l6ZSA9IGV4dDRfZmxleF9iZ19zaXplKHNiaSk7CiAKKwluZ3JvdXBzID0gcmVhbF9uZ3JvdXBzOwogCWlmIChmbGV4X3NpemUgPiAxKSB7Ci0JCW5ncm91cHMgPSAobmdyb3VwcyArIGZsZXhfc2l6ZSAtIDEpID4+CisJCW5ncm91cHMgPSAocmVhbF9uZ3JvdXBzICsgZmxleF9zaXplIC0gMSkgPj4KIAkJCXNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4OwogCQlwYXJlbnRfZ3JvdXAgPj49IHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4OwogCX0KQEAgLTU0Myw3ICs1NDEsNyBAQAogCQkgKi8KIAkJZ3JwICo9IGZsZXhfc2l6ZTsKIAkJZm9yIChpID0gMDsgaSA8IGZsZXhfc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoZ3JwK2kgPj0gc2JpLT5zX2dyb3Vwc19jb3VudCkKKwkJCWlmIChncnAraSA+PSByZWFsX25ncm91cHMpCiAJCQkJYnJlYWs7CiAJCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JwK2ksIE5VTEwpOwogCQkJaWYgKGRlc2MgJiYgZXh0NF9mcmVlX2lub2Rlc19jb3VudChzYiwgZGVzYykpIHsKQEAgLTU4Myw3ICs1ODEsNyBAQAogCX0KIAogZmFsbGJhY2s6Ci0Jbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQ7CisJbmdyb3VwcyA9IHJlYWxfbmdyb3VwczsKIAlhdmVmcmVlaSA9IGZyZWVpIC8gbmdyb3VwczsKIGZhbGxiYWNrX3JldHJ5OgogCXBhcmVudF9ncm91cCA9IEVYVDRfSShwYXJlbnQpLT5pX2Jsb2NrX2dyb3VwOwpAQCAtNjEzLDkgKzYxMSw4IEBACiAJCQkgICAgZXh0NF9ncm91cF90ICpncm91cCwgaW50IG1vZGUpCiB7CiAJZXh0NF9ncm91cF90IHBhcmVudF9ncm91cCA9IEVYVDRfSShwYXJlbnQpLT5pX2Jsb2NrX2dyb3VwOwotCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCWV4dDRfZ3JvdXBfdCBpLCBsYXN0LCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjOwotCWV4dDRfZ3JvdXBfdCBpLCBsYXN0OwogCWludCBmbGV4X3NpemUgPSBleHQ0X2ZsZXhfYmdfc2l6ZShFWFQ0X1NCKHNiKSk7CiAKIAkvKgpAQCAtNzA4LDEwICs3MDUsMTAgQEAKIAogLyoKICAqIGNsYWltIHRoZSBpbm9kZSBmcm9tIHRoZSBpbm9kZSBiaXRtYXAuIElmIHRoZSBncm91cAotICogaXMgdW5pbml0IHdlIG5lZWQgdG8gdGFrZSB0aGUgZ3JvdXBzJ3Mgc2JfYmdsX2xvY2sKKyAqIGlzIHVuaW5pdCB3ZSBuZWVkIHRvIHRha2UgdGhlIGdyb3VwcydzIGV4dDRfZ3JvdXBfbG9jawogICogYW5kIGNsZWFyIHRoZSB1bmluaXQgZmxhZy4gVGhlIGlub2RlIGJpdG1hcCB1cGRhdGUKICAqIGFuZCBncm91cCBkZXNjIHVuaW5pdCBmbGFnIGNsZWFyIHNob3VsZCBiZSBkb25lCi0gKiBhZnRlciBob2xkaW5nIHNiX2JnbF9sb2NrIHNvIHRoYXQgZXh0NF9yZWFkX2lub2RlX2JpdG1hcAorICogYWZ0ZXIgaG9sZGluZyBleHQ0X2dyb3VwX2xvY2sgc28gdGhhdCBleHQ0X3JlYWRfaW5vZGVfYml0bWFwCiAgKiBkb2Vzbid0IHJhY2Ugd2l0aCB0aGUgZXh0NF9jbGFpbV9pbm9kZQogICovCiBzdGF0aWMgaW50IGV4dDRfY2xhaW1faW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTcyMiw3ICs3MTksNyBAQAogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCBOVUxMKTsKIAotCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJZXh0NF9sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAJaWYgKGV4dDRfc2V0X2JpdChpbm8sIGlub2RlX2JpdG1hcF9iaC0+Yl9kYXRhKSkgewogCQkvKiBub3QgYSBmcmVlIGlub2RlICovCiAJCXJldHZhbCA9IDE7CkBAIC03MzEsNyArNzI4LDcgQEAKIAlpbm8rKzsKIAlpZiAoKGdyb3VwID09IDAgJiYgaW5vIDwgRVhUNF9GSVJTVF9JTk8oc2IpKSB8fAogCQkJaW5vID4gRVhUNF9JTk9ERVNfUEVSX0dST1VQKHNiKSkgewotCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBncm91cCk7CiAJCWV4dDRfZXJyb3Ioc2IsIF9fZnVuY19fLAogCQkJICAgInJlc2VydmVkIGlub2RlIG9yIGlub2RlID4gaW5vZGVzIGNvdW50IC0gIgogCQkJICAgImJsb2NrX2dyb3VwID0gJXUsIGlub2RlPSVsdSIsIGdyb3VwLApAQCAtNzgwLDcgKzc3Nyw3IEBACiAJfQogCWdkcC0+YmdfY2hlY2tzdW0gPSBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGdyb3VwLCBnZHApOwogZXJyX3JldDoKLQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCkBAIC03OTksMTEgKzc5NiwxMCBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICppbm9kZV9iaXRtYXBfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZ3JvdXBfZGVzY19iaDsKLQlleHQ0X2dyb3VwX3QgZ3JvdXAgPSAwOworCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzLCBncm91cCA9IDA7CiAJdW5zaWduZWQgbG9uZyBpbm8gPSAwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwID0gTlVMTDsKLQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXM7CiAJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWk7CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpOwogCWludCByZXQyLCBlcnIgPSAwOwpAQCAtODE4LDE1ICs4MTQsMTQgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKIAogCXNiID0gZGlyLT5pX3NiOworCW5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCXRyYWNlX21hcmsoZXh0NF9yZXF1ZXN0X2lub2RlLCAiZGV2ICVzIGRpciAlbHUgbW9kZSAlZCIsIHNiLT5zX2lkLAogCQkgICBkaXItPmlfaW5vLCBtb2RlKTsKIAlpbm9kZSA9IG5ld19pbm9kZShzYik7CiAJaWYgKCFpbm9kZSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJZWkgPSBFWFQ0X0koaW5vZGUpOwotCiAJc2JpID0gRVhUNF9TQihzYik7Ci0JZXMgPSBzYmktPnNfZXM7CiAKIAlpZiAoc2JpLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXggJiYgdGVzdF9vcHQoc2IsIE9MREFMTE9DKSkgewogCQlyZXQyID0gZmluZF9ncm91cF9mbGV4KHNiLCBkaXIsICZncm91cCk7CkBAIC04NTYsNyArODUxLDcgQEAKIAlpZiAocmV0MiA9PSAtMSkKIAkJZ290byBvdXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewogCQllcnIgPSAtRUlPOwogCiAJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwLCAmZ3JvdXBfZGVzY19iaCk7CkBAIC05MTcsNyArOTEyLDcgQEAKIAkJICogZ3JvdXAgZGVzY3JpcHRvciBtZXRhZGF0YSBoYXMgbm90IHlldCBiZWVuIHVwZGF0ZWQuCiAJCSAqIFNvIHdlIGp1c3QgZ28gb250byB0aGUgbmV4dCBibG9ja2dyb3VwLgogCQkgKi8KLQkJaWYgKCsrZ3JvdXAgPT0gc2JpLT5zX2dyb3Vwc19jb3VudCkKKwkJaWYgKCsrZ3JvdXAgPT0gbmdyb3VwcykKIAkJCWdyb3VwID0gMDsKIAl9CiAJZXJyID0gLUVOT1NQQzsKQEAgLTkzOCw3ICs5MzMsNyBAQAogCQl9CiAKIAkJZnJlZSA9IDA7Ci0JCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOwogCQkvKiByZWNoZWNrIGFuZCBjbGVhciBmbGFnIHVuZGVyIGxvY2sgaWYgd2Ugc3RpbGwgbmVlZCB0byAqLwogCQlpZiAoZ2RwLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkgewogCQkJZnJlZSA9IGV4dDRfZnJlZV9ibG9ja3NfYWZ0ZXJfaW5pdChzYiwgZ3JvdXAsIGdkcCk7CkBAIC05NDcsNyArOTQyLDcgQEAKIAkJCWdkcC0+YmdfY2hlY2tzdW0gPSBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGdyb3VwLAogCQkJCQkJCQlnZHApOwogCQl9Ci0JCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwkJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGdyb3VwKTsKIAogCQkvKiBEb24ndCBuZWVkIHRvIGRpcnR5IGJpdG1hcCBibG9jayBpZiB3ZSBkaWRuJ3QgY2hhbmdlIGl0ICovCiAJCWlmIChmcmVlKSB7CkBAIC0xMTU4LDcgKzExNTMsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgZGVzY19jb3VudDsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpnZHA7Ci0JZXh0NF9ncm91cF90IGk7CisJZXh0NF9ncm91cF90IGksIG5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogI2lmZGVmIEVYVDRGU19ERUJVRwogCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplczsKIAl1bnNpZ25lZCBsb25nIGJpdG1hcF9jb3VudCwgeDsKQEAgLTExNjgsNyArMTE2Myw3IEBACiAJZGVzY19jb3VudCA9IDA7CiAJYml0bWFwX2NvdW50ID0gMDsKIAlnZHAgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQogCQkJY29udGludWU7CkBAIC0xMTkwLDcgKzExODUsNyBAQAogCXJldHVybiBkZXNjX2NvdW50OwogI2Vsc2UKIAlkZXNjX2NvdW50ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CiAJCWdkcCA9IGV4dDRfZ2V0X2dyb3VwX2Rlc2Moc2IsIGksIE5VTEwpOwogCQlpZiAoIWdkcCkKIAkJCWNvbnRpbnVlOwpAQCAtMTIwNSw5ICsxMjAwLDkgQEAKIHVuc2lnbmVkIGxvbmcgZXh0NF9jb3VudF9kaXJzKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQogewogCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwotCWV4dDRfZ3JvdXBfdCBpOworCWV4dDRfZ3JvdXBfdCBpLCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKIAotCWZvciAoaSA9IDA7IGkgPCBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmICghZ2RwKQogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggMmE5ZmZkNS4uODc1ZGI5NCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMzcyLDIwICszNzIsMjEgQEAKIH0KIAogc3RhdGljIGludCBfX2V4dDRfY2hlY2tfYmxvY2tyZWYoY29uc3QgY2hhciAqZnVuY3Rpb24sIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJIF9fbGUzMiAqcCwgdW5zaWduZWQgaW50IG1heCkgewotCi0JdW5zaWduZWQgaW50IG1heGJsb2NrcyA9IGV4dDRfYmxvY2tzX2NvdW50KEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzKTsKKwkJCQkgX19sZTMyICpwLCB1bnNpZ25lZCBpbnQgbWF4KQorewogCV9fbGUzMiAqYnJlZiA9IHA7CisJdW5zaWduZWQgaW50IGJsazsKKwogCXdoaWxlIChicmVmIDwgcCttYXgpIHsKLQkJaWYgKHVubGlrZWx5KGxlMzJfdG9fY3B1KCpicmVmKSA+PSBtYXhibG9ja3MpKSB7CisJCWJsayA9IGxlMzJfdG9fY3B1KCpicmVmKyspOworCQlpZiAoYmxrICYmIAorCQkgICAgdW5saWtlbHkoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwgCisJCQkJCQkgICAgYmxrLCAxKSkpIHsKIAkJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsIGZ1bmN0aW9uLAotCQkJCSAgICJibG9jayByZWZlcmVuY2UgJXUgPj0gbWF4ICgldSkgIgotCQkJCSAgICJpbiBpbm9kZSAjJWx1LCBvZmZzZXQ9JWQiLAotCQkJCSAgIGxlMzJfdG9fY3B1KCpicmVmKSwgbWF4YmxvY2tzLAotCQkJCSAgIGlub2RlLT5pX2lubywgKGludCkoYnJlZi1wKSk7CisJCQkJICAgImludmFsaWQgYmxvY2sgcmVmZXJlbmNlICV1ICIKKwkJCQkgICAiaW4gaW5vZGUgIyVsdSIsIGJsaywgaW5vZGUtPmlfaW5vKTsKICAJCQlyZXR1cm4gLUVJTzsKICAJCX0KLQkJYnJlZisrOwogIAl9CiAgCXJldHVybiAwOwogfQpAQCAtODkyLDYgKzg5MywxMCBAQAogfQogCiAvKgorICogVGhlIGV4dDRfaW5kX2dldF9ibG9ja3MoKSBmdW5jdGlvbiBoYW5kbGVzIG5vbi1leHRlbnRzIGlub2RlcworICogKGkuZS4sIHVzaW5nIHRoZSB0cmFkaXRpb25hbCBpbmRpcmVjdC9kb3VibGUtaW5kaXJlY3QgaV9ibG9ja3MKKyAqIHNjaGVtZSkgZm9yIGV4dDRfZ2V0X2Jsb2NrcygpLgorICoKICAqIEFsbG9jYXRpb24gc3RyYXRlZ3kgaXMgc2ltcGxlOiBpZiB3ZSBoYXZlIHRvIGFsbG9jYXRlIHNvbWV0aGluZywgd2Ugd2lsbAogICogaGF2ZSB0byBnbyB0aGUgd2hvbGUgd2F5IHRvIGxlYWYuIFNvIGxldCdzIGRvIGl0IGJlZm9yZSBhdHRhY2hpbmcgYW55dGhpbmcKICAqIHRvIHRyZWUsIHNldCBsaW5rYWdlIGJldHdlZW4gdGhlIG5ld2Jvcm4gYmxvY2tzLCB3cml0ZSB0aGVtIGlmIHN5bmMgaXMKQEAgLTkwOSwxNSArOTE0LDE2IEBACiAgKiByZXR1cm4gPSAwLCBpZiBwbGFpbiBsb29rdXAgZmFpbGVkLgogICogcmV0dXJuIDwgMCwgZXJyb3IgY2FzZS4KICAqCi0gKgotICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aAotICogZG93bl9yZWFkKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSBpZiBub3QgYWxsb2NhdGluZyBmaWxlIHN5c3RlbSBibG9jawotICogKGllLCBjcmVhdGUgaXMgemVybykuIE90aGVyd2lzZSBkb3duX3dyaXRlKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKQorICogVGhlIGV4dDRfaW5kX2dldF9ibG9ja3MoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGgKKyAqIGRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIGFsbG9jYXRpbmcgZmlsZXN5c3RlbQorICogYmxvY2tzIChpLmUuLCBmbGFncyBoYXMgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSBzZXQpIG9yCisgKiBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIG5vdCBhbGxvY2F0aW5nIGZpbGUgc3lzdGVtCisgKiBibG9ja3MuCiAgKi8KLXN0YXRpYyBpbnQgZXh0NF9nZXRfYmxvY2tzX2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorc3RhdGljIGludCBleHQ0X2luZF9nZXRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJICBleHQ0X2xibGtfdCBpYmxvY2ssIHVuc2lnbmVkIGludCBtYXhibG9ja3MsCiAJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKLQkJCQkgIGludCBjcmVhdGUsIGludCBleHRlbmRfZGlza3NpemUpCisJCQkJICBpbnQgZmxhZ3MpCiB7CiAJaW50IGVyciA9IC1FSU87CiAJZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKQEAgLTkyNywxNCArOTMzLDExIEBACiAJaW50IGluZGlyZWN0X2Jsa3M7CiAJaW50IGJsb2Nrc190b19ib3VuZGFyeSA9IDA7CiAJaW50IGRlcHRoOwotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKIAlpbnQgY291bnQgPSAwOwogCWV4dDRfZnNibGtfdCBmaXJzdF9ibG9jayA9IDA7Ci0JbG9mZl90IGRpc2tzaXplOwotCiAKIAlKX0FTU0VSVCghKEVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpKTsKLQlKX0FTU0VSVChoYW5kbGUgIT0gTlVMTCB8fCBjcmVhdGUgPT0gMCk7CisJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCk7CiAJZGVwdGggPSBleHQ0X2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGlibG9jaywgb2Zmc2V0cywKIAkJCQkJJmJsb2Nrc190b19ib3VuZGFyeSk7CiAKQEAgLTk2Myw3ICs5NjYsNyBAQAogCX0KIAogCS8qIE5leHQgc2ltcGxlIGNhc2UgLSBwbGFpbiBsb29rdXAgb3IgZmFpbGVkIHJlYWQgb2YgaW5kaXJlY3QgYmxvY2sgKi8KLQlpZiAoIWNyZWF0ZSB8fCBlcnIgPT0gLUVJTykKKwlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCB8fCBlcnIgPT0gLUVJTykKIAkJZ290byBjbGVhbnVwOwogCiAJLyoKQEAgLTk5NywxOSArMTAwMCw3IEBACiAJaWYgKCFlcnIpCiAJCWVyciA9IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGUsIGlub2RlLCBpYmxvY2ssCiAJCQkJCXBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsIGNvdW50KTsKLQkvKgotCSAqIGlfZGlza3NpemUgZ3Jvd2luZyBpcyBwcm90ZWN0ZWQgYnkgaV9kYXRhX3NlbS4gIERvbid0IGZvcmdldCB0bwotCSAqIHByb3RlY3QgaXQgaWYgeW91J3JlIGFib3V0IHRvIGltcGxlbWVudCBjb25jdXJyZW50Ci0JICogZXh0NF9nZXRfYmxvY2soKSAtYnp6egotCSovCi0JaWYgKCFlcnIgJiYgZXh0ZW5kX2Rpc2tzaXplKSB7Ci0JCWRpc2tzaXplID0gKChsb2ZmX3QpIGlibG9jayArIGNvdW50KSA8PCBpbm9kZS0+aV9ibGtiaXRzOwotCQlpZiAoZGlza3NpemUgPiBpX3NpemVfcmVhZChpbm9kZSkpCi0JCQlkaXNrc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKLQkJaWYgKGRpc2tzaXplID4gZWktPmlfZGlza3NpemUpCi0JCQllaS0+aV9kaXNrc2l6ZSA9IGRpc2tzaXplOwotCX0KLQlpZiAoZXJyKQorCWVsc2UgCiAJCWdvdG8gY2xlYW51cDsKIAogCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CkBAIC0xMTIwLDggKzExMTEsMjMgQEAKIAkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKIH0KIAorc3RhdGljIGludCBjaGVja19ibG9ja192YWxpZGl0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsb2dpY2FsLAorCQkJCXNlY3Rvcl90IHBoeXMsIGludCBsZW4pCit7CisJaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoRVhUNF9TQihpbm9kZS0+aV9zYiksIHBoeXMsIGxlbikpIHsKKwkJZXh0NF9lcnJvcihpbm9kZS0+aV9zYiwgImNoZWNrX2Jsb2NrX3ZhbGlkaXR5IiwKKwkJCSAgICJpbm9kZSAjJWx1IGxvZ2ljYWwgYmxvY2sgJWxsdSBtYXBwZWQgdG8gJWxsdSAiCisJCQkgICAiKHNpemUgJWQpIiwgaW5vZGUtPmlfaW5vLAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbG9naWNhbCwKKwkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBoeXMsIGxlbik7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKwogLyoKLSAqIFRoZSBleHQ0X2dldF9ibG9ja3Nfd3JhcCgpIGZ1bmN0aW9uIHRyeSB0byBsb29rIHVwIHRoZSByZXF1ZXN0ZWQgYmxvY2tzLAorICogVGhlIGV4dDRfZ2V0X2Jsb2NrcygpIGZ1bmN0aW9uIHRyaWVzIHRvIGxvb2sgdXAgdGhlIHJlcXVlc3RlZCBibG9ja3MsCiAgKiBhbmQgcmV0dXJucyBpZiB0aGUgYmxvY2tzIGFyZSBhbHJlYWR5IG1hcHBlZC4KICAqCiAgKiBPdGhlcndpc2UgaXQgdGFrZXMgdGhlIHdyaXRlIGxvY2sgb2YgdGhlIGlfZGF0YV9zZW0gYW5kIGFsbG9jYXRlIGJsb2NrcwpAQCAtMTEyOSw3ICsxMTM1LDcgQEAKICAqIG1hcHBlZC4KICAqCiAgKiBJZiBmaWxlIHR5cGUgaXMgZXh0ZW50cyBiYXNlZCwgaXQgd2lsbCBjYWxsIGV4dDRfZXh0X2dldF9ibG9ja3MoKSwKLSAqIE90aGVyd2lzZSwgY2FsbCB3aXRoIGV4dDRfZ2V0X2Jsb2Nrc19oYW5kbGUoKSB0byBoYW5kbGUgaW5kaXJlY3QgbWFwcGluZworICogT3RoZXJ3aXNlLCBjYWxsIHdpdGggZXh0NF9pbmRfZ2V0X2Jsb2NrcygpIHRvIGhhbmRsZSBpbmRpcmVjdCBtYXBwaW5nCiAgKiBiYXNlZCBmaWxlcwogICoKICAqIE9uIHN1Y2Nlc3MsIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBibG9ja3MgYmVpbmcgbWFwcGVkIG9yIGFsbG9jYXRlLgpAQCAtMTE0Miw5ICsxMTQ4LDkgQEAKICAqCiAgKiBJdCByZXR1cm5zIHRoZSBlcnJvciBpbiBjYXNlIG9mIGFsbG9jYXRpb24gZmFpbHVyZS4KICAqLwotaW50IGV4dDRfZ2V0X2Jsb2Nrc193cmFwKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAotCQkJdW5zaWduZWQgaW50IG1heF9ibG9ja3MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCQlpbnQgY3JlYXRlLCBpbnQgZXh0ZW5kX2Rpc2tzaXplLCBpbnQgZmxhZykKK2ludCBleHQ0X2dldF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCSAgICB1bnNpZ25lZCBpbnQgbWF4X2Jsb2Nrcywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJICAgIGludCBmbGFncykKIHsKIAlpbnQgcmV0dmFsOwogCkBAIC0xMTUyLDIxICsxMTU4LDI4IEBACiAJY2xlYXJfYnVmZmVyX3Vud3JpdHRlbihiaCk7CiAKIAkvKgotCSAqIFRyeSB0byBzZWUgaWYgd2UgY2FuIGdldCAgdGhlIGJsb2NrIHdpdGhvdXQgcmVxdWVzdGluZwotCSAqIGZvciBuZXcgZmlsZSBzeXN0ZW0gYmxvY2suCisJICogVHJ5IHRvIHNlZSBpZiB3ZSBjYW4gZ2V0IHRoZSBibG9jayB3aXRob3V0IHJlcXVlc3RpbmcgYSBuZXcKKwkgKiBmaWxlIHN5c3RlbSBibG9jay4KIAkgKi8KIAlkb3duX3JlYWQoKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSk7CiAJaWYgKEVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpIHsKIAkJcmV0dmFsID0gIGV4dDRfZXh0X2dldF9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmxvY2ssIG1heF9ibG9ja3MsCi0JCQkJYmgsIDAsIDApOworCQkJCWJoLCAwKTsKIAl9IGVsc2UgewotCQlyZXR2YWwgPSBleHQ0X2dldF9ibG9ja3NfaGFuZGxlKGhhbmRsZSwKLQkJCQlpbm9kZSwgYmxvY2ssIG1heF9ibG9ja3MsIGJoLCAwLCAwKTsKKwkJcmV0dmFsID0gZXh0NF9pbmRfZ2V0X2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBibG9jaywgbWF4X2Jsb2NrcywKKwkJCQkJICAgICBiaCwgMCk7CiAJfQogCXVwX3JlYWQoKCZFWFQ0X0koaW5vZGUpLT5pX2RhdGFfc2VtKSk7CiAKKwlpZiAocmV0dmFsID4gMCAmJiBidWZmZXJfbWFwcGVkKGJoKSkgeworCQlpbnQgcmV0ID0gY2hlY2tfYmxvY2tfdmFsaWRpdHkoaW5vZGUsIGJsb2NrLCAKKwkJCQkJICAgICAgIGJoLT5iX2Jsb2NrbnIsIHJldHZhbCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCiAJLyogSWYgaXQgaXMgb25seSBhIGJsb2NrKHMpIGxvb2sgdXAgKi8KLQlpZiAoIWNyZWF0ZSkKKwlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCkKIAkJcmV0dXJuIHJldHZhbDsKIAogCS8qCkBAIC0xMjA1LDcgKzEyMTgsNyBAQAogCSAqIGxldCB0aGUgdW5kZXJseWluZyBnZXRfYmxvY2soKSBmdW5jdGlvbiBrbm93IHRvCiAJICogYXZvaWQgZG91YmxlIGFjY291bnRpbmcKIAkgKi8KLQlpZiAoZmxhZykKKwlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSkKIAkJRVhUNF9JKGlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnID0gMTsKIAkvKgogCSAqIFdlIG5lZWQgdG8gY2hlY2sgZm9yIEVYVDQgaGVyZSBiZWNhdXNlIG1pZ3JhdGUKQEAgLTEyMTMsMTAgKzEyMjYsMTAgQEAKIAkgKi8KIAlpZiAoRVhUNF9JKGlub2RlKS0+aV9mbGFncyAmIEVYVDRfRVhURU5UU19GTCkgewogCQlyZXR2YWwgPSAgZXh0NF9leHRfZ2V0X2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBibG9jaywgbWF4X2Jsb2NrcywKLQkJCQliaCwgY3JlYXRlLCBleHRlbmRfZGlza3NpemUpOworCQkJCQkgICAgICBiaCwgZmxhZ3MpOwogCX0gZWxzZSB7Ci0JCXJldHZhbCA9IGV4dDRfZ2V0X2Jsb2Nrc19oYW5kbGUoaGFuZGxlLCBpbm9kZSwgYmxvY2ssCi0JCQkJbWF4X2Jsb2NrcywgYmgsIGNyZWF0ZSwgZXh0ZW5kX2Rpc2tzaXplKTsKKwkJcmV0dmFsID0gZXh0NF9pbmRfZ2V0X2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBibG9jaywKKwkJCQkJICAgICBtYXhfYmxvY2tzLCBiaCwgZmxhZ3MpOwogCiAJCWlmIChyZXR2YWwgPiAwICYmIGJ1ZmZlcl9uZXcoYmgpKSB7CiAJCQkvKgpAQCAtMTIyOSwxOCArMTI0MiwyMyBAQAogCQl9CiAJfQogCi0JaWYgKGZsYWcpIHsKKwlpZiAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSkKIAkJRVhUNF9JKGlub2RlKS0+aV9kZWxhbGxvY19yZXNlcnZlZF9mbGFnID0gMDsKLQkJLyoKLQkJICogVXBkYXRlIHJlc2VydmVkIGJsb2Nrcy9tZXRhZGF0YSBibG9ja3MKLQkJICogYWZ0ZXIgc3VjY2Vzc2Z1bCBibG9jayBhbGxvY2F0aW9uCi0JCSAqIHdoaWNoIHdlcmUgZGVmZXJyZWQgdGlsbCBub3cKLQkJICovCi0JCWlmICgocmV0dmFsID4gMCkgJiYgYnVmZmVyX2RlbGF5KGJoKSkKLQkJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIHJldHZhbCk7Ci0JfQorCisJLyoKKwkgKiBVcGRhdGUgcmVzZXJ2ZWQgYmxvY2tzL21ldGFkYXRhIGJsb2NrcyBhZnRlciBzdWNjZXNzZnVsCisJICogYmxvY2sgYWxsb2NhdGlvbiB3aGljaCBoYWQgYmVlbiBkZWZlcnJlZCB0aWxsIG5vdy4KKwkgKi8KKwlpZiAoKHJldHZhbCA+IDApICYmIChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19VUERBVEVfUkVTRVJWRV9TUEFDRSkpCisJCWV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2UoaW5vZGUsIHJldHZhbCk7CiAKIAl1cF93cml0ZSgoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pKTsKKwlpZiAocmV0dmFsID4gMCAmJiBidWZmZXJfbWFwcGVkKGJoKSkgeworCQlpbnQgcmV0ID0gY2hlY2tfYmxvY2tfdmFsaWRpdHkoaW5vZGUsIGJsb2NrLCAKKwkJCQkJICAgICAgIGJoLT5iX2Jsb2NrbnIsIHJldHZhbCk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTEyNjgsOCArMTI4Niw4IEBACiAJCXN0YXJ0ZWQgPSAxOwogCX0KIAotCXJldCA9IGV4dDRfZ2V0X2Jsb2Nrc193cmFwKGhhbmRsZSwgaW5vZGUsIGlibG9jaywKLQkJCQkJbWF4X2Jsb2NrcywgYmhfcmVzdWx0LCBjcmVhdGUsIDAsIDApOworCXJldCA9IGV4dDRfZ2V0X2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBpYmxvY2ssIG1heF9ibG9ja3MsIGJoX3Jlc3VsdCwKKwkJCSAgICAgIGNyZWF0ZSA/IEVYVDRfR0VUX0JMT0NLU19DUkVBVEUgOiAwKTsKIAlpZiAocmV0ID4gMCkgewogCQliaF9yZXN1bHQtPmJfc2l6ZSA9IChyZXQgPDwgaW5vZGUtPmlfYmxrYml0cyk7CiAJCXJldCA9IDA7CkBAIC0xMjg4LDE3ICsxMzA2LDE5IEBACiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkIGR1bW15OwogCWludCBmYXRhbCA9IDAsIGVycjsKKwlpbnQgZmxhZ3MgPSAwOwogCiAJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgY3JlYXRlID09IDApOwogCiAJZHVtbXkuYl9zdGF0ZSA9IDA7CiAJZHVtbXkuYl9ibG9ja25yID0gLTEwMDA7CiAJYnVmZmVyX3RyYWNlX2luaXQoJmR1bW15LmJfaGlzdG9yeSk7Ci0JZXJyID0gZXh0NF9nZXRfYmxvY2tzX3dyYXAoaGFuZGxlLCBpbm9kZSwgYmxvY2ssIDEsCi0JCQkJCSZkdW1teSwgY3JlYXRlLCAxLCAwKTsKKwlpZiAoY3JlYXRlKQorCQlmbGFncyB8PSBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFOworCWVyciA9IGV4dDRfZ2V0X2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBibG9jaywgMSwgJmR1bW15LCBmbGFncyk7CiAJLyoKLQkgKiBleHQ0X2dldF9ibG9ja3NfaGFuZGxlKCkgcmV0dXJucyBudW1iZXIgb2YgYmxvY2tzCi0JICogbWFwcGVkLiAwIGluIGNhc2Ugb2YgYSBIT0xFLgorCSAqIGV4dDRfZ2V0X2Jsb2NrcygpIHJldHVybnMgbnVtYmVyIG9mIGJsb2NrcyBtYXBwZWQuIDAgaW4KKwkgKiBjYXNlIG9mIGEgSE9MRS4KIAkgKi8KIAlpZiAoZXJyID4gMCkgewogCQlpZiAoZXJyID4gMSkKQEAgLTE0MzksNyArMTQ1OSw3IEBACiAJCQkJc3RydWN0IHBhZ2UgKipwYWdlcCwgdm9pZCAqKmZzZGF0YSkKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKLQlpbnQgcmV0LCBuZWVkZWRfYmxvY2tzID0gZXh0NF93cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKTsKKwlpbnQgcmV0LCBuZWVkZWRfYmxvY2tzOwogCWhhbmRsZV90ICpoYW5kbGU7CiAJaW50IHJldHJpZXMgPSAwOwogCXN0cnVjdCBwYWdlICpwYWdlOwpAQCAtMTQ1MCw2ICsxNDcwLDExIEBACiAJCSAgICJkZXYgJXMgaW5vICVsdSBwb3MgJWxsdSBsZW4gJXUgZmxhZ3MgJXUiLAogCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgZmxhZ3MpOworCS8qCisJICogUmVzZXJ2ZSBvbmUgYmxvY2sgbW9yZSBmb3IgYWRkaXRpb24gdG8gb3JwaGFuIGxpc3QgaW4gY2FzZQorCSAqIHdlIGFsbG9jYXRlIGJsb2NrcyBidXQgd3JpdGUgZmFpbHMgZm9yIHNvbWUgcmVhc29uCisJICovCisJbmVlZGVkX2Jsb2NrcyA9IGV4dDRfd3JpdGVwYWdlX3RyYW5zX2Jsb2Nrcyhpbm9kZSkgKyAxOwogIAlpbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWZyb20gPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CiAJdG8gPSBmcm9tICsgbGVuOwpAQCAtMTQ4MywxNSArMTUwOCwzMCBAQAogCiAJaWYgKHJldCkgewogCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkvKgogCQkgKiBibG9ja193cml0ZV9iZWdpbiBtYXkgaGF2ZSBpbnN0YW50aWF0ZWQgYSBmZXcgYmxvY2tzCiAJCSAqIG91dHNpZGUgaV9zaXplLiAgVHJpbSB0aGVzZSBvZmYgYWdhaW4uIERvbid0IG5lZWQKIAkJICogaV9zaXplX3JlYWQgYmVjYXVzZSB3ZSBob2xkIGlfbXV0ZXguCisJCSAqCisJCSAqIEFkZCBpbm9kZSB0byBvcnBoYW4gbGlzdCBpbiBjYXNlIHdlIGNyYXNoIGJlZm9yZQorCQkgKiB0cnVuY2F0ZSBmaW5pc2hlcwogCQkgKi8KIAkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCisJCQlleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7CisKKwkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpIHsKIAkJCXZtdHJ1bmNhdGUoaW5vZGUsIGlub2RlLT5pX3NpemUpOworCQkJLyogCisJCQkgKiBJZiB2bXRydW5jYXRlIGZhaWxlZCBlYXJseSB0aGUgaW5vZGUgbWlnaHQKKwkJCSAqIHN0aWxsIGJlIG9uIHRoZSBvcnBoYW4gbGlzdDsgd2UgbmVlZCB0bworCQkJICogbWFrZSBzdXJlIHRoZSBpbm9kZSBpcyByZW1vdmVkIGZyb20gdGhlCisJCQkgKiBvcnBoYW4gbGlzdCBpbiB0aGF0IGNhc2UuCisJCQkgKi8KKwkJCWlmIChpbm9kZS0+aV9ubGluaykKKwkJCQlleHQ0X29ycGhhbl9kZWwoTlVMTCwgaW5vZGUpOworCQl9CiAJfQogCiAJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCkBAIC0xNTA5LDYgKzE1NDksNTIgQEAKIAlyZXR1cm4gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBOVUxMLCBiaCk7CiB9CiAKK3N0YXRpYyBpbnQgZXh0NF9nZW5lcmljX3dyaXRlX2VuZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQlsb2ZmX3QgcG9zLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNvcGllZCwKKwkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqZnNkYXRhKQoreworCWludCBpX3NpemVfY2hhbmdlZCA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGV4dDRfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCisJY29waWVkID0gYmxvY2tfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsIHBhZ2UsIGZzZGF0YSk7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gdXNlIGlfc2l6ZV9yZWFkKCkgaGVyZSwgdGhlIGlfc2l6ZQorCSAqIGNhbm5vdCBjaGFuZ2UgdW5kZXIgdXMgYmVjYXVzZSB3ZSBob2xkIGlfbXV0ZXguCisJICoKKwkgKiBCdXQgaXQncyBpbXBvcnRhbnQgdG8gdXBkYXRlIGlfc2l6ZSB3aGlsZSBzdGlsbCBob2xkaW5nIHBhZ2UgbG9jazoKKwkgKiBwYWdlIHdyaXRlb3V0IGNvdWxkIG90aGVyd2lzZSBjb21lIGluIGFuZCB6ZXJvIGJleW9uZCBpX3NpemUuCisJICovCisJaWYgKHBvcyArIGNvcGllZCA+IGlub2RlLT5pX3NpemUpIHsKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MgKyBjb3BpZWQpOworCQlpX3NpemVfY2hhbmdlZCA9IDE7CisJfQorCisJaWYgKHBvcyArIGNvcGllZCA+ICBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7CisJCS8qIFdlIG5lZWQgdG8gbWFyayBpbm9kZSBkaXJ0eSBldmVuIGlmCisJCSAqIG5ld19pX3NpemUgaXMgbGVzcyB0aGF0IGlub2RlLT5pX3NpemUKKwkJICogYnUgZ3JlYXRlciB0aGFuIGlfZGlza3NpemUuKGhpbnQgZGVsYWxsb2MpCisJCSAqLworCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCAocG9zICsgY29waWVkKSk7CisJCWlfc2l6ZV9jaGFuZ2VkID0gMTsKKwl9CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCisJLyoKKwkgKiBEb24ndCBtYXJrIHRoZSBpbm9kZSBkaXJ0eSB1bmRlciBwYWdlIGxvY2suIEZpcnN0LCBpdCB1bm5lY2Vzc2FyaWx5CisJICogbWFrZXMgdGhlIGhvbGRpbmcgdGltZSBvZiBwYWdlIGxvY2sgbG9uZ2VyLiBTZWNvbmQsIGl0IGZvcmNlcyBsb2NrCisJICogb3JkZXJpbmcgb2YgcGFnZSBsb2NrIGFuZCB0cmFuc2FjdGlvbiBzdGFydCBmb3Igam91cm5hbGluZworCSAqIGZpbGVzeXN0ZW1zLgorCSAqLworCWlmIChpX3NpemVfY2hhbmdlZCkKKwkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCisJcmV0dXJuIGNvcGllZDsKK30KKwogLyoKICAqIFdlIG5lZWQgdG8gcGljayB1cCB0aGUgbmV3IGlub2RlIHNpemUgd2hpY2ggZ2VuZXJpY19jb21taXRfd3JpdGUgZ2F2ZSB1cwogICogYGZpbGUnIGNhbiBiZSBOVUxMIC0gZWcsIHdoZW4gY2FsbGVkIGZyb20gcGFnZV9zeW1saW5rKCkuCkBAIC0xNTMyLDIxICsxNjE4LDE1IEBACiAJcmV0ID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7CiAKIAlpZiAocmV0ID09IDApIHsKLQkJbG9mZl90IG5ld19pX3NpemU7Ci0KLQkJbmV3X2lfc2l6ZSA9IHBvcyArIGNvcGllZDsKLQkJaWYgKG5ld19pX3NpemUgPiBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7Ci0JCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCBuZXdfaV9zaXplKTsKLQkJCS8qIFdlIG5lZWQgdG8gbWFyayBpbm9kZSBkaXJ0eSBldmVuIGlmCi0JCQkgKiBuZXdfaV9zaXplIGlzIGxlc3MgdGhhdCBpbm9kZS0+aV9zaXplCi0JCQkgKiBidSBncmVhdGVyIHRoYW4gaV9kaXNrc2l6ZS4oaGludCBkZWxhbGxvYykKLQkJCSAqLwotCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQl9Ci0KLQkJcmV0MiA9IGdlbmVyaWNfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsCisJCXJldDIgPSBleHQ0X2dlbmVyaWNfd3JpdGVfZW5kKGZpbGUsIG1hcHBpbmcsIHBvcywgbGVuLCBjb3BpZWQsCiAJCQkJCQkJcGFnZSwgZnNkYXRhKTsKIAkJY29waWVkID0gcmV0MjsKKwkJaWYgKHBvcyArIGxlbiA+IGlub2RlLT5pX3NpemUpCisJCQkvKiBpZiB3ZSBoYXZlIGFsbG9jYXRlZCBtb3JlIGJsb2NrcyBhbmQgY29waWVkCisJCQkgKiBsZXNzLiBXZSB3aWxsIGhhdmUgYmxvY2tzIGFsbG9jYXRlZCBvdXRzaWRlCisJCQkgKiBpbm9kZS0+aV9zaXplLiBTbyB0cnVuY2F0ZSB0aGVtCisJCQkgKi8KKwkJCWV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTsKIAkJaWYgKHJldDIgPCAwKQogCQkJcmV0ID0gcmV0MjsKIAl9CkBAIC0xNTU0LDYgKzE2MzQsMTggQEAKIAlpZiAoIXJldCkKIAkJcmV0ID0gcmV0MjsKIAorCWlmIChwb3MgKyBsZW4gPiBpbm9kZS0+aV9zaXplKSB7CisJCXZtdHJ1bmNhdGUoaW5vZGUsIGlub2RlLT5pX3NpemUpOworCQkvKiAKKwkJICogSWYgdm10cnVuY2F0ZSBmYWlsZWQgZWFybHkgdGhlIGlub2RlIG1pZ2h0IHN0aWxsIGJlCisJCSAqIG9uIHRoZSBvcnBoYW4gbGlzdDsgd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGlub2RlCisJCSAqIGlzIHJlbW92ZWQgZnJvbSB0aGUgb3JwaGFuIGxpc3QgaW4gdGhhdCBjYXNlLgorCQkgKi8KKwkJaWYgKGlub2RlLT5pX25saW5rKQorCQkJZXh0NF9vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwl9CisKKwogCXJldHVybiByZXQgPyByZXQgOiBjb3BpZWQ7CiB9CiAKQEAgLTE1NjUsMjUgKzE2NTcsMjEgQEAKIAloYW5kbGVfdCAqaGFuZGxlID0gZXh0NF9qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CiAJaW50IHJldCA9IDAsIHJldDI7Ci0JbG9mZl90IG5ld19pX3NpemU7CiAKIAl0cmFjZV9tYXJrKGV4dDRfd3JpdGViYWNrX3dyaXRlX2VuZCwKIAkJICAgImRldiAlcyBpbm8gJWx1IHBvcyAlbGx1IGxlbiAldSBjb3BpZWQgJXUiLAogCQkgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAogCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBwb3MsIGxlbiwgY29waWVkKTsKLQluZXdfaV9zaXplID0gcG9zICsgY29waWVkOwotCWlmIChuZXdfaV9zaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkgewotCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCBuZXdfaV9zaXplKTsKLQkJLyogV2UgbmVlZCB0byBtYXJrIGlub2RlIGRpcnR5IGV2ZW4gaWYKLQkJICogbmV3X2lfc2l6ZSBpcyBsZXNzIHRoYXQgaW5vZGUtPmlfc2l6ZQotCQkgKiBidSBncmVhdGVyIHRoYW4gaV9kaXNrc2l6ZS4oaGludCBkZWxhbGxvYykKLQkJICovCi0JCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQl9Ci0KLQlyZXQyID0gZ2VuZXJpY193cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBsZW4sIGNvcGllZCwKKwlyZXQyID0gZXh0NF9nZW5lcmljX3dyaXRlX2VuZChmaWxlLCBtYXBwaW5nLCBwb3MsIGxlbiwgY29waWVkLAogCQkJCQkJCXBhZ2UsIGZzZGF0YSk7CiAJY29waWVkID0gcmV0MjsKKwlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkKKwkJLyogaWYgd2UgaGF2ZSBhbGxvY2F0ZWQgbW9yZSBibG9ja3MgYW5kIGNvcGllZAorCQkgKiBsZXNzLiBXZSB3aWxsIGhhdmUgYmxvY2tzIGFsbG9jYXRlZCBvdXRzaWRlCisJCSAqIGlub2RlLT5pX3NpemUuIFNvIHRydW5jYXRlIHRoZW0KKwkJICovCisJCWV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTsKKwogCWlmIChyZXQyIDwgMCkKIAkJcmV0ID0gcmV0MjsKIApAQCAtMTU5MSw2ICsxNjc5LDE3IEBACiAJaWYgKCFyZXQpCiAJCXJldCA9IHJldDI7CiAKKwlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkgeworCQl2bXRydW5jYXRlKGlub2RlLCBpbm9kZS0+aV9zaXplKTsKKwkJLyogCisJCSAqIElmIHZtdHJ1bmNhdGUgZmFpbGVkIGVhcmx5IHRoZSBpbm9kZSBtaWdodCBzdGlsbCBiZQorCQkgKiBvbiB0aGUgb3JwaGFuIGxpc3Q7IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbm9kZQorCQkgKiBpcyByZW1vdmVkIGZyb20gdGhlIG9ycGhhbiBsaXN0IGluIHRoYXQgY2FzZS4KKwkJICovCisJCWlmIChpbm9kZS0+aV9ubGluaykKKwkJCWV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisJfQorCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvcGllZDsKIH0KIApAQCAtMTYzNSwxMCArMTczNCwyNyBAQAogCX0KIAogCXVubG9ja19wYWdlKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkKKwkJLyogaWYgd2UgaGF2ZSBhbGxvY2F0ZWQgbW9yZSBibG9ja3MgYW5kIGNvcGllZAorCQkgKiBsZXNzLiBXZSB3aWxsIGhhdmUgYmxvY2tzIGFsbG9jYXRlZCBvdXRzaWRlCisJCSAqIGlub2RlLT5pX3NpemUuIFNvIHRydW5jYXRlIHRoZW0KKwkJICovCisJCWV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTsKKwogCXJldDIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCWlmICghcmV0KQogCQlyZXQgPSByZXQyOwotCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkgeworCQl2bXRydW5jYXRlKGlub2RlLCBpbm9kZS0+aV9zaXplKTsKKwkJLyogCisJCSAqIElmIHZtdHJ1bmNhdGUgZmFpbGVkIGVhcmx5IHRoZSBpbm9kZSBtaWdodCBzdGlsbCBiZQorCQkgKiBvbiB0aGUgb3JwaGFuIGxpc3Q7IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBpbm9kZQorCQkgKiBpcyByZW1vdmVkIGZyb20gdGhlIG9ycGhhbiBsaXN0IGluIHRoYXQgY2FzZS4KKwkJICovCisJCWlmIChpbm9kZS0+aV9ubGluaykKKwkJCWV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisJfQogCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvcGllZDsKIH0KQEAgLTE4NTIsNyArMTk2OCw3IEBACiAgKiBAbG9naWNhbCAtIGZpcnN0IGxvZ2ljYWwgYmxvY2sgdG8gc3RhcnQgYXNzaWdubWVudCB3aXRoCiAgKgogICogdGhlIGZ1bmN0aW9uIGdvZXMgdGhyb3VnaCBhbGwgcGFzc2VkIHNwYWNlIGFuZCBwdXQgYWN0dWFsIGRpc2sKLSAqIGJsb2NrIG51bWJlcnMgaW50byBidWZmZXIgaGVhZHMsIGRyb3BwaW5nIEJIX0RlbGF5CisgKiBibG9jayBudW1iZXJzIGludG8gYnVmZmVyIGhlYWRzLCBkcm9wcGluZyBCSF9EZWxheSBhbmQgQkhfVW53cml0dGVuCiAgKi8KIHN0YXRpYyB2b2lkIG1wYWdlX3B1dF9ibnJfdG9fYmhzKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQsIHNlY3Rvcl90IGxvZ2ljYWwsCiAJCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqZXhiaCkKQEAgLTE5MDIsMTYgKzIwMTgsMjQgQEAKIAkJCWRvIHsKIAkJCQlpZiAoY3VyX2xvZ2ljYWwgPj0gbG9naWNhbCArIGJsb2NrcykKIAkJCQkJYnJlYWs7Ci0JCQkJaWYgKGJ1ZmZlcl9kZWxheShiaCkpIHsKLQkJCQkJYmgtPmJfYmxvY2tuciA9IHBibG9jazsKLQkJCQkJY2xlYXJfYnVmZmVyX2RlbGF5KGJoKTsKLQkJCQkJYmgtPmJfYmRldiA9IGlub2RlLT5pX3NiLT5zX2JkZXY7Ci0JCQkJfSBlbHNlIGlmIChidWZmZXJfdW53cml0dGVuKGJoKSkgewotCQkJCQliaC0+Yl9ibG9ja25yID0gcGJsb2NrOwotCQkJCQljbGVhcl9idWZmZXJfdW53cml0dGVuKGJoKTsKLQkJCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOwotCQkJCQlzZXRfYnVmZmVyX25ldyhiaCk7Ci0JCQkJCWJoLT5iX2JkZXYgPSBpbm9kZS0+aV9zYi0+c19iZGV2OworCisJCQkJaWYgKGJ1ZmZlcl9kZWxheShiaCkgfHwKKwkJCQkJCWJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7CisKKwkJCQkJQlVHX09OKGJoLT5iX2JkZXYgIT0gaW5vZGUtPmlfc2ItPnNfYmRldik7CisKKwkJCQkJaWYgKGJ1ZmZlcl9kZWxheShiaCkpIHsKKwkJCQkJCWNsZWFyX2J1ZmZlcl9kZWxheShiaCk7CisJCQkJCQliaC0+Yl9ibG9ja25yID0gcGJsb2NrOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyoKKwkJCQkJCSAqIHVud3JpdHRlbiBhbHJlYWR5IHNob3VsZCBoYXZlCisJCQkJCQkgKiBibG9ja25yIGFzc2lnbmVkLiBWZXJpZnkgdGhhdAorCQkJCQkJICovCisJCQkJCQljbGVhcl9idWZmZXJfdW53cml0dGVuKGJoKTsKKwkJCQkJCUJVR19PTihiaC0+Yl9ibG9ja25yICE9IHBibG9jayk7CisJCQkJCX0KKwogCQkJCX0gZWxzZSBpZiAoYnVmZmVyX21hcHBlZChiaCkpCiAJCQkJCUJVR19PTihiaC0+Yl9ibG9ja25yICE9IHBibG9jayk7CiAKQEAgLTE5OTAsNTEgKzIxMTQsNiBAQAogCXJldHVybjsKIH0KIAotI2RlZmluZQkJRVhUNF9ERUxBTExPQ19SU1ZFRAkxCi1zdGF0aWMgaW50IGV4dDRfZGFfZ2V0X2Jsb2NrX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKLQkJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIG1heF9ibG9ja3MgPSBiaF9yZXN1bHQtPmJfc2l6ZSA+PiBpbm9kZS0+aV9ibGtiaXRzOwotCWxvZmZfdCBkaXNrc2l6ZSA9IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemU7Ci0JaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7Ci0KLQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKLQlCVUdfT04oIWhhbmRsZSk7Ci0JcmV0ID0gZXh0NF9nZXRfYmxvY2tzX3dyYXAoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLCBtYXhfYmxvY2tzLAotCQkJCSAgIGJoX3Jlc3VsdCwgY3JlYXRlLCAwLCBFWFQ0X0RFTEFMTE9DX1JTVkVEKTsKLQlpZiAocmV0IDw9IDApCi0JCXJldHVybiByZXQ7Ci0KLQliaF9yZXN1bHQtPmJfc2l6ZSA9IChyZXQgPDwgaW5vZGUtPmlfYmxrYml0cyk7Ci0KLQlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShpbm9kZSkpIHsKLQkJaW50IHJldHZhbDsKLQkJcmV0dmFsID0gZXh0NF9qYmQyX2ZpbGVfaW5vZGUoaGFuZGxlLCBpbm9kZSk7Ci0JCWlmIChyZXR2YWwpCi0JCQkvKgotCQkJICogRmFpbGVkIHRvIGFkZCBpbm9kZSBmb3Igb3JkZXJlZCBtb2RlLiBEb24ndAotCQkJICogdXBkYXRlIGZpbGUgc2l6ZQotCQkJICovCi0JCQlyZXR1cm4gcmV0dmFsOwotCX0KLQotCS8qCi0JICogVXBkYXRlIG9uLWRpc2sgc2l6ZSBhbG9uZyB3aXRoIGJsb2NrIGFsbG9jYXRpb24gd2UgZG9uJ3QKLQkgKiB1c2UgJ2V4dGVuZF9kaXNrc2l6ZScgYXMgc2l6ZSBtYXkgY2hhbmdlIHdpdGhpbiBhbHJlYWR5Ci0JICogYWxsb2NhdGVkIGJsb2NrIC1ienp6Ci0JICovCi0JZGlza3NpemUgPSAoKGxvZmZfdCkgaWJsb2NrICsgcmV0KSA8PCBpbm9kZS0+aV9ibGtiaXRzOwotCWlmIChkaXNrc2l6ZSA+IGlfc2l6ZV9yZWFkKGlub2RlKSkKLQkJZGlza3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JaWYgKGRpc2tzaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkgewotCQlleHQ0X3VwZGF0ZV9pX2Rpc2tzaXplKGlub2RlLCBkaXNrc2l6ZSk7Ci0JCXJldCA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBtcGFnZV9kYV9tYXBfYmxvY2tzIC0gZ28gdGhyb3VnaCBnaXZlbiBzcGFjZQogICoKQEAgLTIwNDUsMjkgKzIxMjQsNTcgQEAKICAqLwogc3RhdGljIGludCBtcGFnZV9kYV9tYXBfYmxvY2tzKHN0cnVjdCBtcGFnZV9kYV9kYXRhICptcGQpCiB7Ci0JaW50IGVyciA9IDA7CisJaW50IGVyciwgYmxrcywgZ2V0X2Jsb2Nrc19mbGFnczsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgbmV3OwotCXNlY3Rvcl90IG5leHQ7CisJc2VjdG9yX3QgbmV4dCA9IG1wZC0+Yl9ibG9ja25yOworCXVuc2lnbmVkIG1heF9ibG9ja3MgPSBtcGQtPmJfc2l6ZSA+PiBtcGQtPmlub2RlLT5pX2Jsa2JpdHM7CisJbG9mZl90IGRpc2tzaXplID0gRVhUNF9JKG1wZC0+aW5vZGUpLT5pX2Rpc2tzaXplOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOwogCiAJLyoKIAkgKiBXZSBjb25zaWRlciBvbmx5IG5vbi1tYXBwZWQgYW5kIG5vbi1hbGxvY2F0ZWQgYmxvY2tzCiAJICovCiAJaWYgKChtcGQtPmJfc3RhdGUgICYgKDEgPDwgQkhfTWFwcGVkKSkgJiYKLQkgICAgIShtcGQtPmJfc3RhdGUgJiAoMSA8PCBCSF9EZWxheSkpKQotCQlyZXR1cm4gMDsKLQluZXcuYl9zdGF0ZSA9IG1wZC0+Yl9zdGF0ZTsKLQluZXcuYl9ibG9ja25yID0gMDsKLQluZXcuYl9zaXplID0gbXBkLT5iX3NpemU7Ci0JbmV4dCA9IG1wZC0+Yl9ibG9ja25yOwotCS8qCi0JICogSWYgd2UgZGlkbid0IGFjY3VtdWxhdGUgYW55dGhpbmcKLQkgKiB0byB3cml0ZSBzaW1wbHkgcmV0dXJuCi0JICovCi0JaWYgKCFuZXcuYl9zaXplKQorCQkhKG1wZC0+Yl9zdGF0ZSAmICgxIDw8IEJIX0RlbGF5KSkgJiYKKwkJIShtcGQtPmJfc3RhdGUgJiAoMSA8PCBCSF9VbndyaXR0ZW4pKSkKIAkJcmV0dXJuIDA7CiAKLQllcnIgPSBleHQ0X2RhX2dldF9ibG9ja193cml0ZShtcGQtPmlub2RlLCBuZXh0LCAmbmV3LCAxKTsKLQlpZiAoZXJyKSB7CisJLyoKKwkgKiBJZiB3ZSBkaWRuJ3QgYWNjdW11bGF0ZSBhbnl0aGluZyB0byB3cml0ZSBzaW1wbHkgcmV0dXJuCisJICovCisJaWYgKCFtcGQtPmJfc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwloYW5kbGUgPSBleHQ0X2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKwlCVUdfT04oIWhhbmRsZSk7CisKKwkvKgorCSAqIENhbGwgZXh0NF9nZXRfYmxvY2tzKCkgdG8gYWxsb2NhdGUgYW55IGRlbGF5ZWQgYWxsb2NhdGlvbgorCSAqIGJsb2Nrcywgb3IgdG8gY29udmVydCBhbiB1bmluaXRpYWxpemVkIGV4dGVudCB0byBiZQorCSAqIGluaXRpYWxpemVkIChpbiB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIHdyaXR0ZW4gaW50bworCSAqIG9uZSBvciBtb3JlIHByZWFsbG9jYXRlZCBibG9ja3MpLgorCSAqCisJICogV2UgcGFzcyBpbiB0aGUgbWFnaWMgRVhUNF9HRVRfQkxPQ0tTX0RFTEFMTE9DX1JFU0VSVkUgdG8KKwkgKiBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBvbiB0aGUgZGVsYXllZCBhbGxvY2F0aW9uIHBhdGguICBUaGlzCisJICogYWZmZWN0cyBmdW5jdGlvbnMgaW4gbWFueSBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGFsbG9jYXRpb24KKwkgKiBjYWxsIHBhdGguICBUaGlzIGZsYWcgZXhpc3RzIHByaW1hcmlseSBiZWNhdXNlIHdlIGRvbid0CisJICogd2FudCB0byBjaGFuZ2UgKm1hbnkqIGNhbGwgZnVuY3Rpb25zLCBzbyBleHQ0X2dldF9ibG9ja3MoKQorCSAqIHdpbGwgc2V0IHRoZSBtYWdpYyBpX2RlbGFsbG9jX3Jlc2VydmVkX2ZsYWcgb25jZSB0aGUKKwkgKiBpbm9kZSdzIGFsbG9jYXRpb24gc2VtYXBob3JlIGlzIHRha2VuLgorCSAqCisJICogSWYgdGhlIGJsb2NrcyBpbiBxdWVzdGlvbnMgd2VyZSBkZWxhbGxvYyBibG9ja3MsIHNldAorCSAqIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFIHNvIHRoZSBkZWxhbGxvYyBhY2NvdW50aW5nCisJICogdmFyaWFibGVzIGFyZSB1cGRhdGVkIGFmdGVyIHRoZSBibG9ja3MgaGF2ZSBiZWVuIGFsbG9jYXRlZC4KKwkgKi8KKwluZXcuYl9zdGF0ZSA9IDA7CisJZ2V0X2Jsb2Nrc19mbGFncyA9IChFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFIHwKKwkJCSAgICBFWFQ0X0dFVF9CTE9DS1NfREVMQUxMT0NfUkVTRVJWRSk7CisJaWYgKG1wZC0+Yl9zdGF0ZSAmICgxIDw8IEJIX0RlbGF5KSkKKwkJZ2V0X2Jsb2Nrc19mbGFncyB8PSBFWFQ0X0dFVF9CTE9DS1NfVVBEQVRFX1JFU0VSVkVfU1BBQ0U7CisJYmxrcyA9IGV4dDRfZ2V0X2Jsb2NrcyhoYW5kbGUsIG1wZC0+aW5vZGUsIG5leHQsIG1heF9ibG9ja3MsCisJCQkgICAgICAgJm5ldywgZ2V0X2Jsb2Nrc19mbGFncyk7CisJaWYgKGJsa3MgPCAwKSB7CisJCWVyciA9IGJsa3M7CiAJCS8qCiAJCSAqIElmIGdldCBibG9jayByZXR1cm5zIHdpdGggZXJyb3Igd2Ugc2ltcGx5CiAJCSAqIHJldHVybi4gTGF0ZXIgd3JpdGVwYWdlIHdpbGwgcmVkaXJ0eSB0aGUgcGFnZSBhbmQKQEAgLTIxMDAsMTIgKzIyMDcsMTQgQEAKIAkJaWYgKGVyciA9PSAtRU5PU1BDKSB7CiAJCQlleHQ0X3ByaW50X2ZyZWVfYmxvY2tzKG1wZC0+aW5vZGUpOwogCQl9Ci0JCS8qIGludmxhaWRhdGUgYWxsIHRoZSBwYWdlcyAqLworCQkvKiBpbnZhbGlkYXRlIGFsbCB0aGUgcGFnZXMgKi8KIAkJZXh0NF9kYV9ibG9ja19pbnZhbGlkYXRlcGFnZXMobXBkLCBuZXh0LAogCQkJCW1wZC0+Yl9zaXplID4+IG1wZC0+aW5vZGUtPmlfYmxrYml0cyk7CiAJCXJldHVybiBlcnI7CiAJfQotCUJVR19PTihuZXcuYl9zaXplID09IDApOworCUJVR19PTihibGtzID09IDApOworCisJbmV3LmJfc2l6ZSA9IChibGtzIDw8IG1wZC0+aW5vZGUtPmlfYmxrYml0cyk7CiAKIAlpZiAoYnVmZmVyX25ldygmbmV3KSkKIAkJX191bm1hcF91bmRlcmx5aW5nX2Jsb2NrcyhtcGQtPmlub2RlLCAmbmV3KTsKQEAgLTIxMTgsNiArMjIyNywyMyBAQAogCSAgICAobXBkLT5iX3N0YXRlICYgKDEgPDwgQkhfVW53cml0dGVuKSkpCiAJCW1wYWdlX3B1dF9ibnJfdG9fYmhzKG1wZCwgbmV4dCwgJm5ldyk7CiAKKwlpZiAoZXh0NF9zaG91bGRfb3JkZXJfZGF0YShtcGQtPmlub2RlKSkgeworCQllcnIgPSBleHQ0X2piZDJfZmlsZV9pbm9kZShoYW5kbGUsIG1wZC0+aW5vZGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBvbi1kaXNrIHNpemUgYWxvbmcgd2l0aCBibG9jayBhbGxvY2F0aW9uLgorCSAqLworCWRpc2tzaXplID0gKChsb2ZmX3QpIG5leHQgKyBibGtzKSA8PCBtcGQtPmlub2RlLT5pX2Jsa2JpdHM7CisJaWYgKGRpc2tzaXplID4gaV9zaXplX3JlYWQobXBkLT5pbm9kZSkpCisJCWRpc2tzaXplID0gaV9zaXplX3JlYWQobXBkLT5pbm9kZSk7CisJaWYgKGRpc2tzaXplID4gRVhUNF9JKG1wZC0+aW5vZGUpLT5pX2Rpc2tzaXplKSB7CisJCWV4dDRfdXBkYXRlX2lfZGlza3NpemUobXBkLT5pbm9kZSwgZGlza3NpemUpOworCQlyZXR1cm4gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgbXBkLT5pbm9kZSk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxOTIsNiArMjMxOCwxNyBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBleHQ0X2JoX3VubWFwcGVkX29yX2RlbGF5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJLyoKKwkgKiB1bm1hcHBlZCBidWZmZXIgaXMgcG9zc2libGUgZm9yIGhvbGVzLgorCSAqIGRlbGF5IGJ1ZmZlciBpcyBwb3NzaWJsZSB3aXRoIGRlbGF5ZWQgYWxsb2NhdGlvbi4KKwkgKiBXZSBhbHNvIG5lZWQgdG8gY29uc2lkZXIgdW53cml0dGVuIGJ1ZmZlciBhcyB1bm1hcHBlZC4KKwkgKi8KKwlyZXR1cm4gKCFidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfZGVsYXkoYmgpIHx8CisJCQkJYnVmZmVyX3Vud3JpdHRlbihiaCkpICYmIGJ1ZmZlcl9kaXJ0eShiaCk7Cit9CisKIC8qCiAgKiBfX21wYWdlX2RhX3dyaXRlcGFnZSAtIGZpbmRzIGV4dGVudCBvZiBwYWdlcyBhbmQgYmxvY2tzCiAgKgpAQCAtMjI3Niw4ICsyNDEzLDcgQEAKIAkJCSAqIE90aGVyd2lzZSB3ZSB3b24ndCBtYWtlIHByb2dyZXNzCiAJCQkgKiB3aXRoIHRoZSBwYWdlIGluIGV4dDRfZGFfd3JpdGVwYWdlCiAJCQkgKi8KLQkJCWlmIChidWZmZXJfZGlydHkoYmgpICYmCi0JCQkgICAgKCFidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfZGVsYXkoYmgpKSkgeworCQkJaWYgKGV4dDRfYmhfdW5tYXBwZWRfb3JfZGVsYXkoTlVMTCwgYmgpKSB7CiAJCQkJbXBhZ2VfYWRkX2JoX3RvX2V4dGVudChtcGQsIGxvZ2ljYWwsCiAJCQkJCQkgICAgICAgYmgtPmJfc2l6ZSwKIAkJCQkJCSAgICAgICBiaC0+Yl9zdGF0ZSk7CkBAIC0yMzAzLDggKzI0MzksMTYgQEAKIH0KIAogLyoKLSAqIHRoaXMgaXMgYSBzcGVjaWFsIGNhbGxiYWNrIGZvciAtPndyaXRlX2JlZ2luKCkgb25seQotICogaXQncyBpbnRlbnRpb24gaXMgdG8gcmV0dXJuIG1hcHBlZCBibG9jayBvciByZXNlcnZlIHNwYWNlCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBnZXRfYmxvY2tzX3QgY2FsbGJhY2sgd2hpY2ggaXMgdXNlZCBieQorICogZXh0NF9kYV93cml0ZV9iZWdpbigpLiAgSXQgd2lsbCBlaXRoZXIgcmV0dXJuIG1hcHBlZCBibG9jayBvcgorICogcmVzZXJ2ZSBzcGFjZSBmb3IgYSBzaW5nbGUgYmxvY2suCisgKgorICogRm9yIGRlbGF5ZWQgYnVmZmVyX2hlYWQgd2UgaGF2ZSBCSF9NYXBwZWQsIEJIX05ldywgQkhfRGVsYXkgc2V0LgorICogV2UgYWxzbyBoYXZlIGJfYmxvY2tuciA9IC0xIGFuZCBiX2JkZXYgaW5pdGlhbGl6ZWQgcHJvcGVybHkKKyAqCisgKiBGb3IgdW53cml0dGVuIGJ1ZmZlcl9oZWFkIHdlIGhhdmUgQkhfTWFwcGVkLCBCSF9OZXcsIEJIX1Vud3JpdHRlbiBzZXQuCisgKiBXZSBhbHNvIGhhdmUgYl9ibG9ja25yID0gcGh5c2ljYWxibG9jayBtYXBwaW5nIHVud3JpdHRlbiBleHRlbnQgYW5kIGJfYmRldgorICogaW5pdGlhbGl6ZWQgcHJvcGVybHkuCiAgKi8KIHN0YXRpYyBpbnQgZXh0NF9kYV9nZXRfYmxvY2tfcHJlcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCiAJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKQEAgLTIzMjMsNyArMjQ2Nyw3IEBACiAJICogcHJlYWxsb2NhdGVkIGJsb2NrcyBhcmUgdW5tYXBwZWQgYnV0IHNob3VsZCB0cmVhdGVkCiAJICogdGhlIHNhbWUgYXMgYWxsb2NhdGVkIGJsb2Nrcy4KIAkgKi8KLQlyZXQgPSBleHQ0X2dldF9ibG9ja3Nfd3JhcChOVUxMLCBpbm9kZSwgaWJsb2NrLCAxLCAgYmhfcmVzdWx0LCAwLCAwLCAwKTsKKwlyZXQgPSBleHQ0X2dldF9ibG9ja3MoTlVMTCwgaW5vZGUsIGlibG9jaywgMSwgIGJoX3Jlc3VsdCwgMCk7CiAJaWYgKChyZXQgPT0gMCkgJiYgIWJ1ZmZlcl9kZWxheShiaF9yZXN1bHQpKSB7CiAJCS8qIHRoZSBibG9jayBpc24ndCAocHJlKWFsbG9jYXRlZCB5ZXQsIGxldCdzIHJlc2VydmUgc3BhY2UgKi8KIAkJLyoKQEAgLTIzNDAsNDAgKzI0ODQsNTMgQEAKIAkJc2V0X2J1ZmZlcl9kZWxheShiaF9yZXN1bHQpOwogCX0gZWxzZSBpZiAocmV0ID4gMCkgewogCQliaF9yZXN1bHQtPmJfc2l6ZSA9IChyZXQgPDwgaW5vZGUtPmlfYmxrYml0cyk7Ci0JCS8qCi0JCSAqIFdpdGggc3ViLWJsb2NrIHdyaXRlcyBpbnRvIHVud3JpdHRlbiBleHRlbnRzCi0JCSAqIHdlIGFsc28gbmVlZCB0byBtYXJrIHRoZSBidWZmZXIgYXMgbmV3IHNvIHRoYXQKLQkJICogdGhlIHVud3JpdHRlbiBwYXJ0cyBvZiB0aGUgYnVmZmVyIGdldHMgY29ycmVjdGx5IHplcm9lZC4KLQkJICovCi0JCWlmIChidWZmZXJfdW53cml0dGVuKGJoX3Jlc3VsdCkpCisJCWlmIChidWZmZXJfdW53cml0dGVuKGJoX3Jlc3VsdCkpIHsKKwkJCS8qIEEgZGVsYXllZCB3cml0ZSB0byB1bndyaXR0ZW4gYmggc2hvdWxkCisJCQkgKiBiZSBtYXJrZWQgbmV3IGFuZCBtYXBwZWQuICBNYXBwZWQgZW5zdXJlcworCQkJICogdGhhdCB3ZSBkb24ndCBkbyBnZXRfYmxvY2sgbXVsdGlwbGUgdGltZXMKKwkJCSAqIHdoZW4gd2Ugd3JpdGUgdG8gdGhlIHNhbWUgb2Zmc2V0IGFuZCBuZXcKKwkJCSAqIGVuc3VyZXMgdGhhdCB3ZSBkbyBwcm9wZXIgemVybyBvdXQgZm9yCisJCQkgKiBwYXJ0aWFsIHdyaXRlLgorCQkJICovCiAJCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KTsKKwkJfQogCQlyZXQgPSAwOwogCX0KIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9iaF91bm1hcHBlZF9vcl9kZWxheShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQotewotCS8qCi0JICogdW5tYXBwZWQgYnVmZmVyIGlzIHBvc3NpYmxlIGZvciBob2xlcy4KLQkgKiBkZWxheSBidWZmZXIgaXMgcG9zc2libGUgd2l0aCBkZWxheWVkIGFsbG9jYXRpb24KLQkgKi8KLQlyZXR1cm4gKCghYnVmZmVyX21hcHBlZChiaCkgfHwgYnVmZmVyX2RlbGF5KGJoKSkgJiYgYnVmZmVyX2RpcnR5KGJoKSk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh0NF9ub3JtYWxfZ2V0X2Jsb2NrX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBzdGFuZGFyZCBnZXRfYmxvY2tfdCBjYWxiYWNrIGZ1bmN0aW9uCisgKiB3aGVuIHRoZXJlIGlzIG5vIGRlc2lyZSB0byBhbGxvY2F0ZSBhbnkgYmxvY2tzLiAgSXQgaXMgdXNlZCBhcyBhCisgKiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYmxvY2tfcHJlcGFyZV93cml0ZSgpLCBub2JoX3dyaXRlcGFnZSgpLCBhbmQKKyAqIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpLiAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBvbmx5IHRyeSB0byBtYXAgYQorICogc2luZ2xlIGJsb2NrIGF0IGEgdGltZS4KKyAqCisgKiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYmxvY2sgYWxsb2NhdGlvbnMgZXZlbiBpZiB0aGUgY2FsbGVyCisgKiByZXF1ZXN0cyBpdCBieSBwYXNzaW5nIGluIGNyZWF0ZT0xLCBpdCBpcyBjcml0aWNhbGx5IGltcG9ydGFudCB0aGF0CisgKiBhbnkgY2FsbGVyIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCBhbnkgYnVmZmVyIGhlYWRzIGFyZSByZXR1cm5lZAorICogYnkgdGhpcyBmdW5jdGlvbiBhcmUgZWl0aGVyIGFsbCBhbHJlYWR5IG1hcHBlZCBvciBtYXJrZWQgZm9yCisgKiBkZWxheWVkIGFsbG9jYXRpb24gYmVmb3JlIGNhbGxpbmcgbm9iaF93cml0ZXBhZ2UoKSBvcgorICogYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkuICBPdGhlcndpc2UsIGJfYmxvY2tuciBjb3VsZCBiZSBsZWZ0CisgKiB1bml0aWFsaXplZCwgYW5kIHRoZSBwYWdlIHdyaXRlIGZ1bmN0aW9ucyB3aWxsIGJlIHRha2VuIGJ5CisgKiBzdXJwcmlzZS4KKyAqLworc3RhdGljIGludCBub2FsbG9jX2dldF9ibG9ja193cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCiAJCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7CiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbWF4X2Jsb2NrcyA9IGJoX3Jlc3VsdC0+Yl9zaXplID4+IGlub2RlLT5pX2Jsa2JpdHM7CiAKKwlCVUdfT04oYmhfcmVzdWx0LT5iX3NpemUgIT0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwogCS8qCiAJICogd2UgZG9uJ3Qgd2FudCB0byBkbyBibG9jayBhbGxvY2F0aW9uIGluIHdyaXRlcGFnZQogCSAqIHNvIGNhbGwgZ2V0X2Jsb2NrX3dyYXAgd2l0aCBjcmVhdGUgPSAwCiAJICovCi0JcmV0ID0gZXh0NF9nZXRfYmxvY2tzX3dyYXAoTlVMTCwgaW5vZGUsIGlibG9jaywgbWF4X2Jsb2NrcywKLQkJCQkgICBiaF9yZXN1bHQsIDAsIDAsIDApOworCXJldCA9IGV4dDRfZ2V0X2Jsb2NrcyhOVUxMLCBpbm9kZSwgaWJsb2NrLCBtYXhfYmxvY2tzLCBiaF9yZXN1bHQsIDApOworCUJVR19PTihjcmVhdGUgJiYgcmV0ID09IDApOwogCWlmIChyZXQgPiAwKSB7CiAJCWJoX3Jlc3VsdC0+Yl9zaXplID0gKHJldCA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKIAkJcmV0ID0gMDsKQEAgLTIzODIsMTAgKzI1MzksMTEgQEAKIH0KIAogLyoKLSAqIGdldCBjYWxsZWQgdmkgZXh0NF9kYV93cml0ZXBhZ2VzIGFmdGVyIHRha2luZyBwYWdlIGxvY2sgKGhhdmUgam91cm5hbCBoYW5kbGUpCi0gKiBnZXQgY2FsbGVkIHZpYSBqb3VybmFsX3N1Ym1pdF9pbm9kZV9kYXRhX2J1ZmZlcnMgKG5vIGpvdXJuYWwgaGFuZGxlKQotICogZ2V0IGNhbGxlZCB2aWEgc2hyaW5rX3BhZ2VfbGlzdCB2aWEgcGRmbHVzaCAobm8gam91cm5hbCBoYW5kbGUpCi0gKiBvciBncmFiX3BhZ2VfY2FjaGUgd2hlbiBkb2luZyB3cml0ZV9iZWdpbiAoaGF2ZSBqb3VybmFsIGhhbmRsZSkKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGdldCBjYWxsZWQgdmlhLi4uCisgKiAgIC0gZXh0NF9kYV93cml0ZXBhZ2VzIGFmdGVyIHRha2luZyBwYWdlIGxvY2sgKGhhdmUgam91cm5hbCBoYW5kbGUpCisgKiAgIC0gam91cm5hbF9zdWJtaXRfaW5vZGVfZGF0YV9idWZmZXJzIChubyBqb3VybmFsIGhhbmRsZSkKKyAqICAgLSBzaHJpbmtfcGFnZV9saXN0IHZpYSBwZGZsdXNoIChubyBqb3VybmFsIGhhbmRsZSkKKyAqICAgLSBncmFiX3BhZ2VfY2FjaGUgd2hlbiBkb2luZyB3cml0ZV9iZWdpbiAoaGF2ZSBqb3VybmFsIGhhbmRsZSkKICAqLwogc3RhdGljIGludCBleHQ0X2RhX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKQEAgLTI0MzYsNyArMjU5NCw3IEBACiAJCSAqIGRvIGJsb2NrIGFsbG9jYXRpb24gaGVyZS4KIAkJICovCiAJCXJldCA9IGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFLAotCQkJCQkJZXh0NF9ub3JtYWxfZ2V0X2Jsb2NrX3dyaXRlKTsKKwkJCQkJICBub2FsbG9jX2dldF9ibG9ja193cml0ZSk7CiAJCWlmICghcmV0KSB7CiAJCQlwYWdlX2J1ZnMgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CiAJCQkvKiBjaGVjayB3aGV0aGVyIGFsbCBhcmUgbWFwcGVkIGFuZCBub24gZGVsYXkgKi8KQEAgLTI0NjEsMTEgKzI2MTksMTAgQEAKIAl9CiAKIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpICYmIGV4dDRfc2hvdWxkX3dyaXRlYmFja19kYXRhKGlub2RlKSkKLQkJcmV0ID0gbm9iaF93cml0ZXBhZ2UocGFnZSwgZXh0NF9ub3JtYWxfZ2V0X2Jsb2NrX3dyaXRlLCB3YmMpOworCQlyZXQgPSBub2JoX3dyaXRlcGFnZShwYWdlLCBub2FsbG9jX2dldF9ibG9ja193cml0ZSwgd2JjKTsKIAllbHNlCi0JCXJldCA9IGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLAotCQkJCQkJZXh0NF9ub3JtYWxfZ2V0X2Jsb2NrX3dyaXRlLAotCQkJCQkJd2JjKTsKKwkJcmV0ID0gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIG5vYWxsb2NfZ2V0X2Jsb2NrX3dyaXRlLAorCQkJCQkgICAgd2JjKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNzc3LDcgKzI5MzQsNyBAQAogCSpwYWdlcCA9IHBhZ2U7CiAKIAlyZXQgPSBibG9ja193cml0ZV9iZWdpbihmaWxlLCBtYXBwaW5nLCBwb3MsIGxlbiwgZmxhZ3MsIHBhZ2VwLCBmc2RhdGEsCi0JCQkJCQkJZXh0NF9kYV9nZXRfYmxvY2tfcHJlcCk7CisJCQkJZXh0NF9kYV9nZXRfYmxvY2tfcHJlcCk7CiAJaWYgKHJldCA8IDApIHsKIAkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CkBAIC0yODE1LDcgKzI5NzIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBpZHg7IGkrKykKIAkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CiAKLQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8IChidWZmZXJfZGVsYXkoYmgpKSkKKwlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpIHx8IChidWZmZXJfZGVsYXkoYmgpKSB8fCBidWZmZXJfdW53cml0dGVuKGJoKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIDE7CiB9CkBAIC0zMDg1LDEyICszMjQyLDEwIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CiAKIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQotCQlyZXR1cm4gbm9iaF93cml0ZXBhZ2UocGFnZSwKLQkJCQkJZXh0NF9ub3JtYWxfZ2V0X2Jsb2NrX3dyaXRlLCB3YmMpOworCQlyZXR1cm4gbm9iaF93cml0ZXBhZ2UocGFnZSwgbm9hbGxvY19nZXRfYmxvY2tfd3JpdGUsIHdiYyk7CiAJZWxzZQotCQlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsCi0JCQkJCQlleHQ0X25vcm1hbF9nZXRfYmxvY2tfd3JpdGUsCi0JCQkJCQl3YmMpOworCQlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIG5vYWxsb2NfZ2V0X2Jsb2NrX3dyaXRlLAorCQkJCQkgICAgIHdiYyk7CiB9CiAKIHN0YXRpYyBpbnQgZXh0NF9ub3JtYWxfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLApAQCAtMzE0Miw3ICszMjk3LDcgQEAKIAlpbnQgZXJyOwogCiAJcmV0ID0gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCAwLCBQQUdFX0NBQ0hFX1NJWkUsCi0JCQkJCWV4dDRfbm9ybWFsX2dldF9ibG9ja193cml0ZSk7CisJCQkJICBub2FsbG9jX2dldF9ibG9ja193cml0ZSk7CiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIG91dF91bmxvY2s7CiAKQEAgLTMyMjcsOSArMzM4Miw4IEBACiAJCSAqIHJlYWxseSBrbm93IHVubGVzcyB3ZSBnbyBwb2tlIGFyb3VuZCBpbiB0aGUgYnVmZmVyX2hlYWRzLgogCQkgKiBCdXQgYmxvY2tfd3JpdGVfZnVsbF9wYWdlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLgogCQkgKi8KLQkJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLAotCQkJCQkJZXh0NF9ub3JtYWxfZ2V0X2Jsb2NrX3dyaXRlLAotCQkJCQkJd2JjKTsKKwkJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBub2FsbG9jX2dldF9ibG9ja193cml0ZSwKKwkJCQkJICAgICB3YmMpOwogCX0KIG5vX3dyaXRlOgogCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CkBAIC0zOTczLDcgKzQxMjcsOCBAQAogCWlmICghZXh0NF9jYW5fdHJ1bmNhdGUoaW5vZGUpKQogCQlyZXR1cm47CiAKLQlpZiAoaW5vZGUtPmlfc2l6ZSA9PSAwICYmICF0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9fQVVUT19EQV9BTExPQykpCisJaWYgKGVpLT5pX2Rpc2tzaXplICYmIGlub2RlLT5pX3NpemUgPT0gMCAmJgorCSAgICAhdGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PX0FVVE9fREFfQUxMT0MpKQogCQllaS0+aV9zdGF0ZSB8PSBFWFQ0X1NUQVRFX0RBX0FMTE9DX0NMT1NFOwogCiAJaWYgKEVYVDRfSShpbm9kZSktPmlfZmxhZ3MgJiBFWFQ0X0VYVEVOVFNfRkwpIHsKQEAgLTQ3MTUsMjUgKzQ4NzAsNiBAQAogCXJldHVybiBleHQ0X2ZvcmNlX2NvbW1pdChpbm9kZS0+aV9zYik7CiB9CiAKLWludCBfX2V4dDRfd3JpdGVfZGlydHlfbWV0YWRhdGEoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKLXsKLQlpbnQgZXJyID0gMDsKLQotCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQlpZiAoaW5vZGUgJiYgaW5vZGVfbmVlZHNfc3luYyhpbm9kZSkpIHsKLQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwotCQlpZiAoYnVmZmVyX3JlcShiaCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKLQkJCWV4dDRfZXJyb3IoaW5vZGUtPmlfc2IsIF9fZnVuY19fLAotCQkJCSAgICJJTyBlcnJvciBzeW5jaW5nIGlub2RlLCAiCi0JCQkJICAgImlub2RlPSVsdSwgYmxvY2s9JWxsdSIsCi0JCQkJICAgaW5vZGUtPmlfaW5vLAotCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7Ci0JCQllcnIgPSAtRUlPOwotCQl9Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KIC8qCiAgKiBleHQ0X3NldGF0dHIoKQogICoKQEAgLTQ5MzAsNyArNTA2Niw4IEBACiAgKi8KIGludCBleHQ0X21ldGFfdHJhbnNfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBucmJsb2NrcywgaW50IGNodW5rKQogewotCWludCBncm91cHMsIGdkcGJsb2NrczsKKwlleHQ0X2dyb3VwX3QgZ3JvdXBzLCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KGlub2RlLT5pX3NiKTsKKwlpbnQgZ2RwYmxvY2tzOwogCWludCBpZHhibG9ja3M7CiAJaW50IHJldCA9IDA7CiAKQEAgLTQ5NTcsOCArNTA5NCw4IEBACiAJCWdyb3VwcyArPSBucmJsb2NrczsKIAogCWdkcGJsb2NrcyA9IGdyb3VwczsKLQlpZiAoZ3JvdXBzID4gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZ3JvdXBzX2NvdW50KQotCQlncm91cHMgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19ncm91cHNfY291bnQ7CisJaWYgKGdyb3VwcyA+IG5ncm91cHMpCisJCWdyb3VwcyA9IG5ncm91cHM7CiAJaWYgKGdyb3VwcyA+IEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2dkYl9jb3VudCkKIAkJZ2RwYmxvY2tzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZ2RiX2NvdW50OwogCkBAIC00OTk4LDcgKzUxMzUsNyBAQAogICogQ2FsY3VsYXRlIHRoZSBqb3VybmFsIGNyZWRpdHMgZm9yIGEgY2h1bmsgb2YgZGF0YSBtb2RpZmljYXRpb24uCiAgKgogICogVGhpcyBpcyBjYWxsZWQgZnJvbSBESU8sIGZhbGxvY2F0ZSBvciB3aG9ldmVyIGNhbGxpbmcKLSAqIGV4dDRfZ2V0X2Jsb2Nrc193cmFwKCkgdG8gbWFwL2FsbG9jYXRlIGEgY2h1bmsgb2YgY29udGlnb3VzIGRpc2sgYmxvY2tzLgorICogZXh0NF9nZXRfYmxvY2tzKCkgdG8gbWFwL2FsbG9jYXRlIGEgY2h1bmsgb2YgY29udGlnb3VzIGRpc2sgYmxvY2tzLgogICoKICAqIGpvdXJuYWwgYnVmZmVycyBmb3IgZGF0YSBibG9ja3MgYXJlIG5vdCBpbmNsdWRlZCBoZXJlLCBhcyBESU8KICAqIGFuZCBmYWxsb2NhdGUgZG8gbm8gbmVlZCB0byBqb3VybmFsIGRhdGEgYnVmZmVycy4KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMKaW5kZXggZjg3MTY3Ny4uZWQ4NDgyZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9tYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM3MiwyNCArMzcyLDEyIEBACiAJZXh0NF9zZXRfYml0KGJpdCwgYWRkcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtYl9zZXRfYml0X2F0b21pYyhzcGlubG9ja190ICpsb2NrLCBpbnQgYml0LCB2b2lkICphZGRyKQotewotCWFkZHIgPSBtYl9jb3JyZWN0X2FkZHJfYW5kX2JpdCgmYml0LCBhZGRyKTsKLQlleHQ0X3NldF9iaXRfYXRvbWljKGxvY2ssIGJpdCwgYWRkcik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBtYl9jbGVhcl9iaXQoaW50IGJpdCwgdm9pZCAqYWRkcikKIHsKIAlhZGRyID0gbWJfY29ycmVjdF9hZGRyX2FuZF9iaXQoJmJpdCwgYWRkcik7CiAJZXh0NF9jbGVhcl9iaXQoYml0LCBhZGRyKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1iX2NsZWFyX2JpdF9hdG9taWMoc3BpbmxvY2tfdCAqbG9jaywgaW50IGJpdCwgdm9pZCAqYWRkcikKLXsKLQlhZGRyID0gbWJfY29ycmVjdF9hZGRyX2FuZF9iaXQoJmJpdCwgYWRkcik7Ci0JZXh0NF9jbGVhcl9iaXRfYXRvbWljKGxvY2ssIGJpdCwgYWRkcik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG1iX2ZpbmRfbmV4dF96ZXJvX2JpdCh2b2lkICphZGRyLCBpbnQgbWF4LCBpbnQgc3RhcnQpCiB7CiAJaW50IGZpeCA9IDAsIHJldCwgdG1wbWF4OwpAQCAtNDQ4LDcgKzQzNiw3IEBACiAKIAlpZiAodW5saWtlbHkoZTRiLT5iZF9pbmZvLT5iYl9iaXRtYXAgPT0gTlVMTCkpCiAJCXJldHVybjsKLQlCVUdfT04oIWV4dDRfaXNfZ3JvdXBfbG9ja2VkKHNiLCBlNGItPmJkX2dyb3VwKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKGV4dDRfZ3JvdXBfbG9ja19wdHIoc2IsIGU0Yi0+YmRfZ3JvdXApKTsKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlpZiAoIW1iX3Rlc3RfYml0KGZpcnN0ICsgaSwgZTRiLT5iZF9pbmZvLT5iYl9iaXRtYXApKSB7CiAJCQlleHQ0X2ZzYmxrX3QgYmxvY2tucjsKQEAgLTQ3Miw3ICs0NjAsNyBAQAogCiAJaWYgKHVubGlrZWx5KGU0Yi0+YmRfaW5mby0+YmJfYml0bWFwID09IE5VTEwpKQogCQlyZXR1cm47Ci0JQlVHX09OKCFleHQ0X2lzX2dyb3VwX2xvY2tlZChlNGItPmJkX3NiLCBlNGItPmJkX2dyb3VwKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKGV4dDRfZ3JvdXBfbG9ja19wdHIoZTRiLT5iZF9zYiwgZTRiLT5iZF9ncm91cCkpOwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCUJVR19PTihtYl90ZXN0X2JpdChmaXJzdCArIGksIGU0Yi0+YmRfaW5mby0+YmJfYml0bWFwKSk7CiAJCW1iX3NldF9iaXQoZmlyc3QgKyBpLCBlNGItPmJkX2luZm8tPmJiX2JpdG1hcCk7CkBAIC03MzksNiArNzI3LDcgQEAKIAogc3RhdGljIGludCBleHQ0X21iX2luaXRfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIGNoYXIgKmluY29yZSkKIHsKKwlleHQ0X2dyb3VwX3Qgbmdyb3VwczsKIAlpbnQgYmxvY2tzaXplOwogCWludCBibG9ja3NfcGVyX3BhZ2U7CiAJaW50IGdyb3Vwc19wZXJfcGFnZTsKQEAgLTc1Nyw2ICs3NDYsNyBAQAogCiAJaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OwogCXNiID0gaW5vZGUtPmlfc2I7CisJbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOwogCWJsb2Nrc19wZXJfcGFnZSA9IFBBR0VfQ0FDSEVfU0laRSAvIGJsb2Nrc2l6ZTsKIApAQCAtNzgwLDcgKzc3MCw3IEBACiAJZm9yIChpID0gMDsgaSA8IGdyb3Vwc19wZXJfcGFnZTsgaSsrKSB7CiAJCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CiAKLQkJaWYgKGZpcnN0X2dyb3VwICsgaSA+PSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQpCisJCWlmIChmaXJzdF9ncm91cCArIGkgPj0gbmdyb3VwcykKIAkJCWJyZWFrOwogCiAJCWVyciA9IC1FSU87CkBAIC04MDEsMTcgKzc5MSwxNyBAQAogCQkJdW5sb2NrX2J1ZmZlcihiaFtpXSk7CiAJCQljb250aW51ZTsKIAkJfQotCQlzcGluX2xvY2soc2JfYmdsX2xvY2soRVhUNF9TQihzYiksIGZpcnN0X2dyb3VwICsgaSkpOworCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGZpcnN0X2dyb3VwICsgaSk7CiAJCWlmIChkZXNjLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkgewogCQkJZXh0NF9pbml0X2Jsb2NrX2JpdG1hcChzYiwgYmhbaV0sCiAJCQkJCQlmaXJzdF9ncm91cCArIGksIGRlc2MpOwogCQkJc2V0X2JpdG1hcF91cHRvZGF0ZShiaFtpXSk7CiAJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoW2ldKTsKLQkJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBmaXJzdF9ncm91cCArIGkpKTsKKwkJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBmaXJzdF9ncm91cCArIGkpOwogCQkJdW5sb2NrX2J1ZmZlcihiaFtpXSk7CiAJCQljb250aW51ZTsKIAkJfQotCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgZmlyc3RfZ3JvdXAgKyBpKSk7CisJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBmaXJzdF9ncm91cCArIGkpOwogCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoW2ldKSkgewogCQkJLyoKIAkJCSAqIGlmIG5vdCB1bmluaXQgaWYgYmggaXMgdXB0b2RhdGUsCkBAIC04NTIsNyArODQyLDcgQEAKIAkJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvOwogCiAJCWdyb3VwID0gKGZpcnN0X2Jsb2NrICsgaSkgPj4gMTsKLQkJaWYgKGdyb3VwID49IEVYVDRfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudCkKKwkJaWYgKGdyb3VwID49IG5ncm91cHMpCiAJCQlicmVhazsKIAogCQkvKgpAQCAtMTA3OCw3ICsxMDY4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWJfY2xlYXJfYml0cyhzcGlubG9ja190ICpsb2NrLCB2b2lkICpibSwgaW50IGN1ciwgaW50IGxlbikKK3N0YXRpYyB2b2lkIG1iX2NsZWFyX2JpdHModm9pZCAqYm0sIGludCBjdXIsIGludCBsZW4pCiB7CiAJX191MzIgKmFkZHI7CiAKQEAgLTEwOTEsMTUgKzEwODEsMTIgQEAKIAkJCWN1ciArPSAzMjsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmIChsb2NrKQotCQkJbWJfY2xlYXJfYml0X2F0b21pYyhsb2NrLCBjdXIsIGJtKTsKLQkJZWxzZQotCQkJbWJfY2xlYXJfYml0KGN1ciwgYm0pOworCQltYl9jbGVhcl9iaXQoY3VyLCBibSk7CiAJCWN1cisrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbWJfc2V0X2JpdHMoc3BpbmxvY2tfdCAqbG9jaywgdm9pZCAqYm0sIGludCBjdXIsIGludCBsZW4pCitzdGF0aWMgdm9pZCBtYl9zZXRfYml0cyh2b2lkICpibSwgaW50IGN1ciwgaW50IGxlbikKIHsKIAlfX3UzMiAqYWRkcjsKIApAQCAtMTExMiwxMCArMTA5OSw3IEBACiAJCQljdXIgKz0gMzI7CiAJCQljb250aW51ZTsKIAkJfQotCQlpZiAobG9jaykKLQkJCW1iX3NldF9iaXRfYXRvbWljKGxvY2ssIGN1ciwgYm0pOwotCQllbHNlCi0JCQltYl9zZXRfYml0KGN1ciwgYm0pOworCQltYl9zZXRfYml0KGN1ciwgYm0pOwogCQljdXIrKzsKIAl9CiB9CkBAIC0xMTMxLDcgKzExMTUsNyBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBlNGItPmJkX3NiOwogCiAJQlVHX09OKGZpcnN0ICsgY291bnQgPiAoc2ItPnNfYmxvY2tzaXplIDw8IDMpKTsKLQlCVUdfT04oIWV4dDRfaXNfZ3JvdXBfbG9ja2VkKHNiLCBlNGItPmJkX2dyb3VwKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKGV4dDRfZ3JvdXBfbG9ja19wdHIoc2IsIGU0Yi0+YmRfZ3JvdXApKTsKIAltYl9jaGVja19idWRkeShlNGIpOwogCW1iX2ZyZWVfYmxvY2tzX2RvdWJsZShpbm9kZSwgZTRiLCBmaXJzdCwgY291bnQpOwogCkBAIC0xMjEyLDcgKzExOTYsNyBAQAogCWludCBvcmQ7CiAJdm9pZCAqYnVkZHk7CiAKLQlCVUdfT04oIWV4dDRfaXNfZ3JvdXBfbG9ja2VkKGU0Yi0+YmRfc2IsIGU0Yi0+YmRfZ3JvdXApKTsKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoZXh0NF9ncm91cF9sb2NrX3B0cihlNGItPmJkX3NiLCBlNGItPmJkX2dyb3VwKSk7CiAJQlVHX09OKGV4ID09IE5VTEwpOwogCiAJYnVkZHkgPSBtYl9maW5kX2J1ZGR5KGU0Yiwgb3JkZXIsICZtYXgpOwpAQCAtMTI3Niw3ICsxMjYwLDcgQEAKIAogCUJVR19PTihzdGFydCArIGxlbiA+IChlNGItPmJkX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSk7CiAJQlVHX09OKGU0Yi0+YmRfZ3JvdXAgIT0gZXgtPmZlX2dyb3VwKTsKLQlCVUdfT04oIWV4dDRfaXNfZ3JvdXBfbG9ja2VkKGU0Yi0+YmRfc2IsIGU0Yi0+YmRfZ3JvdXApKTsKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoZXh0NF9ncm91cF9sb2NrX3B0cihlNGItPmJkX3NiLCBlNGItPmJkX2dyb3VwKSk7CiAJbWJfY2hlY2tfYnVkZHkoZTRiKTsKIAltYl9tYXJrX3VzZWRfZG91YmxlKGU0Yiwgc3RhcnQsIGxlbik7CiAKQEAgLTEzMzAsOCArMTMxNCw3IEBACiAJCWU0Yi0+YmRfaW5mby0+YmJfY291bnRlcnNbb3JkXSsrOwogCX0KIAotCW1iX3NldF9iaXRzKHNiX2JnbF9sb2NrKEVYVDRfU0IoZTRiLT5iZF9zYiksIGV4LT5mZV9ncm91cCksCi0JCQlFWFQ0X01CX0JJVE1BUChlNGIpLCBleC0+ZmVfc3RhcnQsIGxlbjApOworCW1iX3NldF9iaXRzKEVYVDRfTUJfQklUTUFQKGU0YiksIGV4LT5mZV9zdGFydCwgbGVuMCk7CiAJbWJfY2hlY2tfYnVkZHkoZTRiKTsKIAogCXJldHVybiByZXQ7CkBAIC0xNzI2LDcgKzE3MDksNiBAQAogCXVuc2lnbmVkIGZyZWUsIGZyYWdtZW50czsKIAl1bnNpZ25lZCBpLCBiaXRzOwogCWludCBmbGV4X3NpemUgPSBleHQ0X2ZsZXhfYmdfc2l6ZShFWFQ0X1NCKGFjLT5hY19zYikpOwotCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhhYy0+YWNfc2IsIGdyb3VwKTsKIAogCUJVR19PTihjciA8IDAgfHwgY3IgPj0gNCk7CkBAIC0xNzQyLDEwICsxNzI0LDYgQEAKIAlzd2l0Y2ggKGNyKSB7CiAJY2FzZSAwOgogCQlCVUdfT04oYWMtPmFjXzJvcmRlciA9PSAwKTsKLQkJLyogSWYgdGhpcyBncm91cCBpcyB1bmluaXRpYWxpemVkLCBza2lwIGl0IGluaXRpYWxseSAqLwotCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhhYy0+YWNfc2IsIGdyb3VwLCBOVUxMKTsKLQkJaWYgKGRlc2MtPmJnX2ZsYWdzICYgY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpKQotCQkJcmV0dXJuIDA7CiAKIAkJLyogQXZvaWQgdXNpbmcgdGhlIGZpcnN0IGJnIG9mIGEgZmxleGdyb3VwIGZvciBkYXRhIGZpbGVzICovCiAJCWlmICgoYWMtPmFjX2ZsYWdzICYgRVhUNF9NQl9ISU5UX0RBVEEpICYmCkBAIC0xNzg4LDYgKzE3NjYsNyBAQAogCWludCBibG9jaywgcG51bTsKIAlpbnQgYmxvY2tzX3Blcl9wYWdlOwogCWludCBncm91cHNfcGVyX3BhZ2U7CisJZXh0NF9ncm91cF90IG5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCWV4dDRfZ3JvdXBfdCBmaXJzdF9ncm91cDsKIAlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CiAKQEAgLTE4MDcsNyArMTc4Niw3IEBACiAJLyogcmVhZCBhbGwgZ3JvdXBzIHRoZSBwYWdlIGNvdmVycyBpbnRvIHRoZSBjYWNoZSAqLwogCWZvciAoaSA9IDA7IGkgPCBncm91cHNfcGVyX3BhZ2U7IGkrKykgewogCi0JCWlmICgoZmlyc3RfZ3JvdXAgKyBpKSA+PSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQpCisJCWlmICgoZmlyc3RfZ3JvdXAgKyBpKSA+PSBuZ3JvdXBzKQogCQkJYnJlYWs7CiAJCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGZpcnN0X2dyb3VwICsgaSk7CiAJCS8qIHRha2UgYWxsIGdyb3VwcyB3cml0ZSBhbGxvY2F0aW9uCkBAIC0xOTQ1LDggKzE5MjQsNyBAQAogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQKIGV4dDRfbWJfcmVndWxhcl9hbGxvY2F0b3Ioc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKLQlleHQ0X2dyb3VwX3QgZ3JvdXA7Ci0JZXh0NF9ncm91cF90IGk7CisJZXh0NF9ncm91cF90IG5ncm91cHMsIGdyb3VwLCBpOwogCWludCBjcjsKIAlpbnQgZXJyID0gMDsKIAlpbnQgYnNiaXRzOwpAQCAtMTk1Nyw2ICsxOTM1LDcgQEAKIAogCXNiID0gYWMtPmFjX3NiOwogCXNiaSA9IEVYVDRfU0Ioc2IpOworCW5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCUJVR19PTihhYy0+YWNfc3RhdHVzID09IEFDX1NUQVRVU19GT1VORCk7CiAKIAkvKiBmaXJzdCwgdHJ5IHRoZSBnb2FsICovCkBAIC0yMDE3LDExICsxOTk2LDExIEBACiAJCSAqLwogCQlncm91cCA9IGFjLT5hY19nX2V4LmZlX2dyb3VwOwogCi0JCWZvciAoaSA9IDA7IGkgPCBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGdyb3VwKyssIGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgZ3JvdXArKywgaSsrKSB7CiAJCQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CiAJCQlzdHJ1Y3QgZXh0NF9ncm91cF9kZXNjICpkZXNjOwogCi0JCQlpZiAoZ3JvdXAgPT0gRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50KQorCQkJaWYgKGdyb3VwID09IG5ncm91cHMpCiAJCQkJZ3JvdXAgPSAwOwogCiAJCQkvKiBxdWljayBjaGVjayB0byBza2lwIGVtcHR5IGdyb3VwcyAqLwpAQCAtMjA2NCw5ICsyMDQzLDcgQEAKIAogCQkJYWMtPmFjX2dyb3Vwc19zY2FubmVkKys7CiAJCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsIE5VTEwpOwotCQkJaWYgKGNyID09IDAgfHwgKGRlc2MtPmJnX2ZsYWdzICYKLQkJCQkJY3B1X3RvX2xlMTYoRVhUNF9CR19CTE9DS19VTklOSVQpICYmCi0JCQkJCWFjLT5hY18yb3JkZXIgIT0gMCkpCisJCQlpZiAoY3IgPT0gMCkKIAkJCQlleHQ0X21iX3NpbXBsZV9zY2FuX2dyb3VwKGFjLCAmZTRiKTsKIAkJCWVsc2UgaWYgKGNyID09IDEgJiYKIAkJCQkJYWMtPmFjX2dfZXguZmVfbGVuID09IHNiaS0+c19zdHJpcGUpCkBAIC0yMzE1LDEyICsyMjkyLDEwIEBACiBzdGF0aWMgdm9pZCAqZXh0NF9tYl9zZXFfZ3JvdXBzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2VxLT5wcml2YXRlOwotCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCWV4dDRfZ3JvdXBfdCBncm91cDsKIAotCWlmICgqcG9zIDwgMCB8fCAqcG9zID49IHNiaS0+c19ncm91cHNfY291bnQpCisJaWYgKCpwb3MgPCAwIHx8ICpwb3MgPj0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKSkKIAkJcmV0dXJuIE5VTEw7Ci0KIAlncm91cCA9ICpwb3MgKyAxOwogCXJldHVybiAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGdyb3VwKTsKIH0KQEAgLTIzMjgsMTEgKzIzMDMsMTAgQEAKIHN0YXRpYyB2b2lkICpleHQ0X21iX3NlcV9ncm91cHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNlcS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkgPSBFWFQ0X1NCKHNiKTsKIAlleHQ0X2dyb3VwX3QgZ3JvdXA7CiAKIAkrKypwb3M7Ci0JaWYgKCpwb3MgPCAwIHx8ICpwb3MgPj0gc2JpLT5zX2dyb3Vwc19jb3VudCkKKwlpZiAoKnBvcyA8IDAgfHwgKnBvcyA+PSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpKQogCQlyZXR1cm4gTlVMTDsKIAlncm91cCA9ICpwb3MgKyAxOwogCXJldHVybiAodm9pZCAqKSAoKHVuc2lnbmVkIGxvbmcpIGdyb3VwKTsKQEAgLTI0MjAsNyArMjM5NCw4IEBACiAKIAlpZiAoc2JpLT5zX3Byb2MgIT0gTlVMTCkgewogCQlyZW1vdmVfcHJvY19lbnRyeSgibWJfZ3JvdXBzIiwgc2JpLT5zX3Byb2MpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgibWJfaGlzdG9yeSIsIHNiaS0+c19wcm9jKTsKKwkJaWYgKHNiaS0+c19tYl9oaXN0b3J5X21heCkKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KCJtYl9oaXN0b3J5Iiwgc2JpLT5zX3Byb2MpOwogCX0KIAlrZnJlZShzYmktPnNfbWJfaGlzdG9yeSk7CiB9CkBAIC0yNDMxLDE3ICsyNDA2LDE3IEBACiAJaW50IGk7CiAKIAlpZiAoc2JpLT5zX3Byb2MgIT0gTlVMTCkgewotCQlwcm9jX2NyZWF0ZV9kYXRhKCJtYl9oaXN0b3J5IiwgU19JUlVHTywgc2JpLT5zX3Byb2MsCi0JCQkJICZleHQ0X21iX3NlcV9oaXN0b3J5X2ZvcHMsIHNiKTsKKwkJaWYgKHNiaS0+c19tYl9oaXN0b3J5X21heCkKKwkJCXByb2NfY3JlYXRlX2RhdGEoIm1iX2hpc3RvcnkiLCBTX0lSVUdPLCBzYmktPnNfcHJvYywKKwkJCQkJICZleHQ0X21iX3NlcV9oaXN0b3J5X2ZvcHMsIHNiKTsKIAkJcHJvY19jcmVhdGVfZGF0YSgibWJfZ3JvdXBzIiwgU19JUlVHTywgc2JpLT5zX3Byb2MsCiAJCQkJICZleHQ0X21iX3NlcV9ncm91cHNfZm9wcywgc2IpOwogCX0KIAotCXNiaS0+c19tYl9oaXN0b3J5X21heCA9IDEwMDA7CiAJc2JpLT5zX21iX2hpc3RvcnlfY3VyID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX21iX2hpc3RvcnlfbG9jayk7CiAJaSA9IHNiaS0+c19tYl9oaXN0b3J5X21heCAqIHNpemVvZihzdHJ1Y3QgZXh0NF9tYl9oaXN0b3J5KTsKLQlzYmktPnNfbWJfaGlzdG9yeSA9IGt6YWxsb2MoaSwgR0ZQX0tFUk5FTCk7CisJc2JpLT5zX21iX2hpc3RvcnkgPSBpID8ga3phbGxvYyhpLCBHRlBfS0VSTkVMKSA6IE5VTEw7CiAJLyogaWYgd2UgY2FuJ3QgYWxsb2NhdGUgaGlzdG9yeSwgdGhlbiB3ZSBzaW1wbGUgd29uJ3QgdXNlIGl0ICovCiB9CiAKQEAgLTI0NTEsNyArMjQyNiw3IEBACiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihhYy0+YWNfc2IpOwogCXN0cnVjdCBleHQ0X21iX2hpc3RvcnkgaDsKIAotCWlmICh1bmxpa2VseShzYmktPnNfbWJfaGlzdG9yeSA9PSBOVUxMKSkKKwlpZiAoc2JpLT5zX21iX2hpc3RvcnkgPT0gTlVMTCkKIAkJcmV0dXJuOwogCiAJaWYgKCEoYWMtPmFjX29wICYgc2JpLT5zX21iX2hpc3RvcnlfZmlsdGVyKSkKQEAgLTI1ODcsNiArMjU2Miw3IEBACiAKIHN0YXRpYyBpbnQgZXh0NF9tYl9pbml0X2JhY2tlbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKKwlleHQ0X2dyb3VwX3Qgbmdyb3VwcyA9IGV4dDRfZ2V0X2dyb3Vwc19jb3VudChzYik7CiAJZXh0NF9ncm91cF90IGk7CiAJaW50IG1ldGFsZW47CiAJc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpID0gRVhUNF9TQihzYik7CkBAIC0yNTk4LDcgKzI1NzQsNyBAQAogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2M7CiAKIAkvKiBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgR0RUICovCi0JbnVtX21ldGFfZ3JvdXBfaW5mb3MgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpIC0KKwludW1fbWV0YV9ncm91cF9pbmZvcyA9IChuZ3JvdXBzICsgRVhUNF9ERVNDX1BFUl9CTE9DSyhzYikgLQogCQkJCTEpID4+IEVYVDRfREVTQ19QRVJfQkxPQ0tfQklUUyhzYik7CiAKIAkvKgpAQCAtMjY0NCw3ICsyNjIwLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX21ldGFfZ3JvdXBfaW5mb3M7IGkrKykgewogCQlpZiAoKGkgKyAxKSA9PSBudW1fbWV0YV9ncm91cF9pbmZvcykKIAkJCW1ldGFsZW4gPSBzaXplb2YoKm1ldGFfZ3JvdXBfaW5mbykgKgotCQkJCShzYmktPnNfZ3JvdXBzX2NvdW50IC0KKwkJCQkobmdyb3VwcyAtCiAJCQkJCShpIDw8IEVYVDRfREVTQ19QRVJfQkxPQ0tfQklUUyhzYikpKTsKIAkJbWV0YV9ncm91cF9pbmZvID0ga21hbGxvYyhtZXRhbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG1ldGFfZ3JvdXBfaW5mbyA9PSBOVUxMKSB7CkBAIC0yNjU1LDcgKzI2MzEsNyBAQAogCQlzYmktPnNfZ3JvdXBfaW5mb1tpXSA9IG1ldGFfZ3JvdXBfaW5mbzsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewogCQlkZXNjID0gZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CiAJCWlmIChkZXNjID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0VSUgpAQCAtMjc2MSw3ICsyNzM3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogbmVlZCB0byBjYWxsZWQgd2l0aCBleHQ0IGdyb3VwIGxvY2sgKGV4dDRfbG9ja19ncm91cCkgKi8KKy8qIG5lZWQgdG8gY2FsbGVkIHdpdGggdGhlIGV4dDQgZ3JvdXAgbG9jayBoZWxkICovCiBzdGF0aWMgdm9pZCBleHQ0X21iX2NsZWFudXBfcGEoc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwKQogewogCXN0cnVjdCBleHQ0X3ByZWFsbG9jX3NwYWNlICpwYTsKQEAgLTI3ODEsMTMgKzI3NTcsMTQgQEAKIAogaW50IGV4dDRfbWJfcmVsZWFzZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogeworCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKIAlleHQ0X2dyb3VwX3QgaTsKIAlpbnQgbnVtX21ldGFfZ3JvdXBfaW5mb3M7CiAJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JpbmZvOwogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCiAJaWYgKHNiaS0+c19ncm91cF9pbmZvKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG5ncm91cHM7IGkrKykgewogCQkJZ3JpbmZvID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgaSk7CiAjaWZkZWYgRE9VQkxFX0NIRUNLCiAJCQlrZnJlZShncmluZm8tPmJiX2JpdG1hcCk7CkBAIC0yNzk3LDcgKzI3NzQsNyBAQAogCQkJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGkpOwogCQkJa2ZyZWUoZ3JpbmZvKTsKIAkJfQotCQludW1fbWV0YV9ncm91cF9pbmZvcyA9IChzYmktPnNfZ3JvdXBzX2NvdW50ICsKKwkJbnVtX21ldGFfZ3JvdXBfaW5mb3MgPSAobmdyb3VwcyArCiAJCQkJRVhUNF9ERVNDX1BFUl9CTE9DSyhzYikgLSAxKSA+PgogCQkJRVhUNF9ERVNDX1BFUl9CTE9DS19CSVRTKHNiKTsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9tZXRhX2dyb3VwX2luZm9zOyBpKyspCkBAIC0yOTg0LDI3ICsyOTYxLDI1IEBACiAJCSsgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CiAKIAlsZW4gPSBhYy0+YWNfYl9leC5mZV9sZW47Ci0JaWYgKGluX3JhbmdlKGV4dDRfYmxvY2tfYml0bWFwKHNiLCBnZHApLCBibG9jaywgbGVuKSB8fAotCSAgICBpbl9yYW5nZShleHQ0X2lub2RlX2JpdG1hcChzYiwgZ2RwKSwgYmxvY2ssIGxlbikgfHwKLQkgICAgaW5fcmFuZ2UoYmxvY2ssIGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCksCi0JCSAgICAgRVhUNF9TQihzYiktPnNfaXRiX3Blcl9ncm91cCkgfHwKLQkgICAgaW5fcmFuZ2UoYmxvY2sgKyBsZW4gLSAxLCBleHQ0X2lub2RlX3RhYmxlKHNiLCBnZHApLAotCQkgICAgIEVYVDRfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKSB7CisJaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoc2JpLCBibG9jaywgbGVuKSkgewogCQlleHQ0X2Vycm9yKHNiLCBfX2Z1bmNfXywKLQkJCSAgICJBbGxvY2F0aW5nIGJsb2NrICVsbHUgaW4gc3lzdGVtIHpvbmUgb2YgJWQgZ3JvdXBcbiIsCi0JCQkgICBibG9jaywgYWMtPmFjX2JfZXguZmVfZ3JvdXApOworCQkJICAgIkFsbG9jYXRpbmcgYmxvY2tzICVsbHUtJWxsdSB3aGljaCBvdmVybGFwICIKKwkJCSAgICJmcyBtZXRhZGF0YVxuIiwgYmxvY2ssIGJsb2NrK2xlbik7CiAJCS8qIEZpbGUgc3lzdGVtIG1vdW50ZWQgbm90IHRvIHBhbmljIG9uIGVycm9yCiAJCSAqIEZpeCB0aGUgYml0bWFwIGFuZCByZXBlYXQgdGhlIGJsb2NrIGFsbG9jYXRpb24KIAkJICogV2UgbGVhayBzb21lIG9mIHRoZSBibG9ja3MgaGVyZS4KIAkJICovCi0JCW1iX3NldF9iaXRzKHNiX2JnbF9sb2NrKHNiaSwgYWMtPmFjX2JfZXguZmVfZ3JvdXApLAotCQkJCWJpdG1hcF9iaC0+Yl9kYXRhLCBhYy0+YWNfYl9leC5mZV9zdGFydCwKLQkJCQlhYy0+YWNfYl9leC5mZV9sZW4pOworCQlleHQ0X2xvY2tfZ3JvdXAoc2IsIGFjLT5hY19iX2V4LmZlX2dyb3VwKTsKKwkJbWJfc2V0X2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGFjLT5hY19iX2V4LmZlX3N0YXJ0LAorCQkJICAgIGFjLT5hY19iX2V4LmZlX2xlbik7CisJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBhYy0+YWNfYl9leC5mZV9ncm91cCk7CiAJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKIAkJaWYgKCFlcnIpCiAJCQllcnIgPSAtRUFHQUlOOwogCQlnb3RvIG91dF9lcnI7CiAJfQorCisJZXh0NF9sb2NrX2dyb3VwKHNiLCBhYy0+YWNfYl9leC5mZV9ncm91cCk7CiAjaWZkZWYgQUdHUkVTU0lWRV9DSEVDSwogCXsKIAkJaW50IGk7CkBAIC0zMDE0LDkgKzI5ODksNyBAQAogCQl9CiAJfQogI2VuZGlmCi0Jc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYWMtPmFjX2JfZXguZmVfZ3JvdXApKTsKLQltYl9zZXRfYml0cyhOVUxMLCBiaXRtYXBfYmgtPmJfZGF0YSwKLQkJCQlhYy0+YWNfYl9leC5mZV9zdGFydCwgYWMtPmFjX2JfZXguZmVfbGVuKTsKKwltYl9zZXRfYml0cyhiaXRtYXBfYmgtPmJfZGF0YSwgYWMtPmFjX2JfZXguZmVfc3RhcnQsYWMtPmFjX2JfZXguZmVfbGVuKTsKIAlpZiAoZ2RwLT5iZ19mbGFncyAmIGNwdV90b19sZTE2KEVYVDRfQkdfQkxPQ0tfVU5JTklUKSkgewogCQlnZHAtPmJnX2ZsYWdzICY9IGNwdV90b19sZTE2KH5FWFQ0X0JHX0JMT0NLX1VOSU5JVCk7CiAJCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLApAQCAtMzAyNiw3ICsyOTk5LDggQEAKIAlsZW4gPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKSAtIGFjLT5hY19iX2V4LmZlX2xlbjsKIAlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwgbGVuKTsKIAlnZHAtPmJnX2NoZWNrc3VtID0gZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBhYy0+YWNfYl9leC5mZV9ncm91cCwgZ2RwKTsKLQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGFjLT5hY19iX2V4LmZlX2dyb3VwKSk7CisKKwlleHQ0X3VubG9ja19ncm91cChzYiwgYWMtPmFjX2JfZXguZmVfZ3JvdXApOwogCXBlcmNwdV9jb3VudGVyX3N1Yigmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgYWMtPmFjX2JfZXguZmVfbGVuKTsKIAkvKgogCSAqIE5vdyByZWR1Y2UgdGhlIGRpcnR5IGJsb2NrIGNvdW50IGFsc28uIFNob3VsZCBub3QgZ28gbmVnYXRpdmUKQEAgLTM0NTksNyArMzQzMyw3IEBACiAgKiB0aGUgZnVuY3Rpb24gZ29lcyB0aHJvdWdoIGFsbCBibG9jayBmcmVlZCBpbiB0aGUgZ3JvdXAKICAqIGJ1dCBub3QgeWV0IGNvbW1pdHRlZCBhbmQgbWFya3MgdGhlbSB1c2VkIGluIGluLWNvcmUgYml0bWFwLgogICogYnVkZHkgbXVzdCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGJpdG1hcAotICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBleHQ0IGdyb3VwIGxvY2sgKGV4dDRfbG9ja19ncm91cCkKKyAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggdGhlIGV4dDQgZ3JvdXAgbG9jayBoZWxkCiAgKi8KIHN0YXRpYyB2b2lkIGV4dDRfbWJfZ2VuZXJhdGVfZnJvbV9mcmVlbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpiaXRtYXAsCiAJCQkJCQlleHQ0X2dyb3VwX3QgZ3JvdXApCkBAIC0zNDczLDkgKzM0NDcsNyBAQAogCiAJd2hpbGUgKG4pIHsKIAkJZW50cnkgPSByYl9lbnRyeShuLCBzdHJ1Y3QgZXh0NF9mcmVlX2RhdGEsIG5vZGUpOwotCQltYl9zZXRfYml0cyhzYl9iZ2xfbG9jayhFWFQ0X1NCKHNiKSwgZ3JvdXApLAotCQkJCWJpdG1hcCwgZW50cnktPnN0YXJ0X2JsaywKLQkJCQllbnRyeS0+Y291bnQpOworCQltYl9zZXRfYml0cyhiaXRtYXAsIGVudHJ5LT5zdGFydF9ibGssIGVudHJ5LT5jb3VudCk7CiAJCW4gPSByYl9uZXh0KG4pOwogCX0KIAlyZXR1cm47CkBAIC0zNDg0LDcgKzM0NTYsNyBAQAogLyoKICAqIHRoZSBmdW5jdGlvbiBnb2VzIHRocm91Z2ggYWxsIHByZWFsbG9jYXRpb24gaW4gdGhpcyBncm91cCBhbmQgbWFya3MgdGhlbQogICogdXNlZCBpbiBpbi1jb3JlIGJpdG1hcC4gYnVkZHkgbXVzdCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGlzIGJpdG1hcAotICogTmVlZCB0byBiZSBjYWxsZWQgd2l0aCBleHQ0IGdyb3VwIGxvY2sgKGV4dDRfbG9ja19ncm91cCkKKyAqIE5lZWQgdG8gYmUgY2FsbGVkIHdpdGggZXh0NCBncm91cCBsb2NrIGhlbGQKICAqLwogc3RhdGljIHZvaWQgZXh0NF9tYl9nZW5lcmF0ZV9mcm9tX3BhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmJpdG1hcCwKIAkJCQkJZXh0NF9ncm91cF90IGdyb3VwKQpAQCAtMzUxNiw4ICszNDg4LDcgQEAKIAkJaWYgKHVubGlrZWx5KGxlbiA9PSAwKSkKIAkJCWNvbnRpbnVlOwogCQlCVUdfT04oZ3JvdXBuciAhPSBncm91cCk7Ci0JCW1iX3NldF9iaXRzKHNiX2JnbF9sb2NrKEVYVDRfU0Ioc2IpLCBncm91cCksCi0JCQkJCQliaXRtYXAsIHN0YXJ0LCBsZW4pOworCQltYl9zZXRfYml0cyhiaXRtYXAsIHN0YXJ0LCBsZW4pOwogCQlwcmVhbGxvY2F0ZWQgKz0gbGVuOwogCQljb3VudCsrOwogCX0KQEAgLTQxMjEsNyArNDA5Miw3IEBACiBzdGF0aWMgdm9pZCBleHQ0X21iX3Nob3dfYWMoc3RydWN0IGV4dDRfYWxsb2NhdGlvbl9jb250ZXh0ICphYykKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gYWMtPmFjX3NiOwotCWV4dDRfZ3JvdXBfdCBpOworCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzLCBpOwogCiAJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBDYW4ndCBhbGxvY2F0ZToiCiAJCQkiIEFsbG9jYXRpb24gY29udGV4dCBkZXRhaWxzOlxuIik7CkBAIC00MTQ1LDcgKzQxMTYsOCBAQAogCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogJWx1IHNjYW5uZWQsICVkIGZvdW5kXG4iLCBhYy0+YWNfZXhfc2Nhbm5lZCwKIAkJYWMtPmFjX2ZvdW5kKTsKIAlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGdyb3VwczogXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgRVhUNF9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwluZ3JvdXBzID0gZXh0NF9nZXRfZ3JvdXBzX2NvdW50KHNiKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CiAJCXN0cnVjdCBleHQ0X2dyb3VwX2luZm8gKmdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGkpOwogCQlzdHJ1Y3QgZXh0NF9wcmVhbGxvY19zcGFjZSAqcGE7CiAJCWV4dDRfZ3JwYmxrX3Qgc3RhcnQ7CkBAIC00NDY5LDEzICs0NDQxLDEzIEBACiAKIHN0YXRpYyBpbnQgZXh0NF9tYl9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBuZWVkZWQpCiB7Ci0JZXh0NF9ncm91cF90IGk7CisJZXh0NF9ncm91cF90IGksIG5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCWludCByZXQ7CiAJaW50IGZyZWVkID0gMDsKIAogCXRyYWNlX21hcmsoZXh0NF9tYl9kaXNjYXJkX3ByZWFsbG9jYXRpb25zLCAiZGV2ICVzIG5lZWRlZCAlZCIsCiAJCSAgIHNiLT5zX2lkLCBuZWVkZWQpOwotCWZvciAoaSA9IDA7IGkgPCBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQgJiYgbmVlZGVkID4gMDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IG5ncm91cHMgJiYgbmVlZGVkID4gMDsgaSsrKSB7CiAJCXJldCA9IGV4dDRfbWJfZGlzY2FyZF9ncm91cF9wcmVhbGxvY2F0aW9ucyhzYiwgaSwgbmVlZGVkKTsKIAkJZnJlZWQgKz0gcmV0OwogCQluZWVkZWQgLT0gcmV0OwpAQCAtNDg1OSwyOSArNDgzMSwyNSBAQAogCQluZXdfZW50cnktPmdyb3VwICA9IGJsb2NrX2dyb3VwOwogCQluZXdfZW50cnktPmNvdW50ID0gY291bnQ7CiAJCW5ld19lbnRyeS0+dF90aWQgPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfdGlkOworCiAJCWV4dDRfbG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwotCQltYl9jbGVhcl9iaXRzKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLCBiaXRtYXBfYmgtPmJfZGF0YSwKLQkJCQliaXQsIGNvdW50KTsKKwkJbWJfY2xlYXJfYml0cyhiaXRtYXBfYmgtPmJfZGF0YSwgYml0LCBjb3VudCk7CiAJCWV4dDRfbWJfZnJlZV9tZXRhZGF0YShoYW5kbGUsICZlNGIsIG5ld19lbnRyeSk7Ci0JCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJfSBlbHNlIHsKLQkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJCS8qIG5lZWQgdG8gdXBkYXRlIGdyb3VwX2luZm8tPmJiX2ZyZWUgYW5kIGJpdG1hcAogCQkgKiB3aXRoIGdyb3VwIGxvY2sgaGVsZC4gZ2VuZXJhdGVfYnVkZHkgbG9vayBhdAogCQkgKiB0aGVtIHdpdGggZ3JvdXAgbG9ja19oZWxkCiAJCSAqLwotCQltYl9jbGVhcl9iaXRzKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLCBiaXRtYXBfYmgtPmJfZGF0YSwKLQkJCQliaXQsIGNvdW50KTsKKwkJZXh0NF9sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CisJCW1iX2NsZWFyX2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGJpdCwgY291bnQpOwogCQltYl9mcmVlX2Jsb2Nrcyhpbm9kZSwgJmU0YiwgYml0LCBjb3VudCk7CiAJCWV4dDRfbWJfcmV0dXJuX3RvX3ByZWFsbG9jYXRpb24oaW5vZGUsICZlNGIsIGJsb2NrLCBjb3VudCk7Ci0JCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBibG9ja19ncm91cCk7CiAJfQogCi0Jc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKIAlyZXQgPSBleHQ0X2ZyZWVfYmxrc19jb3VudChzYiwgZ2RwKSArIGNvdW50OwogCWV4dDRfZnJlZV9ibGtzX3NldChzYiwgZ2RwLCByZXQpOwogCWdkcC0+YmdfY2hlY2tzdW0gPSBleHQ0X2dyb3VwX2Rlc2NfY3N1bShzYmksIGJsb2NrX2dyb3VwLCBnZHApOwotCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApKTsKKwlleHQ0X3VubG9ja19ncm91cChzYiwgYmxvY2tfZ3JvdXApOwogCXBlcmNwdV9jb3VudGVyX2FkZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgY291bnQpOwogCiAJaWYgKHNiaS0+c19sb2dfZ3JvdXBzX3Blcl9mbGV4KSB7CmRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuaCBiL2ZzL2V4dDQvbWJhbGxvYy5oCmluZGV4IGRkOWU2Y2QuLjc1ZTM0ZjYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5oCisrKyBiL2ZzL2V4dDQvbWJhbGxvYy5oCkBAIC0yMyw3ICsyMyw2IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJleHQ0LmgiCi0jaW5jbHVkZSAiZ3JvdXAuaCIKIAogLyoKICAqIHdpdGggQUdHUkVTU0lWRV9DSEVDSyBhbGxvY2F0b3IgcnVucyBjb25zaXN0ZW5jeSBjaGVja3Mgb3ZlcgpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9uYW1laS5jIGIvZnMvZXh0NC9uYW1laS5jCmluZGV4IDIyMDk4ZTEuLjA3ZWI2NjQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvbmFtZWkuYworKysgYi9mcy9leHQ0L25hbWVpLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlICJleHQ0LmgiCiAjaW5jbHVkZSAiZXh0NF9qYmQyLmgiCiAKLSNpbmNsdWRlICJuYW1laS5oIgogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCiAKQEAgLTc1MCw3ICs3NDksNyBAQAogCQkJZXh0NGZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgJmgpOwogCQkJbWFwX3RhaWwtLTsKIAkJCW1hcF90YWlsLT5oYXNoID0gaC5oYXNoOwotCQkJbWFwX3RhaWwtPm9mZnMgPSAodTE2KSAoKGNoYXIgKikgZGUgLSBiYXNlKTsKKwkJCW1hcF90YWlsLT5vZmZzID0gKChjaGFyICopIGRlIC0gYmFzZSk+PjI7CiAJCQltYXBfdGFpbC0+c2l6ZSA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKIAkJCWNvdW50Kys7CiAJCQljb25kX3Jlc2NoZWQoKTsKQEAgLTExNDgsNyArMTE0Nyw4IEBACiAJdW5zaWduZWQgcmVjX2xlbiA9IDA7CiAKIAl3aGlsZSAoY291bnQtLSkgewotCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgKGZyb20gKyBtYXAtPm9mZnMpOworCQlzdHJ1Y3QgZXh0NF9kaXJfZW50cnlfMiAqZGUgPSAoc3RydWN0IGV4dDRfZGlyX2VudHJ5XzIgKikgCisJCQkJCQkoZnJvbSArIChtYXAtPm9mZnM8PDIpKTsKIAkJcmVjX2xlbiA9IEVYVDRfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKIAkJbWVtY3B5ICh0bywgZGUsIHJlY19sZW4pOwogCQkoKHN0cnVjdCBleHQ0X2Rpcl9lbnRyeV8yICopIHRvKS0+cmVjX2xlbiA9CkBAIC0xOTk3LDcgKzE5OTcsNyBAQAogCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKIAkJcmV0dXJuIDA7CiAKLQlsb2NrX3N1cGVyKHNiKTsKKwltdXRleF9sb2NrKCZFWFQ0X1NCKHNiKS0+c19vcnBoYW5fbG9jayk7CiAJaWYgKCFsaXN0X2VtcHR5KCZFWFQ0X0koaW5vZGUpLT5pX29ycGhhbikpCiAJCWdvdG8gb3V0X3VubG9jazsKIApAQCAtMjAwNiw5ICsyMDA2LDEzIEBACiAKIAkvKiBAQEAgRklYTUU6IE9ic2VydmF0aW9uIGZyb20gYXZpcm86CiAJICogSSB0aGluayBJIGNhbiB0cmlnZ2VyIEpfQVNTRVJUIGluIGV4dDRfb3JwaGFuX2FkZCgpLiAgV2UgYmxvY2sKLQkgKiBoZXJlIChvbiBsb2NrX3N1cGVyKCkpLCBzbyByYWNlIHdpdGggZXh0NF9saW5rKCkgd2hpY2ggbWlnaHQgYnVtcAorCSAqIGhlcmUgKG9uIHNfb3JwaGFuX2xvY2spLCBzbyByYWNlIHdpdGggZXh0NF9saW5rKCkgd2hpY2ggbWlnaHQgYnVtcAogCSAqIC0+aV9ubGluay4gRm9yLCBzYXkgaXQsIGNoYXJhY3RlciBkZXZpY2UuIE5vdCBhIHJlZ3VsYXIgZmlsZSwKIAkgKiBub3QgYSBkaXJlY3RvcnksIG5vdCBhIHN5bWxpbmsgYW5kIC0+aV9ubGluayA+IDAuCisJICoKKwkgKiB0eXRzbywgNC8yNS8yMDA5OiBJJ20gbm90IHN1cmUgaG93IHRoYXQgY291bGQgaGFwcGVuOworCSAqIHNob3VsZG4ndCB0aGUgZnMgY29yZSBwcm90ZWN0IHVzIGZyb20gdGhlc2Ugc29ydCBvZgorCSAqIHVubGluaygpL2xpbmsoKSByYWNlcz8KIAkgKi8KIAlKX0FTU0VSVCgoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CiAJCSAgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgfHwgaW5vZGUtPmlfbmxpbmsgPT0gMCk7CkBAIC0yMDQ1LDcgKzIwNDksNyBAQAogCWpiZF9kZWJ1Zyg0LCAib3JwaGFuIGlub2RlICVsdSB3aWxsIHBvaW50IHRvICVkXG4iLAogCQkJaW5vZGUtPmlfaW5vLCBORVhUX09SUEhBTihpbm9kZSkpOwogb3V0X3VubG9jazoKLQl1bmxvY2tfc3VwZXIoc2IpOworCW11dGV4X3VubG9jaygmRVhUNF9TQihzYiktPnNfb3JwaGFuX2xvY2spOwogCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CkBAIC0yMDY2LDExICsyMDcwLDkgQEAKIAlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCiAJCXJldHVybiAwOwogCi0JbG9ja19zdXBlcihpbm9kZS0+aV9zYik7Ci0JaWYgKGxpc3RfZW1wdHkoJmVpLT5pX29ycGhhbikpIHsKLQkJdW5sb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKLQkJcmV0dXJuIDA7Ci0JfQorCW11dGV4X2xvY2soJkVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX29ycGhhbl9sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmZWktPmlfb3JwaGFuKSkKKwkJZ290byBvdXQ7CiAKIAlpbm9fbmV4dCA9IE5FWFRfT1JQSEFOKGlub2RlKTsKIAlwcmV2ID0gZWktPmlfb3JwaGFuLnByZXY7CkBAIC0yMTIwLDcgKzIxMjIsNyBAQAogb3V0X2VycjoKIAlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKIG91dDoKLQl1bmxvY2tfc3VwZXIoaW5vZGUtPmlfc2IpOworCW11dGV4X3VubG9jaygmRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfb3JwaGFuX2xvY2spOwogCXJldHVybiBlcnI7CiAKIG91dF9icmVsc2U6CkBAIC0yNTMzLDYgKzI1MzUsNyBAQAogCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCiAjZW5kaWYKIAkucGVybWlzc2lvbgk9IGV4dDRfcGVybWlzc2lvbiwKKwkuZmllbWFwICAgICAgICAgPSBleHQ0X2ZpZW1hcCwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDRfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0gewpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9uYW1laS5oIGIvZnMvZXh0NC9uYW1laS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTRkZmZmLi4wMDAwMDAwCi0tLSBhL2ZzL2V4dDQvbmFtZWkuaAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotLyogIGxpbnV4L2ZzL2V4dDQvbmFtZWkuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwNSBTaW10ZWMgRWxlY3Ryb25pY3MKLSAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KLSAqCi0qLwotCi1leHRlcm4gc3RydWN0IGRlbnRyeSAqZXh0NF9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcmVzaXplLmMgYi9mcy9leHQ0L3Jlc2l6ZS5jCmluZGV4IDU0NmM3ZGQuLjI3ZWIyODkgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcmVzaXplLmMKKysrIGIvZnMvZXh0NC9yZXNpemUuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgImV4dDRfamJkMi5oIgotI2luY2x1ZGUgImdyb3VwLmgiCiAKICNkZWZpbmUgb3V0c2lkZShiLCBmaXJzdCwgbGFzdCkJKChiKSA8IChmaXJzdCkgfHwgKGIpID49IChsYXN0KSkKICNkZWZpbmUgaW5zaWRlKGIsIGZpcnN0LCBsYXN0KQkoKGIpID49IChmaXJzdCkgJiYgKGIpIDwgKGxhc3QpKQpAQCAtMTkzLDcgKzE5Miw3IEBACiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCi0JbG9ja19zdXBlcihzYik7CisJbXV0ZXhfbG9jaygmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKIAlpZiAoaW5wdXQtPmdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpIHsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGV4aXRfam91cm5hbDsKQEAgLTMwMiw3ICszMDEsNyBAQAogCWJyZWxzZShiaCk7CiAKIGV4aXRfam91cm5hbDoKLQl1bmxvY2tfc3VwZXIoc2IpOworCW11dGV4X3VubG9jaygmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKIAlpZiAoKGVycjIgPSBleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpKSAmJiAhZXJyKQogCQllcnIgPSBlcnIyOwogCkBAIC02NDMsMTEgKzY0MiwxMiBAQAogICogaW1wb3J0YW50IHBhcnQgaXMgdGhhdCB0aGUgbmV3IGJsb2NrIGFuZCBpbm9kZSBjb3VudHMgYXJlIGluIHRoZSBiYWNrdXAKICAqIHN1cGVyYmxvY2tzLCBhbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgZ3JvdXAgbWV0YWRhdGEgaW4gdGhlIEdEVCBiYWNrdXBzLgogICoKLSAqIFdlIGRvIG5vdCBuZWVkIGxvY2tfc3VwZXIoKSBmb3IgdGhpcywgYmVjYXVzZSB0aGVzZSBibG9ja3MgYXJlIG5vdAotICogb3RoZXJ3aXNlIHRvdWNoZWQgYnkgdGhlIGZpbGVzeXN0ZW0gY29kZSB3aGVuIGl0IGlzIG1vdW50ZWQuICBXZSBkb24ndAotICogbmVlZCB0byB3b3JyeSBhYm91dCBsYXN0IGNoYW5naW5nIGZyb20gc2JpLT5zX2dyb3Vwc19jb3VudCwgYmVjYXVzZSB0aGUKLSAqIHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyB0aGF0IHdlIGRvIG5vdCBjb3B5IHRoZSBmdWxsIG51bWJlciBvZiBiYWNrdXBzCi0gKiBhdCB0aGlzIHRpbWUuICBUaGUgcmVzaXplIHdoaWNoIGNoYW5nZWQgc19ncm91cHNfY291bnQgd2lsbCBiYWNrdXAgYWdhaW4uCisgKiBXZSBkbyBub3QgbmVlZCB0YWtlIHRoZSBzX3Jlc2l6ZV9sb2NrIGZvciB0aGlzLCBiZWNhdXNlIHRoZXNlCisgKiBibG9ja3MgYXJlIG5vdCBvdGhlcndpc2UgdG91Y2hlZCBieSB0aGUgZmlsZXN5c3RlbSBjb2RlIHdoZW4gaXQgaXMKKyAqIG1vdW50ZWQuICBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGxhc3QgY2hhbmdpbmcgZnJvbQorICogc2JpLT5zX2dyb3Vwc19jb3VudCwgYmVjYXVzZSB0aGUgd29yc3QgdGhhdCBjYW4gaGFwcGVuIGlzIHRoYXQgd2UKKyAqIGRvIG5vdCBjb3B5IHRoZSBmdWxsIG51bWJlciBvZiBiYWNrdXBzIGF0IHRoaXMgdGltZS4gIFRoZSByZXNpemUKKyAqIHdoaWNoIGNoYW5nZWQgc19ncm91cHNfY291bnQgd2lsbCBiYWNrdXAgYWdhaW4uCiAgKi8KIHN0YXRpYyB2b2lkIHVwZGF0ZV9iYWNrdXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICBpbnQgYmxrX29mZiwgY2hhciAqZGF0YSwgaW50IHNpemUpCkBAIC04MDksNyArODA5LDcgQEAKIAkJZ290byBleGl0X3B1dDsKIAl9CiAKLQlsb2NrX3N1cGVyKHNiKTsKKwltdXRleF9sb2NrKCZzYmktPnNfcmVzaXplX2xvY2spOwogCWlmIChpbnB1dC0+Z3JvdXAgIT0gc2JpLT5zX2dyb3Vwc19jb3VudCkgewogCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLAogCQkJICAgICAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hIik7CkBAIC04NDAsNyArODQwLDcgQEAKICAgICAgICAgLyoKICAgICAgICAgICogT0ssIG5vdyB3ZSd2ZSBzZXQgdXAgdGhlIG5ldyBncm91cC4gIFRpbWUgdG8gbWFrZSBpdCBhY3RpdmUuCiAgICAgICAgICAqCi0gICAgICAgICAqIEN1cnJlbnQga2VybmVscyBkb24ndCBsb2NrIGFsbCBhbGxvY2F0aW9ucyB2aWEgbG9ja19zdXBlcigpLAorICAgICAgICAgKiBXZSBkbyBub3QgbG9jayBhbGwgYWxsb2NhdGlvbnMgdmlhIHNfcmVzaXplX2xvY2sKICAgICAgICAgICogc28gd2UgaGF2ZSB0byBiZSBzYWZlIHdydC4gY29uY3VycmVudCBhY2Nlc3NlcyB0aGUgZ3JvdXAKICAgICAgICAgICogZGF0YS4gIFNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBzZXQgYWxsIG9mIHRoZSByZWxldmFudAogICAgICAgICAgKiBncm91cCBkZXNjcmlwdG9yIGRhdGEgZXRjLiAqYmVmb3JlKiB3ZSBlbmFibGUgdGhlIGdyb3VwLgpAQCAtOTAwLDEyICs5MDAsMTIgQEAKIAkgKgogCSAqIFRoZSBwcmVjaXNlIHJ1bGVzIHdlIHVzZSBhcmU6CiAJICoKLQkgKiAqIFdyaXRlcnMgb2Ygc19ncm91cHNfY291bnQgKm11c3QqIGhvbGQgbG9ja19zdXBlcgorCSAqICogV3JpdGVycyBvZiBzX2dyb3Vwc19jb3VudCAqbXVzdCogaG9sZCBzX3Jlc2l6ZV9sb2NrCiAJICogQU5ECiAJICogKiBXcml0ZXJzIG11c3QgcGVyZm9ybSBhIHNtcF93bWIoKSBhZnRlciB1cGRhdGluZyBhbGwgZGVwZW5kZW50CiAJICogICBkYXRhIGFuZCBiZWZvcmUgbW9kaWZ5aW5nIHRoZSBncm91cHMgY291bnQKIAkgKgotCSAqICogUmVhZGVycyBtdXN0IGhvbGQgbG9ja19zdXBlcigpIG92ZXIgdGhlIGFjY2VzcworCSAqICogUmVhZGVycyBtdXN0IGhvbGQgc19yZXNpemVfbG9jayBvdmVyIHRoZSBhY2Nlc3MKIAkgKiBPUgogCSAqICogUmVhZGVycyBtdXN0IHBlcmZvcm0gYW4gc21wX3JtYigpIGFmdGVyIHJlYWRpbmcgdGhlIGdyb3VwcyBjb3VudAogCSAqICAgYW5kIGJlZm9yZSByZWFkaW5nIGFueSBkZXBlbmRlbnQgZGF0YS4KQEAgLTk0OCw3ICs5NDgsNyBAQAogCXNiLT5zX2RpcnQgPSAxOwogCiBleGl0X2pvdXJuYWw6Ci0JdW5sb2NrX3N1cGVyKHNiKTsKKwltdXRleF91bmxvY2soJnNiaS0+c19yZXNpemVfbG9jayk7CiAJaWYgKChlcnIyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKIAkJZXJyID0gZXJyMjsKIAlpZiAoIWVycikgewpAQCAtOTg2LDcgKzk4Niw3IEBACiAKIAkvKiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGxvY2tpbmcgd3J0IG90aGVyIHJlc2l6ZXJzIGp1c3QKIAkgKiB5ZXQ6IHdlJ3JlIGdvaW5nIHRvIHJldmFsaWRhdGUgZXMtPnNfYmxvY2tzX2NvdW50IGFmdGVyCi0JICogdGFraW5nIGxvY2tfc3VwZXIoKSBiZWxvdy4gKi8KKwkgKiB0YWtpbmcgdGhlIHNfcmVzaXplX2xvY2sgYmVsb3cuICovCiAJb19ibG9ja3NfY291bnQgPSBleHQ0X2Jsb2Nrc19jb3VudChlcyk7CiAJb19ncm91cHNfY291bnQgPSBFWFQ0X1NCKHNiKS0+c19ncm91cHNfY291bnQ7CiAKQEAgLTEwNTYsMTEgKzEwNTYsMTEgQEAKIAkJZ290byBleGl0X3B1dDsKIAl9CiAKLQlsb2NrX3N1cGVyKHNiKTsKKwltdXRleF9sb2NrKCZFWFQ0X1NCKHNiKS0+c19yZXNpemVfbG9jayk7CiAJaWYgKG9fYmxvY2tzX2NvdW50ICE9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgewogCQlleHQ0X3dhcm5pbmcoc2IsIF9fZnVuY19fLAogCQkJICAgICAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hIik7Ci0JCXVubG9ja19zdXBlcihzYik7CisJCW11dGV4X3VubG9jaygmRVhUNF9TQihzYiktPnNfcmVzaXplX2xvY2spOwogCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZXhpdF9wdXQ7CkBAIC0xMDcwLDE0ICsxMDcwLDE0IEBACiAJCQkJCQkgRVhUNF9TQihzYiktPnNfc2JoKSkpIHsKIAkJZXh0NF93YXJuaW5nKHNiLCBfX2Z1bmNfXywKIAkJCSAgICAgImVycm9yICVkIG9uIGpvdXJuYWwgd3JpdGUgYWNjZXNzIiwgZXJyKTsKLQkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJbXV0ZXhfdW5sb2NrKCZFWFQ0X1NCKHNiKS0+c19yZXNpemVfbG9jayk7CiAJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJCWdvdG8gZXhpdF9wdXQ7CiAJfQogCWV4dDRfYmxvY2tzX2NvdW50X3NldChlcywgb19ibG9ja3NfY291bnQgKyBhZGQpOwogCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgRVhUNF9TQihzYiktPnNfc2JoKTsKIAlzYi0+c19kaXJ0ID0gMTsKLQl1bmxvY2tfc3VwZXIoc2IpOworCW11dGV4X3VubG9jaygmRVhUNF9TQihzYiktPnNfcmVzaXplX2xvY2spOwogCWV4dDRfZGVidWcoImZyZWVpbmcgYmxvY2tzICVsbHUgdGhyb3VnaCAlbGx1XG4iLCBvX2Jsb2Nrc19jb3VudCwKIAkJICAgb19ibG9ja3NfY291bnQgKyBhZGQpOwogCS8qIFdlIGFkZCB0aGUgYmxvY2tzIHRvIHRoZSBiaXRtYXAgYW5kIHNldCB0aGUgZ3JvdXAgbmVlZCBpbml0IGJpdCAqLwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9zdXBlci5jIGIvZnMvZXh0NC9zdXBlci5jCmluZGV4IDI5NThmNGUuLmYwMTY3MDcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvc3VwZXIuYworKysgYi9mcy9leHQ0L3N1cGVyLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvamJkMi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC00NSwxNiArNDYsMjAgQEAKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgogI2luY2x1ZGUgImFjbC5oIgotI2luY2x1ZGUgIm5hbWVpLmgiCi0jaW5jbHVkZSAiZ3JvdXAuaCIKKworc3RhdGljIGludCBkZWZhdWx0X21iX2hpc3RvcnlfbGVuZ3RoID0gMTAwMDsKKworbW9kdWxlX3BhcmFtX25hbWVkKGRlZmF1bHRfbWJfaGlzdG9yeV9sZW5ndGgsIGRlZmF1bHRfbWJfaGlzdG9yeV9sZW5ndGgsCisJCSAgIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlZmF1bHRfbWJfaGlzdG9yeV9sZW5ndGgsCisJCSAiRGVmYXVsdCBudW1iZXIgb2YgZW50cmllcyBzYXZlZCBmb3IgbWJfaGlzdG9yeSIpOwogCiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmV4dDRfcHJvY19yb290Owogc3RhdGljIHN0cnVjdCBrc2V0ICpleHQ0X2tzZXQ7CiAKIHN0YXRpYyBpbnQgZXh0NF9sb2FkX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICosCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0pOwotc3RhdGljIGludCBleHQ0X2NvbW1pdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJICAgICAgc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzLCBpbnQgc3luYyk7CitzdGF0aWMgaW50IGV4dDRfY29tbWl0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzeW5jKTsKIHN0YXRpYyB2b2lkIGV4dDRfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMpOwogc3RhdGljIHZvaWQgZXh0NF9jbGVhcl9qb3VybmFsX2VycihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtNzQsNyArNzksNyBAQAogewogCXJldHVybiBsZTMyX3RvX2NwdShiZy0+YmdfYmxvY2tfYml0bWFwX2xvKSB8CiAJCShFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUID8KLQkJKGV4dDRfZnNibGtfdClsZTMyX3RvX2NwdShiZy0+YmdfYmxvY2tfYml0bWFwX2hpKSA8PCAzMiA6IDApOworCQkgKGV4dDRfZnNibGtfdClsZTMyX3RvX2NwdShiZy0+YmdfYmxvY2tfYml0bWFwX2hpKSA8PCAzMiA6IDApOwogfQogCiBleHQ0X2ZzYmxrX3QgZXh0NF9pbm9kZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTgyLDcgKzg3LDcgQEAKIHsKIAlyZXR1cm4gbGUzMl90b19jcHUoYmctPmJnX2lub2RlX2JpdG1hcF9sbykgfAogCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/Ci0JCShleHQ0X2ZzYmxrX3QpbGUzMl90b19jcHUoYmctPmJnX2lub2RlX2JpdG1hcF9oaSkgPDwgMzIgOiAwKTsKKwkJIChleHQ0X2ZzYmxrX3QpbGUzMl90b19jcHUoYmctPmJnX2lub2RlX2JpdG1hcF9oaSkgPDwgMzIgOiAwKTsKIH0KIAogZXh0NF9mc2Jsa190IGV4dDRfaW5vZGVfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTkwLDcgKzk1LDcgQEAKIHsKIAlyZXR1cm4gbGUzMl90b19jcHUoYmctPmJnX2lub2RlX3RhYmxlX2xvKSB8CiAJCShFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUID8KLQkJKGV4dDRfZnNibGtfdClsZTMyX3RvX2NwdShiZy0+YmdfaW5vZGVfdGFibGVfaGkpIDw8IDMyIDogMCk7CisJCSAoZXh0NF9mc2Jsa190KWxlMzJfdG9fY3B1KGJnLT5iZ19pbm9kZV90YWJsZV9oaSkgPDwgMzIgOiAwKTsKIH0KIAogX191MzIgZXh0NF9mcmVlX2Jsa3NfY291bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKQEAgLTk4LDcgKzEwMyw3IEBACiB7CiAJcmV0dXJuIGxlMTZfdG9fY3B1KGJnLT5iZ19mcmVlX2Jsb2Nrc19jb3VudF9sbykgfAogCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/Ci0JCShfX3UzMilsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9ibG9ja3NfY291bnRfaGkpIDw8IDE2IDogMCk7CisJCSAoX191MzIpbGUxNl90b19jcHUoYmctPmJnX2ZyZWVfYmxvY2tzX2NvdW50X2hpKSA8PCAxNiA6IDApOwogfQogCiBfX3UzMiBleHQ0X2ZyZWVfaW5vZGVzX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0xMDYsNyArMTExLDcgQEAKIHsKIAlyZXR1cm4gbGUxNl90b19jcHUoYmctPmJnX2ZyZWVfaW5vZGVzX2NvdW50X2xvKSB8CiAJCShFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUID8KLQkJKF9fdTMyKWxlMTZfdG9fY3B1KGJnLT5iZ19mcmVlX2lub2Rlc19jb3VudF9oaSkgPDwgMTYgOiAwKTsKKwkJIChfX3UzMilsZTE2X3RvX2NwdShiZy0+YmdfZnJlZV9pbm9kZXNfY291bnRfaGkpIDw8IDE2IDogMCk7CiB9CiAKIF9fdTMyIGV4dDRfdXNlZF9kaXJzX2NvdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCkBAIC0xMTQsNyArMTE5LDcgQEAKIHsKIAlyZXR1cm4gbGUxNl90b19jcHUoYmctPmJnX3VzZWRfZGlyc19jb3VudF9sbykgfAogCQkoRVhUNF9ERVNDX1NJWkUoc2IpID49IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCA/Ci0JCShfX3UzMilsZTE2X3RvX2NwdShiZy0+YmdfdXNlZF9kaXJzX2NvdW50X2hpKSA8PCAxNiA6IDApOworCQkgKF9fdTMyKWxlMTZfdG9fY3B1KGJnLT5iZ191c2VkX2RpcnNfY291bnRfaGkpIDw8IDE2IDogMCk7CiB9CiAKIF9fdTMyIGV4dDRfaXRhYmxlX3VudXNlZF9jb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtMTIyLDcgKzEyNyw3IEBACiB7CiAJcmV0dXJuIGxlMTZfdG9fY3B1KGJnLT5iZ19pdGFibGVfdW51c2VkX2xvKSB8CiAJCShFWFQ0X0RFU0NfU0laRShzYikgPj0gRVhUNF9NSU5fREVTQ19TSVpFXzY0QklUID8KLQkJKF9fdTMyKWxlMTZfdG9fY3B1KGJnLT5iZ19pdGFibGVfdW51c2VkX2hpKSA8PCAxNiA6IDApOworCQkgKF9fdTMyKWxlMTZfdG9fY3B1KGJnLT5iZ19pdGFibGVfdW51c2VkX2hpKSA8PCAxNiA6IDApOwogfQogCiB2b2lkIGV4dDRfYmxvY2tfYml0bWFwX3NldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApAQCAtMjAyLDggKzIwNyw3IEBACiAJam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CiAJaWYgKGpvdXJuYWwpIHsKIAkJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkgewotCQkJZXh0NF9hYm9ydChzYiwgX19mdW5jX18sCi0JCQkJICAgIkRldGVjdGVkIGFib3J0ZWQgam91cm5hbCIpOworCQkJZXh0NF9hYm9ydChzYiwgX19mdW5jX18sICJEZXRlY3RlZCBhYm9ydGVkIGpvdXJuYWwiKTsKIAkJCXJldHVybiBFUlJfUFRSKC1FUk9GUyk7CiAJCX0KIAkJcmV0dXJuIGpiZDJfam91cm5hbF9zdGFydChqb3VybmFsLCBuYmxvY2tzKTsKQEAgLTMwMiwxMCArMzA2LDEwIEBACiAJCQlqYmQyX2pvdXJuYWxfYWJvcnQoam91cm5hbCwgLUVJTyk7CiAJfQogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1JPKSkgewotCQlwcmludGsoS0VSTl9DUklUICJSZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5XG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fQ1JJVCwgIlJlbW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHkiKTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCX0KLQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIAlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19QQU5JQykpCiAJCXBhbmljKCJFWFQ0LWZzIChkZXZpY2UgJXMpOiBwYW5pYyBmb3JjZWQgYWZ0ZXIgZXJyb3JcbiIsCiAJCQlzYi0+c19pZCk7CkBAIC0zOTUsOCArMzk5LDYgQEAKIHsKIAl2YV9saXN0IGFyZ3M7CiAKLQlwcmludGsoS0VSTl9DUklUICJleHQ0X2Fib3J0IGNhbGxlZC5cbiIpOwotCiAJdmFfc3RhcnQoYXJncywgZm10KTsKIAlwcmludGsoS0VSTl9DUklUICJFWFQ0LWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogIiwgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKIAl2cHJpbnRrKGZtdCwgYXJncyk7CkBAIC00MDksNyArNDExLDcgQEAKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCiAJCXJldHVybjsKIAotCXByaW50ayhLRVJOX0NSSVQgIlJlbW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHlcbiIpOworCWV4dDRfbXNnKHNiLCBLRVJOX0NSSVQsICJSZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CiAJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9FUlJPUl9GUzsKIAlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAJRVhUNF9TQihzYiktPnNfbW91bnRfb3B0IHw9IEVYVDRfTU9VTlRfQUJPUlQ7CkBAIC00MTcsNiArNDE5LDE4IEBACiAJCWpiZDJfam91cm5hbF9hYm9ydChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLCAtRUlPKTsKIH0KIAordm9pZCBleHQ0X21zZyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJICAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlwcmludGsoIiVzRVhUNC1mcyAoJXMpOiAiLCBwcmVmaXgsIHNiLT5zX2lkKTsKKwl2cHJpbnRrKGZtdCwgYXJncyk7CisJcHJpbnRrKCJcbiIpOworCXZhX2VuZChhcmdzKTsKK30KKwogdm9pZCBleHQ0X3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCiAJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CkBAIC00MzEsNyArNDQ1LDcgQEAKIH0KIAogdm9pZCBleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgZXh0NF9ncm91cF90IGdycCwKLQkJCQljb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJCQkgICBjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCiBfX3JlbGVhc2VzKGJpdGxvY2spCiBfX2FjcXVpcmVzKGJpdGxvY2spCiB7CkBAIC00NDcsNyArNDYxLDcgQEAKIAlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19DT05UKSkgewogCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOwogCQllcy0+c19zdGF0ZSB8PSBjcHVfdG9fbGUxNihFWFQ0X0VSUk9SX0ZTKTsKLQkJZXh0NF9jb21taXRfc3VwZXIoc2IsIGVzLCAwKTsKKwkJZXh0NF9jb21taXRfc3VwZXIoc2IsIDApOwogCQlyZXR1cm47CiAJfQogCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBncnApOwpAQCAtNDY3LDcgKzQ4MSw2IEBACiAJcmV0dXJuOwogfQogCi0KIHZvaWQgZXh0NF91cGRhdGVfZHluYW1pY19yZXYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKHNiKS0+c19lczsKQEAgLTQ5Niw3ICs1MDksNyBAQAogLyoKICAqIE9wZW4gdGhlIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpleHQ0X2Jsa2Rldl9nZXQoZGV2X3QgZGV2KQorc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKmV4dDRfYmxrZGV2X2dldChkZXZfdCBkZXYsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAljaGFyIGJbQkRFVk5BTUVfU0laRV07CkBAIC01MDcsNyArNTIwLDcgQEAKIAlyZXR1cm4gYmRldjsKIAogZmFpbDoKLQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGRcbiIsCisJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIG9wZW4gam91cm5hbCBkZXZpY2UgJXM6ICVsZCIsCiAJCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOwogCXJldHVybiBOVUxMOwogfQpAQCAtNTQzLDggKzU1Niw4IEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbDsKIAotCXByaW50ayhLRVJOX0VSUiAic2Igb3JwaGFuIGhlYWQgaXMgJWRcbiIsCi0JICAgICAgIGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19sYXN0X29ycGhhbikpOworCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgInNiIG9ycGhhbiBoZWFkIGlzICVkIiwKKwkJIGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19sYXN0X29ycGhhbikpOwogCiAJcHJpbnRrKEtFUk5fRVJSICJzYl9pbmZvIG9ycGhhbiBsaXN0OlxuIik7CiAJbGlzdF9mb3JfZWFjaChsLCAmc2JpLT5zX29ycGhhbikgewpAQCAtNTYzLDYgKzU3Niw3IEBACiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwogCWludCBpLCBlcnI7CiAKKwlleHQ0X3JlbGVhc2Vfc3lzdGVtX3pvbmUoc2IpOwogCWV4dDRfbWJfcmVsZWFzZShzYik7CiAJZXh0NF9leHRfcmVsZWFzZShzYik7CiAJZXh0NF94YXR0cl9wdXRfc3VwZXIoc2IpOwpAQCAtNTc2LDcgKzU5MCw3IEBACiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCUVYVDRfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwogCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7Ci0JCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIAl9CiAJaWYgKHNiaS0+c19wcm9jKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KHNiLT5zX2lkLCBleHQ0X3Byb2Nfcm9vdCk7CkBAIC01ODYsNyArNjAwLDEwIEBACiAJZm9yIChpID0gMDsgaSA8IHNiaS0+c19nZGJfY291bnQ7IGkrKykKIAkJYnJlbHNlKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKIAlrZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7Ci0Ja2ZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKKwlpZiAoaXNfdm1hbGxvY19hZGRyKHNiaS0+c19mbGV4X2dyb3VwcykpCisJCXZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7CisJZWxzZQorCQlrZnJlZShzYmktPnNfZmxleF9ncm91cHMpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOwogCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19kaXJzX2NvdW50ZXIpOwpAQCAtNjI5LDcgKzY0Niw2IEBACiAJbG9ja19rZXJuZWwoKTsKIAlrZnJlZShzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAlrZnJlZShzYmkpOwotCXJldHVybjsKIH0KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpleHQ0X2lub2RlX2NhY2hlcDsKQEAgLTY0NCw2ICs2NjAsNyBAQAogCWVpID0ga21lbV9jYWNoZV9hbGxvYyhleHQ0X2lub2RlX2NhY2hlcCwgR0ZQX05PRlMpOwogCWlmICghZWkpCiAJCXJldHVybiBOVUxMOworCiAjaWZkZWYgQ09ORklHX0VYVDRfRlNfUE9TSVhfQUNMCiAJZWktPmlfYWNsID0gRVhUNF9BQ0xfTk9UX0NBQ0hFRDsKIAllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDRfQUNMX05PVF9DQUNIRUQ7CkBAIC02NjQsMTQgKzY4MSwxNiBAQAogCWVpLT5pX2FsbG9jYXRlZF9tZXRhX2Jsb2NrcyA9IDA7CiAJZWktPmlfZGVsYWxsb2NfcmVzZXJ2ZWRfZmxhZyA9IDA7CiAJc3Bpbl9sb2NrX2luaXQoJihlaS0+aV9ibG9ja19yZXNlcnZhdGlvbl9sb2NrKSk7CisKIAlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7CiB9CiAKIHN0YXRpYyB2b2lkIGV4dDRfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWlmICghbGlzdF9lbXB0eSgmKEVYVDRfSShpbm9kZSktPmlfb3JwaGFuKSkpIHsKLQkJcHJpbnRrKCJFWFQ0IElub2RlICVwOiBvcnBoYW4gbGlzdCBjaGVjayBmYWlsZWQhXG4iLAotCQkJRVhUNF9JKGlub2RlKSk7CisJCWV4dDRfbXNnKGlub2RlLT5pX3NiLCBLRVJOX0VSUiwKKwkJCSAiSW5vZGUgJWx1ICglcCk6IG9ycGhhbiBsaXN0IGNoZWNrIGZhaWxlZCEiLAorCQkJIGlub2RlLT5pX2lubywgRVhUNF9JKGlub2RlKSk7CiAJCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsIERVTVBfUFJFRklYX0FERFJFU1MsIDE2LCA0LAogCQkJCUVYVDRfSShpbm9kZSksIHNpemVvZihzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvKSwKIAkJCQl0cnVlKTsKQEAgLTg3MCwxMiArODg5LDEyIEBACiAJCXNlcV9wdXRzKHNlcSwgIixub2F1dG9fZGFfYWxsb2MiKTsKIAogCWV4dDRfc2hvd19xdW90YV9vcHRpb25zKHNlcSwgc2IpOworCiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0NF9uZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCXU2NCBpbm8sIHUzMiBnZW5lcmF0aW9uKQorCQkJCQl1NjQgaW5vLCB1MzIgZ2VuZXJhdGlvbikKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCkBAIC05MDQsMTQgKzkyMywxNCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqZXh0NF9maF90b19kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZpZCAqZmlkLAotCQlpbnQgZmhfbGVuLCBpbnQgZmhfdHlwZSkKKwkJCQkJaW50IGZoX2xlbiwgaW50IGZoX3R5cGUpCiB7CiAJcmV0dXJuIGdlbmVyaWNfZmhfdG9fZGVudHJ5KHNiLCBmaWQsIGZoX2xlbiwgZmhfdHlwZSwKIAkJCQkgICAgZXh0NF9uZnNfZ2V0X2lub2RlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmV4dDRfZmhfdG9fcGFyZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmaWQgKmZpZCwKLQkJaW50IGZoX2xlbiwgaW50IGZoX3R5cGUpCisJCQkJCWludCBmaF9sZW4sIGludCBmaF90eXBlKQogewogCXJldHVybiBnZW5lcmljX2ZoX3RvX3BhcmVudChzYiwgZmlkLCBmaF9sZW4sIGZoX3R5cGUsCiAJCQkJICAgIGV4dDRfbmZzX2dldF9pbm9kZSk7CkBAIC05MjMsNyArOTQyLDggQEAKICAqIHdoaWNoIHdvdWxkIHByZXZlbnQgdHJ5X3RvX2ZyZWVfYnVmZmVycygpIGZyb20gZnJlZWluZyB0aGVtLCB3ZSBtdXN0IHVzZQogICogamJkMiBsYXllcidzIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBmdW5jdGlvbiB0byByZWxlYXNlIHRoZW0uCiAgKi8KLXN0YXRpYyBpbnQgYmRldl90cnlfdG9fZnJlZV9wYWdlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB3YWl0KQorc3RhdGljIGludCBiZGV2X3RyeV90b19mcmVlX3BhZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJIGdmcF90IHdhaXQpCiB7CiAJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKIApAQCAtOTkyLDcgKzEwMTIsNiBAQAogCS5kaXJ0eV9pbm9kZQk9IGV4dDRfZGlydHlfaW5vZGUsCiAJLmRlbGV0ZV9pbm9kZQk9IGV4dDRfZGVsZXRlX2lub2RlLAogCS5wdXRfc3VwZXIJPSBleHQ0X3B1dF9zdXBlciwKLQkud3JpdGVfc3VwZXIJPSBleHQ0X3dyaXRlX3N1cGVyLAogCS5zeW5jX2ZzCT0gZXh0NF9zeW5jX2ZzLAogCS5mcmVlemVfZnMJPSBleHQ0X2ZyZWV6ZSwKIAkudW5mcmVlemVfZnMJPSBleHQ0X3VuZnJlZXplLApAQCAtMTAwNyw2ICsxMDI2LDI1IEBACiAJLmJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSA9IGJkZXZfdHJ5X3RvX2ZyZWVfcGFnZSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBleHQ0X25vam91cm5hbF9zb3BzID0geworCS5hbGxvY19pbm9kZQk9IGV4dDRfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBleHQ0X2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gZXh0NF93cml0ZV9pbm9kZSwKKwkuZGlydHlfaW5vZGUJPSBleHQ0X2RpcnR5X2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBleHQ0X2RlbGV0ZV9pbm9kZSwKKwkud3JpdGVfc3VwZXIJPSBleHQ0X3dyaXRlX3N1cGVyLAorCS5wdXRfc3VwZXIJPSBleHQ0X3B1dF9zdXBlciwKKwkuc3RhdGZzCQk9IGV4dDRfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gZXh0NF9yZW1vdW50LAorCS5jbGVhcl9pbm9kZQk9IGV4dDRfY2xlYXJfaW5vZGUsCisJLnNob3dfb3B0aW9ucwk9IGV4dDRfc2hvd19vcHRpb25zLAorI2lmZGVmIENPTkZJR19RVU9UQQorCS5xdW90YV9yZWFkCT0gZXh0NF9xdW90YV9yZWFkLAorCS5xdW90YV93cml0ZQk9IGV4dDRfcXVvdGFfd3JpdGUsCisjZW5kaWYKKwkuYmRldl90cnlfdG9fZnJlZV9wYWdlID0gYmRldl90cnlfdG9fZnJlZV9wYWdlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHQ0X2V4cG9ydF9vcHMgPSB7CiAJLmZoX3RvX2RlbnRyeSA9IGV4dDRfZmhfdG9fZGVudHJ5LAogCS5maF90b19wYXJlbnQgPSBleHQ0X2ZoX3RvX3BhcmVudCwKQEAgLTEwMjMsMTIgKzEwNjEsMTMgQEAKIAlPcHRfam91cm5hbF91cGRhdGUsIE9wdF9qb3VybmFsX2RldiwKIAlPcHRfam91cm5hbF9jaGVja3N1bSwgT3B0X2pvdXJuYWxfYXN5bmNfY29tbWl0LAogCU9wdF9hYm9ydCwgT3B0X2RhdGFfam91cm5hbCwgT3B0X2RhdGFfb3JkZXJlZCwgT3B0X2RhdGFfd3JpdGViYWNrLAotCU9wdF9kYXRhX2Vycl9hYm9ydCwgT3B0X2RhdGFfZXJyX2lnbm9yZSwKKwlPcHRfZGF0YV9lcnJfYWJvcnQsIE9wdF9kYXRhX2Vycl9pZ25vcmUsIE9wdF9tYl9oaXN0b3J5X2xlbmd0aCwKIAlPcHRfdXNyanF1b3RhLCBPcHRfZ3JwanF1b3RhLCBPcHRfb2ZmdXNyanF1b3RhLCBPcHRfb2ZmZ3JwanF1b3RhLAogCU9wdF9qcWZtdF92ZnNvbGQsIE9wdF9qcWZtdF92ZnN2MCwgT3B0X3F1b3RhLCBPcHRfbm9xdW90YSwKIAlPcHRfaWdub3JlLCBPcHRfYmFycmllciwgT3B0X25vYmFycmllciwgT3B0X2VyciwgT3B0X3Jlc2l6ZSwKIAlPcHRfdXNycXVvdGEsIE9wdF9ncnBxdW90YSwgT3B0X2lfdmVyc2lvbiwKIAlPcHRfc3RyaXBlLCBPcHRfZGVsYWxsb2MsIE9wdF9ub2RlbGFsbG9jLAorCU9wdF9ibG9ja192YWxpZGl0eSwgT3B0X25vYmxvY2tfdmFsaWRpdHksCiAJT3B0X2lub2RlX3JlYWRhaGVhZF9ibGtzLCBPcHRfam91cm5hbF9pb3ByaW8KIH07CiAKQEAgLTEwNjksNiArMTEwOCw3IEBACiAJe09wdF9kYXRhX3dyaXRlYmFjaywgImRhdGE9d3JpdGViYWNrIn0sCiAJe09wdF9kYXRhX2Vycl9hYm9ydCwgImRhdGFfZXJyPWFib3J0In0sCiAJe09wdF9kYXRhX2Vycl9pZ25vcmUsICJkYXRhX2Vycj1pZ25vcmUifSwKKwl7T3B0X21iX2hpc3RvcnlfbGVuZ3RoLCAibWJfaGlzdG9yeV9sZW5ndGg9JXUifSwKIAl7T3B0X29mZnVzcmpxdW90YSwgInVzcmpxdW90YT0ifSwKIAl7T3B0X3VzcmpxdW90YSwgInVzcmpxdW90YT0lcyJ9LAogCXtPcHRfb2ZmZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSJ9LApAQCAtMTA4Nyw2ICsxMTI3LDggQEAKIAl7T3B0X3Jlc2l6ZSwgInJlc2l6ZSJ9LAogCXtPcHRfZGVsYWxsb2MsICJkZWxhbGxvYyJ9LAogCXtPcHRfbm9kZWxhbGxvYywgIm5vZGVsYWxsb2MifSwKKwl7T3B0X2Jsb2NrX3ZhbGlkaXR5LCAiYmxvY2tfdmFsaWRpdHkifSwKKwl7T3B0X25vYmxvY2tfdmFsaWRpdHksICJub2Jsb2NrX3ZhbGlkaXR5In0sCiAJe09wdF9pbm9kZV9yZWFkYWhlYWRfYmxrcywgImlub2RlX3JlYWRhaGVhZF9ibGtzPSV1In0sCiAJe09wdF9qb3VybmFsX2lvcHJpbywgImpvdXJuYWxfaW9wcmlvPSV1In0sCiAJe09wdF9hdXRvX2RhX2FsbG9jLCAiYXV0b19kYV9hbGxvYz0ldSJ9LApAQCAtMTEwMiw4ICsxMTQ0LDkgQEAKIAogCWlmICghb3B0aW9ucyB8fCBzdHJuY21wKG9wdGlvbnMsICJzYj0iLCAzKSAhPSAwKQogCQlyZXR1cm4gMTsJLyogRGVmYXVsdCBsb2NhdGlvbiAqLworCiAJb3B0aW9ucyArPSAzOwotCS8qdG9kbzogdXNlIHNpbXBsZV9zdHJ0b2xsIHdpdGggPjMyYml0IGV4dDQgKi8KKwkvKiBUT0RPOiB1c2Ugc2ltcGxlX3N0cnRvbGwgd2l0aCA+MzJiaXQgZXh0NCAqLwogCXNiX2Jsb2NrID0gc2ltcGxlX3N0cnRvdWwob3B0aW9ucywgJm9wdGlvbnMsIDApOwogCWlmICgqb3B0aW9ucyAmJiAqb3B0aW9ucyAhPSAnLCcpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBJbnZhbGlkIHNiIHNwZWNpZmljYXRpb246ICVzXG4iLApAQCAtMTExMyw2ICsxMTU2LDcgQEAKIAlpZiAoKm9wdGlvbnMgPT0gJywnKQogCQlvcHRpb25zKys7CiAJKmRhdGEgPSAodm9pZCAqKSBvcHRpb25zOworCiAJcmV0dXJuIHNiX2Jsb2NrOwogfQogCkBAIC0xMjA2LDggKzEyNTAsNyBAQAogI2Vsc2UKIAkJY2FzZSBPcHRfdXNlcl94YXR0cjoKIAkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0IChubyl1c2VyX3hhdHRyIG9wdGlvbnMgIgotCQkJICAgICAgICJub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIihubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZCIpOwogCQkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRVhUNF9GU19QT1NJWF9BQ0wKQEAgLTEyMjAsOCArMTI2Myw3IEBACiAjZWxzZQogCQljYXNlIE9wdF9hY2w6CiAJCWNhc2UgT3B0X25vYWNsOgotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0IChubylhY2wgb3B0aW9ucyAiCi0JCQkgICAgICAgIm5vdCBzdXBwb3J0ZWRcbiIpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiKG5vKWFjbCBvcHRpb25zIG5vdCBzdXBwb3J0ZWQiKTsKIAkJCWJyZWFrOwogI2VuZGlmCiAJCWNhc2UgT3B0X2pvdXJuYWxfdXBkYXRlOgpAQCAtMTIzMSwxNiArMTI3MywxNiBAQAogCQkJICAgdXNlciB0byBzcGVjaWZ5IGFuIGV4aXN0aW5nIGlub2RlIHRvIGJlIHRoZQogCQkJICAgam91cm5hbCBmaWxlLiAqLwogCQkJaWYgKGlzX3JlbW91bnQpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGNhbm5vdCBzcGVjaWZ5ICIKLQkJCQkgICAgICAgImpvdXJuYWwgb24gcmVtb3VudFxuIik7CisJCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCQkgIkNhbm5vdCBzcGVjaWZ5IGpvdXJuYWwgb24gcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBVUERBVEVfSk9VUk5BTCk7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfam91cm5hbF9kZXY6CiAJCQlpZiAoaXNfcmVtb3VudCkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2Fubm90IHNwZWNpZnkgIgotCQkJCSAgICAgICAiam91cm5hbCBvbiByZW1vdW50XG4iKTsKKwkJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJDYW5ub3Qgc3BlY2lmeSBqb3VybmFsIG9uIHJlbW91bnQiKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQpAQCAtMTI5NCw5ICsxMzM2LDggQEAKIAkJCWlmIChpc19yZW1vdW50KSB7CiAJCQkJaWYgKChzYmktPnNfbW91bnRfb3B0ICYgRVhUNF9NT1VOVF9EQVRBX0ZMQUdTKQogCQkJCQkJIT0gZGF0YV9vcHQpIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCQkiRVhUNC1mczogY2Fubm90IGNoYW5nZSBkYXRhICIKLQkJCQkJCSJtb2RlIG9uIHJlbW91bnRcbiIpOworCQkJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCQkiQ2Fubm90IGNoYW5nZSBkYXRhIG1vZGUgb24gcmVtb3VudCIpOwogCQkJCQlyZXR1cm4gMDsKIAkJCQl9CiAJCQl9IGVsc2UgewpAQCAtMTMxMCw2ICsxMzUxLDEzIEBACiAJCWNhc2UgT3B0X2RhdGFfZXJyX2lnbm9yZToKIAkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBEQVRBX0VSUl9BQk9SVCk7CiAJCQlicmVhazsKKwkJY2FzZSBPcHRfbWJfaGlzdG9yeV9sZW5ndGg6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKQorCQkJCXJldHVybiAwOworCQkJc2JpLT5zX21iX2hpc3RvcnlfbWF4ID0gb3B0aW9uOworCQkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX1FVT1RBCiAJCWNhc2UgT3B0X3VzcmpxdW90YToKIAkJCXF0eXBlID0gVVNSUVVPVEE7CkBAIC0xMzE5LDMxICsxMzY3LDMxIEBACiBzZXRfcWZfbmFtZToKIAkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSAmJgogCQkJICAgICFzYmktPnNfcWZfbmFtZXNbcXR5cGVdKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJICAgICAgICJFWFQ0LWZzOiBDYW5ub3QgY2hhbmdlIGpvdXJuYWxlZCAiCi0JCQkJICAgICAgICJxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCSAgICAgICAiQ2Fubm90IGNoYW5nZSBqb3VybmFsZWQgIgorCQkJCSAgICAgICAicXVvdGEgb3B0aW9ucyB3aGVuIHF1b3RhIHR1cm5lZCBvbiIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJcW5hbWUgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOwogCQkJaWYgKCFxbmFtZSkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkiRVhUNC1mczogbm90IGVub3VnaCBtZW1vcnkgZm9yICIKLQkJCQkJInN0b3JpbmcgcXVvdGFmaWxlIG5hbWUuXG4iKTsKKwkJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgIgorCQkJCQkic3RvcmluZyBxdW90YWZpbGUgbmFtZSIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKHNiaS0+c19xZl9uYW1lc1txdHlwZV0gJiYKIAkJCSAgICBzdHJjbXAoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSwgcW5hbWUpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQ0LWZzOiAlcyBxdW90YSBmaWxlIGFscmVhZHkgIgotCQkJCQkic3BlY2lmaWVkLlxuIiwgUVRZUEUyTkFNRShxdHlwZSkpOworCQkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkJIiVzIHF1b3RhIGZpbGUgYWxyZWFkeSAiCisJCQkJCSJzcGVjaWZpZWQiLCBRVFlQRTJOQU1FKHF0eXBlKSk7CiAJCQkJa2ZyZWUocW5hbWUpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IHFuYW1lOwogCQkJaWYgKHN0cmNocihzYmktPnNfcWZfbmFtZXNbcXR5cGVdLCAnLycpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQ0LWZzOiBxdW90YWZpbGUgbXVzdCBiZSBvbiAiCi0JCQkJCSJmaWxlc3lzdGVtIHJvb3QuXG4iKTsKKwkJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJCSJxdW90YWZpbGUgbXVzdCBiZSBvbiAiCisJCQkJCSJmaWxlc3lzdGVtIHJvb3QiKTsKIAkJCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbcXR5cGVdKTsKIAkJCQlzYmktPnNfcWZfbmFtZXNbcXR5cGVdID0gTlVMTDsKIAkJCQlyZXR1cm4gMDsKQEAgLTEzNTgsOSArMTQwNiw5IEBACiBjbGVhcl9xZl9uYW1lOgogCQkJaWYgKHNiX2FueV9xdW90YV9sb2FkZWQoc2IpICYmCiAJCQkgICAgc2JpLT5zX3FmX25hbWVzW3F0eXBlXSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogQ2Fubm90IGNoYW5nZSAiCisJCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiQ2Fubm90IGNoYW5nZSAiCiAJCQkJCSJqb3VybmFsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKLQkJCQkJInF1b3RhIHR1cm5lZCBvbi5cbiIpOworCQkJCQkicXVvdGEgdHVybmVkIG9uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQkvKgpAQCAtMTM3Nyw5ICsxNDI1LDkgQEAKIHNldF9xZl9mb3JtYXQ6CiAJCQlpZiAoc2JfYW55X3F1b3RhX2xvYWRlZChzYikgJiYKIAkJCSAgICBzYmktPnNfanF1b3RhX2ZtdCAhPSBxZm10KSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBDYW5ub3QgY2hhbmdlICIKKwkJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJDYW5ub3QgY2hhbmdlICIKIAkJCQkJImpvdXJuYWxlZCBxdW90YSBvcHRpb25zIHdoZW4gIgotCQkJCQkicXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJCSJxdW90YSB0dXJuZWQgb24iKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXNiaS0+c19qcXVvdGFfZm10ID0gcWZtdDsKQEAgLTEzOTUsOCArMTQ0Myw4IEBACiAJCQlicmVhazsKIAkJY2FzZSBPcHRfbm9xdW90YToKIAkJCWlmIChzYl9hbnlfcXVvdGFfbG9hZGVkKHNiKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogQ2Fubm90IGNoYW5nZSBxdW90YSAiCi0JCQkJCSJvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiQ2Fubm90IGNoYW5nZSBxdW90YSAiCisJCQkJCSJvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uIik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUVVPVEEpOwpAQCAtMTQwNyw4ICsxNDU1LDggQEAKIAkJY2FzZSBPcHRfcXVvdGE6CiAJCWNhc2UgT3B0X3VzcnF1b3RhOgogCQljYXNlIE9wdF9ncnBxdW90YToKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSJFWFQ0LWZzOiBxdW90YSBvcHRpb25zIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkicXVvdGEgb3B0aW9ucyBub3Qgc3VwcG9ydGVkIik7CiAJCQlicmVhazsKIAkJY2FzZSBPcHRfdXNyanF1b3RhOgogCQljYXNlIE9wdF9ncnBqcXVvdGE6CkBAIC0xNDE2LDkgKzE0NjQsOCBAQAogCQljYXNlIE9wdF9vZmZncnBqcXVvdGE6CiAJCWNhc2UgT3B0X2pxZm10X3Zmc29sZDoKIAkJY2FzZSBPcHRfanFmbXRfdmZzdjA6Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCQkiRVhUNC1mczogam91cm5hbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKLQkJCQkic3VwcG9ydGVkLlxuIik7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkJImpvdXJuYWxlZCBxdW90YSBvcHRpb25zIG5vdCBzdXBwb3J0ZWQiKTsKIAkJCWJyZWFrOwogCQljYXNlIE9wdF9ub3F1b3RhOgogCQkJYnJlYWs7CkBAIC0xNDQzLDggKzE0OTAsOSBAQAogCQkJYnJlYWs7CiAJCWNhc2UgT3B0X3Jlc2l6ZToKIAkJCWlmICghaXNfcmVtb3VudCkgewotCQkJCXByaW50aygiRVhUNC1mczogcmVzaXplIG9wdGlvbiBvbmx5IGF2YWlsYWJsZSAiCi0JCQkJCSJmb3IgcmVtb3VudFxuIik7CisJCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJCQkicmVzaXplIG9wdGlvbiBvbmx5IGF2YWlsYWJsZSAiCisJCQkJCSJmb3IgcmVtb3VudCIpOwogCQkJCXJldHVybiAwOwogCQkJfQogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikgIT0gMCkKQEAgLTE0NzQsMTQgKzE1MjIsMjEgQEAKIAkJY2FzZSBPcHRfZGVsYWxsb2M6CiAJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIERFTEFMTE9DKTsKIAkJCWJyZWFrOworCQljYXNlIE9wdF9ibG9ja192YWxpZGl0eToKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQkxPQ0tfVkFMSURJVFkpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vYmxvY2tfdmFsaWRpdHk6CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgQkxPQ0tfVkFMSURJVFkpOworCQkJYnJlYWs7CiAJCWNhc2UgT3B0X2lub2RlX3JlYWRhaGVhZF9ibGtzOgogCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCiAJCQkJcmV0dXJuIDA7CiAJCQlpZiAob3B0aW9uIDwgMCB8fCBvcHRpb24gPiAoMSA8PCAzMCkpCiAJCQkJcmV0dXJuIDA7Ci0JCQlpZiAob3B0aW9uICYgKG9wdGlvbiAtIDEpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBpbm9kZV9yZWFkYWhlYWRfYmxrcyIKLQkJCQkgICAgICAgIiBtdXN0IGJlIGEgcG93ZXIgb2YgMlxuIik7CisJCQlpZiAoIWlzX3Bvd2VyX29mXzIob3B0aW9uKSkgeworCQkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkJICJFWFQ0LWZzOiBpbm9kZV9yZWFkYWhlYWRfYmxrcyIKKwkJCQkJICIgbXVzdCBiZSBhIHBvd2VyIG9mIDIiKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJCXNiaS0+c19pbm9kZV9yZWFkYWhlYWRfYmxrcyA9IG9wdGlvbjsKQEAgLTE1MDgsOSArMTU2Myw5IEBACiAJCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LE5PX0FVVE9fREFfQUxMT0MpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiRVhUNC1mczogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgotCQkJICAgICAgICJvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSAgICAgICAiVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgorCQkJICAgICAgICJvciBtaXNzaW5nIHZhbHVlIiwgcCk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KQEAgLTE1MjgsMjEgKzE1ODMsMjEgQEAKIAkJCQkoc2JpLT5zX21vdW50X29wdCAmIEVYVDRfTU9VTlRfR1JQUVVPVEEpKSB8fAogCQkgICAgKHNiaS0+c19xZl9uYW1lc1tHUlBRVU9UQV0gJiYKIAkJCQkoc2JpLT5zX21vdW50X29wdCAmIEVYVDRfTU9VTlRfVVNSUVVPVEEpKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBvbGQgYW5kIG5ldyBxdW90YSAiCi0JCQkJCSJmb3JtYXQgbWl4aW5nLlxuIik7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJvbGQgYW5kIG5ldyBxdW90YSAiCisJCQkJCSJmb3JtYXQgbWl4aW5nIik7CiAJCQlyZXR1cm4gMDsKIAkJfQogCiAJCWlmICghc2JpLT5zX2pxdW90YV9mbXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCi0JCQkJCSJub3Qgc3BlY2lmaWVkLlxuIik7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJqb3VybmFsZWQgcXVvdGEgZm9ybWF0ICIKKwkJCQkJIm5vdCBzcGVjaWZpZWQiKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKHNiaS0+c19qcXVvdGFfZm10KSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGpvdXJuYWxlZCBxdW90YSBmb3JtYXQgIgorCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiam91cm5hbGVkIHF1b3RhIGZvcm1hdCAiCiAJCQkJCSJzcGVjaWZpZWQgd2l0aCBubyBqb3VybmFsaW5nICIKLQkJCQkJImVuYWJsZWQuXG4iKTsKKwkJCQkJImVuYWJsZWQiKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtMTU1NywzMiArMTYxMiwzMiBAQAogCWludCByZXMgPSAwOwogCiAJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPiBFWFQ0X01BWF9TVVBQX1JFVikgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnMgd2FybmluZzogcmV2aXNpb24gbGV2ZWwgdG9vIGhpZ2gsICIKLQkJICAgICAgICJmb3JjaW5nIHJlYWQtb25seSBtb2RlXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAicmV2aXNpb24gbGV2ZWwgdG9vIGhpZ2gsICIKKwkJCSAiZm9yY2luZyByZWFkLW9ubHkgbW9kZSIpOwogCQlyZXMgPSBNU19SRE9OTFk7CiAJfQogCWlmIChyZWFkX29ubHkpCiAJCXJldHVybiByZXM7CiAJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUNF9WQUxJRF9GUykpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnMgd2FybmluZzogbW91bnRpbmcgdW5jaGVja2VkIGZzLCAiCi0JCSAgICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCAid2FybmluZzogbW91bnRpbmcgdW5jaGVja2VkIGZzLCAiCisJCQkgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIik7CiAJZWxzZSBpZiAoKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfRVJST1JfRlMpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiRVhUNC1mcyB3YXJuaW5nOiBtb3VudGluZyBmcyB3aXRoIGVycm9ycywgIgotCQkgICAgICAgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywKKwkJCSAid2FybmluZzogbW91bnRpbmcgZnMgd2l0aCBlcnJvcnMsICIKKwkJCSAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiKTsKIAllbHNlIGlmICgoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpID49IDAgJiYKIAkJIGxlMTZfdG9fY3B1KGVzLT5zX21udF9jb3VudCkgPj0KIAkJICh1bnNpZ25lZCBzaG9ydCkgKF9fczE2KSBsZTE2X3RvX2NwdShlcy0+c19tYXhfbW50X2NvdW50KSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIkVYVDQtZnMgd2FybmluZzogbWF4aW1hbCBtb3VudCBjb3VudCByZWFjaGVkLCAiCi0JCSAgICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLAorCQkJICJ3YXJuaW5nOiBtYXhpbWFsIG1vdW50IGNvdW50IHJlYWNoZWQsICIKKwkJCSAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiKTsKIAllbHNlIGlmIChsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSAmJgogCQkobGUzMl90b19jcHUoZXMtPnNfbGFzdGNoZWNrKSArCiAJCQlsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSA8PSBnZXRfc2Vjb25kcygpKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIkVYVDQtZnMgd2FybmluZzogY2hlY2t0aW1lIHJlYWNoZWQsICIKLQkJICAgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7Ci0JaWYgKCFzYmktPnNfam91cm5hbCkgCisJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkgIndhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCAiCisJCQkgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkIik7CisJaWYgKCFzYmktPnNfam91cm5hbCkKIAkJZXMtPnNfc3RhdGUgJj0gY3B1X3RvX2xlMTYofkVYVDRfVkFMSURfRlMpOwogCWlmICghKF9fczE2KSBsZTE2X3RvX2NwdShlcy0+c19tYXhfbW50X2NvdW50KSkKIAkJZXMtPnNfbWF4X21udF9jb3VudCA9IGNwdV90b19sZTE2KEVYVDRfREZMX01BWF9NTlRfQ09VTlQpOwpAQCAtMTU5Miw3ICsxNjQ3LDcgQEAKIAlpZiAoc2JpLT5zX2pvdXJuYWwpCiAJCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKIAotCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisJZXh0NF9jb21taXRfc3VwZXIoc2IsIDEpOwogCWlmICh0ZXN0X29wdChzYiwgREVCVUcpKQogCQlwcmludGsoS0VSTl9JTkZPICJbRVhUNCBGUyBicz0lbHUsIGdjPSV1LCAiCiAJCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XVxuIiwKQEAgLTE2MDMsMTEgKzE2NTgsMTEgQEAKIAkJCXNiaS0+c19tb3VudF9vcHQpOwogCiAJaWYgKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNCBGUyBvbiAlcywgJXMgam91cm5hbCBvbiAlc1xuIiwKLQkJICAgICAgIHNiLT5zX2lkLCBFWFQ0X1NCKHNiKS0+c19qb3VybmFsLT5qX2lub2RlID8gImludGVybmFsIiA6CisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sICIlcyBqb3VybmFsIG9uICVzIiwKKwkJICAgICAgIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfaW5vZGUgPyAiaW50ZXJuYWwiIDoKIAkJICAgICAgICJleHRlcm5hbCIsIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZGV2bmFtZSk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNCBGUyBvbiAlcywgbm8gam91cm5hbFxuIiwgc2ItPnNfaWQpOworCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAibm8gam91cm5hbCIpOwogCX0KIAlyZXR1cm4gcmVzOwogfQpAQCAtMTYxNiwxMCArMTY3MSwxMCBAQAogewogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCXN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmdkcCA9IE5VTEw7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlleHQ0X2dyb3VwX3QgZmxleF9ncm91cF9jb3VudDsKIAlleHQ0X2dyb3VwX3QgZmxleF9ncm91cDsKIAlpbnQgZ3JvdXBzX3Blcl9mbGV4ID0gMDsKKwlzaXplX3Qgc2l6ZTsKIAlpbnQgaTsKIAogCWlmICghc2JpLT5zX2VzLT5zX2xvZ19ncm91cHNfcGVyX2ZsZXgpIHsKQEAgLTE2MzQsMTYgKzE2ODksMjEgQEAKIAlmbGV4X2dyb3VwX2NvdW50ID0gKChzYmktPnNfZ3JvdXBzX2NvdW50ICsgZ3JvdXBzX3Blcl9mbGV4IC0gMSkgKwogCQkJKChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykgKyAxKSA8PAogCQkJICAgICAgRVhUNF9ERVNDX1BFUl9CTE9DS19CSVRTKHNiKSkpIC8gZ3JvdXBzX3Blcl9mbGV4OwotCXNiaS0+c19mbGV4X2dyb3VwcyA9IGt6YWxsb2MoZmxleF9ncm91cF9jb3VudCAqCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IGZsZXhfZ3JvdXBzKSwgR0ZQX0tFUk5FTCk7CisJc2l6ZSA9IGZsZXhfZ3JvdXBfY291bnQgKiBzaXplb2Yoc3RydWN0IGZsZXhfZ3JvdXBzKTsKKwlzYmktPnNfZmxleF9ncm91cHMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmIChzYmktPnNfZmxleF9ncm91cHMgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciAiCi0JCQkJIiV1IGZsZXggZ3JvdXBzXG4iLCBmbGV4X2dyb3VwX2NvdW50KTsKKwkJc2JpLT5zX2ZsZXhfZ3JvdXBzID0gdm1hbGxvYyhzaXplKTsKKwkJaWYgKHNiaS0+c19mbGV4X2dyb3VwcykKKwkJCW1lbXNldChzYmktPnNfZmxleF9ncm91cHMsIDAsIHNpemUpOworCX0KKwlpZiAoc2JpLT5zX2ZsZXhfZ3JvdXBzID09IE5VTEwpIHsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAibm90IGVub3VnaCBtZW1vcnkgZm9yICIKKwkJCQkiJXUgZmxleCBncm91cHMiLCBmbGV4X2dyb3VwX2NvdW50KTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykgewotCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCAmYmgpOworCQlnZHAgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAogCQlmbGV4X2dyb3VwID0gZXh0NF9mbGV4X2dyb3VwKHNiaSwgaSk7CiAJCWF0b21pY19zZXQoJnNiaS0+c19mbGV4X2dyb3Vwc1tmbGV4X2dyb3VwXS5mcmVlX2lub2RlcywKQEAgLTE3MjQsNDQgKzE3ODQsNDQgQEAKIAogCQlibG9ja19iaXRtYXAgPSBleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZ2RwKTsKIAkJaWYgKGJsb2NrX2JpdG1hcCA8IGZpcnN0X2Jsb2NrIHx8IGJsb2NrX2JpdG1hcCA+IGxhc3RfYmxvY2spIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgorCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZXh0NF9jaGVja19kZXNjcmlwdG9yczogIgogCQkJICAgICAgICJCbG9jayBiaXRtYXAgZm9yIGdyb3VwICV1IG5vdCBpbiBncm91cCAiCi0JCQkgICAgICAgIihibG9jayAlbGx1KSFcbiIsIGksIGJsb2NrX2JpdG1hcCk7CisJCQkgICAgICAgIihibG9jayAlbGx1KSEiLCBpLCBibG9ja19iaXRtYXApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJaW5vZGVfYml0bWFwID0gZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGdkcCk7CiAJCWlmIChpbm9kZV9iaXRtYXAgPCBmaXJzdF9ibG9jayB8fCBpbm9kZV9iaXRtYXAgPiBsYXN0X2Jsb2NrKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImV4dDRfY2hlY2tfZGVzY3JpcHRvcnM6ICIKIAkJCSAgICAgICAiSW5vZGUgYml0bWFwIGZvciBncm91cCAldSBub3QgaW4gZ3JvdXAgIgotCQkJICAgICAgICIoYmxvY2sgJWxsdSkhXG4iLCBpLCBpbm9kZV9iaXRtYXApOworCQkJICAgICAgICIoYmxvY2sgJWxsdSkhIiwgaSwgaW5vZGVfYml0bWFwKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWlub2RlX3RhYmxlID0gZXh0NF9pbm9kZV90YWJsZShzYiwgZ2RwKTsKIAkJaWYgKGlub2RlX3RhYmxlIDwgZmlyc3RfYmxvY2sgfHwKIAkJICAgIGlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgLSAxID4gbGFzdF9ibG9jaykgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCiAJCQkgICAgICAgIklub2RlIHRhYmxlIGZvciBncm91cCAldSBub3QgaW4gZ3JvdXAgIgotCQkJICAgICAgICIoYmxvY2sgJWxsdSkhXG4iLCBpLCBpbm9kZV90YWJsZSk7CisJCQkgICAgICAgIihibG9jayAlbGx1KSEiLCBpLCBpbm9kZV90YWJsZSk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBpKSk7CisJCWV4dDRfbG9ja19ncm91cChzYiwgaSk7CiAJCWlmICghZXh0NF9ncm91cF9kZXNjX2NzdW1fdmVyaWZ5KHNiaSwgaSwgZ2RwKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCi0JCQkgICAgICAgIkNoZWNrc3VtIGZvciBncm91cCAldSBmYWlsZWQgKCV1IT0ldSlcbiIsCi0JCQkgICAgICAgaSwgbGUxNl90b19jcHUoZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBpLAotCQkJICAgICAgIGdkcCkpLCBsZTE2X3RvX2NwdShnZHAtPmJnX2NoZWNrc3VtKSk7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzOiAiCisJCQkJICJDaGVja3N1bSBmb3IgZ3JvdXAgJXUgZmFpbGVkICgldSE9JXUpIiwKKwkJCQkgaSwgbGUxNl90b19jcHUoZXh0NF9ncm91cF9kZXNjX2NzdW0oc2JpLCBpLAorCQkJCSAgICAgZ2RwKSksIGxlMTZfdG9fY3B1KGdkcC0+YmdfY2hlY2tzdW0pKTsKIAkJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCQkJCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgaSkpOworCQkJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBpKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfQotCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGkpKTsKKwkJZXh0NF91bmxvY2tfZ3JvdXAoc2IsIGkpOwogCQlpZiAoIWZsZXhiZ19mbGFnKQogCQkJZmlyc3RfYmxvY2sgKz0gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKTsKIAl9CiAKIAlleHQ0X2ZyZWVfYmxvY2tzX2NvdW50X3NldChzYmktPnNfZXMsIGV4dDRfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKLQlzYmktPnNfZXMtPnNfZnJlZV9pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CisJc2JpLT5zX2VzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID1jcHVfdG9fbGUzMihleHQ0X2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE3OTYsOCArMTg1Niw4IEBACiAJfQogCiAJaWYgKGJkZXZfcmVhZF9vbmx5KHNiLT5zX2JkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogd3JpdGUgYWNjZXNzICIKLQkJCSJ1bmF2YWlsYWJsZSwgc2tpcHBpbmcgb3JwaGFuIGNsZWFudXAuXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAid3JpdGUgYWNjZXNzICIKKwkJCSJ1bmF2YWlsYWJsZSwgc2tpcHBpbmcgb3JwaGFuIGNsZWFudXAiKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTgxMSw4ICsxODcxLDcgQEAKIAl9CiAKIAlpZiAoc19mbGFncyAmIE1TX1JET05MWSkgewotCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiAlczogb3JwaGFuIGNsZWFudXAgb24gcmVhZG9ubHkgZnNcbiIsCi0JCSAgICAgICBzYi0+c19pZCk7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sICJvcnBoYW4gY2xlYW51cCBvbiByZWFkb25seSBmcyIpOwogCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwogCX0KICNpZmRlZiBDT05GSUdfUVVPVEEKQEAgLTE4MjMsOSArMTg4Miw5IEBACiAJCWlmIChFWFQ0X1NCKHNiKS0+c19xZl9uYW1lc1tpXSkgewogCQkJaW50IHJldCA9IGV4dDRfcXVvdGFfb25fbW91bnQoc2IsIGkpOwogCQkJaWYgKHJldCA8IDApCi0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSJFWFQ0LWZzOiBDYW5ub3QgdHVybiBvbiBqb3VybmFsZWQgIgotCQkJCQkicXVvdGE6IGVycm9yICVkXG4iLCByZXQpOworCQkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkJIkNhbm5vdCB0dXJuIG9uIGpvdXJuYWxlZCAiCisJCQkJCSJxdW90YTogZXJyb3IgJWQiLCByZXQpOwogCQl9CiAJfQogI2VuZGlmCkBAIC0xODQyLDE2ICsxOTAxLDE2IEBACiAJCWxpc3RfYWRkKCZFWFQ0X0koaW5vZGUpLT5pX29ycGhhbiwgJkVYVDRfU0Ioc2IpLT5zX29ycGhhbik7CiAJCXZmc19kcV9pbml0KGlub2RlKTsKIAkJaWYgKGlub2RlLT5pX25saW5rKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCSIlczogdHJ1bmNhdGluZyBpbm9kZSAlbHUgdG8gJWxsZCBieXRlc1xuIiwKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0RFQlVHLAorCQkJCSIlczogdHJ1bmNhdGluZyBpbm9kZSAlbHUgdG8gJWxsZCBieXRlcyIsCiAJCQkJX19mdW5jX18sIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSk7CiAJCQlqYmRfZGVidWcoMiwgInRydW5jYXRpbmcgaW5vZGUgJWx1IHRvICVsbGQgYnl0ZXNcbiIsCiAJCQkJICBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX3NpemUpOwogCQkJZXh0NF90cnVuY2F0ZShpbm9kZSk7CiAJCQlucl90cnVuY2F0ZXMrKzsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkJIiVzOiBkZWxldGluZyB1bnJlZmVyZW5jZWQgaW5vZGUgJWx1XG4iLAorCQkJZXh0NF9tc2coc2IsIEtFUk5fREVCVUcsCisJCQkJIiVzOiBkZWxldGluZyB1bnJlZmVyZW5jZWQgaW5vZGUgJWx1IiwKIAkJCQlfX2Z1bmNfXywgaW5vZGUtPmlfaW5vKTsKIAkJCWpiZF9kZWJ1ZygyLCAiZGVsZXRpbmcgdW5yZWZlcmVuY2VkIGlub2RlICVsdVxuIiwKIAkJCQkgIGlub2RlLT5pX2lubyk7CkBAIC0xODYzLDExICsxOTIyLDExIEBACiAjZGVmaW5lIFBMVVJBTCh4KSAoeCksICgoeCkgPT0gMSkgPyAiIiA6ICJzIgogCiAJaWYgKG5yX29ycGhhbnMpCi0JCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6ICVzOiAlZCBvcnBoYW4gaW5vZGUlcyBkZWxldGVkXG4iLAotCQkgICAgICAgc2ItPnNfaWQsIFBMVVJBTChucl9vcnBoYW5zKSk7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sICIlZCBvcnBoYW4gaW5vZGUlcyBkZWxldGVkIiwKKwkJICAgICAgIFBMVVJBTChucl9vcnBoYW5zKSk7CiAJaWYgKG5yX3RydW5jYXRlcykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogJXM6ICVkIHRydW5jYXRlJXMgY2xlYW5lZCB1cFxuIiwKLQkJICAgICAgIHNiLT5zX2lkLCBQTFVSQUwobnJfdHJ1bmNhdGVzKSk7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sICIlZCB0cnVuY2F0ZSVzIGNsZWFuZWQgdXAiLAorCQkgICAgICAgUExVUkFMKG5yX3RydW5jYXRlcykpOwogI2lmZGVmIENPTkZJR19RVU9UQQogCS8qIFR1cm4gcXVvdGFzIG9mZiAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgewpAQCAtMTg3Nyw2ICsxOTM2LDcgQEAKICNlbmRpZgogCXNiLT5zX2ZsYWdzID0gc19mbGFnczsgLyogUmVzdG9yZSBNU19SRE9OTFkgc3RhdHVzICovCiB9CisKIC8qCiAgKiBNYXhpbWFsIGV4dGVudCBmb3JtYXQgZmlsZSBzaXplLgogICogUmVzdWx0aW5nIGxvZ2ljYWwgYmxrbm8gYXQgc19tYXhieXRlcyBtdXN0IGZpdCBpbiBvdXIgb24tZGlzawpAQCAtMTkyNywxOSArMTk4NywxOSBAQAogCWxvZmZfdCByZXMgPSBFWFQ0X05ESVJfQkxPQ0tTOwogCWludCBtZXRhX2Jsb2NrczsKIAlsb2ZmX3QgdXBwZXJfbGltaXQ7Ci0JLyogVGhpcyBpcyBjYWxjdWxhdGVkIHRvIGJlIHRoZSBsYXJnZXN0IGZpbGUgc2l6ZSBmb3IgYQotCSAqIGRlbnNlLCBiaXRtYXBwZWQgZmlsZSBzdWNoIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZgotCSAqIHNlY3RvcnMgaW4gdGhlIGZpbGUsIGluY2x1ZGluZyBkYXRhIGFuZCBhbGwgaW5kaXJlY3QgYmxvY2tzLAotCSAqIGRvZXMgbm90IGV4Y2VlZCAyXjQ4IC0xCi0JICogX191MzIgaV9ibG9ja3NfbG8gYW5kIF91MTYgaV9ibG9ja3NfaGlnaCByZXByZXNlbnRpbmcgdGhlCi0JICogdG90YWwgbnVtYmVyIG9mICA1MTIgYnl0ZXMgYmxvY2tzIG9mIHRoZSBmaWxlCisJLyogVGhpcyBpcyBjYWxjdWxhdGVkIHRvIGJlIHRoZSBsYXJnZXN0IGZpbGUgc2l6ZSBmb3IgYSBkZW5zZSwgYmxvY2sKKwkgKiBtYXBwZWQgZmlsZSBzdWNoIHRoYXQgdGhlIGZpbGUncyB0b3RhbCBudW1iZXIgb2YgNTEyLWJ5dGUgc2VjdG9ycywKKwkgKiBpbmNsdWRpbmcgZGF0YSBhbmQgYWxsIGluZGlyZWN0IGJsb2NrcywgZG9lcyBub3QgZXhjZWVkICgyXjQ4IC0gMSkuCisJICoKKwkgKiBfX3UzMiBpX2Jsb2Nrc19sbyBhbmQgX3UxNiBpX2Jsb2Nrc19oaWdoIHJlcHJlc2VudCB0aGUgdG90YWwKKwkgKiBudW1iZXIgb2YgNTEyLWJ5dGUgc2VjdG9ycyBvZiB0aGUgZmlsZS4KIAkgKi8KIAogCWlmICghaGFzX2h1Z2VfZmlsZXMgfHwgc2l6ZW9mKGJsa2NudF90KSA8IHNpemVvZih1NjQpKSB7CiAJCS8qCi0JCSAqICFoYXNfaHVnZV9maWxlcyBvciBDT05GSUdfTEJEIGlzIG5vdCBlbmFibGVkCi0JCSAqIGltcGxpZXMgdGhlIGlub2RlIGlfYmxvY2sgcmVwcmVzZW50IHRvdGFsIGJsb2NrcyBpbgotCQkgKiA1MTIgYnl0ZXMgMzIgPT0gc2l6ZSBvZiB2ZnMgaW5vZGUgaV9ibG9ja3MgKiA4CisJCSAqICFoYXNfaHVnZV9maWxlcyBvciBDT05GSUdfTEJEIG5vdCBlbmFibGVkIGltcGxpZXMgdGhhdAorCQkgKiB0aGUgaW5vZGUgaV9ibG9jayBmaWVsZCByZXByZXNlbnRzIHRvdGFsIGZpbGUgYmxvY2tzIGluCisJCSAqIDJeMzIgNTEyLWJ5dGUgc2VjdG9ycyA9PSBzaXplIG9mIHZmcyBpbm9kZSBpX2Jsb2NrcyAqIDgKIAkJICovCiAJCXVwcGVyX2xpbWl0ID0gKDFMTCA8PCAzMikgLSAxOwogCkBAIC0xOTgxLDcgKzIwNDEsNyBAQAogfQogCiBzdGF0aWMgZXh0NF9mc2Jsa190IGRlc2NyaXB0b3JfbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkJZXh0NF9mc2Jsa190IGxvZ2ljYWxfc2JfYmxvY2ssIGludCBucikKKwkJCQkgICBleHQ0X2ZzYmxrX3QgbG9naWNhbF9zYl9ibG9jaywgaW50IG5yKQogewogCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSA9IEVYVDRfU0Ioc2IpOwogCWV4dDRfZ3JvdXBfdCBiZywgZmlyc3RfbWV0YV9iZzsKQEAgLTE5OTUsNiArMjA1NSw3IEBACiAJYmcgPSBzYmktPnNfZGVzY19wZXJfYmxvY2sgKiBucjsKIAlpZiAoZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGJnKSkKIAkJaGFzX3N1cGVyID0gMTsKKwogCXJldHVybiAoaGFzX3N1cGVyICsgZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgYmcpKTsKIH0KIApAQCAtMjA5MSw4ICsyMTUyLDcgQEAKIAlpZiAocGFyc2Vfc3RydG91bChidWYsIDB4NDAwMDAwMDAsICZ0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBpbm9kZV9yZWFkYWhlYWRfYmxrcyBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLwotCWlmICh0ICYgKHQtMSkpCisJaWYgKCFpc19wb3dlcl9vZl8yKHQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXNiaS0+c19pbm9kZV9yZWFkYWhlYWRfYmxrcyA9IHQ7CkBAIC0yMTAwLDcgKzIxNjAsNyBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBzYmlfdWlfc2hvdyhzdHJ1Y3QgZXh0NF9hdHRyICphLAotCQkJCXN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSwgY2hhciAqYnVmKQorCQkJICAgc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLCBjaGFyICpidWYpCiB7CiAJdW5zaWduZWQgaW50ICp1aSA9ICh1bnNpZ25lZCBpbnQgKikgKCgoY2hhciAqKSBzYmkpICsgYS0+b2Zmc2V0KTsKIApAQCAtMjIwNSw3ICsyMjY1LDYgQEAKIHN0YXRpYyBpbnQgZXh0NF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCiAJCQkJX19yZWxlYXNlcyhrZXJuZWxfbG9jaykKIAkJCQlfX2FjcXVpcmVzKGtlcm5lbF9sb2NrKQotCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBOVUxMOwpAQCAtMjI1Niw3ICsyMzE1LDcgQEAKIAogCWJsb2Nrc2l6ZSA9IHNiX21pbl9ibG9ja3NpemUoc2IsIEVYVDRfTUlOX0JMT0NLX1NJWkUpOwogCWlmICghYmxvY2tzaXplKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJ1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSIpOwogCQlnb3RvIG91dF9mYWlsOwogCX0KIApAQCAtMjI3Miw3ICsyMzMxLDcgQEAKIAl9CiAKIAlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBsb2dpY2FsX3NiX2Jsb2NrKSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAidW5hYmxlIHRvIHJlYWQgc3VwZXJibG9jayIpOwogCQlnb3RvIG91dF9mYWlsOwogCX0KIAkvKgpAQCAtMjMyMSw2ICsyMzgwLDcgQEAKIAlzYmktPnNfY29tbWl0X2ludGVydmFsID0gSkJEMl9ERUZBVUxUX01BWF9DT01NSVRfQUdFICogSFo7CiAJc2JpLT5zX21pbl9iYXRjaF90aW1lID0gRVhUNF9ERUZfTUlOX0JBVENIX1RJTUU7CiAJc2JpLT5zX21heF9iYXRjaF90aW1lID0gRVhUNF9ERUZfTUFYX0JBVENIX1RJTUU7CisJc2JpLT5zX21iX2hpc3RvcnlfbWF4ID0gZGVmYXVsdF9tYl9oaXN0b3J5X2xlbmd0aDsKIAogCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQkFSUklFUik7CiAKQEAgLTIzMzAsNyArMjM5MCw2IEBACiAJICovCiAJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBERUxBTExPQyk7CiAKLQogCWlmICghcGFyc2Vfb3B0aW9ucygoY2hhciAqKSBkYXRhLCBzYiwgJmpvdXJuYWxfZGV2bnVtLAogCQkJICAgJmpvdXJuYWxfaW9wcmlvLCBOVUxMLCAwKSkKIAkJZ290byBmYWlsZWRfbW91bnQ7CkBAIC0yMzQyLDkgKzI0MDEsOSBAQAogCSAgICAoRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIH4wVSkgfHwKIAkgICAgIEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CiAJICAgICBFWFQ0X0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCB+MFUpKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgIkVYVDQtZnMgd2FybmluZzogZmVhdHVyZSBmbGFncyBzZXQgb24gcmV2IDAgZnMsICIKLQkJICAgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCSAgICAgICAiZmVhdHVyZSBmbGFncyBzZXQgb24gcmV2IDAgZnMsICIKKwkJICAgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIpOwogCiAJLyoKIAkgKiBDaGVjayBmZWF0dXJlIGZsYWdzIHJlZ2FyZGxlc3Mgb2YgdGhlIHJldmlzaW9uIGxldmVsLCBzaW5jZSB3ZQpAQCAtMjM1MywxNiArMjQxMiwxOCBAQAogCSAqLwogCWZlYXR1cmVzID0gRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDRfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKIAlpZiAoZmVhdHVyZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCi0JCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsIHNiLT5zX2lkLAorCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkiQ291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCisJCQkidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KSIsCiAJCQkobGUzMl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9pbmNvbXBhdCkgJgogCQkJfkVYVDRfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIAlmZWF0dXJlcyA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCB+RVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKTsKIAlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYgZmVhdHVyZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiAlczogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKLQkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwgc2ItPnNfaWQsCisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJDb3VsZG4ndCBtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgorCQkJInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkiLAogCQkJKGxlMzJfdG9fY3B1KEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0KSAmCiAJCQl+RVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwpAQCAtMjM3Niw5ICsyNDM3LDkgQEAKIAkJICovCiAJCWlmIChzaXplb2Yocm9vdC0+aV9ibG9ja3MpIDwgc2l6ZW9mKHU2NCkgJiYKIAkJCQkhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiAlczogRmlsZXN5c3RlbSB3aXRoIGh1Z2UgIgorCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiRmlsZXN5c3RlbSB3aXRoIGh1Z2UgIgogCQkJCQkiZmlsZXMgY2Fubm90IGJlIG1vdW50ZWQgcmVhZC13cml0ZSAiCi0JCQkJCSJ3aXRob3V0IENPTkZJR19MQkQuXG4iLCBzYi0+c19pZCk7CisJCQkJCSJ3aXRob3V0IENPTkZJR19MQkQiKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50OwogCQl9CiAJfQpAQCAtMjM4NiwxNyArMjQ0NywxNSBAQAogCiAJaWYgKGJsb2Nrc2l6ZSA8IEVYVDRfTUlOX0JMT0NLX1NJWkUgfHwKIAkgICAgYmxvY2tzaXplID4gRVhUNF9NQVhfQkxPQ0tfU0laRSkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJFWFQ0LWZzOiBVbnN1cHBvcnRlZCBmaWxlc3lzdGVtIGJsb2Nrc2l6ZSAlZCBvbiAlcy5cbiIsCi0JCSAgICAgICBibG9ja3NpemUsIHNiLT5zX2lkKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkgICAgICAgIlVuc3VwcG9ydGVkIGZpbGVzeXN0ZW0gYmxvY2tzaXplICVkIiwgYmxvY2tzaXplKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCiAJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSAhPSBibG9ja3NpemUpIHsKLQogCQkvKiBWYWxpZGF0ZSB0aGUgZmlsZXN5c3RlbSBibG9ja3NpemUgKi8KIAkJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHNiLCBibG9ja3NpemUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGJhZCBibG9jayBzaXplICVkLlxuIiwKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImJhZCBibG9jayBzaXplICVkIiwKIAkJCQkJYmxvY2tzaXplKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50OwogCQl9CkBAIC0yNDA2LDE1ICsyNDY1LDE1IEBACiAJCW9mZnNldCA9IGRvX2Rpdihsb2dpY2FsX3NiX2Jsb2NrLCBibG9ja3NpemUpOwogCQliaCA9IHNiX2JyZWFkKHNiLCBsb2dpY2FsX3NiX2Jsb2NrKTsKIAkJaWYgKCFiaCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIkVYVDQtZnM6IENhbid0IHJlYWQgc3VwZXJibG9jayBvbiAybmQgdHJ5LlxuIik7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkgICAgICAgIkNhbid0IHJlYWQgc3VwZXJibG9jayBvbiAybmQgdHJ5Iik7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQogCQllcyA9IChzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqKSgoKGNoYXIgKiliaC0+Yl9kYXRhKSArIG9mZnNldCk7CiAJCXNiaS0+c19lcyA9IGVzOwogCQlpZiAoZXMtPnNfbWFnaWMgIT0gY3B1X3RvX2xlMTYoRVhUNF9TVVBFUl9NQUdJQykpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJFWFQ0LWZzOiBNYWdpYyBtaXNtYXRjaCwgdmVyeSB3ZWlyZCAhXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSAgICAgICAiTWFnaWMgbWlzbWF0Y2gsIHZlcnkgd2VpcmQhIik7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQogCX0KQEAgLTI0MzIsMzAgKzI0OTEsMzMgQEAKIAkJaWYgKChzYmktPnNfaW5vZGVfc2l6ZSA8IEVYVDRfR09PRF9PTERfSU5PREVfU0laRSkgfHwKIAkJICAgICghaXNfcG93ZXJfb2ZfMihzYmktPnNfaW5vZGVfc2l6ZSkpIHx8CiAJCSAgICAoc2JpLT5zX2lub2RlX3NpemUgPiBibG9ja3NpemUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiRVhUNC1mczogdW5zdXBwb3J0ZWQgaW5vZGUgc2l6ZTogJWRcbiIsCisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsCisJCQkgICAgICAgInVuc3VwcG9ydGVkIGlub2RlIHNpemU6ICVkIiwKIAkJCSAgICAgICBzYmktPnNfaW5vZGVfc2l6ZSk7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQogCQlpZiAoc2JpLT5zX2lub2RlX3NpemUgPiBFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkUpCiAJCQlzYi0+c190aW1lX2dyYW4gPSAxIDw8IChFWFQ0X0VQT0NIX0JJVFMgLSAyKTsKIAl9CisKIAlzYmktPnNfZGVzY19zaXplID0gbGUxNl90b19jcHUoZXMtPnNfZGVzY19zaXplKTsKIAlpZiAoRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUXzY0QklUKSkgewogCQlpZiAoc2JpLT5zX2Rlc2Nfc2l6ZSA8IEVYVDRfTUlOX0RFU0NfU0laRV82NEJJVCB8fAogCQkgICAgc2JpLT5zX2Rlc2Nfc2l6ZSA+IEVYVDRfTUFYX0RFU0NfU0laRSB8fAogCQkgICAgIWlzX3Bvd2VyX29mXzIoc2JpLT5zX2Rlc2Nfc2l6ZSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgICAgICJFWFQ0LWZzOiB1bnN1cHBvcnRlZCBkZXNjcmlwdG9yIHNpemUgJWx1XG4iLAorCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAorCQkJICAgICAgICJ1bnN1cHBvcnRlZCBkZXNjcmlwdG9yIHNpemUgJWx1IiwKIAkJCSAgICAgICBzYmktPnNfZGVzY19zaXplKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50OwogCQl9CiAJfSBlbHNlCiAJCXNiaS0+c19kZXNjX3NpemUgPSBFWFQ0X01JTl9ERVNDX1NJWkU7CisKIAlzYmktPnNfYmxvY2tzX3Blcl9ncm91cCA9IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOwogCXNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID0gbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX3Blcl9ncm91cCk7CiAJaWYgKEVYVDRfSU5PREVfU0laRShzYikgPT0gMCB8fCBFWFQ0X0lOT0RFU19QRVJfR1JPVVAoc2IpID09IDApCiAJCWdvdG8gY2FudGZpbmRfZXh0NDsKKwogCXNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrID0gYmxvY2tzaXplIC8gRVhUNF9JTk9ERV9TSVpFKHNiKTsKIAlpZiAoc2JpLT5zX2lub2Rlc19wZXJfYmxvY2sgPT0gMCkKIAkJZ290byBjYW50ZmluZF9leHQ0OwpAQCAtMjQ2Niw2ICsyNTI4LDcgQEAKIAlzYmktPnNfbW91bnRfc3RhdGUgPSBsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSk7CiAJc2JpLT5zX2FkZHJfcGVyX2Jsb2NrX2JpdHMgPSBpbG9nMihFWFQ0X0FERFJfUEVSX0JMT0NLKHNiKSk7CiAJc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrX2JpdHMgPSBpbG9nMihFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKSk7CisKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQlzYmktPnNfaGFzaF9zZWVkW2ldID0gbGUzMl90b19jcHUoZXMtPnNfaGFzaF9zZWVkW2ldKTsKIAlzYmktPnNfZGVmX2hhc2hfdmVyc2lvbiA9IGVzLT5zX2RlZl9oYXNoX3ZlcnNpb247CkBAIC0yNDgzLDI1ICsyNTQ2LDI0IEBACiAJfQogCiAJaWYgKHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJFWFQ0LWZzOiAjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJICAgICAgICIjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHUiLAogCQkgICAgICAgc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgewotCQlwcmludGsoS0VSTl9FUlIKLQkJICAgICAgICJFWFQ0LWZzOiAjaW5vZGVzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJICAgICAgICIjaW5vZGVzIHBlciBncm91cCB0b28gYmlnOiAlbHUiLAogCQkgICAgICAgc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXApOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKIAlpZiAoZXh0NF9ibG9ja3NfY291bnQoZXMpID4KIAkJICAgIChzZWN0b3JfdCkofjBVTEwpID4+IChzYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogZmlsZXN5c3RlbSBvbiAlczoiCi0JCQkiIHRvbyBsYXJnZSB0byBtb3VudCBzYWZlbHlcbiIsIHNiLT5zX2lkKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZmlsZXN5c3RlbSIKKwkJCSIgdG9vIGxhcmdlIHRvIG1vdW50IHNhZmVseSIpOwogCQlpZiAoc2l6ZW9mKHNlY3Rvcl90KSA8IDgpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBDT05GSUdfTEJEIG5vdCAiCi0JCQkJCSJlbmFibGVkXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJDT05GSUdfTEJEIG5vdCBlbmFibGVkIik7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIApAQCAtMjUxMSwyMSArMjU3MywyMSBAQAogCS8qIGNoZWNrIGJsb2NrcyBjb3VudCBhZ2FpbnN0IGRldmljZSBzaXplICovCiAJYmxvY2tzX2NvdW50ID0gc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKIAlpZiAoYmxvY2tzX2NvdW50ICYmIGV4dDRfYmxvY2tzX2NvdW50KGVzKSA+IGJsb2Nrc19jb3VudCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBiYWQgZ2VvbWV0cnk6IGJsb2NrIGNvdW50ICVsbHUgIgotCQkgICAgICAgImV4Y2VlZHMgc2l6ZSBvZiBkZXZpY2UgKCVsbHUgYmxvY2tzKVxuIiwKKwkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgImJhZCBnZW9tZXRyeTogYmxvY2sgY291bnQgJWxsdSAiCisJCSAgICAgICAiZXhjZWVkcyBzaXplIG9mIGRldmljZSAoJWxsdSBibG9ja3MpIiwKIAkJICAgICAgIGV4dDRfYmxvY2tzX2NvdW50KGVzKSwgYmxvY2tzX2NvdW50KTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCi0gICAgICAgIC8qCi0gICAgICAgICAqIEl0IG1ha2VzIG5vIHNlbnNlIGZvciB0aGUgZmlyc3QgZGF0YSBibG9jayB0byBiZSBiZXlvbmQgdGhlIGVuZAotICAgICAgICAgKiBvZiB0aGUgZmlsZXN5c3RlbS4KLSAgICAgICAgICovCi0gICAgICAgIGlmIChsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSA+PSBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBiYWQgZ2VvbWV0cnk6IGZpcnN0IGRhdGEiCi0JCSAgICAgICAiYmxvY2sgJXUgaXMgYmV5b25kIGVuZCBvZiBmaWxlc3lzdGVtICglbGx1KVxuIiwKLQkJICAgICAgIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spLAotCQkgICAgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpKTsKKwkvKgorCSAqIEl0IG1ha2VzIG5vIHNlbnNlIGZvciB0aGUgZmlyc3QgZGF0YSBibG9jayB0byBiZSBiZXlvbmQgdGhlIGVuZAorCSAqIG9mIHRoZSBmaWxlc3lzdGVtLgorCSAqLworCWlmIChsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSA+PSBleHQ0X2Jsb2Nrc19jb3VudChlcykpIHsKKyAgICAgICAgICAgICAgICBleHQ0X21zZyhzYiwgS0VSTl9XQVJOSU5HLCAiYmFkIGdlb21ldHJ5OiBmaXJzdCBkYXRhIgorCQkJICJibG9jayAldSBpcyBiZXlvbmQgZW5kIG9mIGZpbGVzeXN0ZW0gKCVsbHUpIiwKKwkJCSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSwKKwkJCSBleHQ0X2Jsb2Nrc19jb3VudChlcykpOwogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAJYmxvY2tzX2NvdW50ID0gKGV4dDRfYmxvY2tzX2NvdW50KGVzKSAtCkBAIC0yNTMzLDkgKzI1OTUsOSBAQAogCQkJRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEpOwogCWRvX2RpdihibG9ja3NfY291bnQsIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpOwogCWlmIChibG9ja3NfY291bnQgPiAoKHVpbnQ2NF90KTE8PDMyKSAtIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IGdyb3VwcyBjb3VudCB0b28gbGFyZ2U6ICV1ICIKKwkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgImdyb3VwcyBjb3VudCB0b28gbGFyZ2U6ICV1ICIKIAkJICAgICAgICIoYmxvY2sgY291bnQgJWxsdSwgZmlyc3QgZGF0YSBibG9jayAldSwgIgotCQkgICAgICAgImJsb2NrcyBwZXIgZ3JvdXAgJWx1KVxuIiwgc2JpLT5zX2dyb3Vwc19jb3VudCwKKwkJICAgICAgICJibG9ja3MgcGVyIGdyb3VwICVsdSkiLCBzYmktPnNfZ3JvdXBzX2NvdW50LAogCQkgICAgICAgZXh0NF9ibG9ja3NfY291bnQoZXMpLAogCQkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayksCiAJCSAgICAgICBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKQEAgLTI1NDcsNyArMjYwOSw3IEBACiAJc2JpLT5zX2dyb3VwX2Rlc2MgPSBrbWFsbG9jKGRiX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKIAkJCQkgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19ncm91cF9kZXNjID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIm5vdCBlbm91Z2ggbWVtb3J5Iik7CiAJCWdvdG8gZmFpbGVkX21vdW50OwogCX0KIApAQCAtMjU2MiwyMSArMjYyNCwyMSBAQAogCQlibG9jayA9IGRlc2NyaXB0b3JfbG9jKHNiLCBsb2dpY2FsX3NiX2Jsb2NrLCBpKTsKIAkJc2JpLT5zX2dyb3VwX2Rlc2NbaV0gPSBzYl9icmVhZChzYiwgYmxvY2spOwogCQlpZiAoIXNiaS0+c19ncm91cF9kZXNjW2ldKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6ICIKLQkJCSAgICAgICAiY2FuJ3QgcmVhZCBncm91cCBkZXNjcmlwdG9yICVkXG4iLCBpKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSAgICAgICAiY2FuJ3QgcmVhZCBncm91cCBkZXNjcmlwdG9yICVkIiwgaSk7CiAJCQlkYl9jb3VudCA9IGk7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDI7CiAJCX0KIAl9CiAJaWYgKCFleHQ0X2NoZWNrX2Rlc2NyaXB0b3JzKHNiKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGdyb3VwIGRlc2NyaXB0b3JzIGNvcnJ1cHRlZCFcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJncm91cCBkZXNjcmlwdG9ycyBjb3JydXB0ZWQhIik7CiAJCWdvdG8gZmFpbGVkX21vdW50MjsKIAl9CiAJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9GTEVYX0JHKSkKIAkJaWYgKCFleHQ0X2ZpbGxfZmxleF9pbmZvKHNiKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIkVYVDQtZnM6IHVuYWJsZSB0byBpbml0aWFsaXplICIKLQkJCSAgICAgICAiZmxleF9iZyBtZXRhIGluZm8hXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSAgICAgICAidW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkJICAgICAgICJmbGV4X2JnIG1ldGEgaW5mbyEiKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50MjsKIAkJfQogCkBAIC0yNTk4LDcgKzI2NjAsNyBAQAogCQllcnIgPSBwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlydHlibG9ja3NfY291bnRlciwgMCk7CiAJfQogCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBpbnN1ZmZpY2llbnQgbWVtb3J5XG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiaW5zdWZmaWNpZW50IG1lbW9yeSIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDM7CiAJfQogCkBAIC0yNjA3LDcgKzI2NjksMTEgQEAKIAkvKgogCSAqIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZQogCSAqLwotCXNiLT5zX29wID0gJmV4dDRfc29wczsKKwlpZiAoIXRlc3Rfb3B0KHNiLCBOT0xPQUQpICYmCisJICAgIEVYVDRfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKSkKKwkJc2ItPnNfb3AgPSAmZXh0NF9zb3BzOworCWVsc2UKKwkJc2ItPnNfb3AgPSAmZXh0NF9ub2pvdXJuYWxfc29wczsKIAlzYi0+c19leHBvcnRfb3AgPSAmZXh0NF9leHBvcnRfb3BzOwogCXNiLT5zX3hhdHRyID0gZXh0NF94YXR0cl9oYW5kbGVyczsKICNpZmRlZiBDT05GSUdfUVVPVEEKQEAgLTI2MTUsNiArMjY4MSw4IEBACiAJc2ItPmRxX29wID0gJmV4dDRfcXVvdGFfb3BlcmF0aW9uczsKICNlbmRpZgogCUlOSVRfTElTVF9IRUFEKCZzYmktPnNfb3JwaGFuKTsgLyogdW5saW5rZWQgYnV0IG9wZW4gZmlsZXMgKi8KKwltdXRleF9pbml0KCZzYmktPnNfb3JwaGFuX2xvY2spOworCW11dGV4X2luaXQoJnNiaS0+c19yZXNpemVfbG9jayk7CiAKIAlzYi0+c19yb290ID0gTlVMTDsKIApAQCAtMjYzMiwxMyArMjcwMCwxMyBAQAogCQkJZ290byBmYWlsZWRfbW91bnQzOwogCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKIAkJICAgIEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZmFpbGVkX2NvbW1pdCkgewotCQkJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUNC1mcyBlcnJvciAoZGV2aWNlICVzKTogIgorCQkJZXh0NF9tc2coc2IsIEtFUk5fQ1JJVCwgImVycm9yOiAiCiAJCQkgICAgICAgImV4dDRfZmlsbF9zdXBlcjogSm91cm5hbCB0cmFuc2FjdGlvbiAiCi0JCQkgICAgICAgIiV1IGlzIGNvcnJ1cHRcbiIsIHNiLT5zX2lkLAorCQkJICAgICAgICIldSBpcyBjb3JydXB0IiwKIAkJCSAgICAgICBFWFQ0X1NCKHNiKS0+c19qb3VybmFsLT5qX2ZhaWxlZF9jb21taXQpOwogCQkJaWYgKHRlc3Rfb3B0KHNiLCBFUlJPUlNfUk8pKSB7Ci0JCQkJcHJpbnRrKEtFUk5fQ1JJVAotCQkJCSAgICAgICAiTW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHlcbiIpOworCQkJCWV4dDRfbXNnKHNiLCBLRVJOX0NSSVQsCisJCQkJICAgICAgICJNb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seSIpOwogCQkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAkJCQlFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSB8PSBFWFQ0X0VSUk9SX0ZTOwogCQkJCWVzLT5zX3N0YXRlIHw9IGNwdV90b19sZTE2KEVYVDRfRVJST1JfRlMpOwpAQCAtMjY0NiwxNCArMjcxNCwxNCBAQAogCQkJaWYgKHRlc3Rfb3B0KHNiLCBFUlJPUlNfUEFOSUMpKSB7CiAJCQkJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9FUlJPUl9GUzsKIAkJCQllcy0+c19zdGF0ZSB8PSBjcHVfdG9fbGUxNihFWFQ0X0VSUk9SX0ZTKTsKLQkJCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCQkJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIAkJCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKHRlc3Rfb3B0KHNiLCBOT0xPQUQpICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmCiAJICAgICAgRVhUNF9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogcmVxdWlyZWQgam91cm5hbCByZWNvdmVyeSAiCi0JCSAgICAgICAic3VwcHJlc3NlZCBhbmQgbm90IG1vdW50ZWQgcmVhZC1vbmx5XG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAicmVxdWlyZWQgam91cm5hbCByZWNvdmVyeSAiCisJCSAgICAgICAic3VwcHJlc3NlZCBhbmQgbm90IG1vdW50ZWQgcmVhZC1vbmx5Iik7CiAJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9IGVsc2UgewogCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgREFUQV9GTEFHUyk7CkBAIC0yNjY2LDcgKzI3MzQsNyBAQAogCWlmIChleHQ0X2Jsb2Nrc19jb3VudChlcykgPiAweGZmZmZmZmZmVUxMICYmCiAJICAgICFqYmQyX2pvdXJuYWxfc2V0X2ZlYXR1cmVzKEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwsIDAsIDAsCiAJCQkJICAgICAgIEpCRDJfRkVBVFVSRV9JTkNPTVBBVF82NEJJVCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBGYWlsZWQgdG8gc2V0IDY0LWJpdCBqb3VybmFsIGZlYXR1cmVcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJGYWlsZWQgdG8gc2V0IDY0LWJpdCBqb3VybmFsIGZlYXR1cmUiKTsKIAkJZ290byBmYWlsZWRfbW91bnQ0OwogCX0KIApAQCAtMjcwNCw4ICsyNzcyLDggQEAKIAljYXNlIEVYVDRfTU9VTlRfV1JJVEVCQUNLX0RBVEE6CiAJCWlmICghamJkMl9qb3VybmFsX2NoZWNrX2F2YWlsYWJsZV9mZWF0dXJlcwogCQkgICAgKHNiaS0+c19qb3VybmFsLCAwLCAwLCBKQkQyX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBKb3VybmFsIGRvZXMgbm90IHN1cHBvcnQgIgotCQkJICAgICAgICJyZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGVcbiIpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiSm91cm5hbCBkb2VzIG5vdCBzdXBwb3J0ICIKKwkJCSAgICAgICAicmVxdWVzdGVkIGRhdGEgam91cm5hbGluZyBtb2RlIik7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJCX0KIAlkZWZhdWx0OgpAQCAtMjcxNyw4ICsyNzg1LDggQEAKIAogCWlmICh0ZXN0X29wdChzYiwgTk9CSCkpIHsKIAkJaWYgKCEodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpID09IEVYVDRfTU9VTlRfV1JJVEVCQUNLX0RBVEEpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBJZ25vcmluZyBub2JoIG9wdGlvbiAtICIKLQkJCQkiaXRzIHN1cHBvcnRlZCBvbmx5IHdpdGggd3JpdGViYWNrIG1vZGVcbiIpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fV0FSTklORywgIklnbm9yaW5nIG5vYmggb3B0aW9uIC0gIgorCQkJCSJpdHMgc3VwcG9ydGVkIG9ubHkgd2l0aCB3cml0ZWJhY2sgbW9kZSIpOwogCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PQkgpOwogCQl9CiAJfQpAQCAtMjcyOSwxOCArMjc5NywxOCBAQAogCiAJcm9vdCA9IGV4dDRfaWdldChzYiwgRVhUNF9ST09UX0lOTyk7CiAJaWYgKElTX0VSUihyb290KSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGdldCByb290IGlub2RlIGZhaWxlZFxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImdldCByb290IGlub2RlIGZhaWxlZCIpOwogCQlyZXQgPSBQVFJfRVJSKHJvb3QpOwogCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJfQogCWlmICghU19JU0RJUihyb290LT5pX21vZGUpIHx8ICFyb290LT5pX2Jsb2NrcyB8fCAhcm9vdC0+aV9zaXplKSB7CiAJCWlwdXQocm9vdCk7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY29ycnVwdCByb290IGlub2RlLCBydW4gZTJmc2NrXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiY29ycnVwdCByb290IGlub2RlLCBydW4gZTJmc2NrIik7CiAJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9CiAJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZ2V0IHJvb3QgZGVudHJ5IGZhaWxlZCIpOwogCQlpcHV0KHJvb3QpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZF9tb3VudDQ7CkBAIC0yNzY5LDIyICsyODM3LDI5IEBACiAJCQkJCQkJc2JpLT5zX2lub2RlX3NpemUpIHsKIAkJc2JpLT5zX3dhbnRfZXh0cmFfaXNpemUgPSBzaXplb2Yoc3RydWN0IGV4dDRfaW5vZGUpIC0KIAkJCQkJCSAgICAgICBFWFQ0X0dPT0RfT0xEX0lOT0RFX1NJWkU7Ci0JCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IHJlcXVpcmVkIGV4dHJhIGlub2RlIHNwYWNlIG5vdCIKLQkJCSJhdmFpbGFibGUuXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fSU5GTywgInJlcXVpcmVkIGV4dHJhIGlub2RlIHNwYWNlIG5vdCIKKwkJCSAiYXZhaWxhYmxlIik7CiAJfQogCiAJaWYgKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQ0X01PVU5UX0pPVVJOQUxfREFUQSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBJZ25vcmluZyBkZWxhbGxvYyBvcHRpb24gLSAiCi0JCQkJInJlcXVlc3RlZCBkYXRhIGpvdXJuYWxpbmcgbW9kZVxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJJZ25vcmluZyBkZWxhbGxvYyBvcHRpb24gLSAiCisJCQkgInJlcXVlc3RlZCBkYXRhIGpvdXJuYWxpbmcgbW9kZSIpOwogCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgREVMQUxMT0MpOwogCX0gZWxzZSBpZiAodGVzdF9vcHQoc2IsIERFTEFMTE9DKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogZGVsYXllZCBhbGxvY2F0aW9uIGVuYWJsZWRcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAiZGVsYXllZCBhbGxvY2F0aW9uIGVuYWJsZWQiKTsKKworCWVyciA9IGV4dDRfc2V0dXBfc3lzdGVtX3pvbmUoc2IpOworCWlmIChlcnIpIHsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIGluaXRpYWxpemUgc3lzdGVtICIKKwkJCSAiem9uZSAoJWQpXG4iLCBlcnIpOworCQlnb3RvIGZhaWxlZF9tb3VudDQ7CisJfQogCiAJZXh0NF9leHRfaW5pdChzYik7CiAJZXJyID0gZXh0NF9tYl9pbml0KHNiLCBuZWVkc19yZWNvdmVyeSk7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGZhaWxlZCB0byBpbml0YWxpemUgbWJhbGxvYyAoJWQpXG4iLAotCQkgICAgICAgZXJyKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIGluaXRhbGl6ZSBtYmFsbG9jICglZCkiLAorCQkJIGVycik7CiAJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9CiAKQEAgLTI3OTgsMTkgKzI4NzMsMTEgQEAKIAkJZ290byBmYWlsZWRfbW91bnQ0OwogCX07CiAKLQkvKgotCSAqIGFrcG06IGNvcmUgcmVhZF9zdXBlcigpIGNhbGxzIGluIGhlcmUgd2l0aCB0aGUgc3VwZXJibG9jayBsb2NrZWQuCi0JICogVGhhdCBkZWFkbG9ja3MsIGJlY2F1c2Ugb3JwaGFuIGNsZWFudXAgbmVlZHMgdG8gbG9jayB0aGUgc3VwZXJibG9jawotCSAqIGluIG51bWVyb3VzIHBsYWNlcy4gIEhlcmUgd2UganVzdCBwb3AgdGhlIGxvY2sgLSBpdCdzIHJlbGF0aXZlbHkKLQkgKiBoYXJtbGVzcywgYmVjYXVzZSB3ZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCB3cml0ZV9zdXBlcigpIHJlcXVlc3RzLAotCSAqIGFuZCBhdmlybyBzYXlzIHRoYXQncyB0aGUgb25seSByZWFzb24gZm9yIGhhbmdpbmcgb250byB0aGUKLQkgKiBzdXBlcmJsb2NrIGxvY2suCi0JICovCiAJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9PUlBIQU5fRlM7CiAJZXh0NF9vcnBoYW5fY2xlYW51cChzYiwgZXMpOwogCUVYVDRfU0Ioc2IpLT5zX21vdW50X3N0YXRlICY9IH5FWFQ0X09SUEhBTl9GUzsKIAlpZiAobmVlZHNfcmVjb3ZlcnkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogcmVjb3ZlcnkgY29tcGxldGUuXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fSU5GTywgInJlY292ZXJ5IGNvbXBsZXRlIik7CiAJCWV4dDRfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOwogCX0KIAlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCkgewpAQCAtMjgyMywyNSArMjg5MCwzMCBAQAogCX0gZWxzZQogCQlkZXNjciA9ICJvdXQgam91cm5hbCI7CiAKLQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBtb3VudGVkIGZpbGVzeXN0ZW0gJXMgd2l0aCVzXG4iLAotCSAgICAgICBzYi0+c19pZCwgZGVzY3IpOworCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sICJtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCVzIiwgZGVzY3IpOwogCiAJbG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gMDsKIAogY2FudGZpbmRfZXh0NDoKIAlpZiAoIXNpbGVudCkKLQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IGZpbmQgZXh0NCBmaWxlc3lzdGVtIG9uIGRldiAlcy5cbiIsCi0JCSAgICAgICBzYi0+c19pZCk7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIlZGUzogQ2FuJ3QgZmluZCBleHQ0IGZpbGVzeXN0ZW0iKTsKIAlnb3RvIGZhaWxlZF9tb3VudDsKIAogZmFpbGVkX21vdW50NDoKLQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnMgKGRldmljZSAlcyk6IG1vdW50IGZhaWxlZFxuIiwgc2ItPnNfaWQpOworCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIm1vdW50IGZhaWxlZCIpOworCWV4dDRfcmVsZWFzZV9zeXN0ZW1fem9uZShzYik7CiAJaWYgKHNiaS0+c19qb3VybmFsKSB7CiAJCWpiZDJfam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKIAkJc2JpLT5zX2pvdXJuYWwgPSBOVUxMOwogCX0KIGZhaWxlZF9tb3VudDM6CisJaWYgKHNiaS0+c19mbGV4X2dyb3VwcykgeworCQlpZiAoaXNfdm1hbGxvY19hZGRyKHNiaS0+c19mbGV4X2dyb3VwcykpCisJCQl2ZnJlZShzYmktPnNfZmxleF9ncm91cHMpOworCQllbHNlCisJCQlrZnJlZShzYmktPnNfZmxleF9ncm91cHMpOworCX0KIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKQEAgLTI4NjIsNiArMjkzNCw3IEBACiAJYnJlbHNlKGJoKTsKIG91dF9mYWlsOgogCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaS0+c19ibG9ja2dyb3VwX2xvY2spOwogCWtmcmVlKHNiaSk7CiAJbG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjkwNiwyNyArMjk3OSwyNyBAQAogCiAJam91cm5hbF9pbm9kZSA9IGV4dDRfaWdldChzYiwgam91cm5hbF9pbnVtKTsKIAlpZiAoSVNfRVJSKGpvdXJuYWxfaW5vZGUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogbm8gam91cm5hbCBmb3VuZC5cbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJubyBqb3VybmFsIGZvdW5kIik7CiAJCXJldHVybiBOVUxMOwogCX0KIAlpZiAoIWpvdXJuYWxfaW5vZGUtPmlfbmxpbmspIHsKIAkJbWFrZV9iYWRfaW5vZGUoam91cm5hbF9pbm9kZSk7CiAJCWlwdXQoam91cm5hbF9pbm9kZSk7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogam91cm5hbCBpbm9kZSBpcyBkZWxldGVkLlxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImpvdXJuYWwgaW5vZGUgaXMgZGVsZXRlZCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlqYmRfZGVidWcoMiwgIkpvdXJuYWwgaW5vZGUgZm91bmQgYXQgJXA6ICVsbGQgYnl0ZXNcbiIsCiAJCSAgam91cm5hbF9pbm9kZSwgam91cm5hbF9pbm9kZS0+aV9zaXplKTsKIAlpZiAoIVNfSVNSRUcoam91cm5hbF9pbm9kZS0+aV9tb2RlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGludmFsaWQgam91cm5hbCBpbm9kZS5cbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJpbnZhbGlkIGpvdXJuYWwgaW5vZGUiKTsKIAkJaXB1dChqb3VybmFsX2lub2RlKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJam91cm5hbCA9IGpiZDJfam91cm5hbF9pbml0X2lub2RlKGpvdXJuYWxfaW5vZGUpOwogCWlmICgham91cm5hbCkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IENvdWxkIG5vdCBsb2FkIGpvdXJuYWwgaW5vZGVcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJDb3VsZCBub3QgbG9hZCBqb3VybmFsIGlub2RlIik7CiAJCWlwdXQoam91cm5hbF9pbm9kZSk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTI5NTAsMjIgKzMwMjMsMjIgQEAKIAogCUJVR19PTighRVhUNF9IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpKTsKIAotCWJkZXYgPSBleHQ0X2Jsa2Rldl9nZXQoal9kZXYpOworCWJkZXYgPSBleHQ0X2Jsa2Rldl9nZXQoal9kZXYsIHNiKTsKIAlpZiAoYmRldiA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChiZF9jbGFpbShiZGV2LCBzYikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiRVhUNC1mczogZmFpbGVkIHRvIGNsYWltIGV4dGVybmFsIGpvdXJuYWwgZGV2aWNlLlxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJmYWlsZWQgdG8gY2xhaW0gZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UiKTsKIAkJYmxrZGV2X3B1dChiZGV2LCBGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCiAJYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCWhibG9jayA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KTsKKwloYmxvY2sgPSBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KTsKIAlpZiAoYmxvY2tzaXplIDwgaGJsb2NrKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkJIkVYVDQtZnM6IGJsb2Nrc2l6ZSB0b28gc21hbGwgZm9yIGpvdXJuYWwgZGV2aWNlLlxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCSJibG9ja3NpemUgdG9vIHNtYWxsIGZvciBqb3VybmFsIGRldmljZSIpOwogCQlnb3RvIG91dF9iZGV2OwogCX0KIApAQCAtMjk3Myw4ICszMDQ2LDggQEAKIAlvZmZzZXQgPSBFWFQ0X01JTl9CTE9DS19TSVpFICUgYmxvY2tzaXplOwogCXNldF9ibG9ja3NpemUoYmRldiwgYmxvY2tzaXplKTsKIAlpZiAoIShiaCA9IF9fYnJlYWQoYmRldiwgc2JfYmxvY2ssIGJsb2Nrc2l6ZSkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY291bGRuJ3QgcmVhZCBzdXBlcmJsb2NrIG9mICIKLQkJICAgICAgICJleHRlcm5hbCBqb3VybmFsXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiY291bGRuJ3QgcmVhZCBzdXBlcmJsb2NrIG9mICIKKwkJICAgICAgICJleHRlcm5hbCBqb3VybmFsIik7CiAJCWdvdG8gb3V0X2JkZXY7CiAJfQogCkBAIC0yOTgyLDE0ICszMDU1LDE0IEBACiAJaWYgKChsZTE2X3RvX2NwdShlcy0+c19tYWdpYykgIT0gRVhUNF9TVVBFUl9NQUdJQykgfHwKIAkgICAgIShsZTMyX3RvX2NwdShlcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCiAJICAgICAgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGV4dGVybmFsIGpvdXJuYWwgaGFzICIKLQkJCQkJImJhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZXh0ZXJuYWwgam91cm5hbCBoYXMgIgorCQkJCQkiYmFkIHN1cGVyYmxvY2siKTsKIAkJYnJlbHNlKGJoKTsKIAkJZ290byBvdXRfYmRldjsKIAl9CiAKIAlpZiAobWVtY21wKEVYVDRfU0Ioc2IpLT5zX2VzLT5zX2pvdXJuYWxfdXVpZCwgZXMtPnNfdXVpZCwgMTYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogam91cm5hbCBVVUlEIGRvZXMgbm90IG1hdGNoXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiam91cm5hbCBVVUlEIGRvZXMgbm90IG1hdGNoIik7CiAJCWJyZWxzZShiaCk7CiAJCWdvdG8gb3V0X2JkZXY7CiAJfQpAQCAtMzAwMSwyNSArMzA3NCwyNiBAQAogCWpvdXJuYWwgPSBqYmQyX2pvdXJuYWxfaW5pdF9kZXYoYmRldiwgc2ItPnNfYmRldiwKIAkJCQkJc3RhcnQsIGxlbiwgYmxvY2tzaXplKTsKIAlpZiAoIWpvdXJuYWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBqb3VybmFsXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugam91cm5hbCIpOwogCQlnb3RvIG91dF9iZGV2OwogCX0KIAlqb3VybmFsLT5qX3ByaXZhdGUgPSBzYjsKIAlsbF9yd19ibG9jayhSRUFELCAxLCAmam91cm5hbC0+al9zYl9idWZmZXIpOwogCXdhaXRfb25fYnVmZmVyKGpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKIAlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX3NiX2J1ZmZlcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBJL08gZXJyb3Igb24gam91cm5hbCBkZXZpY2VcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJJL08gZXJyb3Igb24gam91cm5hbCBkZXZpY2UiKTsKIAkJZ290byBvdXRfam91cm5hbDsKIAl9CiAJaWYgKGJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19ucl91c2VycykgIT0gMSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IEV4dGVybmFsIGpvdXJuYWwgaGFzIG1vcmUgdGhhbiBvbmUgIgotCQkJCQkidXNlciAodW5zdXBwb3J0ZWQpIC0gJWRcbiIsCisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIkV4dGVybmFsIGpvdXJuYWwgaGFzIG1vcmUgdGhhbiBvbmUgIgorCQkJCQkidXNlciAodW5zdXBwb3J0ZWQpIC0gJWQiLAogCQkJYmUzMl90b19jcHUoam91cm5hbC0+al9zdXBlcmJsb2NrLT5zX25yX3VzZXJzKSk7CiAJCWdvdG8gb3V0X2pvdXJuYWw7CiAJfQogCUVYVDRfU0Ioc2IpLT5qb3VybmFsX2JkZXYgPSBiZGV2OwogCWV4dDRfaW5pdF9qb3VybmFsX3BhcmFtcyhzYiwgam91cm5hbCk7CiAJcmV0dXJuIGpvdXJuYWw7CisKIG91dF9qb3VybmFsOgogCWpiZDJfam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOwogb3V0X2JkZXY6CkBAIC0zMDQxLDggKzMxMTUsOCBAQAogCiAJaWYgKGpvdXJuYWxfZGV2bnVtICYmCiAJICAgIGpvdXJuYWxfZGV2bnVtICE9IGxlMzJfdG9fY3B1KGVzLT5zX2pvdXJuYWxfZGV2KSkgewotCQlwcmludGsoS0VSTl9JTkZPICJFWFQ0LWZzOiBleHRlcm5hbCBqb3VybmFsIGRldmljZSBtYWpvci9taW5vciAiCi0JCQkibnVtYmVycyBoYXZlIGNoYW5nZWRcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAiZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UgbWFqb3IvbWlub3IgIgorCQkJIm51bWJlcnMgaGF2ZSBjaGFuZ2VkIik7CiAJCWpvdXJuYWxfZGV2ID0gbmV3X2RlY29kZV9kZXYoam91cm5hbF9kZXZudW0pOwogCX0gZWxzZQogCQlqb3VybmFsX2RldiA9IG5ld19kZWNvZGVfZGV2KGxlMzJfdG9fY3B1KGVzLT5zX2pvdXJuYWxfZGV2KSk7CkBAIC0zMDU0LDI0ICszMTI4LDIzIEBACiAJICogY3Jhc2g/ICBGb3IgcmVjb3ZlcnksIHdlIG5lZWQgdG8gY2hlY2sgaW4gYWR2YW5jZSB3aGV0aGVyIHdlCiAJICogY2FuIGdldCByZWFkLXdyaXRlIGFjY2VzcyB0byB0aGUgZGV2aWNlLgogCSAqLwotCiAJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSkgewogCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IElORk86IHJlY292ZXJ5ICIKLQkJCQkJInJlcXVpcmVkIG9uIHJlYWRvbmx5IGZpbGVzeXN0ZW0uXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sICJJTkZPOiByZWNvdmVyeSAiCisJCQkJCSJyZXF1aXJlZCBvbiByZWFkb25seSBmaWxlc3lzdGVtIik7CiAJCQlpZiAocmVhbGx5X3JlYWRfb25seSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogd3JpdGUgYWNjZXNzICIKLQkJCQkJInVuYXZhaWxhYmxlLCBjYW5ub3QgcHJvY2VlZC5cbiIpOworCQkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgIndyaXRlIGFjY2VzcyAiCisJCQkJCSJ1bmF2YWlsYWJsZSwgY2Fubm90IHByb2NlZWQiKTsKIAkJCQlyZXR1cm4gLUVST0ZTOwogCQkJfQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogd3JpdGUgYWNjZXNzIHdpbGwgIgotCQkJICAgICAgICJiZSBlbmFibGVkIGR1cmluZyByZWNvdmVyeS5cbiIpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fSU5GTywgIndyaXRlIGFjY2VzcyB3aWxsICIKKwkJCSAgICAgICAiYmUgZW5hYmxlZCBkdXJpbmcgcmVjb3ZlcnkiKTsKIAkJfQogCX0KIAogCWlmIChqb3VybmFsX2ludW0gJiYgam91cm5hbF9kZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBmaWxlc3lzdGVtIGhhcyBib3RoIGpvdXJuYWwgIgotCQkgICAgICAgImFuZCBpbm9kZSBqb3VybmFscyFcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJmaWxlc3lzdGVtIGhhcyBib3RoIGpvdXJuYWwgIgorCQkgICAgICAgImFuZCBpbm9kZSBqb3VybmFscyEiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMDg0LDE0ICszMTU3LDE0IEBACiAJfQogCiAJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKQkQyX0JBUlJJRVIpCi0JCXByaW50ayhLRVJOX0lORk8gIkVYVDQtZnM6IGJhcnJpZXJzIGVuYWJsZWRcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAiYmFycmllcnMgZW5hYmxlZCIpOwogCWVsc2UKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUNC1mczogYmFycmllcnMgZGlzYWJsZWRcbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLCAiYmFycmllcnMgZGlzYWJsZWQiKTsKIAogCWlmICghcmVhbGx5X3JlYWRfb25seSAmJiB0ZXN0X29wdChzYiwgVVBEQVRFX0pPVVJOQUwpKSB7CiAJCWVyciA9IGpiZDJfam91cm5hbF91cGRhdGVfZm9ybWF0KGpvdXJuYWwpOwogCQlpZiAoZXJyKSAgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBlcnJvciB1cGRhdGluZyBqb3VybmFsLlxuIik7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJlcnJvciB1cGRhdGluZyBqb3VybmFsIik7CiAJCQlqYmQyX2pvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KQEAgLTMxMDMsNyArMzE3Niw3IEBACiAJCWVyciA9IGpiZDJfam91cm5hbF9sb2FkKGpvdXJuYWwpOwogCiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGVycm9yIGxvYWRpbmcgam91cm5hbC5cbiIpOworCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJlcnJvciBsb2FkaW5nIGpvdXJuYWwiKTsKIAkJamJkMl9qb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMzExNCwxOCArMzE4NywxNyBAQAogCWlmIChqb3VybmFsX2Rldm51bSAmJgogCSAgICBqb3VybmFsX2Rldm51bSAhPSBsZTMyX3RvX2NwdShlcy0+c19qb3VybmFsX2RldikpIHsKIAkJZXMtPnNfam91cm5hbF9kZXYgPSBjcHVfdG9fbGUzMihqb3VybmFsX2Rldm51bSk7Ci0JCXNiLT5zX2RpcnQgPSAxOwogCiAJCS8qIE1ha2Ugc3VyZSB3ZSBmbHVzaCB0aGUgcmVjb3ZlcnkgZmxhZyB0byBkaXNrLiAqLwotCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgMSk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9jb21taXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQkJCSAgICAgIHN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcywgaW50IHN5bmMpCitzdGF0aWMgaW50IGV4dDRfY29tbWl0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzeW5jKQogeworCXN0cnVjdCBleHQ0X3N1cGVyX2Jsb2NrICplcyA9IEVYVDRfU0Ioc2IpLT5zX2VzOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gRVhUNF9TQihzYiktPnNfc2JoOwogCWludCBlcnJvciA9IDA7CiAKQEAgLTMxNDAsOCArMzIxMiw4IEBACiAJCSAqIGJlIHJlbWFwcGVkLiAgTm90aGluZyB3ZSBjYW4gZG8gYnV0IHRvIHJldHJ5IHRoZQogCQkgKiB3cml0ZSBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCiAJCSAqLwotCQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IHByZXZpb3VzIEkvTyBlcnJvciB0byAiCi0JCSAgICAgICAic3VwZXJibG9jayBkZXRlY3RlZCBmb3IgJXMuXG4iLCBzYi0+c19pZCk7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgInByZXZpb3VzIEkvTyBlcnJvciB0byAiCisJCSAgICAgICAic3VwZXJibG9jayBkZXRlY3RlZCIpOwogCQljbGVhcl9idWZmZXJfd3JpdGVfaW9fZXJyb3Ioc2JoKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShzYmgpOwogCX0KQEAgLTMxNTQsNyArMzIyNiw3IEBACiAJCQkJCSZFWFQ0X1NCKHNiKS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpKTsKIAllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKHBlcmNwdV9jb3VudGVyX3N1bV9wb3NpdGl2ZSgKIAkJCQkJJkVYVDRfU0Ioc2IpLT5zX2ZyZWVpbm9kZXNfY291bnRlcikpOwotCisJc2ItPnNfZGlydCA9IDA7CiAJQlVGRkVSX1RSQUNFKHNiaCwgIm1hcmtpbmcgZGlydHkiKTsKIAltYXJrX2J1ZmZlcl9kaXJ0eShzYmgpOwogCWlmIChzeW5jKSB7CkBAIC0zMTY0LDggKzMyMzYsOCBAQAogCiAJCWVycm9yID0gYnVmZmVyX3dyaXRlX2lvX2Vycm9yKHNiaCk7CiAJCWlmIChlcnJvcikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBJL08gZXJyb3Igd2hpbGUgd3JpdGluZyAiCi0JCQkgICAgICAgInN1cGVyYmxvY2sgZm9yICVzLlxuIiwgc2ItPnNfaWQpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgIgorCQkJICAgICAgICJzdXBlcmJsb2NrIik7CiAJCQljbGVhcl9idWZmZXJfd3JpdGVfaW9fZXJyb3Ioc2JoKTsKIAkJCXNldF9idWZmZXJfdXB0b2RhdGUoc2JoKTsKIAkJfQpAQCAtMzE3Myw3ICszMjQ1LDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLQogLyoKICAqIEhhdmUgd2UganVzdCBmaW5pc2hlZCByZWNvdmVyeT8gIElmIHNvLCBhbmQgaWYgd2UgYXJlIG1vdW50aW5nIChvcgogICogcmVtb3VudGluZykgdGhlIGZpbGVzeXN0ZW0gcmVhZG9ubHksIHRoZW4gd2Ugd2lsbCBlbmQgdXAgd2l0aCBhCkBAIC0zMTkyLDE0ICszMjYzLDExIEBACiAJaWYgKGpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsKSA8IDApCiAJCWdvdG8gb3V0OwogCi0JbG9ja19zdXBlcihzYik7CiAJaWYgKEVYVDRfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSAmJgogCSAgICBzYi0+c19mbGFncyAmIE1TX1JET05MWSkgewogCQlFWFQ0X0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKLQkJc2ItPnNfZGlydCA9IDA7Ci0JCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIAl9Ci0JdW5sb2NrX3N1cGVyKHNiKTsKIAogb3V0OgogCWpiZDJfam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKQEAgLTMyMzgsNyArMzMwNiw3IEBACiAKIAkJRVhUNF9TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUNF9FUlJPUl9GUzsKIAkJZXMtPnNfc3RhdGUgfD0gY3B1X3RvX2xlMTYoRVhUNF9FUlJPUl9GUyk7Ci0JCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIAogCQlqYmQyX2pvdXJuYWxfY2xlYXJfZXJyKGpvdXJuYWwpOwogCX0KQEAgLTMyNTcsMjkgKzMzMjUsMTUgQEAKIAkJcmV0dXJuIDA7CiAKIAlqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKLQlpZiAoam91cm5hbCkgewotCQlzYi0+c19kaXJ0ID0gMDsKKwlpZiAoam91cm5hbCkKIAkJcmV0ID0gZXh0NF9qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKLQl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogRXh0NCBhbHdheXMgam91cm5hbHMgdXBkYXRlcyB0byB0aGUgc3VwZXJibG9jayBpdHNlbGYsIHNvIHdlIGRvbid0Ci0gKiBoYXZlIHRvIHByb3BhZ2F0ZSBhbnkgb3RoZXIgdXBkYXRlcyB0byB0aGUgc3VwZXJibG9jayBvbiBkaXNrIGF0IHRoaXMKLSAqIHBvaW50LiAgKFdlIGNhbiBwcm9iYWJseSBudWtlIHRoaXMgZnVuY3Rpb24gYWx0b2dldGhlciwgYW5kIHJlbW92ZQotICogYW55IG1lbnRpb24gdG8gc2ItPnNfZGlydCBpbiBhbGwgb2YgZnMvZXh0NDsgZXZlbnR1YWwgY2xlYW51cC4uLikKLSAqLwogc3RhdGljIHZvaWQgZXh0NF93cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKSB7Ci0JCWlmIChtdXRleF90cnlsb2NrKCZzYi0+c19sb2NrKSAhPSAwKQotCQkJQlVHKCk7Ci0JCXNiLT5zX2RpcnQgPSAwOwotCX0gZWxzZSB7Ci0JCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBFWFQ0X1NCKHNiKS0+c19lcywgMSk7Ci0JfQorCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIH0KIAogc3RhdGljIGludCBleHQ0X3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCkBAIC0zMjg4LDE2ICszMzQyLDkgQEAKIAl0aWRfdCB0YXJnZXQ7CiAKIAl0cmFjZV9tYXJrKGV4dDRfc3luY19mcywgImRldiAlcyB3YWl0ICVkIiwgc2ItPnNfaWQsIHdhaXQpOwotCXNiLT5zX2RpcnQgPSAwOwotCWlmIChFWFQ0X1NCKHNiKS0+c19qb3VybmFsKSB7Ci0JCWlmIChqYmQyX2pvdXJuYWxfc3RhcnRfY29tbWl0KEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwsCi0JCQkJCSAgICAgICZ0YXJnZXQpKSB7Ci0JCQlpZiAod2FpdCkKLQkJCQlqYmQyX2xvZ193YWl0X2NvbW1pdChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLAotCQkJCQkJICAgICB0YXJnZXQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJZXh0NF9jb21taXRfc3VwZXIoc2IsIEVYVDRfU0Ioc2IpLT5zX2VzLCB3YWl0KTsKKwlpZiAoamJkMl9qb3VybmFsX3N0YXJ0X2NvbW1pdChFWFQ0X1NCKHNiKS0+c19qb3VybmFsLCAmdGFyZ2V0KSkgeworCQlpZiAod2FpdCkKKwkJCWpiZDJfbG9nX3dhaXRfY29tbWl0KEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWwsIHRhcmdldCk7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC0zMzEwLDM0ICszMzU3LDMyIEBACiB7CiAJaW50IGVycm9yID0gMDsKIAlqb3VybmFsX3QgKmpvdXJuYWw7Ci0Jc2ItPnNfZGlydCA9IDA7CiAKLQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKLQkJam91cm5hbCA9IEVYVDRfU0Ioc2IpLT5zX2pvdXJuYWw7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gMDsKIAotCQlpZiAoam91cm5hbCkgewotCQkJLyogTm93IHdlIHNldCB1cCB0aGUgam91cm5hbCBiYXJyaWVyLiAqLwotCQkJamJkMl9qb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwlqb3VybmFsID0gRVhUNF9TQihzYiktPnNfam91cm5hbDsKIAotCQkJLyoKLQkJCSAqIFdlIGRvbid0IHdhbnQgdG8gY2xlYXIgbmVlZHNfcmVjb3ZlcnkgZmxhZyB3aGVuIHdlCi0JCQkgKiBmYWlsZWQgdG8gZmx1c2ggdGhlIGpvdXJuYWwuCi0JCQkgKi8KLQkJCWVycm9yID0gamJkMl9qb3VybmFsX2ZsdXNoKGpvdXJuYWwpOwotCQkJaWYgKGVycm9yIDwgMCkKLQkJCQlnb3RvIG91dDsKLQkJfQorCS8qIE5vdyB3ZSBzZXQgdXAgdGhlIGpvdXJuYWwgYmFycmllci4gKi8KKwlqYmQyX2pvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWwpOwogCi0JCS8qIEpvdXJuYWwgYmxvY2tlZCBhbmQgZmx1c2hlZCwgY2xlYXIgbmVlZHNfcmVjb3ZlcnkgZmxhZy4gKi8KLQkJRVhUNF9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7Ci0JCWVycm9yID0gZXh0NF9jb21taXRfc3VwZXIoc2IsIEVYVDRfU0Ioc2IpLT5zX2VzLCAxKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBvdXQ7CisJLyoKKwkgKiBEb24ndCBjbGVhciB0aGUgbmVlZHNfcmVjb3ZlcnkgZmxhZyBpZiB3ZSBmYWlsZWQgdG8gZmx1c2gKKwkgKiB0aGUgam91cm5hbC4KKwkgKi8KKwllcnJvciA9IGpiZDJfam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJb3V0OgorCQlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisJCXJldHVybiBlcnJvcjsKIAl9CisKKwkvKiBKb3VybmFsIGJsb2NrZWQgYW5kIGZsdXNoZWQsIGNsZWFyIG5lZWRzX3JlY292ZXJ5IGZsYWcuICovCisJRVhUNF9DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CisJZXJyb3IgPSBleHQ0X2NvbW1pdF9zdXBlcihzYiwgMSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKIAlyZXR1cm4gMDsKLW91dDoKLQlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoam91cm5hbCk7Ci0JcmV0dXJuIGVycm9yOwogfQogCiAvKgpAQCAtMzM0NiwxNCArMzM5MSwxNSBAQAogICovCiBzdGF0aWMgaW50IGV4dDRfdW5mcmVlemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCAmJiAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewotCQlsb2NrX3N1cGVyKHNiKTsKLQkJLyogUmVzZXIgdGhlIG5lZWRzX3JlY292ZXJ5IGZsYWcgYmVmb3JlIHRoZSBmcyBpcyB1bmxvY2tlZC4gKi8KLQkJRVhUNF9TRVRfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOwotCQlleHQ0X2NvbW1pdF9zdXBlcihzYiwgRVhUNF9TQihzYiktPnNfZXMsIDEpOwotCQl1bmxvY2tfc3VwZXIoc2IpOwotCQlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoRVhUNF9TQihzYiktPnNfam91cm5hbCk7Ci0JfQorCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuIDA7CisKKwlsb2NrX3N1cGVyKHNiKTsKKwkvKiBSZXNldCB0aGUgbmVlZHNfcmVjb3ZlcnkgZmxhZyBiZWZvcmUgdGhlIGZzIGlzIHVubG9ja2VkLiAqLworCUVYVDRfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDRfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKwlleHQ0X2NvbW1pdF9zdXBlcihzYiwgMSk7CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlqYmQyX2pvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoRVhUNF9TQihzYiktPnNfam91cm5hbCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0MzIsMjIgKzM0NzgsMTUgQEAKIAkJCSAgICAoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUNF9WQUxJRF9GUykpCiAJCQkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOwogCi0JCQkvKgotCQkJICogV2UgaGF2ZSB0byB1bmxvY2sgc3VwZXIgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IKLQkJCSAqIHRyYW5zYWN0aW9ucy4KLQkJCSAqLwotCQkJaWYgKHNiaS0+c19qb3VybmFsKSB7Ci0JCQkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJCWlmIChzYmktPnNfam91cm5hbCkKIAkJCQlleHQ0X21hcmtfcmVjb3ZlcnlfY29tcGxldGUoc2IsIGVzKTsKLQkJCQlsb2NrX3N1cGVyKHNiKTsKLQkJCX0KIAkJfSBlbHNlIHsKIAkJCWludCByZXQ7CiAJCQlpZiAoKHJldCA9IEVYVDRfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAogCQkJCQl+RVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKSkpIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiAlczogY291bGRuJ3QgIgorCQkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJjb3VsZG4ndCAiCiAJCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCAiCi0JCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwgc2ItPnNfaWQsCisJCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpIiwKIAkJCQkobGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZlYXR1cmVfcm9fY29tcGF0KSAmCiAJCQkJCX5FWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKTsKIAkJCQllcnIgPSAtRVJPRlM7CkBAIC0zNDU2LDE3ICszNDk1LDE1IEBACiAKIAkJCS8qCiAJCQkgKiBNYWtlIHN1cmUgdGhlIGdyb3VwIGRlc2NyaXB0b3IgY2hlY2tzdW1zCi0JCQkgKiBhcmUgc2FuZS4gIElmIHRoZXkgYXJlbid0LCByZWZ1c2UgdG8KLQkJCSAqIHJlbW91bnQgci93LgorCQkJICogYXJlIHNhbmUuICBJZiB0aGV5IGFyZW4ndCwgcmVmdXNlIHRvIHJlbW91bnQgci93LgogCQkJICovCiAJCQlmb3IgKGcgPSAwOyBnIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgZysrKSB7CiAJCQkJc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqZ2RwID0KIAkJCQkJZXh0NF9nZXRfZ3JvdXBfZGVzYyhzYiwgZywgTlVMTCk7CiAKIAkJCQlpZiAoIWV4dDRfZ3JvdXBfZGVzY19jc3VtX3ZlcmlmeShzYmksIGcsIGdkcCkpIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSCi0JICAgICAgICJFWFQ0LWZzOiBleHQ0X3JlbW91bnQ6ICIKLQkJIkNoZWNrc3VtIGZvciBncm91cCAldSBmYWlsZWQgKCV1IT0ldSlcbiIsCisJCQkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkgICAgICAgImV4dDRfcmVtb3VudDogQ2hlY2tzdW0gZm9yIGdyb3VwICV1IGZhaWxlZCAoJXUhPSV1KSIsCiAJCWcsIGxlMTZfdG9fY3B1KGV4dDRfZ3JvdXBfZGVzY19jc3VtKHNiaSwgZywgZ2RwKSksCiAJCQkJCSAgICAgICBsZTE2X3RvX2NwdShnZHAtPmJnX2NoZWNrc3VtKSk7CiAJCQkJCWVyciA9IC1FSU5WQUw7CkBAIC0zNDgwLDExICszNTE3LDEwIEBACiAJCQkgKiByZXF1aXJlIGEgZnVsbCB1bW91bnQvcmVtb3VudCBmb3Igbm93LgogCQkJICovCiAJCQlpZiAoZXMtPnNfbGFzdF9vcnBoYW4pIHsKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiAlczogY291bGRuJ3QgIgorCQkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJDb3VsZG4ndCAiCiAJCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnByb2Nlc3NlZCAiCiAJCQkJICAgICAgICJvcnBoYW4gaW5vZGUgbGlzdC4gIFBsZWFzZSAiCi0JCQkJICAgICAgICJ1bW91bnQvcmVtb3VudCBpbnN0ZWFkLlxuIiwKLQkJCQkgICAgICAgc2ItPnNfaWQpOworCQkJCSAgICAgICAidW1vdW50L3JlbW91bnQgaW5zdGVhZCIpOwogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJZ290byByZXN0b3JlX29wdHM7CiAJCQl9CkBAIC0zNTA0LDggKzM1NDAsOSBAQAogCQkJCXNiLT5zX2ZsYWdzICY9IH5NU19SRE9OTFk7CiAJCX0KIAl9CisJZXh0NF9zZXR1cF9zeXN0ZW1fem9uZShzYik7CiAJaWYgKHNiaS0+c19qb3VybmFsID09IE5VTEwpCi0JCWV4dDRfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisJCWV4dDRfY29tbWl0X3N1cGVyKHNiLCAxKTsKIAogI2lmZGVmIENPTkZJR19RVU9UQQogCS8qIFJlbGVhc2Ugb2xkIHF1b3RhIGZpbGUgbmFtZXMgKi8KQEAgLTM1MTUsNiArMzU1Miw3IEBACiAJCQlrZnJlZShvbGRfb3B0cy5zX3FmX25hbWVzW2ldKTsKICNlbmRpZgogCXJldHVybiAwOworCiByZXN0b3JlX29wdHM6CiAJc2ItPnNfZmxhZ3MgPSBvbGRfc2JfZmxhZ3M7CiAJc2JpLT5zX21vdW50X29wdCA9IG9sZF9vcHRzLnNfbW91bnRfb3B0OwpAQCAtMzU0NSw5ICszNTgzLDggQEAKIAlpZiAodGVzdF9vcHQoc2IsIE1JTklYX0RGKSkgewogCQlzYmktPnNfb3ZlcmhlYWRfbGFzdCA9IDA7CiAJfSBlbHNlIGlmIChzYmktPnNfYmxvY2tzX2xhc3QgIT0gZXh0NF9ibG9ja3NfY291bnQoZXMpKSB7Ci0JCWV4dDRfZ3JvdXBfdCBuZ3JvdXBzID0gc2JpLT5zX2dyb3Vwc19jb3VudCwgaTsKKwkJZXh0NF9ncm91cF90IGksIG5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCQlleHQ0X2ZzYmxrX3Qgb3ZlcmhlYWQgPSAwOwotCQlzbXBfcm1iKCk7CiAKIAkJLyoKIAkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpLiAgVGhpcyBpcyBjb25zdGFudApAQCAtMzU5OSwxMSArMzYzNiwxMiBAQAogCSAgICAgICBsZTY0X3RvX2NwdXAoKHZvaWQgKillcy0+c191dWlkICsgc2l6ZW9mKHU2NCkpOwogCWJ1Zi0+Zl9mc2lkLnZhbFswXSA9IGZzaWQgJiAweEZGRkZGRkZGVUw7CiAJYnVmLT5mX2ZzaWQudmFsWzFdID0gKGZzaWQgPj4gMzIpICYgMHhGRkZGRkZGRlVMOworCiAJcmV0dXJuIDA7CiB9CiAKLS8qIEhlbHBlciBmdW5jdGlvbiBmb3Igd3JpdGluZyBxdW90YXMgb24gc3luYyAtIHdlIG5lZWQgdG8gc3RhcnQgdHJhbnNhY3Rpb24gYmVmb3JlIHF1b3RhIGZpbGUKLSAqIGlzIGxvY2tlZCBmb3Igd3JpdGUuIE90aGVyd2lzZSB0aGUgYXJlIHBvc3NpYmxlIGRlYWRsb2NrczoKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3Igd3JpdGluZyBxdW90YXMgb24gc3luYyAtIHdlIG5lZWQgdG8gc3RhcnQgdHJhbnNhY3Rpb24KKyAqIGJlZm9yZSBxdW90YSBmaWxlIGlzIGxvY2tlZCBmb3Igd3JpdGUuIE90aGVyd2lzZSB0aGUgYXJlIHBvc3NpYmxlIGRlYWRsb2NrczoKICAqIFByb2Nlc3MgMSAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzIDIKICAqIGV4dDRfY3JlYXRlKCkgICAgICAgICAgICAgICAgICAgICBxdW90YV9zeW5jKCkKICAqICAgamJkMl9qb3VybmFsX3N0YXJ0KCkgICAgICAgICAgICAgICAgICB3cml0ZV9kcXVvdCgpCkBAIC0zNjI3LDcgKzM2NjUsNyBAQAogCiAJaW5vZGUgPSBkcXVvdF90b19pbm9kZShkcXVvdCk7CiAJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLAotCQkJCQlFWFQ0X1FVT1RBX1RSQU5TX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKKwkJCQkgICAgRVhUNF9RVU9UQV9UUkFOU19CTE9DS1MoZHF1b3QtPmRxX3NiKSk7CiAJaWYgKElTX0VSUihoYW5kbGUpKQogCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOwogCXJldCA9IGRxdW90X2NvbW1pdChkcXVvdCk7CkBAIC0zNjQzLDcgKzM2ODEsNyBAQAogCWhhbmRsZV90ICpoYW5kbGU7CiAKIAloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoZHF1b3RfdG9faW5vZGUoZHF1b3QpLAotCQkJCQlFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGRxdW90LT5kcV9zYikpOworCQkJCSAgICBFWFQ0X1FVT1RBX0lOSVRfQkxPQ0tTKGRxdW90LT5kcV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIAlyZXQgPSBkcXVvdF9hY3F1aXJlKGRxdW90KTsKQEAgLTM2NTksNyArMzY5Nyw3IEBACiAJaGFuZGxlX3QgKmhhbmRsZTsKIAogCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChkcXVvdF90b19pbm9kZShkcXVvdCksCi0JCQkJCUVYVDRfUVVPVEFfREVMX0JMT0NLUyhkcXVvdC0+ZHFfc2IpKTsKKwkJCQkgICAgRVhUNF9RVU9UQV9ERUxfQkxPQ0tTKGRxdW90LT5kcV9zYikpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQkvKiBSZWxlYXNlIGRxdW90IGFueXdheSB0byBhdm9pZCBlbmRsZXNzIGN5Y2xlIGluIGRxcHV0KCkgKi8KIAkJZHF1b3RfcmVsZWFzZShkcXVvdCk7CkBAIC0zNzA3LDcgKzM3NDUsNyBAQAogc3RhdGljIGludCBleHQ0X3F1b3RhX29uX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQogewogCXJldHVybiB2ZnNfcXVvdGFfb25fbW91bnQoc2IsIEVYVDRfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdLAotCQkJRVhUNF9TQihzYiktPnNfanF1b3RhX2ZtdCwgdHlwZSk7CisJCQkJICBFWFQ0X1NCKHNiKS0+c19qcXVvdGFfZm10LCB0eXBlKTsKIH0KIAogLyoKQEAgLTM3MzgsOSArMzc3Niw5IEBACiAJaWYgKEVYVDRfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdKSB7CiAJCS8qIFF1b3RhZmlsZSBub3QgaW4gZnMgcm9vdD8gKi8KIAkJaWYgKHBhdGguZGVudHJ5LT5kX3BhcmVudCAhPSBzYi0+c19yb290KQotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJFWFQ0LWZzOiBRdW90YSBmaWxlIG5vdCBvbiBmaWxlc3lzdGVtIHJvb3QuICIKLQkJCQkiSm91cm5hbGVkIHF1b3RhIHdpbGwgbm90IHdvcmsuXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsCisJCQkJIlF1b3RhIGZpbGUgbm90IG9uIGZpbGVzeXN0ZW0gcm9vdC4gIgorCQkJCSJKb3VybmFsZWQgcXVvdGEgd2lsbCBub3Qgd29yayIpOwogCX0KIAogCS8qCkBAIC0zODIzLDggKzM4NjEsOCBAQAogCWhhbmRsZV90ICpoYW5kbGUgPSBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CiAKIAlpZiAoRVhUNF9TQihzYiktPnNfam91cm5hbCAmJiAhaGFuZGxlKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnM6IFF1b3RhIHdyaXRlIChvZmY9JWxsdSwgbGVuPSVsbHUpIgotCQkJIiBjYW5jZWxsZWQgYmVjYXVzZSB0cmFuc2FjdGlvbiBpcyBub3Qgc3RhcnRlZC5cbiIsCisJCWV4dDRfbXNnKHNiLCBLRVJOX1dBUk5JTkcsICJRdW90YSB3cml0ZSAob2ZmPSVsbHUsIGxlbj0lbGx1KSIKKwkJCSIgY2FuY2VsbGVkIGJlY2F1c2UgdHJhbnNhY3Rpb24gaXMgbm90IHN0YXJ0ZWQiLAogCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylvZmYsICh1bnNpZ25lZCBsb25nIGxvbmcpbGVuKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzg3OCwxMCArMzkxNiwxMCBAQAogCiAjZW5kaWYKIAotc3RhdGljIGludCBleHQ0X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3N0YXRpYyBpbnQgZXh0NF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywKKwkJICAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBleHQ0X2ZpbGxfc3VwZXIsIG1udCk7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0NF9maWxsX3N1cGVyLG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBleHQ0X2ZzX3R5cGUgPSB7CkBAIC0zODkzLDE0ICszOTMxLDE0IEBACiB9OwogCiAjaWZkZWYgQ09ORklHX0VYVDRERVZfQ09NUEFUCi1zdGF0aWMgaW50IGV4dDRkZXZfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQorc3RhdGljIGludCBleHQ0ZGV2X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQkJICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSxzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQ0LWZzOiBVcGRhdGUgeW91ciB1c2Vyc3BhY2UgcHJvZ3JhbXMgIgotCSAgICAgICAidG8gbW91bnQgdXNpbmcgZXh0NFxuIik7Ci0JcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mczogZXh0NGRldiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAiCi0JICAgICAgICJ3aWxsIGdvIGF3YXkgYnkgMi42LjMxXG4iKTsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBleHQ0X2ZpbGxfc3VwZXIsIG1udCk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUNC1mcyAoJXMpOiBVcGRhdGUgeW91ciB1c2Vyc3BhY2UgcHJvZ3JhbXMgIgorCSAgICAgICAidG8gbW91bnQgdXNpbmcgZXh0NFxuIiwgZGV2X25hbWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDQtZnMgKCVzKTogZXh0NGRldiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAiCisJICAgICAgICJ3aWxsIGdvIGF3YXkgYnkgMi42LjMxXG4iLCBkZXZfbmFtZSk7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0NF9maWxsX3N1cGVyLG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBleHQ0ZGV2X2ZzX3R5cGUgPSB7CkBAIC0zOTE3LDEzICszOTU1LDE2IEBACiB7CiAJaW50IGVycjsKIAorCWVyciA9IGluaXRfZXh0NF9zeXN0ZW1fem9uZSgpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAJZXh0NF9rc2V0ID0ga3NldF9jcmVhdGVfYW5kX2FkZCgiZXh0NCIsIE5VTEwsIGZzX2tvYmopOwogCWlmICghZXh0NF9rc2V0KQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBvdXQ0OwogCWV4dDRfcHJvY19yb290ID0gcHJvY19ta2RpcigiZnMvZXh0NCIsIE5VTEwpOwogCWVyciA9IGluaXRfZXh0NF9tYmFsbG9jKCk7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBvdXQzOwogCiAJZXJyID0gaW5pdF9leHQ0X3hhdHRyKCk7CiAJaWYgKGVycikKQEAgLTM5NDgsNiArMzk4OSwxMSBAQAogCWV4aXRfZXh0NF94YXR0cigpOwogb3V0MjoKIAlleGl0X2V4dDRfbWJhbGxvYygpOworb3V0MzoKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMvZXh0NCIsIE5VTEwpOworCWtzZXRfdW5yZWdpc3RlcihleHQ0X2tzZXQpOworb3V0NDoKKwlleGl0X2V4dDRfc3lzdGVtX3pvbmUoKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zOTYyLDYgKzQwMDgsNyBAQAogCWV4aXRfZXh0NF9tYmFsbG9jKCk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2V4dDQiLCBOVUxMKTsKIAlrc2V0X3VucmVnaXN0ZXIoZXh0NF9rc2V0KTsKKwlleGl0X2V4dDRfc3lzdGVtX3pvbmUoKTsKIH0KIAogTU9EVUxFX0FVVEhPUigiUmVteSBDYXJkLCBTdGVwaGVuIFR3ZWVkaWUsIEFuZHJldyBNb3J0b24sIEFuZHJlYXMgRGlsZ2VyLCBUaGVvZG9yZSBUcydvIGFuZCBvdGhlcnMiKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvS2NvbmZpZyBiL2ZzL2dmczIvS2NvbmZpZwppbmRleCAzYTk4MWI3Li5jYWQ5NTdjIDEwMDY0NAotLS0gYS9mcy9nZnMyL0tjb25maWcKKysrIGIvZnMvZ2ZzMi9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCXNlbGVjdCBJUF9TQ1RQIGlmIERMTV9TQ1RQCiAJc2VsZWN0IEZTX1BPU0lYX0FDTAogCXNlbGVjdCBDUkMzMgorCXNlbGVjdCBTTE9XX1dPUksKIAloZWxwCiAJICBBIGNsdXN0ZXIgZmlsZXN5c3RlbS4KIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9NYWtlZmlsZSBiL2ZzL2dmczIvTWFrZWZpbGUKaW5kZXggYTg1MWVhNC4uZDUzYTliZSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9NYWtlZmlsZQorKysgYi9mcy9nZnMyL01ha2VmaWxlCkBAIC0xLDggKzEsOCBAQAogb2JqLSQoQ09ORklHX0dGUzJfRlMpICs9IGdmczIubwogZ2ZzMi15IDo9IGFjbC5vIGJtYXAubyBkaXIubyBlYW9wcy5vIGVhdHRyLm8gZ2xvY2subyBcCiAJZ2xvcHMubyBpbm9kZS5vIGxvZy5vIGxvcHMubyBtYWluLm8gbWV0YV9pby5vIFwKLQltb3VudC5vIG9wc19hZGRyZXNzLm8gb3BzX2RlbnRyeS5vIG9wc19leHBvcnQubyBvcHNfZmlsZS5vIFwKLQlvcHNfZnN0eXBlLm8gb3BzX2lub2RlLm8gb3BzX3N1cGVyLm8gcXVvdGEubyBcCisJYW9wcy5vIGRlbnRyeS5vIGV4cG9ydC5vIGZpbGUubyBcCisJb3BzX2ZzdHlwZS5vIG9wc19pbm9kZS5vIHF1b3RhLm8gXAogCXJlY292ZXJ5Lm8gcmdycC5vIHN1cGVyLm8gc3lzLm8gdHJhbnMubyB1dGlsLm8KIAogZ2ZzMi0kKENPTkZJR19HRlMyX0ZTX0xPQ0tJTkdfRExNKSArPSBsb2NrX2RsbS5vCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19hZGRyZXNzLmMgYi9mcy9nZnMyL2FvcHMuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBmcy9nZnMyL29wc19hZGRyZXNzLmMKcmVuYW1lIHRvIGZzL2dmczIvYW9wcy5jCmluZGV4IGE2ZGRlMTcuLjAzZWJiNDMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2FkZHJlc3MuYworKysgYi9mcy9nZnMyL2FvcHMuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgImlub2RlLmgiCiAjaW5jbHVkZSAibG9nLmgiCiAjaW5jbHVkZSAibWV0YV9pby5oIgotI2luY2x1ZGUgIm9wc19hZGRyZXNzLmgiCiAjaW5jbHVkZSAicXVvdGEuaCIKICNpbmNsdWRlICJ0cmFucy5oIgogI2luY2x1ZGUgInJncnAuaCIKQEAgLTc4MSwxMCArNzgwLDEyIEBACiAJdW5sb2NrX3BhZ2UocGFnZSk7CiAJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCi0JaWYgKGlub2RlLT5pX3NpemUgPCB0bykgewotCQlpX3NpemVfd3JpdGUoaW5vZGUsIHRvKTsKLQkJaXAtPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOwotCQlkaS0+ZGlfc2l6ZSA9IGNwdV90b19iZTY0KGlub2RlLT5pX3NpemUpOworCWlmIChjb3BpZWQpIHsKKwkJaWYgKGlub2RlLT5pX3NpemUgPCB0bykgeworCQkJaV9zaXplX3dyaXRlKGlub2RlLCB0byk7CisJCQlpcC0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJCX0KKwkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaSk7CiAJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCX0KIApAQCAtODI0LDcgKzgyNSw2IEBACiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpYmg7CiAJc3RydWN0IGdmczJfYWxsb2MgKmFsID0gaXAtPmlfYWxsb2M7Ci0Jc3RydWN0IGdmczJfZGlub2RlICpkaTsKIAl1bnNpZ25lZCBpbnQgZnJvbSA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKIAl1bnNpZ25lZCBpbnQgdG8gPSBmcm9tICsgbGVuOwogCWludCByZXQ7CkBAIC04NDcsMTEgKzg0NywxMCBAQAogCQlnZnMyX3BhZ2VfYWRkX2RhdGFidWZzKGlwLCBwYWdlLCBmcm9tLCB0byk7CiAKIAlyZXQgPSBnZW5lcmljX3dyaXRlX2VuZChmaWxlLCBtYXBwaW5nLCBwb3MsIGxlbiwgY29waWVkLCBwYWdlLCBmc2RhdGEpOwotCi0JaWYgKGxpa2VseShyZXQgPj0gMCkgJiYgKGlub2RlLT5pX3NpemUgPiBpcC0+aV9kaXNrc2l6ZSkpIHsKLQkJZGkgPSAoc3RydWN0IGdmczJfZGlub2RlICopZGliaC0+Yl9kYXRhOwotCQlpcC0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7Ci0JCWRpLT5kaV9zaXplID0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSk7CisJaWYgKHJldCA+IDApIHsKKwkJaWYgKGlub2RlLT5pX3NpemUgPiBpcC0+aV9kaXNrc2l6ZSkKKwkJCWlwLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwkJZ2ZzMl9kaW5vZGVfb3V0KGlwLCBkaWJoLT5iX2RhdGEpOwogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYm1hcC5jIGIvZnMvZ2ZzMi9ibWFwLmMKaW5kZXggM2E1ZDNmOC4uMzI5NzYzNSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9ibWFwLmMKKysrIGIvZnMvZ2ZzMi9ibWFwLmMKQEAgLTI1LDcgKzI1LDYgQEAKICNpbmNsdWRlICJ0cmFucy5oIgogI2luY2x1ZGUgImRpci5oIgogI2luY2x1ZGUgInV0aWwuaCIKLSNpbmNsdWRlICJvcHNfYWRkcmVzcy5oIgogCiAvKiBUaGlzIGRvZXNuJ3QgbmVlZCB0byBiZSB0aGF0IGxhcmdlIGFzIG1heCA2NCBiaXQgcG9pbnRlcnMgaW4gYSA0awogICogYmxvY2sgaXMgNTEyLCBzbyBfX3UxNiBpcyBmaW5lIGZvciB0aGF0LiBJdCBzYXZlcyBzdGFjayBzcGFjZSB0bwpAQCAtMTM2LDcgKzEzNSw5IEBACiAJCSAgIGFuZCB3cml0ZSBpdCBvdXQgdG8gZGlzayAqLwogCiAJCXVuc2lnbmVkIGludCBuID0gMTsKLQkJYmxvY2sgPSBnZnMyX2FsbG9jX2Jsb2NrKGlwLCAmbik7CisJCWVycm9yID0gZ2ZzMl9hbGxvY19ibG9jayhpcCwgJmJsb2NrLCAmbik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X2JyZWxzZTsKIAkJaWYgKGlzZGlyKSB7CiAJCQlnZnMyX3RyYW5zX2FkZF91bnJldm9rZShHRlMyX1NCKCZpcC0+aV9pbm9kZSksIGJsb2NrLCAxKTsKIAkJCWVycm9yID0gZ2ZzMl9kaXJfZ2V0X25ld19idWZmZXIoaXAsIGJsb2NrLCAmYmgpOwpAQCAtNDc2LDggKzQ3NywxMSBAQAogCWJsa3MgPSBkYmxrcyArIGlibGtzOwogCWkgPSBzaGVpZ2h0OwogCWRvIHsKKwkJaW50IGVycm9yOwogCQluID0gYmxrcyAtIGFsbG9jZWQ7Ci0JCWJuID0gZ2ZzMl9hbGxvY19ibG9jayhpcCwgJm4pOworCQllcnJvciA9IGdmczJfYWxsb2NfYmxvY2soaXAsICZibiwgJm4pOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CiAJCWFsbG9jZWQgKz0gbjsKIAkJaWYgKHN0YXRlICE9IEFMTE9DX0RBVEEgfHwgZ2ZzMl9pc19qZGF0YShpcCkpCiAJCQlnZnMyX3RyYW5zX2FkZF91bnJldm9rZShzZHAsIGJuLCBuKTsKQEAgLTEwMDgsNyArMTAxMiw3IEBACiAJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMCk7CiAKIAl6ZXJvX3VzZXIocGFnZSwgb2Zmc2V0LCBsZW5ndGgpOwotCisJbWFya19idWZmZXJfZGlydHkoYmgpOwogdW5sb2NrOgogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2RlbnRyeS5jIGIvZnMvZ2ZzMi9kZW50cnkuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZnMvZ2ZzMi9vcHNfZGVudHJ5LmMKcmVuYW1lIHRvIGZzL2dmczIvZGVudHJ5LmMKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZGlyLmMgYi9mcy9nZnMyL2Rpci5jCmluZGV4IGFlZjRkMGMuLjI5N2Q3ZTUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZGlyLmMKKysrIGIvZnMvZ2ZzMi9kaXIuYwpAQCAtODAzLDEzICs4MDMsMjAgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOwogCXVuc2lnbmVkIGludCBuID0gMTsKLQl1NjQgYm4gPSBnZnMyX2FsbG9jX2Jsb2NrKGlwLCAmbik7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGdmczJfbWV0YV9uZXcoaXAtPmlfZ2wsIGJuKTsKKwl1NjQgYm47CisJaW50IGVycm9yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGdmczJfbGVhZiAqbGVhZjsKIAlzdHJ1Y3QgZ2ZzMl9kaXJlbnQgKmRlbnQ7CiAJc3RydWN0IHFzdHIgbmFtZSA9IHsgLm5hbWUgPSAiIiwgLmxlbiA9IDAsIC5oYXNoID0gMCB9OworCisJZXJyb3IgPSBnZnMyX2FsbG9jX2Jsb2NrKGlwLCAmYm4sICZuKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBOVUxMOworCWJoID0gZ2ZzMl9tZXRhX25ldyhpcC0+aV9nbCwgYm4pOwogCWlmICghYmgpCiAJCXJldHVybiBOVUxMOworCiAJZ2ZzMl90cmFuc19hZGRfdW5yZXZva2UoR0ZTMl9TQihpbm9kZSksIGJuLCAxKTsKIAlnZnMyX3RyYW5zX2FkZF9iaChpcC0+aV9nbCwgYmgsIDEpOwogCWdmczJfbWV0YXR5cGVfc2V0KGJoLCBHRlMyX01FVEFUWVBFX0xGLCBHRlMyX0ZPUk1BVF9MRik7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2VhdHRyLmMgYi9mcy9nZnMyL2VhdHRyLmMKaW5kZXggODk5NzYzYS4uMDdlYTk1MiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9lYXR0ci5jCisrKyBiL2ZzL2dmczIvZWF0dHIuYwpAQCAtNTgyLDggKzU4MiwxMSBAQAogCXN0cnVjdCBnZnMyX2VhX2hlYWRlciAqZWE7CiAJdW5zaWduZWQgaW50IG4gPSAxOwogCXU2NCBibG9jazsKKwlpbnQgZXJyb3I7CiAKLQlibG9jayA9IGdmczJfYWxsb2NfYmxvY2soaXAsICZuKTsKKwllcnJvciA9IGdmczJfYWxsb2NfYmxvY2soaXAsICZibG9jaywgJm4pOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOwogCWdmczJfdHJhbnNfYWRkX3VucmV2b2tlKHNkcCwgYmxvY2ssIDEpOwogCSpiaHAgPSBnZnMyX21ldGFfbmV3KGlwLT5pX2dsLCBibG9jayk7CiAJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsICpiaHAsIDEpOwpAQCAtNjE3LDYgKzYyMCw3IEBACiAJCSAgICBzdHJ1Y3QgZ2ZzMl9lYV9yZXF1ZXN0ICplcikKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKKwlpbnQgZXJyb3I7CiAKIAllYS0+ZWFfZGF0YV9sZW4gPSBjcHVfdG9fYmUzMihlci0+ZXJfZGF0YV9sZW4pOwogCWVhLT5lYV9uYW1lX2xlbiA9IGVyLT5lcl9uYW1lX2xlbjsKQEAgLTY0Miw3ICs2NDYsOSBAQAogCQkJaW50IG1oX3NpemUgPSBzaXplb2Yoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIpOwogCQkJdW5zaWduZWQgaW50IG4gPSAxOwogCi0JCQlibG9jayA9IGdmczJfYWxsb2NfYmxvY2soaXAsICZuKTsKKwkJCWVycm9yID0gZ2ZzMl9hbGxvY19ibG9jayhpcCwgJmJsb2NrLCAmbik7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOwogCQkJZ2ZzMl90cmFuc19hZGRfdW5yZXZva2Uoc2RwLCBibG9jaywgMSk7CiAJCQliaCA9IGdmczJfbWV0YV9uZXcoaXAtPmlfZ2wsIGJsb2NrKTsKIAkJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMSk7CkBAIC05NjMsNyArOTY5LDkgQEAKIAl9IGVsc2UgewogCQl1NjQgYmxrOwogCQl1bnNpZ25lZCBpbnQgbiA9IDE7Ci0JCWJsayA9IGdmczJfYWxsb2NfYmxvY2soaXAsICZuKTsKKwkJZXJyb3IgPSBnZnMyX2FsbG9jX2Jsb2NrKGlwLCAmYmxrLCAmbik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKIAkJZ2ZzMl90cmFuc19hZGRfdW5yZXZva2Uoc2RwLCBibGssIDEpOwogCQlpbmRiaCA9IGdmczJfbWV0YV9uZXcoaXAtPmlfZ2wsIGJsayk7CiAJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBpbmRiaCwgMSk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19leHBvcnQuYyBiL2ZzL2dmczIvZXhwb3J0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGZzL2dmczIvb3BzX2V4cG9ydC5jCnJlbmFtZSB0byBmcy9nZnMyL2V4cG9ydC5jCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19maWxlLmMgYi9mcy9nZnMyL2ZpbGUuYwpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBmcy9nZnMyL29wc19maWxlLmMKcmVuYW1lIHRvIGZzL2dmczIvZmlsZS5jCmluZGV4IDVkODJlOTEuLjczMzE4YTMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvb3BzX2ZpbGUuYworKysgYi9mcy9nZnMyL2ZpbGUuYwpAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgInRyYW5zLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImVhb3BzLmgiCi0jaW5jbHVkZSAib3BzX2FkZHJlc3MuaCIKIAogLyoqCiAgKiBnZnMyX2xsc2VlayAtIHNlZWsgdG8gYSBsb2NhdGlvbiBpbiBhIGZpbGUKQEAgLTQyNSwzMyArNDI0LDM2IEBACiAJLnBhZ2VfbWt3cml0ZSA9IGdmczJfcGFnZV9ta3dyaXRlLAogfTsKIAotCiAvKioKICAqIGdmczJfbW1hcCAtCiAgKiBAZmlsZTogVGhlIGZpbGUgdG8gbWFwCiAgKiBAdm1hOiBUaGUgVk1BIHdoaWNoIGRlc2NyaWJlZCB0aGUgbWFwcGluZwogICoKLSAqIFJldHVybnM6IDAgb3IgZXJyb3IgY29kZQorICogVGhlcmUgaXMgbm8gbmVlZCB0byBnZXQgYSBsb2NrIGhlcmUgdW5sZXNzIHdlIHNob3VsZCBiZSB1cGRhdGluZworICogYXRpbWUuIFdlIGlnbm9yZSBhbnkgbG9ja2luZyBlcnJvcnMgc2luY2UgdGhlIG9ubHkgY29uc2VxdWVuY2UgaXMKKyAqIGEgbWlzc2VkIGF0aW1lIHVwZGF0ZSAod2hpY2ggd2lsbCBqdXN0IGJlIGRlZmVycmVkIHVudGlsIGxhdGVyKS4KKyAqCisgKiBSZXR1cm5zOiAwCiAgKi8KIAogc3RhdGljIGludCBnZnMyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShmaWxlLT5mX21hcHBpbmctPmhvc3QpOwotCXN0cnVjdCBnZnMyX2hvbGRlciBpX2doOwotCWludCBlcnJvcjsKIAotCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX1NIQVJFRCwgMCwgJmlfZ2gpOwotCWVycm9yID0gZ2ZzMl9nbG9ja19ucSgmaV9naCk7Ci0JaWYgKGVycm9yKSB7Ci0JCWdmczJfaG9sZGVyX3VuaW5pdCgmaV9naCk7Ci0JCXJldHVybiBlcnJvcjsKKwlpZiAoIShmaWxlLT5mX2ZsYWdzICYgT19OT0FUSU1FKSkgeworCQlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgaV9naDsKKwkJaW50IGVycm9yOworCisJCWdmczJfaG9sZGVyX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmlfZ2gpOworCQllcnJvciA9IGdmczJfZ2xvY2tfbnEoJmlfZ2gpOworCQlmaWxlX2FjY2Vzc2VkKGZpbGUpOworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZpX2doKTsKIAl9Ci0KIAl2bWEtPnZtX29wcyA9ICZnZnMyX3ZtX29wczsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0NBTl9OT05MSU5FQVI7CiAKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmaV9naCk7Ci0KLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNjkyLDEyICs2OTQsMTAgQEAKIAogc3RhdGljIGludCBnZnMyX2Zsb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koZmlsZS0+Zl9tYXBwaW5nLT5ob3N0KTsKLQogCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX0ZMT0NLKSkKIAkJcmV0dXJuIC1FTk9MQ0s7Ci0JaWYgKF9fbWFuZGF0b3J5X2xvY2soJmlwLT5pX2lub2RlKSkKLQkJcmV0dXJuIC1FTk9MQ0s7CisJaWYgKGZsLT5mbF90eXBlICYgTE9DS19NQU5EKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoZmwtPmZsX3R5cGUgPT0gRl9VTkxDSykgewogCQlkb191bmZsb2NrKGZpbGUsIGZsKTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvZ2xvY2suYyBiL2ZzL2dmczIvZ2xvY2suYwppbmRleCBmZjQ5ODEwLi4yYmY2MmJjIDEwMDY0NAotLS0gYS9mcy9nZnMyL2dsb2NrLmMKKysrIGIvZnMvZ2ZzMi9nbG9jay5jCkBAIC03OTYsMjIgKzc5NiwzNyBAQAogCWdoLT5naF9pcCA9IDA7CiB9CiAKLXN0YXRpYyBpbnQganVzdF9zY2hlZHVsZSh2b2lkICp3b3JkKQorLyoqCisgKiBnZnMyX2dsb2NrX2hvbGRlcl93YWl0CisgKiBAd29yZDogdW51c2VkCisgKgorICogVGhpcyBmdW5jdGlvbiBhbmQgZ2ZzMl9nbG9ja19kZW1vdGVfd2FpdCBib3RoIHNob3cgdXAgaW4gdGhlIFdDSEFOCisgKiBmaWVsZC4gVGh1cyBJJ3ZlIHNlcGFyYXRlZCB0aGVzZSBvdGhlcndpc2UgaWRlbnRpY2FsIGZ1bmN0aW9ucyBpbgorICogb3JkZXIgdG8gYmUgbW9yZSBpbmZvcm1hdGl2ZSB0byB0aGUgdXNlci4KKyAqLworCitzdGF0aWMgaW50IGdmczJfZ2xvY2tfaG9sZGVyX3dhaXQodm9pZCAqd29yZCkKIHsKICAgICAgICAgc2NoZWR1bGUoKTsKICAgICAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZ2ZzMl9nbG9ja19kZW1vdGVfd2FpdCh2b2lkICp3b3JkKQoreworCXNjaGVkdWxlKCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIHdhaXRfb25faG9sZGVyKHN0cnVjdCBnZnMyX2hvbGRlciAqZ2gpCiB7CiAJbWlnaHRfc2xlZXAoKTsKLQl3YWl0X29uX2JpdCgmZ2gtPmdoX2lmbGFncywgSElGX1dBSVQsIGp1c3Rfc2NoZWR1bGUsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl3YWl0X29uX2JpdCgmZ2gtPmdoX2lmbGFncywgSElGX1dBSVQsIGdmczJfZ2xvY2tfaG9sZGVyX3dhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIH0KIAogc3RhdGljIHZvaWQgd2FpdF9vbl9kZW1vdGUoc3RydWN0IGdmczJfZ2xvY2sgKmdsKQogewogCW1pZ2h0X3NsZWVwKCk7Ci0Jd2FpdF9vbl9iaXQoJmdsLT5nbF9mbGFncywgR0xGX0RFTU9URSwganVzdF9zY2hlZHVsZSwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCXdhaXRfb25fYml0KCZnbC0+Z2xfZmxhZ3MsIEdMRl9ERU1PVEUsIGdmczJfZ2xvY2tfZGVtb3RlX3dhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9nZnMyL2dsb3BzLmMgYi9mcy9nZnMyL2dsb3BzLmMKaW5kZXggNzBmODdmNC4uZDVlNGFiMSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9nbG9wcy5jCisrKyBiL2ZzL2dmczIvZ2xvcHMuYwpAQCAtMzEwLDI0ICszMTAsNiBAQAogfQogCiAvKioKLSAqIHJncnBfZ29fZHVtcCAtIHByaW50IG91dCBhbiByZ3JwCi0gKiBAc2VxOiBUaGUgaXRlcmF0b3IKLSAqIEBnbDogVGhlIGdsb2NrIGluIHF1ZXN0aW9uCi0gKgotICovCi0KLXN0YXRpYyBpbnQgcmdycF9nb19kdW1wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBjb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpCi17Ci0JY29uc3Qgc3RydWN0IGdmczJfcmdycGQgKnJnZCA9IGdsLT5nbF9vYmplY3Q7Ci0JaWYgKHJnZCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlnZnMyX3ByaW50X2RiZyhzZXEsICIgUjogbjolbGx1IGY6JTAyeCBiOiV1LyV1IGk6JXVcbiIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJnZC0+cmRfYWRkciwgcmdkLT5yZF9mbGFncywKLQkJICAgICAgIHJnZC0+cmRfZnJlZSwgcmdkLT5yZF9mcmVlX2Nsb25lLCByZ2QtPnJkX2Rpbm9kZXMpOwotCXJldHVybiAwOwotfQotCi0vKioKICAqIHRyYW5zX2dvX3N5bmMgLSBwcm9tb3RlL2RlbW90ZSB0aGUgdHJhbnNhY3Rpb24gZ2xvY2sKICAqIEBnbDogdGhlIGdsb2NrCiAgKiBAc3RhdGU6IHRoZSByZXF1ZXN0ZWQgc3RhdGUKQEAgLTQxMCw3ICszOTIsNyBAQAogCS5nb19kZW1vdGVfb2sgPSByZ3JwX2dvX2RlbW90ZV9vaywKIAkuZ29fbG9jayA9IHJncnBfZ29fbG9jaywKIAkuZ29fdW5sb2NrID0gcmdycF9nb191bmxvY2ssCi0JLmdvX2R1bXAgPSByZ3JwX2dvX2R1bXAsCisJLmdvX2R1bXAgPSBnZnMyX3JncnBfZHVtcCwKIAkuZ29fdHlwZSA9IExNX1RZUEVfUkdSUCwKIAkuZ29fbWluX2hvbGRfdGltZSA9IEhaIC8gNSwKIH07CmRpZmYgLS1naXQgYS9mcy9nZnMyL2luY29yZS5oIGIvZnMvZ2ZzMi9pbmNvcmUuaAppbmRleCAzOTlkMWI5Li4yMjUzNDdmIDEwMDY0NAotLS0gYS9mcy9nZnMyL2luY29yZS5oCisrKyBiL2ZzL2dmczIvaW5jb3JlLmgKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2xvdy13b3JrLmg+CiAjaW5jbHVkZSA8bGludXgvZGxtLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KIApAQCAtNjMsOSArNjQsMTIgQEAKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9sb2dfb3BlcmF0aW9ucyAqbGVfb3BzOwogfTsKIAorI2RlZmluZSBHQkZfRlVMTCAxCisKIHN0cnVjdCBnZnMyX2JpdG1hcCB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaV9iaDsKIAljaGFyICpiaV9jbG9uZTsKKwl1bnNpZ25lZCBsb25nIGJpX2ZsYWdzOwogCXUzMiBiaV9vZmZzZXQ7CiAJdTMyIGJpX3N0YXJ0OwogCXUzMiBiaV9sZW47CkBAIC05MCwxMCArOTQsMTEgQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnJkX3NiZDsKIAl1bnNpZ25lZCBpbnQgcmRfYmhfY291bnQ7CiAJdTMyIHJkX2xhc3RfYWxsb2M7Ci0JdW5zaWduZWQgY2hhciByZF9mbGFnczsKLSNkZWZpbmUgR0ZTMl9SREZfQ0hFQ0sgICAgICAgIDB4MDEgICAgICAvKiBOZWVkIHRvIGNoZWNrIGZvciB1bmxpbmtlZCBpbm9kZXMgKi8KLSNkZWZpbmUgR0ZTMl9SREZfTk9BTExPQyAgICAgIDB4MDIgICAgICAvKiByZyBwcm9oaWJpdHMgYWxsb2NhdGlvbiAqLwotI2RlZmluZSBHRlMyX1JERl9VUFRPREFURSAgICAgMHgwNCAgICAgIC8qIHJnIGlzIHVwIHRvIGRhdGUgKi8KKwl1MzIgcmRfZmxhZ3M7CisjZGVmaW5lIEdGUzJfUkRGX0NIRUNLCQkweDEwMDAwMDAwIC8qIGNoZWNrIGZvciB1bmxpbmtlZCBpbm9kZXMgKi8KKyNkZWZpbmUgR0ZTMl9SREZfVVBUT0RBVEUJMHgyMDAwMDAwMCAvKiByZyBpcyB1cCB0byBkYXRlICovCisjZGVmaW5lIEdGUzJfUkRGX0VSUk9SCQkweDQwMDAwMDAwIC8qIGVycm9yIGluIHJnICovCisjZGVmaW5lIEdGUzJfUkRGX01BU0sJCTB4ZjAwMDAwMDAgLyogbWFzayBmb3IgaW50ZXJuYWwgZmxhZ3MgKi8KIH07CiAKIGVudW0gZ2ZzMl9zdGF0ZV9iaXRzIHsKQEAgLTM3NiwxMSArMzgxLDExIEBACiBzdHJ1Y3QgZ2ZzMl9qZGVzYyB7CiAJc3RydWN0IGxpc3RfaGVhZCBqZF9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgZXh0ZW50X2xpc3Q7Ci0KKwlzdHJ1Y3Qgc2xvd193b3JrIGpkX3dvcms7CiAJc3RydWN0IGlub2RlICpqZF9pbm9kZTsKKwl1bnNpZ25lZCBsb25nIGpkX2ZsYWdzOworI2RlZmluZSBKREZfUkVDT1ZFUlkgMQogCXVuc2lnbmVkIGludCBqZF9qaWQ7Ci0JaW50IGpkX2RpcnR5OwotCiAJdW5zaWduZWQgaW50IGpkX2Jsb2NrczsKIH07CiAKQEAgLTM5MCw5ICszOTUsNiBAQAogCXM2NCBzY19kaW5vZGVzOwogfTsKIAotI2RlZmluZSBHRlMyX0dMT0NLRF9ERUZBVUxUCTEKLSNkZWZpbmUgR0ZTMl9HTE9DS0RfTUFYCQkxNgotCiAjZGVmaW5lIEdGUzJfUVVPVEFfREVGQVVMVAlHRlMyX1FVT1RBX09GRgogI2RlZmluZSBHRlMyX1FVT1RBX09GRgkJMAogI2RlZmluZSBHRlMyX1FVT1RBX0FDQ09VTlQJMQpAQCAtNDE4LDYgKzQyMCw3IEBACiAJdW5zaWduZWQgaW50IGFyX2RhdGE6MjsJCQkvKiBvcmRlcmVkL3dyaXRlYmFjayAqLwogCXVuc2lnbmVkIGludCBhcl9tZXRhOjE7CQkJLyogbW91bnQgbWV0YWZzICovCiAJdW5zaWduZWQgaW50IGFyX2Rpc2NhcmQ6MTsJCS8qIGRpc2NhcmQgcmVxdWVzdHMgKi8KKwlpbnQgYXJfY29tbWl0OwkJCQkvKiBDb21taXQgaW50ZXJ2YWwgKi8KIH07CiAKIHN0cnVjdCBnZnMyX3R1bmUgewpAQCAtNDI2LDcgKzQyOSw2IEBACiAJdW5zaWduZWQgaW50IGd0X2luY29yZV9sb2dfYmxvY2tzOwogCXVuc2lnbmVkIGludCBndF9sb2dfZmx1c2hfc2VjczsKIAotCXVuc2lnbmVkIGludCBndF9yZWNvdmVyZF9zZWNzOwogCXVuc2lnbmVkIGludCBndF9sb2dkX3NlY3M7CiAKIAl1bnNpZ25lZCBpbnQgZ3RfcXVvdGFfc2ltdWxfc3luYzsgLyogTWF4IHF1b3RhdmFscyB0byBzeW5jIGF0IG9uY2UgKi8KQEAgLTQ0Nyw2ICs0NDksNyBAQAogCVNERl9KT1VSTkFMX0xJVkUJPSAxLAogCVNERl9TSFVURE9XTgkJPSAyLAogCVNERl9OT0JBUlJJRVJTCQk9IDMsCisJU0RGX05PUkVDT1ZFUlkJCT0gNCwKIH07CiAKICNkZWZpbmUgR0ZTMl9GU05BTUVfTEVOCQkyNTYKQEAgLTQ5Myw3ICs0OTYsNiBAQAogCXVuc2lnbmVkIGxvbmcgbHNfZmxhZ3M7CiAJZGxtX2xvY2tzcGFjZV90ICpsc19kbG07CiAKLQlpbnQgbHNfcmVjb3Zlcl9qaWQ7CiAJaW50IGxzX3JlY292ZXJfamlkX2RvbmU7CiAJaW50IGxzX3JlY292ZXJfamlkX3N0YXR1czsKIH07CkBAIC01ODIsNyArNTg0LDYgQEAKIAogCS8qIERhZW1vbiBzdHVmZiAqLwogCi0Jc3RydWN0IHRhc2tfc3RydWN0ICpzZF9yZWNvdmVyZF9wcm9jZXNzOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2RfbG9nZF9wcm9jZXNzOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqc2RfcXVvdGFkX3Byb2Nlc3M7CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5vZGUuYyBiL2ZzL2dmczIvaW5vZGUuYwppbmRleCA1YTMxZDQyLi4yZjk0YmQ3IDEwMDY0NAotLS0gYS9mcy9nZnMyL2lub2RlLmMKKysrIGIvZnMvZ2ZzMi9pbm9kZS5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSAiaW5vZGUuaCIKICNpbmNsdWRlICJsb2cuaCIKICNpbmNsdWRlICJtZXRhX2lvLmgiCi0jaW5jbHVkZSAib3BzX2FkZHJlc3MuaCIKICNpbmNsdWRlICJxdW90YS5oIgogI2luY2x1ZGUgInJncnAuaCIKICNpbmNsdWRlICJ0cmFucy5oIgpAQCAtMTA0NywxNTQgKzEwNDYsNyBAQAogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIH0KIAotLyoqCi0gKiBnZnMyX3JtZGlyaSAtIFJlbW92ZSBhIGRpcmVjdG9yeQotICogQGRpcDogVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSByZW1vdmVkCi0gKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSByZW1vdmVkCi0gKiBAaXA6IFRoZSBHRlMyIGlub2RlIG9mIHRoZSBkaXJlY3RvcnkgdG8gYmUgcmVtb3ZlZAotICoKLSAqIEFzc3VtZXMgR2xvY2tzIG9uIGRpcCBhbmQgaXAgYXJlIGhlbGQKLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX3JtZGlyaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqZGlwLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKLQkJc3RydWN0IGdmczJfaW5vZGUgKmlwKQotewotCXN0cnVjdCBxc3RyIGRvdG5hbWU7Ci0JaW50IGVycm9yOwotCi0JaWYgKGlwLT5pX2VudHJpZXMgIT0gMikgewotCQlpZiAoZ2ZzMl9jb25zaXN0X2lub2RlKGlwKSkKLQkJCWdmczJfZGlub2RlX3ByaW50KGlwKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JZXJyb3IgPSBnZnMyX2Rpcl9kZWwoZGlwLCBuYW1lKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCWVycm9yID0gZ2ZzMl9jaGFuZ2VfbmxpbmsoZGlwLCAtMSk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlnZnMyX3N0cjJxc3RyKCZkb3RuYW1lLCAiLiIpOwotCWVycm9yID0gZ2ZzMl9kaXJfZGVsKGlwLCAmZG90bmFtZSk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlnZnMyX3N0cjJxc3RyKCZkb3RuYW1lLCAiLi4iKTsKLQllcnJvciA9IGdmczJfZGlyX2RlbChpcCwgJmRvdG5hbWUpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JLyogSXQgbG9va3Mgb2RkLCBidXQgaXQgcmVhbGx5IHNob3VsZCBiZSBkb25lIHR3aWNlICovCi0JZXJyb3IgPSBnZnMyX2NoYW5nZV9ubGluayhpcCwgLTEpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JZXJyb3IgPSBnZnMyX2NoYW5nZV9ubGluayhpcCwgLTEpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogZ2ZzMl91bmxpbmtfb2sgLSBjaGVjayB0byBzZWUgdGhhdCBhIGlub2RlIGlzIHN0aWxsIGluIGEgZGlyZWN0b3J5Ci0gKiBAZGlwOiB0aGUgZGlyZWN0b3J5Ci0gKiBAbmFtZTogdGhlIG5hbWUgb2YgdGhlIGZpbGUKLSAqIEBpcDogdGhlIGlub2RlCi0gKgotICogQXNzdW1lcyB0aGF0IHRoZSBsb2NrIG9uIChhdCBsZWFzdCkgQGRpcCBpcyBoZWxkLgotICoKLSAqIFJldHVybnM6IDAgaWYgdGhlIHBhcmVudC9jaGlsZCByZWxhdGlvbnNoaXAgaXMgY29ycmVjdCwgZXJybm8gaWYgaXQgaXNuJ3QKLSAqLwotCi1pbnQgZ2ZzMl91bmxpbmtfb2soc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCi0JCSAgIGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKLXsKLQlpbnQgZXJyb3I7Ci0KLQlpZiAoSVNfSU1NVVRBQkxFKCZpcC0+aV9pbm9kZSkgfHwgSVNfQVBQRU5EKCZpcC0+aV9pbm9kZSkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlpZiAoKGRpcC0+aV9pbm9kZS5pX21vZGUgJiBTX0lTVlRYKSAmJgotCSAgICBkaXAtPmlfaW5vZGUuaV91aWQgIT0gY3VycmVudF9mc3VpZCgpICYmCi0JICAgIGlwLT5pX2lub2RlLmlfdWlkICE9IGN1cnJlbnRfZnN1aWQoKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmIChJU19BUFBFTkQoJmRpcC0+aV9pbm9kZSkpCi0JCXJldHVybiAtRVBFUk07Ci0KLQllcnJvciA9IGdmczJfcGVybWlzc2lvbigmZGlwLT5pX2lub2RlLCBNQVlfV1JJVEUgfCBNQVlfRVhFQyk7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQllcnJvciA9IGdmczJfZGlyX2NoZWNrKCZkaXAtPmlfaW5vZGUsIG5hbWUsIGlwKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGdmczJfcmVhZGxpbmtpIC0gcmV0dXJuIHRoZSBjb250ZW50cyBvZiBhIHN5bWxpbmsKLSAqIEBpcDogdGhlIHN5bWxpbmsncyBpbm9kZQotICogQGJ1ZjogYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdG8gYmUgZmlsbGVkCi0gKiBAbGVuOiBhIHBvaW50ZXIgdG8gdGhlIGxlbmd0aCBvZiBAYnVmCi0gKgotICogSWYgQGJ1ZiBpcyB0b28gc21hbGwsIGEgcGllY2Ugb2YgbWVtb3J5IGlzIGttYWxsb2MoKWVkIGFuZCBuZWVkcwotICogdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX3JlYWRsaW5raShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGNoYXIgKipidWYsIHVuc2lnbmVkIGludCAqbGVuKQotewotCXN0cnVjdCBnZnMyX2hvbGRlciBpX2doOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqZGliaDsKLQl1bnNpZ25lZCBpbnQgeDsKLQlpbnQgZXJyb3I7Ci0KLQlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIDAsICZpX2doKTsKLQllcnJvciA9IGdmczJfZ2xvY2tfbnEoJmlfZ2gpOwotCWlmIChlcnJvcikgewotCQlnZnMyX2hvbGRlcl91bmluaXQoJmlfZ2gpOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQotCi0JaWYgKCFpcC0+aV9kaXNrc2l6ZSkgewotCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOwotCQllcnJvciA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0KLQl4ID0gaXAtPmlfZGlza3NpemUgKyAxOwotCWlmICh4ID4gKmxlbikgewotCQkqYnVmID0ga21hbGxvYyh4LCBHRlBfTk9GUyk7Ci0JCWlmICghKmJ1ZikgewotCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJZ290byBvdXRfYnJlbHNlOwotCQl9Ci0JfQotCi0JbWVtY3B5KCpidWYsIGRpYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpLCB4KTsKLQkqbGVuID0geDsKLQotb3V0X2JyZWxzZToKLQlicmVsc2UoZGliaCk7Ci1vdXQ6Ci0JZ2ZzMl9nbG9ja19kcV91bmluaXQoJmlfZ2gpOwotCXJldHVybiBlcnJvcjsKLX0KLQotc3RhdGljIGludAotX19nZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyKQorc3RhdGljIGludCBfX2dmczJfc2V0YXR0cl9zaW1wbGUoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaWJoOwogCWludCBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5vZGUuaCBiL2ZzL2dmczIvaW5vZGUuaAppbmRleCBjMzBiZTJiLi5jMzQxYWFmIDEwMDY0NAotLS0gYS9mcy9nZnMyL2lub2RlLmgKKysrIGIvZnMvZ2ZzMi9pbm9kZS5oCkBAIC0xMSw4ICsxMSwxNiBAQAogI2RlZmluZSBfX0lOT0RFX0RPVF9IX18KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgInV0aWwuaCIKIAorZXh0ZXJuIGludCBnZnMyX3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnBfbWFzayk7CitleHRlcm4gaW50IGdmczJfaW50ZXJuYWxfcmVhZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsCisJCQkgICAgICBzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmFfc3RhdGUsCisJCQkgICAgICBjaGFyICpidWYsIGxvZmZfdCAqcG9zLCB1bnNpZ25lZCBzaXplKTsKK2V4dGVybiB2b2lkIGdmczJfc2V0X2FvcHMoc3RydWN0IGlub2RlICppbm9kZSk7CisKIHN0YXRpYyBpbmxpbmUgaW50IGdmczJfaXNfc3R1ZmZlZChjb25zdCBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7CiAJcmV0dXJuICFpcC0+aV9oZWlnaHQ7CkBAIC03MywzMCArODEsMjYgQEAKIH0KIAogCi12b2lkIGdmczJfc2V0X2lvcChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLXN0cnVjdCBpbm9kZSAqZ2ZzMl9pbm9kZV9sb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgdHlwZSwgCi0JCQkJdTY0IG5vX2FkZHIsIHU2NCBub19mb3JtYWxfaW5vLAotCQkJCWludCBza2lwX2ZyZWVpbmcpOwotc3RydWN0IGlub2RlICpnZnMyX2lsb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTY0IG5vX2FkZHIpOworZXh0ZXJuIHZvaWQgZ2ZzMl9zZXRfaW9wKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZ2ZzMl9pbm9kZV9sb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgdHlwZSwgCisJCQkJICAgICAgIHU2NCBub19hZGRyLCB1NjQgbm9fZm9ybWFsX2lubywKKwkJCQkgICAgICAgaW50IHNraXBfZnJlZWluZyk7CitleHRlcm4gc3RydWN0IGlub2RlICpnZnMyX2lsb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTY0IG5vX2FkZHIpOwogCi1pbnQgZ2ZzMl9pbm9kZV9yZWZyZXNoKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CitleHRlcm4gaW50IGdmczJfaW5vZGVfcmVmcmVzaChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogCi1pbnQgZ2ZzMl9kaW5vZGVfZGVhbGxvYyhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaW5vZGUpOwotaW50IGdmczJfY2hhbmdlX25saW5rKHN0cnVjdCBnZnMyX2lub2RlICppcCwgaW50IGRpZmYpOwotc3RydWN0IGlub2RlICpnZnMyX2xvb2t1cGkoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLAotCQkJICAgaW50IGlzX3Jvb3QpOwotc3RydWN0IGlub2RlICpnZnMyX2NyZWF0ZWkoc3RydWN0IGdmczJfaG9sZGVyICpnaHMsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lLAotCQkJICAgdW5zaWduZWQgaW50IG1vZGUsIGRldl90IGRldik7Ci1pbnQgZ2ZzMl9ybWRpcmkoc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCi0JCXN0cnVjdCBnZnMyX2lub2RlICppcCk7Ci1pbnQgZ2ZzMl91bmxpbmtfb2soc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCi0JCSAgIGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCk7Ci1pbnQgZ2ZzMl9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKTsKLWludCBnZnMyX3JlYWRsaW5raShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGNoYXIgKipidWYsIHVuc2lnbmVkIGludCAqbGVuKTsKLWludCBnZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyKTsKLXN0cnVjdCBpbm9kZSAqZ2ZzMl9sb29rdXBfc2ltcGxlKHN0cnVjdCBpbm9kZSAqZGlwLCBjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgZ2ZzMl9kaW5vZGVfb3V0KGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCwgdm9pZCAqYnVmKTsKLXZvaWQgZ2ZzMl9kaW5vZGVfcHJpbnQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKK2V4dGVybiBpbnQgZ2ZzMl9kaW5vZGVfZGVhbGxvYyhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaW5vZGUpOworZXh0ZXJuIGludCBnZnMyX2NoYW5nZV9ubGluayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGludCBkaWZmKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmdmczJfbG9va3VwaShzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCisJCQkJICBpbnQgaXNfcm9vdCk7CitleHRlcm4gc3RydWN0IGlub2RlICpnZnMyX2NyZWF0ZWkoc3RydWN0IGdmczJfaG9sZGVyICpnaHMsCisJCQkJICBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJCQkgIHVuc2lnbmVkIGludCBtb2RlLCBkZXZfdCBkZXYpOworZXh0ZXJuIGludCBnZnMyX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOworZXh0ZXJuIGludCBnZnMyX3NldGF0dHJfc2ltcGxlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgc3RydWN0IGlhdHRyICphdHRyKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmdmczJfbG9va3VwX3NpbXBsZShzdHJ1Y3QgaW5vZGUgKmRpcCwgY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gdm9pZCBnZnMyX2Rpbm9kZV9vdXQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwLCB2b2lkICpidWYpOworZXh0ZXJuIHZvaWQgZ2ZzMl9kaW5vZGVfcHJpbnQoY29uc3Qgc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGdmczJfZmlsZV9pb3BzOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGdmczJfZGlyX2lvcHM7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvZy5jIGIvZnMvZ2ZzMi9sb2cuYwppbmRleCA5ODkxOGE3Li5hYTYyY2Y1IDEwMDY0NAotLS0gYS9mcy9nZnMyL2xvZy5jCisrKyBiL2ZzL2dmczIvbG9nLmMKQEAgLTEyMCw3ICsxMjAsNyBAQAogCQkJbG9ja19idWZmZXIoYmgpOwogCQkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgewogCQkJCWJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfd3JpdGVfc3luYzsKLQkJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCQlzdWJtaXRfYmgoV1JJVEVfU1lOQ19QTFVHLCBiaCk7CiAJCQl9IGVsc2UgewogCQkJCXVubG9ja19idWZmZXIoYmgpOwogCQkJCWJyZWxzZShiaCk7CkBAIC02MDQsNyArNjA0LDcgQEAKIAlpZiAodGVzdF9iaXQoU0RGX05PQkFSUklFUlMsICZzZHAtPnNkX2ZsYWdzKSkKIAkJZ290byBza2lwX2JhcnJpZXI7CiAJZ2V0X2JoKGJoKTsKLQlzdWJtaXRfYmgoV1JJVEVfQkFSUklFUiB8ICgxIDw8IEJJT19SV19NRVRBKSwgYmgpOworCXN1Ym1pdF9iaChXUklURV9TWU5DIHwgKDEgPDwgQklPX1JXX0JBUlJJRVIpIHwgKDEgPDwgQklPX1JXX01FVEEpLCBiaCk7CiAJd2FpdF9vbl9idWZmZXIoYmgpOwogCWlmIChidWZmZXJfZW9wbm90c3VwcChiaCkpIHsKIAkJY2xlYXJfYnVmZmVyX2VvcG5vdHN1cHAoYmgpOwpAQCAtNjY0LDcgKzY2NCw3IEBACiAJCWxvY2tfYnVmZmVyKGJoKTsKIAkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgewogCQkJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOwotCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQlzdWJtaXRfYmgoV1JJVEVfU1lOQ19QTFVHLCBiaCk7CiAJCX0gZWxzZSB7CiAJCQl1bmxvY2tfYnVmZmVyKGJoKTsKIAkJCWJyZWxzZShiaCk7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2xvcHMuYyBiL2ZzL2dmczIvbG9wcy5jCmluZGV4IDgwZTRmNWYuLjAwMzE1ZjUgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbG9wcy5jCisrKyBiL2ZzL2dmczIvbG9wcy5jCkBAIC0xMyw2ICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogCiAjaW5jbHVkZSAiZ2ZzMi5oIgogI2luY2x1ZGUgImluY29yZS5oIgpAQCAtMTg5LDcgKzE5MSw3IEBACiAJCX0KIAogCQlnZnMyX2xvZ191bmxvY2soc2RwKTsKLQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCXN1Ym1pdF9iaChXUklURV9TWU5DX1BMVUcsIGJoKTsKIAkJZ2ZzMl9sb2dfbG9jayhzZHApOwogCiAJCW4gPSAwOwpAQCAtMTk5LDcgKzIwMSw3IEBACiAJCQlnZnMyX2xvZ191bmxvY2soc2RwKTsKIAkJCWxvY2tfYnVmZmVyKGJkMi0+YmRfYmgpOwogCQkJYmggPSBnZnMyX2xvZ19mYWtlX2J1ZihzZHAsIGJkMi0+YmRfYmgpOwotCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQlzdWJtaXRfYmgoV1JJVEVfU1lOQ19QTFVHLCBiaCk7CiAJCQlnZnMyX2xvZ19sb2NrKHNkcCk7CiAJCQlpZiAoKytuID49IG51bSkKIAkJCQlicmVhazsKQEAgLTM0MSw3ICszNDMsNyBAQAogCQlzZHAtPnNkX2xvZ19udW1fcmV2b2tlLS07CiAKIAkJaWYgKG9mZnNldCArIHNpemVvZih1NjQpID4gc2RwLT5zZF9zYi5zYl9ic2l6ZSkgewotCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQlzdWJtaXRfYmgoV1JJVEVfU1lOQ19QTFVHLCBiaCk7CiAKIAkJCWJoID0gZ2ZzMl9sb2dfZ2V0X2J1ZihzZHApOwogCQkJbWggPSAoc3RydWN0IGdmczJfbWV0YV9oZWFkZXIgKiliaC0+Yl9kYXRhOwpAQCAtMzU4LDcgKzM2MCw3IEBACiAJfQogCWdmczJfYXNzZXJ0X3dpdGhkcmF3KHNkcCwgIXNkcC0+c2RfbG9nX251bV9yZXZva2UpOwogCi0Jc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJc3VibWl0X2JoKFdSSVRFX1NZTkNfUExVRywgYmgpOwogfQogCiBzdGF0aWMgdm9pZCByZXZva2VfbG9fYmVmb3JlX3NjYW4oc3RydWN0IGdmczJfamRlc2MgKmpkLApAQCAtNTYwLDcgKzU2Miw3IEBACiAJcHRyID0gYmhfbG9nX3B0cihiaCk7CiAJCiAJZ2V0X2JoKGJoKTsKLQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwlzdWJtaXRfYmgoV1JJVEVfU1lOQ19QTFVHLCBiaCk7CiAJZ2ZzMl9sb2dfbG9jayhzZHApOwogCXdoaWxlKCFsaXN0X2VtcHR5KGxpc3QpKSB7CiAJCWJkID0gbGlzdF9lbnRyeShsaXN0LT5uZXh0LCBzdHJ1Y3QgZ2ZzMl9idWZkYXRhLCBiZF9sZS5sZV9saXN0KTsKQEAgLTU4Niw3ICs1ODgsNyBAQAogCQl9IGVsc2UgewogCQkJYmgxID0gZ2ZzMl9sb2dfZmFrZV9idWYoc2RwLCBiZC0+YmRfYmgpOwogCQl9Ci0JCXN1Ym1pdF9iaChXUklURSwgYmgxKTsKKwkJc3VibWl0X2JoKFdSSVRFX1NZTkNfUExVRywgYmgxKTsKIAkJZ2ZzMl9sb2dfbG9jayhzZHApOwogCQlwdHIgKz0gMjsKIAl9CmRpZmYgLS1naXQgYS9mcy9nZnMyL21haW4uYyBiL2ZzL2dmczIvbWFpbi5jCmluZGV4IGE2ODkyZWQuLmVhY2Q3OGEgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvbWFpbi5jCisrKyBiL2ZzL2dmczIvbWFpbi5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Nsb3ctd29yay5oPgogCiAjaW5jbHVkZSAiZ2ZzMi5oIgogI2luY2x1ZGUgImluY29yZS5oIgpAQCAtMTEzLDEyICsxMTQsMTggQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbF91bnJlZ2lzdGVyOwogCisJZXJyb3IgPSBzbG93X3dvcmtfcmVnaXN0ZXJfdXNlcigpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX3Nsb3c7CisKIAlnZnMyX3JlZ2lzdGVyX2RlYnVnZnMoKTsKIAogCXByaW50aygiR0ZTMiAoYnVpbHQgJXMgJXMpIGluc3RhbGxlZFxuIiwgX19EQVRFX18sIF9fVElNRV9fKTsKIAogCXJldHVybiAwOwogCitmYWlsX3Nsb3c6CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZnZnMybWV0YV9mc190eXBlKTsKIGZhaWxfdW5yZWdpc3RlcjoKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmdmczJfZnNfdHlwZSk7CiBmYWlsOgpAQCAtMTU2LDYgKzE2Myw3IEBACiAJZ2ZzMl91bnJlZ2lzdGVyX2RlYnVnZnMoKTsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmdmczJfZnNfdHlwZSk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZnZnMybWV0YV9mc190eXBlKTsKKwlzbG93X3dvcmtfdW5yZWdpc3Rlcl91c2VyKCk7CiAKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZ2ZzMl9xdW90YWRfY2FjaGVwKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koZ2ZzMl9yZ3JwZF9jYWNoZXApOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9tZXRhX2lvLmMgYi9mcy9nZnMyL21ldGFfaW8uYwppbmRleCA4ZDZmMTMyLi5jYjhkN2E5IDEwMDY0NAotLS0gYS9mcy9nZnMyL21ldGFfaW8uYworKysgYi9mcy9nZnMyL21ldGFfaW8uYwpAQCAtMzEsMTkgKzMxLDY2IEBACiAjaW5jbHVkZSAicmdycC5oIgogI2luY2x1ZGUgInRyYW5zLmgiCiAjaW5jbHVkZSAidXRpbC5oIgotI2luY2x1ZGUgIm9wc19hZGRyZXNzLmgiCiAKLXN0YXRpYyBpbnQgYXNwYWNlX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsYmxvY2ssCi0JCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCitzdGF0aWMgaW50IGdmczJfYXNwYWNlX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCiB7Ci0JZ2ZzMl9hc3NlcnRfd2Fybihpbm9kZS0+aV9zYi0+c19mc19pbmZvLCAwKTsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19CisJaW50IGVycjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKwlpbnQgbnJfdW5kZXJ3YXkgPSAwOworCWludCB3cml0ZV9vcCA9ICgxIDw8IEJJT19SV19NRVRBKSB8ICgod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwgPworCQkJV1JJVEVfU1lOQ19QTFVHIDogV1JJVEUpKTsKIAotc3RhdGljIGludCBnZnMyX2FzcGFjZV93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQotewotCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgYXNwYWNlX2dldF9ibG9jaywgd2JjKTsKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCUJVR19PTighcGFnZV9oYXNfYnVmZmVycyhwYWdlKSk7CisKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJoID0gaGVhZDsKKworCWRvIHsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZiBpdCdzIGEgZnVsbHkgbm9uLWJsb2NraW5nIHdyaXRlIGF0dGVtcHQgYW5kIHdlIGNhbm5vdAorCQkgKiBsb2NrIHRoZSBidWZmZXIgdGhlbiByZWRpcnR5IHRoZSBwYWdlLiAgTm90ZSB0aGF0IHRoaXMgY2FuCisJCSAqIHBvdGVudGlhbGx5IGNhdXNlIGEgYnVzeS13YWl0IGxvb3AgZnJvbSBwZGZsdXNoIGFuZCBrc3dhcGQKKwkJICogYWN0aXZpdHksIGJ1dCB0aG9zZSBjb2RlIHBhdGhzIGhhdmUgdGhlaXIgb3duIGhpZ2hlci1sZXZlbAorCQkgKiB0aHJvdHRsaW5nLgorCQkgKi8KKwkJaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSB8fCAhd2JjLT5ub25ibG9ja2luZykgeworCQkJbG9ja19idWZmZXIoYmgpOworCQl9IGVsc2UgaWYgKCF0cnlsb2NrX2J1ZmZlcihiaCkpIHsKKwkJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoYmgpKSB7CisJCQltYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJCX0gZWxzZSB7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJfQorCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwkvKgorCSAqIFRoZSBwYWdlIGFuZCBpdHMgYnVmZmVycyBhcmUgcHJvdGVjdGVkIGJ5IFBhZ2VXcml0ZWJhY2soKSwgc28gd2UgY2FuCisJICogZHJvcCB0aGUgYmggcmVmY291bnRzIGVhcmx5LgorCSAqLworCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisKKwlkbyB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJaWYgKGJ1ZmZlcl9hc3luY193cml0ZShiaCkpIHsKKwkJCXN1Ym1pdF9iaCh3cml0ZV9vcCwgYmgpOworCQkJbnJfdW5kZXJ3YXkrKzsKKwkJfQorCQliaCA9IG5leHQ7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisKKwllcnIgPSAwOworCWlmIChucl91bmRlcndheSA9PSAwKQorCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBhc3BhY2VfYW9wcyA9IHsKQEAgLTIwMSwxNiArMjQ4LDMyIEBACiBpbnQgZ2ZzMl9tZXRhX3JlYWQoc3RydWN0IGdmczJfZ2xvY2sgKmdsLCB1NjQgYmxrbm8sIGludCBmbGFncywKIAkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQogewotCSpiaHAgPSBnZnMyX2dldGJ1ZihnbCwgYmxrbm8sIENSRUFURSk7Ci0JaWYgKCFidWZmZXJfdXB0b2RhdGUoKmJocCkpIHsKLQkJbGxfcndfYmxvY2soUkVBRF9NRVRBLCAxLCBiaHApOwotCQlpZiAoZmxhZ3MgJiBESU9fV0FJVCkgewotCQkJaW50IGVycm9yID0gZ2ZzMl9tZXRhX3dhaXQoZ2wtPmdsX3NiZCwgKmJocCk7Ci0JCQlpZiAoZXJyb3IpIHsKLQkJCQlicmVsc2UoKmJocCk7Ci0JCQkJcmV0dXJuIGVycm9yOwotCQkJfQotCQl9CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBnbC0+Z2xfc2JkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoU0RGX1NIVVRET1dOLCAmc2RwLT5zZF9mbGFncykpKQorCQlyZXR1cm4gLUVJTzsKKworCSpiaHAgPSBiaCA9IGdmczJfZ2V0YnVmKGdsLCBibGtubywgQ1JFQVRFKTsKKworCWxvY2tfYnVmZmVyKGJoKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJcmV0dXJuIDA7CisJfQorCWJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfcmVhZF9zeW5jOworCWdldF9iaChiaCk7CisJc3VibWl0X2JoKFJFQURfU1lOQyB8ICgxIDw8IEJJT19SV19NRVRBKSwgYmgpOworCWlmICghKGZsYWdzICYgRElPX1dBSVQpKQorCQlyZXR1cm4gMDsKKworCXdhaXRfb25fYnVmZmVyKGJoKTsKKwlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpKSB7CisJCXN0cnVjdCBnZnMyX3RyYW5zICp0ciA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwkJaWYgKHRyICYmIHRyLT50cl90b3VjaGVkKQorCQkJZ2ZzMl9pb19lcnJvcl9iaChzZHAsIGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJcmV0dXJuIDA7CkBAIC00MDQsNyArNDY3LDcgQEAKIAlpZiAoYnVmZmVyX3VwdG9kYXRlKGZpcnN0X2JoKSkKIAkJZ290byBvdXQ7CiAJaWYgKCFidWZmZXJfbG9ja2VkKGZpcnN0X2JoKSkKLQkJbGxfcndfYmxvY2soUkVBRF9NRVRBLCAxLCAmZmlyc3RfYmgpOworCQlsbF9yd19ibG9jayhSRUFEX1NZTkMgfCAoMSA8PCBCSU9fUldfTUVUQSksIDEsICZmaXJzdF9iaCk7CiAKIAlkYmxvY2srKzsKIAlleHRsZW4tLTsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvbW91bnQuYyBiL2ZzL2dmczIvbW91bnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlODUyNy4uMDAwMDAwMAotLS0gYS9mcy9nZnMyL21vdW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAotICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLSNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+Ci0KLSNpbmNsdWRlICJnZnMyLmgiCi0jaW5jbHVkZSAiaW5jb3JlLmgiCi0jaW5jbHVkZSAic3VwZXIuaCIKLSNpbmNsdWRlICJzeXMuaCIKLSNpbmNsdWRlICJ1dGlsLmgiCi0KLWVudW0gewotCU9wdF9sb2NrcHJvdG8sCi0JT3B0X2xvY2t0YWJsZSwKLQlPcHRfaG9zdGRhdGEsCi0JT3B0X3NwZWN0YXRvciwKLQlPcHRfaWdub3JlX2xvY2FsX2ZzLAotCU9wdF9sb2NhbGZsb2NrcywKLQlPcHRfbG9jYWxjYWNoaW5nLAotCU9wdF9kZWJ1ZywKLQlPcHRfbm9kZWJ1ZywKLQlPcHRfdXBncmFkZSwKLQlPcHRfYWNsLAotCU9wdF9ub2FjbCwKLQlPcHRfcXVvdGFfb2ZmLAotCU9wdF9xdW90YV9hY2NvdW50LAotCU9wdF9xdW90YV9vbiwKLQlPcHRfcXVvdGEsCi0JT3B0X25vcXVvdGEsCi0JT3B0X3N1aWRkaXIsCi0JT3B0X25vc3VpZGRpciwKLQlPcHRfZGF0YV93cml0ZWJhY2ssCi0JT3B0X2RhdGFfb3JkZXJlZCwKLQlPcHRfbWV0YSwKLQlPcHRfZGlzY2FyZCwKLQlPcHRfbm9kaXNjYXJkLAotCU9wdF9lcnIsCi19OwotCi1zdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7Ci0Je09wdF9sb2NrcHJvdG8sICJsb2NrcHJvdG89JXMifSwKLQl7T3B0X2xvY2t0YWJsZSwgImxvY2t0YWJsZT0lcyJ9LAotCXtPcHRfaG9zdGRhdGEsICJob3N0ZGF0YT0lcyJ9LAotCXtPcHRfc3BlY3RhdG9yLCAic3BlY3RhdG9yIn0sCi0Je09wdF9pZ25vcmVfbG9jYWxfZnMsICJpZ25vcmVfbG9jYWxfZnMifSwKLQl7T3B0X2xvY2FsZmxvY2tzLCAibG9jYWxmbG9ja3MifSwKLQl7T3B0X2xvY2FsY2FjaGluZywgImxvY2FsY2FjaGluZyJ9LAotCXtPcHRfZGVidWcsICJkZWJ1ZyJ9LAotCXtPcHRfbm9kZWJ1ZywgIm5vZGVidWcifSwKLQl7T3B0X3VwZ3JhZGUsICJ1cGdyYWRlIn0sCi0Je09wdF9hY2wsICJhY2wifSwKLQl7T3B0X25vYWNsLCAibm9hY2wifSwKLQl7T3B0X3F1b3RhX29mZiwgInF1b3RhPW9mZiJ9LAotCXtPcHRfcXVvdGFfYWNjb3VudCwgInF1b3RhPWFjY291bnQifSwKLQl7T3B0X3F1b3RhX29uLCAicXVvdGE9b24ifSwKLQl7T3B0X3F1b3RhLCAicXVvdGEifSwKLQl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCi0Je09wdF9zdWlkZGlyLCAic3VpZGRpciJ9LAotCXtPcHRfbm9zdWlkZGlyLCAibm9zdWlkZGlyIn0sCi0Je09wdF9kYXRhX3dyaXRlYmFjaywgImRhdGE9d3JpdGViYWNrIn0sCi0Je09wdF9kYXRhX29yZGVyZWQsICJkYXRhPW9yZGVyZWQifSwKLQl7T3B0X21ldGEsICJtZXRhIn0sCi0Je09wdF9kaXNjYXJkLCAiZGlzY2FyZCJ9LAotCXtPcHRfbm9kaXNjYXJkLCAibm9kaXNjYXJkIn0sCi0Je09wdF9lcnIsIE5VTEx9Ci19OwotCi0vKioKLSAqIGdmczJfbW91bnRfYXJncyAtIFBhcnNlIG1vdW50IG9wdGlvbnMKLSAqIEBzZHA6Ci0gKiBAZGF0YToKLSAqCi0gKiBSZXR1cm46IGVycm5vCi0gKi8KLQotaW50IGdmczJfbW91bnRfYXJncyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfYXJncyAqYXJncywgY2hhciAqb3B0aW9ucykKLXsKLQljaGFyICpvOwotCWludCB0b2tlbjsKLQlzdWJzdHJpbmdfdCB0bXBbTUFYX09QVF9BUkdTXTsKLQotCS8qIFNwbGl0IHRoZSBvcHRpb25zIGludG8gdG9rZW5zIHdpdGggdGhlICIsIiBjaGFyYWN0ZXIgYW5kCi0JICAgcHJvY2VzcyB0aGVtICovCi0KLQl3aGlsZSAoMSkgewotCQlvID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpOwotCQlpZiAobyA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCWlmICgqbyA9PSAnXDAnKQotCQkJY29udGludWU7Ci0KLQkJdG9rZW4gPSBtYXRjaF90b2tlbihvLCB0b2tlbnMsIHRtcCk7Ci0JCXN3aXRjaCAodG9rZW4pIHsKLQkJY2FzZSBPcHRfbG9ja3Byb3RvOgotCQkJbWF0Y2hfc3RybGNweShhcmdzLT5hcl9sb2NrcHJvdG8sICZ0bXBbMF0sCi0JCQkJICAgICAgR0ZTMl9MT0NLTkFNRV9MRU4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X2xvY2t0YWJsZToKLQkJCW1hdGNoX3N0cmxjcHkoYXJncy0+YXJfbG9ja3RhYmxlLCAmdG1wWzBdLAotCQkJCSAgICAgIEdGUzJfTE9DS05BTUVfTEVOKTsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9ob3N0ZGF0YToKLQkJCW1hdGNoX3N0cmxjcHkoYXJncy0+YXJfaG9zdGRhdGEsICZ0bXBbMF0sCi0JCQkJICAgICAgR0ZTMl9MT0NLTkFNRV9MRU4pOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X3NwZWN0YXRvcjoKLQkJCWFyZ3MtPmFyX3NwZWN0YXRvciA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBPcHRfaWdub3JlX2xvY2FsX2ZzOgotCQkJYXJncy0+YXJfaWdub3JlX2xvY2FsX2ZzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9sb2NhbGZsb2NrczoKLQkJCWFyZ3MtPmFyX2xvY2FsZmxvY2tzID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9sb2NhbGNhY2hpbmc6Ci0JCQlhcmdzLT5hcl9sb2NhbGNhY2hpbmcgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X2RlYnVnOgotCQkJYXJncy0+YXJfZGVidWcgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X25vZGVidWc6Ci0JCQlhcmdzLT5hcl9kZWJ1ZyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBPcHRfdXBncmFkZToKLQkJCWFyZ3MtPmFyX3VwZ3JhZGUgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X2FjbDoKLQkJCWFyZ3MtPmFyX3Bvc2l4X2FjbCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBPcHRfbm9hY2w6Ci0JCQlhcmdzLT5hcl9wb3NpeF9hY2wgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X3F1b3RhX29mZjoKLQkJY2FzZSBPcHRfbm9xdW90YToKLQkJCWFyZ3MtPmFyX3F1b3RhID0gR0ZTMl9RVU9UQV9PRkY7Ci0JCQlicmVhazsKLQkJY2FzZSBPcHRfcXVvdGFfYWNjb3VudDoKLQkJCWFyZ3MtPmFyX3F1b3RhID0gR0ZTMl9RVU9UQV9BQ0NPVU5UOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X3F1b3RhX29uOgotCQljYXNlIE9wdF9xdW90YToKLQkJCWFyZ3MtPmFyX3F1b3RhID0gR0ZTMl9RVU9UQV9PTjsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9zdWlkZGlyOgotCQkJYXJncy0+YXJfc3VpZGRpciA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBPcHRfbm9zdWlkZGlyOgotCQkJYXJncy0+YXJfc3VpZGRpciA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBPcHRfZGF0YV93cml0ZWJhY2s6Ci0JCQlhcmdzLT5hcl9kYXRhID0gR0ZTMl9EQVRBX1dSSVRFQkFDSzsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9kYXRhX29yZGVyZWQ6Ci0JCQlhcmdzLT5hcl9kYXRhID0gR0ZTMl9EQVRBX09SREVSRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBPcHRfbWV0YToKLQkJCWFyZ3MtPmFyX21ldGEgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X2Rpc2NhcmQ6Ci0JCQlhcmdzLT5hcl9kaXNjYXJkID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9ub2Rpc2NhcmQ6Ci0JCQlhcmdzLT5hcl9kaXNjYXJkID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIE9wdF9lcnI6Ci0JCWRlZmF1bHQ6Ci0JCQlmc19pbmZvKHNkcCwgImludmFsaWQgbW91bnQgb3B0aW9uOiAlc1xuIiwgbyk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19hZGRyZXNzLmggYi9mcy9nZnMyL29wc19hZGRyZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYTIxMjguLjAwMDAwMDAKLS0tIGEvZnMvZ2ZzMi9vcHNfYWRkcmVzcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgU2lzdGluYSBTb2Z0d2FyZSwgSW5jLiAgMTk5Ny0yMDAzIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNyBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgaXMgbWFkZSBhdmFpbGFibGUgdG8gYW55b25lIHdpc2hpbmcgdG8gdXNlLAotICogbW9kaWZ5LCBjb3B5LCBvciByZWRpc3RyaWJ1dGUgaXQgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfX09QU19BRERSRVNTX0RPVF9IX18KLSNkZWZpbmUgX19PUFNfQUREUkVTU19ET1RfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLQotZXh0ZXJuIGludCBnZnMyX3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnBfbWFzayk7Ci1leHRlcm4gaW50IGdmczJfaW50ZXJuYWxfcmVhZChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsCi0JCQkgICAgICBzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmFfc3RhdGUsCi0JCQkgICAgICBjaGFyICpidWYsIGxvZmZfdCAqcG9zLCB1bnNpZ25lZCBzaXplKTsKLWV4dGVybiB2b2lkIGdmczJfc2V0X2FvcHMoc3RydWN0IGlub2RlICppbm9kZSk7Ci0KLSNlbmRpZiAvKiBfX09QU19BRERSRVNTX0RPVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL2dmczIvb3BzX2ZzdHlwZS5jIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKaW5kZXggMWZmOTQ3My4uY2MzNGYyNyAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKKysrIGIvZnMvZ2ZzMi9vcHNfZnN0eXBlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbG93LXdvcmsuaD4KIAogI2luY2x1ZGUgImdmczIuaCIKICNpbmNsdWRlICJpbmNvcmUuaCIKQEAgLTU1LDggKzU2LDYgQEAKIAlzcGluX2xvY2tfaW5pdCgmZ3QtPmd0X3NwaW4pOwogCiAJZ3QtPmd0X2luY29yZV9sb2dfYmxvY2tzID0gMTAyNDsKLQlndC0+Z3RfbG9nX2ZsdXNoX3NlY3MgPSA2MDsKLQlndC0+Z3RfcmVjb3ZlcmRfc2VjcyA9IDYwOwogCWd0LT5ndF9sb2dkX3NlY3MgPSAxOwogCWd0LT5ndF9xdW90YV9zaW11bF9zeW5jID0gNjQ7CiAJZ3QtPmd0X3F1b3RhX3dhcm5fcGVyaW9kID0gMTA7CkBAIC01MjYsMTEgKzUyNSwxMSBAQAogCX0KIAogCS8qIFNldCB1cCB0aGUgYnVmZmVyIGNhY2hlIGFuZCBTQiBmb3IgcmVhbCAqLwotCWlmIChzZHAtPnNkX3NiLnNiX2JzaXplIDwgYmRldl9oYXJkc2VjdF9zaXplKHNiLT5zX2JkZXYpKSB7CisJaWYgKHNkcC0+c2Rfc2Iuc2JfYnNpemUgPCBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShzYi0+c19iZGV2KSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlmc19lcnIoc2RwLCAiRlMgYmxvY2sgc2l6ZSAoJXUpIGlzIHRvbyBzbWFsbCBmb3IgZGV2aWNlICIKIAkJICAgICAgICJibG9jayBzaXplICgldSlcbiIsCi0JCSAgICAgICBzZHAtPnNkX3NiLnNiX2JzaXplLCBiZGV2X2hhcmRzZWN0X3NpemUoc2ItPnNfYmRldikpOworCQkgICAgICAgc2RwLT5zZF9zYi5zYl9ic2l6ZSwgYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoc2ItPnNfYmRldikpOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKHNkcC0+c2Rfc2Iuc2JfYnNpemUgPiBQQUdFX1NJWkUpIHsKQEAgLTY3Niw2ICs2NzUsNyBAQAogCQkJYnJlYWs7CiAKIAkJSU5JVF9MSVNUX0hFQUQoJmpkLT5leHRlbnRfbGlzdCk7CisJCXNsb3dfd29ya19pbml0KCZqZC0+amRfd29yaywgJmdmczJfcmVjb3Zlcl9vcHMpOwogCQlqZC0+amRfaW5vZGUgPSBnZnMyX2xvb2t1cGkoc2RwLT5zZF9qaW5kZXgsICZuYW1lLCAxKTsKIAkJaWYgKCFqZC0+amRfaW5vZGUgfHwgSVNfRVJSKGpkLT5qZF9pbm9kZSkpIHsKIAkJCWlmICghamQtPmpkX2lub2RlKQpAQCAtNzAxLDE0ICs3MDEsMTMgQEAKIHsKIAlzdHJ1Y3QgaW5vZGUgKm1hc3RlciA9IHNkcC0+c2RfbWFzdGVyX2Rpci0+ZF9pbm9kZTsKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgamlfZ2g7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpwOwogCXN0cnVjdCBnZnMyX2lub2RlICppcDsKIAlpbnQgamluZGV4ID0gMTsKIAlpbnQgZXJyb3IgPSAwOwogCiAJaWYgKHVuZG8pIHsKIAkJamluZGV4ID0gMDsKLQkJZ290byBmYWlsX3JlY292ZXJkOworCQlnb3RvIGZhaWxfamlub2RlX2doOwogCX0KIAogCXNkcC0+c2RfamluZGV4ID0gZ2ZzMl9sb29rdXBfc2ltcGxlKG1hc3RlciwgImppbmRleCIpOwpAQCAtODAxLDE4ICs4MDAsOCBAQAogCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZqaV9naCk7CiAJamluZGV4ID0gMDsKIAotCXAgPSBrdGhyZWFkX3J1bihnZnMyX3JlY292ZXJkLCBzZHAsICJnZnMyX3JlY292ZXJkIik7Ci0JZXJyb3IgPSBJU19FUlIocCk7Ci0JaWYgKGVycm9yKSB7Ci0JCWZzX2VycihzZHAsICJjYW4ndCBzdGFydCByZWNvdmVyZCB0aHJlYWQ6ICVkXG4iLCBlcnJvcik7Ci0JCWdvdG8gZmFpbF9qaW5vZGVfZ2g7Ci0JfQotCXNkcC0+c2RfcmVjb3ZlcmRfcHJvY2VzcyA9IHA7Ci0KIAlyZXR1cm4gMDsKIAotZmFpbF9yZWNvdmVyZDoKLQlrdGhyZWFkX3N0b3Aoc2RwLT5zZF9yZWNvdmVyZF9wcm9jZXNzKTsKIGZhaWxfamlub2RlX2doOgogCWlmICghc2RwLT5zZF9hcmdzLmFyX3NwZWN0YXRvcikKIAkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnNkcC0+c2Rfamlub2RlX2doKTsKQEAgLTExNjUsNiArMTE1NCw3IEBACiAKIAlzZHAtPnNkX2FyZ3MuYXJfcXVvdGEgPSBHRlMyX1FVT1RBX0RFRkFVTFQ7CiAJc2RwLT5zZF9hcmdzLmFyX2RhdGEgPSBHRlMyX0RBVEFfREVGQVVMVDsKKwlzZHAtPnNkX2FyZ3MuYXJfY29tbWl0ID0gNjA7CiAKIAllcnJvciA9IGdmczJfbW91bnRfYXJncyhzZHAsICZzZHAtPnNkX2FyZ3MsIGRhdGEpOwogCWlmIChlcnJvcikgewpAQCAtMTE3Miw4ICsxMTYyLDEwIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAoc2RwLT5zZF9hcmdzLmFyX3NwZWN0YXRvcikKKwlpZiAoc2RwLT5zZF9hcmdzLmFyX3NwZWN0YXRvcikgewogICAgICAgICAgICAgICAgIHNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwkJc2V0X2JpdChTREZfTk9SRUNPVkVSWSwgJnNkcC0+c2RfZmxhZ3MpOworCX0KIAlpZiAoc2RwLT5zZF9hcmdzLmFyX3Bvc2l4X2FjbCkKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CiAKQEAgLTExOTEsNiArMTE4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZTMl9CQVNJQ19CTE9DS19TSElGVDsKIAlzZHAtPnNkX2ZzYjJiYiA9IDEgPDwgc2RwLT5zZF9mc2IyYmJfc2hpZnQ7CiAKKwlzZHAtPnNkX3R1bmUuZ3RfbG9nX2ZsdXNoX3NlY3MgPSBzZHAtPnNkX2FyZ3MuYXJfY29tbWl0OworCiAJZXJyb3IgPSBpbml0X25hbWVzKHNkcCwgc2lsZW50KTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZmFpbDsKQEAgLTEyNzksOSArMTI3MywyMiBAQAogCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGZpbGxfc3VwZXIsIG1udCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9nZnMyX3NiKGNvbnN0IGNoYXIgKmRldl9uYW1lKQorc3RhdGljIGludCB0ZXN0X21ldGFfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpwdHIpCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gcHRyOworCXJldHVybiAoYmRldiA9PSBzLT5zX2JkZXYpOworfQorCitzdGF0aWMgaW50IHNldF9tZXRhX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqcHRyKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGdmczJfZ2V0X3NiX21ldGEoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywKKwkJCSAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzOworCXN0cnVjdCBnZnMyX3NiZCAqc2RwOwogCXN0cnVjdCBwYXRoIHBhdGg7CiAJaW50IGVycm9yOwogCkBAIC0xMjg5LDMwICsxMjk2LDE3IEBACiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdGUzI6IHBhdGhfbG9va3VwIG9uICVzIHJldHVybmVkIGVycm9yICVkXG4iLAogCQkgICAgICAgZGV2X25hbWUsIGVycm9yKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBlcnJvcjsKIAl9Ci0Jc2IgPSBwYXRoLmRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKLQlpZiAoc2IgJiYgKHNiLT5zX3R5cGUgPT0gJmdmczJfZnNfdHlwZSkpCi0JCWF0b21pY19pbmMoJnNiLT5zX2FjdGl2ZSk7Ci0JZWxzZQotCQlzYiA9IE5VTEw7CisJcyA9IHNnZXQoJmdmczJfZnNfdHlwZSwgdGVzdF9tZXRhX3N1cGVyLCBzZXRfbWV0YV9zdXBlciwKKwkJIHBhdGguZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2JkZXYpOwogCXBhdGhfcHV0KCZwYXRoKTsKLQlyZXR1cm4gc2I7Ci19Ci0KLXN0YXRpYyBpbnQgZ2ZzMl9nZXRfc2JfbWV0YShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAotCQkJICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKLXsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gTlVMTDsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcDsKLQotCXNiID0gZ2V0X2dmczJfc2IoZGV2X25hbWUpOwotCWlmICghc2IpIHsKKwlpZiAoSVNfRVJSKHMpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdGUzI6IGdmczIgbW91bnQgZG9lcyBub3QgZXhpc3RcbiIpOwotCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0dXJuIFBUUl9FUlIocyk7CiAJfQotCXNkcCA9IHNiLT5zX2ZzX2luZm87Ci0JbW50LT5tbnRfc2IgPSBzYjsKKwlzZHAgPSBzLT5zX2ZzX2luZm87CisJbW50LT5tbnRfc2IgPSBzOwogCW1udC0+bW50X3Jvb3QgPSBkZ2V0KHNkcC0+c2RfbWFzdGVyX2Rpcik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9nZnMyL29wc19pbm9kZS5jIGIvZnMvZ2ZzMi9vcHNfaW5vZGUuYwppbmRleCAxYzcwZmE1Li5mOGJkMjBiIDEwMDY0NAotLS0gYS9mcy9nZnMyL29wc19pbm9kZS5jCisrKyBiL2ZzL2dmczIvb3BzX2lub2RlLmMKQEAgLTI2Miw2ICsyNjIsNDQgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKKy8qCisgKiBnZnMyX3VubGlua19vayAtIGNoZWNrIHRvIHNlZSB0aGF0IGEgaW5vZGUgaXMgc3RpbGwgaW4gYSBkaXJlY3RvcnkKKyAqIEBkaXA6IHRoZSBkaXJlY3RvcnkKKyAqIEBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgZmlsZQorICogQGlwOiB0aGUgaW5vZGUKKyAqCisgKiBBc3N1bWVzIHRoYXQgdGhlIGxvY2sgb24gKGF0IGxlYXN0KSBAZGlwIGlzIGhlbGQuCisgKgorICogUmV0dXJuczogMCBpZiB0aGUgcGFyZW50L2NoaWxkIHJlbGF0aW9uc2hpcCBpcyBjb3JyZWN0LCBlcnJubyBpZiBpdCBpc24ndAorICovCisKK3N0YXRpYyBpbnQgZ2ZzMl91bmxpbmtfb2soc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCisJCQkgIGNvbnN0IHN0cnVjdCBnZnMyX2lub2RlICppcCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoSVNfSU1NVVRBQkxFKCZpcC0+aV9pbm9kZSkgfHwgSVNfQVBQRU5EKCZpcC0+aV9pbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoKGRpcC0+aV9pbm9kZS5pX21vZGUgJiBTX0lTVlRYKSAmJgorCSAgICBkaXAtPmlfaW5vZGUuaV91aWQgIT0gY3VycmVudF9mc3VpZCgpICYmCisJICAgIGlwLT5pX2lub2RlLmlfdWlkICE9IGN1cnJlbnRfZnN1aWQoKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChJU19BUFBFTkQoJmRpcC0+aV9pbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwllcnJvciA9IGdmczJfcGVybWlzc2lvbigmZGlwLT5pX2lub2RlLCBNQVlfV1JJVEUgfCBNQVlfRVhFQyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGdmczJfZGlyX2NoZWNrKCZkaXAtPmlfaW5vZGUsIG5hbWUsIGlwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiAwOworfQorCiAvKioKICAqIGdmczJfdW5saW5rIC0gVW5saW5rIGEgZmlsZQogICogQGRpcjogVGhlIGlub2RlIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZmlsZSB0byB1bmxpbmsKQEAgLTQ3Myw2ICs1MTEsNTkgQEAKIH0KIAogLyoqCisgKiBnZnMyX3JtZGlyaSAtIFJlbW92ZSBhIGRpcmVjdG9yeQorICogQGRpcDogVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSByZW1vdmVkCisgKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSByZW1vdmVkCisgKiBAaXA6IFRoZSBHRlMyIGlub2RlIG9mIHRoZSBkaXJlY3RvcnkgdG8gYmUgcmVtb3ZlZAorICoKKyAqIEFzc3VtZXMgR2xvY2tzIG9uIGRpcCBhbmQgaXAgYXJlIGhlbGQKKyAqCisgKiBSZXR1cm5zOiBlcnJubworICovCisKK3N0YXRpYyBpbnQgZ2ZzMl9ybWRpcmkoc3RydWN0IGdmczJfaW5vZGUgKmRpcCwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsCisJCSAgICAgICBzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCit7CisJc3RydWN0IHFzdHIgZG90bmFtZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoaXAtPmlfZW50cmllcyAhPSAyKSB7CisJCWlmIChnZnMyX2NvbnNpc3RfaW5vZGUoaXApKQorCQkJZ2ZzMl9kaW5vZGVfcHJpbnQoaXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwllcnJvciA9IGdmczJfZGlyX2RlbChkaXAsIG5hbWUpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBnZnMyX2NoYW5nZV9ubGluayhkaXAsIC0xKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWdmczJfc3RyMnFzdHIoJmRvdG5hbWUsICIuIik7CisJZXJyb3IgPSBnZnMyX2Rpcl9kZWwoaXAsICZkb3RuYW1lKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWdmczJfc3RyMnFzdHIoJmRvdG5hbWUsICIuLiIpOworCWVycm9yID0gZ2ZzMl9kaXJfZGVsKGlwLCAmZG90bmFtZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBJdCBsb29rcyBvZGQsIGJ1dCBpdCByZWFsbHkgc2hvdWxkIGJlIGRvbmUgdHdpY2UgKi8KKwllcnJvciA9IGdmczJfY2hhbmdlX25saW5rKGlwLCAtMSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGdmczJfY2hhbmdlX25saW5rKGlwLCAtMSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgogICogZ2ZzMl9ybWRpciAtIFJlbW92ZSBhIGRpcmVjdG9yeQogICogQGRpcjogVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGRpcmVjdG9yeSB0byBiZSByZW1vdmVkCiAgKiBAZGVudHJ5OiBUaGUgZGVudHJ5IG9mIHRoZSBkaXJlY3RvcnkgdG8gcmVtb3ZlCkBAIC04ODUsNiArOTc2LDYxIEBACiB9CiAKIC8qKgorICogZ2ZzMl9yZWFkbGlua2kgLSByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIGEgc3ltbGluaworICogQGlwOiB0aGUgc3ltbGluaydzIGlub2RlCisgKiBAYnVmOiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBiZSBmaWxsZWQKKyAqIEBsZW46IGEgcG9pbnRlciB0byB0aGUgbGVuZ3RoIG9mIEBidWYKKyAqCisgKiBJZiBAYnVmIGlzIHRvbyBzbWFsbCwgYSBwaWVjZSBvZiBtZW1vcnkgaXMga21hbGxvYygpZWQgYW5kIG5lZWRzCisgKiB0byBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIFJldHVybnM6IGVycm5vCisgKi8KKworc3RhdGljIGludCBnZnMyX3JlYWRsaW5raShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGNoYXIgKipidWYsIHVuc2lnbmVkIGludCAqbGVuKQoreworCXN0cnVjdCBnZnMyX2hvbGRlciBpX2doOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZGliaDsKKwl1bnNpZ25lZCBpbnQgeDsKKwlpbnQgZXJyb3I7CisKKwlnZnMyX2hvbGRlcl9pbml0KGlwLT5pX2dsLCBMTV9TVF9TSEFSRUQsIDAsICZpX2doKTsKKwllcnJvciA9IGdmczJfZ2xvY2tfbnEoJmlfZ2gpOworCWlmIChlcnJvcikgeworCQlnZnMyX2hvbGRlcl91bmluaXQoJmlfZ2gpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJaWYgKCFpcC0+aV9kaXNrc2l6ZSkgeworCQlnZnMyX2NvbnNpc3RfaW5vZGUoaXApOworCQllcnJvciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmRpYmgpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwl4ID0gaXAtPmlfZGlza3NpemUgKyAxOworCWlmICh4ID4gKmxlbikgeworCQkqYnVmID0ga21hbGxvYyh4LCBHRlBfTk9GUyk7CisJCWlmICghKmJ1ZikgeworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJZ290byBvdXRfYnJlbHNlOworCQl9CisJfQorCisJbWVtY3B5KCpidWYsIGRpYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZ2ZzMl9kaW5vZGUpLCB4KTsKKwkqbGVuID0geDsKKworb3V0X2JyZWxzZToKKwlicmVsc2UoZGliaCk7CitvdXQ6CisJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmlfZ2gpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCiAgKiBnZnMyX3JlYWRsaW5rIC0gUmVhZCB0aGUgdmFsdWUgb2YgYSBzeW1saW5rCiAgKiBAZGVudHJ5OiB0aGUgc3ltbGluawogICogQGJ1ZjogdGhlIGJ1ZmZlciB0byByZWFkIHRoZSBzeW1saW5rIGRhdGEgaW50bwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9vcHNfc3VwZXIuYyBiL2ZzL2dmczIvb3BzX3N1cGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODAxOTUuLjAwMDAwMDAKLS0tIGEvZnMvZ2ZzMi9vcHNfc3VwZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDcyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBTaXN0aW5hIFNvZnR3YXJlLCBJbmMuICAxOTk3LTIwMDMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA4IFJlZCBIYXQsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBjb3B5cmlnaHRlZCBtYXRlcmlhbCBpcyBtYWRlIGF2YWlsYWJsZSB0byBhbnlvbmUgd2lzaGluZyB0byB1c2UsCi0gKiBtb2RpZnksIGNvcHksIG9yIHJlZGlzdHJpYnV0ZSBpdCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KLSNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLQotI2luY2x1ZGUgImdmczIuaCIKLSNpbmNsdWRlICJpbmNvcmUuaCIKLSNpbmNsdWRlICJnbG9jay5oIgotI2luY2x1ZGUgImlub2RlLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAicXVvdGEuaCIKLSNpbmNsdWRlICJyZWNvdmVyeS5oIgotI2luY2x1ZGUgInJncnAuaCIKLSNpbmNsdWRlICJzdXBlci5oIgotI2luY2x1ZGUgInN5cy5oIgotI2luY2x1ZGUgInV0aWwuaCIKLSNpbmNsdWRlICJ0cmFucy5oIgotI2luY2x1ZGUgImRpci5oIgotI2luY2x1ZGUgImVhdHRyLmgiCi0jaW5jbHVkZSAiYm1hcC5oIgotI2luY2x1ZGUgIm1ldGFfaW8uaCIKLQotI2RlZmluZSBhcmdzX25lcShhMSwgYTIsIHgpICgoYTEpLT5hcl8jI3ggIT0gKGEyKS0+YXJfIyN4KQotCi0vKioKLSAqIGdmczJfd3JpdGVfaW5vZGUgLSBNYWtlIHN1cmUgdGhlIGlub2RlIGlzIHN0YWJsZSBvbiB0aGUgZGlzawotICogQGlub2RlOiBUaGUgaW5vZGUKLSAqIEBzeW5jOiBzeW5jaHJvbm91cyB3cml0ZSBmbGFnCi0gKgotICogUmV0dXJuczogZXJybm8KLSAqLwotCi1zdGF0aWMgaW50IGdmczJfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHN5bmMpCi17Ci0Jc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoaW5vZGUpOwotCXN0cnVjdCBnZnMyX2hvbGRlciBnaDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCXN0cnVjdCB0aW1lc3BlYyBhdGltZTsKLQlzdHJ1Y3QgZ2ZzMl9kaW5vZGUgKmRpOwotCWludCByZXQgPSAwOwotCi0JLyogQ2hlY2sgdGhpcyBpcyBhICJub3JtYWwiIGlub2RlLCBldGMgKi8KLQlpZiAoIXRlc3RfYml0KEdJRl9VU0VSLCAmaXAtPmlfZmxhZ3MpIHx8Ci0JICAgIChjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkKLQkJcmV0dXJuIDA7Ci0JcmV0ID0gZ2ZzMl9nbG9ja19ucV9pbml0KGlwLT5pX2dsLCBMTV9TVF9FWENMVVNJVkUsIDAsICZnaCk7Ci0JaWYgKHJldCkKLQkJZ290byBkb19mbHVzaDsKLQlyZXQgPSBnZnMyX3RyYW5zX2JlZ2luKHNkcCwgUkVTX0RJTk9ERSwgMCk7Ci0JaWYgKHJldCkKLQkJZ290byBkb191bmxvY2s7Ci0JcmV0ID0gZ2ZzMl9tZXRhX2lub2RlX2J1ZmZlcihpcCwgJmJoKTsKLQlpZiAocmV0ID09IDApIHsKLQkJZGkgPSAoc3RydWN0IGdmczJfZGlub2RlICopYmgtPmJfZGF0YTsKLQkJYXRpbWUudHZfc2VjID0gYmU2NF90b19jcHUoZGktPmRpX2F0aW1lKTsKLQkJYXRpbWUudHZfbnNlYyA9IGJlMzJfdG9fY3B1KGRpLT5kaV9hdGltZV9uc2VjKTsKLQkJaWYgKHRpbWVzcGVjX2NvbXBhcmUoJmlub2RlLT5pX2F0aW1lLCAmYXRpbWUpID4gMCkgewotCQkJZ2ZzMl90cmFuc19hZGRfYmgoaXAtPmlfZ2wsIGJoLCAxKTsKLQkJCWdmczJfZGlub2RlX291dChpcCwgYmgtPmJfZGF0YSk7Ci0JCX0KLQkJYnJlbHNlKGJoKTsKLQl9Ci0JZ2ZzMl90cmFuc19lbmQoc2RwKTsKLWRvX3VubG9jazoKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOwotZG9fZmx1c2g6Ci0JaWYgKHN5bmMgIT0gMCkKLQkJZ2ZzMl9sb2dfZmx1c2goR0ZTMl9TQihpbm9kZSksIGlwLT5pX2dsKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGdmczJfbWFrZV9mc19ybyAtIFR1cm4gYSBSZWFkLVdyaXRlIEZTIGludG8gYSBSZWFkLU9ubHkgb25lCi0gKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQotICoKLSAqIFJldHVybnM6IGVycm5vCi0gKi8KLQotc3RhdGljIGludCBnZnMyX21ha2VfZnNfcm8oc3RydWN0IGdmczJfc2JkICpzZHApCi17Ci0Jc3RydWN0IGdmczJfaG9sZGVyIHRfZ2g7Ci0JaW50IGVycm9yOwotCi0JZ2ZzMl9xdW90YV9zeW5jKHNkcCk7Ci0JZ2ZzMl9zdGF0ZnNfc3luYyhzZHApOwotCi0JZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoc2RwLT5zZF90cmFuc19nbCwgTE1fU1RfU0hBUkVELCBHTF9OT0NBQ0hFLAotCQkJCSAgICZ0X2doKTsKLQlpZiAoZXJyb3IgJiYgIXRlc3RfYml0KFNERl9TSFVURE9XTiwgJnNkcC0+c2RfZmxhZ3MpKQotCQlyZXR1cm4gZXJyb3I7Ci0KLQlnZnMyX21ldGFfc3luY2ZzKHNkcCk7Ci0JZ2ZzMl9sb2dfc2h1dGRvd24oc2RwKTsKLQotCWNsZWFyX2JpdChTREZfSk9VUk5BTF9MSVZFLCAmc2RwLT5zZF9mbGFncyk7Ci0KLQlpZiAodF9naC5naF9nbCkKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnRfZ2gpOwotCi0JZ2ZzMl9xdW90YV9jbGVhbnVwKHNkcCk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qKgotICogZ2ZzMl9wdXRfc3VwZXIgLSBVbm1vdW50IHRoZSBmaWxlc3lzdGVtCi0gKiBAc2I6IFRoZSBWRlMgc3VwZXJibG9jawotICoKLSAqLwotCi1zdGF0aWMgdm9pZCBnZnMyX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQotewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItPnNfZnNfaW5mbzsKLQlpbnQgZXJyb3I7Ci0KLQkvKiAgVW5mcmVlemUgdGhlIGZpbGVzeXN0ZW0sIGlmIHdlIG5lZWQgdG8gICovCi0KLQltdXRleF9sb2NrKCZzZHAtPnNkX2ZyZWV6ZV9sb2NrKTsKLQlpZiAoc2RwLT5zZF9mcmVlemVfY291bnQpCi0JCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZzZHAtPnNkX2ZyZWV6ZV9naCk7Ci0JbXV0ZXhfdW5sb2NrKCZzZHAtPnNkX2ZyZWV6ZV9sb2NrKTsKLQotCWt0aHJlYWRfc3RvcChzZHAtPnNkX3F1b3RhZF9wcm9jZXNzKTsKLQlrdGhyZWFkX3N0b3Aoc2RwLT5zZF9sb2dkX3Byb2Nlc3MpOwotCWt0aHJlYWRfc3RvcChzZHAtPnNkX3JlY292ZXJkX3Byb2Nlc3MpOwotCi0JaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0JCWVycm9yID0gZ2ZzMl9tYWtlX2ZzX3JvKHNkcCk7Ci0JCWlmIChlcnJvcikKLQkJCWdmczJfaW9fZXJyb3Ioc2RwKTsKLQl9Ci0JLyogIEF0IHRoaXMgcG9pbnQsIHdlJ3JlIHRocm91Z2ggbW9kaWZ5aW5nIHRoZSBkaXNrICAqLwotCi0JLyogIFJlbGVhc2Ugc3R1ZmYgICovCi0KLQlpcHV0KHNkcC0+c2RfamluZGV4KTsKLQlpcHV0KHNkcC0+c2RfaW51bV9pbm9kZSk7Ci0JaXB1dChzZHAtPnNkX3N0YXRmc19pbm9kZSk7Ci0JaXB1dChzZHAtPnNkX3JpbmRleCk7Ci0JaXB1dChzZHAtPnNkX3F1b3RhX2lub2RlKTsKLQotCWdmczJfZ2xvY2tfcHV0KHNkcC0+c2RfcmVuYW1lX2dsKTsKLQlnZnMyX2dsb2NrX3B1dChzZHAtPnNkX3RyYW5zX2dsKTsKLQotCWlmICghc2RwLT5zZF9hcmdzLmFyX3NwZWN0YXRvcikgewotCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmc2RwLT5zZF9qb3VybmFsX2doKTsKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnNkcC0+c2Rfamlub2RlX2doKTsKLQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnNkcC0+c2RfaXJfZ2gpOwotCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmc2RwLT5zZF9zY19naCk7Ci0JCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZzZHAtPnNkX3FjX2doKTsKLQkJaXB1dChzZHAtPnNkX2lyX2lub2RlKTsKLQkJaXB1dChzZHAtPnNkX3NjX2lub2RlKTsKLQkJaXB1dChzZHAtPnNkX3FjX2lub2RlKTsKLQl9Ci0KLQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmc2RwLT5zZF9saXZlX2doKTsKLQlnZnMyX2NsZWFyX3JncnBkKHNkcCk7Ci0JZ2ZzMl9qaW5kZXhfZnJlZShzZHApOwotCS8qICBUYWtlIGFwYXJ0IGdsb2NrIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlciBsaXN0cyAgKi8KLQlnZnMyX2dsX2hhc2hfY2xlYXIoc2RwKTsKLQkvKiAgVW5tb3VudCB0aGUgbG9ja2luZyBwcm90b2NvbCAgKi8KLQlnZnMyX2xtX3VubW91bnQoc2RwKTsKLQotCS8qICBBdCB0aGlzIHBvaW50LCB3ZSdyZSB0aHJvdWdoIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGxvY2tzcGFjZSAgKi8KLQlnZnMyX3N5c19mc19kZWwoc2RwKTsKLX0KLQotLyoqCi0gKiBnZnMyX3dyaXRlX3N1cGVyCi0gKiBAc2I6IHRoZSBzdXBlcmJsb2NrCi0gKgotICovCi0KLXN0YXRpYyB2b2lkIGdmczJfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzYi0+c19kaXJ0ID0gMDsKLX0KLQotLyoqCi0gKiBnZnMyX3N5bmNfZnMgLSBzeW5jIHRoZSBmaWxlc3lzdGVtCi0gKiBAc2I6IHRoZSBzdXBlcmJsb2NrCi0gKgotICogRmx1c2hlcyB0aGUgbG9nIHRvIGRpc2suCi0gKi8KLQotc3RhdGljIGludCBnZnMyX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCi17Ci0Jc2ItPnNfZGlydCA9IDA7Ci0JaWYgKHdhaXQgJiYgc2ItPnNfZnNfaW5mbykKLQkJZ2ZzMl9sb2dfZmx1c2goc2ItPnNfZnNfaW5mbywgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9mcmVlemUgLSBwcmV2ZW50IGZ1cnRoZXIgd3JpdGVzIHRvIHRoZSBmaWxlc3lzdGVtCi0gKiBAc2I6IHRoZSBWRlMgc3RydWN0dXJlIGZvciB0aGUgZmlsZXN5c3RlbQotICoKLSAqLwotCi1zdGF0aWMgaW50IGdmczJfZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBzYi0+c19mc19pbmZvOwotCWludCBlcnJvcjsKLQotCWlmICh0ZXN0X2JpdChTREZfU0hVVERPV04sICZzZHAtPnNkX2ZsYWdzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3IgKDs7KSB7Ci0JCWVycm9yID0gZ2ZzMl9mcmVlemVfZnMoc2RwKTsKLQkJaWYgKCFlcnJvcikKLQkJCWJyZWFrOwotCi0JCXN3aXRjaCAoZXJyb3IpIHsKLQkJY2FzZSAtRUJVU1k6Ci0JCQlmc19lcnIoc2RwLCAid2FpdGluZyBmb3IgcmVjb3ZlcnkgYmVmb3JlIGZyZWV6ZVxuIik7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZnNfZXJyKHNkcCwgImVycm9yIGZyZWV6aW5nIEZTOiAlZFxuIiwgZXJyb3IpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlmc19lcnIoc2RwLCAicmV0cnlpbmcuLi5cbiIpOwotCQltc2xlZXAoMTAwMCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGdmczJfdW5mcmVlemUgLSByZWFsbG93IHdyaXRlcyB0byB0aGUgZmlsZXN5c3RlbQotICogQHNiOiB0aGUgVkZTIHN0cnVjdHVyZSBmb3IgdGhlIGZpbGVzeXN0ZW0KLSAqCi0gKi8KLQotc3RhdGljIGludCBnZnMyX3VuZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCi17Ci0JZ2ZzMl91bmZyZWV6ZV9mcyhzYi0+c19mc19pbmZvKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBzdGF0ZnNfZmlsbCAtIGZpbGwgaW4gdGhlIHNnIGZvciBhIGdpdmVuIFJHCi0gKiBAcmdkOiB0aGUgUkcKLSAqIEBzYzogdGhlIHNjIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVTVEFMRSBpZiB0aGUgTFZCIGlzIGludmFsaWQKLSAqLwotCi1zdGF0aWMgaW50IHN0YXRmc19zbG93X2ZpbGwoc3RydWN0IGdmczJfcmdycGQgKnJnZCwKLQkJCSAgICBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQotewotCWdmczJfcmdycF92ZXJpZnkocmdkKTsKLQlzYy0+c2NfdG90YWwgKz0gcmdkLT5yZF9kYXRhOwotCXNjLT5zY19mcmVlICs9IHJnZC0+cmRfZnJlZTsKLQlzYy0+c2NfZGlub2RlcyArPSByZ2QtPnJkX2Rpbm9kZXM7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9zdGF0ZnNfc2xvdyAtIFN0YXQgYSBmaWxlc3lzdGVtIHVzaW5nIGFzeW5jaHJvbm91cyBsb2NraW5nCi0gKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQotICogQHNjOiB0aGUgc2MgaW5mbyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQKLSAqCi0gKiBBbnkgZXJyb3IgKG90aGVyIHRoYW4gYSBzaWduYWwpIHdpbGwgY2F1c2UgdGhpcyByb3V0aW5lIHRvIGZhbGwgYmFjawotICogdG8gdGhlIHN5bmNocm9ub3VzIHZlcnNpb24uCi0gKgotICogRklYTUU6IFRoaXMgcmVhbGx5IHNob3VsZG4ndCBidXN5IHdhaXQgbGlrZSB0aGlzLgotICoKLSAqIFJldHVybnM6IGVycm5vCi0gKi8KLQotc3RhdGljIGludCBnZnMyX3N0YXRmc19zbG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQotewotCXN0cnVjdCBnZnMyX2hvbGRlciByaV9naDsKLQlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkX25leHQ7Ci0Jc3RydWN0IGdmczJfaG9sZGVyICpnaGEsICpnaDsKLQl1bnNpZ25lZCBpbnQgc2xvdHMgPSA2NDsKLQl1bnNpZ25lZCBpbnQgeDsKLQlpbnQgZG9uZTsKLQlpbnQgZXJyb3IgPSAwLCBlcnI7Ci0KLQltZW1zZXQoc2MsIDAsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QpKTsKLQlnaGEgPSBrY2FsbG9jKHNsb3RzLCBzaXplb2Yoc3RydWN0IGdmczJfaG9sZGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFnaGEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJnJpX2doKTsKLQlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0OwotCi0JcmdkX25leHQgPSBnZnMyX3JncnBkX2dldF9maXJzdChzZHApOwotCi0JZm9yICg7OykgewotCQlkb25lID0gMTsKLQotCQlmb3IgKHggPSAwOyB4IDwgc2xvdHM7IHgrKykgewotCQkJZ2ggPSBnaGEgKyB4OwotCi0JCQlpZiAoZ2gtPmdoX2dsICYmIGdmczJfZ2xvY2tfcG9sbChnaCkpIHsKLQkJCQllcnIgPSBnZnMyX2dsb2NrX3dhaXQoZ2gpOwotCQkJCWlmIChlcnIpIHsKLQkJCQkJZ2ZzMl9ob2xkZXJfdW5pbml0KGdoKTsKLQkJCQkJZXJyb3IgPSBlcnI7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKCFlcnJvcikKLQkJCQkJCWVycm9yID0gc3RhdGZzX3Nsb3dfZmlsbCgKLQkJCQkJCQlnaC0+Z2hfZ2wtPmdsX29iamVjdCwgc2MpOwotCQkJCQlnZnMyX2dsb2NrX2RxX3VuaW5pdChnaCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoZ2gtPmdoX2dsKQotCQkJCWRvbmUgPSAwOwotCQkJZWxzZSBpZiAocmdkX25leHQgJiYgIWVycm9yKSB7Ci0JCQkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQocmdkX25leHQtPnJkX2dsLAotCQkJCQkJCSAgIExNX1NUX1NIQVJFRCwKLQkJCQkJCQkgICBHTF9BU1lOQywKLQkJCQkJCQkgICBnaCk7Ci0JCQkJcmdkX25leHQgPSBnZnMyX3JncnBkX2dldF9uZXh0KHJnZF9uZXh0KTsKLQkJCQlkb25lID0gMDsKLQkJCX0KLQotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCWVycm9yID0gLUVSRVNUQVJUU1lTOwotCQl9Ci0KLQkJaWYgKGRvbmUpCi0JCQlicmVhazsKLQotCQl5aWVsZCgpOwotCX0KLQotCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZyaV9naCk7Ci0KLW91dDoKLQlrZnJlZShnaGEpOwotCXJldHVybiBlcnJvcjsKLX0KLQotLyoqCi0gKiBnZnMyX3N0YXRmc19pIC0gRG8gYSBzdGF0ZnMKLSAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCi0gKiBAc2c6IHRoZSBzZyBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLXN0YXRpYyBpbnQgZ2ZzMl9zdGF0ZnNfaShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKLXsKLQlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKm1fc2MgPSAmc2RwLT5zZF9zdGF0ZnNfbWFzdGVyOwotCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbF9zYyA9ICZzZHAtPnNkX3N0YXRmc19sb2NhbDsKLQotCXNwaW5fbG9jaygmc2RwLT5zZF9zdGF0ZnNfc3Bpbik7Ci0KLQkqc2MgPSAqbV9zYzsKLQlzYy0+c2NfdG90YWwgKz0gbF9zYy0+c2NfdG90YWw7Ci0Jc2MtPnNjX2ZyZWUgKz0gbF9zYy0+c2NfZnJlZTsKLQlzYy0+c2NfZGlub2RlcyArPSBsX3NjLT5zY19kaW5vZGVzOwotCi0Jc3Bpbl91bmxvY2soJnNkcC0+c2Rfc3RhdGZzX3NwaW4pOwotCi0JaWYgKHNjLT5zY19mcmVlIDwgMCkKLQkJc2MtPnNjX2ZyZWUgPSAwOwotCWlmIChzYy0+c2NfZnJlZSA+IHNjLT5zY190b3RhbCkKLQkJc2MtPnNjX2ZyZWUgPSBzYy0+c2NfdG90YWw7Ci0JaWYgKHNjLT5zY19kaW5vZGVzIDwgMCkKLQkJc2MtPnNjX2Rpbm9kZXMgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9zdGF0ZnMgLSBHYXRoZXIgYW5kIHJldHVybiBzdGF0cyBhYm91dCB0aGUgZmlsZXN5c3RlbQotICogQHNiOiBUaGUgc3VwZXJibG9jawotICogQHN0YXRmc2J1ZjogVGhlIGJ1ZmZlcgotICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzcyBvciBlcnJvciBjb2RlCi0gKi8KLQotc3RhdGljIGludCBnZnMyX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLT5zX2ZzX2luZm87Ci0Jc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNjOwotCWludCBlcnJvcjsKLQotCWlmIChnZnMyX3R1bmVfZ2V0KHNkcCwgZ3Rfc3RhdGZzX3Nsb3cpKQotCQllcnJvciA9IGdmczJfc3RhdGZzX3Nsb3coc2RwLCAmc2MpOwotCWVsc2UKLQkJZXJyb3IgPSBnZnMyX3N0YXRmc19pKHNkcCwgJnNjKTsKLQotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JYnVmLT5mX3R5cGUgPSBHRlMyX01BR0lDOwotCWJ1Zi0+Zl9ic2l6ZSA9IHNkcC0+c2Rfc2Iuc2JfYnNpemU7Ci0JYnVmLT5mX2Jsb2NrcyA9IHNjLnNjX3RvdGFsOwotCWJ1Zi0+Zl9iZnJlZSA9IHNjLnNjX2ZyZWU7Ci0JYnVmLT5mX2JhdmFpbCA9IHNjLnNjX2ZyZWU7Ci0JYnVmLT5mX2ZpbGVzID0gc2Muc2NfZGlub2RlcyArIHNjLnNjX2ZyZWU7Ci0JYnVmLT5mX2ZmcmVlID0gc2Muc2NfZnJlZTsKLQlidWYtPmZfbmFtZWxlbiA9IEdGUzJfRk5BTUVTSVpFOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZ2ZzMl9yZW1vdW50X2ZzIC0gY2FsbGVkIHdoZW4gdGhlIEZTIGlzIHJlbW91bnRlZAotICogQHNiOiAgdGhlIGZpbGVzeXN0ZW0KLSAqIEBmbGFnczogIHRoZSByZW1vdW50IGZsYWdzCi0gKiBAZGF0YTogIGV4dHJhIGRhdGEgcGFzc2VkIGluIChub3QgdXNlZCByaWdodCBub3cpCi0gKgotICogUmV0dXJuczogZXJybm8KLSAqLwotCi1zdGF0aWMgaW50IGdmczJfcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQotewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItPnNfZnNfaW5mbzsKLQlzdHJ1Y3QgZ2ZzMl9hcmdzIGFyZ3MgPSBzZHAtPnNkX2FyZ3M7IC8qIERlZmF1bHQgdG8gY3VycmVudCBzZXR0aW5ncyAqLwotCWludCBlcnJvcjsKLQotCWVycm9yID0gZ2ZzMl9tb3VudF9hcmdzKHNkcCwgJmFyZ3MsIGRhdGEpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCi0JLyogTm90IGFsbG93ZWQgdG8gY2hhbmdlIGxvY2tpbmcgZGV0YWlscyAqLwotCWlmIChzdHJjbXAoYXJncy5hcl9sb2NrcHJvdG8sIHNkcC0+c2RfYXJncy5hcl9sb2NrcHJvdG8pIHx8Ci0JICAgIHN0cmNtcChhcmdzLmFyX2xvY2t0YWJsZSwgc2RwLT5zZF9hcmdzLmFyX2xvY2t0YWJsZSkgfHwKLQkgICAgc3RyY21wKGFyZ3MuYXJfaG9zdGRhdGEsIHNkcC0+c2RfYXJncy5hcl9ob3N0ZGF0YSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogU29tZSBmbGFncyBtdXN0IG5vdCBiZSBjaGFuZ2VkICovCi0JaWYgKGFyZ3NfbmVxKCZhcmdzLCAmc2RwLT5zZF9hcmdzLCBzcGVjdGF0b3IpIHx8Ci0JICAgIGFyZ3NfbmVxKCZhcmdzLCAmc2RwLT5zZF9hcmdzLCBpZ25vcmVfbG9jYWxfZnMpIHx8Ci0JICAgIGFyZ3NfbmVxKCZhcmdzLCAmc2RwLT5zZF9hcmdzLCBsb2NhbGZsb2NrcykgfHwKLQkgICAgYXJnc19uZXEoJmFyZ3MsICZzZHAtPnNkX2FyZ3MsIGxvY2FsY2FjaGluZykgfHwKLQkgICAgYXJnc19uZXEoJmFyZ3MsICZzZHAtPnNkX2FyZ3MsIG1ldGEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChzZHAtPnNkX2FyZ3MuYXJfc3BlY3RhdG9yKQotCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOwotCi0JaWYgKChzYi0+c19mbGFncyBeICpmbGFncykgJiBNU19SRE9OTFkpIHsKLQkJaWYgKCpmbGFncyAmIE1TX1JET05MWSkKLQkJCWVycm9yID0gZ2ZzMl9tYWtlX2ZzX3JvKHNkcCk7Ci0JCWVsc2UKLQkJCWVycm9yID0gZ2ZzMl9tYWtlX2ZzX3J3KHNkcCk7Ci0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKLQl9Ci0KLQlzZHAtPnNkX2FyZ3MgPSBhcmdzOwotCWlmIChzZHAtPnNkX2FyZ3MuYXJfcG9zaXhfYWNsKQotCQlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKLQllbHNlCi0JCXNiLT5zX2ZsYWdzICY9IH5NU19QT1NJWEFDTDsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBnZnMyX2Ryb3BfaW5vZGUgLSBEcm9wIGFuIGlub2RlICh0ZXN0IGZvciByZW1vdGUgdW5saW5rKQotICogQGlub2RlOiBUaGUgaW5vZGUgdG8gZHJvcAotICoKLSAqIElmIHdlJ3ZlIHJlY2VpdmVkIGEgY2FsbGJhY2sgb24gYW4gaW9wZW4gbG9jayB0aGVuIGl0cyBiZWNhdXNlIGEKLSAqIHJlbW90ZSBub2RlIHRyaWVkIHRvIGRlYWxsb2NhdGUgdGhlIGlub2RlIGJ1dCBmYWlsZWQgZHVlIHRvIHRoaXMgbm9kZQotICogc3RpbGwgaGF2aW5nIHRoZSBpbm9kZSBvcGVuLiBIZXJlIHdlIG1hcmsgdGhlIGxpbmsgY291bnQgemVybwotICogc2luY2Ugd2Uga25vdyB0aGF0IGl0IG11c3QgaGF2ZSByZWFjaGVkIHplcm8gaWYgdGhlIEdMRl9ERU1PVEUgZmxhZwotICogaXMgc2V0IG9uIHRoZSBpb3BlbiBnbG9jay4gSWYgd2UgZGlkbid0IGRvIGEgZGlzayByZWFkIHNpbmNlIHRoZQotICogcmVtb3RlIG5vZGUgcmVtb3ZlZCB0aGUgZmluYWwgbGluayB0aGVuIHdlIG1pZ2h0IG90aGVyd2lzZSBtaXNzCi0gKiB0aGlzIGV2ZW50LiBUaGlzIGNoZWNrIGVuc3VyZXMgdGhhdCB0aGlzIG5vZGUgd2lsbCBkZWFsbG9jYXRlIHRoZQotICogaW5vZGUncyBibG9ja3MsIG9yIGFsdGVybmF0aXZlbHkgcGFzcyB0aGUgYmF0b24gb24gdG8gYW5vdGhlcgotICogbm9kZSBmb3IgbGF0ZXIgZGVhbGxvY2F0aW9uLgotICovCi0KLXN0YXRpYyB2b2lkIGdmczJfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7Ci0KLQlpZiAodGVzdF9iaXQoR0lGX1VTRVIsICZpcC0+aV9mbGFncykgJiYgaW5vZGUtPmlfbmxpbmspIHsKLQkJc3RydWN0IGdmczJfZ2xvY2sgKmdsID0gaXAtPmlfaW9wZW5fZ2guZ2hfZ2w7Ci0JCWlmIChnbCAmJiB0ZXN0X2JpdChHTEZfREVNT1RFLCAmZ2wtPmdsX2ZsYWdzKSkKLQkJCWNsZWFyX25saW5rKGlub2RlKTsKLQl9Ci0JZ2VuZXJpY19kcm9wX2lub2RlKGlub2RlKTsKLX0KLQotLyoqCi0gKiBnZnMyX2NsZWFyX2lub2RlIC0gRGVhbGxvY2F0ZSBhbiBpbm9kZSB3aGVuIFZGUyBpcyBkb25lIHdpdGggaXQKLSAqIEBpbm9kZTogVGhlIFZGUyBpbm9kZQotICoKLSAqLwotCi1zdGF0aWMgdm9pZCBnZnMyX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0Jc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKLQotCS8qIFRoaXMgdGVsbHMgdXMgaXRzIGEgInJlYWwiIGlub2RlIGFuZCBub3Qgb25lIHdoaWNoIG9ubHkKLQkgKiBzZXJ2ZXMgdG8gY29udGFpbiBhbiBhZGRyZXNzIHNwYWNlIChzZWUgcmdycC5jLCBtZXRhX2lvLmMpCi0JICogd2hpY2ggdGhlcmVmb3JlIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGdsb2Nrcy4KLQkgKi8KLQlpZiAodGVzdF9iaXQoR0lGX1VTRVIsICZpcC0+aV9mbGFncykpIHsKLQkJaXAtPmlfZ2wtPmdsX29iamVjdCA9IE5VTEw7Ci0JCWdmczJfZ2xvY2tfcHV0KGlwLT5pX2dsKTsKLQkJaXAtPmlfZ2wgPSBOVUxMOwotCQlpZiAoaXAtPmlfaW9wZW5fZ2guZ2hfZ2wpIHsKLQkJCWlwLT5pX2lvcGVuX2doLmdoX2dsLT5nbF9vYmplY3QgPSBOVUxMOwotCQkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmlwLT5pX2lvcGVuX2doKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBpc19hbmNlc3Rvcihjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkMSwgY29uc3Qgc3RydWN0IGRlbnRyeSAqZDIpCi17Ci0JZG8gewotCQlpZiAoZDEgPT0gZDIpCi0JCQlyZXR1cm4gMTsKLQkJZDEgPSBkMS0+ZF9wYXJlbnQ7Ci0JfSB3aGlsZSAoIUlTX1JPT1QoZDEpKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBnZnMyX3Nob3dfb3B0aW9ucyAtIFNob3cgbW91bnQgb3B0aW9ucyBmb3IgL3Byb2MvbW91bnRzCi0gKiBAczogc2VxX2ZpbGUgc3RydWN0dXJlCi0gKiBAbW50OiB2ZnNtb3VudAotICoKLSAqIFJldHVybnM6IDAgb24gc3VjY2VzcyBvciBlcnJvciBjb2RlCi0gKi8KLQotc3RhdGljIGludCBnZnMyX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQotewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gbW50LT5tbnRfc2ItPnNfZnNfaW5mbzsKLQlzdHJ1Y3QgZ2ZzMl9hcmdzICphcmdzID0gJnNkcC0+c2RfYXJnczsKLQotCWlmIChpc19hbmNlc3RvcihtbnQtPm1udF9yb290LCBzZHAtPnNkX21hc3Rlcl9kaXIpKQotCQlzZXFfcHJpbnRmKHMsICIsbWV0YSIpOwotCWlmIChhcmdzLT5hcl9sb2NrcHJvdG9bMF0pCi0JCXNlcV9wcmludGYocywgIixsb2NrcHJvdG89JXMiLCBhcmdzLT5hcl9sb2NrcHJvdG8pOwotCWlmIChhcmdzLT5hcl9sb2NrdGFibGVbMF0pCi0JCXNlcV9wcmludGYocywgIixsb2NrdGFibGU9JXMiLCBhcmdzLT5hcl9sb2NrdGFibGUpOwotCWlmIChhcmdzLT5hcl9ob3N0ZGF0YVswXSkKLQkJc2VxX3ByaW50ZihzLCAiLGhvc3RkYXRhPSVzIiwgYXJncy0+YXJfaG9zdGRhdGEpOwotCWlmIChhcmdzLT5hcl9zcGVjdGF0b3IpCi0JCXNlcV9wcmludGYocywgIixzcGVjdGF0b3IiKTsKLQlpZiAoYXJncy0+YXJfaWdub3JlX2xvY2FsX2ZzKQotCQlzZXFfcHJpbnRmKHMsICIsaWdub3JlX2xvY2FsX2ZzIik7Ci0JaWYgKGFyZ3MtPmFyX2xvY2FsZmxvY2tzKQotCQlzZXFfcHJpbnRmKHMsICIsbG9jYWxmbG9ja3MiKTsKLQlpZiAoYXJncy0+YXJfbG9jYWxjYWNoaW5nKQotCQlzZXFfcHJpbnRmKHMsICIsbG9jYWxjYWNoaW5nIik7Ci0JaWYgKGFyZ3MtPmFyX2RlYnVnKQotCQlzZXFfcHJpbnRmKHMsICIsZGVidWciKTsKLQlpZiAoYXJncy0+YXJfdXBncmFkZSkKLQkJc2VxX3ByaW50ZihzLCAiLHVwZ3JhZGUiKTsKLQlpZiAoYXJncy0+YXJfcG9zaXhfYWNsKQotCQlzZXFfcHJpbnRmKHMsICIsYWNsIik7Ci0JaWYgKGFyZ3MtPmFyX3F1b3RhICE9IEdGUzJfUVVPVEFfREVGQVVMVCkgewotCQljaGFyICpzdGF0ZTsKLQkJc3dpdGNoIChhcmdzLT5hcl9xdW90YSkgewotCQljYXNlIEdGUzJfUVVPVEFfT0ZGOgotCQkJc3RhdGUgPSAib2ZmIjsKLQkJCWJyZWFrOwotCQljYXNlIEdGUzJfUVVPVEFfQUNDT1VOVDoKLQkJCXN0YXRlID0gImFjY291bnQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgR0ZTMl9RVU9UQV9PTjoKLQkJCXN0YXRlID0gIm9uIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJc3RhdGUgPSAidW5rbm93biI7Ci0JCQlicmVhazsKLQkJfQotCQlzZXFfcHJpbnRmKHMsICIscXVvdGE9JXMiLCBzdGF0ZSk7Ci0JfQotCWlmIChhcmdzLT5hcl9zdWlkZGlyKQotCQlzZXFfcHJpbnRmKHMsICIsc3VpZGRpciIpOwotCWlmIChhcmdzLT5hcl9kYXRhICE9IEdGUzJfREFUQV9ERUZBVUxUKSB7Ci0JCWNoYXIgKnN0YXRlOwotCQlzd2l0Y2ggKGFyZ3MtPmFyX2RhdGEpIHsKLQkJY2FzZSBHRlMyX0RBVEFfV1JJVEVCQUNLOgotCQkJc3RhdGUgPSAid3JpdGViYWNrIjsKLQkJCWJyZWFrOwotCQljYXNlIEdGUzJfREFUQV9PUkRFUkVEOgotCQkJc3RhdGUgPSAib3JkZXJlZCI7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXN0YXRlID0gInVua25vd24iOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2VxX3ByaW50ZihzLCAiLGRhdGE9JXMiLCBzdGF0ZSk7Ci0JfQotCWlmIChhcmdzLT5hcl9kaXNjYXJkKQotCQlzZXFfcHJpbnRmKHMsICIsZGlzY2FyZCIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXZSBoYXZlIHRvIChhdCB0aGUgbW9tZW50KSBob2xkIHRoZSBpbm9kZXMgbWFpbiBsb2NrIHRvIGNvdmVyCi0gKiB0aGUgZ2FwIGJldHdlZW4gdW5sb2NraW5nIHRoZSBzaGFyZWQgbG9jayBvbiB0aGUgaW9wZW4gbG9jayBhbmQKLSAqIHRha2luZyB0aGUgZXhjbHVzaXZlIGxvY2suIEknZCByYXRoZXIgZG8gYSBzaGFyZWQgLT4gZXhjbHVzaXZlCi0gKiBjb252ZXJzaW9uIG9uIHRoZSBpb3BlbiBsb2NrLCBidXQgd2UgY2FuIGNoYW5nZSB0aGF0IGxhdGVyLiBUaGlzCi0gKiBpcyBzYWZlLCBqdXN0IGxlc3MgZWZmaWNpZW50LgotICovCi0KLXN0YXRpYyB2b2lkIGdmczJfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBpbm9kZS0+aV9zYi0+c19mc19pbmZvOwotCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7Ci0Jc3RydWN0IGdmczJfaG9sZGVyIGdoOwotCWludCBlcnJvcjsKLQotCWlmICghdGVzdF9iaXQoR0lGX1VTRVIsICZpcC0+aV9mbGFncykpCi0JCWdvdG8gb3V0OwotCi0JZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQoaXAtPmlfZ2wsIExNX1NUX0VYQ0xVU0lWRSwgMCwgJmdoKTsKLQlpZiAodW5saWtlbHkoZXJyb3IpKSB7Ci0JCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZpcC0+aV9pb3Blbl9naCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWdmczJfZ2xvY2tfZHFfd2FpdCgmaXAtPmlfaW9wZW5fZ2gpOwotCWdmczJfaG9sZGVyX3JlaW5pdChMTV9TVF9FWENMVVNJVkUsIExNX0ZMQUdfVFJZXzFDQiB8IEdMX05PQ0FDSEUsICZpcC0+aV9pb3Blbl9naCk7Ci0JZXJyb3IgPSBnZnMyX2dsb2NrX25xKCZpcC0+aV9pb3Blbl9naCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF90cnVuY2F0ZTsKLQotCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmCi0JICAgIChpcC0+aV9kaXNrZmxhZ3MgJiBHRlMyX0RJRl9FWEhBU0gpKSB7Ci0JCWVycm9yID0gZ2ZzMl9kaXJfZXhoYXNoX2RlYWxsb2MoaXApOwotCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JaWYgKGlwLT5pX2VhdHRyKSB7Ci0JCWVycm9yID0gZ2ZzMl9lYV9kZWFsbG9jKGlwKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCWlmICghZ2ZzMl9pc19zdHVmZmVkKGlwKSkgewotCQllcnJvciA9IGdmczJfZmlsZV9kZWFsbG9jKGlwKTsKLQkJaWYgKGVycm9yKQotCQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCWVycm9yID0gZ2ZzMl9kaW5vZGVfZGVhbGxvYyhpcCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLW91dF90cnVuY2F0ZToKLQllcnJvciA9IGdmczJfdHJhbnNfYmVnaW4oc2RwLCAwLCBzZHAtPnNkX2pkZXNjLT5qZF9ibG9ja3MpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfdW5sb2NrOwotCS8qIE5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGdsb2NrIHJlbGVhc2UgJiBhbHNvIGluIGEgdHJhbnNhY3Rpb24gKi8KLQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7Ci0JZ2ZzMl90cmFuc19lbmQoc2RwKTsKLQotb3V0X3VubG9jazoKLQlpZiAodGVzdF9iaXQoSElGX0hPTERFUiwgJmlwLT5pX2lvcGVuX2doLmdoX2lmbGFncykpCi0JCWdmczJfZ2xvY2tfZHEoJmlwLT5pX2lvcGVuX2doKTsKLQlnZnMyX2hvbGRlcl91bmluaXQoJmlwLT5pX2lvcGVuX2doKTsKLQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmZ2gpOwotCWlmIChlcnJvciAmJiBlcnJvciAhPSBHTFJfVFJZRkFJTEVEKQotCQlmc193YXJuKHNkcCwgImdmczJfZGVsZXRlX2lub2RlOiAlZFxuIiwgZXJyb3IpOwotb3V0OgotCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKLQljbGVhcl9pbm9kZShpbm9kZSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmdmczJfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXA7Ci0KLQlpcCA9IGttZW1fY2FjaGVfYWxsb2MoZ2ZzMl9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwotCWlmIChpcCkgewotCQlpcC0+aV9mbGFncyA9IDA7Ci0JCWlwLT5pX2dsID0gTlVMTDsKLQl9Ci0JcmV0dXJuICZpcC0+aV9pbm9kZTsKLX0KLQotc3RhdGljIHZvaWQgZ2ZzMl9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0Ja21lbV9jYWNoZV9mcmVlKGdmczJfaW5vZGVfY2FjaGVwLCBpbm9kZSk7Ci19Ci0KLWNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGdmczJfc3VwZXJfb3BzID0gewotCS5hbGxvY19pbm9kZQkJPSBnZnMyX2FsbG9jX2lub2RlLAotCS5kZXN0cm95X2lub2RlCQk9IGdmczJfZGVzdHJveV9pbm9kZSwKLQkud3JpdGVfaW5vZGUJCT0gZ2ZzMl93cml0ZV9pbm9kZSwKLQkuZGVsZXRlX2lub2RlCQk9IGdmczJfZGVsZXRlX2lub2RlLAotCS5wdXRfc3VwZXIJCT0gZ2ZzMl9wdXRfc3VwZXIsCi0JLndyaXRlX3N1cGVyCQk9IGdmczJfd3JpdGVfc3VwZXIsCi0JLnN5bmNfZnMJCT0gZ2ZzMl9zeW5jX2ZzLAotCS5mcmVlemVfZnMgCQk9IGdmczJfZnJlZXplLAotCS51bmZyZWV6ZV9mcwkJPSBnZnMyX3VuZnJlZXplLAotCS5zdGF0ZnMJCQk9IGdmczJfc3RhdGZzLAotCS5yZW1vdW50X2ZzCQk9IGdmczJfcmVtb3VudF9mcywKLQkuY2xlYXJfaW5vZGUJCT0gZ2ZzMl9jbGVhcl9pbm9kZSwKLQkuZHJvcF9pbm9kZQkJPSBnZnMyX2Ryb3BfaW5vZGUsCi0JLnNob3dfb3B0aW9ucwkJPSBnZnMyX3Nob3dfb3B0aW9ucywKLX07Ci0KZGlmZiAtLWdpdCBhL2ZzL2dmczIvcXVvdGEuYyBiL2ZzL2dmczIvcXVvdGEuYwppbmRleCAxNTJlNmM0Li4yZTliOTMyIDEwMDY0NAotLS0gYS9mcy9nZnMyL3F1b3RhLmMKKysrIGIvZnMvZ2ZzMi9xdW90YS5jCkBAIC02MCw3ICs2MCw2IEBACiAjaW5jbHVkZSAic3VwZXIuaCIKICNpbmNsdWRlICJ0cmFucy5oIgogI2luY2x1ZGUgImlub2RlLmgiCi0jaW5jbHVkZSAib3BzX2FkZHJlc3MuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKICNkZWZpbmUgUVVPVEFfVVNFUiAxCmRpZmYgLS1naXQgYS9mcy9nZnMyL3JlY292ZXJ5LmMgYi9mcy9nZnMyL3JlY292ZXJ5LmMKaW5kZXggMjQ3ZThmNy4uNTlkMjY5NSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9yZWNvdmVyeS5jCisrKyBiL2ZzL2dmczIvcmVjb3ZlcnkuYwpAQCAtMTMsOCArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xvdy13b3JrLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCkBAIC00NDEsMTggKzQ0MCwyNSBAQAogICAgICAgICBrb2JqZWN0X3VldmVudF9lbnYoJnNkcC0+c2Rfa29iaiwgS09CSl9DSEFOR0UsIGVudnApOwogfQogCi0vKioKLSAqIGdmczJfcmVjb3Zlcl9qb3VybmFsIC0gcmVjb3ZlciBhIGdpdmVuIGpvdXJuYWwKLSAqIEBqZDogdGhlIHN0cnVjdCBnZnMyX2pkZXNjIGRlc2NyaWJpbmcgdGhlIGpvdXJuYWwKLSAqCi0gKiBBY3F1aXJlIHRoZSBqb3VybmFsJ3MgbG9jaywgY2hlY2sgdG8gc2VlIGlmIHRoZSBqb3VybmFsIGlzIGNsZWFuLCBhbmQKLSAqIGRvIHJlY292ZXJ5IGlmIG5lY2Vzc2FyeS4KLSAqCi0gKiBSZXR1cm5zOiBlcnJubwotICovCi0KLWludCBnZnMyX3JlY292ZXJfam91cm5hbChzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQpCitzdGF0aWMgaW50IGdmczJfcmVjb3Zlcl9nZXRfcmVmKHN0cnVjdCBzbG93X3dvcmsgKndvcmspCiB7CisJc3RydWN0IGdmczJfamRlc2MgKmpkID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBnZnMyX2pkZXNjLCBqZF93b3JrKTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChKREZfUkVDT1ZFUlksICZqZC0+amRfZmxhZ3MpKQorCQlyZXR1cm4gLUVCVVNZOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZnMyX3JlY292ZXJfcHV0X3JlZihzdHJ1Y3Qgc2xvd193b3JrICp3b3JrKQoreworCXN0cnVjdCBnZnMyX2pkZXNjICpqZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ2ZzMl9qZGVzYywgamRfd29yayk7CisJY2xlYXJfYml0KEpERl9SRUNPVkVSWSwgJmpkLT5qZF9mbGFncyk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKwl3YWtlX3VwX2JpdCgmamQtPmpkX2ZsYWdzLCBKREZfUkVDT1ZFUlkpOworfQorCitzdGF0aWMgdm9pZCBnZnMyX3JlY292ZXJfd29yayhzdHJ1Y3Qgc2xvd193b3JrICp3b3JrKQoreworCXN0cnVjdCBnZnMyX2pkZXNjICpqZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZ2ZzMl9qZGVzYywgamRfd29yayk7CiAJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGpkLT5qZF9pbm9kZSk7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGpkLT5qZF9pbm9kZSk7CiAJc3RydWN0IGdmczJfbG9nX2hlYWRlcl9ob3N0IGhlYWQ7CkBAIC01NjksNyArNTc1LDcgQEAKIAkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmpfZ2gpOwogCiAJZnNfaW5mbyhzZHAsICJqaWQ9JXU6IERvbmVcbiIsIGpkLT5qZF9qaWQpOwotCXJldHVybiAwOworCXJldHVybjsKIAogZmFpbF9ndW5sb2NrX3RyOgogCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZ0X2doKTsKQEAgLTU4NCw3MCArNTkwLDI4IEBACiAKIGZhaWw6CiAJZ2ZzMl9yZWNvdmVyeV9kb25lKHNkcCwgamQtPmpkX2ppZCwgTE1fUkRfR0FWRVVQKTsKLQlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZ2ZzMl9qZGVzYyAqZ2ZzMl9qZGVzY19maW5kX2RpcnR5KHN0cnVjdCBnZnMyX3NiZCAqc2RwKQorc3RydWN0IHNsb3dfd29ya19vcHMgZ2ZzMl9yZWNvdmVyX29wcyA9IHsKKwkuZ2V0X3JlZiA9IGdmczJfcmVjb3Zlcl9nZXRfcmVmLAorCS5wdXRfcmVmID0gZ2ZzMl9yZWNvdmVyX3B1dF9yZWYsCisJLmV4ZWN1dGUgPSBnZnMyX3JlY292ZXJfd29yaywKK307CisKKworc3RhdGljIGludCBnZnMyX3JlY292ZXJ5X3dhaXQodm9pZCAqd29yZCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQ7Ci0JaW50IGZvdW5kID0gMDsKLQotCXNwaW5fbG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGpkLCAmc2RwLT5zZF9qaW5kZXhfbGlzdCwgamRfbGlzdCkgewotCQlpZiAoamQtPmpkX2RpcnR5KSB7Ci0JCQlqZC0+amRfZGlydHkgPSAwOwotCQkJZm91bmQgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0Jc3Bpbl91bmxvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOwotCi0JaWYgKCFmb3VuZCkKLQkJamQgPSBOVUxMOwotCi0JcmV0dXJuIGpkOworCXNjaGVkdWxlKCk7CisJcmV0dXJuIDA7CiB9CiAKLS8qKgotICogZ2ZzMl9jaGVja19qb3VybmFscyAtIFJlY292ZXIgYW55IGRpcnR5IGpvdXJuYWxzCi0gKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQotICoKLSAqLwotCi1zdGF0aWMgdm9pZCBnZnMyX2NoZWNrX2pvdXJuYWxzKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQoraW50IGdmczJfcmVjb3Zlcl9qb3VybmFsKHN0cnVjdCBnZnMyX2pkZXNjICpqZCkKIHsKLQlzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQ7Ci0KLQlmb3IgKDs7KSB7Ci0JCWpkID0gZ2ZzMl9qZGVzY19maW5kX2RpcnR5KHNkcCk7Ci0JCWlmICghamQpCi0JCQlicmVhazsKLQotCQlpZiAoamQgIT0gc2RwLT5zZF9qZGVzYykKLQkJCWdmczJfcmVjb3Zlcl9qb3VybmFsKGpkKTsKLQl9Ci19Ci0KLS8qKgotICogZ2ZzMl9yZWNvdmVyZCAtIFJlY292ZXIgZGVhZCBtYWNoaW5lJ3Mgam91cm5hbHMKLSAqIEBzZHA6IFBvaW50ZXIgdG8gR0ZTMiBzdXBlcmJsb2NrCi0gKgotICovCi0KLWludCBnZnMyX3JlY292ZXJkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGdmczJfc2JkICpzZHAgPSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgdDsKLQotCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWdmczJfY2hlY2tfam91cm5hbHMoc2RwKTsKLQkJdCA9IGdmczJfdHVuZV9nZXQoc2RwLCAgZ3RfcmVjb3ZlcmRfc2VjcykgKiBIWjsKLQkJaWYgKGZyZWV6aW5nKGN1cnJlbnQpKQotCQkJcmVmcmlnZXJhdG9yKCk7Ci0JCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0KTsKLQl9Ci0KKwlpbnQgcnY7CisJcnYgPSBzbG93X3dvcmtfZW5xdWV1ZSgmamQtPmpkX3dvcmspOworCWlmIChydikKKwkJcmV0dXJuIHJ2OworCXdhaXRfb25fYml0KCZqZC0+amRfZmxhZ3MsIEpERl9SRUNPVkVSWSwgZ2ZzMl9yZWNvdmVyeV93YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvcmVjb3ZlcnkuaCBiL2ZzL2dmczIvcmVjb3ZlcnkuaAppbmRleCBhODIxOGVhLi4xNjE2YWMyIDEwMDY0NAotLS0gYS9mcy9nZnMyL3JlY292ZXJ5LmgKKysrIGIvZnMvZ2ZzMi9yZWNvdmVyeS5oCkBAIC0yOCw3ICsyOCw3IEBACiBleHRlcm4gaW50IGdmczJfZmluZF9qaGVhZChzdHJ1Y3QgZ2ZzMl9qZGVzYyAqamQsCiAJCSAgICBzdHJ1Y3QgZ2ZzMl9sb2dfaGVhZGVyX2hvc3QgKmhlYWQpOwogZXh0ZXJuIGludCBnZnMyX3JlY292ZXJfam91cm5hbChzdHJ1Y3QgZ2ZzMl9qZGVzYyAqZ2ZzMl9qZCk7Ci1leHRlcm4gaW50IGdmczJfcmVjb3ZlcmQodm9pZCAqZGF0YSk7CitleHRlcm4gc3RydWN0IHNsb3dfd29ya19vcHMgZ2ZzMl9yZWNvdmVyX29wczsKIAogI2VuZGlmIC8qIF9fUkVDT1ZFUllfRE9UX0hfXyAqLwogCmRpZmYgLS1naXQgYS9mcy9nZnMyL3JncnAuYyBiL2ZzL2dmczIvcmdycC5jCmluZGV4IDU2NTAzODIuLmRlMzIzOTcgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmdycC5jCisrKyBiL2ZzL2dmczIvcmdycC5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImxvZy5oIgogI2luY2x1ZGUgImlub2RlLmgiCi0jaW5jbHVkZSAib3BzX2FkZHJlc3MuaCIKIAogI2RlZmluZSBCRklUTk9FTlQgKCh1MzIpfjApCiAjZGVmaW5lIE5PX0JMT0NLICgodTY0KX4wKQpAQCAtNDQyLDYgKzQ0MSw3IEBACiAJZm9yICh4ID0gMDsgeCA8IGxlbmd0aDsgeCsrKSB7CiAJCWJpID0gcmdkLT5yZF9iaXRzICsgeDsKIAorCQliaS0+YmlfZmxhZ3MgPSAwOwogCQkvKiBzbWFsbCByZ3JwOyBiaXRtYXAgc3RvcmVkIGNvbXBsZXRlbHkgaW4gaGVhZGVyIGJsb2NrICovCiAJCWlmIChsZW5ndGggPT0gMSkgewogCQkJYnl0ZXMgPSBieXRlc19sZWZ0OwpAQCAtNTgwLDcgKzU4MCw2IEBACiAKIAlyZ2QtPnJkX2dsLT5nbF9vYmplY3QgPSByZ2Q7CiAJcmdkLT5yZF9mbGFncyAmPSB+R0ZTMl9SREZfVVBUT0RBVEU7Ci0JcmdkLT5yZF9mbGFncyB8PSBHRlMyX1JERl9DSEVDSzsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTcwMSwxMCArNzAwLDkgQEAKIAl1MzIgcmdfZmxhZ3M7CiAKIAlyZ19mbGFncyA9IGJlMzJfdG9fY3B1KHN0ci0+cmdfZmxhZ3MpOwotCWlmIChyZ19mbGFncyAmIEdGUzJfUkdGX05PQUxMT0MpCi0JCXJnZC0+cmRfZmxhZ3MgfD0gR0ZTMl9SREZfTk9BTExPQzsKLQllbHNlCi0JCXJnZC0+cmRfZmxhZ3MgJj0gfkdGUzJfUkRGX05PQUxMT0M7CisJcmdfZmxhZ3MgJj0gfkdGUzJfUkRGX01BU0s7CisJcmdkLT5yZF9mbGFncyAmPSBHRlMyX1JERl9NQVNLOworCXJnZC0+cmRfZmxhZ3MgfD0gcmdfZmxhZ3M7CiAJcmdkLT5yZF9mcmVlID0gYmUzMl90b19jcHUoc3RyLT5yZ19mcmVlKTsKIAlyZ2QtPnJkX2Rpbm9kZXMgPSBiZTMyX3RvX2NwdShzdHItPnJnX2Rpbm9kZXMpOwogCXJnZC0+cmRfaWdlbmVyYXRpb24gPSBiZTY0X3RvX2NwdShzdHItPnJnX2lnZW5lcmF0aW9uKTsKQEAgLTcxMywxMSArNzExLDggQEAKIHN0YXRpYyB2b2lkIGdmczJfcmdycF9vdXQoc3RydWN0IGdmczJfcmdycGQgKnJnZCwgdm9pZCAqYnVmKQogewogCXN0cnVjdCBnZnMyX3JncnAgKnN0ciA9IGJ1ZjsKLQl1MzIgcmdfZmxhZ3MgPSAwOwogCi0JaWYgKHJnZC0+cmRfZmxhZ3MgJiBHRlMyX1JERl9OT0FMTE9DKQotCQlyZ19mbGFncyB8PSBHRlMyX1JHRl9OT0FMTE9DOwotCXN0ci0+cmdfZmxhZ3MgPSBjcHVfdG9fYmUzMihyZ19mbGFncyk7CisJc3RyLT5yZ19mbGFncyA9IGNwdV90b19iZTMyKHJnZC0+cmRfZmxhZ3MgJiB+R0ZTMl9SREZfTUFTSyk7CiAJc3RyLT5yZ19mcmVlID0gY3B1X3RvX2JlMzIocmdkLT5yZF9mcmVlKTsKIAlzdHItPnJnX2Rpbm9kZXMgPSBjcHVfdG9fYmUzMihyZ2QtPnJkX2Rpbm9kZXMpOwogCXN0ci0+X19wYWQgPSBjcHVfdG9fYmUzMigwKTsKQEAgLTc3NSw4ICs3NzAsMTAgQEAKIAl9CiAKIAlpZiAoIShyZ2QtPnJkX2ZsYWdzICYgR0ZTMl9SREZfVVBUT0RBVEUpKSB7CisJCWZvciAoeCA9IDA7IHggPCBsZW5ndGg7IHgrKykKKwkJCWNsZWFyX2JpdChHQkZfRlVMTCwgJnJnZC0+cmRfYml0c1t4XS5iaV9mbGFncyk7CiAJCWdmczJfcmdycF9pbihyZ2QsIChyZ2QtPnJkX2JpdHNbMF0uYmlfYmgpLT5iX2RhdGEpOwotCQlyZ2QtPnJkX2ZsYWdzIHw9IEdGUzJfUkRGX1VQVE9EQVRFOworCQlyZ2QtPnJkX2ZsYWdzIHw9IChHRlMyX1JERl9VUFRPREFURSB8IEdGUzJfUkRGX0NIRUNLKTsKIAl9CiAKIAlzcGluX2xvY2soJnNkcC0+c2RfcmluZGV4X3NwaW4pOwpAQCAtODQ1LDcgKzg0Miw3IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHNkcC0+c2RfdmZzOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBzYi0+c19iZGV2OwogCWNvbnN0IHVuc2lnbmVkIGludCBzZWN0c19wZXJfYmxrID0gc2RwLT5zZF9zYi5zYl9ic2l6ZSAvCi0JCQkJCSAgIGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KTsKKwkJCQkJICAgYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoc2ItPnNfYmRldik7CiAJdTY0IGJsazsKIAlzZWN0b3JfdCBzdGFydCA9IDA7CiAJc2VjdG9yX3QgbnJfc2VjdHMgPSAwOwpAQCAtOTAzLDYgKzkwMCw3IEBACiAJCQljb250aW51ZTsKIAkJaWYgKHNkcC0+c2RfYXJncy5hcl9kaXNjYXJkKQogCQkJZ2ZzMl9yZ3JwX3NlbmRfZGlzY2FyZHMoc2RwLCByZ2QtPnJkX2RhdGEwLCBiaSk7CisJCWNsZWFyX2JpdChHQkZfRlVMTCwgJmJpLT5iaV9mbGFncyk7CiAJCW1lbWNweShiaS0+YmlfY2xvbmUgKyBiaS0+Ymlfb2Zmc2V0LAogCQkgICAgICAgYmktPmJpX2JoLT5iX2RhdGEgKyBiaS0+Ymlfb2Zmc2V0LCBiaS0+YmlfbGVuKTsKIAl9CkBAIC05NDIsNyArOTQwLDcgQEAKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHJnZC0+cmRfc2JkOwogCWludCByZXQgPSAwOwogCi0JaWYgKHJnZC0+cmRfZmxhZ3MgJiBHRlMyX1JERl9OT0FMTE9DKQorCWlmIChyZ2QtPnJkX2ZsYWdzICYgKEdGUzJfUkdGX05PQUxMT0MgfCBHRlMyX1JERl9FUlJPUikpCiAJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrKCZzZHAtPnNkX3JpbmRleF9zcGluKTsKQEAgLTEzMTUsMzAgKzEzMTMsMzcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9iaXRtYXAgKmJpID0gTlVMTDsKIAljb25zdCB1MzIgbGVuZ3RoID0gcmdkLT5yZF9sZW5ndGg7Ci0JdTMyIGJsayA9IDA7CisJdTMyIGJsayA9IEJGSVROT0VOVDsKIAl1bnNpZ25lZCBpbnQgYnVmLCB4OwogCWNvbnN0IHVuc2lnbmVkIGludCBlbGVuID0gKm47Ci0JY29uc3QgdTggKmJ1ZmZlcjsKKwljb25zdCB1OCAqYnVmZmVyID0gTlVMTDsKIAogCSpuID0gMDsKIAkvKiBGaW5kIGJpdG1hcCBibG9jayB0aGF0IGNvbnRhaW5zIGJpdHMgZm9yIGdvYWwgYmxvY2sgKi8KIAlmb3IgKGJ1ZiA9IDA7IGJ1ZiA8IGxlbmd0aDsgYnVmKyspIHsKIAkJYmkgPSByZ2QtPnJkX2JpdHMgKyBidWY7Ci0JCWlmIChnb2FsIDwgKGJpLT5iaV9zdGFydCArIGJpLT5iaV9sZW4pICogR0ZTMl9OQkJZKQotCQkJYnJlYWs7CisJCS8qIENvbnZlcnQgc2NvcGUgb2YgImdvYWwiIGZyb20gcmdycC13aWRlIHRvIHdpdGhpbiBmb3VuZCBiaXQgYmxvY2sgKi8KKwkJaWYgKGdvYWwgPCAoYmktPmJpX3N0YXJ0ICsgYmktPmJpX2xlbikgKiBHRlMyX05CQlkpIHsKKwkJCWdvYWwgLT0gYmktPmJpX3N0YXJ0ICogR0ZTMl9OQkJZOworCQkJZ290byBkb19zZWFyY2g7CisJCX0KIAl9CisJYnVmID0gMDsKKwlnb2FsID0gMDsKIAotCWdmczJfYXNzZXJ0KHJnZC0+cmRfc2JkLCBidWYgPCBsZW5ndGgpOwotCi0JLyogQ29udmVydCBzY29wZSBvZiAiZ29hbCIgZnJvbSByZ3JwLXdpZGUgdG8gd2l0aGluIGZvdW5kIGJpdCBibG9jayAqLwotCWdvYWwgLT0gYmktPmJpX3N0YXJ0ICogR0ZTMl9OQkJZOwotCitkb19zZWFyY2g6CiAJLyogU2VhcmNoICh1cCB0byBlbnRpcmUpIGJpdG1hcCBpbiB0aGlzIHJncnAgZm9yIGFsbG9jYXRhYmxlIGJsb2NrLgogCSAgICJ4IDw9IGxlbmd0aCIsIGluc3RlYWQgb2YgInggPCBsZW5ndGgiLCBiZWNhdXNlIHdlIHR5cGljYWxseSBzdGFydAogCSAgIHRoZSBzZWFyY2ggaW4gdGhlIG1pZGRsZSBvZiBhIGJpdCBibG9jaywgYnV0IGlmIHdlIGNhbid0IGZpbmQgYW4KIAkgICBhbGxvY2F0YWJsZSBibG9jayBhbnl3aGVyZSBlbHNlLCB3ZSB3YW50IHRvIGJlIGFibGUgd3JhcCBhcm91bmQgYW5kCiAJICAgc2VhcmNoIGluIHRoZSBmaXJzdCBwYXJ0IG9mIG91ciBmaXJzdC1zZWFyY2hlZCBiaXQgYmxvY2suICAqLwogCWZvciAoeCA9IDA7IHggPD0gbGVuZ3RoOyB4KyspIHsKKwkJYmkgPSByZ2QtPnJkX2JpdHMgKyBidWY7CisKKwkJaWYgKHRlc3RfYml0KEdCRl9GVUxMLCAmYmktPmJpX2ZsYWdzKSAmJgorCQkgICAgKG9sZF9zdGF0ZSA9PSBHRlMyX0JMS1NUX0ZSRUUpKQorCQkJZ290byBza2lwOworCiAJCS8qIFRoZSBHRlMyX0JMS1NUX1VOTElOS0VEIHN0YXRlIGRvZXNuJ3QgYXBwbHkgdG8gdGhlIGNsb25lCiAJCSAgIGJpdG1hcHMsIHNvIHdlIG11c3Qgc2VhcmNoIHRoZSBvcmlnaW5hbHMgZm9yIHRoYXQuICovCiAJCWJ1ZmZlciA9IGJpLT5iaV9iaC0+Yl9kYXRhICsgYmktPmJpX29mZnNldDsKQEAgLTEzNDksMzMgKzEzNTQsMzkgQEAKIAkJaWYgKGJsayAhPSBCRklUTk9FTlQpCiAJCQlicmVhazsKIAorCQlpZiAoKGdvYWwgPT0gMCkgJiYgKG9sZF9zdGF0ZSA9PSBHRlMyX0JMS1NUX0ZSRUUpKQorCQkJc2V0X2JpdChHQkZfRlVMTCwgJmJpLT5iaV9mbGFncyk7CisKIAkJLyogVHJ5IG5leHQgYml0bWFwIGJsb2NrICh3cmFwIGJhY2sgdG8gcmdycCBoZWFkZXIgaWYgYXQgZW5kKSAqLwotCQlidWYgPSAoYnVmICsgMSkgJSBsZW5ndGg7Ci0JCWJpID0gcmdkLT5yZF9iaXRzICsgYnVmOworc2tpcDoKKwkJYnVmKys7CisJCWJ1ZiAlPSBsZW5ndGg7CiAJCWdvYWwgPSAwOwogCX0KIAotCWlmIChibGsgIT0gQkZJVE5PRU5UICYmIG9sZF9zdGF0ZSAhPSBuZXdfc3RhdGUpIHsKLQkJKm4gPSAxOwotCQlnZnMyX3RyYW5zX2FkZF9iaChyZ2QtPnJkX2dsLCBiaS0+YmlfYmgsIDEpOwotCQlnZnMyX3NldGJpdChyZ2QsIGJpLT5iaV9iaC0+Yl9kYXRhLCBiaS0+YmlfY2xvbmUsIGJpLT5iaV9vZmZzZXQsCi0JCQkgICAgYmktPmJpX2xlbiwgYmxrLCBuZXdfc3RhdGUpOwotCQlnb2FsID0gYmxrOwotCQl3aGlsZSAoKm4gPCBlbGVuKSB7Ci0JCQlnb2FsKys7Ci0JCQlpZiAoZ29hbCA+PSAoYmktPmJpX2xlbiAqIEdGUzJfTkJCWSkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoZ2ZzMl90ZXN0Yml0KHJnZCwgYnVmZmVyLCBiaS0+YmlfbGVuLCBnb2FsKSAhPQotCQkJICAgIEdGUzJfQkxLU1RfRlJFRSkKLQkJCQlicmVhazsKLQkJCWdmczJfc2V0Yml0KHJnZCwgYmktPmJpX2JoLT5iX2RhdGEsIGJpLT5iaV9jbG9uZSwKLQkJCQkgICAgYmktPmJpX29mZnNldCwgYmktPmJpX2xlbiwgZ29hbCwKLQkJCQkgICAgbmV3X3N0YXRlKTsKLQkJCSgqbikrKzsKLQkJfQotCX0KKwlpZiAoYmxrID09IEJGSVROT0VOVCkKKwkJcmV0dXJuIGJsazsKKwkqbiA9IDE7CisJaWYgKG9sZF9zdGF0ZSA9PSBuZXdfc3RhdGUpCisJCWdvdG8gb3V0OwogCi0JcmV0dXJuIChibGsgPT0gQkZJVE5PRU5UKSA/IGJsayA6IChiaS0+Ymlfc3RhcnQgKiBHRlMyX05CQlkpICsgYmxrOworCWdmczJfdHJhbnNfYWRkX2JoKHJnZC0+cmRfZ2wsIGJpLT5iaV9iaCwgMSk7CisJZ2ZzMl9zZXRiaXQocmdkLCBiaS0+YmlfYmgtPmJfZGF0YSwgYmktPmJpX2Nsb25lLCBiaS0+Ymlfb2Zmc2V0LAorCQkgICAgYmktPmJpX2xlbiwgYmxrLCBuZXdfc3RhdGUpOworCWdvYWwgPSBibGs7CisJd2hpbGUgKCpuIDwgZWxlbikgeworCQlnb2FsKys7CisJCWlmIChnb2FsID49IChiaS0+YmlfbGVuICogR0ZTMl9OQkJZKSkKKwkJCWJyZWFrOworCQlpZiAoZ2ZzMl90ZXN0Yml0KHJnZCwgYnVmZmVyLCBiaS0+YmlfbGVuLCBnb2FsKSAhPQorCQkgICAgR0ZTMl9CTEtTVF9GUkVFKQorCQkJYnJlYWs7CisJCWdmczJfc2V0Yml0KHJnZCwgYmktPmJpX2JoLT5iX2RhdGEsIGJpLT5iaV9jbG9uZSwgYmktPmJpX29mZnNldCwKKwkJCSAgICBiaS0+YmlfbGVuLCBnb2FsLCBuZXdfc3RhdGUpOworCQkoKm4pKys7CisJfQorb3V0OgorCXJldHVybiAoYmktPmJpX3N0YXJ0ICogR0ZTMl9OQkJZKSArIGJsazsKIH0KIAogLyoqCkBAIC0xNDM1LDEzICsxNDQ2LDMzIEBACiB9CiAKIC8qKgotICogZ2ZzMl9hbGxvY19ibG9jayAtIEFsbG9jYXRlIGEgYmxvY2sKLSAqIEBpcDogdGhlIGlub2RlIHRvIGFsbG9jYXRlIHRoZSBibG9jayBmb3IKKyAqIGdmczJfcmdycF9kdW1wIC0gcHJpbnQgb3V0IGFuIHJncnAKKyAqIEBzZXE6IFRoZSBpdGVyYXRvcgorICogQGdsOiBUaGUgZ2xvY2sgaW4gcXVlc3Rpb24KICAqCi0gKiBSZXR1cm5zOiB0aGUgYWxsb2NhdGVkIGJsb2NrCiAgKi8KIAotdTY0IGdmczJfYWxsb2NfYmxvY2soc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1bnNpZ25lZCBpbnQgKm4pCitpbnQgZ2ZzMl9yZ3JwX2R1bXAoc3RydWN0IHNlcV9maWxlICpzZXEsIGNvbnN0IHN0cnVjdCBnZnMyX2dsb2NrICpnbCkKK3sKKwljb25zdCBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkID0gZ2wtPmdsX29iamVjdDsKKwlpZiAocmdkID09IE5VTEwpCisJCXJldHVybiAwOworCWdmczJfcHJpbnRfZGJnKHNlcSwgIiBSOiBuOiVsbHUgZjolMDJ4IGI6JXUvJXUgaToldVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmdkLT5yZF9hZGRyLCByZ2QtPnJkX2ZsYWdzLAorCQkgICAgICAgcmdkLT5yZF9mcmVlLCByZ2QtPnJkX2ZyZWVfY2xvbmUsIHJnZC0+cmRfZGlub2Rlcyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2ZzMl9hbGxvY19ibG9jayAtIEFsbG9jYXRlIG9uZSBvciBtb3JlIGJsb2NrcworICogQGlwOiB0aGUgaW5vZGUgdG8gYWxsb2NhdGUgdGhlIGJsb2NrIGZvcgorICogQGJuOiBVc2VkIHRvIHJldHVybiB0aGUgc3RhcnRpbmcgYmxvY2sgbnVtYmVyCisgKiBAbjogcmVxdWVzdGVkIG51bWJlciBvZiBibG9ja3MvZXh0ZW50IGxlbmd0aCAodmFsdWUvcmVzdWx0KQorICoKKyAqIFJldHVybnM6IDAgb3IgZXJyb3IKKyAqLworCitpbnQgZ2ZzMl9hbGxvY19ibG9jayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCAqYm4sIHVuc2lnbmVkIGludCAqbikKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpYmg7CkBAIC0xNDU3LDcgKzE0ODgsMTAgQEAKIAkJZ29hbCA9IHJnZC0+cmRfbGFzdF9hbGxvYzsKIAogCWJsayA9IHJnYmxrX3NlYXJjaChyZ2QsIGdvYWwsIEdGUzJfQkxLU1RfRlJFRSwgR0ZTMl9CTEtTVF9VU0VELCBuKTsKLQlCVUdfT04oYmxrID09IEJGSVROT0VOVCk7CisKKwkvKiBTaW5jZSBhbGwgYmxvY2tzIGFyZSByZXNlcnZlZCBpbiBhZHZhbmNlLCB0aGlzIHNob3VsZG4ndCBoYXBwZW4gKi8KKwlpZiAoYmxrID09IEJGSVROT0VOVCkKKwkJZ290byByZ3JwX2Vycm9yOwogCiAJcmdkLT5yZF9sYXN0X2FsbG9jID0gYmxrOwogCWJsb2NrID0gcmdkLT5yZF9kYXRhMCArIGJsazsKQEAgLTE0NjksNyArMTUwMyw5IEBACiAJCWRpLT5kaV9nb2FsX21ldGEgPSBkaS0+ZGlfZ29hbF9kYXRhID0gY3B1X3RvX2JlNjQoaXAtPmlfZ29hbCk7CiAJCWJyZWxzZShkaWJoKTsKIAl9Ci0JZ2ZzMl9hc3NlcnRfd2l0aGRyYXcoc2RwLCByZ2QtPnJkX2ZyZWUgPj0gKm4pOworCWlmIChyZ2QtPnJkX2ZyZWUgPCAqbikKKwkJZ290byByZ3JwX2Vycm9yOworCiAJcmdkLT5yZF9mcmVlIC09ICpuOwogCiAJZ2ZzMl90cmFuc19hZGRfYmgocmdkLT5yZF9nbCwgcmdkLT5yZF9iaXRzWzBdLmJpX2JoLCAxKTsKQEAgLTE0ODQsNyArMTUyMCwxNiBAQAogCXJnZC0+cmRfZnJlZV9jbG9uZSAtPSAqbjsKIAlzcGluX3VubG9jaygmc2RwLT5zZF9yaW5kZXhfc3Bpbik7CiAKLQlyZXR1cm4gYmxvY2s7CisJKmJuID0gYmxvY2s7CisJcmV0dXJuIDA7CisKK3JncnBfZXJyb3I6CisJZnNfd2FybihzZHAsICJyZ3JwICVsbHUgaGFzIGFuIGVycm9yLCBtYXJraW5nIGl0IHJlYWRvbmx5IHVudGlsIHVtb3VudFxuIiwKKwkgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcmdkLT5yZF9hZGRyKTsKKwlmc193YXJuKHNkcCwgInVtb3VudCBvbiBhbGwgbm9kZXMgYW5kIHJ1biBmc2NrLmdmczIgdG8gZml4IHRoZSBlcnJvclxuIik7CisJZ2ZzMl9yZ3JwX2R1bXAoTlVMTCwgcmdkLT5yZF9nbCk7CisJcmdkLT5yZF9mbGFncyB8PSBHRlMyX1JERl9FUlJPUjsKKwlyZXR1cm4gLUVJTzsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9nZnMyL3JncnAuaCBiL2ZzL2dmczIvcmdycC5oCmluZGV4IDMxODFjN2UuLjFlNzZmZjAgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmdycC5oCisrKyBiL2ZzL2dmczIvcmdycC5oCkBAIC0xNCwyMiArMTQsMjIgQEAKIHN0cnVjdCBnZnMyX3NiZDsKIHN0cnVjdCBnZnMyX2hvbGRlcjsKIAotdm9pZCBnZnMyX3JncnBfdmVyaWZ5KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOworZXh0ZXJuIHZvaWQgZ2ZzMl9yZ3JwX3ZlcmlmeShzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKIAogc3RydWN0IGdmczJfcmdycGQgKmdmczJfYmxrMnJncnBkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCB1NjQgYmxrKTsKIHN0cnVjdCBnZnMyX3JncnBkICpnZnMyX3JncnBkX2dldF9maXJzdChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiBzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqZ2ZzMl9yZ3JwZF9nZXRfbmV4dChzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkKTsKIAotdm9pZCBnZnMyX2NsZWFyX3JncnBkKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKLWludCBnZnMyX3JpbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKnJpX2doKTsKK2V4dGVybiB2b2lkIGdmczJfY2xlYXJfcmdycGQoc3RydWN0IGdmczJfc2JkICpzZHApOworZXh0ZXJuIGludCBnZnMyX3JpbmRleF9ob2xkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKnJpX2doKTsKIAotaW50IGdmczJfcmdycF9iaF9nZXQoc3RydWN0IGdmczJfcmdycGQgKnJnZCk7Ci12b2lkIGdmczJfcmdycF9iaF9ob2xkKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOwotdm9pZCBnZnMyX3JncnBfYmhfcHV0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOworZXh0ZXJuIGludCBnZnMyX3JncnBfYmhfZ2V0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOworZXh0ZXJuIHZvaWQgZ2ZzMl9yZ3JwX2JoX2hvbGQoc3RydWN0IGdmczJfcmdycGQgKnJnZCk7CitleHRlcm4gdm9pZCBnZnMyX3JncnBfYmhfcHV0KHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOwogCi12b2lkIGdmczJfcmdycF9yZXBvbGlzaF9jbG9uZXMoc3RydWN0IGdmczJfcmdycGQgKnJnZCk7CitleHRlcm4gdm9pZCBnZnMyX3JncnBfcmVwb2xpc2hfY2xvbmVzKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QpOwogCi1zdHJ1Y3QgZ2ZzMl9hbGxvYyAqZ2ZzMl9hbGxvY19nZXQoc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKK2V4dGVybiBzdHJ1Y3QgZ2ZzMl9hbGxvYyAqZ2ZzMl9hbGxvY19nZXQoc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCBnZnMyX2FsbG9jX3B1dChzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCiB7CiAJQlVHX09OKGlwLT5pX2FsbG9jID09IE5VTEwpOwpAQCAtMzcsMjIgKzM3LDIyIEBACiAJaXAtPmlfYWxsb2MgPSBOVUxMOwogfQogCi1pbnQgZ2ZzMl9pbnBsYWNlX3Jlc2VydmVfaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsCi0JCQkgY2hhciAqZmlsZSwgdW5zaWduZWQgaW50IGxpbmUpOworZXh0ZXJuIGludCBnZnMyX2lucGxhY2VfcmVzZXJ2ZV9pKHN0cnVjdCBnZnMyX2lub2RlICppcCwgY2hhciAqZmlsZSwKKwkJCQkgIHVuc2lnbmVkIGludCBsaW5lKTsKICNkZWZpbmUgZ2ZzMl9pbnBsYWNlX3Jlc2VydmUoaXApIFwKIGdmczJfaW5wbGFjZV9yZXNlcnZlX2koKGlwKSwgX19GSUxFX18sIF9fTElORV9fKQogCi12b2lkIGdmczJfaW5wbGFjZV9yZWxlYXNlKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CitleHRlcm4gdm9pZCBnZnMyX2lucGxhY2VfcmVsZWFzZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogCi11bnNpZ25lZCBjaGFyIGdmczJfZ2V0X2Jsb2NrX3R5cGUoc3RydWN0IGdmczJfcmdycGQgKnJnZCwgdTY0IGJsb2NrKTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGdmczJfZ2V0X2Jsb2NrX3R5cGUoc3RydWN0IGdmczJfcmdycGQgKnJnZCwgdTY0IGJsb2NrKTsKIAotdTY0IGdmczJfYWxsb2NfYmxvY2soc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1bnNpZ25lZCBpbnQgKm4pOwotdTY0IGdmczJfYWxsb2NfZGkoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgKmdlbmVyYXRpb24pOworZXh0ZXJuIGludCBnZnMyX2FsbG9jX2Jsb2NrKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0ICpibiwgdW5zaWduZWQgaW50ICpuKTsKK2V4dGVybiB1NjQgZ2ZzMl9hbGxvY19kaShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCAqZ2VuZXJhdGlvbik7CiAKLXZvaWQgZ2ZzMl9mcmVlX2RhdGEoc3RydWN0IGdmczJfaW5vZGUgKmlwLCB1NjQgYnN0YXJ0LCB1MzIgYmxlbik7Ci12b2lkIGdmczJfZnJlZV9tZXRhKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0IGJzdGFydCwgdTMyIGJsZW4pOwotdm9pZCBnZnMyX2ZyZWVfZGkoc3RydWN0IGdmczJfcmdycGQgKnJnZCwgc3RydWN0IGdmczJfaW5vZGUgKmlwKTsKLXZvaWQgZ2ZzMl91bmxpbmtfZGkoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZCBnZnMyX2ZyZWVfZGF0YShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHU2NCBic3RhcnQsIHUzMiBibGVuKTsKK2V4dGVybiB2b2lkIGdmczJfZnJlZV9tZXRhKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0IGJzdGFydCwgdTMyIGJsZW4pOworZXh0ZXJuIHZvaWQgZ2ZzMl9mcmVlX2RpKHN0cnVjdCBnZnMyX3JncnBkICpyZ2QsIHN0cnVjdCBnZnMyX2lub2RlICppcCk7CitleHRlcm4gdm9pZCBnZnMyX3VubGlua19kaShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogc3RydWN0IGdmczJfcmdycF9saXN0IHsKIAl1bnNpZ25lZCBpbnQgcmxfcmdycHM7CkBAIC02MSwxMCArNjEsMTEgQEAKIAlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgKnJsX2doczsKIH07CiAKLXZvaWQgZ2ZzMl9ybGlzdF9hZGQoc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX3JncnBfbGlzdCAqcmxpc3QsCi0JCSAgICB1NjQgYmxvY2spOwotdm9pZCBnZnMyX3JsaXN0X2FsbG9jKHN0cnVjdCBnZnMyX3JncnBfbGlzdCAqcmxpc3QsIHVuc2lnbmVkIGludCBzdGF0ZSk7Ci12b2lkIGdmczJfcmxpc3RfZnJlZShzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3QgKnJsaXN0KTsKLXU2NCBnZnMyX3JpX3RvdGFsKHN0cnVjdCBnZnMyX3NiZCAqc2RwKTsKK2V4dGVybiB2b2lkIGdmczJfcmxpc3RfYWRkKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3QgKnJsaXN0LAorCQkJICAgdTY0IGJsb2NrKTsKK2V4dGVybiB2b2lkIGdmczJfcmxpc3RfYWxsb2Moc3RydWN0IGdmczJfcmdycF9saXN0ICpybGlzdCwgdW5zaWduZWQgaW50IHN0YXRlKTsKK2V4dGVybiB2b2lkIGdmczJfcmxpc3RfZnJlZShzdHJ1Y3QgZ2ZzMl9yZ3JwX2xpc3QgKnJsaXN0KTsKK2V4dGVybiB1NjQgZ2ZzMl9yaV90b3RhbChzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CitleHRlcm4gaW50IGdmczJfcmdycF9kdW1wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBjb25zdCBzdHJ1Y3QgZ2ZzMl9nbG9jayAqZ2wpOwogCiAjZW5kaWYgLyogX19SR1JQX0RPVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3VwZXIuYyBiL2ZzL2dmczIvc3VwZXIuYwppbmRleCA2MDE5MTNlLi40MGJjYzM3IDEwMDY0NAotLS0gYS9mcy9nZnMyL3N1cGVyLmMKKysrIGIvZnMvZ2ZzMi9zdXBlci5jCkBAIC03LDE0ICs3LDIwIEBACiAgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmczJfb25kaXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNpbmNsdWRlICJnZnMyLmgiCiAjaW5jbHVkZSAiaW5jb3JlLmgiCkBAIC0zMSw2ICszNywxODMgQEAKICNpbmNsdWRlICJzdXBlci5oIgogI2luY2x1ZGUgInRyYW5zLmgiCiAjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInN5cy5oIgorI2luY2x1ZGUgImVhdHRyLmgiCisKKyNkZWZpbmUgYXJnc19uZXEoYTEsIGEyLCB4KSAoKGExKS0+YXJfIyN4ICE9IChhMiktPmFyXyMjeCkKKworZW51bSB7CisJT3B0X2xvY2twcm90bywKKwlPcHRfbG9ja3RhYmxlLAorCU9wdF9ob3N0ZGF0YSwKKwlPcHRfc3BlY3RhdG9yLAorCU9wdF9pZ25vcmVfbG9jYWxfZnMsCisJT3B0X2xvY2FsZmxvY2tzLAorCU9wdF9sb2NhbGNhY2hpbmcsCisJT3B0X2RlYnVnLAorCU9wdF9ub2RlYnVnLAorCU9wdF91cGdyYWRlLAorCU9wdF9hY2wsCisJT3B0X25vYWNsLAorCU9wdF9xdW90YV9vZmYsCisJT3B0X3F1b3RhX2FjY291bnQsCisJT3B0X3F1b3RhX29uLAorCU9wdF9xdW90YSwKKwlPcHRfbm9xdW90YSwKKwlPcHRfc3VpZGRpciwKKwlPcHRfbm9zdWlkZGlyLAorCU9wdF9kYXRhX3dyaXRlYmFjaywKKwlPcHRfZGF0YV9vcmRlcmVkLAorCU9wdF9tZXRhLAorCU9wdF9kaXNjYXJkLAorCU9wdF9ub2Rpc2NhcmQsCisJT3B0X2NvbW1pdCwKKwlPcHRfZXJyb3IsCit9OworCitzdGF0aWMgY29uc3QgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJe09wdF9sb2NrcHJvdG8sICJsb2NrcHJvdG89JXMifSwKKwl7T3B0X2xvY2t0YWJsZSwgImxvY2t0YWJsZT0lcyJ9LAorCXtPcHRfaG9zdGRhdGEsICJob3N0ZGF0YT0lcyJ9LAorCXtPcHRfc3BlY3RhdG9yLCAic3BlY3RhdG9yIn0sCisJe09wdF9pZ25vcmVfbG9jYWxfZnMsICJpZ25vcmVfbG9jYWxfZnMifSwKKwl7T3B0X2xvY2FsZmxvY2tzLCAibG9jYWxmbG9ja3MifSwKKwl7T3B0X2xvY2FsY2FjaGluZywgImxvY2FsY2FjaGluZyJ9LAorCXtPcHRfZGVidWcsICJkZWJ1ZyJ9LAorCXtPcHRfbm9kZWJ1ZywgIm5vZGVidWcifSwKKwl7T3B0X3VwZ3JhZGUsICJ1cGdyYWRlIn0sCisJe09wdF9hY2wsICJhY2wifSwKKwl7T3B0X25vYWNsLCAibm9hY2wifSwKKwl7T3B0X3F1b3RhX29mZiwgInF1b3RhPW9mZiJ9LAorCXtPcHRfcXVvdGFfYWNjb3VudCwgInF1b3RhPWFjY291bnQifSwKKwl7T3B0X3F1b3RhX29uLCAicXVvdGE9b24ifSwKKwl7T3B0X3F1b3RhLCAicXVvdGEifSwKKwl7T3B0X25vcXVvdGEsICJub3F1b3RhIn0sCisJe09wdF9zdWlkZGlyLCAic3VpZGRpciJ9LAorCXtPcHRfbm9zdWlkZGlyLCAibm9zdWlkZGlyIn0sCisJe09wdF9kYXRhX3dyaXRlYmFjaywgImRhdGE9d3JpdGViYWNrIn0sCisJe09wdF9kYXRhX29yZGVyZWQsICJkYXRhPW9yZGVyZWQifSwKKwl7T3B0X21ldGEsICJtZXRhIn0sCisJe09wdF9kaXNjYXJkLCAiZGlzY2FyZCJ9LAorCXtPcHRfbm9kaXNjYXJkLCAibm9kaXNjYXJkIn0sCisJe09wdF9jb21taXQsICJjb21taXQ9JWQifSwKKwl7T3B0X2Vycm9yLCBOVUxMfQorfTsKKworLyoqCisgKiBnZnMyX21vdW50X2FyZ3MgLSBQYXJzZSBtb3VudCBvcHRpb25zCisgKiBAc2RwOgorICogQGRhdGE6CisgKgorICogUmV0dXJuOiBlcnJubworICovCisKK2ludCBnZnMyX21vdW50X2FyZ3Moc3RydWN0IGdmczJfc2JkICpzZHAsIHN0cnVjdCBnZnMyX2FyZ3MgKmFyZ3MsIGNoYXIgKm9wdGlvbnMpCit7CisJY2hhciAqbzsKKwlpbnQgdG9rZW47CisJc3Vic3RyaW5nX3QgdG1wW01BWF9PUFRfQVJHU107CisJaW50IHJ2OworCisJLyogU3BsaXQgdGhlIG9wdGlvbnMgaW50byB0b2tlbnMgd2l0aCB0aGUgIiwiIGNoYXJhY3RlciBhbmQKKwkgICBwcm9jZXNzIHRoZW0gKi8KKworCXdoaWxlICgxKSB7CisJCW8gPSBzdHJzZXAoJm9wdGlvbnMsICIsIik7CisJCWlmIChvID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKCpvID09ICdcMCcpCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKG8sIHRva2VucywgdG1wKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9sb2NrcHJvdG86CisJCQltYXRjaF9zdHJsY3B5KGFyZ3MtPmFyX2xvY2twcm90bywgJnRtcFswXSwKKwkJCQkgICAgICBHRlMyX0xPQ0tOQU1FX0xFTik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbG9ja3RhYmxlOgorCQkJbWF0Y2hfc3RybGNweShhcmdzLT5hcl9sb2NrdGFibGUsICZ0bXBbMF0sCisJCQkJICAgICAgR0ZTMl9MT0NLTkFNRV9MRU4pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2hvc3RkYXRhOgorCQkJbWF0Y2hfc3RybGNweShhcmdzLT5hcl9ob3N0ZGF0YSwgJnRtcFswXSwKKwkJCQkgICAgICBHRlMyX0xPQ0tOQU1FX0xFTik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc3BlY3RhdG9yOgorCQkJYXJncy0+YXJfc3BlY3RhdG9yID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9pZ25vcmVfbG9jYWxfZnM6CisJCQlhcmdzLT5hcl9pZ25vcmVfbG9jYWxfZnMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2xvY2FsZmxvY2tzOgorCQkJYXJncy0+YXJfbG9jYWxmbG9ja3MgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2xvY2FsY2FjaGluZzoKKwkJCWFyZ3MtPmFyX2xvY2FsY2FjaGluZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQlhcmdzLT5hcl9kZWJ1ZyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9kZWJ1ZzoKKwkJCWFyZ3MtPmFyX2RlYnVnID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91cGdyYWRlOgorCQkJYXJncy0+YXJfdXBncmFkZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYWNsOgorCQkJYXJncy0+YXJfcG9zaXhfYWNsID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2FjbDoKKwkJCWFyZ3MtPmFyX3Bvc2l4X2FjbCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcXVvdGFfb2ZmOgorCQljYXNlIE9wdF9ub3F1b3RhOgorCQkJYXJncy0+YXJfcXVvdGEgPSBHRlMyX1FVT1RBX09GRjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9xdW90YV9hY2NvdW50OgorCQkJYXJncy0+YXJfcXVvdGEgPSBHRlMyX1FVT1RBX0FDQ09VTlQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcXVvdGFfb246CisJCWNhc2UgT3B0X3F1b3RhOgorCQkJYXJncy0+YXJfcXVvdGEgPSBHRlMyX1FVT1RBX09OOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3N1aWRkaXI6CisJCQlhcmdzLT5hcl9zdWlkZGlyID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3N1aWRkaXI6CisJCQlhcmdzLT5hcl9zdWlkZGlyID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9kYXRhX3dyaXRlYmFjazoKKwkJCWFyZ3MtPmFyX2RhdGEgPSBHRlMyX0RBVEFfV1JJVEVCQUNLOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RhdGFfb3JkZXJlZDoKKwkJCWFyZ3MtPmFyX2RhdGEgPSBHRlMyX0RBVEFfT1JERVJFRDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9tZXRhOgorCQkJYXJncy0+YXJfbWV0YSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGlzY2FyZDoKKwkJCWFyZ3MtPmFyX2Rpc2NhcmQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vZGlzY2FyZDoKKwkJCWFyZ3MtPmFyX2Rpc2NhcmQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NvbW1pdDoKKwkJCXJ2ID0gbWF0Y2hfaW50KCZ0bXBbMF0sICZhcmdzLT5hcl9jb21taXQpOworCQkJaWYgKHJ2IHx8IGFyZ3MtPmFyX2NvbW1pdCA8PSAwKSB7CisJCQkJZnNfaW5mbyhzZHAsICJjb21taXQgbW91bnQgb3B0aW9uIHJlcXVpcmVzIGEgcG9zaXRpdmUgbnVtZXJpYyBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuIHJ2ID8gcnYgOiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycm9yOgorCQlkZWZhdWx0OgorCQkJZnNfaW5mbyhzZHAsICJpbnZhbGlkIG1vdW50IG9wdGlvbjogJXNcbiIsIG8pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KIAogLyoqCiAgKiBnZnMyX2ppbmRleF9mcmVlIC0gQ2xlYXIgYWxsIHRoZSBqb3VybmFsIGluZGV4IGluZm9ybWF0aW9uCkBAIC00MzYsMyArNjE5LDcxOSBAQAogCW11dGV4X3VubG9jaygmc2RwLT5zZF9mcmVlemVfbG9jayk7CiB9CiAKKworLyoqCisgKiBnZnMyX3dyaXRlX2lub2RlIC0gTWFrZSBzdXJlIHRoZSBpbm9kZSBpcyBzdGFibGUgb24gdGhlIGRpc2sKKyAqIEBpbm9kZTogVGhlIGlub2RlCisgKiBAc3luYzogc3luY2hyb25vdXMgd3JpdGUgZmxhZworICoKKyAqIFJldHVybnM6IGVycm5vCisgKi8KKworc3RhdGljIGludCBnZnMyX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBzeW5jKQoreworCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKGlub2RlKTsKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgdGltZXNwZWMgYXRpbWU7CisJc3RydWN0IGdmczJfZGlub2RlICpkaTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIENoZWNrIHRoaXMgaXMgYSAibm9ybWFsIiBpbm9kZSwgZXRjICovCisJaWYgKCF0ZXN0X2JpdChHSUZfVVNFUiwgJmlwLT5pX2ZsYWdzKSB8fAorCSAgICAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykpCisJCXJldHVybiAwOworCXJldCA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCAmZ2gpOworCWlmIChyZXQpCisJCWdvdG8gZG9fZmx1c2g7CisJcmV0ID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIFJFU19ESU5PREUsIDApOworCWlmIChyZXQpCisJCWdvdG8gZG9fdW5sb2NrOworCXJldCA9IGdmczJfbWV0YV9pbm9kZV9idWZmZXIoaXAsICZiaCk7CisJaWYgKHJldCA9PSAwKSB7CisJCWRpID0gKHN0cnVjdCBnZnMyX2Rpbm9kZSAqKWJoLT5iX2RhdGE7CisJCWF0aW1lLnR2X3NlYyA9IGJlNjRfdG9fY3B1KGRpLT5kaV9hdGltZSk7CisJCWF0aW1lLnR2X25zZWMgPSBiZTMyX3RvX2NwdShkaS0+ZGlfYXRpbWVfbnNlYyk7CisJCWlmICh0aW1lc3BlY19jb21wYXJlKCZpbm9kZS0+aV9hdGltZSwgJmF0aW1lKSA+IDApIHsKKwkJCWdmczJfdHJhbnNfYWRkX2JoKGlwLT5pX2dsLCBiaCwgMSk7CisJCQlnZnMyX2Rpbm9kZV9vdXQoaXAsIGJoLT5iX2RhdGEpOworCQl9CisJCWJyZWxzZShiaCk7CisJfQorCWdmczJfdHJhbnNfZW5kKHNkcCk7Citkb191bmxvY2s6CisJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmdoKTsKK2RvX2ZsdXNoOgorCWlmIChzeW5jICE9IDApCisJCWdmczJfbG9nX2ZsdXNoKEdGUzJfU0IoaW5vZGUpLCBpcC0+aV9nbCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBnZnMyX21ha2VfZnNfcm8gLSBUdXJuIGEgUmVhZC1Xcml0ZSBGUyBpbnRvIGEgUmVhZC1Pbmx5IG9uZQorICogQHNkcDogdGhlIGZpbGVzeXN0ZW0KKyAqCisgKiBSZXR1cm5zOiBlcnJubworICovCisKK3N0YXRpYyBpbnQgZ2ZzMl9tYWtlX2ZzX3JvKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQoreworCXN0cnVjdCBnZnMyX2hvbGRlciB0X2doOworCWludCBlcnJvcjsKKworCWdmczJfcXVvdGFfc3luYyhzZHApOworCWdmczJfc3RhdGZzX3N5bmMoc2RwKTsKKworCWVycm9yID0gZ2ZzMl9nbG9ja19ucV9pbml0KHNkcC0+c2RfdHJhbnNfZ2wsIExNX1NUX1NIQVJFRCwgR0xfTk9DQUNIRSwKKwkJCQkgICAmdF9naCk7CisJaWYgKGVycm9yICYmICF0ZXN0X2JpdChTREZfU0hVVERPV04sICZzZHAtPnNkX2ZsYWdzKSkKKwkJcmV0dXJuIGVycm9yOworCisJZ2ZzMl9tZXRhX3N5bmNmcyhzZHApOworCWdmczJfbG9nX3NodXRkb3duKHNkcCk7CisKKwljbGVhcl9iaXQoU0RGX0pPVVJOQUxfTElWRSwgJnNkcC0+c2RfZmxhZ3MpOworCisJaWYgKHRfZ2guZ2hfZ2wpCisJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZ0X2doKTsKKworCWdmczJfcXVvdGFfY2xlYW51cChzZHApOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGdmczJfdW1vdW50X3JlY292ZXJ5X3dhaXQodm9pZCAqd29yZCkKK3sKKwlzY2hlZHVsZSgpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGdmczJfcHV0X3N1cGVyIC0gVW5tb3VudCB0aGUgZmlsZXN5c3RlbQorICogQHNiOiBUaGUgVkZTIHN1cGVyYmxvY2sKKyAqCisgKi8KKworc3RhdGljIHZvaWQgZ2ZzMl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLT5zX2ZzX2luZm87CisJaW50IGVycm9yOworCXN0cnVjdCBnZnMyX2pkZXNjICpqZDsKKworCS8qICBVbmZyZWV6ZSB0aGUgZmlsZXN5c3RlbSwgaWYgd2UgbmVlZCB0byAgKi8KKworCW11dGV4X2xvY2soJnNkcC0+c2RfZnJlZXplX2xvY2spOworCWlmIChzZHAtPnNkX2ZyZWV6ZV9jb3VudCkKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnNkcC0+c2RfZnJlZXplX2doKTsKKwltdXRleF91bmxvY2soJnNkcC0+c2RfZnJlZXplX2xvY2spOworCisJLyogTm8gbW9yZSByZWNvdmVyeSByZXF1ZXN0cyAqLworCXNldF9iaXQoU0RGX05PUkVDT1ZFUlksICZzZHAtPnNkX2ZsYWdzKTsKKwlzbXBfbWIoKTsKKworCS8qIFdhaXQgb24gb3V0c3RhbmRpbmcgcmVjb3ZlcnkgKi8KK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGpkLCAmc2RwLT5zZF9qaW5kZXhfbGlzdCwgamRfbGlzdCkgeworCQlpZiAoIXRlc3RfYml0KEpERl9SRUNPVkVSWSwgJmpkLT5qZF9mbGFncykpCisJCQljb250aW51ZTsKKwkJc3Bpbl91bmxvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOworCQl3YWl0X29uX2JpdCgmamQtPmpkX2ZsYWdzLCBKREZfUkVDT1ZFUlksCisJCQkgICAgZ2ZzMl91bW91bnRfcmVjb3Zlcnlfd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCXNwaW5fdW5sb2NrKCZzZHAtPnNkX2ppbmRleF9zcGluKTsKKworCWt0aHJlYWRfc3RvcChzZHAtPnNkX3F1b3RhZF9wcm9jZXNzKTsKKwlrdGhyZWFkX3N0b3Aoc2RwLT5zZF9sb2dkX3Byb2Nlc3MpOworCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWVycm9yID0gZ2ZzMl9tYWtlX2ZzX3JvKHNkcCk7CisJCWlmIChlcnJvcikKKwkJCWdmczJfaW9fZXJyb3Ioc2RwKTsKKwl9CisJLyogIEF0IHRoaXMgcG9pbnQsIHdlJ3JlIHRocm91Z2ggbW9kaWZ5aW5nIHRoZSBkaXNrICAqLworCisJLyogIFJlbGVhc2Ugc3R1ZmYgICovCisKKwlpcHV0KHNkcC0+c2RfamluZGV4KTsKKwlpcHV0KHNkcC0+c2RfaW51bV9pbm9kZSk7CisJaXB1dChzZHAtPnNkX3N0YXRmc19pbm9kZSk7CisJaXB1dChzZHAtPnNkX3JpbmRleCk7CisJaXB1dChzZHAtPnNkX3F1b3RhX2lub2RlKTsKKworCWdmczJfZ2xvY2tfcHV0KHNkcC0+c2RfcmVuYW1lX2dsKTsKKwlnZnMyX2dsb2NrX3B1dChzZHAtPnNkX3RyYW5zX2dsKTsKKworCWlmICghc2RwLT5zZF9hcmdzLmFyX3NwZWN0YXRvcikgeworCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmc2RwLT5zZF9qb3VybmFsX2doKTsKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnNkcC0+c2Rfamlub2RlX2doKTsKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJnNkcC0+c2RfaXJfZ2gpOworCQlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmc2RwLT5zZF9zY19naCk7CisJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZzZHAtPnNkX3FjX2doKTsKKwkJaXB1dChzZHAtPnNkX2lyX2lub2RlKTsKKwkJaXB1dChzZHAtPnNkX3NjX2lub2RlKTsKKwkJaXB1dChzZHAtPnNkX3FjX2lub2RlKTsKKwl9CisKKwlnZnMyX2dsb2NrX2RxX3VuaW5pdCgmc2RwLT5zZF9saXZlX2doKTsKKwlnZnMyX2NsZWFyX3JncnBkKHNkcCk7CisJZ2ZzMl9qaW5kZXhfZnJlZShzZHApOworCS8qICBUYWtlIGFwYXJ0IGdsb2NrIHN0cnVjdHVyZXMgYW5kIGJ1ZmZlciBsaXN0cyAgKi8KKwlnZnMyX2dsX2hhc2hfY2xlYXIoc2RwKTsKKwkvKiAgVW5tb3VudCB0aGUgbG9ja2luZyBwcm90b2NvbCAgKi8KKwlnZnMyX2xtX3VubW91bnQoc2RwKTsKKworCS8qICBBdCB0aGlzIHBvaW50LCB3ZSdyZSB0aHJvdWdoIHBhcnRpY2lwYXRpbmcgaW4gdGhlIGxvY2tzcGFjZSAgKi8KKwlnZnMyX3N5c19mc19kZWwoc2RwKTsKK30KKworLyoqCisgKiBnZnMyX3dyaXRlX3N1cGVyCisgKiBAc2I6IHRoZSBzdXBlcmJsb2NrCisgKgorICovCisKK3N0YXRpYyB2b2lkIGdmczJfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzYi0+c19kaXJ0ID0gMDsKK30KKworLyoqCisgKiBnZnMyX3N5bmNfZnMgLSBzeW5jIHRoZSBmaWxlc3lzdGVtCisgKiBAc2I6IHRoZSBzdXBlcmJsb2NrCisgKgorICogRmx1c2hlcyB0aGUgbG9nIHRvIGRpc2suCisgKi8KKworc3RhdGljIGludCBnZnMyX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCit7CisJc2ItPnNfZGlydCA9IDA7CisJaWYgKHdhaXQgJiYgc2ItPnNfZnNfaW5mbykKKwkJZ2ZzMl9sb2dfZmx1c2goc2ItPnNfZnNfaW5mbywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2ZzMl9mcmVlemUgLSBwcmV2ZW50IGZ1cnRoZXIgd3JpdGVzIHRvIHRoZSBmaWxlc3lzdGVtCisgKiBAc2I6IHRoZSBWRlMgc3RydWN0dXJlIGZvciB0aGUgZmlsZXN5c3RlbQorICoKKyAqLworCitzdGF0aWMgaW50IGdmczJfZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBzYi0+c19mc19pbmZvOworCWludCBlcnJvcjsKKworCWlmICh0ZXN0X2JpdChTREZfU0hVVERPV04sICZzZHAtPnNkX2ZsYWdzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKDs7KSB7CisJCWVycm9yID0gZ2ZzMl9mcmVlemVfZnMoc2RwKTsKKwkJaWYgKCFlcnJvcikKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSAtRUJVU1k6CisJCQlmc19lcnIoc2RwLCAid2FpdGluZyBmb3IgcmVjb3ZlcnkgYmVmb3JlIGZyZWV6ZVxuIik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZnNfZXJyKHNkcCwgImVycm9yIGZyZWV6aW5nIEZTOiAlZFxuIiwgZXJyb3IpOworCQkJYnJlYWs7CisJCX0KKworCQlmc19lcnIoc2RwLCAicmV0cnlpbmcuLi5cbiIpOworCQltc2xlZXAoMTAwMCk7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGdmczJfdW5mcmVlemUgLSByZWFsbG93IHdyaXRlcyB0byB0aGUgZmlsZXN5c3RlbQorICogQHNiOiB0aGUgVkZTIHN0cnVjdHVyZSBmb3IgdGhlIGZpbGVzeXN0ZW0KKyAqCisgKi8KKworc3RhdGljIGludCBnZnMyX3VuZnJlZXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJZ2ZzMl91bmZyZWV6ZV9mcyhzYi0+c19mc19pbmZvKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzdGF0ZnNfZmlsbCAtIGZpbGwgaW4gdGhlIHNnIGZvciBhIGdpdmVuIFJHCisgKiBAcmdkOiB0aGUgUkcKKyAqIEBzYzogdGhlIHNjIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLUVTVEFMRSBpZiB0aGUgTFZCIGlzIGludmFsaWQKKyAqLworCitzdGF0aWMgaW50IHN0YXRmc19zbG93X2ZpbGwoc3RydWN0IGdmczJfcmdycGQgKnJnZCwKKwkJCSAgICBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQoreworCWdmczJfcmdycF92ZXJpZnkocmdkKTsKKwlzYy0+c2NfdG90YWwgKz0gcmdkLT5yZF9kYXRhOworCXNjLT5zY19mcmVlICs9IHJnZC0+cmRfZnJlZTsKKwlzYy0+c2NfZGlub2RlcyArPSByZ2QtPnJkX2Rpbm9kZXM7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2ZzMl9zdGF0ZnNfc2xvdyAtIFN0YXQgYSBmaWxlc3lzdGVtIHVzaW5nIGFzeW5jaHJvbm91cyBsb2NraW5nCisgKiBAc2RwOiB0aGUgZmlsZXN5c3RlbQorICogQHNjOiB0aGUgc2MgaW5mbyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQKKyAqCisgKiBBbnkgZXJyb3IgKG90aGVyIHRoYW4gYSBzaWduYWwpIHdpbGwgY2F1c2UgdGhpcyByb3V0aW5lIHRvIGZhbGwgYmFjaworICogdG8gdGhlIHN5bmNocm9ub3VzIHZlcnNpb24uCisgKgorICogRklYTUU6IFRoaXMgcmVhbGx5IHNob3VsZG4ndCBidXN5IHdhaXQgbGlrZSB0aGlzLgorICoKKyAqIFJldHVybnM6IGVycm5vCisgKi8KKworc3RhdGljIGludCBnZnMyX3N0YXRmc19zbG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKnNjKQoreworCXN0cnVjdCBnZnMyX2hvbGRlciByaV9naDsKKwlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqcmdkX25leHQ7CisJc3RydWN0IGdmczJfaG9sZGVyICpnaGEsICpnaDsKKwl1bnNpZ25lZCBpbnQgc2xvdHMgPSA2NDsKKwl1bnNpZ25lZCBpbnQgeDsKKwlpbnQgZG9uZTsKKwlpbnQgZXJyb3IgPSAwLCBlcnI7CisKKwltZW1zZXQoc2MsIDAsIHNpemVvZihzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QpKTsKKwlnaGEgPSBrY2FsbG9jKHNsb3RzLCBzaXplb2Yoc3RydWN0IGdmczJfaG9sZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFnaGEpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyb3IgPSBnZnMyX3JpbmRleF9ob2xkKHNkcCwgJnJpX2doKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJcmdkX25leHQgPSBnZnMyX3JncnBkX2dldF9maXJzdChzZHApOworCisJZm9yICg7OykgeworCQlkb25lID0gMTsKKworCQlmb3IgKHggPSAwOyB4IDwgc2xvdHM7IHgrKykgeworCQkJZ2ggPSBnaGEgKyB4OworCisJCQlpZiAoZ2gtPmdoX2dsICYmIGdmczJfZ2xvY2tfcG9sbChnaCkpIHsKKwkJCQllcnIgPSBnZnMyX2dsb2NrX3dhaXQoZ2gpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJZ2ZzMl9ob2xkZXJfdW5pbml0KGdoKTsKKwkJCQkJZXJyb3IgPSBlcnI7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKCFlcnJvcikKKwkJCQkJCWVycm9yID0gc3RhdGZzX3Nsb3dfZmlsbCgKKwkJCQkJCQlnaC0+Z2hfZ2wtPmdsX29iamVjdCwgc2MpOworCQkJCQlnZnMyX2dsb2NrX2RxX3VuaW5pdChnaCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZ2gtPmdoX2dsKQorCQkJCWRvbmUgPSAwOworCQkJZWxzZSBpZiAocmdkX25leHQgJiYgIWVycm9yKSB7CisJCQkJZXJyb3IgPSBnZnMyX2dsb2NrX25xX2luaXQocmdkX25leHQtPnJkX2dsLAorCQkJCQkJCSAgIExNX1NUX1NIQVJFRCwKKwkJCQkJCQkgICBHTF9BU1lOQywKKwkJCQkJCQkgICBnaCk7CisJCQkJcmdkX25leHQgPSBnZnMyX3JncnBkX2dldF9uZXh0KHJnZF9uZXh0KTsKKwkJCQlkb25lID0gMDsKKwkJCX0KKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWVycm9yID0gLUVSRVNUQVJUU1lTOworCQl9CisKKwkJaWYgKGRvbmUpCisJCQlicmVhazsKKworCQl5aWVsZCgpOworCX0KKworCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZyaV9naCk7CisKK291dDoKKwlrZnJlZShnaGEpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBnZnMyX3N0YXRmc19pIC0gRG8gYSBzdGF0ZnMKKyAqIEBzZHA6IHRoZSBmaWxlc3lzdGVtCisgKiBAc2c6IHRoZSBzZyBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zOiBlcnJubworICovCisKK3N0YXRpYyBpbnQgZ2ZzMl9zdGF0ZnNfaShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0ICpzYykKK3sKKwlzdHJ1Y3QgZ2ZzMl9zdGF0ZnNfY2hhbmdlX2hvc3QgKm1fc2MgPSAmc2RwLT5zZF9zdGF0ZnNfbWFzdGVyOworCXN0cnVjdCBnZnMyX3N0YXRmc19jaGFuZ2VfaG9zdCAqbF9zYyA9ICZzZHAtPnNkX3N0YXRmc19sb2NhbDsKKworCXNwaW5fbG9jaygmc2RwLT5zZF9zdGF0ZnNfc3Bpbik7CisKKwkqc2MgPSAqbV9zYzsKKwlzYy0+c2NfdG90YWwgKz0gbF9zYy0+c2NfdG90YWw7CisJc2MtPnNjX2ZyZWUgKz0gbF9zYy0+c2NfZnJlZTsKKwlzYy0+c2NfZGlub2RlcyArPSBsX3NjLT5zY19kaW5vZGVzOworCisJc3Bpbl91bmxvY2soJnNkcC0+c2Rfc3RhdGZzX3NwaW4pOworCisJaWYgKHNjLT5zY19mcmVlIDwgMCkKKwkJc2MtPnNjX2ZyZWUgPSAwOworCWlmIChzYy0+c2NfZnJlZSA+IHNjLT5zY190b3RhbCkKKwkJc2MtPnNjX2ZyZWUgPSBzYy0+c2NfdG90YWw7CisJaWYgKHNjLT5zY19kaW5vZGVzIDwgMCkKKwkJc2MtPnNjX2Rpbm9kZXMgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2ZzMl9zdGF0ZnMgLSBHYXRoZXIgYW5kIHJldHVybiBzdGF0cyBhYm91dCB0aGUgZmlsZXN5c3RlbQorICogQHNiOiBUaGUgc3VwZXJibG9jaworICogQHN0YXRmc2J1ZjogVGhlIGJ1ZmZlcgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcyBvciBlcnJvciBjb2RlCisgKi8KKworc3RhdGljIGludCBnZnMyX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IHNiLT5zX2ZzX2luZm87CisJc3RydWN0IGdmczJfc3RhdGZzX2NoYW5nZV9ob3N0IHNjOworCWludCBlcnJvcjsKKworCWlmIChnZnMyX3R1bmVfZ2V0KHNkcCwgZ3Rfc3RhdGZzX3Nsb3cpKQorCQllcnJvciA9IGdmczJfc3RhdGZzX3Nsb3coc2RwLCAmc2MpOworCWVsc2UKKwkJZXJyb3IgPSBnZnMyX3N0YXRmc19pKHNkcCwgJnNjKTsKKworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJYnVmLT5mX3R5cGUgPSBHRlMyX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IHNkcC0+c2Rfc2Iuc2JfYnNpemU7CisJYnVmLT5mX2Jsb2NrcyA9IHNjLnNjX3RvdGFsOworCWJ1Zi0+Zl9iZnJlZSA9IHNjLnNjX2ZyZWU7CisJYnVmLT5mX2JhdmFpbCA9IHNjLnNjX2ZyZWU7CisJYnVmLT5mX2ZpbGVzID0gc2Muc2NfZGlub2RlcyArIHNjLnNjX2ZyZWU7CisJYnVmLT5mX2ZmcmVlID0gc2Muc2NfZnJlZTsKKwlidWYtPmZfbmFtZWxlbiA9IEdGUzJfRk5BTUVTSVpFOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2ZzMl9yZW1vdW50X2ZzIC0gY2FsbGVkIHdoZW4gdGhlIEZTIGlzIHJlbW91bnRlZAorICogQHNiOiAgdGhlIGZpbGVzeXN0ZW0KKyAqIEBmbGFnczogIHRoZSByZW1vdW50IGZsYWdzCisgKiBAZGF0YTogIGV4dHJhIGRhdGEgcGFzc2VkIGluIChub3QgdXNlZCByaWdodCBub3cpCisgKgorICogUmV0dXJuczogZXJybm8KKyAqLworCitzdGF0aWMgaW50IGdmczJfcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgZ2ZzMl9hcmdzIGFyZ3MgPSBzZHAtPnNkX2FyZ3M7IC8qIERlZmF1bHQgdG8gY3VycmVudCBzZXR0aW5ncyAqLworCXN0cnVjdCBnZnMyX3R1bmUgKmd0ID0gJnNkcC0+c2RfdHVuZTsKKwlpbnQgZXJyb3I7CisKKwlzcGluX2xvY2soJmd0LT5ndF9zcGluKTsKKwlhcmdzLmFyX2NvbW1pdCA9IGd0LT5ndF9sb2dfZmx1c2hfc2VjczsKKwlzcGluX3VubG9jaygmZ3QtPmd0X3NwaW4pOworCWVycm9yID0gZ2ZzMl9tb3VudF9hcmdzKHNkcCwgJmFyZ3MsIGRhdGEpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyogTm90IGFsbG93ZWQgdG8gY2hhbmdlIGxvY2tpbmcgZGV0YWlscyAqLworCWlmIChzdHJjbXAoYXJncy5hcl9sb2NrcHJvdG8sIHNkcC0+c2RfYXJncy5hcl9sb2NrcHJvdG8pIHx8CisJICAgIHN0cmNtcChhcmdzLmFyX2xvY2t0YWJsZSwgc2RwLT5zZF9hcmdzLmFyX2xvY2t0YWJsZSkgfHwKKwkgICAgc3RyY21wKGFyZ3MuYXJfaG9zdGRhdGEsIHNkcC0+c2RfYXJncy5hcl9ob3N0ZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogU29tZSBmbGFncyBtdXN0IG5vdCBiZSBjaGFuZ2VkICovCisJaWYgKGFyZ3NfbmVxKCZhcmdzLCAmc2RwLT5zZF9hcmdzLCBzcGVjdGF0b3IpIHx8CisJICAgIGFyZ3NfbmVxKCZhcmdzLCAmc2RwLT5zZF9hcmdzLCBpZ25vcmVfbG9jYWxfZnMpIHx8CisJICAgIGFyZ3NfbmVxKCZhcmdzLCAmc2RwLT5zZF9hcmdzLCBsb2NhbGZsb2NrcykgfHwKKwkgICAgYXJnc19uZXEoJmFyZ3MsICZzZHAtPnNkX2FyZ3MsIGxvY2FsY2FjaGluZykgfHwKKwkgICAgYXJnc19uZXEoJmFyZ3MsICZzZHAtPnNkX2FyZ3MsIG1ldGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzZHAtPnNkX2FyZ3MuYXJfc3BlY3RhdG9yKQorCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCisJaWYgKChzYi0+c19mbGFncyBeICpmbGFncykgJiBNU19SRE9OTFkpIHsKKwkJaWYgKCpmbGFncyAmIE1TX1JET05MWSkKKwkJCWVycm9yID0gZ2ZzMl9tYWtlX2ZzX3JvKHNkcCk7CisJCWVsc2UKKwkJCWVycm9yID0gZ2ZzMl9tYWtlX2ZzX3J3KHNkcCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwlzZHAtPnNkX2FyZ3MgPSBhcmdzOworCWlmIChzZHAtPnNkX2FyZ3MuYXJfcG9zaXhfYWNsKQorCQlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKKwllbHNlCisJCXNiLT5zX2ZsYWdzICY9IH5NU19QT1NJWEFDTDsKKwlzcGluX2xvY2soJmd0LT5ndF9zcGluKTsKKwlndC0+Z3RfbG9nX2ZsdXNoX3NlY3MgPSBhcmdzLmFyX2NvbW1pdDsKKwlzcGluX3VubG9jaygmZ3QtPmd0X3NwaW4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2ZzMl9kcm9wX2lub2RlIC0gRHJvcCBhbiBpbm9kZSAodGVzdCBmb3IgcmVtb3RlIHVubGluaykKKyAqIEBpbm9kZTogVGhlIGlub2RlIHRvIGRyb3AKKyAqCisgKiBJZiB3ZSd2ZSByZWNlaXZlZCBhIGNhbGxiYWNrIG9uIGFuIGlvcGVuIGxvY2sgdGhlbiBpdHMgYmVjYXVzZSBhCisgKiByZW1vdGUgbm9kZSB0cmllZCB0byBkZWFsbG9jYXRlIHRoZSBpbm9kZSBidXQgZmFpbGVkIGR1ZSB0byB0aGlzIG5vZGUKKyAqIHN0aWxsIGhhdmluZyB0aGUgaW5vZGUgb3Blbi4gSGVyZSB3ZSBtYXJrIHRoZSBsaW5rIGNvdW50IHplcm8KKyAqIHNpbmNlIHdlIGtub3cgdGhhdCBpdCBtdXN0IGhhdmUgcmVhY2hlZCB6ZXJvIGlmIHRoZSBHTEZfREVNT1RFIGZsYWcKKyAqIGlzIHNldCBvbiB0aGUgaW9wZW4gZ2xvY2suIElmIHdlIGRpZG4ndCBkbyBhIGRpc2sgcmVhZCBzaW5jZSB0aGUKKyAqIHJlbW90ZSBub2RlIHJlbW92ZWQgdGhlIGZpbmFsIGxpbmsgdGhlbiB3ZSBtaWdodCBvdGhlcndpc2UgbWlzcworICogdGhpcyBldmVudC4gVGhpcyBjaGVjayBlbnN1cmVzIHRoYXQgdGhpcyBub2RlIHdpbGwgZGVhbGxvY2F0ZSB0aGUKKyAqIGlub2RlJ3MgYmxvY2tzLCBvciBhbHRlcm5hdGl2ZWx5IHBhc3MgdGhlIGJhdG9uIG9uIHRvIGFub3RoZXIKKyAqIG5vZGUgZm9yIGxhdGVyIGRlYWxsb2NhdGlvbi4KKyAqLworCitzdGF0aWMgdm9pZCBnZnMyX2Ryb3BfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0koaW5vZGUpOworCisJaWYgKHRlc3RfYml0KEdJRl9VU0VSLCAmaXAtPmlfZmxhZ3MpICYmIGlub2RlLT5pX25saW5rKSB7CisJCXN0cnVjdCBnZnMyX2dsb2NrICpnbCA9IGlwLT5pX2lvcGVuX2doLmdoX2dsOworCQlpZiAoZ2wgJiYgdGVzdF9iaXQoR0xGX0RFTU9URSwgJmdsLT5nbF9mbGFncykpCisJCQljbGVhcl9ubGluayhpbm9kZSk7CisJfQorCWdlbmVyaWNfZHJvcF9pbm9kZShpbm9kZSk7Cit9CisKKy8qKgorICogZ2ZzMl9jbGVhcl9pbm9kZSAtIERlYWxsb2NhdGUgYW4gaW5vZGUgd2hlbiBWRlMgaXMgZG9uZSB3aXRoIGl0CisgKiBAaW5vZGU6IFRoZSBWRlMgaW5vZGUKKyAqCisgKi8KKworc3RhdGljIHZvaWQgZ2ZzMl9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CisKKwkvKiBUaGlzIHRlbGxzIHVzIGl0cyBhICJyZWFsIiBpbm9kZSBhbmQgbm90IG9uZSB3aGljaCBvbmx5CisJICogc2VydmVzIHRvIGNvbnRhaW4gYW4gYWRkcmVzcyBzcGFjZSAoc2VlIHJncnAuYywgbWV0YV9pby5jKQorCSAqIHdoaWNoIHRoZXJlZm9yZSBkb2Vzbid0IGhhdmUgaXRzIG93biBnbG9ja3MuCisJICovCisJaWYgKHRlc3RfYml0KEdJRl9VU0VSLCAmaXAtPmlfZmxhZ3MpKSB7CisJCWlwLT5pX2dsLT5nbF9vYmplY3QgPSBOVUxMOworCQlnZnMyX2dsb2NrX3B1dChpcC0+aV9nbCk7CisJCWlwLT5pX2dsID0gTlVMTDsKKwkJaWYgKGlwLT5pX2lvcGVuX2doLmdoX2dsKSB7CisJCQlpcC0+aV9pb3Blbl9naC5naF9nbC0+Z2xfb2JqZWN0ID0gTlVMTDsKKwkJCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZpcC0+aV9pb3Blbl9naCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNfYW5jZXN0b3IoY29uc3Qgc3RydWN0IGRlbnRyeSAqZDEsIGNvbnN0IHN0cnVjdCBkZW50cnkgKmQyKQoreworCWRvIHsKKwkJaWYgKGQxID09IGQyKQorCQkJcmV0dXJuIDE7CisJCWQxID0gZDEtPmRfcGFyZW50OworCX0gd2hpbGUgKCFJU19ST09UKGQxKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZ2ZzMl9zaG93X29wdGlvbnMgLSBTaG93IG1vdW50IG9wdGlvbnMgZm9yIC9wcm9jL21vdW50cworICogQHM6IHNlcV9maWxlIHN0cnVjdHVyZQorICogQG1udDogdmZzbW91bnQKKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZQorICovCisKK3N0YXRpYyBpbnQgZ2ZzMl9zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IG1udC0+bW50X3NiLT5zX2ZzX2luZm87CisJc3RydWN0IGdmczJfYXJncyAqYXJncyA9ICZzZHAtPnNkX2FyZ3M7CisJaW50IGxmc2VjczsKKworCWlmIChpc19hbmNlc3RvcihtbnQtPm1udF9yb290LCBzZHAtPnNkX21hc3Rlcl9kaXIpKQorCQlzZXFfcHJpbnRmKHMsICIsbWV0YSIpOworCWlmIChhcmdzLT5hcl9sb2NrcHJvdG9bMF0pCisJCXNlcV9wcmludGYocywgIixsb2NrcHJvdG89JXMiLCBhcmdzLT5hcl9sb2NrcHJvdG8pOworCWlmIChhcmdzLT5hcl9sb2NrdGFibGVbMF0pCisJCXNlcV9wcmludGYocywgIixsb2NrdGFibGU9JXMiLCBhcmdzLT5hcl9sb2NrdGFibGUpOworCWlmIChhcmdzLT5hcl9ob3N0ZGF0YVswXSkKKwkJc2VxX3ByaW50ZihzLCAiLGhvc3RkYXRhPSVzIiwgYXJncy0+YXJfaG9zdGRhdGEpOworCWlmIChhcmdzLT5hcl9zcGVjdGF0b3IpCisJCXNlcV9wcmludGYocywgIixzcGVjdGF0b3IiKTsKKwlpZiAoYXJncy0+YXJfaWdub3JlX2xvY2FsX2ZzKQorCQlzZXFfcHJpbnRmKHMsICIsaWdub3JlX2xvY2FsX2ZzIik7CisJaWYgKGFyZ3MtPmFyX2xvY2FsZmxvY2tzKQorCQlzZXFfcHJpbnRmKHMsICIsbG9jYWxmbG9ja3MiKTsKKwlpZiAoYXJncy0+YXJfbG9jYWxjYWNoaW5nKQorCQlzZXFfcHJpbnRmKHMsICIsbG9jYWxjYWNoaW5nIik7CisJaWYgKGFyZ3MtPmFyX2RlYnVnKQorCQlzZXFfcHJpbnRmKHMsICIsZGVidWciKTsKKwlpZiAoYXJncy0+YXJfdXBncmFkZSkKKwkJc2VxX3ByaW50ZihzLCAiLHVwZ3JhZGUiKTsKKwlpZiAoYXJncy0+YXJfcG9zaXhfYWNsKQorCQlzZXFfcHJpbnRmKHMsICIsYWNsIik7CisJaWYgKGFyZ3MtPmFyX3F1b3RhICE9IEdGUzJfUVVPVEFfREVGQVVMVCkgeworCQljaGFyICpzdGF0ZTsKKwkJc3dpdGNoIChhcmdzLT5hcl9xdW90YSkgeworCQljYXNlIEdGUzJfUVVPVEFfT0ZGOgorCQkJc3RhdGUgPSAib2ZmIjsKKwkJCWJyZWFrOworCQljYXNlIEdGUzJfUVVPVEFfQUNDT1VOVDoKKwkJCXN0YXRlID0gImFjY291bnQiOworCQkJYnJlYWs7CisJCWNhc2UgR0ZTMl9RVU9UQV9PTjoKKwkJCXN0YXRlID0gIm9uIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RhdGUgPSAidW5rbm93biI7CisJCQlicmVhazsKKwkJfQorCQlzZXFfcHJpbnRmKHMsICIscXVvdGE9JXMiLCBzdGF0ZSk7CisJfQorCWlmIChhcmdzLT5hcl9zdWlkZGlyKQorCQlzZXFfcHJpbnRmKHMsICIsc3VpZGRpciIpOworCWlmIChhcmdzLT5hcl9kYXRhICE9IEdGUzJfREFUQV9ERUZBVUxUKSB7CisJCWNoYXIgKnN0YXRlOworCQlzd2l0Y2ggKGFyZ3MtPmFyX2RhdGEpIHsKKwkJY2FzZSBHRlMyX0RBVEFfV1JJVEVCQUNLOgorCQkJc3RhdGUgPSAid3JpdGViYWNrIjsKKwkJCWJyZWFrOworCQljYXNlIEdGUzJfREFUQV9PUkRFUkVEOgorCQkJc3RhdGUgPSAib3JkZXJlZCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0YXRlID0gInVua25vd24iOworCQkJYnJlYWs7CisJCX0KKwkJc2VxX3ByaW50ZihzLCAiLGRhdGE9JXMiLCBzdGF0ZSk7CisJfQorCWlmIChhcmdzLT5hcl9kaXNjYXJkKQorCQlzZXFfcHJpbnRmKHMsICIsZGlzY2FyZCIpOworCWxmc2VjcyA9IHNkcC0+c2RfdHVuZS5ndF9sb2dfZmx1c2hfc2VjczsKKwlpZiAobGZzZWNzICE9IDYwKQorCQlzZXFfcHJpbnRmKHMsICIsY29tbWl0PSVkIiwgbGZzZWNzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIGhhdmUgdG8gKGF0IHRoZSBtb21lbnQpIGhvbGQgdGhlIGlub2RlcyBtYWluIGxvY2sgdG8gY292ZXIKKyAqIHRoZSBnYXAgYmV0d2VlbiB1bmxvY2tpbmcgdGhlIHNoYXJlZCBsb2NrIG9uIHRoZSBpb3BlbiBsb2NrIGFuZAorICogdGFraW5nIHRoZSBleGNsdXNpdmUgbG9jay4gSSdkIHJhdGhlciBkbyBhIHNoYXJlZCAtPiBleGNsdXNpdmUKKyAqIGNvbnZlcnNpb24gb24gdGhlIGlvcGVuIGxvY2ssIGJ1dCB3ZSBjYW4gY2hhbmdlIHRoYXQgbGF0ZXIuIFRoaXMKKyAqIGlzIHNhZmUsIGp1c3QgbGVzcyBlZmZpY2llbnQuCisgKi8KKworc3RhdGljIHZvaWQgZ2ZzMl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CisJc3RydWN0IGdmczJfaW5vZGUgKmlwID0gR0ZTMl9JKGlub2RlKTsKKwlzdHJ1Y3QgZ2ZzMl9ob2xkZXIgZ2g7CisJaW50IGVycm9yOworCisJaWYgKCF0ZXN0X2JpdChHSUZfVVNFUiwgJmlwLT5pX2ZsYWdzKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGdmczJfZ2xvY2tfbnFfaW5pdChpcC0+aV9nbCwgTE1fU1RfRVhDTFVTSVZFLCAwLCAmZ2gpOworCWlmICh1bmxpa2VseShlcnJvcikpIHsKKwkJZ2ZzMl9nbG9ja19kcV91bmluaXQoJmlwLT5pX2lvcGVuX2doKTsKKwkJZ290byBvdXQ7CisJfQorCisJZ2ZzMl9nbG9ja19kcV93YWl0KCZpcC0+aV9pb3Blbl9naCk7CisJZ2ZzMl9ob2xkZXJfcmVpbml0KExNX1NUX0VYQ0xVU0lWRSwgTE1fRkxBR19UUllfMUNCIHwgR0xfTk9DQUNIRSwgJmlwLT5pX2lvcGVuX2doKTsKKwllcnJvciA9IGdmczJfZ2xvY2tfbnEoJmlwLT5pX2lvcGVuX2doKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X3RydW5jYXRlOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgKGlwLT5pX2Rpc2tmbGFncyAmIEdGUzJfRElGX0VYSEFTSCkpIHsKKwkJZXJyb3IgPSBnZnMyX2Rpcl9leGhhc2hfZGVhbGxvYyhpcCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlpZiAoaXAtPmlfZWF0dHIpIHsKKwkJZXJyb3IgPSBnZnMyX2VhX2RlYWxsb2MoaXApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKCFnZnMyX2lzX3N0dWZmZWQoaXApKSB7CisJCWVycm9yID0gZ2ZzMl9maWxlX2RlYWxsb2MoaXApOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJZXJyb3IgPSBnZnMyX2Rpbm9kZV9kZWFsbG9jKGlwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X3VubG9jazsKKworb3V0X3RydW5jYXRlOgorCWVycm9yID0gZ2ZzMl90cmFuc19iZWdpbihzZHAsIDAsIHNkcC0+c2RfamRlc2MtPmpkX2Jsb2Nrcyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF91bmxvY2s7CisJLyogTmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgZ2xvY2sgcmVsZWFzZSAmIGFsc28gaW4gYSB0cmFuc2FjdGlvbiAqLworCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwlnZnMyX3RyYW5zX2VuZChzZHApOworCitvdXRfdW5sb2NrOgorCWlmICh0ZXN0X2JpdChISUZfSE9MREVSLCAmaXAtPmlfaW9wZW5fZ2guZ2hfaWZsYWdzKSkKKwkJZ2ZzMl9nbG9ja19kcSgmaXAtPmlfaW9wZW5fZ2gpOworCWdmczJfaG9sZGVyX3VuaW5pdCgmaXAtPmlfaW9wZW5fZ2gpOworCWdmczJfZ2xvY2tfZHFfdW5pbml0KCZnaCk7CisJaWYgKGVycm9yICYmIGVycm9yICE9IEdMUl9UUllGQUlMRUQgJiYgZXJyb3IgIT0gLUVST0ZTKQorCQlmc193YXJuKHNkcCwgImdmczJfZGVsZXRlX2lub2RlOiAlZFxuIiwgZXJyb3IpOworb3V0OgorCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwljbGVhcl9pbm9kZShpbm9kZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmdmczJfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXA7CisKKwlpcCA9IGttZW1fY2FjaGVfYWxsb2MoZ2ZzMl9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmIChpcCkgeworCQlpcC0+aV9mbGFncyA9IDA7CisJCWlwLT5pX2dsID0gTlVMTDsKKwl9CisJcmV0dXJuICZpcC0+aV9pbm9kZTsKK30KKworc3RhdGljIHZvaWQgZ2ZzMl9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKGdmczJfaW5vZGVfY2FjaGVwLCBpbm9kZSk7Cit9CisKK2NvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGdmczJfc3VwZXJfb3BzID0geworCS5hbGxvY19pbm9kZQkJPSBnZnMyX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCQk9IGdmczJfZGVzdHJveV9pbm9kZSwKKwkud3JpdGVfaW5vZGUJCT0gZ2ZzMl93cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCQk9IGdmczJfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJCT0gZ2ZzMl9wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCQk9IGdmczJfd3JpdGVfc3VwZXIsCisJLnN5bmNfZnMJCT0gZ2ZzMl9zeW5jX2ZzLAorCS5mcmVlemVfZnMgCQk9IGdmczJfZnJlZXplLAorCS51bmZyZWV6ZV9mcwkJPSBnZnMyX3VuZnJlZXplLAorCS5zdGF0ZnMJCQk9IGdmczJfc3RhdGZzLAorCS5yZW1vdW50X2ZzCQk9IGdmczJfcmVtb3VudF9mcywKKwkuY2xlYXJfaW5vZGUJCT0gZ2ZzMl9jbGVhcl9pbm9kZSwKKwkuZHJvcF9pbm9kZQkJPSBnZnMyX2Ryb3BfaW5vZGUsCisJLnNob3dfb3B0aW9ucwkJPSBnZnMyX3Nob3dfb3B0aW9ucywKK307CisKZGlmZiAtLWdpdCBhL2ZzL2dmczIvc3lzLmMgYi9mcy9nZnMyL3N5cy5jCmluZGV4IDc2NTVmNTAyLi4yMzQxOWRjIDEwMDY0NAotLS0gYS9mcy9nZnMyL3N5cy5jCisrKyBiL2ZzL2dmczIvc3lzLmMKQEAgLTI2LDYgKzI2LDM2IEBACiAjaW5jbHVkZSAidXRpbC5oIgogI2luY2x1ZGUgImdsb3BzLmgiCiAKK3N0cnVjdCBnZnMyX2F0dHIgeworCXN0cnVjdCBhdHRyaWJ1dGUgYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGdmczJfc2JkICosIGNoYXIgKik7CisJc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgZ2ZzMl9zYmQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworfTsKKworc3RhdGljIHNzaXplX3QgZ2ZzMl9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGdmczJfc2JkICpzZHAgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGdmczJfc2JkLCBzZF9rb2JqKTsKKwlzdHJ1Y3QgZ2ZzMl9hdHRyICphID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBnZnMyX2F0dHIsIGF0dHIpOworCXJldHVybiBhLT5zaG93ID8gYS0+c2hvdyhzZHAsIGJ1ZikgOiAwOworfQorCitzdGF0aWMgc3NpemVfdCBnZnMyX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBnZnMyX3NiZCwgc2Rfa29iaik7CisJc3RydWN0IGdmczJfYXR0ciAqYSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgZ2ZzMl9hdHRyLCBhdHRyKTsKKwlyZXR1cm4gYS0+c3RvcmUgPyBhLT5zdG9yZShzZHAsIGJ1ZiwgbGVuKSA6IGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgZ2ZzMl9hdHRyX29wcyA9IHsKKwkuc2hvdyAgPSBnZnMyX2F0dHJfc2hvdywKKwkuc3RvcmUgPSBnZnMyX2F0dHJfc3RvcmUsCit9OworCisKK3N0YXRpYyBzdHJ1Y3Qga3NldCAqZ2ZzMl9rc2V0OworCiBzdGF0aWMgc3NpemVfdCBpZF9zaG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXU6JXVcbiIsCkBAIC0yMTIsMTEgKzI0Miw2IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RydWN0IGdmczJfYXR0ciB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZ2ZzMl9zYmQgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBnZnMyX3NiZCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci19OwogCiAjZGVmaW5lIEdGUzJfQVRUUihuYW1lLCBtb2RlLCBzaG93LCBzdG9yZSkgXAogc3RhdGljIHN0cnVjdCBnZnMyX2F0dHIgZ2ZzMl9hdHRyXyMjbmFtZSA9IF9fQVRUUihuYW1lLCBtb2RlLCBzaG93LCBzdG9yZSkKQEAgLTI0Niw1OCArMjcxLDExIEBACiAJTlVMTCwKIH07CiAKLXN0YXRpYyBzc2l6ZV90IGdmczJfYXR0cl9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBnZnMyX3NiZCAqc2RwID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBnZnMyX3NiZCwgc2Rfa29iaik7Ci0Jc3RydWN0IGdmczJfYXR0ciAqYSA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgZ2ZzMl9hdHRyLCBhdHRyKTsKLQlyZXR1cm4gYS0+c2hvdyA/IGEtPnNob3coc2RwLCBidWYpIDogMDsKLX0KLQotc3RhdGljIHNzaXplX3QgZ2ZzMl9hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZ2ZzMl9zYmQsIHNkX2tvYmopOwotCXN0cnVjdCBnZnMyX2F0dHIgKmEgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGdmczJfYXR0ciwgYXR0cik7Ci0JcmV0dXJuIGEtPnN0b3JlID8gYS0+c3RvcmUoc2RwLCBidWYsIGxlbikgOiBsZW47Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGdmczJfYXR0cl9vcHMgPSB7Ci0JLnNob3cgID0gZ2ZzMl9hdHRyX3Nob3csCi0JLnN0b3JlID0gZ2ZzMl9hdHRyX3N0b3JlLAotfTsKLQogc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgZ2ZzMl9rdHlwZSA9IHsKIAkuZGVmYXVsdF9hdHRycyA9IGdmczJfYXR0cnMsCiAJLnN5c2ZzX29wcyAgICAgPSAmZ2ZzMl9hdHRyX29wcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qga3NldCAqZ2ZzMl9rc2V0OwotCi0vKgotICogZGlzcGxheSBzdHJ1Y3QgbG1fbG9ja3N0cnVjdCBmaWVsZHMKLSAqLwotCi1zdHJ1Y3QgbG9ja3N0cnVjdF9hdHRyIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBnZnMyX3NiZCAqLCBjaGFyICopOwotfTsKLQotI2RlZmluZSBMT0NLU1RSVUNUX0FUVFIobmFtZSwgZm10KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBzc2l6ZV90IG5hbWUjI19zaG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBjaGFyICpidWYpICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgZm10LCBzZHAtPnNkX2xvY2tzdHJ1Y3QubHNfIyNuYW1lKTsgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBzdHJ1Y3QgbG9ja3N0cnVjdF9hdHRyIGxvY2tzdHJ1Y3RfYXR0cl8jI25hbWUgPSBfX0FUVFJfUk8obmFtZSkKLQotTE9DS1NUUlVDVF9BVFRSKGppZCwgICAgICAiJXVcbiIpOwotTE9DS1NUUlVDVF9BVFRSKGZpcnN0LCAgICAiJXVcbiIpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG9ja3N0cnVjdF9hdHRyc1tdID0gewotCSZsb2Nrc3RydWN0X2F0dHJfamlkLmF0dHIsCi0JJmxvY2tzdHJ1Y3RfYXR0cl9maXJzdC5hdHRyLAotCU5VTEwsCi19OwogCiAvKgogICogbG9ja19tb2R1bGUuIE9yaWdpbmFsbHkgZnJvbSBsb2NrX2RsbQpAQCAtMzU5LDM0ICszMzcsMzMgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbHMtPmxzX2ZpcnN0X2RvbmUpOwogfQogCi1zdGF0aWMgc3NpemVfdCByZWNvdmVyX3Nob3coc3RydWN0IGdmczJfc2JkICpzZHAsIGNoYXIgKmJ1ZikKK3N0YXRpYyBzc2l6ZV90IHJlY292ZXJfc3RvcmUoc3RydWN0IGdmczJfc2JkICpzZHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3QgbG1fbG9ja3N0cnVjdCAqbHMgPSAmc2RwLT5zZF9sb2Nrc3RydWN0OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBscy0+bHNfcmVjb3Zlcl9qaWQpOwotfQotCi1zdGF0aWMgdm9pZCBnZnMyX2pkZXNjX21ha2VfZGlydHkoc3RydWN0IGdmczJfc2JkICpzZHAsIHVuc2lnbmVkIGludCBqaWQpCi17CisJdW5zaWduZWQgamlkOwogCXN0cnVjdCBnZnMyX2pkZXNjICpqZDsKKwlpbnQgcnY7CiAKKwlydiA9IHNzY2FuZihidWYsICIldSIsICZqaWQpOworCWlmIChydiAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJ2ID0gLUVTSFVURE9XTjsKIAlzcGluX2xvY2soJnNkcC0+c2RfamluZGV4X3NwaW4pOworCWlmICh0ZXN0X2JpdChTREZfTk9SRUNPVkVSWSwgJnNkcC0+c2RfZmxhZ3MpKQorCQlnb3RvIG91dDsKKwlydiA9IC1FQlVTWTsKKwlpZiAoc2RwLT5zZF9qZGVzYy0+amRfamlkID09IGppZCkKKwkJZ290byBvdXQ7CisJcnYgPSAtRU5PRU5UOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoamQsICZzZHAtPnNkX2ppbmRleF9saXN0LCBqZF9saXN0KSB7CiAJCWlmIChqZC0+amRfamlkICE9IGppZCkKIAkJCWNvbnRpbnVlOwotCQlqZC0+amRfZGlydHkgPSAxOworCQlydiA9IHNsb3dfd29ya19lbnF1ZXVlKCZqZC0+amRfd29yayk7CiAJCWJyZWFrOwogCX0KK291dDoKIAlzcGluX3VubG9jaygmc2RwLT5zZF9qaW5kZXhfc3Bpbik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHJlY292ZXJfc3RvcmUoc3RydWN0IGdmczJfc2JkICpzZHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgbG1fbG9ja3N0cnVjdCAqbHMgPSAmc2RwLT5zZF9sb2Nrc3RydWN0OwotCWxzLT5sc19yZWNvdmVyX2ppZCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAwKTsKLQlnZnMyX2pkZXNjX21ha2VfZGlydHkoc2RwLCBscy0+bHNfcmVjb3Zlcl9qaWQpOwotCWlmIChzZHAtPnNkX3JlY292ZXJkX3Byb2Nlc3MpCi0JCXdha2VfdXBfcHJvY2VzcyhzZHAtPnNkX3JlY292ZXJkX3Byb2Nlc3MpOwotCXJldHVybiBsZW47CisJcmV0dXJuIHJ2ID8gcnYgOiBsZW47CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHJlY292ZXJfZG9uZV9zaG93KHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBjaGFyICpidWYpCkBAIC00MDEsMzEgKzM3OCwzMSBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBscy0+bHNfcmVjb3Zlcl9qaWRfc3RhdHVzKTsKIH0KIAotc3RydWN0IGdkbG1fYXR0ciB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBnZnMyX3NiZCAqc2RwLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci19Oworc3RhdGljIHNzaXplX3QgamlkX3Nob3coc3RydWN0IGdmczJfc2JkICpzZHAsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc2RwLT5zZF9sb2Nrc3RydWN0LmxzX2ppZCk7Cit9CiAKICNkZWZpbmUgR0RMTV9BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkgXAotc3RhdGljIHN0cnVjdCBnZGxtX2F0dHIgZ2RsbV9hdHRyXyMjX25hbWUgPSBfX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQorc3RhdGljIHN0cnVjdCBnZnMyX2F0dHIgZ2RsbV9hdHRyXyMjX25hbWUgPSBfX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQogCi1HRExNX0FUVFIocHJvdG9fbmFtZSwgICAgIDA0NDQsIHByb3RvX25hbWVfc2hvdywgICAgIE5VTEwpOwotR0RMTV9BVFRSKGJsb2NrLCAgICAgICAgICAwNjQ0LCBibG9ja19zaG93LCAgICAgICAgICBibG9ja19zdG9yZSk7Ci1HRExNX0FUVFIod2l0aGRyYXcsICAgICAgIDA2NDQsIHdpdGhkcmF3X3Nob3csICAgICAgIHdpdGhkcmF3X3N0b3JlKTsKLUdETE1fQVRUUihpZCwgICAgICAgICAgICAgMDQ0NCwgbGtpZF9zaG93LCAgICAgICAgICAgTlVMTCk7Ci1HRExNX0FUVFIoZmlyc3QsICAgICAgICAgIDA0NDQsIGxrZmlyc3Rfc2hvdywgICAgICAgIE5VTEwpOwotR0RMTV9BVFRSKGZpcnN0X2RvbmUsICAgICAwNDQ0LCBmaXJzdF9kb25lX3Nob3csICAgICBOVUxMKTsKLUdETE1fQVRUUihyZWNvdmVyLCAgICAgICAgMDY0NCwgcmVjb3Zlcl9zaG93LCAgICAgICAgcmVjb3Zlcl9zdG9yZSk7Ci1HRExNX0FUVFIocmVjb3Zlcl9kb25lLCAgIDA0NDQsIHJlY292ZXJfZG9uZV9zaG93LCAgIE5VTEwpOwotR0RMTV9BVFRSKHJlY292ZXJfc3RhdHVzLCAwNDQ0LCByZWNvdmVyX3N0YXR1c19zaG93LCBOVUxMKTsKK0dETE1fQVRUUihwcm90b19uYW1lLCAgICAgMDQ0NCwgcHJvdG9fbmFtZV9zaG93LAlOVUxMKTsKK0dETE1fQVRUUihibG9jaywgICAgICAgICAgMDY0NCwgYmxvY2tfc2hvdywJCWJsb2NrX3N0b3JlKTsKK0dETE1fQVRUUih3aXRoZHJhdywgICAgICAgMDY0NCwgd2l0aGRyYXdfc2hvdywJCXdpdGhkcmF3X3N0b3JlKTsKK0dETE1fQVRUUihpZCwgICAgICAgICAgICAgMDQ0NCwgbGtpZF9zaG93LAkJTlVMTCk7CitHRExNX0FUVFIoamlkLAkJICAwNDQ0LCBqaWRfc2hvdywJCU5VTEwpOworR0RMTV9BVFRSKGZpcnN0LCAgICAgICAgICAwNDQ0LCBsa2ZpcnN0X3Nob3csCQlOVUxMKTsKK0dETE1fQVRUUihmaXJzdF9kb25lLCAgICAgMDQ0NCwgZmlyc3RfZG9uZV9zaG93LAlOVUxMKTsKK0dETE1fQVRUUihyZWNvdmVyLCAgICAgICAgMDIwMCwgTlVMTCwJCQlyZWNvdmVyX3N0b3JlKTsKK0dETE1fQVRUUihyZWNvdmVyX2RvbmUsICAgMDQ0NCwgcmVjb3Zlcl9kb25lX3Nob3csCU5VTEwpOworR0RMTV9BVFRSKHJlY292ZXJfc3RhdHVzLCAwNDQ0LCByZWNvdmVyX3N0YXR1c19zaG93LAlOVUxMKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmxvY2tfbW9kdWxlX2F0dHJzW10gPSB7CiAJJmdkbG1fYXR0cl9wcm90b19uYW1lLmF0dHIsCiAJJmdkbG1fYXR0cl9ibG9jay5hdHRyLAogCSZnZGxtX2F0dHJfd2l0aGRyYXcuYXR0ciwKIAkmZ2RsbV9hdHRyX2lkLmF0dHIsCi0JJmxvY2tzdHJ1Y3RfYXR0cl9qaWQuYXR0ciwKKwkmZ2RsbV9hdHRyX2ppZC5hdHRyLAogCSZnZGxtX2F0dHJfZmlyc3QuYXR0ciwKIAkmZ2RsbV9hdHRyX2ZpcnN0X2RvbmUuYXR0ciwKIAkmZ2RsbV9hdHRyX3JlY292ZXIuYXR0ciwKQEAgLTQzNSw1MyArNDEyLDYgQEAKIH07CiAKIC8qCi0gKiBkaXNwbGF5IHN0cnVjdCBnZnMyX2FyZ3MgZmllbGRzCi0gKi8KLQotc3RydWN0IGFyZ3NfYXR0ciB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZ2ZzMl9zYmQgKiwgY2hhciAqKTsKLX07Ci0KLSNkZWZpbmUgQVJHU19BVFRSKG5hbWUsIGZtdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3NpemVfdCBuYW1lIyNfc2hvdyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCwgY2hhciAqYnVmKSAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIGZtdCwgc2RwLT5zZF9hcmdzLmFyXyMjbmFtZSk7ICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3RydWN0IGFyZ3NfYXR0ciBhcmdzX2F0dHJfIyNuYW1lID0gX19BVFRSX1JPKG5hbWUpCi0KLUFSR1NfQVRUUihsb2NrcHJvdG8sICAgICAgICIlc1xuIik7Ci1BUkdTX0FUVFIobG9ja3RhYmxlLCAgICAgICAiJXNcbiIpOwotQVJHU19BVFRSKGhvc3RkYXRhLCAgICAgICAgIiVzXG4iKTsKLUFSR1NfQVRUUihzcGVjdGF0b3IsICAgICAgICIlZFxuIik7Ci1BUkdTX0FUVFIoaWdub3JlX2xvY2FsX2ZzLCAiJWRcbiIpOwotQVJHU19BVFRSKGxvY2FsY2FjaGluZywgICAgIiVkXG4iKTsKLUFSR1NfQVRUUihsb2NhbGZsb2NrcywgICAgICIlZFxuIik7Ci1BUkdTX0FUVFIoZGVidWcsICAgICAgICAgICAiJWRcbiIpOwotQVJHU19BVFRSKHVwZ3JhZGUsICAgICAgICAgIiVkXG4iKTsKLUFSR1NfQVRUUihwb3NpeF9hY2wsICAgICAgICIlZFxuIik7Ci1BUkdTX0FUVFIocXVvdGEsICAgICAgICAgICAiJXVcbiIpOwotQVJHU19BVFRSKHN1aWRkaXIsICAgICAgICAgIiVkXG4iKTsKLUFSR1NfQVRUUihkYXRhLCAgICAgICAgICAgICIlZFxuIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphcmdzX2F0dHJzW10gPSB7Ci0JJmFyZ3NfYXR0cl9sb2NrcHJvdG8uYXR0ciwKLQkmYXJnc19hdHRyX2xvY2t0YWJsZS5hdHRyLAotCSZhcmdzX2F0dHJfaG9zdGRhdGEuYXR0ciwKLQkmYXJnc19hdHRyX3NwZWN0YXRvci5hdHRyLAotCSZhcmdzX2F0dHJfaWdub3JlX2xvY2FsX2ZzLmF0dHIsCi0JJmFyZ3NfYXR0cl9sb2NhbGNhY2hpbmcuYXR0ciwKLQkmYXJnc19hdHRyX2xvY2FsZmxvY2tzLmF0dHIsCi0JJmFyZ3NfYXR0cl9kZWJ1Zy5hdHRyLAotCSZhcmdzX2F0dHJfdXBncmFkZS5hdHRyLAotCSZhcmdzX2F0dHJfcG9zaXhfYWNsLmF0dHIsCi0JJmFyZ3NfYXR0cl9xdW90YS5hdHRyLAotCSZhcmdzX2F0dHJfc3VpZGRpci5hdHRyLAotCSZhcmdzX2F0dHJfZGF0YS5hdHRyLAotCU5VTEwsCi19OwotCi0vKgogICogZ2V0IGFuZCBzZXQgc3RydWN0IGdmczJfdHVuZSBmaWVsZHMKICAqLwogCkBAIC01MzEsMTQgKzQ2MSw4IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RydWN0IHR1bmVfYXR0ciB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZ2ZzMl9zYmQgKiwgY2hhciAqKTsKLQlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBnZnMyX3NiZCAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7Ci19OwotCiAjZGVmaW5lIFRVTkVfQVRUUl8zKG5hbWUsIHNob3csIHN0b3JlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3RydWN0IHR1bmVfYXR0ciB0dW5lX2F0dHJfIyNuYW1lID0gX19BVFRSKG5hbWUsIDA2NDQsIHNob3csIHN0b3JlKQorc3RhdGljIHN0cnVjdCBnZnMyX2F0dHIgdHVuZV9hdHRyXyMjbmFtZSA9IF9fQVRUUihuYW1lLCAwNjQ0LCBzaG93LCBzdG9yZSkKIAogI2RlZmluZSBUVU5FX0FUVFJfMihuYW1lLCBzdG9yZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIHNzaXplX3QgbmFtZSMjX3Nob3coc3RydWN0IGdmczJfc2JkICpzZHAsIGNoYXIgKmJ1ZikgICAgICAgICAgICAgICAgICAgXApAQCAtNTU0LDE1ICs0NzgsNiBAQAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogVFVORV9BVFRSXzIobmFtZSwgbmFtZSMjX3N0b3JlKQogCi0jZGVmaW5lIFRVTkVfQVRUUl9EQUVNT04obmFtZSwgcHJvY2VzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgc3NpemVfdCBuYW1lIyNfc3RvcmUoc3RydWN0IGdmczJfc2JkICpzZHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbilcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0Jc3NpemVfdCByID0gdHVuZV9zZXQoc2RwLCAmc2RwLT5zZF90dW5lLmd0XyMjbmFtZSwgMSwgYnVmLCBsZW4pOyAgICAgIFwKLQl3YWtlX3VwX3Byb2Nlc3Moc2RwLT5zZF8jI3Byb2Nlc3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXJldHVybiByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1UVU5FX0FUVFJfMihuYW1lLCBuYW1lIyNfc3RvcmUpCi0KIFRVTkVfQVRUUihpbmNvcmVfbG9nX2Jsb2NrcywgMCk7CiBUVU5FX0FUVFIobG9nX2ZsdXNoX3NlY3MsIDApOwogVFVORV9BVFRSKHF1b3RhX3dhcm5fcGVyaW9kLCAwKTsKQEAgLTU3NCw4ICs0ODksNiBAQAogVFVORV9BVFRSKHF1b3RhX3NpbXVsX3N5bmMsIDEpOwogVFVORV9BVFRSKHN0YWxsX3NlY3MsIDEpOwogVFVORV9BVFRSKHN0YXRmc19xdWFudHVtLCAxKTsKLVRVTkVfQVRUUl9EQUVNT04ocmVjb3ZlcmRfc2VjcywgcmVjb3ZlcmRfcHJvY2Vzcyk7Ci1UVU5FX0FUVFJfREFFTU9OKGxvZ2Rfc2VjcywgbG9nZF9wcm9jZXNzKTsKIFRVTkVfQVRUUl8zKHF1b3RhX3NjYWxlLCBxdW90YV9zY2FsZV9zaG93LCBxdW90YV9zY2FsZV9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0dW5lX2F0dHJzW10gPSB7CkBAIC01ODksMjMgKzUwMiwxMSBAQAogCSZ0dW5lX2F0dHJfcXVvdGFfc2ltdWxfc3luYy5hdHRyLAogCSZ0dW5lX2F0dHJfc3RhbGxfc2Vjcy5hdHRyLAogCSZ0dW5lX2F0dHJfc3RhdGZzX3F1YW50dW0uYXR0ciwKLQkmdHVuZV9hdHRyX3JlY292ZXJkX3NlY3MuYXR0ciwKLQkmdHVuZV9hdHRyX2xvZ2Rfc2Vjcy5hdHRyLAogCSZ0dW5lX2F0dHJfcXVvdGFfc2NhbGUuYXR0ciwKIAkmdHVuZV9hdHRyX25ld19maWxlc19qZGF0YS5hdHRyLAogCU5VTEwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsb2Nrc3RydWN0X2dyb3VwID0gewotCS5uYW1lID0gImxvY2tzdHJ1Y3QiLAotCS5hdHRycyA9IGxvY2tzdHJ1Y3RfYXR0cnMsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhcmdzX2dyb3VwID0gewotCS5uYW1lID0gImFyZ3MiLAotCS5hdHRycyA9IGFyZ3NfYXR0cnMsCi19OwotCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB0dW5lX2dyb3VwID0gewogCS5uYW1lID0gInR1bmUiLAogCS5hdHRycyA9IHR1bmVfYXR0cnMsCkBAIC02MjYsMTcgKzUyNyw5IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWw7CiAKLQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmbG9ja3N0cnVjdF9ncm91cCk7Ci0JaWYgKGVycm9yKQotCQlnb3RvIGZhaWxfcmVnOwotCi0JZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNkcC0+c2Rfa29iaiwgJmFyZ3NfZ3JvdXApOwotCWlmIChlcnJvcikKLQkJZ290byBmYWlsX2xvY2tzdHJ1Y3Q7Ci0KIAllcnJvciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmdHVuZV9ncm91cCk7CiAJaWYgKGVycm9yKQotCQlnb3RvIGZhaWxfYXJnczsKKwkJZ290byBmYWlsX3JlZzsKIAogCWVycm9yID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZsb2NrX21vZHVsZV9ncm91cCk7CiAJaWYgKGVycm9yKQpAQCAtNjQ3LDEwICs1NDAsNiBAQAogCiBmYWlsX3R1bmU6CiAJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZ0dW5lX2dyb3VwKTsKLWZhaWxfYXJnczoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnNkcC0+c2Rfa29iaiwgJmFyZ3NfZ3JvdXApOwotZmFpbF9sb2Nrc3RydWN0OgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmbG9ja3N0cnVjdF9ncm91cCk7CiBmYWlsX3JlZzoKIAlrb2JqZWN0X3B1dCgmc2RwLT5zZF9rb2JqKTsKIGZhaWw6CkBAIC02NjEsOCArNTUwLDYgQEAKIHZvaWQgZ2ZzMl9zeXNfZnNfZGVsKHN0cnVjdCBnZnMyX3NiZCAqc2RwKQogewogCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmdHVuZV9ncm91cCk7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZHAtPnNkX2tvYmosICZhcmdzX2dyb3VwKTsKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJnNkcC0+c2Rfa29iaiwgJmxvY2tzdHJ1Y3RfZ3JvdXApOwogCXN5c2ZzX3JlbW92ZV9ncm91cCgmc2RwLT5zZF9rb2JqLCAmbG9ja19tb2R1bGVfZ3JvdXApOwogCWtvYmplY3RfcHV0KCZzZHAtPnNkX2tvYmopOwogfQpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi90cmFucy5jIGIvZnMvZ2ZzMi90cmFucy5jCmluZGV4IDA1Mzc1MmQuLjRlZjBlOWYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvdHJhbnMuYworKysgYi9mcy9nZnMyL3RyYW5zLmMKQEAgLTMzLDYgKzMzLDkgQEAKIAlCVUdfT04oY3VycmVudC0+am91cm5hbF9pbmZvKTsKIAlCVUdfT04oYmxvY2tzID09IDAgJiYgcmV2b2tlcyA9PSAwKTsKIAorCWlmICghdGVzdF9iaXQoU0RGX0pPVVJOQUxfTElWRSwgJnNkcC0+c2RfZmxhZ3MpKQorCQlyZXR1cm4gLUVST0ZTOworCiAJdHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZ2ZzMl90cmFucyksIEdGUF9OT0ZTKTsKIAlpZiAoIXRyKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU0LDEyICs1Nyw2IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIGZhaWxfaG9sZGVyX3VuaW5pdDsKIAotCWlmICghdGVzdF9iaXQoU0RGX0pPVVJOQUxfTElWRSwgJnNkcC0+c2RfZmxhZ3MpKSB7Ci0JCXRyLT50cl90X2doLmdoX2ZsYWdzIHw9IEdMX05PQ0FDSEU7Ci0JCWVycm9yID0gLUVST0ZTOwotCQlnb3RvIGZhaWxfZ3VubG9jazsKLQl9Ci0KIAllcnJvciA9IGdmczJfbG9nX3Jlc2VydmUoc2RwLCB0ci0+dHJfcmVzZXJ2ZWQpOwogCWlmIChlcnJvcikKIAkJZ290byBmYWlsX2d1bmxvY2s7CmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IGMxNDYyZDQuLjk0MWM4NDIgMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW1hLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC05ODYsNiArOTg3LDcgQEAKIAkJCSZodWdldGxiZnNfZmlsZV9vcGVyYXRpb25zKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0X2RlbnRyeTsgLyogaW5vZGUgaXMgYWxyZWFkeSBhdHRhY2hlZCAqLworCWltYV9jb3VudHNfZ2V0KGZpbGUpOwogCiAJcmV0dXJuIGZpbGU7CiAKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IGJjYTBjNjEuLmNhMzM3MDEgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogCkBAIC0xODksNiArMTkwLDEwIEBACiAJaW5vZGUtPmlfcHJpdmF0ZSA9IE5VTEw7CiAJaW5vZGUtPmlfbWFwcGluZyA9IG1hcHBpbmc7CiAKKyNpZmRlZiBDT05GSUdfRlNOT1RJRlkKKwlpbm9kZS0+aV9mc25vdGlmeV9tYXNrID0gMDsKKyNlbmRpZgorCiAJcmV0dXJuIGlub2RlOwogCiBvdXRfZnJlZV9zZWN1cml0eToKQEAgLTIyMSw2ICsyMjYsNyBAQAogCUJVR19PTihpbm9kZV9oYXNfYnVmZmVycyhpbm9kZSkpOwogCWltYV9pbm9kZV9mcmVlKGlub2RlKTsKIAlzZWN1cml0eV9pbm9kZV9mcmVlKGlub2RlKTsKKwlmc25vdGlmeV9pbm9kZV9kZWxldGUoaW5vZGUpOwogCWlmIChpbm9kZS0+aV9zYi0+c19vcC0+ZGVzdHJveV9pbm9kZSkKIAkJaW5vZGUtPmlfc2ItPnNfb3AtPmRlc3Ryb3lfaW5vZGUoaW5vZGUpOwogCWVsc2UKQEAgLTI1Miw2ICsyNTgsOSBAQAogCUlOSVRfTElTVF9IRUFEKCZpbm9kZS0+aW5vdGlmeV93YXRjaGVzKTsKIAltdXRleF9pbml0KCZpbm9kZS0+aW5vdGlmeV9tdXRleCk7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRlNOT1RJRlkKKwlJTklUX0hMSVNUX0hFQUQoJmlub2RlLT5pX2Zzbm90aWZ5X21hcmtfZW50cmllcyk7CisjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0woaW5vZGVfaW5pdF9vbmNlKTsKIApAQCAtMzk4LDYgKzQwNyw3IEBACiAJbXV0ZXhfbG9jaygmaXBydW5lX211dGV4KTsKIAlzcGluX2xvY2soJmlub2RlX2xvY2spOwogCWlub3RpZnlfdW5tb3VudF9pbm9kZXMoJnNiLT5zX2lub2Rlcyk7CisJZnNub3RpZnlfdW5tb3VudF9pbm9kZXMoJnNiLT5zX2lub2Rlcyk7CiAJYnVzeSA9IGludmFsaWRhdGVfbGlzdCgmc2ItPnNfaW5vZGVzLCAmdGhyb3dfYXdheSk7CiAJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOwogCmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCA4MmQ5YzQyLi4yODZmMzhkIDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTQxNCwxMCArNDE0LDYgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRklCTUFQOgogCQlyZXR1cm4gaW9jdGxfZmlibWFwKGZpbHAsIHApOwotCWNhc2UgRlNfSU9DX0ZJRU1BUDoKLQkJcmV0dXJuIGlvY3RsX2ZpZW1hcChmaWxwLCBhcmcpOwotCWNhc2UgRklHRVRCU1o6Ci0JCXJldHVybiBwdXRfdXNlcihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsIHApOwogCWNhc2UgRklPTlJFQUQ6CiAJCXJldHVybiBwdXRfdXNlcihpX3NpemVfcmVhZChpbm9kZSkgLSBmaWxwLT5mX3BvcywgcCk7CiAJfQpAQCAtNTU3LDYgKzU1MywxNiBAQAogCQllcnJvciA9IGlvY3RsX2ZzdGhhdyhmaWxwKTsKIAkJYnJlYWs7CiAKKwljYXNlIEZTX0lPQ19GSUVNQVA6CisJCXJldHVybiBpb2N0bF9maWVtYXAoZmlscCwgYXJnKTsKKworCWNhc2UgRklHRVRCU1o6CisJeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwkJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCQlyZXR1cm4gcHV0X3VzZXIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLCBwKTsKKwl9CisKIAlkZWZhdWx0OgogCQlpZiAoU19JU1JFRyhmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQogCQkJZXJyb3IgPSBmaWxlX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvam91cm5hbC5jIGIvZnMvamJkMi9qb3VybmFsLmMKaW5kZXggNTgxNDQxMC4uNjJiZTdkMiAxMDA2NDQKLS0tIGEvZnMvamJkMi9qb3VybmFsLmMKKysrIGIvZnMvamJkMi9qb3VybmFsLmMKQEAgLTE3ODEsNyArMTc4MSw3IEBACiAgKiBKb3VybmFsIGFib3J0IGhhcyB2ZXJ5IHNwZWNpZmljIHNlbWFudGljcywgd2hpY2ggd2UgZGVzY3JpYmUKICAqIGZvciBqb3VybmFsIGFib3J0LgogICoKLSAqIFR3byBpbnRlcm5hbCBmdW5jdGlvbiwgd2hpY2ggcHJvdmlkZSBhYm9ydCB0byB0ZSBqYmQgbGF5ZXIKKyAqIFR3byBpbnRlcm5hbCBmdW5jdGlvbnMsIHdoaWNoIHByb3ZpZGUgYWJvcnQgdG8gdGhlIGpiZCBsYXllcgogICogaXRzZWxmIGFyZSBoZXJlLgogICovCiAKQEAgLTE4NzksNyArMTg3OSw3IEBACiAgKiBpbnQgamJkMl9qb3VybmFsX2Vycm5vICgpIC0gcmV0dXJucyB0aGUgam91cm5hbCdzIGVycm9yIHN0YXRlLgogICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gZXhhbWluZS4KICAqCi0gKiBUaGlzIGlzIHRoZSBlcnJubyBudW1iZXQgc2V0IHdpdGggamJkMl9qb3VybmFsX2Fib3J0KCksIHRoZSBsYXN0CisgKiBUaGlzIGlzIHRoZSBlcnJubyBudW1iZXIgc2V0IHdpdGggamJkMl9qb3VybmFsX2Fib3J0KCksIHRoZSBsYXN0CiAgKiB0aW1lIHRoZSBqb3VybmFsIHdhcyBtb3VudGVkIC0gaWYgdGhlIGpvdXJuYWwgd2FzIHN0b3BwZWQKICAqIHdpdGhvdXQgY2FsbGluZyBhYm9ydCB0aGlzIHdpbGwgYmUgMC4KICAqCkBAIC0xOTAzLDcgKzE5MDMsNyBAQAogICogaW50IGpiZDJfam91cm5hbF9jbGVhcl9lcnIgKCkgLSBjbGVhcnMgdGhlIGpvdXJuYWwncyBlcnJvciBzdGF0ZQogICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gYWN0IG9uLgogICoKLSAqIEFuIGVycm9yIG11c3QgYmUgY2xlYXJlZCBvciBBY2tlZCB0byB0YWtlIGEgRlMgb3V0IG9mIHJlYWRvbmx5CisgKiBBbiBlcnJvciBtdXN0IGJlIGNsZWFyZWQgb3IgYWNrZWQgdG8gdGFrZSBhIEZTIG91dCBvZiByZWFkb25seQogICogbW9kZS4KICAqLwogaW50IGpiZDJfam91cm5hbF9jbGVhcl9lcnIoam91cm5hbF90ICpqb3VybmFsKQpAQCAtMTkyMyw3ICsxOTIzLDcgQEAKICAqIHZvaWQgamJkMl9qb3VybmFsX2Fja19lcnIoKSAtIEFjayBqb3VybmFsIGVyci4KICAqIEBqb3VybmFsOiBqb3VybmFsIHRvIGFjdCBvbi4KICAqCi0gKiBBbiBlcnJvciBtdXN0IGJlIGNsZWFyZWQgb3IgQWNrZWQgdG8gdGFrZSBhIEZTIG91dCBvZiByZWFkb25seQorICogQW4gZXJyb3IgbXVzdCBiZSBjbGVhcmVkIG9yIGFja2VkIHRvIHRha2UgYSBGUyBvdXQgb2YgcmVhZG9ubHkKICAqIG1vZGUuCiAgKi8KIHZvaWQgamJkMl9qb3VybmFsX2Fja19lcnIoam91cm5hbF90ICpqb3VybmFsKQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbWFwLmMgYi9mcy9qZnMvamZzX2ltYXAuYwppbmRleCAzNDYwNTcyLi4wZmMzMDQwIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX2ltYXAuYworKysgYi9mcy9qZnMvamZzX2ltYXAuYwpAQCAtMjU3MSw2ICsyNTcxLDcgQEAKIAogCQkJdHhBYm9ydCh0aWQsIDApOwogCQkJdHhFbmQodGlkKTsKKwkJCW11dGV4X3VubG9jaygmSkZTX0lQKGlwaW1hcCktPmNvbW1pdF9tdXRleCk7CiAKIAkJCS8qIHJlbGVhc2UgdGhlIGlub2RlIG1hcCBsb2NrICovCiAJCQlJV1JJVEVfVU5MT0NLKGlwaW1hcCk7CmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDZmMjFhZGYuLmQ5YjBlOTIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC03MjAsOCArNzIwLDEwIEBACiAJCWJsaysrOwogCX0KIG91dDoKLQlpZiAobGVuID09IHRvd3JpdGUpCisJaWYgKGxlbiA9PSB0b3dyaXRlKSB7CisJCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQlyZXR1cm4gZXJyOworCX0KIAlpZiAoaW5vZGUtPmlfc2l6ZSA8IG9mZitsZW4tdG93cml0ZSkKIAkJaV9zaXplX3dyaXRlKGlub2RlLCBvZmYrbGVuLXRvd3JpdGUpOwogCWlub2RlLT5pX3ZlcnNpb24rKzsKZGlmZiAtLWdpdCBhL2ZzL21wYWdlLmMgYi9mcy9tcGFnZS5jCmluZGV4IDY4MGJhNjAuLjQyMzgxYmQgMTAwNjQ0Ci0tLSBhL2ZzL21wYWdlLmMKKysrIGIvZnMvbXBhZ2UuYwpAQCAtMzc5LDcgKzM3OSw4IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkIG1hcF9iaDsKIAl1bnNpZ25lZCBsb25nIGZpcnN0X2xvZ2ljYWxfYmxvY2sgPSAwOwogCi0JY2xlYXJfYnVmZmVyX21hcHBlZCgmbWFwX2JoKTsKKwltYXBfYmguYl9zdGF0ZSA9IDA7CisJbWFwX2JoLmJfc2l6ZSA9IDA7CiAJZm9yIChwYWdlX2lkeCA9IDA7IHBhZ2VfaWR4IDwgbnJfcGFnZXM7IHBhZ2VfaWR4KyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VzLT5wcmV2LCBzdHJ1Y3QgcGFnZSwgbHJ1KTsKIApAQCAtNDEyLDcgKzQxMyw4IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkIG1hcF9iaDsKIAl1bnNpZ25lZCBsb25nIGZpcnN0X2xvZ2ljYWxfYmxvY2sgPSAwOwogCi0JY2xlYXJfYnVmZmVyX21hcHBlZCgmbWFwX2JoKTsKKwltYXBfYmguYl9zdGF0ZSA9IDA7CisJbWFwX2JoLmJfc2l6ZSA9IDA7CiAJYmlvID0gZG9fbXBhZ2VfcmVhZHBhZ2UoYmlvLCBwYWdlLCAxLCAmbGFzdF9ibG9ja19pbl9iaW8sCiAJCQkmbWFwX2JoLCAmZmlyc3RfbG9naWNhbF9ibG9jaywgZ2V0X2Jsb2NrKTsKIAlpZiAoYmlvKQpkaWZmIC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKaW5kZXggOTY3YzNkYi4uYzgyODA1ZCAxMDA2NDQKLS0tIGEvZnMvbmFtZWkuYworKysgYi9mcy9uYW1laS5jCkBAIC04NTMsNyArODUzLDggQEAKIAkJCWVyciA9IGlub2RlX3Blcm1pc3Npb24obmQtPnBhdGguZGVudHJ5LT5kX2lub2RlLAogCQkJCQkgICAgICAgTUFZX0VYRUMpOwogCQlpZiAoIWVycikKLQkJCWVyciA9IGltYV9wYXRoX2NoZWNrKCZuZC0+cGF0aCwgTUFZX0VYRUMpOworCQkJZXJyID0gaW1hX3BhdGhfY2hlY2soJm5kLT5wYXRoLCBNQVlfRVhFQywKKwkJCQkgICAgICAgICAgICAgSU1BX0NPVU5UX1VQREFURSk7CiAgCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAKQEAgLTE1MTUsNyArMTUxNiw4IEBACiAJCXJldHVybiBlcnJvcjsKIAogCWVycm9yID0gaW1hX3BhdGhfY2hlY2socGF0aCwKLQkJCSAgICAgICBhY2NfbW9kZSAmIChNQVlfUkVBRCB8IE1BWV9XUklURSB8IE1BWV9FWEVDKSk7CisJCQkgICAgICAgYWNjX21vZGUgJiAoTUFZX1JFQUQgfCBNQVlfV1JJVEUgfCBNQVlfRVhFQyksCisJCQkgICAgICAgSU1BX0NPVU5UX1VQREFURSk7CiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAJLyoKZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCmluZGV4IGI2NjA0MzUuLmJkNTg0YmMgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvdmZzLmMKKysrIGIvZnMvbmZzZC92ZnMuYwpAQCAtNTUsNiArNTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjZW5kaWYgLyogQ09ORklHX05GU0RfVjQgKi8KICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2ltYS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtNzM1LDYgKzczNiw4IEBACiAJCQkgICAgZmxhZ3MsIGNyZWQpOwogCWlmIChJU19FUlIoKmZpbHApKQogCQlob3N0X2VyciA9IFBUUl9FUlIoKmZpbHApOworCWVsc2UKKwkJaW1hX2NvdW50c19nZXQoKmZpbHApOwogb3V0X25mc2VycjoKIAllcnIgPSBuZnNlcnJubyhob3N0X2Vycik7CiBvdXQ6CkBAIC0yMDI0LDYgKzIwMjcsNyBAQAogCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBhY2MpCiB7CiAJc3RydWN0IGlub2RlCSppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcGF0aAlwYXRoOwogCWludAkJZXJyOwogCiAJaWYgKGFjYyA9PSBORlNEX01BWV9OT1ApCkBAIC0yMDk2LDcgKzIxMDAsMTcgQEAKIAlpZiAoZXJyID09IC1FQUNDRVMgJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgogCSAgICBhY2MgPT0gKE5GU0RfTUFZX1JFQUQgfCBORlNEX01BWV9PV05FUl9PVkVSUklERSkpCiAJCWVyciA9IGlub2RlX3Blcm1pc3Npb24oaW5vZGUsIE1BWV9FWEVDKTsKKwlpZiAoZXJyKQorCQlnb3RvIG5mc2Rfb3V0OwogCisJLyogRG8gaW50ZWdyaXR5IChwZXJtaXNzaW9uKSBjaGVja2luZyBub3csIGJ1dCBkZWZlciBpbmNyZW1lbnRpbmcKKwkgKiBJTUEgY291bnRzIHRvIHRoZSBhY3R1YWwgZmlsZSBvcGVuLgorCSAqLworCXBhdGgubW50ID0gZXhwLT5leF9wYXRoLm1udDsKKwlwYXRoLmRlbnRyeSA9IGRlbnRyeTsKKwllcnIgPSBpbWFfcGF0aF9jaGVjaygmcGF0aCwgYWNjICYgKE1BWV9SRUFEIHwgTUFZX1dSSVRFIHwgTUFZX0VYRUMpLAorCQkJICAgICBJTUFfQ09VTlRfTEVBVkUpOworbmZzZF9vdXQ6CiAJcmV0dXJuIGVycj8gbmZzZXJybm8oZXJyKSA6IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYyBiL2ZzL25pbGZzMi90aGVfbmlsZnMuYwppbmRleCA3ZjY1YjNiLi5hOTFmMTViIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmMKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5jCkBAIC01MTUsNyArNTE1LDcgQEAKIAogCWJsb2Nrc2l6ZSA9IEJMT0NLX1NJWkUgPDwgbGUzMl90b19jcHUoc2JwLT5zX2xvZ19ibG9ja19zaXplKTsKIAlpZiAoc2ItPnNfYmxvY2tzaXplICE9IGJsb2Nrc2l6ZSkgewotCQlpbnQgaHdfYmxvY2tzaXplID0gYmRldl9oYXJkc2VjdF9zaXplKHNiLT5zX2JkZXYpOworCQlpbnQgaHdfYmxvY2tzaXplID0gYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoc2ItPnNfYmRldik7CiAKIAkJaWYgKGJsb2Nrc2l6ZSA8IGh3X2Jsb2Nrc2l6ZSkgewogCQkJcHJpbnRrKEtFUk5fRVJSCmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvS2NvbmZpZyBiL2ZzL25vdGlmeS9LY29uZmlnCmluZGV4IDUwOTE0ZDcuLjMxZGFjN2UgMTAwNjQ0Ci0tLSBhL2ZzL25vdGlmeS9LY29uZmlnCisrKyBiL2ZzL25vdGlmeS9LY29uZmlnCkBAIC0xLDIgKzEsMTUgQEAKK2NvbmZpZyBGU05PVElGWQorCWJvb2wgIkZpbGVzeXN0ZW0gbm90aWZpY2F0aW9uIGJhY2tlbmQiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgIGZzbm90aWZ5IGlzIGEgYmFja2VuZCBmb3IgZmlsZXN5c3RlbSBub3RpZmljYXRpb24uICBmc25vdGlmeSBkb2VzCisJICAgbm90IHByb3ZpZGUgYW55IHVzZXJzcGFjZSBpbnRlcmZhY2UgYnV0IGRvZXMgcHJvdmlkZSB0aGUgYmFzaXMKKwkgICBuZWVkZWQgZm9yIG90aGVyIG5vdGlmaWNhdGlvbiBzY2hlbWVzIHN1Y2ggYXMgZG5vdGlmeSwgaW5vdGlmeSwKKwkgICBhbmQgZmFub3RpZnkuCisKKwkgICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBmc25vdGlmeSBzdXBvcnQuCisKKwkgICBJZiB1bnN1cmUsIHNheSBZLgorCiBzb3VyY2UgImZzL25vdGlmeS9kbm90aWZ5L0tjb25maWciCiBzb3VyY2UgImZzL25vdGlmeS9pbm90aWZ5L0tjb25maWciCmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvTWFrZWZpbGUgYi9mcy9ub3RpZnkvTWFrZWZpbGUKaW5kZXggNWE5NWI2MC4uMDkyMmNjOCAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L01ha2VmaWxlCisrKyBiL2ZzL25vdGlmeS9NYWtlZmlsZQpAQCAtMSwyICsxLDQgQEAKK29iai0kKENPTkZJR19GU05PVElGWSkJCSs9IGZzbm90aWZ5Lm8gbm90aWZpY2F0aW9uLm8gZ3JvdXAubyBpbm9kZV9tYXJrLm8KKwogb2JqLXkJCQkrPSBkbm90aWZ5Lwogb2JqLXkJCQkrPSBpbm90aWZ5LwpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2Rub3RpZnkvS2NvbmZpZyBiL2ZzL25vdGlmeS9kbm90aWZ5L0tjb25maWcKaW5kZXggMjZhZGY1ZC4uOTA0ZmY4ZCAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2Rub3RpZnkvS2NvbmZpZworKysgYi9mcy9ub3RpZnkvZG5vdGlmeS9LY29uZmlnCkBAIC0xLDUgKzEsNiBAQAogY29uZmlnIEROT1RJRlkKIAlib29sICJEbm90aWZ5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGU05PVElGWQogCWRlZmF1bHQgeQogCWhlbHAKIAkgIERub3RpZnkgaXMgYSBkaXJlY3RvcnktYmFzZWQgcGVyLWZkIGZpbGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBzeXN0ZW0KZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9kbm90aWZ5L2Rub3RpZnkuYyBiL2ZzL25vdGlmeS9kbm90aWZ5L2Rub3RpZnkuYwppbmRleCBiMGFhMmNkLi44MjhhODg5IDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvZG5vdGlmeS9kbm90aWZ5LmMKKysrIGIvZnMvbm90aWZ5L2Rub3RpZnkvZG5vdGlmeS5jCkBAIC0zLDYgKzMsOSBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCwyMDAxLDIwMDIgU3RlcGhlbiBSb3Rod2VsbAogICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBFcmljIFBhcmlzIDxSZWQgSGF0IEluYz4KKyAqIGRub3RpZnkgd2FzIGxhcmdseSByZXdyaXR0ZW4gdG8gdXNlIHRoZSBuZXcgZnNub3RpZnkgaW5mcmFzdHJ1Y3R1cmUKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CkBAIC0yMSwxNzAgKzI0LDQxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZkdGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeV9iYWNrZW5kLmg+CiAKIGludCBkaXJfbm90aWZ5X2VuYWJsZSBfX3JlYWRfbW9zdGx5ID0gMTsKIAotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkbl9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkbm90aWZ5X3N0cnVjdF9jYWNoZSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpkbm90aWZ5X21hcmtfZW50cnlfY2FjaGUgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmRub3RpZnlfZ3JvdXAgX19yZWFkX21vc3RseTsKK3N0YXRpYyBERUZJTkVfTVVURVgoZG5vdGlmeV9tYXJrX211dGV4KTsKIAotc3RhdGljIHZvaWQgcmVkb19pbm9kZV9tYXNrKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0JdW5zaWduZWQgbG9uZyBuZXdfbWFzazsKKy8qCisgKiBkbm90aWZ5IHdpbGwgYXR0YWNoIG9uZSBvZiB0aGVzZSB0byBlYWNoIGlub2RlIChpX2Zzbm90aWZ5X21hcmtfZW50cmllcykgd2hpY2gKKyAqIGlzIGJlaW5nIHdhdGNoZWQgYnkgZG5vdGlmeS4gIElmIG11bHRpcGxlIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMgYXJlIHdhdGNoaW5nCisgKiB0aGUgc2FtZSBkaXJlY3Rvcnkgd2l0aCBkbm90aWZ5IHRoZWlyIGluZm9ybWF0aW9uIGlzIGNoYWluZWQgaW4gZG4KKyAqLworc3RydWN0IGRub3RpZnlfbWFya19lbnRyeSB7CisJc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgZnNuX2VudHJ5OwogCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqZG47Cit9OwogCisvKgorICogV2hlbiBhIHByb2Nlc3Mgc3RhcnRzIG9yIHN0b3BzIHdhdGNoaW5nIGFuIGlub2RlIHRoZSBzZXQgb2YgZXZlbnRzIHdoaWNoCisgKiBkbm90aWZ5IGNhcmVzIGFib3V0IGZvciB0aGF0IGlub2RlIG1heSBjaGFuZ2UuICBUaGlzIGZ1bmN0aW9uIHJ1bnMgdGhlCisgKiBsaXN0IG9mIGV2ZXJ5dGhpbmcgcmVjZWl2aW5nIGRub3RpZnkgZXZlbnRzIGFib3V0IHRoaXMgZGlyZWN0b3J5IGFuZCBjYWxjdWxhdGVzCisgKiB0aGUgc2V0IG9mIGFsbCB0aG9zZSBldmVudHMuICBBZnRlciBpdCB1cGRhdGVzIHdoYXQgZG5vdGlmeSBpcyBpbnRlcmVzdGVkIGluCisgKiBpdCBjYWxscyB0aGUgZnNub3RpZnkgZnVuY3Rpb24gc28gaXQgY2FuIHVwZGF0ZSB0aGUgc2V0IG9mIGFsbCBldmVudHMgcmVsZXZhbnQKKyAqIHRvIHRoaXMgaW5vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGRub3RpZnlfcmVjYWxjX2lub2RlX21hc2soc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5KQoreworCV9fdTMyIG5ld19tYXNrLCBvbGRfbWFzazsKKwlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKmRuOworCXN0cnVjdCBkbm90aWZ5X21hcmtfZW50cnkgKmRuZW50cnkgID0gY29udGFpbmVyX29mKGVudHJ5LAorCQkJCQkJCSAgIHN0cnVjdCBkbm90aWZ5X21hcmtfZW50cnksCisJCQkJCQkJICAgZnNuX2VudHJ5KTsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmZW50cnktPmxvY2spOworCisJb2xkX21hc2sgPSBlbnRyeS0+bWFzazsKIAluZXdfbWFzayA9IDA7Ci0JZm9yIChkbiA9IGlub2RlLT5pX2Rub3RpZnk7IGRuICE9IE5VTEw7IGRuID0gZG4tPmRuX25leHQpCi0JCW5ld19tYXNrIHw9IGRuLT5kbl9tYXNrICYgfkROX01VTFRJU0hPVDsKLQlpbm9kZS0+aV9kbm90aWZ5X21hc2sgPSBuZXdfbWFzazsKLX0KKwlmb3IgKGRuID0gZG5lbnRyeS0+ZG47IGRuICE9IE5VTEw7IGRuID0gZG4tPmRuX25leHQpCisJCW5ld19tYXNrIHw9IChkbi0+ZG5fbWFzayAmIH5GU19ETl9NVUxUSVNIT1QpOworCWVudHJ5LT5tYXNrID0gbmV3X21hc2s7CiAKLXZvaWQgZG5vdGlmeV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCkKLXsKLQlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKmRuOwotCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqKnByZXY7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQotCWlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJaWYgKG9sZF9tYXNrID09IG5ld19tYXNrKQogCQlyZXR1cm47Ci0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlwcmV2ID0gJmlub2RlLT5pX2Rub3RpZnk7Ci0Jd2hpbGUgKChkbiA9ICpwcmV2KSAhPSBOVUxMKSB7Ci0JCWlmICgoZG4tPmRuX293bmVyID09IGlkKSAmJiAoZG4tPmRuX2ZpbHAgPT0gZmlscCkpIHsKLQkJCSpwcmV2ID0gZG4tPmRuX25leHQ7Ci0JCQlyZWRvX2lub2RlX21hc2soaW5vZGUpOwotCQkJa21lbV9jYWNoZV9mcmVlKGRuX2NhY2hlLCBkbik7Ci0JCQlicmVhazsKLQkJfQotCQlwcmV2ID0gJmRuLT5kbl9uZXh0OwotCX0KLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwlpZiAoZW50cnktPmlub2RlKQorCQlmc25vdGlmeV9yZWNhbGNfaW5vZGVfbWFzayhlbnRyeS0+aW5vZGUpOwogfQogCi1pbnQgZmNudGxfZGlybm90aWZ5KGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQorLyoKKyAqIE1haW5zIGZzbm90aWZ5IGNhbGwgd2hlcmUgZXZlbnRzIGFyZSBkZWxpdmVyZWQgdG8gZG5vdGlmeS4KKyAqIEZpbmQgdGhlIGRub3RpZnkgbWFyayBvbiB0aGUgcmVsZXZhbnQgaW5vZGUsIHJ1biB0aGUgbGlzdCBvZiBkbm90aWZ5IHN0cnVjdHMKKyAqIG9uIHRoYXQgbWFyayBhbmQgZGV0ZXJtaW5lIHdoaWNoIG9mIHRoZW0gaGFzIGV4cHJlc3NlZCBpbnRlcmVzdCBpbiByZWNlaXZpbmcKKyAqIGV2ZW50cyBvZiB0aGlzIHR5cGUuICBXaGVuIGZvdW5kIHNlbmQgdGhlIGNvcnJlY3QgcHJvY2VzcyBhbmQgc2lnbmFsIGFuZAorICogZGVzdHJveSB0aGUgZG5vdGlmeSBzdHJ1Y3QgaWYgaXQgd2FzIG5vdCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgbXVsdGlwbGUKKyAqIGV2ZW50cy4KKyAqLworc3RhdGljIGludCBkbm90aWZ5X2hhbmRsZV9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLAorCQkJCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQpCiB7CisJc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgZG5vdGlmeV9tYXJrX2VudHJ5ICpkbmVudHJ5OworCXN0cnVjdCBpbm9kZSAqdG9fdGVsbDsKIAlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKmRuOwotCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqb2RuOwogCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqKnByZXY7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlmbF9vd25lcl90IGlkID0gY3VycmVudC0+ZmlsZXM7Ci0Jc3RydWN0IGZpbGUgKmY7Ci0JaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgZm93bl9zdHJ1Y3QgKmZvd247CiAKLQlpZiAoKGFyZyAmIH5ETl9NVUxUSVNIT1QpID09IDApIHsKLQkJZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7CisJdG9fdGVsbCA9IGV2ZW50LT50b190ZWxsOworCisJc3Bpbl9sb2NrKCZ0b190ZWxsLT5pX2xvY2spOworCWVudHJ5ID0gZnNub3RpZnlfZmluZF9tYXJrX2VudHJ5KGdyb3VwLCB0b190ZWxsKTsKKwlzcGluX3VubG9jaygmdG9fdGVsbC0+aV9sb2NrKTsKKworCS8qIHVubGlrZWx5IHNpbmNlIHdlIGFscmVheSBwYXNzZWQgZG5vdGlmeV9zaG91bGRfc2VuZF9ldmVudCgpICovCisJaWYgKHVubGlrZWx5KCFlbnRyeSkpCiAJCXJldHVybiAwOwotCX0KLQlpZiAoIWRpcl9ub3RpZnlfZW5hYmxlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQlyZXR1cm4gLUVOT1RESVI7Ci0JZG4gPSBrbWVtX2NhY2hlX2FsbG9jKGRuX2NhY2hlLCBHRlBfS0VSTkVMKTsKLQlpZiAoZG4gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlwcmV2ID0gJmlub2RlLT5pX2Rub3RpZnk7Ci0Jd2hpbGUgKChvZG4gPSAqcHJldikgIT0gTlVMTCkgewotCQlpZiAoKG9kbi0+ZG5fb3duZXIgPT0gaWQpICYmIChvZG4tPmRuX2ZpbHAgPT0gZmlscCkpIHsKLQkJCW9kbi0+ZG5fZmQgPSBmZDsKLQkJCW9kbi0+ZG5fbWFzayB8PSBhcmc7Ci0JCQlpbm9kZS0+aV9kbm90aWZ5X21hc2sgfD0gYXJnICYgfkROX01VTFRJU0hPVDsKLQkJCWdvdG8gb3V0X2ZyZWU7Ci0JCX0KLQkJcHJldiA9ICZvZG4tPmRuX25leHQ7Ci0JfQorCWRuZW50cnkgPSBjb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBkbm90aWZ5X21hcmtfZW50cnksIGZzbl9lbnRyeSk7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JZiA9IGZjaGVjayhmZCk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JLyogd2UnZCBsb3N0IHRoZSByYWNlIHdpdGggY2xvc2UoKSwgc29kIG9mZiBzaWxlbnRseSAqLwotCS8qIG5vdGUgdGhhdCBpbm9kZS0+aV9sb2NrIHByZXZlbnRzIHJlb3JkZXJpbmcgcHJvYmxlbXMKLQkgKiBiZXR3ZWVuIGFjY2Vzc2VzIHRvIGRlc2NyaXB0b3IgdGFibGUgYW5kIC0+aV9kbm90aWZ5ICovCi0JaWYgKGYgIT0gZmlscCkKLQkJZ290byBvdXRfZnJlZTsKLQotCWVycm9yID0gX19mX3NldG93bihmaWxwLCB0YXNrX3BpZChjdXJyZW50KSwgUElEVFlQRV9QSUQsIDApOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfZnJlZTsKLQotCWRuLT5kbl9tYXNrID0gYXJnOwotCWRuLT5kbl9mZCA9IGZkOwotCWRuLT5kbl9maWxwID0gZmlscDsKLQlkbi0+ZG5fb3duZXIgPSBpZDsKLQlpbm9kZS0+aV9kbm90aWZ5X21hc2sgfD0gYXJnICYgfkROX01VTFRJU0hPVDsKLQlkbi0+ZG5fbmV4dCA9IGlub2RlLT5pX2Rub3RpZnk7Ci0JaW5vZGUtPmlfZG5vdGlmeSA9IGRuOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlyZXR1cm4gMDsKLQotb3V0X2ZyZWU6Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwotCWttZW1fY2FjaGVfZnJlZShkbl9jYWNoZSwgZG4pOwotCXJldHVybiBlcnJvcjsKLX0KLQotdm9pZCBfX2lub2RlX2Rpcl9ub3RpZnkoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBldmVudCkKLXsKLQlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKglkbjsKLQlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKipwcmV2OwotCXN0cnVjdCBmb3duX3N0cnVjdCAqCWZvd247Ci0JaW50CQkJY2hhbmdlZCA9IDA7Ci0KLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCXByZXYgPSAmaW5vZGUtPmlfZG5vdGlmeTsKKwlzcGluX2xvY2soJmVudHJ5LT5sb2NrKTsKKwlwcmV2ID0gJmRuZW50cnktPmRuOwogCXdoaWxlICgoZG4gPSAqcHJldikgIT0gTlVMTCkgewotCQlpZiAoKGRuLT5kbl9tYXNrICYgZXZlbnQpID09IDApIHsKKwkJaWYgKChkbi0+ZG5fbWFzayAmIGV2ZW50LT5tYXNrKSA9PSAwKSB7CiAJCQlwcmV2ID0gJmRuLT5kbl9uZXh0OwogCQkJY29udGludWU7CiAJCX0KIAkJZm93biA9ICZkbi0+ZG5fZmlscC0+Zl9vd25lcjsKIAkJc2VuZF9zaWdpbyhmb3duLCBkbi0+ZG5fZmQsIFBPTExfTVNHKTsKLQkJaWYgKGRuLT5kbl9tYXNrICYgRE5fTVVMVElTSE9UKQorCQlpZiAoZG4tPmRuX21hc2sgJiBGU19ETl9NVUxUSVNIT1QpCiAJCQlwcmV2ID0gJmRuLT5kbl9uZXh0OwogCQllbHNlIHsKIAkJCSpwcmV2ID0gZG4tPmRuX25leHQ7Ci0JCQljaGFuZ2VkID0gMTsKLQkJCWttZW1fY2FjaGVfZnJlZShkbl9jYWNoZSwgZG4pOworCQkJa21lbV9jYWNoZV9mcmVlKGRub3RpZnlfc3RydWN0X2NhY2hlLCBkbik7CisJCQlkbm90aWZ5X3JlY2FsY19pbm9kZV9tYXNrKGVudHJ5KTsKIAkJfQogCX0KLQlpZiAoY2hhbmdlZCkKLQkJcmVkb19pbm9kZV9tYXNrKGlub2RlKTsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci19CiAKLUVYUE9SVF9TWU1CT0woX19pbm9kZV9kaXJfbm90aWZ5KTsKKwlzcGluX3VubG9jaygmZW50cnktPmxvY2spOworCWZzbm90aWZ5X3B1dF9tYXJrKGVudHJ5KTsKKworCXJldHVybiAwOworfQogCiAvKgotICogVGhpcyBpcyBob3BlbGVzc2x5IHdyb25nLCBidXQgdW5maXhhYmxlIHdpdGhvdXQgQVBJIGNoYW5nZXMuICBBdAotICogbGVhc3QgaXQgZG9lc24ndCBvb3BzIHRoZSBrZXJuZWwuLi4KLSAqCi0gKiBUbyBzYWZlbHkgYWNjZXNzIC0+ZF9wYXJlbnQgd2UgbmVlZCB0byBrZWVwIGRfbW92ZSBhd2F5IGZyb20gaXQuICBVc2UgdGhlCi0gKiBkZW50cnkncyBkX2xvY2sgZm9yIHRoaXMuCisgKiBHaXZlbiBhbiBpbm9kZSBhbmQgbWFzayBkZXRlcm1pbmUgaWYgZG5vdGlmeSB3b3VsZCBiZSBpbnRlcmVzdGVkIGluIHNlbmRpbmcKKyAqIHVzZXJzcGFjZSBub3RpZmljYXRpb24gZm9yIHRoYXQgcGFpci4KICAqLwotdm9pZCBkbm90aWZ5X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVuc2lnbmVkIGxvbmcgZXZlbnQpCitzdGF0aWMgYm9vbCBkbm90aWZ5X3Nob3VsZF9zZW5kX2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsCisJCQkJICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgX191MzIgbWFzaykKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5OworCWJvb2wgc2VuZDsKIAorCS8qICFkaXJfbm90aWZ5X2VuYWJsZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGRvbid0IHdhc3RlIHRpbWUgY2hlY2tpbmcKIAlpZiAoIWRpcl9ub3RpZnlfZW5hYmxlKQorCQlyZXR1cm4gMDsgKi8KKworCS8qIG5vdCBhIGRpciwgZG5vdGlmeSBkb2Vzbid0IGNhcmUgKi8KKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJZW50cnkgPSBmc25vdGlmeV9maW5kX21hcmtfZW50cnkoZ3JvdXAsIGlub2RlKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwkvKiBubyBtYXJrIG1lYW5zIG5vIGRub3RpZnkgd2F0Y2ggKi8KKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gZmFsc2U7CisKKwltYXNrID0gKG1hc2sgJiB+RlNfRVZFTlRfT05fQ0hJTEQpOworCXNlbmQgPSAobWFzayAmIGVudHJ5LT5tYXNrKTsKKworCWZzbm90aWZ5X3B1dF9tYXJrKGVudHJ5KTsgLyogbWF0Y2hlcyBmc25vdGlmeV9maW5kX21hcmtfZW50cnkgKi8KKworCXJldHVybiBzZW5kOworfQorCitzdGF0aWMgdm9pZCBkbm90aWZ5X2ZyZWVfbWFyayhzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IGRub3RpZnlfbWFya19lbnRyeSAqZG5lbnRyeSA9IGNvbnRhaW5lcl9vZihlbnRyeSwKKwkJCQkJCQkgIHN0cnVjdCBkbm90aWZ5X21hcmtfZW50cnksCisJCQkJCQkJICBmc25fZW50cnkpOworCisJQlVHX09OKGRuZW50cnktPmRuKTsKKworCWttZW1fY2FjaGVfZnJlZShkbm90aWZ5X21hcmtfZW50cnlfY2FjaGUsIGRuZW50cnkpOworfQorCitzdGF0aWMgc3RydWN0IGZzbm90aWZ5X29wcyBkbm90aWZ5X2Zzbm90aWZ5X29wcyA9IHsKKwkuaGFuZGxlX2V2ZW50ID0gZG5vdGlmeV9oYW5kbGVfZXZlbnQsCisJLnNob3VsZF9zZW5kX2V2ZW50ID0gZG5vdGlmeV9zaG91bGRfc2VuZF9ldmVudCwKKwkuZnJlZV9ncm91cF9wcml2ID0gTlVMTCwKKwkuZnJlZWluZ19tYXJrID0gTlVMTCwKKwkuZnJlZV9ldmVudF9wcml2ID0gTlVMTCwKK307CisKKy8qCisgKiBDYWxsZWQgZXZlcnkgdGltZSBhIGZpbGUgaXMgY2xvc2VkLiAgTG9va3MgZmlyc3QgZm9yIGEgZG5vdGlmeSBtYXJrIG9uIHRoZQorICogaW5vZGUuICBJZiBvbmUgaXMgZm91bmQgcnVuIGFsbCBvZiB0aGUgLT5kbiBlbnRyaWVzIGF0dGFjaGVkIHRvIHRoYXQKKyAqIG1hcmsgZm9yIG9uZSByZWxldmFudCB0byB0aGlzIHByb2Nlc3MgY2xvc2luZyB0aGUgZmlsZSBhbmQgcmVtb3ZlIHRoYXQKKyAqIGRub3RpZnlfc3RydWN0LiAgSWYgdGhhdCB3YXMgdGhlIGxhc3QgZG5vdGlmeV9zdHJ1Y3QgYWxzbyByZW1vdmUgdGhlCisgKiBmc25vdGlmeV9tYXJrX2VudHJ5LgorICovCit2b2lkIGRub3RpZnlfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCit7CisJc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5OworCXN0cnVjdCBkbm90aWZ5X21hcmtfZW50cnkgKmRuZW50cnk7CisJc3RydWN0IGRub3RpZnlfc3RydWN0ICpkbjsKKwlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKipwcmV2OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OwotCWlmIChwYXJlbnQtPmRfaW5vZGUtPmlfZG5vdGlmeV9tYXNrICYgZXZlbnQpIHsKLQkJZGdldChwYXJlbnQpOwotCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOwotCQlfX2lub2RlX2Rpcl9ub3RpZnkocGFyZW50LT5kX2lub2RlLCBldmVudCk7Ci0JCWRwdXQocGFyZW50KTsKLQl9IGVsc2UgewotCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJZW50cnkgPSBmc25vdGlmeV9maW5kX21hcmtfZW50cnkoZG5vdGlmeV9ncm91cCwgaW5vZGUpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm47CisJZG5lbnRyeSA9IGNvbnRhaW5lcl9vZihlbnRyeSwgc3RydWN0IGRub3RpZnlfbWFya19lbnRyeSwgZnNuX2VudHJ5KTsKKworCW11dGV4X2xvY2soJmRub3RpZnlfbWFya19tdXRleCk7CisKKwlzcGluX2xvY2soJmVudHJ5LT5sb2NrKTsKKwlwcmV2ID0gJmRuZW50cnktPmRuOworCXdoaWxlICgoZG4gPSAqcHJldikgIT0gTlVMTCkgeworCQlpZiAoKGRuLT5kbl9vd25lciA9PSBpZCkgJiYgKGRuLT5kbl9maWxwID09IGZpbHApKSB7CisJCQkqcHJldiA9IGRuLT5kbl9uZXh0OworCQkJa21lbV9jYWNoZV9mcmVlKGRub3RpZnlfc3RydWN0X2NhY2hlLCBkbik7CisJCQlkbm90aWZ5X3JlY2FsY19pbm9kZV9tYXNrKGVudHJ5KTsKKwkJCWJyZWFrOworCQl9CisJCXByZXYgPSAmZG4tPmRuX25leHQ7CiAJfQorCisJc3Bpbl91bmxvY2soJmVudHJ5LT5sb2NrKTsKKworCS8qIG5vdGhpbmcgZWxzZSBjb3VsZCBoYXZlIGZvdW5kIHVzIHRoYW5rcyB0byB0aGUgZG5vdGlmeV9tYXJrX211dGV4ICovCisJaWYgKGRuZW50cnktPmRuID09IE5VTEwpCisJCWZzbm90aWZ5X2Rlc3Ryb3lfbWFya19ieV9lbnRyeShlbnRyeSk7CisKKwlmc25vdGlmeV9yZWNhbGNfZ3JvdXBfbWFzayhkbm90aWZ5X2dyb3VwKTsKKworCW11dGV4X3VubG9jaygmZG5vdGlmeV9tYXJrX211dGV4KTsKKworCWZzbm90aWZ5X3B1dF9tYXJrKGVudHJ5KTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGRub3RpZnlfcGFyZW50KTsKKworLyogdGhpcyBjb252ZXJzaW9uIGlzIGRvbmUgb25seSBhdCB3YXRjaCBjcmVhdGlvbiAqLworc3RhdGljIF9fdTMyIGNvbnZlcnRfYXJnKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCV9fdTMyIG5ld19tYXNrID0gRlNfRVZFTlRfT05fQ0hJTEQ7CisKKwlpZiAoYXJnICYgRE5fTVVMVElTSE9UKQorCQluZXdfbWFzayB8PSBGU19ETl9NVUxUSVNIT1Q7CisJaWYgKGFyZyAmIEROX0RFTEVURSkKKwkJbmV3X21hc2sgfD0gKEZTX0RFTEVURSB8IEZTX01PVkVEX0ZST00pOworCWlmIChhcmcgJiBETl9NT0RJRlkpCisJCW5ld19tYXNrIHw9IEZTX01PRElGWTsKKwlpZiAoYXJnICYgRE5fQUNDRVNTKQorCQluZXdfbWFzayB8PSBGU19BQ0NFU1M7CisJaWYgKGFyZyAmIEROX0FUVFJJQikKKwkJbmV3X21hc2sgfD0gRlNfQVRUUklCOworCWlmIChhcmcgJiBETl9SRU5BTUUpCisJCW5ld19tYXNrIHw9IEZTX0ROX1JFTkFNRTsKKwlpZiAoYXJnICYgRE5fQ1JFQVRFKQorCQluZXdfbWFzayB8PSAoRlNfQ1JFQVRFIHwgRlNfTU9WRURfVE8pOworCisJcmV0dXJuIG5ld19tYXNrOworfQorCisvKgorICogSWYgbXVsdGlwbGUgcHJvY2Vzc2VzIHdhdGNoIHRoZSBzYW1lIGlub2RlIHdpdGggZG5vdGlmeSB0aGVyZSBpcyBvbmx5IG9uZQorICogZG5vdGlmeSBtYXJrIGluIGlub2RlLT5pX2Zzbm90aWZ5X21hcmtfZW50cmllcyBidXQgd2UgY2hhaW4gYSBkbm90aWZ5X3N0cnVjdAorICogb250byB0aGF0IG1hcmsuICBUaGlzIGZ1bmN0aW9uIGVpdGhlciBhdHRhY2hlcyB0aGUgbmV3IGRub3RpZnlfc3RydWN0IG9udG8KKyAqIHRoYXQgbGlzdCwgb3IgaXQgfD0gdGhlIG1hc2sgb250byBhbiBleGlzdGluZyBkbm9maXlfc3RydWN0LgorICovCitzdGF0aWMgaW50IGF0dGFjaF9kbihzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKmRuLCBzdHJ1Y3QgZG5vdGlmeV9tYXJrX2VudHJ5ICpkbmVudHJ5LAorCQkgICAgIGZsX293bmVyX3QgaWQsIGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIF9fdTMyIG1hc2spCit7CisJc3RydWN0IGRub3RpZnlfc3RydWN0ICpvZG47CisKKwlvZG4gPSBkbmVudHJ5LT5kbjsKKwl3aGlsZSAob2RuICE9IE5VTEwpIHsKKwkJLyogYWRkaW5nIG1vcmUgZXZlbnRzIHRvIGV4aXN0aW5nIGRub2ZpeV9zdHJ1Y3Q/ICovCisJCWlmICgob2RuLT5kbl9vd25lciA9PSBpZCkgJiYgKG9kbi0+ZG5fZmlscCA9PSBmaWxwKSkgeworCQkJb2RuLT5kbl9mZCA9IGZkOworCQkJb2RuLT5kbl9tYXNrIHw9IG1hc2s7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCQlvZG4gPSBvZG4tPmRuX25leHQ7CisJfQorCisJZG4tPmRuX21hc2sgPSBtYXNrOworCWRuLT5kbl9mZCA9IGZkOworCWRuLT5kbl9maWxwID0gZmlscDsKKwlkbi0+ZG5fb3duZXIgPSBpZDsKKwlkbi0+ZG5fbmV4dCA9IGRuZW50cnktPmRuOworCWRuZW50cnktPmRuID0gZG47CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdoZW4gYSBwcm9jZXNzIGNhbGxzIGZjbnRsIHRvIGF0dGFjaCBhIGRub3RpZnkgd2F0Y2ggdG8gYSBkaXJlY3RvcnkgaXQgZW5kcworICogdXAgaGVyZS4gIEFsbG9jYXRlIGJvdGggYSBtYXJrIGZvciBmc25vdGlmeSB0byBhZGQgYW5kIGEgZG5vdGlmeV9zdHJ1Y3QgdG8gYmUKKyAqIGF0dGFjaGVkIHRvIHRoZSBmc25vdGlmeV9tYXJrLgorICovCitpbnQgZmNudGxfZGlybm90aWZ5KGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBkbm90aWZ5X21hcmtfZW50cnkgKm5ld19kbmVudHJ5LCAqZG5lbnRyeTsKKwlzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqbmV3X2VudHJ5LCAqZW50cnk7CisJc3RydWN0IGRub3RpZnlfc3RydWN0ICpkbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWZsX293bmVyX3QgaWQgPSBjdXJyZW50LT5maWxlczsKKwlzdHJ1Y3QgZmlsZSAqZjsKKwlpbnQgZGVzdHJveSA9IDAsIGVycm9yID0gMDsKKwlfX3UzMiBtYXNrOworCisJLyogd2UgdXNlIHRoZXNlIHRvIHRlbGwgaWYgd2UgbmVlZCB0byBrZnJlZSAqLworCW5ld19lbnRyeSA9IE5VTEw7CisJZG4gPSBOVUxMOworCisJaWYgKCFkaXJfbm90aWZ5X2VuYWJsZSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiBhIDAgbWFzayBtZWFucyB3ZSBhcmUgZXhwbGljaXRseSByZW1vdmluZyB0aGUgd2F0Y2ggKi8KKwlpZiAoKGFyZyAmIH5ETl9NVUxUSVNIT1QpID09IDApIHsKKwkJZG5vdGlmeV9mbHVzaChmaWxwLCBpZCk7CisJCWVycm9yID0gMDsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIGRub3RpZnkgb25seSB3b3JrcyBvbiBkaXJlY3RvcmllcyAqLworCWlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJZXJyb3IgPSAtRU5PVERJUjsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIGV4cGVjdCBtb3N0IGZjbnRsIHRvIGFkZCBuZXcgcmF0aGVyIHRoYW4gYXVnbWVudCBvbGQgKi8KKwlkbiA9IGttZW1fY2FjaGVfYWxsb2MoZG5vdGlmeV9zdHJ1Y3RfY2FjaGUsIEdGUF9LRVJORUwpOworCWlmICghZG4pIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogbmV3IGZzbm90aWZ5IG1hcmssIHdlIGV4cGVjdCBtb3N0IGZjbnRsIGNhbGxzIHRvIGFkZCBhIG5ldyBtYXJrICovCisJbmV3X2RuZW50cnkgPSBrbWVtX2NhY2hlX2FsbG9jKGRub3RpZnlfbWFya19lbnRyeV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfZG5lbnRyeSkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwkvKiBjb252ZXJ0IHRoZSB1c2Vyc3BhY2UgRE5fKiAiYXJnIiB0byB0aGUgaW50ZXJuYWwgRlNfKiBkZWZpbmVzIGluIGZzbm90aWZ5ICovCisJbWFzayA9IGNvbnZlcnRfYXJnKGFyZyk7CisKKwkvKiBzZXQgdXAgdGhlIG5ld19lbnRyeSBhbmQgbmV3X2RuZW50cnkgKi8KKwluZXdfZW50cnkgPSAmbmV3X2RuZW50cnktPmZzbl9lbnRyeTsKKwlmc25vdGlmeV9pbml0X21hcmsobmV3X2VudHJ5LCBkbm90aWZ5X2ZyZWVfbWFyayk7CisJbmV3X2VudHJ5LT5tYXNrID0gbWFzazsKKwluZXdfZG5lbnRyeS0+ZG4gPSBOVUxMOworCisJLyogdGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCB0aGUgZmNudGwvY2xvc2UgcmFjZSBkZXNjcmliZWQgYmVsb3cgKi8KKwltdXRleF9sb2NrKCZkbm90aWZ5X21hcmtfbXV0ZXgpOworCisJLyogYWRkIHRoZSBuZXdfZW50cnkgb3IgZmluZCBhbiBvbGQgb25lLiAqLworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJZW50cnkgPSBmc25vdGlmeV9maW5kX21hcmtfZW50cnkoZG5vdGlmeV9ncm91cCwgaW5vZGUpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlpZiAoZW50cnkpIHsKKwkJZG5lbnRyeSA9IGNvbnRhaW5lcl9vZihlbnRyeSwgc3RydWN0IGRub3RpZnlfbWFya19lbnRyeSwgZnNuX2VudHJ5KTsKKwkJc3Bpbl9sb2NrKCZlbnRyeS0+bG9jayk7CisJfSBlbHNlIHsKKwkJZnNub3RpZnlfYWRkX21hcmsobmV3X2VudHJ5LCBkbm90aWZ5X2dyb3VwLCBpbm9kZSk7CisJCXNwaW5fbG9jaygmbmV3X2VudHJ5LT5sb2NrKTsKKwkJZW50cnkgPSBuZXdfZW50cnk7CisJCWRuZW50cnkgPSBuZXdfZG5lbnRyeTsKKwkJLyogd2UgdXNlZCBuZXdfZW50cnksIHNvIGRvbid0IGZyZWUgaXQgKi8KKwkJbmV3X2VudHJ5ID0gTlVMTDsKKwl9CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZiA9IGZjaGVjayhmZCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkvKiBpZiAoZiAhPSBmaWxwKSBtZWFucyB0aGF0IHdlIGxvc3QgYSByYWNlIGFuZCBhbm90aGVyIHRhc2svdGhyZWFkCisJICogYWN0dWFsbHkgY2xvc2VkIHRoZSBmZCB3ZSBhcmUgc3RpbGwgcGxheWluZyB3aXRoIGJlZm9yZSB3ZSBncmFiYmVkCisJICogdGhlIGRub3RpZnlfbWFya19tdXRleCBhbmQgZW50cnktPmxvY2suICBTaW5jZSBjbG9zaW5nIHRoZSBmZCBpcyB0aGUKKwkgKiBvbmx5IHRpbWUgd2UgY2xlYW4gdXAgdGhlIG1hcmsgZW50cmllcyB3ZSBuZWVkIHRvIGdldCBvdXIgbWFyayBvZmYKKwkgKiB0aGUgbGlzdC4gKi8KKwlpZiAoZiAhPSBmaWxwKSB7CisJCS8qIGlmIHdlIGFkZGVkIG91cnNlbHZlcywgc2hvb3Qgb3Vyc2VsdmVzLCBpdCdzIHBvc3NpYmxlIHRoYXQKKwkJICogdGhlIGZsdXNoIGFjdHVhbGx5IGRpZCBzaG9vdCB0aGlzIGVudHJ5LiAgVGhhdCdzIGZpbmUgdG9vCisJCSAqIHNpbmNlIG11bHRpcGxlIGNhbGxzIHRvIGRlc3Ryb3lfbWFyayBpcyBwZXJmZWN0bHkgc2FmZSwgaWYKKwkJICogd2UgZm91bmQgYSBkbmVudHJ5IGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGlub2RlLCBqdXN0IHNvZAorCQkgKiBvZmYgc2lsZW50bHkgYXMgdGhlIGZsdXNoIGF0IGNsb3NlIHRpbWUgZGVhbHQgd2l0aCBpdC4KKwkJICovCisJCWlmIChkbmVudHJ5ID09IG5ld19kbmVudHJ5KQorCQkJZGVzdHJveSA9IDE7CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gX19mX3NldG93bihmaWxwLCB0YXNrX3BpZChjdXJyZW50KSwgUElEVFlQRV9QSUQsIDApOworCWlmIChlcnJvcikgeworCQkvKiBpZiB3ZSBhZGRlZCwgd2UgbXVzdCBzaG9vdCAqLworCQlpZiAoZG5lbnRyeSA9PSBuZXdfZG5lbnRyeSkKKwkJCWRlc3Ryb3kgPSAxOworCQlnb3RvIG91dDsKKwl9CisKKwllcnJvciA9IGF0dGFjaF9kbihkbiwgZG5lbnRyeSwgaWQsIGZkLCBmaWxwLCBtYXNrKTsKKwkvKiAhZXJyb3IgbWVhbnMgdGhhdCB3ZSBhdHRhY2hlZCB0aGUgZG4gdG8gdGhlIGRuZW50cnksIHNvIGRvbid0IGZyZWUgaXQgKi8KKwlpZiAoIWVycm9yKQorCQlkbiA9IE5VTEw7CisJLyogLUVFWElTVCBtZWFucyB0aGF0IHdlIGRpZG4ndCBhZGQgdGhpcyBuZXcgZG4gYW5kIHVzZWQgYW4gb2xkIG9uZS4KKwkgKiB0aGF0IGlzbid0IGFuIGVycm9yIChhbmQgdGhlIHVudXNlZCBkbiBzaG91bGQgYmUgZnJlZWQpICovCisJZWxzZSBpZiAoZXJyb3IgPT0gLUVFWElTVCkKKwkJZXJyb3IgPSAwOworCisJZG5vdGlmeV9yZWNhbGNfaW5vZGVfbWFzayhlbnRyeSk7CitvdXQ6CisJc3Bpbl91bmxvY2soJmVudHJ5LT5sb2NrKTsKKworCWlmIChkZXN0cm95KQorCQlmc25vdGlmeV9kZXN0cm95X21hcmtfYnlfZW50cnkoZW50cnkpOworCisJZnNub3RpZnlfcmVjYWxjX2dyb3VwX21hc2soZG5vdGlmeV9ncm91cCk7CisKKwltdXRleF91bmxvY2soJmRub3RpZnlfbWFya19tdXRleCk7CisJZnNub3RpZnlfcHV0X21hcmsoZW50cnkpOworb3V0X2VycjoKKwlpZiAobmV3X2VudHJ5KQorCQlmc25vdGlmeV9wdXRfbWFyayhuZXdfZW50cnkpOworCWlmIChkbikKKwkJa21lbV9jYWNoZV9mcmVlKGRub3RpZnlfc3RydWN0X2NhY2hlLCBkbik7CisJcmV0dXJuIGVycm9yOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBkbm90aWZ5X2luaXQodm9pZCkKIHsKLQlkbl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkbm90aWZ5X2NhY2hlIiwKLQkJc2l6ZW9mKHN0cnVjdCBkbm90aWZ5X3N0cnVjdCksIDAsIFNMQUJfUEFOSUMsIE5VTEwpOworCWRub3RpZnlfc3RydWN0X2NhY2hlID0gS01FTV9DQUNIRShkbm90aWZ5X3N0cnVjdCwgU0xBQl9QQU5JQyk7CisJZG5vdGlmeV9tYXJrX2VudHJ5X2NhY2hlID0gS01FTV9DQUNIRShkbm90aWZ5X21hcmtfZW50cnksIFNMQUJfUEFOSUMpOworCisJZG5vdGlmeV9ncm91cCA9IGZzbm90aWZ5X29idGFpbl9ncm91cChETk9USUZZX0dST1VQX05VTSwKKwkJCQkJICAgICAgMCwgJmRub3RpZnlfZnNub3RpZnlfb3BzKTsKKwlpZiAoSVNfRVJSKGRub3RpZnlfZ3JvdXApKQorCQlwYW5pYygidW5hYmxlIHRvIGFsbG9jYXRlIGZzbm90aWZ5IGdyb3VwIGZvciBkbm90aWZ5XG4iKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2Zzbm90aWZ5LmMgYi9mcy9ub3RpZnkvZnNub3RpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzJmN2JkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbm90aWZ5L2Zzbm90aWZ5LmMKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4sIEVyaWMgUGFyaXMgPGVwYXJpc0ByZWRoYXQuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3JjdS5oPgorCisjaW5jbHVkZSA8bGludXgvZnNub3RpZnlfYmFja2VuZC5oPgorI2luY2x1ZGUgImZzbm90aWZ5LmgiCisKKy8qCisgKiBDbGVhciBhbGwgb2YgdGhlIG1hcmtzIG9uIGFuIGlub2RlIHdoZW4gaXQgaXMgYmVpbmcgZXZpY3RlZCBmcm9tIGNvcmUKKyAqLwordm9pZCBfX2Zzbm90aWZ5X2lub2RlX2RlbGV0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWZzbm90aWZ5X2NsZWFyX21hcmtzX2J5X2lub2RlKGlub2RlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fZnNub3RpZnlfaW5vZGVfZGVsZXRlKTsKKworLyoKKyAqIEdpdmVuIGFuIGlub2RlLCBmaXJzdCBjaGVjayBpZiB3ZSBjYXJlIHdoYXQgaGFwcGVucyB0byBvdXIgY2hpbGRyZW4uICBJbm90aWZ5CisgKiBhbmQgZG5vdGlmeSBib3RoIHRlbGwgdGhlaXIgcGFyZW50cyBhYm91dCBldmVudHMuICBJZiB3ZSBjYXJlIGFib3V0IGFueSBldmVudAorICogb24gYSBjaGlsZCB3ZSBydW4gYWxsIG9mIG91ciBjaGlsZHJlbiBhbmQgc2V0IGEgZGVudHJ5IGZsYWcgc2F5aW5nIHRoYXQgdGhlCisgKiBwYXJlbnQgY2FyZXMuICBUaHVzIHdoZW4gYW4gZXZlbnQgaGFwcGVucyBvbiBhIGNoaWxkIGl0IGNhbiBxdWlja2x5IHRlbGwgaWYKKyAqIGlmIHRoZXJlIGlzIGEgbmVlZCB0byBmaW5kIGEgcGFyZW50IGFuZCBzZW5kIHRoZSBldmVudCB0byB0aGUgcGFyZW50LgorICovCit2b2lkIF9fZnNub3RpZnlfdXBkYXRlX2NoaWxkX2RlbnRyeV9mbGFncyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmFsaWFzOworCWludCB3YXRjaGVkOworCisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm47CisKKwkvKiBkZXRlcm1pbmUgaWYgdGhlIGNoaWxkcmVuIHNob3VsZCB0ZWxsIGlub2RlIGFib3V0IHRoZWlyIGV2ZW50cyAqLworCXdhdGNoZWQgPSBmc25vdGlmeV9pbm9kZV93YXRjaGVzX2NoaWxkcmVuKGlub2RlKTsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCS8qIHJ1biBhbGwgb2YgdGhlIGRlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlub2RlLiAgU2luY2UgdGhpcyBpcyBhCisJICogZGlyZWN0b3J5LCB0aGVyZSBkYW1uIHdlbGwgYmV0dGVyIG9ubHkgYmUgb25lIGl0ZW0gb24gdGhpcyBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhbGlhcywgJmlub2RlLT5pX2RlbnRyeSwgZF9hbGlhcykgeworCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZDsKKworCQkvKiBydW4gYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGUgb3JpZ2luYWwgaW5vZGUgYW5kIGZpeCB0aGVpcgorCQkgKiBkX2ZsYWdzIHRvIGluZGljYXRlIHBhcmVudGFsIGludGVyZXN0ICh0aGVpciBwYXJlbnQgaXMgdGhlCisJCSAqIG9yaWdpbmFsIGlub2RlKSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmYWxpYXMtPmRfc3ViZGlycywgZF91LmRfY2hpbGQpIHsKKwkJCWlmICghY2hpbGQtPmRfaW5vZGUpCisJCQkJY29udGludWU7CisKKwkJCXNwaW5fbG9jaygmY2hpbGQtPmRfbG9jayk7CisJCQlpZiAod2F0Y2hlZCkKKwkJCQljaGlsZC0+ZF9mbGFncyB8PSBEQ0FDSEVfRlNOT1RJRllfUEFSRU5UX1dBVENIRUQ7CisJCQllbHNlCisJCQkJY2hpbGQtPmRfZmxhZ3MgJj0gfkRDQUNIRV9GU05PVElGWV9QQVJFTlRfV0FUQ0hFRDsKKwkJCXNwaW5fdW5sb2NrKCZjaGlsZC0+ZF9sb2NrKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKiBOb3RpZnkgdGhpcyBkZW50cnkncyBwYXJlbnQgYWJvdXQgYSBjaGlsZCdzIGV2ZW50cy4gKi8KK3ZvaWQgX19mc25vdGlmeV9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiBtYXNrKQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKnBfaW5vZGU7CisJYm9vbCBzZW5kID0gZmFsc2U7CisJYm9vbCBzaG91bGRfdXBkYXRlX2NoaWxkcmVuID0gZmFsc2U7CisKKwlpZiAoIShkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfRlNOT1RJRllfUEFSRU5UX1dBVENIRUQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCXBfaW5vZGUgPSBwYXJlbnQtPmRfaW5vZGU7CisKKwlpZiAoZnNub3RpZnlfaW5vZGVfd2F0Y2hlc19jaGlsZHJlbihwX2lub2RlKSkgeworCQlpZiAocF9pbm9kZS0+aV9mc25vdGlmeV9tYXNrICYgbWFzaykgeworCQkJZGdldChwYXJlbnQpOworCQkJc2VuZCA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgcGFyZW50IGRvZXNuJ3QgY2FyZSBhYm91dCBldmVudHMgb24gaXQncyBjaGlsZHJlbiBidXQKKwkJICogYXQgbGVhc3Qgb25lIGNoaWxkIHRob3VnaHQgaXQgZGlkLiAgV2UgbmVlZCB0byBydW4gYWxsIHRoZQorCQkgKiBjaGlsZHJlbiBhbmQgdXBkYXRlIHRoZWlyIGRfZmxhZ3MgdG8gbGV0IHRoZW0ga25vdyBwX2lub2RlCisJCSAqIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGVtIGFueSBtb3JlLgorCQkgKi8KKwkJZGdldChwYXJlbnQpOworCQlzaG91bGRfdXBkYXRlX2NoaWxkcmVuID0gdHJ1ZTsKKwl9CisKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCisJaWYgKHNlbmQpIHsKKwkJLyogd2UgYXJlIG5vdGlmeWluZyBhIHBhcmVudCBzbyBjb21lIHVwIHdpdGggdGhlIG5ldyBtYXNrIHdoaWNoCisJCSAqIHNwZWNpZmllcyB0aGVzZSBhcmUgZXZlbnRzIHdoaWNoIGNhbWUgZnJvbSBhIGNoaWxkLiAqLworCQltYXNrIHw9IEZTX0VWRU5UX09OX0NISUxEOworCisJCWZzbm90aWZ5KHBfaW5vZGUsIG1hc2ssIGRlbnRyeS0+ZF9pbm9kZSwgRlNOT1RJRllfRVZFTlRfSU5PREUsCisJCQkgZGVudHJ5LT5kX25hbWUubmFtZSwgMCk7CisJCWRwdXQocGFyZW50KTsKKwl9CisKKwlpZiAodW5saWtlbHkoc2hvdWxkX3VwZGF0ZV9jaGlsZHJlbikpIHsKKwkJX19mc25vdGlmeV91cGRhdGVfY2hpbGRfZGVudHJ5X2ZsYWdzKHBfaW5vZGUpOworCQlkcHV0KHBhcmVudCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoX19mc25vdGlmeV9wYXJlbnQpOworCisvKgorICogVGhpcyBpcyB0aGUgbWFpbiBjYWxsIHRvIGZzbm90aWZ5LiAgVGhlIFZGUyBjYWxscyBpbnRvIGhvb2sgc3BlY2lmaWMgZnVuY3Rpb25zCisgKiBpbiBsaW51eC9mc25vdGlmeS5oLiAgVGhvc2UgZnVuY3Rpb25zIHRoZW4gaW4gdHVybiBjYWxsIGhlcmUuICBIZXJlIHdpbGwgY2FsbAorICogb3V0IHRvIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBmc25vdGlmeV9ncm91cC4gIFRob3NlIGdyb3VwcyBjYW4gdGhlbiB1c2UgdGhlCisgKiBub3RpZmljYXRpb24gZXZlbnQgaW4gd2hhdGV2ZXIgbWVhbnMgdGhleSBmZWVsIG5lY2Vzc2FyeS4KKyAqLwordm9pZCBmc25vdGlmeShzdHJ1Y3QgaW5vZGUgKnRvX3RlbGwsIF9fdTMyIG1hc2ssIHZvaWQgKmRhdGEsIGludCBkYXRhX2lzLCBjb25zdCBjaGFyICpmaWxlX25hbWUsIHUzMiBjb29raWUpCit7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50ID0gTlVMTDsKKwlpbnQgaWR4OworCS8qIGdsb2JhbCB0ZXN0cyBzaG91bGRuJ3QgY2FyZSBhYm91dCBldmVudHMgb24gY2hpbGQgb25seSB0aGUgc3BlY2lmaWMgZXZlbnQgKi8KKwlfX3UzMiB0ZXN0X21hc2sgPSAobWFzayAmIH5GU19FVkVOVF9PTl9DSElMRCk7CisKKwlpZiAobGlzdF9lbXB0eSgmZnNub3RpZnlfZ3JvdXBzKSkKKwkJcmV0dXJuOworCisJaWYgKCEodGVzdF9tYXNrICYgZnNub3RpZnlfbWFzaykpCisJCXJldHVybjsKKworCWlmICghKHRlc3RfbWFzayAmIHRvX3RlbGwtPmlfZnNub3RpZnlfbWFzaykpCisJCXJldHVybjsKKwkvKgorCSAqIFNSQ1UhISAgdGhlIGdyb3VwcyBsaXN0IGlzIHZlcnkgdmVyeSBtdWNoIHJlYWQgb25seSBhbmQgdGhlIHBhdGggaXMKKwkgKiB2ZXJ5IGhvdC4gIFRoZSBWQVNUIG1ham9yaXR5IG9mIGV2ZW50cyBhcmUgbm90IGdvaW5nIHRvIG5lZWQgdG8gZG8KKwkgKiBhbnl0aGluZyBvdGhlciB0aGFuIHdhbGsgdGhlIGxpc3Qgc28gaXQncyBjcmF6eSB0byBwcmUtYWxsb2NhdGUuCisJICovCisJaWR4ID0gc3JjdV9yZWFkX2xvY2soJmZzbm90aWZ5X2dycF9zcmN1KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShncm91cCwgJmZzbm90aWZ5X2dyb3VwcywgZ3JvdXBfbGlzdCkgeworCQlpZiAodGVzdF9tYXNrICYgZ3JvdXAtPm1hc2spIHsKKwkJCWlmICghZ3JvdXAtPm9wcy0+c2hvdWxkX3NlbmRfZXZlbnQoZ3JvdXAsIHRvX3RlbGwsIG1hc2spKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFldmVudCkgeworCQkJCWV2ZW50ID0gZnNub3RpZnlfY3JlYXRlX2V2ZW50KHRvX3RlbGwsIG1hc2ssIGRhdGEsIGRhdGFfaXMsIGZpbGVfbmFtZSwgY29va2llKTsKKwkJCQkvKiBzaGl0LCB3ZSBPT00nZCBhbmQgbm93IHdlIGNhbid0IHRlbGwsIG1heWJlCisJCQkJICogc29tZWRheSBzb21lb25lIGVsc2Ugd2lsbCB3YW50IHRvIGRvIHNvbWV0aGluZworCQkJCSAqIGhlcmUgKi8KKwkJCQlpZiAoIWV2ZW50KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWdyb3VwLT5vcHMtPmhhbmRsZV9ldmVudChncm91cCwgZXZlbnQpOworCQl9CisJfQorCXNyY3VfcmVhZF91bmxvY2soJmZzbm90aWZ5X2dycF9zcmN1LCBpZHgpOworCS8qCisJICogZnNub3RpZnlfY3JlYXRlX2V2ZW50KCkgdG9vayBhIHJlZmVyZW5jZSBzbyB0aGUgZXZlbnQgY2FuJ3QgYmUgY2xlYW5lZAorCSAqIHVwIHdoaWxlIHdlIGFyZSBzdGlsbCB0cnlpbmcgdG8gYWRkIGl0IHRvIGxpc3RzLCBkcm9wIHRoYXQgb25lLgorCSAqLworCWlmIChldmVudCkKKwkJZnNub3RpZnlfcHV0X2V2ZW50KGV2ZW50KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbm90aWZ5KTsKKworc3RhdGljIF9faW5pdCBpbnQgZnNub3RpZnlfaW5pdCh2b2lkKQoreworCXJldHVybiBpbml0X3NyY3Vfc3RydWN0KCZmc25vdGlmeV9ncnBfc3JjdSk7Cit9CitzdWJzeXNfaW5pdGNhbGwoZnNub3RpZnlfaW5pdCk7CmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvZnNub3RpZnkuaCBiL2ZzL25vdGlmeS9mc25vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYzI0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ub3RpZnkvZnNub3RpZnkuaApAQCAtMCwwICsxLDM0IEBACisjaWZuZGVmIF9fRlNfTk9USUZZX0ZTTk9USUZZX0hfCisjZGVmaW5lIF9fRlNfTk9USUZZX0ZTTk9USUZZX0hfCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcmN1Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogcHJvdGVjdHMgcmVhZHMgb2YgZnNub3RpZnlfZ3JvdXBzICovCitleHRlcm4gc3RydWN0IHNyY3Vfc3RydWN0IGZzbm90aWZ5X2dycF9zcmN1OworLyogYWxsIGdyb3VwcyB3aGljaCByZWNlaXZlIGZzbm90aWZ5IGV2ZW50cyAqLworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgZnNub3RpZnlfZ3JvdXBzOworLyogYWxsIGJpdHdpc2UgT1Igb2YgYWxsIGV2ZW50IHR5cGVzIChGU18qKSBmb3IgYWxsIGZzbm90aWZ5X2dyb3VwcyAqLworZXh0ZXJuIF9fdTMyIGZzbm90aWZ5X21hc2s7CisKKy8qIGRlc3Ryb3kgYWxsIGV2ZW50cyBzaXR0aW5nIGluIHRoaXMgZ3JvdXBzIG5vdGlmaWNhdGlvbiBxdWV1ZSAqLworZXh0ZXJuIHZvaWQgZnNub3RpZnlfZmx1c2hfbm90aWZ5KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOworCisvKiBmaW5hbCBrZnJlZSBvZiBhIGdyb3VwICovCitleHRlcm4gdm9pZCBmc25vdGlmeV9maW5hbF9kZXN0cm95X2dyb3VwKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOworCisvKiBydW4gdGhlIGxpc3Qgb2YgYWxsIG1hcmtzIGFzc29jaWF0ZWQgd2l0aCBpbm9kZSBhbmQgZmxhZyB0aGVtIHRvIGJlIGZyZWVkICovCitleHRlcm4gdm9pZCBmc25vdGlmeV9jbGVhcl9tYXJrc19ieV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKy8qCisgKiB1cGRhdGUgdGhlIGRlbnRyeS0+ZF9mbGFncyBvZiBhbGwgb2YgaW5vZGUncyBjaGlsZHJlbiB0byBpbmRpY2F0ZSBpZiBpbm9kZSBjYXJlcworICogYWJvdXQgZXZlbnRzIHRoYXQgaGFwcGVuIHRvIGl0cyBjaGlsZHJlbi4KKyAqLworZXh0ZXJuIHZvaWQgX19mc25vdGlmeV91cGRhdGVfY2hpbGRfZGVudHJ5X2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKiBhbGxvY2F0ZSBhbmQgZGVzdHJveSBhbmQgZXZlbnQgaG9sZGVyIHRvIGF0dGFjaCBldmVudHMgdG8gbm90aWZpY2F0aW9uL2FjY2VzcyBxdWV1ZXMgKi8KK2V4dGVybiBzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfaG9sZGVyICpmc25vdGlmeV9hbGxvY19ldmVudF9ob2xkZXIodm9pZCk7CitleHRlcm4gdm9pZCBmc25vdGlmeV9kZXN0cm95X2V2ZW50X2hvbGRlcihzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfaG9sZGVyICpob2xkZXIpOworCisjZW5kaWYJLyogX19GU19OT1RJRllfRlNOT1RJRllfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9ncm91cC5jIGIvZnMvbm90aWZ5L2dyb3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUxNjc3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25vdGlmeS9ncm91cC5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuLCBFcmljIFBhcmlzIDxlcGFyaXNAcmVkaGF0LmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqICBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcmN1Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaD4KKyNpbmNsdWRlICJmc25vdGlmeS5oIgorCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisvKiBwcm90ZWN0cyB3cml0ZXMgdG8gZnNub3RpZnlfZ3JvdXBzIGFuZCBmc25vdGlmeV9tYXNrICovCitzdGF0aWMgREVGSU5FX01VVEVYKGZzbm90aWZ5X2dycF9tdXRleCk7CisvKiBwcm90ZWN0cyByZWFkcyB3aGlsZSBydW5uaW5nIHRoZSBmc25vdGlmeV9ncm91cHMgbGlzdCAqLworc3RydWN0IHNyY3Vfc3RydWN0IGZzbm90aWZ5X2dycF9zcmN1OworLyogYWxsIGdyb3VwcyByZWdpc3RlcmVkIHRvIHJlY2VpdmUgZmlsZXN5c3RlbSBub3RpZmljYXRpb25zICovCitMSVNUX0hFQUQoZnNub3RpZnlfZ3JvdXBzKTsKKy8qIGJpdHdpc2UgT1Igb2YgYWxsIGV2ZW50cyAoRlNfKikgaW50ZXJlc3RpbmcgdG8gc29tZSBncm91cCBvbiB0aGlzIHN5c3RlbSAqLworX191MzIgZnNub3RpZnlfbWFzazsKKworLyoKKyAqIFdoZW4gYSBuZXcgZ3JvdXAgcmVnaXN0ZXJzIG9yIGNoYW5nZXMgaXQncyBzZXQgb2YgaW50ZXJlc3RpbmcgZXZlbnRzCisgKiB0aGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIGZzbm90aWZ5X21hc2sgdG8gY29udGFpbiBhbGwgaW50ZXJlc3RpbmcgZXZlbnRzCisgKi8KK3ZvaWQgZnNub3RpZnlfcmVjYWxjX2dsb2JhbF9tYXNrKHZvaWQpCit7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKKwlfX3UzMiBtYXNrID0gMDsKKwlpbnQgaWR4OworCisJaWR4ID0gc3JjdV9yZWFkX2xvY2soJmZzbm90aWZ5X2dycF9zcmN1KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShncm91cCwgJmZzbm90aWZ5X2dyb3VwcywgZ3JvdXBfbGlzdCkKKwkJbWFzayB8PSBncm91cC0+bWFzazsKKwlzcmN1X3JlYWRfdW5sb2NrKCZmc25vdGlmeV9ncnBfc3JjdSwgaWR4KTsKKwlmc25vdGlmeV9tYXNrID0gbWFzazsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgZ3JvdXAtPm1hc2sgYnkgcnVubmluZyBhbGwgb2YgdGhlIG1hcmtzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBncm91cCBhbmQgZmluZGluZyB0aGUgYml0d2lzZSB8IG9mIGFsbCBvZiB0aGUgbWFyay0+bWFzay4gIElmIHdlIGNoYW5nZQorICogdGhlIGdyb3VwLT5tYXNrIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBnbG9iYWwgbWFzayBvZiBldmVudHMgaW50ZXJlc3RpbmcKKyAqIHRvIHRoZSBzeXN0ZW0uCisgKi8KK3ZvaWQgZnNub3RpZnlfcmVjYWxjX2dyb3VwX21hc2soc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCkKK3sKKwlfX3UzMiBtYXNrID0gMDsKKwlfX3UzMiBvbGRfbWFzayA9IGdyb3VwLT5tYXNrOworCXN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeTsKKworCXNwaW5fbG9jaygmZ3JvdXAtPm1hcmtfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmdyb3VwLT5tYXJrX2VudHJpZXMsIGdfbGlzdCkKKwkJbWFzayB8PSBlbnRyeS0+bWFzazsKKwlzcGluX3VubG9jaygmZ3JvdXAtPm1hcmtfbG9jayk7CisKKwlncm91cC0+bWFzayA9IG1hc2s7CisKKwlpZiAob2xkX21hc2sgIT0gbWFzaykKKwkJZnNub3RpZnlfcmVjYWxjX2dsb2JhbF9tYXNrKCk7Cit9CisKKy8qCisgKiBUYWtlIGEgcmVmZXJlbmNlIHRvIGEgZ3JvdXAgc28gdGhpbmdzIGZvdW5kIHVuZGVyIHRoZSBmc25vdGlmeV9ncnBfbXV0ZXgKKyAqIGNhbid0IGdldCBmcmVlZCB1bmRlciB1cworICovCitzdGF0aWMgdm9pZCBmc25vdGlmeV9nZXRfZ3JvdXAoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCkKK3sKKwlhdG9taWNfaW5jKCZncm91cC0+cmVmY250KTsKK30KKworLyoKKyAqIEZpbmFsIGZyZWVpbmcgb2YgYSBncm91cAorICovCit2b2lkIGZzbm90aWZ5X2ZpbmFsX2Rlc3Ryb3lfZ3JvdXAoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCkKK3sKKwkvKiBjbGVhciB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlIG9mIGFsbCBldmVudHMgKi8KKwlmc25vdGlmeV9mbHVzaF9ub3RpZnkoZ3JvdXApOworCisJaWYgKGdyb3VwLT5vcHMtPmZyZWVfZ3JvdXBfcHJpdikKKwkJZ3JvdXAtPm9wcy0+ZnJlZV9ncm91cF9wcml2KGdyb3VwKTsKKworCWtmcmVlKGdyb3VwKTsKK30KKworLyoKKyAqIFRyeWluZyB0byBnZXQgcmlkIG9mIGEgZ3JvdXAuICBXZSBuZWVkIHRvIGZpcnN0IGdldCByaWQgb2YgYW55IG91dHN0YW5kaW5nCisgKiBhbGxvY2F0aW9ucyBhbmQgdGhlbiBmcmVlIHRoZSBncm91cC4gIFJlbWVtYmVyIHRoYXQgZnNub3RpZnlfY2xlYXJfbWFya3NfYnlfZ3JvdXAKKyAqIGNvdWxkIG1pc3MgbWFya3MgdGhhdCBhcmUgYmVpbmcgZnJlZWQgYnkgaW5vZGUgYW5kIHRob3NlIG1hcmtzIGNvdWxkIHN0aWxsCisgKiBob2xkIGEgcmVmZXJlbmNlIHRvIHRoaXMgZ3JvdXAgKHZpYSBncm91cC0+bnVtX21hcmtzKSAgSWYgd2UgZ2V0IGludG8gdGhhdAorICogc2l0dXRhdGlvbiwgdGhlIGZzbm90aWZ5X2ZpbmFsX2Rlc3Ryb3lfZ3JvdXAgd2lsbCBnZXQgY2FsbGVkIHdoZW4gdGhhdCBmaW5hbAorICogbWFyayBpcyBmcmVlZC4KKyAqLworc3RhdGljIHZvaWQgZnNub3RpZnlfZGVzdHJveV9ncm91cChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKQoreworCS8qIGNsZWFyIGFsbCBpbm9kZSBtYXJrIGVudHJpZXMgZm9yIHRoaXMgZ3JvdXAgKi8KKwlmc25vdGlmeV9jbGVhcl9tYXJrc19ieV9ncm91cChncm91cCk7CisKKwkvKiBwYXN0IHRoZSBwb2ludCBvZiBubyByZXR1cm4sIG1hdGNoZXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgMSAqLworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZncm91cC0+bnVtX21hcmtzKSkKKwkJZnNub3RpZnlfZmluYWxfZGVzdHJveV9ncm91cChncm91cCk7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhpcyBncm91cCBmcm9tIHRoZSBnbG9iYWwgbGlzdCBvZiBncm91cHMgdGhhdCB3aWxsIGdldCBldmVudHMKKyAqIHRoaXMgY2FuIGJlIGRvbmUgZXZlbiBpZiB0aGVyZSBhcmUgc3RpbGwgcmVmZXJlbmNlcyBhbmQgdGhpbmdzIHN0aWxsIHVzaW5nCisgKiB0aGlzIGdyb3VwLiAgVGhpcyBqdXN0IHN0b3BzIHRoZSBncm91cCBmcm9tIGdldHRpbmcgbmV3IGV2ZW50cy4KKyAqLworc3RhdGljIHZvaWQgX19mc25vdGlmeV9ldmljdF9ncm91cChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKQoreworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZmc25vdGlmeV9ncnBfbXV0ZXgpKTsKKworCWlmIChncm91cC0+b25fZ3JvdXBfbGlzdCkKKwkJbGlzdF9kZWxfcmN1KCZncm91cC0+Z3JvdXBfbGlzdCk7CisJZ3JvdXAtPm9uX2dyb3VwX2xpc3QgPSAwOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYSBncm91cCBpcyBubyBsb25nZXIgaW50ZXJlc3RlZCBpbiBnZXR0aW5nIGV2ZW50cy4gIFRoaXMgY2FuIGJlCisgKiB1c2VkIGlmIGEgZ3JvdXAgaXMgbWlzYmVoYXZpbmcgb3IgaWYgZm9yIHNvbWUgcmVhc29uIGEgZ3JvdXAgc2hvdWxkIG5vIGxvbmdlcgorICogZ2V0IGFueSBmaWxlc3lzdGVtIGV2ZW50cy4KKyAqLwordm9pZCBmc25vdGlmeV9ldmljdF9ncm91cChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKQoreworCW11dGV4X2xvY2soJmZzbm90aWZ5X2dycF9tdXRleCk7CisJX19mc25vdGlmeV9ldmljdF9ncm91cChncm91cCk7CisJbXV0ZXhfdW5sb2NrKCZmc25vdGlmeV9ncnBfbXV0ZXgpOworfQorCisvKgorICogRHJvcCBhIHJlZmVyZW5jZSB0byBhIGdyb3VwLiAgRnJlZSBpdCBpZiBpdCdzIHRocm91Z2guCisgKi8KK3ZvaWQgZnNub3RpZnlfcHV0X2dyb3VwKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApCit7CisJaWYgKCFhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKCZncm91cC0+cmVmY250LCAmZnNub3RpZnlfZ3JwX211dGV4KSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBPSywgbm93IHdlIGtub3cgdGhhdCB0aGVyZSdzIG5vIG90aGVyIHVzZXJzICphbmQqIHdlIGhvbGQgbXV0ZXgsCisJICogc28gbm8gbmV3IHJlZmVyZW5jZXMgd2lsbCBhcHBlYXIKKwkgKi8KKwlfX2Zzbm90aWZ5X2V2aWN0X2dyb3VwKGdyb3VwKTsKKworCS8qCisJICogbm93IGl0J3Mgb2ZmIHRoZSBsaXN0LCBzbyB0aGUgb25seSB0aGluZyB3ZSBtaWdodCBjYXJlIGFib3V0IGlzCisJICogc3JjdSBhY2Nlc3MuLi4uCisJICovCisJbXV0ZXhfdW5sb2NrKCZmc25vdGlmeV9ncnBfbXV0ZXgpOworCXN5bmNocm9uaXplX3NyY3UoJmZzbm90aWZ5X2dycF9zcmN1KTsKKworCS8qIGFuZCBub3cgaXQgaXMgcmVhbGx5IGRlYWQuIF9Ob3RoaW5nXyBjb3VsZCBiZSBzZWVpbmcgaXQgKi8KKwlmc25vdGlmeV9yZWNhbGNfZ2xvYmFsX21hc2soKTsKKwlmc25vdGlmeV9kZXN0cm95X2dyb3VwKGdyb3VwKTsKK30KKworLyoKKyAqIFNpbXBseSBydW4gdGhlIGZzbm90aWZ5X2dyb3VwcyBsaXN0IGFuZCBmaW5kIGEgZ3JvdXAgd2hpY2ggbWF0Y2hlcworICogdGhlIGdpdmVuIHBhcmFtZXRlcnMuICBJZiBhIGdyb3VwIGlzIGZvdW5kIHdlIHRha2UgYSByZWZlcmVuY2UgdG8gdGhhdAorICogZ3JvdXAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmZzbm90aWZ5X2ZpbmRfZ3JvdXAodW5zaWduZWQgaW50IGdyb3VwX251bSwgX191MzIgbWFzaywKKwkJCQkJCSAgY29uc3Qgc3RydWN0IGZzbm90aWZ5X29wcyAqb3BzKQoreworCXN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXBfaXRlcjsKKwlzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwID0gTlVMTDsKKworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZmc25vdGlmeV9ncnBfbXV0ZXgpKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGdyb3VwX2l0ZXIsICZmc25vdGlmeV9ncm91cHMsIGdyb3VwX2xpc3QpIHsKKwkJaWYgKGdyb3VwX2l0ZXItPmdyb3VwX251bSA9PSBncm91cF9udW0pIHsKKwkJCWlmICgoZ3JvdXBfaXRlci0+bWFzayA9PSBtYXNrKSAmJgorCQkJICAgIChncm91cF9pdGVyLT5vcHMgPT0gb3BzKSkgeworCQkJCWZzbm90aWZ5X2dldF9ncm91cChncm91cF9pdGVyKTsKKwkJCQlncm91cCA9IGdyb3VwX2l0ZXI7CisJCQl9IGVsc2UKKwkJCQlncm91cCA9IEVSUl9QVFIoLUVFWElTVCk7CisJCX0KKwl9CisJcmV0dXJuIGdyb3VwOworfQorCisvKgorICogRWl0aGVyIGZpbmRzIGFuIGV4aXN0aW5nIGdyb3VwIHdoaWNoIG1hdGNoZXMgdGhlIGdyb3VwX251bSwgbWFzaywgYW5kIG9wcyBvcgorICogY3JlYXRlcyBhIG5ldyBncm91cCBhbmQgYWRkcyBpdCB0byB0aGUgZ2xvYmFsIGdyb3VwIGxpc3QuICBJbiBlaXRoZXIgY2FzZSB3ZQorICogdGFrZSBhIHJlZmVyZW5jZSBmb3IgdGhlIGdyb3VwIHJldHVybmVkLgorICovCitzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmZzbm90aWZ5X29idGFpbl9ncm91cCh1bnNpZ25lZCBpbnQgZ3JvdXBfbnVtLCBfX3UzMiBtYXNrLAorCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBmc25vdGlmeV9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLCAqdGdyb3VwOworCisJLyogdmVyeSBsb3cgdXNlLCBzaW1wbGVyIGxvY2tpbmcgaWYgd2UganVzdCBhbHdheXMgYWxsb2MgKi8KKwlncm91cCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmc25vdGlmeV9ncm91cCksIEdGUF9LRVJORUwpOworCWlmICghZ3JvdXApCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJYXRvbWljX3NldCgmZ3JvdXAtPnJlZmNudCwgMSk7CisKKwlncm91cC0+b25fZ3JvdXBfbGlzdCA9IDA7CisJZ3JvdXAtPmdyb3VwX251bSA9IGdyb3VwX251bTsKKwlncm91cC0+bWFzayA9IG1hc2s7CisKKwltdXRleF9pbml0KCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmZ3JvdXAtPm5vdGlmaWNhdGlvbl9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZncm91cC0+bm90aWZpY2F0aW9uX3dhaXRxKTsKKwlncm91cC0+cV9sZW4gPSAwOworCWdyb3VwLT5tYXhfZXZlbnRzID0gVUlOVF9NQVg7CisKKwlzcGluX2xvY2tfaW5pdCgmZ3JvdXAtPm1hcmtfbG9jayk7CisJYXRvbWljX3NldCgmZ3JvdXAtPm51bV9tYXJrcywgMCk7CisJSU5JVF9MSVNUX0hFQUQoJmdyb3VwLT5tYXJrX2VudHJpZXMpOworCisJZ3JvdXAtPm9wcyA9IG9wczsKKworCW11dGV4X2xvY2soJmZzbm90aWZ5X2dycF9tdXRleCk7CisJdGdyb3VwID0gZnNub3RpZnlfZmluZF9ncm91cChncm91cF9udW0sIG1hc2ssIG9wcyk7CisJaWYgKHRncm91cCkgeworCQkvKiBncm91cCBhbHJlYWR5IGV4aXN0cyAqLworCQltdXRleF91bmxvY2soJmZzbm90aWZ5X2dycF9tdXRleCk7CisJCS8qIGRlc3Ryb3kgdGhlIG5ldyBvbmUgd2UgbWFkZSAqLworCQlmc25vdGlmeV9wdXRfZ3JvdXAoZ3JvdXApOworCQlyZXR1cm4gdGdyb3VwOworCX0KKworCS8qIGdyb3VwIG5vdCBmb3VuZCwgYWRkIGEgbmV3IG9uZSAqLworCWxpc3RfYWRkX3JjdSgmZ3JvdXAtPmdyb3VwX2xpc3QsICZmc25vdGlmeV9ncm91cHMpOworCWdyb3VwLT5vbl9ncm91cF9saXN0ID0gMTsKKwkvKiBiZWluZyBvbiB0aGUgZnNub3RpZnlfZ3JvdXBzIGxpc3QgaG9sZHMgb25lIG51bV9tYXJrcyAqLworCWF0b21pY19pbmMoJmdyb3VwLT5udW1fbWFya3MpOworCisJbXV0ZXhfdW5sb2NrKCZmc25vdGlmeV9ncnBfbXV0ZXgpOworCisJaWYgKG1hc2spCisJCWZzbm90aWZ5X3JlY2FsY19nbG9iYWxfbWFzaygpOworCisJcmV0dXJuIGdyb3VwOworfQpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2lub2RlX21hcmsuYyBiL2ZzL25vdGlmeS9pbm9kZV9tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhMDdjNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25vdGlmeS9pbm9kZV9tYXJrLmMKQEAgLTAsMCArMSw0MjYgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4sIEVyaWMgUGFyaXMgPGVwYXJpc0ByZWRoYXQuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogZnNub3RpZnkgaW5vZGUgbWFyayBsb2NraW5nL2xpZmV0aW1lL2FuZCByZWZjbnRpbmcKKyAqCisgKiBSRUZDTlQ6CisgKiBUaGUgbWFyay0+cmVmY250IHRlbGxzIGhvdyBtYW55ICJ0aGluZ3MiIGluIHRoZSBrZXJuZWwgY3VycmVudGx5IGFyZQorICogcmVmZXJlbmNpbmcgdGhpcyBvYmplY3QuICBUaGUgb2JqZWN0IHR5cGljYWxseSB3aWxsIGxpdmUgaW5zaWRlIHRoZSBrZXJuZWwKKyAqIHdpdGggYSByZWZjbnQgb2YgMiwgb25lIGZvciBlYWNoIGxpc3QgaXQgaXMgb24gKGlfbGlzdCwgZ19saXN0KS4gIEFueSB0YXNrCisgKiB3aGljaCBjYW4gZmluZCB0aGlzIG9iamVjdCBob2xkaW5nIHRoZSBhcHByb3ByaWV0ZSBsb2NrcywgY2FuIHRha2UgYSByZWZlcmVuY2UKKyAqIGFuZCB0aGUgb2JqZWN0IGl0c2VsZiBpcyBndWFyZW50ZWVkIHRvIHN1cnZpdmUgdW50aWwgdGhlIHJlZmVyZW5jZSBpcyBkcm9wcGVkLgorICoKKyAqIExPQ0tJTkc6CisgKiBUaGVyZSBhcmUgMyBzcGlubG9ja3MgaW52b2x2ZWQgd2l0aCBmc25vdGlmeSBpbm9kZSBtYXJrcyBhbmQgdGhleSBNVVNUCisgKiBiZSB0YWtlbiBpbiBvcmRlciBhcyBmb2xsb3dzOgorICoKKyAqIGVudHJ5LT5sb2NrCisgKiBncm91cC0+bWFya19sb2NrCisgKiBpbm9kZS0+aV9sb2NrCisgKgorICogZW50cnktPmxvY2sgcHJvdGVjdHMgMiB0aGluZ3MsIGVudHJ5LT5ncm91cCBhbmQgZW50cnktPmlub2RlLiAgWW91IG11c3QgaG9sZAorICogdGhhdCBsb2NrIHRvIGRlcmVmZXJlbmNlIGVpdGhlciBvZiB0aGVzZSB0aGluZ3MgKHRoZXkgY291bGQgYmUgTlVMTCBldmVuIHdpdGgKKyAqIHRoZSBsb2NrKQorICoKKyAqIGdyb3VwLT5tYXJrX2xvY2sgcHJvdGVjdHMgdGhlIG1hcmtfZW50cmllcyBsaXN0IGFuY2hvcmVkIGluc2lkZSBhIGdpdmVuIGdyb3VwCisgKiBhbmQgZWFjaCBlbnRyeSBpcyBob29rZWQgdmlhIHRoZSBnX2xpc3QuICBJdCBhbHNvIHNvcnRhIHByb3RlY3RzIHRoZQorICogZnJlZV9nX2xpc3QsIHdoaWNoIHdoZW4gdXNlZCBpcyBhbmNob3JlZCBieSBhIHByaXZhdGUgbGlzdCBvbiB0aGUgc3RhY2sgb2YgdGhlCisgKiB0YXNrIHdoaWNoIGhlbGQgdGhlIGdyb3VwLT5tYXJrX2xvY2suCisgKgorICogaW5vZGUtPmlfbG9jayBwcm90ZWN0cyB0aGUgaV9mc25vdGlmeV9tYXJrX2VudHJpZXMgbGlzdCBhbmNob3JlZCBpbnNpZGUgYQorICogZ2l2ZW4gaW5vZGUgYW5kIGVhY2ggZW50cnkgaXMgaG9va2VkIHZpYSB0aGUgaV9saXN0LiAoYW5kIHNvcnRhIHRoZQorICogZnJlZV9pX2xpc3QpCisgKgorICoKKyAqIExJRkVUSU1FOgorICogSW5vZGUgbWFya3Mgc3Vydml2ZSBiZXR3ZWVuIHdoZW4gdGhleSBhcmUgYWRkZWQgdG8gYW4gaW5vZGUgYW5kIHdoZW4gdGhlaXIKKyAqIHJlZmNudD09MC4KKyAqCisgKiBUaGUgaW5vZGUgbWFyayBjYW4gYmUgY2xlYXJlZCBmb3IgYSBudW1iZXIgb2YgZGlmZmVyZW50IHJlYXNvbnMgaW5jbHVkaW5nOgorICogLSBUaGUgaW5vZGUgaXMgdW5saW5rZWQgZm9yIHRoZSBsYXN0IHRpbWUuICAoZnNub3RpZnlfaW5vZGVfcmVtb3ZlKQorICogLSBUaGUgaW5vZGUgaXMgYmVpbmcgZXZpY3RlZCBmcm9tIGNhY2hlLiAoZnNub3RpZnlfaW5vZGVfZGVsZXRlKQorICogLSBUaGUgZnMgdGhlIGlub2RlIGlzIG9uIGlzIHVubW91bnRlZC4gIChmc25vdGlmeV9pbm9kZV9kZWxldGUvZnNub3RpZnlfdW5tb3VudF9pbm9kZXMpCisgKiAtIFNvbWV0aGluZyBleHBsaWNpdGx5IHJlcXVlc3RzIHRoYXQgaXQgYmUgcmVtb3ZlZC4gIChmc25vdGlmeV9kZXN0cm95X21hcmtfYnlfZW50cnkpCisgKiAtIFRoZSBmc25vdGlmeV9ncm91cCBhc3NvY2lhdGVkIHdpdGggdGhlIG1hcmsgaXMgZ29pbmcgYXdheSBhbmQgYWxsIHN1Y2ggbWFya3MKKyAqICAgbmVlZCB0byBiZSBjbGVhbmVkIHVwLiAoZnNub3RpZnlfY2xlYXJfbWFya3NfYnlfZ3JvdXApCisgKgorICogV29yc3QgY2FzZSB3ZSBhcmUgZ2l2ZW4gYW4gaW5vZGUgYW5kIG5lZWQgdG8gY2xlYW4gdXAgYWxsIHRoZSBtYXJrcyBvbiB0aGF0CisgKiBpbm9kZS4gIFdlIHRha2UgaV9sb2NrIGFuZCB3YWxrIHRoZSBpX2Zzbm90aWZ5X21hcmtfZW50cmllcyBzYWZlbHkuICBGb3IgZWFjaAorICogbWFyayBvbiB0aGUgbGlzdCB3ZSB0YWtlIGEgcmVmZXJlbmNlIChzbyB0aGUgbWFyayBjYW4ndCBkaXNhcHBlYXIgdW5kZXIgdXMpLgorICogV2UgcmVtb3ZlIHRoYXQgbWFyayBmb3JtIHRoZSBpbm9kZSdzIGxpc3Qgb2YgbWFya3MgYW5kIHdlIGFkZCB0aGlzIG1hcmsgdG8gYQorICogcHJpdmF0ZSBsaXN0IGFuY2hvcmVkIG9uIHRoZSBzdGFjayB1c2luZyBpX2ZyZWVfbGlzdDsgIEF0IHRoaXMgcG9pbnQgd2Ugbm8KKyAqIGxvbmdlciBmZWFyIGFueXRoaW5nIGZpbmRpbmcgdGhlIG1hcmsgdXNpbmcgdGhlIGlub2RlJ3MgbGlzdCBvZiBtYXJrcy4KKyAqCisgKiBXZSBjYW4gc2FmZWx5IGFuZCBsb2NrbGVzc2x5IHJ1biB0aGUgcHJpdmF0ZSBsaXN0IG9uIHRoZSBzdGFjayBvZiBldmVyeXRoaW5nCisgKiB3ZSBqdXN0IHVuYXR0YWNoZWQgZnJvbSB0aGUgb3JpZ2luYWwgaW5vZGUuICBGb3IgZWFjaCBtYXJrIG9uIHRoZSBwcml2YXRlIGxpc3QKKyAqIHdlIGdyYWIgdGhlIG1hcmstPiBhbmQgY2FuIHRodXMgZGVyZWZlcmVuY2UgbWFyay0+Z3JvdXAgYW5kIG1hcmstPmlub2RlLiAgSWYKKyAqIHdlIHNlZSB0aGUgZ3JvdXAgYW5kIGlub2RlIGFyZSBub3QgTlVMTCB3ZSB0YWtlIHRob3NlIGxvY2tzLiAgTm93IGhvbGRpbmcgYWxsCisgKiAzIGxvY2tzIHdlIGNhbiBjb21wbGV0ZWx5IHJlbW92ZSB0aGUgbWFyayBmcm9tIG90aGVyIHRhc2tzIGZpbmRpbmcgaXQgaW4gdGhlCisgKiBmdXR1cmUuICBSZW1lbWJlciwgMTAgdGhpbmdzIG1pZ2h0IGFscmVhZHkgYmUgcmVmZXJlbmNpbmcgdGhpcyBtYXJrLCBidXQgdGhleQorICogYmV0dGVyIGJlIGhvbGRpbmcgYSByZWYuICBXZSBkcm9wIG91ciByZWZlcmVuY2Ugd2UgdG9vayBiZWZvcmUgd2UgdW5ob29rZWQgaXQKKyAqIGZyb20gdGhlIGlub2RlLiAgV2hlbiB0aGUgcmVmIGhpdHMgMCB3ZSBjYW4gZnJlZSB0aGUgbWFyay4KKyAqCisgKiBWZXJ5IHNpbWlsYXJseSBmb3IgZnJlZWluZyBieSBncm91cCwgZXhjZXB0IHdlIHVzZSBmcmVlX2dfbGlzdC4KKyAqCisgKiBUaGlzIGhhcyB0aGUgdmVyeSBpbnRlcmVzdGluZyBwcm9wZXJ0eSBvZiBiZWluZyBhYmxlIHRvIHJ1biBjb25jdXJyZW50bHkgd2l0aAorICogYW55IChvciBhbGwpIG90aGVyIGRpcmVjdGlvbnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+IC8qIGZvciBpbm9kZV9sb2NrICovCisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeV9iYWNrZW5kLmg+CisjaW5jbHVkZSAiZnNub3RpZnkuaCIKKwordm9pZCBmc25vdGlmeV9nZXRfbWFyayhzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnkpCit7CisJYXRvbWljX2luYygmZW50cnktPnJlZmNudCk7Cit9CisKK3ZvaWQgZnNub3RpZnlfcHV0X21hcmsoc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5KQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlbnRyeS0+cmVmY250KSkKKwkJZW50cnktPmZyZWVfbWFyayhlbnRyeSk7Cit9CisKKy8qCisgKiBSZWNhbGN1bGF0ZSB0aGUgbWFzayBvZiBldmVudHMgcmVsZXZhbnQgdG8gYSBnaXZlbiBpbm9kZSBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkIGZzbm90aWZ5X3JlY2FsY19pbm9kZV9tYXNrX2xvY2tlZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zOworCV9fdTMyIG5ld19tYXNrID0gMDsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmaW5vZGUtPmlfbG9jayk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgcG9zLCAmaW5vZGUtPmlfZnNub3RpZnlfbWFya19lbnRyaWVzLCBpX2xpc3QpCisJCW5ld19tYXNrIHw9IGVudHJ5LT5tYXNrOworCWlub2RlLT5pX2Zzbm90aWZ5X21hc2sgPSBuZXdfbWFzazsKK30KKworLyoKKyAqIFJlY2FsY3VsYXRlIHRoZSBpbm9kZS0+aV9mc25vdGlmeV9tYXNrLCBvciB0aGUgbWFzayBvZiBhbGwgRlNfKiBldmVudCB0eXBlcworICogYW55IG5vdGlmaWVyIGlzIGludGVyZXN0ZWQgaW4gaGVhcmluZyBmb3IgdGhpcyBpbm9kZS4KKyAqLwordm9pZCBmc25vdGlmeV9yZWNhbGNfaW5vZGVfbWFzayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJZnNub3RpZnlfcmVjYWxjX2lub2RlX21hc2tfbG9ja2VkKGlub2RlKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwlfX2Zzbm90aWZ5X3VwZGF0ZV9jaGlsZF9kZW50cnlfZmxhZ3MoaW5vZGUpOworfQorCisvKgorICogQW55IHRpbWUgYSBtYXJrIGlzIGdldHRpbmcgZnJlZWQgd2UgZW5kIHVwIGhlcmUuCisgKiBUaGUgY2FsbGVyIGhhZCBiZXR0ZXIgYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0byB0aGlzIG1hcmsgc28gd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGRvIHRoZSBmaW5hbCBwdXQgdW5kZXIgdGhlIGVudHJ5LT5sb2NrCisgKi8KK3ZvaWQgZnNub3RpZnlfZGVzdHJveV9tYXJrX2J5X2VudHJ5KHN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlzcGluX2xvY2soJmVudHJ5LT5sb2NrKTsKKworCWdyb3VwID0gZW50cnktPmdyb3VwOworCWlub2RlID0gZW50cnktPmlub2RlOworCisJQlVHX09OKGdyb3VwICYmICFpbm9kZSk7CisJQlVHX09OKCFncm91cCAmJiBpbm9kZSk7CisKKwkvKiBpZiAhZ3JvdXAgc29tZXRoaW5nIGVsc2UgYWxyZWFkeSBtYXJrZWQgdGhpcyB0byBkaWUgKi8KKwlpZiAoIWdyb3VwKSB7CisJCXNwaW5fdW5sb2NrKCZlbnRyeS0+bG9jayk7CisJCXJldHVybjsKKwl9CisKKwkvKiAxIGZyb20gY2FsbGVyIGFuZCAxIGZvciBiZWluZyBvbiBpX2xpc3QvZ19saXN0ICovCisJQlVHX09OKGF0b21pY19yZWFkKCZlbnRyeS0+cmVmY250KSA8IDIpOworCisJc3Bpbl9sb2NrKCZncm91cC0+bWFya19sb2NrKTsKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCisJaGxpc3RfZGVsX2luaXQoJmVudHJ5LT5pX2xpc3QpOworCWVudHJ5LT5pbm9kZSA9IE5VTEw7CisKKwlsaXN0X2RlbF9pbml0KCZlbnRyeS0+Z19saXN0KTsKKwllbnRyeS0+Z3JvdXAgPSBOVUxMOworCisJZnNub3RpZnlfcHV0X21hcmsoZW50cnkpOyAvKiBmb3IgaV9saXN0IGFuZCBnX2xpc3QgKi8KKworCS8qCisJICogdGhpcyBtYXJrIGlzIG5vdyBvZmYgdGhlIGlub2RlLT5pX2Zzbm90aWZ5X21hcmtfZW50cmllcyBsaXN0IGFuZCB3ZQorCSAqIGhvbGQgdGhlIGlub2RlLT5pX2xvY2ssIHNvIHRoaXMgaXMgdGhlIHBlcmZlY3QgdGltZSB0byB1cGRhdGUgdGhlCisJICogaW5vZGUtPmlfZnNub3RpZnlfbWFzaworCSAqLworCWZzbm90aWZ5X3JlY2FsY19pbm9kZV9tYXNrX2xvY2tlZChpbm9kZSk7CisKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmdyb3VwLT5tYXJrX2xvY2spOworCXNwaW5fdW5sb2NrKCZlbnRyeS0+bG9jayk7CisKKwkvKgorCSAqIFNvbWUgZ3JvdXBzIGxpa2UgdG8ga25vdyB0aGF0IG1hcmtzIGFyZSBiZWluZyBmcmVlZC4gIFRoaXMgaXMgYQorCSAqIGNhbGxiYWNrIHRvIHRoZSBncm91cCBmdW5jdGlvbiB0byBsZXQgaXQga25vdyB0aGF0IHRoaXMgZW50cnkKKwkgKiBpcyBiZWluZyBmcmVlZC4KKwkgKi8KKwlpZiAoZ3JvdXAtPm9wcy0+ZnJlZWluZ19tYXJrKQorCQlncm91cC0+b3BzLT5mcmVlaW5nX21hcmsoZW50cnksIGdyb3VwKTsKKworCS8qCisJICogX19mc25vdGlmeV91cGRhdGVfY2hpbGRfZGVudHJ5X2ZsYWdzKGlub2RlKTsKKwkgKgorCSAqIEkgcmVhbGx5IHdhbnQgdG8gY2FsbCB0aGF0LCBidXQgd2UgY2FuJ3QsIHdlIGhhdmUgbm8gaWRlYSBpZiB0aGUgaW5vZGUKKwkgKiBzdGlsbCBleGlzdHMgdGhlIHNlY29uZCB3ZSBkcm9wIHRoZSBlbnRyeS0+bG9jay4KKwkgKgorCSAqIFRoZSBuZXh0IHRpbWUgYW4gZXZlbnQgYXJyaXZlIHRvIHRoaXMgaW5vZGUgZnJvbSBvbmUgb2YgaXQncyBjaGlsZHJlbgorCSAqIF9fZnNub3RpZnlfcGFyZW50IHdpbGwgc2VlIHRoYXQgdGhlIGlub2RlIGRvZXNuJ3QgY2FyZSBhYm91dCBpdCdzCisJICogY2hpbGRyZW4gYW5kIHdpbGwgdXBkYXRlIGFsbCBvZiB0aGVzZSBmbGFncyB0aGVuLiAgU28gcmVhbGx5IHRoaXMKKwkgKiBpcyBqdXN0IGEgbGF6eSB1cGRhdGUgKGFuZCBjb3VsZCBiZSBhIHBlcmYgd2luLi4uKQorCSAqLworCisKKwlpcHV0KGlub2RlKTsKKworCS8qCisJICogaXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgZ3JvdXAgdHJpZWQgdG8gZGVzdHJveSBpdHNlbGYsIGJ1dCB0aGlzCisJICogdGhpcyBtYXJrIHdhcyBzaW11bHRhbmVvdXNseSBiZWluZyBmcmVlZCBieSBpbm9kZS4gIElmIHRoYXQncyB0aGUKKwkgKiBjYXNlLCB3ZSBmaW5pc2ggZnJlZWluZyB0aGUgZ3JvdXAgaGVyZS4KKwkgKi8KKwlpZiAodW5saWtlbHkoYXRvbWljX2RlY19hbmRfdGVzdCgmZ3JvdXAtPm51bV9tYXJrcykpKQorCQlmc25vdGlmeV9maW5hbF9kZXN0cm95X2dyb3VwKGdyb3VwKTsKK30KKworLyoKKyAqIEdpdmVuIGEgZ3JvdXAsIGRlc3Ryb3kgYWxsIG9mIHRoZSBtYXJrcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBncm91cC4KKyAqLwordm9pZCBmc25vdGlmeV9jbGVhcl9tYXJrc19ieV9ncm91cChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKQoreworCXN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICpsZW50cnksICplbnRyeTsKKwlMSVNUX0hFQUQoZnJlZV9saXN0KTsKKworCXNwaW5fbG9jaygmZ3JvdXAtPm1hcmtfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCBsZW50cnksICZncm91cC0+bWFya19lbnRyaWVzLCBnX2xpc3QpIHsKKwkJbGlzdF9hZGQoJmVudHJ5LT5mcmVlX2dfbGlzdCwgJmZyZWVfbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJmVudHJ5LT5nX2xpc3QpOworCQlmc25vdGlmeV9nZXRfbWFyayhlbnRyeSk7CisJfQorCXNwaW5fdW5sb2NrKCZncm91cC0+bWFya19sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgbGVudHJ5LCAmZnJlZV9saXN0LCBmcmVlX2dfbGlzdCkgeworCQlmc25vdGlmeV9kZXN0cm95X21hcmtfYnlfZW50cnkoZW50cnkpOworCQlmc25vdGlmeV9wdXRfbWFyayhlbnRyeSk7CisJfQorfQorCisvKgorICogR2l2ZW4gYW4gaW5vZGUsIGRlc3Ryb3kgYWxsIG9mIHRoZSBtYXJrcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBpbm9kZS4KKyAqLwordm9pZCBmc25vdGlmeV9jbGVhcl9tYXJrc19ieV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeSwgKmxlbnRyeTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbjsKKwlMSVNUX0hFQUQoZnJlZV9saXN0KTsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlbnRyeSwgcG9zLCBuLCAmaW5vZGUtPmlfZnNub3RpZnlfbWFya19lbnRyaWVzLCBpX2xpc3QpIHsKKwkJbGlzdF9hZGQoJmVudHJ5LT5mcmVlX2lfbGlzdCwgJmZyZWVfbGlzdCk7CisJCWhsaXN0X2RlbF9pbml0KCZlbnRyeS0+aV9saXN0KTsKKwkJZnNub3RpZnlfZ2V0X21hcmsoZW50cnkpOworCX0KKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIGxlbnRyeSwgJmZyZWVfbGlzdCwgZnJlZV9pX2xpc3QpIHsKKwkJZnNub3RpZnlfZGVzdHJveV9tYXJrX2J5X2VudHJ5KGVudHJ5KTsKKwkJZnNub3RpZnlfcHV0X21hcmsoZW50cnkpOworCX0KK30KKworLyoKKyAqIGdpdmVuIGEgZ3JvdXAgYW5kIGlub2RlLCBmaW5kIHRoZSBtYXJrIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGNvbWJpbmF0aW9uLgorICogaWYgZm91bmQgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGF0IG1hcmsgYW5kIHJldHVybiBpdCwgZWxzZSByZXR1cm4gTlVMTAorICovCitzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZnNub3RpZnlfZmluZF9tYXJrX2VudHJ5KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsCisJCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5OworCXN0cnVjdCBobGlzdF9ub2RlICpwb3M7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmlub2RlLT5pX2xvY2spOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksIHBvcywgJmlub2RlLT5pX2Zzbm90aWZ5X21hcmtfZW50cmllcywgaV9saXN0KSB7CisJCWlmIChlbnRyeS0+Z3JvdXAgPT0gZ3JvdXApIHsKKwkJCWZzbm90aWZ5X2dldF9tYXJrKGVudHJ5KTsKKwkJCXJldHVybiBlbnRyeTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIE5vdGhpbmcgZmFuY3ksIGp1c3QgaW5pdGlhbGl6ZSBsaXN0cyBhbmQgbG9ja3MgYW5kIGNvdW50ZXJzLgorICovCit2b2lkIGZzbm90aWZ5X2luaXRfbWFyayhzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnksCisJCQl2b2lkICgqZnJlZV9tYXJrKShzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnkpKQorCit7CisJc3Bpbl9sb2NrX2luaXQoJmVudHJ5LT5sb2NrKTsKKwlhdG9taWNfc2V0KCZlbnRyeS0+cmVmY250LCAxKTsKKwlJTklUX0hMSVNUX05PREUoJmVudHJ5LT5pX2xpc3QpOworCWVudHJ5LT5ncm91cCA9IE5VTEw7CisJZW50cnktPm1hc2sgPSAwOworCWVudHJ5LT5pbm9kZSA9IE5VTEw7CisJZW50cnktPmZyZWVfbWFyayA9IGZyZWVfbWFyazsKK30KKworLyoKKyAqIEF0dGFjaCBhbiBpbml0aWFsaXplZCBtYXJrIGVudHJ5IHRvIGEgZ2l2ZW4gZ3JvdXAgYW5kIGlub2RlLgorICogVGhlc2UgbWFya3MgbWF5IGJlIHVzZWQgZm9yIHRoZSBmc25vdGlmeSBiYWNrZW5kIHRvIGRldGVybWluZSB3aGljaAorICogZXZlbnQgdHlwZXMgc2hvdWxkIGJlIGRlbGl2ZXJlZCB0byB3aGljaCBncm91cCBhbmQgZm9yIHdoaWNoIGlub2Rlcy4KKyAqLworaW50IGZzbm90aWZ5X2FkZF9tYXJrKHN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeSwKKwkJICAgICAgc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqbGVudHJ5OworCWludCByZXQgPSAwOworCisJaW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJaWYgKHVubGlrZWx5KCFpbm9kZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBMT0NLSU5HIE9SREVSISEhIQorCSAqIGVudHJ5LT5sb2NrCisJICogZ3JvdXAtPm1hcmtfbG9jaworCSAqIGlub2RlLT5pX2xvY2sKKwkgKi8KKwlzcGluX2xvY2soJmVudHJ5LT5sb2NrKTsKKwlzcGluX2xvY2soJmdyb3VwLT5tYXJrX2xvY2spOworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwllbnRyeS0+Z3JvdXAgPSBncm91cDsKKwllbnRyeS0+aW5vZGUgPSBpbm9kZTsKKworCWxlbnRyeSA9IGZzbm90aWZ5X2ZpbmRfbWFya19lbnRyeShncm91cCwgaW5vZGUpOworCWlmICghbGVudHJ5KSB7CisJCWhsaXN0X2FkZF9oZWFkKCZlbnRyeS0+aV9saXN0LCAmaW5vZGUtPmlfZnNub3RpZnlfbWFya19lbnRyaWVzKTsKKwkJbGlzdF9hZGQoJmVudHJ5LT5nX2xpc3QsICZncm91cC0+bWFya19lbnRyaWVzKTsKKworCQlmc25vdGlmeV9nZXRfbWFyayhlbnRyeSk7IC8qIGZvciBpX2xpc3QgYW5kIGdfbGlzdCAqLworCisJCWF0b21pY19pbmMoJmdyb3VwLT5udW1fbWFya3MpOworCisJCWZzbm90aWZ5X3JlY2FsY19pbm9kZV9tYXNrX2xvY2tlZChpbm9kZSk7CisJfQorCisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZncm91cC0+bWFya19sb2NrKTsKKwlzcGluX3VubG9jaygmZW50cnktPmxvY2spOworCisJaWYgKGxlbnRyeSkgeworCQlyZXQgPSAtRUVYSVNUOworCQlpcHV0KGlub2RlKTsKKwkJZnNub3RpZnlfcHV0X21hcmsobGVudHJ5KTsKKwl9IGVsc2UgeworCQlfX2Zzbm90aWZ5X3VwZGF0ZV9jaGlsZF9kZW50cnlfZmxhZ3MoaW5vZGUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZnNub3RpZnlfdW5tb3VudF9pbm9kZXMgLSBhbiBzYiBpcyB1bm1vdW50aW5nLiAgaGFuZGxlIGFueSB3YXRjaGVkIGlub2Rlcy4KKyAqIEBsaXN0OiBsaXN0IG9mIGlub2RlcyBiZWluZyB1bm1vdW50ZWQgKHNiLT5zX2lub2RlcykKKyAqCisgKiBDYWxsZWQgd2l0aCBpbm9kZV9sb2NrIGhlbGQsIHByb3RlY3RpbmcgdGhlIHVubW91bnRpbmcgc3VwZXIgYmxvY2sncyBsaXN0CisgKiBvZiBpbm9kZXMsIGFuZCB3aXRoIGlwcnVuZV9tdXRleCBoZWxkLCBrZWVwaW5nIHNocmlua19pY2FjaGVfbWVtb3J5KCkgYXQgYmF5LgorICogV2UgdGVtcG9yYXJpbHkgZHJvcCBpbm9kZV9sb2NrLCBob3dldmVyLCBhbmQgQ0FOIGJsb2NrLgorICovCit2b2lkIGZzbm90aWZ5X3VubW91bnRfaW5vZGVzKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCit7CisJc3RydWN0IGlub2RlICppbm9kZSwgKm5leHRfaSwgKm5lZWRfaXB1dCA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW5vZGUsIG5leHRfaSwgbGlzdCwgaV9zYl9saXN0KSB7CisJCXN0cnVjdCBpbm9kZSAqbmVlZF9pcHV0X3RtcDsKKworCQkvKgorCQkgKiBXZSBjYW5ub3QgX19pZ2V0KCkgYW4gaW5vZGUgaW4gc3RhdGUgSV9DTEVBUiwgSV9GUkVFSU5HLAorCQkgKiBJX1dJTExfRlJFRSwgb3IgSV9ORVcgd2hpY2ggaXMgZmluZSBiZWNhdXNlIGJ5IHRoYXQgcG9pbnQKKwkJICogdGhlIGlub2RlIGNhbm5vdCBoYXZlIGFueSBhc3NvY2lhdGVkIHdhdGNoZXMuCisJCSAqLworCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9DTEVBUnxJX0ZSRUVJTkd8SV9XSUxMX0ZSRUV8SV9ORVcpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSWYgaV9jb3VudCBpcyB6ZXJvLCB0aGUgaW5vZGUgY2Fubm90IGhhdmUgYW55IHdhdGNoZXMgYW5kCisJCSAqIGRvaW5nIGFuIF9faWdldC9pcHV0IHdpdGggTVNfQUNUSVZFIGNsZWFyIHdvdWxkIGFjdHVhbGx5CisJCSAqIGV2aWN0IGFsbCBpbm9kZXMgd2l0aCB6ZXJvIGlfY291bnQgZnJvbSBpY2FjaGUgd2hpY2ggaXMKKwkJICogdW5uZWNlc3NhcmlseSB2aW9sZW50IGFuZCBtYXkgaW4gZmFjdCBiZSBpbGxlZ2FsIHRvIGRvLgorCQkgKi8KKwkJaWYgKCFhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKQorCQkJY29udGludWU7CisKKwkJbmVlZF9pcHV0X3RtcCA9IG5lZWRfaXB1dDsKKwkJbmVlZF9pcHV0ID0gTlVMTDsKKworCQkvKiBJbiBjYXNlIGZzbm90aWZ5X2lub2RlX2RlbGV0ZSgpIGRyb3BzIGEgcmVmZXJlbmNlLiAqLworCQlpZiAoaW5vZGUgIT0gbmVlZF9pcHV0X3RtcCkKKwkJCV9faWdldChpbm9kZSk7CisJCWVsc2UKKwkJCW5lZWRfaXB1dF90bXAgPSBOVUxMOworCisJCS8qIEluIGNhc2UgdGhlIGRyb3BwaW5nIG9mIGEgcmVmZXJlbmNlIHdvdWxkIG51a2UgbmV4dF9pLiAqLworCQlpZiAoKCZuZXh0X2ktPmlfc2JfbGlzdCAhPSBsaXN0KSAmJgorCQkgICAgYXRvbWljX3JlYWQoJm5leHRfaS0+aV9jb3VudCkgJiYKKwkJICAgICEobmV4dF9pLT5pX3N0YXRlICYgKElfQ0xFQVIgfCBJX0ZSRUVJTkcgfCBJX1dJTExfRlJFRSkpKSB7CisJCQlfX2lnZXQobmV4dF9pKTsKKwkJCW5lZWRfaXB1dCA9IG5leHRfaTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGNhbiBzYWZlbHkgZHJvcCBpbm9kZV9sb2NrIGhlcmUgYmVjYXVzZSB3ZSBob2xkCisJCSAqIHJlZmVyZW5jZXMgb24gYm90aCBpbm9kZSBhbmQgbmV4dF9pLiAgQWxzbyBubyBuZXcgaW5vZGVzCisJCSAqIHdpbGwgYmUgYWRkZWQgc2luY2UgdGhlIHVtb3VudCBoYXMgYmVndW4uICBGaW5hbGx5LAorCQkgKiBpcHJ1bmVfbXV0ZXgga2VlcHMgc2hyaW5rX2ljYWNoZV9tZW1vcnkoKSBhd2F5LgorCQkgKi8KKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJCWlmIChuZWVkX2lwdXRfdG1wKQorCQkJaXB1dChuZWVkX2lwdXRfdG1wKTsKKworCQkvKiBmb3IgZWFjaCB3YXRjaCwgc2VuZCBGU19VTk1PVU5UIGFuZCB0aGVuIHJlbW92ZSBpdCAqLworCQlmc25vdGlmeShpbm9kZSwgRlNfVU5NT1VOVCwgaW5vZGUsIEZTTk9USUZZX0VWRU5UX0lOT0RFLCBOVUxMLCAwKTsKKworCQlmc25vdGlmeV9pbm9kZV9kZWxldGUoaW5vZGUpOworCisJCWlwdXQoaW5vZGUpOworCisJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2lub3RpZnkvS2NvbmZpZyBiL2ZzL25vdGlmeS9pbm90aWZ5L0tjb25maWcKaW5kZXggNDQ2NzkyOC4uNTM1Njg4NCAxMDA2NDQKLS0tIGEvZnMvbm90aWZ5L2lub3RpZnkvS2NvbmZpZworKysgYi9mcy9ub3RpZnkvaW5vdGlmeS9LY29uZmlnCkBAIC0xLDI2ICsxLDMwIEBACiBjb25maWcgSU5PVElGWQogCWJvb2wgIklub3RpZnkgZmlsZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnQiCi0JZGVmYXVsdCB5CisJZGVmYXVsdCBuCiAJLS0taGVscC0tLQotCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgaW5vdGlmeSBzdXBwb3J0LiAgSW5vdGlmeSBpcyBhIGZpbGUgY2hhbmdlCi0JICBub3RpZmljYXRpb24gc3lzdGVtIGFuZCBhIHJlcGxhY2VtZW50IGZvciBkbm90aWZ5LiAgSW5vdGlmeSBmaXhlcwotCSAgbnVtZXJvdXMgc2hvcnRjb21pbmdzIGluIGRub3RpZnkgYW5kIGludHJvZHVjZXMgc2V2ZXJhbCBuZXcgZmVhdHVyZXMKLQkgIGluY2x1ZGluZyBtdWx0aXBsZSBmaWxlIGV2ZW50cywgb25lLXNob3Qgc3VwcG9ydCwgYW5kIHVubW91bnQKLQkgIG5vdGlmaWNhdGlvbi4KKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGxlZ2FjeSBpbiBrZXJuZWwgaW5vdGlmeSBzdXBwb3J0LiAgSW5vdGlmeSBpcyBhCisJICBmaWxlIGNoYW5nZSBub3RpZmljYXRpb24gc3lzdGVtLiAgSXQgaXMgYSByZXBsYWNlbWVudCBmb3IgZG5vdGlmeS4KKwkgIFRoaXMgb3B0aW9uIG9ubHkgcHJvdmlkZXMgdGhlIGxlZ2FjeSBpbm90aWZ5IGluIGtlcm5lbCBBUEkuICBUaGVyZQorCSAgYXJlIG5vIGluIHRyZWUga2VybmVsIHVzZXJzIG9mIHRoaXMgaW50ZXJmYWNlIHNpbmNlIGl0IGlzIGRlcHJlY2F0ZWQuCisJICBZb3Ugb25seSBuZWVkIHRoaXMgaWYgeW91IGFyZSBsb2FkaW5nIGFuIG91dCBvZiB0cmVlIGtlcm5lbCBtb2R1bGUKKwkgIHRoYXQgdXNlcyBpbm90aWZ5LgogCiAJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaW5vdGlmeS50eHQ+CiAKLQkgIElmIHVuc3VyZSwgc2F5IFkuCisJICBJZiB1bnN1cmUsIHNheSBOLgogCiBjb25maWcgSU5PVElGWV9VU0VSCiAJYm9vbCAiSW5vdGlmeSBzdXBwb3J0IGZvciB1c2Vyc3BhY2UiCi0JZGVwZW5kcyBvbiBJTk9USUZZCisJZGVwZW5kcyBvbiBGU05PVElGWQogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIGlub3RpZnkgc3VwcG9ydCBmb3IgdXNlcnNwYWNlLCBpbmNsdWRpbmcgdGhlCiAJICBhc3NvY2lhdGVkIHN5c3RlbSBjYWxscy4gIElub3RpZnkgYWxsb3dzIG1vbml0b3Jpbmcgb2YgYm90aCBmaWxlcyBhbmQKIAkgIGRpcmVjdG9yaWVzIHZpYSBhIHNpbmdsZSBvcGVuIGZkLiAgRXZlbnRzIGFyZSByZWFkIGZyb20gdGhlIGZpbGUKIAkgIGRlc2NyaXB0b3IsIHdoaWNoIGlzIGFsc28gc2VsZWN0KCktIGFuZCBwb2xsKCktYWJsZS4KKwkgIElub3RpZnkgZml4ZXMgbnVtZXJvdXMgc2hvcnRjb21pbmdzIGluIGRub3RpZnkgYW5kIGludHJvZHVjZXMgc2V2ZXJhbAorCSAgbmV3IGZlYXR1cmVzIGluY2x1ZGluZyBtdWx0aXBsZSBmaWxlIGV2ZW50cywgb25lLXNob3Qgc3VwcG9ydCwgYW5kCisJICB1bm1vdW50IG5vdGlmaWNhdGlvbi4KIAogCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2lub3RpZnkudHh0PgogCmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvaW5vdGlmeS9NYWtlZmlsZSBiL2ZzL25vdGlmeS9pbm90aWZ5L01ha2VmaWxlCmluZGV4IGUyOTBmM2IuLjk0MzgyODEgMTAwNjQ0Ci0tLSBhL2ZzL25vdGlmeS9pbm90aWZ5L01ha2VmaWxlCisrKyBiL2ZzL25vdGlmeS9pbm90aWZ5L01ha2VmaWxlCkBAIC0xLDIgKzEsMiBAQAogb2JqLSQoQ09ORklHX0lOT1RJRlkpCQkrPSBpbm90aWZ5Lm8KLW9iai0kKENPTkZJR19JTk9USUZZX1VTRVIpCSs9IGlub3RpZnlfdXNlci5vCitvYmotJChDT05GSUdfSU5PVElGWV9VU0VSKQkrPSBpbm90aWZ5X2Zzbm90aWZ5Lm8gaW5vdGlmeV91c2VyLm8KZGlmZiAtLWdpdCBhL2ZzL25vdGlmeS9pbm90aWZ5L2lub3RpZnkuYyBiL2ZzL25vdGlmeS9pbm90aWZ5L2lub3RpZnkuYwppbmRleCAyMjBjMTNmLi40MGIxY2Y5IDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5LmMKKysrIGIvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeV9iYWNrZW5kLmg+CiAKIHN0YXRpYyBhdG9taWNfdCBpbm90aWZ5X2Nvb2tpZTsKIApAQCAtOTA1LDYgKzkwNiwyNSBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBpbm90aWZ5X3NldHVwKHZvaWQpCiB7CisJQlVJTERfQlVHX09OKElOX0FDQ0VTUyAhPSBGU19BQ0NFU1MpOworCUJVSUxEX0JVR19PTihJTl9NT0RJRlkgIT0gRlNfTU9ESUZZKTsKKwlCVUlMRF9CVUdfT04oSU5fQVRUUklCICE9IEZTX0FUVFJJQik7CisJQlVJTERfQlVHX09OKElOX0NMT1NFX1dSSVRFICE9IEZTX0NMT1NFX1dSSVRFKTsKKwlCVUlMRF9CVUdfT04oSU5fQ0xPU0VfTk9XUklURSAhPSBGU19DTE9TRV9OT1dSSVRFKTsKKwlCVUlMRF9CVUdfT04oSU5fT1BFTiAhPSBGU19PUEVOKTsKKwlCVUlMRF9CVUdfT04oSU5fTU9WRURfRlJPTSAhPSBGU19NT1ZFRF9GUk9NKTsKKwlCVUlMRF9CVUdfT04oSU5fTU9WRURfVE8gIT0gRlNfTU9WRURfVE8pOworCUJVSUxEX0JVR19PTihJTl9DUkVBVEUgIT0gRlNfQ1JFQVRFKTsKKwlCVUlMRF9CVUdfT04oSU5fREVMRVRFICE9IEZTX0RFTEVURSk7CisJQlVJTERfQlVHX09OKElOX0RFTEVURV9TRUxGICE9IEZTX0RFTEVURV9TRUxGKTsKKwlCVUlMRF9CVUdfT04oSU5fTU9WRV9TRUxGICE9IEZTX01PVkVfU0VMRik7CisJQlVJTERfQlVHX09OKElOX1FfT1ZFUkZMT1cgIT0gRlNfUV9PVkVSRkxPVyk7CisKKwlCVUlMRF9CVUdfT04oSU5fVU5NT1VOVCAhPSBGU19VTk1PVU5UKTsKKwlCVUlMRF9CVUdfT04oSU5fSVNESVIgIT0gRlNfSU5fSVNESVIpOworCUJVSUxEX0JVR19PTihJTl9JR05PUkVEICE9IEZTX0lOX0lHTk9SRUQpOworCUJVSUxEX0JVR19PTihJTl9PTkVTSE9UICE9IEZTX0lOX09ORVNIT1QpOworCiAJYXRvbWljX3NldCgmaW5vdGlmeV9jb29raWUsIDApOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5LmggYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEyNjA1YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25vdGlmeS9pbm90aWZ5L2lub3RpZnkuaApAQCAtMCwwICsxLDIxIEBACisjaW5jbHVkZSA8bGludXgvZnNub3RpZnlfYmFja2VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+IC8qIHN0cnVjdCBrbWVtX2NhY2hlICovCisKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZXZlbnRfcHJpdl9jYWNoZXA7CisKK3N0cnVjdCBpbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSB7CisJc3RydWN0IGZzbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSBmc25vdGlmeV9ldmVudF9wcml2X2RhdGE7CisJaW50IHdkOworfTsKKworc3RydWN0IGlub3RpZnlfaW5vZGVfbWFya19lbnRyeSB7CisJLyogZnNub3RpZnlfbWFya19lbnRyeSBNVVNUIGJlIHRoZSBmaXJzdCB0aGluZyAqLworCXN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5IGZzbl9lbnRyeTsKKwlpbnQgd2Q7Cit9OworCitleHRlcm4gdm9pZCBpbm90aWZ5X2Rlc3Ryb3lfbWFya19lbnRyeShzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnksIHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOworZXh0ZXJuIHZvaWQgaW5vdGlmeV9mcmVlX2V2ZW50X3ByaXYoc3RydWN0IGZzbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSAqZXZlbnRfcHJpdik7CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZnNub3RpZnlfb3BzIGlub3RpZnlfZnNub3RpZnlfb3BzOwpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV9mc25vdGlmeS5jIGIvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV9mc25vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjc1YjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X2Zzbm90aWZ5LmMKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBmcy9pbm90aWZ5X3VzZXIuYyAtIGlub3RpZnkgc3VwcG9ydCBmb3IgdXNlcnNwYWNlCisgKgorICogQXV0aG9yczoKKyAqCUpvaG4gTWNDdXRjaGFuCTx0dGJAdGVudGFjbGUuZGhzLm9yZz4KKyAqCVJvYmVydCBMb3ZlCTxybWxAbm92ZWxsLmNvbT4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSm9obiBNY0N1dGNoYW4KKyAqIENvcHlyaWdodCAyMDA2IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEVyaWMgUGFyaXMgPFJlZCBIYXQgSW5jPgorICogaW5vdGlmeSB3YXMgbGFyZ2VseSByZXdyaXRlbiB0byBtYWtlIHVzZSBvZiB0aGUgZnNub3RpZnkgaW5mcmFzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+IC8qIHN0cnVjdCBpbm9kZSAqLworI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvcGF0aC5oPiAvKiBzdHJ1Y3QgcGF0aCAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gLyoga21lbV8qICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgImlub3RpZnkuaCIKKworc3RhdGljIGludCBpbm90aWZ5X2hhbmRsZV9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgaW5vdGlmeV9pbm9kZV9tYXJrX2VudHJ5ICppZW50cnk7CisJc3RydWN0IGlub2RlICp0b190ZWxsOworCXN0cnVjdCBpbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSAqZXZlbnRfcHJpdjsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhICpmc25fZXZlbnRfcHJpdjsKKwlpbnQgd2QsIHJldDsKKworCXRvX3RlbGwgPSBldmVudC0+dG9fdGVsbDsKKworCXNwaW5fbG9jaygmdG9fdGVsbC0+aV9sb2NrKTsKKwllbnRyeSA9IGZzbm90aWZ5X2ZpbmRfbWFya19lbnRyeShncm91cCwgdG9fdGVsbCk7CisJc3Bpbl91bmxvY2soJnRvX3RlbGwtPmlfbG9jayk7CisJLyogcmFjZSB3aXRoIHdhdGNoIHJlbW92YWw/ICBXZSBhbHJlYWR5IHBhc3NlcyBzaG91bGRfc2VuZCAqLworCWlmICh1bmxpa2VseSghZW50cnkpKQorCQlyZXR1cm4gMDsKKwlpZW50cnkgPSBjb250YWluZXJfb2YoZW50cnksIHN0cnVjdCBpbm90aWZ5X2lub2RlX21hcmtfZW50cnksCisJCQkgICAgICBmc25fZW50cnkpOworCXdkID0gaWVudHJ5LT53ZDsKKworCWV2ZW50X3ByaXYgPSBrbWVtX2NhY2hlX2FsbG9jKGV2ZW50X3ByaXZfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWV2ZW50X3ByaXYpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZzbl9ldmVudF9wcml2ID0gJmV2ZW50X3ByaXYtPmZzbm90aWZ5X2V2ZW50X3ByaXZfZGF0YTsKKworCWZzbl9ldmVudF9wcml2LT5ncm91cCA9IGdyb3VwOworCWV2ZW50X3ByaXYtPndkID0gd2Q7CisKKwlyZXQgPSBmc25vdGlmeV9hZGRfbm90aWZ5X2V2ZW50KGdyb3VwLCBldmVudCwgZnNuX2V2ZW50X3ByaXYpOworCS8qIEVFWElTVCBpcyBub3QgYW4gZXJyb3IgKi8KKwlpZiAocmV0ID09IC1FRVhJU1QpCisJCXJldCA9IDA7CisKKwkvKiBkaWQgZXZlbnRfcHJpdiBnZXQgYXR0YWNoZWQ/ICovCisJaWYgKGxpc3RfZW1wdHkoJmZzbl9ldmVudF9wcml2LT5ldmVudF9saXN0KSkKKwkJaW5vdGlmeV9mcmVlX2V2ZW50X3ByaXYoZnNuX2V2ZW50X3ByaXYpOworCisJLyoKKwkgKiBJZiB3ZSBob2xkIHRoZSBlbnRyeSB1bnRpbCBhZnRlciB0aGUgZXZlbnQgaXMgb24gdGhlIHF1ZXVlCisJICogSU5fSUdOT1JFRCB3b24ndCBiZSBhYmxlIHRvIHBhc3MgdGhpcyBldmVudCBpbiB0aGUgcXVldWUKKwkgKi8KKwlmc25vdGlmeV9wdXRfbWFyayhlbnRyeSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpbm90aWZ5X2ZyZWVpbmdfbWFyayhzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnksIHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApCit7CisJaW5vdGlmeV9kZXN0cm95X21hcmtfZW50cnkoZW50cnksIGdyb3VwKTsKK30KKworc3RhdGljIGJvb2wgaW5vdGlmeV9zaG91bGRfc2VuZF9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX3UzMiBtYXNrKQoreworCXN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeTsKKwlib29sIHNlbmQ7CisKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWVudHJ5ID0gZnNub3RpZnlfZmluZF9tYXJrX2VudHJ5KGdyb3VwLCBpbm9kZSk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCWlmICghZW50cnkpCisJCXJldHVybiBmYWxzZTsKKworCW1hc2sgPSAobWFzayAmIH5GU19FVkVOVF9PTl9DSElMRCk7CisJc2VuZCA9IChlbnRyeS0+bWFzayAmIG1hc2spOworCisJLyogZmluZCB0b29rIGEgcmVmZXJlbmNlICovCisJZnNub3RpZnlfcHV0X21hcmsoZW50cnkpOworCisJcmV0dXJuIHNlbmQ7Cit9CisKK3N0YXRpYyBpbnQgaWRyX2NhbGxiYWNrKGludCBpZCwgdm9pZCAqcCwgdm9pZCAqZGF0YSkKK3sKKwlCVUcoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5vdGlmeV9mcmVlX2dyb3VwX3ByaXYoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCkKK3sKKwkvKiBpZGVhbGx5IHRoZSBpZHIgaXMgZW1wdHkgYW5kIHdlIHdvbid0IGhpdCB0aGUgQlVHIGluIHRlaCBjYWxsYmFjayAqLworCWlkcl9mb3JfZWFjaCgmZ3JvdXAtPmlub3RpZnlfZGF0YS5pZHIsIGlkcl9jYWxsYmFjaywgTlVMTCk7CisJaWRyX3JlbW92ZV9hbGwoJmdyb3VwLT5pbm90aWZ5X2RhdGEuaWRyKTsKKwlpZHJfZGVzdHJveSgmZ3JvdXAtPmlub3RpZnlfZGF0YS5pZHIpOworfQorCit2b2lkIGlub3RpZnlfZnJlZV9ldmVudF9wcml2KHN0cnVjdCBmc25vdGlmeV9ldmVudF9wcml2YXRlX2RhdGEgKmZzbl9ldmVudF9wcml2KQoreworCXN0cnVjdCBpbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSAqZXZlbnRfcHJpdjsKKworCisJZXZlbnRfcHJpdiA9IGNvbnRhaW5lcl9vZihmc25fZXZlbnRfcHJpdiwgc3RydWN0IGlub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhLAorCQkJCSAgZnNub3RpZnlfZXZlbnRfcHJpdl9kYXRhKTsKKworCWttZW1fY2FjaGVfZnJlZShldmVudF9wcml2X2NhY2hlcCwgZXZlbnRfcHJpdik7Cit9CisKK2NvbnN0IHN0cnVjdCBmc25vdGlmeV9vcHMgaW5vdGlmeV9mc25vdGlmeV9vcHMgPSB7CisJLmhhbmRsZV9ldmVudCA9IGlub3RpZnlfaGFuZGxlX2V2ZW50LAorCS5zaG91bGRfc2VuZF9ldmVudCA9IGlub3RpZnlfc2hvdWxkX3NlbmRfZXZlbnQsCisJLmZyZWVfZ3JvdXBfcHJpdiA9IGlub3RpZnlfZnJlZV9ncm91cF9wcml2LAorCS5mcmVlX2V2ZW50X3ByaXYgPSBpbm90aWZ5X2ZyZWVfZXZlbnRfcHJpdiwKKwkuZnJlZWluZ19tYXJrID0gaW5vdGlmeV9mcmVlaW5nX21hcmssCit9OwpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L2lub3RpZnkvaW5vdGlmeV91c2VyLmMgYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYwppbmRleCAxNjM0MzE5Li45ODJhNDEyIDEwMDY0NAotLS0gYS9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYworKysgYi9mcy9ub3RpZnkvaW5vdGlmeS9pbm90aWZ5X3VzZXIuYwpAQCAtOCw2ICs4LDkgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNSBKb2huIE1jQ3V0Y2hhbgogICogQ29weXJpZ2h0IDIwMDYgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUC4KICAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRXJpYyBQYXJpcyA8UmVkIEhhdCBJbmM+CisgKiBpbm90aWZ5IHdhcyBsYXJnZWx5IHJld3JpdGVuIHRvIG1ha2UgdXNlIG9mIHRoZSBmc25vdGlmeSBpbmZyYXN0cnVjdHVyZQorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKQEAgLTE5LDk0ICsyMiw0OCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgotI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4gLyogc3RydWN0IGlub2RlICovCisjaW5jbHVkZSA8bGludXgvZnNub3RpZnlfYmFja2VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4gLyogbW9kdWxlX2luaXQgKi8KICNpbmNsdWRlIDxsaW51eC9pbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+IC8qIHJvdW5kdXAoKSAqLworI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+IC8qIHN1cGVyYmxvY2sgbWFnaWMgbnVtYmVyICovCisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4gLyogbW50Z2V0ICovCisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4gLyogTE9PS1VQX0ZPTExPVyAqLworI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4gLyogc3RydWN0IHBhdGggKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAvKiBzdHJ1Y3QgdXNlciAqLworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gLyogc3RydWN0IGttZW1fY2FjaGUgKi8KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgotI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgImlub3RpZnkuaCIKIAogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KIAotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICp3YXRjaF9jYWNoZXAgX19yZWFkX21vc3RseTsKLXN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXZlbnRfY2FjaGVwIF9fcmVhZF9tb3N0bHk7Ci0KIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmlub3RpZnlfbW50IF9fcmVhZF9tb3N0bHk7CiAKKy8qIHRoaXMganVzdCBzaXRzIGhlcmUgYW5kIHdhc3RlcyBnbG9iYWwgbWVtb3J5LiAgdXNlZCB0byBqdXN0IHBhZCB1c2Vyc3BhY2UgbWVzc2FnZXMgd2l0aCB6ZXJvcyAqLworc3RhdGljIHN0cnVjdCBpbm90aWZ5X2V2ZW50IG51bF9pbm90aWZ5X2V2ZW50OworCiAvKiB0aGVzZSBhcmUgY29uZmlndXJhYmxlIHZpYSAvcHJvYy9zeXMvZnMvaW5vdGlmeS8gKi8KIHN0YXRpYyBpbnQgaW5vdGlmeV9tYXhfdXNlcl9pbnN0YW5jZXMgX19yZWFkX21vc3RseTsKLXN0YXRpYyBpbnQgaW5vdGlmeV9tYXhfdXNlcl93YXRjaGVzIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgaW50IGlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHMgX19yZWFkX21vc3RseTsKK2ludCBpbm90aWZ5X21heF91c2VyX3dhdGNoZXMgX19yZWFkX21vc3RseTsKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppbm90aWZ5X2lub2RlX21hcmtfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3Qga21lbV9jYWNoZSAqZXZlbnRfcHJpdl9jYWNoZXAgX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmlub3RpZnlfaWdub3JlZF9ldmVudDsKIAogLyoKLSAqIExvY2sgb3JkZXJpbmc6Ci0gKgotICogaW5vdGlmeV9kZXYtPnVwX211dGV4IChlbnN1cmVzIHdlIGRvbid0IHJlLWFkZCB0aGUgc2FtZSB3YXRjaCkKLSAqIAlpbm9kZS0+aW5vdGlmeV9tdXRleCAocHJvdGVjdHMgaW5vZGUncyB3YXRjaCBsaXN0KQotICogCQlpbm90aWZ5X2hhbmRsZS0+bXV0ZXggKHByb3RlY3RzIGlub3RpZnlfaGFuZGxlJ3Mgd2F0Y2ggbGlzdCkKLSAqIAkJCWlub3RpZnlfZGV2LT5ldl9tdXRleCAocHJvdGVjdHMgZGV2aWNlJ3MgZXZlbnQgcXVldWUpCisgKiBXaGVuIGlub3RpZnkgcmVnaXN0ZXJzIGEgbmV3IGdyb3VwIGl0IGluY3JlbWVudHMgdGhpcyBhbmQgdXNlcyB0aGF0CisgKiB2YWx1ZSBhcyBhbiBvZmZzZXQgdG8gc2V0IHRoZSBmc25vdGlmeSBncm91cCAibmFtZSIgYW5kIHByaW9yaXR5LgogICovCi0KLS8qCi0gKiBMaWZldGltZXMgb2YgdGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmVzOgotICoKLSAqIGlub3RpZnlfZGV2aWNlOiBMaWZldGltZSBpcyBtYW5hZ2VkIGJ5IHJlZmVyZW5jZSBjb3VudCwgZnJvbQotICogc3lzX2lub3RpZnlfaW5pdCgpIHVudGlsIHJlbGVhc2UuICBBZGRpdGlvbmFsIHJlZmVyZW5jZXMgY2FuIGJ1bXAgdGhlIGNvdW50Ci0gKiB2aWEgZ2V0X2lub3RpZnlfZGV2KCkgYW5kIGRyb3AgdGhlIGNvdW50IHZpYSBwdXRfaW5vdGlmeV9kZXYoKS4KLSAqCi0gKiBpbm90aWZ5X3VzZXJfd2F0Y2g6IExpZmV0aW1lIGlzIGZyb20gY3JlYXRlX3dhdGNoKCkgdG8gdGhlIHJlY2VpcHQgb2YgYW4KLSAqIElOX0lHTk9SRUQgZXZlbnQgZnJvbSBpbm90aWZ5LCBvciB3aGVuIHVzaW5nIElOX09ORVNIT1QsIHRvIHJlY2VpcHQgb2YgdGhlCi0gKiBmaXJzdCBldmVudCwgb3IgdG8gaW5vdGlmeV9kZXN0cm95KCkuCi0gKi8KLQotLyoKLSAqIHN0cnVjdCBpbm90aWZ5X2RldmljZSAtIHJlcHJlc2VudHMgYW4gaW5vdGlmeSBpbnN0YW5jZQotICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHByb3RlY3RlZCBieSB0aGUgbXV0ZXggJ211dGV4Jy4KLSAqLwotc3RydWN0IGlub3RpZnlfZGV2aWNlIHsKLQl3YWl0X3F1ZXVlX2hlYWRfdCAJd3E7CQkvKiB3YWl0IHF1ZXVlIGZvciBpL28gKi8KLQlzdHJ1Y3QgbXV0ZXgJCWV2X211dGV4OwkvKiBwcm90ZWN0cyBldmVudCBxdWV1ZSAqLwotCXN0cnVjdCBtdXRleAkJdXBfbXV0ZXg7CS8qIHN5bmNocm9uaXplcyB3YXRjaCB1cGRhdGVzICovCi0Jc3RydWN0IGxpc3RfaGVhZCAJZXZlbnRzOwkJLyogbGlzdCBvZiBxdWV1ZWQgZXZlbnRzICovCi0Jc3RydWN0IHVzZXJfc3RydWN0CSp1c2VyOwkJLyogdXNlciB3aG8gb3BlbmVkIHRoaXMgZGV2ICovCi0Jc3RydWN0IGlub3RpZnlfaGFuZGxlCSppaDsJCS8qIGlub3RpZnkgaGFuZGxlICovCi0Jc3RydWN0IGZhc3luY19zdHJ1Y3QgICAgKmZhOyAgICAgICAgICAgIC8qIGFzeW5jIG5vdGlmaWNhdGlvbiAqLwotCWF0b21pY190CQljb3VudDsJCS8qIHJlZmVyZW5jZSBjb3VudCAqLwotCXVuc2lnbmVkIGludAkJcXVldWVfc2l6ZTsJLyogc2l6ZSBvZiB0aGUgcXVldWUgKGJ5dGVzKSAqLwotCXVuc2lnbmVkIGludAkJZXZlbnRfY291bnQ7CS8qIG51bWJlciBvZiBwZW5kaW5nIGV2ZW50cyAqLwotCXVuc2lnbmVkIGludAkJbWF4X2V2ZW50czsJLyogbWF4aW11bSBudW1iZXIgb2YgZXZlbnRzICovCi19OwotCi0vKgotICogc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50IC0gQW4gaW5vdGlmeSBldmVudCwgb3JpZ2luYXRpbmcgZnJvbSBhIHdhdGNoIGFuZAotICogcXVldWVkIGZvciB1c2VyLXNwYWNlLiAgQSBsaXN0IG9mIHRoZXNlIGlzIGF0dGFjaGVkIHRvIGVhY2ggaW5zdGFuY2Ugb2YgdGhlCi0gKiBkZXZpY2UuICBJbiByZWFkKCksIHRoaXMgbGlzdCBpcyB3YWxrZWQgYW5kIGFsbCBldmVudHMgdGhhdCBjYW4gZml0IGluIHRoZQotICogYnVmZmVyIGFyZSByZXR1cm5lZC4KLSAqCi0gKiBQcm90ZWN0ZWQgYnkgZGV2LT5ldl9tdXRleCBvZiB0aGUgZGV2aWNlIGluIHdoaWNoIHdlIGFyZSBxdWV1ZWQuCi0gKi8KLXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCB7Ci0Jc3RydWN0IGlub3RpZnlfZXZlbnQJZXZlbnQ7CS8qIHRoZSB1c2VyLXNwYWNlIGV2ZW50ICovCi0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgbGlzdDsJLyogZW50cnkgaW4gaW5vdGlmeV9kZXZpY2UncyBsaXN0ICovCi0JY2hhcgkJCSpuYW1lOwkvKiBmaWxlbmFtZSwgaWYgYW55ICovCi19OwotCi0vKgotICogc3RydWN0IGlub3RpZnlfdXNlcl93YXRjaCAtIG91ciB2ZXJzaW9uIG9mIGFuIGlub3RpZnlfd2F0Y2gsIHdlIGFkZAotICogYSByZWZlcmVuY2UgdG8gdGhlIGFzc29jaWF0ZWQgaW5vdGlmeV9kZXZpY2UuCi0gKi8KLXN0cnVjdCBpbm90aWZ5X3VzZXJfd2F0Y2ggewotCXN0cnVjdCBpbm90aWZ5X2RldmljZQkqZGV2OwkvKiBhc3NvY2lhdGVkIGRldmljZSAqLwotCXN0cnVjdCBpbm90aWZ5X3dhdGNoCXdkYXRhOwkvKiBpbm90aWZ5IHdhdGNoIGRhdGEgKi8KLX07CitzdGF0aWMgYXRvbWljX3QgaW5vdGlmeV9ncnBfbnVtOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCkBAIC0xNDksMjgwICsxMDYsMzYgQEAKIH07CiAjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2V0X2lub3RpZnlfZGV2KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBfX3UzMiBpbm90aWZ5X2FyZ190b19tYXNrKHUzMiBhcmcpCiB7Ci0JYXRvbWljX2luYygmZGV2LT5jb3VudCk7CisJX191MzIgbWFzazsKKworCS8qIGV2ZXJ5dGhpbmcgc2hvdWxkIGFjY2VwdCB0aGVpciBvd24gaWdub3JlZCBhbmQgY2FyZXMgYWJvdXQgY2hpbGRyZW4gKi8KKwltYXNrID0gKEZTX0lOX0lHTk9SRUQgfCBGU19FVkVOVF9PTl9DSElMRCk7CisKKwkvKiBtYXNrIG9mZiB0aGUgZmxhZ3MgdXNlZCB0byBvcGVuIHRoZSBmZCAqLworCW1hc2sgfD0gKGFyZyAmIChJTl9BTExfRVZFTlRTIHwgSU5fT05FU0hPVCkpOworCisJcmV0dXJuIG1hc2s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaW5vdGlmeV9kZXYoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIHUzMiBpbm90aWZ5X21hc2tfdG9fYXJnKF9fdTMyIG1hc2spCiB7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRldi0+Y291bnQpKSB7Ci0JCWF0b21pY19kZWMoJmRldi0+dXNlci0+aW5vdGlmeV9kZXZzKTsKLQkJZnJlZV91aWQoZGV2LT51c2VyKTsKLQkJa2ZyZWUoZGV2KTsKLQl9CisJcmV0dXJuIG1hc2sgJiAoSU5fQUxMX0VWRU5UUyB8IElOX0lTRElSIHwgSU5fVU5NT1VOVCB8IElOX0lHTk9SRUQgfAorCQkgICAgICAgSU5fUV9PVkVSRkxPVyk7CiB9CiAKLS8qCi0gKiBmcmVlX2lub3RpZnlfdXNlcl93YXRjaCAtIGNsZWFucyB1cCB0aGUgd2F0Y2ggYW5kIGl0cyByZWZlcmVuY2VzCi0gKi8KLXN0YXRpYyB2b2lkIGZyZWVfaW5vdGlmeV91c2VyX3dhdGNoKHN0cnVjdCBpbm90aWZ5X3dhdGNoICp3KQotewotCXN0cnVjdCBpbm90aWZ5X3VzZXJfd2F0Y2ggKndhdGNoOwotCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OwotCi0Jd2F0Y2ggPSBjb250YWluZXJfb2Yodywgc3RydWN0IGlub3RpZnlfdXNlcl93YXRjaCwgd2RhdGEpOwotCWRldiA9IHdhdGNoLT5kZXY7Ci0KLQlhdG9taWNfZGVjKCZkZXYtPnVzZXItPmlub3RpZnlfd2F0Y2hlcyk7Ci0JcHV0X2lub3RpZnlfZGV2KGRldik7Ci0Ja21lbV9jYWNoZV9mcmVlKHdhdGNoX2NhY2hlcCwgd2F0Y2gpOwotfQotCi0vKgotICoga2VybmVsX2V2ZW50IC0gY3JlYXRlIGEgbmV3IGtlcm5lbCBldmVudCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0gKgotICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKiBrZXJuZWxfZXZlbnQoczMyIHdkLCB1MzIgbWFzaywgdTMyIGNvb2tpZSwKLQkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudDsKLQotCWtldmVudCA9IGttZW1fY2FjaGVfYWxsb2MoZXZlbnRfY2FjaGVwLCBHRlBfTk9GUyk7Ci0JaWYgKHVubGlrZWx5KCFrZXZlbnQpKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHdlIGhhbmQgdGhpcyBvdXQgdG8gdXNlci1zcGFjZSwgc28gemVybyBpdCBqdXN0IGluIGNhc2UgKi8KLQltZW1zZXQoJmtldmVudC0+ZXZlbnQsIDAsIHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkpOwotCi0Ja2V2ZW50LT5ldmVudC53ZCA9IHdkOwotCWtldmVudC0+ZXZlbnQubWFzayA9IG1hc2s7Ci0Ja2V2ZW50LT5ldmVudC5jb29raWUgPSBjb29raWU7Ci0KLQlJTklUX0xJU1RfSEVBRCgma2V2ZW50LT5saXN0KTsKLQotCWlmIChuYW1lKSB7Ci0JCXNpemVfdCBsZW4sIHJlbSwgZXZlbnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCk7Ci0KLQkJLyoKLQkJICogV2UgbmVlZCB0byBwYWQgdGhlIGZpbGVuYW1lIHNvIGFzIHRvIHByb3Blcmx5IGFsaWduIGFuCi0JCSAqIGFycmF5IG9mIGlub3RpZnlfZXZlbnQgc3RydWN0dXJlcy4gIEJlY2F1c2UgdGhlIHN0cnVjdHVyZSBpcwotCQkgKiBzbWFsbCBhbmQgdGhlIGNvbW1vbiBjYXNlIGlzIGEgc21hbGwgZmlsZW5hbWUsIHdlIGp1c3Qgcm91bmQKLQkJICogdXAgdG8gdGhlIG5leHQgbXVsdGlwbGUgb2YgdGhlIHN0cnVjdHVyZSdzIHNpemVvZi4gIFRoaXMgaXMKLQkJICogc2ltcGxlIGFuZCBzYWZlIGZvciBhbGwgYXJjaGl0ZWN0dXJlcy4KLQkJICovCi0JCWxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0JCXJlbSA9IGV2ZW50X3NpemUgLSBsZW47Ci0JCWlmIChsZW4gPiBldmVudF9zaXplKSB7Ci0JCQlyZW0gPSBldmVudF9zaXplIC0gKGxlbiAlIGV2ZW50X3NpemUpOwotCQkJaWYgKGxlbiAlIGV2ZW50X3NpemUgPT0gMCkKLQkJCQlyZW0gPSAwOwotCQl9Ci0KLQkJa2V2ZW50LT5uYW1lID0ga21hbGxvYyhsZW4gKyByZW0sIEdGUF9OT0ZTKTsKLQkJaWYgKHVubGlrZWx5KCFrZXZlbnQtPm5hbWUpKSB7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUoZXZlbnRfY2FjaGVwLCBrZXZlbnQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJbWVtY3B5KGtldmVudC0+bmFtZSwgbmFtZSwgbGVuKTsKLQkJaWYgKHJlbSkKLQkJCW1lbXNldChrZXZlbnQtPm5hbWUgKyBsZW4sIDAsIHJlbSk7Ci0JCWtldmVudC0+ZXZlbnQubGVuID0gbGVuICsgcmVtOwotCX0gZWxzZSB7Ci0JCWtldmVudC0+ZXZlbnQubGVuID0gMDsKLQkJa2V2ZW50LT5uYW1lID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4ga2V2ZW50OwotfQotCi0vKgotICogaW5vdGlmeV9kZXZfZ2V0X2V2ZW50IC0gcmV0dXJuIHRoZSBuZXh0IGV2ZW50IGluIHRoZSBnaXZlbiBkZXYncyBxdWV1ZQotICoKLSAqIENhbGxlciBtdXN0IGhvbGQgZGV2LT5ldl9tdXRleC4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKgotaW5vdGlmeV9kZXZfZ2V0X2V2ZW50KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQotewotCXJldHVybiBsaXN0X2VudHJ5KGRldi0+ZXZlbnRzLm5leHQsIHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCwgbGlzdCk7Ci19Ci0KLS8qCi0gKiBpbm90aWZ5X2Rldl9nZXRfbGFzdF9ldmVudCAtIHJldHVybiB0aGUgbGFzdCBldmVudCBpbiB0aGUgZ2l2ZW4gZGV2J3MgcXVldWUKLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIGRldi0+ZXZfbXV0ZXguCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICoKLWlub3RpZnlfZGV2X2dldF9sYXN0X2V2ZW50KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQotewotCWlmIChsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cykpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBsaXN0X2VudHJ5KGRldi0+ZXZlbnRzLnByZXYsIHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCwgbGlzdCk7Ci19Ci0KLS8qCi0gKiBpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudCAtIGV2ZW50IGhhbmRsZXIgcmVnaXN0ZXJlZCB3aXRoIGNvcmUgaW5vdGlmeSwgYWRkcwotICogYSBuZXcgZXZlbnQgdG8gdGhlIGdpdmVuIGRldmljZQotICoKLSAqIENhbiBzbGVlcCAoY2FsbHMga2VybmVsX2V2ZW50KCkpLgotICovCi1zdGF0aWMgdm9pZCBpbm90aWZ5X2Rldl9xdWV1ZV9ldmVudChzdHJ1Y3QgaW5vdGlmeV93YXRjaCAqdywgdTMyIHdkLCB1MzIgbWFzaywKLQkJCQkgICAgdTMyIGNvb2tpZSwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgc3RydWN0IGlub2RlICppZ25vcmVkKQotewotCXN0cnVjdCBpbm90aWZ5X3VzZXJfd2F0Y2ggKndhdGNoOwotCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OwotCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50LCAqbGFzdDsKLQotCXdhdGNoID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBpbm90aWZ5X3VzZXJfd2F0Y2gsIHdkYXRhKTsKLQlkZXYgPSB3YXRjaC0+ZGV2OwotCi0JbXV0ZXhfbG9jaygmZGV2LT5ldl9tdXRleCk7Ci0KLQkvKiB3ZSBjYW4gc2FmZWx5IHB1dCB0aGUgd2F0Y2ggYXMgd2UgZG9uJ3QgcmVmZXJlbmNlIGl0IHdoaWxlCi0JICogZ2VuZXJhdGluZyB0aGUgZXZlbnQKLQkgKi8KLQlpZiAobWFzayAmIElOX0lHTk9SRUQgfHwgdy0+bWFzayAmIElOX09ORVNIT1QpCi0JCXB1dF9pbm90aWZ5X3dhdGNoKHcpOyAvKiBmaW5hbCBwdXQgKi8KLQotCS8qIGNvYWxlc2Npbmc6IGRyb3AgdGhpcyBldmVudCBpZiBpdCBpcyBhIGR1cGUgb2YgdGhlIHByZXZpb3VzICovCi0JbGFzdCA9IGlub3RpZnlfZGV2X2dldF9sYXN0X2V2ZW50KGRldik7Ci0JaWYgKGxhc3QgJiYgbGFzdC0+ZXZlbnQubWFzayA9PSBtYXNrICYmIGxhc3QtPmV2ZW50LndkID09IHdkICYmCi0JCQlsYXN0LT5ldmVudC5jb29raWUgPT0gY29va2llKSB7Ci0JCWNvbnN0IGNoYXIgKmxhc3RuYW1lID0gbGFzdC0+bmFtZTsKLQotCQlpZiAoIW5hbWUgJiYgIWxhc3RuYW1lKQotCQkJZ290byBvdXQ7Ci0JCWlmIChuYW1lICYmIGxhc3RuYW1lICYmICFzdHJjbXAobGFzdG5hbWUsIG5hbWUpKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JLyogdGhlIHF1ZXVlIG92ZXJmbG93ZWQgYW5kIHdlIGFscmVhZHkgc2VudCB0aGUgUV9PVkVSRkxPVyBldmVudCAqLwotCWlmICh1bmxpa2VseShkZXYtPmV2ZW50X2NvdW50ID4gZGV2LT5tYXhfZXZlbnRzKSkKLQkJZ290byBvdXQ7Ci0KLQkvKiBpZiB0aGUgcXVldWUgb3ZlcmZsb3dzLCB3ZSBuZWVkIHRvIG5vdGlmeSB1c2VyIHNwYWNlICovCi0JaWYgKHVubGlrZWx5KGRldi0+ZXZlbnRfY291bnQgPT0gZGV2LT5tYXhfZXZlbnRzKSkKLQkJa2V2ZW50ID0ga2VybmVsX2V2ZW50KC0xLCBJTl9RX09WRVJGTE9XLCBjb29raWUsIE5VTEwpOwotCWVsc2UKLQkJa2V2ZW50ID0ga2VybmVsX2V2ZW50KHdkLCBtYXNrLCBjb29raWUsIG5hbWUpOwotCi0JaWYgKHVubGlrZWx5KCFrZXZlbnQpKQotCQlnb3RvIG91dDsKLQotCS8qIHF1ZXVlIHRoZSBldmVudCBhbmQgd2FrZSB1cCBhbnlvbmUgd2FpdGluZyAqLwotCWRldi0+ZXZlbnRfY291bnQrKzsKLQlkZXYtPnF1ZXVlX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KSArIGtldmVudC0+ZXZlbnQubGVuOwotCWxpc3RfYWRkX3RhaWwoJmtldmVudC0+bGlzdCwgJmRldi0+ZXZlbnRzKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+d3EpOwotCWtpbGxfZmFzeW5jKCZkZXYtPmZhLCBTSUdJTywgUE9MTF9JTik7Ci0KLW91dDoKLQltdXRleF91bmxvY2soJmRldi0+ZXZfbXV0ZXgpOwotfQotCi0vKgotICogcmVtb3ZlX2tldmVudCAtIGNsZWFucyB1cCB0aGUgZ2l2ZW4ga2V2ZW50Ci0gKgotICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPmV2X211dGV4LgotICovCi1zdGF0aWMgdm9pZCByZW1vdmVfa2V2ZW50KHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2LAotCQkJICBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudCkKLXsKLQlsaXN0X2RlbCgma2V2ZW50LT5saXN0KTsKLQotCWRldi0+ZXZlbnRfY291bnQtLTsKLQlkZXYtPnF1ZXVlX3NpemUgLT0gc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2V2ZW50KSArIGtldmVudC0+ZXZlbnQubGVuOwotfQotCi0vKgotICogZnJlZV9rZXZlbnQgLSBmcmVlcyB0aGUgZ2l2ZW4ga2V2ZW50LgotICovCi1zdGF0aWMgdm9pZCBmcmVlX2tldmVudChzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudCkKLXsKLQlrZnJlZShrZXZlbnQtPm5hbWUpOwotCWttZW1fY2FjaGVfZnJlZShldmVudF9jYWNoZXAsIGtldmVudCk7Ci19Ci0KLS8qCi0gKiBpbm90aWZ5X2Rldl9ldmVudF9kZXF1ZXVlIC0gZGVzdHJveSBhbiBldmVudCBvbiB0aGUgZ2l2ZW4gZGV2aWNlCi0gKgotICogQ2FsbGVyIG11c3QgaG9sZCBkZXYtPmV2X211dGV4LgotICovCi1zdGF0aWMgdm9pZCBpbm90aWZ5X2Rldl9ldmVudF9kZXF1ZXVlKHN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2KQotewotCWlmICghbGlzdF9lbXB0eSgmZGV2LT5ldmVudHMpKSB7Ci0JCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50OwotCQlrZXZlbnQgPSBpbm90aWZ5X2Rldl9nZXRfZXZlbnQoZGV2KTsKLQkJcmVtb3ZlX2tldmVudChkZXYsIGtldmVudCk7Ci0JCWZyZWVfa2V2ZW50KGtldmVudCk7Ci0JfQotfQotCi0vKgotICogZmluZF9pbm9kZSAtIHJlc29sdmUgYSB1c2VyLWdpdmVuIHBhdGggdG8gYSBzcGVjaWZpYyBpbm9kZQotICovCi1zdGF0aWMgaW50IGZpbmRfaW5vZGUoY29uc3QgY2hhciBfX3VzZXIgKmRpcm5hbWUsIHN0cnVjdCBwYXRoICpwYXRoLAotCQkgICAgICB1bnNpZ25lZCBmbGFncykKLXsKLQlpbnQgZXJyb3I7Ci0KLQllcnJvciA9IHVzZXJfcGF0aF9hdChBVF9GRENXRCwgZGlybmFtZSwgZmxhZ3MsIHBhdGgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwotCS8qIHlvdSBjYW4gb25seSB3YXRjaCBhbiBpbm9kZSBpZiB5b3UgaGF2ZSByZWFkIHBlcm1pc3Npb25zIG9uIGl0ICovCi0JZXJyb3IgPSBpbm9kZV9wZXJtaXNzaW9uKHBhdGgtPmRlbnRyeS0+ZF9pbm9kZSwgTUFZX1JFQUQpOwotCWlmIChlcnJvcikKLQkJcGF0aF9wdXQocGF0aCk7Ci0JcmV0dXJuIGVycm9yOwotfQotCi0vKgotICogY3JlYXRlX3dhdGNoIC0gY3JlYXRlcyBhIHdhdGNoIG9uIHRoZSBnaXZlbiBkZXZpY2UuCi0gKgotICogQ2FsbGVycyBtdXN0IGhvbGQgZGV2LT51cF9tdXRleC4KLSAqLwotc3RhdGljIGludCBjcmVhdGVfd2F0Y2goc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQl1MzIgbWFzaykKLXsKLQlzdHJ1Y3QgaW5vdGlmeV91c2VyX3dhdGNoICp3YXRjaDsKLQlpbnQgcmV0OwotCi0JaWYgKGF0b21pY19yZWFkKCZkZXYtPnVzZXItPmlub3RpZnlfd2F0Y2hlcykgPj0KLQkJCWlub3RpZnlfbWF4X3VzZXJfd2F0Y2hlcykKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQl3YXRjaCA9IGttZW1fY2FjaGVfYWxsb2Mod2F0Y2hfY2FjaGVwLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIXdhdGNoKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBzYXZlIGEgcmVmZXJlbmNlIHRvIGRldmljZSBhbmQgYnVtcCB0aGUgY291bnQgdG8gbWFrZSBpdCBvZmZpY2lhbCAqLwotCWdldF9pbm90aWZ5X2RldihkZXYpOwotCXdhdGNoLT5kZXYgPSBkZXY7Ci0KLQlhdG9taWNfaW5jKCZkZXYtPnVzZXItPmlub3RpZnlfd2F0Y2hlcyk7Ci0KLQlpbm90aWZ5X2luaXRfd2F0Y2goJndhdGNoLT53ZGF0YSk7Ci0JcmV0ID0gaW5vdGlmeV9hZGRfd2F0Y2goZGV2LT5paCwgJndhdGNoLT53ZGF0YSwgaW5vZGUsIG1hc2spOwotCWlmIChyZXQgPCAwKQotCQlmcmVlX2lub3RpZnlfdXNlcl93YXRjaCgmd2F0Y2gtPndkYXRhKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIERldmljZSBJbnRlcmZhY2UgKi8KLQorLyogaW50b2ZpeSB1c2Vyc3BhY2UgZmlsZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyAqLwogc3RhdGljIHVuc2lnbmVkIGludCBpbm90aWZ5X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCiB7Ci0Jc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmV0ID0gMDsKIAotCXBvbGxfd2FpdChmaWxlLCAmZGV2LT53cSwgd2FpdCk7Ci0JbXV0ZXhfbG9jaygmZGV2LT5ldl9tdXRleCk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cykpCisJcG9sbF93YWl0KGZpbGUsICZncm91cC0+bm90aWZpY2F0aW9uX3dhaXRxLCB3YWl0KTsKKwltdXRleF9sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwlpZiAoIWZzbm90aWZ5X25vdGlmeV9xdWV1ZV9pc19lbXB0eShncm91cCkpCiAJCXJldCA9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmV2X211dGV4KTsKKwltdXRleF91bmxvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTQzMiwyNiArMTQ1LDI5IEBACiAgKiBlbm91Z2ggdG8gZml0IGluICJjb3VudCIuIFJldHVybiBhbiBlcnJvciBwb2ludGVyIGlmCiAgKiBub3QgbGFyZ2UgZW5vdWdoLgogICoKLSAqIENhbGxlZCB3aXRoIHRoZSBkZXZpY2UgZXZfbXV0ZXggaGVsZC4KKyAqIENhbGxlZCB3aXRoIHRoZSBncm91cC0+bm90aWZpY2F0aW9uX211dGV4IGhlbGQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmdldF9vbmVfZXZlbnQoc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXYsCi0JCQkJCQkgIHNpemVfdCBjb3VudCkKK3N0YXRpYyBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmdldF9vbmVfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwKKwkJCQkJICAgIHNpemVfdCBjb3VudCkKIHsKIAlzaXplX3QgZXZlbnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCk7Ci0Jc3RydWN0IGlub3RpZnlfa2VybmVsX2V2ZW50ICprZXZlbnQ7CisJc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudDsKIAotCWlmIChsaXN0X2VtcHR5KCZkZXYtPmV2ZW50cykpCisJaWYgKGZzbm90aWZ5X25vdGlmeV9xdWV1ZV9pc19lbXB0eShncm91cCkpCiAJCXJldHVybiBOVUxMOwogCi0Ja2V2ZW50ID0gaW5vdGlmeV9kZXZfZ2V0X2V2ZW50KGRldik7Ci0JaWYgKGtldmVudC0+bmFtZSkKLQkJZXZlbnRfc2l6ZSArPSBrZXZlbnQtPmV2ZW50LmxlbjsKKwlldmVudCA9IGZzbm90aWZ5X3BlZWtfbm90aWZ5X2V2ZW50KGdyb3VwKTsKKworCWV2ZW50X3NpemUgKz0gcm91bmR1cChldmVudC0+bmFtZV9sZW4sIGV2ZW50X3NpemUpOwogCiAJaWYgKGV2ZW50X3NpemUgPiBjb3VudCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAKLQlyZW1vdmVfa2V2ZW50KGRldiwga2V2ZW50KTsKLQlyZXR1cm4ga2V2ZW50OworCS8qIGhlbGQgdGhlIG5vdGlmaWNhdGlvbl9tdXRleCB0aGUgd2hvbGUgdGltZSwgc28gdGhpcyBpcyB0aGUKKwkgKiBzYW1lIGV2ZW50IHdlIHBlZWtlZCBhYm92ZSAqLworCWZzbm90aWZ5X3JlbW92ZV9ub3RpZnlfZXZlbnQoZ3JvdXApOworCisJcmV0dXJuIGV2ZW50OwogfQogCiAvKgpAQCAtNDYwLDUxICsxNzYsOTAgQEAKICAqIFdlIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSBldmVudCBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUKICAqIGJ1ZmZlciB3ZSBoYWQgaW4gImdldF9vbmVfZXZlbnQoKSIgYWJvdmUuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IGNvcHlfZXZlbnRfdG9fdXNlcihzdHJ1Y3QgaW5vdGlmeV9rZXJuZWxfZXZlbnQgKmtldmVudCwKK3N0YXRpYyBzc2l6ZV90IGNvcHlfZXZlbnRfdG9fdXNlcihzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLAorCQkJCSAgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCwKIAkJCQkgIGNoYXIgX191c2VyICpidWYpCiB7CisJc3RydWN0IGlub3RpZnlfZXZlbnQgaW5vdGlmeV9ldmVudDsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhICpmc25fcHJpdjsKKwlzdHJ1Y3QgaW5vdGlmeV9ldmVudF9wcml2YXRlX2RhdGEgKnByaXY7CiAJc2l6ZV90IGV2ZW50X3NpemUgPSBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpOworCXNpemVfdCBuYW1lX2xlbjsKIAotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAma2V2ZW50LT5ldmVudCwgZXZlbnRfc2l6ZSkpCisJLyogd2UgZ2V0IHRoZSBpbm90aWZ5IHdhdGNoIGRlc2NyaXB0b3IgZnJvbSB0aGUgZXZlbnQgcHJpdmF0ZSBkYXRhICovCisJc3Bpbl9sb2NrKCZldmVudC0+bG9jayk7CisJZnNuX3ByaXYgPSBmc25vdGlmeV9yZW1vdmVfcHJpdl9mcm9tX2V2ZW50KGdyb3VwLCBldmVudCk7CisJc3Bpbl91bmxvY2soJmV2ZW50LT5sb2NrKTsKKworCWlmICghZnNuX3ByaXYpCisJCWlub3RpZnlfZXZlbnQud2QgPSAtMTsKKwllbHNlIHsKKwkJcHJpdiA9IGNvbnRhaW5lcl9vZihmc25fcHJpdiwgc3RydWN0IGlub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhLAorCQkJCSAgICBmc25vdGlmeV9ldmVudF9wcml2X2RhdGEpOworCQlpbm90aWZ5X2V2ZW50LndkID0gcHJpdi0+d2Q7CisJCWlub3RpZnlfZnJlZV9ldmVudF9wcml2KGZzbl9wcml2KTsKKwl9CisKKwkvKiByb3VuZCB1cCBldmVudC0+bmFtZV9sZW4gc28gaXQgaXMgYSBtdWx0aXBsZSBvZiBldmVudF9zaXplICovCisJbmFtZV9sZW4gPSByb3VuZHVwKGV2ZW50LT5uYW1lX2xlbiwgZXZlbnRfc2l6ZSk7CisJaW5vdGlmeV9ldmVudC5sZW4gPSBuYW1lX2xlbjsKKworCWlub3RpZnlfZXZlbnQubWFzayA9IGlub3RpZnlfbWFza190b19hcmcoZXZlbnQtPm1hc2spOworCWlub3RpZnlfZXZlbnQuY29va2llID0gZXZlbnQtPnN5bmNfY29va2llOworCisJLyogc2VuZCB0aGUgbWFpbiBldmVudCAqLworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmaW5vdGlmeV9ldmVudCwgZXZlbnRfc2l6ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKGtldmVudC0+bmFtZSkgewotCQlidWYgKz0gZXZlbnRfc2l6ZTsKKwlidWYgKz0gZXZlbnRfc2l6ZTsKIAotCQlpZiAoY29weV90b191c2VyKGJ1Ziwga2V2ZW50LT5uYW1lLCBrZXZlbnQtPmV2ZW50LmxlbikpCisJLyoKKwkgKiBmc25vdGlmeSBvbmx5IHN0b3JlcyB0aGUgcGF0aG5hbWUsIHNvIGhlcmUgd2UgaGF2ZSB0byBzZW5kIHRoZSBwYXRobmFtZQorCSAqIGFuZCB0aGVuIHBhZCB0aGF0IHBhdGhuYW1lIG91dCB0byBhIG11bHRpcGxlIG9mIHNpemVvZihpbm90aWZ5X2V2ZW50KQorCSAqIHdpdGggemVyb3MuICBJIGdldCBteSB6ZXJvcyBmcm9tIHRoZSBudWxfaW5vdGlmeV9ldmVudC4KKwkgKi8KKwlpZiAobmFtZV9sZW4pIHsKKwkJdW5zaWduZWQgaW50IGxlbl90b196ZXJvID0gbmFtZV9sZW4gLSBldmVudC0+bmFtZV9sZW47CisJCS8qIGNvcHkgdGhlIHBhdGggbmFtZSAqLworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgZXZlbnQtPmZpbGVfbmFtZSwgZXZlbnQtPm5hbWVfbGVuKSkKIAkJCXJldHVybiAtRUZBVUxUOworCQlidWYgKz0gZXZlbnQtPm5hbWVfbGVuOwogCi0JCWV2ZW50X3NpemUgKz0ga2V2ZW50LT5ldmVudC5sZW47CisJCS8qIGZpbGwgdXNlcnNwYWNlIHdpdGggMCdzIGZyb20gbnVsX2lub3RpZnlfZXZlbnQgKi8KKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZudWxfaW5vdGlmeV9ldmVudCwgbGVuX3RvX3plcm8pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJ1ZiArPSBsZW5fdG9femVybzsKKwkJZXZlbnRfc2l6ZSArPSBuYW1lX2xlbjsKIAl9CisKIAlyZXR1cm4gZXZlbnRfc2l6ZTsKIH0KIAogc3RhdGljIHNzaXplX3QgaW5vdGlmeV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmtldmVudDsKIAljaGFyIF9fdXNlciAqc3RhcnQ7CiAJaW50IHJldDsKIAlERUZJTkVfV0FJVCh3YWl0KTsKIAogCXN0YXJ0ID0gYnVmOwotCWRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlncm91cCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAogCXdoaWxlICgxKSB7Ci0JCXN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCAqa2V2ZW50OworCQlwcmVwYXJlX3RvX3dhaXQoJmdyb3VwLT5ub3RpZmljYXRpb25fd2FpdHEsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCi0JCXByZXBhcmVfdG9fd2FpdCgmZGV2LT53cSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0KLQkJbXV0ZXhfbG9jaygmZGV2LT5ldl9tdXRleCk7Ci0JCWtldmVudCA9IGdldF9vbmVfZXZlbnQoZGV2LCBjb3VudCk7Ci0JCW11dGV4X3VubG9jaygmZGV2LT5ldl9tdXRleCk7CisJCW11dGV4X2xvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOworCQlrZXZlbnQgPSBnZXRfb25lX2V2ZW50KGdyb3VwLCBjb3VudCk7CisJCW11dGV4X3VubG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CiAKIAkJaWYgKGtldmVudCkgewogCQkJcmV0ID0gUFRSX0VSUihrZXZlbnQpOwogCQkJaWYgKElTX0VSUihrZXZlbnQpKQogCQkJCWJyZWFrOwotCQkJcmV0ID0gY29weV9ldmVudF90b191c2VyKGtldmVudCwgYnVmKTsKLQkJCWZyZWVfa2V2ZW50KGtldmVudCk7CisJCQlyZXQgPSBjb3B5X2V2ZW50X3RvX3VzZXIoZ3JvdXAsIGtldmVudCwgYnVmKTsKKwkJCWZzbm90aWZ5X3B1dF9ldmVudChrZXZlbnQpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJYnJlYWs7CiAJCQlidWYgKz0gcmV0OwpAQCAtNTI1LDcgKzI4MCw3IEBACiAJCXNjaGVkdWxlKCk7CiAJfQogCi0JZmluaXNoX3dhaXQoJmRldi0+d3EsICZ3YWl0KTsKKwlmaW5pc2hfd2FpdCgmZ3JvdXAtPm5vdGlmaWNhdGlvbl93YWl0cSwgJndhaXQpOwogCWlmIChzdGFydCAhPSBidWYgJiYgcmV0ICE9IC1FRkFVTFQpCiAJCXJldCA9IGJ1ZiAtIHN0YXJ0OwogCXJldHVybiByZXQ7CkBAIC01MzMsMjUgKzI4OCwxOSBAQAogCiBzdGF0aWMgaW50IGlub3RpZnlfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbGUsIGludCBvbikKIHsKLQlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCi0JcmV0dXJuIGZhc3luY19oZWxwZXIoZmQsIGZpbGUsIG9uLCAmZGV2LT5mYSkgPj0gMCA/IDAgOiAtRUlPOworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmaWxlLCBvbiwgJmdyb3VwLT5pbm90aWZ5X2RhdGEuZmEpID49IDAgPyAwIDogLUVJTzsKIH0KIAogc3RhdGljIGludCBpbm90aWZ5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppZ25vcmVkLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UgKmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCi0JaW5vdGlmeV9kZXN0cm95KGRldi0+aWgpOworCWZzbm90aWZ5X2NsZWFyX21hcmtzX2J5X2dyb3VwKGdyb3VwKTsKIAotCS8qIGRlc3Ryb3kgYWxsIG9mIHRoZSBldmVudHMgb24gdGhpcyBkZXZpY2UgKi8KLQltdXRleF9sb2NrKCZkZXYtPmV2X211dGV4KTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+ZXZlbnRzKSkKLQkJaW5vdGlmeV9kZXZfZXZlbnRfZGVxdWV1ZShkZXYpOwotCW11dGV4X3VubG9jaygmZGV2LT5ldl9tdXRleCk7Ci0KLQkvKiBmcmVlIHRoaXMgZGV2aWNlOiB0aGUgcHV0IG1hdGNoaW5nIHRoZSBnZXQgaW4gaW5vdGlmeV9pbml0KCkgKi8KLQlwdXRfaW5vdGlmeV9kZXYoZGV2KTsKKwkvKiBmcmVlIHRoaXMgZ3JvdXAsIG1hdGNoaW5nIGdldCB3YXMgaW5vdGlmeV9pbml0LT5mc25vdGlmeV9vYnRhaW5fZ3JvdXAgKi8KKwlmc25vdGlmeV9wdXRfZ3JvdXAoZ3JvdXApOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NTksMTYgKzMwOCwyNyBAQAogc3RhdGljIGxvbmcgaW5vdGlmeV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfaG9sZGVyICpob2xkZXI7CisJc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudDsKIAl2b2lkIF9fdXNlciAqcDsKIAlpbnQgcmV0ID0gLUVOT1RUWTsKKwlzaXplX3Qgc2VuZF9sZW4gPSAwOwogCi0JZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWdyb3VwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXAgPSAodm9pZCBfX3VzZXIgKikgYXJnOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEZJT05SRUFEOgotCQlyZXQgPSBwdXRfdXNlcihkZXYtPnF1ZXVlX3NpemUsIChpbnQgX191c2VyICopIHApOworCQltdXRleF9sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShob2xkZXIsICZncm91cC0+bm90aWZpY2F0aW9uX2xpc3QsIGV2ZW50X2xpc3QpIHsKKwkJCWV2ZW50ID0gaG9sZGVyLT5ldmVudDsKKwkJCXNlbmRfbGVuICs9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCk7CisJCQlzZW5kX2xlbiArPSByb3VuZHVwKGV2ZW50LT5uYW1lX2xlbiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGlub3RpZnlfZXZlbnQpKTsKKwkJfQorCQltdXRleF91bmxvY2soJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpOworCQlyZXQgPSBwdXRfdXNlcihzZW5kX2xlbiwgKGludCBfX3VzZXIgKikgcCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNTc2LDIzICszMzYsMjMzIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlub3RpZnlfZm9wcyA9IHsKLQkucG9sbCAgICAgICAgICAgPSBpbm90aWZ5X3BvbGwsCi0JLnJlYWQgICAgICAgICAgID0gaW5vdGlmeV9yZWFkLAotCS5mYXN5bmMgICAgICAgICA9IGlub3RpZnlfZmFzeW5jLAotCS5yZWxlYXNlICAgICAgICA9IGlub3RpZnlfcmVsZWFzZSwKLQkudW5sb2NrZWRfaW9jdGwgPSBpbm90aWZ5X2lvY3RsLAorCS5wb2xsCQk9IGlub3RpZnlfcG9sbCwKKwkucmVhZAkJPSBpbm90aWZ5X3JlYWQsCisJLmZhc3luYwkJPSBpbm90aWZ5X2Zhc3luYywKKwkucmVsZWFzZQk9IGlub3RpZnlfcmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBpbm90aWZ5X2lvY3RsLAogCS5jb21wYXRfaW9jdGwJPSBpbm90aWZ5X2lvY3RsLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpbm90aWZ5X29wZXJhdGlvbnMgaW5vdGlmeV91c2VyX29wcyA9IHsKLQkuaGFuZGxlX2V2ZW50CT0gaW5vdGlmeV9kZXZfcXVldWVfZXZlbnQsCi0JLmRlc3Ryb3lfd2F0Y2gJPSBmcmVlX2lub3RpZnlfdXNlcl93YXRjaCwKLX07CiAKKy8qCisgKiBmaW5kX2lub2RlIC0gcmVzb2x2ZSBhIHVzZXItZ2l2ZW4gcGF0aCB0byBhIHNwZWNpZmljIGlub2RlCisgKi8KK3N0YXRpYyBpbnQgaW5vdGlmeV9maW5kX2lub2RlKGNvbnN0IGNoYXIgX191c2VyICpkaXJuYW1lLCBzdHJ1Y3QgcGF0aCAqcGF0aCwgdW5zaWduZWQgZmxhZ3MpCit7CisJaW50IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfYXQoQVRfRkRDV0QsIGRpcm5hbWUsIGZsYWdzLCBwYXRoKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwkvKiB5b3UgY2FuIG9ubHkgd2F0Y2ggYW4gaW5vZGUgaWYgeW91IGhhdmUgcmVhZCBwZXJtaXNzaW9ucyBvbiBpdCAqLworCWVycm9yID0gaW5vZGVfcGVybWlzc2lvbihwYXRoLT5kZW50cnktPmRfaW5vZGUsIE1BWV9SRUFEKTsKKwlpZiAoZXJyb3IpCisJCXBhdGhfcHV0KHBhdGgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFdoZW4sIGZvciB3aGF0ZXZlciByZWFzb24sIGlub3RpZnkgaXMgZG9uZSB3aXRoIGEgbWFyayAob3Igd2hhdCB1c2VkIHRvIGJlIGEKKyAqIHdhdGNoKSB3ZSBuZWVkIHRvIHJlbW92ZSB0aGF0IHdhdGNoIGZyb20gdGhlIGlkciBhbmQgd2UgbmVlZCB0byBzZW5kIElOX0lHTk9SRUQKKyAqIGZvciB0aGUgZ2l2ZW4gd2QuCisgKgorICogVGhlcmUgaXMgYSBiaXQgb2YgcmVjdXJzaW9uIGhlcmUuICBUaGUgbG9vcCBsb29rcyBsaWtlOgorICogCWlub3RpZnlfZGVzdHJveV9tYXJrX2VudHJ5IC0+IGZzbm90aWZ5X2Rlc3Ryb3lfbWFya19ieV9lbnRyeSAtPgorICoJaW5vdGlmeV9mcmVlaW5nX21hcmsgLT4gaW5vdGlmeV9kZXN0b3J5X21hcmtfZW50cnkgLT4gcmVzdGFydAorICogQnV0IHRoZSBsb29wIGlzIGJyb2tlbiBpbiAyIHBsYWNlcy4gIGZzbm90aWZ5X2Rlc3Ryb3lfbWFya19ieV9lbnRyeSBzZXRzCisgKiBlbnRyeS0+Z3JvdXAgPSBOVUxMIGJlZm9yZSB0aGUgY2FsbCB0byBpbm90aWZ5X2ZyZWVpbmdfbWFyaywgc28gdGhlIGlmIChlZ3JvdXApCisgKiB0ZXN0IGJlbG93IHdpbGwgbm90IGNhbGwgYmFjayB0byBmc25vdGlmeSBhZ2Fpbi4gIEJ1dCBldmVuIGlmIHRoYXQgdGVzdCB3YXNuJ3QKKyAqIHRoZXJlIHRoaXMgd291bGQgc3RpbGwgYmUgc2FmZSBzaW5jZSBmc25vdGlmeV9kZXN0cm95X21hcmtfYnlfZW50cnkoKSBpcworICogc2FmZSBmcm9tIHJlY3Vyc2lvbi4KKyAqLwordm9pZCBpbm90aWZ5X2Rlc3Ryb3lfbWFya19lbnRyeShzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnksIHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApCit7CisJc3RydWN0IGlub3RpZnlfaW5vZGVfbWFya19lbnRyeSAqaWVudHJ5OworCXN0cnVjdCBpbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSAqZXZlbnRfcHJpdjsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhICpmc25fZXZlbnRfcHJpdjsKKwlzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmVncm91cDsKKwlzdHJ1Y3QgaWRyICppZHI7CisKKwlzcGluX2xvY2soJmVudHJ5LT5sb2NrKTsKKwllZ3JvdXAgPSBlbnRyeS0+Z3JvdXA7CisKKwkvKiBpZiBlZ3JvdXAgd2UgYXJlbid0IHJlYWxseSBkb25lIGFuZCBzb21ldGhpbmcgbWlnaHQgc3RpbGwgc2VuZCBldmVudHMKKwkgKiBmb3IgdGhpcyBpbm9kZSwgb24gdGhlIGNhbGxiYWNrIHdlJ2xsIHNlbmQgdGhlIElOX0lHTk9SRUQgKi8KKwlpZiAoZWdyb3VwKSB7CisJCXNwaW5fdW5sb2NrKCZlbnRyeS0+bG9jayk7CisJCWZzbm90aWZ5X2Rlc3Ryb3lfbWFya19ieV9lbnRyeShlbnRyeSk7CisJCXJldHVybjsKKwl9CisJc3Bpbl91bmxvY2soJmVudHJ5LT5sb2NrKTsKKworCWllbnRyeSA9IGNvbnRhaW5lcl9vZihlbnRyeSwgc3RydWN0IGlub3RpZnlfaW5vZGVfbWFya19lbnRyeSwgZnNuX2VudHJ5KTsKKworCWV2ZW50X3ByaXYgPSBrbWVtX2NhY2hlX2FsbG9jKGV2ZW50X3ByaXZfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWV2ZW50X3ByaXYpKQorCQlnb3RvIHNraXBfc2VuZF9pZ25vcmU7CisKKwlmc25fZXZlbnRfcHJpdiA9ICZldmVudF9wcml2LT5mc25vdGlmeV9ldmVudF9wcml2X2RhdGE7CisKKwlmc25fZXZlbnRfcHJpdi0+Z3JvdXAgPSBncm91cDsKKwlldmVudF9wcml2LT53ZCA9IGllbnRyeS0+d2Q7CisKKwlmc25vdGlmeV9hZGRfbm90aWZ5X2V2ZW50KGdyb3VwLCBpbm90aWZ5X2lnbm9yZWRfZXZlbnQsIGZzbl9ldmVudF9wcml2KTsKKworCS8qIGRpZCB0aGUgcHJpdmF0ZSBkYXRhIGdldCBhZGRlZD8gKi8KKwlpZiAobGlzdF9lbXB0eSgmZnNuX2V2ZW50X3ByaXYtPmV2ZW50X2xpc3QpKQorCQlpbm90aWZ5X2ZyZWVfZXZlbnRfcHJpdihmc25fZXZlbnRfcHJpdik7CisKK3NraXBfc2VuZF9pZ25vcmU6CisKKwkvKiByZW1vdmUgdGhpcyBlbnRyeSBmcm9tIHRoZSBpZHIgKi8KKwlzcGluX2xvY2soJmdyb3VwLT5pbm90aWZ5X2RhdGEuaWRyX2xvY2spOworCWlkciA9ICZncm91cC0+aW5vdGlmeV9kYXRhLmlkcjsKKwlpZHJfcmVtb3ZlKGlkciwgaWVudHJ5LT53ZCk7CisJc3Bpbl91bmxvY2soJmdyb3VwLT5pbm90aWZ5X2RhdGEuaWRyX2xvY2spOworCisJLyogcmVtb3ZlZCBmcm9tIGlkciwgZHJvcCB0aGF0IHJlZmVyZW5jZSAqLworCWZzbm90aWZ5X3B1dF9tYXJrKGVudHJ5KTsKK30KKworLyogZGluZyBkb25nIHRoZSBtYXJrIGlzIGRlYWQgKi8KK3N0YXRpYyB2b2lkIGlub3RpZnlfZnJlZV9tYXJrKHN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vdGlmeV9pbm9kZV9tYXJrX2VudHJ5ICppZW50cnkgPSAoc3RydWN0IGlub3RpZnlfaW5vZGVfbWFya19lbnRyeSAqKWVudHJ5OworCisJa21lbV9jYWNoZV9mcmVlKGlub3RpZnlfaW5vZGVfbWFya19jYWNoZXAsIGllbnRyeSk7Cit9CisKK3N0YXRpYyBpbnQgaW5vdGlmeV91cGRhdGVfd2F0Y2goc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwgc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGFyZykKK3sKKwlzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnkgPSBOVUxMOworCXN0cnVjdCBpbm90aWZ5X2lub2RlX21hcmtfZW50cnkgKmllbnRyeTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgYWRkID0gKGFyZyAmIElOX01BU0tfQUREKTsKKwlfX3UzMiBtYXNrOworCV9fdTMyIG9sZF9tYXNrLCBuZXdfbWFzazsKKworCS8qIGRvbid0IGFsbG93IGludmFsaWQgYml0czogd2UgZG9uJ3Qgd2FudCBmbGFncyBzZXQgKi8KKwltYXNrID0gaW5vdGlmeV9hcmdfdG9fbWFzayhhcmcpOworCWlmICh1bmxpa2VseSghbWFzaykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWVudHJ5ID0ga21lbV9jYWNoZV9hbGxvYyhpbm90aWZ5X2lub2RlX21hcmtfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWllbnRyeSkpCisJCXJldHVybiAtRU5PTUVNOworCS8qIHdlIHNldCB0aGUgbWFzayBhdCB0aGUgZW5kIGFmdGVyIGF0dGFjaGluZyBpdCAqLworCWZzbm90aWZ5X2luaXRfbWFyaygmaWVudHJ5LT5mc25fZW50cnksIGlub3RpZnlfZnJlZV9tYXJrKTsKKwlpZW50cnktPndkID0gMDsKKworZmluZF9lbnRyeToKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWVudHJ5ID0gZnNub3RpZnlfZmluZF9tYXJrX2VudHJ5KGdyb3VwLCBpbm9kZSk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCWlmIChlbnRyeSkgeworCQlrbWVtX2NhY2hlX2ZyZWUoaW5vdGlmeV9pbm9kZV9tYXJrX2NhY2hlcCwgaWVudHJ5KTsKKwkJaWVudHJ5ID0gY29udGFpbmVyX29mKGVudHJ5LCBzdHJ1Y3QgaW5vdGlmeV9pbm9kZV9tYXJrX2VudHJ5LCBmc25fZW50cnkpOworCX0gZWxzZSB7CisJCWlmIChhdG9taWNfcmVhZCgmZ3JvdXAtPmlub3RpZnlfZGF0YS51c2VyLT5pbm90aWZ5X3dhdGNoZXMpID49IGlub3RpZnlfbWF4X3VzZXJfd2F0Y2hlcykgeworCQkJcmV0ID0gLUVOT1NQQzsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCisJCXJldCA9IGZzbm90aWZ5X2FkZF9tYXJrKCZpZW50cnktPmZzbl9lbnRyeSwgZ3JvdXAsIGlub2RlKTsKKwkJaWYgKHJldCA9PSAtRUVYSVNUKQorCQkJZ290byBmaW5kX2VudHJ5OworCQllbHNlIGlmIChyZXQpCisJCQlnb3RvIG91dF9lcnI7CisKKwkJZW50cnkgPSAmaWVudHJ5LT5mc25fZW50cnk7CityZXRyeToKKwkJcmV0ID0gLUVOT01FTTsKKwkJaWYgKHVubGlrZWx5KCFpZHJfcHJlX2dldCgmZ3JvdXAtPmlub3RpZnlfZGF0YS5pZHIsIEdGUF9LRVJORUwpKSkKKwkJCWdvdG8gb3V0X2VycjsKKworCQlzcGluX2xvY2soJmdyb3VwLT5pbm90aWZ5X2RhdGEuaWRyX2xvY2spOworCQkvKiBpZiBlbnRyeSBpcyBhZGRlZCB0byB0aGUgaWRyIHdlIGtlZXAgdGhlIHJlZmVyZW5jZSBvYnRhaW5lZAorCQkgKiB0aHJvdWdoIGZzbm90aWZ5X21hcmtfYWRkLiAgcmVtZW1iZXIgdG8gZHJvcCB0aGlzIHJlZmVyZW5jZQorCQkgKiB3aGVuIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSBpZHIgKi8KKwkJcmV0ID0gaWRyX2dldF9uZXdfYWJvdmUoJmdyb3VwLT5pbm90aWZ5X2RhdGEuaWRyLCBlbnRyeSwKKwkJCQkJKytncm91cC0+aW5vdGlmeV9kYXRhLmxhc3Rfd2QsCisJCQkJCSZpZW50cnktPndkKTsKKwkJc3Bpbl91bmxvY2soJmdyb3VwLT5pbm90aWZ5X2RhdGEuaWRyX2xvY2spOworCQlpZiAocmV0KSB7CisJCQlpZiAocmV0ID09IC1FQUdBSU4pCisJCQkJZ290byByZXRyeTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCQlhdG9taWNfaW5jKCZncm91cC0+aW5vdGlmeV9kYXRhLnVzZXItPmlub3RpZnlfd2F0Y2hlcyk7CisJfQorCisJc3Bpbl9sb2NrKCZlbnRyeS0+bG9jayk7CisKKwlvbGRfbWFzayA9IGVudHJ5LT5tYXNrOworCWlmIChhZGQpIHsKKwkJZW50cnktPm1hc2sgfD0gbWFzazsKKwkJbmV3X21hc2sgPSBlbnRyeS0+bWFzazsKKwl9IGVsc2UgeworCQllbnRyeS0+bWFzayA9IG1hc2s7CisJCW5ld19tYXNrID0gZW50cnktPm1hc2s7CisJfQorCisJc3Bpbl91bmxvY2soJmVudHJ5LT5sb2NrKTsKKworCWlmIChvbGRfbWFzayAhPSBuZXdfbWFzaykgeworCQkvKiBtb3JlIGJpdHMgaW4gb2xkIHRoYW4gaW4gbmV3PyAqLworCQlpbnQgZHJvcHBlZCA9IChvbGRfbWFzayAmIH5uZXdfbWFzayk7CisJCS8qIG1vcmUgYml0cyBpbiB0aGlzIGVudHJ5IHRoYW4gdGhlIGlub2RlJ3MgbWFzaz8gKi8KKwkJaW50IGRvX2lub2RlID0gKG5ld19tYXNrICYgfmlub2RlLT5pX2Zzbm90aWZ5X21hc2spOworCQkvKiBtb3JlIGJpdHMgaW4gdGhpcyBlbnRyeSB0aGFuIHRoZSBncm91cD8gKi8KKwkJaW50IGRvX2dyb3VwID0gKG5ld19tYXNrICYgfmdyb3VwLT5tYXNrKTsKKworCQkvKiB1cGRhdGUgdGhlIGlub2RlIHdpdGggdGhpcyBuZXcgZW50cnkgKi8KKwkJaWYgKGRyb3BwZWQgfHwgZG9faW5vZGUpCisJCQlmc25vdGlmeV9yZWNhbGNfaW5vZGVfbWFzayhpbm9kZSk7CisKKwkJLyogdXBkYXRlIHRoZSBncm91cCBtYXNrIHdpdGggdGhlIG5ldyBtYXNrICovCisJCWlmIChkcm9wcGVkIHx8IGRvX2dyb3VwKQorCQkJZnNub3RpZnlfcmVjYWxjX2dyb3VwX21hc2soZ3JvdXApOworCX0KKworCXJldHVybiBpZW50cnktPndkOworCitvdXRfZXJyOgorCS8qIHNlZSB0aGlzIGlzbid0IHN1cHBvc2VkIHRvIGhhcHBlbiwganVzdCBraWxsIHRoZSB3YXRjaCAqLworCWlmIChlbnRyeSkgeworCQlmc25vdGlmeV9kZXN0cm95X21hcmtfYnlfZW50cnkoZW50cnkpOworCQlmc25vdGlmeV9wdXRfbWFyayhlbnRyeSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmlub3RpZnlfbmV3X2dyb3VwKHN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciwgdW5zaWduZWQgaW50IG1heF9ldmVudHMpCit7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKKwl1bnNpZ25lZCBpbnQgZ3JwX251bTsKKworCS8qIGZzbm90aWZ5X29idGFpbl9ncm91cCB0b29rIGEgcmVmZXJlbmNlIHRvIGdyb3VwLCB3ZSBwdXQgdGhpcyB3aGVuIHdlIGtpbGwgdGhlIGZpbGUgaW4gdGhlIGVuZCAqLworCWdycF9udW0gPSAoSU5PVElGWV9HUk9VUF9OVU0gLSBhdG9taWNfaW5jX3JldHVybigmaW5vdGlmeV9ncnBfbnVtKSk7CisJZ3JvdXAgPSBmc25vdGlmeV9vYnRhaW5fZ3JvdXAoZ3JwX251bSwgMCwgJmlub3RpZnlfZnNub3RpZnlfb3BzKTsKKwlpZiAoSVNfRVJSKGdyb3VwKSkKKwkJcmV0dXJuIGdyb3VwOworCisJZ3JvdXAtPm1heF9ldmVudHMgPSBtYXhfZXZlbnRzOworCisJc3Bpbl9sb2NrX2luaXQoJmdyb3VwLT5pbm90aWZ5X2RhdGEuaWRyX2xvY2spOworCWlkcl9pbml0KCZncm91cC0+aW5vdGlmeV9kYXRhLmlkcik7CisJZ3JvdXAtPmlub3RpZnlfZGF0YS5sYXN0X3dkID0gMDsKKwlncm91cC0+aW5vdGlmeV9kYXRhLnVzZXIgPSB1c2VyOworCWdyb3VwLT5pbm90aWZ5X2RhdGEuZmEgPSBOVUxMOworCisJcmV0dXJuIGdyb3VwOworfQorCisKKy8qIGlub3RpZnkgc3lzY2FsbHMgKi8KIFNZU0NBTExfREVGSU5FMShpbm90aWZ5X2luaXQxLCBpbnQsIGZsYWdzKQogewotCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OwotCXN0cnVjdCBpbm90aWZ5X2hhbmRsZSAqaWg7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXI7CiAJc3RydWN0IGZpbGUgKmZpbHA7CiAJaW50IGZkLCByZXQ7CkBAIC02MjEsNDUgKzU5MSwyNyBAQAogCQlnb3RvIG91dF9mcmVlX3VpZDsKIAl9CiAKLQlkZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIWRldikpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwkvKiBmc25vdGlmeV9vYnRhaW5fZ3JvdXAgdG9vayBhIHJlZmVyZW5jZSB0byBncm91cCwgd2UgcHV0IHRoaXMgd2hlbiB3ZSBraWxsIHRoZSBmaWxlIGluIHRoZSBlbmQgKi8KKwlncm91cCA9IGlub3RpZnlfbmV3X2dyb3VwKHVzZXIsIGlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHMpOworCWlmIChJU19FUlIoZ3JvdXApKSB7CisJCXJldCA9IFBUUl9FUlIoZ3JvdXApOwogCQlnb3RvIG91dF9mcmVlX3VpZDsKIAl9CiAKLQlpaCA9IGlub3RpZnlfaW5pdCgmaW5vdGlmeV91c2VyX29wcyk7Ci0JaWYgKElTX0VSUihpaCkpIHsKLQkJcmV0ID0gUFRSX0VSUihpaCk7Ci0JCWdvdG8gb3V0X2ZyZWVfZGV2OwotCX0KLQlkZXYtPmloID0gaWg7Ci0JZGV2LT5mYSA9IE5VTEw7Ci0KIAlmaWxwLT5mX29wID0gJmlub3RpZnlfZm9wczsKIAlmaWxwLT5mX3BhdGgubW50ID0gbW50Z2V0KGlub3RpZnlfbW50KTsKIAlmaWxwLT5mX3BhdGguZGVudHJ5ID0gZGdldChpbm90aWZ5X21udC0+bW50X3Jvb3QpOwogCWZpbHAtPmZfbWFwcGluZyA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKIAlmaWxwLT5mX21vZGUgPSBGTU9ERV9SRUFEOwogCWZpbHAtPmZfZmxhZ3MgPSBPX1JET05MWSB8IChmbGFncyAmIE9fTk9OQkxPQ0spOwotCWZpbHAtPnByaXZhdGVfZGF0YSA9IGRldjsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBncm91cDsKIAotCUlOSVRfTElTVF9IRUFEKCZkZXYtPmV2ZW50cyk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53cSk7Ci0JbXV0ZXhfaW5pdCgmZGV2LT5ldl9tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmZGV2LT51cF9tdXRleCk7Ci0JZGV2LT5ldmVudF9jb3VudCA9IDA7Ci0JZGV2LT5xdWV1ZV9zaXplID0gMDsKLQlkZXYtPm1heF9ldmVudHMgPSBpbm90aWZ5X21heF9xdWV1ZWRfZXZlbnRzOwotCWRldi0+dXNlciA9IHVzZXI7Ci0JYXRvbWljX3NldCgmZGV2LT5jb3VudCwgMCk7Ci0KLQlnZXRfaW5vdGlmeV9kZXYoZGV2KTsKIAlhdG9taWNfaW5jKCZ1c2VyLT5pbm90aWZ5X2RldnMpOworCiAJZmRfaW5zdGFsbChmZCwgZmlscCk7CiAKIAlyZXR1cm4gZmQ7Ci1vdXRfZnJlZV9kZXY6Ci0Ja2ZyZWUoZGV2KTsKKwogb3V0X2ZyZWVfdWlkOgogCWZyZWVfdWlkKHVzZXIpOwogCXB1dF9maWxwKGZpbHApOwpAQCAtNjc2LDggKzYyOCw4IEBACiBTWVNDQUxMX0RFRklORTMoaW5vdGlmeV9hZGRfd2F0Y2gsIGludCwgZmQsIGNvbnN0IGNoYXIgX191c2VyICosIHBhdGhuYW1lLAogCQl1MzIsIG1hc2spCiB7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwotCXN0cnVjdCBpbm90aWZ5X2RldmljZSAqZGV2OwogCXN0cnVjdCBwYXRoIHBhdGg7CiAJc3RydWN0IGZpbGUgKmZpbHA7CiAJaW50IHJldCwgZnB1dF9uZWVkZWQ7CkBAIC02OTgsMjAgKzY1MCwyMCBAQAogCWlmIChtYXNrICYgSU5fT05MWURJUikKIAkJZmxhZ3MgfD0gTE9PS1VQX0RJUkVDVE9SWTsKIAotCXJldCA9IGZpbmRfaW5vZGUocGF0aG5hbWUsICZwYXRoLCBmbGFncyk7Ci0JaWYgKHVubGlrZWx5KHJldCkpCisJcmV0ID0gaW5vdGlmeV9maW5kX2lub2RlKHBhdGhuYW1lLCAmcGF0aCwgZmxhZ3MpOworCWlmIChyZXQpCiAJCWdvdG8gZnB1dF9hbmRfb3V0OwogCi0JLyogaW5vZGUgaGVsZCBpbiBwbGFjZSBieSByZWZlcmVuY2UgdG8gcGF0aDsgZGV2IGJ5IGZnZXQgb24gZmQgKi8KKwkvKiBpbm9kZSBoZWxkIGluIHBsYWNlIGJ5IHJlZmVyZW5jZSB0byBwYXRoOyBncm91cCBieSBmZ2V0IG9uIGZkICovCiAJaW5vZGUgPSBwYXRoLmRlbnRyeS0+ZF9pbm9kZTsKLQlkZXYgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJZ3JvdXAgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAKLQltdXRleF9sb2NrKCZkZXYtPnVwX211dGV4KTsKLQlyZXQgPSBpbm90aWZ5X2ZpbmRfdXBkYXRlX3dhdGNoKGRldi0+aWgsIGlub2RlLCBtYXNrKTsKLQlpZiAocmV0ID09IC1FTk9FTlQpCi0JCXJldCA9IGNyZWF0ZV93YXRjaChkZXYsIGlub2RlLCBtYXNrKTsKLQltdXRleF91bmxvY2soJmRldi0+dXBfbXV0ZXgpOworCS8qIGNyZWF0ZS91cGRhdGUgYW4gaW5vZGUgbWFyayAqLworCXJldCA9IGlub3RpZnlfdXBkYXRlX3dhdGNoKGdyb3VwLCBpbm9kZSwgbWFzayk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gcGF0aF9wdXRfYW5kX291dDsKIAorcGF0aF9wdXRfYW5kX291dDoKIAlwYXRoX3B1dCgmcGF0aCk7CiBmcHV0X2FuZF9vdXQ6CiAJZnB1dF9saWdodChmaWxwLCBmcHV0X25lZWRlZCk7CkBAIC03MjAsOSArNjcyLDEwIEBACiAKIFNZU0NBTExfREVGSU5FMihpbm90aWZ5X3JtX3dhdGNoLCBpbnQsIGZkLCBfX3MzMiwgd2QpCiB7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKKwlzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZW50cnk7CiAJc3RydWN0IGZpbGUgKmZpbHA7Ci0Jc3RydWN0IGlub3RpZnlfZGV2aWNlICpkZXY7Ci0JaW50IHJldCwgZnB1dF9uZWVkZWQ7CisJaW50IHJldCA9IDAsIGZwdXRfbmVlZGVkOwogCiAJZmlscCA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CiAJaWYgKHVubGlrZWx5KCFmaWxwKSkKQEAgLTczNCwxMCArNjg3LDIwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlncm91cCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAotCS8qIHdlIGZyZWUgb3VyIHdhdGNoIGRhdGEgd2hlbiB3ZSBnZXQgSU5fSUdOT1JFRCAqLwotCXJldCA9IGlub3RpZnlfcm1fd2QoZGV2LT5paCwgd2QpOworCXNwaW5fbG9jaygmZ3JvdXAtPmlub3RpZnlfZGF0YS5pZHJfbG9jayk7CisJZW50cnkgPSBpZHJfZmluZCgmZ3JvdXAtPmlub3RpZnlfZGF0YS5pZHIsIHdkKTsKKwlpZiAodW5saWtlbHkoIWVudHJ5KSkgeworCQlzcGluX3VubG9jaygmZ3JvdXAtPmlub3RpZnlfZGF0YS5pZHJfbG9jayk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlmc25vdGlmeV9nZXRfbWFyayhlbnRyeSk7CisJc3Bpbl91bmxvY2soJmdyb3VwLT5pbm90aWZ5X2RhdGEuaWRyX2xvY2spOworCisJaW5vdGlmeV9kZXN0cm95X21hcmtfZW50cnkoZW50cnksIGdyb3VwKTsKKwlmc25vdGlmeV9wdXRfbWFyayhlbnRyeSk7CiAKIG91dDoKIAlmcHV0X2xpZ2h0KGZpbHAsIGZwdXRfbmVlZGVkKTsKQEAgLTc1Myw5ICs3MTYsOSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaW5vdGlmeV9mc190eXBlID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJpbm90aWZ5ZnMiLAotICAgIC5nZXRfc2IgICAgICAgICA9IGlub3RpZnlfZ2V0X3NiLAotICAgIC5raWxsX3NiICAgICAgICA9IGtpbGxfYW5vbl9zdXBlciwKKyAgICAubmFtZQk9ICJpbm90aWZ5ZnMiLAorICAgIC5nZXRfc2IJPSBpbm90aWZ5X2dldF9zYiwKKyAgICAua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKIH07CiAKIC8qCkBAIC03NzUsMTggKzczOCwxNiBAQAogCWlmIChJU19FUlIoaW5vdGlmeV9tbnQpKQogCQlwYW5pYygiaW5vdGlmeToga2Vybl9tb3VudCByZXQgJWxkIVxuIiwgUFRSX0VSUihpbm90aWZ5X21udCkpOwogCisJaW5vdGlmeV9pbm9kZV9tYXJrX2NhY2hlcCA9IEtNRU1fQ0FDSEUoaW5vdGlmeV9pbm9kZV9tYXJrX2VudHJ5LCBTTEFCX1BBTklDKTsKKwlldmVudF9wcml2X2NhY2hlcCA9IEtNRU1fQ0FDSEUoaW5vdGlmeV9ldmVudF9wcml2YXRlX2RhdGEsIFNMQUJfUEFOSUMpOworCWlub3RpZnlfaWdub3JlZF9ldmVudCA9IGZzbm90aWZ5X2NyZWF0ZV9ldmVudChOVUxMLCBGU19JTl9JR05PUkVELCBOVUxMLCBGU05PVElGWV9FVkVOVF9OT05FLCBOVUxMLCAwKTsKKwlpZiAoIWlub3RpZnlfaWdub3JlZF9ldmVudCkKKwkJcGFuaWMoInVuYWJsZSB0byBhbGxvY2F0ZSB0aGUgaW5vdGlmeSBpZ25vcmVkIGV2ZW50XG4iKTsKKwogCWlub3RpZnlfbWF4X3F1ZXVlZF9ldmVudHMgPSAxNjM4NDsKIAlpbm90aWZ5X21heF91c2VyX2luc3RhbmNlcyA9IDEyODsKIAlpbm90aWZ5X21heF91c2VyX3dhdGNoZXMgPSA4MTkyOwogCi0Jd2F0Y2hfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlub3RpZnlfd2F0Y2hfY2FjaGUiLAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X3VzZXJfd2F0Y2gpLAotCQkJCQkgMCwgU0xBQl9QQU5JQywgTlVMTCk7Ci0JZXZlbnRfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImlub3RpZnlfZXZlbnRfY2FjaGUiLAotCQkJCQkgc2l6ZW9mKHN0cnVjdCBpbm90aWZ5X2tlcm5lbF9ldmVudCksCi0JCQkJCSAwLCBTTEFCX1BBTklDLCBOVUxMKTsKLQogCXJldHVybiAwOwogfQotCiBtb2R1bGVfaW5pdChpbm90aWZ5X3VzZXJfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZnMvbm90aWZ5L25vdGlmaWNhdGlvbi5jIGIvZnMvbm90aWZ5L25vdGlmaWNhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1OWI3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ub3RpZnkvbm90aWZpY2F0aW9uLmMKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFJlZCBIYXQsIEluYy4sIEVyaWMgUGFyaXMgPGVwYXJpc0ByZWRoYXQuY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogQmFzaWMgaWRlYSBiZWhpbmQgdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZTogQW4gZnNub3RpZnkgZ3JvdXAgKGxpa2UgaW5vdGlmeSkKKyAqIHNlbmRzIHRoZSB1c2Vyc3BhY2Ugbm90aWZpY2F0aW9uIGFib3V0IGV2ZW50cyBhc3luY3Jvbm91c2x5IHNvbWUgdGltZSBhZnRlcgorICogdGhlIGV2ZW50IGhhcHBlbmVkLiAgV2hlbiBpbm90aWZ5IGdldHMgYW4gZXZlbnQgaXQgd2lsbCBuZWVkIHRvIGFkZCB0aGF0CisgKiBldmVudCB0byB0aGUgZ3JvdXAgbm90aWZ5IHF1ZXVlLiAgU2luY2UgYSBzaW5nbGUgZXZlbnQgbWlnaHQgbmVlZCB0byBiZSBvbgorICogbXVsdGlwbGUgZ3JvdXAncyBub3RpZmljYXRpb24gcXVldWVzIHdlIGNhbid0IGFkZCB0aGUgZXZlbnQgZGlyZWN0bHkgdG8gZWFjaAorICogcXVldWUgYW5kIGluc3RlYWQgYWRkIGEgc21hbGwgImV2ZW50X2hvbGRlciIgdG8gZWFjaCBxdWV1ZS4gIFRoaXMgZXZlbnRfaG9sZGVyCisgKiBoYXMgYSBwb2ludGVyIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGV2ZW50LiAgU2luY2UgdGhlIG1ham9yaXR5IG9mIGV2ZW50cyBhcmUKKyAqIGdvaW5nIHRvIGVuZCB1cCBvbiBvbmUsIGFuZCBvbmx5IG9uZSwgbm90aWZpY2F0aW9uIHF1ZXVlIHdlIGVtYmVkIG9uZQorICogZXZlbnRfaG9sZGVyIGludG8gZWFjaCBldmVudC4gIFRoaXMgbWVhbnMgd2UgaGF2ZSBhIHNpbmdsZSBhbGxvY2F0aW9uIGluc3RlYWQKKyAqIG9mIGFsd2F5cyBuZWVkaW5nIHR3by4gIElmIHRoZSBlbWJlZGRlZCBldmVudF9ob2xkZXIgaXMgYWxyZWFkeSBpbiB1c2UgYnkKKyAqIGFub3RoZXIgZ3JvdXAgYSBuZXcgZXZlbnRfaG9sZGVyIChmcm9tIGZzbm90aWZ5X2V2ZW50X2hvbGRlcl9jYWNoZXApIHdpbGwgYmUKKyAqIGFsbG9jYXRlZCBhbmQgdXNlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhdGguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaD4KKyNpbmNsdWRlICJmc25vdGlmeS5oIgorCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZzbm90aWZ5X2V2ZW50X2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZnNub3RpZnlfZXZlbnRfaG9sZGVyX2NhY2hlcDsKKy8qCisgKiBUaGlzIGlzIGEgbWFnaWMgZXZlbnQgd2Ugc2VuZCB3aGVuIHRoZSBxIGlzIHRvbyBmdWxsLiAgU2luY2UgaXQgZG9lc24ndAorICogaG9sZCByZWFsIGV2ZW50IGluZm9ybWF0aW9uIHdlIGp1c3Qga2VlcCBvbmUgc3lzdGVtIHdpZGUgYW5kIHVzZSBpdCBhbnkgdGltZQorICogaXQgaXMgbmVlZGVkLiAgSXQncyByZWZjbnQgaXMgc2V0IDEgYXQga2VybmVsIGluaXQgdGltZSBhbmQgd2lsbCBuZXZlcgorICogZ2V0IHNldCB0byAwIHNvIGl0IHdpbGwgbmV2ZXIgZ2V0ICdmcmVlZCcKKyAqLworc3RhdGljIHN0cnVjdCBmc25vdGlmeV9ldmVudCBxX292ZXJmbG93X2V2ZW50Oworc3RhdGljIGF0b21pY190IGZzbm90aWZ5X3N5bmNfY29va2llID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qKgorICogZnNub3RpZnlfZ2V0X2Nvb2tpZSAtIHJldHVybiBhIHVuaXF1ZSBjb29raWUgZm9yIHVzZSBpbiBzeW5jaHJvbml6aW5nIGV2ZW50cy4KKyAqIENhbGxlZCBmcm9tIGZzbm90aWZ5X21vdmUsIHdoaWNoIGlzIGlubGluZWQgaW50byBmaWxlc3lzdGVtIG1vZHVsZXMuCisgKi8KK3UzMiBmc25vdGlmeV9nZXRfY29va2llKHZvaWQpCit7CisJcmV0dXJuIGF0b21pY19pbmNfcmV0dXJuKCZmc25vdGlmeV9zeW5jX2Nvb2tpZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc25vdGlmeV9nZXRfY29va2llKTsKKworLyogcmV0dXJuIHRydWUgaWYgdGhlIG5vdGlmeSBxdWV1ZSBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlICovCitib29sIGZzbm90aWZ5X25vdGlmeV9xdWV1ZV9pc19lbXB0eShzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKQoreworCUJVR19PTighbXV0ZXhfaXNfbG9ja2VkKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KSk7CisJcmV0dXJuIGxpc3RfZW1wdHkoJmdyb3VwLT5ub3RpZmljYXRpb25fbGlzdCkgPyB0cnVlIDogZmFsc2U7Cit9CisKK3ZvaWQgZnNub3RpZnlfZ2V0X2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQpCit7CisJYXRvbWljX2luYygmZXZlbnQtPnJlZmNudCk7Cit9CisKK3ZvaWQgZnNub3RpZnlfcHV0X2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQpCit7CisJaWYgKCFldmVudCkKKwkJcmV0dXJuOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmV2ZW50LT5yZWZjbnQpKSB7CisJCWlmIChldmVudC0+ZGF0YV90eXBlID09IEZTTk9USUZZX0VWRU5UX1BBVEgpCisJCQlwYXRoX3B1dCgmZXZlbnQtPnBhdGgpOworCisJCUJVR19PTighbGlzdF9lbXB0eSgmZXZlbnQtPnByaXZhdGVfZGF0YV9saXN0KSk7CisKKwkJa2ZyZWUoZXZlbnQtPmZpbGVfbmFtZSk7CisJCWttZW1fY2FjaGVfZnJlZShmc25vdGlmeV9ldmVudF9jYWNoZXAsIGV2ZW50KTsKKwl9Cit9CisKK3N0cnVjdCBmc25vdGlmeV9ldmVudF9ob2xkZXIgKmZzbm90aWZ5X2FsbG9jX2V2ZW50X2hvbGRlcih2b2lkKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGZzbm90aWZ5X2V2ZW50X2hvbGRlcl9jYWNoZXAsIEdGUF9LRVJORUwpOworfQorCit2b2lkIGZzbm90aWZ5X2Rlc3Ryb3lfZXZlbnRfaG9sZGVyKHN0cnVjdCBmc25vdGlmeV9ldmVudF9ob2xkZXIgKmhvbGRlcikKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZnNub3RpZnlfZXZlbnRfaG9sZGVyX2NhY2hlcCwgaG9sZGVyKTsKK30KKworLyoKKyAqIEZpbmQgdGhlIHByaXZhdGUgZGF0YSB0aGF0IHRoZSBncm91cCBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIHRoaXMgZXZlbnQgd2hlbgorICogdGhlIGdyb3VwIGFkZGVkIHRoZSBldmVudCB0byB0aGUgbm90aWZpY2F0aW9uIHF1ZXVlIChmc25vdGlmeV9hZGRfbm90aWZ5X2V2ZW50KQorICovCitzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhICpmc25vdGlmeV9yZW1vdmVfcHJpdl9mcm9tX2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGZzbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSAqbHByaXY7CisJc3RydWN0IGZzbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSAqcHJpdiA9IE5VTEw7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmV2ZW50LT5sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobHByaXYsICZldmVudC0+cHJpdmF0ZV9kYXRhX2xpc3QsIGV2ZW50X2xpc3QpIHsKKwkJaWYgKGxwcml2LT5ncm91cCA9PSBncm91cCkgeworCQkJcHJpdiA9IGxwcml2OworCQkJbGlzdF9kZWwoJnByaXYtPmV2ZW50X2xpc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHByaXY7Cit9CisKKy8qCisgKiBDaGVjayBpZiAyIGV2ZW50cyBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uLiAgV2UgZG8gbm90IGNvbXBhcmUgcHJpdmF0ZSBkYXRhCisgKiBidXQgYXQgdGhpcyBtb21lbnQgdGhhdCBpc24ndCBhIHByb2JsZW0gZm9yIGFueSBrbm93IGZzbm90aWZ5IGxpc3RlbmVycy4KKyAqLworc3RhdGljIGJvb2wgZXZlbnRfY29tcGFyZShzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKm9sZCwgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpuZXcpCit7CisJaWYgKChvbGQtPm1hc2sgPT0gbmV3LT5tYXNrKSAmJgorCSAgICAob2xkLT50b190ZWxsID09IG5ldy0+dG9fdGVsbCkgJiYKKwkgICAgKG9sZC0+ZGF0YV90eXBlID09IG5ldy0+ZGF0YV90eXBlKSkgeworCQlzd2l0Y2ggKG9sZC0+ZGF0YV90eXBlKSB7CisJCWNhc2UgKEZTTk9USUZZX0VWRU5UX0lOT0RFKToKKwkJCWlmIChvbGQtPmlub2RlID09IG5ldy0+aW5vZGUpCisJCQkJcmV0dXJuIHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAoRlNOT1RJRllfRVZFTlRfUEFUSCk6CisJCQlpZiAoKG9sZC0+cGF0aC5tbnQgPT0gbmV3LT5wYXRoLm1udCkgJiYKKwkJCSAgICAob2xkLT5wYXRoLmRlbnRyeSA9PSBuZXctPnBhdGguZGVudHJ5KSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJY2FzZSAoRlNOT1RJRllfRVZFTlRfTk9ORSk6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogQWRkIGFuIGV2ZW50IHRvIHRoZSBncm91cCBub3RpZmljYXRpb24gcXVldWUuICBUaGUgZ3JvdXAgY2FuIGxhdGVyIHB1bGwgdGhpcworICogZXZlbnQgb2ZmIHRoZSBxdWV1ZSB0byBkZWFsIHdpdGguICBJZiB0aGUgZXZlbnQgaXMgc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZQorICogZ3JvdXAncyBub3RpZmljYXRpb24gcXVldWUsIGEgcmVmZXJlbmNlIGlzIHRha2VuIG9uIGV2ZW50LgorICovCitpbnQgZnNub3RpZnlfYWRkX25vdGlmeV9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50LAorCQkJICAgICAgc3RydWN0IGZzbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSAqcHJpdikKK3sKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfaG9sZGVyICpob2xkZXIgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSAmZ3JvdXAtPm5vdGlmaWNhdGlvbl9saXN0OworCXN0cnVjdCBmc25vdGlmeV9ldmVudF9ob2xkZXIgKmxhc3RfaG9sZGVyOworCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqbGFzdF9ldmVudDsKKworCS8qIGVhc3kgdG8gdGVsbCBpZiBwcml2IHdhcyBhdHRhY2hlZCB0byB0aGUgZXZlbnQgKi8KKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+ZXZlbnRfbGlzdCk7CisKKwkvKgorCSAqIFRoZXJlIGlzIG9uZSBmc25vdGlmeV9ldmVudF9ob2xkZXIgZW1iZWRkZWQgaW5zaWRlIGVhY2ggZnNub3RpZnlfZXZlbnQuCisJICogQ2hlY2sgaWYgd2UgZXhwZWN0IHRvIGJlIGFibGUgdG8gdXNlIHRoYXQgaG9sZGVyLiAgSWYgbm90IGFsbG9jIGEgbmV3CisJICogaG9sZGVyLgorCSAqIEZvciB0aGUgb3ZlcmZsb3cgZXZlbnQgaXQncyBwb3NzaWJsZSB0aGF0IHNvbWV0aGluZyB3aWxsIHVzZSB0aGUgaW4KKwkgKiBldmVudCBob2xkZXIgYmVmb3JlIHdlIGdldCB0aGUgbG9jayBzbyB3ZSBtYXkgbmVlZCB0byBqdW1wIGJhY2sgYW5kCisJICogYWxsb2MgYSBuZXcgaG9sZGVyLCB0aGlzIGNhbid0IGhhcHBlbiBmb3IgbW9zdCBldmVudHMuLi4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmV2ZW50LT5ob2xkZXIuZXZlbnRfbGlzdCkpIHsKK2FsbG9jX2hvbGRlcjoKKwkJaG9sZGVyID0gZnNub3RpZnlfYWxsb2NfZXZlbnRfaG9sZGVyKCk7CisJCWlmICghaG9sZGVyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbXV0ZXhfbG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CisKKwlpZiAoZ3JvdXAtPnFfbGVuID49IGdyb3VwLT5tYXhfZXZlbnRzKSB7CisJCWV2ZW50ID0gJnFfb3ZlcmZsb3dfZXZlbnQ7CisJCS8qIHNvcnJ5LCBubyBwcml2YXRlIGRhdGEgb24gdGhlIG92ZXJmbG93IGV2ZW50ICovCisJCXByaXYgPSBOVUxMOworCX0KKworCXNwaW5fbG9jaygmZXZlbnQtPmxvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJmV2ZW50LT5ob2xkZXIuZXZlbnRfbGlzdCkpIHsKKwkJaWYgKHVubGlrZWx5KGhvbGRlcikpCisJCQlmc25vdGlmeV9kZXN0cm95X2V2ZW50X2hvbGRlcihob2xkZXIpOworCQlob2xkZXIgPSAmZXZlbnQtPmhvbGRlcjsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KCFob2xkZXIpKSB7CisJCS8qIGJldHdlZW4gdGhlIHRpbWUgd2UgY2hlY2tlZCBhYm92ZSBhbmQgZ290IHRoZSBsb2NrIHRoZSBpbgorCQkgKiBldmVudCBob2xkZXIgd2FzIHVzZWQsIGdvIGJhY2sgYW5kIGdldCBhIG5ldyBvbmUgKi8KKwkJc3Bpbl91bmxvY2soJmV2ZW50LT5sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwkJZ290byBhbGxvY19ob2xkZXI7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCWxhc3RfaG9sZGVyID0gbGlzdF9lbnRyeShsaXN0LT5wcmV2LCBzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfaG9sZGVyLCBldmVudF9saXN0KTsKKwkJbGFzdF9ldmVudCA9IGxhc3RfaG9sZGVyLT5ldmVudDsKKwkJaWYgKGV2ZW50X2NvbXBhcmUobGFzdF9ldmVudCwgZXZlbnQpKSB7CisJCQlzcGluX3VubG9jaygmZXZlbnQtPmxvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKKwkJCWlmIChob2xkZXIgIT0gJmV2ZW50LT5ob2xkZXIpCisJCQkJZnNub3RpZnlfZGVzdHJveV9ldmVudF9ob2xkZXIoaG9sZGVyKTsKKwkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCisJZ3JvdXAtPnFfbGVuKys7CisJaG9sZGVyLT5ldmVudCA9IGV2ZW50OworCisJZnNub3RpZnlfZ2V0X2V2ZW50KGV2ZW50KTsKKwlsaXN0X2FkZF90YWlsKCZob2xkZXItPmV2ZW50X2xpc3QsIGxpc3QpOworCWlmIChwcml2KQorCQlsaXN0X2FkZF90YWlsKCZwcml2LT5ldmVudF9saXN0LCAmZXZlbnQtPnByaXZhdGVfZGF0YV9saXN0KTsKKwlzcGluX3VubG9jaygmZXZlbnQtPmxvY2spOworCW11dGV4X3VubG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CisKKwl3YWtlX3VwKCZncm91cC0+bm90aWZpY2F0aW9uX3dhaXRxKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbW92ZSBhbmQgcmV0dXJuIHRoZSBmaXJzdCBldmVudCBmcm9tIHRoZSBub3RpZmljYXRpb24gbGlzdC4gIFRoZXJlIGlzIGEKKyAqIHJlZmVyZW5jZSBoZWxkIG9uIHRoaXMgZXZlbnQgc2luY2UgaXQgd2FzIG9uIHRoZSBsaXN0LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5CisgKiBvZiB0aGUgY2FsbGVyIHRvIGRyb3AgdGhpcyByZWZlcmVuY2UuCisgKi8KK3N0cnVjdCBmc25vdGlmeV9ldmVudCAqZnNub3RpZnlfcmVtb3ZlX25vdGlmeV9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKQoreworCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQ7CisJc3RydWN0IGZzbm90aWZ5X2V2ZW50X2hvbGRlciAqaG9sZGVyOworCisJQlVHX09OKCFtdXRleF9pc19sb2NrZWQoJmdyb3VwLT5ub3RpZmljYXRpb25fbXV0ZXgpKTsKKworCWhvbGRlciA9IGxpc3RfZmlyc3RfZW50cnkoJmdyb3VwLT5ub3RpZmljYXRpb25fbGlzdCwgc3RydWN0IGZzbm90aWZ5X2V2ZW50X2hvbGRlciwgZXZlbnRfbGlzdCk7CisKKwlldmVudCA9IGhvbGRlci0+ZXZlbnQ7CisKKwlzcGluX2xvY2soJmV2ZW50LT5sb2NrKTsKKwlob2xkZXItPmV2ZW50ID0gTlVMTDsKKwlsaXN0X2RlbF9pbml0KCZob2xkZXItPmV2ZW50X2xpc3QpOworCXNwaW5fdW5sb2NrKCZldmVudC0+bG9jayk7CisKKwkvKiBldmVudCA9PSBob2xkZXIgbWVhbnMgd2UgYXJlIHJlZmVyZW5jZWQgdGhyb3VnaCB0aGUgaW4gZXZlbnQgaG9sZGVyICovCisJaWYgKGhvbGRlciAhPSAmZXZlbnQtPmhvbGRlcikKKwkJZnNub3RpZnlfZGVzdHJveV9ldmVudF9ob2xkZXIoaG9sZGVyKTsKKworCWdyb3VwLT5xX2xlbi0tOworCisJcmV0dXJuIGV2ZW50OworfQorCisvKgorICogVGhpcyB3aWxsIG5vdCByZW1vdmUgdGhlIGV2ZW50LCB0aGF0IG11c3QgYmUgZG9uZSB3aXRoIGZzbm90aWZ5X3JlbW92ZV9ub3RpZnlfZXZlbnQoKQorICovCitzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmZzbm90aWZ5X3BlZWtfbm90aWZ5X2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApCit7CisJc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfaG9sZGVyICpob2xkZXI7CisKKwlCVUdfT04oIW11dGV4X2lzX2xvY2tlZCgmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCkpOworCisJaG9sZGVyID0gbGlzdF9maXJzdF9lbnRyeSgmZ3JvdXAtPm5vdGlmaWNhdGlvbl9saXN0LCBzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfaG9sZGVyLCBldmVudF9saXN0KTsKKwlldmVudCA9IGhvbGRlci0+ZXZlbnQ7CisKKwlyZXR1cm4gZXZlbnQ7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhIGdyb3VwIGlzIGJlaW5nIHRvcm4gZG93biB0byBjbGVhbiB1cCBhbnkgb3V0c3RhbmRpbmcKKyAqIGV2ZW50IG5vdGlmaWNhdGlvbnMuCisgKi8KK3ZvaWQgZnNub3RpZnlfZmx1c2hfbm90aWZ5KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApCit7CisJc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhICpwcml2OworCisJbXV0ZXhfbG9jaygmZ3JvdXAtPm5vdGlmaWNhdGlvbl9tdXRleCk7CisJd2hpbGUgKCFmc25vdGlmeV9ub3RpZnlfcXVldWVfaXNfZW1wdHkoZ3JvdXApKSB7CisJCWV2ZW50ID0gZnNub3RpZnlfcmVtb3ZlX25vdGlmeV9ldmVudChncm91cCk7CisJCS8qIGlmIHRoZXkgZG9uJ3QgaW1wbGVtZW50IGZyZWVfZXZlbnRfcHJpdiB0aGV5IGJldHRlciBub3QgaGF2ZSBhdHRhY2hlZCBhbnkgKi8KKwkJaWYgKGdyb3VwLT5vcHMtPmZyZWVfZXZlbnRfcHJpdikgeworCQkJc3Bpbl9sb2NrKCZldmVudC0+bG9jayk7CisJCQlwcml2ID0gZnNub3RpZnlfcmVtb3ZlX3ByaXZfZnJvbV9ldmVudChncm91cCwgZXZlbnQpOworCQkJc3Bpbl91bmxvY2soJmV2ZW50LT5sb2NrKTsKKwkJCWlmIChwcml2KQorCQkJCWdyb3VwLT5vcHMtPmZyZWVfZXZlbnRfcHJpdihwcml2KTsKKwkJfQorCQlmc25vdGlmeV9wdXRfZXZlbnQoZXZlbnQpOyAvKiBtYXRjaGVzIGZzbm90aWZ5X2FkZF9ub3RpZnlfZXZlbnQgKi8KKwl9CisJbXV0ZXhfdW5sb2NrKCZncm91cC0+bm90aWZpY2F0aW9uX211dGV4KTsKK30KKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9ldmVudChzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50KQoreworCWV2ZW50LT5ob2xkZXIuZXZlbnQgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZldmVudC0+aG9sZGVyLmV2ZW50X2xpc3QpOworCWF0b21pY19zZXQoJmV2ZW50LT5yZWZjbnQsIDEpOworCisJc3Bpbl9sb2NrX2luaXQoJmV2ZW50LT5sb2NrKTsKKworCWV2ZW50LT5wYXRoLmRlbnRyeSA9IE5VTEw7CisJZXZlbnQtPnBhdGgubW50ID0gTlVMTDsKKwlldmVudC0+aW5vZGUgPSBOVUxMOworCWV2ZW50LT5kYXRhX3R5cGUgPSBGU05PVElGWV9FVkVOVF9OT05FOworCisJSU5JVF9MSVNUX0hFQUQoJmV2ZW50LT5wcml2YXRlX2RhdGFfbGlzdCk7CisKKwlldmVudC0+dG9fdGVsbCA9IE5VTEw7CisKKwlldmVudC0+ZmlsZV9uYW1lID0gTlVMTDsKKwlldmVudC0+bmFtZV9sZW4gPSAwOworCisJZXZlbnQtPnN5bmNfY29va2llID0gMDsKK30KKworLyoKKyAqIGZzbm90aWZ5X2NyZWF0ZV9ldmVudCAtIEFsbG9jYXRlIGEgbmV3IGV2ZW50IHdoaWNoIHdpbGwgYmUgc2VudCB0byBlYWNoCisgKiBncm91cCdzIGhhbmRsZV9ldmVudCBmdW5jdGlvbiBpZiB0aGUgZ3JvdXAgd2FzIGludGVyZXN0ZWQgaW4gdGhpcworICogcGFydGljdWxhciBldmVudC4KKyAqCisgKiBAdG9fdGVsbCB0aGUgaW5vZGUgd2hpY2ggaXMgc3VwcG9zZWQgdG8gcmVjZWl2ZSB0aGUgZXZlbnQgKHNvbWV0aW1lcyBhCisgKglwYXJlbnQgb2YgdGhlIGlub2RlIHRvIHdoaWNoIHRoZSBldmVudCBoYXBwZW5lZC4KKyAqIEBtYXNrIHdoYXQgYWN0dWFsbHkgaGFwcGVuZWQuCisgKiBAZGF0YSBwb2ludGVyIHRvIHRoZSBvYmplY3Qgd2hpY2ggd2FzIGFjdHVhbGx5IGFmZmVjdGVkCisgKiBAZGF0YV90eXBlIGZsYWcgaW5kaWNhdGlvbiBpZiB0aGUgZGF0YSBpcyBhIGZpbGUsIHBhdGgsIGlub2RlLCBub3RoaW5nLi4uCisgKiBAbmFtZSB0aGUgZmlsZW5hbWUsIGlmIGF2YWlsYWJsZQorICovCitzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmZzbm90aWZ5X2NyZWF0ZV9ldmVudChzdHJ1Y3QgaW5vZGUgKnRvX3RlbGwsIF9fdTMyIG1hc2ssIHZvaWQgKmRhdGEsCisJCQkJCSAgICAgaW50IGRhdGFfdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgdTMyIGNvb2tpZSkKK3sKKwlzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50OworCisJZXZlbnQgPSBrbWVtX2NhY2hlX2FsbG9jKGZzbm90aWZ5X2V2ZW50X2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFldmVudCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbml0aWFsaXplX2V2ZW50KGV2ZW50KTsKKworCWlmIChuYW1lKSB7CisJCWV2ZW50LT5maWxlX25hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCQlpZiAoIWV2ZW50LT5maWxlX25hbWUpIHsKKwkJCWttZW1fY2FjaGVfZnJlZShmc25vdGlmeV9ldmVudF9jYWNoZXAsIGV2ZW50KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWV2ZW50LT5uYW1lX2xlbiA9IHN0cmxlbihldmVudC0+ZmlsZV9uYW1lKTsKKwl9CisKKwlldmVudC0+c3luY19jb29raWUgPSBjb29raWU7CisJZXZlbnQtPnRvX3RlbGwgPSB0b190ZWxsOworCisJc3dpdGNoIChkYXRhX3R5cGUpIHsKKwljYXNlIEZTTk9USUZZX0VWRU5UX0ZJTEU6IHsKKwkJc3RydWN0IGZpbGUgKmZpbGUgPSBkYXRhOworCQlzdHJ1Y3QgcGF0aCAqcGF0aCA9ICZmaWxlLT5mX3BhdGg7CisJCWV2ZW50LT5wYXRoLmRlbnRyeSA9IHBhdGgtPmRlbnRyeTsKKwkJZXZlbnQtPnBhdGgubW50ID0gcGF0aC0+bW50OworCQlwYXRoX2dldCgmZXZlbnQtPnBhdGgpOworCQlldmVudC0+ZGF0YV90eXBlID0gRlNOT1RJRllfRVZFTlRfUEFUSDsKKwkJYnJlYWs7CisJfQorCWNhc2UgRlNOT1RJRllfRVZFTlRfUEFUSDogeworCQlzdHJ1Y3QgcGF0aCAqcGF0aCA9IGRhdGE7CisJCWV2ZW50LT5wYXRoLmRlbnRyeSA9IHBhdGgtPmRlbnRyeTsKKwkJZXZlbnQtPnBhdGgubW50ID0gcGF0aC0+bW50OworCQlwYXRoX2dldCgmZXZlbnQtPnBhdGgpOworCQlldmVudC0+ZGF0YV90eXBlID0gRlNOT1RJRllfRVZFTlRfUEFUSDsKKwkJYnJlYWs7CisJfQorCWNhc2UgRlNOT1RJRllfRVZFTlRfSU5PREU6CisJCWV2ZW50LT5pbm9kZSA9IGRhdGE7CisJCWV2ZW50LT5kYXRhX3R5cGUgPSBGU05PVElGWV9FVkVOVF9JTk9ERTsKKwkJYnJlYWs7CisJY2FzZSBGU05PVElGWV9FVkVOVF9OT05FOgorCQlldmVudC0+aW5vZGUgPSBOVUxMOworCQlldmVudC0+cGF0aC5kZW50cnkgPSBOVUxMOworCQlldmVudC0+cGF0aC5tbnQgPSBOVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlldmVudC0+bWFzayA9IG1hc2s7CisKKwlyZXR1cm4gZXZlbnQ7Cit9CisKK19faW5pdCBpbnQgZnNub3RpZnlfbm90aWZpY2F0aW9uX2luaXQodm9pZCkKK3sKKwlmc25vdGlmeV9ldmVudF9jYWNoZXAgPSBLTUVNX0NBQ0hFKGZzbm90aWZ5X2V2ZW50LCBTTEFCX1BBTklDKTsKKwlmc25vdGlmeV9ldmVudF9ob2xkZXJfY2FjaGVwID0gS01FTV9DQUNIRShmc25vdGlmeV9ldmVudF9ob2xkZXIsIFNMQUJfUEFOSUMpOworCisJaW5pdGlhbGl6ZV9ldmVudCgmcV9vdmVyZmxvd19ldmVudCk7CisJcV9vdmVyZmxvd19ldmVudC5tYXNrID0gRlNfUV9PVkVSRkxPVzsKKworCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKGZzbm90aWZ5X25vdGlmaWNhdGlvbl9pbml0KTsKKwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9zdXBlci5jIGIvZnMvbnRmcy9zdXBlci5jCmluZGV4IGY3Njk1MWQuLjZhYTdjNDcgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvc3VwZXIuYworKysgYi9mcy9udGZzL3N1cGVyLmMKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4JLyogRm9yIGJkZXZfaGFyZHNlY3Rfc2l6ZSgpLiAqLworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgkvKiBGb3IgYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoKS4gKi8KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CkBAIC0yNzg1LDEzICsyNzg1LDEzIEBACiAJCWdvdG8gZXJyX291dF9ub3c7CiAKIAkvKiBXZSBzdXBwb3J0IHNlY3RvciBzaXplcyB1cCB0byB0aGUgUEFHRV9DQUNIRV9TSVpFLiAqLwotCWlmIChiZGV2X2hhcmRzZWN0X3NpemUoc2ItPnNfYmRldikgPiBQQUdFX0NBQ0hFX1NJWkUpIHsKKwlpZiAoYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoc2ItPnNfYmRldikgPiBQQUdFX0NBQ0hFX1NJWkUpIHsKIAkJaWYgKCFzaWxlbnQpCiAJCQludGZzX2Vycm9yKHNiLCAiRGV2aWNlIGhhcyB1bnN1cHBvcnRlZCBzZWN0b3Igc2l6ZSAiCiAJCQkJCSIoJWkpLiAgVGhlIG1heGltdW0gc3VwcG9ydGVkIHNlY3RvciAiCiAJCQkJCSJzaXplIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIGlzICVsdSAiCiAJCQkJCSJieXRlcy4iLAotCQkJCQliZGV2X2hhcmRzZWN0X3NpemUoc2ItPnNfYmRldiksCisJCQkJCWJkZXZfbG9naWNhbF9ibG9ja19zaXplKHNiLT5zX2JkZXYpLAogCQkJCQlQQUdFX0NBQ0hFX1NJWkUpOwogCQlnb3RvIGVycl9vdXRfbm93OwogCX0KZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMgYi9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCmluZGV4IDRmODVlY2UuLjA5Y2MyNWQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKKysrIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwpAQCAtMTM3MSw3ICsxMzcxLDcgQEAKIAogCWJkZXZuYW1lKHJlZy0+aHJfYmRldiwgcmVnLT5ocl9kZXZfbmFtZSk7CiAKLQlzZWN0c2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShyZWctPmhyX2JkZXYpOworCXNlY3RzaXplID0gYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUocmVnLT5ocl9iZGV2KTsKIAlpZiAoc2VjdHNpemUgIT0gcmVnLT5ocl9ibG9ja19ieXRlcykgewogCQltbG9nKE1MX0VSUk9SLAogCQkgICAgICJibG9ja3NpemUgJXUgaW5jb3JyZWN0IGZvciBkZXZpY2UsIGV4cGVjdGVkICVkIiwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL3N1cGVyLmMgYi9mcy9vY2ZzMi9zdXBlci5jCmluZGV4IDc5ZmY4ZDkuLjVjNjE2M2YgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N1cGVyLmMKKysrIGIvZnMvb2NmczIvc3VwZXIuYwpAQCAtNzEzLDcgKzcxMyw3IEBACiAJKmJoID0gTlVMTDsKIAogCS8qIG1heSBiZSA+IDUxMiAqLwotCSpzZWN0b3Jfc2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KTsKKwkqc2VjdG9yX3NpemUgPSBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShzYi0+c19iZGV2KTsKIAlpZiAoKnNlY3Rvcl9zaXplID4gT0NGUzJfTUFYX0JMT0NLU0laRSkgewogCQltbG9nKE1MX0VSUk9SLCAiSGFyZHdhcmUgc2VjdG9yIHNpemUgdG9vIGxhcmdlOiAlZCAobWF4PSVkKVxuIiwKIAkJICAgICAqc2VjdG9yX3NpemUsIE9DRlMyX01BWF9CTE9DS1NJWkUpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9jaGVjay5jIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCmluZGV4IDk5ZTMzZWYuLjBhZjM2MDggMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYworKysgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKQEAgLTIxOSw2ICsyMTksMTMgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbGx1XG4iLCh1bnNpZ25lZCBsb25nIGxvbmcpcC0+bnJfc2VjdHMpOwogfQogCitzc2l6ZV90IHBhcnRfYWxpZ25tZW50X29mZnNldF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBoZF9zdHJ1Y3QgKnAgPSBkZXZfdG9fcGFydChkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpcC0+YWxpZ25tZW50X29mZnNldCk7Cit9CisKIHNzaXplX3QgcGFydF9zdGF0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTI3Miw2ICsyNzksNyBAQAogc3RhdGljIERFVklDRV9BVFRSKHBhcnRpdGlvbiwgU19JUlVHTywgcGFydF9wYXJ0aXRpb25fc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc3RhcnQsIFNfSVJVR08sIHBhcnRfc3RhcnRfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoc2l6ZSwgU19JUlVHTywgcGFydF9zaXplX3Nob3csIE5VTEwpOworc3RhdGljIERFVklDRV9BVFRSKGFsaWdubWVudF9vZmZzZXQsIFNfSVJVR08sIHBhcnRfYWxpZ25tZW50X29mZnNldF9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihzdGF0LCBTX0lSVUdPLCBwYXJ0X3N0YXRfc2hvdywgTlVMTCk7CiAjaWZkZWYgQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUCiBzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmFpbCA9CkBAIC0yODIsNiArMjkwLDcgQEAKIAkmZGV2X2F0dHJfcGFydGl0aW9uLmF0dHIsCiAJJmRldl9hdHRyX3N0YXJ0LmF0dHIsCiAJJmRldl9hdHRyX3NpemUuYXR0ciwKKwkmZGV2X2F0dHJfYWxpZ25tZW50X29mZnNldC5hdHRyLAogCSZkZXZfYXR0cl9zdGF0LmF0dHIsCiAjaWZkZWYgQ09ORklHX0ZBSUxfTUFLRV9SRVFVRVNUCiAJJmRldl9hdHRyX2ZhaWwuYXR0ciwKQEAgLTM4Myw2ICszOTIsNyBAQAogCXBkZXYgPSBwYXJ0X3RvX2RldihwKTsKIAogCXAtPnN0YXJ0X3NlY3QgPSBzdGFydDsKKwlwLT5hbGlnbm1lbnRfb2Zmc2V0ID0gcXVldWVfc2VjdG9yX2FsaWdubWVudF9vZmZzZXQoZGlzay0+cXVldWUsIHN0YXJ0KTsKIAlwLT5ucl9zZWN0cyA9IGxlbjsKIAlwLT5wYXJ0bm8gPSBwYXJ0bm87CiAJcC0+cG9saWN5ID0gZ2V0X2Rpc2tfcm8oZGlzayk7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2libS5jIGIvZnMvcGFydGl0aW9ucy9pYm0uYwppbmRleCA0NjI5NzY4Li5mYzcxYWFiIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2libS5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvaWJtLmMKQEAgLTc2LDcgKzc2LDcgQEAKIAlTZWN0b3Igc2VjdDsKIAogCXJlcyA9IDA7Ci0JYmxvY2tzaXplID0gYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpOworCWJsb2Nrc2l6ZSA9IGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpOwogCWlmIChibG9ja3NpemUgPD0gMCkKIAkJZ290byBvdXRfZXhpdDsKIAlpX3NpemUgPSBpX3NpemVfcmVhZChiZGV2LT5iZF9pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL21zZG9zLmMgYi9mcy9wYXJ0aXRpb25zL21zZG9zLmMKaW5kZXggNzk2NTExOC4uMDAyOGQyZSAxMDA2NDQKLS0tIGEvZnMvcGFydGl0aW9ucy9tc2Rvcy5jCisrKyBiL2ZzL3BhcnRpdGlvbnMvbXNkb3MuYwpAQCAtMTEwLDcgKzExMCw3IEBACiAJU2VjdG9yIHNlY3Q7CiAJdW5zaWduZWQgY2hhciAqZGF0YTsKIAl1MzIgdGhpc19zZWN0b3IsIHRoaXNfc2l6ZTsKLQlpbnQgc2VjdG9yX3NpemUgPSBiZGV2X2hhcmRzZWN0X3NpemUoYmRldikgLyA1MTI7CisJaW50IHNlY3Rvcl9zaXplID0gYmRldl9sb2dpY2FsX2Jsb2NrX3NpemUoYmRldikgLyA1MTI7CiAJaW50IGxvb3BjdCA9IDA7CQkvKiBudW1iZXIgb2YgbGlua3MgZm9sbG93ZWQKIAkJCQkgICB3aXRob3V0IGZpbmRpbmcgYSBkYXRhIHBhcnRpdGlvbiAqLwogCWludCBpOwpAQCAtNDE1LDcgKzQxNSw3IEBACiAgCiBpbnQgbXNkb3NfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7Ci0JaW50IHNlY3Rvcl9zaXplID0gYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpIC8gNTEyOworCWludCBzZWN0b3Jfc2l6ZSA9IGJkZXZfbG9naWNhbF9ibG9ja19zaXplKGJkZXYpIC8gNTEyOwogCVNlY3RvciBzZWN0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGE7CiAJc3RydWN0IHBhcnRpdGlvbiAqcDsKZGlmZiAtLWdpdCBhL2ZzL3BpcGUuYyBiL2ZzL3BpcGUuYwppbmRleCAxMzQxNGVjLi5mN2RkMjFhIDEwMDY0NAotLS0gYS9mcy9waXBlLmMKKysrIGIvZnMvcGlwZS5jCkBAIC0zMDIsNiArMzAyLDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogZ2VuZXJpY19waXBlX2J1Zl9yZWxlYXNlIC0gcHV0IGEgcmVmZXJlbmNlIHRvIGEgJnN0cnVjdCBwaXBlX2J1ZmZlcgorICogQHBpcGU6CXRoZSBwaXBlIHRoYXQgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvCisgKiBAYnVmOgl0aGUgYnVmZmVyIHRvIHB1dCBhIHJlZmVyZW5jZSB0bworICoKKyAqIERlc2NyaXB0aW9uOgorICoJVGhpcyBmdW5jdGlvbiByZWxlYXNlcyBhIHJlZmVyZW5jZSB0byBAYnVmLgorICovCit2b2lkIGdlbmVyaWNfcGlwZV9idWZfcmVsZWFzZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAorCQkJICAgICAgc3RydWN0IHBpcGVfYnVmZmVyICpidWYpCit7CisJcGFnZV9jYWNoZV9yZWxlYXNlKGJ1Zi0+cGFnZSk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyBhbm9uX3BpcGVfYnVmX29wcyA9IHsKIAkuY2FuX21lcmdlID0gMSwKIAkubWFwID0gZ2VuZXJpY19waXBlX2J1Zl9tYXAsCmRpZmYgLS1naXQgYS9mcy9wcm9jL2Jhc2UuYyBiL2ZzL3Byb2MvYmFzZS5jCmluZGV4IDMzMjZiYmYuLjE1MzllNjMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYmFzZS5jCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC0yMTI4LDkgKzIxMjgsMTUgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIocGFnZSwgYnVmLCBjb3VudCkpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKKwkvKiBHdWFyZCBhZ2FpbnN0IGFkdmVyc2UgcHRyYWNlIGludGVyYWN0aW9uICovCisJbGVuZ3RoID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0YXNrLT5jcmVkX2d1YXJkX211dGV4KTsKKwlpZiAobGVuZ3RoIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwogCWxlbmd0aCA9IHNlY3VyaXR5X3NldHByb2NhdHRyKHRhc2ssCiAJCQkJICAgICAgKGNoYXIqKWZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCSAgICAgICh2b2lkKilwYWdlLCBjb3VudCk7CisJbXV0ZXhfdW5sb2NrKCZ0YXNrLT5jcmVkX2d1YXJkX211dGV4KTsKIG91dF9mcmVlOgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9wcm9jL2xvYWRhdmcuYyBiL2ZzL3Byb2MvbG9hZGF2Zy5jCmluZGV4IDliY2EzOWMuLjFhZmE0ZGQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbG9hZGF2Zy5jCisrKyBiL2ZzL3Byb2MvbG9hZGF2Zy5jCkBAIC0xMiwyMCArMTIsMTQgQEAKIAogc3RhdGljIGludCBsb2FkYXZnX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0JaW50IGEsIGIsIGM7Ci0JdW5zaWduZWQgbG9uZyBzZXE7CisJdW5zaWduZWQgbG9uZyBhdm5ydW5bM107CiAKLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCQlhID0gYXZlbnJ1blswXSArIChGSVhFRF8xLzIwMCk7Ci0JCWIgPSBhdmVucnVuWzFdICsgKEZJWEVEXzEvMjAwKTsKLQkJYyA9IGF2ZW5ydW5bMl0gKyAoRklYRURfMS8yMDApOwotCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCWdldF9hdmVucnVuKGF2bnJ1biwgRklYRURfMS8yMDAsIDApOwogCi0Jc2VxX3ByaW50ZihtLCAiJWQuJTAyZCAlZC4lMDJkICVkLiUwMmQgJWxkLyVkICVkXG4iLAotCQlMT0FEX0lOVChhKSwgTE9BRF9GUkFDKGEpLAotCQlMT0FEX0lOVChiKSwgTE9BRF9GUkFDKGIpLAotCQlMT0FEX0lOVChjKSwgTE9BRF9GUkFDKGMpLAorCXNlcV9wcmludGYobSwgIiVsdS4lMDJsdSAlbHUuJTAybHUgJWx1LiUwMmx1ICVsZC8lZCAlZFxuIiwKKwkJTE9BRF9JTlQoYXZucnVuWzBdKSwgTE9BRF9GUkFDKGF2bnJ1blswXSksCisJCUxPQURfSU5UKGF2bnJ1blsxXSksIExPQURfRlJBQyhhdm5ydW5bMV0pLAorCQlMT0FEX0lOVChhdm5ydW5bMl0pLCBMT0FEX0ZSQUMoYXZucnVuWzJdKSwKIAkJbnJfcnVubmluZygpLCBucl90aHJlYWRzLAogCQl0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCktPmxhc3RfcGlkKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCA5ZDFlNzZiLi42YzhjNTVkIDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC04MDUsMTIgKzgwNSw2IEBACiAJCWdvdG8gb3V0OwogCWlmICghKGluX2ZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQogCQlnb3RvIGZwdXRfaW47Ci0JcmV0dmFsID0gLUVJTlZBTDsKLQlpbl9pbm9kZSA9IGluX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JaWYgKCFpbl9pbm9kZSkKLQkJZ290byBmcHV0X2luOwotCWlmICghaW5fZmlsZS0+Zl9vcCB8fCAhaW5fZmlsZS0+Zl9vcC0+c3BsaWNlX3JlYWQpCi0JCWdvdG8gZnB1dF9pbjsKIAlyZXR2YWwgPSAtRVNQSVBFOwogCWlmICghcHBvcykKIAkJcHBvcyA9ICZpbl9maWxlLT5mX3BvczsKQEAgLTgzNCw2ICs4MjgsNyBAQAogCXJldHZhbCA9IC1FSU5WQUw7CiAJaWYgKCFvdXRfZmlsZS0+Zl9vcCB8fCAhb3V0X2ZpbGUtPmZfb3AtPnNlbmRwYWdlKQogCQlnb3RvIGZwdXRfb3V0OworCWluX2lub2RlID0gaW5fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlvdXRfaW5vZGUgPSBvdXRfZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAlyZXR2YWwgPSByd192ZXJpZnlfYXJlYShXUklURSwgb3V0X2ZpbGUsICZvdXRfZmlsZS0+Zl9wb3MsIGNvdW50KTsKIAlpZiAocmV0dmFsIDwgMCkKZGlmZiAtLWdpdCBhL2ZzL3NwbGljZS5jIGIvZnMvc3BsaWNlLmMKaW5kZXggNjY2OTUzZDUuLjczNzY2ZDIgMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC01MDcsOSArNTA3LDEzMSBAQAogCiAJcmV0dXJuIHJldDsKIH0KLQogRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQpOwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpcGVfYnVmX29wZXJhdGlvbnMgZGVmYXVsdF9waXBlX2J1Zl9vcHMgPSB7CisJLmNhbl9tZXJnZSA9IDAsCisJLm1hcCA9IGdlbmVyaWNfcGlwZV9idWZfbWFwLAorCS51bm1hcCA9IGdlbmVyaWNfcGlwZV9idWZfdW5tYXAsCisJLmNvbmZpcm0gPSBnZW5lcmljX3BpcGVfYnVmX2NvbmZpcm0sCisJLnJlbGVhc2UgPSBnZW5lcmljX3BpcGVfYnVmX3JlbGVhc2UsCisJLnN0ZWFsID0gZ2VuZXJpY19waXBlX2J1Zl9zdGVhbCwKKwkuZ2V0ID0gZ2VuZXJpY19waXBlX2J1Zl9nZXQsCit9OworCitzdGF0aWMgc3NpemVfdCBrZXJuZWxfcmVhZHYoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqdmVjLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgdmxlbiwgbG9mZl90IG9mZnNldCkKK3sKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWxvZmZfdCBwb3MgPSBvZmZzZXQ7CisJc3NpemVfdCByZXM7CisKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCS8qIFRoZSBjYXN0IHRvIGEgdXNlciBwb2ludGVyIGlzIHZhbGlkIGR1ZSB0byB0aGUgc2V0X2ZzKCkgKi8KKwlyZXMgPSB2ZnNfcmVhZHYoZmlsZSwgKGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKil2ZWMsIHZsZW4sICZwb3MpOworCXNldF9mcyhvbGRfZnMpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3Qga2VybmVsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgICBsb2ZmX3QgcG9zKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJc3NpemVfdCByZXM7CisKKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCS8qIFRoZSBjYXN0IHRvIGEgdXNlciBwb2ludGVyIGlzIHZhbGlkIGR1ZSB0byB0aGUgc2V0X2ZzKCkgKi8KKwlyZXMgPSB2ZnNfd3JpdGUoZmlsZSwgKGNvbnN0IGNoYXIgX191c2VyICopYnVmLCBjb3VudCwgJnBvcyk7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlyZXR1cm4gcmVzOworfQorCitzc2l6ZV90IGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqaW4sIGxvZmZfdCAqcHBvcywKKwkJCQkgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc2l6ZV90IGxlbiwKKwkJCQkgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXVuc2lnbmVkIGludCBucl9wYWdlczsKKwl1bnNpZ25lZCBpbnQgbnJfZnJlZWQ7CisJc2l6ZV90IG9mZnNldDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZXNbUElQRV9CVUZGRVJTXTsKKwlzdHJ1Y3QgcGFydGlhbF9wYWdlIHBhcnRpYWxbUElQRV9CVUZGRVJTXTsKKwlzdHJ1Y3QgaW92ZWMgdmVjW1BJUEVfQlVGRkVSU107CisJcGdvZmZfdCBpbmRleDsKKwlzc2l6ZV90IHJlczsKKwlzaXplX3QgdGhpc19sZW47CisJaW50IGVycm9yOworCWludCBpOworCXN0cnVjdCBzcGxpY2VfcGlwZV9kZXNjIHNwZCA9IHsKKwkJLnBhZ2VzID0gcGFnZXMsCisJCS5wYXJ0aWFsID0gcGFydGlhbCwKKwkJLmZsYWdzID0gZmxhZ3MsCisJCS5vcHMgPSAmZGVmYXVsdF9waXBlX2J1Zl9vcHMsCisJCS5zcGRfcmVsZWFzZSA9IHNwZF9yZWxlYXNlX3BhZ2UsCisJfTsKKworCWluZGV4ID0gKnBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlvZmZzZXQgPSAqcHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJbnJfcGFnZXMgPSAobGVuICsgb2Zmc2V0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlcyAmJiBpIDwgUElQRV9CVUZGRVJTICYmIGxlbjsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9VU0VSKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlpZiAoIXBhZ2UpCisJCQlnb3RvIGVycjsKKworCQl0aGlzX2xlbiA9IG1pbl90KHNpemVfdCwgbGVuLCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpOworCQl2ZWNbaV0uaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKikgcGFnZV9hZGRyZXNzKHBhZ2UpOworCQl2ZWNbaV0uaW92X2xlbiA9IHRoaXNfbGVuOworCQlwYWdlc1tpXSA9IHBhZ2U7CisJCXNwZC5ucl9wYWdlcysrOworCQlsZW4gLT0gdGhpc19sZW47CisJCW9mZnNldCA9IDA7CisJfQorCisJcmVzID0ga2VybmVsX3JlYWR2KGluLCB2ZWMsIHNwZC5ucl9wYWdlcywgKnBwb3MpOworCWlmIChyZXMgPCAwKSB7CisJCWVycm9yID0gcmVzOworCQlnb3RvIGVycjsKKwl9CisKKwllcnJvciA9IDA7CisJaWYgKCFyZXMpCisJCWdvdG8gZXJyOworCisJbnJfZnJlZWQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBzcGQubnJfcGFnZXM7IGkrKykgeworCQl0aGlzX2xlbiA9IG1pbl90KHNpemVfdCwgdmVjW2ldLmlvdl9sZW4sIHJlcyk7CisJCXBhcnRpYWxbaV0ub2Zmc2V0ID0gMDsKKwkJcGFydGlhbFtpXS5sZW4gPSB0aGlzX2xlbjsKKwkJaWYgKCF0aGlzX2xlbikgeworCQkJX19mcmVlX3BhZ2UocGFnZXNbaV0pOworCQkJcGFnZXNbaV0gPSBOVUxMOworCQkJbnJfZnJlZWQrKzsKKwkJfQorCQlyZXMgLT0gdGhpc19sZW47CisJfQorCXNwZC5ucl9wYWdlcyAtPSBucl9mcmVlZDsKKworCXJlcyA9IHNwbGljZV90b19waXBlKHBpcGUsICZzcGQpOworCWlmIChyZXMgPiAwKQorCQkqcHBvcyArPSByZXM7CisKKwlyZXR1cm4gcmVzOworCitlcnI6CisJZm9yIChpID0gMDsgaSA8IHNwZC5ucl9wYWdlczsgaSsrKQorCQlfX2ZyZWVfcGFnZShwYWdlc1tpXSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MKGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZCk7CisKIC8qCiAgKiBTZW5kICdzZC0+bGVuJyBieXRlcyB0byBzb2NrZXQgZnJvbSAnc2QtPmZpbGUnIGF0IHBvc2l0aW9uICdzZC0+cG9zJwogICogdXNpbmcgc2VuZHBhZ2UoKS4gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2VudC4KQEAgLTg4MSw2ICsxMDAzLDM2IEBACiAKIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX3NwbGljZV93cml0ZSk7CiAKK3N0YXRpYyBpbnQgd3JpdGVfcGlwZV9idWYoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IHBpcGVfYnVmZmVyICpidWYsCisJCQkgIHN0cnVjdCBzcGxpY2VfZGVzYyAqc2QpCit7CisJaW50IHJldDsKKwl2b2lkICpkYXRhOworCisJcmV0ID0gYnVmLT5vcHMtPmNvbmZpcm0ocGlwZSwgYnVmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZGF0YSA9IGJ1Zi0+b3BzLT5tYXAocGlwZSwgYnVmLCAwKTsKKwlyZXQgPSBrZXJuZWxfd3JpdGUoc2QtPnUuZmlsZSwgZGF0YSArIGJ1Zi0+b2Zmc2V0LCBzZC0+bGVuLCBzZC0+cG9zKTsKKwlidWYtPm9wcy0+dW5tYXAocGlwZSwgYnVmLCBkYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRlZmF1bHRfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkJIHN0cnVjdCBmaWxlICpvdXQsIGxvZmZfdCAqcHBvcywKKwkJCQkJIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzc2l6ZV90IHJldDsKKworCXJldCA9IHNwbGljZV9mcm9tX3BpcGUocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzLCB3cml0ZV9waXBlX2J1Zik7CisJaWYgKHJldCA+IDApCisJCSpwcG9zICs9IHJldDsKKworCXJldHVybiByZXQ7Cit9CisKIC8qKgogICogZ2VuZXJpY19zcGxpY2Vfc2VuZHBhZ2UgLSBzcGxpY2UgZGF0YSBmcm9tIGEgcGlwZSB0byBhIHNvY2tldAogICogQHBpcGU6CXBpcGUgdG8gc3BsaWNlIGZyb20KQEAgLTkwOCwxMSArMTA2MCwxMCBAQAogc3RhdGljIGxvbmcgZG9fc3BsaWNlX2Zyb20oc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwgc3RydWN0IGZpbGUgKm91dCwKIAkJCSAgIGxvZmZfdCAqcHBvcywgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQogeworCXNzaXplX3QgKCpzcGxpY2Vfd3JpdGUpKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc3RydWN0IGZpbGUgKiwKKwkJCQlsb2ZmX3QgKiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQpOwogCWludCByZXQ7CiAKLQlpZiAodW5saWtlbHkoIW91dC0+Zl9vcCB8fCAhb3V0LT5mX29wLT5zcGxpY2Vfd3JpdGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWlmICh1bmxpa2VseSghKG91dC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSkKIAkJcmV0dXJuIC1FQkFERjsKIApAQCAtOTIzLDcgKzEwNzQsMTEgQEAKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gb3V0LT5mX29wLT5zcGxpY2Vfd3JpdGUocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzKTsKKwlzcGxpY2Vfd3JpdGUgPSBvdXQtPmZfb3AtPnNwbGljZV93cml0ZTsKKwlpZiAoIXNwbGljZV93cml0ZSkKKwkJc3BsaWNlX3dyaXRlID0gZGVmYXVsdF9maWxlX3NwbGljZV93cml0ZTsKKworCXJldHVybiBzcGxpY2Vfd3JpdGUocGlwZSwgb3V0LCBwcG9zLCBsZW4sIGZsYWdzKTsKIH0KIAogLyoKQEAgLTkzMywxMSArMTA4OCwxMCBAQAogCQkJIHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHNpemVfdCBsZW4sCiAJCQkgdW5zaWduZWQgaW50IGZsYWdzKQogeworCXNzaXplX3QgKCpzcGxpY2VfcmVhZCkoc3RydWN0IGZpbGUgKiwgbG9mZl90ICosCisJCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CiAJaW50IHJldDsKIAotCWlmICh1bmxpa2VseSghaW4tPmZfb3AgfHwgIWluLT5mX29wLT5zcGxpY2VfcmVhZCkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKHVubGlrZWx5KCEoaW4tPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSkKIAkJcmV0dXJuIC1FQkFERjsKIApAQCAtOTQ1LDcgKzEwOTksMTEgQEAKIAlpZiAodW5saWtlbHkocmV0IDwgMCkpCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gaW4tPmZfb3AtPnNwbGljZV9yZWFkKGluLCBwcG9zLCBwaXBlLCBsZW4sIGZsYWdzKTsKKwlzcGxpY2VfcmVhZCA9IGluLT5mX29wLT5zcGxpY2VfcmVhZDsKKwlpZiAoIXNwbGljZV9yZWFkKQorCQlzcGxpY2VfcmVhZCA9IGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZDsKKworCXJldHVybiBzcGxpY2VfcmVhZChpbiwgcHBvcywgcGlwZSwgbGVuLCBmbGFncyk7CiB9CiAKIC8qKgpAQCAtMTExMiw2ICsxMjcwLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHNwbGljZV9waXBlX3RvX3BpcGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaXBpcGUsCisJCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqb3BpcGUsCisJCQkgICAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKTsKIC8qCiAgKiBBZnRlciB0aGUgaW5vZGUgc2xpbW1pbmcgcGF0Y2gsIGlfcGlwZS9pX2JkZXYvaV9jZGV2IHNoYXJlIHRoZSBzYW1lCiAgKiBsb2NhdGlvbiwgc28gY2hlY2tpbmcgLT5pX3BpcGUgaXMgbm90IGVub3VnaCB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEKQEAgLTExMzIsMTIgKzEyOTMsMzIgQEAKIAkJICAgICAgc3RydWN0IGZpbGUgKm91dCwgbG9mZl90IF9fdXNlciAqb2ZmX291dCwKIAkJICAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQogewotCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaXBpcGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqb3BpcGU7CiAJbG9mZl90IG9mZnNldCwgKm9mZjsKIAlsb25nIHJldDsKIAotCXBpcGUgPSBwaXBlX2luZm8oaW4tPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOwotCWlmIChwaXBlKSB7CisJaXBpcGUgPSBwaXBlX2luZm8oaW4tPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCW9waXBlID0gcGlwZV9pbmZvKG91dC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7CisKKwlpZiAoaXBpcGUgJiYgb3BpcGUpIHsKKwkJaWYgKG9mZl9pbiB8fCBvZmZfb3V0KQorCQkJcmV0dXJuIC1FU1BJUEU7CisKKwkJaWYgKCEoaW4tPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FQkFERjsKKworCQlpZiAoIShvdXQtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUJBREY7CisKKwkJLyogU3BsaWNpbmcgdG8gc2VsZiB3b3VsZCBiZSBmdW4sIGJ1dC4uLiAqLworCQlpZiAoaXBpcGUgPT0gb3BpcGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlyZXR1cm4gc3BsaWNlX3BpcGVfdG9fcGlwZShpcGlwZSwgb3BpcGUsIGxlbiwgZmxhZ3MpOworCX0KKworCWlmIChpcGlwZSkgewogCQlpZiAob2ZmX2luKQogCQkJcmV0dXJuIC1FU1BJUEU7CiAJCWlmIChvZmZfb3V0KSB7CkBAIC0xMTQ5LDcgKzEzMzAsNyBAQAogCQl9IGVsc2UKIAkJCW9mZiA9ICZvdXQtPmZfcG9zOwogCi0JCXJldCA9IGRvX3NwbGljZV9mcm9tKHBpcGUsIG91dCwgb2ZmLCBsZW4sIGZsYWdzKTsKKwkJcmV0ID0gZG9fc3BsaWNlX2Zyb20oaXBpcGUsIG91dCwgb2ZmLCBsZW4sIGZsYWdzKTsKIAogCQlpZiAob2ZmX291dCAmJiBjb3B5X3RvX3VzZXIob2ZmX291dCwgb2ZmLCBzaXplb2YobG9mZl90KSkpCiAJCQlyZXQgPSAtRUZBVUxUOwpAQCAtMTE1Nyw4ICsxMzM4LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlwaXBlID0gcGlwZV9pbmZvKG91dC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZSk7Ci0JaWYgKHBpcGUpIHsKKwlpZiAob3BpcGUpIHsKIAkJaWYgKG9mZl9vdXQpCiAJCQlyZXR1cm4gLUVTUElQRTsKIAkJaWYgKG9mZl9pbikgewpAQCAtMTE3MCw3ICsxMzUwLDcgQEAKIAkJfSBlbHNlCiAJCQlvZmYgPSAmaW4tPmZfcG9zOwogCi0JCXJldCA9IGRvX3NwbGljZV90byhpbiwgb2ZmLCBwaXBlLCBsZW4sIGZsYWdzKTsKKwkJcmV0ID0gZG9fc3BsaWNlX3RvKGluLCBvZmYsIG9waXBlLCBsZW4sIGZsYWdzKTsKIAogCQlpZiAob2ZmX2luICYmIGNvcHlfdG9fdXNlcihvZmZfaW4sIG9mZiwgc2l6ZW9mKGxvZmZfdCkpKQogCQkJcmV0ID0gLUVGQVVMVDsKQEAgLTE1MTEsNyArMTY5MSw3IEBACiAgKiBNYWtlIHN1cmUgdGhlcmUncyBkYXRhIHRvIHJlYWQuIFdhaXQgZm9yIGlucHV0IGlmIHdlIGNhbiwgb3RoZXJ3aXNlCiAgKiByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXJyb3IuCiAgKi8KLXN0YXRpYyBpbnQgbGlua19pcGlwZV9wcmVwKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHVuc2lnbmVkIGludCBmbGFncykKK3N0YXRpYyBpbnQgaXBpcGVfcHJlcChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJaW50IHJldDsKIApAQCAtMTU0OSw3ICsxNzI5LDcgQEAKICAqIE1ha2Ugc3VyZSB0aGVyZSdzIHdyaXRlYWJsZSByb29tLiBXYWl0IGZvciByb29tIGlmIHdlIGNhbiwgb3RoZXJ3aXNlCiAgKiByZXR1cm4gYW4gYXBwcm9wcmlhdGUgZXJyb3IuCiAgKi8KLXN0YXRpYyBpbnQgbGlua19vcGlwZV9wcmVwKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsIHVuc2lnbmVkIGludCBmbGFncykKK3N0YXRpYyBpbnQgb3BpcGVfcHJlcChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJaW50IHJldDsKIApAQCAtMTU4Nyw2ICsxNzY3LDEyNCBAQAogfQogCiAvKgorICogU3BsaWNlIGNvbnRlbnRzIG9mIGlwaXBlIHRvIG9waXBlLgorICovCitzdGF0aWMgaW50IHNwbGljZV9waXBlX3RvX3BpcGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaXBpcGUsCisJCQkgICAgICAgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqb3BpcGUsCisJCQkgICAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBwaXBlX2J1ZmZlciAqaWJ1ZiwgKm9idWY7CisJaW50IHJldCA9IDAsIG5idWY7CisJYm9vbCBpbnB1dF93YWtldXAgPSBmYWxzZTsKKworCityZXRyeToKKwlyZXQgPSBpcGlwZV9wcmVwKGlwaXBlLCBmbGFncyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IG9waXBlX3ByZXAob3BpcGUsIGZsYWdzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBQb3RlbnRpYWwgQUJCQSBkZWFkbG9jaywgd29yayBhcm91bmQgaXQgYnkgb3JkZXJpbmcgbG9jaworCSAqIGdyYWJiaW5nIGJ5IHBpcGUgaW5mbyBhZGRyZXNzLiBPdGhlcndpc2UgdHdvIGRpZmZlcmVudCBwcm9jZXNzZXMKKwkgKiBjb3VsZCBkZWFkbG9jayAob25lIGRvaW5nIHRlZSBmcm9tIEEgLT4gQiwgdGhlIG90aGVyIGZyb20gQiAtPiBBKS4KKwkgKi8KKwlwaXBlX2RvdWJsZV9sb2NrKGlwaXBlLCBvcGlwZSk7CisKKwlkbyB7CisJCWlmICghb3BpcGUtPnJlYWRlcnMpIHsKKwkJCXNlbmRfc2lnKFNJR1BJUEUsIGN1cnJlbnQsIDApOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVQSVBFOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWlwaXBlLT5ucmJ1ZnMgJiYgIWlwaXBlLT53cml0ZXJzKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogQ2Fubm90IG1ha2UgYW55IHByb2dyZXNzLCBiZWNhdXNlIGVpdGhlciB0aGUgaW5wdXQKKwkJICogcGlwZSBpcyBlbXB0eSBvciB0aGUgb3V0cHV0IHBpcGUgaXMgZnVsbC4KKwkJICovCisJCWlmICghaXBpcGUtPm5yYnVmcyB8fCBvcGlwZS0+bnJidWZzID49IFBJUEVfQlVGRkVSUykgeworCQkJLyogQWxyZWFkeSBwcm9jZXNzZWQgc29tZSBidWZmZXJzLCBicmVhayAqLworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKworCQkJaWYgKGZsYWdzICYgU1BMSUNFX0ZfTk9OQkxPQ0spIHsKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogV2UgcmFjZWQgd2l0aCBhbm90aGVyIHJlYWRlci93cml0ZXIgYW5kIGhhdmVuJ3QKKwkJCSAqIG1hbmFnZWQgdG8gcHJvY2VzcyBhbnkgYnVmZmVycy4gIEEgemVybyByZXR1cm4KKwkJCSAqIHZhbHVlIG1lYW5zIEVPRiwgc28gcmV0cnkgaW5zdGVhZC4KKwkJCSAqLworCQkJcGlwZV91bmxvY2soaXBpcGUpOworCQkJcGlwZV91bmxvY2sob3BpcGUpOworCQkJZ290byByZXRyeTsKKwkJfQorCisJCWlidWYgPSBpcGlwZS0+YnVmcyArIGlwaXBlLT5jdXJidWY7CisJCW5idWYgPSAob3BpcGUtPmN1cmJ1ZiArIG9waXBlLT5ucmJ1ZnMpICUgUElQRV9CVUZGRVJTOworCQlvYnVmID0gb3BpcGUtPmJ1ZnMgKyBuYnVmOworCisJCWlmIChsZW4gPj0gaWJ1Zi0+bGVuKSB7CisJCQkvKgorCQkJICogU2ltcGx5IG1vdmUgdGhlIHdob2xlIGJ1ZmZlciBmcm9tIGlwaXBlIHRvIG9waXBlCisJCQkgKi8KKwkJCSpvYnVmID0gKmlidWY7CisJCQlpYnVmLT5vcHMgPSBOVUxMOworCQkJb3BpcGUtPm5yYnVmcysrOworCQkJaXBpcGUtPmN1cmJ1ZiA9IChpcGlwZS0+Y3VyYnVmICsgMSkgJSBQSVBFX0JVRkZFUlM7CisJCQlpcGlwZS0+bnJidWZzLS07CisJCQlpbnB1dF93YWtldXAgPSB0cnVlOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGlzIHBpcGUgYnVmZmVyLAorCQkJICogc28gd2UgY2FuIGNvcHkgdGhlIGNvbnRlbnRzIG92ZXIuCisJCQkgKi8KKwkJCWlidWYtPm9wcy0+Z2V0KGlwaXBlLCBpYnVmKTsKKwkJCSpvYnVmID0gKmlidWY7CisKKwkJCS8qCisJCQkgKiBEb24ndCBpbmhlcml0IHRoZSBnaWZ0IGZsYWcsIHdlIG5lZWQgdG8KKwkJCSAqIHByZXZlbnQgbXVsdGlwbGUgc3RlYWxzIG9mIHRoaXMgcGFnZS4KKwkJCSAqLworCQkJb2J1Zi0+ZmxhZ3MgJj0gflBJUEVfQlVGX0ZMQUdfR0lGVDsKKworCQkJb2J1Zi0+bGVuID0gbGVuOworCQkJb3BpcGUtPm5yYnVmcysrOworCQkJaWJ1Zi0+b2Zmc2V0ICs9IG9idWYtPmxlbjsKKwkJCWlidWYtPmxlbiAtPSBvYnVmLT5sZW47CisJCX0KKwkJcmV0ICs9IG9idWYtPmxlbjsKKwkJbGVuIC09IG9idWYtPmxlbjsKKwl9IHdoaWxlIChsZW4pOworCisJcGlwZV91bmxvY2soaXBpcGUpOworCXBpcGVfdW5sb2NrKG9waXBlKTsKKworCS8qCisJICogSWYgd2UgcHV0IGRhdGEgaW4gdGhlIG91dHB1dCBwaXBlLCB3YWtldXAgYW55IHBvdGVudGlhbCByZWFkZXJzLgorCSAqLworCWlmIChyZXQgPiAwKSB7CisJCXNtcF9tYigpOworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmb3BpcGUtPndhaXQpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZvcGlwZS0+d2FpdCk7CisJCWtpbGxfZmFzeW5jKCZvcGlwZS0+ZmFzeW5jX3JlYWRlcnMsIFNJR0lPLCBQT0xMX0lOKTsKKwl9CisJaWYgKGlucHV0X3dha2V1cCkKKwkJd2FrZXVwX3BpcGVfd3JpdGVycyhpcGlwZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogTGluayBjb250ZW50cyBvZiBpcGlwZSB0byBvcGlwZS4KICAqLwogc3RhdGljIGludCBsaW5rX3BpcGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaXBpcGUsCkBAIC0xNjkwLDkgKzE5ODgsOSBAQAogCQkgKiBLZWVwIGdvaW5nLCB1bmxlc3Mgd2UgZW5jb3VudGVyIGFuIGVycm9yLiBUaGUgaXBpcGUvb3BpcGUKIAkJICogb3JkZXJpbmcgZG9lc24ndCByZWFsbHkgbWF0dGVyLgogCQkgKi8KLQkJcmV0ID0gbGlua19pcGlwZV9wcmVwKGlwaXBlLCBmbGFncyk7CisJCXJldCA9IGlwaXBlX3ByZXAoaXBpcGUsIGZsYWdzKTsKIAkJaWYgKCFyZXQpIHsKLQkJCXJldCA9IGxpbmtfb3BpcGVfcHJlcChvcGlwZSwgZmxhZ3MpOworCQkJcmV0ID0gb3BpcGVfcHJlcChvcGlwZSwgZmxhZ3MpOwogCQkJaWYgKCFyZXQpCiAJCQkJcmV0ID0gbGlua19waXBlKGlwaXBlLCBvcGlwZSwgbGVuLCBmbGFncyk7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL3VkZi9zdXBlci5jIGIvZnMvdWRmL3N1cGVyLmMKaW5kZXggNzIzNDhjYy4uMGJhNDQxMCAxMDA2NDQKLS0tIGEvZnMvdWRmL3N1cGVyLmMKKysrIGIvZnMvdWRmL3N1cGVyLmMKQEAgLTE5MTUsNyArMTkxNSw3IEBACiAJaWYgKHVvcHQuZmxhZ3MgJiAoMSA8PCBVREZfRkxBR19CTE9DS1NJWkVfU0VUKSkgewogCQlyZXQgPSB1ZGZfbG9hZF92cnMoc2IsICZ1b3B0LCBzaWxlbnQsICZmaWxlc2V0KTsKIAl9IGVsc2UgewotCQl1b3B0LmJsb2Nrc2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KTsKKwkJdW9wdC5ibG9ja3NpemUgPSBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShzYi0+c19iZGV2KTsKIAkJcmV0ID0gdWRmX2xvYWRfdnJzKHNiLCAmdW9wdCwgc2lsZW50LCAmZmlsZXNldCk7CiAJCWlmICghcmV0ICYmIHVvcHQuYmxvY2tzaXplICE9IFVERl9ERUZBVUxUX0JMT0NLU0laRSkgewogCQkJaWYgKCFzaWxlbnQpCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCmluZGV4IGUyODgwMGEuLjE0MThiOTEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCkBAIC0xNTAxLDcgKzE1MDEsNyBAQAogCXN0cnVjdCBibG9ja19kZXZpY2UJKmJkZXYpCiB7CiAJcmV0dXJuIHhmc19zZXRzaXplX2J1ZnRhcmdfZmxhZ3MoYnRwLAotCQkJUEFHRV9DQUNIRV9TSVpFLCBiZGV2X2hhcmRzZWN0X3NpemUoYmRldiksIDApOworCQkJUEFHRV9DQUNIRV9TSVpFLCBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShiZGV2KSwgMCk7CiB9CiAKIGludApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9LYnVpbGQgYi9pbmNsdWRlL0tidWlsZAppbmRleCBkOGMzZTNjLi5mZTM2YWNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL0tidWlsZAorKysgYi9pbmNsdWRlL0tidWlsZApAQCAtOCwzICs4LDQgQEAKIGhlYWRlci15ICs9IHJkbWEvCiBoZWFkZXIteSArPSB2aWRlby8KIGhlYWRlci15ICs9IGRybS8KK2hlYWRlci15ICs9IHhlbi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYXRvbWljLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2F0b21pYy5oCmluZGV4IDM2NzNhMTMuLjgxZDNiZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdG9taWMuaApAQCAtMTM0LDcgKzEzNCw3IEBACiAjZGVmaW5lIGF0b21pY19sb25nX2NtcHhjaGcobCwgb2xkLCBuZXcpIFwKIAkoYXRvbWljNjRfY21weGNoZygoYXRvbWljNjRfdCAqKShsKSwgKG9sZCksIChuZXcpKSkKICNkZWZpbmUgYXRvbWljX2xvbmdfeGNoZyh2LCBuZXcpIFwKLQkoYXRvbWljNjRfeGNoZygoYXRvbWljNjRfdCAqKShsKSwgKG5ldykpKQorCShhdG9taWM2NF94Y2hnKChhdG9taWM2NF90ICopKHYpLCAobmV3KSkpCiAKICNlbHNlICAvKiAgQklUU19QRVJfTE9ORyA9PSA2NCAgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAppbmRleCA4ZTZkMGNhLi5lNDEwZjYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApAQCAtMjgwLDE3ICsyODAsMTggQEAKICNlbmRpZgogCiAvKgotICogQSBmYWNpbGl0eSB0byBwcm92aWRlIGJhdGNoaW5nIG9mIHRoZSByZWxvYWQgb2YgcGFnZSB0YWJsZXMgd2l0aCB0aGUKLSAqIGFjdHVhbCBjb250ZXh0IHN3aXRjaCBjb2RlIGZvciBwYXJhdmlydHVhbGl6ZWQgZ3Vlc3RzLiAgQnkgY29udmVudGlvbiwKLSAqIG9ubHkgb25lIG9mIHRoZSBsYXp5IG1vZGVzIChDUFUsIE1NVSkgc2hvdWxkIGJlIGFjdGl2ZSBhdCBhbnkgZ2l2ZW4KLSAqIHRpbWUsIGVudHJ5IHNob3VsZCBuZXZlciBiZSBuZXN0ZWQsIGFuZCBlbnRyeSBhbmQgZXhpdHMgc2hvdWxkIGFsd2F5cwotICogYmUgcGFpcmVkLiAgVGhpcyBpcyBmb3Igc2FuaXR5IG9mIG1haW50YWluaW5nIGFuZCByZWFzb25pbmcgYWJvdXQgdGhlCi0gKiBrZXJuZWwgY29kZS4KKyAqIEEgZmFjaWxpdHkgdG8gcHJvdmlkZSBiYXRjaGluZyBvZiB0aGUgcmVsb2FkIG9mIHBhZ2UgdGFibGVzIGFuZAorICogb3RoZXIgcHJvY2VzcyBzdGF0ZSB3aXRoIHRoZSBhY3R1YWwgY29udGV4dCBzd2l0Y2ggY29kZSBmb3IKKyAqIHBhcmF2aXJ0dWFsaXplZCBndWVzdHMuICBCeSBjb252ZW50aW9uLCBvbmx5IG9uZSBvZiB0aGUgYmF0Y2hlZAorICogdXBkYXRlIChsYXp5KSBtb2RlcyAoQ1BVLCBNTVUpIHNob3VsZCBiZSBhY3RpdmUgYXQgYW55IGdpdmVuIHRpbWUsCisgKiBlbnRyeSBzaG91bGQgbmV2ZXIgYmUgbmVzdGVkLCBhbmQgZW50cnkgYW5kIGV4aXRzIHNob3VsZCBhbHdheXMgYmUKKyAqIHBhaXJlZC4gIFRoaXMgaXMgZm9yIHNhbml0eSBvZiBtYWludGFpbmluZyBhbmQgcmVhc29uaW5nIGFib3V0IHRoZQorICoga2VybmVsIGNvZGUuICBJbiB0aGlzIGNhc2UsIHRoZSBleGl0IChlbmQgb2YgdGhlIGNvbnRleHQgc3dpdGNoKSBpcworICogaW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGNvZGUsIGFuZCBzbyBkb2Vzbid0IG5lZWQgYSBnZW5lcmljCisgKiBkZWZpbml0aW9uLgogICovCi0jaWZuZGVmIF9fSEFWRV9BUkNIX0VOVEVSX0xBWllfQ1BVX01PREUKLSNkZWZpbmUgYXJjaF9lbnRlcl9sYXp5X2NwdV9tb2RlKCkJZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIGFyY2hfbGVhdmVfbGF6eV9jcHVfbW9kZSgpCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBhcmNoX2ZsdXNoX2xhenlfY3B1X21vZGUoKQlkbyB7fSB3aGlsZSAoMCkKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RBUlRfQ09OVEVYVF9TV0lUQ0gKKyNkZWZpbmUgYXJjaF9zdGFydF9jb250ZXh0X3N3aXRjaChwcmV2KQlkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCiAjaWZuZGVmIF9fSEFWRV9QRk5NQVBfVFJBQ0tJTkcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAppbmRleCA4OTg1M2JjLi5mMTczNmNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCkBAIC02Myw3ICs2Myw3IEBACiAjZGVmaW5lIEJSQU5DSF9QUk9GSUxFKCkKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0VWRU5UX1RSQUNFUgorI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCiAjZGVmaW5lIEZUUkFDRV9FVkVOVFMoKQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X2Z0cmFjZV9ldmVudHMpID0gLjsJXAogCQkJKihfZnRyYWNlX2V2ZW50cykJCQkJXAogCQkJVk1MSU5VWF9TWU1CT0woX19zdG9wX2Z0cmFjZV9ldmVudHMpID0gLjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggODhiZTg5MC4uNTFiNGIwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTExOSw3ICsxMTksNyBAQAogZXh0ZXJuIGludCBzYmZfcG9ydDsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFjcGlfcmVhbG1vZGVfZmxhZ3M7CiAKLWludCBhY3BpX3JlZ2lzdGVyX2dzaSAodTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSk7CitpbnQgYWNwaV9yZWdpc3Rlcl9nc2kgKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSk7CiBpbnQgYWNwaV9nc2lfdG9faXJxICh1MzIgZ3NpLCB1bnNpZ25lZCBpbnQgKmlycSk7CiAKICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmlvLmggYi9pbmNsdWRlL2xpbnV4L2Jpby5oCmluZGV4IDdiMjE0ZmQuLjEyNzM3YmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaW8uaApAQCAtMjE4LDEyICsyMTgsMTIgQEAKICNkZWZpbmUgYmlvX3NlY3RvcnMoYmlvKQkoKGJpbyktPmJpX3NpemUgPj4gOSkKICNkZWZpbmUgYmlvX2VtcHR5X2JhcnJpZXIoYmlvKQkoYmlvX2JhcnJpZXIoYmlvKSAmJiAhYmlvX2hhc19kYXRhKGJpbykgJiYgIWJpb19kaXNjYXJkKGJpbykpCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJpb19jdXJfc2VjdG9ycyhzdHJ1Y3QgYmlvICpiaW8pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiaW9fY3VyX2J5dGVzKHN0cnVjdCBiaW8gKmJpbykKIHsKIAlpZiAoYmlvLT5iaV92Y250KQotCQlyZXR1cm4gYmlvX2lvdmVjKGJpbyktPmJ2X2xlbiA+PiA5OworCQlyZXR1cm4gYmlvX2lvdmVjKGJpbyktPmJ2X2xlbjsKIAllbHNlIC8qIGRhdGFsZXNzIHJlcXVlc3RzIHN1Y2ggYXMgZGlzY2FyZCAqLwotCQlyZXR1cm4gYmlvLT5iaV9zaXplID4+IDk7CisJCXJldHVybiBiaW8tPmJpX3NpemU7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqYmlvX2RhdGEoc3RydWN0IGJpbyAqYmlvKQpAQCAtMjc5LDcgKzI3OSw3IEBACiAjZGVmaW5lIF9fQklPX1NFR19CT1VOREFSWShhZGRyMSwgYWRkcjIsIG1hc2spIFwKIAkoKChhZGRyMSkgfCAobWFzaykpID09ICgoKGFkZHIyKSAtIDEpIHwgKG1hc2spKSkKICNkZWZpbmUgQklPVkVDX1NFR19CT1VOREFSWShxLCBiMSwgYjIpIFwKLQlfX0JJT19TRUdfQk9VTkRBUlkoYnZlY190b19waHlzKChiMSkpLCBidmVjX3RvX3BoeXMoKGIyKSkgKyAoYjIpLT5idl9sZW4sIChxKS0+c2VnX2JvdW5kYXJ5X21hc2spCisJX19CSU9fU0VHX0JPVU5EQVJZKGJ2ZWNfdG9fcGh5cygoYjEpKSwgYnZlY190b19waHlzKChiMikpICsgKGIyKS0+YnZfbGVuLCBxdWV1ZV9zZWdtZW50X2JvdW5kYXJ5KChxKSkpCiAjZGVmaW5lIEJJT19TRUdfQk9VTkRBUlkocSwgYjEsIGIyKSBcCiAJQklPVkVDX1NFR19CT1VOREFSWSgocSksIF9fQlZFQ19FTkQoKGIxKSksIF9fQlZFQ19TVEFSVCgoYjIpKSkKIApAQCAtNTA2LDcgKzUwNiw3IEBACiB9CiAKIC8qCi0gKiBCSU8gbGlzdCBtYW5hZ21lbnQgZm9yIHVzZSBieSByZW1hcHBpbmcgZHJpdmVycyAoZS5nLiBETSBvciBNRCkuCisgKiBCSU8gbGlzdCBtYW5hZ2VtZW50IGZvciB1c2UgYnkgcmVtYXBwaW5nIGRyaXZlcnMgKGUuZy4gRE0gb3IgTUQpIGFuZCBsb29wLgogICoKICAqIEEgYmlvX2xpc3QgYW5jaG9ycyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBiaW9zIGNoYWluZWQgdGhyb3VnaCB0aGUgYmlfbmV4dAogICogbWVtYmVyIG9mIHRoZSBiaW8uICBUaGUgYmlvX2xpc3QgYWxzbyBjYWNoZXMgdGhlIGxhc3QgbGlzdCBtZW1iZXIgdG8gYWxsb3cKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmggYi9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCmluZGV4IGI0ZjcxZjEuLmViZGZkZTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaApAQCAtMTY2LDE5ICsxNjYsOSBAQAogCWVudW0gcnFfY21kX3R5cGVfYml0cyBjbWRfdHlwZTsKIAl1bnNpZ25lZCBsb25nIGF0b21pY19mbGFnczsKIAotCS8qIE1haW50YWluIGJpbyB0cmF2ZXJzYWwgc3RhdGUgZm9yIHBhcnQgYnkgcGFydCBJL08gc3VibWlzc2lvbi4KLQkgKiBoYXJkXyogYXJlIGJsb2NrIGxheWVyIGludGVybmFscywgbm8gZHJpdmVyIHNob3VsZCB0b3VjaCB0aGVtIQotCSAqLwotCi0Jc2VjdG9yX3Qgc2VjdG9yOwkJLyogbmV4dCBzZWN0b3IgdG8gc3VibWl0ICovCi0Jc2VjdG9yX3QgaGFyZF9zZWN0b3I7CQkvKiBuZXh0IHNlY3RvciB0byBjb21wbGV0ZSAqLwotCXVuc2lnbmVkIGxvbmcgbnJfc2VjdG9yczsJLyogbm8uIG9mIHNlY3RvcnMgbGVmdCB0byBzdWJtaXQgKi8KLQl1bnNpZ25lZCBsb25nIGhhcmRfbnJfc2VjdG9yczsJLyogbm8uIG9mIHNlY3RvcnMgbGVmdCB0byBjb21wbGV0ZSAqLwotCS8qIG5vLiBvZiBzZWN0b3JzIGxlZnQgdG8gc3VibWl0IGluIHRoZSBjdXJyZW50IHNlZ21lbnQgKi8KLQl1bnNpZ25lZCBpbnQgY3VycmVudF9ucl9zZWN0b3JzOwotCi0JLyogbm8uIG9mIHNlY3RvcnMgbGVmdCB0byBjb21wbGV0ZSBpbiB0aGUgY3VycmVudCBzZWdtZW50ICovCi0JdW5zaWduZWQgaW50IGhhcmRfY3VyX3NlY3RvcnM7CisJLyogdGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGFyZSBpbnRlcm5hbCwgTkVWRVIgYWNjZXNzIGRpcmVjdGx5ICovCisJc2VjdG9yX3QgX19zZWN0b3I7CQkvKiBzZWN0b3IgY3Vyc29yICovCisJdW5zaWduZWQgaW50IF9fZGF0YV9sZW47CS8qIHRvdGFsIGRhdGEgbGVuICovCiAKIAlzdHJ1Y3QgYmlvICpiaW87CiAJc3RydWN0IGJpbyAqYmlvdGFpbDsKQEAgLTIxMSw4ICsyMDEsOCBAQAogCiAJdW5zaWduZWQgc2hvcnQgaW9wcmlvOwogCi0Jdm9pZCAqc3BlY2lhbDsKLQljaGFyICpidWZmZXI7CisJdm9pZCAqc3BlY2lhbDsJCS8qIG9wYXF1ZSBwb2ludGVyIGF2YWlsYWJsZSBmb3IgTExEIHVzZSAqLworCWNoYXIgKmJ1ZmZlcjsJCS8qIGthZGRyIG9mIHRoZSBjdXJyZW50IHNlZ21lbnQgaWYgYXZhaWxhYmxlICovCiAKIAlpbnQgdGFnOwogCWludCBlcnJvcnM7CkBAIC0yMjYsMTAgKzIxNiw5IEBACiAJdW5zaWduZWQgY2hhciBfX2NtZFtCTEtfTUFYX0NEQl07CiAJdW5zaWduZWQgY2hhciAqY21kOwogCi0JdW5zaWduZWQgaW50IGRhdGFfbGVuOwogCXVuc2lnbmVkIGludCBleHRyYV9sZW47CS8qIGxlbmd0aCBvZiBhbGlnbm1lbnQgYW5kIHBhZGRpbmcgKi8KIAl1bnNpZ25lZCBpbnQgc2Vuc2VfbGVuOwotCXZvaWQgKmRhdGE7CisJdW5zaWduZWQgaW50IHJlc2lkX2xlbjsJLyogcmVzaWR1YWwgY291bnQgKi8KIAl2b2lkICpzZW5zZTsKIAogCXVuc2lnbmVkIGxvbmcgZGVhZGxpbmU7CkBAIC0zMTgsNiArMzA3LDI2IEBACiAJc3RydWN0IGtvYmplY3Qga29iajsKIH07CiAKK3N0cnVjdCBxdWV1ZV9saW1pdHMgeworCXVuc2lnbmVkIGxvbmcJCWJvdW5jZV9wZm47CisJdW5zaWduZWQgbG9uZwkJc2VnX2JvdW5kYXJ5X21hc2s7CisKKwl1bnNpZ25lZCBpbnQJCW1heF9od19zZWN0b3JzOworCXVuc2lnbmVkIGludAkJbWF4X3NlY3RvcnM7CisJdW5zaWduZWQgaW50CQltYXhfc2VnbWVudF9zaXplOworCXVuc2lnbmVkIGludAkJcGh5c2ljYWxfYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCWFsaWdubWVudF9vZmZzZXQ7CisJdW5zaWduZWQgaW50CQlpb19taW47CisJdW5zaWduZWQgaW50CQlpb19vcHQ7CisKKwl1bnNpZ25lZCBzaG9ydAkJbG9naWNhbF9ibG9ja19zaXplOworCXVuc2lnbmVkIHNob3J0CQltYXhfaHdfc2VnbWVudHM7CisJdW5zaWduZWQgc2hvcnQJCW1heF9waHlzX3NlZ21lbnRzOworCisJdW5zaWduZWQgY2hhcgkJbWlzYWxpZ25lZDsKKwl1bnNpZ25lZCBjaGFyCQlub19jbHVzdGVyOworfTsKKwogc3RydWN0IHJlcXVlc3RfcXVldWUKIHsKIAkvKgpAQCAtMzY5LDcgKzM3OCw2IEBACiAJLyoKIAkgKiBxdWV1ZSBuZWVkcyBib3VuY2UgcGFnZXMgZm9yIHBhZ2VzIGFib3ZlIHRoaXMgbGltaXQKIAkgKi8KLQl1bnNpZ25lZCBsb25nCQlib3VuY2VfcGZuOwogCWdmcF90CQkJYm91bmNlX2dmcDsKIAogCS8qCkBAIC0zOTgsMTQgKzQwNiw2IEBACiAJdW5zaWduZWQgaW50CQlucl9jb25nZXN0aW9uX29mZjsKIAl1bnNpZ25lZCBpbnQJCW5yX2JhdGNoaW5nOwogCi0JdW5zaWduZWQgaW50CQltYXhfc2VjdG9yczsKLQl1bnNpZ25lZCBpbnQJCW1heF9od19zZWN0b3JzOwotCXVuc2lnbmVkIHNob3J0CQltYXhfcGh5c19zZWdtZW50czsKLQl1bnNpZ25lZCBzaG9ydAkJbWF4X2h3X3NlZ21lbnRzOwotCXVuc2lnbmVkIHNob3J0CQloYXJkc2VjdF9zaXplOwotCXVuc2lnbmVkIGludAkJbWF4X3NlZ21lbnRfc2l6ZTsKLQotCXVuc2lnbmVkIGxvbmcJCXNlZ19ib3VuZGFyeV9tYXNrOwogCXZvaWQJCQkqZG1hX2RyYWluX2J1ZmZlcjsKIAl1bnNpZ25lZCBpbnQJCWRtYV9kcmFpbl9zaXplOwogCXVuc2lnbmVkIGludAkJZG1hX3BhZF9tYXNrOwpAQCAtNDE1LDEyICs0MTUsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXRhZ19idXN5X2xpc3Q7CiAKIAl1bnNpZ25lZCBpbnQJCW5yX3NvcnRlZDsKLQl1bnNpZ25lZCBpbnQJCWluX2ZsaWdodDsKKwl1bnNpZ25lZCBpbnQJCWluX2ZsaWdodFsyXTsKIAogCXVuc2lnbmVkIGludAkJcnFfdGltZW91dDsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lb3V0OwogCXN0cnVjdCBsaXN0X2hlYWQJdGltZW91dF9saXN0OwogCisJc3RydWN0IHF1ZXVlX2xpbWl0cwlsaW1pdHM7CisKIAkvKgogCSAqIHNnIHN0dWZmCiAJICovCkBAIC01MjIsNiArNTI0LDExIEBACiAJX19jbGVhcl9iaXQoZmxhZywgJnEtPnF1ZXVlX2ZsYWdzKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcXVldWVfaW5fZmxpZ2h0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXJldHVybiBxLT5pbl9mbGlnaHRbMF0gKyBxLT5pbl9mbGlnaHRbMV07Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBxdWV1ZV9mbGFnX2NsZWFyKHVuc2lnbmVkIGludCBmbGFnLCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKIHsKIAlXQVJOX09OX09OQ0UoIXF1ZXVlX2lzX2xvY2tlZChxKSk7CkBAIC03NTIsMTAgKzc1OSwxNyBAQAogZXh0ZXJuIHZvaWQgYmxrX3B1dF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICopOwogZXh0ZXJuIHZvaWQgX19ibGtfcHV0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gc3RydWN0IHJlcXVlc3QgKmJsa19nZXRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBpbnQsIGdmcF90KTsKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqYmxrX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgYmlvICosCisJCQkJCWdmcF90KTsKIGV4dGVybiB2b2lkIGJsa19pbnNlcnRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQsIHZvaWQgKik7CiBleHRlcm4gdm9pZCBibGtfcmVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogZXh0ZXJuIGludCBibGtfcnFfY2hlY2tfbGltaXRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpOwogZXh0ZXJuIGludCBibGtfbGxkX2J1c3koc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworZXh0ZXJuIGludCBibGtfcnFfcHJlcF9jbG9uZShzdHJ1Y3QgcmVxdWVzdCAqcnEsIHN0cnVjdCByZXF1ZXN0ICpycV9zcmMsCisJCQkgICAgIHN0cnVjdCBiaW9fc2V0ICpicywgZ2ZwX3QgZ2ZwX21hc2ssCisJCQkgICAgIGludCAoKmJpb19jdHIpKHN0cnVjdCBiaW8gKiwgc3RydWN0IGJpbyAqLCB2b2lkICopLAorCQkJICAgICB2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIGJsa19ycV91bnByZXBfY2xvbmUoc3RydWN0IHJlcXVlc3QgKnJxKTsKIGV4dGVybiBpbnQgYmxrX2luc2VydF9jbG9uZWRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJCQkgICAgIHN0cnVjdCByZXF1ZXN0ICpycSk7CiBleHRlcm4gdm9pZCBibGtfcGx1Z19kZXZpY2Uoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CkBAIC03NjgsMTIgKzc4Miw2IEBACiAJCQkgc3RydWN0IHNjc2lfaW9jdGxfY29tbWFuZCBfX3VzZXIgKik7CiAKIC8qCi0gKiBUZW1wb3JhcnkgZXhwb3J0LCB1bnRpbCBTQ1NJIGdldHMgZml4ZWQgdXAuCi0gKi8KLWV4dGVybiBpbnQgYmxrX3JxX2FwcGVuZF9iaW8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSwKLQkJCSAgICAgc3RydWN0IGJpbyAqYmlvKTsKLQotLyoKICAqIEEgcXVldWUgaGFzIGp1c3QgZXhpdHRlZCBjb25nZXN0aW9uLiAgTm90ZSB0aGlzIGluIHRoZSBnbG9iYWwgY291bnRlciBvZgogICogY29uZ2VzdGVkIHF1ZXVlcywgYW5kIHdha2UgdXAgYW55b25lIHdobyB3YXMgd2FpdGluZyBmb3IgcmVxdWVzdHMgdG8gYmUKICAqIHB1dCBiYWNrLgpAQCAtNzk4LDcgKzgwNiw2IEBACiBleHRlcm4gdm9pZCBfX2Jsa19zdG9wX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKIGV4dGVybiB2b2lkIF9fYmxrX3J1bl9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKIGV4dGVybiB2b2lkIGJsa19ydW5fcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7Ci1leHRlcm4gdm9pZCBibGtfc3RhcnRfcXVldWVpbmcoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7CiBleHRlcm4gaW50IGJsa19ycV9tYXBfdXNlcihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqLAogCQkJICAgc3RydWN0IHJxX21hcF9kYXRhICosIHZvaWQgX191c2VyICosIHVuc2lnbmVkIGxvbmcsCiAJCQkgICBnZnBfdCk7CkBAIC04MzEsNDEgKzgzOCw3MyBAQAogCQlibGtfcnVuX2JhY2tpbmdfZGV2KG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8sIE5VTEwpOwogfQogCi1leHRlcm4gdm9pZCBibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpyZXEpOworLyoKKyAqIGJsa19ycV9wb3MoKQkJOiB0aGUgY3VycmVudCBzZWN0b3IKKyAqIGJsa19ycV9ieXRlcygpCTogYnl0ZXMgbGVmdCBpbiB0aGUgZW50aXJlIHJlcXVlc3QKKyAqIGJsa19ycV9jdXJfYnl0ZXMoKQk6IGJ5dGVzIGxlZnQgaW4gdGhlIGN1cnJlbnQgc2VnbWVudAorICogYmxrX3JxX3NlY3RvcnMoKQk6IHNlY3RvcnMgbGVmdCBpbiB0aGUgZW50aXJlIHJlcXVlc3QKKyAqIGJsa19ycV9jdXJfc2VjdG9ycygpCTogc2VjdG9ycyBsZWZ0IGluIHRoZSBjdXJyZW50IHNlZ21lbnQKKyAqLworc3RhdGljIGlubGluZSBzZWN0b3JfdCBibGtfcnFfcG9zKGNvbnN0IHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlyZXR1cm4gcnEtPl9fc2VjdG9yOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBibGtfcnFfYnl0ZXMoY29uc3Qgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXJldHVybiBycS0+X19kYXRhX2xlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmxrX3JxX2N1cl9ieXRlcyhjb25zdCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJcmV0dXJuIHJxLT5iaW8gPyBiaW9fY3VyX2J5dGVzKHJxLT5iaW8pIDogMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYmxrX3JxX3NlY3RvcnMoY29uc3Qgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCXJldHVybiBibGtfcnFfYnl0ZXMocnEpID4+IDk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGJsa19ycV9jdXJfc2VjdG9ycyhjb25zdCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCit7CisJcmV0dXJuIGJsa19ycV9jdXJfYnl0ZXMocnEpID4+IDk7Cit9CiAKIC8qCi0gKiBibGtfZW5kX3JlcXVlc3QoKSBhbmQgZnJpZW5kcy4KLSAqIF9fYmxrX2VuZF9yZXF1ZXN0KCkgYW5kIGVuZF9yZXF1ZXN0KCkgbXVzdCBiZSBjYWxsZWQgd2l0aAotICogdGhlIHJlcXVlc3QgcXVldWUgc3BpbmxvY2sgYWNxdWlyZWQuCisgKiBSZXF1ZXN0IGlzc3VlIHJlbGF0ZWQgZnVuY3Rpb25zLgorICovCitleHRlcm4gc3RydWN0IHJlcXVlc3QgKmJsa19wZWVrX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworZXh0ZXJuIHZvaWQgYmxrX3N0YXJ0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxKTsKK2V4dGVybiBzdHJ1Y3QgcmVxdWVzdCAqYmxrX2ZldGNoX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOworCisvKgorICogUmVxdWVzdCBjb21wbGV0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zLgorICoKKyAqIGJsa191cGRhdGVfcmVxdWVzdCgpIGNvbXBsZXRlcyBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgYW5kIHVwZGF0ZXMKKyAqIHRoZSByZXF1ZXN0IHdpdGhvdXQgY29tcGxldGluZyBpdC4KKyAqCisgKiBibGtfZW5kX3JlcXVlc3QoKSBhbmQgZnJpZW5kcy4gIF9fYmxrX2VuZF9yZXF1ZXN0KCkgbXVzdCBiZSBjYWxsZWQKKyAqIHdpdGggdGhlIHJlcXVlc3QgcXVldWUgc3BpbmxvY2sgYWNxdWlyZWQuCiAgKgogICogU2V2ZXJhbCBkcml2ZXJzIGRlZmluZSB0aGVpciBvd24gZW5kX3JlcXVlc3QgYW5kIGNhbGwKICAqIGJsa19lbmRfcmVxdWVzdCgpIGZvciBwYXJ0cyBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCiAgKiBUaGlzIHByZXZlbnRzIGNvZGUgZHVwbGljYXRpb24gaW4gZHJpdmVycy4KICAqLwotZXh0ZXJuIGludCBibGtfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsCi0JCQkJdW5zaWduZWQgaW50IG5yX2J5dGVzKTsKLWV4dGVybiBpbnQgX19ibGtfZW5kX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsCi0JCQkJdW5zaWduZWQgaW50IG5yX2J5dGVzKTsKLWV4dGVybiBpbnQgYmxrX2VuZF9iaWRpX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsCi0JCQkJdW5zaWduZWQgaW50IG5yX2J5dGVzLCB1bnNpZ25lZCBpbnQgYmlkaV9ieXRlcyk7Ci1leHRlcm4gdm9pZCBlbmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqLCBpbnQpOwotZXh0ZXJuIGludCBibGtfZW5kX3JlcXVlc3RfY2FsbGJhY2soc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsCi0JCQkJdW5zaWduZWQgaW50IG5yX2J5dGVzLAotCQkJCWludCAoZHJ2X2NhbGxiYWNrKShzdHJ1Y3QgcmVxdWVzdCAqKSk7CitleHRlcm4gYm9vbCBibGtfdXBkYXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG5yX2J5dGVzKTsKK2V4dGVybiBib29sIGJsa19lbmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvciwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpOworZXh0ZXJuIHZvaWQgYmxrX2VuZF9yZXF1ZXN0X2FsbChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvcik7CitleHRlcm4gYm9vbCBibGtfZW5kX3JlcXVlc3RfY3VyKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yKTsKK2V4dGVybiBib29sIF9fYmxrX2VuZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IGVycm9yLAorCQkJICAgICAgdW5zaWduZWQgaW50IG5yX2J5dGVzKTsKK2V4dGVybiB2b2lkIF9fYmxrX2VuZF9yZXF1ZXN0X2FsbChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvcik7CitleHRlcm4gYm9vbCBfX2Jsa19lbmRfcmVxdWVzdF9jdXIoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgZXJyb3IpOworCiBleHRlcm4gdm9pZCBibGtfY29tcGxldGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiB2b2lkIF9fYmxrX2NvbXBsZXRlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gdm9pZCBibGtfYWJvcnRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiB2b2lkIGJsa19hYm9ydF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKLWV4dGVybiB2b2lkIGJsa191cGRhdGVfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCBlcnJvciwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbnJfYnl0ZXMpOwotCi0vKgotICogYmxrX2VuZF9yZXF1ZXN0KCkgdGFrZXMgYnl0ZXMgaW5zdGVhZCBvZiBzZWN0b3JzIGFzIGEgY29tcGxldGUgc2l6ZS4KLSAqIGJsa19ycV9ieXRlcygpIHJldHVybnMgYnl0ZXMgbGVmdCB0byBjb21wbGV0ZSBpbiB0aGUgZW50aXJlIHJlcXVlc3QuCi0gKiBibGtfcnFfY3VyX2J5dGVzKCkgcmV0dXJucyBieXRlcyBsZWZ0IHRvIGNvbXBsZXRlIGluIHRoZSBjdXJyZW50IHNlZ21lbnQuCi0gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgYmxrX3JxX2J5dGVzKHN0cnVjdCByZXF1ZXN0ICpycSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGJsa19ycV9jdXJfYnl0ZXMoc3RydWN0IHJlcXVlc3QgKnJxKTsKIAogLyoKICAqIEFjY2VzcyBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBxdWV1ZSBwcm9wZXJ0aWVzCkBAIC04NzcsMTAgKzkxNiwyMCBAQAogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21ha2VfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBtYWtlX3JlcXVlc3RfZm4gKik7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfYm91bmNlX2xpbWl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHU2NCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhfaHdfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHVuc2lnbmVkIHNob3J0KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX21heF9zZWdtZW50X3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIGJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHVuc2lnbmVkIHNob3J0KTsKK2V4dGVybiB2b2lkIGJsa19xdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3BoeXNpY2FsX2Jsb2NrX3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2FsaWdubWVudF9vZmZzZXQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBhbGlnbm1lbnQpOworZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2lvX21pbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgdW5zaWduZWQgaW50IG1pbik7CitleHRlcm4gdm9pZCBibGtfcXVldWVfaW9fb3B0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCB1bnNpZ25lZCBpbnQgb3B0KTsKK2V4dGVybiBpbnQgYmxrX3N0YWNrX2xpbWl0cyhzdHJ1Y3QgcXVldWVfbGltaXRzICp0LCBzdHJ1Y3QgcXVldWVfbGltaXRzICpiLAorCQkJICAgIHNlY3Rvcl90IG9mZnNldCk7CitleHRlcm4gdm9pZCBkaXNrX3N0YWNrX2xpbWl0cyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCSAgICAgIHNlY3Rvcl90IG9mZnNldCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfc3RhY2tfbGltaXRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICp0LCBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYik7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfZG1hX3BhZChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX3VwZGF0ZV9kbWFfcGFkKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CkBAIC05NjcsMTkgKzEwMTYsODcgQEAKIAogI2RlZmluZSBibGtkZXZfZW50cnlfdG9fcmVxdWVzdChlbnRyeSkgbGlzdF9lbnRyeSgoZW50cnkpLCBzdHJ1Y3QgcmVxdWVzdCwgcXVldWVsaXN0KQogCi1zdGF0aWMgaW5saW5lIGludCBxdWV1ZV9oYXJkc2VjdF9zaXplKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHF1ZXVlX2JvdW5jZV9wZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJcmV0dXJuIHEtPmxpbWl0cy5ib3VuY2VfcGZuOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcXVldWVfc2VnbWVudF9ib3VuZGFyeShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+bGltaXRzLnNlZ19ib3VuZGFyeV9tYXNrOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBxdWV1ZV9tYXhfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+bGltaXRzLm1heF9zZWN0b3JzOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBxdWV1ZV9tYXhfaHdfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+bGltaXRzLm1heF9od19zZWN0b3JzOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IHF1ZXVlX21heF9od19zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+bGltaXRzLm1heF9od19zZWdtZW50czsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBxdWV1ZV9tYXhfcGh5c19zZWdtZW50cyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+bGltaXRzLm1heF9waHlzX3NlZ21lbnRzOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBxdWV1ZV9tYXhfc2VnbWVudF9zaXplKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXJldHVybiBxLT5saW1pdHMubWF4X3NlZ21lbnRfc2l6ZTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBxdWV1ZV9sb2dpY2FsX2Jsb2NrX3NpemUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCiB7CiAJaW50IHJldHZhbCA9IDUxMjsKIAotCWlmIChxICYmIHEtPmhhcmRzZWN0X3NpemUpCi0JCXJldHZhbCA9IHEtPmhhcmRzZWN0X3NpemU7CisJaWYgKHEgJiYgcS0+bGltaXRzLmxvZ2ljYWxfYmxvY2tfc2l6ZSkKKwkJcmV0dmFsID0gcS0+bGltaXRzLmxvZ2ljYWxfYmxvY2tfc2l6ZTsKIAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGJkZXZfaGFyZHNlY3Rfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBiZGV2X2xvZ2ljYWxfYmxvY2tfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewotCXJldHVybiBxdWV1ZV9oYXJkc2VjdF9zaXplKGJkZXZfZ2V0X3F1ZXVlKGJkZXYpKTsKKwlyZXR1cm4gcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGJkZXZfZ2V0X3F1ZXVlKGJkZXYpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcXVldWVfcGh5c2ljYWxfYmxvY2tfc2l6ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+bGltaXRzLnBoeXNpY2FsX2Jsb2NrX3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHF1ZXVlX2lvX21pbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+bGltaXRzLmlvX21pbjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcXVldWVfaW9fb3B0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCXJldHVybiBxLT5saW1pdHMuaW9fb3B0OworfQorCitzdGF0aWMgaW5saW5lIGludCBxdWV1ZV9hbGlnbm1lbnRfb2Zmc2V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQoreworCWlmIChxICYmIHEtPmxpbWl0cy5taXNhbGlnbmVkKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocSAmJiBxLT5saW1pdHMuYWxpZ25tZW50X29mZnNldCkKKwkJcmV0dXJuIHEtPmxpbWl0cy5hbGlnbm1lbnRfb2Zmc2V0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX3NlY3Rvcl9hbGlnbm1lbnRfb2Zmc2V0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJCQkJc2VjdG9yX3Qgc2VjdG9yKQoreworCXJldHVybiAoKHNlY3RvciA8PCA5KSAtIHEtPmxpbWl0cy5hbGlnbm1lbnRfb2Zmc2V0KQorCQkmIChxLT5saW1pdHMuaW9fbWluIC0gMSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHF1ZXVlX2RtYV9hbGlnbm1lbnQoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAppbmRleCBkOTYwODg5Li43ZTQzNTBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKQEAgLTExNiw5ICsxMTYsOSBAQAogICogVGhlIHJlbWFwIGV2ZW50CiAgKi8KIHN0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgewotCV9fYmUzMiBkZXZpY2U7CiAJX19iZTMyIGRldmljZV9mcm9tOwotCV9fYmU2NCBzZWN0b3I7CisJX19iZTMyIGRldmljZV90bzsKKwlfX2JlNjQgc2VjdG9yX2Zyb207CiB9OwogCiBlbnVtIHsKQEAgLTE2NSw4ICsxNjUsOSBAQAogCiBleHRlcm4gaW50IGJsa190cmFjZV9pb2N0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkLCBjaGFyIF9fdXNlciAqKTsKIGV4dGVybiB2b2lkIGJsa190cmFjZV9zaHV0ZG93bihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKLWV4dGVybiBpbnQgZG9fYmxrX3RyYWNlX3NldHVwKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAotCWNoYXIgKm5hbWUsIGRldl90IGRldiwgc3RydWN0IGJsa191c2VyX3RyYWNlX3NldHVwICpidXRzKTsKK2V4dGVybiBpbnQgZG9fYmxrX3RyYWNlX3NldHVwKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpuYW1lLAorCQkJICAgICAgZGV2X3QgZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJICAgICAgc3RydWN0IGJsa191c2VyX3RyYWNlX3NldHVwICpidXRzKTsKIGV4dGVybiB2b2lkIF9fdHJhY2Vfbm90ZV9tZXNzYWdlKHN0cnVjdCBibGtfdHJhY2UgKiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKioKQEAgLTE5MywyMiArMTk0LDQyIEBACiBleHRlcm4gdm9pZCBibGtfYWRkX2RyaXZlcl9kYXRhKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkJdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CiBleHRlcm4gaW50IGJsa190cmFjZV9zZXR1cChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqbmFtZSwgZGV2X3QgZGV2LAorCQkJICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCSAgIGNoYXIgX191c2VyICphcmcpOwogZXh0ZXJuIGludCBibGtfdHJhY2Vfc3RhcnRzdG9wKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgc3RhcnQpOwogZXh0ZXJuIGludCBibGtfdHJhY2VfcmVtb3ZlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKK2V4dGVybiBpbnQgYmxrX3RyYWNlX2luaXRfc3lzZnMoc3RydWN0IGRldmljZSAqZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYmxrX3RyYWNlX2F0dHJfZ3JvdXA7CiAKICNlbHNlIC8qICFDT05GSUdfQkxLX0RFVl9JT19UUkFDRSAqLwotI2RlZmluZSBibGtfdHJhY2VfaW9jdGwoYmRldiwgY21kLCBhcmcpCQkoLUVOT1RUWSkKLSNkZWZpbmUgYmxrX3RyYWNlX3NodXRkb3duKHEpCQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBkb19ibGtfdHJhY2Vfc2V0dXAocSwgbmFtZSwgZGV2LCBidXRzKQkoLUVOT1RUWSkKLSNkZWZpbmUgYmxrX2FkZF9kcml2ZXJfZGF0YShxLCBycSwgZGF0YSwgbGVuKQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgYmxrX3RyYWNlX3NldHVwKHEsIG5hbWUsIGRldiwgYXJnKQkoLUVOT1RUWSkKLSNkZWZpbmUgYmxrX3RyYWNlX3N0YXJ0c3RvcChxLCBzdGFydCkJCSgtRU5PVFRZKQotI2RlZmluZSBibGtfdHJhY2VfcmVtb3ZlKHEpCQkJKC1FTk9UVFkpCi0jZGVmaW5lIGJsa19hZGRfdHJhY2VfbXNnKHEsIGZtdCwgLi4uKQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgYmxrX3RyYWNlX2lvY3RsKGJkZXYsIGNtZCwgYXJnKQkJKC1FTk9UVFkpCisjIGRlZmluZSBibGtfdHJhY2Vfc2h1dGRvd24ocSkJCQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgZG9fYmxrX3RyYWNlX3NldHVwKHEsIG5hbWUsIGRldiwgYmRldiwgYnV0cykJKC1FTk9UVFkpCisjIGRlZmluZSBibGtfYWRkX2RyaXZlcl9kYXRhKHEsIHJxLCBkYXRhLCBsZW4pCQlkbyB7fSB3aGlsZSAoMCkKKyMgZGVmaW5lIGJsa190cmFjZV9zZXR1cChxLCBuYW1lLCBkZXYsIGJkZXYsIGFyZykJKC1FTk9UVFkpCisjIGRlZmluZSBibGtfdHJhY2Vfc3RhcnRzdG9wKHEsIHN0YXJ0KQkJCSgtRU5PVFRZKQorIyBkZWZpbmUgYmxrX3RyYWNlX3JlbW92ZShxKQkJCQkoLUVOT1RUWSkKKyMgZGVmaW5lIGJsa19hZGRfdHJhY2VfbXNnKHEsIGZtdCwgLi4uKQkJCWRvIHsgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IGJsa190cmFjZV9pbml0X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KIAogI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lPX1RSQUNFICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19FVkVOVF9UUkFDSU5HKSAmJiBkZWZpbmVkKENPTkZJR19CTE9DSykKKworc3RhdGljIGlubGluZSBpbnQgYmxrX2NtZF9idWZfbGVuKHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlyZXR1cm4gYmxrX3BjX3JlcXVlc3QocnEpID8gcnEtPmNtZF9sZW4gKiAzIDogMTsKK30KKworZXh0ZXJuIHZvaWQgYmxrX2R1bXBfY21kKGNoYXIgKmJ1Ziwgc3RydWN0IHJlcXVlc3QgKnJxKTsKK2V4dGVybiB2b2lkIGJsa19maWxsX3J3YnMoY2hhciAqcndicywgdTMyIHJ3LCBpbnQgYnl0ZXMpOworZXh0ZXJuIHZvaWQgYmxrX2ZpbGxfcndic19ycShjaGFyICpyd2JzLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpOworCisjZW5kaWYgLyogQ09ORklHX0VWRU5UX1RSQUNJTkcgJiYgQ09ORklHX0JMT0NLICovCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaCBiL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaAppbmRleCA1YTQwZDE0Li5jNTY0NTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCkBAIC0yODgsNyArMjg4LDE1IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGNsb2Nrc291cmNlX2VuYWJsZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQogewotCXJldHVybiBjcy0+ZW5hYmxlID8gY3MtPmVuYWJsZShjcykgOiAwOworCWludCByZXQgPSAwOworCisJaWYgKGNzLT5lbmFibGUpCisJCXJldCA9IGNzLT5lbmFibGUoY3MpOworCisJLyogc2F2ZSBtdWx0X29yaWcgb24gZW5hYmxlICovCisJY3MtPm11bHRfb3JpZyA9IGNzLT5tdWx0OworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaAppbmRleCBmMmRlZDIxLi5hZjkzMWVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29tcGF0LmgKQEAgLTIyMiw2ICsyMjIsOCBAQAogaW50IGNvcHlfc2lnaW5mb190b191c2VyMzIoc3RydWN0IGNvbXBhdF9zaWdpbmZvIF9fdXNlciAqdG8sIHNpZ2luZm9fdCAqZnJvbSk7CiBpbnQgZ2V0X2NvbXBhdF9zaWdldmVudChzdHJ1Y3Qgc2lnZXZlbnQgKmV2ZW50LAogCQljb25zdCBzdHJ1Y3QgY29tcGF0X3NpZ2V2ZW50IF9fdXNlciAqdV9ldmVudCk7Citsb25nIGNvbXBhdF9zeXNfcnRfdGdzaWdxdWV1ZWluZm8oY29tcGF0X3BpZF90IHRnaWQsIGNvbXBhdF9waWRfdCBwaWQsIGludCBzaWcsCisJCQkJICBzdHJ1Y3QgY29tcGF0X3NpZ2luZm8gX191c2VyICp1aW5mbyk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNvbXBhdF90aW1ldmFsX2NvbXBhcmUoc3RydWN0IGNvbXBhdF90aW1ldmFsICpsaHMsCiAJCQkJCXN0cnVjdCBjb21wYXRfdGltZXZhbCAqcmhzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oIGIvaW5jbHVkZS9saW51eC9jeWNsYWRlcy5oCmluZGV4IDc4ODg1MGIuLjFmYmRlYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY3ljbGFkZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2N5Y2xhZGVzLmgKQEAgLTE0MiwxOSArMTQyLDYgQEAKIAogCiAjaWZuZGVmIERQX1dJTkRPV19TSVpFCi0vKiAjaW5jbHVkZSAiY3ljbG9tei5oIiAqLwotLyoqKioqKioqKioqKioqKioqKiAqKioqKioqKioqKioqKioqKiogKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKglUaGUgZGF0YSB0eXBlcyBkZWZpbmVkIGJlbG93IGFyZSB1c2VkIGluIGFsbCBaRklSTSBpbnRlcmZhY2UKLSAqCWRhdGEgc3RydWN0dXJlcy4gVGhleSBhY2NvbW9kYXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gSFcKLSAqCWFyY2hpdGVjdHVyZXMgYW5kIGNvbXBpbGVycy4KLSAqLwotCi10eXBlZGVmIF9fdTY0ICB1Y2RvdWJsZTsJCS8qIDY0IGJpdHMsIHVuc2lnbmVkICovCi10eXBlZGVmIF9fdTMyICB1Y2xvbmc7CQkJLyogMzIgYml0cywgdW5zaWduZWQgKi8KLXR5cGVkZWYgX191MTYgIHVjc2hvcnQ7CQkvKiAxNiBiaXRzLCB1bnNpZ25lZCAqLwotdHlwZWRlZiBfX3U4ICAgdWNjaGFyOwkJCS8qIDggYml0cywgdW5zaWduZWQgKi8KLQogLyoKICAqCU1lbW9yeSBXaW5kb3cgU2l6ZXMKICAqLwpAQCAtNTA3LDE2ICs0OTQsMjAgQEAKIAogLyogUGVyIGNhcmQgZGF0YSBzdHJ1Y3R1cmUgKi8KIHN0cnVjdCBjeWNsYWRlc19jYXJkIHsKLSAgICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKLSAgICB2b2lkIF9faW9tZW0gKmN0bF9hZGRyOwotICAgIGludCBpcnE7Ci0gICAgdW5zaWduZWQgaW50IG51bV9jaGlwczsJLyogMCBpZiBjYXJkIGFic2VudCwgLTEgaWYgWi9QQ0ksIGVsc2UgWSAqLwotICAgIHVuc2lnbmVkIGludCBmaXJzdF9saW5lOwkvKiBtaW5vciBudW1iZXIgb2YgZmlyc3QgY2hhbm5lbCBvbiBjYXJkICovCi0gICAgdW5zaWduZWQgaW50IG5wb3J0czsJLyogTnVtYmVyIG9mIHBvcnRzIGluIHRoZSBjYXJkICovCi0gICAgaW50IGJ1c19pbmRleDsJCS8qIGFkZHJlc3Mgc2hpZnQgLSAwIGZvciBJU0EsIDEgZm9yIFBDSSAqLwotICAgIGludCBpbnRyX2VuYWJsZWQ7CQkvKiBGVyBJbnRlcnJ1cHQgZmxhZyAtIDAgZGlzYWJsZWQsIDEgZW5hYmxlZCAqLwotICAgIHNwaW5sb2NrX3QgY2FyZF9sb2NrOwotICAgIHN0cnVjdCBjeWNsYWRlc19wb3J0ICpwb3J0czsKKwl2b2lkIF9faW9tZW0gKmJhc2VfYWRkcjsKKwl1bmlvbiB7CisJCXZvaWQgX19pb21lbSAqcDkwNTA7CisJCXN0cnVjdCBSVU5USU1FXzkwNjAgX19pb21lbSAqcDkwNjA7CisJfSBjdGxfYWRkcjsKKwlpbnQgaXJxOworCXVuc2lnbmVkIGludCBudW1fY2hpcHM7CS8qIDAgaWYgY2FyZCBhYnNlbnQsIC0xIGlmIFovUENJLCBlbHNlIFkgKi8KKwl1bnNpZ25lZCBpbnQgZmlyc3RfbGluZTsJLyogbWlub3IgbnVtYmVyIG9mIGZpcnN0IGNoYW5uZWwgb24gY2FyZCAqLworCXVuc2lnbmVkIGludCBucG9ydHM7CS8qIE51bWJlciBvZiBwb3J0cyBpbiB0aGUgY2FyZCAqLworCWludCBidXNfaW5kZXg7CQkvKiBhZGRyZXNzIHNoaWZ0IC0gMCBmb3IgSVNBLCAxIGZvciBQQ0kgKi8KKwlpbnQgaW50cl9lbmFibGVkOwkJLyogRlcgSW50ZXJydXB0IGZsYWcgLSAwIGRpc2FibGVkLCAxIGVuYWJsZWQgKi8KKwl1MzIgaHdfdmVyOworCXNwaW5sb2NrX3QgY2FyZF9sb2NrOworCXN0cnVjdCBjeWNsYWRlc19wb3J0ICpwb3J0czsKIH07CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmggYi9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCmluZGV4IDE1MTU2MzYuLjk3OTc4MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaApAQCAtMTgwLDEwICsxODAsMTIgQEAKICNkZWZpbmUgRENBQ0hFX1JFRkVSRU5DRUQJMHgwMDA4ICAvKiBSZWNlbnRseSB1c2VkLCBkb24ndCBkaXNjYXJkLiAqLwogI2RlZmluZSBEQ0FDSEVfVU5IQVNIRUQJCTB4MDAxMAkKIAotI2RlZmluZSBEQ0FDSEVfSU5PVElGWV9QQVJFTlRfV0FUQ0hFRAkweDAwMjAgLyogUGFyZW50IGlub2RlIGlzIHdhdGNoZWQgKi8KKyNkZWZpbmUgRENBQ0hFX0lOT1RJRllfUEFSRU5UX1dBVENIRUQJMHgwMDIwIC8qIFBhcmVudCBpbm9kZSBpcyB3YXRjaGVkIGJ5IGlub3RpZnkgKi8KIAogI2RlZmluZSBEQ0FDSEVfQ09PS0lFCQkweDAwNDAJLyogRm9yIHVzZSBieSBkY29va2llIHN1YnN5c3RlbSAqLwogCisjZGVmaW5lIERDQUNIRV9GU05PVElGWV9QQVJFTlRfV0FUQ0hFRAkweDAwODAgLyogUGFyZW50IGlub2RlIGlzIHdhdGNoZWQgYnkgc29tZSBmc25vdGlmeSBsaXN0ZW5lciAqLworCiBleHRlcm4gc3BpbmxvY2tfdCBkY2FjaGVfbG9jazsKIGV4dGVybiBzZXFsb2NrX3QgcmVuYW1lX2xvY2s7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKaW5kZXggZGVkMmQ3Yy4uNDljMjM2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmgKQEAgLTE0OSw3ICsxNDksNyBAQAogCXVuc2lnbmVkIG1heF9od19zZWN0b3JzOwogCXVuc2lnbmVkIG1heF9zZWN0b3JzOwogCXVuc2lnbmVkIG1heF9zZWdtZW50X3NpemU7Ci0JdW5zaWduZWQgc2hvcnQgaGFyZHNlY3Rfc2l6ZTsKKwl1bnNpZ25lZCBzaG9ydCBsb2dpY2FsX2Jsb2NrX3NpemU7CiAJdW5zaWduZWQgc2hvcnQgbWF4X2h3X3NlZ21lbnRzOwogCXVuc2lnbmVkIHNob3J0IG1heF9waHlzX3NlZ21lbnRzOwogCXVuc2lnbmVkIGNoYXIgbm9fY2x1c3RlcjsgLyogaW52ZXJ0ZWQgc28gdGhhdCAwIGlzIGRlZmF1bHQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hLWRlYnVnLmggYi9pbmNsdWRlL2xpbnV4L2RtYS1kZWJ1Zy5oCmluZGV4IDI4ZDUzY2IuLjE3MWFkOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hLWRlYnVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWEtZGVidWcuaApAQCAtMzIsNiArMzIsOCBAQAogCiBleHRlcm4gdm9pZCBkbWFfZGVidWdfaW5pdCh1MzIgbnVtX2VudHJpZXMpOwogCitleHRlcm4gaW50IGRtYV9kZWJ1Z19yZXNpemVfZW50cmllcyh1MzIgbnVtX2VudHJpZXMpOworCiBleHRlcm4gdm9pZCBkZWJ1Z19kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCSAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKIAkJCSAgICAgICBpbnQgZGlyZWN0aW9uLCBkbWFfYWRkcl90IGRtYV9hZGRyLApAQCAtOTEsNiArOTMsMTEgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZG1hX2RlYnVnX3Jlc2l6ZV9lbnRyaWVzKHUzMiBudW1fZW50cmllcykKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX2RtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSAgICAgIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplLAogCQkJCSAgICAgIGludCBkaXJlY3Rpb24sIGRtYV9hZGRyX3QgZG1hX2FkZHIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYXIuaCBiL2luY2x1ZGUvbGludXgvZG1hci5oCmluZGV4IGUzOTdkYzMuLjEwZmY1YzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG1hci5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hci5oCkBAIC0xMDgsNiArMTA4LDcgQEAKIH07CiAjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKIGV4dGVybiBpbnQgaW50cl9yZW1hcHBpbmdfZW5hYmxlZDsKK2V4dGVybiBpbnQgaW50cl9yZW1hcHBpbmdfc3VwcG9ydGVkKHZvaWQpOwogZXh0ZXJuIGludCBlbmFibGVfaW50cl9yZW1hcHBpbmcoaW50KTsKIGV4dGVybiB2b2lkIGRpc2FibGVfaW50cl9yZW1hcHBpbmcodm9pZCk7CiBleHRlcm4gaW50IHJlZW5hYmxlX2ludHJfcmVtYXBwaW5nKGludCk7CkBAIC0xNTcsNiArMTU4LDggQEAKIH0KICNkZWZpbmUgaXJxX3JlbWFwcGVkKGlycSkJCSgwKQogI2RlZmluZSBlbmFibGVfaW50cl9yZW1hcHBpbmcobW9kZSkJKC0xKQorI2RlZmluZSBkaXNhYmxlX2ludHJfcmVtYXBwaW5nKCkJKDApCisjZGVmaW5lIHJlZW5hYmxlX2ludHJfcmVtYXBwaW5nKG1vZGUpCSgwKQogI2RlZmluZSBpbnRyX3JlbWFwcGluZ19lbmFibGVkCQkoMCkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Rub3RpZnkuaCBiL2luY2x1ZGUvbGludXgvZG5vdGlmeS5oCmluZGV4IDEwMmE5MDIuLmVjYzA2MjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZG5vdGlmeS5oCisrKyBiL2luY2x1ZGUvbGludXgvZG5vdGlmeS5oCkBAIC0xMCw3ICsxMCw3IEBACiAKIHN0cnVjdCBkbm90aWZ5X3N0cnVjdCB7CiAJc3RydWN0IGRub3RpZnlfc3RydWN0ICoJZG5fbmV4dDsKLQl1bnNpZ25lZCBsb25nCQlkbl9tYXNrOworCV9fdTMyCQkJZG5fbWFzazsKIAlpbnQJCQlkbl9mZDsKIAlzdHJ1Y3QgZmlsZSAqCQlkbl9maWxwOwogCWZsX293bmVyX3QJCWRuX293bmVyOwpAQCAtMjEsMjMgKzIxLDE4IEBACiAKICNpZmRlZiBDT05GSUdfRE5PVElGWQogCi1leHRlcm4gdm9pZCBfX2lub2RlX2Rpcl9ub3RpZnkoc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcpOworI2RlZmluZSBETk9USUZZX0FMTF9FVkVOVFMgKEZTX0RFTEVURSB8IEZTX0RFTEVURV9DSElMRCB8XAorCQkJICAgIEZTX01PRElGWSB8IEZTX01PRElGWV9DSElMRCB8XAorCQkJICAgIEZTX0FDQ0VTUyB8IEZTX0FDQ0VTU19DSElMRCB8XAorCQkJICAgIEZTX0FUVFJJQiB8IEZTX0FUVFJJQl9DSElMRCB8XAorCQkJICAgIEZTX0NSRUFURSB8IEZTX0ROX1JFTkFNRSB8XAorCQkJICAgIEZTX01PVkVEX0ZST00gfCBGU19NT1ZFRF9UTykKKwogZXh0ZXJuIHZvaWQgZG5vdGlmeV9mbHVzaChzdHJ1Y3QgZmlsZSAqLCBmbF9vd25lcl90KTsKIGV4dGVybiBpbnQgZmNudGxfZGlybm90aWZ5KGludCwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gdm9pZCBkbm90aWZ5X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICosIHVuc2lnbmVkIGxvbmcpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5vZGVfZGlyX25vdGlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGV2ZW50KQotewotCWlmIChpbm9kZS0+aV9kbm90aWZ5X21hc2sgJiAoZXZlbnQpKQotCQlfX2lub2RlX2Rpcl9ub3RpZnkoaW5vZGUsIGV2ZW50KTsKLX0KIAogI2Vsc2UKIAotc3RhdGljIGlubGluZSB2b2lkIF9faW5vZGVfZGlyX25vdGlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGV2ZW50KQotewotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZG5vdGlmeV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCkKIHsKIH0KQEAgLTQ3LDE0ICs0Miw2IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkbm90aWZ5X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVuc2lnbmVkIGxvbmcgZXZlbnQpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbm9kZV9kaXJfbm90aWZ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgZXZlbnQpCi17Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfRE5PVElGWSAqLwogCiAjZW5kaWYgLyogX19LRVJORUwgX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaCBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaAppbmRleCBjNTliNzY5Li4xY2IzMzcyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9lbGV2YXRvci5oCisrKyBiL2luY2x1ZGUvbGludXgvZWxldmF0b3IuaApAQCAtMTAzLDEwICsxMDMsOCBAQAogZXh0ZXJuIHZvaWQgZWx2X21lcmdlX3JlcXVlc3RzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICosCiAJCQkgICAgICAgc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gdm9pZCBlbHZfbWVyZ2VkX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKiwgaW50KTsKLWV4dGVybiB2b2lkIGVsdl9kZXF1ZXVlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gdm9pZCBlbHZfcmVxdWV1ZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICosIHN0cnVjdCByZXF1ZXN0ICopOwogZXh0ZXJuIGludCBlbHZfcXVldWVfZW1wdHkoc3RydWN0IHJlcXVlc3RfcXVldWUgKik7Ci1leHRlcm4gc3RydWN0IHJlcXVlc3QgKmVsdl9uZXh0X3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpOwogZXh0ZXJuIHN0cnVjdCByZXF1ZXN0ICplbHZfZm9ybWVyX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgc3RydWN0IHJlcXVlc3QgKik7CiBleHRlcm4gc3RydWN0IHJlcXVlc3QgKmVsdl9sYXR0ZXJfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLCBzdHJ1Y3QgcmVxdWVzdCAqKTsKIGV4dGVybiBpbnQgZWx2X3JlZ2lzdGVyX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKQEAgLTE3MSw3ICsxNjksNyBAQAogCUVMVl9NUVVFVUVfTVVTVCwKIH07CiAKLSNkZWZpbmUgcnFfZW5kX3NlY3RvcihycSkJKChycSktPnNlY3RvciArIChycSktPm5yX3NlY3RvcnMpCisjZGVmaW5lIHJxX2VuZF9zZWN0b3IocnEpCShibGtfcnFfcG9zKHJxKSArIGJsa19ycV9zZWN0b3JzKHJxKSkKICNkZWZpbmUgcmJfZW50cnlfcnEobm9kZSkJcmJfZW50cnkoKG5vZGUpLCBzdHJ1Y3QgcmVxdWVzdCwgcmJfbm9kZSkKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCAzYjUzNGU1Li4zMjNiNWNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC03NTUsOSArNzU1LDkgQEAKIAogCV9fdTMyCQkJaV9nZW5lcmF0aW9uOwogCi0jaWZkZWYgQ09ORklHX0ROT1RJRlkKLQl1bnNpZ25lZCBsb25nCQlpX2Rub3RpZnlfbWFzazsgLyogRGlyZWN0b3J5IG5vdGlmeSBldmVudHMgKi8KLQlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QJKmlfZG5vdGlmeTsgLyogZm9yIGRpcmVjdG9yeSBub3RpZmljYXRpb25zICovCisjaWZkZWYgQ09ORklHX0ZTTk9USUZZCisJX191MzIJCQlpX2Zzbm90aWZ5X21hc2s7IC8qIGFsbCBldmVudHMgdGhpcyBpbm9kZSBjYXJlcyBhYm91dCAqLworCXN0cnVjdCBobGlzdF9oZWFkCWlfZnNub3RpZnlfbWFya19lbnRyaWVzOyAvKiBmc25vdGlmeSBtYXJrIGVudHJpZXMgKi8KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0lOT1RJRlkKQEAgLTIyMDUsNiArMjIwNSw4IEBACiAvKiBmcy9zcGxpY2UuYyAqLwogZXh0ZXJuIHNzaXplX3QgZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICosIGxvZmZfdCAqLAogCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKK2V4dGVybiBzc2l6ZV90IGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwKKwkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzaXplX3QsIHVuc2lnbmVkIGludCk7CiBleHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfc3BsaWNlX3dyaXRlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwKIAkJc3RydWN0IGZpbGUgKiwgbG9mZl90ICosIHNpemVfdCwgdW5zaWduZWQgaW50KTsKIGV4dGVybiBzc2l6ZV90IGdlbmVyaWNfc3BsaWNlX3NlbmRwYWdlKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmggYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5LmgKaW5kZXggMDBmYmQ1Yi4uOTM2ZjlhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mc25vdGlmeS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnNub3RpZnkuaApAQCAtMTMsNiArMTMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgogI2luY2x1ZGUgPGxpbnV4L2lub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9mc25vdGlmeV9iYWNrZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KIAogLyoKQEAgLTIyLDE5ICsyMyw0NSBAQAogc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X2RfaW5zdGFudGlhdGUoc3RydWN0IGRlbnRyeSAqZW50cnksCiAJCQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCV9fZnNub3RpZnlfZF9pbnN0YW50aWF0ZShlbnRyeSwgaW5vZGUpOworCiAJaW5vdGlmeV9kX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CiB9CiAKKy8qIE5vdGlmeSB0aGlzIGRlbnRyeSdzIHBhcmVudCBhYm91dCBhIGNoaWxkJ3MgZXZlbnRzLiAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyIG1hc2spCit7CisJX19mc25vdGlmeV9wYXJlbnQoZGVudHJ5LCBtYXNrKTsKKworCWlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChkZW50cnksIG1hc2ssIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworfQorCiAvKgogICogZnNub3RpZnlfZF9tb3ZlIC0gZW50cnkgaGFzIGJlZW4gbW92ZWQKICAqIENhbGxlZCB3aXRoIGRjYWNoZV9sb2NrIGFuZCBlbnRyeS0+ZF9sb2NrIGhlbGQuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9kX21vdmUoc3RydWN0IGRlbnRyeSAqZW50cnkpCiB7CisJLyoKKwkgKiBPbiBtb3ZlIHdlIG5lZWQgdG8gdXBkYXRlIGVudHJ5LT5kX2ZsYWdzIHRvIGluZGljYXRlIGlmIHRoZSBuZXcgcGFyZW50CisJICogY2FyZXMgYWJvdXQgZXZlbnRzIGZyb20gdGhpcyBlbnRyeS4KKwkgKi8KKwlfX2Zzbm90aWZ5X3VwZGF0ZV9kY2FjaGVfZmxhZ3MoZW50cnkpOworCiAJaW5vdGlmeV9kX21vdmUoZW50cnkpOwogfQogCiAvKgorICogZnNub3RpZnlfbGlua19jb3VudCAtIGlub2RlJ3MgbGluayBjb3VudCBjaGFuZ2VkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9saW5rX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgSU5fQVRUUklCLCAwLCBOVUxMLCBOVUxMKTsKKworCWZzbm90aWZ5KGlub2RlLCBGU19BVFRSSUIsIGlub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwgTlVMTCwgMCk7Cit9CisKKy8qCiAgKiBmc25vdGlmeV9tb3ZlIC0gZmlsZSBvbGRfbmFtZSBhdCBvbGRfZGlyIHdhcyBtb3ZlZCB0byBuZXdfbmFtZSBhdCBuZXdfZGlyCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9tb3ZlKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGlub2RlICpuZXdfZGlyLApAQCAtNDIsNDIgKzY5LDYyIEBACiAJCQkJIGludCBpc2Rpciwgc3RydWN0IGlub2RlICp0YXJnZXQsIHN0cnVjdCBkZW50cnkgKm1vdmVkKQogewogCXN0cnVjdCBpbm9kZSAqc291cmNlID0gbW92ZWQtPmRfaW5vZGU7Ci0JdTMyIGNvb2tpZSA9IGlub3RpZnlfZ2V0X2Nvb2tpZSgpOworCXUzMiBpbl9jb29raWUgPSBpbm90aWZ5X2dldF9jb29raWUoKTsKKwl1MzIgZnNfY29va2llID0gZnNub3RpZnlfZ2V0X2Nvb2tpZSgpOworCV9fdTMyIG9sZF9kaXJfbWFzayA9IChGU19FVkVOVF9PTl9DSElMRCB8IEZTX01PVkVEX0ZST00pOworCV9fdTMyIG5ld19kaXJfbWFzayA9IChGU19FVkVOVF9PTl9DSElMRCB8IEZTX01PVkVEX1RPKTsKIAogCWlmIChvbGRfZGlyID09IG5ld19kaXIpCi0JCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fUkVOQU1FKTsKLQllbHNlIHsKLQkJaW5vZGVfZGlyX25vdGlmeShvbGRfZGlyLCBETl9ERUxFVEUpOwotCQlpbm9kZV9kaXJfbm90aWZ5KG5ld19kaXIsIEROX0NSRUFURSk7CisJCW9sZF9kaXJfbWFzayB8PSBGU19ETl9SRU5BTUU7CisKKwlpZiAoaXNkaXIpIHsKKwkJaXNkaXIgPSBJTl9JU0RJUjsKKwkJb2xkX2Rpcl9tYXNrIHw9IEZTX0lOX0lTRElSOworCQluZXdfZGlyX21hc2sgfD0gRlNfSU5fSVNESVI7CiAJfQogCi0JaWYgKGlzZGlyKQotCQlpc2RpciA9IElOX0lTRElSOwotCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQob2xkX2RpciwgSU5fTU9WRURfRlJPTXxpc2Rpcixjb29raWUsb2xkX25hbWUsCisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChvbGRfZGlyLCBJTl9NT1ZFRF9GUk9NfGlzZGlyLCBpbl9jb29raWUsIG9sZF9uYW1lLAogCQkJCSAgc291cmNlKTsKLQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KG5ld19kaXIsIElOX01PVkVEX1RPfGlzZGlyLCBjb29raWUsIG5ld19uYW1lLAorCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQobmV3X2RpciwgSU5fTU9WRURfVE98aXNkaXIsIGluX2Nvb2tpZSwgbmV3X25hbWUsCiAJCQkJICBzb3VyY2UpOwogCisJZnNub3RpZnkob2xkX2Rpciwgb2xkX2Rpcl9tYXNrLCBvbGRfZGlyLCBGU05PVElGWV9FVkVOVF9JTk9ERSwgb2xkX25hbWUsIGZzX2Nvb2tpZSk7CisJZnNub3RpZnkobmV3X2RpciwgbmV3X2Rpcl9tYXNrLCBuZXdfZGlyLCBGU05PVElGWV9FVkVOVF9JTk9ERSwgbmV3X25hbWUsIGZzX2Nvb2tpZSk7CisKIAlpZiAodGFyZ2V0KSB7CiAJCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQodGFyZ2V0LCBJTl9ERUxFVEVfU0VMRiwgMCwgTlVMTCwgTlVMTCk7CiAJCWlub3RpZnlfaW5vZGVfaXNfZGVhZCh0YXJnZXQpOworCisJCS8qIHRoaXMgaXMgcmVhbGx5IGEgbGlua19jb3VudCBjaGFuZ2Ugbm90IGEgcmVtb3ZhbCAqLworCQlmc25vdGlmeV9saW5rX2NvdW50KHRhcmdldCk7CiAJfQogCiAJaWYgKHNvdXJjZSkgewogCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KHNvdXJjZSwgSU5fTU9WRV9TRUxGLCAwLCBOVUxMLCBOVUxMKTsKKwkJZnNub3RpZnkoc291cmNlLCBGU19NT1ZFX1NFTEYsIG1vdmVkLT5kX2lub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwgTlVMTCwgMCk7CiAJfQogCWF1ZGl0X2lub2RlX2NoaWxkKG5ld19uYW1lLCBtb3ZlZCwgbmV3X2Rpcik7CiB9CiAKIC8qCisgKiBmc25vdGlmeV9pbm9kZV9kZWxldGUgLSBhbmQgaW5vZGUgaXMgYmVpbmcgZXZpY3RlZCBmcm9tIGNhY2hlLCBjbGVhbiB1cCBpcyBuZWVkZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X2lub2RlX2RlbGV0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCV9fZnNub3RpZnlfaW5vZGVfZGVsZXRlKGlub2RlKTsKK30KKworLyoKICAqIGZzbm90aWZ5X25hbWVyZW1vdmUgLSBhIGZpbGVuYW1lIHdhcyByZW1vdmVkIGZyb20gYSBkaXJlY3RvcnkKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X25hbWVyZW1vdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgaXNkaXIpCiB7CisJX191MzIgbWFzayA9IEZTX0RFTEVURTsKKwogCWlmIChpc2RpcikKLQkJaXNkaXIgPSBJTl9JU0RJUjsKLQlkbm90aWZ5X3BhcmVudChkZW50cnksIEROX0RFTEVURSk7Ci0JaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRyeSwgSU5fREVMRVRFfGlzZGlyLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJbWFzayB8PSBGU19JTl9JU0RJUjsKKworCWZzbm90aWZ5X3BhcmVudChkZW50cnksIG1hc2spOwogfQogCiAvKgpAQCAtODcsMTQgKzEzNCw5IEBACiB7CiAJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgSU5fREVMRVRFX1NFTEYsIDAsIE5VTEwsIE5VTEwpOwogCWlub3RpZnlfaW5vZGVfaXNfZGVhZChpbm9kZSk7Ci19CiAKLS8qCi0gKiBmc25vdGlmeV9saW5rX2NvdW50IC0gaW5vZGUncyBsaW5rIGNvdW50IGNoYW5nZWQKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X2xpbmtfY291bnQoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBJTl9BVFRSSUIsIDAsIE5VTEwsIE5VTEwpOworCWZzbm90aWZ5KGlub2RlLCBGU19ERUxFVEVfU0VMRiwgaW5vZGUsIEZTTk9USUZZX0VWRU5UX0lOT0RFLCBOVUxMLCAwKTsKKwlfX2Zzbm90aWZ5X2lub2RlX2RlbGV0ZShpbm9kZSk7CiB9CiAKIC8qCkBAIC0xMDIsMTAgKzE0NCwxMSBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfY3JlYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlpbm9kZV9kaXJfbm90aWZ5KGlub2RlLCBETl9DUkVBVEUpOwogCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIElOX0NSRUFURSwgMCwgZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCQkgIGRlbnRyeS0+ZF9pbm9kZSk7CiAJYXVkaXRfaW5vZGVfY2hpbGQoZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LCBpbm9kZSk7CisKKwlmc25vdGlmeShpbm9kZSwgRlNfQ1JFQVRFLCBkZW50cnktPmRfaW5vZGUsIEZTTk9USUZZX0VWRU5UX0lOT0RFLCBkZW50cnktPmRfbmFtZS5uYW1lLCAwKTsKIH0KIAogLyoKQEAgLTExNSwxMSArMTU4LDEyIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewotCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOwogCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoZGlyLCBJTl9DUkVBVEUsIDAsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLAogCQkJCSAgaW5vZGUpOwogCWZzbm90aWZ5X2xpbmtfY291bnQoaW5vZGUpOwogCWF1ZGl0X2lub2RlX2NoaWxkKG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCBuZXdfZGVudHJ5LCBkaXIpOworCisJZnNub3RpZnkoZGlyLCBGU19DUkVBVEUsIGlub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIDApOwogfQogCiAvKgpAQCAtMTI3LDEwICsxNzEsMTMgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X21rZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKLQlpbm9kZV9kaXJfbm90aWZ5KGlub2RlLCBETl9DUkVBVEUpOwotCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIElOX0NSRUFURSB8IElOX0lTRElSLCAwLCAKLQkJCQkgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9pbm9kZSk7CisJX191MzIgbWFzayA9IChGU19DUkVBVEUgfCBGU19JTl9JU0RJUik7CisJc3RydWN0IGlub2RlICpkX2lub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgbWFzaywgMCwgZGVudHJ5LT5kX25hbWUubmFtZSwgZF9pbm9kZSk7CiAJYXVkaXRfaW5vZGVfY2hpbGQoZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LCBpbm9kZSk7CisKKwlmc25vdGlmeShpbm9kZSwgbWFzaywgZF9pbm9kZSwgRlNOT1RJRllfRVZFTlRfSU5PREUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIDApOwogfQogCiAvKgpAQCAtMTM5LDE0ICsxODYsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9hY2Nlc3Moc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7Ci0JdTMyIG1hc2sgPSBJTl9BQ0NFU1M7CisJX191MzIgbWFzayA9IEZTX0FDQ0VTUzsKIAogCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQotCQltYXNrIHw9IElOX0lTRElSOworCQltYXNrIHw9IEZTX0lOX0lTRElSOwogCi0JZG5vdGlmeV9wYXJlbnQoZGVudHJ5LCBETl9BQ0NFU1MpOwotCWlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChkZW50cnksIG1hc2ssIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIG1hc2ssIDAsIE5VTEwsIE5VTEwpOworCisJZnNub3RpZnlfcGFyZW50KGRlbnRyeSwgbWFzayk7CisJZnNub3RpZnkoaW5vZGUsIG1hc2ssIGlub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwgTlVMTCwgMCk7CiB9CiAKIC8qCkBAIC0xNTUsMTQgKzIwMywxNSBAQAogc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5X21vZGlmeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQl1MzIgbWFzayA9IElOX01PRElGWTsKKwlfX3UzMiBtYXNrID0gRlNfTU9ESUZZOwogCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCW1hc2sgfD0gSU5fSVNESVI7CisJCW1hc2sgfD0gRlNfSU5fSVNESVI7CiAKLQlkbm90aWZ5X3BhcmVudChkZW50cnksIEROX01PRElGWSk7Ci0JaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRyeSwgbWFzaywgMCwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJaW5vdGlmeV9pbm9kZV9xdWV1ZV9ldmVudChpbm9kZSwgbWFzaywgMCwgTlVMTCwgTlVMTCk7CisKKwlmc25vdGlmeV9wYXJlbnQoZGVudHJ5LCBtYXNrKTsKKwlmc25vdGlmeShpbm9kZSwgbWFzaywgaW5vZGUsIEZTTk9USUZZX0VWRU5UX0lOT0RFLCBOVUxMLCAwKTsKIH0KIAogLyoKQEAgLTE3MSwxMyArMjIwLDE1IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZnNub3RpZnlfb3BlbihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQl1MzIgbWFzayA9IElOX09QRU47CisJX191MzIgbWFzayA9IEZTX09QRU47CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKLQkJbWFzayB8PSBJTl9JU0RJUjsKKwkJbWFzayB8PSBGU19JTl9JU0RJUjsKIAotCWlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChkZW50cnksIG1hc2ssIDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIG1hc2ssIDAsIE5VTEwsIE5VTEwpOworCisJZnNub3RpZnlfcGFyZW50KGRlbnRyeSwgbWFzayk7CisJZnNub3RpZnkoaW5vZGUsIG1hc2ssIGlub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwgTlVMTCwgMCk7CiB9CiAKIC8qCkBAIC0xODcsMTUgKzIzOCwxNiBAQAogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfcGF0aC5kZW50cnk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKIAlmbW9kZV90IG1vZGUgPSBmaWxlLT5mX21vZGU7Ci0JdTMyIG1hc2sgPSAobW9kZSAmIEZNT0RFX1dSSVRFKSA/IElOX0NMT1NFX1dSSVRFIDogSU5fQ0xPU0VfTk9XUklURTsKKwlfX3UzMiBtYXNrID0gKG1vZGUgJiBGTU9ERV9XUklURSkgPyBGU19DTE9TRV9XUklURSA6IEZTX0NMT1NFX05PV1JJVEU7CiAKIAlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKLQkJbWFzayB8PSBJTl9JU0RJUjsKKwkJbWFzayB8PSBGU19JTl9JU0RJUjsKIAotCWlub3RpZnlfZGVudHJ5X3BhcmVudF9xdWV1ZV9ldmVudChkZW50cnksIG1hc2ssIDAsIG5hbWUpOwogCWlub3RpZnlfaW5vZGVfcXVldWVfZXZlbnQoaW5vZGUsIG1hc2ssIDAsIE5VTEwsIE5VTEwpOworCisJZnNub3RpZnlfcGFyZW50KGRlbnRyeSwgbWFzayk7CisJZnNub3RpZnkoaW5vZGUsIG1hc2ssIGZpbGUsIEZTTk9USUZZX0VWRU5UX0ZJTEUsIE5VTEwsIDApOwogfQogCiAvKgpAQCAtMjA0LDEzICsyNTYsMTUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV94YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQl1MzIgbWFzayA9IElOX0FUVFJJQjsKKwlfX3UzMiBtYXNrID0gRlNfQVRUUklCOwogCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCW1hc2sgfD0gSU5fSVNESVI7CisJCW1hc2sgfD0gRlNfSU5fSVNESVI7CiAKLQlpbm90aWZ5X2RlbnRyeV9wYXJlbnRfcXVldWVfZXZlbnQoZGVudHJ5LCBtYXNrLCAwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMLCBOVUxMKTsKKworCWZzbm90aWZ5X3BhcmVudChkZW50cnksIG1hc2spOworCWZzbm90aWZ5KGlub2RlLCBtYXNrLCBpbm9kZSwgRlNOT1RJRllfRVZFTlRfSU5PREUsIE5VTEwsIDApOwogfQogCiAvKgpAQCAtMjIwLDUwICsyNzQsMzcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bnNpZ25lZCBpbnQgaWFfdmFsaWQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKLQlpbnQgZG5fbWFzayA9IDA7Ci0JdTMyIGluX21hc2sgPSAwOworCV9fdTMyIG1hc2sgPSAwOwogCi0JaWYgKGlhX3ZhbGlkICYgQVRUUl9VSUQpIHsKLQkJaW5fbWFzayB8PSBJTl9BVFRSSUI7Ci0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCX0KLQlpZiAoaWFfdmFsaWQgJiBBVFRSX0dJRCkgewotCQlpbl9tYXNrIHw9IElOX0FUVFJJQjsKLQkJZG5fbWFzayB8PSBETl9BVFRSSUI7Ci0JfQotCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkgewotCQlpbl9tYXNrIHw9IElOX01PRElGWTsKLQkJZG5fbWFzayB8PSBETl9NT0RJRlk7Ci0JfQorCWlmIChpYV92YWxpZCAmIEFUVFJfVUlEKQorCQltYXNrIHw9IEZTX0FUVFJJQjsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX0dJRCkKKwkJbWFzayB8PSBGU19BVFRSSUI7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKQorCQltYXNrIHw9IEZTX01PRElGWTsKKwogCS8qIGJvdGggdGltZXMgaW1wbGllcyBhIHV0aW1lKHMpIGNhbGwgKi8KIAlpZiAoKGlhX3ZhbGlkICYgKEFUVFJfQVRJTUUgfCBBVFRSX01USU1FKSkgPT0gKEFUVFJfQVRJTUUgfCBBVFRSX01USU1FKSkKLQl7Ci0JCWluX21hc2sgfD0gSU5fQVRUUklCOwotCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKLQl9IGVsc2UgaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkgewotCQlpbl9tYXNrIHw9IElOX0FDQ0VTUzsKLQkJZG5fbWFzayB8PSBETl9BQ0NFU1M7Ci0JfSBlbHNlIGlmIChpYV92YWxpZCAmIEFUVFJfTVRJTUUpIHsKLQkJaW5fbWFzayB8PSBJTl9NT0RJRlk7Ci0JCWRuX21hc2sgfD0gRE5fTU9ESUZZOwotCX0KLQlpZiAoaWFfdmFsaWQgJiBBVFRSX01PREUpIHsKLQkJaW5fbWFzayB8PSBJTl9BVFRSSUI7Ci0JCWRuX21hc2sgfD0gRE5fQVRUUklCOwotCX0KKwkJbWFzayB8PSBGU19BVFRSSUI7CisJZWxzZSBpZiAoaWFfdmFsaWQgJiBBVFRSX0FUSU1FKQorCQltYXNrIHw9IEZTX0FDQ0VTUzsKKwllbHNlIGlmIChpYV92YWxpZCAmIEFUVFJfTVRJTUUpCisJCW1hc2sgfD0gRlNfTU9ESUZZOwogCi0JaWYgKGRuX21hc2spCi0JCWRub3RpZnlfcGFyZW50KGRlbnRyeSwgZG5fbWFzayk7Ci0JaWYgKGluX21hc2spIHsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX01PREUpCisJCW1hc2sgfD0gRlNfQVRUUklCOworCisJaWYgKG1hc2spIHsKIAkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCi0JCQlpbl9tYXNrIHw9IElOX0lTRElSOwotCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBpbl9tYXNrLCAwLCBOVUxMLCBOVUxMKTsKLQkJaW5vdGlmeV9kZW50cnlfcGFyZW50X3F1ZXVlX2V2ZW50KGRlbnRyeSwgaW5fbWFzaywgMCwKLQkJCQkJCSAgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQltYXNrIHw9IEZTX0lOX0lTRElSOworCQlpbm90aWZ5X2lub2RlX3F1ZXVlX2V2ZW50KGlub2RlLCBtYXNrLCAwLCBOVUxMLCBOVUxMKTsKKworCQlmc25vdGlmeV9wYXJlbnQoZGVudHJ5LCBtYXNrKTsKKwkJZnNub3RpZnkoaW5vZGUsIG1hc2ssIGlub2RlLCBGU05PVElGWV9FVkVOVF9JTk9ERSwgTlVMTCwgMCk7CiAJfQogfQogCi0jaWZkZWYgQ09ORklHX0lOT1RJRlkJLyogaW5vdGlmeSBoZWxwZXJzICovCisjaWYgZGVmaW5lZChDT05GSUdfSU5PVElGWSkgfHwgZGVmaW5lZChDT05GSUdfRlNOT1RJRlkpCS8qIG5vdGlmeSBoZWxwZXJzICovCiAKIC8qCiAgKiBmc25vdGlmeV9vbGRuYW1lX2luaXQgLSBzYXZlIG9mZiB0aGUgb2xkIGZpbGVuYW1lIGJlZm9yZSB3ZSBjaGFuZ2UgaXQKQEAgLTI4MSw3ICszMjIsNyBAQAogCWtmcmVlKG9sZF9uYW1lKTsKIH0KIAotI2Vsc2UJLyogQ09ORklHX0lOT1RJRlkgKi8KKyNlbHNlCS8qIENPTkZJR19JTk9USUZZIHx8IENPTkZJR19GU05PVElGWSAqLwogCiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmZzbm90aWZ5X29sZG5hbWVfaW5pdChjb25zdCBjaGFyICpuYW1lKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mc25vdGlmeV9iYWNrZW5kLmggYi9pbmNsdWRlL2xpbnV4L2Zzbm90aWZ5X2JhY2tlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDg0OGFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9mc25vdGlmeV9iYWNrZW5kLmgKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBGaWxlc3lzdGVtIGFjY2VzcyBub3RpZmljYXRpb24gZm9yIExpbnV4CisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuLCBFcmljIFBhcmlzIDxlcGFyaXNAcmVkaGF0LmNvbT4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfRlNOT1RJRllfQkFDS0VORF9ICisjZGVmaW5lIF9fTElOVVhfRlNOT1RJRllfQkFDS0VORF9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4gLyogaW5vdGlmeSB1c2VzIHRoaXMgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPiAvKiBzdHJ1Y3QgaW5vZGUgKi8KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGF0aC5oPiAvKiBzdHJ1Y3QgcGF0aCAqLworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworLyoKKyAqIElOXyogZnJvbSBpbm90ZnkuaCBsaW5lcyB1cCBFWEFDVExZIHdpdGggRlNfKiwgdGhpcyBpcyBzbyB3ZSBjYW4gZWFzaWx5CisgKiBjb252ZXJ0IGJldHdlZW4gdGhlbS4gIGRub3RpZnkgb25seSBuZWVkcyBjb252ZXJzaW9uIGF0IHdhdGNoIGNyZWF0aW9uCisgKiBzbyBubyBwZXJmIGxvc3MgdGhlcmUuICBmYW5vdGlmeSBpc24ndCBkZWZpbmVkIHlldCwgc28gaXQgY2FuIHVzZSB0aGUKKyAqIHdob2xlcyBpZiBpdCBuZWVkcyBtb3JlIGV2ZW50cy4KKyAqLworI2RlZmluZSBGU19BQ0NFU1MJCTB4MDAwMDAwMDEJLyogRmlsZSB3YXMgYWNjZXNzZWQgKi8KKyNkZWZpbmUgRlNfTU9ESUZZCQkweDAwMDAwMDAyCS8qIEZpbGUgd2FzIG1vZGlmaWVkICovCisjZGVmaW5lIEZTX0FUVFJJQgkJMHgwMDAwMDAwNAkvKiBNZXRhZGF0YSBjaGFuZ2VkICovCisjZGVmaW5lIEZTX0NMT1NFX1dSSVRFCQkweDAwMDAwMDA4CS8qIFdyaXR0YWJsZSBmaWxlIHdhcyBjbG9zZWQgKi8KKyNkZWZpbmUgRlNfQ0xPU0VfTk9XUklURQkweDAwMDAwMDEwCS8qIFVud3JpdHRhYmxlIGZpbGUgY2xvc2VkICovCisjZGVmaW5lIEZTX09QRU4JCQkweDAwMDAwMDIwCS8qIEZpbGUgd2FzIG9wZW5lZCAqLworI2RlZmluZSBGU19NT1ZFRF9GUk9NCQkweDAwMDAwMDQwCS8qIEZpbGUgd2FzIG1vdmVkIGZyb20gWCAqLworI2RlZmluZSBGU19NT1ZFRF9UTwkJMHgwMDAwMDA4MAkvKiBGaWxlIHdhcyBtb3ZlZCB0byBZICovCisjZGVmaW5lIEZTX0NSRUFURQkJMHgwMDAwMDEwMAkvKiBTdWJmaWxlIHdhcyBjcmVhdGVkICovCisjZGVmaW5lIEZTX0RFTEVURQkJMHgwMDAwMDIwMAkvKiBTdWJmaWxlIHdhcyBkZWxldGVkICovCisjZGVmaW5lIEZTX0RFTEVURV9TRUxGCQkweDAwMDAwNDAwCS8qIFNlbGYgd2FzIGRlbGV0ZWQgKi8KKyNkZWZpbmUgRlNfTU9WRV9TRUxGCQkweDAwMDAwODAwCS8qIFNlbGYgd2FzIG1vdmVkICovCisKKyNkZWZpbmUgRlNfVU5NT1VOVAkJMHgwMDAwMjAwMAkvKiBpbm9kZSBvbiB1bW91bnQgZnMgKi8KKyNkZWZpbmUgRlNfUV9PVkVSRkxPVwkJMHgwMDAwNDAwMAkvKiBFdmVudCBxdWV1ZWQgb3ZlcmZsb3dlZCAqLworI2RlZmluZSBGU19JTl9JR05PUkVECQkweDAwMDA4MDAwCS8qIGxhc3QgaW5vdGlmeSBldmVudCBoZXJlICovCisKKyNkZWZpbmUgRlNfSU5fSVNESVIJCTB4NDAwMDAwMDAJLyogZXZlbnQgb2NjdXJyZWQgYWdhaW5zdCBkaXIgKi8KKyNkZWZpbmUgRlNfSU5fT05FU0hPVAkJMHg4MDAwMDAwMAkvKiBvbmx5IHNlbmQgZXZlbnQgb25jZSAqLworCisjZGVmaW5lIEZTX0ROX1JFTkFNRQkJMHgxMDAwMDAwMAkvKiBmaWxlIHJlbmFtZWQgKi8KKyNkZWZpbmUgRlNfRE5fTVVMVElTSE9UCQkweDIwMDAwMDAwCS8qIGRub3RpZnkgbXVsdGlzaG90ICovCisKKy8qIFRoaXMgaW5vZGUgY2FyZXMgYWJvdXQgdGhpbmdzIHRoYXQgaGFwcGVuIHRvIGl0cyBjaGlsZHJlbi4gIEFsd2F5cyBzZXQgZm9yCisgKiBkbm90aWZ5IGFuZCBpbm90aWZ5LiAqLworI2RlZmluZSBGU19FVkVOVF9PTl9DSElMRAkweDA4MDAwMDAwCisKKy8qIFRoaXMgaXMgYSBsaXN0IG9mIGFsbCBldmVudHMgdGhhdCBtYXkgZ2V0IHNlbnQgdG8gYSBwYXJlcm50IGJhc2VkIG9uIGZzIGV2ZW50CisgKiBoYXBwZW5pbmcgdG8gaW5vZGVzIGluc2lkZSB0aGF0IGRpcmVjdG9yeSAqLworI2RlZmluZSBGU19FVkVOVFNfUE9TU19PTl9DSElMRCAgIChGU19BQ0NFU1MgfCBGU19NT0RJRlkgfCBGU19BVFRSSUIgfFwKKwkJCQkgICBGU19DTE9TRV9XUklURSB8IEZTX0NMT1NFX05PV1JJVEUgfCBGU19PUEVOIHxcCisJCQkJICAgRlNfTU9WRURfRlJPTSB8IEZTX01PVkVEX1RPIHwgRlNfQ1JFQVRFIHxcCisJCQkJICAgRlNfREVMRVRFKQorCisvKiBsaXN0ZW5lcnMgdGhhdCBoYXJkIGNvZGUgZ3JvdXAgbnVtYmVycyBuZWFyIHRoZSB0b3AgKi8KKyNkZWZpbmUgRE5PVElGWV9HUk9VUF9OVU0JVUlOVF9NQVgKKyNkZWZpbmUgSU5PVElGWV9HUk9VUF9OVU0JKEROT1RJRllfR1JPVVBfTlVNLTEpCisKK3N0cnVjdCBmc25vdGlmeV9ncm91cDsKK3N0cnVjdCBmc25vdGlmeV9ldmVudDsKK3N0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5Oworc3RydWN0IGZzbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YTsKKworLyoKKyAqIEVhY2ggZ3JvdXAgbXVjaCBkZWZpbmUgdGhlc2Ugb3BzLiAgVGhlIGZzbm90aWZ5IGluZnJhc3RydWN0dXJlIHdpbGwgY2FsbAorICogdGhlc2Ugb3BlcmF0aW9ucyBmb3IgZWFjaCByZWxldmFudCBncm91cC4KKyAqCisgKiBzaG91bGRfc2VuZF9ldmVudCAtIGdpdmVuIGEgZ3JvdXAsIGlub2RlLCBhbmQgbWFzayB0aGlzIGZ1bmN0aW9uIGRldGVybWluZXMKKyAqCQlpZiB0aGUgZ3JvdXAgaXMgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50LgorICogaGFuZGxlX2V2ZW50IC0gbWFpbiBjYWxsIGZvciBhIGdyb3VwIHRvIGhhbmRsZSBhbiBmcyBldmVudAorICogZnJlZV9ncm91cF9wcml2IC0gY2FsbGVkIHdoZW4gYSBncm91cCByZWZjbnQgaGl0cyAwIHRvIGNsZWFuIHVwIHRoZSBwcml2YXRlIHVuaW9uCisgKiBmcmVlaW5nLW1hcmsgLSB0aGlzIG1lYW5zIHRoYXQgYSBtYXJrIGhhcyBiZWVuIGZsYWdnZWQgdG8gZGllIHdoZW4gZXZlcnl0aGluZworICoJCWZpbmlzaGVzIHVzaW5nIGl0LiAgVGhlIGZ1bmN0aW9uIGlzIHN1cHBsaWVkIHdpdGggd2hhdCBtdXN0IGJlIGEKKyAqCQl2YWxpZCBncm91cCBhbmQgaW5vZGUgdG8gdXNlIHRvIGNsZWFuIHVwLgorICovCitzdHJ1Y3QgZnNub3RpZnlfb3BzIHsKKwlib29sICgqc2hvdWxkX3NlbmRfZXZlbnQpKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIF9fdTMyIG1hc2spOworCWludCAoKmhhbmRsZV9ldmVudCkoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCk7CisJdm9pZCAoKmZyZWVfZ3JvdXBfcHJpdikoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CisJdm9pZCAoKmZyZWVpbmdfbWFyaykoc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwKTsKKwl2b2lkICgqZnJlZV9ldmVudF9wcml2KShzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhICpwcml2KTsKK307CisKKy8qCisgKiBBIGdyb3VwIGlzIGEgInRoaW5nIiB0aGF0IHdhbnRzIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIGFib3V0IGZpbGVzeXN0ZW0KKyAqIGV2ZW50cy4gIFRoZSBtYXNrIGhvbGRzIHRoZSBzdWJzZXQgb2YgZXZlbnQgdHlwZXMgdGhpcyBncm91cCBjYXJlcyBhYm91dC4KKyAqIHJlZmNudCBvbiBhIGdyb3VwIGlzIHVwIHRvIHRoZSBpbXBsZW1lbnRvciBhbmQgYXQgYW55IG1vbWVudCBpZiBpdCBnb2VzIDAKKyAqIGV2ZXJ5dGhpbmcgd2lsbCBiZSBjbGVhbmVkIHVwLgorICovCitzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgeworCS8qCisJICogZ2xvYmFsIGxpc3Qgb2YgYWxsIGdyb3VwcyByZWNlaXZpbmcgZXZlbnRzIGZyb20gZnNub3RpZnkuCisJICogYW5jaG9yZWQgYnkgZnNub3RpZnlfZ3JvdXBzIGFuZCBwcm90ZWN0ZWQgYnkgZWl0aGVyIGZzbm90aWZ5X2dycF9tdXRleAorCSAqIG9yIGZzbm90aWZ5X2dycF9zcmN1IGRlcGVuZGluZyBvbiB3cml0ZSB2cyByZWFkLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZ3JvdXBfbGlzdDsKKworCS8qCisJICogRGVmaW5lcyBhbGwgb2YgdGhlIGV2ZW50IHR5cGVzIGluIHdoaWNoIHRoaXMgZ3JvdXAgaXMgaW50ZXJlc3RlZC4KKwkgKiBUaGlzIG1hc2sgaXMgYSBiaXR3aXNlIE9SIG9mIHRoZSBGU18qIGV2ZW50cyBmcm9tIGFib3ZlLiAgRWFjaCB0aW1lCisJICogdGhpcyBtYXNrIGNoYW5nZXMgZm9yIGEgZ3JvdXAgKGlmIGl0IGNoYW5nZXMpIHRoZSBjb3JyZWN0IGZ1bmN0aW9ucworCSAqIG11c3QgYmUgY2FsbGVkIHRvIHVwZGF0ZSB0aGUgZ2xvYmFsIHN0cnVjdHVyZXMgd2hpY2ggaW5kaWNhdGUgZ2xvYmFsCisJICogaW50ZXJlc3QgaW4gZXZlbnQgdHlwZXMuCisJICovCisJX191MzIgbWFzazsKKworCS8qCisJICogSG93IHRoZSByZWZjbnQgaXMgdXNlZCBpcyB1cCB0byBlYWNoIGdyb3VwLiAgV2hlbiB0aGUgcmVmY250IGhpdHMgMAorCSAqIGZzbm90aWZ5IHdpbGwgY2xlYW4gdXAgYWxsIG9mIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZ3JvdXAuCisJICogQXMgYW4gZXhhbXBsZSwgdGhlIGRub3RpZnkgZ3JvdXAgd2lsbCBhbHdheXMgaGF2ZSBhIHJlZmNudD0xIGFuZCB0aGF0CisJICogd2lsbCBuZXZlciBjaGFuZ2UuICBJbm90aWZ5LCBvbiB0aGUgb3RoZXIgaGFuZCwgaGFzIGEgZ3JvdXAgcGVyCisJICogaW5vdGlmeV9pbml0KCkgYW5kIHRoZSByZWZjbnQgd2lsbCBoaXQgMCBvbmx5IHdoZW4gdGhhdCBmZCBoYXMgYmVlbgorCSAqIGNsb3NlZC4KKwkgKi8KKwlhdG9taWNfdCByZWZjbnQ7CQkvKiB0aGluZ3Mgd2l0aCBpbnRlcmVzdCBpbiB0aGlzIGdyb3VwICovCisJdW5zaWduZWQgaW50IGdyb3VwX251bTsJCS8qIHNpbXBseSBwcmV2ZW50cyBhY2NpZGVudGFsIGdyb3VwIGNvbGxpc2lvbiAqLworCisJY29uc3Qgc3RydWN0IGZzbm90aWZ5X29wcyAqb3BzOwkvKiBob3cgdGhpcyBncm91cCBoYW5kbGVzIHRoaW5ncyAqLworCisJLyogbmVlZGVkIHRvIHNlbmQgbm90aWZpY2F0aW9uIHRvIHVzZXJzcGFjZSAqLworCXN0cnVjdCBtdXRleCBub3RpZmljYXRpb25fbXV0ZXg7CS8qIHByb3RlY3QgdGhlIG5vdGlmaWNhdGlvbl9saXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBub3RpZmljYXRpb25fbGlzdDsJLyogbGlzdCBvZiBldmVudF9ob2xkZXIgdGhpcyBncm91cCBuZWVkcyB0byBzZW5kIHRvIHVzZXJzcGFjZSAqLworCXdhaXRfcXVldWVfaGVhZF90IG5vdGlmaWNhdGlvbl93YWl0cTsJLyogcmVhZCgpIG9uIHRoZSBub3RpZmljYXRpb24gZmlsZSBibG9ja3Mgb24gdGhpcyB3YWl0cSAqLworCXVuc2lnbmVkIGludCBxX2xlbjsJCQkvKiBldmVudHMgb24gdGhlIHF1ZXVlICovCisJdW5zaWduZWQgaW50IG1heF9ldmVudHM7CQkvKiBtYXhpbXVtIGV2ZW50cyBhbGxvd2VkIG9uIHRoZSBsaXN0ICovCisKKwkvKiBzdG9yZXMgYWxsIGZhc3RhcHRoIGVudHJpZXMgYXNzb2Mgd2l0aCB0aGlzIGdyb3VwIHNvIHRoZXkgY2FuIGJlIGNsZWFuZWQgb24gdW5yZWdpc3RlciAqLworCXNwaW5sb2NrX3QgbWFya19sb2NrOwkJLyogcHJvdGVjdCBtYXJrX2VudHJpZXMgbGlzdCAqLworCWF0b21pY190IG51bV9tYXJrczsJCS8qIDEgZm9yIGVhY2ggbWFyayBlbnRyeSBhbmQgMSBmb3Igbm90IGJlaW5nCisJCQkJCSAqIHBhc3QgdGhlIHBvaW50IG9mIG5vIHJldHVybiB3aGVuIGZyZWVpbmcKKwkJCQkJICogYSBncm91cCAqLworCXN0cnVjdCBsaXN0X2hlYWQgbWFya19lbnRyaWVzOwkvKiBhbGwgaW5vZGUgbWFyayBlbnRyaWVzIGZvciB0aGlzIGdyb3VwICovCisKKwkvKiBwcmV2ZW50cyBkb3VibGUgbGlzdF9kZWwgb2YgZ3JvdXBfbGlzdC4gIHByb3RlY3RlZCBieSBnbG9iYWwgZnNub3RpZnlfZ3JwX211dGV4ICovCisJYm9vbCBvbl9ncm91cF9saXN0OworCisJLyogZ3JvdXBzIGNhbiBkZWZpbmUgcHJpdmF0ZSBmaWVsZHMgaGVyZSBvciB1c2UgdGhlIHZvaWQgKnByaXZhdGUgKi8KKwl1bmlvbiB7CisJCXZvaWQgKnByaXZhdGU7CisjaWZkZWYgQ09ORklHX0lOT1RJRllfVVNFUgorCQlzdHJ1Y3QgaW5vdGlmeV9ncm91cF9wcml2YXRlX2RhdGEgeworCQkJc3BpbmxvY2tfdAlpZHJfbG9jazsKKwkJCXN0cnVjdCBpZHIgICAgICBpZHI7CisJCQl1MzIgICAgICAgICAgICAgbGFzdF93ZDsKKwkJCXN0cnVjdCBmYXN5bmNfc3RydWN0ICAgICpmYTsgICAgLyogYXN5bmMgbm90aWZpY2F0aW9uICovCisJCQlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgICAgICAqdXNlcjsKKwkJfSBpbm90aWZ5X2RhdGE7CisjZW5kaWYKKwl9OworfTsKKworLyoKKyAqIEEgc2luZ2xlIGV2ZW50IGNhbiBiZSBxdWV1ZWQgaW4gbXVsdGlwbGUgZ3JvdXAtPm5vdGlmaWNhdGlvbl9saXN0cy4KKyAqCisgKiBlYWNoIGdyb3VwLT5ub3RpZmljYXRpb25fbGlzdCB3aWxsIHBvaW50IHRvIGFuIGV2ZW50X2hvbGRlciB3aGljaCBpbiB0dXJucyBwb2ludHMKKyAqIHRvIHRoZSBhY3R1YWwgZXZlbnQgdGhhdCBuZWVkcyB0byBiZSBzZW50IHRvIHVzZXJzcGFjZS4KKyAqCisgKiBTZWVtZWQgY2hlYXBlciB0byBjcmVhdGUgYSByZWZjbnQnZCBldmVudCBhbmQgYSBzbWFsbCBob2xkZXIgZm9yIGV2ZXJ5IGdyb3VwCisgKiB0aGFuIGNyZWF0ZSBhIGRpZmZlcmVudCBldmVudCBmb3IgZXZlcnkgZ3JvdXAKKyAqCisgKi8KK3N0cnVjdCBmc25vdGlmeV9ldmVudF9ob2xkZXIgeworCXN0cnVjdCBmc25vdGlmeV9ldmVudCAqZXZlbnQ7CisJc3RydWN0IGxpc3RfaGVhZCBldmVudF9saXN0OworfTsKKworLyoKKyAqIElub3RpZnkgbmVlZHMgdG8gdGFjayBkYXRhIG9udG8gYW4gZXZlbnQuICBUaGlzIHN0cnVjdCBsZXRzIHVzIGxhdGVyIGZpbmQgdGhlCisgKiBjb3JyZWN0IHByaXZhdGUgZGF0YSBvZiB0aGUgY29ycmVjdCBncm91cC4KKyAqLworc3RydWN0IGZzbm90aWZ5X2V2ZW50X3ByaXZhdGVfZGF0YSB7CisJc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGV2ZW50X2xpc3Q7Cit9OworCisvKgorICogYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgb2JqZWN0IHdlIHdhbnQgdG8gbm93IHNlbmQgdG8KKyAqIGEgZ3JvdXAuICBJZiB5b3Ugd2FudCB0byBjYXJyeSBtb3JlIGluZm8gZnJvbSB0aGUgYWNjZXNzaW5nIHRhc2sgdG8gdGhlCisgKiBsaXN0ZW5lciB0aGlzIHN0cnVjdHVyZSBpcyB3aGVyZSB5b3UgbmVlZCB0byBiZSBhZGRpbmcgZmllbGRzLgorICovCitzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgeworCS8qCisJICogSWYgd2UgY3JlYXRlIGFuIGV2ZW50IHdlIGFyZSBhbHNvIGxpa2VseSBnb2luZyB0byBuZWVkIGEgaG9sZGVyCisJICogdG8gbGluayB0byBhIGdyb3VwLiAgU28gZW1iZWQgb25lIGhvbGRlciBpbiB0aGUgZXZlbnQuICBNZWFucyBvbmx5CisJICogb25lIGFsbG9jYXRpb24gZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSB3ZSBvbmx5IGhhdmUgb25lIGdyb3VwCisJICovCisJc3RydWN0IGZzbm90aWZ5X2V2ZW50X2hvbGRlciBob2xkZXI7CisJc3BpbmxvY2tfdCBsb2NrOwkvKiBwcm90ZWN0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBldmVudF9ob2xkZXIgYW5kIHByaXZhdGVfbGlzdCAqLworCS8qIHRvX3RlbGwgbWF5IE9OTFkgYmUgZGVyZWZlcmVuY2VkIGR1cmluZyBoYW5kbGVfZXZlbnQoKS4gKi8KKwlzdHJ1Y3QgaW5vZGUgKnRvX3RlbGw7CS8qIGVpdGhlciB0aGUgaW5vZGUgdGhlIGV2ZW50IGhhcHBlbmVkIHRvIG9yIGl0cyBwYXJlbnQgKi8KKwkvKgorCSAqIGRlcGVuZGluZyBvbiB0aGUgZXZlbnQgdHlwZSB3ZSBzaG91bGQgaGF2ZSBlaXRoZXIgYSBwYXRoIG9yIGlub2RlCisJICogV2UgaG9sZCBhIHJlZmVyZW5jZSBvbiBwYXRoLCBidXQgTk9UIG9uIGlub2RlLiAgU2luY2Ugd2UgaGF2ZSB0aGUgcmVmIG9uCisJICogdGhlIHBhdGgsIGl0IG1heSBiZSBkZXJlZmVyZW5jZWQgYXQgYW55IHBvaW50IGR1cmluZyB0aGlzIG9iamVjdCdzCisJICogbGlmZXRpbWUuICBUaGF0IHJlZmVyZW5jZSBpcyBkcm9wcGVkIHdoZW4gdGhpcyBvYmplY3QncyByZWZjbnQgaGl0cworCSAqIDAuICBJZiB0aGlzIGV2ZW50IGNvbnRhaW5zIGFuIGlub2RlIGluc3RlYWQgb2YgYSBwYXRoLCB0aGUgaW5vZGUgbWF5CisJICogT05MWSBiZSB1c2VkIGR1cmluZyBoYW5kbGVfZXZlbnQoKS4KKwkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBwYXRoIHBhdGg7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJfTsKKy8qIHdoZW4gY2FsbGluZyBmc25vdGlmeSB0ZWxsIGl0IGlmIHRoZSBkYXRhIGlzIGEgcGF0aCBvciBpbm9kZSAqLworI2RlZmluZSBGU05PVElGWV9FVkVOVF9OT05FCTAKKyNkZWZpbmUgRlNOT1RJRllfRVZFTlRfUEFUSAkxCisjZGVmaW5lIEZTTk9USUZZX0VWRU5UX0lOT0RFCTIKKyNkZWZpbmUgRlNOT1RJRllfRVZFTlRfRklMRQkzCisJaW50IGRhdGFfdHlwZTsJCS8qIHdoaWNoIG9mIHRoZSBhYm92ZSB1bmlvbiB3ZSBoYXZlICovCisJYXRvbWljX3QgcmVmY250OwkvKiBob3cgbWFueSBncm91cHMgc3RpbGwgYXJlIHVzaW5nL25lZWQgdG8gc2VuZCB0aGlzIGV2ZW50ICovCisJX191MzIgbWFzazsJCS8qIHRoZSB0eXBlIG9mIGFjY2VzcywgYml0d2lzZSBPUiBmb3IgRlNfKiBldmVudCB0eXBlcyAqLworCisJdTMyIHN5bmNfY29va2llOwkvKiB1c2VkIHRvIGNvcnJvbGF0ZSBldmVudHMsIG5hbWVseSBpbm90aWZ5IG12IGV2ZW50cyAqLworCWNoYXIgKmZpbGVfbmFtZTsKKwlzaXplX3QgbmFtZV9sZW47CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHByaXZhdGVfZGF0YV9saXN0OwkvKiBncm91cHMgY2FuIHN0b3JlIHByaXZhdGUgZGF0YSBoZXJlICovCit9OworCisvKgorICogYSBtYXJrIGlzIHNpbXBseSBhbiBlbnRyeSBhdHRhY2hlZCB0byBhbiBpbiBjb3JlIGlub2RlIHdoaWNoIGFsbG93cyBhbgorICogZnNub3RpZnkgbGlzdGVuZXIgdG8gaW5kaWNhdGUgdGhleSBhcmUgZWl0aGVyIG5vIGxvbmdlciBpbnRlcmVzdGVkIGluIGV2ZW50cworICogb2YgYSB0eXBlIG1hdGNoaW5nIG1hc2sgb3Igb25seSBpbnRlcmVzdGVkIGluIHRob3NlIGV2ZW50cy4KKyAqCisgKiB0aGVzZSBhcmUgZmx1c2hlZCB3aGVuIGFuIGlub2RlIGlzIGV2aWN0ZWQgZnJvbSBjb3JlIGFuZCBtYXkgYmUgZmx1c2hlZAorICogd2hlbiB0aGUgaW5vZGUgaXMgbW9kaWZpZWQgKGFzIHNlZW4gYnkgZnNub3RpZnlfYWNjZXNzKS4gIFNvbWUgZnNub3RpZnkgdXNlcnMKKyAqIChzdWNoIGFzIGRub3RpZnkpIHdpbGwgZmx1c2ggdGhlc2Ugd2hlbiB0aGUgb3BlbiBmZCBpcyBjbG9zZWQgYW5kIG5vdCBhdAorICogaW5vZGUgZXZpY3Rpb24gb3IgbW9kaWZpY2F0aW9uLgorICovCitzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSB7CisJX191MzIgbWFzazsJCQkvKiBtYXNrIHRoaXMgbWFyayBlbnRyeSBpcyBmb3IgKi8KKwkvKiB3ZSBob2xkIHJlZiBmb3IgZWFjaCBpX2xpc3QgYW5kIGdfbGlzdC4gIGFsc28gb25lIHJlZiBmb3IgZWFjaCAndGhpbmcnCisJICogaW4ga2VybmVsIHRoYXQgZm91bmQgYW5kIG1heSBiZSB1c2luZyB0aGlzIG1hcmsuICovCisJYXRvbWljX3QgcmVmY250OwkJLyogYWN0aXZlIHRoaW5ncyBsb29raW5nIGF0IHRoaXMgbWFyayAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CQkvKiBpbm9kZSB0aGlzIGVudHJ5IGlzIGFzc29jaWF0ZWQgd2l0aCAqLworCXN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXA7CS8qIGdyb3VwIHRoaXMgbWFyayBlbnRyeSBpcyBmb3IgKi8KKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBpX2xpc3Q7CS8qIGxpc3Qgb2YgbWFya19lbnRyaWVzIGJ5IGlub2RlLT5pX2Zzbm90aWZ5X21hcmtfZW50cmllcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZ19saXN0OwkvKiBsaXN0IG9mIG1hcmtfZW50cmllcyBieSBncm91cC0+aV9mc25vdGlmeV9tYXJrX2VudHJpZXMgKi8KKwlzcGlubG9ja190IGxvY2s7CQkvKiBwcm90ZWN0IGdyb3VwLCBpbm9kZSwgYW5kIGtpbGxtZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9pX2xpc3Q7CS8qIHRtcCBsaXN0IHVzZWQgd2hlbiBmcmVlaW5nIHRoaXMgbWFyayAqLworCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9nX2xpc3Q7CS8qIHRtcCBsaXN0IHVzZWQgd2hlbiBmcmVlaW5nIHRoaXMgbWFyayAqLworCXZvaWQgKCpmcmVlX21hcmspKHN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeSk7IC8qIGNhbGxlZCBvbiBmaW5hbCBwdXQrZnJlZSAqLworfTsKKworI2lmZGVmIENPTkZJR19GU05PVElGWQorCisvKiBjYWxsZWQgZnJvbSB0aGUgdmZzIGhlbHBlcnMgKi8KKworLyogbWFpbiBmc25vdGlmeSBjYWxsIHRvIHNlbmQgZXZlbnRzICovCitleHRlcm4gdm9pZCBmc25vdGlmeShzdHJ1Y3QgaW5vZGUgKnRvX3RlbGwsIF9fdTMyIG1hc2ssIHZvaWQgKmRhdGEsIGludCBkYXRhX2lzLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBjb29raWUpOworZXh0ZXJuIHZvaWQgX19mc25vdGlmeV9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiBtYXNrKTsKK2V4dGVybiB2b2lkIF9fZnNub3RpZnlfaW5vZGVfZGVsZXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHUzMiBmc25vdGlmeV9nZXRfY29va2llKHZvaWQpOworCitzdGF0aWMgaW5saW5lIGludCBmc25vdGlmeV9pbm9kZV93YXRjaGVzX2NoaWxkcmVuKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyogRlNfRVZFTlRfT05fQ0hJTEQgaXMgc2V0IGlmIHRoZSBpbm9kZSBtYXkgY2FyZSAqLworCWlmICghKGlub2RlLT5pX2Zzbm90aWZ5X21hc2sgJiBGU19FVkVOVF9PTl9DSElMRCkpCisJCXJldHVybiAwOworCS8qIHRoaXMgaW5vZGUgbWlnaHQgY2FyZSBhYm91dCBjaGlsZCBldmVudHMsIGRvZXMgaXQgY2FyZSBhYm91dCB0aGUKKwkgKiBzcGVjaWZpYyBzZXQgb2YgZXZlbnRzIHRoYXQgY2FuIGhhcHBlbiBvbiBhIGNoaWxkPyAqLworCXJldHVybiBpbm9kZS0+aV9mc25vdGlmeV9tYXNrICYgRlNfRVZFTlRTX1BPU1NfT05fQ0hJTEQ7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIGRlbnRyeSB3aXRoIGEgZmxhZyBpbmRpY2F0aW5nIHRoZSBpbnRlcmVzdCBvZiBpdHMgcGFyZW50IHRvIHJlY2VpdmUKKyAqIGZpbGVzeXN0ZW0gZXZlbnRzIHdoZW4gdGhvc2UgZXZlbnRzIGhhcHBlbnMgdG8gdGhpcyBkZW50cnktPmRfaW5vZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Zzbm90aWZ5X3VwZGF0ZV9kY2FjaGVfZmxhZ3Moc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmZGNhY2hlX2xvY2spOworCWFzc2VydF9zcGluX2xvY2tlZCgmZGVudHJ5LT5kX2xvY2spOworCisJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwlpZiAoZnNub3RpZnlfaW5vZGVfd2F0Y2hlc19jaGlsZHJlbihwYXJlbnQtPmRfaW5vZGUpKQorCQlkZW50cnktPmRfZmxhZ3MgfD0gRENBQ0hFX0ZTTk9USUZZX1BBUkVOVF9XQVRDSEVEOworCWVsc2UKKwkJZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfRlNOT1RJRllfUEFSRU5UX1dBVENIRUQ7Cit9CisKKy8qCisgKiBmc25vdGlmeV9kX2luc3RhbnRpYXRlIC0gaW5zdGFudGlhdGUgYSBkZW50cnkgZm9yIGlub2RlCisgKiBDYWxsZWQgd2l0aCBkY2FjaGVfbG9jayBoZWxkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19mc25vdGlmeV9kX2luc3RhbnRpYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIWlub2RlKQorCQlyZXR1cm47CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRjYWNoZV9sb2NrKTsKKworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCV9fZnNub3RpZnlfdXBkYXRlX2RjYWNoZV9mbGFncyhkZW50cnkpOworCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7Cit9CisKKy8qIGNhbGxlZCBmcm9tIGZzbm90aWZ5IGxpc3RlbmVycywgc3VjaCBhcyBmYW5vdGlmeSBvciBkbm90aWZ5ICovCisKKy8qIG11c3QgY2FsbCB3aGVuIGEgZ3JvdXAgY2hhbmdlcyBpdHMgLT5tYXNrICovCitleHRlcm4gdm9pZCBmc25vdGlmeV9yZWNhbGNfZ2xvYmFsX21hc2sodm9pZCk7CisvKiBnZXQgYSByZWZlcmVuY2UgdG8gYW4gZXhpc3Rpbmcgb3IgY3JlYXRlIGEgbmV3IGdyb3VwICovCitleHRlcm4gc3RydWN0IGZzbm90aWZ5X2dyb3VwICpmc25vdGlmeV9vYnRhaW5fZ3JvdXAodW5zaWduZWQgaW50IGdyb3VwX251bSwKKwkJCQkJCSAgICBfX3UzMiBtYXNrLAorCQkJCQkJICAgIGNvbnN0IHN0cnVjdCBmc25vdGlmeV9vcHMgKm9wcyk7CisvKiBydW4gYWxsIG1hcmtzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGdyb3VwIGFuZCB1cGRhdGUgZ3JvdXAtPm1hc2sgKi8KK2V4dGVybiB2b2lkIGZzbm90aWZ5X3JlY2FsY19ncm91cF9tYXNrKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOworLyogZHJvcCByZWZlcmVuY2Ugb24gYSBncm91cCBmcm9tIGZzbm90aWZ5X29idGFpbl9ncm91cCAqLworZXh0ZXJuIHZvaWQgZnNub3RpZnlfcHV0X2dyb3VwKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOworCisvKiB0YWtlIGEgcmVmZXJlbmNlIHRvIGFuIGV2ZW50ICovCitleHRlcm4gdm9pZCBmc25vdGlmeV9nZXRfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCk7CitleHRlcm4gdm9pZCBmc25vdGlmeV9wdXRfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCk7CisvKiBmaW5kIHByaXZhdGUgZGF0YSBwcmV2aW91c2x5IGF0dGFjaGVkIHRvIGFuIGV2ZW50IGFuZCB1bmxpbmsgaXQgKi8KK2V4dGVybiBzdHJ1Y3QgZnNub3RpZnlfZXZlbnRfcHJpdmF0ZV9kYXRhICpmc25vdGlmeV9yZW1vdmVfcHJpdl9mcm9tX2V2ZW50KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsCisJCQkJCQkJCQkgICBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmV2ZW50KTsKKworLyogYXR0YWNoIHRoZSBldmVudCB0byB0aGUgZ3JvdXAgbm90aWZpY2F0aW9uIHF1ZXVlICovCitleHRlcm4gaW50IGZzbm90aWZ5X2FkZF9ub3RpZnlfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCwgc3RydWN0IGZzbm90aWZ5X2V2ZW50ICpldmVudCwKKwkJCQkgICAgIHN0cnVjdCBmc25vdGlmeV9ldmVudF9wcml2YXRlX2RhdGEgKnByaXYpOworLyogdHJ1ZSBpZiB0aGUgZ3JvdXAgbm90aWZpY2F0aW9uIHF1ZXVlIGlzIGVtcHR5ICovCitleHRlcm4gYm9vbCBmc25vdGlmeV9ub3RpZnlfcXVldWVfaXNfZW1wdHkoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CisvKiByZXR1cm4sIGJ1dCBkbyBub3QgZGVxdWV1ZSB0aGUgZmlyc3QgZXZlbnQgb24gdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZSAqLworZXh0ZXJuIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZnNub3RpZnlfcGVla19ub3RpZnlfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CisvKiByZXR1cm4gQU5EIGRlcXVldWUgdGhlIGZpcnN0IGV2ZW50IG9uIHRoZSBub3RpZmljYXRpb24gcXVldWUgKi8KK2V4dGVybiBzdHJ1Y3QgZnNub3RpZnlfZXZlbnQgKmZzbm90aWZ5X3JlbW92ZV9ub3RpZnlfZXZlbnQoc3RydWN0IGZzbm90aWZ5X2dyb3VwICpncm91cCk7CisKKy8qIGZ1bmN0aW9ucyB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIG1hcmtzIGF0dGFjaGVkIHRvIGlub2RlcyAqLworCisvKiBydW4gYWxsIG1hcmtzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbm9kZSBhbmQgdXBkYXRlIGlub2RlLT5pX2Zzbm90aWZ5X21hc2sgKi8KK2V4dGVybiB2b2lkIGZzbm90aWZ5X3JlY2FsY19pbm9kZV9tYXNrKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgZnNub3RpZnlfaW5pdF9tYXJrKHN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeSwgdm9pZCAoKmZyZWVfbWFyaykoc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5KSk7CisvKiBmaW5kIChhbmQgdGFrZSBhIHJlZmVyZW5jZSkgdG8gYSBtYXJrIGFzc29jaWF0ZWQgd2l0aCBncm91cCBhbmQgaW5vZGUgKi8KK2V4dGVybiBzdHJ1Y3QgZnNub3RpZnlfbWFya19lbnRyeSAqZnNub3RpZnlfZmluZF9tYXJrX2VudHJ5KHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXAsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOworLyogYXR0YWNoIHRoZSBtYXJrIHRvIGJvdGggdGhlIGdyb3VwIGFuZCB0aGUgaW5vZGUgKi8KK2V4dGVybiBpbnQgZnNub3RpZnlfYWRkX21hcmsoc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5LCBzdHJ1Y3QgZnNub3RpZnlfZ3JvdXAgKmdyb3VwLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKy8qIGdpdmVuIGEgbWFyaywgZmxhZyBpdCB0byBiZSBmcmVlZCB3aGVuIGFsbCByZWZlcmVuY2VzIGFyZSBkcm9wcGVkICovCitleHRlcm4gdm9pZCBmc25vdGlmeV9kZXN0cm95X21hcmtfYnlfZW50cnkoc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5KTsKKy8qIHJ1biBhbGwgdGhlIG1hcmtzIGluIGEgZ3JvdXAsIGFuZCBmbGFnIHRoZW0gdG8gYmUgZnJlZWQgKi8KK2V4dGVybiB2b2lkIGZzbm90aWZ5X2NsZWFyX21hcmtzX2J5X2dyb3VwKHN0cnVjdCBmc25vdGlmeV9ncm91cCAqZ3JvdXApOworZXh0ZXJuIHZvaWQgZnNub3RpZnlfZ2V0X21hcmsoc3RydWN0IGZzbm90aWZ5X21hcmtfZW50cnkgKmVudHJ5KTsKK2V4dGVybiB2b2lkIGZzbm90aWZ5X3B1dF9tYXJrKHN0cnVjdCBmc25vdGlmeV9tYXJrX2VudHJ5ICplbnRyeSk7CitleHRlcm4gdm9pZCBmc25vdGlmeV91bm1vdW50X2lub2RlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKKworLyogcHV0IGhlcmUgYmVjYXVzZSBpbm90aWZ5IGRvZXMgc29tZSB3ZWlyZCBzdHVmZiB3aGVuIGRlc3Ryb3lpbmcgd2F0Y2hlcyAqLworZXh0ZXJuIHN0cnVjdCBmc25vdGlmeV9ldmVudCAqZnNub3RpZnlfY3JlYXRlX2V2ZW50KHN0cnVjdCBpbm9kZSAqdG9fdGVsbCwgX191MzIgbWFzaywKKwkJCQkJCSAgICB2b2lkICpkYXRhLCBpbnQgZGF0YV9pcywgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSAgICB1MzIgY29va2llKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB2b2lkIGZzbm90aWZ5KHN0cnVjdCBpbm9kZSAqdG9fdGVsbCwgX191MzIgbWFzaywgdm9pZCAqZGF0YSwgaW50IGRhdGFfaXMsCisJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgdTMyIGNvb2tpZSkKK3t9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Zzbm90aWZ5X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTMyIG1hc2spCit7fQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19mc25vdGlmeV9pbm9kZV9kZWxldGUoc3RydWN0IGlub2RlICppbm9kZSkKK3t9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Zzbm90aWZ5X3VwZGF0ZV9kY2FjaGVfZmxhZ3Moc3RydWN0IGRlbnRyeSAqZGVudHJ5KQore30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZnNub3RpZnlfZF9pbnN0YW50aWF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7fQorCitzdGF0aWMgaW5saW5lIHUzMiBmc25vdGlmeV9nZXRfY29va2llKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmc25vdGlmeV91bm1vdW50X2lub2RlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQore30KKworI2VuZGlmCS8qIENPTkZJR19GU05PVElGWSAqLworCisjZW5kaWYJLyogX19LRVJORUwgX18gKi8KKworI2VuZGlmCS8qIF9fTElOVVhfRlNOT1RJRllfQkFDS0VORF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9mdHJhY2UuaAppbmRleCA4YTBjMmYyLi4zOWI5NWM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKQEAgLTIzMyw4ICsyMzMsNiBAQAogCiBleHRlcm4gaW50IHNraXBfdHJhY2UodW5zaWduZWQgbG9uZyBpcCk7CiAKLWV4dGVybiB2b2lkIGZ0cmFjZV9yZWxlYXNlKHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwotCiBleHRlcm4gdm9pZCBmdHJhY2VfZGlzYWJsZV9kYWVtb24odm9pZCk7CiBleHRlcm4gdm9pZCBmdHJhY2VfZW5hYmxlX2RhZW1vbih2b2lkKTsKICNlbHNlCkBAIC0zMjUsMTMgKzMyMyw4IEBACiAKICNpZmRlZiBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQKIGV4dGVybiB2b2lkIGZ0cmFjZV9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgZnRyYWNlX2luaXRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nICpzdGFydCwgdW5zaWduZWQgbG9uZyAqZW5kKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX2luaXQodm9pZCkgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQKLWZ0cmFjZV9pbml0X21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsCi0JCSAgIHVuc2lnbmVkIGxvbmcgKnN0YXJ0LCB1bnNpZ25lZCBsb25nICplbmQpIHsgfQogI2VuZGlmCiAKIC8qCkBAIC0zNjgsNiArMzYxLDcgQEAKIAl1bnNpZ25lZCBsb25nIHJldDsKIAl1bnNpZ25lZCBsb25nIGZ1bmM7CiAJdW5zaWduZWQgbG9uZyBsb25nIGNhbGx0aW1lOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdWJ0aW1lOwogfTsKIAogLyoKQEAgLTM3OSw4ICszNzMsNiBAQAogCiBleHRlcm4gaW50CiBmdHJhY2VfcHVzaF9yZXR1cm5fdHJhY2UodW5zaWduZWQgbG9uZyByZXQsIHVuc2lnbmVkIGxvbmcgZnVuYywgaW50ICpkZXB0aCk7Ci1leHRlcm4gdm9pZAotZnRyYWNlX3BvcF9yZXR1cm5fdHJhY2Uoc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXQgKnRyYWNlLCB1bnNpZ25lZCBsb25nICpyZXQpOwogCiAvKgogICogU29tZXRpbWVzIHdlIGRvbid0IHdhbnQgdG8gdHJhY2UgYSBmdW5jdGlvbiB3aXRoIHRoZSBmdW5jdGlvbgpAQCAtNDk2LDggKzQ4OCwxNSBAQAogCiBleHRlcm4gaW50IGZ0cmFjZV9kdW1wX29uX29vcHM7CiAKKyNpZmRlZiBDT05GSUdfUFJFRU1QVAorI2RlZmluZSBJTklUX1RSQUNFX1JFQ1VSU0lPTgkJLnRyYWNlX3JlY3Vyc2lvbiA9IDAsCisjZW5kaWYKKwogI2VuZGlmIC8qIENPTkZJR19UUkFDSU5HICovCiAKKyNpZm5kZWYgSU5JVF9UUkFDRV9SRUNVUlNJT04KKyNkZWZpbmUgSU5JVF9UUkFDRV9SRUNVUlNJT04KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hXX0JSQU5DSF9UUkFDRVIKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwOTNmZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKQEAgLTAsMCArMSwxNzIgQEAKKyNpZm5kZWYgX0xJTlVYX0ZUUkFDRV9FVkVOVF9ICisjZGVmaW5lIF9MSU5VWF9GVFJBQ0VfRVZFTlRfSAorCisjaW5jbHVkZSA8bGludXgvdHJhY2Vfc2VxLmg+CisjaW5jbHVkZSA8bGludXgvcmluZ19idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKworc3RydWN0IHRyYWNlX2FycmF5Oworc3RydWN0IHRyYWNlcjsKK3N0cnVjdCBkZW50cnk7CisKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgdHJhY2Vfc2VxLCBmdHJhY2VfZXZlbnRfc2VxKTsKKworc3RydWN0IHRyYWNlX3ByaW50X2ZsYWdzIHsKKwl1bnNpZ25lZCBsb25nCQltYXNrOworCWNvbnN0IGNoYXIJCSpuYW1lOworfTsKKworY29uc3QgY2hhciAqZnRyYWNlX3ByaW50X2ZsYWdzX3NlcShzdHJ1Y3QgdHJhY2Vfc2VxICpwLCBjb25zdCBjaGFyICpkZWxpbSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCSAgIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyAqZmxhZ19hcnJheSk7CisKK2NvbnN0IGNoYXIgKmZ0cmFjZV9wcmludF9zeW1ib2xzX3NlcShzdHJ1Y3QgdHJhY2Vfc2VxICpwLCB1bnNpZ25lZCBsb25nIHZhbCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyAqc3ltYm9sX2FycmF5KTsKKworLyoKKyAqIFRoZSB0cmFjZSBlbnRyeSAtIHRoZSBtb3N0IGJhc2ljIHVuaXQgb2YgdHJhY2luZy4gVGhpcyBpcyB3aGF0CisgKiBpcyBwcmludGVkIGluIHRoZSBlbmQgYXMgYSBzaW5nbGUgbGluZSBpbiB0aGUgdHJhY2Ugb3V0cHV0LCBzdWNoIGFzOgorICoKKyAqICAgICBiYXNoLTE1ODE2IFswMV0gICAyMzUuMTk3NTg1OiBpZGxlX2NwdSA8LSBpcnFfZW50ZXIKKyAqLworc3RydWN0IHRyYWNlX2VudHJ5IHsKKwl1bnNpZ25lZCBzaG9ydAkJdHlwZTsKKwl1bnNpZ25lZCBjaGFyCQlmbGFnczsKKwl1bnNpZ25lZCBjaGFyCQlwcmVlbXB0X2NvdW50OworCWludAkJCXBpZDsKKwlpbnQJCQl0Z2lkOworfTsKKworI2RlZmluZSBGVFJBQ0VfTUFYX0VWRU5UCQkJCQkJXAorCSgoMSA8PCAoc2l6ZW9mKCgoc3RydWN0IHRyYWNlX2VudHJ5ICopMCktPnR5cGUpICogOCkpIC0gMSkKKworLyoKKyAqIFRyYWNlIGl0ZXJhdG9yIC0gdXNlZCBieSBwcmludG91dCByb3V0aW5lcyB3aG8gcHJlc2VudCB0cmFjZQorICogcmVzdWx0cyB0byB1c2VycyBhbmQgd2hpY2ggcm91dGluZXMgbWlnaHQgc2xlZXAsIGV0YzoKKyAqLworc3RydWN0IHRyYWNlX2l0ZXJhdG9yIHsKKwlzdHJ1Y3QgdHJhY2VfYXJyYXkJKnRyOworCXN0cnVjdCB0cmFjZXIJCSp0cmFjZTsKKwl2b2lkCQkJKnByaXZhdGU7CisJaW50CQkJY3B1X2ZpbGU7CisJc3RydWN0IG11dGV4CQltdXRleDsKKwlzdHJ1Y3QgcmluZ19idWZmZXJfaXRlcgkqYnVmZmVyX2l0ZXJbTlJfQ1BVU107CisJdW5zaWduZWQgbG9uZwkJaXRlcl9mbGFnczsKKworCS8qIFRoZSBiZWxvdyBpcyB6ZXJvZWQgb3V0IGluIHBpcGVfcmVhZCAqLworCXN0cnVjdCB0cmFjZV9zZXEJc2VxOworCXN0cnVjdCB0cmFjZV9lbnRyeQkqZW50OworCWludAkJCWNwdTsKKwl1NjQJCQl0czsKKworCWxvZmZfdAkJCXBvczsKKwlsb25nCQkJaWR4OworCisJY3B1bWFza192YXJfdAkJc3RhcnRlZDsKK307CisKKwordHlwZWRlZiBlbnVtIHByaW50X2xpbmVfdCAoKnRyYWNlX3ByaW50X2Z1bmMpKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwKKwkJCQkJICAgICAgaW50IGZsYWdzKTsKK3N0cnVjdCB0cmFjZV9ldmVudCB7CisJc3RydWN0IGhsaXN0X25vZGUJbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJaW50CQkJdHlwZTsKKwl0cmFjZV9wcmludF9mdW5jCXRyYWNlOworCXRyYWNlX3ByaW50X2Z1bmMJcmF3OworCXRyYWNlX3ByaW50X2Z1bmMJaGV4OworCXRyYWNlX3ByaW50X2Z1bmMJYmluYXJ5OworfTsKKworZXh0ZXJuIGludCByZWdpc3Rlcl9mdHJhY2VfZXZlbnQoc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCk7CitleHRlcm4gaW50IHVucmVnaXN0ZXJfZnRyYWNlX2V2ZW50KHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpOworCisvKiBSZXR1cm4gdmFsdWVzIGZvciBwcmludF9saW5lIGNhbGxiYWNrICovCitlbnVtIHByaW50X2xpbmVfdCB7CisJVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkUJPSAwLAkvKiBSZXRyeSBhZnRlciBmbHVzaGluZyB0aGUgc2VxICovCisJVFJBQ0VfVFlQRV9IQU5ETEVECT0gMSwKKwlUUkFDRV9UWVBFX1VOSEFORExFRAk9IDIsCS8qIFJlbGF5IHRvIG90aGVyIG91dHB1dCBmdW5jdGlvbnMgKi8KKwlUUkFDRV9UWVBFX05PX0NPTlNVTUUJPSAzCS8qIEhhbmRsZWQgYnV0IGFzayB0byBub3QgY29uc3VtZSAqLworfTsKKworCitzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKgordHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYyk7Cit2b2lkIHRyYWNlX2N1cnJlbnRfYnVmZmVyX3VubG9ja19jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCwKKwkJCQkJdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKTsKK3ZvaWQgdHJhY2Vfbm93YWtlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYyk7Cit2b2lkIHRyYWNlX2N1cnJlbnRfYnVmZmVyX2Rpc2NhcmRfY29tbWl0KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpOworCit2b2lkIHRyYWNpbmdfcmVjb3JkX2NtZGxpbmUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCitzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwljaGFyCQkJKm5hbWU7CisJY2hhcgkJCSpzeXN0ZW07CisJc3RydWN0IGRlbnRyeQkJKmRpcjsKKwlzdHJ1Y3QgdHJhY2VfZXZlbnQJKmV2ZW50OworCWludAkJCWVuYWJsZWQ7CisJaW50CQkJKCpyZWdmdW5jKSh2b2lkKTsKKwl2b2lkCQkJKCp1bnJlZ2Z1bmMpKHZvaWQpOworCWludAkJCWlkOworCWludAkJCSgqcmF3X2luaXQpKHZvaWQpOworCWludAkJCSgqc2hvd19mb3JtYXQpKHN0cnVjdCB0cmFjZV9zZXEgKnMpOworCWludAkJCSgqZGVmaW5lX2ZpZWxkcykodm9pZCk7CisJc3RydWN0IGxpc3RfaGVhZAlmaWVsZHM7CisJaW50CQkJZmlsdGVyX2FjdGl2ZTsKKwl2b2lkCQkJKmZpbHRlcjsKKwl2b2lkCQkJKm1vZDsKKworI2lmZGVmIENPTkZJR19FVkVOVF9QUk9GSUxFCisJYXRvbWljX3QJcHJvZmlsZV9jb3VudDsKKwlpbnQJCSgqcHJvZmlsZV9lbmFibGUpKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqKTsKKwl2b2lkCQkoKnByb2ZpbGVfZGlzYWJsZSkoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICopOworI2VuZGlmCit9OworCisjZGVmaW5lIE1BWF9GSUxURVJfUFJFRAkJMzIKKyNkZWZpbmUgTUFYX0ZJTFRFUl9TVFJfVkFMCTEyOAorCitleHRlcm4gaW50IGluaXRfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKTsKK2V4dGVybiB2b2lkIGRlc3Ryb3lfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKTsKK2V4dGVybiBpbnQgZmlsdGVyX21hdGNoX3ByZWRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgdm9pZCAqcmVjKTsKK2V4dGVybiBpbnQgZmlsdGVyX2N1cnJlbnRfY2hlY2tfZGlzY2FyZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCisJCQkJCXZvaWQgKnJlYywKKwkJCQkJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCk7CisKK2V4dGVybiBpbnQgdHJhY2VfZGVmaW5lX2ZpZWxkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgY2hhciAqdHlwZSwKKwkJCSAgICAgIGNoYXIgKm5hbWUsIGludCBvZmZzZXQsIGludCBzaXplLCBpbnQgaXNfc2lnbmVkKTsKKworI2RlZmluZSBpc19zaWduZWRfdHlwZSh0eXBlKQkoKCh0eXBlKSgtMSkpIDwgMCkKKworaW50IHRyYWNlX3NldF9jbHJfZXZlbnQoY29uc3QgY2hhciAqc3lzdGVtLCBjb25zdCBjaGFyICpldmVudCwgaW50IHNldCk7CisKKy8qCisgKiBUaGUgZG91YmxlIF9fYnVpbHRpbl9jb25zdGFudF9wIGlzIGJlY2F1c2UgZ2NjIHdpbGwgZ2l2ZSB1cyBhbiBlcnJvcgorICogaWYgd2UgdHJ5IHRvIGFsbG9jYXRlIHRoZSBzdGF0aWMgdmFyaWFibGUgdG8gZm10IGlmIGl0IGlzIG5vdCBhCisgKiBjb25zdGFudC4gRXZlbiB3aXRoIHRoZSBvdXRlciBpZiBzdGF0ZW1lbnQgb3B0aW1pemluZyBvdXQuCisgKi8KKyNkZWZpbmUgZXZlbnRfdHJhY2VfcHJpbnRrKGlwLCBmbXQsIGFyZ3MuLi4pCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJX190cmFjZV9wcmludGtfY2hlY2tfZm9ybWF0KGZtdCwgIyNhcmdzKTsJCQlcCisJdHJhY2luZ19yZWNvcmRfY21kbGluZShjdXJyZW50KTsJCQkJXAorCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChmbXQpKSB7CQkJCVwKKwkJc3RhdGljIGNvbnN0IGNoYXIgKnRyYWNlX3ByaW50a19mbXQJCQlcCisJCSAgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX190cmFjZV9wcmludGtfZm10IikpKSA9CVwKKwkJCV9fYnVpbHRpbl9jb25zdGFudF9wKGZtdCkgPyBmbXQgOiBOVUxMOwkJXAorCQkJCQkJCQkJXAorCQlfX3RyYWNlX2JwcmludGsoaXAsIHRyYWNlX3ByaW50a19mbXQsICMjYXJncyk7CQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCV9fdHJhY2VfcHJpbnRrKGlwLCBmbXQsICMjYXJncyk7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBfX2NvbW1vbl9maWVsZCh0eXBlLCBpdGVtLCBpc19zaWduZWQpCQkJCVwKKwlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgI3R5cGUsICJjb21tb25fIiAjaXRlbSwJXAorCQkJCSBvZmZzZXRvZih0eXBlb2YoZmllbGQuZW50KSwgaXRlbSksCVwKKwkJCQkgc2l6ZW9mKGZpZWxkLmVudC5pdGVtKSwgaXNfc2lnbmVkKTsJXAorCWlmIChyZXQpCQkJCQkJCVwKKwkJcmV0dXJuIHJldDsKKworI2VuZGlmIC8qIF9MSU5VWF9GVFJBQ0VfRVZFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdXRleC5oIGIvaW5jbHVkZS9saW51eC9mdXRleC5oCmluZGV4IDNiZjViYjUuLjM0OTU2YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnV0ZXguaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKQEAgLTIzLDYgKzIzLDggQEAKICNkZWZpbmUgRlVURVhfVFJZTE9DS19QSQk4CiAjZGVmaW5lIEZVVEVYX1dBSVRfQklUU0VUCTkKICNkZWZpbmUgRlVURVhfV0FLRV9CSVRTRVQJMTAKKyNkZWZpbmUgRlVURVhfV0FJVF9SRVFVRVVFX1BJCTExCisjZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFX1BJCTEyCiAKICNkZWZpbmUgRlVURVhfUFJJVkFURV9GTEFHCTEyOAogI2RlZmluZSBGVVRFWF9DTE9DS19SRUFMVElNRQkyNTYKQEAgLTM4LDYgKzQwLDEwIEBACiAjZGVmaW5lIEZVVEVYX1RSWUxPQ0tfUElfUFJJVkFURSAoRlVURVhfVFJZTE9DS19QSSB8IEZVVEVYX1BSSVZBVEVfRkxBRykKICNkZWZpbmUgRlVURVhfV0FJVF9CSVRTRVRfUFJJVkFURQkoRlVURVhfV0FJVF9CSVRTIHwgRlVURVhfUFJJVkFURV9GTEFHKQogI2RlZmluZSBGVVRFWF9XQUtFX0JJVFNFVF9QUklWQVRFCShGVVRFWF9XQUtFX0JJVFMgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX1dBSVRfUkVRVUVVRV9QSV9QUklWQVRFCShGVVRFWF9XQUlUX1JFUVVFVUVfUEkgfCBcCisJCQkJCSBGVVRFWF9QUklWQVRFX0ZMQUcpCisjZGVmaW5lIEZVVEVYX0NNUF9SRVFVRVVFX1BJX1BSSVZBVEUJKEZVVEVYX0NNUF9SRVFVRVVFX1BJIHwgXAorCQkJCQkgRlVURVhfUFJJVkFURV9GTEFHKQogCiAvKgogICogU3VwcG9ydCBmb3Igcm9idXN0IGZ1dGV4ZXM6IHRoZSBrZXJuZWwgY2xlYW5zIHVwIGhlbGQgZnV0ZXhlcyBhdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZW5oZC5oIGIvaW5jbHVkZS9saW51eC9nZW5oZC5oCmluZGV4IGExYTI4Y2EuLjE0OWZkYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2VuaGQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dlbmhkLmgKQEAgLTkwLDYgKzkwLDcgQEAKIHN0cnVjdCBoZF9zdHJ1Y3QgewogCXNlY3Rvcl90IHN0YXJ0X3NlY3Q7CiAJc2VjdG9yX3QgbnJfc2VjdHM7CisJc2VjdG9yX3QgYWxpZ25tZW50X29mZnNldDsKIAlzdHJ1Y3QgZGV2aWNlIF9fZGV2OwogCXN0cnVjdCBrb2JqZWN0ICpob2xkZXJfZGlyOwogCWludCBwb2xpY3ksIHBhcnRubzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWRlLmggYi9pbmNsdWRlL2xpbnV4L2lkZS5oCmluZGV4IDlmZWQzNjUuLjg2N2NiNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZGUuaApAQCAtMjYsNiArMjYsOSBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tdXRleC5oPgogCisvKiBmb3IgcmVxdWVzdF9zZW5zZSAqLworI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisKICNpZiBkZWZpbmVkKENPTkZJR19DUklTKSB8fCBkZWZpbmVkKENPTkZJR19GUlYpIHx8IGRlZmluZWQoQ09ORklHX01OMTAzMDApCiAjIGRlZmluZSBTVVBQT1JUX1ZMQl9TWU5DIDAKICNlbHNlCkBAIC0zMjQsNyArMzI3LDYgQEAKIAl1bnNpZ25lZCBpbnQJCWN1cnNnX29mczsKIAogCXN0cnVjdCByZXF1ZXN0CQkqcnE7CQkvKiBjb3B5IG9mIHJlcXVlc3QgKi8KLQl2b2lkCQkJKnNwZWNpYWw7CS8qIHZhbGlkX3QgZ2VuZXJhbGx5ICovCiB9OwogCiAvKiBBVEFQSSBwYWNrZXQgY29tbWFuZCBmbGFncyAqLwpAQCAtMzYwLDExICszNjIsNyBAQAogCiAJLyogZGF0YSBidWZmZXIgKi8KIAl1OCAqYnVmOwotCS8qIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICovCi0JdTggKmN1cl9wb3M7CiAJaW50IGJ1Zl9zaXplOwotCS8qIG1pc3NpbmcvYXZhaWxhYmxlIGRhdGEgb24gdGhlIGN1cnJlbnQgYnVmZmVyICovCi0JaW50IGJfY291bnQ7CiAKIAkvKiB0aGUgY29ycmVzcG9uZGluZyByZXF1ZXN0ICovCiAJc3RydWN0IHJlcXVlc3QgKnJxOwpAQCAtMzc3LDEwICszNzUsNiBAQAogCSAqLwogCXU4IHBjX2J1ZltJREVfUENfQlVGRkVSX1NJWkVdOwogCi0JLyogaWRldGFwZSBvbmx5ICovCi0Jc3RydWN0IGlkZXRhcGVfYmggKmJoOwotCWNoYXIgKmJfZGF0YTsKLQogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIH07CiAKQEAgLTU5MywxNiArNTg3LDE2IEBACiAJLyogY2FsbGJhY2sgZm9yIHBhY2tldCBjb21tYW5kcyAqLwogCWludCAgKCpwY19jYWxsYmFjaykoc3RydWN0IGlkZV9kcml2ZV9zICosIGludCk7CiAKLQl2b2lkICgqcGNfdXBkYXRlX2J1ZmZlcnMpKHN0cnVjdCBpZGVfZHJpdmVfcyAqLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICopOwotCWludCAgKCpwY19pb19idWZmZXJzKShzdHJ1Y3QgaWRlX2RyaXZlX3MgKiwgc3RydWN0IGlkZV9hdGFwaV9wYyAqLAotCQkJICAgICAgdW5zaWduZWQgaW50LCBpbnQpOwotCiAJaWRlX3N0YXJ0c3RvcF90ICgqaXJxX2hhbmRsZXIpKHN0cnVjdCBpZGVfZHJpdmVfcyAqKTsKIAogCXVuc2lnbmVkIGxvbmcgYXRhcGlfZmxhZ3M7CiAKIAlzdHJ1Y3QgaWRlX2F0YXBpX3BjIHJlcXVlc3Rfc2Vuc2VfcGM7Ci0Jc3RydWN0IHJlcXVlc3QgcmVxdWVzdF9zZW5zZV9ycTsKKworCS8qIGN1cnJlbnQgc2Vuc2UgcnEgYW5kIGJ1ZmZlciAqLworCWJvb2wgc2Vuc2VfcnFfYXJtZWQ7CisJc3RydWN0IHJlcXVlc3Qgc2Vuc2VfcnE7CisJc3RydWN0IHJlcXVlc3Rfc2Vuc2Ugc2Vuc2VfZGF0YTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IGlkZV9kcml2ZV9zIGlkZV9kcml2ZV90OwpAQCAtMTE3NCw3ICsxMTY4LDEwIEBACiBpbnQgaWRlX2RvX3N0YXJ0X3N0b3AoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwgaW50KTsKIGludCBpZGVfc2V0X21lZGlhX2xvY2soaWRlX2RyaXZlX3QgKiwgc3RydWN0IGdlbmRpc2sgKiwgaW50KTsKIHZvaWQgaWRlX2NyZWF0ZV9yZXF1ZXN0X3NlbnNlX2NtZChpZGVfZHJpdmVfdCAqLCBzdHJ1Y3QgaWRlX2F0YXBpX3BjICopOwotdm9pZCBpZGVfcmV0cnlfcGMoaWRlX2RyaXZlX3QgKiwgc3RydWN0IGdlbmRpc2sgKik7Cit2b2lkIGlkZV9yZXRyeV9wYyhpZGVfZHJpdmVfdCAqZHJpdmUpOworCit2b2lkIGlkZV9wcmVwX3NlbnNlKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKTsKK2ludCBpZGVfcXVldWVfc2Vuc2VfcnEoaWRlX2RyaXZlX3QgKmRyaXZlLCB2b2lkICpzcGVjaWFsKTsKIAogaW50IGlkZV9jZF9leHBpcnkoaWRlX2RyaXZlX3QgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW1hLmggYi9pbmNsdWRlL2xpbnV4L2ltYS5oCmluZGV4IDBlMmFhNDUuLmIxYjgyN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW1hLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbWEuaApAQCAtMTMsMTQgKzEzLDE3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIHN0cnVjdCBsaW51eF9iaW5wcm07CiAKKyNkZWZpbmUgSU1BX0NPVU5UX1VQREFURSAxCisjZGVmaW5lIElNQV9DT1VOVF9MRUFWRSAwCisKICNpZmRlZiBDT05GSUdfSU1BCiBleHRlcm4gaW50IGltYV9icHJtX2NoZWNrKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pOwogZXh0ZXJuIGludCBpbWFfaW5vZGVfYWxsb2Moc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gdm9pZCBpbWFfaW5vZGVfZnJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKLWV4dGVybiBpbnQgaW1hX3BhdGhfY2hlY2soc3RydWN0IHBhdGggKnBhdGgsIGludCBtYXNrKTsKK2V4dGVybiBpbnQgaW1hX3BhdGhfY2hlY2soc3RydWN0IHBhdGggKnBhdGgsIGludCBtYXNrLCBpbnQgdXBkYXRlX2NvdW50cyk7CiBleHRlcm4gdm9pZCBpbWFfZmlsZV9mcmVlKHN0cnVjdCBmaWxlICpmaWxlKTsKIGV4dGVybiBpbnQgaW1hX2ZpbGVfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBwcm90KTsKLWV4dGVybiB2b2lkIGltYV9zaG1fY2hlY2soc3RydWN0IGZpbGUgKmZpbGUpOworZXh0ZXJuIHZvaWQgaW1hX2NvdW50c19nZXQoc3RydWN0IGZpbGUgKmZpbGUpOwogCiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgaW1hX2Jwcm1fY2hlY2soc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKQEAgLTM4LDcgKzQxLDcgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGltYV9wYXRoX2NoZWNrKHN0cnVjdCBwYXRoICpwYXRoLCBpbnQgbWFzaykKK3N0YXRpYyBpbmxpbmUgaW50IGltYV9wYXRoX2NoZWNrKHN0cnVjdCBwYXRoICpwYXRoLCBpbnQgbWFzaywgaW50IHVwZGF0ZV9jb3VudHMpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC01Myw3ICs1Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbWFfc2htX2NoZWNrKHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGlubGluZSB2b2lkIGltYV9jb3VudHNfZ2V0KHN0cnVjdCBmaWxlICpmaWxlKQogewogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IGQ4NzI0N2QuLjI4YjFmMzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaApAQCAtMTA4LDYgKzEwOCwxNSBAQAogCiBleHRlcm4gc3RydWN0IGNyZWQgaW5pdF9jcmVkOwogCisjaWZkZWYgQ09ORklHX1BFUkZfQ09VTlRFUlMKKyMgZGVmaW5lIElOSVRfUEVSRl9DT1VOVEVSUyh0c2spCQkJCQlcCisJLnBlcmZfY291bnRlcl9tdXRleCA9IAkJCQkJCVwKKwkJIF9fTVVURVhfSU5JVElBTElaRVIodHNrLnBlcmZfY291bnRlcl9tdXRleCksCQlcCisJLnBlcmZfY291bnRlcl9saXN0ID0gTElTVF9IRUFEX0lOSVQodHNrLnBlcmZfY291bnRlcl9saXN0KSwKKyNlbHNlCisjIGRlZmluZSBJTklUX1BFUkZfQ09VTlRFUlModHNrKQorI2VuZGlmCisKIC8qCiAgKiAgSU5JVF9UQVNLIGlzIHVzZWQgdG8gc2V0IHVwIHRoZSBmaXJzdCB0YXNrIHRhYmxlLCB0b3VjaCBhdAogICogeW91ciBvd24gcmlzayEuIEJhc2U9MCwgbGltaXQ9MHgxZmZmZmYgKD0yTUIpCkBAIC0xNDUsOCArMTU0LDggQEAKIAkuZ3JvdXBfbGVhZGVyCT0gJnRzaywJCQkJCQlcCiAJLnJlYWxfY3JlZAk9ICZpbml0X2NyZWQsCQkJCQlcCiAJLmNyZWQJCT0gJmluaXRfY3JlZCwJCQkJCVwKLQkuY3JlZF9leGVjX211dGV4ID0JCQkJCQlcCi0JCSBfX01VVEVYX0lOSVRJQUxJWkVSKHRzay5jcmVkX2V4ZWNfbXV0ZXgpLAkJXAorCS5jcmVkX2d1YXJkX211dGV4ID0JCQkJCQlcCisJCSBfX01VVEVYX0lOSVRJQUxJWkVSKHRzay5jcmVkX2d1YXJkX211dGV4KSwJCVwKIAkuY29tbQkJPSAic3dhcHBlciIsCQkJCQlcCiAJLnRocmVhZAkJPSBJTklUX1RIUkVBRCwJCQkJCVwKIAkuZnMJCT0gJmluaXRfZnMsCQkJCQlcCkBAIC0xNzEsOSArMTgwLDExIEBACiAJfSwJCQkJCQkJCVwKIAkuZGlydGllcyA9IElOSVRfUFJPUF9MT0NBTF9TSU5HTEUoZGlydGllcyksCQkJXAogCUlOSVRfSURTCQkJCQkJCVwKKwlJTklUX1BFUkZfQ09VTlRFUlModHNrKQkJCQkJCVwKIAlJTklUX1RSQUNFX0lSUUZMQUdTCQkJCQkJXAogCUlOSVRfTE9DS0RFUAkJCQkJCQlcCiAJSU5JVF9GVFJBQ0VfR1JBUEgJCQkJCQlcCisJSU5JVF9UUkFDRV9SRUNVUlNJT04JCQkJCQlcCiB9CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggOTFiYjc2Zi4uZmYzNzRjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC01NjYsNiArNTY2LDYgQEAKIGV4dGVybiBpbnQgZWFybHlfaXJxX2luaXQodm9pZCk7CiBleHRlcm4gaW50IGFyY2hfcHJvYmVfbnJfaXJxcyh2b2lkKTsKIGV4dGVybiBpbnQgYXJjaF9lYXJseV9pcnFfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgYXJjaF9pbml0X2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUpOworZXh0ZXJuIGludCBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW9jb250ZXh0LmggYi9pbmNsdWRlL2xpbnV4L2lvY29udGV4dC5oCmluZGV4IDA4Yjk4N2IuLmRkMDU0MzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pb2NvbnRleHQuaApAQCAtNjQsNyArNjQsNyBAQAogICogYW5kIGttYWxsb2MnZWQuIFRoZXNlIGNvdWxkIGJlIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3Nlcy4KICAqLwogc3RydWN0IGlvX2NvbnRleHQgewotCWF0b21pY190IHJlZmNvdW50OworCWF0b21pY19sb25nX3QgcmVmY291bnQ7CiAJYXRvbWljX3QgbnJfdGFza3M7CiAKIAkvKiBhbGwgdGhlIGZpZWxkcyBiZWxvdyBhcmUgcHJvdGVjdGVkIGJ5IHRoaXMgbG9jayAqLwpAQCAtOTEsOCArOTEsOCBAQAogCSAqIGlmIHJlZiBjb3VudCBpcyB6ZXJvLCBkb24ndCBhbGxvdyBzaGFyaW5nIChpb2MgaXMgZ29pbmcgYXdheSwgaXQncwogCSAqIGEgcmFjZSkuCiAJICovCi0JaWYgKGlvYyAmJiBhdG9taWNfaW5jX25vdF96ZXJvKCZpb2MtPnJlZmNvdW50KSkgewotCQlhdG9taWNfaW5jKCZpb2MtPm5yX3Rhc2tzKTsKKwlpZiAoaW9jICYmIGF0b21pY19sb25nX2luY19ub3RfemVybygmaW9jLT5yZWZjb3VudCkpIHsKKwkJYXRvbWljX2xvbmdfaW5jKCZpb2MtPnJlZmNvdW50KTsKIAkJcmV0dXJuIGlvYzsKIAl9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IGI3Y2JlZWQuLjFlNTBjMzRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaXJxLmgKQEAgLTExNyw3ICsxMTcsNyBAQAogCXZvaWQJCSgqZW9pKSh1bnNpZ25lZCBpbnQgaXJxKTsKIAogCXZvaWQJCSgqZW5kKSh1bnNpZ25lZCBpbnQgaXJxKTsKLQl2b2lkCQkoKnNldF9hZmZpbml0eSkodW5zaWduZWQgaW50IGlycSwKKwlpbnQJCSgqc2V0X2FmZmluaXR5KSh1bnNpZ25lZCBpbnQgaXJxLAogCQkJCQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCk7CiAJaW50CQkoKnJldHJpZ2dlcikodW5zaWduZWQgaW50IGlycSk7CiAJaW50CQkoKnNldF90eXBlKSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZmxvd190eXBlKTsKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXNwaW5sb2NrX3QJCWxvY2s7CiAjaWZkZWYgQ09ORklHX1NNUAogCWNwdW1hc2tfdmFyX3QJCWFmZmluaXR5OwotCXVuc2lnbmVkIGludAkJY3B1OworCXVuc2lnbmVkIGludAkJbm9kZTsKICNpZmRlZiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUQogCWNwdW1hc2tfdmFyX3QJCXBlbmRpbmdfbWFzazsKICNlbmRpZgpAQCAtMjAxLDI2ICsyMDEsMjMgQEAKIH0gX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcDsKIAogZXh0ZXJuIHZvaWQgYXJjaF9pbml0X2NvcHlfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsCi0JCQkJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSk7CisJCQkJCXN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpOwogZXh0ZXJuIHZvaWQgYXJjaF9mcmVlX2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpOwogCiAjaWZuZGVmIENPTkZJR19TUEFSU0VfSVJRCiBleHRlcm4gc3RydWN0IGlycV9kZXNjIGlycV9kZXNjW05SX0lSUVNdOwotI2Vsc2UgLyogQ09ORklHX1NQQVJTRV9JUlEgKi8KLWV4dGVybiBzdHJ1Y3QgaXJxX2Rlc2MgKm1vdmVfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpvbGRfZGVzYywgaW50IGNwdSk7Ci0jZW5kaWYgLyogQ09ORklHX1NQQVJTRV9JUlEgKi8KLQotZXh0ZXJuIHN0cnVjdCBpcnFfZGVzYyAqaXJxX3RvX2Rlc2NfYWxsb2NfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpOwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpcnFfZGVzYyAqCi1pcnFfcmVtYXBfdG9fZGVzYyh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0jaWZkZWYgQ09ORklHX05VTUFfTUlHUkFURV9JUlFfREVTQwotCXJldHVybiBpcnFfdG9fZGVzYyhpcnEpOwotI2Vsc2UKLQlyZXR1cm4gZGVzYzsKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX05VTUFfSVJRX0RFU0MKK2V4dGVybiBzdHJ1Y3QgaXJxX2Rlc2MgKm1vdmVfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpvbGRfZGVzYywgaW50IG5vZGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlycV9kZXNjICptb3ZlX2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpCit7CisJcmV0dXJuIGRlc2M7CiB9CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBpcnFfZGVzYyAqaXJxX3RvX2Rlc2NfYWxsb2Nfbm9kZSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgbm9kZSk7CiAKIC8qCiAgKiBNaWdyYXRpb24gaGVscGVycyBmb3Igb2Jzb2xldGUgbmFtZXMsIHRoZXkgd2lsbCBnbyBhd2F5OgpAQCAtMzg2LDcgKzM4Myw3IEBACiBleHRlcm4gdm9pZCBzZXRfaXJxX3Byb2JlKHVuc2lnbmVkIGludCBpcnEpOwogCiAvKiBIYW5kbGUgZHluYW1pYyBpcnEgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uICovCi1leHRlcm4gdW5zaWduZWQgaW50IGNyZWF0ZV9pcnFfbnIodW5zaWduZWQgaW50IGlycV93YW50KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgY3JlYXRlX2lycV9ucih1bnNpZ25lZCBpbnQgaXJxX3dhbnQsIGludCBub2RlKTsKIGV4dGVybiBpbnQgY3JlYXRlX2lycSh2b2lkKTsKIGV4dGVybiB2b2lkIGRlc3Ryb3lfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCkBAIC00MjQsNDcgKzQyMSw0NCBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogLyoqCi0gKiBpbml0X2FsbG9jX2Rlc2NfbWFza3MgLSBhbGxvY2F0ZSBjcHVtYXNrcyBmb3IgaXJxX2Rlc2MKKyAqIGFsbG9jX2Rlc2NfbWFza3MgLSBhbGxvY2F0ZSBjcHVtYXNrcyBmb3IgaXJxX2Rlc2MKICAqIEBkZXNjOglwb2ludGVyIHRvIGlycV9kZXNjIHN0cnVjdAogICogQGNwdToJY3B1IHdoaWNoIHdpbGwgYmUgaGFuZGxpbmcgdGhlIGNwdW1hc2tzCiAgKiBAYm9vdDoJdHJ1ZSBpZiBuZWVkIGJvb3RtZW0KICAqCiAgKiBBbGxvY2F0ZXMgYWZmaW5pdHkgYW5kIHBlbmRpbmdfbWFzayBjcHVtYXNrIGlmIHJlcXVpcmVkLgogICogUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwgKG9yIG5vdCByZXF1aXJlZCkuCi0gKiBTaWRlIGVmZmVjdDogYWZmaW5pdHkgaGFzIGFsbCBiaXRzIHNldCwgcGVuZGluZ19tYXNrIGhhcyBhbGwgYml0cyBjbGVhci4KICAqLwotc3RhdGljIGlubGluZSBib29sIGluaXRfYWxsb2NfZGVzY19tYXNrcyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUsCi0JCQkJCQkJCWJvb2wgYm9vdCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBhbGxvY19kZXNjX21hc2tzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUsCisJCQkJCQkJYm9vbCBib290KQogewotCWludCBub2RlOworCWdmcF90IGdmcCA9IEdGUF9BVE9NSUM7CiAKLQlpZiAoYm9vdCkgewotCQlhbGxvY19ib290bWVtX2NwdW1hc2tfdmFyKCZkZXNjLT5hZmZpbml0eSk7Ci0JCWNwdW1hc2tfc2V0YWxsKGRlc2MtPmFmZmluaXR5KTsKKwlpZiAoYm9vdCkKKwkJZ2ZwID0gR0ZQX05PV0FJVDsKIAotI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCi0JCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJmRlc2MtPnBlbmRpbmdfbWFzayk7Ci0JCWNwdW1hc2tfY2xlYXIoZGVzYy0+cGVuZGluZ19tYXNrKTsKLSNlbmRpZgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKLQotCWlmICghYWxsb2NfY3B1bWFza192YXJfbm9kZSgmZGVzYy0+YWZmaW5pdHksIEdGUF9BVE9NSUMsIG5vZGUpKQorI2lmZGVmIENPTkZJR19DUFVNQVNLX09GRlNUQUNLCisJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcl9ub2RlKCZkZXNjLT5hZmZpbml0eSwgZ2ZwLCBub2RlKSkKIAkJcmV0dXJuIGZhbHNlOwotCWNwdW1hc2tfc2V0YWxsKGRlc2MtPmFmZmluaXR5KTsKIAogI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCi0JaWYgKCFhbGxvY19jcHVtYXNrX3Zhcl9ub2RlKCZkZXNjLT5wZW5kaW5nX21hc2ssIEdGUF9BVE9NSUMsIG5vZGUpKSB7CisJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcl9ub2RlKCZkZXNjLT5wZW5kaW5nX21hc2ssIGdmcCwgbm9kZSkpIHsKIAkJZnJlZV9jcHVtYXNrX3ZhcihkZXNjLT5hZmZpbml0eSk7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JY3B1bWFza19jbGVhcihkZXNjLT5wZW5kaW5nX21hc2spOworI2VuZGlmCiAjZW5kaWYKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGluaXRfZGVzY19tYXNrcyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJY3B1bWFza19zZXRhbGwoZGVzYy0+YWZmaW5pdHkpOworI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCisJY3B1bWFza19jbGVhcihkZXNjLT5wZW5kaW5nX21hc2spOworI2VuZGlmCit9CisKIC8qKgogICogaW5pdF9jb3B5X2Rlc2NfbWFza3MgLSBjb3B5IGNwdW1hc2tzIGZvciBpcnFfZGVzYwogICogQG9sZF9kZXNjOglwb2ludGVyIHRvIG9sZCBpcnFfZGVzYyBzdHJ1Y3QKQEAgLTQ3OCw3ICs0NzIsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGluaXRfY29weV9kZXNjX21hc2tzKHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsCiAJCQkJCXN0cnVjdCBpcnFfZGVzYyAqbmV3X2Rlc2MpCiB7Ci0jaWZkZWYgQ09ORklHX0NQVU1BU0tTX09GRlNUQUNLCisjaWZkZWYgQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0sKIAljcHVtYXNrX2NvcHkobmV3X2Rlc2MtPmFmZmluaXR5LCBvbGRfZGVzYy0+YWZmaW5pdHkpOwogCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEKQEAgLTQ5OSwxMiArNDkzLDE2IEBACiAKICNlbHNlIC8qICFDT05GSUdfU01QICovCiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpbml0X2FsbG9jX2Rlc2NfbWFza3Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1LAorc3RhdGljIGlubGluZSBib29sIGFsbG9jX2Rlc2NfbWFza3Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSwKIAkJCQkJCQkJYm9vbCBib290KQogewogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9kZXNjX21hc2tzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKK30KKwogc3RhdGljIGlubGluZSB2b2lkIGluaXRfY29weV9kZXNjX21hc2tzKHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsCiAJCQkJCXN0cnVjdCBpcnFfZGVzYyAqbmV3X2Rlc2MpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmgKaW5kZXggMGM4Yjg5Zi4uYTc3YzYwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaApAQCAtODEsNyArODEsMTIgQEAKIAlyZXR1cm4gc3VtOwogfQogCisKKy8qCisgKiBMb2NrL3VubG9jayB0aGUgY3VycmVudCBydW5xdWV1ZSAtIHRvIGV4dHJhY3QgdGFzayBzdGF0aXN0aWNzOgorICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIHRhc2tfZGVsdGFfZXhlYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CisKIGV4dGVybiB2b2lkIGFjY291bnRfdXNlcl90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBjcHV0aW1lX3QsIGNwdXRpbWVfdCk7CiBleHRlcm4gdm9pZCBhY2NvdW50X3N5c3RlbV90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBpbnQsIGNwdXRpbWVfdCwgY3B1dGltZV90KTsKIGV4dGVybiB2b2lkIGFjY291bnRfc3RlYWxfdGltZShjcHV0aW1lX3QpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rbWVtbGVhay5oIGIvaW5jbHVkZS9saW51eC9rbWVtbGVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTZhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2ttZW1sZWFrLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIGluY2x1ZGUvbGludXgva21lbWxlYWsuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBUk0gTGltaXRlZAorICogV3JpdHRlbiBieSBDYXRhbGluIE1hcmluYXMgPGNhdGFsaW4ubWFyaW5hc0Bhcm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2lmbmRlZiBfX0tNRU1MRUFLX0gKKyNkZWZpbmUgX19LTUVNTEVBS19ICisKKyNpZmRlZiBDT05GSUdfREVCVUdfS01FTUxFQUsKKworZXh0ZXJuIHZvaWQga21lbWxlYWtfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGttZW1sZWFrX2FsbG9jKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGludCBtaW5fY291bnQsCisJCQkgICBnZnBfdCBnZnApOworZXh0ZXJuIHZvaWQga21lbWxlYWtfZnJlZShjb25zdCB2b2lkICpwdHIpOworZXh0ZXJuIHZvaWQga21lbWxlYWtfcGFkZGluZyhjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJICAgICBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCBrbWVtbGVha19ub3RfbGVhayhjb25zdCB2b2lkICpwdHIpOworZXh0ZXJuIHZvaWQga21lbWxlYWtfaWdub3JlKGNvbnN0IHZvaWQgKnB0cik7CitleHRlcm4gdm9pZCBrbWVtbGVha19zY2FuX2FyZWEoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgICBzaXplX3QgbGVuZ3RoLCBnZnBfdCBnZnApOworZXh0ZXJuIHZvaWQga21lbWxlYWtfbm9fc2Nhbihjb25zdCB2b2lkICpwdHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQga21lbWxlYWtfYWxsb2NfcmVjdXJzaXZlKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJCQkJCSAgICBpbnQgbWluX2NvdW50LCB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkJCQkgICAgZ2ZwX3QgZ2ZwKQoreworCWlmICghKGZsYWdzICYgU0xBQl9OT0xFQUtUUkFDRSkpCisJCWttZW1sZWFrX2FsbG9jKHB0ciwgc2l6ZSwgbWluX2NvdW50LCBnZnApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga21lbWxlYWtfZnJlZV9yZWN1cnNpdmUoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCWlmICghKGZsYWdzICYgU0xBQl9OT0xFQUtUUkFDRSkpCisJCWttZW1sZWFrX2ZyZWUocHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGttZW1sZWFrX2VyYXNlKHZvaWQgKipwdHIpCit7CisJKnB0ciA9IE5VTEw7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWVtbGVha19pbml0KHZvaWQpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQga21lbWxlYWtfYWxsb2MoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgaW50IG1pbl9jb3VudCwKKwkJCQkgIGdmcF90IGdmcCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWVtbGVha19hbGxvY19yZWN1cnNpdmUoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgIGludCBtaW5fY291bnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJCSAgICBnZnBfdCBnZnApCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQga21lbWxlYWtfZnJlZShjb25zdCB2b2lkICpwdHIpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQga21lbWxlYWtfZnJlZV9yZWN1cnNpdmUoY29uc3Qgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIGttZW1sZWFrX25vdF9sZWFrKGNvbnN0IHZvaWQgKnB0cikKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWVtbGVha19pZ25vcmUoY29uc3Qgdm9pZCAqcHRyKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIGttZW1sZWFrX3NjYW5fYXJlYShjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgICAgIHNpemVfdCBsZW5ndGgsIGdmcF90IGdmcCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWVtbGVha19lcmFzZSh2b2lkICoqcHRyKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIGttZW1sZWFrX25vX3NjYW4oY29uc3Qgdm9pZCAqcHRyKQoreworfQorCisjZW5kaWYJLyogQ09ORklHX0RFQlVHX0tNRU1MRUFLICovCisKKyNlbmRpZgkvKiBfX0tNRU1MRUFLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva21lbXRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L2ttZW10cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTZkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2ttZW10cmFjZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRWR1YXJkIC0gR2FicmllbCBNdW50ZWFudQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciBHUEwgdmVyc2lvbiAyLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0tNRU1UUkFDRV9ICisjZGVmaW5lIF9MSU5VWF9LTUVNVFJBQ0VfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ttZW0uaD4KKworI2lmZGVmIENPTkZJR19LTUVNVFJBQ0UKK2V4dGVybiB2b2lkIGttZW10cmFjZV9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWVtdHJhY2VfaW5pdCh2b2lkKQoreworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfTElOVVhfS01FTVRSQUNFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm0uaCBiL2luY2x1ZGUvbGludXgva3ZtLmgKaW5kZXggOGNjMTM3OS4uM2RiNWQ4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bS5oCkBAIC0xMTksNyArMTE5LDcgQEAKIAkJCV9fdTMyIGVycm9yX2NvZGU7CiAJCX0gZXg7CiAJCS8qIEtWTV9FWElUX0lPICovCi0JCXN0cnVjdCBrdm1faW8geworCQlzdHJ1Y3QgewogI2RlZmluZSBLVk1fRVhJVF9JT19JTiAgMAogI2RlZmluZSBLVk1fRVhJVF9JT19PVVQgMQogCQkJX191OCBkaXJlY3Rpb247CkBAIC0yMjQsMTAgKzIyNCwxMCBAQAogLyogZm9yIEtWTV9HRVRfRElSVFlfTE9HICovCiBzdHJ1Y3Qga3ZtX2RpcnR5X2xvZyB7CiAJX191MzIgc2xvdDsKLQlfX3UzMiBwYWRkaW5nOworCV9fdTMyIHBhZGRpbmcxOwogCXVuaW9uIHsKIAkJdm9pZCBfX3VzZXIgKmRpcnR5X2JpdG1hcDsgLyogb25lIGJpdCBwZXIgcGFnZSAqLwotCQlfX3U2NCBwYWRkaW5nOworCQlfX3U2NCBwYWRkaW5nMjsKIAl9OwogfTsKIApAQCAtNDA5LDYgKzQwOSwxMCBAQAogI2lmZGVmIF9fS1ZNX0hBVkVfREVWSUNFX0FTU0lHTk1FTlQKICNkZWZpbmUgS1ZNX0NBUF9ERVZJQ0VfREVBU1NJR05NRU5UIDI3CiAjZW5kaWYKKyNpZmRlZiBfX0tWTV9IQVZFX01TSVgKKyNkZWZpbmUgS1ZNX0NBUF9ERVZJQ0VfTVNJWCAyOAorI2VuZGlmCisjZGVmaW5lIEtWTV9DQVBfQVNTSUdOX0RFVl9JUlEgMjkKIC8qIEFub3RoZXIgYnVnIGluIEtWTV9TRVRfVVNFUl9NRU1PUllfUkVHSU9OIGZpeGVkOiAqLwogI2RlZmluZSBLVk1fQ0FQX0pPSU5fTUVNT1JZX1JFR0lPTlNfV09SS1MgMzAKIApAQCAtNDgyLDExICs0ODYsMTggQEAKICNkZWZpbmUgS1ZNX0FTU0lHTl9QQ0lfREVWSUNFIF9JT1IoS1ZNSU8sIDB4NjksIFwKIAkJCQkgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX3BjaV9kZXYpCiAjZGVmaW5lIEtWTV9TRVRfR1NJX1JPVVRJTkcgICAgICAgX0lPVyhLVk1JTywgMHg2YSwgc3RydWN0IGt2bV9pcnFfcm91dGluZykKKy8qIGRlcHJlY2F0ZWQsIHJlcGxhY2VkIGJ5IEtWTV9BU1NJR05fREVWX0lSUSAqLwogI2RlZmluZSBLVk1fQVNTSUdOX0lSUSBfSU9SKEtWTUlPLCAweDcwLCBcCiAJCQkgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEpCisjZGVmaW5lIEtWTV9BU1NJR05fREVWX0lSUSAgICAgICAgX0lPVyhLVk1JTywgMHg3MCwgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEpCiAjZGVmaW5lIEtWTV9SRUlOSkVDVF9DT05UUk9MICAgICAgX0lPKEtWTUlPLCAweDcxKQogI2RlZmluZSBLVk1fREVBU1NJR05fUENJX0RFVklDRSBfSU9XKEtWTUlPLCAweDcyLCBcCiAJCQkJICAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX3BjaV9kZXYpCisjZGVmaW5lIEtWTV9BU1NJR05fU0VUX01TSVhfTlIgXAorCQkJX0lPVyhLVk1JTywgMHg3Mywgc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X25yKQorI2RlZmluZSBLVk1fQVNTSUdOX1NFVF9NU0lYX0VOVFJZIFwKKwkJCV9JT1coS1ZNSU8sIDB4NzQsIHN0cnVjdCBrdm1fYXNzaWduZWRfbXNpeF9lbnRyeSkKKyNkZWZpbmUgS1ZNX0RFQVNTSUdOX0RFVl9JUlEgICAgICAgX0lPVyhLVk1JTywgMHg3NSwgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEpCiAKIC8qCiAgKiBpb2N0bHMgZm9yIHZjcHUgZmRzCkBAIC01NzcsNiArNTg4LDggQEAKICNkZWZpbmUgS1ZNX1RSQ19TVExCX0lOVkFMICAgICAgIChLVk1fVFJDX0hBTkRMRVIgKyAweDE4KQogI2RlZmluZSBLVk1fVFJDX1BQQ19JTlNUUiAgICAgICAgKEtWTV9UUkNfSEFORExFUiArIDB4MTkpCiAKKyNkZWZpbmUgS1ZNX0RFVl9BU1NJR05fRU5BQkxFX0lPTU1VCSgxIDw8IDApCisKIHN0cnVjdCBrdm1fYXNzaWduZWRfcGNpX2RldiB7CiAJX191MzIgYXNzaWduZWRfZGV2X2lkOwogCV9fdTMyIGJ1c25yOwpAQCAtNTg3LDYgKzYwMCwxNyBAQAogCX07CiB9OwogCisjZGVmaW5lIEtWTV9ERVZfSVJRX0hPU1RfSU5UWCAgICAoMSA8PCAwKQorI2RlZmluZSBLVk1fREVWX0lSUV9IT1NUX01TSSAgICAgKDEgPDwgMSkKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfSE9TVF9NU0lYICAgICgxIDw8IDIpCisKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfR1VFU1RfSU5UWCAgICgxIDw8IDgpCisjZGVmaW5lIEtWTV9ERVZfSVJRX0dVRVNUX01TSSAgICAoMSA8PCA5KQorI2RlZmluZSBLVk1fREVWX0lSUV9HVUVTVF9NU0lYICAgKDEgPDwgMTApCisKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfSE9TVF9NQVNLCSAweDAwZmYKKyNkZWZpbmUgS1ZNX0RFVl9JUlFfR1VFU1RfTUFTSyAgIDB4ZmYwMAorCiBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSB7CiAJX191MzIgYXNzaWduZWRfZGV2X2lkOwogCV9fdTMyIGhvc3RfaXJxOwpAQCAtNjAyLDkgKzYyNiwxOSBAQAogCX07CiB9OwogCi0jZGVmaW5lIEtWTV9ERVZfQVNTSUdOX0VOQUJMRV9JT01NVQkoMSA8PCAwKQogCi0jZGVmaW5lIEtWTV9ERVZfSVJRX0FTU0lHTl9NU0lfQUNUSU9OCUtWTV9ERVZfSVJRX0FTU0lHTl9FTkFCTEVfTVNJCi0jZGVmaW5lIEtWTV9ERVZfSVJRX0FTU0lHTl9FTkFCTEVfTVNJCSgxIDw8IDApCitzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX21zaXhfbnIgeworCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKKwlfX3UxNiBlbnRyeV9ucjsKKwlfX3UxNiBwYWRkaW5nOworfTsKKworI2RlZmluZSBLVk1fTUFYX01TSVhfUEVSX0RFVgkJNTEyCitzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX21zaXhfZW50cnkgeworCV9fdTMyIGFzc2lnbmVkX2Rldl9pZDsKKwlfX3UzMiBnc2k7CisJX191MTYgZW50cnk7IC8qIFRoZSBpbmRleCBvZiBlbnRyeSBpbiB0aGUgTVNJLVggdGFibGUgKi8KKwlfX3UxNiBwYWRkaW5nWzNdOworfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmggYi9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKaW5kZXggODk0YTU2ZS4uYWFjYzU0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCisrKyBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaApAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBLVk1fUkVRX1VOSEFMVCAgICAgICAgICAgICA2CiAjZGVmaW5lIEtWTV9SRVFfTU1VX1NZTkMgICAgICAgICAgIDcKICNkZWZpbmUgS1ZNX1JFUV9LVk1DTE9DS19VUERBVEUgICAgOAorI2RlZmluZSBLVk1fUkVRX0tJQ0sgICAgICAgICAgICAgICA5CiAKICNkZWZpbmUgS1ZNX1VTRVJTUEFDRV9JUlFfU09VUkNFX0lECTAKIApAQCAtNzIsNyArNzMsNiBAQAogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlpbnQgICBjcHU7CiAJc3RydWN0IGt2bV9ydW4gKnJ1bjsKLQlpbnQgZ3Vlc3RfbW9kZTsKIAl1bnNpZ25lZCBsb25nIHJlcXVlc3RzOwogCXVuc2lnbmVkIGxvbmcgZ3Vlc3RfZGVidWc7CiAJaW50IGZwdV9hY3RpdmU7CkBAIC0yOTgsNiArMjk4LDcgQEAKIHZvaWQga3ZtX2FyY2hfaGFyZHdhcmVfdW5zZXR1cCh2b2lkKTsKIHZvaWQga3ZtX2FyY2hfY2hlY2tfcHJvY2Vzc29yX2NvbXBhdCh2b2lkICpydG4pOwogaW50IGt2bV9hcmNoX3ZjcHVfcnVubmFibGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK2ludCBrdm1fYXJjaF9pbnRlcnJ1cHRfYWxsb3dlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiB2b2lkIGt2bV9mcmVlX3BoeXNtZW0oc3RydWN0IGt2bSAqa3ZtKTsKIApAQCAtMzE5LDYgKzMyMCwxMyBAQAogCXZvaWQgKCppcnFfYWNrZWQpKHN0cnVjdCBrdm1faXJxX2Fja19ub3RpZmllciAqa2lhbik7CiB9OwogCisjZGVmaW5lIEtWTV9BU1NJR05FRF9NU0lYX1BFTkRJTkcJCTB4MQorc3RydWN0IGt2bV9ndWVzdF9tc2l4X2VudHJ5IHsKKwl1MzIgdmVjdG9yOworCXUxNiBlbnRyeTsKKwl1MTYgZmxhZ3M7Cit9OworCiBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgewogCXN0cnVjdCBrdm1faXJxX2Fja19ub3RpZmllciBhY2tfbm90aWZpZXI7CiAJc3RydWN0IHdvcmtfc3RydWN0IGludGVycnVwdF93b3JrOwpAQCAtMzI2LDE4ICszMzQsMTggQEAKIAlpbnQgYXNzaWduZWRfZGV2X2lkOwogCWludCBob3N0X2J1c25yOwogCWludCBob3N0X2RldmZuOworCXVuc2lnbmVkIGludCBlbnRyaWVzX25yOwogCWludCBob3N0X2lycTsKIAlib29sIGhvc3RfaXJxX2Rpc2FibGVkOworCXN0cnVjdCBtc2l4X2VudHJ5ICpob3N0X21zaXhfZW50cmllczsKIAlpbnQgZ3Vlc3RfaXJxOwotI2RlZmluZSBLVk1fQVNTSUdORURfREVWX0dVRVNUX0lOVFgJKDEgPDwgMCkKLSNkZWZpbmUgS1ZNX0FTU0lHTkVEX0RFVl9HVUVTVF9NU0kJKDEgPDwgMSkKLSNkZWZpbmUgS1ZNX0FTU0lHTkVEX0RFVl9IT1NUX0lOVFgJKDEgPDwgOCkKLSNkZWZpbmUgS1ZNX0FTU0lHTkVEX0RFVl9IT1NUX01TSQkoMSA8PCA5KQorCXN0cnVjdCBrdm1fZ3Vlc3RfbXNpeF9lbnRyeSAqZ3Vlc3RfbXNpeF9lbnRyaWVzOwogCXVuc2lnbmVkIGxvbmcgaXJxX3JlcXVlc3RlZF90eXBlOwogCWludCBpcnFfc291cmNlX2lkOwogCWludCBmbGFnczsKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCXN0cnVjdCBrdm0gKmt2bTsKKwlzcGlubG9ja190IGFzc2lnbmVkX2Rldl9sb2NrOwogfTsKIAogc3RydWN0IGt2bV9pcnFfbWFza19ub3RpZmllciB7CkBAIC0zNjAsNiArMzY4LDkgQEAKIGludCBrdm1fcmVxdWVzdF9pcnFfc291cmNlX2lkKHN0cnVjdCBrdm0gKmt2bSk7CiB2b2lkIGt2bV9mcmVlX2lycV9zb3VyY2VfaWQoc3RydWN0IGt2bSAqa3ZtLCBpbnQgaXJxX3NvdXJjZV9pZCk7CiAKKy8qIEZvciB2Y3B1LT5hcmNoLmlvbW11X2ZsYWdzICovCisjZGVmaW5lIEtWTV9JT01NVV9DQUNIRV9DT0hFUkVOQ1kJMHgxCisKICNpZmRlZiBDT05GSUdfSU9NTVVfQVBJCiBpbnQga3ZtX2lvbW11X21hcF9wYWdlcyhzdHJ1Y3Qga3ZtICprdm0sIGdmbl90IGJhc2VfZ2ZuLAogCQkJdW5zaWduZWQgbG9uZyBucGFnZXMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm1fdHlwZXMuaCBiL2luY2x1ZGUvbGludXgva3ZtX3R5cGVzLmgKaW5kZXggMmI4MzE4Yy4uZmI0NmVmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bV90eXBlcy5oCkBAIC00MCw0ICs0MCwzMSBAQAogCiB0eXBlZGVmIGhmbl90IHBmbl90OwogCit1bmlvbiBrdm1faW9hcGljX3JlZGlyZWN0X2VudHJ5IHsKKwl1NjQgYml0czsKKwlzdHJ1Y3QgeworCQl1OCB2ZWN0b3I7CisJCXU4IGRlbGl2ZXJ5X21vZGU6MzsKKwkJdTggZGVzdF9tb2RlOjE7CisJCXU4IGRlbGl2ZXJ5X3N0YXR1czoxOworCQl1OCBwb2xhcml0eToxOworCQl1OCByZW1vdGVfaXJyOjE7CisJCXU4IHRyaWdfbW9kZToxOworCQl1OCBtYXNrOjE7CisJCXU4IHJlc2VydmU6NzsKKwkJdTggcmVzZXJ2ZWRbNF07CisJCXU4IGRlc3RfaWQ7CisJfSBmaWVsZHM7Cit9OworCitzdHJ1Y3Qga3ZtX2xhcGljX2lycSB7CisJdTMyIHZlY3RvcjsKKwl1MzIgZGVsaXZlcnlfbW9kZTsKKwl1MzIgZGVzdF9tb2RlOworCXUzMiBsZXZlbDsKKwl1MzIgdHJpZ19tb2RlOworCXUzMiBzaG9ydGhhbmQ7CisJdTMyIGRlc3RfaWQ7Cit9OworCiAjZW5kaWYgLyogX19LVk1fVFlQRVNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvb3AuaCBiL2luY2x1ZGUvbGludXgvbG9vcC5oCmluZGV4IDQwNzI1NDQuLjY2YzE5NGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9vcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9vcC5oCkBAIC01Niw4ICs1Niw3IEBACiAJZ2ZwX3QJCW9sZF9nZnBfbWFzazsKIAogCXNwaW5sb2NrX3QJCWxvX2xvY2s7Ci0Jc3RydWN0IGJpbyAJCSpsb19iaW87Ci0Jc3RydWN0IGJpbwkJKmxvX2Jpb3RhaWw7CisJc3RydWN0IGJpb19saXN0CQlsb19iaW9fbGlzdDsKIAlpbnQJCQlsb19zdGF0ZTsKIAlzdHJ1Y3QgbXV0ZXgJCWxvX2N0bF9tdXRleDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmxvX3RocmVhZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbHNtX2F1ZGl0LmggYi9pbmNsdWRlL2xpbnV4L2xzbV9hdWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjFiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2xzbV9hdWRpdC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29tbW9uIExTTSBsb2dnaW5nIGZ1bmN0aW9ucworICogSGVhdmlseSBib3Jyb3dlZCBmcm9tIHNlbGludXgvYXZjLmgKKyAqCisgKiBBdXRob3IgOiBFdGllbm5lIEJBU1NFVCAgPGV0aWVubmUuYmFzc2V0QGVuc3RhLm9yZz4KKyAqCisgKiBBbGwgY3JlZGl0cyB0byA6IFN0ZXBoZW4gU21hbGxleSwgPHNkc0BlcG9jaC5uY3NjLm1pbD4KKyAqIEFsbCBCVUdTIHRvIDogRXRpZW5uZSBCQVNTRVQgIDxldGllbm5lLmJhc3NldEBlbnN0YS5vcmc+CisgKi8KKyNpZm5kZWYgX0xTTV9DT01NT05fTE9HR0lOR18KKyNkZWZpbmUgX0xTTV9DT01NT05fTE9HR0lOR18KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXRoLmg+CisjaW5jbHVkZSA8bGludXgva2V5Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisKKy8qIEF1eGlsaWFyeSBkYXRhIHRvIHVzZSBpbiBnZW5lcmF0aW5nIHRoZSBhdWRpdCByZWNvcmQuICovCitzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgeworCWNoYXIgICAgdHlwZTsKKyNkZWZpbmUgTFNNX0FVRElUX0RBVEFfRlMgICAgICAxCisjZGVmaW5lIExTTV9BVURJVF9EQVRBX05FVCAgICAgMgorI2RlZmluZSBMU01fQVVESVRfREFUQV9DQVAgICAgIDMKKyNkZWZpbmUgTFNNX0FVRElUX0RBVEFfSVBDICAgICA0CisjZGVmaW5lIExTTV9BVURJVF9EQVRBX1RBU0sgICAgNQorI2RlZmluZSBMU01fQVVESVRfREFUQV9LRVkgICAgIDYKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKwl1bmlvbiAJeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHBhdGggcGF0aDsKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJCX0gZnM7CisJCXN0cnVjdCB7CisJCQlpbnQgbmV0aWY7CisJCQlzdHJ1Y3Qgc29jayAqc2s7CisJCQl1MTYgZmFtaWx5OworCQkJX19iZTE2IGRwb3J0OworCQkJX19iZTE2IHNwb3J0OworCQkJdW5pb24geworCQkJCXN0cnVjdCB7CisJCQkJCV9fYmUzMiBkYWRkcjsKKwkJCQkJX19iZTMyIHNhZGRyOworCQkJCX0gdjQ7CisJCQkJc3RydWN0IHsKKwkJCQkJc3RydWN0IGluNl9hZGRyIGRhZGRyOworCQkJCQlzdHJ1Y3QgaW42X2FkZHIgc2FkZHI7CisJCQkJfSB2NjsKKwkJCX0gZmFtOworCQl9IG5ldDsKKwkJaW50IGNhcDsKKwkJaW50IGlwY19pZDsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisjaWZkZWYgQ09ORklHX0tFWVMKKwkJc3RydWN0IHsKKwkJCWtleV9zZXJpYWxfdCBrZXk7CisJCQljaGFyICprZXlfZGVzYzsKKwkJfSBrZXlfc3RydWN0OworI2VuZGlmCisJfSB1OworCWNvbnN0IGNoYXIgKmZ1bmN0aW9uOworCS8qIHRoaXMgdW5pb24gY29udGFpbnMgTFNNIHNwZWNpZmljIGRhdGEgKi8KKwl1bmlvbiB7CisJCS8qIFNNQUNLIGRhdGEgKi8KKwkJc3RydWN0IHNtYWNrX2F1ZGl0X2RhdGEgeworCQkJY2hhciAqc3ViamVjdDsKKwkJCWNoYXIgKm9iamVjdDsKKwkJCWNoYXIgKnJlcXVlc3Q7CisJCQlpbnQgcmVzdWx0OworCQl9IHNtYWNrX2F1ZGl0X2RhdGE7CisJCS8qIFNFTGludXggZGF0YSAqLworCQlzdHJ1Y3QgeworCQkJdTMyIHNzaWQ7CisJCQl1MzIgdHNpZDsKKwkJCXUxNiB0Y2xhc3M7CisJCQl1MzIgcmVxdWVzdGVkOworCQkJdTMyIGF1ZGl0ZWQ7CisJCQlzdHJ1Y3QgYXZfZGVjaXNpb24gKmF2ZDsKKwkJCWludCByZXN1bHQ7CisJCX0gc2VsaW51eF9hdWRpdF9kYXRhOworCX0gbHNtX3ByaXY7CisJLyogdGhlc2UgY2FsbGJhY2sgd2lsbCBiZSBpbXBsZW1lbnRlZCBieSBhIHNwZWNpZmljIExTTSAqLworCXZvaWQgKCpsc21fcHJlX2F1ZGl0KShzdHJ1Y3QgYXVkaXRfYnVmZmVyICosIHZvaWQgKik7CisJdm9pZCAoKmxzbV9wb3N0X2F1ZGl0KShzdHJ1Y3QgYXVkaXRfYnVmZmVyICosIHZvaWQgKik7Cit9OworCisjZGVmaW5lIHY0aW5mbyBmYW0udjQKKyNkZWZpbmUgdjZpbmZvIGZhbS52NgorCitpbnQgaXB2NF9za2JfdG9fYXVkaXRkYXRhKHN0cnVjdCBza19idWZmICpza2IsCisJCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSAqYWQsIHU4ICpwcm90byk7CisKK2ludCBpcHY2X3NrYl90b19hdWRpdGRhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhICphZCwgdTggKnByb3RvKTsKKworLyogSW5pdGlhbGl6ZSBhbiBMU00gYXVkaXQgZGF0YSBzdHJ1Y3R1cmUuICovCisjZGVmaW5lIENPTU1PTl9BVURJVF9EQVRBX0lOSVQoX2QsIF90KSBcCisJeyBtZW1zZXQoKF9kKSwgMCwgc2l6ZW9mKHN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSkpOyBcCisJIChfZCktPnR5cGUgPSBMU01fQVVESVRfREFUQV8jI190OyAoX2QpLT5mdW5jdGlvbiA9IF9fZnVuY19fOyB9CisKK3ZvaWQgY29tbW9uX2xzbV9hdWRpdChzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKmEpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWFnaWMuaCBiL2luY2x1ZGUvbGludXgvbWFnaWMuaAppbmRleCA1YjRlMjhiLi45MjcxMzhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21hZ2ljLmgKKysrIGIvaW5jbHVkZS9saW51eC9tYWdpYy5oCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBERUJVR0ZTX01BR0lDICAgICAgICAgIDB4NjQ2MjY3MjAKICNkZWZpbmUgU1lTRlNfTUFHSUMJCTB4NjI2NTY1NzIKICNkZWZpbmUgU0VDVVJJVFlGU19NQUdJQwkweDczNjM2NjczCisjZGVmaW5lIFNFTElOVVhfTUFHSUMJCTB4Zjk3Y2ZmOGMKICNkZWZpbmUgVE1QRlNfTUFHSUMJCTB4MDEwMjE5OTQKICNkZWZpbmUgU1FVQVNIRlNfTUFHSUMJCTB4NzM3MTczNjgKICNkZWZpbmUgRUZTX1NVUEVSX01BR0lDCQkweDQxNEE1MwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZ19kaXNrLmggYi9pbmNsdWRlL2xpbnV4L21nX2Rpc2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3NmIxZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L21nX2Rpc2suaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKgotICogIGluY2x1ZGUvbGludXgvbWdfZGlzay5jCi0gKgotICogIFN1cHBvcnQgZm9yIHRoZSBtR2luZSBtW2ddZmxhc2ggSU8gbW9kZS4KLSAqICBCYXNlZCBvbiBsZWdhY3kgaGQuYwotICoKLSAqIChjKSAyMDA4IG1HaW5lIENvLixMVEQKLSAqIChjKSAyMDA4IHVuc2lrIEtpbSA8ZG9uYXJpNzVAZ21haWwuY29tPgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfX01HX0RJU0tfSF9fCi0jZGVmaW5lIF9fTUdfRElTS19IX18KLQotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgotCi0vKiBuYW1lIGZvciBibG9jayBkZXZpY2UgKi8KLSNkZWZpbmUgTUdfRElTS19OQU1FICJtZ2QiCi0vKiBuYW1lIGZvciBwbGF0Zm9ybSBkZXZpY2UgKi8KLSNkZWZpbmUgTUdfREVWX05BTUUgIm1nX2Rpc2siCi0KLSNkZWZpbmUgTUdfRElTS19NQUogMAotI2RlZmluZSBNR19ESVNLX01BWF9QQVJUIDE2Ci0jZGVmaW5lIE1HX1NFQ1RPUl9TSVpFIDUxMgotI2RlZmluZSBNR19NQVhfU0VDVFMgMjU2Ci0KLS8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KLSNkZWZpbmUgTUdfQlVGRl9PRkZTRVQJCQkweDgwMDAKLSNkZWZpbmUgTUdfU1RPUkFHRV9CVUZGRVJfU0laRQkJMHgyMDAKLSNkZWZpbmUgTUdfUkVHX09GRlNFVAkJCTB4QzAwMAotI2RlZmluZSBNR19SRUdfRkVBVFVSRQkJCShNR19SRUdfT0ZGU0VUICsgMikJLyogd3JpdGUgY2FzZSAqLwotI2RlZmluZSBNR19SRUdfRVJST1IJCQkoTUdfUkVHX09GRlNFVCArIDIpCS8qIHJlYWQgY2FzZSAqLwotI2RlZmluZSBNR19SRUdfU0VDVF9DTlQJCQkoTUdfUkVHX09GRlNFVCArIDQpCi0jZGVmaW5lIE1HX1JFR19TRUNUX05VTQkJCShNR19SRUdfT0ZGU0VUICsgNikKLSNkZWZpbmUgTUdfUkVHX0NZTF9MT1cJCQkoTUdfUkVHX09GRlNFVCArIDgpCi0jZGVmaW5lIE1HX1JFR19DWUxfSElHSAkJCShNR19SRUdfT0ZGU0VUICsgMHhBKQotI2RlZmluZSBNR19SRUdfRFJWX0hFQUQJCQkoTUdfUkVHX09GRlNFVCArIDB4QykKLSNkZWZpbmUgTUdfUkVHX0NPTU1BTkQJCQkoTUdfUkVHX09GRlNFVCArIDB4RSkJLyogd3JpdGUgY2FzZSAqLwotI2RlZmluZSBNR19SRUdfU1RBVFVTCQkJKE1HX1JFR19PRkZTRVQgKyAweEUpCS8qIHJlYWQgIGNhc2UgKi8KLSNkZWZpbmUgTUdfUkVHX0RSVl9DVFJMCQkJKE1HX1JFR19PRkZTRVQgKyAweDEwKQotI2RlZmluZSBNR19SRUdfQlVSU1RfQ1RSTAkJKE1HX1JFR19PRkZTRVQgKyAweDEyKQotCi0vKiAiRHJpdmUgU2VsZWN0L0hlYWQgUmVnaXN0ZXIiIGJpdCB2YWx1ZXMgKi8KLSNkZWZpbmUgTUdfUkVHX0hFQURfTVVTVF9CRV9PTgkJMHhBMCAvKiBUaGVzZSAyIGJpdHMgYXJlIGFsd2F5cyBvbiAqLwotI2RlZmluZSBNR19SRUdfSEVBRF9EUklWRV9NQVNURVIJKDB4MDAgfCBNR19SRUdfSEVBRF9NVVNUX0JFX09OKQotI2RlZmluZSBNR19SRUdfSEVBRF9EUklWRV9TTEFWRQkJKDB4MTAgfCBNR19SRUdfSEVBRF9NVVNUX0JFX09OKQotI2RlZmluZSBNR19SRUdfSEVBRF9MQkFfTU9ERQkJKDB4NDAgfCBNR19SRUdfSEVBRF9NVVNUX0JFX09OKQotCi0KLS8qICJEZXZpY2UgQ29udHJvbCBSZWdpc3RlciIgYml0IHZhbHVlcyAqLwotI2RlZmluZSBNR19SRUdfQ1RSTF9JTlRSX0VOQUJMRQkJCTB4MAotI2RlZmluZSBNR19SRUdfQ1RSTF9JTlRSX0RJU0FCTEUJCSgweDE8PDEpCi0jZGVmaW5lIE1HX1JFR19DVFJMX1JFU0VUCQkJKDB4MTw8MikKLSNkZWZpbmUgTUdfUkVHX0NUUkxfSU5UUl9QT0xBX0FDVElWRV9ISUdICTB4MAotI2RlZmluZSBNR19SRUdfQ1RSTF9JTlRSX1BPTEFfQUNUSVZFX0xPVwkoMHgxPDw0KQotI2RlZmluZSBNR19SRUdfQ1RSTF9EUERfUE9MQV9BQ1RJVkVfTE9XCQkweDAKLSNkZWZpbmUgTUdfUkVHX0NUUkxfRFBEX1BPTEFfQUNUSVZFX0hJR0gJKDB4MTw8NSkKLSNkZWZpbmUgTUdfUkVHX0NUUkxfRFBEX0RJU0FCTEUJCQkweDAKLSNkZWZpbmUgTUdfUkVHX0NUUkxfRFBEX0VOQUJMRQkJCSgweDE8PDYpCi0KLS8qIFN0YXR1cyByZWdpc3RlciBiaXQgKi8KLS8qIGVycm9yIGJpdCBpbiBzdGF0dXMgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgTUdfUkVHX1NUQVRVU19CSVRfRVJST1IJCQkweDAxCi0vKiBjb3JyZWN0ZWQgZXJyb3IgaW4gc3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lIE1HX1JFR19TVEFUVVNfQklUX0NPUlJFQ1RFRF9FUlJPUgkweDA0Ci0vKiBkYXRhIHJlcXVlc3QgYml0IGluIHN0YXR1cyByZWdpc3RlciAqLwotI2RlZmluZSBNR19SRUdfU1RBVFVTX0JJVF9EQVRBX1JFUQkJMHgwOAotLyogRFNDIC0gRHJpdmUgU2VlayBDb21wbGV0ZSAqLwotI2RlZmluZSBNR19SRUdfU1RBVFVTX0JJVF9TRUVLX0RPTkUJCTB4MTAKLS8qIERXRiAtIERyaXZlIFdyaXRlIEZhdWx0ICovCi0jZGVmaW5lIE1HX1JFR19TVEFUVVNfQklUX1dSSVRFX0ZBVUxUCQkweDIwCi0jZGVmaW5lIE1HX1JFR19TVEFUVVNfQklUX1JFQURZCQkJMHg0MAotI2RlZmluZSBNR19SRUdfU1RBVFVTX0JJVF9CVVNZCQkJMHg4MAotCi0vKiBoYW5keSBzdGF0dXMgKi8KLSNkZWZpbmUgTUdfU1RBVF9SRUFEWQkoTUdfUkVHX1NUQVRVU19CSVRfUkVBRFkgfCBNR19SRUdfU1RBVFVTX0JJVF9TRUVLX0RPTkUpCi0jZGVmaW5lIE1HX1JFQURZX09LKHMpCSgoKHMpICYgKE1HX1NUQVRfUkVBRFkgfCBcCi0JCQkJKE1HX1JFR19TVEFUVVNfQklUX0JVU1kgfCBcCi0JCQkJIE1HX1JFR19TVEFUVVNfQklUX1dSSVRFX0ZBVUxUIHwgXAotCQkJCSBNR19SRUdfU1RBVFVTX0JJVF9FUlJPUikpKSA9PSBNR19TVEFUX1JFQURZKQotCi0vKiBFcnJvciByZWdpc3RlciAqLwotI2RlZmluZSBNR19SRUdfRVJSX0FNTkYJCTB4MDEKLSNkZWZpbmUgTUdfUkVHX0VSUl9BQlJUCQkweDA0Ci0jZGVmaW5lIE1HX1JFR19FUlJfSURORgkJMHgxMAotI2RlZmluZSBNR19SRUdfRVJSX1VOQwkJMHg0MAotI2RlZmluZSBNR19SRUdfRVJSX0JCSwkJMHg4MAotCi0vKiBlcnJvciBjb2RlIGZvciBvdGhlcnMgKi8KLSNkZWZpbmUgTUdfRVJSX05PTkUJCTAKLSNkZWZpbmUgTUdfRVJSX1RJTUVPVVQJCTB4MTAwCi0jZGVmaW5lIE1HX0VSUl9JTklUX1NUQVQJMHgxMDEKLSNkZWZpbmUgTUdfRVJSX1RSQU5TTEFUSU9OCTB4MTAyCi0jZGVmaW5lIE1HX0VSUl9DVFJMX1JTVAkJMHgxMDMKLSNkZWZpbmUgTUdfRVJSX0lOVl9TVEFUCQkweDEwNAotI2RlZmluZSBNR19FUlJfUlNUT1VUCQkweDEwNQotCi0jZGVmaW5lIE1HX01BWF9FUlJPUlMJNgkvKiBNYXggcmVhZC93cml0ZSBlcnJvcnMgKi8KLQotLyogY29tbWFuZCAqLwotI2RlZmluZSBNR19DTURfUkQgMHgyMAotI2RlZmluZSBNR19DTURfV1IgMHgzMAotI2RlZmluZSBNR19DTURfU0xFRVAgMHg5OQotI2RlZmluZSBNR19DTURfV0FLRVVQIDB4QzMKLSNkZWZpbmUgTUdfQ01EX0lEIDB4RUMKLSNkZWZpbmUgTUdfQ01EX1dSX0NPTkYgMHgzQwotI2RlZmluZSBNR19DTURfUkRfQ09ORiAweDQwCi0KLS8qIG9wZXJhdGlvbiBtb2RlICovCi0jZGVmaW5lIE1HX09QX0NBU0NBREUgKDEgPDwgMCkKLSNkZWZpbmUgTUdfT1BfQ0FTQ0FERV9TWU5DX1JEICgxIDw8IDEpCi0jZGVmaW5lIE1HX09QX0NBU0NBREVfU1lOQ19XUiAoMSA8PCAyKQotI2RlZmluZSBNR19PUF9JTlRFUkxFQVZFICgxIDw8IDMpCi0KLS8qIHN5bmNocm9ub3VzICovCi0jZGVmaW5lIE1HX0JVUlNUX0xBVF80ICgzIDw8IDQpCi0jZGVmaW5lIE1HX0JVUlNUX0xBVF81ICg0IDw8IDQpCi0jZGVmaW5lIE1HX0JVUlNUX0xBVF82ICg1IDw8IDQpCi0jZGVmaW5lIE1HX0JVUlNUX0xBVF83ICg2IDw8IDQpCi0jZGVmaW5lIE1HX0JVUlNUX0xBVF84ICg3IDw8IDQpCi0jZGVmaW5lIE1HX0JVUlNUX0xFTl80ICgxIDw8IDEpCi0jZGVmaW5lIE1HX0JVUlNUX0xFTl84ICgyIDw8IDEpCi0jZGVmaW5lIE1HX0JVUlNUX0xFTl8xNiAoMyA8PCAxKQotI2RlZmluZSBNR19CVVJTVF9MRU5fMzIgKDQgPDwgMSkKLSNkZWZpbmUgTUdfQlVSU1RfTEVOX0NPTlQgKDAgPDwgMSkKLQotLyogdGltZW91dCB2YWx1ZSAodW5pdDogbXMpICovCi0jZGVmaW5lIE1HX1RNQVhfQ09ORl9UT19DTUQJMQotI2RlZmluZSBNR19UTUFYX1dBSVRfUkRfRFJRCTEwCi0jZGVmaW5lIE1HX1RNQVhfV0FJVF9XUl9EUlEJNTAwCi0jZGVmaW5lIE1HX1RNQVhfUlNUX1RPX0JVU1kJMTAKLSNkZWZpbmUgTUdfVE1BWF9IRFJTVF9UT19SRFkJNTAwCi0jZGVmaW5lIE1HX1RNQVhfU1dSU1RfVE9fUkRZCTUwMAotI2RlZmluZSBNR19UTUFYX1JTVE9VVAkJMzAwMAotCi0vKiBkZXZpY2UgYXR0cmlidXRpb24gKi8KLS8qIHVzZSBtZmxhc2ggYXMgYm9vdCBkZXZpY2UgKi8KLSNkZWZpbmUgTUdfQk9PVF9ERVYJCSgxIDw8IDApCi0vKiB1c2UgbWZsYXNoIGFzIHN0b3JhZ2UgZGV2aWNlICovCi0jZGVmaW5lIE1HX1NUT1JBR0VfREVWCQkoMSA8PCAxKQotLyogc2FtZSBhcyBNR19TVE9SQUdFX0RFViwgYnV0IGJvb3Rsb2FkZXIgYWxyZWFkeSBkb25lIHJlc2V0IHNlcXVlbmNlICovCi0jZGVmaW5lIE1HX1NUT1JBR0VfREVWX1NLSVBfUlNUCSgxIDw8IDIpCi0KLSNkZWZpbmUgTUdfREVWX01BU0sgKE1HX0JPT1RfREVWIHwgTUdfU1RPUkFHRV9ERVYgfCBNR19TVE9SQUdFX0RFVl9TS0lQX1JTVCkKLQotLyogbmFtZXMgb2YgR1BJTyByZXNvdXJjZSAqLwotI2RlZmluZSBNR19SU1RfUElOCSJtZ19yc3QiCi0vKiBleGNlcHQgTUdfQk9PVF9ERVYsIHJlc2V0LW91dCBwaW4gc2hvdWxkIGJlIGFzc2lnbmVkICovCi0jZGVmaW5lIE1HX1JTVE9VVF9QSU4JIm1nX3JzdG91dCIKLQotLyogcHJpdmF0ZSBkcml2ZXIgZGF0YSAqLwotc3RydWN0IG1nX2Rydl9kYXRhIHsKLQkvKiBkaXNrIHJlc291cmNlICovCi0JdTMyIHVzZV9wb2xsaW5nOwotCi0JLyogZGV2aWNlIGF0dHJpYnV0aW9uICovCi0JdTMyIGRldl9hdHRyOwotCi0JLyogaW50ZXJuYWxseSB1c2VkICovCi0Jc3RydWN0IG1nX2hvc3QgKmhvc3Q7Ci19OwotCi0vKiBtYWluIHN0cnVjdHVyZSBmb3IgbWZsYXNoIGRyaXZlciAqLwotc3RydWN0IG1nX2hvc3QgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpicmVxOwotCXNwaW5sb2NrX3QgbG9jazsKLQlzdHJ1Y3QgZ2VuZGlzayAqZ2Q7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQl2b2lkICgqbWdfZG9faW50cikgKHN0cnVjdCBtZ19ob3N0ICopOwotCi0JdTE2IGlkW0FUQV9JRF9XT1JEU107Ci0KLQl1MTYgY3lsczsKLQl1MTYgaGVhZHM7Ci0JdTE2IHNlY3RvcnM7Ci0JdTMyIG5fc2VjdG9yczsKLQl1MzIgbnJlc19zZWN0b3JzOwotCi0Jdm9pZCBfX2lvbWVtICpkZXZfYmFzZTsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCXVuc2lnbmVkIGludCByc3Q7Ci0JdW5zaWduZWQgaW50IHJzdG91dDsKLQotCXUzMiBtYWpvcjsKLQl1MzIgZXJyb3I7Ci19OwotCi0vKgotICogRGVidWdnaW5nIG1hY3JvIGFuZCBkZWZpbmVzCi0gKi8KLSN1bmRlZiBET19NR19ERUJVRwotI2lmZGVmIERPX01HX0RFQlVHCi0jICBkZWZpbmUgTUdfREJHKGZtdCwgYXJncy4uLikgXAotCXByaW50ayhLRVJOX0RFQlVHICIlczolZCAiZm10LCBfX2Z1bmNfXywgX19MSU5FX18sICMjYXJncykKLSNlbHNlIC8qIENPTkZJR19NR19ERUJVRyAqLwotIyAgZGVmaW5lIE1HX0RCRyhmbXQsIGFyZ3MuLi4pIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZiAvKiBDT05GSUdfTUdfREVCVUcgKi8KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggYmZmMWYwZC4uYWQ2MTNlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMTksNiArMTksNyBAQAogc3RydWN0IGZpbGVfcmFfc3RhdGU7CiBzdHJ1Y3QgdXNlcl9zdHJ1Y3Q7CiBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2w7CitzdHJ1Y3QgcmxpbWl0OwogCiAjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0gICAgICAgICAgLyogRG9uJ3QgdXNlIG1hcG5ycywgZG8gaXQgcHJvcGVybHkgKi8KIGV4dGVybiB1bnNpZ25lZCBsb25nIG1heF9tYXBucjsKQEAgLTU4MCwxMiArNTgxLDEwIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByb3VuZF9oaW50X3RvX21pbih1bnNpZ25lZCBsb25nIGhpbnQpCiB7Ci0jaWZkZWYgQ09ORklHX1NFQ1VSSVRZCiAJaGludCAmPSBQQUdFX01BU0s7CiAJaWYgKCgodm9pZCAqKWhpbnQgIT0gTlVMTCkgJiYKIAkgICAgKGhpbnQgPCBtbWFwX21pbl9hZGRyKSkKIAkJcmV0dXJuIFBBR0VfQUxJR04obW1hcF9taW5fYWRkcik7Ci0jZW5kaWYKIAlyZXR1cm4gaGludDsKIH0KIApAQCAtMTAzMSw4ICsxMDMwLDYgQEAKIAkJCQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuKTsKIGV4dGVybiB2b2lkIHJlbW92ZV9hY3RpdmVfcmFuZ2UodW5zaWduZWQgaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCiAJCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7Ci1leHRlcm4gdm9pZCBwdXNoX25vZGVfYm91bmRhcmllcyh1bnNpZ25lZCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKLQkJCQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuKTsKIGV4dGVybiB2b2lkIHJlbW92ZV9hbGxfYWN0aXZlX3Jhbmdlcyh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGFic2VudF9wYWdlc19pbl9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CkBAIC0xMzE5LDggKzEzMTYsOCBAQAogaW50IHZtZW1tYXBfcG9wdWxhdGUoc3RydWN0IHBhZ2UgKnN0YXJ0X3BhZ2UsIHVuc2lnbmVkIGxvbmcgcGFnZXMsIGludCBub2RlKTsKIHZvaWQgdm1lbW1hcF9wb3B1bGF0ZV9wcmludF9sYXN0KHZvaWQpOwogCi1leHRlcm4gdm9pZCAqYWxsb2NfbG9ja2VkX2J1ZmZlcihzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gdm9pZCBmcmVlX2xvY2tlZF9idWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gdm9pZCByZWxlYXNlX2xvY2tlZF9idWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CitleHRlcm4gaW50IGFjY291bnRfbG9ja2VkX21lbW9yeShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHJsaW1pdCAqcmxpbSwKKwkJCQkgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgcmVmdW5kX2xvY2tlZF9tZW1vcnkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHNpemVfdCBzaXplKTsKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0xJTlVYX01NX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1pb3RyYWNlLmggYi9pbmNsdWRlL2xpbnV4L21taW90cmFjZS5oCmluZGV4IDNkMWI3YmQuLjk3NDkxZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1pb3RyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWlvdHJhY2UuaApAQCAtMzAsNiArMzAsOCBAQAogCiBleHRlcm4gaW50IHJlZ2lzdGVyX2ttbWlvX3Byb2JlKHN0cnVjdCBrbW1pb19wcm9iZSAqcCk7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2ttbWlvX3Byb2JlKHN0cnVjdCBrbW1pb19wcm9iZSAqcCk7CitleHRlcm4gaW50IGttbWlvX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBrbW1pb19jbGVhbnVwKHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX01NSU9UUkFDRQogLyoga21taW8gaXMgYWN0aXZlIGJ5IHNvbWUga21taW9fcHJvYmVzPyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKaW5kZXggNjI3YWMwOC4uYThmMmMwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCkBAIC0zMzcsNiArMzM3LDE0IEBACiAJY29uc3QgY2hhciAqKnRyYWNlX2JwcmludGtfZm10X3N0YXJ0OwogCXVuc2lnbmVkIGludCBudW1fdHJhY2VfYnByaW50a19mbXQ7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfRVZFTlRfVFJBQ0lORworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqdHJhY2VfZXZlbnRzOworCXVuc2lnbmVkIGludCBudW1fdHJhY2VfZXZlbnRzOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZUUkFDRV9NQ09VTlRfUkVDT1JECisJdW5zaWduZWQgbG9uZyAqZnRyYWNlX2NhbGxzaXRlczsKKwl1bnNpZ25lZCBpbnQgbnVtX2Z0cmFjZV9jYWxsc2l0ZXM7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NT0RVTEVfVU5MT0FECiAJLyogV2hhdCBtb2R1bGVzIGRlcGVuZCBvbiBtZT8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbXV0ZXguaCBiL2luY2x1ZGUvbGludXgvbXV0ZXguaAppbmRleCAzMDY5ZWM3Li44NzhjYWI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L211dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tdXRleC5oCkBAIC0xNTAsNSArMTUwLDYgQEAKICAqLwogZXh0ZXJuIGludCBtdXRleF90cnlsb2NrKHN0cnVjdCBtdXRleCAqbG9jayk7CiBleHRlcm4gdm9pZCBtdXRleF91bmxvY2soc3RydWN0IG11dGV4ICpsb2NrKTsKK2V4dGVybiBpbnQgYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jayhhdG9taWNfdCAqY250LCBzdHJ1Y3QgbXV0ZXggKmxvY2spOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggMGY3MTgxMi4uZDdkMWM0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTE5OTYsMTAgKzE5OTYsMTIgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9PWFNFTUlfUENJZTk1Ml8xX1UJMHhDMTE4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1hTRU1JX1BDSWU5NTJfMV9HVQkweEMxMUMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTQJMHg5NTAxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1hTRU1JX0M5NTAJMHg5NTBCCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfT1hTRU1JXzE2UENJOTVOCTB4OTUxMQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1NFBQCTB4OTUxMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX09YU0VNSV8xNlBDSTk1MgkweDk1MjEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9PWFNFTUlfMTZQQ0k5NTJQUAkweDk1MjMKKyNkZWZpbmUgUENJX1NVQkRFVklDRV9JRF9PWFNFTUlfQzk1MAkweDAwMDEKIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NIRUxTSU8JCTB4MTQyNQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oIGIvaW5jbHVkZS9saW51eC9wZXJjcHUuaAppbmRleCAxNTgxZmYyLi4yNmZkOWQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvbGludXgvcGVyY3B1LmgKQEAgLTg2LDcgKzg2LDEyIEBACiAJdm9pZCAqcHRyc1sxXTsKIH07CiAKKy8qIHBvaW50ZXIgZGlzZ3Vpc2luZyBtZXNzZXMgdXAgdGhlIGttZW1sZWFrIG9iamVjdHMgdHJhY2tpbmcgKi8KKyNpZm5kZWYgQ09ORklHX0RFQlVHX0tNRU1MRUFLCiAjZGVmaW5lIF9fcGVyY3B1X2Rpc2d1aXNlKHBkYXRhKSAoc3RydWN0IHBlcmNwdV9kYXRhICopfih1bnNpZ25lZCBsb25nKShwZGF0YSkKKyNlbHNlCisjZGVmaW5lIF9fcGVyY3B1X2Rpc2d1aXNlKHBkYXRhKSAoc3RydWN0IHBlcmNwdV9kYXRhICopKHBkYXRhKQorI2VuZGlmCiAKICNkZWZpbmUgcGVyX2NwdV9wdHIocHRyLCBjcHUpCQkJCQkJXAogKHsJCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmZfY291bnRlci5oIGIvaW5jbHVkZS9saW51eC9wZXJmX2NvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTEzMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wZXJmX2NvdW50ZXIuaApAQCAtMCwwICsxLDY5NyBAQAorLyoKKyAqICBQZXJmb3JtYW5jZSBjb3VudGVyczoKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqICAgIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBSZWQgSGF0LCBJbmMuLCBQZXRlciBaaWpsc3RyYQorICoKKyAqICBEYXRhIHR5cGUgZGVmaW5pdGlvbnMsIGRlY2xhcmF0aW9ucywgcHJvdG90eXBlcy4KKyAqCisgKiAgICBTdGFydGVkIGJ5OiBUaG9tYXMgR2xlaXhuZXIgYW5kIEluZ28gTW9sbmFyCisgKgorICogIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisjaWZuZGVmIF9MSU5VWF9QRVJGX0NPVU5URVJfSAorI2RlZmluZSBfTElOVVhfUEVSRl9DT1VOVEVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBVc2VyLXNwYWNlIEFCSSBiaXRzOgorICovCisKKy8qCisgKiBhdHRyLnR5cGUKKyAqLworZW51bSBwZXJmX3R5cGVfaWQgeworCVBFUkZfVFlQRV9IQVJEV0FSRQkJCT0gMCwKKwlQRVJGX1RZUEVfU09GVFdBUkUJCQk9IDEsCisJUEVSRl9UWVBFX1RSQUNFUE9JTlQJCQk9IDIsCisJUEVSRl9UWVBFX0hXX0NBQ0hFCQkJPSAzLAorCVBFUkZfVFlQRV9SQVcJCQkJPSA0LAorCisJUEVSRl9UWVBFX01BWCwJCQkJLyogbm9uLUFCSSAqLworfTsKKworLyoKKyAqIEdlbmVyYWxpemVkIHBlcmZvcm1hbmNlIGNvdW50ZXIgZXZlbnQgdHlwZXMsIHVzZWQgYnkgdGhlCisgKiBhdHRyLmV2ZW50X2lkIHBhcmFtZXRlciBvZiB0aGUgc3lzX3BlcmZfY291bnRlcl9vcGVuKCkKKyAqIHN5c2NhbGw6CisgKi8KK2VudW0gcGVyZl9od19pZCB7CisJLyoKKwkgKiBDb21tb24gaGFyZHdhcmUgZXZlbnRzLCBnZW5lcmFsaXplZCBieSB0aGUga2VybmVsOgorCSAqLworCVBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUwkJPSAwLAorCVBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTCQk9IDIsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVMJCT0gMywKKwlQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlMJPSA0LAorCVBFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFUwkJPSA1LAorCVBFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFUwkJPSA2LAorCisJUEVSRl9DT1VOVF9IV19NQVgsCQkJLyogbm9uLUFCSSAqLworfTsKKworLyoKKyAqIEdlbmVyYWxpemVkIGhhcmR3YXJlIGNhY2hlIGNvdW50ZXJzOgorICoKKyAqICAgICAgIHsgTDEtRCwgTDEtSSwgTExDLCBJVExCLCBEVExCLCBCUFUgfSB4CisgKiAgICAgICB7IHJlYWQsIHdyaXRlLCBwcmVmZXRjaCB9IHgKKyAqICAgICAgIHsgYWNjZXNzZXMsIG1pc3NlcyB9CisgKi8KK2VudW0gcGVyZl9od19jYWNoZV9pZCB7CisJUEVSRl9DT1VOVF9IV19DQUNIRV9MMUQJCQk9IDAsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9MMUkJCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9MTAkJCT0gMiwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0RUTEIJCT0gMywKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0lUTEIJCT0gNCwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0JQVQkJCT0gNSwKKworCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYLAkJLyogbm9uLUFCSSAqLworfTsKKworZW51bSBwZXJmX2h3X2NhY2hlX29wX2lkIHsKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQJCT0gMCwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1dSSVRFCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9QUkVGRVRDSAkJPSAyLAorCisJUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVgsCQkvKiBub24tQUJJICovCit9OworCitlbnVtIHBlcmZfaHdfY2FjaGVfb3BfcmVzdWx0X2lkIHsKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9BQ0NFU1MJPSAwLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01JU1MJCT0gMSwKKworCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCwJCS8qIG5vbi1BQkkgKi8KK307CisKKy8qCisgKiBTcGVjaWFsICJzb2Z0d2FyZSIgY291bnRlcnMgcHJvdmlkZWQgYnkgdGhlIGtlcm5lbCwgZXZlbiBpZiB0aGUgaGFyZHdhcmUKKyAqIGRvZXMgbm90IHN1cHBvcnQgcGVyZm9ybWFuY2UgY291bnRlcnMuIFRoZXNlIGNvdW50ZXJzIG1lYXN1cmUgdmFyaW91cworICogcGh5c2ljYWwgYW5kIHN3IGV2ZW50cyBvZiB0aGUga2VybmVsIChhbmQgYWxsb3cgdGhlIHByb2ZpbGluZyBvZiB0aGVtIGFzCisgKiB3ZWxsKToKKyAqLworZW51bSBwZXJmX3N3X2lkcyB7CisJUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0sJCQk9IDAsCisJUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLCQk9IDEsCisJUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUwkJPSAyLAorCVBFUkZfQ09VTlRfU1dfQ09OVEVYVF9TV0lUQ0hFUwkJPSAzLAorCVBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElPTlMJCT0gNCwKKwlQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTgkJPSA1LAorCVBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKCQk9IDYsCisKKwlQRVJGX0NPVU5UX1NXX01BWCwJCQkvKiBub24tQUJJICovCit9OworCisvKgorICogQml0cyB0aGF0IGNhbiBiZSBzZXQgaW4gYXR0ci5zYW1wbGVfdHlwZSB0byByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBpbiB0aGUgb3ZlcmZsb3cgcGFja2V0cy4KKyAqLworZW51bSBwZXJmX2NvdW50ZXJfc2FtcGxlX2Zvcm1hdCB7CisJUEVSRl9TQU1QTEVfSVAJCQkJPSAxVSA8PCAwLAorCVBFUkZfU0FNUExFX1RJRAkJCQk9IDFVIDw8IDEsCisJUEVSRl9TQU1QTEVfVElNRQkJCT0gMVUgPDwgMiwKKwlQRVJGX1NBTVBMRV9BRERSCQkJPSAxVSA8PCAzLAorCVBFUkZfU0FNUExFX0dST1VQCQkJPSAxVSA8PCA0LAorCVBFUkZfU0FNUExFX0NBTExDSEFJTgkJCT0gMVUgPDwgNSwKKwlQRVJGX1NBTVBMRV9JRAkJCQk9IDFVIDw8IDYsCisJUEVSRl9TQU1QTEVfQ1BVCQkJCT0gMVUgPDwgNywKKwlQRVJGX1NBTVBMRV9QRVJJT0QJCQk9IDFVIDw8IDgsCit9OworCisvKgorICogQml0cyB0aGF0IGNhbiBiZSBzZXQgaW4gYXR0ci5yZWFkX2Zvcm1hdCB0byByZXF1ZXN0IHRoYXQKKyAqIHJlYWRzIG9uIHRoZSBjb3VudGVyIHNob3VsZCByZXR1cm4gdGhlIGluZGljYXRlZCBxdWFudGl0aWVzLAorICogaW4gaW5jcmVhc2luZyBvcmRlciBvZiBiaXQgdmFsdWUsIGFmdGVyIHRoZSBjb3VudGVyIHZhbHVlLgorICovCitlbnVtIHBlcmZfY291bnRlcl9yZWFkX2Zvcm1hdCB7CisJUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVECQk9IDFVIDw8IDAsCisJUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HCQk9IDFVIDw8IDEsCisJUEVSRl9GT1JNQVRfSUQJCQkJPSAxVSA8PCAyLAorfTsKKworLyoKKyAqIEhhcmR3YXJlIGV2ZW50IHRvIG1vbml0b3IgdmlhIGEgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyBjb3VudGVyOgorICovCitzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgeworCS8qCisJICogTWFqb3IgdHlwZTogaGFyZHdhcmUvc29mdHdhcmUvdHJhY2Vwb2ludC9ldGMuCisJICovCisJX191MzIJCQl0eXBlOworCV9fdTMyCQkJX19yZXNlcnZlZF8xOworCisJLyoKKwkgKiBUeXBlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisJICovCisJX191NjQJCQljb25maWc7CisKKwl1bmlvbiB7CisJCV9fdTY0CQlzYW1wbGVfcGVyaW9kOworCQlfX3U2NAkJc2FtcGxlX2ZyZXE7CisJfTsKKworCV9fdTY0CQkJc2FtcGxlX3R5cGU7CisJX191NjQJCQlyZWFkX2Zvcm1hdDsKKworCV9fdTY0CQkJZGlzYWJsZWQgICAgICAgOiAgMSwgLyogb2ZmIGJ5IGRlZmF1bHQgICAgICAgICovCisJCQkJaW5oZXJpdAkgICAgICAgOiAgMSwgLyogY2hpbGRyZW4gaW5oZXJpdCBpdCAgICovCisJCQkJcGlubmVkCSAgICAgICA6ICAxLCAvKiBtdXN0IGFsd2F5cyBiZSBvbiBQTVUgKi8KKwkJCQlleGNsdXNpdmUgICAgICA6ICAxLCAvKiBvbmx5IGdyb3VwIG9uIFBNVSAgICAgKi8KKwkJCQlleGNsdWRlX3VzZXIgICA6ICAxLCAvKiBkb24ndCBjb3VudCB1c2VyICAgICAgKi8KKwkJCQlleGNsdWRlX2tlcm5lbCA6ICAxLCAvKiBkaXR0byBrZXJuZWwgICAgICAgICAgKi8KKwkJCQlleGNsdWRlX2h2ICAgICA6ICAxLCAvKiBkaXR0byBoeXBlcnZpc29yICAgICAgKi8KKwkJCQlleGNsdWRlX2lkbGUgICA6ICAxLCAvKiBkb24ndCBjb3VudCB3aGVuIGlkbGUgKi8KKwkJCQltbWFwICAgICAgICAgICA6ICAxLCAvKiBpbmNsdWRlIG1tYXAgZGF0YSAgICAgKi8KKwkJCQljb21tCSAgICAgICA6ICAxLCAvKiBpbmNsdWRlIGNvbW0gZGF0YSAgICAgKi8KKwkJCQlmcmVxICAgICAgICAgICA6ICAxLCAvKiB1c2UgZnJlcSwgbm90IHBlcmlvZCAgKi8KKworCQkJCV9fcmVzZXJ2ZWRfMiAgIDogNTM7CisKKwlfX3UzMgkJCXdha2V1cF9ldmVudHM7CS8qIHdha2V1cCBldmVyeSBuIGV2ZW50cyAqLworCV9fdTMyCQkJX19yZXNlcnZlZF8zOworCisJX191NjQJCQlfX3Jlc2VydmVkXzQ7Cit9OworCisvKgorICogSW9jdGxzIHRoYXQgY2FuIGJlIGRvbmUgb24gYSBwZXJmIGNvdW50ZXIgZmQ6CisgKi8KKyNkZWZpbmUgUEVSRl9DT1VOVEVSX0lPQ19FTkFCTEUJCV9JTyAoJyQnLCAwKQorI2RlZmluZSBQRVJGX0NPVU5URVJfSU9DX0RJU0FCTEUJX0lPICgnJCcsIDEpCisjZGVmaW5lIFBFUkZfQ09VTlRFUl9JT0NfUkVGUkVTSAlfSU8gKCckJywgMikKKyNkZWZpbmUgUEVSRl9DT1VOVEVSX0lPQ19SRVNFVAkJX0lPICgnJCcsIDMpCisjZGVmaW5lIFBFUkZfQ09VTlRFUl9JT0NfUEVSSU9ECQlfSU9XKCckJywgNCwgdTY0KQorCitlbnVtIHBlcmZfY291bnRlcl9pb2NfZmxhZ3MgeworCVBFUkZfSU9DX0ZMQUdfR1JPVVAJCT0gMVUgPDwgMCwKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgbWFwcGVkIHZpYSBtbWFwCisgKi8KK3N0cnVjdCBwZXJmX2NvdW50ZXJfbW1hcF9wYWdlIHsKKwlfX3UzMgl2ZXJzaW9uOwkJLyogdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlfX3UzMgljb21wYXRfdmVyc2lvbjsJCS8qIGxvd2VzdCB2ZXJzaW9uIHRoaXMgaXMgY29tcGF0IHdpdGggKi8KKworCS8qCisJICogQml0cyBuZWVkZWQgdG8gcmVhZCB0aGUgaHcgY291bnRlcnMgaW4gdXNlci1zcGFjZS4KKwkgKgorCSAqICAgdTMyIHNlcTsKKwkgKiAgIHM2NCBjb3VudDsKKwkgKgorCSAqICAgZG8geworCSAqICAgICBzZXEgPSBwYy0+bG9jazsKKwkgKgorCSAqICAgICBiYXJyaWVyKCkKKwkgKiAgICAgaWYgKHBjLT5pbmRleCkgeworCSAqICAgICAgIGNvdW50ID0gcG1jX3JlYWQocGMtPmluZGV4IC0gMSk7CisJICogICAgICAgY291bnQgKz0gcGMtPm9mZnNldDsKKwkgKiAgICAgfSBlbHNlCisJICogICAgICAgZ290byByZWd1bGFyX3JlYWQ7CisJICoKKwkgKiAgICAgYmFycmllcigpOworCSAqICAgfSB3aGlsZSAocGMtPmxvY2sgIT0gc2VxKTsKKwkgKgorCSAqIE5PVEU6IGZvciBvYnZpb3VzIHJlYXNvbiB0aGlzIG9ubHkgd29ya3Mgb24gc2VsZi1tb25pdG9yaW5nCisJICogICAgICAgcHJvY2Vzc2VzLgorCSAqLworCV9fdTMyCWxvY2s7CQkJLyogc2VxbG9jayBmb3Igc3luY2hyb25pemF0aW9uICovCisJX191MzIJaW5kZXg7CQkJLyogaGFyZHdhcmUgY291bnRlciBpZGVudGlmaWVyICovCisJX19zNjQJb2Zmc2V0OwkJCS8qIGFkZCB0byBoYXJkd2FyZSBjb3VudGVyIHZhbHVlICovCisKKwkvKgorCSAqIENvbnRyb2wgZGF0YSBmb3IgdGhlIG1tYXAoKSBkYXRhIGJ1ZmZlci4KKwkgKgorCSAqIFVzZXItc3BhY2UgcmVhZGluZyB0aGlzIHZhbHVlIHNob3VsZCBpc3N1ZSBhbiBybWIoKSwgb24gU01QIGNhcGFibGUKKwkgKiBwbGF0Zm9ybXMsIGFmdGVyIHJlYWRpbmcgdGhpcyB2YWx1ZSAtLSBzZWUgcGVyZl9jb3VudGVyX3dha2V1cCgpLgorCSAqLworCV9fdTY0ICAgZGF0YV9oZWFkOwkJLyogaGVhZCBpbiB0aGUgZGF0YSBzZWN0aW9uICovCit9OworCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19DUFVNT0RFX01BU0sJCSgzIDw8IDApCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19DUFVNT0RFX1VOS05PV04JCSgwIDw8IDApCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19LRVJORUwJCQkoMSA8PCAwKQorI2RlZmluZSBQRVJGX0VWRU5UX01JU0NfVVNFUgkJCSgyIDw8IDApCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19IWVBFUlZJU09SCQkoMyA8PCAwKQorI2RlZmluZSBQRVJGX0VWRU5UX01JU0NfT1ZFUkZMT1cJCSgxIDw8IDIpCisKK3N0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciB7CisJX191MzIJdHlwZTsKKwlfX3UxNgltaXNjOworCV9fdTE2CXNpemU7Cit9OworCitlbnVtIHBlcmZfZXZlbnRfdHlwZSB7CisKKwkvKgorCSAqIFRoZSBNTUFQIGV2ZW50cyByZWNvcmQgdGhlIFBST1RfRVhFQyBtYXBwaW5ncyBzbyB0aGF0IHdlIGNhbgorCSAqIGNvcnJlbGF0ZSB1c2Vyc3BhY2UgSVBzIHRvIGNvZGUuIFRoZXkgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKwkgKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgorCSAqCXUzMgkJCQlwaWQsIHRpZDsKKwkgKgl1NjQJCQkJYWRkcjsKKwkgKgl1NjQJCQkJbGVuOworCSAqCXU2NAkJCQlwZ29mZjsKKwkgKgljaGFyCQkJCWZpbGVuYW1lW107CisJICogfTsKKwkgKi8KKwlQRVJGX0VWRU5UX01NQVAJCQk9IDEsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgorCSAqCXUzMgkJCQlwaWQsIHRpZDsKKwkgKgljaGFyCQkJCWNvbW1bXTsKKwkgKiB9OworCSAqLworCVBFUkZfRVZFTlRfQ09NTQkJCT0gMywKKworCS8qCisJICogc3RydWN0IHsKKwkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCSAqCXU2NAkJCQl0aW1lOworCSAqCXU2NAkJCQlpZDsKKwkgKgl1NjQJCQkJc2FtcGxlX3BlcmlvZDsKKwkgKiB9OworCSAqLworCVBFUkZfRVZFTlRfUEVSSU9ECQk9IDQsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgl1NjQJCQkJdGltZTsKKwkgKgl1NjQJCQkJaWQ7CisJICogfTsKKwkgKi8KKwlQRVJGX0VWRU5UX1RIUk9UVExFCQk9IDUsCisJUEVSRl9FVkVOVF9VTlRIUk9UVExFCQk9IDYsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgl1MzIJCQkJcGlkLCBwcGlkOworCSAqIH07CisJICovCisJUEVSRl9FVkVOVF9GT1JLCQkJPSA3LAorCisJLyoKKwkgKiBXaGVuIGhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XIHRoZSBldmVudF90eXBlIGZpZWxkCisJICogd2lsbCBiZSBQRVJGX1JFQ09SRF8qCisJICoKKwkgKiBzdHJ1Y3QgeworCSAqCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJICoKKwkgKgl7IHU2NAkJCWlwOwkgIH0gJiYgUEVSRl9SRUNPUkRfSVAKKwkgKgl7IHUzMgkJCXBpZCwgdGlkOyB9ICYmIFBFUkZfUkVDT1JEX1RJRAorCSAqCXsgdTY0CQkJdGltZTsgICAgIH0gJiYgUEVSRl9SRUNPUkRfVElNRQorCSAqCXsgdTY0CQkJYWRkcjsgICAgIH0gJiYgUEVSRl9SRUNPUkRfQUREUgorCSAqCXsgdTY0CQkJY29uZmlnOyAgIH0gJiYgUEVSRl9SRUNPUkRfQ09ORklHCisJICoJeyB1MzIJCQljcHUsIHJlczsgfSAmJiBQRVJGX1JFQ09SRF9DUFUKKwkgKgorCSAqCXsgdTY0CQkJbnI7CisJICoJICB7IHU2NCBpZCwgdmFsOyB9CWNudFtucl07ICB9ICYmIFBFUkZfUkVDT1JEX0dST1VQCisJICoKKwkgKgl7IHUxNgkJCW5yLAorCSAqCQkJCWh2LAorCSAqCQkJCWtlcm5lbCwKKwkgKgkJCQl1c2VyOworCSAqCSAgdTY0CQkJaXBzW25yXTsgIH0gJiYgUEVSRl9SRUNPUkRfQ0FMTENIQUlOCisJICogfTsKKwkgKi8KK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKgorICogS2VybmVsLWludGVybmFsIGRhdGEgdHlwZXMgYW5kIGRlZmluaXRpb25zOgorICovCisKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworIyBpbmNsdWRlIDxhc20vcGVyZl9jb3VudGVyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworc3RydWN0IHRhc2tfc3RydWN0OworCisvKioKKyAqIHN0cnVjdCBod19wZXJmX2NvdW50ZXIgLSBwZXJmb3JtYW5jZSBjb3VudGVyIGhhcmR3YXJlIGRldGFpbHM6CisgKi8KK3N0cnVjdCBod19wZXJmX2NvdW50ZXIgeworI2lmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCisJdW5pb24geworCQlzdHJ1Y3QgeyAvKiBoYXJkd2FyZSAqLworCQkJdTY0CQljb25maWc7CisJCQl1bnNpZ25lZCBsb25nCWNvbmZpZ19iYXNlOworCQkJdW5zaWduZWQgbG9uZwljb3VudGVyX2Jhc2U7CisJCQlpbnQJCWlkeDsKKwkJfTsKKwkJdW5pb24geyAvKiBzb2Z0d2FyZSAqLworCQkJYXRvbWljNjRfdAljb3VudDsKKwkJCXN0cnVjdCBocnRpbWVyCWhydGltZXI7CisJCX07CisJfTsKKwlhdG9taWM2NF90CQkJcHJldl9jb3VudDsKKwl1NjQJCQkJc2FtcGxlX3BlcmlvZDsKKwl1NjQJCQkJbGFzdF9wZXJpb2Q7CisJYXRvbWljNjRfdAkJCXBlcmlvZF9sZWZ0OworCXU2NAkJCQlpbnRlcnJ1cHRzOworCisJdTY0CQkJCWZyZXFfY291bnQ7CisJdTY0CQkJCWZyZXFfaW50ZXJydXB0czsKKwl1NjQJCQkJZnJlcV9zdGFtcDsKKyNlbmRpZgorfTsKKworc3RydWN0IHBlcmZfY291bnRlcjsKKworLyoqCisgKiBzdHJ1Y3QgcG11IC0gZ2VuZXJpYyBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIHVuaXQKKyAqLworc3RydWN0IHBtdSB7CisJaW50ICgqZW5hYmxlKQkJCShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKTsKKwl2b2lkICgqZGlzYWJsZSkJCQkoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcik7CisJdm9pZCAoKnJlYWQpCQkJKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpOworCXZvaWQgKCp1bnRocm90dGxlKQkJKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpOworfTsKKworLyoqCisgKiBlbnVtIHBlcmZfY291bnRlcl9hY3RpdmVfc3RhdGUgLSB0aGUgc3RhdGVzIG9mIGEgY291bnRlcgorICovCitlbnVtIHBlcmZfY291bnRlcl9hY3RpdmVfc3RhdGUgeworCVBFUkZfQ09VTlRFUl9TVEFURV9FUlJPUgk9IC0yLAorCVBFUkZfQ09VTlRFUl9TVEFURV9PRkYJCT0gLTEsCisJUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFCT0gIDAsCisJUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRQk9ICAxLAorfTsKKworc3RydWN0IGZpbGU7CisKK3N0cnVjdCBwZXJmX21tYXBfZGF0YSB7CisJc3RydWN0IHJjdV9oZWFkCQkJcmN1X2hlYWQ7CisJaW50CQkJCW5yX3BhZ2VzOwkvKiBuciBvZiBkYXRhIHBhZ2VzICAqLworCWludAkJCQlucl9sb2NrZWQ7CS8qIG5yIHBhZ2VzIG1sb2NrZWQgICovCisKKwlhdG9taWNfdAkJCXBvbGw7CQkvKiBQT0xMXyBmb3Igd2FrZXVwcyAqLworCWF0b21pY190CQkJZXZlbnRzOwkJLyogZXZlbnQgbGltaXQgICAgICAgKi8KKworCWF0b21pY19sb25nX3QJCQloZWFkOwkJLyogd3JpdGUgcG9zaXRpb24gICAgKi8KKwlhdG9taWNfbG9uZ190CQkJZG9uZV9oZWFkOwkvKiBjb21wbGV0ZWQgaGVhZCAgICAqLworCisJYXRvbWljX3QJCQlsb2NrOwkJLyogY29uY3VycmVudCB3cml0ZXMgKi8KKworCWF0b21pY190CQkJd2FrZXVwOwkJLyogbmVlZHMgYSB3YWtldXAgICAgKi8KKworCXN0cnVjdCBwZXJmX2NvdW50ZXJfbW1hcF9wYWdlICAgKnVzZXJfcGFnZTsKKwl2b2lkCQkJCSpkYXRhX3BhZ2VzWzBdOworfTsKKworc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSB7CisJc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqbmV4dDsKKwl2b2lkICgqZnVuYykoc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqKTsKK307CisKKy8qKgorICogc3RydWN0IHBlcmZfY291bnRlciAtIHBlcmZvcm1hbmNlIGNvdW50ZXIga2VybmVsIHJlcHJlc2VudGF0aW9uOgorICovCitzdHJ1Y3QgcGVyZl9jb3VudGVyIHsKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3RfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZAkJZXZlbnRfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZAkJc2libGluZ19saXN0OworCWludAkJCQlucl9zaWJsaW5nczsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyCQkqZ3JvdXBfbGVhZGVyOworCWNvbnN0IHN0cnVjdCBwbXUJCSpwbXU7CisKKwllbnVtIHBlcmZfY291bnRlcl9hY3RpdmVfc3RhdGUJc3RhdGU7CisJYXRvbWljNjRfdAkJCWNvdW50OworCisJLyoKKwkgKiBUaGVzZSBhcmUgdGhlIHRvdGFsIHRpbWUgaW4gbmFub3NlY29uZHMgdGhhdCB0aGUgY291bnRlcgorCSAqIGhhcyBiZWVuIGVuYWJsZWQgKGkuZS4gZWxpZ2libGUgdG8gcnVuLCBhbmQgdGhlIHRhc2sgaGFzCisJICogYmVlbiBzY2hlZHVsZWQgaW4sIGlmIHRoaXMgaXMgYSBwZXItdGFzayBjb3VudGVyKQorCSAqIGFuZCBydW5uaW5nIChzY2hlZHVsZWQgb250byB0aGUgQ1BVKSwgcmVzcGVjdGl2ZWx5LgorCSAqCisJICogVGhleSBhcmUgY29tcHV0ZWQgZnJvbSB0c3RhbXBfZW5hYmxlZCwgdHN0YW1wX3J1bm5pbmcgYW5kCisJICogdHN0YW1wX3N0b3BwZWQgd2hlbiB0aGUgY291bnRlciBpcyBpbiBJTkFDVElWRSBvciBBQ1RJVkUgc3RhdGUuCisJICovCisJdTY0CQkJCXRvdGFsX3RpbWVfZW5hYmxlZDsKKwl1NjQJCQkJdG90YWxfdGltZV9ydW5uaW5nOworCisJLyoKKwkgKiBUaGVzZSBhcmUgdGltZXN0YW1wcyB1c2VkIGZvciBjb21wdXRpbmcgdG90YWxfdGltZV9lbmFibGVkCisJICogYW5kIHRvdGFsX3RpbWVfcnVubmluZyB3aGVuIHRoZSBjb3VudGVyIGlzIGluIElOQUNUSVZFIG9yCisJICogQUNUSVZFIHN0YXRlLCBtZWFzdXJlZCBpbiBuYW5vc2Vjb25kcyBmcm9tIGFuIGFyYml0cmFyeSBwb2ludAorCSAqIGluIHRpbWUuCisJICogdHN0YW1wX2VuYWJsZWQ6IHRoZSBub3Rpb25hbCB0aW1lIHdoZW4gdGhlIGNvdW50ZXIgd2FzIGVuYWJsZWQKKwkgKiB0c3RhbXBfcnVubmluZzogdGhlIG5vdGlvbmFsIHRpbWUgd2hlbiB0aGUgY291bnRlciB3YXMgc2NoZWR1bGVkIG9uCisJICogdHN0YW1wX3N0b3BwZWQ6IGluIElOQUNUSVZFIHN0YXRlLCB0aGUgbm90aW9uYWwgdGltZSB3aGVuIHRoZQorCSAqCWNvdW50ZXIgd2FzIHNjaGVkdWxlZCBvZmYuCisJICovCisJdTY0CQkJCXRzdGFtcF9lbmFibGVkOworCXU2NAkJCQl0c3RhbXBfcnVubmluZzsKKwl1NjQJCQkJdHN0YW1wX3N0b3BwZWQ7CisKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIJYXR0cjsKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyCQlodzsKKworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dAkqY3R4OworCXN0cnVjdCBmaWxlCQkJKmZpbHA7CisKKwkvKgorCSAqIFRoZXNlIGFjY3VtdWxhdGUgdG90YWwgdGltZSAoaW4gbmFub3NlY29uZHMpIHRoYXQgY2hpbGRyZW4KKwkgKiBjb3VudGVycyBoYXZlIGJlZW4gZW5hYmxlZCBhbmQgcnVubmluZywgcmVzcGVjdGl2ZWx5LgorCSAqLworCWF0b21pYzY0X3QJCQljaGlsZF90b3RhbF90aW1lX2VuYWJsZWQ7CisJYXRvbWljNjRfdAkJCWNoaWxkX3RvdGFsX3RpbWVfcnVubmluZzsKKworCS8qCisJICogUHJvdGVjdCBhdHRhY2gvZGV0YWNoIGFuZCBjaGlsZF9saXN0OgorCSAqLworCXN0cnVjdCBtdXRleAkJCWNoaWxkX211dGV4OworCXN0cnVjdCBsaXN0X2hlYWQJCWNoaWxkX2xpc3Q7CisJc3RydWN0IHBlcmZfY291bnRlcgkJKnBhcmVudDsKKworCWludAkJCQlvbmNwdTsKKwlpbnQJCQkJY3B1OworCisJc3RydWN0IGxpc3RfaGVhZAkJb3duZXJfZW50cnk7CisJc3RydWN0IHRhc2tfc3RydWN0CQkqb3duZXI7CisKKwkvKiBtbWFwIGJpdHMgKi8KKwlzdHJ1Y3QgbXV0ZXgJCQltbWFwX211dGV4OworCWF0b21pY190CQkJbW1hcF9jb3VudDsKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEJCSpkYXRhOworCisJLyogcG9sbCByZWxhdGVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJCXdhaXRxOworCXN0cnVjdCBmYXN5bmNfc3RydWN0CQkqZmFzeW5jOworCisJLyogZGVsYXllZCB3b3JrIGZvciBOTUlzIGFuZCBzdWNoICovCisJaW50CQkJCXBlbmRpbmdfd2FrZXVwOworCWludAkJCQlwZW5kaW5nX2tpbGw7CisJaW50CQkJCXBlbmRpbmdfZGlzYWJsZTsKKwlzdHJ1Y3QgcGVyZl9wZW5kaW5nX2VudHJ5CXBlbmRpbmc7CisKKwlhdG9taWNfdAkJCWV2ZW50X2xpbWl0OworCisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBwZXJmX2NvdW50ZXIgKik7CisJc3RydWN0IHJjdV9oZWFkCQkJcmN1X2hlYWQ7CisKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZQkJKm5zOworCXU2NAkJCQlpZDsKKyNlbmRpZgorfTsKKworLyoqCisgKiBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgLSBjb3VudGVyIGNvbnRleHQgc3RydWN0dXJlCisgKgorICogVXNlZCBhcyBhIGNvbnRhaW5lciBmb3IgdGFzayBjb3VudGVycyBhbmQgQ1BVIGNvdW50ZXJzIGFzIHdlbGw6CisgKi8KK3N0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCB7CisJLyoKKwkgKiBQcm90ZWN0IHRoZSBzdGF0ZXMgb2YgdGhlIGNvdW50ZXJzIGluIHRoZSBsaXN0LAorCSAqIG5yX2FjdGl2ZSwgYW5kIHRoZSBsaXN0OgorCSAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCS8qCisJICogUHJvdGVjdCB0aGUgbGlzdCBvZiBjb3VudGVycy4gIExvY2tpbmcgZWl0aGVyIG11dGV4IG9yIGxvY2sKKwkgKiBpcyBzdWZmaWNpZW50IHRvIGVuc3VyZSB0aGUgbGlzdCBkb2Vzbid0IGNoYW5nZTsgdG8gY2hhbmdlCisJICogdGhlIGxpc3QgeW91IG5lZWQgdG8gbG9jayBib3RoIHRoZSBtdXRleCBhbmQgdGhlIHNwaW5sb2NrLgorCSAqLworCXN0cnVjdCBtdXRleAkJCW11dGV4OworCisJc3RydWN0IGxpc3RfaGVhZAkJY291bnRlcl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCWV2ZW50X2xpc3Q7CisJaW50CQkJCW5yX2NvdW50ZXJzOworCWludAkJCQlucl9hY3RpdmU7CisJaW50CQkJCWlzX2FjdGl2ZTsKKwlhdG9taWNfdAkJCXJlZmNvdW50OworCXN0cnVjdCB0YXNrX3N0cnVjdAkJKnRhc2s7CisKKwkvKgorCSAqIENvbnRleHQgY2xvY2ssIHJ1bnMgd2hlbiBjb250ZXh0IGVuYWJsZWQuCisJICovCisJdTY0CQkJCXRpbWU7CisJdTY0CQkJCXRpbWVzdGFtcDsKKworCS8qCisJICogVGhlc2UgZmllbGRzIGxldCB1cyBkZXRlY3Qgd2hlbiB0d28gY29udGV4dHMgaGF2ZSBib3RoCisJICogYmVlbiBjbG9uZWQgKGluaGVyaXRlZCkgZnJvbSBhIGNvbW1vbiBhbmNlc3Rvci4KKwkgKi8KKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQJKnBhcmVudF9jdHg7CisJdTY0CQkJCXBhcmVudF9nZW47CisJdTY0CQkJCWdlbmVyYXRpb247CisJaW50CQkJCXBpbl9jb3VudDsKKwlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3VfaGVhZDsKK307CisKKy8qKgorICogc3RydWN0IHBlcmZfY291bnRlcl9jcHVfY29udGV4dCAtIHBlciBjcHUgY291bnRlciBjb250ZXh0IHN0cnVjdHVyZQorICovCitzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCB7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0CWN0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQJKnRhc2tfY3R4OworCWludAkJCQlhY3RpdmVfb25jcHU7CisJaW50CQkJCW1heF9wZXJ0YXNrOworCWludAkJCQlleGNsdXNpdmU7CisKKwkvKgorCSAqIFJlY3Vyc2lvbiBhdm9pZGFuY2U6CisJICoKKwkgKiB0YXNrLCBzb2Z0aXJxLCBpcnEsIG5taSBjb250ZXh0CisJICovCisJaW50CQkJCXJlY3Vyc2lvbls0XTsKK307CisKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworCisvKgorICogU2V0IGJ5IGFyY2hpdGVjdHVyZSBjb2RlOgorICovCitleHRlcm4gaW50IHBlcmZfbWF4X2NvdW50ZXJzOworCitleHRlcm4gY29uc3Qgc3RydWN0IHBtdSAqaHdfcGVyZl9jb3VudGVyX2luaXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcik7CisKK2V4dGVybiB2b2lkIHBlcmZfY291bnRlcl90YXNrX3NjaGVkX2luKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGNwdSk7CitleHRlcm4gdm9pZCBwZXJmX2NvdW50ZXJfdGFza19zY2hlZF9vdXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsIGludCBjcHUpOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX3Rhc2tfdGljayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjcHUpOworZXh0ZXJuIGludCBwZXJmX2NvdW50ZXJfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKTsKK2V4dGVybiB2b2lkIHBlcmZfY291bnRlcl9mcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK2V4dGVybiB2b2lkIHBlcmZfY291bnRlcl9kb19wZW5kaW5nKHZvaWQpOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX3ByaW50X2RlYnVnKHZvaWQpOworZXh0ZXJuIHZvaWQgX19wZXJmX2Rpc2FibGUodm9pZCk7CitleHRlcm4gYm9vbCBfX3BlcmZfZW5hYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgcGVyZl9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgcGVyZl9lbmFibGUodm9pZCk7CitleHRlcm4gaW50IHBlcmZfY291bnRlcl90YXNrX2Rpc2FibGUodm9pZCk7CitleHRlcm4gaW50IHBlcmZfY291bnRlcl90YXNrX2VuYWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgaHdfcGVyZl9ncm91cF9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jb3VudGVyICpncm91cF9sZWFkZXIsCisJICAgICAgIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJICAgICAgIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIHBlcmZfY291bnRlcl91cGRhdGVfdXNlcnBhZ2Uoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcik7CisKK3N0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIHsKKwlzdHJ1Y3QgcHRfcmVncwkJCSpyZWdzOworCXU2NAkJCQlhZGRyOworCXU2NAkJCQlwZXJpb2Q7Cit9OworCitleHRlcm4gaW50IHBlcmZfY291bnRlcl9vdmVyZmxvdyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBpbnQgbm1pLAorCQkJCSBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSk7CisKKy8qCisgKiBSZXR1cm4gMSBmb3IgYSBzb2Z0d2FyZSBjb3VudGVyLCAwIGZvciBhIGhhcmR3YXJlIGNvdW50ZXIKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfc29mdHdhcmVfY291bnRlcihzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXJldHVybiAoY291bnRlci0+YXR0ci50eXBlICE9IFBFUkZfVFlQRV9SQVcpICYmCisJCShjb3VudGVyLT5hdHRyLnR5cGUgIT0gUEVSRl9UWVBFX0hBUkRXQVJFKTsKK30KKworZXh0ZXJuIHZvaWQgcGVyZl9zd2NvdW50ZXJfZXZlbnQodTMyLCB1NjQsIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgdTY0KTsKKworZXh0ZXJuIHZvaWQgX19wZXJmX2NvdW50ZXJfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2NvdW50ZXJfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpCisJCV9fcGVyZl9jb3VudGVyX21tYXAodm1hKTsKK30KKworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2NvbW0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCitleHRlcm4gdm9pZCBwZXJmX2NvdW50ZXJfdGFza19taWdyYXRpb24oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KTsKKworI2RlZmluZSBNQVhfU1RBQ0tfREVQVEgJCQkyNTUKKworc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5IHsKKwl1MTYJCQkJbnI7CisJdTE2CQkJCWh2OworCXUxNgkJCQlrZXJuZWw7CisJdTE2CQkJCXVzZXI7CisJdTY0CQkJCWlwW01BWF9TVEFDS19ERVBUSF07Cit9OworCitleHRlcm4gc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICpwZXJmX2NhbGxjaGFpbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK2V4dGVybiBpbnQgc3lzY3RsX3BlcmZfY291bnRlcl9wYXJhbm9pZDsKK2V4dGVybiBpbnQgc3lzY3RsX3BlcmZfY291bnRlcl9tbG9jazsKK2V4dGVybiBpbnQgc3lzY3RsX3BlcmZfY291bnRlcl9zYW1wbGVfcmF0ZTsKKworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2luaXQodm9pZCk7CisKKyNpZm5kZWYgcGVyZl9taXNjX2ZsYWdzCisjZGVmaW5lIHBlcmZfbWlzY19mbGFncyhyZWdzKQkodXNlcl9tb2RlKHJlZ3MpID8gUEVSRl9FVkVOVF9NSVNDX1VTRVIgOiBcCisJCQkJIFBFUkZfRVZFTlRfTUlTQ19LRVJORUwpCisjZGVmaW5lIHBlcmZfaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQlpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCisjZW5kaWYKKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAorcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfaW4oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQKK3BlcmZfY291bnRlcl90YXNrX3NjaGVkX291dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0LCBpbnQgY3B1KQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQKK3BlcmZfY291bnRlcl90YXNrX3RpY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQkJeyB9CitzdGF0aWMgaW5saW5lIGludCBwZXJmX2NvdW50ZXJfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2NvdW50ZXJfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9mcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQl7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2NvdW50ZXJfZG9fcGVuZGluZyh2b2lkKQkJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9wcmludF9kZWJ1Zyh2b2lkKQkJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfZGlzYWJsZSh2b2lkKQkJCQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9lbmFibGUodm9pZCkJCQkJCXsgfQorc3RhdGljIGlubGluZSBpbnQgcGVyZl9jb3VudGVyX3Rhc2tfZGlzYWJsZSh2b2lkKQl7IHJldHVybiAtRUlOVkFMOyB9CitzdGF0aWMgaW5saW5lIGludCBwZXJmX2NvdW50ZXJfdGFza19lbmFibGUodm9pZCkJeyByZXR1cm4gLUVJTlZBTDsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BlcmZfc3djb3VudGVyX2V2ZW50KHUzMiBldmVudCwgdTY0IG5yLCBpbnQgbm1pLAorCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1NjQgYWRkcikJCQl7IH0KKworc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQl7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2NvdW50ZXJfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9jb3VudGVyX2luaXQodm9pZCkJCQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9jb3VudGVyX3Rhc2tfbWlncmF0aW9uKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgICAgIGludCBjcHUpCQkJeyB9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfTElOVVhfUEVSRl9DT1VOVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmggYi9pbmNsdWRlL2xpbnV4L3BpcGVfZnNfaS5oCmluZGV4IGM4ZjAzODUuLmI0M2E5ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGlwZV9mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC9waXBlX2ZzX2kuaApAQCAtMTUyLDUgKzE1Miw2IEBACiB2b2lkIGdlbmVyaWNfcGlwZV9idWZfZ2V0KHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc3RydWN0IHBpcGVfYnVmZmVyICopOwogaW50IGdlbmVyaWNfcGlwZV9idWZfY29uZmlybShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICosIHN0cnVjdCBwaXBlX2J1ZmZlciAqKTsKIGludCBnZW5lcmljX3BpcGVfYnVmX3N0ZWFsKHN0cnVjdCBwaXBlX2lub2RlX2luZm8gKiwgc3RydWN0IHBpcGVfYnVmZmVyICopOwordm9pZCBnZW5lcmljX3BpcGVfYnVmX3JlbGVhc2Uoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqLCBzdHJ1Y3QgcGlwZV9idWZmZXIgKik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcmN0bC5oIGIvaW5jbHVkZS9saW51eC9wcmN0bC5oCmluZGV4IDQ4ZDg4N2UuLmIwMGRmNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJjdGwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKQEAgLTg1LDQgKzg1LDcgQEAKICNkZWZpbmUgUFJfU0VUX1RJTUVSU0xBQ0sgMjkKICNkZWZpbmUgUFJfR0VUX1RJTUVSU0xBQ0sgMzAKIAorI2RlZmluZSBQUl9UQVNLX1BFUkZfQ09VTlRFUlNfRElTQUJMRQkJMzEKKyNkZWZpbmUgUFJfVEFTS19QRVJGX0NPVU5URVJTX0VOQUJMRQkJMzIKKwogI2VuZGlmIC8qIF9MSU5VWF9QUkNUTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaAppbmRleCA2N2MxNTY1Li41OWUxMzNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKQEAgLTk1LDcgKzk1LDYgQEAKIAkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXdfcGFyZW50KTsKIGV4dGVybiB2b2lkIF9fcHRyYWNlX3VubGluayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKTsKIGV4dGVybiB2b2lkIGV4aXRfcHRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHJhY2VyKTsKLWV4dGVybiB2b2lkIHB0cmFjZV9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncyk7CiAjZGVmaW5lIFBUUkFDRV9NT0RFX1JFQUQgICAxCiAjZGVmaW5lIFBUUkFDRV9NT0RFX0FUVEFDSCAyCiAvKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGRlbmlhbC4gKi8KQEAgLTMyNywxNSArMzI2LDYgQEAKICNkZWZpbmUgYXJjaF9wdHJhY2VfdW50cmFjZSh0YXNrKQkJZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZm5kZWYgYXJjaF9wdHJhY2VfZm9yawotLyoKLSAqIERvIG1hY2hpbmUtc3BlY2lmaWMgd29yayB0byBpbml0aWFsaXplIGEgbmV3IHRhc2suCi0gKgotICogVGhpcyBpcyBjYWxsZWQgZnJvbSBjb3B5X3Byb2Nlc3MoKS4KLSAqLwotI2RlZmluZSBhcmNoX3B0cmFjZV9mb3JrKGNoaWxkLCBjbG9uZV9mbGFncykJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KIGV4dGVybiBpbnQgdGFza19jdXJyZW50X3N5c2NhbGwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsIGxvbmcgKmNhbGxubywKIAkJCQl1bnNpZ25lZCBsb25nIGFyZ3NbNl0sIHVuc2lnbmVkIGludCBtYXhhcmdzLAogCQkJCXVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nICpwYyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhdGlvbmFsLmggYi9pbmNsdWRlL2xpbnV4L3JhdGlvbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1MzJmYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcmF0aW9uYWwuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogcmF0aW9uYWwgZnJhY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IGVtbGl4IEdtYkgsIE9za2FyIFNjaGlybWVyIDxvc0BlbWxpeC5jb20+CisgKgorICogaGVscGVyIGZ1bmN0aW9ucyB3aGVuIGNvcGluZyB3aXRoIHJhdGlvbmFsIG51bWJlcnMsCisgKiBlLmcuIHdoZW4gY2FsY3VsYXRpbmcgb3B0aW11bSBudW1lcmF0b3IvZGVub21pbmF0b3IgcGFpcnMgZm9yCisgKiBwbGwgY29uZmlndXJhdGlvbiB0YWtpbmcgaW50byBhY2NvdW50IHJlc3RyaWN0ZWQgcmVnaXN0ZXIgc2l6ZQorICovCisKKyNpZm5kZWYgX0xJTlVYX1JBVElPTkFMX0gKKyNkZWZpbmUgX0xJTlVYX1JBVElPTkFMX0gKKwordm9pZCByYXRpb25hbF9iZXN0X2FwcHJveGltYXRpb24oCisJdW5zaWduZWQgbG9uZyBnaXZlbl9udW1lcmF0b3IsIHVuc2lnbmVkIGxvbmcgZ2l2ZW5fZGVub21pbmF0b3IsCisJdW5zaWduZWQgbG9uZyBtYXhfbnVtZXJhdG9yLCB1bnNpZ25lZCBsb25nIG1heF9kZW5vbWluYXRvciwKKwl1bnNpZ25lZCBsb25nICpiZXN0X251bWVyYXRvciwgdW5zaWduZWQgbG9uZyAqYmVzdF9kZW5vbWluYXRvcik7CisKKyNlbmRpZiAvKiBfTElOVVhfUkFUSU9OQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VsaXN0LmggYi9pbmNsdWRlL2xpbnV4L3JjdWxpc3QuaAppbmRleCBlNjQ5YmQzLi41NzEwZjQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdWxpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdWxpc3QuaApAQCAtMTk4LDYgKzE5OCwzMiBAQAogCWF0LT5wcmV2ID0gbGFzdDsKIH0KIAorLyoqCisgKiBsaXN0X2VudHJ5X3JjdSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5CisgKiBAcHRyOiAgICAgICAgdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHBvaW50ZXIuCisgKiBAdHlwZTogICAgICAgdGhlIHR5cGUgb2YgdGhlIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjogICAgIHRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBUaGlzIHByaW1pdGl2ZSBtYXkgc2FmZWx5IHJ1biBjb25jdXJyZW50bHkgd2l0aCB0aGUgX3JjdSBsaXN0LW11dGF0aW9uCisgKiBwcmltaXRpdmVzIHN1Y2ggYXMgbGlzdF9hZGRfcmN1KCkgYXMgbG9uZyBhcyBpdCdzIGd1YXJkZWQgYnkgcmN1X3JlYWRfbG9jaygpLgorICovCisjZGVmaW5lIGxpc3RfZW50cnlfcmN1KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJY29udGFpbmVyX29mKHJjdV9kZXJlZmVyZW5jZShwdHIpLCB0eXBlLCBtZW1iZXIpCisKKy8qKgorICogbGlzdF9maXJzdF9lbnRyeV9yY3UgLSBnZXQgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSBhIGxpc3QKKyAqIEBwdHI6ICAgICAgICB0aGUgbGlzdCBoZWFkIHRvIHRha2UgdGhlIGVsZW1lbnQgZnJvbS4KKyAqIEB0eXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOiAgICAgdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIE5vdGUsIHRoYXQgbGlzdCBpcyBleHBlY3RlZCB0byBiZSBub3QgZW1wdHkuCisgKgorICogVGhpcyBwcmltaXRpdmUgbWF5IHNhZmVseSBydW4gY29uY3VycmVudGx5IHdpdGggdGhlIF9yY3UgbGlzdC1tdXRhdGlvbgorICogcHJpbWl0aXZlcyBzdWNoIGFzIGxpc3RfYWRkX3JjdSgpIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIGJ5IHJjdV9yZWFkX2xvY2soKS4KKyAqLworI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5X3JjdShwdHIsIHR5cGUsIG1lbWJlcikgXAorCWxpc3RfZW50cnlfcmN1KChwdHIpLT5uZXh0LCB0eXBlLCBtZW1iZXIpCisKICNkZWZpbmUgX19saXN0X2Zvcl9lYWNoX3JjdShwb3MsIGhlYWQpIFwKIAlmb3IgKHBvcyA9IHJjdV9kZXJlZmVyZW5jZSgoaGVhZCktPm5leHQpOyBcCiAJCXBvcyAhPSAoaGVhZCk7IFwKQEAgLTIxNCw5ICsyNDAsOSBAQAogICogYXMgbG9uZyBhcyB0aGUgdHJhdmVyc2FsIGlzIGd1YXJkZWQgYnkgcmN1X3JlYWRfbG9jaygpLgogICovCiAjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcywgaGVhZCwgbWVtYmVyKSBcCi0JZm9yIChwb3MgPSBsaXN0X2VudHJ5KHJjdV9kZXJlZmVyZW5jZSgoaGVhZCktPm5leHQpLCB0eXBlb2YoKnBvcyksIG1lbWJlcik7IFwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnlfcmN1KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOyBcCiAJCXByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpLCAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyBcCi0JCXBvcyA9IGxpc3RfZW50cnkocmN1X2RlcmVmZXJlbmNlKHBvcy0+bWVtYmVyLm5leHQpLCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCisJCXBvcyA9IGxpc3RfZW50cnlfcmN1KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKIAogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oIGIvaW5jbHVkZS9saW51eC9yY3V0cmVlLmgKaW5kZXggNThiMmFhNS4uNWE1MTUzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3V0cmVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3V0cmVlLmgKQEAgLTE2MSw4ICsxNjEsMTUgQEAKIAl1bnNpZ25lZCBsb25nIG9mZmxpbmVfZnFzOwkvKiBLaWNrZWQgZHVlIHRvIGJlaW5nIG9mZmxpbmUuICovCiAJdW5zaWduZWQgbG9uZyByZXNjaGVkX2lwaTsJLyogU2VudCBhIHJlc2NoZWQgSVBJLiAqLwogCi0JLyogNSkgRm9yIGZ1dHVyZSBfX3JjdV9wZW5kaW5nIHN0YXRpc3RpY3MuICovCisJLyogNSkgX19yY3VfcGVuZGluZygpIHN0YXRpc3RpY3MuICovCiAJbG9uZyBuX3JjdV9wZW5kaW5nOwkJLyogcmN1X3BlbmRpbmcoKSBjYWxscyBzaW5jZSBib290LiAqLworCWxvbmcgbl9ycF9xc19wZW5kaW5nOworCWxvbmcgbl9ycF9jYl9yZWFkeTsKKwlsb25nIG5fcnBfY3B1X25lZWRzX2dwOworCWxvbmcgbl9ycF9ncF9jb21wbGV0ZWQ7CisJbG9uZyBuX3JwX2dwX3N0YXJ0ZWQ7CisJbG9uZyBuX3JwX25lZWRfZnFzOworCWxvbmcgbl9ycF9uZWVkX25vdGhpbmc7CiAKIAlpbnQgY3B1OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmluZ19idWZmZXIuaCBiL2luY2x1ZGUvbGludXgvcmluZ19idWZmZXIuaAppbmRleCBlMWI3YjIxLi44NjcwZjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JpbmdfYnVmZmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW5nX2J1ZmZlci5oCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBEb24ndCByZWZlciB0byB0aGlzIHN0cnVjdCBkaXJlY3RseSwgdXNlIGZ1bmN0aW9ucyBiZWxvdy4KICAqLwogc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50IHsKLQl1MzIJCXR5cGU6MiwgbGVuOjMsIHRpbWVfZGVsdGE6Mjc7CisJdTMyCQl0eXBlX2xlbjo1LCB0aW1lX2RlbHRhOjI3OwogCXUzMgkJYXJyYXlbXTsKIH07CiAKQEAgLTI0LDcgKzI0LDggQEAKICAqCQkJCSAgc2l6ZSBpcyB2YXJpYWJsZSBkZXBlbmRpbmcgb24gaG93IG11Y2gKICAqCQkJCSAgcGFkZGluZyBpcyBuZWVkZWQKICAqCQkJCSBJZiB0aW1lX2RlbHRhIGlzIG5vbiB6ZXJvOgotICoJCQkJICBldmVyeXRoaW5nIGVsc2Ugc2FtZSBhcyBSSU5HQlVGX1RZUEVfREFUQQorICoJCQkJICBhcnJheVswXSBob2xkcyB0aGUgYWN0dWFsIGxlbmd0aAorICoJCQkJICBzaXplID0gNCArIGxlbmd0aCAoYnl0ZXMpCiAgKgogICogQFJJTkdCVUZfVFlQRV9USU1FX0VYVEVORDoJRXh0ZW5kIHRoZSB0aW1lIGRlbHRhCiAgKgkJCQkgYXJyYXlbMF0gPSB0aW1lIGRlbHRhICgyOCAuLiA1OSkKQEAgLTM1LDIyICszNiwyMyBAQAogICoJCQkJIGFycmF5WzEuLjJdID0gdHZfc2VjCiAgKgkJCQkgc2l6ZSA9IDE2IGJ5dGVzCiAgKgotICogQFJJTkdCVUZfVFlQRV9EQVRBOgkJRGF0YSByZWNvcmQKLSAqCQkJCSBJZiBsZW4gaXMgemVybzoKKyAqIDw9IEBSSU5HQlVGX1RZUEVfREFUQV9UWVBFX0xFTl9NQVg6CisgKgkJCQlEYXRhIHJlY29yZAorICoJCQkJIElmIHR5cGVfbGVuIGlzIHplcm86CiAgKgkJCQkgIGFycmF5WzBdIGhvbGRzIHRoZSBhY3R1YWwgbGVuZ3RoCiAgKgkJCQkgIGFycmF5WzEuLihsZW5ndGgrMykvNF0gaG9sZHMgZGF0YQotICoJCQkJICBzaXplID0gNCArIDQgKyBsZW5ndGggKGJ5dGVzKQorICoJCQkJICBzaXplID0gNCArIGxlbmd0aCAoYnl0ZXMpCiAgKgkJCQkgZWxzZQotICoJCQkJICBsZW5ndGggPSBsZW4gPDwgMgorICoJCQkJICBsZW5ndGggPSB0eXBlX2xlbiA8PCAyCiAgKgkJCQkgIGFycmF5WzAuLihsZW5ndGgrMykvNC0xXSBob2xkcyBkYXRhCiAgKgkJCQkgIHNpemUgPSA0ICsgbGVuZ3RoIChieXRlcykKICAqLwogZW51bSByaW5nX2J1ZmZlcl90eXBlIHsKKwlSSU5HQlVGX1RZUEVfREFUQV9UWVBFX0xFTl9NQVggPSAyOCwKIAlSSU5HQlVGX1RZUEVfUEFERElORywKIAlSSU5HQlVGX1RZUEVfVElNRV9FWFRFTkQsCiAJLyogRklYTUU6IFJJTkdCVUZfVFlQRV9USU1FX1NUQU1QIG5vdCBpbXBsZW1lbnRlZCAqLwogCVJJTkdCVUZfVFlQRV9USU1FX1NUQU1QLAotCVJJTkdCVUZfVFlQRV9EQVRBLAogfTsKIAogdW5zaWduZWQgcmluZ19idWZmZXJfZXZlbnRfbGVuZ3RoKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpOwpAQCAtNjgsMTMgKzcwLDU0IEBACiAJcmV0dXJuIGV2ZW50LT50aW1lX2RlbHRhOwogfQogCisvKgorICogcmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZCBjYW4gZGlzY2FyZCBhbnkgZXZlbnQgaW4gdGhlIHJpbmcgYnVmZmVyLgorICogICBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHByb3RlY3QgYWdhaW5zdCBhIHJlYWRlciBmcm9tCisgKiAgIGNvbnN1bWluZyBpdCBvciBhIHdyaXRlciBmcm9tIHdyYXBwaW5nIGFuZCByZXBsYWNpbmcgaXQuCisgKgorICogTm8gZXh0ZXJuYWwgcHJvdGVjdGlvbiBpcyBuZWVkZWQgaWYgdGhpcyBpcyBjYWxsZWQgYmVmb3JlCisgKiB0aGUgZXZlbnQgaXMgY29tbWl0ZWQuIEJ1dCBpbiB0aGF0IGNhc2UgaXQgd291bGQgYmUgYmV0dGVyIHRvCisgKiB1c2UgcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQuCisgKgorICogTm90ZSwgaWYgYW4gZXZlbnQgdGhhdCBoYXMgbm90IGJlZW4gY29tbWl0dGVkIGlzIGRpc2NhcmRlZAorICogd2l0aCByaW5nX2J1ZmZlcl9ldmVudF9kaXNjYXJkLCBpdCBtdXN0IHN0aWxsIGJlIGNvbW1pdHRlZC4KKyAqLwogdm9pZCByaW5nX2J1ZmZlcl9ldmVudF9kaXNjYXJkKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpOwogCiAvKgorICogcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQgd2lsbCByZW1vdmUgYW4gZXZlbnQgdGhhdCBoYXMgbm90CisgKiAgIGJlbiBjb21taXR0ZWQgeWV0LiBJZiB0aGlzIGlzIHVzZWQsIHRoZW4gcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdAorICogICBtdXN0IG5vdCBiZSBjYWxsZWQgb24gdGhlIGRpc2NhcmRlZCBldmVudC4gVGhpcyBmdW5jdGlvbgorICogICB3aWxsIHRyeSB0byByZW1vdmUgdGhlIGV2ZW50IGZyb20gdGhlIHJpbmcgYnVmZmVyIGNvbXBsZXRlbHkKKyAqICAgaWYgYW5vdGhlciBldmVudCBoYXMgbm90IGJlZW4gd3JpdHRlbiBhZnRlciBpdC4KKyAqCisgKiBFeGFtcGxlIHVzZToKKyAqCisgKiAgaWYgKHNvbWVfY29uZGl0aW9uKQorICogICAgcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQoYnVmZmVyLCBldmVudCk7CisgKiAgZWxzZQorICogICAgcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdChidWZmZXIsIGV2ZW50KTsKKyAqLwordm9pZCByaW5nX2J1ZmZlcl9kaXNjYXJkX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwKKwkJCQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KTsKKworLyoKICAqIHNpemUgaXMgaW4gYnl0ZXMgZm9yIGVhY2ggcGVyIENQVSBidWZmZXIuCiAgKi8KIHN0cnVjdCByaW5nX2J1ZmZlciAqCi1yaW5nX2J1ZmZlcl9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGZsYWdzKTsKK19fcmluZ19idWZmZXJfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBmbGFncywgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpOworCisvKgorICogQmVjYXVzZSB0aGUgcmluZyBidWZmZXIgaXMgZ2VuZXJpYywgaWYgb3RoZXIgdXNlcnMgb2YgdGhlIHJpbmcgYnVmZmVyIGdldAorICogdHJhY2VkIGJ5IGZ0cmFjZSwgaXQgY2FuIHByb2R1Y2UgbG9ja2RlcCB3YXJuaW5ncy4gV2UgbmVlZCB0byBrZWVwIGVhY2gKKyAqIHJpbmcgYnVmZmVyJ3MgbG9jayBjbGFzcyBzZXBhcmF0ZS4KKyAqLworI2RlZmluZSByaW5nX2J1ZmZlcl9hbGxvYyhzaXplLCBmbGFncykJCQlcCisoewkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBfX2tleTsJCVwKKwlfX3JpbmdfYnVmZmVyX2FsbG9jKChzaXplKSwgKGZsYWdzKSwgJl9fa2V5KTsJXAorfSkKKwogdm9pZCByaW5nX2J1ZmZlcl9mcmVlKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyKTsKIAogaW50IHJpbmdfYnVmZmVyX3Jlc2l6ZShzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKQEAgLTEyMiw2ICsxNjUsOCBAQAogdW5zaWduZWQgbG9uZyByaW5nX2J1ZmZlcl9vdmVycnVucyhzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlcik7CiB1bnNpZ25lZCBsb25nIHJpbmdfYnVmZmVyX2VudHJpZXNfY3B1KHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCBpbnQgY3B1KTsKIHVuc2lnbmVkIGxvbmcgcmluZ19idWZmZXJfb3ZlcnJ1bl9jcHUoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpOwordW5zaWduZWQgbG9uZyByaW5nX2J1ZmZlcl9jb21taXRfb3ZlcnJ1bl9jcHUoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpOwordW5zaWduZWQgbG9uZyByaW5nX2J1ZmZlcl9ubWlfZHJvcHBlZF9jcHUoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpOwogCiB1NjQgcmluZ19idWZmZXJfdGltZV9zdGFtcChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSk7CiB2b2lkIHJpbmdfYnVmZmVyX25vcm1hbGl6ZV90aW1lX3N0YW1wKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLApAQCAtMTM3LDYgKzE4MiwxMSBAQAogaW50IHJpbmdfYnVmZmVyX3JlYWRfcGFnZShzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgdm9pZCAqKmRhdGFfcGFnZSwKIAkJCSAgc2l6ZV90IGxlbiwgaW50IGNwdSwgaW50IGZ1bGwpOwogCitzdHJ1Y3QgdHJhY2Vfc2VxOworCitpbnQgcmluZ19idWZmZXJfcHJpbnRfZW50cnlfaGVhZGVyKHN0cnVjdCB0cmFjZV9zZXEgKnMpOworaW50IHJpbmdfYnVmZmVyX3ByaW50X3BhZ2VfaGVhZGVyKHN0cnVjdCB0cmFjZV9zZXEgKnMpOworCiBlbnVtIHJpbmdfYnVmZmVyX2ZsYWdzIHsKIAlSQl9GTF9PVkVSV1JJVEUJCT0gMSA8PCAwLAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCBiNGMzOGJjLi40ODk2ZmRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC03Nyw2ICs3Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvcG9ydGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRtdXRleC5oPgogCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtOTYsOCArOTcsOSBAQAogc3RydWN0IGZ1dGV4X3BpX3N0YXRlOwogc3RydWN0IHJvYnVzdF9saXN0X2hlYWQ7CiBzdHJ1Y3QgYmlvOwotc3RydWN0IGJ0c190cmFjZXI7CiBzdHJ1Y3QgZnNfc3RydWN0Oworc3RydWN0IGJ0c19jb250ZXh0Oworc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0OwogCiAvKgogICogTGlzdCBvZiBmbGFncyB3ZSB3YW50IHRvIHNoYXJlIGZvciBrZXJuZWwgdGhyZWFkcywKQEAgLTExNiw2ICsxMTgsNyBAQAogICogICAgMTEgYml0IGZyYWN0aW9ucy4KICAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXZlbnJ1bltdOwkJLyogTG9hZCBhdmVyYWdlcyAqLworZXh0ZXJuIHZvaWQgZ2V0X2F2ZW5ydW4odW5zaWduZWQgbG9uZyAqbG9hZHMsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2hpZnQpOwogCiAjZGVmaW5lIEZTSElGVAkJMTEJCS8qIG5yIG9mIGJpdHMgb2YgcHJlY2lzaW9uICovCiAjZGVmaW5lIEZJWEVEXzEJCSgxPDxGU0hJRlQpCS8qIDEuMCBhcyBmaXhlZC1wb2ludCAqLwpAQCAtMTM1LDggKzEzOCw5IEBACiBleHRlcm4gaW50IG5yX3Byb2Nlc3Nlcyh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG5yX3J1bm5pbmcodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBucl91bmludGVycnVwdGlibGUodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBucl9hY3RpdmUodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBucl9pb3dhaXQodm9pZCk7CitleHRlcm4gdm9pZCBjYWxjX2dsb2JhbF9sb2FkKHZvaWQpOworZXh0ZXJuIHU2NCBjcHVfbnJfbWlncmF0aW9ucyhpbnQgY3B1KTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3BhcmVudF9pcCh1bnNpZ25lZCBsb25nIGFkZHIpOwogCkBAIC02NzIsNiArNjc2LDEwIEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAjZW5kaWYKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BFUkZfQ09VTlRFUlMKKwlhdG9taWNfbG9uZ190IGxvY2tlZF92bTsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIGludCB1aWRzX3N5c2ZzX2luaXQodm9pZCk7CkBAIC04MzgsNyArODQ2LDE3IEBACiAJICovCiAJdTMyIHJlY2lwcm9jYWxfY3B1X3Bvd2VyOwogCi0JdW5zaWduZWQgbG9uZyBjcHVtYXNrW107CisJLyoKKwkgKiBUaGUgQ1BVcyB0aGlzIGdyb3VwIGNvdmVycy4KKwkgKgorCSAqIE5PVEU6IHRoaXMgZmllbGQgaXMgdmFyaWFibGUgbGVuZ3RoLiAoQWxsb2NhdGVkIGR5bmFtaWNhbGx5CisJICogYnkgYXR0YWNoaW5nIGV4dHJhIHNwYWNlIHRvIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSwKKwkgKiBkZXBlbmRpbmcgb24gaG93IG1hbnkgQ1BVcyB0aGUga2VybmVsIGhhcyBib290ZWQgdXAgd2l0aCkKKwkgKgorCSAqIEl0IGlzIGFsc28gYmUgZW1iZWRkZWQgaW50byBzdGF0aWMgZGF0YSBzdHJ1Y3R1cmVzIGF0IGJ1aWxkCisJICogdGltZS4gKFNlZSAnc3RydWN0IHN0YXRpY19zY2hlZF9ncm91cCcgaW4ga2VybmVsL3NjaGVkLmMpCisJICovCisJdW5zaWduZWQgbG9uZyBjcHVtYXNrWzBdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1bWFzayAqc2NoZWRfZ3JvdXBfY3B1cyhzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnKQpAQCAtOTI0LDggKzk0MiwxNyBAQAogCWNoYXIgKm5hbWU7CiAjZW5kaWYKIAotCS8qIHNwYW4gb2YgYWxsIENQVXMgaW4gdGhpcyBkb21haW4gKi8KLQl1bnNpZ25lZCBsb25nIHNwYW5bXTsKKwkvKgorCSAqIFNwYW4gb2YgYWxsIENQVXMgaW4gdGhpcyBkb21haW4uCisJICoKKwkgKiBOT1RFOiB0aGlzIGZpZWxkIGlzIHZhcmlhYmxlIGxlbmd0aC4gKEFsbG9jYXRlZCBkeW5hbWljYWxseQorCSAqIGJ5IGF0dGFjaGluZyBleHRyYSBzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUsCisJICogZGVwZW5kaW5nIG9uIGhvdyBtYW55IENQVXMgdGhlIGtlcm5lbCBoYXMgYm9vdGVkIHVwIHdpdGgpCisJICoKKwkgKiBJdCBpcyBhbHNvIGJlIGVtYmVkZGVkIGludG8gc3RhdGljIGRhdGEgc3RydWN0dXJlcyBhdCBidWlsZAorCSAqIHRpbWUuIChTZWUgJ3N0cnVjdCBzdGF0aWNfc2NoZWRfZG9tYWluJyBpbiBrZXJuZWwvc2NoZWQuYykKKwkgKi8KKwl1bnNpZ25lZCBsb25nIHNwYW5bMF07CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjcHVtYXNrICpzY2hlZF9kb21haW5fc3BhbihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKQEAgLTEwNTIsOSArMTA3OSwxMCBAQAogCXU2NAkJCWxhc3Rfd2FrZXVwOwogCXU2NAkJCWF2Z19vdmVybGFwOwogCisJdTY0CQkJbnJfbWlncmF0aW9uczsKKwogCXU2NAkJCXN0YXJ0X3J1bnRpbWU7CiAJdTY0CQkJYXZnX3dha2V1cDsKLQl1NjQJCQlucl9taWdyYXRpb25zOwogCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAl1NjQJCQl3YWl0X3N0YXJ0OwpAQCAtMTIwOSwxOCArMTIzNywxMSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcHRyYWNlZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHB0cmFjZV9lbnRyeTsKIAotI2lmZGVmIENPTkZJR19YODZfUFRSQUNFX0JUUwogCS8qCiAJICogVGhpcyBpcyB0aGUgdHJhY2VyIGhhbmRsZSBmb3IgdGhlIHB0cmFjZSBCVFMgZXh0ZW5zaW9uLgogCSAqIFRoaXMgZmllbGQgYWN0dWFsbHkgYmVsb25ncyB0byB0aGUgcHRyYWNlciB0YXNrLgogCSAqLwotCXN0cnVjdCBidHNfdHJhY2VyICpidHM7Ci0JLyoKLQkgKiBUaGUgYnVmZmVyIHRvIGhvbGQgdGhlIEJUUyBkYXRhLgotCSAqLwotCXZvaWQgKmJ0c19idWZmZXI7Ci0Jc2l6ZV90IGJ0c19zaXplOwotI2VuZGlmIC8qIENPTkZJR19YODZfUFRSQUNFX0JUUyAqLworCXN0cnVjdCBidHNfY29udGV4dCAqYnRzOwogCiAJLyogUElEL1BJRCBoYXNoIHRhYmxlIGxpbmthZ2UuICovCiAJc3RydWN0IHBpZF9saW5rIHBpZHNbUElEVFlQRV9NQVhdOwpAQCAtMTI0Nyw3ICsxMjY4LDkgQEAKIAkJCQkJICogY3JlZGVudGlhbHMgKENPVykgKi8KIAljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZDsJLyogZWZmZWN0aXZlIChvdmVycmlkYWJsZSkgc3ViamVjdGl2ZSB0YXNrCiAJCQkJCSAqIGNyZWRlbnRpYWxzIChDT1cpICovCi0Jc3RydWN0IG11dGV4IGNyZWRfZXhlY19tdXRleDsJLyogZXhlY3ZlIHZzIHB0cmFjZSBjcmVkIGNhbGN1bGF0aW9uIG11dGV4ICovCisJc3RydWN0IG11dGV4IGNyZWRfZ3VhcmRfbXV0ZXg7CS8qIGd1YXJkIGFnYWluc3QgZm9yZWlnbiBpbmZsdWVuY2VzIG9uCisJCQkJCSAqIGNyZWRlbnRpYWwgY2FsY3VsYXRpb25zCisJCQkJCSAqIChub3RhYmx5LiBwdHJhY2UpICovCiAKIAljaGFyIGNvbW1bVEFTS19DT01NX0xFTl07IC8qIGV4ZWN1dGFibGUgbmFtZSBleGNsdWRpbmcgcGF0aAogCQkJCSAgICAgLSBhY2Nlc3Mgd2l0aCBbZ3NdZXRfdGFza19jb21tICh3aGljaCBsb2NrCkBAIC0xMzgwLDYgKzE0MDMsMTEgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBpX3N0YXRlX2xpc3Q7CiAJc3RydWN0IGZ1dGV4X3BpX3N0YXRlICpwaV9zdGF0ZV9jYWNoZTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpwZXJmX2NvdW50ZXJfY3R4cDsKKwlzdHJ1Y3QgbXV0ZXggcGVyZl9jb3VudGVyX211dGV4OworCXN0cnVjdCBsaXN0X2hlYWQgcGVyZl9jb3VudGVyX2xpc3Q7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfTlVNQQogCXN0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeTsKIAlzaG9ydCBpbF9uZXh0OwpAQCAtMTQyOCw3ICsxNDU2LDkgQEAKICNpZmRlZiBDT05GSUdfVFJBQ0lORwogCS8qIHN0YXRlIGZsYWdzIGZvciB1c2UgYnkgdHJhY2VycyAqLwogCXVuc2lnbmVkIGxvbmcgdHJhY2U7Ci0jZW5kaWYKKwkvKiBiaXRtYXNrIG9mIHRyYWNlIHJlY3Vyc2lvbiAqLworCXVuc2lnbmVkIGxvbmcgdHJhY2VfcmVjdXJzaW9uOworI2VuZGlmIC8qIENPTkZJR19UUkFDSU5HICovCiB9OwogCiAvKiBGdXR1cmUtc2FmZSBhY2Nlc3NvciBmb3Igc3RydWN0IHRhc2tfc3RydWN0J3MgY3B1c19hbGxvd2VkLiAqLwpAQCAtMTg4NSw2ICsxOTE1LDcgQEAKIAogZXh0ZXJuIHZvaWQgcHJvY19jYWNoZXNfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGZsdXNoX3NpZ25hbHMoc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgX19mbHVzaF9zaWduYWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIGlnbm9yZV9zaWduYWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiB2b2lkIGZsdXNoX3NpZ25hbF9oYW5kbGVycyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaW50IGZvcmNlX2RlZmF1bHQpOwogZXh0ZXJuIGludCBkZXF1ZXVlX3NpZ25hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc2lnc2V0X3QgKm1hc2ssIHNpZ2luZm9fdCAqaW5mbyk7CkBAIC0yMDAxLDggKzIwMzIsMTAgQEAKIGV4dGVybiBjaGFyICpnZXRfdGFza19jb21tKGNoYXIgKnRvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKICNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCB3YWl0X3Rhc2tfY29udGV4dF9zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIHdhaXRfdGFza19pbmFjdGl2ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgbG9uZyBtYXRjaF9zdGF0ZSk7CiAjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHdhaXRfdGFza19jb250ZXh0X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHt9CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgd2FpdF90YXNrX2luYWN0aXZlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKIAkJCQkJICAgICAgIGxvbmcgbWF0Y2hfc3RhdGUpCiB7CkBAIC0yMDEwLDcgKzIwNDMsOCBAQAogfQogI2VuZGlmCiAKLSNkZWZpbmUgbmV4dF90YXNrKHApCWxpc3RfZW50cnkocmN1X2RlcmVmZXJlbmNlKChwKS0+dGFza3MubmV4dCksIHN0cnVjdCB0YXNrX3N0cnVjdCwgdGFza3MpCisjZGVmaW5lIG5leHRfdGFzayhwKSBcCisJbGlzdF9lbnRyeV9yY3UoKHApLT50YXNrcy5uZXh0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRhc2tzKQogCiAjZGVmaW5lIGZvcl9lYWNoX3Byb2Nlc3MocCkgXAogCWZvciAocCA9ICZpbml0X3Rhc2sgOyAocCA9IG5leHRfdGFzayhwKSkgIT0gJmluaXRfdGFzayA7ICkKQEAgLTIwNDksOCArMjA4Myw4IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3RocmVhZChjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JcmV0dXJuIGxpc3RfZW50cnkocmN1X2RlcmVmZXJlbmNlKHAtPnRocmVhZF9ncm91cC5uZXh0KSwKLQkJCSAgc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWRfZ3JvdXApOworCXJldHVybiBsaXN0X2VudHJ5X3JjdShwLT50aHJlYWRfZ3JvdXAubmV4dCwKKwkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkX2dyb3VwKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgdGhyZWFkX2dyb3VwX2VtcHR5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKQEAgLTIzODgsNiArMjQyMiwxMyBAQAogI2RlZmluZSBUQVNLX1NJWkVfT0YodHNrKQlUQVNLX1NJWkUKICNlbmRpZgogCisvKgorICogQ2FsbCB0aGUgZnVuY3Rpb24gaWYgdGhlIHRhcmdldCB0YXNrIGlzIGV4ZWN1dGluZyBvbiBhIENQVSByaWdodCBub3c6CisgKi8KK2V4dGVybiB2b2lkIHRhc2tfb25jcHVfZnVuY3Rpb25fY2FsbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkJICAgICB2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvKTsKKworCiAjaWZkZWYgQ09ORklHX01NX09XTkVSCiBleHRlcm4gdm9pZCBtbV91cGRhdGVfbmV4dF9vd25lcihzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CiBleHRlcm4gdm9pZCBtbV9pbml0X293bmVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IGQ1ZmQ2MTYuLjVlZmY0NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTIxOTcsNiArMjE5Nyw4IEBACiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJfb25seSkKIHsKKwlpZiAoKGFkZHIgPCBtbWFwX21pbl9hZGRyKSAmJiAhY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJcmV0dXJuIC1FQUNDRVM7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbC5oCmluZGV4IDkxMzZjYzUuLmU1YmI3NWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWwuaApAQCAtOTYsNTQgKzk2LDc2IEBACiAKIC8qCiAgKiBEZWZpbml0aW9ucyBmb3IgYXN5bmNfc3RydWN0IChhbmQgc2VyaWFsX3N0cnVjdCkgZmxhZ3MgZmllbGQKKyAqCisgKiBEZWZpbmUgQVNZTkNCXyogZm9yIGNvbnZlbmllbnQgdXNlIHdpdGgge3Rlc3Qsc2V0LGNsZWFyfV9iaXQuCiAgKi8KLSNkZWZpbmUgQVNZTkNfSFVQX05PVElGWSAweDAwMDEgLyogTm90aWZ5IGdldHR5IG9uIGhhbmd1cHMgYW5kIGNsb3NlcyAKLQkJCQkgICBvbiB0aGUgY2FsbG91dCBwb3J0ICovCi0jZGVmaW5lIEFTWU5DX0ZPVVJQT1JUICAweDAwMDIJLyogU2V0IE9VMSwgT1VUMiBwZXIgQVNUIEZvdXJwb3J0IHNldHRpbmdzICovCi0jZGVmaW5lIEFTWU5DX1NBSwkweDAwMDQJLyogU2VjdXJlIEF0dGVudGlvbiBLZXkgKE9yYW5nZSBib29rKSAqLwotI2RlZmluZSBBU1lOQ19TUExJVF9URVJNSU9TIDB4MDAwOCAvKiBTZXBhcmF0ZSB0ZXJtaW9zIGZvciBkaWFsaW4vY2FsbG91dCAqLworI2RlZmluZSBBU1lOQ0JfSFVQX05PVElGWQkgMCAvKiBOb3RpZnkgZ2V0dHkgb24gaGFuZ3VwcyBhbmQgY2xvc2VzCisJCQkJICAgICogb24gdGhlIGNhbGxvdXQgcG9ydCAqLworI2RlZmluZSBBU1lOQ0JfRk9VUlBPUlQJCSAxIC8qIFNldCBPVTEsIE9VVDIgcGVyIEFTVCBGb3VycG9ydCBzZXR0aW5ncyAqLworI2RlZmluZSBBU1lOQ0JfU0FLCQkgMiAvKiBTZWN1cmUgQXR0ZW50aW9uIEtleSAoT3JhbmdlIGJvb2spICovCisjZGVmaW5lIEFTWU5DQl9TUExJVF9URVJNSU9TCSAzIC8qIFNlcGFyYXRlIHRlcm1pb3MgZm9yIGRpYWxpbi9jYWxsb3V0ICovCisjZGVmaW5lIEFTWU5DQl9TUERfSEkJCSA0IC8qIFVzZSA1NjAwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBBU1lOQ0JfU1BEX1ZISQkJIDUgLyogVXNlIDExNTIwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBBU1lOQ0JfU0tJUF9URVNUCSA2IC8qIFNraXAgVUFSVCB0ZXN0IGR1cmluZyBhdXRvY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBBU1lOQ0JfQVVUT19JUlEJCSA3IC8qIERvIGF1dG9tYXRpYyBJUlEgZHVyaW5nCisJCQkJICAgICogYXV0b2NvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgQVNZTkNCX1NFU1NJT05fTE9DS09VVAkgOCAvKiBMb2NrIG91dCBjdWEgb3BlbnMgYmFzZWQgb24gc2Vzc2lvbiAqLworI2RlZmluZSBBU1lOQ0JfUEdSUF9MT0NLT1VUCSA5IC8qIExvY2sgb3V0IGN1YSBvcGVucyBiYXNlZCBvbiBwZ3JwICovCisjZGVmaW5lIEFTWU5DQl9DQUxMT1VUX05PSFVQCTEwIC8qIERvbid0IGRvIGhhbmd1cHMgZm9yIGN1YSBkZXZpY2UgKi8KKyNkZWZpbmUgQVNZTkNCX0hBUkRQUFNfQ0QJMTEgLyogQ2FsbCBoYXJkcHBzIHdoZW4gQ0QgZ29lcyBoaWdoICAqLworI2RlZmluZSBBU1lOQ0JfU1BEX1NISQkJMTIgLyogVXNlIDIzMDQwMCBpbnN0ZWFkIG9mIDM4NDAwIGJwcyAqLworI2RlZmluZSBBU1lOQ0JfTE9XX0xBVEVOQ1kJMTMgLyogUmVxdWVzdCBsb3cgbGF0ZW5jeSBiZWhhdmlvdXIgKi8KKyNkZWZpbmUgQVNZTkNCX0JVR0dZX1VBUlQJMTQgLyogVGhpcyBpcyBhIGJ1Z2d5IFVBUlQsIHNraXAgc29tZSBzYWZldHkKKwkJCQkgICAgKiBjaGVja3MuICBOb3RlOiBjYW4gYmUgZGFuZ2Vyb3VzISAqLworI2RlZmluZSBBU1lOQ0JfQVVUT1BST0JFCTE1IC8qIFBvcnQgd2FzIGF1dG9wcm9iZWQgYnkgUENJIG9yIFBOUCBjb2RlICovCisjZGVmaW5lIEFTWU5DQl9MQVNUX1VTRVIJMTUKIAotI2RlZmluZSBBU1lOQ19TUERfTUFTSwkweDEwMzAKLSNkZWZpbmUgQVNZTkNfU1BEX0hJCTB4MDAxMAkvKiBVc2UgNTYwMDAgaW5zdGVhZCBvZiAzODQwMCBicHMgKi8KKy8qIEludGVybmFsIGZsYWdzIHVzZWQgb25seSBieSBrZXJuZWwgKi8KKyNkZWZpbmUgQVNZTkNCX0lOSVRJQUxJWkVECTMxIC8qIFNlcmlhbCBwb3J0IHdhcyBpbml0aWFsaXplZCAqLworI2RlZmluZSBBU1lOQ0JfTk9STUFMX0FDVElWRQkyOSAvKiBOb3JtYWwgZGV2aWNlIGlzIGFjdGl2ZSAqLworI2RlZmluZSBBU1lOQ0JfQk9PVF9BVVRPQ09ORgkyOCAvKiBBdXRvY29uZmlndXJlIHBvcnQgb24gYm9vdHVwICovCisjZGVmaW5lIEFTWU5DQl9DTE9TSU5HCQkyNyAvKiBTZXJpYWwgcG9ydCBpcyBjbG9zaW5nICovCisjZGVmaW5lIEFTWU5DQl9DVFNfRkxPVwkJMjYgLyogRG8gQ1RTIGZsb3cgY29udHJvbCAqLworI2RlZmluZSBBU1lOQ0JfQ0hFQ0tfQ0QJCTI1IC8qIGkuZS4sIENMT0NBTCAqLworI2RlZmluZSBBU1lOQ0JfU0hBUkVfSVJRCTI0IC8qIGZvciBtdWx0aWZ1bmN0aW9uIGNhcmRzLCBubyBsb25nZXIgdXNlZCAqLworI2RlZmluZSBBU1lOQ0JfQ09OU19GTE9XCTIzIC8qIGZsb3cgY29udHJvbCBmb3IgY29uc29sZSAgKi8KKyNkZWZpbmUgQVNZTkNCX0JPT1RfT05MWU1DQQkyMiAvKiBQcm9iZSBvbmx5IGlmIE1DQSBidXMgKi8KKyNkZWZpbmUgQVNZTkNCX0ZJUlNUX0tFUk5FTAkyMgogCi0jZGVmaW5lIEFTWU5DX1NQRF9WSEkJMHgwMDIwICAvKiBVc2UgMTE1MjAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCi0jZGVmaW5lIEFTWU5DX1NQRF9DVVNUCTB4MDAzMCAgLyogVXNlIHVzZXItc3BlY2lmaWVkIGRpdmlzb3IgKi8KKyNkZWZpbmUgQVNZTkNfSFVQX05PVElGWQkoMVUgPDwgQVNZTkNCX0hVUF9OT1RJRlkpCisjZGVmaW5lIEFTWU5DX0ZPVVJQT1JUCQkoMVUgPDwgQVNZTkNCX0ZPVVJQT1JUKQorI2RlZmluZSBBU1lOQ19TQUsJCSgxVSA8PCBBU1lOQ0JfU0FLKQorI2RlZmluZSBBU1lOQ19TUExJVF9URVJNSU9TCSgxVSA8PCBBU1lOQ0JfU1BMSVRfVEVSTUlPUykKKyNkZWZpbmUgQVNZTkNfU1BEX0hJCQkoMVUgPDwgQVNZTkNCX1NQRF9ISSkKKyNkZWZpbmUgQVNZTkNfU1BEX1ZISQkJKDFVIDw8IEFTWU5DQl9TUERfVkhJKQorI2RlZmluZSBBU1lOQ19TS0lQX1RFU1QJCSgxVSA8PCBBU1lOQ0JfU0tJUF9URVNUKQorI2RlZmluZSBBU1lOQ19BVVRPX0lSUQkJKDFVIDw8IEFTWU5DQl9BVVRPX0lSUSkKKyNkZWZpbmUgQVNZTkNfU0VTU0lPTl9MT0NLT1VUCSgxVSA8PCBBU1lOQ0JfU0VTU0lPTl9MT0NLT1VUKQorI2RlZmluZSBBU1lOQ19QR1JQX0xPQ0tPVVQJKDFVIDw8IEFTWU5DQl9QR1JQX0xPQ0tPVVQpCisjZGVmaW5lIEFTWU5DX0NBTExPVVRfTk9IVVAJKDFVIDw8IEFTWU5DQl9DQUxMT1VUX05PSFVQKQorI2RlZmluZSBBU1lOQ19IQVJEUFBTX0NECSgxVSA8PCBBU1lOQ0JfSEFSRFBQU19DRCkKKyNkZWZpbmUgQVNZTkNfU1BEX1NISQkJKDFVIDw8IEFTWU5DQl9TUERfU0hJKQorI2RlZmluZSBBU1lOQ19MT1dfTEFURU5DWQkoMVUgPDwgQVNZTkNCX0xPV19MQVRFTkNZKQorI2RlZmluZSBBU1lOQ19CVUdHWV9VQVJUCSgxVSA8PCBBU1lOQ0JfQlVHR1lfVUFSVCkKKyNkZWZpbmUgQVNZTkNfQVVUT1BST0JFCQkoMVUgPDwgQVNZTkNCX0FVVE9QUk9CRSkKIAotI2RlZmluZSBBU1lOQ19TS0lQX1RFU1QJMHgwMDQwIC8qIFNraXAgVUFSVCB0ZXN0IGR1cmluZyBhdXRvY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBBU1lOQ19BVVRPX0lSUSAgMHgwMDgwIC8qIERvIGF1dG9tYXRpYyBJUlEgZHVyaW5nIGF1dG9jb25maWd1cmF0aW9uICovCi0jZGVmaW5lIEFTWU5DX1NFU1NJT05fTE9DS09VVCAweDAxMDAgLyogTG9jayBvdXQgY3VhIG9wZW5zIGJhc2VkIG9uIHNlc3Npb24gKi8KLSNkZWZpbmUgQVNZTkNfUEdSUF9MT0NLT1VUICAgIDB4MDIwMCAvKiBMb2NrIG91dCBjdWEgb3BlbnMgYmFzZWQgb24gcGdycCAqLwotI2RlZmluZSBBU1lOQ19DQUxMT1VUX05PSFVQICAgMHgwNDAwIC8qIERvbid0IGRvIGhhbmd1cHMgZm9yIGN1YSBkZXZpY2UgKi8KKyNkZWZpbmUgQVNZTkNfRkxBR1MJCSgoMVUgPDwgQVNZTkNCX0xBU1RfVVNFUikgLSAxKQorI2RlZmluZSBBU1lOQ19VU1JfTUFTSwkJKEFTWU5DX1NQRF9ISXxBU1lOQ19TUERfVkhJfCBcCisJCUFTWU5DX0NBTExPVVRfTk9IVVB8QVNZTkNfU1BEX1NISXxBU1lOQ19MT1dfTEFURU5DWSkKKyNkZWZpbmUgQVNZTkNfU1BEX0NVU1QJCShBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1ZISSkKKyNkZWZpbmUgQVNZTkNfU1BEX1dBUlAJCShBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1NISSkKKyNkZWZpbmUgQVNZTkNfU1BEX01BU0sJCShBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1ZISXxBU1lOQ19TUERfU0hJKQogCi0jZGVmaW5lIEFTWU5DX0hBUkRQUFNfQ0QJMHgwODAwCS8qIENhbGwgaGFyZHBwcyB3aGVuIENEIGdvZXMgaGlnaCAgKi8KLQotI2RlZmluZSBBU1lOQ19TUERfU0hJCTB4MTAwMAkvKiBVc2UgMjMwNDAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCi0jZGVmaW5lIEFTWU5DX1NQRF9XQVJQCTB4MTAxMAkvKiBVc2UgNDYwODAwIGluc3RlYWQgb2YgMzg0MDAgYnBzICovCi0KLSNkZWZpbmUgQVNZTkNfTE9XX0xBVEVOQ1kgMHgyMDAwIC8qIFJlcXVlc3QgbG93IGxhdGVuY3kgYmVoYXZpb3VyICovCi0KLSNkZWZpbmUgQVNZTkNfQlVHR1lfVUFSVCAgMHg0MDAwIC8qIFRoaXMgaXMgYSBidWdneSBVQVJULCBza2lwIHNvbWUgc2FmZXR5Ci0JCQkJICAqIGNoZWNrcy4gIE5vdGU6IGNhbiBiZSBkYW5nZXJvdXMhICovCi0KLSNkZWZpbmUgQVNZTkNfQVVUT1BST0JFCSAweDgwMDAgLyogUG9ydCB3YXMgYXV0b3Byb2JlZCBieSBQQ0kgb3IgUE5QIGNvZGUgKi8KLQotI2RlZmluZSBBU1lOQ19GTEFHUwkweDdGRkYJLyogUG9zc2libGUgbGVnYWwgYXN5bmMgZmxhZ3MgKi8KLSNkZWZpbmUgQVNZTkNfVVNSX01BU0sJMHgzNDMwCS8qIExlZ2FsIGZsYWdzIHRoYXQgbm9uLXByaXZpbGVnZWQKLQkJCQkgKiB1c2VycyBjYW4gc2V0IG9yIHJlc2V0ICovCi0KLS8qIEludGVybmFsIGZsYWdzIHVzZWQgb25seSBieSBrZXJuZWwvY2hyX2Rydi9zZXJpYWwuYyAqLwotI2RlZmluZSBBU1lOQ19JTklUSUFMSVpFRAkweDgwMDAwMDAwIC8qIFNlcmlhbCBwb3J0IHdhcyBpbml0aWFsaXplZCAqLwotI2RlZmluZSBBU1lOQ19OT1JNQUxfQUNUSVZFCTB4MjAwMDAwMDAgLyogTm9ybWFsIGRldmljZSBpcyBhY3RpdmUgKi8KLSNkZWZpbmUgQVNZTkNfQk9PVF9BVVRPQ09ORgkweDEwMDAwMDAwIC8qIEF1dG9jb25maWd1cmUgcG9ydCBvbiBib290dXAgKi8KLSNkZWZpbmUgQVNZTkNfQ0xPU0lORwkJMHgwODAwMDAwMCAvKiBTZXJpYWwgcG9ydCBpcyBjbG9zaW5nICovCi0jZGVmaW5lIEFTWU5DX0NUU19GTE9XCQkweDA0MDAwMDAwIC8qIERvIENUUyBmbG93IGNvbnRyb2wgKi8KLSNkZWZpbmUgQVNZTkNfQ0hFQ0tfQ0QJCTB4MDIwMDAwMDAgLyogaS5lLiwgQ0xPQ0FMICovCi0jZGVmaW5lIEFTWU5DX1NIQVJFX0lSUQkJMHgwMTAwMDAwMCAvKiBmb3IgbXVsdGlmdW5jdGlvbiBjYXJkcwotCQkJCQkgICAgIC0tLSBubyBsb25nZXIgdXNlZCAqLwotI2RlZmluZSBBU1lOQ19DT05TX0ZMT1cJCTB4MDA4MDAwMDAgLyogZmxvdyBjb250cm9sIGZvciBjb25zb2xlICAqLwotCi0jZGVmaW5lIEFTWU5DX0JPT1RfT05MWU1DQQkweDAwNDAwMDAwIC8qIFByb2JlIG9ubHkgaWYgTUNBIGJ1cyAqLwotI2RlZmluZSBBU1lOQ19JTlRFUk5BTF9GTEFHUwkweEZGQzAwMDAwIC8qIEludGVybmFsIGZsYWdzICovCisjZGVmaW5lIEFTWU5DX0lOSVRJQUxJWkVECSgxVSA8PCBBU1lOQ0JfSU5JVElBTElaRUQpCisjZGVmaW5lIEFTWU5DX05PUk1BTF9BQ1RJVkUJKDFVIDw8IEFTWU5DQl9OT1JNQUxfQUNUSVZFKQorI2RlZmluZSBBU1lOQ19CT09UX0FVVE9DT05GCSgxVSA8PCBBU1lOQ0JfQk9PVF9BVVRPQ09ORikKKyNkZWZpbmUgQVNZTkNfQ0xPU0lORwkJKDFVIDw8IEFTWU5DQl9DTE9TSU5HKQorI2RlZmluZSBBU1lOQ19DVFNfRkxPVwkJKDFVIDw8IEFTWU5DQl9DVFNfRkxPVykKKyNkZWZpbmUgQVNZTkNfQ0hFQ0tfQ0QJCSgxVSA8PCBBU1lOQ0JfQ0hFQ0tfQ0QpCisjZGVmaW5lIEFTWU5DX1NIQVJFX0lSUQkJKDFVIDw8IEFTWU5DQl9TSEFSRV9JUlEpCisjZGVmaW5lIEFTWU5DX0NPTlNfRkxPVwkJKDFVIDw8IEFTWU5DQl9DT05TX0ZMT1cpCisjZGVmaW5lIEFTWU5DX0JPT1RfT05MWU1DQQkoMVUgPDwgQVNZTkNCX0JPT1RfT05MWU1DQSkKKyNkZWZpbmUgQVNZTkNfSU5URVJOQUxfRkxBR1MJKH4oKDFVIDw8IEFTWU5DQl9GSVJTVF9LRVJORUwpIC0gMSkpCiAKIC8qCiAgKiBNdWx0aXBvcnQgc2VyaWFsIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlIC0tLSBleHRlcm5hbCBzdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCA1N2E5N2U1Li42ZmQ4MGM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC00MSw3ICs0MSw4IEBACiAjZGVmaW5lIFBPUlRfWFNDQUxFCTE1CiAjZGVmaW5lIFBPUlRfUk05MDAwCTE2CS8qIFBNQy1TaWVycmEgUk05eHh4IGludGVybmFsIFVBUlQgKi8KICNkZWZpbmUgUE9SVF9PQ1RFT04JMTcJLyogQ2F2aXVtIE9DVEVPTiBpbnRlcm5hbCBVQVJUICovCi0jZGVmaW5lIFBPUlRfTUFYXzgyNTAJMTcJLyogbWF4IHBvcnQgSUQgKi8KKyNkZWZpbmUgUE9SVF9BUjcJMTgJLyogVGV4YXMgSW5zdHJ1bWVudHMgQVI3IGludGVybmFsIFVBUlQgKi8KKyNkZWZpbmUgUE9SVF9NQVhfODI1MAkxOAkvKiBtYXggcG9ydCBJRCAqLwogCiAvKgogICogQVJNIHNwZWNpZmljIHR5cGUgbnVtYmVycy4gIFRoZXNlIGFyZSBub3QgY3VycmVudGx5IGd1YXJhbnRlZWQKQEAgLTE2Nyw2ICsxNjgsOSBAQAogLyogTUFYMzEwMCAqLwogI2RlZmluZSBQT1JUX01BWDMxMDAgICAgODYKIAorLyogVGltYmVyZGFsZSBVQVJUICovCisjZGVmaW5lIFBPUlRfVElNQlVBUlQJODcKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCmluZGV4IDg5M2NjNTMuLjFjMjk3ZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VyaWFsX3NjaS5oCkBAIC0yNSw4ICsyNSw3IEBACiAJdW5zaWduZWQgaW50CWlycXNbU0NJeF9OUl9JUlFTXTsJLyogRVJJLCBSWEksIFRYSSwgQlJJICovCiAJdW5zaWduZWQgaW50CXR5cGU7CQkJLyogU0NJIC8gU0NJRiAvIElSREEgKi8KIAl1cGZfdAkJZmxhZ3M7CQkJLyogVVBGXyogZmxhZ3MgKi8KKwljaGFyCQkqY2xrOwkJCS8qIGNsb2NrIHN0cmluZyAqLwogfTsKIAotaW50IGVhcmx5X3NjaV9zZXR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKLQogI2VuZGlmIC8qIF9fTElOVVhfU0VSSUFMX1NDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NoX2NtdC5oIGIvaW5jbHVkZS9saW51eC9zaF9jbXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjYWNkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3NoX2NtdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotI2lmbmRlZiBfX1NIX0NNVF9IX18KLSNkZWZpbmUgX19TSF9DTVRfSF9fCi0KLXN0cnVjdCBzaF9jbXRfY29uZmlnIHsKLQljaGFyICpuYW1lOwotCXVuc2lnbmVkIGxvbmcgY2hhbm5lbF9vZmZzZXQ7Ci0JaW50IHRpbWVyX2JpdDsKLQljaGFyICpjbGs7Ci0JdW5zaWduZWQgbG9uZyBjbG9ja2V2ZW50X3JhdGluZzsKLQl1bnNpZ25lZCBsb25nIGNsb2Nrc291cmNlX3JhdGluZzsKLX07Ci0KLSNlbmRpZiAvKiBfX1NIX0NNVF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2hfdGltZXIuaCBiL2luY2x1ZGUvbGludXgvc2hfdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjRiZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zaF90aW1lci5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgX19TSF9USU1FUl9IX18KKyNkZWZpbmUgX19TSF9USU1FUl9IX18KKworc3RydWN0IHNoX3RpbWVyX2NvbmZpZyB7CisJY2hhciAqbmFtZTsKKwlsb25nIGNoYW5uZWxfb2Zmc2V0OworCWludCB0aW1lcl9iaXQ7CisJY2hhciAqY2xrOworCXVuc2lnbmVkIGxvbmcgY2xvY2tldmVudF9yYXRpbmc7CisJdW5zaWduZWQgbG9uZyBjbG9ja3NvdXJjZV9yYXRpbmc7Cit9OworCisjZW5kaWYgLyogX19TSF9USU1FUl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmggYi9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCmluZGV4IDg0Zjk5N2YuLmM3NTUyODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaApAQCAtMjM1LDYgKzIzNSw4IEBACiBleHRlcm4gaW50IG5leHRfc2lnbmFsKHN0cnVjdCBzaWdwZW5kaW5nICpwZW5kaW5nLCBzaWdzZXRfdCAqbWFzayk7CiBleHRlcm4gaW50IGdyb3VwX3NlbmRfc2lnX2luZm8oaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBleHRlcm4gaW50IF9fZ3JvdXBfc2VuZF9zaWdfaW5mbyhpbnQsIHN0cnVjdCBzaWdpbmZvICosIHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiBsb25nIGRvX3J0X3Rnc2lncXVldWVpbmZvKHBpZF90IHRnaWQsIHBpZF90IHBpZCwgaW50IHNpZywKKwkJCQkgc2lnaW5mb190ICppbmZvKTsKIGV4dGVybiBsb25nIGRvX3NpZ3BlbmRpbmcodm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gaW50IHNpZ3Byb2NtYXNrKGludCwgc2lnc2V0X3QgKiwgc2lnc2V0X3QgKik7CiBleHRlcm4gaW50IHNob3dfdW5oYW5kbGVkX3NpZ25hbHM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NsYWIuaCBiL2luY2x1ZGUvbGludXgvc2xhYi5oCmluZGV4IDI0YzU2MDIuLjQ4ODAzMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2xhYi5oCkBAIC02Miw2ICs2Miw4IEBACiAjIGRlZmluZSBTTEFCX0RFQlVHX09CSkVDVFMJMHgwMDAwMDAwMFVMCiAjZW5kaWYKIAorI2RlZmluZSBTTEFCX05PTEVBS1RSQUNFCTB4MDA4MDAwMDBVTAkvKiBBdm9pZCBrbWVtbGVhayB0cmFjaW5nICovCisKIC8qIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYWZmZWN0IHRoZSBwYWdlIGFsbG9jYXRvciBncm91cGluZyBwYWdlcyBieSBtb2JpbGl0eSAqLwogI2RlZmluZSBTTEFCX1JFQ0xBSU1fQUNDT1VOVAkweDAwMDIwMDAwVUwJCS8qIE9iamVjdHMgYXJlIHJlY2xhaW1hYmxlICovCiAjZGVmaW5lIFNMQUJfVEVNUE9SQVJZCQlTTEFCX1JFQ0xBSU1fQUNDT1VOVAkvKiBPYmplY3RzIGFyZSBzaG9ydC1saXZlZCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCmluZGV4IDVhYzliMGIuLjcxM2Y4NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgkJLyoga21hbGxvY19zaXplcy5oIG5lZWRzIFBBR0VfU0laRSAqLwogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgkJLyoga21hbGxvY19zaXplcy5oIG5lZWRzIEwxX0NBQ0hFX0JZVEVTICovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDx0cmFjZS9rbWVtdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtdHJhY2UuaD4KIAogLyogU2l6ZSBkZXNjcmlwdGlvbiBzdHJ1Y3QgZm9yIGdlbmVyYWwgY2FjaGVzLiAqLwogc3RydWN0IGNhY2hlX3NpemVzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCA1MDQ2ZjkwLi5iZTVkNDBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPHRyYWNlL2ttZW10cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW10cmFjZS5oPgogCiBlbnVtIHN0YXRfaXRlbSB7CiAJQUxMT0NfRkFTVFBBVEgsCQkvKiBBbGxvY2F0aW9uIGZyb20gY3B1IHNsYWIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdXAuaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdXAuaAppbmRleCA5MzgyMzRjLi5kNDg0MWVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3VwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja191cC5oCkBAIC02MCw2ICs2MCw3IEBACiAjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spCSgodm9pZCkobG9jayksIDApCiAvKiBmb3Igc2NoZWQuYyBhbmQga2VybmVsX2xvY2suYzogKi8KICMgZGVmaW5lIF9fcmF3X3NwaW5fbG9jayhsb2NrKQkJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCisjIGRlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQogIyBkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2sobG9jaykJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCiAjIGRlZmluZSBfX3Jhd19zcGluX3RyeWxvY2sobG9jaykJKHsgKHZvaWQpKGxvY2spOyAxOyB9KQogI2VuZGlmIC8qIERFQlVHX1NQSU5MT0NLICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwbGljZS5oIGIvaW5jbHVkZS9saW51eC9zcGxpY2UuaAppbmRleCA1ZjNmYWE5Li4xOGU3YzdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwbGljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BsaWNlLmgKQEAgLTExLDggKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9waXBlX2ZzX2kuaD4KIAogLyoKLSAqIHNwbGljZSBpcyB0aWVkIHRvIHBpcGVzIGFzIGEgdHJhbnNwb3J0IChhdCBsZWFzdCBmb3Igbm93KSwgc28gd2UnbGwganVzdAotICogYWRkIHRoZSBzcGxpY2UgZmxhZ3MgaGVyZS4KKyAqIEZsYWdzIHBhc3NlZCBpbiBmcm9tIHNwbGljZS90ZWUvdm1zcGxpY2UKICAqLwogI2RlZmluZSBTUExJQ0VfRl9NT1ZFCSgweDAxKQkvKiBtb3ZlIHBhZ2VzIGluc3RlYWQgb2YgY29weWluZyAqLwogI2RlZmluZSBTUExJQ0VfRl9OT05CTE9DSyAoMHgwMikgLyogZG9uJ3QgYmxvY2sgb24gdGhlIHBpcGUgc3BsaWNpbmcgKGJ1dCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2lvdGxiLmggYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaAppbmRleCBhYzlmZjU0Li5jYjFhNjYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaApAQCAtMjksNyArMjksOCBAQAogCiBleHRlcm4gZG1hX2FkZHJfdCBzd2lvdGxiX3BoeXNfdG9fYnVzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAogCQkJCSAgICAgIHBoeXNfYWRkcl90IGFkZHJlc3MpOwotZXh0ZXJuIHBoeXNfYWRkcl90IHN3aW90bGJfYnVzX3RvX3BoeXMoZG1hX2FkZHJfdCBhZGRyZXNzKTsKK2V4dGVybiBwaHlzX2FkZHJfdCBzd2lvdGxiX2J1c190b19waHlzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAorCQkJCSAgICAgICBkbWFfYWRkcl90IGFkZHJlc3MpOwogCiBleHRlcm4gaW50IHN3aW90bGJfYXJjaF9yYW5nZV9uZWVkc19tYXBwaW5nKHBoeXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaCBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAppbmRleCAzMDUyMDg0Li5jNmM4NGFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCkBAIC01NSw2ICs1NSw3IEBACiBzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZDsKIHN0cnVjdCBnZXRjcHVfY2FjaGU7CiBzdHJ1Y3Qgb2xkX2xpbnV4X2RpcmVudDsKK3N0cnVjdCBwZXJmX2NvdW50ZXJfYXR0cjsKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgpAQCAtNzU1LDQgKzc1Niw4IEBACiAKIGludCBrZXJuZWxfZXhlY3ZlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjaGFyICpjb25zdCBhcmd2W10sIGNoYXIgKmNvbnN0IGVudnBbXSk7CiAKKworYXNtbGlua2FnZSBsb25nIHN5c19wZXJmX2NvdW50ZXJfb3BlbigKKwkJY29uc3Qgc3RydWN0IHBlcmZfY291bnRlcl9hdHRyIF9fdXNlciAqYXR0cl91cHRyLAorCQlwaWRfdCBwaWQsIGludCBjcHUsIGludCBncm91cF9mZCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvbGludXgvdGhyZWFkX2luZm8uaAppbmRleCBlNmI4MjBmLi5hOGNjNGUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9saW51eC90aHJlYWRfaW5mby5oCkBAIC0yMSwxMyArMjEsMTQgQEAKIAkJc3RydWN0IHsKIAkJCXVuc2lnbmVkIGxvbmcgYXJnMCwgYXJnMSwgYXJnMiwgYXJnMzsKIAkJfTsKLQkJLyogRm9yIGZ1dGV4X3dhaXQgKi8KKwkJLyogRm9yIGZ1dGV4X3dhaXQgYW5kIGZ1dGV4X3dhaXRfcmVxdWV1ZV9waSAqLwogCQlzdHJ1Y3QgewogCQkJdTMyICp1YWRkcjsKIAkJCXUzMiB2YWw7CiAJCQl1MzIgZmxhZ3M7CiAJCQl1MzIgYml0c2V0OwogCQkJdTY0IHRpbWU7CisJCQl1MzIgKnVhZGRyMjsKIAkJfSBmdXRleDsKIAkJLyogRm9yIG5hbm9zbGVlcCAqLwogCQlzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aW1lLmggYi9pbmNsdWRlL2xpbnV4L3RpbWUuaAppbmRleCAyNDJmNjI0Li5lYTE2YzFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtMTEzLDYgKzExMywyMSBAQAogI2RlZmluZSBDVVJSRU5UX1RJTUUJCShjdXJyZW50X2tlcm5lbF90aW1lKCkpCiAjZGVmaW5lIENVUlJFTlRfVElNRV9TRUMJKChzdHJ1Y3QgdGltZXNwZWMpIHsgZ2V0X3NlY29uZHMoKSwgMCB9KQogCisvKiBTb21lIGFyY2hpdGVjdHVyZXMgZG8gbm90IHN1cHBseSB0aGVpciBvd24gY2xvY2tzb3VyY2UuCisgKiBUaGlzIGlzIG1haW5seSB0aGUgY2FzZSBpbiBhcmNoaXRlY3R1cmVzIHRoYXQgZ2V0IHRoZWlyCisgKiBpbnRlci10aWNrIHRpbWVzIGJ5IHJlYWRpbmcgdGhlIGNvdW50ZXIgb24gdGhlaXIgaW50ZXJ2YWwKKyAqIHRpbWVyLiBTaW5jZSB0aGVzZSB0aW1lcnMgd3JhcCBldmVyeSB0aWNrLCB0aGV5J3JlIG5vdCByZWFsbHkKKyAqIHVzZWZ1bCBhcyBjbG9ja3NvdXJjZXMuIFdyYXBwaW5nIHRoZW0gdG8gYWN0IGxpa2Ugb25lIGlzIHBvc3NpYmxlCisgKiBidXQgbm90IHZlcnkgZWZmaWNpZW50LiBTbyB3ZSBwcm92aWRlIGEgY2FsbG91dCB0aGVzZSBhcmNoZXMKKyAqIGNhbiBpbXBsZW1lbnQgZm9yIHVzZSB3aXRoIHRoZSBqaWZmaWVzIGNsb2Nrc291cmNlIHRvIHByb3ZpZGUKKyAqIGZpbmVyIHRoZW4gdGljayBncmFudWxhciB0aW1lLgorICovCisjaWZkZWYgQ09ORklHX0FSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCitleHRlcm4gdTMyIGFyY2hfZ2V0dGltZW9mZnNldCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHUzMiBhcmNoX2dldHRpbWVvZmZzZXQodm9pZCkgeyByZXR1cm4gMDsgfQorI2VuZGlmCisKIGV4dGVybiB2b2lkIGRvX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqdHYpOwogZXh0ZXJuIGludCBkb19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dik7CiBleHRlcm4gaW50IGRvX3N5c19zZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0diwgc3RydWN0IHRpbWV6b25lICp0eik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RyYWNlX3NlcS5oIGIvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhiY2NiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaApAQCAtMCwwICsxLDkyIEBACisjaWZuZGVmIF9MSU5VWF9UUkFDRV9TRVFfSAorI2RlZmluZSBfTElOVVhfVFJBQ0VfU0VRX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKy8qCisgKiBUcmFjZSBzZXF1ZW5jZXMgYXJlIHVzZWQgdG8gYWxsb3cgYSBmdW5jdGlvbiB0byBjYWxsIHNldmVyYWwgb3RoZXIgZnVuY3Rpb25zCisgKiB0byBjcmVhdGUgYSBzdHJpbmcgb2YgZGF0YSB0byB1c2UgKHVwIHRvIGEgbWF4IG9mIFBBR0VfU0laRS4KKyAqLworCitzdHJ1Y3QgdHJhY2Vfc2VxIHsKKwl1bnNpZ25lZCBjaGFyCQlidWZmZXJbUEFHRV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQJCWxlbjsKKwl1bnNpZ25lZCBpbnQJCXJlYWRwb3M7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK3RyYWNlX3NlcV9pbml0KHN0cnVjdCB0cmFjZV9zZXEgKnMpCit7CisJcy0+bGVuID0gMDsKKwlzLT5yZWFkcG9zID0gMDsKK30KKworLyoKKyAqIEN1cnJlbnRseSBvbmx5IGRlZmluZWQgd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfVFJBQ0lORworZXh0ZXJuIGludCB0cmFjZV9zZXFfcHJpbnRmKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VxX3ZwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSkpOworZXh0ZXJuIGludAordHJhY2Vfc2VxX2JwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCBjb25zdCB1MzIgKmJpbmFyeSk7CitleHRlcm4gdm9pZCB0cmFjZV9wcmludF9zZXEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKK2V4dGVybiBzc2l6ZV90IHRyYWNlX3NlcV90b191c2VyKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNoYXIgX191c2VyICp1YnVmLAorCQkJCSBzaXplX3QgY250KTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dHMoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqc3RyKTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dGMoc3RydWN0IHRyYWNlX3NlcSAqcywgdW5zaWduZWQgY2hhciBjKTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dG1lbShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW4pOworZXh0ZXJuIGludCB0cmFjZV9zZXFfcHV0bWVtX2hleChzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sCisJCQkJc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCAqdHJhY2Vfc2VxX3Jlc2VydmUoc3RydWN0IHRyYWNlX3NlcSAqcywgc2l6ZV90IGxlbik7CitleHRlcm4gaW50IHRyYWNlX3NlcV9wYXRoKHN0cnVjdCB0cmFjZV9zZXEgKnMsIHN0cnVjdCBwYXRoICpwYXRoKTsKKworI2Vsc2UgLyogQ09ORklHX1RSQUNJTkcgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRyYWNlX3NlcV9wcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludAordHJhY2Vfc2VxX2JwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCBjb25zdCB1MzIgKmJpbmFyeSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpCit7Cit9CitzdGF0aWMgaW5saW5lIHNzaXplX3QgdHJhY2Vfc2VxX3RvX3VzZXIoc3RydWN0IHRyYWNlX3NlcSAqcywgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJIHNpemVfdCBjbnQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9zZXFfcHV0cyhzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9zZXFfcHV0YyhzdHJ1Y3QgdHJhY2Vfc2VxICpzLCB1bnNpZ25lZCBjaGFyIGMpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludAordHJhY2Vfc2VxX3B1dG1lbShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9zZXFfcHV0bWVtX2hleChzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sCisJCQkJICAgICAgIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgKnRyYWNlX3NlcV9yZXNlcnZlKHN0cnVjdCB0cmFjZV9zZXEgKnMsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9zZXFfcGF0aChzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBzdHJ1Y3QgcGF0aCAqcGF0aCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfVFJBQ0lORyAqLworCisjZW5kaWYgLyogX0xJTlVYX1RSQUNFX1NFUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCmluZGV4IGQzNWE3ZWUuLjE0ZGY3ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCisrKyBiL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCkBAIC0zMSw2ICszMSw4IEBACiAJCQkJCSAqIEtlZXAgaW4gc3luYyB3aXRoIHZtbGludXgubGRzLmguCiAJCQkJCSAqLwogCisjaWZuZGVmIERFQ0xBUkVfVFJBQ0UKKwogI2RlZmluZSBUUF9QUk9UTyhhcmdzLi4uKQlhcmdzCiAjZGVmaW5lIFRQX0FSR1MoYXJncy4uLikJCWFyZ3MKIApAQCAtMTE0LDYgKzExNiw3IEBACiAJc3RydWN0IHRyYWNlcG9pbnQgKmVuZCkKIHsgfQogI2VuZGlmIC8qIENPTkZJR19UUkFDRVBPSU5UUyAqLworI2VuZGlmIC8qIERFQ0xBUkVfVFJBQ0UgKi8KIAogLyoKICAqIENvbm5lY3QgYSBwcm9iZSB0byBhIHRyYWNlcG9pbnQuCkBAIC0xNTQsMTAgKzE1Nyw4IEBACiB9CiAKICNkZWZpbmUgUEFSQU1TKGFyZ3MuLi4pIGFyZ3MKLSNkZWZpbmUgVFJBQ0VfRk9STUFUKG5hbWUsIHByb3RvLCBhcmdzLCBmbXQpCQlcCi0JREVDTEFSRV9UUkFDRShuYW1lLCBQQVJBTVMocHJvdG8pLCBQQVJBTVMoYXJncykpCiAKLQorI2lmbmRlZiBUUkFDRV9FVkVOVAogLyoKICAqIEZvciB1c2Ugd2l0aCB0aGUgVFJBQ0VfRVZFTlQgbWFjcm86CiAgKgpAQCAtMjYyLDUgKzI2Myw2IEBACiAKICNkZWZpbmUgVFJBQ0VfRVZFTlQobmFtZSwgcHJvdG8sIGFyZ3MsIHN0cnVjdCwgYXNzaWduLCBwcmludCkJXAogCURFQ0xBUkVfVFJBQ0UobmFtZSwgUEFSQU1TKHByb3RvKSwgUEFSQU1TKGFyZ3MpKQorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90dHkuaCBiL2luY2x1ZGUvbGludXgvdHR5LmgKaW5kZXggZmMzOWRiOTUuLjE0ODhkOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5LmgKKysrIGIvaW5jbHVkZS9saW51eC90dHkuaApAQCAtMTg1LDcgKzE4NSw3IEBACiBzdHJ1Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyB7CiAJLyogUmV0dXJuIDEgaWYgdGhlIGNhcnJpZXIgaXMgcmFpc2VkICovCiAJaW50ICgqY2Fycmllcl9yYWlzZWQpKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7Ci0Jdm9pZCAoKnJhaXNlX2R0cl9ydHMpKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CisJdm9pZCAoKmR0cl9ydHMpKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgaW50IHJhaXNlKTsKIH07CiAJCiBzdHJ1Y3QgdHR5X3BvcnQgewpAQCAtMjAxLDYgKzIwMSw5IEBACiAJdW5zaWduZWQgY2hhcgkJKnhtaXRfYnVmOwkvKiBPcHRpb25hbCBidWZmZXIgKi8KIAlpbnQJCQljbG9zZV9kZWxheTsJLyogQ2xvc2UgcG9ydCBkZWxheSAqLwogCWludAkJCWNsb3Npbmdfd2FpdDsJLyogRGVsYXkgZm9yIG91dHB1dCAqLworCWludAkJCWRyYWluX2RlbGF5OwkvKiBTZXQgdG8gemVybyBpZiBubyBwdXJlIHRpbWUKKwkJCQkJCSAgIGJhc2VkIGRyYWluIGlzIG5lZWRlZCBlbHNlCisJCQkJCQkgICBzZXQgdG8gc2l6ZSBvZiBmaWZvICovCiB9OwogCiAvKgpAQCAtMjIzLDggKzIyNiwxMSBAQAogCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXI7CiAJY29uc3Qgc3RydWN0IHR0eV9vcGVyYXRpb25zICpvcHM7CiAJaW50IGluZGV4OwotCS8qIFRoZSBsZGlzYyBvYmplY3RzIGFyZSBwcm90ZWN0ZWQgYnkgdHR5X2xkaXNjX2xvY2sgYXQgdGhlIG1vbWVudCAqLwotCXN0cnVjdCB0dHlfbGRpc2MgbGRpc2M7CisKKwkvKiBQcm90ZWN0cyBsZGlzYyBjaGFuZ2VzOiBMb2NrIHR0eSBub3QgcHR5ICovCisJc3RydWN0IG11dGV4IGxkaXNjX211dGV4OworCXN0cnVjdCB0dHlfbGRpc2MgKmxkaXNjOworCiAJc3RydWN0IG11dGV4IHRlcm1pb3NfbXV0ZXg7CiAJc3BpbmxvY2tfdCBjdHJsX2xvY2s7CiAJLyogVGVybWlvcyB2YWx1ZXMgYXJlIHByb3RlY3RlZCBieSB0aGUgdGVybWlvcyBtdXRleCAqLwpAQCAtMzExLDYgKzMxNyw3IEBACiAjZGVmaW5lIFRUWV9DTE9TSU5HIAkJNwkvKiAtPmNsb3NlKCkgaW4gcHJvZ3Jlc3MgKi8KICNkZWZpbmUgVFRZX0xESVNDIAkJOQkvKiBMaW5lIGRpc2NpcGxpbmUgYXR0YWNoZWQgKi8KICNkZWZpbmUgVFRZX0xESVNDX0NIQU5HSU5HIAkxMAkvKiBMaW5lIGRpc2NpcGxpbmUgY2hhbmdpbmcgKi8KKyNkZWZpbmUgVFRZX0xESVNDX09QRU4JIAkxMQkvKiBMaW5lIGRpc2NpcGxpbmUgaXMgb3BlbiAqLwogI2RlZmluZSBUVFlfSFdfQ09PS19PVVQgCTE0CS8qIEhhcmR3YXJlIGNhbiBkbyBvdXRwdXQgY29va2luZyAqLwogI2RlZmluZSBUVFlfSFdfQ09PS19JTiAJCTE1CS8qIEhhcmR3YXJlIGNhbiBkbyBpbnB1dCBjb29raW5nICovCiAjZGVmaW5lIFRUWV9QVFlfTE9DSyAJCTE2CS8qIHB0eSBwcml2YXRlICovCkBAIC00MDMsNiArNDEwLDcgQEAKIGV4dGVybiBzdHJ1Y3QgdHR5X2xkaXNjICp0dHlfbGRpc2NfcmVmKHN0cnVjdCB0dHlfc3RydWN0ICopOwogZXh0ZXJuIHZvaWQgdHR5X2xkaXNjX2RlcmVmKHN0cnVjdCB0dHlfbGRpc2MgKik7CiBleHRlcm4gc3RydWN0IHR0eV9sZGlzYyAqdHR5X2xkaXNjX3JlZl93YWl0KHN0cnVjdCB0dHlfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgdHR5X2xkaXNjX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHR0eV9sZGlzY3NfcHJvY19mb3BzOwogCiBleHRlcm4gdm9pZCB0dHlfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtNDI1LDYgKzQzMyw5IEBACiBleHRlcm4gdm9pZCB0dHlfcmVsZWFzZV9kZXYoc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCB0dHlfaW5pdF90ZXJtaW9zKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwogCitleHRlcm4gc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9wYWlyX2dldF90dHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CitleHRlcm4gc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eV9wYWlyX2dldF9wdHkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CisKIGV4dGVybiBzdHJ1Y3QgbXV0ZXggdHR5X211dGV4OwogCiBleHRlcm4gdm9pZCB0dHlfd3JpdGVfdW5sb2NrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpAQCAtNDM4LDYgKzQ0OSw3IEBACiBleHRlcm4gdm9pZCB0dHlfcG9ydF90dHlfc2V0KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gaW50IHR0eV9wb3J0X2NhcnJpZXJfcmFpc2VkKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CiBleHRlcm4gdm9pZCB0dHlfcG9ydF9yYWlzZV9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CitleHRlcm4gdm9pZCB0dHlfcG9ydF9sb3dlcl9kdHJfcnRzKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCk7CiBleHRlcm4gdm9pZCB0dHlfcG9ydF9oYW5ndXAoc3RydWN0IHR0eV9wb3J0ICpwb3J0KTsKIGV4dGVybiBpbnQgdHR5X3BvcnRfYmxvY2tfdGlsX3JlYWR5KHN0cnVjdCB0dHlfcG9ydCAqcG9ydCwKIAkJCQlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R0eV9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvdHR5X2RyaXZlci5oCmluZGV4IGJjYmE4NGUuLjM1NjYxMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHR5X2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvdHR5X2RyaXZlci5oCkBAIC0xMjcsNyArMTI3LDggQEAKICAqIAl0aGUgbGluZSBkaXNjaXBsaW5lIGFyZSBjbG9zZSB0byBmdWxsLCBhbmQgaXQgc2hvdWxkIHNvbWVob3cKICAqIAlzaWduYWwgdGhhdCBubyBtb3JlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHR0eS4KICAqCi0gKglPcHRpb25hbDogQWx3YXlzIGludm9rZSB2aWEgdHR5X3Rocm90dGxlKCk7CisgKglPcHRpb25hbDogQWx3YXlzIGludm9rZSB2aWEgdHR5X3Rocm90dGxlKCksIGNhbGxlZCB1bmRlciB0aGUKKyAqCXRlcm1pb3MgbG9jay4KICAqIAogICogdm9pZCAoKnVudGhyb3R0bGUpKHN0cnVjdCB0dHlfc3RydWN0ICogdHR5KTsKICAqCkBAIC0xMzUsNyArMTM2LDggQEAKICAqIAl0aGF0IGNoYXJhY3RlcnMgY2FuIG5vdyBiZSBzZW50IHRvIHRoZSB0dHkgd2l0aG91dCBmZWFyIG9mCiAgKiAJb3ZlcnJ1bm5pbmcgdGhlIGlucHV0IGJ1ZmZlcnMgb2YgdGhlIGxpbmUgZGlzY2lwbGluZXMuCiAgKiAKLSAqCU9wdGlvbmFsOiBBbHdheXMgaW52b2tlIHZpYSB0dHlfdW50aHJvdHRsZSgpOworICoJT3B0aW9uYWw6IEFsd2F5cyBpbnZva2UgdmlhIHR0eV91bnRocm90dGxlKCksIGNhbGxlZCB1bmRlciB0aGUKKyAqCXRlcm1pb3MgbG9jay4KICAqCiAgKiB2b2lkICgqc3RvcCkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2Ivc2VyaWFsLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaAppbmRleCA2MjVlOWU0Li44Y2RmZWQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9zZXJpYWwuaApAQCAtMjI0LDggKzIyNCw3IEBACiAJLyogQ2FsbGVkIGJ5IGNvbnNvbGUgd2l0aCB0dHkgPSBOVUxMIGFuZCBieSB0dHkgKi8KIAlpbnQgICgqb3Blbikoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKLQl2b2lkICgqY2xvc2UpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCi0JCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCk7CisJdm9pZCAoKmNsb3NlKShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIAlpbnQgICgqd3JpdGUpKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQljb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7CiAJLyogQ2FsbGVkIG9ubHkgYnkgdGhlIHR0eSBsYXllciAqLwpAQCAtMjQxLDYgKzI0MCwxMCBAQAogCWludCAgKCp0aW9jbWdldCkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCWludCAgKCp0aW9jbXNldCkoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKKwkvKiBDYWxsZWQgYnkgdGhlIHR0eSBsYXllciBmb3IgcG9ydCBsZXZlbCB3b3JrLiBUaGVyZSBtYXkgb3IgbWF5IG5vdAorCSAgIGJlIGFuIGF0dGFjaGVkIHR0eSBhdCB0aGlzIHBvaW50ICovCisJdm9pZCAoKmR0cl9ydHMpKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBvbik7CisJaW50ICAoKmNhcnJpZXJfcmFpc2VkKShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIAkvKiBVU0IgZXZlbnRzICovCiAJdm9pZCAoKnJlYWRfaW50X2NhbGxiYWNrKShzdHJ1Y3QgdXJiICp1cmIpOwogCXZvaWQgKCp3cml0ZV9pbnRfY2FsbGJhY2spKHN0cnVjdCB1cmIgKnVyYik7CkBAIC0yODMsOCArMjg2LDcgQEAKIAkJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwogZXh0ZXJuIGludCB1c2Jfc2VyaWFsX2dlbmVyaWNfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCk7Ci1leHRlcm4gdm9pZCB1c2Jfc2VyaWFsX2dlbmVyaWNfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKK2V4dGVybiB2b2lkIHVzYl9zZXJpYWxfZ2VuZXJpY19jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIGV4dGVybiBpbnQgdXNiX3NlcmlhbF9nZW5lcmljX3Jlc3VtZShzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKIGV4dGVybiBpbnQgdXNiX3NlcmlhbF9nZW5lcmljX3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CiBleHRlcm4gaW50IHVzYl9zZXJpYWxfZ2VuZXJpY19jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19ibGsuaCBiL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCmluZGV4IDk0YzU2ZDIuLmJlN2QyNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCisrKyBiL2luY2x1ZGUvbGludXgvdmlydGlvX2Jsay5oCkBAIC0xNSw2ICsxNSwxMCBAQAogI2RlZmluZSBWSVJUSU9fQkxLX0ZfR0VPTUVUUlkJNAkvKiBMZWdhY3kgZ2VvbWV0cnkgYXZhaWxhYmxlICAqLwogI2RlZmluZSBWSVJUSU9fQkxLX0ZfUk8JCTUJLyogRGlzayBpcyByZWFkLW9ubHkgKi8KICNkZWZpbmUgVklSVElPX0JMS19GX0JMS19TSVpFCTYJLyogQmxvY2sgc2l6ZSBvZiBkaXNrIGlzIGF2YWlsYWJsZSovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9TQ1NJCTcJLyogU3VwcG9ydHMgc2NzaSBjb21tYW5kIHBhc3N0aHJ1ICovCisjZGVmaW5lIFZJUlRJT19CTEtfRl9JREVOVElGWQk4CS8qIEFUQSBJREVOVElGWSBzdXBwb3J0ZWQgKi8KKworI2RlZmluZSBWSVJUSU9fQkxLX0lEX0JZVEVTCShzaXplb2YoX191MTZbMjU2XSkpCS8qIElERU5USUZZIERBVEEgKi8KIAogc3RydWN0IHZpcnRpb19ibGtfY29uZmlnCiB7CkBAIC0zMiw2ICszNiw3IEBACiAJfSBnZW9tZXRyeTsKIAkvKiBibG9jayBzaXplIG9mIGRldmljZSAoaWYgVklSVElPX0JMS19GX0JMS19TSVpFKSAqLwogCV9fdTMyIGJsa19zaXplOworCV9fdTggaWRlbnRpZnlbVklSVElPX0JMS19JRF9CWVRFU107CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCiAvKiBUaGVzZSB0d28gZGVmaW5lIGRpcmVjdGlvbi4gKi8KQEAgLTU1LDYgKzYwLDEzIEBACiAJX191NjQgc2VjdG9yOwogfTsKIAorc3RydWN0IHZpcnRpb19zY3NpX2luaGRyIHsKKwlfX3UzMiBlcnJvcnM7CisJX191MzIgZGF0YV9sZW47CisJX191MzIgc2Vuc2VfbGVuOworCV9fdTMyIHJlc2lkdWFsOworfTsKKwogLyogQW5kIHRoaXMgaXMgdGhlIGZpbmFsIGJ5dGUgb2YgdGhlIHdyaXRlIHNjYXR0ZXItZ2F0aGVyIGxpc3QuICovCiAjZGVmaW5lIFZJUlRJT19CTEtfU19PSwkJMAogI2RlZmluZSBWSVJUSU9fQkxLX1NfSU9FUlIJMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93YWl0LmggYi9pbmNsdWRlL2xpbnV4L3dhaXQuaAppbmRleCBiYzAyNDYzLi42Nzg4ZTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dhaXQuaApAQCAtMTMyLDggKzEzMiw2IEBACiAJbGlzdF9kZWwoJm9sZC0+dGFza19saXN0KTsKIH0KIAotdm9pZCBfX3dha2VfdXBfY29tbW9uKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwKLQkJCWludCBucl9leGNsdXNpdmUsIGludCBzeW5jLCB2b2lkICprZXkpOwogdm9pZCBfX3dha2VfdXAod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLCBpbnQgbnIsIHZvaWQgKmtleSk7CiB2b2lkIF9fd2FrZV91cF9sb2NrZWRfa2V5KHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqa2V5KTsKIHZvaWQgX193YWtlX3VwX3N5bmNfa2V5KHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwgaW50IG5yLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCmluZGV4IDQzYjUwZDMuLjM4NzhkMWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKQEAgLTI3MCw3ICsyNzAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHNlY3Rvcl90IHNjc2lfZ2V0X2xiYShzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kKQogewotCXJldHVybiBzY21kLT5yZXF1ZXN0LT5zZWN0b3I7CisJcmV0dXJuIGJsa19ycV9wb3Moc2NtZC0+cmVxdWVzdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2NzaV9wcm90X3NnX2NvdW50KHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvYmxvY2suaCBiL2luY2x1ZGUvdHJhY2UvYmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViNzA2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3RyYWNlL2Jsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0jaWZuZGVmIF9UUkFDRV9CTE9DS19ICi0jZGVmaW5lIF9UUkFDRV9CTE9DS19ICi0KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfcnFfYWJvcnQsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSksCi0JICAgICAgVFBfQVJHUyhxLCBycSkpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX3JxX2luc2VydCwKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKSwKLQkgICAgICBUUF9BUkdTKHEsIHJxKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfcnFfaXNzdWUsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSksCi0JICAgICAgVFBfQVJHUyhxLCBycSkpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX3JxX3JlcXVldWUsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSksCi0JICAgICAgVFBfQVJHUyhxLCBycSkpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX3JxX2NvbXBsZXRlLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpLAotCSAgICAgIFRQX0FSR1MocSwgcnEpKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19iaW9fYm91bmNlLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAotCSAgICAgIFRQX0FSR1MocSwgYmlvKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfYmlvX2NvbXBsZXRlLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAotCSAgICAgIFRQX0FSR1MocSwgYmlvKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfYmlvX2JhY2ttZXJnZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKSwKLQkgICAgICBUUF9BUkdTKHEsIGJpbykpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX2Jpb19mcm9udG1lcmdlLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAotCSAgICAgIFRQX0FSR1MocSwgYmlvKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfYmlvX3F1ZXVlLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAotCSAgICAgIFRQX0FSR1MocSwgYmlvKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfZ2V0cnEsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgaW50IHJ3KSwKLQkgICAgICBUUF9BUkdTKHEsIGJpbywgcncpKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19zbGVlcHJxLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sIGludCBydyksCi0JICAgICAgVFBfQVJHUyhxLCBiaW8sIHJ3KSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfcGx1ZywKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSksCi0JICAgICAgVFBfQVJHUyhxKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfdW5wbHVnX3RpbWVyLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSwKLQkgICAgICBUUF9BUkdTKHEpKTsKLQotREVDTEFSRV9UUkFDRShibG9ja191bnBsdWdfaW8sCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpLAotCSAgICAgIFRQX0FSR1MocSkpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX3NwbGl0LAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBwZHUpLAotCSAgICAgIFRQX0FSR1MocSwgYmlvLCBwZHUpKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19yZW1hcCwKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLCBkZXZfdCBkZXYsCi0JCSBzZWN0b3JfdCBmcm9tLCBzZWN0b3JfdCB0byksCi0JICAgICAgVFBfQVJHUyhxLCBiaW8sIGRldiwgZnJvbSwgdG8pKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9kZWZpbmVfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2E3YWUxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9kZWZpbmVfdHJhY2UuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogVHJhY2UgZmlsZXMgdGhhdCB3YW50IHRvIGF1dG9tYXRlIGNyZWF0aW9uZyBvZiBhbGwgdHJhY2Vwb2ludHMgZGVmaW5lZAorICogaW4gdGhlaXIgZmlsZSBzaG91bGQgaW5jbHVkZSB0aGlzIGZpbGUuIFRoZSBmb2xsb3dpbmcgYXJlIG1hY3JvcyB0aGF0IHRoZQorICogdHJhY2UgZmlsZSBtYXkgZGVmaW5lOgorICoKKyAqIFRSQUNFX1NZU1RFTSBkZWZpbmVzIHRoZSBzeXN0ZW0gdGhlIHRyYWNlcG9pbnQgaXMgZm9yCisgKgorICogVFJBQ0VfSU5DTFVERV9GSUxFIGlmIHRoZSBmaWxlIG5hbWUgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gVFJBQ0VfU1lTVEVNLmgKKyAqICAgICBUaGlzIG1hY3JvIG1heSBiZSBkZWZpbmVkIHRvIHRlbGwgZGVmaW5lX3RyYWNlLmggd2hhdCBmaWxlIHRvIGluY2x1ZGUuCisgKiAgICAgTm90ZSwgbGVhdmUgb2ZmIHRoZSAiLmgiLgorICoKKyAqIFRSQUNFX0lOQ0xVREVfUEFUSCBpZiB0aGUgcGF0aCBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBjb3JlIGtlcm5lbCBpbmNsdWRlL3RyYWNlCisgKiAgICAgdGhlbiB0aGlzIG1hY3JvIGNhbiBkZWZpbmUgdGhlIHBhdGggdG8gdXNlLiBOb3RlLCB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0bworICogICAgIGRlZmluZV90cmFjZS5oLCBub3QgdGhlIGZpbGUgaW5jbHVkaW5nIGl0LiBGdWxsIHBhdGggbmFtZXMgZm9yIG91dCBvZiB0cmVlCisgKiAgICAgbW9kdWxlcyBtdXN0IGJlIHVzZWQuCisgKi8KKworI2lmZGVmIENSRUFURV9UUkFDRV9QT0lOVFMKKworLyogUHJldmVudCByZWN1cnNpb24gKi8KKyN1bmRlZiBDUkVBVEVfVFJBQ0VfUE9JTlRTCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKworI3VuZGVmIFRSQUNFX0VWRU5UCisjZGVmaW5lIFRSQUNFX0VWRU5UKG5hbWUsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBhc3NpZ24sIHByaW50KQlcCisJREVGSU5FX1RSQUNFKG5hbWUpCisKKyN1bmRlZiBERUNMQVJFX1RSQUNFCisjZGVmaW5lIERFQ0xBUkVfVFJBQ0UobmFtZSwgcHJvdG8sIGFyZ3MpCVwKKwlERUZJTkVfVFJBQ0UobmFtZSkKKworI3VuZGVmIFRSQUNFX0lOQ0xVREUKKyN1bmRlZiBfX1RSQUNFX0lOQ0xVREUKKworI2lmbmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKKyMgZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBUUkFDRV9TWVNURU0KKyMgZGVmaW5lIFVOREVGX1RSQUNFX0lOQ0xVREVfRklMRQorI2VuZGlmCisKKyNpZm5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjIGRlZmluZSBfX1RSQUNFX0lOQ0xVREUoc3lzdGVtKSA8dHJhY2UvZXZlbnRzL3N5c3RlbS5oPgorIyBkZWZpbmUgVU5ERUZfVFJBQ0VfSU5DTFVERV9QQVRICisjZWxzZQorIyBkZWZpbmUgX19UUkFDRV9JTkNMVURFKHN5c3RlbSkgX19zdHJpbmdpZnkoVFJBQ0VfSU5DTFVERV9QQVRIL3N5c3RlbS5oKQorI2VuZGlmCisKKyMgZGVmaW5lIFRSQUNFX0lOQ0xVREUoc3lzdGVtKSBfX1RSQUNFX0lOQ0xVREUoc3lzdGVtKQorCisvKiBMZXQgdGhlIHRyYWNlIGhlYWRlcnMgYmUgcmVyZWFkICovCisjZGVmaW5lIFRSQUNFX0hFQURFUl9NVUxUSV9SRUFECisKKyNpbmNsdWRlIFRSQUNFX0lOQ0xVREUoVFJBQ0VfSU5DTFVERV9GSUxFKQorCisjaWZkZWYgQ09ORklHX0VWRU5UX1RSQUNJTkcKKyNpbmNsdWRlIDx0cmFjZS9mdHJhY2UuaD4KKyNlbmRpZgorCisjdW5kZWYgVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQKKworLyogT25seSB1bmRlZiB3aGF0IHdlIGRlZmluZWQgaW4gdGhpcyBmaWxlICovCisjaWZkZWYgVU5ERUZfVFJBQ0VfSU5DTFVERV9GSUxFCisjIHVuZGVmIFRSQUNFX0lOQ0xVREVfRklMRQorIyB1bmRlZiBVTkRFRl9UUkFDRV9JTkNMVURFX0ZJTEUKKyNlbmRpZgorCisjaWZkZWYgVU5ERUZfVFJBQ0VfSU5DTFVERV9QQVRICisjIHVuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAorIyB1bmRlZiBVTkRFRl9UUkFDRV9JTkNMVURFX1BBVEgKKyNlbmRpZgorCisvKiBXZSBtYXkgYmUgcHJvY2Vzc2luZyBtb3JlIGZpbGVzICovCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKworI2VuZGlmIC8qIENSRUFURV9UUkFDRV9QT0lOVFMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YjA1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9ibG9jay5oCkBAIC0wLDAgKzEsNDkzIEBACisjaWYgIWRlZmluZWQoX1RSQUNFX0JMT0NLX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9CTE9DS19ICisKKyNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGJsb2NrCisKK1RSQUNFX0VWRU5UKGJsb2NrX3JxX2Fib3J0LAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSksCisKKwlUUF9BUkdTKHEsIHJxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoICBkZXZfdCwJZGV2CQkJKQorCQlfX2ZpZWxkKCAgc2VjdG9yX3QsCXNlY3RvcgkJCSkKKwkJX19maWVsZCggIHVuc2lnbmVkIGludCwJbnJfc2VjdG9yCQkpCisJCV9fZmllbGQoICBpbnQsCQllcnJvcnMJCQkpCisJCV9fYXJyYXkoICBjaGFyLAkJcndicywJNgkJKQorCQlfX2R5bmFtaWNfYXJyYXkoIGNoYXIsCWNtZCwJYmxrX2NtZF9idWZfbGVuKHJxKQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJICAgPSBycS0+cnFfZGlzayA/IGRpc2tfZGV2dChycS0+cnFfZGlzaykgOiAwOworCQlfX2VudHJ5LT5zZWN0b3IgICAgPSBibGtfcGNfcmVxdWVzdChycSkgPyAwIDogYmxrX3JxX3BvcyhycSk7CisJCV9fZW50cnktPm5yX3NlY3RvciA9IGJsa19wY19yZXF1ZXN0KHJxKSA/IDAgOiBibGtfcnFfc2VjdG9ycyhycSk7CisJCV9fZW50cnktPmVycm9ycyAgICA9IHJxLT5lcnJvcnM7CisKKwkJYmxrX2ZpbGxfcndic19ycShfX2VudHJ5LT5yd2JzLCBycSk7CisJCWJsa19kdW1wX2NtZChfX2dldF9zdHIoY21kKSwgcnEpOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICglcykgJWxsdSArICV1IFslZF0iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+cndicywgX19nZXRfc3RyKGNtZCksCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5lcnJvcnMpCispOworCitUUkFDRV9FVkVOVChibG9ja19ycV9pbnNlcnQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKSwKKworCVRQX0FSR1MocSwgcnEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggIGRldl90LAlkZXYJCQkpCisJCV9fZmllbGQoICBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCAgdW5zaWduZWQgaW50LAlucl9zZWN0b3IJCSkKKwkJX19maWVsZCggIHVuc2lnbmVkIGludCwJYnl0ZXMJCQkpCisJCV9fYXJyYXkoICBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCAgY2hhciwgICAgICAgICBjb21tLCAgIFRBU0tfQ09NTV9MRU4gICApCisJCV9fZHluYW1pY19hcnJheSggY2hhciwJY21kLAlibGtfY21kX2J1Zl9sZW4ocnEpCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkgICA9IHJxLT5ycV9kaXNrID8gZGlza19kZXZ0KHJxLT5ycV9kaXNrKSA6IDA7CisJCV9fZW50cnktPnNlY3RvciAgICA9IGJsa19wY19yZXF1ZXN0KHJxKSA/IDAgOiBibGtfcnFfcG9zKHJxKTsKKwkJX19lbnRyeS0+bnJfc2VjdG9yID0gYmxrX3BjX3JlcXVlc3QocnEpID8gMCA6IGJsa19ycV9zZWN0b3JzKHJxKTsKKwkJX19lbnRyeS0+Ynl0ZXMgICAgID0gYmxrX3BjX3JlcXVlc3QocnEpID8gYmxrX3JxX2J5dGVzKHJxKSA6IDA7CisKKwkJYmxrX2ZpbGxfcndic19ycShfX2VudHJ5LT5yd2JzLCBycSk7CisJCWJsa19kdW1wX2NtZChfX2dldF9zdHIoY21kKSwgcnEpOworCQltZW1jcHkoX19lbnRyeS0+Y29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJXUgKCVzKSAlbGx1ICsgJXUgWyVzXSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBfX2VudHJ5LT5yd2JzLCBfX2VudHJ5LT5ieXRlcywgX19nZXRfc3RyKGNtZCksCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5jb21tKQorKTsKKworVFJBQ0VfRVZFTlQoYmxvY2tfcnFfaXNzdWUsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKSwKKworCVRQX0FSR1MocSwgcnEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggIGRldl90LAlkZXYJCQkpCisJCV9fZmllbGQoICBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCAgdW5zaWduZWQgaW50LAlucl9zZWN0b3IJCSkKKwkJX19maWVsZCggIHVuc2lnbmVkIGludCwJYnl0ZXMJCQkpCisJCV9fYXJyYXkoICBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCAgY2hhciwJCWNvbW0sICAgVEFTS19DT01NX0xFTiAgICkKKwkJX19keW5hbWljX2FycmF5KCBjaGFyLAljbWQsCWJsa19jbWRfYnVmX2xlbihycSkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CSAgID0gcnEtPnJxX2Rpc2sgPyBkaXNrX2RldnQocnEtPnJxX2Rpc2spIDogMDsKKwkJX19lbnRyeS0+c2VjdG9yICAgID0gYmxrX3BjX3JlcXVlc3QocnEpID8gMCA6IGJsa19ycV9wb3MocnEpOworCQlfX2VudHJ5LT5ucl9zZWN0b3IgPSBibGtfcGNfcmVxdWVzdChycSkgPyAwIDogYmxrX3JxX3NlY3RvcnMocnEpOworCQlfX2VudHJ5LT5ieXRlcyAgICAgPSBibGtfcGNfcmVxdWVzdChycSkgPyBibGtfcnFfYnl0ZXMocnEpIDogMDsKKworCQlibGtfZmlsbF9yd2JzX3JxKF9fZW50cnktPnJ3YnMsIHJxKTsKKwkJYmxrX2R1bXBfY21kKF9fZ2V0X3N0cihjbWQpLCBycSk7CisJCW1lbWNweShfX2VudHJ5LT5jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAldSAoJXMpICVsbHUgKyAldSBbJXNdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPnJ3YnMsIF9fZW50cnktPmJ5dGVzLCBfX2dldF9zdHIoY21kKSwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsIF9fZW50cnktPmNvbW0pCispOworCitUUkFDRV9FVkVOVChibG9ja19ycV9yZXF1ZXVlLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSksCisKKwlUUF9BUkdTKHEsIHJxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoICBkZXZfdCwJZGV2CQkJKQorCQlfX2ZpZWxkKCAgc2VjdG9yX3QsCXNlY3RvcgkJCSkKKwkJX19maWVsZCggIHVuc2lnbmVkIGludCwJbnJfc2VjdG9yCQkpCisJCV9fZmllbGQoICBpbnQsCQllcnJvcnMJCQkpCisJCV9fYXJyYXkoICBjaGFyLAkJcndicywJNgkJKQorCQlfX2R5bmFtaWNfYXJyYXkoIGNoYXIsCWNtZCwJYmxrX2NtZF9idWZfbGVuKHJxKQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJICAgPSBycS0+cnFfZGlzayA/IGRpc2tfZGV2dChycS0+cnFfZGlzaykgOiAwOworCQlfX2VudHJ5LT5zZWN0b3IgICAgPSBibGtfcGNfcmVxdWVzdChycSkgPyAwIDogYmxrX3JxX3BvcyhycSk7CisJCV9fZW50cnktPm5yX3NlY3RvciA9IGJsa19wY19yZXF1ZXN0KHJxKSA/IDAgOiBibGtfcnFfc2VjdG9ycyhycSk7CisJCV9fZW50cnktPmVycm9ycwkgICA9IHJxLT5lcnJvcnM7CisKKwkJYmxrX2ZpbGxfcndic19ycShfX2VudHJ5LT5yd2JzLCBycSk7CisJCWJsa19kdW1wX2NtZChfX2dldF9zdHIoY21kKSwgcnEpOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICglcykgJWxsdSArICV1IFslZF0iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+cndicywgX19nZXRfc3RyKGNtZCksCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5lcnJvcnMpCispOworCitUUkFDRV9FVkVOVChibG9ja19ycV9jb21wbGV0ZSwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpLAorCisJVFBfQVJHUyhxLCBycSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCAgZGV2X3QsCWRldgkJCSkKKwkJX19maWVsZCggIHNlY3Rvcl90LAlzZWN0b3IJCQkpCisJCV9fZmllbGQoICB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2ZpZWxkKCAgaW50LAkJZXJyb3JzCQkJKQorCQlfX2FycmF5KCAgY2hhciwJCXJ3YnMsCTYJCSkKKwkJX19keW5hbWljX2FycmF5KCBjaGFyLAljbWQsCWJsa19jbWRfYnVmX2xlbihycSkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CSAgID0gcnEtPnJxX2Rpc2sgPyBkaXNrX2RldnQocnEtPnJxX2Rpc2spIDogMDsKKwkJX19lbnRyeS0+c2VjdG9yICAgID0gYmxrX3BjX3JlcXVlc3QocnEpID8gMCA6IGJsa19ycV9wb3MocnEpOworCQlfX2VudHJ5LT5ucl9zZWN0b3IgPSBibGtfcGNfcmVxdWVzdChycSkgPyAwIDogYmxrX3JxX3NlY3RvcnMocnEpOworCQlfX2VudHJ5LT5lcnJvcnMgICAgPSBycS0+ZXJyb3JzOworCisJCWJsa19maWxsX3J3YnNfcnEoX19lbnRyeS0+cndicywgcnEpOworCQlibGtfZHVtcF9jbWQoX19nZXRfc3RyKGNtZCksIHJxKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAoJXMpICVsbHUgKyAldSBbJWRdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPnJ3YnMsIF9fZ2V0X3N0cihjbWQpLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+ZXJyb3JzKQorKTsKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19ib3VuY2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKSwKKworCVRQX0FSR1MocSwgYmlvKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKCBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCBjaGFyLAkJY29tbSwJVEFTS19DT01NX0xFTgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9zaXplKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICVsbHUgKyAldSBbJXNdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yd2JzLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19jb21wbGV0ZSwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAorCisJVFBfQVJHUyhxLCBiaW8pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggZGV2X3QsCQlkZXYJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCXNlY3RvcgkJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCwJbnJfc2VjdG9yCSkKKwkJX19maWVsZCggaW50LAkJZXJyb3IJCSkKKwkJX19hcnJheSggY2hhciwJCXJ3YnMsCTYJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGJpby0+YmlfYmRldi0+YmRfZGV2OworCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9zZWN0b3I7CisJCV9fZW50cnktPm5yX3NlY3Rvcgk9IGJpby0+Ymlfc2l6ZSA+PiA5OworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSArICV1IFslZF0iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksIF9fZW50cnktPnJ3YnMsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5lcnJvcikKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19iYWNrbWVyZ2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKSwKKworCVRQX0FSR1MocSwgYmlvKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKCBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCBjaGFyLAkJY29tbSwJVEFTS19DT01NX0xFTgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9zaXplKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICVsbHUgKyAldSBbJXNdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yd2JzLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19mcm9udG1lcmdlLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyksCisKKwlUUF9BUkdTKHEsIGJpbyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCBkZXZfdCwJCWRldgkJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCXNlY3RvcgkJCSkKKwkJX19maWVsZCggdW5zaWduZWQsCW5yX3NlY3RvcgkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCBjaGFyLAkJY29tbSwJVEFTS19DT01NX0xFTgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9zaXplKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICVsbHUgKyAldSBbJXNdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yd2JzLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19xdWV1ZSwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAorCisJVFBfQVJHUyhxLCBiaW8pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggZGV2X3QsCQlkZXYJCQkpCisJCV9fZmllbGQoIHNlY3Rvcl90LAlzZWN0b3IJCQkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJbnJfc2VjdG9yCQkpCisJCV9fYXJyYXkoIGNoYXIsCQlyd2JzLAk2CQkpCisJCV9fYXJyYXkoIGNoYXIsCQljb21tLAlUQVNLX0NPTU1fTEVOCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkJPSBiaW8tPmJpX2JkZXYtPmJkX2RldjsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOworCQlfX2VudHJ5LT5ucl9zZWN0b3IJPSBiaW8tPmJpX3NpemUgPj4gOTsKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQltZW1jcHkoX19lbnRyeS0+Y29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSArICV1IFslc10iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksIF9fZW50cnktPnJ3YnMsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5jb21tKQorKTsKKworVFJBQ0VfRVZFTlQoYmxvY2tfZ2V0cnEsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLCBpbnQgcncpLAorCisJVFBfQVJHUyhxLCBiaW8sIHJ3KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKCBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCBjaGFyLAkJY29tbSwJVEFTS19DT01NX0xFTgkpCisgICAgICAgICksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGJpbyA/IGJpby0+YmlfYmRldi0+YmRfZGV2IDogMDsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpbyA/IGJpby0+Ymlfc2VjdG9yIDogMDsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvID8gYmlvLT5iaV9zaXplID4+IDkgOiAwOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsCisJCQkgICAgICBiaW8gPyBiaW8tPmJpX3J3IDogMCwgX19lbnRyeS0+bnJfc2VjdG9yKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworICAgICAgICApLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAlbGx1ICsgJXUgWyVzXSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cndicywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsIF9fZW50cnktPmNvbW0pCispOworCitUUkFDRV9FVkVOVChibG9ja19zbGVlcHJxLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgaW50IHJ3KSwKKworCVRQX0FSR1MocSwgYmlvLCBydyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCBkZXZfdCwJCWRldgkJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCXNlY3RvcgkJCSkKKwkJX19maWVsZCggdW5zaWduZWQgaW50LAlucl9zZWN0b3IJCSkKKwkJX19hcnJheSggY2hhciwJCXJ3YnMsCTYJCSkKKwkJX19hcnJheSggY2hhciwJCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGJpbyA/IGJpby0+YmlfYmRldi0+YmRfZGV2IDogMDsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpbyA/IGJpby0+Ymlfc2VjdG9yIDogMDsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvID8gYmlvLT5iaV9zaXplID4+IDkgOiAwOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsCisJCQkgICAgYmlvID8gYmlvLT5iaV9ydyA6IDAsIF9fZW50cnktPm5yX3NlY3Rvcik7CisJCW1lbWNweShfX2VudHJ5LT5jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAlbGx1ICsgJXUgWyVzXSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cndicywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsIF9fZW50cnktPmNvbW0pCispOworCitUUkFDRV9FVkVOVChibG9ja19wbHVnLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpLAorCisJVFBfQVJHUyhxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoIGNoYXIsCQljb21tLAlUQVNLX0NPTU1fTEVOCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCW1lbWNweShfX2VudHJ5LT5jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwkpLAorCisJVFBfcHJpbnRrKCJbJXNdIiwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3VucGx1Z190aW1lciwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSwKKworCVRQX0FSR1MocSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCBpbnQsCQlucl9ycQkJCSkKKwkJX19hcnJheSggY2hhciwJCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+bnJfcnEJPSBxLT5ycS5jb3VudFtSRUFEXSArIHEtPnJxLmNvdW50W1dSSVRFXTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIlslc10gJWQiLCBfX2VudHJ5LT5jb21tLCBfX2VudHJ5LT5ucl9ycSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3VucGx1Z19pbywKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSwKKworCVRQX0FSR1MocSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCBpbnQsCQlucl9ycQkJCSkKKwkJX19hcnJheSggY2hhciwJCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+bnJfcnEJPSBxLT5ycS5jb3VudFtSRUFEXSArIHEtPnJxLmNvdW50W1dSSVRFXTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIlslc10gJWQiLCBfX2VudHJ5LT5jb21tLCBfX2VudHJ5LT5ucl9ycSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3NwbGl0LAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKKwkJIHVuc2lnbmVkIGludCBuZXdfc2VjdG9yKSwKKworCVRQX0FSR1MocSwgYmlvLCBuZXdfc2VjdG9yKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCXNlY3RvcgkJCQkpCisJCV9fZmllbGQoIHNlY3Rvcl90LAluZXdfc2VjdG9yCQkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJCTYJCSkKKwkJX19hcnJheSggY2hhciwJCWNvbW0sCQlUQVNLX0NPTU1fTEVOCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkJPSBiaW8tPmJpX2JkZXYtPmJkX2RldjsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOworCQlfX2VudHJ5LT5uZXdfc2VjdG9yCT0gbmV3X3NlY3RvcjsKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQltZW1jcHkoX19lbnRyeS0+Y29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSAvICVsbHUgWyVzXSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cndicywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPm5ld19zZWN0b3IsCisJCSAgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3JlbWFwLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgZGV2X3QgZGV2LAorCQkgc2VjdG9yX3QgZnJvbSksCisKKwlUUF9BUkdTKHEsIGJpbywgZGV2LCBmcm9tKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkpCisJCV9fZmllbGQoIHNlY3Rvcl90LAlzZWN0b3IJCSkKKwkJX19maWVsZCggdW5zaWduZWQgaW50LAlucl9zZWN0b3IJKQorCQlfX2ZpZWxkKCBkZXZfdCwJCW9sZF9kZXYJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCW9sZF9zZWN0b3IJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCV9fZW50cnktPm9sZF9kZXYJPSBkZXY7CisJCV9fZW50cnktPm9sZF9zZWN0b3IJPSBmcm9tOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSArICV1IDwtICglZCwlZCkgJWxsdSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cndicywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsCisJCSAgTUFKT1IoX19lbnRyeS0+b2xkX2RldiksIE1JTk9SKF9fZW50cnktPm9sZF9kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+b2xkX3NlY3RvcikKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfQkxPQ0tfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGM3ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmgKQEAgLTAsMCArMSwxNDUgQEAKKyNpZiAhZGVmaW5lZChfVFJBQ0VfSVJRX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9JUlFfSAorCisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBpcnEKKworI2RlZmluZSBzb2Z0aXJxX25hbWUoc2lycSkgeyBzaXJxIyNfU09GVElSUSwgI3NpcnEgfQorI2RlZmluZSBzaG93X3NvZnRpcnFfbmFtZSh2YWwpCQkJXAorCV9fcHJpbnRfc3ltYm9saWModmFsLAkJCVwKKwkJCSBzb2Z0aXJxX25hbWUoSEkpLAlcCisJCQkgc29mdGlycV9uYW1lKFRJTUVSKSwJXAorCQkJIHNvZnRpcnFfbmFtZShORVRfVFgpLAlcCisJCQkgc29mdGlycV9uYW1lKE5FVF9SWCksCVwKKwkJCSBzb2Z0aXJxX25hbWUoQkxPQ0spLAlcCisJCQkgc29mdGlycV9uYW1lKFRBU0tMRVQpLAlcCisJCQkgc29mdGlycV9uYW1lKFNDSEVEKSwJXAorCQkJIHNvZnRpcnFfbmFtZShIUlRJTUVSKSwJXAorCQkJIHNvZnRpcnFfbmFtZShSQ1UpKQorCisvKioKKyAqIGlycV9oYW5kbGVyX2VudHJ5IC0gY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgaXJxIGFjdGlvbiBoYW5kbGVyCisgKiBAaXJxOiBpcnEgbnVtYmVyCisgKiBAYWN0aW9uOiBwb2ludGVyIHRvIHN0cnVjdCBpcnFhY3Rpb24KKyAqCisgKiBUaGUgc3RydWN0IGlycWFjdGlvbiBwb2ludGVkIHRvIGJ5IEBhY3Rpb24gY29udGFpbnMgdmFyaW91cworICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhhbmRsZXIsIGluY2x1ZGluZyB0aGUgZGV2aWNlIG5hbWUsCisgKiBAYWN0aW9uLT5uYW1lLCBhbmQgdGhlIGRldmljZSBpZCwgQGFjdGlvbi0+ZGV2X2lkLiBXaGVuIHVzZWQgaW4KKyAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIGlycV9oYW5kbGVyX2V4aXQgdHJhY2Vwb2ludCwgd2UgY2FuIGZpZ3VyZQorICogb3V0IGlycSBoYW5kbGVyIGxhdGVuY2llcy4KKyAqLworVFJBQ0VfRVZFTlQoaXJxX2hhbmRsZXJfZW50cnksCisKKwlUUF9QUk9UTyhpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pLAorCisJVFBfQVJHUyhpcnEsIGFjdGlvbiksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWlycQkJKQorCQlfX3N0cmluZygJbmFtZSwJYWN0aW9uLT5uYW1lCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlycSA9IGlycTsKKwkJX19hc3NpZ25fc3RyKG5hbWUsIGFjdGlvbi0+bmFtZSk7CisJKSwKKworCVRQX3ByaW50aygiaXJxPSVkIGhhbmRsZXI9JXMiLCBfX2VudHJ5LT5pcnEsIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKKy8qKgorICogaXJxX2hhbmRsZXJfZXhpdCAtIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgaXJxIGFjdGlvbiBoYW5kbGVyIHJldHVybnMKKyAqIEBpcnE6IGlycSBudW1iZXIKKyAqIEBhY3Rpb246IHBvaW50ZXIgdG8gc3RydWN0IGlycWFjdGlvbgorICogQHJldDogcmV0dXJuIHZhbHVlCisgKgorICogSWYgdGhlIEByZXQgdmFsdWUgaXMgc2V0IHRvIElSUV9IQU5ETEVELCB0aGVuIHdlIGtub3cgdGhhdCB0aGUgY29ycmVzcG9uZGluZworICogQGFjdGlvbi0+aGFuZGxlciBzY3VjY2Vzc3VsbHkgaGFuZGxlZCB0aGlzIGlycS4gT3RoZXJ3aXNlLCB0aGUgaXJxIG1pZ2h0IGJlCisgKiBhIHNoYXJlZCBpcnEgbGluZSwgb3IgdGhlIGlycSB3YXMgbm90IGhhbmRsZWQgc3VjY2Vzc2Z1bGx5LiBDYW4gYmUgdXNlZCBpbgorICogY29uanVuY3Rpb24gd2l0aCB0aGUgaXJxX2hhbmRsZXJfZW50cnkgdG8gdW5kZXJzdGFuZCBpcnEgaGFuZGxlciBsYXRlbmNpZXMuCisgKi8KK1RSQUNFX0VWRU5UKGlycV9oYW5kbGVyX2V4aXQsCisKKwlUUF9QUk9UTyhpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24sIGludCByZXQpLAorCisJVFBfQVJHUyhpcnEsIGFjdGlvbiwgcmV0KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWludCwJaXJxCSkKKwkJX19maWVsZCgJaW50LAlyZXQJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aXJxCT0gaXJxOworCQlfX2VudHJ5LT5yZXQJPSByZXQ7CisJKSwKKworCVRQX3ByaW50aygiaXJxPSVkIHJldHVybj0lcyIsCisJCSAgX19lbnRyeS0+aXJxLCBfX2VudHJ5LT5yZXQgPyAiaGFuZGxlZCIgOiAidW5oYW5kbGVkIikKKyk7CisKKy8qKgorICogc29mdGlycV9lbnRyeSAtIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHNvZnRpcnEgaGFuZGxlcgorICogQGg6IHBvaW50ZXIgdG8gc3RydWN0IHNvZnRpcnFfYWN0aW9uCisgKiBAdmVjOiBwb2ludGVyIHRvIGZpcnN0IHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiBpbiBzb2Z0aXJxX3ZlYyBhcnJheQorICoKKyAqIFRoZSBAaCBwYXJhbWV0ZXIsIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgc3RydWN0IHNvZnRpcnFfYWN0aW9uCisgKiB3aGljaCBoYXMgYSBwb2ludGVyIHRvIHRoZSBhY3Rpb24gaGFuZGxlciB0aGF0IGlzIGNhbGxlZC4gQnkgc3VidHJhY3RpbmcKKyAqIHRoZSBAdmVjIHBvaW50ZXIgZnJvbSB0aGUgQGggcG9pbnRlciwgd2UgY2FuIGRldGVybWluZSB0aGUgc29mdGlycQorICogbnVtYmVyLiBBbHNvLCB3aGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgc29mdGlycV9leGl0IHRyYWNlcG9pbnQKKyAqIHdlIGNhbiBkZXRlcm1pbmUgdGhlIHNvZnRpcnEgbGF0ZW5jeS4KKyAqLworVFJBQ0VfRVZFTlQoc29mdGlycV9lbnRyeSwKKworCVRQX1BST1RPKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCwgc3RydWN0IHNvZnRpcnFfYWN0aW9uICp2ZWMpLAorCisJVFBfQVJHUyhoLCB2ZWMpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAl2ZWMJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT52ZWMgPSAoaW50KShoIC0gdmVjKTsKKwkpLAorCisJVFBfcHJpbnRrKCJzb2Z0aXJxPSVkIGFjdGlvbj0lcyIsIF9fZW50cnktPnZlYywKKwkJICBzaG93X3NvZnRpcnFfbmFtZShfX2VudHJ5LT52ZWMpKQorKTsKKworLyoqCisgKiBzb2Z0aXJxX2V4aXQgLSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNvZnRpcnEgaGFuZGxlciByZXR1cm5zCisgKiBAaDogcG9pbnRlciB0byBzdHJ1Y3Qgc29mdGlycV9hY3Rpb24KKyAqIEB2ZWM6IHBvaW50ZXIgdG8gZmlyc3Qgc3RydWN0IHNvZnRpcnFfYWN0aW9uIGluIHNvZnRpcnFfdmVjIGFycmF5CisgKgorICogVGhlIEBoIHBhcmFtZXRlciBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBzb2Z0aXJxX2FjdGlvbgorICogdGhhdCBoYXMgaGFuZGxlZCB0aGUgc29mdGlycS4gQnkgc3VidHJhY3RpbmcgdGhlIEB2ZWMgcG9pbnRlciBmcm9tCisgKiB0aGUgQGggcG9pbnRlciwgd2UgY2FuIGRldGVybWluZSB0aGUgc29mdGlycSBudW1iZXIuIEFsc28sIHdoZW4gdXNlZCBpbgorICogY29tYmluYXRpb24gd2l0aCB0aGUgc29mdGlycV9lbnRyeSB0cmFjZXBvaW50IHdlIGNhbiBkZXRlcm1pbmUgdGhlIHNvZnRpcnEKKyAqIGxhdGVuY3kuCisgKi8KK1RSQUNFX0VWRU5UKHNvZnRpcnFfZXhpdCwKKworCVRQX1BST1RPKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCwgc3RydWN0IHNvZnRpcnFfYWN0aW9uICp2ZWMpLAorCisJVFBfQVJHUyhoLCB2ZWMpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAl2ZWMJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT52ZWMgPSAoaW50KShoIC0gdmVjKTsKKwkpLAorCisJVFBfcHJpbnRrKCJzb2Z0aXJxPSVkIGFjdGlvbj0lcyIsIF9fZW50cnktPnZlYywKKwkJICBzaG93X3NvZnRpcnFfbmFtZShfX2VudHJ5LT52ZWMpKQorKTsKKworI2VuZGlmIC8qICBfVFJBQ0VfSVJRX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9rbWVtLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9rbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhYmE1MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ttZW0uaApAQCAtMCwwICsxLDIzMSBAQAorI2lmICFkZWZpbmVkKF9UUkFDRV9LTUVNX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9LTUVNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBrbWVtCisKKy8qCisgKiBUaGUgb3JkZXIgb2YgdGhlc2UgbWFza3MgaXMgaW1wb3J0YW50LiBNYXRjaGluZyBtYXNrcyB3aWxsIGJlIHNlZW4KKyAqIGZpcnN0IGFuZCB0aGUgbGVmdCBvdmVyIGZsYWdzIHdpbGwgZW5kIHVwIHNob3dpbmcgYnkgdGhlbXNlbHZlcy4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZSBHRlBfS0VSTkVMIGJlZm9yZSBHRlBfVVNFUiB3ZSB3aWwgZ2V0OgorICoKKyAqICBHRlBfS0VSTkVMfEdGUF9IQVJEV0FMTAorICoKKyAqIFRodXMgbW9zdCBiaXRzIHNldCBnbyBmaXJzdC4KKyAqLworI2RlZmluZSBzaG93X2dmcF9mbGFncyhmbGFncykJCQkJCQlcCisJKGZsYWdzKSA/IF9fcHJpbnRfZmxhZ3MoZmxhZ3MsICJ8IiwJCQkJXAorCXsodW5zaWduZWQgbG9uZylHRlBfSElHSFVTRVJfTU9WQUJMRSwJIkdGUF9ISUdIVVNFUl9NT1ZBQkxFIn0sIFwKKwl7KHVuc2lnbmVkIGxvbmcpR0ZQX0hJR0hVU0VSLAkJIkdGUF9ISUdIVVNFUiJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKUdGUF9VU0VSLAkJIkdGUF9VU0VSIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKUdGUF9URU1QT1JBUlksCQkiR0ZQX1RFTVBPUkFSWSJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKUdGUF9LRVJORUwsCQkiR0ZQX0tFUk5FTCJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylHRlBfTk9GUywJCSJHRlBfTk9GUyJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylHRlBfQVRPTUlDLAkJIkdGUF9BVE9NSUMifSwJCVwKKwl7KHVuc2lnbmVkIGxvbmcpR0ZQX05PSU8sCQkiR0ZQX05PSU8ifSwJCVwKKwl7KHVuc2lnbmVkIGxvbmcpX19HRlBfSElHSCwJCSJHRlBfSElHSCJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylfX0dGUF9XQUlULAkJIkdGUF9XQUlUIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX0lPLAkJIkdGUF9JTyJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylfX0dGUF9DT0xELAkJIkdGUF9DT0xEIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX05PV0FSTiwJCSJHRlBfTk9XQVJOIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX1JFUEVBVCwJCSJHRlBfUkVQRUFUIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX05PRkFJTCwJCSJHRlBfTk9GQUlMIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX05PUkVUUlksCQkiR0ZQX05PUkVUUlkifSwJCVwKKwl7KHVuc2lnbmVkIGxvbmcpX19HRlBfQ09NUCwJCSJHRlBfQ09NUCJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylfX0dGUF9aRVJPLAkJIkdGUF9aRVJPIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX05PTUVNQUxMT0MsCSJHRlBfTk9NRU1BTExPQyJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX0hBUkRXQUxMLAkJIkdGUF9IQVJEV0FMTCJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX1RISVNOT0RFLAkJIkdGUF9USElTTk9ERSJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX1JFQ0xBSU1BQkxFLAkiR0ZQX1JFQ0xBSU1BQkxFIn0sCVwKKwl7KHVuc2lnbmVkIGxvbmcpX19HRlBfTU9WQUJMRSwJCSJHRlBfTU9WQUJMRSJ9CQlcCisJKSA6ICJHRlBfTk9XQUlUIgorCitUUkFDRV9FVkVOVChrbWFsbG9jLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCisJCSBjb25zdCB2b2lkICpwdHIsCisJCSBzaXplX3QgYnl0ZXNfcmVxLAorCQkgc2l6ZV90IGJ5dGVzX2FsbG9jLAorCQkgZ2ZwX3QgZ2ZwX2ZsYWdzKSwKKworCVRQX0FSR1MoY2FsbF9zaXRlLCBwdHIsIGJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAljYWxsX3NpdGUJKQorCQlfX2ZpZWxkKAljb25zdCB2b2lkICosCXB0cgkJKQorCQlfX2ZpZWxkKAlzaXplX3QsCQlieXRlc19yZXEJKQorCQlfX2ZpZWxkKAlzaXplX3QsCQlieXRlc19hbGxvYwkpCisJCV9fZmllbGQoCWdmcF90LAkJZ2ZwX2ZsYWdzCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNhbGxfc2l0ZQk9IGNhbGxfc2l0ZTsKKwkJX19lbnRyeS0+cHRyCQk9IHB0cjsKKwkJX19lbnRyeS0+Ynl0ZXNfcmVxCT0gYnl0ZXNfcmVxOworCQlfX2VudHJ5LT5ieXRlc19hbGxvYwk9IGJ5dGVzX2FsbG9jOworCQlfX2VudHJ5LT5nZnBfZmxhZ3MJPSBnZnBfZmxhZ3M7CisJKSwKKworCVRQX3ByaW50aygiY2FsbF9zaXRlPSVseCBwdHI9JXAgYnl0ZXNfcmVxPSV6dSBieXRlc19hbGxvYz0lenUgZ2ZwX2ZsYWdzPSVzIiwKKwkJX19lbnRyeS0+Y2FsbF9zaXRlLAorCQlfX2VudHJ5LT5wdHIsCisJCV9fZW50cnktPmJ5dGVzX3JlcSwKKwkJX19lbnRyeS0+Ynl0ZXNfYWxsb2MsCisJCXNob3dfZ2ZwX2ZsYWdzKF9fZW50cnktPmdmcF9mbGFncykpCispOworCitUUkFDRV9FVkVOVChrbWVtX2NhY2hlX2FsbG9jLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCisJCSBjb25zdCB2b2lkICpwdHIsCisJCSBzaXplX3QgYnl0ZXNfcmVxLAorCQkgc2l6ZV90IGJ5dGVzX2FsbG9jLAorCQkgZ2ZwX3QgZ2ZwX2ZsYWdzKSwKKworCVRQX0FSR1MoY2FsbF9zaXRlLCBwdHIsIGJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAljYWxsX3NpdGUJKQorCQlfX2ZpZWxkKAljb25zdCB2b2lkICosCXB0cgkJKQorCQlfX2ZpZWxkKAlzaXplX3QsCQlieXRlc19yZXEJKQorCQlfX2ZpZWxkKAlzaXplX3QsCQlieXRlc19hbGxvYwkpCisJCV9fZmllbGQoCWdmcF90LAkJZ2ZwX2ZsYWdzCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNhbGxfc2l0ZQk9IGNhbGxfc2l0ZTsKKwkJX19lbnRyeS0+cHRyCQk9IHB0cjsKKwkJX19lbnRyeS0+Ynl0ZXNfcmVxCT0gYnl0ZXNfcmVxOworCQlfX2VudHJ5LT5ieXRlc19hbGxvYwk9IGJ5dGVzX2FsbG9jOworCQlfX2VudHJ5LT5nZnBfZmxhZ3MJPSBnZnBfZmxhZ3M7CisJKSwKKworCVRQX3ByaW50aygiY2FsbF9zaXRlPSVseCBwdHI9JXAgYnl0ZXNfcmVxPSV6dSBieXRlc19hbGxvYz0lenUgZ2ZwX2ZsYWdzPSVzIiwKKwkJX19lbnRyeS0+Y2FsbF9zaXRlLAorCQlfX2VudHJ5LT5wdHIsCisJCV9fZW50cnktPmJ5dGVzX3JlcSwKKwkJX19lbnRyeS0+Ynl0ZXNfYWxsb2MsCisJCXNob3dfZ2ZwX2ZsYWdzKF9fZW50cnktPmdmcF9mbGFncykpCispOworCitUUkFDRV9FVkVOVChrbWFsbG9jX25vZGUsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwKKwkJIGNvbnN0IHZvaWQgKnB0ciwKKwkJIHNpemVfdCBieXRlc19yZXEsCisJCSBzaXplX3QgYnl0ZXNfYWxsb2MsCisJCSBnZnBfdCBnZnBfZmxhZ3MsCisJCSBpbnQgbm9kZSksCisKKwlUUF9BUkdTKGNhbGxfc2l0ZSwgcHRyLCBieXRlc19yZXEsIGJ5dGVzX2FsbG9jLCBnZnBfZmxhZ3MsIG5vZGUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJY2FsbF9zaXRlCSkKKwkJX19maWVsZCgJY29uc3Qgdm9pZCAqLAlwdHIJCSkKKwkJX19maWVsZCgJc2l6ZV90LAkJYnl0ZXNfcmVxCSkKKwkJX19maWVsZCgJc2l6ZV90LAkJYnl0ZXNfYWxsb2MJKQorCQlfX2ZpZWxkKAlnZnBfdCwJCWdmcF9mbGFncwkpCisJCV9fZmllbGQoCWludCwJCW5vZGUJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNhbGxfc2l0ZQk9IGNhbGxfc2l0ZTsKKwkJX19lbnRyeS0+cHRyCQk9IHB0cjsKKwkJX19lbnRyeS0+Ynl0ZXNfcmVxCT0gYnl0ZXNfcmVxOworCQlfX2VudHJ5LT5ieXRlc19hbGxvYwk9IGJ5dGVzX2FsbG9jOworCQlfX2VudHJ5LT5nZnBfZmxhZ3MJPSBnZnBfZmxhZ3M7CisJCV9fZW50cnktPm5vZGUJCT0gbm9kZTsKKwkpLAorCisJVFBfcHJpbnRrKCJjYWxsX3NpdGU9JWx4IHB0cj0lcCBieXRlc19yZXE9JXp1IGJ5dGVzX2FsbG9jPSV6dSBnZnBfZmxhZ3M9JXMgbm9kZT0lZCIsCisJCV9fZW50cnktPmNhbGxfc2l0ZSwKKwkJX19lbnRyeS0+cHRyLAorCQlfX2VudHJ5LT5ieXRlc19yZXEsCisJCV9fZW50cnktPmJ5dGVzX2FsbG9jLAorCQlzaG93X2dmcF9mbGFncyhfX2VudHJ5LT5nZnBfZmxhZ3MpLAorCQlfX2VudHJ5LT5ub2RlKQorKTsKKworVFJBQ0VfRVZFTlQoa21lbV9jYWNoZV9hbGxvY19ub2RlLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCisJCSBjb25zdCB2b2lkICpwdHIsCisJCSBzaXplX3QgYnl0ZXNfcmVxLAorCQkgc2l6ZV90IGJ5dGVzX2FsbG9jLAorCQkgZ2ZwX3QgZ2ZwX2ZsYWdzLAorCQkgaW50IG5vZGUpLAorCisJVFBfQVJHUyhjYWxsX3NpdGUsIHB0ciwgYnl0ZXNfcmVxLCBieXRlc19hbGxvYywgZ2ZwX2ZsYWdzLCBub2RlKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVuc2lnbmVkIGxvbmcsCWNhbGxfc2l0ZQkpCisJCV9fZmllbGQoCWNvbnN0IHZvaWQgKiwJcHRyCQkpCisJCV9fZmllbGQoCXNpemVfdCwJCWJ5dGVzX3JlcQkpCisJCV9fZmllbGQoCXNpemVfdCwJCWJ5dGVzX2FsbG9jCSkKKwkJX19maWVsZCgJZ2ZwX3QsCQlnZnBfZmxhZ3MJKQorCQlfX2ZpZWxkKAlpbnQsCQlub2RlCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jYWxsX3NpdGUJPSBjYWxsX3NpdGU7CisJCV9fZW50cnktPnB0cgkJPSBwdHI7CisJCV9fZW50cnktPmJ5dGVzX3JlcQk9IGJ5dGVzX3JlcTsKKwkJX19lbnRyeS0+Ynl0ZXNfYWxsb2MJPSBieXRlc19hbGxvYzsKKwkJX19lbnRyeS0+Z2ZwX2ZsYWdzCT0gZ2ZwX2ZsYWdzOworCQlfX2VudHJ5LT5ub2RlCQk9IG5vZGU7CisJKSwKKworCVRQX3ByaW50aygiY2FsbF9zaXRlPSVseCBwdHI9JXAgYnl0ZXNfcmVxPSV6dSBieXRlc19hbGxvYz0lenUgZ2ZwX2ZsYWdzPSVzIG5vZGU9JWQiLAorCQlfX2VudHJ5LT5jYWxsX3NpdGUsCisJCV9fZW50cnktPnB0ciwKKwkJX19lbnRyeS0+Ynl0ZXNfcmVxLAorCQlfX2VudHJ5LT5ieXRlc19hbGxvYywKKwkJc2hvd19nZnBfZmxhZ3MoX19lbnRyeS0+Z2ZwX2ZsYWdzKSwKKwkJX19lbnRyeS0+bm9kZSkKKyk7CisKK1RSQUNFX0VWRU5UKGtmcmVlLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsIGNvbnN0IHZvaWQgKnB0ciksCisKKwlUUF9BUkdTKGNhbGxfc2l0ZSwgcHRyKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVuc2lnbmVkIGxvbmcsCWNhbGxfc2l0ZQkpCisJCV9fZmllbGQoCWNvbnN0IHZvaWQgKiwJcHRyCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jYWxsX3NpdGUJPSBjYWxsX3NpdGU7CisJCV9fZW50cnktPnB0cgkJPSBwdHI7CisJKSwKKworCVRQX3ByaW50aygiY2FsbF9zaXRlPSVseCBwdHI9JXAiLCBfX2VudHJ5LT5jYWxsX3NpdGUsIF9fZW50cnktPnB0cikKKyk7CisKK1RSQUNFX0VWRU5UKGttZW1fY2FjaGVfZnJlZSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLCBjb25zdCB2b2lkICpwdHIpLAorCisJVFBfQVJHUyhjYWxsX3NpdGUsIHB0ciksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAljYWxsX3NpdGUJKQorCQlfX2ZpZWxkKAljb25zdCB2b2lkICosCXB0cgkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+Y2FsbF9zaXRlCT0gY2FsbF9zaXRlOworCQlfX2VudHJ5LT5wdHIJCT0gcHRyOworCSksCisKKwlUUF9wcmludGsoImNhbGxfc2l0ZT0lbHggcHRyPSVwIiwgX19lbnRyeS0+Y2FsbF9zaXRlLCBfX2VudHJ5LT5wdHIpCispOworI2VuZGlmIC8qIF9UUkFDRV9LTUVNX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9sb2NrZGVwLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9sb2NrZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5NTZjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2xvY2tkZXAuaApAQCAtMCwwICsxLDk2IEBACisjaWYgIWRlZmluZWQoX1RSQUNFX0xPQ0tERVBfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0xPQ0tERVBfSAorCisjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gbG9ja2RlcAorCisjaWZkZWYgQ09ORklHX0xPQ0tERVAKKworVFJBQ0VfRVZFTlQobG9ja19hY3F1aXJlLAorCisJVFBfUFJPVE8oc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBpbnQgc3ViY2xhc3MsCisJCWludCB0cnlsb2NrLCBpbnQgcmVhZCwgaW50IGNoZWNrLAorCQlzdHJ1Y3QgbG9ja2RlcF9tYXAgKm5leHRfbG9jaywgdW5zaWduZWQgbG9uZyBpcCksCisKKwlUUF9BUkdTKGxvY2ssIHN1YmNsYXNzLCB0cnlsb2NrLCByZWFkLCBjaGVjaywgbmV4dF9sb2NrLCBpcCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwgZmxhZ3MpCisJCV9fc3RyaW5nKG5hbWUsIGxvY2stPm5hbWUpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5mbGFncyA9ICh0cnlsb2NrID8gMSA6IDApIHwgKHJlYWQgPyAyIDogMCk7CisJCV9fYXNzaWduX3N0cihuYW1lLCBsb2NrLT5uYW1lKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyVzJXMiLCAoX19lbnRyeS0+ZmxhZ3MgJiAxKSA/ICJ0cnkgIiA6ICIiLAorCQkgIChfX2VudHJ5LT5mbGFncyAmIDIpID8gInJlYWQgIiA6ICIiLAorCQkgIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKK1RSQUNFX0VWRU5UKGxvY2tfcmVsZWFzZSwKKworCVRQX1BST1RPKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgaW50IG5lc3RlZCwgdW5zaWduZWQgbG9uZyBpcCksCisKKwlUUF9BUkdTKGxvY2ssIG5lc3RlZCwgaXApLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcobmFtZSwgbG9jay0+bmFtZSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCBsb2NrLT5uYW1lKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKKyNpZmRlZiBDT05GSUdfTE9DS19TVEFUCisKK1RSQUNFX0VWRU5UKGxvY2tfY29udGVuZGVkLAorCisJVFBfUFJPVE8oc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwKSwKKworCVRQX0FSR1MobG9jaywgaXApLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcobmFtZSwgbG9jay0+bmFtZSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCBsb2NrLT5uYW1lKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKK1RSQUNFX0VWRU5UKGxvY2tfYWNxdWlyZWQsCisJVFBfUFJPVE8oc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwLCBzNjQgd2FpdHRpbWUpLAorCisJVFBfQVJHUyhsb2NrLCBpcCwgd2FpdHRpbWUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcobmFtZSwgbG9jay0+bmFtZSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCB3YWl0X3VzZWMpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywgd2FpdF9uc2VjX3JlbSkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgbG9jay0+bmFtZSk7CisJCV9fZW50cnktPndhaXRfbnNlY19yZW0gPSBkb19kaXYod2FpdHRpbWUsIE5TRUNfUEVSX1VTRUMpOworCQlfX2VudHJ5LT53YWl0X3VzZWMgPSAodW5zaWduZWQgbG9uZykgd2FpdHRpbWU7CisJKSwKKwlUUF9wcmludGsoIiVzICglbHUuJTAzbHUgdXMpIiwgX19nZXRfc3RyKG5hbWUpLCBfX2VudHJ5LT53YWl0X3VzZWMsCisJCQkJICAgICAgIF9fZW50cnktPndhaXRfbnNlY19yZW0pCispOworCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1RSQUNFX0xPQ0tERVBfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2Uvc2NoZWRfZXZlbnRfdHlwZXMuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3NjaGVkLmgKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gaW5jbHVkZS90cmFjZS9zY2hlZF9ldmVudF90eXBlcy5oCnJlbmFtZSB0byBpbmNsdWRlL3RyYWNlL2V2ZW50cy9zY2hlZC5oCmluZGV4IDYzNTQ3ZGMuLjI0YWI1YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2Uvc2NoZWRfZXZlbnRfdHlwZXMuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9zY2hlZC5oCkBAIC0xLDkgKzEsOCBAQAorI2lmICFkZWZpbmVkKF9UUkFDRV9TQ0hFRF9IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfVFJBQ0VfU0NIRURfSAogCi0vKiB1c2UgPHRyYWNlL3NjaGVkLmg+IGluc3RlYWQgKi8KLSNpZm5kZWYgVFJBQ0VfRVZFTlQKLSMgZXJyb3IgRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LgotIyBlcnJvciBVbmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CiAKICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIHNjaGVkCkBAIC0xNTcsNiArMTU2LDcgQEAKIAkJX19hcnJheSgJY2hhciwJcHJldl9jb21tLAlUQVNLX0NPTU1fTEVOCSkKIAkJX19maWVsZCgJcGlkX3QsCXByZXZfcGlkCQkJKQogCQlfX2ZpZWxkKAlpbnQsCXByZXZfcHJpbwkJCSkKKwkJX19maWVsZCgJbG9uZywJcHJldl9zdGF0ZQkJCSkKIAkJX19hcnJheSgJY2hhciwJbmV4dF9jb21tLAlUQVNLX0NPTU1fTEVOCSkKIAkJX19maWVsZCgJcGlkX3QsCW5leHRfcGlkCQkJKQogCQlfX2ZpZWxkKAlpbnQsCW5leHRfcHJpbwkJCSkKQEAgLTE2NiwxMyArMTY2LDE5IEBACiAJCW1lbWNweShfX2VudHJ5LT5uZXh0X2NvbW0sIG5leHQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogCQlfX2VudHJ5LT5wcmV2X3BpZAk9IHByZXYtPnBpZDsKIAkJX19lbnRyeS0+cHJldl9wcmlvCT0gcHJldi0+cHJpbzsKKwkJX19lbnRyeS0+cHJldl9zdGF0ZQk9IHByZXYtPnN0YXRlOwogCQltZW1jcHkoX19lbnRyeS0+cHJldl9jb21tLCBwcmV2LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKIAkJX19lbnRyeS0+bmV4dF9waWQJPSBuZXh0LT5waWQ7CiAJCV9fZW50cnktPm5leHRfcHJpbwk9IG5leHQtPnByaW87CiAJKSwKIAotCVRQX3ByaW50aygidGFzayAlczolZCBbJWRdID09PiAlczolZCBbJWRdIiwKKwlUUF9wcmludGsoInRhc2sgJXM6JWQgWyVkXSAoJXMpID09PiAlczolZCBbJWRdIiwKIAkJX19lbnRyeS0+cHJldl9jb21tLCBfX2VudHJ5LT5wcmV2X3BpZCwgX19lbnRyeS0+cHJldl9wcmlvLAorCQlfX2VudHJ5LT5wcmV2X3N0YXRlID8KKwkJICBfX3ByaW50X2ZsYWdzKF9fZW50cnktPnByZXZfc3RhdGUsICJ8IiwKKwkJCQl7IDEsICJTIn0gLCB7IDIsICJEIiB9LCB7IDQsICJUIiB9LCB7IDgsICJ0IiB9LAorCQkJCXsgMTYsICJaIiB9LCB7IDMyLCAiWCIgfSwgeyA2NCwgIngiIH0sCisJCQkJeyAxMjgsICJXIiB9KSA6ICJSIiwKIAkJX19lbnRyeS0+bmV4dF9jb21tLCBfX2VudHJ5LT5uZXh0X3BpZCwgX19lbnRyeS0+bmV4dF9wcmlvKQogKTsKIApAQCAtMTgxLDkgKzE4Nyw5IEBACiAgKi8KIFRSQUNFX0VWRU5UKHNjaGVkX21pZ3JhdGVfdGFzaywKIAotCVRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IG9yaWdfY3B1LCBpbnQgZGVzdF9jcHUpLAorCVRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGRlc3RfY3B1KSwKIAotCVRQX0FSR1MocCwgb3JpZ19jcHUsIGRlc3RfY3B1KSwKKwlUUF9BUkdTKHAsIGRlc3RfY3B1KSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fYXJyYXkoCWNoYXIsCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQpAQCAtMTk3LDcgKzIwMyw3IEBACiAJCW1lbWNweShfX2VudHJ5LT5jb21tLCBwLT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKIAkJX19lbnRyeS0+cGlkCQk9IHAtPnBpZDsKIAkJX19lbnRyeS0+cHJpbwkJPSBwLT5wcmlvOwotCQlfX2VudHJ5LT5vcmlnX2NwdQk9IG9yaWdfY3B1OworCQlfX2VudHJ5LT5vcmlnX2NwdQk9IHRhc2tfY3B1KHApOwogCQlfX2VudHJ5LT5kZXN0X2NwdQk9IGRlc3RfY3B1OwogCSksCiAKQEAgLTMzNCw0ICszNDAsNyBAQAogCQkgIF9fZW50cnktPnNpZywgX19lbnRyeS0+Y29tbSwgX19lbnRyeS0+cGlkKQogKTsKIAotI3VuZGVmIFRSQUNFX1NZU1RFTQorI2VuZGlmIC8qIF9UUkFDRV9TQ0hFRF9IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvc2tiLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9za2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZThmYWJiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc2tiLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmICFkZWZpbmVkKF9UUkFDRV9TS0JfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1NLQl9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIHNrYgorCisvKgorICogVHJhY2Vwb2ludCBmb3IgZnJlZSBhbiBza19idWZmOgorICovCitUUkFDRV9FVkVOVChrZnJlZV9za2IsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpsb2NhdGlvbiksCisKKwlUUF9BUkdTKHNrYiwgbG9jYXRpb24pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdm9pZCAqLAkJc2tiYWRkcgkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBzaG9ydCwJcHJvdG9jb2wJKQorCQlfX2ZpZWxkKAl2b2lkICosCQlsb2NhdGlvbgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5za2JhZGRyID0gc2tiOworCQlpZiAoc2tiKSB7CisJCQlfX2VudHJ5LT5wcm90b2NvbCA9IG50b2hzKHNrYi0+cHJvdG9jb2wpOworCQl9CisJCV9fZW50cnktPmxvY2F0aW9uID0gbG9jYXRpb247CisJKSwKKworCVRQX3ByaW50aygic2tiYWRkcj0lcCBwcm90b2NvbD0ldSBsb2NhdGlvbj0lcCIsCisJCV9fZW50cnktPnNrYmFkZHIsIF9fZW50cnktPnByb3RvY29sLCBfX2VudHJ5LT5sb2NhdGlvbikKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfU0tCX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy93b3JrcXVldWUuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dvcmtxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWYxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy93b3JrcXVldWUuaApAQCAtMCwwICsxLDEwMCBAQAorI2lmICFkZWZpbmVkKF9UUkFDRV9XT1JLUVVFVUVfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1dPUktRVUVVRV9ICisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gd29ya3F1ZXVlCisKK1RSQUNFX0VWRU5UKHdvcmtxdWV1ZV9pbnNlcnRpb24sCisKKwlUUF9QUk9UTyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKndxX3RocmVhZCwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSwKKworCVRQX0FSR1Mod3FfdGhyZWFkLCB3b3JrKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoY2hhciwJCXRocmVhZF9jb21tLAlUQVNLX0NPTU1fTEVOKQorCQlfX2ZpZWxkKHBpZF90LAkJdGhyZWFkX3BpZCkKKwkJX19maWVsZCh3b3JrX2Z1bmNfdCwJZnVuYykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCW1lbWNweShfX2VudHJ5LT50aHJlYWRfY29tbSwgd3FfdGhyZWFkLT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwkJX19lbnRyeS0+dGhyZWFkX3BpZAk9IHdxX3RocmVhZC0+cGlkOworCQlfX2VudHJ5LT5mdW5jCQk9IHdvcmstPmZ1bmM7CisJKSwKKworCVRQX3ByaW50aygidGhyZWFkPSVzOiVkIGZ1bmM9JXBGIiwgX19lbnRyeS0+dGhyZWFkX2NvbW0sCisJCV9fZW50cnktPnRocmVhZF9waWQsIF9fZW50cnktPmZ1bmMpCispOworCitUUkFDRV9FVkVOVCh3b3JrcXVldWVfZXhlY3V0aW9uLAorCisJVFBfUFJPVE8oc3RydWN0IHRhc2tfc3RydWN0ICp3cV90aHJlYWQsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayksCisKKwlUUF9BUkdTKHdxX3RocmVhZCwgd29yayksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2FycmF5KGNoYXIsCQl0aHJlYWRfY29tbSwJVEFTS19DT01NX0xFTikKKwkJX19maWVsZChwaWRfdCwJCXRocmVhZF9waWQpCisJCV9fZmllbGQod29ya19mdW5jX3QsCWZ1bmMpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQltZW1jcHkoX19lbnRyeS0+dGhyZWFkX2NvbW0sIHdxX3RocmVhZC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJCV9fZW50cnktPnRocmVhZF9waWQJPSB3cV90aHJlYWQtPnBpZDsKKwkJX19lbnRyeS0+ZnVuYwkJPSB3b3JrLT5mdW5jOworCSksCisKKwlUUF9wcmludGsoInRocmVhZD0lczolZCBmdW5jPSVwRiIsIF9fZW50cnktPnRocmVhZF9jb21tLAorCQlfX2VudHJ5LT50aHJlYWRfcGlkLCBfX2VudHJ5LT5mdW5jKQorKTsKKworLyogVHJhY2UgdGhlIGNyZWF0aW9uIG9mIG9uZSB3b3JrcXVldWUgdGhyZWFkIG9uIGEgY3B1ICovCitUUkFDRV9FVkVOVCh3b3JrcXVldWVfY3JlYXRpb24sCisKKwlUUF9QUk9UTyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKndxX3RocmVhZCwgaW50IGNwdSksCisKKwlUUF9BUkdTKHdxX3RocmVhZCwgY3B1KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoY2hhciwJdGhyZWFkX2NvbW0sCVRBU0tfQ09NTV9MRU4pCisJCV9fZmllbGQocGlkX3QsCXRocmVhZF9waWQpCisJCV9fZmllbGQoaW50LAljcHUpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQltZW1jcHkoX19lbnRyeS0+dGhyZWFkX2NvbW0sIHdxX3RocmVhZC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJCV9fZW50cnktPnRocmVhZF9waWQJPSB3cV90aHJlYWQtPnBpZDsKKwkJX19lbnRyeS0+Y3B1CQk9IGNwdTsKKwkpLAorCisJVFBfcHJpbnRrKCJ0aHJlYWQ9JXM6JWQgY3B1PSVkIiwgX19lbnRyeS0+dGhyZWFkX2NvbW0sCisJCV9fZW50cnktPnRocmVhZF9waWQsIF9fZW50cnktPmNwdSkKKyk7CisKK1RSQUNFX0VWRU5UKHdvcmtxdWV1ZV9kZXN0cnVjdGlvbiwKKworCVRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqd3FfdGhyZWFkKSwKKworCVRQX0FSR1Mod3FfdGhyZWFkKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoY2hhciwJdGhyZWFkX2NvbW0sCVRBU0tfQ09NTV9MRU4pCisJCV9fZmllbGQocGlkX3QsCXRocmVhZF9waWQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQltZW1jcHkoX19lbnRyeS0+dGhyZWFkX2NvbW0sIHdxX3RocmVhZC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJCV9fZW50cnktPnRocmVhZF9waWQJPSB3cV90aHJlYWQtPnBpZDsKKwkpLAorCisJVFBfcHJpbnRrKCJ0aHJlYWQ9JXM6JWQiLCBfX2VudHJ5LT50aHJlYWRfY29tbSwgX19lbnRyeS0+dGhyZWFkX3BpZCkKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfV09SS1FVRVVFX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2Z0cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9mdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY3NTUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9mdHJhY2UuaApAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAqIFN0YWdlIDEgb2YgdGhlIHRyYWNlIGV2ZW50cy4KKyAqCisgKiBPdmVycmlkZSB0aGUgbWFjcm9zIGluIDx0cmFjZS90cmFjZV9ldmVudHMuaD4gdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nOgorICoKKyAqIHN0cnVjdCBmdHJhY2VfcmF3XzxjYWxsPiB7CisgKglzdHJ1Y3QgdHJhY2VfZW50cnkJCWVudDsKKyAqCTx0eXBlPgkJCQk8aXRlbT47CisgKgk8dHlwZTI+CQkJCTxpdGVtMj5bPGxlbj5dOworICoJWy4uLl0KKyAqIH07CisgKgorICogVGhlIDx0eXBlPiA8aXRlbT4gaXMgY3JlYXRlZCBieSB0aGUgX19maWVsZCh0eXBlLCBpdGVtKSBtYWNybyBvcgorICogdGhlIF9fYXJyYXkodHlwZTIsIGl0ZW0yLCBsZW4pIG1hY3JvLgorICogV2Ugc2ltcGx5IGRvICJ0eXBlIGl0ZW07IiwgYW5kIHRoYXQgd2lsbCBjcmVhdGUgdGhlIGZpZWxkcworICogaW4gdGhlIHN0cnVjdHVyZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CisKKyN1bmRlZiBfX2ZpZWxkCisjZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkJCXR5cGUJaXRlbTsKKworI3VuZGVmIF9fYXJyYXkKKyNkZWZpbmUgX19hcnJheSh0eXBlLCBpdGVtLCBsZW4pCXR5cGUJaXRlbVtsZW5dOworCisjdW5kZWYgX19keW5hbWljX2FycmF5CisjZGVmaW5lIF9fZHluYW1pY19hcnJheSh0eXBlLCBpdGVtLCBsZW4pIHVuc2lnbmVkIHNob3J0IF9fZGF0YV9sb2NfIyNpdGVtOworCisjdW5kZWYgX19zdHJpbmcKKyNkZWZpbmUgX19zdHJpbmcoaXRlbSwgc3JjKSBfX2R5bmFtaWNfYXJyYXkoY2hhciwgaXRlbSwgLTEpCisKKyN1bmRlZiBUUF9TVFJVQ1RfX2VudHJ5CisjZGVmaW5lIFRQX1NUUlVDVF9fZW50cnkoYXJncy4uLikgYXJncworCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQobmFtZSwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCVwKKwlzdHJ1Y3QgZnRyYWNlX3Jhd18jI25hbWUgewkJCQlcCisJCXN0cnVjdCB0cmFjZV9lbnRyeQllbnQ7CQkJXAorCQl0c3RydWN0CQkJCQkJXAorCQljaGFyCQkJX19kYXRhWzBdOwkJXAorCX07CQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIGV2ZW50XyMjbmFtZQorCisjaW5jbHVkZSBUUkFDRV9JTkNMVURFKFRSQUNFX0lOQ0xVREVfRklMRSkKKworCisvKgorICogU3RhZ2UgMiBvZiB0aGUgdHJhY2UgZXZlbnRzLgorICoKKyAqIEluY2x1ZGUgdGhlIGZvbGxvd2luZzoKKyAqCisgKiBzdHJ1Y3QgZnRyYWNlX2RhdGFfb2Zmc2V0c188Y2FsbD4geworICoJaW50CQkJCTxpdGVtMT47CisgKglpbnQJCQkJPGl0ZW0yPjsKKyAqCVsuLi5dCisgKiB9OworICoKKyAqIFRoZSBfX2R5bmFtaWNfYXJyYXkoKSBtYWNybyB3aWxsIGNyZWF0ZSBlYWNoIGludCA8aXRlbT4sIHRoaXMgaXMKKyAqIHRvIGtlZXAgdGhlIG9mZnNldCBvZiBlYWNoIGFycmF5IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZXZlbnQuCisgKi8KKworI3VuZGVmIF9fZmllbGQKKyNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKTsKKworI3VuZGVmIF9fYXJyYXkKKyNkZWZpbmUgX19hcnJheSh0eXBlLCBpdGVtLCBsZW4pCisKKyN1bmRlZiBfX2R5bmFtaWNfYXJyYXkKKyNkZWZpbmUgX19keW5hbWljX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikJaW50IGl0ZW07CisKKyN1bmRlZiBfX3N0cmluZworI2RlZmluZSBfX3N0cmluZyhpdGVtLCBzcmMpIF9fZHluYW1pY19hcnJheShjaGFyLCBpdGVtLCAtMSkKKworI3VuZGVmIFRSQUNFX0VWRU5UCisjZGVmaW5lIFRSQUNFX0VWRU5UKGNhbGwsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBhc3NpZ24sIHByaW50KQkJXAorCXN0cnVjdCBmdHJhY2VfZGF0YV9vZmZzZXRzXyMjY2FsbCB7CQkJCVwKKwkJdHN0cnVjdDsJCQkJCQlcCisJfTsKKworI2luY2x1ZGUgVFJBQ0VfSU5DTFVERShUUkFDRV9JTkNMVURFX0ZJTEUpCisKKy8qCisgKiBTZXR1cCB0aGUgc2hvd2luZyBmb3JtYXQgb2YgdHJhY2UgcG9pbnQuCisgKgorICogaW50CisgKiBmdHJhY2VfZm9ybWF0XyMjY2FsbChzdHJ1Y3QgdHJhY2Vfc2VxICpzKQorICogeworICoJc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsIGZpZWxkOworICoJaW50IHJldDsKKyAqCisgKglyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICN0eXBlICIgIiAjaXRlbSAiOyIKKyAqCQkJICAgICAgICIgb2Zmc2V0OiV1OyBzaXplOiV1O1xuIiwKKyAqCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCwgaXRlbSksCisgKgkJCSAgICAgICBzaXplb2YoZmllbGQudHlwZSkpOworICoKKyAqIH0KKyAqLworCisjdW5kZWYgVFBfU1RSVUNUX19lbnRyeQorI2RlZmluZSBUUF9TVFJVQ1RfX2VudHJ5KGFyZ3MuLi4pIGFyZ3MKKworI3VuZGVmIF9fZmllbGQKKyNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKQkJCQkJXAorCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6IiAjdHlwZSAiICIgI2l0ZW0gIjtcdCIJXAorCQkJICAgICAgICJvZmZzZXQ6JXU7XHRzaXplOiV1O1xuIiwJCVwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KW9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLCBcCisJCQkgICAgICAgKHVuc2lnbmVkIGludClzaXplb2YoZmllbGQuaXRlbSkpOwlcCisJaWYgKCFyZXQpCQkJCQkJCVwKKwkJcmV0dXJuIDA7CisKKyN1bmRlZiBfX2FycmF5CisjZGVmaW5lIF9fYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkJCVwKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdGZpZWxkOiIgI3R5cGUgIiAiICNpdGVtICJbIiAjbGVuICJdO1x0IglcCisJCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAkJXAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksIFwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KXNpemVvZihmaWVsZC5pdGVtKSk7CVwKKwlpZiAoIXJldCkJCQkJCQkJXAorCQlyZXR1cm4gMDsKKworI3VuZGVmIF9fZHluYW1pY19hcnJheQorI2RlZmluZSBfX2R5bmFtaWNfYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkgICAgICAgXAorCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6X19kYXRhX2xvYyAiICNpdGVtICI7XHQiCSAgICAgICBcCisJCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAkJICAgICAgIFwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KW9mZnNldG9mKHR5cGVvZihmaWVsZCksCSAgICAgICBcCisJCQkJCV9fZGF0YV9sb2NfIyNpdGVtKSwJCSAgICAgICBcCisJCQkgICAgICAgKHVuc2lnbmVkIGludClzaXplb2YoZmllbGQuX19kYXRhX2xvY18jI2l0ZW0pKTsgXAorCWlmICghcmV0KQkJCQkJCQkgICAgICAgXAorCQlyZXR1cm4gMDsKKworI3VuZGVmIF9fc3RyaW5nCisjZGVmaW5lIF9fc3RyaW5nKGl0ZW0sIHNyYykgX19keW5hbWljX2FycmF5KGNoYXIsIGl0ZW0sIC0xKQorCisjdW5kZWYgX19lbnRyeQorI2RlZmluZSBfX2VudHJ5IFJFQworCisjdW5kZWYgX19wcmludF9zeW1ib2xpYworI3VuZGVmIF9fZ2V0X2R5bmFtaWNfYXJyYXkKKyN1bmRlZiBfX2dldF9zdHIKKworI3VuZGVmIFRQX3ByaW50aworI2RlZmluZSBUUF9wcmludGsoZm10LCBhcmdzLi4uKSAiJXMsICVzXG4iLCAjZm10LCBfX3N0cmluZ2lmeShhcmdzKQorCisjdW5kZWYgVFBfZmFzdF9hc3NpZ24KKyNkZWZpbmUgVFBfZmFzdF9hc3NpZ24oYXJncy4uLikgYXJncworCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGZ1bmMsIHByaW50KQkJXAorc3RhdGljIGludAkJCQkJCQkJXAorZnRyYWNlX2Zvcm1hdF8jI2NhbGwoc3RydWN0IHRyYWNlX3NlcSAqcykJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgZmllbGQgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CQlcCisJaW50IHJldCA9IDA7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0c3RydWN0OwkJCQkJCQlcCisJCQkJCQkJCQlcCisJdHJhY2Vfc2VxX3ByaW50ZihzLCAiXG5wcmludCBmbXQ6ICIgcHJpbnQpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CisKKyNpbmNsdWRlIFRSQUNFX0lOQ0xVREUoVFJBQ0VfSU5DTFVERV9GSUxFKQorCisvKgorICogU3RhZ2UgMyBvZiB0aGUgdHJhY2UgZXZlbnRzLgorICoKKyAqIE92ZXJyaWRlIHRoZSBtYWNyb3MgaW4gPHRyYWNlL3RyYWNlX2V2ZW50cy5oPiB0byBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CisgKgorICogZW51bSBwcmludF9saW5lX3QKKyAqIGZ0cmFjZV9yYXdfb3V0cHV0XzxjYWxsPihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncykKKyAqIHsKKyAqCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOworICoJc3RydWN0IGZ0cmFjZV9yYXdfPGNhbGw+ICpmaWVsZDsgPC0tIGRlZmluZWQgaW4gc3RhZ2UgMQorICoJc3RydWN0IHRyYWNlX2VudHJ5ICplbnRyeTsKKyAqCXN0cnVjdCB0cmFjZV9zZXEgKnA7CisgKglpbnQgcmV0OworICoKKyAqCWVudHJ5ID0gaXRlci0+ZW50OworICoKKyAqCWlmIChlbnRyeS0+dHlwZSAhPSBldmVudF88Y2FsbD4uaWQpIHsKKyAqCQlXQVJOX09OX09OQ0UoMSk7CisgKgkJcmV0dXJuIFRSQUNFX1RZUEVfVU5IQU5ETEVEOworICoJfQorICoKKyAqCWZpZWxkID0gKHR5cGVvZihmaWVsZCkpZW50cnk7CisgKgorICoJcCA9IGdldF9jcHVfdmFyKGZ0cmFjZV9ldmVudF9zZXEpOworICoJdHJhY2Vfc2VxX2luaXQocCk7CisgKglyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsIDxUUF9wcmludGs+ICJcbiIpOworICoJcHV0X2NwdSgpOworICoJaWYgKCFyZXQpCisgKgkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOworICoKKyAqCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7CisgKiB9CisgKgorICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgdG8gcHJpbnQgdGhlIHJhdyBldmVudCB0byB0aGUgdHJhY2UKKyAqIG91dHB1dCBmb3JtYXQuIE5vdGUsIHRoaXMgaXMgbm90IG5lZWRlZCBpZiB0aGUgZGF0YSBpcyByZWFkCisgKiBpbiBiaW5hcnkuCisgKi8KKworI3VuZGVmIF9fZW50cnkKKyNkZWZpbmUgX19lbnRyeSBmaWVsZAorCisjdW5kZWYgVFBfcHJpbnRrCisjZGVmaW5lIFRQX3ByaW50ayhmbXQsIGFyZ3MuLi4pIGZtdCAiXG4iLCBhcmdzCisKKyN1bmRlZiBfX2dldF9keW5hbWljX2FycmF5CisjZGVmaW5lIF9fZ2V0X2R5bmFtaWNfYXJyYXkoZmllbGQpCVwKKwkJKCh2b2lkICopX19lbnRyeSArIF9fZW50cnktPl9fZGF0YV9sb2NfIyNmaWVsZCkKKworI3VuZGVmIF9fZ2V0X3N0cgorI2RlZmluZSBfX2dldF9zdHIoZmllbGQpIChjaGFyICopX19nZXRfZHluYW1pY19hcnJheShmaWVsZCkKKworI3VuZGVmIF9fcHJpbnRfZmxhZ3MKKyNkZWZpbmUgX19wcmludF9mbGFncyhmbGFnLCBkZWxpbSwgZmxhZ19hcnJheS4uLikJCQlcCisJKHsJCQkJCQkJCVwKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyBmbGFnc1tdID0JCVwKKwkJCXsgZmxhZ19hcnJheSwgeyAtMSwgTlVMTCB9fTsJCQlcCisJCWZ0cmFjZV9wcmludF9mbGFnc19zZXEocCwgZGVsaW0sIGZsYWcsIGZsYWdzKTsJCVwKKwl9KQorCisjdW5kZWYgX19wcmludF9zeW1ib2xpYworI2RlZmluZSBfX3ByaW50X3N5bWJvbGljKHZhbHVlLCBzeW1ib2xfYXJyYXkuLi4pCQkJXAorCSh7CQkJCQkJCQlcCisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhY2VfcHJpbnRfZmxhZ3Mgc3ltYm9sc1tdID0JXAorCQkJeyBzeW1ib2xfYXJyYXksIHsgLTEsIE5VTEwgfX07CQkJXAorCQlmdHJhY2VfcHJpbnRfc3ltYm9sc19zZXEocCwgdmFsdWUsIHN5bWJvbHMpOwkJXAorCX0pCisKKyN1bmRlZiBUUkFDRV9FVkVOVAorI2RlZmluZSBUUkFDRV9FVkVOVChjYWxsLCBwcm90bywgYXJncywgdHN0cnVjdCwgYXNzaWduLCBwcmludCkJCVwKK2VudW0gcHJpbnRfbGluZV90CQkJCQkJCVwKK2Z0cmFjZV9yYXdfb3V0cHV0XyMjY2FsbChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncykJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdHJhY2Vfc2VxICpzID0gJml0ZXItPnNlcTsJCQkJXAorCXN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCAqZmllbGQ7CQkJCVwKKwlzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudHJ5OwkJCQkJXAorCXN0cnVjdCB0cmFjZV9zZXEgKnA7CQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwllbnRyeSA9IGl0ZXItPmVudDsJCQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKGVudHJ5LT50eXBlICE9IGV2ZW50XyMjY2FsbC5pZCkgewkJCQlcCisJCVdBUk5fT05fT05DRSgxKTsJCQkJCVwKKwkJcmV0dXJuIFRSQUNFX1RZUEVfVU5IQU5ETEVEOwkJCQlcCisJfQkJCQkJCQkJXAorCQkJCQkJCQkJXAorCWZpZWxkID0gKHR5cGVvZihmaWVsZCkpZW50cnk7CQkJCQlcCisJCQkJCQkJCQlcCisJcCA9ICZnZXRfY3B1X3ZhcihmdHJhY2VfZXZlbnRfc2VxKTsJCQkJXAorCXRyYWNlX3NlcV9pbml0KHApOwkJCQkJCVwKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICNjYWxsICI6ICIgcHJpbnQpOwkJCVwKKwlwdXRfY3B1KCk7CQkJCQkJCVwKKwlpZiAoIXJldCkJCQkJCQkJXAorCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwkJCQkJXAorfQorCQorI2luY2x1ZGUgVFJBQ0VfSU5DTFVERShUUkFDRV9JTkNMVURFX0ZJTEUpCisKKyN1bmRlZiBfX2ZpZWxkCisjZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkJCQkJCQlcCisJcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsICN0eXBlLCAjaXRlbSwJCVwKKwkJCQkgb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksCQlcCisJCQkJIHNpemVvZihmaWVsZC5pdGVtKSwgaXNfc2lnbmVkX3R5cGUodHlwZSkpOwlcCisJaWYgKHJldCkJCQkJCQkJXAorCQlyZXR1cm4gcmV0OworCisjdW5kZWYgX19hcnJheQorI2RlZmluZSBfX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikJCQkJCVwKKwlCVUlMRF9CVUdfT04obGVuID4gTUFYX0ZJTFRFUl9TVFJfVkFMKTsJCQkJXAorCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCAjdHlwZSAiWyIgI2xlbiAiXSIsICNpdGVtLAlcCisJCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLAkJXAorCQkJCSBzaXplb2YoZmllbGQuaXRlbSksIDApOwkJXAorCWlmIChyZXQpCQkJCQkJCVwKKwkJcmV0dXJuIHJldDsKKworI3VuZGVmIF9fZHluYW1pY19hcnJheQorI2RlZmluZSBfX2R5bmFtaWNfYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkgICAgICAgXAorCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCAiX19kYXRhX2xvYyIgIlsiICN0eXBlICJdIiwgI2l0ZW0sXAorCQkJCW9mZnNldG9mKHR5cGVvZihmaWVsZCksIF9fZGF0YV9sb2NfIyNpdGVtKSwgICAgXAorCQkJCSBzaXplb2YoZmllbGQuX19kYXRhX2xvY18jI2l0ZW0pLCAwKTsKKworI3VuZGVmIF9fc3RyaW5nCisjZGVmaW5lIF9fc3RyaW5nKGl0ZW0sIHNyYykgX19keW5hbWljX2FycmF5KGNoYXIsIGl0ZW0sIC0xKQorCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGZ1bmMsIHByaW50KQkJXAoraW50CQkJCQkJCQkJXAorZnRyYWNlX2RlZmluZV9maWVsZHNfIyNjYWxsKHZvaWQpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCBmaWVsZDsJCQkJCVwKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV2ZW50X2NhbGwgPSAmZXZlbnRfIyNjYWxsOwkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2NvbW1vbl9maWVsZChpbnQsIHR5cGUsIDEpOwkJCQkJXAorCV9fY29tbW9uX2ZpZWxkKHVuc2lnbmVkIGNoYXIsIGZsYWdzLCAwKTsJCQlcCisJX19jb21tb25fZmllbGQodW5zaWduZWQgY2hhciwgcHJlZW1wdF9jb3VudCwgMCk7CQlcCisJX19jb21tb25fZmllbGQoaW50LCBwaWQsIDEpOwkJCQkJXAorCV9fY29tbW9uX2ZpZWxkKGludCwgdGdpZCwgMSk7CQkJCQlcCisJCQkJCQkJCQlcCisJdHN0cnVjdDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30KKworI2luY2x1ZGUgVFJBQ0VfSU5DTFVERShUUkFDRV9JTkNMVURFX0ZJTEUpCisKKy8qCisgKiByZW1lbWJlciB0aGUgb2Zmc2V0IG9mIGVhY2ggYXJyYXkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBldmVudC4KKyAqLworCisjdW5kZWYgX19lbnRyeQorI2RlZmluZSBfX2VudHJ5IGVudHJ5CisKKyN1bmRlZiBfX2ZpZWxkCisjZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkKKworI3VuZGVmIF9fYXJyYXkKKyNkZWZpbmUgX19hcnJheSh0eXBlLCBpdGVtLCBsZW4pCisKKyN1bmRlZiBfX2R5bmFtaWNfYXJyYXkKKyNkZWZpbmUgX19keW5hbWljX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikJCQkJXAorCV9fZGF0YV9vZmZzZXRzLT5pdGVtID0gX19kYXRhX3NpemUgKwkJCQlcCisJCQkgICAgICAgb2Zmc2V0b2YodHlwZW9mKCplbnRyeSksIF9fZGF0YSk7CVwKKwlfX2RhdGFfc2l6ZSArPSAobGVuKSAqIHNpemVvZih0eXBlKTsKKworI3VuZGVmIF9fc3RyaW5nCisjZGVmaW5lIF9fc3RyaW5nKGl0ZW0sIHNyYykgX19keW5hbWljX2FycmF5KGNoYXIsIGl0ZW0sIHN0cmxlbihzcmMpICsgMSkgICAgICAgXAorCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCQlcCitzdGF0aWMgaW5saW5lIGludCBmdHJhY2VfZ2V0X29mZnNldHNfIyNjYWxsKAkJCQlcCisJc3RydWN0IGZ0cmFjZV9kYXRhX29mZnNldHNfIyNjYWxsICpfX2RhdGFfb2Zmc2V0cywgcHJvdG8pICAgICAgIFwKK3sJCQkJCQkJCQlcCisJaW50IF9fZGF0YV9zaXplID0gMDsJCQkJCQlcCisJc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsIF9fbWF5YmVfdW51c2VkICplbnRyeTsJCQlcCisJCQkJCQkJCQlcCisJdHN0cnVjdDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJldHVybiBfX2RhdGFfc2l6ZTsJCQkJCQlcCit9CisKKyNpbmNsdWRlIFRSQUNFX0lOQ0xVREUoVFJBQ0VfSU5DTFVERV9GSUxFKQorCisvKgorICogU3RhZ2UgNCBvZiB0aGUgdHJhY2UgZXZlbnRzLgorICoKKyAqIE92ZXJyaWRlIHRoZSBtYWNyb3MgaW4gPHRyYWNlL3RyYWNlX2V2ZW50cy5oPiB0byBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CisgKgorICogc3RhdGljIHZvaWQgZnRyYWNlX2V2ZW50XzxjYWxsPihwcm90bykKKyAqIHsKKyAqCWV2ZW50X3RyYWNlX3ByaW50ayhfUkVUX0lQXywgIjxjYWxsPjogIiA8Zm10Pik7CisgKiB9CisgKgorICogc3RhdGljIGludCBmdHJhY2VfcmVnX2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJaW50IHJldDsKKyAqCisgKglyZXQgPSByZWdpc3Rlcl90cmFjZV88Y2FsbD4oZnRyYWNlX2V2ZW50XzxjYWxsPik7CisgKglpZiAoIXJldCkKKyAqCQlwcl9pbmZvKCJldmVudCB0cmFjZTogQ291bGQgbm90IGFjdGl2YXRlIHRyYWNlIHBvaW50ICIKKyAqCQkJInByb2JlIHRvICA8Y2FsbD4iKTsKKyAqCXJldHVybiByZXQ7CisgKiB9CisgKgorICogc3RhdGljIHZvaWQgZnRyYWNlX3VucmVnX2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJdW5yZWdpc3Rlcl90cmFjZV88Y2FsbD4oZnRyYWNlX2V2ZW50XzxjYWxsPik7CisgKiB9CisgKgorICoKKyAqIEZvciB0aG9zZSBtYWNyb3MgZGVmaW5lZCB3aXRoIFRSQUNFX0VWRU5UOgorICoKKyAqIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgZXZlbnRfPGNhbGw+OworICoKKyAqIHN0YXRpYyB2b2lkIGZ0cmFjZV9yYXdfZXZlbnRfPGNhbGw+KHByb3RvKQorICogeworICoJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKKyAqCXN0cnVjdCBmdHJhY2VfcmF3XzxjYWxsPiAqZW50cnk7IDwtLSBkZWZpbmVkIGluIHN0YWdlIDEKKyAqCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworICoJaW50IHBjOworICoKKyAqCWxvY2FsX3NhdmVfZmxhZ3MoaXJxX2ZsYWdzKTsKKyAqCXBjID0gcHJlZW1wdF9jb3VudCgpOworICoKKyAqCWV2ZW50ID0gdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKGV2ZW50XzxjYWxsPi5pZCwKKyAqCQkJCSAgc2l6ZW9mKHN0cnVjdCBmdHJhY2VfcmF3XzxjYWxsPiksCisgKgkJCQkgIGlycV9mbGFncywgcGMpOworICoJaWYgKCFldmVudCkKKyAqCQlyZXR1cm47CisgKgllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworICoKKyAqCTxhc3NpZ24+OyAgPC0tIEhlcmUgd2UgYXNzaWduIHRoZSBlbnRyaWVzIGJ5IHRoZSBfX2ZpZWxkIGFuZAorICoJCQlfX2FycmF5IG1hY3Jvcy4KKyAqCisgKgl0cmFjZV9jdXJyZW50X2J1ZmZlcl91bmxvY2tfY29tbWl0KGV2ZW50LCBpcnFfZmxhZ3MsIHBjKTsKKyAqIH0KKyAqCisgKiBzdGF0aWMgaW50IGZ0cmFjZV9yYXdfcmVnX2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJaW50IHJldDsKKyAqCisgKglyZXQgPSByZWdpc3Rlcl90cmFjZV88Y2FsbD4oZnRyYWNlX3Jhd19ldmVudF88Y2FsbD4pOworICoJaWYgKCFyZXQpCisgKgkJcHJfaW5mbygiZXZlbnQgdHJhY2U6IENvdWxkIG5vdCBhY3RpdmF0ZSB0cmFjZSBwb2ludCAiCisgKgkJCSJwcm9iZSB0byA8Y2FsbD4iKTsKKyAqCXJldHVybiByZXQ7CisgKiB9CisgKgorICogc3RhdGljIHZvaWQgZnRyYWNlX3VucmVnX2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJdW5yZWdpc3Rlcl90cmFjZV88Y2FsbD4oZnRyYWNlX3Jhd19ldmVudF88Y2FsbD4pOworICogfQorICoKKyAqIHN0YXRpYyBzdHJ1Y3QgdHJhY2VfZXZlbnQgZnRyYWNlX2V2ZW50X3R5cGVfPGNhbGw+ID0geworICoJLnRyYWNlCQkJPSBmdHJhY2VfcmF3X291dHB1dF88Y2FsbD4sIDwtLSBzdGFnZSAyCisgKiB9OworICoKKyAqIHN0YXRpYyBpbnQgZnRyYWNlX3Jhd19pbml0X2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJaW50IGlkOworICoKKyAqCWlkID0gcmVnaXN0ZXJfZnRyYWNlX2V2ZW50KCZmdHJhY2VfZXZlbnRfdHlwZV88Y2FsbD4pOworICoJaWYgKCFpZCkKKyAqCQlyZXR1cm4gLUVOT0RFVjsKKyAqCWV2ZW50XzxjYWxsPi5pZCA9IGlkOworICoJcmV0dXJuIDA7CisgKiB9CisgKgorICogc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3VzZWQKKyAqIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDQpKSkKKyAqIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9mdHJhY2VfZXZlbnRzIikpKSBldmVudF88Y2FsbD4gPSB7CisgKgkubmFtZQkJCT0gIjxjYWxsPiIsCisgKgkuc3lzdGVtCQkJPSAiPHN5c3RlbT4iLAorICoJLnJhd19pbml0CQk9IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF88Y2FsbD4sCisgKgkucmVnZnVuYwkJPSBmdHJhY2VfcmVnX2V2ZW50XzxjYWxsPiwKKyAqCS51bnJlZ2Z1bmMJCT0gZnRyYWNlX3VucmVnX2V2ZW50XzxjYWxsPiwKKyAqCS5zaG93X2Zvcm1hdAkJPSBmdHJhY2VfZm9ybWF0XzxjYWxsPiwKKyAqIH0KKyAqCisgKi8KKworI3VuZGVmIFRQX0ZNVAorI2RlZmluZSBUUF9GTVQoZm10LCBhcmdzLi4uKQlmbXQgIlxuIiwgIyNhcmdzCisKKyNpZmRlZiBDT05GSUdfRVZFTlRfUFJPRklMRQorI2RlZmluZSBfVFJBQ0VfUFJPRklMRShjYWxsLCBwcm90bywgYXJncykJCQkJXAorc3RhdGljIHZvaWQgZnRyYWNlX3Byb2ZpbGVfIyNjYWxsKHByb3RvKQkJCQlcCit7CQkJCQkJCQkJXAorCWV4dGVybiB2b2lkIHBlcmZfdHBjb3VudGVyX2V2ZW50KGludCk7CQkJCVwKKwlwZXJmX3RwY291bnRlcl9ldmVudChldmVudF8jI2NhbGwuaWQpOwkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIGludCBmdHJhY2VfcHJvZmlsZV9lbmFibGVfIyNjYWxsKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqZXZlbnRfY2FsbCkgXAorewkJCQkJCQkJCVwKKwlpbnQgcmV0ID0gMDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghYXRvbWljX2luY19yZXR1cm4oJmV2ZW50X2NhbGwtPnByb2ZpbGVfY291bnQpKQkJXAorCQlyZXQgPSByZWdpc3Rlcl90cmFjZV8jI2NhbGwoZnRyYWNlX3Byb2ZpbGVfIyNjYWxsKTsJXAorCQkJCQkJCQkJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgdm9pZCBmdHJhY2VfcHJvZmlsZV9kaXNhYmxlXyMjY2FsbChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV2ZW50X2NhbGwpXAorewkJCQkJCQkJCVwKKwlpZiAoYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSwgJmV2ZW50X2NhbGwtPnByb2ZpbGVfY291bnQpKQlcCisJCXVucmVnaXN0ZXJfdHJhY2VfIyNjYWxsKGZ0cmFjZV9wcm9maWxlXyMjY2FsbCk7CQlcCit9CisKKyNkZWZpbmUgX1RSQUNFX1BST0ZJTEVfSU5JVChjYWxsKQkJCQkJXAorCS5wcm9maWxlX2NvdW50ID0gQVRPTUlDX0lOSVQoLTEpLAkJCQlcCisJLnByb2ZpbGVfZW5hYmxlID0gZnRyYWNlX3Byb2ZpbGVfZW5hYmxlXyMjY2FsbCwJCQlcCisJLnByb2ZpbGVfZGlzYWJsZSA9IGZ0cmFjZV9wcm9maWxlX2Rpc2FibGVfIyNjYWxsLAorCisjZWxzZQorI2RlZmluZSBfVFJBQ0VfUFJPRklMRShjYWxsLCBwcm90bywgYXJncykKKyNkZWZpbmUgX1RSQUNFX1BST0ZJTEVfSU5JVChjYWxsKQorI2VuZGlmCisKKyN1bmRlZiBfX2VudHJ5CisjZGVmaW5lIF9fZW50cnkgZW50cnkKKworI3VuZGVmIF9fZmllbGQKKyNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKQorCisjdW5kZWYgX19hcnJheQorI2RlZmluZSBfX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikKKworI3VuZGVmIF9fZHluYW1pY19hcnJheQorI2RlZmluZSBfX2R5bmFtaWNfYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQlcCisJX19lbnRyeS0+X19kYXRhX2xvY18jI2l0ZW0gPSBfX2RhdGFfb2Zmc2V0cy5pdGVtOworCisjdW5kZWYgX19zdHJpbmcKKyNkZWZpbmUgX19zdHJpbmcoaXRlbSwgc3JjKSBfX2R5bmFtaWNfYXJyYXkoY2hhciwgaXRlbSwgLTEpICAgICAgIAlcCisKKyN1bmRlZiBfX2Fzc2lnbl9zdHIKKyNkZWZpbmUgX19hc3NpZ25fc3RyKGRzdCwgc3JjKQkJCQkJCVwKKwlzdHJjcHkoX19nZXRfc3RyKGRzdCksIHNyYyk7CisKKyN1bmRlZiBUUkFDRV9FVkVOVAorI2RlZmluZSBUUkFDRV9FVkVOVChjYWxsLCBwcm90bywgYXJncywgdHN0cnVjdCwgYXNzaWduLCBwcmludCkJCVwKK19UUkFDRV9QUk9GSUxFKGNhbGwsIFBBUkFNUyhwcm90byksIFBBUkFNUyhhcmdzKSkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIGV2ZW50XyMjY2FsbDsJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHZvaWQgZnRyYWNlX3Jhd19ldmVudF8jI2NhbGwocHJvdG8pCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGZ0cmFjZV9kYXRhX29mZnNldHNfIyNjYWxsIF9fbWF5YmVfdW51c2VkIF9fZGF0YV9vZmZzZXRzO1wKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV2ZW50X2NhbGwgPSAmZXZlbnRfIyNjYWxsOwkJXAorCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CQkJCVwKKwlzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgKmVudHJ5OwkJCQlcCisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CQkJCQlcCisJaW50IF9fZGF0YV9zaXplOwkJCQkJCVwKKwlpbnQgcGM7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJbG9jYWxfc2F2ZV9mbGFncyhpcnFfZmxhZ3MpOwkJCQkJXAorCXBjID0gcHJlZW1wdF9jb3VudCgpOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2RhdGFfc2l6ZSA9IGZ0cmFjZV9nZXRfb2Zmc2V0c18jI2NhbGwoJl9fZGF0YV9vZmZzZXRzLCBhcmdzKTsgXAorCQkJCQkJCQkJXAorCWV2ZW50ID0gdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKGV2ZW50XyMjY2FsbC5pZCwJXAorCQkJCSBzaXplb2YoKmVudHJ5KSArIF9fZGF0YV9zaXplLAkJXAorCQkJCSBpcnFfZmxhZ3MsIHBjKTsJCQlcCisJaWYgKCFldmVudCkJCQkJCQkJXAorCQlyZXR1cm47CQkJCQkJCVwKKwllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwkJCVwKKwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0c3RydWN0CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJeyBhc3NpZ247IH0JCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghZmlsdGVyX2N1cnJlbnRfY2hlY2tfZGlzY2FyZChldmVudF9jYWxsLCBlbnRyeSwgZXZlbnQpKQlcCisJCXRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdChldmVudCwgaXJxX2ZsYWdzLCBwYyk7IFwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW50IGZ0cmFjZV9yYXdfcmVnX2V2ZW50XyMjY2FsbCh2b2lkKQkJCQlcCit7CQkJCQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXQgPSByZWdpc3Rlcl90cmFjZV8jI2NhbGwoZnRyYWNlX3Jhd19ldmVudF8jI2NhbGwpOwkJXAorCWlmIChyZXQpCQkJCQkJCVwKKwkJcHJfaW5mbygiZXZlbnQgdHJhY2U6IENvdWxkIG5vdCBhY3RpdmF0ZSB0cmFjZSBwb2ludCAiCVwKKwkJCSJwcm9iZSB0byAiICNjYWxsICJcbiIpOwkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHZvaWQgZnRyYWNlX3Jhd191bnJlZ19ldmVudF8jI2NhbGwodm9pZCkJCQkJXAorewkJCQkJCQkJCVwKKwl1bnJlZ2lzdGVyX3RyYWNlXyMjY2FsbChmdHJhY2VfcmF3X2V2ZW50XyMjY2FsbCk7CQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudCBmdHJhY2VfZXZlbnRfdHlwZV8jI2NhbGwgPSB7CQkJXAorCS50cmFjZQkJCT0gZnRyYWNlX3Jhd19vdXRwdXRfIyNjYWxsLAkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW50IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwodm9pZCkJCQkJXAorewkJCQkJCQkJCVwKKwlpbnQgaWQ7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJaWQgPSByZWdpc3Rlcl9mdHJhY2VfZXZlbnQoJmZ0cmFjZV9ldmVudF90eXBlXyMjY2FsbCk7CQlcCisJaWYgKCFpZCkJCQkJCQkJXAorCQlyZXR1cm4gLUVOT0RFVjsJCQkJCQlcCisJZXZlbnRfIyNjYWxsLmlkID0gaWQ7CQkJCQkJXAorCUlOSVRfTElTVF9IRUFEKCZldmVudF8jI2NhbGwuZmllbGRzKTsJCQkJXAorCWluaXRfcHJlZHMoJmV2ZW50XyMjY2FsbCk7CQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZAkJCQkJXAorX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oNCkpKQkJCQkJCVwKK19fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9mdHJhY2VfZXZlbnRzIikpKSBldmVudF8jI2NhbGwgPSB7CQlcCisJLm5hbWUJCQk9ICNjYWxsLAkJCQlcCisJLnN5c3RlbQkJCT0gX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKSwJCVwKKwkuZXZlbnQJCQk9ICZmdHJhY2VfZXZlbnRfdHlwZV8jI2NhbGwsCQlcCisJLnJhd19pbml0CQk9IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwsCQlcCisJLnJlZ2Z1bmMJCT0gZnRyYWNlX3Jhd19yZWdfZXZlbnRfIyNjYWxsLAkJXAorCS51bnJlZ2Z1bmMJCT0gZnRyYWNlX3Jhd191bnJlZ19ldmVudF8jI2NhbGwsCVwKKwkuc2hvd19mb3JtYXQJCT0gZnRyYWNlX2Zvcm1hdF8jI2NhbGwsCQkJXAorCS5kZWZpbmVfZmllbGRzCQk9IGZ0cmFjZV9kZWZpbmVfZmllbGRzXyMjY2FsbCwJCVwKKwlfVFJBQ0VfUFJPRklMRV9JTklUKGNhbGwpCQkJCQlcCit9CisKKyNpbmNsdWRlIFRSQUNFX0lOQ0xVREUoVFJBQ0VfSU5DTFVERV9GSUxFKQorCisjdW5kZWYgX1RSQUNFX1BST0ZJTEUKKyN1bmRlZiBfVFJBQ0VfUFJPRklMRV9JTklUCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvaXJxLmggYi9pbmNsdWRlL3RyYWNlL2lycS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVkNDQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNpZm5kZWYgX1RSQUNFX0lSUV9ICi0jZGVmaW5lIF9UUkFDRV9JUlFfSAotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgotCi0jaW5jbHVkZSA8dHJhY2UvaXJxX2V2ZW50X3R5cGVzLmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9pcnFfZXZlbnRfdHlwZXMuaCBiL2luY2x1ZGUvdHJhY2UvaXJxX2V2ZW50X3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTY0ZWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS9pcnFfZXZlbnRfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLQotLyogdXNlIDx0cmFjZS9pcnEuaD4gaW5zdGVhZCAqLwotI2lmbmRlZiBUUkFDRV9GT1JNQVQKLSMgZXJyb3IgRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LgotIyBlcnJvciBVbmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgotI2VuZGlmCi0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGlycQotCi0vKgotICogVHJhY2Vwb2ludCBmb3IgZW50cnkgb2YgaW50ZXJydXB0IGhhbmRsZXI6Ci0gKi8KLVRSQUNFX0ZPUk1BVChpcnFfaGFuZGxlcl9lbnRyeSwKLQlUUF9QUk9UTyhpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pLAotCVRQX0FSR1MoaXJxLCBhY3Rpb24pLAotCVRQX0ZNVCgiaXJxPSVkIGhhbmRsZXI9JXMiLCBpcnEsIGFjdGlvbi0+bmFtZSkKLQkpOwotCi0vKgotICogVHJhY2Vwb2ludCBmb3IgcmV0dXJuIG9mIGFuIGludGVycnVwdCBoYW5kbGVyOgotICovCi1UUkFDRV9FVkVOVChpcnFfaGFuZGxlcl9leGl0LAotCi0JVFBfUFJPVE8oaW50IGlycSwgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uLCBpbnQgcmV0KSwKLQotCVRQX0FSR1MoaXJxLCBhY3Rpb24sIHJldCksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKAlpbnQsCWlycQkpCi0JCV9fZmllbGQoCWludCwJcmV0CSkKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmlycQk9IGlycTsKLQkJX19lbnRyeS0+cmV0CT0gcmV0OwotCSksCi0KLQlUUF9wcmludGsoImlycT0lZCByZXR1cm49JXMiLAotCQkgIF9fZW50cnktPmlycSwgX19lbnRyeS0+cmV0ID8gImhhbmRsZWQiIDogInVuaGFuZGxlZCIpCi0pOwotCi1UUkFDRV9GT1JNQVQoc29mdGlycV9lbnRyeSwKLQlUUF9QUk9UTyhzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmgsIHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqdmVjKSwKLQlUUF9BUkdTKGgsIHZlYyksCi0JVFBfRk1UKCJzb2Z0aXJxPSVkIGFjdGlvbj0lcyIsIChpbnQpKGggLSB2ZWMpLCBzb2Z0aXJxX3RvX25hbWVbaC12ZWNdKQotCSk7Ci0KLVRSQUNFX0ZPUk1BVChzb2Z0aXJxX2V4aXQsCi0JVFBfUFJPVE8oc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoLCBzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKnZlYyksCi0JVFBfQVJHUyhoLCB2ZWMpLAotCVRQX0ZNVCgic29mdGlycT0lZCBhY3Rpb249JXMiLCAoaW50KShoIC0gdmVjKSwgc29mdGlycV90b19uYW1lW2gtdmVjXSkKLQkpOwotCi0jdW5kZWYgVFJBQ0VfU1lTVEVNCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2ttZW10cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9rbWVtdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlZTY5Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3RyYWNlL2ttZW10cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBFZHVhcmQgLSBHYWJyaWVsIE11bnRlYW51Ci0gKgotICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIEdQTCB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfS01FTVRSQUNFX0gKLSNkZWZpbmUgX0xJTlVYX0tNRU1UUkFDRV9ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2lmZGVmIENPTkZJR19LTUVNVFJBQ0UKLWV4dGVybiB2b2lkIGttZW10cmFjZV9pbml0KHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBrbWVtdHJhY2VfaW5pdCh2b2lkKQotewotfQotI2VuZGlmCi0KLURFQ0xBUkVfVFJBQ0Uoa21hbGxvYywKLQkgICAgICBUUF9QUk9UTyh1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwKLQkJICAgICAgY29uc3Qgdm9pZCAqcHRyLAotCQkgICAgICBzaXplX3QgYnl0ZXNfcmVxLAotCQkgICAgICBzaXplX3QgYnl0ZXNfYWxsb2MsCi0JCSAgICAgIGdmcF90IGdmcF9mbGFncyksCi0JICAgICAgVFBfQVJHUyhjYWxsX3NpdGUsIHB0ciwgYnl0ZXNfcmVxLCBieXRlc19hbGxvYywgZ2ZwX2ZsYWdzKSk7Ci1ERUNMQVJFX1RSQUNFKGttZW1fY2FjaGVfYWxsb2MsCi0JICAgICAgVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCi0JCSAgICAgIGNvbnN0IHZvaWQgKnB0ciwKLQkJICAgICAgc2l6ZV90IGJ5dGVzX3JlcSwKLQkJICAgICAgc2l6ZV90IGJ5dGVzX2FsbG9jLAotCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MpLAotCSAgICAgIFRQX0FSR1MoY2FsbF9zaXRlLCBwdHIsIGJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncykpOwotREVDTEFSRV9UUkFDRShrbWFsbG9jX25vZGUsCi0JICAgICAgVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCi0JCSAgICAgIGNvbnN0IHZvaWQgKnB0ciwKLQkJICAgICAgc2l6ZV90IGJ5dGVzX3JlcSwKLQkJICAgICAgc2l6ZV90IGJ5dGVzX2FsbG9jLAotCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MsCi0JCSAgICAgIGludCBub2RlKSwKLQkgICAgICBUUF9BUkdTKGNhbGxfc2l0ZSwgcHRyLCBieXRlc19yZXEsIGJ5dGVzX2FsbG9jLCBnZnBfZmxhZ3MsIG5vZGUpKTsKLURFQ0xBUkVfVFJBQ0Uoa21lbV9jYWNoZV9hbGxvY19ub2RlLAotCSAgICAgIFRQX1BST1RPKHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLAotCQkgICAgICBjb25zdCB2b2lkICpwdHIsCi0JCSAgICAgIHNpemVfdCBieXRlc19yZXEsCi0JCSAgICAgIHNpemVfdCBieXRlc19hbGxvYywKLQkJICAgICAgZ2ZwX3QgZ2ZwX2ZsYWdzLAotCQkgICAgICBpbnQgbm9kZSksCi0JICAgICAgVFBfQVJHUyhjYWxsX3NpdGUsIHB0ciwgYnl0ZXNfcmVxLCBieXRlc19hbGxvYywgZ2ZwX2ZsYWdzLCBub2RlKSk7Ci1ERUNMQVJFX1RSQUNFKGtmcmVlLAotCSAgICAgIFRQX1BST1RPKHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLCBjb25zdCB2b2lkICpwdHIpLAotCSAgICAgIFRQX0FSR1MoY2FsbF9zaXRlLCBwdHIpKTsKLURFQ0xBUkVfVFJBQ0Uoa21lbV9jYWNoZV9mcmVlLAotCSAgICAgIFRQX1BST1RPKHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLCBjb25zdCB2b2lkICpwdHIpLAotCSAgICAgIFRQX0FSR1MoY2FsbF9zaXRlLCBwdHIpKTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9MSU5VWF9LTUVNVFJBQ0VfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2xvY2tkZXAuaCBiL2luY2x1ZGUvdHJhY2UvbG9ja2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E2N2RmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvbG9ja2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9UUkFDRV9MT0NLREVQX0gKLSNkZWZpbmUgX1RSQUNFX0xPQ0tERVBfSAotCi0jaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KLQotI2luY2x1ZGUgPHRyYWNlL2xvY2tkZXBfZXZlbnRfdHlwZXMuaD4KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2xvY2tkZXBfZXZlbnRfdHlwZXMuaCBiL2luY2x1ZGUvdHJhY2UvbG9ja2RlcF9ldmVudF90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNjZmNkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvbG9ja2RlcF9ldmVudF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCi0jaWZuZGVmIFRSQUNFX0ZPUk1BVAotIyBlcnJvciBEbyBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuCi0jIGVycm9yIFVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0jZW5kaWYKLQotI3VuZGVmIFRSQUNFX1NZU1RFTQotI2RlZmluZSBUUkFDRV9TWVNURU0gbG9jawotCi0jaWZkZWYgQ09ORklHX0xPQ0tERVAKLQotVFJBQ0VfRk9STUFUKGxvY2tfYWNxdWlyZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGludCBzdWJjbGFzcywKLQkJaW50IHRyeWxvY2ssIGludCByZWFkLCBpbnQgY2hlY2ssCi0JCXN0cnVjdCBsb2NrZGVwX21hcCAqbmV4dF9sb2NrLCB1bnNpZ25lZCBsb25nIGlwKSwKLQlUUF9BUkdTKGxvY2ssIHN1YmNsYXNzLCB0cnlsb2NrLCByZWFkLCBjaGVjaywgbmV4dF9sb2NrLCBpcCksCi0JVFBfRk1UKCIlcyVzJXMiLCB0cnlsb2NrID8gInRyeSAiIDogIiIsCi0JCXJlYWQgPyAicmVhZCAiIDogIiIsIGxvY2stPm5hbWUpCi0JKTsKLQotVFJBQ0VfRk9STUFUKGxvY2tfcmVsZWFzZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGludCBuZXN0ZWQsIHVuc2lnbmVkIGxvbmcgaXApLAotCVRQX0FSR1MobG9jaywgbmVzdGVkLCBpcCksCi0JVFBfRk1UKCIlcyIsIGxvY2stPm5hbWUpCi0JKTsKLQotI2lmZGVmIENPTkZJR19MT0NLX1NUQVQKLQotVFJBQ0VfRk9STUFUKGxvY2tfY29udGVuZGVkLAotCVRQX1BST1RPKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgdW5zaWduZWQgbG9uZyBpcCksCi0JVFBfQVJHUyhsb2NrLCBpcCksCi0JVFBfRk1UKCIlcyIsIGxvY2stPm5hbWUpCi0JKTsKLQotVFJBQ0VfRk9STUFUKGxvY2tfYWNxdWlyZWQsCi0JVFBfUFJPVE8oc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwKSwKLQlUUF9BUkdTKGxvY2ssIGlwKSwKLQlUUF9GTVQoIiVzIiwgbG9jay0+bmFtZSkKLQkpOwotCi0jZW5kaWYKLSNlbmRpZgotCi0jdW5kZWYgVFJBQ0VfU1lTVEVNCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL3NjaGVkLmggYi9pbmNsdWRlL3RyYWNlL3NjaGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzcyYTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS9zY2hlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9UUkFDRV9TQ0hFRF9ICi0jZGVmaW5lIF9UUkFDRV9TQ0hFRF9ICi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KLQotI2luY2x1ZGUgPHRyYWNlL3NjaGVkX2V2ZW50X3R5cGVzLmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9za2IuaCBiL2luY2x1ZGUvdHJhY2Uvc2tiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjIwNmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS9za2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNpZm5kZWYgX1RSQUNFX1NLQl9IXwotI2RlZmluZSBfVFJBQ0VfU0tCX0hfCi0KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+Ci0KLURFQ0xBUkVfVFJBQ0Uoa2ZyZWVfc2tiLAotCVRQX1BST1RPKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmxvY2F0aW9uKSwKLQlUUF9BUkdTKHNrYiwgbG9jYXRpb24pKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmggYi9pbmNsdWRlL3RyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTZmNTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS90cmFjZV9ldmVudF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKiB0cmFjZS88dHlwZT5fZXZlbnRfdHlwZXMuaCBoZXJlICovCi0KLSNpbmNsdWRlIDx0cmFjZS9zY2hlZF9ldmVudF90eXBlcy5oPgotI2luY2x1ZGUgPHRyYWNlL2lycV9ldmVudF90eXBlcy5oPgotI2luY2x1ZGUgPHRyYWNlL2xvY2tkZXBfZXZlbnRfdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvdHJhY2VfZXZlbnRzLmggYi9pbmNsdWRlL3RyYWNlL3RyYWNlX2V2ZW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDEzNzUwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvdHJhY2VfZXZlbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qIHRyYWNlLzx0eXBlPi5oIGhlcmUgKi8KLQotI2luY2x1ZGUgPHRyYWNlL3NjaGVkLmg+Ci0jaW5jbHVkZSA8dHJhY2UvaXJxLmg+Ci0jaW5jbHVkZSA8dHJhY2UvbG9ja2RlcC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS93b3JrcXVldWUuaCBiL2luY2x1ZGUvdHJhY2Uvd29ya3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjY1MjMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS93b3JrcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNpZm5kZWYgX19UUkFDRV9XT1JLUVVFVUVfSAotI2RlZmluZSBfX1RSQUNFX1dPUktRVUVVRV9ICi0KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotREVDTEFSRV9UUkFDRSh3b3JrcXVldWVfaW5zZXJ0aW9uLAotCSAgIFRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqd3FfdGhyZWFkLCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspLAotCSAgIFRQX0FSR1Mod3FfdGhyZWFkLCB3b3JrKSk7Ci0KLURFQ0xBUkVfVFJBQ0Uod29ya3F1ZXVlX2V4ZWN1dGlvbiwKLQkgICBUUF9QUk9UTyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKndxX3RocmVhZCwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSwKLQkgICBUUF9BUkdTKHdxX3RocmVhZCwgd29yaykpOwotCi0vKiBUcmFjZSB0aGUgY3JlYXRpb24gb2Ygb25lIHdvcmtxdWV1ZSB0aHJlYWQgb24gYSBjcHUgKi8KLURFQ0xBUkVfVFJBQ0Uod29ya3F1ZXVlX2NyZWF0aW9uLAotCSAgIFRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqd3FfdGhyZWFkLCBpbnQgY3B1KSwKLQkgICBUUF9BUkdTKHdxX3RocmVhZCwgY3B1KSk7Ci0KLURFQ0xBUkVfVFJBQ0Uod29ya3F1ZXVlX2Rlc3RydWN0aW9uLAotCSAgIFRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqd3FfdGhyZWFkKSwKLQkgICBUUF9BUkdTKHdxX3RocmVhZCkpOwotCi0jZW5kaWYgLyogX19UUkFDRV9XT1JLUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vS2J1aWxkIGIvaW5jbHVkZS94ZW4vS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjVjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi9LYnVpbGQKQEAgLTAsMCArMSBAQAoraGVhZGVyLXkgKz0gZXZ0Y2huLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2V2ZW50cy5oIGIvaW5jbHVkZS94ZW4vZXZlbnRzLmgKaW5kZXggMGQ1ZjFhZC4uZTY4ZDU5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vZXZlbnRzLmgKKysrIGIvaW5jbHVkZS94ZW4vZXZlbnRzLmgKQEAgLTUzLDQgKzUzLDcgQEAKICAgIGlycSB3aWxsIGJlIGRpc2FibGVkIHNvIGl0IHdvbid0IGRlbGl2ZXIgYW4gaW50ZXJydXB0LiAqLwogdm9pZCB4ZW5fcG9sbF9pcnEoaW50IGlycSk7CiAKKy8qIERldGVybWluZSB0aGUgSVJRIHdoaWNoIGlzIGJvdW5kIHRvIGFuIGV2ZW50IGNoYW5uZWwgKi8KK3Vuc2lnbmVkIGlycV9mcm9tX2V2dGNobih1bnNpZ25lZCBpbnQgZXZ0Y2huKTsKKwogI2VuZGlmCS8qIF9YRU5fRVZFTlRTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2V2dGNobi5oIGIvaW5jbHVkZS94ZW4vZXZ0Y2huLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlODMzZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4vZXZ0Y2huLmgKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXZ0Y2huLmgKKyAqCisgKiBJbnRlcmZhY2UgdG8gL2Rldi94ZW4vZXZ0Y2huLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1LCBLIEEgRnJhc2VyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfUFVCTElDX0VWVENITl9IX18KKyNkZWZpbmUgX19MSU5VWF9QVUJMSUNfRVZUQ0hOX0hfXworCisvKgorICogQmluZCBhIGZyZXNoIHBvcnQgdG8gVklSUSBAdmlycS4KKyAqIFJldHVybiBhbGxvY2F0ZWQgcG9ydC4KKyAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fQklORF9WSVJRCQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCAwLCBzaXplb2Yoc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX3ZpcnEpKQorc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX3ZpcnEgeworCXVuc2lnbmVkIGludCB2aXJxOworfTsKKworLyoKKyAqIEJpbmQgYSBmcmVzaCBwb3J0IHRvIHJlbW90ZSA8QHJlbW90ZV9kb21haW4sIEByZW1vdGVfcG9ydD4uCisgKiBSZXR1cm4gYWxsb2NhdGVkIHBvcnQuCisgKi8KKyNkZWZpbmUgSU9DVExfRVZUQ0hOX0JJTkRfSU5URVJET01BSU4JCQlcCisJX0lPQyhfSU9DX05PTkUsICdFJywgMSwgc2l6ZW9mKHN0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF9pbnRlcmRvbWFpbikpCitzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfaW50ZXJkb21haW4geworCXVuc2lnbmVkIGludCByZW1vdGVfZG9tYWluLCByZW1vdGVfcG9ydDsKK307CisKKy8qCisgKiBBbGxvY2F0ZSBhIGZyZXNoIHBvcnQgZm9yIGJpbmRpbmcgdG8gQHJlbW90ZV9kb21haW4uCisgKiBSZXR1cm4gYWxsb2NhdGVkIHBvcnQuCisgKi8KKyNkZWZpbmUgSU9DVExfRVZUQ0hOX0JJTkRfVU5CT1VORF9QT1JUCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnRScsIDIsIHNpemVvZihzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfdW5ib3VuZF9wb3J0KSkKK3N0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF91bmJvdW5kX3BvcnQgeworCXVuc2lnbmVkIGludCByZW1vdGVfZG9tYWluOworfTsKKworLyoKKyAqIFVuYmluZCBwcmV2aW91c2x5IGFsbG9jYXRlZCBAcG9ydC4KKyAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fVU5CSU5ECQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCAzLCBzaXplb2Yoc3RydWN0IGlvY3RsX2V2dGNobl91bmJpbmQpKQorc3RydWN0IGlvY3RsX2V2dGNobl91bmJpbmQgeworCXVuc2lnbmVkIGludCBwb3J0OworfTsKKworLyoKKyAqIFVuYmluZCBwcmV2aW91c2x5IGFsbG9jYXRlZCBAcG9ydC4KKyAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fTk9USUZZCQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCA0LCBzaXplb2Yoc3RydWN0IGlvY3RsX2V2dGNobl9ub3RpZnkpKQorc3RydWN0IGlvY3RsX2V2dGNobl9ub3RpZnkgeworCXVuc2lnbmVkIGludCBwb3J0OworfTsKKworLyogQ2xlYXIgYW5kIHJlaW5pdGlhbGlzZSB0aGUgZXZlbnQgYnVmZmVyLiBDbGVhciBlcnJvciBjb25kaXRpb24uICovCisjZGVmaW5lIElPQ1RMX0VWVENITl9SRVNFVAkJCQlcCisJX0lPQyhfSU9DX05PTkUsICdFJywgNSwgMCkKKworI2VuZGlmIC8qIF9fTElOVVhfUFVCTElDX0VWVENITl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS92ZXJzaW9uLmggYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvdmVyc2lvbi5oCmluZGV4IDQ1MzIzNWUuLmU4YjY1MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3ZlcnNpb24uaApAQCAtNTcsNCArNTcsNyBAQAogLyogRGVjbGFyZXMgdGhlIGZlYXR1cmVzIHJlcG9ydGVkIGJ5IFhFTlZFUl9nZXRfZmVhdHVyZXMuICovCiAjaW5jbHVkZSAiZmVhdHVyZXMuaCIKIAorLyogYXJnID09IE5VTEw7IHJldHVybnMgaG9zdCBtZW1vcnkgcGFnZSBzaXplLiAqLworI2RlZmluZSBYRU5WRVJfcGFnZXNpemUgNworCiAjZW5kaWYgLyogX19YRU5fUFVCTElDX1ZFUlNJT05fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi94ZW5idXMuaCBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCmluZGV4IGY4N2Y5NjEuLmI5NzYzYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oCisrKyBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCkBAIC05MSw4ICs5MSw3IEBACiAJdm9pZCAoKm90aGVyZW5kX2NoYW5nZWQpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYsCiAJCQkJIGVudW0geGVuYnVzX3N0YXRlIGJhY2tlbmRfc3RhdGUpOwogCWludCAoKnJlbW92ZSkoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldik7Ci0JaW50ICgqc3VzcGVuZCkoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldik7Ci0JaW50ICgqc3VzcGVuZF9jYW5jZWwpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KTsKIAlpbnQgKCp1ZXZlbnQpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICosIGNoYXIgKiosIGludCwgY2hhciAqLCBpbnQpOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCA3YmU0ZDM4Li5jNjQ5NjU3IDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0zMDIsMTMgKzMwMiwxNCBAQAogCiBjb25maWcgQVVESVRfVFJFRQogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIEFVRElUU1lTQ0FMTCAmJiBJTk9USUZZCisJZGVwZW5kcyBvbiBBVURJVFNZU0NBTEwKKwlzZWxlY3QgSU5PVElGWQogCiBtZW51ICJSQ1UgU3Vic3lzdGVtIgogCiBjaG9pY2UKIAlwcm9tcHQgIlJDVSBJbXBsZW1lbnRhdGlvbiIKLQlkZWZhdWx0IENMQVNTSUNfUkNVCisJZGVmYXVsdCBUUkVFX1JDVQogCiBjb25maWcgQ0xBU1NJQ19SQ1UKIAlib29sICJDbGFzc2ljIFJDVSIKQEAgLTkzMyw2ICs5MzQsNDAgQEAKICAgICAgICAgICBieSBzb21lIGhpZ2ggcGVyZm9ybWFuY2UgdGhyZWFkZWQgYXBwbGljYXRpb25zLiBEaXNhYmxpbmcKICAgICAgICAgICB0aGlzIG9wdGlvbiBzYXZlcyBhYm91dCA3ay4KIAorY29uZmlnIEhBVkVfUEVSRl9DT1VOVEVSUworCWJvb2wKKworbWVudSAiUGVyZm9ybWFuY2UgQ291bnRlcnMiCisKK2NvbmZpZyBQRVJGX0NPVU5URVJTCisJYm9vbCAiS2VybmVsIFBlcmZvcm1hbmNlIENvdW50ZXJzIgorCWRlcGVuZHMgb24gSEFWRV9QRVJGX0NPVU5URVJTCisJc2VsZWN0IEFOT05fSU5PREVTCisJaGVscAorCSAgRW5hYmxlIGtlcm5lbCBzdXBwb3J0IGZvciBwZXJmb3JtYW5jZSBjb3VudGVyIGhhcmR3YXJlLgorCisJICBQZXJmb3JtYW5jZSBjb3VudGVycyBhcmUgc3BlY2lhbCBoYXJkd2FyZSByZWdpc3RlcnMgYXZhaWxhYmxlCisJICBvbiBtb3N0IG1vZGVybiBDUFVzLiBUaGVzZSByZWdpc3RlcnMgY291bnQgdGhlIG51bWJlciBvZiBjZXJ0YWluCisJICB0eXBlcyBvZiBodyBldmVudHM6IHN1Y2ggYXMgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkLCBjYWNoZW1pc3NlcworCSAgc3VmZmVyZWQsIG9yIGJyYW5jaGVzIG1pcy1wcmVkaWN0ZWQgLSB3aXRob3V0IHNsb3dpbmcgZG93biB0aGUKKwkgIGtlcm5lbCBvciBhcHBsaWNhdGlvbnMuIFRoZXNlIHJlZ2lzdGVycyBjYW4gYWxzbyB0cmlnZ2VyIGludGVycnVwdHMKKwkgIHdoZW4gYSB0aHJlc2hvbGQgbnVtYmVyIG9mIGV2ZW50cyBoYXZlIHBhc3NlZCAtIGFuZCBjYW4gdGh1cyBiZQorCSAgdXNlZCB0byBwcm9maWxlIHRoZSBjb2RlIHRoYXQgcnVucyBvbiB0aGF0IENQVS4KKworCSAgVGhlIExpbnV4IFBlcmZvcm1hbmNlIENvdW50ZXIgc3Vic3lzdGVtIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIG9mCisJICB0aGVzZSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMsIGF2YWlsYWJsZSB2aWEgYSBzeXN0ZW0gY2FsbC4gSXQKKwkgIHByb3ZpZGVzIHBlciB0YXNrIGFuZCBwZXIgQ1BVIGNvdW50ZXJzLCBhbmQgaXQgcHJvdmlkZXMgZXZlbnQKKwkgIGNhcGFiaWxpdGllcyBvbiB0b3Agb2YgdGhvc2UuCisKKwkgIFNheSBZIGlmIHVuc3VyZS4KKworY29uZmlnIEVWRU5UX1BST0ZJTEUKKwlib29sICJUcmFjZXBvaW50IHByb2ZpbGUgc291cmNlcyIKKwlkZXBlbmRzIG9uIFBFUkZfQ09VTlRFUlMgJiYgRVZFTlRfVFJBQ0VSCisJZGVmYXVsdCB5CisKK2VuZG1lbnUKKwogY29uZmlnIFZNX0VWRU5UX0NPVU5URVJTCiAJZGVmYXVsdCB5CiAJYm9vbCAiRW5hYmxlIFZNIGV2ZW50IGNvdW50ZXJzIGZvciAvcHJvYy92bXN0YXQiIGlmIEVNQkVEREVECmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGQ3MjFkYWQuLjU2MTY2NjEgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z29iamVjdHMuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgpAQCAtNjQsNiArNjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CisjaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8dHJhY2UvYm9vdC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC03MSw3ICs3Myw2IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDx0cmFjZS9rbWVtdHJhY2UuaD4KIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogI2luY2x1ZGUgPGFzbS9zbXAuaD4KQEAgLTUzMyw2ICs1MzQsMTYgQEAKIHsKIH0KIAorLyoKKyAqIFNldCB1cCBrZXJuZWwgbWVtb3J5IGFsbG9jYXRvcnMKKyAqLworc3RhdGljIHZvaWQgX19pbml0IG1tX2luaXQodm9pZCkKK3sKKwltZW1faW5pdCgpOworCWttZW1fY2FjaGVfaW5pdCgpOworCXZtYWxsb2NfaW5pdCgpOworfQorCiBhc21saW5rYWdlIHZvaWQgX19pbml0IHN0YXJ0X2tlcm5lbCh2b2lkKQogewogCWNoYXIgKiBjb21tYW5kX2xpbmU7CkBAIC01NzQsNiArNTg1LDIzIEBACiAJc2V0dXBfbnJfY3B1X2lkcygpOwogCXNtcF9wcmVwYXJlX2Jvb3RfY3B1KCk7CS8qIGFyY2gtc3BlY2lmaWMgYm9vdC1jcHUgaG9va3MgKi8KIAorCWJ1aWxkX2FsbF96b25lbGlzdHMoKTsKKwlwYWdlX2FsbG9jX2luaXQoKTsKKworCXByaW50ayhLRVJOX05PVElDRSAiS2VybmVsIGNvbW1hbmQgbGluZTogJXNcbiIsIGJvb3RfY29tbWFuZF9saW5lKTsKKwlwYXJzZV9lYXJseV9wYXJhbSgpOworCXBhcnNlX2FyZ3MoIkJvb3Rpbmcga2VybmVsIiwgc3RhdGljX2NvbW1hbmRfbGluZSwgX19zdGFydF9fX3BhcmFtLAorCQkgICBfX3N0b3BfX19wYXJhbSAtIF9fc3RhcnRfX19wYXJhbSwKKwkJICAgJnVua25vd25fYm9vdG9wdGlvbik7CisJLyoKKwkgKiBUaGVzZSB1c2UgbGFyZ2UgYm9vdG1lbSBhbGxvY2F0aW9ucyBhbmQgbXVzdCBwcmVjZWRlCisJICoga21lbV9jYWNoZV9pbml0KCkKKwkgKi8KKwlwaWRoYXNoX2luaXQoKTsKKwl2ZnNfY2FjaGVzX2luaXRfZWFybHkoKTsKKwlzb3J0X21haW5fZXh0YWJsZSgpOworCXRyYXBfaW5pdCgpOworCW1tX2luaXQoKTsKIAkvKgogCSAqIFNldCB1cCB0aGUgc2NoZWR1bGVyIHByaW9yIHN0YXJ0aW5nIGFueSBpbnRlcnJ1cHRzIChzdWNoIGFzIHRoZQogCSAqIHRpbWVyIGludGVycnVwdCkuIEZ1bGwgdG9wb2xvZ3kgc2V0dXAgaGFwcGVucyBhdCBzbXBfaW5pdCgpCkBAIC01ODUsMjUgKzYxMywxNiBAQAogCSAqIGZyYWdpbGUgdW50aWwgd2UgY3B1X2lkbGUoKSBmb3IgdGhlIGZpcnN0IHRpbWUuCiAJICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JYnVpbGRfYWxsX3pvbmVsaXN0cygpOwotCXBhZ2VfYWxsb2NfaW5pdCgpOwotCXByaW50ayhLRVJOX05PVElDRSAiS2VybmVsIGNvbW1hbmQgbGluZTogJXNcbiIsIGJvb3RfY29tbWFuZF9saW5lKTsKLQlwYXJzZV9lYXJseV9wYXJhbSgpOwotCXBhcnNlX2FyZ3MoIkJvb3Rpbmcga2VybmVsIiwgc3RhdGljX2NvbW1hbmRfbGluZSwgX19zdGFydF9fX3BhcmFtLAotCQkgICBfX3N0b3BfX19wYXJhbSAtIF9fc3RhcnRfX19wYXJhbSwKLQkJICAgJnVua25vd25fYm9vdG9wdGlvbik7CiAJaWYgKCFpcnFzX2Rpc2FibGVkKCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic3RhcnRfa2VybmVsKCk6IGJ1ZzogaW50ZXJydXB0cyB3ZXJlICIKIAkJCQkiZW5hYmxlZCAqdmVyeSogZWFybHksIGZpeGluZyBpdFxuIik7CiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJfQotCXNvcnRfbWFpbl9leHRhYmxlKCk7Ci0JdHJhcF9pbml0KCk7CiAJcmN1X2luaXQoKTsKIAkvKiBpbml0IHNvbWUgbGlua3MgYmVmb3JlIGluaXRfSVNBX2lycXMoKSAqLwogCWVhcmx5X2lycV9pbml0KCk7CiAJaW5pdF9JUlEoKTsKLQlwaWRoYXNoX2luaXQoKTsKKwlwcmlvX3RyZWVfaW5pdCgpOwogCWluaXRfdGltZXJzKCk7CiAJaHJ0aW1lcnNfaW5pdCgpOwogCXNvZnRpcnFfaW5pdCgpOwpAQCAtNjQ1LDE1ICs2NjQsMTIgQEAKIAkJaW5pdHJkX3N0YXJ0ID0gMDsKIAl9CiAjZW5kaWYKLQl2bWFsbG9jX2luaXQoKTsKLQl2ZnNfY2FjaGVzX2luaXRfZWFybHkoKTsKIAljcHVzZXRfaW5pdF9lYXJseSgpOwogCXBhZ2VfY2dyb3VwX2luaXQoKTsKLQltZW1faW5pdCgpOwogCWVuYWJsZV9kZWJ1Z19wYWdlYWxsb2MoKTsKIAljcHVfaG90cGx1Z19pbml0KCk7Ci0Ja21lbV9jYWNoZV9pbml0KCk7CiAJa21lbXRyYWNlX2luaXQoKTsKKwlrbWVtbGVha19pbml0KCk7CiAJZGVidWdfb2JqZWN0c19tZW1faW5pdCgpOwogCWlkcl9pbml0X2NhY2hlKCk7CiAJc2V0dXBfcGVyX2NwdV9wYWdlc2V0KCk7CkBAIC02NjMsNyArNjc5LDYgQEAKIAljYWxpYnJhdGVfZGVsYXkoKTsKIAlwaWRtYXBfaW5pdCgpOwogCXBndGFibGVfY2FjaGVfaW5pdCgpOwotCXByaW9fdHJlZV9pbml0KCk7CiAJYW5vbl92bWFfaW5pdCgpOwogI2lmZGVmIENPTkZJR19YODYKIAlpZiAoZWZpX2VuYWJsZWQpCmRpZmYgLS1naXQgYS9pcGMvc2VtLmMgYi9pcGMvc2VtLmMKaW5kZXggMTZhMjE4OS4uODdjMmI2NCAxMDA2NDQKLS0tIGEvaXBjL3NlbS5jCisrKyBiL2lwYy9zZW0uYwpAQCAtMTI5MCw4ICsxMjkwLDggQEAKIAkJaW50IGk7CiAKIAkJcmN1X3JlYWRfbG9jaygpOwotCQl1biA9IGxpc3RfZW50cnkocmN1X2RlcmVmZXJlbmNlKHVscC0+bGlzdF9wcm9jLm5leHQpLAotCQkJCQlzdHJ1Y3Qgc2VtX3VuZG8sIGxpc3RfcHJvYyk7CisJCXVuID0gbGlzdF9lbnRyeV9yY3UodWxwLT5saXN0X3Byb2MubmV4dCwKKwkJCQkgICAgc3RydWN0IHNlbV91bmRvLCBsaXN0X3Byb2MpOwogCQlpZiAoJnVuLT5saXN0X3Byb2MgPT0gJnVscC0+bGlzdF9wcm9jKQogCQkJc2VtaWQgPSAtMTsKIAkJIGVsc2UKZGlmZiAtLWdpdCBhL2lwYy9zaG0uYyBiL2lwYy9zaG0uYwppbmRleCA0MjU5NzE2Li4xNWRkMjM4IDEwMDY0NAotLS0gYS9pcGMvc2htLmMKKysrIGIvaXBjL3NobS5jCkBAIC0zODQsNyArMzg0LDYgQEAKIAllcnJvciA9IFBUUl9FUlIoZmlsZSk7CiAJaWYgKElTX0VSUihmaWxlKSkKIAkJZ290byBub19maWxlOwotCWltYV9zaG1fY2hlY2soZmlsZSk7CiAKIAlpZCA9IGlwY19hZGRpZCgmc2htX2lkcyhucyksICZzaHAtPnNobV9wZXJtLCBucy0+c2htX2N0bG1uaSk7CiAJaWYgKGlkIDwgMCkgewpAQCAtODkxLDcgKzg5MCw3IEBACiAJZmlsZSA9IGFsbG9jX2ZpbGUocGF0aC5tbnQsIHBhdGguZGVudHJ5LCBmX21vZGUsICZzaG1fZmlsZV9vcGVyYXRpb25zKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0X2ZyZWU7Ci0JaW1hX3NobV9jaGVjayhmaWxlKTsKKwlpbWFfY291bnRzX2dldChmaWxlKTsKIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHNmZDsKIAlmaWxlLT5mX21hcHBpbmcgPSBzaHAtPnNobV9maWxlLT5mX21hcHBpbmc7CmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNDI0MjM2Ni4uOTBiNTNmNiAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtOTMsOCArOTMsMTAgQEAKIG9iai0kKENPTkZJR19IQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UKSArPSBkbWEtY29oZXJlbnQubwogb2JqLSQoQ09ORklHX0ZVTkNUSU9OX1RSQUNFUikgKz0gdHJhY2UvCiBvYmotJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2UvCitvYmotJChDT05GSUdfWDg2X0RTKSArPSB0cmFjZS8KIG9iai0kKENPTkZJR19TTVApICs9IHNjaGVkX2NwdXByaS5vCiBvYmotJChDT05GSUdfU0xPV19XT1JLKSArPSBzbG93LXdvcmsubworb2JqLSQoQ09ORklHX1BFUkZfQ09VTlRFUlMpICs9IHBlcmZfY291bnRlci5vCiAKIGlmbmVxICgkKENPTkZJR19TQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVIpLHkpCiAjIEFjY29yZGluZyB0byBBbGFuIE1vZHJhIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+LCB0aGUgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgaXMKZGlmZiAtLWdpdCBhL2tlcm5lbC9jb21wYXQuYyBiL2tlcm5lbC9jb21wYXQuYwppbmRleCA0MmQ1NjU0Li5mNmMyMDRmMCAxMDA2NDQKLS0tIGEva2VybmVsL2NvbXBhdC5jCisrKyBiL2tlcm5lbC9jb21wYXQuYwpAQCAtODgyLDYgKzg4MiwxNyBAQAogCiB9CiAKK2FzbWxpbmthZ2UgbG9uZworY29tcGF0X3N5c19ydF90Z3NpZ3F1ZXVlaW5mbyhjb21wYXRfcGlkX3QgdGdpZCwgY29tcGF0X3BpZF90IHBpZCwgaW50IHNpZywKKwkJCSAgICAgc3RydWN0IGNvbXBhdF9zaWdpbmZvIF9fdXNlciAqdWluZm8pCit7CisJc2lnaW5mb190IGluZm87CisKKwlpZiAoY29weV9zaWdpbmZvX2Zyb21fdXNlcjMyKCZpbmZvLCB1aW5mbykpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBkb19ydF90Z3NpZ3F1ZXVlaW5mbyh0Z2lkLCBwaWQsIHNpZywgJmluZm8pOworfQorCiAjaWZkZWYgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19USU1FCiAKIC8qIGNvbXBhdF90aW1lX3QgaXMgYSAzMiBiaXQgImxvbmciIGFuZCBuZWVkcyB0byBnZXQgY29udmVydGVkLiAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdXNldC5jIGIva2VybmVsL2NwdXNldC5jCmluZGV4IDAyNmZhY2MuLmQ1YTdlMTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHVzZXQuYworKysgYi9rZXJuZWwvY3B1c2V0LmMKQEAgLTE4NTcsNyArMTg1Nyw3IEBACiAKIGludCBfX2luaXQgY3B1c2V0X2luaXRfZWFybHkodm9pZCkKIHsKLQlhbGxvY19ib290bWVtX2NwdW1hc2tfdmFyKCZ0b3BfY3B1c2V0LmNwdXNfYWxsb3dlZCk7CisJYWxsb2NfY3B1bWFza192YXIoJnRvcF9jcHVzZXQuY3B1c19hbGxvd2VkLCBHRlBfTk9XQUlUKTsKIAogCXRvcF9jcHVzZXQubWVtc19nZW5lcmF0aW9uID0gY3B1c2V0X21lbXNfZ2VuZXJhdGlvbisrOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NyZWQuYyBiL2tlcm5lbC9jcmVkLmMKaW5kZXggM2EwMzkxOC4uMWJiNGQ3ZSAxMDA2NDQKLS0tIGEva2VybmVsL2NyZWQuYworKysgYi9rZXJuZWwvY3JlZC5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAogLyoKICAqIFByZXBhcmUgY3JlZGVudGlhbHMgZm9yIGN1cnJlbnQgdG8gcGVyZm9ybSBhbiBleGVjdmUoKQotICogLSBUaGUgY2FsbGVyIG11c3QgaG9sZCBjdXJyZW50LT5jcmVkX2V4ZWNfbXV0ZXgKKyAqIC0gVGhlIGNhbGxlciBtdXN0IGhvbGQgY3VycmVudC0+Y3JlZF9ndWFyZF9tdXRleAogICovCiBzdHJ1Y3QgY3JlZCAqcHJlcGFyZV9leGVjX2NyZWRzKHZvaWQpCiB7CkBAIC0yNzYsNyArMjc2LDcgQEAKIAlzdHJ1Y3QgY3JlZCAqbmV3OwogCWludCByZXQ7CiAKLQltdXRleF9pbml0KCZwLT5jcmVkX2V4ZWNfbXV0ZXgpOworCW11dGV4X2luaXQoJnAtPmNyZWRfZ3VhcmRfbXV0ZXgpOwogCiAJaWYgKAogI2lmZGVmIENPTkZJR19LRVlTCmRpZmYgLS1naXQgYS9rZXJuZWwvZXhpdC5jIGIva2VybmVsL2V4aXQuYwppbmRleCBhYmY5Y2YzLi5iNmM5MGI1IDEwMDY0NAotLS0gYS9rZXJuZWwvZXhpdC5jCisrKyBiL2tlcm5lbC9leGl0LmMKQEAgLTQ4LDcgKzQ4LDggQEAKICNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KICNpbmNsdWRlIDxsaW51eC9mc19zdHJ1Y3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KLSNpbmNsdWRlIDx0cmFjZS9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zY2hlZC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC01NiwxMCArNTcsNiBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgImNyZWQtaW50ZXJuYWxzLmgiCiAKLURFRklORV9UUkFDRShzY2hlZF9wcm9jZXNzX2ZyZWUpOwotREVGSU5FX1RSQUNFKHNjaGVkX3Byb2Nlc3NfZXhpdCk7Ci1ERUZJTkVfVFJBQ0Uoc2NoZWRfcHJvY2Vzc193YWl0KTsKLQogc3RhdGljIHZvaWQgZXhpdF9tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0c2spOwogCiBzdGF0aWMgdm9pZCBfX3VuaGFzaF9wcm9jZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKQEAgLTE1OCw2ICsxNTUsOSBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY29udGFpbmVyX29mKHJocCwgc3RydWN0IHRhc2tfc3RydWN0LCByY3UpOwogCisjaWZkZWYgQ09ORklHX1BFUkZfQ09VTlRFUlMKKwlXQVJOX09OX09OQ0UodHNrLT5wZXJmX2NvdW50ZXJfY3R4cCk7CisjZW5kaWYKIAl0cmFjZV9zY2hlZF9wcm9jZXNzX2ZyZWUodHNrKTsKIAlwdXRfdGFza19zdHJ1Y3QodHNrKTsKIH0KQEAgLTE3NCw2ICsxNzQsNyBAQAogCWF0b21pY19kZWMoJl9fdGFza19jcmVkKHApLT51c2VyLT5wcm9jZXNzZXMpOwogCiAJcHJvY19mbHVzaF90YXNrKHApOworCiAJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCXRyYWNlaG9va19maW5pc2hfcmVsZWFzZV90YXNrKHApOwogCV9fZXhpdF9zaWduYWwocCk7CkBAIC05NzUsMTYgKzk3NiwxOSBAQAogCQltb2R1bGVfcHV0KHRzay0+YmluZm10LT5tb2R1bGUpOwogCiAJcHJvY19leGl0X2Nvbm5lY3Rvcih0c2spOworCisJLyoKKwkgKiBGbHVzaCBpbmhlcml0ZWQgY291bnRlcnMgdG8gdGhlIHBhcmVudCAtIGJlZm9yZSB0aGUgcGFyZW50CisJICogZ2V0cyB3b2tlbiB1cCBieSBjaGlsZC1leGl0IG5vdGlmaWNhdGlvbnMuCisJICovCisJcGVyZl9jb3VudGVyX2V4aXRfdGFzayh0c2spOworCiAJZXhpdF9ub3RpZnkodHNrLCBncm91cF9kZWFkKTsKICNpZmRlZiBDT05GSUdfTlVNQQogCW1wb2xfcHV0KHRzay0+bWVtcG9saWN5KTsKIAl0c2stPm1lbXBvbGljeSA9IE5VTEw7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRlVURVgKLQkvKgotCSAqIFRoaXMgbXVzdCBoYXBwZW4gbGF0ZSwgYWZ0ZXIgdGhlIFBJRCBpcyBub3QKLQkgKiBoYXNoZWQgYW55bW9yZToKLQkgKi8KIAlpZiAodW5saWtlbHkoIWxpc3RfZW1wdHkoJnRzay0+cGlfc3RhdGVfbGlzdCkpKQogCQlleGl0X3BpX3N0YXRlX2xpc3QodHNrKTsKIAlpZiAodW5saWtlbHkoY3VycmVudC0+cGlfc3RhdGVfY2FjaGUpKQpAQCAtMTQ3Niw2ICsxNDgwLDcgQEAKIAkJICovCiAJCWlmICgqbm90YXNrX2Vycm9yKQogCQkJKm5vdGFza19lcnJvciA9IHJldDsKKwkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKGxpa2VseSghcHRyYWNlKSAmJiB1bmxpa2VseShwLT5wdHJhY2UpKSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCA4NzVmZmJkLi40NDMwZWIxIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTYxLDggKzYxLDggQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZnNfc3RydWN0Lmg+Ci0jaW5jbHVkZSA8dHJhY2Uvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgpAQCAtNzEsNiArNzEsOCBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2NoZWQuaD4KKwogLyoKICAqIFByb3RlY3RlZCBjb3VudGVycyBieSB3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jaykKICAqLwpAQCAtODMsOCArODUsNiBAQAogCiBfX2NhY2hlbGluZV9hbGlnbmVkIERFRklORV9SV0xPQ0sodGFza2xpc3RfbG9jayk7ICAvKiBvdXRlciAqLwogCi1ERUZJTkVfVFJBQ0Uoc2NoZWRfcHJvY2Vzc19mb3JrKTsKLQogaW50IG5yX3Byb2Nlc3Nlcyh2b2lkKQogewogCWludCBjcHU7CkBAIC05ODIsNiArOTgyLDggQEAKIAlpZiAoIXApCiAJCWdvdG8gZm9ya19vdXQ7CiAKKwlmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApOworCiAJcnRfbXV0ZXhfaW5pdF90YXNrKHApOwogCiAjaWZkZWYgQ09ORklHX1BST1ZFX0xPQ0tJTkcKQEAgLTEwODksMTIgKzEwOTEsMTYgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfTVVURVhFUwogCXAtPmJsb2NrZWRfb24gPSBOVUxMOyAvKiBub3QgYmxvY2tlZCB5ZXQgKi8KICNlbmRpZgotCWlmICh1bmxpa2VseShjdXJyZW50LT5wdHJhY2UpKQotCQlwdHJhY2VfZm9yayhwLCBjbG9uZV9mbGFncyk7CisKKwlwLT5idHMgPSBOVUxMOwogCiAJLyogUGVyZm9ybSBzY2hlZHVsZXIgcmVsYXRlZCBzZXR1cC4gQXNzaWduIHRoaXMgdGFzayB0byBhIENQVS4gKi8KIAlzY2hlZF9mb3JrKHAsIGNsb25lX2ZsYWdzKTsKIAorCXJldHZhbCA9IHBlcmZfY291bnRlcl9pbml0X3Rhc2socCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBiYWRfZm9ya19jbGVhbnVwX3BvbGljeTsKKwogCWlmICgocmV0dmFsID0gYXVkaXRfYWxsb2MocCkpKQogCQlnb3RvIGJhZF9mb3JrX2NsZWFudXBfcG9saWN5OwogCS8qIGNvcHkgYWxsIHRoZSBwcm9jZXNzIGluZm9ybWF0aW9uICovCkBAIC0xMTMxLDggKzExMzcsNiBAQAogCQl9CiAJfQogCi0JZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTsKLQogCXAtPnBpZCA9IHBpZF9ucihwaWQpOwogCXAtPnRnaWQgPSBwLT5waWQ7CiAJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfVEhSRUFEKQpAQCAtMTE0MSw3ICsxMTQ1LDcgQEAKIAlpZiAoY3VycmVudC0+bnNwcm94eSAhPSBwLT5uc3Byb3h5KSB7CiAJCXJldHZhbCA9IG5zX2Nncm91cF9jbG9uZShwLCBwaWQpOwogCQlpZiAocmV0dmFsKQotCQkJZ290byBiYWRfZm9ya19mcmVlX2dyYXBoOworCQkJZ290byBiYWRfZm9ya19mcmVlX3BpZDsKIAl9CiAKIAlwLT5zZXRfY2hpbGRfdGlkID0gKGNsb25lX2ZsYWdzICYgQ0xPTkVfQ0hJTERfU0VUVElEKSA/IGNoaWxkX3RpZHB0ciA6IE5VTEw7CkBAIC0xMjMzLDcgKzEyMzcsNyBAQAogCQlzcGluX3VubG9jaygmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCQlyZXR2YWwgPSAtRVJFU1RBUlROT0lOVFI7Ci0JCWdvdG8gYmFkX2ZvcmtfZnJlZV9ncmFwaDsKKwkJZ290byBiYWRfZm9ya19mcmVlX3BpZDsKIAl9CiAKIAlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9USFJFQUQpIHsKQEAgLTEyNjgsOCArMTI3Miw2IEBACiAJY2dyb3VwX3Bvc3RfZm9yayhwKTsKIAlyZXR1cm4gcDsKIAotYmFkX2ZvcmtfZnJlZV9ncmFwaDoKLQlmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHApOwogYmFkX2ZvcmtfZnJlZV9waWQ6CiAJaWYgKHBpZCAhPSAmaW5pdF9zdHJ1Y3RfcGlkKQogCQlmcmVlX3BpZChwaWQpOwpAQCAtMTI5Myw2ICsxMjk1LDcgQEAKIGJhZF9mb3JrX2NsZWFudXBfYXVkaXQ6CiAJYXVkaXRfZnJlZShwKTsKIGJhZF9mb3JrX2NsZWFudXBfcG9saWN5OgorCXBlcmZfY291bnRlcl9mcmVlX3Rhc2socCk7CiAjaWZkZWYgQ09ORklHX05VTUEKIAltcG9sX3B1dChwLT5tZW1wb2xpY3kpOwogYmFkX2ZvcmtfY2xlYW51cF9jZ3JvdXA6CkBAIC0xNDA2LDYgKzE0MDksMTIgQEAKIAkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfVkZPUkspIHsKIAkJCXAtPnZmb3JrX2RvbmUgPSAmdmZvcms7CiAJCQlpbml0X2NvbXBsZXRpb24oJnZmb3JrKTsKKwkJfSBlbHNlIGlmICghKGNsb25lX2ZsYWdzICYgQ0xPTkVfVk0pKSB7CisJCQkvKgorCQkJICogdmZvcmsgd2lsbCBkbyBhbiBleGVjIHdoaWNoIHdpbGwgY2FsbAorCQkJICogc2V0X3Rhc2tfY29tbSgpCisJCQkgKi8KKwkJCXBlcmZfY291bnRlcl9mb3JrKHApOwogCQl9CiAKIAkJYXVkaXRfZmluaXNoX2ZvcmsocCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IGQ1NDZiMmQuLjgwYjVjZTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0xOSw2ICsxOSwxMCBAQAogICogIFBSSVZBVEUgZnV0ZXhlcyBieSBFcmljIER1bWF6ZXQKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgRXJpYyBEdW1hemV0IDxkYWRhMUBjb3Ntb3NiYXkuY29tPgogICoKKyAqICBSZXF1ZXVlLVBJIHN1cHBvcnQgYnkgRGFycmVuIEhhcnQgPGR2aGx0Y0B1cy5pYm0uY29tPgorICogIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA5CisgKiAgVGhhbmtzIHRvIFRob21hcyBHbGVpeG5lciBmb3IgY29uY2VwdHVhbCBkZXNpZ24gYW5kIGNhcmVmdWwgcmV2aWV3cy4KKyAqCiAgKiAgVGhhbmtzIHRvIEJlbiBMYUhhaXNlIGZvciB5ZWxsaW5nICJoYXNoZWQgd2FpdHF1ZXVlcyIgbG91ZGx5CiAgKiAgZW5vdWdoIGF0IG1lLCBMaW51cyBmb3IgdGhlIG9yaWdpbmFsIChmbGF3ZWQpIGlkZWEsIE1hdHRoZXcKICAqICBLaXJrd29vZCBmb3IgcHJvb2Ytb2YtY29uY2VwdCBpbXBsZW1lbnRhdGlvbi4KQEAgLTk2LDggKzEwMCw4IEBACiAgKi8KIHN0cnVjdCBmdXRleF9xIHsKIAlzdHJ1Y3QgcGxpc3Rfbm9kZSBsaXN0OwotCS8qIFRoZXJlIGNhbiBvbmx5IGJlIGEgc2luZ2xlIHdhaXRlciAqLwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRlcjsKKwkvKiBXYWl0ZXIgcmVmZXJlbmNlICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCiAJLyogV2hpY2ggaGFzaCBsaXN0IGxvY2sgdG8gdXNlOiAqLwogCXNwaW5sb2NrX3QgKmxvY2tfcHRyOwpAQCAtMTA3LDcgKzExMSw5IEBACiAKIAkvKiBPcHRpb25hbCBwcmlvcml0eSBpbmhlcml0YW5jZSBzdGF0ZTogKi8KIAlzdHJ1Y3QgZnV0ZXhfcGlfc3RhdGUgKnBpX3N0YXRlOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKworCS8qIHJ0X3dhaXRlciBzdG9yYWdlIGZvciByZXF1ZXVlX3BpOiAqLworCXN0cnVjdCBydF9tdXRleF93YWl0ZXIgKnJ0X3dhaXRlcjsKIAogCS8qIEJpdHNldCBmb3IgdGhlIG9wdGlvbmFsIGJpdG1hc2tlZCB3YWtldXAgKi8KIAl1MzIgYml0c2V0OwpAQCAtMjc4LDYgKzI4NCwyNSBAQAogCWRyb3BfZnV0ZXhfa2V5X3JlZnMoa2V5KTsKIH0KIAorLyoqCisgKiBmdXRleF90b3Bfd2FpdGVyKCkgLSBSZXR1cm4gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgd2FpdGVyIG9uIGEgZnV0ZXgKKyAqIEBoYjogICAgIHRoZSBoYXNoIGJ1Y2tldCB0aGUgZnV0ZXhfcSdzIHJlc2lkZSBpbgorICogQGtleTogICAgdGhlIGZ1dGV4IGtleSAodG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBvdGhlciBmdXRleCBmdXRleF9xJ3MpCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaGIgbG9jayBoZWxkLgorICovCitzdGF0aWMgc3RydWN0IGZ1dGV4X3EgKmZ1dGV4X3RvcF93YWl0ZXIoc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYiwKKwkJCQkJdW5pb24gZnV0ZXhfa2V5ICprZXkpCit7CisJc3RydWN0IGZ1dGV4X3EgKnRoaXM7CisKKwlwbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmaGItPmNoYWluLCBsaXN0KSB7CisJCWlmIChtYXRjaF9mdXRleCgmdGhpcy0+a2V5LCBrZXkpKQorCQkJcmV0dXJuIHRoaXM7CisJfQorCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgdTMyIGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHUzMiBfX3VzZXIgKnVhZGRyLCB1MzIgdXZhbCwgdTMyIG5ld3ZhbCkKIHsKIAl1MzIgY3VydmFsOwpAQCAtNTM5LDI4ICs1NjQsMTYwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogZnV0ZXhfbG9ja19waV9hdG9taWMoKSAtIGF0b21pYyB3b3JrIHJlcXVpcmVkIHRvIGFjcXVpcmUgYSBwaSBhd2FyZSBmdXRleAorICogQHVhZGRyOgkJdGhlIHBpIGZ1dGV4IHVzZXIgYWRkcmVzcworICogQGhiOgkJCXRoZSBwaSBmdXRleCBoYXNoIGJ1Y2tldAorICogQGtleToJCXRoZSBmdXRleCBrZXkgYXNzb2NpYXRlZCB3aXRoIHVhZGRyIGFuZCBoYgorICogQHBzOgkJCXRoZSBwaV9zdGF0ZSBwb2ludGVyIHdoZXJlIHdlIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlCisgKgkJCWxvb2t1cAorICogQHRhc2s6CQl0aGUgdGFzayB0byBwZXJmb3JtIHRoZSBhdG9taWMgbG9jayB3b3JrIGZvci4gIFRoaXMgd2lsbAorICoJCQliZSAiY3VycmVudCIgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHJlcXVldWUgcGkuCisgKiBAc2V0X3dhaXRlcnM6CWZvcmNlIHNldHRpbmcgdGhlIEZVVEVYX1dBSVRFUlMgYml0ICgxKSBvciBub3QgKDApCisgKgorICogUmV0dXJuczoKKyAqICAwIC0gcmVhZHkgdG8gd2FpdAorICogIDEgLSBhY3F1aXJlZCB0aGUgbG9jaworICogPDAgLSBlcnJvcgorICoKKyAqIFRoZSBoYi0+bG9jayBhbmQgZnV0ZXhfa2V5IHJlZnMgc2hhbGwgYmUgaGVsZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgaW50IGZ1dGV4X2xvY2tfcGlfYXRvbWljKHUzMiBfX3VzZXIgKnVhZGRyLCBzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiLAorCQkJCXVuaW9uIGZ1dGV4X2tleSAqa2V5LAorCQkJCXN0cnVjdCBmdXRleF9waV9zdGF0ZSAqKnBzLAorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHNldF93YWl0ZXJzKQoreworCWludCBsb2NrX3Rha2VuLCByZXQsIG93bmVyZGllZCA9IDA7CisJdTMyIHV2YWwsIG5ld3ZhbCwgY3VydmFsOworCityZXRyeToKKwlyZXQgPSBsb2NrX3Rha2VuID0gMDsKKworCS8qCisJICogVG8gYXZvaWQgcmFjZXMsIHdlIGF0dGVtcHQgdG8gdGFrZSB0aGUgbG9jayBoZXJlIGFnYWluCisJICogKGJ5IGRvaW5nIGEgMCAtPiBUSUQgYXRvbWljIGNtcHhjaGcpLCB3aGlsZSBob2xkaW5nIGFsbAorCSAqIHRoZSBsb2Nrcy4gSXQgd2lsbCBtb3N0IGxpa2VseSBub3Qgc3VjY2VlZC4KKwkgKi8KKwluZXd2YWwgPSB0YXNrX3BpZF92bnIodGFzayk7CisJaWYgKHNldF93YWl0ZXJzKQorCQluZXd2YWwgfD0gRlVURVhfV0FJVEVSUzsKKworCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCAwLCBuZXd2YWwpOworCisJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKgorCSAqIERldGVjdCBkZWFkbG9ja3MuCisJICovCisJaWYgKCh1bmxpa2VseSgoY3VydmFsICYgRlVURVhfVElEX01BU0spID09IHRhc2tfcGlkX3Zucih0YXNrKSkpKQorCQlyZXR1cm4gLUVERUFETEs7CisKKwkvKgorCSAqIFN1cnByaXNlIC0gd2UgZ290IHRoZSBsb2NrLiBKdXN0IHJldHVybiB0byB1c2Vyc3BhY2U6CisJICovCisJaWYgKHVubGlrZWx5KCFjdXJ2YWwpKQorCQlyZXR1cm4gMTsKKworCXV2YWwgPSBjdXJ2YWw7CisKKwkvKgorCSAqIFNldCB0aGUgRlVURVhfV0FJVEVSUyBmbGFnLCBzbyB0aGUgb3duZXIgd2lsbCBrbm93IGl0IGhhcyBzb21lb25lCisJICogdG8gd2FrZSBhdCB0aGUgbmV4dCB1bmxvY2suCisJICovCisJbmV3dmFsID0gY3VydmFsIHwgRlVURVhfV0FJVEVSUzsKKworCS8qCisJICogVGhlcmUgYXJlIHR3byBjYXNlcywgd2hlcmUgYSBmdXRleCBtaWdodCBoYXZlIG5vIG93bmVyICh0aGUKKwkgKiBvd25lciBUSUQgaXMgMCk6IE9XTkVSX0RJRUQuIFdlIHRha2Ugb3ZlciB0aGUgZnV0ZXggaW4gdGhpcworCSAqIGNhc2UuIFdlIGFsc28gZG8gYW4gdW5jb25kaXRpb25hbCB0YWtlIG92ZXIsIHdoZW4gdGhlIG93bmVyCisJICogb2YgdGhlIGZ1dGV4IGRpZWQuCisJICoKKwkgKiBUaGlzIGlzIHNhZmUgYXMgd2UgYXJlIHByb3RlY3RlZCBieSB0aGUgaGFzaCBidWNrZXQgbG9jayAhCisJICovCisJaWYgKHVubGlrZWx5KG93bmVyZGllZCB8fCAhKGN1cnZhbCAmIEZVVEVYX1RJRF9NQVNLKSkpIHsKKwkJLyogS2VlcCB0aGUgT1dORVJfRElFRCBiaXQgKi8KKwkJbmV3dmFsID0gKGN1cnZhbCAmIH5GVVRFWF9USURfTUFTSykgfCB0YXNrX3BpZF92bnIodGFzayk7CisJCW93bmVyZGllZCA9IDA7CisJCWxvY2tfdGFrZW4gPSAxOworCX0KKworCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCBuZXd2YWwpOworCisJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHVubGlrZWx5KGN1cnZhbCAhPSB1dmFsKSkKKwkJZ290byByZXRyeTsKKworCS8qCisJICogV2UgdG9vayB0aGUgbG9jayBkdWUgdG8gb3duZXIgZGllZCB0YWtlIG92ZXIuCisJICovCisJaWYgKHVubGlrZWx5KGxvY2tfdGFrZW4pKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogV2UgZG9udCBoYXZlIHRoZSBsb2NrLiBMb29rIHVwIHRoZSBQSSBzdGF0ZSAob3IgY3JlYXRlIGl0IGlmCisJICogd2UgYXJlIHRoZSBmaXJzdCB3YWl0ZXIpOgorCSAqLworCXJldCA9IGxvb2t1cF9waV9zdGF0ZSh1dmFsLCBoYiwga2V5LCBwcyk7CisKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIC1FU1JDSDoKKwkJCS8qCisJCQkgKiBObyBvd25lciBmb3VuZCBmb3IgdGhpcyBmdXRleC4gQ2hlY2sgaWYgdGhlCisJCQkgKiBPV05FUl9ESUVEIGJpdCBpcyBzZXQgdG8gZmlndXJlIG91dCB3aGV0aGVyCisJCQkgKiB0aGlzIGlzIGEgcm9idXN0IGZ1dGV4IG9yIG5vdC4KKwkJCSAqLworCQkJaWYgKGdldF9mdXRleF92YWx1ZV9sb2NrZWQoJmN1cnZhbCwgdWFkZHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkvKgorCQkJICogV2Ugc2ltcGx5IHN0YXJ0IG92ZXIgaW4gY2FzZSBvZiBhIHJvYnVzdAorCQkJICogZnV0ZXguIFRoZSBjb2RlIGFib3ZlIHdpbGwgdGFrZSB0aGUgZnV0ZXgKKwkJCSAqIGFuZCByZXR1cm4gaGFwcHkuCisJCQkgKi8KKwkJCWlmIChjdXJ2YWwgJiBGVVRFWF9PV05FUl9ESUVEKSB7CisJCQkJb3duZXJkaWVkID0gMTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogVGhlIGhhc2ggYnVja2V0IGxvY2sgbXVzdCBiZSBoZWxkIHdoZW4gdGhpcyBpcyBjYWxsZWQuCiAgKiBBZnRlcndhcmRzLCB0aGUgZnV0ZXhfcSBtdXN0IG5vdCBiZSBhY2Nlc3NlZC4KICAqLwogc3RhdGljIHZvaWQgd2FrZV9mdXRleChzdHJ1Y3QgZnV0ZXhfcSAqcSkKIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBxLT50YXNrOworCisJLyoKKwkgKiBXZSBzZXQgcS0+bG9ja19wdHIgPSBOVUxMIF9iZWZvcmVfIHdlIHdha2UgdXAgdGhlIHRhc2suIElmCisJICogYSBub24gZnV0ZXggd2FrZSB1cCBoYXBwZW5zIG9uIGFub3RoZXIgQ1BVIHRoZW4gdGhlIHRhc2sKKwkgKiBtaWdodCBleGl0IGFuZCBwIHdvdWxkIGRlcmVmZXJlbmNlIGEgbm9uIGV4aXN0aW5nIHRhc2sKKwkgKiBzdHJ1Y3QuIFByZXZlbnQgdGhpcyBieSBob2xkaW5nIGEgcmVmZXJlbmNlIG9uIHAgYWNyb3NzIHRoZQorCSAqIHdha2UgdXAuCisJICovCisJZ2V0X3Rhc2tfc3RydWN0KHApOworCiAJcGxpc3RfZGVsKCZxLT5saXN0LCAmcS0+bGlzdC5wbGlzdCk7CiAJLyoKLQkgKiBUaGUgbG9jayBpbiB3YWtlX3VwX2FsbCgpIGlzIGEgY3J1Y2lhbCBtZW1vcnkgYmFycmllciBhZnRlciB0aGUKLQkgKiBwbGlzdF9kZWwoKSBhbmQgYWxzbyBiZWZvcmUgYXNzaWduaW5nIHRvIHEtPmxvY2tfcHRyLgotCSAqLwotCXdha2VfdXAoJnEtPndhaXRlcik7Ci0JLyoKLQkgKiBUaGUgd2FpdGluZyB0YXNrIGNhbiBmcmVlIHRoZSBmdXRleF9xIGFzIHNvb24gYXMgdGhpcyBpcyB3cml0dGVuLAotCSAqIHdpdGhvdXQgdGFraW5nIGFueSBsb2Nrcy4gIFRoaXMgbXVzdCBjb21lIGxhc3QuCi0JICoKLQkgKiBBIG1lbW9yeSBiYXJyaWVyIGlzIHJlcXVpcmVkIGhlcmUgdG8gcHJldmVudCB0aGUgZm9sbG93aW5nIHN0b3JlIHRvCi0JICogbG9ja19wdHIgZnJvbSBnZXR0aW5nIGFoZWFkIG9mIHRoZSB3YWtldXAuIENsZWFyaW5nIHRoZSBsb2NrIGF0IHRoZQotCSAqIGVuZCBvZiB3YWtlX3VwKCkgZG9lcyBub3QgcHJldmVudCB0aGlzIHN0b3JlIGZyb20gbW92aW5nLgorCSAqIFRoZSB3YWl0aW5nIHRhc2sgY2FuIGZyZWUgdGhlIGZ1dGV4X3EgYXMgc29vbiBhcworCSAqIHEtPmxvY2tfcHRyID0gTlVMTCBpcyB3cml0dGVuLCB3aXRob3V0IHRha2luZyBhbnkgbG9ja3MuIEEKKwkgKiBtZW1vcnkgYmFycmllciBpcyByZXF1aXJlZCBoZXJlIHRvIHByZXZlbnQgdGhlIGZvbGxvd2luZworCSAqIHN0b3JlIHRvIGxvY2tfcHRyIGZyb20gZ2V0dGluZyBhaGVhZCBvZiB0aGUgcGxpc3RfZGVsLgogCSAqLwogCXNtcF93bWIoKTsKIAlxLT5sb2NrX3B0ciA9IE5VTEw7CisKKwl3YWtlX3VwX3N0YXRlKHAsIFRBU0tfTk9STUFMKTsKKwlwdXRfdGFza19zdHJ1Y3QocCk7CiB9CiAKIHN0YXRpYyBpbnQgd2FrZV9mdXRleF9waSh1MzIgX191c2VyICp1YWRkciwgdTMyIHV2YWwsIHN0cnVjdCBmdXRleF9xICp0aGlzKQpAQCAtNjg5LDcgKzg0Niw3IEBACiAKIAlwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRoaXMsIG5leHQsIGhlYWQsIGxpc3QpIHsKIAkJaWYgKG1hdGNoX2Z1dGV4ICgmdGhpcy0+a2V5LCAma2V5KSkgewotCQkJaWYgKHRoaXMtPnBpX3N0YXRlKSB7CisJCQlpZiAodGhpcy0+cGlfc3RhdGUgfHwgdGhpcy0+cnRfd2FpdGVyKSB7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTgwMiwyNCArOTU5LDE4NSBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBSZXF1ZXVlIGFsbCB3YWl0ZXJzIGhhc2hlZCBvbiBvbmUgcGh5c2ljYWwgcGFnZSB0byBhbm90aGVyCi0gKiBwaHlzaWNhbCBwYWdlLgorLyoqCisgKiByZXF1ZXVlX2Z1dGV4KCkgLSBSZXF1ZXVlIGEgZnV0ZXhfcSBmcm9tIG9uZSBoYiB0byBhbm90aGVyCisgKiBAcToJCXRoZSBmdXRleF9xIHRvIHJlcXVldWUKKyAqIEBoYjE6CXRoZSBzb3VyY2UgaGFzaF9idWNrZXQKKyAqIEBoYjI6CXRoZSB0YXJnZXQgaGFzaF9idWNrZXQKKyAqIEBrZXkyOgl0aGUgbmV3IGtleSBmb3IgdGhlIHJlcXVldWVkIGZ1dGV4X3EKKyAqLworc3RhdGljIGlubGluZQordm9pZCByZXF1ZXVlX2Z1dGV4KHN0cnVjdCBmdXRleF9xICpxLCBzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiMSwKKwkJICAgc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjIsIHVuaW9uIGZ1dGV4X2tleSAqa2V5MikKK3sKKworCS8qCisJICogSWYga2V5MSBhbmQga2V5MiBoYXNoIHRvIHRoZSBzYW1lIGJ1Y2tldCwgbm8gbmVlZCB0bworCSAqIHJlcXVldWUuCisJICovCisJaWYgKGxpa2VseSgmaGIxLT5jaGFpbiAhPSAmaGIyLT5jaGFpbikpIHsKKwkJcGxpc3RfZGVsKCZxLT5saXN0LCAmaGIxLT5jaGFpbik7CisJCXBsaXN0X2FkZCgmcS0+bGlzdCwgJmhiMi0+Y2hhaW4pOworCQlxLT5sb2NrX3B0ciA9ICZoYjItPmxvY2s7CisjaWZkZWYgQ09ORklHX0RFQlVHX1BJX0xJU1QKKwkJcS0+bGlzdC5wbGlzdC5sb2NrID0gJmhiMi0+bG9jazsKKyNlbmRpZgorCX0KKwlnZXRfZnV0ZXhfa2V5X3JlZnMoa2V5Mik7CisJcS0+a2V5ID0gKmtleTI7Cit9CisKKy8qKgorICogcmVxdWV1ZV9waV93YWtlX2Z1dGV4KCkgLSBXYWtlIGEgdGFzayB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrIGR1cmluZyByZXF1ZXVlCisgKiBxOgl0aGUgZnV0ZXhfcQorICoga2V5Ogl0aGUga2V5IG9mIHRoZSByZXF1ZXVlIHRhcmdldCBmdXRleAorICoKKyAqIER1cmluZyBmdXRleF9yZXF1ZXVlLCB3aXRoIHJlcXVldWVfcGk9MSwgaXQgaXMgcG9zc2libGUgdG8gYWNxdWlyZSB0aGUKKyAqIHRhcmdldCBmdXRleCBpZiBpdCBpcyB1bmNvbnRlbmRlZCBvciB2aWEgYSBsb2NrIHN0ZWFsLiAgU2V0IHRoZSBmdXRleF9xIGtleQorICogdG8gdGhlIHJlcXVldWUgdGFyZ2V0IGZ1dGV4IHNvIHRoZSB3YWl0ZXIgY2FuIGRldGVjdCB0aGUgd2FrZXVwIG9uIHRoZSByaWdodAorICogZnV0ZXgsIGJ1dCByZW1vdmUgaXQgZnJvbSB0aGUgaGIgYW5kIE5VTEwgdGhlIHJ0X3dhaXRlciBzbyBpdCBjYW4gZGV0ZWN0CisgKiBhdG9taWMgbG9jayBhY3F1aXNpdGlvbi4gIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHEtPmxvY2tfcHRyIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgcmVxdWV1ZV9waV93YWtlX2Z1dGV4KHN0cnVjdCBmdXRleF9xICpxLCB1bmlvbiBmdXRleF9rZXkgKmtleSkKK3sKKwlkcm9wX2Z1dGV4X2tleV9yZWZzKCZxLT5rZXkpOworCWdldF9mdXRleF9rZXlfcmVmcyhrZXkpOworCXEtPmtleSA9ICprZXk7CisKKwlXQVJOX09OKHBsaXN0X25vZGVfZW1wdHkoJnEtPmxpc3QpKTsKKwlwbGlzdF9kZWwoJnEtPmxpc3QsICZxLT5saXN0LnBsaXN0KTsKKworCVdBUk5fT04oIXEtPnJ0X3dhaXRlcik7CisJcS0+cnRfd2FpdGVyID0gTlVMTDsKKworCXdha2VfdXBfc3RhdGUocS0+dGFzaywgVEFTS19OT1JNQUwpOworfQorCisvKioKKyAqIGZ1dGV4X3Byb3h5X3RyeWxvY2tfYXRvbWljKCkgLSBBdHRlbXB0IGFuIGF0b21pYyBsb2NrIGZvciB0aGUgdG9wIHdhaXRlcgorICogQHBpZnV0ZXg6CQl0aGUgdXNlciBhZGRyZXNzIG9mIHRoZSB0byBmdXRleAorICogQGhiMToJCXRoZSBmcm9tIGZ1dGV4IGhhc2ggYnVja2V0LCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyCisgKiBAaGIyOgkJdGhlIHRvIGZ1dGV4IGhhc2ggYnVja2V0LCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyCisgKiBAa2V5MToJCXRoZSBmcm9tIGZ1dGV4IGtleQorICogQGtleTI6CQl0aGUgdG8gZnV0ZXgga2V5CisgKiBAcHM6CQkJYWRkcmVzcyB0byBzdG9yZSB0aGUgcGlfc3RhdGUgcG9pbnRlcgorICogQHNldF93YWl0ZXJzOglmb3JjZSBzZXR0aW5nIHRoZSBGVVRFWF9XQUlURVJTIGJpdCAoMSkgb3Igbm90ICgwKQorICoKKyAqIFRyeSBhbmQgZ2V0IHRoZSBsb2NrIG9uIGJlaGFsZiBvZiB0aGUgdG9wIHdhaXRlciBpZiB3ZSBjYW4gZG8gaXQgYXRvbWljYWxseS4KKyAqIFdha2UgdGhlIHRvcCB3YWl0ZXIgaWYgd2Ugc3VjY2VlZC4gIElmIHRoZSBjYWxsZXIgc3BlY2lmaWVkIHNldF93YWl0ZXJzLAorICogdGhlbiBkaXJlY3QgZnV0ZXhfbG9ja19waV9hdG9taWMoKSB0byBmb3JjZSBzZXR0aW5nIHRoZSBGVVRFWF9XQUlURVJTIGJpdC4KKyAqIGhiMSBhbmQgaGIyIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgMCAtIGZhaWxlZCB0byBhY3F1aXJlIHRoZSBsb2NrIGF0b21pY2x5CisgKiAgMSAtIGFjcXVpcmVkIHRoZSBsb2NrCisgKiA8MCAtIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZnV0ZXhfcHJveHlfdHJ5bG9ja19hdG9taWModTMyIF9fdXNlciAqcGlmdXRleCwKKwkJCQkgc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjEsCisJCQkJIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIyLAorCQkJCSB1bmlvbiBmdXRleF9rZXkgKmtleTEsIHVuaW9uIGZ1dGV4X2tleSAqa2V5MiwKKwkJCQkgc3RydWN0IGZ1dGV4X3BpX3N0YXRlICoqcHMsIGludCBzZXRfd2FpdGVycykKK3sKKwlzdHJ1Y3QgZnV0ZXhfcSAqdG9wX3dhaXRlciA9IE5VTEw7CisJdTMyIGN1cnZhbDsKKwlpbnQgcmV0OworCisJaWYgKGdldF9mdXRleF92YWx1ZV9sb2NrZWQoJmN1cnZhbCwgcGlmdXRleCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBGaW5kIHRoZSB0b3Bfd2FpdGVyIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgd2FpdGVycy4KKwkgKiBJZiB0aGUgY2FsbGVyIGludGVuZHMgdG8gcmVxdWV1ZSBtb3JlIHRoYW4gMSB3YWl0ZXIgdG8gcGlmdXRleCwKKwkgKiBmb3JjZSBmdXRleF9sb2NrX3BpX2F0b21pYygpIHRvIHNldCB0aGUgRlVURVhfV0FJVEVSUyBiaXQgbm93LAorCSAqIGFzIHdlIGhhdmUgbWVhbnMgdG8gaGFuZGxlIHRoZSBwb3NzaWJsZSBmYXVsdC4gIElmIG5vdCwgZG9uJ3Qgc2V0CisJICogdGhlIGJpdCB1bmVjZXNzYXJpbHkgYXMgaXQgd2lsbCBmb3JjZSB0aGUgc3Vic2VxdWVudCB1bmxvY2sgdG8gZW50ZXIKKwkgKiB0aGUga2VybmVsLgorCSAqLworCXRvcF93YWl0ZXIgPSBmdXRleF90b3Bfd2FpdGVyKGhiMSwga2V5MSk7CisKKwkvKiBUaGVyZSBhcmUgbm8gd2FpdGVycywgbm90aGluZyBmb3IgdXMgdG8gZG8uICovCisJaWYgKCF0b3Bfd2FpdGVyKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVHJ5IHRvIHRha2UgdGhlIGxvY2sgZm9yIHRvcF93YWl0ZXIuICBTZXQgdGhlIEZVVEVYX1dBSVRFUlMgYml0IGluCisJICogdGhlIGNvbnRlbmRlZCBjYXNlIG9yIGlmIHNldF93YWl0ZXJzIGlzIDEuICBUaGUgcGlfc3RhdGUgaXMgcmV0dXJuZWQKKwkgKiBpbiBwcyBpbiBjb250ZW5kZWQgY2FzZXMuCisJICovCisJcmV0ID0gZnV0ZXhfbG9ja19waV9hdG9taWMocGlmdXRleCwgaGIyLCBrZXkyLCBwcywgdG9wX3dhaXRlci0+dGFzaywKKwkJCQkgICBzZXRfd2FpdGVycyk7CisJaWYgKHJldCA9PSAxKQorCQlyZXF1ZXVlX3BpX3dha2VfZnV0ZXgodG9wX3dhaXRlciwga2V5Mik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGZ1dGV4X3JlcXVldWUoKSAtIFJlcXVldWUgd2FpdGVycyBmcm9tIHVhZGRyMSB0byB1YWRkcjIKKyAqIHVhZGRyMToJc291cmNlIGZ1dGV4IHVzZXIgYWRkcmVzcworICogdWFkZHIyOgl0YXJnZXQgZnV0ZXggdXNlciBhZGRyZXNzCisgKiBucl93YWtlOgludW1iZXIgb2Ygd2FpdGVycyB0byB3YWtlIChtdXN0IGJlIDEgZm9yIHJlcXVldWVfcGkpCisgKiBucl9yZXF1ZXVlOgludW1iZXIgb2Ygd2FpdGVycyB0byByZXF1ZXVlICgwLUlOVF9NQVgpCisgKiByZXF1ZXVlX3BpOglpZiB3ZSBhcmUgYXR0ZW1wdGluZyB0byByZXF1ZXVlIGZyb20gYSBub24tcGkgZnV0ZXggdG8gYQorICogCQlwaSBmdXRleCAocGkgdG8gcGkgcmVxdWV1ZSBpcyBub3Qgc3VwcG9ydGVkKQorICoKKyAqIFJlcXVldWUgd2FpdGVycyBvbiB1YWRkcjEgdG8gdWFkZHIyLiBJbiB0aGUgcmVxdWV1ZV9waSBjYXNlLCB0cnkgdG8gYWNxdWlyZQorICogdWFkZHIyIGF0b21pY2FsbHkgb24gYmVoYWxmIG9mIHRoZSB0b3Agd2FpdGVyLgorICoKKyAqIFJldHVybnM6CisgKiA+PTAgLSBvbiBzdWNjZXNzLCB0aGUgbnVtYmVyIG9mIHRhc2tzIHJlcXVldWVkIG9yIHdva2VuCisgKiAgPDAgLSBvbiBlcnJvcgogICovCiBzdGF0aWMgaW50IGZ1dGV4X3JlcXVldWUodTMyIF9fdXNlciAqdWFkZHIxLCBpbnQgZnNoYXJlZCwgdTMyIF9fdXNlciAqdWFkZHIyLAotCQkJIGludCBucl93YWtlLCBpbnQgbnJfcmVxdWV1ZSwgdTMyICpjbXB2YWwpCisJCQkgaW50IG5yX3dha2UsIGludCBucl9yZXF1ZXVlLCB1MzIgKmNtcHZhbCwKKwkJCSBpbnQgcmVxdWV1ZV9waSkKIHsKIAl1bmlvbiBmdXRleF9rZXkga2V5MSA9IEZVVEVYX0tFWV9JTklULCBrZXkyID0gRlVURVhfS0VZX0lOSVQ7CisJaW50IGRyb3BfY291bnQgPSAwLCB0YXNrX2NvdW50ID0gMCwgcmV0OworCXN0cnVjdCBmdXRleF9waV9zdGF0ZSAqcGlfc3RhdGUgPSBOVUxMOwogCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIxLCAqaGIyOwogCXN0cnVjdCBwbGlzdF9oZWFkICpoZWFkMTsKIAlzdHJ1Y3QgZnV0ZXhfcSAqdGhpcywgKm5leHQ7Ci0JaW50IHJldCwgZHJvcF9jb3VudCA9IDA7CisJdTMyIGN1cnZhbDI7CisKKwlpZiAocmVxdWV1ZV9waSkgeworCQkvKgorCQkgKiByZXF1ZXVlX3BpIHJlcXVpcmVzIGEgcGlfc3RhdGUsIHRyeSB0byBhbGxvY2F0ZSBpdCBub3cKKwkJICogd2l0aG91dCBhbnkgbG9ja3MgaW4gY2FzZSBpdCBmYWlscy4KKwkJICovCisJCWlmIChyZWZpbGxfcGlfc3RhdGVfY2FjaGUoKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkvKgorCQkgKiByZXF1ZXVlX3BpIG11c3Qgd2FrZSBhcyBtYW55IHRhc2tzIGFzIGl0IGNhbiwgdXAgdG8gbnJfd2FrZQorCQkgKiArIG5yX3JlcXVldWUsIHNpbmNlIGl0IGFjcXVpcmVzIHRoZSBydF9tdXRleCBwcmlvciB0bworCQkgKiByZXR1cm5pbmcgdG8gdXNlcnNwYWNlLCBzbyBhcyB0byBub3QgbGVhdmUgdGhlIHJ0X211dGV4IHdpdGgKKwkJICogd2FpdGVycyBhbmQgbm8gb3duZXIuICBIb3dldmVyLCBzZWNvbmQgYW5kIHRoaXJkIHdha2UtdXBzCisJCSAqIGNhbm5vdCBiZSBwcmVkaWN0ZWQgYXMgdGhleSBpbnZvbHZlIHJhY2UgY29uZGl0aW9ucyB3aXRoIHRoZQorCQkgKiBmaXJzdCB3YWtlIGFuZCBhIGZhdWx0IHdoaWxlIGxvb2tpbmcgdXAgdGhlIHBpX3N0YXRlLiAgQm90aAorCQkgKiBwdGhyZWFkX2NvbmRfc2lnbmFsKCkgYW5kIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoKSBzaG91bGQKKwkJICogdXNlIG5yX3dha2U9MS4KKwkJICovCisJCWlmIChucl93YWtlICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIHJldHJ5OgorCWlmIChwaV9zdGF0ZSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFdlIHdpbGwgaGF2ZSB0byBsb29rdXAgdGhlIHBpX3N0YXRlIGFnYWluLCBzbyBmcmVlIHRoaXMgb25lCisJCSAqIHRvIGtlZXAgdGhlIGFjY291bnRpbmcgY29ycmVjdC4KKwkJICovCisJCWZyZWVfcGlfc3RhdGUocGlfc3RhdGUpOworCQlwaV9zdGF0ZSA9IE5VTEw7CisJfQorCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZzaGFyZWQsICZrZXkxLCBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZzaGFyZWQsICZrZXkyLCBWRVJJRllfUkVBRCk7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZzaGFyZWQsICZrZXkyLAorCQkJICAgIHJlcXVldWVfcGkgPyBWRVJJRllfV1JJVEUgOiBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXRfcHV0X2tleTE7CiAKQEAgLTg1NCwzMiArMTE3Miw5OSBAQAogCQl9CiAJfQogCisJaWYgKHJlcXVldWVfcGkgJiYgKHRhc2tfY291bnQgLSBucl93YWtlIDwgbnJfcmVxdWV1ZSkpIHsKKwkJLyoKKwkJICogQXR0ZW1wdCB0byBhY3F1aXJlIHVhZGRyMiBhbmQgd2FrZSB0aGUgdG9wIHdhaXRlci4gSWYgd2UKKwkJICogaW50ZW5kIHRvIHJlcXVldWUgd2FpdGVycywgZm9yY2Ugc2V0dGluZyB0aGUgRlVURVhfV0FJVEVSUworCQkgKiBiaXQuICBXZSBmb3JjZSB0aGlzIGhlcmUgd2hlcmUgd2UgYXJlIGFibGUgdG8gZWFzaWx5IGhhbmRsZQorCQkgKiBmYXVsdHMgcmF0aGVyIGluIHRoZSByZXF1ZXVlIGxvb3AgYmVsb3cuCisJCSAqLworCQlyZXQgPSBmdXRleF9wcm94eV90cnlsb2NrX2F0b21pYyh1YWRkcjIsIGhiMSwgaGIyLCAma2V5MSwKKwkJCQkJCSAma2V5MiwgJnBpX3N0YXRlLCBucl9yZXF1ZXVlKTsKKworCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50IHRoZSB0b3Bfd2FpdGVyIGhhcyBlaXRoZXIgdGFrZW4gdWFkZHIyIG9yIGlzCisJCSAqIHdhaXRpbmcgb24gaXQuICBJZiB0aGUgZm9ybWVyLCB0aGVuIHRoZSBwaV9zdGF0ZSB3aWxsIG5vdAorCQkgKiBleGlzdCB5ZXQsIGxvb2sgaXQgdXAgb25lIG1vcmUgdGltZSB0byBlbnN1cmUgd2UgaGF2ZSBhCisJCSAqIHJlZmVyZW5jZSB0byBpdC4KKwkJICovCisJCWlmIChyZXQgPT0gMSkgeworCQkJV0FSTl9PTihwaV9zdGF0ZSk7CisJCQl0YXNrX2NvdW50Kys7CisJCQlyZXQgPSBnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKCZjdXJ2YWwyLCB1YWRkcjIpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gbG9va3VwX3BpX3N0YXRlKGN1cnZhbDIsIGhiMiwgJmtleTIsCisJCQkJCQkgICAgICAmcGlfc3RhdGUpOworCQl9CisKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgLUVGQVVMVDoKKwkJCWRvdWJsZV91bmxvY2tfaGIoaGIxLCBoYjIpOworCQkJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5Mik7CisJCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkxKTsKKwkJCXJldCA9IGdldF91c2VyKGN1cnZhbDIsIHVhZGRyMik7CisJCQlpZiAoIXJldCkKKwkJCQlnb3RvIHJldHJ5OworCQkJZ290byBvdXQ7CisJCWNhc2UgLUVBR0FJTjoKKwkJCS8qIFRoZSBvd25lciB3YXMgZXhpdGluZywgdHJ5IGFnYWluLiAqLworCQkJZG91YmxlX3VubG9ja19oYihoYjEsIGhiMik7CisJCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkyKTsKKwkJCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleTEpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlnb3RvIHJldHJ5OworCQlkZWZhdWx0OgorCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCiAJaGVhZDEgPSAmaGIxLT5jaGFpbjsKIAlwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRoaXMsIG5leHQsIGhlYWQxLCBsaXN0KSB7Ci0JCWlmICghbWF0Y2hfZnV0ZXggKCZ0aGlzLT5rZXksICZrZXkxKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKytyZXQgPD0gbnJfd2FrZSkgewotCQkJd2FrZV9mdXRleCh0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJZiBrZXkxIGFuZCBrZXkyIGhhc2ggdG8gdGhlIHNhbWUgYnVja2V0LCBubyBuZWVkIHRvCi0JCQkgKiByZXF1ZXVlLgotCQkJICovCi0JCQlpZiAobGlrZWx5KGhlYWQxICE9ICZoYjItPmNoYWluKSkgewotCQkJCXBsaXN0X2RlbCgmdGhpcy0+bGlzdCwgJmhiMS0+Y2hhaW4pOwotCQkJCXBsaXN0X2FkZCgmdGhpcy0+bGlzdCwgJmhiMi0+Y2hhaW4pOwotCQkJCXRoaXMtPmxvY2tfcHRyID0gJmhiMi0+bG9jazsKLSNpZmRlZiBDT05GSUdfREVCVUdfUElfTElTVAotCQkJCXRoaXMtPmxpc3QucGxpc3QubG9jayA9ICZoYjItPmxvY2s7Ci0jZW5kaWYKLQkJCX0KLQkJCXRoaXMtPmtleSA9IGtleTI7Ci0JCQlnZXRfZnV0ZXhfa2V5X3JlZnMoJmtleTIpOwotCQkJZHJvcF9jb3VudCsrOworCQlpZiAodGFza19jb3VudCAtIG5yX3dha2UgPj0gbnJfcmVxdWV1ZSkKKwkJCWJyZWFrOwogCi0JCQlpZiAocmV0IC0gbnJfd2FrZSA+PSBucl9yZXF1ZXVlKQotCQkJCWJyZWFrOworCQlpZiAoIW1hdGNoX2Z1dGV4KCZ0aGlzLT5rZXksICZrZXkxKSkKKwkJCWNvbnRpbnVlOworCisJCVdBUk5fT04oIXJlcXVldWVfcGkgJiYgdGhpcy0+cnRfd2FpdGVyKTsKKwkJV0FSTl9PTihyZXF1ZXVlX3BpICYmICF0aGlzLT5ydF93YWl0ZXIpOworCisJCS8qCisJCSAqIFdha2UgbnJfd2FrZSB3YWl0ZXJzLiAgRm9yIHJlcXVldWVfcGksIGlmIHdlIGFjcXVpcmVkIHRoZQorCQkgKiBsb2NrLCB3ZSBhbHJlYWR5IHdva2UgdGhlIHRvcF93YWl0ZXIuICBJZiBub3QsIGl0IHdpbGwgYmUKKwkJICogd29rZW4gYnkgZnV0ZXhfdW5sb2NrX3BpKCkuCisJCSAqLworCQlpZiAoKyt0YXNrX2NvdW50IDw9IG5yX3dha2UgJiYgIXJlcXVldWVfcGkpIHsKKwkJCXdha2VfZnV0ZXgodGhpcyk7CisJCQljb250aW51ZTsKIAkJfQorCisJCS8qCisJCSAqIFJlcXVldWUgbnJfcmVxdWV1ZSB3YWl0ZXJzIGFuZCBwb3NzaWJseSBvbmUgbW9yZSBpbiB0aGUgY2FzZQorCQkgKiBvZiByZXF1ZXVlX3BpIGlmIHdlIGNvdWxkbid0IGFjcXVpcmUgdGhlIGxvY2sgYXRvbWljYWxseS4KKwkJICovCisJCWlmIChyZXF1ZXVlX3BpKSB7CisJCQkvKiBQcmVwYXJlIHRoZSB3YWl0ZXIgdG8gdGFrZSB0aGUgcnRfbXV0ZXguICovCisJCQlhdG9taWNfaW5jKCZwaV9zdGF0ZS0+cmVmY291bnQpOworCQkJdGhpcy0+cGlfc3RhdGUgPSBwaV9zdGF0ZTsKKwkJCXJldCA9IHJ0X211dGV4X3N0YXJ0X3Byb3h5X2xvY2soJnBpX3N0YXRlLT5waV9tdXRleCwKKwkJCQkJCQl0aGlzLT5ydF93YWl0ZXIsCisJCQkJCQkJdGhpcy0+dGFzaywgMSk7CisJCQlpZiAocmV0ID09IDEpIHsKKwkJCQkvKiBXZSBnb3QgdGhlIGxvY2suICovCisJCQkJcmVxdWV1ZV9waV93YWtlX2Z1dGV4KHRoaXMsICZrZXkyKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAocmV0KSB7CisJCQkJLyogLUVERUFETEsgKi8KKwkJCQl0aGlzLT5waV9zdGF0ZSA9IE5VTEw7CisJCQkJZnJlZV9waV9zdGF0ZShwaV9zdGF0ZSk7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQl9CisJCXJlcXVldWVfZnV0ZXgodGhpcywgaGIxLCBoYjIsICZrZXkyKTsKKwkJZHJvcF9jb3VudCsrOwogCX0KIAogb3V0X3VubG9jazoKQEAgLTg5OSw3ICsxMjg0LDkgQEAKIG91dF9wdXRfa2V5MToKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkxKTsKIG91dDoKLQlyZXR1cm4gcmV0OworCWlmIChwaV9zdGF0ZSAhPSBOVUxMKQorCQlmcmVlX3BpX3N0YXRlKHBpX3N0YXRlKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogdGFza19jb3VudDsKIH0KIAogLyogVGhlIGtleSBtdXN0IGJlIGFscmVhZHkgc3RvcmVkIGluIHEtPmtleS4gKi8KQEAgLTkwNyw4ICsxMjk0LDYgQEAKIHsKIAlzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiOwogCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+d2FpdGVyKTsKLQogCWdldF9mdXRleF9rZXlfcmVmcygmcS0+a2V5KTsKIAloYiA9IGhhc2hfZnV0ZXgoJnEtPmtleSk7CiAJcS0+bG9ja19wdHIgPSAmaGItPmxvY2s7CkBAIC0xMTE5LDM1ICsxNTA0LDE0OSBAQAogICovCiAjZGVmaW5lIEZMQUdTX1NIQVJFRAkJMHgwMQogI2RlZmluZSBGTEFHU19DTE9DS1JUCQkweDAyCisjZGVmaW5lIEZMQUdTX0hBU19USU1FT1VUCTB4MDQKIAogc3RhdGljIGxvbmcgZnV0ZXhfd2FpdF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KTsKIAotc3RhdGljIGludCBmdXRleF93YWl0KHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwKLQkJICAgICAgdTMyIHZhbCwga3RpbWVfdCAqYWJzX3RpbWUsIHUzMiBiaXRzZXQsIGludCBjbG9ja3J0KQorLyoqCisgKiBmaXh1cF9vd25lcigpIC0gUG9zdCBsb2NrIHBpX3N0YXRlIGFuZCBjb3JuZXIgY2FzZSBtYW5hZ2VtZW50CisgKiBAdWFkZHI6CXVzZXIgYWRkcmVzcyBvZiB0aGUgZnV0ZXgKKyAqIEBmc2hhcmVkOgl3aGV0aGVyIHRoZSBmdXRleCBpcyBzaGFyZWQgKDEpIG9yIG5vdCAoMCkKKyAqIEBxOgkJZnV0ZXhfcSAoY29udGFpbnMgcGlfc3RhdGUgYW5kIGFjY2VzcyB0byB0aGUgcnRfbXV0ZXgpCisgKiBAbG9ja2VkOglpZiB0aGUgYXR0ZW1wdCB0byB0YWtlIHRoZSBydF9tdXRleCBzdWNjZWVkZWQgKDEpIG9yIG5vdCAoMCkKKyAqCisgKiBBZnRlciBhdHRlbXB0aW5nIHRvIGxvY2sgYW4gcnRfbXV0ZXgsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsZWFudXAKKyAqIHRoZSBwaV9zdGF0ZSBvd25lciBhcyB3ZWxsIGFzIGhhbmRsZSByYWNlIGNvbmRpdGlvbnMgdGhhdCBtYXkgYWxsb3cgdXMgdG8KKyAqIGFjcXVpcmUgdGhlIGxvY2suIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGhiIGxvY2sgaGVsZC4KKyAqCisgKiBSZXR1cm5zOgorICogIDEgLSBzdWNjZXNzLCBsb2NrIHRha2VuCisgKiAgMCAtIHN1Y2Nlc3MsIGxvY2sgbm90IHRha2VuCisgKiA8MCAtIG9uIGVycm9yICgtRUZBVUxUKQorICovCitzdGF0aWMgaW50IGZpeHVwX293bmVyKHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwgc3RydWN0IGZ1dGV4X3EgKnEsCisJCSAgICAgICBpbnQgbG9ja2VkKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7Ci0Jc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQ7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3Vycik7Ci0Jc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjsKLQlzdHJ1Y3QgZnV0ZXhfcSBxOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAobG9ja2VkKSB7CisJCS8qCisJCSAqIEdvdCB0aGUgbG9jay4gV2UgbWlnaHQgbm90IGJlIHRoZSBhbnRpY2lwYXRlZCBvd25lciBpZiB3ZQorCQkgKiBkaWQgYSBsb2NrLXN0ZWFsIC0gZml4IHVwIHRoZSBQSS1zdGF0ZSBpbiB0aGF0IGNhc2U6CisJCSAqLworCQlpZiAocS0+cGlfc3RhdGUtPm93bmVyICE9IGN1cnJlbnQpCisJCQlyZXQgPSBmaXh1cF9waV9zdGF0ZV9vd25lcih1YWRkciwgcSwgY3VycmVudCwgZnNoYXJlZCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ2F0Y2ggdGhlIHJhcmUgY2FzZSwgd2hlcmUgdGhlIGxvY2sgd2FzIHJlbGVhc2VkIHdoZW4gd2Ugd2VyZSBvbiB0aGUKKwkgKiB3YXkgYmFjayBiZWZvcmUgd2UgbG9ja2VkIHRoZSBoYXNoIGJ1Y2tldC4KKwkgKi8KKwlpZiAocS0+cGlfc3RhdGUtPm93bmVyID09IGN1cnJlbnQpIHsKKwkJLyoKKwkJICogVHJ5IHRvIGdldCB0aGUgcnRfbXV0ZXggbm93LiBUaGlzIG1pZ2h0IGZhaWwgYXMgc29tZSBvdGhlcgorCQkgKiB0YXNrIGFjcXVpcmVkIHRoZSBydF9tdXRleCBhZnRlciB3ZSByZW1vdmVkIG91cnNlbGYgZnJvbSB0aGUKKwkJICogcnRfbXV0ZXggd2FpdGVycyBsaXN0LgorCQkgKi8KKwkJaWYgKHJ0X211dGV4X3RyeWxvY2soJnEtPnBpX3N0YXRlLT5waV9tdXRleCkpIHsKKwkJCWxvY2tlZCA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIHBpX3N0YXRlIGlzIGluY29ycmVjdCwgc29tZSBvdGhlciB0YXNrIGRpZCBhIGxvY2sgc3RlYWwgYW5kCisJCSAqIHdlIHJldHVybmVkIGR1ZSB0byB0aW1lb3V0IG9yIHNpZ25hbCB3aXRob3V0IHRha2luZyB0aGUKKwkJICogcnRfbXV0ZXguIFRvbyBsYXRlLiBXZSBjYW4gYWNjZXNzIHRoZSBydF9tdXRleF9vd25lciB3aXRob3V0CisJCSAqIGxvY2tpbmcsIGFzIHRoZSBvdGhlciB0YXNrIGlzIG5vdyBibG9ja2VkIG9uIHRoZSBoYXNoIGJ1Y2tldAorCQkgKiBsb2NrLiBGaXggdGhlIHN0YXRlIHVwLgorCQkgKi8KKwkJb3duZXIgPSBydF9tdXRleF9vd25lcigmcS0+cGlfc3RhdGUtPnBpX211dGV4KTsKKwkJcmV0ID0gZml4dXBfcGlfc3RhdGVfb3duZXIodWFkZHIsIHEsIG93bmVyLCBmc2hhcmVkKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBQYXJhbm9pYSBjaGVjay4gSWYgd2UgZGlkIG5vdCB0YWtlIHRoZSBsb2NrLCB0aGVuIHdlIHNob3VsZCBub3QgYmUKKwkgKiB0aGUgb3duZXIsIG5vciB0aGUgcGVuZGluZyBvd25lciwgb2YgdGhlIHJ0X211dGV4LgorCSAqLworCWlmIChydF9tdXRleF9vd25lcigmcS0+cGlfc3RhdGUtPnBpX211dGV4KSA9PSBjdXJyZW50KQorCQlwcmludGsoS0VSTl9FUlIgImZpeHVwX293bmVyOiByZXQgPSAlZCBwaS1tdXRleDogJXAgIgorCQkJCSJwaS1zdGF0ZSAlcFxuIiwgcmV0LAorCQkJCXEtPnBpX3N0YXRlLT5waV9tdXRleC5vd25lciwKKwkJCQlxLT5waV9zdGF0ZS0+b3duZXIpOworCitvdXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxvY2tlZDsKK30KKworLyoqCisgKiBmdXRleF93YWl0X3F1ZXVlX21lKCkgLSBxdWV1ZV9tZSgpIGFuZCB3YWl0IGZvciB3YWtldXAsIHRpbWVvdXQsIG9yIHNpZ25hbAorICogQGhiOgkJdGhlIGZ1dGV4IGhhc2ggYnVja2V0LCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyCisgKiBAcToJCXRoZSBmdXRleF9xIHRvIHF1ZXVlIHVwIG9uCisgKiBAdGltZW91dDoJdGhlIHByZXBhcmVkIGhydGltZXJfc2xlZXBlciwgb3IgbnVsbCBmb3Igbm8gdGltZW91dAorICovCitzdGF0aWMgdm9pZCBmdXRleF93YWl0X3F1ZXVlX21lKHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIsIHN0cnVjdCBmdXRleF9xICpxLAorCQkJCXN0cnVjdCBocnRpbWVyX3NsZWVwZXIgKnRpbWVvdXQpCit7CisJcXVldWVfbWUocSwgaGIpOworCisJLyoKKwkgKiBUaGVyZSBtaWdodCBoYXZlIGJlZW4gc2NoZWR1bGluZyBzaW5jZSB0aGUgcXVldWVfbWUoKSwgYXMgd2UKKwkgKiBjYW5ub3QgaG9sZCBhIHNwaW5sb2NrIGFjcm9zcyB0aGUgZ2V0X3VzZXIoKSBpbiBjYXNlIGl0CisJICogZmF1bHRzLCBhbmQgd2UgY2Fubm90IGp1c3Qgc2V0IFRBU0tfSU5URVJSVVBUSUJMRSBzdGF0ZSB3aGVuCisJICogcXVldWVpbmcgb3Vyc2VsdmVzIGludG8gdGhlIGZ1dGV4IGhhc2guIFRoaXMgY29kZSB0aHVzIGhhcyB0bworCSAqIHJlbHkgb24gdGhlIGZ1dGV4X3dha2UoKSBjb2RlIHJlbW92aW5nIHVzIGZyb20gaGFzaCB3aGVuIGl0CisJICogd2FrZXMgdXMgdXAuCisJICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCS8qIEFybSB0aGUgdGltZXIgKi8KKwlpZiAodGltZW91dCkgeworCQlocnRpbWVyX3N0YXJ0X2V4cGlyZXMoJnRpbWVvdXQtPnRpbWVyLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJaWYgKCFocnRpbWVyX2FjdGl2ZSgmdGltZW91dC0+dGltZXIpKQorCQkJdGltZW91dC0+dGFzayA9IE5VTEw7CisJfQorCisJLyoKKwkgKiAhcGxpc3Rfbm9kZV9lbXB0eSgpIGlzIHNhZmUgaGVyZSB3aXRob3V0IGFueSBsb2NrLgorCSAqIHEubG9ja19wdHIgIT0gMCBpcyBub3Qgc2FmZSwgYmVjYXVzZSBvZiBvcmRlcmluZyBhZ2FpbnN0IHdha2V1cC4KKwkgKi8KKwlpZiAobGlrZWx5KCFwbGlzdF9ub2RlX2VtcHR5KCZxLT5saXN0KSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQsIGN1cnJlbnQgd2lsbCBhbHJlYWR5IGJlCisJCSAqIGZsYWdnZWQgZm9yIHJlc2NoZWR1bGluZy4gT25seSBjYWxsIHNjaGVkdWxlIGlmIHRoZXJlCisJCSAqIGlzIG5vIHRpbWVvdXQsIG9yIGlmIGl0IGhhcyB5ZXQgdG8gZXhwaXJlLgorCQkgKi8KKwkJaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQtPnRhc2spCisJCQlzY2hlZHVsZSgpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Cit9CisKKy8qKgorICogZnV0ZXhfd2FpdF9zZXR1cCgpIC0gUHJlcGFyZSB0byB3YWl0IG9uIGEgZnV0ZXgKKyAqIEB1YWRkcjoJdGhlIGZ1dGV4IHVzZXJzcGFjZSBhZGRyZXNzCisgKiBAdmFsOgl0aGUgZXhwZWN0ZWQgdmFsdWUKKyAqIEBmc2hhcmVkOgl3aGV0aGVyIHRoZSBmdXRleCBpcyBzaGFyZWQgKDEpIG9yIG5vdCAoMCkKKyAqIEBxOgkJdGhlIGFzc29jaWF0ZWQgZnV0ZXhfcQorICogQGhiOgkJc3RvcmFnZSBmb3IgaGFzaF9idWNrZXQgcG9pbnRlciB0byBiZSByZXR1cm5lZCB0byBjYWxsZXIKKyAqCisgKiBTZXR1cCB0aGUgZnV0ZXhfcSBhbmQgbG9jYXRlIHRoZSBoYXNoX2J1Y2tldC4gIEdldCB0aGUgZnV0ZXggdmFsdWUgYW5kCisgKiBjb21wYXJlIGl0IHdpdGggdGhlIGV4cGVjdGVkIHZhbHVlLiAgSGFuZGxlIGF0b21pYyBmYXVsdHMgaW50ZXJuYWxseS4KKyAqIFJldHVybiB3aXRoIHRoZSBoYiBsb2NrIGhlbGQgYW5kIGEgcS5rZXkgcmVmZXJlbmNlIG9uIHN1Y2Nlc3MsIGFuZCB1bmxvY2tlZAorICogd2l0aCBubyBxLmtleSByZWZlcmVuY2Ugb24gZmFpbHVyZS4KKyAqCisgKiBSZXR1cm5zOgorICogIDAgLSB1YWRkciBjb250YWlucyB2YWwgYW5kIGhiIGhhcyBiZWVuIGxvY2tlZAorICogPDEgLSAtRUZBVUxUIG9yIC1FV09VTERCTE9DSyAodWFkZHIgZG9lcyBub3QgY29udGFpbiB2YWwpIGFuZCBoYiBpcyB1bmxjb2tlZAorICovCitzdGF0aWMgaW50IGZ1dGV4X3dhaXRfc2V0dXAodTMyIF9fdXNlciAqdWFkZHIsIHUzMiB2YWwsIGludCBmc2hhcmVkLAorCQkJICAgc3RydWN0IGZ1dGV4X3EgKnEsIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqKmhiKQorewogCXUzMiB1dmFsOwogCWludCByZXQ7Ci0Jc3RydWN0IGhydGltZXJfc2xlZXBlciB0OwotCWludCByZW0gPSAwOwotCi0JaWYgKCFiaXRzZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcS5waV9zdGF0ZSA9IE5VTEw7Ci0JcS5iaXRzZXQgPSBiaXRzZXQ7Ci1yZXRyeToKLQlxLmtleSA9IEZVVEVYX0tFWV9JTklUOwotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSwgVkVSSUZZX1JFQUQpOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCWdvdG8gb3V0OwotCi1yZXRyeV9wcml2YXRlOgotCWhiID0gcXVldWVfbG9jaygmcSk7CiAKIAkvKgogCSAqIEFjY2VzcyB0aGUgcGFnZSBBRlRFUiB0aGUgaGFzaC1idWNrZXQgaXMgbG9ja2VkLgpAQCAtMTE2NSw5NSArMTY2NCw4MyBAQAogCSAqIEEgY29uc2VxdWVuY2UgaXMgdGhhdCBmdXRleF93YWl0KCkgY2FuIHJldHVybiB6ZXJvIGFuZCBhYnNvcmIKIAkgKiBhIHdha2V1cCB3aGVuICp1YWRkciAhPSB2YWwgb24gZW50cnkgdG8gdGhlIHN5c2NhbGwuICBUaGlzIGlzCiAJICogcmFyZSwgYnV0IG5vcm1hbC4KLQkgKgotCSAqIEZvciBzaGFyZWQgZnV0ZXhlcywgd2UgaG9sZCB0aGUgbW1hcCBzZW1hcGhvcmUsIHNvIHRoZSBtYXBwaW5nCi0JICogY2Fubm90IGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSBsb29rZWQgaXQgdXAgaW4gZ2V0X2Z1dGV4X2tleS4KIAkgKi8KK3JldHJ5OgorCXEtPmtleSA9IEZVVEVYX0tFWV9JTklUOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLT5rZXksIFZFUklGWV9SRUFEKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCityZXRyeV9wcml2YXRlOgorCSpoYiA9IHF1ZXVlX2xvY2socSk7CisKIAlyZXQgPSBnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKCZ1dmFsLCB1YWRkcik7CiAKLQlpZiAodW5saWtlbHkocmV0KSkgewotCQlxdWV1ZV91bmxvY2soJnEsIGhiKTsKKwlpZiAocmV0KSB7CisJCXF1ZXVlX3VubG9jayhxLCAqaGIpOwogCiAJCXJldCA9IGdldF91c2VyKHV2YWwsIHVhZGRyKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3B1dF9rZXk7CisJCQlnb3RvIG91dDsKIAogCQlpZiAoIWZzaGFyZWQpCiAJCQlnb3RvIHJldHJ5X3ByaXZhdGU7CiAKLQkJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAmcS5rZXkpOworCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLT5rZXkpOwogCQlnb3RvIHJldHJ5OwogCX0KLQlyZXQgPSAtRVdPVUxEQkxPQ0s7Ci0JaWYgKHVubGlrZWx5KHV2YWwgIT0gdmFsKSkgewotCQlxdWV1ZV91bmxvY2soJnEsIGhiKTsKLQkJZ290byBvdXRfcHV0X2tleTsKKworCWlmICh1dmFsICE9IHZhbCkgeworCQlxdWV1ZV91bmxvY2socSwgKmhiKTsKKwkJcmV0ID0gLUVXT1VMREJMT0NLOwogCX0KIAotCS8qIE9ubHkgYWN0dWFsbHkgcXVldWUgaWYgKnVhZGRyIGNvbnRhaW5lZCB2YWwuICAqLwotCXF1ZXVlX21lKCZxLCBoYik7CitvdXQ6CisJaWYgKHJldCkKKwkJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAmcS0+a2V5KTsKKwlyZXR1cm4gcmV0OworfQogCi0JLyoKLQkgKiBUaGVyZSBtaWdodCBoYXZlIGJlZW4gc2NoZWR1bGluZyBzaW5jZSB0aGUgcXVldWVfbWUoKSwgYXMgd2UKLQkgKiBjYW5ub3QgaG9sZCBhIHNwaW5sb2NrIGFjcm9zcyB0aGUgZ2V0X3VzZXIoKSBpbiBjYXNlIGl0Ci0JICogZmF1bHRzLCBhbmQgd2UgY2Fubm90IGp1c3Qgc2V0IFRBU0tfSU5URVJSVVBUSUJMRSBzdGF0ZSB3aGVuCi0JICogcXVldWVpbmcgb3Vyc2VsdmVzIGludG8gdGhlIGZ1dGV4IGhhc2guICBUaGlzIGNvZGUgdGh1cyBoYXMgdG8KLQkgKiByZWx5IG9uIHRoZSBmdXRleF93YWtlKCkgY29kZSByZW1vdmluZyB1cyBmcm9tIGhhc2ggd2hlbiBpdAotCSAqIHdha2VzIHVzIHVwLgotCSAqLworc3RhdGljIGludCBmdXRleF93YWl0KHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwKKwkJICAgICAgdTMyIHZhbCwga3RpbWVfdCAqYWJzX3RpbWUsIHUzMiBiaXRzZXQsIGludCBjbG9ja3J0KQoreworCXN0cnVjdCBocnRpbWVyX3NsZWVwZXIgdGltZW91dCwgKnRvID0gTlVMTDsKKwlzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydDsKKwlzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiOworCXN0cnVjdCBmdXRleF9xIHE7CisJaW50IHJldDsKIAotCS8qIGFkZF93YWl0X3F1ZXVlIGlzIHRoZSBiYXJyaWVyIGFmdGVyIF9fc2V0X2N1cnJlbnRfc3RhdGUuICovCi0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZxLndhaXRlciwgJndhaXQpOwotCS8qCi0JICogIXBsaXN0X25vZGVfZW1wdHkoKSBpcyBzYWZlIGhlcmUgd2l0aG91dCBhbnkgbG9jay4KLQkgKiBxLmxvY2tfcHRyICE9IDAgaXMgbm90IHNhZmUsIGJlY2F1c2Ugb2Ygb3JkZXJpbmcgYWdhaW5zdCB3YWtldXAuCi0JICovCi0JaWYgKGxpa2VseSghcGxpc3Rfbm9kZV9lbXB0eSgmcS5saXN0KSkpIHsKLQkJaWYgKCFhYnNfdGltZSkKLQkJCXNjaGVkdWxlKCk7Ci0JCWVsc2UgewotCQkJaHJ0aW1lcl9pbml0X29uX3N0YWNrKCZ0LnRpbWVyLAotCQkJCQkgICAgICBjbG9ja3J0ID8gQ0xPQ0tfUkVBTFRJTUUgOgotCQkJCQkgICAgICBDTE9DS19NT05PVE9OSUMsCi0JCQkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwotCQkJaHJ0aW1lcl9pbml0X3NsZWVwZXIoJnQsIGN1cnJlbnQpOwotCQkJaHJ0aW1lcl9zZXRfZXhwaXJlc19yYW5nZV9ucygmdC50aW1lciwgKmFic190aW1lLAotCQkJCQkJICAgICBjdXJyZW50LT50aW1lcl9zbGFja19ucyk7CisJaWYgKCFiaXRzZXQpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCQlocnRpbWVyX3N0YXJ0X2V4cGlyZXMoJnQudGltZXIsIEhSVElNRVJfTU9ERV9BQlMpOwotCQkJaWYgKCFocnRpbWVyX2FjdGl2ZSgmdC50aW1lcikpCi0JCQkJdC50YXNrID0gTlVMTDsKKwlxLnBpX3N0YXRlID0gTlVMTDsKKwlxLmJpdHNldCA9IGJpdHNldDsKKwlxLnJ0X3dhaXRlciA9IE5VTEw7CiAKLQkJCS8qCi0JCQkgKiB0aGUgdGltZXIgY291bGQgaGF2ZSBhbHJlYWR5IGV4cGlyZWQsIGluIHdoaWNoCi0JCQkgKiBjYXNlIGN1cnJlbnQgd291bGQgYmUgZmxhZ2dlZCBmb3IgcmVzY2hlZHVsaW5nLgotCQkJICogRG9uJ3QgYm90aGVyIGNhbGxpbmcgc2NoZWR1bGUuCi0JCQkgKi8KLQkJCWlmIChsaWtlbHkodC50YXNrKSkKLQkJCQlzY2hlZHVsZSgpOworCWlmIChhYnNfdGltZSkgeworCQl0byA9ICZ0aW1lb3V0OwogCi0JCQlocnRpbWVyX2NhbmNlbCgmdC50aW1lcik7Ci0KLQkJCS8qIEZsYWcgaWYgYSB0aW1lb3V0IG9jY3VyZWQgKi8KLQkJCXJlbSA9ICh0LnRhc2sgPT0gTlVMTCk7Ci0KLQkJCWRlc3Ryb3lfaHJ0aW1lcl9vbl9zdGFjaygmdC50aW1lcik7Ci0JCX0KKwkJaHJ0aW1lcl9pbml0X29uX3N0YWNrKCZ0by0+dGltZXIsIGNsb2NrcnQgPyBDTE9DS19SRUFMVElNRSA6CisJCQkJICAgICAgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJaHJ0aW1lcl9pbml0X3NsZWVwZXIodG8sIGN1cnJlbnQpOworCQlocnRpbWVyX3NldF9leHBpcmVzX3JhbmdlX25zKCZ0by0+dGltZXIsICphYnNfdGltZSwKKwkJCQkJICAgICBjdXJyZW50LT50aW1lcl9zbGFja19ucyk7CiAJfQotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAotCS8qCi0JICogTk9URTogd2UgZG9uJ3QgcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSB3YWl0cXVldWUgYmVjYXVzZQotCSAqIHdlIGFyZSB0aGUgb25seSB1c2VyIG9mIGl0LgotCSAqLworCS8qIFByZXBhcmUgdG8gd2FpdCBvbiB1YWRkci4gKi8KKwlyZXQgPSBmdXRleF93YWl0X3NldHVwKHVhZGRyLCB2YWwsIGZzaGFyZWQsICZxLCAmaGIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogcXVldWVfbWUgYW5kIHdhaXQgZm9yIHdha2V1cCwgdGltZW91dCwgb3IgYSBzaWduYWwuICovCisJZnV0ZXhfd2FpdF9xdWV1ZV9tZShoYiwgJnEsIHRvKTsKIAogCS8qIElmIHdlIHdlcmUgd29rZW4gKGFuZCB1bnF1ZXVlZCksIHdlIHN1Y2NlZWRlZCwgd2hhdGV2ZXIuICovCiAJcmV0ID0gMDsKIAlpZiAoIXVucXVldWVfbWUoJnEpKQogCQlnb3RvIG91dF9wdXRfa2V5OwogCXJldCA9IC1FVElNRURPVVQ7Ci0JaWYgKHJlbSkKKwlpZiAodG8gJiYgIXRvLT50YXNrKQogCQlnb3RvIG91dF9wdXRfa2V5OwogCiAJLyoKQEAgLTEyNzAsNyArMTc1Nyw3IEBACiAJcmVzdGFydC0+ZnV0ZXgudmFsID0gdmFsOwogCXJlc3RhcnQtPmZ1dGV4LnRpbWUgPSBhYnNfdGltZS0+dHY2NDsKIAlyZXN0YXJ0LT5mdXRleC5iaXRzZXQgPSBiaXRzZXQ7Ci0JcmVzdGFydC0+ZnV0ZXguZmxhZ3MgPSAwOworCXJlc3RhcnQtPmZ1dGV4LmZsYWdzID0gRkxBR1NfSEFTX1RJTUVPVVQ7CiAKIAlpZiAoZnNoYXJlZCkKIAkJcmVzdGFydC0+ZnV0ZXguZmxhZ3MgfD0gRkxBR1NfU0hBUkVEOwpAQCAtMTI4Miw2ICsxNzY5LDEwIEBACiBvdXRfcHV0X2tleToKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CiBvdXQ6CisJaWYgKHRvKSB7CisJCWhydGltZXJfY2FuY2VsKCZ0by0+dGltZXIpOworCQlkZXN0cm95X2hydGltZXJfb25fc3RhY2soJnRvLT50aW1lcik7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyOTAsMTMgKzE3ODEsMTYgQEAKIHsKIAl1MzIgX191c2VyICp1YWRkciA9ICh1MzIgX191c2VyICopcmVzdGFydC0+ZnV0ZXgudWFkZHI7CiAJaW50IGZzaGFyZWQgPSAwOwotCWt0aW1lX3QgdDsKKwlrdGltZV90IHQsICp0cCA9IE5VTEw7CiAKLQl0LnR2NjQgPSByZXN0YXJ0LT5mdXRleC50aW1lOworCWlmIChyZXN0YXJ0LT5mdXRleC5mbGFncyAmIEZMQUdTX0hBU19USU1FT1VUKSB7CisJCXQudHY2NCA9IHJlc3RhcnQtPmZ1dGV4LnRpbWU7CisJCXRwID0gJnQ7CisJfQogCXJlc3RhcnQtPmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOwogCWlmIChyZXN0YXJ0LT5mdXRleC5mbGFncyAmIEZMQUdTX1NIQVJFRCkKIAkJZnNoYXJlZCA9IDE7Ci0JcmV0dXJuIChsb25nKWZ1dGV4X3dhaXQodWFkZHIsIGZzaGFyZWQsIHJlc3RhcnQtPmZ1dGV4LnZhbCwgJnQsCisJcmV0dXJuIChsb25nKWZ1dGV4X3dhaXQodWFkZHIsIGZzaGFyZWQsIHJlc3RhcnQtPmZ1dGV4LnZhbCwgdHAsCiAJCQkJcmVzdGFydC0+ZnV0ZXguYml0c2V0LAogCQkJCXJlc3RhcnQtPmZ1dGV4LmZsYWdzICYgRkxBR1NfQ0xPQ0tSVCk7CiB9CkBAIC0xMzEyLDExICsxODA2LDEwIEBACiAJCQkgaW50IGRldGVjdCwga3RpbWVfdCAqdGltZSwgaW50IHRyeWxvY2spCiB7CiAJc3RydWN0IGhydGltZXJfc2xlZXBlciB0aW1lb3V0LCAqdG8gPSBOVUxMOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7CiAJc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjsKLQl1MzIgdXZhbCwgbmV3dmFsLCBjdXJ2YWw7CisJdTMyIHV2YWw7CiAJc3RydWN0IGZ1dGV4X3EgcTsKLQlpbnQgcmV0LCBsb2NrX3Rha2VuLCBvd25lcmRpZWQgPSAwOworCWludCByZXMsIHJldDsKIAogCWlmIChyZWZpbGxfcGlfc3RhdGVfY2FjaGUoKSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMzMwLDYgKzE4MjMsNyBAQAogCX0KIAogCXEucGlfc3RhdGUgPSBOVUxMOworCXEucnRfd2FpdGVyID0gTlVMTDsKIHJldHJ5OgogCXEua2V5ID0gRlVURVhfS0VZX0lOSVQ7CiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJnEua2V5LCBWRVJJRllfV1JJVEUpOwpAQCAtMTMzOSw4MSArMTgzMywxNSBAQAogcmV0cnlfcHJpdmF0ZToKIAloYiA9IHF1ZXVlX2xvY2soJnEpOwogCi1yZXRyeV9sb2NrZWQ6Ci0JcmV0ID0gbG9ja190YWtlbiA9IDA7Ci0KLQkvKgotCSAqIFRvIGF2b2lkIHJhY2VzLCB3ZSBhdHRlbXB0IHRvIHRha2UgdGhlIGxvY2sgaGVyZSBhZ2FpbgotCSAqIChieSBkb2luZyBhIDAgLT4gVElEIGF0b21pYyBjbXB4Y2hnKSwgd2hpbGUgaG9sZGluZyBhbGwKLQkgKiB0aGUgbG9ja3MuIEl0IHdpbGwgbW9zdCBsaWtlbHkgbm90IHN1Y2NlZWQuCi0JICovCi0JbmV3dmFsID0gdGFza19waWRfdm5yKGN1cnJlbnQpOwotCi0JY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIDAsIG5ld3ZhbCk7Ci0KLQlpZiAodW5saWtlbHkoY3VydmFsID09IC1FRkFVTFQpKQotCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7Ci0KLQkvKgotCSAqIERldGVjdCBkZWFkbG9ja3MuIEluIGNhc2Ugb2YgUkVRVUVVRV9QSSB0aGlzIGlzIGEgdmFsaWQKLQkgKiBzaXR1YXRpb24gYW5kIHdlIHJldHVybiBzdWNjZXNzIHRvIHVzZXIgc3BhY2UuCi0JICovCi0JaWYgKHVubGlrZWx5KChjdXJ2YWwgJiBGVVRFWF9USURfTUFTSykgPT0gdGFza19waWRfdm5yKGN1cnJlbnQpKSkgewotCQlyZXQgPSAtRURFQURMSzsKLQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7Ci0JfQotCi0JLyoKLQkgKiBTdXJwcmlzZSAtIHdlIGdvdCB0aGUgbG9jay4gSnVzdCByZXR1cm4gdG8gdXNlcnNwYWNlOgotCSAqLwotCWlmICh1bmxpa2VseSghY3VydmFsKSkKLQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7Ci0KLQl1dmFsID0gY3VydmFsOwotCi0JLyoKLQkgKiBTZXQgdGhlIFdBSVRFUlMgZmxhZywgc28gdGhlIG93bmVyIHdpbGwga25vdyBpdCBoYXMgc29tZW9uZQotCSAqIHRvIHdha2UgYXQgbmV4dCB1bmxvY2sKLQkgKi8KLQluZXd2YWwgPSBjdXJ2YWwgfCBGVVRFWF9XQUlURVJTOwotCi0JLyoKLQkgKiBUaGVyZSBhcmUgdHdvIGNhc2VzLCB3aGVyZSBhIGZ1dGV4IG1pZ2h0IGhhdmUgbm8gb3duZXIgKHRoZQotCSAqIG93bmVyIFRJRCBpcyAwKTogT1dORVJfRElFRC4gV2UgdGFrZSBvdmVyIHRoZSBmdXRleCBpbiB0aGlzCi0JICogY2FzZS4gV2UgYWxzbyBkbyBhbiB1bmNvbmRpdGlvbmFsIHRha2Ugb3Zlciwgd2hlbiB0aGUgb3duZXIKLQkgKiBvZiB0aGUgZnV0ZXggZGllZC4KLQkgKgotCSAqIFRoaXMgaXMgc2FmZSBhcyB3ZSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBoYXNoIGJ1Y2tldCBsb2NrICEKLQkgKi8KLQlpZiAodW5saWtlbHkob3duZXJkaWVkIHx8ICEoY3VydmFsICYgRlVURVhfVElEX01BU0spKSkgewotCQkvKiBLZWVwIHRoZSBPV05FUl9ESUVEIGJpdCAqLwotCQluZXd2YWwgPSAoY3VydmFsICYgfkZVVEVYX1RJRF9NQVNLKSB8IHRhc2tfcGlkX3ZucihjdXJyZW50KTsKLQkJb3duZXJkaWVkID0gMDsKLQkJbG9ja190YWtlbiA9IDE7Ci0JfQotCi0JY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIHV2YWwsIG5ld3ZhbCk7Ci0KLQlpZiAodW5saWtlbHkoY3VydmFsID09IC1FRkFVTFQpKQotCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7Ci0JaWYgKHVubGlrZWx5KGN1cnZhbCAhPSB1dmFsKSkKLQkJZ290byByZXRyeV9sb2NrZWQ7Ci0KLQkvKgotCSAqIFdlIHRvb2sgdGhlIGxvY2sgZHVlIHRvIG93bmVyIGRpZWQgdGFrZSBvdmVyLgotCSAqLwotCWlmICh1bmxpa2VseShsb2NrX3Rha2VuKSkKLQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7Ci0KLQkvKgotCSAqIFdlIGRvbnQgaGF2ZSB0aGUgbG9jay4gTG9vayB1cCB0aGUgUEkgc3RhdGUgKG9yIGNyZWF0ZSBpdCBpZgotCSAqIHdlIGFyZSB0aGUgZmlyc3Qgd2FpdGVyKToKLQkgKi8KLQlyZXQgPSBsb29rdXBfcGlfc3RhdGUodXZhbCwgaGIsICZxLmtleSwgJnEucGlfc3RhdGUpOwotCisJcmV0ID0gZnV0ZXhfbG9ja19waV9hdG9taWModWFkZHIsIGhiLCAmcS5rZXksICZxLnBpX3N0YXRlLCBjdXJyZW50LCAwKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewogCQlzd2l0Y2ggKHJldCkgewotCisJCWNhc2UgMToKKwkJCS8qIFdlIGdvdCB0aGUgbG9jay4gKi8KKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dF91bmxvY2tfcHV0X2tleTsKKwkJY2FzZSAtRUZBVUxUOgorCQkJZ290byB1YWRkcl9mYXVsdGVkOwogCQljYXNlIC1FQUdBSU46CiAJCQkvKgogCQkJICogVGFzayBpcyBleGl0aW5nIGFuZCB3ZSBqdXN0IHdhaXQgZm9yIHRoZQpAQCAtMTQyMywyNSArMTg1MSw2IEBACiAJCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAkJCWdvdG8gcmV0cnk7Ci0KLQkJY2FzZSAtRVNSQ0g6Ci0JCQkvKgotCQkJICogTm8gb3duZXIgZm91bmQgZm9yIHRoaXMgZnV0ZXguIENoZWNrIGlmIHRoZQotCQkJICogT1dORVJfRElFRCBiaXQgaXMgc2V0IHRvIGZpZ3VyZSBvdXQgd2hldGhlcgotCQkJICogdGhpcyBpcyBhIHJvYnVzdCBmdXRleCBvciBub3QuCi0JCQkgKi8KLQkJCWlmIChnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKCZjdXJ2YWwsIHVhZGRyKSkKLQkJCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7Ci0KLQkJCS8qCi0JCQkgKiBXZSBzaW1wbHkgc3RhcnQgb3ZlciBpbiBjYXNlIG9mIGEgcm9idXN0Ci0JCQkgKiBmdXRleC4gVGhlIGNvZGUgYWJvdmUgd2lsbCB0YWtlIHRoZSBmdXRleAotCQkJICogYW5kIHJldHVybiBoYXBweS4KLQkJCSAqLwotCQkJaWYgKGN1cnZhbCAmIEZVVEVYX09XTkVSX0RJRUQpIHsKLQkJCQlvd25lcmRpZWQgPSAxOwotCQkJCWdvdG8gcmV0cnlfbG9ja2VkOwotCQkJfQogCQlkZWZhdWx0OgogCQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7CiAJCX0KQEAgLTE0NjUsNzEgKzE4NzQsMjEgQEAKIAl9CiAKIAlzcGluX2xvY2socS5sb2NrX3B0cik7Ci0KLQlpZiAoIXJldCkgewotCQkvKgotCQkgKiBHb3QgdGhlIGxvY2suIFdlIG1pZ2h0IG5vdCBiZSB0aGUgYW50aWNpcGF0ZWQgb3duZXIKLQkJICogaWYgd2UgZGlkIGEgbG9jay1zdGVhbCAtIGZpeCB1cCB0aGUgUEktc3RhdGUgaW4KLQkJICogdGhhdCBjYXNlOgotCQkgKi8KLQkJaWYgKHEucGlfc3RhdGUtPm93bmVyICE9IGN1cnIpCi0JCQlyZXQgPSBmaXh1cF9waV9zdGF0ZV9vd25lcih1YWRkciwgJnEsIGN1cnIsIGZzaGFyZWQpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIENhdGNoIHRoZSByYXJlIGNhc2UsIHdoZXJlIHRoZSBsb2NrIHdhcyByZWxlYXNlZAotCQkgKiB3aGVuIHdlIHdlcmUgb24gdGhlIHdheSBiYWNrIGJlZm9yZSB3ZSBsb2NrZWQgdGhlCi0JCSAqIGhhc2ggYnVja2V0LgotCQkgKi8KLQkJaWYgKHEucGlfc3RhdGUtPm93bmVyID09IGN1cnIpIHsKLQkJCS8qCi0JCQkgKiBUcnkgdG8gZ2V0IHRoZSBydF9tdXRleCBub3cuIFRoaXMgbWlnaHQKLQkJCSAqIGZhaWwgYXMgc29tZSBvdGhlciB0YXNrIGFjcXVpcmVkIHRoZQotCQkJICogcnRfbXV0ZXggYWZ0ZXIgd2UgcmVtb3ZlZCBvdXJzZWxmIGZyb20gdGhlCi0JCQkgKiBydF9tdXRleCB3YWl0ZXJzIGxpc3QuCi0JCQkgKi8KLQkJCWlmIChydF9tdXRleF90cnlsb2NrKCZxLnBpX3N0YXRlLT5waV9tdXRleCkpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UgewotCQkJCS8qCi0JCQkJICogcGlfc3RhdGUgaXMgaW5jb3JyZWN0LCBzb21lIG90aGVyCi0JCQkJICogdGFzayBkaWQgYSBsb2NrIHN0ZWFsIGFuZCB3ZQotCQkJCSAqIHJldHVybmVkIGR1ZSB0byB0aW1lb3V0IG9yIHNpZ25hbAotCQkJCSAqIHdpdGhvdXQgdGFraW5nIHRoZSBydF9tdXRleC4gVG9vCi0JCQkJICogbGF0ZS4gV2UgY2FuIGFjY2VzcyB0aGUKLQkJCQkgKiBydF9tdXRleF9vd25lciB3aXRob3V0IGxvY2tpbmcsIGFzCi0JCQkJICogdGhlIG90aGVyIHRhc2sgaXMgbm93IGJsb2NrZWQgb24KLQkJCQkgKiB0aGUgaGFzaCBidWNrZXQgbG9jay4gRml4IHRoZSBzdGF0ZQotCQkJCSAqIHVwLgotCQkJCSAqLwotCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7Ci0JCQkJaW50IHJlczsKLQotCQkJCW93bmVyID0gcnRfbXV0ZXhfb3duZXIoJnEucGlfc3RhdGUtPnBpX211dGV4KTsKLQkJCQlyZXMgPSBmaXh1cF9waV9zdGF0ZV9vd25lcih1YWRkciwgJnEsIG93bmVyLAotCQkJCQkJCSAgIGZzaGFyZWQpOwotCi0JCQkJLyogcHJvcGFnYXRlIC1FRkFVTFQsIGlmIHRoZSBmaXh1cCBmYWlsZWQgKi8KLQkJCQlpZiAocmVzKQotCQkJCQlyZXQgPSByZXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogUGFyYW5vaWEgY2hlY2suIElmIHdlIGRpZCBub3QgdGFrZSB0aGUgbG9jawotCQkJICogaW4gdGhlIHRyeWxvY2sgYWJvdmUsIHRoZW4gd2Ugc2hvdWxkIG5vdCBiZQotCQkJICogdGhlIG93bmVyIG9mIHRoZSBydG11dGV4LCBuZWl0aGVyIHRoZSByZWFsCi0JCQkgKiBub3IgdGhlIHBlbmRpbmcgb25lOgotCQkJICovCi0JCQlpZiAocnRfbXV0ZXhfb3duZXIoJnEucGlfc3RhdGUtPnBpX211dGV4KSA9PSBjdXJyKQotCQkJCXByaW50ayhLRVJOX0VSUiAiZnV0ZXhfbG9ja19waTogcmV0ID0gJWQgIgotCQkJCSAgICAgICAicGktbXV0ZXg6ICVwIHBpLXN0YXRlICVwXG4iLCByZXQsCi0JCQkJICAgICAgIHEucGlfc3RhdGUtPnBpX211dGV4Lm93bmVyLAotCQkJCSAgICAgICBxLnBpX3N0YXRlLT5vd25lcik7Ci0JCX0KLQl9CisJLyoKKwkgKiBGaXh1cCB0aGUgcGlfc3RhdGUgb3duZXIgYW5kIHBvc3NpYmx5IGFjcXVpcmUgdGhlIGxvY2sgaWYgd2UKKwkgKiBoYXZlbid0IGFscmVhZHkuCisJICovCisJcmVzID0gZml4dXBfb3duZXIodWFkZHIsIGZzaGFyZWQsICZxLCAhcmV0KTsKKwkvKgorCSAqIElmIGZpeHVwX293bmVyKCkgcmV0dXJuZWQgYW4gZXJyb3IsIHByb3Byb2dhdGUgdGhhdC4gIElmIGl0IGFjcXVpcmVkCisJICogdGhlIGxvY2ssIGNsZWFyIG91ciAtRVRJTUVET1VUIG9yIC1FSU5UUi4KKwkgKi8KKwlpZiAocmVzKQorCQlyZXQgPSAocmVzIDwgMCkgPyByZXMgOiAwOwogCiAJLyoKLQkgKiBJZiBmaXh1cF9waV9zdGF0ZV9vd25lcigpIGZhdWx0ZWQgYW5kIHdhcyB1bmFibGUgdG8gaGFuZGxlIHRoZQotCSAqIGZhdWx0LCB1bmxvY2sgaXQgYW5kIHJldHVybiB0aGUgZmF1bHQgdG8gdXNlcnNwYWNlLgorCSAqIElmIGZpeHVwX293bmVyKCkgZmF1bHRlZCBhbmQgd2FzIHVuYWJsZSB0byBoYW5kbGUgdGhlIGZhdWx0LCB1bmxvY2sKKwkgKiBpdCBhbmQgcmV0dXJuIHRoZSBmYXVsdCB0byB1c2Vyc3BhY2UuCiAJICovCiAJaWYgKHJldCAmJiAocnRfbXV0ZXhfb3duZXIoJnEucGlfc3RhdGUtPnBpX211dGV4KSA9PSBjdXJyZW50KSkKIAkJcnRfbXV0ZXhfdW5sb2NrKCZxLnBpX3N0YXRlLT5waV9tdXRleCk7CkBAIC0xNTM3LDkgKzE4OTYsNyBAQAogCS8qIFVucXVldWUgYW5kIGRyb3AgdGhlIGxvY2sgKi8KIAl1bnF1ZXVlX21lX3BpKCZxKTsKIAotCWlmICh0bykKLQkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOwotCXJldHVybiByZXQgIT0gLUVJTlRSID8gcmV0IDogLUVSRVNUQVJUTk9JTlRSOworCWdvdG8gb3V0OwogCiBvdXRfdW5sb2NrX3B1dF9rZXk6CiAJcXVldWVfdW5sb2NrKCZxLCBoYik7CkBAIC0xNTQ5LDcgKzE5MDYsNyBAQAogb3V0OgogCWlmICh0bykKIAkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHJldCAhPSAtRUlOVFIgPyByZXQgOiAtRVJFU1RBUlROT0lOVFI7CiAKIHVhZGRyX2ZhdWx0ZWQ6CiAJLyoKQEAgLTE1NzIsNyArMTkyOSw2IEBACiAJZ290byByZXRyeTsKIH0KIAotCiAvKgogICogVXNlcnNwYWNlIGF0dGVtcHRlZCBhIFRJRCAtPiAwIGF0b21pYyB0cmFuc2l0aW9uLCBhbmQgZmFpbGVkLgogICogVGhpcyBpcyB0aGUgaW4ta2VybmVsIHNsb3dwYXRoOiB3ZSBsb29rIHVwIHRoZSBQSSBzdGF0ZSAoaWYgYW55KSwKQEAgLTE2NzQsNiArMjAzMCwyMjkgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGhhbmRsZV9lYXJseV9yZXF1ZXVlX3BpX3dha2V1cCgpIC0gRGV0ZWN0IGVhcmx5IHdha2V1cCBvbiB0aGUgaW5pdGlhbCBmdXRleAorICogQGhiOgkJdGhlIGhhc2hfYnVja2V0IGZ1dGV4X3Egd2FzIG9yaWdpbmFsIGVucXVldWVkIG9uCisgKiBAcToJCXRoZSBmdXRleF9xIHdva2VuIHdoaWxlIHdhaXRpbmcgdG8gYmUgcmVxdWV1ZWQKKyAqIEBrZXkyOgl0aGUgZnV0ZXhfa2V5IG9mIHRoZSByZXF1ZXVlIHRhcmdldCBmdXRleAorICogQHRpbWVvdXQ6CXRoZSB0aW1lb3V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FpdCAoTlVMTCBpZiBub25lKQorICoKKyAqIERldGVjdCBpZiB0aGUgdGFzayB3YXMgd29rZW4gb24gdGhlIGluaXRpYWwgZnV0ZXggYXMgb3Bwb3NlZCB0byB0aGUgcmVxdWV1ZQorICogdGFyZ2V0IGZ1dGV4LiAgSWYgc28sIGRldGVybWluZSBpZiBpdCB3YXMgYSB0aW1lb3V0IG9yIGEgc2lnbmFsIHRoYXQgY2F1c2VkCisgKiB0aGUgd2FrZXVwIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgdG8gdGhlIGNhbGxlci4gIE11c3QgYmUKKyAqIGNhbGxlZCB3aXRoIHRoZSBoYiBsb2NrIGhlbGQuCisgKgorICogUmV0dXJucworICogIDAgLSBubyBlYXJseSB3YWtldXAgZGV0ZWN0ZWQKKyAqIDwwIC0gLUVUSU1FRE9VVCBvciAtRVJFU1RBUlROT0lOVFIKKyAqLworc3RhdGljIGlubGluZQoraW50IGhhbmRsZV9lYXJseV9yZXF1ZXVlX3BpX3dha2V1cChzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiLAorCQkJCSAgIHN0cnVjdCBmdXRleF9xICpxLCB1bmlvbiBmdXRleF9rZXkgKmtleTIsCisJCQkJICAgc3RydWN0IGhydGltZXJfc2xlZXBlciAqdGltZW91dCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogV2l0aCB0aGUgaGIgbG9jayBoZWxkLCB3ZSBhdm9pZCByYWNlcyB3aGlsZSB3ZSBwcm9jZXNzIHRoZSB3YWtldXAuCisJICogV2Ugb25seSBuZWVkIHRvIGhvbGQgaGIgKGFuZCBub3QgaGIyKSB0byBlbnN1cmUgYXRvbWljaXR5IGFzIHRoZQorCSAqIHdha2V1cCBjb2RlIGNhbid0IGNoYW5nZSBxLmtleSBmcm9tIHVhZGRyIHRvIHVhZGRyMiBpZiB3ZSBob2xkIGhiLgorCSAqIEl0IGNhbid0IGJlIHJlcXVldWVkIGZyb20gdWFkZHIyIHRvIHNvbWV0aGluZyBlbHNlIHNpbmNlIHdlIGRvbid0CisJICogc3VwcG9ydCBhIFBJIGF3YXJlIHNvdXJjZSBmdXRleCBmb3IgcmVxdWV1ZS4KKwkgKi8KKwlpZiAoIW1hdGNoX2Z1dGV4KCZxLT5rZXksIGtleTIpKSB7CisJCVdBUk5fT04ocS0+bG9ja19wdHIgJiYgKCZoYi0+bG9jayAhPSBxLT5sb2NrX3B0cikpOworCQkvKgorCQkgKiBXZSB3ZXJlIHdva2VuIHByaW9yIHRvIHJlcXVldWUgYnkgYSB0aW1lb3V0IG9yIGEgc2lnbmFsLgorCQkgKiBVbnF1ZXVlIHRoZSBmdXRleF9xIGFuZCBkZXRlcm1pbmUgd2hpY2ggaXQgd2FzLgorCQkgKi8KKwkJcGxpc3RfZGVsKCZxLT5saXN0LCAmcS0+bGlzdC5wbGlzdCk7CisJCWRyb3BfZnV0ZXhfa2V5X3JlZnMoJnEtPmtleSk7CisKKwkJaWYgKHRpbWVvdXQgJiYgIXRpbWVvdXQtPnRhc2spCisJCQlyZXQgPSAtRVRJTUVET1VUOworCQllbHNlCisJCQlyZXQgPSAtRVJFU1RBUlROT0lOVFI7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZnV0ZXhfd2FpdF9yZXF1ZXVlX3BpKCkgLSBXYWl0IG9uIHVhZGRyIGFuZCB0YWtlIHVhZGRyMgorICogQHVhZGRyOgl0aGUgZnV0ZXggd2UgaW5pdGlhbHlsIHdhaXQgb24gKG5vbi1waSkKKyAqIEBmc2hhcmVkOgl3aGV0aGVyIHRoZSBmdXRleGVzIGFyZSBzaGFyZWQgKDEpIG9yIG5vdCAoMCkuICBUaGV5IG11c3QgYmUKKyAqIAkJdGhlIHNhbWUgdHlwZSwgbm8gcmVxdWV1ZWluZyBmcm9tIHByaXZhdGUgdG8gc2hhcmVkLCBldGMuCisgKiBAdmFsOgl0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgdWFkZHIKKyAqIEBhYnNfdGltZToJYWJzb2x1dGUgdGltZW91dAorICogQGJpdHNldDoJMzIgYml0IHdha2V1cCBiaXRzZXQgc2V0IGJ5IHVzZXJzcGFjZSwgZGVmYXVsdHMgdG8gYWxsLgorICogQGNsb2NrcnQ6CXdoZXRoZXIgdG8gdXNlIENMT0NLX1JFQUxUSU1FICgxKSBvciBDTE9DS19NT05PVE9OSUMgKDApCisgKiBAdWFkZHIyOgl0aGUgcGkgZnV0ZXggd2Ugd2lsbCB0YWtlIHByaW9yIHRvIHJldHVybmluZyB0byB1c2VyLXNwYWNlCisgKgorICogVGhlIGNhbGxlciB3aWxsIHdhaXQgb24gdWFkZHIgYW5kIHdpbGwgYmUgcmVxdWV1ZWQgYnkgZnV0ZXhfcmVxdWV1ZSgpIHRvCisgKiB1YWRkcjIgd2hpY2ggbXVzdCBiZSBQSSBhd2FyZS4gIE5vcm1hbCB3YWtldXAgd2lsbCB3YWtlIG9uIHVhZGRyMiBhbmQKKyAqIGNvbXBsZXRlIHRoZSBhY3F1aXNpdGlvbiBvZiB0aGUgcnRfbXV0ZXggcHJpb3IgdG8gcmV0dXJuaW5nIHRvIHVzZXJzcGFjZS4KKyAqIFRoaXMgZW5zdXJlcyB0aGUgcnRfbXV0ZXggbWFpbnRhaW5zIGFuIG93bmVyIHdoZW4gaXQgaGFzIHdhaXRlcnM7IHdpdGhvdXQKKyAqIG9uZSwgdGhlIHBpIGxvZ2ljIHdvdWxkbid0IGtub3cgd2hpY2ggdGFzayB0byBib29zdC9kZWJvb3N0LCBpZiB0aGVyZSB3YXMgYQorICogbmVlZCB0by4KKyAqCisgKiBXZSBjYWxsIHNjaGVkdWxlIGluIGZ1dGV4X3dhaXRfcXVldWVfbWUoKSB3aGVuIHdlIGVucXVldWUgYW5kIHJldHVybiB0aGVyZQorICogdmlhIHRoZSBmb2xsb3dpbmc6CisgKiAxKSB3YWtldXAgb24gdWFkZHIyIGFmdGVyIGFuIGF0b21pYyBsb2NrIGFjcXVpc2l0aW9uIGJ5IGZ1dGV4X3JlcXVldWUoKQorICogMikgd2FrZXVwIG9uIHVhZGRyMiBhZnRlciBhIHJlcXVldWUgYW5kIHN1YnNlcXVlbnQgdW5sb2NrCisgKiAzKSBzaWduYWwgKGJlZm9yZSBvciBhZnRlciByZXF1ZXVlKQorICogNCkgdGltZW91dCAoYmVmb3JlIG9yIGFmdGVyIHJlcXVldWUpCisgKgorICogSWYgMywgd2Ugc2V0dXAgYSByZXN0YXJ0X2Jsb2NrIHdpdGggZnV0ZXhfd2FpdF9yZXF1ZXVlX3BpKCkgYXMgdGhlIGZ1bmN0aW9uLgorICoKKyAqIElmIDIsIHdlIG1heSB0aGVuIGJsb2NrIG9uIHRyeWluZyB0byB0YWtlIHRoZSBydF9tdXRleCBhbmQgcmV0dXJuIHZpYToKKyAqIDUpIHN1Y2Nlc3NmdWwgbG9jaworICogNikgc2lnbmFsCisgKiA3KSB0aW1lb3V0CisgKiA4KSBvdGhlciBsb2NrIGFjcXVpc2l0aW9uIGZhaWx1cmUKKyAqCisgKiBJZiA2LCB3ZSBzZXR1cCBhIHJlc3RhcnRfYmxvY2sgd2l0aCBmdXRleF9sb2NrX3BpKCkgYXMgdGhlIGZ1bmN0aW9uLgorICoKKyAqIElmIDQgb3IgNywgd2UgY2xlYW51cCBhbmQgcmV0dXJuIHdpdGggLUVUSU1FRE9VVC4KKyAqCisgKiBSZXR1cm5zOgorICogIDAgLSBPbiBzdWNjZXNzCisgKiA8MCAtIE9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZnV0ZXhfd2FpdF9yZXF1ZXVlX3BpKHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwKKwkJCQkgdTMyIHZhbCwga3RpbWVfdCAqYWJzX3RpbWUsIHUzMiBiaXRzZXQsCisJCQkJIGludCBjbG9ja3J0LCB1MzIgX191c2VyICp1YWRkcjIpCit7CisJc3RydWN0IGhydGltZXJfc2xlZXBlciB0aW1lb3V0LCAqdG8gPSBOVUxMOworCXN0cnVjdCBydF9tdXRleF93YWl0ZXIgcnRfd2FpdGVyOworCXN0cnVjdCBydF9tdXRleCAqcGlfbXV0ZXggPSBOVUxMOworCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGI7CisJdW5pb24gZnV0ZXhfa2V5IGtleTI7CisJc3RydWN0IGZ1dGV4X3EgcTsKKwlpbnQgcmVzLCByZXQ7CisKKwlpZiAoIWJpdHNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWJzX3RpbWUpIHsKKwkJdG8gPSAmdGltZW91dDsKKwkJaHJ0aW1lcl9pbml0X29uX3N0YWNrKCZ0by0+dGltZXIsIGNsb2NrcnQgPyBDTE9DS19SRUFMVElNRSA6CisJCQkJICAgICAgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJaHJ0aW1lcl9pbml0X3NsZWVwZXIodG8sIGN1cnJlbnQpOworCQlocnRpbWVyX3NldF9leHBpcmVzX3JhbmdlX25zKCZ0by0+dGltZXIsICphYnNfdGltZSwKKwkJCQkJICAgICBjdXJyZW50LT50aW1lcl9zbGFja19ucyk7CisJfQorCisJLyoKKwkgKiBUaGUgd2FpdGVyIGlzIGFsbG9jYXRlZCBvbiBvdXIgc3RhY2ssIG1hbmlwdWxhdGVkIGJ5IHRoZSByZXF1ZXVlCisJICogY29kZSB3aGlsZSB3ZSBzbGVlcCBvbiB1YWRkci4KKwkgKi8KKwlkZWJ1Z19ydF9tdXRleF9pbml0X3dhaXRlcigmcnRfd2FpdGVyKTsKKwlydF93YWl0ZXIudGFzayA9IE5VTEw7CisKKwlxLnBpX3N0YXRlID0gTlVMTDsKKwlxLmJpdHNldCA9IGJpdHNldDsKKwlxLnJ0X3dhaXRlciA9ICZydF93YWl0ZXI7CisKKwlrZXkyID0gRlVURVhfS0VZX0lOSVQ7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZzaGFyZWQsICZrZXkyLCBWRVJJRllfV1JJVEUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0OworCisJLyogUHJlcGFyZSB0byB3YWl0IG9uIHVhZGRyLiAqLworCXJldCA9IGZ1dGV4X3dhaXRfc2V0dXAodWFkZHIsIHZhbCwgZnNoYXJlZCwgJnEsICZoYik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfa2V5MjsKKworCS8qIFF1ZXVlIHRoZSBmdXRleF9xLCBkcm9wIHRoZSBoYiBsb2NrLCB3YWl0IGZvciB3YWtldXAuICovCisJZnV0ZXhfd2FpdF9xdWV1ZV9tZShoYiwgJnEsIHRvKTsKKworCXNwaW5fbG9jaygmaGItPmxvY2spOworCXJldCA9IGhhbmRsZV9lYXJseV9yZXF1ZXVlX3BpX3dha2V1cChoYiwgJnEsICZrZXkyLCB0byk7CisJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wdXRfa2V5czsKKworCS8qCisJICogSW4gb3JkZXIgZm9yIHVzIHRvIGJlIGhlcmUsIHdlIGtub3cgb3VyIHEua2V5ID09IGtleTIsIGFuZCBzaW5jZQorCSAqIHdlIHRvb2sgdGhlIGhiLT5sb2NrIGFib3ZlLCB3ZSBhbHNvIGtub3cgdGhhdCBmdXRleF9yZXF1ZXVlKCkgaGFzCisJICogY29tcGxldGVkIGFuZCB3ZSBubyBsb25nZXIgaGF2ZSB0byBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGEgd2FrZXVwCisJICogcmFjZSB3aXRoIHRoZSBhdG9taWMgcHJveHkgbG9jayBhY3F1aXRpb24gYnkgdGhlIHJlcXVldWUgY29kZS4KKwkgKi8KKworCS8qIENoZWNrIGlmIHRoZSByZXF1ZXVlIGNvZGUgYWNxdWlyZWQgdGhlIHNlY29uZCBmdXRleCBmb3IgdXMuICovCisJaWYgKCFxLnJ0X3dhaXRlcikgeworCQkvKgorCQkgKiBHb3QgdGhlIGxvY2suIFdlIG1pZ2h0IG5vdCBiZSB0aGUgYW50aWNpcGF0ZWQgb3duZXIgaWYgd2UKKwkJICogZGlkIGEgbG9jay1zdGVhbCAtIGZpeCB1cCB0aGUgUEktc3RhdGUgaW4gdGhhdCBjYXNlLgorCQkgKi8KKwkJaWYgKHEucGlfc3RhdGUgJiYgKHEucGlfc3RhdGUtPm93bmVyICE9IGN1cnJlbnQpKSB7CisJCQlzcGluX2xvY2socS5sb2NrX3B0cik7CisJCQlyZXQgPSBmaXh1cF9waV9zdGF0ZV9vd25lcih1YWRkcjIsICZxLCBjdXJyZW50LAorCQkJCQkJICAgZnNoYXJlZCk7CisJCQlzcGluX3VubG9jayhxLmxvY2tfcHRyKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYmVlbiB3b2tlbiB1cCBieSBmdXRleF91bmxvY2tfcGkoKSwgYSB0aW1lb3V0LCBvciBhCisJCSAqIHNpZ25hbC4gIGZ1dGV4X3VubG9ja19waSgpIHdpbGwgbm90IGRlc3Ryb3kgdGhlIGxvY2tfcHRyIG5vcgorCQkgKiB0aGUgcGlfc3RhdGUuCisJCSAqLworCQlXQVJOX09OKCEmcS5waV9zdGF0ZSk7CisJCXBpX211dGV4ID0gJnEucGlfc3RhdGUtPnBpX211dGV4OworCQlyZXQgPSBydF9tdXRleF9maW5pc2hfcHJveHlfbG9jayhwaV9tdXRleCwgdG8sICZydF93YWl0ZXIsIDEpOworCQlkZWJ1Z19ydF9tdXRleF9mcmVlX3dhaXRlcigmcnRfd2FpdGVyKTsKKworCQlzcGluX2xvY2socS5sb2NrX3B0cik7CisJCS8qCisJCSAqIEZpeHVwIHRoZSBwaV9zdGF0ZSBvd25lciBhbmQgcG9zc2libHkgYWNxdWlyZSB0aGUgbG9jayBpZiB3ZQorCQkgKiBoYXZlbid0IGFscmVhZHkuCisJCSAqLworCQlyZXMgPSBmaXh1cF9vd25lcih1YWRkcjIsIGZzaGFyZWQsICZxLCAhcmV0KTsKKwkJLyoKKwkJICogSWYgZml4dXBfb3duZXIoKSByZXR1cm5lZCBhbiBlcnJvciwgcHJvcHJvZ2F0ZSB0aGF0LiAgSWYgaXQKKwkJICogYWNxdWlyZWQgdGhlIGxvY2ssIGNsZWFyIG91ciAtRVRJTUVET1VUIG9yIC1FSU5UUi4KKwkJICovCisJCWlmIChyZXMpCisJCQlyZXQgPSAocmVzIDwgMCkgPyByZXMgOiAwOworCisJCS8qIFVucXVldWUgYW5kIGRyb3AgdGhlIGxvY2suICovCisJCXVucXVldWVfbWVfcGkoJnEpOworCX0KKworCS8qCisJICogSWYgZml4dXBfcGlfc3RhdGVfb3duZXIoKSBmYXVsdGVkIGFuZCB3YXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUKKwkgKiBmYXVsdCwgdW5sb2NrIHRoZSBydF9tdXRleCBhbmQgcmV0dXJuIHRoZSBmYXVsdCB0byB1c2Vyc3BhY2UuCisJICovCisJaWYgKHJldCA9PSAtRUZBVUxUKSB7CisJCWlmIChydF9tdXRleF9vd25lcihwaV9tdXRleCkgPT0gY3VycmVudCkKKwkJCXJ0X211dGV4X3VubG9jayhwaV9tdXRleCk7CisJfSBlbHNlIGlmIChyZXQgPT0gLUVJTlRSKSB7CisJCS8qCisJCSAqIFdlJ3ZlIGFscmVhZHkgYmVlbiByZXF1ZXVlZCwgYnV0IHdlIGhhdmUgbm8gd2F5IHRvCisJCSAqIHJlc3RhcnQgYnkgY2FsbGluZyBmdXRleF9sb2NrX3BpKCkgZGlyZWN0bHkuIFdlCisJCSAqIGNvdWxkIHJlc3RhcnQgdGhlIHN5c2NhbGwsIGJ1dCB0aGF0IHdpbGwgbG9vayBhdAorCQkgKiB0aGUgdXNlciBzcGFjZSB2YWx1ZSBhbmQgcmV0dXJuIHJpZ2h0IGF3YXkuIFNvIHdlCisJCSAqIGRyb3AgYmFjayB3aXRoIEVXT1VMREJMT0NLIHRvIHRlbGwgdXNlciBzcGFjZSB0aGF0CisJCSAqICJ2YWwiIGhhcyBiZWVuIGNoYW5nZWQuIFRoYXQncyB0aGUgc2FtZSB3aGF0IHRoZQorCQkgKiByZXN0YXJ0IG9mIHRoZSBzeXNjYWxsIHdvdWxkIGRvIGluCisJCSAqIGZ1dGV4X3dhaXRfc2V0dXAoKS4KKwkJICovCisJCXJldCA9IC1FV09VTERCTE9DSzsKKwl9CisKK291dF9wdXRfa2V5czoKKwlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CitvdXRfa2V5MjoKKwlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkyKTsKKworb3V0OgorCWlmICh0bykgeworCQlocnRpbWVyX2NhbmNlbCgmdG8tPnRpbWVyKTsKKwkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogU3VwcG9ydCBmb3Igcm9idXN0IGZ1dGV4ZXM6IHRoZSBrZXJuZWwgY2xlYW5zIHVwIGhlbGQgZnV0ZXhlcyBhdAogICogdGhyZWFkIGV4aXQgdGltZS4KQEAgLTE4OTYsNyArMjQ3NSw3IEBACiAJCWZzaGFyZWQgPSAxOwogCiAJY2xvY2tydCA9IG9wICYgRlVURVhfQ0xPQ0tfUkVBTFRJTUU7Ci0JaWYgKGNsb2NrcnQgJiYgY21kICE9IEZVVEVYX1dBSVRfQklUU0VUKQorCWlmIChjbG9ja3J0ICYmIGNtZCAhPSBGVVRFWF9XQUlUX0JJVFNFVCAmJiBjbWQgIT0gRlVURVhfV0FJVF9SRVFVRVVFX1BJKQogCQlyZXR1cm4gLUVOT1NZUzsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC0xOTExLDEwICsyNDkwLDExIEBACiAJCXJldCA9IGZ1dGV4X3dha2UodWFkZHIsIGZzaGFyZWQsIHZhbCwgdmFsMyk7CiAJCWJyZWFrOwogCWNhc2UgRlVURVhfUkVRVUVVRToKLQkJcmV0ID0gZnV0ZXhfcmVxdWV1ZSh1YWRkciwgZnNoYXJlZCwgdWFkZHIyLCB2YWwsIHZhbDIsIE5VTEwpOworCQlyZXQgPSBmdXRleF9yZXF1ZXVlKHVhZGRyLCBmc2hhcmVkLCB1YWRkcjIsIHZhbCwgdmFsMiwgTlVMTCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgRlVURVhfQ01QX1JFUVVFVUU6Ci0JCXJldCA9IGZ1dGV4X3JlcXVldWUodWFkZHIsIGZzaGFyZWQsIHVhZGRyMiwgdmFsLCB2YWwyLCAmdmFsMyk7CisJCXJldCA9IGZ1dGV4X3JlcXVldWUodWFkZHIsIGZzaGFyZWQsIHVhZGRyMiwgdmFsLCB2YWwyLCAmdmFsMywKKwkJCQkgICAgMCk7CiAJCWJyZWFrOwogCWNhc2UgRlVURVhfV0FLRV9PUDoKIAkJcmV0ID0gZnV0ZXhfd2FrZV9vcCh1YWRkciwgZnNoYXJlZCwgdWFkZHIyLCB2YWwsIHZhbDIsIHZhbDMpOwpAQCAtMTkzMSw2ICsyNTExLDE1IEBACiAJCWlmIChmdXRleF9jbXB4Y2hnX2VuYWJsZWQpCiAJCQlyZXQgPSBmdXRleF9sb2NrX3BpKHVhZGRyLCBmc2hhcmVkLCAwLCB0aW1lb3V0LCAxKTsKIAkJYnJlYWs7CisJY2FzZSBGVVRFWF9XQUlUX1JFUVVFVUVfUEk6CisJCXZhbDMgPSBGVVRFWF9CSVRTRVRfTUFUQ0hfQU5ZOworCQlyZXQgPSBmdXRleF93YWl0X3JlcXVldWVfcGkodWFkZHIsIGZzaGFyZWQsIHZhbCwgdGltZW91dCwgdmFsMywKKwkJCQkJICAgIGNsb2NrcnQsIHVhZGRyMik7CisJCWJyZWFrOworCWNhc2UgRlVURVhfQ01QX1JFUVVFVUVfUEk6CisJCXJldCA9IGZ1dGV4X3JlcXVldWUodWFkZHIsIGZzaGFyZWQsIHVhZGRyMiwgdmFsLCB2YWwyLCAmdmFsMywKKwkJCQkgICAgMSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9TWVM7CiAJfQpAQCAtMTk0OCw3ICsyNTM3LDggQEAKIAlpbnQgY21kID0gb3AgJiBGVVRFWF9DTURfTUFTSzsKIAogCWlmICh1dGltZSAmJiAoY21kID09IEZVVEVYX1dBSVQgfHwgY21kID09IEZVVEVYX0xPQ0tfUEkgfHwKLQkJICAgICAgY21kID09IEZVVEVYX1dBSVRfQklUU0VUKSkgeworCQkgICAgICBjbWQgPT0gRlVURVhfV0FJVF9CSVRTRVQgfHwKKwkJICAgICAgY21kID09IEZVVEVYX1dBSVRfUkVRVUVVRV9QSSkpIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0cywgdXRpbWUsIHNpemVvZih0cykpICE9IDApCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKCF0aW1lc3BlY192YWxpZCgmdHMpKQpAQCAtMTk2MCwxMSArMjU1MCwxMSBAQAogCQl0cCA9ICZ0OwogCX0KIAkvKgotCSAqIHJlcXVldWUgcGFyYW1ldGVyIGluICd1dGltZScgaWYgY21kID09IEZVVEVYX1JFUVVFVUUuCisJICogcmVxdWV1ZSBwYXJhbWV0ZXIgaW4gJ3V0aW1lJyBpZiBjbWQgPT0gRlVURVhfKl9SRVFVRVVFXyouCiAJICogbnVtYmVyIG9mIHdhaXRlcnMgdG8gd2FrZSBpbiAndXRpbWUnIGlmIGNtZCA9PSBGVVRFWF9XQUtFX09QLgogCSAqLwogCWlmIChjbWQgPT0gRlVURVhfUkVRVUVVRSB8fCBjbWQgPT0gRlVURVhfQ01QX1JFUVVFVUUgfHwKLQkgICAgY21kID09IEZVVEVYX1dBS0VfT1ApCisJICAgIGNtZCA9PSBGVVRFWF9DTVBfUkVRVUVVRV9QSSB8fCBjbWQgPT0gRlVURVhfV0FLRV9PUCkKIAkJdmFsMiA9ICh1MzIpICh1bnNpZ25lZCBsb25nKSB1dGltZTsKIAogCXJldHVybiBkb19mdXRleCh1YWRkciwgb3AsIHZhbCwgdHAsIHVhZGRyMiwgdmFsMiwgdmFsMyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL01ha2VmaWxlIGIva2VybmVsL2lycS9NYWtlZmlsZQppbmRleCAzMzk0ZjhmLi43ZDA0NzgwIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL01ha2VmaWxlCisrKyBiL2tlcm5lbC9pcnEvTWFrZWZpbGUKQEAgLTMsNSArMyw1IEBACiBvYmotJChDT05GSUdfR0VORVJJQ19JUlFfUFJPQkUpICs9IGF1dG9wcm9iZS5vCiBvYmotJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSkgKz0gbWlncmF0aW9uLm8KLW9iai0kKENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MpICs9IG51bWFfbWlncmF0ZS5vCitvYmotJChDT05GSUdfTlVNQV9JUlFfREVTQykgKz0gbnVtYV9taWdyYXRlLm8KIG9iai0kKENPTkZJR19QTV9TTEVFUCkgKz0gcG0ubwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9jaGlwLmMgYi9rZXJuZWwvaXJxL2NoaXAuYwppbmRleCBjNjg3YmE0Li4xM2M2OGU3IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2NoaXAuYworKysgYi9rZXJuZWwvaXJxL2NoaXAuYwpAQCAtMzU5LDcgKzM1OSw2IEBACiAKIAlzcGluX2xvY2soJmRlc2MtPmxvY2spOwogCW1hc2tfYWNrX2lycShkZXNjLCBpcnEpOwotCWRlc2MgPSBpcnFfcmVtYXBfdG9fZGVzYyhpcnEsIGRlc2MpOwogCiAJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKSkKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtNDM4LDcgKzQzNyw2IEBACiAJZGVzYy0+c3RhdHVzICY9IH5JUlFfSU5QUk9HUkVTUzsKIG91dDoKIAlkZXNjLT5jaGlwLT5lb2koaXJxKTsKLQlkZXNjID0gaXJxX3JlbWFwX3RvX2Rlc2MoaXJxLCBkZXNjKTsKIAogCXNwaW5fdW5sb2NrKCZkZXNjLT5sb2NrKTsKIH0KQEAgLTQ3NSw3ICs0NzMsNiBAQAogCQkgICAgIWRlc2MtPmFjdGlvbikpIHsKIAkJZGVzYy0+c3RhdHVzIHw9IChJUlFfUEVORElORyB8IElSUV9NQVNLRUQpOwogCQltYXNrX2Fja19pcnEoZGVzYywgaXJxKTsKLQkJZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CkBAIC00ODMsNyArNDgwLDYgQEAKIAkvKiBTdGFydCBoYW5kbGluZyB0aGUgaXJxICovCiAJaWYgKGRlc2MtPmNoaXAtPmFjaykKIAkJZGVzYy0+Y2hpcC0+YWNrKGlycSk7Ci0JZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7CiAKIAkvKiBNYXJrIHRoZSBJUlEgY3VycmVudGx5IGluIHByb2dyZXNzLiovCiAJZGVzYy0+c3RhdHVzIHw9IElSUV9JTlBST0dSRVNTOwpAQCAtNTQ0LDEwICs1NDAsOCBAQAogCWlmICghbm9pcnFkZWJ1ZykKIAkJbm90ZV9pbnRlcnJ1cHQoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKIAotCWlmIChkZXNjLT5jaGlwLT5lb2kpIHsKKwlpZiAoZGVzYy0+Y2hpcC0+ZW9pKQogCQlkZXNjLT5jaGlwLT5lb2koaXJxKTsKLQkJZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7Ci0JfQogfQogCiB2b2lkCkBAIC01ODIsMTAgKzU3Niw4IEBACiAKIAkvKiBVbmluc3RhbGw/ICovCiAJaWYgKGhhbmRsZSA9PSBoYW5kbGVfYmFkX2lycSkgewotCQlpZiAoZGVzYy0+Y2hpcCAhPSAmbm9faXJxX2NoaXApIHsKKwkJaWYgKGRlc2MtPmNoaXAgIT0gJm5vX2lycV9jaGlwKQogCQkJbWFza19hY2tfaXJxKGRlc2MsIGlycSk7Ci0JCQlkZXNjID0gaXJxX3JlbWFwX3RvX2Rlc2MoaXJxLCBkZXNjKTsKLQkJfQogCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0RJU0FCTEVEOwogCQlkZXNjLT5kZXB0aCA9IDE7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9oYW5kbGUuYyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKaW5kZXggMjZlMDg3NS4uMTA0NTc4NSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9oYW5kbGUuYworKysgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCkBAIC0xMSwxNCArMTEsMTUgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KLSNpbmNsdWRlIDx0cmFjZS9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2lycS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWxzLmgiCiAKQEAgLTgxLDQ1ICs4Miw0OCBAQAogCS5sb2NrICAgICAgID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoaXJxX2Rlc2NfaW5pdC5sb2NrKSwKIH07CiAKLXZvaWQgaW5pdF9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSwgaW50IG5yKQordm9pZCBfX3JlZiBpbml0X2tzdGF0X2lycXMoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSwgaW50IG5yKQogewotCWludCBub2RlOwogCXZvaWQgKnB0cjsKIAotCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwotCXB0ciA9IGt6YWxsb2Nfbm9kZShuciAqIHNpemVvZigqZGVzYy0+a3N0YXRfaXJxcyksIEdGUF9BVE9NSUMsIG5vZGUpOworCWlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKQorCQlwdHIgPSBremFsbG9jX25vZGUobnIgKiBzaXplb2YoKmRlc2MtPmtzdGF0X2lycXMpLAorCQkJCSAgIEdGUF9BVE9NSUMsIG5vZGUpOworCWVsc2UKKwkJcHRyID0gYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKKwkJCQluciAqIHNpemVvZigqZGVzYy0+a3N0YXRfaXJxcykpOwogCiAJLyoKIAkgKiBkb24ndCBvdmVyd2l0ZSBpZiBjYW4gbm90IGdldCBuZXcgb25lCiAJICogaW5pdF9jb3B5X2tzdGF0X2lycXMoKSBjb3VsZCBzdGlsbCB1c2Ugb2xkIG9uZQogCSAqLwogCWlmIChwdHIpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWxsb2Mga3N0YXRfaXJxcyBvbiBjcHUgJWQgbm9kZSAlZFxuIiwKLQkJCSBjcHUsIG5vZGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5vZGUgJWRcbiIsIG5vZGUpOwogCQlkZXNjLT5rc3RhdF9pcnFzID0gcHRyOwogCX0KIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmVfaXJxX2Rlc2MoaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1KQorc3RhdGljIHZvaWQgaW5pdF9vbmVfaXJxX2Rlc2MoaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSkKIHsKIAltZW1jcHkoZGVzYywgJmlycV9kZXNjX2luaXQsIHNpemVvZihzdHJ1Y3QgaXJxX2Rlc2MpKTsKIAogCXNwaW5fbG9ja19pbml0KCZkZXNjLT5sb2NrKTsKIAlkZXNjLT5pcnEgPSBpcnE7CiAjaWZkZWYgQ09ORklHX1NNUAotCWRlc2MtPmNwdSA9IGNwdTsKKwlkZXNjLT5ub2RlID0gbm9kZTsKICNlbmRpZgogCWxvY2tkZXBfc2V0X2NsYXNzKCZkZXNjLT5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7Ci0JaW5pdF9rc3RhdF9pcnFzKGRlc2MsIGNwdSwgbnJfY3B1X2lkcyk7CisJaW5pdF9rc3RhdF9pcnFzKGRlc2MsIG5vZGUsIG5yX2NwdV9pZHMpOwogCWlmICghZGVzYy0+a3N0YXRfaXJxcykgewogCQlwcmludGsoS0VSTl9FUlIgImNhbiBub3QgYWxsb2Mga3N0YXRfaXJxc1xuIik7CiAJCUJVR19PTigxKTsKIAl9Ci0JaWYgKCFpbml0X2FsbG9jX2Rlc2NfbWFza3MoZGVzYywgY3B1LCBmYWxzZSkpIHsKKwlpZiAoIWFsbG9jX2Rlc2NfbWFza3MoZGVzYywgbm9kZSwgZmFsc2UpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2FuIG5vdCBhbGxvYyBpcnFfZGVzYyBjcHVtYXNrc1xuIik7CiAJCUJVR19PTigxKTsKIAl9Ci0JYXJjaF9pbml0X2NoaXBfZGF0YShkZXNjLCBjcHUpOworCWluaXRfZGVzY19tYXNrcyhkZXNjKTsKKwlhcmNoX2luaXRfY2hpcF9kYXRhKGRlc2MsIG5vZGUpOwogfQogCiAvKgpAQCAtMTQ2LDYgKzE1MCw3IEBACiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCWludCBsZWdhY3lfY291bnQ7CisJaW50IG5vZGU7CiAJaW50IGk7CiAKIAlpbml0X2lycV9kZWZhdWx0X2FmZmluaXR5KCk7CkBAIC0xNTYsMjAgKzE2MSwyMSBAQAogCiAJZGVzYyA9IGlycV9kZXNjX2xlZ2FjeTsKIAlsZWdhY3lfY291bnQgPSBBUlJBWV9TSVpFKGlycV9kZXNjX2xlZ2FjeSk7CisgCW5vZGUgPSBmaXJzdF9vbmxpbmVfbm9kZTsKIAogCS8qIGFsbG9jYXRlIGlycV9kZXNjX3B0cnMgYXJyYXkgYmFzZWQgb24gbnJfaXJxcyAqLwotCWlycV9kZXNjX3B0cnMgPSBhbGxvY19ib290bWVtKG5yX2lycXMgKiBzaXplb2Yodm9pZCAqKSk7CisJaXJxX2Rlc2NfcHRycyA9IGtjYWxsb2MobnJfaXJxcywgc2l6ZW9mKHZvaWQgKiksIEdGUF9OT1dBSVQpOwogCiAJLyogYWxsb2NhdGUgYmFzZWQgb24gbnJfY3B1X2lkcyAqLwotCS8qIEZJWE1FOiBpbnZlcnQga3N0YXRfaXJncywgYW5kIGl0J2QgYmUgYSBwZXJfY3B1X2FsbG9jJ2QgdGhpbmcgKi8KLQlrc3RhdF9pcnFzX2xlZ2FjeSA9IGFsbG9jX2Jvb3RtZW0oTlJfSVJRU19MRUdBQ1kgKiBucl9jcHVfaWRzICoKLQkJCQkJICBzaXplb2YoaW50KSk7CisJa3N0YXRfaXJxc19sZWdhY3kgPSBremFsbG9jX25vZGUoTlJfSVJRU19MRUdBQ1kgKiBucl9jcHVfaWRzICoKKwkJCQkJICBzaXplb2YoaW50KSwgR0ZQX05PV0FJVCwgbm9kZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVnYWN5X2NvdW50OyBpKyspIHsKIAkJZGVzY1tpXS5pcnEgPSBpOwogCQlkZXNjW2ldLmtzdGF0X2lycXMgPSBrc3RhdF9pcnFzX2xlZ2FjeSArIGkgKiBucl9jcHVfaWRzOwogCQlsb2NrZGVwX3NldF9jbGFzcygmZGVzY1tpXS5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7Ci0JCWluaXRfYWxsb2NfZGVzY19tYXNrcygmZGVzY1tpXSwgMCwgdHJ1ZSk7CisJCWFsbG9jX2Rlc2NfbWFza3MoJmRlc2NbaV0sIG5vZGUsIHRydWUpOworCQlpbml0X2Rlc2NfbWFza3MoJmRlc2NbaV0pOwogCQlpcnFfZGVzY19wdHJzW2ldID0gZGVzYyArIGk7CiAJfQogCkBAIC0xODcsMTEgKzE5MywxMCBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdHJ1Y3QgaXJxX2Rlc2MgKmlycV90b19kZXNjX2FsbG9jX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KQorc3RydWN0IGlycV9kZXNjICogX19yZWYgaXJxX3RvX2Rlc2NfYWxsb2Nfbm9kZSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgbm9kZSkKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbm9kZTsKIAogCWlmIChpcnEgPj0gbnJfaXJxcykgewogCQlXQVJOKDEsICJpcnEgKCVkKSA+PSBucl9pcnFzICglZCkgaW4gaXJxX3RvX2Rlc2NfYWxsb2NcbiIsCkBAIC0yMTAsMTUgKzIxNSwxNyBAQAogCWlmIChkZXNjKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKLQlkZXNjID0ga3phbGxvY19ub2RlKHNpemVvZigqZGVzYyksIEdGUF9BVE9NSUMsIG5vZGUpOwotCXByaW50ayhLRVJOX0RFQlVHICIgIGFsbG9jIGlycV9kZXNjIGZvciAlZCBvbiBjcHUgJWQgbm9kZSAlZFxuIiwKLQkJIGlycSwgY3B1LCBub2RlKTsKKwlpZiAoc2xhYl9pc19hdmFpbGFibGUoKSkKKwkJZGVzYyA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmRlc2MpLCBHRlBfQVRPTUlDLCBub2RlKTsKKwllbHNlCisJCWRlc2MgPSBhbGxvY19ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGUpLCBzaXplb2YoKmRlc2MpKTsKKworCXByaW50ayhLRVJOX0RFQlVHICIgIGFsbG9jIGlycV9kZXNjIGZvciAlZCBvbiBub2RlICVkXG4iLCBpcnEsIG5vZGUpOwogCWlmICghZGVzYykgewogCQlwcmludGsoS0VSTl9FUlIgImNhbiBub3QgYWxsb2MgaXJxX2Rlc2NcbiIpOwogCQlCVUdfT04oMSk7CiAJfQotCWluaXRfb25lX2lycV9kZXNjKGlycSwgZGVzYywgY3B1KTsKKwlpbml0X29uZV9pcnFfZGVzYyhpcnEsIGRlc2MsIG5vZGUpOwogCiAJaXJxX2Rlc2NfcHRyc1tpcnFdID0gZGVzYzsKIApAQCAtMjU2LDcgKzI2Myw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlkZXNjW2ldLmlycSA9IGk7Ci0JCWluaXRfYWxsb2NfZGVzY19tYXNrcygmZGVzY1tpXSwgMCwgdHJ1ZSk7CisJCWFsbG9jX2Rlc2NfbWFza3MoJmRlc2NbaV0sIDAsIHRydWUpOworCQlpbml0X2Rlc2NfbWFza3MoJmRlc2NbaV0pOwogCQlkZXNjW2ldLmtzdGF0X2lycXMgPSBrc3RhdF9pcnFzX2FsbFtpXTsKIAl9CiAJcmV0dXJuIGFyY2hfZWFybHlfaXJxX2luaXQoKTsKQEAgLTI2Nyw3ICsyNzUsNyBAQAogCXJldHVybiAoaXJxIDwgTlJfSVJRUykgPyBpcnFfZGVzYyArIGlycSA6IE5VTEw7CiB9CiAKLXN0cnVjdCBpcnFfZGVzYyAqaXJxX3RvX2Rlc2NfYWxsb2NfY3B1KHVuc2lnbmVkIGludCBpcnEsIGludCBjcHUpCitzdHJ1Y3QgaXJxX2Rlc2MgKmlycV90b19kZXNjX2FsbG9jX25vZGUodW5zaWduZWQgaW50IGlycSwgaW50IG5vZGUpCiB7CiAJcmV0dXJuIGlycV90b19kZXNjKGlycSk7CiB9CkBAIC0zNDgsOSArMzU2LDYgQEAKIAkgICAgICAgImJ1dCBubyB0aHJlYWQgZnVuY3Rpb24gYXZhaWxhYmxlLiIsIGlycSwgYWN0aW9uLT5uYW1lKTsKIH0KIAotREVGSU5FX1RSQUNFKGlycV9oYW5kbGVyX2VudHJ5KTsKLURFRklORV9UUkFDRShpcnFfaGFuZGxlcl9leGl0KTsKLQogLyoqCiAgKiBoYW5kbGVfSVJRX2V2ZW50IC0gaXJxIGFjdGlvbiBjaGFpbiBoYW5kbGVyCiAgKiBAaXJxOgl0aGUgaW50ZXJydXB0IG51bWJlcgpAQCAtNDUzLDExICs0NTgsOCBAQAogCQkvKgogCQkgKiBObyBsb2NraW5nIHJlcXVpcmVkIGZvciBDUFUtbG9jYWwgaW50ZXJydXB0czoKIAkJICovCi0JCWlmIChkZXNjLT5jaGlwLT5hY2spIHsKKwkJaWYgKGRlc2MtPmNoaXAtPmFjaykKIAkJCWRlc2MtPmNoaXAtPmFjayhpcnEpOwotCQkJLyogZ2V0IG5ldyBvbmUgKi8KLQkJCWRlc2MgPSBpcnFfcmVtYXBfdG9fZGVzYyhpcnEsIGRlc2MpOwotCQl9CiAJCWlmIChsaWtlbHkoIShkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpKSkgewogCQkJYWN0aW9uX3JldCA9IGhhbmRsZV9JUlFfZXZlbnQoaXJxLCBkZXNjLT5hY3Rpb24pOwogCQkJaWYgKCFub2lycWRlYnVnKQpAQCAtNDY4LDEwICs0NzAsOCBAQAogCX0KIAogCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7Ci0JaWYgKGRlc2MtPmNoaXAtPmFjaykgeworCWlmIChkZXNjLT5jaGlwLT5hY2spCiAJCWRlc2MtPmNoaXAtPmFjayhpcnEpOwotCQlkZXNjID0gaXJxX3JlbWFwX3RvX2Rlc2MoaXJxLCBkZXNjKTsKLQl9CiAJLyoKIAkgKiBSRVBMQVkgaXMgd2hlbiBMaW51eCByZXNlbmRzIGFuIElSUSB0aGF0IHdhcyBkcm9wcGVkIGVhcmxpZXIKIAkgKiBXQUlUSU5HIGlzIHVzZWQgYnkgcHJvYmUgdG8gbWFyayBpcnFzIHRoYXQgYXJlIGJlaW5nIHRlc3RlZApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9pbnRlcm5hbHMuaCBiL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmgKaW5kZXggMDFjZTIwZS4uNzM0NjgyNSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9pbnRlcm5hbHMuaAorKysgYi9rZXJuZWwvaXJxL2ludGVybmFscy5oCkBAIC0xNiw3ICsxNiw3IEBACiBleHRlcm4gdm9pZCBfX2VuYWJsZV9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjLCB1bnNpZ25lZCBpbnQgaXJxLCBib29sIHJlc3VtZSk7CiAKIGV4dGVybiBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgaXJxX2Rlc2NfbG9ja19jbGFzczsKLWV4dGVybiB2b2lkIGluaXRfa3N0YXRfaXJxcyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUsIGludCBucik7CitleHRlcm4gdm9pZCBpbml0X2tzdGF0X2lycXMoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSwgaW50IG5yKTsKIGV4dGVybiB2b2lkIGNsZWFyX2tzdGF0X2lycXMoc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIGV4dGVybiBzcGlubG9ja190IHNwYXJzZV9pcnFfbG9jazsKIApAQCAtNDIsNiArNDIsOSBAQAogCiBleHRlcm4gaW50IGlycV9zZWxlY3RfYWZmaW5pdHlfdXNyKHVuc2lnbmVkIGludCBpcnEpOwogCitleHRlcm4gdm9pZAoraXJxX3NldF90aHJlYWRfYWZmaW5pdHkoc3RydWN0IGlycV9kZXNjICpkZXNjLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzayk7CisKIC8qCiAgKiBEZWJ1Z2dpbmcgcHJpbnRvdXQ6CiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbWFuYWdlLmMgYi9rZXJuZWwvaXJxL21hbmFnZS5jCmluZGV4IDI3MzRlY2EuLmFhZjVjOWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbWFuYWdlLmMKKysrIGIva2VybmVsL2lycS9tYW5hZ2UuYwpAQCAtODAsNyArODAsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZAordm9pZAogaXJxX3NldF90aHJlYWRfYWZmaW5pdHkoc3RydWN0IGlycV9kZXNjICpkZXNjLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaykKIHsKIAlzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24gPSBkZXNjLT5hY3Rpb247CkBAIC0xMDksMTcgKzEwOSwyMiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXNjLT5sb2NrLCBmbGFncyk7CiAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUQotCWlmIChkZXNjLT5zdGF0dXMgJiBJUlFfTU9WRV9QQ05UWFQpCi0JCWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eShpcnEsIGNwdW1hc2spOworCWlmIChkZXNjLT5zdGF0dXMgJiBJUlFfTU9WRV9QQ05UWFQpIHsKKwkJaWYgKCFkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKSkgeworCQkJY3B1bWFza19jb3B5KGRlc2MtPmFmZmluaXR5LCBjcHVtYXNrKTsKKwkJCWlycV9zZXRfdGhyZWFkX2FmZmluaXR5KGRlc2MsIGNwdW1hc2spOworCQl9CisJfQogCWVsc2UgewogCQlkZXNjLT5zdGF0dXMgfD0gSVJRX01PVkVfUEVORElORzsKIAkJY3B1bWFza19jb3B5KGRlc2MtPnBlbmRpbmdfbWFzaywgY3B1bWFzayk7CiAJfQogI2Vsc2UKLQljcHVtYXNrX2NvcHkoZGVzYy0+YWZmaW5pdHksIGNwdW1hc2spOwotCWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eShpcnEsIGNwdW1hc2spOworCWlmICghZGVzYy0+Y2hpcC0+c2V0X2FmZmluaXR5KGlycSwgY3B1bWFzaykpIHsKKwkJY3B1bWFza19jb3B5KGRlc2MtPmFmZmluaXR5LCBjcHVtYXNrKTsKKwkJaXJxX3NldF90aHJlYWRfYWZmaW5pdHkoZGVzYywgY3B1bWFzayk7CisJfQogI2VuZGlmCi0JaXJxX3NldF90aHJlYWRfYWZmaW5pdHkoZGVzYywgY3B1bWFzayk7CiAJZGVzYy0+c3RhdHVzIHw9IElSUV9BRkZJTklUWV9TRVQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9taWdyYXRpb24uYyBiL2tlcm5lbC9pcnEvbWlncmF0aW9uLmMKaW5kZXggZTA1YWQ5Yi4uY2ZlNzY3YyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9taWdyYXRpb24uYworKysgYi9rZXJuZWwvaXJxL21pZ3JhdGlvbi5jCkBAIC0xLDUgKzEsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJpbnRlcm5hbHMuaCIKIAogdm9pZCBtb3ZlX21hc2tlZF9pcnEoaW50IGlycSkKIHsKQEAgLTM5LDExICs0MiwxMiBAQAogCSAqIG1hc2tpbmcgdGhlIGlycXMuCiAJICovCiAJaWYgKGxpa2VseShjcHVtYXNrX2FueV9hbmQoZGVzYy0+cGVuZGluZ19tYXNrLCBjcHVfb25saW5lX21hc2spCi0JCSAgIDwgbnJfY3B1X2lkcykpIHsKLQkJY3B1bWFza19hbmQoZGVzYy0+YWZmaW5pdHksCi0JCQkgICAgZGVzYy0+cGVuZGluZ19tYXNrLCBjcHVfb25saW5lX21hc2spOwotCQlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBkZXNjLT5hZmZpbml0eSk7Ci0JfQorCQkgICA8IG5yX2NwdV9pZHMpKQorCQlpZiAoIWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eShpcnEsIGRlc2MtPnBlbmRpbmdfbWFzaykpIHsKKwkJCWNwdW1hc2tfY29weShkZXNjLT5hZmZpbml0eSwgZGVzYy0+cGVuZGluZ19tYXNrKTsKKwkJCWlycV9zZXRfdGhyZWFkX2FmZmluaXR5KGRlc2MsIGRlc2MtPnBlbmRpbmdfbWFzayk7CisJCX0KKwogCWNwdW1hc2tfY2xlYXIoZGVzYy0+cGVuZGluZ19tYXNrKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9udW1hX21pZ3JhdGUuYyBiL2tlcm5lbC9pcnEvbnVtYV9taWdyYXRlLmMKaW5kZXggNDRiYmRjYi4uMmY2OWJlZSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9udW1hX21pZ3JhdGUuYworKysgYi9rZXJuZWwvaXJxL251bWFfbWlncmF0ZS5jCkBAIC0xNSw5ICsxNSw5IEBACiAKIHN0YXRpYyB2b2lkIGluaXRfY29weV9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsCiAJCQkJIHN0cnVjdCBpcnFfZGVzYyAqZGVzYywKLQkJCQkgaW50IGNwdSwgaW50IG5yKQorCQkJCSBpbnQgbm9kZSwgaW50IG5yKQogewotCWluaXRfa3N0YXRfaXJxcyhkZXNjLCBjcHUsIG5yKTsKKwlpbml0X2tzdGF0X2lycXMoZGVzYywgbm9kZSwgbnIpOwogCiAJaWYgKGRlc2MtPmtzdGF0X2lycXMgIT0gb2xkX2Rlc2MtPmtzdGF0X2lycXMpCiAJCW1lbWNweShkZXNjLT5rc3RhdF9pcnFzLCBvbGRfZGVzYy0+a3N0YXRfaXJxcywKQEAgLTM0LDIwICszNCwyMCBAQAogfQogCiBzdGF0aWMgYm9vbCBpbml0X2NvcHlfb25lX2lycV9kZXNjKGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsCi0JCSBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUpCisJCSBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBub2RlKQogewogCW1lbWNweShkZXNjLCBvbGRfZGVzYywgc2l6ZW9mKHN0cnVjdCBpcnFfZGVzYykpOwotCWlmICghaW5pdF9hbGxvY19kZXNjX21hc2tzKGRlc2MsIGNwdSwgZmFsc2UpKSB7CisJaWYgKCFhbGxvY19kZXNjX21hc2tzKGRlc2MsIG5vZGUsIGZhbHNlKSkgewogCQlwcmludGsoS0VSTl9FUlIgImlycSAlZDogY2FuIG5vdCBnZXQgbmV3IGlycV9kZXNjIGNwdW1hc2sgIgogCQkJCSJmb3IgbWlncmF0aW9uLlxuIiwgaXJxKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlzcGluX2xvY2tfaW5pdCgmZGVzYy0+bG9jayk7Ci0JZGVzYy0+Y3B1ID0gY3B1OworCWRlc2MtPm5vZGUgPSBub2RlOwogCWxvY2tkZXBfc2V0X2NsYXNzKCZkZXNjLT5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7Ci0JaW5pdF9jb3B5X2tzdGF0X2lycXMob2xkX2Rlc2MsIGRlc2MsIGNwdSwgbnJfY3B1X2lkcyk7CisJaW5pdF9jb3B5X2tzdGF0X2lycXMob2xkX2Rlc2MsIGRlc2MsIG5vZGUsIG5yX2NwdV9pZHMpOwogCWluaXRfY29weV9kZXNjX21hc2tzKG9sZF9kZXNjLCBkZXNjKTsKLQlhcmNoX2luaXRfY29weV9jaGlwX2RhdGEob2xkX2Rlc2MsIGRlc2MsIGNwdSk7CisJYXJjaF9pbml0X2NvcHlfY2hpcF9kYXRhKG9sZF9kZXNjLCBkZXNjLCBub2RlKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNTksMTIgKzU5LDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2Rlc2MgKl9fcmVhbF9tb3ZlX2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsCi0JCQkJCQlpbnQgY3B1KQorCQkJCQkJaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXVuc2lnbmVkIGludCBpcnE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbm9kZTsKIAogCWlycSA9IG9sZF9kZXNjLT5pcnE7CiAKQEAgLTc2LDcgKzc1LDYgQEAKIAlpZiAoZGVzYyAmJiBvbGRfZGVzYyAhPSBkZXNjKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKIAlkZXNjID0ga3phbGxvY19ub2RlKHNpemVvZigqZGVzYyksIEdGUF9BVE9NSUMsIG5vZGUpOwogCWlmICghZGVzYykgewogCQlwcmludGsoS0VSTl9FUlIgImlycSAlZDogY2FuIG5vdCBnZXQgbmV3IGlycV9kZXNjICIKQEAgLTg1LDcgKzgzLDcgQEAKIAkJZGVzYyA9IG9sZF9kZXNjOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQotCWlmICghaW5pdF9jb3B5X29uZV9pcnFfZGVzYyhpcnEsIG9sZF9kZXNjLCBkZXNjLCBjcHUpKSB7CisJaWYgKCFpbml0X2NvcHlfb25lX2lycV9kZXNjKGlycSwgb2xkX2Rlc2MsIGRlc2MsIG5vZGUpKSB7CiAJCS8qIHN0aWxsIHVzZSBvbGQgb25lICovCiAJCWtmcmVlKGRlc2MpOwogCQlkZXNjID0gb2xkX2Rlc2M7CkBAIC05Nyw5ICs5NSw3IEBACiAKIAkvKiBmcmVlIHRoZSBvbGQgb25lICovCiAJZnJlZV9vbmVfaXJxX2Rlc2Mob2xkX2Rlc2MsIGRlc2MpOwotCXNwaW5fdW5sb2NrKCZvbGRfZGVzYy0+bG9jayk7CiAJa2ZyZWUob2xkX2Rlc2MpOwotCXNwaW5fbG9jaygmZGVzYy0+bG9jayk7CiAKIAlyZXR1cm4gZGVzYzsKIApAQCAtMTA5LDI0ICsxMDUsMTQgQEAKIAlyZXR1cm4gZGVzYzsKIH0KIAotc3RydWN0IGlycV9kZXNjICptb3ZlX2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSkKK3N0cnVjdCBpcnFfZGVzYyAqbW92ZV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBub2RlKQogewotCWludCBvbGRfY3B1OwotCWludCBub2RlLCBvbGRfbm9kZTsKLQogCS8qIHRob3NlIGFsbCBzdGF0aWMsIGRvIG1vdmUgdGhlbSAqLwogCWlmIChkZXNjLT5pcnEgPCBOUl9JUlFTX0xFR0FDWSkKIAkJcmV0dXJuIGRlc2M7CiAKLQlvbGRfY3B1ID0gZGVzYy0+Y3B1OwotCWlmIChvbGRfY3B1ICE9IGNwdSkgewotCQlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKLQkJb2xkX25vZGUgPSBjcHVfdG9fbm9kZShvbGRfY3B1KTsKLQkJaWYgKG9sZF9ub2RlICE9IG5vZGUpCi0JCQlkZXNjID0gX19yZWFsX21vdmVfaXJxX2Rlc2MoZGVzYywgY3B1KTsKLQkJZWxzZQotCQkJZGVzYy0+Y3B1ID0gY3B1OwotCX0KKwlpZiAoZGVzYy0+bm9kZSAhPSBub2RlKQorCQlkZXNjID0gX19yZWFsX21vdmVfaXJxX2Rlc2MoZGVzYywgbm9kZSk7CiAKIAlyZXR1cm4gZGVzYzsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9rdGhyZWFkLmMgYi9rZXJuZWwva3RocmVhZC5jCmluZGV4IDRlYmFmODUuLjQxYzg4ZmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rdGhyZWFkLmMKKysrIGIva2VybmVsL2t0aHJlYWQuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPHRyYWNlL3NjaGVkLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CiAKICNkZWZpbmUgS1RIUkVBRF9OSUNFX0xFVkVMICgtNSkKIApAQCAtMjEsOSArMjEsNiBAQAogc3RhdGljIExJU1RfSEVBRChrdGhyZWFkX2NyZWF0ZV9saXN0KTsKIHN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZGRfdGFzazsKIAotREVGSU5FX1RSQUNFKHNjaGVkX2t0aHJlYWRfc3RvcCk7Ci1ERUZJTkVfVFJBQ0Uoc2NoZWRfa3RocmVhZF9zdG9wX3JldCk7Ci0KIHN0cnVjdCBrdGhyZWFkX2NyZWF0ZV9pbmZvCiB7CiAJLyogSW5mb3JtYXRpb24gcGFzc2VkIHRvIGt0aHJlYWQoKSBmcm9tIGt0aHJlYWRkLiAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggYWNjYjQwYy4uOGJiZWVmOSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC00MiwxMiArNDIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0jaW5jbHVkZSA8dHJhY2UvbG9ja2RlcC5oPgogCiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKICNpbmNsdWRlICJsb2NrZGVwX2ludGVybmFscy5oIgogCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvbG9ja2RlcC5oPgorCiAjaWZkZWYgQ09ORklHX1BST1ZFX0xPQ0tJTkcKIGludCBwcm92ZV9sb2NraW5nID0gMTsKIG1vZHVsZV9wYXJhbShwcm92ZV9sb2NraW5nLCBpbnQsIDA2NDQpOwpAQCAtMjkzNSw4ICsyOTM3LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tfc2V0X2NsYXNzKTsKIAotREVGSU5FX1RSQUNFKGxvY2tfYWNxdWlyZSk7Ci0KIC8qCiAgKiBXZSBhcmUgbm90IGFsd2F5cyBjYWxsZWQgd2l0aCBpcnFzIGRpc2FibGVkIC0gZG8gdGhhdCBoZXJlLAogICogYW5kIGFsc28gYXZvaWQgbG9ja2RlcCByZWN1cnNpb246CkBAIC0yOTYzLDggKzI5NjMsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobG9ja19hY3F1aXJlKTsKIAotREVGSU5FX1RSQUNFKGxvY2tfcmVsZWFzZSk7Ci0KIHZvaWQgbG9ja19yZWxlYXNlKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgaW50IG5lc3RlZCwKIAkJCSAgdW5zaWduZWQgbG9uZyBpcCkKIHsKQEAgLTMxMDUsNiArMzEwMyw4IEBACiAJCWhsb2NrLT5ob2xkdGltZV9zdGFtcCA9IG5vdzsKIAl9CiAKKwl0cmFjZV9sb2NrX2FjcXVpcmVkKGxvY2ssIGlwLCB3YWl0dGltZSk7CisKIAlzdGF0cyA9IGdldF9sb2NrX3N0YXRzKGhsb2NrX2NsYXNzKGhsb2NrKSk7CiAJaWYgKHdhaXR0aW1lKSB7CiAJCWlmIChobG9jay0+cmVhZCkKQEAgLTMxMjAsOCArMzEyMCw2IEBACiAJbG9jay0+aXAgPSBpcDsKIH0KIAotREVGSU5FX1RSQUNFKGxvY2tfY29udGVuZGVkKTsKLQogdm9pZCBsb2NrX2NvbnRlbmRlZChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGxvbmcgaXApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTMxNDMsMTQgKzMxNDEsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tfY29udGVuZGVkKTsKIAotREVGSU5FX1RSQUNFKGxvY2tfYWNxdWlyZWQpOwotCiB2b2lkIGxvY2tfYWNxdWlyZWQoc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQl0cmFjZV9sb2NrX2FjcXVpcmVkKGxvY2ssIGlwKTsKLQogCWlmICh1bmxpa2VseSghbG9ja19zdGF0KSkKIAkJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggZTc5NzgxMi4uMzVmN2RlMCAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtMTgsNiArMTgsNyBAQAogKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVsb2FkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2VfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtNTIsNiArNTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KIAogI2lmIDAKICNkZWZpbmUgREVCVUdQIHByaW50awpAQCAtNzIsNiArNzQsOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwobW9kdWxlX211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQobW9kdWxlcyk7CiAKKy8qIEJsb2NrIG1vZHVsZSBsb2FkaW5nL3VubG9hZGluZz8gKi8KK2ludCBtb2R1bGVzX2Rpc2FibGVkID0gMDsKKwogLyogV2FpdGluZyBmb3IgYSBtb2R1bGUgdG8gZmluaXNoIGluaXRpYWxpemluZz8gKi8KIHN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChtb2R1bGVfd3EpOwogCkBAIC00MjksNiArNDM0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGV4dHJhOwogCXVuc2lnbmVkIGludCBpOwogCXZvaWQgKnB0cjsKKwlpbnQgY3B1OwogCiAJaWYgKGFsaWduID4gUEFHRV9TSVpFKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBwZXItY3B1IGFsaWdubWVudCAlbGkgPiAlbGlcbiIsCkBAIC00NTgsNiArNDY0LDExIEBACiAJCQlpZiAoIXNwbGl0X2Jsb2NrKGksIHNpemUpKQogCQkJCXJldHVybiBOVUxMOwogCisJCS8qIGFkZCB0aGUgcGVyLWNwdSBzY2FubmluZyBhcmVhcyAqLworCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCQkJa21lbWxlYWtfYWxsb2MocHRyICsgcGVyX2NwdV9vZmZzZXQoY3B1KSwgc2l6ZSwgMCwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisKIAkJLyogTWFyayBhbGxvY2F0ZWQgKi8KIAkJcGNwdV9zaXplW2ldID0gLXBjcHVfc2l6ZVtpXTsKIAkJcmV0dXJuIHB0cjsKQEAgLTQ3Miw2ICs0ODMsNyBAQAogewogCXVuc2lnbmVkIGludCBpOwogCXZvaWQgKnB0ciA9IF9fcGVyX2NwdV9zdGFydCArIGJsb2NrX3NpemUocGNwdV9zaXplWzBdKTsKKwlpbnQgY3B1OwogCiAJLyogRmlyc3QgZW50cnkgaXMgY29yZSBrZXJuZWwgcGVyY3B1IGRhdGEuICovCiAJZm9yIChpID0gMTsgaSA8IHBjcHVfbnVtX3VzZWQ7IHB0ciArPSBibG9ja19zaXplKHBjcHVfc2l6ZVtpXSksIGkrKykgewpAQCAtNDgzLDYgKzQ5NSwxMCBAQAogCUJVRygpOwogCiAgZnJlZToKKwkvKiByZW1vdmUgdGhlIHBlci1jcHUgc2Nhbm5pbmcgYXJlYXMgKi8KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCQlrbWVtbGVha19mcmVlKGZyZWVtZSArIHBlcl9jcHVfb2Zmc2V0KGNwdSkpOworCiAJLyogTWVyZ2Ugd2l0aCBwcmV2aW91cz8gKi8KIAlpZiAocGNwdV9zaXplW2ktMV0gPj0gMCkgewogCQlwY3B1X3NpemVbaS0xXSArPSBwY3B1X3NpemVbaV07CkBAIC03NzcsNyArNzkzLDcgQEAKIAljaGFyIG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKIAlpbnQgcmV0LCBmb3JjZWQgPSAwOwogCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfTU9EVUxFKSkKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19NT0RVTEUpIHx8IG1vZHVsZXNfZGlzYWJsZWQpCiAJCXJldHVybiAtRVBFUk07CiAKIAlpZiAoc3RybmNweV9mcm9tX3VzZXIobmFtZSwgbmFtZV91c2VyLCBNT0RVTEVfTkFNRV9MRU4tMSkgPCAwKQpAQCAtMTQ4OSw5ICsxNTA1LDYgQEAKIAkvKiBGcmVlIGFueSBhbGxvY2F0ZWQgcGFyYW1ldGVycy4gKi8KIAlkZXN0cm95X3BhcmFtcyhtb2QtPmtwLCBtb2QtPm51bV9rcCk7CiAKLQkvKiByZWxlYXNlIGFueSBwb2ludGVycyB0byBtY291bnQgaW4gdGhpcyBtb2R1bGUgKi8KLQlmdHJhY2VfcmVsZWFzZShtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSk7Ci0KIAkvKiBUaGlzIG1heSBiZSBOVUxMLCBidXQgdGhhdCdzIE9LICovCiAJbW9kdWxlX2ZyZWUobW9kLCBtb2QtPm1vZHVsZV9pbml0KTsKIAlrZnJlZShtb2QtPmFyZ3MpOwpAQCAtMTg3OCw2ICsxODkxLDM2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19ERUJVR19LTUVNTEVBSworc3RhdGljIHZvaWQga21lbWxlYWtfbG9hZF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLCBFbGZfRWhkciAqaGRyLAorCQkJCSBFbGZfU2hkciAqc2VjaGRycywgY2hhciAqc2Vjc3RyaW5ncykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCS8qIG9ubHkgc2NhbiB0aGUgc2VjdGlvbnMgY29udGFpbmluZyBkYXRhICovCisJa21lbWxlYWtfc2Nhbl9hcmVhKG1vZC0+bW9kdWxlX2NvcmUsICh1bnNpZ25lZCBsb25nKW1vZCAtCisJCQkgICAodW5zaWduZWQgbG9uZyltb2QtPm1vZHVsZV9jb3JlLAorCQkJICAgc2l6ZW9mKHN0cnVjdCBtb2R1bGUpLCBHRlBfS0VSTkVMKTsKKworCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgeworCQlpZiAoIShzZWNoZHJzW2ldLnNoX2ZsYWdzICYgU0hGX0FMTE9DKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RybmNtcChzZWNzdHJpbmdzICsgc2VjaGRyc1tpXS5zaF9uYW1lLCAiLmRhdGEiLCA1KSAhPSAwCisJCSAgICAmJiBzdHJuY21wKHNlY3N0cmluZ3MgKyBzZWNoZHJzW2ldLnNoX25hbWUsICIuYnNzIiwgNCkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWttZW1sZWFrX3NjYW5fYXJlYShtb2QtPm1vZHVsZV9jb3JlLCBzZWNoZHJzW2ldLnNoX2FkZHIgLQorCQkJCSAgICh1bnNpZ25lZCBsb25nKW1vZC0+bW9kdWxlX2NvcmUsCisJCQkJICAgc2VjaGRyc1tpXS5zaF9zaXplLCBHRlBfS0VSTkVMKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGttZW1sZWFrX2xvYWRfbW9kdWxlKHN0cnVjdCBtb2R1bGUgKm1vZCwgRWxmX0VoZHIgKmhkciwKKwkJCQkJRWxmX1NoZHIgKnNlY2hkcnMsIGNoYXIgKnNlY3N0cmluZ3MpCit7Cit9CisjZW5kaWYKKwogLyogQWxsb2NhdGUgYW5kIGxvYWQgdGhlIG1vZHVsZTogbm90ZSB0aGF0IHNpemUgb2Ygc2VjdGlvbiAwIGlzIGFsd2F5cwogICAgemVybywgYW5kIHdlIHJlbHkgb24gdGhpcyBmb3Igb3B0aW9uYWwgc2VjdGlvbnMuICovCiBzdGF0aWMgbm9pbmxpbmUgc3RydWN0IG1vZHVsZSAqbG9hZF9tb2R1bGUodm9pZCBfX3VzZXIgKnVtb2QsCkBAIC0xODkyLDExICsxOTM1LDkgQEAKIAl1bnNpZ25lZCBpbnQgc3ltaW5kZXggPSAwOwogCXVuc2lnbmVkIGludCBzdHJpbmRleCA9IDA7CiAJdW5zaWduZWQgaW50IG1vZGluZGV4LCB2ZXJzaW5kZXgsIGluZm9pbmRleCwgcGNwdWluZGV4OwotCXVuc2lnbmVkIGludCBudW1fbWNvdW50OwogCXN0cnVjdCBtb2R1bGUgKm1vZDsKIAlsb25nIGVyciA9IDA7CiAJdm9pZCAqcGVyY3B1ID0gTlVMTCwgKnB0ciA9IE5VTEw7IC8qIFN0b3BzIHNwdXJpb3VzIGdjYyB3YXJuaW5nICovCi0JdW5zaWduZWQgbG9uZyAqbXNlZzsKIAltbV9zZWdtZW50X3Qgb2xkX2ZzOwogCiAJREVCVUdQKCJsb2FkX21vZHVsZTogdW1vZD0lcCwgbGVuPSVsdSwgdWFyZ3M9JXBcbiIsCkBAIC0yMDUwLDYgKzIwOTEsMTIgQEAKIAogCS8qIERvIHRoZSBhbGxvY3MuICovCiAJcHRyID0gbW9kdWxlX2FsbG9jX3VwZGF0ZV9ib3VuZHMobW9kLT5jb3JlX3NpemUpOworCS8qCisJICogVGhlIHBvaW50ZXIgdG8gdGhpcyBibG9jayBpcyBzdG9yZWQgaW4gdGhlIG1vZHVsZSBzdHJ1Y3R1cmUKKwkgKiB3aGljaCBpcyBpbnNpZGUgdGhlIGJsb2NrLiBKdXN0IG1hcmsgaXQgYXMgbm90IGJlaW5nIGEKKwkgKiBsZWFrLgorCSAqLworCWttZW1sZWFrX25vdF9sZWFrKHB0cik7CiAJaWYgKCFwdHIpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmcmVlX3BlcmNwdTsKQEAgLTIwNTgsNiArMjEwNSwxMyBAQAogCW1vZC0+bW9kdWxlX2NvcmUgPSBwdHI7CiAKIAlwdHIgPSBtb2R1bGVfYWxsb2NfdXBkYXRlX2JvdW5kcyhtb2QtPmluaXRfc2l6ZSk7CisJLyoKKwkgKiBUaGUgcG9pbnRlciB0byB0aGlzIGJsb2NrIGlzIHN0b3JlZCBpbiB0aGUgbW9kdWxlIHN0cnVjdHVyZQorCSAqIHdoaWNoIGlzIGluc2lkZSB0aGUgYmxvY2suIFRoaXMgYmxvY2sgZG9lc24ndCBuZWVkIHRvIGJlCisJICogc2Nhbm5lZCBhcyBpdCBjb250YWlucyBkYXRhIGFuZCBjb2RlIHRoYXQgd2lsbCBiZSBmcmVlZAorCSAqIGFmdGVyIHRoZSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQuCisJICovCisJa21lbWxlYWtfaWdub3JlKHB0cik7CiAJaWYgKCFwdHIgJiYgbW9kLT5pbml0X3NpemUpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmcmVlX2NvcmU7CkBAIC0yMDg4LDYgKzIxNDIsNyBAQAogCX0KIAkvKiBNb2R1bGUgaGFzIGJlZW4gbW92ZWQuICovCiAJbW9kID0gKHZvaWQgKilzZWNoZHJzW21vZGluZGV4XS5zaF9hZGRyOworCWttZW1sZWFrX2xvYWRfbW9kdWxlKG1vZCwgaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX01PRFVMRV9VTkxPQUQpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKIAltb2QtPnJlZnB0ciA9IHBlcmNwdV9tb2RhbGxvYyhzaXplb2YobG9jYWxfdCksIF9fYWxpZ25vZl9fKGxvY2FsX3QpLApAQCAtMjE3Miw3ICsyMjI3LDE5IEBACiAJCQkJCXNpemVvZigqbW9kLT50cmFjZXBvaW50cyksCiAJCQkJCSZtb2QtPm51bV90cmFjZXBvaW50cyk7CiAjZW5kaWYKLQorI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCisJbW9kLT50cmFjZV9ldmVudHMgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLAorCQkJCQkgIl9mdHJhY2VfZXZlbnRzIiwKKwkJCQkJIHNpemVvZigqbW9kLT50cmFjZV9ldmVudHMpLAorCQkJCQkgJm1vZC0+bnVtX3RyYWNlX2V2ZW50cyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQKKwkvKiBzZWNoZHJzWzBdLnNoX3NpemUgaXMgYWx3YXlzIHplcm8gKi8KKwltb2QtPmZ0cmFjZV9jYWxsc2l0ZXMgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLAorCQkJCQkgICAgICJfX21jb3VudF9sb2MiLAorCQkJCQkgICAgIHNpemVvZigqbW9kLT5mdHJhY2VfY2FsbHNpdGVzKSwKKwkJCQkJICAgICAmbW9kLT5udW1fZnRyYWNlX2NhbGxzaXRlcyk7CisjZW5kaWYKICNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKIAlpZiAoKG1vZC0+bnVtX3N5bXMgJiYgIW1vZC0+Y3JjcykKIAkgICAgfHwgKG1vZC0+bnVtX2dwbF9zeW1zICYmICFtb2QtPmdwbF9jcmNzKQpAQCAtMjIzNywxMSArMjMwNCw2IEBACiAJCQlkeW5hbWljX2RlYnVnX3NldHVwKGRlYnVnLCBudW1fZGVidWcpOwogCX0KIAotCS8qIHNlY2hkcnNbMF0uc2hfc2l6ZSBpcyBhbHdheXMgemVybyAqLwotCW1zZWcgPSBzZWN0aW9uX29ianMoaGRyLCBzZWNoZHJzLCBzZWNzdHJpbmdzLCAiX19tY291bnRfbG9jIiwKLQkJCSAgICBzaXplb2YoKm1zZWcpLCAmbnVtX21jb3VudCk7Ci0JZnRyYWNlX2luaXRfbW9kdWxlKG1vZCwgbXNlZywgbXNlZyArIG51bV9tY291bnQpOwotCiAJZXJyID0gbW9kdWxlX2ZpbmFsaXplKGhkciwgc2VjaGRycywgbW9kKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBjbGVhbnVwOwpAQCAtMjMwMiw3ICsyMzY0LDYgQEAKICBjbGVhbnVwOgogCWtvYmplY3RfZGVsKCZtb2QtPm1rb2JqLmtvYmopOwogCWtvYmplY3RfcHV0KCZtb2QtPm1rb2JqLmtvYmopOwotCWZ0cmFjZV9yZWxlYXNlKG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKTsKICBmcmVlX3VubG9hZDoKIAltb2R1bGVfdW5sb2FkX2ZyZWUobW9kKTsKICNpZiBkZWZpbmVkKENPTkZJR19NT0RVTEVfVU5MT0FEKSAmJiBkZWZpbmVkKENPTkZJR19TTVApCkBAIC0yMzM2LDcgKzIzOTcsNyBAQAogCWludCByZXQgPSAwOwogCiAJLyogTXVzdCBoYXZlIHBlcm1pc3Npb24gKi8KLQlpZiAoIWNhcGFibGUoQ0FQX1NZU19NT0RVTEUpKQorCWlmICghY2FwYWJsZShDQVBfU1lTX01PRFVMRSkgfHwgbW9kdWxlc19kaXNhYmxlZCkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCS8qIE9ubHkgb25lIG1vZHVsZSBsb2FkIGF0IGEgdGltZSwgcGxlYXNlICovCmRpZmYgLS1naXQgYS9rZXJuZWwvbXV0ZXguYyBiL2tlcm5lbC9tdXRleC5jCmluZGV4IDUwN2NmMmIuLjk0N2IzYWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tdXRleC5jCisrKyBiL2tlcm5lbC9tdXRleC5jCkBAIC04OSw3ICs4OSw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIChidXQgbm90IGVxdWl2YWxlbnQgdG8pIGRvd24oKS4KICAqLwotdm9pZCBpbmxpbmUgX19zY2hlZCBtdXRleF9sb2NrKHN0cnVjdCBtdXRleCAqbG9jaykKK3ZvaWQgX19zY2hlZCBtdXRleF9sb2NrKHN0cnVjdCBtdXRleCAqbG9jaykKIHsKIAltaWdodF9zbGVlcCgpOwogCS8qCkBAIC0yNDksNyArMjQ5LDkgQEAKIAogCQkvKiBkaWRudCBnZXQgdGhlIGxvY2ssIGdvIHRvIHNsZWVwOiAqLwogCQlzcGluX3VubG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7Ci0JCV9fc2NoZWR1bGUoKTsKKwkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOworCQlzY2hlZHVsZSgpOworCQlwcmVlbXB0X2Rpc2FibGUoKTsKIAkJc3Bpbl9sb2NrX211dGV4KCZsb2NrLT53YWl0X2xvY2ssIGZsYWdzKTsKIAl9CiAKQEAgLTQ3MSw1ICs0NzMsMjggQEAKIAogCXJldHVybiByZXQ7CiB9Ci0KIEVYUE9SVF9TWU1CT0wobXV0ZXhfdHJ5bG9jayk7CisKKy8qKgorICogYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jayAtIHJldHVybiBob2xkaW5nIG11dGV4IGlmIHdlIGRlYyB0byAwCisgKiBAY250OiB0aGUgYXRvbWljIHdoaWNoIHdlIGFyZSB0byBkZWMKKyAqIEBsb2NrOiB0aGUgbXV0ZXggdG8gcmV0dXJuIGhvbGRpbmcgaWYgd2UgZGVjIHRvIDAKKyAqCisgKiByZXR1cm4gdHJ1ZSBhbmQgaG9sZCBsb2NrIGlmIHdlIGRlYyB0byAwLCByZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2ludCBhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKGF0b21pY190ICpjbnQsIHN0cnVjdCBtdXRleCAqbG9jaykKK3sKKwkvKiBkZWMgaWYgd2UgY2FuJ3QgcG9zc2libHkgaGl0IDAgKi8KKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoY250LCAtMSwgMSkpCisJCXJldHVybiAwOworCS8qIHdlIG1pZ2h0IGhpdCAwLCBzbyB0YWtlIHRoZSBsb2NrICovCisJbXV0ZXhfbG9jayhsb2NrKTsKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoY250KSkgeworCQkvKiB3aGVuIHdlIGFjdHVhbGx5IGRpZCB0aGUgZGVjLCB3ZSBkaWRuJ3QgaGl0IDAgKi8KKwkJbXV0ZXhfdW5sb2NrKGxvY2spOworCQlyZXR1cm4gMDsKKwl9CisJLyogd2UgaGl0IDAsIGFuZCB3ZSBob2xkIHRoZSBsb2NrICovCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKGF0b21pY19kZWNfYW5kX211dGV4X2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL3BlcmZfY291bnRlci5jIGIva2VybmVsL3BlcmZfY291bnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNWQ4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvcGVyZl9jb3VudGVyLmMKQEAgLTAsMCArMSw0MjYwIEBACisvKgorICogUGVyZm9ybWFuY2UgY291bnRlciBjb3JlIGNvZGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICogIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgUmVkIEhhdCwgSW5jLiwgUGV0ZXIgWmlqbHN0cmEgPHB6aWpsc3RyQHJlZGhhdC5jb20+CisgKiAgQ29weXJpZ2h0ICCpICAyMDA5IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycC4gPHBhdWx1c0BhdTEuaWJtLmNvbT4KKyAqCisgKiAgRm9yIGxpY2Vuc2luZyBkZXRhaWxzIHNlZSBrZXJuZWwtYmFzZS9DT1BZSU5HCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvdm1zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9hbm9uX2lub2Rlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CisKKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KKworLyoKKyAqIEVhY2ggQ1BVIGhhcyBhIGxpc3Qgb2YgcGVyIENQVSBjb3VudGVyczoKKyAqLworREVGSU5FX1BFUl9DUFUoc3RydWN0IHBlcmZfY3B1X2NvbnRleHQsIHBlcmZfY3B1X2NvbnRleHQpOworCitpbnQgcGVyZl9tYXhfY291bnRlcnMgX19yZWFkX21vc3RseSA9IDE7CitzdGF0aWMgaW50IHBlcmZfcmVzZXJ2ZWRfcGVyY3B1IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50IHBlcmZfb3ZlcmNvbW1pdCBfX3JlYWRfbW9zdGx5ID0gMTsKKworc3RhdGljIGF0b21pY190IG5yX2NvdW50ZXJzIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgYXRvbWljX3QgbnJfbW1hcF9jb3VudGVycyBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGF0b21pY190IG5yX2NvbW1fY291bnRlcnMgX19yZWFkX21vc3RseTsKKworLyoKKyAqIHBlcmYgY291bnRlciBwYXJhbm9pYSBsZXZlbDoKKyAqICAwIC0gbm90IHBhcmFub2lkCisgKiAgMSAtIGRpc2FsbG93IGNwdSBjb3VudGVycyB0byB1bnByaXYKKyAqICAyIC0gZGlzYWxsb3cga2VybmVsIHByb2ZpbGluZyB0byB1bnByaXYKKyAqLworaW50IHN5c2N0bF9wZXJmX2NvdW50ZXJfcGFyYW5vaWQgX19yZWFkX21vc3RseTsKKworc3RhdGljIGlubGluZSBib29sIHBlcmZfcGFyYW5vaWRfY3B1KHZvaWQpCit7CisJcmV0dXJuIHN5c2N0bF9wZXJmX2NvdW50ZXJfcGFyYW5vaWQgPiAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgcGVyZl9wYXJhbm9pZF9rZXJuZWwodm9pZCkKK3sKKwlyZXR1cm4gc3lzY3RsX3BlcmZfY291bnRlcl9wYXJhbm9pZCA+IDE7Cit9CisKK2ludCBzeXNjdGxfcGVyZl9jb3VudGVyX21sb2NrIF9fcmVhZF9tb3N0bHkgPSA1MTI7IC8qICdmcmVlJyBrYiBwZXIgdXNlciAqLworCisvKgorICogbWF4IHBlcmYgY291bnRlciBzYW1wbGUgcmF0ZQorICovCitpbnQgc3lzY3RsX3BlcmZfY291bnRlcl9zYW1wbGVfcmF0ZSBfX3JlYWRfbW9zdGx5ID0gMTAwMDAwOworCitzdGF0aWMgYXRvbWljNjRfdCBwZXJmX2NvdW50ZXJfaWQ7CisKKy8qCisgKiBMb2NrIGZvciAoc3lzYWRtaW4tY29uZmlndXJhYmxlKSBjb3VudGVyIHJlc2VydmF0aW9uczoKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhwZXJmX3Jlc291cmNlX2xvY2spOworCisvKgorICogQXJjaGl0ZWN0dXJlIHByb3ZpZGVkIEFQSXMgLSB3ZWFrIGFsaWFzZXM6CisgKi8KK2V4dGVybiBfX3dlYWsgY29uc3Qgc3RydWN0IHBtdSAqaHdfcGVyZl9jb3VudGVyX2luaXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBfX3dlYWsgaHdfcGVyZl9kaXNhYmxlKHZvaWQpCQl7IGJhcnJpZXIoKTsgfQordm9pZCBfX3dlYWsgaHdfcGVyZl9lbmFibGUodm9pZCkJCXsgYmFycmllcigpOyB9CisKK3ZvaWQgX193ZWFrIGh3X3BlcmZfY291bnRlcl9zZXR1cChpbnQgY3B1KQl7IGJhcnJpZXIoKTsgfQorCitpbnQgX193ZWFrCitod19wZXJmX2dyb3VwX3NjaGVkX2luKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmdyb3VwX2xlYWRlciwKKwkgICAgICAgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkgICAgICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsIGludCBjcHUpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX193ZWFrIHBlcmZfY291bnRlcl9wcmludF9kZWJ1Zyh2b2lkKQl7IH0KKworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgZGlzYWJsZV9jb3VudCk7CisKK3ZvaWQgX19wZXJmX2Rpc2FibGUodm9pZCkKK3sKKwlfX2dldF9jcHVfdmFyKGRpc2FibGVfY291bnQpKys7Cit9CisKK2Jvb2wgX19wZXJmX2VuYWJsZSh2b2lkKQoreworCXJldHVybiAhLS1fX2dldF9jcHVfdmFyKGRpc2FibGVfY291bnQpOworfQorCit2b2lkIHBlcmZfZGlzYWJsZSh2b2lkKQoreworCV9fcGVyZl9kaXNhYmxlKCk7CisJaHdfcGVyZl9kaXNhYmxlKCk7Cit9CisKK3ZvaWQgcGVyZl9lbmFibGUodm9pZCkKK3sKKwlpZiAoX19wZXJmX2VuYWJsZSgpKQorCQlod19wZXJmX2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBnZXRfY3R4KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4KQoreworCWF0b21pY19pbmMoJmN0eC0+cmVmY291bnQpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2N0eChzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisKKwljdHggPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0LCByY3VfaGVhZCk7CisJa2ZyZWUoY3R4KTsKK30KKworc3RhdGljIHZvaWQgcHV0X2N0eChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY3R4LT5yZWZjb3VudCkpIHsKKwkJaWYgKGN0eC0+cGFyZW50X2N0eCkKKwkJCXB1dF9jdHgoY3R4LT5wYXJlbnRfY3R4KTsKKwkJaWYgKGN0eC0+dGFzaykKKwkJCXB1dF90YXNrX3N0cnVjdChjdHgtPnRhc2spOworCQljYWxsX3JjdSgmY3R4LT5yY3VfaGVhZCwgZnJlZV9jdHgpOworCX0KK30KKworLyoKKyAqIEdldCB0aGUgcGVyZl9jb3VudGVyX2NvbnRleHQgZm9yIGEgdGFzayBhbmQgbG9jayBpdC4KKyAqIFRoaXMgaGFzIHRvIGNvcGUgd2l0aCB3aXRoIHRoZSBmYWN0IHRoYXQgdW50aWwgaXQgaXMgbG9ja2VkLAorICogdGhlIGNvbnRleHQgY291bGQgZ2V0IG1vdmVkIHRvIGFub3RoZXIgdGFzay4KKyAqLworc3RhdGljIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqCitwZXJmX2xvY2tfdGFza19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisgcmV0cnk6CisJY3R4ID0gcmN1X2RlcmVmZXJlbmNlKHRhc2stPnBlcmZfY291bnRlcl9jdHhwKTsKKwlpZiAoY3R4KSB7CisJCS8qCisJCSAqIElmIHRoaXMgY29udGV4dCBpcyBhIGNsb25lIG9mIGFub3RoZXIsIGl0IG1pZ2h0CisJCSAqIGdldCBzd2FwcGVkIGZvciBhbm90aGVyIHVuZGVybmVhdGggdXMgYnkKKwkJICogcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfb3V0LCB0aG91Z2ggdGhlCisJCSAqIHJjdV9yZWFkX2xvY2soKSBwcm90ZWN0cyB1cyBmcm9tIGFueSBjb250ZXh0CisJCSAqIGdldHRpbmcgZnJlZWQuICBMb2NrIHRoZSBjb250ZXh0IGFuZCBjaGVjayBpZiBpdAorCQkgKiBnb3Qgc3dhcHBlZCBiZWZvcmUgd2UgY291bGQgZ2V0IHRoZSBsb2NrLCBhbmQgcmV0cnkKKwkJICogaWYgc28uICBJZiB3ZSBsb2NrZWQgdGhlIHJpZ2h0IGNvbnRleHQsIHRoZW4gaXQKKwkJICogY2FuJ3QgZ2V0IHN3YXBwZWQgb24gdXMgYW55IG1vcmUuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5sb2NrLCAqZmxhZ3MpOworCQlpZiAoY3R4ICE9IHJjdV9kZXJlZmVyZW5jZSh0YXNrLT5wZXJmX2NvdW50ZXJfY3R4cCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgKmZsYWdzKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGN0eDsKK30KKworLyoKKyAqIEdldCB0aGUgY29udGV4dCBmb3IgYSB0YXNrIGFuZCBpbmNyZW1lbnQgaXRzIHBpbl9jb3VudCBzbyBpdAorICogY2FuJ3QgZ2V0IHN3YXBwZWQgdG8gYW5vdGhlciB0YXNrLiAgVGhpcyBhbHNvIGluY3JlbWVudHMgaXRzCisgKiByZWZlcmVuY2UgY291bnQgc28gdGhhdCB0aGUgY29udGV4dCBjYW4ndCBnZXQgZnJlZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKnBlcmZfcGluX3Rhc2tfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWN0eCA9IHBlcmZfbG9ja190YXNrX2NvbnRleHQodGFzaywgJmZsYWdzKTsKKwlpZiAoY3R4KSB7CisJCSsrY3R4LT5waW5fY291bnQ7CisJCWdldF9jdHgoY3R4KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5sb2NrLCBmbGFncyk7CisJfQorCXJldHVybiBjdHg7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfdW5waW5fY29udGV4dChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCS0tY3R4LT5waW5fY291bnQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5sb2NrLCBmbGFncyk7CisJcHV0X2N0eChjdHgpOworfQorCisvKgorICogQWRkIGEgY291bnRlciBmcm9tIHRoZSBsaXN0cyBmb3IgaXRzIGNvbnRleHQuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGN0eC0+bXV0ZXggYW5kIGN0eC0+bG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZAorbGlzdF9hZGRfY291bnRlcihzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpncm91cF9sZWFkZXIgPSBjb3VudGVyLT5ncm91cF9sZWFkZXI7CisKKwkvKgorCSAqIERlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGEgc3RhbmRhbG9uZSBvciBzaWJsaW5nIGNvdW50ZXIsCisJICogYWRkIGl0IHN0cmFpZ2h0IHRvIHRoZSBjb250ZXh0J3MgY291bnRlciBsaXN0LCBvciB0byB0aGUgZ3JvdXAKKwkgKiBsZWFkZXIncyBzaWJsaW5nIGxpc3Q6CisJICovCisJaWYgKGdyb3VwX2xlYWRlciA9PSBjb3VudGVyKQorCQlsaXN0X2FkZF90YWlsKCZjb3VudGVyLT5saXN0X2VudHJ5LCAmY3R4LT5jb3VudGVyX2xpc3QpOworCWVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZjb3VudGVyLT5saXN0X2VudHJ5LCAmZ3JvdXBfbGVhZGVyLT5zaWJsaW5nX2xpc3QpOworCQlncm91cF9sZWFkZXItPm5yX3NpYmxpbmdzKys7CisJfQorCisJbGlzdF9hZGRfcmN1KCZjb3VudGVyLT5ldmVudF9lbnRyeSwgJmN0eC0+ZXZlbnRfbGlzdCk7CisJY3R4LT5ucl9jb3VudGVycysrOworfQorCisvKgorICogUmVtb3ZlIGEgY291bnRlciBmcm9tIHRoZSBsaXN0cyBmb3IgaXRzIGNvbnRleHQuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGN0eC0+bXV0ZXggYW5kIGN0eC0+bG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZAorbGlzdF9kZWxfY291bnRlcihzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpzaWJsaW5nLCAqdG1wOworCisJaWYgKGxpc3RfZW1wdHkoJmNvdW50ZXItPmxpc3RfZW50cnkpKQorCQlyZXR1cm47CisJY3R4LT5ucl9jb3VudGVycy0tOworCisJbGlzdF9kZWxfaW5pdCgmY291bnRlci0+bGlzdF9lbnRyeSk7CisJbGlzdF9kZWxfcmN1KCZjb3VudGVyLT5ldmVudF9lbnRyeSk7CisKKwlpZiAoY291bnRlci0+Z3JvdXBfbGVhZGVyICE9IGNvdW50ZXIpCisJCWNvdW50ZXItPmdyb3VwX2xlYWRlci0+bnJfc2libGluZ3MtLTsKKworCS8qCisJICogSWYgdGhpcyB3YXMgYSBncm91cCBjb3VudGVyIHdpdGggc2libGluZyBjb3VudGVycyB0aGVuCisJICogdXBncmFkZSB0aGUgc2libGluZ3MgdG8gc2luZ2xldG9uIGNvdW50ZXJzIGJ5IGFkZGluZyB0aGVtCisJICogdG8gdGhlIGNvbnRleHQgbGlzdCBkaXJlY3RseToKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2libGluZywgdG1wLAorCQkJCSAmY291bnRlci0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KSB7CisKKwkJbGlzdF9tb3ZlX3RhaWwoJnNpYmxpbmctPmxpc3RfZW50cnksICZjdHgtPmNvdW50ZXJfbGlzdCk7CisJCXNpYmxpbmctPmdyb3VwX2xlYWRlciA9IHNpYmxpbmc7CisJfQorfQorCitzdGF0aWMgdm9pZAorY291bnRlcl9zY2hlZF9vdXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJICBzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAorCQkgIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4KQoreworCWlmIChjb3VudGVyLT5zdGF0ZSAhPSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFKQorCQlyZXR1cm47CisKKwljb3VudGVyLT5zdGF0ZSA9IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRTsKKwljb3VudGVyLT50c3RhbXBfc3RvcHBlZCA9IGN0eC0+dGltZTsKKwljb3VudGVyLT5wbXUtPmRpc2FibGUoY291bnRlcik7CisJY291bnRlci0+b25jcHUgPSAtMTsKKworCWlmICghaXNfc29mdHdhcmVfY291bnRlcihjb3VudGVyKSkKKwkJY3B1Y3R4LT5hY3RpdmVfb25jcHUtLTsKKwljdHgtPm5yX2FjdGl2ZS0tOworCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1c2l2ZSB8fCAhY3B1Y3R4LT5hY3RpdmVfb25jcHUpCisJCWNwdWN0eC0+ZXhjbHVzaXZlID0gMDsKK30KKworc3RhdGljIHZvaWQKK2dyb3VwX3NjaGVkX291dChzdHJ1Y3QgcGVyZl9jb3VudGVyICpncm91cF9jb3VudGVyLAorCQlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LAorCQlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJaWYgKGdyb3VwX2NvdW50ZXItPnN0YXRlICE9IFBFUkZfQ09VTlRFUl9TVEFURV9BQ1RJVkUpCisJCXJldHVybjsKKworCWNvdW50ZXJfc2NoZWRfb3V0KGdyb3VwX2NvdW50ZXIsIGNwdWN0eCwgY3R4KTsKKworCS8qCisJICogU2NoZWR1bGUgb3V0IHNpYmxpbmdzIChpZiBhbnkpOgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmdyb3VwX2NvdW50ZXItPnNpYmxpbmdfbGlzdCwgbGlzdF9lbnRyeSkKKwkJY291bnRlcl9zY2hlZF9vdXQoY291bnRlciwgY3B1Y3R4LCBjdHgpOworCisJaWYgKGdyb3VwX2NvdW50ZXItPmF0dHIuZXhjbHVzaXZlKQorCQljcHVjdHgtPmV4Y2x1c2l2ZSA9IDA7Cit9CisKKy8qCisgKiBDcm9zcyBDUFUgY2FsbCB0byByZW1vdmUgYSBwZXJmb3JtYW5jZSBjb3VudGVyCisgKgorICogV2UgZGlzYWJsZSB0aGUgY291bnRlciBvbiB0aGUgaGFyZHdhcmUgbGV2ZWwgZmlyc3QuIEFmdGVyIHRoYXQgd2UKKyAqIHJlbW92ZSBpdCBmcm9tIHRoZSBjb250ZXh0IGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIF9fcGVyZl9jb3VudGVyX3JlbW92ZV9mcm9tX2NvbnRleHQodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gJl9fZ2V0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGluZm87CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSB0YXNrIGNvbnRleHQsIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBpcworCSAqIHRoZSBjdXJyZW50IHRhc2sgY29udGV4dCBvZiB0aGlzIGNwdS4gSWYgbm90IGl0IGhhcyBiZWVuCisJICogc2NoZWR1bGVkIG91dCBiZWZvcmUgdGhlIHNtcCBjYWxsIGFycml2ZWQuCisJICovCisJaWYgKGN0eC0+dGFzayAmJiBjcHVjdHgtPnRhc2tfY3R4ICE9IGN0eCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZjdHgtPmxvY2spOworCS8qCisJICogUHJvdGVjdCB0aGUgbGlzdCBvcGVyYXRpb24gYWdhaW5zdCBOTUkgYnkgZGlzYWJsaW5nIHRoZQorCSAqIGNvdW50ZXJzIG9uIGEgZ2xvYmFsIGxldmVsLgorCSAqLworCXBlcmZfZGlzYWJsZSgpOworCisJY291bnRlcl9zY2hlZF9vdXQoY291bnRlciwgY3B1Y3R4LCBjdHgpOworCisJbGlzdF9kZWxfY291bnRlcihjb3VudGVyLCBjdHgpOworCisJaWYgKCFjdHgtPnRhc2spIHsKKwkJLyoKKwkJICogQWxsb3cgbW9yZSBwZXIgdGFzayBjb3VudGVycyB3aXRoIHJlc3BlY3QgdG8gdGhlCisJCSAqIHJlc2VydmF0aW9uOgorCQkgKi8KKwkJY3B1Y3R4LT5tYXhfcGVydGFzayA9CisJCQltaW4ocGVyZl9tYXhfY291bnRlcnMgLSBjdHgtPm5yX2NvdW50ZXJzLAorCQkJICAgIHBlcmZfbWF4X2NvdW50ZXJzIC0gcGVyZl9yZXNlcnZlZF9wZXJjcHUpOworCX0KKworCXBlcmZfZW5hYmxlKCk7CisJc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7Cit9CisKKworLyoKKyAqIFJlbW92ZSB0aGUgY291bnRlciBmcm9tIGEgdGFzaydzIChvciBhIENQVSdzKSBsaXN0IG9mIGNvdW50ZXJzLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggY3R4LT5tdXRleCBoZWxkLgorICoKKyAqIENQVSBjb3VudGVycyBhcmUgcmVtb3ZlZCB3aXRoIGEgc21wIGNhbGwuIEZvciB0YXNrIGNvdW50ZXJzIHdlIG9ubHkKKyAqIGNhbGwgd2hlbiB0aGUgdGFzayBpcyBvbiBhIENQVS4KKyAqCisgKiBJZiBjb3VudGVyLT5jdHggaXMgYSBjbG9uZWQgY29udGV4dCwgY2FsbGVycyBtdXN0IG1ha2Ugc3VyZSB0aGF0CisgKiBldmVyeSB0YXNrIHN0cnVjdCB0aGF0IGNvdW50ZXItPmN0eC0+dGFzayBjb3VsZCBwb3NzaWJseSBwb2ludCB0bworICogcmVtYWlucyB2YWxpZC4gIFRoaXMgaXMgT0sgd2hlbiBjYWxsZWQgZnJvbSBwZXJmX3JlbGVhc2Ugc2luY2UKKyAqIHRoYXQgb25seSBjYWxscyB1cyBvbiB0aGUgdG9wLWxldmVsIGNvbnRleHQsIHdoaWNoIGNhbid0IGJlIGEgY2xvbmUuCisgKiBXaGVuIGNhbGxlZCBmcm9tIHBlcmZfY291bnRlcl9leGl0X3Rhc2ssIGl0J3MgT0sgYmVjYXVzZSB0aGUKKyAqIGNvbnRleHQgaGFzIGJlZW4gZGV0YWNoZWQgZnJvbSBpdHMgdGFzay4KKyAqLworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX3JlbW92ZV9mcm9tX2NvbnRleHQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdHgtPnRhc2s7CisKKwlpZiAoIXRhc2spIHsKKwkJLyoKKwkJICogUGVyIGNwdSBjb3VudGVycyBhcmUgcmVtb3ZlZCB2aWEgYW4gc21wIGNhbGwgYW5kCisJCSAqIHRoZSByZW1vdmFsIGlzIGFsd2F5cyBzdWNlc3NmdWwuCisJCSAqLworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY291bnRlci0+Y3B1LAorCQkJCQkgX19wZXJmX2NvdW50ZXJfcmVtb3ZlX2Zyb21fY29udGV4dCwKKwkJCQkJIGNvdW50ZXIsIDEpOworCQlyZXR1cm47CisJfQorCityZXRyeToKKwl0YXNrX29uY3B1X2Z1bmN0aW9uX2NhbGwodGFzaywgX19wZXJmX2NvdW50ZXJfcmVtb3ZlX2Zyb21fY29udGV4dCwKKwkJCQkgY291bnRlcik7CisKKwlzcGluX2xvY2tfaXJxKCZjdHgtPmxvY2spOworCS8qCisJICogSWYgdGhlIGNvbnRleHQgaXMgYWN0aXZlIHdlIG5lZWQgdG8gcmV0cnkgdGhlIHNtcCBjYWxsLgorCSAqLworCWlmIChjdHgtPm5yX2FjdGl2ZSAmJiAhbGlzdF9lbXB0eSgmY291bnRlci0+bGlzdF9lbnRyeSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworCQlnb3RvIHJldHJ5OworCX0KKworCS8qCisJICogVGhlIGxvY2sgcHJldmVudHMgdGhhdCB0aGlzIGNvbnRleHQgaXMgc2NoZWR1bGVkIGluIHNvIHdlCisJICogY2FuIHJlbW92ZSB0aGUgY291bnRlciBzYWZlbHksIGlmIHRoZSBjYWxsIGFib3ZlIGRpZCBub3QKKwkgKiBzdWNjZWVkLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmY291bnRlci0+bGlzdF9lbnRyeSkpIHsKKwkJbGlzdF9kZWxfY291bnRlcihjb3VudGVyLCBjdHgpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IHBlcmZfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gY3B1X2Nsb2NrKHNtcF9wcm9jZXNzb3JfaWQoKSk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHJlY29yZCBvZiB0aGUgY3VycmVudCB0aW1lIGluIGEgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX2NvbnRleHRfdGltZShzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwl1NjQgbm93ID0gcGVyZl9jbG9jaygpOworCisJY3R4LT50aW1lICs9IG5vdyAtIGN0eC0+dGltZXN0YW1wOworCWN0eC0+dGltZXN0YW1wID0gbm93OworfQorCisvKgorICogVXBkYXRlIHRoZSB0b3RhbF90aW1lX2VuYWJsZWQgYW5kIHRvdGFsX3RpbWVfcnVubmluZyBmaWVsZHMgZm9yIGEgY291bnRlci4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX2NvdW50ZXJfdGltZXMoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKwl1NjQgcnVuX2VuZDsKKworCWlmIChjb3VudGVyLT5zdGF0ZSA8IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkKKwkJcmV0dXJuOworCisJY291bnRlci0+dG90YWxfdGltZV9lbmFibGVkID0gY3R4LT50aW1lIC0gY291bnRlci0+dHN0YW1wX2VuYWJsZWQ7CisKKwlpZiAoY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFKQorCQlydW5fZW5kID0gY291bnRlci0+dHN0YW1wX3N0b3BwZWQ7CisJZWxzZQorCQlydW5fZW5kID0gY3R4LT50aW1lOworCisJY291bnRlci0+dG90YWxfdGltZV9ydW5uaW5nID0gcnVuX2VuZCAtIGNvdW50ZXItPnRzdGFtcF9ydW5uaW5nOworfQorCisvKgorICogVXBkYXRlIHRvdGFsX3RpbWVfZW5hYmxlZCBhbmQgdG90YWxfdGltZV9ydW5uaW5nIGZvciBhbGwgY291bnRlcnMgaW4gYSBncm91cC4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX2dyb3VwX3RpbWVzKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmxlYWRlcikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJdXBkYXRlX2NvdW50ZXJfdGltZXMobGVhZGVyKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZsZWFkZXItPnNpYmxpbmdfbGlzdCwgbGlzdF9lbnRyeSkKKwkJdXBkYXRlX2NvdW50ZXJfdGltZXMoY291bnRlcik7Cit9CisKKy8qCisgKiBDcm9zcyBDUFUgY2FsbCB0byBkaXNhYmxlIGEgcGVyZm9ybWFuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBfX3BlcmZfY291bnRlcl9kaXNhYmxlKHZvaWQgKmluZm8pCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGluZm87CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9ICZfX2dldF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gY291bnRlci0+Y3R4OworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGVyLXRhc2sgY291bnRlciwgbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoaXMKKwkgKiBjb3VudGVyJ3MgdGFzayBpcyB0aGUgY3VycmVudCB0YXNrIG9uIHRoaXMgY3B1LgorCSAqLworCWlmIChjdHgtPnRhc2sgJiYgY3B1Y3R4LT50YXNrX2N0eCAhPSBjdHgpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKworCS8qCisJICogSWYgdGhlIGNvdW50ZXIgaXMgb24sIHR1cm4gaXQgb2ZmLgorCSAqIElmIGl0IGlzIGluIGVycm9yIHN0YXRlLCBsZWF2ZSBpdCBpbiBlcnJvciBzdGF0ZS4KKwkgKi8KKwlpZiAoY291bnRlci0+c3RhdGUgPj0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFKSB7CisJCXVwZGF0ZV9jb250ZXh0X3RpbWUoY3R4KTsKKwkJdXBkYXRlX2NvdW50ZXJfdGltZXMoY291bnRlcik7CisJCWlmIChjb3VudGVyID09IGNvdW50ZXItPmdyb3VwX2xlYWRlcikKKwkJCWdyb3VwX3NjaGVkX291dChjb3VudGVyLCBjcHVjdHgsIGN0eCk7CisJCWVsc2UKKwkJCWNvdW50ZXJfc2NoZWRfb3V0KGNvdW50ZXIsIGNwdWN0eCwgY3R4KTsKKwkJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGOworCX0KKworCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOworfQorCisvKgorICogRGlzYWJsZSBhIGNvdW50ZXIuCisgKgorICogSWYgY291bnRlci0+Y3R4IGlzIGEgY2xvbmVkIGNvbnRleHQsIGNhbGxlcnMgbXVzdCBtYWtlIHN1cmUgdGhhdAorICogZXZlcnkgdGFzayBzdHJ1Y3QgdGhhdCBjb3VudGVyLT5jdHgtPnRhc2sgY291bGQgcG9zc2libHkgcG9pbnQgdG8KKyAqIHJlbWFpbnMgdmFsaWQuICBUaGlzIGNvbmRpdGlvbiBpcyBzYXRpc2lmZWQgd2hlbiBjYWxsZWQgdGhyb3VnaAorICogcGVyZl9jb3VudGVyX2Zvcl9lYWNoX2NoaWxkIG9yIHBlcmZfY291bnRlcl9mb3JfZWFjaCBiZWNhdXNlIHRoZXkKKyAqIGhvbGQgdGhlIHRvcC1sZXZlbCBjb3VudGVyJ3MgY2hpbGRfbXV0ZXgsIHNvIGFueSBkZXNjZW5kYW50IHRoYXQKKyAqIGdvZXMgdG8gZXhpdCB3aWxsIGJsb2NrIGluIHN5bmNfY2hpbGRfY291bnRlci4KKyAqIFdoZW4gY2FsbGVkIGZyb20gcGVyZl9wZW5kaW5nX2NvdW50ZXIgaXQncyBPSyBiZWNhdXNlIGNvdW50ZXItPmN0eAorICogaXMgdGhlIGN1cnJlbnQgY29udGV4dCBvbiB0aGlzIENQVSBhbmQgcHJlZW1wdGlvbiBpcyBkaXNhYmxlZCwKKyAqIGhlbmNlIHdlIGNhbid0IGdldCBpbnRvIHBlcmZfY291bnRlcl90YXNrX3NjaGVkX291dCBmb3IgdGhpcyBjb250ZXh0LgorICovCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfZGlzYWJsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gY291bnRlci0+Y3R4OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGN0eC0+dGFzazsKKworCWlmICghdGFzaykgeworCQkvKgorCQkgKiBEaXNhYmxlIHRoZSBjb3VudGVyIG9uIHRoZSBjcHUgdGhhdCBpdCdzIG9uCisJCSAqLworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY291bnRlci0+Y3B1LCBfX3BlcmZfY291bnRlcl9kaXNhYmxlLAorCQkJCQkgY291bnRlciwgMSk7CisJCXJldHVybjsKKwl9CisKKyByZXRyeToKKwl0YXNrX29uY3B1X2Z1bmN0aW9uX2NhbGwodGFzaywgX19wZXJmX2NvdW50ZXJfZGlzYWJsZSwgY291bnRlcik7CisKKwlzcGluX2xvY2tfaXJxKCZjdHgtPmxvY2spOworCS8qCisJICogSWYgdGhlIGNvdW50ZXIgaXMgc3RpbGwgYWN0aXZlLCB3ZSBuZWVkIHRvIHJldHJ5IHRoZSBjcm9zcy1jYWxsLgorCSAqLworCWlmIChjb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIFNpbmNlIHdlIGhhdmUgdGhlIGxvY2sgdGhpcyBjb250ZXh0IGNhbid0IGJlIHNjaGVkdWxlZAorCSAqIGluLCBzbyB3ZSBjYW4gY2hhbmdlIHRoZSBzdGF0ZSBzYWZlbHkuCisJICovCisJaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkgeworCQl1cGRhdGVfY291bnRlcl90aW1lcyhjb3VudGVyKTsKKwkJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGOworCX0KKworCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKK30KKworc3RhdGljIGludAorY291bnRlcl9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkJIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LAorCQkgaW50IGNwdSkKK3sKKwlpZiAoY291bnRlci0+c3RhdGUgPD0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRikKKwkJcmV0dXJuIDA7CisKKwljb3VudGVyLT5zdGF0ZSA9IFBFUkZfQ09VTlRFUl9TVEFURV9BQ1RJVkU7CisJY291bnRlci0+b25jcHUgPSBjcHU7CS8qIFRPRE86IHB1dCAnY3B1JyBpbnRvIGNwdWN0eC0+Y3B1ICovCisJLyoKKwkgKiBUaGUgbmV3IHN0YXRlIG11c3QgYmUgdmlzaWJsZSBiZWZvcmUgd2UgdHVybiBpdCBvbiBpbiB0aGUgaGFyZHdhcmU6CisJICovCisJc21wX3dtYigpOworCisJaWYgKGNvdW50ZXItPnBtdS0+ZW5hYmxlKGNvdW50ZXIpKSB7CisJCWNvdW50ZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFOworCQljb3VudGVyLT5vbmNwdSA9IC0xOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwljb3VudGVyLT50c3RhbXBfcnVubmluZyArPSBjdHgtPnRpbWUgLSBjb3VudGVyLT50c3RhbXBfc3RvcHBlZDsKKworCWlmICghaXNfc29mdHdhcmVfY291bnRlcihjb3VudGVyKSkKKwkJY3B1Y3R4LT5hY3RpdmVfb25jcHUrKzsKKwljdHgtPm5yX2FjdGl2ZSsrOworCisJaWYgKGNvdW50ZXItPmF0dHIuZXhjbHVzaXZlKQorCQljcHVjdHgtPmV4Y2x1c2l2ZSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZ3JvdXBfc2NoZWRfaW4oc3RydWN0IHBlcmZfY291bnRlciAqZ3JvdXBfY291bnRlciwKKwkgICAgICAgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkgICAgICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsCisJICAgICAgIGludCBjcHUpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgKnBhcnRpYWxfZ3JvdXA7CisJaW50IHJldDsKKworCWlmIChncm91cF9jb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGh3X3BlcmZfZ3JvdXBfc2NoZWRfaW4oZ3JvdXBfY291bnRlciwgY3B1Y3R4LCBjdHgsIGNwdSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOworCisJaWYgKGNvdW50ZXJfc2NoZWRfaW4oZ3JvdXBfY291bnRlciwgY3B1Y3R4LCBjdHgsIGNwdSkpCisJCXJldHVybiAtRUFHQUlOOworCisJLyoKKwkgKiBTY2hlZHVsZSBpbiBzaWJsaW5ncyBhcyBvbmUgZ3JvdXAgKGlmIGFueSk6CisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmZ3JvdXBfY291bnRlci0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KSB7CisJCWlmIChjb3VudGVyX3NjaGVkX2luKGNvdW50ZXIsIGNwdWN0eCwgY3R4LCBjcHUpKSB7CisJCQlwYXJ0aWFsX2dyb3VwID0gY291bnRlcjsKKwkJCWdvdG8gZ3JvdXBfZXJyb3I7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZ3JvdXBfZXJyb3I6CisJLyoKKwkgKiBHcm91cHMgY2FuIGJlIHNjaGVkdWxlZCBpbiBhcyBvbmUgdW5pdCBvbmx5LCBzbyB1bmRvIGFueQorCSAqIHBhcnRpYWwgZ3JvdXAgYmVmb3JlIHJldHVybmluZzoKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZncm91cF9jb3VudGVyLT5zaWJsaW5nX2xpc3QsIGxpc3RfZW50cnkpIHsKKwkJaWYgKGNvdW50ZXIgPT0gcGFydGlhbF9ncm91cCkKKwkJCWJyZWFrOworCQljb3VudGVyX3NjaGVkX291dChjb3VudGVyLCBjcHVjdHgsIGN0eCk7CisJfQorCWNvdW50ZXJfc2NoZWRfb3V0KGdyb3VwX2NvdW50ZXIsIGNwdWN0eCwgY3R4KTsKKworCXJldHVybiAtRUFHQUlOOworfQorCisvKgorICogUmV0dXJuIDEgZm9yIGEgZ3JvdXAgY29uc2lzdGluZyBlbnRpcmVseSBvZiBzb2Z0d2FyZSBjb3VudGVycywKKyAqIDAgaWYgdGhlIGdyb3VwIGNvbnRhaW5zIGFueSBoYXJkd2FyZSBjb3VudGVycy4KKyAqLworc3RhdGljIGludCBpc19zb2Z0d2FyZV9vbmx5X2dyb3VwKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmxlYWRlcikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJaWYgKCFpc19zb2Z0d2FyZV9jb3VudGVyKGxlYWRlcikpCisJCXJldHVybiAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmbGVhZGVyLT5zaWJsaW5nX2xpc3QsIGxpc3RfZW50cnkpCisJCWlmICghaXNfc29mdHdhcmVfY291bnRlcihjb3VudGVyKSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBXb3JrIG91dCB3aGV0aGVyIHdlIGNhbiBwdXQgdGhpcyBjb3VudGVyIGdyb3VwIG9uIHRoZSBDUFUgbm93LgorICovCitzdGF0aWMgaW50IGdyb3VwX2Nhbl9nb19vbihzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJICAgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkJCSAgIGludCBjYW5fYWRkX2h3KQoreworCS8qCisJICogR3JvdXBzIGNvbnNpc3RpbmcgZW50aXJlbHkgb2Ygc29mdHdhcmUgY291bnRlcnMgY2FuIGFsd2F5cyBnbyBvbi4KKwkgKi8KKwlpZiAoaXNfc29mdHdhcmVfb25seV9ncm91cChjb3VudGVyKSkKKwkJcmV0dXJuIDE7CisJLyoKKwkgKiBJZiBhbiBleGNsdXNpdmUgZ3JvdXAgaXMgYWxyZWFkeSBvbiwgbm8gb3RoZXIgaGFyZHdhcmUKKwkgKiBjb3VudGVycyBjYW4gZ28gb24uCisJICovCisJaWYgKGNwdWN0eC0+ZXhjbHVzaXZlKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIElmIHRoaXMgZ3JvdXAgaXMgZXhjbHVzaXZlIGFuZCB0aGVyZSBhcmUgYWxyZWFkeQorCSAqIGNvdW50ZXJzIG9uIHRoZSBDUFUsIGl0IGNhbid0IGdvIG9uLgorCSAqLworCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1c2l2ZSAmJiBjcHVjdHgtPmFjdGl2ZV9vbmNwdSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBPdGhlcndpc2UsIHRyeSB0byBhZGQgaXQgaWYgYWxsIHByZXZpb3VzIGdyb3VwcyB3ZXJlIGFibGUKKwkgKiB0byBnbyBvbi4KKwkgKi8KKwlyZXR1cm4gY2FuX2FkZF9odzsKK30KKworc3RhdGljIHZvaWQgYWRkX2NvdW50ZXJfdG9fY3R4KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsCisJCQkgICAgICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJbGlzdF9hZGRfY291bnRlcihjb3VudGVyLCBjdHgpOworCWNvdW50ZXItPnRzdGFtcF9lbmFibGVkID0gY3R4LT50aW1lOworCWNvdW50ZXItPnRzdGFtcF9ydW5uaW5nID0gY3R4LT50aW1lOworCWNvdW50ZXItPnRzdGFtcF9zdG9wcGVkID0gY3R4LT50aW1lOworfQorCisvKgorICogQ3Jvc3MgQ1BVIGNhbGwgdG8gaW5zdGFsbCBhbmQgZW5hYmxlIGEgcGVyZm9ybWFuY2UgY291bnRlcgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggY3R4LT5tdXRleCBoZWxkCisgKi8KK3N0YXRpYyB2b2lkIF9fcGVyZl9pbnN0YWxsX2luX2NvbnRleHQodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gJl9fZ2V0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGluZm87CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisJc3RydWN0IHBlcmZfY291bnRlciAqbGVhZGVyID0gY291bnRlci0+Z3JvdXBfbGVhZGVyOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGVycjsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHRhc2sgY29udGV4dCwgd2UgbmVlZCB0byBjaGVjayB3aGV0aGVyIGl0IGlzCisJICogdGhlIGN1cnJlbnQgdGFzayBjb250ZXh0IG9mIHRoaXMgY3B1LiBJZiBub3QgaXQgaGFzIGJlZW4KKwkgKiBzY2hlZHVsZWQgb3V0IGJlZm9yZSB0aGUgc21wIGNhbGwgYXJyaXZlZC4KKwkgKiBPciBwb3NzaWJseSB0aGlzIGlzIHRoZSByaWdodCBjb250ZXh0IGJ1dCBpdCBpc24ndAorCSAqIG9uIHRoaXMgY3B1IGJlY2F1c2UgaXQgaGFkIG5vIGNvdW50ZXJzLgorCSAqLworCWlmIChjdHgtPnRhc2sgJiYgY3B1Y3R4LT50YXNrX2N0eCAhPSBjdHgpIHsKKwkJaWYgKGNwdWN0eC0+dGFza19jdHggfHwgY3R4LT50YXNrICE9IGN1cnJlbnQpCisJCQlyZXR1cm47CisJCWNwdWN0eC0+dGFza19jdHggPSBjdHg7CisJfQorCisJc3Bpbl9sb2NrKCZjdHgtPmxvY2spOworCWN0eC0+aXNfYWN0aXZlID0gMTsKKwl1cGRhdGVfY29udGV4dF90aW1lKGN0eCk7CisKKwkvKgorCSAqIFByb3RlY3QgdGhlIGxpc3Qgb3BlcmF0aW9uIGFnYWluc3QgTk1JIGJ5IGRpc2FibGluZyB0aGUKKwkgKiBjb3VudGVycyBvbiBhIGdsb2JhbCBsZXZlbC4gTk9QIGZvciBub24gTk1JIGJhc2VkIGNvdW50ZXJzLgorCSAqLworCXBlcmZfZGlzYWJsZSgpOworCisJYWRkX2NvdW50ZXJfdG9fY3R4KGNvdW50ZXIsIGN0eCk7CisKKwkvKgorCSAqIERvbid0IHB1dCB0aGUgY291bnRlciBvbiBpZiBpdCBpcyBkaXNhYmxlZCBvciBpZgorCSAqIGl0IGlzIGluIGEgZ3JvdXAgYW5kIHRoZSBncm91cCBpc24ndCBvbi4KKwkgKi8KKwlpZiAoY291bnRlci0+c3RhdGUgIT0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFIHx8CisJICAgIChsZWFkZXIgIT0gY291bnRlciAmJiBsZWFkZXItPnN0YXRlICE9IFBFUkZfQ09VTlRFUl9TVEFURV9BQ1RJVkUpKQorCQlnb3RvIHVubG9jazsKKworCS8qCisJICogQW4gZXhjbHVzaXZlIGNvdW50ZXIgY2FuJ3QgZ28gb24gaWYgdGhlcmUgYXJlIGFscmVhZHkgYWN0aXZlCisJICogaGFyZHdhcmUgY291bnRlcnMsIGFuZCBubyBoYXJkd2FyZSBjb3VudGVyIGNhbiBnbyBvbiBpZiB0aGVyZQorCSAqIGlzIGFscmVhZHkgYW4gZXhjbHVzaXZlIGNvdW50ZXIgb24uCisJICovCisJaWYgKCFncm91cF9jYW5fZ29fb24oY291bnRlciwgY3B1Y3R4LCAxKSkKKwkJZXJyID0gLUVFWElTVDsKKwllbHNlCisJCWVyciA9IGNvdW50ZXJfc2NoZWRfaW4oY291bnRlciwgY3B1Y3R4LCBjdHgsIGNwdSk7CisKKwlpZiAoZXJyKSB7CisJCS8qCisJCSAqIFRoaXMgY291bnRlciBjb3VsZG4ndCBnbyBvbi4gIElmIGl0IGlzIGluIGEgZ3JvdXAKKwkJICogdGhlbiB3ZSBoYXZlIHRvIHB1bGwgdGhlIHdob2xlIGdyb3VwIG9mZi4KKwkJICogSWYgdGhlIGNvdW50ZXIgZ3JvdXAgaXMgcGlubmVkIHRoZW4gcHV0IGl0IGluIGVycm9yIHN0YXRlLgorCQkgKi8KKwkJaWYgKGxlYWRlciAhPSBjb3VudGVyKQorCQkJZ3JvdXBfc2NoZWRfb3V0KGxlYWRlciwgY3B1Y3R4LCBjdHgpOworCQlpZiAobGVhZGVyLT5hdHRyLnBpbm5lZCkgeworCQkJdXBkYXRlX2dyb3VwX3RpbWVzKGxlYWRlcik7CisJCQlsZWFkZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX0VSUk9SOworCQl9CisJfQorCisJaWYgKCFlcnIgJiYgIWN0eC0+dGFzayAmJiBjcHVjdHgtPm1heF9wZXJ0YXNrKQorCQljcHVjdHgtPm1heF9wZXJ0YXNrLS07CisKKyB1bmxvY2s6CisJcGVyZl9lbmFibGUoKTsKKworCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOworfQorCisvKgorICogQXR0YWNoIGEgcGVyZm9ybWFuY2UgY291bnRlciB0byBhIGNvbnRleHQKKyAqCisgKiBGaXJzdCB3ZSBhZGQgdGhlIGNvdW50ZXIgdG8gdGhlIGxpc3Qgd2l0aCB0aGUgaGFyZHdhcmUgZW5hYmxlIGJpdAorICogaW4gY291bnRlci0+aHdfY29uZmlnIGNsZWFyZWQuCisgKgorICogSWYgdGhlIGNvdW50ZXIgaXMgYXR0YWNoZWQgdG8gYSB0YXNrIHdoaWNoIGlzIG9uIGEgQ1BVIHdlIHVzZSBhIHNtcAorICogY2FsbCB0byBlbmFibGUgaXQgaW4gdGhlIHRhc2sgY29udGV4dC4gVGhlIHRhc2sgbWlnaHQgaGF2ZSBiZWVuCisgKiBzY2hlZHVsZWQgYXdheSwgYnV0IHdlIGNoZWNrIHRoaXMgaW4gdGhlIHNtcCBjYWxsIGFnYWluLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggY3R4LT5tdXRleCBoZWxkLgorICovCitzdGF0aWMgdm9pZAorcGVyZl9pbnN0YWxsX2luX2NvbnRleHQoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsCisJCQlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdHgtPnRhc2s7CisKKwlpZiAoIXRhc2spIHsKKwkJLyoKKwkJICogUGVyIGNwdSBjb3VudGVycyBhcmUgaW5zdGFsbGVkIHZpYSBhbiBzbXAgY2FsbCBhbmQKKwkJICogdGhlIGluc3RhbGwgaXMgYWx3YXlzIHN1Y2Vzc2Z1bC4KKwkJICovCisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIF9fcGVyZl9pbnN0YWxsX2luX2NvbnRleHQsCisJCQkJCSBjb3VudGVyLCAxKTsKKwkJcmV0dXJuOworCX0KKworcmV0cnk6CisJdGFza19vbmNwdV9mdW5jdGlvbl9jYWxsKHRhc2ssIF9fcGVyZl9pbnN0YWxsX2luX2NvbnRleHQsCisJCQkJIGNvdW50ZXIpOworCisJc3Bpbl9sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkvKgorCSAqIHdlIG5lZWQgdG8gcmV0cnkgdGhlIHNtcCBjYWxsLgorCSAqLworCWlmIChjdHgtPmlzX2FjdGl2ZSAmJiBsaXN0X2VtcHR5KCZjb3VudGVyLT5saXN0X2VudHJ5KSkgeworCQlzcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7CisJCWdvdG8gcmV0cnk7CisJfQorCisJLyoKKwkgKiBUaGUgbG9jayBwcmV2ZW50cyB0aGF0IHRoaXMgY29udGV4dCBpcyBzY2hlZHVsZWQgaW4gc28gd2UKKwkgKiBjYW4gYWRkIHRoZSBjb3VudGVyIHNhZmVseSwgaWYgaXQgdGhlIGNhbGwgYWJvdmUgZGlkIG5vdAorCSAqIHN1Y2NlZWQuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmNvdW50ZXItPmxpc3RfZW50cnkpKQorCQlhZGRfY291bnRlcl90b19jdHgoY291bnRlciwgY3R4KTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7Cit9CisKKy8qCisgKiBDcm9zcyBDUFUgY2FsbCB0byBlbmFibGUgYSBwZXJmb3JtYW5jZSBjb3VudGVyCisgKi8KK3N0YXRpYyB2b2lkIF9fcGVyZl9jb3VudGVyX2VuYWJsZSh2b2lkICppbmZvKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBpbmZvOworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSAmX19nZXRfY3B1X3ZhcihwZXJmX2NwdV9jb250ZXh0KTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpsZWFkZXIgPSBjb3VudGVyLT5ncm91cF9sZWFkZXI7CisJaW50IGVycjsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHBlci10YXNrIGNvdW50ZXIsIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGlzCisJICogY291bnRlcidzIHRhc2sgaXMgdGhlIGN1cnJlbnQgdGFzayBvbiB0aGlzIGNwdS4KKwkgKi8KKwlpZiAoY3R4LT50YXNrICYmIGNwdWN0eC0+dGFza19jdHggIT0gY3R4KSB7CisJCWlmIChjcHVjdHgtPnRhc2tfY3R4IHx8IGN0eC0+dGFzayAhPSBjdXJyZW50KQorCQkJcmV0dXJuOworCQljcHVjdHgtPnRhc2tfY3R4ID0gY3R4OworCX0KKworCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwljdHgtPmlzX2FjdGl2ZSA9IDE7CisJdXBkYXRlX2NvbnRleHRfdGltZShjdHgpOworCisJaWYgKGNvdW50ZXItPnN0YXRlID49IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkKKwkJZ290byB1bmxvY2s7CisJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkU7CisJY291bnRlci0+dHN0YW1wX2VuYWJsZWQgPSBjdHgtPnRpbWUgLSBjb3VudGVyLT50b3RhbF90aW1lX2VuYWJsZWQ7CisKKwkvKgorCSAqIElmIHRoZSBjb3VudGVyIGlzIGluIGEgZ3JvdXAgYW5kIGlzbid0IHRoZSBncm91cCBsZWFkZXIsCisJICogdGhlbiBkb24ndCBwdXQgaXQgb24gdW5sZXNzIHRoZSBncm91cCBpcyBvbi4KKwkgKi8KKwlpZiAobGVhZGVyICE9IGNvdW50ZXIgJiYgbGVhZGVyLT5zdGF0ZSAhPSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFKQorCQlnb3RvIHVubG9jazsKKworCWlmICghZ3JvdXBfY2FuX2dvX29uKGNvdW50ZXIsIGNwdWN0eCwgMSkpIHsKKwkJZXJyID0gLUVFWElTVDsKKwl9IGVsc2UgeworCQlwZXJmX2Rpc2FibGUoKTsKKwkJaWYgKGNvdW50ZXIgPT0gbGVhZGVyKQorCQkJZXJyID0gZ3JvdXBfc2NoZWRfaW4oY291bnRlciwgY3B1Y3R4LCBjdHgsCisJCQkJCSAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJZWxzZQorCQkJZXJyID0gY291bnRlcl9zY2hlZF9pbihjb3VudGVyLCBjcHVjdHgsIGN0eCwKKwkJCQkJICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCXBlcmZfZW5hYmxlKCk7CisJfQorCisJaWYgKGVycikgeworCQkvKgorCQkgKiBJZiB0aGlzIGNvdW50ZXIgY2FuJ3QgZ28gb24gYW5kIGl0J3MgcGFydCBvZiBhCisJCSAqIGdyb3VwLCB0aGVuIHRoZSB3aG9sZSBncm91cCBoYXMgdG8gY29tZSBvZmYuCisJCSAqLworCQlpZiAobGVhZGVyICE9IGNvdW50ZXIpCisJCQlncm91cF9zY2hlZF9vdXQobGVhZGVyLCBjcHVjdHgsIGN0eCk7CisJCWlmIChsZWFkZXItPmF0dHIucGlubmVkKSB7CisJCQl1cGRhdGVfZ3JvdXBfdGltZXMobGVhZGVyKTsKKwkJCWxlYWRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfRVJST1I7CisJCX0KKwl9CisKKyB1bmxvY2s6CisJc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7Cit9CisKKy8qCisgKiBFbmFibGUgYSBjb3VudGVyLgorICoKKyAqIElmIGNvdW50ZXItPmN0eCBpcyBhIGNsb25lZCBjb250ZXh0LCBjYWxsZXJzIG11c3QgbWFrZSBzdXJlIHRoYXQKKyAqIGV2ZXJ5IHRhc2sgc3RydWN0IHRoYXQgY291bnRlci0+Y3R4LT50YXNrIGNvdWxkIHBvc3NpYmx5IHBvaW50IHRvCisgKiByZW1haW5zIHZhbGlkLiAgVGhpcyBjb25kaXRpb24gaXMgc2F0aXNmaWVkIHdoZW4gY2FsbGVkIHRocm91Z2gKKyAqIHBlcmZfY291bnRlcl9mb3JfZWFjaF9jaGlsZCBvciBwZXJmX2NvdW50ZXJfZm9yX2VhY2ggYXMgZGVzY3JpYmVkCisgKiBmb3IgcGVyZl9jb3VudGVyX2Rpc2FibGUuCisgKi8KK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9lbmFibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdHgtPnRhc2s7CisKKwlpZiAoIXRhc2spIHsKKwkJLyoKKwkJICogRW5hYmxlIHRoZSBjb3VudGVyIG9uIHRoZSBjcHUgdGhhdCBpdCdzIG9uCisJCSAqLworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY291bnRlci0+Y3B1LCBfX3BlcmZfY291bnRlcl9lbmFibGUsCisJCQkJCSBjb3VudGVyLCAxKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnEoJmN0eC0+bG9jayk7CisJaWYgKGNvdW50ZXItPnN0YXRlID49IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHRoZSBjb3VudGVyIGlzIGluIGVycm9yIHN0YXRlLCBjbGVhciB0aGF0IGZpcnN0LgorCSAqIFRoYXQgd2F5LCBpZiB3ZSBzZWUgdGhlIGNvdW50ZXIgaW4gZXJyb3Igc3RhdGUgYmVsb3csIHdlCisJICoga25vdyB0aGF0IGl0IGhhcyBnb25lIGJhY2sgaW50byBlcnJvciBzdGF0ZSwgYXMgZGlzdGluY3QKKwkgKiBmcm9tIHRoZSB0YXNrIGhhdmluZyBiZWVuIHNjaGVkdWxlZCBhd2F5IGJlZm9yZSB0aGUKKwkgKiBjcm9zcy1jYWxsIGFycml2ZWQuCisJICovCisJaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9FUlJPUikKKwkJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGOworCisgcmV0cnk6CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworCXRhc2tfb25jcHVfZnVuY3Rpb25fY2FsbCh0YXNrLCBfX3BlcmZfY291bnRlcl9lbmFibGUsIGNvdW50ZXIpOworCisJc3Bpbl9sb2NrX2lycSgmY3R4LT5sb2NrKTsKKworCS8qCisJICogSWYgdGhlIGNvbnRleHQgaXMgYWN0aXZlIGFuZCB0aGUgY291bnRlciBpcyBzdGlsbCBvZmYsCisJICogd2UgbmVlZCB0byByZXRyeSB0aGUgY3Jvc3MtY2FsbC4KKwkgKi8KKwlpZiAoY3R4LT5pc19hY3RpdmUgJiYgY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRikKKwkJZ290byByZXRyeTsKKworCS8qCisJICogU2luY2Ugd2UgaGF2ZSB0aGUgbG9jayB0aGlzIGNvbnRleHQgY2FuJ3QgYmUgc2NoZWR1bGVkCisJICogaW4sIHNvIHdlIGNhbiBjaGFuZ2UgdGhlIHN0YXRlIHNhZmVseS4KKwkgKi8KKwlpZiAoY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRikgeworCQljb3VudGVyLT5zdGF0ZSA9IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRTsKKwkJY291bnRlci0+dHN0YW1wX2VuYWJsZWQgPQorCQkJY3R4LT50aW1lIC0gY291bnRlci0+dG90YWxfdGltZV9lbmFibGVkOworCX0KKyBvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworfQorCitzdGF0aWMgaW50IHBlcmZfY291bnRlcl9yZWZyZXNoKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIGludCByZWZyZXNoKQoreworCS8qCisJICogbm90IHN1cHBvcnRlZCBvbiBpbmhlcml0ZWQgY291bnRlcnMKKwkgKi8KKwlpZiAoY291bnRlci0+YXR0ci5pbmhlcml0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0b21pY19hZGQocmVmcmVzaCwgJmNvdW50ZXItPmV2ZW50X2xpbWl0KTsKKwlwZXJmX2NvdW50ZXJfZW5hYmxlKGNvdW50ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19wZXJmX2NvdW50ZXJfc2NoZWRfb3V0KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LAorCQkJICAgICAgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJc3Bpbl9sb2NrKCZjdHgtPmxvY2spOworCWN0eC0+aXNfYWN0aXZlID0gMDsKKwlpZiAobGlrZWx5KCFjdHgtPm5yX2NvdW50ZXJzKSkKKwkJZ290byBvdXQ7CisJdXBkYXRlX2NvbnRleHRfdGltZShjdHgpOworCisJcGVyZl9kaXNhYmxlKCk7CisJaWYgKGN0eC0+bnJfYWN0aXZlKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmN0eC0+Y291bnRlcl9saXN0LCBsaXN0X2VudHJ5KSB7CisJCQlpZiAoY291bnRlciAhPSBjb3VudGVyLT5ncm91cF9sZWFkZXIpCisJCQkJY291bnRlcl9zY2hlZF9vdXQoY291bnRlciwgY3B1Y3R4LCBjdHgpOworCQkJZWxzZQorCQkJCWdyb3VwX3NjaGVkX291dChjb3VudGVyLCBjcHVjdHgsIGN0eCk7CisJCX0KKwl9CisJcGVyZl9lbmFibGUoKTsKKyBvdXQ6CisJc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7Cit9CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgdHdvIGNvbnRleHRzIGFyZSBlcXVpdmFsZW50LCBpLmUuIHdoZXRoZXIgdGhleQorICogaGF2ZSBib3RoIGJlZW4gY2xvbmVkIGZyb20gdGhlIHNhbWUgdmVyc2lvbiBvZiB0aGUgc2FtZSBjb250ZXh0CisgKiBhbmQgdGhleSBib3RoIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVuYWJsZWQgY291bnRlcnMuCisgKiBJZiB0aGUgbnVtYmVyIG9mIGVuYWJsZWQgY291bnRlcnMgaXMgdGhlIHNhbWUsIHRoZW4gdGhlIHNldAorICogb2YgZW5hYmxlZCBjb3VudGVycyBzaG91bGQgYmUgdGhlIHNhbWUsIGJlY2F1c2UgdGhlc2UgYXJlIGJvdGgKKyAqIGluaGVyaXRlZCBjb250ZXh0cywgdGhlcmVmb3JlIHdlIGNhbid0IGFjY2VzcyBpbmRpdmlkdWFsIGNvdW50ZXJzCisgKiBpbiB0aGVtIGRpcmVjdGx5IHdpdGggYW4gZmQ7IHdlIGNhbiBvbmx5IGVuYWJsZS9kaXNhYmxlIGFsbAorICogY291bnRlcnMgdmlhIHByY3RsLCBvciBlbmFibGUvZGlzYWJsZSBhbGwgY291bnRlcnMgaW4gYSBmYW1pbHkKKyAqIHZpYSBpb2N0bCwgd2hpY2ggd2lsbCBoYXZlIHRoZSBzYW1lIGVmZmVjdCBvbiBib3RoIGNvbnRleHRzLgorICovCitzdGF0aWMgaW50IGNvbnRleHRfZXF1aXYoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgxLAorCQkJIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4MikKK3sKKwlyZXR1cm4gY3R4MS0+cGFyZW50X2N0eCAmJiBjdHgxLT5wYXJlbnRfY3R4ID09IGN0eDItPnBhcmVudF9jdHgKKwkJJiYgY3R4MS0+cGFyZW50X2dlbiA9PSBjdHgyLT5wYXJlbnRfZ2VuCisJCSYmICFjdHgxLT5waW5fY291bnQgJiYgIWN0eDItPnBpbl9jb3VudDsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIHNjaGVkdWxlciB0byByZW1vdmUgdGhlIGNvdW50ZXJzIG9mIHRoZSBjdXJyZW50IHRhc2ssCisgKiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKgorICogV2Ugc3RvcCBlYWNoIGNvdW50ZXIgYW5kIHVwZGF0ZSB0aGUgY291bnRlciB2YWx1ZSBpbiBjb3VudGVyLT5jb3VudC4KKyAqCisgKiBUaGlzIGRvZXMgbm90IHByb3RlY3QgdXMgYWdhaW5zdCBOTUksIGJ1dCBkaXNhYmxlKCkKKyAqIHNldHMgdGhlIGRpc2FibGVkIGJpdCBpbiB0aGUgY29udHJvbCBmaWVsZCBvZiBjb3VudGVyIF9iZWZvcmVfCisgKiBhY2Nlc3NpbmcgdGhlIGNvdW50ZXIgY29udHJvbCByZWdpc3Rlci4gSWYgYSBOTUkgaGl0cywgdGhlbiBpdCB3aWxsCisgKiBub3QgcmVzdGFydCB0aGUgY291bnRlci4KKyAqLwordm9pZCBwZXJmX2NvdW50ZXJfdGFza19zY2hlZF9vdXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsIGludCBjcHUpCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9ICZwZXJfY3B1KHBlcmZfY3B1X2NvbnRleHQsIGNwdSk7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSB0YXNrLT5wZXJmX2NvdW50ZXJfY3R4cDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKm5leHRfY3R4OworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqcGFyZW50OworCXN0cnVjdCBwdF9yZWdzICpyZWdzOworCWludCBkb19zd2l0Y2ggPSAxOworCisJcmVncyA9IHRhc2tfcHRfcmVncyh0YXNrKTsKKwlwZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX0NPVU5UX1NXX0NPTlRFWFRfU1dJVENIRVMsIDEsIDEsIHJlZ3MsIDApOworCisJaWYgKGxpa2VseSghY3R4IHx8ICFjcHVjdHgtPnRhc2tfY3R4KSkKKwkJcmV0dXJuOworCisJdXBkYXRlX2NvbnRleHRfdGltZShjdHgpOworCisJcmN1X3JlYWRfbG9jaygpOworCXBhcmVudCA9IHJjdV9kZXJlZmVyZW5jZShjdHgtPnBhcmVudF9jdHgpOworCW5leHRfY3R4ID0gbmV4dC0+cGVyZl9jb3VudGVyX2N0eHA7CisJaWYgKHBhcmVudCAmJiBuZXh0X2N0eCAmJgorCSAgICByY3VfZGVyZWZlcmVuY2UobmV4dF9jdHgtPnBhcmVudF9jdHgpID09IHBhcmVudCkgeworCQkvKgorCQkgKiBMb29rcyBsaWtlIHRoZSB0d28gY29udGV4dHMgYXJlIGNsb25lcywgc28gd2UgbWlnaHQgYmUKKwkJICogYWJsZSB0byBvcHRpbWl6ZSB0aGUgY29udGV4dCBzd2l0Y2guICBXZSBsb2NrIGJvdGgKKwkJICogY29udGV4dHMgYW5kIGNoZWNrIHRoYXQgdGhleSBhcmUgY2xvbmVzIHVuZGVyIHRoZQorCQkgKiBsb2NrIChpbmNsdWRpbmcgcmUtY2hlY2tpbmcgdGhhdCBuZWl0aGVyIGhhcyBiZWVuCisJCSAqIHVuY2xvbmVkIGluIHRoZSBtZWFudGltZSkuICBJdCBkb2Vzbid0IG1hdHRlciB3aGljaAorCQkgKiBvcmRlciB3ZSB0YWtlIHRoZSBsb2NrcyBiZWNhdXNlIG5vIG90aGVyIGNwdSBjb3VsZAorCQkgKiBiZSB0cnlpbmcgdG8gbG9jayBib3RoIG9mIHRoZXNlIHRhc2tzLgorCQkgKi8KKwkJc3Bpbl9sb2NrKCZjdHgtPmxvY2spOworCQlzcGluX2xvY2tfbmVzdGVkKCZuZXh0X2N0eC0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCQlpZiAoY29udGV4dF9lcXVpdihjdHgsIG5leHRfY3R4KSkgeworCQkJLyoKKwkJCSAqIFhYWCBkbyB3ZSBuZWVkIGEgbWVtb3J5IGJhcnJpZXIgb2Ygc29ydHMKKwkJCSAqIHdydCB0byByY3VfZGVyZWZlcmVuY2UoKSBvZiBwZXJmX2NvdW50ZXJfY3R4cAorCQkJICovCisJCQl0YXNrLT5wZXJmX2NvdW50ZXJfY3R4cCA9IG5leHRfY3R4OworCQkJbmV4dC0+cGVyZl9jb3VudGVyX2N0eHAgPSBjdHg7CisJCQljdHgtPnRhc2sgPSBuZXh0OworCQkJbmV4dF9jdHgtPnRhc2sgPSB0YXNrOworCQkJZG9fc3dpdGNoID0gMDsKKwkJfQorCQlzcGluX3VubG9jaygmbmV4dF9jdHgtPmxvY2spOworCQlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoZG9fc3dpdGNoKSB7CisJCV9fcGVyZl9jb3VudGVyX3NjaGVkX291dChjdHgsIGNwdWN0eCk7CisJCWNwdWN0eC0+dGFza19jdHggPSBOVUxMOworCX0KK30KKworLyoKKyAqIENhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgX19wZXJmX2NvdW50ZXJfdGFza19zY2hlZF9vdXQoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9ICZfX2dldF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCisJaWYgKCFjcHVjdHgtPnRhc2tfY3R4KQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTl9PTkNFKGN0eCAhPSBjcHVjdHgtPnRhc2tfY3R4KSkKKwkJcmV0dXJuOworCisJX19wZXJmX2NvdW50ZXJfc2NoZWRfb3V0KGN0eCwgY3B1Y3R4KTsKKwljcHVjdHgtPnRhc2tfY3R4ID0gTlVMTDsKK30KKworLyoKKyAqIENhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQKKyAqLworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2NwdV9zY2hlZF9vdXQoc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCkKK3sKKwlfX3BlcmZfY291bnRlcl9zY2hlZF9vdXQoJmNwdWN0eC0+Y3R4LCBjcHVjdHgpOworfQorCitzdGF0aWMgdm9pZAorX19wZXJmX2NvdW50ZXJfc2NoZWRfaW4oc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsCisJCQlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LCBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJaW50IGNhbl9hZGRfaHcgPSAxOworCisJc3Bpbl9sb2NrKCZjdHgtPmxvY2spOworCWN0eC0+aXNfYWN0aXZlID0gMTsKKwlpZiAobGlrZWx5KCFjdHgtPm5yX2NvdW50ZXJzKSkKKwkJZ290byBvdXQ7CisKKwljdHgtPnRpbWVzdGFtcCA9IHBlcmZfY2xvY2soKTsKKworCXBlcmZfZGlzYWJsZSgpOworCisJLyoKKwkgKiBGaXJzdCBnbyB0aHJvdWdoIHRoZSBsaXN0IGFuZCBwdXQgb24gYW55IHBpbm5lZCBncm91cHMKKwkgKiBpbiBvcmRlciB0byBnaXZlIHRoZW0gdGhlIGJlc3QgY2hhbmNlIG9mIGdvaW5nIG9uLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmN0eC0+Y291bnRlcl9saXN0LCBsaXN0X2VudHJ5KSB7CisJCWlmIChjb3VudGVyLT5zdGF0ZSA8PSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGIHx8CisJCSAgICAhY291bnRlci0+YXR0ci5waW5uZWQpCisJCQljb250aW51ZTsKKwkJaWYgKGNvdW50ZXItPmNwdSAhPSAtMSAmJiBjb3VudGVyLT5jcHUgIT0gY3B1KQorCQkJY29udGludWU7CisKKwkJaWYgKGNvdW50ZXIgIT0gY291bnRlci0+Z3JvdXBfbGVhZGVyKQorCQkJY291bnRlcl9zY2hlZF9pbihjb3VudGVyLCBjcHVjdHgsIGN0eCwgY3B1KTsKKwkJZWxzZSB7CisJCQlpZiAoZ3JvdXBfY2FuX2dvX29uKGNvdW50ZXIsIGNwdWN0eCwgMSkpCisJCQkJZ3JvdXBfc2NoZWRfaW4oY291bnRlciwgY3B1Y3R4LCBjdHgsIGNwdSk7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGlzIHBpbm5lZCBncm91cCBoYXNuJ3QgYmVlbiBzY2hlZHVsZWQsCisJCSAqIHB1dCBpdCBpbiBlcnJvciBzdGF0ZS4KKwkJICovCisJCWlmIChjb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkUpIHsKKwkJCXVwZGF0ZV9ncm91cF90aW1lcyhjb3VudGVyKTsKKwkJCWNvdW50ZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX0VSUk9SOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmY3R4LT5jb3VudGVyX2xpc3QsIGxpc3RfZW50cnkpIHsKKwkJLyoKKwkJICogSWdub3JlIGNvdW50ZXJzIGluIE9GRiBvciBFUlJPUiBzdGF0ZSwgYW5kCisJCSAqIGlnbm9yZSBwaW5uZWQgY291bnRlcnMgc2luY2Ugd2UgZGlkIHRoZW0gYWxyZWFkeS4KKwkJICovCisJCWlmIChjb3VudGVyLT5zdGF0ZSA8PSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGIHx8CisJCSAgICBjb3VudGVyLT5hdHRyLnBpbm5lZCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIExpc3RlbiB0byB0aGUgJ2NwdScgc2NoZWR1bGluZyBmaWx0ZXIgY29uc3RyYWludAorCQkgKiBvZiBjb3VudGVyczoKKwkJICovCisJCWlmIChjb3VudGVyLT5jcHUgIT0gLTEgJiYgY291bnRlci0+Y3B1ICE9IGNwdSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjb3VudGVyICE9IGNvdW50ZXItPmdyb3VwX2xlYWRlcikgeworCQkJaWYgKGNvdW50ZXJfc2NoZWRfaW4oY291bnRlciwgY3B1Y3R4LCBjdHgsIGNwdSkpCisJCQkJY2FuX2FkZF9odyA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAoZ3JvdXBfY2FuX2dvX29uKGNvdW50ZXIsIGNwdWN0eCwgY2FuX2FkZF9odykpIHsKKwkJCQlpZiAoZ3JvdXBfc2NoZWRfaW4oY291bnRlciwgY3B1Y3R4LCBjdHgsIGNwdSkpCisJCQkJCWNhbl9hZGRfaHcgPSAwOworCQkJfQorCQl9CisJfQorCXBlcmZfZW5hYmxlKCk7Cisgb3V0OgorCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOworfQorCisvKgorICogQ2FsbGVkIGZyb20gc2NoZWR1bGVyIHRvIGFkZCB0aGUgY291bnRlcnMgb2YgdGhlIGN1cnJlbnQgdGFzaworICogd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICoKKyAqIFdlIHJlc3RvcmUgdGhlIGNvdW50ZXIgdmFsdWUgYW5kIHRoZW4gZW5hYmxlIGl0LgorICoKKyAqIFRoaXMgZG9lcyBub3QgcHJvdGVjdCB1cyBhZ2FpbnN0IE5NSSwgYnV0IGVuYWJsZSgpCisgKiBzZXRzIHRoZSBlbmFibGVkIGJpdCBpbiB0aGUgY29udHJvbCBmaWVsZCBvZiBjb3VudGVyIF9iZWZvcmVfCisgKiBhY2Nlc3NpbmcgdGhlIGNvdW50ZXIgY29udHJvbCByZWdpc3Rlci4gSWYgYSBOTUkgaGl0cywgdGhlbiBpdCB3aWxsCisgKiBrZWVwIHRoZSBjb3VudGVyIHJ1bm5pbmcuCisgKi8KK3ZvaWQgcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfaW4oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSAmcGVyX2NwdShwZXJmX2NwdV9jb250ZXh0LCBjcHUpOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gdGFzay0+cGVyZl9jb3VudGVyX2N0eHA7CisKKwlpZiAobGlrZWx5KCFjdHgpKQorCQlyZXR1cm47CisJaWYgKGNwdWN0eC0+dGFza19jdHggPT0gY3R4KQorCQlyZXR1cm47CisJX19wZXJmX2NvdW50ZXJfc2NoZWRfaW4oY3R4LCBjcHVjdHgsIGNwdSk7CisJY3B1Y3R4LT50YXNrX2N0eCA9IGN0eDsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2NwdV9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4LCBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gJmNwdWN0eC0+Y3R4OworCisJX19wZXJmX2NvdW50ZXJfc2NoZWRfaW4oY3R4LCBjcHVjdHgsIGNwdSk7Cit9CisKKyNkZWZpbmUgTUFYX0lOVEVSUlVQVFMgKH4wVUxMKQorCitzdGF0aWMgdm9pZCBwZXJmX2xvZ190aHJvdHRsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBpbnQgZW5hYmxlKTsKK3N0YXRpYyB2b2lkIHBlcmZfbG9nX3BlcmlvZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCB1NjQgcGVyaW9kKTsKKworc3RhdGljIHZvaWQgcGVyZl9hZGp1c3RfcGVyaW9kKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIHU2NCBldmVudHMpCit7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCXU2NCBwZXJpb2QsIHNhbXBsZV9wZXJpb2Q7CisJczY0IGRlbHRhOworCisJZXZlbnRzICo9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKKwlwZXJpb2QgPSBkaXY2NF91NjQoZXZlbnRzLCBjb3VudGVyLT5hdHRyLnNhbXBsZV9mcmVxKTsKKworCWRlbHRhID0gKHM2NCkocGVyaW9kIC0gaHdjLT5zYW1wbGVfcGVyaW9kKTsKKwlkZWx0YSA9IChkZWx0YSArIDcpIC8gODsgLyogbG93IHBhc3MgZmlsdGVyICovCisKKwlzYW1wbGVfcGVyaW9kID0gaHdjLT5zYW1wbGVfcGVyaW9kICsgZGVsdGE7CisKKwlpZiAoIXNhbXBsZV9wZXJpb2QpCisJCXNhbXBsZV9wZXJpb2QgPSAxOworCisJcGVyZl9sb2dfcGVyaW9kKGNvdW50ZXIsIHNhbXBsZV9wZXJpb2QpOworCisJaHdjLT5zYW1wbGVfcGVyaW9kID0gc2FtcGxlX3BlcmlvZDsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jdHhfYWRqdXN0X2ZyZXEoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2M7CisJdTY0IGludGVycnVwdHMsIGZyZXE7CisKKwlzcGluX2xvY2soJmN0eC0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmY3R4LT5jb3VudGVyX2xpc3QsIGxpc3RfZW50cnkpIHsKKwkJaWYgKGNvdW50ZXItPnN0YXRlICE9IFBFUkZfQ09VTlRFUl9TVEFURV9BQ1RJVkUpCisJCQljb250aW51ZTsKKworCQlod2MgPSAmY291bnRlci0+aHc7CisKKwkJaW50ZXJydXB0cyA9IGh3Yy0+aW50ZXJydXB0czsKKwkJaHdjLT5pbnRlcnJ1cHRzID0gMDsKKworCQkvKgorCQkgKiB1bnRocm90dGxlIGNvdW50ZXJzIG9uIHRoZSB0aWNrCisJCSAqLworCQlpZiAoaW50ZXJydXB0cyA9PSBNQVhfSU5URVJSVVBUUykgeworCQkJcGVyZl9sb2dfdGhyb3R0bGUoY291bnRlciwgMSk7CisJCQljb3VudGVyLT5wbXUtPnVudGhyb3R0bGUoY291bnRlcik7CisJCQlpbnRlcnJ1cHRzID0gMipzeXNjdGxfcGVyZl9jb3VudGVyX3NhbXBsZV9yYXRlL0haOworCQl9CisKKwkJaWYgKCFjb3VudGVyLT5hdHRyLmZyZXEgfHwgIWNvdW50ZXItPmF0dHIuc2FtcGxlX2ZyZXEpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBpZiB0aGUgc3BlY2lmaWVkIGZyZXEgPCBIWiB0aGVuIHdlIG5lZWQgdG8gc2tpcCB0aWNrcworCQkgKi8KKwkJaWYgKGNvdW50ZXItPmF0dHIuc2FtcGxlX2ZyZXEgPCBIWikgeworCQkJZnJlcSA9IGNvdW50ZXItPmF0dHIuc2FtcGxlX2ZyZXE7CisKKwkJCWh3Yy0+ZnJlcV9jb3VudCArPSBmcmVxOworCQkJaHdjLT5mcmVxX2ludGVycnVwdHMgKz0gaW50ZXJydXB0czsKKworCQkJaWYgKGh3Yy0+ZnJlcV9jb3VudCA8IEhaKQorCQkJCWNvbnRpbnVlOworCisJCQlpbnRlcnJ1cHRzID0gaHdjLT5mcmVxX2ludGVycnVwdHM7CisJCQlod2MtPmZyZXFfaW50ZXJydXB0cyA9IDA7CisJCQlod2MtPmZyZXFfY291bnQgLT0gSFo7CisJCX0gZWxzZQorCQkJZnJlcSA9IEhaOworCisJCXBlcmZfYWRqdXN0X3BlcmlvZChjb3VudGVyLCBmcmVxICogaW50ZXJydXB0cyk7CisKKwkJLyoKKwkJICogSW4gb3JkZXIgdG8gYXZvaWQgYmVpbmcgc3RhbGxlZCBieSBhbiAoYWNjaWRlbnRhbCkgaHVnZQorCQkgKiBzYW1wbGUgcGVyaW9kLCBmb3JjZSByZXNldCB0aGUgc2FtcGxlIHBlcmlvZCBpZiB3ZSBkaWRuJ3QKKwkJICogZ2V0IGFueSBldmVudHMgaW4gdGhpcyBmcmVxIHBlcmlvZC4KKwkJICovCisJCWlmICghaW50ZXJydXB0cykgeworCQkJcGVyZl9kaXNhYmxlKCk7CisJCQljb3VudGVyLT5wbXUtPmRpc2FibGUoY291bnRlcik7CisJCQlhdG9taWNfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCAwKTsKKwkJCWNvdW50ZXItPnBtdS0+ZW5hYmxlKGNvdW50ZXIpOworCQkJcGVyZl9lbmFibGUoKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKK30KKworLyoKKyAqIFJvdW5kLXJvYmluIGEgY29udGV4dCdzIGNvdW50ZXJzOgorICovCitzdGF0aWMgdm9pZCByb3RhdGVfY3R4KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisKKwlpZiAoIWN0eC0+bnJfY291bnRlcnMpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwkvKgorCSAqIFJvdGF0ZSB0aGUgZmlyc3QgZW50cnkgbGFzdCAod29ya3MganVzdCBmaW5lIGZvciBncm91cCBjb3VudGVycyB0b28pOgorCSAqLworCXBlcmZfZGlzYWJsZSgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmN0eC0+Y291bnRlcl9saXN0LCBsaXN0X2VudHJ5KSB7CisJCWxpc3RfbW92ZV90YWlsKCZjb3VudGVyLT5saXN0X2VudHJ5LCAmY3R4LT5jb3VudGVyX2xpc3QpOworCQlicmVhazsKKwl9CisJcGVyZl9lbmFibGUoKTsKKworCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOworfQorCit2b2lkIHBlcmZfY291bnRlcl90YXNrX3RpY2soc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyLCBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHg7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisKKwlpZiAoIWF0b21pY19yZWFkKCZucl9jb3VudGVycykpCisJCXJldHVybjsKKworCWNwdWN0eCA9ICZwZXJfY3B1KHBlcmZfY3B1X2NvbnRleHQsIGNwdSk7CisJY3R4ID0gY3Vyci0+cGVyZl9jb3VudGVyX2N0eHA7CisKKwlwZXJmX2N0eF9hZGp1c3RfZnJlcSgmY3B1Y3R4LT5jdHgpOworCWlmIChjdHgpCisJCXBlcmZfY3R4X2FkanVzdF9mcmVxKGN0eCk7CisKKwlwZXJmX2NvdW50ZXJfY3B1X3NjaGVkX291dChjcHVjdHgpOworCWlmIChjdHgpCisJCV9fcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfb3V0KGN0eCk7CisKKwlyb3RhdGVfY3R4KCZjcHVjdHgtPmN0eCk7CisJaWYgKGN0eCkKKwkJcm90YXRlX2N0eChjdHgpOworCisJcGVyZl9jb3VudGVyX2NwdV9zY2hlZF9pbihjcHVjdHgsIGNwdSk7CisJaWYgKGN0eCkKKwkJcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfaW4oY3VyciwgY3B1KTsKK30KKworLyoKKyAqIENyb3NzIENQVSBjYWxsIHRvIHJlYWQgdGhlIGhhcmR3YXJlIGNvdW50ZXIKKyAqLworc3RhdGljIHZvaWQgX19yZWFkKHZvaWQgKmluZm8pCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGluZm87CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoY3R4LT5pc19hY3RpdmUpCisJCXVwZGF0ZV9jb250ZXh0X3RpbWUoY3R4KTsKKwljb3VudGVyLT5wbXUtPnJlYWQoY291bnRlcik7CisJdXBkYXRlX2NvdW50ZXJfdGltZXMoY291bnRlcik7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdTY0IHBlcmZfY291bnRlcl9yZWFkKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJLyoKKwkgKiBJZiBjb3VudGVyIGlzIGVuYWJsZWQgYW5kIGN1cnJlbnRseSBhY3RpdmUgb24gYSBDUFUsIHVwZGF0ZSB0aGUKKwkgKiB2YWx1ZSBpbiB0aGUgY291bnRlciBzdHJ1Y3R1cmU6CisJICovCisJaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9BQ1RJVkUpIHsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNvdW50ZXItPm9uY3B1LAorCQkJCQkgX19yZWFkLCBjb3VudGVyLCAxKTsKKwl9IGVsc2UgaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkgeworCQl1cGRhdGVfY291bnRlcl90aW1lcyhjb3VudGVyKTsKKwl9CisKKwlyZXR1cm4gYXRvbWljNjRfcmVhZCgmY291bnRlci0+Y291bnQpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgcGVyZl9jb3VudGVyIGNvbnRleHQgaW4gYSB0YXNrX3N0cnVjdDoKKyAqLworc3RhdGljIHZvaWQKK19fcGVyZl9jb3VudGVyX2luaXRfY29udGV4dChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCwKKwkJCSAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTsKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT5sb2NrKTsKKwltdXRleF9pbml0KCZjdHgtPm11dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmY3R4LT5jb3VudGVyX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPmV2ZW50X2xpc3QpOworCWF0b21pY19zZXQoJmN0eC0+cmVmY291bnQsIDEpOworCWN0eC0+dGFzayA9IHRhc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmZpbmRfZ2V0X2NvbnRleHQocGlkX3QgcGlkLCBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqcGFyZW50X2N0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4OworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisKKwkvKgorCSAqIElmIGNwdSBpcyBub3QgYSB3aWxkY2FyZCB0aGVuIHRoaXMgaXMgYSBwZXJjcHUgY291bnRlcjoKKwkgKi8KKwlpZiAoY3B1ICE9IC0xKSB7CisJCS8qIE11c3QgYmUgcm9vdCB0byBvcGVyYXRlIG9uIGEgQ1BVIGNvdW50ZXI6ICovCisJCWlmIChwZXJmX3BhcmFub2lkX2NwdSgpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKwkJaWYgKGNwdSA8IDAgfHwgY3B1ID4gbnVtX3Bvc3NpYmxlX2NwdXMoKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJCS8qCisJCSAqIFdlIGNvdWxkIGJlIGNsZXZlciBhbmQgYWxsb3cgdG8gYXR0YWNoIGEgY291bnRlciB0byBhbgorCQkgKiBvZmZsaW5lIENQVSBhbmQgYWN0aXZhdGUgaXQgd2hlbiB0aGUgQ1BVIGNvbWVzIHVwLCBidXQKKwkJICogdGhhdCdzIGZvciBsYXRlci4KKwkJICovCisJCWlmICghY3B1X2lzc2V0KGNwdSwgY3B1X29ubGluZV9tYXApKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwkJY3B1Y3R4ID0gJnBlcl9jcHUocGVyZl9jcHVfY29udGV4dCwgY3B1KTsKKwkJY3R4ID0gJmNwdWN0eC0+Y3R4OworCQlnZXRfY3R4KGN0eCk7CisKKwkJcmV0dXJuIGN0eDsKKwl9CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCFwaWQpCisJCXRhc2sgPSBjdXJyZW50OworCWVsc2UKKwkJdGFzayA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CisJaWYgKHRhc2spCisJCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmICghdGFzaykKKwkJcmV0dXJuIEVSUl9QVFIoLUVTUkNIKTsKKworCS8qCisJICogQ2FuJ3QgYXR0YWNoIGNvdW50ZXJzIHRvIGEgZHlpbmcgdGFzay4KKwkgKi8KKwllcnIgPSAtRVNSQ0g7CisJaWYgKHRhc2stPmZsYWdzICYgUEZfRVhJVElORykKKwkJZ290byBlcnJvdXQ7CisKKwkvKiBSZXVzZSBwdHJhY2UgcGVybWlzc2lvbiBjaGVja3MgZm9yIG5vdy4gKi8KKwllcnIgPSAtRUFDQ0VTOworCWlmICghcHRyYWNlX21heV9hY2Nlc3ModGFzaywgUFRSQUNFX01PREVfUkVBRCkpCisJCWdvdG8gZXJyb3V0OworCisgcmV0cnk6CisJY3R4ID0gcGVyZl9sb2NrX3Rhc2tfY29udGV4dCh0YXNrLCAmZmxhZ3MpOworCWlmIChjdHgpIHsKKwkJcGFyZW50X2N0eCA9IGN0eC0+cGFyZW50X2N0eDsKKwkJaWYgKHBhcmVudF9jdHgpIHsKKwkJCXB1dF9jdHgocGFyZW50X2N0eCk7CisJCQljdHgtPnBhcmVudF9jdHggPSBOVUxMOwkJLyogbm8gbG9uZ2VyIGEgY2xvbmUgKi8KKwkJfQorCQkvKgorCQkgKiBHZXQgYW4gZXh0cmEgcmVmZXJlbmNlIGJlZm9yZSBkcm9wcGluZyB0aGUgbG9jayBzbyB0aGF0CisJCSAqIHRoaXMgY29udGV4dCB3b24ndCBnZXQgZnJlZWQgaWYgdGhlIHRhc2sgZXhpdHMuCisJCSAqLworCQlnZXRfY3R4KGN0eCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCX0KKworCWlmICghY3R4KSB7CisJCWN0eCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCksIEdGUF9LRVJORUwpOworCQllcnIgPSAtRU5PTUVNOworCQlpZiAoIWN0eCkKKwkJCWdvdG8gZXJyb3V0OworCQlfX3BlcmZfY291bnRlcl9pbml0X2NvbnRleHQoY3R4LCB0YXNrKTsKKwkJZ2V0X2N0eChjdHgpOworCQlpZiAoY21weGNoZygmdGFzay0+cGVyZl9jb3VudGVyX2N0eHAsIE5VTEwsIGN0eCkpIHsKKwkJCS8qCisJCQkgKiBXZSByYWNlZCB3aXRoIHNvbWUgb3RoZXIgdGFzazsgdXNlCisJCQkgKiB0aGUgY29udGV4dCB0aGV5IHNldC4KKwkJCSAqLworCQkJa2ZyZWUoY3R4KTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJZ2V0X3Rhc2tfc3RydWN0KHRhc2spOworCX0KKworCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKwlyZXR1cm4gY3R4OworCisgZXJyb3V0OgorCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2NvdW50ZXJfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJY291bnRlciA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgcGVyZl9jb3VudGVyLCByY3VfaGVhZCk7CisJaWYgKGNvdW50ZXItPm5zKQorCQlwdXRfcGlkX25zKGNvdW50ZXItPm5zKTsKKwlrZnJlZShjb3VudGVyKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9wZW5kaW5nX3N5bmMoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcik7CisKK3N0YXRpYyB2b2lkIGZyZWVfY291bnRlcihzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXBlcmZfcGVuZGluZ19zeW5jKGNvdW50ZXIpOworCisJYXRvbWljX2RlYygmbnJfY291bnRlcnMpOworCWlmIChjb3VudGVyLT5hdHRyLm1tYXApCisJCWF0b21pY19kZWMoJm5yX21tYXBfY291bnRlcnMpOworCWlmIChjb3VudGVyLT5hdHRyLmNvbW0pCisJCWF0b21pY19kZWMoJm5yX2NvbW1fY291bnRlcnMpOworCisJaWYgKGNvdW50ZXItPmRlc3Ryb3kpCisJCWNvdW50ZXItPmRlc3Ryb3koY291bnRlcik7CisKKwlwdXRfY3R4KGNvdW50ZXItPmN0eCk7CisJY2FsbF9yY3UoJmNvdW50ZXItPnJjdV9oZWFkLCBmcmVlX2NvdW50ZXJfcmN1KTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgZmlsZSBpcyBnb25lLgorICovCitzdGF0aWMgaW50IHBlcmZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gY291bnRlci0+Y3R4OworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCVdBUk5fT05fT05DRShjdHgtPnBhcmVudF9jdHgpOworCW11dGV4X2xvY2soJmN0eC0+bXV0ZXgpOworCXBlcmZfY291bnRlcl9yZW1vdmVfZnJvbV9jb250ZXh0KGNvdW50ZXIpOworCW11dGV4X3VubG9jaygmY3R4LT5tdXRleCk7CisKKwltdXRleF9sb2NrKCZjb3VudGVyLT5vd25lci0+cGVyZl9jb3VudGVyX211dGV4KTsKKwlsaXN0X2RlbF9pbml0KCZjb3VudGVyLT5vd25lcl9lbnRyeSk7CisJbXV0ZXhfdW5sb2NrKCZjb3VudGVyLT5vd25lci0+cGVyZl9jb3VudGVyX211dGV4KTsKKwlwdXRfdGFza19zdHJ1Y3QoY291bnRlci0+b3duZXIpOworCisJZnJlZV9jb3VudGVyKGNvdW50ZXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBwZXJmb3JtYW5jZSBjb3VudGVyIC0gc2ltcGxlIG5vbiBibG9ja2luZyB2ZXJzaW9uIGZvciBub3cKKyAqLworc3RhdGljIHNzaXplX3QKK3BlcmZfcmVhZF9odyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdTY0IHZhbHVlc1szXTsKKwlpbnQgbjsKKworCS8qCisJICogUmV0dXJuIGVuZC1vZi1maWxlIGZvciBhIHJlYWQgb24gYSBjb3VudGVyIHRoYXQgaXMgaW4KKwkgKiBlcnJvciBzdGF0ZSAoaS5lLiBiZWNhdXNlIGl0IHdhcyBwaW5uZWQgYnV0IGl0IGNvdWxkbid0IGJlCisJICogc2NoZWR1bGVkIG9uIHRvIHRoZSBDUFUgYXQgc29tZSBwb2ludCkuCisJICovCisJaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9FUlJPUikKKwkJcmV0dXJuIDA7CisKKwlXQVJOX09OX09OQ0UoY291bnRlci0+Y3R4LT5wYXJlbnRfY3R4KTsKKwltdXRleF9sb2NrKCZjb3VudGVyLT5jaGlsZF9tdXRleCk7CisJdmFsdWVzWzBdID0gcGVyZl9jb3VudGVyX3JlYWQoY291bnRlcik7CisJbiA9IDE7CisJaWYgKGNvdW50ZXItPmF0dHIucmVhZF9mb3JtYXQgJiBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX0VOQUJMRUQpCisJCXZhbHVlc1tuKytdID0gY291bnRlci0+dG90YWxfdGltZV9lbmFibGVkICsKKwkJCWF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmNoaWxkX3RvdGFsX3RpbWVfZW5hYmxlZCk7CisJaWYgKGNvdW50ZXItPmF0dHIucmVhZF9mb3JtYXQgJiBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkcpCisJCXZhbHVlc1tuKytdID0gY291bnRlci0+dG90YWxfdGltZV9ydW5uaW5nICsKKwkJCWF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmNoaWxkX3RvdGFsX3RpbWVfcnVubmluZyk7CisJaWYgKGNvdW50ZXItPmF0dHIucmVhZF9mb3JtYXQgJiBQRVJGX0ZPUk1BVF9JRCkKKwkJdmFsdWVzW24rK10gPSBjb3VudGVyLT5pZDsKKwltdXRleF91bmxvY2soJmNvdW50ZXItPmNoaWxkX211dGV4KTsKKworCWlmIChjb3VudCA8IG4gKiBzaXplb2YodTY0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY291bnQgPSBuICogc2l6ZW9mKHU2NCk7CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgdmFsdWVzLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAorcGVyZl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIHBlcmZfcmVhZF9odyhjb3VudGVyLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBwZXJmX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgaW50IGV2ZW50cyA9IFBPTExfSFVQOworCisJcmN1X3JlYWRfbG9jaygpOworCWRhdGEgPSByY3VfZGVyZWZlcmVuY2UoY291bnRlci0+ZGF0YSk7CisJaWYgKGRhdGEpCisJCWV2ZW50cyA9IGF0b21pY194Y2hnKCZkYXRhLT5wb2xsLCAwKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXBvbGxfd2FpdChmaWxlLCAmY291bnRlci0+d2FpdHEsIHdhaXQpOworCisJcmV0dXJuIGV2ZW50czsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX3Jlc2V0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJKHZvaWQpcGVyZl9jb3VudGVyX3JlYWQoY291bnRlcik7CisJYXRvbWljNjRfc2V0KCZjb3VudGVyLT5jb3VudCwgMCk7CisJcGVyZl9jb3VudGVyX3VwZGF0ZV91c2VycGFnZShjb3VudGVyKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2Zvcl9lYWNoX3NpYmxpbmcoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCQkJICB2b2lkICgqZnVuYykoc3RydWN0IHBlcmZfY291bnRlciAqKSkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpzaWJsaW5nOworCisJV0FSTl9PTl9PTkNFKGN0eC0+cGFyZW50X2N0eCk7CisJbXV0ZXhfbG9jaygmY3R4LT5tdXRleCk7CisJY291bnRlciA9IGNvdW50ZXItPmdyb3VwX2xlYWRlcjsKKworCWZ1bmMoY291bnRlcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzaWJsaW5nLCAmY291bnRlci0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KQorCQlmdW5jKHNpYmxpbmcpOworCW11dGV4X3VubG9jaygmY3R4LT5tdXRleCk7Cit9CisKKy8qCisgKiBIb2xkaW5nIHRoZSB0b3AtbGV2ZWwgY291bnRlcidzIGNoaWxkX211dGV4IG1lYW5zIHRoYXQgYW55CisgKiBkZXNjZW5kYW50IHByb2Nlc3MgdGhhdCBoYXMgaW5oZXJpdGVkIHRoaXMgY291bnRlciB3aWxsIGJsb2NrCisgKiBpbiBzeW5jX2NoaWxkX2NvdW50ZXIgaWYgaXQgZ29lcyB0byBleGl0LCB0aHVzIHNhdGlzZnlpbmcgdGhlCisgKiB0YXNrIGV4aXN0ZW5jZSByZXF1aXJlbWVudHMgb2YgcGVyZl9jb3VudGVyX2VuYWJsZS9kaXNhYmxlLgorICovCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfZm9yX2VhY2hfY2hpbGQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCQkJdm9pZCAoKmZ1bmMpKHN0cnVjdCBwZXJmX2NvdW50ZXIgKikpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY2hpbGQ7CisKKwlXQVJOX09OX09OQ0UoY291bnRlci0+Y3R4LT5wYXJlbnRfY3R4KTsKKwltdXRleF9sb2NrKCZjb3VudGVyLT5jaGlsZF9tdXRleCk7CisJZnVuYyhjb3VudGVyKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmY291bnRlci0+Y2hpbGRfbGlzdCwgY2hpbGRfbGlzdCkKKwkJZnVuYyhjaGlsZCk7CisJbXV0ZXhfdW5sb2NrKCZjb3VudGVyLT5jaGlsZF9tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9mb3JfZWFjaChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJCSAgdm9pZCAoKmZ1bmMpKHN0cnVjdCBwZXJmX2NvdW50ZXIgKikpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY2hpbGQ7CisKKwlXQVJOX09OX09OQ0UoY291bnRlci0+Y3R4LT5wYXJlbnRfY3R4KTsKKwltdXRleF9sb2NrKCZjb3VudGVyLT5jaGlsZF9tdXRleCk7CisJcGVyZl9jb3VudGVyX2Zvcl9lYWNoX3NpYmxpbmcoY291bnRlciwgZnVuYyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmNvdW50ZXItPmNoaWxkX2xpc3QsIGNoaWxkX2xpc3QpCisJCXBlcmZfY291bnRlcl9mb3JfZWFjaF9zaWJsaW5nKGNoaWxkLCBmdW5jKTsKKwltdXRleF91bmxvY2soJmNvdW50ZXItPmNoaWxkX211dGV4KTsKK30KKworc3RhdGljIGludCBwZXJmX2NvdW50ZXJfcGVyaW9kKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIHU2NCBfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHJldCA9IDA7CisJdTY0IHZhbHVlOworCisJaWYgKCFjb3VudGVyLT5hdHRyLnNhbXBsZV9wZXJpb2QpCisJCXJldHVybiAtRUlOVkFMOworCisJc2l6ZSA9IGNvcHlfZnJvbV91c2VyKCZ2YWx1ZSwgYXJnLCBzaXplb2YodmFsdWUpKTsKKwlpZiAoc2l6ZSAhPSBzaXplb2YodmFsdWUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghdmFsdWUpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwlpZiAoY291bnRlci0+YXR0ci5mcmVxKSB7CisJCWlmICh2YWx1ZSA+IHN5c2N0bF9wZXJmX2NvdW50ZXJfc2FtcGxlX3JhdGUpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCisJCWNvdW50ZXItPmF0dHIuc2FtcGxlX2ZyZXEgPSB2YWx1ZTsKKwl9IGVsc2UgeworCQlwZXJmX2xvZ19wZXJpb2QoY291bnRlciwgdmFsdWUpOworCisJCWNvdW50ZXItPmF0dHIuc2FtcGxlX3BlcmlvZCA9IHZhbHVlOworCQljb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kID0gdmFsdWU7CisJfQordW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIHBlcmZfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdm9pZCAoKmZ1bmMpKHN0cnVjdCBwZXJmX2NvdW50ZXIgKik7CisJdTMyIGZsYWdzID0gYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBFUkZfQ09VTlRFUl9JT0NfRU5BQkxFOgorCQlmdW5jID0gcGVyZl9jb3VudGVyX2VuYWJsZTsKKwkJYnJlYWs7CisJY2FzZSBQRVJGX0NPVU5URVJfSU9DX0RJU0FCTEU6CisJCWZ1bmMgPSBwZXJmX2NvdW50ZXJfZGlzYWJsZTsKKwkJYnJlYWs7CisJY2FzZSBQRVJGX0NPVU5URVJfSU9DX1JFU0VUOgorCQlmdW5jID0gcGVyZl9jb3VudGVyX3Jlc2V0OworCQlicmVhazsKKworCWNhc2UgUEVSRl9DT1VOVEVSX0lPQ19SRUZSRVNIOgorCQlyZXR1cm4gcGVyZl9jb3VudGVyX3JlZnJlc2goY291bnRlciwgYXJnKTsKKworCWNhc2UgUEVSRl9DT1VOVEVSX0lPQ19QRVJJT0Q6CisJCXJldHVybiBwZXJmX2NvdW50ZXJfcGVyaW9kKGNvdW50ZXIsICh1NjQgX191c2VyICopYXJnKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KKworCWlmIChmbGFncyAmIFBFUkZfSU9DX0ZMQUdfR1JPVVApCisJCXBlcmZfY291bnRlcl9mb3JfZWFjaChjb3VudGVyLCBmdW5jKTsKKwllbHNlCisJCXBlcmZfY291bnRlcl9mb3JfZWFjaF9jaGlsZChjb3VudGVyLCBmdW5jKTsKKworCXJldHVybiAwOworfQorCitpbnQgcGVyZl9jb3VudGVyX3Rhc2tfZW5hYmxlKHZvaWQpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCW11dGV4X2xvY2soJmN1cnJlbnQtPnBlcmZfY291bnRlcl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmY3VycmVudC0+cGVyZl9jb3VudGVyX2xpc3QsIG93bmVyX2VudHJ5KQorCQlwZXJmX2NvdW50ZXJfZm9yX2VhY2hfY2hpbGQoY291bnRlciwgcGVyZl9jb3VudGVyX2VuYWJsZSk7CisJbXV0ZXhfdW5sb2NrKCZjdXJyZW50LT5wZXJmX2NvdW50ZXJfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwZXJmX2NvdW50ZXJfdGFza19kaXNhYmxlKHZvaWQpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCW11dGV4X2xvY2soJmN1cnJlbnQtPnBlcmZfY291bnRlcl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmY3VycmVudC0+cGVyZl9jb3VudGVyX2xpc3QsIG93bmVyX2VudHJ5KQorCQlwZXJmX2NvdW50ZXJfZm9yX2VhY2hfY2hpbGQoY291bnRlciwgcGVyZl9jb3VudGVyX2Rpc2FibGUpOworCW11dGV4X3VubG9jaygmY3VycmVudC0+cGVyZl9jb3VudGVyX211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FsbGVycyBuZWVkIHRvIGVuc3VyZSB0aGVyZSBjYW4gYmUgbm8gbmVzdGluZyBvZiB0aGlzIGZ1bmN0aW9uLCBvdGhlcndpc2UKKyAqIHRoZSBzZXFsb2NrIGxvZ2ljIGdvZXMgYmFkLiBXZSBjYW4gbm90IHNlcmlhbGl6ZSB0aGlzIGJlY2F1c2UgdGhlIGFyY2gKKyAqIGNvZGUgY2FsbHMgdGhpcyBmcm9tIE5NSSBjb250ZXh0LgorICovCit2b2lkIHBlcmZfY291bnRlcl91cGRhdGVfdXNlcnBhZ2Uoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX21tYXBfcGFnZSAqdXNlcnBnOworCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlkYXRhID0gcmN1X2RlcmVmZXJlbmNlKGNvdW50ZXItPmRhdGEpOworCWlmICghZGF0YSkKKwkJZ290byB1bmxvY2s7CisKKwl1c2VycGcgPSBkYXRhLT51c2VyX3BhZ2U7CisKKwkvKgorCSAqIERpc2FibGUgcHJlZW1wdGlvbiBzbyBhcyB0byBub3QgbGV0IHRoZSBjb3JyZXNwb25kaW5nIHVzZXItc3BhY2UKKwkgKiBzcGluIHRvbyBsb25nIGlmIHdlIGdldCBwcmVlbXB0ZWQuCisJICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJKyt1c2VycGctPmxvY2s7CisJYmFycmllcigpOworCXVzZXJwZy0+aW5kZXggPSBjb3VudGVyLT5ody5pZHg7CisJdXNlcnBnLT5vZmZzZXQgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyLT5jb3VudCk7CisJaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9BQ1RJVkUpCisJCXVzZXJwZy0+b2Zmc2V0IC09IGF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmh3LnByZXZfY291bnQpOworCisJYmFycmllcigpOworCSsrdXNlcnBnLT5sb2NrOworCXByZWVtcHRfZW5hYmxlKCk7Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9tbWFwX2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCWludCByZXQgPSBWTV9GQVVMVF9TSUdCVVM7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZGF0YSA9IHJjdV9kZXJlZmVyZW5jZShjb3VudGVyLT5kYXRhKTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKHZtZi0+cGdvZmYgPT0gMCkgeworCQl2bWYtPnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGF0YS0+dXNlcl9wYWdlKTsKKwl9IGVsc2UgeworCQlpbnQgbnIgPSB2bWYtPnBnb2ZmIC0gMTsKKworCQlpZiAoKHVuc2lnbmVkKW5yID4gZGF0YS0+bnJfcGFnZXMpCisJCQlnb3RvIHVubG9jazsKKworCQl2bWYtPnBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGF0YS0+ZGF0YV9wYWdlc1tucl0pOworCX0KKwlnZXRfcGFnZSh2bWYtPnBhZ2UpOworCXJldCA9IDA7Cit1bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBlcmZfbW1hcF9kYXRhX2FsbG9jKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIGludCBucl9wYWdlcykKK3sKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCBpOworCisJV0FSTl9PTihhdG9taWNfcmVhZCgmY291bnRlci0+bW1hcF9jb3VudCkpOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEpOworCXNpemUgKz0gbnJfcGFnZXMgKiBzaXplb2Yodm9pZCAqKTsKKworCWRhdGEgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJZ290byBmYWlsOworCisJZGF0YS0+dXNlcl9wYWdlID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhLT51c2VyX3BhZ2UpCisJCWdvdG8gZmFpbF91c2VyX3BhZ2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQlkYXRhLT5kYXRhX3BhZ2VzW2ldID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghZGF0YS0+ZGF0YV9wYWdlc1tpXSkKKwkJCWdvdG8gZmFpbF9kYXRhX3BhZ2VzOworCX0KKworCWRhdGEtPm5yX3BhZ2VzID0gbnJfcGFnZXM7CisJYXRvbWljX3NldCgmZGF0YS0+bG9jaywgLTEpOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKGNvdW50ZXItPmRhdGEsIGRhdGEpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfZGF0YV9wYWdlczoKKwlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLT5kYXRhX3BhZ2VzW2ldKTsKKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLT51c2VyX3BhZ2UpOworCitmYWlsX3VzZXJfcGFnZToKKwlrZnJlZShkYXRhKTsKKworZmFpbDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgX19wZXJmX21tYXBfZGF0YV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqcmN1X2hlYWQpCit7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCWludCBpOworCisJZGF0YSA9IGNvbnRhaW5lcl9vZihyY3VfaGVhZCwgc3RydWN0IHBlcmZfbW1hcF9kYXRhLCByY3VfaGVhZCk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YS0+dXNlcl9wYWdlKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+bnJfcGFnZXM7IGkrKykKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWRhdGEtPmRhdGFfcGFnZXNbaV0pOworCWtmcmVlKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX21tYXBfZGF0YV9mcmVlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhID0gY291bnRlci0+ZGF0YTsKKworCVdBUk5fT04oYXRvbWljX3JlYWQoJmNvdW50ZXItPm1tYXBfY291bnQpKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihjb3VudGVyLT5kYXRhLCBOVUxMKTsKKwljYWxsX3JjdSgmZGF0YS0+cmN1X2hlYWQsIF9fcGVyZl9tbWFwX2RhdGFfZnJlZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfbW1hcF9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKworCWF0b21pY19pbmMoJmNvdW50ZXItPm1tYXBfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX21tYXBfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJV0FSTl9PTl9PTkNFKGNvdW50ZXItPmN0eC0+cGFyZW50X2N0eCk7CisJaWYgKGF0b21pY19kZWNfYW5kX211dGV4X2xvY2soJmNvdW50ZXItPm1tYXBfY291bnQsICZjb3VudGVyLT5tbWFwX211dGV4KSkgeworCQlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXIgPSBjdXJyZW50X3VzZXIoKTsKKworCQlhdG9taWNfbG9uZ19zdWIoY291bnRlci0+ZGF0YS0+bnJfcGFnZXMgKyAxLCAmdXNlci0+bG9ja2VkX3ZtKTsKKwkJdm1hLT52bV9tbS0+bG9ja2VkX3ZtIC09IGNvdW50ZXItPmRhdGEtPm5yX2xvY2tlZDsKKwkJcGVyZl9tbWFwX2RhdGFfZnJlZShjb3VudGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZjb3VudGVyLT5tbWFwX211dGV4KTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgcGVyZl9tbWFwX3Ztb3BzID0geworCS5vcGVuICA9IHBlcmZfbW1hcF9vcGVuLAorCS5jbG9zZSA9IHBlcmZfbW1hcF9jbG9zZSwKKwkuZmF1bHQgPSBwZXJmX21tYXBfZmF1bHQsCit9OworCitzdGF0aWMgaW50IHBlcmZfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHVzZXJfbG9ja2VkLCB1c2VyX2xvY2tfbGltaXQ7CisJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyID0gY3VycmVudF91c2VyKCk7CisJdW5zaWduZWQgbG9uZyBsb2NrZWQsIGxvY2tfbGltaXQ7CisJdW5zaWduZWQgbG9uZyB2bWFfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOworCWxvbmcgdXNlcl9leHRyYSwgZXh0cmE7CisJaW50IHJldCA9IDA7CisKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSB8fCAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2bWFfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlucl9wYWdlcyA9ICh2bWFfc2l6ZSAvIFBBR0VfU0laRSkgLSAxOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGRhdGEgcGFnZXMgZW5zdXJlIHRoZXkncmUgYSBwb3dlci1vZi10d28gbnVtYmVyLCBzbyB3ZQorCSAqIGNhbiBkbyBiaXRtYXNrcyBpbnN0ZWFkIG9mIG1vZHVsby4KKwkgKi8KKwlpZiAobnJfcGFnZXMgIT0gMCAmJiAhaXNfcG93ZXJfb2ZfMihucl9wYWdlcykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZtYV9zaXplICE9IFBBR0VfU0laRSAqICgxICsgbnJfcGFnZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJV0FSTl9PTl9PTkNFKGNvdW50ZXItPmN0eC0+cGFyZW50X2N0eCk7CisJbXV0ZXhfbG9jaygmY291bnRlci0+bW1hcF9tdXRleCk7CisJaWYgKGF0b21pY19pbmNfbm90X3plcm8oJmNvdW50ZXItPm1tYXBfY291bnQpKSB7CisJCWlmIChucl9wYWdlcyAhPSBjb3VudGVyLT5kYXRhLT5ucl9wYWdlcykKKwkJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKworCXVzZXJfZXh0cmEgPSBucl9wYWdlcyArIDE7CisJdXNlcl9sb2NrX2xpbWl0ID0gc3lzY3RsX3BlcmZfY291bnRlcl9tbG9jayA+PiAoUEFHRV9TSElGVCAtIDEwKTsKKworCS8qCisJICogSW5jcmVhc2UgdGhlIGxpbWl0IGxpbmVhcmx5IHdpdGggbW9yZSBDUFVzOgorCSAqLworCXVzZXJfbG9ja19saW1pdCAqPSBudW1fb25saW5lX2NwdXMoKTsKKworCXVzZXJfbG9ja2VkID0gYXRvbWljX2xvbmdfcmVhZCgmdXNlci0+bG9ja2VkX3ZtKSArIHVzZXJfZXh0cmE7CisKKwlleHRyYSA9IDA7CisJaWYgKHVzZXJfbG9ja2VkID4gdXNlcl9sb2NrX2xpbWl0KQorCQlleHRyYSA9IHVzZXJfbG9ja2VkIC0gdXNlcl9sb2NrX2xpbWl0OworCisJbG9ja19saW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTUVNTE9DS10ucmxpbV9jdXI7CisJbG9ja19saW1pdCA+Pj0gUEFHRV9TSElGVDsKKwlsb2NrZWQgPSB2bWEtPnZtX21tLT5sb2NrZWRfdm0gKyBleHRyYTsKKworCWlmICgobG9ja2VkID4gbG9ja19saW1pdCkgJiYgIWNhcGFibGUoQ0FQX0lQQ19MT0NLKSkgeworCQlyZXQgPSAtRVBFUk07CisJCWdvdG8gdW5sb2NrOworCX0KKworCVdBUk5fT04oY291bnRlci0+ZGF0YSk7CisJcmV0ID0gcGVyZl9tbWFwX2RhdGFfYWxsb2MoY291bnRlciwgbnJfcGFnZXMpOworCWlmIChyZXQpCisJCWdvdG8gdW5sb2NrOworCisJYXRvbWljX3NldCgmY291bnRlci0+bW1hcF9jb3VudCwgMSk7CisJYXRvbWljX2xvbmdfYWRkKHVzZXJfZXh0cmEsICZ1c2VyLT5sb2NrZWRfdm0pOworCXZtYS0+dm1fbW0tPmxvY2tlZF92bSArPSBleHRyYTsKKwljb3VudGVyLT5kYXRhLT5ucl9sb2NrZWQgPSBleHRyYTsKK3VubG9jazoKKwltdXRleF91bmxvY2soJmNvdW50ZXItPm1tYXBfbXV0ZXgpOworCisJdm1hLT52bV9mbGFncyAmPSB+Vk1fTUFZV1JJVEU7CisJdm1hLT52bV9mbGFncyB8PSBWTV9SRVNFUlZFRDsKKwl2bWEtPnZtX29wcyA9ICZwZXJmX21tYXBfdm1vcHM7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBlcmZfZmFzeW5jKGludCBmZCwgc3RydWN0IGZpbGUgKmZpbHAsIGludCBvbikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXR2YWw7CisKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sICZjb3VudGVyLT5mYXN5bmMpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcGVyZl9mb3BzID0geworCS5yZWxlYXNlCQk9IHBlcmZfcmVsZWFzZSwKKwkucmVhZAkJCT0gcGVyZl9yZWFkLAorCS5wb2xsCQkJPSBwZXJmX3BvbGwsCisJLnVubG9ja2VkX2lvY3RsCQk9IHBlcmZfaW9jdGwsCisJLmNvbXBhdF9pb2N0bAkJPSBwZXJmX2lvY3RsLAorCS5tbWFwCQkJPSBwZXJmX21tYXAsCisJLmZhc3luYwkJCT0gcGVyZl9mYXN5bmMsCit9OworCisvKgorICogUGVyZiBjb3VudGVyIHdha2V1cAorICoKKyAqIElmIHRoZXJlJ3MgZGF0YSwgZW5zdXJlIHdlIHNldCB0aGUgcG9sbCgpIHN0YXRlIGFuZCBwdWJsaXNoIGV2ZXJ5dGhpbmcKKyAqIHRvIHVzZXItc3BhY2UgYmVmb3JlIHdha2luZyBldmVyeWJvZHkgdXAuCisgKi8KKwordm9pZCBwZXJmX2NvdW50ZXJfd2FrZXVwKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJd2FrZV91cF9hbGwoJmNvdW50ZXItPndhaXRxKTsKKworCWlmIChjb3VudGVyLT5wZW5kaW5nX2tpbGwpIHsKKwkJa2lsbF9mYXN5bmMoJmNvdW50ZXItPmZhc3luYywgU0lHSU8sIGNvdW50ZXItPnBlbmRpbmdfa2lsbCk7CisJCWNvdW50ZXItPnBlbmRpbmdfa2lsbCA9IDA7CisJfQorfQorCisvKgorICogUGVuZGluZyB3YWtldXBzCisgKgorICogSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gd2FrZXVwIHVwIGZyb20gTk1JIChvciBycS0+bG9jaykgY29udGV4dC4KKyAqCisgKiBUaGUgTk1JIGJpdCBtZWFucyB3ZSBjYW5ub3QgcG9zc2libHkgdGFrZSBsb2Nrcy4gVGhlcmVmb3JlLCBtYWludGFpbiBhCisgKiBzaW5nbGUgbGlua2VkIGxpc3QgYW5kIHVzZSBjbXB4Y2hnKCkgdG8gYWRkIGVudHJpZXMgbG9ja2xlc3MuCisgKi8KKworc3RhdGljIHZvaWQgcGVyZl9wZW5kaW5nX2NvdW50ZXIoc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGNvbnRhaW5lcl9vZihlbnRyeSwKKwkJCXN0cnVjdCBwZXJmX2NvdW50ZXIsIHBlbmRpbmcpOworCisJaWYgKGNvdW50ZXItPnBlbmRpbmdfZGlzYWJsZSkgeworCQljb3VudGVyLT5wZW5kaW5nX2Rpc2FibGUgPSAwOworCQlwZXJmX2NvdW50ZXJfZGlzYWJsZShjb3VudGVyKTsKKwl9CisKKwlpZiAoY291bnRlci0+cGVuZGluZ193YWtldXApIHsKKwkJY291bnRlci0+cGVuZGluZ193YWtldXAgPSAwOworCQlwZXJmX2NvdW50ZXJfd2FrZXVwKGNvdW50ZXIpOworCX0KK30KKworI2RlZmluZSBQRU5ESU5HX1RBSUwgKChzdHJ1Y3QgcGVyZl9wZW5kaW5nX2VudHJ5ICopLTFVTCkKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX3BlbmRpbmdfZW50cnkgKiwgcGVyZl9wZW5kaW5nX2hlYWQpID0geworCVBFTkRJTkdfVEFJTCwKK307CisKK3N0YXRpYyB2b2lkIHBlcmZfcGVuZGluZ19xdWV1ZShzdHJ1Y3QgcGVyZl9wZW5kaW5nX2VudHJ5ICplbnRyeSwKKwkJCSAgICAgICB2b2lkICgqZnVuYykoc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqKSkKK3sKKwlzdHJ1Y3QgcGVyZl9wZW5kaW5nX2VudHJ5ICoqaGVhZDsKKworCWlmIChjbXB4Y2hnKCZlbnRyeS0+bmV4dCwgTlVMTCwgUEVORElOR19UQUlMKSAhPSBOVUxMKQorCQlyZXR1cm47CisKKwllbnRyeS0+ZnVuYyA9IGZ1bmM7CisKKwloZWFkID0gJmdldF9jcHVfdmFyKHBlcmZfcGVuZGluZ19oZWFkKTsKKworCWRvIHsKKwkJZW50cnktPm5leHQgPSAqaGVhZDsKKwl9IHdoaWxlIChjbXB4Y2hnKGhlYWQsIGVudHJ5LT5uZXh0LCBlbnRyeSkgIT0gZW50cnktPm5leHQpOworCisJc2V0X3BlcmZfY291bnRlcl9wZW5kaW5nKCk7CisKKwlwdXRfY3B1X3ZhcihwZXJmX3BlbmRpbmdfaGVhZCk7Cit9CisKK3N0YXRpYyBpbnQgX19wZXJmX3BlbmRpbmdfcnVuKHZvaWQpCit7CisJc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqbGlzdDsKKwlpbnQgbnIgPSAwOworCisJbGlzdCA9IHhjaGcoJl9fZ2V0X2NwdV92YXIocGVyZl9wZW5kaW5nX2hlYWQpLCBQRU5ESU5HX1RBSUwpOworCXdoaWxlIChsaXN0ICE9IFBFTkRJTkdfVEFJTCkgeworCQl2b2lkICgqZnVuYykoc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqKTsKKwkJc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqZW50cnkgPSBsaXN0OworCisJCWxpc3QgPSBsaXN0LT5uZXh0OworCisJCWZ1bmMgPSBlbnRyeS0+ZnVuYzsKKwkJZW50cnktPm5leHQgPSBOVUxMOworCQkvKgorCQkgKiBFbnN1cmUgd2Ugb2JzZXJ2ZSB0aGUgdW5xdWV1ZSBiZWZvcmUgd2UgaXNzdWUgdGhlIHdha2V1cCwKKwkJICogc28gdGhhdCB3ZSB3b24ndCBiZSB3YWl0aW5nIGZvcmV2ZXIuCisJCSAqIC0tIHNlZSBwZXJmX25vdF9wZW5kaW5nKCkuCisJCSAqLworCQlzbXBfd21iKCk7CisKKwkJZnVuYyhlbnRyeSk7CisJCW5yKys7CisJfQorCisJcmV0dXJuIG5yOworfQorCitzdGF0aWMgaW5saW5lIGludCBwZXJmX25vdF9wZW5kaW5nKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJLyoKKwkgKiBJZiB3ZSBmbHVzaCBvbiB3aGF0ZXZlciBjcHUgd2UgcnVuLCB0aGVyZSBpcyBhIGNoYW5jZSB3ZSBkb24ndAorCSAqIG5lZWQgdG8gd2FpdC4KKwkgKi8KKwlnZXRfY3B1KCk7CisJX19wZXJmX3BlbmRpbmdfcnVuKCk7CisJcHV0X2NwdSgpOworCisJLyoKKwkgKiBFbnN1cmUgd2Ugc2VlIHRoZSBwcm9wZXIgcXVldWUgc3RhdGUgYmVmb3JlIGdvaW5nIHRvIHNsZWVwCisJICogc28gdGhhdCB3ZSBkbyBub3QgbWlzcyB0aGUgd2FrZXVwLiAtLSBzZWUgcGVyZl9wZW5kaW5nX2hhbmRsZSgpCisJICovCisJc21wX3JtYigpOworCXJldHVybiBjb3VudGVyLT5wZW5kaW5nLm5leHQgPT0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcGVyZl9wZW5kaW5nX3N5bmMoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwl3YWl0X2V2ZW50KGNvdW50ZXItPndhaXRxLCBwZXJmX25vdF9wZW5kaW5nKGNvdW50ZXIpKTsKK30KKwordm9pZCBwZXJmX2NvdW50ZXJfZG9fcGVuZGluZyh2b2lkKQoreworCV9fcGVyZl9wZW5kaW5nX3J1bigpOworfQorCisvKgorICogQ2FsbGNoYWluIHN1cHBvcnQgLS0gYXJjaCBzcGVjaWZpYworICovCisKK19fd2VhayBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKnBlcmZfY2FsbGNoYWluKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXJldHVybiBOVUxMOworfQorCisvKgorICogT3V0cHV0CisgKi8KKworc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSB7CisJc3RydWN0IHBlcmZfY291bnRlcgkqY291bnRlcjsKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEJKmRhdGE7CisJdW5zaWduZWQgbG9uZwkJaGVhZDsKKwl1bnNpZ25lZCBsb25nCQlvZmZzZXQ7CisJaW50CQkJbm1pOworCWludAkJCW92ZXJmbG93OworCWludAkJCWxvY2tlZDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKK307CisKK3N0YXRpYyB2b2lkIHBlcmZfb3V0cHV0X3dha2V1cChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCit7CisJYXRvbWljX3NldCgmaGFuZGxlLT5kYXRhLT5wb2xsLCBQT0xMX0lOKTsKKworCWlmIChoYW5kbGUtPm5taSkgeworCQloYW5kbGUtPmNvdW50ZXItPnBlbmRpbmdfd2FrZXVwID0gMTsKKwkJcGVyZl9wZW5kaW5nX3F1ZXVlKCZoYW5kbGUtPmNvdW50ZXItPnBlbmRpbmcsCisJCQkJICAgcGVyZl9wZW5kaW5nX2NvdW50ZXIpOworCX0gZWxzZQorCQlwZXJmX2NvdW50ZXJfd2FrZXVwKGhhbmRsZS0+Y291bnRlcik7Cit9CisKKy8qCisgKiBDdXJpb3VzIGxvY2tpbmcgY29uc3RydWN0LgorICoKKyAqIFdlIG5lZWQgdG8gZW5zdXJlIGEgbGF0ZXIgZXZlbnQgZG9lc24ndCBwdWJsaXNoIGEgaGVhZCB3aGVuIGEgZm9ybWVyCisgKiBldmVudCBpc24ndCBkb25lIHdyaXRpbmcuIEhvd2V2ZXIgc2luY2Ugd2UgbmVlZCB0byBkZWFsIHdpdGggTk1JcyB3ZQorICogY2Fubm90IGZ1bGx5IHNlcmlhbGl6ZSB0aGluZ3MuCisgKgorICogV2hhdCB3ZSBkbyBpcyBzZXJpYWxpemUgYmV0d2VlbiBDUFVzIHNvIHdlIG9ubHkgaGF2ZSB0byBkZWFsIHdpdGggTk1JCisgKiBuZXN0aW5nIG9uIGEgc2luZ2xlIENQVS4KKyAqCisgKiBXZSBvbmx5IHB1Ymxpc2ggdGhlIGhlYWQgKGFuZCBnZW5lcmF0ZSBhIHdha2V1cCkgd2hlbiB0aGUgb3V0ZXItbW9zdAorICogZXZlbnQgY29tcGxldGVzLgorICovCitzdGF0aWMgdm9pZCBwZXJmX291dHB1dF9sb2NrKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEgPSBoYW5kbGUtPmRhdGE7CisJaW50IGNwdTsKKworCWhhbmRsZS0+bG9ja2VkID0gMDsKKworCWxvY2FsX2lycV9zYXZlKGhhbmRsZS0+ZmxhZ3MpOworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmIChpbl9ubWkoKSAmJiBhdG9taWNfcmVhZCgmZGF0YS0+bG9jaykgPT0gY3B1KQorCQlyZXR1cm47CisKKwl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJmRhdGEtPmxvY2ssIC0xLCBjcHUpICE9IC0xKQorCQljcHVfcmVsYXgoKTsKKworCWhhbmRsZS0+bG9ja2VkID0gMTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9vdXRwdXRfdW5sb2NrKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEgPSBoYW5kbGUtPmRhdGE7CisJdW5zaWduZWQgbG9uZyBoZWFkOworCWludCBjcHU7CisKKwlkYXRhLT5kb25lX2hlYWQgPSBkYXRhLT5oZWFkOworCisJaWYgKCFoYW5kbGUtPmxvY2tlZCkKKwkJZ290byBvdXQ7CisKK2FnYWluOgorCS8qCisJICogVGhlIHhjaGcgaW1wbGllcyBhIGZ1bGwgYmFycmllciB0aGF0IGVuc3VyZXMgYWxsIHdyaXRlcyBhcmUgZG9uZQorCSAqIGJlZm9yZSB3ZSBwdWJsaXNoIHRoZSBuZXcgaGVhZCwgbWF0Y2hlZCBieSBhIHJtYigpIGluIHVzZXJzcGFjZSB3aGVuCisJICogcmVhZGluZyB0aGlzIHBvc2l0aW9uLgorCSAqLworCXdoaWxlICgoaGVhZCA9IGF0b21pY19sb25nX3hjaGcoJmRhdGEtPmRvbmVfaGVhZCwgMCkpKQorCQlkYXRhLT51c2VyX3BhZ2UtPmRhdGFfaGVhZCA9IGhlYWQ7CisKKwkvKgorCSAqIE5NSSBjYW4gaGFwcGVuIGhlcmUsIHdoaWNoIG1lYW5zIHdlIGNhbiBtaXNzIGEgZG9uZV9oZWFkIHVwZGF0ZS4KKwkgKi8KKworCWNwdSA9IGF0b21pY194Y2hnKCZkYXRhLT5sb2NrLCAtMSk7CisJV0FSTl9PTl9PTkNFKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJLyoKKwkgKiBUaGVyZWZvcmUgd2UgaGF2ZSB0byB2YWxpZGF0ZSB3ZSBkaWQgbm90IGluZGVlZCBkbyBzby4KKwkgKi8KKwlpZiAodW5saWtlbHkoYXRvbWljX2xvbmdfcmVhZCgmZGF0YS0+ZG9uZV9oZWFkKSkpIHsKKwkJLyoKKwkJICogU2luY2Ugd2UgaGFkIGl0IGxvY2tlZCwgd2UgY2FuIGxvY2sgaXQgYWdhaW4uCisJCSAqLworCQl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJmRhdGEtPmxvY2ssIC0xLCBjcHUpICE9IC0xKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAoYXRvbWljX3hjaGcoJmRhdGEtPndha2V1cCwgMCkpCisJCXBlcmZfb3V0cHV0X3dha2V1cChoYW5kbGUpOworb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGhhbmRsZS0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHBlcmZfb3V0cHV0X2JlZ2luKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgdW5zaWduZWQgaW50IHNpemUsCisJCQkgICAgIGludCBubWksIGludCBvdmVyZmxvdykKK3sKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgaW50IG9mZnNldCwgaGVhZDsKKworCS8qCisJICogRm9yIGluaGVyaXRlZCBjb3VudGVycyB3ZSBzZW5kIGFsbCB0aGUgb3V0cHV0IHRvd2FyZHMgdGhlIHBhcmVudC4KKwkgKi8KKwlpZiAoY291bnRlci0+cGFyZW50KQorCQljb3VudGVyID0gY291bnRlci0+cGFyZW50OworCisJcmN1X3JlYWRfbG9jaygpOworCWRhdGEgPSByY3VfZGVyZWZlcmVuY2UoY291bnRlci0+ZGF0YSk7CisJaWYgKCFkYXRhKQorCQlnb3RvIG91dDsKKworCWhhbmRsZS0+ZGF0YQkgPSBkYXRhOworCWhhbmRsZS0+Y291bnRlcgkgPSBjb3VudGVyOworCWhhbmRsZS0+bm1pCSA9IG5taTsKKwloYW5kbGUtPm92ZXJmbG93ID0gb3ZlcmZsb3c7CisKKwlpZiAoIWRhdGEtPm5yX3BhZ2VzKQorCQlnb3RvIGZhaWw7CisKKwlwZXJmX291dHB1dF9sb2NrKGhhbmRsZSk7CisKKwlkbyB7CisJCW9mZnNldCA9IGhlYWQgPSBhdG9taWNfbG9uZ19yZWFkKCZkYXRhLT5oZWFkKTsKKwkJaGVhZCArPSBzaXplOworCX0gd2hpbGUgKGF0b21pY19sb25nX2NtcHhjaGcoJmRhdGEtPmhlYWQsIG9mZnNldCwgaGVhZCkgIT0gb2Zmc2V0KTsKKworCWhhbmRsZS0+b2Zmc2V0CT0gb2Zmc2V0OworCWhhbmRsZS0+aGVhZAk9IGhlYWQ7CisKKwlpZiAoKG9mZnNldCA+PiBQQUdFX1NISUZUKSAhPSAoaGVhZCA+PiBQQUdFX1NISUZUKSkKKwkJYXRvbWljX3NldCgmZGF0YS0+d2FrZXVwLCAxKTsKKworCXJldHVybiAwOworCitmYWlsOgorCXBlcmZfb3V0cHV0X3dha2V1cChoYW5kbGUpOworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfb3V0cHV0X2NvcHkoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlLAorCQkJICAgICBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IHBhZ2VzX21hc2s7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl2b2lkICoqcGFnZXM7CisKKwlvZmZzZXQJCT0gaGFuZGxlLT5vZmZzZXQ7CisJcGFnZXNfbWFzawk9IGhhbmRsZS0+ZGF0YS0+bnJfcGFnZXMgLSAxOworCXBhZ2VzCQk9IGhhbmRsZS0+ZGF0YS0+ZGF0YV9wYWdlczsKKworCWRvIHsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfb2Zmc2V0OworCQlpbnQgbnI7CisKKwkJbnIJICAgID0gKG9mZnNldCA+PiBQQUdFX1NISUZUKSAmIHBhZ2VzX21hc2s7CisJCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgKFBBR0VfU0laRSAtIDEpOworCQlzaXplCSAgICA9IG1pbl90KHVuc2lnbmVkIGludCwgUEFHRV9TSVpFIC0gcGFnZV9vZmZzZXQsIGxlbik7CisKKwkJbWVtY3B5KHBhZ2VzW25yXSArIHBhZ2Vfb2Zmc2V0LCBidWYsIHNpemUpOworCisJCWxlbgkgICAgLT0gc2l6ZTsKKwkJYnVmCSAgICArPSBzaXplOworCQlvZmZzZXQJICAgICs9IHNpemU7CisJfSB3aGlsZSAobGVuKTsKKworCWhhbmRsZS0+b2Zmc2V0ID0gb2Zmc2V0OworCisJLyoKKwkgKiBDaGVjayB3ZSBkaWRuJ3QgY29weSBwYXN0IG91ciByZXNlcnZhdGlvbiB3aW5kb3csIHRha2luZyB0aGUKKwkgKiBwb3NzaWJsZSB1bnNpZ25lZCBpbnQgd3JhcCBpbnRvIGFjY291bnQuCisJICovCisJV0FSTl9PTl9PTkNFKCgobG9uZykoaGFuZGxlLT5oZWFkIC0gaGFuZGxlLT5vZmZzZXQpKSA8IDApOworfQorCisjZGVmaW5lIHBlcmZfb3V0cHV0X3B1dChoYW5kbGUsIHgpIFwKKwlwZXJmX291dHB1dF9jb3B5KChoYW5kbGUpLCAmKHgpLCBzaXplb2YoeCkpCisKK3N0YXRpYyB2b2lkIHBlcmZfb3V0cHV0X2VuZChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGhhbmRsZS0+Y291bnRlcjsKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGEgPSBoYW5kbGUtPmRhdGE7CisKKwlpbnQgd2FrZXVwX2V2ZW50cyA9IGNvdW50ZXItPmF0dHIud2FrZXVwX2V2ZW50czsKKworCWlmIChoYW5kbGUtPm92ZXJmbG93ICYmIHdha2V1cF9ldmVudHMpIHsKKwkJaW50IGV2ZW50cyA9IGF0b21pY19pbmNfcmV0dXJuKCZkYXRhLT5ldmVudHMpOworCQlpZiAoZXZlbnRzID49IHdha2V1cF9ldmVudHMpIHsKKwkJCWF0b21pY19zdWIod2FrZXVwX2V2ZW50cywgJmRhdGEtPmV2ZW50cyk7CisJCQlhdG9taWNfc2V0KCZkYXRhLT53YWtldXAsIDEpOworCQl9CisJfQorCisJcGVyZl9vdXRwdXRfdW5sb2NrKGhhbmRsZSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB1MzIgcGVyZl9jb3VudGVyX3BpZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJLyoKKwkgKiBvbmx5IHRvcCBsZXZlbCBjb3VudGVycyBoYXZlIHRoZSBwaWQgbmFtZXNwYWNlIHRoZXkgd2VyZSBjcmVhdGVkIGluCisJICovCisJaWYgKGNvdW50ZXItPnBhcmVudCkKKwkJY291bnRlciA9IGNvdW50ZXItPnBhcmVudDsKKworCXJldHVybiB0YXNrX3RnaWRfbnJfbnMocCwgY291bnRlci0+bnMpOworfQorCitzdGF0aWMgdTMyIHBlcmZfY291bnRlcl90aWQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCS8qCisJICogb25seSB0b3AgbGV2ZWwgY291bnRlcnMgaGF2ZSB0aGUgcGlkIG5hbWVzcGFjZSB0aGV5IHdlcmUgY3JlYXRlZCBpbgorCSAqLworCWlmIChjb3VudGVyLT5wYXJlbnQpCisJCWNvdW50ZXIgPSBjb3VudGVyLT5wYXJlbnQ7CisKKwlyZXR1cm4gdGFza19waWRfbnJfbnMocCwgY291bnRlci0+bnMpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfb3V0cHV0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIGludCBubWksCisJCQkJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEpCit7CisJaW50IHJldDsKKwl1NjQgc2FtcGxlX3R5cGUgPSBjb3VudGVyLT5hdHRyLnNhbXBsZV90eXBlOworCXN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJdTY0IGlwOworCXN0cnVjdCB7CisJCXUzMiBwaWQsIHRpZDsKKwl9IHRpZF9lbnRyeTsKKwlzdHJ1Y3QgeworCQl1NjQgaWQ7CisJCXU2NCBjb3VudGVyOworCX0gZ3JvdXBfZW50cnk7CisJc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICpjYWxsY2hhaW4gPSBOVUxMOworCWludCBjYWxsY2hhaW5fc2l6ZSA9IDA7CisJdTY0IHRpbWU7CisJc3RydWN0IHsKKwkJdTMyIGNwdSwgcmVzZXJ2ZWQ7CisJfSBjcHVfZW50cnk7CisKKwloZWFkZXIudHlwZSA9IDA7CisJaGVhZGVyLnNpemUgPSBzaXplb2YoaGVhZGVyKTsKKworCWhlYWRlci5taXNjID0gUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XOworCWhlYWRlci5taXNjIHw9IHBlcmZfbWlzY19mbGFncyhkYXRhLT5yZWdzKTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0lQKSB7CisJCWlwID0gcGVyZl9pbnN0cnVjdGlvbl9wb2ludGVyKGRhdGEtPnJlZ3MpOworCQloZWFkZXIudHlwZSB8PSBQRVJGX1NBTVBMRV9JUDsKKwkJaGVhZGVyLnNpemUgKz0gc2l6ZW9mKGlwKTsKKwl9CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9USUQpIHsKKwkJLyogbmFtZXNwYWNlIGlzc3VlcyAqLworCQl0aWRfZW50cnkucGlkID0gcGVyZl9jb3VudGVyX3BpZChjb3VudGVyLCBjdXJyZW50KTsKKwkJdGlkX2VudHJ5LnRpZCA9IHBlcmZfY291bnRlcl90aWQoY291bnRlciwgY3VycmVudCk7CisKKwkJaGVhZGVyLnR5cGUgfD0gUEVSRl9TQU1QTEVfVElEOworCQloZWFkZXIuc2l6ZSArPSBzaXplb2YodGlkX2VudHJ5KTsKKwl9CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9USU1FKSB7CisJCS8qCisJCSAqIE1heWJlIGRvIGJldHRlciBvbiB4ODYgYW5kIHByb3ZpZGUgY3B1X2Nsb2NrX25taSgpCisJCSAqLworCQl0aW1lID0gc2NoZWRfY2xvY2soKTsKKworCQloZWFkZXIudHlwZSB8PSBQRVJGX1NBTVBMRV9USU1FOworCQloZWFkZXIuc2l6ZSArPSBzaXplb2YodTY0KTsKKwl9CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9BRERSKSB7CisJCWhlYWRlci50eXBlIHw9IFBFUkZfU0FNUExFX0FERFI7CisJCWhlYWRlci5zaXplICs9IHNpemVvZih1NjQpOworCX0KKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0lEKSB7CisJCWhlYWRlci50eXBlIHw9IFBFUkZfU0FNUExFX0lEOworCQloZWFkZXIuc2l6ZSArPSBzaXplb2YodTY0KTsKKwl9CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9DUFUpIHsKKwkJaGVhZGVyLnR5cGUgfD0gUEVSRl9TQU1QTEVfQ1BVOworCQloZWFkZXIuc2l6ZSArPSBzaXplb2YoY3B1X2VudHJ5KTsKKworCQljcHVfZW50cnkuY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwl9CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9QRVJJT0QpIHsKKwkJaGVhZGVyLnR5cGUgfD0gUEVSRl9TQU1QTEVfUEVSSU9EOworCQloZWFkZXIuc2l6ZSArPSBzaXplb2YodTY0KTsKKwl9CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9HUk9VUCkgeworCQloZWFkZXIudHlwZSB8PSBQRVJGX1NBTVBMRV9HUk9VUDsKKwkJaGVhZGVyLnNpemUgKz0gc2l6ZW9mKHU2NCkgKworCQkJY291bnRlci0+bnJfc2libGluZ3MgKiBzaXplb2YoZ3JvdXBfZW50cnkpOworCX0KKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NBTExDSEFJTikgeworCQljYWxsY2hhaW4gPSBwZXJmX2NhbGxjaGFpbihkYXRhLT5yZWdzKTsKKworCQlpZiAoY2FsbGNoYWluKSB7CisJCQljYWxsY2hhaW5fc2l6ZSA9ICgxICsgY2FsbGNoYWluLT5ucikgKiBzaXplb2YodTY0KTsKKworCQkJaGVhZGVyLnR5cGUgfD0gUEVSRl9TQU1QTEVfQ0FMTENIQUlOOworCQkJaGVhZGVyLnNpemUgKz0gY2FsbGNoYWluX3NpemU7CisJCX0KKwl9CisKKwlyZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBjb3VudGVyLCBoZWFkZXIuc2l6ZSwgbm1pLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgaGVhZGVyKTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0lQKQorCQlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgaXApOworCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElEKQorCQlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgdGlkX2VudHJ5KTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJTUUpCisJCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCB0aW1lKTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0FERFIpCisJCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCBkYXRhLT5hZGRyKTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0lEKQorCQlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgY291bnRlci0+aWQpOworCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ1BVKQorCQlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgY3B1X2VudHJ5KTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkKKwkJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIGRhdGEtPnBlcmlvZCk7CisKKwkvKgorCSAqIFhYWCBQRVJGX1NBTVBMRV9HUk9VUCB2cyBpbmhlcml0ZWQgY291bnRlcnMgc2VlbXMgZGlmZmljdWx0LgorCSAqLworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0dST1VQKSB7CisJCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmxlYWRlciwgKnN1YjsKKwkJdTY0IG5yID0gY291bnRlci0+bnJfc2libGluZ3M7CisKKwkJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIG5yKTsKKworCQlsZWFkZXIgPSBjb3VudGVyLT5ncm91cF9sZWFkZXI7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ViLCAmbGVhZGVyLT5zaWJsaW5nX2xpc3QsIGxpc3RfZW50cnkpIHsKKwkJCWlmIChzdWIgIT0gY291bnRlcikKKwkJCQlzdWItPnBtdS0+cmVhZChzdWIpOworCisJCQlncm91cF9lbnRyeS5pZCA9IHN1Yi0+aWQ7CisJCQlncm91cF9lbnRyeS5jb3VudGVyID0gYXRvbWljNjRfcmVhZCgmc3ViLT5jb3VudCk7CisKKwkJCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCBncm91cF9lbnRyeSk7CisJCX0KKwl9CisKKwlpZiAoY2FsbGNoYWluKQorCQlwZXJmX291dHB1dF9jb3B5KCZoYW5kbGUsIGNhbGxjaGFpbiwgY2FsbGNoYWluX3NpemUpOworCisJcGVyZl9vdXRwdXRfZW5kKCZoYW5kbGUpOworfQorCisvKgorICogZm9yayB0cmFja2luZworICovCisKK3N0cnVjdCBwZXJmX2ZvcmtfZXZlbnQgeworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisKKwkJdTMyCQkJCXBpZDsKKwkJdTMyCQkJCXBwaWQ7CisJfSBldmVudDsKK307CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9mb3JrX291dHB1dChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJCSAgICAgc3RydWN0IHBlcmZfZm9ya19ldmVudCAqZm9ya19ldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlIGhhbmRsZTsKKwlpbnQgc2l6ZSA9IGZvcmtfZXZlbnQtPmV2ZW50LmhlYWRlci5zaXplOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGZvcmtfZXZlbnQtPnRhc2s7CisJaW50IHJldCA9IHBlcmZfb3V0cHV0X2JlZ2luKCZoYW5kbGUsIGNvdW50ZXIsIHNpemUsIDAsIDApOworCisJaWYgKHJldCkKKwkJcmV0dXJuOworCisJZm9ya19ldmVudC0+ZXZlbnQucGlkID0gcGVyZl9jb3VudGVyX3BpZChjb3VudGVyLCB0YXNrKTsKKwlmb3JrX2V2ZW50LT5ldmVudC5wcGlkID0gcGVyZl9jb3VudGVyX3BpZChjb3VudGVyLCB0YXNrLT5yZWFsX3BhcmVudCk7CisKKwlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgZm9ya19ldmVudC0+ZXZlbnQpOworCXBlcmZfb3V0cHV0X2VuZCgmaGFuZGxlKTsKK30KKworc3RhdGljIGludCBwZXJmX2NvdW50ZXJfZm9ya19tYXRjaChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWlmIChjb3VudGVyLT5hdHRyLmNvbW0gfHwgY291bnRlci0+YXR0ci5tbWFwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfZm9ya19jdHgoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsCisJCQkJICBzdHJ1Y3QgcGVyZl9mb3JrX2V2ZW50ICpmb3JrX2V2ZW50KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisKKwlpZiAoc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SVU5OSU5HIHx8IGxpc3RfZW1wdHkoJmN0eC0+ZXZlbnRfbGlzdCkpCisJCXJldHVybjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjb3VudGVyLCAmY3R4LT5ldmVudF9saXN0LCBldmVudF9lbnRyeSkgeworCQlpZiAocGVyZl9jb3VudGVyX2ZvcmtfbWF0Y2goY291bnRlcikpCisJCQlwZXJmX2NvdW50ZXJfZm9ya19vdXRwdXQoY291bnRlciwgZm9ya19ldmVudCk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfZm9ya19ldmVudChzdHJ1Y3QgcGVyZl9mb3JrX2V2ZW50ICpmb3JrX2V2ZW50KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHg7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisKKwljcHVjdHggPSAmZ2V0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisJcGVyZl9jb3VudGVyX2ZvcmtfY3R4KCZjcHVjdHgtPmN0eCwgZm9ya19ldmVudCk7CisJcHV0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJLyoKKwkgKiBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hpY2ggb2YgdGhlIGNoaWxkIGNvbnRleHRzIHRoZQorCSAqIGV2ZW50cyBlbmRzIHVwIGluLgorCSAqLworCWN0eCA9IHJjdV9kZXJlZmVyZW5jZShjdXJyZW50LT5wZXJmX2NvdW50ZXJfY3R4cCk7CisJaWYgKGN0eCkKKwkJcGVyZl9jb3VudGVyX2ZvcmtfY3R4KGN0eCwgZm9ya19ldmVudCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3ZvaWQgcGVyZl9jb3VudGVyX2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCBwZXJmX2ZvcmtfZXZlbnQgZm9ya19ldmVudDsKKworCWlmICghYXRvbWljX3JlYWQoJm5yX2NvbW1fY291bnRlcnMpICYmCisJICAgICFhdG9taWNfcmVhZCgmbnJfbW1hcF9jb3VudGVycykpCisJCXJldHVybjsKKworCWZvcmtfZXZlbnQgPSAoc3RydWN0IHBlcmZfZm9ya19ldmVudCl7CisJCS50YXNrCT0gdGFzaywKKwkJLmV2ZW50ICA9IHsKKwkJCS5oZWFkZXIgPSB7CisJCQkJLnR5cGUgPSBQRVJGX0VWRU5UX0ZPUkssCisJCQkJLnNpemUgPSBzaXplb2YoZm9ya19ldmVudC5ldmVudCksCisJCQl9LAorCQl9LAorCX07CisKKwlwZXJmX2NvdW50ZXJfZm9ya19ldmVudCgmZm9ya19ldmVudCk7Cit9CisKKy8qCisgKiBjb21tIHRyYWNraW5nCisgKi8KKworc3RydWN0IHBlcmZfY29tbV9ldmVudCB7CisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworCWNoYXIJCQkqY29tbTsKKwlpbnQJCQljb21tX3NpemU7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCisJCXUzMgkJCQlwaWQ7CisJCXUzMgkJCQl0aWQ7CisJfSBldmVudDsKK307CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9jb21tX291dHB1dChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJCSAgICAgc3RydWN0IHBlcmZfY29tbV9ldmVudCAqY29tbV9ldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlIGhhbmRsZTsKKwlpbnQgc2l6ZSA9IGNvbW1fZXZlbnQtPmV2ZW50LmhlYWRlci5zaXplOworCWludCByZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBjb3VudGVyLCBzaXplLCAwLCAwKTsKKworCWlmIChyZXQpCisJCXJldHVybjsKKworCWNvbW1fZXZlbnQtPmV2ZW50LnBpZCA9IHBlcmZfY291bnRlcl9waWQoY291bnRlciwgY29tbV9ldmVudC0+dGFzayk7CisJY29tbV9ldmVudC0+ZXZlbnQudGlkID0gcGVyZl9jb3VudGVyX3RpZChjb3VudGVyLCBjb21tX2V2ZW50LT50YXNrKTsKKworCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCBjb21tX2V2ZW50LT5ldmVudCk7CisJcGVyZl9vdXRwdXRfY29weSgmaGFuZGxlLCBjb21tX2V2ZW50LT5jb21tLAorCQkJCSAgIGNvbW1fZXZlbnQtPmNvbW1fc2l6ZSk7CisJcGVyZl9vdXRwdXRfZW5kKCZoYW5kbGUpOworfQorCitzdGF0aWMgaW50IHBlcmZfY291bnRlcl9jb21tX21hdGNoKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJaWYgKGNvdW50ZXItPmF0dHIuY29tbSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2NvbW1fY3R4KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LAorCQkJCSAgc3RydWN0IHBlcmZfY29tbV9ldmVudCAqY29tbV9ldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJaWYgKHN5c3RlbV9zdGF0ZSAhPSBTWVNURU1fUlVOTklORyB8fCBsaXN0X2VtcHR5KCZjdHgtPmV2ZW50X2xpc3QpKQorCQlyZXR1cm47CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY291bnRlciwgJmN0eC0+ZXZlbnRfbGlzdCwgZXZlbnRfZW50cnkpIHsKKwkJaWYgKHBlcmZfY291bnRlcl9jb21tX21hdGNoKGNvdW50ZXIpKQorCQkJcGVyZl9jb3VudGVyX2NvbW1fb3V0cHV0KGNvdW50ZXIsIGNvbW1fZXZlbnQpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2NvbW1fZXZlbnQoc3RydWN0IHBlcmZfY29tbV9ldmVudCAqY29tbV9ldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4OworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4OworCXVuc2lnbmVkIGludCBzaXplOworCWNoYXIgKmNvbW0gPSBjb21tX2V2ZW50LT50YXNrLT5jb21tOworCisJc2l6ZSA9IEFMSUdOKHN0cmxlbihjb21tKSsxLCBzaXplb2YodTY0KSk7CisKKwljb21tX2V2ZW50LT5jb21tID0gY29tbTsKKwljb21tX2V2ZW50LT5jb21tX3NpemUgPSBzaXplOworCisJY29tbV9ldmVudC0+ZXZlbnQuaGVhZGVyLnNpemUgPSBzaXplb2YoY29tbV9ldmVudC0+ZXZlbnQpICsgc2l6ZTsKKworCWNwdWN0eCA9ICZnZXRfY3B1X3ZhcihwZXJmX2NwdV9jb250ZXh0KTsKKwlwZXJmX2NvdW50ZXJfY29tbV9jdHgoJmNwdWN0eC0+Y3R4LCBjb21tX2V2ZW50KTsKKwlwdXRfY3B1X3ZhcihwZXJmX2NwdV9jb250ZXh0KTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwkvKgorCSAqIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciB3aGljaCBvZiB0aGUgY2hpbGQgY29udGV4dHMgdGhlCisJICogZXZlbnRzIGVuZHMgdXAgaW4uCisJICovCisJY3R4ID0gcmN1X2RlcmVmZXJlbmNlKGN1cnJlbnQtPnBlcmZfY291bnRlcl9jdHhwKTsKKwlpZiAoY3R4KQorCQlwZXJmX2NvdW50ZXJfY29tbV9jdHgoY3R4LCBjb21tX2V2ZW50KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKwordm9pZCBwZXJmX2NvdW50ZXJfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHBlcmZfY29tbV9ldmVudCBjb21tX2V2ZW50OworCisJaWYgKCFhdG9taWNfcmVhZCgmbnJfY29tbV9jb3VudGVycykpCisJCXJldHVybjsKKworCWNvbW1fZXZlbnQgPSAoc3RydWN0IHBlcmZfY29tbV9ldmVudCl7CisJCS50YXNrCT0gdGFzaywKKwkJLmV2ZW50ICA9IHsKKwkJCS5oZWFkZXIgPSB7IC50eXBlID0gUEVSRl9FVkVOVF9DT01NLCB9LAorCQl9LAorCX07CisKKwlwZXJmX2NvdW50ZXJfY29tbV9ldmVudCgmY29tbV9ldmVudCk7Cit9CisKKy8qCisgKiBtbWFwIHRyYWNraW5nCisgKi8KKworc3RydWN0IHBlcmZfbW1hcF9ldmVudCB7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0CSp2bWE7CisKKwljb25zdCBjaGFyCQkqZmlsZV9uYW1lOworCWludAkJCWZpbGVfc2l6ZTsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisKKwkJdTMyCQkJCXBpZDsKKwkJdTMyCQkJCXRpZDsKKwkJdTY0CQkJCXN0YXJ0OworCQl1NjQJCQkJbGVuOworCQl1NjQJCQkJcGdvZmY7CisJfSBldmVudDsKK307CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9tbWFwX291dHB1dChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJCSAgICAgc3RydWN0IHBlcmZfbW1hcF9ldmVudCAqbW1hcF9ldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlIGhhbmRsZTsKKwlpbnQgc2l6ZSA9IG1tYXBfZXZlbnQtPmV2ZW50LmhlYWRlci5zaXplOworCWludCByZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBjb3VudGVyLCBzaXplLCAwLCAwKTsKKworCWlmIChyZXQpCisJCXJldHVybjsKKworCW1tYXBfZXZlbnQtPmV2ZW50LnBpZCA9IHBlcmZfY291bnRlcl9waWQoY291bnRlciwgY3VycmVudCk7CisJbW1hcF9ldmVudC0+ZXZlbnQudGlkID0gcGVyZl9jb3VudGVyX3RpZChjb3VudGVyLCBjdXJyZW50KTsKKworCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCBtbWFwX2V2ZW50LT5ldmVudCk7CisJcGVyZl9vdXRwdXRfY29weSgmaGFuZGxlLCBtbWFwX2V2ZW50LT5maWxlX25hbWUsCisJCQkJICAgbW1hcF9ldmVudC0+ZmlsZV9zaXplKTsKKwlwZXJmX291dHB1dF9lbmQoJmhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9jb3VudGVyX21tYXBfbWF0Y2goc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9tbWFwX2V2ZW50ICptbWFwX2V2ZW50KQoreworCWlmIChjb3VudGVyLT5hdHRyLm1tYXApCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9tbWFwX2N0eChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCwKKwkJCQkgIHN0cnVjdCBwZXJmX21tYXBfZXZlbnQgKm1tYXBfZXZlbnQpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCWlmIChzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX1JVTk5JTkcgfHwgbGlzdF9lbXB0eSgmY3R4LT5ldmVudF9saXN0KSkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvdW50ZXIsICZjdHgtPmV2ZW50X2xpc3QsIGV2ZW50X2VudHJ5KSB7CisJCWlmIChwZXJmX2NvdW50ZXJfbW1hcF9tYXRjaChjb3VudGVyLCBtbWFwX2V2ZW50KSkKKwkJCXBlcmZfY291bnRlcl9tbWFwX291dHB1dChjb3VudGVyLCBtbWFwX2V2ZW50KTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9tbWFwX2V2ZW50KHN0cnVjdCBwZXJmX21tYXBfZXZlbnQgKm1tYXBfZXZlbnQpCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IG1tYXBfZXZlbnQtPnZtYTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IHZtYS0+dm1fZmlsZTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwljaGFyIHRtcFsxNl07CisJY2hhciAqYnVmID0gTlVMTDsKKwljb25zdCBjaGFyICpuYW1lOworCisJaWYgKGZpbGUpIHsKKwkJYnVmID0ga3phbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmKSB7CisJCQluYW1lID0gc3RybmNweSh0bXAsICIvL2Vub21lbSIsIHNpemVvZih0bXApKTsKKwkJCWdvdG8gZ290X25hbWU7CisJCX0KKwkJbmFtZSA9IGRfcGF0aCgmZmlsZS0+Zl9wYXRoLCBidWYsIFBBVEhfTUFYKTsKKwkJaWYgKElTX0VSUihuYW1lKSkgeworCQkJbmFtZSA9IHN0cm5jcHkodG1wLCAiLy90b29sb25nIiwgc2l6ZW9mKHRtcCkpOworCQkJZ290byBnb3RfbmFtZTsKKwkJfQorCX0gZWxzZSB7CisJCW5hbWUgPSBhcmNoX3ZtYV9uYW1lKG1tYXBfZXZlbnQtPnZtYSk7CisJCWlmIChuYW1lKQorCQkJZ290byBnb3RfbmFtZTsKKworCQlpZiAoIXZtYS0+dm1fbW0pIHsKKwkJCW5hbWUgPSBzdHJuY3B5KHRtcCwgIlt2ZHNvXSIsIHNpemVvZih0bXApKTsKKwkJCWdvdG8gZ290X25hbWU7CisJCX0KKworCQluYW1lID0gc3RybmNweSh0bXAsICIvL2Fub24iLCBzaXplb2YodG1wKSk7CisJCWdvdG8gZ290X25hbWU7CisJfQorCitnb3RfbmFtZToKKwlzaXplID0gQUxJR04oc3RybGVuKG5hbWUpKzEsIHNpemVvZih1NjQpKTsKKworCW1tYXBfZXZlbnQtPmZpbGVfbmFtZSA9IG5hbWU7CisJbW1hcF9ldmVudC0+ZmlsZV9zaXplID0gc2l6ZTsKKworCW1tYXBfZXZlbnQtPmV2ZW50LmhlYWRlci5zaXplID0gc2l6ZW9mKG1tYXBfZXZlbnQtPmV2ZW50KSArIHNpemU7CisKKwljcHVjdHggPSAmZ2V0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisJcGVyZl9jb3VudGVyX21tYXBfY3R4KCZjcHVjdHgtPmN0eCwgbW1hcF9ldmVudCk7CisJcHV0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJLyoKKwkgKiBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hpY2ggb2YgdGhlIGNoaWxkIGNvbnRleHRzIHRoZQorCSAqIGV2ZW50cyBlbmRzIHVwIGluLgorCSAqLworCWN0eCA9IHJjdV9kZXJlZmVyZW5jZShjdXJyZW50LT5wZXJmX2NvdW50ZXJfY3R4cCk7CisJaWYgKGN0eCkKKwkJcGVyZl9jb3VudGVyX21tYXBfY3R4KGN0eCwgbW1hcF9ldmVudCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlrZnJlZShidWYpOworfQorCit2b2lkIF9fcGVyZl9jb3VudGVyX21tYXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHBlcmZfbW1hcF9ldmVudCBtbWFwX2V2ZW50OworCisJaWYgKCFhdG9taWNfcmVhZCgmbnJfbW1hcF9jb3VudGVycykpCisJCXJldHVybjsKKworCW1tYXBfZXZlbnQgPSAoc3RydWN0IHBlcmZfbW1hcF9ldmVudCl7CisJCS52bWEJPSB2bWEsCisJCS5ldmVudCAgPSB7CisJCQkuaGVhZGVyID0geyAudHlwZSA9IFBFUkZfRVZFTlRfTU1BUCwgfSwKKwkJCS5zdGFydCAgPSB2bWEtPnZtX3N0YXJ0LAorCQkJLmxlbiAgICA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwKKwkJCS5wZ29mZiAgPSB2bWEtPnZtX3Bnb2ZmLAorCQl9LAorCX07CisKKwlwZXJmX2NvdW50ZXJfbW1hcF9ldmVudCgmbW1hcF9ldmVudCk7Cit9CisKKy8qCisgKiBMb2cgc2FtcGxlX3BlcmlvZCBjaGFuZ2VzIHNvIHRoYXQgYW5hbHl6aW5nIHRvb2xzIGNhbiByZS1ub3JtYWxpemUgdGhlCisgKiBldmVudCBmbG93LgorICovCisKK3N0cnVjdCBmcmVxX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCXU2NAkJCQl0aW1lOworCXU2NAkJCQlpZDsKKwl1NjQJCQkJcGVyaW9kOworfTsKKworc3RhdGljIHZvaWQgcGVyZl9sb2dfcGVyaW9kKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIHU2NCBwZXJpb2QpCit7CisJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IGZyZXFfZXZlbnQgZXZlbnQ7CisJaW50IHJldDsKKworCWlmIChjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kID09IHBlcmlvZCkKKwkJcmV0dXJuOworCisJaWYgKGNvdW50ZXItPmF0dHIuc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9QRVJJT0QpCisJCXJldHVybjsKKworCWV2ZW50ID0gKHN0cnVjdCBmcmVxX2V2ZW50KSB7CisJCS5oZWFkZXIgPSB7CisJCQkudHlwZSA9IFBFUkZfRVZFTlRfUEVSSU9ELAorCQkJLm1pc2MgPSAwLAorCQkJLnNpemUgPSBzaXplb2YoZXZlbnQpLAorCQl9LAorCQkudGltZSA9IHNjaGVkX2Nsb2NrKCksCisJCS5pZCA9IGNvdW50ZXItPmlkLAorCQkucGVyaW9kID0gcGVyaW9kLAorCX07CisKKwlyZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBjb3VudGVyLCBzaXplb2YoZXZlbnQpLCAxLCAwKTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgZXZlbnQpOworCXBlcmZfb3V0cHV0X2VuZCgmaGFuZGxlKTsKK30KKworLyoKKyAqIElSUSB0aHJvdHRsZSBsb2dnaW5nCisgKi8KKworc3RhdGljIHZvaWQgcGVyZl9sb2dfdGhyb3R0bGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlIGhhbmRsZTsKKwlpbnQgcmV0OworCisJc3RydWN0IHsKKwkJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkJdTY0CQkJCXRpbWU7CisJCXU2NAkJCQlpZDsKKwl9IHRocm90dGxlX2V2ZW50ID0geworCQkuaGVhZGVyID0geworCQkJLnR5cGUgPSBQRVJGX0VWRU5UX1RIUk9UVExFICsgMSwKKwkJCS5taXNjID0gMCwKKwkJCS5zaXplID0gc2l6ZW9mKHRocm90dGxlX2V2ZW50KSwKKwkJfSwKKwkJLnRpbWUJPSBzY2hlZF9jbG9jaygpLAorCQkuaWQJPSBjb3VudGVyLT5pZCwKKwl9OworCisJcmV0ID0gcGVyZl9vdXRwdXRfYmVnaW4oJmhhbmRsZSwgY291bnRlciwgc2l6ZW9mKHRocm90dGxlX2V2ZW50KSwgMSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuOworCisJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIHRocm90dGxlX2V2ZW50KTsKKwlwZXJmX291dHB1dF9lbmQoJmhhbmRsZSk7Cit9CisKKy8qCisgKiBHZW5lcmljIGNvdW50ZXIgb3ZlcmZsb3cgaGFuZGxpbmcuCisgKi8KKworaW50IHBlcmZfY291bnRlcl9vdmVyZmxvdyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBpbnQgbm1pLAorCQkJICBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSkKK3sKKwlpbnQgZXZlbnRzID0gYXRvbWljX3JlYWQoJmNvdW50ZXItPmV2ZW50X2xpbWl0KTsKKwlpbnQgdGhyb3R0bGUgPSBjb3VudGVyLT5wbXUtPnVudGhyb3R0bGUgIT0gTlVMTDsKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MgPSAmY291bnRlci0+aHc7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRocm90dGxlKSB7CisJCWh3Yy0+aW50ZXJydXB0cysrOworCX0gZWxzZSB7CisJCWlmIChod2MtPmludGVycnVwdHMgIT0gTUFYX0lOVEVSUlVQVFMpIHsKKwkJCWh3Yy0+aW50ZXJydXB0cysrOworCQkJaWYgKEhaICogaHdjLT5pbnRlcnJ1cHRzID4KKwkJCQkJKHU2NClzeXNjdGxfcGVyZl9jb3VudGVyX3NhbXBsZV9yYXRlKSB7CisJCQkJaHdjLT5pbnRlcnJ1cHRzID0gTUFYX0lOVEVSUlVQVFM7CisJCQkJcGVyZl9sb2dfdGhyb3R0bGUoY291bnRlciwgMCk7CisJCQkJcmV0ID0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBLZWVwIHJlLWRpc2FibGluZyBjb3VudGVycyBldmVuIHRob3VnaCBvbiB0aGUgcHJldmlvdXMKKwkJCSAqIHBhc3Mgd2UgZGlzYWJsZWQgaXQgLSBqdXN0IGluIGNhc2Ugd2UgcmFjZWQgd2l0aCBhCisJCQkgKiBzY2hlZC1pbiBhbmQgdGhlIGNvdW50ZXIgZ290IGVuYWJsZWQgYWdhaW46CisJCQkgKi8KKwkJCXJldCA9IDE7CisJCX0KKwl9CisKKwlpZiAoY291bnRlci0+YXR0ci5mcmVxKSB7CisJCXU2NCBub3cgPSBzY2hlZF9jbG9jaygpOworCQlzNjQgZGVsdGEgPSBub3cgLSBod2MtPmZyZXFfc3RhbXA7CisKKwkJaHdjLT5mcmVxX3N0YW1wID0gbm93OworCisJCWlmIChkZWx0YSA+IDAgJiYgZGVsdGEgPCBUSUNLX05TRUMpCisJCQlwZXJmX2FkanVzdF9wZXJpb2QoY291bnRlciwgTlNFQ19QRVJfU0VDIC8gKGludClkZWx0YSk7CisJfQorCisJLyoKKwkgKiBYWFggZXZlbnRfbGltaXQgbWlnaHQgbm90IHF1aXRlIHdvcmsgYXMgZXhwZWN0ZWQgb24gaW5oZXJpdGVkCisJICogY291bnRlcnMKKwkgKi8KKworCWNvdW50ZXItPnBlbmRpbmdfa2lsbCA9IFBPTExfSU47CisJaWYgKGV2ZW50cyAmJiBhdG9taWNfZGVjX2FuZF90ZXN0KCZjb3VudGVyLT5ldmVudF9saW1pdCkpIHsKKwkJcmV0ID0gMTsKKwkJY291bnRlci0+cGVuZGluZ19raWxsID0gUE9MTF9IVVA7CisJCWlmIChubWkpIHsKKwkJCWNvdW50ZXItPnBlbmRpbmdfZGlzYWJsZSA9IDE7CisJCQlwZXJmX3BlbmRpbmdfcXVldWUoJmNvdW50ZXItPnBlbmRpbmcsCisJCQkJCSAgIHBlcmZfcGVuZGluZ19jb3VudGVyKTsKKwkJfSBlbHNlCisJCQlwZXJmX2NvdW50ZXJfZGlzYWJsZShjb3VudGVyKTsKKwl9CisKKwlwZXJmX2NvdW50ZXJfb3V0cHV0KGNvdW50ZXIsIG5taSwgZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdlbmVyaWMgc29mdHdhcmUgY291bnRlciBpbmZyYXN0cnVjdHVyZQorICovCisKK3N0YXRpYyB2b2lkIHBlcmZfc3djb3VudGVyX3VwZGF0ZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YyA9ICZjb3VudGVyLT5odzsKKwl1NjQgcHJldiwgbm93OworCXM2NCBkZWx0YTsKKworYWdhaW46CisJcHJldiA9IGF0b21pYzY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7CisJbm93ID0gYXRvbWljNjRfcmVhZCgmaHdjLT5jb3VudCk7CisJaWYgKGF0b21pYzY0X2NtcHhjaGcoJmh3Yy0+cHJldl9jb3VudCwgcHJldiwgbm93KSAhPSBwcmV2KQorCQlnb3RvIGFnYWluOworCisJZGVsdGEgPSBub3cgLSBwcmV2OworCisJYXRvbWljNjRfYWRkKGRlbHRhLCAmY291bnRlci0+Y291bnQpOworCWF0b21pYzY0X3N1YihkZWx0YSwgJmh3Yy0+cGVyaW9kX2xlZnQpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX3N3Y291bnRlcl9zZXRfcGVyaW9kKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCXM2NCBsZWZ0ID0gYXRvbWljNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCk7CisJczY0IHBlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKKworCWlmICh1bmxpa2VseShsZWZ0IDw9IC1wZXJpb2QpKSB7CisJCWxlZnQgPSBwZXJpb2Q7CisJCWF0b21pYzY0X3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgbGVmdCk7CisJCWh3Yy0+bGFzdF9wZXJpb2QgPSBwZXJpb2Q7CisJfQorCisJaWYgKHVubGlrZWx5KGxlZnQgPD0gMCkpIHsKKwkJbGVmdCArPSBwZXJpb2Q7CisJCWF0b21pYzY0X2FkZChwZXJpb2QsICZod2MtPnBlcmlvZF9sZWZ0KTsKKwkJaHdjLT5sYXN0X3BlcmlvZCA9IHBlcmlvZDsKKwl9CisKKwlhdG9taWM2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgLWxlZnQpOworCWF0b21pYzY0X3NldCgmaHdjLT5jb3VudCwgLWxlZnQpOworfQorCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgcGVyZl9zd2NvdW50ZXJfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqaHJ0aW1lcikKK3sKKwllbnVtIGhydGltZXJfcmVzdGFydCByZXQgPSBIUlRJTUVSX1JFU1RBUlQ7CisJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCXU2NCBwZXJpb2Q7CisKKwljb3VudGVyCT0gY29udGFpbmVyX29mKGhydGltZXIsIHN0cnVjdCBwZXJmX2NvdW50ZXIsIGh3LmhydGltZXIpOworCWNvdW50ZXItPnBtdS0+cmVhZChjb3VudGVyKTsKKworCWRhdGEuYWRkciA9IDA7CisJZGF0YS5yZWdzID0gZ2V0X2lycV9yZWdzKCk7CisJLyoKKwkgKiBJbiBjYXNlIHdlIGV4Y2x1ZGUga2VybmVsIElQcyBvciBhcmUgc29tZWhvdyBub3QgaW4gaW50ZXJydXB0CisJICogY29udGV4dCwgcHJvdmlkZSB0aGUgbmV4dCBiZXN0IHRoaW5nLCB0aGUgdXNlciBJUC4KKwkgKi8KKwlpZiAoKGNvdW50ZXItPmF0dHIuZXhjbHVkZV9rZXJuZWwgfHwgIWRhdGEucmVncykgJiYKKwkJCSFjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfdXNlcikKKwkJZGF0YS5yZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOworCisJaWYgKGRhdGEucmVncykgeworCQlpZiAocGVyZl9jb3VudGVyX292ZXJmbG93KGNvdW50ZXIsIDAsICZkYXRhKSkKKwkJCXJldCA9IEhSVElNRVJfTk9SRVNUQVJUOworCX0KKworCXBlcmlvZCA9IG1heF90KHU2NCwgMTAwMDAsIGNvdW50ZXItPmh3LnNhbXBsZV9wZXJpb2QpOworCWhydGltZXJfZm9yd2FyZF9ub3coaHJ0aW1lciwgbnNfdG9fa3RpbWUocGVyaW9kKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwZXJmX3N3Y291bnRlcl9vdmVyZmxvdyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJCSAgICBpbnQgbm1pLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTY0IGFkZHIpCit7CisJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YSA9IHsKKwkJLnJlZ3MJPSByZWdzLAorCQkuYWRkcgk9IGFkZHIsCisJCS5wZXJpb2QJPSBjb3VudGVyLT5ody5sYXN0X3BlcmlvZCwKKwl9OworCisJcGVyZl9zd2NvdW50ZXJfdXBkYXRlKGNvdW50ZXIpOworCXBlcmZfc3djb3VudGVyX3NldF9wZXJpb2QoY291bnRlcik7CisJaWYgKHBlcmZfY291bnRlcl9vdmVyZmxvdyhjb3VudGVyLCBubWksICZkYXRhKSkKKwkJLyogc29mdC1kaXNhYmxlIHRoZSBjb3VudGVyICovCisJCTsKKworfQorCitzdGF0aWMgaW50IHBlcmZfc3djb3VudGVyX2lzX2NvdW50aW5nKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQ7CisKKwlpZiAoY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoY291bnRlci0+c3RhdGUgIT0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgdGhlIGNvdW50ZXIgaXMgaW5hY3RpdmUsIGl0IGNvdWxkIGJlIGp1c3QgYmVjYXVzZQorCSAqIGl0cyB0YXNrIGlzIHNjaGVkdWxlZCBvdXQsIG9yIGJlY2F1c2UgaXQncyBpbiBhIGdyb3VwCisJICogd2hpY2ggY291bGQgbm90IGdvIG9uIHRoZSBQTVUuICBXZSB3YW50IHRvIGNvdW50IGluCisJICogdGhlIGZpcnN0IGNhc2UgYnV0IG5vdCB0aGUgc2Vjb25kLiAgSWYgdGhlIGNvbnRleHQgaXMKKwkgKiBjdXJyZW50bHkgYWN0aXZlIHRoZW4gYW4gaW5hY3RpdmUgc29mdHdhcmUgY291bnRlciBtdXN0CisJICogYmUgdGhlIHNlY29uZCBjYXNlLiAgSWYgaXQncyBub3QgY3VycmVudGx5IGFjdGl2ZSB0aGVuCisJICogd2UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhlIGNvdW50ZXIgd2FzIGFjdGl2ZSB3aGVuIHRoZQorCSAqIGNvbnRleHQgd2FzIGxhc3QgYWN0aXZlLCB3aGljaCB3ZSBjYW4gZGV0ZXJtaW5lIGJ5CisJICogY29tcGFyaW5nIGNvdW50ZXItPnRzdGFtcF9zdG9wcGVkIHdpdGggY3R4LT50aW1lLgorCSAqCisJICogV2UgYXJlIHdpdGhpbiBhbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24sCisJICogd2hpY2ggcHJvdGVjdHMgdGhlIGV4aXN0ZW5jZSBvZiAqY3R4LgorCSAqLworCWN0eCA9IGNvdW50ZXItPmN0eDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5sb2NrLCBmbGFncyk7CisJY291bnQgPSAxOworCS8qIFJlLWNoZWNrIHN0YXRlIG5vdyB3ZSBoYXZlIHRoZSBsb2NrICovCisJaWYgKGNvdW50ZXItPnN0YXRlIDwgUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFIHx8CisJICAgIGNvdW50ZXItPmN0eC0+aXNfYWN0aXZlIHx8CisJICAgIGNvdW50ZXItPnRzdGFtcF9zdG9wcGVkIDwgY3R4LT50aW1lKQorCQljb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IHBlcmZfc3djb3VudGVyX21hdGNoKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsCisJCQkJZW51bSBwZXJmX3R5cGVfaWQgdHlwZSwKKwkJCQl1MzIgZXZlbnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICghcGVyZl9zd2NvdW50ZXJfaXNfY291bnRpbmcoY291bnRlcikpCisJCXJldHVybiAwOworCisJaWYgKGNvdW50ZXItPmF0dHIudHlwZSAhPSB0eXBlKQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnRlci0+YXR0ci5jb25maWcgIT0gZXZlbnQpCisJCXJldHVybiAwOworCisJaWYgKHJlZ3MpIHsKKwkJaWYgKGNvdW50ZXItPmF0dHIuZXhjbHVkZV91c2VyICYmIHVzZXJfbW9kZShyZWdzKSkKKwkJCXJldHVybiAwOworCisJCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfa2VybmVsICYmICF1c2VyX21vZGUocmVncykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9zd2NvdW50ZXJfYWRkKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIHU2NCBuciwKKwkJCSAgICAgICBpbnQgbm1pLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTY0IGFkZHIpCit7CisJaW50IG5lZyA9IGF0b21pYzY0X2FkZF9uZWdhdGl2ZShuciwgJmNvdW50ZXItPmh3LmNvdW50KTsKKworCWlmIChjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kICYmICFuZWcgJiYgcmVncykKKwkJcGVyZl9zd2NvdW50ZXJfb3ZlcmZsb3coY291bnRlciwgbm1pLCByZWdzLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9zd2NvdW50ZXJfY3R4X2V2ZW50KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LAorCQkJCSAgICAgZW51bSBwZXJmX3R5cGVfaWQgdHlwZSwgdTMyIGV2ZW50LAorCQkJCSAgICAgdTY0IG5yLCBpbnQgbm1pLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgICAgIHU2NCBhZGRyKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisKKwlpZiAoc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SVU5OSU5HIHx8IGxpc3RfZW1wdHkoJmN0eC0+ZXZlbnRfbGlzdCkpCisJCXJldHVybjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjb3VudGVyLCAmY3R4LT5ldmVudF9saXN0LCBldmVudF9lbnRyeSkgeworCQlpZiAocGVyZl9zd2NvdW50ZXJfbWF0Y2goY291bnRlciwgdHlwZSwgZXZlbnQsIHJlZ3MpKQorCQkJcGVyZl9zd2NvdW50ZXJfYWRkKGNvdW50ZXIsIG5yLCBubWksIHJlZ3MsIGFkZHIpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIGludCAqcGVyZl9zd2NvdW50ZXJfcmVjdXJzaW9uX2NvbnRleHQoc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCkKK3sKKwlpZiAoaW5fbm1pKCkpCisJCXJldHVybiAmY3B1Y3R4LT5yZWN1cnNpb25bM107CisKKwlpZiAoaW5faXJxKCkpCisJCXJldHVybiAmY3B1Y3R4LT5yZWN1cnNpb25bMl07CisKKwlpZiAoaW5fc29mdGlycSgpKQorCQlyZXR1cm4gJmNwdWN0eC0+cmVjdXJzaW9uWzFdOworCisJcmV0dXJuICZjcHVjdHgtPnJlY3Vyc2lvblswXTsKK30KKworc3RhdGljIHZvaWQgX19wZXJmX3N3Y291bnRlcl9ldmVudChlbnVtIHBlcmZfdHlwZV9pZCB0eXBlLCB1MzIgZXZlbnQsCisJCQkJICAgdTY0IG5yLCBpbnQgbm1pLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkJCQkgICB1NjQgYWRkcikKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gJmdldF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCWludCAqcmVjdXJzaW9uID0gcGVyZl9zd2NvdW50ZXJfcmVjdXJzaW9uX2NvbnRleHQoY3B1Y3R4KTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eDsKKworCWlmICgqcmVjdXJzaW9uKQorCQlnb3RvIG91dDsKKworCSgqcmVjdXJzaW9uKSsrOworCWJhcnJpZXIoKTsKKworCXBlcmZfc3djb3VudGVyX2N0eF9ldmVudCgmY3B1Y3R4LT5jdHgsIHR5cGUsIGV2ZW50LAorCQkJCSBuciwgbm1pLCByZWdzLCBhZGRyKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJLyoKKwkgKiBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hpY2ggb2YgdGhlIGNoaWxkIGNvbnRleHRzIHRoZQorCSAqIGV2ZW50cyBlbmRzIHVwIGluLgorCSAqLworCWN0eCA9IHJjdV9kZXJlZmVyZW5jZShjdXJyZW50LT5wZXJmX2NvdW50ZXJfY3R4cCk7CisJaWYgKGN0eCkKKwkJcGVyZl9zd2NvdW50ZXJfY3R4X2V2ZW50KGN0eCwgdHlwZSwgZXZlbnQsIG5yLCBubWksIHJlZ3MsIGFkZHIpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJYmFycmllcigpOworCSgqcmVjdXJzaW9uKS0tOworCitvdXQ6CisJcHV0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7Cit9CisKK3ZvaWQKK3BlcmZfc3djb3VudGVyX2V2ZW50KHUzMiBldmVudCwgdTY0IG5yLCBpbnQgbm1pLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTY0IGFkZHIpCit7CisJX19wZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX1RZUEVfU09GVFdBUkUsIGV2ZW50LCBuciwgbm1pLCByZWdzLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9zd2NvdW50ZXJfcmVhZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXBlcmZfc3djb3VudGVyX3VwZGF0ZShjb3VudGVyKTsKK30KKworc3RhdGljIGludCBwZXJmX3N3Y291bnRlcl9lbmFibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlwZXJmX3N3Y291bnRlcl9zZXRfcGVyaW9kKGNvdW50ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZXJmX3N3Y291bnRlcl9kaXNhYmxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJcGVyZl9zd2NvdW50ZXJfdXBkYXRlKGNvdW50ZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtdSBwZXJmX29wc19nZW5lcmljID0geworCS5lbmFibGUJCT0gcGVyZl9zd2NvdW50ZXJfZW5hYmxlLAorCS5kaXNhYmxlCT0gcGVyZl9zd2NvdW50ZXJfZGlzYWJsZSwKKwkucmVhZAkJPSBwZXJmX3N3Y291bnRlcl9yZWFkLAorfTsKKworLyoKKyAqIFNvZnR3YXJlIGNvdW50ZXI6IGNwdSB3YWxsIHRpbWUgY2xvY2sKKyAqLworCitzdGF0aWMgdm9pZCBjcHVfY2xvY2tfcGVyZl9jb3VudGVyX3VwZGF0ZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXM2NCBwcmV2OworCXU2NCBub3c7CisKKwlub3cgPSBjcHVfY2xvY2soY3B1KTsKKwlwcmV2ID0gYXRvbWljNjRfcmVhZCgmY291bnRlci0+aHcucHJldl9jb3VudCk7CisJYXRvbWljNjRfc2V0KCZjb3VudGVyLT5ody5wcmV2X2NvdW50LCBub3cpOworCWF0b21pYzY0X2FkZChub3cgLSBwcmV2LCAmY291bnRlci0+Y291bnQpOworfQorCitzdGF0aWMgaW50IGNwdV9jbG9ja19wZXJmX2NvdW50ZXJfZW5hYmxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJYXRvbWljNjRfc2V0KCZod2MtPnByZXZfY291bnQsIGNwdV9jbG9jayhjcHUpKTsKKwlocnRpbWVyX2luaXQoJmh3Yy0+aHJ0aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwlod2MtPmhydGltZXIuZnVuY3Rpb24gPSBwZXJmX3N3Y291bnRlcl9ocnRpbWVyOworCWlmIChod2MtPnNhbXBsZV9wZXJpb2QpIHsKKwkJdTY0IHBlcmlvZCA9IG1heF90KHU2NCwgMTAwMDAsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7CisJCV9faHJ0aW1lcl9zdGFydF9yYW5nZV9ucygmaHdjLT5ocnRpbWVyLAorCQkJCW5zX3RvX2t0aW1lKHBlcmlvZCksIDAsCisJCQkJSFJUSU1FUl9NT0RFX1JFTCwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9jbG9ja19wZXJmX2NvdW50ZXJfZGlzYWJsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWlmIChjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kKQorCQlocnRpbWVyX2NhbmNlbCgmY291bnRlci0+aHcuaHJ0aW1lcik7CisJY3B1X2Nsb2NrX3BlcmZfY291bnRlcl91cGRhdGUoY291bnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9jbG9ja19wZXJmX2NvdW50ZXJfcmVhZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWNwdV9jbG9ja19wZXJmX2NvdW50ZXJfdXBkYXRlKGNvdW50ZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtdSBwZXJmX29wc19jcHVfY2xvY2sgPSB7CisJLmVuYWJsZQkJPSBjcHVfY2xvY2tfcGVyZl9jb3VudGVyX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGNwdV9jbG9ja19wZXJmX2NvdW50ZXJfZGlzYWJsZSwKKwkucmVhZAkJPSBjcHVfY2xvY2tfcGVyZl9jb3VudGVyX3JlYWQsCit9OworCisvKgorICogU29mdHdhcmUgY291bnRlcjogdGFzayB0aW1lIGNsb2NrCisgKi8KKworc3RhdGljIHZvaWQgdGFza19jbG9ja19wZXJmX2NvdW50ZXJfdXBkYXRlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIHU2NCBub3cpCit7CisJdTY0IHByZXY7CisJczY0IGRlbHRhOworCisJcHJldiA9IGF0b21pYzY0X3hjaGcoJmNvdW50ZXItPmh3LnByZXZfY291bnQsIG5vdyk7CisJZGVsdGEgPSBub3cgLSBwcmV2OworCWF0b21pYzY0X2FkZChkZWx0YSwgJmNvdW50ZXItPmNvdW50KTsKK30KKworc3RhdGljIGludCB0YXNrX2Nsb2NrX3BlcmZfY291bnRlcl9lbmFibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MgPSAmY291bnRlci0+aHc7CisJdTY0IG5vdzsKKworCW5vdyA9IGNvdW50ZXItPmN0eC0+dGltZTsKKworCWF0b21pYzY0X3NldCgmaHdjLT5wcmV2X2NvdW50LCBub3cpOworCWhydGltZXJfaW5pdCgmaHdjLT5ocnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOworCWh3Yy0+aHJ0aW1lci5mdW5jdGlvbiA9IHBlcmZfc3djb3VudGVyX2hydGltZXI7CisJaWYgKGh3Yy0+c2FtcGxlX3BlcmlvZCkgeworCQl1NjQgcGVyaW9kID0gbWF4X3QodTY0LCAxMDAwMCwgaHdjLT5zYW1wbGVfcGVyaW9kKTsKKwkJX19ocnRpbWVyX3N0YXJ0X3JhbmdlX25zKCZod2MtPmhydGltZXIsCisJCQkJbnNfdG9fa3RpbWUocGVyaW9kKSwgMCwKKwkJCQlIUlRJTUVSX01PREVfUkVMLCAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdGFza19jbG9ja19wZXJmX2NvdW50ZXJfZGlzYWJsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWlmIChjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kKQorCQlocnRpbWVyX2NhbmNlbCgmY291bnRlci0+aHcuaHJ0aW1lcik7CisJdGFza19jbG9ja19wZXJmX2NvdW50ZXJfdXBkYXRlKGNvdW50ZXIsIGNvdW50ZXItPmN0eC0+dGltZSk7CisKK30KKworc3RhdGljIHZvaWQgdGFza19jbG9ja19wZXJmX2NvdW50ZXJfcmVhZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXU2NCB0aW1lOworCisJaWYgKCFpbl9ubWkoKSkgeworCQl1cGRhdGVfY29udGV4dF90aW1lKGNvdW50ZXItPmN0eCk7CisJCXRpbWUgPSBjb3VudGVyLT5jdHgtPnRpbWU7CisJfSBlbHNlIHsKKwkJdTY0IG5vdyA9IHBlcmZfY2xvY2soKTsKKwkJdTY0IGRlbHRhID0gbm93IC0gY291bnRlci0+Y3R4LT50aW1lc3RhbXA7CisJCXRpbWUgPSBjb3VudGVyLT5jdHgtPnRpbWUgKyBkZWx0YTsKKwl9CisKKwl0YXNrX2Nsb2NrX3BlcmZfY291bnRlcl91cGRhdGUoY291bnRlciwgdGltZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG11IHBlcmZfb3BzX3Rhc2tfY2xvY2sgPSB7CisJLmVuYWJsZQkJPSB0YXNrX2Nsb2NrX3BlcmZfY291bnRlcl9lbmFibGUsCisJLmRpc2FibGUJPSB0YXNrX2Nsb2NrX3BlcmZfY291bnRlcl9kaXNhYmxlLAorCS5yZWFkCQk9IHRhc2tfY2xvY2tfcGVyZl9jb3VudGVyX3JlYWQsCit9OworCisvKgorICogU29mdHdhcmUgY291bnRlcjogY3B1IG1pZ3JhdGlvbnMKKyAqLwordm9pZCBwZXJmX2NvdW50ZXJfdGFza19taWdyYXRpb24oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSAmcGVyX2NwdShwZXJmX2NwdV9jb250ZXh0LCBjcHUpOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4OworCisJcGVyZl9zd2NvdW50ZXJfY3R4X2V2ZW50KCZjcHVjdHgtPmN0eCwgUEVSRl9UWVBFX1NPRlRXQVJFLAorCQkJCSBQRVJGX0NPVU5UX1NXX0NQVV9NSUdSQVRJT05TLAorCQkJCSAxLCAxLCBOVUxMLCAwKTsKKworCWN0eCA9IHBlcmZfcGluX3Rhc2tfY29udGV4dCh0YXNrKTsKKwlpZiAoY3R4KSB7CisJCXBlcmZfc3djb3VudGVyX2N0eF9ldmVudChjdHgsIFBFUkZfVFlQRV9TT0ZUV0FSRSwKKwkJCQkJIFBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElPTlMsCisJCQkJCSAxLCAxLCBOVUxMLCAwKTsKKwkJcGVyZl91bnBpbl9jb250ZXh0KGN0eCk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX0VWRU5UX1BST0ZJTEUKK3ZvaWQgcGVyZl90cGNvdW50ZXJfZXZlbnQoaW50IGV2ZW50X2lkKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X2lycV9yZWdzKCk7CisKKwlpZiAoIXJlZ3MpCisJCXJlZ3MgPSB0YXNrX3B0X3JlZ3MoY3VycmVudCk7CisKKwlfX3BlcmZfc3djb3VudGVyX2V2ZW50KFBFUkZfVFlQRV9UUkFDRVBPSU5ULCBldmVudF9pZCwgMSwgMSwgcmVncywgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwZXJmX3RwY291bnRlcl9ldmVudCk7CisKK2V4dGVybiBpbnQgZnRyYWNlX3Byb2ZpbGVfZW5hYmxlKGludCk7CitleHRlcm4gdm9pZCBmdHJhY2VfcHJvZmlsZV9kaXNhYmxlKGludCk7CisKK3N0YXRpYyB2b2lkIHRwX3BlcmZfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJZnRyYWNlX3Byb2ZpbGVfZGlzYWJsZShwZXJmX2V2ZW50X2lkKCZjb3VudGVyLT5hdHRyKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG11ICp0cF9wZXJmX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWludCBldmVudF9pZCA9IHBlcmZfZXZlbnRfaWQoJmNvdW50ZXItPmF0dHIpOworCWludCByZXQ7CisKKwlyZXQgPSBmdHJhY2VfcHJvZmlsZV9lbmFibGUoZXZlbnRfaWQpOworCWlmIChyZXQpCisJCXJldHVybiBOVUxMOworCisJY291bnRlci0+ZGVzdHJveSA9IHRwX3BlcmZfY291bnRlcl9kZXN0cm95OworCisJcmV0dXJuICZwZXJmX29wc19nZW5lcmljOworfQorI2Vsc2UKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG11ICp0cF9wZXJmX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG11ICpzd19wZXJmX2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWNvbnN0IHN0cnVjdCBwbXUgKnBtdSA9IE5VTEw7CisKKwkvKgorCSAqIFNvZnR3YXJlIGNvdW50ZXJzIChjdXJyZW50bHkpIGNhbid0IGluIGdlbmVyYWwgZGlzdGluZ3Vpc2gKKwkgKiBiZXR3ZWVuIHVzZXIsIGtlcm5lbCBhbmQgaHlwZXJ2aXNvciBldmVudHMuCisJICogSG93ZXZlciwgY29udGV4dCBzd2l0Y2hlcyBhbmQgY3B1IG1pZ3JhdGlvbnMgYXJlIGNvbnNpZGVyZWQKKwkgKiB0byBiZSBrZXJuZWwgZXZlbnRzLCBhbmQgcGFnZSBmYXVsdHMgYXJlIG5ldmVyIGh5cGVydmlzb3IKKwkgKiBldmVudHMuCisJICovCisJc3dpdGNoIChjb3VudGVyLT5hdHRyLmNvbmZpZykgeworCWNhc2UgUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0s6CisJCXBtdSA9ICZwZXJmX29wc19jcHVfY2xvY2s7CisKKwkJYnJlYWs7CisJY2FzZSBQRVJGX0NPVU5UX1NXX1RBU0tfQ0xPQ0s6CisJCS8qCisJCSAqIElmIHRoZSB1c2VyIGluc3RhbnRpYXRlcyB0aGlzIGFzIGEgcGVyLWNwdSBjb3VudGVyLAorCQkgKiB1c2UgdGhlIGNwdV9jbG9jayBjb3VudGVyIGluc3RlYWQuCisJCSAqLworCQlpZiAoY291bnRlci0+Y3R4LT50YXNrKQorCQkJcG11ID0gJnBlcmZfb3BzX3Rhc2tfY2xvY2s7CisJCWVsc2UKKwkJCXBtdSA9ICZwZXJmX29wc19jcHVfY2xvY2s7CisKKwkJYnJlYWs7CisJY2FzZSBQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTOgorCWNhc2UgUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU46CisJY2FzZSBQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSjoKKwljYXNlIFBFUkZfQ09VTlRfU1dfQ09OVEVYVF9TV0lUQ0hFUzoKKwljYXNlIFBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElPTlM6CisJCXBtdSA9ICZwZXJmX29wc19nZW5lcmljOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcG11OworfQorCisvKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjb3VudGVyIHN0cnVjdHVyZQorICovCitzdGF0aWMgc3RydWN0IHBlcmZfY291bnRlciAqCitwZXJmX2NvdW50ZXJfYWxsb2Moc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyLAorCQkgICBpbnQgY3B1LAorCQkgICBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCwKKwkJICAgc3RydWN0IHBlcmZfY291bnRlciAqZ3JvdXBfbGVhZGVyLAorCQkgICBnZnBfdCBnZnBmbGFncykKK3sKKwljb25zdCBzdHJ1Y3QgcG11ICpwbXU7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2M7CisJbG9uZyBlcnI7CisKKwljb3VudGVyID0ga3phbGxvYyhzaXplb2YoKmNvdW50ZXIpLCBnZnBmbGFncyk7CisJaWYgKCFjb3VudGVyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCS8qCisJICogU2luZ2xlIGNvdW50ZXJzIGFyZSB0aGVpciBvd24gZ3JvdXAgbGVhZGVycywgd2l0aCBhbgorCSAqIGVtcHR5IHNpYmxpbmcgbGlzdDoKKwkgKi8KKwlpZiAoIWdyb3VwX2xlYWRlcikKKwkJZ3JvdXBfbGVhZGVyID0gY291bnRlcjsKKworCW11dGV4X2luaXQoJmNvdW50ZXItPmNoaWxkX211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmY291bnRlci0+Y2hpbGRfbGlzdCk7CisKKwlJTklUX0xJU1RfSEVBRCgmY291bnRlci0+bGlzdF9lbnRyeSk7CisJSU5JVF9MSVNUX0hFQUQoJmNvdW50ZXItPmV2ZW50X2VudHJ5KTsKKwlJTklUX0xJU1RfSEVBRCgmY291bnRlci0+c2libGluZ19saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjb3VudGVyLT53YWl0cSk7CisKKwltdXRleF9pbml0KCZjb3VudGVyLT5tbWFwX211dGV4KTsKKworCWNvdW50ZXItPmNwdQkJPSBjcHU7CisJY291bnRlci0+YXR0cgkJPSAqYXR0cjsKKwljb3VudGVyLT5ncm91cF9sZWFkZXIJPSBncm91cF9sZWFkZXI7CisJY291bnRlci0+cG11CQk9IE5VTEw7CisJY291bnRlci0+Y3R4CQk9IGN0eDsKKwljb3VudGVyLT5vbmNwdQkJPSAtMTsKKworCWNvdW50ZXItPm5zCQk9IGdldF9waWRfbnMoY3VycmVudC0+bnNwcm94eS0+cGlkX25zKTsKKwljb3VudGVyLT5pZAkJPSBhdG9taWM2NF9pbmNfcmV0dXJuKCZwZXJmX2NvdW50ZXJfaWQpOworCisJY291bnRlci0+c3RhdGUJCT0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFOworCisJaWYgKGF0dHItPmRpc2FibGVkKQorCQljb3VudGVyLT5zdGF0ZSA9IFBFUkZfQ09VTlRFUl9TVEFURV9PRkY7CisKKwlwbXUgPSBOVUxMOworCisJaHdjID0gJmNvdW50ZXItPmh3OworCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IGF0dHItPnNhbXBsZV9wZXJpb2Q7CisJaWYgKGF0dHItPmZyZXEgJiYgYXR0ci0+c2FtcGxlX2ZyZXEpCisJCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IDE7CisKKwlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7CisKKwkvKgorCSAqIHdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBQRVJGX1NBTVBMRV9HUk9VUCBvbiBpbmhlcml0ZWQgY291bnRlcnMKKwkgKi8KKwlpZiAoYXR0ci0+aW5oZXJpdCAmJiAoYXR0ci0+c2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9HUk9VUCkpCisJCWdvdG8gZG9uZTsKKworCWlmIChhdHRyLT50eXBlID09IFBFUkZfVFlQRV9SQVcpIHsKKwkJcG11ID0gaHdfcGVyZl9jb3VudGVyX2luaXQoY291bnRlcik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2ggKGF0dHItPnR5cGUpIHsKKwljYXNlIFBFUkZfVFlQRV9IQVJEV0FSRToKKwljYXNlIFBFUkZfVFlQRV9IV19DQUNIRToKKwkJcG11ID0gaHdfcGVyZl9jb3VudGVyX2luaXQoY291bnRlcik7CisJCWJyZWFrOworCisJY2FzZSBQRVJGX1RZUEVfU09GVFdBUkU6CisJCXBtdSA9IHN3X3BlcmZfY291bnRlcl9pbml0KGNvdW50ZXIpOworCQlicmVhazsKKworCWNhc2UgUEVSRl9UWVBFX1RSQUNFUE9JTlQ6CisJCXBtdSA9IHRwX3BlcmZfY291bnRlcl9pbml0KGNvdW50ZXIpOworCQlicmVhazsKKwl9Citkb25lOgorCWVyciA9IDA7CisJaWYgKCFwbXUpCisJCWVyciA9IC1FSU5WQUw7CisJZWxzZSBpZiAoSVNfRVJSKHBtdSkpCisJCWVyciA9IFBUUl9FUlIocG11KTsKKworCWlmIChlcnIpIHsKKwkJaWYgKGNvdW50ZXItPm5zKQorCQkJcHV0X3BpZF9ucyhjb3VudGVyLT5ucyk7CisJCWtmcmVlKGNvdW50ZXIpOworCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCX0KKworCWNvdW50ZXItPnBtdSA9IHBtdTsKKworCWF0b21pY19pbmMoJm5yX2NvdW50ZXJzKTsKKwlpZiAoY291bnRlci0+YXR0ci5tbWFwKQorCQlhdG9taWNfaW5jKCZucl9tbWFwX2NvdW50ZXJzKTsKKwlpZiAoY291bnRlci0+YXR0ci5jb21tKQorCQlhdG9taWNfaW5jKCZucl9jb21tX2NvdW50ZXJzKTsKKworCXJldHVybiBjb3VudGVyOworfQorCisvKioKKyAqIHN5c19wZXJmX2NvdW50ZXJfb3BlbiAtIG9wZW4gYSBwZXJmb3JtYW5jZSBjb3VudGVyLCBhc3NvY2lhdGUgaXQgdG8gYSB0YXNrL2NwdQorICoKKyAqIEBhdHRyX3VwdHI6CWV2ZW50IHR5cGUgYXR0cmlidXRlcyBmb3IgbW9uaXRvcmluZy9zYW1wbGluZworICogQHBpZDoJCXRhcmdldCBwaWQKKyAqIEBjcHU6CQl0YXJnZXQgY3B1CisgKiBAZ3JvdXBfZmQ6CQlncm91cCBsZWFkZXIgY291bnRlciBmZAorICovCitTWVNDQUxMX0RFRklORTUocGVyZl9jb3VudGVyX29wZW4sCisJCWNvbnN0IHN0cnVjdCBwZXJmX2NvdW50ZXJfYXR0ciBfX3VzZXIgKiwgYXR0cl91cHRyLAorCQlwaWRfdCwgcGlkLCBpbnQsIGNwdSwgaW50LCBncm91cF9mZCwgdW5zaWduZWQgbG9uZywgZmxhZ3MpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgKmdyb3VwX2xlYWRlcjsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgYXR0cjsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgZmlsZSAqY291bnRlcl9maWxlID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZSAqZ3JvdXBfZmlsZSA9IE5VTEw7CisJaW50IGZwdXRfbmVlZGVkID0gMDsKKwlpbnQgZnB1dF9uZWVkZWQyID0gMDsKKwlpbnQgcmV0OworCisJLyogZm9yIGZ1dHVyZSBleHBhbmRhYmlsaXR5Li4uICovCisJaWYgKGZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYXR0ciwgYXR0cl91cHRyLCBzaXplb2YoYXR0cikpICE9IDApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCFhdHRyLmV4Y2x1ZGVfa2VybmVsKSB7CisJCWlmIChwZXJmX3BhcmFub2lkX2tlcm5lbCgpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJaWYgKGF0dHIuZnJlcSkgeworCQlpZiAoYXR0ci5zYW1wbGVfZnJlcSA+IHN5c2N0bF9wZXJmX2NvdW50ZXJfc2FtcGxlX3JhdGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgdGFyZ2V0IGNvbnRleHQgKHRhc2sgb3IgcGVyY3B1KToKKwkgKi8KKwljdHggPSBmaW5kX2dldF9jb250ZXh0KHBpZCwgY3B1KTsKKwlpZiAoSVNfRVJSKGN0eCkpCisJCXJldHVybiBQVFJfRVJSKGN0eCk7CisKKwkvKgorCSAqIExvb2sgdXAgdGhlIGdyb3VwIGxlYWRlciAod2Ugd2lsbCBhdHRhY2ggdGhpcyBjb3VudGVyIHRvIGl0KToKKwkgKi8KKwlncm91cF9sZWFkZXIgPSBOVUxMOworCWlmIChncm91cF9mZCAhPSAtMSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlncm91cF9maWxlID0gZmdldF9saWdodChncm91cF9mZCwgJmZwdXRfbmVlZGVkKTsKKwkJaWYgKCFncm91cF9maWxlKQorCQkJZ290byBlcnJfcHV0X2NvbnRleHQ7CisJCWlmIChncm91cF9maWxlLT5mX29wICE9ICZwZXJmX2ZvcHMpCisJCQlnb3RvIGVycl9wdXRfY29udGV4dDsKKworCQlncm91cF9sZWFkZXIgPSBncm91cF9maWxlLT5wcml2YXRlX2RhdGE7CisJCS8qCisJCSAqIERvIG5vdCBhbGxvdyBhIHJlY3Vyc2l2ZSBoaWVyYXJjaHkgKHRoaXMgbmV3IHNpYmxpbmcKKwkJICogYmVjb21pbmcgcGFydCBvZiBhbm90aGVyIGdyb3VwLXNpYmxpbmcpOgorCQkgKi8KKwkJaWYgKGdyb3VwX2xlYWRlci0+Z3JvdXBfbGVhZGVyICE9IGdyb3VwX2xlYWRlcikKKwkJCWdvdG8gZXJyX3B1dF9jb250ZXh0OworCQkvKgorCQkgKiBEbyBub3QgYWxsb3cgdG8gYXR0YWNoIHRvIGEgZ3JvdXAgaW4gYSBkaWZmZXJlbnQKKwkJICogdGFzayBvciBDUFUgY29udGV4dDoKKwkJICovCisJCWlmIChncm91cF9sZWFkZXItPmN0eCAhPSBjdHgpCisJCQlnb3RvIGVycl9wdXRfY29udGV4dDsKKwkJLyoKKwkJICogT25seSBhIGdyb3VwIGxlYWRlciBjYW4gYmUgZXhjbHVzaXZlIG9yIHBpbm5lZAorCQkgKi8KKwkJaWYgKGF0dHIuZXhjbHVzaXZlIHx8IGF0dHIucGlubmVkKQorCQkJZ290byBlcnJfcHV0X2NvbnRleHQ7CisJfQorCisJY291bnRlciA9IHBlcmZfY291bnRlcl9hbGxvYygmYXR0ciwgY3B1LCBjdHgsIGdyb3VwX2xlYWRlciwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCXJldCA9IFBUUl9FUlIoY291bnRlcik7CisJaWYgKElTX0VSUihjb3VudGVyKSkKKwkJZ290byBlcnJfcHV0X2NvbnRleHQ7CisKKwlyZXQgPSBhbm9uX2lub2RlX2dldGZkKCJbcGVyZl9jb3VudGVyXSIsICZwZXJmX2ZvcHMsIGNvdW50ZXIsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycl9mcmVlX3B1dF9jb250ZXh0OworCisJY291bnRlcl9maWxlID0gZmdldF9saWdodChyZXQsICZmcHV0X25lZWRlZDIpOworCWlmICghY291bnRlcl9maWxlKQorCQlnb3RvIGVycl9mcmVlX3B1dF9jb250ZXh0OworCisJY291bnRlci0+ZmlscCA9IGNvdW50ZXJfZmlsZTsKKwlXQVJOX09OX09OQ0UoY3R4LT5wYXJlbnRfY3R4KTsKKwltdXRleF9sb2NrKCZjdHgtPm11dGV4KTsKKwlwZXJmX2luc3RhbGxfaW5fY29udGV4dChjdHgsIGNvdW50ZXIsIGNwdSk7CisJKytjdHgtPmdlbmVyYXRpb247CisJbXV0ZXhfdW5sb2NrKCZjdHgtPm11dGV4KTsKKworCWNvdW50ZXItPm93bmVyID0gY3VycmVudDsKKwlnZXRfdGFza19zdHJ1Y3QoY3VycmVudCk7CisJbXV0ZXhfbG9jaygmY3VycmVudC0+cGVyZl9jb3VudGVyX211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZjb3VudGVyLT5vd25lcl9lbnRyeSwgJmN1cnJlbnQtPnBlcmZfY291bnRlcl9saXN0KTsKKwltdXRleF91bmxvY2soJmN1cnJlbnQtPnBlcmZfY291bnRlcl9tdXRleCk7CisKKwlmcHV0X2xpZ2h0KGNvdW50ZXJfZmlsZSwgZnB1dF9uZWVkZWQyKTsKKworb3V0X2ZwdXQ6CisJZnB1dF9saWdodChncm91cF9maWxlLCBmcHV0X25lZWRlZCk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfZnJlZV9wdXRfY29udGV4dDoKKwlrZnJlZShjb3VudGVyKTsKKworZXJyX3B1dF9jb250ZXh0OgorCXB1dF9jdHgoY3R4KTsKKworCWdvdG8gb3V0X2ZwdXQ7Cit9CisKKy8qCisgKiBpbmhlcml0IGEgY291bnRlciBmcm9tIHBhcmVudCB0YXNrIHRvIGNoaWxkIHRhc2s6CisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGVyZl9jb3VudGVyICoKK2luaGVyaXRfY291bnRlcihzdHJ1Y3QgcGVyZl9jb3VudGVyICpwYXJlbnRfY291bnRlciwKKwkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCwKKwkgICAgICBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKnBhcmVudF9jdHgsCisJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKKwkgICAgICBzdHJ1Y3QgcGVyZl9jb3VudGVyICpncm91cF9sZWFkZXIsCisJICAgICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjaGlsZF9jdHgpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY2hpbGRfY291bnRlcjsKKworCS8qCisJICogSW5zdGVhZCBvZiBjcmVhdGluZyByZWN1cnNpdmUgaGllcmFyY2hpZXMgb2YgY291bnRlcnMsCisJICogd2UgbGluayBpbmhlcml0ZWQgY291bnRlcnMgYmFjayB0byB0aGUgb3JpZ2luYWwgcGFyZW50LAorCSAqIHdoaWNoIGhhcyBhIGZpbHAgZm9yIHN1cmUsIHdoaWNoIHdlIHVzZSBhcyB0aGUgcmVmZXJlbmNlCisJICogY291bnQ6CisJICovCisJaWYgKHBhcmVudF9jb3VudGVyLT5wYXJlbnQpCisJCXBhcmVudF9jb3VudGVyID0gcGFyZW50X2NvdW50ZXItPnBhcmVudDsKKworCWNoaWxkX2NvdW50ZXIgPSBwZXJmX2NvdW50ZXJfYWxsb2MoJnBhcmVudF9jb3VudGVyLT5hdHRyLAorCQkJCQkgICBwYXJlbnRfY291bnRlci0+Y3B1LCBjaGlsZF9jdHgsCisJCQkJCSAgIGdyb3VwX2xlYWRlciwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihjaGlsZF9jb3VudGVyKSkKKwkJcmV0dXJuIGNoaWxkX2NvdW50ZXI7CisJZ2V0X2N0eChjaGlsZF9jdHgpOworCisJLyoKKwkgKiBNYWtlIHRoZSBjaGlsZCBzdGF0ZSBmb2xsb3cgdGhlIHN0YXRlIG9mIHRoZSBwYXJlbnQgY291bnRlciwKKwkgKiBub3QgaXRzIGF0dHIuZGlzYWJsZWQgYml0LiAgV2UgaG9sZCB0aGUgcGFyZW50J3MgbXV0ZXgsCisJICogc28gd2Ugd29uJ3QgcmFjZSB3aXRoIHBlcmZfY291bnRlcl97ZW4sIGRpc31hYmxlX2ZhbWlseS4KKwkgKi8KKwlpZiAocGFyZW50X2NvdW50ZXItPnN0YXRlID49IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkKKwkJY2hpbGRfY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkU7CisJZWxzZQorCQljaGlsZF9jb3VudGVyLT5zdGF0ZSA9IFBFUkZfQ09VTlRFUl9TVEFURV9PRkY7CisKKwlpZiAocGFyZW50X2NvdW50ZXItPmF0dHIuZnJlcSkKKwkJY2hpbGRfY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZCA9IHBhcmVudF9jb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kOworCisJLyoKKwkgKiBMaW5rIGl0IHVwIGluIHRoZSBjaGlsZCdzIGNvbnRleHQ6CisJICovCisJYWRkX2NvdW50ZXJfdG9fY3R4KGNoaWxkX2NvdW50ZXIsIGNoaWxkX2N0eCk7CisKKwljaGlsZF9jb3VudGVyLT5wYXJlbnQgPSBwYXJlbnRfY291bnRlcjsKKwkvKgorCSAqIGluaGVyaXQgaW50byBjaGlsZCdzIGNoaWxkIGFzIHdlbGw6CisJICovCisJY2hpbGRfY291bnRlci0+YXR0ci5pbmhlcml0ID0gMTsKKworCS8qCisJICogR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgZmlscCAtIHdlIHdpbGwgZnB1dCBpdAorCSAqIHdoZW4gdGhlIGNoaWxkIGNvdW50ZXIgZXhpdHMuIFRoaXMgaXMgc2FmZSB0byBkbyBiZWNhdXNlCisJICogd2UgYXJlIGluIHRoZSBwYXJlbnQgYW5kIHdlIGtub3cgdGhhdCB0aGUgZmlscCBzdGlsbAorCSAqIGV4aXN0cyBhbmQgaGFzIGEgbm9uemVybyBjb3VudDoKKwkgKi8KKwlhdG9taWNfbG9uZ19pbmMoJnBhcmVudF9jb3VudGVyLT5maWxwLT5mX2NvdW50KTsKKworCS8qCisJICogTGluayB0aGlzIGludG8gdGhlIHBhcmVudCBjb3VudGVyJ3MgY2hpbGQgbGlzdAorCSAqLworCVdBUk5fT05fT05DRShwYXJlbnRfY291bnRlci0+Y3R4LT5wYXJlbnRfY3R4KTsKKwltdXRleF9sb2NrKCZwYXJlbnRfY291bnRlci0+Y2hpbGRfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmNoaWxkX2NvdW50ZXItPmNoaWxkX2xpc3QsICZwYXJlbnRfY291bnRlci0+Y2hpbGRfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZwYXJlbnRfY291bnRlci0+Y2hpbGRfbXV0ZXgpOworCisJcmV0dXJuIGNoaWxkX2NvdW50ZXI7Cit9CisKK3N0YXRpYyBpbnQgaW5oZXJpdF9ncm91cChzdHJ1Y3QgcGVyZl9jb3VudGVyICpwYXJlbnRfY291bnRlciwKKwkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCwKKwkgICAgICBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKnBhcmVudF9jdHgsCisJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwKKwkgICAgICBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmNoaWxkX2N0eCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpsZWFkZXI7CisJc3RydWN0IHBlcmZfY291bnRlciAqc3ViOworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNoaWxkX2N0cjsKKworCWxlYWRlciA9IGluaGVyaXRfY291bnRlcihwYXJlbnRfY291bnRlciwgcGFyZW50LCBwYXJlbnRfY3R4LAorCQkJCSBjaGlsZCwgTlVMTCwgY2hpbGRfY3R4KTsKKwlpZiAoSVNfRVJSKGxlYWRlcikpCisJCXJldHVybiBQVFJfRVJSKGxlYWRlcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdWIsICZwYXJlbnRfY291bnRlci0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KSB7CisJCWNoaWxkX2N0ciA9IGluaGVyaXRfY291bnRlcihzdWIsIHBhcmVudCwgcGFyZW50X2N0eCwKKwkJCQkJICAgIGNoaWxkLCBsZWFkZXIsIGNoaWxkX2N0eCk7CisJCWlmIChJU19FUlIoY2hpbGRfY3RyKSkKKwkJCXJldHVybiBQVFJfRVJSKGNoaWxkX2N0cik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeW5jX2NoaWxkX2NvdW50ZXIoc3RydWN0IHBlcmZfY291bnRlciAqY2hpbGRfY291bnRlciwKKwkJCSAgICAgICBzdHJ1Y3QgcGVyZl9jb3VudGVyICpwYXJlbnRfY291bnRlcikKK3sKKwl1NjQgY2hpbGRfdmFsOworCisJY2hpbGRfdmFsID0gYXRvbWljNjRfcmVhZCgmY2hpbGRfY291bnRlci0+Y291bnQpOworCisJLyoKKwkgKiBBZGQgYmFjayB0aGUgY2hpbGQncyBjb3VudCB0byB0aGUgcGFyZW50J3MgY291bnQ6CisJICovCisJYXRvbWljNjRfYWRkKGNoaWxkX3ZhbCwgJnBhcmVudF9jb3VudGVyLT5jb3VudCk7CisJYXRvbWljNjRfYWRkKGNoaWxkX2NvdW50ZXItPnRvdGFsX3RpbWVfZW5hYmxlZCwKKwkJICAgICAmcGFyZW50X2NvdW50ZXItPmNoaWxkX3RvdGFsX3RpbWVfZW5hYmxlZCk7CisJYXRvbWljNjRfYWRkKGNoaWxkX2NvdW50ZXItPnRvdGFsX3RpbWVfcnVubmluZywKKwkJICAgICAmcGFyZW50X2NvdW50ZXItPmNoaWxkX3RvdGFsX3RpbWVfcnVubmluZyk7CisKKwkvKgorCSAqIFJlbW92ZSB0aGlzIGNvdW50ZXIgZnJvbSB0aGUgcGFyZW50J3MgbGlzdAorCSAqLworCVdBUk5fT05fT05DRShwYXJlbnRfY291bnRlci0+Y3R4LT5wYXJlbnRfY3R4KTsKKwltdXRleF9sb2NrKCZwYXJlbnRfY291bnRlci0+Y2hpbGRfbXV0ZXgpOworCWxpc3RfZGVsX2luaXQoJmNoaWxkX2NvdW50ZXItPmNoaWxkX2xpc3QpOworCW11dGV4X3VubG9jaygmcGFyZW50X2NvdW50ZXItPmNoaWxkX211dGV4KTsKKworCS8qCisJICogUmVsZWFzZSB0aGUgcGFyZW50IGNvdW50ZXIsIGlmIHRoaXMgd2FzIHRoZSBsYXN0CisJICogcmVmZXJlbmNlIHRvIGl0LgorCSAqLworCWZwdXQocGFyZW50X2NvdW50ZXItPmZpbHApOworfQorCitzdGF0aWMgdm9pZAorX19wZXJmX2NvdW50ZXJfZXhpdF90YXNrKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNoaWxkX2NvdW50ZXIsCisJCQkgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjaGlsZF9jdHgpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqcGFyZW50X2NvdW50ZXI7CisKKwl1cGRhdGVfY291bnRlcl90aW1lcyhjaGlsZF9jb3VudGVyKTsKKwlwZXJmX2NvdW50ZXJfcmVtb3ZlX2Zyb21fY29udGV4dChjaGlsZF9jb3VudGVyKTsKKworCXBhcmVudF9jb3VudGVyID0gY2hpbGRfY291bnRlci0+cGFyZW50OworCS8qCisJICogSXQgY2FuIGhhcHBlbiB0aGF0IHBhcmVudCBleGl0cyBmaXJzdCwgYW5kIGhhcyBjb3VudGVycworCSAqIHRoYXQgYXJlIHN0aWxsIGFyb3VuZCBkdWUgdG8gdGhlIGNoaWxkIHJlZmVyZW5jZS4gVGhlc2UKKwkgKiBjb3VudGVycyBuZWVkIHRvIGJlIHphcHBlZCAtIGJ1dCBvdGhlcndpc2UgbGluZ2VyLgorCSAqLworCWlmIChwYXJlbnRfY291bnRlcikgeworCQlzeW5jX2NoaWxkX2NvdW50ZXIoY2hpbGRfY291bnRlciwgcGFyZW50X2NvdW50ZXIpOworCQlmcmVlX2NvdW50ZXIoY2hpbGRfY291bnRlcik7CisJfQorfQorCisvKgorICogV2hlbiBhIGNoaWxkIHRhc2sgZXhpdHMsIGZlZWQgYmFjayBjb3VudGVyIHZhbHVlcyB0byBwYXJlbnQgY291bnRlcnMuCisgKi8KK3ZvaWQgcGVyZl9jb3VudGVyX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNoaWxkX2NvdW50ZXIsICp0bXA7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjaGlsZF9jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChsaWtlbHkoIWNoaWxkLT5wZXJmX2NvdW50ZXJfY3R4cCkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkvKgorCSAqIFdlIGNhbid0IHJlc2NoZWR1bGUgaGVyZSBiZWNhdXNlIGludGVycnVwdHMgYXJlIGRpc2FibGVkLAorCSAqIGFuZCBlaXRoZXIgY2hpbGQgaXMgY3VycmVudCBvciBpdCBpcyBhIHRhc2sgdGhhdCBjYW4ndCBiZQorCSAqIHNjaGVkdWxlZCwgc28gd2UgYXJlIG5vdyBzYWZlIGZyb20gcmVzY2hlZHVsaW5nIGNoYW5naW5nCisJICogb3VyIGNvbnRleHQuCisJICovCisJY2hpbGRfY3R4ID0gY2hpbGQtPnBlcmZfY291bnRlcl9jdHhwOworCV9fcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfb3V0KGNoaWxkX2N0eCk7CisKKwkvKgorCSAqIFRha2UgdGhlIGNvbnRleHQgbG9jayBoZXJlIHNvIHRoYXQgaWYgZmluZF9nZXRfY29udGV4dCBpcworCSAqIHJlYWRpbmcgY2hpbGQtPnBlcmZfY291bnRlcl9jdHhwLCB3ZSB3YWl0IHVudGlsIGl0IGhhcworCSAqIGluY3JlbWVudGVkIHRoZSBjb250ZXh0J3MgcmVmY291bnQgYmVmb3JlIHdlIGRvIHB1dF9jdHggYmVsb3cuCisJICovCisJc3Bpbl9sb2NrKCZjaGlsZF9jdHgtPmxvY2spOworCWNoaWxkLT5wZXJmX2NvdW50ZXJfY3R4cCA9IE5VTEw7CisJaWYgKGNoaWxkX2N0eC0+cGFyZW50X2N0eCkgeworCQkvKgorCQkgKiBUaGlzIGNvbnRleHQgaXMgYSBjbG9uZTsgdW5jbG9uZSBpdCBzbyBpdCBjYW4ndCBnZXQKKwkJICogc3dhcHBlZCB0byBhbm90aGVyIHByb2Nlc3Mgd2hpbGUgd2UncmUgcmVtb3ZpbmcgYWxsCisJCSAqIHRoZSBjb3VudGVycyBmcm9tIGl0LgorCQkgKi8KKwkJcHV0X2N0eChjaGlsZF9jdHgtPnBhcmVudF9jdHgpOworCQljaGlsZF9jdHgtPnBhcmVudF9jdHggPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmY2hpbGRfY3R4LT5sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkvKgorCSAqIFdlIGNhbiByZWN1cnNlIG9uIHRoZSBzYW1lIGxvY2sgdHlwZSB0aHJvdWdoOgorCSAqCisJICogICBfX3BlcmZfY291bnRlcl9leGl0X3Rhc2soKQorCSAqICAgICBzeW5jX2NoaWxkX2NvdW50ZXIoKQorCSAqICAgICAgIGZwdXQocGFyZW50X2NvdW50ZXItPmZpbHApCisJICogICAgICAgICBwZXJmX3JlbGVhc2UoKQorCSAqICAgICAgICAgICBtdXRleF9sb2NrKCZjdHgtPm11dGV4KQorCSAqCisJICogQnV0IHNpbmNlIGl0cyB0aGUgcGFyZW50IGNvbnRleHQgaXQgd29uJ3QgYmUgdGhlIHNhbWUgaW5zdGFuY2UuCisJICovCisJbXV0ZXhfbG9ja19uZXN0ZWQoJmNoaWxkX2N0eC0+bXV0ZXgsIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKworYWdhaW46CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaWxkX2NvdW50ZXIsIHRtcCwgJmNoaWxkX2N0eC0+Y291bnRlcl9saXN0LAorCQkJCSBsaXN0X2VudHJ5KQorCQlfX3BlcmZfY291bnRlcl9leGl0X3Rhc2soY2hpbGRfY291bnRlciwgY2hpbGRfY3R4KTsKKworCS8qCisJICogSWYgdGhlIGxhc3QgY291bnRlciB3YXMgYSBncm91cCBjb3VudGVyLCBpdCB3aWxsIGhhdmUgYXBwZW5kZWQgYWxsCisJICogaXRzIHNpYmxpbmdzIHRvIHRoZSBsaXN0LCBidXQgd2Ugb2J0YWluZWQgJ3RtcCcgYmVmb3JlIHRoYXQgd2hpY2gKKwkgKiB3aWxsIHN0aWxsIHBvaW50IHRvIHRoZSBsaXN0IGhlYWQgdGVybWluYXRpbmcgdGhlIGl0ZXJhdGlvbi4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmNoaWxkX2N0eC0+Y291bnRlcl9saXN0KSkKKwkJZ290byBhZ2FpbjsKKworCW11dGV4X3VubG9jaygmY2hpbGRfY3R4LT5tdXRleCk7CisKKwlwdXRfY3R4KGNoaWxkX2N0eCk7Cit9CisKKy8qCisgKiBmcmVlIGFuIHVuZXhwb3NlZCwgdW51c2VkIGNvbnRleHQgYXMgY3JlYXRlZCBieSBpbmhlcml0YW5jZSBieQorICogaW5pdF90YXNrIGJlbG93LCB1c2VkIGJ5IGZvcmsoKSBpbiBjYXNlIG9mIGZhaWwuCisgKi8KK3ZvaWQgcGVyZl9jb3VudGVyX2ZyZWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSB0YXNrLT5wZXJmX2NvdW50ZXJfY3R4cDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCAqdG1wOworCisJaWYgKCFjdHgpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmN0eC0+bXV0ZXgpOworYWdhaW46CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvdW50ZXIsIHRtcCwgJmN0eC0+Y291bnRlcl9saXN0LCBsaXN0X2VudHJ5KSB7CisJCXN0cnVjdCBwZXJmX2NvdW50ZXIgKnBhcmVudCA9IGNvdW50ZXItPnBhcmVudDsKKworCQlpZiAoV0FSTl9PTl9PTkNFKCFwYXJlbnQpKQorCQkJY29udGludWU7CisKKwkJbXV0ZXhfbG9jaygmcGFyZW50LT5jaGlsZF9tdXRleCk7CisJCWxpc3RfZGVsX2luaXQoJmNvdW50ZXItPmNoaWxkX2xpc3QpOworCQltdXRleF91bmxvY2soJnBhcmVudC0+Y2hpbGRfbXV0ZXgpOworCisJCWZwdXQocGFyZW50LT5maWxwKTsKKworCQlsaXN0X2RlbF9jb3VudGVyKGNvdW50ZXIsIGN0eCk7CisJCWZyZWVfY291bnRlcihjb3VudGVyKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJmN0eC0+Y291bnRlcl9saXN0KSkKKwkJZ290byBhZ2FpbjsKKworCW11dGV4X3VubG9jaygmY3R4LT5tdXRleCk7CisKKwlwdXRfY3R4KGN0eCk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBwZXJmX2NvdW50ZXIgY29udGV4dCBpbiB0YXNrX3N0cnVjdAorICovCitpbnQgcGVyZl9jb3VudGVyX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY2hpbGRfY3R4LCAqcGFyZW50X2N0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmNsb25lZF9jdHg7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudCA9IGN1cnJlbnQ7CisJaW50IGluaGVyaXRlZF9hbGwgPSAxOworCWludCByZXQgPSAwOworCisJY2hpbGQtPnBlcmZfY291bnRlcl9jdHhwID0gTlVMTDsKKworCW11dGV4X2luaXQoJmNoaWxkLT5wZXJmX2NvdW50ZXJfbXV0ZXgpOworCUlOSVRfTElTVF9IRUFEKCZjaGlsZC0+cGVyZl9jb3VudGVyX2xpc3QpOworCisJaWYgKGxpa2VseSghcGFyZW50LT5wZXJmX2NvdW50ZXJfY3R4cCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBUaGlzIGlzIGV4ZWN1dGVkIGZyb20gdGhlIHBhcmVudCB0YXNrIGNvbnRleHQsIHNvIGluaGVyaXQKKwkgKiBjb3VudGVycyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQgZm9yIGNsb25pbmcuCisJICogRmlyc3QgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjb250ZXh0IGZvciB0aGUgY2hpbGQuCisJICovCisKKwljaGlsZF9jdHggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaWxkX2N0eCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlfX3BlcmZfY291bnRlcl9pbml0X2NvbnRleHQoY2hpbGRfY3R4LCBjaGlsZCk7CisJY2hpbGQtPnBlcmZfY291bnRlcl9jdHhwID0gY2hpbGRfY3R4OworCWdldF90YXNrX3N0cnVjdChjaGlsZCk7CisKKwkvKgorCSAqIElmIHRoZSBwYXJlbnQncyBjb250ZXh0IGlzIGEgY2xvbmUsIHBpbiBpdCBzbyBpdCB3b24ndCBnZXQKKwkgKiBzd2FwcGVkIHVuZGVyIHVzLgorCSAqLworCXBhcmVudF9jdHggPSBwZXJmX3Bpbl90YXNrX2NvbnRleHQocGFyZW50KTsKKworCS8qCisJICogTm8gbmVlZCB0byBjaGVjayBpZiBwYXJlbnRfY3R4ICE9IE5VTEwgaGVyZTsgc2luY2Ugd2Ugc2F3CisJICogaXQgbm9uLU5VTEwgZWFybGllciwgdGhlIG9ubHkgcmVhc29uIGZvciBpdCB0byBiZWNvbWUgTlVMTAorCSAqIGlzIGlmIHdlIGV4aXQsIGFuZCBzaW5jZSB3ZSdyZSBjdXJyZW50bHkgaW4gdGhlIG1pZGRsZSBvZgorCSAqIGEgZm9yayB3ZSBjYW4ndCBiZSBleGl0aW5nIGF0IHRoZSBzYW1lIHRpbWUuCisJICovCisKKwkvKgorCSAqIExvY2sgdGhlIHBhcmVudCBsaXN0LiBObyBuZWVkIHRvIGxvY2sgdGhlIGNoaWxkIC0gbm90IFBJRAorCSAqIGhhc2hlZCB5ZXQgYW5kIG5vdCBydW5uaW5nLCBzbyBub2JvZHkgY2FuIGFjY2VzcyBpdC4KKwkgKi8KKwltdXRleF9sb2NrKCZwYXJlbnRfY3R4LT5tdXRleCk7CisKKwkvKgorCSAqIFdlIGRvbnQgaGF2ZSB0byBkaXNhYmxlIE5NSXMgLSB3ZSBhcmUgb25seSBsb29raW5nIGF0CisJICogdGhlIGxpc3QsIG5vdCBtYW5pcHVsYXRpbmcgaXQ6CisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY291bnRlciwgJnBhcmVudF9jdHgtPmV2ZW50X2xpc3QsIGV2ZW50X2VudHJ5KSB7CisJCWlmIChjb3VudGVyICE9IGNvdW50ZXItPmdyb3VwX2xlYWRlcikKKwkJCWNvbnRpbnVlOworCisJCWlmICghY291bnRlci0+YXR0ci5pbmhlcml0KSB7CisJCQlpbmhlcml0ZWRfYWxsID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0ID0gaW5oZXJpdF9ncm91cChjb3VudGVyLCBwYXJlbnQsIHBhcmVudF9jdHgsCisJCQkJCSAgICAgY2hpbGQsIGNoaWxkX2N0eCk7CisJCWlmIChyZXQpIHsKKwkJCWluaGVyaXRlZF9hbGwgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoaW5oZXJpdGVkX2FsbCkgeworCQkvKgorCQkgKiBNYXJrIHRoZSBjaGlsZCBjb250ZXh0IGFzIGEgY2xvbmUgb2YgdGhlIHBhcmVudAorCQkgKiBjb250ZXh0LCBvciBvZiB3aGF0ZXZlciB0aGUgcGFyZW50IGlzIGEgY2xvbmUgb2YuCisJCSAqIE5vdGUgdGhhdCBpZiB0aGUgcGFyZW50IGlzIGEgY2xvbmUsIGl0IGNvdWxkIGdldAorCQkgKiB1bmNsb25lZCBhdCBhbnkgcG9pbnQsIGJ1dCB0aGF0IGRvZXNuJ3QgbWF0dGVyCisJCSAqIGJlY2F1c2UgdGhlIGxpc3Qgb2YgY291bnRlcnMgYW5kIHRoZSBnZW5lcmF0aW9uCisJCSAqIGNvdW50IGNhbid0IGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSB0b29rIHRoZSBtdXRleC4KKwkJICovCisJCWNsb25lZF9jdHggPSByY3VfZGVyZWZlcmVuY2UocGFyZW50X2N0eC0+cGFyZW50X2N0eCk7CisJCWlmIChjbG9uZWRfY3R4KSB7CisJCQljaGlsZF9jdHgtPnBhcmVudF9jdHggPSBjbG9uZWRfY3R4OworCQkJY2hpbGRfY3R4LT5wYXJlbnRfZ2VuID0gcGFyZW50X2N0eC0+cGFyZW50X2dlbjsKKwkJfSBlbHNlIHsKKwkJCWNoaWxkX2N0eC0+cGFyZW50X2N0eCA9IHBhcmVudF9jdHg7CisJCQljaGlsZF9jdHgtPnBhcmVudF9nZW4gPSBwYXJlbnRfY3R4LT5nZW5lcmF0aW9uOworCQl9CisJCWdldF9jdHgoY2hpbGRfY3R4LT5wYXJlbnRfY3R4KTsKKwl9CisKKwltdXRleF91bmxvY2soJnBhcmVudF9jdHgtPm11dGV4KTsKKworCXBlcmZfdW5waW5fY29udGV4dChwYXJlbnRfY3R4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBwZXJmX2NvdW50ZXJfaW5pdF9jcHUoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4OworCisJY3B1Y3R4ID0gJnBlcl9jcHUocGVyZl9jcHVfY29udGV4dCwgY3B1KTsKKwlfX3BlcmZfY291bnRlcl9pbml0X2NvbnRleHQoJmNwdWN0eC0+Y3R4LCBOVUxMKTsKKworCXNwaW5fbG9jaygmcGVyZl9yZXNvdXJjZV9sb2NrKTsKKwljcHVjdHgtPm1heF9wZXJ0YXNrID0gcGVyZl9tYXhfY291bnRlcnMgLSBwZXJmX3Jlc2VydmVkX3BlcmNwdTsKKwlzcGluX3VubG9jaygmcGVyZl9yZXNvdXJjZV9sb2NrKTsKKworCWh3X3BlcmZfY291bnRlcl9zZXR1cChjcHUpOworfQorCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgdm9pZCBfX3BlcmZfY291bnRlcl9leGl0X2NwdSh2b2lkICppbmZvKQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSAmX19nZXRfY3B1X3ZhcihwZXJmX2NwdV9jb250ZXh0KTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9ICZjcHVjdHgtPmN0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvdW50ZXIsIHRtcCwgJmN0eC0+Y291bnRlcl9saXN0LCBsaXN0X2VudHJ5KQorCQlfX3BlcmZfY291bnRlcl9yZW1vdmVfZnJvbV9jb250ZXh0KGNvdW50ZXIpOworfQorc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2V4aXRfY3B1KGludCBjcHUpCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9ICZwZXJfY3B1KHBlcmZfY3B1X2NvbnRleHQsIGNwdSk7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSAmY3B1Y3R4LT5jdHg7CisKKwltdXRleF9sb2NrKCZjdHgtPm11dGV4KTsKKwlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBfX3BlcmZfY291bnRlcl9leGl0X2NwdSwgTlVMTCwgMSk7CisJbXV0ZXhfdW5sb2NrKCZjdHgtPm11dGV4KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9jb3VudGVyX2V4aXRfY3B1KGludCBjcHUpIHsgfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19jcHVpbml0CitwZXJmX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gKGxvbmcpaGNwdTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisKKwljYXNlIENQVV9VUF9QUkVQQVJFOgorCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgorCQlwZXJmX2NvdW50ZXJfaW5pdF9jcHUoY3B1KTsKKwkJYnJlYWs7CisKKwljYXNlIENQVV9ET1dOX1BSRVBBUkU6CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFX0ZST1pFTjoKKwkJcGVyZl9jb3VudGVyX2V4aXRfY3B1KGNwdSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworLyoKKyAqIFRoaXMgaGFzIHRvIGhhdmUgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBtaWdyYXRpb25fbm90aWZpZXIgaW4gc2NoZWQuYy4KKyAqLworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2NwdWluaXRkYXRhIHBlcmZfY3B1X25iID0geworCS5ub3RpZmllcl9jYWxsCQk9IHBlcmZfY3B1X25vdGlmeSwKKwkucHJpb3JpdHkJCT0gMjAsCit9OworCit2b2lkIF9faW5pdCBwZXJmX2NvdW50ZXJfaW5pdCh2b2lkKQoreworCXBlcmZfY3B1X25vdGlmeSgmcGVyZl9jcHVfbmIsICh1bnNpZ25lZCBsb25nKUNQVV9VUF9QUkVQQVJFLAorCQkJKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOworCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmcGVyZl9jcHVfbmIpOworfQorCitzdGF0aWMgc3NpemVfdCBwZXJmX3Nob3dfcmVzZXJ2ZV9wZXJjcHUoc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xhc3MsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcGVyZl9yZXNlcnZlZF9wZXJjcHUpOworfQorCitzdGF0aWMgc3NpemVfdAorcGVyZl9zZXRfcmVzZXJ2ZV9wZXJjcHUoc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xhc3MsCisJCQljb25zdCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZXJyLCBjcHUsIG1wdDsKKworCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKHZhbCA+IHBlcmZfbWF4X2NvdW50ZXJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmcGVyZl9yZXNvdXJjZV9sb2NrKTsKKwlwZXJmX3Jlc2VydmVkX3BlcmNwdSA9IHZhbDsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQljcHVjdHggPSAmcGVyX2NwdShwZXJmX2NwdV9jb250ZXh0LCBjcHUpOworCQlzcGluX2xvY2tfaXJxKCZjcHVjdHgtPmN0eC5sb2NrKTsKKwkJbXB0ID0gbWluKHBlcmZfbWF4X2NvdW50ZXJzIC0gY3B1Y3R4LT5jdHgubnJfY291bnRlcnMsCisJCQkgIHBlcmZfbWF4X2NvdW50ZXJzIC0gcGVyZl9yZXNlcnZlZF9wZXJjcHUpOworCQljcHVjdHgtPm1heF9wZXJ0YXNrID0gbXB0OworCQlzcGluX3VubG9ja19pcnEoJmNwdWN0eC0+Y3R4LmxvY2spOworCX0KKwlzcGluX3VubG9jaygmcGVyZl9yZXNvdXJjZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgcGVyZl9zaG93X292ZXJjb21taXQoc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xhc3MsIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcGVyZl9vdmVyY29tbWl0KTsKK30KKworc3RhdGljIHNzaXplX3QKK3BlcmZfc2V0X292ZXJjb21taXQoc3RydWN0IHN5c2Rldl9jbGFzcyAqY2xhc3MsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBlcnI7CisKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmICh2YWwgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmcGVyZl9yZXNvdXJjZV9sb2NrKTsKKwlwZXJmX292ZXJjb21taXQgPSB2YWw7CisJc3Bpbl91bmxvY2soJnBlcmZfcmVzb3VyY2VfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBTWVNERVZfQ0xBU1NfQVRUUigKKwkJCQlyZXNlcnZlX3BlcmNwdSwKKwkJCQkwNjQ0LAorCQkJCXBlcmZfc2hvd19yZXNlcnZlX3BlcmNwdSwKKwkJCQlwZXJmX3NldF9yZXNlcnZlX3BlcmNwdQorCQkJKTsKKworc3RhdGljIFNZU0RFVl9DTEFTU19BVFRSKAorCQkJCW92ZXJjb21taXQsCisJCQkJMDY0NCwKKwkJCQlwZXJmX3Nob3dfb3ZlcmNvbW1pdCwKKwkJCQlwZXJmX3NldF9vdmVyY29tbWl0CisJCQkpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGVyZmNsYXNzX2F0dHJzW10gPSB7CisJJmF0dHJfcmVzZXJ2ZV9wZXJjcHUuYXR0ciwKKwkmYXR0cl9vdmVyY29tbWl0LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcGVyZmNsYXNzX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzCQkJPSBwZXJmY2xhc3NfYXR0cnMsCisJLm5hbWUJCQk9ICJwZXJmX2NvdW50ZXJzIiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBlcmZfY291bnRlcl9zeXNmc19pbml0KHZvaWQpCit7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmY3B1X3N5c2Rldl9jbGFzcy5rc2V0LmtvYmosCisJCQkJICAmcGVyZmNsYXNzX2F0dHJfZ3JvdXApOworfQorZGV2aWNlX2luaXRjYWxsKHBlcmZfY291bnRlcl9zeXNmc19pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcm9maWxlLmMgYi9rZXJuZWwvcHJvZmlsZS5jCmluZGV4IDc3MjRlMDQuLjI4Y2YyNmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wcm9maWxlLmMKKysrIGIva2VybmVsL3Byb2ZpbGUuYwpAQCAtMTExLDEyICsxMTEsNiBAQAogCS8qIG9ubHkgdGV4dCBpcyBwcm9maWxlZCAqLwogCXByb2ZfbGVuID0gKF9ldGV4dCAtIF9zdGV4dCkgPj4gcHJvZl9zaGlmdDsKIAlidWZmZXJfYnl0ZXMgPSBwcm9mX2xlbipzaXplb2YoYXRvbWljX3QpOwotCWlmICghc2xhYl9pc19hdmFpbGFibGUoKSkgewotCQlwcm9mX2J1ZmZlciA9IGFsbG9jX2Jvb3RtZW0oYnVmZmVyX2J5dGVzKTsKLQkJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmcHJvZl9jcHVfbWFzayk7Ci0JCWNwdW1hc2tfY29weShwcm9mX2NwdV9tYXNrLCBjcHVfcG9zc2libGVfbWFzayk7Ci0JCXJldHVybiAwOwotCX0KIAogCWlmICghYWxsb2NfY3B1bWFza192YXIoJnByb2ZfY3B1X21hc2ssIEdGUF9LRVJORUwpKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wdHJhY2UuYyBiL2tlcm5lbC9wdHJhY2UuYwppbmRleCA0MmMzMTc4Li5mNmQ4YjhjIDEwMDY0NAotLS0gYS9rZXJuZWwvcHRyYWNlLmMKKysrIGIva2VybmVsL3B0cmFjZS5jCkBAIC0yNSwxNiArMjUsNiBAQAogCiAKIC8qCi0gKiBJbml0aWFsaXplIGEgbmV3IHRhc2sgd2hvc2UgZmF0aGVyIGhhZCBiZWVuIHB0cmFjZWQuCi0gKgotICogQ2FsbGVkIGZyb20gY29weV9wcm9jZXNzKCkuCi0gKi8KLXZvaWQgcHRyYWNlX2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncykKLXsKLQlhcmNoX3B0cmFjZV9mb3JrKGNoaWxkLCBjbG9uZV9mbGFncyk7Ci19Ci0KLS8qCiAgKiBwdHJhY2UgYSB0YXNrOiBtYWtlIHRoZSBkZWJ1Z2dlciBpdHMgbmV3IHBhcmVudCBhbmQKICAqIG1vdmUgaXQgdG8gdGhlIHB0cmFjZSBsaXN0LgogICoKQEAgLTE4NSwxMCArMTc1LDExIEBACiAJaWYgKHNhbWVfdGhyZWFkX2dyb3VwKHRhc2ssIGN1cnJlbnQpKQogCQlnb3RvIG91dDsKIAotCS8qIFByb3RlY3QgZXhlYydzIGNyZWRlbnRpYWwgY2FsY3VsYXRpb25zIGFnYWluc3Qgb3VyIGludGVyZmVyZW5jZTsKLQkgKiBTVUlELCBTR0lEIGFuZCBMU00gY3JlZHMgZ2V0IGRldGVybWluZWQgZGlmZmVyZW50bHkgdW5kZXIgcHRyYWNlLgorCS8qIFByb3RlY3QgdGhlIHRhcmdldCdzIGNyZWRlbnRpYWwgY2FsY3VsYXRpb25zIGFnYWluc3Qgb3VyCisJICogaW50ZXJmZXJlbmNlOyBTVUlELCBTR0lEIGFuZCBMU00gY3JlZHMgZ2V0IGRldGVybWluZWQgZGlmZmVyZW50bHkKKwkgKiB1bmRlciBwdHJhY2UuCiAJICovCi0JcmV0dmFsID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZ0YXNrLT5jcmVkX2V4ZWNfbXV0ZXgpOworCXJldHZhbCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmdGFzay0+Y3JlZF9ndWFyZF9tdXRleCk7CiAJaWYgKHJldHZhbCAgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtMjMyLDcgKzIyMyw3IEBACiBiYWQ6CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnRhc2tsaXN0X2xvY2ssIGZsYWdzKTsKIAl0YXNrX3VubG9jayh0YXNrKTsKLQltdXRleF91bmxvY2soJnRhc2stPmNyZWRfZXhlY19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ0YXNrLT5jcmVkX2d1YXJkX211dGV4KTsKIG91dDoKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXByZWVtcHQuYyBiL2tlcm5lbC9yY3VwcmVlbXB0LmMKaW5kZXggY2U5N2E0ZC4uYmViMGU2NSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXByZWVtcHQuYworKysgYi9rZXJuZWwvcmN1cHJlZW1wdC5jCkBAIC0xMzU2LDE3ICsxMzU2LDExIEBACiAKIAkJcmN1X2N0cmxibGsuc2NoZWRfc2xlZXAgPSByY3Vfc2NoZWRfc2xlZXBpbmc7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJjdV9jdHJsYmxrLnNjaGVkbG9jaywgZmxhZ3MpOwotCQlyZXQgPSAwOworCQlyZXQgPSAwOyAvKiB1bnVzZWQgKi8KIAkJX193YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmN1X2N0cmxibGsuc2NoZWRfd3EsCiAJCQlyY3VfY3RybGJsay5zY2hlZF9zbGVlcCAhPSByY3Vfc2NoZWRfc2xlZXBpbmcsCiAJCQlyZXQpOwogCi0JCS8qCi0JCSAqIFNpZ25hbHMgd291bGQgcHJldmVudCB1cyBmcm9tIHNsZWVwaW5nLCBhbmQgd2UgY2Fubm90Ci0JCSAqIGRvIG11Y2ggd2l0aCB0aGVtIGluIGFueSBjYXNlLiAgU28gZmx1c2ggdGhlbS4KLQkJICovCi0JCWlmIChyZXQpCi0JCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCQljb3VsZHNsZWVwbmV4dCA9IDA7CiAKIAl9IHdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlLmMgYi9rZXJuZWwvcmN1dHJlZS5jCmluZGV4IGQyYTM3MmYuLjBkY2NmYmIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlLmMKKysrIGIva2VybmVsL3JjdXRyZWUuYwpAQCAtMTI1OSwzMSArMTI1OSw0NCBAQAogCWNoZWNrX2NwdV9zdGFsbChyc3AsIHJkcCk7CiAKIAkvKiBJcyB0aGUgUkNVIGNvcmUgd2FpdGluZyBmb3IgYSBxdWllc2NlbnQgc3RhdGUgZnJvbSB0aGlzIENQVT8gKi8KLQlpZiAocmRwLT5xc19wZW5kaW5nKQorCWlmIChyZHAtPnFzX3BlbmRpbmcpIHsKKwkJcmRwLT5uX3JwX3FzX3BlbmRpbmcrKzsKIAkJcmV0dXJuIDE7CisJfQogCiAJLyogRG9lcyB0aGlzIENQVSBoYXZlIGNhbGxiYWNrcyByZWFkeSB0byBpbnZva2U/ICovCi0JaWYgKGNwdV9oYXNfY2FsbGJhY2tzX3JlYWR5X3RvX2ludm9rZShyZHApKQorCWlmIChjcHVfaGFzX2NhbGxiYWNrc19yZWFkeV90b19pbnZva2UocmRwKSkgeworCQlyZHAtPm5fcnBfY2JfcmVhZHkrKzsKIAkJcmV0dXJuIDE7CisJfQogCiAJLyogSGFzIFJDVSBnb25lIGlkbGUgd2l0aCB0aGlzIENQVSBuZWVkaW5nIGFub3RoZXIgZ3JhY2UgcGVyaW9kPyAqLwotCWlmIChjcHVfbmVlZHNfYW5vdGhlcl9ncChyc3AsIHJkcCkpCisJaWYgKGNwdV9uZWVkc19hbm90aGVyX2dwKHJzcCwgcmRwKSkgeworCQlyZHAtPm5fcnBfY3B1X25lZWRzX2dwKys7CiAJCXJldHVybiAxOworCX0KIAogCS8qIEhhcyBhbm90aGVyIFJDVSBncmFjZSBwZXJpb2QgY29tcGxldGVkPyAgKi8KLQlpZiAoQUNDRVNTX09OQ0UocnNwLT5jb21wbGV0ZWQpICE9IHJkcC0+Y29tcGxldGVkKSAvKiBvdXRzaWRlIG9mIGxvY2sgKi8KKwlpZiAoQUNDRVNTX09OQ0UocnNwLT5jb21wbGV0ZWQpICE9IHJkcC0+Y29tcGxldGVkKSB7IC8qIG91dHNpZGUgbG9jayAqLworCQlyZHAtPm5fcnBfZ3BfY29tcGxldGVkKys7CiAJCXJldHVybiAxOworCX0KIAogCS8qIEhhcyBhIG5ldyBSQ1UgZ3JhY2UgcGVyaW9kIHN0YXJ0ZWQ/ICovCi0JaWYgKEFDQ0VTU19PTkNFKHJzcC0+Z3BudW0pICE9IHJkcC0+Z3BudW0pIC8qIG91dHNpZGUgb2YgbG9jayAqLworCWlmIChBQ0NFU1NfT05DRShyc3AtPmdwbnVtKSAhPSByZHAtPmdwbnVtKSB7IC8qIG91dHNpZGUgbG9jayAqLworCQlyZHAtPm5fcnBfZ3Bfc3RhcnRlZCsrOwogCQlyZXR1cm4gMTsKKwl9CiAKIAkvKiBIYXMgYW4gUkNVIEdQIGdvbmUgbG9uZyBlbm91Z2ggdG8gc2VuZCByZXNjaGVkIElQSXMgJmM/ICovCiAJaWYgKEFDQ0VTU19PTkNFKHJzcC0+Y29tcGxldGVkKSAhPSBBQ0NFU1NfT05DRShyc3AtPmdwbnVtKSAmJgotCSAgICAoKGxvbmcpKEFDQ0VTU19PTkNFKHJzcC0+amlmZmllc19mb3JjZV9xcykgLSBqaWZmaWVzKSA8IDApKQorCSAgICAoKGxvbmcpKEFDQ0VTU19PTkNFKHJzcC0+amlmZmllc19mb3JjZV9xcykgLSBqaWZmaWVzKSA8IDApKSB7CisJCXJkcC0+bl9ycF9uZWVkX2ZxcysrOwogCQlyZXR1cm4gMTsKKwl9CiAKIAkvKiBub3RoaW5nIHRvIGRvICovCisJcmRwLT5uX3JwX25lZWRfbm90aGluZysrOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1dHJlZV90cmFjZS5jIGIva2VybmVsL3JjdXRyZWVfdHJhY2UuYwppbmRleCA0YjE4NzViLi5mZTFkY2RiIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCisrKyBiL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMKQEAgLTIxMyw3ICsyMTMsNjMgQEAKIAkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAogfTsKIAotc3RhdGljIHN0cnVjdCBkZW50cnkgKnJjdWRpciwgKmRhdGFkaXIsICpkYXRhZGlyX2NzdiwgKmhpZXJkaXIsICpncGRpcjsKK3N0YXRpYyB2b2lkIHByaW50X29uZV9yY3VfcGVuZGluZyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCByY3VfZGF0YSAqcmRwKQoreworCXNlcV9wcmludGYobSwgIiUzZCVjbnA9JWxkICIKKwkJICAgInFzcD0lbGQgY2JyPSVsZCBjbmc9JWxkIGdwYz0lbGQgZ3BzPSVsZCBuZj0lbGQgbm49JWxkXG4iLAorCQkgICByZHAtPmNwdSwKKwkJICAgY3B1X2lzX29mZmxpbmUocmRwLT5jcHUpID8gJyEnIDogJyAnLAorCQkgICByZHAtPm5fcmN1X3BlbmRpbmcsCisJCSAgIHJkcC0+bl9ycF9xc19wZW5kaW5nLAorCQkgICByZHAtPm5fcnBfY2JfcmVhZHksCisJCSAgIHJkcC0+bl9ycF9jcHVfbmVlZHNfZ3AsCisJCSAgIHJkcC0+bl9ycF9ncF9jb21wbGV0ZWQsCisJCSAgIHJkcC0+bl9ycF9ncF9zdGFydGVkLAorCQkgICByZHAtPm5fcnBfbmVlZF9mcXMsCisJCSAgIHJkcC0+bl9ycF9uZWVkX25vdGhpbmcpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9yY3VfcGVuZGluZ3Moc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcmN1X3N0YXRlICpyc3ApCit7CisJaW50IGNwdTsKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcDsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJcmRwID0gcnNwLT5yZGFbY3B1XTsKKwkJaWYgKHJkcC0+YmVlbm9ubGluZSkKKwkJCXByaW50X29uZV9yY3VfcGVuZGluZyhtLCByZHApOworCX0KK30KKworc3RhdGljIGludCBzaG93X3JjdV9wZW5kaW5nKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQoreworCXNlcV9wdXRzKG0sICJyY3U6XG4iKTsKKwlwcmludF9yY3VfcGVuZGluZ3MobSwgJnJjdV9zdGF0ZSk7CisJc2VxX3B1dHMobSwgInJjdV9iaDpcbiIpOworCXByaW50X3JjdV9wZW5kaW5ncyhtLCAmcmN1X2JoX3N0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByY3VfcGVuZGluZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzaG93X3JjdV9wZW5kaW5nLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmN1X3BlbmRpbmdfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHJjdV9wZW5kaW5nX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcmN1ZGlyOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRhdGFkaXI7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGF0YWRpcl9jc3Y7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZ3BkaXI7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqaGllcmRpcjsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpyY3VfcGVuZGluZ2RpcjsKKwogc3RhdGljIGludCBfX2luaXQgcmN1Y2xhc3NpY190cmFjZV9pbml0KHZvaWQpCiB7CiAJcmN1ZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJyY3UiLCBOVUxMKTsKQEAgLTIzOCw2ICsyOTQsMTEgQEAKIAkJCQkJCU5VTEwsICZyY3VoaWVyX2ZvcHMpOwogCWlmICghaGllcmRpcikKIAkJZ290byBmcmVlX291dDsKKworCXJjdV9wZW5kaW5nZGlyID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmN1X3BlbmRpbmciLCAwNDQ0LCByY3VkaXIsCisJCQkJCQlOVUxMLCAmcmN1X3BlbmRpbmdfZm9wcyk7CisJaWYgKCFyY3VfcGVuZGluZ2RpcikKKwkJZ290byBmcmVlX291dDsKIAlyZXR1cm4gMDsKIGZyZWVfb3V0OgogCWlmIChkYXRhZGlyKQpAQCAtMjU3LDYgKzMxOCw3IEBACiAJZGVidWdmc19yZW1vdmUoZGF0YWRpcl9jc3YpOwogCWRlYnVnZnNfcmVtb3ZlKGdwZGlyKTsKIAlkZWJ1Z2ZzX3JlbW92ZShoaWVyZGlyKTsKKwlkZWJ1Z2ZzX3JlbW92ZShyY3VfcGVuZGluZ2Rpcik7CiAJZGVidWdmc19yZW1vdmUocmN1ZGlyKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggNjlkOWNiOS4uODIwYzVhZiAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC0zMDAsNyArMzAwLDggQEAKICAqIGFzc2lnbmVkIHBlbmRpbmcgb3duZXIgW3doaWNoIG1pZ2h0IG5vdCBoYXZlIHRha2VuIHRoZQogICogbG9jayB5ZXRdOgogICovCi1zdGF0aWMgaW5saW5lIGludCB0cnlfdG9fc3RlYWxfbG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2spCitzdGF0aWMgaW5saW5lIGludCB0cnlfdG9fc3RlYWxfbG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssCisJCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBlbmRvd25lciA9IHJ0X211dGV4X293bmVyKGxvY2spOwogCXN0cnVjdCBydF9tdXRleF93YWl0ZXIgKm5leHQ7CkBAIC0zMDksMTEgKzMxMCwxMSBAQAogCWlmICghcnRfbXV0ZXhfb3duZXJfcGVuZGluZyhsb2NrKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAocGVuZG93bmVyID09IGN1cnJlbnQpCisJaWYgKHBlbmRvd25lciA9PSB0YXNrKQogCQlyZXR1cm4gMTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZW5kb3duZXItPnBpX2xvY2ssIGZsYWdzKTsKLQlpZiAoY3VycmVudC0+cHJpbyA+PSBwZW5kb3duZXItPnByaW8pIHsKKwlpZiAodGFzay0+cHJpbyA+PSBwZW5kb3duZXItPnByaW8pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVuZG93bmVyLT5waV9sb2NrLCBmbGFncyk7CiAJCXJldHVybiAwOwogCX0KQEAgLTMzOCwyMSArMzM5LDIxIEBACiAJICogV2UgYXJlIGdvaW5nIHRvIHN0ZWFsIHRoZSBsb2NrIGFuZCBhIHdhaXRlciB3YXMKIAkgKiBlbnF1ZXVlZCBvbiB0aGUgcGVuZGluZyBvd25lcnMgcGlfd2FpdGVycyBxdWV1ZS4gU28KIAkgKiB3ZSBoYXZlIHRvIGVucXVldWUgdGhpcyB3YWl0ZXIgaW50bwotCSAqIGN1cnJlbnQtPnBpX3dhaXRlcnMgbGlzdC4gVGhpcyBjb3ZlcnMgdGhlIGNhc2UsCi0JICogd2hlcmUgY3VycmVudCBpcyBib29zdGVkIGJlY2F1c2UgaXQgaG9sZHMgYW5vdGhlcgorCSAqIHRhc2stPnBpX3dhaXRlcnMgbGlzdC4gVGhpcyBjb3ZlcnMgdGhlIGNhc2UsCisJICogd2hlcmUgdGFzayBpcyBib29zdGVkIGJlY2F1c2UgaXQgaG9sZHMgYW5vdGhlcgogCSAqIGxvY2sgYW5kIGdldHMgdW5ib29zdGVkIGJlY2F1c2UgdGhlIGJvb3N0ZXIgaXMKIAkgKiBpbnRlcnJ1cHRlZCwgc28gd2Ugd291bGQgZGVsYXkgYSB3YWl0ZXIgd2l0aCBoaWdoZXIKLQkgKiBwcmlvcml0eSBhcyBjdXJyZW50LT5ub3JtYWxfcHJpby4KKwkgKiBwcmlvcml0eSBhcyB0YXNrLT5ub3JtYWxfcHJpby4KIAkgKgogCSAqIE5vdGU6IGluIHRoZSByYXJlIGNhc2Ugb2YgYSBTQ0hFRF9PVEhFUiB0YXNrIGNoYW5naW5nCiAJICogaXRzIHByaW9yaXR5IGFuZCB0aHVzIHN0ZWFsaW5nIHRoZSBsb2NrLCBuZXh0LT50YXNrCi0JICogbWlnaHQgYmUgY3VycmVudDoKKwkgKiBtaWdodCBiZSB0YXNrOgogCSAqLwotCWlmIChsaWtlbHkobmV4dC0+dGFzayAhPSBjdXJyZW50KSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+cGlfbG9jaywgZmxhZ3MpOwotCQlwbGlzdF9hZGQoJm5leHQtPnBpX2xpc3RfZW50cnksICZjdXJyZW50LT5waV93YWl0ZXJzKTsKLQkJX19ydF9tdXRleF9hZGp1c3RfcHJpbyhjdXJyZW50KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+cGlfbG9jaywgZmxhZ3MpOworCWlmIChsaWtlbHkobmV4dC0+dGFzayAhPSB0YXNrKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGFzay0+cGlfbG9jaywgZmxhZ3MpOworCQlwbGlzdF9hZGQoJm5leHQtPnBpX2xpc3RfZW50cnksICZ0YXNrLT5waV93YWl0ZXJzKTsKKwkJX19ydF9tdXRleF9hZGp1c3RfcHJpbyh0YXNrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+cGlfbG9jaywgZmxhZ3MpOwogCX0KIAlyZXR1cm4gMTsKIH0KQEAgLTM4OSw3ICszOTAsNyBAQAogCSAqLwogCW1hcmtfcnRfbXV0ZXhfd2FpdGVycyhsb2NrKTsKIAotCWlmIChydF9tdXRleF9vd25lcihsb2NrKSAmJiAhdHJ5X3RvX3N0ZWFsX2xvY2sobG9jaykpCisJaWYgKHJ0X211dGV4X293bmVyKGxvY2spICYmICF0cnlfdG9fc3RlYWxfbG9jayhsb2NrLCBjdXJyZW50KSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBXZSBnb3QgdGhlIGxvY2suICovCkBAIC00MTEsNiArNDEyLDcgQEAKICAqLwogc3RhdGljIGludCB0YXNrX2Jsb2Nrc19vbl9ydF9tdXRleChzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssCiAJCQkJICAgc3RydWN0IHJ0X211dGV4X3dhaXRlciAqd2FpdGVyLAorCQkJCSAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJCQkgICBpbnQgZGV0ZWN0X2RlYWRsb2NrKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXIgPSBydF9tdXRleF9vd25lcihsb2NrKTsKQEAgLTQxOCwyMSArNDIwLDIxIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY2hhaW5fd2FsayA9IDAsIHJlczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5waV9sb2NrLCBmbGFncyk7Ci0JX19ydF9tdXRleF9hZGp1c3RfcHJpbyhjdXJyZW50KTsKLQl3YWl0ZXItPnRhc2sgPSBjdXJyZW50OworCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT5waV9sb2NrLCBmbGFncyk7CisJX19ydF9tdXRleF9hZGp1c3RfcHJpbyh0YXNrKTsKKwl3YWl0ZXItPnRhc2sgPSB0YXNrOwogCXdhaXRlci0+bG9jayA9IGxvY2s7Ci0JcGxpc3Rfbm9kZV9pbml0KCZ3YWl0ZXItPmxpc3RfZW50cnksIGN1cnJlbnQtPnByaW8pOwotCXBsaXN0X25vZGVfaW5pdCgmd2FpdGVyLT5waV9saXN0X2VudHJ5LCBjdXJyZW50LT5wcmlvKTsKKwlwbGlzdF9ub2RlX2luaXQoJndhaXRlci0+bGlzdF9lbnRyeSwgdGFzay0+cHJpbyk7CisJcGxpc3Rfbm9kZV9pbml0KCZ3YWl0ZXItPnBpX2xpc3RfZW50cnksIHRhc2stPnByaW8pOwogCiAJLyogR2V0IHRoZSB0b3AgcHJpb3JpdHkgd2FpdGVyIG9uIHRoZSBsb2NrICovCiAJaWYgKHJ0X211dGV4X2hhc193YWl0ZXJzKGxvY2spKQogCQl0b3Bfd2FpdGVyID0gcnRfbXV0ZXhfdG9wX3dhaXRlcihsb2NrKTsKIAlwbGlzdF9hZGQoJndhaXRlci0+bGlzdF9lbnRyeSwgJmxvY2stPndhaXRfbGlzdCk7CiAKLQljdXJyZW50LT5waV9ibG9ja2VkX29uID0gd2FpdGVyOworCXRhc2stPnBpX2Jsb2NrZWRfb24gPSB3YWl0ZXI7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5waV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGFzay0+cGlfbG9jaywgZmxhZ3MpOwogCiAJaWYgKHdhaXRlciA9PSBydF9tdXRleF90b3Bfd2FpdGVyKGxvY2spKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZvd25lci0+cGlfbG9jaywgZmxhZ3MpOwpAQCAtNDYwLDcgKzQ2Miw3IEBACiAJc3Bpbl91bmxvY2soJmxvY2stPndhaXRfbG9jayk7CiAKIAlyZXMgPSBydF9tdXRleF9hZGp1c3RfcHJpb19jaGFpbihvd25lciwgZGV0ZWN0X2RlYWRsb2NrLCBsb2NrLCB3YWl0ZXIsCi0JCQkJCSBjdXJyZW50KTsKKwkJCQkJIHRhc2spOwogCiAJc3Bpbl9sb2NrKCZsb2NrLT53YWl0X2xvY2spOwogCkBAIC02MDUsNiArNjA3LDg1IEBACiAJcnRfbXV0ZXhfYWRqdXN0X3ByaW9fY2hhaW4odGFzaywgMCwgTlVMTCwgTlVMTCwgdGFzayk7CiB9CiAKKy8qKgorICogX19ydF9tdXRleF9zbG93bG9jaygpIC0gUGVyZm9ybSB0aGUgd2FpdC13YWtlLXRyeS10by10YWtlIGxvb3AKKyAqIEBsb2NrOgkJIHRoZSBydF9tdXRleCB0byB0YWtlCisgKiBAc3RhdGU6CQkgdGhlIHN0YXRlIHRoZSB0YXNrIHNob3VsZCBibG9jayBpbiAoVEFTS19JTlRFUlJVUFRJQkxFCisgKiAJCQkgb3IgVEFTS19VTklOVEVSUlVQVElCTEUpCisgKiBAdGltZW91dDoJCSB0aGUgcHJlLWluaXRpYWxpemVkIGFuZCBzdGFydGVkIHRpbWVyLCBvciBOVUxMIGZvciBub25lCisgKiBAd2FpdGVyOgkJIHRoZSBwcmUtaW5pdGlhbGl6ZWQgcnRfbXV0ZXhfd2FpdGVyCisgKiBAZGV0ZWN0X2RlYWRsb2NrOgkgcGFzc2VkIHRvIHRhc2tfYmxvY2tzX29uX3J0X211dGV4CisgKgorICogbG9jay0+d2FpdF9sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgaW50IF9fc2NoZWQKK19fcnRfbXV0ZXhfc2xvd2xvY2soc3RydWN0IHJ0X211dGV4ICpsb2NrLCBpbnQgc3RhdGUsCisJCSAgICBzdHJ1Y3QgaHJ0aW1lcl9zbGVlcGVyICp0aW1lb3V0LAorCQkgICAgc3RydWN0IHJ0X211dGV4X3dhaXRlciAqd2FpdGVyLAorCQkgICAgaW50IGRldGVjdF9kZWFkbG9jaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoOzspIHsKKwkJLyogVHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2s6ICovCisJCWlmICh0cnlfdG9fdGFrZV9ydF9tdXRleChsb2NrKSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFRBU0tfSU5URVJSVVBUSUJMRSBjaGVja3MgZm9yIHNpZ25hbHMgYW5kCisJCSAqIHRpbWVvdXQuIElnbm9yZWQgb3RoZXJ3aXNlLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHN0YXRlID09IFRBU0tfSU5URVJSVVBUSUJMRSkpIHsKKwkJCS8qIFNpZ25hbCBwZW5kaW5nPyAqLworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldCA9IC1FSU5UUjsKKwkJCWlmICh0aW1lb3V0ICYmICF0aW1lb3V0LT50YXNrKQorCQkJCXJldCA9IC1FVElNRURPVVQ7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogd2FpdGVyLT50YXNrIGlzIE5VTEwgdGhlIGZpcnN0IHRpbWUgd2UgY29tZSBoZXJlIGFuZAorCQkgKiB3aGVuIHdlIGhhdmUgYmVlbiB3b2tlbiB1cCBieSB0aGUgcHJldmlvdXMgb3duZXIKKwkJICogYnV0IHRoZSBsb2NrIGdvdCBzdG9sZW4gYnkgYSBoaWdoZXIgcHJpbyB0YXNrLgorCQkgKi8KKwkJaWYgKCF3YWl0ZXItPnRhc2spIHsKKwkJCXJldCA9IHRhc2tfYmxvY2tzX29uX3J0X211dGV4KGxvY2ssIHdhaXRlciwgY3VycmVudCwKKwkJCQkJCSAgICAgIGRldGVjdF9kZWFkbG9jayk7CisJCQkvKgorCQkJICogSWYgd2UgZ290IHdva2VuIHVwIGJ5IHRoZSBvd25lciB0aGVuIHN0YXJ0IGxvb3AKKwkJCSAqIGFsbCBvdmVyIHdpdGhvdXQgZ29pbmcgaW50byBzY2hlZHVsZSB0byB0cnkKKwkJCSAqIHRvIGdldCB0aGUgbG9jayBub3c6CisJCQkgKi8KKwkJCWlmICh1bmxpa2VseSghd2FpdGVyLT50YXNrKSkgeworCQkJCS8qCisJCQkJICogUmVzZXQgdGhlIHJldHVybiB2YWx1ZS4gV2UgbWlnaHQKKwkJCQkgKiBoYXZlIHJldHVybmVkIHdpdGggLUVERUFETEsgYW5kIHRoZQorCQkJCSAqIG93bmVyIHJlbGVhc2VkIHRoZSBsb2NrIHdoaWxlIHdlCisJCQkJICogd2VyZSB3YWxraW5nIHRoZSBwaSBjaGFpbi4KKwkJCQkgKi8KKwkJCQlyZXQgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHVubGlrZWx5KHJldCkpCisJCQkJYnJlYWs7CisJCX0KKworCQlzcGluX3VubG9jaygmbG9jay0+d2FpdF9sb2NrKTsKKworCQlkZWJ1Z19ydF9tdXRleF9wcmludF9kZWFkbG9jayh3YWl0ZXIpOworCisJCWlmICh3YWl0ZXItPnRhc2spCisJCQlzY2hlZHVsZV9ydF9tdXRleChsb2NrKTsKKworCQlzcGluX2xvY2soJmxvY2stPndhaXRfbG9jayk7CisJCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogU2xvdyBwYXRoIGxvY2sgZnVuY3Rpb246CiAgKi8KQEAgLTYzNiw2MiArNzE3LDggQEAKIAkJCXRpbWVvdXQtPnRhc2sgPSBOVUxMOwogCX0KIAotCWZvciAoOzspIHsKLQkJLyogVHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2s6ICovCi0JCWlmICh0cnlfdG9fdGFrZV9ydF9tdXRleChsb2NrKSkKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIFRBU0tfSU5URVJSVVBUSUJMRSBjaGVja3MgZm9yIHNpZ25hbHMgYW5kCi0JCSAqIHRpbWVvdXQuIElnbm9yZWQgb3RoZXJ3aXNlLgotCQkgKi8KLQkJaWYgKHVubGlrZWx5KHN0YXRlID09IFRBU0tfSU5URVJSVVBUSUJMRSkpIHsKLQkJCS8qIFNpZ25hbCBwZW5kaW5nPyAqLwotCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJCXJldCA9IC1FSU5UUjsKLQkJCWlmICh0aW1lb3V0ICYmICF0aW1lb3V0LT50YXNrKQotCQkJCXJldCA9IC1FVElNRURPVVQ7Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogd2FpdGVyLnRhc2sgaXMgTlVMTCB0aGUgZmlyc3QgdGltZSB3ZSBjb21lIGhlcmUgYW5kCi0JCSAqIHdoZW4gd2UgaGF2ZSBiZWVuIHdva2VuIHVwIGJ5IHRoZSBwcmV2aW91cyBvd25lcgotCQkgKiBidXQgdGhlIGxvY2sgZ290IHN0b2xlbiBieSBhIGhpZ2hlciBwcmlvIHRhc2suCi0JCSAqLwotCQlpZiAoIXdhaXRlci50YXNrKSB7Ci0JCQlyZXQgPSB0YXNrX2Jsb2Nrc19vbl9ydF9tdXRleChsb2NrLCAmd2FpdGVyLAotCQkJCQkJICAgICAgZGV0ZWN0X2RlYWRsb2NrKTsKLQkJCS8qCi0JCQkgKiBJZiB3ZSBnb3Qgd29rZW4gdXAgYnkgdGhlIG93bmVyIHRoZW4gc3RhcnQgbG9vcAotCQkJICogYWxsIG92ZXIgd2l0aG91dCBnb2luZyBpbnRvIHNjaGVkdWxlIHRvIHRyeQotCQkJICogdG8gZ2V0IHRoZSBsb2NrIG5vdzoKLQkJCSAqLwotCQkJaWYgKHVubGlrZWx5KCF3YWl0ZXIudGFzaykpIHsKLQkJCQkvKgotCQkJCSAqIFJlc2V0IHRoZSByZXR1cm4gdmFsdWUuIFdlIG1pZ2h0Ci0JCQkJICogaGF2ZSByZXR1cm5lZCB3aXRoIC1FREVBRExLIGFuZCB0aGUKLQkJCQkgKiBvd25lciByZWxlYXNlZCB0aGUgbG9jayB3aGlsZSB3ZQotCQkJCSAqIHdlcmUgd2Fsa2luZyB0aGUgcGkgY2hhaW4uCi0JCQkJICovCi0JCQkJcmV0ID0gMDsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICh1bmxpa2VseShyZXQpKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2soJmxvY2stPndhaXRfbG9jayk7Ci0KLQkJZGVidWdfcnRfbXV0ZXhfcHJpbnRfZGVhZGxvY2soJndhaXRlcik7Ci0KLQkJaWYgKHdhaXRlci50YXNrKQotCQkJc2NoZWR1bGVfcnRfbXV0ZXgobG9jayk7Ci0KLQkJc3Bpbl9sb2NrKCZsb2NrLT53YWl0X2xvY2spOwotCQlzZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7Ci0JfQorCXJldCA9IF9fcnRfbXV0ZXhfc2xvd2xvY2sobG9jaywgc3RhdGUsIHRpbWVvdXQsICZ3YWl0ZXIsCisJCQkJICBkZXRlY3RfZGVhZGxvY2spOwogCiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIApAQCAtODY0LDkgKzg5MSw5IEBACiBFWFBPUlRfU1lNQk9MX0dQTChydF9tdXRleF9sb2NrX2ludGVycnVwdGlibGUpOwogCiAvKioKLSAqIHJ0X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZV9rdGltZSAtIGxvY2sgYSBydF9tdXRleCBpbnRlcnJ1cHRpYmxlCi0gKgkJCQkgICAgICAgdGhlIHRpbWVvdXQgc3RydWN0dXJlIGlzIHByb3ZpZGVkCi0gKgkJCQkgICAgICAgYnkgdGhlIGNhbGxlcgorICogcnRfbXV0ZXhfdGltZWRfbG9jayAtIGxvY2sgYSBydF9tdXRleCBpbnRlcnJ1cHRpYmxlCisgKgkJCXRoZSB0aW1lb3V0IHN0cnVjdHVyZSBpcyBwcm92aWRlZAorICoJCQlieSB0aGUgY2FsbGVyCiAgKgogICogQGxvY2s6IAkJdGhlIHJ0X211dGV4IHRvIGJlIGxvY2tlZAogICogQHRpbWVvdXQ6CQl0aW1lb3V0IHN0cnVjdHVyZSBvciBOVUxMIChubyB0aW1lb3V0KQpAQCAtOTEzLDcgKzk0MCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydF9tdXRleF91bmxvY2spOwogCi0vKioqCisvKioKICAqIHJ0X211dGV4X2Rlc3Ryb3kgLSBtYXJrIGEgbXV0ZXggdW51c2FibGUKICAqIEBsb2NrOiB0aGUgbXV0ZXggdG8gYmUgZGVzdHJveWVkCiAgKgpAQCAtOTg2LDYgKzEwMTMsNTkgQEAKIH0KIAogLyoqCisgKiBydF9tdXRleF9zdGFydF9wcm94eV9sb2NrKCkgLSBTdGFydCBsb2NrIGFjcXVpc2l0aW9uIGZvciBhbm90aGVyIHRhc2sKKyAqIEBsb2NrOgkJdGhlIHJ0X211dGV4IHRvIHRha2UKKyAqIEB3YWl0ZXI6CQl0aGUgcHJlLWluaXRpYWxpemVkIHJ0X211dGV4X3dhaXRlcgorICogQHRhc2s6CQl0aGUgdGFzayB0byBwcmVwYXJlCisgKiBAZGV0ZWN0X2RlYWRsb2NrOglwZXJmb3JtIGRlYWRsb2NrIGRldGVjdGlvbiAoMSkgb3Igbm90ICgwKQorICoKKyAqIFJldHVybnM6CisgKiAgMCAtIHRhc2sgYmxvY2tlZCBvbiBsb2NrCisgKiAgMSAtIGFjcXVpcmVkIHRoZSBsb2NrIGZvciB0YXNrLCBjYWxsZXIgc2hvdWxkIHdha2UgaXQgdXAKKyAqIDwwIC0gZXJyb3IKKyAqCisgKiBTcGVjaWFsIEFQSSBjYWxsIGZvciBGVVRFWF9SRVFVRVVFX1BJIHN1cHBvcnQuCisgKi8KK2ludCBydF9tdXRleF9zdGFydF9wcm94eV9sb2NrKHN0cnVjdCBydF9tdXRleCAqbG9jaywKKwkJCSAgICAgIHN0cnVjdCBydF9tdXRleF93YWl0ZXIgKndhaXRlciwKKwkJCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGRldGVjdF9kZWFkbG9jaykKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZsb2NrLT53YWl0X2xvY2spOworCisJbWFya19ydF9tdXRleF93YWl0ZXJzKGxvY2spOworCisJaWYgKCFydF9tdXRleF9vd25lcihsb2NrKSB8fCB0cnlfdG9fc3RlYWxfbG9jayhsb2NrLCB0YXNrKSkgeworCQkvKiBXZSBnb3QgdGhlIGxvY2sgZm9yIHRhc2suICovCisJCWRlYnVnX3J0X211dGV4X2xvY2sobG9jayk7CisKKwkJcnRfbXV0ZXhfc2V0X293bmVyKGxvY2ssIHRhc2ssIDApOworCisJCXJ0X211dGV4X2RlYWRsb2NrX2FjY291bnRfbG9jayhsb2NrLCB0YXNrKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0ID0gdGFza19ibG9ja3Nfb25fcnRfbXV0ZXgobG9jaywgd2FpdGVyLCB0YXNrLCBkZXRlY3RfZGVhZGxvY2spOworCisKKwlpZiAocmV0ICYmICF3YWl0ZXItPnRhc2spIHsKKwkJLyoKKwkJICogUmVzZXQgdGhlIHJldHVybiB2YWx1ZS4gV2UgbWlnaHQgaGF2ZQorCQkgKiByZXR1cm5lZCB3aXRoIC1FREVBRExLIGFuZCB0aGUgb3duZXIKKwkJICogcmVsZWFzZWQgdGhlIGxvY2sgd2hpbGUgd2Ugd2VyZSB3YWxraW5nIHRoZQorCQkgKiBwaSBjaGFpbi4gIExldCB0aGUgd2FpdGVyIHNvcnQgaXQgb3V0LgorCQkgKi8KKwkJcmV0ID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJmxvY2stPndhaXRfbG9jayk7CisKKwlkZWJ1Z19ydF9tdXRleF9wcmludF9kZWFkbG9jayh3YWl0ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCiAgKiBydF9tdXRleF9uZXh0X293bmVyIC0gcmV0dXJuIHRoZSBuZXh0IG93bmVyIG9mIHRoZSBsb2NrCiAgKgogICogQGxvY2s6IHRoZSBydCBsb2NrIHF1ZXJ5CkBAIC0xMDA0LDMgKzEwODQsNTcgQEAKIAogCXJldHVybiBydF9tdXRleF90b3Bfd2FpdGVyKGxvY2spLT50YXNrOwogfQorCisvKioKKyAqIHJ0X211dGV4X2ZpbmlzaF9wcm94eV9sb2NrKCkgLSBDb21wbGV0ZSBsb2NrIGFjcXVpc2l0aW9uCisgKiBAbG9jazoJCXRoZSBydF9tdXRleCB3ZSB3ZXJlIHdva2VuIG9uCisgKiBAdG86CQkJdGhlIHRpbWVvdXQsIG51bGwgaWYgbm9uZS4gaHJ0aW1lciBzaG91bGQgYWxyZWFkeSBoYXZlCisgKiAJCQliZWVuIHN0YXJ0ZWQuCisgKiBAd2FpdGVyOgkJdGhlIHByZS1pbml0aWFsaXplZCBydF9tdXRleF93YWl0ZXIKKyAqIEBkZXRlY3RfZGVhZGxvY2s6CXBlcmZvcm0gZGVhZGxvY2sgZGV0ZWN0aW9uICgxKSBvciBub3QgKDApCisgKgorICogQ29tcGxldGUgdGhlIGxvY2sgYWNxdWlzaXRpb24gc3RhcnRlZCBvdXIgYmVoYWxmIGJ5IGFub3RoZXIgdGhyZWFkLgorICoKKyAqIFJldHVybnM6CisgKiAgMCAtIHN1Y2Nlc3MKKyAqIDwwIC0gZXJyb3IsIG9uZSBvZiAtRUlOVFIsIC1FVElNRURPVVQsIG9yIC1FREVBRExLCisgKgorICogU3BlY2lhbCBBUEkgY2FsbCBmb3IgUEktZnV0ZXggcmVxdWV1ZSBzdXBwb3J0CisgKi8KK2ludCBydF9tdXRleF9maW5pc2hfcHJveHlfbG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssCisJCQkgICAgICAgc3RydWN0IGhydGltZXJfc2xlZXBlciAqdG8sCisJCQkgICAgICAgc3RydWN0IHJ0X211dGV4X3dhaXRlciAqd2FpdGVyLAorCQkJICAgICAgIGludCBkZXRlY3RfZGVhZGxvY2spCit7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmbG9jay0+d2FpdF9sb2NrKTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwlyZXQgPSBfX3J0X211dGV4X3Nsb3dsb2NrKGxvY2ssIFRBU0tfSU5URVJSVVBUSUJMRSwgdG8sIHdhaXRlciwKKwkJCQkgIGRldGVjdF9kZWFkbG9jayk7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJaWYgKHVubGlrZWx5KHdhaXRlci0+dGFzaykpCisJCXJlbW92ZV93YWl0ZXIobG9jaywgd2FpdGVyKTsKKworCS8qCisJICogdHJ5X3RvX3Rha2VfcnRfbXV0ZXgoKSBzZXRzIHRoZSB3YWl0ZXIgYml0IHVuY29uZGl0aW9uYWxseS4gV2UgbWlnaHQKKwkgKiBoYXZlIHRvIGZpeCB0aGF0IHVwLgorCSAqLworCWZpeHVwX3J0X211dGV4X3dhaXRlcnMobG9jayk7CisKKwlzcGluX3VubG9jaygmbG9jay0+d2FpdF9sb2NrKTsKKworCS8qCisJICogUmVhZGp1c3QgcHJpb3JpdHksIHdoZW4gd2UgZGlkIG5vdCBnZXQgdGhlIGxvY2suIFdlIG1pZ2h0IGhhdmUgYmVlbgorCSAqIHRoZSBwZW5kaW5nIG93bmVyIGFuZCBib29zdGVkLiBTaW5jZSB3ZSBkaWQgbm90IHRha2UgdGhlIGxvY2ssIHRoZQorCSAqIFBJIGJvb3N0IGhhcyB0byBnby4KKwkgKi8KKwlpZiAodW5saWtlbHkocmV0KSkKKwkJcnRfbXV0ZXhfYWRqdXN0X3ByaW8oY3VycmVudCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXhfY29tbW9uLmggYi9rZXJuZWwvcnRtdXRleF9jb21tb24uaAppbmRleCBlMTI0YmY1Li45N2EyZjgxIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleF9jb21tb24uaAorKysgYi9rZXJuZWwvcnRtdXRleF9jb21tb24uaApAQCAtMTIwLDYgKzEyMCwxNCBAQAogCQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb3h5X293bmVyKTsKIGV4dGVybiB2b2lkIHJ0X211dGV4X3Byb3h5X3VubG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssCiAJCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByb3h5X293bmVyKTsKK2V4dGVybiBpbnQgcnRfbXV0ZXhfc3RhcnRfcHJveHlfbG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssCisJCQkJICAgICBzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICp3YWl0ZXIsCisJCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAgICBpbnQgZGV0ZWN0X2RlYWRsb2NrKTsKK2V4dGVybiBpbnQgcnRfbXV0ZXhfZmluaXNoX3Byb3h5X2xvY2soc3RydWN0IHJ0X211dGV4ICpsb2NrLAorCQkJCSAgICAgIHN0cnVjdCBocnRpbWVyX3NsZWVwZXIgKnRvLAorCQkJCSAgICAgIHN0cnVjdCBydF9tdXRleF93YWl0ZXIgKndhaXRlciwKKwkJCQkgICAgICBpbnQgZGV0ZWN0X2RlYWRsb2NrKTsKIAogI2lmZGVmIENPTkZJR19ERUJVR19SVF9NVVRFWEVTCiAjIGluY2x1ZGUgInJ0bXV0ZXgtZGVidWcuaCIKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggMjZlZmE0Ny4uZjA0YWE5NiAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CkBAIC02OCwxNyArNjksMTggQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+Ci0jaW5jbHVkZSA8dHJhY2Uvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KIAogI2luY2x1ZGUgInNjaGVkX2NwdXByaS5oIgogCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2NoZWQuaD4KKwogLyoKICAqIENvbnZlcnQgdXNlci1uaWNlIHZhbHVlcyBbIC0yMCAuLi4gMCAuLi4gMTkgXQogICogdG8gc3RhdGljIHByaW9yaXR5IFsgTUFYX1JUX1BSSU8uLk1BWF9QUklPLTEgXSwKQEAgLTExOCwxMiArMTIwLDYgQEAKICAqLwogI2RlZmluZSBSVU5USU1FX0lORgkoKHU2NCl+MFVMTCkKIAotREVGSU5FX1RSQUNFKHNjaGVkX3dhaXRfdGFzayk7Ci1ERUZJTkVfVFJBQ0Uoc2NoZWRfd2FrZXVwKTsKLURFRklORV9UUkFDRShzY2hlZF93YWtldXBfbmV3KTsKLURFRklORV9UUkFDRShzY2hlZF9zd2l0Y2gpOwotREVGSU5FX1RSQUNFKHNjaGVkX21pZ3JhdGVfdGFzayk7Ci0KICNpZmRlZiBDT05GSUdfU01QCiAKIHN0YXRpYyB2b2lkIGRvdWJsZV9ycV9sb2NrKHN0cnVjdCBycSAqcnExLCBzdHJ1Y3QgcnEgKnJxMik7CkBAIC01ODQsNiArNTgwLDcgQEAKIAlzdHJ1Y3QgbG9hZF93ZWlnaHQgbG9hZDsKIAl1bnNpZ25lZCBsb25nIG5yX2xvYWRfdXBkYXRlczsKIAl1NjQgbnJfc3dpdGNoZXM7CisJdTY0IG5yX21pZ3JhdGlvbnNfaW47CiAKIAlzdHJ1Y3QgY2ZzX3JxIGNmczsKIAlzdHJ1Y3QgcnRfcnEgcnQ7CkBAIC02MzAsNiArNjI3LDEwIEBACiAJc3RydWN0IGxpc3RfaGVhZCBtaWdyYXRpb25fcXVldWU7CiAjZW5kaWYKIAorCS8qIGNhbGNfbG9hZCByZWxhdGVkIGZpZWxkcyAqLworCXVuc2lnbmVkIGxvbmcgY2FsY19sb2FkX3VwZGF0ZTsKKwlsb25nIGNhbGNfbG9hZF9hY3RpdmU7CisKICNpZmRlZiBDT05GSUdfU0NIRURfSFJUSUNLCiAjaWZkZWYgQ09ORklHX1NNUAogCWludCBocnRpY2tfY3NkX3BlbmRpbmc7CkBAIC02OTIsNyArNjkzLDcgQEAKICNkZWZpbmUgdGFza19ycShwKQkJY3B1X3JxKHRhc2tfY3B1KHApKQogI2RlZmluZSBjcHVfY3VycihjcHUpCQkoY3B1X3JxKGNwdSktPmN1cnIpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfcnFfY2xvY2soc3RydWN0IHJxICpycSkKK2lubGluZSB2b2lkIHVwZGF0ZV9ycV9jbG9jayhzdHJ1Y3QgcnEgKnJxKQogewogCXJxLT5jbG9jayA9IHNjaGVkX2Nsb2NrX2NwdShjcHVfb2YocnEpKTsKIH0KQEAgLTE3MjgsNiArMTcyOSw4IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIHZvaWQgY2FsY19sb2FkX2FjY291bnRfYWN0aXZlKHN0cnVjdCBycSAqdGhpc19ycSk7CisKICNpbmNsdWRlICJzY2hlZF9zdGF0cy5oIgogI2luY2x1ZGUgInNjaGVkX2lkbGV0YXNrLmMiCiAjaW5jbHVkZSAic2NoZWRfZmFpci5jIgpAQCAtMTk1OCw3ICsxOTYxLDcgQEAKIAogCWNsb2NrX29mZnNldCA9IG9sZF9ycS0+Y2xvY2sgLSBuZXdfcnEtPmNsb2NrOwogCi0JdHJhY2Vfc2NoZWRfbWlncmF0ZV90YXNrKHAsIHRhc2tfY3B1KHApLCBuZXdfY3B1KTsKKwl0cmFjZV9zY2hlZF9taWdyYXRlX3Rhc2socCwgbmV3X2NwdSk7CiAKICNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwogCWlmIChwLT5zZS53YWl0X3N0YXJ0KQpAQCAtMTk2NywxMiArMTk3MCwxNiBAQAogCQlwLT5zZS5zbGVlcF9zdGFydCAtPSBjbG9ja19vZmZzZXQ7CiAJaWYgKHAtPnNlLmJsb2NrX3N0YXJ0KQogCQlwLT5zZS5ibG9ja19zdGFydCAtPSBjbG9ja19vZmZzZXQ7CisjZW5kaWYKIAlpZiAob2xkX2NwdSAhPSBuZXdfY3B1KSB7Ci0JCXNjaGVkc3RhdF9pbmMocCwgc2UubnJfbWlncmF0aW9ucyk7CisJCXAtPnNlLm5yX21pZ3JhdGlvbnMrKzsKKwkJbmV3X3JxLT5ucl9taWdyYXRpb25zX2luKys7CisjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAkJaWYgKHRhc2tfaG90KHAsIG9sZF9ycS0+Y2xvY2ssIE5VTEwpKQogCQkJc2NoZWRzdGF0X2luYyhwLCBzZS5ucl9mb3JjZWQyX21pZ3JhdGlvbnMpOwotCX0KICNlbmRpZgorCQlwZXJmX2NvdW50ZXJfdGFza19taWdyYXRpb24ocCwgbmV3X2NwdSk7CisJfQogCXAtPnNlLnZydW50aW1lIC09IG9sZF9jZnNycS0+bWluX3ZydW50aW1lIC0KIAkJCQkJIG5ld19jZnNycS0+bWluX3ZydW50aW1lOwogCkBAIC0yMDE1LDYgKzIwMjIsNDkgQEAKIH0KIAogLyoKKyAqIHdhaXRfdGFza19jb250ZXh0X3N3aXRjaCAtCXdhaXQgZm9yIGEgdGhyZWFkIHRvIGNvbXBsZXRlIGF0IGxlYXN0IG9uZQorICoJCQkJY29udGV4dCBzd2l0Y2guCisgKgorICogQHAgbXVzdCBub3QgYmUgY3VycmVudC4KKyAqLwordm9pZCB3YWl0X3Rhc2tfY29udGV4dF9zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXVuc2lnbmVkIGxvbmcgbnZjc3csIG5pdmNzdywgZmxhZ3M7CisJaW50IHJ1bm5pbmc7CisJc3RydWN0IHJxICpycTsKKworCW52Y3N3CT0gcC0+bnZjc3c7CisJbml2Y3N3CT0gcC0+bml2Y3N3OworCWZvciAoOzspIHsKKwkJLyoKKwkJICogVGhlIHJ1bnF1ZXVlIGlzIGFzc2lnbmVkIGJlZm9yZSB0aGUgYWN0dWFsIGNvbnRleHQKKwkJICogc3dpdGNoLiBXZSBuZWVkIHRvIHRha2UgdGhlIHJ1bnF1ZXVlIGxvY2suCisJCSAqCisJCSAqIFdlIGNvdWxkIGNoZWNrIGluaXRpYWxseSB3aXRob3V0IHRoZSBsb2NrIGJ1dCBpdCBpcworCQkgKiB2ZXJ5IGxpa2VseSB0aGF0IHdlIG5lZWQgdG8gdGFrZSB0aGUgbG9jayBpbiBldmVyeQorCQkgKiBpdGVyYXRpb24uCisJCSAqLworCQlycSA9IHRhc2tfcnFfbG9jayhwLCAmZmxhZ3MpOworCQlydW5uaW5nID0gdGFza19ydW5uaW5nKHJxLCBwKTsKKwkJdGFza19ycV91bmxvY2socnEsICZmbGFncyk7CisKKwkJaWYgKGxpa2VseSghcnVubmluZykpCisJCQlicmVhazsKKwkJLyoKKwkJICogVGhlIHN3aXRjaCBjb3VudCBpcyBpbmNyZW1lbnRlZCBiZWZvcmUgdGhlIGFjdHVhbAorCQkgKiBjb250ZXh0IHN3aXRjaC4gV2UgdGh1cyB3YWl0IGZvciB0d28gc3dpdGNoZXMgdG8gYmUKKwkJICogc3VyZSBhdCBsZWFzdCBvbmUgY29tcGxldGVkLgorCQkgKi8KKwkJaWYgKChwLT5udmNzdyAtIG52Y3N3KSA+IDEpCisJCQlicmVhazsKKwkJaWYgKChwLT5uaXZjc3cgLSBuaXZjc3cpID4gMSkKKwkJCWJyZWFrOworCisJCWNwdV9yZWxheCgpOworCX0KK30KKworLyoKICAqIHdhaXRfdGFza19pbmFjdGl2ZSAtIHdhaXQgZm9yIGEgdGhyZWFkIHRvIHVuc2NoZWR1bGUuCiAgKgogICogSWYgQG1hdGNoX3N0YXRlIGlzIG5vbnplcm8sIGl0J3MgdGhlIEBwLT5zdGF0ZSB2YWx1ZSBqdXN0IGNoZWNrZWQgYW5kCkBAIC0yMzI0LDYgKzIzNzQsMjcgQEAKIAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAorLyoqCisgKiB0YXNrX29uY3B1X2Z1bmN0aW9uX2NhbGwgLSBjYWxsIGEgZnVuY3Rpb24gb24gdGhlIGNwdSBvbiB3aGljaCBhIHRhc2sgcnVucworICogQHA6CQl0aGUgdGFzayB0byBldmFsdWF0ZQorICogQGZ1bmM6CXRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQKKyAqIEBpbmZvOgl0aGUgZnVuY3Rpb24gY2FsbCBhcmd1bWVudAorICoKKyAqIENhbGxzIHRoZSBmdW5jdGlvbiBAZnVuYyB3aGVuIHRoZSB0YXNrIGlzIGN1cnJlbnRseSBydW5uaW5nLiBUaGlzIG1pZ2h0CisgKiBiZSBvbiB0aGUgY3VycmVudCBDUFUsIHdoaWNoIGp1c3QgY2FsbHMgdGhlIGZ1bmN0aW9uIGRpcmVjdGx5CisgKi8KK3ZvaWQgdGFza19vbmNwdV9mdW5jdGlvbl9jYWxsKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCSAgICAgIHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8pCit7CisJaW50IGNwdTsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWNwdSA9IHRhc2tfY3B1KHApOworCWlmICh0YXNrX2N1cnIocCkpCisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGZ1bmMsIGluZm8sIDEpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKIC8qKioKICAqIHRyeV90b193YWtlX3VwIC0gd2FrZSB1cCBhIHRocmVhZAogICogQHA6IHRoZSB0by1iZS13b2tlbi11cCB0aHJlYWQKQEAgLTI0NTgsNiArMjUyOSwxNyBAQAogCXJldHVybiBzdWNjZXNzOwogfQogCisvKioKKyAqIHdha2VfdXBfcHJvY2VzcyAtIFdha2UgdXAgYSBzcGVjaWZpYyBwcm9jZXNzCisgKiBAcDogVGhlIHByb2Nlc3MgdG8gYmUgd29rZW4gdXAuCisgKgorICogQXR0ZW1wdCB0byB3YWtlIHVwIHRoZSBub21pbmF0ZWQgcHJvY2VzcyBhbmQgbW92ZSBpdCB0byB0aGUgc2V0IG9mIHJ1bm5hYmxlCisgKiBwcm9jZXNzZXMuICBSZXR1cm5zIDEgaWYgdGhlIHByb2Nlc3Mgd2FzIHdva2VuIHVwLCAwIGlmIGl0IHdhcyBhbHJlYWR5CisgKiBydW5uaW5nLgorICoKKyAqIEl0IG1heSBiZSBhc3N1bWVkIHRoYXQgdGhpcyBmdW5jdGlvbiBpbXBsaWVzIGEgd3JpdGUgbWVtb3J5IGJhcnJpZXIgYmVmb3JlCisgKiBjaGFuZ2luZyB0aGUgdGFzayBzdGF0ZSBpZiBhbmQgb25seSBpZiBhbnkgdGFza3MgYXJlIHdva2VuIHVwLgorICovCiBpbnQgd2FrZV91cF9wcm9jZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKIAlyZXR1cm4gdHJ5X3RvX3dha2VfdXAocCwgVEFTS19BTEwsIDApOwpAQCAtMjQ4MCw2ICsyNTYyLDcgQEAKIAlwLT5zZS5leGVjX3N0YXJ0CQk9IDA7CiAJcC0+c2Uuc3VtX2V4ZWNfcnVudGltZQkJPSAwOwogCXAtPnNlLnByZXZfc3VtX2V4ZWNfcnVudGltZQk9IDA7CisJcC0+c2UubnJfbWlncmF0aW9ucwkJPSAwOwogCXAtPnNlLmxhc3Rfd2FrZXVwCQk9IDA7CiAJcC0+c2UuYXZnX292ZXJsYXAJCT0gMDsKIAlwLT5zZS5zdGFydF9ydW50aW1lCQk9IDA7CkBAIC0yNzEwLDYgKzI3OTMsNyBAQAogCSAqLwogCXByZXZfc3RhdGUgPSBwcmV2LT5zdGF0ZTsKIAlmaW5pc2hfYXJjaF9zd2l0Y2gocHJldik7CisJcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfaW4oY3VycmVudCwgY3B1X29mKHJxKSk7CiAJZmluaXNoX2xvY2tfc3dpdGNoKHJxLCBwcmV2KTsKICNpZmRlZiBDT05GSUdfU01QCiAJaWYgKHBvc3Rfc2NoZWR1bGUpCkBAIC0yNzY2LDcgKzI4NTAsNyBAQAogCSAqIGNvbWJpbmUgdGhlIHBhZ2UgdGFibGUgcmVsb2FkIGFuZCB0aGUgc3dpdGNoIGJhY2tlbmQgaW50bwogCSAqIG9uZSBoeXBlcmNhbGwuCiAJICovCi0JYXJjaF9lbnRlcl9sYXp5X2NwdV9tb2RlKCk7CisJYXJjaF9zdGFydF9jb250ZXh0X3N3aXRjaChwcmV2KTsKIAogCWlmICh1bmxpa2VseSghbW0pKSB7CiAJCW5leHQtPmFjdGl2ZV9tbSA9IG9sZG1tOwpAQCAtMjg1NiwxOSArMjk0MCw4MSBAQAogCXJldHVybiBzdW07CiB9CiAKLXVuc2lnbmVkIGxvbmcgbnJfYWN0aXZlKHZvaWQpCisvKiBWYXJpYWJsZXMgYW5kIGZ1bmN0aW9ucyBmb3IgY2FsY19sb2FkICovCitzdGF0aWMgYXRvbWljX2xvbmdfdCBjYWxjX2xvYWRfdGFza3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjYWxjX2xvYWRfdXBkYXRlOwordW5zaWduZWQgbG9uZyBhdmVucnVuWzNdOworRVhQT1JUX1NZTUJPTChhdmVucnVuKTsKKworLyoqCisgKiBnZXRfYXZlbnJ1biAtIGdldCB0aGUgbG9hZCBhdmVyYWdlIGFycmF5CisgKiBAbG9hZHM6CXBvaW50ZXIgdG8gZGVzdCBsb2FkIGFycmF5CisgKiBAb2Zmc2V0OglvZmZzZXQgdG8gYWRkCisgKiBAc2hpZnQ6CXNoaWZ0IGNvdW50IHRvIHNoaWZ0IHRoZSByZXN1bHQgbGVmdAorICoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgZXN0aW1hdGVzIGF0IGJlc3QsIHNvIG5vIG5lZWQgZm9yIGxvY2tpbmcuCisgKi8KK3ZvaWQgZ2V0X2F2ZW5ydW4odW5zaWduZWQgbG9uZyAqbG9hZHMsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2hpZnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBpLCBydW5uaW5nID0gMCwgdW5pbnRlcnJ1cHRpYmxlID0gMDsKKwlsb2Fkc1swXSA9IChhdmVucnVuWzBdICsgb2Zmc2V0KSA8PCBzaGlmdDsKKwlsb2Fkc1sxXSA9IChhdmVucnVuWzFdICsgb2Zmc2V0KSA8PCBzaGlmdDsKKwlsb2Fkc1syXSA9IChhdmVucnVuWzJdICsgb2Zmc2V0KSA8PCBzaGlmdDsKK30KIAotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQlydW5uaW5nICs9IGNwdV9ycShpKS0+bnJfcnVubmluZzsKLQkJdW5pbnRlcnJ1cHRpYmxlICs9IGNwdV9ycShpKS0+bnJfdW5pbnRlcnJ1cHRpYmxlOworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2NhbGNfbG9hZCh1bnNpZ25lZCBsb25nIGxvYWQsIHVuc2lnbmVkIGxvbmcgZXhwLCB1bnNpZ25lZCBsb25nIGFjdGl2ZSkKK3sKKwlsb2FkICo9IGV4cDsKKwlsb2FkICs9IGFjdGl2ZSAqIChGSVhFRF8xIC0gZXhwKTsKKwlyZXR1cm4gbG9hZCA+PiBGU0hJRlQ7Cit9CisKKy8qCisgKiBjYWxjX2xvYWQgLSB1cGRhdGUgdGhlIGF2ZW5ydW4gbG9hZCBlc3RpbWF0ZXMgMTAgdGlja3MgYWZ0ZXIgdGhlCisgKiBDUFVzIGhhdmUgdXBkYXRlZCBjYWxjX2xvYWRfdGFza3MuCisgKi8KK3ZvaWQgY2FsY19nbG9iYWxfbG9hZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdXBkID0gY2FsY19sb2FkX3VwZGF0ZSArIDEwOworCWxvbmcgYWN0aXZlOworCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHVwZCkpCisJCXJldHVybjsKKworCWFjdGl2ZSA9IGF0b21pY19sb25nX3JlYWQoJmNhbGNfbG9hZF90YXNrcyk7CisJYWN0aXZlID0gYWN0aXZlID4gMCA/IGFjdGl2ZSAqIEZJWEVEXzEgOiAwOworCisJYXZlbnJ1blswXSA9IGNhbGNfbG9hZChhdmVucnVuWzBdLCBFWFBfMSwgYWN0aXZlKTsKKwlhdmVucnVuWzFdID0gY2FsY19sb2FkKGF2ZW5ydW5bMV0sIEVYUF81LCBhY3RpdmUpOworCWF2ZW5ydW5bMl0gPSBjYWxjX2xvYWQoYXZlbnJ1blsyXSwgRVhQXzE1LCBhY3RpdmUpOworCisJY2FsY19sb2FkX3VwZGF0ZSArPSBMT0FEX0ZSRVE7Cit9CisKKy8qCisgKiBFaXRoZXIgY2FsbGVkIGZyb20gdXBkYXRlX2NwdV9sb2FkKCkgb3IgZnJvbSBhIGNwdSBnb2luZyBpZGxlCisgKi8KK3N0YXRpYyB2b2lkIGNhbGNfbG9hZF9hY2NvdW50X2FjdGl2ZShzdHJ1Y3QgcnEgKnRoaXNfcnEpCit7CisJbG9uZyBucl9hY3RpdmUsIGRlbHRhOworCisJbnJfYWN0aXZlID0gdGhpc19ycS0+bnJfcnVubmluZzsKKwlucl9hY3RpdmUgKz0gKGxvbmcpIHRoaXNfcnEtPm5yX3VuaW50ZXJydXB0aWJsZTsKKworCWlmIChucl9hY3RpdmUgIT0gdGhpc19ycS0+Y2FsY19sb2FkX2FjdGl2ZSkgeworCQlkZWx0YSA9IG5yX2FjdGl2ZSAtIHRoaXNfcnEtPmNhbGNfbG9hZF9hY3RpdmU7CisJCXRoaXNfcnEtPmNhbGNfbG9hZF9hY3RpdmUgPSBucl9hY3RpdmU7CisJCWF0b21pY19sb25nX2FkZChkZWx0YSwgJmNhbGNfbG9hZF90YXNrcyk7CiAJfQorfQogCi0JaWYgKHVubGlrZWx5KChsb25nKXVuaW50ZXJydXB0aWJsZSA8IDApKQotCQl1bmludGVycnVwdGlibGUgPSAwOwotCi0JcmV0dXJuIHJ1bm5pbmcgKyB1bmludGVycnVwdGlibGU7CisvKgorICogRXh0ZXJuYWxseSB2aXNpYmxlIHBlci1jcHUgc2NoZWR1bGVyIHN0YXRpc3RpY3M6CisgKiBjcHVfbnJfbWlncmF0aW9ucyhjcHUpIC0gbnVtYmVyIG9mIG1pZ3JhdGlvbnMgaW50byB0aGF0IGNwdQorICovCit1NjQgY3B1X25yX21pZ3JhdGlvbnMoaW50IGNwdSkKK3sKKwlyZXR1cm4gY3B1X3JxKGNwdSktPm5yX21pZ3JhdGlvbnNfaW47CiB9CiAKIC8qCkBAIC0yODk5LDYgKzMwNDUsMTEgQEAKIAkJCW5ld19sb2FkICs9IHNjYWxlLTE7CiAJCXRoaXNfcnEtPmNwdV9sb2FkW2ldID0gKG9sZF9sb2FkKihzY2FsZS0xKSArIG5ld19sb2FkKSA+PiBpOwogCX0KKworCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHRoaXNfcnEtPmNhbGNfbG9hZF91cGRhdGUpKSB7CisJCXRoaXNfcnEtPmNhbGNfbG9hZF91cGRhdGUgKz0gTE9BRF9GUkVROworCQljYWxjX2xvYWRfYWNjb3VudF9hY3RpdmUodGhpc19ycSk7CisJfQogfQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNDI0MCwxMCArNDM5MSwxMjYgQEAKIHN0YXRpYyBzdHJ1Y3QgewogCWF0b21pY190IGxvYWRfYmFsYW5jZXI7CiAJY3B1bWFza192YXJfdCBjcHVfbWFzazsKKwljcHVtYXNrX3Zhcl90IGlsYl9ncnBfbm9oel9tYXNrOwogfSBub2h6IF9fX19jYWNoZWxpbmVfYWxpZ25lZCA9IHsKIAkubG9hZF9iYWxhbmNlciA9IEFUT01JQ19JTklUKC0xKSwKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9NQykgfHwgZGVmaW5lZChDT05GSUdfU0NIRURfU01UKQorLyoqCisgKiBsb3dlc3RfZmxhZ19kb21haW4gLSBSZXR1cm4gbG93ZXN0IHNjaGVkX2RvbWFpbiBjb250YWluaW5nIGZsYWcuCisgKiBAY3B1OglUaGUgY3B1IHdob3NlIGxvd2VzdCBsZXZlbCBvZiBzY2hlZCBkb21haW4gaXMgdG8KKyAqCQliZSByZXR1cm5lZC4KKyAqIEBmbGFnOglUaGUgZmxhZyB0byBjaGVjayBmb3IgdGhlIGxvd2VzdCBzY2hlZF9kb21haW4KKyAqCQlmb3IgdGhlIGdpdmVuIGNwdS4KKyAqCisgKiBSZXR1cm5zIHRoZSBsb3dlc3Qgc2NoZWRfZG9tYWluIG9mIGEgY3B1IHdoaWNoIGNvbnRhaW5zIHRoZSBnaXZlbiBmbGFnLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzY2hlZF9kb21haW4gKmxvd2VzdF9mbGFnX2RvbWFpbihpbnQgY3B1LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKworCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKQorCQlpZiAoc2QgJiYgKHNkLT5mbGFncyAmIGZsYWcpKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gc2Q7Cit9CisKKy8qKgorICogZm9yX2VhY2hfZmxhZ19kb21haW4gLSBJdGVyYXRlcyBvdmVyIHNjaGVkX2RvbWFpbnMgY29udGFpbmluZyB0aGUgZmxhZy4KKyAqIEBjcHU6CVRoZSBjcHUgd2hvc2UgZG9tYWlucyB3ZSdyZSBpdGVyYXRpbmcgb3Zlci4KKyAqIEBzZDoJCXZhcmlhYmxlIGhvbGRpbmcgdGhlIHZhbHVlIG9mIHRoZSBwb3dlcl9zYXZpbmdzX3NkCisgKgkJZm9yIGNwdS4KKyAqIEBmbGFnOglUaGUgZmxhZyB0byBmaWx0ZXIgdGhlIHNjaGVkX2RvbWFpbnMgdG8gYmUgaXRlcmF0ZWQuCisgKgorICogSXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHNjaGVkdWxlciBkb21haW5zIGZvciBhIGdpdmVuIGNwdSB0aGF0IGhhcyB0aGUgJ2ZsYWcnCisgKiBzZXQsIHN0YXJ0aW5nIGZyb20gdGhlIGxvd2VzdCBzY2hlZF9kb21haW4gdG8gdGhlIGhpZ2hlc3QuCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfZmxhZ19kb21haW4oY3B1LCBzZCwgZmxhZykgXAorCWZvciAoc2QgPSBsb3dlc3RfZmxhZ19kb21haW4oY3B1LCBmbGFnKTsgXAorCQkoc2QgJiYgKHNkLT5mbGFncyAmIGZsYWcpKTsgc2QgPSBzZC0+cGFyZW50KQorCisvKioKKyAqIGlzX3NlbWlfaWRsZV9ncm91cCAtIENoZWNrcyBpZiB0aGUgZ2l2ZW4gc2NoZWRfZ3JvdXAgaXMgc2VtaS1pZGxlLgorICogQGlsYl9ncm91cDoJZ3JvdXAgdG8gYmUgY2hlY2tlZCBmb3Igc2VtaS1pZGxlbmVzcworICoKKyAqIFJldHVybnM6CTEgaWYgdGhlIGdyb3VwIGlzIHNlbWktaWRsZS4gMCBvdGhlcndpc2UuCisgKgorICogV2UgZGVmaW5lIGEgc2NoZWRfZ3JvdXAgdG8gYmUgc2VtaSBpZGxlIGlmIGl0IGhhcyBhdGxlYXN0IG9uZSBpZGxlLUNQVQorICogYW5kIGF0bGVhc3Qgb25lIG5vbi1pZGxlIENQVS4gVGhpcyBoZWxwZXIgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZSBnaXZlbgorICogc2NoZWRfZ3JvdXAgaXMgc2VtaS1pZGxlIG9yIG5vdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfc2VtaV9pZGxlX2dyb3VwKHN0cnVjdCBzY2hlZF9ncm91cCAqaWxiX2dyb3VwKQoreworCWNwdW1hc2tfYW5kKG5vaHouaWxiX2dycF9ub2h6X21hc2ssIG5vaHouY3B1X21hc2ssCisJCQkJCXNjaGVkX2dyb3VwX2NwdXMoaWxiX2dyb3VwKSk7CisKKwkvKgorCSAqIEEgc2NoZWRfZ3JvdXAgaXMgc2VtaS1pZGxlIHdoZW4gaXQgaGFzIGF0bGVhc3Qgb25lIGJ1c3kgY3B1CisJICogYW5kIGF0bGVhc3Qgb25lIGlkbGUgY3B1LgorCSAqLworCWlmIChjcHVtYXNrX2VtcHR5KG5vaHouaWxiX2dycF9ub2h6X21hc2spKQorCQlyZXR1cm4gMDsKKworCWlmIChjcHVtYXNrX2VxdWFsKG5vaHouaWxiX2dycF9ub2h6X21hc2ssIHNjaGVkX2dyb3VwX2NwdXMoaWxiX2dyb3VwKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisvKioKKyAqIGZpbmRfbmV3X2lsYiAtIEZpbmRzIHRoZSBvcHRpbXVtIGlkbGUgbG9hZCBiYWxhbmNlciBmb3Igbm9taW5hdGlvbi4KKyAqIEBjcHU6CVRoZSBjcHUgd2hpY2ggaXMgbm9taW5hdGluZyBhIG5ldyBpZGxlX2xvYWRfYmFsYW5jZXIuCisgKgorICogUmV0dXJuczoJUmV0dXJucyB0aGUgaWQgb2YgdGhlIGlkbGUgbG9hZCBiYWxhbmNlciBpZiBpdCBleGlzdHMsCisgKgkJRWxzZSwgcmV0dXJucyA+PSBucl9jcHVfaWRzLgorICoKKyAqIFRoaXMgYWxnb3JpdGhtIHBpY2tzIHRoZSBpZGxlIGxvYWQgYmFsYW5jZXIgc3VjaCB0aGF0IGl0IGJlbG9uZ3MgdG8gYQorICogc2VtaS1pZGxlIHBvd2Vyc2F2aW5ncyBzY2hlZF9kb21haW4uIFRoZSBpZGVhIGlzIHRvIHRyeSBhbmQgYXZvaWQKKyAqIGNvbXBsZXRlbHkgaWRsZSBwYWNrYWdlcy9jb3JlcyBqdXN0IGZvciB0aGUgcHVycG9zZSBvZiBpZGxlIGxvYWQgYmFsYW5jaW5nCisgKiB3aGVuIHRoZXJlIGFyZSBvdGhlciBpZGxlIGNwdSdzIHdoaWNoIGFyZSBiZXR0ZXIgc3VpdGVkIGZvciB0aGF0IGpvYi4KKyAqLworc3RhdGljIGludCBmaW5kX25ld19pbGIoaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmlsYl9ncm91cDsKKworCS8qCisJICogSGF2ZSBpZGxlIGxvYWQgYmFsYW5jZXIgc2VsZWN0aW9uIGZyb20gc2VtaS1pZGxlIHBhY2thZ2VzIG9ubHkKKwkgKiB3aGVuIHBvd2VyLWF3YXJlIGxvYWQgYmFsYW5jaW5nIGlzIGVuYWJsZWQKKwkgKi8KKwlpZiAoIShzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncyB8fCBzY2hlZF9tY19wb3dlcl9zYXZpbmdzKSkKKwkJZ290byBvdXRfZG9uZTsKKworCS8qCisJICogT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZW4gd2UgaGF2ZSBubyBpZGxlIENQVXMgb3Igb25seSBvbmUKKwkgKiBpZGxlIENQVS4gRG9uJ3Qgd2FsayB0aGUgc2NoZWRfZG9tYWluIGhpZXJhcmNoeSBpbiBzdWNoIGNhc2VzCisJICovCisJaWYgKGNwdW1hc2tfd2VpZ2h0KG5vaHouY3B1X21hc2spIDwgMikKKwkJZ290byBvdXRfZG9uZTsKKworCWZvcl9lYWNoX2ZsYWdfZG9tYWluKGNwdSwgc2QsIFNEX1BPV0VSU0FWSU5HU19CQUxBTkNFKSB7CisJCWlsYl9ncm91cCA9IHNkLT5ncm91cHM7CisKKwkJZG8geworCQkJaWYgKGlzX3NlbWlfaWRsZV9ncm91cChpbGJfZ3JvdXApKQorCQkJCXJldHVybiBjcHVtYXNrX2ZpcnN0KG5vaHouaWxiX2dycF9ub2h6X21hc2spOworCisJCQlpbGJfZ3JvdXAgPSBpbGJfZ3JvdXAtPm5leHQ7CisKKwkJfSB3aGlsZSAoaWxiX2dyb3VwICE9IHNkLT5ncm91cHMpOworCX0KKworb3V0X2RvbmU6CisJcmV0dXJuIGNwdW1hc2tfZmlyc3Qobm9oei5jcHVfbWFzayk7Cit9CisjZWxzZSAvKiAgKENPTkZJR19TQ0hFRF9NQyB8fCBDT05GSUdfU0NIRURfU01UKSAqLworc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXdfaWxiKGludCBjYWxsX2NwdSkKK3sKKwlyZXR1cm4gY3B1bWFza19maXJzdChub2h6LmNwdV9tYXNrKTsKK30KKyNlbmRpZgorCiAvKgogICogVGhpcyByb3V0aW5lIHdpbGwgdHJ5IHRvIG5vbWluYXRlIHRoZSBpbGIgKGlkbGUgbG9hZCBiYWxhbmNpbmcpCiAgKiBvd25lciBhbW9uZyB0aGUgY3B1cyB3aG9zZSB0aWNrcyBhcmUgc3RvcHBlZC4gaWxiIG93bmVyIHdpbGwgZG8gdGhlIGlkbGUKQEAgLTQyOTgsOCArNDU2NSwyNCBAQAogCQkJLyogbWFrZSBtZSB0aGUgaWxiIG93bmVyICovCiAJCQlpZiAoYXRvbWljX2NtcHhjaGcoJm5vaHoubG9hZF9iYWxhbmNlciwgLTEsIGNwdSkgPT0gLTEpCiAJCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSBpZiAoYXRvbWljX3JlYWQoJm5vaHoubG9hZF9iYWxhbmNlcikgPT0gY3B1KQorCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZub2h6LmxvYWRfYmFsYW5jZXIpID09IGNwdSkgeworCQkJaW50IG5ld19pbGI7CisKKwkJCWlmICghKHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdzIHx8CisJCQkJCQlzY2hlZF9tY19wb3dlcl9zYXZpbmdzKSkKKwkJCQlyZXR1cm4gMTsKKwkJCS8qCisJCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYSBtb3JlIHBvd2VyLWVmZmljaWVudAorCQkJICogaWxiLgorCQkJICovCisJCQluZXdfaWxiID0gZmluZF9uZXdfaWxiKGNwdSk7CisJCQlpZiAobmV3X2lsYiA8IG5yX2NwdV9pZHMgJiYgbmV3X2lsYiAhPSBjcHUpIHsKKwkJCQlhdG9taWNfc2V0KCZub2h6LmxvYWRfYmFsYW5jZXIsIC0xKTsKKwkJCQlyZXNjaGVkX2NwdShuZXdfaWxiKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJCXJldHVybiAxOworCQl9CiAJfSBlbHNlIHsKIAkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgbm9oei5jcHVfbWFzaykpCiAJCQlyZXR1cm4gMDsKQEAgLTQ0NjgsMTUgKzQ3NTEsNyBAQAogCQl9CiAKIAkJaWYgKGF0b21pY19yZWFkKCZub2h6LmxvYWRfYmFsYW5jZXIpID09IC0xKSB7Ci0JCQkvKgotCQkJICogc2ltcGxlIHNlbGVjdGlvbiBmb3Igbm93OiBOb21pbmF0ZSB0aGUKLQkJCSAqIGZpcnN0IGNwdSBpbiB0aGUgbm9oeiBsaXN0IHRvIGJlIHRoZSBuZXh0Ci0JCQkgKiBpbGIgb3duZXIuCi0JCQkgKgotCQkJICogVEJEOiBUcmF2ZXJzZSB0aGUgc2NoZWQgZG9tYWlucyBhbmQgbm9taW5hdGUKLQkJCSAqIHRoZSBuZWFyZXN0IGNwdSBpbiB0aGUgbm9oei5jcHVfbWFzay4KLQkJCSAqLwotCQkJaW50IGlsYiA9IGNwdW1hc2tfZmlyc3Qobm9oei5jcHVfbWFzayk7CisJCQlpbnQgaWxiID0gZmluZF9uZXdfaWxiKGNwdSk7CiAKIAkJCWlmIChpbGIgPCBucl9jcHVfaWRzKQogCQkJCXJlc2NoZWRfY3B1KGlsYik7CkBAIC00ODQwLDYgKzUxMTUsOCBAQAogCWN1cnItPnNjaGVkX2NsYXNzLT50YXNrX3RpY2socnEsIGN1cnIsIDApOwogCXNwaW5fdW5sb2NrKCZycS0+bG9jayk7CiAKKwlwZXJmX2NvdW50ZXJfdGFza190aWNrKGN1cnIsIGNwdSk7CisKICNpZmRlZiBDT05GSUdfU01QCiAJcnEtPmlkbGVfYXRfdGljayA9IGlkbGVfY3B1KGNwdSk7CiAJdHJpZ2dlcl9sb2FkX2JhbGFuY2UocnEsIGNwdSk7CkBAIC01MDA3LDEzICs1Mjg0LDE1IEBACiAvKgogICogc2NoZWR1bGUoKSBpcyB0aGUgbWFpbiBzY2hlZHVsZXIgZnVuY3Rpb24uCiAgKi8KLWFzbWxpbmthZ2Ugdm9pZCBfX3NjaGVkIF9fc2NoZWR1bGUodm9pZCkKK2FzbWxpbmthZ2Ugdm9pZCBfX3NjaGVkIHNjaGVkdWxlKHZvaWQpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LCAqbmV4dDsKIAl1bnNpZ25lZCBsb25nICpzd2l0Y2hfY291bnQ7CiAJc3RydWN0IHJxICpycTsKIAlpbnQgY3B1OwogCituZWVkX3Jlc2NoZWQ6CisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXJxID0gY3B1X3JxKGNwdSk7CiAJcmN1X3FzY3RyX2luYyhjcHUpOwpAQCAtNTA1Myw2ICs1MzMyLDcgQEAKIAogCWlmIChsaWtlbHkocHJldiAhPSBuZXh0KSkgewogCQlzY2hlZF9pbmZvX3N3aXRjaChwcmV2LCBuZXh0KTsKKwkJcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfb3V0KHByZXYsIG5leHQsIGNwdSk7CiAKIAkJcnEtPm5yX3N3aXRjaGVzKys7CiAJCXJxLT5jdXJyID0gbmV4dDsKQEAgLTUwNzAsMTUgKzUzNTAsOSBAQAogCiAJaWYgKHVubGlrZWx5KHJlYWNxdWlyZV9rZXJuZWxfbG9jayhjdXJyZW50KSA8IDApKQogCQlnb3RvIG5lZWRfcmVzY2hlZF9ub25wcmVlbXB0aWJsZTsKLX0KIAotYXNtbGlua2FnZSB2b2lkIF9fc2NoZWQgc2NoZWR1bGUodm9pZCkKLXsKLW5lZWRfcmVzY2hlZDoKLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlfX3NjaGVkdWxlKCk7CiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwotCWlmICh1bmxpa2VseSh0ZXN0X3RocmVhZF9mbGFnKFRJRl9ORUVEX1JFU0NIRUQpKSkKKwlpZiAobmVlZF9yZXNjaGVkKCkpCiAJCWdvdG8gbmVlZF9yZXNjaGVkOwogfQogRVhQT1JUX1NZTUJPTChzY2hlZHVsZSk7CkBAIC01MjIxLDcgKzU0OTUsNyBAQAogICogc3RhcnRlZCB0byBydW4gYnV0IGlzIG5vdCBpbiBzdGF0ZSBUQVNLX1JVTk5JTkcuIHRyeV90b193YWtlX3VwKCkgcmV0dXJucwogICogemVybyBpbiB0aGlzIChyYXJlKSBjYXNlLCBhbmQgd2UgaGFuZGxlIGl0IGJ5IGNvbnRpbnVpbmcgdG8gc2NhbiB0aGUgcXVldWUuCiAgKi8KLXZvaWQgX193YWtlX3VwX2NvbW1vbih3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgdW5zaWduZWQgaW50IG1vZGUsCitzdGF0aWMgdm9pZCBfX3dha2VfdXBfY29tbW9uKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwKIAkJCWludCBucl9leGNsdXNpdmUsIGludCBzeW5jLCB2b2lkICprZXkpCiB7CiAJd2FpdF9xdWV1ZV90ICpjdXJyLCAqbmV4dDsKQEAgLTUyNDEsNiArNTUxNSw5IEBACiAgKiBAbW9kZTogd2hpY2ggdGhyZWFkcwogICogQG5yX2V4Y2x1c2l2ZTogaG93IG1hbnkgd2FrZS1vbmUgb3Igd2FrZS1tYW55IHRocmVhZHMgdG8gd2FrZSB1cAogICogQGtleTogaXMgZGlyZWN0bHkgcGFzc2VkIHRvIHRoZSB3YWtldXAgZnVuY3Rpb24KKyAqCisgKiBJdCBtYXkgYmUgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rpb24gaW1wbGllcyBhIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGJlZm9yZQorICogY2hhbmdpbmcgdGhlIHRhc2sgc3RhdGUgaWYgYW5kIG9ubHkgaWYgYW55IHRhc2tzIGFyZSB3b2tlbiB1cC4KICAqLwogdm9pZCBfX3dha2VfdXAod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLAogCQkJaW50IG5yX2V4Y2x1c2l2ZSwgdm9pZCAqa2V5KQpAQCAtNTI3OSw2ICs1NTU2LDkgQEAKICAqIHdpdGggZWFjaCBvdGhlci4gVGhpcyBjYW4gcHJldmVudCBuZWVkbGVzcyBib3VuY2luZyBiZXR3ZWVuIENQVXMuCiAgKgogICogT24gVVAgaXQgY2FuIHByZXZlbnQgZXh0cmEgcHJlZW1wdGlvbi4KKyAqCisgKiBJdCBtYXkgYmUgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rpb24gaW1wbGllcyBhIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGJlZm9yZQorICogY2hhbmdpbmcgdGhlIHRhc2sgc3RhdGUgaWYgYW5kIG9ubHkgaWYgYW55IHRhc2tzIGFyZSB3b2tlbiB1cC4KICAqLwogdm9pZCBfX3dha2VfdXBfc3luY19rZXkod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLAogCQkJaW50IG5yX2V4Y2x1c2l2ZSwgdm9pZCAqa2V5KQpAQCAtNTMxNSw2ICs1NTk1LDkgQEAKICAqIGF3YWtlbmVkIGluIHRoZSBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBxdWV1ZWQuCiAgKgogICogU2VlIGFsc28gY29tcGxldGVfYWxsKCksIHdhaXRfZm9yX2NvbXBsZXRpb24oKSBhbmQgcmVsYXRlZCByb3V0aW5lcy4KKyAqCisgKiBJdCBtYXkgYmUgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rpb24gaW1wbGllcyBhIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGJlZm9yZQorICogY2hhbmdpbmcgdGhlIHRhc2sgc3RhdGUgaWYgYW5kIG9ubHkgaWYgYW55IHRhc2tzIGFyZSB3b2tlbiB1cC4KICAqLwogdm9pZCBjb21wbGV0ZShzdHJ1Y3QgY29tcGxldGlvbiAqeCkKIHsKQEAgLTUzMzIsNiArNTYxNSw5IEBACiAgKiBAeDogIGhvbGRzIHRoZSBzdGF0ZSBvZiB0aGlzIHBhcnRpY3VsYXIgY29tcGxldGlvbgogICoKICAqIFRoaXMgd2lsbCB3YWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24gZXZlbnQuCisgKgorICogSXQgbWF5IGJlIGFzc3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGltcGxpZXMgYSB3cml0ZSBtZW1vcnkgYmFycmllciBiZWZvcmUKKyAqIGNoYW5naW5nIHRoZSB0YXNrIHN0YXRlIGlmIGFuZCBvbmx5IGlmIGFueSB0YXNrcyBhcmUgd29rZW4gdXAuCiAgKi8KIHZvaWQgY29tcGxldGVfYWxsKHN0cnVjdCBjb21wbGV0aW9uICp4KQogewpAQCAtNjQ5MCw4ICs2Nzc2LDkgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKIAlmcmVlID0gc3RhY2tfbm90X3VzZWQocCk7CiAjZW5kaWYKLQlwcmludGsoS0VSTl9DT05UICIlNWx1ICU1ZCAlNmRcbiIsIGZyZWUsCi0JCXRhc2tfcGlkX25yKHApLCB0YXNrX3BpZF9ucihwLT5yZWFsX3BhcmVudCkpOworCXByaW50ayhLRVJOX0NPTlQgIiU1bHUgJTVkICU2ZCAweCUwOGx4XG4iLCBmcmVlLAorCQl0YXNrX3BpZF9ucihwKSwgdGFza19waWRfbnIocC0+cmVhbF9wYXJlbnQpLAorCQkodW5zaWduZWQgbG9uZyl0YXNrX3RocmVhZF9pbmZvKHApLT5mbGFncyk7CiAKIAlzaG93X3N0YWNrKHAsIE5VTEwpOwogfQpAQCAtNjk3MCw2ICs3MjU3LDE0IEBACiAKIAl9CiB9CisKKy8qCisgKiByZW1vdmUgdGhlIHRhc2tzIHdoaWNoIHdlcmUgYWNjb3VudGVkIGJ5IHJxIGZyb20gY2FsY19sb2FkX3Rhc2tzLgorICovCitzdGF0aWMgdm9pZCBjYWxjX2dsb2JhbF9sb2FkX3JlbW92ZShzdHJ1Y3QgcnEgKnJxKQoreworCWF0b21pY19sb25nX3N1YihycS0+Y2FsY19sb2FkX2FjdGl2ZSwgJmNhbGNfbG9hZF90YXNrcyk7Cit9CiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9ERUJVRykgJiYgZGVmaW5lZChDT05GSUdfU1lTQ1RMKQpAQCAtNzIwNCw2ICs3NDk5LDggQEAKIAkJLyogVXBkYXRlIG91ciByb290LWRvbWFpbiAqLwogCQlycSA9IGNwdV9ycShjcHUpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnEtPmxvY2ssIGZsYWdzKTsKKwkJcnEtPmNhbGNfbG9hZF91cGRhdGUgPSBjYWxjX2xvYWRfdXBkYXRlOworCQlycS0+Y2FsY19sb2FkX2FjdGl2ZSA9IDA7CiAJCWlmIChycS0+cmQpIHsKIAkJCUJVR19PTighY3B1bWFza190ZXN0X2NwdShjcHUsIHJxLT5yZC0+c3BhbikpOwogCkBAIC03MjQzLDcgKzc1NDAsNyBAQAogCQljcHVzZXRfdW5sb2NrKCk7CiAJCW1pZ3JhdGVfbnJfdW5pbnRlcnJ1cHRpYmxlKHJxKTsKIAkJQlVHX09OKHJxLT5ucl9ydW5uaW5nICE9IDApOwotCisJCWNhbGNfZ2xvYmFsX2xvYWRfcmVtb3ZlKHJxKTsKIAkJLyoKIAkJICogTm8gbmVlZCB0byBtaWdyYXRlIHRoZSB0YXNrczogaXQgd2FzIGJlc3QtZWZmb3J0IGlmCiAJCSAqIHRoZXkgZGlkbid0IHRha2Ugc2NoZWRfaG90Y3B1X211dGV4LiBKdXN0IHdha2UgdXAKQEAgLTcyNzksOCArNzU3NiwxMCBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLS8qIFJlZ2lzdGVyIGF0IGhpZ2hlc3QgcHJpb3JpdHkgc28gdGhhdCB0YXNrIG1pZ3JhdGlvbiAobWlncmF0ZV9hbGxfdGFza3MpCi0gKiBoYXBwZW5zIGJlZm9yZSBldmVyeXRoaW5nIGVsc2UuCisvKgorICogUmVnaXN0ZXIgYXQgaGlnaCBwcmlvcml0eSBzbyB0aGF0IHRhc2sgbWlncmF0aW9uIChtaWdyYXRlX2FsbF90YXNrcykKKyAqIGhhcHBlbnMgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgaGFzIHRvIGJlIGxvd2VyIHByaW9yaXR5IHRoYW4KKyAqIHRoZSBub3RpZmllciBpbiB0aGUgcGVyZl9jb3VudGVyIHN1YnN5c3RlbSwgdGhvdWdoLgogICovCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEgbWlncmF0aW9uX25vdGlmaWVyID0gewogCS5ub3RpZmllcl9jYWxsID0gbWlncmF0aW9uX2NhbGwsCkBAIC03NTI1LDI0ICs3ODI0LDIxIEBACiAKIHN0YXRpYyBpbnQgX19pbml0X3JlZm9rIGluaXRfcm9vdGRvbWFpbihzdHJ1Y3Qgcm9vdF9kb21haW4gKnJkLCBib29sIGJvb3RtZW0pCiB7CisJZ2ZwX3QgZ2ZwID0gR0ZQX0tFUk5FTDsKKwogCW1lbXNldChyZCwgMCwgc2l6ZW9mKCpyZCkpOwogCi0JaWYgKGJvb3RtZW0pIHsKLQkJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmZGVmX3Jvb3RfZG9tYWluLnNwYW4pOwotCQlhbGxvY19ib290bWVtX2NwdW1hc2tfdmFyKCZkZWZfcm9vdF9kb21haW4ub25saW5lKTsKLQkJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmZGVmX3Jvb3RfZG9tYWluLnJ0b19tYXNrKTsKLQkJY3B1cHJpX2luaXQoJnJkLT5jcHVwcmksIHRydWUpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKGJvb3RtZW0pCisJCWdmcCA9IEdGUF9OT1dBSVQ7CiAKLQlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZyZC0+c3BhbiwgR0ZQX0tFUk5FTCkpCisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcmQtPnNwYW4sIGdmcCkpCiAJCWdvdG8gb3V0OwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5vbmxpbmUsIEdGUF9LRVJORUwpKQorCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5vbmxpbmUsIGdmcCkpCiAJCWdvdG8gZnJlZV9zcGFuOwotCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5ydG9fbWFzaywgR0ZQX0tFUk5FTCkpCisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcmQtPnJ0b19tYXNrLCBnZnApKQogCQlnb3RvIGZyZWVfb25saW5lOwogCi0JaWYgKGNwdXByaV9pbml0KCZyZC0+Y3B1cHJpLCBmYWxzZSkgIT0gMCkKKwlpZiAoY3B1cHJpX2luaXQoJnJkLT5jcHVwcmksIGJvb3RtZW0pICE9IDApCiAJCWdvdG8gZnJlZV9ydG9fbWFzazsKIAlyZXR1cm4gMDsKIApAQCAtNzc1Myw4ICs4MDQ5LDkgQEAKIAogLyoKICAqIFRoZSBjcHVzIG1hc2sgaW4gc2NoZWRfZ3JvdXAgYW5kIHNjaGVkX2RvbWFpbiBoYW5ncyBvZmYgdGhlIGVuZC4KLSAqIEZJWE1FOiB1c2UgY3B1bWFza192YXJfdCBvciBkeW5hbWljIHBlcmNwdSBhbGxvYyB0byBhdm9pZCB3YXN0aW5nIHNwYWNlCi0gKiBmb3IgbnJfY3B1X2lkcyA8IENPTkZJR19OUl9DUFVTLgorICoKKyAqICggU2VlIHRoZSB0aGUgY29tbWVudHMgaW4gaW5jbHVkZS9saW51eC9zY2hlZC5oOnN0cnVjdCBzY2hlZF9ncm91cAorICogICBhbmQgc3RydWN0IHNjaGVkX2RvbWFpbi4gKQogICovCiBzdHJ1Y3Qgc3RhdGljX3NjaGVkX2dyb3VwIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2c7CkBAIC03ODc1LDcgKzgxNzIsNyBAQAogCQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAKIAkJCXNkID0gJnBlcl9jcHUocGh5c19kb21haW5zLCBqKS5zZDsKLQkJCWlmIChqICE9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZ3JvdXBfY3B1cyhzZC0+Z3JvdXBzKSkpIHsKKwkJCWlmIChqICE9IGdyb3VwX2ZpcnN0X2NwdShzZC0+Z3JvdXBzKSkgewogCQkJCS8qCiAJCQkJICogT25seSBhZGQgInBvd2VyIiBvbmNlIGZvciBlYWNoCiAJCQkJICogcGh5c2ljYWwgcGFja2FnZS4KQEAgLTc5NTMsNyArODI1MCw3IEBACiAKIAlXQVJOX09OKCFzZCB8fCAhc2QtPmdyb3Vwcyk7CiAKLQlpZiAoY3B1ICE9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZ3JvdXBfY3B1cyhzZC0+Z3JvdXBzKSkpCisJaWYgKGNwdSAhPSBncm91cF9maXJzdF9jcHUoc2QtPmdyb3VwcykpCiAJCXJldHVybjsKIAogCWNoaWxkID0gc2QtPmNoaWxkOwpAQCAtODg2NSw3ICs5MTYyLDcgQEAKIAkgKiB3ZSB1c2UgYWxsb2NfYm9vdG1lbSgpLgogCSAqLwogCWlmIChhbGxvY19zaXplKSB7Ci0JCXB0ciA9ICh1bnNpZ25lZCBsb25nKWFsbG9jX2Jvb3RtZW0oYWxsb2Nfc2l6ZSk7CisJCXB0ciA9ICh1bnNpZ25lZCBsb25nKWt6YWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX05PV0FJVCk7CiAKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCQlpbml0X3Rhc2tfZ3JvdXAuc2UgPSAoc3RydWN0IHNjaGVkX2VudGl0eSAqKilwdHI7CkBAIC04OTM4LDYgKzkyMzUsOCBAQAogCQlycSA9IGNwdV9ycShpKTsKIAkJc3Bpbl9sb2NrX2luaXQoJnJxLT5sb2NrKTsKIAkJcnEtPm5yX3J1bm5pbmcgPSAwOworCQlycS0+Y2FsY19sb2FkX2FjdGl2ZSA9IDA7CisJCXJxLT5jYWxjX2xvYWRfdXBkYXRlID0gamlmZmllcyArIExPQURfRlJFUTsKIAkJaW5pdF9jZnNfcnEoJnJxLT5jZnMsIHJxKTsKIAkJaW5pdF9ydF9ycSgmcnEtPnJ0LCBycSk7CiAjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKQEAgLTg5NTgsNyArOTI1Nyw3IEBACiAJCSAqIDEwMjQpIGFuZCB0d28gY2hpbGQgZ3JvdXBzIEEwIGFuZCBBMSAob2Ygd2VpZ2h0IDEwMjQgZWFjaCksCiAJCSAqIHRoZW4gQTAncyBzaGFyZSBvZiB0aGUgY3B1IHJlc291cmNlIGlzOgogCQkgKgotCQkgKiAJQTAncyBiYW5kd2lkdGggPSAxMDI0IC8gKDEwKjEwMjQgKyAxMDI0ICsgMTAyNCkgPSA4LjMzJQorCQkgKglBMCdzIGJhbmR3aWR0aCA9IDEwMjQgLyAoMTAqMTAyNCArIDEwMjQgKyAxMDI0KSA9IDguMzMlCiAJCSAqCiAJCSAqIFdlIGFjaGlldmUgdGhpcyBieSBsZXR0aW5nIGluaXRfdGFza19ncm91cCdzIHRhc2tzIHNpdAogCQkgKiBkaXJlY3RseSBpbiBycS0+Y2ZzIChpLmUgaW5pdF90YXNrX2dyb3VwLT5zZVtdID0gTlVMTCkuCkBAIC05MDQ1LDIwICs5MzQ0LDI2IEBACiAJICogd2hlbiB0aGlzIHJ1bnF1ZXVlIGJlY29tZXMgImlkbGUiLgogCSAqLwogCWluaXRfaWRsZShjdXJyZW50LCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJY2FsY19sb2FkX3VwZGF0ZSA9IGppZmZpZXMgKyBMT0FEX0ZSRVE7CisKIAkvKgogCSAqIER1cmluZyBlYXJseSBib290dXAgd2UgcHJldGVuZCB0byBiZSBhIG5vcm1hbCB0YXNrOgogCSAqLwogCWN1cnJlbnQtPnNjaGVkX2NsYXNzID0gJmZhaXJfc2NoZWRfY2xhc3M7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgbm9oel9jcHVfbWFzayBpZiBDT05GSUdfQ1BVTUFTS19PRkZTVEFDSyAqLwotCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJm5vaHpfY3B1X21hc2spOworCWFsbG9jX2NwdW1hc2tfdmFyKCZub2h6X2NwdV9tYXNrLCBHRlBfTk9XQUlUKTsKICNpZmRlZiBDT05GSUdfU01QCiAjaWZkZWYgQ09ORklHX05PX0haCi0JYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3Zhcigmbm9oei5jcHVfbWFzayk7CisJYWxsb2NfY3B1bWFza192YXIoJm5vaHouY3B1X21hc2ssIEdGUF9OT1dBSVQpOworCWFsbG9jX2NwdW1hc2tfdmFyKCZub2h6LmlsYl9ncnBfbm9oel9tYXNrLCBHRlBfTk9XQUlUKTsKICNlbmRpZgotCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJmNwdV9pc29sYXRlZF9tYXApOworCWFsbG9jX2NwdW1hc2tfdmFyKCZjcHVfaXNvbGF0ZWRfbWFwLCBHRlBfTk9XQUlUKTsKICNlbmRpZiAvKiBTTVAgKi8KIAorCXBlcmZfY291bnRlcl9pbml0KCk7CisKIAlzY2hlZHVsZXJfcnVubmluZyA9IDE7CiB9CiAKQEAgLTk4MDAsNiArMTAxMDUsMTMgQEAKIAlpZiAoc3lzY3RsX3NjaGVkX3J0X3BlcmlvZCA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qCisJICogVGhlcmUncyBhbHdheXMgc29tZSBSVCB0YXNrcyBpbiB0aGUgcm9vdCBncm91cAorCSAqIC0tIG1pZ3JhdGlvbiwga3N0b3BtYWNoaW5lIGV0Yy4uCisJICovCisJaWYgKHN5c2N0bF9zY2hlZF9ydF9ydW50aW1lID09IDApCisJCXJldHVybiAtRUJVU1k7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGVmX3J0X2JhbmR3aWR0aC5ydF9ydW50aW1lX2xvY2ssIGZsYWdzKTsKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlzdHJ1Y3QgcnRfcnEgKnJ0X3JxID0gJmNwdV9ycShpKS0+cnQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfY3B1cHJpLmMgYi9rZXJuZWwvc2NoZWRfY3B1cHJpLmMKaW5kZXggMzQ0NzEyYS4uN2RlZmZjOSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2NwdXByaS5jCisrKyBiL2tlcm5lbC9zY2hlZF9jcHVwcmkuYwpAQCAtMTU0LDggKzE1NCwxMiBAQAogICovCiBpbnQgX19pbml0X3JlZm9rIGNwdXByaV9pbml0KHN0cnVjdCBjcHVwcmkgKmNwLCBib29sIGJvb3RtZW0pCiB7CisJZ2ZwX3QgZ2ZwID0gR0ZQX0tFUk5FTDsKIAlpbnQgaTsKIAorCWlmIChib290bWVtKQorCQlnZnAgPSBHRlBfTk9XQUlUOworCiAJbWVtc2V0KGNwLCAwLCBzaXplb2YoKmNwKSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQ1BVUFJJX05SX1BSSU9SSVRJRVM7IGkrKykgewpAQCAtMTYzLDkgKzE2Nyw3IEBACiAKIAkJc3Bpbl9sb2NrX2luaXQoJnZlYy0+bG9jayk7CiAJCXZlYy0+Y291bnQgPSAwOwotCQlpZiAoYm9vdG1lbSkKLQkJCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJnZlYy0+bWFzayk7Ci0JCWVsc2UgaWYgKCF6YWxsb2NfY3B1bWFza192YXIoJnZlYy0+bWFzaywgR0ZQX0tFUk5FTCkpCisJCWlmICghemFsbG9jX2NwdW1hc2tfdmFyKCZ2ZWMtPm1hc2ssIGdmcCkpCiAJCQlnb3RvIGNsZWFudXA7CiAJfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfZmFpci5jIGIva2VybmVsL3NjaGVkX2ZhaXIuYwppbmRleCAzODE2ZjIxLi41Zjk2NTBlIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfZmFpci5jCisrKyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKQEAgLTE0ODcsMTcgKzE0ODcsMTAgQEAKIAogCWZpbmRfbWF0Y2hpbmdfc2UoJnNlLCAmcHNlKTsKIAotCXdoaWxlIChzZSkgewotCQlCVUdfT04oIXBzZSk7CisJQlVHX09OKCFwc2UpOwogCi0JCWlmICh3YWtldXBfcHJlZW1wdF9lbnRpdHkoc2UsIHBzZSkgPT0gMSkgewotCQkJcmVzY2hlZF90YXNrKGN1cnIpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlzZSA9IHBhcmVudF9lbnRpdHkoc2UpOwotCQlwc2UgPSBwYXJlbnRfZW50aXR5KHBzZSk7Ci0JfQorCWlmICh3YWtldXBfcHJlZW1wdF9lbnRpdHkoc2UsIHBzZSkgPT0gMSkKKwkJcmVzY2hlZF90YXNrKGN1cnIpOwogfQogCiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19mYWlyKHN0cnVjdCBycSAqcnEpCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYyBiL2tlcm5lbC9zY2hlZF9pZGxldGFzay5jCmluZGV4IDhhMjFhMmUuLjQ5OTY3MmMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9pZGxldGFzay5jCisrKyBiL2tlcm5lbC9zY2hlZF9pZGxldGFzay5jCkBAIC0yMiw3ICsyMiw4IEBACiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwaWNrX25leHRfdGFza19pZGxlKHN0cnVjdCBycSAqcnEpCiB7CiAJc2NoZWRzdGF0X2luYyhycSwgc2NoZWRfZ29pZGxlKTsKLQorCS8qIGFkanVzdCB0aGUgYWN0aXZlIHRhc2tzIGFzIHdlIG1pZ2h0IGdvIGludG8gYSBsb25nIHNsZWVwICovCisJY2FsY19sb2FkX2FjY291bnRfYWN0aXZlKHJxKTsKIAlyZXR1cm4gcnEtPmlkbGU7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCBkODAzNDczLi44MDlhMjI4IDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L3BpZF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+Ci0jaW5jbHVkZSA8dHJhY2Uvc2NoZWQuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC00MSw4ICs0MSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqc2lncXVldWVfY2FjaGVwOwogCi1ERUZJTkVfVFJBQ0Uoc2NoZWRfc2lnbmFsX3NlbmQpOwotCiBzdGF0aWMgdm9pZCBfX3VzZXIgKnNpZ19oYW5kbGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IHNpZykKIHsKIAlyZXR1cm4gdC0+c2lnaGFuZC0+YWN0aW9uW3NpZyAtIDFdLnNhLnNhX2hhbmRsZXI7CkBAIC0yNDksMTQgKzI0NywxOSBAQAogLyoKICAqIEZsdXNoIGFsbCBwZW5kaW5nIHNpZ25hbHMgZm9yIGEgdGFzay4KICAqLwordm9pZCBfX2ZsdXNoX3NpZ25hbHMoc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0LCBUSUZfU0lHUEVORElORyk7CisJZmx1c2hfc2lncXVldWUoJnQtPnBlbmRpbmcpOworCWZsdXNoX3NpZ3F1ZXVlKCZ0LT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nKTsKK30KKwogdm9pZCBmbHVzaF9zaWduYWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKLQljbGVhcl90c2tfdGhyZWFkX2ZsYWcodCwgVElGX1NJR1BFTkRJTkcpOwotCWZsdXNoX3NpZ3F1ZXVlKCZ0LT5wZW5kaW5nKTsKLQlmbHVzaF9zaWdxdWV1ZSgmdC0+c2lnbmFsLT5zaGFyZWRfcGVuZGluZyk7CisJX19mbHVzaF9zaWduYWxzKHQpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMjI3OCwyNCArMjI4MSwxNyBAQAogCXJldHVybiBraWxsX3NvbWV0aGluZ19pbmZvKHNpZywgJmluZm8sIHBpZCk7CiB9CiAKLXN0YXRpYyBpbnQgZG9fdGtpbGwocGlkX3QgdGdpZCwgcGlkX3QgcGlkLCBpbnQgc2lnKQorc3RhdGljIGludAorZG9fc2VuZF9zcGVjaWZpYyhwaWRfdCB0Z2lkLCBwaWRfdCBwaWQsIGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvKQogewotCWludCBlcnJvcjsKLQlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZXJyb3IgPSAtRVNSQ0g7Ci0JaW5mby5zaV9zaWdubyA9IHNpZzsKLQlpbmZvLnNpX2Vycm5vID0gMDsKLQlpbmZvLnNpX2NvZGUgPSBTSV9US0lMTDsKLQlpbmZvLnNpX3BpZCA9IHRhc2tfdGdpZF92bnIoY3VycmVudCk7Ci0JaW5mby5zaV91aWQgPSBjdXJyZW50X3VpZCgpOworCWludCBlcnJvciA9IC1FU1JDSDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlwID0gZmluZF90YXNrX2J5X3ZwaWQocGlkKTsKIAlpZiAocCAmJiAodGdpZCA8PSAwIHx8IHRhc2tfdGdpZF92bnIocCkgPT0gdGdpZCkpIHsKLQkJZXJyb3IgPSBjaGVja19raWxsX3Blcm1pc3Npb24oc2lnLCAmaW5mbywgcCk7CisJCWVycm9yID0gY2hlY2tfa2lsbF9wZXJtaXNzaW9uKHNpZywgaW5mbywgcCk7CiAJCS8qCiAJCSAqIFRoZSBudWxsIHNpZ25hbCBpcyBhIHBlcm1pc3Npb25zIGFuZCBwcm9jZXNzIGV4aXN0ZW5jZQogCQkgKiBwcm9iZS4gIE5vIHNpZ25hbCBpcyBhY3R1YWxseSBkZWxpdmVyZWQuCkBAIC0yMzA1LDcgKzIzMDEsNyBAQAogCQkgKiBzaWduYWwgaXMgcHJpdmF0ZSBhbnl3YXkuCiAJCSAqLwogCQlpZiAoIWVycm9yICYmIHNpZyAmJiBsb2NrX3Rhc2tfc2lnaGFuZChwLCAmZmxhZ3MpKSB7Ci0JCQllcnJvciA9IHNwZWNpZmljX3NlbmRfc2lnX2luZm8oc2lnLCAmaW5mbywgcCk7CisJCQllcnJvciA9IHNwZWNpZmljX3NlbmRfc2lnX2luZm8oc2lnLCBpbmZvLCBwKTsKIAkJCXVubG9ja190YXNrX3NpZ2hhbmQocCwgJmZsYWdzKTsKIAkJfQogCX0KQEAgLTIzMTQsNiArMjMxMCwxOSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIGludCBkb190a2lsbChwaWRfdCB0Z2lkLCBwaWRfdCBwaWQsIGludCBzaWcpCit7CisJc3RydWN0IHNpZ2luZm8gaW5mbzsKKworCWluZm8uc2lfc2lnbm8gPSBzaWc7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gU0lfVEtJTEw7CisJaW5mby5zaV9waWQgPSB0YXNrX3RnaWRfdm5yKGN1cnJlbnQpOworCWluZm8uc2lfdWlkID0gY3VycmVudF91aWQoKTsKKworCXJldHVybiBkb19zZW5kX3NwZWNpZmljKHRnaWQsIHBpZCwgc2lnLCAmaW5mbyk7Cit9CisKIC8qKgogICogIHN5c190Z2tpbGwgLSBzZW5kIHNpZ25hbCB0byBvbmUgc3BlY2lmaWMgdGhyZWFkCiAgKiAgQHRnaWQ6IHRoZSB0aHJlYWQgZ3JvdXAgSUQgb2YgdGhlIHRocmVhZApAQCAtMjM2Myw2ICsyMzcyLDMyIEBACiAJcmV0dXJuIGtpbGxfcHJvY19pbmZvKHNpZywgJmluZm8sIHBpZCk7CiB9CiAKK2xvbmcgZG9fcnRfdGdzaWdxdWV1ZWluZm8ocGlkX3QgdGdpZCwgcGlkX3QgcGlkLCBpbnQgc2lnLCBzaWdpbmZvX3QgKmluZm8pCit7CisJLyogVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzaW5nbGUgdGFza3MgKi8KKwlpZiAocGlkIDw9IDAgfHwgdGdpZCA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE5vdCBldmVuIHJvb3QgY2FuIHByZXRlbmQgdG8gc2VuZCBzaWduYWxzIGZyb20gdGhlIGtlcm5lbC4KKwkgICBOb3IgY2FuIHRoZXkgaW1wZXJzb25hdGUgYSBraWxsKCksIHdoaWNoIGFkZHMgc291cmNlIGluZm8uICAqLworCWlmIChpbmZvLT5zaV9jb2RlID49IDApCisJCXJldHVybiAtRVBFUk07CisJaW5mby0+c2lfc2lnbm8gPSBzaWc7CisKKwlyZXR1cm4gZG9fc2VuZF9zcGVjaWZpYyh0Z2lkLCBwaWQsIHNpZywgaW5mbyk7Cit9CisKK1NZU0NBTExfREVGSU5FNChydF90Z3NpZ3F1ZXVlaW5mbywgcGlkX3QsIHRnaWQsIHBpZF90LCBwaWQsIGludCwgc2lnLAorCQlzaWdpbmZvX3QgX191c2VyICosIHVpbmZvKQoreworCXNpZ2luZm9fdCBpbmZvOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCB1aW5mbywgc2l6ZW9mKHNpZ2luZm9fdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkb19ydF90Z3NpZ3F1ZXVlaW5mbyh0Z2lkLCBwaWQsIHNpZywgJmluZm8pOworfQorCiBpbnQgZG9fc2lnYWN0aW9uKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qga19zaWdhY3Rpb24gKm9hY3QpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0ID0gY3VycmVudDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zbG93LXdvcmsuYyBiL2tlcm5lbC9zbG93LXdvcmsuYwppbmRleCBiMjhkMTkxMy4uNTIxZWQyMCAxMDA2NDQKLS0tIGEva2VybmVsL3Nsb3ctd29yay5jCisrKyBiL2tlcm5lbC9zbG93LXdvcmsuYwpAQCAtMzcyLDggKzM3Miw4IEBACiAJCXZzbWF4ICo9IGF0b21pY19yZWFkKCZzbG93X3dvcmtfdGhyZWFkX2NvdW50KTsKIAkJdnNtYXggLz0gMTAwOwogCi0JCXByZXBhcmVfdG9fd2FpdCgmc2xvd193b3JrX3RocmVhZF93cSwgJndhaXQsCi0JCQkJVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZSgmc2xvd193b3JrX3RocmVhZF93cSwgJndhaXQsCisJCQkJCSAgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKCFmcmVlemluZyhjdXJyZW50KSAmJgogCQkgICAgIXNsb3dfd29ya190aHJlYWRzX3Nob3VsZF9leGl0ICYmCiAJCSAgICAhc2xvd193b3JrX2F2YWlsYWJsZSh2c21heCkgJiYKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0aXJxLmMgYi9rZXJuZWwvc29mdGlycS5jCmluZGV4IGI1MjVkZDMuLjI1ODg4NWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0aXJxLmMKKysrIGIva2VybmVsL3NvZnRpcnEuYwpAQCAtMjQsNyArMjQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KLSNpbmNsdWRlIDx0cmFjZS9pcnEuaD4KKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogLyoKQEAgLTE4Niw5ICsxODgsNiBAQAogICovCiAjZGVmaW5lIE1BWF9TT0ZUSVJRX1JFU1RBUlQgMTAKIAotREVGSU5FX1RSQUNFKHNvZnRpcnFfZW50cnkpOwotREVGSU5FX1RSQUNFKHNvZnRpcnFfZXhpdCk7Ci0KIGFzbWxpbmthZ2Ugdm9pZCBfX2RvX3NvZnRpcnEodm9pZCkKIHsKIAlzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmg7CkBAIC04MjgsNyArODI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9fd2VhayBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSkKK2ludCBfX3dlYWsgYXJjaF9pbml0X2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBub2RlKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IGU3OTk4Y2YuLjQzOGQ5OWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KQEAgLTE3OTMsNiArMTc5NCwxMiBAQAogCQljYXNlIFBSX1NFVF9UU0M6CiAJCQllcnJvciA9IFNFVF9UU0NfQ1RMKGFyZzIpOwogCQkJYnJlYWs7CisJCWNhc2UgUFJfVEFTS19QRVJGX0NPVU5URVJTX0RJU0FCTEU6CisJCQllcnJvciA9IHBlcmZfY291bnRlcl90YXNrX2Rpc2FibGUoKTsKKwkJCWJyZWFrOworCQljYXNlIFBSX1RBU0tfUEVSRl9DT1VOVEVSU19FTkFCTEU6CisJCQllcnJvciA9IHBlcmZfY291bnRlcl90YXNrX2VuYWJsZSgpOworCQkJYnJlYWs7CiAJCWNhc2UgUFJfR0VUX1RJTUVSU0xBQ0s6CiAJCQllcnJvciA9IGN1cnJlbnQtPnRpbWVyX3NsYWNrX25zOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzX25pLmMgYi9rZXJuZWwvc3lzX25pLmMKaW5kZXggMjdkYWQyOS4uNjgzMjBmNiAxMDA2NDQKLS0tIGEva2VybmVsL3N5c19uaS5jCisrKyBiL2tlcm5lbC9zeXNfbmkuYwpAQCAtMTc1LDMgKzE3NSw2IEBACiBjb25kX3N5c2NhbGwoY29tcGF0X3N5c190aW1lcmZkX2dldHRpbWUpOwogY29uZF9zeXNjYWxsKHN5c19ldmVudGZkKTsKIGNvbmRfc3lzY2FsbChzeXNfZXZlbnRmZDIpOworCisvKiBwZXJmb3JtYW5jZSBjb3VudGVyczogKi8KK2NvbmRfc3lzY2FsbChzeXNfcGVyZl9jb3VudGVyX29wZW4pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IGIyOTcwZDUuLmNlNjY0ZjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbG93LXdvcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtMTE0LDYgKzExNSw3IEBACiAKICNpZmRlZiBDT05GSUdfTU9EVUxFUwogZXh0ZXJuIGNoYXIgbW9kcHJvYmVfcGF0aFtdOworZXh0ZXJuIGludCBtb2R1bGVzX2Rpc2FibGVkOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0NIUl9ERVZfU0cKIGV4dGVybiBpbnQgc2dfYmlnX2J1ZmY7CkBAIC01MzQsNiArNTM2LDE3IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3N0cmluZywKIAkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9zdHJpbmcsCiAJfSwKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibW9kdWxlc19kaXNhYmxlZCIsCisJCS5kYXRhCQk9ICZtb2R1bGVzX2Rpc2FibGVkLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkvKiBvbmx5IGhhbmRsZSBhIHRyYW5zaXRpb24gZnJvbSBkZWZhdWx0ICIwIiB0byAiMSIgKi8KKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAmb25lLAorCQkuZXh0cmEyCQk9ICZvbmUsCisJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUcpICYmIGRlZmluZWQoQ09ORklHX05FVCkKIAl7CkBAIC03MzEsNiArNzQ0LDE0IEBACiAJfSwKIAl7CiAJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAiYm9vdGxvYWRlcl92ZXJzaW9uIiwKKwkJLmRhdGEJCT0gJmJvb3Rsb2FkZXJfdmVyc2lvbiwKKwkJLm1heGxlbgkJPSBzaXplb2YgKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCiAJCS5wcm9jbmFtZQk9ICJrc3RhY2tfZGVwdGhfdG9fcHJpbnQiLAogCQkuZGF0YQkJPSAma3N0YWNrX2RlcHRoX3RvX3ByaW50LAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLApAQCAtOTEyLDYgKzkzMywzMiBAQAogCQkuY2hpbGQJCT0gc2xvd193b3JrX3N5c2N0bHMsCiAJfSwKICNlbmRpZgorI2lmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gInBlcmZfY291bnRlcl9wYXJhbm9pZCIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcGVyZl9jb3VudGVyX3BhcmFub2lkLAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfcGVyZl9jb3VudGVyX3BhcmFub2lkKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gInBlcmZfY291bnRlcl9tbG9ja19rYiIsCisJCS5kYXRhCQk9ICZzeXNjdGxfcGVyZl9jb3VudGVyX21sb2NrLAorCQkubWF4bGVuCQk9IHNpemVvZihzeXNjdGxfcGVyZl9jb3VudGVyX21sb2NrKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gInBlcmZfY291bnRlcl9tYXhfc2FtcGxlX3JhdGUiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3BlcmZfY291bnRlcl9zYW1wbGVfcmF0ZSwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX3BlcmZfY291bnRlcl9zYW1wbGVfcmF0ZSksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorI2VuZGlmCiAvKgogICogTk9URTogZG8gbm90IGFkZCBuZXcgZW50cmllcyB0byB0aGlzIHRhYmxlIHVubGVzcyB5b3UgaGF2ZSByZWFkCiAgKiBEb2N1bWVudGF0aW9uL3N5c2N0bC9jdGxfdW5udW1iZXJlZC50eHQKQEAgLTEyMjUsNyArMTI3Miw2IEBACiAJCS5zdHJhdGVneQk9ICZzeXNjdGxfamlmZmllcywKIAl9LAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NFQ1VSSVRZCiAJewogCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKIAkJLnByb2NuYW1lCT0gIm1tYXBfbWluX2FkZHIiLApAQCAtMTIzNCw3ICsxMjgwLDYgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvdWxvbmd2ZWNfbWlubWF4LAogCX0sCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfTlVNQQogCXsKIAkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwppbmRleCBlY2ZkN2I1Li44MDE4OWY2IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCisrKyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKQEAgLTQwMiw5ICs0MDIsNiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIAotCS8qIHNhdmUgbXVsdF9vcmlnIG9uIHJlZ2lzdHJhdGlvbiAqLwotCWMtPm11bHRfb3JpZyA9IGMtPm11bHQ7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOwogCXJldCA9IGNsb2Nrc291cmNlX2VucXVldWUoYyk7CiAJaWYgKCFyZXQpCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwppbmRleCA2ODdkZmY0Li5lOGM3N2Q5IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogLyoKICAqIFRoaXMgcmVhZC13cml0ZSBzcGlubG9jayBwcm90ZWN0cyB1cyBmcm9tIHJhY2VzIGluIFNNUCB3aGlsZQotICogcGxheWluZyB3aXRoIHh0aW1lIGFuZCBhdmVucnVuLgorICogcGxheWluZyB3aXRoIHh0aW1lLgogICovCiBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU0VRTE9DSyh4dGltZV9sb2NrKTsKIApAQCAtNzcsNiArNzcsMTAgQEAKIAljbG9jay0+Y3ljbGVfbGFzdCA9IGN5Y2xlX25vdzsKIAogCW5zZWMgPSBjeWMybnMoY2xvY2ssIGN5Y2xlX2RlbHRhKTsKKworCS8qIElmIGFyY2ggcmVxdWlyZXMsIGFkZCBpbiBnZXR0aW1lb2Zmc2V0KCkgKi8KKwluc2VjICs9IGFyY2hfZ2V0dGltZW9mZnNldCgpOworCiAJdGltZXNwZWNfYWRkX25zKCZ4dGltZSwgbnNlYyk7CiAKIAluc2VjID0gKChzNjQpY3ljbGVfZGVsdGEgKiBjbG9jay0+bXVsdF9vcmlnKSA+PiBjbG9jay0+c2hpZnQ7CkBAIC0xMTEsNiArMTE1LDkgQEAKIAkJLyogY29udmVydCB0byBuYW5vc2Vjb25kczogKi8KIAkJbnNlY3MgPSBjeWMybnMoY2xvY2ssIGN5Y2xlX2RlbHRhKTsKIAorCQkvKiBJZiBhcmNoIHJlcXVpcmVzLCBhZGQgaW4gZ2V0dGltZW9mZnNldCgpICovCisJCW5zZWNzICs9IGFyY2hfZ2V0dGltZW9mZnNldCgpOworCiAJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7CiAKIAl0aW1lc3BlY19hZGRfbnModHMsIG5zZWNzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggY2ZmZmZhZC4uYzAxZTU2OCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC0xMTIzLDUzICsxMTI0LDE0IEBACiB9CiAKIC8qCi0gKiBOciBvZiBhY3RpdmUgdGFza3MgLSBjb3VudGVkIGluIGZpeGVkLXBvaW50IG51bWJlcnMKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRfYWN0aXZlX3Rhc2tzKHZvaWQpCi17Ci0JcmV0dXJuIG5yX2FjdGl2ZSgpICogRklYRURfMTsKLX0KLQotLyoKLSAqIEhtbS4uIENoYW5nZWQgdGhpcywgYXMgdGhlIEdOVSBtYWtlIHNvdXJjZXMgKGxvYWQuYykgc2VlbXMgdG8KLSAqIGltcGx5IHRoYXQgYXZlbnJ1bltdIGlzIHRoZSBzdGFuZGFyZCBuYW1lIGZvciB0aGlzIGtpbmQgb2YgdGhpbmcuCi0gKiBOb3RoaW5nIGVsc2Ugc2VlbXMgdG8gYmUgc3RhbmRhcmRpemVkOiB0aGUgZnJhY3Rpb25hbCBzaXplIGV0YwotICogYWxsIHNlZW0gdG8gZGlmZmVyIG9uIGRpZmZlcmVudCBtYWNoaW5lcy4KLSAqCi0gKiBSZXF1aXJlcyB4dGltZV9sb2NrIHRvIGFjY2Vzcy4KLSAqLwotdW5zaWduZWQgbG9uZyBhdmVucnVuWzNdOwotCi1FWFBPUlRfU1lNQk9MKGF2ZW5ydW4pOwotCi0vKgotICogY2FsY19sb2FkIC0gZ2l2ZW4gdGljayBjb3VudCwgdXBkYXRlIHRoZSBhdmVucnVuIGxvYWQgZXN0aW1hdGVzLgotICogVGhpcyBpcyBjYWxsZWQgd2hpbGUgaG9sZGluZyBhIHdyaXRlX2xvY2sgb24geHRpbWVfbG9jay4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNhbGNfbG9hZCh1bnNpZ25lZCBsb25nIHRpY2tzKQotewotCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3Rhc2tzOyAvKiBmaXhlZC1wb2ludCAqLwotCXN0YXRpYyBpbnQgY291bnQgPSBMT0FEX0ZSRVE7Ci0KLQljb3VudCAtPSB0aWNrczsKLQlpZiAodW5saWtlbHkoY291bnQgPCAwKSkgewotCQlhY3RpdmVfdGFza3MgPSBjb3VudF9hY3RpdmVfdGFza3MoKTsKLQkJZG8gewotCQkJQ0FMQ19MT0FEKGF2ZW5ydW5bMF0sIEVYUF8xLCBhY3RpdmVfdGFza3MpOwotCQkJQ0FMQ19MT0FEKGF2ZW5ydW5bMV0sIEVYUF81LCBhY3RpdmVfdGFza3MpOwotCQkJQ0FMQ19MT0FEKGF2ZW5ydW5bMl0sIEVYUF8xNSwgYWN0aXZlX3Rhc2tzKTsKLQkJCWNvdW50ICs9IExPQURfRlJFUTsKLQkJfSB3aGlsZSAoY291bnQgPCAwKTsKLQl9Ci19Ci0KLS8qCiAgKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgdGltZXJzIGFuZCB0aGUgdGltZXItdHEgaW4gYm90dG9tIGhhbGYgY29udGV4dC4KICAqLwogc3RhdGljIHZvaWQgcnVuX3RpbWVyX3NvZnRpcnEoc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoKQogewogCXN0cnVjdCB0dmVjX2Jhc2UgKmJhc2UgPSBfX2dldF9jcHVfdmFyKHR2ZWNfYmFzZXMpOwogCisJcGVyZl9jb3VudGVyX2RvX3BlbmRpbmcoKTsKKwogCWhydGltZXJfcnVuX3BlbmRpbmcoKTsKIAogCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGJhc2UtPnRpbWVyX2ppZmZpZXMpKQpAQCAtMTE4NywxNiArMTE0OSw2IEBACiB9CiAKIC8qCi0gKiBDYWxsZWQgYnkgdGhlIHRpbWVyIGludGVycnVwdC4geHRpbWVfbG9jayBtdXN0IGFscmVhZHkgYmUgdGFrZW4KLSAqIGJ5IHRoZSB0aW1lciBJUlEhCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfdGltZXModW5zaWduZWQgbG9uZyB0aWNrcykKLXsKLQl1cGRhdGVfd2FsbF90aW1lKCk7Ci0JY2FsY19sb2FkKHRpY2tzKTsKLX0KLQotLyoKICAqIFRoZSA2NC1iaXQgamlmZmllcyB2YWx1ZSBpcyBub3QgYXRvbWljIC0geW91IE1VU1QgTk9UIHJlYWQgaXQKICAqIHdpdGhvdXQgc2FtcGxpbmcgdGhlIHNlcXVlbmNlIG51bWJlciBpbiB4dGltZV9sb2NrLgogICogamlmZmllcyBpcyBkZWZpbmVkIGluIHRoZSBsaW5rZXIgc2NyaXB0Li4uCkBAIC0xMjA1LDcgKzExNTcsOCBAQAogdm9pZCBkb190aW1lcih1bnNpZ25lZCBsb25nIHRpY2tzKQogewogCWppZmZpZXNfNjQgKz0gdGlja3M7Ci0JdXBkYXRlX3RpbWVzKHRpY2tzKTsKKwl1cGRhdGVfd2FsbF90aW1lKCk7CisJY2FsY19nbG9iYWxfbG9hZCgpOwogfQogCiAjaWZkZWYgX19BUkNIX1dBTlRfU1lTX0FMQVJNCkBAIC0xNDA2LDM3ICsxMzU5LDE3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBtZW1fdG90YWwsIHNhdl90b3RhbDsKIAl1bnNpZ25lZCBpbnQgbWVtX3VuaXQsIGJpdGNvdW50OwotCXVuc2lnbmVkIGxvbmcgc2VxOworCXN0cnVjdCB0aW1lc3BlYyB0cDsKIAogCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHN5c2luZm8pKTsKIAotCWRvIHsKLQkJc3RydWN0IHRpbWVzcGVjIHRwOwotCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwlrdGltZV9nZXRfdHMoJnRwKTsKKwltb25vdG9uaWNfdG9fYm9vdGJhc2VkKCZ0cCk7CisJaW5mby0+dXB0aW1lID0gdHAudHZfc2VjICsgKHRwLnR2X25zZWMgPyAxIDogMCk7CiAKLQkJLyoKLQkJICogVGhpcyBpcyBhbm5veWluZy4gIFRoZSBiZWxvdyBpcyB0aGUgc2FtZSB0aGluZwotCQkgKiBwb3NpeF9nZXRfY2xvY2tfbW9ub3RvbmljKCkgZG9lcywgYnV0IGl0IHdhbnRzIHRvCi0JCSAqIHRha2UgdGhlIGxvY2sgd2hpY2ggd2Ugd2FudCB0byBjb3ZlciB0aGUgbG9hZHMgc3R1ZmYKLQkJICogdG9vLgotCQkgKi8KKwlnZXRfYXZlbnJ1bihpbmZvLT5sb2FkcywgMCwgU0lfTE9BRF9TSElGVCAtIEZTSElGVCk7CiAKLQkJZ2V0bnN0aW1lb2ZkYXkoJnRwKTsKLQkJdHAudHZfc2VjICs9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYzsKLQkJdHAudHZfbnNlYyArPSB3YWxsX3RvX21vbm90b25pYy50dl9uc2VjOwotCQltb25vdG9uaWNfdG9fYm9vdGJhc2VkKCZ0cCk7Ci0JCWlmICh0cC50dl9uc2VjIC0gTlNFQ19QRVJfU0VDID49IDApIHsKLQkJCXRwLnR2X25zZWMgPSB0cC50dl9uc2VjIC0gTlNFQ19QRVJfU0VDOwotCQkJdHAudHZfc2VjKys7Ci0JCX0KLQkJaW5mby0+dXB0aW1lID0gdHAudHZfc2VjICsgKHRwLnR2X25zZWMgPyAxIDogMCk7Ci0KLQkJaW5mby0+bG9hZHNbMF0gPSBhdmVucnVuWzBdIDw8IChTSV9MT0FEX1NISUZUIC0gRlNISUZUKTsKLQkJaW5mby0+bG9hZHNbMV0gPSBhdmVucnVuWzFdIDw8IChTSV9MT0FEX1NISUZUIC0gRlNISUZUKTsKLQkJaW5mby0+bG9hZHNbMl0gPSBhdmVucnVuWzJdIDw8IChTSV9MT0FEX1NISUZUIC0gRlNISUZUKTsKLQotCQlpbmZvLT5wcm9jcyA9IG5yX3RocmVhZHM7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmeHRpbWVfbG9jaywgc2VxKSk7CisJaW5mby0+cHJvY3MgPSBucl90aHJlYWRzOwogCiAJc2lfbWVtaW5mbyhpbmZvKTsKIAlzaV9zd2FwaW5mbyhpbmZvKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9LY29uZmlnIGIva2VybmVsL3RyYWNlL0tjb25maWcKaW5kZXggNDE3ZDE5OC4uNGExM2U1YSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL0tjb25maWcKKysrIGIva2VybmVsL3RyYWNlL0tjb25maWcKQEAgLTQ4LDYgKzQ4LDIxIEBACiAgICAgICAgZGVwZW5kcyBvbiBIQVZFX0ZUUkFDRV9OTUlfRU5URVIKICAgICAgICBkZWZhdWx0IHkKIAorY29uZmlnIEVWRU5UX1RSQUNJTkcKKwlzZWxlY3QgQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSCisJYm9vbAorCitjb25maWcgQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSCisJc2VsZWN0IE1BUktFUlMKKwlib29sCisKKyMgQWxsIHRyYWNlciBvcHRpb25zIHNob3VsZCBzZWxlY3QgR0VORVJJQ19UUkFDRVIuIEZvciB0aG9zZSBvcHRpb25zIHRoYXQgYXJlCisjIGVuYWJsZWQgYnkgYWxsIHRyYWNlcnMgKGNvbnRleHQgc3dpdGNoIGFuZCBldmVudCB0cmFjZXIpIHRoZXkgc2VsZWN0IFRSQUNJTkcuCisjIFRoaXMgYWxsb3dzIHRob3NlIG9wdGlvbnMgdG8gYXBwZWFyIHdoZW4gbm8gb3RoZXIgdHJhY2VyIGlzIHNlbGVjdGVkLiBCdXQgdGhlCisjIG9wdGlvbnMgZG8gbm90IGFwcGVhciB3aGVuIHNvbWV0aGluZyBlbHNlIHNlbGVjdHMgaXQuIFdlIG5lZWQgdGhlIHR3byBvcHRpb25zCisjIEdFTkVSSUNfVFJBQ0VSIGFuZCBUUkFDSU5HIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB0byBhY2NvbXBsaXNoIHRoZQorIyBoaWRkaW5nIG9mIHRoZSBhdXRvbWF0aWMgb3B0aW9ucyBvcHRpb25zLgorCiBjb25maWcgVFJBQ0lORwogCWJvb2wKIAlzZWxlY3QgREVCVUdfRlMKQEAgLTU2LDYgKzcxLDExIEBACiAJc2VsZWN0IFRSQUNFUE9JTlRTCiAJc2VsZWN0IE5PUF9UUkFDRVIKIAlzZWxlY3QgQklOQVJZX1BSSU5URgorCXNlbGVjdCBFVkVOVF9UUkFDSU5HCisKK2NvbmZpZyBHRU5FUklDX1RSQUNFUgorCWJvb2wKKwlzZWxlY3QgVFJBQ0lORwogCiAjCiAjIE1pbmltdW0gcmVxdWlyZW1lbnRzIGFuIGFyY2hpdGVjdHVyZSBoYXMgdG8gbWVldCBmb3IgdXMgdG8KQEAgLTczLDE0ICs5MywyMCBAQAogCiBpZiBUUkFDSU5HX1NVUFBPUlQKIAotbWVudSAiVHJhY2VycyIKK21lbnVjb25maWcgRlRSQUNFCisJYm9vbCAiVHJhY2VycyIKKwlkZWZhdWx0IHkgaWYgREVCVUdfS0VSTkVMCisJaGVscAorCSBFbmFibGUgdGhlIGtlcm5lbCB0cmFjaW5nIGluZnJhc3RydWN0dXJlLgorCitpZiBGVFJBQ0UKIAogY29uZmlnIEZVTkNUSU9OX1RSQUNFUgogCWJvb2wgIktlcm5lbCBGdW5jdGlvbiBUcmFjZXIiCiAJZGVwZW5kcyBvbiBIQVZFX0ZVTkNUSU9OX1RSQUNFUgogCXNlbGVjdCBGUkFNRV9QT0lOVEVSCiAJc2VsZWN0IEtBTExTWU1TCi0Jc2VsZWN0IFRSQUNJTkcKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKIAlzZWxlY3QgQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSCiAJaGVscAogCSAgRW5hYmxlIHRoZSBrZXJuZWwgdG8gdHJhY2UgZXZlcnkga2VybmVsIGZ1bmN0aW9uLiBUaGlzIGlzIGRvbmUKQEAgLTEwNCwxMyArMTMwLDE0IEBACiAJICB0aGUgcmV0dXJuIHZhbHVlLiBUaGlzIGlzIGRvbmUgYnkgc2V0dGluZyB0aGUgY3VycmVudCByZXR1cm4gCiAJICBhZGRyZXNzIG9uIHRoZSBjdXJyZW50IHRhc2sgc3RydWN0dXJlIGludG8gYSBzdGFjayBvZiBjYWxscy4KIAorCiBjb25maWcgSVJRU09GRl9UUkFDRVIKIAlib29sICJJbnRlcnJ1cHRzLW9mZiBMYXRlbmN5IFRyYWNlciIKIAlkZWZhdWx0IG4KIAlkZXBlbmRzIG9uIFRSQUNFX0lSUUZMQUdTX1NVUFBPUlQKIAlkZXBlbmRzIG9uIEdFTkVSSUNfVElNRQogCXNlbGVjdCBUUkFDRV9JUlFGTEFHUwotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IFRSQUNFUl9NQVhfVFJBQ0UKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBtZWFzdXJlcyB0aGUgdGltZSBzcGVudCBpbiBpcnFzLW9mZiBjcml0aWNhbApAQCAtMTMxLDcgKzE1OCw3IEBACiAJZGVmYXVsdCBuCiAJZGVwZW5kcyBvbiBHRU5FUklDX1RJTUUKIAlkZXBlbmRzIG9uIFBSRUVNUFQKLQlzZWxlY3QgVFJBQ0lORworCXNlbGVjdCBHRU5FUklDX1RSQUNFUgogCXNlbGVjdCBUUkFDRVJfTUFYX1RSQUNFCiAJaGVscAogCSAgVGhpcyBvcHRpb24gbWVhc3VyZXMgdGhlIHRpbWUgc3BlbnQgaW4gcHJlZW1wdGlvbiBvZmYgY3JpdGljYWwKQEAgLTE1MCw3ICsxNzcsNyBAQAogY29uZmlnIFNZU1BST0ZfVFJBQ0VSCiAJYm9vbCAiU3lzcHJvZiBUcmFjZXIiCiAJZGVwZW5kcyBvbiBYODYKLQlzZWxlY3QgVFJBQ0lORworCXNlbGVjdCBHRU5FUklDX1RSQUNFUgogCXNlbGVjdCBDT05URVhUX1NXSVRDSF9UUkFDRVIKIAloZWxwCiAJICBUaGlzIHRyYWNlciBwcm92aWRlcyB0aGUgdHJhY2UgbmVlZGVkIGJ5IHRoZSAnU3lzcHJvZicgdXNlcnNwYWNlCkBAIC0xNTgsNDAgKzE4NSwzMyBAQAogCiBjb25maWcgU0NIRURfVFJBQ0VSCiAJYm9vbCAiU2NoZWR1bGluZyBMYXRlbmN5IFRyYWNlciIKLQlzZWxlY3QgVFJBQ0lORworCXNlbGVjdCBHRU5FUklDX1RSQUNFUgogCXNlbGVjdCBDT05URVhUX1NXSVRDSF9UUkFDRVIKIAlzZWxlY3QgVFJBQ0VSX01BWF9UUkFDRQogCWhlbHAKIAkgIFRoaXMgdHJhY2VyIHRyYWNrcyB0aGUgbGF0ZW5jeSBvZiB0aGUgaGlnaGVzdCBwcmlvcml0eSB0YXNrCiAJICB0byBiZSBzY2hlZHVsZWQgaW4sIHN0YXJ0aW5nIGZyb20gdGhlIHBvaW50IGl0IGhhcyB3b2tlbiB1cC4KIAotY29uZmlnIENPTlRFWFRfU1dJVENIX1RSQUNFUgotCWJvb2wgIlRyYWNlIHByb2Nlc3MgY29udGV4dCBzd2l0Y2hlcyIKLQlzZWxlY3QgVFJBQ0lORwotCXNlbGVjdCBNQVJLRVJTCi0JaGVscAotCSAgVGhpcyB0cmFjZXIgZ2V0cyBjYWxsZWQgZnJvbSB0aGUgY29udGV4dCBzd2l0Y2ggYW5kIHJlY29yZHMKLQkgIGFsbCBzd2l0Y2hpbmcgb2YgdGFza3MuCi0KLWNvbmZpZyBFVkVOVF9UUkFDRVIKLQlib29sICJUcmFjZSB2YXJpb3VzIGV2ZW50cyBpbiB0aGUga2VybmVsIgorY29uZmlnIEVOQUJMRV9ERUZBVUxUX1RSQUNFUlMKKwlib29sICJUcmFjZSBwcm9jZXNzIGNvbnRleHQgc3dpdGNoZXMgYW5kIGV2ZW50cyIKKwlkZXBlbmRzIG9uICFHRU5FUklDX1RSQUNFUgogCXNlbGVjdCBUUkFDSU5HCiAJaGVscAogCSAgVGhpcyB0cmFjZXIgaG9va3MgdG8gdmFyaW91cyB0cmFjZSBwb2ludHMgaW4gdGhlIGtlcm5lbAogCSAgYWxsb3dpbmcgdGhlIHVzZXIgdG8gcGljayBhbmQgY2hvb3NlIHdoaWNoIHRyYWNlIHBvaW50IHRoZXkKLQkgIHdhbnQgdG8gdHJhY2UuCisJICB3YW50IHRvIHRyYWNlLiBJdCBhbHNvIGluY2x1ZGVzIHRoZSBzY2hlZF9zd2l0Y2ggdHJhY2VyIHBsdWdpbi4KIAogY29uZmlnIEZUUkFDRV9TWVNDQUxMUwogCWJvb2wgIlRyYWNlIHN5c2NhbGxzIgogCWRlcGVuZHMgb24gSEFWRV9GVFJBQ0VfU1lTQ0FMTFMKLQlzZWxlY3QgVFJBQ0lORworCXNlbGVjdCBHRU5FUklDX1RSQUNFUgogCXNlbGVjdCBLQUxMU1lNUwogCWhlbHAKIAkgIEJhc2ljIHRyYWNlciB0byBjYXRjaCB0aGUgc3lzY2FsbCBlbnRyeSBhbmQgZXhpdCBldmVudHMuCiAKIGNvbmZpZyBCT09UX1RSQUNFUgogCWJvb2wgIlRyYWNlIGJvb3QgaW5pdGNhbGxzIgotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IENPTlRFWFRfU1dJVENIX1RSQUNFUgogCWhlbHAKIAkgIFRoaXMgdHJhY2VyIGhlbHBzIGRldmVsb3BlcnMgdG8gb3B0aW1pemUgYm9vdCB0aW1lczogaXQgcmVjb3JkcwpAQCAtMjA3LDggKzIyNywzNiBAQAogCSAgdG8gZW5hYmxlIHRoaXMgb24gYm9vdHVwLgogCiBjb25maWcgVFJBQ0VfQlJBTkNIX1BST0ZJTElORworCWJvb2wKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKKworY2hvaWNlCisJcHJvbXB0ICJCcmFuY2ggUHJvZmlsaW5nIgorCWRlZmF1bHQgQlJBTkNIX1BST0ZJTEVfTk9ORQorCWhlbHAKKwkgVGhlIGJyYW5jaCBwcm9maWxpbmcgaXMgYSBzb2Z0d2FyZSBwcm9maWxlci4gSXQgd2lsbCBhZGQgaG9va3MKKwkgaW50byB0aGUgQyBjb25kaXRpb25hbHMgdG8gdGVzdCB3aGljaCBwYXRoIGEgYnJhbmNoIHRha2VzLgorCisJIFRoZSBsaWtlbHkvdW5saWtlbHkgcHJvZmlsZXIgb25seSBsb29rcyBhdCB0aGUgY29uZGl0aW9ucyB0aGF0CisJIGFyZSBhbm5vdGF0ZWQgd2l0aCBhIGxpa2VseSBvciB1bmxpa2VseSBtYWNyby4KKworCSBUaGUgImFsbCBicmFuY2giIHByb2ZpbGVyIHdpbGwgcHJvZmlsZSBldmVyeSBpZiBzdGF0ZW1lbnQgaW4gdGhlCisJIGtlcm5lbC4gVGhpcyBwcm9maWxlciB3aWxsIGFsc28gZW5hYmxlIHRoZSBsaWtlbHkvdW5saWtlbHkKKwkgcHJvZmlsZXIgYXMgd2VsbC4KKworCSBFaXRoZXIgb2YgdGhlIGFib3ZlIHByb2ZpbGVycyBhZGQgYSBiaXQgb2Ygb3ZlcmhlYWQgdG8gdGhlIHN5c3RlbS4KKwkgSWYgdW5zdXJlIGNob29zZSAiTm8gYnJhbmNoIHByb2ZpbGluZyIuCisKK2NvbmZpZyBCUkFOQ0hfUFJPRklMRV9OT05FCisJYm9vbCAiTm8gYnJhbmNoIHByb2ZpbGluZyIKKwloZWxwCisJIE5vIGJyYW5jaCBwcm9maWxpbmcuIEJyYW5jaCBwcm9maWxpbmcgYWRkcyBhIGJpdCBvZiBvdmVyaGVhZC4KKwkgT25seSBlbmFibGUgaXQgaWYgeW91IHdhbnQgdG8gYW5hbHlzZSB0aGUgYnJhbmNoaW5nIGJlaGF2aW9yLgorCSBPdGhlcndpc2Uga2VlcCBpdCBkaXNhYmxlZC4KKworY29uZmlnIFBST0ZJTEVfQU5OT1RBVEVEX0JSQU5DSEVTCiAJYm9vbCAiVHJhY2UgbGlrZWx5L3VubGlrZWx5IHByb2ZpbGVyIgotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IFRSQUNFX0JSQU5DSF9QUk9GSUxJTkcKIAloZWxwCiAJICBUaGlzIHRyYWNlciBwcm9maWxlcyBhbGwgdGhlIHRoZSBsaWtlbHkgYW5kIHVubGlrZWx5IG1hY3JvcwogCSAgaW4gdGhlIGtlcm5lbC4gSXQgd2lsbCBkaXNwbGF5IHRoZSByZXN1bHRzIGluOgpAQCAtMjE4LDExICsyNjYsOSBAQAogCSAgTm90ZTogdGhpcyB3aWxsIGFkZCBhIHNpZ25pZmljYW50IG92ZXJoZWFkLCBvbmx5IHR1cm4gdGhpcwogCSAgb24gaWYgeW91IG5lZWQgdG8gcHJvZmlsZSB0aGUgc3lzdGVtJ3MgdXNlIG9mIHRoZXNlIG1hY3Jvcy4KIAotCSAgU2F5IE4gaWYgdW5zdXJlLgotCiBjb25maWcgUFJPRklMRV9BTExfQlJBTkNIRVMKIAlib29sICJQcm9maWxlIGFsbCBpZiBjb25kaXRpb25hbHMiCi0JZGVwZW5kcyBvbiBUUkFDRV9CUkFOQ0hfUFJPRklMSU5HCisJc2VsZWN0IFRSQUNFX0JSQU5DSF9QUk9GSUxJTkcKIAloZWxwCiAJICBUaGlzIHRyYWNlciBwcm9maWxlcyBhbGwgYnJhbmNoIGNvbmRpdGlvbnMuIEV2ZXJ5IGlmICgpCiAJICB0YWtlbiBpbiB0aGUga2VybmVsIGlzIHJlY29yZGVkIHdoZXRoZXIgaXQgaGl0IG9yIG1pc3MuCkBAIC0yMzAsMTEgKzI3NiwxMiBAQAogCiAJICAvZGVidWdmcy90cmFjaW5nL3Byb2ZpbGVfYnJhbmNoCiAKKwkgIFRoaXMgb3B0aW9uIGFsc28gZW5hYmxlcyB0aGUgbGlrZWx5L3VubGlrZWx5IHByb2ZpbGVyLgorCiAJICBUaGlzIGNvbmZpZ3VyYXRpb24sIHdoZW4gZW5hYmxlZCwgd2lsbCBpbXBvc2UgYSBncmVhdCBvdmVyaGVhZAogCSAgb24gdGhlIHN5c3RlbS4gVGhpcyBzaG91bGQgb25seSBiZSBlbmFibGVkIHdoZW4gdGhlIHN5c3RlbQogCSAgaXMgdG8gYmUgYW5hbHl6ZWQKLQotCSAgU2F5IE4gaWYgdW5zdXJlLgorZW5kY2hvaWNlCiAKIGNvbmZpZyBUUkFDSU5HX0JSQU5DSEVTCiAJYm9vbApAQCAtMjYxLDcgKzMwOCw3IEBACiBjb25maWcgUE9XRVJfVFJBQ0VSCiAJYm9vbCAiVHJhY2UgcG93ZXIgY29uc3VtcHRpb24gYmVoYXZpb3IiCiAJZGVwZW5kcyBvbiBYODYKLQlzZWxlY3QgVFJBQ0lORworCXNlbGVjdCBHRU5FUklDX1RSQUNFUgogCWhlbHAKIAkgIFRoaXMgdHJhY2VyIGhlbHBzIGRldmVsb3BlcnMgdG8gYW5hbHl6ZSBhbmQgb3B0aW1pemUgdGhlIGtlcm5lbHMKIAkgIHBvd2VyIG1hbmFnZW1lbnQgZGVjaXNpb25zLCBzcGVjaWZpY2FsbHkgdGhlIEMtc3RhdGUgYW5kIFAtc3RhdGUKQEAgLTI5NSwxNCArMzQyLDE0IEBACiBjb25maWcgSFdfQlJBTkNIX1RSQUNFUgogCWRlcGVuZHMgb24gSEFWRV9IV19CUkFOQ0hfVFJBQ0VSCiAJYm9vbCAiVHJhY2UgaHcgYnJhbmNoZXMiCi0Jc2VsZWN0IFRSQUNJTkcKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKIAloZWxwCiAJICBUaGlzIHRyYWNlciByZWNvcmRzIGFsbCBicmFuY2hlcyBvbiB0aGUgc3lzdGVtIGluIGEgY2lyY3VsYXIKIAkgIGJ1ZmZlciBnaXZpbmcgYWNjZXNzIHRvIHRoZSBsYXN0IE4gYnJhbmNoZXMgZm9yIGVhY2ggY3B1LgogCiBjb25maWcgS01FTVRSQUNFCiAJYm9vbCAiVHJhY2UgU0xBQiBhbGxvY2F0aW9ucyIKLQlzZWxlY3QgVFJBQ0lORworCXNlbGVjdCBHRU5FUklDX1RSQUNFUgogCWhlbHAKIAkgIGttZW10cmFjZSBwcm92aWRlcyB0cmFjaW5nIGZvciBzbGFiIGFsbG9jYXRvciBmdW5jdGlvbnMsIHN1Y2ggYXMKIAkgIGttYWxsb2MsIGtmcmVlLCBrbWVtX2NhY2hlX2FsbG9jLCBrbWVtX2NhY2hlX2ZyZWUgZXRjLi4gQ29sbGVjdGVkCkBAIC0zMjIsNyArMzY5LDcgQEAKIAogY29uZmlnIFdPUktRVUVVRV9UUkFDRVIKIAlib29sICJUcmFjZSB3b3JrcXVldWVzIgotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJaGVscAogCSAgVGhlIHdvcmtxdWV1ZSB0cmFjZXIgcHJvdmlkZXMgc29tZSBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbnMKICAgICAgICAgICBhYm91dCBlYWNoIGNwdSB3b3JrcXVldWUgdGhyZWFkIHN1Y2ggYXMgdGhlIG51bWJlciBvZiB0aGUKQEAgLTMzOCw3ICszODUsNyBAQAogCXNlbGVjdCBSRUxBWQogCXNlbGVjdCBERUJVR19GUwogCXNlbGVjdCBUUkFDRVBPSU5UUwotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IFNUQUNLVFJBQ0UKIAloZWxwCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gdHJhY2UgdGhlIGJsb2NrIGxheWVyIGFjdGlvbnMKQEAgLTM3NSw2ICs0MjIsMjAgQEAKIAkgd2VyZSBtYWRlLiBJZiBzbywgaXQgcnVucyBzdG9wX21hY2hpbmUgKHN0b3BzIGFsbCBDUFVTKQogCSBhbmQgbW9kaWZpZXMgdGhlIGNvZGUgdG8ganVtcCBvdmVyIHRoZSBjYWxsIHRvIGZ0cmFjZS4KIAorY29uZmlnIEZVTkNUSU9OX1BST0ZJTEVSCisJYm9vbCAiS2VybmVsIGZ1bmN0aW9uIHByb2ZpbGVyIgorCWRlcGVuZHMgb24gRlVOQ1RJT05fVFJBQ0VSCisJZGVmYXVsdCBuCisJaGVscAorCSBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBrZXJuZWwgZnVuY3Rpb24gcHJvZmlsZXIuIEEgZmlsZSBpcyBjcmVhdGVkCisJIGluIGRlYnVnZnMgY2FsbGVkIGZ1bmN0aW9uX3Byb2ZpbGVfZW5hYmxlZCB3aGljaCBkZWZhdWx0cyB0byB6ZXJvLgorCSBXaGVuIGEgMSBpcyBlY2hvZWQgaW50byB0aGlzIGZpbGUgcHJvZmlsaW5nIGJlZ2lucywgYW5kIHdoZW4gYQorCSB6ZXJvIGlzIGVudGVyZWQsIHByb2ZpbGluZyBzdG9wcy4gQSBmaWxlIGluIHRoZSB0cmFjZV9zdGF0cworCSBkaXJlY3RvcnkgY2FsbGVkIGZ1bmN0aW9ucywgdGhhdCBzaG93IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB0aGF0CisJIGhhdmUgYmVlbiBoaXQgYW5kIHRoZWlyIGNvdW50ZXJzLgorCisJIElmIGluIGRvdWJ0LCBzYXkgTgorCiBjb25maWcgRlRSQUNFX01DT1VOVF9SRUNPUkQKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBEWU5BTUlDX0ZUUkFDRQpAQCAtMzg1LDcgKzQ0Niw3IEBACiAKIGNvbmZpZyBGVFJBQ0VfU1RBUlRVUF9URVNUCiAJYm9vbCAiUGVyZm9ybSBhIHN0YXJ0dXAgdGVzdCBvbiBmdHJhY2UiCi0JZGVwZW5kcyBvbiBUUkFDSU5HCisJZGVwZW5kcyBvbiBHRU5FUklDX1RSQUNFUgogCXNlbGVjdCBGVFJBQ0VfU0VMRlRFU1QKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBwZXJmb3JtcyBhIHNlcmllcyBvZiBzdGFydHVwIHRlc3RzIG9uIGZ0cmFjZS4gT24gYm9vdHVwCkBAIC0zOTYsNyArNDU3LDcgQEAKIGNvbmZpZyBNTUlPVFJBQ0UKIAlib29sICJNZW1vcnkgbWFwcGVkIElPIHRyYWNpbmciCiAJZGVwZW5kcyBvbiBIQVZFX01NSU9UUkFDRV9TVVBQT1JUICYmIFBDSQotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJaGVscAogCSAgTW1pb3RyYWNlIHRyYWNlcyBNZW1vcnkgTWFwcGVkIEkvTyBhY2Nlc3MgYW5kIGlzIG1lYW50IGZvcgogCSAgZGVidWdnaW5nIGFuZCByZXZlcnNlIGVuZ2luZWVyaW5nLiBJdCBpcyBjYWxsZWQgZnJvbSB0aGUgaW9yZW1hcApAQCAtNDE2LDcgKzQ3NywyMyBAQAogCiAJICBTYXkgTiwgdW5sZXNzIHlvdSBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogCi1lbmRtZW51Citjb25maWcgUklOR19CVUZGRVJfQkVOQ0hNQVJLCisJdHJpc3RhdGUgIlJpbmcgYnVmZmVyIGJlbmNobWFyayBzdHJlc3MgdGVzdGVyIgorCWRlcGVuZHMgb24gUklOR19CVUZGRVIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjcmVhdGVzIGEgdGVzdCB0byBzdHJlc3MgdGhlIHJpbmcgYnVmZmVyIGFuZCBiZW5jaCBtYXJrIGl0LgorCSAgSXQgY3JlYXRlcyBpdHMgb3duIHJpbmcgYnVmZmVyIHN1Y2ggdGhhdCBpdCB3aWxsIG5vdCBpbnRlcmZlciB3aXRoCisJICBhbnkgb3RoZXIgdXNlcnMgb2YgdGhlIHJpbmcgYnVmZmVyIChzdWNoIGFzIGZ0cmFjZSkuIEl0IHRoZW4gY3JlYXRlcworCSAgYSBwcm9kdWNlciBhbmQgY29uc3VtZXIgdGhhdCB3aWxsIHJ1biBmb3IgMTAgc2Vjb25kcyBhbmQgc2xlZXAgZm9yCisJICAxMCBzZWNvbmRzLiBFYWNoIGludGVydmFsIGl0IHdpbGwgcHJpbnQgb3V0IHRoZSBudW1iZXIgb2YgZXZlbnRzCisJICBpdCByZWNvcmRlZCBhbmQgZ2l2ZSBhIHJvdWdoIGVzdGltYXRlIG9mIGhvdyBsb25nIGVhY2ggaXRlcmF0aW9uIHRvb2suCisKKwkgIEl0IGRvZXMgbm90IGRpc2FibGUgaW50ZXJydXB0cyBvciByYWlzZSBpdHMgcHJpb3JpdHksIHNvIGl0IG1heSBiZQorCSAgYWZmZWN0ZWQgYnkgcHJvY2Vzc2VzIHRoYXQgYXJlIHJ1bm5pbmcuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4KKworZW5kaWYgIyBGVFJBQ0UKIAogZW5kaWYgIyBUUkFDSU5HX1NVUFBPUlQKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL01ha2VmaWxlIGIva2VybmVsL3RyYWNlL01ha2VmaWxlCmluZGV4IDI2MzBmNTEuLjg0NDE2NGQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9NYWtlZmlsZQorKysgYi9rZXJuZWwvdHJhY2UvTWFrZWZpbGUKQEAgLTE1LDExICsxNSwxNyBAQAogS0JVSUxEX0NGTEFHUyArPSAtRERJU0FCTEVfQlJBTkNIX1BST0ZJTElORwogZW5kaWYKIAorIworIyBNYWtlIHRoZSB0cmFjZSBjbG9ja3MgYXZhaWxhYmxlIGdlbmVyYWxseTogaXQncyBpbmZyYXN0cnVjdHVyZQorIyByZWxpZWQgb24gYnkgcHRyYWNlIGZvciBleGFtcGxlOgorIworb2JqLXkgKz0gdHJhY2VfY2xvY2subworCiBvYmotJChDT05GSUdfRlVOQ1RJT05fVFJBQ0VSKSArPSBsaWJmdHJhY2Uubwogb2JqLSQoQ09ORklHX1JJTkdfQlVGRkVSKSArPSByaW5nX2J1ZmZlci5vCitvYmotJChDT05GSUdfUklOR19CVUZGRVJfQkVOQ0hNQVJLKSArPSByaW5nX2J1ZmZlcl9iZW5jaG1hcmsubwogCiBvYmotJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2Uubwotb2JqLSQoQ09ORklHX1RSQUNJTkcpICs9IHRyYWNlX2Nsb2NrLm8KIG9iai0kKENPTkZJR19UUkFDSU5HKSArPSB0cmFjZV9vdXRwdXQubwogb2JqLSQoQ09ORklHX1RSQUNJTkcpICs9IHRyYWNlX3N0YXQubwogb2JqLSQoQ09ORklHX1RSQUNJTkcpICs9IHRyYWNlX3ByaW50ay5vCkBAIC0zOSwxMiArNDUsMTQgQEAKIG9iai0kKENPTkZJR19QT1dFUl9UUkFDRVIpICs9IHRyYWNlX3Bvd2VyLm8KIG9iai0kKENPTkZJR19LTUVNVFJBQ0UpICs9IGttZW10cmFjZS5vCiBvYmotJChDT05GSUdfV09SS1FVRVVFX1RSQUNFUikgKz0gdHJhY2Vfd29ya3F1ZXVlLm8KLW9iai0kKENPTkZJR19CTEtfREVWX0lPX1RSQUNFKQkrPSBibGt0cmFjZS5vCi1vYmotJChDT05GSUdfRVZFTlRfVFJBQ0VSKSArPSB0cmFjZV9ldmVudHMubwotb2JqLSQoQ09ORklHX0VWRU5UX1RSQUNFUikgKz0gZXZlbnRzLm8KLW9iai0kKENPTkZJR19FVkVOVF9UUkFDRVIpICs9IHRyYWNlX2V4cG9ydC5vCitvYmotJChDT05GSUdfQkxLX0RFVl9JT19UUkFDRSkgKz0gYmxrdHJhY2UubworaWZlcSAoJChDT05GSUdfQkxPQ0spLHkpCitvYmotJChDT05GSUdfRVZFTlRfVFJBQ0lORykgKz0gYmxrdHJhY2UubworZW5kaWYKK29iai0kKENPTkZJR19FVkVOVF9UUkFDSU5HKSArPSB0cmFjZV9ldmVudHMubworb2JqLSQoQ09ORklHX0VWRU5UX1RSQUNJTkcpICs9IHRyYWNlX2V4cG9ydC5vCiBvYmotJChDT05GSUdfRlRSQUNFX1NZU0NBTExTKSArPSB0cmFjZV9zeXNjYWxscy5vCiBvYmotJChDT05GSUdfRVZFTlRfUFJPRklMRSkgKz0gdHJhY2VfZXZlbnRfcHJvZmlsZS5vCi1vYmotJChDT05GSUdfRVZFTlRfVFJBQ0VSKSArPSB0cmFjZV9ldmVudHNfZmlsdGVyLm8KK29iai0kKENPTkZJR19FVkVOVF9UUkFDSU5HKSArPSB0cmFjZV9ldmVudHNfZmlsdGVyLm8KIAogbGliZnRyYWNlLXkgOj0gZnRyYWNlLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9ibGt0cmFjZS5jIGIva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKaW5kZXggOTIxZWY1ZC4uMzlhZjhhZiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMKQEAgLTIzLDEwICsyMywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDx0cmFjZS9ibG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9ibG9jay5oPgorCiAjaW5jbHVkZSAidHJhY2Vfb3V0cHV0LmgiCiAKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JT19UUkFDRQorCiBzdGF0aWMgdW5zaWduZWQgaW50IGJsa3RyYWNlX3NlcSBfX3JlYWRfbW9zdGx5ID0gMTsKIAogc3RhdGljIHN0cnVjdCB0cmFjZV9hcnJheSAqYmxrX3RyOwpAQCAtMTQ3LDcgKzE1MSw3IEBACiB7CiAJaWYgKCgoYnQtPmFjdF9tYXNrIDw8IEJMS19UQ19TSElGVCkgJiB3aGF0KSA9PSAwKQogCQlyZXR1cm4gMTsKLQlpZiAoc2VjdG9yIDwgYnQtPnN0YXJ0X2xiYSB8fCBzZWN0b3IgPiBidC0+ZW5kX2xiYSkKKwlpZiAoc2VjdG9yICYmIChzZWN0b3IgPCBidC0+c3RhcnRfbGJhIHx8IHNlY3RvciA+IGJ0LT5lbmRfbGJhKSkKIAkJcmV0dXJuIDE7CiAJaWYgKGJ0LT5waWQgJiYgcGlkICE9IGJ0LT5waWQpCiAJCXJldHVybiAxOwpAQCAtMTkyLDcgKzE5Niw3IEBACiAJd2hhdCB8PSBNQVNLX1RDX0JJVChydywgRElTQ0FSRCk7CiAKIAlwaWQgPSB0c2stPnBpZDsKLQlpZiAodW5saWtlbHkoYWN0X2xvZ19jaGVjayhidCwgd2hhdCwgc2VjdG9yLCBwaWQpKSkKKwlpZiAoYWN0X2xvZ19jaGVjayhidCwgd2hhdCwgc2VjdG9yLCBwaWQpKQogCQlyZXR1cm47CiAJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIApAQCAtMjYyLDYgKzI2Niw3IEBACiB7CiAJZGVidWdmc19yZW1vdmUoYnQtPm1zZ19maWxlKTsKIAlkZWJ1Z2ZzX3JlbW92ZShidC0+ZHJvcHBlZF9maWxlKTsKKwlkZWJ1Z2ZzX3JlbW92ZShidC0+ZGlyKTsKIAlyZWxheV9jbG9zZShidC0+cmNoYW4pOwogCWZyZWVfcGVyY3B1KGJ0LT5zZXF1ZW5jZSk7CiAJZnJlZV9wZXJjcHUoYnQtPm1zZ19kYXRhKTsKQEAgLTQwMywxMSArNDA4LDI5IEBACiAJLnJlbW92ZV9idWZfZmlsZQk9IGJsa19yZW1vdmVfYnVmX2ZpbGVfY2FsbGJhY2ssCiB9OwogCitzdGF0aWMgdm9pZCBibGtfdHJhY2Vfc2V0dXBfbGJhKHN0cnVjdCBibGtfdHJhY2UgKmJ0LAorCQkJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IGhkX3N0cnVjdCAqcGFydCA9IE5VTEw7CisKKwlpZiAoYmRldikKKwkJcGFydCA9IGJkZXYtPmJkX3BhcnQ7CisKKwlpZiAocGFydCkgeworCQlidC0+c3RhcnRfbGJhID0gcGFydC0+c3RhcnRfc2VjdDsKKwkJYnQtPmVuZF9sYmEgPSBwYXJ0LT5zdGFydF9zZWN0ICsgcGFydC0+bnJfc2VjdHM7CisJfSBlbHNlIHsKKwkJYnQtPnN0YXJ0X2xiYSA9IDA7CisJCWJ0LT5lbmRfbGJhID0gLTFVTEw7CisJfQorfQorCiAvKgogICogU2V0dXAgZXZlcnl0aGluZyByZXF1aXJlZCB0byBzdGFydCB0cmFjaW5nCiAgKi8KIGludCBkb19ibGtfdHJhY2Vfc2V0dXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKm5hbWUsIGRldl90IGRldiwKLQkJCXN0cnVjdCBibGtfdXNlcl90cmFjZV9zZXR1cCAqYnV0cykKKwkJICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCSAgICAgICBzdHJ1Y3QgYmxrX3VzZXJfdHJhY2Vfc2V0dXAgKmJ1dHMpCiB7CiAJc3RydWN0IGJsa190cmFjZSAqb2xkX2J0LCAqYnQgPSBOVUxMOwogCXN0cnVjdCBkZW50cnkgKmRpciA9IE5VTEw7CkBAIC00ODAsMTAgKzUwMywxMyBAQAogCWlmICghYnQtPmFjdF9tYXNrKQogCQlidC0+YWN0X21hc2sgPSAodTE2KSAtMTsKIAotCWJ0LT5zdGFydF9sYmEgPSBidXRzLT5zdGFydF9sYmE7Ci0JYnQtPmVuZF9sYmEgPSBidXRzLT5lbmRfbGJhOwotCWlmICghYnQtPmVuZF9sYmEpCi0JCWJ0LT5lbmRfbGJhID0gLTFVTEw7CisJYmxrX3RyYWNlX3NldHVwX2xiYShidCwgYmRldik7CisKKwkvKiBvdmVyd3JpdGUgd2l0aCB1c2VyIHNldHRpbmdzICovCisJaWYgKGJ1dHMtPnN0YXJ0X2xiYSkKKwkJYnQtPnN0YXJ0X2xiYSA9IGJ1dHMtPnN0YXJ0X2xiYTsKKwlpZiAoYnV0cy0+ZW5kX2xiYSkKKwkJYnQtPmVuZF9sYmEgPSBidXRzLT5lbmRfbGJhOwogCiAJYnQtPnBpZCA9IGJ1dHMtPnBpZDsKIAlidC0+dHJhY2Vfc3RhdGUgPSBCbGt0cmFjZV9zZXR1cDsKQEAgLTUwNSw2ICs1MzEsNyBAQAogfQogCiBpbnQgYmxrX3RyYWNlX3NldHVwKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpuYW1lLCBkZXZfdCBkZXYsCisJCSAgICBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAogCQkgICAgY2hhciBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgYmxrX3VzZXJfdHJhY2Vfc2V0dXAgYnV0czsKQEAgLTUxNCw3ICs1NDEsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0ID0gZG9fYmxrX3RyYWNlX3NldHVwKHEsIG5hbWUsIGRldiwgJmJ1dHMpOworCXJldCA9IGRvX2Jsa190cmFjZV9zZXR1cChxLCBuYW1lLCBkZXYsIGJkZXYsICZidXRzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCkBAIC01ODIsNyArNjA5LDcgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgQkxLVFJBQ0VTRVRVUDoKIAkJYmRldm5hbWUoYmRldiwgYik7Ci0JCXJldCA9IGJsa190cmFjZV9zZXR1cChxLCBiLCBiZGV2LT5iZF9kZXYsIGFyZyk7CisJCXJldCA9IGJsa190cmFjZV9zZXR1cChxLCBiLCBiZGV2LT5iZF9kZXYsIGJkZXYsIGFyZyk7CiAJCWJyZWFrOwogCWNhc2UgQkxLVFJBQ0VTVEFSVDoKIAkJc3RhcnQgPSAxOwpAQCAtNjQyLDEyICs2NjksMTIgQEAKIAogCWlmIChibGtfcGNfcmVxdWVzdChycSkpIHsKIAkJd2hhdCB8PSBCTEtfVENfQUNUKEJMS19UQ19QQyk7Ci0JCV9fYmxrX2FkZF90cmFjZShidCwgMCwgcnEtPmRhdGFfbGVuLCBydywgd2hhdCwgcnEtPmVycm9ycywKLQkJCQlycS0+Y21kX2xlbiwgcnEtPmNtZCk7CisJCV9fYmxrX2FkZF90cmFjZShidCwgMCwgYmxrX3JxX2J5dGVzKHJxKSwgcncsCisJCQkJd2hhdCwgcnEtPmVycm9ycywgcnEtPmNtZF9sZW4sIHJxLT5jbWQpOwogCX0gZWxzZSAgewogCQl3aGF0IHw9IEJMS19UQ19BQ1QoQkxLX1RDX0ZTKTsKLQkJX19ibGtfYWRkX3RyYWNlKGJ0LCBycS0+aGFyZF9zZWN0b3IsIHJxLT5oYXJkX25yX3NlY3RvcnMgPDwgOSwKLQkJCQlydywgd2hhdCwgcnEtPmVycm9ycywgMCwgTlVMTCk7CisJCV9fYmxrX2FkZF90cmFjZShidCwgYmxrX3JxX3BvcyhycSksIGJsa19ycV9ieXRlcyhycSksIHJ3LAorCQkJCXdoYXQsIHJxLT5lcnJvcnMsIDAsIE5VTEwpOwogCX0KIH0KIApAQCAtODA5LDcgKzgzNiw2IEBACiAgKiBAYmlvOgl0aGUgc291cmNlIGJpbwogICogQGRldjoJdGFyZ2V0IGRldmljZQogICogQGZyb206CXNvdXJjZSBzZWN0b3IKLSAqIEB0bzoJCXRhcmdldCBzZWN0b3IKICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgICBEZXZpY2UgbWFwcGVyIG9yIHJhaWQgdGFyZ2V0IHNvbWV0aW1lcyBuZWVkIHRvIHNwbGl0IGEgYmlvIGJlY2F1c2UKQEAgLTgxNyw3ICs4NDMsNyBAQAogICoKICAqKi8KIHN0YXRpYyB2b2lkIGJsa19hZGRfdHJhY2VfcmVtYXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKLQkJCQkgICAgICAgZGV2X3QgZGV2LCBzZWN0b3JfdCBmcm9tLCBzZWN0b3JfdCB0bykKKwkJCQkgICAgICAgZGV2X3QgZGV2LCBzZWN0b3JfdCBmcm9tKQogewogCXN0cnVjdCBibGtfdHJhY2UgKmJ0ID0gcS0+YmxrX3RyYWNlOwogCXN0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgcjsKQEAgLTgyNSwxMiArODUxLDEzIEBACiAJaWYgKGxpa2VseSghYnQpKQogCQlyZXR1cm47CiAKLQlyLmRldmljZSA9IGNwdV90b19iZTMyKGRldik7Ci0Jci5kZXZpY2VfZnJvbSA9IGNwdV90b19iZTMyKGJpby0+YmlfYmRldi0+YmRfZGV2KTsKLQlyLnNlY3RvciA9IGNwdV90b19iZTY0KHRvKTsKKwlyLmRldmljZV9mcm9tID0gY3B1X3RvX2JlMzIoZGV2KTsKKwlyLmRldmljZV90byAgID0gY3B1X3RvX2JlMzIoYmlvLT5iaV9iZGV2LT5iZF9kZXYpOworCXIuc2VjdG9yX2Zyb20gPSBjcHVfdG9fYmU2NChmcm9tKTsKIAotCV9fYmxrX2FkZF90cmFjZShidCwgZnJvbSwgYmlvLT5iaV9zaXplLCBiaW8tPmJpX3J3LCBCTEtfVEFfUkVNQVAsCi0JCQkhYmlvX2ZsYWdnZWQoYmlvLCBCSU9fVVBUT0RBVEUpLCBzaXplb2YociksICZyKTsKKwlfX2Jsa19hZGRfdHJhY2UoYnQsIGJpby0+Ymlfc2VjdG9yLCBiaW8tPmJpX3NpemUsIGJpby0+YmlfcncsCisJCQlCTEtfVEFfUkVNQVAsICFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSksCisJCQlzaXplb2YociksICZyKTsKIH0KIAogLyoqCkBAIC04NTQsMTEgKzg4MSwxMSBAQAogCQlyZXR1cm47CiAKIAlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKQotCQlfX2Jsa19hZGRfdHJhY2UoYnQsIDAsIHJxLT5kYXRhX2xlbiwgMCwgQkxLX1RBX0RSVl9EQVRBLAotCQkJCXJxLT5lcnJvcnMsIGxlbiwgZGF0YSk7CisJCV9fYmxrX2FkZF90cmFjZShidCwgMCwgYmxrX3JxX2J5dGVzKHJxKSwgMCwKKwkJCQlCTEtfVEFfRFJWX0RBVEEsIHJxLT5lcnJvcnMsIGxlbiwgZGF0YSk7CiAJZWxzZQotCQlfX2Jsa19hZGRfdHJhY2UoYnQsIHJxLT5oYXJkX3NlY3RvciwgcnEtPmhhcmRfbnJfc2VjdG9ycyA8PCA5LAotCQkJCTAsIEJMS19UQV9EUlZfREFUQSwgcnEtPmVycm9ycywgbGVuLCBkYXRhKTsKKwkJX19ibGtfYWRkX3RyYWNlKGJ0LCBibGtfcnFfcG9zKHJxKSwgYmxrX3JxX2J5dGVzKHJxKSwgMCwKKwkJCQlCTEtfVEFfRFJWX0RBVEEsIHJxLT5lcnJvcnMsIGxlbiwgZGF0YSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChibGtfYWRkX2RyaXZlcl9kYXRhKTsKIApAQCAtOTcxLDYgKzk5OCwxNiBAQAogCXJldHVybiB0ZV9ibGtfaW9fdHJhY2UoZW50KSArIDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTMyIHRfYWN0aW9uKGNvbnN0IHN0cnVjdCB0cmFjZV9lbnRyeSAqZW50KQoreworCXJldHVybiB0ZV9ibGtfaW9fdHJhY2UoZW50KS0+YWN0aW9uOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB0X2J5dGVzKGNvbnN0IHN0cnVjdCB0cmFjZV9lbnRyeSAqZW50KQoreworCXJldHVybiB0ZV9ibGtfaW9fdHJhY2UoZW50KS0+Ynl0ZXM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdTMyIHRfc2VjKGNvbnN0IHN0cnVjdCB0cmFjZV9lbnRyeSAqZW50KQogewogCXJldHVybiB0ZV9ibGtfaW9fdHJhY2UoZW50KS0+Ynl0ZXMgPj4gOTsKQEAgLTk5NiwxMSArMTAzMywxMSBAQAogCQkJICBzdHJ1Y3QgYmxrX2lvX3RyYWNlX3JlbWFwICpyKQogewogCWNvbnN0IHN0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgKl9fciA9IHBkdV9zdGFydChlbnQpOwotCV9fdTY0IHNlY3RvciA9IF9fci0+c2VjdG9yOworCV9fdTY0IHNlY3Rvcl9mcm9tID0gX19yLT5zZWN0b3JfZnJvbTsKIAotCXItPmRldmljZSA9IGJlMzJfdG9fY3B1KF9fci0+ZGV2aWNlKTsKIAlyLT5kZXZpY2VfZnJvbSA9IGJlMzJfdG9fY3B1KF9fci0+ZGV2aWNlX2Zyb20pOwotCXItPnNlY3RvciA9IGJlNjRfdG9fY3B1KHNlY3Rvcik7CisJci0+ZGV2aWNlX3RvICAgPSBiZTMyX3RvX2NwdShfX3ItPmRldmljZV90byk7CisJci0+c2VjdG9yX2Zyb20gPSBiZTY0X3RvX2NwdShzZWN0b3JfZnJvbSk7CiB9CiAKIHR5cGVkZWYgaW50IChibGtfbG9nX2FjdGlvbl90KSAoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLCBjb25zdCBjaGFyICphY3QpOwpAQCAtMTAzMSwzNiArMTA2OCw5OCBAQAogCQkJCU1BSk9SKHQtPmRldmljZSksIE1JTk9SKHQtPmRldmljZSksIGFjdCwgcndicyk7CiB9CiAKK3N0YXRpYyBpbnQgYmxrX2xvZ19kdW1wX3BkdShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwZHVfYnVmOworCWludCBwZHVfbGVuOworCWludCBpLCBlbmQsIHJldDsKKworCXBkdV9idWYgPSBwZHVfc3RhcnQoZW50KTsKKwlwZHVfbGVuID0gdGVfYmxrX2lvX3RyYWNlKGVudCktPnBkdV9sZW47CisKKwlpZiAoIXBkdV9sZW4pCisJCXJldHVybiAxOworCisJLyogZmluZCB0aGUgbGFzdCB6ZXJvIHRoYXQgbmVlZHMgdG8gYmUgcHJpbnRlZCAqLworCWZvciAoZW5kID0gcGR1X2xlbiAtIDE7IGVuZCA+PSAwOyBlbmQtLSkKKwkJaWYgKHBkdV9idWZbZW5kXSkKKwkJCWJyZWFrOworCWVuZCsrOworCisJaWYgKCF0cmFjZV9zZXFfcHV0YyhzLCAnKCcpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwZHVfbGVuOyBpKyspIHsKKworCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIlcyUwMngiLAorCQkJCSAgICAgICBpID09IDAgPyAiIiA6ICIgIiwgcGR1X2J1ZltpXSk7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIHJldDsKKworCQkvKgorCQkgKiBzdG9wIHdoZW4gdGhlIHJlc3QgaXMganVzdCB6ZXJvZXMgYW5kIGluZGljYXRlIHNvCisJCSAqIHdpdGggYSAiLi4iIGFwcGVuZGVkCisJCSAqLworCQlpZiAoaSA9PSBlbmQgJiYgZW5kICE9IHBkdV9sZW4gLSAxKQorCQkJcmV0dXJuIHRyYWNlX3NlcV9wdXRzKHMsICIgLi4pICIpOworCX0KKworCXJldHVybiB0cmFjZV9zZXFfcHV0cyhzLCAiKSAiKTsKK30KKwogc3RhdGljIGludCBibGtfbG9nX2dlbmVyaWMoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3Qgc3RydWN0IHRyYWNlX2VudHJ5ICplbnQpCiB7CiAJY2hhciBjbWRbVEFTS19DT01NX0xFTl07CiAKIAl0cmFjZV9maW5kX2NtZGxpbmUoZW50LT5waWQsIGNtZCk7CiAKLQlpZiAodF9zZWMoZW50KSkKLQkJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiVsbHUgKyAldSBbJXNdXG4iLAotCQkJCQl0X3NlY3RvcihlbnQpLCB0X3NlYyhlbnQpLCBjbWQpOwotCXJldHVybiB0cmFjZV9zZXFfcHJpbnRmKHMsICJbJXNdXG4iLCBjbWQpOworCWlmICh0X2FjdGlvbihlbnQpICYgQkxLX1RDX0FDVChCTEtfVENfUEMpKSB7CisJCWludCByZXQ7CisKKwkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJXUgIiwgdF9ieXRlcyhlbnQpKTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gMDsKKwkJcmV0ID0gYmxrX2xvZ19kdW1wX3BkdShzLCBlbnQpOworCQlpZiAoIXJldCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiWyVzXVxuIiwgY21kKTsKKwl9IGVsc2UgeworCQlpZiAodF9zZWMoZW50KSkKKwkJCXJldHVybiB0cmFjZV9zZXFfcHJpbnRmKHMsICIlbGx1ICsgJXUgWyVzXVxuIiwKKwkJCQkJCXRfc2VjdG9yKGVudCksIHRfc2VjKGVudCksIGNtZCk7CisJCXJldHVybiB0cmFjZV9zZXFfcHJpbnRmKHMsICJbJXNdXG4iLCBjbWQpOworCX0KIH0KIAogc3RhdGljIGludCBibGtfbG9nX3dpdGhfZXJyb3Ioc3RydWN0IHRyYWNlX3NlcSAqcywKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCB0cmFjZV9lbnRyeSAqZW50KQogewotCWlmICh0X3NlYyhlbnQpKQotCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJWxsdSArICV1IFslZF1cbiIsIHRfc2VjdG9yKGVudCksCi0JCQkJCXRfc2VjKGVudCksIHRfZXJyb3IoZW50KSk7Ci0JcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiVsbHUgWyVkXVxuIiwgdF9zZWN0b3IoZW50KSwgdF9lcnJvcihlbnQpKTsKKwlpZiAodF9hY3Rpb24oZW50KSAmIEJMS19UQ19BQ1QoQkxLX1RDX1BDKSkgeworCQlpbnQgcmV0OworCisJCXJldCA9IGJsa19sb2dfZHVtcF9wZHUocywgZW50KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiB0cmFjZV9zZXFfcHJpbnRmKHMsICJbJWRdXG4iLCB0X2Vycm9yKGVudCkpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlpZiAodF9zZWMoZW50KSkKKwkJCXJldHVybiB0cmFjZV9zZXFfcHJpbnRmKHMsICIlbGx1ICsgJXUgWyVkXVxuIiwKKwkJCQkJCXRfc2VjdG9yKGVudCksCisJCQkJCQl0X3NlYyhlbnQpLCB0X2Vycm9yKGVudCkpOworCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJWxsdSBbJWRdXG4iLAorCQkJCQl0X3NlY3RvcihlbnQpLCB0X2Vycm9yKGVudCkpOworCX0KIH0KIAogc3RhdGljIGludCBibGtfbG9nX3JlbWFwKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IHN0cnVjdCB0cmFjZV9lbnRyeSAqZW50KQogewotCXN0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgciA9IHsgLmRldmljZSA9IDAsIH07CisJc3RydWN0IGJsa19pb190cmFjZV9yZW1hcCByID0geyAuZGV2aWNlX2Zyb20gPSAwLCB9OwogCiAJZ2V0X3BkdV9yZW1hcChlbnQsICZyKTsKIAlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJWxsdSArICV1IDwtICglZCwlZCkgJWxsdVxuIiwKLQkJCSAgICAgICB0X3NlY3RvcihlbnQpLAotCQkJICAgICAgIHRfc2VjKGVudCksIE1BSk9SKHIuZGV2aWNlKSwgTUlOT1Ioci5kZXZpY2UpLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpci5zZWN0b3IpOworCQkJCXRfc2VjdG9yKGVudCksIHRfc2VjKGVudCksCisJCQkJTUFKT1Ioci5kZXZpY2VfZnJvbSksIE1JTk9SKHIuZGV2aWNlX2Zyb20pLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpci5zZWN0b3JfZnJvbSk7CiB9CiAKIHN0YXRpYyBpbnQgYmxrX2xvZ19wbHVnKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IHN0cnVjdCB0cmFjZV9lbnRyeSAqZW50KQpAQCAtMTExNyw3ICsxMjE2LDYgQEAKIHN0YXRpYyB2b2lkIGJsa190cmFjZXJfc3RhcnQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKIHsKIAlibGtfdHJhY2VyX2VuYWJsZWQgPSB0cnVlOwotCXRyYWNlX2ZsYWdzICY9IH5UUkFDRV9JVEVSX0NPTlRFWFRfSU5GTzsKIH0KIAogc3RhdGljIGludCBibGtfdHJhY2VyX2luaXQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKQEAgLTExMzAsNyArMTIyOCw2IEBACiBzdGF0aWMgdm9pZCBibGtfdHJhY2VyX3N0b3Aoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKIHsKIAlibGtfdHJhY2VyX2VuYWJsZWQgPSBmYWxzZTsKLQl0cmFjZV9mbGFncyB8PSBUUkFDRV9JVEVSX0NPTlRFWFRfSU5GTzsKIH0KIAogc3RhdGljIHZvaWQgYmxrX3RyYWNlcl9yZXNldChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQpAQCAtMTE4Miw3ICsxMjc5LDcgQEAKIAl9CiAKIAlpZiAodW5saWtlbHkod2hhdCA9PSAwIHx8IHdoYXQgPj0gQVJSQVlfU0laRSh3aGF0MmFjdCkpKQotCQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJCYWQgcGMgYWN0aW9uICV4XG4iLCB3aGF0KTsKKwkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiVW5rbm93biBhY3Rpb24gJXhcbiIsIHdoYXQpOwogCWVsc2UgewogCQlyZXQgPSBsb2dfYWN0aW9uKGl0ZXIsIHdoYXQyYWN0W3doYXRdLmFjdFtsb25nX2FjdF0pOwogCQlpZiAocmV0KQpAQCAtMTE5NSw5ICsxMjkyLDYgQEAKIHN0YXRpYyBlbnVtIHByaW50X2xpbmVfdCBibGtfdHJhY2VfZXZlbnRfcHJpbnQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLAogCQkJCQkgICAgICAgaW50IGZsYWdzKQogewotCWlmICghdHJhY2VfcHJpbnRfY29udGV4dChpdGVyKSkKLQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCiAJcmV0dXJuIHByaW50X29uZV9saW5lKGl0ZXIsIGZhbHNlKTsKIH0KIApAQCAtMTIzMiw2ICsxMzI2LDE4IEBACiAJcmV0dXJuIHByaW50X29uZV9saW5lKGl0ZXIsIHRydWUpOwogfQogCitzdGF0aWMgaW50IGJsa190cmFjZXJfc2V0X2ZsYWcodTMyIG9sZF9mbGFncywgdTMyIGJpdCwgaW50IHNldCkKK3sKKwkvKiBkb24ndCBvdXRwdXQgY29udGV4dC1pbmZvIGZvciBibGtfY2xhc3NpYyBvdXRwdXQgKi8KKwlpZiAoYml0ID09IFRSQUNFX0JMS19PUFRfQ0xBU1NJQykgeworCQlpZiAoc2V0KQorCQkJdHJhY2VfZmxhZ3MgJj0gflRSQUNFX0lURVJfQ09OVEVYVF9JTkZPOworCQllbHNlCisJCQl0cmFjZV9mbGFncyB8PSBUUkFDRV9JVEVSX0NPTlRFWFRfSU5GTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdHJhY2VyIGJsa190cmFjZXIgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAiYmxrIiwKIAkuaW5pdAkJPSBibGtfdHJhY2VyX2luaXQsCkBAIC0xMjQxLDYgKzEzNDcsNyBAQAogCS5wcmludF9oZWFkZXIJPSBibGtfdHJhY2VyX3ByaW50X2hlYWRlciwKIAkucHJpbnRfbGluZQk9IGJsa190cmFjZXJfcHJpbnRfbGluZSwKIAkuZmxhZ3MJCT0gJmJsa190cmFjZXJfZmxhZ3MsCisJLnNldF9mbGFnCT0gYmxrX3RyYWNlcl9zZXRfZmxhZywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdHJhY2VfZXZlbnQgdHJhY2VfYmxrX2V2ZW50ID0gewpAQCAtMTI4NSw3ICsxMzkyLDggQEAKIC8qCiAgKiBTZXR1cCBldmVyeXRoaW5nIHJlcXVpcmVkIHRvIHN0YXJ0IHRyYWNpbmcKICAqLwotc3RhdGljIGludCBibGtfdHJhY2Vfc2V0dXBfcXVldWUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGRldl90IGRldikKK3N0YXRpYyBpbnQgYmxrX3RyYWNlX3NldHVwX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAorCQkJCSBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQogewogCXN0cnVjdCBibGtfdHJhY2UgKm9sZF9idCwgKmJ0ID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVOT01FTTsKQEAgLTEyOTgsOSArMTQwNiwxMCBAQAogCWlmICghYnQtPm1zZ19kYXRhKQogCQlnb3RvIGZyZWVfYnQ7CiAKLQlidC0+ZGV2ID0gZGV2OworCWJ0LT5kZXYgPSBiZGV2LT5iZF9kZXY7CiAJYnQtPmFjdF9tYXNrID0gKHUxNiktMTsKLQlidC0+ZW5kX2xiYSA9IC0xVUxMOworCisJYmxrX3RyYWNlX3NldHVwX2xiYShidCwgYmRldik7CiAKIAlvbGRfYnQgPSB4Y2hnKCZxLT5ibGtfdHJhY2UsIGJ0KTsKIAlpZiAob2xkX2J0ICE9IE5VTEwpIHsKQEAgLTE1MTcsNyArMTYyNiw3IEBACiAKIAlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfZW5hYmxlKSB7CiAJCWlmICh2YWx1ZSkKLQkJCXJldCA9IGJsa190cmFjZV9zZXR1cF9xdWV1ZShxLCBiZGV2LT5iZF9kZXYpOworCQkJcmV0ID0gYmxrX3RyYWNlX3NldHVwX3F1ZXVlKHEsIGJkZXYpOwogCQllbHNlCiAJCQlyZXQgPSBibGtfdHJhY2VfcmVtb3ZlX3F1ZXVlKHEpOwogCQlnb3RvIG91dF91bmxvY2tfYmRldjsKQEAgLTE1MjUsNyArMTYzNCw3IEBACiAKIAlyZXQgPSAwOwogCWlmIChxLT5ibGtfdHJhY2UgPT0gTlVMTCkKLQkJcmV0ID0gYmxrX3RyYWNlX3NldHVwX3F1ZXVlKHEsIGJkZXYtPmJkX2Rldik7CisJCXJldCA9IGJsa190cmFjZV9zZXR1cF9xdWV1ZShxLCBiZGV2KTsKIAogCWlmIChyZXQgPT0gMCkgewogCQlpZiAoYXR0ciA9PSAmZGV2X2F0dHJfYWN0X21hc2spCkBAIC0xNTQ4LDMgKzE2NTcsNzcgQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9CiAKK2ludCBibGtfdHJhY2VfaW5pdF9zeXNmcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmYmxrX3RyYWNlX2F0dHJfZ3JvdXApOworfQorCisjZW5kaWYgLyogQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgKi8KKworI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCisKK3ZvaWQgYmxrX2R1bXBfY21kKGNoYXIgKmJ1Ziwgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWludCBpLCBlbmQ7CisJaW50IGxlbiA9IHJxLT5jbWRfbGVuOworCXVuc2lnbmVkIGNoYXIgKmNtZCA9IHJxLT5jbWQ7CisKKwlpZiAoIWJsa19wY19yZXF1ZXN0KHJxKSkgeworCQlidWZbMF0gPSAnXDAnOworCQlyZXR1cm47CisJfQorCisJZm9yIChlbmQgPSBsZW4gLSAxOyBlbmQgPj0gMDsgZW5kLS0pCisJCWlmIChjbWRbZW5kXSkKKwkJCWJyZWFrOworCWVuZCsrOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIiVzJTAyeCIsIGkgPT0gMCA/ICIiIDogIiAiLCBjbWRbaV0pOworCQlpZiAoaSA9PSBlbmQgJiYgZW5kICE9IGxlbiAtIDEpIHsKKwkJCXNwcmludGYoYnVmLCAiIC4uIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBibGtfZmlsbF9yd2JzKGNoYXIgKnJ3YnMsIHUzMiBydywgaW50IGJ5dGVzKQoreworCWludCBpID0gMDsKKworCWlmIChydyAmIFdSSVRFKQorCQlyd2JzW2krK10gPSAnVyc7CisJZWxzZSBpZiAocncgJiAxIDw8IEJJT19SV19ESVNDQVJEKQorCQlyd2JzW2krK10gPSAnRCc7CisJZWxzZSBpZiAoYnl0ZXMpCisJCXJ3YnNbaSsrXSA9ICdSJzsKKwllbHNlCisJCXJ3YnNbaSsrXSA9ICdOJzsKKworCWlmIChydyAmIDEgPDwgQklPX1JXX0FIRUFEKQorCQlyd2JzW2krK10gPSAnQSc7CisJaWYgKHJ3ICYgMSA8PCBCSU9fUldfQkFSUklFUikKKwkJcndic1tpKytdID0gJ0InOworCWlmIChydyAmIDEgPDwgQklPX1JXX1NZTkNJTykKKwkJcndic1tpKytdID0gJ1MnOworCWlmIChydyAmIDEgPDwgQklPX1JXX01FVEEpCisJCXJ3YnNbaSsrXSA9ICdNJzsKKworCXJ3YnNbaV0gPSAnXDAnOworfQorCit2b2lkIGJsa19maWxsX3J3YnNfcnEoY2hhciAqcndicywgc3RydWN0IHJlcXVlc3QgKnJxKQoreworCWludCBydyA9IHJxLT5jbWRfZmxhZ3MgJiAweDAzOworCWludCBieXRlczsKKworCWlmIChibGtfZGlzY2FyZF9ycShycSkpCisJCXJ3IHw9ICgxIDw8IEJJT19SV19ESVNDQVJEKTsKKworCWJ5dGVzID0gYmxrX3JxX2J5dGVzKHJxKTsKKworCWJsa19maWxsX3J3YnMocndicywgcncsIGJ5dGVzKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19FVkVOVF9UUkFDSU5HICovCisKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9ldmVudHMuYyBiL2tlcm5lbC90cmFjZS9ldmVudHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ2ZjJhYS4uMDAwMDAwMAotLS0gYS9rZXJuZWwvdHJhY2UvZXZlbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKgotICogVGhpcyBpcyB0aGUgcGxhY2UgdG8gcmVnaXN0ZXIgYWxsIHRyYWNlIHBvaW50cyBhcyBldmVudHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgotCi0jaW5jbHVkZSA8dHJhY2UvdHJhY2VfZXZlbnRzLmg+Ci0KLSNpbmNsdWRlICJ0cmFjZV9vdXRwdXQuaCIKLQotI2luY2x1ZGUgInRyYWNlX2V2ZW50c19zdGFnZV8xLmgiCi0jaW5jbHVkZSAidHJhY2VfZXZlbnRzX3N0YWdlXzIuaCIKLSNpbmNsdWRlICJ0cmFjZV9ldmVudHNfc3RhZ2VfMy5oIgotCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKaW5kZXggZjFlZDA4MC4uYmI2MDczMiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2Z0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwpAQCAtMjksMTEgKzI5LDEzIEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KIAotI2luY2x1ZGUgPHRyYWNlL3NjaGVkLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CiAKICNpbmNsdWRlIDxhc20vZnRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKLSNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgorI2luY2x1ZGUgInRyYWNlX3N0YXQuaCIKIAogI2RlZmluZSBGVFJBQ0VfV0FSTl9PTihjb25kKQkJCVwKIAlkbyB7CQkJCQlcCkBAIC02OCw3ICs3MCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyBmdHJhY2VfbGlzdF9lbmQgX19yZWFkX21vc3RseSA9CiB7Ci0JLmZ1bmMgPSBmdHJhY2Vfc3R1YiwKKwkuZnVuYwkJPSBmdHJhY2Vfc3R1YiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyAqZnRyYWNlX2xpc3QgX19yZWFkX21vc3RseSA9ICZmdHJhY2VfbGlzdF9lbmQ7CkBAIC0yNDAsNiArMjQyLDU4MCBAQAogI2VuZGlmCiB9CiAKKyNpZmRlZiBDT05GSUdfRlVOQ1RJT05fUFJPRklMRVIKK3N0cnVjdCBmdHJhY2VfcHJvZmlsZSB7CisJc3RydWN0IGhsaXN0X25vZGUJCW5vZGU7CisJdW5zaWduZWQgbG9uZwkJCWlwOworCXVuc2lnbmVkIGxvbmcJCQljb3VudGVyOworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKKwl1bnNpZ25lZCBsb25nIGxvbmcJCXRpbWU7CisjZW5kaWYKK307CisKK3N0cnVjdCBmdHJhY2VfcHJvZmlsZV9wYWdlIHsKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfcGFnZQkqbmV4dDsKKwl1bnNpZ25lZCBsb25nCQkJaW5kZXg7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlCQlyZWNvcmRzW107Cit9OworCitzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCB7CisJYXRvbWljX3QJCQlkaXNhYmxlZDsKKwlzdHJ1Y3QgaGxpc3RfaGVhZAkJKmhhc2g7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3BhZ2UJKnBhZ2VzOworCXN0cnVjdCBmdHJhY2VfcHJvZmlsZV9wYWdlCSpzdGFydDsKKwlzdHJ1Y3QgdHJhY2VyX3N0YXQJCXN0YXQ7Cit9OworCisjZGVmaW5lIFBST0ZJTEVfUkVDT1JEU19TSVpFCQkJCQkJXAorCShQQUdFX1NJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfcGFnZSwgcmVjb3JkcykpCisKKyNkZWZpbmUgUFJPRklMRVNfUEVSX1BBR0UJCQkJCVwKKwkoUFJPRklMRV9SRUNPUkRTX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZ0cmFjZV9wcm9maWxlKSkKKworc3RhdGljIGludCBmdHJhY2VfcHJvZmlsZV9iaXRzIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50IGZ0cmFjZV9wcm9maWxlX2VuYWJsZWQgX19yZWFkX21vc3RseTsKKworLyogZnRyYWNlX3Byb2ZpbGVfbG9jayAtIHN5bmNocm9uaXplIHRoZSBlbmFibGUgYW5kIGRpc2FibGUgb2YgdGhlIHByb2ZpbGVyICovCitzdGF0aWMgREVGSU5FX01VVEVYKGZ0cmFjZV9wcm9maWxlX2xvY2spOworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQsIGZ0cmFjZV9wcm9maWxlX3N0YXRzKTsKKworI2RlZmluZSBGVFJBQ0VfUFJPRklMRV9IQVNIX1NJWkUgMTAyNCAvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KKworc3RhdGljIHZvaWQgKgorZnVuY3Rpb25fc3RhdF9uZXh0KHZvaWQgKnYsIGludCBpZHgpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICpyZWMgPSB2OworCXN0cnVjdCBmdHJhY2VfcHJvZmlsZV9wYWdlICpwZzsKKworCXBnID0gKHN0cnVjdCBmdHJhY2VfcHJvZmlsZV9wYWdlICopKCh1bnNpZ25lZCBsb25nKXJlYyAmIFBBR0VfTUFTSyk7CisKKyBhZ2FpbjoKKwlyZWMrKzsKKwlpZiAoKHZvaWQgKilyZWMgPj0gKHZvaWQgKikmcGctPnJlY29yZHNbcGctPmluZGV4XSkgeworCQlwZyA9IHBnLT5uZXh0OworCQlpZiAoIXBnKQorCQkJcmV0dXJuIE5VTEw7CisJCXJlYyA9ICZwZy0+cmVjb3Jkc1swXTsKKwkJaWYgKCFyZWMtPmNvdW50ZXIpCisJCQlnb3RvIGFnYWluOworCX0KKworCXJldHVybiByZWM7Cit9CisKK3N0YXRpYyB2b2lkICpmdW5jdGlvbl9zdGF0X3N0YXJ0KHN0cnVjdCB0cmFjZXJfc3RhdCAqdHJhY2UpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQgKnN0YXQgPQorCQljb250YWluZXJfb2YodHJhY2UsIHN0cnVjdCBmdHJhY2VfcHJvZmlsZV9zdGF0LCBzdGF0KTsKKworCWlmICghc3RhdCB8fCAhc3RhdC0+c3RhcnQpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGZ1bmN0aW9uX3N0YXRfbmV4dCgmc3RhdC0+c3RhcnQtPnJlY29yZHNbMF0sIDApOworfQorCisjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorLyogZnVuY3Rpb24gZ3JhcGggY29tcGFyZXMgb24gdG90YWwgdGltZSAqLworc3RhdGljIGludCBmdW5jdGlvbl9zdGF0X2NtcCh2b2lkICpwMSwgdm9pZCAqcDIpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICphID0gcDE7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICpiID0gcDI7CisKKwlpZiAoYS0+dGltZSA8IGItPnRpbWUpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+dGltZSA+IGItPnRpbWUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisjZWxzZQorLyogbm90IGZ1bmN0aW9uIGdyYXBoIGNvbXBhcmVzIGFnYWluc3QgaGl0cyAqLworc3RhdGljIGludCBmdW5jdGlvbl9zdGF0X2NtcCh2b2lkICpwMSwgdm9pZCAqcDIpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICphID0gcDE7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICpiID0gcDI7CisKKwlpZiAoYS0+Y291bnRlciA8IGItPmNvdW50ZXIpCisJCXJldHVybiAtMTsKKwlpZiAoYS0+Y291bnRlciA+IGItPmNvdW50ZXIpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBmdW5jdGlvbl9zdGF0X2hlYWRlcnMoc3RydWN0IHNlcV9maWxlICptKQoreworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKKwlzZXFfcHJpbnRmKG0sICIgIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKwkJICAgIkhpdCAgICBUaW1lICAgICAgICAgICAgQXZnXG4iCisJCSAgICAgICIgIC0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKwkJICAgIi0tLSAgICAtLS0tICAgICAgICAgICAgLS0tXG4iKTsKKyNlbHNlCisJc2VxX3ByaW50ZihtLCAiICBGdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXRcbiIKKwkJICAgICAgIiAgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tXG4iKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ1bmN0aW9uX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICpyZWMgPSB2OworCWNoYXIgc3RyW0tTWU1fU1lNQk9MX0xFTl07CisjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorCXN0YXRpYyBERUZJTkVfTVVURVgobXV0ZXgpOworCXN0YXRpYyBzdHJ1Y3QgdHJhY2Vfc2VxIHM7CisJdW5zaWduZWQgbG9uZyBsb25nIGF2ZzsKKyNlbmRpZgorCisJa2FsbHN5bXNfbG9va3VwKHJlYy0+aXAsIE5VTEwsIE5VTEwsIE5VTEwsIHN0cik7CisJc2VxX3ByaW50ZihtLCAiICAlLTMwLjMwcyAgJTEwbHUiLCBzdHIsIHJlYy0+Y291bnRlcik7CisKKyNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCisJc2VxX3ByaW50ZihtLCAiICAgICIpOworCWF2ZyA9IHJlYy0+dGltZTsKKwlkb19kaXYoYXZnLCByZWMtPmNvdW50ZXIpOworCisJbXV0ZXhfbG9jaygmbXV0ZXgpOworCXRyYWNlX3NlcV9pbml0KCZzKTsKKwl0cmFjZV9wcmludF9ncmFwaF9kdXJhdGlvbihyZWMtPnRpbWUsICZzKTsKKwl0cmFjZV9zZXFfcHV0cygmcywgIiAgICAiKTsKKwl0cmFjZV9wcmludF9ncmFwaF9kdXJhdGlvbihhdmcsICZzKTsKKwl0cmFjZV9wcmludF9zZXEobSwgJnMpOworCW11dGV4X3VubG9jaygmbXV0ZXgpOworI2VuZGlmCisJc2VxX3B1dGMobSwgJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnRyYWNlX3Byb2ZpbGVfcmVzZXQoc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3BhZ2UgKnBnOworCisJcGcgPSBzdGF0LT5wYWdlcyA9IHN0YXQtPnN0YXJ0OworCisJd2hpbGUgKHBnKSB7CisJCW1lbXNldChwZy0+cmVjb3JkcywgMCwgUFJPRklMRV9SRUNPUkRTX1NJWkUpOworCQlwZy0+aW5kZXggPSAwOworCQlwZyA9IHBnLT5uZXh0OworCX0KKworCW1lbXNldChzdGF0LT5oYXNoLCAwLAorCSAgICAgICBGVFJBQ0VfUFJPRklMRV9IQVNIX1NJWkUgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpKTsKK30KKworaW50IGZ0cmFjZV9wcm9maWxlX3BhZ2VzX2luaXQoc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3BhZ2UgKnBnOworCWludCBmdW5jdGlvbnM7CisJaW50IHBhZ2VzOworCWludCBpOworCisJLyogSWYgd2UgYWxyZWFkeSBhbGxvY2F0ZWQsIGRvIG5vdGhpbmcgKi8KKwlpZiAoc3RhdC0+cGFnZXMpCisJCXJldHVybiAwOworCisJc3RhdC0+cGFnZXMgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXQtPnBhZ2VzKQorCQlyZXR1cm4gLUVOT01FTTsKKworI2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQorCWZ1bmN0aW9ucyA9IGZ0cmFjZV91cGRhdGVfdG90X2NudDsKKyNlbHNlCisJLyoKKwkgKiBXZSBkbyBub3Qga25vdyB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IGV4aXN0IGJlY2F1c2UKKwkgKiBkeW5hbWljIHRyYWNpbmcgaXMgd2hhdCBjb3VudHMgdGhlbS4gV2l0aCBwYXN0IGV4cGVyaWVuY2UKKwkgKiB3ZSBoYXZlIGFyb3VuZCAyMEsgZnVuY3Rpb25zLiBUaGF0IHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoLgorCSAqIEl0IGlzIGhpZ2hseSB1bmxpa2VseSB3ZSB3aWxsIGV4ZWN1dGUgZXZlcnkgZnVuY3Rpb24gaW4KKwkgKiB0aGUga2VybmVsLgorCSAqLworCWZ1bmN0aW9ucyA9IDIwMDAwOworI2VuZGlmCisKKwlwZyA9IHN0YXQtPnN0YXJ0ID0gc3RhdC0+cGFnZXM7CisKKwlwYWdlcyA9IERJVl9ST1VORF9VUChmdW5jdGlvbnMsIFBST0ZJTEVTX1BFUl9QQUdFKTsKKworCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CisJCXBnLT5uZXh0ID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghcGctPm5leHQpCisJCQlnb3RvIG91dF9mcmVlOworCQlwZyA9IHBnLT5uZXh0OworCX0KKworCXJldHVybiAwOworCisgb3V0X2ZyZWU6CisJcGcgPSBzdGF0LT5zdGFydDsKKwl3aGlsZSAocGcpIHsKKwkJdW5zaWduZWQgbG9uZyB0bXAgPSAodW5zaWduZWQgbG9uZylwZzsKKworCQlwZyA9IHBnLT5uZXh0OworCQlmcmVlX3BhZ2UodG1wKTsKKwl9CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpc3RhdC0+cGFnZXMpOworCXN0YXQtPnBhZ2VzID0gTlVMTDsKKwlzdGF0LT5zdGFydCA9IE5VTEw7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBmdHJhY2VfcHJvZmlsZV9pbml0X2NwdShpbnQgY3B1KQoreworCXN0cnVjdCBmdHJhY2VfcHJvZmlsZV9zdGF0ICpzdGF0OworCWludCBzaXplOworCisJc3RhdCA9ICZwZXJfY3B1KGZ0cmFjZV9wcm9maWxlX3N0YXRzLCBjcHUpOworCisJaWYgKHN0YXQtPmhhc2gpIHsKKwkJLyogSWYgdGhlIHByb2ZpbGUgaXMgYWxyZWFkeSBjcmVhdGVkLCBzaW1wbHkgcmVzZXQgaXQgKi8KKwkJZnRyYWNlX3Byb2ZpbGVfcmVzZXQoc3RhdCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2UgYXJlIHByb2ZpbGluZyBhbGwgZnVuY3Rpb25zLCBidXQgdXN1YWxseSBvbmx5IGEgZmV3IHRob3VzYW5kCisJICogZnVuY3Rpb25zIGFyZSBoaXQuIFdlJ2xsIG1ha2UgYSBoYXNoIG9mIDEwMjQgaXRlbXMuCisJICovCisJc2l6ZSA9IEZUUkFDRV9QUk9GSUxFX0hBU0hfU0laRTsKKworCXN0YXQtPmhhc2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkgKiBzaXplLCBHRlBfS0VSTkVMKTsKKworCWlmICghc3RhdC0+aGFzaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIWZ0cmFjZV9wcm9maWxlX2JpdHMpIHsKKwkJc2l6ZS0tOworCisJCWZvciAoOyBzaXplOyBzaXplID4+PSAxKQorCQkJZnRyYWNlX3Byb2ZpbGVfYml0cysrOworCX0KKworCS8qIFByZWFsbG9jYXRlIHRoZSBmdW5jdGlvbiBwcm9maWxpbmcgcGFnZXMgKi8KKwlpZiAoZnRyYWNlX3Byb2ZpbGVfcGFnZXNfaW5pdChzdGF0KSA8IDApIHsKKwkJa2ZyZWUoc3RhdC0+aGFzaCk7CisJCXN0YXQtPmhhc2ggPSBOVUxMOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdHJhY2VfcHJvZmlsZV9pbml0KHZvaWQpCit7CisJaW50IGNwdTsKKwlpbnQgcmV0ID0gMDsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXJldCA9IGZ0cmFjZV9wcm9maWxlX2luaXRfY3B1KGNwdSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKgorZnRyYWNlX2ZpbmRfcHJvZmlsZWRfZnVuYyhzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCAqc3RhdCwgdW5zaWduZWQgbG9uZyBpcCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKnJlYzsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGhkOworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCXVuc2lnbmVkIGxvbmcga2V5OworCisJa2V5ID0gaGFzaF9sb25nKGlwLCBmdHJhY2VfcHJvZmlsZV9iaXRzKTsKKwloaGQgPSAmc3RhdC0+aGFzaFtrZXldOworCisJaWYgKGhsaXN0X2VtcHR5KGhoZCkpCisJCXJldHVybiBOVUxMOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJlYywgbiwgaGhkLCBub2RlKSB7CisJCWlmIChyZWMtPmlwID09IGlwKQorCQkJcmV0dXJuIHJlYzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZnRyYWNlX2FkZF9wcm9maWxlKHN0cnVjdCBmdHJhY2VfcHJvZmlsZV9zdGF0ICpzdGF0LAorCQkJICAgICAgIHN0cnVjdCBmdHJhY2VfcHJvZmlsZSAqcmVjKQoreworCXVuc2lnbmVkIGxvbmcga2V5OworCisJa2V5ID0gaGFzaF9sb25nKHJlYy0+aXAsIGZ0cmFjZV9wcm9maWxlX2JpdHMpOworCWhsaXN0X2FkZF9oZWFkX3JjdSgmcmVjLT5ub2RlLCAmc3RhdC0+aGFzaFtrZXldKTsKK30KKworLyoKKyAqIFRoZSBtZW1vcnkgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIHRoaXMgc2ltcGx5IGZpbmRzIGEgbmV3IHJlY29yZCB0byB1c2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKgorZnRyYWNlX3Byb2ZpbGVfYWxsb2Moc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQgKnN0YXQsIHVuc2lnbmVkIGxvbmcgaXApCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICpyZWMgPSBOVUxMOworCisJLyogcHJldmVudCByZWN1cnNpb24gKGZyb20gTk1JcykgKi8KKwlpZiAoYXRvbWljX2luY19yZXR1cm4oJnN0YXQtPmRpc2FibGVkKSAhPSAxKQorCQlnb3RvIG91dDsKKworCS8qCisJICogVHJ5IHRvIGZpbmQgdGhlIGZ1bmN0aW9uIGFnYWluIHNpbmNlIGFuIE5NSQorCSAqIGNvdWxkIGhhdmUgYWRkZWQgaXQKKwkgKi8KKwlyZWMgPSBmdHJhY2VfZmluZF9wcm9maWxlZF9mdW5jKHN0YXQsIGlwKTsKKwlpZiAocmVjKQorCQlnb3RvIG91dDsKKworCWlmIChzdGF0LT5wYWdlcy0+aW5kZXggPT0gUFJPRklMRVNfUEVSX1BBR0UpIHsKKwkJaWYgKCFzdGF0LT5wYWdlcy0+bmV4dCkKKwkJCWdvdG8gb3V0OworCQlzdGF0LT5wYWdlcyA9IHN0YXQtPnBhZ2VzLT5uZXh0OworCX0KKworCXJlYyA9ICZzdGF0LT5wYWdlcy0+cmVjb3Jkc1tzdGF0LT5wYWdlcy0+aW5kZXgrK107CisJcmVjLT5pcCA9IGlwOworCWZ0cmFjZV9hZGRfcHJvZmlsZShzdGF0LCByZWMpOworCisgb3V0OgorCWF0b21pY19kZWMoJnN0YXQtPmRpc2FibGVkKTsKKworCXJldHVybiByZWM7Cit9CisKK3N0YXRpYyB2b2lkCitmdW5jdGlvbl9wcm9maWxlX2NhbGwodW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXApCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQgKnN0YXQ7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICpyZWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZnRyYWNlX3Byb2ZpbGVfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJc3RhdCA9ICZfX2dldF9jcHVfdmFyKGZ0cmFjZV9wcm9maWxlX3N0YXRzKTsKKwlpZiAoIXN0YXQtPmhhc2ggfHwgIWZ0cmFjZV9wcm9maWxlX2VuYWJsZWQpCisJCWdvdG8gb3V0OworCisJcmVjID0gZnRyYWNlX2ZpbmRfcHJvZmlsZWRfZnVuYyhzdGF0LCBpcCk7CisJaWYgKCFyZWMpIHsKKwkJcmVjID0gZnRyYWNlX3Byb2ZpbGVfYWxsb2Moc3RhdCwgaXApOworCQlpZiAoIXJlYykKKwkJCWdvdG8gb3V0OworCX0KKworCXJlYy0+Y291bnRlcisrOworIG91dDoKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCitzdGF0aWMgaW50IHByb2ZpbGVfZ3JhcGhfZW50cnkoc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnQgKnRyYWNlKQoreworCWZ1bmN0aW9uX3Byb2ZpbGVfY2FsbCh0cmFjZS0+ZnVuYywgMCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHByb2ZpbGVfZ3JhcGhfcmV0dXJuKHN0cnVjdCBmdHJhY2VfZ3JhcGhfcmV0ICp0cmFjZSkKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCAqc3RhdDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2FsbHRpbWU7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlICpyZWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzdGF0ID0gJl9fZ2V0X2NwdV92YXIoZnRyYWNlX3Byb2ZpbGVfc3RhdHMpOworCWlmICghc3RhdC0+aGFzaCB8fCAhZnRyYWNlX3Byb2ZpbGVfZW5hYmxlZCkKKwkJZ290byBvdXQ7CisKKwljYWxsdGltZSA9IHRyYWNlLT5yZXR0aW1lIC0gdHJhY2UtPmNhbGx0aW1lOworCisJaWYgKCEodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX0dSQVBIX1RJTUUpKSB7CisJCWludCBpbmRleDsKKworCQlpbmRleCA9IHRyYWNlLT5kZXB0aDsKKworCQkvKiBBcHBlbmQgdGhpcyBjYWxsIHRpbWUgdG8gdGhlIHBhcmVudCB0aW1lIHRvIHN1YnRyYWN0ICovCisJCWlmIChpbmRleCkKKwkJCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleCAtIDFdLnN1YnRpbWUgKz0gY2FsbHRpbWU7CisKKwkJaWYgKGN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0uc3VidGltZSA8IGNhbGx0aW1lKQorCQkJY2FsbHRpbWUgLT0gY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5zdWJ0aW1lOworCQllbHNlCisJCQljYWxsdGltZSA9IDA7CisJfQorCisJcmVjID0gZnRyYWNlX2ZpbmRfcHJvZmlsZWRfZnVuYyhzdGF0LCB0cmFjZS0+ZnVuYyk7CisJaWYgKHJlYykKKwkJcmVjLT50aW1lICs9IGNhbGx0aW1lOworCisgb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIGludCByZWdpc3Rlcl9mdHJhY2VfcHJvZmlsZXIodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfZnRyYWNlX2dyYXBoKCZwcm9maWxlX2dyYXBoX3JldHVybiwKKwkJCQkgICAgICZwcm9maWxlX2dyYXBoX2VudHJ5KTsKK30KKworc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9mdHJhY2VfcHJvZmlsZXIodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2Z0cmFjZV9ncmFwaCgpOworfQorI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyBmdHJhY2VfcHJvZmlsZV9vcHMgX19yZWFkX21vc3RseSA9Cit7CisJLmZ1bmMJCT0gZnVuY3Rpb25fcHJvZmlsZV9jYWxsLAorfTsKKworc3RhdGljIGludCByZWdpc3Rlcl9mdHJhY2VfcHJvZmlsZXIodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZmdHJhY2VfcHJvZmlsZV9vcHMpOworfQorCitzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX2Z0cmFjZV9wcm9maWxlcih2b2lkKQoreworCXVucmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZmdHJhY2VfcHJvZmlsZV9vcHMpOworfQorI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIgKi8KKworc3RhdGljIHNzaXplX3QKK2Z0cmFjZV9wcm9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJICAgICBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJY2hhciBidWZbNjRdOwkJLyogYmlnIGVub3VnaCB0byBob2xkIGEgbnVtYmVyICovCisJaW50IHJldDsKKworCWlmIChjbnQgPj0gc2l6ZW9mKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIHVidWYsIGNudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJYnVmW2NudF0gPSAwOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl2YWwgPSAhIXZhbDsKKworCW11dGV4X2xvY2soJmZ0cmFjZV9wcm9maWxlX2xvY2spOworCWlmIChmdHJhY2VfcHJvZmlsZV9lbmFibGVkIF4gdmFsKSB7CisJCWlmICh2YWwpIHsKKwkJCXJldCA9IGZ0cmFjZV9wcm9maWxlX2luaXQoKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJY250ID0gcmV0OworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlyZXQgPSByZWdpc3Rlcl9mdHJhY2VfcHJvZmlsZXIoKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJY250ID0gcmV0OworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZnRyYWNlX3Byb2ZpbGVfZW5hYmxlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlmdHJhY2VfcHJvZmlsZV9lbmFibGVkID0gMDsKKwkJCS8qCisJCQkgKiB1bnJlZ2lzdGVyX2Z0cmFjZV9wcm9maWxlciBjYWxscyBzdG9wX21hY2hpbmUKKwkJCSAqIHNvIHRoaXMgYWN0cyBsaWtlIGFuIHN5bmNocm9uaXplX3NjaGVkLgorCQkJICovCisJCQl1bnJlZ2lzdGVyX2Z0cmFjZV9wcm9maWxlcigpOworCQl9CisJfQorIG91dDoKKwltdXRleF91bmxvY2soJmZ0cmFjZV9wcm9maWxlX2xvY2spOworCisJZmlscC0+Zl9wb3MgKz0gY250OworCisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIHNzaXplX3QKK2Z0cmFjZV9wcm9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLAorCQkgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1Zls2NF07CQkvKiBiaWcgZW5vdWdoIHRvIGhvbGQgYSBudW1iZXIgKi8KKwlpbnQgcjsKKworCXIgPSBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBmdHJhY2VfcHJvZmlsZV9lbmFibGVkKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY250LCBwcG9zLCBidWYsIHIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdHJhY2VfcHJvZmlsZV9mb3BzID0geworCS5vcGVuCQk9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAorCS5yZWFkCQk9IGZ0cmFjZV9wcm9maWxlX3JlYWQsCisJLndyaXRlCQk9IGZ0cmFjZV9wcm9maWxlX3dyaXRlLAorfTsKKworLyogdXNlZCB0byBpbml0aWFsaXplIHRoZSByZWFsIHN0YXQgZmlsZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgdHJhY2VyX3N0YXQgZnVuY3Rpb25fc3RhdHMgX19pbml0ZGF0YSA9IHsKKwkubmFtZQkJPSAiZnVuY3Rpb25zIiwKKwkuc3RhdF9zdGFydAk9IGZ1bmN0aW9uX3N0YXRfc3RhcnQsCisJLnN0YXRfbmV4dAk9IGZ1bmN0aW9uX3N0YXRfbmV4dCwKKwkuc3RhdF9jbXAJPSBmdW5jdGlvbl9zdGF0X2NtcCwKKwkuc3RhdF9oZWFkZXJzCT0gZnVuY3Rpb25fc3RhdF9oZWFkZXJzLAorCS5zdGF0X3Nob3cJPSBmdW5jdGlvbl9zdGF0X3Nob3cKK307CisKK3N0YXRpYyB2b2lkIGZ0cmFjZV9wcm9maWxlX2RlYnVnZnMoc3RydWN0IGRlbnRyeSAqZF90cmFjZXIpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQgKnN0YXQ7CisJc3RydWN0IGRlbnRyeSAqZW50cnk7CisJY2hhciAqbmFtZTsKKwlpbnQgcmV0OworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0YXQgPSAmcGVyX2NwdShmdHJhY2VfcHJvZmlsZV9zdGF0cywgY3B1KTsKKworCQkvKiBhbGxvY2F0ZSBlbm91Z2ggZm9yIGZ1bmN0aW9uIG5hbWUgKyBjcHUgbnVtYmVyICovCisJCW5hbWUgPSBrbWFsbG9jKDMyLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuYW1lKSB7CisJCQkvKgorCQkJICogVGhlIGZpbGVzIGNyZWF0ZWQgYXJlIHBlcm1hbmVudCwgaWYgc29tZXRoaW5nIGhhcHBlbnMKKwkJCSAqIHdlIHN0aWxsIGRvIG5vdCBmcmVlIG1lbW9yeS4KKwkJCSAqLworCQkJa2ZyZWUoc3RhdCk7CisJCQlXQVJOKDEsCisJCQkgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgc3RhdCBmaWxlIGZvciBjcHUgJWRcbiIsCisJCQkgICAgIGNwdSk7CisJCQlyZXR1cm47CisJCX0KKwkJc3RhdC0+c3RhdCA9IGZ1bmN0aW9uX3N0YXRzOworCQlzbnByaW50ZihuYW1lLCAzMiwgImZ1bmN0aW9uJWQiLCBjcHUpOworCQlzdGF0LT5zdGF0Lm5hbWUgPSBuYW1lOworCQlyZXQgPSByZWdpc3Rlcl9zdGF0X3RyYWNlcigmc3RhdC0+c3RhdCk7CisJCWlmIChyZXQpIHsKKwkJCVdBUk4oMSwKKwkJCSAgICAgIkNvdWxkIG5vdCByZWdpc3RlciBmdW5jdGlvbiBzdGF0IGZvciBjcHUgJWRcbiIsCisJCQkgICAgIGNwdSk7CisJCQlrZnJlZShuYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZnVuY3Rpb25fcHJvZmlsZV9lbmFibGVkIiwgMDY0NCwKKwkJCQkgICAgZF90cmFjZXIsIE5VTEwsICZmdHJhY2VfcHJvZmlsZV9mb3BzKTsKKwlpZiAoIWVudHJ5KQorCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgorCQkJICAgIidmdW5jdGlvbl9wcm9maWxlX2VuYWJsZWQnIGVudHJ5XG4iKTsKK30KKworI2Vsc2UgLyogQ09ORklHX0ZVTkNUSU9OX1BST0ZJTEVSICovCitzdGF0aWMgdm9pZCBmdHJhY2VfcHJvZmlsZV9kZWJ1Z2ZzKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKQoreworfQorI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9QUk9GSUxFUiAqLworCiAvKiBzZXQgd2hlbiB0cmFjaW5nIG9ubHkgYSBwaWQgKi8KIHN0cnVjdCBwaWQgKmZ0cmFjZV9waWRfdHJhY2U7CiBzdGF0aWMgc3RydWN0IHBpZCAqIGNvbnN0IGZ0cmFjZV9zd2FwcGVyX3BpZCA9ICZpbml0X3N0cnVjdF9waWQ7CkBAIC0yNjEsNyArODM3LDYgQEAKIAlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKIH07CiAKLQogZW51bSB7CiAJRlRSQUNFX0VOQUJMRV9DQUxMUwkJPSAoMSA8PCAwKSwKIAlGVFJBQ0VfRElTQUJMRV9DQUxMUwkJPSAoMSA8PCAxKSwKQEAgLTM0NiwzMCArOTIxLDYgQEAKIAlyZWMtPmZsYWdzIHw9IEZUUkFDRV9GTF9GUkVFOwogfQogCi12b2lkIGZ0cmFjZV9yZWxlYXNlKHZvaWQgKnN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0Jc3RydWN0IGR5bl9mdHJhY2UgKnJlYzsKLQlzdHJ1Y3QgZnRyYWNlX3BhZ2UgKnBnOwotCXVuc2lnbmVkIGxvbmcgcyA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgZSA9IHMgKyBzaXplOwotCi0JaWYgKGZ0cmFjZV9kaXNhYmxlZCB8fCAhc3RhcnQpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKLQlkb19mb3JfZWFjaF9mdHJhY2VfcmVjKHBnLCByZWMpIHsKLQkJaWYgKChyZWMtPmlwID49IHMpICYmIChyZWMtPmlwIDwgZSkpIHsKLQkJCS8qCi0JCQkgKiByZWMtPmlwIGlzIGNoYW5nZWQgaW4gZnRyYWNlX2ZyZWVfcmVjKCkKLQkJCSAqIEl0IHNob3VsZCBub3QgYmV0d2VlbiBzIGFuZCBlIGlmIHJlY29yZCB3YXMgZnJlZWQuCi0JCQkgKi8KLQkJCUZUUkFDRV9XQVJOX09OKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRlJFRSk7Ci0JCQlmdHJhY2VfZnJlZV9yZWMocmVjKTsKLQkJfQotCX0gd2hpbGVfZm9yX2VhY2hfZnRyYWNlX3JlYygpOwotCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOwotfQotCiBzdGF0aWMgc3RydWN0IGR5bl9mdHJhY2UgKmZ0cmFjZV9hbGxvY19keW5fbm9kZSh1bnNpZ25lZCBsb25nIGlwKQogewogCXN0cnVjdCBkeW5fZnRyYWNlICpyZWM7CkBAIC0xNDA4LDcgKzE5NTksNyBAQAogCiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgdHJhY2VfcHJvYmVfb3BzIF9fcmVhZF9tb3N0bHkgPQogewotCS5mdW5jID0gZnVuY3Rpb25fdHJhY2VfcHJvYmVfY2FsbCwKKwkuZnVuYwkJPSBmdW5jdGlvbl90cmFjZV9wcm9iZV9jYWxsLAogfTsKIAogc3RhdGljIGludCBmdHJhY2VfcHJvYmVfcmVnaXN0ZXJlZDsKQEAgLTE4MjMsNiArMjM3NCw0NSBAQAogCWZ0cmFjZV9zZXRfcmVnZXgoYnVmLCBsZW4sIHJlc2V0LCAwKTsKIH0KIAorLyoKKyAqIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UgdG8gYWxsb3cgdXNlcnMgdG8gc2V0IGZpbHRlcnMgb24gYm9vdCB1cC4KKyAqLworI2RlZmluZSBGVFJBQ0VfRklMVEVSX1NJWkUJCUNPTU1BTkRfTElORV9TSVpFCitzdGF0aWMgY2hhciBmdHJhY2Vfbm90cmFjZV9idWZbRlRSQUNFX0ZJTFRFUl9TSVpFXSBfX2luaXRkYXRhOworc3RhdGljIGNoYXIgZnRyYWNlX2ZpbHRlcl9idWZbRlRSQUNFX0ZJTFRFUl9TSVpFXSBfX2luaXRkYXRhOworCitzdGF0aWMgaW50IF9faW5pdCBzZXRfZnRyYWNlX25vdHJhY2UoY2hhciAqc3RyKQoreworCXN0cm5jcHkoZnRyYWNlX25vdHJhY2VfYnVmLCBzdHIsIEZUUkFDRV9GSUxURVJfU0laRSk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJmdHJhY2Vfbm90cmFjZT0iLCBzZXRfZnRyYWNlX25vdHJhY2UpOworCitzdGF0aWMgaW50IF9faW5pdCBzZXRfZnRyYWNlX2ZpbHRlcihjaGFyICpzdHIpCit7CisJc3RybmNweShmdHJhY2VfZmlsdGVyX2J1Ziwgc3RyLCBGVFJBQ0VfRklMVEVSX1NJWkUpOworCXJldHVybiAxOworfQorX19zZXR1cCgiZnRyYWNlX2ZpbHRlcj0iLCBzZXRfZnRyYWNlX2ZpbHRlcik7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfZnRyYWNlX2Vhcmx5X2ZpbHRlcihjaGFyICpidWYsIGludCBlbmFibGUpCit7CisJY2hhciAqZnVuYzsKKworCXdoaWxlIChidWYpIHsKKwkJZnVuYyA9IHN0cnNlcCgmYnVmLCAiLCIpOworCQlmdHJhY2Vfc2V0X3JlZ2V4KGZ1bmMsIHN0cmxlbihmdW5jKSwgMCwgZW5hYmxlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzZXRfZnRyYWNlX2Vhcmx5X2ZpbHRlcnModm9pZCkKK3sKKwlpZiAoZnRyYWNlX2ZpbHRlcl9idWZbMF0pCisJCXNldF9mdHJhY2VfZWFybHlfZmlsdGVyKGZ0cmFjZV9maWx0ZXJfYnVmLCAxKTsKKwlpZiAoZnRyYWNlX25vdHJhY2VfYnVmWzBdKQorCQlzZXRfZnRyYWNlX2Vhcmx5X2ZpbHRlcihmdHJhY2Vfbm90cmFjZV9idWYsIDApOworfQorCiBzdGF0aWMgaW50CiBmdHJhY2VfcmVnZXhfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGVuYWJsZSkKIHsKQEAgLTIxMjgsMzggKzI3MTgsMjMgQEAKIAogc3RhdGljIF9faW5pdCBpbnQgZnRyYWNlX2luaXRfZHluX2RlYnVnZnMoc3RydWN0IGRlbnRyeSAqZF90cmFjZXIpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImF2YWlsYWJsZV9maWx0ZXJfZnVuY3Rpb25zIiwgMDQ0NCwKLQkJCQkgICAgZF90cmFjZXIsIE5VTEwsICZmdHJhY2VfYXZhaWxfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICInYXZhaWxhYmxlX2ZpbHRlcl9mdW5jdGlvbnMnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgiYXZhaWxhYmxlX2ZpbHRlcl9mdW5jdGlvbnMiLCAwNDQ0LAorCQkJZF90cmFjZXIsIE5VTEwsICZmdHJhY2VfYXZhaWxfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImZhaWx1cmVzIiwgMDQ0NCwKLQkJCQkgICAgZF90cmFjZXIsIE5VTEwsICZmdHJhY2VfZmFpbHVyZXNfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICdmYWlsdXJlcycgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJmYWlsdXJlcyIsIDA0NDQsCisJCQlkX3RyYWNlciwgTlVMTCwgJmZ0cmFjZV9mYWlsdXJlc19mb3BzKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2V0X2Z0cmFjZV9maWx0ZXIiLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgTlVMTCwgJmZ0cmFjZV9maWx0ZXJfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICInc2V0X2Z0cmFjZV9maWx0ZXInIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgic2V0X2Z0cmFjZV9maWx0ZXIiLCAwNjQ0LCBkX3RyYWNlciwKKwkJCU5VTEwsICZmdHJhY2VfZmlsdGVyX2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzZXRfZnRyYWNlX25vdHJhY2UiLCAwNjQ0LCBkX3RyYWNlciwKKwl0cmFjZV9jcmVhdGVfZmlsZSgic2V0X2Z0cmFjZV9ub3RyYWNlIiwgMDY0NCwgZF90cmFjZXIsCiAJCQkJICAgIE5VTEwsICZmdHJhY2Vfbm90cmFjZV9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIidzZXRfZnRyYWNlX25vdHJhY2UnIGVudHJ5XG4iKTsKIAogI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInNldF9ncmFwaF9mdW5jdGlvbiIsIDA0NDQsIGRfdHJhY2VyLAorCXRyYWNlX2NyZWF0ZV9maWxlKCJzZXRfZ3JhcGhfZnVuY3Rpb24iLCAwNDQ0LCBkX3RyYWNlciwKIAkJCQkgICAgTlVMTCwKIAkJCQkgICAgJmZ0cmFjZV9ncmFwaF9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIidzZXRfZ3JhcGhfZnVuY3Rpb24nIGVudHJ5XG4iKTsKICNlbmRpZiAvKiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSICovCiAKIAlyZXR1cm4gMDsKQEAgLTIxOTcsMTQgKzI3NzIsNzIgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBmdHJhY2VfaW5pdF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLAotCQkJdW5zaWduZWQgbG9uZyAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKmVuZCkKKyNpZmRlZiBDT05GSUdfTU9EVUxFUwordm9pZCBmdHJhY2VfcmVsZWFzZSh2b2lkICpzdGFydCwgdm9pZCAqZW5kKQoreworCXN0cnVjdCBkeW5fZnRyYWNlICpyZWM7CisJc3RydWN0IGZ0cmFjZV9wYWdlICpwZzsKKwl1bnNpZ25lZCBsb25nIHMgPSAodW5zaWduZWQgbG9uZylzdGFydDsKKwl1bnNpZ25lZCBsb25nIGUgPSAodW5zaWduZWQgbG9uZyllbmQ7CisKKwlpZiAoZnRyYWNlX2Rpc2FibGVkIHx8ICFzdGFydCB8fCBzdGFydCA9PSBlbmQpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKKwlkb19mb3JfZWFjaF9mdHJhY2VfcmVjKHBnLCByZWMpIHsKKwkJaWYgKChyZWMtPmlwID49IHMpICYmIChyZWMtPmlwIDwgZSkpIHsKKwkJCS8qCisJCQkgKiByZWMtPmlwIGlzIGNoYW5nZWQgaW4gZnRyYWNlX2ZyZWVfcmVjKCkKKwkJCSAqIEl0IHNob3VsZCBub3QgYmV0d2VlbiBzIGFuZCBlIGlmIHJlY29yZCB3YXMgZnJlZWQuCisJCQkgKi8KKwkJCUZUUkFDRV9XQVJOX09OKHJlYy0+ZmxhZ3MgJiBGVFJBQ0VfRkxfRlJFRSk7CisJCQlmdHJhY2VfZnJlZV9yZWMocmVjKTsKKwkJfQorCX0gd2hpbGVfZm9yX2VhY2hfZnRyYWNlX3JlYygpOworCW11dGV4X3VubG9jaygmZnRyYWNlX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBmdHJhY2VfaW5pdF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YXJ0LCB1bnNpZ25lZCBsb25nICplbmQpCiB7CiAJaWYgKGZ0cmFjZV9kaXNhYmxlZCB8fCBzdGFydCA9PSBlbmQpCiAJCXJldHVybjsKIAlmdHJhY2VfY29udmVydF9ub3BzKG1vZCwgc3RhcnQsIGVuZCk7CiB9CiAKK3N0YXRpYyBpbnQgZnRyYWNlX21vZHVsZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBtb2R1bGUgKm1vZCA9IGRhdGE7CisKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgTU9EVUxFX1NUQVRFX0NPTUlORzoKKwkJZnRyYWNlX2luaXRfbW9kdWxlKG1vZCwgbW9kLT5mdHJhY2VfY2FsbHNpdGVzLAorCQkJCSAgIG1vZC0+ZnRyYWNlX2NhbGxzaXRlcyArCisJCQkJICAgbW9kLT5udW1fZnRyYWNlX2NhbGxzaXRlcyk7CisJCWJyZWFrOworCWNhc2UgTU9EVUxFX1NUQVRFX0dPSU5HOgorCQlmdHJhY2VfcmVsZWFzZShtb2QtPmZ0cmFjZV9jYWxsc2l0ZXMsCisJCQkgICAgICAgbW9kLT5mdHJhY2VfY2FsbHNpdGVzICsKKwkJCSAgICAgICBtb2QtPm51bV9mdHJhY2VfY2FsbHNpdGVzKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBmdHJhY2VfbW9kdWxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KKworc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZ0cmFjZV9tb2R1bGVfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBmdHJhY2VfbW9kdWxlX25vdGlmeSwKKwkucHJpb3JpdHkgPSAwLAorfTsKKwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zdGFydF9tY291bnRfbG9jW107CiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX3N0b3BfbWNvdW50X2xvY1tdOwogCkBAIC0yMjM2LDYgKzI4NjksMTIgQEAKIAkJCQkgIF9fc3RhcnRfbWNvdW50X2xvYywKIAkJCQkgIF9fc3RvcF9tY291bnRfbG9jKTsKIAorCXJldCA9IHJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcigmZnRyYWNlX21vZHVsZV9uYik7CisJaWYgKHJldCkKKwkJcHJfd2FybmluZygiRmFpbGVkIHRvIHJlZ2lzdGVyIHRyYWNlIGZ0cmFjZSBtb2R1bGUgbm90aWZpZXJcbiIpOworCisJc2V0X2Z0cmFjZV9lYXJseV9maWx0ZXJzKCk7CisKIAlyZXR1cm47CiAgZmFpbGVkOgogCWZ0cmFjZV9kaXNhYmxlZCA9IDE7CkBAIC0yNDE3LDcgKzMwNTYsNiBAQAogc3RhdGljIF9faW5pdCBpbnQgZnRyYWNlX2luaXRfZGVidWdmcyh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwotCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCiAJZF90cmFjZXIgPSB0cmFjaW5nX2luaXRfZGVudHJ5KCk7CiAJaWYgKCFkX3RyYWNlcikKQEAgLTI0MjUsMTEgKzMwNjMsMTEgQEAKIAogCWZ0cmFjZV9pbml0X2R5bl9kZWJ1Z2ZzKGRfdHJhY2VyKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2V0X2Z0cmFjZV9waWQiLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgTlVMTCwgJmZ0cmFjZV9waWRfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICInc2V0X2Z0cmFjZV9waWQnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgic2V0X2Z0cmFjZV9waWQiLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSAgICBOVUxMLCAmZnRyYWNlX3BpZF9mb3BzKTsKKworCWZ0cmFjZV9wcm9maWxlX2RlYnVnZnMoZF90cmFjZXIpOworCiAJcmV0dXJuIDA7CiB9CiBmc19pbml0Y2FsbChmdHJhY2VfaW5pdF9kZWJ1Z2ZzKTsKQEAgLTI1MzgsNyArMzE3Niw3IEBACiAKICNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCiAKLXN0YXRpYyBhdG9taWNfdCBmdHJhY2VfZ3JhcGhfYWN0aXZlOworc3RhdGljIGludCBmdHJhY2VfZ3JhcGhfYWN0aXZlOwogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBmdHJhY2Vfc3VzcGVuZF9ub3RpZmllcjsKIAogaW50IGZ0cmFjZV9ncmFwaF9lbnRyeV9zdHViKHN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50ICp0cmFjZSkKQEAgLTI1ODAsMTIgKzMyMTgsMTIgQEAKIAkJfQogCiAJCWlmICh0LT5yZXRfc3RhY2sgPT0gTlVMTCkgewotCQkJdC0+Y3Vycl9yZXRfc3RhY2sgPSAtMTsKLQkJCS8qIE1ha2Ugc3VyZSBJUlFzIHNlZSB0aGUgLTEgZmlyc3Q6ICovCi0JCQliYXJyaWVyKCk7Ci0JCQl0LT5yZXRfc3RhY2sgPSByZXRfc3RhY2tfbGlzdFtzdGFydCsrXTsKIAkJCWF0b21pY19zZXQoJnQtPnRyYWNpbmdfZ3JhcGhfcGF1c2UsIDApOwogCQkJYXRvbWljX3NldCgmdC0+dHJhY2Vfb3ZlcnJ1biwgMCk7CisJCQl0LT5jdXJyX3JldF9zdGFjayA9IC0xOworCQkJLyogTWFrZSBzdXJlIHRoZSB0YXNrcyBzZWUgdGhlIC0xIGZpcnN0OiAqLworCQkJc21wX3dtYigpOworCQkJdC0+cmV0X3N0YWNrID0gcmV0X3N0YWNrX2xpc3Rbc3RhcnQrK107CiAJCX0KIAl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHQpOwogCkBAIC0yNjQzLDggKzMyODEsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBUaGUgY3B1X2Jvb3QgaW5pdF90YXNrLT5yZXRfc3RhY2sgd2lsbCBuZXZlciBiZSBmcmVlZCAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQlmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKGlkbGVfdGFzayhjcHUpKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoIWlkbGVfdGFzayhjcHUpLT5yZXRfc3RhY2spCisJCQlmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKGlkbGVfdGFzayhjcHUpKTsKKwl9CiAKIAlkbyB7CiAJCXJldCA9IGFsbG9jX3JldHN0YWNrX3Rhc2tsaXN0KHJldF9zdGFja19saXN0KTsKQEAgLTI2OTAsNyArMzMzMCw3IEBACiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOwogCiAJLyogd2UgY3VycmVudGx5IGFsbG93IG9ubHkgb25lIHRyYWNlciByZWdpc3RlcmVkIGF0IGEgdGltZSAqLwotCWlmIChhdG9taWNfcmVhZCgmZnRyYWNlX2dyYXBoX2FjdGl2ZSkpIHsKKwlpZiAoZnRyYWNlX2dyYXBoX2FjdGl2ZSkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI2OTgsMTAgKzMzMzgsMTAgQEAKIAlmdHJhY2Vfc3VzcGVuZF9ub3RpZmllci5ub3RpZmllcl9jYWxsID0gZnRyYWNlX3N1c3BlbmRfbm90aWZpZXJfY2FsbDsKIAlyZWdpc3Rlcl9wbV9ub3RpZmllcigmZnRyYWNlX3N1c3BlbmRfbm90aWZpZXIpOwogCi0JYXRvbWljX2luYygmZnRyYWNlX2dyYXBoX2FjdGl2ZSk7CisJZnRyYWNlX2dyYXBoX2FjdGl2ZSsrOwogCXJldCA9IHN0YXJ0X2dyYXBoX3RyYWNpbmcoKTsKIAlpZiAocmV0KSB7Ci0JCWF0b21pY19kZWMoJmZ0cmFjZV9ncmFwaF9hY3RpdmUpOworCQlmdHJhY2VfZ3JhcGhfYWN0aXZlLS07CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjcxOSwxMCArMzM1OSwxMCBAQAogewogCW11dGV4X2xvY2soJmZ0cmFjZV9sb2NrKTsKIAotCWlmICghdW5saWtlbHkoYXRvbWljX3JlYWQoJmZ0cmFjZV9ncmFwaF9hY3RpdmUpKSkKKwlpZiAodW5saWtlbHkoIWZ0cmFjZV9ncmFwaF9hY3RpdmUpKQogCQlnb3RvIG91dDsKIAotCWF0b21pY19kZWMoJmZ0cmFjZV9ncmFwaF9hY3RpdmUpOworCWZ0cmFjZV9ncmFwaF9hY3RpdmUtLTsKIAl1bnJlZ2lzdGVyX3RyYWNlX3NjaGVkX3N3aXRjaChmdHJhY2VfZ3JhcGhfcHJvYmVfc2NoZWRfc3dpdGNoKTsKIAlmdHJhY2VfZ3JhcGhfcmV0dXJuID0gKHRyYWNlX2Z1bmNfZ3JhcGhfcmV0X3QpZnRyYWNlX3N0dWI7CiAJZnRyYWNlX2dyYXBoX2VudHJ5ID0gZnRyYWNlX2dyYXBoX2VudHJ5X3N0dWI7CkBAIC0yNzM2LDE4ICszMzc2LDI1IEBACiAvKiBBbGxvY2F0ZSBhIHJldHVybiBzdGFjayBmb3IgbmV3bHkgY3JlYXRlZCB0YXNrICovCiB2b2lkIGZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KQogewotCWlmIChhdG9taWNfcmVhZCgmZnRyYWNlX2dyYXBoX2FjdGl2ZSkpIHsKLQkJdC0+cmV0X3N0YWNrID0ga21hbGxvYyhGVFJBQ0VfUkVURlVOQ19ERVBUSAorCS8qIE1ha2Ugc3VyZSB3ZSBkbyBub3QgdXNlIHRoZSBwYXJlbnQgcmV0X3N0YWNrICovCisJdC0+cmV0X3N0YWNrID0gTlVMTDsKKworCWlmIChmdHJhY2VfZ3JhcGhfYWN0aXZlKSB7CisJCXN0cnVjdCBmdHJhY2VfcmV0X3N0YWNrICpyZXRfc3RhY2s7CisKKwkJcmV0X3N0YWNrID0ga21hbGxvYyhGVFJBQ0VfUkVURlVOQ19ERVBUSAogCQkJCSogc2l6ZW9mKHN0cnVjdCBmdHJhY2VfcmV0X3N0YWNrKSwKIAkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCF0LT5yZXRfc3RhY2spCisJCWlmICghcmV0X3N0YWNrKQogCQkJcmV0dXJuOwogCQl0LT5jdXJyX3JldF9zdGFjayA9IC0xOwogCQlhdG9taWNfc2V0KCZ0LT50cmFjaW5nX2dyYXBoX3BhdXNlLCAwKTsKIAkJYXRvbWljX3NldCgmdC0+dHJhY2Vfb3ZlcnJ1biwgMCk7CiAJCXQtPmZ0cmFjZV90aW1lc3RhbXAgPSAwOwotCX0gZWxzZQotCQl0LT5yZXRfc3RhY2sgPSBOVUxMOworCQkvKiBtYWtlIGN1cnJfcmV0X3N0YWNrIHZpc2FibGUgYmVmb3JlIHdlIGFkZCB0aGUgcmV0X3N0YWNrICovCisJCXNtcF93bWIoKTsKKwkJdC0+cmV0X3N0YWNrID0gcmV0X3N0YWNrOworCX0KIH0KIAogdm9pZCBmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9rbWVtdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9rbWVtdHJhY2UuYwppbmRleCA1MDExZjRkLi44NmNkZjY3IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2Uva21lbXRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2ttZW10cmFjZS5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KIAotI2luY2x1ZGUgPHRyYWNlL2ttZW10cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW10cmFjZS5oPgogCiAjaW5jbHVkZSAidHJhY2Vfb3V0cHV0LmgiCiAjaW5jbHVkZSAidHJhY2UuaCIKQEAgLTQyLDYgKzQyLDcgQEAKIAkJCQkgICBnZnBfdCBnZnBfZmxhZ3MsCiAJCQkJICAgaW50IG5vZGUpCiB7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2ttZW1fYWxsb2M7CiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGttZW10cmFjZV9hcnJheTsKIAlzdHJ1Y3Qga21lbXRyYWNlX2FsbG9jX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwpAQCAtNjIsNyArNjMsOCBAQAogCWVudHJ5LT5nZnBfZmxhZ3MJPSBnZnBfZmxhZ3M7CiAJZW50cnktPm5vZGUJCT0gbm9kZTsKIAotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CiAKIAl0cmFjZV93YWtlX3VwKCk7CiB9CkBAIC03MSw2ICs3Myw3IEBACiAJCQkJICB1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwKIAkJCQkgIGNvbnN0IHZvaWQgKnB0cikKIHsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfa21lbV9mcmVlOwogCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSBrbWVtdHJhY2VfYXJyYXk7CiAJc3RydWN0IGttZW10cmFjZV9mcmVlX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwpAQCAtODYsNyArODksOCBAQAogCWVudHJ5LT5jYWxsX3NpdGUJPSBjYWxsX3NpdGU7CiAJZW50cnktPnB0cgkJPSBwdHI7CiAKLQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOwogCiAJdHJhY2Vfd2FrZV91cCgpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwppbmRleCA5NjBjYmY0Li4yZTY0MmIyIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYworKysgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwpAQCAtMjIsNiArMjIsMjggQEAKICNpbmNsdWRlICJ0cmFjZS5oIgogCiAvKgorICogVGhlIHJpbmcgYnVmZmVyIGhlYWRlciBpcyBzcGVjaWFsLiBXZSBtdXN0IG1hbnVhbGx5IHVwIGtlZXAgaXQuCisgKi8KK2ludCByaW5nX2J1ZmZlcl9wcmludF9lbnRyeV9oZWFkZXIoc3RydWN0IHRyYWNlX3NlcSAqcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiIyBjb21wcmVzc2VkIGVudHJ5IGhlYWRlclxuIik7CisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHR0eXBlX2xlbiAgICA6ICAgIDUgYml0c1xuIik7CisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHR0aW1lX2RlbHRhICA6ICAgMjcgYml0c1xuIik7CisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRhcnJheSAgICAgICA6ICAgMzIgYml0c1xuIik7CisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXG4iKTsKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdHBhZGRpbmcgICAgIDogdHlwZSA9PSAlZFxuIiwKKwkJCSAgICAgICBSSU5HQlVGX1RZUEVfUEFERElORyk7CisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHR0aW1lX2V4dGVuZCA6IHR5cGUgPT0gJWRcbiIsCisJCQkgICAgICAgUklOR0JVRl9UWVBFX1RJTUVfRVhURU5EKTsKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdGRhdGEgbWF4IHR5cGVfbGVuICA9PSAlZFxuIiwKKwkJCSAgICAgICBSSU5HQlVGX1RZUEVfREFUQV9UWVBFX0xFTl9NQVgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKICAqIFRoZSByaW5nIGJ1ZmZlciBpcyBtYWRlIHVwIG9mIGEgbGlzdCBvZiBwYWdlcy4gQSBzZXBhcmF0ZSBsaXN0IG9mIHBhZ2VzIGlzCiAgKiBhbGxvY2F0ZWQgZm9yIGVhY2ggQ1BVLiBBIHdyaXRlciBtYXkgb25seSB3cml0ZSB0byBhIGJ1ZmZlciB0aGF0IGlzCiAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIENQVSBpdCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nIG9uLiAgQSByZWFkZXIgbWF5IHJlYWQKQEAgLTE4Miw3ICsyMDQsMTAgQEAKIAogI2RlZmluZSBSQl9FVk5UX0hEUl9TSVpFIChvZmZzZXRvZihzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQsIGFycmF5KSkKICNkZWZpbmUgUkJfQUxJR05NRU5UCQk0VQotI2RlZmluZSBSQl9NQVhfU01BTExfREFUQQkyOAorI2RlZmluZSBSQl9NQVhfU01BTExfREFUQQkoUkJfQUxJR05NRU5UICogUklOR0JVRl9UWVBFX0RBVEFfVFlQRV9MRU5fTUFYKQorCisvKiBkZWZpbmUgUklOR0JVRl9UWVBFX0RBVEEgZm9yICdjYXNlIFJJTkdCVUZfVFlQRV9EQVRBOicgKi8KKyNkZWZpbmUgUklOR0JVRl9UWVBFX0RBVEEgMCAuLi4gUklOR0JVRl9UWVBFX0RBVEFfVFlQRV9MRU5fTUFYCiAKIGVudW0gewogCVJCX0xFTl9USU1FX0VYVEVORCA9IDgsCkBAIC0xOTEsNDggKzIxNiwyOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCByYl9udWxsX2V2ZW50KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7Ci0JcmV0dXJuIGV2ZW50LT50eXBlID09IFJJTkdCVUZfVFlQRV9QQURESU5HICYmIGV2ZW50LT50aW1lX2RlbHRhID09IDA7CisJcmV0dXJuIGV2ZW50LT50eXBlX2xlbiA9PSBSSU5HQlVGX1RZUEVfUEFERElORworCQkJJiYgZXZlbnQtPnRpbWVfZGVsdGEgPT0gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcmJfZGlzY2FyZGVkX2V2ZW50KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7Ci0JcmV0dXJuIGV2ZW50LT50eXBlID09IFJJTkdCVUZfVFlQRV9QQURESU5HICYmIGV2ZW50LT50aW1lX2RlbHRhOworCXJldHVybiBldmVudC0+dHlwZV9sZW4gPT0gUklOR0JVRl9UWVBFX1BBRERJTkcgJiYgZXZlbnQtPnRpbWVfZGVsdGE7CiB9CiAKIHN0YXRpYyB2b2lkIHJiX2V2ZW50X3NldF9wYWRkaW5nKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7Ci0JZXZlbnQtPnR5cGUgPSBSSU5HQlVGX1RZUEVfUEFERElORzsKKwlldmVudC0+dHlwZV9sZW4gPSBSSU5HQlVGX1RZUEVfUEFERElORzsKIAlldmVudC0+dGltZV9kZWx0YSA9IDA7CiB9CiAKLS8qKgotICogcmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZCAtIGRpc2NhcmQgYW4gZXZlbnQgaW4gdGhlIHJpbmcgYnVmZmVyCi0gKiBAYnVmZmVyOiB0aGUgcmluZyBidWZmZXIKLSAqIEBldmVudDogdGhlIGV2ZW50IHRvIGRpc2NhcmQKLSAqCi0gKiBTb21ldGltZXMgYSBldmVudCB0aGF0IGlzIGluIHRoZSByaW5nIGJ1ZmZlciBuZWVkcyB0byBiZSBpZ25vcmVkLgotICogVGhpcyBmdW5jdGlvbiBsZXRzIHRoZSB1c2VyIGRpc2NhcmQgYW4gZXZlbnQgaW4gdGhlIHJpbmcgYnVmZmVyCi0gKiBhbmQgdGhlbiB0aGF0IGV2ZW50IHdpbGwgbm90IGJlIHJlYWQgbGF0ZXIuCi0gKgotICogTm90ZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoaXMsIGFuZCBwcm90ZWN0Ci0gKiBhZ2FpbnN0IHJhY2VzLiBJZiB0aGUgdXNlciBkaXNjYXJkcyBhbiBldmVudCB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkCi0gKiBpdCBpcyBwb3NzaWJsZSB0aGF0IGl0IGNvdWxkIGNvcnJ1cHQgdGhlIHJpbmcgYnVmZmVyLgotICovCi12b2lkIHJpbmdfYnVmZmVyX2V2ZW50X2Rpc2NhcmQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKLXsKLQlldmVudC0+dHlwZSA9IFJJTkdCVUZfVFlQRV9QQURESU5HOwotCS8qIHRpbWUgZGVsdGEgbXVzdCBiZSBub24gemVybyAqLwotCWlmICghZXZlbnQtPnRpbWVfZGVsdGEpCi0JCWV2ZW50LT50aW1lX2RlbHRhID0gMTsKLX0KLQogc3RhdGljIHVuc2lnbmVkCiByYl9ldmVudF9kYXRhX2xlbmd0aChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQogewogCXVuc2lnbmVkIGxlbmd0aDsKIAotCWlmIChldmVudC0+bGVuKQotCQlsZW5ndGggPSBldmVudC0+bGVuICogUkJfQUxJR05NRU5UOworCWlmIChldmVudC0+dHlwZV9sZW4pCisJCWxlbmd0aCA9IGV2ZW50LT50eXBlX2xlbiAqIFJCX0FMSUdOTUVOVDsKIAllbHNlCiAJCWxlbmd0aCA9IGV2ZW50LT5hcnJheVswXTsKIAlyZXR1cm4gbGVuZ3RoICsgUkJfRVZOVF9IRFJfU0laRTsKQEAgLTI0MiwxMiArMjQ3LDEyIEBACiBzdGF0aWMgdW5zaWduZWQKIHJiX2V2ZW50X2xlbmd0aChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQogewotCXN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKwlzd2l0Y2ggKGV2ZW50LT50eXBlX2xlbikgewogCWNhc2UgUklOR0JVRl9UWVBFX1BBRERJTkc6CiAJCWlmIChyYl9udWxsX2V2ZW50KGV2ZW50KSkKIAkJCS8qIHVuZGVmaW5lZCAqLwogCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gcmJfZXZlbnRfZGF0YV9sZW5ndGgoZXZlbnQpOworCQlyZXR1cm4gIGV2ZW50LT5hcnJheVswXSArIFJCX0VWTlRfSERSX1NJWkU7CiAKIAljYXNlIFJJTkdCVUZfVFlQRV9USU1FX0VYVEVORDoKIAkJcmV0dXJuIFJCX0xFTl9USU1FX0VYVEVORDsKQEAgLTI3MSw3ICsyNzYsNyBAQAogdW5zaWduZWQgcmluZ19idWZmZXJfZXZlbnRfbGVuZ3RoKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7CiAJdW5zaWduZWQgbGVuZ3RoID0gcmJfZXZlbnRfbGVuZ3RoKGV2ZW50KTsKLQlpZiAoZXZlbnQtPnR5cGUgIT0gUklOR0JVRl9UWVBFX0RBVEEpCisJaWYgKGV2ZW50LT50eXBlX2xlbiA+IFJJTkdCVUZfVFlQRV9EQVRBX1RZUEVfTEVOX01BWCkKIAkJcmV0dXJuIGxlbmd0aDsKIAlsZW5ndGggLT0gUkJfRVZOVF9IRFJfU0laRTsKIAlpZiAobGVuZ3RoID4gUkJfTUFYX1NNQUxMX0RBVEEgKyBzaXplb2YoZXZlbnQtPmFycmF5WzBdKSkKQEAgLTI4NCw5ICsyODksOSBAQAogc3RhdGljIHZvaWQgKgogcmJfZXZlbnRfZGF0YShzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQogewotCUJVR19PTihldmVudC0+dHlwZSAhPSBSSU5HQlVGX1RZUEVfREFUQSk7CisJQlVHX09OKGV2ZW50LT50eXBlX2xlbiA+IFJJTkdCVUZfVFlQRV9EQVRBX1RZUEVfTEVOX01BWCk7CiAJLyogSWYgbGVuZ3RoIGlzIGluIGxlbiBmaWVsZCwgdGhlbiBhcnJheVswXSBoYXMgdGhlIGRhdGEgKi8KLQlpZiAoZXZlbnQtPmxlbikKKwlpZiAoZXZlbnQtPnR5cGVfbGVuKQogCQlyZXR1cm4gKHZvaWQgKikmZXZlbnQtPmFycmF5WzBdOwogCS8qIE90aGVyd2lzZSBsZW5ndGggaXMgaW4gYXJyYXlbMF0gYW5kIGFycmF5WzFdIGhhcyB0aGUgZGF0YSAqLwogCXJldHVybiAodm9pZCAqKSZldmVudC0+YXJyYXlbMV07CkBAIC0zMTYsOSArMzIxLDEwIEBACiB9OwogCiBzdHJ1Y3QgYnVmZmVyX3BhZ2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIGxpc3Qgb2YgYnVmZmVyIHBhZ2VzICovCiAJbG9jYWxfdAkJIHdyaXRlOwkJLyogaW5kZXggZm9yIG5leHQgd3JpdGUgKi8KIAl1bnNpZ25lZAkgcmVhZDsJCS8qIGluZGV4IGZvciBuZXh0IHJlYWQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IG9mIGZyZWUgcGFnZXMgKi8KKwlsb2NhbF90CQkgZW50cmllczsJLyogZW50cmllcyBvbiB0aGlzIHBhZ2UgKi8KIAlzdHJ1Y3QgYnVmZmVyX2RhdGFfcGFnZSAqcGFnZTsJLyogQWN0dWFsIGRhdGEgcGFnZSAqLwogfTsKIApAQCAtMzYxLDYgKzM2NywzNCBAQAogCiAjZGVmaW5lIEJVRl9QQUdFX1NJWkUgKFBBR0VfU0laRSAtIEJVRl9QQUdFX0hEUl9TSVpFKQogCisvKiBNYXggcGF5bG9hZCBpcyBCVUZfUEFHRV9TSVpFIC0gaGVhZGVyICg4Ynl0ZXMpICovCisjZGVmaW5lIEJVRl9NQVhfREFUQV9TSVpFIChCVUZfUEFHRV9TSVpFIC0gKHNpemVvZih1MzIpICogMikpCisKKy8qIE1heCBudW1iZXIgb2YgdGltZXN0YW1wcyB0aGF0IGNhbiBmaXQgb24gYSBwYWdlICovCisjZGVmaW5lIFJCX1RJTUVTVEFNUFNfUEVSX1BBR0UJKEJVRl9QQUdFX1NJWkUgLyBSQl9MRU5fVElNRV9TVEFNUCkKKworaW50IHJpbmdfYnVmZmVyX3ByaW50X3BhZ2VfaGVhZGVyKHN0cnVjdCB0cmFjZV9zZXEgKnMpCit7CisJc3RydWN0IGJ1ZmZlcl9kYXRhX3BhZ2UgZmllbGQ7CisJaW50IHJldDsKKworCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6IHU2NCB0aW1lc3RhbXA7XHQiCisJCQkgICAgICAgIm9mZnNldDowO1x0c2l6ZToldTtcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGludClzaXplb2YoZmllbGQudGltZV9zdGFtcCkpOworCisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZDogbG9jYWxfdCBjb21taXQ7XHQiCisJCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgY29tbWl0KSwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KXNpemVvZihmaWVsZC5jb21taXQpKTsKKworCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6IGNoYXIgZGF0YTtcdCIKKwkJCSAgICAgICAib2Zmc2V0OiV1O1x0c2l6ZToldTtcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGludClvZmZzZXRvZih0eXBlb2YoZmllbGQpLCBkYXRhKSwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KUJVRl9QQUdFX1NJWkUpOworCisJcmV0dXJuIHJldDsKK30KKwogLyoKICAqIGhlYWRfcGFnZSA9PSB0YWlsX3BhZ2UgJiYgaGVhZCA9PSB0YWlsIHRoZW4gYnVmZmVyIGlzIGVtcHR5LgogICovCkBAIC0zNzUsOCArNDA5LDExIEBACiAJc3RydWN0IGJ1ZmZlcl9wYWdlCQkqdGFpbF9wYWdlOwkvKiB3cml0ZSB0byB0YWlsICovCiAJc3RydWN0IGJ1ZmZlcl9wYWdlCQkqY29tbWl0X3BhZ2U7CS8qIGNvbW1pdHRlZCBwYWdlcyAqLwogCXN0cnVjdCBidWZmZXJfcGFnZQkJKnJlYWRlcl9wYWdlOworCXVuc2lnbmVkIGxvbmcJCQlubWlfZHJvcHBlZDsKKwl1bnNpZ25lZCBsb25nCQkJY29tbWl0X292ZXJydW47CiAJdW5zaWduZWQgbG9uZwkJCW92ZXJydW47Ci0JdW5zaWduZWQgbG9uZwkJCWVudHJpZXM7CisJdW5zaWduZWQgbG9uZwkJCXJlYWQ7CisJbG9jYWxfdAkJCQllbnRyaWVzOwogCXU2NAkJCQl3cml0ZV9zdGFtcDsKIAl1NjQJCQkJcmVhZF9zdGFtcDsKIAlhdG9taWNfdAkJCXJlY29yZF9kaXNhYmxlZDsKQEAgLTM4OSw2ICs0MjYsOCBAQAogCWF0b21pY190CQkJcmVjb3JkX2Rpc2FibGVkOwogCWNwdW1hc2tfdmFyX3QJCQljcHVtYXNrOwogCisJc3RydWN0IGxvY2tfY2xhc3Nfa2V5CQkqcmVhZGVyX2xvY2tfa2V5OworCiAJc3RydWN0IG11dGV4CQkJbXV0ZXg7CiAKIAlzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdQkqKmJ1ZmZlcnM7CkBAIC00MjAsMTMgKzQ1OSwxOCBAQAogLyogVXAgdGhpcyBpZiB5b3Ugd2FudCB0byB0ZXN0IHRoZSBUSU1FX0VYVEVOVFMgYW5kIG5vcm1hbGl6YXRpb24gKi8KICNkZWZpbmUgREVCVUdfU0hJRlQgMAogCitzdGF0aWMgaW5saW5lIHU2NCByYl90aW1lX3N0YW1wKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCBpbnQgY3B1KQoreworCS8qIHNoaWZ0IHRvIGRlYnVnL3Rlc3Qgbm9ybWFsaXphdGlvbiBhbmQgVElNRV9FWFRFTlRTICovCisJcmV0dXJuIGJ1ZmZlci0+Y2xvY2soKSA8PCBERUJVR19TSElGVDsKK30KKwogdTY0IHJpbmdfYnVmZmVyX3RpbWVfc3RhbXAoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpCiB7CiAJdTY0IHRpbWU7CiAKIAlwcmVlbXB0X2Rpc2FibGVfbm90cmFjZSgpOwotCS8qIHNoaWZ0IHRvIGRlYnVnL3Rlc3Qgbm9ybWFsaXphdGlvbiBhbmQgVElNRV9FWFRFTlRTICovCi0JdGltZSA9IGJ1ZmZlci0+Y2xvY2soKSA8PCBERUJVR19TSElGVDsKKwl0aW1lID0gcmJfdGltZV9zdGFtcChidWZmZXIsIGNwdSk7CiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZF9ub3RyYWNlKCk7CiAKIAlyZXR1cm4gdGltZTsKQEAgLTUyMyw2ICs1NjcsNyBAQAogCWNwdV9idWZmZXItPmNwdSA9IGNwdTsKIAljcHVfYnVmZmVyLT5idWZmZXIgPSBidWZmZXI7CiAJc3Bpbl9sb2NrX2luaXQoJmNwdV9idWZmZXItPnJlYWRlcl9sb2NrKTsKKwlsb2NrZGVwX3NldF9jbGFzcygmY3B1X2J1ZmZlci0+cmVhZGVyX2xvY2ssIGJ1ZmZlci0+cmVhZGVyX2xvY2tfa2V5KTsKIAljcHVfYnVmZmVyLT5sb2NrID0gKHJhd19zcGlubG9ja190KV9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRDsKIAlJTklUX0xJU1RfSEVBRCgmY3B1X2J1ZmZlci0+cGFnZXMpOwogCkBAIC01OTMsNyArNjM4LDggQEAKICAqIHdoZW4gdGhlIGJ1ZmZlciB3cmFwcy4gSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHRoZSBidWZmZXIgd2lsbAogICogZHJvcCBkYXRhIHdoZW4gdGhlIHRhaWwgaGl0cyB0aGUgaGVhZC4KICAqLwotc3RydWN0IHJpbmdfYnVmZmVyICpyaW5nX2J1ZmZlcl9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGZsYWdzKQorc3RydWN0IHJpbmdfYnVmZmVyICpfX3JpbmdfYnVmZmVyX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgZmxhZ3MsCisJCQkJCXN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5KQogewogCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyOwogCWludCBic2l6ZTsKQEAgLTYxNiw2ICs2NjIsNyBAQAogCWJ1ZmZlci0+cGFnZXMgPSBESVZfUk9VTkRfVVAoc2l6ZSwgQlVGX1BBR0VfU0laRSk7CiAJYnVmZmVyLT5mbGFncyA9IGZsYWdzOwogCWJ1ZmZlci0+Y2xvY2sgPSB0cmFjZV9jbG9ja19sb2NhbDsKKwlidWZmZXItPnJlYWRlcl9sb2NrX2tleSA9IGtleTsKIAogCS8qIG5lZWQgYXQgbGVhc3QgdHdvIHBhZ2VzICovCiAJaWYgKGJ1ZmZlci0+cGFnZXMgPT0gMSkKQEAgLTY3Myw3ICs3MjAsNyBAQAogCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIE5VTEw7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9hbGxvYyk7CitFWFBPUlRfU1lNQk9MX0dQTChfX3JpbmdfYnVmZmVyX2FsbG9jKTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9mcmVlIC0gZnJlZSBhIHJpbmcgYnVmZmVyLgpAQCAtOTQ3LDMxICs5OTQsNiBAQAogCXJldHVybiByYl9wYWdlX2NvbW1pdChjcHVfYnVmZmVyLT5oZWFkX3BhZ2UpOwogfQogCi0vKgotICogV2hlbiB0aGUgdGFpbCBoaXRzIHRoZSBoZWFkIGFuZCB0aGUgYnVmZmVyIGlzIGluIG92ZXJ3cml0ZSBtb2RlLAotICogdGhlIGhlYWQganVtcHMgdG8gdGhlIG5leHQgcGFnZSBhbmQgYWxsIGNvbnRlbnQgb24gdGhlIHByZXZpb3VzCi0gKiBwYWdlIGlzIGRpc2NhcmRlZC4gQnV0IGJlZm9yZSBkb2luZyBzbywgd2UgdXBkYXRlIHRoZSBvdmVycnVuCi0gKiB2YXJpYWJsZSBvZiB0aGUgYnVmZmVyLgotICovCi1zdGF0aWMgdm9pZCByYl91cGRhdGVfb3ZlcmZsb3coc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIpCi17Ci0Jc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKLQl1bnNpZ25lZCBsb25nIGhlYWQ7Ci0KLQlmb3IgKGhlYWQgPSAwOyBoZWFkIDwgcmJfaGVhZF9zaXplKGNwdV9idWZmZXIpOwotCSAgICAgaGVhZCArPSByYl9ldmVudF9sZW5ndGgoZXZlbnQpKSB7Ci0KLQkJZXZlbnQgPSBfX3JiX3BhZ2VfaW5kZXgoY3B1X2J1ZmZlci0+aGVhZF9wYWdlLCBoZWFkKTsKLQkJaWYgKFJCX1dBUk5fT04oY3B1X2J1ZmZlciwgcmJfbnVsbF9ldmVudChldmVudCkpKQotCQkJcmV0dXJuOwotCQkvKiBPbmx5IGNvdW50IGRhdGEgZW50cmllcyAqLwotCQlpZiAoZXZlbnQtPnR5cGUgIT0gUklOR0JVRl9UWVBFX0RBVEEpCi0JCQljb250aW51ZTsKLQkJY3B1X2J1ZmZlci0+b3ZlcnJ1bisrOwotCQljcHVfYnVmZmVyLT5lbnRyaWVzLS07Ci0JfQotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgcmJfaW5jX3BhZ2Uoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsCiAJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9wYWdlICoqYnBhZ2UpCiB7CkBAIC05OTEsNyArMTAxMyw3IEBACiAJcmV0dXJuIChhZGRyICYgflBBR0VfTUFTSykgLSAoUEFHRV9TSVpFIC0gQlVGX1BBR0VfU0laRSk7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiByYl9pc19jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsCiAJICAgICBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQogewpAQCAtMTExMCwyOCArMTEzMiwyMSBAQAogcmJfdXBkYXRlX2V2ZW50KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQsCiAJCQkgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgbGVuZ3RoKQogewotCWV2ZW50LT50eXBlID0gdHlwZTsKKwlldmVudC0+dHlwZV9sZW4gPSB0eXBlOwogCiAJc3dpdGNoICh0eXBlKSB7CiAKIAljYXNlIFJJTkdCVUZfVFlQRV9QQURESU5HOgotCQlicmVhazsKLQogCWNhc2UgUklOR0JVRl9UWVBFX1RJTUVfRVhURU5EOgotCQlldmVudC0+bGVuID0gRElWX1JPVU5EX1VQKFJCX0xFTl9USU1FX0VYVEVORCwgUkJfQUxJR05NRU5UKTsKLQkJYnJlYWs7Ci0KIAljYXNlIFJJTkdCVUZfVFlQRV9USU1FX1NUQU1QOgotCQlldmVudC0+bGVuID0gRElWX1JPVU5EX1VQKFJCX0xFTl9USU1FX1NUQU1QLCBSQl9BTElHTk1FTlQpOwogCQlicmVhazsKIAotCWNhc2UgUklOR0JVRl9UWVBFX0RBVEE6CisJY2FzZSAwOgogCQlsZW5ndGggLT0gUkJfRVZOVF9IRFJfU0laRTsKLQkJaWYgKGxlbmd0aCA+IFJCX01BWF9TTUFMTF9EQVRBKSB7Ci0JCQlldmVudC0+bGVuID0gMDsKKwkJaWYgKGxlbmd0aCA+IFJCX01BWF9TTUFMTF9EQVRBKQogCQkJZXZlbnQtPmFycmF5WzBdID0gbGVuZ3RoOwotCQl9IGVsc2UKLQkJCWV2ZW50LT5sZW4gPSBESVZfUk9VTkRfVVAobGVuZ3RoLCBSQl9BTElHTk1FTlQpOworCQllbHNlCisJCQlldmVudC0+dHlwZV9sZW4gPSBESVZfUk9VTkRfVVAobGVuZ3RoLCBSQl9BTElHTk1FTlQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKQEAgLTExNTUsMTYgKzExNzAsMTQ0IEBACiAJcmV0dXJuIGxlbmd0aDsKIH0KIAorCitzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKK3JiX21vdmVfdGFpbChzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKKwkgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHRhaWwsCisJICAgICBzdHJ1Y3QgYnVmZmVyX3BhZ2UgKmNvbW1pdF9wYWdlLAorCSAgICAgc3RydWN0IGJ1ZmZlcl9wYWdlICp0YWlsX3BhZ2UsIHU2NCAqdHMpCit7CisJc3RydWN0IGJ1ZmZlcl9wYWdlICpuZXh0X3BhZ2UsICpoZWFkX3BhZ2UsICpyZWFkZXJfcGFnZTsKKwlzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciA9IGNwdV9idWZmZXItPmJ1ZmZlcjsKKwlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OworCWJvb2wgbG9ja190YWtlbiA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwluZXh0X3BhZ2UgPSB0YWlsX3BhZ2U7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyoKKwkgKiBTaW5jZSB0aGUgd3JpdGUgdG8gdGhlIGJ1ZmZlciBpcyBzdGlsbCBub3QKKwkgKiBmdWxseSBsb2NrbGVzcywgd2UgbXVzdCBiZSBjYXJlZnVsIHdpdGggTk1Jcy4KKwkgKiBUaGUgbG9ja3MgaW4gdGhlIHdyaXRlcnMgYXJlIHRha2VuIHdoZW4gYSB3cml0ZQorCSAqIGNyb3NzZXMgdG8gYSBuZXcgcGFnZS4gVGhlIGxvY2tzIHByb3RlY3QgYWdhaW5zdAorCSAqIHJhY2VzIHdpdGggdGhlIHJlYWRlcnMgKHRoaXMgd2lsbCBzb29uIGJlIGZpeGVkCisJICogd2l0aCBhIGxvY2tsZXNzIHNvbHV0aW9uKS4KKwkgKgorCSAqIEJlY2F1c2Ugd2UgY2FuIG5vdCBwcm90ZWN0IGFnYWluc3QgTk1JcywgYW5kIHdlCisJICogd2FudCB0byBrZWVwIHRyYWNlcyByZWVudHJhbnQsIHdlIG5lZWQgdG8gbWFuYWdlCisJICogd2hhdCBoYXBwZW5zIHdoZW4gd2UgYXJlIGluIGFuIE5NSS4KKwkgKgorCSAqIE5NSXMgY2FuIGhhcHBlbiBhZnRlciB3ZSB0YWtlIHRoZSBsb2NrLgorCSAqIElmIHdlIGFyZSBpbiBhbiBOTUksIG9ubHkgdGFrZSB0aGUgbG9jaworCSAqIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRha2VuLiBPdGhlcndpc2UKKwkgKiBzaW1wbHkgZmFpbC4KKwkgKi8KKwlpZiAodW5saWtlbHkoaW5fbm1pKCkpKSB7CisJCWlmICghX19yYXdfc3Bpbl90cnlsb2NrKCZjcHVfYnVmZmVyLT5sb2NrKSkgeworCQkJY3B1X2J1ZmZlci0+bm1pX2Ryb3BwZWQrKzsKKwkJCWdvdG8gb3V0X3Jlc2V0OworCQl9CisJfSBlbHNlCisJCV9fcmF3X3NwaW5fbG9jaygmY3B1X2J1ZmZlci0+bG9jayk7CisKKwlsb2NrX3Rha2VuID0gdHJ1ZTsKKworCXJiX2luY19wYWdlKGNwdV9idWZmZXIsICZuZXh0X3BhZ2UpOworCisJaGVhZF9wYWdlID0gY3B1X2J1ZmZlci0+aGVhZF9wYWdlOworCXJlYWRlcl9wYWdlID0gY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2U7CisKKwkvKiB3ZSBncmFiYmVkIHRoZSBsb2NrIGJlZm9yZSBpbmNyZW1lbnRpbmcgKi8KKwlpZiAoUkJfV0FSTl9PTihjcHVfYnVmZmVyLCBuZXh0X3BhZ2UgPT0gcmVhZGVyX3BhZ2UpKQorCQlnb3RvIG91dF9yZXNldDsKKworCS8qCisJICogSWYgZm9yIHNvbWUgcmVhc29uLCB3ZSBoYWQgYW4gaW50ZXJydXB0IHN0b3JtIHRoYXQgbWFkZQorCSAqIGl0IGFsbCB0aGUgd2F5IGFyb3VuZCB0aGUgYnVmZmVyLCBiYWlsLCBhbmQgd2FybgorCSAqIGFib3V0IGl0LgorCSAqLworCWlmICh1bmxpa2VseShuZXh0X3BhZ2UgPT0gY29tbWl0X3BhZ2UpKSB7CisJCWNwdV9idWZmZXItPmNvbW1pdF9vdmVycnVuKys7CisJCWdvdG8gb3V0X3Jlc2V0OworCX0KKworCWlmIChuZXh0X3BhZ2UgPT0gaGVhZF9wYWdlKSB7CisJCWlmICghKGJ1ZmZlci0+ZmxhZ3MgJiBSQl9GTF9PVkVSV1JJVEUpKQorCQkJZ290byBvdXRfcmVzZXQ7CisKKwkJLyogdGFpbF9wYWdlIGhhcyBub3QgbW92ZWQgeWV0PyAqLworCQlpZiAodGFpbF9wYWdlID09IGNwdV9idWZmZXItPnRhaWxfcGFnZSkgeworCQkJLyogY291bnQgb3ZlcmZsb3dzICovCisJCQljcHVfYnVmZmVyLT5vdmVycnVuICs9CisJCQkJbG9jYWxfcmVhZCgmaGVhZF9wYWdlLT5lbnRyaWVzKTsKKworCQkJcmJfaW5jX3BhZ2UoY3B1X2J1ZmZlciwgJmhlYWRfcGFnZSk7CisJCQljcHVfYnVmZmVyLT5oZWFkX3BhZ2UgPSBoZWFkX3BhZ2U7CisJCQljcHVfYnVmZmVyLT5oZWFkX3BhZ2UtPnJlYWQgPSAwOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB0aGUgdGFpbCBwYWdlIGlzIHN0aWxsIHRoZSBzYW1lIGFzIHdoYXQgd2UgdGhpbmsKKwkgKiBpdCBpcywgdGhlbiBpdCBpcyB1cCB0byB1cyB0byB1cGRhdGUgdGhlIHRhaWwKKwkgKiBwb2ludGVyLgorCSAqLworCWlmICh0YWlsX3BhZ2UgPT0gY3B1X2J1ZmZlci0+dGFpbF9wYWdlKSB7CisJCWxvY2FsX3NldCgmbmV4dF9wYWdlLT53cml0ZSwgMCk7CisJCWxvY2FsX3NldCgmbmV4dF9wYWdlLT5lbnRyaWVzLCAwKTsKKwkJbG9jYWxfc2V0KCZuZXh0X3BhZ2UtPnBhZ2UtPmNvbW1pdCwgMCk7CisJCWNwdV9idWZmZXItPnRhaWxfcGFnZSA9IG5leHRfcGFnZTsKKworCQkvKiByZXJlYWQgdGhlIHRpbWUgc3RhbXAgKi8KKwkJKnRzID0gcmJfdGltZV9zdGFtcChidWZmZXIsIGNwdV9idWZmZXItPmNwdSk7CisJCWNwdV9idWZmZXItPnRhaWxfcGFnZS0+cGFnZS0+dGltZV9zdGFtcCA9ICp0czsKKwl9CisKKwkvKgorCSAqIFRoZSBhY3R1YWwgdGFpbCBwYWdlIGhhcyBtb3ZlZCBmb3J3YXJkLgorCSAqLworCWlmICh0YWlsIDwgQlVGX1BBR0VfU0laRSkgeworCQkvKiBNYXJrIHRoZSByZXN0IG9mIHRoZSBwYWdlIHdpdGggcGFkZGluZyAqLworCQlldmVudCA9IF9fcmJfcGFnZV9pbmRleCh0YWlsX3BhZ2UsIHRhaWwpOworCQlyYl9ldmVudF9zZXRfcGFkZGluZyhldmVudCk7CisJfQorCisJLyogU2V0IHRoZSB3cml0ZSBiYWNrIHRvIHRoZSBwcmV2aW91cyBzZXR0aW5nICovCisJbG9jYWxfc3ViKGxlbmd0aCwgJnRhaWxfcGFnZS0+d3JpdGUpOworCisJLyoKKwkgKiBJZiB0aGlzIHdhcyBhIGNvbW1pdCBlbnRyeSB0aGF0IGZhaWxlZCwKKwkgKiBpbmNyZW1lbnQgdGhhdCB0b28KKwkgKi8KKwlpZiAodGFpbF9wYWdlID09IGNwdV9idWZmZXItPmNvbW1pdF9wYWdlICYmCisJICAgIHRhaWwgPT0gcmJfY29tbWl0X2luZGV4KGNwdV9idWZmZXIpKSB7CisJCXJiX3NldF9jb21taXRfdG9fd3JpdGUoY3B1X2J1ZmZlcik7CisJfQorCisJX19yYXdfc3Bpbl91bmxvY2soJmNwdV9idWZmZXItPmxvY2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qIGZhaWwgYW5kIGxldCB0aGUgY2FsbGVyIHRyeSBhZ2FpbiAqLworCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCisgb3V0X3Jlc2V0OgorCS8qIHJlc2V0IHdyaXRlICovCisJbG9jYWxfc3ViKGxlbmd0aCwgJnRhaWxfcGFnZS0+d3JpdGUpOworCisJaWYgKGxpa2VseShsb2NrX3Rha2VuKSkKKwkJX19yYXdfc3Bpbl91bmxvY2soJmNwdV9idWZmZXItPmxvY2spOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqCiBfX3JiX3Jlc2VydmVfbmV4dChzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKIAkJICB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBsb25nIGxlbmd0aCwgdTY0ICp0cykKIHsKLQlzdHJ1Y3QgYnVmZmVyX3BhZ2UgKnRhaWxfcGFnZSwgKmhlYWRfcGFnZSwgKnJlYWRlcl9wYWdlLCAqY29tbWl0X3BhZ2U7Ci0JdW5zaWduZWQgbG9uZyB0YWlsLCB3cml0ZTsKLQlzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciA9IGNwdV9idWZmZXItPmJ1ZmZlcjsKKwlzdHJ1Y3QgYnVmZmVyX3BhZ2UgKnRhaWxfcGFnZSwgKmNvbW1pdF9wYWdlOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlib29sIGxvY2tfdGFrZW4gPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIHRhaWwsIHdyaXRlOwogCiAJY29tbWl0X3BhZ2UgPSBjcHVfYnVmZmVyLT5jb21taXRfcGFnZTsKIAkvKiB3ZSBqdXN0IG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGludGVycnVwdHMgKi8KQEAgLTExNzQsMTEyICsxMzE3LDkgQEAKIAl0YWlsID0gd3JpdGUgLSBsZW5ndGg7CiAKIAkvKiBTZWUgaWYgd2Ugc2hvdCBwYXNzIHRoZSBlbmQgb2YgdGhpcyBidWZmZXIgcGFnZSAqLwotCWlmICh3cml0ZSA+IEJVRl9QQUdFX1NJWkUpIHsKLQkJc3RydWN0IGJ1ZmZlcl9wYWdlICpuZXh0X3BhZ2UgPSB0YWlsX3BhZ2U7Ci0KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQkvKgotCQkgKiBTaW5jZSB0aGUgd3JpdGUgdG8gdGhlIGJ1ZmZlciBpcyBzdGlsbCBub3QKLQkJICogZnVsbHkgbG9ja2xlc3MsIHdlIG11c3QgYmUgY2FyZWZ1bCB3aXRoIE5NSXMuCi0JCSAqIFRoZSBsb2NrcyBpbiB0aGUgd3JpdGVycyBhcmUgdGFrZW4gd2hlbiBhIHdyaXRlCi0JCSAqIGNyb3NzZXMgdG8gYSBuZXcgcGFnZS4gVGhlIGxvY2tzIHByb3RlY3QgYWdhaW5zdAotCQkgKiByYWNlcyB3aXRoIHRoZSByZWFkZXJzICh0aGlzIHdpbGwgc29vbiBiZSBmaXhlZAotCQkgKiB3aXRoIGEgbG9ja2xlc3Mgc29sdXRpb24pLgotCQkgKgotCQkgKiBCZWNhdXNlIHdlIGNhbiBub3QgcHJvdGVjdCBhZ2FpbnN0IE5NSXMsIGFuZCB3ZQotCQkgKiB3YW50IHRvIGtlZXAgdHJhY2VzIHJlZW50cmFudCwgd2UgbmVlZCB0byBtYW5hZ2UKLQkJICogd2hhdCBoYXBwZW5zIHdoZW4gd2UgYXJlIGluIGFuIE5NSS4KLQkJICoKLQkJICogTk1JcyBjYW4gaGFwcGVuIGFmdGVyIHdlIHRha2UgdGhlIGxvY2suCi0JCSAqIElmIHdlIGFyZSBpbiBhbiBOTUksIG9ubHkgdGFrZSB0aGUgbG9jawotCQkgKiBpZiBpdCBpcyBub3QgYWxyZWFkeSB0YWtlbi4gT3RoZXJ3aXNlCi0JCSAqIHNpbXBseSBmYWlsLgotCQkgKi8KLQkJaWYgKHVubGlrZWx5KGluX25taSgpKSkgewotCQkJaWYgKCFfX3Jhd19zcGluX3RyeWxvY2soJmNwdV9idWZmZXItPmxvY2spKQotCQkJCWdvdG8gb3V0X3Jlc2V0OwotCQl9IGVsc2UKLQkJCV9fcmF3X3NwaW5fbG9jaygmY3B1X2J1ZmZlci0+bG9jayk7Ci0KLQkJbG9ja190YWtlbiA9IHRydWU7Ci0KLQkJcmJfaW5jX3BhZ2UoY3B1X2J1ZmZlciwgJm5leHRfcGFnZSk7Ci0KLQkJaGVhZF9wYWdlID0gY3B1X2J1ZmZlci0+aGVhZF9wYWdlOwotCQlyZWFkZXJfcGFnZSA9IGNwdV9idWZmZXItPnJlYWRlcl9wYWdlOwotCi0JCS8qIHdlIGdyYWJiZWQgdGhlIGxvY2sgYmVmb3JlIGluY3JlbWVudGluZyAqLwotCQlpZiAoUkJfV0FSTl9PTihjcHVfYnVmZmVyLCBuZXh0X3BhZ2UgPT0gcmVhZGVyX3BhZ2UpKQotCQkJZ290byBvdXRfcmVzZXQ7Ci0KLQkJLyoKLQkJICogSWYgZm9yIHNvbWUgcmVhc29uLCB3ZSBoYWQgYW4gaW50ZXJydXB0IHN0b3JtIHRoYXQgbWFkZQotCQkgKiBpdCBhbGwgdGhlIHdheSBhcm91bmQgdGhlIGJ1ZmZlciwgYmFpbCwgYW5kIHdhcm4KLQkJICogYWJvdXQgaXQuCi0JCSAqLwotCQlpZiAodW5saWtlbHkobmV4dF9wYWdlID09IGNvbW1pdF9wYWdlKSkgewotCQkJV0FSTl9PTl9PTkNFKDEpOwotCQkJZ290byBvdXRfcmVzZXQ7Ci0JCX0KLQotCQlpZiAobmV4dF9wYWdlID09IGhlYWRfcGFnZSkgewotCQkJaWYgKCEoYnVmZmVyLT5mbGFncyAmIFJCX0ZMX09WRVJXUklURSkpCi0JCQkJZ290byBvdXRfcmVzZXQ7Ci0KLQkJCS8qIHRhaWxfcGFnZSBoYXMgbm90IG1vdmVkIHlldD8gKi8KLQkJCWlmICh0YWlsX3BhZ2UgPT0gY3B1X2J1ZmZlci0+dGFpbF9wYWdlKSB7Ci0JCQkJLyogY291bnQgb3ZlcmZsb3dzICovCi0JCQkJcmJfdXBkYXRlX292ZXJmbG93KGNwdV9idWZmZXIpOwotCi0JCQkJcmJfaW5jX3BhZ2UoY3B1X2J1ZmZlciwgJmhlYWRfcGFnZSk7Ci0JCQkJY3B1X2J1ZmZlci0+aGVhZF9wYWdlID0gaGVhZF9wYWdlOwotCQkJCWNwdV9idWZmZXItPmhlYWRfcGFnZS0+cmVhZCA9IDA7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB0aGUgdGFpbCBwYWdlIGlzIHN0aWxsIHRoZSBzYW1lIGFzIHdoYXQgd2UgdGhpbmsKLQkJICogaXQgaXMsIHRoZW4gaXQgaXMgdXAgdG8gdXMgdG8gdXBkYXRlIHRoZSB0YWlsCi0JCSAqIHBvaW50ZXIuCi0JCSAqLwotCQlpZiAodGFpbF9wYWdlID09IGNwdV9idWZmZXItPnRhaWxfcGFnZSkgewotCQkJbG9jYWxfc2V0KCZuZXh0X3BhZ2UtPndyaXRlLCAwKTsKLQkJCWxvY2FsX3NldCgmbmV4dF9wYWdlLT5wYWdlLT5jb21taXQsIDApOwotCQkJY3B1X2J1ZmZlci0+dGFpbF9wYWdlID0gbmV4dF9wYWdlOwotCi0JCQkvKiByZXJlYWQgdGhlIHRpbWUgc3RhbXAgKi8KLQkJCSp0cyA9IHJpbmdfYnVmZmVyX3RpbWVfc3RhbXAoYnVmZmVyLCBjcHVfYnVmZmVyLT5jcHUpOwotCQkJY3B1X2J1ZmZlci0+dGFpbF9wYWdlLT5wYWdlLT50aW1lX3N0YW1wID0gKnRzOwotCQl9Ci0KLQkJLyoKLQkJICogVGhlIGFjdHVhbCB0YWlsIHBhZ2UgaGFzIG1vdmVkIGZvcndhcmQuCi0JCSAqLwotCQlpZiAodGFpbCA8IEJVRl9QQUdFX1NJWkUpIHsKLQkJCS8qIE1hcmsgdGhlIHJlc3Qgb2YgdGhlIHBhZ2Ugd2l0aCBwYWRkaW5nICovCi0JCQlldmVudCA9IF9fcmJfcGFnZV9pbmRleCh0YWlsX3BhZ2UsIHRhaWwpOwotCQkJcmJfZXZlbnRfc2V0X3BhZGRpbmcoZXZlbnQpOwotCQl9Ci0KLQkJaWYgKHRhaWwgPD0gQlVGX1BBR0VfU0laRSkKLQkJCS8qIFNldCB0aGUgd3JpdGUgYmFjayB0byB0aGUgcHJldmlvdXMgc2V0dGluZyAqLwotCQkJbG9jYWxfc2V0KCZ0YWlsX3BhZ2UtPndyaXRlLCB0YWlsKTsKLQotCQkvKgotCQkgKiBJZiB0aGlzIHdhcyBhIGNvbW1pdCBlbnRyeSB0aGF0IGZhaWxlZCwKLQkJICogaW5jcmVtZW50IHRoYXQgdG9vCi0JCSAqLwotCQlpZiAodGFpbF9wYWdlID09IGNwdV9idWZmZXItPmNvbW1pdF9wYWdlICYmCi0JCSAgICB0YWlsID09IHJiX2NvbW1pdF9pbmRleChjcHVfYnVmZmVyKSkgewotCQkJcmJfc2V0X2NvbW1pdF90b193cml0ZShjcHVfYnVmZmVyKTsKLQkJfQotCi0JCV9fcmF3X3NwaW5fdW5sb2NrKCZjcHVfYnVmZmVyLT5sb2NrKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JCS8qIGZhaWwgYW5kIGxldCB0aGUgY2FsbGVyIHRyeSBhZ2FpbiAqLwotCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKLQl9CisJaWYgKHdyaXRlID4gQlVGX1BBR0VfU0laRSkKKwkJcmV0dXJuIHJiX21vdmVfdGFpbChjcHVfYnVmZmVyLCBsZW5ndGgsIHRhaWwsCisJCQkJICAgIGNvbW1pdF9wYWdlLCB0YWlsX3BhZ2UsIHRzKTsKIAogCS8qIFdlIHJlc2VydmVkIHNvbWV0aGluZyBvbiB0aGUgYnVmZmVyICovCiAKQEAgLTEyODksNiArMTMyOSwxMCBAQAogCWV2ZW50ID0gX19yYl9wYWdlX2luZGV4KHRhaWxfcGFnZSwgdGFpbCk7CiAJcmJfdXBkYXRlX2V2ZW50KGV2ZW50LCB0eXBlLCBsZW5ndGgpOwogCisJLyogVGhlIHBhc3NlZCBpbiB0eXBlIGlzIHplcm8gZm9yIERBVEEgKi8KKwlpZiAobGlrZWx5KCF0eXBlKSkKKwkJbG9jYWxfaW5jKCZ0YWlsX3BhZ2UtPmVudHJpZXMpOworCiAJLyoKIAkgKiBJZiB0aGlzIGlzIGEgY29tbWl0IGFuZCB0aGUgdGFpbCBpcyB6ZXJvLCB0aGVuIHVwZGF0ZQogCSAqIHRoaXMgcGFnZSdzIHRpbWUgc3RhbXAuCkBAIC0xMjk3LDE2ICsxMzQxLDM4IEBACiAJCWNwdV9idWZmZXItPmNvbW1pdF9wYWdlLT5wYWdlLT50aW1lX3N0YW1wID0gKnRzOwogCiAJcmV0dXJuIGV2ZW50OworfQogCi0gb3V0X3Jlc2V0OgotCS8qIHJlc2V0IHdyaXRlICovCi0JaWYgKHRhaWwgPD0gQlVGX1BBR0VfU0laRSkKLQkJbG9jYWxfc2V0KCZ0YWlsX3BhZ2UtPndyaXRlLCB0YWlsKTsKK3N0YXRpYyBpbmxpbmUgaW50CityYl90cnlfdG9fZGlzY2FyZChzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKKwkJICBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQoreworCXVuc2lnbmVkIGxvbmcgbmV3X2luZGV4LCBvbGRfaW5kZXg7CisJc3RydWN0IGJ1ZmZlcl9wYWdlICpicGFnZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAotCWlmIChsaWtlbHkobG9ja190YWtlbikpCi0JCV9fcmF3X3NwaW5fdW5sb2NrKCZjcHVfYnVmZmVyLT5sb2NrKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuIE5VTEw7CisJbmV3X2luZGV4ID0gcmJfZXZlbnRfaW5kZXgoZXZlbnQpOworCW9sZF9pbmRleCA9IG5ld19pbmRleCArIHJiX2V2ZW50X2xlbmd0aChldmVudCk7CisJYWRkciA9ICh1bnNpZ25lZCBsb25nKWV2ZW50OworCWFkZHIgJj0gUEFHRV9NQVNLOworCisJYnBhZ2UgPSBjcHVfYnVmZmVyLT50YWlsX3BhZ2U7CisKKwlpZiAoYnBhZ2UtPnBhZ2UgPT0gKHZvaWQgKilhZGRyICYmIHJiX3BhZ2Vfd3JpdGUoYnBhZ2UpID09IG9sZF9pbmRleCkgeworCQkvKgorCQkgKiBUaGlzIGlzIG9uIHRoZSB0YWlsIHBhZ2UuIEl0IGlzIHBvc3NpYmxlIHRoYXQKKwkJICogYSB3cml0ZSBjb3VsZCBjb21lIGluIGFuZCBtb3ZlIHRoZSB0YWlsIHBhZ2UKKwkJICogYW5kIHdyaXRlIHRvIHRoZSBuZXh0IHBhZ2UuIFRoYXQgaXMgZmluZQorCQkgKiBiZWNhdXNlIHdlIGp1c3Qgc2hvcnRlbiB3aGF0IGlzIG9uIHRoaXMgcGFnZS4KKwkJICovCisJCWluZGV4ID0gbG9jYWxfY21weGNoZygmYnBhZ2UtPndyaXRlLCBvbGRfaW5kZXgsIG5ld19pbmRleCk7CisJCWlmIChpbmRleCA9PSBvbGRfaW5kZXgpCisJCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBjb3VsZCBub3QgZGlzY2FyZCAqLworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CkBAIC0xMzUxLDE2ICsxNDE3LDIzIEBACiAJCQlldmVudC0+YXJyYXlbMF0gPSAqZGVsdGEgPj4gVFNfU0hJRlQ7CiAJCX0gZWxzZSB7CiAJCQljcHVfYnVmZmVyLT5jb21taXRfcGFnZS0+cGFnZS0+dGltZV9zdGFtcCA9ICp0czsKLQkJCWV2ZW50LT50aW1lX2RlbHRhID0gMDsKLQkJCWV2ZW50LT5hcnJheVswXSA9IDA7CisJCQkvKiB0cnkgdG8gZGlzY2FyZCwgc2luY2Ugd2UgZG8gbm90IG5lZWQgdGhpcyAqLworCQkJaWYgKCFyYl90cnlfdG9fZGlzY2FyZChjcHVfYnVmZmVyLCBldmVudCkpIHsKKwkJCQkvKiBub3BlLCBqdXN0IHplcm8gaXQgKi8KKwkJCQlldmVudC0+dGltZV9kZWx0YSA9IDA7CisJCQkJZXZlbnQtPmFycmF5WzBdID0gMDsKKwkJCX0KIAkJfQogCQljcHVfYnVmZmVyLT53cml0ZV9zdGFtcCA9ICp0czsKIAkJLyogbGV0IHRoZSBjYWxsZXIga25vdyB0aGlzIHdhcyB0aGUgY29tbWl0ICovCiAJCXJldCA9IDE7CiAJfSBlbHNlIHsKLQkJLyogRGFybiwgdGhpcyBpcyBqdXN0IHdhc3RlZCBzcGFjZSAqLwotCQlldmVudC0+dGltZV9kZWx0YSA9IDA7Ci0JCWV2ZW50LT5hcnJheVswXSA9IDA7CisJCS8qIFRyeSB0byBkaXNjYXJkIHRoZSBldmVudCAqLworCQlpZiAoIXJiX3RyeV90b19kaXNjYXJkKGNwdV9idWZmZXIsIGV2ZW50KSkgeworCQkJLyogRGFybiwgdGhpcyBpcyBqdXN0IHdhc3RlZCBzcGFjZSAqLworCQkJZXZlbnQtPnRpbWVfZGVsdGEgPSAwOworCQkJZXZlbnQtPmFycmF5WzBdID0gMDsKKwkJfQogCQlyZXQgPSAwOwogCX0KIApAQCAtMTM3MSwxMyArMTQ0NCwxNCBAQAogCiBzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKIHJiX3Jlc2VydmVfbmV4dF9ldmVudChzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKLQkJICAgICAgdW5zaWduZWQgdHlwZSwgdW5zaWduZWQgbG9uZyBsZW5ndGgpCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQogewogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7Ci0JdTY0IHRzLCBkZWx0YTsKKwl1NjQgdHMsIGRlbHRhID0gMDsKIAlpbnQgY29tbWl0ID0gMDsKIAlpbnQgbnJfbG9vcHMgPSAwOwogCisJbGVuZ3RoID0gcmJfY2FsY3VsYXRlX2V2ZW50X2xlbmd0aChsZW5ndGgpOwogIGFnYWluOgogCS8qCiAJICogV2UgYWxsb3cgZm9yIGludGVycnVwdHMgdG8gcmVlbnRlciBoZXJlIGFuZCBkbyBhIHRyYWNlLgpAQCAtMTM5MSw3ICsxNDY1LDcgQEAKIAlpZiAoUkJfV0FSTl9PTihjcHVfYnVmZmVyLCArK25yX2xvb3BzID4gMTAwMCkpCiAJCXJldHVybiBOVUxMOwogCi0JdHMgPSByaW5nX2J1ZmZlcl90aW1lX3N0YW1wKGNwdV9idWZmZXItPmJ1ZmZlciwgY3B1X2J1ZmZlci0+Y3B1KTsKKwl0cyA9IHJiX3RpbWVfc3RhbXAoY3B1X2J1ZmZlci0+YnVmZmVyLCBjcHVfYnVmZmVyLT5jcHUpOwogCiAJLyoKIAkgKiBPbmx5IHRoZSBmaXJzdCBjb21taXQgY2FuIHVwZGF0ZSB0aGUgdGltZXN0YW1wLgpAQCAtMTQwMSwyMyArMTQ3NSwyNCBAQAogCSAqIGFsc28gYmUgbWFkZS4gQnV0IG9ubHkgdGhlIGVudHJ5IHRoYXQgZGlkIHRoZSBhY3R1YWwKIAkgKiBjb21taXQgd2lsbCBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiB6ZXJvLgogCSAqLwotCWlmIChjcHVfYnVmZmVyLT50YWlsX3BhZ2UgPT0gY3B1X2J1ZmZlci0+Y29tbWl0X3BhZ2UgJiYKLQkgICAgcmJfcGFnZV93cml0ZShjcHVfYnVmZmVyLT50YWlsX3BhZ2UpID09Ci0JICAgIHJiX2NvbW1pdF9pbmRleChjcHVfYnVmZmVyKSkgeworCWlmIChsaWtlbHkoY3B1X2J1ZmZlci0+dGFpbF9wYWdlID09IGNwdV9idWZmZXItPmNvbW1pdF9wYWdlICYmCisJCSAgIHJiX3BhZ2Vfd3JpdGUoY3B1X2J1ZmZlci0+dGFpbF9wYWdlKSA9PQorCQkgICByYl9jb21taXRfaW5kZXgoY3B1X2J1ZmZlcikpKSB7CisJCXU2NCBkaWZmOwogCi0JCWRlbHRhID0gdHMgLSBjcHVfYnVmZmVyLT53cml0ZV9zdGFtcDsKKwkJZGlmZiA9IHRzIC0gY3B1X2J1ZmZlci0+d3JpdGVfc3RhbXA7CiAKLQkJLyogbWFrZSBzdXJlIHRoaXMgZGVsdGEgaXMgY2FsY3VsYXRlZCBoZXJlICovCisJCS8qIG1ha2Ugc3VyZSB0aGlzIGRpZmYgaXMgY2FsY3VsYXRlZCBoZXJlICovCiAJCWJhcnJpZXIoKTsKIAogCQkvKiBEaWQgdGhlIHdyaXRlIHN0YW1wIGdldCB1cGRhdGVkIGFscmVhZHk/ICovCiAJCWlmICh1bmxpa2VseSh0cyA8IGNwdV9idWZmZXItPndyaXRlX3N0YW1wKSkKLQkJCWRlbHRhID0gMDsKKwkJCWdvdG8gZ2V0X2V2ZW50OwogCi0JCWlmICh0ZXN0X3RpbWVfc3RhbXAoZGVsdGEpKSB7CisJCWRlbHRhID0gZGlmZjsKKwkJaWYgKHVubGlrZWx5KHRlc3RfdGltZV9zdGFtcChkZWx0YSkpKSB7CiAKIAkJCWNvbW1pdCA9IHJiX2FkZF90aW1lX3N0YW1wKGNwdV9idWZmZXIsICZ0cywgJmRlbHRhKTsKLQogCQkJaWYgKGNvbW1pdCA9PSAtRUJVU1kpCiAJCQkJcmV0dXJuIE5VTEw7CiAKQEAgLTE0MjYsMTIgKzE1MDEsMTEgQEAKIAogCQkJUkJfV0FSTl9PTihjcHVfYnVmZmVyLCBjb21taXQgPCAwKTsKIAkJfQotCX0gZWxzZQotCQkvKiBOb24gY29tbWl0cyBoYXZlIHplcm8gZGVsdGFzICovCi0JCWRlbHRhID0gMDsKKwl9CiAKLQlldmVudCA9IF9fcmJfcmVzZXJ2ZV9uZXh0KGNwdV9idWZmZXIsIHR5cGUsIGxlbmd0aCwgJnRzKTsKLQlpZiAoUFRSX0VSUihldmVudCkgPT0gLUVBR0FJTikKKyBnZXRfZXZlbnQ6CisJZXZlbnQgPSBfX3JiX3Jlc2VydmVfbmV4dChjcHVfYnVmZmVyLCAwLCBsZW5ndGgsICZ0cyk7CisJaWYgKHVubGlrZWx5KFBUUl9FUlIoZXZlbnQpID09IC1FQUdBSU4pKQogCQlnb3RvIGFnYWluOwogCiAJaWYgKCFldmVudCkgewpAQCAtMTQ0OCw3ICsxNTIyLDcgQEAKIAkgKiBJZiB0aGUgdGltZXN0YW1wIHdhcyBjb21taXRlZCwgbWFrZSB0aGUgY29tbWl0IG91ciBlbnRyeQogCSAqIG5vdyBzbyB0aGF0IHdlIHdpbGwgdXBkYXRlIGl0IHdoZW4gbmVlZGVkLgogCSAqLwotCWlmIChjb21taXQpCisJaWYgKHVubGlrZWx5KGNvbW1pdCkpCiAJCXJiX3NldF9jb21taXRfZXZlbnQoY3B1X2J1ZmZlciwgZXZlbnQpOwogCWVsc2UgaWYgKCFyYl9pc19jb21taXQoY3B1X2J1ZmZlciwgZXZlbnQpKQogCQlkZWx0YSA9IDA7CkBAIC0xNDU4LDYgKzE1MzIsMzYgQEAKIAlyZXR1cm4gZXZlbnQ7CiB9CiAKKyNkZWZpbmUgVFJBQ0VfUkVDVVJTSVZFX0RFUFRIIDE2CisKK3N0YXRpYyBpbnQgdHJhY2VfcmVjdXJzaXZlX2xvY2sodm9pZCkKK3sKKwljdXJyZW50LT50cmFjZV9yZWN1cnNpb24rKzsKKworCWlmIChsaWtlbHkoY3VycmVudC0+dHJhY2VfcmVjdXJzaW9uIDwgVFJBQ0VfUkVDVVJTSVZFX0RFUFRIKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBEaXNhYmxlIGFsbCB0cmFjaW5nIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyBlbHNlICovCisJdHJhY2luZ19vZmZfcGVybWFuZW50KCk7CisKKwlwcmludGtfb25jZShLRVJOX1dBUk5JTkcgIlRyYWNpbmcgcmVjdXJzaW9uOiBkZXB0aFslbGRdOiIKKwkJICAgICJIQ1slbHVdOlNDWyVsdV06Tk1JWyVsdV1cbiIsCisJCSAgICBjdXJyZW50LT50cmFjZV9yZWN1cnNpb24sCisJCSAgICBoYXJkaXJxX2NvdW50KCkgPj4gSEFSRElSUV9TSElGVCwKKwkJICAgIHNvZnRpcnFfY291bnQoKSA+PiBTT0ZUSVJRX1NISUZULAorCQkgICAgaW5fbm1pKCkpOworCisJV0FSTl9PTl9PTkNFKDEpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgdHJhY2VfcmVjdXJzaXZlX3VubG9jayh2b2lkKQoreworCVdBUk5fT05fT05DRSghY3VycmVudC0+dHJhY2VfcmVjdXJzaW9uKTsKKworCWN1cnJlbnQtPnRyYWNlX3JlY3Vyc2lvbi0tOworfQorCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCByYl9uZWVkX3Jlc2NoZWQpOwogCiAvKioKQEAgLTE0OTEsNiArMTU5NSw5IEBACiAJLyogSWYgd2UgYXJlIHRyYWNpbmcgc2NoZWR1bGUsIHdlIGRvbid0IHdhbnQgdG8gcmVjdXJzZSAqLwogCXJlc2NoZWQgPSBmdHJhY2VfcHJlZW1wdF9kaXNhYmxlKCk7CiAKKwlpZiAodHJhY2VfcmVjdXJzaXZlX2xvY2soKSkKKwkJZ290byBvdXRfbm9jaGVjazsKKwogCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBidWZmZXItPmNwdW1hc2spKQpAQCAtMTUwMSwxMSArMTYwOCwxMCBAQAogCWlmIChhdG9taWNfcmVhZCgmY3B1X2J1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKSkKIAkJZ290byBvdXQ7CiAKLQlsZW5ndGggPSByYl9jYWxjdWxhdGVfZXZlbnRfbGVuZ3RoKGxlbmd0aCk7Ci0JaWYgKGxlbmd0aCA+IEJVRl9QQUdFX1NJWkUpCisJaWYgKGxlbmd0aCA+IEJVRl9NQVhfREFUQV9TSVpFKQogCQlnb3RvIG91dDsKIAotCWV2ZW50ID0gcmJfcmVzZXJ2ZV9uZXh0X2V2ZW50KGNwdV9idWZmZXIsIFJJTkdCVUZfVFlQRV9EQVRBLCBsZW5ndGgpOworCWV2ZW50ID0gcmJfcmVzZXJ2ZV9uZXh0X2V2ZW50KGNwdV9idWZmZXIsIGxlbmd0aCk7CiAJaWYgKCFldmVudCkKIAkJZ290byBvdXQ7CiAKQEAgLTE1MjAsNiArMTYyNiw5IEBACiAJcmV0dXJuIGV2ZW50OwogCiAgb3V0OgorCXRyYWNlX3JlY3Vyc2l2ZV91bmxvY2soKTsKKworIG91dF9ub2NoZWNrOgogCWZ0cmFjZV9wcmVlbXB0X2VuYWJsZShyZXNjaGVkKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE1MjgsNyArMTYzNyw3IEBACiBzdGF0aWMgdm9pZCByYl9jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsCiAJCSAgICAgIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7Ci0JY3B1X2J1ZmZlci0+ZW50cmllcysrOworCWxvY2FsX2luYygmY3B1X2J1ZmZlci0+ZW50cmllcyk7CiAKIAkvKiBPbmx5IHByb2Nlc3MgZnVydGhlciBpZiB3ZSBvd24gdGhlIGNvbW1pdCAqLwogCWlmICghcmJfaXNfY29tbWl0KGNwdV9idWZmZXIsIGV2ZW50KSkKQEAgLTE1NTgsNiArMTY2Nyw4IEBACiAKIAlyYl9jb21taXQoY3B1X2J1ZmZlciwgZXZlbnQpOwogCisJdHJhY2VfcmVjdXJzaXZlX3VubG9jaygpOworCiAJLyoKIAkgKiBPbmx5IHRoZSBsYXN0IHByZWVtcHQgY291bnQgbmVlZHMgdG8gcmVzdG9yZSBwcmVlbXB0aW9uLgogCSAqLwpAQCAtMTU3MCw2ICsxNjgxLDk5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KTsKIAorc3RhdGljIGlubGluZSB2b2lkIHJiX2V2ZW50X2Rpc2NhcmQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKK3sKKwkvKiBhcnJheVswXSBob2xkcyB0aGUgYWN0dWFsIGxlbmd0aCBmb3IgdGhlIGRpc2NhcmRlZCBldmVudCAqLworCWV2ZW50LT5hcnJheVswXSA9IHJiX2V2ZW50X2RhdGFfbGVuZ3RoKGV2ZW50KSAtIFJCX0VWTlRfSERSX1NJWkU7CisJZXZlbnQtPnR5cGVfbGVuID0gUklOR0JVRl9UWVBFX1BBRERJTkc7CisJLyogdGltZSBkZWx0YSBtdXN0IGJlIG5vbiB6ZXJvICovCisJaWYgKCFldmVudC0+dGltZV9kZWx0YSkKKwkJZXZlbnQtPnRpbWVfZGVsdGEgPSAxOworfQorCisvKioKKyAqIHJpbmdfYnVmZmVyX2V2ZW50X2Rpc2NhcmQgLSBkaXNjYXJkIGFueSBldmVudCBpbiB0aGUgcmluZyBidWZmZXIKKyAqIEBldmVudDogdGhlIGV2ZW50IHRvIGRpc2NhcmQKKyAqCisgKiBTb21ldGltZXMgYSBldmVudCB0aGF0IGlzIGluIHRoZSByaW5nIGJ1ZmZlciBuZWVkcyB0byBiZSBpZ25vcmVkLgorICogVGhpcyBmdW5jdGlvbiBsZXRzIHRoZSB1c2VyIGRpc2NhcmQgYW4gZXZlbnQgaW4gdGhlIHJpbmcgYnVmZmVyCisgKiBhbmQgdGhlbiB0aGF0IGV2ZW50IHdpbGwgbm90IGJlIHJlYWQgbGF0ZXIuCisgKgorICogTm90ZSwgaXQgaXMgdXAgdG8gdGhlIHVzZXIgdG8gYmUgY2FyZWZ1bCB3aXRoIHRoaXMsIGFuZCBwcm90ZWN0CisgKiBhZ2FpbnN0IHJhY2VzLiBJZiB0aGUgdXNlciBkaXNjYXJkcyBhbiBldmVudCB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkCisgKiBpdCBpcyBwb3NzaWJsZSB0aGF0IGl0IGNvdWxkIGNvcnJ1cHQgdGhlIHJpbmcgYnVmZmVyLgorICovCit2b2lkIHJpbmdfYnVmZmVyX2V2ZW50X2Rpc2NhcmQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKK3sKKwlyYl9ldmVudF9kaXNjYXJkKGV2ZW50KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2V2ZW50X2Rpc2NhcmQpOworCisvKioKKyAqIHJpbmdfYnVmZmVyX2NvbW1pdF9kaXNjYXJkIC0gZGlzY2FyZCBhbiBldmVudCB0aGF0IGhhcyBub3QgYmVlbiBjb21taXR0ZWQKKyAqIEBidWZmZXI6IHRoZSByaW5nIGJ1ZmZlcgorICogQGV2ZW50OiBub24gY29tbWl0dGVkIGV2ZW50IHRvIGRpc2NhcmQKKyAqCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gcmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZCBidXQgbXVzdCBvbmx5IGJlCisgKiBwZXJmb3JtZWQgb24gYW4gZXZlbnQgdGhhdCBoYXMgbm90IGJlZW4gY29tbWl0dGVkIHlldC4gVGhlIGRpZmZlcmVuY2UKKyAqIGlzIHRoYXQgdGhpcyB3aWxsIGFsc28gdHJ5IHRvIGZyZWUgdGhlIGV2ZW50IGZyb20gdGhlIHJpbmcgYnVmZmVyCisgKiBpZiBhbm90aGVyIGV2ZW50IGhhcyBub3QgYmVlbiBhZGRlZCBiZWhpbmQgaXQuCisgKgorICogSWYgYW5vdGhlciBldmVudCBoYXMgYmVlbiBhZGRlZCBiZWhpbmQgaXQsIGl0IHdpbGwgc2V0IHRoZSBldmVudAorICogdXAgYXMgZGlzY2FyZGVkLCBhbmQgcGVyZm9ybSB0aGUgY29tbWl0LgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBkbyBub3QgY2FsbCByaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0IG9uCisgKiB0aGUgZXZlbnQuCisgKi8KK3ZvaWQgcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsCisJCQkJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlcjsKKwlpbnQgY3B1OworCisJLyogVGhlIGV2ZW50IGlzIGRpc2NhcmRlZCByZWdhcmRsZXNzICovCisJcmJfZXZlbnRfZGlzY2FyZChldmVudCk7CisKKwkvKgorCSAqIFRoaXMgbXVzdCBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgZXZlbnQgaGFzIG5vdCBiZWVuCisJICogY29tbWl0dGVkIHlldC4gVGh1cyB3ZSBjYW4gYXNzdW1lIHRoYXQgcHJlZW1wdGlvbgorCSAqIGlzIHN0aWxsIGRpc2FibGVkLgorCSAqLworCVJCX1dBUk5fT04oYnVmZmVyLCBwcmVlbXB0aWJsZSgpKTsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwljcHVfYnVmZmVyID0gYnVmZmVyLT5idWZmZXJzW2NwdV07CisKKwlpZiAoIXJiX3RyeV90b19kaXNjYXJkKGNwdV9idWZmZXIsIGV2ZW50KSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFRoZSBjb21taXQgaXMgc3RpbGwgdmlzaWJsZSBieSB0aGUgcmVhZGVyLCBzbyB3ZQorCSAqIG11c3QgaW5jcmVtZW50IGVudHJpZXMuCisJICovCisJbG9jYWxfaW5jKCZjcHVfYnVmZmVyLT5lbnRyaWVzKTsKKyBvdXQ6CisJLyoKKwkgKiBJZiBhIHdyaXRlIGNhbWUgaW4gYW5kIHB1c2hlZCB0aGUgdGFpbCBwYWdlCisJICogd2Ugc3RpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGNvbW1pdCBwb2ludGVyCisJICogaWYgd2Ugd2VyZSB0aGUgY29tbWl0LgorCSAqLworCWlmIChyYl9pc19jb21taXQoY3B1X2J1ZmZlciwgZXZlbnQpKQorCQlyYl9zZXRfY29tbWl0X3RvX3dyaXRlKGNwdV9idWZmZXIpOworCisJdHJhY2VfcmVjdXJzaXZlX3VubG9jaygpOworCisJLyoKKwkgKiBPbmx5IHRoZSBsYXN0IHByZWVtcHQgY291bnQgbmVlZHMgdG8gcmVzdG9yZSBwcmVlbXB0aW9uLgorCSAqLworCWlmIChwcmVlbXB0X2NvdW50KCkgPT0gMSkKKwkJZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHBlcl9jcHUocmJfbmVlZF9yZXNjaGVkLCBjcHUpKTsKKwllbHNlCisJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWRfbm90cmFjZSgpOworCit9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9kaXNjYXJkX2NvbW1pdCk7CisKIC8qKgogICogcmluZ19idWZmZXJfd3JpdGUgLSB3cml0ZSBkYXRhIHRvIHRoZSBidWZmZXIgd2l0aG91dCByZXNlcnZpbmcKICAqIEBidWZmZXI6IFRoZSByaW5nIGJ1ZmZlciB0byB3cml0ZSB0by4KQEAgLTE1ODksNyArMTc5Myw2IEBACiB7CiAJc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXI7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKLQl1bnNpZ25lZCBsb25nIGV2ZW50X2xlbmd0aDsKIAl2b2lkICpib2R5OwogCWludCByZXQgPSAtRUJVU1k7CiAJaW50IGNwdSwgcmVzY2hlZDsKQEAgLTE2MTIsOSArMTgxNSwxMCBAQAogCWlmIChhdG9taWNfcmVhZCgmY3B1X2J1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKSkKIAkJZ290byBvdXQ7CiAKLQlldmVudF9sZW5ndGggPSByYl9jYWxjdWxhdGVfZXZlbnRfbGVuZ3RoKGxlbmd0aCk7Ci0JZXZlbnQgPSByYl9yZXNlcnZlX25leHRfZXZlbnQoY3B1X2J1ZmZlciwKLQkJCQkgICAgICBSSU5HQlVGX1RZUEVfREFUQSwgZXZlbnRfbGVuZ3RoKTsKKwlpZiAobGVuZ3RoID4gQlVGX01BWF9EQVRBX1NJWkUpCisJCWdvdG8gb3V0OworCisJZXZlbnQgPSByYl9yZXNlcnZlX25leHRfZXZlbnQoY3B1X2J1ZmZlciwgbGVuZ3RoKTsKIAlpZiAoIWV2ZW50KQogCQlnb3RvIG91dDsKIApAQCAtMTcyOCw3ICsxOTMyLDggQEAKIAkJcmV0dXJuIDA7CiAKIAljcHVfYnVmZmVyID0gYnVmZmVyLT5idWZmZXJzW2NwdV07Ci0JcmV0ID0gY3B1X2J1ZmZlci0+ZW50cmllczsKKwlyZXQgPSAobG9jYWxfcmVhZCgmY3B1X2J1ZmZlci0+ZW50cmllcykgLSBjcHVfYnVmZmVyLT5vdmVycnVuKQorCQktIGNwdV9idWZmZXItPnJlYWQ7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTc1NSw2ICsxOTYwLDQ3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9vdmVycnVuX2NwdSk7CiAKIC8qKgorICogcmluZ19idWZmZXJfbm1pX2Ryb3BwZWRfY3B1IC0gZ2V0IHRoZSBudW1iZXIgb2Ygbm1pcyB0aGF0IHdlcmUgZHJvcHBlZAorICogQGJ1ZmZlcjogVGhlIHJpbmcgYnVmZmVyCisgKiBAY3B1OiBUaGUgcGVyIENQVSBidWZmZXIgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnJ1bnMgZnJvbQorICovCit1bnNpZ25lZCBsb25nIHJpbmdfYnVmZmVyX25taV9kcm9wcGVkX2NwdShzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIGJ1ZmZlci0+Y3B1bWFzaykpCisJCXJldHVybiAwOworCisJY3B1X2J1ZmZlciA9IGJ1ZmZlci0+YnVmZmVyc1tjcHVdOworCXJldCA9IGNwdV9idWZmZXItPm5taV9kcm9wcGVkOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX25taV9kcm9wcGVkX2NwdSk7CisKKy8qKgorICogcmluZ19idWZmZXJfY29tbWl0X292ZXJydW5fY3B1IC0gZ2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnJ1bnMgY2F1c2VkIGJ5IGNvbW1pdHMKKyAqIEBidWZmZXI6IFRoZSByaW5nIGJ1ZmZlcgorICogQGNwdTogVGhlIHBlciBDUFUgYnVmZmVyIHRvIGdldCB0aGUgbnVtYmVyIG9mIG92ZXJydW5zIGZyb20KKyAqLwordW5zaWduZWQgbG9uZworcmluZ19idWZmZXJfY29tbWl0X292ZXJydW5fY3B1KHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCBpbnQgY3B1KQoreworCXN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1ICpjcHVfYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgYnVmZmVyLT5jcHVtYXNrKSkKKwkJcmV0dXJuIDA7CisKKwljcHVfYnVmZmVyID0gYnVmZmVyLT5idWZmZXJzW2NwdV07CisJcmV0ID0gY3B1X2J1ZmZlci0+Y29tbWl0X292ZXJydW47CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfY29tbWl0X292ZXJydW5fY3B1KTsKKworLyoqCiAgKiByaW5nX2J1ZmZlcl9lbnRyaWVzIC0gZ2V0IHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBhIGJ1ZmZlcgogICogQGJ1ZmZlcjogVGhlIHJpbmcgYnVmZmVyCiAgKgpAQCAtMTc3MCw3ICsyMDE2LDggQEAKIAkvKiBpZiB5b3UgY2FyZSBhYm91dCB0aGlzIGJlaW5nIGNvcnJlY3QsIGxvY2sgdGhlIGJ1ZmZlciAqLwogCWZvcl9lYWNoX2J1ZmZlcl9jcHUoYnVmZmVyLCBjcHUpIHsKIAkJY3B1X2J1ZmZlciA9IGJ1ZmZlci0+YnVmZmVyc1tjcHVdOwotCQllbnRyaWVzICs9IGNwdV9idWZmZXItPmVudHJpZXM7CisJCWVudHJpZXMgKz0gKGxvY2FsX3JlYWQoJmNwdV9idWZmZXItPmVudHJpZXMpIC0KKwkJCSAgICBjcHVfYnVmZmVyLT5vdmVycnVuKSAtIGNwdV9idWZmZXItPnJlYWQ7CiAJfQogCiAJcmV0dXJuIGVudHJpZXM7CkBAIC0xODYyLDcgKzIxMDksNyBAQAogewogCXU2NCBkZWx0YTsKIAotCXN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKwlzd2l0Y2ggKGV2ZW50LT50eXBlX2xlbikgewogCWNhc2UgUklOR0JVRl9UWVBFX1BBRERJTkc6CiAJCXJldHVybjsKIApAQCAtMTg5Myw3ICsyMTQwLDcgQEAKIHsKIAl1NjQgZGVsdGE7CiAKLQlzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisJc3dpdGNoIChldmVudC0+dHlwZV9sZW4pIHsKIAljYXNlIFJJTkdCVUZfVFlQRV9QQURESU5HOgogCQlyZXR1cm47CiAKQEAgLTE5NjYsNiArMjIxMyw3IEBACiAJY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UtPmxpc3QucHJldiA9IHJlYWRlci0+bGlzdC5wcmV2OwogCiAJbG9jYWxfc2V0KCZjcHVfYnVmZmVyLT5yZWFkZXJfcGFnZS0+d3JpdGUsIDApOworCWxvY2FsX3NldCgmY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UtPmVudHJpZXMsIDApOwogCWxvY2FsX3NldCgmY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UtPnBhZ2UtPmNvbW1pdCwgMCk7CiAKIAkvKiBNYWtlIHRoZSByZWFkZXIgcGFnZSBub3cgcmVwbGFjZSB0aGUgaGVhZCAqLwpAQCAtMjAwOCw4ICsyMjU2LDkgQEAKIAogCWV2ZW50ID0gcmJfcmVhZGVyX2V2ZW50KGNwdV9idWZmZXIpOwogCi0JaWYgKGV2ZW50LT50eXBlID09IFJJTkdCVUZfVFlQRV9EQVRBIHx8IHJiX2Rpc2NhcmRlZF9ldmVudChldmVudCkpCi0JCWNwdV9idWZmZXItPmVudHJpZXMtLTsKKwlpZiAoZXZlbnQtPnR5cGVfbGVuIDw9IFJJTkdCVUZfVFlQRV9EQVRBX1RZUEVfTEVOX01BWAorCQkJfHwgcmJfZGlzY2FyZGVkX2V2ZW50KGV2ZW50KSkKKwkJY3B1X2J1ZmZlci0+cmVhZCsrOwogCiAJcmJfdXBkYXRlX3JlYWRfc3RhbXAoY3B1X2J1ZmZlciwgZXZlbnQpOwogCkBAIC0yMDMxLDggKzIyODAsOCBAQAogCSAqIENoZWNrIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCiAJICovCiAJaWYgKGl0ZXItPmhlYWQgPj0gcmJfcGFnZV9zaXplKGl0ZXItPmhlYWRfcGFnZSkpIHsKLQkJaWYgKFJCX1dBUk5fT04oYnVmZmVyLAotCQkJICAgICAgIGl0ZXItPmhlYWRfcGFnZSA9PSBjcHVfYnVmZmVyLT5jb21taXRfcGFnZSkpCisJCS8qIGRpc2NhcmRlZCBjb21taXRzIGNhbiBtYWtlIHRoZSBwYWdlIGVtcHR5ICovCisJCWlmIChpdGVyLT5oZWFkX3BhZ2UgPT0gY3B1X2J1ZmZlci0+Y29tbWl0X3BhZ2UpCiAJCQlyZXR1cm47CiAJCXJiX2luY19pdGVyKGl0ZXIpOwogCQlyZXR1cm47CkBAIC0yMDc1LDEyICsyMzI0LDEwIEBACiAJLyoKIAkgKiBXZSByZXBlYXQgd2hlbiBhIHRpbWVzdGFtcCBpcyBlbmNvdW50ZXJlZC4gSXQgaXMgcG9zc2libGUKIAkgKiB0byBnZXQgbXVsdGlwbGUgdGltZXN0YW1wcyBmcm9tIGFuIGludGVycnVwdCBlbnRlcmluZyBqdXN0Ci0JICogYXMgb25lIHRpbWVzdGFtcCBpcyBhYm91dCB0byBiZSB3cml0dGVuLiBUaGUgbWF4IHRpbWVzCi0JICogdGhhdCB0aGlzIGNhbiBoYXBwZW4gaXMgdGhlIG51bWJlciBvZiBuZXN0ZWQgaW50ZXJydXB0cyB3ZQotCSAqIGNhbiBoYXZlLiAgTmVzdGluZyAxMCBkZWVwIG9mIGludGVycnVwdHMgaXMgY2xlYXJseQotCSAqIGFuIGFub21hbHkuCisJICogYXMgb25lIHRpbWVzdGFtcCBpcyBhYm91dCB0byBiZSB3cml0dGVuLCBvciBmcm9tIGRpc2NhcmRlZAorCSAqIGNvbW1pdHMuIFRoZSBtb3N0IHRoYXQgd2UgY2FuIGhhdmUgaXMgdGhlIG51bWJlciBvbiBhIHNpbmdsZSBwYWdlLgogCSAqLwotCWlmIChSQl9XQVJOX09OKGNwdV9idWZmZXIsICsrbnJfbG9vcHMgPiAxMCkpCisJaWYgKFJCX1dBUk5fT04oY3B1X2J1ZmZlciwgKytucl9sb29wcyA+IFJCX1RJTUVTVEFNUFNfUEVSX1BBR0UpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJlYWRlciA9IHJiX2dldF9yZWFkZXJfcGFnZShjcHVfYnVmZmVyKTsKQEAgLTIwODksNyArMjMzNiw3IEBACiAKIAlldmVudCA9IHJiX3JlYWRlcl9ldmVudChjcHVfYnVmZmVyKTsKIAotCXN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKwlzd2l0Y2ggKGV2ZW50LT50eXBlX2xlbikgewogCWNhc2UgUklOR0JVRl9UWVBFX1BBRERJTkc6CiAJCWlmIChyYl9udWxsX2V2ZW50KGV2ZW50KSkKIAkJCVJCX1dBUk5fT04oY3B1X2J1ZmZlciwgMSk7CkBAIC0yMTQ2LDE0ICsyMzkzLDE0IEBACiAKICBhZ2FpbjoKIAkvKgotCSAqIFdlIHJlcGVhdCB3aGVuIGEgdGltZXN0YW1wIGlzIGVuY291bnRlcmVkLiBJdCBpcyBwb3NzaWJsZQotCSAqIHRvIGdldCBtdWx0aXBsZSB0aW1lc3RhbXBzIGZyb20gYW4gaW50ZXJydXB0IGVudGVyaW5nIGp1c3QKLQkgKiBhcyBvbmUgdGltZXN0YW1wIGlzIGFib3V0IHRvIGJlIHdyaXR0ZW4uIFRoZSBtYXggdGltZXMKLQkgKiB0aGF0IHRoaXMgY2FuIGhhcHBlbiBpcyB0aGUgbnVtYmVyIG9mIG5lc3RlZCBpbnRlcnJ1cHRzIHdlCi0JICogY2FuIGhhdmUuIE5lc3RpbmcgMTAgZGVlcCBvZiBpbnRlcnJ1cHRzIGlzIGNsZWFybHkKLQkgKiBhbiBhbm9tYWx5LgorCSAqIFdlIHJlcGVhdCB3aGVuIGEgdGltZXN0YW1wIGlzIGVuY291bnRlcmVkLgorCSAqIFdlIGNhbiBnZXQgbXVsdGlwbGUgdGltZXN0YW1wcyBieSBuZXN0ZWQgaW50ZXJydXB0cyBvciBhbHNvCisJICogaWYgZmlsdGVyaW5nIGlzIG9uIChkaXNjYXJkaW5nIGNvbW1pdHMpLiBTaW5jZSBkaXNjYXJkaW5nCisJICogY29tbWl0cyBjYW4gYmUgZnJlcXVlbnQgd2UgY2FuIGdldCBhIGxvdCBvZiB0aW1lc3RhbXBzLgorCSAqIEJ1dCB3ZSBsaW1pdCB0aGVtIGJ5IG5vdCBhZGRpbmcgdGltZXN0YW1wcyBpZiB0aGV5IGJlZ2luCisJICogYXQgdGhlIHN0YXJ0IG9mIGEgcGFnZS4KIAkgKi8KLQlpZiAoUkJfV0FSTl9PTihjcHVfYnVmZmVyLCArK25yX2xvb3BzID4gMTApKQorCWlmIChSQl9XQVJOX09OKGNwdV9idWZmZXIsICsrbnJfbG9vcHMgPiBSQl9USU1FU1RBTVBTX1BFUl9QQUdFKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlpZiAocmJfcGVyX2NwdV9lbXB0eShjcHVfYnVmZmVyKSkKQEAgLTIxNjEsNyArMjQwOCw3IEBACiAKIAlldmVudCA9IHJiX2l0ZXJfaGVhZF9ldmVudChpdGVyKTsKIAotCXN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKwlzd2l0Y2ggKGV2ZW50LT50eXBlX2xlbikgewogCWNhc2UgUklOR0JVRl9UWVBFX1BBRERJTkc6CiAJCWlmIChyYl9udWxsX2V2ZW50KGV2ZW50KSkgewogCQkJcmJfaW5jX2l0ZXIoaXRlcik7CkBAIC0yMjIwLDcgKzI0NjcsNyBAQAogCWV2ZW50ID0gcmJfYnVmZmVyX3BlZWsoYnVmZmVyLCBjcHUsIHRzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVfYnVmZmVyLT5yZWFkZXJfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGV2ZW50ICYmIGV2ZW50LT50eXBlID09IFJJTkdCVUZfVFlQRV9QQURESU5HKSB7CisJaWYgKGV2ZW50ICYmIGV2ZW50LT50eXBlX2xlbiA9PSBSSU5HQlVGX1RZUEVfUEFERElORykgewogCQljcHVfcmVsYXgoKTsKIAkJZ290byBhZ2FpbjsKIAl9CkBAIC0yMjQ4LDcgKzI0OTUsNyBAQAogCWV2ZW50ID0gcmJfaXRlcl9wZWVrKGl0ZXIsIHRzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVfYnVmZmVyLT5yZWFkZXJfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGV2ZW50ICYmIGV2ZW50LT50eXBlID09IFJJTkdCVUZfVFlQRV9QQURESU5HKSB7CisJaWYgKGV2ZW50ICYmIGV2ZW50LT50eXBlX2xlbiA9PSBSSU5HQlVGX1RZUEVfUEFERElORykgewogCQljcHVfcmVsYXgoKTsKIAkJZ290byBhZ2FpbjsKIAl9CkBAIC0yMjkzLDcgKzI1NDAsNyBAQAogIG91dDoKIAlwcmVlbXB0X2VuYWJsZSgpOwogCi0JaWYgKGV2ZW50ICYmIGV2ZW50LT50eXBlID09IFJJTkdCVUZfVFlQRV9QQURESU5HKSB7CisJaWYgKGV2ZW50ICYmIGV2ZW50LT50eXBlX2xlbiA9PSBSSU5HQlVGX1RZUEVfUEFERElORykgewogCQljcHVfcmVsYXgoKTsKIAkJZ290byBhZ2FpbjsKIAl9CkBAIC0yMzg2LDcgKzI2MzMsNyBAQAogIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVfYnVmZmVyLT5yZWFkZXJfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGV2ZW50ICYmIGV2ZW50LT50eXBlID09IFJJTkdCVUZfVFlQRV9QQURESU5HKSB7CisJaWYgKGV2ZW50ICYmIGV2ZW50LT50eXBlX2xlbiA9PSBSSU5HQlVGX1RZUEVfUEFERElORykgewogCQljcHVfcmVsYXgoKTsKIAkJZ290byBhZ2FpbjsKIAl9CkBAIC0yNDExLDYgKzI2NTgsNyBAQAogCWNwdV9idWZmZXItPmhlYWRfcGFnZQogCQk9IGxpc3RfZW50cnkoY3B1X2J1ZmZlci0+cGFnZXMubmV4dCwgc3RydWN0IGJ1ZmZlcl9wYWdlLCBsaXN0KTsKIAlsb2NhbF9zZXQoJmNwdV9idWZmZXItPmhlYWRfcGFnZS0+d3JpdGUsIDApOworCWxvY2FsX3NldCgmY3B1X2J1ZmZlci0+aGVhZF9wYWdlLT5lbnRyaWVzLCAwKTsKIAlsb2NhbF9zZXQoJmNwdV9idWZmZXItPmhlYWRfcGFnZS0+cGFnZS0+Y29tbWl0LCAwKTsKIAogCWNwdV9idWZmZXItPmhlYWRfcGFnZS0+cmVhZCA9IDA7CkBAIC0yNDIwLDExICsyNjY4LDE1IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UtPmxpc3QpOwogCWxvY2FsX3NldCgmY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UtPndyaXRlLCAwKTsKKwlsb2NhbF9zZXQoJmNwdV9idWZmZXItPnJlYWRlcl9wYWdlLT5lbnRyaWVzLCAwKTsKIAlsb2NhbF9zZXQoJmNwdV9idWZmZXItPnJlYWRlcl9wYWdlLT5wYWdlLT5jb21taXQsIDApOwogCWNwdV9idWZmZXItPnJlYWRlcl9wYWdlLT5yZWFkID0gMDsKIAorCWNwdV9idWZmZXItPm5taV9kcm9wcGVkID0gMDsKKwljcHVfYnVmZmVyLT5jb21taXRfb3ZlcnJ1biA9IDA7CiAJY3B1X2J1ZmZlci0+b3ZlcnJ1biA9IDA7Ci0JY3B1X2J1ZmZlci0+ZW50cmllcyA9IDA7CisJY3B1X2J1ZmZlci0+cmVhZCA9IDA7CisJbG9jYWxfc2V0KCZjcHVfYnVmZmVyLT5lbnRyaWVzLCAwKTsKIAogCWNwdV9idWZmZXItPndyaXRlX3N0YW1wID0gMDsKIAljcHVfYnVmZmVyLT5yZWFkX3N0YW1wID0gMDsKQEAgLTI0NDMsNiArMjY5NSw4IEBACiAJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgYnVmZmVyLT5jcHVtYXNrKSkKIAkJcmV0dXJuOwogCisJYXRvbWljX2luYygmY3B1X2J1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZjcHVfYnVmZmVyLT5yZWFkZXJfbG9jaywgZmxhZ3MpOwogCiAJX19yYXdfc3Bpbl9sb2NrKCZjcHVfYnVmZmVyLT5sb2NrKTsKQEAgLTI0NTIsNiArMjcwNiw4IEBACiAJX19yYXdfc3Bpbl91bmxvY2soJmNwdV9idWZmZXItPmxvY2spOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1X2J1ZmZlci0+cmVhZGVyX2xvY2ssIGZsYWdzKTsKKworCWF0b21pY19kZWMoJmNwdV9idWZmZXItPnJlY29yZF9kaXNhYmxlZCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9yZXNldF9jcHUpOwogCkBAIC0yNTc4LDI4ICsyODM0LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3N3YXBfY3B1KTsKIAotc3RhdGljIHZvaWQgcmJfcmVtb3ZlX2VudHJpZXMoc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXIsCi0JCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2RhdGFfcGFnZSAqYnBhZ2UsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQotewotCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7Ci0JdW5zaWduZWQgbG9uZyBoZWFkOwotCi0JX19yYXdfc3Bpbl9sb2NrKCZjcHVfYnVmZmVyLT5sb2NrKTsKLQlmb3IgKGhlYWQgPSBvZmZzZXQ7IGhlYWQgPCBsb2NhbF9yZWFkKCZicGFnZS0+Y29tbWl0KTsKLQkgICAgIGhlYWQgKz0gcmJfZXZlbnRfbGVuZ3RoKGV2ZW50KSkgewotCi0JCWV2ZW50ID0gX19yYl9kYXRhX3BhZ2VfaW5kZXgoYnBhZ2UsIGhlYWQpOwotCQlpZiAoUkJfV0FSTl9PTihjcHVfYnVmZmVyLCByYl9udWxsX2V2ZW50KGV2ZW50KSkpCi0JCQlyZXR1cm47Ci0JCS8qIE9ubHkgY291bnQgZGF0YSBlbnRyaWVzICovCi0JCWlmIChldmVudC0+dHlwZSAhPSBSSU5HQlVGX1RZUEVfREFUQSkKLQkJCWNvbnRpbnVlOwotCQljcHVfYnVmZmVyLT5lbnRyaWVzLS07Ci0JfQotCV9fcmF3X3NwaW5fdW5sb2NrKCZjcHVfYnVmZmVyLT5sb2NrKTsKLX0KLQogLyoqCiAgKiByaW5nX2J1ZmZlcl9hbGxvY19yZWFkX3BhZ2UgLSBhbGxvY2F0ZSBhIHBhZ2UgdG8gcmVhZCBmcm9tIGJ1ZmZlcgogICogQGJ1ZmZlcjogdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZSBmb3IuCkBAIC0yNjMwLDYgKzI4NjQsNyBAQAogCiAJcmV0dXJuIGJwYWdlOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfYWxsb2NfcmVhZF9wYWdlKTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9mcmVlX3JlYWRfcGFnZSAtIGZyZWUgYW4gYWxsb2NhdGVkIHJlYWQgcGFnZQpAQCAtMjY0Miw2ICsyODc3LDcgQEAKIHsKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9mcmVlX3JlYWRfcGFnZSk7CiAKIC8qKgogICogcmluZ19idWZmZXJfcmVhZF9wYWdlIC0gZXh0cmFjdCBhIHBhZ2UgZnJvbSB0aGUgcmluZyBidWZmZXIKQEAgLTI3NjgsMTYgKzMwMDQsMTcgQEAKIAkJLyogd2UgY29waWVkIGV2ZXJ5dGhpbmcgdG8gdGhlIGJlZ2lubmluZyAqLwogCQlyZWFkID0gMDsKIAl9IGVsc2UgeworCQkvKiB1cGRhdGUgdGhlIGVudHJ5IGNvdW50ZXIgKi8KKwkJY3B1X2J1ZmZlci0+cmVhZCArPSBsb2NhbF9yZWFkKCZyZWFkZXItPmVudHJpZXMpOworCiAJCS8qIHN3YXAgdGhlIHBhZ2VzICovCiAJCXJiX2luaXRfcGFnZShicGFnZSk7CiAJCWJwYWdlID0gcmVhZGVyLT5wYWdlOwogCQlyZWFkZXItPnBhZ2UgPSAqZGF0YV9wYWdlOwogCQlsb2NhbF9zZXQoJnJlYWRlci0+d3JpdGUsIDApOworCQlsb2NhbF9zZXQoJnJlYWRlci0+ZW50cmllcywgMCk7CiAJCXJlYWRlci0+cmVhZCA9IDA7CiAJCSpkYXRhX3BhZ2UgPSBicGFnZTsKLQotCQkvKiB1cGRhdGUgdGhlIGVudHJ5IGNvdW50ZXIgKi8KLQkJcmJfcmVtb3ZlX2VudHJpZXMoY3B1X2J1ZmZlciwgYnBhZ2UsIHJlYWQpOwogCX0KIAlyZXQgPSByZWFkOwogCkBAIC0yNzg3LDYgKzMwMjQsNyBAQAogIG91dDoKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfcmVhZF9wYWdlKTsKIAogc3RhdGljIHNzaXplX3QKIHJiX3NpbXBsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdWJ1ZiwKQEAgLTI4NDUsMTQgKzMwODMsMTEgQEAKIHN0YXRpYyBfX2luaXQgaW50IHJiX2luaXRfZGVidWdmcyh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwotCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCiAJZF90cmFjZXIgPSB0cmFjaW5nX2luaXRfZGVudHJ5KCk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNpbmdfb24iLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgJnJpbmdfYnVmZmVyX2ZsYWdzLCAmcmJfc2ltcGxlX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAndHJhY2luZ19vbicgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjaW5nX29uIiwgMDY0NCwgZF90cmFjZXIsCisJCQkgICAgJnJpbmdfYnVmZmVyX2ZsYWdzLCAmcmJfc2ltcGxlX2ZvcHMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXJfYmVuY2htYXJrLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXJfYmVuY2htYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2OGUxNAotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlcl9iZW5jaG1hcmsuYwpAQCAtMCwwICsxLDQxNiBAQAorLyoKKyAqIHJpbmcgYnVmZmVyIHRlc3RlciBhbmQgYmVuY2htYXJrCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFN0ZXZlbiBSb3N0ZWR0IDxzcm9zdGVkdEByZWRoYXQuY29tPgorICovCisjaW5jbHVkZSA8bGludXgvcmluZ19idWZmZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworc3RydWN0IHJiX3BhZ2UgeworCXU2NAkJdHM7CisJbG9jYWxfdAkJY29tbWl0OworCWNoYXIJCWRhdGFbNDA4MF07Cit9OworCisvKiBydW4gdGltZSBhbmQgc2xlZXAgdGltZSBpbiBzZWNvbmRzICovCisjZGVmaW5lIFJVTl9USU1FCTEwCisjZGVmaW5lIFNMRUVQX1RJTUUJMTAKKworLyogbnVtYmVyIG9mIGV2ZW50cyBmb3Igd3JpdGVyIHRvIHdha2UgdXAgdGhlIHJlYWRlciAqLworc3RhdGljIGludCB3YWtldXBfaW50ZXJ2YWwgPSAxMDA7CisKK3N0YXRpYyBpbnQgcmVhZGVyX2ZpbmlzaDsKK3N0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiByZWFkX3N0YXJ0Oworc3RhdGljIHN0cnVjdCBjb21wbGV0aW9uIHJlYWRfZG9uZTsKKworc3RhdGljIHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJvZHVjZXI7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpjb25zdW1lcjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWQ7CisKK3N0YXRpYyBpbnQgZGlzYWJsZV9yZWFkZXI7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV9yZWFkZXIsIHVpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkaXNhYmxlX3JlYWRlciwgIm9ubHkgcnVuIHByb2R1Y2VyIik7CisKK3N0YXRpYyBpbnQgcmVhZF9ldmVudHM7CisKK3N0YXRpYyBpbnQga2lsbF90ZXN0OworCisjZGVmaW5lIEtJTExfVEVTVCgpCQkJCVwKKwlkbyB7CQkJCQlcCisJCWlmICgha2lsbF90ZXN0KSB7CQlcCisJCQlraWxsX3Rlc3QgPSAxOwkJXAorCQkJV0FSTl9PTigxKTsJCVwKKwkJfQkJCQlcCisJfSB3aGlsZSAoMCkKKworZW51bSBldmVudF9zdGF0dXMgeworCUVWRU5UX0ZPVU5ELAorCUVWRU5UX0RST1BQRUQsCit9OworCitzdGF0aWMgZW51bSBldmVudF9zdGF0dXMgcmVhZF9ldmVudChpbnQgY3B1KQoreworCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CisJaW50ICplbnRyeTsKKwl1NjQgdHM7CisKKwlldmVudCA9IHJpbmdfYnVmZmVyX2NvbnN1bWUoYnVmZmVyLCBjcHUsICZ0cyk7CisJaWYgKCFldmVudCkKKwkJcmV0dXJuIEVWRU5UX0RST1BQRUQ7CisKKwllbnRyeSA9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworCWlmICgqZW50cnkgIT0gY3B1KSB7CisJCUtJTExfVEVTVCgpOworCQlyZXR1cm4gRVZFTlRfRFJPUFBFRDsKKwl9CisKKwlyZWFkKys7CisJcmV0dXJuIEVWRU5UX0ZPVU5EOworfQorCitzdGF0aWMgZW51bSBldmVudF9zdGF0dXMgcmVhZF9wYWdlKGludCBjcHUpCit7CisJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKKwlzdHJ1Y3QgcmJfcGFnZSAqcnBhZ2U7CisJdW5zaWduZWQgbG9uZyBjb21taXQ7CisJdm9pZCAqYnBhZ2U7CisJaW50ICplbnRyeTsKKwlpbnQgcmV0OworCWludCBpbmM7CisJaW50IGk7CisKKwlicGFnZSA9IHJpbmdfYnVmZmVyX2FsbG9jX3JlYWRfcGFnZShidWZmZXIpOworCWlmICghYnBhZ2UpCisJCXJldHVybiBFVkVOVF9EUk9QUEVEOworCisJcmV0ID0gcmluZ19idWZmZXJfcmVhZF9wYWdlKGJ1ZmZlciwgJmJwYWdlLCBQQUdFX1NJWkUsIGNwdSwgMSk7CisJaWYgKHJldCA+PSAwKSB7CisJCXJwYWdlID0gYnBhZ2U7CisJCWNvbW1pdCA9IGxvY2FsX3JlYWQoJnJwYWdlLT5jb21taXQpOworCQlmb3IgKGkgPSAwOyBpIDwgY29tbWl0ICYmICFraWxsX3Rlc3Q7IGkgKz0gaW5jKSB7CisKKwkJCWlmIChpID49IChQQUdFX1NJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgcmJfcGFnZSwgZGF0YSkpKSB7CisJCQkJS0lMTF9URVNUKCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWluYyA9IC0xOworCQkJZXZlbnQgPSAodm9pZCAqKSZycGFnZS0+ZGF0YVtpXTsKKwkJCXN3aXRjaCAoZXZlbnQtPnR5cGVfbGVuKSB7CisJCQljYXNlIFJJTkdCVUZfVFlQRV9QQURESU5HOgorCQkJCS8qIFdlIGRvbid0IGV4cGVjdCBhbnkgcGFkZGluZyAqLworCQkJCUtJTExfVEVTVCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBSSU5HQlVGX1RZUEVfVElNRV9FWFRFTkQ6CisJCQkJaW5jID0gODsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCQllbnRyeSA9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworCQkJCWlmICgqZW50cnkgIT0gY3B1KSB7CisJCQkJCUtJTExfVEVTVCgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmVhZCsrOworCQkJCWlmICghZXZlbnQtPmFycmF5WzBdKSB7CisJCQkJCUtJTExfVEVTVCgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaW5jID0gZXZlbnQtPmFycmF5WzBdOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllbnRyeSA9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworCQkJCWlmICgqZW50cnkgIT0gY3B1KSB7CisJCQkJCUtJTExfVEVTVCgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmVhZCsrOworCQkJCWluYyA9ICgoZXZlbnQtPnR5cGVfbGVuICsgMSkgKiA0KTsKKwkJCX0KKwkJCWlmIChraWxsX3Rlc3QpCisJCQkJYnJlYWs7CisKKwkJCWlmIChpbmMgPD0gMCkgeworCQkJCUtJTExfVEVTVCgpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJpbmdfYnVmZmVyX2ZyZWVfcmVhZF9wYWdlKGJ1ZmZlciwgYnBhZ2UpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiBFVkVOVF9EUk9QUEVEOworCXJldHVybiBFVkVOVF9GT1VORDsKK30KKworc3RhdGljIHZvaWQgcmluZ19idWZmZXJfY29uc3VtZXIodm9pZCkKK3sKKwkvKiB0b2dnbGUgYmV0d2VlbiByZWFkaW5nIHBhZ2VzIGFuZCBldmVudHMgKi8KKwlyZWFkX2V2ZW50cyBePSAxOworCisJcmVhZCA9IDA7CisJd2hpbGUgKCFyZWFkZXJfZmluaXNoICYmICFraWxsX3Rlc3QpIHsKKwkJaW50IGZvdW5kOworCisJCWRvIHsKKwkJCWludCBjcHU7CisKKwkJCWZvdW5kID0gMDsKKwkJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQkJZW51bSBldmVudF9zdGF0dXMgc3RhdDsKKworCQkJCWlmIChyZWFkX2V2ZW50cykKKwkJCQkJc3RhdCA9IHJlYWRfZXZlbnQoY3B1KTsKKwkJCQllbHNlCisJCQkJCXN0YXQgPSByZWFkX3BhZ2UoY3B1KTsKKworCQkJCWlmIChraWxsX3Rlc3QpCisJCQkJCWJyZWFrOworCQkJCWlmIChzdGF0ID09IEVWRU5UX0ZPVU5EKQorCQkJCQlmb3VuZCA9IDE7CisJCQl9CisJCX0gd2hpbGUgKGZvdW5kICYmICFraWxsX3Rlc3QpOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChyZWFkZXJfZmluaXNoKQorCQkJYnJlYWs7CisKKwkJc2NoZWR1bGUoKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKwlyZWFkZXJfZmluaXNoID0gMDsKKwljb21wbGV0ZSgmcmVhZF9kb25lKTsKK30KKworc3RhdGljIHZvaWQgcmluZ19idWZmZXJfcHJvZHVjZXIodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBzdGFydF90djsKKwlzdHJ1Y3QgdGltZXZhbCBlbmRfdHY7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIGVudHJpZXM7CisJdW5zaWduZWQgbG9uZyBsb25nIG92ZXJydW5zOworCXVuc2lnbmVkIGxvbmcgbWlzc2VkID0gMDsKKwl1bnNpZ25lZCBsb25nIGhpdCA9IDA7CisJdW5zaWduZWQgbG9uZyBhdmc7CisJaW50IGNudCA9IDA7CisKKwkvKgorCSAqIEhhbW1lciB0aGUgYnVmZmVyIGZvciAxMCBzZWNzICh0aGlzIG1heQorCSAqIG1ha2UgdGhlIHN5c3RlbSBzdGFsbCkKKwkgKi8KKwlwcl9pbmZvKCJTdGFydGluZyByaW5nIGJ1ZmZlciBoYW1tZXJcbiIpOworCWRvX2dldHRpbWVvZmRheSgmc3RhcnRfdHYpOworCWRvIHsKKwkJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKKwkJaW50ICplbnRyeTsKKworCQlldmVudCA9IHJpbmdfYnVmZmVyX2xvY2tfcmVzZXJ2ZShidWZmZXIsIDEwKTsKKwkJaWYgKCFldmVudCkgeworCQkJbWlzc2VkKys7CisJCX0gZWxzZSB7CisJCQloaXQrKzsKKwkJCWVudHJ5ID0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CisJCQkqZW50cnkgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KGJ1ZmZlciwgZXZlbnQpOworCQl9CisJCWRvX2dldHRpbWVvZmRheSgmZW5kX3R2KTsKKworCQljbnQrKzsKKwkJaWYgKGNvbnN1bWVyICYmICEoY250ICUgd2FrZXVwX2ludGVydmFsKSkKKwkJCXdha2VfdXBfcHJvY2Vzcyhjb25zdW1lcik7CisKKyNpZm5kZWYgQ09ORklHX1BSRUVNUFQKKwkJLyoKKwkJICogSWYgd2UgYXJlIGEgbm9uIHByZWVtcHQga2VybmVsLCB0aGUgMTAgc2Vjb25kIHJ1biB3aWxsCisJCSAqIHN0b3AgZXZlcnl0aGluZyB3aGlsZSBpdCBydW5zLiBJbnN0ZWFkLCB3ZSB3aWxsIGNhbGwKKwkJICogY29uZF9yZXNjaGVkIGFuZCBhbHNvIGFkZCBhbnkgdGltZSB0aGF0IHdhcyBsb3N0IGJ5IGEKKwkJICogcmVzY2VkdWxlLgorCQkgKgorCQkgKiBEbyBhIGNvbmQgcmVzY2hlZCBhdCB0aGUgc2FtZSBmcmVxdWVuY3kgd2Ugd291bGQgd2FrZSB1cAorCQkgKiB0aGUgcmVhZGVyLgorCQkgKi8KKwkJaWYgKGNudCAlIHdha2V1cF9pbnRlcnZhbCkKKwkJCWNvbmRfcmVzY2hlZCgpOworI2VuZGlmCisKKwl9IHdoaWxlIChlbmRfdHYudHZfc2VjIDwgKHN0YXJ0X3R2LnR2X3NlYyArIFJVTl9USU1FKSAmJiAha2lsbF90ZXN0KTsKKwlwcl9pbmZvKCJFbmQgcmluZyBidWZmZXIgaGFtbWVyXG4iKTsKKworCWlmIChjb25zdW1lcikgeworCQkvKiBJbml0IGJvdGggY29tcGxldGlvbnMgaGVyZSB0byBhdm9pZCByYWNlcyAqLworCQlpbml0X2NvbXBsZXRpb24oJnJlYWRfc3RhcnQpOworCQlpbml0X2NvbXBsZXRpb24oJnJlYWRfZG9uZSk7CisJCS8qIHRoZSBjb21wbGV0aW9ucyBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHRoZSBmaW5pc2ggdmFyICovCisJCXNtcF93bWIoKTsKKwkJcmVhZGVyX2ZpbmlzaCA9IDE7CisJCS8qIGZpbmlzaCB2YXIgdmlzaWJsZSBiZWZvcmUgd2FraW5nIHVwIHRoZSBjb25zdW1lciAqLworCQlzbXBfd21iKCk7CisJCXdha2VfdXBfcHJvY2Vzcyhjb25zdW1lcik7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJlYWRfZG9uZSk7CisJfQorCisJdGltZSA9IGVuZF90di50dl9zZWMgLSBzdGFydF90di50dl9zZWM7CisJdGltZSAqPSBVU0VDX1BFUl9TRUM7CisJdGltZSArPSAobG9uZyBsb25nKSgobG9uZyllbmRfdHYudHZfdXNlYyAtIChsb25nKXN0YXJ0X3R2LnR2X3VzZWMpOworCisJZW50cmllcyA9IHJpbmdfYnVmZmVyX2VudHJpZXMoYnVmZmVyKTsKKwlvdmVycnVucyA9IHJpbmdfYnVmZmVyX292ZXJydW5zKGJ1ZmZlcik7CisKKwlpZiAoa2lsbF90ZXN0KQorCQlwcl9pbmZvKCJFUlJPUiFcbiIpOworCXByX2luZm8oIlRpbWU6ICAgICAlbGxkICh1c2VjcylcbiIsIHRpbWUpOworCXByX2luZm8oIk92ZXJydW5zOiAlbGxkXG4iLCBvdmVycnVucyk7CisJaWYgKGRpc2FibGVfcmVhZGVyKQorCQlwcl9pbmZvKCJSZWFkOiAgICAgKHJlYWRlciBkaXNhYmxlZClcbiIpOworCWVsc2UKKwkJcHJfaW5mbygiUmVhZDogICAgICVsZCAgKGJ5ICVzKVxuIiwgcmVhZCwKKwkJCXJlYWRfZXZlbnRzID8gImV2ZW50cyIgOiAicGFnZXMiKTsKKwlwcl9pbmZvKCJFbnRyaWVzOiAgJWxsZFxuIiwgZW50cmllcyk7CisJcHJfaW5mbygiVG90YWw6ICAgICVsbGRcbiIsIGVudHJpZXMgKyBvdmVycnVucyArIHJlYWQpOworCXByX2luZm8oIk1pc3NlZDogICAlbGRcbiIsIG1pc3NlZCk7CisJcHJfaW5mbygiSGl0OiAgICAgICVsZFxuIiwgaGl0KTsKKworCS8qIENvbnZlcnQgdGltZSBmcm9tIHVzZWNzIHRvIG1pbGxpc2VjcyAqLworCWRvX2Rpdih0aW1lLCBVU0VDX1BFUl9NU0VDKTsKKwlpZiAodGltZSkKKwkJaGl0IC89IChsb25nKXRpbWU7CisJZWxzZQorCQlwcl9pbmZvKCJUSU1FIElTIFpFUk8/P1xuIik7CisKKwlwcl9pbmZvKCJFbnRyaWVzIHBlciBtaWxsaXNlYzogJWxkXG4iLCBoaXQpOworCisJaWYgKGhpdCkgeworCQkvKiBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgdGltZSBpbiBuYW5vc2VjcyAqLworCQlhdmcgPSBOU0VDX1BFUl9NU0VDIC8gaGl0OworCQlwcl9pbmZvKCIlbGQgbnMgcGVyIGVudHJ5XG4iLCBhdmcpOworCX0KKworCWlmIChtaXNzZWQpIHsKKwkJaWYgKHRpbWUpCisJCQltaXNzZWQgLz0gKGxvbmcpdGltZTsKKworCQlwcl9pbmZvKCJUb3RhbCBpdGVyYXRpb25zIHBlciBtaWxsaXNlYzogJWxkXG4iLCBoaXQgKyBtaXNzZWQpOworCisJCS8qIGl0IGlzIHBvc3NpYmxlIHRoYXQgaGl0ICsgbWlzc2VkIHdpbGwgb3ZlcmZsb3cgYW5kIGJlIHplcm8gKi8KKwkJaWYgKCEoaGl0ICsgbWlzc2VkKSkgeworCQkJcHJfaW5mbygiaGl0ICsgbWlzc2VkIG92ZXJmbG93ZWQgYW5kIHRvdGFsbGVkIHplcm8hXG4iKTsKKwkJCWhpdC0tOyAvKiBtYWtlIGl0IG5vbiB6ZXJvICovCisJCX0KKworCQkvKiBDYWN1bGF0ZSB0aGUgYXZlcmFnZSB0aW1lIGluIG5hbm9zZWNzICovCisJCWF2ZyA9IE5TRUNfUEVSX01TRUMgLyAoaGl0ICsgbWlzc2VkKTsKKwkJcHJfaW5mbygiJWxkIG5zIHBlciBlbnRyeVxuIiwgYXZnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRfdG9fZGllKHZvaWQpCit7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzY2hlZHVsZSgpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Cit9CisKK3N0YXRpYyBpbnQgcmluZ19idWZmZXJfY29uc3VtZXJfdGhyZWFkKHZvaWQgKmFyZykKK3sKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAha2lsbF90ZXN0KSB7CisJCWNvbXBsZXRlKCZyZWFkX3N0YXJ0KTsKKworCQlyaW5nX2J1ZmZlcl9jb25zdW1lcigpOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwga2lsbF90ZXN0KQorCQkJYnJlYWs7CisKKwkJc2NoZWR1bGUoKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlpZiAoa2lsbF90ZXN0KQorCQl3YWl0X3RvX2RpZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmluZ19idWZmZXJfcHJvZHVjZXJfdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlpbml0X2NvbXBsZXRpb24oJnJlYWRfc3RhcnQpOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgIWtpbGxfdGVzdCkgeworCQlyaW5nX2J1ZmZlcl9yZXNldChidWZmZXIpOworCisJCWlmIChjb25zdW1lcikgeworCQkJc21wX3dtYigpOworCQkJd2FrZV91cF9wcm9jZXNzKGNvbnN1bWVyKTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJlYWRfc3RhcnQpOworCQl9CisKKwkJcmluZ19idWZmZXJfcHJvZHVjZXIoKTsKKworCQlwcl9pbmZvKCJTbGVlcGluZyBmb3IgMTAgc2Vjc1xuIik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogKiBTTEVFUF9USU1FKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKworCWlmIChraWxsX3Rlc3QpCisJCXdhaXRfdG9fZGllKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcmluZ19idWZmZXJfYmVuY2htYXJrX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJLyogbWFrZSBhIG9uZSBtZWcgYnVmZmVyIGluIG92ZXJ3aXRlIG1vZGUgKi8KKwlidWZmZXIgPSByaW5nX2J1ZmZlcl9hbGxvYygxMDAwMDAwLCBSQl9GTF9PVkVSV1JJVEUpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghZGlzYWJsZV9yZWFkZXIpIHsKKwkJY29uc3VtZXIgPSBrdGhyZWFkX2NyZWF0ZShyaW5nX2J1ZmZlcl9jb25zdW1lcl90aHJlYWQsCisJCQkJCSAgTlVMTCwgInJiX2NvbnN1bWVyIik7CisJCXJldCA9IFBUUl9FUlIoY29uc3VtZXIpOworCQlpZiAoSVNfRVJSKGNvbnN1bWVyKSkKKwkJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJcHJvZHVjZXIgPSBrdGhyZWFkX3J1bihyaW5nX2J1ZmZlcl9wcm9kdWNlcl90aHJlYWQsCisJCQkgICAgICAgTlVMTCwgInJiX3Byb2R1Y2VyIik7CisJcmV0ID0gUFRSX0VSUihwcm9kdWNlcik7CisKKwlpZiAoSVNfRVJSKHByb2R1Y2VyKSkKKwkJZ290byBvdXRfa2lsbDsKKworCXJldHVybiAwOworCisgb3V0X2tpbGw6CisJaWYgKGNvbnN1bWVyKQorCQlrdGhyZWFkX3N0b3AoY29uc3VtZXIpOworCisgb3V0X2ZhaWw6CisJcmluZ19idWZmZXJfZnJlZShidWZmZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCByaW5nX2J1ZmZlcl9iZW5jaG1hcmtfZXhpdCh2b2lkKQoreworCWt0aHJlYWRfc3RvcChwcm9kdWNlcik7CisJaWYgKGNvbnN1bWVyKQorCQlrdGhyZWFkX3N0b3AoY29uc3VtZXIpOworCXJpbmdfYnVmZmVyX2ZyZWUoYnVmZmVyKTsKK30KKworbW9kdWxlX2luaXQocmluZ19idWZmZXJfYmVuY2htYXJrX2luaXQpOworbW9kdWxlX2V4aXQocmluZ19idWZmZXJfYmVuY2htYXJrX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGV2ZW4gUm9zdGVkdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJyaW5nX2J1ZmZlcl9iZW5jaG1hcmsiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggY2RhODFlYy4uOGFjZDliOCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTE3MSw2ICsxNzEsMTMgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0cmFjZV9hcnJheV9jcHUsIGdsb2JhbF90cmFjZV9jcHUpOwogCitpbnQgZmlsdGVyX2N1cnJlbnRfY2hlY2tfZGlzY2FyZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIHZvaWQgKnJlYywKKwkJCQkgc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKK3sKKwlyZXR1cm4gZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgcmVjLCBnbG9iYWxfdHJhY2UuYnVmZmVyLCBldmVudCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmaWx0ZXJfY3VycmVudF9jaGVja19kaXNjYXJkKTsKKwogY3ljbGVfdCBmdHJhY2Vfbm93KGludCBjcHUpCiB7CiAJdTY0IHRzOwpAQCAtMjU1LDcgKzI2Miw4IEBACiAKIC8qIHRyYWNlX2ZsYWdzIGhvbGRzIHRyYWNlX29wdGlvbnMgZGVmYXVsdCB2YWx1ZXMgKi8KIHVuc2lnbmVkIGxvbmcgdHJhY2VfZmxhZ3MgPSBUUkFDRV9JVEVSX1BSSU5UX1BBUkVOVCB8IFRSQUNFX0lURVJfUFJJTlRLIHwKLQlUUkFDRV9JVEVSX0FOTk9UQVRFIHwgVFJBQ0VfSVRFUl9DT05URVhUX0lORk8gfCBUUkFDRV9JVEVSX1NMRUVQX1RJTUU7CisJVFJBQ0VfSVRFUl9BTk5PVEFURSB8IFRSQUNFX0lURVJfQ09OVEVYVF9JTkZPIHwgVFJBQ0VfSVRFUl9TTEVFUF9USU1FIHwKKwlUUkFDRV9JVEVSX0dSQVBIX1RJTUU7CiAKIC8qKgogICogdHJhY2Vfd2FrZV91cCAtIHdha2UgdXAgdGFza3Mgd2FpdGluZyBmb3IgdHJhY2UgaW5wdXQKQEAgLTMxNyw2ICszMjUsNyBAQAogCSJsYXRlbmN5LWZvcm1hdCIsCiAJImdsb2JhbC1jbG9jayIsCiAJInNsZWVwLXRpbWUiLAorCSJncmFwaC10aW1lIiwKIAlOVUxMCiB9OwogCkBAIC00MDIsMTcgKzQxMSw2IEBACiAJcmV0dXJuIGNudDsKIH0KIAotc3RhdGljIHZvaWQKLXRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpCi17Ci0JaW50IGxlbiA9IHMtPmxlbiA+PSBQQUdFX1NJWkUgPyBQQUdFX1NJWkUgLSAxIDogcy0+bGVuOwotCi0Jcy0+YnVmZmVyW2xlbl0gPSAwOwotCXNlcV9wdXRzKG0sIHMtPmJ1ZmZlcik7Ci0KLQl0cmFjZV9zZXFfaW5pdChzKTsKLX0KLQogLyoqCiAgKiB1cGRhdGVfbWF4X3RyIC0gc25hcHNob3QgYWxsIHRyYWNlIGJ1ZmZlcnMgZnJvbSBnbG9iYWxfdHJhY2UgdG8gbWF4X3RyCiAgKiBAdHI6IHRyYWNlcgpAQCAtNjQxLDYgKzYzOSwxNiBAQAogCQl0cmFjaW5nX3Jlc2V0KHRyLCBjcHUpOwogfQogCit2b2lkIHRyYWNpbmdfcmVzZXRfY3VycmVudChpbnQgY3B1KQoreworCXRyYWNpbmdfcmVzZXQoJmdsb2JhbF90cmFjZSwgY3B1KTsKK30KKwordm9pZCB0cmFjaW5nX3Jlc2V0X2N1cnJlbnRfb25saW5lX2NwdXModm9pZCkKK3sKKwl0cmFjaW5nX3Jlc2V0X29ubGluZV9jcHVzKCZnbG9iYWxfdHJhY2UpOworfQorCiAjZGVmaW5lIFNBVkVEX0NNRExJTkVTIDEyOAogI2RlZmluZSBOT19DTURMSU5FX01BUCBVSU5UX01BWAogc3RhdGljIHVuc2lnbmVkIG1hcF9waWRfdG9fY21kbGluZVtQSURfTUFYX0RFRkFVTFQrMV07CkBAIC04MDAsNiArODA4LDcgQEAKIAkJcmV0dXJuOwogCX0KIAorCXByZWVtcHRfZGlzYWJsZSgpOwogCV9fcmF3X3NwaW5fbG9jaygmdHJhY2VfY21kbGluZV9sb2NrKTsKIAltYXAgPSBtYXBfcGlkX3RvX2NtZGxpbmVbcGlkXTsKIAlpZiAobWFwICE9IE5PX0NNRExJTkVfTUFQKQpAQCAtODA4LDYgKzgxNyw3IEBACiAJCXN0cmNweShjb21tLCAiPC4uLj4iKTsKIAogCV9fcmF3X3NwaW5fdW5sb2NrKCZ0cmFjZV9jbWRsaW5lX2xvY2spOworCXByZWVtcHRfZW5hYmxlKCk7CiB9CiAKIHZvaWQgdHJhY2luZ19yZWNvcmRfY21kbGluZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKQEAgLTg0MCw3ICs4NTAsNyBAQAogfQogCiBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKnRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwKLQkJCQkJCSAgICB1bnNpZ25lZCBjaGFyIHR5cGUsCisJCQkJCQkgICAgaW50IHR5cGUsCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKQogewpAQCAtODgzLDMwICs4OTMsNDAgQEAKIH0KIAogc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKLXRyYWNlX2N1cnJlbnRfYnVmZmVyX2xvY2tfcmVzZXJ2ZSh1bnNpZ25lZCBjaGFyIHR5cGUsIHVuc2lnbmVkIGxvbmcgbGVuLAordHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKGludCB0eXBlLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYykKIHsKIAlyZXR1cm4gdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZSgmZ2xvYmFsX3RyYWNlLAogCQkJCQkgdHlwZSwgbGVuLCBmbGFncywgcGMpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKTsKIAogdm9pZCB0cmFjZV9jdXJyZW50X2J1ZmZlcl91bmxvY2tfY29tbWl0KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQsCiAJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYykKIHsKLQlyZXR1cm4gX190cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdCgmZ2xvYmFsX3RyYWNlLCBldmVudCwgZmxhZ3MsIHBjLCAxKTsKKwlfX3RyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KCZnbG9iYWxfdHJhY2UsIGV2ZW50LCBmbGFncywgcGMsIDEpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfY3VycmVudF9idWZmZXJfdW5sb2NrX2NvbW1pdCk7CiAKIHZvaWQgdHJhY2Vfbm93YWtlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQsCiAJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYykKIHsKLQlyZXR1cm4gX190cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdCgmZ2xvYmFsX3RyYWNlLCBldmVudCwgZmxhZ3MsIHBjLCAwKTsKKwlfX3RyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KCZnbG9iYWxfdHJhY2UsIGV2ZW50LCBmbGFncywgcGMsIDApOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2Vfbm93YWtlX2J1ZmZlcl91bmxvY2tfY29tbWl0KTsKKwordm9pZCB0cmFjZV9jdXJyZW50X2J1ZmZlcl9kaXNjYXJkX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQoreworCXJpbmdfYnVmZmVyX2Rpc2NhcmRfY29tbWl0KGdsb2JhbF90cmFjZS5idWZmZXIsIGV2ZW50KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRyYWNlX2N1cnJlbnRfYnVmZmVyX2Rpc2NhcmRfY29tbWl0KTsKIAogdm9pZAogdHJhY2VfZnVuY3Rpb24oc3RydWN0IHRyYWNlX2FycmF5ICp0ciwKIAkgICAgICAgdW5zaWduZWQgbG9uZyBpcCwgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJICAgICAgIGludCBwYykKIHsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfZnVuY3Rpb247CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgZnRyYWNlX2VudHJ5ICplbnRyeTsKIApAQCAtOTIxLDcgKzk0MSw5IEBACiAJZW50cnkJPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKIAllbnRyeS0+aXAJCQk9IGlwOwogCWVudHJ5LT5wYXJlbnRfaXAJCT0gcGFyZW50X2lwOwotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOworCisJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgdHItPmJ1ZmZlciwgZXZlbnQpKQorCQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKIH0KIAogI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKQEAgLTkzMCw2ICs5NTIsNyBAQAogCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkJaW50IHBjKQogeworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9mdW5jZ3JhcGhfZW50cnk7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudF9lbnRyeSAqZW50cnk7CiAKQEAgLTk0Miw3ICs5NjUsOCBAQAogCQlyZXR1cm4gMDsKIAllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwogCWVudHJ5LT5ncmFwaF9lbnQJCQk9ICp0cmFjZTsKLQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KGdsb2JhbF90cmFjZS5idWZmZXIsIGV2ZW50KTsKKwlpZiAoIWZpbHRlcl9jdXJyZW50X2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdChnbG9iYWxfdHJhY2UuYnVmZmVyLCBldmVudCk7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTk1Miw2ICs5NzYsNyBAQAogCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsCiAJCQkJaW50IHBjKQogeworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9mdW5jZ3JhcGhfZXhpdDsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBmdHJhY2VfZ3JhcGhfcmV0X2VudHJ5ICplbnRyeTsKIApAQCAtOTY0LDcgKzk4OSw4IEBACiAJCXJldHVybjsKIAllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwogCWVudHJ5LT5yZXQJCQkJPSAqdHJhY2U7Ci0JcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdChnbG9iYWxfdHJhY2UuYnVmZmVyLCBldmVudCk7CisJaWYgKCFmaWx0ZXJfY3VycmVudF9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCBldmVudCkpCisJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQoZ2xvYmFsX3RyYWNlLmJ1ZmZlciwgZXZlbnQpOwogfQogI2VuZGlmCiAKQEAgLTk4Miw2ICsxMDA4LDcgQEAKIAkJCQkgaW50IHNraXAsIGludCBwYykKIHsKICNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9rZXJuZWxfc3RhY2s7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3Qgc3RhY2tfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBzdGFja190cmFjZSB0cmFjZTsKQEAgLTk5OSw3ICsxMDI2LDggQEAKIAl0cmFjZS5lbnRyaWVzCQk9IGVudHJ5LT5jYWxsZXI7CiAKIAlzYXZlX3N0YWNrX3RyYWNlKCZ0cmFjZSk7Ci0JcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CisJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgdHItPmJ1ZmZlciwgZXZlbnQpKQorCQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKICNlbmRpZgogfQogCkBAIC0xMDI0LDYgKzEwNTIsNyBAQAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYykKIHsKICNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF91c2VyX3N0YWNrOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IHVzZXJzdGFja19lbnRyeSAqZW50cnk7CiAJc3RydWN0IHN0YWNrX3RyYWNlIHRyYWNlOwpAQCAtMTA0NSw3ICsxMDc0LDggQEAKIAl0cmFjZS5lbnRyaWVzCQk9IGVudHJ5LT5jYWxsZXI7CiAKIAlzYXZlX3N0YWNrX3RyYWNlX3VzZXIoJnRyYWNlKTsKLQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOwogI2VuZGlmCiB9CiAKQEAgLTEwODksNiArMTExOSw3IEBACiAJCQkgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsCiAJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpCiB7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2NvbnRleHRfc3dpdGNoOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IGN0eF9zd2l0Y2hfZW50cnkgKmVudHJ5OwogCkBAIC0xMTA0LDcgKzExMzUsOSBAQAogCWVudHJ5LT5uZXh0X3ByaW8JCT0gbmV4dC0+cHJpbzsKIAllbnRyeS0+bmV4dF9zdGF0ZQkJPSBuZXh0LT5zdGF0ZTsKIAllbnRyeS0+bmV4dF9jcHUJPSB0YXNrX2NwdShuZXh0KTsKLQl0cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdCh0ciwgZXZlbnQsIGZsYWdzLCBwYyk7CisKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXRyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLCBldmVudCwgZmxhZ3MsIHBjKTsKIH0KIAogdm9pZApAQCAtMTExMyw2ICsxMTQ2LDcgQEAKIAkJCSAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYykKIHsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfd2FrZXVwOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IGN0eF9zd2l0Y2hfZW50cnkgKmVudHJ5OwogCkBAIC0xMTI5LDcgKzExNjMsOCBAQAogCWVudHJ5LT5uZXh0X3N0YXRlCQk9IHdha2VlLT5zdGF0ZTsKIAllbnRyeS0+bmV4dF9jcHUJCQk9IHRhc2tfY3B1KHdha2VlKTsKIAotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CiAJZnRyYWNlX3RyYWNlX3N0YWNrKHRyLCBmbGFncywgNiwgcGMpOwogCWZ0cmFjZV90cmFjZV91c2Vyc3RhY2sodHIsIGZsYWdzLCBwYyk7CiB9CkBAIC0xMjMwLDExICsxMjY1LDEzIEBACiAJCShyYXdfc3BpbmxvY2tfdClfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQ7CiAJc3RhdGljIHUzMiB0cmFjZV9idWZbVFJBQ0VfQlVGX1NJWkVdOwogCisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2JwcmludDsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwogCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSAmZ2xvYmFsX3RyYWNlOwogCXN0cnVjdCB0cmFjZV9hcnJheV9jcHUgKmRhdGE7CiAJc3RydWN0IGJwcmludF9lbnRyeSAqZW50cnk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZGlzYWJsZTsKIAlpbnQgcmVzY2hlZDsKIAlpbnQgY3B1LCBsZW4gPSAwLCBzaXplLCBwYzsKIApAQCAtMTI0OSw3ICsxMjg2LDggQEAKIAljcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWRhdGEgPSB0ci0+ZGF0YVtjcHVdOwogCi0JaWYgKHVubGlrZWx5KGF0b21pY19yZWFkKCZkYXRhLT5kaXNhYmxlZCkpKQorCWRpc2FibGUgPSBhdG9taWNfaW5jX3JldHVybigmZGF0YS0+ZGlzYWJsZWQpOworCWlmICh1bmxpa2VseShkaXNhYmxlICE9IDEpKQogCQlnb3RvIG91dDsKIAogCS8qIExvY2tkZXAgdXNlcyB0cmFjZV9wcmludGsgZm9yIGxvY2sgdHJhY2luZyAqLwpAQCAtMTI2OSwxMyArMTMwNywxNSBAQAogCWVudHJ5LT5mbXQJCQk9IGZtdDsKIAogCW1lbWNweShlbnRyeS0+YnVmLCB0cmFjZV9idWYsIHNpemVvZih1MzIpICogbGVuKTsKLQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOwogCiBvdXRfdW5sb2NrOgogCV9fcmF3X3NwaW5fdW5sb2NrKCZ0cmFjZV9idWZfbG9jayk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiBvdXQ6CisJYXRvbWljX2RlY19yZXR1cm4oJmRhdGEtPmRpc2FibGVkKTsKIAlmdHJhY2VfcHJlZW1wdF9lbmFibGUocmVzY2hlZCk7CiAJdW5wYXVzZV9ncmFwaF90cmFjaW5nKCk7CiAKQEAgLTEyODgsMTIgKzEzMjgsMTQgQEAKIAlzdGF0aWMgcmF3X3NwaW5sb2NrX3QgdHJhY2VfYnVmX2xvY2sgPSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQ7CiAJc3RhdGljIGNoYXIgdHJhY2VfYnVmW1RSQUNFX0JVRl9TSVpFXTsKIAorCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9wcmludDsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwogCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSAmZ2xvYmFsX3RyYWNlOwogCXN0cnVjdCB0cmFjZV9hcnJheV9jcHUgKmRhdGE7CiAJaW50IGNwdSwgbGVuID0gMCwgc2l6ZSwgcGM7CiAJc3RydWN0IHByaW50X2VudHJ5ICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlpbnQgZGlzYWJsZTsKIAogCWlmICh0cmFjaW5nX2Rpc2FibGVkIHx8IHRyYWNpbmdfc2VsZnRlc3RfcnVubmluZykKIAkJcmV0dXJuIDA7CkBAIC0xMzAzLDcgKzEzNDUsOCBAQAogCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJZGF0YSA9IHRyLT5kYXRhW2NwdV07CiAKLQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmRhdGEtPmRpc2FibGVkKSkpCisJZGlzYWJsZSA9IGF0b21pY19pbmNfcmV0dXJuKCZkYXRhLT5kaXNhYmxlZCk7CisJaWYgKHVubGlrZWx5KGRpc2FibGUgIT0gMSkpCiAJCWdvdG8gb3V0OwogCiAJcGF1c2VfZ3JhcGhfdHJhY2luZygpOwpAQCAtMTMyMywxMyArMTM2NiwxNSBAQAogCiAJbWVtY3B5KCZlbnRyeS0+YnVmLCB0cmFjZV9idWYsIGxlbik7CiAJZW50cnktPmJ1ZltsZW5dID0gMDsKLQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOwogCiAgb3V0X3VubG9jazoKIAlfX3Jhd19zcGluX3VubG9jaygmdHJhY2VfYnVmX2xvY2spOwogCXJhd19sb2NhbF9pcnFfcmVzdG9yZShpcnFfZmxhZ3MpOwogCXVucGF1c2VfZ3JhcGhfdHJhY2luZygpOwogIG91dDoKKwlhdG9taWNfZGVjX3JldHVybigmZGF0YS0+ZGlzYWJsZWQpOwogCXByZWVtcHRfZW5hYmxlX25vdHJhY2UoKTsKIAogCXJldHVybiBsZW47CkBAIC0xNTI2LDEyICsxNTcxLDE0IEBACiAJCXAgPSBzX25leHQobSwgcCwgJmwpOwogCX0KIAorCXRyYWNlX2V2ZW50X3JlYWRfbG9jaygpOwogCXJldHVybiBwOwogfQogCiBzdGF0aWMgdm9pZCBzX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewogCWF0b21pY19kZWMoJnRyYWNlX3JlY29yZF9jbWRsaW5lX2Rpc2FibGVkKTsKKwl0cmFjZV9ldmVudF9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF9sYXRfaGVscF9oZWFkZXIoc3RydWN0IHNlcV9maWxlICptKQpAQCAtMTc3NCw2ICsxODIxLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAorLyogIENhbGxlZCB3aXRoIHRyYWNlX2V2ZW50X3JlYWRfbG9jaygpIGhlbGQuICovCiBzdGF0aWMgZW51bSBwcmludF9saW5lX3QgcHJpbnRfdHJhY2VfbGluZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCiB7CiAJZW51bSBwcmludF9saW5lX3QgcmV0OwpAQCAtMjM5Nyw2ICsyNDQ1LDU2IEBACiB9OwogCiBzdGF0aWMgc3NpemVfdAordHJhY2luZ19zYXZlZF9jbWRsaW5lc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCQlzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqYnVmX2NvbW07CisJY2hhciAqZmlsZV9idWY7CisJY2hhciAqYnVmOworCWludCBsZW4gPSAwOworCWludCBwaWQ7CisJaW50IGk7CisKKwlmaWxlX2J1ZiA9IGttYWxsb2MoU0FWRURfQ01ETElORVMqKDE2K1RBU0tfQ09NTV9MRU4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGVfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJ1Zl9jb21tID0ga21hbGxvYyhUQVNLX0NPTU1fTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Zl9jb21tKSB7CisJCWtmcmVlKGZpbGVfYnVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJYnVmID0gZmlsZV9idWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgU0FWRURfQ01ETElORVM7IGkrKykgeworCQlpbnQgcjsKKworCQlwaWQgPSBtYXBfY21kbGluZV90b19waWRbaV07CisJCWlmIChwaWQgPT0gLTEgfHwgcGlkID09IE5PX0NNRExJTkVfTUFQKQorCQkJY29udGludWU7CisKKwkJdHJhY2VfZmluZF9jbWRsaW5lKHBpZCwgYnVmX2NvbW0pOworCQlyID0gc3ByaW50ZihidWYsICIlZCAlc1xuIiwgcGlkLCBidWZfY29tbSk7CisJCWJ1ZiArPSByOworCQlsZW4gKz0gcjsKKwl9CisKKwlsZW4gPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjbnQsIHBwb3MsCisJCQkJICAgICAgZmlsZV9idWYsIGxlbik7CisKKwlrZnJlZShmaWxlX2J1Zik7CisJa2ZyZWUoYnVmX2NvbW0pOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2luZ19zYXZlZF9jbWRsaW5lc19mb3BzID0geworICAgIC5vcGVuICAgICAgID0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCisgICAgLnJlYWQgICAgICAgPSB0cmFjaW5nX3NhdmVkX2NtZGxpbmVzX3JlYWQsCit9OworCitzdGF0aWMgc3NpemVfdAogdHJhY2luZ19jdHJsX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLAogCQkgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTI3MjgsNiArMjgyNiw5IEBACiAJLyogdHJhY2UgcGlwZSBkb2VzIG5vdCBzaG93IHN0YXJ0IG9mIGJ1ZmZlciAqLwogCWNwdW1hc2tfc2V0YWxsKGl0ZXItPnN0YXJ0ZWQpOwogCisJaWYgKHRyYWNlX2ZsYWdzICYgVFJBQ0VfSVRFUl9MQVRFTkNZX0ZNVCkKKwkJaXRlci0+aXRlcl9mbGFncyB8PSBUUkFDRV9GSUxFX0xBVF9GTVQ7CisKIAlpdGVyLT5jcHVfZmlsZSA9IGNwdV9maWxlOwogCWl0ZXItPnRyID0gJmdsb2JhbF90cmFjZTsKIAltdXRleF9pbml0KCZpdGVyLT5tdXRleCk7CkBAIC0yOTE1LDYgKzMwMTYsNyBAQAogCSAgICAgICBvZmZzZXRvZihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IsIHNlcSkpOwogCWl0ZXItPnBvcyA9IC0xOwogCisJdHJhY2VfZXZlbnRfcmVhZF9sb2NrKCk7CiAJd2hpbGUgKGZpbmRfbmV4dF9lbnRyeV9pbmMoaXRlcikgIT0gTlVMTCkgewogCQllbnVtIHByaW50X2xpbmVfdCByZXQ7CiAJCWludCBsZW4gPSBpdGVyLT5zZXEubGVuOwpAQCAtMjkzMSw2ICszMDMzLDcgQEAKIAkJaWYgKGl0ZXItPnNlcS5sZW4gPj0gY250KQogCQkJYnJlYWs7CiAJfQorCXRyYWNlX2V2ZW50X3JlYWRfdW5sb2NrKCk7CiAKIAkvKiBOb3cgY29weSB3aGF0IHdlIGhhdmUgdG8gdGhlIHVzZXIgKi8KIAlzcmV0ID0gdHJhY2Vfc2VxX3RvX3VzZXIoJml0ZXItPnNlcSwgdWJ1ZiwgY250KTsKQEAgLTMwNTMsNiArMzE1Niw4IEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKKwl0cmFjZV9ldmVudF9yZWFkX2xvY2soKTsKKwogCS8qIEZpbGwgYXMgbWFueSBwYWdlcyBhcyBwb3NzaWJsZS4gKi8KIAlmb3IgKGkgPSAwLCByZW0gPSBsZW47IGkgPCBQSVBFX0JVRkZFUlMgJiYgcmVtOyBpKyspIHsKIAkJcGFnZXNbaV0gPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOwpAQCAtMzA3NSw2ICszMTgwLDcgQEAKIAkJdHJhY2Vfc2VxX2luaXQoJml0ZXItPnNlcSk7CiAJfQogCisJdHJhY2VfZXZlbnRfcmVhZF91bmxvY2soKTsKIAltdXRleF91bmxvY2soJml0ZXItPm11dGV4KTsKIAogCXNwZC5ucl9wYWdlcyA9IGk7CkBAIC0zNDI1LDcgKzM1MzEsNyBAQAogCQkuc3BkX3JlbGVhc2UJPSBidWZmZXJfc3BkX3JlbGVhc2UsCiAJfTsKIAlzdHJ1Y3QgYnVmZmVyX3JlZiAqcmVmOwotCWludCBzaXplLCBpOworCWludCBlbnRyaWVzLCBzaXplLCBpOwogCXNpemVfdCByZXQ7CiAKIAlpZiAoKnBwb3MgJiAoUEFHRV9TSVpFIC0gMSkpIHsKQEAgLTM0NDAsNyArMzU0Niw5IEBACiAJCWxlbiAmPSBQQUdFX01BU0s7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFBJUEVfQlVGRkVSUyAmJiBsZW47IGkrKywgbGVuIC09IFBBR0VfU0laRSkgeworCWVudHJpZXMgPSByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdShpbmZvLT50ci0+YnVmZmVyLCBpbmZvLT5jcHUpOworCisJZm9yIChpID0gMDsgaSA8IFBJUEVfQlVGRkVSUyAmJiBsZW4gJiYgZW50cmllczsgaSsrLCBsZW4gLT0gUEFHRV9TSVpFKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlOwogCQlpbnQgcjsKIApAQCAtMzQ1Nyw3ICszNTY1LDcgQEAKIAkJfQogCiAJCXIgPSByaW5nX2J1ZmZlcl9yZWFkX3BhZ2UocmVmLT5idWZmZXIsICZyZWYtPnBhZ2UsCi0JCQkJCSAgbGVuLCBpbmZvLT5jcHUsIDApOworCQkJCQkgIGxlbiwgaW5mby0+Y3B1LCAxKTsKIAkJaWYgKHIgPCAwKSB7CiAJCQlyaW5nX2J1ZmZlcl9mcmVlX3JlYWRfcGFnZShyZWYtPmJ1ZmZlciwKIAkJCQkJCSAgIHJlZi0+cGFnZSk7CkBAIC0zNDgxLDYgKzM1ODksOCBAQAogCQlzcGQucGFydGlhbFtpXS5wcml2YXRlID0gKHVuc2lnbmVkIGxvbmcpcmVmOwogCQlzcGQubnJfcGFnZXMrKzsKIAkJKnBwb3MgKz0gUEFHRV9TSVpFOworCisJCWVudHJpZXMgPSByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdShpbmZvLT50ci0+YnVmZmVyLCBpbmZvLT5jcHUpOwogCX0KIAogCXNwZC5ucl9wYWdlcyA9IGk7CkBAIC0zNTA4LDYgKzM2MTgsNDUgQEAKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIH07CiAKK3N0YXRpYyBzc2l6ZV90Cit0cmFjaW5nX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLAorCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBsb25nIGNwdSA9ICh1bnNpZ25lZCBsb25nKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyID0gJmdsb2JhbF90cmFjZTsKKwlzdHJ1Y3QgdHJhY2Vfc2VxICpzOworCXVuc2lnbmVkIGxvbmcgY250OworCisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzKQorCQlyZXR1cm4gRU5PTUVNOworCisJdHJhY2Vfc2VxX2luaXQocyk7CisKKwljbnQgPSByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdSh0ci0+YnVmZmVyLCBjcHUpOworCXRyYWNlX3NlcV9wcmludGYocywgImVudHJpZXM6ICVsZFxuIiwgY250KTsKKworCWNudCA9IHJpbmdfYnVmZmVyX292ZXJydW5fY3B1KHRyLT5idWZmZXIsIGNwdSk7CisJdHJhY2Vfc2VxX3ByaW50ZihzLCAib3ZlcnJ1bjogJWxkXG4iLCBjbnQpOworCisJY250ID0gcmluZ19idWZmZXJfY29tbWl0X292ZXJydW5fY3B1KHRyLT5idWZmZXIsIGNwdSk7CisJdHJhY2Vfc2VxX3ByaW50ZihzLCAiY29tbWl0IG92ZXJydW46ICVsZFxuIiwgY250KTsKKworCWNudCA9IHJpbmdfYnVmZmVyX25taV9kcm9wcGVkX2NwdSh0ci0+YnVmZmVyLCBjcHUpOworCXRyYWNlX3NlcV9wcmludGYocywgIm5taSBkcm9wcGVkOiAlbGRcbiIsIGNudCk7CisKKwljb3VudCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNvdW50LCBwcG9zLCBzLT5idWZmZXIsIHMtPmxlbik7CisKKwlrZnJlZShzKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhY2luZ19zdGF0c19mb3BzID0geworCS5vcGVuCQk9IHRyYWNpbmdfb3Blbl9nZW5lcmljLAorCS5yZWFkCQk9IHRyYWNpbmdfc3RhdHNfcmVhZCwKK307CisKICNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UKIAogaW50IF9fd2VhayBmdHJhY2VfYXJjaF9yZWFkX2R5bl9pbmZvKGNoYXIgKmJ1ZiwgaW50IHNpemUpCkBAIC0zNTk3LDcgKzM3NDYsNyBAQAogc3RhdGljIHZvaWQgdHJhY2luZ19pbml0X2RlYnVnZnNfcGVyY3B1KGxvbmcgY3B1KQogewogCXN0cnVjdCBkZW50cnkgKmRfcGVyY3B1ID0gdHJhY2luZ19kZW50cnlfcGVyY3B1KCk7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnksICpkX2NwdTsKKwlzdHJ1Y3QgZGVudHJ5ICpkX2NwdTsKIAkvKiBzdHJsZW4oY3B1KSArIE1BWChsb2cxMChjcHUpKSArICdcMCcgKi8KIAljaGFyIGNwdV9kaXJbN107CiAKQEAgLTM2MTIsMjEgKzM3NjEsMTggQEAKIAl9CiAKIAkvKiBwZXIgY3B1IHRyYWNlX3BpcGUgKi8KLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNlX3BpcGUiLCAwNDQ0LCBkX2NwdSwKLQkJCQkodm9pZCAqKSBjcHUsICZ0cmFjaW5nX3BpcGVfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICd0cmFjZV9waXBlJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNlX3BpcGUiLCAwNDQ0LCBkX2NwdSwKKwkJCSh2b2lkICopIGNwdSwgJnRyYWNpbmdfcGlwZV9mb3BzKTsKIAogCS8qIHBlciBjcHUgdHJhY2UgKi8KLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNlIiwgMDY0NCwgZF9jcHUsCi0JCQkJKHZvaWQgKikgY3B1LCAmdHJhY2luZ19mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ3RyYWNlJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNlIiwgMDY0NCwgZF9jcHUsCisJCQkodm9pZCAqKSBjcHUsICZ0cmFjaW5nX2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0cmFjZV9waXBlX3JhdyIsIDA0NDQsIGRfY3B1LAotCQkJCSAgICAodm9pZCAqKSBjcHUsICZ0cmFjaW5nX2J1ZmZlcnNfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICd0cmFjZV9waXBlX3JhdycgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjZV9waXBlX3JhdyIsIDA0NDQsIGRfY3B1LAorCQkJKHZvaWQgKikgY3B1LCAmdHJhY2luZ19idWZmZXJzX2ZvcHMpOworCisJdHJhY2VfY3JlYXRlX2ZpbGUoInN0YXRzIiwgMDQ0NCwgZF9jcHUsCisJCQkodm9pZCAqKSBjcHUsICZ0cmFjaW5nX3N0YXRzX2ZvcHMpOwogfQogCiAjaWZkZWYgQ09ORklHX0ZUUkFDRV9TRUxGVEVTVApAQCAtMzc4Miw2ICszOTI4LDIyIEBACiAJLndyaXRlID0gdHJhY2Vfb3B0aW9uc19jb3JlX3dyaXRlLAogfTsKIAorc3RydWN0IGRlbnRyeSAqdHJhY2VfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgbW9kZV90IG1vZGUsCisJCQkJIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkgdm9pZCAqZGF0YSwKKwkJCQkgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyZXQ7CisKKwlyZXQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgZGF0YSwgZm9wcyk7CisJaWYgKCFyZXQpCisJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnJXMnIGVudHJ5XG4iLCBuYW1lKTsKKworCXJldHVybiByZXQ7Cit9CisKKwogc3RhdGljIHN0cnVjdCBkZW50cnkgKnRyYWNlX29wdGlvbnNfaW5pdF9kZW50cnkodm9pZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcjsKQEAgLTM4MDksNyArMzk3MSw2IEBACiAJCQkgc3RydWN0IHRyYWNlcl9vcHQgKm9wdCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICp0X29wdGlvbnM7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7CiAKIAl0X29wdGlvbnMgPSB0cmFjZV9vcHRpb25zX2luaXRfZGVudHJ5KCk7CiAJaWYgKCF0X29wdGlvbnMpCkBAIC0zODE4LDExICszOTc5LDkgQEAKIAl0b3B0LT5mbGFncyA9IGZsYWdzOwogCXRvcHQtPm9wdCA9IG9wdDsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShvcHQtPm5hbWUsIDA2NDQsIHRfb3B0aW9ucywgdG9wdCwKKwl0b3B0LT5lbnRyeSA9IHRyYWNlX2NyZWF0ZV9maWxlKG9wdC0+bmFtZSwgMDY0NCwgdF9vcHRpb25zLCB0b3B0LAogCQkJCSAgICAmdHJhY2Vfb3B0aW9uc19mb3BzKTsKIAotCXRvcHQtPmVudHJ5ID0gZW50cnk7Ci0KIH0KIAogc3RhdGljIHN0cnVjdCB0cmFjZV9vcHRpb25fZGVudHJ5ICoKQEAgLTM4NzcsMTIzICs0MDM2LDg0IEBACiBjcmVhdGVfdHJhY2Vfb3B0aW9uX2NvcmVfZmlsZShjb25zdCBjaGFyICpvcHRpb24sIGxvbmcgaW5kZXgpCiB7CiAJc3RydWN0IGRlbnRyeSAqdF9vcHRpb25zOwotCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCiAJdF9vcHRpb25zID0gdHJhY2Vfb3B0aW9uc19pbml0X2RlbnRyeSgpOwogCWlmICghdF9vcHRpb25zKQogCQlyZXR1cm4gTlVMTDsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZShvcHRpb24sIDA2NDQsIHRfb3B0aW9ucywgKHZvaWQgKilpbmRleCwKKwlyZXR1cm4gdHJhY2VfY3JlYXRlX2ZpbGUob3B0aW9uLCAwNjQ0LCB0X29wdGlvbnMsICh2b2lkICopaW5kZXgsCiAJCQkJICAgICZ0cmFjZV9vcHRpb25zX2NvcmVfZm9wcyk7Ci0KLQlyZXR1cm4gZW50cnk7CiB9CiAKIHN0YXRpYyBfX2luaXQgdm9pZCBjcmVhdGVfdHJhY2Vfb3B0aW9uc19kaXIodm9pZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICp0X29wdGlvbnM7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7CiAJaW50IGk7CiAKIAl0X29wdGlvbnMgPSB0cmFjZV9vcHRpb25zX2luaXRfZGVudHJ5KCk7CiAJaWYgKCF0X29wdGlvbnMpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IHRyYWNlX29wdGlvbnNbaV07IGkrKykgewotCQllbnRyeSA9IGNyZWF0ZV90cmFjZV9vcHRpb25fY29yZV9maWxlKHRyYWNlX29wdGlvbnNbaV0sIGkpOwotCQlpZiAoIWVudHJ5KQotCQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICVzIGVudHJ5XG4iLAotCQkJCSAgIHRyYWNlX29wdGlvbnNbaV0pOwotCX0KKwlmb3IgKGkgPSAwOyB0cmFjZV9vcHRpb25zW2ldOyBpKyspCisJCWNyZWF0ZV90cmFjZV9vcHRpb25fY29yZV9maWxlKHRyYWNlX29wdGlvbnNbaV0sIGkpOwogfQogCiBzdGF0aWMgX19pbml0IGludCB0cmFjZXJfaW5pdF9kZWJ1Z2ZzKHZvaWQpCiB7CiAJc3RydWN0IGRlbnRyeSAqZF90cmFjZXI7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7CiAJaW50IGNwdTsKIAogCWRfdHJhY2VyID0gdHJhY2luZ19pbml0X2RlbnRyeSgpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0cmFjaW5nX2VuYWJsZWQiLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgJmdsb2JhbF90cmFjZSwgJnRyYWNpbmdfY3RybF9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ3RyYWNpbmdfZW5hYmxlZCcgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjaW5nX2VuYWJsZWQiLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSZnbG9iYWxfdHJhY2UsICZ0cmFjaW5nX2N0cmxfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNlX29wdGlvbnMiLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgTlVMTCwgJnRyYWNpbmdfaXRlcl9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ3RyYWNlX29wdGlvbnMnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgidHJhY2Vfb3B0aW9ucyIsIDA2NDQsIGRfdHJhY2VyLAorCQkJTlVMTCwgJnRyYWNpbmdfaXRlcl9mb3BzKTsKIAotCWNyZWF0ZV90cmFjZV9vcHRpb25zX2RpcigpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjaW5nX2NwdW1hc2siLCAwNjQ0LCBkX3RyYWNlciwKKwkJCU5VTEwsICZ0cmFjaW5nX2NwdW1hc2tfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNpbmdfY3B1bWFzayIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICBOVUxMLCAmdHJhY2luZ19jcHVtYXNrX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAndHJhY2luZ19jcHVtYXNrJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNlIiwgMDY0NCwgZF90cmFjZXIsCisJCQkodm9pZCAqKSBUUkFDRV9QSVBFX0FMTF9DUFUsICZ0cmFjaW5nX2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0cmFjZSIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAodm9pZCAqKSBUUkFDRV9QSVBFX0FMTF9DUFUsICZ0cmFjaW5nX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAndHJhY2UnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgiYXZhaWxhYmxlX3RyYWNlcnMiLCAwNDQ0LCBkX3RyYWNlciwKKwkJCSZnbG9iYWxfdHJhY2UsICZzaG93X3RyYWNlc19mb3BzKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXZhaWxhYmxlX3RyYWNlcnMiLCAwNDQ0LCBkX3RyYWNlciwKLQkJCQkgICAgJmdsb2JhbF90cmFjZSwgJnNob3dfdHJhY2VzX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnYXZhaWxhYmxlX3RyYWNlcnMnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgiY3VycmVudF90cmFjZXIiLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSZnbG9iYWxfdHJhY2UsICZzZXRfdHJhY2VyX2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjdXJyZW50X3RyYWNlciIsIDA0NDQsIGRfdHJhY2VyLAotCQkJCSAgICAmZ2xvYmFsX3RyYWNlLCAmc2V0X3RyYWNlcl9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ2N1cnJlbnRfdHJhY2VyJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNpbmdfbWF4X2xhdGVuY3kiLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSZ0cmFjaW5nX21heF9sYXRlbmN5LCAmdHJhY2luZ19tYXhfbGF0X2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0cmFjaW5nX21heF9sYXRlbmN5IiwgMDY0NCwgZF90cmFjZXIsCi0JCQkJICAgICZ0cmFjaW5nX21heF9sYXRlbmN5LAotCQkJCSAgICAmdHJhY2luZ19tYXhfbGF0X2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCi0JCQkgICAiJ3RyYWNpbmdfbWF4X2xhdGVuY3knIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgidHJhY2luZ190aHJlc2giLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSZ0cmFjaW5nX3RocmVzaCwgJnRyYWNpbmdfbWF4X2xhdF9mb3BzKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2luZ190aHJlc2giLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgJnRyYWNpbmdfdGhyZXNoLCAmdHJhY2luZ19tYXhfbGF0X2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCi0JCQkgICAiJ3RyYWNpbmdfdGhyZXNoJyBlbnRyeVxuIik7Ci0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJSRUFETUUiLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgTlVMTCwgJnRyYWNpbmdfcmVhZG1lX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnUkVBRE1FJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoIlJFQURNRSIsIDA0NDQsIGRfdHJhY2VyLAorCQkJTlVMTCwgJnRyYWNpbmdfcmVhZG1lX2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0cmFjZV9waXBlIiwgMDQ0NCwgZF90cmFjZXIsCisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNlX3BpcGUiLCAwNDQ0LCBkX3RyYWNlciwKIAkJCSh2b2lkICopIFRSQUNFX1BJUEVfQUxMX0NQVSwgJnRyYWNpbmdfcGlwZV9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIid0cmFjZV9waXBlJyBlbnRyeVxuIik7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImJ1ZmZlcl9zaXplX2tiIiwgMDY0NCwgZF90cmFjZXIsCi0JCQkJICAgICZnbG9iYWxfdHJhY2UsICZ0cmFjaW5nX2VudHJpZXNfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICInYnVmZmVyX3NpemVfa2InIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgiYnVmZmVyX3NpemVfa2IiLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSZnbG9iYWxfdHJhY2UsICZ0cmFjaW5nX2VudHJpZXNfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNlX21hcmtlciIsIDAyMjAsIGRfdHJhY2VyLAotCQkJCSAgICBOVUxMLCAmdHJhY2luZ19tYXJrX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCi0JCQkgICAiJ3RyYWNlX21hcmtlcicgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjZV9tYXJrZXIiLCAwMjIwLCBkX3RyYWNlciwKKwkJCU5VTEwsICZ0cmFjaW5nX21hcmtfZm9wcyk7CisKKwl0cmFjZV9jcmVhdGVfZmlsZSgic2F2ZWRfY21kbGluZXMiLCAwNDQ0LCBkX3RyYWNlciwKKwkJCU5VTEwsICZ0cmFjaW5nX3NhdmVkX2NtZGxpbmVzX2ZvcHMpOwogCiAjaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkeW5fZnRyYWNlX3RvdGFsX2luZm8iLCAwNDQ0LCBkX3RyYWNlciwKLQkJCQkgICAgJmZ0cmFjZV91cGRhdGVfdG90X2NudCwKLQkJCQkgICAgJnRyYWNpbmdfZHluX2luZm9fZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICInZHluX2Z0cmFjZV90b3RhbF9pbmZvJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoImR5bl9mdHJhY2VfdG90YWxfaW5mbyIsIDA0NDQsIGRfdHJhY2VyLAorCQkJJmZ0cmFjZV91cGRhdGVfdG90X2NudCwgJnRyYWNpbmdfZHluX2luZm9fZm9wcyk7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfU1lTUFJPRl9UUkFDRVIKIAlpbml0X3RyYWNlcl9zeXNwcm9mX2RlYnVnZnMoZF90cmFjZXIpOwogI2VuZGlmCiAKKwljcmVhdGVfdHJhY2Vfb3B0aW9uc19kaXIoKTsKKwogCWZvcl9lYWNoX3RyYWNpbmdfY3B1KGNwdSkKIAkJdHJhY2luZ19pbml0X2RlYnVnZnNfcGVyY3B1KGNwdSk7CiAKQEAgLTQwNjQsNyArNDE4NCw4IEBACiAKIHN0YXRpYyB2b2lkIF9fZnRyYWNlX2R1bXAoYm9vbCBkaXNhYmxlX3RyYWNpbmcpCiB7Ci0Jc3RhdGljIERFRklORV9TUElOTE9DSyhmdHJhY2VfZHVtcF9sb2NrKTsKKwlzdGF0aWMgcmF3X3NwaW5sb2NrX3QgZnRyYWNlX2R1bXBfbG9jayA9CisJCShyYXdfc3BpbmxvY2tfdClfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQ7CiAJLyogdXNlIHN0YXRpYyBiZWNhdXNlIGl0ZXIgY2FuIGJlIGEgYml0IGJpZyBmb3IgdGhlIHN0YWNrICovCiAJc3RhdGljIHN0cnVjdCB0cmFjZV9pdGVyYXRvciBpdGVyOwogCXVuc2lnbmVkIGludCBvbGRfdXNlcm9iajsKQEAgLTQwNzMsNyArNDE5NCw4IEBACiAJaW50IGNudCA9IDAsIGNwdTsKIAogCS8qIG9ubHkgb25lIGR1bXAgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZnRyYWNlX2R1bXBfbG9jaywgZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX3Jhd19zcGluX2xvY2soJmZ0cmFjZV9kdW1wX2xvY2spOwogCWlmIChkdW1wX3JhbikKIAkJZ290byBvdXQ7CiAKQEAgLTQxNDUsNyArNDI2Nyw4IEBACiAJfQogCiAgb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZ0cmFjZV9kdW1wX2xvY2ssIGZsYWdzKTsKKwlfX3Jhd19zcGluX3VubG9jaygmZnRyYWNlX2R1bXBfbG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAvKiBCeSBkZWZhdWx0OiBkaXNhYmxlIHRyYWNpbmcgYWZ0ZXIgdGhlIGR1bXAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5oIGIva2VybmVsL3RyYWNlL3RyYWNlLmgKaW5kZXggZTY4NWFjMi4uNmU3MzVkNCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmgKQEAgLTksOSArOSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L21taW90cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPHRyYWNlL2Jvb3QuaD4KLSNpbmNsdWRlIDx0cmFjZS9rbWVtdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtdHJhY2UuaD4KICNpbmNsdWRlIDx0cmFjZS9wb3dlci5oPgogCisjaW5jbHVkZSA8bGludXgvdHJhY2Vfc2VxLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CisKIGVudW0gdHJhY2VfdHlwZSB7CiAJX19UUkFDRV9GSVJTVF9UWVBFID0gMCwKIApAQCAtNDIsMjAgKzQ1LDYgQEAKIH07CiAKIC8qCi0gKiBUaGUgdHJhY2UgZW50cnkgLSB0aGUgbW9zdCBiYXNpYyB1bml0IG9mIHRyYWNpbmcuIFRoaXMgaXMgd2hhdAotICogaXMgcHJpbnRlZCBpbiB0aGUgZW5kIGFzIGEgc2luZ2xlIGxpbmUgaW4gdGhlIHRyYWNlIG91dHB1dCwgc3VjaCBhczoKLSAqCi0gKiAgICAgYmFzaC0xNTgxNiBbMDFdICAgMjM1LjE5NzU4NTogaWRsZV9jcHUgPC0gaXJxX2VudGVyCi0gKi8KLXN0cnVjdCB0cmFjZV9lbnRyeSB7Ci0JdW5zaWduZWQgY2hhcgkJdHlwZTsKLQl1bnNpZ25lZCBjaGFyCQlmbGFnczsKLQl1bnNpZ25lZCBjaGFyCQlwcmVlbXB0X2NvdW50OwotCWludAkJCXBpZDsKLQlpbnQJCQl0Z2lkOwotfTsKLQotLyoKICAqIEZ1bmN0aW9uIHRyYWNlIGVudHJ5IC0gZnVuY3Rpb24gYWRkcmVzcyBhbmQgcGFyZW50IGZ1bmN0aW9uIGFkZHJlczoKICAqLwogc3RydWN0IGZ0cmFjZV9lbnRyeSB7CkBAIC0yNjMsOCArMjUyLDYgQEAKIAljaGFyCQkJY29tbVtUQVNLX0NPTU1fTEVOXTsKIH07CiAKLXN0cnVjdCB0cmFjZV9pdGVyYXRvcjsKLQogLyoKICAqIFRoZSB0cmFjZSBhcnJheSAtIGFuIGFycmF5IG9mIHBlci1DUFUgdHJhY2UgYXJyYXlzLiBUaGlzIGlzIHRoZQogICogaGlnaGVzdCBsZXZlbCBkYXRhIHN0cnVjdHVyZSB0aGF0IGluZGl2aWR1YWwgdHJhY2VycyBkZWFsIHdpdGguCkBAIC0zMzksMTUgKzMyNiw2IEBACiAJCV9fZnRyYWNlX2JhZF90eXBlKCk7CQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotLyogUmV0dXJuIHZhbHVlcyBmb3IgcHJpbnRfbGluZSBjYWxsYmFjayAqLwotZW51bSBwcmludF9saW5lX3QgewotCVRSQUNFX1RZUEVfUEFSVElBTF9MSU5FCT0gMCwJLyogUmV0cnkgYWZ0ZXIgZmx1c2hpbmcgdGhlIHNlcSAqLwotCVRSQUNFX1RZUEVfSEFORExFRAk9IDEsCi0JVFJBQ0VfVFlQRV9VTkhBTkRMRUQJPSAyLAkvKiBSZWxheSB0byBvdGhlciBvdXRwdXQgZnVuY3Rpb25zICovCi0JVFJBQ0VfVFlQRV9OT19DT05TVU1FCT0gMwkvKiBIYW5kbGVkIGJ1dCBhc2sgdG8gbm90IGNvbnN1bWUgKi8KLX07Ci0KLQogLyoKICAqIEFuIG9wdGlvbiBzcGVjaWZpYyB0byBhIHRyYWNlci4gVGhpcyBpcyBhIGJvb2xlYW4gdmFsdWUuCiAgKiBUaGUgYml0IGlzIHRoZSBiaXQgaW5kZXggdGhhdCBzZXRzIGl0cyB2YWx1ZSBvbiB0aGUKQEAgLTQyMyw2MCArNDAxLDMwIEBACiAJc3RydWN0IHRyYWNlcl9zdGF0CSpzdGF0czsKIH07CiAKLXN0cnVjdCB0cmFjZV9zZXEgewotCXVuc2lnbmVkIGNoYXIJCWJ1ZmZlcltQQUdFX1NJWkVdOwotCXVuc2lnbmVkIGludAkJbGVuOwotCXVuc2lnbmVkIGludAkJcmVhZHBvczsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotdHJhY2Vfc2VxX2luaXQoc3RydWN0IHRyYWNlX3NlcSAqcykKLXsKLQlzLT5sZW4gPSAwOwotCXMtPnJlYWRwb3MgPSAwOwotfQotCiAKICNkZWZpbmUgVFJBQ0VfUElQRV9BTExfQ1BVCS0xCiAKLS8qCi0gKiBUcmFjZSBpdGVyYXRvciAtIHVzZWQgYnkgcHJpbnRvdXQgcm91dGluZXMgd2hvIHByZXNlbnQgdHJhY2UKLSAqIHJlc3VsdHMgdG8gdXNlcnMgYW5kIHdoaWNoIHJvdXRpbmVzIG1pZ2h0IHNsZWVwLCBldGM6Ci0gKi8KLXN0cnVjdCB0cmFjZV9pdGVyYXRvciB7Ci0Jc3RydWN0IHRyYWNlX2FycmF5CSp0cjsKLQlzdHJ1Y3QgdHJhY2VyCQkqdHJhY2U7Ci0Jdm9pZAkJCSpwcml2YXRlOwotCWludAkJCWNwdV9maWxlOwotCXN0cnVjdCBtdXRleAkJbXV0ZXg7Ci0Jc3RydWN0IHJpbmdfYnVmZmVyX2l0ZXIJKmJ1ZmZlcl9pdGVyW05SX0NQVVNdOwotCi0JLyogVGhlIGJlbG93IGlzIHplcm9lZCBvdXQgaW4gcGlwZV9yZWFkICovCi0Jc3RydWN0IHRyYWNlX3NlcQlzZXE7Ci0Jc3RydWN0IHRyYWNlX2VudHJ5CSplbnQ7Ci0JaW50CQkJY3B1OwotCXU2NAkJCXRzOwotCi0JdW5zaWduZWQgbG9uZwkJaXRlcl9mbGFnczsKLQlsb2ZmX3QJCQlwb3M7Ci0JbG9uZwkJCWlkeDsKLQotCWNwdW1hc2tfdmFyX3QJCXN0YXJ0ZWQ7Ci19OwotCiBpbnQgdHJhY2VyX2luaXQoc3RydWN0IHRyYWNlciAqdCwgc3RydWN0IHRyYWNlX2FycmF5ICp0cik7CiBpbnQgdHJhY2luZ19pc19lbmFibGVkKHZvaWQpOwogdm9pZCB0cmFjZV93YWtlX3VwKHZvaWQpOwogdm9pZCB0cmFjaW5nX3Jlc2V0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsIGludCBjcHUpOwogdm9pZCB0cmFjaW5nX3Jlc2V0X29ubGluZV9jcHVzKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpOwordm9pZCB0cmFjaW5nX3Jlc2V0X2N1cnJlbnQoaW50IGNwdSk7Cit2b2lkIHRyYWNpbmdfcmVzZXRfY3VycmVudF9vbmxpbmVfY3B1cyh2b2lkKTsKIGludCB0cmFjaW5nX29wZW5fZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdHJ1Y3QgZGVudHJ5ICp0cmFjZV9jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLAorCQkJCSBtb2RlX3QgbW9kZSwKKwkJCQkgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCSB2b2lkICpkYXRhLAorCQkJCSBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKTsKKwogc3RydWN0IGRlbnRyeSAqdHJhY2luZ19pbml0X2RlbnRyeSh2b2lkKTsKIHZvaWQgaW5pdF90cmFjZXJfc3lzcHJvZl9kZWJ1Z2ZzKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKTsKIAogc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50OwogCiBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKnRyYWNlX2J1ZmZlcl9sb2NrX3Jlc2VydmUoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwKLQkJCQkJCSAgICB1bnNpZ25lZCBjaGFyIHR5cGUsCisJCQkJCQkgICAgaW50IHR5cGUsCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQkJCSAgICBpbnQgcGMpOwpAQCAtNDg0LDE0ICs0MzIsNiBAQAogCQkJCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQsCiAJCQkJdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKTsKIAotc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKLXRyYWNlX2N1cnJlbnRfYnVmZmVyX2xvY2tfcmVzZXJ2ZSh1bnNpZ25lZCBjaGFyIHR5cGUsIHVuc2lnbmVkIGxvbmcgbGVuLAotCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKTsKLXZvaWQgdHJhY2VfY3VycmVudF9idWZmZXJfdW5sb2NrX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50LAotCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwotdm9pZCB0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCwKLQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKTsKLQogc3RydWN0IHRyYWNlX2VudHJ5ICp0cmFjaW5nX2dldF90cmFjZV9lbnRyeShzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLAogCQkJCQkJc3RydWN0IHRyYWNlX2FycmF5X2NwdSAqZGF0YSk7CiAKQEAgLTUxNCw3ICs0NTQsNiBAQAogCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsCiAJCQkJdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKTsKLXZvaWQgdHJhY2luZ19yZWNvcmRfY21kbGluZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKIHZvaWQgdHJhY2luZ19zY2hlZF93YWtldXBfdHJhY2Uoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwKIAkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKndha2VlLApAQCAtNTk5LDYgKzUzOCw4IEBACiAJCQkJCSAgICAgICBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKTsKIGV4dGVybiBpbnQgdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9icmFuY2goc3RydWN0IHRyYWNlciAqdHJhY2UsCiAJCQkJCSBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9od19icmFuY2hlcyhzdHJ1Y3QgdHJhY2VyICp0cmFjZSwKKwkJCQkJICAgICAgc3RydWN0IHRyYWNlX2FycmF5ICp0cik7CiAjZW5kaWYgLyogQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgKi8KIAogZXh0ZXJuIHZvaWQgKmhlYWRfcGFnZShzdHJ1Y3QgdHJhY2VfYXJyYXlfY3B1ICpkYXRhKTsKQEAgLTYxMyw2ICs1NTQsOCBAQAogLyogU3RhbmRhcmQgb3V0cHV0IGZvcm1hdHRpbmcgZnVuY3Rpb24gdXNlZCBmb3IgZnVuY3Rpb24gcmV0dXJuIHRyYWNlcyAqLwogI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKIGV4dGVybiBlbnVtIHByaW50X2xpbmVfdCBwcmludF9ncmFwaF9mdW5jdGlvbihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOworZXh0ZXJuIGVudW0gcHJpbnRfbGluZV90Cit0cmFjZV9wcmludF9ncmFwaF9kdXJhdGlvbih1bnNpZ25lZCBsb25nIGxvbmcgZHVyYXRpb24sIHN0cnVjdCB0cmFjZV9zZXEgKnMpOwogCiAjaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCiAvKiBUT0RPOiBtYWtlIHRoaXMgdmFyaWFibGUgKi8KQEAgLTY0NCw3ICs1ODcsNiBAQAogCXJldHVybiAxOwogfQogI2VuZGlmIC8qIENPTkZJR19EWU5BTUlDX0ZUUkFDRSAqLwotCiAjZWxzZSAvKiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSICovCiBzdGF0aWMgaW5saW5lIGVudW0gcHJpbnRfbGluZV90CiBwcmludF9ncmFwaF9mdW5jdGlvbihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCkBAIC02OTIsNiArNjM0LDcgQEAKIAlUUkFDRV9JVEVSX0xBVEVOQ1lfRk1UCQk9IDB4NDAwMDAsCiAJVFJBQ0VfSVRFUl9HTE9CQUxfQ0xLCQk9IDB4ODAwMDAsCiAJVFJBQ0VfSVRFUl9TTEVFUF9USU1FCQk9IDB4MTAwMDAwLAorCVRSQUNFX0lURVJfR1JBUEhfVElNRQkJPSAweDIwMDAwMCwKIH07CiAKIC8qCkBAIC03OTAsMTAzICs3MzMsMTEzIEBACiAJY2hhcgkJCSp0eXBlOwogCWludAkJCW9mZnNldDsKIAlpbnQJCQlzaXplOworCWludAkJCWlzX3NpZ25lZDsKIH07CiAKLXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCB7Ci0JY2hhcgkJCSpuYW1lOwotCWNoYXIJCQkqc3lzdGVtOwotCXN0cnVjdCBkZW50cnkJCSpkaXI7Ci0JaW50CQkJZW5hYmxlZDsKLQlpbnQJCQkoKnJlZ2Z1bmMpKHZvaWQpOwotCXZvaWQJCQkoKnVucmVnZnVuYykodm9pZCk7Ci0JaW50CQkJaWQ7Ci0JaW50CQkJKCpyYXdfaW5pdCkodm9pZCk7Ci0JaW50CQkJKCpzaG93X2Zvcm1hdCkoc3RydWN0IHRyYWNlX3NlcSAqcyk7Ci0JaW50CQkJKCpkZWZpbmVfZmllbGRzKSh2b2lkKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWZpZWxkczsKK3N0cnVjdCBldmVudF9maWx0ZXIgeworCWludAkJCW5fcHJlZHM7CiAJc3RydWN0IGZpbHRlcl9wcmVkCSoqcHJlZHM7Ci0KLSNpZmRlZiBDT05GSUdfRVZFTlRfUFJPRklMRQotCWF0b21pY190CXByb2ZpbGVfY291bnQ7Ci0JaW50CQkoKnByb2ZpbGVfZW5hYmxlKShzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKik7Ci0Jdm9pZAkJKCpwcm9maWxlX2Rpc2FibGUpKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqKTsKLSNlbmRpZgorCWNoYXIJCQkqZmlsdGVyX3N0cmluZzsKIH07CiAKIHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAljb25zdCBjaGFyCQkqbmFtZTsKIAlzdHJ1Y3QgZGVudHJ5CQkqZW50cnk7Ci0Jc3RydWN0IGZpbHRlcl9wcmVkCSoqcHJlZHM7CisJdm9pZAkJCSpmaWx0ZXI7CiB9OwogCi0jZGVmaW5lIGV2ZW50c19mb3JfZWFjaChldmVudCkJCQkJCQlcCi0JZm9yIChldmVudCA9IF9fc3RhcnRfZnRyYWNlX2V2ZW50czsJCQkJXAotCSAgICAgKHVuc2lnbmVkIGxvbmcpZXZlbnQgPCAodW5zaWduZWQgbG9uZylfX3N0b3BfZnRyYWNlX2V2ZW50czsgXAotCSAgICAgZXZlbnQrKykKLQotI2RlZmluZSBNQVhfRklMVEVSX1BSRUQgOAotCiBzdHJ1Y3QgZmlsdGVyX3ByZWQ7CiAKLXR5cGVkZWYgaW50ICgqZmlsdGVyX3ByZWRfZm5fdCkgKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQpOwordHlwZWRlZiBpbnQgKCpmaWx0ZXJfcHJlZF9mbl90KSAoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLCB2b2lkICpldmVudCwKKwkJCQkgaW50IHZhbDEsIGludCB2YWwyKTsKIAogc3RydWN0IGZpbHRlcl9wcmVkIHsKIAlmaWx0ZXJfcHJlZF9mbl90IGZuOwogCXU2NCB2YWw7Ci0JY2hhciAqc3RyX3ZhbDsKKwljaGFyIHN0cl92YWxbTUFYX0ZJTFRFUl9TVFJfVkFMXTsKIAlpbnQgc3RyX2xlbjsKIAljaGFyICpmaWVsZF9uYW1lOwogCWludCBvZmZzZXQ7CiAJaW50IG5vdDsKLQlpbnQgb3I7Ci0JaW50IGNvbXBvdW5kOwotCWludCBjbGVhcjsKKwlpbnQgb3A7CisJaW50IHBvcF9uOwogfTsKIAotaW50IHRyYWNlX2RlZmluZV9maWVsZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIGNoYXIgKnR5cGUsCi0JCSAgICAgICBjaGFyICpuYW1lLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBmaWx0ZXJfZnJlZV9wcmVkKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCk7Ci1leHRlcm4gdm9pZCBmaWx0ZXJfcHJpbnRfcHJlZHMoc3RydWN0IGZpbHRlcl9wcmVkICoqcHJlZHMsCitleHRlcm4gdm9pZCBwcmludF9ldmVudF9maWx0ZXIoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLAogCQkJICAgICAgIHN0cnVjdCB0cmFjZV9zZXEgKnMpOwotZXh0ZXJuIGludCBmaWx0ZXJfcGFyc2UoY2hhciAqKnBidWYsIHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCk7Ci1leHRlcm4gaW50IGZpbHRlcl9hZGRfcHJlZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCi0JCQkgICBzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQpOwotZXh0ZXJuIHZvaWQgZmlsdGVyX2ZyZWVfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKTsKLWV4dGVybiBpbnQgZmlsdGVyX21hdGNoX3ByZWRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgdm9pZCAqcmVjKTsKLWV4dGVybiB2b2lkIGZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0pOwotZXh0ZXJuIGludCBmaWx0ZXJfYWRkX3N1YnN5c3RlbV9wcmVkKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSwKLQkJCQkgICAgIHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCk7CitleHRlcm4gaW50IGFwcGx5X2V2ZW50X2ZpbHRlcihzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCisJCQkgICAgICBjaGFyICpmaWx0ZXJfc3RyaW5nKTsKK2V4dGVybiBpbnQgYXBwbHlfc3Vic3lzdGVtX2V2ZW50X2ZpbHRlcihzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0sCisJCQkJCWNoYXIgKmZpbHRlcl9zdHJpbmcpOworZXh0ZXJuIHZvaWQgcHJpbnRfc3Vic3lzdGVtX2V2ZW50X2ZpbHRlcihzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0sCisJCQkJCSBzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKIAotdm9pZCBldmVudF90cmFjZV9wcmludGsodW5zaWduZWQgbG9uZyBpcCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotZXh0ZXJuIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3N0YXJ0X2Z0cmFjZV9ldmVudHNbXTsKLWV4dGVybiBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX19zdG9wX2Z0cmFjZV9ldmVudHNbXTsKK3N0YXRpYyBpbmxpbmUgaW50CitmaWx0ZXJfY2hlY2tfZGlzY2FyZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIHZvaWQgKnJlYywKKwkJICAgICBzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwKKwkJICAgICBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQoreworCWlmICh1bmxpa2VseShjYWxsLT5maWx0ZXJfYWN0aXZlKSAmJiAhZmlsdGVyX21hdGNoX3ByZWRzKGNhbGwsIHJlYykpIHsKKwkJcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQoYnVmZmVyLCBldmVudCk7CisJCXJldHVybiAxOworCX0KIAotI2RlZmluZSBmb3JfZWFjaF9ldmVudChldmVudCkJCQkJCQlcCi0JZm9yIChldmVudCA9IF9fc3RhcnRfZnRyYWNlX2V2ZW50czsJCQkJXAotCSAgICAgKHVuc2lnbmVkIGxvbmcpZXZlbnQgPCAodW5zaWduZWQgbG9uZylfX3N0b3BfZnRyYWNlX2V2ZW50czsgXAotCSAgICAgZXZlbnQrKykKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHR5cGUpCQkJCQlcCitzdGF0aWMgaW50IGZpbHRlcl9wcmVkXyMjdHlwZShzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQsIHZvaWQgKmV2ZW50LAlcCisJCQkgICAgICBpbnQgdmFsMSwgaW50IHZhbDIpCQkJXAorewkJCQkJCQkJCVwKKwl0eXBlICphZGRyID0gKHR5cGUgKikoZXZlbnQgKyBwcmVkLT5vZmZzZXQpOwkJCVwKKwl0eXBlIHZhbCA9ICh0eXBlKXByZWQtPnZhbDsJCQkJCVwKKwlpbnQgbWF0Y2ggPSAwOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJc3dpdGNoIChwcmVkLT5vcCkgewkJCQkJCVwKKwljYXNlIE9QX0xUOgkJCQkJCQlcCisJCW1hdGNoID0gKCphZGRyIDwgdmFsKTsJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwljYXNlIE9QX0xFOgkJCQkJCQlcCisJCW1hdGNoID0gKCphZGRyIDw9IHZhbCk7CQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJY2FzZSBPUF9HVDoJCQkJCQkJXAorCQltYXRjaCA9ICgqYWRkciA+IHZhbCk7CQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJY2FzZSBPUF9HRToJCQkJCQkJXAorCQltYXRjaCA9ICgqYWRkciA+PSB2YWwpOwkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCWRlZmF1bHQ6CQkJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIG1hdGNoOwkJCQkJCQlcCit9CisKKyNkZWZpbmUgREVGSU5FX0VRVUFMSVRZX1BSRUQoc2l6ZSkJCQkJCVwKK3N0YXRpYyBpbnQgZmlsdGVyX3ByZWRfIyNzaXplKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQsCVwKKwkJCSAgICAgIGludCB2YWwxLCBpbnQgdmFsMikJCQlcCit7CQkJCQkJCQkJXAorCXUjI3NpemUgKmFkZHIgPSAodSMjc2l6ZSAqKShldmVudCArIHByZWQtPm9mZnNldCk7CQlcCisJdSMjc2l6ZSB2YWwgPSAodSMjc2l6ZSlwcmVkLT52YWw7CQkJCVwKKwlpbnQgbWF0Y2g7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwltYXRjaCA9ICh2YWwgPT0gKmFkZHIpIF4gcHJlZC0+bm90OwkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIG1hdGNoOwkJCQkJCQlcCit9CisKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggZXZlbnRfbXV0ZXg7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBmdHJhY2VfZXZlbnRzOwogCiBleHRlcm4gY29uc3QgY2hhciAqX19zdGFydF9fX3RyYWNlX2JwcmludGtfZm10W107CiBleHRlcm4gY29uc3QgY2hhciAqX19zdG9wX19fdHJhY2VfYnByaW50a19mbXRbXTsKIAotLyoKLSAqIFRoZSBkb3VibGUgX19idWlsdGluX2NvbnN0YW50X3AgaXMgYmVjYXVzZSBnY2Mgd2lsbCBnaXZlIHVzIGFuIGVycm9yCi0gKiBpZiB3ZSB0cnkgdG8gYWxsb2NhdGUgdGhlIHN0YXRpYyB2YXJpYWJsZSB0byBmbXQgaWYgaXQgaXMgbm90IGEKLSAqIGNvbnN0YW50LiBFdmVuIHdpdGggdGhlIG91dGVyIGlmIHN0YXRlbWVudCBvcHRpbWl6aW5nIG91dC4KLSAqLwotI2RlZmluZSBldmVudF90cmFjZV9wcmludGsoaXAsIGZtdCwgYXJncy4uLikJCQkJXAotZG8gewkJCQkJCQkJCVwKLQlfX3RyYWNlX3ByaW50a19jaGVja19mb3JtYXQoZm10LCAjI2FyZ3MpOwkJCVwKLQl0cmFjaW5nX3JlY29yZF9jbWRsaW5lKGN1cnJlbnQpOwkJCQlcCi0JaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKGZtdCkpIHsJCQkJXAotCQlzdGF0aWMgY29uc3QgY2hhciAqdHJhY2VfcHJpbnRrX2ZtdAkJCVwKLQkJICBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfX3RyYWNlX3ByaW50a19mbXQiKSkpID0JXAotCQkJX19idWlsdGluX2NvbnN0YW50X3AoZm10KSA/IGZtdCA6IE5VTEw7CQlcCi0JCQkJCQkJCQlcCi0JCV9fdHJhY2VfYnByaW50ayhpcCwgdHJhY2VfcHJpbnRrX2ZtdCwgIyNhcmdzKTsJCVwKLQl9IGVsc2UJCQkJCQkJCVwKLQkJX190cmFjZV9wcmludGsoaXAsIGZtdCwgIyNhcmdzKTsJCQlcCi19IHdoaWxlICgwKQorI3VuZGVmIFRSQUNFX0VWRU5UX0ZPUk1BVAorI2RlZmluZSBUUkFDRV9FVkVOVF9GT1JNQVQoY2FsbCwgcHJvdG8sIGFyZ3MsIGZtdCwgdHN0cnVjdCwgdHBmbXQpCVwKKwlleHRlcm4gc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIGV2ZW50XyMjY2FsbDsKKyN1bmRlZiBUUkFDRV9FVkVOVF9GT1JNQVRfTk9GSUxURVIKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRk9STUFUX05PRklMVEVSKGNhbGwsIHByb3RvLCBhcmdzLCBmbXQsIHRzdHJ1Y3QsIHRwZm10KQorI2luY2x1ZGUgInRyYWNlX2V2ZW50X3R5cGVzLmgiCiAKICNlbmRpZiAvKiBfTElOVVhfS0VSTkVMX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ib290LmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfYm9vdC5jCmluZGV4IDdhMzBmYzQuLmEyOWVmMjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ib290LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2Jvb3QuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNpbmNsdWRlICJ0cmFjZS5oIgogI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgpAQCAtNjcsNyArNjgsNyBAQAogCXRyYWNlX2Fzc2lnbl90eXBlKGZpZWxkLCBlbnRyeSk7CiAJY2FsbCA9ICZmaWVsZC0+Ym9vdF9jYWxsOwogCXRzID0gaXRlci0+dHM7Ci0JbnNlY19yZW0gPSBkb19kaXYodHMsIDEwMDAwMDAwMDApOworCW5zZWNfcmVtID0gZG9fZGl2KHRzLCBOU0VDX1BFUl9TRUMpOwogCiAJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiWyU1bGQuJTA5bGRdIGNhbGxpbmcgICVzIEAgJWlcbiIsCiAJCQkodW5zaWduZWQgbG9uZyl0cywgbnNlY19yZW0sIGNhbGwtPmZ1bmMsIGNhbGwtPmNhbGxlcik7CkBAIC05Miw3ICs5Myw3IEBACiAJdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGVudHJ5KTsKIAlpbml0X3JldCA9ICZmaWVsZC0+Ym9vdF9yZXQ7CiAJdHMgPSBpdGVyLT50czsKLQluc2VjX3JlbSA9IGRvX2Rpdih0cywgMTAwMDAwMDAwMCk7CisJbnNlY19yZW0gPSBkb19kaXYodHMsIE5TRUNfUEVSX1NFQyk7CiAKIAlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJbJTVsZC4lMDlsZF0gaW5pdGNhbGwgJXMgIgogCQkJInJldHVybmVkICVkIGFmdGVyICVsbHUgbXNlY3NcbiIsCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfYnJhbmNoLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfYnJhbmNoLmMKaW5kZXggODMzMzcxNS4uN2E3YTlmZCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2JyYW5jaC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9icmFuY2guYwpAQCAtMzAsNiArMzAsNyBAQAogc3RhdGljIHZvaWQKIHByb2JlX2xpa2VseV9jb25kaXRpb24oc3RydWN0IGZ0cmFjZV9icmFuY2hfZGF0YSAqZiwgaW50IHZhbCwgaW50IGV4cGVjdCkKIHsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfYnJhbmNoOwogCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSBicmFuY2hfdHJhY2VyOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IHRyYWNlX2JyYW5jaCAqZW50cnk7CkBAIC03Myw3ICs3NCw4IEBACiAJZW50cnktPmxpbmUgPSBmLT5saW5lOwogCWVudHJ5LT5jb3JyZWN0ID0gdmFsID09IGV4cGVjdDsKIAotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CiAKICBvdXQ6CiAJYXRvbWljX2RlYygmdHItPmRhdGFbY3B1XS0+ZGlzYWJsZWQpOwpAQCAtMjcxLDcgKzI3Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkICphbm5vdGF0ZWRfYnJhbmNoX3N0YXRfc3RhcnQodm9pZCkKK3N0YXRpYyB2b2lkICphbm5vdGF0ZWRfYnJhbmNoX3N0YXRfc3RhcnQoc3RydWN0IHRyYWNlcl9zdGF0ICp0cmFjZSkKIHsKIAlyZXR1cm4gX19zdGFydF9hbm5vdGF0ZWRfYnJhbmNoX3Byb2ZpbGU7CiB9CkBAIC0zNDYsNyArMzQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgKmFsbF9icmFuY2hfc3RhdF9zdGFydCh2b2lkKQorc3RhdGljIHZvaWQgKmFsbF9icmFuY2hfc3RhdF9zdGFydChzdHJ1Y3QgdHJhY2VyX3N0YXQgKnRyYWNlKQogewogCXJldHVybiBfX3N0YXJ0X2JyYW5jaF9wcm9maWxlOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3Byb2ZpbGUuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wcm9maWxlLmMKaW5kZXggMjJjYmE5OS4uNWI1ODk1YSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3Byb2ZpbGUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfcHJvZmlsZS5jCkBAIC0xMCwyMiArMTAsMzAgQEAKIGludCBmdHJhY2VfcHJvZmlsZV9lbmFibGUoaW50IGV2ZW50X2lkKQogewogCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqZXZlbnQ7CisJaW50IHJldCA9IC1FSU5WQUw7CiAKLQlmb3JfZWFjaF9ldmVudChldmVudCkgewotCQlpZiAoZXZlbnQtPmlkID09IGV2ZW50X2lkKQotCQkJcmV0dXJuIGV2ZW50LT5wcm9maWxlX2VuYWJsZShldmVudCk7CisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CisJCWlmIChldmVudC0+aWQgPT0gZXZlbnRfaWQpIHsKKwkJCXJldCA9IGV2ZW50LT5wcm9maWxlX2VuYWJsZShldmVudCk7CisJCQlicmVhazsKKwkJfQogCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKIAotCXJldHVybiAtRUlOVkFMOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgZnRyYWNlX3Byb2ZpbGVfZGlzYWJsZShpbnQgZXZlbnRfaWQpCiB7CiAJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpldmVudDsKIAotCWZvcl9lYWNoX2V2ZW50KGV2ZW50KSB7Ci0JCWlmIChldmVudC0+aWQgPT0gZXZlbnRfaWQpCi0JCQlyZXR1cm4gZXZlbnQtPnByb2ZpbGVfZGlzYWJsZShldmVudCk7CisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CisJCWlmIChldmVudC0+aWQgPT0gZXZlbnRfaWQpIHsKKwkJCWV2ZW50LT5wcm9maWxlX2Rpc2FibGUoZXZlbnQpOworCQkJYnJlYWs7CisJCX0KIAl9CisJbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF90eXBlcy5oIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmgKaW5kZXggZmQ3OGJlZS4uNWUzMmUzNyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmgKQEAgLTU3LDcgKzU3LDcgQEAKIAlUUF9SQVdfRk1UKCIldToldToldSAgPT0rICV1OiV1OiV1IFslMDN1XSIpCiApOwogCi1UUkFDRV9FVkVOVF9GT1JNQVQoc3BlY2lhbCwgVFJBQ0VfU1BFQ0lBTCwgc3BlY2lhbF9lbnRyeSwgaWdub3JlLAorVFJBQ0VfRVZFTlRfRk9STUFUX05PRklMVEVSKHNwZWNpYWwsIFRSQUNFX1NQRUNJQUwsIHNwZWNpYWxfZW50cnksIGlnbm9yZSwKIAlUUkFDRV9TVFJVQ1QoCiAJCVRSQUNFX0ZJRUxEKHVuc2lnbmVkIGxvbmcsIGFyZzEsIGFyZzEpCiAJCVRSQUNFX0ZJRUxEKHVuc2lnbmVkIGxvbmcsIGFyZzIsIGFyZzIpCkBAIC0xMjIsOCArMTIyLDEwIEBACiBUUkFDRV9FVkVOVF9GT1JNQVQoYnJhbmNoLCBUUkFDRV9CUkFOQ0gsIHRyYWNlX2JyYW5jaCwgaWdub3JlLAogCVRSQUNFX1NUUlVDVCgKIAkJVFJBQ0VfRklFTEQodW5zaWduZWQgaW50LCBsaW5lLCBsaW5lKQotCQlUUkFDRV9GSUVMRF9TUEVDSUFMKGNoYXIgZnVuY1tUUkFDRV9GVU5DX1NJWkUrMV0sIGZ1bmMsIGZ1bmMpCi0JCVRSQUNFX0ZJRUxEX1NQRUNJQUwoY2hhciBmaWxlW1RSQUNFX0ZVTkNfU0laRSsxXSwgZmlsZSwgZmlsZSkKKwkJVFJBQ0VfRklFTERfU1BFQ0lBTChjaGFyIGZ1bmNbVFJBQ0VfRlVOQ19TSVpFKzFdLCBmdW5jLAorCQkJCSAgICBUUkFDRV9GVU5DX1NJWkUrMSwgZnVuYykKKwkJVFJBQ0VfRklFTERfU1BFQ0lBTChjaGFyIGZpbGVbVFJBQ0VfRlVOQ19TSVpFKzFdLCBmaWxlLAorCQkJCSAgICBUUkFDRV9GVU5DX1NJWkUrMSwgZmlsZSkKIAkJVFJBQ0VfRklFTEQoY2hhciwgY29ycmVjdCwgY29ycmVjdCkKIAkpLAogCVRQX1JBV19GTVQoIiV1OiVzOiVzICgldSkiKQpAQCAtMTM5LDggKzE0MSw4IEBACiAKIFRSQUNFX0VWRU5UX0ZPUk1BVChwb3dlciwgVFJBQ0VfUE9XRVIsIHRyYWNlX3Bvd2VyLCBpZ25vcmUsCiAJVFJBQ0VfU1RSVUNUKAotCQlUUkFDRV9GSUVMRChrdGltZV90LCBzdGF0ZV9kYXRhLnN0YW1wLCBzdGFtcCkKLQkJVFJBQ0VfRklFTEQoa3RpbWVfdCwgc3RhdGVfZGF0YS5lbmQsIGVuZCkKKwkJVFJBQ0VfRklFTERfU0lHTihrdGltZV90LCBzdGF0ZV9kYXRhLnN0YW1wLCBzdGFtcCwgMSkKKwkJVFJBQ0VfRklFTERfU0lHTihrdGltZV90LCBzdGF0ZV9kYXRhLmVuZCwgZW5kLCAxKQogCQlUUkFDRV9GSUVMRChpbnQsIHN0YXRlX2RhdGEudHlwZSwgdHlwZSkKIAkJVFJBQ0VfRklFTEQoaW50LCBzdGF0ZV9kYXRhLnN0YXRlLCBzdGF0ZSkKIAkpLApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCmluZGV4IDU3NmY0ZmEuLmFhMDhiZTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKQEAgLTgsMTkgKzgsMjUgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSAidHJhY2Vfb3V0cHV0LmgiCiAKICNkZWZpbmUgVFJBQ0VfU1lTVEVNICJUUkFDRV9TWVNURU0iCiAKLXN0YXRpYyBERUZJTkVfTVVURVgoZXZlbnRfbXV0ZXgpOworREVGSU5FX01VVEVYKGV2ZW50X211dGV4KTsKKworTElTVF9IRUFEKGZ0cmFjZV9ldmVudHMpOwogCiBpbnQgdHJhY2VfZGVmaW5lX2ZpZWxkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgY2hhciAqdHlwZSwKLQkJICAgICAgIGNoYXIgKm5hbWUsIGludCBvZmZzZXQsIGludCBzaXplKQorCQkgICAgICAgY2hhciAqbmFtZSwgaW50IG9mZnNldCwgaW50IHNpemUsIGludCBpc19zaWduZWQpCiB7CiAJc3RydWN0IGZ0cmFjZV9ldmVudF9maWVsZCAqZmllbGQ7CiAKQEAgLTM4LDYgKzQ0LDcgQEAKIAogCWZpZWxkLT5vZmZzZXQgPSBvZmZzZXQ7CiAJZmllbGQtPnNpemUgPSBzaXplOworCWZpZWxkLT5pc19zaWduZWQgPSBpc19zaWduZWQ7CiAJbGlzdF9hZGQoJmZpZWxkLT5saW5rLCAmY2FsbC0+ZmllbGRzKTsKIAogCXJldHVybiAwOwpAQCAtNTEsNDcgKzU4LDk0IEBACiAKIAlyZXR1cm4gLUVOT01FTTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRyYWNlX2RlZmluZV9maWVsZCk7CiAKLXN0YXRpYyB2b2lkIGZ0cmFjZV9jbGVhcl9ldmVudHModm9pZCkKKyNpZmRlZiBDT05GSUdfTU9EVUxFUworCitzdGF0aWMgdm9pZCB0cmFjZV9kZXN0cm95X2ZpZWxkcyhzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpCiB7Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gKHZvaWQgKilfX3N0YXJ0X2Z0cmFjZV9ldmVudHM7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9maWVsZCAqZmllbGQsICpuZXh0OwogCi0KLQl3aGlsZSAoKHVuc2lnbmVkIGxvbmcpY2FsbCA8ICh1bnNpZ25lZCBsb25nKV9fc3RvcF9mdHJhY2VfZXZlbnRzKSB7Ci0KLQkJaWYgKGNhbGwtPmVuYWJsZWQpIHsKLQkJCWNhbGwtPmVuYWJsZWQgPSAwOwotCQkJY2FsbC0+dW5yZWdmdW5jKCk7Ci0JCX0KLQkJY2FsbCsrOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmaWVsZCwgbmV4dCwgJmNhbGwtPmZpZWxkcywgbGluaykgeworCQlsaXN0X2RlbCgmZmllbGQtPmxpbmspOworCQlrZnJlZShmaWVsZC0+dHlwZSk7CisJCWtmcmVlKGZpZWxkLT5uYW1lKTsKKwkJa2ZyZWUoZmllbGQpOwogCX0KIH0KIAorI2VuZGlmIC8qIENPTkZJR19NT0RVTEVTICovCisKIHN0YXRpYyB2b2lkIGZ0cmFjZV9ldmVudF9lbmFibGVfZGlzYWJsZShzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCiAJCQkJCWludCBlbmFibGUpCiB7Ci0KIAlzd2l0Y2ggKGVuYWJsZSkgewogCWNhc2UgMDoKIAkJaWYgKGNhbGwtPmVuYWJsZWQpIHsKIAkJCWNhbGwtPmVuYWJsZWQgPSAwOworCQkJdHJhY2luZ19zdG9wX2NtZGxpbmVfcmVjb3JkKCk7CiAJCQljYWxsLT51bnJlZ2Z1bmMoKTsKIAkJfQogCQlicmVhazsKIAljYXNlIDE6CiAJCWlmICghY2FsbC0+ZW5hYmxlZCkgewogCQkJY2FsbC0+ZW5hYmxlZCA9IDE7CisJCQl0cmFjaW5nX3N0YXJ0X2NtZGxpbmVfcmVjb3JkKCk7CiAJCQljYWxsLT5yZWdmdW5jKCk7CiAJCX0KIAkJYnJlYWs7CiAJfQogfQogCitzdGF0aWMgdm9pZCBmdHJhY2VfY2xlYXJfZXZlbnRzKHZvaWQpCit7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsOworCisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKwkJZnRyYWNlX2V2ZW50X2VuYWJsZV9kaXNhYmxlKGNhbGwsIDApOworCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKK30KKworLyoKKyAqIF9fZnRyYWNlX3NldF9jbHJfZXZlbnQoTlVMTCwgTlVMTCwgTlVMTCwgc2V0KSB3aWxsIHNldC91bnNldCBhbGwgZXZlbnRzLgorICovCitzdGF0aWMgaW50IF9fZnRyYWNlX3NldF9jbHJfZXZlbnQoY29uc3QgY2hhciAqbWF0Y2gsIGNvbnN0IGNoYXIgKnN1YiwKKwkJCQkgIGNvbnN0IGNoYXIgKmV2ZW50LCBpbnQgc2V0KQoreworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CisKKwkJaWYgKCFjYWxsLT5uYW1lIHx8ICFjYWxsLT5yZWdmdW5jKQorCQkJY29udGludWU7CisKKwkJaWYgKG1hdGNoICYmCisJCSAgICBzdHJjbXAobWF0Y2gsIGNhbGwtPm5hbWUpICE9IDAgJiYKKwkJICAgIHN0cmNtcChtYXRjaCwgY2FsbC0+c3lzdGVtKSAhPSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHN1YiAmJiBzdHJjbXAoc3ViLCBjYWxsLT5zeXN0ZW0pICE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAoZXZlbnQgJiYgc3RyY21wKGV2ZW50LCBjYWxsLT5uYW1lKSAhPSAwKQorCQkJY29udGludWU7CisKKwkJZnRyYWNlX2V2ZW50X2VuYWJsZV9kaXNhYmxlKGNhbGwsIHNldCk7CisKKwkJcmV0ID0gMDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGZ0cmFjZV9zZXRfY2xyX2V2ZW50KGNoYXIgKmJ1ZiwgaW50IHNldCkKIHsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSBfX3N0YXJ0X2Z0cmFjZV9ldmVudHM7CiAJY2hhciAqZXZlbnQgPSBOVUxMLCAqc3ViID0gTlVMTCwgKm1hdGNoOwotCWludCByZXQgPSAtRUlOVkFMOwogCiAJLyoKIAkgKiBUaGUgYnVmIGZvcm1hdCBjYW4gYmUgPHN1YnN5c3RlbT46PGV2ZW50LW5hbWU+CkBAIC0xMTcsMzAgKzE3MSwyNCBAQAogCQkJZXZlbnQgPSBOVUxMOwogCX0KIAotCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKLQlmb3JfZWFjaF9ldmVudChjYWxsKSB7CisJcmV0dXJuIF9fZnRyYWNlX3NldF9jbHJfZXZlbnQobWF0Y2gsIHN1YiwgZXZlbnQsIHNldCk7Cit9CiAKLQkJaWYgKCFjYWxsLT5uYW1lIHx8ICFjYWxsLT5yZWdmdW5jKQotCQkJY29udGludWU7Ci0KLQkJaWYgKG1hdGNoICYmCi0JCSAgICBzdHJjbXAobWF0Y2gsIGNhbGwtPm5hbWUpICE9IDAgJiYKLQkJICAgIHN0cmNtcChtYXRjaCwgY2FsbC0+c3lzdGVtKSAhPSAwKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHN1YiAmJiBzdHJjbXAoc3ViLCBjYWxsLT5zeXN0ZW0pICE9IDApCi0JCQljb250aW51ZTsKLQotCQlpZiAoZXZlbnQgJiYgc3RyY21wKGV2ZW50LCBjYWxsLT5uYW1lKSAhPSAwKQotCQkJY29udGludWU7Ci0KLQkJZnRyYWNlX2V2ZW50X2VuYWJsZV9kaXNhYmxlKGNhbGwsIHNldCk7Ci0KLQkJcmV0ID0gMDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OworLyoqCisgKiB0cmFjZV9zZXRfY2xyX2V2ZW50IC0gZW5hYmxlIG9yIGRpc2FibGUgYW4gZXZlbnQKKyAqIEBzeXN0ZW06IHN5c3RlbSBuYW1lIHRvIG1hdGNoIChOVUxMIGZvciBhbnkgc3lzdGVtKQorICogQGV2ZW50OiBldmVudCBuYW1lIHRvIG1hdGNoIChOVUxMIGZvciBhbGwgZXZlbnRzLCB3aXRoaW4gc3lzdGVtKQorICogQHNldDogMSB0byBlbmFibGUsIDAgdG8gZGlzYWJsZQorICoKKyAqIFRoaXMgaXMgYSB3YXkgZm9yIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgdG8gZW5hYmxlIG9yIGRpc2FibGUKKyAqIGV2ZW50IHJlY29yZGluZy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiB0aGUgcGFyYW1ldGVycyBkbyBub3QgbWF0Y2ggYW55CisgKiByZWdpc3RlcmVkIGV2ZW50cy4KKyAqLworaW50IHRyYWNlX3NldF9jbHJfZXZlbnQoY29uc3QgY2hhciAqc3lzdGVtLCBjb25zdCBjaGFyICpldmVudCwgaW50IHNldCkKK3sKKwlyZXR1cm4gX19mdHJhY2Vfc2V0X2Nscl9ldmVudChOVUxMLCBzeXN0ZW0sIGV2ZW50LCBzZXQpOwogfQogCiAvKiAxMjggc2hvdWxkIGJlIG11Y2ggbW9yZSB0aGFuIGVub3VnaCAqLwpAQCAtMjI0LDE1ICsyNzIsMTcgQEAKIHN0YXRpYyB2b2lkICoKIHRfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpuZXh0ID0gY2FsbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGw7CiAKIAkoKnBvcykrKzsKIAogCWZvciAoOzspIHsKLQkJaWYgKCh1bnNpZ25lZCBsb25nKWNhbGwgPj0gKHVuc2lnbmVkIGxvbmcpX19zdG9wX2Z0cmFjZV9ldmVudHMpCisJCWlmIChsaXN0ID09ICZmdHJhY2VfZXZlbnRzKQogCQkJcmV0dXJuIE5VTEw7CiAKKwkJY2FsbCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsLCBsaXN0KTsKKwogCQkvKgogCQkgKiBUaGUgZnRyYWNlIHN1YnN5c3RlbSBpcyBmb3Igc2hvd2luZyBmb3JtYXRzIG9ubHkuCiAJCSAqIFRoZXkgY2FuIG5vdCBiZSBlbmFibGVkIG9yIGRpc2FibGVkIHZpYSB0aGUgZXZlbnQgZmlsZXMuCkBAIC0yNDAsNDUgKzI5MCw1MSBAQAogCQlpZiAoY2FsbC0+cmVnZnVuYykKIAkJCWJyZWFrOwogCi0JCWNhbGwrKzsKLQkJbmV4dCA9IGNhbGw7CisJCWxpc3QgPSBsaXN0LT5uZXh0OwogCX0KIAotCW0tPnByaXZhdGUgPSArK25leHQ7CisJbS0+cHJpdmF0ZSA9IGxpc3QtPm5leHQ7CiAKIAlyZXR1cm4gY2FsbDsKIH0KIAogc3RhdGljIHZvaWQgKnRfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKKwltdXRleF9sb2NrKCZldmVudF9tdXRleCk7CisJaWYgKCpwb3MgPT0gMCkKKwkJbS0+cHJpdmF0ZSA9IGZ0cmFjZV9ldmVudHMubmV4dDsKIAlyZXR1cm4gdF9uZXh0KG0sIE5VTEwsIHBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICoKIHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQogewotCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9IG0tPnByaXZhdGU7Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpuZXh0OworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSBtLT5wcml2YXRlOworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbDsKIAogCSgqcG9zKSsrOwogCiAgcmV0cnk6Ci0JaWYgKCh1bnNpZ25lZCBsb25nKWNhbGwgPj0gKHVuc2lnbmVkIGxvbmcpX19zdG9wX2Z0cmFjZV9ldmVudHMpCisJaWYgKGxpc3QgPT0gJmZ0cmFjZV9ldmVudHMpCiAJCXJldHVybiBOVUxMOwogCisJY2FsbCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsLCBsaXN0KTsKKwogCWlmICghY2FsbC0+ZW5hYmxlZCkgewotCQljYWxsKys7CisJCWxpc3QgPSBsaXN0LT5uZXh0OwogCQlnb3RvIHJldHJ5OwogCX0KIAotCW5leHQgPSBjYWxsOwotCW0tPnByaXZhdGUgPSArK25leHQ7CisJbS0+cHJpdmF0ZSA9IGxpc3QtPm5leHQ7CiAKIAlyZXR1cm4gY2FsbDsKIH0KIAogc3RhdGljIHZvaWQgKnNfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKIHsKKwltdXRleF9sb2NrKCZldmVudF9tdXRleCk7CisJaWYgKCpwb3MgPT0gMCkKKwkJbS0+cHJpdmF0ZSA9IGZ0cmFjZV9ldmVudHMubmV4dDsKIAlyZXR1cm4gc19uZXh0KG0sIE5VTEwsIHBvcyk7CiB9CiAKQEAgLTI5NSwxMiArMzUxLDEyIEBACiAKIHN0YXRpYyB2b2lkIHRfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7CisJbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQKIGZ0cmFjZV9ldmVudF9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpbnQgcmV0OwogCWNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqc2VxX29wczsKIAogCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCkBAIC0zMDgsMTMgKzM2NCw3IEBACiAJCWZ0cmFjZV9jbGVhcl9ldmVudHMoKTsKIAogCXNlcV9vcHMgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldCA9IHNlcV9vcGVuKGZpbGUsIHNlcV9vcHMpOwotCWlmICghcmV0KSB7Ci0JCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCQltLT5wcml2YXRlID0gX19zdGFydF9mdHJhY2VfZXZlbnRzOwotCX0KLQlyZXR1cm4gcmV0OworCXJldHVybiBzZXFfb3BlbihmaWxlLCBzZXFfb3BzKTsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTM3NCw4ICs0MjQsOTMgQEAKIAlyZXR1cm4gY250OwogfQogCitzdGF0aWMgc3NpemVfdAorc3lzdGVtX2VuYWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwKKwkJICAgbG9mZl90ICpwcG9zKQoreworCWNvbnN0IGNoYXIgc2V0X3RvX2NoYXJbNF0gPSB7ICc/JywgJzAnLCAnMScsICdYJyB9OworCWNvbnN0IGNoYXIgKnN5c3RlbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGw7CisJY2hhciBidWZbMl07CisJaW50IHNldCA9IDA7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CisJCWlmICghY2FsbC0+bmFtZSB8fCAhY2FsbC0+cmVnZnVuYykKKwkJCWNvbnRpbnVlOworCisJCWlmIChzeXN0ZW0gJiYgc3RyY21wKGNhbGwtPnN5c3RlbSwgc3lzdGVtKSAhPSAwKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogV2UgbmVlZCB0byBmaW5kIG91dCBpZiBhbGwgdGhlIGV2ZW50cyBhcmUgc2V0CisJCSAqIG9yIGlmIGFsbCBldmVudHMgb3IgY2xlYXJlZCwgb3IgaWYgd2UgaGF2ZQorCQkgKiBhIG1peHR1cmUuCisJCSAqLworCQlzZXQgfD0gKDEgPDwgISFjYWxsLT5lbmFibGVkKTsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgbWl4dHVyZSwgbm8gbmVlZCB0byBsb29rIGZ1cnRoZXIuCisJCSAqLworCQlpZiAoc2V0ID09IDMpCisJCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7CisKKwlidWZbMF0gPSBzZXRfdG9fY2hhcltzZXRdOworCWJ1ZlsxXSA9ICdcbic7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjbnQsIHBwb3MsIGJ1ZiwgMik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAorc3lzdGVtX2VuYWJsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKnVidWYsIHNpemVfdCBjbnQsCisJCSAgICBsb2ZmX3QgKnBwb3MpCit7CisJY29uc3QgY2hhciAqc3lzdGVtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWNoYXIgYnVmWzY0XTsKKwlzc2l6ZV90IHJldDsKKworCWlmIChjbnQgPj0gc2l6ZW9mKGJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIHVidWYsIGNudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJYnVmW2NudF0gPSAwOworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSB0cmFjaW5nX3VwZGF0ZV9idWZmZXJzKCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gX19mdHJhY2Vfc2V0X2Nscl9ldmVudChOVUxMLCBzeXN0ZW0sIE5VTEwsIHZhbCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBjbnQ7CisKK291dDoKKwkqcHBvcyArPSBjbnQ7CisKKwlyZXR1cm4gcmV0OworfQorCitleHRlcm4gY2hhciAqX19iYWRfdHlwZV9zaXplKHZvaWQpOworCiAjdW5kZWYgRklFTEQKICNkZWZpbmUgRklFTEQodHlwZSwgbmFtZSkJCQkJCQlcCisJc2l6ZW9mKHR5cGUpICE9IHNpemVvZihmaWVsZC5uYW1lKSA/IF9fYmFkX3R5cGVfc2l6ZSgpIDoJXAogCSN0eXBlLCAiY29tbW9uXyIgI25hbWUsIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIG5hbWUpLAkJXAogCQlzaXplb2YoZmllbGQubmFtZSkKIApAQCAtMzkxLDcgKzUyNiw3IEBACiAJCQkJIlx0ZmllbGQ6JXMgJXM7XHRvZmZzZXQ6JXp1O1x0c2l6ZTolenU7XG4iCiAJCQkJIlx0ZmllbGQ6JXMgJXM7XHRvZmZzZXQ6JXp1O1x0c2l6ZTolenU7XG4iCiAJCQkJIlxuIiwKLQkJCQlGSUVMRCh1bnNpZ25lZCBjaGFyLCB0eXBlKSwKKwkJCQlGSUVMRCh1bnNpZ25lZCBzaG9ydCwgdHlwZSksCiAJCQkJRklFTEQodW5zaWduZWQgY2hhciwgZmxhZ3MpLAogCQkJCUZJRUxEKHVuc2lnbmVkIGNoYXIsIHByZWVtcHRfY291bnQpLAogCQkJCUZJRUxEKGludCwgcGlkKSwKQEAgLTQ4MSw3ICs2MTYsNyBAQAogCiAJdHJhY2Vfc2VxX2luaXQocyk7CiAKLQlmaWx0ZXJfcHJpbnRfcHJlZHMoY2FsbC0+cHJlZHMsIHMpOworCXByaW50X2V2ZW50X2ZpbHRlcihjYWxsLCBzKTsKIAlyID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY250LCBwcG9zLCBzLT5idWZmZXIsIHMtPmxlbik7CiAKIAlrZnJlZShzKTsKQEAgLTQ5NCwzOCArNjI5LDI2IEBACiAJCSAgIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbNjRdLCAqcGJ1ZiA9IGJ1ZjsKLQlzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQ7CisJY2hhciAqYnVmOwogCWludCBlcnI7CiAKLQlpZiAoY250ID49IHNpemVvZihidWYpKQorCWlmIChjbnQgPj0gUEFHRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCB1YnVmLCBjbnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbY250XSA9ICdcMCc7Ci0KLQlwcmVkID0ga3phbGxvYyhzaXplb2YoKnByZWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByZWQpCisJYnVmID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX1RFTVBPUkFSWSk7CisJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZXJyID0gZmlsdGVyX3BhcnNlKCZwYnVmLCBwcmVkKTsKLQlpZiAoZXJyIDwgMCkgewotCQlmaWx0ZXJfZnJlZV9wcmVkKHByZWQpOwotCQlyZXR1cm4gZXJyOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVidWYsIGNudCkpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJYnVmW2NudF0gPSAnXDAnOwogCi0JaWYgKHByZWQtPmNsZWFyKSB7Ci0JCWZpbHRlcl9mcmVlX3ByZWRzKGNhbGwpOwotCQlmaWx0ZXJfZnJlZV9wcmVkKHByZWQpOwotCQlyZXR1cm4gY250OwotCX0KLQotCWVyciA9IGZpbHRlcl9hZGRfcHJlZChjYWxsLCBwcmVkKTsKLQlpZiAoZXJyIDwgMCkgewotCQlmaWx0ZXJfZnJlZV9wcmVkKHByZWQpOworCWVyciA9IGFwcGx5X2V2ZW50X2ZpbHRlcihjYWxsLCBidWYpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYnVmKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAkqcHBvcyArPSBjbnQ7CiAKQEAgLTU0OSw3ICs2NzIsNyBAQAogCiAJdHJhY2Vfc2VxX2luaXQocyk7CiAKLQlmaWx0ZXJfcHJpbnRfcHJlZHMoc3lzdGVtLT5wcmVkcywgcyk7CisJcHJpbnRfc3Vic3lzdGVtX2V2ZW50X2ZpbHRlcihzeXN0ZW0sIHMpOwogCXIgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjbnQsIHBwb3MsIHMtPmJ1ZmZlciwgcy0+bGVuKTsKIAogCWtmcmVlKHMpOwpAQCAtNTYyLDQ1ICs2ODUsNTYgQEAKIAkJICAgICAgIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbNjRdLCAqcGJ1ZiA9IGJ1ZjsKLQlzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQ7CisJY2hhciAqYnVmOwogCWludCBlcnI7CiAKLQlpZiAoY250ID49IHNpemVvZihidWYpKQorCWlmIChjbnQgPj0gUEFHRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmYnVmLCB1YnVmLCBjbnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbY250XSA9ICdcMCc7Ci0KLQlwcmVkID0ga3phbGxvYyhzaXplb2YoKnByZWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByZWQpCisJYnVmID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX1RFTVBPUkFSWSk7CisJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZXJyID0gZmlsdGVyX3BhcnNlKCZwYnVmLCBwcmVkKTsKLQlpZiAoZXJyIDwgMCkgewotCQlmaWx0ZXJfZnJlZV9wcmVkKHByZWQpOwotCQlyZXR1cm4gZXJyOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVidWYsIGNudCkpIHsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisJYnVmW2NudF0gPSAnXDAnOwogCi0JaWYgKHByZWQtPmNsZWFyKSB7Ci0JCWZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzeXN0ZW0pOwotCQlmaWx0ZXJfZnJlZV9wcmVkKHByZWQpOwotCQlyZXR1cm4gY250OwotCX0KLQotCWVyciA9IGZpbHRlcl9hZGRfc3Vic3lzdGVtX3ByZWQoc3lzdGVtLCBwcmVkKTsKLQlpZiAoZXJyIDwgMCkgewotCQlmaWx0ZXJfZnJlZV9zdWJzeXN0ZW1fcHJlZHMoc3lzdGVtKTsKLQkJZmlsdGVyX2ZyZWVfcHJlZChwcmVkKTsKKwllcnIgPSBhcHBseV9zdWJzeXN0ZW1fZXZlbnRfZmlsdGVyKHN5c3RlbSwgYnVmKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7CisJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JfQogCiAJKnBwb3MgKz0gY250OwogCiAJcmV0dXJuIGNudDsKIH0KIAorc3RhdGljIHNzaXplX3QKK3Nob3dfaGVhZGVyKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCWludCAoKmZ1bmMpKHN0cnVjdCB0cmFjZV9zZXEgKnMpID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB0cmFjZV9zZXEgKnM7CisJaW50IHI7CisKKwlpZiAoKnBwb3MpCisJCXJldHVybiAwOworCisJcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRyYWNlX3NlcV9pbml0KHMpOworCisJZnVuYyhzKTsKKwlyID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY250LCBwcG9zLCBzLT5idWZmZXIsIHMtPmxlbik7CisKKwlrZnJlZShzKTsKKworCXJldHVybiByOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIHNob3dfZXZlbnRfc2VxX29wcyA9IHsKIAkuc3RhcnQgPSB0X3N0YXJ0LAogCS5uZXh0ID0gdF9uZXh0LApAQCAtNjU4LDYgKzc5MiwxNyBAQAogCS53cml0ZSA9IHN1YnN5c3RlbV9maWx0ZXJfd3JpdGUsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdHJhY2Vfc3lzdGVtX2VuYWJsZV9mb3BzID0geworCS5vcGVuID0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCisJLnJlYWQgPSBzeXN0ZW1fZW5hYmxlX3JlYWQsCisJLndyaXRlID0gc3lzdGVtX2VuYWJsZV93cml0ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ0cmFjZV9zaG93X2hlYWRlcl9mb3BzID0geworCS5vcGVuID0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCisJLnJlYWQgPSBzaG93X2hlYWRlciwKK307CisKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpldmVudF90cmFjZV9ldmVudHNfZGlyKHZvaWQpCiB7CiAJc3RhdGljIHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwpAQCAtNjg0LDYgKzgyOSw3IEBACiBldmVudF9zdWJzeXN0ZW1fZGlyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKmRfZXZlbnRzKQogewogCXN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbTsKKwlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAogCS8qIEZpcnN0IHNlZSBpZiB3ZSBkaWQgbm90IGFscmVhZHkgY3JlYXRlIHRoaXMgZGlyICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzeXN0ZW0sICZldmVudF9zdWJzeXN0ZW1zLCBsaXN0KSB7CkBAIC03MDcsMTYgKzg1Myw0NiBAQAogCQlyZXR1cm4gZF9ldmVudHM7CiAJfQogCi0Jc3lzdGVtLT5uYW1lID0gbmFtZTsKKwlzeXN0ZW0tPm5hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCWlmICghc3lzdGVtLT5uYW1lKSB7CisJCWRlYnVnZnNfcmVtb3ZlKHN5c3RlbS0+ZW50cnkpOworCQlrZnJlZShzeXN0ZW0pOworCQlyZXR1cm4gZF9ldmVudHM7CisJfQorCiAJbGlzdF9hZGQoJnN5c3RlbS0+bGlzdCwgJmV2ZW50X3N1YnN5c3RlbXMpOwogCi0Jc3lzdGVtLT5wcmVkcyA9IE5VTEw7CisJc3lzdGVtLT5maWx0ZXIgPSBOVUxMOworCisJc3lzdGVtLT5maWx0ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZXZlbnRfZmlsdGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzeXN0ZW0tPmZpbHRlcikgeworCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgYWxsb2NhdGUgZmlsdGVyIGZvciBzdWJzeXN0ZW0gIgorCQkJICAgIiclcydcbiIsIG5hbWUpOworCQlyZXR1cm4gc3lzdGVtLT5lbnRyeTsKKwl9CisKKwllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImZpbHRlciIsIDA2NDQsIHN5c3RlbS0+ZW50cnksIHN5c3RlbSwKKwkJCQkgICAgJmZ0cmFjZV9zdWJzeXN0ZW1fZmlsdGVyX2ZvcHMpOworCWlmICghZW50cnkpIHsKKwkJa2ZyZWUoc3lzdGVtLT5maWx0ZXIpOworCQlzeXN0ZW0tPmZpbHRlciA9IE5VTEw7CisJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCisJCQkgICAiJyVzL2ZpbHRlcicgZW50cnlcbiIsIG5hbWUpOworCX0KKworCWVudHJ5ID0gdHJhY2VfY3JlYXRlX2ZpbGUoImVuYWJsZSIsIDA2NDQsIHN5c3RlbS0+ZW50cnksCisJCQkJICAodm9pZCAqKXN5c3RlbS0+bmFtZSwKKwkJCQkgICZmdHJhY2Vfc3lzdGVtX2VuYWJsZV9mb3BzKTsKIAogCXJldHVybiBzeXN0ZW0tPmVudHJ5OwogfQogCiBzdGF0aWMgaW50Ci1ldmVudF9jcmVhdGVfZGlyKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgc3RydWN0IGRlbnRyeSAqZF9ldmVudHMpCitldmVudF9jcmVhdGVfZGlyKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgc3RydWN0IGRlbnRyeSAqZF9ldmVudHMsCisJCSBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICppZCwKKwkJIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmVuYWJsZSwKKwkJIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZpbHRlciwKKwkJIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcm1hdCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAlpbnQgcmV0OwpAQCAtNzI1LDcgKzkwMSw3IEBACiAJICogSWYgdGhlIHRyYWNlIHBvaW50IGhlYWRlciBkaWQgbm90IGRlZmluZSBUUkFDRV9TWVNURU0KIAkgKiB0aGVuIHRoZSBzeXN0ZW0gd291bGQgYmUgY2FsbGVkICJUUkFDRV9TWVNURU0iLgogCSAqLwotCWlmIChzdHJjbXAoY2FsbC0+c3lzdGVtLCAiVFJBQ0VfU1lTVEVNIikgIT0gMCkKKwlpZiAoc3RyY21wKGNhbGwtPnN5c3RlbSwgVFJBQ0VfU1lTVEVNKSAhPSAwKQogCQlkX2V2ZW50cyA9IGV2ZW50X3N1YnN5c3RlbV9kaXIoY2FsbC0+c3lzdGVtLCBkX2V2ZW50cyk7CiAKIAlpZiAoY2FsbC0+cmF3X2luaXQpIHsKQEAgLTc0NCwyMSArOTIwLDEzIEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpZiAoY2FsbC0+cmVnZnVuYykgewotCQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImVuYWJsZSIsIDA2NDQsIGNhbGwtPmRpciwgY2FsbCwKLQkJCQkJICAgICZmdHJhY2VfZW5hYmxlX2ZvcHMpOwotCQlpZiAoIWVudHJ5KQotCQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCQkgICAiJyVzL2VuYWJsZScgZW50cnlcbiIsIGNhbGwtPm5hbWUpOwotCX0KKwlpZiAoY2FsbC0+cmVnZnVuYykKKwkJZW50cnkgPSB0cmFjZV9jcmVhdGVfZmlsZSgiZW5hYmxlIiwgMDY0NCwgY2FsbC0+ZGlyLCBjYWxsLAorCQkJCQkgIGVuYWJsZSk7CiAKLQlpZiAoY2FsbC0+aWQpIHsKLQkJZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpZCIsIDA0NDQsIGNhbGwtPmRpciwgY2FsbCwKLQkJCQkmZnRyYWNlX2V2ZW50X2lkX2ZvcHMpOwotCQlpZiAoIWVudHJ5KQotCQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICclcy9pZCcgZW50cnlcbiIsCi0JCQkJCWNhbGwtPm5hbWUpOwotCX0KKwlpZiAoY2FsbC0+aWQpCisJCWVudHJ5ID0gdHJhY2VfY3JlYXRlX2ZpbGUoImlkIiwgMDQ0NCwgY2FsbC0+ZGlyLCBjYWxsLAorCQkJCQkgIGlkKTsKIAogCWlmIChjYWxsLT5kZWZpbmVfZmllbGRzKSB7CiAJCXJldCA9IGNhbGwtPmRlZmluZV9maWVsZHMoKTsKQEAgLTc2NywzMiArOTM1LDE5NSBAQAogCQkJCSAgICIgZXZlbnRzLyVzXG4iLCBjYWxsLT5uYW1lKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQkJZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmaWx0ZXIiLCAwNjQ0LCBjYWxsLT5kaXIsIGNhbGwsCi0JCQkJCSAgICAmZnRyYWNlX2V2ZW50X2ZpbHRlcl9mb3BzKTsKLQkJaWYgKCFlbnRyeSkKLQkJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCi0JCQkJICAgIiclcy9maWx0ZXInIGVudHJ5XG4iLCBjYWxsLT5uYW1lKTsKKwkJZW50cnkgPSB0cmFjZV9jcmVhdGVfZmlsZSgiZmlsdGVyIiwgMDY0NCwgY2FsbC0+ZGlyLCBjYWxsLAorCQkJCQkgIGZpbHRlcik7CiAJfQogCiAJLyogQSB0cmFjZSBtYXkgbm90IHdhbnQgdG8gZXhwb3J0IGl0cyBmb3JtYXQgKi8KIAlpZiAoIWNhbGwtPnNob3dfZm9ybWF0KQogCQlyZXR1cm4gMDsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZm9ybWF0IiwgMDQ0NCwgY2FsbC0+ZGlyLCBjYWxsLAotCQkJCSAgICAmZnRyYWNlX2V2ZW50X2Zvcm1hdF9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIiclcy9mb3JtYXQnIGVudHJ5XG4iLCBjYWxsLT5uYW1lKTsKKwllbnRyeSA9IHRyYWNlX2NyZWF0ZV9maWxlKCJmb3JtYXQiLCAwNDQ0LCBjYWxsLT5kaXIsIGNhbGwsCisJCQkJICBmb3JtYXQpOwogCiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgZm9yX2VhY2hfZXZlbnQoZXZlbnQsIHN0YXJ0LCBlbmQpCQkJXAorCWZvciAoZXZlbnQgPSBzdGFydDsJCQkJCVwKKwkgICAgICh1bnNpZ25lZCBsb25nKWV2ZW50IDwgKHVuc2lnbmVkIGxvbmcpZW5kOwkJXAorCSAgICAgZXZlbnQrKykKKworI2lmZGVmIENPTkZJR19NT0RVTEVTCisKK3N0YXRpYyBMSVNUX0hFQUQoZnRyYWNlX21vZHVsZV9maWxlX2xpc3QpOworCisvKgorICogTW9kdWxlcyBtdXN0IG93biB0aGVpciBmaWxlX29wZXJhdGlvbnMgdG8ga2VlcCB1cCB3aXRoCisgKiByZWZlcmVuY2UgY291bnRpbmcuCisgKi8KK3N0cnVjdCBmdHJhY2VfbW9kdWxlX2ZpbGVfb3BzIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCXN0cnVjdCBtb2R1bGUJCQkqbW9kOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMJCWlkOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMJCWVuYWJsZTsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCQlmb3JtYXQ7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkJZmlsdGVyOworfTsKKworc3RhdGljIHN0cnVjdCBmdHJhY2VfbW9kdWxlX2ZpbGVfb3BzICoKK3RyYWNlX2NyZWF0ZV9maWxlX29wcyhzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJc3RydWN0IGZ0cmFjZV9tb2R1bGVfZmlsZV9vcHMgKmZpbGVfb3BzOworCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IG9mIGEgUElUQS4gVG8gYWxsb3cgZm9yIGNvcnJlY3QgcmVmZXJlbmNlCisJICogY291bnRpbmcsIG1vZHVsZXMgbXVzdCAib3duIiB0aGVpciBmaWxlX29wZXJhdGlvbnMuCisJICogVG8gZG8gdGhpcywgd2UgYWxsb2NhdGUgdGhlIGZpbGUgb3BlcmF0aW9ucyB0aGF0IHdpbGwgYmUKKwkgKiB1c2VkIGluIHRoZSBldmVudCBkaXJlY3RvcnkuCisJICovCisKKwlmaWxlX29wcyA9IGttYWxsb2Moc2l6ZW9mKCpmaWxlX29wcyksIEdGUF9LRVJORUwpOworCWlmICghZmlsZV9vcHMpCisJCXJldHVybiBOVUxMOworCisJZmlsZV9vcHMtPm1vZCA9IG1vZDsKKworCWZpbGVfb3BzLT5pZCA9IGZ0cmFjZV9ldmVudF9pZF9mb3BzOworCWZpbGVfb3BzLT5pZC5vd25lciA9IG1vZDsKKworCWZpbGVfb3BzLT5lbmFibGUgPSBmdHJhY2VfZW5hYmxlX2ZvcHM7CisJZmlsZV9vcHMtPmVuYWJsZS5vd25lciA9IG1vZDsKKworCWZpbGVfb3BzLT5maWx0ZXIgPSBmdHJhY2VfZXZlbnRfZmlsdGVyX2ZvcHM7CisJZmlsZV9vcHMtPmZpbHRlci5vd25lciA9IG1vZDsKKworCWZpbGVfb3BzLT5mb3JtYXQgPSBmdHJhY2VfZXZlbnRfZm9ybWF0X2ZvcHM7CisJZmlsZV9vcHMtPmZvcm1hdC5vd25lciA9IG1vZDsKKworCWxpc3RfYWRkKCZmaWxlX29wcy0+bGlzdCwgJmZ0cmFjZV9tb2R1bGVfZmlsZV9saXN0KTsKKworCXJldHVybiBmaWxlX29wczsKK30KKworc3RhdGljIHZvaWQgdHJhY2VfbW9kdWxlX2FkZF9ldmVudHMoc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXN0cnVjdCBmdHJhY2VfbW9kdWxlX2ZpbGVfb3BzICpmaWxlX29wcyA9IE5VTEw7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCAqc3RhcnQsICplbmQ7CisJc3RydWN0IGRlbnRyeSAqZF9ldmVudHM7CisKKwlzdGFydCA9IG1vZC0+dHJhY2VfZXZlbnRzOworCWVuZCA9IG1vZC0+dHJhY2VfZXZlbnRzICsgbW9kLT5udW1fdHJhY2VfZXZlbnRzOworCisJaWYgKHN0YXJ0ID09IGVuZCkKKwkJcmV0dXJuOworCisJZF9ldmVudHMgPSBldmVudF90cmFjZV9ldmVudHNfZGlyKCk7CisJaWYgKCFkX2V2ZW50cykKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfZXZlbnQoY2FsbCwgc3RhcnQsIGVuZCkgeworCQkvKiBUaGUgbGlua2VyIG1heSBsZWF2ZSBibGFua3MgKi8KKwkJaWYgKCFjYWxsLT5uYW1lKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogVGhpcyBtb2R1bGUgaGFzIGV2ZW50cywgY3JlYXRlIGZpbGUgb3BzIGZvciB0aGlzIG1vZHVsZQorCQkgKiBpZiBub3QgYWxyZWFkeSBkb25lLgorCQkgKi8KKwkJaWYgKCFmaWxlX29wcykgeworCQkJZmlsZV9vcHMgPSB0cmFjZV9jcmVhdGVfZmlsZV9vcHMobW9kKTsKKwkJCWlmICghZmlsZV9vcHMpCisJCQkJcmV0dXJuOworCQl9CisJCWNhbGwtPm1vZCA9IG1vZDsKKwkJbGlzdF9hZGQoJmNhbGwtPmxpc3QsICZmdHJhY2VfZXZlbnRzKTsKKwkJZXZlbnRfY3JlYXRlX2RpcihjYWxsLCBkX2V2ZW50cywKKwkJCQkgJmZpbGVfb3BzLT5pZCwgJmZpbGVfb3BzLT5lbmFibGUsCisJCQkJICZmaWxlX29wcy0+ZmlsdGVyLCAmZmlsZV9vcHMtPmZvcm1hdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0cmFjZV9tb2R1bGVfcmVtb3ZlX2V2ZW50cyhzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJc3RydWN0IGZ0cmFjZV9tb2R1bGVfZmlsZV9vcHMgKmZpbGVfb3BzOworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgKnA7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJZG93bl93cml0ZSgmdHJhY2VfZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjYWxsLCBwLCAmZnRyYWNlX2V2ZW50cywgbGlzdCkgeworCQlpZiAoY2FsbC0+bW9kID09IG1vZCkgeworCQkJZm91bmQgPSB0cnVlOworCQkJZnRyYWNlX2V2ZW50X2VuYWJsZV9kaXNhYmxlKGNhbGwsIDApOworCQkJaWYgKGNhbGwtPmV2ZW50KQorCQkJCV9fdW5yZWdpc3Rlcl9mdHJhY2VfZXZlbnQoY2FsbC0+ZXZlbnQpOworCQkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGNhbGwtPmRpcik7CisJCQlsaXN0X2RlbCgmY2FsbC0+bGlzdCk7CisJCQl0cmFjZV9kZXN0cm95X2ZpZWxkcyhjYWxsKTsKKwkJCWRlc3Ryb3lfcHJlZHMoY2FsbCk7CisJCX0KKwl9CisKKwkvKiBOb3cgZnJlZSB0aGUgZmlsZV9vcGVyYXRpb25zICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaWxlX29wcywgJmZ0cmFjZV9tb2R1bGVfZmlsZV9saXN0LCBsaXN0KSB7CisJCWlmIChmaWxlX29wcy0+bW9kID09IG1vZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoJmZpbGVfb3BzLT5saXN0ICE9ICZmdHJhY2VfbW9kdWxlX2ZpbGVfbGlzdCkgeworCQlsaXN0X2RlbCgmZmlsZV9vcHMtPmxpc3QpOworCQlrZnJlZShmaWxlX29wcyk7CisJfQorCisJLyoKKwkgKiBJdCBpcyBzYWZlc3QgdG8gcmVzZXQgdGhlIHJpbmcgYnVmZmVyIGlmIHRoZSBtb2R1bGUgYmVpbmcgdW5sb2FkZWQKKwkgKiByZWdpc3RlcmVkIGFueSBldmVudHMuCisJICovCisJaWYgKGZvdW5kKQorCQl0cmFjaW5nX3Jlc2V0X2N1cnJlbnRfb25saW5lX2NwdXMoKTsKKwl1cF93cml0ZSgmdHJhY2VfZXZlbnRfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IHRyYWNlX21vZHVsZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBtb2R1bGUgKm1vZCA9IGRhdGE7CisKKwltdXRleF9sb2NrKCZldmVudF9tdXRleCk7CisJc3dpdGNoICh2YWwpIHsKKwljYXNlIE1PRFVMRV9TVEFURV9DT01JTkc6CisJCXRyYWNlX21vZHVsZV9hZGRfZXZlbnRzKG1vZCk7CisJCWJyZWFrOworCWNhc2UgTU9EVUxFX1NUQVRFX0dPSU5HOgorCQl0cmFjZV9tb2R1bGVfcmVtb3ZlX2V2ZW50cyhtb2QpOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IHRyYWNlX21vZHVsZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19NT0RVTEVTICovCisKK3N0cnVjdCBub3RpZmllcl9ibG9jayB0cmFjZV9tb2R1bGVfbmIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB0cmFjZV9tb2R1bGVfbm90aWZ5LAorCS5wcmlvcml0eSA9IDAsCit9OworCitleHRlcm4gc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fc3RhcnRfZnRyYWNlX2V2ZW50c1tdOworZXh0ZXJuIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3N0b3BfZnRyYWNlX2V2ZW50c1tdOworCiBzdGF0aWMgX19pbml0IGludCBldmVudF90cmFjZV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gX19zdGFydF9mdHJhY2VfZXZlbnRzOworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbDsKIAlzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcjsKIAlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAlzdHJ1Y3QgZGVudHJ5ICpkX2V2ZW50czsKKwlpbnQgcmV0OwogCiAJZF90cmFjZXIgPSB0cmFjaW5nX2luaXRfZGVudHJ5KCk7CiAJaWYgKCFkX3RyYWNlcikKQEAgLTgxNiwxMyArMTE0NywyNDMgQEAKIAlpZiAoIWRfZXZlbnRzKQogCQlyZXR1cm4gMDsKIAotCWZvcl9lYWNoX2V2ZW50KGNhbGwpIHsKKwkvKiByaW5nIGJ1ZmZlciBpbnRlcm5hbCBmb3JtYXRzICovCisJdHJhY2VfY3JlYXRlX2ZpbGUoImhlYWRlcl9wYWdlIiwgMDQ0NCwgZF9ldmVudHMsCisJCQkgIHJpbmdfYnVmZmVyX3ByaW50X3BhZ2VfaGVhZGVyLAorCQkJICAmZnRyYWNlX3Nob3dfaGVhZGVyX2ZvcHMpOworCisJdHJhY2VfY3JlYXRlX2ZpbGUoImhlYWRlcl9ldmVudCIsIDA0NDQsIGRfZXZlbnRzLAorCQkJICByaW5nX2J1ZmZlcl9wcmludF9lbnRyeV9oZWFkZXIsCisJCQkgICZmdHJhY2Vfc2hvd19oZWFkZXJfZm9wcyk7CisKKwl0cmFjZV9jcmVhdGVfZmlsZSgiZW5hYmxlIiwgMDY0NCwgZF9ldmVudHMsCisJCQkgIE5VTEwsICZmdHJhY2Vfc3lzdGVtX2VuYWJsZV9mb3BzKTsKKworCWZvcl9lYWNoX2V2ZW50KGNhbGwsIF9fc3RhcnRfZnRyYWNlX2V2ZW50cywgX19zdG9wX2Z0cmFjZV9ldmVudHMpIHsKIAkJLyogVGhlIGxpbmtlciBtYXkgbGVhdmUgYmxhbmtzICovCiAJCWlmICghY2FsbC0+bmFtZSkKIAkJCWNvbnRpbnVlOwotCQlldmVudF9jcmVhdGVfZGlyKGNhbGwsIGRfZXZlbnRzKTsKKwkJbGlzdF9hZGQoJmNhbGwtPmxpc3QsICZmdHJhY2VfZXZlbnRzKTsKKwkJZXZlbnRfY3JlYXRlX2RpcihjYWxsLCBkX2V2ZW50cywgJmZ0cmFjZV9ldmVudF9pZF9mb3BzLAorCQkJCSAmZnRyYWNlX2VuYWJsZV9mb3BzLCAmZnRyYWNlX2V2ZW50X2ZpbHRlcl9mb3BzLAorCQkJCSAmZnRyYWNlX2V2ZW50X2Zvcm1hdF9mb3BzKTsKIAl9CiAKKwlyZXQgPSByZWdpc3Rlcl9tb2R1bGVfbm90aWZpZXIoJnRyYWNlX21vZHVsZV9uYik7CisJaWYgKHJldCkKKwkJcHJfd2FybmluZygiRmFpbGVkIHRvIHJlZ2lzdGVyIHRyYWNlIGV2ZW50cyBtb2R1bGUgbm90aWZpZXJcbiIpOworCiAJcmV0dXJuIDA7CiB9CiBmc19pbml0Y2FsbChldmVudF90cmFjZV9pbml0KTsKKworI2lmZGVmIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGVzdF9zcGlubG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRlc3Rfc3BpbmxvY2tfaXJxKTsKK3N0YXRpYyBERUZJTkVfTVVURVgodGVzdF9tdXRleCk7CisKK3N0YXRpYyBfX2luaXQgdm9pZCB0ZXN0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSkKK3sKKwlzcGluX2xvY2soJnRlc3Rfc3BpbmxvY2spOworCXNwaW5fbG9ja19pcnEoJnRlc3Rfc3BpbmxvY2tfaXJxKTsKKwl1ZGVsYXkoMSk7CisJc3Bpbl91bmxvY2tfaXJxKCZ0ZXN0X3NwaW5sb2NrX2lycSk7CisJc3Bpbl91bmxvY2soJnRlc3Rfc3BpbmxvY2spOworCisJbXV0ZXhfbG9jaygmdGVzdF9tdXRleCk7CisJbXNsZWVwKDEpOworCW11dGV4X3VubG9jaygmdGVzdF9tdXRleCk7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IGV2ZW50X3Rlc3RfdGhyZWFkKHZvaWQgKnVudXNlZCkKK3sKKwl2b2lkICp0ZXN0X21hbGxvYzsKKworCXRlc3RfbWFsbG9jID0ga21hbGxvYygxMjM0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRlc3RfbWFsbG9jKQorCQlwcl9pbmZvKCJmYWlsZWQgdG8ga21hbGxvY1xuIik7CisKKwlzY2hlZHVsZV9vbl9lYWNoX2NwdSh0ZXN0X3dvcmspOworCisJa2ZyZWUodGVzdF9tYWxsb2MpOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJc2NoZWR1bGUoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRG8gdmFyaW91cyB0aGluZ3MgdGhhdCBtYXkgdHJpZ2dlciBldmVudHMuCisgKi8KK3N0YXRpYyBfX2luaXQgdm9pZCBldmVudF90ZXN0X3N0dWZmKHZvaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0ZXN0X3RocmVhZDsKKworCXRlc3RfdGhyZWFkID0ga3RocmVhZF9ydW4oZXZlbnRfdGVzdF90aHJlYWQsIE5VTEwsICJ0ZXN0LWV2ZW50cyIpOworCW1zbGVlcCgxKTsKKwlrdGhyZWFkX3N0b3AodGVzdF90aHJlYWQpOworfQorCisvKgorICogRm9yIGV2ZXJ5IHRyYWNlIGV2ZW50IGRlZmluZWQsIHdlIHdpbGwgdGVzdCBlYWNoIHRyYWNlIHBvaW50IHNlcGFyYXRlbHksCisgKiBhbmQgdGhlbiBieSBncm91cHMsIGFuZCBmaW5hbGx5IGFsbCB0cmFjZSBwb2ludHMuCisgKi8KK3N0YXRpYyBfX2luaXQgdm9pZCBldmVudF90cmFjZV9zZWxmX3Rlc3RzKHZvaWQpCit7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsOworCXN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbTsKKwlpbnQgcmV0OworCisJcHJfaW5mbygiUnVubmluZyB0ZXN0cyBvbiB0cmFjZSBldmVudHM6XG4iKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKworCQkvKiBPbmx5IHRlc3QgdGhvc2UgdGhhdCBoYXZlIGEgcmVnZnVuYyAqLworCQlpZiAoIWNhbGwtPnJlZ2Z1bmMpCisJCQljb250aW51ZTsKKworCQlwcl9pbmZvKCJUZXN0aW5nIGV2ZW50ICVzOiAiLCBjYWxsLT5uYW1lKTsKKworCQkvKgorCQkgKiBJZiBhbiBldmVudCBpcyBhbHJlYWR5IGVuYWJsZWQsIHNvbWVvbmUgaXMgdXNpbmcKKwkJICogaXQgYW5kIHRoZSBzZWxmIHRlc3Qgc2hvdWxkIG5vdCBiZSBvbi4KKwkJICovCisJCWlmIChjYWxsLT5lbmFibGVkKSB7CisJCQlwcl93YXJuaW5nKCJFbmFibGVkIGV2ZW50IGR1cmluZyBzZWxmIHRlc3QhXG4iKTsKKwkJCVdBUk5fT05fT05DRSgxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZnRyYWNlX2V2ZW50X2VuYWJsZV9kaXNhYmxlKGNhbGwsIDEpOworCQlldmVudF90ZXN0X3N0dWZmKCk7CisJCWZ0cmFjZV9ldmVudF9lbmFibGVfZGlzYWJsZShjYWxsLCAwKTsKKworCQlwcl9jb250KCJPS1xuIik7CisJfQorCisJLyogTm93IHRlc3QgYXQgdGhlIHN1YiBzeXN0ZW0gbGV2ZWwgKi8KKworCXByX2luZm8oIlJ1bm5pbmcgdGVzdHMgb24gdHJhY2UgZXZlbnQgc3lzdGVtczpcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzeXN0ZW0sICZldmVudF9zdWJzeXN0ZW1zLCBsaXN0KSB7CisKKwkJLyogdGhlIGZ0cmFjZSBzeXN0ZW0gaXMgc3BlY2lhbCwgc2tpcCBpdCAqLworCQlpZiAoc3RyY21wKHN5c3RlbS0+bmFtZSwgImZ0cmFjZSIpID09IDApCisJCQljb250aW51ZTsKKworCQlwcl9pbmZvKCJUZXN0aW5nIGV2ZW50IHN5c3RlbSAlczogIiwgc3lzdGVtLT5uYW1lKTsKKworCQlyZXQgPSBfX2Z0cmFjZV9zZXRfY2xyX2V2ZW50KE5VTEwsIHN5c3RlbS0+bmFtZSwgTlVMTCwgMSk7CisJCWlmIChXQVJOX09OX09OQ0UocmV0KSkgeworCQkJcHJfd2FybmluZygiZXJyb3IgZW5hYmxpbmcgc3lzdGVtICVzXG4iLAorCQkJCSAgIHN5c3RlbS0+bmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWV2ZW50X3Rlc3Rfc3R1ZmYoKTsKKworCQlyZXQgPSBfX2Z0cmFjZV9zZXRfY2xyX2V2ZW50KE5VTEwsIHN5c3RlbS0+bmFtZSwgTlVMTCwgMCk7CisJCWlmIChXQVJOX09OX09OQ0UocmV0KSkKKwkJCXByX3dhcm5pbmcoImVycm9yIGRpc2FibGluZyBzeXN0ZW0gJXNcbiIsCisJCQkJICAgc3lzdGVtLT5uYW1lKTsKKworCQlwcl9jb250KCJPS1xuIik7CisJfQorCisJLyogVGVzdCB3aXRoIGFsbCBldmVudHMgZW5hYmxlZCAqLworCisJcHJfaW5mbygiUnVubmluZyB0ZXN0cyBvbiBhbGwgdHJhY2UgZXZlbnRzOlxuIik7CisJcHJfaW5mbygiVGVzdGluZyBhbGwgZXZlbnRzOiAiKTsKKworCXJldCA9IF9fZnRyYWNlX3NldF9jbHJfZXZlbnQoTlVMTCwgTlVMTCwgTlVMTCwgMSk7CisJaWYgKFdBUk5fT05fT05DRShyZXQpKSB7CisJCXByX3dhcm5pbmcoImVycm9yIGVuYWJsaW5nIGFsbCBldmVudHNcbiIpOworCQlyZXR1cm47CisJfQorCisJZXZlbnRfdGVzdF9zdHVmZigpOworCisJLyogcmVzZXQgc3lzbmFtZSAqLworCXJldCA9IF9fZnRyYWNlX3NldF9jbHJfZXZlbnQoTlVMTCwgTlVMTCwgTlVMTCwgMCk7CisJaWYgKFdBUk5fT05fT05DRShyZXQpKSB7CisJCXByX3dhcm5pbmcoImVycm9yIGRpc2FibGluZyBhbGwgZXZlbnRzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByX2NvbnQoIk9LXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKKworc3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pY190LCB0ZXN0X2V2ZW50X2Rpc2FibGUpOworCitzdGF0aWMgdm9pZAorZnVuY3Rpb25fdGVzdF9ldmVudHNfY2FsbCh1bnNpZ25lZCBsb25nIGlwLCB1bnNpZ25lZCBsb25nIHBhcmVudF9pcCkKK3sKKwlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBmdHJhY2VfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyBkaXNhYmxlZDsKKwlpbnQgcmVzY2hlZDsKKwlpbnQgY3B1OworCWludCBwYzsKKworCXBjID0gcHJlZW1wdF9jb3VudCgpOworCXJlc2NoZWQgPSBmdHJhY2VfcHJlZW1wdF9kaXNhYmxlKCk7CisJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwlkaXNhYmxlZCA9IGF0b21pY19pbmNfcmV0dXJuKCZwZXJfY3B1KHRlc3RfZXZlbnRfZGlzYWJsZSwgY3B1KSk7CisKKwlpZiAoZGlzYWJsZWQgIT0gMSkKKwkJZ290byBvdXQ7CisKKwlsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsKKworCWV2ZW50ID0gdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKFRSQUNFX0ZOLCBzaXplb2YoKmVudHJ5KSwKKwkJCQkJCSAgZmxhZ3MsIHBjKTsKKwlpZiAoIWV2ZW50KQorCQlnb3RvIG91dDsKKwllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworCWVudHJ5LT5pcAkJCT0gaXA7CisJZW50cnktPnBhcmVudF9pcAkJPSBwYXJlbnRfaXA7CisKKwl0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXQoZXZlbnQsIGZsYWdzLCBwYyk7CisKKyBvdXQ6CisJYXRvbWljX2RlYygmcGVyX2NwdSh0ZXN0X2V2ZW50X2Rpc2FibGUsIGNwdSkpOworCWZ0cmFjZV9wcmVlbXB0X2VuYWJsZShyZXNjaGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIHRyYWNlX29wcyBfX2luaXRkYXRhICA9Cit7CisJLmZ1bmMgPSBmdW5jdGlvbl90ZXN0X2V2ZW50c19jYWxsLAorfTsKKworc3RhdGljIF9faW5pdCB2b2lkIGV2ZW50X3RyYWNlX3NlbGZfdGVzdF93aXRoX2Z1bmN0aW9uKHZvaWQpCit7CisJcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZ0cmFjZV9vcHMpOworCXByX2luZm8oIlJ1bm5pbmcgdGVzdHMgYWdhaW4sIGFsb25nIHdpdGggdGhlIGZ1bmN0aW9uIHRyYWNlclxuIik7CisJZXZlbnRfdHJhY2Vfc2VsZl90ZXN0cygpOworCXVucmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZ0cmFjZV9vcHMpOworfQorI2Vsc2UKK3N0YXRpYyBfX2luaXQgdm9pZCBldmVudF90cmFjZV9zZWxmX3Rlc3Rfd2l0aF9mdW5jdGlvbih2b2lkKQoreworfQorI2VuZGlmCisKK3N0YXRpYyBfX2luaXQgaW50IGV2ZW50X3RyYWNlX3NlbGZfdGVzdHNfaW5pdCh2b2lkKQoreworCisJZXZlbnRfdHJhY2Vfc2VsZl90ZXN0cygpOworCisJZXZlbnRfdHJhY2Vfc2VsZl90ZXN0X3dpdGhfZnVuY3Rpb24oKTsKKworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKGV2ZW50X3RyYWNlX3NlbGZfdGVzdHNfaW5pdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMKaW5kZXggZTAzY2JmMS4uZGI2ZTU0YiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jCkBAIC0yMiw1NSArMjIsMTM4IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgInRyYWNlLmgiCiAjaW5jbHVkZSAidHJhY2Vfb3V0cHV0LmgiCiAKLXN0YXRpYyBpbnQgZmlsdGVyX3ByZWRfNjQoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLCB2b2lkICpldmVudCkKK3N0YXRpYyBERUZJTkVfTVVURVgoZmlsdGVyX211dGV4KTsKKworZW51bSBmaWx0ZXJfb3BfaWRzCiB7Ci0JdTY0ICphZGRyID0gKHU2NCAqKShldmVudCArIHByZWQtPm9mZnNldCk7Ci0JdTY0IHZhbCA9ICh1NjQpcHJlZC0+dmFsOwotCWludCBtYXRjaDsKKwlPUF9PUiwKKwlPUF9BTkQsCisJT1BfTkUsCisJT1BfRVEsCisJT1BfTFQsCisJT1BfTEUsCisJT1BfR1QsCisJT1BfR0UsCisJT1BfTk9ORSwKKwlPUF9PUEVOX1BBUkVOLAorfTsKIAotCW1hdGNoID0gKHZhbCA9PSAqYWRkcikgXiBwcmVkLT5ub3Q7CitzdHJ1Y3QgZmlsdGVyX29wIHsKKwlpbnQgaWQ7CisJY2hhciAqc3RyaW5nOworCWludCBwcmVjZWRlbmNlOworfTsKIAotCXJldHVybiBtYXRjaDsKK3N0YXRpYyBzdHJ1Y3QgZmlsdGVyX29wIGZpbHRlcl9vcHNbXSA9IHsKKwl7IE9QX09SLCAifHwiLCAxIH0sCisJeyBPUF9BTkQsICImJiIsIDIgfSwKKwl7IE9QX05FLCAiIT0iLCA0IH0sCisJeyBPUF9FUSwgIj09IiwgNCB9LAorCXsgT1BfTFQsICI8IiwgNSB9LAorCXsgT1BfTEUsICI8PSIsIDUgfSwKKwl7IE9QX0dULCAiPiIsIDUgfSwKKwl7IE9QX0dFLCAiPj0iLCA1IH0sCisJeyBPUF9OT05FLCAiT1BfTk9ORSIsIDAgfSwKKwl7IE9QX09QRU5fUEFSRU4sICIoIiwgMCB9LAorfTsKKworZW51bSB7CisJRklMVF9FUlJfTk9ORSwKKwlGSUxUX0VSUl9JTlZBTElEX09QLAorCUZJTFRfRVJSX1VOQkFMQU5DRURfUEFSRU4sCisJRklMVF9FUlJfVE9PX01BTllfT1BFUkFORFMsCisJRklMVF9FUlJfT1BFUkFORF9UT09fTE9ORywKKwlGSUxUX0VSUl9GSUVMRF9OT1RfRk9VTkQsCisJRklMVF9FUlJfSUxMRUdBTF9GSUVMRF9PUCwKKwlGSUxUX0VSUl9JTExFR0FMX0lOVFZBTCwKKwlGSUxUX0VSUl9CQURfU1VCU1lTX0ZJTFRFUiwKKwlGSUxUX0VSUl9UT09fTUFOWV9QUkVEUywKKwlGSUxUX0VSUl9NSVNTSU5HX0ZJRUxELAorCUZJTFRfRVJSX0lOVkFMSURfRklMVEVSLAorfTsKKworc3RhdGljIGNoYXIgKmVycl90ZXh0W10gPSB7CisJIk5vIGVycm9yIiwKKwkiSW52YWxpZCBvcGVyYXRvciIsCisJIlVuYmFsYW5jZWQgcGFyZW5zIiwKKwkiVG9vIG1hbnkgb3BlcmFuZHMiLAorCSJPcGVyYW5kIHRvbyBsb25nIiwKKwkiRmllbGQgbm90IGZvdW5kIiwKKwkiSWxsZWdhbCBvcGVyYXRpb24gZm9yIGZpZWxkIHR5cGUiLAorCSJJbGxlZ2FsIGludGVnZXIgdmFsdWUiLAorCSJDb3VsZG4ndCBmaW5kIG9yIHNldCBmaWVsZCBpbiBvbmUgb2YgYSBzdWJzeXN0ZW0ncyBldmVudHMiLAorCSJUb28gbWFueSB0ZXJtcyBpbiBwcmVkaWNhdGUgZXhwcmVzc2lvbiIsCisJIk1pc3NpbmcgZmllbGQgbmFtZSBhbmQvb3IgdmFsdWUiLAorCSJNZWFuaW5nbGVzcyBmaWx0ZXIgZXhwcmVzc2lvbiIsCit9OworCitzdHJ1Y3Qgb3BzdGFja19vcCB7CisJaW50IG9wOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBwb3N0Zml4X2VsdCB7CisJaW50IG9wOworCWNoYXIgKm9wZXJhbmQ7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSB7CisJc3RydWN0IGZpbHRlcl9vcCAqb3BzOworCXN0cnVjdCBsaXN0X2hlYWQgb3BzdGFjazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvc3RmaXg7CisJaW50IGxhc3RlcnI7CisJaW50IGxhc3RlcnJfcG9zOworCisJc3RydWN0IHsKKwkJY2hhciAqc3RyaW5nOworCQl1bnNpZ25lZCBpbnQgY250OworCQl1bnNpZ25lZCBpbnQgdGFpbDsKKwl9IGluZml4OworCisJc3RydWN0IHsKKwkJY2hhciBzdHJpbmdbTUFYX0ZJTFRFUl9TVFJfVkFMXTsKKwkJaW50IHBvczsKKwkJdW5zaWduZWQgaW50IHRhaWw7CisJfSBvcGVyYW5kOworfTsKKworREVGSU5FX0NPTVBBUklTT05fUFJFRChzNjQpOworREVGSU5FX0NPTVBBUklTT05fUFJFRCh1NjQpOworREVGSU5FX0NPTVBBUklTT05fUFJFRChzMzIpOworREVGSU5FX0NPTVBBUklTT05fUFJFRCh1MzIpOworREVGSU5FX0NPTVBBUklTT05fUFJFRChzMTYpOworREVGSU5FX0NPTVBBUklTT05fUFJFRCh1MTYpOworREVGSU5FX0NPTVBBUklTT05fUFJFRChzOCk7CitERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHU4KTsKKworREVGSU5FX0VRVUFMSVRZX1BSRUQoNjQpOworREVGSU5FX0VRVUFMSVRZX1BSRUQoMzIpOworREVGSU5FX0VRVUFMSVRZX1BSRUQoMTYpOworREVGSU5FX0VRVUFMSVRZX1BSRUQoOCk7CisKK3N0YXRpYyBpbnQgZmlsdGVyX3ByZWRfYW5kKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCBfX2F0dHJpYnV0ZSgodW51c2VkKSksCisJCQkgICB2b2lkICpldmVudCBfX2F0dHJpYnV0ZSgodW51c2VkKSksCisJCQkgICBpbnQgdmFsMSwgaW50IHZhbDIpCit7CisJcmV0dXJuIHZhbDEgJiYgdmFsMjsKIH0KIAotc3RhdGljIGludCBmaWx0ZXJfcHJlZF8zMihzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQsIHZvaWQgKmV2ZW50KQorc3RhdGljIGludCBmaWx0ZXJfcHJlZF9vcihzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQgX19hdHRyaWJ1dGUoKHVudXNlZCkpLAorCQkJICB2b2lkICpldmVudCBfX2F0dHJpYnV0ZSgodW51c2VkKSksCisJCQkgIGludCB2YWwxLCBpbnQgdmFsMikKIHsKLQl1MzIgKmFkZHIgPSAodTMyICopKGV2ZW50ICsgcHJlZC0+b2Zmc2V0KTsKLQl1MzIgdmFsID0gKHUzMilwcmVkLT52YWw7Ci0JaW50IG1hdGNoOwotCi0JbWF0Y2ggPSAodmFsID09ICphZGRyKSBeIHByZWQtPm5vdDsKLQotCXJldHVybiBtYXRjaDsKKwlyZXR1cm4gdmFsMSB8fCB2YWwyOwogfQogCi1zdGF0aWMgaW50IGZpbHRlcl9wcmVkXzE2KHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQpCi17Ci0JdTE2ICphZGRyID0gKHUxNiAqKShldmVudCArIHByZWQtPm9mZnNldCk7Ci0JdTE2IHZhbCA9ICh1MTYpcHJlZC0+dmFsOwotCWludCBtYXRjaDsKLQotCW1hdGNoID0gKHZhbCA9PSAqYWRkcikgXiBwcmVkLT5ub3Q7Ci0KLQlyZXR1cm4gbWF0Y2g7Ci19Ci0KLXN0YXRpYyBpbnQgZmlsdGVyX3ByZWRfOChzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQsIHZvaWQgKmV2ZW50KQotewotCXU4ICphZGRyID0gKHU4ICopKGV2ZW50ICsgcHJlZC0+b2Zmc2V0KTsKLQl1OCB2YWwgPSAodTgpcHJlZC0+dmFsOwotCWludCBtYXRjaDsKLQotCW1hdGNoID0gKHZhbCA9PSAqYWRkcikgXiBwcmVkLT5ub3Q7Ci0KLQlyZXR1cm4gbWF0Y2g7Ci19Ci0KLXN0YXRpYyBpbnQgZmlsdGVyX3ByZWRfc3RyaW5nKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQpCisvKiBGaWx0ZXIgcHJlZGljYXRlIGZvciBmaXhlZCBzaXplZCBhcnJheXMgb2YgY2hhcmFjdGVycyAqLworc3RhdGljIGludCBmaWx0ZXJfcHJlZF9zdHJpbmcoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLCB2b2lkICpldmVudCwKKwkJCSAgICAgIGludCB2YWwxLCBpbnQgdmFsMikKIHsKIAljaGFyICphZGRyID0gKGNoYXIgKikoZXZlbnQgKyBwcmVkLT5vZmZzZXQpOwogCWludCBjbXAsIG1hdGNoOwpAQCAtODIsNTkgKzE2NSwxNTQgQEAKIAlyZXR1cm4gbWF0Y2g7CiB9CiAKKy8qCisgKiBGaWx0ZXIgcHJlZGljYXRlIGZvciBkeW5hbWljIHNpemVkIGFycmF5cyBvZiBjaGFyYWN0ZXJzLgorICogVGhlc2UgYXJlIGltcGxlbWVudGVkIHRocm91Z2ggYSBsaXN0IG9mIHN0cmluZ3MgYXQgdGhlIGVuZAorICogb2YgdGhlIGVudHJ5LgorICogQWxzbyBlYWNoIG9mIHRoZXNlIHN0cmluZ3MgaGF2ZSBhIGZpZWxkIGluIHRoZSBlbnRyeSB3aGljaAorICogY29udGFpbnMgaXRzIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGVudHJ5LgorICogV2UgaGF2ZSB0aGVuIGZpcnN0IHRvIGdldCB0aGlzIGZpZWxkLCBkZXJlZmVyZW5jZSBpdAorICogYW5kIGFkZCBpdCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgZW50cnksIGFuZCBhdCBsYXN0IHdlIGhhdmUKKyAqIHRoZSBhZGRyZXNzIG9mIHRoZSBzdHJpbmcuCisgKi8KK3N0YXRpYyBpbnQgZmlsdGVyX3ByZWRfc3RybG9jKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQsCisJCQkgICAgICBpbnQgdmFsMSwgaW50IHZhbDIpCit7CisJaW50IHN0cl9sb2MgPSAqKGludCAqKShldmVudCArIHByZWQtPm9mZnNldCk7CisJY2hhciAqYWRkciA9IChjaGFyICopKGV2ZW50ICsgc3RyX2xvYyk7CisJaW50IGNtcCwgbWF0Y2g7CisKKwljbXAgPSBzdHJuY21wKGFkZHIsIHByZWQtPnN0cl92YWwsIHByZWQtPnN0cl9sZW4pOworCisJbWF0Y2ggPSAoIWNtcCkgXiBwcmVkLT5ub3Q7CisKKwlyZXR1cm4gbWF0Y2g7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3ByZWRfbm9uZShzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQsIHZvaWQgKmV2ZW50LAorCQkJICAgIGludCB2YWwxLCBpbnQgdmFsMikKK3sKKwlyZXR1cm4gMDsKK30KKwogLyogcmV0dXJuIDEgaWYgZXZlbnQgbWF0Y2hlcywgMCBvdGhlcndpc2UgKGRpc2NhcmQpICovCiBpbnQgZmlsdGVyX21hdGNoX3ByZWRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgdm9pZCAqcmVjKQogewotCWludCBpLCBtYXRjaGVkLCBhbmRfZmFpbGVkID0gMDsKLQlzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQ7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJTFRFUl9QUkVEOyBpKyspIHsKLQkJaWYgKGNhbGwtPnByZWRzW2ldKSB7Ci0JCQlwcmVkID0gY2FsbC0+cHJlZHNbaV07Ci0JCQlpZiAoYW5kX2ZhaWxlZCAmJiAhcHJlZC0+b3IpCi0JCQkJY29udGludWU7Ci0JCQltYXRjaGVkID0gcHJlZC0+Zm4ocHJlZCwgcmVjKTsKLQkJCWlmICghbWF0Y2hlZCAmJiAhcHJlZC0+b3IpIHsKLQkJCQlhbmRfZmFpbGVkID0gMTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAobWF0Y2hlZCAmJiBwcmVkLT5vcikKLQkJCQlyZXR1cm4gMTsKLQkJfSBlbHNlCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoYW5kX2ZhaWxlZCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBmaWx0ZXJfcHJpbnRfcHJlZHMoc3RydWN0IGZpbHRlcl9wcmVkICoqcHJlZHMsIHN0cnVjdCB0cmFjZV9zZXEgKnMpCi17Ci0JY2hhciAqZmllbGRfbmFtZTsKKwlzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIgPSBjYWxsLT5maWx0ZXI7CisJaW50IG1hdGNoLCB0b3AgPSAwLCB2YWwxID0gMCwgdmFsMiA9IDA7CisJaW50IHN0YWNrW01BWF9GSUxURVJfUFJFRF07CiAJc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkOwogCWludCBpOwogCi0JaWYgKCFwcmVkcykgewotCQl0cmFjZV9zZXFfcHJpbnRmKHMsICJub25lXG4iKTsKLQkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5fcHJlZHM7IGkrKykgeworCQlwcmVkID0gZmlsdGVyLT5wcmVkc1tpXTsKKwkJaWYgKCFwcmVkLT5wb3BfbikgeworCQkJbWF0Y2ggPSBwcmVkLT5mbihwcmVkLCByZWMsIHZhbDEsIHZhbDIpOworCQkJc3RhY2tbdG9wKytdID0gbWF0Y2g7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocHJlZC0+cG9wX24gPiB0b3ApIHsKKwkJCVdBUk5fT05fT05DRSgxKTsKKwkJCXJldHVybiAwOworCQl9CisJCXZhbDEgPSBzdGFja1stLXRvcF07CisJCXZhbDIgPSBzdGFja1stLXRvcF07CisJCW1hdGNoID0gcHJlZC0+Zm4ocHJlZCwgcmVjLCB2YWwxLCB2YWwyKTsKKwkJc3RhY2tbdG9wKytdID0gbWF0Y2g7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9GSUxURVJfUFJFRDsgaSsrKSB7Ci0JCWlmIChwcmVkc1tpXSkgewotCQkJcHJlZCA9IHByZWRzW2ldOwotCQkJZmllbGRfbmFtZSA9IHByZWQtPmZpZWxkX25hbWU7Ci0JCQlpZiAoaSkKLQkJCQl0cmFjZV9zZXFfcHJpbnRmKHMsIHByZWQtPm9yID8gInx8ICIgOiAiJiYgIik7Ci0JCQl0cmFjZV9zZXFfcHJpbnRmKHMsICIlcyAiLCBmaWVsZF9uYW1lKTsKLQkJCXRyYWNlX3NlcV9wcmludGYocywgcHJlZC0+bm90ID8gIiE9ICIgOiAiPT0gIik7Ci0JCQlpZiAocHJlZC0+c3RyX3ZhbCkKLQkJCQl0cmFjZV9zZXFfcHJpbnRmKHMsICIlc1xuIiwgcHJlZC0+c3RyX3ZhbCk7Ci0JCQllbHNlCi0JCQkJdHJhY2Vfc2VxX3ByaW50ZihzLCAiJWxsdVxuIiwgcHJlZC0+dmFsKTsKLQkJfSBlbHNlCi0JCQlicmVhazsKLQl9CisJcmV0dXJuIHN0YWNrWy0tdG9wXTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZpbHRlcl9tYXRjaF9wcmVkcyk7CisKK3N0YXRpYyB2b2lkIHBhcnNlX2Vycm9yKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLCBpbnQgZXJyLCBpbnQgcG9zKQoreworCXBzLT5sYXN0ZXJyID0gZXJyOworCXBzLT5sYXN0ZXJyX3BvcyA9IHBvczsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZpbHRlcl9zdHJpbmcoc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyKQoreworCWtmcmVlKGZpbHRlci0+ZmlsdGVyX3N0cmluZyk7CisJZmlsdGVyLT5maWx0ZXJfc3RyaW5nID0gTlVMTDsKK30KKworc3RhdGljIGludCByZXBsYWNlX2ZpbHRlcl9zdHJpbmcoc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyLAorCQkJCSBjaGFyICpmaWx0ZXJfc3RyaW5nKQoreworCWtmcmVlKGZpbHRlci0+ZmlsdGVyX3N0cmluZyk7CisJZmlsdGVyLT5maWx0ZXJfc3RyaW5nID0ga3N0cmR1cChmaWx0ZXJfc3RyaW5nLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbHRlci0+ZmlsdGVyX3N0cmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHBlbmRfZmlsdGVyX3N0cmluZyhzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIsCisJCQkJY2hhciAqc3RyaW5nKQoreworCWludCBuZXdsZW47CisJY2hhciAqbmV3X2ZpbHRlcl9zdHJpbmc7CisKKwlCVUdfT04oIWZpbHRlci0+ZmlsdGVyX3N0cmluZyk7CisJbmV3bGVuID0gc3RybGVuKGZpbHRlci0+ZmlsdGVyX3N0cmluZykgKyBzdHJsZW4oc3RyaW5nKSArIDE7CisJbmV3X2ZpbHRlcl9zdHJpbmcgPSBrbWFsbG9jKG5ld2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfZmlsdGVyX3N0cmluZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdHJjcHkobmV3X2ZpbHRlcl9zdHJpbmcsIGZpbHRlci0+ZmlsdGVyX3N0cmluZyk7CisJc3RyY2F0KG5ld19maWx0ZXJfc3RyaW5nLCBzdHJpbmcpOworCWtmcmVlKGZpbHRlci0+ZmlsdGVyX3N0cmluZyk7CisJZmlsdGVyLT5maWx0ZXJfc3RyaW5nID0gbmV3X2ZpbHRlcl9zdHJpbmc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX2ZpbHRlcl9lcnIoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMsCisJCQkgICAgICBzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIpCit7CisJaW50IHBvcyA9IHBzLT5sYXN0ZXJyX3BvczsKKwljaGFyICpidWYsICpwYnVmOworCisJYnVmID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX1RFTVBPUkFSWSk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCWFwcGVuZF9maWx0ZXJfc3RyaW5nKGZpbHRlciwgIlxuIik7CisJbWVtc2V0KGJ1ZiwgJyAnLCBQQUdFX1NJWkUpOworCWlmIChwb3MgPiBQQUdFX1NJWkUgLSAxMjgpCisJCXBvcyA9IDA7CisJYnVmW3Bvc10gPSAnXic7CisJcGJ1ZiA9ICZidWZbcG9zXSArIDE7CisKKwlzcHJpbnRmKHBidWYsICJcbnBhcnNlX2Vycm9yOiAlc1xuIiwgZXJyX3RleHRbcHMtPmxhc3RlcnJdKTsKKwlhcHBlbmRfZmlsdGVyX3N0cmluZyhmaWx0ZXIsIGJ1Zik7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworfQorCit2b2lkIHByaW50X2V2ZW50X2ZpbHRlcihzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIHN0cnVjdCB0cmFjZV9zZXEgKnMpCit7CisJc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyID0gY2FsbC0+ZmlsdGVyOworCisJbXV0ZXhfbG9jaygmZmlsdGVyX211dGV4KTsKKwlpZiAoZmlsdGVyLT5maWx0ZXJfc3RyaW5nKQorCQl0cmFjZV9zZXFfcHJpbnRmKHMsICIlc1xuIiwgZmlsdGVyLT5maWx0ZXJfc3RyaW5nKTsKKwllbHNlCisJCXRyYWNlX3NlcV9wcmludGYocywgIm5vbmVcbiIpOworCW11dGV4X3VubG9jaygmZmlsdGVyX211dGV4KTsKK30KKwordm9pZCBwcmludF9zdWJzeXN0ZW1fZXZlbnRfZmlsdGVyKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSwKKwkJCQkgIHN0cnVjdCB0cmFjZV9zZXEgKnMpCit7CisJc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyID0gc3lzdGVtLT5maWx0ZXI7CisKKwltdXRleF9sb2NrKCZmaWx0ZXJfbXV0ZXgpOworCWlmIChmaWx0ZXItPmZpbHRlcl9zdHJpbmcpCisJCXRyYWNlX3NlcV9wcmludGYocywgIiVzXG4iLCBmaWx0ZXItPmZpbHRlcl9zdHJpbmcpOworCWVsc2UKKwkJdHJhY2Vfc2VxX3ByaW50ZihzLCAibm9uZVxuIik7CisJbXV0ZXhfdW5sb2NrKCZmaWx0ZXJfbXV0ZXgpOwogfQogCiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9maWVsZCAqCkBAIC0xNTAsMjg0ICszMjgsODI4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgZmlsdGVyX2ZyZWVfcHJlZChzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQpCitzdGF0aWMgdm9pZCBmaWx0ZXJfZnJlZV9wcmVkKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCkKIHsKIAlpZiAoIXByZWQpCiAJCXJldHVybjsKIAogCWtmcmVlKHByZWQtPmZpZWxkX25hbWUpOwotCWtmcmVlKHByZWQtPnN0cl92YWwpOwogCWtmcmVlKHByZWQpOwogfQogCi12b2lkIGZpbHRlcl9mcmVlX3ByZWRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCkKK3N0YXRpYyB2b2lkIGZpbHRlcl9jbGVhcl9wcmVkKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCkKIHsKLQlpbnQgaTsKLQotCWlmIChjYWxsLT5wcmVkcykgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJTFRFUl9QUkVEOyBpKyspCi0JCQlmaWx0ZXJfZnJlZV9wcmVkKGNhbGwtPnByZWRzW2ldKTsKLQkJa2ZyZWUoY2FsbC0+cHJlZHMpOwotCQljYWxsLT5wcmVkcyA9IE5VTEw7Ci0JfQorCWtmcmVlKHByZWQtPmZpZWxkX25hbWUpOworCXByZWQtPmZpZWxkX25hbWUgPSBOVUxMOworCXByZWQtPnN0cl9sZW4gPSAwOwogfQogCi12b2lkIGZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0pCitzdGF0aWMgaW50IGZpbHRlcl9zZXRfcHJlZChzdHJ1Y3QgZmlsdGVyX3ByZWQgKmRlc3QsCisJCQkgICBzdHJ1Y3QgZmlsdGVyX3ByZWQgKnNyYywKKwkJCSAgIGZpbHRlcl9wcmVkX2ZuX3QgZm4pCiB7Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gX19zdGFydF9mdHJhY2VfZXZlbnRzOwotCWludCBpOwotCi0JaWYgKHN5c3RlbS0+cHJlZHMpIHsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9GSUxURVJfUFJFRDsgaSsrKQotCQkJZmlsdGVyX2ZyZWVfcHJlZChzeXN0ZW0tPnByZWRzW2ldKTsKLQkJa2ZyZWUoc3lzdGVtLT5wcmVkcyk7Ci0JCXN5c3RlbS0+cHJlZHMgPSBOVUxMOwotCX0KLQotCWV2ZW50c19mb3JfZWFjaChjYWxsKSB7Ci0JCWlmICghY2FsbC0+bmFtZSB8fCAhY2FsbC0+cmVnZnVuYykKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghc3RyY21wKGNhbGwtPnN5c3RlbSwgc3lzdGVtLT5uYW1lKSkKLQkJCWZpbHRlcl9mcmVlX3ByZWRzKGNhbGwpOwotCX0KLX0KLQotc3RhdGljIGludCBfX2ZpbHRlcl9hZGRfcHJlZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCi0JCQkgICAgIHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCkKLXsKLQlpbnQgaTsKLQotCWlmIChjYWxsLT5wcmVkcyAmJiAhcHJlZC0+Y29tcG91bmQpCi0JCWZpbHRlcl9mcmVlX3ByZWRzKGNhbGwpOwotCi0JaWYgKCFjYWxsLT5wcmVkcykgewotCQljYWxsLT5wcmVkcyA9IGt6YWxsb2MoTUFYX0ZJTFRFUl9QUkVEICogc2l6ZW9mKHByZWQpLAotCQkJCSAgICAgIEdGUF9LRVJORUwpOwotCQlpZiAoIWNhbGwtPnByZWRzKQorCSpkZXN0ID0gKnNyYzsKKwlpZiAoc3JjLT5maWVsZF9uYW1lKSB7CisJCWRlc3QtPmZpZWxkX25hbWUgPSBrc3RyZHVwKHNyYy0+ZmllbGRfbmFtZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGVzdC0+ZmllbGRfbmFtZSkKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfRklMVEVSX1BSRUQ7IGkrKykgewotCQlpZiAoIWNhbGwtPnByZWRzW2ldKSB7Ci0JCQljYWxsLT5wcmVkc1tpXSA9IHByZWQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXJldHVybiAtRU5PU1BDOwotfQotCi1zdGF0aWMgaW50IGlzX3N0cmluZ19maWVsZChjb25zdCBjaGFyICp0eXBlKQotewotCWlmIChzdHJjaHIodHlwZSwgJ1snKSAmJiBzdHJzdHIodHlwZSwgImNoYXIiKSkKLQkJcmV0dXJuIDE7CisJZGVzdC0+Zm4gPSBmbjsKIAogCXJldHVybiAwOwogfQogCi1pbnQgZmlsdGVyX2FkZF9wcmVkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKQorc3RhdGljIHZvaWQgZmlsdGVyX2Rpc2FibGVfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKQogewotCXN0cnVjdCBmdHJhY2VfZXZlbnRfZmllbGQgKmZpZWxkOwotCi0JZmllbGQgPSBmaW5kX2V2ZW50X2ZpZWxkKGNhbGwsIHByZWQtPmZpZWxkX25hbWUpOwotCWlmICghZmllbGQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcHJlZC0+b2Zmc2V0ID0gZmllbGQtPm9mZnNldDsKLQotCWlmIChpc19zdHJpbmdfZmllbGQoZmllbGQtPnR5cGUpKSB7Ci0JCWlmICghcHJlZC0+c3RyX3ZhbCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlwcmVkLT5mbiA9IGZpbHRlcl9wcmVkX3N0cmluZzsKLQkJcHJlZC0+c3RyX2xlbiA9IGZpZWxkLT5zaXplOwotCQlyZXR1cm4gX19maWx0ZXJfYWRkX3ByZWQoY2FsbCwgcHJlZCk7Ci0JfSBlbHNlIHsKLQkJaWYgKHByZWQtPnN0cl92YWwpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzd2l0Y2ggKGZpZWxkLT5zaXplKSB7Ci0JY2FzZSA4OgotCQlwcmVkLT5mbiA9IGZpbHRlcl9wcmVkXzY0OwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCXByZWQtPmZuID0gZmlsdGVyX3ByZWRfMzI7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJcHJlZC0+Zm4gPSBmaWx0ZXJfcHJlZF8xNjsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlwcmVkLT5mbiA9IGZpbHRlcl9wcmVkXzg7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBfX2ZpbHRlcl9hZGRfcHJlZChjYWxsLCBwcmVkKTsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWx0ZXJfcHJlZCAqY29weV9wcmVkKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCkKLXsKLQlzdHJ1Y3QgZmlsdGVyX3ByZWQgKm5ld19wcmVkID0ga21hbGxvYyhzaXplb2YoKnByZWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5ld19wcmVkKQotCQlyZXR1cm4gTlVMTDsKLQotCW1lbWNweShuZXdfcHJlZCwgcHJlZCwgc2l6ZW9mKCpwcmVkKSk7Ci0KLQlpZiAocHJlZC0+ZmllbGRfbmFtZSkgewotCQluZXdfcHJlZC0+ZmllbGRfbmFtZSA9IGtzdHJkdXAocHJlZC0+ZmllbGRfbmFtZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3X3ByZWQtPmZpZWxkX25hbWUpIHsKLQkJCWtmcmVlKG5ld19wcmVkKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKHByZWQtPnN0cl92YWwpIHsKLQkJbmV3X3ByZWQtPnN0cl92YWwgPSBrc3RyZHVwKHByZWQtPnN0cl92YWwsIEdGUF9LRVJORUwpOwotCQlpZiAoIW5ld19wcmVkLT5zdHJfdmFsKSB7Ci0JCQlmaWx0ZXJfZnJlZV9wcmVkKG5ld19wcmVkKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCi0JcmV0dXJuIG5ld19wcmVkOwotfQotCi1pbnQgZmlsdGVyX2FkZF9zdWJzeXN0ZW1fcHJlZChzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0sCi0JCQkgICAgICBzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQpCi17Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gX19zdGFydF9mdHJhY2VfZXZlbnRzOwotCXN0cnVjdCBmaWx0ZXJfcHJlZCAqZXZlbnRfcHJlZDsKKwlzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIgPSBjYWxsLT5maWx0ZXI7CiAJaW50IGk7CiAKLQlpZiAoc3lzdGVtLT5wcmVkcyAmJiAhcHJlZC0+Y29tcG91bmQpCi0JCWZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzeXN0ZW0pOworCWNhbGwtPmZpbHRlcl9hY3RpdmUgPSAwOworCWZpbHRlci0+bl9wcmVkcyA9IDA7CiAKLQlpZiAoIXN5c3RlbS0+cHJlZHMpIHsKLQkJc3lzdGVtLT5wcmVkcyA9IGt6YWxsb2MoTUFYX0ZJTFRFUl9QUkVEICogc2l6ZW9mKHByZWQpLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFzeXN0ZW0tPnByZWRzKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfRklMVEVSX1BSRUQ7IGkrKykKKwkJZmlsdGVyLT5wcmVkc1tpXS0+Zm4gPSBmaWx0ZXJfcHJlZF9ub25lOworfQorCit2b2lkIGRlc3Ryb3lfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKQoreworCXN0cnVjdCBldmVudF9maWx0ZXIgKmZpbHRlciA9IGNhbGwtPmZpbHRlcjsKKwlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfRklMVEVSX1BSRUQ7IGkrKykgewotCQlpZiAoIXN5c3RlbS0+cHJlZHNbaV0pIHsKLQkJCXN5c3RlbS0+cHJlZHNbaV0gPSBwcmVkOwotCQkJYnJlYWs7Ci0JCX0KKwkJaWYgKGZpbHRlci0+cHJlZHNbaV0pCisJCQlmaWx0ZXJfZnJlZV9wcmVkKGZpbHRlci0+cHJlZHNbaV0pOwogCX0KKwlrZnJlZShmaWx0ZXItPnByZWRzKTsKKwlrZnJlZShmaWx0ZXIpOworCWNhbGwtPmZpbHRlciA9IE5VTEw7Cit9CiAKLQlpZiAoaSA9PSBNQVhfRklMVEVSX1BSRUQpCi0JCXJldHVybiAtRU5PU1BDOworaW50IGluaXRfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKQoreworCXN0cnVjdCBldmVudF9maWx0ZXIgKmZpbHRlcjsKKwlzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQ7CisJaW50IGk7CiAKLQlldmVudHNfZm9yX2VhY2goY2FsbCkgewotCQlpbnQgZXJyOworCWZpbHRlciA9IGNhbGwtPmZpbHRlciA9IGt6YWxsb2Moc2l6ZW9mKCpmaWx0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbGwtPmZpbHRlcikKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkJaWYgKCFjYWxsLT5uYW1lIHx8ICFjYWxsLT5yZWdmdW5jKQotCQkJY29udGludWU7CisJY2FsbC0+ZmlsdGVyX2FjdGl2ZSA9IDA7CisJZmlsdGVyLT5uX3ByZWRzID0gMDsKIAotCQlpZiAoc3RyY21wKGNhbGwtPnN5c3RlbSwgc3lzdGVtLT5uYW1lKSkKLQkJCWNvbnRpbnVlOworCWZpbHRlci0+cHJlZHMgPSBremFsbG9jKE1BWF9GSUxURVJfUFJFRCAqIHNpemVvZihwcmVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWx0ZXItPnByZWRzKQorCQlnb3RvIG9vbTsKIAotCQlpZiAoIWZpbmRfZXZlbnRfZmllbGQoY2FsbCwgcHJlZC0+ZmllbGRfbmFtZSkpCi0JCQljb250aW51ZTsKLQotCQlldmVudF9wcmVkID0gY29weV9wcmVkKHByZWQpOwotCQlpZiAoIWV2ZW50X3ByZWQpCisJZm9yIChpID0gMDsgaSA8IE1BWF9GSUxURVJfUFJFRDsgaSsrKSB7CisJCXByZWQgPSBremFsbG9jKHNpemVvZigqcHJlZCksIEdGUF9LRVJORUwpOworCQlpZiAoIXByZWQpCiAJCQlnb3RvIG9vbTsKLQotCQllcnIgPSBmaWx0ZXJfYWRkX3ByZWQoY2FsbCwgZXZlbnRfcHJlZCk7Ci0JCWlmIChlcnIpCi0JCQlmaWx0ZXJfZnJlZV9wcmVkKGV2ZW50X3ByZWQpOwotCQlpZiAoZXJyID09IC1FTk9NRU0pCi0JCQlnb3RvIG9vbTsKKwkJcHJlZC0+Zm4gPSBmaWx0ZXJfcHJlZF9ub25lOworCQlmaWx0ZXItPnByZWRzW2ldID0gcHJlZDsKIAl9CiAKIAlyZXR1cm4gMDsKIAogb29tOgotCXN5c3RlbS0+cHJlZHNbaV0gPSBOVUxMOworCWRlc3Ryb3lfcHJlZHMoY2FsbCk7CisKIAlyZXR1cm4gLUVOT01FTTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGluaXRfcHJlZHMpOwogCi1pbnQgZmlsdGVyX3BhcnNlKGNoYXIgKipwYnVmLCBzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQpCitzdGF0aWMgdm9pZCBmaWx0ZXJfZnJlZV9zdWJzeXN0ZW1fcHJlZHMoc3RydWN0IGV2ZW50X3N1YnN5c3RlbSAqc3lzdGVtKQogewotCWNoYXIgKnRtcCwgKnRvaywgKnZhbF9zdHIgPSBOVUxMOwotCWludCB0b2tfbiA9IDA7CisJc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyID0gc3lzdGVtLT5maWx0ZXI7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsOworCWludCBpOwogCi0JLyogZmllbGQgPT0vIT0gbnVtYmVyLCBvci9hbmQgZmllbGQgPT0vIT0gbnVtYmVyLCBudW1iZXIgKi8KLQl3aGlsZSAoKHRvayA9IHN0cnNlcChwYnVmLCAiIFxuIikpKSB7Ci0JCWlmICh0b2tfbiA9PSAwKSB7Ci0JCQlpZiAoIXN0cmNtcCh0b2ssICIwIikpIHsKLQkJCQlwcmVkLT5jbGVhciA9IDE7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAodG9rLCAiJiYiKSkgewotCQkJCXByZWQtPm9yID0gMDsKLQkJCQlwcmVkLT5jb21wb3VuZCA9IDE7Ci0JCQl9IGVsc2UgaWYgKCFzdHJjbXAodG9rLCAifHwiKSkgewotCQkJCXByZWQtPm9yID0gMTsKLQkJCQlwcmVkLT5jb21wb3VuZCA9IDE7Ci0JCQl9IGVsc2UKLQkJCQlwcmVkLT5maWVsZF9uYW1lID0gdG9rOwotCQkJdG9rX24gPSAxOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHRva19uID09IDEpIHsKLQkJCWlmICghcHJlZC0+ZmllbGRfbmFtZSkKLQkJCQlwcmVkLT5maWVsZF9uYW1lID0gdG9rOwotCQkJZWxzZSBpZiAoIXN0cmNtcCh0b2ssICIhPSIpKQotCQkJCXByZWQtPm5vdCA9IDE7Ci0JCQllbHNlIGlmICghc3RyY21wKHRvaywgIj09IikpCi0JCQkJcHJlZC0+bm90ID0gMDsKLQkJCWVsc2UgewotCQkJCXByZWQtPmZpZWxkX25hbWUgPSBOVUxMOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJdG9rX24gPSAyOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHRva19uID09IDIpIHsKLQkJCWlmIChwcmVkLT5jb21wb3VuZCkgewotCQkJCWlmICghc3RyY21wKHRvaywgIiE9IikpCi0JCQkJCXByZWQtPm5vdCA9IDE7Ci0JCQkJZWxzZSBpZiAoIXN0cmNtcCh0b2ssICI9PSIpKQotCQkJCQlwcmVkLT5ub3QgPSAwOwotCQkJCWVsc2UgewotCQkJCQlwcmVkLT5maWVsZF9uYW1lID0gTlVMTDsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl2YWxfc3RyID0gdG9rOwotCQkJCWJyZWFrOyAvKiBkb25lICovCi0JCQl9Ci0JCQl0b2tfbiA9IDM7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAodG9rX24gPT0gMykgewotCQkJdmFsX3N0ciA9IHRvazsKLQkJCWJyZWFrOyAvKiBkb25lICovCi0JCX0KKwlpZiAoZmlsdGVyLT5uX3ByZWRzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5fcHJlZHM7IGkrKykKKwkJCWZpbHRlcl9mcmVlX3ByZWQoZmlsdGVyLT5wcmVkc1tpXSk7CisJCWtmcmVlKGZpbHRlci0+cHJlZHMpOworCQlmaWx0ZXItPnByZWRzID0gTlVMTDsKKwkJZmlsdGVyLT5uX3ByZWRzID0gMDsKIAl9CiAKLQlpZiAoIXZhbF9zdHIpIHsKLQkJcHJlZC0+ZmllbGRfbmFtZSA9IE5VTEw7Ci0JCXJldHVybiAtRUlOVkFMOworCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CisJCWlmICghY2FsbC0+ZGVmaW5lX2ZpZWxkcykKKwkJCWNvbnRpbnVlOworCisJCWlmICghc3RyY21wKGNhbGwtPnN5c3RlbSwgc3lzdGVtLT5uYW1lKSkgeworCQkJZmlsdGVyX2Rpc2FibGVfcHJlZHMoY2FsbCk7CisJCQlyZW1vdmVfZmlsdGVyX3N0cmluZyhjYWxsLT5maWx0ZXIpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZXZlbnRfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9hZGRfcHJlZF9mbihzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywKKwkJCSAgICAgIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwKKwkJCSAgICAgIHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwKKwkJCSAgICAgIGZpbHRlcl9wcmVkX2ZuX3QgZm4pCit7CisJc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyID0gY2FsbC0+ZmlsdGVyOworCWludCBpZHgsIGVycjsKKworCWlmIChmaWx0ZXItPm5fcHJlZHMgPT0gTUFYX0ZJTFRFUl9QUkVEKSB7CisJCXBhcnNlX2Vycm9yKHBzLCBGSUxUX0VSUl9UT09fTUFOWV9QUkVEUywgMCk7CisJCXJldHVybiAtRU5PU1BDOwogCX0KIAotCXByZWQtPmZpZWxkX25hbWUgPSBrc3RyZHVwKHByZWQtPmZpZWxkX25hbWUsIEdGUF9LRVJORUwpOwotCWlmICghcHJlZC0+ZmllbGRfbmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWR4ID0gZmlsdGVyLT5uX3ByZWRzOworCWZpbHRlcl9jbGVhcl9wcmVkKGZpbHRlci0+cHJlZHNbaWR4XSk7CisJZXJyID0gZmlsdGVyX3NldF9wcmVkKGZpbHRlci0+cHJlZHNbaWR4XSwgcHJlZCwgZm4pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CiAKLQlwcmVkLT52YWwgPSBzaW1wbGVfc3RydG91bGwodmFsX3N0ciwgJnRtcCwgMCk7Ci0JaWYgKHRtcCA9PSB2YWxfc3RyKSB7Ci0JCXByZWQtPnN0cl92YWwgPSBrc3RyZHVwKHZhbF9zdHIsIEdGUF9LRVJORUwpOwotCQlpZiAoIXByZWQtPnN0cl92YWwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9IGVsc2UgaWYgKCp0bXAgIT0gJ1wwJykKLQkJcmV0dXJuIC1FSU5WQUw7CisJZmlsdGVyLT5uX3ByZWRzKys7CisJY2FsbC0+ZmlsdGVyX2FjdGl2ZSA9IDE7CiAKIAlyZXR1cm4gMDsKIH0KIAorZW51bSB7CisJRklMVEVSX1NUQVRJQ19TVFJJTkcgPSAxLAorCUZJTFRFUl9EWU5fU1RSSU5HCit9OworCitzdGF0aWMgaW50IGlzX3N0cmluZ19maWVsZChjb25zdCBjaGFyICp0eXBlKQoreworCWlmIChzdHJzdHIodHlwZSwgIl9fZGF0YV9sb2MiKSAmJiBzdHJzdHIodHlwZSwgImNoYXIiKSkKKwkJcmV0dXJuIEZJTFRFUl9EWU5fU1RSSU5HOworCisJaWYgKHN0cmNocih0eXBlLCAnWycpICYmIHN0cnN0cih0eXBlLCAiY2hhciIpKQorCQlyZXR1cm4gRklMVEVSX1NUQVRJQ19TVFJJTkc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19sZWdhbF9vcChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2ZpZWxkICpmaWVsZCwgaW50IG9wKQoreworCWlmIChpc19zdHJpbmdfZmllbGQoZmllbGQtPnR5cGUpICYmIChvcCAhPSBPUF9FUSAmJiBvcCAhPSBPUF9ORSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBmaWx0ZXJfcHJlZF9mbl90IHNlbGVjdF9jb21wYXJpc29uX2ZuKGludCBvcCwgaW50IGZpZWxkX3NpemUsCisJCQkJCSAgICAgaW50IGZpZWxkX2lzX3NpZ25lZCkKK3sKKwlmaWx0ZXJfcHJlZF9mbl90IGZuID0gTlVMTDsKKworCXN3aXRjaCAoZmllbGRfc2l6ZSkgeworCWNhc2UgODoKKwkJaWYgKG9wID09IE9QX0VRIHx8IG9wID09IE9QX05FKQorCQkJZm4gPSBmaWx0ZXJfcHJlZF82NDsKKwkJZWxzZSBpZiAoZmllbGRfaXNfc2lnbmVkKQorCQkJZm4gPSBmaWx0ZXJfcHJlZF9zNjQ7CisJCWVsc2UKKwkJCWZuID0gZmlsdGVyX3ByZWRfdTY0OworCQlicmVhazsKKwljYXNlIDQ6CisJCWlmIChvcCA9PSBPUF9FUSB8fCBvcCA9PSBPUF9ORSkKKwkJCWZuID0gZmlsdGVyX3ByZWRfMzI7CisJCWVsc2UgaWYgKGZpZWxkX2lzX3NpZ25lZCkKKwkJCWZuID0gZmlsdGVyX3ByZWRfczMyOworCQllbHNlCisJCQlmbiA9IGZpbHRlcl9wcmVkX3UzMjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpZiAob3AgPT0gT1BfRVEgfHwgb3AgPT0gT1BfTkUpCisJCQlmbiA9IGZpbHRlcl9wcmVkXzE2OworCQllbHNlIGlmIChmaWVsZF9pc19zaWduZWQpCisJCQlmbiA9IGZpbHRlcl9wcmVkX3MxNjsKKwkJZWxzZQorCQkJZm4gPSBmaWx0ZXJfcHJlZF91MTY7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKG9wID09IE9QX0VRIHx8IG9wID09IE9QX05FKQorCQkJZm4gPSBmaWx0ZXJfcHJlZF84OworCQllbHNlIGlmIChmaWVsZF9pc19zaWduZWQpCisJCQlmbiA9IGZpbHRlcl9wcmVkX3M4OworCQllbHNlCisJCQlmbiA9IGZpbHRlcl9wcmVkX3U4OworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZm47Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2FkZF9wcmVkKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLAorCQkJICAgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLAorCQkJICAgc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKQoreworCXN0cnVjdCBmdHJhY2VfZXZlbnRfZmllbGQgKmZpZWxkOworCWZpbHRlcl9wcmVkX2ZuX3QgZm47CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlpbnQgc3RyaW5nX3R5cGU7CisKKwlwcmVkLT5mbiA9IGZpbHRlcl9wcmVkX25vbmU7CisKKwlpZiAocHJlZC0+b3AgPT0gT1BfQU5EKSB7CisJCXByZWQtPnBvcF9uID0gMjsKKwkJcmV0dXJuIGZpbHRlcl9hZGRfcHJlZF9mbihwcywgY2FsbCwgcHJlZCwgZmlsdGVyX3ByZWRfYW5kKTsKKwl9IGVsc2UgaWYgKHByZWQtPm9wID09IE9QX09SKSB7CisJCXByZWQtPnBvcF9uID0gMjsKKwkJcmV0dXJuIGZpbHRlcl9hZGRfcHJlZF9mbihwcywgY2FsbCwgcHJlZCwgZmlsdGVyX3ByZWRfb3IpOworCX0KKworCWZpZWxkID0gZmluZF9ldmVudF9maWVsZChjYWxsLCBwcmVkLT5maWVsZF9uYW1lKTsKKwlpZiAoIWZpZWxkKSB7CisJCXBhcnNlX2Vycm9yKHBzLCBGSUxUX0VSUl9GSUVMRF9OT1RfRk9VTkQsIDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcmVkLT5vZmZzZXQgPSBmaWVsZC0+b2Zmc2V0OworCisJaWYgKCFpc19sZWdhbF9vcChmaWVsZCwgcHJlZC0+b3ApKSB7CisJCXBhcnNlX2Vycm9yKHBzLCBGSUxUX0VSUl9JTExFR0FMX0ZJRUxEX09QLCAwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyaW5nX3R5cGUgPSBpc19zdHJpbmdfZmllbGQoZmllbGQtPnR5cGUpOworCWlmIChzdHJpbmdfdHlwZSkgeworCQlpZiAoc3RyaW5nX3R5cGUgPT0gRklMVEVSX1NUQVRJQ19TVFJJTkcpCisJCQlmbiA9IGZpbHRlcl9wcmVkX3N0cmluZzsKKwkJZWxzZQorCQkJZm4gPSBmaWx0ZXJfcHJlZF9zdHJsb2M7CisJCXByZWQtPnN0cl9sZW4gPSBmaWVsZC0+c2l6ZTsKKwkJaWYgKHByZWQtPm9wID09IE9QX05FKQorCQkJcHJlZC0+bm90ID0gMTsKKwkJcmV0dXJuIGZpbHRlcl9hZGRfcHJlZF9mbihwcywgY2FsbCwgcHJlZCwgZm4pOworCX0gZWxzZSB7CisJCWlmIChzdHJpY3Rfc3RydG91bGwocHJlZC0+c3RyX3ZhbCwgMCwgJnZhbCkpIHsKKwkJCXBhcnNlX2Vycm9yKHBzLCBGSUxUX0VSUl9JTExFR0FMX0lOVFZBTCwgMCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwcmVkLT52YWwgPSB2YWw7CisJfQorCisJZm4gPSBzZWxlY3RfY29tcGFyaXNvbl9mbihwcmVkLT5vcCwgZmllbGQtPnNpemUsIGZpZWxkLT5pc19zaWduZWQpOworCWlmICghZm4pIHsKKwkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX0lOVkFMSURfT1AsIDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocHJlZC0+b3AgPT0gT1BfTkUpCisJCXByZWQtPm5vdCA9IDE7CisKKwlyZXR1cm4gZmlsdGVyX2FkZF9wcmVkX2ZuKHBzLCBjYWxsLCBwcmVkLCBmbik7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2FkZF9zdWJzeXN0ZW1fcHJlZChzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywKKwkJCQkgICAgIHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSwKKwkJCQkgICAgIHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwKKwkJCQkgICAgIGNoYXIgKmZpbHRlcl9zdHJpbmcpCit7CisJc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyID0gc3lzdGVtLT5maWx0ZXI7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsOworCWludCBlcnIgPSAwOworCisJaWYgKCFmaWx0ZXItPnByZWRzKSB7CisJCWZpbHRlci0+cHJlZHMgPSBremFsbG9jKE1BWF9GSUxURVJfUFJFRCAqIHNpemVvZihwcmVkKSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFmaWx0ZXItPnByZWRzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGZpbHRlci0+bl9wcmVkcyA9PSBNQVhfRklMVEVSX1BSRUQpIHsKKwkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX1RPT19NQU5ZX1BSRURTLCAwKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJZmlsdGVyLT5wcmVkc1tmaWx0ZXItPm5fcHJlZHNdID0gcHJlZDsKKwlmaWx0ZXItPm5fcHJlZHMrKzsKKworCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGwsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CisKKwkJaWYgKCFjYWxsLT5kZWZpbmVfZmllbGRzKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cmNtcChjYWxsLT5zeXN0ZW0sIHN5c3RlbS0+bmFtZSkpCisJCQljb250aW51ZTsKKworCQllcnIgPSBmaWx0ZXJfYWRkX3ByZWQocHMsIGNhbGwsIHByZWQpOworCQlpZiAoZXJyKSB7CisJCQltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKKwkJCWZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzeXN0ZW0pOworCQkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX0JBRF9TVUJTWVNfRklMVEVSLCAwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJlcGxhY2VfZmlsdGVyX3N0cmluZyhjYWxsLT5maWx0ZXIsIGZpbHRlcl9zdHJpbmcpOworCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9pbml0KHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLAorCQkgICAgICAgc3RydWN0IGZpbHRlcl9vcCAqb3BzLAorCQkgICAgICAgY2hhciAqaW5maXhfc3RyaW5nKQoreworCW1lbXNldChwcywgJ1wwJywgc2l6ZW9mKCpwcykpOworCisJcHMtPmluZml4LnN0cmluZyA9IGluZml4X3N0cmluZzsKKwlwcy0+aW5maXguY250ID0gc3RybGVuKGluZml4X3N0cmluZyk7CisJcHMtPm9wcyA9IG9wczsKKworCUlOSVRfTElTVF9IRUFEKCZwcy0+b3BzdGFjayk7CisJSU5JVF9MSVNUX0hFQUQoJnBzLT5wb3N0Zml4KTsKK30KKworc3RhdGljIGNoYXIgaW5maXhfbmV4dChzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwlwcy0+aW5maXguY250LS07CisKKwlyZXR1cm4gcHMtPmluZml4LnN0cmluZ1twcy0+aW5maXgudGFpbCsrXTsKK30KKworc3RhdGljIGNoYXIgaW5maXhfcGVlayhzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwlpZiAocHMtPmluZml4LnRhaWwgPT0gc3RybGVuKHBzLT5pbmZpeC5zdHJpbmcpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBwcy0+aW5maXguc3RyaW5nW3BzLT5pbmZpeC50YWlsXTsKK30KKworc3RhdGljIHZvaWQgaW5maXhfYWR2YW5jZShzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwlwcy0+aW5maXguY250LS07CisJcHMtPmluZml4LnRhaWwrKzsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfcHJlY2VkZW5jZV9sb3dlcihzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywKKwkJCQkgICAgICBpbnQgYSwgaW50IGIpCit7CisJcmV0dXJuIHBzLT5vcHNbYV0ucHJlY2VkZW5jZSA8IHBzLT5vcHNbYl0ucHJlY2VkZW5jZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfb3BfY2hhcihzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywgY2hhciBjKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgc3RyY21wKHBzLT5vcHNbaV0uc3RyaW5nLCAiT1BfTk9ORSIpOyBpKyspIHsKKwkJaWYgKHBzLT5vcHNbaV0uc3RyaW5nWzBdID09IGMpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbmZpeF9nZXRfb3Aoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMsIGNoYXIgZmlyc3RjKQoreworCWNoYXIgbmV4dGMgPSBpbmZpeF9wZWVrKHBzKTsKKwljaGFyIG9wc3RyWzNdOworCWludCBpOworCisJb3BzdHJbMF0gPSBmaXJzdGM7CisJb3BzdHJbMV0gPSBuZXh0YzsKKwlvcHN0clsyXSA9ICdcMCc7CisKKwlmb3IgKGkgPSAwOyBzdHJjbXAocHMtPm9wc1tpXS5zdHJpbmcsICJPUF9OT05FIik7IGkrKykgeworCQlpZiAoIXN0cmNtcChvcHN0ciwgcHMtPm9wc1tpXS5zdHJpbmcpKSB7CisJCQlpbmZpeF9hZHZhbmNlKHBzKTsKKwkJCXJldHVybiBwcy0+b3BzW2ldLmlkOworCQl9CisJfQorCisJb3BzdHJbMV0gPSAnXDAnOworCisJZm9yIChpID0gMDsgc3RyY21wKHBzLT5vcHNbaV0uc3RyaW5nLCAiT1BfTk9ORSIpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAob3BzdHIsIHBzLT5vcHNbaV0uc3RyaW5nKSkKKwkJCXJldHVybiBwcy0+b3BzW2ldLmlkOworCX0KKworCXJldHVybiBPUF9OT05FOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfb3BlcmFuZF9zdHJpbmcoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMpCit7CisJbWVtc2V0KHBzLT5vcGVyYW5kLnN0cmluZywgJ1wwJywgTUFYX0ZJTFRFUl9TVFJfVkFMKTsKKwlwcy0+b3BlcmFuZC50YWlsID0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXBwZW5kX29wZXJhbmRfY2hhcihzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywgY2hhciBjKQoreworCWlmIChwcy0+b3BlcmFuZC50YWlsID09IE1BWF9GSUxURVJfU1RSX1ZBTCAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCisJcHMtPm9wZXJhbmQuc3RyaW5nW3BzLT5vcGVyYW5kLnRhaWwrK10gPSBjOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX29wc3RhY2tfcHVzaChzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywgaW50IG9wKQoreworCXN0cnVjdCBvcHN0YWNrX29wICpvcHN0YWNrX29wOworCisJb3BzdGFja19vcCA9IGttYWxsb2Moc2l6ZW9mKCpvcHN0YWNrX29wKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcHN0YWNrX29wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9wc3RhY2tfb3AtPm9wID0gb3A7CisJbGlzdF9hZGQoJm9wc3RhY2tfb3AtPmxpc3QsICZwcy0+b3BzdGFjayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfb3BzdGFja19lbXB0eShzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwlyZXR1cm4gbGlzdF9lbXB0eSgmcHMtPm9wc3RhY2spOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9vcHN0YWNrX3RvcChzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwlzdHJ1Y3Qgb3BzdGFja19vcCAqb3BzdGFja19vcDsKKworCWlmIChmaWx0ZXJfb3BzdGFja19lbXB0eShwcykpCisJCXJldHVybiBPUF9OT05FOworCisJb3BzdGFja19vcCA9IGxpc3RfZmlyc3RfZW50cnkoJnBzLT5vcHN0YWNrLCBzdHJ1Y3Qgb3BzdGFja19vcCwgbGlzdCk7CisKKwlyZXR1cm4gb3BzdGFja19vcC0+b3A7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX29wc3RhY2tfcG9wKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzKQoreworCXN0cnVjdCBvcHN0YWNrX29wICpvcHN0YWNrX29wOworCWludCBvcDsKKworCWlmIChmaWx0ZXJfb3BzdGFja19lbXB0eShwcykpCisJCXJldHVybiBPUF9OT05FOworCisJb3BzdGFja19vcCA9IGxpc3RfZmlyc3RfZW50cnkoJnBzLT5vcHN0YWNrLCBzdHJ1Y3Qgb3BzdGFja19vcCwgbGlzdCk7CisJb3AgPSBvcHN0YWNrX29wLT5vcDsKKwlsaXN0X2RlbCgmb3BzdGFja19vcC0+bGlzdCk7CisKKwlrZnJlZShvcHN0YWNrX29wKTsKKworCXJldHVybiBvcDsKK30KKworc3RhdGljIHZvaWQgZmlsdGVyX29wc3RhY2tfY2xlYXIoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMpCit7CisJd2hpbGUgKCFmaWx0ZXJfb3BzdGFja19lbXB0eShwcykpCisJCWZpbHRlcl9vcHN0YWNrX3BvcChwcyk7Cit9CisKK3N0YXRpYyBjaGFyICpjdXJyX29wZXJhbmQoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMpCit7CisJcmV0dXJuIHBzLT5vcGVyYW5kLnN0cmluZzsKK30KKworc3RhdGljIGludCBwb3N0Zml4X2FwcGVuZF9vcGVyYW5kKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLCBjaGFyICpvcGVyYW5kKQoreworCXN0cnVjdCBwb3N0Zml4X2VsdCAqZWx0OworCisJZWx0ID0ga21hbGxvYyhzaXplb2YoKmVsdCksIEdGUF9LRVJORUwpOworCWlmICghZWx0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVsdC0+b3AgPSBPUF9OT05FOworCWVsdC0+b3BlcmFuZCA9IGtzdHJkdXAob3BlcmFuZCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbHQtPm9wZXJhbmQpIHsKKwkJa2ZyZWUoZWx0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbGlzdF9hZGRfdGFpbCgmZWx0LT5saXN0LCAmcHMtPnBvc3RmaXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG9zdGZpeF9hcHBlbmRfb3Aoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMsIGludCBvcCkKK3sKKwlzdHJ1Y3QgcG9zdGZpeF9lbHQgKmVsdDsKKworCWVsdCA9IGttYWxsb2Moc2l6ZW9mKCplbHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbHQtPm9wID0gb3A7CisJZWx0LT5vcGVyYW5kID0gTlVMTDsKKworCWxpc3RfYWRkX3RhaWwoJmVsdC0+bGlzdCwgJnBzLT5wb3N0Zml4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwb3N0Zml4X2NsZWFyKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzKQoreworCXN0cnVjdCBwb3N0Zml4X2VsdCAqZWx0OworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwcy0+cG9zdGZpeCkpIHsKKwkJZWx0ID0gbGlzdF9maXJzdF9lbnRyeSgmcHMtPnBvc3RmaXgsIHN0cnVjdCBwb3N0Zml4X2VsdCwgbGlzdCk7CisJCWtmcmVlKGVsdC0+b3BlcmFuZCk7CisJCWxpc3RfZGVsKCZlbHQtPmxpc3QpOworCX0KK30KKworc3RhdGljIGludCBmaWx0ZXJfcGFyc2Uoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMpCit7CisJaW50IGluX3N0cmluZyA9IDA7CisJaW50IG9wLCB0b3Bfb3A7CisJY2hhciBjaDsKKworCXdoaWxlICgoY2ggPSBpbmZpeF9uZXh0KHBzKSkpIHsKKwkJaWYgKGNoID09ICciJykgeworCQkJaW5fc3RyaW5nIF49IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpbl9zdHJpbmcpCisJCQlnb3RvIHBhcnNlX29wZXJhbmQ7CisKKwkJaWYgKGlzc3BhY2UoY2gpKQorCQkJY29udGludWU7CisKKwkJaWYgKGlzX29wX2NoYXIocHMsIGNoKSkgeworCQkJb3AgPSBpbmZpeF9nZXRfb3AocHMsIGNoKTsKKwkJCWlmIChvcCA9PSBPUF9OT05FKSB7CisJCQkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX0lOVkFMSURfT1AsIDApOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpZiAoc3RybGVuKGN1cnJfb3BlcmFuZChwcykpKSB7CisJCQkJcG9zdGZpeF9hcHBlbmRfb3BlcmFuZChwcywgY3Vycl9vcGVyYW5kKHBzKSk7CisJCQkJY2xlYXJfb3BlcmFuZF9zdHJpbmcocHMpOworCQkJfQorCisJCQl3aGlsZSAoIWZpbHRlcl9vcHN0YWNrX2VtcHR5KHBzKSkgeworCQkJCXRvcF9vcCA9IGZpbHRlcl9vcHN0YWNrX3RvcChwcyk7CisJCQkJaWYgKCFpc19wcmVjZWRlbmNlX2xvd2VyKHBzLCB0b3Bfb3AsIG9wKSkgeworCQkJCQl0b3Bfb3AgPSBmaWx0ZXJfb3BzdGFja19wb3AocHMpOworCQkJCQlwb3N0Zml4X2FwcGVuZF9vcChwcywgdG9wX29wKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCisJCQlmaWx0ZXJfb3BzdGFja19wdXNoKHBzLCBvcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjaCA9PSAnKCcpIHsKKwkJCWZpbHRlcl9vcHN0YWNrX3B1c2gocHMsIE9QX09QRU5fUEFSRU4pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY2ggPT0gJyknKSB7CisJCQlpZiAoc3RybGVuKGN1cnJfb3BlcmFuZChwcykpKSB7CisJCQkJcG9zdGZpeF9hcHBlbmRfb3BlcmFuZChwcywgY3Vycl9vcGVyYW5kKHBzKSk7CisJCQkJY2xlYXJfb3BlcmFuZF9zdHJpbmcocHMpOworCQkJfQorCisJCQl0b3Bfb3AgPSBmaWx0ZXJfb3BzdGFja19wb3AocHMpOworCQkJd2hpbGUgKHRvcF9vcCAhPSBPUF9OT05FKSB7CisJCQkJaWYgKHRvcF9vcCA9PSBPUF9PUEVOX1BBUkVOKQorCQkJCQlicmVhazsKKwkJCQlwb3N0Zml4X2FwcGVuZF9vcChwcywgdG9wX29wKTsKKwkJCQl0b3Bfb3AgPSBmaWx0ZXJfb3BzdGFja19wb3AocHMpOworCQkJfQorCQkJaWYgKHRvcF9vcCA9PSBPUF9OT05FKSB7CisJCQkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX1VOQkFMQU5DRURfUEFSRU4sIDApOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJY29udGludWU7CisJCX0KK3BhcnNlX29wZXJhbmQ6CisJCWlmIChhcHBlbmRfb3BlcmFuZF9jaGFyKHBzLCBjaCkpIHsKKwkJCXBhcnNlX2Vycm9yKHBzLCBGSUxUX0VSUl9PUEVSQU5EX1RPT19MT05HLCAwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKHN0cmxlbihjdXJyX29wZXJhbmQocHMpKSkKKwkJcG9zdGZpeF9hcHBlbmRfb3BlcmFuZChwcywgY3Vycl9vcGVyYW5kKHBzKSk7CisKKwl3aGlsZSAoIWZpbHRlcl9vcHN0YWNrX2VtcHR5KHBzKSkgeworCQl0b3Bfb3AgPSBmaWx0ZXJfb3BzdGFja19wb3AocHMpOworCQlpZiAodG9wX29wID09IE9QX05PTkUpCisJCQlicmVhazsKKwkJaWYgKHRvcF9vcCA9PSBPUF9PUEVOX1BBUkVOKSB7CisJCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfVU5CQUxBTkNFRF9QQVJFTiwgMCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwb3N0Zml4X2FwcGVuZF9vcChwcywgdG9wX29wKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWx0ZXJfcHJlZCAqY3JlYXRlX3ByZWQoaW50IG9wLCBjaGFyICpvcGVyYW5kMSwgY2hhciAqb3BlcmFuZDIpCit7CisJc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkOworCisJcHJlZCA9IGt6YWxsb2Moc2l6ZW9mKCpwcmVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcmVkKQorCQlyZXR1cm4gTlVMTDsKKworCXByZWQtPmZpZWxkX25hbWUgPSBrc3RyZHVwKG9wZXJhbmQxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByZWQtPmZpZWxkX25hbWUpIHsKKwkJa2ZyZWUocHJlZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXN0cmNweShwcmVkLT5zdHJfdmFsLCBvcGVyYW5kMik7CisJcHJlZC0+c3RyX2xlbiA9IHN0cmxlbihvcGVyYW5kMik7CisKKwlwcmVkLT5vcCA9IG9wOworCisJcmV0dXJuIHByZWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsdGVyX3ByZWQgKmNyZWF0ZV9sb2dpY2FsX3ByZWQoaW50IG9wKQoreworCXN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZDsKKworCXByZWQgPSBremFsbG9jKHNpemVvZigqcHJlZCksIEdGUF9LRVJORUwpOworCWlmICghcHJlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwcmVkLT5vcCA9IG9wOworCisJcmV0dXJuIHByZWQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcHJlZHMoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMpCit7CisJaW50IG5fbm9ybWFsX3ByZWRzID0gMCwgbl9sb2dpY2FsX3ByZWRzID0gMDsKKwlzdHJ1Y3QgcG9zdGZpeF9lbHQgKmVsdDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZWx0LCAmcHMtPnBvc3RmaXgsIGxpc3QpIHsKKwkJaWYgKGVsdC0+b3AgPT0gT1BfTk9ORSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChlbHQtPm9wID09IE9QX0FORCB8fCBlbHQtPm9wID09IE9QX09SKSB7CisJCQluX2xvZ2ljYWxfcHJlZHMrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCW5fbm9ybWFsX3ByZWRzKys7CisJfQorCisJaWYgKCFuX25vcm1hbF9wcmVkcyB8fCBuX2xvZ2ljYWxfcHJlZHMgPj0gbl9ub3JtYWxfcHJlZHMpIHsKKwkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX0lOVkFMSURfRklMVEVSLCAwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVwbGFjZV9wcmVkcyhzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0sCisJCQkgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLAorCQkJIHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLAorCQkJIGNoYXIgKmZpbHRlcl9zdHJpbmcpCit7CisJY2hhciAqb3BlcmFuZDEgPSBOVUxMLCAqb3BlcmFuZDIgPSBOVUxMOworCXN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZDsKKwlzdHJ1Y3QgcG9zdGZpeF9lbHQgKmVsdDsKKwlpbnQgZXJyOworCisJZXJyID0gY2hlY2tfcHJlZHMocHMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVsdCwgJnBzLT5wb3N0Zml4LCBsaXN0KSB7CisJCWlmIChlbHQtPm9wID09IE9QX05PTkUpIHsKKwkJCWlmICghb3BlcmFuZDEpCisJCQkJb3BlcmFuZDEgPSBlbHQtPm9wZXJhbmQ7CisJCQllbHNlIGlmICghb3BlcmFuZDIpCisJCQkJb3BlcmFuZDIgPSBlbHQtPm9wZXJhbmQ7CisJCQllbHNlIHsKKwkJCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfVE9PX01BTllfT1BFUkFORFMsIDApOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoZWx0LT5vcCA9PSBPUF9BTkQgfHwgZWx0LT5vcCA9PSBPUF9PUikgeworCQkJcHJlZCA9IGNyZWF0ZV9sb2dpY2FsX3ByZWQoZWx0LT5vcCk7CisJCQlpZiAoY2FsbCkgeworCQkJCWVyciA9IGZpbHRlcl9hZGRfcHJlZChwcywgY2FsbCwgcHJlZCk7CisJCQkJZmlsdGVyX2ZyZWVfcHJlZChwcmVkKTsKKwkJCX0gZWxzZQorCQkJCWVyciA9IGZpbHRlcl9hZGRfc3Vic3lzdGVtX3ByZWQocHMsIHN5c3RlbSwKKwkJCQkJCQlwcmVkLCBmaWx0ZXJfc3RyaW5nKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKworCQkJb3BlcmFuZDEgPSBvcGVyYW5kMiA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghb3BlcmFuZDEgfHwgIW9wZXJhbmQyKSB7CisJCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfTUlTU0lOR19GSUVMRCwgMCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXByZWQgPSBjcmVhdGVfcHJlZChlbHQtPm9wLCBvcGVyYW5kMSwgb3BlcmFuZDIpOworCQlpZiAoY2FsbCkgeworCQkJZXJyID0gZmlsdGVyX2FkZF9wcmVkKHBzLCBjYWxsLCBwcmVkKTsKKwkJCWZpbHRlcl9mcmVlX3ByZWQocHJlZCk7CisJCX0gZWxzZQorCQkJZXJyID0gZmlsdGVyX2FkZF9zdWJzeXN0ZW1fcHJlZChwcywgc3lzdGVtLCBwcmVkLAorCQkJCQkJCWZpbHRlcl9zdHJpbmcpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlvcGVyYW5kMSA9IG9wZXJhbmQyID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGFwcGx5X2V2ZW50X2ZpbHRlcihzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIGNoYXIgKmZpbHRlcl9zdHJpbmcpCit7CisJaW50IGVycjsKKworCXN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzOworCisJbXV0ZXhfbG9jaygmZmlsdGVyX211dGV4KTsKKworCWlmICghc3RyY21wKHN0cnN0cmlwKGZpbHRlcl9zdHJpbmcpLCAiMCIpKSB7CisJCWZpbHRlcl9kaXNhYmxlX3ByZWRzKGNhbGwpOworCQlyZW1vdmVfZmlsdGVyX3N0cmluZyhjYWxsLT5maWx0ZXIpOworCQltdXRleF91bmxvY2soJmZpbHRlcl9tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCWVyciA9IC1FTk9NRU07CisJcHMgPSBremFsbG9jKHNpemVvZigqcHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlmaWx0ZXJfZGlzYWJsZV9wcmVkcyhjYWxsKTsKKwlyZXBsYWNlX2ZpbHRlcl9zdHJpbmcoY2FsbC0+ZmlsdGVyLCBmaWx0ZXJfc3RyaW5nKTsKKworCXBhcnNlX2luaXQocHMsIGZpbHRlcl9vcHMsIGZpbHRlcl9zdHJpbmcpOworCWVyciA9IGZpbHRlcl9wYXJzZShwcyk7CisJaWYgKGVycikgeworCQlhcHBlbmRfZmlsdGVyX2VycihwcywgY2FsbC0+ZmlsdGVyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gcmVwbGFjZV9wcmVkcyhOVUxMLCBjYWxsLCBwcywgZmlsdGVyX3N0cmluZyk7CisJaWYgKGVycikKKwkJYXBwZW5kX2ZpbHRlcl9lcnIocHMsIGNhbGwtPmZpbHRlcik7CisKK291dDoKKwlmaWx0ZXJfb3BzdGFja19jbGVhcihwcyk7CisJcG9zdGZpeF9jbGVhcihwcyk7CisJa2ZyZWUocHMpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmZpbHRlcl9tdXRleCk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYXBwbHlfc3Vic3lzdGVtX2V2ZW50X2ZpbHRlcihzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0sCisJCQkJIGNoYXIgKmZpbHRlcl9zdHJpbmcpCit7CisJaW50IGVycjsKKworCXN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzOworCisJbXV0ZXhfbG9jaygmZmlsdGVyX211dGV4KTsKKworCWlmICghc3RyY21wKHN0cnN0cmlwKGZpbHRlcl9zdHJpbmcpLCAiMCIpKSB7CisJCWZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzeXN0ZW0pOworCQlyZW1vdmVfZmlsdGVyX3N0cmluZyhzeXN0ZW0tPmZpbHRlcik7CisJCW11dGV4X3VubG9jaygmZmlsdGVyX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gLUVOT01FTTsKKwlwcyA9IGt6YWxsb2Moc2l6ZW9mKCpwcyksIEdGUF9LRVJORUwpOworCWlmICghcHMpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzeXN0ZW0pOworCXJlcGxhY2VfZmlsdGVyX3N0cmluZyhzeXN0ZW0tPmZpbHRlciwgZmlsdGVyX3N0cmluZyk7CisKKwlwYXJzZV9pbml0KHBzLCBmaWx0ZXJfb3BzLCBmaWx0ZXJfc3RyaW5nKTsKKwllcnIgPSBmaWx0ZXJfcGFyc2UocHMpOworCWlmIChlcnIpIHsKKwkJYXBwZW5kX2ZpbHRlcl9lcnIocHMsIHN5c3RlbS0+ZmlsdGVyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gcmVwbGFjZV9wcmVkcyhzeXN0ZW0sIE5VTEwsIHBzLCBmaWx0ZXJfc3RyaW5nKTsKKwlpZiAoZXJyKQorCQlhcHBlbmRfZmlsdGVyX2Vycihwcywgc3lzdGVtLT5maWx0ZXIpOworCitvdXQ6CisJZmlsdGVyX29wc3RhY2tfY2xlYXIocHMpOworCXBvc3RmaXhfY2xlYXIocHMpOworCWtmcmVlKHBzKTsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZmaWx0ZXJfbXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19zdGFnZV8xLmggYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5ODVmOS4uMDAwMDAwMAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBTdGFnZSAxIG9mIHRoZSB0cmFjZSBldmVudHMuCi0gKgotICogT3ZlcnJpZGUgdGhlIG1hY3JvcyBpbiA8dHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaD4gdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nOgotICoKLSAqIHN0cnVjdCBmdHJhY2VfcmF3XzxjYWxsPiB7Ci0gKglzdHJ1Y3QgdHJhY2VfZW50cnkJCWVudDsKLSAqCTx0eXBlPgkJCQk8aXRlbT47Ci0gKgk8dHlwZTI+CQkJCTxpdGVtMj5bPGxlbj5dOwotICoJWy4uLl0KLSAqIH07Ci0gKgotICogVGhlIDx0eXBlPiA8aXRlbT4gaXMgY3JlYXRlZCBieSB0aGUgX19maWVsZCh0eXBlLCBpdGVtKSBtYWNybyBvcgotICogdGhlIF9fYXJyYXkodHlwZTIsIGl0ZW0yLCBsZW4pIG1hY3JvLgotICogV2Ugc2ltcGx5IGRvICJ0eXBlIGl0ZW07IiwgYW5kIHRoYXQgd2lsbCBjcmVhdGUgdGhlIGZpZWxkcwotICogaW4gdGhlIHN0cnVjdHVyZS4KLSAqLwotCi0jdW5kZWYgVFJBQ0VfRk9STUFUCi0jZGVmaW5lIFRSQUNFX0ZPUk1BVChjYWxsLCBwcm90bywgYXJncywgZm10KQotCi0jdW5kZWYgX19hcnJheQotI2RlZmluZSBfX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikJdHlwZQlpdGVtW2xlbl07Ci0KLSN1bmRlZiBfX2ZpZWxkCi0jZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkJCXR5cGUJaXRlbTsKLQotI3VuZGVmIFRQX1NUUlVDVF9fZW50cnkKLSNkZWZpbmUgVFBfU1RSVUNUX19lbnRyeShhcmdzLi4uKSBhcmdzCi0KLSN1bmRlZiBUUkFDRV9FVkVOVAotI2RlZmluZSBUUkFDRV9FVkVOVChuYW1lLCBwcm90bywgYXJncywgdHN0cnVjdCwgYXNzaWduLCBwcmludCkJXAotCXN0cnVjdCBmdHJhY2VfcmF3XyMjbmFtZSB7CQkJCVwKLQkJc3RydWN0IHRyYWNlX2VudHJ5CWVudDsJCQlcCi0JCXRzdHJ1Y3QJCQkJCQlcCi0JfTsJCQkJCQkJXAotCXN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgZXZlbnRfIyNuYW1lCi0KLSNpbmNsdWRlIDx0cmFjZS90cmFjZV9ldmVudF90eXBlcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19zdGFnZV8yLmggYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2M2M2Ni4uMDAwMDAwMAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogU3RhZ2UgMiBvZiB0aGUgdHJhY2UgZXZlbnRzLgotICoKLSAqIE92ZXJyaWRlIHRoZSBtYWNyb3MgaW4gPHRyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmg+IHRvIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiBlbnVtIHByaW50X2xpbmVfdAotICogZnRyYWNlX3Jhd19vdXRwdXRfPGNhbGw+KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwgaW50IGZsYWdzKQotICogewotICoJc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7Ci0gKglzdHJ1Y3QgZnRyYWNlX3Jhd188Y2FsbD4gKmZpZWxkOyA8LS0gZGVmaW5lZCBpbiBzdGFnZSAxCi0gKglzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudHJ5OwotICoJaW50IHJldDsKLSAqCi0gKgllbnRyeSA9IGl0ZXItPmVudDsKLSAqCi0gKglpZiAoZW50cnktPnR5cGUgIT0gZXZlbnRfPGNhbGw+LmlkKSB7Ci0gKgkJV0FSTl9PTl9PTkNFKDEpOwotICoJCXJldHVybiBUUkFDRV9UWVBFX1VOSEFORExFRDsKLSAqCX0KLSAqCi0gKglmaWVsZCA9ICh0eXBlb2YoZmllbGQpKWVudHJ5OwotICoKLSAqCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgPFRQX3ByaW50az4gIlxuIik7Ci0gKglpZiAoIXJldCkKLSAqCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7Ci0gKgotICoJcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKLSAqIH0KLSAqCi0gKiBUaGlzIGlzIHRoZSBtZXRob2QgdXNlZCB0byBwcmludCB0aGUgcmF3IGV2ZW50IHRvIHRoZSB0cmFjZQotICogb3V0cHV0IGZvcm1hdC4gTm90ZSwgdGhpcyBpcyBub3QgbmVlZGVkIGlmIHRoZSBkYXRhIGlzIHJlYWQKLSAqIGluIGJpbmFyeS4KLSAqLwotCi0jdW5kZWYgX19lbnRyeQotI2RlZmluZSBfX2VudHJ5IGZpZWxkCi0KLSN1bmRlZiBUUF9wcmludGsKLSNkZWZpbmUgVFBfcHJpbnRrKGZtdCwgYXJncy4uLikgZm10ICJcbiIsIGFyZ3MKLQotI3VuZGVmIFRSQUNFX0VWRU5UCi0jZGVmaW5lIFRSQUNFX0VWRU5UKGNhbGwsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBhc3NpZ24sIHByaW50KQkJXAotZW51bSBwcmludF9saW5lX3QJCQkJCQkJXAotZnRyYWNlX3Jhd19vdXRwdXRfIyNjYWxsKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwgaW50IGZsYWdzKQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOwkJCQlcCi0Jc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsICpmaWVsZDsJCQkJXAotCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnk7CQkJCQlcCi0JaW50IHJldDsJCQkJCQkJXAotCQkJCQkJCQkJXAotCWVudHJ5ID0gaXRlci0+ZW50OwkJCQkJCVwKLQkJCQkJCQkJCVwKLQlpZiAoZW50cnktPnR5cGUgIT0gZXZlbnRfIyNjYWxsLmlkKSB7CQkJCVwKLQkJV0FSTl9PTl9PTkNFKDEpOwkJCQkJXAotCQlyZXR1cm4gVFJBQ0VfVFlQRV9VTkhBTkRMRUQ7CQkJCVwKLQl9CQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JZmllbGQgPSAodHlwZW9mKGZpZWxkKSllbnRyeTsJCQkJCVwKLQkJCQkJCQkJCVwKLQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICNjYWxsICI6ICIgcHJpbnQpOwkJCVwKLQlpZiAoIXJldCkJCQkJCQkJXAotCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CQkJCVwKLQkJCQkJCQkJCVwKLQlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwkJCQkJXAotfQotCQotI2luY2x1ZGUgPHRyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmg+Ci0KLS8qCi0gKiBTZXR1cCB0aGUgc2hvd2luZyBmb3JtYXQgb2YgdHJhY2UgcG9pbnQuCi0gKgotICogaW50Ci0gKiBmdHJhY2VfZm9ybWF0XyMjY2FsbChzdHJ1Y3QgdHJhY2Vfc2VxICpzKQotICogewotICoJc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsIGZpZWxkOwotICoJaW50IHJldDsKLSAqCi0gKglyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICN0eXBlICIgIiAjaXRlbSAiOyIKLSAqCQkJICAgICAgICIgb2Zmc2V0OiV1OyBzaXplOiV1O1xuIiwKLSAqCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCwgaXRlbSksCi0gKgkJCSAgICAgICBzaXplb2YoZmllbGQudHlwZSkpOwotICoKLSAqIH0KLSAqLwotCi0jdW5kZWYgVFBfU1RSVUNUX19lbnRyeQotI2RlZmluZSBUUF9TVFJVQ1RfX2VudHJ5KGFyZ3MuLi4pIGFyZ3MKLQotI3VuZGVmIF9fZmllbGQKLSNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKQkJCQkJXAotCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6IiAjdHlwZSAiICIgI2l0ZW0gIjtcdCIJXAotCQkJICAgICAgICJvZmZzZXQ6JXU7XHRzaXplOiV1O1xuIiwJCVwKLQkJCSAgICAgICAodW5zaWduZWQgaW50KW9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLCBcCi0JCQkgICAgICAgKHVuc2lnbmVkIGludClzaXplb2YoZmllbGQuaXRlbSkpOwlcCi0JaWYgKCFyZXQpCQkJCQkJCVwKLQkJcmV0dXJuIDA7Ci0KLSN1bmRlZiBfX2FycmF5Ci0jZGVmaW5lIF9fYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkJCVwKLQlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdGZpZWxkOiIgI3R5cGUgIiAiICNpdGVtICJbIiAjbGVuICJdO1x0IglcCi0JCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAkJXAotCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksIFwKLQkJCSAgICAgICAodW5zaWduZWQgaW50KXNpemVvZihmaWVsZC5pdGVtKSk7CVwKLQlpZiAoIXJldCkJCQkJCQkJXAotCQlyZXR1cm4gMDsKLQotI3VuZGVmIF9fZW50cnkKLSNkZWZpbmUgX19lbnRyeSBSRUMKLQotI3VuZGVmIFRQX3ByaW50awotI2RlZmluZSBUUF9wcmludGsoZm10LCBhcmdzLi4uKSAiJXMsICVzXG4iLCAjZm10LCBfX3N0cmluZ2lmeShhcmdzKQotCi0jdW5kZWYgVFBfZmFzdF9hc3NpZ24KLSNkZWZpbmUgVFBfZmFzdF9hc3NpZ24oYXJncy4uLikgYXJncwotCi0jdW5kZWYgVFJBQ0VfRVZFTlQKLSNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGZ1bmMsIHByaW50KQkJXAotc3RhdGljIGludAkJCQkJCQkJXAotZnRyYWNlX2Zvcm1hdF8jI2NhbGwoc3RydWN0IHRyYWNlX3NlcSAqcykJCQkJXAotewkJCQkJCQkJCVwKLQlzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgZmllbGQ7CQkJCQlcCi0JaW50IHJldDsJCQkJCQkJXAotCQkJCQkJCQkJXAotCXRzdHJ1Y3Q7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQl0cmFjZV9zZXFfcHJpbnRmKHMsICJcbnByaW50IGZtdDogIiBwcmludCk7CQkJXAotCQkJCQkJCQkJXAotCXJldHVybiByZXQ7CQkJCQkJCVwKLX0KLQotI2luY2x1ZGUgPHRyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmg+Ci0KLSN1bmRlZiBfX2ZpZWxkCi0jZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkJCQkJCQlcCi0JcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsICN0eXBlLCAjaXRlbSwJCVwKLQkJCQkgb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksCQlcCi0JCQkJIHNpemVvZihmaWVsZC5pdGVtKSk7CQkJXAotCWlmIChyZXQpCQkJCQkJCVwKLQkJcmV0dXJuIHJldDsKLQotI3VuZGVmIF9fYXJyYXkKLSNkZWZpbmUgX19hcnJheSh0eXBlLCBpdGVtLCBsZW4pCQkJCQlcCi0JcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsICN0eXBlICJbIiAjbGVuICJdIiwgI2l0ZW0sCVwKLQkJCQkgb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksCQlcCi0JCQkJIHNpemVvZihmaWVsZC5pdGVtKSk7CQkJXAotCWlmIChyZXQpCQkJCQkJCVwKLQkJcmV0dXJuIHJldDsKLQotI2RlZmluZSBfX2NvbW1vbl9maWVsZCh0eXBlLCBpdGVtKQkJCQkJXAotCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCAjdHlwZSwgImNvbW1vbl8iICNpdGVtLAlcCi0JCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZC5lbnQpLCBpdGVtKSwJXAotCQkJCSBzaXplb2YoZmllbGQuZW50Lml0ZW0pKTsJCVwKLQlpZiAocmV0KQkJCQkJCQlcCi0JCXJldHVybiByZXQ7Ci0KLSN1bmRlZiBUUkFDRV9FVkVOVAotI2RlZmluZSBUUkFDRV9FVkVOVChjYWxsLCBwcm90bywgYXJncywgdHN0cnVjdCwgZnVuYywgcHJpbnQpCQlcCi1pbnQJCQkJCQkJCQlcCi1mdHJhY2VfZGVmaW5lX2ZpZWxkc18jI2NhbGwodm9pZCkJCQkJCVwKLXsJCQkJCQkJCQlcCi0Jc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsIGZpZWxkOwkJCQkJXAotCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqZXZlbnRfY2FsbCA9ICZldmVudF8jI2NhbGw7CQlcCi0JaW50IHJldDsJCQkJCQkJXAotCQkJCQkJCQkJXAotCV9fY29tbW9uX2ZpZWxkKHVuc2lnbmVkIGNoYXIsIHR5cGUpOwkJCQlcCi0JX19jb21tb25fZmllbGQodW5zaWduZWQgY2hhciwgZmxhZ3MpOwkJCQlcCi0JX19jb21tb25fZmllbGQodW5zaWduZWQgY2hhciwgcHJlZW1wdF9jb3VudCk7CQkJXAotCV9fY29tbW9uX2ZpZWxkKGludCwgcGlkKTsJCQkJCVwKLQlfX2NvbW1vbl9maWVsZChpbnQsIHRnaWQpOwkJCQkJXAotCQkJCQkJCQkJXAotCXRzdHJ1Y3Q7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlyZXR1cm4gcmV0OwkJCQkJCQlcCi19Ci0KLSNpbmNsdWRlIDx0cmFjZS90cmFjZV9ldmVudF90eXBlcy5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19zdGFnZV8zLmggYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQyZmE3OC4uMDAwMDAwMAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKgotICogU3RhZ2UgMyBvZiB0aGUgdHJhY2UgZXZlbnRzLgotICoKLSAqIE92ZXJyaWRlIHRoZSBtYWNyb3MgaW4gPHRyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmg+IHRvIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiBzdGF0aWMgdm9pZCBmdHJhY2VfZXZlbnRfPGNhbGw+KHByb3RvKQotICogewotICoJZXZlbnRfdHJhY2VfcHJpbnRrKF9SRVRfSVBfLCAiPGNhbGw+OiAiIDxmbXQ+KTsKLSAqIH0KLSAqCi0gKiBzdGF0aWMgaW50IGZ0cmFjZV9yZWdfZXZlbnRfPGNhbGw+KHZvaWQpCi0gKiB7Ci0gKglpbnQgcmV0OwotICoKLSAqCXJldCA9IHJlZ2lzdGVyX3RyYWNlXzxjYWxsPihmdHJhY2VfZXZlbnRfPGNhbGw+KTsKLSAqCWlmICghcmV0KQotICoJCXByX2luZm8oImV2ZW50IHRyYWNlOiBDb3VsZCBub3QgYWN0aXZhdGUgdHJhY2UgcG9pbnQgIgotICoJCQkicHJvYmUgdG8gIDxjYWxsPiIpOwotICoJcmV0dXJuIHJldDsKLSAqIH0KLSAqCi0gKiBzdGF0aWMgdm9pZCBmdHJhY2VfdW5yZWdfZXZlbnRfPGNhbGw+KHZvaWQpCi0gKiB7Ci0gKgl1bnJlZ2lzdGVyX3RyYWNlXzxjYWxsPihmdHJhY2VfZXZlbnRfPGNhbGw+KTsKLSAqIH0KLSAqCi0gKiBGb3IgdGhvc2UgbWFjcm9zIGRlZmluZWQgd2l0aCBUUkFDRV9GT1JNQVQ6Ci0gKgotICogc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3VzZWQKLSAqIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDQpKSkKLSAqIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9mdHJhY2VfZXZlbnRzIikpKSBldmVudF88Y2FsbD4gPSB7Ci0gKgkubmFtZQkJCT0gIjxjYWxsPiIsCi0gKgkucmVnZnVuYwkJPSBmdHJhY2VfcmVnX2V2ZW50XzxjYWxsPiwKLSAqCS51bnJlZ2Z1bmMJCT0gZnRyYWNlX3VucmVnX2V2ZW50XzxjYWxsPiwKLSAqIH0KLSAqCi0gKgotICogRm9yIHRob3NlIG1hY3JvcyBkZWZpbmVkIHdpdGggVFJBQ0VfRVZFTlQ6Ci0gKgotICogc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBldmVudF88Y2FsbD47Ci0gKgotICogc3RhdGljIHZvaWQgZnRyYWNlX3Jhd19ldmVudF88Y2FsbD4ocHJvdG8pCi0gKiB7Ci0gKglzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotICoJc3RydWN0IGZ0cmFjZV9yYXdfPGNhbGw+ICplbnRyeTsgPC0tIGRlZmluZWQgaW4gc3RhZ2UgMQotICoJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0gKglpbnQgcGM7Ci0gKgotICoJbG9jYWxfc2F2ZV9mbGFncyhpcnFfZmxhZ3MpOwotICoJcGMgPSBwcmVlbXB0X2NvdW50KCk7Ci0gKgotICoJZXZlbnQgPSB0cmFjZV9jdXJyZW50X2J1ZmZlcl9sb2NrX3Jlc2VydmUoZXZlbnRfPGNhbGw+LmlkLAotICoJCQkJICBzaXplb2Yoc3RydWN0IGZ0cmFjZV9yYXdfPGNhbGw+KSwKLSAqCQkJCSAgaXJxX2ZsYWdzLCBwYyk7Ci0gKglpZiAoIWV2ZW50KQotICoJCXJldHVybjsKLSAqCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7Ci0gKgotICoJPGFzc2lnbj47ICA8LS0gSGVyZSB3ZSBhc3NpZ24gdGhlIGVudHJpZXMgYnkgdGhlIF9fZmllbGQgYW5kCi0gKgkJCV9fYXJyYXkgbWFjcm9zLgotICoKLSAqCXRyYWNlX2N1cnJlbnRfYnVmZmVyX3VubG9ja19jb21taXQoZXZlbnQsIGlycV9mbGFncywgcGMpOwotICogfQotICoKLSAqIHN0YXRpYyBpbnQgZnRyYWNlX3Jhd19yZWdfZXZlbnRfPGNhbGw+KHZvaWQpCi0gKiB7Ci0gKglpbnQgcmV0OwotICoKLSAqCXJldCA9IHJlZ2lzdGVyX3RyYWNlXzxjYWxsPihmdHJhY2VfcmF3X2V2ZW50XzxjYWxsPik7Ci0gKglpZiAoIXJldCkKLSAqCQlwcl9pbmZvKCJldmVudCB0cmFjZTogQ291bGQgbm90IGFjdGl2YXRlIHRyYWNlIHBvaW50ICIKLSAqCQkJInByb2JlIHRvIDxjYWxsPiIpOwotICoJcmV0dXJuIHJldDsKLSAqIH0KLSAqCi0gKiBzdGF0aWMgdm9pZCBmdHJhY2VfdW5yZWdfZXZlbnRfPGNhbGw+KHZvaWQpCi0gKiB7Ci0gKgl1bnJlZ2lzdGVyX3RyYWNlXzxjYWxsPihmdHJhY2VfcmF3X2V2ZW50XzxjYWxsPik7Ci0gKiB9Ci0gKgotICogc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudCBmdHJhY2VfZXZlbnRfdHlwZV88Y2FsbD4gPSB7Ci0gKgkudHJhY2UJCQk9IGZ0cmFjZV9yYXdfb3V0cHV0XzxjYWxsPiwgPC0tIHN0YWdlIDIKLSAqIH07Ci0gKgotICogc3RhdGljIGludCBmdHJhY2VfcmF3X2luaXRfZXZlbnRfPGNhbGw+KHZvaWQpCi0gKiB7Ci0gKglpbnQgaWQ7Ci0gKgotICoJaWQgPSByZWdpc3Rlcl9mdHJhY2VfZXZlbnQoJmZ0cmFjZV9ldmVudF90eXBlXzxjYWxsPik7Ci0gKglpZiAoIWlkKQotICoJCXJldHVybiAtRU5PREVWOwotICoJZXZlbnRfPGNhbGw+LmlkID0gaWQ7Ci0gKglyZXR1cm4gMDsKLSAqIH0KLSAqCi0gKiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZAotICogX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oNCkpKQotICogX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX2Z0cmFjZV9ldmVudHMiKSkpIGV2ZW50XzxjYWxsPiA9IHsKLSAqCS5uYW1lCQkJPSAiPGNhbGw+IiwKLSAqCS5zeXN0ZW0JCQk9ICI8c3lzdGVtPiIsCi0gKgkucmF3X2luaXQJCT0gZnRyYWNlX3Jhd19pbml0X2V2ZW50XzxjYWxsPiwKLSAqCS5yZWdmdW5jCQk9IGZ0cmFjZV9yZWdfZXZlbnRfPGNhbGw+LAotICoJLnVucmVnZnVuYwkJPSBmdHJhY2VfdW5yZWdfZXZlbnRfPGNhbGw+LAotICoJLnNob3dfZm9ybWF0CQk9IGZ0cmFjZV9mb3JtYXRfPGNhbGw+LAotICogfQotICoKLSAqLwotCi0jdW5kZWYgVFBfRk1UCi0jZGVmaW5lIFRQX0ZNVChmbXQsIGFyZ3MuLi4pCWZtdCAiXG4iLCAjI2FyZ3MKLQotI2lmZGVmIENPTkZJR19FVkVOVF9QUk9GSUxFCi0jZGVmaW5lIF9UUkFDRV9QUk9GSUxFKGNhbGwsIHByb3RvLCBhcmdzKQkJCQlcCi1zdGF0aWMgdm9pZCBmdHJhY2VfcHJvZmlsZV8jI2NhbGwocHJvdG8pCQkJCVwKLXsJCQkJCQkJCQlcCi0JZXh0ZXJuIHZvaWQgcGVyZl90cGNvdW50ZXJfZXZlbnQoaW50KTsJCQkJXAotCXBlcmZfdHBjb3VudGVyX2V2ZW50KGV2ZW50XyMjY2FsbC5pZCk7CQkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdGF0aWMgaW50IGZ0cmFjZV9wcm9maWxlX2VuYWJsZV8jI2NhbGwoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKSBcCi17CQkJCQkJCQkJXAotCWludCByZXQgPSAwOwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JaWYgKCFhdG9taWNfaW5jX3JldHVybigmY2FsbC0+cHJvZmlsZV9jb3VudCkpCQkJXAotCQlyZXQgPSByZWdpc3Rlcl90cmFjZV8jI2NhbGwoZnRyYWNlX3Byb2ZpbGVfIyNjYWxsKTsJXAotCQkJCQkJCQkJXAotCXJldHVybiByZXQ7CQkJCQkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdGF0aWMgdm9pZCBmdHJhY2VfcHJvZmlsZV9kaXNhYmxlXyMjY2FsbChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpIFwKLXsJCQkJCQkJCQlcCi0JaWYgKGF0b21pY19hZGRfbmVnYXRpdmUoLTEsICZjYWxsLT5wcm9maWxlX2NvdW50KSkJCVwKLQkJdW5yZWdpc3Rlcl90cmFjZV8jI2NhbGwoZnRyYWNlX3Byb2ZpbGVfIyNjYWxsKTsJCVwKLX0KLQotI2RlZmluZSBfVFJBQ0VfUFJPRklMRV9JTklUKGNhbGwpCQkJCQlcCi0JLnByb2ZpbGVfY291bnQgPSBBVE9NSUNfSU5JVCgtMSksCQkJCVwKLQkucHJvZmlsZV9lbmFibGUgPSBmdHJhY2VfcHJvZmlsZV9lbmFibGVfIyNjYWxsLAkJCVwKLQkucHJvZmlsZV9kaXNhYmxlID0gZnRyYWNlX3Byb2ZpbGVfZGlzYWJsZV8jI2NhbGwsCi0KLSNlbHNlCi0jZGVmaW5lIF9UUkFDRV9QUk9GSUxFKGNhbGwsIHByb3RvLCBhcmdzKQotI2RlZmluZSBfVFJBQ0VfUFJPRklMRV9JTklUKGNhbGwpCi0jZW5kaWYKLQotI2RlZmluZSBfVFJBQ0VfRk9STUFUKGNhbGwsIHByb3RvLCBhcmdzLCBmbXQpCQkJCVwKLXN0YXRpYyB2b2lkIGZ0cmFjZV9ldmVudF8jI2NhbGwocHJvdG8pCQkJCQlcCi17CQkJCQkJCQkJXAotCWV2ZW50X3RyYWNlX3ByaW50ayhfUkVUX0lQXywgI2NhbGwgIjogIiBmbXQpOwkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdGF0aWMgaW50IGZ0cmFjZV9yZWdfZXZlbnRfIyNjYWxsKHZvaWQpCQkJCVwKLXsJCQkJCQkJCQlcCi0JaW50IHJldDsJCQkJCQkJXAotCQkJCQkJCQkJXAotCXJldCA9IHJlZ2lzdGVyX3RyYWNlXyMjY2FsbChmdHJhY2VfZXZlbnRfIyNjYWxsKTsJCVwKLQlpZiAocmV0KQkJCQkJCQlcCi0JCXByX2luZm8oImV2ZW50IHRyYWNlOiBDb3VsZCBub3QgYWN0aXZhdGUgdHJhY2UgcG9pbnQgIglcCi0JCQkicHJvYmUgdG8gIiAjY2FsbCAiXG4iKTsJCQlcCi0JcmV0dXJuIHJldDsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyB2b2lkIGZ0cmFjZV91bnJlZ19ldmVudF8jI2NhbGwodm9pZCkJCQkJXAotewkJCQkJCQkJCVwKLQl1bnJlZ2lzdGVyX3RyYWNlXyMjY2FsbChmdHJhY2VfZXZlbnRfIyNjYWxsKTsJCQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBldmVudF8jI2NhbGw7CQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBpbnQgZnRyYWNlX2luaXRfZXZlbnRfIyNjYWxsKHZvaWQpCQkJCVwKLXsJCQkJCQkJCQlcCi0JaW50IGlkOwkJCQkJCQkJXAotCQkJCQkJCQkJXAotCWlkID0gcmVnaXN0ZXJfZnRyYWNlX2V2ZW50KE5VTEwpOwkJCQlcCi0JaWYgKCFpZCkJCQkJCQkJXAotCQlyZXR1cm4gLUVOT0RFVjsJCQkJCQlcCi0JZXZlbnRfIyNjYWxsLmlkID0gaWQ7CQkJCQkJXAotCXJldHVybiAwOwkJCQkJCQlcCi19Ci0KLSN1bmRlZiBUUkFDRV9GT1JNQVQKLSNkZWZpbmUgVFJBQ0VfRk9STUFUKGNhbGwsIHByb3RvLCBhcmdzLCBmbXQpCQkJCVwKLV9UUkFDRV9GT1JNQVQoY2FsbCwgUEFSQU1TKHByb3RvKSwgUEFSQU1TKGFyZ3MpLCBQQVJBTVMoZm10KSkJCVwKLV9UUkFDRV9QUk9GSUxFKGNhbGwsIFBBUkFNUyhwcm90byksIFBBUkFNUyhhcmdzKSkJCQlcCi1zdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZAkJCQkJXAotX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oNCkpKQkJCQkJCVwKLV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9mdHJhY2VfZXZlbnRzIikpKSBldmVudF8jI2NhbGwgPSB7CQlcCi0JLm5hbWUJCQk9ICNjYWxsLAkJCQlcCi0JLnN5c3RlbQkJCT0gX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKSwJCVwKLQkucmF3X2luaXQJCT0gZnRyYWNlX2luaXRfZXZlbnRfIyNjYWxsLAkJXAotCS5yZWdmdW5jCQk9IGZ0cmFjZV9yZWdfZXZlbnRfIyNjYWxsLAkJXAotCS51bnJlZ2Z1bmMJCT0gZnRyYWNlX3VucmVnX2V2ZW50XyMjY2FsbCwJCVwKLQlfVFJBQ0VfUFJPRklMRV9JTklUKGNhbGwpCQkJCQlcCi19Ci0KLSN1bmRlZiBfX2VudHJ5Ci0jZGVmaW5lIF9fZW50cnkgZW50cnkKLQotI3VuZGVmIFRSQUNFX0VWRU5UCi0jZGVmaW5lIFRSQUNFX0VWRU5UKGNhbGwsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBhc3NpZ24sIHByaW50KQkJXAotX1RSQUNFX1BST0ZJTEUoY2FsbCwgUEFSQU1TKHByb3RvKSwgUEFSQU1TKGFyZ3MpKQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgZXZlbnRfIyNjYWxsOwkJCQlcCi0JCQkJCQkJCQlcCi1zdGF0aWMgdm9pZCBmdHJhY2VfcmF3X2V2ZW50XyMjY2FsbChwcm90bykJCQkJXAotewkJCQkJCQkJCVwKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfIyNjYWxsOwkJCVwKLQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwkJCQlcCi0Jc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsICplbnRyeTsJCQkJXAotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwkJCQkJXAotCWludCBwYzsJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlsb2NhbF9zYXZlX2ZsYWdzKGlycV9mbGFncyk7CQkJCQlcCi0JcGMgPSBwcmVlbXB0X2NvdW50KCk7CQkJCQkJXAotCQkJCQkJCQkJXAotCWV2ZW50ID0gdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKGV2ZW50XyMjY2FsbC5pZCwJXAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCksCVwKLQkJCQkgIGlycV9mbGFncywgcGMpOwkJCVwKLQlpZiAoIWV2ZW50KQkJCQkJCQlcCi0JCXJldHVybjsJCQkJCQkJXAotCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CQkJXAotCQkJCQkJCQkJXAotCWFzc2lnbjsJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlpZiAoY2FsbC0+cHJlZHMgJiYgIWZpbHRlcl9tYXRjaF9wcmVkcyhjYWxsLCBlbnRyeSkpCQlcCi0JCXJpbmdfYnVmZmVyX2V2ZW50X2Rpc2NhcmQoZXZlbnQpOwkJCVwKLQkJCQkJCQkJCVwKLQl0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXQoZXZlbnQsIGlycV9mbGFncywgcGMpOwlcCi0JCQkJCQkJCQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIGludCBmdHJhY2VfcmF3X3JlZ19ldmVudF8jI2NhbGwodm9pZCkJCQkJXAotewkJCQkJCQkJCVwKLQlpbnQgcmV0OwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JcmV0ID0gcmVnaXN0ZXJfdHJhY2VfIyNjYWxsKGZ0cmFjZV9yYXdfZXZlbnRfIyNjYWxsKTsJCVwKLQlpZiAocmV0KQkJCQkJCQlcCi0JCXByX2luZm8oImV2ZW50IHRyYWNlOiBDb3VsZCBub3QgYWN0aXZhdGUgdHJhY2UgcG9pbnQgIglcCi0JCQkicHJvYmUgdG8gIiAjY2FsbCAiXG4iKTsJCQlcCi0JcmV0dXJuIHJldDsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyB2b2lkIGZ0cmFjZV9yYXdfdW5yZWdfZXZlbnRfIyNjYWxsKHZvaWQpCQkJCVwKLXsJCQkJCQkJCQlcCi0JdW5yZWdpc3Rlcl90cmFjZV8jI2NhbGwoZnRyYWNlX3Jhd19ldmVudF8jI2NhbGwpOwkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBzdHJ1Y3QgdHJhY2VfZXZlbnQgZnRyYWNlX2V2ZW50X3R5cGVfIyNjYWxsID0gewkJCVwKLQkudHJhY2UJCQk9IGZ0cmFjZV9yYXdfb3V0cHV0XyMjY2FsbCwJCVwKLX07CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIGludCBmdHJhY2VfcmF3X2luaXRfZXZlbnRfIyNjYWxsKHZvaWQpCQkJCVwKLXsJCQkJCQkJCQlcCi0JaW50IGlkOwkJCQkJCQkJXAotCQkJCQkJCQkJXAotCWlkID0gcmVnaXN0ZXJfZnRyYWNlX2V2ZW50KCZmdHJhY2VfZXZlbnRfdHlwZV8jI2NhbGwpOwkJXAotCWlmICghaWQpCQkJCQkJCVwKLQkJcmV0dXJuIC1FTk9ERVY7CQkJCQkJXAotCWV2ZW50XyMjY2FsbC5pZCA9IGlkOwkJCQkJCVwKLQlJTklUX0xJU1RfSEVBRCgmZXZlbnRfIyNjYWxsLmZpZWxkcyk7CQkJCVwKLQlyZXR1cm4gMDsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX191c2VkCQkJCQlcCi1fX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg0KSkpCQkJCQkJXAotX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX2Z0cmFjZV9ldmVudHMiKSkpIGV2ZW50XyMjY2FsbCA9IHsJCVwKLQkubmFtZQkJCT0gI2NhbGwsCQkJCVwKLQkuc3lzdGVtCQkJPSBfX3N0cmluZ2lmeShUUkFDRV9TWVNURU0pLAkJXAotCS5yYXdfaW5pdAkJPSBmdHJhY2VfcmF3X2luaXRfZXZlbnRfIyNjYWxsLAkJXAotCS5yZWdmdW5jCQk9IGZ0cmFjZV9yYXdfcmVnX2V2ZW50XyMjY2FsbCwJCVwKLQkudW5yZWdmdW5jCQk9IGZ0cmFjZV9yYXdfdW5yZWdfZXZlbnRfIyNjYWxsLAlcCi0JLnNob3dfZm9ybWF0CQk9IGZ0cmFjZV9mb3JtYXRfIyNjYWxsLAkJCVwKLQkuZGVmaW5lX2ZpZWxkcwkJPSBmdHJhY2VfZGVmaW5lX2ZpZWxkc18jI2NhbGwsCQlcCi0JX1RSQUNFX1BST0ZJTEVfSU5JVChjYWxsKQkJCQkJXAotfQotCi0jaW5jbHVkZSA8dHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaD4KLQotI3VuZGVmIF9UUkFDRV9QUk9GSUxFCi0jdW5kZWYgX1RSQUNFX1BST0ZJTEVfSU5JVAotCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXhwb3J0LmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXhwb3J0LmMKaW5kZXggMDdhMjJjMy4uZDA2Y2Y4OSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V4cG9ydC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYwpAQCAtMTksOCArMTksMTIgQEAKICN1bmRlZiBUUkFDRV9TVFJVQ1QKICNkZWZpbmUgVFJBQ0VfU1RSVUNUKGFyZ3MuLi4pIGFyZ3MKIAorZXh0ZXJuIHZvaWQgX19iYWRfdHlwZV9zaXplKHZvaWQpOworCiAjdW5kZWYgVFJBQ0VfRklFTEQKICNkZWZpbmUgVFJBQ0VfRklFTEQodHlwZSwgaXRlbSwgYXNzaWduKQkJCQkJXAorCWlmIChzaXplb2YodHlwZSkgIT0gc2l6ZW9mKGZpZWxkLml0ZW0pKQkJCQlcCisJCV9fYmFkX3R5cGVfc2l6ZSgpOwkJCQkJXAogCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6IiAjdHlwZSAiICIgI2l0ZW0gIjtcdCIJXAogCQkJICAgICAgICJvZmZzZXQ6JXU7XHRzaXplOiV1O1xuIiwJCVwKIAkJCSAgICAgICAodW5zaWduZWQgaW50KW9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLCBcCkBAIC0zMCw3ICszNCw3IEBACiAKIAogI3VuZGVmIFRSQUNFX0ZJRUxEX1NQRUNJQUwKLSNkZWZpbmUgVFJBQ0VfRklFTERfU1BFQ0lBTCh0eXBlX2l0ZW0sIGl0ZW0sIGNtZCkJCQlcCisjZGVmaW5lIFRSQUNFX0ZJRUxEX1NQRUNJQUwodHlwZV9pdGVtLCBpdGVtLCBsZW4sIGNtZCkJCQlcCiAJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZCBzcGVjaWFsOiIgI3R5cGVfaXRlbSAiO1x0IglcCiAJCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAkJXAogCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksIFwKQEAgLTQ2LDYgKzUwLDkgQEAKIAlpZiAoIXJldCkJCQkJCQkJXAogCQlyZXR1cm4gMDsKIAorI3VuZGVmIFRSQUNFX0ZJRUxEX1NJR04KKyNkZWZpbmUgVFJBQ0VfRklFTERfU0lHTih0eXBlLCBpdGVtLCBhc3NpZ24sIGlzX3NpZ25lZCkJXAorCVRSQUNFX0ZJRUxEKHR5cGUsIGl0ZW0sIGFzc2lnbikKIAogI3VuZGVmIFRQX1JBV19GTVQKICNkZWZpbmUgVFBfUkFXX0ZNVChhcmdzLi4uKSBhcmdzCkBAIC02NSw2ICs3MiwyMiBAQAogCXJldHVybiByZXQ7CQkJCQkJCVwKIH0KIAorI3VuZGVmIFRSQUNFX0VWRU5UX0ZPUk1BVF9OT0ZJTFRFUgorI2RlZmluZSBUUkFDRV9FVkVOVF9GT1JNQVRfTk9GSUxURVIoY2FsbCwgcHJvdG8sIGFyZ3MsIGZtdCwgdHN0cnVjdCwJXAorCQkJCSAgICB0cGZtdCkJCQkJXAorc3RhdGljIGludAkJCQkJCQkJXAorZnRyYWNlX2Zvcm1hdF8jI2NhbGwoc3RydWN0IHRyYWNlX3NlcSAqcykJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgYXJncyBmaWVsZDsJCQkJCQlcCisJaW50IHJldDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXRzdHJ1Y3Q7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0cmFjZV9zZXFfcHJpbnRmKHMsICJcbnByaW50IGZtdDogXCIlc1wiXG4iLCB0cGZtdCk7CQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHJldDsJCQkJCQkJXAorfQorCiAjaW5jbHVkZSAidHJhY2VfZXZlbnRfdHlwZXMuaCIKIAogI3VuZGVmIFRSQUNFX1pFUk9fQ0hBUgpAQCAtNzgsNiArMTAxLDEwIEBACiAjZGVmaW5lIFRSQUNFX0ZJRUxEKHR5cGUsIGl0ZW0sIGFzc2lnbilcCiAJZW50cnktPml0ZW0gPSBhc3NpZ247CiAKKyN1bmRlZiBUUkFDRV9GSUVMRF9TSUdOCisjZGVmaW5lIFRSQUNFX0ZJRUxEX1NJR04odHlwZSwgaXRlbSwgYXNzaWduLCBpc19zaWduZWQpCVwKKwlUUkFDRV9GSUVMRCh0eXBlLCBpdGVtLCBhc3NpZ24pCisKICN1bmRlZiBUUF9DTUQKICNkZWZpbmUgVFBfQ01EKGNtZC4uLikJY21kCiAKQEAgLTg1LDE4ICsxMTIsOTUgQEAKICNkZWZpbmUgVFJBQ0VfRU5UUlkJZW50cnkKIAogI3VuZGVmIFRSQUNFX0ZJRUxEX1NQRUNJQUwKLSNkZWZpbmUgVFJBQ0VfRklFTERfU1BFQ0lBTCh0eXBlX2l0ZW0sIGl0ZW0sIGNtZCkgXAorI2RlZmluZSBUUkFDRV9GSUVMRF9TUEVDSUFMKHR5cGVfaXRlbSwgaXRlbSwgbGVuLCBjbWQpCVwKIAljbWQ7CiAKICN1bmRlZiBUUkFDRV9FVkVOVF9GT1JNQVQKICNkZWZpbmUgVFJBQ0VfRVZFTlRfRk9STUFUKGNhbGwsIHByb3RvLCBhcmdzLCBmbXQsIHRzdHJ1Y3QsIHRwZm10KQlcCitpbnQgZnRyYWNlX2RlZmluZV9maWVsZHNfIyNjYWxsKHZvaWQpOwkJCQkJXAorc3RhdGljIGludCBmdHJhY2VfcmF3X2luaXRfZXZlbnRfIyNjYWxsKHZvaWQpOwkJCQlcCiAJCQkJCQkJCQlcCi1zdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZAkJCQkJXAorc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZAkJCQkJCVwKK19fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDQpKSkJCQkJCQlcCitfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfZnRyYWNlX2V2ZW50cyIpKSkgZXZlbnRfIyNjYWxsID0gewkJXAorCS5uYW1lCQkJPSAjY2FsbCwJCQkJXAorCS5pZAkJCT0gcHJvdG8sCQkJCVwKKwkuc3lzdGVtCQkJPSBfX3N0cmluZ2lmeShUUkFDRV9TWVNURU0pLAkJXAorCS5yYXdfaW5pdAkJPSBmdHJhY2VfcmF3X2luaXRfZXZlbnRfIyNjYWxsLAkJXAorCS5zaG93X2Zvcm1hdAkJPSBmdHJhY2VfZm9ybWF0XyMjY2FsbCwJCQlcCisJLmRlZmluZV9maWVsZHMJCT0gZnRyYWNlX2RlZmluZV9maWVsZHNfIyNjYWxsLAkJXAorfTsJCQkJCQkJCQlcCitzdGF0aWMgaW50IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwodm9pZCkJCQkJXAorewkJCQkJCQkJCVwKKwlJTklUX0xJU1RfSEVBRCgmZXZlbnRfIyNjYWxsLmZpZWxkcyk7CQkJCVwKKwlpbml0X3ByZWRzKCZldmVudF8jI2NhbGwpOwkJCQkJXAorCXJldHVybiAwOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCisjdW5kZWYgVFJBQ0VfRVZFTlRfRk9STUFUX05PRklMVEVSCisjZGVmaW5lIFRSQUNFX0VWRU5UX0ZPUk1BVF9OT0ZJTFRFUihjYWxsLCBwcm90bywgYXJncywgZm10LCB0c3RydWN0LAlcCisJCQkJICAgIHRwZm10KQkJCQlcCisJCQkJCQkJCQlcCitzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX191c2VkCQkJCQkJXAogX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oNCkpKQkJCQkJCVwKIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9mdHJhY2VfZXZlbnRzIikpKSBldmVudF8jI2NhbGwgPSB7CQlcCiAJLm5hbWUJCQk9ICNjYWxsLAkJCQlcCiAJLmlkCQkJPSBwcm90bywJCQkJXAogCS5zeXN0ZW0JCQk9IF9fc3RyaW5naWZ5KFRSQUNFX1NZU1RFTSksCQlcCiAJLnNob3dfZm9ybWF0CQk9IGZ0cmFjZV9mb3JtYXRfIyNjYWxsLAkJCVwKK307CisKKyNpbmNsdWRlICJ0cmFjZV9ldmVudF90eXBlcy5oIgorCisjdW5kZWYgVFJBQ0VfRklFTEQKKyNkZWZpbmUgVFJBQ0VfRklFTEQodHlwZSwgaXRlbSwgYXNzaWduKQkJCQkJXAorCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCAjdHlwZSwgI2l0ZW0sCQlcCisJCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLAkJXAorCQkJCSBzaXplb2YoZmllbGQuaXRlbSksIGlzX3NpZ25lZF90eXBlKHR5cGUpKTsJXAorCWlmIChyZXQpCQkJCQkJCVwKKwkJcmV0dXJuIHJldDsKKworI3VuZGVmIFRSQUNFX0ZJRUxEX1NQRUNJQUwKKyNkZWZpbmUgVFJBQ0VfRklFTERfU1BFQ0lBTCh0eXBlLCBpdGVtLCBsZW4sIGNtZCkJCQlcCisJcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsICN0eXBlICJbIiAjbGVuICJdIiwgI2l0ZW0sCVwKKwkJCQkgb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksCQlcCisJCQkJIHNpemVvZihmaWVsZC5pdGVtKSwgMCk7CQlcCisJaWYgKHJldCkJCQkJCQkJXAorCQlyZXR1cm4gcmV0OworCisjdW5kZWYgVFJBQ0VfRklFTERfU0lHTgorI2RlZmluZSBUUkFDRV9GSUVMRF9TSUdOKHR5cGUsIGl0ZW0sIGFzc2lnbiwgaXNfc2lnbmVkKQkJCVwKKwlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgI3R5cGUsICNpdGVtLAkJXAorCQkJCSBvZmZzZXRvZih0eXBlb2YoZmllbGQpLCBpdGVtKSwJCVwKKwkJCQkgc2l6ZW9mKGZpZWxkLml0ZW0pLCBpc19zaWduZWQpOwlcCisJaWYgKHJldCkJCQkJCQkJXAorCQlyZXR1cm4gcmV0OworCisjdW5kZWYgVFJBQ0VfRklFTERfWkVST19DSEFSCisjZGVmaW5lIFRSQUNFX0ZJRUxEX1pFUk9fQ0hBUihpdGVtKQorCisjdW5kZWYgVFJBQ0VfRVZFTlRfRk9STUFUCisjZGVmaW5lIFRSQUNFX0VWRU5UX0ZPUk1BVChjYWxsLCBwcm90bywgYXJncywgZm10LCB0c3RydWN0LCB0cGZtdCkJXAoraW50CQkJCQkJCQkJXAorZnRyYWNlX2RlZmluZV9maWVsZHNfIyNjYWxsKHZvaWQpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqZXZlbnRfY2FsbCA9ICZldmVudF8jI2NhbGw7CQlcCisJc3RydWN0IGFyZ3MgZmllbGQ7CQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2NvbW1vbl9maWVsZCh1bnNpZ25lZCBjaGFyLCB0eXBlLCAwKTsJCQkJXAorCV9fY29tbW9uX2ZpZWxkKHVuc2lnbmVkIGNoYXIsIGZsYWdzLCAwKTsJCQlcCisJX19jb21tb25fZmllbGQodW5zaWduZWQgY2hhciwgcHJlZW1wdF9jb3VudCwgMCk7CQlcCisJX19jb21tb25fZmllbGQoaW50LCBwaWQsIDEpOwkJCQkJXAorCV9fY29tbW9uX2ZpZWxkKGludCwgdGdpZCwgMSk7CQkJCQlcCisJCQkJCQkJCQlcCisJdHN0cnVjdDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKIH0KKworI3VuZGVmIFRSQUNFX0VWRU5UX0ZPUk1BVF9OT0ZJTFRFUgorI2RlZmluZSBUUkFDRV9FVkVOVF9GT1JNQVRfTk9GSUxURVIoY2FsbCwgcHJvdG8sIGFyZ3MsIGZtdCwgdHN0cnVjdCwJXAorCQkJCSAgICB0cGZtdCkKKwogI2luY2x1ZGUgInRyYWNlX2V2ZW50X3R5cGVzLmgiCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKaW5kZXggZDI4Njg3ZS4uOGI1OTI0MSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYwpAQCAtNjUsNiArNjUsMTIgQEAKIAlpZiAoIWN1cnJlbnQtPnJldF9zdGFjaykKIAkJcmV0dXJuIC1FQlVTWTsKIAorCS8qCisJICogV2UgbXVzdCBtYWtlIHN1cmUgdGhlIHJldF9zdGFjayBpcyB0ZXN0ZWQgYmVmb3JlIHdlIHJlYWQKKwkgKiBhbnl0aGluZyBlbHNlLgorCSAqLworCXNtcF9ybWIoKTsKKwogCS8qIFRoZSByZXR1cm4gdHJhY2Ugc3RhY2sgaXMgZnVsbCAqLwogCWlmIChjdXJyZW50LT5jdXJyX3JldF9zdGFjayA9PSBGVFJBQ0VfUkVURlVOQ19ERVBUSCAtIDEpIHsKIAkJYXRvbWljX2luYygmY3VycmVudC0+dHJhY2Vfb3ZlcnJ1bik7CkBAIC03OCwxMyArODQsMTQgQEAKIAljdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLnJldCA9IHJldDsKIAljdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLmZ1bmMgPSBmdW5jOwogCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0uY2FsbHRpbWUgPSBjYWxsdGltZTsKKwljdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLnN1YnRpbWUgPSAwOwogCSpkZXB0aCA9IGluZGV4OwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qIFJldHJpZXZlIGEgZnVuY3Rpb24gcmV0dXJuIGFkZHJlc3MgdG8gdGhlIHRyYWNlIHN0YWNrIG9uIHRocmVhZCBpbmZvLiovCi12b2lkCitzdGF0aWMgdm9pZAogZnRyYWNlX3BvcF9yZXR1cm5fdHJhY2Uoc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXQgKnRyYWNlLCB1bnNpZ25lZCBsb25nICpyZXQpCiB7CiAJaW50IGluZGV4OwpAQCAtMTA0LDkgKzExMSw2IEBACiAJdHJhY2UtPmNhbGx0aW1lID0gY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5jYWxsdGltZTsKIAl0cmFjZS0+b3ZlcnJ1biA9IGF0b21pY19yZWFkKCZjdXJyZW50LT50cmFjZV9vdmVycnVuKTsKIAl0cmFjZS0+ZGVwdGggPSBpbmRleDsKLQliYXJyaWVyKCk7Ci0JY3VycmVudC0+Y3Vycl9yZXRfc3RhY2stLTsKLQogfQogCiAvKgpAQCAtMTIxLDYgKzEyNSw4IEBACiAJZnRyYWNlX3BvcF9yZXR1cm5fdHJhY2UoJnRyYWNlLCAmcmV0KTsKIAl0cmFjZS5yZXR0aW1lID0gdHJhY2VfY2xvY2tfbG9jYWwoKTsKIAlmdHJhY2VfZ3JhcGhfcmV0dXJuKCZ0cmFjZSk7CisJYmFycmllcigpOworCWN1cnJlbnQtPmN1cnJfcmV0X3N0YWNrLS07CiAKIAlpZiAodW5saWtlbHkoIXJldCkpIHsKIAkJZnRyYWNlX2dyYXBoX3N0b3AoKTsKQEAgLTQyNiw4ICs0MzIsOCBAQAogCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBlbnVtIHByaW50X2xpbmVfdAotcHJpbnRfZ3JhcGhfZHVyYXRpb24odW5zaWduZWQgbG9uZyBsb25nIGR1cmF0aW9uLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKQorZW51bSBwcmludF9saW5lX3QKK3RyYWNlX3ByaW50X2dyYXBoX2R1cmF0aW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBkdXJhdGlvbiwgc3RydWN0IHRyYWNlX3NlcSAqcykKIHsKIAl1bnNpZ25lZCBsb25nIG5zZWNzX3JlbSA9IGRvX2RpdihkdXJhdGlvbiwgMTAwMCk7CiAJLyogbG9nMTAoVUxPTkdfTUFYKSArICdcMCcgKi8KQEAgLTQ2NCwxMiArNDcwLDIzIEBACiAJCWlmICghcmV0KQogCQkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwogCX0KKwlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOworfQorCitzdGF0aWMgZW51bSBwcmludF9saW5lX3QKK3ByaW50X2dyYXBoX2R1cmF0aW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBkdXJhdGlvbiwgc3RydWN0IHRyYWNlX3NlcSAqcykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gdHJhY2VfcHJpbnRfZ3JhcGhfZHVyYXRpb24oZHVyYXRpb24sIHMpOworCWlmIChyZXQgIT0gVFJBQ0VfVFlQRV9IQU5ETEVEKQorCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAifCAgIik7CiAJaWYgKCFyZXQpCiAJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwogCisJcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKIH0KIAogLyogQ2FzZSBvZiBhIGxlYWYgZnVuY3Rpb24gb24gaXRzIGNhbGwgZW50cnkgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9od19icmFuY2hlcy5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKaW5kZXggN2JmZGY0Yy4uY2E3ZDdjNCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMKQEAgLTEsMTAgKzEsOSBAQAogLyoKLSAqIGgvdyBicmFuY2ggdHJhY2VyIGZvciB4ODYgYmFzZWQgb24gYnRzCisgKiBoL3cgYnJhbmNoIHRyYWNlciBmb3IgeDg2IGJhc2VkIG9uIEJUUwogICoKICAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEludGVsIENvcnBvcmF0aW9uLgogICogTWFya3VzIE1ldHpnZXIgPG1hcmt1cy50Lm1ldHpnZXJAZ21haWwuY29tPiwgMjAwOC0yMDA5CiAgKi8KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgpAQCAtMTUsMTEwICsxNCwxMTkgQEAKIAogI2luY2x1ZGUgPGFzbS9kcy5oPgogCi0jaW5jbHVkZSAidHJhY2UuaCIKICNpbmNsdWRlICJ0cmFjZV9vdXRwdXQuaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgogCiAKLSNkZWZpbmUgU0laRU9GX0JUUyAoMSA8PCAxMykKKyNkZWZpbmUgQlRTX0JVRkZFUl9TSVpFICgxIDw8IDEzKQogCi0vKgotICogVGhlIHRyYWNlciBsb2NrIHByb3RlY3RzIHRoZSBiZWxvdyBwZXItY3B1IHRyYWNlciBhcnJheS4KLSAqIEl0IG5lZWRzIHRvIGJlIGhlbGQgdG86Ci0gKiAtIHN0YXJ0IHRyYWNpbmcgb24gYWxsIGNwdXMKLSAqIC0gc3RvcCB0cmFjaW5nIG9uIGFsbCBjcHVzCi0gKiAtIHN0YXJ0IHRyYWNpbmcgb24gYSBzaW5nbGUgaG90cGx1ZyBjcHUKLSAqIC0gc3RvcCB0cmFjaW5nIG9uIGEgc2luZ2xlIGhvdHBsdWcgY3B1Ci0gKiAtIHJlYWQgdGhlIHRyYWNlIGZyb20gYWxsIGNwdXMKLSAqIC0gcmVhZCB0aGUgdHJhY2UgZnJvbSBhIHNpbmdsZSBjcHUKLSAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhidHNfdHJhY2VyX2xvY2spOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBidHNfdHJhY2VyICosIHRyYWNlcik7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgY2hhcltTSVpFT0ZfQlRTXSwgYnVmZmVyKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBjaGFyW0JUU19CVUZGRVJfU0laRV0sIGJ1ZmZlcik7CiAKICNkZWZpbmUgdGhpc190cmFjZXIgcGVyX2NwdSh0cmFjZXIsIHNtcF9wcm9jZXNzb3JfaWQoKSkKLSNkZWZpbmUgdGhpc19idWZmZXIgcGVyX2NwdShidWZmZXIsIHNtcF9wcm9jZXNzb3JfaWQoKSkKIAotc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IHRyYWNlX2h3X2JyYW5jaGVzX2VuYWJsZWQ7CitzdGF0aWMgaW50IHRyYWNlX2h3X2JyYW5jaGVzX2VuYWJsZWQgX19yZWFkX21vc3RseTsKK3N0YXRpYyBpbnQgdHJhY2VfaHdfYnJhbmNoZXNfc3VzcGVuZGVkIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgc3RydWN0IHRyYWNlX2FycmF5ICpod19icmFuY2hfdHJhY2UgX19yZWFkX21vc3RseTsKIAogCi0vKgotICogU3RhcnQgdHJhY2luZyBvbiB0aGUgY3VycmVudCBjcHUuCi0gKiBUaGUgYXJndW1lbnQgaXMgaWdub3JlZC4KLSAqCi0gKiBwcmU6IGJ0c190cmFjZXJfbG9jayBtdXN0IGJlIGxvY2tlZC4KLSAqLwotc3RhdGljIHZvaWQgYnRzX3RyYWNlX3N0YXJ0X2NwdSh2b2lkICphcmcpCitzdGF0aWMgdm9pZCBidHNfdHJhY2VfaW5pdF9jcHUoaW50IGNwdSkKIHsKLQlpZiAodGhpc190cmFjZXIpCi0JCWRzX3JlbGVhc2VfYnRzKHRoaXNfdHJhY2VyKTsKKwlwZXJfY3B1KHRyYWNlciwgY3B1KSA9CisJCWRzX3JlcXVlc3RfYnRzX2NwdShjcHUsIHBlcl9jcHUoYnVmZmVyLCBjcHUpLCBCVFNfQlVGRkVSX1NJWkUsCisJCQkJICAgTlVMTCwgKHNpemVfdCktMSwgQlRTX0tFUk5FTCk7CiAKLQl0aGlzX3RyYWNlciA9Ci0JCWRzX3JlcXVlc3RfYnRzKC8qIHRhc2sgPSAqLyBOVUxMLCB0aGlzX2J1ZmZlciwgU0laRU9GX0JUUywKLQkJCSAgICAgICAvKiBvdmZsID0gKi8gTlVMTCwgLyogdGggPSAqLyAoc2l6ZV90KS0xLAotCQkJICAgICAgIEJUU19LRVJORUwpOwotCWlmIChJU19FUlIodGhpc190cmFjZXIpKSB7Ci0JCXRoaXNfdHJhY2VyID0gTlVMTDsKLQkJcmV0dXJuOworCWlmIChJU19FUlIocGVyX2NwdSh0cmFjZXIsIGNwdSkpKQorCQlwZXJfY3B1KHRyYWNlciwgY3B1KSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYnRzX3RyYWNlX2luaXQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKK3sKKwlpbnQgY3B1OworCisJaHdfYnJhbmNoX3RyYWNlID0gdHI7CisJdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZCA9IDA7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlidHNfdHJhY2VfaW5pdF9jcHUoY3B1KTsKKworCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKKwkJCXRyYWNlX2h3X2JyYW5jaGVzX2VuYWJsZWQgPSAxOwogCX0KKwl0cmFjZV9od19icmFuY2hlc19zdXNwZW5kZWQgPSAwOworCXB1dF9vbmxpbmVfY3B1cygpOworCisJLyogSWYgd2UgY291bGQgbm90IGVuYWJsZSB0cmFjaW5nIG9uIGEgc2luZ2xlIGNwdSwgd2UgZmFpbC4gKi8KKwlyZXR1cm4gdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZCA/IDAgOiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIHZvaWQgYnRzX3RyYWNlX3Jlc2V0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCit7CisJaW50IGNwdTsKKworCWdldF9vbmxpbmVfY3B1cygpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWlmIChsaWtlbHkocGVyX2NwdSh0cmFjZXIsIGNwdSkpKSB7CisJCQlkc19yZWxlYXNlX2J0cyhwZXJfY3B1KHRyYWNlciwgY3B1KSk7CisJCQlwZXJfY3B1KHRyYWNlciwgY3B1KSA9IE5VTEw7CisJCX0KKwl9CisJdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZCA9IDA7CisJdHJhY2VfaHdfYnJhbmNoZXNfc3VzcGVuZGVkID0gMDsKKwlwdXRfb25saW5lX2NwdXMoKTsKIH0KIAogc3RhdGljIHZvaWQgYnRzX3RyYWNlX3N0YXJ0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCiB7Ci0Jc3Bpbl9sb2NrKCZidHNfdHJhY2VyX2xvY2spOworCWludCBjcHU7CiAKLQlvbl9lYWNoX2NwdShidHNfdHJhY2Vfc3RhcnRfY3B1LCBOVUxMLCAxKTsKLQl0cmFjZV9od19icmFuY2hlc19lbmFibGVkID0gMTsKLQotCXNwaW5fdW5sb2NrKCZidHNfdHJhY2VyX2xvY2spOwotfQotCi0vKgotICogU3RvcCB0cmFjaW5nIG9uIHRoZSBjdXJyZW50IGNwdS4KLSAqIFRoZSBhcmd1bWVudCBpcyBpZ25vcmVkLgotICoKLSAqIHByZTogYnRzX3RyYWNlcl9sb2NrIG11c3QgYmUgbG9ja2VkLgotICovCi1zdGF0aWMgdm9pZCBidHNfdHJhY2Vfc3RvcF9jcHUodm9pZCAqYXJnKQotewotCWlmICh0aGlzX3RyYWNlcikgewotCQlkc19yZWxlYXNlX2J0cyh0aGlzX3RyYWNlcik7Ci0JCXRoaXNfdHJhY2VyID0gTlVMTDsKLQl9CisJZ2V0X29ubGluZV9jcHVzKCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWlmIChsaWtlbHkocGVyX2NwdSh0cmFjZXIsIGNwdSkpKQorCQkJZHNfcmVzdW1lX2J0cyhwZXJfY3B1KHRyYWNlciwgY3B1KSk7CisJdHJhY2VfaHdfYnJhbmNoZXNfc3VzcGVuZGVkID0gMDsKKwlwdXRfb25saW5lX2NwdXMoKTsKIH0KIAogc3RhdGljIHZvaWQgYnRzX3RyYWNlX3N0b3Aoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKIHsKLQlzcGluX2xvY2soJmJ0c190cmFjZXJfbG9jayk7CisJaW50IGNwdTsKIAotCXRyYWNlX2h3X2JyYW5jaGVzX2VuYWJsZWQgPSAwOwotCW9uX2VhY2hfY3B1KGJ0c190cmFjZV9zdG9wX2NwdSwgTlVMTCwgMSk7Ci0KLQlzcGluX3VubG9jaygmYnRzX3RyYWNlcl9sb2NrKTsKKwlnZXRfb25saW5lX2NwdXMoKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJaWYgKGxpa2VseShwZXJfY3B1KHRyYWNlciwgY3B1KSkpCisJCQlkc19zdXNwZW5kX2J0cyhwZXJfY3B1KHRyYWNlciwgY3B1KSk7CisJdHJhY2VfaHdfYnJhbmNoZXNfc3VzcGVuZGVkID0gMTsKKwlwdXRfb25saW5lX2NwdXMoKTsKIH0KIAogc3RhdGljIGludCBfX2NwdWluaXQgYnRzX2hvdGNwdV9oYW5kbGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0KLQlzcGluX2xvY2soJmJ0c190cmFjZXJfbG9jayk7Ci0KLQlpZiAoIXRyYWNlX2h3X2JyYW5jaGVzX2VuYWJsZWQpCi0JCWdvdG8gb3V0OworCWludCBjcHUgPSAobG9uZyloY3B1OwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9PTkxJTkU6CiAJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGJ0c190cmFjZV9zdGFydF9jcHUsIE5VTEwsIDEpOworCQkvKiBUaGUgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuICovCisJCWlmICh0cmFjZV9od19icmFuY2hlc19lbmFibGVkKSB7CisJCQlidHNfdHJhY2VfaW5pdF9jcHUoY3B1KTsKKworCQkJaWYgKHRyYWNlX2h3X2JyYW5jaGVzX3N1c3BlbmRlZCAmJgorCQkJICAgIGxpa2VseShwZXJfY3B1KHRyYWNlciwgY3B1KSkpCisJCQkJZHNfc3VzcGVuZF9idHMocGVyX2NwdSh0cmFjZXIsIGNwdSkpOworCQl9CiAJCWJyZWFrOworCiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBidHNfdHJhY2Vfc3RvcF9jcHUsIE5VTEwsIDEpOwotCQlicmVhazsKKwkJLyogVGhlIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdpdGggaW50ZXJydXB0cyBlbmFibGVkLiAqLworCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkgeworCQkJZHNfcmVsZWFzZV9idHMocGVyX2NwdSh0cmFjZXIsIGNwdSkpOworCQkJcGVyX2NwdSh0cmFjZXIsIGNwdSkgPSBOVUxMOworCQl9CiAJfQogCi0gb3V0OgotCXNwaW5fdW5sb2NrKCZidHNfdHJhY2VyX2xvY2spOwogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIApAQCAtMTI2LDIwICsxMzQsNiBAQAogCS5ub3RpZmllcl9jYWxsID0gYnRzX2hvdGNwdV9oYW5kbGVyCiB9OwogCi1zdGF0aWMgaW50IGJ0c190cmFjZV9pbml0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCi17Ci0JaHdfYnJhbmNoX3RyYWNlID0gdHI7Ci0KLQlidHNfdHJhY2Vfc3RhcnQodHIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ0c190cmFjZV9yZXNldChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQotewotCWJ0c190cmFjZV9zdG9wKHRyKTsKLX0KLQogc3RhdGljIHZvaWQgYnRzX3RyYWNlX3ByaW50X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiAJc2VxX3B1dHMobSwgIiMgQ1BVIyAgICAgICAgVE8gIDwtICBGUk9NXG4iKTsKQEAgLTE0NywxMCArMTQxLDEwIEBACiAKIHN0YXRpYyBlbnVtIHByaW50X2xpbmVfdCBidHNfdHJhY2VfcHJpbnRfbGluZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCiB7CisJdW5zaWduZWQgbG9uZyBzeW1mbGFncyA9IFRSQUNFX0lURVJfU1lNX09GRlNFVDsKIAlzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudHJ5ID0gaXRlci0+ZW50OwogCXN0cnVjdCB0cmFjZV9zZXEgKnNlcSA9ICZpdGVyLT5zZXE7CiAJc3RydWN0IGh3X2JyYW5jaF9lbnRyeSAqaXQ7Ci0JdW5zaWduZWQgbG9uZyBzeW1mbGFncyA9IFRSQUNFX0lURVJfU1lNX09GRlNFVDsKIAogCXRyYWNlX2Fzc2lnbl90eXBlKGl0LCBlbnRyeSk7CiAKQEAgLTE2OCw2ICsxNjIsNyBAQAogCiB2b2lkIHRyYWNlX2h3X2JyYW5jaCh1NjQgZnJvbSwgdTY0IHRvKQogeworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9od19icmFuY2g7CiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGh3X2JyYW5jaF90cmFjZTsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBod19icmFuY2hfZW50cnkgKmVudHJ5OwpAQCAtMTk0LDcgKzE4OSw4IEBACiAJZW50cnktPmVudC50eXBlID0gVFJBQ0VfSFdfQlJBTkNIRVM7CiAJZW50cnktPmZyb20gPSBmcm9tOwogCWVudHJ5LT50byAgID0gdG87Ci0JdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQodHIsIGV2ZW50LCAwLCAwKTsKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXRyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLCBldmVudCwgMCwgMCk7CiAKICBvdXQ6CiAJYXRvbWljX2RlYygmdHItPmRhdGFbY3B1XS0+ZGlzYWJsZWQpOwpAQCAtMjI0LDExICsyMjAsMTEgQEAKIC8qCiAgKiBDb2xsZWN0IHRoZSB0cmFjZSBvbiB0aGUgY3VycmVudCBjcHUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGZ0cmFjZSBidWZmZXIuCiAgKgotICogcHJlOiBidHNfdHJhY2VyX2xvY2sgbXVzdCBiZSBsb2NrZWQKKyAqIHByZTogdHJhY2luZyBtdXN0IGJlIHN1c3BlbmRlZCBvbiB0aGUgY3VycmVudCBjcHUKICAqLwogc3RhdGljIHZvaWQgdHJhY2VfYnRzX2NwdSh2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IChzdHJ1Y3QgdHJhY2VfYXJyYXkgKikgYXJnOworCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSAoc3RydWN0IHRyYWNlX2FycmF5ICopYXJnOwogCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlOwogCXVuc2lnbmVkIGNoYXIgKmF0OwogCkBAIC0yNDEsMTAgKzIzNyw5IEBACiAJaWYgKHVubGlrZWx5KCF0aGlzX3RyYWNlcikpCiAJCXJldHVybjsKIAotCWRzX3N1c3BlbmRfYnRzKHRoaXNfdHJhY2VyKTsKIAl0cmFjZSA9IGRzX3JlYWRfYnRzKHRoaXNfdHJhY2VyKTsKIAlpZiAoIXRyYWNlKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCiAJZm9yIChhdCA9IHRyYWNlLT5kcy50b3A7ICh2b2lkICopYXQgPCB0cmFjZS0+ZHMuZW5kOwogCSAgICAgYXQgKz0gdHJhY2UtPmRzLnNpemUpCkBAIC0yNTMsMTggKzI0OCwyNyBAQAogCWZvciAoYXQgPSB0cmFjZS0+ZHMuYmVnaW47ICh2b2lkICopYXQgPCB0cmFjZS0+ZHMudG9wOwogCSAgICAgYXQgKz0gdHJhY2UtPmRzLnNpemUpCiAJCXRyYWNlX2J0c19hdCh0cmFjZSwgYXQpOwotCi1vdXQ6Ci0JZHNfcmVzdW1lX2J0cyh0aGlzX3RyYWNlcik7CiB9CiAKIHN0YXRpYyB2b2lkIHRyYWNlX2J0c19wcmVwYXJlKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKLQlzcGluX2xvY2soJmJ0c190cmFjZXJfbG9jayk7CisJaW50IGNwdTsKIAorCWdldF9vbmxpbmVfY3B1cygpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKKwkJCWRzX3N1c3BlbmRfYnRzKHBlcl9jcHUodHJhY2VyLCBjcHUpKTsKKwkvKgorCSAqIFdlIG5lZWQgdG8gY29sbGVjdCB0aGUgdHJhY2Ugb24gdGhlIHJlc3BlY3RpdmUgY3B1IHNpbmNlIGZ0cmFjZQorCSAqIGltcGxpY2l0bHkgYWRkcyB0aGUgcmVjb3JkIGZvciB0aGUgY3VycmVudCBjcHUuCisJICogT25jZSB0aGF0IGlzIG1vcmUgZmxleGlibGUsIHdlIGNvdWxkIGNvbGxlY3QgdGhlIGRhdGEgZnJvbSBhbnkgY3B1LgorCSAqLwogCW9uX2VhY2hfY3B1KHRyYWNlX2J0c19jcHUsIGl0ZXItPnRyLCAxKTsKIAotCXNwaW5fdW5sb2NrKCZidHNfdHJhY2VyX2xvY2spOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKKwkJCWRzX3Jlc3VtZV9idHMocGVyX2NwdSh0cmFjZXIsIGNwdSkpOworCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCiBzdGF0aWMgdm9pZCB0cmFjZV9idHNfY2xvc2Uoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQpAQCAtMjc0LDExICsyNzgsMTEgQEAKIAogdm9pZCB0cmFjZV9od19icmFuY2hfb29wcyh2b2lkKQogewotCXNwaW5fbG9jaygmYnRzX3RyYWNlcl9sb2NrKTsKLQotCXRyYWNlX2J0c19jcHUoaHdfYnJhbmNoX3RyYWNlKTsKLQotCXNwaW5fdW5sb2NrKCZidHNfdHJhY2VyX2xvY2spOworCWlmICh0aGlzX3RyYWNlcikgeworCQlkc19zdXNwZW5kX2J0c19ub2lycSh0aGlzX3RyYWNlcik7CisJCXRyYWNlX2J0c19jcHUoaHdfYnJhbmNoX3RyYWNlKTsKKwkJZHNfcmVzdW1lX2J0c19ub2lycSh0aGlzX3RyYWNlcik7CisJfQogfQogCiBzdHJ1Y3QgdHJhY2VyIGJ0c190cmFjZXIgX19yZWFkX21vc3RseSA9CkBAIC0yOTEsNyArMjk1LDEwIEBACiAJLnN0YXJ0CQk9IGJ0c190cmFjZV9zdGFydCwKIAkuc3RvcAkJPSBidHNfdHJhY2Vfc3RvcCwKIAkub3BlbgkJPSB0cmFjZV9idHNfcHJlcGFyZSwKLQkuY2xvc2UJCT0gdHJhY2VfYnRzX2Nsb3NlCisJLmNsb3NlCQk9IHRyYWNlX2J0c19jbG9zZSwKKyNpZmRlZiBDT05GSUdfRlRSQUNFX1NFTEZURVNUCisJLnNlbGZ0ZXN0CT0gdHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9od19icmFuY2hlcywKKyNlbmRpZiAvKiBDT05GSUdfRlRSQUNFX1NFTEZURVNUICovCiB9OwogCiBfX2luaXQgc3RhdGljIGludCBpbml0X2J0c190cmFjZSh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX21taW90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX21taW90cmFjZS5jCmluZGV4IDhlMzdmY2QuLmQ1M2I0NWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9tbWlvdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfbW1pb3RyYWNlLmMKQEAgLTksNiArOSw4IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW1pb3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiAjaW5jbHVkZSAidHJhY2UuaCIKQEAgLTE3NCw3ICsxNzYsNyBAQAogCXN0cnVjdCBtbWlvdHJhY2VfcncgKnJ3OwogCXN0cnVjdCB0cmFjZV9zZXEgKnMJPSAmaXRlci0+c2VxOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0CT0gbnMydXNlY3MoaXRlci0+dHMpOwotCXVuc2lnbmVkIGxvbmcgdXNlY19yZW0JPSBkb19kaXYodCwgMTAwMDAwMFVMTCk7CisJdW5zaWduZWQgbG9uZyB1c2VjX3JlbQk9IGRvX2Rpdih0LCBVU0VDX1BFUl9TRUMpOwogCXVuc2lnbmVkIHNlY3MJCT0gKHVuc2lnbmVkIGxvbmcpdDsKIAlpbnQgcmV0ID0gMTsKIApAQCAtMjIxLDcgKzIyMyw3IEBACiAJc3RydWN0IG1taW90cmFjZV9tYXAgKm07CiAJc3RydWN0IHRyYWNlX3NlcSAqcwk9ICZpdGVyLT5zZXE7CiAJdW5zaWduZWQgbG9uZyBsb25nIHQJPSBuczJ1c2VjcyhpdGVyLT50cyk7Ci0JdW5zaWduZWQgbG9uZyB1c2VjX3JlbQk9IGRvX2Rpdih0LCAxMDAwMDAwVUxMKTsKKwl1bnNpZ25lZCBsb25nIHVzZWNfcmVtCT0gZG9fZGl2KHQsIFVTRUNfUEVSX1NFQyk7CiAJdW5zaWduZWQgc2VjcwkJPSAodW5zaWduZWQgbG9uZyl0OwogCWludCByZXQ7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYwppbmRleCA2NGI1NGE1Li43OTM4ZjNhIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCkBAIC0xNCwxMSArMTQsMjUgQEAKIC8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCiAjZGVmaW5lIEVWRU5UX0hBU0hTSVpFCTEyOAogCi1zdGF0aWMgREVGSU5FX01VVEVYKHRyYWNlX2V2ZW50X211dGV4KTsKK0RFQ0xBUkVfUldTRU0odHJhY2VfZXZlbnRfbXV0ZXgpOworCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdHJhY2Vfc2VxLCBmdHJhY2VfZXZlbnRfc2VxKTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChmdHJhY2VfZXZlbnRfc2VxKTsKKwogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkIGV2ZW50X2hhc2hbRVZFTlRfSEFTSFNJWkVdIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBpbnQgbmV4dF9ldmVudF90eXBlID0gX19UUkFDRV9MQVNUX1RZUEUgKyAxOwogCit2b2lkIHRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpCit7CisJaW50IGxlbiA9IHMtPmxlbiA+PSBQQUdFX1NJWkUgPyBQQUdFX1NJWkUgLSAxIDogcy0+bGVuOworCisJcy0+YnVmZmVyW2xlbl0gPSAwOworCXNlcV9wdXRzKG0sIHMtPmJ1ZmZlcik7CisKKwl0cmFjZV9zZXFfaW5pdChzKTsKK30KKwogZW51bSBwcmludF9saW5lX3QgdHJhY2VfcHJpbnRfYnByaW50a19tc2dfb25seShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCiB7CiAJc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7CkBAIC04NCw2ICs5OCwzOSBAQAogCiAJcmV0dXJuIGxlbjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHRyYWNlX3NlcV9wcmludGYpOworCisvKioKKyAqIHRyYWNlX3NlcV92cHJpbnRmIC0gc2VxdWVuY2UgcHJpbnRpbmcgb2YgdHJhY2UgaW5mb3JtYXRpb24KKyAqIEBzOiB0cmFjZSBzZXF1ZW5jZSBkZXNjcmlwdG9yCisgKiBAZm10OiBwcmludGYgZm9ybWF0IHN0cmluZworICoKKyAqIFRoZSB0cmFjZXIgbWF5IHVzZSBlaXRoZXIgc2VxdWVuY2Ugb3BlcmF0aW9ucyBvciBpdHMgb3duCisgKiBjb3B5IHRvIHVzZXIgcm91dGluZXMuIFRvIHNpbXBsaWZ5IGZvcm1hdGluZyBvZiBhIHRyYWNlCisgKiB0cmFjZV9zZXFfcHJpbnRmIGlzIHVzZWQgdG8gc3RvcmUgc3RyaW5ncyBpbnRvIGEgc3BlY2lhbAorICogYnVmZmVyIChAcykuIFRoZW4gdGhlIG91dHB1dCBtYXkgYmUgZWl0aGVyIHVzZWQgYnkKKyAqIHRoZSBzZXF1ZW5jZXIgb3IgcHVsbGVkIGludG8gYW5vdGhlciBidWZmZXIuCisgKi8KK2ludAordHJhY2Vfc2VxX3ZwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJaW50IGxlbiA9IChQQUdFX1NJWkUgLSAxKSAtIHMtPmxlbjsKKwlpbnQgcmV0OworCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJcmV0ID0gdnNucHJpbnRmKHMtPmJ1ZmZlciArIHMtPmxlbiwgbGVuLCBmbXQsIGFyZ3MpOworCisJLyogSWYgd2UgY2FuJ3Qgd3JpdGUgaXQgYWxsLCBkb24ndCBib3RoZXIgd3JpdGluZyBhbnl0aGluZyAqLworCWlmIChyZXQgPj0gbGVuKQorCQlyZXR1cm4gMDsKKworCXMtPmxlbiArPSByZXQ7CisKKwlyZXR1cm4gbGVuOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2Vfc2VxX3ZwcmludGYpOwogCiBpbnQgdHJhY2Vfc2VxX2JwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCBjb25zdCB1MzIgKmJpbmFyeSkKIHsKQEAgLTIwMSw2ICsyNDgsNjcgQEAKIAlyZXR1cm4gMDsKIH0KIAorY29uc3QgY2hhciAqCitmdHJhY2VfcHJpbnRfZmxhZ3Nfc2VxKHN0cnVjdCB0cmFjZV9zZXEgKnAsIGNvbnN0IGNoYXIgKmRlbGltLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJICAgICAgIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyAqZmxhZ19hcnJheSkKK3sKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJY29uc3QgY2hhciAqc3RyOworCWNvbnN0IGNoYXIgKnJldCA9IHAtPmJ1ZmZlciArIHAtPmxlbjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7ICBmbGFnX2FycmF5W2ldLm5hbWUgJiYgZmxhZ3M7IGkrKykgeworCisJCW1hc2sgPSBmbGFnX2FycmF5W2ldLm1hc2s7CisJCWlmICgoZmxhZ3MgJiBtYXNrKSAhPSBtYXNrKQorCQkJY29udGludWU7CisKKwkJc3RyID0gZmxhZ19hcnJheVtpXS5uYW1lOworCQlmbGFncyAmPSB+bWFzazsKKwkJaWYgKHAtPmxlbiAmJiBkZWxpbSkKKwkJCXRyYWNlX3NlcV9wdXRzKHAsIGRlbGltKTsKKwkJdHJhY2Vfc2VxX3B1dHMocCwgc3RyKTsKKwl9CisKKwkvKiBjaGVjayBmb3IgbGVmdCBvdmVyIGZsYWdzICovCisJaWYgKGZsYWdzKSB7CisJCWlmIChwLT5sZW4gJiYgZGVsaW0pCisJCQl0cmFjZV9zZXFfcHV0cyhwLCBkZWxpbSk7CisJCXRyYWNlX3NlcV9wcmludGYocCwgIjB4JWx4IiwgZmxhZ3MpOworCX0KKworCXRyYWNlX3NlcV9wdXRjKHAsIDApOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZnRyYWNlX3ByaW50X2ZsYWdzX3NlcSk7CisKK2NvbnN0IGNoYXIgKgorZnRyYWNlX3ByaW50X3N5bWJvbHNfc2VxKHN0cnVjdCB0cmFjZV9zZXEgKnAsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyAqc3ltYm9sX2FycmF5KQoreworCWludCBpOworCWNvbnN0IGNoYXIgKnJldCA9IHAtPmJ1ZmZlciArIHAtPmxlbjsKKworCWZvciAoaSA9IDA7ICBzeW1ib2xfYXJyYXlbaV0ubmFtZTsgaSsrKSB7CisKKwkJaWYgKHZhbCAhPSBzeW1ib2xfYXJyYXlbaV0ubWFzaykKKwkJCWNvbnRpbnVlOworCisJCXRyYWNlX3NlcV9wdXRzKHAsIHN5bWJvbF9hcnJheVtpXS5uYW1lKTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFwLT5sZW4pCisJCXRyYWNlX3NlcV9wcmludGYocCwgIjB4JWx4IiwgdmFsKTsKKwkJCisJdHJhY2Vfc2VxX3B1dGMocCwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChmdHJhY2VfcHJpbnRfc3ltYm9sc19zZXEpOworCiAjaWZkZWYgQ09ORklHX0tSRVRQUk9CRVMKIHN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqa3JldHByb2JlZChjb25zdCBjaGFyICpuYW1lKQogewpAQCAtMzExLDE3ICs0MTksMjAgQEAKIAogCQlpZiAoaXAgPT0gVUxPTkdfTUFYIHx8ICFyZXQpCiAJCQlicmVhazsKLQkJaWYgKGkgJiYgcmV0KQotCQkJcmV0ID0gdHJhY2Vfc2VxX3B1dHMocywgIiA8LSAiKTsKKwkJaWYgKHJldCkKKwkJCXJldCA9IHRyYWNlX3NlcV9wdXRzKHMsICIgPT4gIik7CiAJCWlmICghaXApIHsKIAkJCWlmIChyZXQpCiAJCQkJcmV0ID0gdHJhY2Vfc2VxX3B1dHMocywgIj8/Iik7CisJCQlpZiAocmV0KQorCQkJCXJldCA9IHRyYWNlX3NlcV9wdXRzKHMsICJcbiIpOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKCFyZXQpCiAJCQlicmVhazsKIAkJaWYgKHJldCkKIAkJCXJldCA9IHNlcV9wcmludF91c2VyX2lwKHMsIG1tLCBpcCwgc3ltX2ZsYWdzKTsKKwkJcmV0ID0gdHJhY2Vfc2VxX3B1dHMocywgIlxuIik7CiAJfQogCiAJaWYgKG1tKQpAQCAtNDU1LDYgKzU2Niw3IEBACiAgKiBAdHlwZTogdGhlIHR5cGUgb2YgZXZlbnQgdG8gbG9vayBmb3IKICAqCiAgKiBSZXR1cm5zIGFuIGV2ZW50IG9mIHR5cGUgQHR5cGUgb3RoZXJ3aXNlIE5VTEwKKyAqIENhbGxlZCB3aXRoIHRyYWNlX2V2ZW50X3JlYWRfbG9jaygpIGhlbGQuCiAgKi8KIHN0cnVjdCB0cmFjZV9ldmVudCAqZnRyYWNlX2ZpbmRfZXZlbnQoaW50IHR5cGUpCiB7CkBAIC00NjQsNyArNTc2LDcgQEAKIAogCWtleSA9IHR5cGUgJiAoRVZFTlRfSEFTSFNJWkUgLSAxKTsKIAotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShldmVudCwgbiwgJmV2ZW50X2hhc2hba2V5XSwgbm9kZSkgeworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2ZW50LCBuLCAmZXZlbnRfaGFzaFtrZXldLCBub2RlKSB7CiAJCWlmIChldmVudC0+dHlwZSA9PSB0eXBlKQogCQkJcmV0dXJuIGV2ZW50OwogCX0KQEAgLTQ3Miw2ICs1ODQsNDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIExJU1RfSEVBRChmdHJhY2VfZXZlbnRfbGlzdCk7CisKK3N0YXRpYyBpbnQgdHJhY2Vfc2VhcmNoX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqKmxpc3QpCit7CisJc3RydWN0IHRyYWNlX2V2ZW50ICplOworCWludCBsYXN0ID0gX19UUkFDRV9MQVNUX1RZUEU7CisKKwlpZiAobGlzdF9lbXB0eSgmZnRyYWNlX2V2ZW50X2xpc3QpKSB7CisJCSpsaXN0ID0gJmZ0cmFjZV9ldmVudF9saXN0OworCQlyZXR1cm4gbGFzdCArIDE7CisJfQorCisJLyoKKwkgKiBXZSB1c2VkIHVwIGFsbCBwb3NzaWJsZSBtYXggZXZlbnRzLAorCSAqIGxldHMgc2VlIGlmIHNvbWVib2R5IGZyZWVkIG9uZS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGUsICZmdHJhY2VfZXZlbnRfbGlzdCwgbGlzdCkgeworCQlpZiAoZS0+dHlwZSAhPSBsYXN0ICsgMSkKKwkJCWJyZWFrOworCQlsYXN0Kys7CisJfQorCisJLyogRGlkIHdlIHVzZWQgdXAgYWxsIDY1IHRob3VzYW5kIGV2ZW50cz8/PyAqLworCWlmICgobGFzdCArIDEpID4gRlRSQUNFX01BWF9FVkVOVCkKKwkJcmV0dXJuIDA7CisKKwkqbGlzdCA9ICZlLT5saXN0OworCXJldHVybiBsYXN0ICsgMTsKK30KKwordm9pZCB0cmFjZV9ldmVudF9yZWFkX2xvY2sodm9pZCkKK3sKKwlkb3duX3JlYWQoJnRyYWNlX2V2ZW50X211dGV4KTsKK30KKwordm9pZCB0cmFjZV9ldmVudF9yZWFkX3VubG9jayh2b2lkKQoreworCXVwX3JlYWQoJnRyYWNlX2V2ZW50X211dGV4KTsKK30KKwogLyoqCiAgKiByZWdpc3Rlcl9mdHJhY2VfZXZlbnQgLSByZWdpc3RlciBvdXRwdXQgZm9yIGFuIGV2ZW50IHR5cGUKICAqIEBldmVudDogdGhlIGV2ZW50IHR5cGUgdG8gcmVnaXN0ZXIKQEAgLTQ5MiwyMiArNjQ0LDQyIEBACiAJdW5zaWduZWQga2V5OwogCWludCByZXQgPSAwOwogCi0JbXV0ZXhfbG9jaygmdHJhY2VfZXZlbnRfbXV0ZXgpOworCWRvd25fd3JpdGUoJnRyYWNlX2V2ZW50X211dGV4KTsKIAotCWlmICghZXZlbnQpIHsKLQkJcmV0ID0gbmV4dF9ldmVudF90eXBlKys7CisJaWYgKFdBUk5fT04oIWV2ZW50KSkKIAkJZ290byBvdXQ7Ci0JfQogCi0JaWYgKCFldmVudC0+dHlwZSkKLQkJZXZlbnQtPnR5cGUgPSBuZXh0X2V2ZW50X3R5cGUrKzsKLQllbHNlIGlmIChldmVudC0+dHlwZSA+IF9fVFJBQ0VfTEFTVF9UWVBFKSB7CisJSU5JVF9MSVNUX0hFQUQoJmV2ZW50LT5saXN0KTsKKworCWlmICghZXZlbnQtPnR5cGUpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9IE5VTEw7CisKKwkJaWYgKG5leHRfZXZlbnRfdHlwZSA+IEZUUkFDRV9NQVhfRVZFTlQpIHsKKworCQkJZXZlbnQtPnR5cGUgPSB0cmFjZV9zZWFyY2hfbGlzdCgmbGlzdCk7CisJCQlpZiAoIWV2ZW50LT50eXBlKQorCQkJCWdvdG8gb3V0OworCisJCX0gZWxzZSB7CisJCQkKKwkJCWV2ZW50LT50eXBlID0gbmV4dF9ldmVudF90eXBlKys7CisJCQlsaXN0ID0gJmZ0cmFjZV9ldmVudF9saXN0OworCQl9CisKKwkJaWYgKFdBUk5fT04oZnRyYWNlX2ZpbmRfZXZlbnQoZXZlbnQtPnR5cGUpKSkKKwkJCWdvdG8gb3V0OworCisJCWxpc3RfYWRkX3RhaWwoJmV2ZW50LT5saXN0LCBsaXN0KTsKKworCX0gZWxzZSBpZiAoZXZlbnQtPnR5cGUgPiBfX1RSQUNFX0xBU1RfVFlQRSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJOZWVkIHRvIGFkZCB0eXBlIHRvIHRyYWNlLmhcbiIpOwogCQlXQVJOX09OKDEpOwotCX0KLQotCWlmIChmdHJhY2VfZmluZF9ldmVudChldmVudC0+dHlwZSkpCiAJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCS8qIElzIHRoaXMgZXZlbnQgYWxyZWFkeSB1c2VkICovCisJCWlmIChmdHJhY2VfZmluZF9ldmVudChldmVudC0+dHlwZSkpCisJCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAoZXZlbnQtPnRyYWNlID09IE5VTEwpCiAJCWV2ZW50LT50cmFjZSA9IHRyYWNlX25vcF9wcmludDsKQEAgLTUyMCwxNCArNjkyLDI1IEBACiAKIAlrZXkgPSBldmVudC0+dHlwZSAmIChFVkVOVF9IQVNIU0laRSAtIDEpOwogCi0JaGxpc3RfYWRkX2hlYWRfcmN1KCZldmVudC0+bm9kZSwgJmV2ZW50X2hhc2hba2V5XSk7CisJaGxpc3RfYWRkX2hlYWQoJmV2ZW50LT5ub2RlLCAmZXZlbnRfaGFzaFtrZXldKTsKIAogCXJldCA9IGV2ZW50LT50eXBlOwogIG91dDoKLQltdXRleF91bmxvY2soJnRyYWNlX2V2ZW50X211dGV4KTsKKwl1cF93cml0ZSgmdHJhY2VfZXZlbnRfbXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX2Z0cmFjZV9ldmVudCk7CisKKy8qCisgKiBVc2VkIGJ5IG1vZHVsZSBjb2RlIHdpdGggdGhlIHRyYWNlX2V2ZW50X211dGV4IGhlbGQgZm9yIHdyaXRlLgorICovCitpbnQgX191bnJlZ2lzdGVyX2Z0cmFjZV9ldmVudChzdHJ1Y3QgdHJhY2VfZXZlbnQgKmV2ZW50KQoreworCWhsaXN0X2RlbCgmZXZlbnQtPm5vZGUpOworCWxpc3RfZGVsKCZldmVudC0+bGlzdCk7CisJcmV0dXJuIDA7Cit9CiAKIC8qKgogICogdW5yZWdpc3Rlcl9mdHJhY2VfZXZlbnQgLSByZW1vdmUgYSBubyBsb25nZXIgdXNlZCBldmVudApAQCAtNTM1LDEyICs3MTgsMTMgQEAKICAqLwogaW50IHVucmVnaXN0ZXJfZnRyYWNlX2V2ZW50KHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpCiB7Ci0JbXV0ZXhfbG9jaygmdHJhY2VfZXZlbnRfbXV0ZXgpOwotCWhsaXN0X2RlbCgmZXZlbnQtPm5vZGUpOwotCW11dGV4X3VubG9jaygmdHJhY2VfZXZlbnRfbXV0ZXgpOworCWRvd25fd3JpdGUoJnRyYWNlX2V2ZW50X211dGV4KTsKKwlfX3VucmVnaXN0ZXJfZnRyYWNlX2V2ZW50KGV2ZW50KTsKKwl1cF93cml0ZSgmdHJhY2VfZXZlbnRfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX2Z0cmFjZV9ldmVudCk7CiAKIC8qCiAgKiBTdGFuZGFyZCBldmVudHMKQEAgLTgzMywxNCArMTAxNywxNiBAQAogCiAJdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGl0ZXItPmVudCk7CiAKKwlpZiAoIXRyYWNlX3NlcV9wdXRzKHMsICI8c3RhY2sgdHJhY2U+XG4iKSkKKwkJZ290byBwYXJ0aWFsOwogCWZvciAoaSA9IDA7IGkgPCBGVFJBQ0VfU1RBQ0tfRU5UUklFUzsgaSsrKSB7Ci0JCWlmIChpKSB7Ci0JCQlpZiAoIXRyYWNlX3NlcV9wdXRzKHMsICIgPD0gIikpCi0JCQkJZ290byBwYXJ0aWFsOworCQlpZiAoIWZpZWxkLT5jYWxsZXJbaV0gfHwgKGZpZWxkLT5jYWxsZXJbaV0gPT0gVUxPTkdfTUFYKSkKKwkJCWJyZWFrOworCQlpZiAoIXRyYWNlX3NlcV9wdXRzKHMsICIgPT4gIikpCisJCQlnb3RvIHBhcnRpYWw7CiAKLQkJCWlmICghc2VxX3ByaW50X2lwX3N5bShzLCBmaWVsZC0+Y2FsbGVyW2ldLCBmbGFncykpCi0JCQkJZ290byBwYXJ0aWFsOwotCQl9CisJCWlmICghc2VxX3ByaW50X2lwX3N5bShzLCBmaWVsZC0+Y2FsbGVyW2ldLCBmbGFncykpCisJCQlnb3RvIHBhcnRpYWw7CiAJCWlmICghdHJhY2Vfc2VxX3B1dHMocywgIlxuIikpCiAJCQlnb3RvIHBhcnRpYWw7CiAJfQpAQCAtODY4LDEwICsxMDU0LDEwIEBACiAKIAl0cmFjZV9hc3NpZ25fdHlwZShmaWVsZCwgaXRlci0+ZW50KTsKIAotCWlmICghc2VxX3ByaW50X3VzZXJpcF9vYmpzKGZpZWxkLCBzLCBmbGFncykpCisJaWYgKCF0cmFjZV9zZXFfcHV0cyhzLCAiPHVzZXIgc3RhY2sgdHJhY2U+XG4iKSkKIAkJZ290byBwYXJ0aWFsOwogCi0JaWYgKCF0cmFjZV9zZXFfcHV0YyhzLCAnXG4nKSkKKwlpZiAoIXNlcV9wcmludF91c2VyaXBfb2JqcyhmaWVsZCwgcywgZmxhZ3MpKQogCQlnb3RvIHBhcnRpYWw7CiAKIAlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5oIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5oCmluZGV4IGUwYmRlMzkuLmQzOGJlYzQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmgKQEAgLTEsNDEgKzEsMTcgQEAKICNpZm5kZWYgX19UUkFDRV9FVkVOVFNfSAogI2RlZmluZSBfX1RSQUNFX0VWRU5UU19ICiAKKyNpbmNsdWRlIDxsaW51eC90cmFjZV9zZXEuaD4KICNpbmNsdWRlICJ0cmFjZS5oIgogCi10eXBlZGVmIGVudW0gcHJpbnRfbGluZV90ICgqdHJhY2VfcHJpbnRfZnVuYykoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLAotCQkJCQkgICAgICBpbnQgZmxhZ3MpOwotCi1zdHJ1Y3QgdHJhY2VfZXZlbnQgewotCXN0cnVjdCBobGlzdF9ub2RlCW5vZGU7Ci0JaW50CQkJdHlwZTsKLQl0cmFjZV9wcmludF9mdW5jCXRyYWNlOwotCXRyYWNlX3ByaW50X2Z1bmMJcmF3OwotCXRyYWNlX3ByaW50X2Z1bmMJaGV4OwotCXRyYWNlX3ByaW50X2Z1bmMJYmluYXJ5OwotfTsKLQogZXh0ZXJuIGVudW0gcHJpbnRfbGluZV90CiB0cmFjZV9wcmludF9icHJpbnRrX21zZ19vbmx5KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcik7CiBleHRlcm4gZW51bSBwcmludF9saW5lX3QKIHRyYWNlX3ByaW50X3ByaW50a19tc2dfb25seShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogCi1leHRlcm4gaW50IHRyYWNlX3NlcV9wcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotZXh0ZXJuIGludAotdHJhY2Vfc2VxX2JwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCBjb25zdCB1MzIgKmJpbmFyeSk7CiBleHRlcm4gaW50CiBzZXFfcHJpbnRfaXBfc3ltKHN0cnVjdCB0cmFjZV9zZXEgKnMsIHVuc2lnbmVkIGxvbmcgaXAsCiAJCXVuc2lnbmVkIGxvbmcgc3ltX2ZsYWdzKTsKLWV4dGVybiBzc2l6ZV90IHRyYWNlX3NlcV90b191c2VyKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNoYXIgX191c2VyICp1YnVmLAotCQkJCSBzaXplX3QgY250KTsKLWV4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dHMoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqc3RyKTsKLWV4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dGMoc3RydWN0IHRyYWNlX3NlcSAqcywgdW5zaWduZWQgY2hhciBjKTsKLWV4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dG1lbShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW4pOwotZXh0ZXJuIGludCB0cmFjZV9zZXFfcHV0bWVtX2hleChzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sCi0JCQkJc2l6ZV90IGxlbik7Ci1leHRlcm4gdm9pZCAqdHJhY2Vfc2VxX3Jlc2VydmUoc3RydWN0IHRyYWNlX3NlcSAqcywgc2l6ZV90IGxlbik7Ci1leHRlcm4gaW50IHRyYWNlX3NlcV9wYXRoKHN0cnVjdCB0cmFjZV9zZXEgKnMsIHN0cnVjdCBwYXRoICpwYXRoKTsKIGV4dGVybiBpbnQgc2VxX3ByaW50X3VzZXJpcF9vYmpzKGNvbnN0IHN0cnVjdCB1c2Vyc3RhY2tfZW50cnkgKmVudHJ5LAogCQkJCSBzdHJ1Y3QgdHJhY2Vfc2VxICpzLCB1bnNpZ25lZCBsb25nIHN5bV9mbGFncyk7CiBleHRlcm4gaW50IHNlcV9wcmludF91c2VyX2lwKHN0cnVjdCB0cmFjZV9zZXEgKnMsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLApAQCAtNDQsMTMgKzIwLDE3IEBACiBleHRlcm4gaW50IHRyYWNlX3ByaW50X2NvbnRleHQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKTsKIGV4dGVybiBpbnQgdHJhY2VfcHJpbnRfbGF0X2NvbnRleHQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKTsKIAorZXh0ZXJuIHZvaWQgdHJhY2VfZXZlbnRfcmVhZF9sb2NrKHZvaWQpOworZXh0ZXJuIHZvaWQgdHJhY2VfZXZlbnRfcmVhZF91bmxvY2sodm9pZCk7CiBleHRlcm4gc3RydWN0IHRyYWNlX2V2ZW50ICpmdHJhY2VfZmluZF9ldmVudChpbnQgdHlwZSk7Ci1leHRlcm4gaW50IHJlZ2lzdGVyX2Z0cmFjZV9ldmVudChzdHJ1Y3QgdHJhY2VfZXZlbnQgKmV2ZW50KTsKLWV4dGVybiBpbnQgdW5yZWdpc3Rlcl9mdHJhY2VfZXZlbnQoc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCk7CiAKIGV4dGVybiBlbnVtIHByaW50X2xpbmVfdCB0cmFjZV9ub3BfcHJpbnQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLAogCQkJCQkgaW50IGZsYWdzKTsKIAorLyogdXNlZCBieSBtb2R1bGUgdW5yZWdpc3RlcmluZyAqLworZXh0ZXJuIGludCBfX3VucmVnaXN0ZXJfZnRyYWNlX2V2ZW50KHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpOworZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgdHJhY2VfZXZlbnRfbXV0ZXg7CisKICNkZWZpbmUgTUFYX01FTUhFWF9CWVRFUwk4CiAjZGVmaW5lIEhFWF9DSEFSUwkJKE1BWF9NRU1IRVhfQllURVMqMiArIDEpCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9wb3dlci5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3Bvd2VyLmMKaW5kZXggMTE4NDM5Ny4uOGEzMGQ5OCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Bvd2VyLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3Bvd2VyLmMKQEAgLTM2LDYgKzM2LDcgQEAKIAogc3RhdGljIHZvaWQgcHJvYmVfcG93ZXJfZW5kKHN0cnVjdCBwb3dlcl90cmFjZSAqaXQpCiB7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X3Bvd2VyOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IHRyYWNlX3Bvd2VyICplbnRyeTsKIAlzdHJ1Y3QgdHJhY2VfYXJyYXlfY3B1ICpkYXRhOwpAQCAtNTQsNyArNTUsOCBAQAogCQlnb3RvIG91dDsKIAllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwogCWVudHJ5LT5zdGF0ZV9kYXRhID0gKml0OwotCXRyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLCBldmVudCwgMCwgMCk7CisJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgdHItPmJ1ZmZlciwgZXZlbnQpKQorCQl0cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdCh0ciwgZXZlbnQsIDAsIDApOwogIG91dDoKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQpAQCAtNjIsNiArNjQsNyBAQAogc3RhdGljIHZvaWQgcHJvYmVfcG93ZXJfbWFyayhzdHJ1Y3QgcG93ZXJfdHJhY2UgKml0LCB1bnNpZ25lZCBpbnQgdHlwZSwKIAkJCQl1bnNpZ25lZCBpbnQgbGV2ZWwpCiB7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X3Bvd2VyOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IHRyYWNlX3Bvd2VyICplbnRyeTsKIAlzdHJ1Y3QgdHJhY2VfYXJyYXlfY3B1ICpkYXRhOwpAQCAtODQsNyArODcsOCBAQAogCQlnb3RvIG91dDsKIAllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwogCWVudHJ5LT5zdGF0ZV9kYXRhID0gKml0OwotCXRyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLCBldmVudCwgMCwgMCk7CisJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgdHItPmJ1ZmZlciwgZXZlbnQpKQorCQl0cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdCh0ciwgZXZlbnQsIDAsIDApOwogIG91dDoKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3ByaW50ay5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3ByaW50ay5jCmluZGV4IGViODE1NTYuLjliZWNlOTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9wcmludGsuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMKQEAgLTI0NSwxNyArMjQ1LDEzIEBACiBzdGF0aWMgX19pbml0IGludCBpbml0X3RyYWNlX3ByaW50a19mdW5jdGlvbl9leHBvcnQodm9pZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcjsKLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAogCWRfdHJhY2VyID0gdHJhY2luZ19pbml0X2RlbnRyeSgpOwogCWlmICghZF90cmFjZXIpCiAJCXJldHVybiAwOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJwcmludGtfZm9ybWF0cyIsIDA0NDQsIGRfdHJhY2VyLAorCXRyYWNlX2NyZWF0ZV9maWxlKCJwcmludGtfZm9ybWF0cyIsIDA0NDQsIGRfdHJhY2VyLAogCQkJCSAgICBOVUxMLCAmZnRyYWNlX2Zvcm1hdHNfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICIncHJpbnRrX2Zvcm1hdHMnIGVudHJ5XG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3N3aXRjaC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3N3aXRjaC5jCmluZGV4IDkxMTdjZWEuLmE5ODEwNmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF9zd2l0Y2guYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfc3dpdGNoLmMKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KLSNpbmNsdWRlIDx0cmFjZS9zY2hlZC5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zY2hlZC5oPgogCiAjaW5jbHVkZSAidHJhY2UuaCIKIApAQCAtMjksMTMgKzI5LDEzIEBACiAJaW50IGNwdTsKIAlpbnQgcGM7CiAKLQlpZiAoIXNjaGVkX3JlZiB8fCBzY2hlZF9zdG9wcGVkKQorCWlmICh1bmxpa2VseSghc2NoZWRfcmVmKSkKIAkJcmV0dXJuOwogCiAJdHJhY2luZ19yZWNvcmRfY21kbGluZShwcmV2KTsKIAl0cmFjaW5nX3JlY29yZF9jbWRsaW5lKG5leHQpOwogCi0JaWYgKCF0cmFjZXJfZW5hYmxlZCkKKwlpZiAoIXRyYWNlcl9lbmFibGVkIHx8IHNjaGVkX3N0b3BwZWQpCiAJCXJldHVybjsKIAogCXBjID0gcHJlZW1wdF9jb3VudCgpOwpAQCAtNTYsMTUgKzU2LDE1IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY3B1LCBwYzsKIAotCWlmICghbGlrZWx5KHRyYWNlcl9lbmFibGVkKSkKKwlpZiAodW5saWtlbHkoIXNjaGVkX3JlZikpCisJCXJldHVybjsKKworCXRyYWNpbmdfcmVjb3JkX2NtZGxpbmUoY3VycmVudCk7CisKKwlpZiAoIXRyYWNlcl9lbmFibGVkIHx8IHNjaGVkX3N0b3BwZWQpCiAJCXJldHVybjsKIAogCXBjID0gcHJlZW1wdF9jb3VudCgpOwotCXRyYWNpbmdfcmVjb3JkX2NtZGxpbmUoY3VycmVudCk7Ci0KLQlpZiAoc2NoZWRfc3RvcHBlZCkKLQkJcmV0dXJuOwotCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJZGF0YSA9IGN0eF90cmFjZS0+ZGF0YVtjcHVdOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3dha2V1cC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3dha2V1cC5jCmluZGV4IDViYzAwZThmLi5lYWNiMjcyIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3dha2V1cC5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+Ci0jaW5jbHVkZSA8dHJhY2Uvc2NoZWQuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2NoZWQuaD4KIAogI2luY2x1ZGUgInRyYWNlLmgiCiAKQEAgLTEzOCw5ICsxMzgsNiBAQAogCiAJcGMgPSBwcmVlbXB0X2NvdW50KCk7CiAKLQkvKiBUaGUgdGFzayB3ZSBhcmUgd2FpdGluZyBmb3IgaXMgd2FraW5nIHVwICovCi0JZGF0YSA9IHdha2V1cF90cmFjZS0+ZGF0YVt3YWtldXBfY3B1XTsKLQogCS8qIGRpc2FibGUgbG9jYWwgZGF0YSwgbm90IHdha2V1cF9jcHUgZGF0YSAqLwogCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJZGlzYWJsZWQgPSBhdG9taWNfaW5jX3JldHVybigmd2FrZXVwX3RyYWNlLT5kYXRhW2NwdV0tPmRpc2FibGVkKTsKQEAgLTE1NCw2ICsxNTEsOSBAQAogCWlmICh1bmxpa2VseSghdHJhY2VyX2VuYWJsZWQgfHwgbmV4dCAhPSB3YWtldXBfdGFzaykpCiAJCWdvdG8gb3V0X3VubG9jazsKIAorCS8qIFRoZSB0YXNrIHdlIGFyZSB3YWl0aW5nIGZvciBpcyB3YWtpbmcgdXAgKi8KKwlkYXRhID0gd2FrZXVwX3RyYWNlLT5kYXRhW3dha2V1cF9jcHVdOworCiAJdHJhY2VfZnVuY3Rpb24od2FrZXVwX3RyYWNlLCBDQUxMRVJfQUREUjAsIENBTExFUl9BRERSMSwgZmxhZ3MsIHBjKTsKIAl0cmFjaW5nX3NjaGVkX3N3aXRjaF90cmFjZSh3YWtldXBfdHJhY2UsIHByZXYsIG5leHQsIGZsYWdzLCBwYyk7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9zZWxmdGVzdC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3NlbGZ0ZXN0LmMKaW5kZXggMDhmNGViMi4uMDBkZDY0OCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3NlbGZ0ZXN0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3NlbGZ0ZXN0LmMKQEAgLTE2LDYgKzE2LDcgQEAKIAljYXNlIFRSQUNFX0JSQU5DSDoKIAljYXNlIFRSQUNFX0dSQVBIX0VOVDoKIAljYXNlIFRSQUNFX0dSQVBIX1JFVDoKKwljYXNlIFRSQUNFX0hXX0JSQU5DSEVTOgogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xODgsNiArMTg5LDcgQEAKICNlbHNlCiAjIGRlZmluZSB0cmFjZV9zZWxmdGVzdF9zdGFydHVwX2R5bmFtaWNfdHJhY2luZyh0cmFjZSwgdHIsIGZ1bmMpICh7IDA7IH0pCiAjZW5kaWYgLyogQ09ORklHX0RZTkFNSUNfRlRSQUNFICovCisKIC8qCiAgKiBTaW1wbGUgdmVyaWZpY2F0aW9uIHRlc3Qgb2YgZnRyYWNlIGZ1bmN0aW9uIHRyYWNlci4KICAqIEVuYWJsZSBmdHJhY2UsIHNsZWVwIDEvMTAgc2Vjb25kLCBhbmQgdGhlbiByZWFkIHRoZSB0cmFjZQpAQCAtNzQ5LDMgKzc1MSw1OSBAQAogCXJldHVybiByZXQ7CiB9CiAjZW5kaWYgLyogQ09ORklHX0JSQU5DSF9UUkFDRVIgKi8KKworI2lmZGVmIENPTkZJR19IV19CUkFOQ0hfVFJBQ0VSCitpbnQKK3RyYWNlX3NlbGZ0ZXN0X3N0YXJ0dXBfaHdfYnJhbmNoZXMoc3RydWN0IHRyYWNlciAqdHJhY2UsCisJCQkJICAgc3RydWN0IHRyYWNlX2FycmF5ICp0cikKK3sKKwlzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXI7CisJc3RydWN0IHRyYWNlciB0cmFjZXI7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwlpbnQgcmV0OworCisJaWYgKCF0cmFjZS0+b3BlbikgeworCQlwcmludGsoS0VSTl9DT05UICJtaXNzaW5nIG9wZW4gZnVuY3Rpb24uLi4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IHRyYWNlcl9pbml0KHRyYWNlLCB0cik7CisJaWYgKHJldCkgeworCQl3YXJuX2ZhaWxlZF9pbml0X3RyYWNlcih0cmFjZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFRoZSBody1icmFuY2ggdHJhY2VyIG5lZWRzIHRvIGNvbGxlY3QgdGhlIHRyYWNlIGZyb20gdGhlIHZhcmlvdXMKKwkgKiBjcHUgdHJhY2UgYnVmZmVycyAtIGJlZm9yZSB0cmFjaW5nIGlzIHN0b3BwZWQuCisJICovCisJaXRlciA9IGt6YWxsb2Moc2l6ZW9mKCppdGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpdGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweSgmdHJhY2VyLCB0cmFjZSwgc2l6ZW9mKHRyYWNlcikpOworCisJaXRlci0+dHJhY2UgPSAmdHJhY2VyOworCWl0ZXItPnRyID0gdHI7CisJaXRlci0+cG9zID0gLTE7CisJbXV0ZXhfaW5pdCgmaXRlci0+bXV0ZXgpOworCisJdHJhY2UtPm9wZW4oaXRlcik7CisKKwltdXRleF9kZXN0cm95KCZpdGVyLT5tdXRleCk7CisJa2ZyZWUoaXRlcik7CisKKwl0cmFjaW5nX3N0b3AoKTsKKworCXJldCA9IHRyYWNlX3Rlc3RfYnVmZmVyKHRyLCAmY291bnQpOworCXRyYWNlLT5yZXNldCh0cik7CisJdHJhY2luZ19zdGFydCgpOworCisJaWYgKCFyZXQgJiYgIWNvdW50KSB7CisJCXByaW50ayhLRVJOX0NPTlQgIm5vIGVudHJpZXMgZm91bmQuLiIpOworCQlyZXQgPSAtMTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19IV19CUkFOQ0hfVFJBQ0VSICovCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYyBiL2tlcm5lbC90cmFjZS90cmFjZV9zdGFjay5jCmluZGV4IGM3NTBmNjUuLjJkN2FlYmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zdGFjay5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zdGFjay5jCkBAIC0yNjUsNyArMjY1LDcgQEAKIAkJc2VxX3ByaW50ZihtLCAiICAgICAgICBEZXB0aCAgICBTaXplICAgTG9jYXRpb24iCiAJCQkgICAiICAgICglZCBlbnRyaWVzKVxuIgogCQkJICAgIiAgICAgICAgLS0tLS0gICAgLS0tLSAgIC0tLS0tLS0tXG4iLAotCQkJICAgbWF4X3N0YWNrX3RyYWNlLm5yX2VudHJpZXMpOworCQkJICAgbWF4X3N0YWNrX3RyYWNlLm5yX2VudHJpZXMgLSAxKTsKIAogCQlpZiAoIXN0YWNrX3RyYWNlcl9lbmFibGVkICYmICFtYXhfc3RhY2tfc2l6ZSkKIAkJCXByaW50X2Rpc2FibGVkKG0pOwpAQCAtMzUyLDE5ICszNTIsMTQgQEAKIHN0YXRpYyBfX2luaXQgaW50IHN0YWNrX3RyYWNlX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcjsKLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAogCWRfdHJhY2VyID0gdHJhY2luZ19pbml0X2RlbnRyeSgpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdGFja19tYXhfc2l6ZSIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICAmbWF4X3N0YWNrX3NpemUsICZzdGFja19tYXhfc2l6ZV9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ3N0YWNrX21heF9zaXplJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInN0YWNrX21heF9zaXplIiwgMDY0NCwgZF90cmFjZXIsCisJCQkmbWF4X3N0YWNrX3NpemUsICZzdGFja19tYXhfc2l6ZV9mb3BzKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3RhY2tfdHJhY2UiLCAwNDQ0LCBkX3RyYWNlciwKLQkJCQkgICAgTlVMTCwgJnN0YWNrX3RyYWNlX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnc3RhY2tfdHJhY2UnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgic3RhY2tfdHJhY2UiLCAwNDQ0LCBkX3RyYWNlciwKKwkJCU5VTEwsICZzdGFja190cmFjZV9mb3BzKTsKIAogCWlmIChzdGFja190cmFjZXJfZW5hYmxlZCkKIAkJcmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZ0cmFjZV9vcHMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YXQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9zdGF0LmMKaW5kZXggYWNkZWJkNy4uYzAwNjQzNyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YXQuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhdC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIEluZnJhc3RydWN0dXJlIGZvciBzdGF0aXN0aWMgdHJhY2luZyAoaGlzdG9ncmFtIG91dHB1dCkuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA4IEZyZWRlcmljIFdlaXNiZWNrZXIgPGZ3ZWlzYmVjQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEZyZWRlcmljIFdlaXNiZWNrZXIgPGZ3ZWlzYmVjQGdtYWlsLmNvbT4KICAqCiAgKiBCYXNlZCBvbiB0aGUgY29kZSBmcm9tIHRyYWNlX2JyYW5jaC5jIHdoaWNoIGlzCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDggU3RldmVuIFJvc3RlZHQgPHNyb3N0ZWR0QHJlZGhhdC5jb20+CkBAIC0xMCwyMiArMTAsMjcgQEAKIAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlICJ0cmFjZV9zdGF0LmgiCiAjaW5jbHVkZSAidHJhY2UuaCIKIAogCi0vKiBMaXN0IG9mIHN0YXQgZW50cmllcyBmcm9tIGEgdHJhY2VyICovCi1zdHJ1Y3QgdHJhY2Vfc3RhdF9saXN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisvKgorICogTGlzdCBvZiBzdGF0IHJlZC1ibGFjayBub2RlcyBmcm9tIGEgdHJhY2VyCisgKiBXZSB1c2UgYSBzdWNoIHRyZWUgdG8gc29ydCBxdWlja2x5IHRoZSBzdGF0CisgKiBlbnRyaWVzIGZyb20gdGhlIHRyYWNlci4KKyAqLworc3RydWN0IHN0YXRfbm9kZSB7CisJc3RydWN0IHJiX25vZGUJCW5vZGU7CiAJdm9pZAkJCSpzdGF0OwogfTsKIAogLyogQSBzdGF0IHNlc3Npb24gaXMgdGhlIHN0YXRzIG91dHB1dCBpbiBvbmUgZmlsZSAqLwotc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24geworc3RydWN0IHN0YXRfc2Vzc2lvbiB7CiAJc3RydWN0IGxpc3RfaGVhZAlzZXNzaW9uX2xpc3Q7CiAJc3RydWN0IHRyYWNlcl9zdGF0CSp0czsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXN0YXRfbGlzdDsKKwlzdHJ1Y3QgcmJfcm9vdAkJc3RhdF9yb290OwogCXN0cnVjdCBtdXRleAkJc3RhdF9tdXRleDsKIAlzdHJ1Y3QgZGVudHJ5CQkqZmlsZTsKIH07CkBAIC0zNywxOCArNDIsNDggQEAKIC8qIFRoZSByb290IGRpcmVjdG9yeSBmb3IgYWxsIHN0YXQgZmlsZXMgKi8KIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5CQkqc3RhdF9kaXI7CiAKLQotc3RhdGljIHZvaWQgcmVzZXRfc3RhdF9zZXNzaW9uKHN0cnVjdCB0cmFjZXJfc3RhdF9zZXNzaW9uICpzZXNzaW9uKQorLyoKKyAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcmJ0cmVlIHVzaW5nIGEgcG9zdCBvcmRlciB0cmF2ZXJzYWwgcGF0aAorICogdG8gcmVsZWFzZSB0aGUgbmV4dCBub2RlLgorICogSXQgd29uJ3QgbmVjZXNzYXJ5IHJlbGVhc2Ugb25lIGF0IGVhY2ggaXRlcmF0aW9uCisgKiBidXQgaXQgd2lsbCBhdCBsZWFzdCBhZHZhbmNlIGNsb3NlciB0byB0aGUgbmV4dCBvbmUKKyAqIHRvIGJlIHJlbGVhc2VkLgorICovCitzdGF0aWMgc3RydWN0IHJiX25vZGUgKnJlbGVhc2VfbmV4dChzdHJ1Y3QgcmJfbm9kZSAqbm9kZSkKIHsKLQlzdHJ1Y3QgdHJhY2Vfc3RhdF9saXN0ICpub2RlLCAqbmV4dDsKKwlzdHJ1Y3Qgc3RhdF9ub2RlICpzbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIG5leHQsICZzZXNzaW9uLT5zdGF0X2xpc3QsIGxpc3QpCi0JCWtmcmVlKG5vZGUpOworCWlmIChub2RlLT5yYl9sZWZ0KQorCQlyZXR1cm4gbm9kZS0+cmJfbGVmdDsKKwllbHNlIGlmIChub2RlLT5yYl9yaWdodCkKKwkJcmV0dXJuIG5vZGUtPnJiX3JpZ2h0OworCWVsc2UgeworCQlpZiAoIXBhcmVudCkKKwkJCTsKKwkJZWxzZSBpZiAocGFyZW50LT5yYl9sZWZ0ID09IG5vZGUpCisJCQlwYXJlbnQtPnJiX2xlZnQgPSBOVUxMOworCQllbHNlCisJCQlwYXJlbnQtPnJiX3JpZ2h0ID0gTlVMTDsKIAotCUlOSVRfTElTVF9IRUFEKCZzZXNzaW9uLT5zdGF0X2xpc3QpOworCQlzbm9kZSA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3Qgc3RhdF9ub2RlLCBub2RlKTsKKwkJa2ZyZWUoc25vZGUpOworCisJCXJldHVybiBwYXJlbnQ7CisJfQogfQogCi1zdGF0aWMgdm9pZCBkZXN0cm95X3Nlc3Npb24oc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24pCitzdGF0aWMgdm9pZCByZXNldF9zdGF0X3Nlc3Npb24oc3RydWN0IHN0YXRfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHNlc3Npb24tPnN0YXRfcm9vdC5yYl9ub2RlOworCisJd2hpbGUgKG5vZGUpCisJCW5vZGUgPSByZWxlYXNlX25leHQobm9kZSk7CisKKwlzZXNzaW9uLT5zdGF0X3Jvb3QgPSBSQl9ST09UOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3Nlc3Npb24oc3RydWN0IHN0YXRfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAlkZWJ1Z2ZzX3JlbW92ZShzZXNzaW9uLT5maWxlKTsKIAlyZXNldF9zdGF0X3Nlc3Npb24oc2Vzc2lvbik7CkBAIC01NiwyNSArOTEsNjAgQEAKIAlrZnJlZShzZXNzaW9uKTsKIH0KIAotLyoKLSAqIEZvciB0cmFjZXJzIHRoYXQgZG9uJ3QgcHJvdmlkZSBhIHN0YXRfY21wIGNhbGxiYWNrLgotICogVGhpcyBvbmUgd2lsbCBmb3JjZSBhbiBpbW1lZGlhdGUgaW5zZXJ0aW9uIG9uIHRhaWwgb2YKLSAqIHRoZSBsaXN0LgotICovCi1zdGF0aWMgaW50IGR1bW15X2NtcCh2b2lkICpwMSwgdm9pZCAqcDIpCit0eXBlZGVmIGludCAoKmNtcF9zdGF0X3QpKHZvaWQgKiwgdm9pZCAqKTsKKworc3RhdGljIGludCBpbnNlcnRfc3RhdChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdm9pZCAqc3RhdCwgY21wX3N0YXRfdCBjbXApCiB7Ci0JcmV0dXJuIDE7CisJc3RydWN0IHJiX25vZGUgKipuZXcgPSAmKHJvb3QtPnJiX25vZGUpLCAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdF9ub2RlICpkYXRhOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkYXRhLT5zdGF0ID0gc3RhdDsKKworCS8qCisJICogRmlndXJlIG91dCB3aGVyZSB0byBwdXQgbmV3IG5vZGUKKwkgKiBUaGlzIGlzIGEgZGVzY2VuZGVudCBzb3J0aW5nCisJICovCisJd2hpbGUgKCpuZXcpIHsKKwkJc3RydWN0IHN0YXRfbm9kZSAqdGhpczsKKwkJaW50IHJlc3VsdDsKKworCQl0aGlzID0gY29udGFpbmVyX29mKCpuZXcsIHN0cnVjdCBzdGF0X25vZGUsIG5vZGUpOworCQlyZXN1bHQgPSBjbXAoZGF0YS0+c3RhdCwgdGhpcy0+c3RhdCk7CisKKwkJcGFyZW50ID0gKm5ldzsKKwkJaWYgKHJlc3VsdCA+PSAwKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX2xlZnQpOworCQllbHNlCisJCQluZXcgPSAmKCgqbmV3KS0+cmJfcmlnaHQpOworCX0KKworCXJiX2xpbmtfbm9kZSgmZGF0YS0+bm9kZSwgcGFyZW50LCBuZXcpOworCXJiX2luc2VydF9jb2xvcigmZGF0YS0+bm9kZSwgcm9vdCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCi0gKiBJbml0aWFsaXplIHRoZSBzdGF0IGxpc3QgYXQgZWFjaCB0cmFjZV9zdGF0IGZpbGUgb3BlbmluZy4KKyAqIEZvciB0cmFjZXJzIHRoYXQgZG9uJ3QgcHJvdmlkZSBhIHN0YXRfY21wIGNhbGxiYWNrLgorICogVGhpcyBvbmUgd2lsbCBmb3JjZSBhbiBpbnNlcnRpb24gYXMgcmlnaHQtbW9zdCBub2RlCisgKiBpbiB0aGUgcmJ0cmVlLgorICovCitzdGF0aWMgaW50IGR1bW15X2NtcCh2b2lkICpwMSwgdm9pZCAqcDIpCit7CisJcmV0dXJuIC0xOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc3RhdCByYnRyZWUgYXQgZWFjaCB0cmFjZV9zdGF0IGZpbGUgb3BlbmluZy4KICAqIEFsbCBvZiB0aGVzZSBjb3BpZXMgYW5kIHNvcnRpbmcgYXJlIHJlcXVpcmVkIG9uIGFsbCBvcGVuaW5nCiAgKiBzaW5jZSB0aGUgc3RhdHMgY291bGQgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdHdvIGZpbGUgc2Vzc2lvbnMuCiAgKi8KLXN0YXRpYyBpbnQgc3RhdF9zZXFfaW5pdChzdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiAqc2Vzc2lvbikKK3N0YXRpYyBpbnQgc3RhdF9zZXFfaW5pdChzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uKQogewotCXN0cnVjdCB0cmFjZV9zdGF0X2xpc3QgKml0ZXJfZW50cnksICpuZXdfZW50cnk7CiAJc3RydWN0IHRyYWNlcl9zdGF0ICp0cyA9IHNlc3Npb24tPnRzOworCXN0cnVjdCByYl9yb290ICpyb290ID0gJnNlc3Npb24tPnN0YXRfcm9vdDsKIAl2b2lkICpzdGF0OwogCWludCByZXQgPSAwOwogCWludCBpOwpAQCAtODUsMjkgKzE1NSwxNiBAQAogCWlmICghdHMtPnN0YXRfY21wKQogCQl0cy0+c3RhdF9jbXAgPSBkdW1teV9jbXA7CiAKLQlzdGF0ID0gdHMtPnN0YXRfc3RhcnQoKTsKKwlzdGF0ID0gdHMtPnN0YXRfc3RhcnQodHMpOwogCWlmICghc3RhdCkKIAkJZ290byBleGl0OwogCi0JLyoKLQkgKiBUaGUgZmlyc3QgZW50cnkuIEFjdHVhbGx5IHRoaXMgaXMgdGhlIHNlY29uZCwgYnV0IHRoZSBmaXJzdAotCSAqIG9uZSAodGhlIHN0YXRfbGlzdCBoZWFkKSBpcyBwb2ludGxlc3MuCi0JICovCi0JbmV3X2VudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRyYWNlX3N0YXRfbGlzdCksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X2VudHJ5KSB7Ci0JCXJldCA9IC1FTk9NRU07CisJcmV0ID0gaW5zZXJ0X3N0YXQocm9vdCwgc3RhdCwgdHMtPnN0YXRfY21wKTsKKwlpZiAocmV0KQogCQlnb3RvIGV4aXQ7Ci0JfQotCi0JSU5JVF9MSVNUX0hFQUQoJm5ld19lbnRyeS0+bGlzdCk7Ci0KLQlsaXN0X2FkZCgmbmV3X2VudHJ5LT5saXN0LCAmc2Vzc2lvbi0+c3RhdF9saXN0KTsKLQotCW5ld19lbnRyeS0+c3RhdCA9IHN0YXQ7CiAKIAkvKgotCSAqIEl0ZXJhdGUgb3ZlciB0aGUgdHJhY2VyIHN0YXQgZW50cmllcyBhbmQgc3RvcmUgdGhlbSBpbiBhIHNvcnRlZAotCSAqIGxpc3QuCisJICogSXRlcmF0ZSBvdmVyIHRoZSB0cmFjZXIgc3RhdCBlbnRyaWVzIGFuZCBzdG9yZSB0aGVtIGluIGFuIHJidHJlZS4KIAkgKi8KIAlmb3IgKGkgPSAxOyA7IGkrKykgewogCQlzdGF0ID0gdHMtPnN0YXRfbmV4dChzdGF0LCBpKTsKQEAgLTExNiwzNiArMTczLDE2IEBACiAJCWlmICghc3RhdCkKIAkJCWJyZWFrOwogCi0JCW5ld19lbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0cmFjZV9zdGF0X2xpc3QpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXdfZW50cnkpIHsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCQlnb3RvIGV4aXRfZnJlZV9saXN0OwotCQl9Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJm5ld19lbnRyeS0+bGlzdCk7Ci0JCW5ld19lbnRyeS0+c3RhdCA9IHN0YXQ7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGl0ZXJfZW50cnksICZzZXNzaW9uLT5zdGF0X2xpc3QsCi0JCQkJbGlzdCkgewotCi0JCQkvKiBJbnNlcnRpb24gd2l0aCBhIGRlc2NlbmRlbnQgc29ydGluZyAqLwotCQkJaWYgKHRzLT5zdGF0X2NtcChpdGVyX2VudHJ5LT5zdGF0LAotCQkJCQluZXdfZW50cnktPnN0YXQpID49IDApIHsKLQotCQkJCWxpc3RfYWRkKCZuZXdfZW50cnktPmxpc3QsICZpdGVyX2VudHJ5LT5saXN0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8qIFRoZSBjdXJyZW50IGxhcmdlciB2YWx1ZSAqLwotCQlpZiAobGlzdF9lbXB0eSgmbmV3X2VudHJ5LT5saXN0KSkKLQkJCWxpc3RfYWRkKCZuZXdfZW50cnktPmxpc3QsICZzZXNzaW9uLT5zdGF0X2xpc3QpOworCQlyZXQgPSBpbnNlcnRfc3RhdChyb290LCBzdGF0LCB0cy0+c3RhdF9jbXApOworCQlpZiAocmV0KQorCQkJZ290byBleGl0X2ZyZWVfcmJ0cmVlOwogCX0KKwogZXhpdDoKIAltdXRleF91bmxvY2soJnNlc3Npb24tPnN0YXRfbXV0ZXgpOwogCXJldHVybiByZXQ7CiAKLWV4aXRfZnJlZV9saXN0OgorZXhpdF9mcmVlX3JidHJlZToKIAlyZXNldF9zdGF0X3Nlc3Npb24oc2Vzc2lvbik7CiAJbXV0ZXhfdW5sb2NrKCZzZXNzaW9uLT5zdGF0X211dGV4KTsKIAlyZXR1cm4gcmV0OwpAQCAtMTU0LDM4ICsxOTEsNTEgQEAKIAogc3RhdGljIHZvaWQgKnN0YXRfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcywgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBzLT5wcml2YXRlOworCXN0cnVjdCBzdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBzLT5wcml2YXRlOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCWludCBpOwogCi0JLyogUHJldmVudCBmcm9tIHRyYWNlciBzd2l0Y2ggb3Igc3RhdF9saXN0IG1vZGlmaWNhdGlvbiAqLworCS8qIFByZXZlbnQgZnJvbSB0cmFjZXIgc3dpdGNoIG9yIHJidHJlZSBtb2RpZmljYXRpb24gKi8KIAltdXRleF9sb2NrKCZzZXNzaW9uLT5zdGF0X211dGV4KTsKIAogCS8qIElmIHdlIGFyZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBwcmludCB0aGUgaGVhZGVycyAqLwotCWlmICghKnBvcyAmJiBzZXNzaW9uLT50cy0+c3RhdF9oZWFkZXJzKQorCWlmICghKnBvcyAmJiBzZXNzaW9uLT50cy0+c3RhdF9oZWFkZXJzKSB7CisJCSgqcG9zKSsrOwogCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOworCX0KIAotCXJldHVybiBzZXFfbGlzdF9zdGFydCgmc2Vzc2lvbi0+c3RhdF9saXN0LCAqcG9zKTsKKwlub2RlID0gcmJfZmlyc3QoJnNlc3Npb24tPnN0YXRfcm9vdCk7CisJZm9yIChpID0gMDsgbm9kZSAmJiBpIDwgKnBvczsgaSsrKQorCQlub2RlID0gcmJfbmV4dChub2RlKTsKKworCSgqcG9zKSsrOworCisJcmV0dXJuIG5vZGU7CiB9CiAKIHN0YXRpYyB2b2lkICpzdGF0X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBzLT5wcml2YXRlOworCXN0cnVjdCBzdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBzLT5wcml2YXRlOworCXN0cnVjdCByYl9ub2RlICpub2RlID0gcDsKKworCSgqcG9zKSsrOwogCiAJaWYgKHAgPT0gU0VRX1NUQVJUX1RPS0VOKQotCQlyZXR1cm4gc2VxX2xpc3Rfc3RhcnQoJnNlc3Npb24tPnN0YXRfbGlzdCwgKnBvcyk7CisJCXJldHVybiByYl9maXJzdCgmc2Vzc2lvbi0+c3RhdF9yb290KTsKIAotCXJldHVybiBzZXFfbGlzdF9uZXh0KHAsICZzZXNzaW9uLT5zdGF0X2xpc3QsIHBvcyk7CisJcmV0dXJuIHJiX25leHQobm9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHN0YXRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewotCXN0cnVjdCB0cmFjZXJfc3RhdF9zZXNzaW9uICpzZXNzaW9uID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uID0gcy0+cHJpdmF0ZTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPnN0YXRfbXV0ZXgpOwogfQogCiBzdGF0aWMgaW50IHN0YXRfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQogewotCXN0cnVjdCB0cmFjZXJfc3RhdF9zZXNzaW9uICpzZXNzaW9uID0gcy0+cHJpdmF0ZTsKLQlzdHJ1Y3QgdHJhY2Vfc3RhdF9saXN0ICpsID0gbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgdHJhY2Vfc3RhdF9saXN0LCBsaXN0KTsKKwlzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uID0gcy0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc3RhdF9ub2RlICpsID0gY29udGFpbmVyX29mKHYsIHN0cnVjdCBzdGF0X25vZGUsIG5vZGUpOwogCiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKQogCQlyZXR1cm4gc2Vzc2lvbi0+dHMtPnN0YXRfaGVhZGVycyhzKTsKQEAgLTIwNSw3ICsyNTUsNyBAQAogewogCWludCByZXQ7CiAKLQlzdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlub2RlLT5pX3ByaXZhdGU7CisJc3RydWN0IHN0YXRfc2Vzc2lvbiAqc2Vzc2lvbiA9IGlub2RlLT5pX3ByaXZhdGU7CiAKIAlyZXQgPSBzZXFfb3BlbihmaWxlLCAmdHJhY2Vfc3RhdF9zZXFfb3BzKTsKIAlpZiAoIXJldCkgewpAQCAtMjE4LDExICsyNjgsMTEgQEAKIH0KIAogLyoKLSAqIEF2b2lkIGNvbnN1bWluZyBtZW1vcnkgd2l0aCBvdXIgbm93IHVzZWxlc3MgbGlzdC4KKyAqIEF2b2lkIGNvbnN1bWluZyBtZW1vcnkgd2l0aCBvdXIgbm93IHVzZWxlc3MgcmJ0cmVlLgogICovCiBzdGF0aWMgaW50IHRyYWNpbmdfc3RhdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpCiB7Ci0Jc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBpLT5pX3ByaXZhdGU7CisJc3RydWN0IHN0YXRfc2Vzc2lvbiAqc2Vzc2lvbiA9IGktPmlfcHJpdmF0ZTsKIAogCW11dGV4X2xvY2soJnNlc3Npb24tPnN0YXRfbXV0ZXgpOwogCXJlc2V0X3N0YXRfc2Vzc2lvbihzZXNzaW9uKTsKQEAgLTI1MSw3ICszMDEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGluaXRfc3RhdF9maWxlKHN0cnVjdCB0cmFjZXJfc3RhdF9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIGludCBpbml0X3N0YXRfZmlsZShzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uKQogewogCWlmICghc3RhdF9kaXIgJiYgdHJhY2luZ19zdGF0X2luaXQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yNjYsNyArMzE2LDcgQEAKIAogaW50IHJlZ2lzdGVyX3N0YXRfdHJhY2VyKHN0cnVjdCB0cmFjZXJfc3RhdCAqdHJhY2UpCiB7Ci0Jc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24sICpub2RlLCAqdG1wOworCXN0cnVjdCBzdGF0X3Nlc3Npb24gKnNlc3Npb24sICpub2RlOwogCWludCByZXQ7CiAKIAlpZiAoIXRyYWNlKQpAQCAtMjc3LDcgKzMyNyw3IEBACiAKIAkvKiBBbHJlYWR5IHJlZ2lzdGVyZWQ/ICovCiAJbXV0ZXhfbG9jaygmYWxsX3N0YXRfc2Vzc2lvbnNfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCB0bXAsICZhbGxfc3RhdF9zZXNzaW9ucywgc2Vzc2lvbl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmYWxsX3N0YXRfc2Vzc2lvbnMsIHNlc3Npb25fbGlzdCkgewogCQlpZiAobm9kZS0+dHMgPT0gdHJhY2UpIHsKIAkJCW11dGV4X3VubG9jaygmYWxsX3N0YXRfc2Vzc2lvbnNfbXV0ZXgpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yODYsMTUgKzMzNiwxMyBAQAogCW11dGV4X3VubG9jaygmYWxsX3N0YXRfc2Vzc2lvbnNfbXV0ZXgpOwogCiAJLyogSW5pdCB0aGUgc2Vzc2lvbiAqLwotCXNlc3Npb24gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiksIEdGUF9LRVJORUwpOworCXNlc3Npb24gPSBremFsbG9jKHNpemVvZigqc2Vzc2lvbiksIEdGUF9LRVJORUwpOwogCWlmICghc2Vzc2lvbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzZXNzaW9uLT50cyA9IHRyYWNlOwogCUlOSVRfTElTVF9IRUFEKCZzZXNzaW9uLT5zZXNzaW9uX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZzZXNzaW9uLT5zdGF0X2xpc3QpOwogCW11dGV4X2luaXQoJnNlc3Npb24tPnN0YXRfbXV0ZXgpOwotCXNlc3Npb24tPmZpbGUgPSBOVUxMOwogCiAJcmV0ID0gaW5pdF9zdGF0X2ZpbGUoc2Vzc2lvbik7CiAJaWYgKHJldCkgewpAQCAtMzEyLDcgKzM2MCw3IEBACiAKIHZvaWQgdW5yZWdpc3Rlcl9zdGF0X3RyYWNlcihzdHJ1Y3QgdHJhY2VyX3N0YXQgKnRyYWNlKQogewotCXN0cnVjdCB0cmFjZXJfc3RhdF9zZXNzaW9uICpub2RlLCAqdG1wOworCXN0cnVjdCBzdGF0X3Nlc3Npb24gKm5vZGUsICp0bXA7CiAKIAltdXRleF9sb2NrKCZhbGxfc3RhdF9zZXNzaW9uc19tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIHRtcCwgJmFsbF9zdGF0X3Nlc3Npb25zLCBzZXNzaW9uX2xpc3QpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9zdGF0LmggYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhdC5oCmluZGV4IDIwMjI3NGMuLmYzNTQ2YTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zdGF0LmgKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3N0YXQuaApAQCAtMTIsNyArMTIsNyBAQAogCS8qIFRoZSBuYW1lIG9mIHlvdXIgc3RhdCBmaWxlICovCiAJY29uc3QgY2hhcgkJKm5hbWU7CiAJLyogSXRlcmF0aW9uIG92ZXIgc3RhdGlzdGljIGVudHJpZXMgKi8KLQl2b2lkCQkJKigqc3RhdF9zdGFydCkodm9pZCk7CisJdm9pZAkJCSooKnN0YXRfc3RhcnQpKHN0cnVjdCB0cmFjZXJfc3RhdCAqdHJhY2UpOwogCXZvaWQJCQkqKCpzdGF0X25leHQpKHZvaWQgKnByZXYsIGludCBpZHgpOwogCS8qIENvbXBhcmUgdHdvIGVudHJpZXMgZm9yIHN0YXRzIHNvcnRpbmcgKi8KIAlpbnQJCQkoKnN0YXRfY21wKSh2b2lkICpwMSwgdm9pZCAqcDIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N5c3Byb2YuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9zeXNwcm9mLmMKaW5kZXggOTFmZDE5Yy4uZTA0Yjc2YyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3N5c3Byb2YuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzcHJvZi5jCkBAIC0zMjEsMTEgKzMyMSw3IEBACiAKIHZvaWQgaW5pdF90cmFjZXJfc3lzcHJvZl9kZWJ1Z2ZzKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKQogewotCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzeXNwcm9mX3NhbXBsZV9wZXJpb2QiLCAwNjQ0LAorCXRyYWNlX2NyZWF0ZV9maWxlKCJzeXNwcm9mX3NhbXBsZV9wZXJpb2QiLCAwNjQ0LAogCQkJZF90cmFjZXIsIE5VTEwsICZzeXNwcm9mX3NhbXBsZV9mb3BzKTsKLQlpZiAoZW50cnkpCi0JCXJldHVybjsKLQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ3N5c3Byb2Zfc2FtcGxlX3BlcmlvZCcgZW50cnlcbiIpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3dvcmtxdWV1ZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3dvcmtxdWV1ZS5jCmluZGV4IDc5NzIwMWUuLjk3ZmNlYTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV93b3JrcXVldWUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfd29ya3F1ZXVlLmMKQEAgLTYsNyArNiw3IEBACiAgKi8KIAogCi0jaW5jbHVkZSA8dHJhY2Uvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlICJ0cmFjZV9zdGF0LmgiCkBAIC0xNiw4ICsxNiw2IEBACiAvKiBBIGNwdSB3b3JrcXVldWUgdGhyZWFkICovCiBzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdGF0cyB7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgIGxpc3Q7Ci0vKiBVc2VmdWwgdG8ga25vdyBpZiB3ZSBwcmludCB0aGUgY3B1IGhlYWRlcnMgKi8KLQlib29sCQkgICAgICAgICAgICBmaXJzdF9lbnRyeTsKIAlpbnQJCSAgICAgICAgICAgIGNwdTsKIAlwaWRfdAkJCSAgICBwaWQ7CiAvKiBDYW4gYmUgaW5zZXJ0ZWQgZnJvbSBpbnRlcnJ1cHQgb3IgdXNlciBjb250ZXh0LCBuZWVkIHRvIGJlIGF0b21pYyAqLwpAQCAtNDcsMTIgKzQ1LDExIEBACiAJCQkgIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpbnQgY3B1ID0gY3B1bWFza19maXJzdCgmd3FfdGhyZWFkLT5jcHVzX2FsbG93ZWQpOwotCXN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0YXRzICpub2RlLCAqbmV4dDsKKwlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdGF0cyAqbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIG5leHQsICZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bGlzdCwKLQkJCQkJCQlsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmd29ya3F1ZXVlX2NwdV9zdGF0KGNwdSktPmxpc3QsIGxpc3QpIHsKIAkJaWYgKG5vZGUtPnBpZCA9PSB3cV90aHJlYWQtPnBpZCkgewogCQkJYXRvbWljX2luYygmbm9kZS0+aW5zZXJ0ZWQpOwogCQkJZ290byBmb3VuZDsKQEAgLTY5LDEyICs2NiwxMSBAQAogCQkJICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJaW50IGNwdSA9IGNwdW1hc2tfZmlyc3QoJndxX3RocmVhZC0+Y3B1c19hbGxvd2VkKTsKLQlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdGF0cyAqbm9kZSwgKm5leHQ7CisJc3RydWN0IGNwdV93b3JrcXVldWVfc3RhdHMgKm5vZGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bG9jaywgZmxhZ3MpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCBuZXh0LCAmd29ya3F1ZXVlX2NwdV9zdGF0KGNwdSktPmxpc3QsCi0JCQkJCQkJbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkobm9kZSwgJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5saXN0LCBsaXN0KSB7CiAJCWlmIChub2RlLT5waWQgPT0gd3FfdGhyZWFkLT5waWQpIHsKIAkJCW5vZGUtPmV4ZWN1dGVkKys7CiAJCQlnb3RvIGZvdW5kOwpAQCAtMTA1LDggKzEwMSw2IEBACiAJY3dzLT5waWQgPSB3cV90aHJlYWQtPnBpZDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bG9jaywgZmxhZ3MpOwotCWlmIChsaXN0X2VtcHR5KCZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bGlzdCkpCi0JCWN3cy0+Zmlyc3RfZW50cnkgPSB0cnVlOwogCWxpc3RfYWRkX3RhaWwoJmN3cy0+bGlzdCwgJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bG9jaywgZmxhZ3MpOwogfQpAQCAtMTUyLDcgKzE0Niw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgKndvcmtxdWV1ZV9zdGF0X3N0YXJ0KHZvaWQpCitzdGF0aWMgdm9pZCAqd29ya3F1ZXVlX3N0YXRfc3RhcnQoc3RydWN0IHRyYWNlcl9zdGF0ICp0cmFjZSkKIHsKIAlpbnQgY3B1OwogCXZvaWQgKnJldCA9IE5VTEw7CkBAIC0xOTEsMTYgKzE4NSw5IEBACiBzdGF0aWMgaW50IHdvcmtxdWV1ZV9zdGF0X3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewogCXN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0YXRzICpjd3MgPSBwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGNwdSA9IGN3cy0+Y3B1OwogCXN0cnVjdCBwaWQgKnBpZDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bG9jaywgZmxhZ3MpOwotCWlmICgmY3dzLT5saXN0ID09IHdvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5saXN0Lm5leHQpCi0JCXNlcV9wcmludGYocywgIlxuIik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29ya3F1ZXVlX2NwdV9zdGF0KGNwdSktPmxvY2ssIGZsYWdzKTsKLQogCXBpZCA9IGZpbmRfZ2V0X3BpZChjd3MtPnBpZCk7CiAJaWYgKHBpZCkgewogCQl0c2sgPSBnZXRfcGlkX3Rhc2socGlkLCBQSURUWVBFX1BJRCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvd2FpdC5jIGIva2VybmVsL3dhaXQuYwppbmRleCA0MmEyZGJjLi5lYTdjM2I0IDEwMDY0NAotLS0gYS9rZXJuZWwvd2FpdC5jCisrKyBiL2tlcm5lbC93YWl0LmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogCWlmICghbGlzdF9lbXB0eSgmd2FpdC0+dGFza19saXN0KSkKIAkJbGlzdF9kZWxfaW5pdCgmd2FpdC0+dGFza19saXN0KTsKIAllbHNlIGlmICh3YWl0cXVldWVfYWN0aXZlKHEpKQotCQlfX3dha2VfdXBfY29tbW9uKHEsIG1vZGUsIDEsIDAsIGtleSk7CisJCV9fd2FrZV91cF9sb2NrZWRfa2V5KHEsIG1vZGUsIGtleSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTChhYm9ydF9leGNsdXNpdmVfd2FpdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggZjcxZmIyYS4uMDY2ODc5NSAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtMzMsNyArMzMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KICNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+Ci0jaW5jbHVkZSA8dHJhY2Uvd29ya3F1ZXVlLmg+CisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvd29ya3F1ZXVlLmg+CiAKIC8qCiAgKiBUaGUgcGVyLUNQVSB3b3JrcXVldWUgKGlmIHNpbmdsZSB0aHJlYWQsIHdlIGFsd2F5cyB1c2UgdGhlIGZpcnN0CkBAIC0xMjQsOCArMTI1LDYgQEAKIAlyZXR1cm4gKHZvaWQgKikgKGF0b21pY19sb25nX3JlYWQoJndvcmstPmRhdGEpICYgV09SS19TVFJVQ1RfV1FfREFUQV9NQVNLKTsKIH0KIAotREVGSU5FX1RSQUNFKHdvcmtxdWV1ZV9pbnNlcnRpb24pOwotCiBzdGF0aWMgdm9pZCBpbnNlcnRfd29yayhzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSwKIAkJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaywgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKQEAgLTI2Miw4ICsyNjEsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocXVldWVfZGVsYXllZF93b3JrX29uKTsKIAotREVGSU5FX1RSQUNFKHdvcmtxdWV1ZV9leGVjdXRpb24pOwotCiBzdGF0aWMgdm9pZCBydW5fd29ya3F1ZXVlKHN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCAqY3dxKQogewogCXNwaW5fbG9ja19pcnEoJmN3cS0+bG9jayk7CkBAIC03NTMsOCArNzUwLDYgQEAKIAlyZXR1cm4gY3dxOwogfQogCi1ERUZJTkVfVFJBQ0Uod29ya3F1ZXVlX2NyZWF0aW9uKTsKLQogc3RhdGljIGludCBjcmVhdGVfd29ya3F1ZXVlX3RocmVhZChzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSwgaW50IGNwdSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPLTEgfTsKQEAgLTg2MCw4ICs4NTUsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19jcmVhdGVfd29ya3F1ZXVlX2tleSk7CiAKLURFRklORV9UUkFDRSh3b3JrcXVldWVfZGVzdHJ1Y3Rpb24pOwotCiBzdGF0aWMgdm9pZCBjbGVhbnVwX3dvcmtxdWV1ZV90aHJlYWQoc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3EpCiB7CiAJLyoKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnIGIvbGliL0tjb25maWcKaW5kZXggOGFkZTBhNy4uOTk2MGJlMCAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcKKysrIGIvbGliL0tjb25maWcKQEAgLTEwLDYgKzEwLDkgQEAKIGNvbmZpZyBCSVRSRVZFUlNFCiAJdHJpc3RhdGUKIAorY29uZmlnIFJBVElPTkFMCisJYm9vbGVhbgorCiBjb25maWcgR0VORVJJQ19GSU5EX0ZJUlNUX0JJVAogCWJvb2wKIApkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCA2Y2RjZjM4Li4xMTZhMzUwIDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMzM2LDYgKzMzNiwzOCBAQAogCSAgb3V0IHdoaWNoIHNsYWJzIGFyZSByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgbG9hZC4KIAkgIFRyeSBydW5uaW5nOiBzbGFiaW5mbyAtREEKIAorY29uZmlnIERFQlVHX0tNRU1MRUFLCisJYm9vbCAiS2VybmVsIG1lbW9yeSBsZWFrIGRldGVjdG9yIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIEVYUEVSSU1FTlRBTCAmJiAoWDg2IHx8IEFSTSkgJiYgXAorCQkhTUVNT1JZX0hPVFBMVUcKKwlzZWxlY3QgREVCVUdfU0xBQiBpZiBTTEFCCisJc2VsZWN0IFNMVUJfREVCVUcgaWYgU0xVQgorCXNlbGVjdCBERUJVR19GUyBpZiBTWVNGUworCXNlbGVjdCBTVEFDS1RSQUNFIGlmIFNUQUNLVFJBQ0VfU1VQUE9SVAorCXNlbGVjdCBLQUxMU1lNUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSBtZW1vcnkgbGVhaworCSAgZGV0ZWN0b3IuIFRoZSBtZW1vcnkgYWxsb2NhdGlvbi9mcmVlaW5nIGlzIHRyYWNlZCBpbiBhIHdheQorCSAgc2ltaWxhciB0byB0aGUgQm9laG0ncyBjb25zZXJ2YXRpdmUgZ2FyYmFnZSBjb2xsZWN0b3IsIHRoZQorCSAgZGlmZmVyZW5jZSBiZWluZyB0aGF0IHRoZSBvcnBoYW4gb2JqZWN0cyBhcmUgbm90IGZyZWVkIGJ1dAorCSAgb25seSBzaG93biBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhay4gRW5hYmxpbmcgdGhpcworCSAgZmVhdHVyZSB3aWxsIGludHJvZHVjZSBhbiBvdmVyaGVhZCB0byBtZW1vcnkKKwkgIGFsbG9jYXRpb25zLiBTZWUgRG9jdW1lbnRhdGlvbi9rbWVtbGVhay50eHQgZm9yIG1vcmUKKwkgIGRldGFpbHMuCisKKwkgIEluIG9yZGVyIHRvIGFjY2VzcyB0aGUga21lbWxlYWsgZmlsZSwgZGVidWdmcyBuZWVkcyB0byBiZQorCSAgbW91bnRlZCAodXN1YWxseSBhdCAvc3lzL2tlcm5lbC9kZWJ1ZykuCisKK2NvbmZpZyBERUJVR19LTUVNTEVBS19URVNUCisJdHJpc3RhdGUgIlNpbXBsZSB0ZXN0IGZvciB0aGUga2VybmVsIG1lbW9yeSBsZWFrIGRldGVjdG9yIgorCWRlcGVuZHMgb24gREVCVUdfS01FTUxFQUsKKwloZWxwCisJICBTYXkgWSBvciBNIGhlcmUgdG8gYnVpbGQgYSB0ZXN0IGZvciB0aGUga2VybmVsIG1lbW9yeSBsZWFrCisJICBkZXRlY3Rvci4gVGhpcyBvcHRpb24gZW5hYmxlcyBhIG1vZHVsZSB0aGF0IGV4cGxpY2l0bHkgbGVha3MKKwkgIG1lbW9yeS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIERFQlVHX1BSRUVNUFQKIAlib29sICJEZWJ1ZyBwcmVlbXB0aWJsZSBrZXJuZWwiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgUFJFRU1QVCAmJiAoVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVCB8fCBQUEM2NCkKZGlmZiAtLWdpdCBhL2xpYi9NYWtlZmlsZSBiL2xpYi9NYWtlZmlsZQppbmRleCAzM2E0MGU0Li4xZjZlZGVmIDEwMDY0NAotLS0gYS9saWIvTWFrZWZpbGUKKysrIGIvbGliL01ha2VmaWxlCkBAIC01MCw2ICs1MCw3IEBACiBlbmRpZgogCiBvYmotJChDT05GSUdfQklUUkVWRVJTRSkgKz0gYml0cmV2Lm8KK29iai0kKENPTkZJR19SQVRJT05BTCkJKz0gcmF0aW9uYWwubwogb2JqLSQoQ09ORklHX0NSQ19DQ0lUVCkJKz0gY3JjLWNjaXR0Lm8KIG9iai0kKENPTkZJR19DUkMxNikJKz0gY3JjMTYubwogb2JqLSQoQ09ORklHX0NSQ19UMTBESUYpKz0gY3JjLXQxMGRpZi5vCmRpZmYgLS1naXQgYS9saWIvY3B1bWFzay5jIGIvbGliL2NwdW1hc2suYwppbmRleCBlYjIzYWFhLi43YmI0MTQyIDEwMDY0NAotLS0gYS9saWIvY3B1bWFzay5jCisrKyBiL2xpYi9jcHVtYXNrLmMKQEAgLTkyLDE1ICs5Miw4IEBACiAgKi8KIGJvb2wgYWxsb2NfY3B1bWFza192YXJfbm9kZShjcHVtYXNrX3Zhcl90ICptYXNrLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7Ci0JaWYgKGxpa2VseShzbGFiX2lzX2F2YWlsYWJsZSgpKSkKLQkJKm1hc2sgPSBrbWFsbG9jX25vZGUoY3B1bWFza19zaXplKCksIGZsYWdzLCBub2RlKTsKLQllbHNlIHsKLSNpZmRlZiBDT05GSUdfREVCVUdfUEVSX0NQVV9NQVBTCi0JCXByaW50ayhLRVJOX0VSUgotCQkJIj0+IGFsbG9jX2NwdW1hc2tfdmFyOiBrbWFsbG9jIG5vdCBhdmFpbGFibGUhXG4iKTsKLSNlbmRpZgotCQkqbWFzayA9IE5VTEw7Ci0JfQorCSptYXNrID0ga21hbGxvY19ub2RlKGNwdW1hc2tfc2l6ZSgpLCBmbGFncywgbm9kZSk7CisKICNpZmRlZiBDT05GSUdfREVCVUdfUEVSX0NQVV9NQVBTCiAJaWYgKCEqbWFzaykgewogCQlwcmludGsoS0VSTl9FUlIgIj0+IGFsbG9jX2NwdW1hc2tfdmFyOiBmYWlsZWQhXG4iKTsKZGlmZiAtLWdpdCBhL2xpYi9kbWEtZGVidWcuYyBiL2xpYi9kbWEtZGVidWcuYwppbmRleCA2OWRhMDlhLi5hZDY1ZmMwIDEwMDY0NAotLS0gYS9saWIvZG1hLWRlYnVnLmMKKysrIGIvbGliL2RtYS1kZWJ1Zy5jCkBAIC0yMyw5ICsyMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1kZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCkBAIC04NSw2ICs4Nyw3IEBACiAKIHN0YXRpYyB1MzIgbnVtX2ZyZWVfZW50cmllczsKIHN0YXRpYyB1MzIgbWluX2ZyZWVfZW50cmllczsKK3N0YXRpYyB1MzIgbnJfdG90YWxfZW50cmllczsKIAogLyogbnVtYmVyIG9mIHByZWFsbG9jYXRlZCBlbnRyaWVzIHJlcXVlc3RlZCBieSBrZXJuZWwgY21kbGluZSAqLwogc3RhdGljIHUzMiByZXFfZW50cmllczsKQEAgLTk3LDYgKzEwMCwxNiBAQAogc3RhdGljIHN0cnVjdCBkZW50cnkgKnNob3dfbnVtX2Vycm9yc19kZW50ICBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHN0cnVjdCBkZW50cnkgKm51bV9mcmVlX2VudHJpZXNfZGVudCBfX3JlYWRfbW9zdGx5Owogc3RhdGljIHN0cnVjdCBkZW50cnkgKm1pbl9mcmVlX2VudHJpZXNfZGVudCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBkZW50cnkgKmZpbHRlcl9kZW50ICAgICAgICAgICBfX3JlYWRfbW9zdGx5OworCisvKiBwZXItZHJpdmVyIGZpbHRlciByZWxhdGVkIHN0YXRlICovCisKKyNkZWZpbmUgTkFNRV9NQVhfTEVOCTY0CisKK3N0YXRpYyBjaGFyICAgICAgICAgICAgICAgICAgY3VycmVudF9kcml2ZXJfbmFtZVtOQU1FX01BWF9MRU5dIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRldmljZV9kcml2ZXIgKmN1cnJlbnRfZHJpdmVyICAgICAgICAgICAgICAgICAgICBfX3JlYWRfbW9zdGx5OworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhkcml2ZXJfbmFtZV9sb2NrKTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnR5cGUybmFtZVs0XSA9IHsgInNpbmdsZSIsICJwYWdlIiwKIAkJCQkgICAgInNjYXRoZXItZ2F0aGVyIiwgImNvaGVyZW50IiB9OwpAQCAtMTA0LDYgKzExNywxMSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmRpcjJuYW1lWzRdID0geyAiRE1BX0JJRElSRUNUSU9OQUwiLCAiRE1BX1RPX0RFVklDRSIsCiAJCQkJICAgIkRNQV9GUk9NX0RFVklDRSIsICJETUFfTk9ORSIgfTsKIAorLyogbGl0dGxlIG1lcmdlIGhlbHBlciAtIHJlbW92ZSBpdCBhZnRlciB0aGUgbWVyZ2Ugd2luZG93ICovCisjaWZuZGVmIEJVU19OT1RJRllfVU5CT1VORF9EUklWRVIKKyNkZWZpbmUgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUiAweDAwMDUKKyNlbmRpZgorCiAvKgogICogVGhlIGFjY2VzcyB0byBzb21lIHZhcmlhYmxlcyBpbiB0aGlzIG1hY3JvIGlzIHJhY3kuIFdlIGNhbid0IHVzZSBhdG9taWNfdAogICogaGVyZSBiZWNhdXNlIGFsbCB0aGVzZSB2YXJpYWJsZXMgYXJlIGV4cG9ydGVkIHRvIGRlYnVnZnMuIFNvbWUgb2YgdGhlbSBldmVuCkBAIC0xMjEsMTUgKzEzOSw1NCBAQAogewogI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCiAJaWYgKGVudHJ5KSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIk1hcHBlZCBhdDpcbiIpOworCQlwcl93YXJuaW5nKCJNYXBwZWQgYXQ6XG4iKTsKIAkJcHJpbnRfc3RhY2tfdHJhY2UoJmVudHJ5LT5zdGFja3RyYWNlLCAwKTsKIAl9CiAjZW5kaWYKIH0KIAorc3RhdGljIGJvb2wgZHJpdmVyX2ZpbHRlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgcmV0OworCisJLyogZHJpdmVyIGZpbHRlciBvZmYgKi8KKwlpZiAobGlrZWx5KCFjdXJyZW50X2RyaXZlcl9uYW1lWzBdKSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBkcml2ZXIgZmlsdGVyIG9uIGFuZCBpbml0aWFsaXplZCAqLworCWlmIChjdXJyZW50X2RyaXZlciAmJiBkZXYtPmRyaXZlciA9PSBjdXJyZW50X2RyaXZlcikKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoY3VycmVudF9kcml2ZXIgfHwgIWN1cnJlbnRfZHJpdmVyX25hbWVbMF0pCisJCXJldHVybiBmYWxzZTsKKworCS8qIGRyaXZlciBmaWx0ZXIgb24gYnV0IG5vdCB5ZXQgaW5pdGlhbGl6ZWQgKi8KKwlkcnYgPSBnZXRfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpZiAoIWRydikKKwkJcmV0dXJuIGZhbHNlOworCisJLyogbG9jayB0byBwcm90ZWN0IGFnYWluc3QgY2hhbmdlIG9mIGN1cnJlbnRfZHJpdmVyX25hbWUgKi8KKwlyZWFkX2xvY2tfaXJxc2F2ZSgmZHJpdmVyX25hbWVfbG9jaywgZmxhZ3MpOworCisJcmV0ID0gZmFsc2U7CisJaWYgKGRydi0+bmFtZSAmJgorCSAgICBzdHJuY21wKGN1cnJlbnRfZHJpdmVyX25hbWUsIGRydi0+bmFtZSwgTkFNRV9NQVhfTEVOIC0gMSkgPT0gMCkgeworCQljdXJyZW50X2RyaXZlciA9IGRydjsKKwkJcmV0ID0gdHJ1ZTsKKwl9CisKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZkcml2ZXJfbmFtZV9sb2NrLCBmbGFncyk7CisJcHV0X2RyaXZlcihkcnYpOworCisJcmV0dXJuIHJldDsKK30KKwogI2RlZmluZSBlcnJfcHJpbnRrKGRldiwgZW50cnksIGZvcm1hdCwgYXJnLi4uKSBkbyB7CQlcCiAJCWVycm9yX2NvdW50ICs9IDE7CQkJCVwKLQkJaWYgKHNob3dfYWxsX2Vycm9ycyB8fCBzaG93X251bV9lcnJvcnMgPiAwKSB7CVwKKwkJaWYgKGRyaXZlcl9maWx0ZXIoZGV2KSAmJgkJCVwKKwkJICAgIChzaG93X2FsbF9lcnJvcnMgfHwgc2hvd19udW1fZXJyb3JzID4gMCkpIHsJXAogCQkJV0FSTigxLCAiJXMgJXM6ICIgZm9ybWF0LAkJXAogCQkJICAgICBkZXZfZHJpdmVyX3N0cmluZyhkZXYpLAkJXAogCQkJICAgICBkZXZfbmFtZShkZXYpICwgIyMgYXJnKTsJCVwKQEAgLTE4NSwxNSArMjQyLDUwIEBACiBzdGF0aWMgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqaGFzaF9idWNrZXRfZmluZChzdHJ1Y3QgaGFzaF9idWNrZXQgKmJ1Y2tldCwKIAkJCQkJCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKnJlZikKIHsKLQlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeSwgKnJldCA9IE5VTEw7CisJaW50IG1hdGNoZXMgPSAwLCBtYXRjaF9sdmwsIGxhc3RfbHZsID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZidWNrZXQtPmxpc3QsIGxpc3QpIHsKLQkJaWYgKChlbnRyeS0+ZGV2X2FkZHIgPT0gcmVmLT5kZXZfYWRkcikgJiYKLQkJICAgIChlbnRyeS0+ZGV2ID09IHJlZi0+ZGV2KSkKKwkJaWYgKChlbnRyeS0+ZGV2X2FkZHIgIT0gcmVmLT5kZXZfYWRkcikgfHwKKwkJICAgIChlbnRyeS0+ZGV2ICE9IHJlZi0+ZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFNvbWUgZHJpdmVycyBtYXAgdGhlIHNhbWUgcGh5c2ljYWwgYWRkcmVzcyBtdWx0aXBsZQorCQkgKiB0aW1lcy4gV2l0aG91dCBhIGhhcmR3YXJlIElPTU1VIHRoaXMgcmVzdWx0cyBpbiB0aGUKKwkJICogc2FtZSBkZXZpY2UgYWRkcmVzc2VzIGJlaW5nIHB1dCBpbnRvIHRoZSBkbWEtZGVidWcKKwkJICogaGFzaCBtdWx0aXBsZSB0aW1lcyB0b28uIFRoaXMgY2FuIHJlc3VsdCBpbiBmYWxzZQorCQkgKiBwb3NpdGl2ZXMgYmVpbmcgcmVwb3J0ZWQuIFRoZXJmb3JlIHdlIGltcGxlbWVudCBhCisJCSAqIGJlc3QtZml0IGFsZ29yaXRobSBoZXJlIHdoaWNoIHJldHVybnMgdGhlIGVudHJ5IGZyb20KKwkJICogdGhlIGhhc2ggd2hpY2ggZml0cyBiZXN0IHRvIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJICogaW5zdGVhZCBvZiB0aGUgZmlyc3QtZml0LgorCQkgKi8KKwkJbWF0Y2hlcyArPSAxOworCQltYXRjaF9sdmwgPSAwOworCQllbnRyeS0+c2l6ZSAgICAgID09IHJlZi0+c2l6ZSAgICAgID8gKyttYXRjaF9sdmwgOiBtYXRjaF9sdmw7CisJCWVudHJ5LT50eXBlICAgICAgPT0gcmVmLT50eXBlICAgICAgPyArK21hdGNoX2x2bCA6IG1hdGNoX2x2bDsKKwkJZW50cnktPmRpcmVjdGlvbiA9PSByZWYtPmRpcmVjdGlvbiA/ICsrbWF0Y2hfbHZsIDogbWF0Y2hfbHZsOworCisJCWlmIChtYXRjaF9sdmwgPT0gMykgeworCQkJLyogcGVyZmVjdC1maXQgLSByZXR1cm4gdGhlIHJlc3VsdCAqLwogCQkJcmV0dXJuIGVudHJ5OworCQl9IGVsc2UgaWYgKG1hdGNoX2x2bCA+IGxhc3RfbHZsKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYW4gZW50cnkgdGhhdCBmaXRzIGJldHRlciB0aGVuIHRoZQorCQkJICogcHJldmlvdXMgb25lCisJCQkgKi8KKwkJCWxhc3RfbHZsID0gbWF0Y2hfbHZsOworCQkJcmV0ICAgICAgPSBlbnRyeTsKKwkJfQogCX0KIAotCXJldHVybiBOVUxMOworCS8qCisJICogSWYgd2UgaGF2ZSBtdWx0aXBsZSBtYXRjaGVzIGJ1dCBubyBwZXJmZWN0LWZpdCwganVzdCByZXR1cm4KKwkgKiBOVUxMLgorCSAqLworCXJldCA9IChtYXRjaGVzID09IDEpID8gcmV0IDogTlVMTDsKKworCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0yNTcsNiArMzQ5LDIxIEBACiAJcHV0X2hhc2hfYnVja2V0KGJ1Y2tldCwgJmZsYWdzKTsKIH0KIAorc3RhdGljIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKl9fZG1hX2VudHJ5X2FsbG9jKHZvaWQpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGxpc3RfZW50cnkoZnJlZV9lbnRyaWVzLm5leHQsIHN0cnVjdCBkbWFfZGVidWdfZW50cnksIGxpc3QpOworCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisKKwludW1fZnJlZV9lbnRyaWVzIC09IDE7CisJaWYgKG51bV9mcmVlX2VudHJpZXMgPCBtaW5fZnJlZV9lbnRyaWVzKQorCQltaW5fZnJlZV9lbnRyaWVzID0gbnVtX2ZyZWVfZW50cmllczsKKworCXJldHVybiBlbnRyeTsKK30KKwogLyogc3RydWN0IGRtYV9lbnRyeSBhbGxvY2F0b3IKICAqCiAgKiBUaGUgbmV4dCB0d28gZnVuY3Rpb25zIGltcGxlbWVudCB0aGUgYWxsb2NhdG9yIGZvcgpAQCAtMjcwLDE1ICszNzcsMTIgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZnJlZV9lbnRyaWVzX2xvY2ssIGZsYWdzKTsKIAogCWlmIChsaXN0X2VtcHR5KCZmcmVlX2VudHJpZXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BLUFQSTogZGVidWdnaW5nIG91dCBvZiBtZW1vcnkgIgotCQkJCSItIGRpc2FibGluZ1xuIik7CisJCXByX2VycigiRE1BLUFQSTogZGVidWdnaW5nIG91dCBvZiBtZW1vcnkgLSBkaXNhYmxpbmdcbiIpOwogCQlnbG9iYWxfZGlzYWJsZSA9IHRydWU7CiAJCWdvdG8gb3V0OwogCX0KIAotCWVudHJ5ID0gbGlzdF9lbnRyeShmcmVlX2VudHJpZXMubmV4dCwgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSwgbGlzdCk7Ci0JbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKLQltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKKwllbnRyeSA9IF9fZG1hX2VudHJ5X2FsbG9jKCk7CiAKICNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQogCWVudHJ5LT5zdGFja3RyYWNlLm1heF9lbnRyaWVzID0gRE1BX0RFQlVHX1NUQUNLVFJBQ0VfRU5UUklFUzsKQEAgLTI4Niw5ICszOTAsNiBAQAogCWVudHJ5LT5zdGFja3RyYWNlLnNraXAgPSAyOwogCXNhdmVfc3RhY2tfdHJhY2UoJmVudHJ5LT5zdGFja3RyYWNlKTsKICNlbmRpZgotCW51bV9mcmVlX2VudHJpZXMgLT0gMTsKLQlpZiAobnVtX2ZyZWVfZW50cmllcyA8IG1pbl9mcmVlX2VudHJpZXMpCi0JCW1pbl9mcmVlX2VudHJpZXMgPSBudW1fZnJlZV9lbnRyaWVzOwogCiBvdXQ6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnJlZV9lbnRyaWVzX2xvY2ssIGZsYWdzKTsKQEAgLTMxMCw2ICs0MTEsNTMgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOwogfQogCitpbnQgZG1hX2RlYnVnX3Jlc2l6ZV9lbnRyaWVzKHUzMiBudW1fZW50cmllcykKK3sKKwlpbnQgaSwgZGVsdGEsIHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKKwlMSVNUX0hFQUQodG1wKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOworCisJaWYgKG5yX3RvdGFsX2VudHJpZXMgPCBudW1fZW50cmllcykgeworCQlkZWx0YSA9IG51bV9lbnRyaWVzIC0gbnJfdG90YWxfZW50cmllczsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOworCisJCWZvciAoaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7CisJCQllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFlbnRyeSkKKwkJCQlicmVhazsKKworCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZ0bXApOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmZyZWVfZW50cmllc19sb2NrLCBmbGFncyk7CisKKwkJbGlzdF9zcGxpY2UoJnRtcCwgJmZyZWVfZW50cmllcyk7CisJCW5yX3RvdGFsX2VudHJpZXMgKz0gaTsKKwkJbnVtX2ZyZWVfZW50cmllcyArPSBpOworCX0gZWxzZSB7CisJCWRlbHRhID0gbnJfdG90YWxfZW50cmllcyAtIG51bV9lbnRyaWVzOworCisJCWZvciAoaSA9IDA7IGkgPCBkZWx0YSAmJiAhbGlzdF9lbXB0eSgmZnJlZV9lbnRyaWVzKTsgaSsrKSB7CisJCQllbnRyeSA9IF9fZG1hX2VudHJ5X2FsbG9jKCk7CisJCQlrZnJlZShlbnRyeSk7CisJCX0KKworCQlucl90b3RhbF9lbnRyaWVzIC09IGk7CisJfQorCisJaWYgKG5yX3RvdGFsX2VudHJpZXMgIT0gbnVtX2VudHJpZXMpCisJCXJldCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZG1hX2RlYnVnX3Jlc2l6ZV9lbnRyaWVzKTsKKwogLyoKICAqIERNQS1BUEkgZGVidWdnaW5nIGluaXQgY29kZQogICoKQEAgLTMzNCw4ICs0ODIsNyBAQAogCW51bV9mcmVlX2VudHJpZXMgPSBudW1fZW50cmllczsKIAltaW5fZnJlZV9lbnRyaWVzID0gbnVtX2VudHJpZXM7CiAKLQlwcmludGsoS0VSTl9JTkZPICJETUEtQVBJOiBwcmVhbGxvY2F0ZWQgJWQgZGVidWcgZW50cmllc1xuIiwKLQkJCW51bV9lbnRyaWVzKTsKKwlwcl9pbmZvKCJETUEtQVBJOiBwcmVhbGxvY2F0ZWQgJWQgZGVidWcgZW50cmllc1xuIiwgbnVtX2VudHJpZXMpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTM0OSwxMSArNDk2LDEwMiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCitzdGF0aWMgc3NpemVfdCBmaWx0ZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbTkFNRV9NQVhfTEVOICsgMV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGVuOworCisJaWYgKCFjdXJyZW50X2RyaXZlcl9uYW1lWzBdKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2UgY2FuJ3QgY29weSB0byB1c2Vyc3BhY2UgZGlyZWN0bHkgYmVjYXVzZSBjdXJyZW50X2RyaXZlcl9uYW1lIGNhbgorCSAqIG9ubHkgYmUgcmVhZCB1bmRlciB0aGUgZHJpdmVyX25hbWVfbG9jayB3aXRoIGlycXMgZGlzYWJsZWQuIFNvCisJICogY3JlYXRlIGEgdGVtcG9yYXJ5IGNvcHkgZmlyc3QuCisJICovCisJcmVhZF9sb2NrX2lycXNhdmUoJmRyaXZlcl9uYW1lX2xvY2ssIGZsYWdzKTsKKwlsZW4gPSBzY25wcmludGYoYnVmLCBOQU1FX01BWF9MRU4gKyAxLCAiJXNcbiIsIGN1cnJlbnRfZHJpdmVyX25hbWUpOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmRyaXZlcl9uYW1lX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgZmlsdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZltOQU1FX01BWF9MRU5dOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2l6ZV90IGxlbjsKKwlpbnQgaTsKKworCS8qCisJICogV2UgY2FuJ3QgY29weSBmcm9tIHVzZXJzcGFjZSBkaXJlY3RseS4gQWNjZXNzIHRvCisJICogY3VycmVudF9kcml2ZXJfbmFtZSBpcyBwcm90ZWN0ZWQgd2l0aCBhIHdyaXRlX2xvY2sgd2l0aCBpcnFzCisJICogZGlzYWJsZWQuIFNpbmNlIGNvcHlfZnJvbV91c2VyIGNhbiBmYXVsdCBhbmQgbWF5IHNsZWVwIHdlCisJICogbmVlZCB0byBjb3B5IHRvIHRlbXBvcmFyeSBidWZmZXIgZmlyc3QKKwkgKi8KKwlsZW4gPSBtaW4oY291bnQsIChzaXplX3QpKE5BTUVfTUFYX0xFTiAtIDEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZltsZW5dID0gMDsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZHJpdmVyX25hbWVfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBOb3cgaGFuZGxlIHRoZSBzdHJpbmcgd2UgZ290IGZyb20gdXNlcnNwYWNlIHZlcnkgY2FyZWZ1bGx5LgorCSAqIFRoZSBydWxlcyBhcmU6CisJICogICAgICAgICAtIG9ubHkgdXNlIHRoZSBmaXJzdCB0b2tlbiB3ZSBnb3QKKwkgKiAgICAgICAgIC0gdG9rZW4gZGVsaW1pdGVyIGlzIGV2ZXJ5dGhpbmcgbG9va2luZyBsaWtlIGEgc3BhY2UKKwkgKiAgICAgICAgICAgY2hhcmFjdGVyICgnICcsICdcbicsICdcdCcgLi4uKQorCSAqCisJICovCisJaWYgKCFpc2FsbnVtKGJ1ZlswXSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciB1c2Vyc3BhY2UgZ2F2ZSB1cyBpcyBub3QKKwkJICogYWxwaGFudW1lcmljYWwgdGhlbiBhc3N1bWUgdGhlIGZpbHRlciBzaG91bGQgYmUKKwkJICogc3dpdGNoZWQgb2ZmLgorCQkgKi8KKwkJaWYgKGN1cnJlbnRfZHJpdmVyX25hbWVbMF0pCisJCQlwcl9pbmZvKCJETUEtQVBJOiBzd2l0Y2hpbmcgb2ZmIGRtYS1kZWJ1ZyBkcml2ZXIgZmlsdGVyXG4iKTsKKwkJY3VycmVudF9kcml2ZXJfbmFtZVswXSA9IDA7CisJCWN1cnJlbnRfZHJpdmVyID0gTlVMTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qCisJICogTm93IHBhcnNlIG91dCB0aGUgZmlyc3QgdG9rZW4gYW5kIHVzZSBpdCBhcyB0aGUgbmFtZSBmb3IgdGhlCisJICogZHJpdmVyIHRvIGZpbHRlciBmb3IuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5BTUVfTUFYX0xFTjsgKytpKSB7CisJCWN1cnJlbnRfZHJpdmVyX25hbWVbaV0gPSBidWZbaV07CisJCWlmIChpc3NwYWNlKGJ1ZltpXSkgfHwgYnVmW2ldID09ICcgJyB8fCBidWZbaV0gPT0gMCkKKwkJCWJyZWFrOworCX0KKwljdXJyZW50X2RyaXZlcl9uYW1lW2ldID0gMDsKKwljdXJyZW50X2RyaXZlciA9IE5VTEw7CisKKwlwcl9pbmZvKCJETUEtQVBJOiBlbmFibGUgZHJpdmVyIGZpbHRlciBmb3IgZHJpdmVyIFslc11cbiIsCisJCWN1cnJlbnRfZHJpdmVyX25hbWUpOworCitvdXRfdW5sb2NrOgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZkcml2ZXJfbmFtZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmlsdGVyX2ZvcHMgPSB7CisJLnJlYWQgID0gZmlsdGVyX3JlYWQsCisJLndyaXRlID0gZmlsdGVyX3dyaXRlLAorfTsKKwogc3RhdGljIGludCBkbWFfZGVidWdfZnNfaW5pdCh2b2lkKQogewogCWRtYV9kZWJ1Z19kZW50ID0gZGVidWdmc19jcmVhdGVfZGlyKCJkbWEtYXBpIiwgTlVMTCk7CiAJaWYgKCFkbWFfZGVidWdfZGVudCkgewotCQlwcmludGsoS0VSTl9FUlIgIkRNQS1BUEk6IGNhbiBub3QgY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKKwkJcHJfZXJyKCJETUEtQVBJOiBjYW4gbm90IGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtMzkyLDYgKzYzMCwxMSBAQAogCWlmICghbWluX2ZyZWVfZW50cmllc19kZW50KQogCQlnb3RvIG91dF9lcnI7CiAKKwlmaWx0ZXJfZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRyaXZlcl9maWx0ZXIiLCAwNjQ0LAorCQkJCQkgIGRtYV9kZWJ1Z19kZW50LCBOVUxMLCAmZmlsdGVyX2ZvcHMpOworCWlmICghZmlsdGVyX2RlbnQpCisJCWdvdG8gb3V0X2VycjsKKwogCXJldHVybiAwOwogCiBvdXRfZXJyOgpAQCAtNDAwLDkgKzY0Myw2NCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCitzdGF0aWMgaW50IGRldmljZV9kbWFfYWxsb2NhdGlvbnMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50ID0gMCwgaTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7ICsraSkgeworCQlzcGluX2xvY2soJmRtYV9lbnRyeV9oYXNoW2ldLmxvY2spOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmZG1hX2VudHJ5X2hhc2hbaV0ubGlzdCwgbGlzdCkgeworCQkJaWYgKGVudHJ5LT5kZXYgPT0gZGV2KQorCQkJCWNvdW50ICs9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2soJmRtYV9lbnRyeV9oYXNoW2ldLmxvY2spOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBkbWFfZGVidWdfZGV2aWNlX2NoYW5nZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkYXRhOworCWludCBjb3VudDsKKworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIEJVU19OT1RJRllfVU5CT1VORF9EUklWRVI6CisJCWNvdW50ID0gZGV2aWNlX2RtYV9hbGxvY2F0aW9ucyhkZXYpOworCQlpZiAoY291bnQgPT0gMCkKKwkJCWJyZWFrOworCQllcnJfcHJpbnRrKGRldiwgTlVMTCwgIkRNQS1BUEk6IGRldmljZSBkcml2ZXIgaGFzIHBlbmRpbmcgIgorCQkJCSJETUEgYWxsb2NhdGlvbnMgd2hpbGUgcmVsZWFzZWQgZnJvbSBkZXZpY2UgIgorCQkJCSJbY291bnQ9JWRdXG4iLCBjb3VudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCiB2b2lkIGRtYV9kZWJ1Z19hZGRfYnVzKHN0cnVjdCBidXNfdHlwZSAqYnVzKQogewotCS8qIEZJWE1FOiByZWdpc3RlciBub3RpZmllciAqLworCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmI7CisKKwluYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBub3RpZmllcl9ibG9jayksIEdGUF9LRVJORUwpOworCWlmIChuYiA9PSBOVUxMKSB7CisJCXByX2VycigiZG1hX2RlYnVnX2FkZF9idXM6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm47CisJfQorCisJbmItPm5vdGlmaWVyX2NhbGwgPSBkbWFfZGVidWdfZGV2aWNlX2NoYW5nZTsKKworCWJ1c19yZWdpc3Rlcl9ub3RpZmllcihidXMsIG5iKTsKIH0KIAogLyoKQEAgLTQyMSw4ICs3MTksNyBAQAogCX0KIAogCWlmIChkbWFfZGVidWdfZnNfaW5pdCgpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJETUEtQVBJOiBlcnJvciBjcmVhdGluZyBkZWJ1Z2ZzIGVudHJpZXMgIgotCQkJCSItIGRpc2FibGluZ1xuIik7CisJCXByX2VycigiRE1BLUFQSTogZXJyb3IgY3JlYXRpbmcgZGVidWdmcyBlbnRyaWVzIC0gZGlzYWJsaW5nXG4iKTsKIAkJZ2xvYmFsX2Rpc2FibGUgPSB0cnVlOwogCiAJCXJldHVybjsKQEAgLTQzMiwxNCArNzI5LDE1IEBACiAJCW51bV9lbnRyaWVzID0gcmVxX2VudHJpZXM7CiAKIAlpZiAocHJlYWxsb2NfbWVtb3J5KG51bV9lbnRyaWVzKSAhPSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BLUFQSTogZGVidWdnaW5nIG91dCBvZiBtZW1vcnkgZXJyb3IgIgotCQkJCSItIGRpc2FibGVkXG4iKTsKKwkJcHJfZXJyKCJETUEtQVBJOiBkZWJ1Z2dpbmcgb3V0IG9mIG1lbW9yeSBlcnJvciAtIGRpc2FibGVkXG4iKTsKIAkJZ2xvYmFsX2Rpc2FibGUgPSB0cnVlOwogCiAJCXJldHVybjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJETUEtQVBJOiBkZWJ1Z2dpbmcgZW5hYmxlZCBieSBrZXJuZWwgY29uZmlnXG4iKTsKKwlucl90b3RhbF9lbnRyaWVzID0gbnVtX2ZyZWVfZW50cmllczsKKworCXByX2luZm8oIkRNQS1BUEk6IGRlYnVnZ2luZyBlbmFibGVkIGJ5IGtlcm5lbCBjb25maWdcbiIpOwogfQogCiBzdGF0aWMgX19pbml0IGludCBkbWFfZGVidWdfY21kbGluZShjaGFyICpzdHIpCkBAIC00NDgsOCArNzQ2LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoc3RybmNtcChzdHIsICJvZmYiLCAzKSA9PSAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIkRNQS1BUEk6IGRlYnVnZ2luZyBkaXNhYmxlZCBvbiBrZXJuZWwgIgotCQkJCSAiY29tbWFuZCBsaW5lXG4iKTsKKwkJcHJfaW5mbygiRE1BLUFQSTogZGVidWdnaW5nIGRpc2FibGVkIG9uIGtlcm5lbCBjb21tYW5kIGxpbmVcbiIpOwogCQlnbG9iYWxfZGlzYWJsZSA9IHRydWU7CiAJfQogCkBAIC03MjMsMTUgKzEwMjAsMTUgQEAKIAkJZW50cnktPnR5cGUgICAgICAgICAgID0gZG1hX2RlYnVnX3NnOwogCQllbnRyeS0+ZGV2ICAgICAgICAgICAgPSBkZXY7CiAJCWVudHJ5LT5wYWRkciAgICAgICAgICA9IHNnX3BoeXMocyk7Ci0JCWVudHJ5LT5zaXplICAgICAgICAgICA9IHMtPmxlbmd0aDsKLQkJZW50cnktPmRldl9hZGRyICAgICAgID0gcy0+ZG1hX2FkZHJlc3M7CisJCWVudHJ5LT5zaXplICAgICAgICAgICA9IHNnX2RtYV9sZW4ocyk7CisJCWVudHJ5LT5kZXZfYWRkciAgICAgICA9IHNnX2RtYV9hZGRyZXNzKHMpOwogCQllbnRyeS0+ZGlyZWN0aW9uICAgICAgPSBkaXJlY3Rpb247CiAJCWVudHJ5LT5zZ19jYWxsX2VudHMgICA9IG5lbnRzOwogCQllbnRyeS0+c2dfbWFwcGVkX2VudHMgPSBtYXBwZWRfZW50czsKIAogCQlpZiAoIVBhZ2VIaWdoTWVtKHNnX3BhZ2UocykpKSB7CiAJCQljaGVja19mb3Jfc3RhY2soZGV2LCBzZ192aXJ0KHMpKTsKLQkJCWNoZWNrX2Zvcl9pbGxlZ2FsX2FyZWEoZGV2LCBzZ192aXJ0KHMpLCBzLT5sZW5ndGgpOworCQkJY2hlY2tfZm9yX2lsbGVnYWxfYXJlYShkZXYsIHNnX3ZpcnQocyksIHNnX2RtYV9sZW4ocykpOwogCQl9CiAKIAkJYWRkX2RtYV9lbnRyeShlbnRyeSk7CkBAIC03MzksMTMgKzEwMzYsMzMgQEAKIH0KIEVYUE9SVF9TWU1CT0woZGVidWdfZG1hX21hcF9zZyk7CiAKK3N0YXRpYyBpbnQgZ2V0X25yX21hcHBlZF9lbnRyaWVzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5LCByZWY7CisJc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWFwcGVkX2VudHM7CisKKwlyZWYuZGV2ICAgICAgPSBkZXY7CisJcmVmLmRldl9hZGRyID0gc2dfZG1hX2FkZHJlc3Mocyk7CisJcmVmLnNpemUgICAgID0gc2dfZG1hX2xlbihzKSwKKworCWJ1Y2tldCAgICAgICA9IGdldF9oYXNoX2J1Y2tldCgmcmVmLCAmZmxhZ3MpOworCWVudHJ5ICAgICAgICA9IGhhc2hfYnVja2V0X2ZpbmQoYnVja2V0LCAmcmVmKTsKKwltYXBwZWRfZW50cyAgPSAwOworCisJaWYgKGVudHJ5KQorCQltYXBwZWRfZW50cyA9IGVudHJ5LT5zZ19tYXBwZWRfZW50czsKKwlwdXRfaGFzaF9idWNrZXQoYnVja2V0LCAmZmxhZ3MpOworCisJcmV0dXJuIG1hcHBlZF9lbnRzOworfQorCiB2b2lkIGRlYnVnX2RtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAogCQkJaW50IG5lbGVtcywgaW50IGRpcikKIHsKLQlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7CiAJaW50IG1hcHBlZF9lbnRzID0gMCwgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKHVubGlrZWx5KGdsb2JhbF9kaXNhYmxlKSkKIAkJcmV0dXJuOwpAQCAtNzU2LDggKzEwNzMsOCBAQAogCQkJLnR5cGUgICAgICAgICAgID0gZG1hX2RlYnVnX3NnLAogCQkJLmRldiAgICAgICAgICAgID0gZGV2LAogCQkJLnBhZGRyICAgICAgICAgID0gc2dfcGh5cyhzKSwKLQkJCS5kZXZfYWRkciAgICAgICA9IHMtPmRtYV9hZGRyZXNzLAotCQkJLnNpemUgICAgICAgICAgID0gcy0+bGVuZ3RoLAorCQkJLmRldl9hZGRyICAgICAgID0gc2dfZG1hX2FkZHJlc3MocyksCisJCQkuc2l6ZSAgICAgICAgICAgPSBzZ19kbWFfbGVuKHMpLAogCQkJLmRpcmVjdGlvbiAgICAgID0gZGlyLAogCQkJLnNnX2NhbGxfZW50cyAgID0gMCwKIAkJfTsKQEAgLTc2NSwxNCArMTA4Miw5IEBACiAJCWlmIChtYXBwZWRfZW50cyAmJiBpID49IG1hcHBlZF9lbnRzKQogCQkJYnJlYWs7CiAKLQkJaWYgKG1hcHBlZF9lbnRzID09IDApIHsKLQkJCXN0cnVjdCBoYXNoX2J1Y2tldCAqYnVja2V0OworCQlpZiAoIWkpIHsKIAkJCXJlZi5zZ19jYWxsX2VudHMgPSBuZWxlbXM7Ci0JCQlidWNrZXQgPSBnZXRfaGFzaF9idWNrZXQoJnJlZiwgJmZsYWdzKTsKLQkJCWVudHJ5ID0gaGFzaF9idWNrZXRfZmluZChidWNrZXQsICZyZWYpOwotCQkJaWYgKGVudHJ5KQotCQkJCW1hcHBlZF9lbnRzID0gZW50cnktPnNnX21hcHBlZF9lbnRzOwotCQkJcHV0X2hhc2hfYnVja2V0KGJ1Y2tldCwgJmZsYWdzKTsKKwkJCW1hcHBlZF9lbnRzID0gZ2V0X25yX21hcHBlZF9lbnRyaWVzKGRldiwgcyk7CiAJCX0KIAogCQljaGVja191bm1hcCgmcmVmKTsKQEAgLTg3NCwxNCArMTE4NiwyMCBAQAogCQkJICAgICAgIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOwotCWludCBpOworCWludCBtYXBwZWRfZW50cyA9IDAsIGk7CiAKIAlpZiAodW5saWtlbHkoZ2xvYmFsX2Rpc2FibGUpKQogCQlyZXR1cm47CiAKIAlmb3JfZWFjaF9zZyhzZywgcywgbmVsZW1zLCBpKSB7Ci0JCWNoZWNrX3N5bmMoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwgMCwKLQkJCQlkaXJlY3Rpb24sIHRydWUpOworCQlpZiAoIWkpCisJCQltYXBwZWRfZW50cyA9IGdldF9ucl9tYXBwZWRfZW50cmllcyhkZXYsIHMpOworCisJCWlmIChpID49IG1hcHBlZF9lbnRzKQorCQkJYnJlYWs7CisKKwkJY2hlY2tfc3luYyhkZXYsIHNnX2RtYV9hZGRyZXNzKHMpLCBzZ19kbWFfbGVuKHMpLCAwLAorCQkJICAgZGlyZWN0aW9uLCB0cnVlKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9zeW5jX3NnX2Zvcl9jcHUpOwpAQCAtODkwLDE1ICsxMjA4LDM5IEBACiAJCQkJICBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQogewogCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKLQlpbnQgaTsKKwlpbnQgbWFwcGVkX2VudHMgPSAwLCBpOwogCiAJaWYgKHVubGlrZWx5KGdsb2JhbF9kaXNhYmxlKSkKIAkJcmV0dXJuOwogCiAJZm9yX2VhY2hfc2coc2csIHMsIG5lbGVtcywgaSkgewotCQljaGVja19zeW5jKGRldiwgcy0+ZG1hX2FkZHJlc3MsIHMtPmRtYV9sZW5ndGgsIDAsCi0JCQkJZGlyZWN0aW9uLCBmYWxzZSk7CisJCWlmICghaSkKKwkJCW1hcHBlZF9lbnRzID0gZ2V0X25yX21hcHBlZF9lbnRyaWVzKGRldiwgcyk7CisKKwkJaWYgKGkgPj0gbWFwcGVkX2VudHMpCisJCQlicmVhazsKKworCQljaGVja19zeW5jKGRldiwgc2dfZG1hX2FkZHJlc3MocyksIHNnX2RtYV9sZW4ocyksIDAsCisJCQkgICBkaXJlY3Rpb24sIGZhbHNlKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2UpOwogCitzdGF0aWMgaW50IF9faW5pdCBkbWFfZGVidWdfZHJpdmVyX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOQU1FX01BWF9MRU4gLSAxOyArK2ksICsrc3RyKSB7CisJCWN1cnJlbnRfZHJpdmVyX25hbWVbaV0gPSAqc3RyOworCQlpZiAoKnN0ciA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGN1cnJlbnRfZHJpdmVyX25hbWVbMF0pCisJCXByX2luZm8oIkRNQS1BUEk6IGVuYWJsZSBkcml2ZXIgZmlsdGVyIGZvciBkcml2ZXIgWyVzXVxuIiwKKwkJCWN1cnJlbnRfZHJpdmVyX25hbWUpOworCisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImRtYV9kZWJ1Z19kcml2ZXI9IiwgZG1hX2RlYnVnX2RyaXZlcl9zZXR1cCk7CmRpZmYgLS1naXQgYS9saWIvcmF0aW9uYWwuYyBiL2xpYi9yYXRpb25hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzA5OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcmF0aW9uYWwuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogcmF0aW9uYWwgZnJhY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IGVtbGl4IEdtYkgsIE9za2FyIFNjaGlybWVyIDxvc0BlbWxpeC5jb20+CisgKgorICogaGVscGVyIGZ1bmN0aW9ucyB3aGVuIGNvcGluZyB3aXRoIHJhdGlvbmFsIG51bWJlcnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvcmF0aW9uYWwuaD4KKworLyoKKyAqIGNhbGN1bGF0ZSBiZXN0IHJhdGlvbmFsIGFwcHJveGltYXRpb24gZm9yIGEgZ2l2ZW4gZnJhY3Rpb24KKyAqIHRha2luZyBpbnRvIGFjY291bnQgcmVzdHJpY3RlZCByZWdpc3RlciBzaXplLCBlLmcuIHRvIGZpbmQKKyAqIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgYSBwbGwgd2l0aCA1IGJpdCBkZW5vbWluYXRvciBhbmQKKyAqIDggYml0IG51bWVyYXRvciByZWdpc3RlciBmaWVsZHMsIHRyeWluZyB0byBzZXQgdXAgd2l0aCBhCisgKiBmcmVxdWVuY3kgcmF0aW8gb2YgMy4xNDE1LCBvbmUgd291bGQgc2F5OgorICoKKyAqIHJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbigzMTQxNSwgMTAwMDAsCisgKgkJKDEgPDwgOCkgLSAxLCAoMSA8PCA1KSAtIDEsICZuLCAmZCk7CisgKgorICogeW91IG1heSBsb29rIGF0IGdpdmVuX251bWVyYXRvciBhcyBhIGZpeGVkIHBvaW50IG51bWJlciwKKyAqIHdpdGggdGhlIGZyYWN0aW9uYWwgcGFydCBzaXplIGRlc2NyaWJlZCBpbiBnaXZlbl9kZW5vbWluYXRvci4KKyAqCisgKiBmb3IgdGhlb3JldGljYWwgYmFja2dyb3VuZCwgc2VlOgorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db250aW51ZWRfZnJhY3Rpb24KKyAqLworCit2b2lkIHJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbigKKwl1bnNpZ25lZCBsb25nIGdpdmVuX251bWVyYXRvciwgdW5zaWduZWQgbG9uZyBnaXZlbl9kZW5vbWluYXRvciwKKwl1bnNpZ25lZCBsb25nIG1heF9udW1lcmF0b3IsIHVuc2lnbmVkIGxvbmcgbWF4X2Rlbm9taW5hdG9yLAorCXVuc2lnbmVkIGxvbmcgKmJlc3RfbnVtZXJhdG9yLCB1bnNpZ25lZCBsb25nICpiZXN0X2Rlbm9taW5hdG9yKQoreworCXVuc2lnbmVkIGxvbmcgbiwgZCwgbjAsIGQwLCBuMSwgZDE7CisJbiA9IGdpdmVuX251bWVyYXRvcjsKKwlkID0gZ2l2ZW5fZGVub21pbmF0b3I7CisJbjAgPSBkMSA9IDA7CisJbjEgPSBkMCA9IDE7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBsb25nIHQsIGE7CisJCWlmICgobjEgPiBtYXhfbnVtZXJhdG9yKSB8fCAoZDEgPiBtYXhfZGVub21pbmF0b3IpKSB7CisJCQluMSA9IG4wOworCQkJZDEgPSBkMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkID09IDApCisJCQlicmVhazsKKwkJdCA9IGQ7CisJCWEgPSBuIC8gZDsKKwkJZCA9IG4gJSBkOworCQluID0gdDsKKwkJdCA9IG4wICsgYSAqIG4xOworCQluMCA9IG4xOworCQluMSA9IHQ7CisJCXQgPSBkMCArIGEgKiBkMTsKKwkJZDAgPSBkMTsKKwkJZDEgPSB0OworCX0KKwkqYmVzdF9udW1lcmF0b3IgPSBuMTsKKwkqYmVzdF9kZW5vbWluYXRvciA9IGQxOworfQorCitFWFBPUlRfU1lNQk9MKHJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbik7CmRpZmYgLS1naXQgYS9saWIvc3dpb3RsYi5jIGIvbGliL3N3aW90bGIuYwppbmRleCAyYjBiNWE3Li5iZmZlNmQ3IDEwMDY0NAotLS0gYS9saWIvc3dpb3RsYi5jCisrKyBiL2xpYi9zd2lvdGxiLmMKQEAgLTYwLDggKzYwLDggQEAKIGludCBzd2lvdGxiX2ZvcmNlOwogCiAvKgotICogVXNlZCB0byBkbyBhIHF1aWNrIHJhbmdlIGNoZWNrIGluIHN3aW90bGJfdW5tYXBfc2luZ2xlIGFuZAotICogc3dpb3RsYl9zeW5jX3NpbmdsZV8qLCB0byBzZWUgaWYgdGhlIG1lbW9yeSB3YXMgaW4gZmFjdCBhbGxvY2F0ZWQgYnkgdGhpcworICogVXNlZCB0byBkbyBhIHF1aWNrIHJhbmdlIGNoZWNrIGluIHVubWFwX3NpbmdsZSBhbmQKKyAqIHN5bmNfc2luZ2xlXyosIHRvIHNlZSBpZiB0aGUgbWVtb3J5IHdhcyBpbiBmYWN0IGFsbG9jYXRlZCBieSB0aGlzCiAgKiBBUEkuCiAgKi8KIHN0YXRpYyBjaGFyICppb190bGJfc3RhcnQsICppb190bGJfZW5kOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAJcmV0dXJuIHBhZGRyOwogfQogCi1waHlzX2FkZHJfdCBfX3dlYWsgc3dpb3RsYl9idXNfdG9fcGh5cyhkbWFfYWRkcl90IGJhZGRyKQorcGh5c19hZGRyX3QgX193ZWFrIHN3aW90bGJfYnVzX3RvX3BoeXMoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgYmFkZHIpCiB7CiAJcmV0dXJuIGJhZGRyOwogfQpAQCAtMTQwLDkgKzE0MCwxNSBAQAogCXJldHVybiBzd2lvdGxiX3BoeXNfdG9fYnVzKGh3ZGV2LCB2aXJ0X3RvX3BoeXMoYWRkcmVzcykpOwogfQogCi1zdGF0aWMgdm9pZCAqc3dpb3RsYl9idXNfdG9fdmlydChkbWFfYWRkcl90IGFkZHJlc3MpCit2b2lkICogX193ZWFrIHN3aW90bGJfYnVzX3RvX3ZpcnQoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgYWRkcmVzcykKIHsKLQlyZXR1cm4gcGh5c190b192aXJ0KHN3aW90bGJfYnVzX3RvX3BoeXMoYWRkcmVzcykpOworCXJldHVybiBwaHlzX3RvX3ZpcnQoc3dpb3RsYl9idXNfdG9fcGh5cyhod2RldiwgYWRkcmVzcykpOworfQorCitpbnQgX193ZWFrIHN3aW90bGJfYXJjaF9hZGRyZXNzX25lZWRzX21hcHBpbmcoc3RydWN0IGRldmljZSAqaHdkZXYsCisJCQkJCSAgICAgICBkbWFfYWRkcl90IGFkZHIsIHNpemVfdCBzaXplKQoreworCXJldHVybiAhaXNfYnVmZmVyX2RtYV9jYXBhYmxlKGRtYV9nZXRfbWFzayhod2RldiksIGFkZHIsIHNpemUpOwogfQogCiBpbnQgX193ZWFrIHN3aW90bGJfYXJjaF9yYW5nZV9uZWVkc19tYXBwaW5nKHBoeXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSkKQEAgLTMwOSwxMCArMzE1LDEwIEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBpbmxpbmUgaW50CiBhZGRyZXNzX25lZWRzX21hcHBpbmcoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUpCiB7Ci0JcmV0dXJuICFpc19idWZmZXJfZG1hX2NhcGFibGUoZG1hX2dldF9tYXNrKGh3ZGV2KSwgYWRkciwgc2l6ZSk7CisJcmV0dXJuIHN3aW90bGJfYXJjaF9hZGRyZXNzX25lZWRzX21hcHBpbmcoaHdkZXYsIGFkZHIsIHNpemUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCByYW5nZV9uZWVkc19tYXBwaW5nKHBoeXNfYWRkcl90IHBhZGRyLCBzaXplX3Qgc2l6ZSkKQEAgLTM0MSw3ICszNDcsNyBAQAogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCXdoaWxlIChzaXplKSB7Ci0JCQlzeiA9IG1pbihQQUdFX1NJWkUgLSBvZmZzZXQsIHNpemUpOworCQkJc3ogPSBtaW5fdChzaXplX3QsIFBBR0VfU0laRSAtIG9mZnNldCwgc2l6ZSk7CiAKIAkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJCWJ1ZmZlciA9IGttYXBfYXRvbWljKHBmbl90b19wYWdlKHBmbiksCkBAIC00NzYsNyArNDgyLDcgQEAKICAqIGRtYV9hZGRyIGlzIHRoZSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBib3VuY2UgYnVmZmVyIHRvIHVubWFwLgogICovCiBzdGF0aWMgdm9pZAotdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBjaGFyICpkbWFfYWRkciwgc2l6ZV90IHNpemUsIGludCBkaXIpCitkb191bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGNoYXIgKmRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpLCBjb3VudCwgbnNsb3RzID0gQUxJR04oc2l6ZSwgMSA8PCBJT19UTEJfU0hJRlQpID4+IElPX1RMQl9TSElGVDsKQEAgLTU2MCw3ICs1NjYsNiBAQAogCQkJCSAgIHNpemUpKSB7CiAJCS8qCiAJCSAqIFRoZSBhbGxvY2F0ZWQgbWVtb3J5IGlzbid0IHJlYWNoYWJsZSBieSB0aGUgZGV2aWNlLgotCQkgKiBGYWxsIGJhY2sgb24gc3dpb3RsYl9tYXBfc2luZ2xlKCkuCiAJCSAqLwogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSByZXQsIG9yZGVyKTsKIAkJcmV0ID0gTlVMTDsKQEAgLTU2OCw5ICs1NzMsOCBAQAogCWlmICghcmV0KSB7CiAJCS8qCiAJCSAqIFdlIGFyZSBlaXRoZXIgb3V0IG9mIG1lbW9yeSBvciB0aGUgZGV2aWNlIGNhbid0IERNQQotCQkgKiB0byBHRlBfRE1BIG1lbW9yeTsgZmFsbCBiYWNrIG9uCi0JCSAqIHN3aW90bGJfbWFwX3NpbmdsZSgpLCB3aGljaCB3aWxsIGdyYWIgbWVtb3J5IGZyb20KLQkJICogdGhlIGxvd2VzdCBhdmFpbGFibGUgYWRkcmVzcyByYW5nZS4KKwkJICogdG8gR0ZQX0RNQSBtZW1vcnk7IGZhbGwgYmFjayBvbiBtYXBfc2luZ2xlKCksIHdoaWNoCisJCSAqIHdpbGwgZ3JhYiBtZW1vcnkgZnJvbSB0aGUgbG93ZXN0IGF2YWlsYWJsZSBhZGRyZXNzIHJhbmdlLgogCQkgKi8KIAkJcmV0ID0gbWFwX3NpbmdsZShod2RldiwgMCwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAkJaWYgKCFyZXQpCkBAIC01ODcsNyArNTkxLDcgQEAKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2X2FkZHIpOwogCiAJCS8qIERNQV9UT19ERVZJQ0UgdG8gYXZvaWQgbWVtY3B5IGluIHVubWFwX3NpbmdsZSAqLwotCQl1bm1hcF9zaW5nbGUoaHdkZXYsIHJldCwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCWRvX3VubWFwX3NpbmdsZShod2RldiwgcmV0LCBzaXplLCBETUFfVE9fREVWSUNFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCSpkbWFfaGFuZGxlID0gZGV2X2FkZHI7CkBAIC02MDQsNyArNjA4LDcgQEAKIAkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdmFkZHIsIGdldF9vcmRlcihzaXplKSk7CiAJZWxzZQogCQkvKiBETUFfVE9fREVWSUNFIHRvIGF2b2lkIG1lbWNweSBpbiB1bm1hcF9zaW5nbGUgKi8KLQkJdW5tYXBfc2luZ2xlKGh3ZGV2LCB2YWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCWRvX3VubWFwX3NpbmdsZShod2RldiwgdmFkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UpOwogfQogRVhQT1JUX1NZTUJPTChzd2lvdGxiX2ZyZWVfY29oZXJlbnQpOwogCkBAIC02MzQsNyArNjM4LDcgQEAKICAqIHBoeXNpY2FsIGFkZHJlc3MgdG8gdXNlIGlzIHJldHVybmVkLgogICoKICAqIE9uY2UgdGhlIGRldmljZSBpcyBnaXZlbiB0aGUgZG1hIGFkZHJlc3MsIHRoZSBkZXZpY2Ugb3ducyB0aGlzIG1lbW9yeSB1bnRpbAotICogZWl0aGVyIHN3aW90bGJfdW5tYXBfc2luZ2xlIG9yIHN3aW90bGJfZG1hX3N5bmNfc2luZ2xlIGlzIHBlcmZvcm1lZC4KKyAqIGVpdGhlciBzd2lvdGxiX3VubWFwX3BhZ2Ugb3Igc3dpb3RsYl9kbWFfc3luY19zaW5nbGUgaXMgcGVyZm9ybWVkLgogICovCiBkbWFfYWRkcl90IHN3aW90bGJfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCkBAIC02NDIsMTggKzY0NiwxNyBAQAogCQkJICAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQogewogCXBoeXNfYWRkcl90IHBoeXMgPSBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQ7Ci0Jdm9pZCAqcHRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0OwogCWRtYV9hZGRyX3QgZGV2X2FkZHIgPSBzd2lvdGxiX3BoeXNfdG9fYnVzKGRldiwgcGh5cyk7CiAJdm9pZCAqbWFwOwogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAJLyoKLQkgKiBJZiB0aGUgcG9pbnRlciBwYXNzZWQgaW4gaGFwcGVucyB0byBiZSBpbiB0aGUgZGV2aWNlJ3MgRE1BIHdpbmRvdywKKwkgKiBJZiB0aGUgYWRkcmVzcyBoYXBwZW5zIHRvIGJlIGluIHRoZSBkZXZpY2UncyBETUEgd2luZG93LAogCSAqIHdlIGNhbiBzYWZlbHkgcmV0dXJuIHRoZSBkZXZpY2UgYWRkciBhbmQgbm90IHdvcnJ5IGFib3V0IGJvdW5jZQogCSAqIGJ1ZmZlcmluZyBpdC4KIAkgKi8KIAlpZiAoIWFkZHJlc3NfbmVlZHNfbWFwcGluZyhkZXYsIGRldl9hZGRyLCBzaXplKSAmJgotCSAgICAhcmFuZ2VfbmVlZHNfbWFwcGluZyh2aXJ0X3RvX3BoeXMocHRyKSwgc2l6ZSkpCisJICAgICFyYW5nZV9uZWVkc19tYXBwaW5nKHBoeXMsIHNpemUpKQogCQlyZXR1cm4gZGV2X2FkZHI7CiAKIAkvKgpAQCAtNjc5LDIzICs2ODIsMzUgQEAKIAogLyoKICAqIFVubWFwIGEgc2luZ2xlIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbi4gIFRoZSBkbWFfYWRkciBhbmQgc2l6ZSBtdXN0Ci0gKiBtYXRjaCB3aGF0IHdhcyBwcm92aWRlZCBmb3IgaW4gYSBwcmV2aW91cyBzd2lvdGxiX21hcF9zaW5nbGUgY2FsbC4gIEFsbAorICogbWF0Y2ggd2hhdCB3YXMgcHJvdmlkZWQgZm9yIGluIGEgcHJldmlvdXMgc3dpb3RsYl9tYXBfcGFnZSBjYWxsLiAgQWxsCiAgKiBvdGhlciB1c2FnZXMgYXJlIHVuZGVmaW5lZC4KICAqCiAgKiBBZnRlciB0aGlzIGNhbGwsIHJlYWRzIGJ5IHRoZSBjcHUgdG8gdGhlIGJ1ZmZlciBhcmUgZ3VhcmFudGVlZCB0byBzZWUKICAqIHdoYXRldmVyIHRoZSBkZXZpY2Ugd3JvdGUgdGhlcmUuCiAgKi8KK3N0YXRpYyB2b2lkIHVubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKKwkJCSBzaXplX3Qgc2l6ZSwgaW50IGRpcikKK3sKKwljaGFyICpkbWFfYWRkciA9IHN3aW90bGJfYnVzX3RvX3ZpcnQoaHdkZXYsIGRldl9hZGRyKTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCisJaWYgKGlzX3N3aW90bGJfYnVmZmVyKGRtYV9hZGRyKSkgeworCQlkb191bm1hcF9zaW5nbGUoaHdkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRpciAhPSBETUFfRlJPTV9ERVZJQ0UpCisJCXJldHVybjsKKworCWRtYV9tYXJrX2NsZWFuKGRtYV9hZGRyLCBzaXplKTsKK30KKwogdm9pZCBzd2lvdGxiX3VubWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCiAJCQlzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAogCQkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7Ci0JY2hhciAqZG1hX2FkZHIgPSBzd2lvdGxiX2J1c190b192aXJ0KGRldl9hZGRyKTsKLQotCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCWlmIChpc19zd2lvdGxiX2J1ZmZlcihkbWFfYWRkcikpCi0JCXVubWFwX3NpbmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcik7Ci0JZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKLQkJZG1hX21hcmtfY2xlYW4oZG1hX2FkZHIsIHNpemUpOworCXVubWFwX3NpbmdsZShod2RldiwgZGV2X2FkZHIsIHNpemUsIGRpcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3VubWFwX3BhZ2UpOwogCkBAIC03MDMsNyArNzE4LDcgQEAKICAqIE1ha2UgcGh5c2ljYWwgbWVtb3J5IGNvbnNpc3RlbnQgZm9yIGEgc2luZ2xlIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbgogICogYWZ0ZXIgYSB0cmFuc2Zlci4KICAqCi0gKiBJZiB5b3UgcGVyZm9ybSBhIHN3aW90bGJfbWFwX3NpbmdsZSgpIGJ1dCB3aXNoIHRvIGludGVycm9nYXRlIHRoZSBidWZmZXIKKyAqIElmIHlvdSBwZXJmb3JtIGEgc3dpb3RsYl9tYXBfcGFnZSgpIGJ1dCB3aXNoIHRvIGludGVycm9nYXRlIHRoZSBidWZmZXIKICAqIHVzaW5nIHRoZSBjcHUsIHlldCBkbyBub3Qgd2lzaCB0byB0ZWFyZG93biB0aGUgZG1hIG1hcHBpbmcsIHlvdSBtdXN0CiAgKiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGRvaW5nIHNvLiAgQXQgdGhlIG5leHQgcG9pbnQgeW91IGdpdmUgdGhlIGRtYQogICogYWRkcmVzcyBiYWNrIHRvIHRoZSBjYXJkLCB5b3UgbXVzdCBmaXJzdCBwZXJmb3JtIGEKQEAgLTcxMywxMyArNzI4LDE5IEBACiBzd2lvdGxiX3N5bmNfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAogCQkgICAgc2l6ZV90IHNpemUsIGludCBkaXIsIGludCB0YXJnZXQpCiB7Ci0JY2hhciAqZG1hX2FkZHIgPSBzd2lvdGxiX2J1c190b192aXJ0KGRldl9hZGRyKTsKKwljaGFyICpkbWFfYWRkciA9IHN3aW90bGJfYnVzX3RvX3ZpcnQoaHdkZXYsIGRldl9hZGRyKTsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCWlmIChpc19zd2lvdGxiX2J1ZmZlcihkbWFfYWRkcikpCisKKwlpZiAoaXNfc3dpb3RsYl9idWZmZXIoZG1hX2FkZHIpKSB7CiAJCXN5bmNfc2luZ2xlKGh3ZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyLCB0YXJnZXQpOwotCWVsc2UgaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCi0JCWRtYV9tYXJrX2NsZWFuKGRtYV9hZGRyLCBzaXplKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkaXIgIT0gRE1BX0ZST01fREVWSUNFKQorCQlyZXR1cm47CisKKwlkbWFfbWFya19jbGVhbihkbWFfYWRkciwgc2l6ZSk7CiB9CiAKIHZvaWQKQEAgLTc0NiwxMyArNzY3LDcgQEAKIAkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAogCQkJICBpbnQgZGlyLCBpbnQgdGFyZ2V0KQogewotCWNoYXIgKmRtYV9hZGRyID0gc3dpb3RsYl9idXNfdG9fdmlydChkZXZfYWRkcikgKyBvZmZzZXQ7Ci0KLQlCVUdfT04oZGlyID09IERNQV9OT05FKTsKLQlpZiAoaXNfc3dpb3RsYl9idWZmZXIoZG1hX2FkZHIpKQotCQlzeW5jX3NpbmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUsIGRpciwgdGFyZ2V0KTsKLQllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQotCQlkbWFfbWFya19jbGVhbihkbWFfYWRkciwgc2l6ZSk7CisJc3dpb3RsYl9zeW5jX3NpbmdsZShod2RldiwgZGV2X2FkZHIgKyBvZmZzZXQsIHNpemUsIGRpciwgdGFyZ2V0KTsKIH0KIAogdm9pZApAQCAtNzc3LDcgKzc5Miw3IEBACiAKIC8qCiAgKiBNYXAgYSBzZXQgb2YgYnVmZmVycyBkZXNjcmliZWQgYnkgc2NhdHRlcmxpc3QgaW4gc3RyZWFtaW5nIG1vZGUgZm9yIERNQS4KLSAqIFRoaXMgaXMgdGhlIHNjYXR0ZXItZ2F0aGVyIHZlcnNpb24gb2YgdGhlIGFib3ZlIHN3aW90bGJfbWFwX3NpbmdsZQorICogVGhpcyBpcyB0aGUgc2NhdHRlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUgYWJvdmUgc3dpb3RsYl9tYXBfcGFnZQogICogaW50ZXJmYWNlLiAgSGVyZSB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCBlbGVtZW50cyBhcmUgZWFjaCB0YWdnZWQgd2l0aCB0aGUKICAqIGFwcHJvcHJpYXRlIGRtYSBhZGRyZXNzIGFuZCBsZW5ndGguICBUaGV5IGFyZSBvYnRhaW5lZCB2aWEKICAqIHNnX2RtYV97YWRkcmVzcyxsZW5ndGh9KFNHKS4KQEAgLTc4OCw3ICs4MDMsNyBAQAogICogICAgICAgVGhlIHJvdXRpbmUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFkZHIvbGVuZ3RoIHBhaXJzIGFjdHVhbGx5CiAgKiAgICAgICB1c2VkLCBhdCBtb3N0IG5lbnRzLgogICoKLSAqIERldmljZSBvd25lcnNoaXAgaXNzdWVzIGFzIG1lbnRpb25lZCBhYm92ZSBmb3Igc3dpb3RsYl9tYXBfc2luZ2xlIGFyZSB0aGUKKyAqIERldmljZSBvd25lcnNoaXAgaXNzdWVzIGFzIG1lbnRpb25lZCBhYm92ZSBmb3Igc3dpb3RsYl9tYXBfcGFnZSBhcmUgdGhlCiAgKiBzYW1lIGhlcmUuCiAgKi8KIGludApAQCAtODM2LDcgKzg1MSw3IEBACiAKIC8qCiAgKiBVbm1hcCBhIHNldCBvZiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb25zLiAgQWdhaW4sIGNwdSByZWFkIHJ1bGVzCi0gKiBjb25jZXJuaW5nIGNhbGxzIGhlcmUgYXJlIHRoZSBzYW1lIGFzIGZvciBzd2lvdGxiX3VubWFwX3NpbmdsZSgpIGFib3ZlLgorICogY29uY2VybmluZyBjYWxscyBoZXJlIGFyZSB0aGUgc2FtZSBhcyBmb3Igc3dpb3RsYl91bm1hcF9wYWdlKCkgYWJvdmUuCiAgKi8KIHZvaWQKIHN3aW90bGJfdW5tYXBfc2dfYXR0cnMoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLApAQCAtODQ3LDEzICs4NjIsOSBAQAogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAKLQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpIHsKLQkJaWYgKHNnLT5kbWFfYWRkcmVzcyAhPSBzd2lvdGxiX3BoeXNfdG9fYnVzKGh3ZGV2LCBzZ19waHlzKHNnKSkpCi0JCQl1bm1hcF9zaW5nbGUoaHdkZXYsIHN3aW90bGJfYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRyZXNzKSwKLQkJCQkgICAgIHNnLT5kbWFfbGVuZ3RoLCBkaXIpOwotCQllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQotCQkJZG1hX21hcmtfY2xlYW4oc3dpb3RsYl9idXNfdG9fdmlydChzZy0+ZG1hX2FkZHJlc3MpLCBzZy0+ZG1hX2xlbmd0aCk7Ci0JfQorCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkKKwkJdW5tYXBfc2luZ2xlKGh3ZGV2LCBzZy0+ZG1hX2FkZHJlc3MsIHNnLT5kbWFfbGVuZ3RoLCBkaXIpOworCiB9CiBFWFBPUlRfU1lNQk9MKHN3aW90bGJfdW5tYXBfc2dfYXR0cnMpOwogCkBAIC04NzksMTUgKzg5MCw5IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlpbnQgaTsKIAotCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCi0JZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKSB7Ci0JCWlmIChzZy0+ZG1hX2FkZHJlc3MgIT0gc3dpb3RsYl9waHlzX3RvX2J1cyhod2Rldiwgc2dfcGh5cyhzZykpKQotCQkJc3luY19zaW5nbGUoaHdkZXYsIHN3aW90bGJfYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRyZXNzKSwKKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpCisJCXN3aW90bGJfc3luY19zaW5nbGUoaHdkZXYsIHNnLT5kbWFfYWRkcmVzcywKIAkJCQkgICAgc2ctPmRtYV9sZW5ndGgsIGRpciwgdGFyZ2V0KTsKLQkJZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKLQkJCWRtYV9tYXJrX2NsZWFuKHN3aW90bGJfYnVzX3RvX3ZpcnQoc2ctPmRtYV9hZGRyZXNzKSwgc2ctPmRtYV9sZW5ndGgpOwotCX0KIH0KIAogdm9pZApkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCA3NTM2YWNlLi43NTZjY2FmIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtNDA4LDYgKzQwOCw4IEBACiAJRk9STUFUX1RZUEVfTE9OR19MT05HLAogCUZPUk1BVF9UWVBFX1VMT05HLAogCUZPUk1BVF9UWVBFX0xPTkcsCisJRk9STUFUX1RZUEVfVUJZVEUsCisJRk9STUFUX1RZUEVfQllURSwKIAlGT1JNQVRfVFlQRV9VU0hPUlQsCiAJRk9STUFUX1RZUEVfU0hPUlQsCiAJRk9STUFUX1RZUEVfVUlOVCwKQEAgLTU3MywxMiArNTc1LDE1IEBACiB9CiAKIHN0YXRpYyBjaGFyICpzeW1ib2xfc3RyaW5nKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCB2b2lkICpwdHIsCi0JCQkJc3RydWN0IHByaW50Zl9zcGVjIHNwZWMpCisJCQkJc3RydWN0IHByaW50Zl9zcGVjIHNwZWMsIGNoYXIgZXh0KQogewogCXVuc2lnbmVkIGxvbmcgdmFsdWUgPSAodW5zaWduZWQgbG9uZykgcHRyOwogI2lmZGVmIENPTkZJR19LQUxMU1lNUwogCWNoYXIgc3ltW0tTWU1fU1lNQk9MX0xFTl07Ci0Jc3ByaW50X3N5bWJvbChzeW0sIHZhbHVlKTsKKwlpZiAoZXh0ICE9ICdmJykKKwkJc3ByaW50X3N5bWJvbChzeW0sIHZhbHVlKTsKKwllbHNlCisJCWthbGxzeW1zX2xvb2t1cCh2YWx1ZSwgTlVMTCwgTlVMTCwgTlVMTCwgc3ltKTsKIAlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCBzeW0sIHNwZWMpOwogI2Vsc2UKIAlzcGVjLmZpZWxkX3dpZHRoID0gMipzaXplb2Yodm9pZCAqKTsKQEAgLTY5MCw3ICs2OTUsOCBAQAogICoKICAqIFJpZ2h0IG5vdyB3ZSBoYW5kbGU6CiAgKgotICogLSAnRicgRm9yIHN5bWJvbGljIGZ1bmN0aW9uIGRlc2NyaXB0b3IgcG9pbnRlcnMKKyAqIC0gJ0YnIEZvciBzeW1ib2xpYyBmdW5jdGlvbiBkZXNjcmlwdG9yIHBvaW50ZXJzIHdpdGggb2Zmc2V0CisgKiAtICdmJyBGb3Igc2ltcGxlIHN5bWJvbGljIGZ1bmN0aW9uIG5hbWVzIHdpdGhvdXQgb2Zmc2V0CiAgKiAtICdTJyBGb3Igc3ltYm9saWMgZGlyZWN0IHBvaW50ZXJzCiAgKiAtICdSJyBGb3IgYSBzdHJ1Y3QgcmVzb3VyY2UgcG9pbnRlciwgaXQgcHJpbnRzIHRoZSByYW5nZSBvZgogICogICAgICAgYWRkcmVzc2VzIChub3QgdGhlIG5hbWUgbm9yIHRoZSBmbGFncykKQEAgLTcxMywxMCArNzE5LDExIEBACiAKIAlzd2l0Y2ggKCpmbXQpIHsKIAljYXNlICdGJzoKKwljYXNlICdmJzoKIAkJcHRyID0gZGVyZWZlcmVuY2VfZnVuY3Rpb25fZGVzY3JpcHRvcihwdHIpOwogCQkvKiBGYWxsdGhyb3VnaCAqLwogCWNhc2UgJ1MnOgotCQlyZXR1cm4gc3ltYm9sX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjKTsKKwkJcmV0dXJuIHN5bWJvbF9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYywgKmZtdCk7CiAJY2FzZSAnUic6CiAJCXJldHVybiByZXNvdXJjZV9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYyk7CiAJY2FzZSAnbSc6CkBAIC04NTMsMTEgKzg2MCwxNSBAQAogCXNwZWMtPnF1YWxpZmllciA9IC0xOwogCWlmICgqZm10ID09ICdoJyB8fCAqZm10ID09ICdsJyB8fCAqZm10ID09ICdMJyB8fAogCSAgICAqZm10ID09ICdaJyB8fCAqZm10ID09ICd6JyB8fCAqZm10ID09ICd0JykgewotCQlzcGVjLT5xdWFsaWZpZXIgPSAqZm10OwotCQkrK2ZtdDsKLQkJaWYgKHNwZWMtPnF1YWxpZmllciA9PSAnbCcgJiYgKmZtdCA9PSAnbCcpIHsKLQkJCXNwZWMtPnF1YWxpZmllciA9ICdMJzsKLQkJCSsrZm10OworCQlzcGVjLT5xdWFsaWZpZXIgPSAqZm10Kys7CisJCWlmICh1bmxpa2VseShzcGVjLT5xdWFsaWZpZXIgPT0gKmZtdCkpIHsKKwkJCWlmIChzcGVjLT5xdWFsaWZpZXIgPT0gJ2wnKSB7CisJCQkJc3BlYy0+cXVhbGlmaWVyID0gJ0wnOworCQkJCSsrZm10OworCQkJfSBlbHNlIGlmIChzcGVjLT5xdWFsaWZpZXIgPT0gJ2gnKSB7CisJCQkJc3BlYy0+cXVhbGlmaWVyID0gJ0gnOworCQkJCSsrZm10OworCQkJfQogCQl9CiAJfQogCkBAIC05MTksNiArOTMwLDExIEBACiAJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9TSVpFX1Q7CiAJfSBlbHNlIGlmIChzcGVjLT5xdWFsaWZpZXIgPT0gJ3QnKSB7CiAJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9QVFJESUZGOworCX0gZWxzZSBpZiAoc3BlYy0+cXVhbGlmaWVyID09ICdIJykgeworCQlpZiAoc3BlYy0+ZmxhZ3MgJiBTSUdOKQorCQkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX0JZVEU7CisJCWVsc2UKKwkJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9VQllURTsKIAl9IGVsc2UgaWYgKHNwZWMtPnF1YWxpZmllciA9PSAnaCcpIHsKIAkJaWYgKHNwZWMtPmZsYWdzICYgU0lHTikKIAkJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9TSE9SVDsKQEAgLTk0Myw3ICs5NTksOCBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gZm9sbG93cyBDOTkgdnNucHJpbnRmLCBidXQgaGFzIHNvbWUgZXh0ZW5zaW9uczoKICAqICVwUyBvdXRwdXQgdGhlIG5hbWUgb2YgYSB0ZXh0IHN5bWJvbAotICogJXBGIG91dHB1dCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIKKyAqICVwRiBvdXRwdXQgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBwb2ludGVyIHdpdGggaXRzIG9mZnNldAorICogJXBmIG91dHB1dCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aG91dCBpdHMgb2Zmc2V0CiAgKiAlcFIgb3V0cHV0IHRoZSBhZGRyZXNzIHJhbmdlIGluIGEgc3RydWN0IHJlc291cmNlCiAgKgogICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd291bGQKQEAgLTEwODcsNiArMTEwNCwxMiBAQAogCQkJY2FzZSBGT1JNQVRfVFlQRV9QVFJESUZGOgogCQkJCW51bSA9IHZhX2FyZyhhcmdzLCBwdHJkaWZmX3QpOwogCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9VQllURToKKwkJCQludW0gPSAodW5zaWduZWQgY2hhcikgdmFfYXJnKGFyZ3MsIGludCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX0JZVEU6CisJCQkJbnVtID0gKHNpZ25lZCBjaGFyKSB2YV9hcmcoYXJncywgaW50KTsKKwkJCQlicmVhazsKIAkJCWNhc2UgRk9STUFUX1RZUEVfVVNIT1JUOgogCQkJCW51bSA9ICh1bnNpZ25lZCBzaG9ydCkgdmFfYXJnKGFyZ3MsIGludCk7CiAJCQkJYnJlYWs7CkBAIC0xMzYzLDYgKzEzODYsMTAgQEAKIAkJCWNhc2UgRk9STUFUX1RZUEVfUFRSRElGRjoKIAkJCQlzYXZlX2FyZyhwdHJkaWZmX3QpOwogCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9VQllURToKKwkJCWNhc2UgRk9STUFUX1RZUEVfQllURToKKwkJCQlzYXZlX2FyZyhjaGFyKTsKKwkJCQlicmVhazsKIAkJCWNhc2UgRk9STUFUX1RZUEVfVVNIT1JUOgogCQkJY2FzZSBGT1JNQVRfVFlQRV9TSE9SVDoKIAkJCQlzYXZlX2FyZyhzaG9ydCk7CkBAIC0xMzkxLDcgKzE0MTgsOCBAQAogICoKICAqIFRoZSBmb3JtYXQgZm9sbG93cyBDOTkgdnNucHJpbnRmLCBidXQgaGFzIHNvbWUgZXh0ZW5zaW9uczoKICAqICVwUyBvdXRwdXQgdGhlIG5hbWUgb2YgYSB0ZXh0IHN5bWJvbAotICogJXBGIG91dHB1dCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIKKyAqICVwRiBvdXRwdXQgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBwb2ludGVyIHdpdGggaXRzIG9mZnNldAorICogJXBmIG91dHB1dCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aG91dCBpdHMgb2Zmc2V0CiAgKiAlcFIgb3V0cHV0IHRoZSBhZGRyZXNzIHJhbmdlIGluIGEgc3RydWN0IHJlc291cmNlCiAgKiAlbiBpcyBpZ25vcmVkCiAgKgpAQCAtMTUzOCw2ICsxNTY2LDEyIEBACiAJCQljYXNlIEZPUk1BVF9UWVBFX1BUUkRJRkY6CiAJCQkJbnVtID0gZ2V0X2FyZyhwdHJkaWZmX3QpOwogCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9VQllURToKKwkJCQludW0gPSBnZXRfYXJnKHVuc2lnbmVkIGNoYXIpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9CWVRFOgorCQkJCW51bSA9IGdldF9hcmcoc2lnbmVkIGNoYXIpOworCQkJCWJyZWFrOwogCQkJY2FzZSBGT1JNQVRfVFlQRV9VU0hPUlQ6CiAJCQkJbnVtID0gZ2V0X2FyZyh1bnNpZ25lZCBzaG9ydCk7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwppbmRleCBjMmI1N2Q4Li43MTgzMGJhIDEwMDY0NAotLS0gYS9tbS9LY29uZmlnCisrKyBiL21tL0tjb25maWcKQEAgLTIyNiw2ICsyMjYsMjUgQEAKIGNvbmZpZyBNTVVfTk9USUZJRVIKIAlib29sCiAKK2NvbmZpZyBERUZBVUxUX01NQVBfTUlOX0FERFIKKyAgICAgICAgaW50ICJMb3cgYWRkcmVzcyBzcGFjZSB0byBwcm90ZWN0IGZyb20gdXNlciBhbGxvY2F0aW9uIgorICAgICAgICBkZWZhdWx0IDQwOTYKKyAgICAgICAgaGVscAorCSAgVGhpcyBpcyB0aGUgcG9ydGlvbiBvZiBsb3cgdmlydHVhbCBtZW1vcnkgd2hpY2ggc2hvdWxkIGJlIHByb3RlY3RlZAorCSAgZnJvbSB1c2Vyc3BhY2UgYWxsb2NhdGlvbi4gIEtlZXBpbmcgYSB1c2VyIGZyb20gd3JpdGluZyB0byBsb3cgcGFnZXMKKwkgIGNhbiBoZWxwIHJlZHVjZSB0aGUgaW1wYWN0IG9mIGtlcm5lbCBOVUxMIHBvaW50ZXIgYnVncy4KKworCSAgRm9yIG1vc3QgaWE2NCwgcHBjNjQgYW5kIHg4NiB1c2VycyB3aXRoIGxvdHMgb2YgYWRkcmVzcyBzcGFjZQorCSAgYSB2YWx1ZSBvZiA2NTUzNiBpcyByZWFzb25hYmxlIGFuZCBzaG91bGQgY2F1c2Ugbm8gcHJvYmxlbXMuCisJICBPbiBhcm0gYW5kIG90aGVyIGFyY2hzIGl0IHNob3VsZCBub3QgYmUgaGlnaGVyIHRoYW4gMzI3NjguCisJICBQcm9ncmFtcyB3aGljaCB1c2Ugdm04NiBmdW5jdGlvbmFsaXR5IHdvdWxkIGVpdGhlciBuZWVkIGFkZGl0aW9uYWwKKwkgIHBlcm1pc3Npb25zIGZyb20gZWl0aGVyIHRoZSBMU00gb3IgdGhlIGNhcGFiaWxpdGllcyBtb2R1bGUgb3IgaGF2ZQorCSAgdGhpcyBwcm90ZWN0aW9uIGRpc2FibGVkLgorCisJICBUaGlzIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIGJvb3QgdXNpbmcgdGhlCisJICAvcHJvYy9zeXMvdm0vbW1hcF9taW5fYWRkciB0dW5hYmxlLgorCisKIGNvbmZpZyBOT01NVV9JTklUSUFMX1RSSU1fRVhDRVNTCiAJaW50ICJUdXJuIG9uIG1tYXAoKSBleGNlc3Mgc3BhY2UgdHJpbW1pbmcgYmVmb3JlIGJvb3RpbmciCiAJZGVwZW5kcyBvbiAhTU1VCmRpZmYgLS1naXQgYS9tbS9NYWtlZmlsZSBiL21tL01ha2VmaWxlCmluZGV4IGVjNzNjNjguLmU4OWFjYjAgMTAwNjQ0Ci0tLSBhL21tL01ha2VmaWxlCisrKyBiL21tL01ha2VmaWxlCkBAIC0zOCwzICszOCw1IEBACiBlbmRpZgogb2JqLSQoQ09ORklHX1FVSUNLTElTVCkgKz0gcXVpY2tsaXN0Lm8KIG9iai0kKENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSKSArPSBtZW1jb250cm9sLm8gcGFnZV9jZ3JvdXAubworb2JqLSQoQ09ORklHX0RFQlVHX0tNRU1MRUFLKSArPSBrbWVtbGVhay5vCitvYmotJChDT05GSUdfREVCVUdfS01FTUxFQUtfVEVTVCkgKz0ga21lbWxlYWstdGVzdC5vCmRpZmYgLS1naXQgYS9tbS9ib290bWVtLmMgYi9tbS9ib290bWVtLmMKaW5kZXggZGFmOTI3MS4uMjgyZGYwYSAxMDA2NDQKLS0tIGEvbW0vYm9vdG1lbS5jCisrKyBiL21tL2Jvb3RtZW0uYwpAQCAtNTMyLDYgKzUzMiw5IEBACiAJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbiwKIAkJCQkJdW5zaWduZWQgbG9uZyBnb2FsLCB1bnNpZ25lZCBsb25nIGxpbWl0KQogeworCWlmIChXQVJOX09OX09OQ0Uoc2xhYl9pc19hdmFpbGFibGUoKSkpCisJCXJldHVybiBremFsbG9jKHNpemUsIEdGUF9OT1dBSVQpOworCiAjaWZkZWYgQ09ORklHX0hBVkVfQVJDSF9CT09UTUVNCiAJYm9vdG1lbV9kYXRhX3QgKnBfYmRhdGE7CiAKQEAgLTY2Miw2ICs2NjUsOSBAQAogdm9pZCAqIF9faW5pdCBfX2FsbG9jX2Jvb3RtZW1fbm9kZShwZ19kYXRhX3QgKnBnZGF0LCB1bnNpZ25lZCBsb25nIHNpemUsCiAJCQkJICAgdW5zaWduZWQgbG9uZyBhbGlnbiwgdW5zaWduZWQgbG9uZyBnb2FsKQogeworCWlmIChXQVJOX09OX09OQ0Uoc2xhYl9pc19hdmFpbGFibGUoKSkpCisJCXJldHVybiBremFsbG9jX25vZGUoc2l6ZSwgR0ZQX05PV0FJVCwgcGdkYXQtPm5vZGVfaWQpOworCiAJcmV0dXJuIF9fX2FsbG9jX2Jvb3RtZW1fbm9kZShwZ2RhdC0+YmRhdGEsIHNpemUsIGFsaWduLCBnb2FsLCAwKTsKIH0KIApAQCAtNjkzLDYgKzY5OSw5IEBACiB7CiAJdm9pZCAqcHRyOwogCisJaWYgKFdBUk5fT05fT05DRShzbGFiX2lzX2F2YWlsYWJsZSgpKSkKKwkJcmV0dXJuIGt6YWxsb2Nfbm9kZShzaXplLCBHRlBfTk9XQUlULCBwZ2RhdC0+bm9kZV9pZCk7CisKIAlwdHIgPSBhbGxvY19hcmNoX3ByZWZlcnJlZF9ib290bWVtKHBnZGF0LT5iZGF0YSwgc2l6ZSwgYWxpZ24sIGdvYWwsIDApOwogCWlmIChwdHIpCiAJCXJldHVybiBwdHI7CkBAIC03NDUsNiArNzU0LDkgQEAKIHZvaWQgKiBfX2luaXQgX19hbGxvY19ib290bWVtX2xvd19ub2RlKHBnX2RhdGFfdCAqcGdkYXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhbGlnbiwgdW5zaWduZWQgbG9uZyBnb2FsKQogeworCWlmIChXQVJOX09OX09OQ0Uoc2xhYl9pc19hdmFpbGFibGUoKSkpCisJCXJldHVybiBremFsbG9jX25vZGUoc2l6ZSwgR0ZQX05PV0FJVCwgcGdkYXQtPm5vZGVfaWQpOworCiAJcmV0dXJuIF9fX2FsbG9jX2Jvb3RtZW1fbm9kZShwZ2RhdC0+YmRhdGEsIHNpemUsIGFsaWduLAogCQkJCWdvYWwsIEFSQ0hfTE9XX0FERFJFU1NfTElNSVQpOwogfQpkaWZmIC0tZ2l0IGEvbW0vYm91bmNlLmMgYi9tbS9ib3VuY2UuYwppbmRleCBlNTkwMjcyLi40ZWJlM2VhIDEwMDY0NAotLS0gYS9tbS9ib3VuY2UuYworKysgYi9tbS9ib3VuY2UuYwpAQCAtMTQsMTYgKzE0LDE1IEBACiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KLSNpbmNsdWRlIDx0cmFjZS9ibG9jay5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Jsb2NrLmg+CisKICNkZWZpbmUgUE9PTF9TSVpFCTY0CiAjZGVmaW5lIElTQV9QT09MX1NJWkUJMTYKIAogc3RhdGljIG1lbXBvb2xfdCAqcGFnZV9wb29sLCAqaXNhX3BhZ2VfcG9vbDsKIAotREVGSU5FX1RSQUNFKGJsb2NrX2Jpb19ib3VuY2UpOwotCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIHN0YXRpYyBfX2luaXQgaW50IGluaXRfZW1lcmdlbmN5X3Bvb2wodm9pZCkKIHsKQEAgLTE5Miw3ICsxOTEsNyBAQAogCQkvKgogCQkgKiBpcyBkZXN0aW5hdGlvbiBwYWdlIGJlbG93IGJvdW5jZSBwZm4/CiAJCSAqLwotCQlpZiAocGFnZV90b19wZm4ocGFnZSkgPD0gcS0+Ym91bmNlX3BmbikKKwkJaWYgKHBhZ2VfdG9fcGZuKHBhZ2UpIDw9IHF1ZXVlX2JvdW5jZV9wZm4ocSkpCiAJCQljb250aW51ZTsKIAogCQkvKgpAQCAtMjg0LDcgKzI4Myw3IEBACiAJICogZG9uJ3Qgd2FzdGUgdGltZSBpdGVyYXRpbmcgb3ZlciBiaW8gc2VnbWVudHMKIAkgKi8KIAlpZiAoIShxLT5ib3VuY2VfZ2ZwICYgR0ZQX0RNQSkpIHsKLQkJaWYgKHEtPmJvdW5jZV9wZm4gPj0gYmxrX21heF9wZm4pCisJCWlmIChxdWV1ZV9ib3VuY2VfcGZuKHEpID49IGJsa19tYXhfcGZuKQogCQkJcmV0dXJuOwogCQlwb29sID0gcGFnZV9wb29sOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9tbS9rbWVtbGVhay10ZXN0LmMgYi9tbS9rbWVtbGVhay10ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyOTJmYwotLS0gL2Rldi9udWxsCisrKyBiL21tL2ttZW1sZWFrLXRlc3QuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIG1tL2ttZW1sZWFrLXRlc3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBUk0gTGltaXRlZAorICogV3JpdHRlbiBieSBDYXRhbGluIE1hcmluYXMgPGNhdGFsaW4ubWFyaW5hc0Bhcm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9mZHRhYmxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgorCitzdHJ1Y3QgdGVzdF9ub2RlIHsKKwlsb25nIGhlYWRlclsyNV07CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWxvbmcgZm9vdGVyWzI1XTsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQodGVzdF9saXN0KTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh2b2lkICosIHRlc3RfcG9pbnRlcik7CisKKy8qCisgKiBTb21lIHZlcnkgc2ltcGxlIHRlc3RpbmcuIFRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgZXh0ZW5kZWQgZm9yCisgKiBwcm9wZXIgdGVzdGluZy4KKyAqLworc3RhdGljIGludCBfX2luaXQga21lbWxlYWtfdGVzdF9pbml0KHZvaWQpCit7CisJc3RydWN0IHRlc3Rfbm9kZSAqZWxlbTsKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0lORk8gIkttZW1sZWFrIHRlc3RpbmdcbiIpOworCisJLyogbWFrZSBzb21lIG9ycGhhbiBvYmplY3RzICovCisJcHJfaW5mbygia21lbWxlYWs6IGttYWxsb2MoMzIpID0gJXBcbiIsIGttYWxsb2MoMzIsIEdGUF9LRVJORUwpKTsKKwlwcl9pbmZvKCJrbWVtbGVhazoga21hbGxvYygzMikgPSAlcFxuIiwga21hbGxvYygzMiwgR0ZQX0tFUk5FTCkpOworCXByX2luZm8oImttZW1sZWFrOiBrbWFsbG9jKDEwMjQpID0gJXBcbiIsIGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCkpOworCXByX2luZm8oImttZW1sZWFrOiBrbWFsbG9jKDEwMjQpID0gJXBcbiIsIGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCkpOworCXByX2luZm8oImttZW1sZWFrOiBrbWFsbG9jKDIwNDgpID0gJXBcbiIsIGttYWxsb2MoMjA0OCwgR0ZQX0tFUk5FTCkpOworCXByX2luZm8oImttZW1sZWFrOiBrbWFsbG9jKDIwNDgpID0gJXBcbiIsIGttYWxsb2MoMjA0OCwgR0ZQX0tFUk5FTCkpOworCXByX2luZm8oImttZW1sZWFrOiBrbWFsbG9jKDQwOTYpID0gJXBcbiIsIGttYWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCkpOworCXByX2luZm8oImttZW1sZWFrOiBrbWFsbG9jKDQwOTYpID0gJXBcbiIsIGttYWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCkpOworI2lmbmRlZiBDT05GSUdfTU9EVUxFUworCXByX2luZm8oImttZW1sZWFrOiBrbWVtX2NhY2hlX2FsbG9jKGZpbGVzX2NhY2hlcCkgPSAlcFxuIiwKKwkJa21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXAsIEdGUF9LRVJORUwpKTsKKwlwcl9pbmZvKCJrbWVtbGVhazoga21lbV9jYWNoZV9hbGxvYyhmaWxlc19jYWNoZXApID0gJXBcbiIsCisJCWttZW1fY2FjaGVfYWxsb2MoZmlsZXNfY2FjaGVwLCBHRlBfS0VSTkVMKSk7CisjZW5kaWYKKwlwcl9pbmZvKCJrbWVtbGVhazogdm1hbGxvYyg2NCkgPSAlcFxuIiwgdm1hbGxvYyg2NCkpOworCXByX2luZm8oImttZW1sZWFrOiB2bWFsbG9jKDY0KSA9ICVwXG4iLCB2bWFsbG9jKDY0KSk7CisJcHJfaW5mbygia21lbWxlYWs6IHZtYWxsb2MoNjQpID0gJXBcbiIsIHZtYWxsb2MoNjQpKTsKKwlwcl9pbmZvKCJrbWVtbGVhazogdm1hbGxvYyg2NCkgPSAlcFxuIiwgdm1hbGxvYyg2NCkpOworCXByX2luZm8oImttZW1sZWFrOiB2bWFsbG9jKDY0KSA9ICVwXG4iLCB2bWFsbG9jKDY0KSk7CisKKwkvKgorCSAqIEFkZCBlbGVtZW50cyB0byBhIGxpc3QuIFRoZXkgc2hvdWxkIG9ubHkgYXBwZWFyIGFzIG9ycGhhbgorCSAqIGFmdGVyIHRoZSBtb2R1bGUgaXMgcmVtb3ZlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQllbGVtID0ga21hbGxvYyhzaXplb2YoKmVsZW0pLCBHRlBfS0VSTkVMKTsKKwkJcHJfaW5mbygia21lbWxlYWs6IGttYWxsb2Moc2l6ZW9mKCplbGVtKSkgPSAlcFxuIiwgZWxlbSk7CisJCWlmICghZWxlbSkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQoZWxlbSwgMCwgc2l6ZW9mKCplbGVtKSk7CisJCUlOSVRfTElTVF9IRUFEKCZlbGVtLT5saXN0KTsKKworCQlsaXN0X2FkZF90YWlsKCZlbGVtLT5saXN0LCAmdGVzdF9saXN0KTsKKwl9CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlwZXJfY3B1KHRlc3RfcG9pbnRlciwgaSkgPSBrbWFsbG9jKDEyOSwgR0ZQX0tFUk5FTCk7CisJCXByX2luZm8oImttZW1sZWFrOiBrbWFsbG9jKDEyOSkgPSAlcFxuIiwKKwkJCXBlcl9jcHUodGVzdF9wb2ludGVyLCBpKSk7CisJfQorCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChrbWVtbGVha190ZXN0X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQga21lbWxlYWtfdGVzdF9leGl0KHZvaWQpCit7CisJc3RydWN0IHRlc3Rfbm9kZSAqZWxlbSwgKnRtcDsKKworCS8qCisJICogUmVtb3ZlIHRoZSBsaXN0IGVsZW1lbnRzIHdpdGhvdXQgYWN0dWFsbHkgZnJlZWluZyB0aGUKKwkgKiBtZW1vcnkuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVsZW0sIHRtcCwgJnRlc3RfbGlzdCwgbGlzdCkKKwkJbGlzdF9kZWwoJmVsZW0tPmxpc3QpOworfQorbW9kdWxlX2V4aXQoa21lbWxlYWtfdGVzdF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbW0va21lbWxlYWsuYyBiL21tL2ttZW1sZWFrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlYzg2YwotLS0gL2Rldi9udWxsCisrKyBiL21tL2ttZW1sZWFrLmMKQEAgLTAsMCArMSwxNDk4IEBACisvKgorICogbW0va21lbWxlYWsuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBUk0gTGltaXRlZAorICogV3JpdHRlbiBieSBDYXRhbGluIE1hcmluYXMgPGNhdGFsaW4ubWFyaW5hc0Bhcm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoKKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhbGdvcml0aG0gYW5kIGttZW1sZWFrIHVzYWdlLCBwbGVhc2Ugc2VlCisgKiBEb2N1bWVudGF0aW9uL2ttZW1sZWFrLnR4dC4KKyAqCisgKiBOb3RlcyBvbiBsb2NraW5nCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhlIGZvbGxvd2luZyBsb2NrcyBhbmQgbXV0ZXhlcyBhcmUgdXNlZCBieSBrbWVtbGVhazoKKyAqCisgKiAtIGttZW1sZWFrX2xvY2sgKHJ3bG9jayk6IHByb3RlY3RzIHRoZSBvYmplY3RfbGlzdCBtb2RpZmljYXRpb25zIGFuZAorICogICBhY2Nlc3NlcyB0byB0aGUgb2JqZWN0X3RyZWVfcm9vdC4gVGhlIG9iamVjdF9saXN0IGlzIHRoZSBtYWluIGxpc3QKKyAqICAgaG9sZGluZyB0aGUgbWV0YWRhdGEgKHN0cnVjdCBrbWVtbGVha19vYmplY3QpIGZvciB0aGUgYWxsb2NhdGVkIG1lbW9yeQorICogICBibG9ja3MuIFRoZSBvYmplY3RfdHJlZV9yb290IGlzIGEgcHJpb3JpdHkgc2VhcmNoIHRyZWUgdXNlZCB0byBsb29rLXVwCisgKiAgIG1ldGFkYXRhIGJhc2VkIG9uIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgYmxvY2suICBUaGUKKyAqICAga21lbWxlYWtfb2JqZWN0IHN0cnVjdHVyZXMgYXJlIGFkZGVkIHRvIHRoZSBvYmplY3RfbGlzdCBhbmQKKyAqICAgb2JqZWN0X3RyZWVfcm9vdCBpbiB0aGUgY3JlYXRlX29iamVjdCgpIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHRoZQorICogICBrbWVtbGVha19hbGxvYygpIGNhbGxiYWNrIGFuZCByZW1vdmVkIGluIGRlbGV0ZV9vYmplY3QoKSBjYWxsZWQgZnJvbSB0aGUKKyAqICAga21lbWxlYWtfZnJlZSgpIGNhbGxiYWNrCisgKiAtIGttZW1sZWFrX29iamVjdC5sb2NrIChzcGlubG9jayk6IHByb3RlY3RzIGEga21lbWxlYWtfb2JqZWN0LiBBY2Nlc3NlcyB0bworICogICB0aGUgbWV0YWRhdGEgKGUuZy4gY291bnQpIGFyZSBwcm90ZWN0ZWQgYnkgdGhpcyBsb2NrLiBOb3RlIHRoYXQgc29tZQorICogICBtZW1iZXJzIG9mIHRoaXMgc3RydWN0dXJlIG1heSBiZSBwcm90ZWN0ZWQgYnkgb3RoZXIgbWVhbnMgKGF0b21pYyBvcgorICogICBrbWVtbGVha19sb2NrKS4gVGhpcyBsb2NrIGlzIGFsc28gaGVsZCB3aGVuIHNjYW5uaW5nIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgIG1lbW9yeSBibG9jayB0byBhdm9pZCB0aGUga2VybmVsIGZyZWVpbmcgaXQgdmlhIHRoZSBrbWVtbGVha19mcmVlKCkKKyAqICAgY2FsbGJhY2suIFRoaXMgaXMgbGVzcyBoZWF2eXdlaWdodCB0aGFuIGhvbGRpbmcgYSBnbG9iYWwgbG9jayBsaWtlCisgKiAgIGttZW1sZWFrX2xvY2sgZHVyaW5nIHNjYW5uaW5nCisgKiAtIHNjYW5fbXV0ZXggKG11dGV4KTogZW5zdXJlcyB0aGF0IG9ubHkgb25lIHRocmVhZCBtYXkgc2NhbiB0aGUgbWVtb3J5IGZvcgorICogICB1bnJlZmVyZW5jZWQgb2JqZWN0cyBhdCBhIHRpbWUuIFRoZSBncmF5X2xpc3QgY29udGFpbnMgdGhlIG9iamVjdHMgd2hpY2gKKyAqICAgYXJlIGFscmVhZHkgcmVmZXJlbmNlZCBvciBtYXJrZWQgYXMgZmFsc2UgcG9zaXRpdmVzIGFuZCBuZWVkIHRvIGJlCisgKiAgIHNjYW5uZWQuIFRoaXMgbGlzdCBpcyBvbmx5IG1vZGlmaWVkIGR1cmluZyBhIHNjYW5uaW5nIGVwaXNvZGUgd2hlbiB0aGUKKyAqICAgc2Nhbl9tdXRleCBpcyBoZWxkLiBBdCB0aGUgZW5kIG9mIGEgc2NhbiwgdGhlIGdyYXlfbGlzdCBpcyBhbHdheXMgZW1wdHkuCisgKiAgIE5vdGUgdGhhdCB0aGUga21lbWxlYWtfb2JqZWN0LnVzZV9jb3VudCBpcyBpbmNyZW1lbnRlZCB3aGVuIGFuIG9iamVjdCBpcworICogICBhZGRlZCB0byB0aGUgZ3JheV9saXN0IGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGZyZWVkCisgKiAtIGttZW1sZWFrX211dGV4IChtdXRleCk6IHByZXZlbnRzIG11bHRpcGxlIHVzZXJzIG9mIHRoZSAia21lbWxlYWsiIGRlYnVnZnMKKyAqICAgZmlsZSB0b2dldGhlciB3aXRoIG1vZGlmaWNhdGlvbnMgdG8gdGhlIG1lbW9yeSBzY2FubmluZyBwYXJhbWV0ZXJzCisgKiAgIGluY2x1ZGluZyB0aGUgc2Nhbl90aHJlYWQgcG9pbnRlcgorICoKKyAqIFRoZSBrbWVtbGVha19vYmplY3Qgc3RydWN0dXJlcyBoYXZlIGEgdXNlX2NvdW50IGluY3JlbWVudGVkIG9yIGRlY3JlbWVudGVkCisgKiB1c2luZyB0aGUgZ2V0X29iamVjdCgpL3B1dF9vYmplY3QoKSBmdW5jdGlvbnMuIFdoZW4gdGhlIHVzZV9jb3VudCBiZWNvbWVzCisgKiAwLCB0aGlzIGNvdW50IGNhbiBubyBsb25nZXIgYmUgaW5jcmVtZW50ZWQgYW5kIHB1dF9vYmplY3QoKSBzY2hlZHVsZXMgdGhlCisgKiBrbWVtbGVha19vYmplY3QgZnJlZWluZyB2aWEgYW4gUkNVIGNhbGxiYWNrLiBBbGwgY2FsbHMgdG8gdGhlIGdldF9vYmplY3QoKQorICogZnVuY3Rpb24gbXVzdCBiZSBwcm90ZWN0ZWQgYnkgcmN1X3JlYWRfbG9jaygpIHRvIGF2b2lkIGFjY2Vzc2luZyBhIGZyZWVkCisgKiBzdHJ1Y3R1cmUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcHJpb190cmVlLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KKworLyoKKyAqIEttZW1sZWFrIGNvbmZpZ3VyYXRpb24gYW5kIGNvbW1vbiBkZWZpbmVzLgorICovCisjZGVmaW5lIE1BWF9UUkFDRQkJMTYJLyogc3RhY2sgdHJhY2UgbGVuZ3RoICovCisjZGVmaW5lIFJFUE9SVFNfTlIJCTUwCS8qIG1heGltdW0gbnVtYmVyIG9mIHJlcG9ydGVkIGxlYWtzICovCisjZGVmaW5lIE1TRUNTX01JTl9BR0UJCTUwMDAJLyogbWluaW11bSBvYmplY3QgYWdlIGZvciByZXBvcnRpbmcgKi8KKyNkZWZpbmUgTVNFQ1NfU0NBTl9ZSUVMRAkxMAkvKiBDUFUgeWllbGRpbmcgcGVyaW9kICovCisjZGVmaW5lIFNFQ1NfRklSU1RfU0NBTgkJNjAJLyogZGVsYXkgYmVmb3JlIHRoZSBmaXJzdCBzY2FuICovCisjZGVmaW5lIFNFQ1NfU0NBTl9XQUlUCQk2MDAJLyogc3Vic2VxdWVudCBhdXRvIHNjYW5uaW5nIGRlbGF5ICovCisKKyNkZWZpbmUgQllURVNfUEVSX1BPSU5URVIJc2l6ZW9mKHZvaWQgKikKKworLyogc2Nhbm5pbmcgYXJlYSBpbnNpZGUgYSBtZW1vcnkgYmxvY2sgKi8KK3N0cnVjdCBrbWVtbGVha19zY2FuX2FyZWEgeworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc2l6ZV90IGxlbmd0aDsKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgaG9sZGluZyB0aGUgbWV0YWRhdGEgZm9yIGVhY2ggYWxsb2NhdGVkIG1lbW9yeSBibG9jay4KKyAqIE1vZGlmaWNhdGlvbnMgdG8gc3VjaCBvYmplY3RzIHNob3VsZCBiZSBtYWRlIHdoaWxlIGhvbGRpbmcgdGhlCisgKiBvYmplY3QtPmxvY2suIEluc2VydGlvbnMgb3IgZGVsZXRpb25zIGZyb20gb2JqZWN0X2xpc3QsIGdyYXlfbGlzdCBvcgorICogdHJlZV9ub2RlIGFyZSBhbHJlYWR5IHByb3RlY3RlZCBieSB0aGUgY29ycmVzcG9uZGluZyBsb2NrcyBvciBtdXRleCAoc2VlCisgKiB0aGUgbm90ZXMgb24gbG9ja2luZyBhYm92ZSkuIFRoZXNlIG9iamVjdHMgYXJlIHJlZmVyZW5jZS1jb3VudGVkCisgKiAodXNlX2NvdW50KSBhbmQgZnJlZWQgdXNpbmcgdGhlIFJDVSBtZWNoYW5pc20uCisgKi8KK3N0cnVjdCBrbWVtbGVha19vYmplY3QgeworCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogb2JqZWN0IHN0YXR1cyBmbGFncyAqLworCXN0cnVjdCBsaXN0X2hlYWQgb2JqZWN0X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBncmF5X2xpc3Q7CisJc3RydWN0IHByaW9fdHJlZV9ub2RlIHRyZWVfbm9kZTsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwkJLyogb2JqZWN0X2xpc3QgbG9ja2xlc3MgdHJhdmVyc2FsICovCisJLyogb2JqZWN0IHVzYWdlIGNvdW50OyBvYmplY3QgZnJlZWQgd2hlbiB1c2VfY291bnQgPT0gMCAqLworCWF0b21pY190IHVzZV9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHBvaW50ZXI7CisJc2l6ZV90IHNpemU7CisJLyogbWluaW11bSBudW1iZXIgb2YgYSBwb2ludGVycyBmb3VuZCBiZWZvcmUgaXQgaXMgY29uc2lkZXJlZCBsZWFrICovCisJaW50IG1pbl9jb3VudDsKKwkvKiB0aGUgdG90YWwgbnVtYmVyIG9mIHBvaW50ZXJzIGZvdW5kIHBvaW50aW5nIHRvIHRoaXMgb2JqZWN0ICovCisJaW50IGNvdW50OworCS8qIG1lbW9yeSByYW5nZXMgdG8gYmUgc2Nhbm5lZCBpbnNpZGUgYW4gb2JqZWN0IChlbXB0eSBmb3IgYWxsKSAqLworCXN0cnVjdCBobGlzdF9oZWFkIGFyZWFfbGlzdDsKKwl1bnNpZ25lZCBsb25nIHRyYWNlW01BWF9UUkFDRV07CisJdW5zaWduZWQgaW50IHRyYWNlX2xlbjsKKwl1bnNpZ25lZCBsb25nIGppZmZpZXM7CQkvKiBjcmVhdGlvbiB0aW1lc3RhbXAgKi8KKwlwaWRfdCBwaWQ7CQkJLyogcGlkIG9mIHRoZSBjdXJyZW50IHRhc2sgKi8KKwljaGFyIGNvbW1bVEFTS19DT01NX0xFTl07CS8qIGV4ZWN1dGFibGUgbmFtZSAqLworfTsKKworLyogZmxhZyByZXByZXNlbnRpbmcgdGhlIG1lbW9yeSBibG9jayBhbGxvY2F0aW9uIHN0YXR1cyAqLworI2RlZmluZSBPQkpFQ1RfQUxMT0NBVEVECSgxIDw8IDApCisvKiBmbGFnIHNldCBhZnRlciB0aGUgZmlyc3QgcmVwb3J0aW5nIG9mIGFuIHVucmVmZXJlbmNlIG9iamVjdCAqLworI2RlZmluZSBPQkpFQ1RfUkVQT1JURUQJCSgxIDw8IDEpCisvKiBmbGFnIHNldCB0byBub3Qgc2NhbiB0aGUgb2JqZWN0ICovCisjZGVmaW5lIE9CSkVDVF9OT19TQ0FOCQkoMSA8PCAyKQorCisvKiB0aGUgbGlzdCBvZiBhbGwgYWxsb2NhdGVkIG9iamVjdHMgKi8KK3N0YXRpYyBMSVNUX0hFQUQob2JqZWN0X2xpc3QpOworLyogdGhlIGxpc3Qgb2YgZ3JheS1jb2xvcmVkIG9iamVjdHMgKHNlZSBjb2xvcl9ncmF5IGNvbW1lbnQgYmVsb3cpICovCitzdGF0aWMgTElTVF9IRUFEKGdyYXlfbGlzdCk7CisvKiBwcmlvIHNlYXJjaCB0cmVlIGZvciBvYmplY3QgYm91bmRhcmllcyAqLworc3RhdGljIHN0cnVjdCBwcmlvX3RyZWVfcm9vdCBvYmplY3RfdHJlZV9yb290OworLyogcndfbG9jayBwcm90ZWN0aW5nIHRoZSBhY2Nlc3MgdG8gb2JqZWN0X2xpc3QgYW5kIHByaW9fdHJlZV9yb290ICovCitzdGF0aWMgREVGSU5FX1JXTE9DSyhrbWVtbGVha19sb2NrKTsKKworLyogYWxsb2NhdGlvbiBjYWNoZXMgZm9yIGttZW1sZWFrIGludGVybmFsIGRhdGEgKi8KK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqb2JqZWN0X2NhY2hlOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzY2FuX2FyZWFfY2FjaGU7CisKKy8qIHNldCBpZiB0cmFjaW5nIG1lbW9yeSBvcGVyYXRpb25zIGlzIGVuYWJsZWQgKi8KK3N0YXRpYyBhdG9taWNfdCBrbWVtbGVha19lbmFibGVkID0gQVRPTUlDX0lOSVQoMCk7CisvKiBzZXQgaW4gdGhlIGxhdGVfaW5pdGNhbGwgaWYgdGhlcmUgd2VyZSBubyBlcnJvcnMgKi8KK3N0YXRpYyBhdG9taWNfdCBrbWVtbGVha19pbml0aWFsaXplZCA9IEFUT01JQ19JTklUKDApOworLyogZW5hYmxlcyBvciBkaXNhYmxlcyBlYXJseSBsb2dnaW5nIG9mIHRoZSBtZW1vcnkgb3BlcmF0aW9ucyAqLworc3RhdGljIGF0b21pY190IGttZW1sZWFrX2Vhcmx5X2xvZyA9IEFUT01JQ19JTklUKDEpOworLyogc2V0IGlmIGEgZmF0YSBrbWVtbGVhayBlcnJvciBoYXMgb2NjdXJyZWQgKi8KK3N0YXRpYyBhdG9taWNfdCBrbWVtbGVha19lcnJvciA9IEFUT01JQ19JTklUKDApOworCisvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGFkZHJlc3MgdGhhdCBtYXkgYmUgdmFsaWQgcG9pbnRlcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1pbl9hZGRyID0gVUxPTkdfTUFYOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4X2FkZHI7CisKKy8qIHVzZWQgZm9yIHlpZWxkaW5nIHRoZSBDUFUgdG8gb3RoZXIgdGFza3MgZHVyaW5nIHNjYW5uaW5nICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X3NjYW5feWllbGQ7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzY2FuX3RocmVhZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGppZmZpZXNfc2Nhbl95aWVsZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGppZmZpZXNfbWluX2FnZTsKKy8qIGRlbGF5IGJldHdlZW4gYXV0b21hdGljIG1lbW9yeSBzY2FubmluZ3MgKi8KK3N0YXRpYyBzaWduZWQgbG9uZyBqaWZmaWVzX3NjYW5fd2FpdDsKKy8qIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHRhc2sgc3RhY2tzIHNjYW5uaW5nICovCitzdGF0aWMgaW50IGttZW1sZWFrX3N0YWNrX3NjYW47CisvKiBtdXRleCBwcm90ZWN0aW5nIHRoZSBtZW1vcnkgc2Nhbm5pbmcgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoc2Nhbl9tdXRleCk7CisvKiBtdXRleCBwcm90ZWN0aW5nIHRoZSBhY2Nlc3MgdG8gdGhlIC9zeXMva2VybmVsL2RlYnVnL2ttZW1sZWFrIGZpbGUgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoa21lbWxlYWtfbXV0ZXgpOworCisvKiBudW1iZXIgb2YgbGVha3MgcmVwb3J0ZWQgKGZvciBsaW1pdGF0aW9uIHB1cnBvc2VzKSAqLworc3RhdGljIGludCByZXBvcnRlZF9sZWFrczsKKworLyoKKyAqIEVhcmx5IG9iamVjdCBhbGxvY2F0aW9uL2ZyZWVpbmcgbG9nZ2luZy4gS2ttZW1sZWFrIGlzIGluaXRpYWxpemVkIGFmdGVyIHRoZQorICoga2VybmVsIGFsbG9jYXRvci4gSG93ZXZlciwgYm90aCB0aGUga2VybmVsIGFsbG9jYXRvciBhbmQga21lbWxlYWsgbWF5CisgKiBhbGxvY2F0ZSBtZW1vcnkgYmxvY2tzIHdoaWNoIG5lZWQgdG8gYmUgdHJhY2tlZC4gS2ttZW1sZWFrIGRlZmluZXMgYW4KKyAqIGFyYml0cmFyeSBidWZmZXIgdG8gaG9sZCB0aGUgYWxsb2NhdGlvbi9mcmVlaW5nIGluZm9ybWF0aW9uIGJlZm9yZSBpdCBpcworICogZnVsbHkgaW5pdGlhbGl6ZWQuCisgKi8KKworLyoga21lbWxlYWsgb3BlcmF0aW9uIHR5cGUgZm9yIGVhcmx5IGxvZ2dpbmcgKi8KK2VudW0geworCUtNRU1MRUFLX0FMTE9DLAorCUtNRU1MRUFLX0ZSRUUsCisJS01FTUxFQUtfTk9UX0xFQUssCisJS01FTUxFQUtfSUdOT1JFLAorCUtNRU1MRUFLX1NDQU5fQVJFQSwKKwlLTUVNTEVBS19OT19TQ0FOCit9OworCisvKgorICogU3RydWN0dXJlIGhvbGRpbmcgdGhlIGluZm9ybWF0aW9uIHBhc3NlZCB0byBrbWVtbGVhayBjYWxsYmFja3MgZHVyaW5nIHRoZQorICogZWFybHkgbG9nZ2luZy4KKyAqLworc3RydWN0IGVhcmx5X2xvZyB7CisJaW50IG9wX3R5cGU7CQkJLyoga21lbWxlYWsgb3BlcmF0aW9uIHR5cGUgKi8KKwljb25zdCB2b2lkICpwdHI7CQkvKiBhbGxvY2F0ZWQvZnJlZWQgbWVtb3J5IGJsb2NrICovCisJc2l6ZV90IHNpemU7CQkJLyogbWVtb3J5IGJsb2NrIHNpemUgKi8KKwlpbnQgbWluX2NvdW50OwkJCS8qIG1pbmltdW0gcmVmZXJlbmNlIGNvdW50ICovCisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CQkvKiBzY2FuIGFyZWEgb2Zmc2V0ICovCisJc2l6ZV90IGxlbmd0aDsJCQkvKiBzY2FuIGFyZWEgbGVuZ3RoICovCit9OworCisvKiBlYXJseSBsb2dnaW5nIGJ1ZmZlciBhbmQgY3VycmVudCBwb3NpdGlvbiAqLworc3RhdGljIHN0cnVjdCBlYXJseV9sb2cgZWFybHlfbG9nWzIwMF07CitzdGF0aWMgaW50IGNydF9lYXJseV9sb2c7CisKK3N0YXRpYyB2b2lkIGttZW1sZWFrX2Rpc2FibGUodm9pZCk7CisKKy8qCisgKiBQcmludCBhIHdhcm5pbmcgYW5kIGR1bXAgdGhlIHN0YWNrIHRyYWNlLgorICovCisjZGVmaW5lIGttZW1sZWFrX3dhcm4oeC4uLikJZG8gewlcCisJcHJfd2FybmluZyh4KTsJCQlcCisJZHVtcF9zdGFjaygpOwkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBNYWNybyBpbnZva2VkIHdoZW4gYSBzZXJpb3VzIGttZW1sZWFrIGNvbmRpdGlvbiBvY2N1cmVkIGFuZCBjYW5ub3QgYmUKKyAqIHJlY292ZXJlZCBmcm9tLiBLa21lbWxlYWsgd2lsbCBiZSBkaXNhYmxlZCBhbmQgZnVydGhlciBhbGxvY2F0aW9uL2ZyZWVpbmcKKyAqIHRyYWNpbmcgbm8gbG9uZ2VyIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBrbWVtbGVha19wYW5pYyh4Li4uKQlkbyB7CVwKKwlrbWVtbGVha193YXJuKHgpOwkJXAorCWttZW1sZWFrX2Rpc2FibGUoKTsJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBPYmplY3QgY29sb3JzLCBlbmNvZGVkIHdpdGggY291bnQgYW5kIG1pbl9jb3VudDoKKyAqIC0gd2hpdGUgLSBvcnBoYW4gb2JqZWN0LCBub3QgZW5vdWdoIHJlZmVyZW5jZXMgdG8gaXQgKGNvdW50IDwgbWluX2NvdW50KQorICogLSBncmF5ICAtIG5vdCBvcnBoYW4sIG5vdCBtYXJrZWQgYXMgZmFsc2UgcG9zaXRpdmUgKG1pbl9jb3VudCA9PSAwKSBvcgorICoJCXN1ZmZpY2llbnQgcmVmZXJlbmNlcyB0byBpdCAoY291bnQgPj0gbWluX2NvdW50KQorICogLSBibGFjayAtIGlnbm9yZSwgaXQgZG9lc24ndCBjb250YWluIHJlZmVyZW5jZXMgKGUuZy4gdGV4dCBzZWN0aW9uKQorICoJCShtaW5fY291bnQgPT0gLTEpLiBObyBmdW5jdGlvbiBkZWZpbmVkIGZvciB0aGlzIGNvbG9yLgorICogTmV3bHkgY3JlYXRlZCBvYmplY3RzIGRvbid0IGhhdmUgYW55IGNvbG9yIGFzc2lnbmVkIChvYmplY3QtPmNvdW50ID09IC0xKQorICogYmVmb3JlIHRoZSBuZXh0IG1lbW9yeSBzY2FuIHdoZW4gdGhleSBiZWNvbWUgd2hpdGUuCisgKi8KK3N0YXRpYyBpbnQgY29sb3Jfd2hpdGUoY29uc3Qgc3RydWN0IGttZW1sZWFrX29iamVjdCAqb2JqZWN0KQoreworCXJldHVybiBvYmplY3QtPmNvdW50ICE9IC0xICYmIG9iamVjdC0+Y291bnQgPCBvYmplY3QtPm1pbl9jb3VudDsKK30KKworc3RhdGljIGludCBjb2xvcl9ncmF5KGNvbnN0IHN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdCkKK3sKKwlyZXR1cm4gb2JqZWN0LT5taW5fY291bnQgIT0gLTEgJiYgb2JqZWN0LT5jb3VudCA+PSBvYmplY3QtPm1pbl9jb3VudDsKK30KKworLyoKKyAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgcmVmZXJlbmNlZCBpZiB0aGVpciBjb2xvciBpcyBncmF5IGFuZCB0aGV5IGhhdmUgbm90CisgKiBiZWVuIGRlbGV0ZWQuCisgKi8KK3N0YXRpYyBpbnQgcmVmZXJlbmNlZF9vYmplY3Qoc3RydWN0IGttZW1sZWFrX29iamVjdCAqb2JqZWN0KQoreworCXJldHVybiAob2JqZWN0LT5mbGFncyAmIE9CSkVDVF9BTExPQ0FURUQpICYmIGNvbG9yX2dyYXkob2JqZWN0KTsKK30KKworLyoKKyAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgdW5yZWZlcmVuY2VkIG9ubHkgaWYgdGhlaXIgY29sb3IgaXMgd2hpdGUsIHRoZXkgaGF2ZQorICogbm90IGJlIGRlbGV0ZWQgYW5kIGhhdmUgYSBtaW5pbXVtIGFnZSB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMgY2F1c2VkIGJ5CisgKiBwb2ludGVycyB0ZW1wb3JhcmlseSBzdG9yZWQgaW4gQ1BVIHJlZ2lzdGVycy4KKyAqLworc3RhdGljIGludCB1bnJlZmVyZW5jZWRfb2JqZWN0KHN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdCkKK3sKKwlyZXR1cm4gKG9iamVjdC0+ZmxhZ3MgJiBPQkpFQ1RfQUxMT0NBVEVEKSAmJiBjb2xvcl93aGl0ZShvYmplY3QpICYmCisJCXRpbWVfaXNfYmVmb3JlX2VxX2ppZmZpZXMob2JqZWN0LT5qaWZmaWVzICsgamlmZmllc19taW5fYWdlKTsKK30KKworLyoKKyAqIFByaW50aW5nIG9mIHRoZSAodW4pcmVmZXJlbmNlZCBvYmplY3RzIGluZm9ybWF0aW9uLCBlaXRoZXIgdG8gdGhlIHNlcSBmaWxlCisgKiBvciB0byB0aGUga2VybmVsIGxvZy4gVGhlIHByaW50X3JlZmVyZW5jZWQvcHJpbnRfdW5yZWZlcmVuY2VkIGZ1bmN0aW9ucworICogbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgb2JqZWN0LT5sb2NrIGhlbGQuCisgKi8KKyNkZWZpbmUgcHJpbnRfaGVscGVyKHNlcSwgeC4uLikJZG8gewlcCisJc3RydWN0IHNlcV9maWxlICpzID0gKHNlcSk7CVwKKwlpZiAocykJCQkJXAorCQlzZXFfcHJpbnRmKHMsIHgpOwlcCisJZWxzZQkJCQlcCisJCXByX2luZm8oeCk7CQlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBwcmludF9yZWZlcmVuY2VkKHN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdCkKK3sKKwlwcl9pbmZvKCJrbWVtbGVhazogcmVmZXJlbmNlZCBvYmplY3QgMHglMDhseCAoc2l6ZSAlenUpXG4iLAorCQlvYmplY3QtPnBvaW50ZXIsIG9iamVjdC0+c2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3VucmVmZXJlbmNlZChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCSAgICAgICBzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3QpCit7CisJaW50IGk7CisKKwlwcmludF9oZWxwZXIoc2VxLCAia21lbWxlYWs6IHVucmVmZXJlbmNlZCBvYmplY3QgMHglMDhseCAoc2l6ZSAlenUpOlxuIiwKKwkJICAgICBvYmplY3QtPnBvaW50ZXIsIG9iamVjdC0+c2l6ZSk7CisJcHJpbnRfaGVscGVyKHNlcSwgIiAgY29tbSBcIiVzXCIsIHBpZCAlZCwgamlmZmllcyAlbHVcbiIsCisJCSAgICAgb2JqZWN0LT5jb21tLCBvYmplY3QtPnBpZCwgb2JqZWN0LT5qaWZmaWVzKTsKKwlwcmludF9oZWxwZXIoc2VxLCAiICBiYWNrdHJhY2U6XG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBvYmplY3QtPnRyYWNlX2xlbjsgaSsrKSB7CisJCXZvaWQgKnB0ciA9ICh2b2lkICopb2JqZWN0LT50cmFjZVtpXTsKKwkJcHJpbnRfaGVscGVyKHNlcSwgIiAgICBbPCVwPl0gJXBTXG4iLCBwdHIsIHB0cik7CisJfQorfQorCisvKgorICogUHJpbnQgdGhlIGttZW1sZWFrX29iamVjdCBpbmZvcm1hdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIG1haW5seSBmb3IKKyAqIGRlYnVnZ2luZyBzcGVjaWFsIGNhc2VzIHdoZW4ga21lbWxlYWsgb3BlcmF0aW9ucy4gSXQgbXVzdCBiZSBjYWxsZWQgd2l0aAorICogdGhlIG9iamVjdC0+bG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBkdW1wX29iamVjdF9pbmZvKHN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdCkKK3sKKwlzdHJ1Y3Qgc3RhY2tfdHJhY2UgdHJhY2U7CisKKwl0cmFjZS5ucl9lbnRyaWVzID0gb2JqZWN0LT50cmFjZV9sZW47CisJdHJhY2UuZW50cmllcyA9IG9iamVjdC0+dHJhY2U7CisKKwlwcl9ub3RpY2UoImttZW1sZWFrOiBPYmplY3QgMHglMDhseCAoc2l6ZSAlenUpOlxuIiwKKwkJICBvYmplY3QtPnRyZWVfbm9kZS5zdGFydCwgb2JqZWN0LT5zaXplKTsKKwlwcl9ub3RpY2UoIiAgY29tbSBcIiVzXCIsIHBpZCAlZCwgamlmZmllcyAlbHVcbiIsCisJCSAgb2JqZWN0LT5jb21tLCBvYmplY3QtPnBpZCwgb2JqZWN0LT5qaWZmaWVzKTsKKwlwcl9ub3RpY2UoIiAgbWluX2NvdW50ID0gJWRcbiIsIG9iamVjdC0+bWluX2NvdW50KTsKKwlwcl9ub3RpY2UoIiAgY291bnQgPSAlZFxuIiwgb2JqZWN0LT5jb3VudCk7CisJcHJfbm90aWNlKCIgIGJhY2t0cmFjZTpcbiIpOworCXByaW50X3N0YWNrX3RyYWNlKCZ0cmFjZSwgNCk7Cit9CisKKy8qCisgKiBMb29rLXVwIGEgbWVtb3J5IGJsb2NrIG1ldGFkYXRhIChrbWVtbGVha19vYmplY3QpIGluIHRoZSBwcmlvcml0eSBzZWFyY2gKKyAqIHRyZWUgYmFzZWQgb24gYSBwb2ludGVyIHZhbHVlLiBJZiBhbGlhcyBpcyAwLCBvbmx5IHZhbHVlcyBwb2ludGluZyB0byB0aGUKKyAqIGJlZ2lubmluZyBvZiB0aGUgbWVtb3J5IGJsb2NrIGFyZSBhbGxvd2VkLiBUaGUga21lbWxlYWtfbG9jayBtdXN0IGJlIGhlbGQKKyAqIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgc3RydWN0IGttZW1sZWFrX29iamVjdCAqbG9va3VwX29iamVjdCh1bnNpZ25lZCBsb25nIHB0ciwgaW50IGFsaWFzKQoreworCXN0cnVjdCBwcmlvX3RyZWVfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcHJpb190cmVlX2l0ZXIgaXRlcjsKKwlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3Q7CisKKwlwcmlvX3RyZWVfaXRlcl9pbml0KCZpdGVyLCAmb2JqZWN0X3RyZWVfcm9vdCwgcHRyLCBwdHIpOworCW5vZGUgPSBwcmlvX3RyZWVfbmV4dCgmaXRlcik7CisJaWYgKG5vZGUpIHsKKwkJb2JqZWN0ID0gcHJpb190cmVlX2VudHJ5KG5vZGUsIHN0cnVjdCBrbWVtbGVha19vYmplY3QsCisJCQkJCSB0cmVlX25vZGUpOworCQlpZiAoIWFsaWFzICYmIG9iamVjdC0+cG9pbnRlciAhPSBwdHIpIHsKKwkJCWttZW1sZWFrX3dhcm4oImttZW1sZWFrOiBGb3VuZCBvYmplY3QgYnkgYWxpYXMiKTsKKwkJCW9iamVjdCA9IE5VTEw7CisJCX0KKwl9IGVsc2UKKwkJb2JqZWN0ID0gTlVMTDsKKworCXJldHVybiBvYmplY3Q7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgdGhlIG9iamVjdCB1c2VfY291bnQuIFJldHVybiAxIGlmIHN1Y2Nlc3NmdWwgb3IgMCBvdGhlcndpc2UuIE5vdGUKKyAqIHRoYXQgb25jZSBhbiBvYmplY3QncyB1c2VfY291bnQgcmVhY2hlZCAwLCB0aGUgUkNVIGZyZWVpbmcgd2FzIGFscmVhZHkKKyAqIHJlZ2lzdGVyZWQgYW5kIHRoZSBvYmplY3Qgc2hvdWxkIG5vIGxvbmdlciBiZSB1c2VkLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUKKyAqIGNhbGxlZCB1bmRlciB0aGUgcHJvdGVjdGlvbiBvZiByY3VfcmVhZF9sb2NrKCkuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X29iamVjdChzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3QpCit7CisJcmV0dXJuIGF0b21pY19pbmNfbm90X3plcm8oJm9iamVjdC0+dXNlX2NvdW50KTsKK30KKworLyoKKyAqIFJDVSBjYWxsYmFjayB0byBmcmVlIGEga21lbWxlYWtfb2JqZWN0LgorICovCitzdGF0aWMgdm9pZCBmcmVlX29iamVjdF9yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKmVsZW0sICp0bXA7CisJc3RydWN0IGttZW1sZWFrX3NjYW5fYXJlYSAqYXJlYTsKKwlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3QgPQorCQljb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0LCByY3UpOworCisJLyoKKwkgKiBPbmNlIHVzZV9jb3VudCBpcyAwIChndWFyYW50ZWVkIGJ5IHB1dF9vYmplY3QpLCB0aGVyZSBpcyBubyBvdGhlcgorCSAqIGNvZGUgYWNjZXNzaW5nIHRoaXMgb2JqZWN0LCBoZW5jZSBubyBuZWVkIGZvciBsb2NraW5nLgorCSAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYXJlYSwgZWxlbSwgdG1wLCAmb2JqZWN0LT5hcmVhX2xpc3QsIG5vZGUpIHsKKwkJaGxpc3RfZGVsKGVsZW0pOworCQlrbWVtX2NhY2hlX2ZyZWUoc2Nhbl9hcmVhX2NhY2hlLCBhcmVhKTsKKwl9CisJa21lbV9jYWNoZV9mcmVlKG9iamVjdF9jYWNoZSwgb2JqZWN0KTsKK30KKworLyoKKyAqIERlY3JlbWVudCB0aGUgb2JqZWN0IHVzZV9jb3VudC4gT25jZSB0aGUgY291bnQgaXMgMCwgZnJlZSB0aGUgb2JqZWN0IHVzaW5nCisgKiBhbiBSQ1UgY2FsbGJhY2suIFNpbmNlIHB1dF9vYmplY3QoKSBtYXkgYmUgY2FsbGVkIHZpYSB0aGUga21lbWxlYWtfZnJlZSgpIC0+CisgKiBkZWxldGVfb2JqZWN0KCkgcGF0aCwgdGhlIGRlbGF5ZWQgUkNVIGZyZWVpbmcgZW5zdXJlcyB0aGF0IHRoZXJlIGlzIG5vCisgKiByZWN1cnNpdmUgY2FsbCB0byB0aGUga2VybmVsIGFsbG9jYXRvci4gTG9jay1sZXNzIFJDVSBvYmplY3RfbGlzdCB0cmF2ZXJzYWwKKyAqIGlzIGFsc28gcG9zc2libGUuCisgKi8KK3N0YXRpYyB2b2lkIHB1dF9vYmplY3Qoc3RydWN0IGttZW1sZWFrX29iamVjdCAqb2JqZWN0KQoreworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmb2JqZWN0LT51c2VfY291bnQpKQorCQlyZXR1cm47CisKKwkvKiBzaG91bGQgb25seSBnZXQgaGVyZSBhZnRlciBkZWxldGVfb2JqZWN0IHdhcyBjYWxsZWQgKi8KKwlXQVJOX09OKG9iamVjdC0+ZmxhZ3MgJiBPQkpFQ1RfQUxMT0NBVEVEKTsKKworCWNhbGxfcmN1KCZvYmplY3QtPnJjdSwgZnJlZV9vYmplY3RfcmN1KTsKK30KKworLyoKKyAqIExvb2sgdXAgYW4gb2JqZWN0IGluIHRoZSBwcmlvIHNlYXJjaCB0cmVlIGFuZCBpbmNyZWFzZSBpdHMgdXNlX2NvdW50LgorICovCitzdGF0aWMgc3RydWN0IGttZW1sZWFrX29iamVjdCAqZmluZF9hbmRfZ2V0X29iamVjdCh1bnNpZ25lZCBsb25nIHB0ciwgaW50IGFsaWFzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGttZW1sZWFrX29iamVjdCAqb2JqZWN0ID0gTlVMTDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlyZWFkX2xvY2tfaXJxc2F2ZSgma21lbWxlYWtfbG9jaywgZmxhZ3MpOworCWlmIChwdHIgPj0gbWluX2FkZHIgJiYgcHRyIDwgbWF4X2FkZHIpCisJCW9iamVjdCA9IGxvb2t1cF9vYmplY3QocHRyLCBhbGlhcyk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgma21lbWxlYWtfbG9jaywgZmxhZ3MpOworCisJLyogY2hlY2sgd2hldGhlciB0aGUgb2JqZWN0IGlzIHN0aWxsIGF2YWlsYWJsZSAqLworCWlmIChvYmplY3QgJiYgIWdldF9vYmplY3Qob2JqZWN0KSkKKwkJb2JqZWN0ID0gTlVMTDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBvYmplY3Q7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIG1ldGFkYXRhIChzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0KSBjb3JyZXNwb25kaW5nIHRvIGFuIGFsbG9jYXRlZAorICogbWVtb3J5IGJsb2NrIGFuZCBhZGQgaXQgdG8gdGhlIG9iamVjdF9saXN0IGFuZCBvYmplY3RfdHJlZV9yb290LgorICovCitzdGF0aWMgdm9pZCBjcmVhdGVfb2JqZWN0KHVuc2lnbmVkIGxvbmcgcHRyLCBzaXplX3Qgc2l6ZSwgaW50IG1pbl9jb3VudCwKKwkJCSAgZ2ZwX3QgZ2ZwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGttZW1sZWFrX29iamVjdCAqb2JqZWN0OworCXN0cnVjdCBwcmlvX3RyZWVfbm9kZSAqbm9kZTsKKwlzdHJ1Y3Qgc3RhY2tfdHJhY2UgdHJhY2U7CisKKwlvYmplY3QgPSBrbWVtX2NhY2hlX2FsbG9jKG9iamVjdF9jYWNoZSwgZ2ZwICYgfkdGUF9TTEFCX0JVR19NQVNLKTsKKwlpZiAoIW9iamVjdCkgeworCQlrbWVtbGVha19wYW5pYygia21lbWxlYWs6IENhbm5vdCBhbGxvY2F0ZSBhIGttZW1sZWFrX29iamVjdCAiCisJCQkgICAgICAgInN0cnVjdHVyZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmb2JqZWN0LT5vYmplY3RfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJm9iamVjdC0+Z3JheV9saXN0KTsKKwlJTklUX0hMSVNUX0hFQUQoJm9iamVjdC0+YXJlYV9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmb2JqZWN0LT5sb2NrKTsKKwlhdG9taWNfc2V0KCZvYmplY3QtPnVzZV9jb3VudCwgMSk7CisJb2JqZWN0LT5mbGFncyA9IE9CSkVDVF9BTExPQ0FURUQ7CisJb2JqZWN0LT5wb2ludGVyID0gcHRyOworCW9iamVjdC0+c2l6ZSA9IHNpemU7CisJb2JqZWN0LT5taW5fY291bnQgPSBtaW5fY291bnQ7CisJb2JqZWN0LT5jb3VudCA9IC0xOwkJCS8qIG5vIGNvbG9yIGluaXRpYWxseSAqLworCW9iamVjdC0+amlmZmllcyA9IGppZmZpZXM7CisKKwkvKiB0YXNrIGluZm9ybWF0aW9uICovCisJaWYgKGluX2lycSgpKSB7CisJCW9iamVjdC0+cGlkID0gMDsKKwkJc3RybmNweShvYmplY3QtPmNvbW0sICJoYXJkaXJxIiwgc2l6ZW9mKG9iamVjdC0+Y29tbSkpOworCX0gZWxzZSBpZiAoaW5fc29mdGlycSgpKSB7CisJCW9iamVjdC0+cGlkID0gMDsKKwkJc3RybmNweShvYmplY3QtPmNvbW0sICJzb2Z0aXJxIiwgc2l6ZW9mKG9iamVjdC0+Y29tbSkpOworCX0gZWxzZSB7CisJCW9iamVjdC0+cGlkID0gY3VycmVudC0+cGlkOworCQkvKgorCQkgKiBUaGVyZSBpcyBhIHNtYWxsIGNoYW5jZSBvZiBhIHJhY2Ugd2l0aCBzZXRfdGFza19jb21tKCksCisJCSAqIGhvd2V2ZXIgdXNpbmcgZ2V0X3Rhc2tfY29tbSgpIGhlcmUgbWF5IGNhdXNlIGxvY2tpbmcKKwkJICogZGVwZW5kZW5jeSBpc3N1ZXMgd2l0aCBjdXJyZW50LT5hbGxvY19sb2NrLiBJbiB0aGUgd29yc3QKKwkJICogY2FzZSwgdGhlIGNvbW1hbmQgbGluZSBpcyBub3QgY29ycmVjdC4KKwkJICovCisJCXN0cm5jcHkob2JqZWN0LT5jb21tLCBjdXJyZW50LT5jb21tLCBzaXplb2Yob2JqZWN0LT5jb21tKSk7CisJfQorCisJLyoga2VybmVsIGJhY2t0cmFjZSAqLworCXRyYWNlLm1heF9lbnRyaWVzID0gTUFYX1RSQUNFOworCXRyYWNlLm5yX2VudHJpZXMgPSAwOworCXRyYWNlLmVudHJpZXMgPSBvYmplY3QtPnRyYWNlOworCXRyYWNlLnNraXAgPSAxOworCXNhdmVfc3RhY2tfdHJhY2UoJnRyYWNlKTsKKwlvYmplY3QtPnRyYWNlX2xlbiA9IHRyYWNlLm5yX2VudHJpZXM7CisKKwlJTklUX1BSSU9fVFJFRV9OT0RFKCZvYmplY3QtPnRyZWVfbm9kZSk7CisJb2JqZWN0LT50cmVlX25vZGUuc3RhcnQgPSBwdHI7CisJb2JqZWN0LT50cmVlX25vZGUubGFzdCA9IHB0ciArIHNpemUgLSAxOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZrbWVtbGVha19sb2NrLCBmbGFncyk7CisJbWluX2FkZHIgPSBtaW4obWluX2FkZHIsIHB0cik7CisJbWF4X2FkZHIgPSBtYXgobWF4X2FkZHIsIHB0ciArIHNpemUpOworCW5vZGUgPSBwcmlvX3RyZWVfaW5zZXJ0KCZvYmplY3RfdHJlZV9yb290LCAmb2JqZWN0LT50cmVlX25vZGUpOworCS8qCisJICogVGhlIGNvZGUgY2FsbGluZyB0aGUga2VybmVsIGRvZXMgbm90IHlldCBoYXZlIHRoZSBwb2ludGVyIHRvIHRoZQorCSAqIG1lbW9yeSBibG9jayB0byBiZSBhYmxlIHRvIGZyZWUgaXQuICBIb3dldmVyLCB3ZSBzdGlsbCBob2xkIHRoZQorCSAqIGttZW1sZWFrX2xvY2sgaGVyZSBpbiBjYXNlIHBhcnRzIG9mIHRoZSBrZXJuZWwgc3RhcnRlZCBmcmVlaW5nCisJICogcmFuZG9tIG1lbW9yeSBibG9ja3MuCisJICovCisJaWYgKG5vZGUgIT0gJm9iamVjdC0+dHJlZV9ub2RlKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJa21lbWxlYWtfcGFuaWMoImttZW1sZWFrOiBDYW5ub3QgaW5zZXJ0IDB4JWx4IGludG8gdGhlIG9iamVjdCAiCisJCQkgICAgICAgInNlYXJjaCB0cmVlIChhbHJlYWR5IGV4aXN0aW5nKVxuIiwgcHRyKTsKKwkJb2JqZWN0ID0gbG9va3VwX29iamVjdChwdHIsIDEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CisJCWR1bXBfb2JqZWN0X2luZm8ob2JqZWN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CisKKwkJZ290byBvdXQ7CisJfQorCWxpc3RfYWRkX3RhaWxfcmN1KCZvYmplY3QtPm9iamVjdF9saXN0LCAmb2JqZWN0X2xpc3QpOworb3V0OgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZrbWVtbGVha19sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIG1ldGFkYXRhIChzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0KSBmb3IgYSBtZW1vcnkgYmxvY2sgZnJvbSB0aGUKKyAqIG9iamVjdF9saXN0IGFuZCBvYmplY3RfdHJlZV9yb290IGFuZCBkZWNyZW1lbnQgaXRzIHVzZV9jb3VudC4KKyAqLworc3RhdGljIHZvaWQgZGVsZXRlX29iamVjdCh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdDsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgma21lbWxlYWtfbG9jaywgZmxhZ3MpOworCW9iamVjdCA9IGxvb2t1cF9vYmplY3QocHRyLCAwKTsKKwlpZiAoIW9iamVjdCkgeworCQlrbWVtbGVha193YXJuKCJrbWVtbGVhazogRnJlZWluZyB1bmtub3duIG9iamVjdCBhdCAweCUwOGx4XG4iLAorCQkJICAgICAgcHRyKTsKKwkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmttZW1sZWFrX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwcmlvX3RyZWVfcmVtb3ZlKCZvYmplY3RfdHJlZV9yb290LCAmb2JqZWN0LT50cmVlX25vZGUpOworCWxpc3RfZGVsX3JjdSgmb2JqZWN0LT5vYmplY3RfbGlzdCk7CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmttZW1sZWFrX2xvY2ssIGZsYWdzKTsKKworCVdBUk5fT04oIShvYmplY3QtPmZsYWdzICYgT0JKRUNUX0FMTE9DQVRFRCkpOworCVdBUk5fT04oYXRvbWljX3JlYWQoJm9iamVjdC0+dXNlX2NvdW50KSA8IDEpOworCisJLyoKKwkgKiBMb2NraW5nIGhlcmUgYWxzbyBlbnN1cmVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgbWVtb3J5IGJsb2NrCisJICogY2Fubm90IGJlIGZyZWVkIHdoZW4gaXQgaXMgYmVpbmcgc2Nhbm5lZC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CisJaWYgKG9iamVjdC0+ZmxhZ3MgJiBPQkpFQ1RfUkVQT1JURUQpCisJCXByaW50X3JlZmVyZW5jZWQob2JqZWN0KTsKKwlvYmplY3QtPmZsYWdzICY9IH5PQkpFQ1RfQUxMT0NBVEVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOworCXB1dF9vYmplY3Qob2JqZWN0KTsKK30KKworLyoKKyAqIE1ha2UgYSBvYmplY3QgcGVybWFuZW50bHkgYXMgZ3JheS1jb2xvcmVkIHNvIHRoYXQgaXQgY2FuIG5vIGxvbmdlciBiZQorICogcmVwb3J0ZWQgYXMgYSBsZWFrLiBUaGlzIGlzIHVzZWQgaW4gZ2VuZXJhbCB0byBtYXJrIGEgZmFsc2UgcG9zaXRpdmUuCisgKi8KK3N0YXRpYyB2b2lkIG1ha2VfZ3JheV9vYmplY3QodW5zaWduZWQgbG9uZyBwdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3Q7CisKKwlvYmplY3QgPSBmaW5kX2FuZF9nZXRfb2JqZWN0KHB0ciwgMCk7CisJaWYgKCFvYmplY3QpIHsKKwkJa21lbWxlYWtfd2Fybigia21lbWxlYWs6IEdyYXlpbmcgdW5rbm93biBvYmplY3QgYXQgMHglMDhseFxuIiwKKwkJCSAgICAgIHB0cik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CisJb2JqZWN0LT5taW5fY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOworCXB1dF9vYmplY3Qob2JqZWN0KTsKK30KKworLyoKKyAqIE1hcmsgdGhlIG9iamVjdCBhcyBibGFjay1jb2xvcmVkIHNvIHRoYXQgaXQgaXMgaWdub3JlZCBmcm9tIHNjYW5zIGFuZAorICogcmVwb3J0aW5nLgorICovCitzdGF0aWMgdm9pZCBtYWtlX2JsYWNrX29iamVjdCh1bnNpZ25lZCBsb25nIHB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdDsKKworCW9iamVjdCA9IGZpbmRfYW5kX2dldF9vYmplY3QocHRyLCAwKTsKKwlpZiAoIW9iamVjdCkgeworCQlrbWVtbGVha193YXJuKCJrbWVtbGVhazogQmxhY2tpbmcgdW5rbm93biBvYmplY3QgYXQgMHglMDhseFxuIiwKKwkJCSAgICAgIHB0cik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CisJb2JqZWN0LT5taW5fY291bnQgPSAtMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmplY3QtPmxvY2ssIGZsYWdzKTsKKwlwdXRfb2JqZWN0KG9iamVjdCk7Cit9CisKKy8qCisgKiBBZGQgYSBzY2FubmluZyBhcmVhIHRvIHRoZSBvYmplY3QuIElmIGF0IGxlYXN0IG9uZSBzdWNoIGFyZWEgaXMgYWRkZWQsCisgKiBrbWVtbGVhayB3aWxsIG9ubHkgc2NhbiB0aGVzZSByYW5nZXMgcmF0aGVyIHRoYW4gdGhlIHdob2xlIG1lbW9yeSBibG9jay4KKyAqLworc3RhdGljIHZvaWQgYWRkX3NjYW5fYXJlYSh1bnNpZ25lZCBsb25nIHB0ciwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkgIHNpemVfdCBsZW5ndGgsIGdmcF90IGdmcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdDsKKwlzdHJ1Y3Qga21lbWxlYWtfc2Nhbl9hcmVhICphcmVhOworCisJb2JqZWN0ID0gZmluZF9hbmRfZ2V0X29iamVjdChwdHIsIDApOworCWlmICghb2JqZWN0KSB7CisJCWttZW1sZWFrX3dhcm4oImttZW1sZWFrOiBBZGRpbmcgc2NhbiBhcmVhIHRvIHVua25vd24gIgorCQkJICAgICAgIm9iamVjdCBhdCAweCUwOGx4XG4iLCBwdHIpOworCQlyZXR1cm47CisJfQorCisJYXJlYSA9IGttZW1fY2FjaGVfYWxsb2Moc2Nhbl9hcmVhX2NhY2hlLCBnZnAgJiB+R0ZQX1NMQUJfQlVHX01BU0spOworCWlmICghYXJlYSkgeworCQlrbWVtbGVha193YXJuKCJrbWVtbGVhazogQ2Fubm90IGFsbG9jYXRlIGEgc2NhbiBhcmVhXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOworCWlmIChvZmZzZXQgKyBsZW5ndGggPiBvYmplY3QtPnNpemUpIHsKKwkJa21lbWxlYWtfd2Fybigia21lbWxlYWs6IFNjYW4gYXJlYSBsYXJnZXIgdGhhbiBvYmplY3QgIgorCQkJICAgICAgIjB4JTA4bHhcbiIsIHB0cik7CisJCWR1bXBfb2JqZWN0X2luZm8ob2JqZWN0KTsKKwkJa21lbV9jYWNoZV9mcmVlKHNjYW5fYXJlYV9jYWNoZSwgYXJlYSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlJTklUX0hMSVNUX05PREUoJmFyZWEtPm5vZGUpOworCWFyZWEtPm9mZnNldCA9IG9mZnNldDsKKwlhcmVhLT5sZW5ndGggPSBsZW5ndGg7CisKKwlobGlzdF9hZGRfaGVhZCgmYXJlYS0+bm9kZSwgJm9iamVjdC0+YXJlYV9saXN0KTsKK291dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CitvdXQ6CisJcHV0X29iamVjdChvYmplY3QpOworfQorCisvKgorICogU2V0IHRoZSBPQkpFQ1RfTk9fU0NBTiBmbGFnIGZvciB0aGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmUKKyAqIHBvaW50ZXIuIFN1Y2ggb2JqZWN0IHdpbGwgbm90IGJlIHNjYW5uZWQgYnkga21lbWxlYWsgYnV0IHJlZmVyZW5jZXMgdG8gaXQKKyAqIGFyZSBzZWFyY2hlZC4KKyAqLworc3RhdGljIHZvaWQgb2JqZWN0X25vX3NjYW4odW5zaWduZWQgbG9uZyBwdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3Q7CisKKwlvYmplY3QgPSBmaW5kX2FuZF9nZXRfb2JqZWN0KHB0ciwgMCk7CisJaWYgKCFvYmplY3QpIHsKKwkJa21lbWxlYWtfd2Fybigia21lbWxlYWs6IE5vdCBzY2FubmluZyB1bmtub3duIG9iamVjdCBhdCAiCisJCQkgICAgICAiMHglMDhseFxuIiwgcHRyKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZvYmplY3QtPmxvY2ssIGZsYWdzKTsKKwlvYmplY3QtPmZsYWdzIHw9IE9CSkVDVF9OT19TQ0FOOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOworCXB1dF9vYmplY3Qob2JqZWN0KTsKK30KKworLyoKKyAqIExvZyBhbiBlYXJseSBrbWVtbGVha18qIGNhbGwgdG8gdGhlIGVhcmx5X2xvZyBidWZmZXIuIFRoZXNlIGNhbGxzIHdpbGwgYmUKKyAqIHByb2Nlc3NlZCBsYXRlciBvbmNlIGttZW1sZWFrIGlzIGZ1bGx5IGluaXRpYWxpemVkLgorICovCitzdGF0aWMgdm9pZCBsb2dfZWFybHkoaW50IG9wX3R5cGUsIGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCisJCSAgICAgIGludCBtaW5fY291bnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGVhcmx5X2xvZyAqbG9nOworCisJaWYgKGNydF9lYXJseV9sb2cgPj0gQVJSQVlfU0laRShlYXJseV9sb2cpKSB7CisJCWttZW1sZWFrX3BhbmljKCJrbWVtbGVhazogRWFybHkgbG9nIGJ1ZmZlciBleGNlZWRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFRoZXJlIGlzIG5vIG5lZWQgZm9yIGxvY2tpbmcgc2luY2UgdGhlIGtlcm5lbCBpcyBzdGlsbCBpbiBVUCBtb2RlCisJICogYXQgdGhpcyBzdGFnZS4gRGlzYWJsaW5nIHRoZSBJUlFzIGlzIGVub3VnaC4KKwkgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9nID0gJmVhcmx5X2xvZ1tjcnRfZWFybHlfbG9nXTsKKwlsb2ctPm9wX3R5cGUgPSBvcF90eXBlOworCWxvZy0+cHRyID0gcHRyOworCWxvZy0+c2l6ZSA9IHNpemU7CisJbG9nLT5taW5fY291bnQgPSBtaW5fY291bnQ7CisJbG9nLT5vZmZzZXQgPSBvZmZzZXQ7CisJbG9nLT5sZW5ndGggPSBsZW5ndGg7CisJY3J0X2Vhcmx5X2xvZysrOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIE1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uIGNhbGxiYWNrLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZQorICoga2VybmVsIGFsbG9jYXRvcnMgd2hlbiBhIG5ldyBibG9jayBpcyBhbGxvY2F0ZWQgKGttZW1fY2FjaGVfYWxsb2MsIGttYWxsb2MsCisgKiB2bWFsbG9jIGV0Yy4pLgorICovCit2b2lkIGttZW1sZWFrX2FsbG9jKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIGludCBtaW5fY291bnQsIGdmcF90IGdmcCkKK3sKKwlwcl9kZWJ1ZygiJXMoMHglcCwgJXp1LCAlZClcbiIsIF9fZnVuY19fLCBwdHIsIHNpemUsIG1pbl9jb3VudCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmttZW1sZWFrX2VuYWJsZWQpICYmIHB0ciAmJiAhSVNfRVJSKHB0cikpCisJCWNyZWF0ZV9vYmplY3QoKHVuc2lnbmVkIGxvbmcpcHRyLCBzaXplLCBtaW5fY291bnQsIGdmcCk7CisJZWxzZSBpZiAoYXRvbWljX3JlYWQoJmttZW1sZWFrX2Vhcmx5X2xvZykpCisJCWxvZ19lYXJseShLTUVNTEVBS19BTExPQywgcHRyLCBzaXplLCBtaW5fY291bnQsIDAsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa21lbWxlYWtfYWxsb2MpOworCisvKgorICogTWVtb3J5IGZyZWVpbmcgZnVuY3Rpb24gY2FsbGJhY2suIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGtlcm5lbAorICogYWxsb2NhdG9ycyB3aGVuIGEgYmxvY2sgaXMgZnJlZWQgKGttZW1fY2FjaGVfZnJlZSwga2ZyZWUsIHZmcmVlIGV0Yy4pLgorICovCit2b2lkIGttZW1sZWFrX2ZyZWUoY29uc3Qgdm9pZCAqcHRyKQoreworCXByX2RlYnVnKCIlcygweCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisKKwlpZiAoYXRvbWljX3JlYWQoJmttZW1sZWFrX2VuYWJsZWQpICYmIHB0ciAmJiAhSVNfRVJSKHB0cikpCisJCWRlbGV0ZV9vYmplY3QoKHVuc2lnbmVkIGxvbmcpcHRyKTsKKwllbHNlIGlmIChhdG9taWNfcmVhZCgma21lbWxlYWtfZWFybHlfbG9nKSkKKwkJbG9nX2Vhcmx5KEtNRU1MRUFLX0ZSRUUsIHB0ciwgMCwgMCwgMCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrbWVtbGVha19mcmVlKTsKKworLyoKKyAqIE1hcmsgYW4gYWxyZWFkeSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIGFzIGEgZmFsc2UgcG9zaXRpdmUuIFRoaXMgd2lsbCBjYXVzZQorICogdGhlIGJsb2NrIHRvIG5vIGxvbmdlciBiZSByZXBvcnRlZCBhcyBsZWFrIGFuZCBhbHdheXMgYmUgc2Nhbm5lZC4KKyAqLwordm9pZCBrbWVtbGVha19ub3RfbGVhayhjb25zdCB2b2lkICpwdHIpCit7CisJcHJfZGVidWcoIiVzKDB4JXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworCWlmIChhdG9taWNfcmVhZCgma21lbWxlYWtfZW5hYmxlZCkgJiYgcHRyICYmICFJU19FUlIocHRyKSkKKwkJbWFrZV9ncmF5X29iamVjdCgodW5zaWduZWQgbG9uZylwdHIpOworCWVsc2UgaWYgKGF0b21pY19yZWFkKCZrbWVtbGVha19lYXJseV9sb2cpKQorCQlsb2dfZWFybHkoS01FTUxFQUtfTk9UX0xFQUssIHB0ciwgMCwgMCwgMCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGttZW1sZWFrX25vdF9sZWFrKTsKKworLyoKKyAqIElnbm9yZSBhIG1lbW9yeSBibG9jay4gVGhpcyBpcyB1c3VhbGx5IGRvbmUgd2hlbiBpdCBpcyBrbm93biB0aGF0IHRoZQorICogY29ycmVzcG9uZGluZyBibG9jayBpcyBub3QgYSBsZWFrIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSByZWZlcmVuY2VzIHRvCisgKiBvdGhlciBhbGxvY2F0ZWQgbWVtb3J5IGJsb2Nrcy4KKyAqLwordm9pZCBrbWVtbGVha19pZ25vcmUoY29uc3Qgdm9pZCAqcHRyKQoreworCXByX2RlYnVnKCIlcygweCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisKKwlpZiAoYXRvbWljX3JlYWQoJmttZW1sZWFrX2VuYWJsZWQpICYmIHB0ciAmJiAhSVNfRVJSKHB0cikpCisJCW1ha2VfYmxhY2tfb2JqZWN0KCh1bnNpZ25lZCBsb25nKXB0cik7CisJZWxzZSBpZiAoYXRvbWljX3JlYWQoJmttZW1sZWFrX2Vhcmx5X2xvZykpCisJCWxvZ19lYXJseShLTUVNTEVBS19JR05PUkUsIHB0ciwgMCwgMCwgMCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKGttZW1sZWFrX2lnbm9yZSk7CisKKy8qCisgKiBMaW1pdCB0aGUgcmFuZ2UgdG8gYmUgc2Nhbm5lZCBpbiBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLgorICovCit2b2lkIGttZW1sZWFrX3NjYW5fYXJlYShjb25zdCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoLAorCQkJZ2ZwX3QgZ2ZwKQoreworCXByX2RlYnVnKCIlcygweCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisKKwlpZiAoYXRvbWljX3JlYWQoJmttZW1sZWFrX2VuYWJsZWQpICYmIHB0ciAmJiAhSVNfRVJSKHB0cikpCisJCWFkZF9zY2FuX2FyZWEoKHVuc2lnbmVkIGxvbmcpcHRyLCBvZmZzZXQsIGxlbmd0aCwgZ2ZwKTsKKwllbHNlIGlmIChhdG9taWNfcmVhZCgma21lbWxlYWtfZWFybHlfbG9nKSkKKwkJbG9nX2Vhcmx5KEtNRU1MRUFLX1NDQU5fQVJFQSwgcHRyLCAwLCAwLCBvZmZzZXQsIGxlbmd0aCk7Cit9CitFWFBPUlRfU1lNQk9MKGttZW1sZWFrX3NjYW5fYXJlYSk7CisKKy8qCisgKiBJbmZvcm0ga21lbWxlYWsgbm90IHRvIHNjYW4gdGhlIGdpdmVuIG1lbW9yeSBibG9jay4KKyAqLwordm9pZCBrbWVtbGVha19ub19zY2FuKGNvbnN0IHZvaWQgKnB0cikKK3sKKwlwcl9kZWJ1ZygiJXMoMHglcClcbiIsIF9fZnVuY19fLCBwdHIpOworCisJaWYgKGF0b21pY19yZWFkKCZrbWVtbGVha19lbmFibGVkKSAmJiBwdHIgJiYgIUlTX0VSUihwdHIpKQorCQlvYmplY3Rfbm9fc2NhbigodW5zaWduZWQgbG9uZylwdHIpOworCWVsc2UgaWYgKGF0b21pY19yZWFkKCZrbWVtbGVha19lYXJseV9sb2cpKQorCQlsb2dfZWFybHkoS01FTUxFQUtfTk9fU0NBTiwgcHRyLCAwLCAwLCAwLCAwKTsKK30KK0VYUE9SVF9TWU1CT0woa21lbWxlYWtfbm9fc2Nhbik7CisKKy8qCisgKiBZaWVsZCB0aGUgQ1BVIHNvIHRoYXQgb3RoZXIgdGFza3MgZ2V0IGEgY2hhbmNlIHRvIHJ1bi4gIFRoZSB5aWVsZGluZyBpcworICogcmF0ZS1saW1pdGVkIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBudW1iZXIgb2YgY2FsbHMgdG8gdGhlIHNjaGVkdWxlKCkgZnVuY3Rpb24KKyAqIGR1cmluZyBtZW1vcnkgc2Nhbm5pbmcuCisgKi8KK3N0YXRpYyB2b2lkIHNjYW5feWllbGQodm9pZCkKK3sKKwltaWdodF9zbGVlcCgpOworCisJaWYgKHRpbWVfaXNfYmVmb3JlX2VxX2ppZmZpZXMobmV4dF9zY2FuX3lpZWxkKSkgeworCQlzY2hlZHVsZSgpOworCQluZXh0X3NjYW5feWllbGQgPSBqaWZmaWVzICsgamlmZmllc19zY2FuX3lpZWxkOworCX0KK30KKworLyoKKyAqIE1lbW9yeSBzY2FubmluZyBpcyBhIGxvbmcgcHJvY2VzcyBhbmQgaXQgbmVlZHMgdG8gYmUgaW50ZXJydXB0YWJsZS4gVGhpcworICogZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgc3VjaCBpbnRlcnJ1cHQgY29uZGl0aW9uIG9jY3VyZWQuCisgKi8KK3N0YXRpYyBpbnQgc2Nhbl9zaG91bGRfc3RvcCh2b2lkKQoreworCWlmICghYXRvbWljX3JlYWQoJmttZW1sZWFrX2VuYWJsZWQpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGZyb20gZWl0aGVyIHByb2Nlc3Mgb3Iga3RocmVhZCBjb250ZXh0LAorCSAqIGhlbmNlIHRoZSBuZWVkIHRvIGNoZWNrIGZvciBib3RoIHN0b3AgY29uZGl0aW9ucy4KKwkgKi8KKwlpZiAoY3VycmVudC0+bW0pCisJCXJldHVybiBzaWduYWxfcGVuZGluZyhjdXJyZW50KTsKKwllbHNlCisJCXJldHVybiBrdGhyZWFkX3Nob3VsZF9zdG9wKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNjYW4gYSBtZW1vcnkgYmxvY2sgKGV4Y2x1c2l2ZSByYW5nZSkgZm9yIHZhbGlkIHBvaW50ZXJzIGFuZCBhZGQgdGhvc2UKKyAqIGZvdW5kIHRvIHRoZSBncmF5IGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIHNjYW5fYmxvY2sodm9pZCAqX3N0YXJ0LCB2b2lkICpfZW5kLAorCQkgICAgICAgc3RydWN0IGttZW1sZWFrX29iamVjdCAqc2Nhbm5lZCkKK3sKKwl1bnNpZ25lZCBsb25nICpwdHI7CisJdW5zaWduZWQgbG9uZyAqc3RhcnQgPSBQVFJfQUxJR04oX3N0YXJ0LCBCWVRFU19QRVJfUE9JTlRFUik7CisJdW5zaWduZWQgbG9uZyAqZW5kID0gX2VuZCAtIChCWVRFU19QRVJfUE9JTlRFUiAtIDEpOworCisJZm9yIChwdHIgPSBzdGFydDsgcHRyIDwgZW5kOyBwdHIrKykgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl1bnNpZ25lZCBsb25nIHBvaW50ZXIgPSAqcHRyOworCQlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3Q7CisKKwkJaWYgKHNjYW5fc2hvdWxkX3N0b3AoKSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdoZW4gc2Nhbm5pbmcgYSBtZW1vcnkgYmxvY2sgd2l0aCBhIGNvcnJlc3BvbmRpbmcKKwkJICoga21lbWxlYWtfb2JqZWN0LCB0aGUgQ1BVIHlpZWxkaW5nIGlzIGhhbmRsZWQgaW4gdGhlIGNhbGxpbmcKKwkJICogY29kZSBzaW5jZSBpdCBob2xkcyB0aGUgb2JqZWN0LT5sb2NrIHRvIGF2b2lkIHRoZSBibG9jaworCQkgKiBmcmVlaW5nLgorCQkgKi8KKwkJaWYgKCFzY2FubmVkKQorCQkJc2Nhbl95aWVsZCgpOworCisJCW9iamVjdCA9IGZpbmRfYW5kX2dldF9vYmplY3QocG9pbnRlciwgMSk7CisJCWlmICghb2JqZWN0KQorCQkJY29udGludWU7CisJCWlmIChvYmplY3QgPT0gc2Nhbm5lZCkgeworCQkJLyogc2VsZiByZWZlcmVuY2VkLCBpZ25vcmUgKi8KKwkJCXB1dF9vYmplY3Qob2JqZWN0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogQXZvaWQgdGhlIGxvY2tkZXAgcmVjdXJzaXZlIHdhcm5pbmcgb24gb2JqZWN0LT5sb2NrIGJlaW5nCisJCSAqIHByZXZpb3VzbHkgYWNxdWlyZWQgaW4gc2Nhbl9vYmplY3QoKS4gVGhlc2UgbG9ja3MgYXJlCisJCSAqIGVuY2xvc2VkIGJ5IHNjYW5fbXV0ZXguCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZV9uZXN0ZWQoJm9iamVjdC0+bG9jaywgZmxhZ3MsCisJCQkJCSBTSU5HTEVfREVQVEhfTkVTVElORyk7CisJCWlmICghY29sb3Jfd2hpdGUob2JqZWN0KSkgeworCQkJLyogbm9uLW9ycGhhbiwgaWdub3JlZCBvciBuZXcgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOworCQkJcHV0X29iamVjdChvYmplY3QpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBJbmNyZWFzZSB0aGUgb2JqZWN0J3MgcmVmZXJlbmNlIGNvdW50IChudW1iZXIgb2YgcG9pbnRlcnMKKwkJICogdG8gdGhlIG1lbW9yeSBibG9jaykuIElmIHRoaXMgY291bnQgcmVhY2hlcyB0aGUgcmVxdWlyZWQKKwkJICogbWluaW11bSwgdGhlIG9iamVjdCdzIGNvbG9yIHdpbGwgYmVjb21lIGdyYXkgYW5kIGl0IHdpbGwgYmUKKwkJICogYWRkZWQgdG8gdGhlIGdyYXlfbGlzdC4KKwkJICovCisJCW9iamVjdC0+Y291bnQrKzsKKwkJaWYgKGNvbG9yX2dyYXkob2JqZWN0KSkKKwkJCWxpc3RfYWRkX3RhaWwoJm9iamVjdC0+Z3JheV9saXN0LCAmZ3JheV9saXN0KTsKKwkJZWxzZQorCQkJcHV0X29iamVjdChvYmplY3QpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmplY3QtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qCisgKiBTY2FuIGEgbWVtb3J5IGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gYSBrbWVtbGVha19vYmplY3QuIEEgY29uZGl0aW9uIGlzCisgKiB0aGF0IG9iamVjdC0+dXNlX2NvdW50ID49IDEuCisgKi8KK3N0YXRpYyB2b2lkIHNjYW5fb2JqZWN0KHN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdCkKK3sKKwlzdHJ1Y3Qga21lbWxlYWtfc2Nhbl9hcmVhICphcmVhOworCXN0cnVjdCBobGlzdF9ub2RlICplbGVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIE9uY2UgdGhlIG9iamVjdC0+bG9jayBpcyBhcXVpcmVkLCB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgYmxvY2sKKwkgKiBjYW5ub3QgYmUgZnJlZWQgKHRoZSBzYW1lIGxvY2sgaXMgYXF1aXJlZCBpbiBkZWxldGVfb2JqZWN0KS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CisJaWYgKG9iamVjdC0+ZmxhZ3MgJiBPQkpFQ1RfTk9fU0NBTikKKwkJZ290byBvdXQ7CisJaWYgKCEob2JqZWN0LT5mbGFncyAmIE9CSkVDVF9BTExPQ0FURUQpKQorCQkvKiBhbHJlYWR5IGZyZWVkIG9iamVjdCAqLworCQlnb3RvIG91dDsKKwlpZiAoaGxpc3RfZW1wdHkoJm9iamVjdC0+YXJlYV9saXN0KSkKKwkJc2Nhbl9ibG9jaygodm9pZCAqKW9iamVjdC0+cG9pbnRlciwKKwkJCSAgICh2b2lkICopKG9iamVjdC0+cG9pbnRlciArIG9iamVjdC0+c2l6ZSksIG9iamVjdCk7CisJZWxzZQorCQlobGlzdF9mb3JfZWFjaF9lbnRyeShhcmVhLCBlbGVtLCAmb2JqZWN0LT5hcmVhX2xpc3QsIG5vZGUpCisJCQlzY2FuX2Jsb2NrKCh2b2lkICopKG9iamVjdC0+cG9pbnRlciArIGFyZWEtPm9mZnNldCksCisJCQkJICAgKHZvaWQgKikob2JqZWN0LT5wb2ludGVyICsgYXJlYS0+b2Zmc2V0CisJCQkJCSAgICArIGFyZWEtPmxlbmd0aCksIG9iamVjdCk7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBTY2FuIGRhdGEgc2VjdGlvbnMgYW5kIGFsbCB0aGUgcmVmZXJlbmNlZCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCB2aWEgdGhlCisgKiBrZXJuZWwncyBzdGFuZGFyZCBhbGxvY2F0b3JzLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlCisgKiBzY2FuX211dGV4IGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGttZW1sZWFrX3NjYW4odm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBrbWVtbGVha19vYmplY3QgKm9iamVjdCwgKnRtcDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJaW50IGk7CisKKwkvKiBwcmVwYXJlIHRoZSBrbWVtbGVha19vYmplY3QncyAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShvYmplY3QsICZvYmplY3RfbGlzdCwgb2JqZWN0X2xpc3QpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOworI2lmZGVmIERFQlVHCisJCS8qCisJCSAqIFdpdGggYSBmZXcgZXhjZXB0aW9ucyB0aGVyZSBzaG91bGQgYmUgYSBtYXhpbXVtIG9mCisJCSAqIDEgcmVmZXJlbmNlIHRvIGFueSBvYmplY3QgYXQgdGhpcyBwb2ludC4KKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmb2JqZWN0LT51c2VfY291bnQpID4gMSkgeworCQkJcHJfZGVidWcoImttZW1sZWFrOiBvYmplY3QtPnVzZV9jb3VudCA9ICVkXG4iLAorCQkJCSBhdG9taWNfcmVhZCgmb2JqZWN0LT51c2VfY291bnQpKTsKKwkJCWR1bXBfb2JqZWN0X2luZm8ob2JqZWN0KTsKKwkJfQorI2VuZGlmCisJCS8qIHJlc2V0IHRoZSByZWZlcmVuY2UgY291bnQgKHdoaXRlbiB0aGUgb2JqZWN0KSAqLworCQlvYmplY3QtPmNvdW50ID0gMDsKKwkJaWYgKGNvbG9yX2dyYXkob2JqZWN0KSAmJiBnZXRfb2JqZWN0KG9iamVjdCkpCisJCQlsaXN0X2FkZF90YWlsKCZvYmplY3QtPmdyYXlfbGlzdCwgJmdyYXlfbGlzdCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJLyogZGF0YS9ic3Mgc2Nhbm5pbmcgKi8KKwlzY2FuX2Jsb2NrKF9zZGF0YSwgX2VkYXRhLCBOVUxMKTsKKwlzY2FuX2Jsb2NrKF9fYnNzX3N0YXJ0LCBfX2Jzc19zdG9wLCBOVUxMKTsKKworI2lmZGVmIENPTkZJR19TTVAKKwkvKiBwZXItY3B1IHNlY3Rpb25zIHNjYW5uaW5nICovCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCXNjYW5fYmxvY2soX19wZXJfY3B1X3N0YXJ0ICsgcGVyX2NwdV9vZmZzZXQoaSksCisJCQkgICBfX3Blcl9jcHVfZW5kICsgcGVyX2NwdV9vZmZzZXQoaSksIE5VTEwpOworI2VuZGlmCisKKwkvKgorCSAqIFN0cnVjdCBwYWdlIHNjYW5uaW5nIGZvciBlYWNoIG5vZGUuIFRoZSBjb2RlIGJlbG93IGlzIG5vdCB5ZXQgc2FmZQorCSAqIHdpdGggTUVNT1JZX0hPVFBMVUcuCisJICovCisJZm9yX2VhY2hfb25saW5lX25vZGUoaSkgeworCQlwZ19kYXRhX3QgKnBnZGF0ID0gTk9ERV9EQVRBKGkpOworCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IHBnZGF0LT5ub2RlX3N0YXJ0X3BmbjsKKwkJdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gc3RhcnRfcGZuICsgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsKKwkJdW5zaWduZWQgbG9uZyBwZm47CisKKwkJZm9yIChwZm4gPSBzdGFydF9wZm47IHBmbiA8IGVuZF9wZm47IHBmbisrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQkJaWYgKCFwZm5fdmFsaWQocGZuKSkKKwkJCQljb250aW51ZTsKKwkJCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCQkJLyogb25seSBzY2FuIGlmIHBhZ2UgaXMgaW4gdXNlICovCisJCQlpZiAocGFnZV9jb3VudChwYWdlKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJc2Nhbl9ibG9jayhwYWdlLCBwYWdlICsgMSwgTlVMTCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNjYW5uaW5nIHRoZSB0YXNrIHN0YWNrcyBtYXkgaW50cm9kdWNlIGZhbHNlIG5lZ2F0aXZlcyBhbmQgaXQgaXMKKwkgKiBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgorCSAqLworCWlmIChrbWVtbGVha19zdGFja19zY2FuKSB7CisJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJCWZvcl9lYWNoX3Byb2Nlc3ModGFzaykKKwkJCXNjYW5fYmxvY2sodGFza19zdGFja19wYWdlKHRhc2spLAorCQkJCSAgIHRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIFRIUkVBRF9TSVpFLCBOVUxMKTsKKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCX0KKworCS8qCisJICogU2NhbiB0aGUgb2JqZWN0cyBhbHJlYWR5IHJlZmVyZW5jZWQgZnJvbSB0aGUgc2VjdGlvbnMgc2Nhbm5lZAorCSAqIGFib3ZlLiBNb3JlIG9iamVjdHMgd2lsbCBiZSByZWZlcmVuY2VkIGFuZCwgaWYgdGhlcmUgYXJlIG5vIG1lbW9yeQorCSAqIGxlYWtzLCBhbGwgdGhlIG9iamVjdHMgd2lsbCBiZSBzY2FubmVkLiBUaGUgbGlzdCB0cmF2ZXJzYWwgaXMgc2FmZQorCSAqIGZvciBib3RoIHRhaWwgYWRkaXRpb25zIGFuZCByZW1vdmFscyBmcm9tIGluc2lkZSB0aGUgbG9vcC4gVGhlCisJICoga21lbWxlYWsgb2JqZWN0cyBjYW5ub3QgYmUgZnJlZWQgZnJvbSBvdXRzaWRlIHRoZSBsb29wIGJlY2F1c2UgdGhlaXIKKwkgKiB1c2VfY291bnQgd2FzIGluY3JlYXNlZC4KKwkgKi8KKwlvYmplY3QgPSBsaXN0X2VudHJ5KGdyYXlfbGlzdC5uZXh0LCB0eXBlb2YoKm9iamVjdCksIGdyYXlfbGlzdCk7CisJd2hpbGUgKCZvYmplY3QtPmdyYXlfbGlzdCAhPSAmZ3JheV9saXN0KSB7CisJCXNjYW5feWllbGQoKTsKKworCQkvKiBtYXkgYWRkIG5ldyBvYmplY3RzIHRvIHRoZSBsaXN0ICovCisJCWlmICghc2Nhbl9zaG91bGRfc3RvcCgpKQorCQkJc2Nhbl9vYmplY3Qob2JqZWN0KTsKKworCQl0bXAgPSBsaXN0X2VudHJ5KG9iamVjdC0+Z3JheV9saXN0Lm5leHQsIHR5cGVvZigqb2JqZWN0KSwKKwkJCQkgZ3JheV9saXN0KTsKKworCQkvKiByZW1vdmUgdGhlIG9iamVjdCBmcm9tIHRoZSBsaXN0IGFuZCByZWxlYXNlIGl0ICovCisJCWxpc3RfZGVsKCZvYmplY3QtPmdyYXlfbGlzdCk7CisJCXB1dF9vYmplY3Qob2JqZWN0KTsKKworCQlvYmplY3QgPSB0bXA7CisJfQorCVdBUk5fT04oIWxpc3RfZW1wdHkoJmdyYXlfbGlzdCkpOworfQorCisvKgorICogVGhyZWFkIGZ1bmN0aW9uIHBlcmZvcm1pbmcgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZy4gVW5yZWZlcmVuY2VkIG9iamVjdHMKKyAqIGF0IHRoZSBlbmQgb2YgYSBtZW1vcnkgc2NhbiBhcmUgcmVwb3J0ZWQgYnV0IG9ubHkgdGhlIGZpcnN0IHRpbWUuCisgKi8KK3N0YXRpYyBpbnQga21lbWxlYWtfc2Nhbl90aHJlYWQodm9pZCAqYXJnKQoreworCXN0YXRpYyBpbnQgZmlyc3RfcnVuID0gMTsKKworCXByX2luZm8oImttZW1sZWFrOiBBdXRvbWF0aWMgbWVtb3J5IHNjYW5uaW5nIHRocmVhZCBzdGFydGVkXG4iKTsKKworCS8qCisJICogV2FpdCBiZWZvcmUgdGhlIGZpcnN0IHNjYW4gdG8gYWxsb3cgdGhlIHN5c3RlbSB0byBmdWxseSBpbml0aWFsaXplLgorCSAqLworCWlmIChmaXJzdF9ydW4pIHsKKwkJZmlyc3RfcnVuID0gMDsKKwkJc3NsZWVwKFNFQ1NfRklSU1RfU0NBTik7CisJfQorCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJc3RydWN0IGttZW1sZWFrX29iamVjdCAqb2JqZWN0OworCQlzaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllc19zY2FuX3dhaXQ7CisKKwkJbXV0ZXhfbG9jaygmc2Nhbl9tdXRleCk7CisKKwkJa21lbWxlYWtfc2NhbigpOworCQlyZXBvcnRlZF9sZWFrcyA9IDA7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShvYmplY3QsICZvYmplY3RfbGlzdCwgb2JqZWN0X2xpc3QpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCWlmIChyZXBvcnRlZF9sZWFrcyA+PSBSRVBPUlRTX05SKQorCQkJCWJyZWFrOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOworCQkJaWYgKCEob2JqZWN0LT5mbGFncyAmIE9CSkVDVF9SRVBPUlRFRCkgJiYKKwkJCSAgICB1bnJlZmVyZW5jZWRfb2JqZWN0KG9iamVjdCkpIHsKKwkJCQlwcmludF91bnJlZmVyZW5jZWQoTlVMTCwgb2JqZWN0KTsKKwkJCQlvYmplY3QtPmZsYWdzIHw9IE9CSkVDVF9SRVBPUlRFRDsKKwkJCQlyZXBvcnRlZF9sZWFrcysrOworCQkJfSBlbHNlIGlmICgob2JqZWN0LT5mbGFncyAmIE9CSkVDVF9SRVBPUlRFRCkgJiYKKwkJCQkgICByZWZlcmVuY2VkX29iamVjdChvYmplY3QpKSB7CisJCQkJcHJpbnRfcmVmZXJlbmNlZChvYmplY3QpOworCQkJCW9iamVjdC0+ZmxhZ3MgJj0gfk9CSkVDVF9SRVBPUlRFRDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9iamVjdC0+bG9jaywgZmxhZ3MpOworCQl9CisJCXJjdV9yZWFkX3VubG9jaygpOworCisJCW11dGV4X3VubG9jaygmc2Nhbl9tdXRleCk7CisJCS8qIHdhaXQgYmVmb3JlIHRoZSBuZXh0IHNjYW4gKi8KKwkJd2hpbGUgKHRpbWVvdXQgJiYgIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CisJfQorCisJcHJfaW5mbygia21lbWxlYWs6IEF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkIGVuZGVkXG4iKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU3RhcnQgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCisgKiB3aXRoIHRoZSBrbWVtbGVha19tdXRleCBoZWxkLgorICovCit2b2lkIHN0YXJ0X3NjYW5fdGhyZWFkKHZvaWQpCit7CisJaWYgKHNjYW5fdGhyZWFkKQorCQlyZXR1cm47CisJc2Nhbl90aHJlYWQgPSBrdGhyZWFkX3J1bihrbWVtbGVha19zY2FuX3RocmVhZCwgTlVMTCwgImttZW1sZWFrIik7CisJaWYgKElTX0VSUihzY2FuX3RocmVhZCkpIHsKKwkJcHJfd2FybmluZygia21lbWxlYWs6IEZhaWxlZCB0byBjcmVhdGUgdGhlIHNjYW4gdGhyZWFkXG4iKTsKKwkJc2Nhbl90aHJlYWQgPSBOVUxMOworCX0KK30KKworLyoKKyAqIFN0b3AgdGhlIGF1dG9tYXRpYyBtZW1vcnkgc2Nhbm5pbmcgdGhyZWFkLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkCisgKiB3aXRoIHRoZSBrbWVtbGVha19tdXRleCBoZWxkLgorICovCit2b2lkIHN0b3Bfc2Nhbl90aHJlYWQodm9pZCkKK3sKKwlpZiAoc2Nhbl90aHJlYWQpIHsKKwkJa3RocmVhZF9zdG9wKHNjYW5fdGhyZWFkKTsKKwkJc2Nhbl90aHJlYWQgPSBOVUxMOworCX0KK30KKworLyoKKyAqIEl0ZXJhdGUgb3ZlciB0aGUgb2JqZWN0X2xpc3QgYW5kIHJldHVybiB0aGUgZmlyc3QgdmFsaWQgb2JqZWN0IGF0IG9yIGFmdGVyCisgKiB0aGUgcmVxdWlyZWQgcG9zaXRpb24gd2l0aCBpdHMgdXNlX2NvdW50IGluY3JlbWVudGVkLiBUaGUgZnVuY3Rpb24gdHJpZ2dlcnMKKyAqIGEgbWVtb3J5IHNjYW5uaW5nIHdoZW4gdGhlIHBvcyBhcmd1bWVudCBwb2ludHMgdG8gdGhlIGZpcnN0IHBvc2l0aW9uLgorICovCitzdGF0aWMgdm9pZCAqa21lbWxlYWtfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3Q7CisJbG9mZl90IG4gPSAqcG9zOworCisJaWYgKCFuKSB7CisJCWttZW1sZWFrX3NjYW4oKTsKKwkJcmVwb3J0ZWRfbGVha3MgPSAwOworCX0KKwlpZiAocmVwb3J0ZWRfbGVha3MgPj0gUkVQT1JUU19OUikKKwkJcmV0dXJuIE5VTEw7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uob2JqZWN0LCAmb2JqZWN0X2xpc3QsIG9iamVjdF9saXN0KSB7CisJCWlmIChuLS0gPiAwKQorCQkJY29udGludWU7CisJCWlmIChnZXRfb2JqZWN0KG9iamVjdCkpCisJCQlnb3RvIG91dDsKKwl9CisJb2JqZWN0ID0gTlVMTDsKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gb2JqZWN0OworfQorCisvKgorICogUmV0dXJuIHRoZSBuZXh0IG9iamVjdCBpbiB0aGUgb2JqZWN0X2xpc3QuIFRoZSBmdW5jdGlvbiBkZWNyZW1lbnRzIHRoZQorICogdXNlX2NvdW50IG9mIHRoZSBwcmV2aW91cyBvYmplY3QgYW5kIGluY3JlYXNlcyB0aGF0IG9mIHRoZSBuZXh0IG9uZS4KKyAqLworc3RhdGljIHZvaWQgKmttZW1sZWFrX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpwcmV2X29iaiA9IHY7CisJc3RydWN0IGttZW1sZWFrX29iamVjdCAqbmV4dF9vYmogPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKm4gPSAmcHJldl9vYmotPm9iamVjdF9saXN0OworCisJKysoKnBvcyk7CisJaWYgKHJlcG9ydGVkX2xlYWtzID49IFJFUE9SVFNfTlIpCisJCWdvdG8gb3V0OworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1KG4sICZvYmplY3RfbGlzdCkgeworCQluZXh0X29iaiA9IGxpc3RfZW50cnkobiwgc3RydWN0IGttZW1sZWFrX29iamVjdCwgb2JqZWN0X2xpc3QpOworCQlpZiAoZ2V0X29iamVjdChuZXh0X29iaikpCisJCQlicmVhazsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CitvdXQ6CisJcHV0X29iamVjdChwcmV2X29iaik7CisJcmV0dXJuIG5leHRfb2JqOworfQorCisvKgorICogRGVjcmVtZW50IHRoZSB1c2VfY291bnQgb2YgdGhlIGxhc3Qgb2JqZWN0IHJlcXVpcmVkLCBpZiBhbnkuCisgKi8KK3N0YXRpYyB2b2lkIGttZW1sZWFrX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCWlmICh2KQorCQlwdXRfb2JqZWN0KHYpOworfQorCisvKgorICogUHJpbnQgdGhlIGluZm9ybWF0aW9uIGZvciBhbiB1bnJlZmVyZW5jZWQgb2JqZWN0IHRvIHRoZSBzZXEgZmlsZS4KKyAqLworc3RhdGljIGludCBrbWVtbGVha19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3Qga21lbWxlYWtfb2JqZWN0ICpvYmplY3QgPSB2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb2JqZWN0LT5sb2NrLCBmbGFncyk7CisJaWYgKCF1bnJlZmVyZW5jZWRfb2JqZWN0KG9iamVjdCkpCisJCWdvdG8gb3V0OworCXByaW50X3VucmVmZXJlbmNlZChzZXEsIG9iamVjdCk7CisJcmVwb3J0ZWRfbGVha3MrKzsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmplY3QtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBrbWVtbGVha19zZXFfb3BzID0geworCS5zdGFydCA9IGttZW1sZWFrX3NlcV9zdGFydCwKKwkubmV4dCAgPSBrbWVtbGVha19zZXFfbmV4dCwKKwkuc3RvcCAgPSBrbWVtbGVha19zZXFfc3RvcCwKKwkuc2hvdyAgPSBrbWVtbGVha19zZXFfc2hvdywKK307CisKK3N0YXRpYyBpbnQga21lbWxlYWtfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghYXRvbWljX3JlYWQoJmttZW1sZWFrX2VuYWJsZWQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZrbWVtbGVha19tdXRleCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc2Nhbl9tdXRleCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBrbWVtbGVha191bmxvY2s7CisJCXJldCA9IHNlcV9vcGVuKGZpbGUsICZrbWVtbGVha19zZXFfb3BzKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIHNjYW5fdW5sb2NrOworCX0KKwlyZXR1cm4gcmV0OworCitzY2FuX3VubG9jazoKKwltdXRleF91bmxvY2soJnNjYW5fbXV0ZXgpOwora21lbWxlYWtfdW5sb2NrOgorCW11dGV4X3VubG9jaygma21lbWxlYWtfbXV0ZXgpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQga21lbWxlYWtfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJbXV0ZXhfdW5sb2NrKCZzY2FuX211dGV4KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZrbWVtbGVha19tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRmlsZSB3cml0ZSBvcGVyYXRpb24gdG8gY29uZmlndXJlIGttZW1sZWFrIGF0IHJ1bi10aW1lLiBUaGUgZm9sbG93aW5nCisgKiBjb21tYW5kcyBjYW4gYmUgd3JpdHRlbiB0byB0aGUgL3N5cy9rZXJuZWwvZGVidWcva21lbWxlYWsgZmlsZToKKyAqICAgb2ZmCS0gZGlzYWJsZSBrbWVtbGVhayAoaXJyZXZlcnNpYmxlKQorICogICBzdGFjaz1vbgktIGVuYWJsZSB0aGUgdGFzayBzdGFja3Mgc2Nhbm5pbmcKKyAqICAgc3RhY2s9b2ZmCS0gZGlzYWJsZSB0aGUgdGFza3Mgc3RhY2tzIHNjYW5uaW5nCisgKiAgIHNjYW49b24JLSBzdGFydCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyB0aHJlYWQKKyAqICAgc2Nhbj1vZmYJLSBzdG9wIHRoZSBhdXRvbWF0aWMgbWVtb3J5IHNjYW5uaW5nIHRocmVhZAorICogICBzY2FuPS4uLgktIHNldCB0aGUgYXV0b21hdGljIG1lbW9yeSBzY2FubmluZyBwZXJpb2QgaW4gc2Vjb25kcyAoMCB0bworICoJCSAgZGlzYWJsZSBpdCkKKyAqLworc3RhdGljIHNzaXplX3Qga21lbWxlYWtfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbNjRdOworCWludCBidWZfc2l6ZTsKKworCWlmICghYXRvbWljX3JlYWQoJmttZW1sZWFrX2VuYWJsZWQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJYnVmX3NpemUgPSBtaW4oc2l6ZSwgKHNpemVvZihidWYpIC0gMSkpOworCWlmIChzdHJuY3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbYnVmX3NpemVdID0gMDsKKworCWlmIChzdHJuY21wKGJ1ZiwgIm9mZiIsIDMpID09IDApCisJCWttZW1sZWFrX2Rpc2FibGUoKTsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgInN0YWNrPW9uIiwgOCkgPT0gMCkKKwkJa21lbWxlYWtfc3RhY2tfc2NhbiA9IDE7CisJZWxzZSBpZiAoc3RybmNtcChidWYsICJzdGFjaz1vZmYiLCA5KSA9PSAwKQorCQlrbWVtbGVha19zdGFja19zY2FuID0gMDsKKwllbHNlIGlmIChzdHJuY21wKGJ1ZiwgInNjYW49b24iLCA3KSA9PSAwKQorCQlzdGFydF9zY2FuX3RocmVhZCgpOworCWVsc2UgaWYgKHN0cm5jbXAoYnVmLCAic2Nhbj1vZmYiLCA4KSA9PSAwKQorCQlzdG9wX3NjYW5fdGhyZWFkKCk7CisJZWxzZSBpZiAoc3RybmNtcChidWYsICJzY2FuPSIsIDUpID09IDApIHsKKwkJdW5zaWduZWQgbG9uZyBzZWNzOworCQlpbnQgZXJyOworCisJCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiArIDUsIDAsICZzZWNzKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlzdG9wX3NjYW5fdGhyZWFkKCk7CisJCWlmIChzZWNzKSB7CisJCQlqaWZmaWVzX3NjYW5fd2FpdCA9IG1zZWNzX3RvX2ppZmZpZXMoc2VjcyAqIDEwMDApOworCQkJc3RhcnRfc2Nhbl90aHJlYWQoKTsKKwkJfQorCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGlnbm9yZSB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyLCBvbmx5IG9uZSBjb21tYW5kIGF0IGEgdGltZSAqLworCSpwcG9zICs9IHNpemU7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGttZW1sZWFrX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGttZW1sZWFrX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IGttZW1sZWFrX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0ga21lbWxlYWtfcmVsZWFzZSwKK307CisKKy8qCisgKiBQZXJmb3JtIHRoZSBmcmVlaW5nIG9mIHRoZSBrbWVtbGVhayBpbnRlcm5hbCBvYmplY3RzIGFmdGVyIHdhaXRpbmcgZm9yIGFueQorICogY3VycmVudCBtZW1vcnkgc2NhbiB0byBjb21wbGV0ZS4KKyAqLworc3RhdGljIGludCBrbWVtbGVha19jbGVhbnVwX3RocmVhZCh2b2lkICphcmcpCit7CisJc3RydWN0IGttZW1sZWFrX29iamVjdCAqb2JqZWN0OworCisJbXV0ZXhfbG9jaygma21lbWxlYWtfbXV0ZXgpOworCXN0b3Bfc2Nhbl90aHJlYWQoKTsKKwltdXRleF91bmxvY2soJmttZW1sZWFrX211dGV4KTsKKworCW11dGV4X2xvY2soJnNjYW5fbXV0ZXgpOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShvYmplY3QsICZvYmplY3RfbGlzdCwgb2JqZWN0X2xpc3QpCisJCWRlbGV0ZV9vYmplY3Qob2JqZWN0LT5wb2ludGVyKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwltdXRleF91bmxvY2soJnNjYW5fbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGFydCB0aGUgY2xlYW4tdXAgdGhyZWFkLgorICovCitzdGF0aWMgdm9pZCBrbWVtbGVha19jbGVhbnVwKHZvaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpjbGVhbnVwX3RocmVhZDsKKworCWNsZWFudXBfdGhyZWFkID0ga3RocmVhZF9ydW4oa21lbWxlYWtfY2xlYW51cF90aHJlYWQsIE5VTEwsCisJCQkJICAgICAia21lbWxlYWstY2xlYW4iKTsKKwlpZiAoSVNfRVJSKGNsZWFudXBfdGhyZWFkKSkKKwkJcHJfd2FybmluZygia21lbWxlYWs6IEZhaWxlZCB0byBjcmVhdGUgdGhlIGNsZWFuLXVwIHRocmVhZFxuIik7Cit9CisKKy8qCisgKiBEaXNhYmxlIGttZW1sZWFrLiBObyBtZW1vcnkgYWxsb2NhdGlvbi9mcmVlaW5nIHdpbGwgYmUgdHJhY2VkIG9uY2UgdGhpcworICogZnVuY3Rpb24gaXMgY2FsbGVkLiBEaXNhYmxpbmcga21lbWxlYWsgaXMgYW4gaXJyZXZlcnNpYmxlIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQga21lbWxlYWtfZGlzYWJsZSh2b2lkKQoreworCS8qIGF0b21pY2FsbHkgY2hlY2sgd2hldGhlciBpdCB3YXMgYWxyZWFkeSBpbnZva2VkICovCisJaWYgKGF0b21pY19jbXB4Y2hnKCZrbWVtbGVha19lcnJvciwgMCwgMSkpCisJCXJldHVybjsKKworCS8qIHN0b3AgYW55IG1lbW9yeSBvcGVyYXRpb24gdHJhY2luZyAqLworCWF0b21pY19zZXQoJmttZW1sZWFrX2Vhcmx5X2xvZywgMCk7CisJYXRvbWljX3NldCgma21lbWxlYWtfZW5hYmxlZCwgMCk7CisKKwkvKiBjaGVjayB3aGV0aGVyIGl0IGlzIHRvbyBlYXJseSBmb3IgYSBrZXJuZWwgdGhyZWFkICovCisJaWYgKGF0b21pY19yZWFkKCZrbWVtbGVha19pbml0aWFsaXplZCkpCisJCWttZW1sZWFrX2NsZWFudXAoKTsKKworCXByX2luZm8oIktlcm5lbCBtZW1vcnkgbGVhayBkZXRlY3RvciBkaXNhYmxlZFxuIik7Cit9CisKKy8qCisgKiBBbGxvdyBib290LXRpbWUga21lbWxlYWsgZGlzYWJsaW5nIChlbmFibGVkIGJ5IGRlZmF1bHQpLgorICovCitzdGF0aWMgaW50IGttZW1sZWFrX2Jvb3RfY29uZmlnKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmNtcChzdHIsICJvZmYiKSA9PSAwKQorCQlrbWVtbGVha19kaXNhYmxlKCk7CisJZWxzZSBpZiAoc3RyY21wKHN0ciwgIm9uIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgia21lbWxlYWsiLCBrbWVtbGVha19ib290X2NvbmZpZyk7CisKKy8qCisgKiBLa21lbWxlYWsgaW5pdGlhbGl6YXRpb24uCisgKi8KK3ZvaWQgX19pbml0IGttZW1sZWFrX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJamlmZmllc19zY2FuX3lpZWxkID0gbXNlY3NfdG9famlmZmllcyhNU0VDU19TQ0FOX1lJRUxEKTsKKwlqaWZmaWVzX21pbl9hZ2UgPSBtc2Vjc190b19qaWZmaWVzKE1TRUNTX01JTl9BR0UpOworCWppZmZpZXNfc2Nhbl93YWl0ID0gbXNlY3NfdG9famlmZmllcyhTRUNTX1NDQU5fV0FJVCAqIDEwMDApOworCisJb2JqZWN0X2NhY2hlID0gS01FTV9DQUNIRShrbWVtbGVha19vYmplY3QsIFNMQUJfTk9MRUFLVFJBQ0UpOworCXNjYW5fYXJlYV9jYWNoZSA9IEtNRU1fQ0FDSEUoa21lbWxlYWtfc2Nhbl9hcmVhLCBTTEFCX05PTEVBS1RSQUNFKTsKKwlJTklUX1BSSU9fVFJFRV9ST09UKCZvYmplY3RfdHJlZV9yb290KTsKKworCS8qIHRoZSBrZXJuZWwgaXMgc3RpbGwgaW4gVVAgbW9kZSwgc28gZGlzYWJsaW5nIHRoZSBJUlFzIGlzIGVub3VnaCAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlpZiAoIWF0b21pY19yZWFkKCZrbWVtbGVha19lcnJvcikpIHsKKwkJYXRvbWljX3NldCgma21lbWxlYWtfZW5hYmxlZCwgMSk7CisJCWF0b21pY19zZXQoJmttZW1sZWFrX2Vhcmx5X2xvZywgMCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qCisJICogVGhpcyBpcyB0aGUgcG9pbnQgd2hlcmUgdHJhY2tpbmcgYWxsb2NhdGlvbnMgaXMgc2FmZS4gQXV0b21hdGljCisJICogc2Nhbm5pbmcgaXMgc3RhcnRlZCBkdXJpbmcgdGhlIGxhdGUgaW5pdGNhbGwuIEFkZCB0aGUgZWFybHkgbG9nZ2VkCisJICogY2FsbGJhY2tzIHRvIHRoZSBrbWVtbGVhayBpbmZyYXN0cnVjdHVyZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3J0X2Vhcmx5X2xvZzsgaSsrKSB7CisJCXN0cnVjdCBlYXJseV9sb2cgKmxvZyA9ICZlYXJseV9sb2dbaV07CisKKwkJc3dpdGNoIChsb2ctPm9wX3R5cGUpIHsKKwkJY2FzZSBLTUVNTEVBS19BTExPQzoKKwkJCWttZW1sZWFrX2FsbG9jKGxvZy0+cHRyLCBsb2ctPnNpemUsIGxvZy0+bWluX2NvdW50LAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwkJCWJyZWFrOworCQljYXNlIEtNRU1MRUFLX0ZSRUU6CisJCQlrbWVtbGVha19mcmVlKGxvZy0+cHRyKTsKKwkJCWJyZWFrOworCQljYXNlIEtNRU1MRUFLX05PVF9MRUFLOgorCQkJa21lbWxlYWtfbm90X2xlYWsobG9nLT5wdHIpOworCQkJYnJlYWs7CisJCWNhc2UgS01FTUxFQUtfSUdOT1JFOgorCQkJa21lbWxlYWtfaWdub3JlKGxvZy0+cHRyKTsKKwkJCWJyZWFrOworCQljYXNlIEtNRU1MRUFLX1NDQU5fQVJFQToKKwkJCWttZW1sZWFrX3NjYW5fYXJlYShsb2ctPnB0ciwgbG9nLT5vZmZzZXQsIGxvZy0+bGVuZ3RoLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJCWJyZWFrOworCQljYXNlIEtNRU1MRUFLX05PX1NDQU46CisJCQlrbWVtbGVha19ub19zY2FuKGxvZy0+cHRyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV0FSTl9PTigxKTsKKwkJfQorCX0KK30KKworLyoKKyAqIExhdGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGttZW1sZWFrX2xhdGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCWF0b21pY19zZXQoJmttZW1sZWFrX2luaXRpYWxpemVkLCAxKTsKKworCWlmIChhdG9taWNfcmVhZCgma21lbWxlYWtfZXJyb3IpKSB7CisJCS8qCisJCSAqIFNvbWUgZXJyb3Igb2NjdXJlZCBhbmQga21lbWxlYWsgd2FzIGRpc2FibGVkLiBUaGVyZSBpcyBhCisJCSAqIHNtYWxsIGNoYW5jZSB0aGF0IGttZW1sZWFrX2Rpc2FibGUoKSB3YXMgY2FsbGVkIGltbWVkaWF0ZWx5CisJCSAqIGFmdGVyIHNldHRpbmcga21lbWxlYWtfaW5pdGlhbGl6ZWQgYW5kIHdlIG1heSBlbmQgdXAgd2l0aAorCQkgKiB0d28gY2xlYW4tdXAgdGhyZWFkcyBidXQgc2VyaWFsaXplZCBieSBzY2FuX211dGV4LgorCQkgKi8KKwkJa21lbWxlYWtfY2xlYW51cCgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJrbWVtbGVhayIsIFNfSVJVR08sIE5VTEwsIE5VTEwsCisJCQkJICAgICAma21lbWxlYWtfZm9wcyk7CisJaWYgKCFkZW50cnkpCisJCXByX3dhcm5pbmcoImttZW1sZWFrOiBGYWlsZWQgdG8gY3JlYXRlIHRoZSBkZWJ1Z2ZzIGttZW1sZWFrICIKKwkJCSAgICJmaWxlXG4iKTsKKwltdXRleF9sb2NrKCZrbWVtbGVha19tdXRleCk7CisJc3RhcnRfc2Nhbl90aHJlYWQoKTsKKwltdXRleF91bmxvY2soJmttZW1sZWFrX211dGV4KTsKKworCXByX2luZm8oIktlcm5lbCBtZW1vcnkgbGVhayBkZXRlY3RvciBpbml0aWFsaXplZFxuIik7CisKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoa21lbWxlYWtfbGF0ZV9pbml0KTsKZGlmZiAtLWdpdCBhL21tL21sb2NrLmMgYi9tbS9tbG9jay5jCmluZGV4IGNiZTllMDUuLmFjMTMwNDMgMTAwNjQ0Ci0tLSBhL21tL21sb2NrLmMKKysrIGIvbW0vbWxvY2suYwpAQCAtNjI5LDUyICs2MjksNDMgQEAKIAlmcmVlX3VpZCh1c2VyKTsKIH0KIAotdm9pZCAqYWxsb2NfbG9ja2VkX2J1ZmZlcihzaXplX3Qgc2l6ZSkKK2ludCBhY2NvdW50X2xvY2tlZF9tZW1vcnkoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBybGltaXQgKnJsaW0sCisJCQkgIHNpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgcmxpbSwgdm0sIHBnc3o7Ci0Jdm9pZCAqYnVmZmVyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGxpbSwgdm0sIHBnc3o7CisJaW50IGVycm9yID0gLUVOT01FTTsKIAogCXBnc3ogPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CiAKLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAKLQlybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9BU10ucmxpbV9jdXIgPj4gUEFHRV9TSElGVDsKLQl2bSAgID0gY3VycmVudC0+bW0tPnRvdGFsX3ZtICsgcGdzejsKLQlpZiAocmxpbSA8IHZtKQorCWxpbSA9IHJsaW1bUkxJTUlUX0FTXS5ybGltX2N1ciA+PiBQQUdFX1NISUZUOworCXZtICAgPSBtbS0+dG90YWxfdm0gKyBwZ3N6OworCWlmIChsaW0gPCB2bSkKIAkJZ290byBvdXQ7CiAKLQlybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1ciA+PiBQQUdFX1NISUZUOwotCXZtICAgPSBjdXJyZW50LT5tbS0+bG9ja2VkX3ZtICsgcGdzejsKLQlpZiAocmxpbSA8IHZtKQorCWxpbSA9IHJsaW1bUkxJTUlUX01FTUxPQ0tdLnJsaW1fY3VyID4+IFBBR0VfU0hJRlQ7CisJdm0gICA9IG1tLT5sb2NrZWRfdm0gKyBwZ3N6OworCWlmIChsaW0gPCB2bSkKIAkJZ290byBvdXQ7CiAKLQlidWZmZXIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyKQotCQlnb3RvIG91dDsKKwltbS0+dG90YWxfdm0gICs9IHBnc3o7CisJbW0tPmxvY2tlZF92bSArPSBwZ3N6OwogCi0JY3VycmVudC0+bW0tPnRvdGFsX3ZtICArPSBwZ3N6OwotCWN1cnJlbnQtPm1tLT5sb2NrZWRfdm0gKz0gcGdzejsKLQorCWVycm9yID0gMDsKICBvdXQ6Ci0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JcmV0dXJuIGJ1ZmZlcjsKKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLXZvaWQgcmVsZWFzZV9sb2NrZWRfYnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit2b2lkIHJlZnVuZF9sb2NrZWRfbWVtb3J5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzaXplX3Qgc2l6ZSkKIHsKIAl1bnNpZ25lZCBsb25nIHBnc3ogPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CiAKLQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAKLQljdXJyZW50LT5tbS0+dG90YWxfdm0gIC09IHBnc3o7Ci0JY3VycmVudC0+bW0tPmxvY2tlZF92bSAtPSBwZ3N6OworCW1tLT50b3RhbF92bSAgLT0gcGdzejsKKwltbS0+bG9ja2VkX3ZtIC09IHBnc3o7CiAKLQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLX0KLQotdm9pZCBmcmVlX2xvY2tlZF9idWZmZXIodm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLQlyZWxlYXNlX2xvY2tlZF9idWZmZXIoYnVmZmVyLCBzaXplKTsKLQotCWtmcmVlKGJ1ZmZlcik7CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiB9CmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggNmI3YjFhOS4uMzQ1NzliMiAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbXBvbGljeS5oPgogI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9tbXVfbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTg3LDYgKzg4LDkgQEAKIGludCBzeXNjdGxfbWF4X21hcF9jb3VudCBfX3JlYWRfbW9zdGx5ID0gREVGQVVMVF9NQVhfTUFQX0NPVU5UOwogc3RydWN0IHBlcmNwdV9jb3VudGVyIHZtX2NvbW1pdHRlZF9hczsKIAorLyogYW1vdW50IG9mIHZtIHRvIHByb3RlY3QgZnJvbSB1c2Vyc3BhY2UgYWNjZXNzICovCit1bnNpZ25lZCBsb25nIG1tYXBfbWluX2FkZHIgPSBDT05GSUdfREVGQVVMVF9NTUFQX01JTl9BRERSOworCiAvKgogICogQ2hlY2sgdGhhdCBhIHByb2Nlc3MgaGFzIGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgYSBuZXcgdmlydHVhbAogICogbWFwcGluZy4gMCBtZWFucyB0aGVyZSBpcyBlbm91Z2ggbWVtb3J5IGZvciB0aGUgYWxsb2NhdGlvbiB0bwpAQCAtMTIxOSw2ICsxMjIzLDggQEAKIAlpZiAoY29ycmVjdF93Y291bnQpCiAJCWF0b21pY19pbmMoJmlub2RlLT5pX3dyaXRlY291bnQpOwogb3V0OgorCXBlcmZfY291bnRlcl9tbWFwKHZtYSk7CisKIAltbS0+dG90YWxfdm0gKz0gbGVuID4+IFBBR0VfU0hJRlQ7CiAJdm1fc3RhdF9hY2NvdW50KG1tLCB2bV9mbGFncywgZmlsZSwgbGVuID4+IFBBR0VfU0hJRlQpOwogCWlmICh2bV9mbGFncyAmIFZNX0xPQ0tFRCkgewpAQCAtMjMwNSw2ICsyMzExLDggQEAKIAogCW1tLT50b3RhbF92bSArPSBsZW4gPj4gUEFHRV9TSElGVDsKIAorCXBlcmZfY291bnRlcl9tbWFwKHZtYSk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vbXByb3RlY3QuYyBiL21tL21wcm90ZWN0LmMKaW5kZXggMjU4MTk3Yi4uZDgwMzExYiAxMDA2NDQKLS0tIGEvbW0vbXByb3RlY3QuYworKysgYi9tbS9tcHJvdGVjdC5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KQEAgLTI5OSw2ICszMDAsNyBAQAogCQllcnJvciA9IG1wcm90ZWN0X2ZpeHVwKHZtYSwgJnByZXYsIG5zdGFydCwgdG1wLCBuZXdmbGFncyk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0OworCQlwZXJmX2NvdW50ZXJfbW1hcCh2bWEpOwogCQluc3RhcnQgPSB0bXA7CiAKIAkJaWYgKG5zdGFydCA8IHByZXYtPnZtX2VuZCkKZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IGI1NzFlZjcuLjJmZDJhZDUgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtNjksNiArNjksOSBAQAogaW50IHN5c2N0bF9ucl90cmltX3BhZ2VzID0gQ09ORklHX05PTU1VX0lOSVRJQUxfVFJJTV9FWENFU1M7CiBpbnQgaGVhcF9zdGFja19nYXAgPSAwOwogCisvKiBhbW91bnQgb2Ygdm0gdG8gcHJvdGVjdCBmcm9tIHVzZXJzcGFjZSBhY2Nlc3MgKi8KK3Vuc2lnbmVkIGxvbmcgbW1hcF9taW5fYWRkciA9IENPTkZJR19ERUZBVUxUX01NQVBfTUlOX0FERFI7CisKIGF0b21pY19sb25nX3QgbW1hcF9wYWdlc19hbGxvY2F0ZWQ7CiAKIEVYUE9SVF9TWU1CT0wobWVtX21hcCk7CmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggZmU3NTNlYy4uMTdkNWY1MyAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2UtaXNvbGF0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZV9jZ3JvdXAuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z29iamVjdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CkBAIC0xNDksMTAgKzE1MCw2IEBACiAgIHN0YXRpYyBpbnQgX19tZW1pbml0ZGF0YSBucl9ub2RlbWFwX2VudHJpZXM7CiAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bTUFYX05SX1pPTkVTXTsKICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bTUFYX05SX1pPTkVTXTsKLSNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfUkVTRVJWRQotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW01BWF9OVU1OT0RFU107Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9lbmRfcGZuW01BWF9OVU1OT0RFU107Ci0jZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHX1JFU0VSVkUgKi8KICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSByZXF1aXJlZF9rZXJuZWxjb3JlOwogICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHJlcXVpcmVkX21vdmFibGVjb3JlOwogICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIHpvbmVfbW92YWJsZV9wZm5bTUFYX05VTU5PREVTXTsKQEAgLTMxMDMsNjQgKzMxMDAsNiBAQAogfQogCiAvKioKLSAqIHB1c2hfbm9kZV9ib3VuZGFyaWVzIC0gUHVzaCBub2RlIGJvdW5kYXJpZXMgdG8gYXQgbGVhc3QgdGhlIHJlcXVlc3RlZCBib3VuZGFyeQotICogQG5pZDogVGhlIG5pZCBvZiB0aGUgbm9kZSB0byBwdXNoIHRoZSBib3VuZGFyeSBmb3IKLSAqIEBzdGFydF9wZm46IFRoZSBzdGFydCBwZm4gb2YgdGhlIG5vZGUKLSAqIEBlbmRfcGZuOiBUaGUgZW5kIHBmbiBvZiB0aGUgbm9kZQotICoKLSAqIEluIHJlc2VydmUtYmFzZWQgaG90LWFkZCwgbWVtX21hcCBpcyBhbGxvY2F0ZWQgdGhhdCBpcyB1bnVzZWQgdW50aWwgaG90YWRkCi0gKiB0aW1lLiBTcGVjaWZpY2FsbHksIG9uIHg4Nl82NCwgU1JBVCB3aWxsIHJlcG9ydCByYW5nZXMgdGhhdCBjYW4gcG90ZW50aWFsbHkKLSAqIGJlIGhvdHBsdWdnZWQgZXZlbiB0aG91Z2ggbm8gcGh5c2ljYWwgbWVtb3J5IGV4aXN0cy4gVGhpcyBmdW5jdGlvbiBhbGxvd3MKLSAqIGFuIGFyY2ggdG8gcHVzaCBvdXQgdGhlIG5vZGUgYm91bmRhcmllcyBzbyBtZW1fbWFwIGlzIGFsbG9jYXRlZCB0aGF0IGNhbgotICogYmUgdXNlZCBsYXRlci4KLSAqLwotI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFCi12b2lkIF9faW5pdCBwdXNoX25vZGVfYm91bmRhcmllcyh1bnNpZ25lZCBpbnQgbmlkLAotCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQotewotCW1taW5pdF9kcHJpbnRrKE1NSU5JVF9UUkFDRSwgInpvbmVib3VuZGFyeSIsCi0JCQkiRW50ZXJpbmcgcHVzaF9ub2RlX2JvdW5kYXJpZXMoJXUsICVsdSwgJWx1KVxuIiwKLQkJCW5pZCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKLQotCS8qIEluaXRpYWxpc2UgdGhlIGJvdW5kYXJ5IGZvciB0aGlzIG5vZGUgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKG5vZGVfYm91bmRhcnlfZW5kX3BmbltuaWRdID09IDApCi0JCW5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW25pZF0gPSAtMVVMOwotCi0JLyogVXBkYXRlIHRoZSBib3VuZGFyaWVzICovCi0JaWYgKG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW25pZF0gPiBzdGFydF9wZm4pCi0JCW5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW25pZF0gPSBzdGFydF9wZm47Ci0JaWYgKG5vZGVfYm91bmRhcnlfZW5kX3BmbltuaWRdIDwgZW5kX3BmbikKLQkJbm9kZV9ib3VuZGFyeV9lbmRfcGZuW25pZF0gPSBlbmRfcGZuOwotfQotCi0vKiBJZiBuZWNlc3NhcnksIHB1c2ggdGhlIG5vZGUgYm91bmRhcnkgb3V0IGZvciByZXNlcnZlIGhvdGFkZCAqLwotc3RhdGljIHZvaWQgX19tZW1pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAotCQl1bnNpZ25lZCBsb25nICpzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgKmVuZF9wZm4pCi17Ci0JbW1pbml0X2RwcmludGsoTU1JTklUX1RSQUNFLCAiem9uZWJvdW5kYXJ5IiwKLQkJCSJFbnRlcmluZyBhY2NvdW50X25vZGVfYm91bmRhcnkoJXUsICVsdSwgJWx1KVxuIiwKLQkJCW5pZCwgKnN0YXJ0X3BmbiwgKmVuZF9wZm4pOwotCi0JLyogUmV0dXJuIGlmIGJvdW5kYXJ5IGluZm9ybWF0aW9uIGhhcyBub3QgYmVlbiBwcm92aWRlZCAqLwotCWlmIChub2RlX2JvdW5kYXJ5X2VuZF9wZm5bbmlkXSA9PSAwKQotCQlyZXR1cm47Ci0KLQkvKiBDaGVjayB0aGUgYm91bmRhcmllcyBhbmQgdXBkYXRlIGlmIG5lY2Vzc2FyeSAqLwotCWlmIChub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltuaWRdIDwgKnN0YXJ0X3BmbikKLQkJKnN0YXJ0X3BmbiA9IG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW25pZF07Ci0JaWYgKG5vZGVfYm91bmRhcnlfZW5kX3BmbltuaWRdID4gKmVuZF9wZm4pCi0JCSplbmRfcGZuID0gbm9kZV9ib3VuZGFyeV9lbmRfcGZuW25pZF07Ci19Ci0jZWxzZQotdm9pZCBfX2luaXQgcHVzaF9ub2RlX2JvdW5kYXJpZXModW5zaWduZWQgaW50IG5pZCwKLQkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbikge30KLQotc3RhdGljIHZvaWQgX19tZW1pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAotCQl1bnNpZ25lZCBsb25nICpzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgKmVuZF9wZm4pIHt9Ci0jZW5kaWYKLQotCi0vKioKICAqIGdldF9wZm5fcmFuZ2VfZm9yX25pZCAtIFJldHVybiB0aGUgc3RhcnQgYW5kIGVuZCBwYWdlIGZyYW1lcyBmb3IgYSBub2RlCiAgKiBAbmlkOiBUaGUgbmlkIHRvIHJldHVybiB0aGUgcmFuZ2UgZm9yLiBJZiBNQVhfTlVNTk9ERVMsIHRoZSBtaW4gYW5kIG1heCBQRk4gYXJlIHJldHVybmVkLgogICogQHN0YXJ0X3BmbjogUGFzc2VkIGJ5IHJlZmVyZW5jZS4gT24gcmV0dXJuLCBpdCB3aWxsIGhhdmUgdGhlIG5vZGUgc3RhcnRfcGZuLgpAQCAtMzE4NSw5ICszMTI0LDYgQEAKIAogCWlmICgqc3RhcnRfcGZuID09IC0xVUwpCiAJCSpzdGFydF9wZm4gPSAwOwotCi0JLyogUHVzaCB0aGUgbm9kZSBib3VuZGFyaWVzIG91dCBpZiByZXF1ZXN0ZWQgKi8KLQlhY2NvdW50X25vZGVfYm91bmRhcnkobmlkLCBzdGFydF9wZm4sIGVuZF9wZm4pOwogfQogCiAvKgpAQCAtMzc5MywxMCArMzcyOSw2IEBACiB7CiAJbWVtc2V0KGVhcmx5X25vZGVfbWFwLCAwLCBzaXplb2YoZWFybHlfbm9kZV9tYXApKTsKIAlucl9ub2RlbWFwX2VudHJpZXMgPSAwOwotI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFCi0JbWVtc2V0KG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuLCAwLCBzaXplb2Yobm9kZV9ib3VuZGFyeV9zdGFydF9wZm4pKTsKLQltZW1zZXQobm9kZV9ib3VuZGFyeV9lbmRfcGZuLCAwLCBzaXplb2Yobm9kZV9ib3VuZGFyeV9lbmRfcGZuKSk7Ci0jZW5kaWYgLyogQ09ORklHX01FTU9SWV9IT1RQTFVHX1JFU0VSVkUgKi8KIH0KIAogLyogQ29tcGFyZSB0d28gYWN0aXZlIG5vZGVfYWN0aXZlX3JlZ2lvbnMgKi8KQEAgLTQ2MTUsNiArNDU0NywxNiBAQAogCWlmIChfaGFzaF9tYXNrKQogCQkqX2hhc2hfbWFzayA9ICgxIDw8IGxvZzJxdHkpIC0gMTsKIAorCS8qCisJICogSWYgaGFzaGRpc3QgaXMgc2V0LCB0aGUgdGFibGUgYWxsb2NhdGlvbiBpcyBkb25lIHdpdGggX192bWFsbG9jKCkKKwkgKiB3aGljaCBpbnZva2VzIHRoZSBrbWVtbGVha19hbGxvYygpIGNhbGxiYWNrLiBUaGlzIGZ1bmN0aW9uIG1heSBhbHNvCisJICogYmUgY2FsbGVkIGJlZm9yZSB0aGUgc2xhYiBhbmQga21lbWxlYWsgYXJlIGluaXRpYWxpc2VkIHdoZW4KKwkgKiBrbWVtbGVhayBzaW1wbHkgYnVmZmVycyB0aGUgcmVxdWVzdCB0byBiZSBleGVjdXRlZCBsYXRlcgorCSAqIChHRlBfQVRPTUlDIGZsYWcgaWdub3JlZCBpbiB0aGlzIGNhc2UpLgorCSAqLworCWlmICghaGFzaGRpc3QpCisJCWttZW1sZWFrX2FsbG9jKHRhYmxlLCBzaXplLCAxLCBHRlBfQVRPTUlDKTsKKwogCXJldHVybiB0YWJsZTsKIH0KIApkaWZmIC0tZ2l0IGEvbW0vcGFnZV9jZ3JvdXAuYyBiL21tL3BhZ2VfY2dyb3VwLmMKaW5kZXggNzkxOTA1Yy4uM2RkNGE5MCAxMDA2NDQKLS0tIGEvbW0vcGFnZV9jZ3JvdXAuYworKysgYi9tbS9wYWdlX2Nncm91cC5jCkBAIC00Nyw2ICs0Nyw4IEBACiAJc3RydWN0IHBhZ2VfY2dyb3VwICpiYXNlLCAqcGM7CiAJdW5zaWduZWQgbG9uZyB0YWJsZV9zaXplOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBucl9wYWdlcywgaW5kZXg7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IG9yZGVyOwogCiAJc3RhcnRfcGZuID0gTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuOwogCW5yX3BhZ2VzID0gTk9ERV9EQVRBKG5pZCktPm5vZGVfc3Bhbm5lZF9wYWdlczsKQEAgLTU1LDExICs1NywxMyBAQAogCQlyZXR1cm4gMDsKIAogCXRhYmxlX3NpemUgPSBzaXplb2Yoc3RydWN0IHBhZ2VfY2dyb3VwKSAqIG5yX3BhZ2VzOwotCi0JYmFzZSA9IF9fYWxsb2NfYm9vdG1lbV9ub2RlX25vcGFuaWMoTk9ERV9EQVRBKG5pZCksCi0JCQl0YWJsZV9zaXplLCBQQUdFX1NJWkUsIF9fcGEoTUFYX0RNQV9BRERSRVNTKSk7Ci0JaWYgKCFiYXNlKQorCW9yZGVyID0gZ2V0X29yZGVyKHRhYmxlX3NpemUpOworCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5pZCwgR0ZQX05PV0FJVCB8IF9fR0ZQX1pFUk8sIG9yZGVyKTsKKwlpZiAoIXBhZ2UpCisJCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKC0xLCBHRlBfTk9XQUlUIHwgX19HRlBfWkVSTywgb3JkZXIpOworCWlmICghcGFnZSkKIAkJcmV0dXJuIC1FTk9NRU07CisJYmFzZSA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBucl9wYWdlczsgaW5kZXgrKykgewogCQlwYyA9IGJhc2UgKyBpbmRleDsKIAkJX19pbml0X3BhZ2VfY2dyb3VwKHBjLCBzdGFydF9wZm4gKyBpbmRleCk7CmRpZmYgLS1naXQgYS9tbS9wZXJjcHUuYyBiL21tL3BlcmNwdS5jCmluZGV4IDFhYTVkOGYuLmMwYjJjMWEgMTAwNjQ0Ci0tLSBhL21tL3BlcmNwdS5jCisrKyBiL21tL3BlcmNwdS5jCkBAIC0yMyw3ICsyMyw3IEBACiAgKiBBbGxvY2F0aW9uIGlzIGRvbmUgaW4gb2Zmc2V0LXNpemUgYXJlYXMgb2Ygc2luZ2xlIHVuaXQgc3BhY2UuICBJZSwKICAqIGFuIGFyZWEgb2YgNTEyIGJ5dGVzIGF0IDZrIGluIGMxIG9jY3VwaWVzIDUxMiBieXRlcyBhdCA2ayBvZiBjMTp1MCwKICAqIGMxOnUxLCBjMTp1MiBhbmQgYzE6dTMuICBQZXJjcHUgYWNjZXNzIGNhbiBiZSBkb25lIGJ5IGNvbmZpZ3VyaW5nCi0gKiBwZXJjcHUgYmFzZSByZWdpc3RlcnMgVU5JVF9TSVpFIGFwYXJ0LgorICogcGVyY3B1IGJhc2UgcmVnaXN0ZXJzIHBjcHVfdW5pdF9zaXplIGFwYXJ0LgogICoKICAqIFRoZXJlIGFyZSB1c3VhbGx5IG1hbnkgc21hbGwgcGVyY3B1IGFsbG9jYXRpb25zIG1hbnkgb2YgdGhlbSBhcwogICogc21hbGwgYXMgNCBieXRlcy4gIFRoZSBhbGxvY2F0b3Igb3JnYW5pemVzIGNodW5rcyBpbnRvIGxpc3RzCkBAIC0zOCw4ICszOCw4IEBACiAgKiByZWdpb24gYW5kIG5lZ2F0aXZlIGFsbG9jYXRlZC4gIEFsbG9jYXRpb24gaW5zaWRlIGEgY2h1bmsgaXMgZG9uZQogICogYnkgc2Nhbm5pbmcgdGhpcyBtYXAgc2VxdWVudGlhbGx5IGFuZCBzZXJ2aW5nIHRoZSBmaXJzdCBtYXRjaGluZwogICogZW50cnkuICBUaGlzIGlzIG1vc3RseSBjb3BpZWQgZnJvbSB0aGUgcGVyY3B1X21vZGFsbG9jKCkgYWxsb2NhdG9yLgotICogQ2h1bmtzIGFyZSBhbHNvIGxpbmtlZCBpbnRvIGEgcmIgdHJlZSB0byBlYXNlIGFkZHJlc3MgdG8gY2h1bmsKLSAqIG1hcHBpbmcgZHVyaW5nIGZyZWUuCisgKiBDaHVua3MgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgYWRkcmVzcyB1c2luZyB0aGUgaW5kZXggZmllbGQKKyAqIGluIHRoZSBwYWdlIHN0cnVjdC4gVGhlIGluZGV4IGZpZWxkIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgY2h1bmsuCiAgKgogICogVG8gdXNlIHRoaXMgYWxsb2NhdG9yLCBhcmNoIGNvZGUgc2hvdWxkIGRvIHRoZSBmb2xsb3dpbmdzLgogICoKQEAgLTYxLDcgKzYxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgotI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KQEAgLTg4LDcgKzg3LDYgQEAKIAogc3RydWN0IHBjcHVfY2h1bmsgewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJCS8qIGxpbmtlZCB0byBwY3B1X3Nsb3QgbGlzdHMgKi8KLQlzdHJ1Y3QgcmJfbm9kZQkJcmJfbm9kZTsJLyoga2V5IGlzIGNodW5rLT52bS0+YWRkciAqLwogCWludAkJCWZyZWVfc2l6ZTsJLyogZnJlZSBieXRlcyBpbiB0aGUgY2h1bmsgKi8KIAlpbnQJCQljb250aWdfaGludDsJLyogbWF4IGNvbnRpZ3VvdXMgc2l6ZSBoaW50ICovCiAJc3RydWN0IHZtX3N0cnVjdAkqdm07CQkvKiBtYXBwZWQgdm1hbGxvYyByZWdpb24gKi8KQEAgLTExMCw5ICsxMDgsMjEgQEAKIHZvaWQgKnBjcHVfYmFzZV9hZGRyIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MX0dQTChwY3B1X2Jhc2VfYWRkcik7CiAKLS8qIG9wdGlvbmFsIHJlc2VydmVkIGNodW5rLCBvbmx5IGFjY2Vzc2libGUgZm9yIHJlc2VydmVkIGFsbG9jYXRpb25zICovCisvKgorICogVGhlIGZpcnN0IGNodW5rIHdoaWNoIGFsd2F5cyBleGlzdHMuICBOb3RlIHRoYXQgdW5saWtlIG90aGVyCisgKiBjaHVua3MsIHRoaXMgb25lIGNhbiBiZSBhbGxvY2F0ZWQgYW5kIG1hcHBlZCBpbiBzZXZlcmFsIGRpZmZlcmVudAorICogd2F5cyBhbmQgdGh1cyBvZnRlbiBkb2Vzbid0IGxpdmUgaW4gdGhlIHZtYWxsb2MgYXJlYS4KKyAqLworc3RhdGljIHN0cnVjdCBwY3B1X2NodW5rICpwY3B1X2ZpcnN0X2NodW5rOworCisvKgorICogT3B0aW9uYWwgcmVzZXJ2ZWQgY2h1bmsuICBUaGlzIGNodW5rIHJlc2VydmVzIHBhcnQgb2YgdGhlIGZpcnN0CisgKiBjaHVuayBhbmQgc2VydmVzIGl0IGZvciByZXNlcnZlZCBhbGxvY2F0aW9ucy4gIFRoZSBhbW91bnQgb2YKKyAqIHJlc2VydmVkIG9mZnNldCBpcyBpbiBwY3B1X3Jlc2VydmVkX2NodW5rX2xpbWl0LiAgV2hlbiByZXNlcnZlZAorICogYXJlYSBkb2Vzbid0IGV4aXN0LCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBjb250YWluIE5VTEwgYW5kIDAKKyAqIHJlc3BlY3RpdmVseS4KKyAqLwogc3RhdGljIHN0cnVjdCBwY3B1X2NodW5rICpwY3B1X3Jlc2VydmVkX2NodW5rOwotLyogb2Zmc2V0IGxpbWl0IG9mIHRoZSByZXNlcnZlZCBjaHVuayAqLwogc3RhdGljIGludCBwY3B1X3Jlc2VydmVkX2NodW5rX2xpbWl0OwogCiAvKgpAQCAtMTIxLDcgKzEzMSw3IEBACiAgKiBUaGVyZSBhcmUgdHdvIGxvY2tzIC0gcGNwdV9hbGxvY19tdXRleCBhbmQgcGNwdV9sb2NrLiAgVGhlIGZvcm1lcgogICogcHJvdGVjdHMgYWxsb2NhdGlvbi9yZWNsYWltIHBhdGhzLCBjaHVua3MgYW5kIGNodW5rLT5wYWdlIGFycmF5cy4KICAqIFRoZSBsYXR0ZXIgaXMgYSBzcGlubG9jayBhbmQgcHJvdGVjdHMgdGhlIGluZGV4IGRhdGEgc3RydWN0dXJlcyAtCi0gKiBjaHVuayBzbG90cywgcmJ0cmVlLCBjaHVua3MgYW5kIGFyZWEgbWFwcyBpbiBjaHVua3MuCisgKiBjaHVuayBzbG90cywgY2h1bmtzIGFuZCBhcmVhIG1hcHMgaW4gY2h1bmtzLgogICoKICAqIER1cmluZyBhbGxvY2F0aW9uLCBwY3B1X2FsbG9jX211dGV4IGlzIGtlcHQgbG9ja2VkIGFsbCB0aGUgdGltZSBhbmQKICAqIHBjcHVfbG9jayBpcyBncmFiYmVkIGFuZCByZWxlYXNlZCBhcyBuZWNlc3NhcnkuICBBbGwgYWN0dWFsIG1lbW9yeQpAQCAtMTQwLDcgKzE1MCw2IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBjcHVfbG9jayk7CS8qIHByb3RlY3RzIGluZGV4IGRhdGEgc3RydWN0dXJlcyAqLwogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqcGNwdV9zbG90IF9fcmVhZF9tb3N0bHk7IC8qIGNodW5rIGxpc3Qgc2xvdHMgKi8KLXN0YXRpYyBzdHJ1Y3QgcmJfcm9vdCBwY3B1X2FkZHJfcm9vdCA9IFJCX1JPT1Q7CS8qIGNodW5rcyBieSBhZGRyZXNzICovCiAKIC8qIHJlY2xhaW0gd29yayB0byByZWxlYXNlIGZ1bGx5IGZyZWUgY2h1bmtzLCBzY2hlZHVsZWQgZnJvbSBmcmVlIHBhdGggKi8KIHN0YXRpYyB2b2lkIHBjcHVfcmVjbGFpbShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwpAQCAtMTkxLDYgKzIwMCwxOCBAQAogCXJldHVybiAqcGNwdV9jaHVua19wYWdlcChjaHVuaywgMCwgcGFnZV9pZHgpICE9IE5VTEw7CiB9CiAKKy8qIHNldCB0aGUgcG9pbnRlciB0byBhIGNodW5rIGluIGEgcGFnZSBzdHJ1Y3QgKi8KK3N0YXRpYyB2b2lkIHBjcHVfc2V0X3BhZ2VfY2h1bmsoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwY3B1X2NodW5rICpwY3B1KQoreworCXBhZ2UtPmluZGV4ID0gKHVuc2lnbmVkIGxvbmcpcGNwdTsKK30KKworLyogb2J0YWluIHBvaW50ZXIgdG8gYSBjaHVuayBmcm9tIGEgcGFnZSBzdHJ1Y3QgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNwdV9jaHVuayAqcGNwdV9nZXRfcGFnZV9jaHVuayhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBwY3B1X2NodW5rICopcGFnZS0+aW5kZXg7Cit9CisKIC8qKgogICogcGNwdV9tZW1fYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkKICAqIEBzaXplOiBieXRlcyB0byBhbGxvY2F0ZQpAQCAtMjU3LDkzICsyNzgsMjYgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqKnBjcHVfY2h1bmtfcmJfc2VhcmNoKHZvaWQgKmFkZHIsCi0JCQkJCSAgICAgc3RydWN0IHJiX25vZGUgKipwYXJlbnRwKQotewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZwY3B1X2FkZHJfcm9vdC5yYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBwY3B1X2NodW5rICpjaHVuazsKLQotCXdoaWxlICgqcCkgewotCQlwYXJlbnQgPSAqcDsKLQkJY2h1bmsgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBwY3B1X2NodW5rLCByYl9ub2RlKTsKLQotCQlpZiAoYWRkciA8IGNodW5rLT52bS0+YWRkcikKLQkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoYWRkciA+IGNodW5rLT52bS0+YWRkcikKLQkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQotCWlmIChwYXJlbnRwKQotCQkqcGFyZW50cCA9IHBhcmVudDsKLQlyZXR1cm4gcDsKLX0KLQogLyoqCi0gKiBwY3B1X2NodW5rX2FkZHJfc2VhcmNoIC0gc2VhcmNoIGZvciBjaHVuayBjb250YWluaW5nIHNwZWNpZmllZCBhZGRyZXNzCi0gKiBAYWRkcjogYWRkcmVzcyB0byBzZWFyY2ggZm9yCi0gKgotICogTG9vayBmb3IgY2h1bmsgd2hpY2ggbWlnaHQgY29udGFpbiBAYWRkci4gIE1vcmUgc3BlY2lmaWNhbGx5LCBpdAotICogc2VhcmNocyBmb3IgdGhlIGNodW5rIHdpdGggdGhlIGhpZ2hlc3Qgc3RhcnQgYWRkcmVzcyB3aGljaCBpc24ndAotICogYmV5b25kIEBhZGRyLgotICoKLSAqIENPTlRFWFQ6Ci0gKiBwY3B1X2xvY2suCisgKiBwY3B1X2NodW5rX2FkZHJfc2VhcmNoIC0gZGV0ZXJtaW5lIGNodW5rIGNvbnRhaW5pbmcgc3BlY2lmaWVkIGFkZHJlc3MKKyAqIEBhZGRyOiBhZGRyZXNzIGZvciB3aGljaCB0aGUgY2h1bmsgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZC4KICAqCiAgKiBSRVRVUk5TOgogICogVGhlIGFkZHJlc3Mgb2YgdGhlIGZvdW5kIGNodW5rLgogICovCiBzdGF0aWMgc3RydWN0IHBjcHVfY2h1bmsgKnBjcHVfY2h1bmtfYWRkcl9zZWFyY2godm9pZCAqYWRkcikKIHsKLQlzdHJ1Y3QgcmJfbm9kZSAqbiwgKnBhcmVudDsKLQlzdHJ1Y3QgcGNwdV9jaHVuayAqY2h1bms7CisJdm9pZCAqZmlyc3Rfc3RhcnQgPSBwY3B1X2ZpcnN0X2NodW5rLT52bS0+YWRkcjsKIAotCS8qIGlzIGl0IGluIHRoZSByZXNlcnZlZCBjaHVuaz8gKi8KLQlpZiAocGNwdV9yZXNlcnZlZF9jaHVuaykgewotCQl2b2lkICpzdGFydCA9IHBjcHVfcmVzZXJ2ZWRfY2h1bmstPnZtLT5hZGRyOwotCi0JCWlmIChhZGRyID49IHN0YXJ0ICYmIGFkZHIgPCBzdGFydCArIHBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQpCisJLyogaXMgaXQgaW4gdGhlIGZpcnN0IGNodW5rPyAqLworCWlmIChhZGRyID49IGZpcnN0X3N0YXJ0ICYmIGFkZHIgPCBmaXJzdF9zdGFydCArIHBjcHVfY2h1bmtfc2l6ZSkgeworCQkvKiBpcyBpdCBpbiB0aGUgcmVzZXJ2ZWQgYXJlYT8gKi8KKwkJaWYgKGFkZHIgPCBmaXJzdF9zdGFydCArIHBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQpCiAJCQlyZXR1cm4gcGNwdV9yZXNlcnZlZF9jaHVuazsKKwkJcmV0dXJuIHBjcHVfZmlyc3RfY2h1bms7CiAJfQogCi0JLyogbmFoLi4uIHNlYXJjaCB0aGUgcmVndWxhciBvbmVzICovCi0JbiA9ICpwY3B1X2NodW5rX3JiX3NlYXJjaChhZGRyLCAmcGFyZW50KTsKLQlpZiAoIW4pIHsKLQkJLyogbm8gZXhhY3RseSBtYXRjaGluZyBjaHVuaywgdGhlIHBhcmVudCBpcyB0aGUgY2xvc2VzdCAqLwotCQluID0gcGFyZW50OwotCQlCVUdfT04oIW4pOwotCX0KLQljaHVuayA9IHJiX2VudHJ5KG4sIHN0cnVjdCBwY3B1X2NodW5rLCByYl9ub2RlKTsKLQotCWlmIChhZGRyIDwgY2h1bmstPnZtLT5hZGRyKSB7Ci0JCS8qIHRoZSBwYXJlbnQgd2FzIHRoZSBuZXh0IG9uZSwgbG9vayBmb3IgdGhlIHByZXZpb3VzIG9uZSAqLwotCQluID0gcmJfcHJldihuKTsKLQkJQlVHX09OKCFuKTsKLQkJY2h1bmsgPSByYl9lbnRyeShuLCBzdHJ1Y3QgcGNwdV9jaHVuaywgcmJfbm9kZSk7Ci0JfQotCi0JcmV0dXJuIGNodW5rOwotfQotCi0vKioKLSAqIHBjcHVfY2h1bmtfYWRkcl9pbnNlcnQgLSBpbnNlcnQgY2h1bmsgaW50byBhZGRyZXNzIHJiIHRyZWUKLSAqIEBuZXc6IGNodW5rIHRvIGluc2VydAotICoKLSAqIEluc2VydCBAbmV3IGludG8gYWRkcmVzcyByYiB0cmVlLgotICoKLSAqIENPTlRFWFQ6Ci0gKiBwY3B1X2xvY2suCi0gKi8KLXN0YXRpYyB2b2lkIHBjcHVfY2h1bmtfYWRkcl9pbnNlcnQoc3RydWN0IHBjcHVfY2h1bmsgKm5ldykKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAsICpwYXJlbnQ7Ci0KLQlwID0gcGNwdV9jaHVua19yYl9zZWFyY2gobmV3LT52bS0+YWRkciwgJnBhcmVudCk7Ci0JQlVHX09OKCpwKTsKLQlyYl9saW5rX25vZGUoJm5ldy0+cmJfbm9kZSwgcGFyZW50LCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJm5ldy0+cmJfbm9kZSwgJnBjcHVfYWRkcl9yb290KTsKKwlyZXR1cm4gcGNwdV9nZXRfcGFnZV9jaHVuayh2bWFsbG9jX3RvX3BhZ2UoYWRkcikpOwogfQogCiAvKioKQEAgLTc1NSw2ICs3MDksNyBAQAogCQkJCQkJICBhbGxvY19tYXNrLCAwKTsKIAkJCWlmICghKnBhZ2VwKQogCQkJCWdvdG8gZXJyOworCQkJcGNwdV9zZXRfcGFnZV9jaHVuaygqcGFnZXAsIGNodW5rKTsKIAkJfQogCX0KIApAQCAtODc5LDcgKzgzNCw2IEBACiAKIAlzcGluX2xvY2tfaXJxKCZwY3B1X2xvY2spOwogCXBjcHVfY2h1bmtfcmVsb2NhdGUoY2h1bmssIC0xKTsKLQlwY3B1X2NodW5rX2FkZHJfaW5zZXJ0KGNodW5rKTsKIAlnb3RvIHJlc3RhcnQ7CiAKIGFyZWFfZm91bmQ6CkBAIC05NjgsNyArOTIyLDYgQEAKIAkJaWYgKGNodW5rID09IGxpc3RfZmlyc3RfZW50cnkoaGVhZCwgc3RydWN0IHBjcHVfY2h1bmssIGxpc3QpKQogCQkJY29udGludWU7CiAKLQkJcmJfZXJhc2UoJmNodW5rLT5yYl9ub2RlLCAmcGNwdV9hZGRyX3Jvb3QpOwogCQlsaXN0X21vdmUoJmNodW5rLT5saXN0LCAmdG9kbyk7CiAJfQogCkBAIC0xMTQ3LDcgKzExMDAsOCBAQAogCiAJaWYgKHJlc2VydmVkX3NpemUpIHsKIAkJc2NodW5rLT5mcmVlX3NpemUgPSByZXNlcnZlZF9zaXplOwotCQlwY3B1X3Jlc2VydmVkX2NodW5rID0gc2NodW5rOwkvKiBub3QgZm9yIGR5bmFtaWMgYWxsb2MgKi8KKwkJcGNwdV9yZXNlcnZlZF9jaHVuayA9IHNjaHVuazsKKwkJcGNwdV9yZXNlcnZlZF9jaHVua19saW1pdCA9IHN0YXRpY19zaXplICsgcmVzZXJ2ZWRfc2l6ZTsKIAl9IGVsc2UgewogCQlzY2h1bmstPmZyZWVfc2l6ZSA9IGR5bl9zaXplOwogCQlkeW5fc2l6ZSA9IDA7CQkJLyogZHluYW1pYyBhcmVhIGNvdmVyZWQgKi8KQEAgLTExNTgsOCArMTExMiw2IEBACiAJaWYgKHNjaHVuay0+ZnJlZV9zaXplKQogCQlzY2h1bmstPm1hcFtzY2h1bmstPm1hcF91c2VkKytdID0gc2NodW5rLT5mcmVlX3NpemU7CiAKLQlwY3B1X3Jlc2VydmVkX2NodW5rX2xpbWl0ID0gc3RhdGljX3NpemUgKyBzY2h1bmstPmZyZWVfc2l6ZTsKLQogCS8qIGluaXQgZHluYW1pYyBjaHVuayBpZiBuZWNlc3NhcnkgKi8KIAlpZiAoZHluX3NpemUpIHsKIAkJZGNodW5rID0gYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IHBjcHVfY2h1bmspKTsKQEAgLTEyMjYsMTMgKzExNzgsOCBAQAogCX0KIAogCS8qIGxpbmsgdGhlIGZpcnN0IGNodW5rIGluICovCi0JaWYgKCFkY2h1bmspIHsKLQkJcGNwdV9jaHVua19yZWxvY2F0ZShzY2h1bmssIC0xKTsKLQkJcGNwdV9jaHVua19hZGRyX2luc2VydChzY2h1bmspOwotCX0gZWxzZSB7Ci0JCXBjcHVfY2h1bmtfcmVsb2NhdGUoZGNodW5rLCAtMSk7Ci0JCXBjcHVfY2h1bmtfYWRkcl9pbnNlcnQoZGNodW5rKTsKLQl9CisJcGNwdV9maXJzdF9jaHVuayA9IGRjaHVuayA/OiBzY2h1bms7CisJcGNwdV9jaHVua19yZWxvY2F0ZShwY3B1X2ZpcnN0X2NodW5rLCAtMSk7CiAKIAkvKiB3ZSdyZSBkb25lICovCiAJcGNwdV9iYXNlX2FkZHIgPSAodm9pZCAqKXBjcHVfY2h1bmtfYWRkcihzY2h1bmssIDAsIDApOwpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggYjI1Zjk1Yy4uMDEzMmZiZCAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC0yNjU5LDYgKzI2NTksNyBAQAogCWlmIChlcnJvcikKIAkJZ290byBjbG9zZV9maWxlOwogI2VuZGlmCisJaW1hX2NvdW50c19nZXQoZmlsZSk7CiAJcmV0dXJuIGZpbGU7CiAKIGNsb3NlX2ZpbGU6CkBAIC0yNjg0LDcgKzI2ODUsNiBAQAogCWlmIChJU19FUlIoZmlsZSkpCiAJCXJldHVybiBQVFJfRVJSKGZpbGUpOwogCi0JaW1hX3NobV9jaGVjayhmaWxlKTsKIAlpZiAodm1hLT52bV9maWxlKQogCQlmcHV0KHZtYS0+dm1fZmlsZSk7CiAJdm1hLT52bV9maWxlID0gZmlsZTsKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCA5YTkwYjAwLi5mNDZiNjVkIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC0xMDIsMTEgKzEwMiwxMiBAQAogI2luY2x1ZGUJPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUJPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUJPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUJPHRyYWNlL2ttZW10cmFjZS5oPgorI2luY2x1ZGUJPGxpbnV4L2ttZW10cmFjZS5oPgogI2luY2x1ZGUJPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZQk8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZQk8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUJPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZQk8bGludXgva21lbWxlYWsuaD4KICNpbmNsdWRlCTxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlCTxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUJPGxpbnV4L2ZhdWx0LWluamVjdC5oPgpAQCAtMTc4LDEzICsxNzksMTMgQEAKIAkJCSBTTEFCX1NUT1JFX1VTRVIgfCBcCiAJCQkgU0xBQl9SRUNMQUlNX0FDQ09VTlQgfCBTTEFCX1BBTklDIHwgXAogCQkJIFNMQUJfREVTVFJPWV9CWV9SQ1UgfCBTTEFCX01FTV9TUFJFQUQgfCBcCi0JCQkgU0xBQl9ERUJVR19PQkpFQ1RTKQorCQkJIFNMQUJfREVCVUdfT0JKRUNUUyB8IFNMQUJfTk9MRUFLVFJBQ0UpCiAjZWxzZQogIyBkZWZpbmUgQ1JFQVRFX01BU0sJKFNMQUJfSFdDQUNIRV9BTElHTiB8IFwKIAkJCSBTTEFCX0NBQ0hFX0RNQSB8IFwKIAkJCSBTTEFCX1JFQ0xBSU1fQUNDT1VOVCB8IFNMQUJfUEFOSUMgfCBcCiAJCQkgU0xBQl9ERVNUUk9ZX0JZX1JDVSB8IFNMQUJfTUVNX1NQUkVBRCB8IFwKLQkJCSBTTEFCX0RFQlVHX09CSkVDVFMpCisJCQkgU0xBQl9ERUJVR19PQkpFQ1RTIHwgU0xBQl9OT0xFQUtUUkFDRSkKICNlbmRpZgogCiAvKgpAQCAtMzE1LDcgKzMxNiw3IEBACiAJCQlzdHJ1Y3Qga21lbV9saXN0MyAqbDMsIGludCB0b2ZyZWUpOwogc3RhdGljIHZvaWQgZnJlZV9ibG9jayhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCB2b2lkICoqb2JqcHAsIGludCBsZW4sCiAJCQlpbnQgbm9kZSk7Ci1zdGF0aWMgaW50IGVuYWJsZV9jcHVjYWNoZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwKTsKK3N0YXRpYyBpbnQgZW5hYmxlX2NwdWNhY2hlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGdmcCk7CiBzdGF0aWMgdm9pZCBjYWNoZV9yZWFwKHN0cnVjdCB3b3JrX3N0cnVjdCAqdW51c2VkKTsKIAogLyoKQEAgLTk1OCwxMiArOTU5LDIwIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFsbG9jX2FycmF5Y2FjaGUoaW50IG5vZGUsIGludCBlbnRyaWVzLAotCQkJCQkgICAgaW50IGJhdGNoY291bnQpCisJCQkJCSAgICBpbnQgYmF0Y2hjb3VudCwgZ2ZwX3QgZ2ZwKQogewogCWludCBtZW1zaXplID0gc2l6ZW9mKHZvaWQgKikgKiBlbnRyaWVzICsgc2l6ZW9mKHN0cnVjdCBhcnJheV9jYWNoZSk7CiAJc3RydWN0IGFycmF5X2NhY2hlICpuYyA9IE5VTEw7CiAKLQluYyA9IGttYWxsb2Nfbm9kZShtZW1zaXplLCBHRlBfS0VSTkVMLCBub2RlKTsKKwluYyA9IGttYWxsb2Nfbm9kZShtZW1zaXplLCBnZnAsIG5vZGUpOworCS8qCisJICogVGhlIGFycmF5X2NhY2hlIHN0cnVjdHVyZXMgY29udGFpbiBwb2ludGVycyB0byBmcmVlIG9iamVjdC4KKwkgKiBIb3dldmVyLCB3aGVuIHN1Y2ggb2JqZWN0cyBhcmUgYWxsb2NhdGVkIG9yIHRyYW5zZmVyZWQgdG8gYW5vdGhlcgorCSAqIGNhY2hlIHRoZSBwb2ludGVycyBhcmUgbm90IGNsZWFyZWQgYW5kIHRoZXkgY291bGQgYmUgY291bnRlZCBhcworCSAqIHZhbGlkIHJlZmVyZW5jZXMgZHVyaW5nIGEga21lbWxlYWsgc2Nhbi4gVGhlcmVmb3JlLCBrbWVtbGVhayBtdXN0CisJICogbm90IHNjYW4gc3VjaCBvYmplY3RzLgorCSAqLworCWttZW1sZWFrX25vX3NjYW4obmMpOwogCWlmIChuYykgewogCQluYy0+YXZhaWwgPSAwOwogCQluYy0+bGltaXQgPSBlbnRyaWVzOwpAQCAtMTAwMyw3ICsxMDEyLDcgQEAKICNkZWZpbmUgZHJhaW5fYWxpZW5fY2FjaGUoY2FjaGVwLCBhbGllbikgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSByZWFwX2FsaWVuKGNhY2hlcCwgbDMpIGRvIHsgfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGxvY19hbGllbl9jYWNoZShpbnQgbm9kZSwgaW50IGxpbWl0KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGxvY19hbGllbl9jYWNoZShpbnQgbm9kZSwgaW50IGxpbWl0LCBnZnBfdCBnZnApCiB7CiAJcmV0dXJuIChzdHJ1Y3QgYXJyYXlfY2FjaGUgKiopQkFEX0FMSUVOX01BR0lDOwogfQpAQCAtMTAzNCw3ICsxMDQzLDcgQEAKIHN0YXRpYyB2b2lkICpfX19fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCwgaW50KTsKIHN0YXRpYyB2b2lkICphbHRlcm5hdGVfbm9kZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CiAKLXN0YXRpYyBzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGxvY19hbGllbl9jYWNoZShpbnQgbm9kZSwgaW50IGxpbWl0KQorc3RhdGljIHN0cnVjdCBhcnJheV9jYWNoZSAqKmFsbG9jX2FsaWVuX2NhY2hlKGludCBub2RlLCBpbnQgbGltaXQsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphY19wdHI7CiAJaW50IG1lbXNpemUgPSBzaXplb2Yodm9pZCAqKSAqIG5yX25vZGVfaWRzOwpAQCAtMTA0MiwxNCArMTA1MSwxNCBAQAogCiAJaWYgKGxpbWl0ID4gMSkKIAkJbGltaXQgPSAxMjsKLQlhY19wdHIgPSBrbWFsbG9jX25vZGUobWVtc2l6ZSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJYWNfcHRyID0ga21hbGxvY19ub2RlKG1lbXNpemUsIGdmcCwgbm9kZSk7CiAJaWYgKGFjX3B0cikgewogCQlmb3JfZWFjaF9ub2RlKGkpIHsKIAkJCWlmIChpID09IG5vZGUgfHwgIW5vZGVfb25saW5lKGkpKSB7CiAJCQkJYWNfcHRyW2ldID0gTlVMTDsKIAkJCQljb250aW51ZTsKIAkJCX0KLQkJCWFjX3B0cltpXSA9IGFsbG9jX2FycmF5Y2FjaGUobm9kZSwgbGltaXQsIDB4YmFhZGYwMGQpOworCQkJYWNfcHRyW2ldID0gYWxsb2NfYXJyYXljYWNoZShub2RlLCBsaW1pdCwgMHhiYWFkZjAwZCwgZ2ZwKTsKIAkJCWlmICghYWNfcHRyW2ldKSB7CiAJCQkJZm9yIChpLS07IGkgPj0gMDsgaS0tKQogCQkJCQlrZnJlZShhY19wdHJbaV0pOwpAQCAtMTI4MiwyMCArMTI5MSwyMCBAQAogCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGllbiA9IE5VTEw7CiAKIAkJbmMgPSBhbGxvY19hcnJheWNhY2hlKG5vZGUsIGNhY2hlcC0+bGltaXQsCi0JCQkJCWNhY2hlcC0+YmF0Y2hjb3VudCk7CisJCQkJCWNhY2hlcC0+YmF0Y2hjb3VudCwgR0ZQX0tFUk5FTCk7CiAJCWlmICghbmMpCiAJCQlnb3RvIGJhZDsKIAkJaWYgKGNhY2hlcC0+c2hhcmVkKSB7CiAJCQlzaGFyZWQgPSBhbGxvY19hcnJheWNhY2hlKG5vZGUsCiAJCQkJY2FjaGVwLT5zaGFyZWQgKiBjYWNoZXAtPmJhdGNoY291bnQsCi0JCQkJMHhiYWFkZjAwZCk7CisJCQkJMHhiYWFkZjAwZCwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXNoYXJlZCkgewogCQkJCWtmcmVlKG5jKTsKIAkJCQlnb3RvIGJhZDsKIAkJCX0KIAkJfQogCQlpZiAodXNlX2FsaWVuX2NhY2hlcykgewotCQkJYWxpZW4gPSBhbGxvY19hbGllbl9jYWNoZShub2RlLCBjYWNoZXAtPmxpbWl0KTsKKwkJCWFsaWVuID0gYWxsb2NfYWxpZW5fY2FjaGUobm9kZSwgY2FjaGVwLT5saW1pdCwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIWFsaWVuKSB7CiAJCQkJa2ZyZWUoc2hhcmVkKTsKIAkJCQlrZnJlZShuYyk7CkBAIC0xMzk5LDEwICsxNDA4LDkgQEAKIHsKIAlzdHJ1Y3Qga21lbV9saXN0MyAqcHRyOwogCi0JcHRyID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qga21lbV9saXN0MyksIEdGUF9LRVJORUwsIG5vZGVpZCk7CisJcHRyID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qga21lbV9saXN0MyksIEdGUF9OT1dBSVQsIG5vZGVpZCk7CiAJQlVHX09OKCFwdHIpOwogCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAltZW1jcHkocHRyLCBsaXN0LCBzaXplb2Yoc3RydWN0IGttZW1fbGlzdDMpKTsKIAkvKgogCSAqIERvIG5vdCBhc3N1bWUgdGhhdCBzcGlubG9ja3MgY2FuIGJlIGluaXRpYWxpemVkIHZpYSBtZW1jcHk6CkBAIC0xNDExLDcgKzE0MTksNiBAQAogCiAJTUFLRV9BTExfTElTVFMoY2FjaGVwLCBwdHIsIG5vZGVpZCk7CiAJY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXSA9IHB0cjsKLQlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAKIC8qCkBAIC0xNTc1LDkgKzE1ODIsOCBAQAogCXsKIAkJc3RydWN0IGFycmF5X2NhY2hlICpwdHI7CiAKLQkJcHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCksIEdGUF9LRVJORUwpOworCQlwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSwgR0ZQX05PV0FJVCk7CiAKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJQlVHX09OKGNwdV9jYWNoZV9nZXQoJmNhY2hlX2NhY2hlKSAhPSAmaW5pdGFycmF5X2NhY2hlLmNhY2hlKTsKIAkJbWVtY3B5KHB0ciwgY3B1X2NhY2hlX2dldCgmY2FjaGVfY2FjaGUpLAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBhcnJheWNhY2hlX2luaXQpKTsKQEAgLTE1ODcsMTEgKzE1OTMsOSBAQAogCQlzcGluX2xvY2tfaW5pdCgmcHRyLT5sb2NrKTsKIAogCQljYWNoZV9jYWNoZS5hcnJheVtzbXBfcHJvY2Vzc29yX2lkKCldID0gcHRyOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLQkJcHRyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCksIEdGUF9LRVJORUwpOworCQlwdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSwgR0ZQX05PV0FJVCk7CiAKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAkJQlVHX09OKGNwdV9jYWNoZV9nZXQobWFsbG9jX3NpemVzW0lOREVYX0FDXS5jc19jYWNoZXApCiAJCSAgICAgICAhPSAmaW5pdGFycmF5X2dlbmVyaWMuY2FjaGUpOwogCQltZW1jcHkocHRyLCBjcHVfY2FjaGVfZ2V0KG1hbGxvY19zaXplc1tJTkRFWF9BQ10uY3NfY2FjaGVwKSwKQEAgLTE2MDMsNyArMTYwNyw2IEBACiAKIAkJbWFsbG9jX3NpemVzW0lOREVYX0FDXS5jc19jYWNoZXAtPmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPQogCQkgICAgcHRyOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfQogCS8qIDUpIFJlcGxhY2UgdGhlIGJvb3RzdHJhcCBrbWVtX2xpc3QzJ3MgKi8KIAl7CkBAIC0xNjI3LDcgKzE2MzAsNyBAQAogCQlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwogCQltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGVwLCAmY2FjaGVfY2hhaW4sIG5leHQpCi0JCQlpZiAoZW5hYmxlX2NwdWNhY2hlKGNhY2hlcCkpCisJCQlpZiAoZW5hYmxlX2NwdWNhY2hlKGNhY2hlcCwgR0ZQX05PV0FJVCkpCiAJCQkJQlVHKCk7CiAJCW11dGV4X3VubG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogCX0KQEAgLTIwNjQsMTAgKzIwNjcsMTAgQEAKIAlyZXR1cm4gbGVmdF9vdmVyOwogfQogCi1zdGF0aWMgaW50IF9faW5pdF9yZWZvayBzZXR1cF9jcHVfY2FjaGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCkKK3N0YXRpYyBpbnQgX19pbml0X3JlZm9rIHNldHVwX2NwdV9jYWNoZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBnZnApCiB7CiAJaWYgKGdfY3B1Y2FjaGVfdXAgPT0gRlVMTCkKLQkJcmV0dXJuIGVuYWJsZV9jcHVjYWNoZShjYWNoZXApOworCQlyZXR1cm4gZW5hYmxlX2NwdWNhY2hlKGNhY2hlcCwgZ2ZwKTsKIAogCWlmIChnX2NwdWNhY2hlX3VwID09IE5PTkUpIHsKIAkJLyoKQEAgLTIwODksNyArMjA5Miw3IEBACiAJCQlnX2NwdWNhY2hlX3VwID0gUEFSVElBTF9BQzsKIAl9IGVsc2UgewogCQljYWNoZXAtPmFycmF5W3NtcF9wcm9jZXNzb3JfaWQoKV0gPQotCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCksIEdGUF9LRVJORUwpOworCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGFycmF5Y2FjaGVfaW5pdCksIGdmcCk7CiAKIAkJaWYgKGdfY3B1Y2FjaGVfdXAgPT0gUEFSVElBTF9BQykgewogCQkJc2V0X3VwX2xpc3QzcyhjYWNoZXAsIFNJWkVfTDMpOwpAQCAtMjE1Myw2ICsyMTU2LDcgQEAKIHsKIAlzaXplX3QgbGVmdF9vdmVyLCBzbGFiX3NpemUsIHJhbGlnbjsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gTlVMTCwgKnBjOworCWdmcF90IGdmcDsKIAogCS8qCiAJICogU2FuaXR5IGNoZWNrcy4uLiB0aGVzZSBhcmUgYWxsIHNlcmlvdXMgdXNhZ2UgYnVncy4KQEAgLTIxNjgsOCArMjE3MiwxMCBAQAogCSAqIFdlIHVzZSBjYWNoZV9jaGFpbl9tdXRleCB0byBlbnN1cmUgYSBjb25zaXN0ZW50IHZpZXcgb2YKIAkgKiBjcHVfb25saW5lX21hc2sgYXMgd2VsbC4gIFBsZWFzZSBzZWUgY3B1dXBfY2FsbGJhY2sKIAkgKi8KLQlnZXRfb25saW5lX2NwdXMoKTsKLQltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CisJaWYgKHNsYWJfaXNfYXZhaWxhYmxlKCkpIHsKKwkJZ2V0X29ubGluZV9jcHVzKCk7CisJCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKKwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjLCAmY2FjaGVfY2hhaW4sIG5leHQpIHsKIAkJY2hhciB0bXA7CkBAIC0yMjc4LDggKzIyODQsMTMgQEAKIAkgKi8KIAlhbGlnbiA9IHJhbGlnbjsKIAorCWlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKQorCQlnZnAgPSBHRlBfS0VSTkVMOworCWVsc2UKKwkJZ2ZwID0gR0ZQX05PV0FJVDsKKwogCS8qIEdldCBjYWNoZSdzIGRlc2NyaXB0aW9uIG9iai4gKi8KLQljYWNoZXAgPSBrbWVtX2NhY2hlX3phbGxvYygmY2FjaGVfY2FjaGUsIEdGUF9LRVJORUwpOworCWNhY2hlcCA9IGttZW1fY2FjaGVfemFsbG9jKCZjYWNoZV9jYWNoZSwgZ2ZwKTsKIAlpZiAoIWNhY2hlcCkKIAkJZ290byBvb3BzOwogCkBAIC0yMzgyLDcgKzIzOTMsNyBAQAogCWNhY2hlcC0+Y3RvciA9IGN0b3I7CiAJY2FjaGVwLT5uYW1lID0gbmFtZTsKIAotCWlmIChzZXR1cF9jcHVfY2FjaGUoY2FjaGVwKSkgeworCWlmIChzZXR1cF9jcHVfY2FjaGUoY2FjaGVwLCBnZnApKSB7CiAJCV9fa21lbV9jYWNoZV9kZXN0cm95KGNhY2hlcCk7CiAJCWNhY2hlcCA9IE5VTEw7CiAJCWdvdG8gb29wczsKQEAgLTIzOTQsOCArMjQwNSwxMCBAQAogCWlmICghY2FjaGVwICYmIChmbGFncyAmIFNMQUJfUEFOSUMpKQogCQlwYW5pYygia21lbV9jYWNoZV9jcmVhdGUoKTogZmFpbGVkIHRvIGNyZWF0ZSBzbGFiIGAlcydcbiIsCiAJCSAgICAgIG5hbWUpOwotCW11dGV4X3VubG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwotCXB1dF9vbmxpbmVfY3B1cygpOworCWlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKSB7CisJCW11dGV4X3VubG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOworCQlwdXRfb25saW5lX2NwdXMoKTsKKwl9CiAJcmV0dXJuIGNhY2hlcDsKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9jcmVhdGUpOwpAQCAtMjYyMSw2ICsyNjM0LDE0IEBACiAJCS8qIFNsYWIgbWFuYWdlbWVudCBvYmogaXMgb2ZmLXNsYWIuICovCiAJCXNsYWJwID0ga21lbV9jYWNoZV9hbGxvY19ub2RlKGNhY2hlcC0+c2xhYnBfY2FjaGUsCiAJCQkJCSAgICAgIGxvY2FsX2ZsYWdzLCBub2RlaWQpOworCQkvKgorCQkgKiBJZiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBzbGFiIGlzIGxlYWtlZCAoaXQncyBhbGxvY2F0ZWQKKwkJICogYnV0IG5vIG9uZSBoYXMgYSByZWZlcmVuY2UgdG8gaXQpLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZQorCQkgKiBrbWVtbGVhayBkb2VzIG5vdCB0cmVhdCB0aGUgLT5zX21lbSBwb2ludGVyIGFzIGEgcmVmZXJlbmNlCisJCSAqIHRvIHRoZSBvYmplY3QuIE90aGVyd2lzZSB3ZSB3aWxsIG5vdCByZXBvcnQgdGhlIGxlYWsuCisJCSAqLworCQlrbWVtbGVha19zY2FuX2FyZWEoc2xhYnAsIG9mZnNldG9mKHN0cnVjdCBzbGFiLCBsaXN0KSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksIGxvY2FsX2ZsYWdzKTsKIAkJaWYgKCFzbGFicCkKIAkJCXJldHVybiBOVUxMOwogCX0gZWxzZSB7CkBAIC0zMTQxLDYgKzMxNjIsMTIgQEAKIAkJU1RBVFNfSU5DX0FMTE9DTUlTUyhjYWNoZXApOwogCQlvYmpwID0gY2FjaGVfYWxsb2NfcmVmaWxsKGNhY2hlcCwgZmxhZ3MpOwogCX0KKwkvKgorCSAqIFRvIGF2b2lkIGEgZmFsc2UgbmVnYXRpdmUsIGlmIGFuIG9iamVjdCB0aGF0IGlzIGluIG9uZSBvZiB0aGUKKwkgKiBwZXItQ1BVIGNhY2hlcyBpcyBsZWFrZWQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGttZW1sZWFrIGRvZXNuJ3QKKwkgKiB0cmVhdCB0aGUgYXJyYXkgcG9pbnRlcnMgYXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4KKwkgKi8KKwlrbWVtbGVha19lcmFzZSgmYWMtPmVudHJ5W2FjLT5hdmFpbF0pOwogCXJldHVybiBvYmpwOwogfQogCkBAIC0zMzYwLDYgKzMzODcsOCBAQAogICBvdXQ6CiAJbG9jYWxfaXJxX3Jlc3RvcmUoc2F2ZV9mbGFncyk7CiAJcHRyID0gY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIGZsYWdzLCBwdHIsIGNhbGxlcik7CisJa21lbWxlYWtfYWxsb2NfcmVjdXJzaXZlKHB0ciwgb2JqX3NpemUoY2FjaGVwKSwgMSwgY2FjaGVwLT5mbGFncywKKwkJCQkgZmxhZ3MpOwogCiAJaWYgKHVubGlrZWx5KChmbGFncyAmIF9fR0ZQX1pFUk8pICYmIHB0cikpCiAJCW1lbXNldChwdHIsIDAsIG9ial9zaXplKGNhY2hlcCkpOwpAQCAtMzQxNSw2ICszNDQ0LDggQEAKIAlvYmpwID0gX19kb19jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShzYXZlX2ZsYWdzKTsKIAlvYmpwID0gY2FjaGVfYWxsb2NfZGVidWdjaGVja19hZnRlcihjYWNoZXAsIGZsYWdzLCBvYmpwLCBjYWxsZXIpOworCWttZW1sZWFrX2FsbG9jX3JlY3Vyc2l2ZShvYmpwLCBvYmpfc2l6ZShjYWNoZXApLCAxLCBjYWNoZXAtPmZsYWdzLAorCQkJCSBmbGFncyk7CiAJcHJlZmV0Y2h3KG9ianApOwogCiAJaWYgKHVubGlrZWx5KChmbGFncyAmIF9fR0ZQX1pFUk8pICYmIG9ianApKQpAQCAtMzUzMCw2ICszNTYxLDcgQEAKIAlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFjID0gY3B1X2NhY2hlX2dldChjYWNoZXApOwogCiAJY2hlY2tfaXJxX29mZigpOworCWttZW1sZWFrX2ZyZWVfcmVjdXJzaXZlKG9ianAsIGNhY2hlcC0+ZmxhZ3MpOwogCW9ianAgPSBjYWNoZV9mcmVlX2RlYnVnY2hlY2soY2FjaGVwLCBvYmpwLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCiAJLyoKQEAgLTM4MDIsNyArMzgzNCw3IEBACiAvKgogICogVGhpcyBpbml0aWFsaXplcyBrbWVtX2xpc3QzIG9yIHJlc2l6ZXMgdmFyaW91cyBjYWNoZXMgZm9yIGFsbCBub2Rlcy4KICAqLwotc3RhdGljIGludCBhbGxvY19rbWVtbGlzdChzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwKQorc3RhdGljIGludCBhbGxvY19rbWVtbGlzdChzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBnZnBfdCBnZnApCiB7CiAJaW50IG5vZGU7CiAJc3RydWN0IGttZW1fbGlzdDMgKmwzOwpAQCAtMzgxMiw3ICszODQ0LDcgQEAKIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKSB7CiAKICAgICAgICAgICAgICAgICBpZiAodXNlX2FsaWVuX2NhY2hlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FsaWVuID0gYWxsb2NfYWxpZW5fY2FjaGUobm9kZSwgY2FjaGVwLT5saW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfYWxpZW4gPSBhbGxvY19hbGllbl9jYWNoZShub2RlLCBjYWNoZXAtPmxpbWl0LCBnZnApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXdfYWxpZW4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgICAgICB9CkBAIC0zODIxLDcgKzM4NTMsNyBAQAogCQlpZiAoY2FjaGVwLT5zaGFyZWQpIHsKIAkJCW5ld19zaGFyZWQgPSBhbGxvY19hcnJheWNhY2hlKG5vZGUsCiAJCQkJY2FjaGVwLT5zaGFyZWQqY2FjaGVwLT5iYXRjaGNvdW50LAotCQkJCQkweGJhYWRmMDBkKTsKKwkJCQkJMHhiYWFkZjAwZCwgZ2ZwKTsKIAkJCWlmICghbmV3X3NoYXJlZCkgewogCQkJCWZyZWVfYWxpZW5fY2FjaGUobmV3X2FsaWVuKTsKIAkJCQlnb3RvIGZhaWw7CkBAIC0zODUwLDcgKzM4ODIsNyBAQAogCQkJZnJlZV9hbGllbl9jYWNoZShuZXdfYWxpZW4pOwogCQkJY29udGludWU7CiAJCX0KLQkJbDMgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKSwgR0ZQX0tFUk5FTCwgbm9kZSk7CisJCWwzID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qga21lbV9saXN0MyksIGdmcCwgbm9kZSk7CiAJCWlmICghbDMpIHsKIAkJCWZyZWVfYWxpZW5fY2FjaGUobmV3X2FsaWVuKTsKIAkJCWtmcmVlKG5ld19zaGFyZWQpOwpAQCAtMzkwNiwxOCArMzkzOCwxOCBAQAogCiAvKiBBbHdheXMgY2FsbGVkIHdpdGggdGhlIGNhY2hlX2NoYWluX211dGV4IGhlbGQgKi8KIHN0YXRpYyBpbnQgZG9fdHVuZV9jcHVjYWNoZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBpbnQgbGltaXQsCi0JCQkJaW50IGJhdGNoY291bnQsIGludCBzaGFyZWQpCisJCQkJaW50IGJhdGNoY291bnQsIGludCBzaGFyZWQsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgY2N1cGRhdGVfc3RydWN0ICpuZXc7CiAJaW50IGk7CiAKLQluZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJbmV3ID0ga3phbGxvYyhzaXplb2YoKm5ldyksIGdmcCk7CiAJaWYgKCFuZXcpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CiAJCW5ldy0+bmV3W2ldID0gYWxsb2NfYXJyYXljYWNoZShjcHVfdG9fbm9kZShpKSwgbGltaXQsCi0JCQkJCQliYXRjaGNvdW50KTsKKwkJCQkJCWJhdGNoY291bnQsIGdmcCk7CiAJCWlmICghbmV3LT5uZXdbaV0pIHsKIAkJCWZvciAoaS0tOyBpID49IDA7IGktLSkKIAkJCQlrZnJlZShuZXctPm5ld1tpXSk7CkBAIC0zOTQ0LDExICszOTc2LDExIEBACiAJCWtmcmVlKGNjb2xkKTsKIAl9CiAJa2ZyZWUobmV3KTsKLQlyZXR1cm4gYWxsb2Nfa21lbWxpc3QoY2FjaGVwKTsKKwlyZXR1cm4gYWxsb2Nfa21lbWxpc3QoY2FjaGVwLCBnZnApOwogfQogCiAvKiBDYWxsZWQgd2l0aCBjYWNoZV9jaGFpbl9tdXRleCBoZWxkIGFsd2F5cyAqLwotc3RhdGljIGludCBlbmFibGVfY3B1Y2FjaGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCkKK3N0YXRpYyBpbnQgZW5hYmxlX2NwdWNhY2hlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGdmcCkKIHsKIAlpbnQgZXJyOwogCWludCBsaW1pdCwgc2hhcmVkOwpAQCAtMzk5NCw3ICs0MDI2LDcgQEAKIAlpZiAobGltaXQgPiAzMikKIAkJbGltaXQgPSAzMjsKICNlbmRpZgotCWVyciA9IGRvX3R1bmVfY3B1Y2FjaGUoY2FjaGVwLCBsaW1pdCwgKGxpbWl0ICsgMSkgLyAyLCBzaGFyZWQpOworCWVyciA9IGRvX3R1bmVfY3B1Y2FjaGUoY2FjaGVwLCBsaW1pdCwgKGxpbWl0ICsgMSkgLyAyLCBzaGFyZWQsIGdmcCk7CiAJaWYgKGVycikKIAkJcHJpbnRrKEtFUk5fRVJSICJlbmFibGVfY3B1Y2FjaGUgZmFpbGVkIGZvciAlcywgZXJyb3IgJWQuXG4iLAogCQkgICAgICAgY2FjaGVwLT5uYW1lLCAtZXJyKTsKQEAgLTQzMDAsNyArNDMzMiw4IEBACiAJCQkJcmVzID0gMDsKIAkJCX0gZWxzZSB7CiAJCQkJcmVzID0gZG9fdHVuZV9jcHVjYWNoZShjYWNoZXAsIGxpbWl0LAotCQkJCQkJICAgICAgIGJhdGNoY291bnQsIHNoYXJlZCk7CisJCQkJCQkgICAgICAgYmF0Y2hjb3VudCwgc2hhcmVkLAorCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL21tL3Nsb2IuYyBiL21tL3Nsb2IuYwppbmRleCBmOTJlNjZkLi4xMmYyNjE0IDEwMDY0NAotLS0gYS9tbS9zbG9iLmMKKysrIGIvbW0vc2xvYi5jCkBAIC02Niw3ICs2Niw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8dHJhY2Uva21lbXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKIC8qCkBAIC01MDksNiArNTEwLDcgQEAKIAkJCQkgICBzaXplLCBQQUdFX1NJWkUgPDwgb3JkZXIsIGdmcCwgbm9kZSk7CiAJfQogCisJa21lbWxlYWtfYWxsb2MocmV0LCBzaXplLCAxLCBnZnApOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKF9fa21hbGxvY19ub2RlKTsKQEAgLTUyMSw2ICs1MjMsNyBAQAogCiAJaWYgKHVubGlrZWx5KFpFUk9fT1JfTlVMTF9QVFIoYmxvY2spKSkKIAkJcmV0dXJuOworCWttZW1sZWFrX2ZyZWUoYmxvY2spOwogCiAJc3AgPSBzbG9iX3BhZ2UoYmxvY2spOwogCWlmIChpc19zbG9iX3BhZ2Uoc3ApKSB7CkBAIC01ODQsMTIgKzU4NywxNCBAQAogCX0gZWxzZSBpZiAoZmxhZ3MgJiBTTEFCX1BBTklDKQogCQlwYW5pYygiQ2Fubm90IGNyZWF0ZSBzbGFiIGNhY2hlICVzXG4iLCBuYW1lKTsKIAorCWttZW1sZWFrX2FsbG9jKGMsIHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZSksIDEsIEdGUF9LRVJORUwpOwogCXJldHVybiBjOwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2NyZWF0ZSk7CiAKIHZvaWQga21lbV9jYWNoZV9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICpjKQogeworCWttZW1sZWFrX2ZyZWUoYyk7CiAJc2xvYl9mcmVlKGMsIHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZSkpOwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2Rlc3Ryb3kpOwpAQCAtNjEzLDYgKzYxOCw3IEBACiAJaWYgKGMtPmN0b3IpCiAJCWMtPmN0b3IoYik7CiAKKwlrbWVtbGVha19hbGxvY19yZWN1cnNpdmUoYiwgYy0+c2l6ZSwgMSwgYy0+ZmxhZ3MsIGZsYWdzKTsKIAlyZXR1cm4gYjsKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKQEAgLTYzNSw2ICs2NDEsNyBAQAogCiB2b2lkIGttZW1fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqYywgdm9pZCAqYikKIHsKKwlrbWVtbGVha19mcmVlX3JlY3Vyc2l2ZShiLCBjLT5mbGFncyk7CiAJaWYgKHVubGlrZWx5KGMtPmZsYWdzICYgU0xBQl9ERVNUUk9ZX0JZX1JDVSkpIHsKIAkJc3RydWN0IHNsb2JfcmN1ICpzbG9iX3JjdTsKIAkJc2xvYl9yY3UgPSBiICsgKGMtPnNpemUgLSBzaXplb2Yoc3RydWN0IHNsb2JfcmN1KSk7CmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggNjVmZmRhNS4uMzk2NGQzYyAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMTcsOSArMTcsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8dHJhY2Uva21lbXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnb2JqZWN0cy5oPgpAQCAtMTQzLDcgKzE0NCw3IEBACiAgKiBTZXQgb2YgZmxhZ3MgdGhhdCB3aWxsIHByZXZlbnQgc2xhYiBtZXJnaW5nCiAgKi8KICNkZWZpbmUgU0xVQl9ORVZFUl9NRVJHRSAoU0xBQl9SRURfWk9ORSB8IFNMQUJfUE9JU09OIHwgU0xBQl9TVE9SRV9VU0VSIHwgXAotCQlTTEFCX1RSQUNFIHwgU0xBQl9ERVNUUk9ZX0JZX1JDVSkKKwkJU0xBQl9UUkFDRSB8IFNMQUJfREVTVFJPWV9CWV9SQ1UgfCBTTEFCX05PTEVBS1RSQUNFKQogCiAjZGVmaW5lIFNMVUJfTUVSR0VfU0FNRSAoU0xBQl9ERUJVR19GUkVFIHwgU0xBQl9SRUNMQUlNX0FDQ09VTlQgfCBcCiAJCVNMQUJfQ0FDSEVfRE1BKQpAQCAtMTYxNyw2ICsxNjE4LDcgQEAKIAlpZiAodW5saWtlbHkoKGdmcGZsYWdzICYgX19HRlBfWkVSTykgJiYgb2JqZWN0KSkKIAkJbWVtc2V0KG9iamVjdCwgMCwgb2Jqc2l6ZSk7CiAKKwlrbWVtbGVha19hbGxvY19yZWN1cnNpdmUob2JqZWN0LCBvYmpzaXplLCAxLCBzLT5mbGFncywgZ2ZwZmxhZ3MpOwogCXJldHVybiBvYmplY3Q7CiB9CiAKQEAgLTE3NDYsNiArMTc0OCw3IEBACiAJc3RydWN0IGttZW1fY2FjaGVfY3B1ICpjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlrbWVtbGVha19mcmVlX3JlY3Vyc2l2ZSh4LCBzLT5mbGFncyk7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWMgPSBnZXRfY3B1X3NsYWIocywgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlkZWJ1Z19jaGVja19ub19sb2Nrc19mcmVlZChvYmplY3QsIGMtPm9ianNpemUpOwpAQCAtMjU1NywxMyArMjU2MCwxNiBAQAogCWlmIChnZnBfZmxhZ3MgJiBTTFVCX0RNQSkKIAkJZmxhZ3MgPSBTTEFCX0NBQ0hFX0RNQTsKIAotCWRvd25fd3JpdGUoJnNsdWJfbG9jayk7CisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQgZHVyaW5nIGVhcmx5LWJvb3Qgb24KKwkgKiBzaW5nbGUgQ1BVIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byB0YWtlIHNsdWJfbG9jayBoZXJlLgorCSAqLwogCWlmICgha21lbV9jYWNoZV9vcGVuKHMsIGdmcF9mbGFncywgbmFtZSwgc2l6ZSwgQVJDSF9LTUFMTE9DX01JTkFMSUdOLAogCQkJCQkJCQlmbGFncywgTlVMTCkpCiAJCWdvdG8gcGFuaWM7CiAKIAlsaXN0X2FkZCgmcy0+bGlzdCwgJnNsYWJfY2FjaGVzKTsKLQl1cF93cml0ZSgmc2x1Yl9sb2NrKTsKKwogCWlmIChzeXNmc19zbGFiX2FkZChzKSkKIAkJZ290byBwYW5pYzsKIAlyZXR1cm4gczsKQEAgLTMwMjEsNyArMzAyNyw3IEBACiAJICoga21lbV9jYWNoZV9vcGVuIGZvciBzbGFiX3N0YXRlID09IERPV04uCiAJICovCiAJY3JlYXRlX2ttYWxsb2NfY2FjaGUoJmttYWxsb2NfY2FjaGVzWzBdLCAia21lbV9jYWNoZV9ub2RlIiwKLQkJc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUpLCBHRlBfS0VSTkVMKTsKKwkJc2l6ZW9mKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUpLCBHRlBfTk9XQUlUKTsKIAlrbWFsbG9jX2NhY2hlc1swXS5yZWZjb3VudCA9IC0xOwogCWNhY2hlcysrOwogCkBAIC0zMDM0LDE2ICszMDQwLDE2IEBACiAJLyogQ2FjaGVzIHRoYXQgYXJlIG5vdCBvZiB0aGUgdHdvLXRvLXRoZS1wb3dlci1vZiBzaXplICovCiAJaWYgKEtNQUxMT0NfTUlOX1NJWkUgPD0gNjQpIHsKIAkJY3JlYXRlX2ttYWxsb2NfY2FjaGUoJmttYWxsb2NfY2FjaGVzWzFdLAotCQkJCSJrbWFsbG9jLTk2IiwgOTYsIEdGUF9LRVJORUwpOworCQkJCSJrbWFsbG9jLTk2IiwgOTYsIEdGUF9OT1dBSVQpOwogCQljYWNoZXMrKzsKIAkJY3JlYXRlX2ttYWxsb2NfY2FjaGUoJmttYWxsb2NfY2FjaGVzWzJdLAotCQkJCSJrbWFsbG9jLTE5MiIsIDE5MiwgR0ZQX0tFUk5FTCk7CisJCQkJImttYWxsb2MtMTkyIiwgMTkyLCBHRlBfTk9XQUlUKTsKIAkJY2FjaGVzKys7CiAJfQogCiAJZm9yIChpID0gS01BTExPQ19TSElGVF9MT1c7IGkgPCBTTFVCX1BBR0VfU0hJRlQ7IGkrKykgewogCQljcmVhdGVfa21hbGxvY19jYWNoZSgma21hbGxvY19jYWNoZXNbaV0sCi0JCQkia21hbGxvYyIsIDEgPDwgaSwgR0ZQX0tFUk5FTCk7CisJCQkia21hbGxvYyIsIDEgPDwgaSwgR0ZQX05PV0FJVCk7CiAJCWNhY2hlcysrOwogCX0KIApAQCAtMzA4MCw3ICszMDg2LDcgQEAKIAkvKiBQcm92aWRlIHRoZSBjb3JyZWN0IGttYWxsb2MgbmFtZXMgbm93IHRoYXQgdGhlIGNhY2hlcyBhcmUgdXAgKi8KIAlmb3IgKGkgPSBLTUFMTE9DX1NISUZUX0xPVzsgaSA8IFNMVUJfUEFHRV9TSElGVDsgaSsrKQogCQlrbWFsbG9jX2NhY2hlc1tpXS4gbmFtZSA9Ci0JCQlrYXNwcmludGYoR0ZQX0tFUk5FTCwgImttYWxsb2MtJWQiLCAxIDw8IGkpOworCQkJa2FzcHJpbnRmKEdGUF9OT1dBSVQsICJrbWFsbG9jLSVkIiwgMSA8PCBpKTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnNsYWJfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvbW0vdXRpbC5jIGIvbW0vdXRpbC5jCmluZGV4IDU1YmVmMTYuLmFiYzY1YWEgMTAwNjQ0Ci0tLSBhL21tL3V0aWwuYworKysgYi9tbS91dGlsLmMKQEAgLTQsOSArNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rbWVtLmg+CisKIC8qKgogICoga3N0cmR1cCAtIGFsbG9jYXRlIHNwYWNlIGZvciBhbmQgY29weSBhbiBleGlzdGluZyBzdHJpbmcKICAqIEBzOiB0aGUgc3RyaW5nIHRvIGR1cGxpY2F0ZQpAQCAtMjU1LDEzICsyNTcsNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X3VzZXJfcGFnZXNfZmFzdCk7CiAKIC8qIFRyYWNlcG9pbnRzIGRlZmluaXRpb25zLiAqLwotREVGSU5FX1RSQUNFKGttYWxsb2MpOwotREVGSU5FX1RSQUNFKGttZW1fY2FjaGVfYWxsb2MpOwotREVGSU5FX1RSQUNFKGttYWxsb2Nfbm9kZSk7Ci1ERUZJTkVfVFJBQ0Uoa21lbV9jYWNoZV9hbGxvY19ub2RlKTsKLURFRklORV9UUkFDRShrZnJlZSk7Ci1ERUZJTkVfVFJBQ0Uoa21lbV9jYWNoZV9mcmVlKTsKLQogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGttYWxsb2MpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGttZW1fY2FjaGVfYWxsb2MpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGttYWxsb2Nfbm9kZSk7CmRpZmYgLS1naXQgYS9tbS92bWFsbG9jLmMgYi9tbS92bWFsbG9jLmMKaW5kZXggMDgzNzE2ZS4uZjgxODlhNCAxMDA2NDQKLS0tIGEvbW0vdm1hbGxvYy5jCisrKyBiL21tL3ZtYWxsb2MuYwpAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhZGl4LXRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogCiAJLyogSW1wb3J0IGV4aXN0aW5nIHZtbGlzdCBlbnRyaWVzLiAqLwogCWZvciAodG1wID0gdm1saXN0OyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgewotCQl2YSA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCB2bWFwX2FyZWEpKTsKKwkJdmEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdm1hcF9hcmVhKSwgR0ZQX05PV0FJVCk7CiAJCXZhLT5mbGFncyA9IHRtcC0+ZmxhZ3MgfCBWTV9WTV9BUkVBOwogCQl2YS0+dmFfc3RhcnQgPSAodW5zaWduZWQgbG9uZyl0bXAtPmFkZHI7CiAJCXZhLT52YV9lbmQgPSB2YS0+dmFfc3RhcnQgKyB0bXAtPnNpemU7CkBAIC0xMzI3LDYgKzEzMjcsOSBAQAogdm9pZCB2ZnJlZShjb25zdCB2b2lkICphZGRyKQogewogCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CisKKwlrbWVtbGVha19mcmVlKGFkZHIpOworCiAJX192dW5tYXAoYWRkciwgMSk7CiB9CiBFWFBPUlRfU1lNQk9MKHZmcmVlKTsKQEAgLTE0MzksOCArMTQ0MiwxNyBAQAogCiB2b2lkICpfX3ZtYWxsb2NfYXJlYShzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhLCBnZnBfdCBnZnBfbWFzaywgcGdwcm90X3QgcHJvdCkKIHsKLQlyZXR1cm4gX192bWFsbG9jX2FyZWFfbm9kZShhcmVhLCBnZnBfbWFzaywgcHJvdCwgLTEsCi0JCQkJCV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJdm9pZCAqYWRkciA9IF9fdm1hbGxvY19hcmVhX25vZGUoYXJlYSwgZ2ZwX21hc2ssIHByb3QsIC0xLAorCQkJCQkgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKworCS8qCisJICogQSByZWZfY291bnQgPSAzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSB2bV9zdHJ1Y3QgYW5kIHZtYXBfYXJlYQorCSAqIHN0cnVjdHVyZXMgYWxsb2NhdGVkIGluIHRoZSBfX2dldF92bV9hcmVhX25vZGUoKSBmdW5jdGlvbiBjb250YWluCisJICogcmVmZXJlbmNlcyB0byB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSB2bWFsbG9jJ2VkIGJsb2NrLgorCSAqLworCWttZW1sZWFrX2FsbG9jKGFkZHIsIGFyZWEtPnNpemUgLSBQQUdFX1NJWkUsIDMsIGdmcF9tYXNrKTsKKworCXJldHVybiBhZGRyOwogfQogCiAvKioKQEAgLTE0NTksNiArMTQ3MSw4IEBACiAJCQkJCQlpbnQgbm9kZSwgdm9pZCAqY2FsbGVyKQogewogCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CisJdm9pZCAqYWRkcjsKKwl1bnNpZ25lZCBsb25nIHJlYWxfc2l6ZSA9IHNpemU7CiAKIAlzaXplID0gUEFHRV9BTElHTihzaXplKTsKIAlpZiAoIXNpemUgfHwgKHNpemUgPj4gUEFHRV9TSElGVCkgPiBudW1fcGh5c3BhZ2VzKQpAQCAtMTQ3MCw3ICsxNDg0LDE2IEBACiAJaWYgKCFhcmVhKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiBfX3ZtYWxsb2NfYXJlYV9ub2RlKGFyZWEsIGdmcF9tYXNrLCBwcm90LCBub2RlLCBjYWxsZXIpOworCWFkZHIgPSBfX3ZtYWxsb2NfYXJlYV9ub2RlKGFyZWEsIGdmcF9tYXNrLCBwcm90LCBub2RlLCBjYWxsZXIpOworCisJLyoKKwkgKiBBIHJlZl9jb3VudCA9IDMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHZtX3N0cnVjdCBhbmQgdm1hcF9hcmVhCisJICogc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gdGhlIF9fZ2V0X3ZtX2FyZWFfbm9kZSgpIGZ1bmN0aW9uIGNvbnRhaW4KKwkgKiByZWZlcmVuY2VzIHRvIHRoZSB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIHZtYWxsb2MnZWQgYmxvY2suCisJICovCisJa21lbWxlYWtfYWxsb2MoYWRkciwgcmVhbF9zaXplLCAzLCBnZnBfbWFzayk7CisKKwlyZXR1cm4gYWRkcjsKIH0KIAogdm9pZCAqX192bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2ssIHBncHJvdF90IHByb3QpCmRpZmYgLS1naXQgYS9uZXQvY29yZS9kcm9wX21vbml0b3IuYyBiL25ldC9jb3JlL2Ryb3BfbW9uaXRvci5jCmluZGV4IDlmZDBkYzMuLmI3NWI2Y2UgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Ryb3BfbW9uaXRvci5jCisrKyBiL25ldC9jb3JlL2Ryb3BfbW9uaXRvci5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgogCi0jaW5jbHVkZSA8dHJhY2Uvc2tiLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NrYi5oPgogCiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXQtdHJhY2VzLmMgYi9uZXQvY29yZS9uZXQtdHJhY2VzLmMKaW5kZXggYzhmYjQ1Ni4uNDk5YTY3ZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXRyYWNlcy5jCisrKyBiL25ldC9jb3JlL25ldC10cmFjZXMuYwpAQCAtMTksMTEgKzE5LDExIEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldF9kcm9wbW9uLmg+Ci0jaW5jbHVkZSA8dHJhY2Uvc2tiLmg+CiAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgogCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2tiLmg+CiAKLURFRklORV9UUkFDRShrZnJlZV9za2IpOwogRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChrZnJlZV9za2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc2tidWZmLmMgYi9uZXQvY29yZS9za2J1ZmYuYwppbmRleCBlNTA1YjUzLi5jMmU0ZmI4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9za2J1ZmYuYworKysgYi9uZXQvY29yZS9za2J1ZmYuYwpAQCAtNjUsNyArNjUsNyBAQAogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8dHJhY2Uvc2tiLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NrYi5oPgogCiAjaW5jbHVkZSAia21hcF9za2IuaCIKIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9LY29uZmlnIGIvc2FtcGxlcy9LY29uZmlnCmluZGV4IDRiMDJmNWEuLmI3NWQyOGMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvS2NvbmZpZworKysgYi9zYW1wbGVzL0tjb25maWcKQEAgLTE5LDYgKzE5LDEyIEBACiAJaGVscAogCSAgVGhpcyBidWlsZCB0cmFjZXBvaW50cyBleGFtcGxlIG1vZHVsZXMuCiAKK2NvbmZpZyBTQU1QTEVfVFJBQ0VfRVZFTlRTCisJdHJpc3RhdGUgIkJ1aWxkIHRyYWNlX2V2ZW50cyBleGFtcGxlcyAtLSBsb2FkYWJsZSBtb2R1bGVzIG9ubHkiCisJZGVwZW5kcyBvbiBFVkVOVF9UUkFDSU5HICYmIG0KKwloZWxwCisJICBUaGlzIGJ1aWxkIHRyYWNlIGV2ZW50IGV4YW1wbGUgbW9kdWxlcy4KKwogY29uZmlnIFNBTVBMRV9LT0JKRUNUCiAJdHJpc3RhdGUgIkJ1aWxkIGtvYmplY3QgZXhhbXBsZXMiCiAJaGVscApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9NYWtlZmlsZSBiL3NhbXBsZXMvTWFrZWZpbGUKaW5kZXggMTBlYWNhOC4uMTNlNGI0NyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9NYWtlZmlsZQorKysgYi9zYW1wbGVzL01ha2VmaWxlCkBAIC0xLDMgKzEsMyBAQAogIyBNYWtlZmlsZSBmb3IgTGludXggc2FtcGxlcyBjb2RlCiAKLW9iai0kKENPTkZJR19TQU1QTEVTKQkrPSBtYXJrZXJzLyBrb2JqZWN0LyBrcHJvYmVzLyB0cmFjZXBvaW50cy8KK29iai0kKENPTkZJR19TQU1QTEVTKQkrPSBtYXJrZXJzLyBrb2JqZWN0LyBrcHJvYmVzLyB0cmFjZXBvaW50cy8gdHJhY2VfZXZlbnRzLwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmFjZV9ldmVudHMvTWFrZWZpbGUgYi9zYW1wbGVzL3RyYWNlX2V2ZW50cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQyOGRjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy90cmFjZV9ldmVudHMvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjIGJ1aWxkcyB0aGUgdHJhY2UgZXZlbnRzIGV4YW1wbGUga2VybmVsIG1vZHVsZXM7CisjIHRoZW4gdG8gdXNlIG9uZSAoYXMgcm9vdCk6ICBpbnNtb2QgPG1vZHVsZV9uYW1lLmtvPgorCitDRkxBR1NfdHJhY2UtZXZlbnRzLXNhbXBsZS5vIDo9IC1JJChzcmMpCisKK29iai0kKENPTkZJR19TQU1QTEVfVFJBQ0VfRVZFTlRTKSArPSB0cmFjZS1ldmVudHMtc2FtcGxlLm8KZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2VfZXZlbnRzL3RyYWNlLWV2ZW50cy1zYW1wbGUuYyBiL3NhbXBsZXMvdHJhY2VfZXZlbnRzL3RyYWNlLWV2ZW50cy1zYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWJjNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy90cmFjZV9ldmVudHMvdHJhY2UtZXZlbnRzLXNhbXBsZS5jCkBAIC0wLDAgKzEsNTIgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisKKy8qCisgKiBBbnkgZmlsZSB0aGF0IHVzZXMgdHJhY2UgcG9pbnRzLCBtdXN0IGluY2x1ZGUgdGhlIGhlYWRlci4KKyAqIEJ1dCBvbmx5IG9uZSBmaWxlLCBtdXN0IGluY2x1ZGUgdGhlIGhlYWRlciBieSBkZWZpbmluZworICogQ1JFQVRFX1RSQUNFX1BPSU5UUyBmaXJzdC4gIFRoaXMgd2lsbCBtYWtlIHRoZSBDIGNvZGUgdGhhdAorICogY3JlYXRlcyB0aGUgaGFuZGxlcyBmb3IgdGhlIHRyYWNlIHBvaW50cy4KKyAqLworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSAidHJhY2UtZXZlbnRzLXNhbXBsZS5oIgorCisKK3N0YXRpYyB2b2lkIHNpbXBsZV90aHJlYWRfZnVuYyhpbnQgY250KQoreworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWik7CisJdHJhY2VfZm9vX2JhcigiaGVsbG8iLCBjbnQpOworfQorCitzdGF0aWMgaW50IHNpbXBsZV90aHJlYWQodm9pZCAqYXJnKQoreworCWludCBjbnQgPSAwOworCisJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCXNpbXBsZV90aHJlYWRfZnVuYyhjbnQrKyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc2ltcGxlX3RzazsKKworc3RhdGljIGludCBfX2luaXQgdHJhY2VfZXZlbnRfaW5pdCh2b2lkKQoreworCXNpbXBsZV90c2sgPSBrdGhyZWFkX3J1bihzaW1wbGVfdGhyZWFkLCBOVUxMLCAiZXZlbnQtc2FtcGxlIik7CisJaWYgKElTX0VSUihzaW1wbGVfdHNrKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0cmFjZV9ldmVudF9leGl0KHZvaWQpCit7CisJa3RocmVhZF9zdG9wKHNpbXBsZV90c2spOworfQorCittb2R1bGVfaW5pdCh0cmFjZV9ldmVudF9pbml0KTsKK21vZHVsZV9leGl0KHRyYWNlX2V2ZW50X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGV2ZW4gUm9zdGVkdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0cmFjZS1ldmVudHMtc2FtcGxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYWNlX2V2ZW50cy90cmFjZS1ldmVudHMtc2FtcGxlLmggYi9zYW1wbGVzL3RyYWNlX2V2ZW50cy90cmFjZS1ldmVudHMtc2FtcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4YTg5NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvdHJhY2VfZXZlbnRzL3RyYWNlLWV2ZW50cy1zYW1wbGUuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIE5vdGljZSB0aGF0IHRoaXMgZmlsZSBpcyBub3QgcHJvdGVjdGVkIGxpa2UgYSBub3JtYWwgaGVhZGVyLgorICogV2UgYWxzbyBtdXN0IGFsbG93IGZvciByZXJlYWRpbmcgb2YgdGhpcyBmaWxlLiBUaGUKKyAqCisgKiAgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyAqCisgKiBzZXJ2ZXMgdGhpcyBwdXJwb3NlLgorICovCisjaWYgIWRlZmluZWQoX1RSQUNFX0VWRU5UX1NBTVBMRV9IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfVFJBQ0VfRVZFTlRfU0FNUExFX0gKKworLyoKKyAqIEFsbCB0cmFjZSBoZWFkZXJzIHNob3VsZCBpbmNsdWRlIHRyYWNlcG9pbnQuaCwgdW50aWwgd2UgZmluYWxseQorICogbWFrZSBpdCBpbnRvIGEgc3RhbmRhcmQgaGVhZGVyLgorICovCisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCisvKgorICogSWYgVFJBQ0VfU1lTVEVNIGlzIGRlZmluZWQsIHRoYXQgd2lsbCBiZSB0aGUgZGlyZWN0b3J5IGNyZWF0ZWQKKyAqIGluIHRoZSBmdHJhY2UgZGlyZWN0b3J5IHVuZGVyIC9kZWJ1Z2ZzL3RyYWNpbmcvZXZlbnRzLzxzeXN0ZW0+CisgKgorICogVGhlIGRlZmluZV90cmFjZS5oIGJlbG93ZSB3aWxsIGFsc28gbG9vayBmb3IgYSBmaWxlIG5hbWUgb2YKKyAqIFRSQUNFX1NZU1RFTS5oIHdoZXJlIFRSQUNFX1NZU1RFTSBpcyB3aGF0IGlzIGRlZmluZWQgaGVyZS4KKyAqCisgKiBJZiB5b3Ugd2FudCBhIGRpZmZlcmVudCBzeXN0ZW0gdGhhbiBmaWxlIG5hbWUsIHlvdSBjYW4gb3ZlcnJpZGUKKyAqIHRoZSBoZWFkZXIgbmFtZSBieSBkZWZpbmluZyBUUkFDRV9JTkNMVURFX0ZJTEUKKyAqCisgKiBJZiB0aGlzIGZpbGUgd2FzIGNhbGxlZCwgZ29vZnkuaCwgdGhlbiB3ZSB3b3VsZCBkZWZpbmU6CisgKgorICogI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgZ29vZnkKKyAqCisgKi8KKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIHNhbXBsZQorCisvKgorICogVGhlIFRSQUNFX0VWRU5UIG1hY3JvIGlzIGJyb2tlbiB1cCBpbnRvIDUgcGFydHMuCisgKgorICogbmFtZTogbmFtZSBvZiB0aGUgdHJhY2UgcG9pbnQuIFRoaXMgaXMgYWxzbyBob3cgdG8gZW5hYmxlIHRoZSB0cmFjZXBvaW50LgorICogICBBIGZ1bmN0aW9uIGNhbGxlZCB0cmFjZV9mb29fYmFyKCkgd2lsbCBiZSBjcmVhdGVkLgorICoKKyAqIHByb3RvOiB0aGUgcHJvdG90eXBlIG9mIHRoZSBmdW5jdGlvbiB0cmFjZV9mb29fYmFyKCkKKyAqICAgSGVyZSBpdCBpcyB0cmFjZV9mb29fYmFyKGNoYXIgKmZvbywgaW50IGJhcikuCisgKgorICogYXJnczogIG11c3QgbWF0Y2ggdGhlIGFyZ3VtZW50cyBpbiB0aGUgcHJvdG90eXBlLgorICogICAgSGVyZSBpdCBpcyBzaW1wbHkgImZvbywgYmFyIi4KKyAqCisgKiBzdHJ1Y3Q6ICBUaGlzIGRlZmluZXMgdGhlIHdheSB0aGUgZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcmluZyBidWZmZXIuCisgKiAgICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byB0eXBlcyBvZiBlbGVtZW50cy4gX19maWVsZCBhbmQgX19hcnJheS4KKyAqICAgIGEgX19maWVsZCBpcyBicm9rZW4gdXAgaW50byAodHlwZSwgbmFtZSkuIFdoZXJlIHR5cGUgY2FuIGJlIGFueQorICogICAgdHlwZSBidXQgYW4gYXJyYXkuCisgKiAgICBGb3IgYW4gYXJyYXkuIHRoZXJlIGFyZSB0aHJlZSBmaWVsZHMuICh0eXBlLCBuYW1lLCBzaXplKS4gVGhlCisgKiAgICB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSwgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGFuZCB0aGUgc2l6ZQorICogICAgb2YgdGhlIGFycmF5LgorICoKKyAqICAgIF9fYXJyYXkoIGNoYXIsIGZvbywgMTApIGlzIHRoZSBzYW1lIGFzIHNheWluZyAgIGNoYXIgZm9vWzEwXS4KKyAqCisgKiBmYXN0X2Fzc2lnbjogVGhpcyBpcyBhIEMgbGlrZSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGl0ZW1zCisgKiAgICBpbnRvIHRoZSByaW5nIGJ1ZmZlci4KKyAqCisgKiBwcmludGs6IFRoaXMgaXMgYSB3YXkgdG8gcHJpbnQgb3V0IHRoZSBkYXRhIGluIHByZXR0eSBwcmludC4gVGhpcyBpcworICogICAgdXNlZnVsIGlmIHRoZSBzeXN0ZW0gY3Jhc2hlcyBhbmQgeW91IGFyZSBsb2dnaW5nIHZpYSBhIHNlcmlhbCBsaW5lLAorICogICAgdGhlIGRhdGEgY2FuIGJlIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgdXNpbmcgdGhpcyAicHJpbnRrIiBtZXRob2QuCisgKgorICogTm90ZSwgdGhhdCBmb3IgYm90aCB0aGUgYXNzaWduIGFuZCB0aGUgcHJpbnRrLCBfX2VudHJ5IGlzIHRoZSBoYW5kbGVyCisgKiB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUgaW4gdGhlIHJpbmcgYnVmZmVyLCBhbmQgaXMgZGVmaW5lZCBieSB0aGUKKyAqIFRQX1NUUlVDVF9fZW50cnkuCisgKi8KK1RSQUNFX0VWRU5UKGZvb19iYXIsCisKKwlUUF9QUk9UTyhjaGFyICpmb28sIGludCBiYXIpLAorCisJVFBfQVJHUyhmb28sIGJhciksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2FycmF5KAljaGFyLAlmb28sICAgIDEwCQkpCisJCV9fZmllbGQoCWludCwJYmFyCQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJc3RybmNweShfX2VudHJ5LT5mb28sIGZvbywgMTApOworCQlfX2VudHJ5LT5iYXIJPSBiYXI7CisJKSwKKworCVRQX3ByaW50aygiZm9vICVzICVkIiwgX19lbnRyeS0+Zm9vLCBfX2VudHJ5LT5iYXIpCispOworI2VuZGlmCisKKy8qKioqKiBOT1RJQ0UhIFRoZSAjaWYgcHJvdGVjdGlvbiBlbmRzIGhlcmUuICoqKioqLworCisKKy8qCisgKiBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIEkgY291bGQgaGF2ZSBkb25lIHRoaXMuIElmIEkgbGVmdCBvdXQgdGhlCisgKiBUUkFDRV9JTkNMVURFX1BBVEgsIHRoZW4gaXQgd291bGQgZGVmYXVsdCB0byB0aGUga2VybmVsIHNvdXJjZQorICogaW5jbHVkZS90cmFjZS9ldmVudHMgZGlyZWN0b3J5LgorICoKKyAqIEkgY291bGQgc3BlY2lmeSBhIHBhdGggZnJvbSB0aGUgZGVmaW5lX3RyYWNlLmggZmlsZSBiYWNrIHRvIHRoaXMKKyAqIGZpbGUuCisgKgorICogI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLi4vLi4vc2FtcGxlcy90cmFjZV9ldmVudHMKKyAqCisgKiBCdXQgSSBjaG9zZSB0byBzaW1wbHkgbWFrZSBpdCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCB0aGVuIGluCisgKiB0aGUgTWFrZWZpbGUgSSBhZGRlZDoKKyAqCisgKiBDRkxBR1NfdHJhY2UtZXZlbnRzLXNhbXBsZS5vIDo9IC1JJChQV0QpL3NhbXBsZXMvdHJhY2VfZXZlbnRzLworICoKKyAqIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhlIGN1cnJlbnQgcGF0aCBpcyBwYXJ0IG9mIHRoZSBpbmNsdWRlCisgKiBzdHJ1Y3R1cmUgZm9yIG91ciBmaWxlIHNvIHRoYXQgd2UgY2FuIGZpbmQgaXQuCisgKgorICogSSBjb3VsZCBoYXZlIG1hZGUgb25seSB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSB0aGUgaW5jbHVkZToKKyAqCisgKiBDRkxBR1NfdHJhY2UtZXZlbnRzLXNhbXBsZS5vIDo9IC1JJChQV0QpCisgKgorICogQW5kIHRoZW4gbGV0IHRoZSBwYXRoIHRvIHRoaXMgZGlyZWN0b3J5IGJlIHRoZSBUUkFDRV9JTkNMVURFX1BBVEg6CisgKgorICogI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggc2FtcGxlcy90cmFjZV9ldmVudHMKKyAqCisgKiBCdXQgdGhlbiBpZiBzb21ldGhpbmcgZGVmaW5lcyAic2FtcGxlcyIgb3IgInRyYWNlX2V2ZW50cyIgdGhlbiB3ZQorICogY291bGQgcmlzayB0aGF0IGJlaW5nIGNvbnZlcnRlZCB0b28sIGFuZCBnaXZlIHVzIGFuIHVuZXhwZWN0ZWQKKyAqIHJlc3VsdC4KKyAqLworI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAorI3VuZGVmIFRSQUNFX0lOQ0xVREVfRklMRQorI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLgorLyoKKyAqIFRSQUNFX0lOQ0xVREVfRklMRSBpcyBub3QgbmVlZGVkIGlmIHRoZSBmaWxlbmFtZSBhbmQgVFJBQ0VfU1lTVEVNIGFyZSBlcXVhbAorICovCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSB0cmFjZS1ldmVudHMtc2FtcGxlCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmxpYiBiL3NjcmlwdHMvTWFrZWZpbGUubGliCmluZGV4IGNiYTYxY2EuLjJiNzA2NjEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvTWFrZWZpbGUubGliCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubGliCkBAIC0xODgsMjAgKzE4OCwzNCBAQAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogcXVpZXRfY21kX2d6aXAgPSBHWklQICAgICRACi1jbWRfZ3ppcCA9IGd6aXAgLWYgLTkgPCAkPCA+ICRACitjbWRfZ3ppcCA9IChjYXQgJChmaWx0ZXItb3V0IEZPUkNFLCReKSB8IGd6aXAgLWYgLTkgPiAkQCkgfHwgXAorCShybSAtZiAkQCA7IGZhbHNlKQogCiAKICMgQnppcDIKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgQnppcDIgZG9lcyBub3QgaW5jbHVkZSBzaXplIGluIGZpbGUuLi4gc28gd2UgaGF2ZSB0byBmYWtlIHRoYXQKLXNpemVfYXBwZW5kPSQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvYmluX3NpemUKKyMgQnppcDIgYW5kIExaTUEgZG8gbm90IGluY2x1ZGUgc2l6ZSBpbiBmaWxlLi4uIHNvIHdlIGhhdmUgdG8gZmFrZSB0aGF0OworIyBhcHBlbmQgdGhlIHNpemUgYXMgYSAzMi1iaXQgbGl0dGxlZW5kaWFuIG51bWJlciBhcyBnemlwIGRvZXMuCitzaXplX2FwcGVuZCA9IGVjaG8gLW5lICQoc2hlbGwJCQkJCQlcCitkZWNfc2l6ZT0wOwkJCQkJCQkJXAorZm9yIEYgaW4gJDE7IGRvCQkJCQkJCQlcCisJZnNpemU9JCQoc3RhdCAtYyAiJXMiICQkRik7CQkJCQlcCisJZGVjX3NpemU9JCQoZXhwciAkJGRlY19zaXplICsgJCRmc2l6ZSk7CQkJCVwKK2RvbmU7CQkJCQkJCQkJXAorcHJpbnRmICIlMDh4IiAkJGRlY19zaXplIHwJCQkJCQlcCisJc2VkICdzL1woLi5cKVwoLi5cKVwoLi5cKVwoLi5cKS9cXFxceFw0XFxcXHhcM1xcXFx4XDJcXFxceFwxL2cnCVwKKykKIAotcXVpZXRfY21kX2J6aXAyID0gQlpJUDIgICAgJEAKLWNtZF9iemlwMiA9IChiemlwMiAtOSA8ICQ8ICYmICQoc2l6ZV9hcHBlbmQpICQ8KSA+ICRAIHx8IChybSAtZiAkQCA7IGZhbHNlKQorcXVpZXRfY21kX2J6aXAyID0gQlpJUDIgICAkQAorY21kX2J6aXAyID0gKGNhdCAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIHwgXAorCWJ6aXAyIC05ICYmICQoY2FsbCBzaXplX2FwcGVuZCwgJChmaWx0ZXItb3V0IEZPUkNFLCReKSkpID4gJEAgfHwgXAorCShybSAtZiAkQCA7IGZhbHNlKQogCiAjIEx6bWEKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHF1aWV0X2NtZF9sem1hID0gTFpNQSAgICAkQAotY21kX2x6bWEgPSAobHptYSAtOSAtYyAkPCAmJiAkKHNpemVfYXBwZW5kKSAkPCkgPiRAIHx8IChybSAtZiAkQCA7IGZhbHNlKQorY21kX2x6bWEgPSAoY2F0ICQoZmlsdGVyLW91dCBGT1JDRSwkXikgfCBcCisJbHptYSAtOSAmJiAkKGNhbGwgc2l6ZV9hcHBlbmQsICQoZmlsdGVyLW91dCBGT1JDRSwkXikpKSA+ICRAIHx8IFwKKwkocm0gLWYgJEAgOyBmYWxzZSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmluX3NpemUgYi9zY3JpcHRzL2Jpbl9zaXplCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UxYjM2Li4wMDAwMDAwCi0tLSBhL3NjcmlwdHMvYmluX3NpemUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIS9iaW4vc2gKLQotaWYgWyAkIyA9IDAgXSA7IHRoZW4KLSAgIGVjaG8gVXNhZ2U6ICQwIGZpbGUKLWZpCi0KLXNpemVfZGVjPWBzdGF0IC1jICIlcyIgJDFgCi1zaXplX2hleF9lY2hvX3N0cmluZz1gcHJpbnRmICIlMDh4IiAkc2l6ZV9kZWMgfAotICAgICBzZWQgJ3MvXCguLlwpXCguLlwpXCguLlwpXCguLlwpL1xcXFx4XDRcXFxceFwzXFxcXHhcMlxcXFx4XDEvZydgCi0vYmluL2VjaG8gLW5lICRzaXplX2hleF9lY2hvX3N0cmluZwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rZXJuZWwtZG9jIGIvc2NyaXB0cy9rZXJuZWwtZG9jCmluZGV4IDMyMDhhM2EuLmFjZDhjNGEgMTAwNzU1Ci0tLSBhL3NjcmlwdHMva2VybmVsLWRvYworKysgYi9zY3JpcHRzL2tlcm5lbC1kb2MKQEAgLTE4MjgsNiArMTgyOCwyNSBAQAogICAgICRzdGF0ZSA9IDA7CiB9CiAKK3N1YiB0cmFjZXBvaW50X211bmdlKCQpIHsKKwlteSAkZmlsZSA9IHNoaWZ0OworCW15ICR0cmFjZXBvaW50bmFtZSA9IDA7CisJbXkgJHRyYWNlcG9pbnRhcmdzID0gMDsKKworCWlmKCRwcm90b3R5cGUgPX4gbS9UUkFDRV9FVkVOVFwoKC4qPyksLykgeworCQkkdHJhY2Vwb2ludG5hbWUgPSAkMTsKKwl9CisJaWYoJHByb3RvdHlwZSA9fiBtL1RQX1BST1RPXCgoLio/KVwpLykgeworCQkkdHJhY2Vwb2ludGFyZ3MgPSAkMTsKKwl9CisJaWYgKCgkdHJhY2Vwb2ludG5hbWUgZXEgMCkgfHwgKCR0cmFjZXBvaW50YXJncyBlcSAwKSkgeworCQlwcmludCBTVERFUlIgIldhcm5pbmcoJHtmaWxlfTokLik6IFVucmVjb2duaXplZCB0cmFjZXBvaW50IGZvcm1hdDogXG4iLgorCQkJICAgICAiJHByb3RvdHlwZVxuIjsKKwl9IGVsc2UgeworCQkkcHJvdG90eXBlID0gInN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV8kdHJhY2Vwb2ludG5hbWUoJHRyYWNlcG9pbnRhcmdzKSI7CisJfQorfQorCiBzdWIgc3lzY2FsbF9tdW5nZSgpIHsKIAlteSAkdm9pZCA9IDA7CiAKQEAgLTE4ODIsNiArMTkwMSw5IEBACiAJaWYgKCRwcm90b3R5cGUgPX4gL1NZU0NBTExfREVGSU5FLykgewogCQlzeXNjYWxsX211bmdlKCk7CiAJfQorCWlmICgkcHJvdG90eXBlID1+IC9UUkFDRV9FVkVOVC8pIHsKKwkJdHJhY2Vwb2ludF9tdW5nZSgkZmlsZSk7CisJfQogCWR1bXBfZnVuY3Rpb24oJHByb3RvdHlwZSwgJGZpbGUpOwogCXJlc2V0X3N0YXRlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9yZWNvcmRtY291bnQucGwgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5wbAppbmRleCA0MDk1OTZlLi4wZmFlN2RhIDEwMDc1NQotLS0gYS9zY3JpcHRzL3JlY29yZG1jb3VudC5wbAorKysgYi9zY3JpcHRzL3JlY29yZG1jb3VudC5wbApAQCAtMjYsNyArMjYsNyBAQAogIyB3aGljaCB3aWxsIGFsc28gYmUgdGhlIGxvY2F0aW9uIG9mIHRoYXQgc2VjdGlvbiBhZnRlciBmaW5hbCBsaW5rLgogIyBlLmcuCiAjCi0jICAuc2VjdGlvbiAiLnRleHQuc2NoZWQiCisjICAuc2VjdGlvbiAiLnNjaGVkLnRleHQiLCAiYXgiCiAjICAuZ2xvYmwgbXlfZnVuYwogIyAgbXlfZnVuYzoKICMgICAgICAgIFsuLi5dCkBAIC0zOSw3ICszOSw3IEBACiAjICAgICAgICBbLi4uXQogIwogIyBCb3RoIHJlbG9jYXRpb24gb2Zmc2V0cyBmb3IgdGhlIG1jb3VudHMgaW4gdGhlIGFib3ZlIGV4YW1wbGUgd2lsbCBiZQotIyBvZmZzZXQgZnJvbSAudGV4dC5zY2hlZC4gSWYgd2UgbWFrZSBhbm90aGVyIGZpbGUgY2FsbGVkIHRtcC5zIHdpdGg6CisjIG9mZnNldCBmcm9tIC5zY2hlZC50ZXh0LiBJZiB3ZSBtYWtlIGFub3RoZXIgZmlsZSBjYWxsZWQgdG1wLnMgd2l0aDoKICMKICMgIC5zZWN0aW9uIF9fbWNvdW50X2xvYwogIyAgLnF1YWQgIG15X2Z1bmMgKyAweDUKQEAgLTUxLDcgKzUxLDcgQEAKICMgQnV0IHRoaXMgZ2V0cyBoYXJkIGlmIG15X2Z1bmMgaXMgbm90IGdsb2JsIChhIHN0YXRpYyBmdW5jdGlvbikuCiAjIEluIHN1Y2ggYSBjYXNlIHdlIGhhdmU6CiAjCi0jICAuc2VjdGlvbiAiLnRleHQuc2NoZWQiCisjICAuc2VjdGlvbiAiLnNjaGVkLnRleHQiLCAiYXgiCiAjICBteV9mdW5jOgogIyAgICAgICAgWy4uLl0KICMgICAgICAgIGNhbGwgbWNvdW50ICAob2Zmc2V0OiAweDUpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9LY29uZmlnIGIvc2VjdXJpdHkvS2NvbmZpZwppbmRleCBiYjI0NDc3Li5kMjNjODM5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9LY29uZmlnCisrKyBiL3NlY3VyaXR5L0tjb25maWcKQEAgLTExMCwyOSArMTEwLDkgQEAKIAogCSAgU2VlIDxodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS5waHA/c2lkPTYyNzk+IGZvcgogCSAgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG1vZHVsZS4KLQkgIAorCiAJICBJZiB5b3UgYXJlIHVuc3VyZSBob3cgdG8gYW5zd2VyIHRoaXMgcXVlc3Rpb24sIGFuc3dlciBOLgogCi1jb25maWcgU0VDVVJJVFlfREVGQVVMVF9NTUFQX01JTl9BRERSCi0gICAgICAgIGludCAiTG93IGFkZHJlc3Mgc3BhY2UgdG8gcHJvdGVjdCBmcm9tIHVzZXIgYWxsb2NhdGlvbiIKLSAgICAgICAgZGVwZW5kcyBvbiBTRUNVUklUWQotICAgICAgICBkZWZhdWx0IDAKLSAgICAgICAgaGVscAotCSAgVGhpcyBpcyB0aGUgcG9ydGlvbiBvZiBsb3cgdmlydHVhbCBtZW1vcnkgd2hpY2ggc2hvdWxkIGJlIHByb3RlY3RlZAotCSAgZnJvbSB1c2Vyc3BhY2UgYWxsb2NhdGlvbi4gIEtlZXBpbmcgYSB1c2VyIGZyb20gd3JpdGluZyB0byBsb3cgcGFnZXMKLQkgIGNhbiBoZWxwIHJlZHVjZSB0aGUgaW1wYWN0IG9mIGtlcm5lbCBOVUxMIHBvaW50ZXIgYnVncy4KLQotCSAgRm9yIG1vc3QgaWE2NCwgcHBjNjQgYW5kIHg4NiB1c2VycyB3aXRoIGxvdHMgb2YgYWRkcmVzcyBzcGFjZQotCSAgYSB2YWx1ZSBvZiA2NTUzNiBpcyByZWFzb25hYmxlIGFuZCBzaG91bGQgY2F1c2Ugbm8gcHJvYmxlbXMuCi0JICBPbiBhcm0gYW5kIG90aGVyIGFyY2hzIGl0IHNob3VsZCBub3QgYmUgaGlnaGVyIHRoYW4gMzI3NjguCi0JICBQcm9ncmFtcyB3aGljaCB1c2Ugdm04NiBmdW5jdGlvbmFsaXR5IHdvdWxkIGVpdGhlciBuZWVkIGFkZGl0aW9uYWwKLQkgIHBlcm1pc3Npb25zIGZyb20gZWl0aGVyIHRoZSBMU00gb3IgdGhlIGNhcGFiaWxpdGllcyBtb2R1bGUgb3IgaGF2ZQotCSAgdGhpcyBwcm90ZWN0aW9uIGRpc2FibGVkLgotCi0JICBUaGlzIHZhbHVlIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIGJvb3QgdXNpbmcgdGhlCi0JICAvcHJvYy9zeXMvdm0vbW1hcF9taW5fYWRkciB0dW5hYmxlLgotCi0KIHNvdXJjZSBzZWN1cml0eS9zZWxpbnV4L0tjb25maWcKIHNvdXJjZSBzZWN1cml0eS9zbWFjay9LY29uZmlnCiBzb3VyY2Ugc2VjdXJpdHkvdG9tb3lvL0tjb25maWcKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L01ha2VmaWxlIGIvc2VjdXJpdHkvTWFrZWZpbGUKaW5kZXggZmE3NzAyMS4uYzY3NTU3YyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvTWFrZWZpbGUKKysrIGIvc2VjdXJpdHkvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDkgQEAKICMgTXVzdCBwcmVjZWRlIGNhcGFiaWxpdHkubyBpbiBvcmRlciB0byBzdGFjayBwcm9wZXJseS4KIG9iai0kKENPTkZJR19TRUNVUklUWV9TRUxJTlVYKQkJKz0gc2VsaW51eC9idWlsdC1pbi5vCiBvYmotJChDT05GSUdfU0VDVVJJVFlfU01BQ0spCQkrPSBzbWFjay9idWlsdC1pbi5vCitpZmVxICgkKENPTkZJR19BVURJVCkseSkKK29iai0kKENPTkZJR19TRUNVUklUWV9TTUFDSykJCSs9IGxzbV9hdWRpdC5vCitlbmRpZgogb2JqLSQoQ09ORklHX1NFQ1VSSVRZX1RPTU9ZTykJCSs9IHRvbW95by9idWlsdC1pbi5vCiBvYmotJChDT05GSUdfU0VDVVJJVFlfUk9PVFBMVUcpCQkrPSByb290X3BsdWcubwogb2JqLSQoQ09ORklHX0NHUk9VUF9ERVZJQ0UpCQkrPSBkZXZpY2VfY2dyb3VwLm8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2NvbW1vbmNhcC5jIGIvc2VjdXJpdHkvY29tbW9uY2FwLmMKaW5kZXggYmVhYzAyNS4uNDhiN2UwMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvY29tbW9uY2FwLmMKKysrIGIvc2VjdXJpdHkvY29tbW9uY2FwLmMKQEAgLTI4LDYgKzI4LDI4IEBACiAjaW5jbHVkZSA8bGludXgvcHJjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9zZWN1cmViaXRzLmg+CiAKKy8qCisgKiBJZiBhIG5vbi1yb290IHVzZXIgZXhlY3V0ZXMgYSBzZXR1aWQtcm9vdCBiaW5hcnkgaW4KKyAqICFzZWN1cmUoU0VDVVJFX05PUk9PVCkgbW9kZSwgdGhlbiB3ZSByYWlzZSBjYXBhYmlsaXRpZXMuCisgKiBIb3dldmVyIGlmIGZFIGlzIGFsc28gc2V0LCB0aGVuIHRoZSBpbnRlbnQgaXMgZm9yIG9ubHkKKyAqIHRoZSBmaWxlIGNhcGFiaWxpdGllcyB0byBiZSBhcHBsaWVkLCBhbmQgdGhlIHNldHVpZC1yb290CisgKiBiaXQgaXMgbGVmdCBvbiBlaXRoZXIgdG8gY2hhbmdlIHRoZSB1aWQgKHBsYXVzaWJsZSkgb3IKKyAqIHRvIGdldCBmdWxsIHByaXZpbGVnZSBvbiBhIGtlcm5lbCB3aXRob3V0IGZpbGUgY2FwYWJpbGl0aWVzCisgKiBzdXBwb3J0LiAgU28gaW4gdGhhdCBjYXNlIHdlIGRvIG5vdCByYWlzZSBjYXBhYmlsaXRpZXMuCisgKgorICogV2FybiBpZiB0aGF0IGhhcHBlbnMsIG9uY2UgcGVyIGJvb3QuCisgKi8KK3N0YXRpYyB2b2lkIHdhcm5fc2V0dWlkX2FuZF9mY2Fwc19taXhlZChjaGFyICpmbmFtZSkKK3sKKwlzdGF0aWMgaW50IHdhcm5lZDsKKwlpZiAoIXdhcm5lZCkgeworCQlwcmludGsoS0VSTl9JTkZPICJ3YXJuaW5nOiBgJXMnIGhhcyBib3RoIHNldHVpZC1yb290IGFuZCIKKwkJCSIgZWZmZWN0aXZlIGNhcGFiaWxpdGllcy4gVGhlcmVmb3JlIG5vdCByYWlzaW5nIGFsbCIKKwkJCSIgY2FwYWJpbGl0aWVzLlxuIiwgZm5hbWUpOworCQl3YXJuZWQgPSAxOworCX0KK30KKwogaW50IGNhcF9uZXRsaW5rX3NlbmQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCU5FVExJTktfQ0Ioc2tiKS5lZmZfY2FwID0gY3VycmVudF9jYXAoKTsKQEAgLTQ2NCw2ICs0ODYsMTUgQEAKIAogCWlmICghaXNzZWN1cmUoU0VDVVJFX05PUk9PVCkpIHsKIAkJLyoKKwkJICogSWYgdGhlIGxlZ2FjeSBmaWxlIGNhcGFiaWxpdHkgaXMgc2V0LCB0aGVuIGRvbid0IHNldCBwcml2cworCQkgKiBmb3IgYSBzZXR1aWQgcm9vdCBiaW5hcnkgcnVuIGJ5IGEgbm9uLXJvb3QgdXNlci4gIERvIHNldCBpdAorCQkgKiBmb3IgYSByb290IHVzZXIganVzdCB0byBjYXVzZSBsZWFzdCBzdXJwcmlzZSB0byBhbiBhZG1pbi4KKwkJICovCisJCWlmIChlZmZlY3RpdmUgJiYgbmV3LT51aWQgIT0gMCAmJiBuZXctPmV1aWQgPT0gMCkgeworCQkJd2Fybl9zZXR1aWRfYW5kX2ZjYXBzX21peGVkKGJwcm0tPmZpbGVuYW1lKTsKKwkJCWdvdG8gc2tpcDsKKwkJfQorCQkvKgogCQkgKiBUbyBzdXBwb3J0IGluaGVyaXRhbmNlIG9mIHJvb3QtcGVybWlzc2lvbnMgYW5kIHN1aWQtcm9vdAogCQkgKiBleGVjdXRhYmxlcyB1bmRlciBjb21wYXRpYmlsaXR5IG1vZGUsIHdlIG92ZXJyaWRlIHRoZQogCQkgKiBjYXBhYmlsaXR5IHNldHMgZm9yIHRoZSBmaWxlLgpAQCAtNDc4LDYgKzUwOSw3IEBACiAJCWlmIChuZXctPmV1aWQgPT0gMCkKIAkJCWVmZmVjdGl2ZSA9IHRydWU7CiAJfQorc2tpcDoKIAogCS8qIERvbid0IGxldCBzb21lb25lIHRyYWNlIGEgc2V0W3VnXWlkL3NldHBjYXAgYmluYXJ5IHdpdGggdGhlIHJldmlzZWQKIAkgKiBjcmVkZW50aWFscyB1bmxlc3MgdGhleSBoYXZlIHRoZSBhcHByb3ByaWF0ZSBwZXJtaXQKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2lub2RlLmMgYi9zZWN1cml0eS9pbm9kZS5jCmluZGV4IGYzYjkxYmYuLmY3NDk2YzYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2lub2RlLmMKKysrIGIvc2VjdXJpdHkvaW5vZGUuYwpAQCAtMjg3LDcgKzI4Nyw3IEBACiB7CiAJc3RydWN0IGRlbnRyeSAqcGFyZW50OwogCi0JaWYgKCFkZW50cnkpCisJaWYgKCFkZW50cnkgfHwgSVNfRVJSKGRlbnRyeSkpCiAJCXJldHVybjsKIAogCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9hdWRpdC5jIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfYXVkaXQuYwppbmRleCAxZTA4MmJiLi5mZjUxM2ZmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9hdWRpdC5jCisrKyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2F1ZGl0LmMKQEAgLTIyLDE4ICsyMiw5IEBACiBzdGF0aWMgaW50IF9faW5pdCBpbWFfYXVkaXRfc2V0dXAoY2hhciAqc3RyKQogewogCXVuc2lnbmVkIGxvbmcgYXVkaXQ7Ci0JaW50IHJjLCByZXN1bHQgPSAwOwotCWNoYXIgKm9wID0gImltYV9hdWRpdCI7Ci0JY2hhciAqY2F1c2U7CiAKLQlyYyA9IHN0cmljdF9zdHJ0b3VsKHN0ciwgMCwgJmF1ZGl0KTsKLQlpZiAocmMgfHwgYXVkaXQgPiAxKQotCQlyZXN1bHQgPSAxOwotCWVsc2UKLQkJaW1hX2F1ZGl0ID0gYXVkaXQ7Ci0JY2F1c2UgPSBpbWFfYXVkaXQgPyAiZW5hYmxlZCIgOiAibm90X2VuYWJsZWQiOwotCWludGVncml0eV9hdWRpdF9tc2coQVVESVRfSU5URUdSSVRZX1NUQVRVUywgTlVMTCwgTlVMTCwKLQkJCSAgICBvcCwgY2F1c2UsIHJlc3VsdCwgMCk7CisJaWYgKCFzdHJpY3Rfc3RydG91bChzdHIsIDAsICZhdWRpdCkpCisJCWltYV9hdWRpdCA9IGF1ZGl0ID8gMSA6IDA7CiAJcmV0dXJuIDE7CiB9CiBfX3NldHVwKCJpbWFfYXVkaXQ9IiwgaW1hX2F1ZGl0X3NldHVwKTsKQEAgLTUwLDIzICs0MSwxNCBAQAogCiAJYWIgPSBhdWRpdF9sb2dfc3RhcnQoY3VycmVudC0+YXVkaXRfY29udGV4dCwgR0ZQX0tFUk5FTCwgYXVkaXRfbXNnbm8pOwogCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICJpbnRlZ3JpdHk6IHBpZD0lZCB1aWQ9JXUgYXVpZD0ldSBzZXM9JXUiLAotCQkJIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y3JlZC0+dWlkLAorCQkJIGN1cnJlbnQtPnBpZCwgY3VycmVudF9jcmVkKCktPnVpZCwKIAkJCSBhdWRpdF9nZXRfbG9naW51aWQoY3VycmVudCksCiAJCQkgYXVkaXRfZ2V0X3Nlc3Npb25pZChjdXJyZW50KSk7CiAJYXVkaXRfbG9nX3Rhc2tfY29udGV4dChhYik7Ci0Jc3dpdGNoIChhdWRpdF9tc2dubykgewotCWNhc2UgQVVESVRfSU5URUdSSVRZX0RBVEE6Ci0JY2FzZSBBVURJVF9JTlRFR1JJVFlfTUVUQURBVEE6Ci0JY2FzZSBBVURJVF9JTlRFR1JJVFlfUENSOgotCWNhc2UgQVVESVRfSU5URUdSSVRZX1NUQVRVUzoKLQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBvcD0lcyBjYXVzZT0lcyIsIG9wLCBjYXVzZSk7Ci0JCWJyZWFrOwotCWNhc2UgQVVESVRfSU5URUdSSVRZX0hBU0g6Ci0JCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgb3A9JXMgaGFzaD0lcyIsIG9wLCBjYXVzZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgb3A9JXMiLCBvcCk7Ci0JfQorCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgb3A9Iik7CisJYXVkaXRfbG9nX3N0cmluZyhhYiwgb3ApOworCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgY2F1c2U9Iik7CisJYXVkaXRfbG9nX3N0cmluZyhhYiwgY2F1c2UpOwogCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgY29tbT0iKTsKIAlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLCBjdXJyZW50LT5jb21tKTsKIAlpZiAoZm5hbWUpIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2NyeXB0by5jIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfY3J5cHRvLmMKaW5kZXggNTBkNTcyYi4uNjMwMDNhNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfY3J5cHRvLmMKKysrIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfY3J5cHRvLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQgaW1hX3BjcnJlYWQoaW50IGlkeCwgdTggKnBjcikKK3N0YXRpYyB2b2lkIF9faW5pdCBpbWFfcGNycmVhZChpbnQgaWR4LCB1OCAqcGNyKQogewogCWlmICghaW1hX3VzZWRfY2hpcCkKIAkJcmV0dXJuOwpAQCAtMTE1LDcgKzExNSw3IEBACiAvKgogICogQ2FsY3VsYXRlIHRoZSBib290IGFnZ3JlZ2F0ZSBoYXNoCiAgKi8KLWludCBpbWFfY2FsY19ib290X2FnZ3JlZ2F0ZShjaGFyICpkaWdlc3QpCitpbnQgX19pbml0IGltYV9jYWxjX2Jvb3RfYWdncmVnYXRlKGNoYXIgKmRpZ2VzdCkKIHsKIAlzdHJ1Y3QgaGFzaF9kZXNjIGRlc2M7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfZnMuYyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2ZzLmMKaW5kZXggZmZiZTI1OS4uNmJmYzdlYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfZnMuYworKysgYi9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9mcy5jCkBAIC0xNSw2ICsxNSw3IEBACiAgKglpbXBsZW1lbmVudHMgc2VjdXJpdHkgZmlsZSBzeXN0ZW0gZm9yIHJlcG9ydGluZwogICoJY3VycmVudCBtZWFzdXJlbWVudCBsaXN0IGFuZCBJTUEgc3RhdGlzdGljcwogICovCisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KQEAgLTg0LDggKzg1LDggQEAKIAkgKiBhZ2FpbnN0IGNvbmN1cnJlbnQgbGlzdC1leHRlbnNpb24KIAkgKi8KIAlyY3VfcmVhZF9sb2NrKCk7Ci0JcWUgPSBsaXN0X2VudHJ5KHJjdV9kZXJlZmVyZW5jZShxZS0+bGF0ZXIubmV4dCksCi0JCQlzdHJ1Y3QgaW1hX3F1ZXVlX2VudHJ5LCBsYXRlcik7CisJcWUgPSBsaXN0X2VudHJ5X3JjdShxZS0+bGF0ZXIubmV4dCwKKwkJCSAgICBzdHJ1Y3QgaW1hX3F1ZXVlX2VudHJ5LCBsYXRlcik7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJKCpwb3MpKys7CiAKQEAgLTI4Myw2ICsyODQsOSBAQAogICovCiBpbnQgaW1hX29wZW5fcG9saWN5KHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7CisJLyogTm8gcG9pbnQgaW4gYmVpbmcgYWxsb3dlZCB0byBvcGVuIGl0IGlmIHlvdSBhcmVuJ3QgZ29pbmcgdG8gd3JpdGUgKi8KKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19XUk9OTFkpKQorCQlyZXR1cm4gLUVBQ0NFUzsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcG9saWN5X29wZW5jb3VudCkpCiAJCXJldHVybiAwOwogCXJldHVybiAtRUJVU1k7CkBAIC0zMTUsNyArMzE5LDcgQEAKIAkucmVsZWFzZSA9IGltYV9yZWxlYXNlX3BvbGljeQogfTsKIAotaW50IGltYV9mc19pbml0KHZvaWQpCitpbnQgX19pbml0IGltYV9mc19pbml0KHZvaWQpCiB7CiAJaW1hX2RpciA9IHNlY3VyaXR5ZnNfY3JlYXRlX2RpcigiaW1hIiwgTlVMTCk7CiAJaWYgKElTX0VSUihpbWFfZGlyKSkKQEAgLTM0OSw3ICszNTMsNyBAQAogCQlnb3RvIG91dDsKIAogCWltYV9wb2xpY3kgPSBzZWN1cml0eWZzX2NyZWF0ZV9maWxlKCJwb2xpY3kiLAotCQkJCQkgICAgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lXVVNSLAorCQkJCQkgICAgU19JV1VTUiwKIAkJCQkJICAgIGltYV9kaXIsIE5VTEwsCiAJCQkJCSAgICAmaW1hX21lYXN1cmVfcG9saWN5X29wcyk7CiAJaWYgKElTX0VSUihpbWFfcG9saWN5KSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2lpbnQuYyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2lpbnQuYwppbmRleCBlYzc5ZjFlLi5iOGRkNjkzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9paW50LmMKKysrIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfaWludC5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAlrcmVmX3NldCgmaWludC0+cmVmY291bnQsIDEpOwogfQogCi12b2lkIGltYV9paW50Y2FjaGVfaW5pdCh2b2lkKQordm9pZCBfX2luaXQgaW1hX2lpbnRjYWNoZV9pbml0KHZvaWQpCiB7CiAJaWludF9jYWNoZSA9CiAJICAgIGttZW1fY2FjaGVfY3JlYXRlKCJpaW50X2NhY2hlIiwgc2l6ZW9mKHN0cnVjdCBpbWFfaWludF9jYWNoZSksIDAsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9pbml0LmMgYi9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9pbml0LmMKaW5kZXggMGIwYmI4Yy4uYTQwZGE3YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfaW5pdC5jCisrKyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2luaXQuYwpAQCAtMzgsNyArMzgsNyBAQAogICogYSBkaWZmZXJlbnQgdmFsdWUuKSBWaW9sYXRpb25zIGFkZCBhIHplcm8gZW50cnkgdG8gdGhlIG1lYXN1cmVtZW50CiAgKiBsaXN0IGFuZCBleHRlbmQgdGhlIGFnZ3JlZ2F0ZSBQQ1IgdmFsdWUgd2l0aCBmZi4uLmZmJ3MuCiAgKi8KLXN0YXRpYyB2b2lkIGltYV9hZGRfYm9vdF9hZ2dyZWdhdGUodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBpbWFfYWRkX2Jvb3RfYWdncmVnYXRlKHZvaWQpCiB7CiAJc3RydWN0IGltYV90ZW1wbGF0ZV9lbnRyeSAqZW50cnk7CiAJY29uc3QgY2hhciAqb3AgPSAiYWRkX2Jvb3RfYWdncmVnYXRlIjsKQEAgLTcxLDcgKzcxLDcgQEAKIAkJCSAgICBhdWRpdF9jYXVzZSwgcmVzdWx0LCAwKTsKIH0KIAotaW50IGltYV9pbml0KHZvaWQpCitpbnQgX19pbml0IGltYV9pbml0KHZvaWQpCiB7CiAJdTggcGNyX2lbSU1BX0RJR0VTVF9TSVpFXTsKIAlpbnQgcmM7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9tYWluLmMgYi9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9tYWluLmMKaW5kZXggZjRlNzI2Ni4uNmY2MTE4NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfbWFpbi5jCisrKyBiL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX21haW4uYwpAQCAtMjksMjAgKzI5LDggQEAKIGNoYXIgKmltYV9oYXNoID0gInNoYTEiOwogc3RhdGljIGludCBfX2luaXQgaGFzaF9zZXR1cChjaGFyICpzdHIpCiB7Ci0JY29uc3QgY2hhciAqb3AgPSAiaGFzaF9zZXR1cCI7Ci0JY29uc3QgY2hhciAqaGFzaCA9ICJzaGExIjsKLQlpbnQgcmVzdWx0ID0gMDsKLQlpbnQgYXVkaXRfaW5mbyA9IDA7Ci0KLQlpZiAoc3RybmNtcChzdHIsICJtZDUiLCAzKSA9PSAwKSB7Ci0JCWhhc2ggPSAibWQ1IjsKLQkJaW1hX2hhc2ggPSBzdHI7Ci0JfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgInNoYTEiLCA0KSAhPSAwKSB7Ci0JCWhhc2ggPSAiaW52YWxpZF9oYXNoX3R5cGUiOwotCQlyZXN1bHQgPSAxOwotCX0KLQlpbnRlZ3JpdHlfYXVkaXRfbXNnKEFVRElUX0lOVEVHUklUWV9IQVNILCBOVUxMLCBOVUxMLCBvcCwgaGFzaCwKLQkJCSAgICByZXN1bHQsIGF1ZGl0X2luZm8pOworCWlmIChzdHJuY21wKHN0ciwgIm1kNSIsIDMpID09IDApCisJCWltYV9oYXNoID0gIm1kNSI7CiAJcmV0dXJuIDE7CiB9CiBfX3NldHVwKCJpbWFfaGFzaD0iLCBoYXNoX3NldHVwKTsKQEAgLTEyOCwxMCArMTE2LDYgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKElTX0VSUihmaWxlKSkgewotCQlwcl9pbmZvKCIlcyBkZW50cnlfb3BlbiBmYWlsZWRcbiIsIGZpbGVuYW1lKTsKLQkJcmV0dXJuIHJjOwotCX0KIAlpaW50LT5vcGVuY291bnQrKzsKIAlpaW50LT5yZWFkY291bnQrKzsKIApAQCAtMTQxLDYgKzEyNSwxNSBAQAogCXJldHVybiByYzsKIH0KIAorc3RhdGljIHZvaWQgaW1hX3VwZGF0ZV9jb3VudHMoc3RydWN0IGltYV9paW50X2NhY2hlICppaW50LCBpbnQgbWFzaykKK3sKKwlpaW50LT5vcGVuY291bnQrKzsKKwlpZiAoKG1hc2sgJiBNQVlfV1JJVEUpIHx8IChtYXNrID09IDApKQorCQlpaW50LT53cml0ZWNvdW50Kys7CisJZWxzZSBpZiAobWFzayAmIChNQVlfUkVBRCB8IE1BWV9FWEVDKSkKKwkJaWludC0+cmVhZGNvdW50Kys7Cit9CisKIC8qKgogICogaW1hX3BhdGhfY2hlY2sgLSBiYXNlZCBvbiBwb2xpY3ksIGNvbGxlY3Qvc3RvcmUgbWVhc3VyZW1lbnQuCiAgKiBAcGF0aDogY29udGFpbnMgYSBwb2ludGVyIHRvIHRoZSBwYXRoIHRvIGJlIG1lYXN1cmVkCkBAIC0xNTYsMTAgKzE0OSwxMCBAQAogICoJLSBPcGVuaW5nIGEgZmlsZSBmb3IgcmVhZCB3aGVuIGFscmVhZHkgb3BlbiBmb3Igd3JpdGUsCiAgKiAJICBjb3VsZCByZXN1bHQgaW4gYSBmaWxlIG1lYXN1cmVtZW50IGVycm9yLgogICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGFuIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqIChCYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiBhcHByYWlzZV9tZWFzdXJlbWVudCgpLikKKyAqIEFsd2F5cyByZXR1cm4gMCBhbmQgYXVkaXQgZGVudHJ5X29wZW4gZmFpbHVyZXMuCisgKiAoUmV0dXJuIGNvZGUgd2lsbCBiZSBiYXNlZCB1cG9uIG1lYXN1cmVtZW50IGFwcHJhaXNhbC4pCiAgKi8KLWludCBpbWFfcGF0aF9jaGVjayhzdHJ1Y3QgcGF0aCAqcGF0aCwgaW50IG1hc2spCitpbnQgaW1hX3BhdGhfY2hlY2soc3RydWN0IHBhdGggKnBhdGgsIGludCBtYXNrLCBpbnQgdXBkYXRlX2NvdW50cykKIHsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBpbWFfaWludF9jYWNoZSAqaWludDsKQEAgLTE3MywxMSArMTY2LDggQEAKIAkJcmV0dXJuIDA7CiAKIAltdXRleF9sb2NrKCZpaW50LT5tdXRleCk7Ci0JaWludC0+b3BlbmNvdW50Kys7Ci0JaWYgKChtYXNrICYgTUFZX1dSSVRFKSB8fCAobWFzayA9PSAwKSkKLQkJaWludC0+d3JpdGVjb3VudCsrOwotCWVsc2UgaWYgKG1hc2sgJiAoTUFZX1JFQUQgfCBNQVlfRVhFQykpCi0JCWlpbnQtPnJlYWRjb3VudCsrOworCWlmICh1cGRhdGVfY291bnRzKQorCQlpbWFfdXBkYXRlX2NvdW50cyhpaW50LCBtYXNrKTsKIAogCXJjID0gaW1hX211c3RfbWVhc3VyZShpaW50LCBpbm9kZSwgTUFZX1JFQUQsIFBBVEhfQ0hFQ0spOwogCWlmIChyYyA8IDApCkBAIC0xOTYsNyArMTg2LDE5IEBACiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGRnZXQocGF0aC0+ZGVudHJ5KTsKIAkJc3RydWN0IHZmc21vdW50ICptbnQgPSBtbnRnZXQocGF0aC0+bW50KTsKIAotCQlmaWxlID0gZGVudHJ5X29wZW4oZGVudHJ5LCBtbnQsIE9fUkRPTkxZLCBjdXJyZW50LT5jcmVkKTsKKwkJZmlsZSA9IGRlbnRyeV9vcGVuKGRlbnRyeSwgbW50LCBPX1JET05MWSB8IE9fTEFSR0VGSUxFLAorCQkJCSAgIGN1cnJlbnRfY3JlZCgpKTsKKwkJaWYgKElTX0VSUihmaWxlKSkgeworCQkJaW50IGF1ZGl0X2luZm8gPSAwOworCisJCQlpbnRlZ3JpdHlfYXVkaXRfbXNnKEFVRElUX0lOVEVHUklUWV9QQ1IsIGlub2RlLAorCQkJCQkgICAgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkJICAgICJhZGRfbWVhc3VyZW1lbnQiLAorCQkJCQkgICAgImRlbnRyeV9vcGVuIGZhaWxlZCIsCisJCQkJCSAgICAxLCBhdWRpdF9pbmZvKTsKKwkJCWZpbGUgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KIAkJcmMgPSBnZXRfcGF0aF9tZWFzdXJlbWVudChpaW50LCBmaWxlLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKIAl9CiBvdXQ6CkBAIC0yMDYsNiArMjA4LDcgQEAKIAlrcmVmX3B1dCgmaWludC0+cmVmY291bnQsIGlpbnRfZnJlZSk7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChpbWFfcGF0aF9jaGVjayk7CiAKIHN0YXRpYyBpbnQgcHJvY2Vzc19tZWFzdXJlbWVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgdW5zaWduZWQgY2hhciAqZmlsZW5hbWUsCiAJCQkgICAgICAgaW50IG1hc2ssIGludCBmdW5jdGlvbikKQEAgLTIzNCw3ICsyMzcsMTYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIG9wZW5jb3VudF9nZXQoc3RydWN0IGZpbGUgKmZpbGUpCisvKgorICogaW1hX29wZW5zX2dldCAtIGluY3JlbWVudCBmaWxlIGNvdW50cworICoKKyAqIC0gZm9yIElQQyBzaG0gYW5kIHNobWF0IGZpbGUuCisgKiAtIGZvciBuZnNkIGV4cG9ydGVkIGZpbGVzLgorICoKKyAqIEluY3JlbWVudCB0aGUgY291bnRzIGZvciB0aGVzZSBmaWxlcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5CisgKiBpbWJhbGFuY2UgbWVzc2FnZXMuCisgKi8KK3ZvaWQgaW1hX2NvdW50c19nZXQoc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBpbWFfaWludF9jYWNoZSAqaWludDsKQEAgLTI0Niw4ICsyNTgsMTQgQEAKIAkJcmV0dXJuOwogCW11dGV4X2xvY2soJmlpbnQtPm11dGV4KTsKIAlpaW50LT5vcGVuY291bnQrKzsKKwlpZiAoKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSA9PSBGTU9ERV9SRUFEKQorCQlpaW50LT5yZWFkY291bnQrKzsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJaWludC0+d3JpdGVjb3VudCsrOwogCW11dGV4X3VubG9jaygmaWludC0+bXV0ZXgpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaW1hX2NvdW50c19nZXQpOwogCiAvKioKICAqIGltYV9maWxlX21tYXAgLSBiYXNlZCBvbiBwb2xpY3ksIGNvbGxlY3Qvc3RvcmUgbWVhc3VyZW1lbnQuCkBAIC0yNzIsMTggKzI5MCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBpbWFfc2htX2NoZWNrIC0gSVBDIHNobSBhbmQgc2htYXQgY3JlYXRlL2ZwdXQgYSBmaWxlCi0gKgotICogTWFpbnRhaW4gdGhlIG9wZW5jb3VudCBmb3IgdGhlc2UgZmlsZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeQotICogaW1iYWxhbmNlIG1lc3NhZ2VzLgotICovCi12b2lkIGltYV9zaG1fY2hlY2soc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jb3BlbmNvdW50X2dldChmaWxlKTsKLQlyZXR1cm47Ci19Ci0KIC8qKgogICogaW1hX2Jwcm1fY2hlY2sgLSBiYXNlZCBvbiBwb2xpY3ksIGNvbGxlY3Qvc3RvcmUgbWVhc3VyZW1lbnQuCiAgKiBAYnBybTogY29udGFpbnMgdGhlIGxpbnV4X2JpbnBybSBzdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX3BvbGljeS5jIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfcG9saWN5LmMKaW5kZXggYjUyOTFhZC4uZTEyNzgzOSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfcG9saWN5LmMKKysrIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfcG9saWN5LmMKQEAgLTQ1LDI0ICs0NSwzMCBAQAogCX0gbHNtW01BWF9MU01fUlVMRVNdOwogfTsKIAotLyogV2l0aG91dCBMU00gc3BlY2lmaWMga25vd2xlZGdlLCB0aGUgZGVmYXVsdCBwb2xpY3kgY2FuIG9ubHkgYmUKKy8qCisgKiBXaXRob3V0IExTTSBzcGVjaWZpYyBrbm93bGVkZ2UsIHRoZSBkZWZhdWx0IHBvbGljeSBjYW4gb25seSBiZQogICogd3JpdHRlbiBpbiB0ZXJtcyBvZiAuYWN0aW9uLCAuZnVuYywgLm1hc2ssIC5mc21hZ2ljLCBhbmQgLnVpZAogICovCisKKy8qCisgKiBUaGUgbWluaW11bSBydWxlIHNldCB0byBhbGxvdyBmb3IgZnVsbCBUQ0IgY292ZXJhZ2UuICBNZWFzdXJlcyBhbGwgZmlsZXMKKyAqIG9wZW5lZCBvciBtbWFwIGZvciBleGVjIGFuZCBldmVyeXRoaW5nIHJlYWQgYnkgcm9vdC4gIERhbmdlcm91cyBiZWNhdXNlCisgKiBub3JtYWwgdXNlcnMgY2FuIGVhc2lseSBydW4gdGhlIG1hY2hpbmUgb3V0IG9mIG1lbW9yeSBzaW1wbHkgYnVpbGRpbmcKKyAqIGFuZCBydW5uaW5nIGV4ZWN1dGFibGVzLgorICovCiBzdGF0aWMgc3RydWN0IGltYV9tZWFzdXJlX3J1bGVfZW50cnkgZGVmYXVsdF9ydWxlc1tdID0gewotCXsuYWN0aW9uID0gRE9OVF9NRUFTVVJFLC5mc21hZ2ljID0gUFJPQ19TVVBFUl9NQUdJQywKLQkgLmZsYWdzID0gSU1BX0ZTTUFHSUN9LAorCXsuYWN0aW9uID0gRE9OVF9NRUFTVVJFLC5mc21hZ2ljID0gUFJPQ19TVVBFUl9NQUdJQywuZmxhZ3MgPSBJTUFfRlNNQUdJQ30sCiAJey5hY3Rpb24gPSBET05UX01FQVNVUkUsLmZzbWFnaWMgPSBTWVNGU19NQUdJQywuZmxhZ3MgPSBJTUFfRlNNQUdJQ30sCiAJey5hY3Rpb24gPSBET05UX01FQVNVUkUsLmZzbWFnaWMgPSBERUJVR0ZTX01BR0lDLC5mbGFncyA9IElNQV9GU01BR0lDfSwKIAl7LmFjdGlvbiA9IERPTlRfTUVBU1VSRSwuZnNtYWdpYyA9IFRNUEZTX01BR0lDLC5mbGFncyA9IElNQV9GU01BR0lDfSwKLQl7LmFjdGlvbiA9IERPTlRfTUVBU1VSRSwuZnNtYWdpYyA9IFNFQ1VSSVRZRlNfTUFHSUMsCi0JIC5mbGFncyA9IElNQV9GU01BR0lDfSwKLQl7LmFjdGlvbiA9IERPTlRfTUVBU1VSRSwuZnNtYWdpYyA9IDB4Rjk3Q0ZGOEMsLmZsYWdzID0gSU1BX0ZTTUFHSUN9LAorCXsuYWN0aW9uID0gRE9OVF9NRUFTVVJFLC5mc21hZ2ljID0gU0VDVVJJVFlGU19NQUdJQywuZmxhZ3MgPSBJTUFfRlNNQUdJQ30sCisJey5hY3Rpb24gPSBET05UX01FQVNVUkUsLmZzbWFnaWMgPSBTRUxJTlVYX01BR0lDLC5mbGFncyA9IElNQV9GU01BR0lDfSwKIAl7LmFjdGlvbiA9IE1FQVNVUkUsLmZ1bmMgPSBGSUxFX01NQVAsLm1hc2sgPSBNQVlfRVhFQywKIAkgLmZsYWdzID0gSU1BX0ZVTkMgfCBJTUFfTUFTS30sCiAJey5hY3Rpb24gPSBNRUFTVVJFLC5mdW5jID0gQlBSTV9DSEVDSywubWFzayA9IE1BWV9FWEVDLAogCSAuZmxhZ3MgPSBJTUFfRlVOQyB8IElNQV9NQVNLfSwKIAl7LmFjdGlvbiA9IE1FQVNVUkUsLmZ1bmMgPSBQQVRIX0NIRUNLLC5tYXNrID0gTUFZX1JFQUQsLnVpZCA9IDAsCi0JIC5mbGFncyA9IElNQV9GVU5DIHwgSU1BX01BU0sgfCBJTUFfVUlEfQorCSAuZmxhZ3MgPSBJTUFfRlVOQyB8IElNQV9NQVNLIHwgSU1BX1VJRH0sCiB9OwogCiBzdGF0aWMgTElTVF9IRUFEKG1lYXN1cmVfZGVmYXVsdF9ydWxlcyk7CkBAIC03MSw2ICs3NywxNCBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKGltYV9tZWFzdXJlX211dGV4KTsKIAorc3RhdGljIGJvb2wgaW1hX3VzZV90Y2IgX19pbml0ZGF0YTsKK3N0YXRpYyBpbnQgX19pbml0IGRlZmF1bHRfcG9saWN5X3NldHVwKGNoYXIgKnN0cikKK3sKKwlpbWFfdXNlX3RjYiA9IDE7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJpbWFfdGNiIiwgZGVmYXVsdF9wb2xpY3lfc2V0dXApOworCiAvKioKICAqIGltYV9tYXRjaF9ydWxlcyAtIGRldGVybWluZSB3aGV0aGVyIGFuIGlub2RlIG1hdGNoZXMgdGhlIG1lYXN1cmUgcnVsZS4KICAqIEBydWxlOiBhIHBvaW50ZXIgdG8gYSBydWxlCkBAIC05Niw3ICsxMTAsNyBAQAogCWlmICgocnVsZS0+ZmxhZ3MgJiBJTUFfVUlEKSAmJiBydWxlLT51aWQgIT0gdHNrLT5jcmVkLT51aWQpCiAJCXJldHVybiBmYWxzZTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0xTTV9SVUxFUzsgaSsrKSB7Ci0JCWludCByYzsKKwkJaW50IHJjID0gMDsKIAkJdTMyIG9zaWQsIHNpZDsKIAogCQlpZiAoIXJ1bGUtPmxzbVtpXS5ydWxlKQpAQCAtMTA5LDcgKzEyMyw3IEBACiAJCQlzZWN1cml0eV9pbm9kZV9nZXRzZWNpZChpbm9kZSwgJm9zaWQpOwogCQkJcmMgPSBzZWN1cml0eV9maWx0ZXJfcnVsZV9tYXRjaChvc2lkLAogCQkJCQkJCXJ1bGUtPmxzbVtpXS50eXBlLAotCQkJCQkJCUFVRElUX0VRVUFMLAorCQkJCQkJCUF1ZGl0X2VxdWFsLAogCQkJCQkJCXJ1bGUtPmxzbVtpXS5ydWxlLAogCQkJCQkJCU5VTEwpOwogCQkJYnJlYWs7CkBAIC0xMTksNyArMTMzLDcgQEAKIAkJCXNlY3VyaXR5X3Rhc2tfZ2V0c2VjaWQodHNrLCAmc2lkKTsKIAkJCXJjID0gc2VjdXJpdHlfZmlsdGVyX3J1bGVfbWF0Y2goc2lkLAogCQkJCQkJCXJ1bGUtPmxzbVtpXS50eXBlLAotCQkJCQkJCUFVRElUX0VRVUFMLAorCQkJCQkJCUF1ZGl0X2VxdWFsLAogCQkJCQkJCXJ1bGUtPmxzbVtpXS5ydWxlLAogCQkJCQkJCU5VTEwpOwogCQlkZWZhdWx0OgpAQCAtMTY0LDExICsxNzgsMTcgQEAKICAqIGltYV9tZWFzdXJlIHBvaW50cyB0byBlaXRoZXIgdGhlIG1lYXN1cmVfZGVmYXVsdF9ydWxlcyBvciB0aGUKICAqIHRoZSBuZXcgbWVhc3VyZV9wb2xpY3lfcnVsZXMuCiAgKi8KLXZvaWQgaW1hX2luaXRfcG9saWN5KHZvaWQpCit2b2lkIF9faW5pdCBpbWFfaW5pdF9wb2xpY3kodm9pZCkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgZW50cmllczsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlZmF1bHRfcnVsZXMpOyBpKyspCisJLyogaWYgIWltYV91c2VfdGNiIHNldCBlbnRyaWVzID0gMCBzbyB3ZSBsb2FkIE5PIGRlZmF1bHQgcnVsZXMgKi8KKwlpZiAoaW1hX3VzZV90Y2IpCisJCWVudHJpZXMgPSBBUlJBWV9TSVpFKGRlZmF1bHRfcnVsZXMpOworCWVsc2UKKwkJZW50cmllcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQogCQlsaXN0X2FkZF90YWlsKCZkZWZhdWx0X3J1bGVzW2ldLmxpc3QsICZtZWFzdXJlX2RlZmF1bHRfcnVsZXMpOwogCWltYV9tZWFzdXJlID0gJm1lYXN1cmVfZGVmYXVsdF9ydWxlczsKIH0KQEAgLTIyNyw3ICsyNDcsNyBAQAogCiAJZW50cnktPmxzbVtsc21fcnVsZV0udHlwZSA9IGF1ZGl0X3R5cGU7CiAJcmVzdWx0ID0gc2VjdXJpdHlfZmlsdGVyX3J1bGVfaW5pdChlbnRyeS0+bHNtW2xzbV9ydWxlXS50eXBlLAotCQkJCQkgICBBVURJVF9FUVVBTCwgYXJncywKKwkJCQkJICAgQXVkaXRfZXF1YWwsIGFyZ3MsCiAJCQkJCSAgICZlbnRyeS0+bHNtW2xzbV9ydWxlXS5ydWxlKTsKIAlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbHNtX2F1ZGl0LmMgYi9zZWN1cml0eS9sc21fYXVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGI4Njg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvbHNtX2F1ZGl0LmMKQEAgLTAsMCArMSwzODYgQEAKKy8qCisgKiBjb21tb24gTFNNIGF1ZGl0aW5nIGZ1bmN0aW9ucworICoKKyAqIEJhc2VkIG9uIGNvZGUgd3JpdHRlbiBmb3IgU0VMaW51eCBieSA6CisgKgkJCVN0ZXBoZW4gU21hbGxleSwgPHNkc0BlcG9jaC5uY3NjLm1pbD4KKyAqIAkJCUphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgorICogQXV0aG9yIDogRXRpZW5uZSBCYXNzZXQsIDxldGllbm5lLmJhc3NldEBlbnN0YS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLAorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC91bi5oPgorI2luY2x1ZGUgPG5ldC9hZl91bml4Lmg+CisjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RjY3AuaD4KKyNpbmNsdWRlIDxsaW51eC9zY3RwLmg+CisjaW5jbHVkZSA8bGludXgvbHNtX2F1ZGl0Lmg+CisKKy8qKgorICogaXB2NF9za2JfdG9fYXVkaXRkYXRhIDogZmlsbCBhdWRpdGRhdGEgZnJvbSBza2IKKyAqIEBza2IgOiB0aGUgc2tiCisgKiBAYWQgOiB0aGUgYXVkaXQgZGF0YSB0byBmaWxsCisgKiBAcHJvdG8gOiB0aGUgbGF5ZXIgNCBwcm90b2NvbAorICoKKyAqIHJldHVybiAgMCBvbiBzdWNjZXNzCisgKi8KK2ludCBpcHY0X3NrYl90b19hdWRpdGRhdGEoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhICphZCwgdTggKnByb3RvKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpcGhkciAqaWg7CisKKwlpaCA9IGlwX2hkcihza2IpOworCWlmIChpaCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkLT51Lm5ldC52NGluZm8uc2FkZHIgPSBpaC0+c2FkZHI7CisJYWQtPnUubmV0LnY0aW5mby5kYWRkciA9IGloLT5kYWRkcjsKKworCWlmIChwcm90bykKKwkJKnByb3RvID0gaWgtPnByb3RvY29sOworCS8qIG5vbiBpbml0aWFsIGZyYWdtZW50ICovCisJaWYgKG50b2hzKGloLT5mcmFnX29mZikgJiBJUF9PRkZTRVQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChpaC0+cHJvdG9jb2wpIHsKKwljYXNlIElQUFJPVE9fVENQOiB7CisJCXN0cnVjdCB0Y3BoZHIgKnRoID0gdGNwX2hkcihza2IpOworCQlpZiAodGggPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWFkLT51Lm5ldC5zcG9ydCA9IHRoLT5zb3VyY2U7CisJCWFkLT51Lm5ldC5kcG9ydCA9IHRoLT5kZXN0OworCQlicmVhazsKKwl9CisJY2FzZSBJUFBST1RPX1VEUDogeworCQlzdHJ1Y3QgdWRwaGRyICp1aCA9IHVkcF9oZHIoc2tiKTsKKwkJaWYgKHVoID09IE5VTEwpCisJCQlicmVhazsKKworCQlhZC0+dS5uZXQuc3BvcnQgPSB1aC0+c291cmNlOworCQlhZC0+dS5uZXQuZHBvcnQgPSB1aC0+ZGVzdDsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBQUk9UT19EQ0NQOiB7CisJCXN0cnVjdCBkY2NwX2hkciAqZGggPSBkY2NwX2hkcihza2IpOworCQlpZiAoZGggPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWFkLT51Lm5ldC5zcG9ydCA9IGRoLT5kY2NwaF9zcG9ydDsKKwkJYWQtPnUubmV0LmRwb3J0ID0gZGgtPmRjY3BoX2Rwb3J0OworCQlicmVhazsKKwl9CisJY2FzZSBJUFBST1RPX1NDVFA6IHsKKwkJc3RydWN0IHNjdHBoZHIgKnNoID0gc2N0cF9oZHIoc2tiKTsKKwkJaWYgKHNoID09IE5VTEwpCisJCQlicmVhazsKKwkJYWQtPnUubmV0LnNwb3J0ID0gc2gtPnNvdXJjZTsKKwkJYWQtPnUubmV0LmRwb3J0ID0gc2gtPmRlc3Q7CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorLyoqCisgKiBpcHY2X3NrYl90b19hdWRpdGRhdGEgOiBmaWxsIGF1ZGl0ZGF0YSBmcm9tIHNrYgorICogQHNrYiA6IHRoZSBza2IKKyAqIEBhZCA6IHRoZSBhdWRpdCBkYXRhIHRvIGZpbGwKKyAqIEBwcm90byA6IHRoZSBsYXllciA0IHByb3RvY29sCisgKgorICogcmV0dXJuICAwIG9uIHN1Y2Nlc3MKKyAqLworaW50IGlwdjZfc2tiX3RvX2F1ZGl0ZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKmFkLCB1OCAqcHJvdG8pCit7CisJaW50IG9mZnNldCwgcmV0ID0gMDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXA2OworCXU4IG5leHRoZHI7CisKKwlpcDYgPSBpcHY2X2hkcihza2IpOworCWlmIChpcDYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaXB2Nl9hZGRyX2NvcHkoJmFkLT51Lm5ldC52NmluZm8uc2FkZHIsICZpcDYtPnNhZGRyKTsKKwlpcHY2X2FkZHJfY29weSgmYWQtPnUubmV0LnY2aW5mby5kYWRkciwgJmlwNi0+ZGFkZHIpOworCXJldCA9IDA7CisJLyogSVB2NiBjYW4gaGF2ZSBzZXZlcmFsIGV4dGVuc2lvbiBoZWFkZXIgYmVmb3JlIHRoZSBUcmFuc3BvcnQgaGVhZGVyCisJICogc2tpcCB0aGVtICovCisJb2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CisJb2Zmc2V0ICs9IHNpemVvZigqaXA2KTsKKwluZXh0aGRyID0gaXA2LT5uZXh0aGRyOworCW9mZnNldCA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBvZmZzZXQsICZuZXh0aGRyKTsKKwlpZiAob2Zmc2V0IDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKHByb3RvKQorCQkqcHJvdG8gPSBuZXh0aGRyOworCXN3aXRjaCAobmV4dGhkcikgeworCWNhc2UgSVBQUk9UT19UQ1A6IHsKKwkJc3RydWN0IHRjcGhkciBfdGNwaCwgKnRoOworCisJCXRoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOworCQlpZiAodGggPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWFkLT51Lm5ldC5zcG9ydCA9IHRoLT5zb3VyY2U7CisJCWFkLT51Lm5ldC5kcG9ydCA9IHRoLT5kZXN0OworCQlicmVhazsKKwl9CisJY2FzZSBJUFBST1RPX1VEUDogeworCQlzdHJ1Y3QgdWRwaGRyIF91ZHBoLCAqdWg7CisKKwkJdWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfdWRwaCksICZfdWRwaCk7CisJCWlmICh1aCA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJYWQtPnUubmV0LnNwb3J0ID0gdWgtPnNvdXJjZTsKKwkJYWQtPnUubmV0LmRwb3J0ID0gdWgtPmRlc3Q7CisJCWJyZWFrOworCX0KKwljYXNlIElQUFJPVE9fRENDUDogeworCQlzdHJ1Y3QgZGNjcF9oZHIgX2RjY3BoLCAqZGg7CisKKwkJZGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihfZGNjcGgpLCAmX2RjY3BoKTsKKwkJaWYgKGRoID09IE5VTEwpCisJCQlicmVhazsKKworCQlhZC0+dS5uZXQuc3BvcnQgPSBkaC0+ZGNjcGhfc3BvcnQ7CisJCWFkLT51Lm5ldC5kcG9ydCA9IGRoLT5kY2NwaF9kcG9ydDsKKwkJYnJlYWs7CisJfQorCWNhc2UgSVBQUk9UT19TQ1RQOiB7CisJCXN0cnVjdCBzY3RwaGRyIF9zY3RwaCwgKnNoOworCisJCXNoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2YoX3NjdHBoKSwgJl9zY3RwaCk7CisJCWlmIChzaCA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWFkLT51Lm5ldC5zcG9ydCA9IHNoLT5zb3VyY2U7CisJCWFkLT51Lm5ldC5kcG9ydCA9IHNoLT5kZXN0OworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9pcHY2X2FkZHIoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsCisJCQkJICAgc3RydWN0IGluNl9hZGRyICphZGRyLCBfX2JlMTYgcG9ydCwKKwkJCQkgICBjaGFyICpuYW1lMSwgY2hhciAqbmFtZTIpCit7CisJaWYgKCFpcHY2X2FkZHJfYW55KGFkZHIpKQorCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVwSTYiLCBuYW1lMSwgYWRkcik7CisJaWYgKHBvcnQpCisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgJXM9JWQiLCBuYW1lMiwgbnRvaHMocG9ydCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfaXB2NF9hZGRyKHN0cnVjdCBhdWRpdF9idWZmZXIgKmFiLCBfX2JlMzIgYWRkciwKKwkJCQkgICBfX2JlMTYgcG9ydCwgY2hhciAqbmFtZTEsIGNoYXIgKm5hbWUyKQoreworCWlmIChhZGRyKQorCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVwSTQiLCBuYW1lMSwgJmFkZHIpOworCWlmIChwb3J0KQorCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiICVzPSVkIiwgbmFtZTIsIG50b2hzKHBvcnQpKTsKK30KKworLyoqCisgKiBkdW1wX2NvbW1vbl9hdWRpdF9kYXRhIC0gaGVscGVyIHRvIGR1bXAgY29tbW9uIGF1ZGl0IGRhdGEKKyAqIEBhIDogY29tbW9uIGF1ZGl0IGRhdGEKKyAqCisgKi8KK3N0YXRpYyB2b2lkIGR1bXBfY29tbW9uX2F1ZGl0X2RhdGEoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsCisJCQkJICAgc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhICphKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCWlmIChhLT50c2spCisJCXRzayA9IGEtPnRzazsKKwlpZiAodHNrICYmIHRzay0+cGlkKSB7CisJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgcGlkPSVkIGNvbW09IiwgdHNrLT5waWQpOworCQlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLCB0c2stPmNvbW0pOworCX0KKworCXN3aXRjaCAoYS0+dHlwZSkgeworCWNhc2UgTFNNX0FVRElUX0RBVEFfSVBDOgorCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGtleT0lZCAiLCBhLT51LmlwY19pZCk7CisJCWJyZWFrOworCWNhc2UgTFNNX0FVRElUX0RBVEFfQ0FQOgorCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGNhcGFiaWxpdHk9JWQgIiwgYS0+dS5jYXApOworCQlicmVhazsKKwljYXNlIExTTV9BVURJVF9EQVRBX0ZTOgorCQlpZiAoYS0+dS5mcy5wYXRoLmRlbnRyeSkgeworCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gYS0+dS5mcy5wYXRoLmRlbnRyeTsKKwkJCWlmIChhLT51LmZzLnBhdGgubW50KSB7CisJCQkJYXVkaXRfbG9nX2RfcGF0aChhYiwgInBhdGg9IiwgJmEtPnUuZnMucGF0aCk7CisJCQl9IGVsc2UgeworCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbmFtZT0iKTsKKwkJCQlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLAorCQkJCQkJIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkJfQorCQkJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJCX0gZWxzZSBpZiAoYS0+dS5mcy5pbm9kZSkgeworCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCQkJaW5vZGUgPSBhLT51LmZzLmlub2RlOworCQkJZGVudHJ5ID0gZF9maW5kX2FsaWFzKGlub2RlKTsKKwkJCWlmIChkZW50cnkpIHsKKwkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG5hbWU9Iik7CisJCQkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwKKwkJCQkJCSBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQl9CisJCX0KKwkJaWYgKGlub2RlKQorCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBkZXY9JXMgaW5vPSVsdSIsCisJCQkJCWlub2RlLT5pX3NiLT5zX2lkLAorCQkJCQlpbm9kZS0+aV9pbm8pOworCQlicmVhazsKKwljYXNlIExTTV9BVURJVF9EQVRBX1RBU0s6CisJCXRzayA9IGEtPnUudHNrOworCQlpZiAodHNrICYmIHRzay0+cGlkKSB7CisJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBpZD0lZCBjb21tPSIsIHRzay0+cGlkKTsKKwkJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIHRzay0+Y29tbSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBMU01fQVVESVRfREFUQV9ORVQ6CisJCWlmIChhLT51Lm5ldC5zaykgeworCQkJc3RydWN0IHNvY2sgKnNrID0gYS0+dS5uZXQuc2s7CisJCQlzdHJ1Y3QgdW5peF9zb2NrICp1OworCQkJaW50IGxlbiA9IDA7CisJCQljaGFyICpwID0gTlVMTDsKKworCQkJc3dpdGNoIChzay0+c2tfZmFtaWx5KSB7CisJCQljYXNlIEFGX0lORVQ6IHsKKwkJCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisKKwkJCQlwcmludF9pcHY0X2FkZHIoYWIsIGluZXQtPnJjdl9zYWRkciwKKwkJCQkJCWluZXQtPnNwb3J0LAorCQkJCQkJImxhZGRyIiwgImxwb3J0Iik7CisJCQkJcHJpbnRfaXB2NF9hZGRyKGFiLCBpbmV0LT5kYWRkciwKKwkJCQkJCWluZXQtPmRwb3J0LAorCQkJCQkJImZhZGRyIiwgImZwb3J0Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFGX0lORVQ2OiB7CisJCQkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOworCQkJCXN0cnVjdCBpcHY2X3BpbmZvICppbmV0NiA9IGluZXQ2X3NrKHNrKTsKKworCQkJCXByaW50X2lwdjZfYWRkcihhYiwgJmluZXQ2LT5yY3Zfc2FkZHIsCisJCQkJCQlpbmV0LT5zcG9ydCwKKwkJCQkJCSJsYWRkciIsICJscG9ydCIpOworCQkJCXByaW50X2lwdjZfYWRkcihhYiwgJmluZXQ2LT5kYWRkciwKKwkJCQkJCWluZXQtPmRwb3J0LAorCQkJCQkJImZhZGRyIiwgImZwb3J0Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEFGX1VOSVg6CisJCQkJdSA9IHVuaXhfc2soc2spOworCQkJCWlmICh1LT5kZW50cnkpIHsKKwkJCQkJc3RydWN0IHBhdGggcGF0aCA9IHsKKwkJCQkJCS5kZW50cnkgPSB1LT5kZW50cnksCisJCQkJCQkubW50ID0gdS0+bW50CisJCQkJCX07CisJCQkJCWF1ZGl0X2xvZ19kX3BhdGgoYWIsICJwYXRoPSIsICZwYXRoKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICghdS0+YWRkcikKKwkJCQkJYnJlYWs7CisJCQkJbGVuID0gdS0+YWRkci0+bGVuLXNpemVvZihzaG9ydCk7CisJCQkJcCA9ICZ1LT5hZGRyLT5uYW1lLT5zdW5fcGF0aFswXTsKKwkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBhdGg9Iik7CisJCQkJaWYgKCpwKQorCQkJCQlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLCBwKTsKKwkJCQllbHNlCisJCQkJCWF1ZGl0X2xvZ19uX2hleChhYiwgcCwgbGVuKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXN3aXRjaCAoYS0+dS5uZXQuZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCXByaW50X2lwdjRfYWRkcihhYiwgYS0+dS5uZXQudjRpbmZvLnNhZGRyLAorCQkJCQlhLT51Lm5ldC5zcG9ydCwKKwkJCQkJInNhZGRyIiwgInNyYyIpOworCQkJcHJpbnRfaXB2NF9hZGRyKGFiLCBhLT51Lm5ldC52NGluZm8uZGFkZHIsCisJCQkJCWEtPnUubmV0LmRwb3J0LAorCQkJCQkiZGFkZHIiLCAiZGVzdCIpOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlwcmludF9pcHY2X2FkZHIoYWIsICZhLT51Lm5ldC52NmluZm8uc2FkZHIsCisJCQkJCWEtPnUubmV0LnNwb3J0LAorCQkJCQkic2FkZHIiLCAic3JjIik7CisJCQlwcmludF9pcHY2X2FkZHIoYWIsICZhLT51Lm5ldC52NmluZm8uZGFkZHIsCisJCQkJCWEtPnUubmV0LmRwb3J0LAorCQkJCQkiZGFkZHIiLCAiZGVzdCIpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGEtPnUubmV0Lm5ldGlmID4gMCkgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKworCQkJLyogTk9URTogd2UgYWx3YXlzIHVzZSBpbml0J3MgbmFtZXNwYWNlICovCisJCQlkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KCZpbml0X25ldCwgYS0+dS5uZXQubmV0aWYpOworCQkJaWYgKGRldikgeworCQkJCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgbmV0aWY9JXMiLCBkZXYtPm5hbWUpOworCQkJCWRldl9wdXQoZGV2KTsKKwkJCX0KKwkJfQorCQlicmVhazsKKyNpZmRlZiBDT05GSUdfS0VZUworCWNhc2UgTFNNX0FVRElUX0RBVEFfS0VZOgorCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIGtleV9zZXJpYWw9JXUiLCBhLT51LmtleV9zdHJ1Y3Qua2V5KTsKKwkJaWYgKGEtPnUua2V5X3N0cnVjdC5rZXlfZGVzYykgeworCQkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBrZXlfZGVzYz0iKTsKKwkJCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIGEtPnUua2V5X3N0cnVjdC5rZXlfZGVzYyk7CisJCX0KKwkJYnJlYWs7CisjZW5kaWYKKwl9IC8qIHN3aXRjaCAoYS0+dHlwZSkgKi8KK30KKworLyoqCisgKiBjb21tb25fbHNtX2F1ZGl0IC0gZ2VuZXJpYyBMU00gYXVkaXRpbmcgZnVuY3Rpb24KKyAqIEBhOiAgYXV4aWxpYXJ5IGF1ZGl0IGRhdGEKKyAqCisgKiBzZXR1cCB0aGUgYXVkaXQgYnVmZmVyIGZvciBjb21tb24gc2VjdXJpdHkgaW5mb3JtYXRpb24KKyAqIHVzZXMgY2FsbGJhY2sgdG8gcHJpbnQgTFNNIHNwZWNpZmljIGluZm9ybWF0aW9uCisgKi8KK3ZvaWQgY29tbW9uX2xzbV9hdWRpdChzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKmEpCit7CisJc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWI7CisKKwlpZiAoYSA9PSBOVUxMKQorCQlyZXR1cm47CisJLyogd2UgdXNlIEdGUF9BVE9NSUMgc28gd2Ugd29uJ3Qgc2xlZXAgKi8KKwlhYiA9IGF1ZGl0X2xvZ19zdGFydChjdXJyZW50LT5hdWRpdF9jb250ZXh0LCBHRlBfQVRPTUlDLCBBVURJVF9BVkMpOworCisJaWYgKGFiID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChhLT5sc21fcHJlX2F1ZGl0KQorCQlhLT5sc21fcHJlX2F1ZGl0KGFiLCBhKTsKKworCWR1bXBfY29tbW9uX2F1ZGl0X2RhdGEoYWIsIGEpOworCisJaWYgKGEtPmxzbV9wb3N0X2F1ZGl0KQorCQlhLT5sc21fcG9zdF9hdWRpdChhYiwgYSk7CisKKwlhdWRpdF9sb2dfZW5kKGFiKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3Jvb3RfcGx1Zy5jIGIvc2VjdXJpdHkvcm9vdF9wbHVnLmMKaW5kZXggNDBmYjRmMS4uMmY3ZmZhNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvcm9vdF9wbHVnLmMKKysrIGIvc2VjdXJpdHkvcm9vdF9wbHVnLmMKQEAgLTcxLDE4ICs3MSw2IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2VjdXJpdHlfb3BlcmF0aW9ucyByb290cGx1Z19zZWN1cml0eV9vcHMgPSB7Ci0JLyogVXNlIHRoZSBjYXBhYmlsaXR5IGZ1bmN0aW9ucyBmb3Igc29tZSBvZiB0aGUgaG9va3MgKi8KLQkucHRyYWNlX21heV9hY2Nlc3MgPQkJY2FwX3B0cmFjZV9tYXlfYWNjZXNzLAotCS5wdHJhY2VfdHJhY2VtZSA9CQljYXBfcHRyYWNlX3RyYWNlbWUsCi0JLmNhcGdldCA9CQkJY2FwX2NhcGdldCwKLQkuY2Fwc2V0ID0JCQljYXBfY2Fwc2V0LAotCS5jYXBhYmxlID0JCQljYXBfY2FwYWJsZSwKLQotCS5icHJtX3NldF9jcmVkcyA9CQljYXBfYnBybV9zZXRfY3JlZHMsCi0KLQkudGFza19maXhfc2V0dWlkID0JCWNhcF90YXNrX2ZpeF9zZXR1aWQsCi0JLnRhc2tfcHJjdGwgPQkJCWNhcF90YXNrX3ByY3RsLAotCiAJLmJwcm1fY2hlY2tfc2VjdXJpdHkgPQkJcm9vdHBsdWdfYnBybV9jaGVja19zZWN1cml0eSwKIH07CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlY3VyaXR5LmMgYi9zZWN1cml0eS9zZWN1cml0eS5jCmluZGV4IDUyODQyNTUuLmRjNzY3NGYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY3VyaXR5LmMKKysrIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwpAQCAtMjYsOSArMjYsNiBAQAogCiBzdHJ1Y3Qgc2VjdXJpdHlfb3BlcmF0aW9ucyAqc2VjdXJpdHlfb3BzOwkvKiBJbml0aWFsaXplZCB0byBOVUxMICovCiAKLS8qIGFtb3VudCBvZiB2bSB0byBwcm90ZWN0IGZyb20gdXNlcnNwYWNlIGFjY2VzcyAqLwotdW5zaWduZWQgbG9uZyBtbWFwX21pbl9hZGRyID0gQ09ORklHX1NFQ1VSSVRZX0RFRkFVTFRfTU1BUF9NSU5fQUREUjsKLQogc3RhdGljIGlubGluZSBpbnQgdmVyaWZ5KHN0cnVjdCBzZWN1cml0eV9vcGVyYXRpb25zICpvcHMpCiB7CiAJLyogdmVyaWZ5IHRoZSBzZWN1cml0eV9vcGVyYXRpb25zIHN0cnVjdHVyZSBleGlzdHMgKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCmluZGV4IDdmOWI1ZmEuLmIyYWI2MDggMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9hdmMuYwpAQCAtOTI3LDcgKzkyNyw3IEBACiAJaWYgKGRlbmllZCkgewogCQlpZiAoZmxhZ3MgJiBBVkNfU1RSSUNUKQogCQkJcmMgPSAtRUFDQ0VTOwotCQllbHNlIGlmICghc2VsaW51eF9lbmZvcmNpbmcgfHwgc2VjdXJpdHlfcGVybWlzc2l2ZV9zaWQoc3NpZCkpCisJCWVsc2UgaWYgKCFzZWxpbnV4X2VuZm9yY2luZyB8fCAoYXZkLT5mbGFncyAmIEFWRF9GTEFHU19QRVJNSVNTSVZFKSkKIAkJCWF2Y191cGRhdGVfbm9kZShBVkNfQ0FMTEJBQ0tfR1JBTlQsIHJlcXVlc3RlZCwgc3NpZCwKIAkJCQkJdHNpZCwgdGNsYXNzLCBhdmQtPnNlcW5vKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCmluZGV4IDJmY2FkN2MuLjE5NTkwNmIgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKQEAgLTE5ODAsMTAgKzE5ODAsNiBAQAogCXUzMiB0c2lkLCBzaWQ7CiAJaW50IHJjOwogCi0JcmMgPSBzZWNvbmRhcnlfb3BzLT5zeXNjdGwodGFibGUsIG9wKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQogCXNpZCA9IGN1cnJlbnRfc2lkKCk7CiAKIAlyYyA9IHNlbGludXhfc3lzY3RsX2dldF9zaWQodGFibGUsIChvcCA9PSAwMDAxKSA/CkBAIC0yMzc1LDEwICsyMzcxLDggQEAKIHsKIAljb25zdCBzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSBjdXJyZW50X3NlY3VyaXR5KCk7CiAJc3RydWN0IGl0aW1lcnZhbCBpdGltZXI7Ci0Jc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpwc2lnOwogCXUzMiBvc2lkLCBzaWQ7CiAJaW50IHJjLCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlvc2lkID0gdHNlYy0+b3NpZDsKIAlzaWQgPSB0c2VjLT5zaWQ7CkBAIC0yMzk4LDIyICsyMzkyLDIwIEBACiAJCW1lbXNldCgmaXRpbWVyLCAwLCBzaXplb2YgaXRpbWVyKTsKIAkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKIAkJCWRvX3NldGl0aW1lcihpLCAmaXRpbWVyLCBOVUxMKTsKLQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKIAkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCWZsdXNoX3NpZ25hbF9oYW5kbGVycyhjdXJyZW50LCAxKTsKLQkJc2lnZW1wdHlzZXQoJmN1cnJlbnQtPmJsb2NrZWQpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlpZiAoIShjdXJyZW50LT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpKSB7CisJCQlfX2ZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJCQlmbHVzaF9zaWduYWxfaGFuZGxlcnMoY3VycmVudCwgMSk7CisJCQlzaWdlbXB0eXNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJCX0KIAkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAl9CiAKIAkvKiBXYWtlIHVwIHRoZSBwYXJlbnQgaWYgaXQgaXMgd2FpdGluZyBzbyB0aGF0IGl0IGNhbiByZWNoZWNrCiAJICogd2FpdCBwZXJtaXNzaW9uIHRvIHRoZSBuZXcgdGFzayBTSUQuICovCi0JcmVhZF9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7Ci0JcHNpZyA9IGN1cnJlbnQtPnBhcmVudC0+c2lnaGFuZDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHNpZy0+c2lnbG9jaywgZmxhZ3MpOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY3VycmVudC0+cGFyZW50LT5zaWduYWwtPndhaXRfY2hsZGV4aXQpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaWctPnNpZ2xvY2ssIGZsYWdzKTsKLQlyZWFkX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjdXJyZW50LT5yZWFsX3BhcmVudC0+c2lnbmFsLT53YWl0X2NobGRleGl0KTsKKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiB9CiAKIC8qIHN1cGVyYmxvY2sgc2VjdXJpdHkgb3BlcmF0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL3NlY3VyaXR5LmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaAppbmRleCA1YzM0MzRmLi5jYTgzNTc5IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvc2VjdXJpdHkuaApAQCAtOCwxNCArOCwxMyBAQAogI2lmbmRlZiBfU0VMSU5VWF9TRUNVUklUWV9IXwogI2RlZmluZSBfU0VMSU5VWF9TRUNVUklUWV9IXwogCisjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KICNpbmNsdWRlICJmbGFzay5oIgogCiAjZGVmaW5lIFNFQ1NJRF9OVUxMCQkJMHgwMDAwMDAwMCAvKiB1bnNwZWNpZmllZCBTSUQgKi8KICNkZWZpbmUgU0VDU0lEX1dJTEQJCQkweGZmZmZmZmZmIC8qIHdpbGRjYXJkIFNJRCAqLwogI2RlZmluZSBTRUNDTEFTU19OVUxMCQkJMHgwMDAwIC8qIG5vIGNsYXNzICovCiAKLSNkZWZpbmUgU0VMSU5VWF9NQUdJQyAweGY5N2NmZjhjCi0KIC8qIElkZW50aWZ5IHNwZWNpZmljIHBvbGljeSB2ZXJzaW9uIGNoYW5nZXMgKi8KICNkZWZpbmUgUE9MSUNZREJfVkVSU0lPTl9CQVNFCQkxNQogI2RlZmluZSBQT0xJQ1lEQl9WRVJTSU9OX0JPT0wJCTE2CkBAIC05MSw5ICs5MCwxMSBAQAogCXUzMiBhdWRpdGFsbG93OwogCXUzMiBhdWRpdGRlbnk7CiAJdTMyIHNlcW5vOworCXUzMiBmbGFnczsKIH07CiAKLWludCBzZWN1cml0eV9wZXJtaXNzaXZlX3NpZCh1MzIgc2lkKTsKKy8qIGRlZmluaXRpb25zIG9mIGF2X2RlY2lzaW9uLmZsYWdzICovCisjZGVmaW5lIEFWRF9GTEFHU19QRVJNSVNTSVZFCTB4MDAwMQogCiBpbnQgc2VjdXJpdHlfY29tcHV0ZV9hdih1MzIgc3NpZCwgdTMyIHRzaWQsCiAJdTE2IHRjbGFzcywgdTMyIHJlcXVlc3RlZCwKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYyBiL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYwppbmRleCBjNjg3NWZkLi5kZDdjYzZkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCkBAIC0xMTIsNiArMTEyLDggQEAKIAl7IEFVRElUX0RFTF9SVUxFLAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgfSwKIAl7IEFVRElUX1VTRVIsCQlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfUkVMQVkgICAgfSwKIAl7IEFVRElUX1NJR05BTF9JTkZPLAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfUkVBRCAgICAgfSwKKwl7IEFVRElUX1RSSU0sCQlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfV1JJVEUgICAgfSwKKwl7IEFVRElUX01BS0VfRVFVSVYsCU5FVExJTktfQVVESVRfU09DS0VUX19OTE1TR19XUklURSAgICB9LAogCXsgQVVESVRfVFRZX0dFVCwJTkVUTElOS19BVURJVF9TT0NLRVRfX05MTVNHX1JFQUQgICAgIH0sCiAJeyBBVURJVF9UVFlfU0VULAlORVRMSU5LX0FVRElUX1NPQ0tFVF9fTkxNU0dfVFRZX0FVRElUCX0sCiB9OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggMmQ1MTM2ZS4uYjRmYzUwNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC01MjcsMTAgKzUyNywxMCBAQAogCQlnb3RvIG91dDI7CiAKIAlsZW5ndGggPSBzY25wcmludGYoYnVmLCBTSU1QTEVfVFJBTlNBQ1RJT05fTElNSVQsCi0JCQkgICIleCAleCAleCAleCAldSIsCisJCQkgICIleCAleCAleCAleCAldSAleCIsCiAJCQkgIGF2ZC5hbGxvd2VkLCAweGZmZmZmZmZmLAogCQkJICBhdmQuYXVkaXRhbGxvdywgYXZkLmF1ZGl0ZGVueSwKLQkJCSAgYXZkLnNlcW5vKTsKKwkJCSAgYXZkLnNlcW5vLCBhdmQuZmxhZ3MpOwogb3V0MjoKIAlrZnJlZSh0Y29uKTsKIG91dDoKQEAgLTgwMywxMCArODAzLDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGNvdW50ID4gUEFHRV9TSVpFKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KIAlwYWdlID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCFwYWdlKSB7CiAJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKaW5kZXggZGVlZWM2Yy4uNTAwZTZmNyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYwpAQCAtNDEwLDYgKzQxMCw3IEBACiAJYXZkLT5hdWRpdGFsbG93ID0gMDsKIAlhdmQtPmF1ZGl0ZGVueSA9IDB4ZmZmZmZmZmY7CiAJYXZkLT5zZXFubyA9IGxhdGVzdF9ncmFudGluZzsKKwlhdmQtPmZsYWdzID0gMDsKIAogCS8qCiAJICogQ2hlY2sgZm9yIGFsbCB0aGUgaW52YWxpZCBjYXNlcy4KQEAgLTUyOCwzMSArNTI5LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEdpdmVuIGEgc2lkIGZpbmQgaWYgdGhlIHR5cGUgaGFzIHRoZSBwZXJtaXNzaXZlIGZsYWcgc2V0Ci0gKi8KLWludCBzZWN1cml0eV9wZXJtaXNzaXZlX3NpZCh1MzIgc2lkKQotewotCXN0cnVjdCBjb250ZXh0ICpjb250ZXh0OwotCXUzMiB0eXBlOwotCWludCByYzsKLQotCXJlYWRfbG9jaygmcG9saWN5X3J3bG9jayk7Ci0KLQljb250ZXh0ID0gc2lkdGFiX3NlYXJjaCgmc2lkdGFiLCBzaWQpOwotCUJVR19PTighY29udGV4dCk7Ci0KLQl0eXBlID0gY29udGV4dC0+dHlwZTsKLQkvKgotCSAqIHdlIGFyZSBpbnRlbnRpb25hbGx5IHVzaW5nIHR5cGUgaGVyZSwgbm90IHR5cGUtMSwgdGhlIDB0aCBiaXQgbWF5Ci0JICogc29tZWRheSBpbmRpY2F0ZSB0aGF0IHdlIGFyZSBnbG9iYWxseSBzZXR0aW5nIHBlcm1pc3NpdmUgaW4gcG9saWN5LgotCSAqLwotCXJjID0gZWJpdG1hcF9nZXRfYml0KCZwb2xpY3lkYi5wZXJtaXNzaXZlX21hcCwgdHlwZSk7Ci0KLQlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7Ci0JcmV0dXJuIHJjOwotfQotCiBzdGF0aWMgaW50IHNlY3VyaXR5X3ZhbGlkdHJhbnNfaGFuZGxlX2ZhaWwoc3RydWN0IGNvbnRleHQgKm9jb250ZXh0LAogCQkJCQkgICBzdHJ1Y3QgY29udGV4dCAqbmNvbnRleHQsCiAJCQkJCSAgIHN0cnVjdCBjb250ZXh0ICp0Y29udGV4dCwKQEAgLTc2Nyw2ICs3NDMsMTAgQEAKIAogCXJjID0gY29udGV4dF9zdHJ1Y3RfY29tcHV0ZV9hdihzY29udGV4dCwgdGNvbnRleHQsIHRjbGFzcywKIAkJCQkgICAgICAgcmVxdWVzdGVkLCBhdmQpOworCisJLyogcGVybWlzc2l2ZSBkb21haW4/ICovCisJaWYgKGViaXRtYXBfZ2V0X2JpdCgmcG9saWN5ZGIucGVybWlzc2l2ZV9tYXAsIHNjb250ZXh0LT50eXBlKSkKKwkgICAgYXZkLT5mbGFncyB8PSBBVkRfRkxBR1NfUEVSTUlTU0lWRTsKIG91dDoKIAlyZWFkX3VubG9jaygmcG9saWN5X3J3bG9jayk7CiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2suaCBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKaW5kZXggNDJlZjMxMy4uMjQzYmVjMSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2suaAorKysgYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGxhYmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9sc21fYXVkaXQuaD4KIAogLyoKICAqIFdoeSAyMz8gQ0lQU08gaXMgY29uc3RyYWluZWQgdG8gMzAsIHNvIGEgMzIgYnl0ZSBidWZmZXIgaXMKQEAgLTE3OSw2ICsxODAsMjAgQEAKICNkZWZpbmUgTUFZX05PVAkJMAogCiAvKgorICogTnVtYmVyIG9mIGFjY2VzcyB0eXBlcyB1c2VkIGJ5IFNtYWNrIChyd3hhKQorICovCisjZGVmaW5lIFNNS19OVU1fQUNDRVNTX1RZUEUgNAorCisvKgorICogU21hY2sgYXVkaXQgZGF0YTsgaXMgZW1wdHkgaWYgQ09ORklHX0FVRElUIG5vdCBzZXQKKyAqIHRvIHNhdmUgc29tZSBzdGFjaworICovCitzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8geworI2lmZGVmIENPTkZJR19BVURJVAorCXN0cnVjdCBjb21tb25fYXVkaXRfZGF0YSBhOworI2VuZGlmCit9OworLyoKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gc21hY2tfbHNtLmMKICAqLwogc3RydWN0IGlub2RlX3NtYWNrICpuZXdfaW5vZGVfc21hY2soY2hhciAqKTsKQEAgLTE4Niw4ICsyMDEsOCBAQAogLyoKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gc21hY2tfYWNjZXNzLmMKICAqLwotaW50IHNta19hY2Nlc3MoY2hhciAqLCBjaGFyICosIGludCk7Ci1pbnQgc21rX2N1cmFjYyhjaGFyICosIHUzMik7CitpbnQgc21rX2FjY2VzcyhjaGFyICosIGNoYXIgKiwgaW50LCBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKik7CitpbnQgc21rX2N1cmFjYyhjaGFyICosIHUzMiwgc3RydWN0IHNta19hdWRpdF9pbmZvICopOwogaW50IHNtYWNrX3RvX2NpcHNvKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNtYWNrX2NpcHNvICopOwogdm9pZCBzbWFja19mcm9tX2NpcHNvKHUzMiwgY2hhciAqLCBjaGFyICopOwogY2hhciAqc21hY2tfZnJvbV9zZWNpZChjb25zdCB1MzIpOwpAQCAtMjM3LDQgKzI1Miw5MyBAQAogCXJldHVybiBzaXAtPnNta19pbm9kZTsKIH0KIAorLyoKKyAqIGxvZ2dpbmcgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgU01BQ0tfQVVESVRfREVOSUVEIDB4MQorI2RlZmluZSBTTUFDS19BVURJVF9BQ0NFUFQgMHgyCitleHRlcm4gaW50IGxvZ19wb2xpY3k7CisKK3ZvaWQgc21hY2tfbG9nKGNoYXIgKnN1YmplY3RfbGFiZWwsIGNoYXIgKm9iamVjdF9sYWJlbCwKKwkJaW50IHJlcXVlc3QsCisJCWludCByZXN1bHQsIHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqYXVkaXRkYXRhKTsKKworI2lmZGVmIENPTkZJR19BVURJVAorCisvKgorICogc29tZSBpbmxpbmUgZnVuY3Rpb25zIHRvIHNldCB1cCBhdWRpdCBkYXRhCisgKiB0aGV5IGRvIG5vdGhpbmcgaWYgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbWtfYWRfaW5pdChzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEsIGNvbnN0IGNoYXIgKmZ1bmMsCisJCQkgICAgICAgY2hhciB0eXBlKQoreworCW1lbXNldChhLCAwLCBzaXplb2YoKmEpKTsKKwlhLT5hLnR5cGUgPSB0eXBlOworCWEtPmEuZnVuY3Rpb24gPSBmdW5jOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc21rX2FkX3NldGZpZWxkX3VfdHNrKHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqYSwKKwkJCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sKKwlhLT5hLnUudHNrID0gdDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbWtfYWRfc2V0ZmllbGRfdV9mc19wYXRoX2RlbnRyeShzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEsCisJCQkJCQkgICAgc3RydWN0IGRlbnRyeSAqZCkKK3sKKwlhLT5hLnUuZnMucGF0aC5kZW50cnkgPSBkOworfQorc3RhdGljIGlubGluZSB2b2lkIHNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfbW50KHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqYSwKKwkJCQkJCSBzdHJ1Y3QgdmZzbW91bnQgKm0pCit7CisJYS0+YS51LmZzLnBhdGgubW50ID0gbTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbWtfYWRfc2V0ZmllbGRfdV9mc19pbm9kZShzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEsCisJCQkJCSAgICAgIHN0cnVjdCBpbm9kZSAqaSkKK3sKKwlhLT5hLnUuZnMuaW5vZGUgPSBpOworfQorc3RhdGljIGlubGluZSB2b2lkIHNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGgoc3RydWN0IHNta19hdWRpdF9pbmZvICphLAorCQkJCQkgICAgIHN0cnVjdCBwYXRoIHApCit7CisJYS0+YS51LmZzLnBhdGggPSBwOworfQorc3RhdGljIGlubGluZSB2b2lkIHNta19hZF9zZXRmaWVsZF91X25ldF9zayhzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEsCisJCQkJCSAgICBzdHJ1Y3Qgc29jayAqc2spCit7CisJYS0+YS51Lm5ldC5zayA9IHNrOworfQorCisjZWxzZSAvKiBubyBBVURJVCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc21rX2FkX2luaXQoc3RydWN0IHNta19hdWRpdF9pbmZvICphLCBjb25zdCBjaGFyICpmdW5jLAorCQkJICAgICAgIGNoYXIgdHlwZSkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbWtfYWRfc2V0ZmllbGRfdV90c2soc3RydWN0IHNta19hdWRpdF9pbmZvICphLAorCQkJCQkgc3RydWN0IHRhc2tfc3RydWN0ICp0KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfZGVudHJ5KHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqYSwKKwkJCQkJCSAgICBzdHJ1Y3QgZGVudHJ5ICpkKQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfbW50KHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqYSwKKwkJCQkJCSBzdHJ1Y3QgdmZzbW91bnQgKm0pCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc21rX2FkX3NldGZpZWxkX3VfZnNfaW5vZGUoc3RydWN0IHNta19hdWRpdF9pbmZvICphLAorCQkJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKmkpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aChzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEsCisJCQkJCSAgICAgc3RydWN0IHBhdGggcCkKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbWtfYWRfc2V0ZmllbGRfdV9uZXRfc2soc3RydWN0IHNta19hdWRpdF9pbmZvICphLAorCQkJCQkgICAgc3RydWN0IHNvY2sgKnNrKQoreworfQorI2VuZGlmCisKICNlbmRpZiAgLyogX1NFQ1VSSVRZX1NNQUNLX0ggKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKaW5kZXggYWMwYTI3MC4uNTEzZGMxYSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKQEAgLTU5LDExICs1OSwxOCBAQAogICovCiBzdGF0aWMgdTMyIHNtYWNrX25leHRfc2VjaWQgPSAxMDsKIAorLyoKKyAqIHdoYXQgZXZlbnRzIGRvIHdlIGxvZworICogY2FuIGJlIG92ZXJ3cml0dGVuIGF0IHJ1bi10aW1lIGJ5IC9zbWFjay9sb2dnaW5nCisgKi8KK2ludCBsb2dfcG9saWN5ID0gU01BQ0tfQVVESVRfREVOSUVEOworCiAvKioKICAqIHNta19hY2Nlc3MgLSBkZXRlcm1pbmUgaWYgYSBzdWJqZWN0IGhhcyBhIHNwZWNpZmljIGFjY2VzcyB0byBhbiBvYmplY3QKICAqIEBzdWJqZWN0X2xhYmVsOiBhIHBvaW50ZXIgdG8gdGhlIHN1YmplY3QncyBTbWFjayBsYWJlbAogICogQG9iamVjdF9sYWJlbDogYSBwb2ludGVyIHRvIHRoZSBvYmplY3QncyBTbWFjayBsYWJlbAogICogQHJlcXVlc3Q6IHRoZSBhY2Nlc3MgcmVxdWVzdGVkLCBpbiAiTUFZIiBmb3JtYXQKKyAqIEBhIDogYSBwb2ludGVyIHRvIHRoZSBhdWRpdCBkYXRhCiAgKgogICogVGhpcyBmdW5jdGlvbiBsb29rcyB1cCB0aGUgc3ViamVjdC9vYmplY3QgcGFpciBpbiB0aGUKICAqIGFjY2VzcyBydWxlIGxpc3QgYW5kIHJldHVybnMgMCBpZiB0aGUgYWNjZXNzIGlzIHBlcm1pdHRlZCwKQEAgLTc4LDEwICs4NSwxMiBAQAogICogd2lsbCBiZSBvbiB0aGUgbGlzdCwgc28gY2hlY2tpbmcgdGhlIHBvaW50ZXJzIG1heSBiZSBhIHdvcnRod2hpbGUKICAqIG9wdGltaXphdGlvbi4KICAqLwotaW50IHNta19hY2Nlc3MoY2hhciAqc3ViamVjdF9sYWJlbCwgY2hhciAqb2JqZWN0X2xhYmVsLCBpbnQgcmVxdWVzdCkKK2ludCBzbWtfYWNjZXNzKGNoYXIgKnN1YmplY3RfbGFiZWwsIGNoYXIgKm9iamVjdF9sYWJlbCwgaW50IHJlcXVlc3QsCisJICAgICAgIHN0cnVjdCBzbWtfYXVkaXRfaW5mbyAqYSkKIHsKIAl1MzIgbWF5ID0gTUFZX05PVDsKIAlzdHJ1Y3Qgc21hY2tfcnVsZSAqc3JwOworCWludCByYyA9IDA7CiAKIAkvKgogCSAqIEhhcmRjb2RlZCBjb21wYXJpc29ucy4KQEAgLTg5LDggKzk4LDEwIEBACiAJICogQSBzdGFyIHN1YmplY3QgY2FuJ3QgYWNjZXNzIGFueSBvYmplY3QuCiAJICovCiAJaWYgKHN1YmplY3RfbGFiZWwgPT0gc21hY2tfa25vd25fc3Rhci5zbWtfa25vd24gfHwKLQkgICAgc3RyY21wKHN1YmplY3RfbGFiZWwsIHNtYWNrX2tub3duX3N0YXIuc21rX2tub3duKSA9PSAwKQotCQlyZXR1cm4gLUVBQ0NFUzsKKwkgICAgc3RyY21wKHN1YmplY3RfbGFiZWwsIHNtYWNrX2tub3duX3N0YXIuc21rX2tub3duKSA9PSAwKSB7CisJCXJjID0gLUVBQ0NFUzsKKwkJZ290byBvdXRfYXVkaXQ7CisJfQogCS8qCiAJICogQW4gaW50ZXJuZXQgb2JqZWN0IGNhbiBiZSBhY2Nlc3NlZCBieSBhbnkgc3ViamVjdC4KIAkgKiBUYXNrcyBjYW5ub3QgYmUgYXNzaWduZWQgdGhlIGludGVybmV0IGxhYmVsLgpAQCAtMTAwLDIwICsxMTEsMjAgQEAKIAkgICAgc3ViamVjdF9sYWJlbCA9PSBzbWFja19rbm93bl93ZWIuc21rX2tub3duIHx8CiAJICAgIHN0cmNtcChvYmplY3RfbGFiZWwsIHNtYWNrX2tub3duX3dlYi5zbWtfa25vd24pID09IDAgfHwKIAkgICAgc3RyY21wKHN1YmplY3RfbGFiZWwsIHNtYWNrX2tub3duX3dlYi5zbWtfa25vd24pID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG91dF9hdWRpdDsKIAkvKgogCSAqIEEgc3RhciBvYmplY3QgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSBzdWJqZWN0LgogCSAqLwogCWlmIChvYmplY3RfbGFiZWwgPT0gc21hY2tfa25vd25fc3Rhci5zbWtfa25vd24gfHwKIAkgICAgc3RyY21wKG9iamVjdF9sYWJlbCwgc21hY2tfa25vd25fc3Rhci5zbWtfa25vd24pID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG91dF9hdWRpdDsKIAkvKgogCSAqIEFuIG9iamVjdCBjYW4gYmUgYWNjZXNzZWQgaW4gYW55IHdheSBieSBhIHN1YmplY3QKIAkgKiB3aXRoIHRoZSBzYW1lIGxhYmVsLgogCSAqLwogCWlmIChzdWJqZWN0X2xhYmVsID09IG9iamVjdF9sYWJlbCB8fAogCSAgICBzdHJjbXAoc3ViamVjdF9sYWJlbCwgb2JqZWN0X2xhYmVsKSA9PSAwKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXRfYXVkaXQ7CiAJLyoKIAkgKiBBIGhhdCBzdWJqZWN0IGNhbiByZWFkIGFueSBvYmplY3QuCiAJICogQSBmbG9vciBvYmplY3QgY2FuIGJlIHJlYWQgYnkgYW55IHN1YmplY3QuCkBAIC0xMjEsMTAgKzEzMiwxMCBAQAogCWlmICgocmVxdWVzdCAmIE1BWV9BTllSRUFEKSA9PSByZXF1ZXN0KSB7CiAJCWlmIChvYmplY3RfbGFiZWwgPT0gc21hY2tfa25vd25fZmxvb3Iuc21rX2tub3duIHx8CiAJCSAgICBzdHJjbXAob2JqZWN0X2xhYmVsLCBzbWFja19rbm93bl9mbG9vci5zbWtfa25vd24pID09IDApCi0JCQlyZXR1cm4gMDsKKwkJCWdvdG8gb3V0X2F1ZGl0OwogCQlpZiAoc3ViamVjdF9sYWJlbCA9PSBzbWFja19rbm93bl9oYXQuc21rX2tub3duIHx8CiAJCSAgICBzdHJjbXAoc3ViamVjdF9sYWJlbCwgc21hY2tfa25vd25faGF0LnNta19rbm93bikgPT0gMCkKLQkJCXJldHVybiAwOworCQkJZ290byBvdXRfYXVkaXQ7CiAJfQogCS8qCiAJICogQmV5b25kIGhlcmUgYW4gZXhwbGljaXQgcmVsYXRpb25zaGlwIGlzIHJlcXVpcmVkLgpAQCAtMTQ4LDI4ICsxNTksMzYgQEAKIAkgKiBUaGlzIGlzIGEgYml0IG1hcCBvcGVyYXRpb24uCiAJICovCiAJaWYgKChyZXF1ZXN0ICYgbWF5KSA9PSByZXF1ZXN0KQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXRfYXVkaXQ7CiAKLQlyZXR1cm4gLUVBQ0NFUzsKKwlyYyA9IC1FQUNDRVM7CitvdXRfYXVkaXQ6CisjaWZkZWYgQ09ORklHX0FVRElUCisJaWYgKGEpCisJCXNtYWNrX2xvZyhzdWJqZWN0X2xhYmVsLCBvYmplY3RfbGFiZWwsIHJlcXVlc3QsIHJjLCBhKTsKKyNlbmRpZgorCXJldHVybiByYzsKIH0KIAogLyoqCiAgKiBzbWtfY3VyYWNjIC0gZGV0ZXJtaW5lIGlmIGN1cnJlbnQgaGFzIGEgc3BlY2lmaWMgYWNjZXNzIHRvIGFuIG9iamVjdAogICogQG9ial9sYWJlbDogYSBwb2ludGVyIHRvIHRoZSBvYmplY3QncyBTbWFjayBsYWJlbAogICogQG1vZGU6IHRoZSBhY2Nlc3MgcmVxdWVzdGVkLCBpbiAiTUFZIiBmb3JtYXQKKyAqIEBhIDogY29tbW9uIGF1ZGl0IGRhdGEKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0aGUgY3VycmVudCBzdWJqZWN0IGxhYmVsL29iamVjdCBsYWJlbCBwYWlyCiAgKiBpbiB0aGUgYWNjZXNzIHJ1bGUgbGlzdCBhbmQgcmV0dXJucyAwIGlmIHRoZSBhY2Nlc3MgaXMgcGVybWl0dGVkLAogICogbm9uIHplcm8gb3RoZXJ3aXNlLiBJdCBhbGxvd3MgdGhhdCBjdXJyZW50IG1heSBoYXZlIHRoZSBjYXBhYmlsaXR5CiAgKiB0byBvdmVycmlkZSB0aGUgcnVsZXMuCiAgKi8KLWludCBzbWtfY3VyYWNjKGNoYXIgKm9ial9sYWJlbCwgdTMyIG1vZGUpCitpbnQgc21rX2N1cmFjYyhjaGFyICpvYmpfbGFiZWwsIHUzMiBtb2RlLCBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmEpCiB7CiAJaW50IHJjOworCWNoYXIgKnNwID0gY3VycmVudF9zZWN1cml0eSgpOwogCi0JcmMgPSBzbWtfYWNjZXNzKGN1cnJlbnRfc2VjdXJpdHkoKSwgb2JqX2xhYmVsLCBtb2RlKTsKKwlyYyA9IHNta19hY2Nlc3Moc3AsIG9ial9sYWJlbCwgbW9kZSwgTlVMTCk7CiAJaWYgKHJjID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG91dF9hdWRpdDsKIAogCS8qCiAJICogUmV0dXJuIGlmIGEgc3BlY2lmaWMgbGFiZWwgaGFzIGJlZW4gZGVzaWduYXRlZCBhcyB0aGUKQEAgLTE3NywxNCArMTk2LDEwNSBAQAogCSAqIGhhdmUgdGhhdCBsYWJlbC4KIAkgKi8KIAlpZiAoc21hY2tfb25seWNhcCAhPSBOVUxMICYmIHNtYWNrX29ubHljYXAgIT0gY3VycmVudC0+Y3JlZC0+c2VjdXJpdHkpCi0JCXJldHVybiByYzsKKwkJZ290byBvdXRfYXVkaXQ7CiAKIAlpZiAoY2FwYWJsZShDQVBfTUFDX09WRVJSSURFKSkKIAkJcmV0dXJuIDA7CiAKK291dF9hdWRpdDoKKyNpZmRlZiBDT05GSUdfQVVESVQKKwlpZiAoYSkKKwkJc21hY2tfbG9nKHNwLCBvYmpfbGFiZWwsIG1vZGUsIHJjLCBhKTsKKyNlbmRpZgogCXJldHVybiByYzsKIH0KIAorI2lmZGVmIENPTkZJR19BVURJVAorLyoqCisgKiBzbWFja19zdHJfZnJvbV9wZXJtIDogaGVscGVyIHRvIHRyYW5zYWxhdGUgYW4gaW50IHRvIGEKKyAqIHJlYWRhYmxlIHN0cmluZworICogQHN0cmluZyA6IHRoZSBzdHJpbmcgdG8gZmlsbAorICogQGFjY2VzcyA6IHRoZSBpbnQKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbWFja19zdHJfZnJvbV9wZXJtKGNoYXIgKnN0cmluZywgaW50IGFjY2VzcykKK3sKKwlpbnQgaSA9IDA7CisJaWYgKGFjY2VzcyAmIE1BWV9SRUFEKQorCQlzdHJpbmdbaSsrXSA9ICdyJzsKKwlpZiAoYWNjZXNzICYgTUFZX1dSSVRFKQorCQlzdHJpbmdbaSsrXSA9ICd3JzsKKwlpZiAoYWNjZXNzICYgTUFZX0VYRUMpCisJCXN0cmluZ1tpKytdID0gJ3gnOworCWlmIChhY2Nlc3MgJiBNQVlfQVBQRU5EKQorCQlzdHJpbmdbaSsrXSA9ICdhJzsKKwlzdHJpbmdbaV0gPSAnXDAnOworfQorLyoqCisgKiBzbWFja19sb2dfY2FsbGJhY2sgLSBTTUFDSyBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICogd2lsbCBiZSBjYWxsZWQgYnkgZ2VuZXJpYyBhdWRpdCBjb2RlCisgKiBAYWIgOiB0aGUgYXVkaXRfYnVmZmVyCisgKiBAYSAgOiBhdWRpdF9kYXRhCisgKgorICovCitzdGF0aWMgdm9pZCBzbWFja19sb2dfY2FsbGJhY2soc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsIHZvaWQgKmEpCit7CisJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhICphZCA9IGE7CisJc3RydWN0IHNtYWNrX2F1ZGl0X2RhdGEgKnNhZCA9ICZhZC0+bHNtX3ByaXYuc21hY2tfYXVkaXRfZGF0YTsKKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAibHNtPVNNQUNLIGZuPSVzIGFjdGlvbj0lcyIsIGFkLT5mdW5jdGlvbiwKKwkJCSBzYWQtPnJlc3VsdCA/ICJkZW5pZWQiIDogImdyYW50ZWQiKTsKKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHN1YmplY3Q9Iik7CisJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgc2FkLT5zdWJqZWN0KTsKKwlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIG9iamVjdD0iKTsKKwlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLCBzYWQtPm9iamVjdCk7CisJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiByZXF1ZXN0ZWQ9JXMiLCBzYWQtPnJlcXVlc3QpOworfQorCisvKioKKyAqICBzbWFja19sb2cgLSBBdWRpdCB0aGUgZ3JhbnRpbmcgb3IgZGVuaWFsIG9mIHBlcm1pc3Npb25zLgorICogIEBzdWJqZWN0X2xhYmVsIDogc21hY2sgbGFiZWwgb2YgdGhlIHJlcXVlc3RlcgorICogIEBvYmplY3RfbGFiZWwgIDogc21hY2sgbGFiZWwgb2YgdGhlIG9iamVjdCBiZWluZyBhY2Nlc3NlZAorICogIEByZXF1ZXN0OiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMKKyAqICBAcmVzdWx0OiByZXN1bHQgZnJvbSBzbWtfYWNjZXNzCisgKiAgQGE6ICBhdXhpbGlhcnkgYXVkaXQgZGF0YQorICoKKyAqIEF1ZGl0IHRoZSBncmFudGluZyBvciBkZW5pYWwgb2YgcGVybWlzc2lvbnMgaW4gYWNjb3JkYW5jZQorICogd2l0aCB0aGUgcG9saWN5LgorICovCit2b2lkIHNtYWNrX2xvZyhjaGFyICpzdWJqZWN0X2xhYmVsLCBjaGFyICpvYmplY3RfbGFiZWwsIGludCByZXF1ZXN0LAorCSAgICAgICBpbnQgcmVzdWx0LCBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmFkKQoreworCWNoYXIgcmVxdWVzdF9idWZmZXJbU01LX05VTV9BQ0NFU1NfVFlQRSArIDFdOworCXN0cnVjdCBzbWFja19hdWRpdF9kYXRhICpzYWQ7CisJc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhICphID0gJmFkLT5hOworCisJLyogY2hlY2sgaWYgd2UgaGF2ZSB0byBsb2cgdGhlIGN1cnJlbnQgZXZlbnQgKi8KKwlpZiAocmVzdWx0ICE9IDAgJiYgKGxvZ19wb2xpY3kgJiBTTUFDS19BVURJVF9ERU5JRUQpID09IDApCisJCXJldHVybjsKKwlpZiAocmVzdWx0ID09IDAgJiYgKGxvZ19wb2xpY3kgJiBTTUFDS19BVURJVF9BQ0NFUFQpID09IDApCisJCXJldHVybjsKKworCWlmIChhLT5mdW5jdGlvbiA9PSBOVUxMKQorCQlhLT5mdW5jdGlvbiA9ICJ1bmtub3duIjsKKworCS8qIGVuZCBwcmVwYXJpbmcgdGhlIGF1ZGl0IGRhdGEgKi8KKwlzYWQgPSAmYS0+bHNtX3ByaXYuc21hY2tfYXVkaXRfZGF0YTsKKwlzbWFja19zdHJfZnJvbV9wZXJtKHJlcXVlc3RfYnVmZmVyLCByZXF1ZXN0KTsKKwlzYWQtPnN1YmplY3QgPSBzdWJqZWN0X2xhYmVsOworCXNhZC0+b2JqZWN0ICA9IG9iamVjdF9sYWJlbDsKKwlzYWQtPnJlcXVlc3QgPSByZXF1ZXN0X2J1ZmZlcjsKKwlzYWQtPnJlc3VsdCAgPSByZXN1bHQ7CisJYS0+bHNtX3ByZV9hdWRpdCA9IHNtYWNrX2xvZ19jYWxsYmFjazsKKworCWNvbW1vbl9sc21fYXVkaXQoYSk7Cit9CisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX0FVRElUICovCit2b2lkIHNtYWNrX2xvZyhjaGFyICpzdWJqZWN0X2xhYmVsLCBjaGFyICpvYmplY3RfbGFiZWwsIGludCByZXF1ZXN0LAorICAgICAgICAgICAgICAgaW50IHJlc3VsdCwgc3RydWN0IHNta19hdWRpdF9pbmZvICphZCkKK3sKK30KKyNlbmRpZgorCiBzdGF0aWMgREVGSU5FX01VVEVYKHNtYWNrX2tub3duX2xvY2spOwogCiAvKioKQEAgLTIwOSw3ICszMTksOCBAQAogCQlpZiAoZm91bmQpCiAJCQlzbWFja1tpXSA9ICdcMCc7CiAJCWVsc2UgaWYgKGkgPj0gbGVuIHx8IHN0cmluZ1tpXSA+ICd+JyB8fCBzdHJpbmdbaV0gPD0gJyAnIHx8Ci0JCQkgc3RyaW5nW2ldID09ICcvJykgeworCQkJIHN0cmluZ1tpXSA9PSAnLycgfHwgc3RyaW5nW2ldID09ICciJyB8fAorCQkJIHN0cmluZ1tpXSA9PSAnXFwnIHx8IHN0cmluZ1tpXSA9PSAnXCcnKSB7CiAJCQlzbWFja1tpXSA9ICdcMCc7CiAJCQlmb3VuZCA9IDE7CiAJCX0gZWxzZQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMgYi9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwppbmRleCA5OGIzMTk1Li4wMDIzMTgyIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja19sc20uYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPG5ldC9uZXRsYWJlbC5oPgogI2luY2x1ZGUgPG5ldC9jaXBzb19pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KLQogI2luY2x1ZGUgInNtYWNrLmgiCiAKICNkZWZpbmUgdGFza19zZWN1cml0eSh0YXNrKQkodGFza19jcmVkX3h4eCgodGFzayksIHNlY3VyaXR5KSkKQEAgLTEwMywxNCArMTAyLDI0IEBACiBzdGF0aWMgaW50IHNtYWNrX3B0cmFjZV9tYXlfYWNjZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY3RwLCB1bnNpZ25lZCBpbnQgbW9kZSkKIHsKIAlpbnQgcmM7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOworCWNoYXIgKnNwLCAqdHNwOwogCiAJcmMgPSBjYXBfcHRyYWNlX21heV9hY2Nlc3MoY3RwLCBtb2RlKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBzbWtfYWNjZXNzKGN1cnJlbnRfc2VjdXJpdHkoKSwgdGFza19zZWN1cml0eShjdHApLCBNQVlfUkVBRFdSSVRFKTsKKwlzcCA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKKwl0c3AgPSB0YXNrX3NlY3VyaXR5KGN0cCk7CisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfVEFTSyk7CisJc21rX2FkX3NldGZpZWxkX3VfdHNrKCZhZCwgY3RwKTsKKworCS8qIHdlIHdvbid0IGxvZyBoZXJlLCBiZWNhdXNlIHJjIGNhbiBiZSBvdmVycmlkZW4gKi8KKwlyYyA9IHNta19hY2Nlc3Moc3AsIHRzcCwgTUFZX1JFQURXUklURSwgTlVMTCk7CiAJaWYgKHJjICE9IDAgJiYgY2FwYWJsZShDQVBfTUFDX09WRVJSSURFKSkKLQkJcmV0dXJuIDA7CisJCXJjID0gMDsKKworCXNtYWNrX2xvZyhzcCwgdHNwLCBNQVlfUkVBRFdSSVRFLCByYywgJmFkKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTEyNSwxNCArMTM0LDI0IEBACiBzdGF0aWMgaW50IHNtYWNrX3B0cmFjZV90cmFjZW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHRwKQogewogCWludCByYzsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisJY2hhciAqc3AsICp0c3A7CiAKIAlyYyA9IGNhcF9wdHJhY2VfdHJhY2VtZShwdHApOwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHNta19hY2Nlc3ModGFza19zZWN1cml0eShwdHApLCBjdXJyZW50X3NlY3VyaXR5KCksIE1BWV9SRUFEV1JJVEUpOworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOworCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHB0cCk7CisKKwlzcCA9IGN1cnJlbnRfc2VjdXJpdHkoKTsKKwl0c3AgPSB0YXNrX3NlY3VyaXR5KHB0cCk7CisJLyogd2Ugd29uJ3QgbG9nIGhlcmUsIGJlY2F1c2UgcmMgY2FuIGJlIG92ZXJyaWRlbiAqLworCXJjID0gc21rX2FjY2Vzcyh0c3AsIHNwLCBNQVlfUkVBRFdSSVRFLCBOVUxMKTsKIAlpZiAocmMgIT0gMCAmJiBoYXNfY2FwYWJpbGl0eShwdHAsIENBUF9NQUNfT1ZFUlJJREUpKQotCQlyZXR1cm4gMDsKKwkJcmMgPSAwOworCisJc21hY2tfbG9nKHRzcCwgc3AsIE1BWV9SRUFEV1JJVEUsIHJjLCAmYWQpOwogCXJldHVybiByYzsKIH0KIApAQCAtMzI3LDggKzM0NiwxNCBAQAogc3RhdGljIGludCBzbWFja19zYl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBzdXBlcmJsb2NrX3NtYWNrICpzYnAgPSBkZW50cnktPmRfc2ItPnNfc2VjdXJpdHk7CisJaW50IHJjOworCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKIAotCXJldHVybiBzbWtfY3VyYWNjKHNicC0+c21rX2Zsb29yLCBNQVlfUkVBRCk7CisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfRlMpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfZGVudHJ5KCZhZCwgZGVudHJ5KTsKKworCXJjID0gc21rX2N1cmFjYyhzYnAtPnNta19mbG9vciwgTUFZX1JFQUQsICZhZCk7CisJcmV0dXJuIHJjOwogfQogCiAvKioKQEAgLTM0Niw4ICszNzEsMTIgQEAKIAkJCSAgY2hhciAqdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc3VwZXJibG9ja19zbWFjayAqc2JwID0gcGF0aC0+bW50LT5tbnRfc2ItPnNfc2VjdXJpdHk7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCi0JcmV0dXJuIHNta19jdXJhY2Moc2JwLT5zbWtfZmxvb3IsIE1BWV9XUklURSk7CisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfRlMpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGgoJmFkLCAqcGF0aCk7CisKKwlyZXR1cm4gc21rX2N1cmFjYyhzYnAtPnNta19mbG9vciwgTUFZX1dSSVRFLCAmYWQpOwogfQogCiAvKioKQEAgLTM2MSwxMCArMzkwLDE0IEBACiBzdGF0aWMgaW50IHNtYWNrX3NiX3Vtb3VudChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzdXBlcmJsb2NrX3NtYWNrICpzYnA7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOworCisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfRlMpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfZGVudHJ5KCZhZCwgbW50LT5tbnRfbW91bnRwb2ludCk7CisJc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aF9tbnQoJmFkLCBtbnQpOwogCiAJc2JwID0gbW50LT5tbnRfc2ItPnNfc2VjdXJpdHk7Ci0KLQlyZXR1cm4gc21rX2N1cmFjYyhzYnAtPnNta19mbG9vciwgTUFZX1dSSVRFKTsKKwlyZXR1cm4gc21rX2N1cmFjYyhzYnAtPnNta19mbG9vciwgTUFZX1dSSVRFLCAmYWQpOwogfQogCiAvKgpAQCAtNDQxLDE1ICs0NzQsMjAgQEAKIHN0YXRpYyBpbnQgc21hY2tfaW5vZGVfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCSAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewotCWludCByYzsKIAljaGFyICppc3A7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOworCWludCByYzsKKworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0ZTKTsKKwlzbWtfYWRfc2V0ZmllbGRfdV9mc19wYXRoX2RlbnRyeSgmYWQsIG9sZF9kZW50cnkpOwogCiAJaXNwID0gc21rX29mX2lub2RlKG9sZF9kZW50cnktPmRfaW5vZGUpOwotCXJjID0gc21rX2N1cmFjYyhpc3AsIE1BWV9XUklURSk7CisJcmMgPSBzbWtfY3VyYWNjKGlzcCwgTUFZX1dSSVRFLCAmYWQpOwogCiAJaWYgKHJjID09IDAgJiYgbmV3X2RlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKSB7CiAJCWlzcCA9IHNta19vZl9pbm9kZShuZXdfZGVudHJ5LT5kX2lub2RlKTsKLQkJcmMgPSBzbWtfY3VyYWNjKGlzcCwgTUFZX1dSSVRFKTsKKwkJc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aF9kZW50cnkoJmFkLCBuZXdfZGVudHJ5KTsKKwkJcmMgPSBzbWtfY3VyYWNjKGlzcCwgTUFZX1dSSVRFLCAmYWQpOwogCX0KIAogCXJldHVybiByYzsKQEAgLTQ2NiwxOCArNTA0LDI0IEBACiBzdGF0aWMgaW50IHNtYWNrX2lub2RlX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBpbm9kZSAqaXAgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCWludCByYzsKIAorCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0ZTKTsKKwlzbWtfYWRfc2V0ZmllbGRfdV9mc19wYXRoX2RlbnRyeSgmYWQsIGRlbnRyeSk7CisKIAkvKgogCSAqIFlvdSBuZWVkIHdyaXRlIGFjY2VzcyB0byB0aGUgdGhpbmcgeW91J3JlIHVubGlua2luZwogCSAqLwotCXJjID0gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoaXApLCBNQVlfV1JJVEUpOwotCWlmIChyYyA9PSAwKQorCXJjID0gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoaXApLCBNQVlfV1JJVEUsICZhZCk7CisJaWYgKHJjID09IDApIHsKIAkJLyoKIAkJICogWW91IGFsc28gbmVlZCB3cml0ZSBhY2Nlc3MgdG8gdGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5CiAJCSAqLwotCQlyYyA9IHNta19jdXJhY2Moc21rX29mX2lub2RlKGRpciksIE1BWV9XUklURSk7Ci0KKwkJc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aF9kZW50cnkoJmFkLCBOVUxMKTsKKwkJc21rX2FkX3NldGZpZWxkX3VfZnNfaW5vZGUoJmFkLCBkaXIpOworCQlyYyA9IHNta19jdXJhY2Moc21rX29mX2lub2RlKGRpciksIE1BWV9XUklURSwgJmFkKTsKKwl9CiAJcmV0dXJuIHJjOwogfQogCkBAIC00OTEsMTcgKzUzNSwyNCBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX2lub2RlX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCWludCByYzsKIAorCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0ZTKTsKKwlzbWtfYWRfc2V0ZmllbGRfdV9mc19wYXRoX2RlbnRyeSgmYWQsIGRlbnRyeSk7CisKIAkvKgogCSAqIFlvdSBuZWVkIHdyaXRlIGFjY2VzcyB0byB0aGUgdGhpbmcgeW91J3JlIHJlbW92aW5nCiAJICovCi0JcmMgPSBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShkZW50cnktPmRfaW5vZGUpLCBNQVlfV1JJVEUpOwotCWlmIChyYyA9PSAwKQorCXJjID0gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoZGVudHJ5LT5kX2lub2RlKSwgTUFZX1dSSVRFLCAmYWQpOworCWlmIChyYyA9PSAwKSB7CiAJCS8qCiAJCSAqIFlvdSBhbHNvIG5lZWQgd3JpdGUgYWNjZXNzIHRvIHRoZSBjb250YWluaW5nIGRpcmVjdG9yeQogCQkgKi8KLQkJcmMgPSBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShkaXIpLCBNQVlfV1JJVEUpOworCQlzbWtfYWRfc2V0ZmllbGRfdV9mc19wYXRoX2RlbnRyeSgmYWQsIE5VTEwpOworCQlzbWtfYWRfc2V0ZmllbGRfdV9mc19pbm9kZSgmYWQsIGRpcik7CisJCXJjID0gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoZGlyKSwgTUFZX1dSSVRFLCAmYWQpOworCX0KIAogCXJldHVybiByYzsKIH0KQEAgLTUyNSwxNSArNTc2LDE5IEBACiB7CiAJaW50IHJjOwogCWNoYXIgKmlzcDsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisKKwlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9GUyk7CisJc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aF9kZW50cnkoJmFkLCBvbGRfZGVudHJ5KTsKIAogCWlzcCA9IHNta19vZl9pbm9kZShvbGRfZGVudHJ5LT5kX2lub2RlKTsKLQlyYyA9IHNta19jdXJhY2MoaXNwLCBNQVlfUkVBRFdSSVRFKTsKKwlyYyA9IHNta19jdXJhY2MoaXNwLCBNQVlfUkVBRFdSSVRFLCAmYWQpOwogCiAJaWYgKHJjID09IDAgJiYgbmV3X2RlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKSB7CiAJCWlzcCA9IHNta19vZl9pbm9kZShuZXdfZGVudHJ5LT5kX2lub2RlKTsKLQkJcmMgPSBzbWtfY3VyYWNjKGlzcCwgTUFZX1JFQURXUklURSk7CisJCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfZGVudHJ5KCZhZCwgbmV3X2RlbnRyeSk7CisJCXJjID0gc21rX2N1cmFjYyhpc3AsIE1BWV9SRUFEV1JJVEUsICZhZCk7CiAJfQotCiAJcmV0dXJuIHJjOwogfQogCkBAIC01NDgsMTMgKzYwMywxNSBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCiB7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCS8qCiAJICogTm8gcGVybWlzc2lvbiB0byBjaGVjay4gRXhpc3RlbmNlIHRlc3QuIFl1cCwgaXQncyB0aGVyZS4KIAkgKi8KIAlpZiAobWFzayA9PSAwKQogCQlyZXR1cm4gMDsKLQotCXJldHVybiBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShpbm9kZSksIG1hc2spOworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0ZTKTsKKwlzbWtfYWRfc2V0ZmllbGRfdV9mc19pbm9kZSgmYWQsIGlub2RlKTsKKwlyZXR1cm4gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoaW5vZGUpLCBtYXNrLCAmYWQpOwogfQogCiAvKioKQEAgLTU2NiwxMyArNjIzLDE2IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfaW5vZGVfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqaWF0dHIpCiB7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCS8qCiAJICogTmVlZCB0byBhbGxvdyBmb3IgY2xlYXJpbmcgdGhlIHNldHVpZCBiaXQuCiAJICovCiAJaWYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfRk9SQ0UpCiAJCXJldHVybiAwOworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0ZTKTsKKwlzbWtfYWRfc2V0ZmllbGRfdV9mc19wYXRoX2RlbnRyeSgmYWQsIGRlbnRyeSk7CiAKLQlyZXR1cm4gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoZGVudHJ5LT5kX2lub2RlKSwgTUFZX1dSSVRFKTsKKwlyZXR1cm4gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoZGVudHJ5LT5kX2lub2RlKSwgTUFZX1dSSVRFLCAmYWQpOwogfQogCiAvKioKQEAgLTU4NCw3ICs2NDQsMTIgQEAKICAqLwogc3RhdGljIGludCBzbWFja19pbm9kZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0JcmV0dXJuIHNta19jdXJhY2Moc21rX29mX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSksIE1BWV9SRUFEKTsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisKKwlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9GUyk7CisJc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aF9kZW50cnkoJmFkLCBkZW50cnkpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfbW50KCZhZCwgbW50KTsKKwlyZXR1cm4gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoZGVudHJ5LT5kX2lub2RlKSwgTUFZX1JFQUQsICZhZCk7CiB9CiAKIC8qKgpAQCAtNjAyLDYgKzY2Nyw3IEBACiBzdGF0aWMgaW50IHNtYWNrX2lub2RlX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQljb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAJaW50IHJjID0gMDsKIAogCWlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDSykgPT0gMCB8fApAQCAtNjE5LDggKzY4NSwxMSBAQAogCX0gZWxzZQogCQlyYyA9IGNhcF9pbm9kZV9zZXR4YXR0cihkZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CiAKKwlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9GUyk7CisJc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aF9kZW50cnkoJmFkLCBkZW50cnkpOworCiAJaWYgKHJjID09IDApCi0JCXJjID0gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoZGVudHJ5LT5kX2lub2RlKSwgTUFZX1dSSVRFKTsKKwkJcmMgPSBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShkZW50cnktPmRfaW5vZGUpLCBNQVlfV1JJVEUsICZhZCk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC02NzIsNyArNzQxLDEyIEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfaW5vZGVfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lKQogewotCXJldHVybiBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShkZW50cnktPmRfaW5vZGUpLCBNQVlfUkVBRCk7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOworCisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfRlMpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfZGVudHJ5KCZhZCwgZGVudHJ5KTsKKworCXJldHVybiBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShkZW50cnktPmRfaW5vZGUpLCBNQVlfUkVBRCwgJmFkKTsKIH0KIAogLyoKQEAgLTY4Niw2ICs3NjAsNyBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX2lub2RlX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSkKIHsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAJaW50IHJjID0gMDsKIAogCWlmIChzdHJjbXAobmFtZSwgWEFUVFJfTkFNRV9TTUFDSykgPT0gMCB8fApAQCAtNjk2LDggKzc3MSwxMCBAQAogCX0gZWxzZQogCQlyYyA9IGNhcF9pbm9kZV9yZW1vdmV4YXR0cihkZW50cnksIG5hbWUpOwogCisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfRlMpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfZGVudHJ5KCZhZCwgZGVudHJ5KTsKIAlpZiAocmMgPT0gMCkKLQkJcmMgPSBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShkZW50cnktPmRfaW5vZGUpLCBNQVlfV1JJVEUpOworCQlyYyA9IHNta19jdXJhY2Moc21rX29mX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSksIE1BWV9XUklURSwgJmFkKTsKIAogCXJldHVybiByYzsKIH0KQEAgLTg1NiwxMiArOTMzLDE2IEBACiAJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJaW50IHJjID0gMDsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisKKwlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9GUyk7CisJc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aCgmYWQsIGZpbGUtPmZfcGF0aCk7CiAKIAlpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpCi0JCXJjID0gc21rX2N1cmFjYyhmaWxlLT5mX3NlY3VyaXR5LCBNQVlfV1JJVEUpOworCQlyYyA9IHNta19jdXJhY2MoZmlsZS0+Zl9zZWN1cml0eSwgTUFZX1dSSVRFLCAmYWQpOwogCiAJaWYgKHJjID09IDAgJiYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1JFQUQpKQotCQlyYyA9IHNta19jdXJhY2MoZmlsZS0+Zl9zZWN1cml0eSwgTUFZX1JFQUQpOworCQlyYyA9IHNta19jdXJhY2MoZmlsZS0+Zl9zZWN1cml0eSwgTUFZX1JFQUQsICZhZCk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC04NzUsNyArOTU2LDExIEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfZmlsZV9sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kKQogewotCXJldHVybiBzbWtfY3VyYWNjKGZpbGUtPmZfc2VjdXJpdHksIE1BWV9XUklURSk7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOworCisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfRlMpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGhfZGVudHJ5KCZhZCwgZmlsZS0+Zl9wYXRoLmRlbnRyeSk7CisJcmV0dXJuIHNta19jdXJhY2MoZmlsZS0+Zl9zZWN1cml0eSwgTUFZX1dSSVRFLCAmYWQpOwogfQogCiAvKioKQEAgLTg4OSw4ICs5NzQsMTIgQEAKIHN0YXRpYyBpbnQgc21hY2tfZmlsZV9mY250bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGFyZykKIHsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAJaW50IHJjOwogCisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfRlMpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGgoJmFkLCBmaWxlLT5mX3BhdGgpOworCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEZfRFVQRkQ6CiAJY2FzZSBGX0dFVEZEOgpAQCAtODk4LDcgKzk4Nyw3IEBACiAJY2FzZSBGX0dFVExLOgogCWNhc2UgRl9HRVRPV046CiAJY2FzZSBGX0dFVFNJRzoKLQkJcmMgPSBzbWtfY3VyYWNjKGZpbGUtPmZfc2VjdXJpdHksIE1BWV9SRUFEKTsKKwkJcmMgPSBzbWtfY3VyYWNjKGZpbGUtPmZfc2VjdXJpdHksIE1BWV9SRUFELCAmYWQpOwogCQlicmVhazsKIAljYXNlIEZfU0VURkQ6CiAJY2FzZSBGX1NFVEZMOgpAQCAtOTA2LDEwICs5OTUsMTAgQEAKIAljYXNlIEZfU0VUTEtXOgogCWNhc2UgRl9TRVRPV046CiAJY2FzZSBGX1NFVFNJRzoKLQkJcmMgPSBzbWtfY3VyYWNjKGZpbGUtPmZfc2VjdXJpdHksIE1BWV9XUklURSk7CisJCXJjID0gc21rX2N1cmFjYyhmaWxlLT5mX3NlY3VyaXR5LCBNQVlfV1JJVEUsICZhZCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJjID0gc21rX2N1cmFjYyhmaWxlLT5mX3NlY3VyaXR5LCBNQVlfUkVBRFdSSVRFKTsKKwkJcmMgPSBzbWtfY3VyYWNjKGZpbGUtPmZfc2VjdXJpdHksIE1BWV9SRUFEV1JJVEUsICZhZCk7CiAJfQogCiAJcmV0dXJuIHJjOwpAQCAtOTQ0LDE0ICsxMDMzLDIxIEBACiB7CiAJc3RydWN0IGZpbGUgKmZpbGU7CiAJaW50IHJjOworCWNoYXIgKnRzcCA9IHRzay0+Y3JlZC0+c2VjdXJpdHk7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCiAJLyoKIAkgKiBzdHJ1Y3QgZm93bl9zdHJ1Y3QgaXMgbmV2ZXIgb3V0c2lkZSB0aGUgY29udGV4dCBvZiBhIHN0cnVjdCBmaWxlCiAJICovCiAJZmlsZSA9IGNvbnRhaW5lcl9vZihmb3duLCBzdHJ1Y3QgZmlsZSwgZl9vd25lcik7Ci0JcmMgPSBzbWtfYWNjZXNzKGZpbGUtPmZfc2VjdXJpdHksIHRzay0+Y3JlZC0+c2VjdXJpdHksIE1BWV9XUklURSk7CisJLyogd2UgZG9uJ3QgbG9nIGhlcmUgYXMgcmMgY2FuIGJlIG92ZXJyaWRlbiAqLworCXJjID0gc21rX2FjY2VzcyhmaWxlLT5mX3NlY3VyaXR5LCB0c3AsIE1BWV9XUklURSwgTlVMTCk7CiAJaWYgKHJjICE9IDAgJiYgaGFzX2NhcGFiaWxpdHkodHNrLCBDQVBfTUFDX09WRVJSSURFKSkKLQkJcmV0dXJuIDA7CisJCXJjID0gMDsKKworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOworCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHRzayk7CisJc21hY2tfbG9nKGZpbGUtPmZfc2VjdXJpdHksIHRzcCwgTUFZX1dSSVRFLCByYywgJmFkKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTk2NCw3ICsxMDYwLDEwIEBACiBzdGF0aWMgaW50IHNtYWNrX2ZpbGVfcmVjZWl2ZShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpbnQgbWF5ID0gMDsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAKKwlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9UQVNLKTsKKwlzbWtfYWRfc2V0ZmllbGRfdV9mc19wYXRoKCZhZCwgZmlsZS0+Zl9wYXRoKTsKIAkvKgogCSAqIFRoaXMgY29kZSByZWxpZXMgb24gYml0bWFza3MuCiAJICovCkBAIC05NzMsNyArMTA3Miw3IEBACiAJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQogCQltYXkgfD0gTUFZX1dSSVRFOwogCi0JcmV0dXJuIHNta19jdXJhY2MoZmlsZS0+Zl9zZWN1cml0eSwgbWF5KTsKKwlyZXR1cm4gc21rX2N1cmFjYyhmaWxlLT5mX3NlY3VyaXR5LCBtYXksICZhZCk7CiB9CiAKIC8qCkBAIC0xMDUzLDYgKzExNTIsMjIgQEAKIH0KIAogLyoqCisgKiBzbWtfY3VyYWNjX29uX3Rhc2sgLSBoZWxwZXIgdG8gbG9nIHRhc2sgcmVsYXRlZCBhY2Nlc3MKKyAqIEBwOiB0aGUgdGFzayBvYmplY3QKKyAqIEBhY2Nlc3MgOiB0aGUgYWNjZXNzIHJlcXVlc3RlZAorICoKKyAqIFJldHVybiAwIGlmIGFjY2VzcyBpcyBwZXJtaXR0ZWQKKyAqLworc3RhdGljIGludCBzbWtfY3VyYWNjX29uX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgYWNjZXNzKQoreworCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKKworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOworCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHApOworCXJldHVybiBzbWtfY3VyYWNjKHRhc2tfc2VjdXJpdHkocCksIGFjY2VzcywgJmFkKTsKK30KKworLyoqCiAgKiBzbWFja190YXNrX3NldHBnaWQgLSBTbWFjayBjaGVjayBvbiBzZXR0aW5nIHBnaWQKICAqIEBwOiB0aGUgdGFzayBvYmplY3QKICAqIEBwZ2lkOiB1bnVzZWQKQEAgLTEwNjEsNyArMTE3Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfdGFza19zZXRwZ2lkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgcGlkX3QgcGdpZCkKIHsKLQlyZXR1cm4gc21rX2N1cmFjYyh0YXNrX3NlY3VyaXR5KHApLCBNQVlfV1JJVEUpOworCXJldHVybiBzbWtfY3VyYWNjX29uX3Rhc2socCwgTUFZX1dSSVRFKTsKIH0KIAogLyoqCkBAIC0xMDcyLDcgKzExODcsNyBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrX3Rhc2tfZ2V0cGdpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JcmV0dXJuIHNta19jdXJhY2ModGFza19zZWN1cml0eShwKSwgTUFZX1JFQUQpOworCXJldHVybiBzbWtfY3VyYWNjX29uX3Rhc2socCwgTUFZX1JFQUQpOwogfQogCiAvKioKQEAgLTEwODMsNyArMTE5OCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfdGFza19nZXRzaWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXJldHVybiBzbWtfY3VyYWNjKHRhc2tfc2VjdXJpdHkocCksIE1BWV9SRUFEKTsKKwlyZXR1cm4gc21rX2N1cmFjY19vbl90YXNrKHAsIE1BWV9SRUFEKTsKIH0KIAogLyoqCkBAIC0xMTExLDcgKzEyMjYsNyBAQAogCiAJcmMgPSBjYXBfdGFza19zZXRuaWNlKHAsIG5pY2UpOwogCWlmIChyYyA9PSAwKQotCQlyYyA9IHNta19jdXJhY2ModGFza19zZWN1cml0eShwKSwgTUFZX1dSSVRFKTsKKwkJcmMgPSBzbWtfY3VyYWNjX29uX3Rhc2socCwgTUFZX1dSSVRFKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTExMjgsNyArMTI0Myw3IEBACiAKIAlyYyA9IGNhcF90YXNrX3NldGlvcHJpbyhwLCBpb3ByaW8pOwogCWlmIChyYyA9PSAwKQotCQlyYyA9IHNta19jdXJhY2ModGFza19zZWN1cml0eShwKSwgTUFZX1dSSVRFKTsKKwkJcmMgPSBzbWtfY3VyYWNjX29uX3Rhc2socCwgTUFZX1dSSVRFKTsKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTExNDAsNyArMTI1NSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfdGFza19nZXRpb3ByaW8oc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXJldHVybiBzbWtfY3VyYWNjKHRhc2tfc2VjdXJpdHkocCksIE1BWV9SRUFEKTsKKwlyZXR1cm4gc21rX2N1cmFjY19vbl90YXNrKHAsIE1BWV9SRUFEKTsKIH0KIAogLyoqCkBAIC0xMTU4LDcgKzEyNzMsNyBAQAogCiAJcmMgPSBjYXBfdGFza19zZXRzY2hlZHVsZXIocCwgcG9saWN5LCBscCk7CiAJaWYgKHJjID09IDApCi0JCXJjID0gc21rX2N1cmFjYyh0YXNrX3NlY3VyaXR5KHApLCBNQVlfV1JJVEUpOworCQlyYyA9IHNta19jdXJhY2Nfb25fdGFzayhwLCBNQVlfV1JJVEUpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTE3MCw3ICsxMjg1LDcgQEAKICAqLwogc3RhdGljIGludCBzbWFja190YXNrX2dldHNjaGVkdWxlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7Ci0JcmV0dXJuIHNta19jdXJhY2ModGFza19zZWN1cml0eShwKSwgTUFZX1JFQUQpOworCXJldHVybiBzbWtfY3VyYWNjX29uX3Rhc2socCwgTUFZX1JFQUQpOwogfQogCiAvKioKQEAgLTExODEsNyArMTI5Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfdGFza19tb3ZlbWVtb3J5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQlyZXR1cm4gc21rX2N1cmFjYyh0YXNrX3NlY3VyaXR5KHApLCBNQVlfV1JJVEUpOworCXJldHVybiBzbWtfY3VyYWNjX29uX3Rhc2socCwgTUFZX1dSSVRFKTsKIH0KIAogLyoqCkBAIC0xMTk5LDE4ICsxMzE0LDIzIEBACiBzdGF0aWMgaW50IHNtYWNrX3Rhc2tfa2lsbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzaWdpbmZvICppbmZvLAogCQkJICAgaW50IHNpZywgdTMyIHNlY2lkKQogeworCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKKworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOworCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHApOwogCS8qCiAJICogU2VuZGluZyBhIHNpZ25hbCByZXF1aXJlcyB0aGF0IHRoZSBzZW5kZXIKIAkgKiBjYW4gd3JpdGUgdGhlIHJlY2VpdmVyLgogCSAqLwogCWlmIChzZWNpZCA9PSAwKQotCQlyZXR1cm4gc21rX2N1cmFjYyh0YXNrX3NlY3VyaXR5KHApLCBNQVlfV1JJVEUpOworCQlyZXR1cm4gc21rX2N1cmFjYyh0YXNrX3NlY3VyaXR5KHApLCBNQVlfV1JJVEUsICZhZCk7CiAJLyoKIAkgKiBJZiB0aGUgc2VjaWQgaXNuJ3QgMCB3ZSdyZSBkZWFsaW5nIHdpdGggc29tZSBVU0IgSU8KIAkgKiBzcGVjaWZpYyBiZWhhdmlvci4gVGhpcyBpcyBub3QgY2xlYW4uIEZvciBvbmUgdGhpbmcKIAkgKiB3ZSBjYW4ndCB0YWtlIHByaXZpbGVnZSBpbnRvIGFjY291bnQuCiAJICovCi0JcmV0dXJuIHNta19hY2Nlc3Moc21hY2tfZnJvbV9zZWNpZChzZWNpZCksIHRhc2tfc2VjdXJpdHkocCksIE1BWV9XUklURSk7CisJcmV0dXJuIHNta19hY2Nlc3Moc21hY2tfZnJvbV9zZWNpZChzZWNpZCksIHRhc2tfc2VjdXJpdHkocCksCisJCQkgIE1BWV9XUklURSwgJmFkKTsKIH0KIAogLyoqCkBAIC0xMjIxLDExICsxMzQxLDE1IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfdGFza193YWl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisJY2hhciAqc3AgPSBjdXJyZW50X3NlY3VyaXR5KCk7CisJY2hhciAqdHNwID0gdGFza19zZWN1cml0eShwKTsKIAlpbnQgcmM7CiAKLQlyYyA9IHNta19hY2Nlc3MoY3VycmVudF9zZWN1cml0eSgpLCB0YXNrX3NlY3VyaXR5KHApLCBNQVlfV1JJVEUpOworCS8qIHdlIGRvbid0IGxvZyBoZXJlLCB3ZSBjYW4gYmUgb3ZlcnJpZGVuICovCisJcmMgPSBzbWtfYWNjZXNzKHNwLCB0c3AsIE1BWV9XUklURSwgTlVMTCk7CiAJaWYgKHJjID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG91dF9sb2c7CiAKIAkvKgogCSAqIEFsbG93IHRoZSBvcGVyYXRpb24gdG8gc3VjY2VlZCBpZiBlaXRoZXIgdGFzawpAQCAtMTIzOSw4ICsxMzYzLDEyIEBACiAJICogdGhlIHNtYWNrIHZhbHVlLgogCSAqLwogCWlmIChjYXBhYmxlKENBUF9NQUNfT1ZFUlJJREUpIHx8IGhhc19jYXBhYmlsaXR5KHAsIENBUF9NQUNfT1ZFUlJJREUpKQotCQlyZXR1cm4gMDsKLQorCQlyYyA9IDA7CisJLyogd2UgbG9nIG9ubHkgaWYgd2UgZGlkbid0IGdldCBvdmVycmlkZW4gKi8KKyBvdXRfbG9nOgorCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX1RBU0spOworCXNta19hZF9zZXRmaWVsZF91X3RzaygmYWQsIHApOworCXNtYWNrX2xvZyhzcCwgdHNwLCBNQVlfV1JJVEUsIHJjLCAmYWQpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTQ1NiwxMiArMTU4NCwxOSBAQAogCWludCBza19sYmw7CiAJY2hhciAqaG9zdHNwOwogCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcCA9IHNrLT5za19zZWN1cml0eTsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJaG9zdHNwID0gc21hY2tfaG9zdF9sYWJlbChzYXApOwogCWlmIChob3N0c3AgIT0gTlVMTCkgewogCQlza19sYmwgPSBTTUFDS19VTkxBQkVMRURfU09DS0VUOwotCQlyYyA9IHNta19hY2Nlc3Moc3NwLT5zbWtfb3V0LCBob3N0c3AsIE1BWV9XUklURSk7CisjaWZkZWYgQ09ORklHX0FVRElUCisJCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX05FVCk7CisJCWFkLmEudS5uZXQuZmFtaWx5ID0gc2FwLT5zaW5fZmFtaWx5OworCQlhZC5hLnUubmV0LmRwb3J0ID0gc2FwLT5zaW5fcG9ydDsKKwkJYWQuYS51Lm5ldC52NGluZm8uZGFkZHIgPSBzYXAtPnNpbl9hZGRyLnNfYWRkcjsKKyNlbmRpZgorCQlyYyA9IHNta19hY2Nlc3Moc3NwLT5zbWtfb3V0LCBob3N0c3AsIE1BWV9XUklURSwgJmFkKTsKIAl9IGVsc2UgewogCQlza19sYmwgPSBTTUFDS19DSVBTT19TT0NLRVQ7CiAJCXJjID0gMDsKQEAgLTE2NTcsNiArMTc5MiwyNSBAQAogfQogCiAvKioKKyAqIHNta19jdXJhY2Nfc2htIDogY2hlY2sgaWYgY3VycmVudCBoYXMgYWNjZXNzIG9uIHNobQorICogQHNocCA6IHRoZSBvYmplY3QKKyAqIEBhY2Nlc3MgOiBhY2Nlc3MgcmVxdWVzdGVkCisgKgorICogUmV0dXJucyAwIGlmIGN1cnJlbnQgaGFzIHRoZSByZXF1ZXN0ZWQgYWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IHNta19jdXJhY2Nfc2htKHN0cnVjdCBzaG1pZF9rZXJuZWwgKnNocCwgaW50IGFjY2VzcykKK3sKKwljaGFyICpzc3AgPSBzbWFja19vZl9zaG0oc2hwKTsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CisKKyNpZmRlZiBDT05GSUdfQVVESVQKKwlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9JUEMpOworCWFkLmEudS5pcGNfaWQgPSBzaHAtPnNobV9wZXJtLmlkOworI2VuZGlmCisJcmV0dXJuIHNta19jdXJhY2Moc3NwLCBhY2Nlc3MsICZhZCk7Cit9CisKKy8qKgogICogc21hY2tfc2htX2Fzc29jaWF0ZSAtIFNtYWNrIGFjY2VzcyBjaGVjayBmb3Igc2htCiAgKiBAc2hwOiB0aGUgb2JqZWN0CiAgKiBAc2htZmxnOiBhY2Nlc3MgcmVxdWVzdGVkCkBAIC0xNjY1LDExICsxODE5LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfc2htX2Fzc29jaWF0ZShzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAsIGludCBzaG1mbGcpCiB7Ci0JY2hhciAqc3NwID0gc21hY2tfb2Zfc2htKHNocCk7CiAJaW50IG1heTsKIAogCW1heSA9IHNtYWNrX2ZsYWdzX3RvX21heShzaG1mbGcpOwotCXJldHVybiBzbWtfY3VyYWNjKHNzcCwgbWF5KTsKKwlyZXR1cm4gc21rX2N1cmFjY19zaG0oc2hwLCBtYXkpOwogfQogCiAvKioKQEAgLTE2ODEsNyArMTgzNCw2IEBACiAgKi8KIHN0YXRpYyBpbnQgc21hY2tfc2htX3NobWN0bChzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAsIGludCBjbWQpCiB7Ci0JY2hhciAqc3NwOwogCWludCBtYXk7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMTcwNCw5ICsxODU2LDcgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0KLQlzc3AgPSBzbWFja19vZl9zaG0oc2hwKTsKLQlyZXR1cm4gc21rX2N1cmFjYyhzc3AsIG1heSk7CisJcmV0dXJuIHNta19jdXJhY2Nfc2htKHNocCwgbWF5KTsKIH0KIAogLyoqCkBAIC0xNzIwLDExICsxODcwLDEwIEBACiBzdGF0aWMgaW50IHNtYWNrX3NobV9zaG1hdChzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAsIGNoYXIgX191c2VyICpzaG1hZGRyLAogCQkJICAgaW50IHNobWZsZykKIHsKLQljaGFyICpzc3AgPSBzbWFja19vZl9zaG0oc2hwKTsKIAlpbnQgbWF5OwogCiAJbWF5ID0gc21hY2tfZmxhZ3NfdG9fbWF5KHNobWZsZyk7Ci0JcmV0dXJuIHNta19jdXJhY2Moc3NwLCBtYXkpOworCXJldHVybiBzbWtfY3VyYWNjX3NobShzaHAsIG1heSk7CiB9CiAKIC8qKgpAQCAtMTc2Niw2ICsxOTE1LDI1IEBACiB9CiAKIC8qKgorICogc21rX2N1cmFjY19zZW0gOiBjaGVjayBpZiBjdXJyZW50IGhhcyBhY2Nlc3Mgb24gc2VtCisgKiBAc21hIDogdGhlIG9iamVjdAorICogQGFjY2VzcyA6IGFjY2VzcyByZXF1ZXN0ZWQKKyAqCisgKiBSZXR1cm5zIDAgaWYgY3VycmVudCBoYXMgdGhlIHJlcXVlc3RlZCBhY2Nlc3MsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgc21rX2N1cmFjY19zZW0oc3RydWN0IHNlbV9hcnJheSAqc21hLCBpbnQgYWNjZXNzKQoreworCWNoYXIgKnNzcCA9IHNtYWNrX29mX3NlbShzbWEpOworCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKKworI2lmZGVmIENPTkZJR19BVURJVAorCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX0lQQyk7CisJYWQuYS51LmlwY19pZCA9IHNtYS0+c2VtX3Blcm0uaWQ7CisjZW5kaWYKKwlyZXR1cm4gc21rX2N1cmFjYyhzc3AsIGFjY2VzcywgJmFkKTsKK30KKworLyoqCiAgKiBzbWFja19zZW1fYXNzb2NpYXRlIC0gU21hY2sgYWNjZXNzIGNoZWNrIGZvciBzZW0KICAqIEBzbWE6IHRoZSBvYmplY3QKICAqIEBzZW1mbGc6IGFjY2VzcyByZXF1ZXN0ZWQKQEAgLTE3NzQsMTEgKzE5NDIsMTAgQEAKICAqLwogc3RhdGljIGludCBzbWFja19zZW1fYXNzb2NpYXRlKHN0cnVjdCBzZW1fYXJyYXkgKnNtYSwgaW50IHNlbWZsZykKIHsKLQljaGFyICpzc3AgPSBzbWFja19vZl9zZW0oc21hKTsKIAlpbnQgbWF5OwogCiAJbWF5ID0gc21hY2tfZmxhZ3NfdG9fbWF5KHNlbWZsZyk7Ci0JcmV0dXJuIHNta19jdXJhY2Moc3NwLCBtYXkpOworCXJldHVybiBzbWtfY3VyYWNjX3NlbShzbWEsIG1heSk7CiB9CiAKIC8qKgpAQCAtMTc5MCw3ICsxOTU3LDYgQEAKICAqLwogc3RhdGljIGludCBzbWFja19zZW1fc2VtY3RsKHN0cnVjdCBzZW1fYXJyYXkgKnNtYSwgaW50IGNtZCkKIHsKLQljaGFyICpzc3A7CiAJaW50IG1heTsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC0xODE5LDggKzE5ODUsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzc3AgPSBzbWFja19vZl9zZW0oc21hKTsKLQlyZXR1cm4gc21rX2N1cmFjYyhzc3AsIG1heSk7CisJcmV0dXJuIHNta19jdXJhY2Nfc2VtKHNtYSwgbWF5KTsKIH0KIAogLyoqCkBAIC0xODM3LDkgKzIwMDIsNyBAQAogc3RhdGljIGludCBzbWFja19zZW1fc2Vtb3Aoc3RydWN0IHNlbV9hcnJheSAqc21hLCBzdHJ1Y3Qgc2VtYnVmICpzb3BzLAogCQkJICAgdW5zaWduZWQgbnNvcHMsIGludCBhbHRlcikKIHsKLQljaGFyICpzc3AgPSBzbWFja19vZl9zZW0oc21hKTsKLQotCXJldHVybiBzbWtfY3VyYWNjKHNzcCwgTUFZX1JFQURXUklURSk7CisJcmV0dXJuIHNta19jdXJhY2Nfc2VtKHNtYSwgTUFZX1JFQURXUklURSk7CiB9CiAKIC8qKgpAQCAtMTg4MSw2ICsyMDQ0LDI1IEBACiB9CiAKIC8qKgorICogc21rX2N1cmFjY19tc3EgOiBoZWxwZXIgdG8gY2hlY2sgaWYgY3VycmVudCBoYXMgYWNjZXNzIG9uIG1zcQorICogQG1zcSA6IHRoZSBtc3EKKyAqIEBhY2Nlc3MgOiBhY2Nlc3MgcmVxdWVzdGVkCisgKgorICogcmV0dXJuIDAgaWYgY3VycmVudCBoYXMgYWNjZXNzLCBlcnJvciBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBzbWtfY3VyYWNjX21zcShzdHJ1Y3QgbXNnX3F1ZXVlICptc3EsIGludCBhY2Nlc3MpCit7CisJY2hhciAqbXNwID0gc21hY2tfb2ZfbXNxKG1zcSk7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOworCisjaWZkZWYgQ09ORklHX0FVRElUCisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfSVBDKTsKKwlhZC5hLnUuaXBjX2lkID0gbXNxLT5xX3Blcm0uaWQ7CisjZW5kaWYKKwlyZXR1cm4gc21rX2N1cmFjYyhtc3AsIGFjY2VzcywgJmFkKTsKK30KKworLyoqCiAgKiBzbWFja19tc2dfcXVldWVfYXNzb2NpYXRlIC0gU21hY2sgYWNjZXNzIGNoZWNrIGZvciBtc2dfcXVldWUKICAqIEBtc3E6IHRoZSBvYmplY3QKICAqIEBtc3FmbGc6IGFjY2VzcyByZXF1ZXN0ZWQKQEAgLTE4ODksMTEgKzIwNzEsMTAgQEAKICAqLwogc3RhdGljIGludCBzbWFja19tc2dfcXVldWVfYXNzb2NpYXRlKHN0cnVjdCBtc2dfcXVldWUgKm1zcSwgaW50IG1zcWZsZykKIHsKLQljaGFyICptc3AgPSBzbWFja19vZl9tc3EobXNxKTsKIAlpbnQgbWF5OwogCiAJbWF5ID0gc21hY2tfZmxhZ3NfdG9fbWF5KG1zcWZsZyk7Ci0JcmV0dXJuIHNta19jdXJhY2MobXNwLCBtYXkpOworCXJldHVybiBzbWtfY3VyYWNjX21zcShtc3EsIG1heSk7CiB9CiAKIC8qKgpAQCAtMTkwNSw3ICsyMDg2LDYgQEAKICAqLwogc3RhdGljIGludCBzbWFja19tc2dfcXVldWVfbXNnY3RsKHN0cnVjdCBtc2dfcXVldWUgKm1zcSwgaW50IGNtZCkKIHsKLQljaGFyICptc3A7CiAJaW50IG1heTsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC0xOTI3LDggKzIxMDcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQltc3AgPSBzbWFja19vZl9tc3EobXNxKTsKLQlyZXR1cm4gc21rX2N1cmFjYyhtc3AsIG1heSk7CisJcmV0dXJuIHNta19jdXJhY2NfbXNxKG1zcSwgbWF5KTsKIH0KIAogLyoqCkBAIC0xOTQyLDExICsyMTIxLDEwIEBACiBzdGF0aWMgaW50IHNtYWNrX21zZ19xdWV1ZV9tc2dzbmQoc3RydWN0IG1zZ19xdWV1ZSAqbXNxLCBzdHJ1Y3QgbXNnX21zZyAqbXNnLAogCQkJCSAgaW50IG1zcWZsZykKIHsKLQljaGFyICptc3AgPSBzbWFja19vZl9tc3EobXNxKTsKLQlpbnQgcmM7CisJaW50IG1heTsKIAotCXJjID0gc21hY2tfZmxhZ3NfdG9fbWF5KG1zcWZsZyk7Ci0JcmV0dXJuIHNta19jdXJhY2MobXNwLCByYyk7CisJbWF5ID0gc21hY2tfZmxhZ3NfdG9fbWF5KG1zcWZsZyk7CisJcmV0dXJuIHNta19jdXJhY2NfbXNxKG1zcSwgbWF5KTsKIH0KIAogLyoqCkBAIC0xOTYyLDkgKzIxNDAsNyBAQAogc3RhdGljIGludCBzbWFja19tc2dfcXVldWVfbXNncmN2KHN0cnVjdCBtc2dfcXVldWUgKm1zcSwgc3RydWN0IG1zZ19tc2cgKm1zZywKIAkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LCBsb25nIHR5cGUsIGludCBtb2RlKQogewotCWNoYXIgKm1zcCA9IHNtYWNrX29mX21zcShtc3EpOwotCi0JcmV0dXJuIHNta19jdXJhY2MobXNwLCBNQVlfUkVBRFdSSVRFKTsKKwlyZXR1cm4gc21rX2N1cmFjY19tc3EobXNxLCBNQVlfUkVBRFdSSVRFKTsKIH0KIAogLyoqCkBAIC0xOTc3LDEwICsyMTUzLDE0IEBACiBzdGF0aWMgaW50IHNtYWNrX2lwY19wZXJtaXNzaW9uKHN0cnVjdCBrZXJuX2lwY19wZXJtICppcHAsIHNob3J0IGZsYWcpCiB7CiAJY2hhciAqaXNwID0gaXBwLT5zZWN1cml0eTsKLQlpbnQgbWF5OworCWludCBtYXkgPSBzbWFja19mbGFnc190b19tYXkoZmxhZyk7CisJc3RydWN0IHNta19hdWRpdF9pbmZvIGFkOwogCi0JbWF5ID0gc21hY2tfZmxhZ3NfdG9fbWF5KGZsYWcpOwotCXJldHVybiBzbWtfY3VyYWNjKGlzcCwgbWF5KTsKKyNpZmRlZiBDT05GSUdfQVVESVQKKwlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9JUEMpOworCWFkLmEudS5pcGNfaWQgPSBpcHAtPmlkOworI2VuZGlmCisJcmV0dXJuIHNta19jdXJhY2MoaXNwLCBtYXksICZhZCk7CiB9CiAKIC8qKgpAQCAtMjIzOSw4ICsyNDE5LDEyIEBACiB7CiAJc3RydWN0IGlub2RlICpzcCA9IFNPQ0tfSU5PREUoc29jayk7CiAJc3RydWN0IGlub2RlICpvcCA9IFNPQ0tfSU5PREUob3RoZXIpOworCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKIAotCXJldHVybiBzbWtfYWNjZXNzKHNta19vZl9pbm9kZShzcCksIHNta19vZl9pbm9kZShvcCksIE1BWV9SRUFEV1JJVEUpOworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX05FVCk7CisJc21rX2FkX3NldGZpZWxkX3VfbmV0X3NrKCZhZCwgb3RoZXItPnNrKTsKKwlyZXR1cm4gc21rX2FjY2VzcyhzbWtfb2ZfaW5vZGUoc3ApLCBzbWtfb2ZfaW5vZGUob3ApLAorCQkJCSBNQVlfUkVBRFdSSVRFLCAmYWQpOwogfQogCiAvKioKQEAgLTIyNTUsOCArMjQzOSwxMSBAQAogewogCXN0cnVjdCBpbm9kZSAqc3AgPSBTT0NLX0lOT0RFKHNvY2spOwogCXN0cnVjdCBpbm9kZSAqb3AgPSBTT0NLX0lOT0RFKG90aGVyKTsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAKLQlyZXR1cm4gc21rX2FjY2VzcyhzbWtfb2ZfaW5vZGUoc3ApLCBzbWtfb2ZfaW5vZGUob3ApLCBNQVlfV1JJVEUpOworCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX05FVCk7CisJc21rX2FkX3NldGZpZWxkX3VfbmV0X3NrKCZhZCwgb3RoZXItPnNrKTsKKwlyZXR1cm4gc21rX2FjY2VzcyhzbWtfb2ZfaW5vZGUoc3ApLCBzbWtfb2ZfaW5vZGUob3ApLCBNQVlfV1JJVEUsICZhZCk7CiB9CiAKIC8qKgpAQCAtMjM3MSw3ICsyNTU4LDcgQEAKIAljaGFyIHNtYWNrW1NNS19MQUJFTExFTl07CiAJY2hhciAqY3NwOwogCWludCByYzsKLQorCXN0cnVjdCBzbWtfYXVkaXRfaW5mbyBhZDsKIAlpZiAoc2stPnNrX2ZhbWlseSAhPSBQRl9JTkVUICYmIHNrLT5za19mYW1pbHkgIT0gUEZfSU5FVDYpCiAJCXJldHVybiAwOwogCkBAIC0yMzg5LDEzICsyNTc2LDE5IEBACiAKIAluZXRsYmxfc2VjYXR0cl9kZXN0cm95KCZzZWNhdHRyKTsKIAorI2lmZGVmIENPTkZJR19BVURJVAorCXNta19hZF9pbml0KCZhZCwgX19mdW5jX18sIExTTV9BVURJVF9EQVRBX05FVCk7CisJYWQuYS51Lm5ldC5mYW1pbHkgPSBzay0+c2tfZmFtaWx5OworCWFkLmEudS5uZXQubmV0aWYgPSBza2ItPmlpZjsKKwlpcHY0X3NrYl90b19hdWRpdGRhdGEoc2tiLCAmYWQuYSwgTlVMTCk7CisjZW5kaWYKIAkvKgogCSAqIFJlY2VpdmluZyBhIHBhY2tldCByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBlbmQKIAkgKiBiZSBhYmxlIHRvIHdyaXRlIGhlcmUuIFJlYWQgYWNjZXNzIGlzIG5vdCByZXF1aXJlZC4KIAkgKiBUaGlzIGlzIHRoZSBzaW1wbGlzdCBwb3NzaWJsZSBzZWN1cml0eSBtb2RlbAogCSAqIGZvciBuZXR3b3JraW5nLgogCSAqLwotCXJjID0gc21rX2FjY2Vzcyhjc3AsIHNzcC0+c21rX2luLCBNQVlfV1JJVEUpOworCXJjID0gc21rX2FjY2Vzcyhjc3AsIHNzcC0+c21rX2luLCBNQVlfV1JJVEUsICZhZCk7CiAJaWYgKHJjICE9IDApCiAJCW5ldGxibF9za2J1ZmZfZXJyKHNrYiwgcmMsIDApOwogCXJldHVybiByYzsKQEAgLTI1MjQsNiArMjcxNyw3IEBACiAJc3RydWN0IGlwaGRyICpoZHI7CiAJY2hhciBzbWFja1tTTUtfTEFCRUxMRU5dOwogCWludCByYzsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAKIAkvKiBoYW5kbGUgbWFwcGVkIElQdjQgcGFja2V0cyBhcnJpdmluZyB2aWEgSVB2NiBzb2NrZXRzICovCiAJaWYgKGZhbWlseSA9PSBQRl9JTkVUNiAmJiBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKQEAgLTI1MzcsMTEgKzI3MzEsMTcgQEAKIAkJc3RybmNweShzbWFjaywgc21hY2tfa25vd25faHVoLnNta19rbm93biwgU01LX01BWExFTik7CiAJbmV0bGJsX3NlY2F0dHJfZGVzdHJveSgmc2VjYXR0cik7CiAKKyNpZmRlZiBDT05GSUdfQVVESVQKKwlzbWtfYWRfaW5pdCgmYWQsIF9fZnVuY19fLCBMU01fQVVESVRfREFUQV9ORVQpOworCWFkLmEudS5uZXQuZmFtaWx5ID0gZmFtaWx5OworCWFkLmEudS5uZXQubmV0aWYgPSBza2ItPmlpZjsKKwlpcHY0X3NrYl90b19hdWRpdGRhdGEoc2tiLCAmYWQuYSwgTlVMTCk7CisjZW5kaWYKIAkvKgogCSAqIFJlY2VpdmluZyBhIHBhY2tldCByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBlbmQgYmUgYWJsZSB0byB3cml0ZQogCSAqIGhlcmUuIFJlYWQgYWNjZXNzIGlzIG5vdCByZXF1aXJlZC4KIAkgKi8KLQlyYyA9IHNta19hY2Nlc3Moc21hY2ssIHNzcC0+c21rX2luLCBNQVlfV1JJVEUpOworCXJjID0gc21rX2FjY2VzcyhzbWFjaywgc3NwLT5zbWtfaW4sIE1BWV9XUklURSwgJmFkKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCkBAIC0yNjQzLDYgKzI4NDMsNyBAQAogCQkJCWNvbnN0IHN0cnVjdCBjcmVkICpjcmVkLCBrZXlfcGVybV90IHBlcm0pCiB7CiAJc3RydWN0IGtleSAqa2V5cDsKKwlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7CiAKIAlrZXlwID0ga2V5X3JlZl90b19wdHIoa2V5X3JlZik7CiAJaWYgKGtleXAgPT0gTlVMTCkKQEAgLTI2NTgsOCArMjg1OSwxMyBAQAogCSAqLwogCWlmIChjcmVkLT5zZWN1cml0eSA9PSBOVUxMKQogCQlyZXR1cm4gLUVBQ0NFUzsKLQotCXJldHVybiBzbWtfYWNjZXNzKGNyZWQtPnNlY3VyaXR5LCBrZXlwLT5zZWN1cml0eSwgTUFZX1JFQURXUklURSk7CisjaWZkZWYgQ09ORklHX0FVRElUCisJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfS0VZKTsKKwlhZC5hLnUua2V5X3N0cnVjdC5rZXkgPSBrZXlwLT5zZXJpYWw7CisJYWQuYS51LmtleV9zdHJ1Y3Qua2V5X2Rlc2MgPSBrZXlwLT5kZXNjcmlwdGlvbjsKKyNlbmRpZgorCXJldHVybiBzbWtfYWNjZXNzKGNyZWQtPnNlY3VyaXR5LCBrZXlwLT5zZWN1cml0eSwKKwkJCQkgTUFZX1JFQURXUklURSwgJmFkKTsKIH0KICNlbmRpZiAvKiBDT05GSUdfS0VZUyAqLwogCkBAIC0yODI4LDE1ICszMDM0LDcgQEAKIAogCS5wdHJhY2VfbWF5X2FjY2VzcyA9CQlzbWFja19wdHJhY2VfbWF5X2FjY2VzcywKIAkucHRyYWNlX3RyYWNlbWUgPQkJc21hY2tfcHRyYWNlX3RyYWNlbWUsCi0JLmNhcGdldCA9IAkJCWNhcF9jYXBnZXQsCi0JLmNhcHNldCA9IAkJCWNhcF9jYXBzZXQsCi0JLmNhcGFibGUgPSAJCQljYXBfY2FwYWJsZSwKIAkuc3lzbG9nID0gCQkJc21hY2tfc3lzbG9nLAotCS5zZXR0aW1lID0gCQkJY2FwX3NldHRpbWUsCi0JLnZtX2Vub3VnaF9tZW1vcnkgPSAJCWNhcF92bV9lbm91Z2hfbWVtb3J5LAotCi0JLmJwcm1fc2V0X2NyZWRzID0gCQljYXBfYnBybV9zZXRfY3JlZHMsCi0JLmJwcm1fc2VjdXJlZXhlYyA9IAkJY2FwX2Jwcm1fc2VjdXJlZXhlYywKIAogCS5zYl9hbGxvY19zZWN1cml0eSA9IAkJc21hY2tfc2JfYWxsb2Nfc2VjdXJpdHksCiAJLnNiX2ZyZWVfc2VjdXJpdHkgPSAJCXNtYWNrX3NiX2ZyZWVfc2VjdXJpdHksCkBAIC0yODYwLDggKzMwNTgsNiBAQAogCS5pbm9kZV9wb3N0X3NldHhhdHRyID0gCQlzbWFja19pbm9kZV9wb3N0X3NldHhhdHRyLAogCS5pbm9kZV9nZXR4YXR0ciA9IAkJc21hY2tfaW5vZGVfZ2V0eGF0dHIsCiAJLmlub2RlX3JlbW92ZXhhdHRyID0gCQlzbWFja19pbm9kZV9yZW1vdmV4YXR0ciwKLQkuaW5vZGVfbmVlZF9raWxscHJpdiA9CQljYXBfaW5vZGVfbmVlZF9raWxscHJpdiwKLQkuaW5vZGVfa2lsbHByaXYgPQkJY2FwX2lub2RlX2tpbGxwcml2LAogCS5pbm9kZV9nZXRzZWN1cml0eSA9IAkJc21hY2tfaW5vZGVfZ2V0c2VjdXJpdHksCiAJLmlub2RlX3NldHNlY3VyaXR5ID0gCQlzbWFja19pbm9kZV9zZXRzZWN1cml0eSwKIAkuaW5vZGVfbGlzdHNlY3VyaXR5ID0gCQlzbWFja19pbm9kZV9saXN0c2VjdXJpdHksCkBAIC0yODgyLDcgKzMwNzgsNiBAQAogCS5jcmVkX2NvbW1pdCA9CQkJc21hY2tfY3JlZF9jb21taXQsCiAJLmtlcm5lbF9hY3RfYXMgPQkJc21hY2tfa2VybmVsX2FjdF9hcywKIAkua2VybmVsX2NyZWF0ZV9maWxlc19hcyA9CXNtYWNrX2tlcm5lbF9jcmVhdGVfZmlsZXNfYXMsCi0JLnRhc2tfZml4X3NldHVpZCA9CQljYXBfdGFza19maXhfc2V0dWlkLAogCS50YXNrX3NldHBnaWQgPSAJCXNtYWNrX3Rhc2tfc2V0cGdpZCwKIAkudGFza19nZXRwZ2lkID0gCQlzbWFja190YXNrX2dldHBnaWQsCiAJLnRhc2tfZ2V0c2lkID0gCQkJc21hY2tfdGFza19nZXRzaWQsCkBAIC0yODk2LDcgKzMwOTEsNiBAQAogCS50YXNrX2tpbGwgPSAJCQlzbWFja190YXNrX2tpbGwsCiAJLnRhc2tfd2FpdCA9IAkJCXNtYWNrX3Rhc2tfd2FpdCwKIAkudGFza190b19pbm9kZSA9IAkJc21hY2tfdGFza190b19pbm9kZSwKLQkudGFza19wcmN0bCA9CQkJY2FwX3Rhc2tfcHJjdGwsCiAKIAkuaXBjX3Blcm1pc3Npb24gPSAJCXNtYWNrX2lwY19wZXJtaXNzaW9uLAogCS5pcGNfZ2V0c2VjaWQgPQkJCXNtYWNrX2lwY19nZXRzZWNpZCwKQEAgLTI5MjMsOSArMzExNyw2IEBACiAJLnNlbV9zZW1jdGwgPSAJCQlzbWFja19zZW1fc2VtY3RsLAogCS5zZW1fc2Vtb3AgPSAJCQlzbWFja19zZW1fc2Vtb3AsCiAKLQkubmV0bGlua19zZW5kID0JCQljYXBfbmV0bGlua19zZW5kLAotCS5uZXRsaW5rX3JlY3YgPSAJCWNhcF9uZXRsaW5rX3JlY3YsCi0KIAkuZF9pbnN0YW50aWF0ZSA9IAkJc21hY2tfZF9pbnN0YW50aWF0ZSwKIAogCS5nZXRwcm9jYXR0ciA9IAkJCXNtYWNrX2dldHByb2NhdHRyLApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCmluZGV4IGUwM2E3ZTEuLmY4M2E4MDkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAlTTUtfQU1CSUVOVAk9IDcsCS8qIGludGVybmV0IGFtYmllbnQgbGFiZWwgKi8KIAlTTUtfTkVUTEJMQUREUgk9IDgsCS8qIHNpbmdsZSBsYWJlbCBob3N0cyAqLwogCVNNS19PTkxZQ0FQCT0gOSwJLyogdGhlIG9ubHkgImNhcGFibGUiIGxhYmVsICovCisJU01LX0xPR0dJTkcJPSAxMCwJLyogbG9nZ2luZyAqLwogfTsKIAogLyoKQEAgLTczNCw4ICs3MzUsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JbSA9IGxpc3RfZW50cnkocmN1X2RlcmVmZXJlbmNlKHNta19uZXRsYmxhZGRyX2xpc3QubmV4dCksCi0JCQkgc3RydWN0IHNta19uZXRsYmxhZGRyLCBsaXN0KTsKKwltID0gbGlzdF9lbnRyeV9yY3Uoc21rX25ldGxibGFkZHJfbGlzdC5uZXh0LAorCQkJICAgc3RydWN0IHNta19uZXRsYmxhZGRyLCBsaXN0KTsKIAogCS8qIHRoZSBjb21wYXJpc29uICc+JyBpcyBhIGJpdCBoYWNreSwgYnV0IHdvcmtzICovCiAJaWYgKG5ldy0+c21rX21hc2suc19hZGRyID4gbS0+c21rX21hc2suc19hZGRyKSB7CkBAIC03NDgsOCArNzQ5LDggQEAKIAkJCWxpc3RfYWRkX3JjdSgmbmV3LT5saXN0LCAmbS0+bGlzdCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJbV9uZXh0ID0gbGlzdF9lbnRyeShyY3VfZGVyZWZlcmVuY2UobS0+bGlzdC5uZXh0KSwKLQkJCQkgc3RydWN0IHNta19uZXRsYmxhZGRyLCBsaXN0KTsKKwkJbV9uZXh0ID0gbGlzdF9lbnRyeV9yY3UobS0+bGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3Qgc21rX25ldGxibGFkZHIsIGxpc3QpOwogCQlpZiAobmV3LT5zbWtfbWFzay5zX2FkZHIgPiBtX25leHQtPnNta19tYXNrLnNfYWRkcikgewogCQkJbGlzdF9hZGRfcmN1KCZuZXctPmxpc3QsICZtLT5saXN0KTsKIAkJCXJldHVybjsKQEAgLTc3NSw3ICs3NzYsNyBAQAogCXN0cnVjdCBzb2NrYWRkcl9pbiBuZXduYW1lOwogCWNoYXIgc21hY2tbU01LX0xBQkVMTEVOXTsKIAljaGFyICpzcDsKLQljaGFyIGRhdGFbU01LX05FVExCTEFERFJNQVhdOworCWNoYXIgZGF0YVtTTUtfTkVUTEJMQUREUk1BWCArIDFdOwogCWNoYXIgKmhvc3QgPSAoY2hhciAqKSZuZXduYW1lLnNpbl9hZGRyLnNfYWRkcjsKIAlpbnQgcmM7CiAJc3RydWN0IG5ldGxibF9hdWRpdCBhdWRpdF9pbmZvOwpAQCAtMTE5Miw2ICsxMTkzLDY5IEBACiB9OwogCiAvKioKKyAqIHNta19yZWFkX2xvZ2dpbmcgLSByZWFkKCkgZm9yIC9zbWFjay9sb2dnaW5nCisgKiBAZmlscDogZmlsZSBwb2ludGVyLCBub3QgYWN0dWFsbHkgdXNlZAorICogQGJ1Zjogd2hlcmUgdG8gcHV0IHRoZSByZXN1bHQKKyAqIEBjbjogbWF4aW11bSB0byBzZW5kIGFsb25nCisgKiBAcHBvczogd2hlcmUgdG8gc3RhcnQKKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIG9yIGVycm9yIGNvZGUsIGFzIGFwcHJvcHJpYXRlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNta19yZWFkX2xvZ2dpbmcoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciB0ZW1wWzMyXTsKKwlzc2l6ZV90IHJjOworCisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAwOworCisJc3ByaW50Zih0ZW1wLCAiJWRcbiIsIGxvZ19wb2xpY3kpOworCXJjID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgdGVtcCwgc3RybGVuKHRlbXApKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogc21rX3dyaXRlX2xvZ2dpbmcgLSB3cml0ZSgpIGZvciAvc21hY2svbG9nZ2luZworICogQGZpbGU6IGZpbGUgcG9pbnRlciwgbm90IGFjdHVhbGx5IHVzZWQKKyAqIEBidWY6IHdoZXJlIHRvIGdldCB0aGUgZGF0YSBmcm9tCisgKiBAY291bnQ6IGJ5dGVzIHNlbnQKKyAqIEBwcG9zOiB3aGVyZSB0byBzdGFydAorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IgZXJyb3IgY29kZSwgYXMgYXBwcm9wcmlhdGUKKyAqLworc3RhdGljIHNzaXplX3Qgc21rX3dyaXRlX2xvZ2dpbmcoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciB0ZW1wWzMyXTsKKwlpbnQgaTsKKworCWlmICghY2FwYWJsZShDQVBfTUFDX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjb3VudCA+PSBzaXplb2YodGVtcCkgfHwgY291bnQgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIodGVtcCwgYnVmLCBjb3VudCkgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl0ZW1wW2NvdW50XSA9ICdcMCc7CisKKwlpZiAoc3NjYW5mKHRlbXAsICIlZCIsICZpKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaSA8IDAgfHwgaSA+IDMpCisJCXJldHVybiAtRUlOVkFMOworCWxvZ19wb2xpY3kgPSBpOworCXJldHVybiBjb3VudDsKK30KKworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNta19sb2dnaW5nX29wcyA9IHsKKwkucmVhZAkJPSBzbWtfcmVhZF9sb2dnaW5nLAorCS53cml0ZQkJPSBzbWtfd3JpdGVfbG9nZ2luZywKK307CisvKioKICAqIHNta19maWxsX3N1cGVyIC0gZmlsbCB0aGUgL3NtYWNrZnMgc3VwZXJibG9jawogICogQHNiOiB0aGUgZW1wdHkgc3VwZXJibG9jawogICogQGRhdGE6IHVudXNlZApAQCAtMTIyMSw2ICsxMjg1LDggQEAKIAkJCXsibmV0bGFiZWwiLCAmc21rX25ldGxibGFkZHJfb3BzLCBTX0lSVUdPfFNfSVdVU1J9LAogCQlbU01LX09OTFlDQVBdCT0KIAkJCXsib25seWNhcCIsICZzbWtfb25seWNhcF9vcHMsIFNfSVJVR098U19JV1VTUn0sCisJCVtTTUtfTE9HR0lOR10JPQorCQkJeyJsb2dnaW5nIiwgJnNta19sb2dnaW5nX29wcywgU19JUlVHT3xTX0lXVVNSfSwKIAkJLyogbGFzdCBvbmUgKi8geyIifQogCX07CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9jb21tb24uYyBiL3NlY3VyaXR5L3RvbW95by9jb21tb24uYwppbmRleCBkZGZiOWNjLi5mZGQxZjRiIDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vY29tbW9uLmMKKysrIGIvc2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5jCkBAIC0yOCw3ICsyOCwxMyBAQAogCSJkaXNhYmxlZCIsICJlbmFibGVkIiwgImVuYWJsZWQiLCAiZW5hYmxlZCIKIH07CiAKLS8qIFRhYmxlIGZvciBwcm9maWxlLiAqLworLyoKKyAqIHRvbW95b19jb250cm9sX2FycmF5IGlzIGEgc3RhdGljIGRhdGEgd2hpY2ggY29udGFpbnMKKyAqCisgKiAgKDEpIGZ1bmN0aW9uYWxpdHkgbmFtZSB1c2VkIGJ5IC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9wcm9maWxlIC4KKyAqICAoMikgaW5pdGlhbCB2YWx1ZXMgZm9yICJzdHJ1Y3QgdG9tb3lvX3Byb2ZpbGUiLgorICogICgzKSBtYXggdmFsdWVzIGZvciAic3RydWN0IHRvbW95b19wcm9maWxlIi4KKyAqLwogc3RhdGljIHN0cnVjdCB7CiAJY29uc3QgY2hhciAqa2V5d29yZDsKIAl1bnNpZ25lZCBpbnQgY3VycmVudF92YWx1ZTsKQEAgLTM5LDcgKzQ1LDEzIEBACiAJW1RPTU9ZT19WRVJCT1NFXSAgICAgICAgICA9IHsgIlRPTU9ZT19WRVJCT1NFIiwgICAgICAxLCAgICAgICAxIH0sCiB9OwogCi0vKiBQcm9maWxlIHRhYmxlLiBNZW1vcnkgaXMgYWxsb2NhdGVkIGFzIG5lZWRlZC4gKi8KKy8qCisgKiB0b21veW9fcHJvZmlsZSBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nIHRoZSBtb2RlIG9mIGFjY2VzcworICogY29udHJvbHMuIFRPTU9ZTyBoYXMgNCBtb2RlczogZGlzYWJsZWQsIGxlYXJuaW5nLCBwZXJtaXNzaXZlLCBlbmZvcmNpbmcuCisgKiBBbiBhZG1pbmlzdHJhdG9yIGNhbiBkZWZpbmUgdXAgdG8gMjU2IHByb2ZpbGVzLgorICogVGhlIC0+cHJvZmlsZSBvZiAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIgaXMgdXNlZCBmb3IgcmVtZW1iZXJpbmcKKyAqIHRoZSBwcm9maWxlJ3MgbnVtYmVyICgwIC0gMjU1KSBhc3NpZ25lZCB0byB0aGF0IGRvbWFpbi4KKyAqLwogc3RhdGljIHN0cnVjdCB0b21veW9fcHJvZmlsZSB7CiAJdW5zaWduZWQgaW50IHZhbHVlW1RPTU9ZT19NQVhfQ09OVFJPTF9JTkRFWF07CiAJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmNvbW1lbnQ7CkBAIC00MjgsNyArNDQwLDYgQEAKIAljb25zdCBjaGFyICpuYW1lID0gcHRyLT5uYW1lOwogCWNvbnN0IGludCBsZW4gPSBzdHJsZW4obmFtZSk7CiAKLQlwdHItPnRvdGFsX2xlbiA9IGxlbjsKIAlwdHItPmNvbnN0X2xlbiA9IHRvbW95b19jb25zdF9wYXJ0X2xlbmd0aChuYW1lKTsKIAlwdHItPmlzX2RpciA9IGxlbiAmJiAobmFtZVtsZW4gLSAxXSA9PSAnLycpOwogCXB0ci0+aXNfcGF0dGVybmVkID0gKHB0ci0+Y29uc3RfbGVuIDwgbGVuKTsKQEAgLTg2Niw3ICs4NzcsNiBAQAogCiAJaWYgKHByb2ZpbGUgPj0gVE9NT1lPX01BWF9QUk9GSUxFUykKIAkJcmV0dXJuIE5VTEw7Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIFNUQVJUICoqKioqLwogCW11dGV4X2xvY2soJmxvY2spOwogCXB0ciA9IHRvbW95b19wcm9maWxlX3B0cltwcm9maWxlXTsKIAlpZiAocHRyKQpAQCAtODgwLDcgKzg5MCw2IEBACiAJdG9tb3lvX3Byb2ZpbGVfcHRyW3Byb2ZpbGVdID0gcHRyOwogIG9rOgogCW11dGV4X3VubG9jaygmbG9jayk7Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIEVORCAqKioqKi8KIAlyZXR1cm4gcHRyOwogfQogCkBAIC0xMDA5LDcgKzEwMTgsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogU3RydWN0dXJlIGZvciBwb2xpY3kgbWFuYWdlci4gKi8KKy8qCisgKiB0b21veW9fcG9saWN5X21hbmFnZXJfZW50cnkgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZyBsaXN0IG9mCisgKiBkb21haW5uYW1lcyBvciBwcm9ncmFtcyB3aGljaCBhcmUgcGVybWl0dGVkIHRvIG1vZGlmeSBjb25maWd1cmF0aW9uIHZpYQorICogL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCisgKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KKyAqCisgKiAgKDEpICJsaXN0IiB3aGljaCBpcyBsaW5rZWQgdG8gdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3QgLgorICogICgyKSAibWFuYWdlciIgaXMgYSBkb21haW5uYW1lIG9yIGEgcHJvZ3JhbSdzIHBhdGhuYW1lLgorICogICgzKSAiaXNfZG9tYWluIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiAibWFuYWdlciIgaXMgYSBkb21haW5uYW1lLCBmYWxzZQorICogICAgICBvdGhlcndpc2UuCisgKiAgKDQpICJpc19kZWxldGVkIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiBtYXJrZWQgYXMgZGVsZXRlZCwgZmFsc2UKKyAqICAgICAgb3RoZXJ3aXNlLgorICovCiBzdHJ1Y3QgdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJLyogQSBwYXRoIHRvIHByb2dyYW0gb3IgYSBkb21haW5uYW1lLiAqLwpAQCAtMTAxOCw3ICsxMDM5LDM2IEBACiAJYm9vbCBpc19kZWxldGVkOyAvKiBUcnVlIGlmIHRoaXMgZW50cnkgaXMgZGVsZXRlZC4gKi8KIH07CiAKLS8qIFRoZSBsaXN0IGZvciAic3RydWN0IHRvbW95b19wb2xpY3lfbWFuYWdlcl9lbnRyeSIuICovCisvKgorICogdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3QgaXMgdXNlZCBmb3IgaG9sZGluZyBsaXN0IG9mIGRvbWFpbm5hbWVzIG9yCisgKiBwcm9ncmFtcyB3aGljaCBhcmUgcGVybWl0dGVkIHRvIG1vZGlmeSBjb25maWd1cmF0aW9uIHZpYQorICogL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvLyBpbnRlcmZhY2UuCisgKgorICogQW4gZW50cnkgaXMgYWRkZWQgYnkKKyAqCisgKiAjIGVjaG8gJzxrZXJuZWw+IC9zYmluL21pbmdldHR5IC9iaW4vbG9naW4gL2Jpbi9iYXNoJyA+IFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9tYW5hZ2VyCisgKiAgKGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgYnkgYSBkb21haW5uYW1lKQorICoKKyAqICBvcgorICoKKyAqICMgZWNobyAnL3Vzci9saWIvY2NzL2VkaXRwb2xpY3knID4gL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL21hbmFnZXIKKyAqICAoaWYgeW91IHdhbnQgdG8gc3BlY2lmeSBieSBhIHByb2dyYW0ncyBsb2NhdGlvbikKKyAqCisgKiBhbmQgaXMgZGVsZXRlZCBieQorICoKKyAqICMgZWNobyAnZGVsZXRlIDxrZXJuZWw+IC9zYmluL21pbmdldHR5IC9iaW4vbG9naW4gL2Jpbi9iYXNoJyA+IFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9tYW5hZ2VyCisgKgorICogIG9yCisgKgorICogIyBlY2hvICdkZWxldGUgL3Vzci9saWIvY2NzL2VkaXRwb2xpY3knID4gXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL21hbmFnZXIKKyAqCisgKiBhbmQgYWxsIGVudHJpZXMgYXJlIHJldHJpZXZlZCBieQorICoKKyAqICMgY2F0IC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9tYW5hZ2VyCisgKi8KIHN0YXRpYyBMSVNUX0hFQUQodG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3QpOwogc3RhdGljIERFQ0xBUkVfUldTRU0odG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3RfbG9jayk7CiAKQEAgLTEwNTAsNyArMTEwMCw2IEBACiAJc2F2ZWRfbWFuYWdlciA9IHRvbW95b19zYXZlX25hbWUobWFuYWdlcik7CiAJaWYgKCFzYXZlZF9tYW5hZ2VyKQogCQlyZXR1cm4gLUVOT01FTTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gU1RBUlQgKioqKiovCiAJZG93bl93cml0ZSgmdG9tb3lvX3BvbGljeV9tYW5hZ2VyX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwdHIsICZ0b21veW9fcG9saWN5X21hbmFnZXJfbGlzdCwgbGlzdCkgewogCQlpZiAocHRyLT5tYW5hZ2VyICE9IHNhdmVkX21hbmFnZXIpCkBAIC0xMDcyLDcgKzExMjEsNiBAQAogCWVycm9yID0gMDsKICBvdXQ6CiAJdXBfd3JpdGUoJnRvbW95b19wb2xpY3lfbWFuYWdlcl9saXN0X2xvY2spOwotCS8qKioqKiBFWENMVVNJVkUgU0VDVElPTiBFTkQgKioqKiovCiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xMTE3LDEwICsxMTY1LDkgQEAKIAkJCQkgbGlzdCk7CiAJCWlmIChwdHItPmlzX2RlbGV0ZWQpCiAJCQljb250aW51ZTsKLQkJaWYgKCF0b21veW9faW9fcHJpbnRmKGhlYWQsICIlc1xuIiwgcHRyLT5tYW5hZ2VyLT5uYW1lKSkgewotCQkJZG9uZSA9IGZhbHNlOworCQlkb25lID0gdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXNcbiIsIHB0ci0+bWFuYWdlci0+bmFtZSk7CisJCWlmICghZG9uZSkKIAkJCWJyZWFrOwotCQl9CiAJfQogCXVwX3JlYWQoJnRvbW95b19wb2xpY3lfbWFuYWdlcl9saXN0X2xvY2spOwogCWhlYWQtPnJlYWRfZW9mID0gZG9uZTsKQEAgLTExOTcsMTMgKzEyNDQsMTEgQEAKIAogCWlmIChzc2NhbmYoZGF0YSwgInBpZD0ldSIsICZwaWQpID09IDEpIHsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCQkvKioqKiogQ1JJVElDQUwgU0VDVElPTiBTVEFSVCAqKioqKi8KIAkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAkJcCA9IGZpbmRfdGFza19ieV92cGlkKHBpZCk7CiAJCWlmIChwKQogCQkJZG9tYWluID0gdG9tb3lvX3JlYWxfZG9tYWluKHApOwogCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7Ci0JCS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIEVORCAqKioqKi8KIAl9IGVsc2UgaWYgKCFzdHJuY21wKGRhdGEsICJkb21haW49IiwgNykpIHsKIAkJaWYgKHRvbW95b19pc19kb21haW5fZGVmKGRhdGEgKyA3KSkgewogCQkJZG93bl9yZWFkKCZ0b21veW9fZG9tYWluX2xpc3RfbG9jayk7CkBAIC0xNDQ3LDE1ICsxNDkyLDE0IEBACiAJCSAgICBUT01PWU9fRE9NQUlOX0ZMQUdTX0lHTk9SRV9HTE9CQUxfQUxMT1dfUkVBRCkKIAkJCWlnbm9yZV9nbG9iYWxfYWxsb3dfcmVhZAogCQkJCT0gVE9NT1lPX0tFWVdPUkRfSUdOT1JFX0dMT0JBTF9BTExPV19SRUFEICJcbiI7Ci0JCWlmICghdG9tb3lvX2lvX3ByaW50ZihoZWFkLAotCQkJCSAgICAgICIlc1xuIiBUT01PWU9fS0VZV09SRF9VU0VfUFJPRklMRSAiJXVcbiIKLQkJCQkgICAgICAiJXMlcyVzXG4iLCBkb21haW4tPmRvbWFpbm5hbWUtPm5hbWUsCi0JCQkJICAgICAgZG9tYWluLT5wcm9maWxlLCBxdW90YV9leGNlZWRlZCwKLQkJCQkgICAgICB0cmFuc2l0aW9uX2ZhaWxlZCwKLQkJCQkgICAgICBpZ25vcmVfZ2xvYmFsX2FsbG93X3JlYWQpKSB7Ci0JCQlkb25lID0gZmFsc2U7CisJCWRvbmUgPSB0b21veW9faW9fcHJpbnRmKGhlYWQsICIlc1xuIiBUT01PWU9fS0VZV09SRF9VU0VfUFJPRklMRQorCQkJCQkiJXVcbiVzJXMlc1xuIiwKKwkJCQkJZG9tYWluLT5kb21haW5uYW1lLT5uYW1lLAorCQkJCQlkb21haW4tPnByb2ZpbGUsIHF1b3RhX2V4Y2VlZGVkLAorCQkJCQl0cmFuc2l0aW9uX2ZhaWxlZCwKKwkJCQkJaWdub3JlX2dsb2JhbF9hbGxvd19yZWFkKTsKKwkJaWYgKCFkb25lKQogCQkJYnJlYWs7Ci0JCX0KIAkJaGVhZC0+cmVhZF9zdGVwID0gMjsKIGFjbF9sb29wOgogCQlpZiAoaGVhZC0+cmVhZF9zdGVwID09IDMpCkBAIC0xNDYzLDI0ICsxNTA3LDIyIEBACiAJCS8qIFByaW50IEFDTCBlbnRyaWVzIGluIHRoZSBkb21haW4uICovCiAJCWRvd25fcmVhZCgmdG9tb3lvX2RvbWFpbl9hY2xfaW5mb19saXN0X2xvY2spOwogCQlsaXN0X2Zvcl9lYWNoX2Nvb2tpZShhcG9zLCBoZWFkLT5yZWFkX3ZhcjIsCi0JCQkJICAgICAgJmRvbWFpbi0+YWNsX2luZm9fbGlzdCkgeworCQkJCSAgICAgJmRvbWFpbi0+YWNsX2luZm9fbGlzdCkgewogCQkJc3RydWN0IHRvbW95b19hY2xfaW5mbyAqcHRyCiAJCQkJPSBsaXN0X2VudHJ5KGFwb3MsIHN0cnVjdCB0b21veW9fYWNsX2luZm8sCi0JCQkJCSAgICAgIGxpc3QpOwotCQkJaWYgKCF0b21veW9fcHJpbnRfZW50cnkoaGVhZCwgcHRyKSkgewotCQkJCWRvbmUgPSBmYWxzZTsKKwkJCQkJICAgICBsaXN0KTsKKwkJCWRvbmUgPSB0b21veW9fcHJpbnRfZW50cnkoaGVhZCwgcHRyKTsKKwkJCWlmICghZG9uZSkKIAkJCQlicmVhazsKLQkJCX0KIAkJfQogCQl1cF9yZWFkKCZ0b21veW9fZG9tYWluX2FjbF9pbmZvX2xpc3RfbG9jayk7CiAJCWlmICghZG9uZSkKIAkJCWJyZWFrOwogCQloZWFkLT5yZWFkX3N0ZXAgPSAzOwogdGFpbF9tYXJrOgotCQlpZiAoIXRvbW95b19pb19wcmludGYoaGVhZCwgIlxuIikpIHsKLQkJCWRvbmUgPSBmYWxzZTsKKwkJZG9uZSA9IHRvbW95b19pb19wcmludGYoaGVhZCwgIlxuIik7CisJCWlmICghZG9uZSkKIAkJCWJyZWFrOwotCQl9CiAJCWhlYWQtPnJlYWRfc3RlcCA9IDE7CiAJCWlmIChoZWFkLT5yZWFkX3NpbmdsZV9kb21haW4pCiAJCQlicmVhazsKQEAgLTE1NTAsMTEgKzE1OTIsMTAgQEAKIAkJZG9tYWluID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8sIGxpc3QpOwogCQlpZiAoZG9tYWluLT5pc19kZWxldGVkKQogCQkJY29udGludWU7Ci0JCWlmICghdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJXUgJXNcbiIsIGRvbWFpbi0+cHJvZmlsZSwKLQkJCQkgICAgICBkb21haW4tPmRvbWFpbm5hbWUtPm5hbWUpKSB7Ci0JCQlkb25lID0gZmFsc2U7CisJCWRvbmUgPSB0b21veW9faW9fcHJpbnRmKGhlYWQsICIldSAlc1xuIiwgZG9tYWluLT5wcm9maWxlLAorCQkJCQlkb21haW4tPmRvbWFpbm5hbWUtPm5hbWUpOworCQlpZiAoIWRvbmUpCiAJCQlicmVhazsKLQkJfQogCX0KIAl1cF9yZWFkKCZ0b21veW9fZG9tYWluX2xpc3RfbG9jayk7CiAJaGVhZC0+cmVhZF9lb2YgPSBkb25lOwpAQCAtMTU5NCwxMyArMTYzNSwxMSBAQAogCQljb25zdCBpbnQgcGlkID0gaGVhZC0+cmVhZF9zdGVwOwogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CiAJCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiA9IE5VTEw7Ci0JCS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIFNUQVJUICoqKioqLwogCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOwogCQlwID0gZmluZF90YXNrX2J5X3ZwaWQocGlkKTsKIAkJaWYgKHApCiAJCQlkb21haW4gPSB0b21veW9fcmVhbF9kb21haW4ocCk7CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gRU5EICoqKioqLwogCQlpZiAoZG9tYWluKQogCQkJdG9tb3lvX2lvX3ByaW50ZihoZWFkLCAiJWQgJXUgJXMiLCBwaWQsIGRvbWFpbi0+cHJvZmlsZSwKIAkJCQkJIGRvbWFpbi0+ZG9tYWlubmFtZS0+bmFtZSk7CkBAIC0yMTM4LDcgKzIxNzcsMTMgQEAKIAlyZXR1cm4gdG9tb3lvX3dyaXRlX2NvbnRyb2woZmlsZSwgYnVmLCBjb3VudCk7CiB9CiAKLS8qIE9wZXJhdGlvbnMgZm9yIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gaW50ZXJmYWNlLiAqLworLyoKKyAqIHRvbW95b19vcGVyYXRpb25zIGlzIGEgInN0cnVjdCBmaWxlX29wZXJhdGlvbnMiIHdoaWNoIGlzIHVzZWQgZm9yIGhhbmRsaW5nCisgKiAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZS4KKyAqCisgKiBTb21lIGZpbGVzIHVuZGVyIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by8gZGlyZWN0b3J5IGFjY2VwdCBvcGVuKE9fUkRXUikuCisgKiBTZWUgdG9tb3lvX2lvX2J1ZmZlciBmb3IgaW50ZXJuYWxzLgorICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0b21veW9fb3BlcmF0aW9ucyA9IHsKIAkub3BlbiAgICA9IHRvbW95b19vcGVuLAogCS5yZWxlYXNlID0gdG9tb3lvX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vY29tbW9uLmggYi9zZWN1cml0eS90b21veW8vY29tbW9uLmgKaW5kZXggNjc4ZjRmZi4uNmQ2YmEwOSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5oCisrKyBiL3NlY3VyaXR5L3RvbW95by9jb21tb24uaApAQCAtMjYsMTYgKzI2LDQzIEBACiBzdHJ1Y3QgZGVudHJ5Owogc3RydWN0IHZmc21vdW50OwogCi0vKiBUZW1wb3JhcnkgYnVmZmVyIGZvciBob2xkaW5nIHBhdGhuYW1lcy4gKi8KKy8qCisgKiB0b21veW9fcGFnZV9idWZmZXIgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZyBhIHBhdGhuYW1lCisgKiBvYnRhaW5lZCBmcm9tICJzdHJ1Y3QgZGVudHJ5IiBhbmQgInN0cnVjdCB2ZnNtb3VudCIgcGFpci4KKyAqIEFzIG9mIG5vdywgaXQgaXMgNDA5NiBieXRlcy4gSWYgdXNlcnMgY29tcGxhaW4gdGhhdCA0MDk2IGJ5dGVzIGlzIHRvbyBzbWFsbAorICogKGJlY2F1c2UgVE9NT1lPIGVzY2FwZXMgbm9uIEFTQ0lJIHByaW50YWJsZSBjaGFyYWN0ZXJzIHVzaW5nIFxvb28gZm9ybWF0KSwKKyAqIHdlIHdpbGwgbWFrZSB0aGUgYnVmZmVyIGxhcmdlci4KKyAqLwogc3RydWN0IHRvbW95b19wYWdlX2J1ZmZlciB7CiAJY2hhciBidWZmZXJbNDA5Nl07CiB9OwogCi0vKiBTdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgYSB0b2tlbi4gKi8KKy8qCisgKiB0b21veW9fcGF0aF9pbmZvIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcgYSBzdHJpbmcgZGF0YQorICogdXNlZCBieSBUT01PWU8uCisgKiBUaGlzIHN0cnVjdHVyZSBoYXMgc2V2ZXJhbCBmaWVsZHMgZm9yIHN1cHBvcnRpbmcgcGF0dGVybiBtYXRjaGluZy4KKyAqCisgKiAoMSkgIm5hbWUiIGlzIHRoZSAnXDAnIHRlcm1pbmF0ZWQgc3RyaW5nIGRhdGEuCisgKiAoMikgImhhc2giIGlzIGZ1bGxfbmFtZV9oYXNoKG5hbWUsIHN0cmxlbihuYW1lKSkuCisgKiAgICAgVGhpcyBhbGxvd3MgdG9tb3lvX3BhdGhjbXAoKSB0byBjb21wYXJlIGJ5IGhhc2ggYmVmb3JlIGFjdHVhbGx5IGNvbXBhcmUKKyAqICAgICB1c2luZyBzdHJjbXAoKS4KKyAqICgzKSAiY29uc3RfbGVuIiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHNlZ21lbnQgb2YgIm5hbWUiIHdoaWNoCisgKiAgICAgY29uc2lzdHMgZW50aXJlbHkgb2Ygbm9uIHdpbGRjYXJkIGNoYXJhY3RlcnMuIEluIG90aGVyIHdvcmRzLCB0aGUgbGVuZ3RoCisgKiAgICAgd2hpY2ggd2UgY2FuIGNvbXBhcmUgdHdvIHN0cmluZ3MgdXNpbmcgc3RybmNtcCgpLgorICogKDQpICJpc19kaXIiIGlzIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmICJuYW1lIiBlbmRzIHdpdGggIi8iLAorICogICAgIGZhbHNlIG90aGVyd2lzZS4KKyAqICAgICBUT01PWU8gZGlzdGluZ3Vpc2hlcyBkaXJlY3RvcnkgYW5kIG5vbi1kaXJlY3RvcnkuIEEgZGlyZWN0b3J5IGVuZHMgd2l0aAorICogICAgICIvIiBhbmQgbm9uLWRpcmVjdG9yeSBkb2VzIG5vdCBlbmQgd2l0aCAiLyIuCisgKiAoNSkgImlzX3BhdHRlcm5lZCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgIm5hbWUiIGNvbnRhaW5zIHdpbGRjYXJkCisgKiAgICAgY2hhcmFjdGVycywgZmFsc2Ugb3RoZXJ3aXNlLiBUaGlzIGFsbG93cyBUT01PWU8gdG8gdXNlICJoYXNoIiBhbmQKKyAqICAgICBzdHJjbXAoKSBmb3Igc3RyaW5nIGNvbXBhcmlzb24gaWYgImlzX3BhdHRlcm5lZCIgaXMgZmFsc2UuCisgKiAoNikgImRlcHRoIiBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBudW1iZXIgb2YgIi8iIGNoYXJhY3RlcnMgaW4gIm5hbWUiLgorICogICAgIFRoaXMgYWxsb3dzIFRPTU9ZTyB0byBhdm9pZCBjb21wYXJpbmcgdHdvIHBhdGhuYW1lcyB3aGljaCBuZXZlciBtYXRjaAorICogICAgIChlLmcuIHdoZXRoZXIgIi92YXIvd3d3L2h0bWwvaW5kZXguaHRtbCIgbWF0Y2hlcyAiL3RtcC9zaC10aGQtXCQiKS4KKyAqLwogc3RydWN0IHRvbW95b19wYXRoX2luZm8gewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdTMyIGhhc2g7ICAgICAgICAgIC8qID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgc3RybGVuKG5hbWUpKSAqLwotCXUxNiB0b3RhbF9sZW47ICAgICAvKiA9IHN0cmxlbihuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgKi8KIAl1MTYgY29uc3RfbGVuOyAgICAgLyogPSB0b21veW9fY29uc3RfcGFydF9sZW5ndGgobmFtZSkgICAgICovCiAJYm9vbCBpc19kaXI7ICAgICAgIC8qID0gdG9tb3lvX3N0cmVuZHN3aXRoKG5hbWUsICIvIikgICAgICAqLwogCWJvb2wgaXNfcGF0dGVybmVkOyAvKiA9IHRvbW95b19wYXRoX2NvbnRhaW5zX3BhdHRlcm4obmFtZSkgKi8KQEAgLTUxLDcgKzc4LDIwIEBACiAgKi8KICNkZWZpbmUgVE9NT1lPX01BWF9QQVRITkFNRV9MRU4gNDAwMAogCi0vKiBTdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgcmVxdWVzdGVkIHBhdGhuYW1lLiAqLworLyoKKyAqIHRvbW95b19wYXRoX2luZm9fd2l0aF9kYXRhIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcgYQorICogcGF0aG5hbWUgb2J0YWluZWQgZnJvbSAic3RydWN0IGRlbnRyeSIgYW5kICJzdHJ1Y3QgdmZzbW91bnQiIHBhaXIuCisgKgorICogInN0cnVjdCB0b21veW9fcGF0aF9pbmZvX3dpdGhfZGF0YSIgY29uc2lzdHMgb2YgInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIgorICogYW5kIGJ1ZmZlciBmb3IgdGhlIHBhdGhuYW1lLCB3aGlsZSAic3RydWN0IHRvbW95b19wYWdlX2J1ZmZlciIgY29uc2lzdHMgb2YKKyAqIGJ1ZmZlciBmb3IgdGhlIHBhdGhuYW1lIG9ubHkuCisgKgorICogInN0cnVjdCB0b21veW9fcGF0aF9pbmZvX3dpdGhfZGF0YSIgaXMgaW50ZW5kZWQgdG8gYWxsb3cgVE9NT1lPIHRvIHJlbGVhc2UKKyAqIGJvdGggInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIiBhbmQgYnVmZmVyIGZvciB0aGUgcGF0aG5hbWUgYnkgc2luZ2xlIGtmcmVlKCkKKyAqIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byByZXR1cm4gdHdvIHBvaW50ZXJzIHRvIHRoZSBjYWxsZXIuIElmIHRoZSBjYWxsZXIKKyAqIHB1dHMgInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIiBvbiBzdGFjayBtZW1vcnksIHdlIHdpbGwgYmUgYWJsZSB0byByZW1vdmUKKyAqICJzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mb193aXRoX2RhdGEiLgorICovCiBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mb193aXRoX2RhdGEgewogCS8qIEtlZXAgImhlYWQiIGZpcnN0LCBmb3IgdGhpcyBwb2ludGVyIGlzIHBhc3NlZCB0byB0b21veW9fZnJlZSgpLiAqLwogCXN0cnVjdCB0b21veW9fcGF0aF9pbmZvIGhlYWQ7CkBAIC02MSw3ICsxMDEsMTUgQEAKIH07CiAKIC8qCi0gKiBDb21tb24gaGVhZGVyIGZvciBob2xkaW5nIEFDTCBlbnRyaWVzLgorICogdG9tb3lvX2FjbF9pbmZvIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcKKyAqCisgKiAgKDEpICJsaXN0IiB3aGljaCBpcyBsaW5rZWQgdG8gdGhlIC0+YWNsX2luZm9fbGlzdCBvZgorICogICAgICAic3RydWN0IHRvbW95b19kb21haW5faW5mbyIKKyAqICAoMikgInR5cGUiIHdoaWNoIHRlbGxzCisgKiAgICAgIChhKSB0eXBlICYgMHg3RiA6IHR5cGUgb2YgdGhlIGVudHJ5IChlaXRoZXIKKyAqICAgICAgICAgICJzdHJ1Y3QgdG9tb3lvX3NpbmdsZV9wYXRoX2FjbF9yZWNvcmQiIG9yCisgKiAgICAgICAgICAic3RydWN0IHRvbW95b19kb3VibGVfcGF0aF9hY2xfcmVjb3JkIikKKyAqICAgICAgKGIpIHR5cGUgJiAweDgwIDogd2hldGhlciB0aGUgZW50cnkgaXMgbWFya2VkIGFzICJkZWxldGVkIi4KICAqCiAgKiBQYWNraW5nICJzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvIiBhbGxvd3MKICAqICJzdHJ1Y3QgdG9tb3lvX3NpbmdsZV9wYXRoX2FjbF9yZWNvcmQiIHRvIGVtYmVkICJ1MTYiIGFuZApAQCAtODEsNyArMTI5LDI4IEBACiAvKiBUaGlzIEFDTCBlbnRyeSBpcyBkZWxldGVkLiAgICAgICAgICAgKi8KICNkZWZpbmUgVE9NT1lPX0FDTF9ERUxFVEVEICAgICAgICAweDgwCiAKLS8qIFN0cnVjdHVyZSBmb3IgZG9tYWluIGluZm9ybWF0aW9uLiAqLworLyoKKyAqIHRvbW95b19kb21haW5faW5mbyBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nIHBlcm1pc3Npb25zCisgKiAoZS5nLiAiYWxsb3dfcmVhZCAvbGliL2xpYmMtMi41LnNvIikgZ2l2ZW4gdG8gZWFjaCBkb21haW4uCisgKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KKyAqCisgKiAgKDEpICJsaXN0IiB3aGljaCBpcyBsaW5rZWQgdG8gdG9tb3lvX2RvbWFpbl9saXN0IC4KKyAqICAoMikgImFjbF9pbmZvX2xpc3QiIHdoaWNoIGlzIGxpbmtlZCB0byAic3RydWN0IHRvbW95b19hY2xfaW5mbyIuCisgKiAgKDMpICJkb21haW5uYW1lIiB3aGljaCBob2xkcyB0aGUgbmFtZSBvZiB0aGUgZG9tYWluLgorICogICg0KSAicHJvZmlsZSIgd2hpY2ggcmVtZW1iZXJzIHByb2ZpbGUgbnVtYmVyIGFzc2lnbmVkIHRvIHRoaXMgZG9tYWluLgorICogICg1KSAiaXNfZGVsZXRlZCIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgdGhpcyBkb21haW4gaXMgbWFya2VkIGFzCisgKiAgICAgICJkZWxldGVkIiwgZmFsc2Ugb3RoZXJ3aXNlLgorICogICg2KSAicXVvdGFfd2FybmVkIiBpcyBhIGJvb2wgd2hpY2ggaXMgdXNlZCBmb3Igc3VwcHJlc3Npbmcgd2FybmluZyBtZXNzYWdlCisgKiAgICAgIHdoZW4gbGVhcm5pbmcgbW9kZSBsZWFybmVkIHRvbyBtdWNoIGVudHJpZXMuCisgKiAgKDcpICJmbGFncyIgd2hpY2ggcmVtZW1iZXJzIHRoaXMgZG9tYWluJ3MgYXR0cmlidXRlcy4KKyAqCisgKiBBIGRvbWFpbidzIGxpZmVjeWNsZSBpcyBhbiBhbmFsb2d5IG9mIGZpbGVzIG9uIC8gZGlyZWN0b3J5LgorICogTXVsdGlwbGUgZG9tYWlucyB3aXRoIHRoZSBzYW1lIGRvbWFpbm5hbWUgY2Fubm90IGJlIGNyZWF0ZWQgKGFzIHdpdGgKKyAqIGNyZWF0aW5nIGZpbGVzIHdpdGggdGhlIHNhbWUgZmlsZW5hbWUgZmFpbHMgd2l0aCAtRUVYSVNUKS4KKyAqIElmIGEgcHJvY2VzcyByZWFjaGVkIGEgZG9tYWluLCB0aGF0IHByb2Nlc3MgY2FuIHJlc2lkZSBpbiB0aGF0IGRvbWFpbiBhZnRlcgorICogdGhhdCBkb21haW4gaXMgbWFya2VkIGFzICJkZWxldGVkIiAoYXMgd2l0aCBhIHByb2Nlc3MgY2FuIGFjY2VzcyBhbiBhbHJlYWR5CisgKiBvcGVuKCllZCBmaWxlIGFmdGVyIHRoYXQgZmlsZSB3YXMgdW5saW5rKCllZCkuCisgKi8KIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFjbF9pbmZvX2xpc3Q7CkBAIC0xMDgsMTAgKzE3NywxOCBAQAogI2RlZmluZSBUT01PWU9fRE9NQUlOX0ZMQUdTX1RSQU5TSVRJT05fRkFJTEVEICAgICAgICAyCiAKIC8qCi0gKiBTdHJ1Y3R1cmUgZm9yICJhbGxvd19yZWFkL3dyaXRlIiwgImFsbG93X2V4ZWN1dGUiLCAiYWxsb3dfcmVhZCIsCi0gKiAiYWxsb3dfd3JpdGUiLCAiYWxsb3dfY3JlYXRlIiwgImFsbG93X3VubGluayIsICJhbGxvd19ta2RpciIsICJhbGxvd19ybWRpciIsCi0gKiAiYWxsb3dfbWtmaWZvIiwgImFsbG93X21rc29jayIsICJhbGxvd19ta2Jsb2NrIiwgImFsbG93X21rY2hhciIsCi0gKiAiYWxsb3dfdHJ1bmNhdGUiLCAiYWxsb3dfc3ltbGluayIgYW5kICJhbGxvd19yZXdyaXRlIiBkaXJlY3RpdmUuCisgKiB0b21veW9fc2luZ2xlX3BhdGhfYWNsX3JlY29yZCBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nIGFuCisgKiBlbnRyeSB3aXRoIG9uZSBwYXRobmFtZSBvcGVyYXRpb24gKGUuZy4gb3BlbigpLCBta2RpcigpKS4KKyAqIEl0IGhhcyBmb2xsb3dpbmcgZmllbGRzLgorICoKKyAqICAoMSkgImhlYWQiIHdoaWNoIGlzIGEgInN0cnVjdCB0b21veW9fYWNsX2luZm8iLgorICogICgyKSAicGVybSIgd2hpY2ggaXMgYSBiaXRtYXNrIG9mIHBlcm1pdHRlZCBvcGVyYXRpb25zLgorICogICgzKSAiZmlsZW5hbWUiIGlzIHRoZSBwYXRobmFtZS4KKyAqCisgKiBEaXJlY3RpdmVzIGhlbGQgYnkgdGhpcyBzdHJ1Y3R1cmUgYXJlICJhbGxvd19yZWFkL3dyaXRlIiwgImFsbG93X2V4ZWN1dGUiLAorICogImFsbG93X3JlYWQiLCAiYWxsb3dfd3JpdGUiLCAiYWxsb3dfY3JlYXRlIiwgImFsbG93X3VubGluayIsICJhbGxvd19ta2RpciIsCisgKiAiYWxsb3dfcm1kaXIiLCAiYWxsb3dfbWtmaWZvIiwgImFsbG93X21rc29jayIsICJhbGxvd19ta2Jsb2NrIiwKKyAqICJhbGxvd19ta2NoYXIiLCAiYWxsb3dfdHJ1bmNhdGUiLCAiYWxsb3dfc3ltbGluayIgYW5kICJhbGxvd19yZXdyaXRlIi4KICAqLwogc3RydWN0IHRvbW95b19zaW5nbGVfcGF0aF9hY2xfcmVjb3JkIHsKIAlzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvIGhlYWQ7IC8qIHR5cGUgPSBUT01PWU9fVFlQRV9TSU5HTEVfUEFUSF9BQ0wgKi8KQEAgLTEyMCw3ICsxOTcsMTggQEAKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqZmlsZW5hbWU7CiB9OwogCi0vKiBTdHJ1Y3R1cmUgZm9yICJhbGxvd19yZW5hbWUiIGFuZCAiYWxsb3dfbGluayIgZGlyZWN0aXZlLiAqLworLyoKKyAqIHRvbW95b19kb3VibGVfcGF0aF9hY2xfcmVjb3JkIGlzIGEgc3RydWN0dXJlIHdoaWNoIGlzIHVzZWQgZm9yIGhvbGRpbmcgYW4KKyAqIGVudHJ5IHdpdGggdHdvIHBhdGhuYW1lcyBvcGVyYXRpb24gKGkuZS4gbGluaygpIGFuZCByZW5hbWUoKSkuCisgKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KKyAqCisgKiAgKDEpICJoZWFkIiB3aGljaCBpcyBhICJzdHJ1Y3QgdG9tb3lvX2FjbF9pbmZvIi4KKyAqICAoMikgInBlcm0iIHdoaWNoIGlzIGEgYml0bWFzayBvZiBwZXJtaXR0ZWQgb3BlcmF0aW9ucy4KKyAqICAoMykgImZpbGVuYW1lMSIgaXMgdGhlIHNvdXJjZS9vbGQgcGF0aG5hbWUuCisgKiAgKDQpICJmaWxlbmFtZTIiIGlzIHRoZSBkZXN0aW5hdGlvbi9uZXcgcGF0aG5hbWUuCisgKgorICogRGlyZWN0aXZlcyBoZWxkIGJ5IHRoaXMgc3RydWN0dXJlIGFyZSAiYWxsb3dfcmVuYW1lIiBhbmQgImFsbG93X2xpbmsiLgorICovCiBzdHJ1Y3QgdG9tb3lvX2RvdWJsZV9wYXRoX2FjbF9yZWNvcmQgewogCXN0cnVjdCB0b21veW9fYWNsX2luZm8gaGVhZDsgLyogdHlwZSA9IFRPTU9ZT19UWVBFX0RPVUJMRV9QQVRIX0FDTCAqLwogCXU4IHBlcm07CkBAIC0xNTMsNyArMjQxLDI5IEBACiAjZGVmaW5lIFRPTU9ZT19WRVJCT1NFICAgICAgICAgICAgICAgICAgICAgICAyCiAjZGVmaW5lIFRPTU9ZT19NQVhfQ09OVFJPTF9JTkRFWCAgICAgICAgICAgICAzCiAKLS8qIFN0cnVjdHVyZSBmb3IgcmVhZGluZy93cml0aW5nIHBvbGljeSB2aWEgc2VjdXJpdHlmcyBpbnRlcmZhY2VzLiAqLworLyoKKyAqIHRvbW95b19pb19idWZmZXIgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgcmVhZGluZyBhbmQgbW9kaWZ5aW5nCisgKiBjb25maWd1cmF0aW9uIHZpYSAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vIGludGVyZmFjZS4KKyAqIEl0IGhhcyBtYW55IGZpZWxkcy4gLT5yZWFkX3ZhcjEgLCAtPnJlYWRfdmFyMiAsIC0+d3JpdGVfdmFyMSBhcmUgdXNlZCBhcworICogY3Vyc29ycy4KKyAqCisgKiBTaW5jZSB0aGUgY29udGVudCBvZiAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZG9tYWluX3BvbGljeSBpcyBhIGxpc3Qgb2YKKyAqICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIiBlbnRyaWVzIGFuZCBlYWNoICJzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIgorICogZW50cnkgaGFzIGEgbGlzdCBvZiAic3RydWN0IHRvbW95b19hY2xfaW5mbyIsIHdlIG5lZWQgdHdvIGN1cnNvcnMgd2hlbgorICogcmVhZGluZyAob25lIGlzIGZvciB0cmF2ZXJzaW5nIHRvbW95b19kb21haW5fbGlzdCBhbmQgdGhlIG90aGVyIGlzIGZvcgorICogdHJhdmVyc2luZyAic3RydWN0IHRvbW95b19hY2xfaW5mbyItPmFjbF9pbmZvX2xpc3QgKS4KKyAqCisgKiBJZiBhIGxpbmUgd3JpdHRlbiB0byAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZG9tYWluX3BvbGljeSBzdGFydHMgd2l0aAorICogInNlbGVjdCAiLCBUT01PWU8gc2Vla3MgdGhlIGN1cnNvciAtPnJlYWRfdmFyMSBhbmQgLT53cml0ZV92YXIxIHRvIHRoZQorICogZG9tYWluIHdpdGggdGhlIGRvbWFpbm5hbWUgc3BlY2lmaWVkIGJ5IHRoZSByZXN0IG9mIHRoYXQgbGluZSAoTlVMTCBpcyBzZXQKKyAqIGlmIHNlZWsgZmFpbGVkKS4KKyAqIElmIGEgbGluZSB3cml0dGVuIHRvIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5IHN0YXJ0cyB3aXRoCisgKiAiZGVsZXRlICIsIFRPTU9ZTyBkZWxldGVzIGFuIGVudHJ5IG9yIGEgZG9tYWluIHNwZWNpZmllZCBieSB0aGUgcmVzdCBvZiB0aGF0CisgKiBsaW5lICgtPndyaXRlX3ZhcjEgaXMgc2V0IHRvIE5VTEwgaWYgYSBkb21haW4gd2FzIGRlbGV0ZWQpLgorICogSWYgYSBsaW5lIHdyaXR0ZW4gdG8gL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2RvbWFpbl9wb2xpY3kgc3RhcnRzIHdpdGgKKyAqIG5laXRoZXIgInNlbGVjdCAiIG5vciAiZGVsZXRlICIsIGFuIGVudHJ5IG9yIGEgZG9tYWluIHNwZWNpZmllZCBieSB0aGF0IGxpbmUKKyAqIGlzIGFwcGVuZGVkLgorICovCiBzdHJ1Y3QgdG9tb3lvX2lvX2J1ZmZlciB7CiAJaW50ICgqcmVhZCkgKHN0cnVjdCB0b21veW9faW9fYnVmZmVyICopOwogCWludCAoKndyaXRlKSAoc3RydWN0IHRvbW95b19pb19idWZmZXIgKik7CmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vZG9tYWluLmMgYi9zZWN1cml0eS90b21veW8vZG9tYWluLmMKaW5kZXggMmQ2NzQ4Ny4uMWQ4YjE2OSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL2RvbWFpbi5jCisrKyBiL3NlY3VyaXR5L3RvbW95by9kb21haW4uYwpAQCAtMTksMTEgKzE5LDYzIEBACiAvKiBUaGUgaW5pdGlhbCBkb21haW4uICovCiBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvIHRvbW95b19rZXJuZWxfZG9tYWluOwogCi0vKiBUaGUgbGlzdCBmb3IgInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iLiAqLworLyoKKyAqIHRvbW95b19kb21haW5fbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgZG9tYWlucy4KKyAqIFRoZSAtPmFjbF9pbmZvX2xpc3Qgb2YgInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iIGlzIHVzZWQgZm9yIGhvbGRpbmcKKyAqIHBlcm1pc3Npb25zIChlLmcuICJhbGxvd19yZWFkIC9saWIvbGliYy0yLjUuc28iKSBnaXZlbiB0byBlYWNoIGRvbWFpbi4KKyAqCisgKiBBbiBlbnRyeSBpcyBhZGRlZCBieQorICoKKyAqICMgKCBlY2hvICI8a2VybmVsPiI7IGVjaG8gImFsbG93X2V4ZWN1dGUgL3NiaW4vaW5pdCIgKSA+IFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5CisgKgorICogYW5kIGlzIGRlbGV0ZWQgYnkKKyAqCisgKiAjICggZWNobyAiPGtlcm5lbD4iOyBlY2hvICJkZWxldGUgYWxsb3dfZXhlY3V0ZSAvc2Jpbi9pbml0IiApID4gXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2RvbWFpbl9wb2xpY3kKKyAqCisgKiBhbmQgYWxsIGVudHJpZXMgYXJlIHJldHJpZXZlZCBieQorICoKKyAqICMgY2F0IC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5CisgKgorICogQSBkb21haW4gaXMgYWRkZWQgYnkKKyAqCisgKiAjIGVjaG8gIjxrZXJuZWw+IiA+IC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5CisgKgorICogYW5kIGlzIGRlbGV0ZWQgYnkKKyAqCisgKiAjIGVjaG8gImRlbGV0ZSA8a2VybmVsPiIgPiAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZG9tYWluX3BvbGljeQorICoKKyAqIGFuZCBhbGwgZG9tYWlucyBhcmUgcmV0cmlldmVkIGJ5CisgKgorICogIyBncmVwICdePGtlcm5lbD4nIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9kb21haW5fcG9saWN5CisgKgorICogTm9ybWFsbHksIGEgZG9tYWlubmFtZSBpcyBtb25vdG9uaWNhbGx5IGdldHRpbmcgbG9uZ2VyIGJlY2F1c2UgYSBkb21haW5uYW1lCisgKiB3aGljaCB0aGUgcHJvY2VzcyB3aWxsIGJlbG9uZyB0byBpZiBhbiBleGVjdmUoKSBvcGVyYXRpb24gc3VjY2VlZHMgaXMKKyAqIGRlZmluZWQgYXMgYSBjb25jYXRlbmF0aW9uIG9mICJjdXJyZW50IGRvbWFpbm5hbWUiICsgInBhdGhuYW1lIHBhc3NlZCB0bworICogZXhlY3ZlKCkiLgorICogU2VlIHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdCBhbmQgdG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdCBmb3IKKyAqIGV4Y2VwdGlvbnMuCisgKi8KIExJU1RfSEVBRCh0b21veW9fZG9tYWluX2xpc3QpOwogREVDTEFSRV9SV1NFTSh0b21veW9fZG9tYWluX2xpc3RfbG9jayk7CiAKLS8qIFN0cnVjdHVyZSBmb3IgImluaXRpYWxpemVfZG9tYWluIiBhbmQgIm5vX2luaXRpYWxpemVfZG9tYWluIiBrZXl3b3JkLiAqLworLyoKKyAqIHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfZW50cnkgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZworICogImluaXRpYWxpemVfZG9tYWluIiBhbmQgIm5vX2luaXRpYWxpemVfZG9tYWluIiBlbnRyaWVzLgorICogSXQgaGFzIGZvbGxvd2luZyBmaWVsZHMuCisgKgorICogICgxKSAibGlzdCIgd2hpY2ggaXMgbGlua2VkIHRvIHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdCAuCisgKiAgKDIpICJkb21haW5uYW1lIiB3aGljaCBpcyAiYSBkb21haW5uYW1lIiBvciAidGhlIGxhc3QgY29tcG9uZW50IG9mIGEKKyAqICAgICAgZG9tYWlubmFtZSIuIFRoaXMgZmllbGQgaXMgTlVMTCBpZiAiZnJvbSIgY2xhdXNlIGlzIG5vdCBzcGVjaWZpZWQuCisgKiAgKDMpICJwcm9ncmFtIiB3aGljaCBpcyBhIHByb2dyYW0ncyBwYXRobmFtZS4KKyAqICAoNCkgImlzX2RlbGV0ZWQiIGlzIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmIG1hcmtlZCBhcyBkZWxldGVkLCBmYWxzZQorICogICAgICBvdGhlcndpc2UuCisgKiAgKDUpICJpc19ub3QiIGlzIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmICJub19pbml0aWFsaXplX2RvbWFpbiIsIGZhbHNlCisgKiAgICAgIG90aGVyd2lzZS4KKyAqICAoNikgImlzX2xhc3RfbmFtZSIgaXMgYSBib29sIHdoaWNoIGlzIHRydWUgaWYgImRvbWFpbm5hbWUiIGlzICJ0aGUgbGFzdAorICogICAgICBjb21wb25lbnQgb2YgYSBkb21haW5uYW1lIiwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCiBzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpkb21haW5uYW1lOyAgICAvKiBUaGlzIG1heSBiZSBOVUxMICovCkBAIC0zNCw3ICs4NiwyMyBAQAogCWJvb2wgaXNfbGFzdF9uYW1lOwogfTsKIAotLyogU3RydWN0dXJlIGZvciAia2VlcF9kb21haW4iIGFuZCAibm9fa2VlcF9kb21haW4iIGtleXdvcmQuICovCisvKgorICogdG9tb3lvX2RvbWFpbl9rZWVwZXJfZW50cnkgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZworICogImtlZXBfZG9tYWluIiBhbmQgIm5vX2tlZXBfZG9tYWluIiBlbnRyaWVzLgorICogSXQgaGFzIGZvbGxvd2luZyBmaWVsZHMuCisgKgorICogICgxKSAibGlzdCIgd2hpY2ggaXMgbGlua2VkIHRvIHRvbW95b19kb21haW5fa2VlcGVyX2xpc3QgLgorICogICgyKSAiZG9tYWlubmFtZSIgd2hpY2ggaXMgImEgZG9tYWlubmFtZSIgb3IgInRoZSBsYXN0IGNvbXBvbmVudCBvZiBhCisgKiAgICAgIGRvbWFpbm5hbWUiLgorICogICgzKSAicHJvZ3JhbSIgd2hpY2ggaXMgYSBwcm9ncmFtJ3MgcGF0aG5hbWUuCisgKiAgICAgIFRoaXMgZmllbGQgaXMgTlVMTCBpZiAiZnJvbSIgY2xhdXNlIGlzIG5vdCBzcGVjaWZpZWQuCisgKiAgKDQpICJpc19kZWxldGVkIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiBtYXJrZWQgYXMgZGVsZXRlZCwgZmFsc2UKKyAqICAgICAgb3RoZXJ3aXNlLgorICogICg1KSAiaXNfbm90IiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiAibm9faW5pdGlhbGl6ZV9kb21haW4iLCBmYWxzZQorICogICAgICBvdGhlcndpc2UuCisgKiAgKDYpICJpc19sYXN0X25hbWUiIGlzIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmICJkb21haW5uYW1lIiBpcyAidGhlIGxhc3QKKyAqICAgICAgY29tcG9uZW50IG9mIGEgZG9tYWlubmFtZSIsIGZhbHNlIG90aGVyd2lzZS4KKyAqLwogc3RydWN0IHRvbW95b19kb21haW5fa2VlcGVyX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmRvbWFpbm5hbWU7CkBAIC00NSw3ICsxMTMsMTYgQEAKIAlib29sIGlzX2xhc3RfbmFtZTsKIH07CiAKLS8qIFN0cnVjdHVyZSBmb3IgImFsaWFzIiBrZXl3b3JkLiAqLworLyoKKyAqIHRvbW95b19hbGlhc19lbnRyeSBpcyBhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGZvciBob2xkaW5nICJhbGlhcyIgZW50cmllcy4KKyAqIEl0IGhhcyBmb2xsb3dpbmcgZmllbGRzLgorICoKKyAqICAoMSkgImxpc3QiIHdoaWNoIGlzIGxpbmtlZCB0byB0b21veW9fYWxpYXNfbGlzdCAuCisgKiAgKDIpICJvcmlnaW5hbF9uYW1lIiB3aGljaCBpcyBhIGRlcmVmZXJlbmNlZCBwYXRobmFtZS4KKyAqICAoMykgImFsaWFzZWRfbmFtZSIgd2hpY2ggaXMgYSBzeW1saW5rJ3MgcGF0aG5hbWUuCisgKiAgKDQpICJpc19kZWxldGVkIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiBtYXJrZWQgYXMgZGVsZXRlZCwgZmFsc2UKKyAqICAgICAgb3RoZXJ3aXNlLgorICovCiBzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKm9yaWdpbmFsX25hbWU7CkBAIC02NywxNCArMTQ0LDEyIEBACiB7CiAJLyogV2UgbmVlZCB0byBzZXJpYWxpemUgYmVjYXVzZSB0aGlzIGlzIGJpdGZpZWxkIG9wZXJhdGlvbi4gKi8KIAlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOwotCS8qKioqKiBDUklUSUNBTCBTRUNUSU9OIFNUQVJUICoqKioqLwogCXNwaW5fbG9jaygmbG9jayk7CiAJaWYgKCFpc19kZWxldGUpCiAJCWRvbWFpbi0+ZmxhZ3MgfD0gZmxhZ3M7CiAJZWxzZQogCQlkb21haW4tPmZsYWdzICY9IH5mbGFnczsKIAlzcGluX3VubG9jaygmbG9jayk7Ci0JLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gRU5EICoqKioqLwogfQogCiAvKioKQEAgLTk0LDcgKzE2OSw0MiBAQAogCXJldHVybiBjcDA7CiB9CiAKLS8qIFRoZSBsaXN0IGZvciAic3RydWN0IHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfZW50cnkiLiAqLworLyoKKyAqIHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgcHJvZ3JhbXMgd2hpY2gKKyAqIHRyaWdnZXJzIHJlaW5pdGlhbGl6YXRpb24gb2YgZG9tYWlubmFtZS4gTm9ybWFsbHksIGEgZG9tYWlubmFtZSBpcworICogbW9ub3RvbmljYWxseSBnZXR0aW5nIGxvbmdlci4gQnV0IHNvbWV0aW1lcywgd2UgcmVzdGFydCBkYWVtb24gcHJvZ3JhbXMuCisgKiBJdCB3b3VsZCBiZSBjb252ZW5pZW50IGZvciB1cyB0aGF0ICJhIGRhZW1vbiBzdGFydGVkIHVwb24gc3lzdGVtIGJvb3QiIGFuZAorICogInRoZSBkYWVtb24gcmVzdGFydGVkIGZyb20gY29uc29sZSIgYmVsb25nIHRvIHRoZSBzYW1lIGRvbWFpbi4gVGh1cywgVE9NT1lPCisgKiBwcm92aWRlcyBhIHdheSB0byBzaG9ydGVuIGRvbWFpbm5hbWVzLgorICoKKyAqIEFuIGVudHJ5IGlzIGFkZGVkIGJ5CisgKgorICogIyBlY2hvICdpbml0aWFsaXplX2RvbWFpbiAvdXNyL3NiaW4vaHR0cGQnID4gXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKKyAqCisgKiBhbmQgaXMgZGVsZXRlZCBieQorICoKKyAqICMgZWNobyAnZGVsZXRlIGluaXRpYWxpemVfZG9tYWluIC91c3Ivc2Jpbi9odHRwZCcgPiBcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQorICoKKyAqIGFuZCBhbGwgZW50cmllcyBhcmUgcmV0cmlldmVkIGJ5CisgKgorICogIyBncmVwIF5pbml0aWFsaXplX2RvbWFpbiAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQorICoKKyAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCAvdXNyL3NiaW4vaHR0cGQgd2lsbCBiZWxvbmcgdG8KKyAqICI8a2VybmVsPiAvdXNyL3NiaW4vaHR0cGQiIGRvbWFpbi4KKyAqCisgKiBZb3UgbWF5IHNwZWNpZnkgYSBkb21haW5uYW1lIHVzaW5nICJmcm9tIiBrZXl3b3JkLgorICogImluaXRpYWxpemVfZG9tYWluIC91c3Ivc2Jpbi9odHRwZCBmcm9tIDxrZXJuZWw+IC9ldGMvcmMuZC9pbml0LmQvaHR0cGQiCisgKiB3aWxsIGNhdXNlICIvdXNyL3NiaW4vaHR0cGQiIGV4ZWN1dGVkIGZyb20gIjxrZXJuZWw+IC9ldGMvcmMuZC9pbml0LmQvaHR0cGQiCisgKiBkb21haW4gdG8gYmVsb25nIHRvICI8a2VybmVsPiAvdXNyL3NiaW4vaHR0cGQiIGRvbWFpbi4KKyAqCisgKiBZb3UgbWF5IGFkZCAibm9fIiBwcmVmaXggdG8gImluaXRpYWxpemVfZG9tYWluIi4KKyAqICJpbml0aWFsaXplX2RvbWFpbiAvdXNyL3NiaW4vaHR0cGQiIGFuZAorICogIm5vX2luaXRpYWxpemVfZG9tYWluIC91c3Ivc2Jpbi9odHRwZCBmcm9tIDxrZXJuZWw+IC9ldGMvcmMuZC9pbml0LmQvaHR0cGQiCisgKiB3aWxsIGNhdXNlICIvdXNyL3NiaW4vaHR0cGQiIHRvIGJlbG9uZyB0byAiPGtlcm5lbD4gL3Vzci9zYmluL2h0dHBkIiBkb21haW4KKyAqIHVubGVzcyBleGVjdXRlZCBmcm9tICI8a2VybmVsPiAvZXRjL3JjLmQvaW5pdC5kL2h0dHBkIiBkb21haW4uCisgKi8KIHN0YXRpYyBMSVNUX0hFQUQodG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9saXN0KTsKIHN0YXRpYyBERUNMQVJFX1JXU0VNKHRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdF9sb2NrKTsKIApAQCAtMTM1LDcgKzI0NSw2IEBACiAJc2F2ZWRfcHJvZ3JhbSA9IHRvbW95b19zYXZlX25hbWUocHJvZ3JhbSk7CiAJaWYgKCFzYXZlZF9wcm9ncmFtKQogCQlyZXR1cm4gLUVOT01FTTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gU1RBUlQgKioqKiovCiAJZG93bl93cml0ZSgmdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocHRyLCAmdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9saXN0LCBsaXN0KSB7CiAJCWlmIChwdHItPmlzX25vdCAhPSBpc19ub3QgfHwKQEAgLTE2MSw3ICsyNzAsNiBAQAogCWVycm9yID0gMDsKICBvdXQ6CiAJdXBfd3JpdGUoJnRvbW95b19kb21haW5faW5pdGlhbGl6ZXJfbGlzdF9sb2NrKTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gRU5EICoqKioqLwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTkzLDEzICszMDEsMTIgQEAKIAkJCWZyb20gPSAiIGZyb20gIjsKIAkJCWRvbWFpbiA9IHB0ci0+ZG9tYWlubmFtZS0+bmFtZTsKIAkJfQotCQlpZiAoIXRvbW95b19pb19wcmludGYoaGVhZCwKLQkJCQkgICAgICAiJXMiIFRPTU9ZT19LRVlXT1JEX0lOSVRJQUxJWkVfRE9NQUlOCi0JCQkJICAgICAgIiVzJXMlc1xuIiwgbm8sIHB0ci0+cHJvZ3JhbS0+bmFtZSwgZnJvbSwKLQkJCQkgICAgICBkb21haW4pKSB7Ci0JCQlkb25lID0gZmFsc2U7CisJCWRvbmUgPSB0b21veW9faW9fcHJpbnRmKGhlYWQsCisJCQkJCSIlcyIgVE9NT1lPX0tFWVdPUkRfSU5JVElBTElaRV9ET01BSU4KKwkJCQkJIiVzJXMlc1xuIiwgbm8sIHB0ci0+cHJvZ3JhbS0+bmFtZSwKKwkJCQkJZnJvbSwgZG9tYWluKTsKKwkJaWYgKCFkb25lKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJdXBfcmVhZCgmdG9tb3lvX2RvbWFpbl9pbml0aWFsaXplcl9saXN0X2xvY2spOwogCXJldHVybiBkb25lOwpAQCAtMjczLDcgKzM4MCw0NCBAQAogCXJldHVybiBmbGFnOwogfQogCi0vKiBUaGUgbGlzdCBmb3IgInN0cnVjdCB0b21veW9fZG9tYWluX2tlZXBlcl9lbnRyeSIuICovCisvKgorICogdG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgZG9tYWlubmFtZXMgd2hpY2gKKyAqIHN1cHByZXNzZXMgZG9tYWluIHRyYW5zaXRpb24uIE5vcm1hbGx5LCBhIGRvbWFpbm5hbWUgaXMgbW9ub3RvbmljYWxseQorICogZ2V0dGluZyBsb25nZXIuIEJ1dCBzb21ldGltZXMsIHdlIHdhbnQgdG8gc3VwcHJlc3MgZG9tYWluIHRyYW5zaXRpb24uCisgKiBJdCB3b3VsZCBiZSBjb252ZW5pZW50IGZvciB1cyB0aGF0IHByb2dyYW1zIGV4ZWN1dGVkIGZyb20gYSBsb2dpbiBzZXNzaW9uCisgKiBiZWxvbmcgdG8gdGhlIHNhbWUgZG9tYWluLiBUaHVzLCBUT01PWU8gcHJvdmlkZXMgYSB3YXkgdG8gc3VwcHJlc3MgZG9tYWluCisgKiB0cmFuc2l0aW9uLgorICoKKyAqIEFuIGVudHJ5IGlzIGFkZGVkIGJ5CisgKgorICogIyBlY2hvICdrZWVwX2RvbWFpbiA8a2VybmVsPiAvdXNyL3NiaW4vc3NoZCAvYmluL2Jhc2gnID4gXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQorICoKKyAqIGFuZCBpcyBkZWxldGVkIGJ5CisgKgorICogIyBlY2hvICdkZWxldGUga2VlcF9kb21haW4gPGtlcm5lbD4gL3Vzci9zYmluL3NzaGQgL2Jpbi9iYXNoJyA+IFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKKyAqCisgKiBhbmQgYWxsIGVudHJpZXMgYXJlIHJldHJpZXZlZCBieQorICoKKyAqICMgZ3JlcCBea2VlcF9kb21haW4gL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKKyAqCisgKiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgYW55IHByb2Nlc3Mgd2hpY2ggYmVsb25ncyB0bworICogIjxrZXJuZWw+IC91c3Ivc2Jpbi9zc2hkIC9iaW4vYmFzaCIgZG9tYWluIHdpbGwgcmVtYWluIGluIHRoYXQgZG9tYWluLAorICogdW5sZXNzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5ICJpbml0aWFsaXplX2RvbWFpbiIgb3IgIm5vX2tlZXBfZG9tYWluIi4KKyAqCisgKiBZb3UgbWF5IHNwZWNpZnkgYSBwcm9ncmFtIHVzaW5nICJmcm9tIiBrZXl3b3JkLgorICogImtlZXBfZG9tYWluIC9iaW4vcHdkIGZyb20gPGtlcm5lbD4gL3Vzci9zYmluL3NzaGQgL2Jpbi9iYXNoIgorICogd2lsbCBjYXVzZSAiL2Jpbi9wd2QiIGV4ZWN1dGVkIGZyb20gIjxrZXJuZWw+IC91c3Ivc2Jpbi9zc2hkIC9iaW4vYmFzaCIKKyAqIGRvbWFpbiB0byByZW1haW4gaW4gIjxrZXJuZWw+IC91c3Ivc2Jpbi9zc2hkIC9iaW4vYmFzaCIgZG9tYWluLgorICoKKyAqIFlvdSBtYXkgYWRkICJub18iIHByZWZpeCB0byAia2VlcF9kb21haW4iLgorICogImtlZXBfZG9tYWluIDxrZXJuZWw+IC91c3Ivc2Jpbi9zc2hkIC9iaW4vYmFzaCIgYW5kCisgKiAibm9fa2VlcF9kb21haW4gL3Vzci9iaW4vcGFzc3dkIGZyb20gPGtlcm5lbD4gL3Vzci9zYmluL3NzaGQgL2Jpbi9iYXNoIiB3aWxsCisgKiBjYXVzZSAiL3Vzci9iaW4vcGFzc3dkIiB0byBiZWxvbmcgdG8KKyAqICI8a2VybmVsPiAvdXNyL3NiaW4vc3NoZCAvYmluL2Jhc2ggL3Vzci9iaW4vcGFzc3dkIiBkb21haW4sIHVubGVzcworICogZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgImluaXRpYWxpemVfZG9tYWluIi4KKyAqLwogc3RhdGljIExJU1RfSEVBRCh0b21veW9fZG9tYWluX2tlZXBlcl9saXN0KTsKIHN0YXRpYyBERUNMQVJFX1JXU0VNKHRvbW95b19kb21haW5fa2VlcGVyX2xpc3RfbG9jayk7CiAKQEAgLTI5Niw3ICs0NDAsNiBAQAogCXN0cnVjdCB0b21veW9fZG9tYWluX2tlZXBlcl9lbnRyeSAqcHRyOwogCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpzYXZlZF9kb21haW5uYW1lOwogCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpzYXZlZF9wcm9ncmFtID0gTlVMTDsKLQlzdGF0aWMgREVGSU5FX01VVEVYKGxvY2spOwogCWludCBlcnJvciA9IC1FTk9NRU07CiAJYm9vbCBpc19sYXN0X25hbWUgPSBmYWxzZTsKIApAQCAtMzE1LDcgKzQ1OCw2IEBACiAJc2F2ZWRfZG9tYWlubmFtZSA9IHRvbW95b19zYXZlX25hbWUoZG9tYWlubmFtZSk7CiAJaWYgKCFzYXZlZF9kb21haW5uYW1lKQogCQlyZXR1cm4gLUVOT01FTTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gU1RBUlQgKioqKiovCiAJZG93bl93cml0ZSgmdG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ciwgJnRvbW95b19kb21haW5fa2VlcGVyX2xpc3QsIGxpc3QpIHsKIAkJaWYgKHB0ci0+aXNfbm90ICE9IGlzX25vdCB8fApAQCAtMzQxLDcgKzQ4Myw2IEBACiAJZXJyb3IgPSAwOwogIG91dDoKIAl1cF93cml0ZSgmdG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdF9sb2NrKTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gRU5EICoqKioqLwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzk0LDEzICs1MzUsMTIgQEAKIAkJCWZyb20gPSAiIGZyb20gIjsKIAkJCXByb2dyYW0gPSBwdHItPnByb2dyYW0tPm5hbWU7CiAJCX0KLQkJaWYgKCF0b21veW9faW9fcHJpbnRmKGhlYWQsCi0JCQkJICAgICAgIiVzIiBUT01PWU9fS0VZV09SRF9LRUVQX0RPTUFJTgotCQkJCSAgICAgICIlcyVzJXNcbiIsIG5vLCBwcm9ncmFtLCBmcm9tLAotCQkJCSAgICAgIHB0ci0+ZG9tYWlubmFtZS0+bmFtZSkpIHsKLQkJCWRvbmUgPSBmYWxzZTsKKwkJZG9uZSA9IHRvbW95b19pb19wcmludGYoaGVhZCwKKwkJCQkJIiVzIiBUT01PWU9fS0VZV09SRF9LRUVQX0RPTUFJTgorCQkJCQkiJXMlcyVzXG4iLCBubywgcHJvZ3JhbSwgZnJvbSwKKwkJCQkJcHRyLT5kb21haW5uYW1lLT5uYW1lKTsKKwkJaWYgKCFkb25lKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJdXBfcmVhZCgmdG9tb3lvX2RvbWFpbl9rZWVwZXJfbGlzdF9sb2NrKTsKIAlyZXR1cm4gZG9uZTsKQEAgLTQ0Niw3ICs1ODYsMzYgQEAKIAlyZXR1cm4gZmxhZzsKIH0KIAotLyogVGhlIGxpc3QgZm9yICJzdHJ1Y3QgdG9tb3lvX2FsaWFzX2VudHJ5Ii4gKi8KKy8qCisgKiB0b21veW9fYWxpYXNfbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2Ygc3ltbGluaydzIHBhdGhuYW1lcyB3aGljaCBhcmUKKyAqIGFsbG93ZWQgdG8gYmUgcGFzc2VkIHRvIGFuIGV4ZWN2ZSgpIHJlcXVlc3QuIE5vcm1hbGx5LCB0aGUgZG9tYWlubmFtZSB3aGljaAorICogdGhlIGN1cnJlbnQgcHJvY2VzcyB3aWxsIGJlbG9uZyB0byBhZnRlciBleGVjdmUoKSBzdWNjZWVkcyBpcyBjYWxjdWxhdGVkCisgKiB1c2luZyBkZXJlZmVyZW5jZWQgcGF0aG5hbWVzLiBCdXQgc29tZSBwcm9ncmFtcyBiZWhhdmUgZGlmZmVyZW50bHkgZGVwZW5kaW5nCisgKiBvbiB0aGUgbmFtZSBwYXNzZWQgdG8gYXJndlswXS4gRm9yIGJ1c3lib3gsIGNhbGN1bGF0aW5nIGRvbWFpbm5hbWUgdXNpbmcKKyAqIGRlcmVmZXJlbmNlZCBwYXRobmFtZXMgd2lsbCBjYXVzZSBhbGwgcHJvZ3JhbXMgaW4gdGhlIGJ1c3lib3ggdG8gYmVsb25nIHRvCisgKiB0aGUgc2FtZSBkb21haW4uIFRodXMsIFRPTU9ZTyBwcm92aWRlcyBhIHdheSB0byBhbGxvdyB1c2Ugb2Ygc3ltbGluaydzCisgKiBwYXRobmFtZSBmb3IgY2hlY2tpbmcgZXhlY3ZlKCkncyBwZXJtaXNzaW9uIGFuZCBjYWxjdWxhdGluZyBkb21haW5uYW1lIHdoaWNoCisgKiB0aGUgY3VycmVudCBwcm9jZXNzIHdpbGwgYmVsb25nIHRvIGFmdGVyIGV4ZWN2ZSgpIHN1Y2NlZWRzLgorICoKKyAqIEFuIGVudHJ5IGlzIGFkZGVkIGJ5CisgKgorICogIyBlY2hvICdhbGlhcyAvYmluL2J1c3lib3ggL2Jpbi9jYXQnID4gXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKKyAqCisgKiBhbmQgaXMgZGVsZXRlZCBieQorICoKKyAqICMgZWNobyAnZGVsZXRlIGFsaWFzIC9iaW4vYnVzeWJveCAvYmluL2NhdCcgPiBcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQorICoKKyAqIGFuZCBhbGwgZW50cmllcyBhcmUgcmV0cmlldmVkIGJ5CisgKgorICogIyBncmVwIF5hbGlhcyAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQorICoKKyAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpZiAvYmluL2NhdCBpcyBhIHN5bWxpbmsgdG8gL2Jpbi9idXN5Ym94IGFuZCBleGVjdXRpb24KKyAqIG9mIC9iaW4vY2F0IGlzIHJlcXVlc3RlZCwgcGVybWlzc2lvbiBpcyBjaGVja2VkIGZvciAvYmluL2NhdCByYXRoZXIgdGhhbgorICogL2Jpbi9idXN5Ym94IGFuZCBkb21haW5uYW1lIHdoaWNoIHRoZSBjdXJyZW50IHByb2Nlc3Mgd2lsbCBiZWxvbmcgdG8gYWZ0ZXIKKyAqIGV4ZWN2ZSgpIHN1Y2NlZWRzIGlzIGNhbGN1bGF0ZWQgdXNpbmcgL2Jpbi9jYXQgcmF0aGVyIHRoYW4gL2Jpbi9idXN5Ym94IC4KKyAqLwogc3RhdGljIExJU1RfSEVBRCh0b21veW9fYWxpYXNfbGlzdCk7CiBzdGF0aWMgREVDTEFSRV9SV1NFTSh0b21veW9fYWxpYXNfbGlzdF9sb2NrKTsKIApAQCAtNDc2LDcgKzY0NSw2IEBACiAJc2F2ZWRfYWxpYXNlZF9uYW1lID0gdG9tb3lvX3NhdmVfbmFtZShhbGlhc2VkX25hbWUpOwogCWlmICghc2F2ZWRfb3JpZ2luYWxfbmFtZSB8fCAhc2F2ZWRfYWxpYXNlZF9uYW1lKQogCQlyZXR1cm4gLUVOT01FTTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gU1RBUlQgKioqKiovCiAJZG93bl93cml0ZSgmdG9tb3lvX2FsaWFzX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwdHIsICZ0b21veW9fYWxpYXNfbGlzdCwgbGlzdCkgewogCQlpZiAocHRyLT5vcmlnaW5hbF9uYW1lICE9IHNhdmVkX29yaWdpbmFsX25hbWUgfHwKQEAgLTQ5OSw3ICs2NjcsNiBAQAogCWVycm9yID0gMDsKICBvdXQ6CiAJdXBfd3JpdGUoJnRvbW95b19hbGlhc19saXN0X2xvY2spOwotCS8qKioqKiBFWENMVVNJVkUgU0VDVElPTiBFTkQgKioqKiovCiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC01MjIsMTIgKzY4OSwxMSBAQAogCQlwdHIgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IHRvbW95b19hbGlhc19lbnRyeSwgbGlzdCk7CiAJCWlmIChwdHItPmlzX2RlbGV0ZWQpCiAJCQljb250aW51ZTsKLQkJaWYgKCF0b21veW9faW9fcHJpbnRmKGhlYWQsIFRPTU9ZT19LRVlXT1JEX0FMSUFTICIlcyAlc1xuIiwKLQkJCQkgICAgICBwdHItPm9yaWdpbmFsX25hbWUtPm5hbWUsCi0JCQkJICAgICAgcHRyLT5hbGlhc2VkX25hbWUtPm5hbWUpKSB7Ci0JCQlkb25lID0gZmFsc2U7CisJCWRvbmUgPSB0b21veW9faW9fcHJpbnRmKGhlYWQsIFRPTU9ZT19LRVlXT1JEX0FMSUFTICIlcyAlc1xuIiwKKwkJCQkJcHRyLT5vcmlnaW5hbF9uYW1lLT5uYW1lLAorCQkJCQlwdHItPmFsaWFzZWRfbmFtZS0+bmFtZSk7CisJCWlmICghZG9uZSkKIAkJCWJyZWFrOwotCQl9CiAJfQogCXVwX3JlYWQoJnRvbW95b19hbGlhc19saXN0X2xvY2spOwogCXJldHVybiBkb25lOwpAQCAtNTY3LDcgKzczMyw2IEBACiAKIAluYW1lLm5hbWUgPSBkb21haW5uYW1lOwogCXRvbW95b19maWxsX3BhdGhfaW5mbygmbmFtZSk7Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIFNUQVJUICoqKioqLwogCWRvd25fd3JpdGUoJnRvbW95b19kb21haW5fbGlzdF9sb2NrKTsKIAkvKiBJcyB0aGVyZSBhbiBhY3RpdmUgZG9tYWluPyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZG9tYWluLCAmdG9tb3lvX2RvbWFpbl9saXN0LCBsaXN0KSB7CkBAIC01ODEsNyArNzQ2LDYgQEAKIAkJYnJlYWs7CiAJfQogCXVwX3dyaXRlKCZ0b21veW9fZG9tYWluX2xpc3RfbG9jayk7Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIEVORCAqKioqKi8KIAlyZXR1cm4gMDsKIH0KIApAQCAtNjAwLDcgKzc2NCw2IEBACiAJc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluID0gTlVMTDsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqc2F2ZWRfZG9tYWlubmFtZTsKIAotCS8qKioqKiBFWENMVVNJVkUgU0VDVElPTiBTVEFSVCAqKioqKi8KIAlkb3duX3dyaXRlKCZ0b21veW9fZG9tYWluX2xpc3RfbG9jayk7CiAJZG9tYWluID0gdG9tb3lvX2ZpbmRfZG9tYWluKGRvbWFpbm5hbWUpOwogCWlmIChkb21haW4pCkBAIC02MTksNyArNzgyLDYgQEAKIAkJICAgIGRvbWFpbi0+ZG9tYWlubmFtZSAhPSBzYXZlZF9kb21haW5uYW1lKQogCQkJY29udGludWU7CiAJCWZsYWcgPSBmYWxzZTsKLQkJLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gU1RBUlQgKioqKiovCiAJCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CiAJCWZvcl9lYWNoX3Byb2Nlc3MocCkgewogCQkJaWYgKHRvbW95b19yZWFsX2RvbWFpbihwKSAhPSBkb21haW4pCkBAIC02MjgsNyArNzkwLDYgQEAKIAkJCWJyZWFrOwogCQl9CiAJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gRU5EICoqKioqLwogCQlpZiAoZmxhZykKIAkJCWNvbnRpbnVlOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ciwgJmRvbWFpbi0+YWNsX2luZm9fbGlzdCwgbGlzdCkgewpAQCAtNjUxLDcgKzgxMiw2IEBACiAJfQogIG91dDoKIAl1cF93cml0ZSgmdG9tb3lvX2RvbWFpbl9saXN0X2xvY2spOwotCS8qKioqKiBFWENMVVNJVkUgU0VDVElPTiBFTkQgKioqKiovCiAJcmV0dXJuIGRvbWFpbjsKIH0KIApAQCAtNzM5LDcgKzg5OSw3IEBACiAJfQogCiAJLyogQ2hlY2sgZXhlY3V0ZSBwZXJtaXNzaW9uLiAqLwotCXJldHZhbCA9IHRvbW95b19jaGVja19leGVjX3Blcm0ob2xkX2RvbWFpbiwgJnIsIHRtcCk7CisJcmV0dmFsID0gdG9tb3lvX2NoZWNrX2V4ZWNfcGVybShvbGRfZG9tYWluLCAmcik7CiAJaWYgKHJldHZhbCA8IDApCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vZmlsZS5jIGIvc2VjdXJpdHkvdG9tb3lvL2ZpbGUuYwppbmRleCAyMzE2ZGE4Li41YWUzYTU3IDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vZmlsZS5jCisrKyBiL3NlY3VyaXR5L3RvbW95by9maWxlLmMKQEAgLTE0LDIxICsxNCw1MCBAQAogI2luY2x1ZGUgInJlYWxwYXRoLmgiCiAjZGVmaW5lIEFDQ19NT0RFKHgpICgiXDAwMFwwMDRcMDAyXDAwNiJbKHgpJk9fQUNDTU9ERV0pCiAKLS8qIFN0cnVjdHVyZSBmb3IgImFsbG93X3JlYWQiIGtleXdvcmQuICovCisvKgorICogdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2ZpbGVfZW50cnkgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZworICogImFsbG93X3JlYWQiIGVudHJpZXMuCisgKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KKyAqCisgKiAgKDEpICJsaXN0IiB3aGljaCBpcyBsaW5rZWQgdG8gdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2xpc3QgLgorICogICgyKSAiZmlsZW5hbWUiIGlzIGEgcGF0aG5hbWUgd2hpY2ggaXMgYWxsb3dlZCB0byBvcGVuKE9fUkRPTkxZKS4KKyAqICAoMykgImlzX2RlbGV0ZWQiIGlzIGEgYm9vbCB3aGljaCBpcyB0cnVlIGlmIG1hcmtlZCBhcyBkZWxldGVkLCBmYWxzZQorICogICAgICBvdGhlcndpc2UuCisgKi8KIHN0cnVjdCB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfZmlsZV9lbnRyeSB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZTsKIAlib29sIGlzX2RlbGV0ZWQ7CiB9OwogCi0vKiBTdHJ1Y3R1cmUgZm9yICJmaWxlX3BhdHRlcm4iIGtleXdvcmQuICovCisvKgorICogdG9tb3lvX3BhdHRlcm5fZW50cnkgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZworICogInRvbW95b19wYXR0ZXJuX2xpc3QiIGVudHJpZXMuCisgKiBJdCBoYXMgZm9sbG93aW5nIGZpZWxkcy4KKyAqCisgKiAgKDEpICJsaXN0IiB3aGljaCBpcyBsaW5rZWQgdG8gdG9tb3lvX3BhdHRlcm5fbGlzdCAuCisgKiAgKDIpICJwYXR0ZXJuIiBpcyBhIHBhdGhuYW1lIHBhdHRlcm4gd2hpY2ggaXMgdXNlZCBmb3IgY29udmVydGluZyBwYXRobmFtZXMKKyAqICAgICAgdG8gcGF0aG5hbWUgcGF0dGVybnMgZHVyaW5nIGxlYXJuaW5nIG1vZGUuCisgKiAgKDMpICJpc19kZWxldGVkIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiBtYXJrZWQgYXMgZGVsZXRlZCwgZmFsc2UKKyAqICAgICAgb3RoZXJ3aXNlLgorICovCiBzdHJ1Y3QgdG9tb3lvX3BhdHRlcm5fZW50cnkgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqcGF0dGVybjsKIAlib29sIGlzX2RlbGV0ZWQ7CiB9OwogCi0vKiBTdHJ1Y3R1cmUgZm9yICJkZW55X3Jld3JpdGUiIGtleXdvcmQuICovCisvKgorICogdG9tb3lvX25vX3Jld3JpdGVfZW50cnkgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgaG9sZGluZworICogImRlbnlfcmV3cml0ZSIgZW50cmllcy4KKyAqIEl0IGhhcyBmb2xsb3dpbmcgZmllbGRzLgorICoKKyAqICAoMSkgImxpc3QiIHdoaWNoIGlzIGxpbmtlZCB0byB0b21veW9fbm9fcmV3cml0ZV9saXN0IC4KKyAqICAoMikgInBhdHRlcm4iIGlzIGEgcGF0aG5hbWUgd2hpY2ggaXMgYnkgZGVmYXVsdCBub3QgcGVybWl0dGVkIHRvIG1vZGlmeQorICogICAgICBhbHJlYWR5IGV4aXN0aW5nIGNvbnRlbnQuCisgKiAgKDMpICJpc19kZWxldGVkIiBpcyBhIGJvb2wgd2hpY2ggaXMgdHJ1ZSBpZiBtYXJrZWQgYXMgZGVsZXRlZCwgZmFsc2UKKyAqICAgICAgb3RoZXJ3aXNlLgorICovCiBzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGVfZW50cnkgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAljb25zdCBzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqcGF0dGVybjsKQEAgLTE0MSw3ICsxNzAsMzEgQEAKIAkJCQkJIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKgogCQkJCQkgY29uc3QgZG9tYWluLCBjb25zdCBib29sIGlzX2RlbGV0ZSk7CiAKLS8qIFRoZSBsaXN0IGZvciAic3RydWN0IHRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9maWxlX2VudHJ5Ii4gKi8KKy8qCisgKiB0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgcGF0aG5hbWVzIHdoaWNoCisgKiBhcmUgYnkgZGVmYXVsdCBhbGxvd2VkIHRvIGJlIG9wZW4oKWVkIGZvciByZWFkaW5nIGJ5IGFueSBwcm9jZXNzLgorICoKKyAqIEFuIGVudHJ5IGlzIGFkZGVkIGJ5CisgKgorICogIyBlY2hvICdhbGxvd19yZWFkIC9saWIvbGliYy0yLjUuc28nID4gXAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKKyAqCisgKiBhbmQgaXMgZGVsZXRlZCBieQorICoKKyAqICMgZWNobyAnZGVsZXRlIGFsbG93X3JlYWQgL2xpYi9saWJjLTIuNS5zbycgPiBcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQorICoKKyAqIGFuZCBhbGwgZW50cmllcyBhcmUgcmV0cmlldmVkIGJ5CisgKgorICogIyBncmVwIF5hbGxvd19yZWFkIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9leGNlcHRpb25fcG9saWN5CisgKgorICogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGFueSBwcm9jZXNzIGlzIGFsbG93ZWQgdG8KKyAqIG9wZW4oIi9saWIvbGliYy0yLjUuc28iLCBPX1JET05MWSkuCisgKiBPbmUgZXhjZXB0aW9uIGlzLCBpZiB0aGUgZG9tYWluIHdoaWNoIGN1cnJlbnQgcHJvY2VzcyBiZWxvbmdzIHRvIGlzIG1hcmtlZAorICogYXMgImlnbm9yZV9nbG9iYWxfYWxsb3dfcmVhZCIsIGN1cnJlbnQgcHJvY2VzcyBjYW4ndCBkbyBzbyB1bmxlc3MgZXhwbGljaXRseQorICogZ2l2ZW4gImFsbG93X3JlYWQgL2xpYi9saWJjLTIuNS5zbyIgdG8gdGhlIGRvbWFpbiB3aGljaCBjdXJyZW50IHByb2Nlc3MKKyAqIGJlbG9uZ3MgdG8uCisgKi8KIHN0YXRpYyBMSVNUX0hFQUQodG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2xpc3QpOwogc3RhdGljIERFQ0xBUkVfUldTRU0odG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2xpc3RfbG9jayk7CiAKQEAgLTE2Niw3ICsyMTksNiBAQAogCXNhdmVkX2ZpbGVuYW1lID0gdG9tb3lvX3NhdmVfbmFtZShmaWxlbmFtZSk7CiAJaWYgKCFzYXZlZF9maWxlbmFtZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIFNUQVJUICoqKioqLwogCWRvd25fd3JpdGUoJnRvbW95b19nbG9iYWxseV9yZWFkYWJsZV9saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocHRyLCAmdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2xpc3QsIGxpc3QpIHsKIAkJaWYgKHB0ci0+ZmlsZW5hbWUgIT0gc2F2ZWRfZmlsZW5hbWUpCkBAIC0xODcsNyArMjM5LDYgQEAKIAllcnJvciA9IDA7CiAgb3V0OgogCXVwX3dyaXRlKCZ0b21veW9fZ2xvYmFsbHlfcmVhZGFibGVfbGlzdF9sb2NrKTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gRU5EICoqKioqLwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMjQ5LDE3ICszMDAsNDQgQEAKIAkJCQkgbGlzdCk7CiAJCWlmIChwdHItPmlzX2RlbGV0ZWQpCiAJCQljb250aW51ZTsKLQkJaWYgKCF0b21veW9faW9fcHJpbnRmKGhlYWQsIFRPTU9ZT19LRVlXT1JEX0FMTE9XX1JFQUQgIiVzXG4iLAotCQkJCSAgICAgIHB0ci0+ZmlsZW5hbWUtPm5hbWUpKSB7Ci0JCQlkb25lID0gZmFsc2U7CisJCWRvbmUgPSB0b21veW9faW9fcHJpbnRmKGhlYWQsIFRPTU9ZT19LRVlXT1JEX0FMTE9XX1JFQUQgIiVzXG4iLAorCQkJCQlwdHItPmZpbGVuYW1lLT5uYW1lKTsKKwkJaWYgKCFkb25lKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJdXBfcmVhZCgmdG9tb3lvX2dsb2JhbGx5X3JlYWRhYmxlX2xpc3RfbG9jayk7CiAJcmV0dXJuIGRvbmU7CiB9CiAKLS8qIFRoZSBsaXN0IGZvciAic3RydWN0IHRvbW95b19wYXR0ZXJuX2VudHJ5Ii4gKi8KKy8qIHRvbW95b19wYXR0ZXJuX2xpc3QgaXMgdXNlZCBmb3IgaG9sZGluZyBsaXN0IG9mIHBhdGhuYW1lcyB3aGljaCBhcmUgdXNlZCBmb3IKKyAqIGNvbnZlcnRpbmcgcGF0aG5hbWVzIHRvIHBhdGhuYW1lIHBhdHRlcm5zIGR1cmluZyBsZWFybmluZyBtb2RlLgorICoKKyAqIEFuIGVudHJ5IGlzIGFkZGVkIGJ5CisgKgorICogIyBlY2hvICdmaWxlX3BhdHRlcm4gL3Byb2MvXCQvbW91bnRzJyA+IFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQorICoKKyAqIGFuZCBpcyBkZWxldGVkIGJ5CisgKgorICogIyBlY2hvICdkZWxldGUgZmlsZV9wYXR0ZXJuIC9wcm9jL1wkL21vdW50cycgPiBcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKKyAqCisgKiBhbmQgYWxsIGVudHJpZXMgYXJlIHJldHJpZXZlZCBieQorICoKKyAqICMgZ3JlcCBeZmlsZV9wYXR0ZXJuIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9leGNlcHRpb25fcG9saWN5CisgKgorICogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGlmIGEgcHJvY2VzcyB3aGljaCBiZWxvbmdzIHRvIGEgZG9tYWluIHdoaWNoIGlzIGluCisgKiBsZWFybmluZyBtb2RlIHJlcXVlc3RlZCBvcGVuKCIvcHJvYy8xL21vdW50cyIsIE9fUkRPTkxZKSwKKyAqICJhbGxvd19yZWFkIC9wcm9jL1wkL21vdW50cyIgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgZG9tYWluIHdoaWNoIHRoYXQKKyAqIHByb2Nlc3MgYmVsb25ncyB0by4KKyAqCisgKiBJdCBpcyBub3QgYSBkZXNpcmFibGUgYmVoYXZpb3IgdGhhdCB3ZSBoYXZlIHRvIHVzZSAvcHJvYy9cJC8gaW5zdGVhZCBvZgorICogL3Byb2Mvc2VsZi8gd2hlbiBjdXJyZW50IHByb2Nlc3MgbmVlZHMgdG8gYWNjZXNzIG9ubHkgY3VycmVudCBwcm9jZXNzJ3MKKyAqIGluZm9ybWF0aW9uLiBBcyBvZiBub3csIExTTSB2ZXJzaW9uIG9mIFRPTU9ZTyBpcyB1c2luZyBfX2RfcGF0aCgpIGZvcgorICogY2FsY3VsYXRpbmcgcGF0aG5hbWUuIE5vbiBMU00gdmVyc2lvbiBvZiBUT01PWU8gaXMgdXNpbmcgaXRzIG93biBmdW5jdGlvbgorICogd2hpY2ggcHJldGVuZHMgYXMgaWYgL3Byb2Mvc2VsZi8gaXMgbm90IGEgc3ltbGluazsgc28gdGhhdCB3ZSBjYW4gZm9yYmlkCisgKiBjdXJyZW50IHByb2Nlc3MgZnJvbSBhY2Nlc3Npbmcgb3RoZXIgcHJvY2VzcydzIGluZm9ybWF0aW9uLgorICovCiBzdGF0aWMgTElTVF9IRUFEKHRvbW95b19wYXR0ZXJuX2xpc3QpOwogc3RhdGljIERFQ0xBUkVfUldTRU0odG9tb3lvX3BhdHRlcm5fbGlzdF9sb2NrKTsKIApAQCAtMjg0LDcgKzM2Miw2IEBACiAJc2F2ZWRfcGF0dGVybiA9IHRvbW95b19zYXZlX25hbWUocGF0dGVybik7CiAJaWYgKCFzYXZlZF9wYXR0ZXJuKQogCQlyZXR1cm4gLUVOT01FTTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gU1RBUlQgKioqKiovCiAJZG93bl93cml0ZSgmdG9tb3lvX3BhdHRlcm5fbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB0ciwgJnRvbW95b19wYXR0ZXJuX2xpc3QsIGxpc3QpIHsKIAkJaWYgKHNhdmVkX3BhdHRlcm4gIT0gcHRyLT5wYXR0ZXJuKQpAQCAtMzA1LDcgKzM4Miw2IEBACiAJZXJyb3IgPSAwOwogIG91dDoKIAl1cF93cml0ZSgmdG9tb3lvX3BhdHRlcm5fbGlzdF9sb2NrKTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gRU5EICoqKioqLwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMzczLDE3ICs0NDksNDQgQEAKIAkJcHRyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCB0b21veW9fcGF0dGVybl9lbnRyeSwgbGlzdCk7CiAJCWlmIChwdHItPmlzX2RlbGV0ZWQpCiAJCQljb250aW51ZTsKLQkJaWYgKCF0b21veW9faW9fcHJpbnRmKGhlYWQsIFRPTU9ZT19LRVlXT1JEX0ZJTEVfUEFUVEVSTiAiJXNcbiIsCi0JCQkJICAgICAgcHRyLT5wYXR0ZXJuLT5uYW1lKSkgewotCQkJZG9uZSA9IGZhbHNlOworCQlkb25lID0gdG9tb3lvX2lvX3ByaW50ZihoZWFkLCBUT01PWU9fS0VZV09SRF9GSUxFX1BBVFRFUk4KKwkJCQkJIiVzXG4iLCBwdHItPnBhdHRlcm4tPm5hbWUpOworCQlpZiAoIWRvbmUpCiAJCQlicmVhazsKLQkJfQogCX0KIAl1cF9yZWFkKCZ0b21veW9fcGF0dGVybl9saXN0X2xvY2spOwogCXJldHVybiBkb25lOwogfQogCi0vKiBUaGUgbGlzdCBmb3IgInN0cnVjdCB0b21veW9fbm9fcmV3cml0ZV9lbnRyeSIuICovCisvKgorICogdG9tb3lvX25vX3Jld3JpdGVfbGlzdCBpcyB1c2VkIGZvciBob2xkaW5nIGxpc3Qgb2YgcGF0aG5hbWVzIHdoaWNoIGFyZSBieQorICogZGVmYXVsdCBmb3JiaWRkZW4gdG8gbW9kaWZ5IGFscmVhZHkgd3JpdHRlbiBjb250ZW50IG9mIGEgZmlsZS4KKyAqCisgKiBBbiBlbnRyeSBpcyBhZGRlZCBieQorICoKKyAqICMgZWNobyAnZGVueV9yZXdyaXRlIC92YXIvbG9nL21lc3NhZ2VzJyA+IFwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL3N5cy9rZXJuZWwvc2VjdXJpdHkvdG9tb3lvL2V4Y2VwdGlvbl9wb2xpY3kKKyAqCisgKiBhbmQgaXMgZGVsZXRlZCBieQorICoKKyAqICMgZWNobyAnZGVsZXRlIGRlbnlfcmV3cml0ZSAvdmFyL2xvZy9tZXNzYWdlcycgPiBcCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zeXMva2VybmVsL3NlY3VyaXR5L3RvbW95by9leGNlcHRpb25fcG9saWN5CisgKgorICogYW5kIGFsbCBlbnRyaWVzIGFyZSByZXRyaWV2ZWQgYnkKKyAqCisgKiAjIGdyZXAgXmRlbnlfcmV3cml0ZSAvc3lzL2tlcm5lbC9zZWN1cml0eS90b21veW8vZXhjZXB0aW9uX3BvbGljeQorICoKKyAqIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpZiBhIHByb2Nlc3MgcmVxdWVzdGVkIHRvIHJld3JpdGUgL3Zhci9sb2cvbWVzc2FnZXMgLAorICogdGhlIHByb2Nlc3MgY2FuJ3QgcmV3cml0ZSB1bmxlc3MgdGhlIGRvbWFpbiB3aGljaCB0aGF0IHByb2Nlc3MgYmVsb25ncyB0bworICogaGFzICJhbGxvd19yZXdyaXRlIC92YXIvbG9nL21lc3NhZ2VzIiBlbnRyeS4KKyAqCisgKiBJdCBpcyBub3QgYSBkZXNpcmFibGUgYmVoYXZpb3IgdGhhdCB3ZSBoYXZlIHRvIGFkZCAiXDA0MChkZWxldGVkKSIgc3VmZml4CisgKiB3aGVuIHdlIHdhbnQgdG8gYWxsb3cgcmV3cml0aW5nIGFscmVhZHkgdW5saW5rKCllZCBmaWxlLiBBcyBvZiBub3csCisgKiBMU00gdmVyc2lvbiBvZiBUT01PWU8gaXMgdXNpbmcgX19kX3BhdGgoKSBmb3IgY2FsY3VsYXRpbmcgcGF0aG5hbWUuCisgKiBOb24gTFNNIHZlcnNpb24gb2YgVE9NT1lPIGlzIHVzaW5nIGl0cyBvd24gZnVuY3Rpb24gd2hpY2ggZG9lc24ndCBhcHBlbmQKKyAqICIgKGRlbGV0ZWQpIiBzdWZmaXggaWYgdGhlIGZpbGUgaXMgYWxyZWFkeSB1bmxpbmsoKWVkOyBzbyB0aGF0IHdlIGRvbid0CisgKiBuZWVkIHRvIHdvcnJ5IHdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSB1bmxpbmsoKWVkIG9yIG5vdC4KKyAqLwogc3RhdGljIExJU1RfSEVBRCh0b21veW9fbm9fcmV3cml0ZV9saXN0KTsKIHN0YXRpYyBERUNMQVJFX1JXU0VNKHRvbW95b19ub19yZXdyaXRlX2xpc3RfbG9jayk7CiAKQEAgLTQwNyw3ICs1MTAsNiBAQAogCXNhdmVkX3BhdHRlcm4gPSB0b21veW9fc2F2ZV9uYW1lKHBhdHRlcm4pOwogCWlmICghc2F2ZWRfcGF0dGVybikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIFNUQVJUICoqKioqLwogCWRvd25fd3JpdGUoJnRvbW95b19ub19yZXdyaXRlX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwdHIsICZ0b21veW9fbm9fcmV3cml0ZV9saXN0LCBsaXN0KSB7CiAJCWlmIChwdHItPnBhdHRlcm4gIT0gc2F2ZWRfcGF0dGVybikKQEAgLTQyOCw3ICs1MzAsNiBAQAogCWVycm9yID0gMDsKICBvdXQ6CiAJdXBfd3JpdGUoJnRvbW95b19ub19yZXdyaXRlX2xpc3RfbG9jayk7Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIEVORCAqKioqKi8KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTQ4OSwxMSArNTkwLDEwIEBACiAJCXB0ciA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgdG9tb3lvX25vX3Jld3JpdGVfZW50cnksIGxpc3QpOwogCQlpZiAocHRyLT5pc19kZWxldGVkKQogCQkJY29udGludWU7Ci0JCWlmICghdG9tb3lvX2lvX3ByaW50ZihoZWFkLCBUT01PWU9fS0VZV09SRF9ERU5ZX1JFV1JJVEUgIiVzXG4iLAotCQkJCSAgICAgIHB0ci0+cGF0dGVybi0+bmFtZSkpIHsKLQkJCWRvbmUgPSBmYWxzZTsKKwkJZG9uZSA9IHRvbW95b19pb19wcmludGYoaGVhZCwgVE9NT1lPX0tFWVdPUkRfREVOWV9SRVdSSVRFCisJCQkJCSIlc1xuIiwgcHRyLT5wYXR0ZXJuLT5uYW1lKTsKKwkJaWYgKCFkb25lKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJdXBfcmVhZCgmdG9tb3lvX25vX3Jld3JpdGVfbGlzdF9sb2NrKTsKIAlyZXR1cm4gZG9uZTsKQEAgLTc0NSw3ICs4NDUsNiBAQAogCXNhdmVkX2ZpbGVuYW1lID0gdG9tb3lvX3NhdmVfbmFtZShmaWxlbmFtZSk7CiAJaWYgKCFzYXZlZF9maWxlbmFtZSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIFNUQVJUICoqKioqLwogCWRvd25fd3JpdGUoJnRvbW95b19kb21haW5fYWNsX2luZm9fbGlzdF9sb2NrKTsKIAlpZiAoaXNfZGVsZXRlKQogCQlnb3RvIGRlbGV0ZTsKQEAgLTgwMCw3ICs4OTksNiBAQAogCX0KICBvdXQ6CiAJdXBfd3JpdGUoJnRvbW95b19kb21haW5fYWNsX2luZm9fbGlzdF9sb2NrKTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gRU5EICoqKioqLwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtODM2LDcgKzkzNCw2IEBACiAJc2F2ZWRfZmlsZW5hbWUyID0gdG9tb3lvX3NhdmVfbmFtZShmaWxlbmFtZTIpOwogCWlmICghc2F2ZWRfZmlsZW5hbWUxIHx8ICFzYXZlZF9maWxlbmFtZTIpCiAJCXJldHVybiAtRU5PTUVNOwotCS8qKioqKiBFWENMVVNJVkUgU0VDVElPTiBTVEFSVCAqKioqKi8KIAlkb3duX3dyaXRlKCZ0b21veW9fZG9tYWluX2FjbF9pbmZvX2xpc3RfbG9jayk7CiAJaWYgKGlzX2RlbGV0ZSkKIAkJZ290byBkZWxldGU7CkBAIC04ODQsNyArOTgxLDYgQEAKIAl9CiAgb3V0OgogCXVwX3dyaXRlKCZ0b21veW9fZG9tYWluX2FjbF9pbmZvX2xpc3RfbG9jayk7Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIEVORCAqKioqKi8KIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTEwMjUsMTMgKzExMjEsMTEgQEAKICAqCiAgKiBAZG9tYWluOiAgIFBvaW50ZXIgdG8gInN0cnVjdCB0b21veW9fZG9tYWluX2luZm8iLgogICogQGZpbGVuYW1lOiBDaGVjayBwZXJtaXNzaW9uIGZvciAiZXhlY3V0ZSIuCi0gKiBAdG1wOiAgICAgIEJ1ZmZlciBmb3IgdGVtcG9yYXJ5IHVzZS4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmV2YWx1ZSBvdGhlcndpc2UuCiAgKi8KIGludCB0b21veW9fY2hlY2tfZXhlY19wZXJtKHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiwKLQkJCSAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSwKLQkJCSAgIHN0cnVjdCB0b21veW9fcGFnZV9idWZmZXIgKnRtcCkKKwkJCSAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSkKIHsKIAljb25zdCB1OCBtb2RlID0gdG9tb3lvX2NoZWNrX2ZsYWdzKGRvbWFpbiwgVE9NT1lPX01BQ19GT1JfRklMRSk7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9yZWFscGF0aC5jIGIvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKaW5kZXggNDA5MjdhOC4uNWYyZTMzMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKKysrIGIvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMKQEAgLTIyMCw3ICsyMjAsNiBAQAogCQk9IHJvdW5kdXAoc2l6ZSwgbWF4KHNpemVvZih2b2lkICopLCBzaXplb2YobG9uZykpKTsKIAlpZiAod29yZF9hbGlnbmVkX3NpemUgPiBQQVRIX01BWCkKIAkJcmV0dXJuIE5VTEw7Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIFNUQVJUICoqKioqLwogCW11dGV4X2xvY2soJmxvY2spOwogCWlmIChidWZfdXNlZF9sZW4gKyB3b3JkX2FsaWduZWRfc2l6ZSA+IFBBVEhfTUFYKSB7CiAJCWlmICghdG9tb3lvX3F1b3RhX2Zvcl9lbGVtZW50cyB8fApAQCAtMjUxLDcgKzI1MCw2IEBACiAJCX0KIAl9CiAJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKLQkvKioqKiogRVhDTFVTSVZFIFNFQ1RJT04gRU5EICoqKioqLwogCXJldHVybiBwdHI7CiB9CiAKQEAgLTI2Nyw3ICsyNjUsMTYgQEAKICAqLwogI2RlZmluZSBUT01PWU9fTUFYX0hBU0ggMjU2CiAKLS8qIFN0cnVjdHVyZSBmb3Igc3RyaW5nIGRhdGEuICovCisvKgorICogdG9tb3lvX25hbWVfZW50cnkgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCBmb3IgbGlua2luZworICogInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIiBpbnRvIHRvbW95b19uYW1lX2xpc3QgLgorICoKKyAqIFNpbmNlIHRvbW95b19uYW1lX2xpc3QgbWFuYWdlcyBhIGxpc3Qgb2Ygc3RyaW5ncyB3aGljaCBhcmUgc2hhcmVkIGJ5CisgKiBtdWx0aXBsZSBwcm9jZXNzZXMgKHdoZXJlYXMgInN0cnVjdCB0b21veW9fcGF0aF9pbmZvIiBpbnNpZGUKKyAqICJzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mb193aXRoX2RhdGEiIGlzIG5vdCBzaGFyZWQpLCBhIHJlZmVyZW5jZSBjb3VudGVyIHdpbGwKKyAqIGJlIGFkZGVkIHRvICJzdHJ1Y3QgdG9tb3lvX25hbWVfZW50cnkiIHJhdGhlciB0aGFuICJzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyIKKyAqIHdoZW4gVE9NT1lPIHN0YXJ0cyBzdXBwb3J0aW5nIGdhcmJhZ2UgY29sbGVjdG9yLgorICovCiBzdHJ1Y3QgdG9tb3lvX25hbWVfZW50cnkgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyBlbnRyeTsKQEAgLTI4MSwxMCArMjg4LDEwIEBACiB9OwogCiAvKgotICogVGhlIGxpc3QgZm9yICJzdHJ1Y3QgdG9tb3lvX25hbWVfZW50cnkiLgotICoKLSAqIFRoaXMgbGlzdCBpcyB1cGRhdGVkIG9ubHkgaW5zaWRlIHRvbW95b19zYXZlX25hbWUoKSwgdGh1cwotICogbm8gZ2xvYmFsIG11dGV4IGV4aXN0cy4KKyAqIHRvbW95b19uYW1lX2xpc3QgaXMgdXNlZCBmb3IgaG9sZGluZyBzdHJpbmcgZGF0YSB1c2VkIGJ5IFRPTU9ZTy4KKyAqIFNpbmNlIHNhbWUgc3RyaW5nIGRhdGEgaXMgbGlrZWx5IHVzZWQgZm9yIG11bHRpcGxlIHRpbWVzIChlLmcuCisgKiAiL2xpYi9saWJjLTIuNS5zbyIpLCBUT01PWU8gc2hhcmVzIHN0cmluZyBkYXRhIGluIHRoZSBmb3JtIG9mCisgKiAiY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKiIuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIHRvbW95b19uYW1lX2xpc3RbVE9NT1lPX01BWF9IQVNIXTsKIApAQCAtMzE4LDcgKzMyNSw2IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAloYXNoID0gZnVsbF9uYW1lX2hhc2goKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbmFtZSwgbGVuIC0gMSk7Ci0JLyoqKioqIEVYQ0xVU0lWRSBTRUNUSU9OIFNUQVJUICoqKioqLwogCW11dGV4X2xvY2soJmxvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocHRyLCAmdG9tb3lvX25hbWVfbGlzdFtoYXNoICUgVE9NT1lPX01BWF9IQVNIXSwKIAkJCSAgICAgbGlzdCkgewpAQCAtMzY2LDcgKzM3Miw2IEBACiAJfQogIG91dDoKIAltdXRleF91bmxvY2soJmxvY2spOwotCS8qKioqKiBFWENMVVNJVkUgU0VDVElPTiBFTkQgKioqKiovCiAJcmV0dXJuIHB0ciA/ICZwdHItPmVudHJ5IDogTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL3RvbW95by5jIGIvc2VjdXJpdHkvdG9tb3lvL3RvbW95by5jCmluZGV4IGU0MmJlNWMuLjMxOTRkMDkgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3RvbW95by90b21veW8uYworKysgYi9zZWN1cml0eS90b21veW8vdG9tb3lvLmMKQEAgLTI2Miw2ICsyNjIsMTAgQEAKIAlyZXR1cm4gdG9tb3lvX2NoZWNrX29wZW5fcGVybWlzc2lvbih0b21veW9fZG9tYWluKCksICZmLT5mX3BhdGgsIGZsYWdzKTsKIH0KIAorLyoKKyAqIHRvbW95b19zZWN1cml0eV9vcHMgaXMgYSAic3RydWN0IHNlY3VyaXR5X29wZXJhdGlvbnMiIHdoaWNoIGlzIHVzZWQgZm9yCisgKiByZWdpc3RlcmluZyBUT01PWU8uCisgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2VjdXJpdHlfb3BlcmF0aW9ucyB0b21veW9fc2VjdXJpdHlfb3BzID0gewogCS5uYW1lICAgICAgICAgICAgICAgID0gInRvbW95byIsCiAJLmNyZWRfcHJlcGFyZSAgICAgICAgPSB0b21veW9fY3JlZF9wcmVwYXJlLApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL3RvbW95by5oIGIvc2VjdXJpdHkvdG9tb3lvL3RvbW95by5oCmluZGV4IDQxYzZlYmEuLjBmZDU4OGEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3RvbW95by90b21veW8uaAorKysgYi9zZWN1cml0eS90b21veW8vdG9tb3lvLmgKQEAgLTE3LDEzICsxNywxMSBAQAogc3RydWN0IGlub2RlOwogc3RydWN0IGxpbnV4X2JpbnBybTsKIHN0cnVjdCBwdF9yZWdzOwotc3RydWN0IHRvbW95b19wYWdlX2J1ZmZlcjsKIAogaW50IHRvbW95b19jaGVja19maWxlX3Blcm0oc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLAogCQkJICAgY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IHU4IHBlcm0pOwogaW50IHRvbW95b19jaGVja19leGVjX3Blcm0oc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLAotCQkJICAgY29uc3Qgc3RydWN0IHRvbW95b19wYXRoX2luZm8gKmZpbGVuYW1lLAotCQkJICAgc3RydWN0IHRvbW95b19wYWdlX2J1ZmZlciAqYnVmKTsKKwkJCSAgIGNvbnN0IHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpmaWxlbmFtZSk7CiBpbnQgdG9tb3lvX2NoZWNrX29wZW5fcGVybWlzc2lvbihzdHJ1Y3QgdG9tb3lvX2RvbWFpbl9pbmZvICpkb21haW4sCiAJCQkJIHN0cnVjdCBwYXRoICpwYXRoLCBjb25zdCBpbnQgZmxhZyk7CiBpbnQgdG9tb3lvX2NoZWNrXzFwYXRoX3Blcm0oc3RydWN0IHRvbW95b19kb21haW5faW5mbyAqZG9tYWluLApAQCAtOTAsMTcgKzg4LDEwIEBACiAJcmV0dXJuIGN1cnJlbnRfY3JlZCgpLT5zZWN1cml0eTsKIH0KIAotLyogQ2FsbGVyIGhvbGRzIHRhc2tsaXN0X2xvY2sgc3BpbmxvY2suICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKnRvbW95b19yZWFsX2RvbWFpbihzdHJ1Y3QgdGFza19zdHJ1Y3QKIAkJCQkJCQkgICAgKnRhc2spCiB7Ci0JLyoqKioqIENSSVRJQ0FMIFNFQ1RJT04gU1RBUlQgKioqKiovCi0JY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBnZXRfdGFza19jcmVkKHRhc2spOwotCXN0cnVjdCB0b21veW9fZG9tYWluX2luZm8gKmRvbWFpbiA9IGNyZWQtPnNlY3VyaXR5OwotCi0JcHV0X2NyZWQoY3JlZCk7Ci0JcmV0dXJuIGRvbWFpbjsKLQkvKioqKiogQ1JJVElDQUwgU0VDVElPTiBFTkQgKioqKiovCisJcmV0dXJuIHRhc2tfY3JlZF94eHgodGFzaywgc2VjdXJpdHkpOwogfQogCiAjZW5kaWYgLyogIWRlZmluZWQoX1NFQ1VSSVRZX1RPTU9ZT19UT01PWU9fSCkgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9LY29uZmlnIGIvc291bmQvb3NzL0tjb25maWcKaW5kZXggMWNhNzQyNy4uYmNmMmEwNiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL0tjb25maWcKKysrIGIvc291bmQvb3NzL0tjb25maWcKQEAgLTU2MSw3ICs1NjEsNyBAQAogCiBjb25maWcgU09VTkRfU0hfREFDX0FVRElPCiAJdHJpc3RhdGUgIlN1cGVySCBEQUMgYXVkaW8gc3VwcG9ydCIKLQlkZXBlbmRzIG9uIENQVV9TSDMKKwlkZXBlbmRzIG9uIENQVV9TSDMgJiYgSElHSF9SRVNfVElNRVJTCiAKIGNvbmZpZyBTT1VORF9TSF9EQUNfQVVESU9fQ0hBTk5FTAogCWludCAiREFDIGNoYW5uZWwiCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMgYi9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMKaW5kZXggNzhjZmI2Ni4uYjJlZDg3NSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NoX2RhY19hdWRpby5jCisrKyBiL3NvdW5kL29zcy9zaF9kYWNfYXVkaW8uYwpAQCAtMTgsNDcgKzE4LDM2IEBACiAjaW5jbHVkZSA8bGludXgvc291bmQuaD4KICNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KLSNpbmNsdWRlIDxhc20vY3B1L3RpbWVyLmg+CisjaW5jbHVkZSA8Y3B1L2RhYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8bWFjaC9ocDZ4eC5oPgogI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CiAKICNkZWZpbmUgTU9ETkFNRSAic2hfZGFjX2F1ZGlvIgogCi0jZGVmaW5lIFRNVV9UT0NSX0lOSVQJMHgwMAotCi0jZGVmaW5lIFRNVTFfVENSX0lOSVQJMHgwMDIwCS8qIENsb2NrLzQsIHJpc2luZyBlZGdlOyBpbnRlcnJ1cHQgb24gKi8KLSNkZWZpbmUgVE1VMV9UU1RSX0lOSVQgIDB4MDIJLyogQml0IHRvIHR1cm4gb24gVE1VMSAqLwotCiAjZGVmaW5lIEJVRkZFUl9TSVpFIDQ4MDAwCiAKIHN0YXRpYyBpbnQgcmF0ZTsKIHN0YXRpYyBpbnQgZW1wdHk7CiBzdGF0aWMgY2hhciAqZGF0YV9idWZmZXIsICpidWZmZXJfYmVnaW4sICpidWZmZXJfZW5kOwogc3RhdGljIGludCBpbl91c2UsIGRldmljZV9tYWpvcjsKK3N0YXRpYyBzdHJ1Y3QgaHJ0aW1lciBocnRpbWVyOworc3RhdGljIGt0aW1lX3Qgd2FrZXVwc19wZXJfc2Vjb25kOwogCiBzdGF0aWMgdm9pZCBkYWNfYXVkaW9fc3RhcnRfdGltZXIodm9pZCkKIHsKLQl1OCB0c3RyOwotCi0JdHN0ciA9IGN0cmxfaW5iKFRNVV9UU1RSKTsKLQl0c3RyIHw9IFRNVTFfVFNUUl9JTklUOwotCWN0cmxfb3V0Yih0c3RyLCBUTVVfVFNUUik7CisJaHJ0aW1lcl9zdGFydCgmaHJ0aW1lciwgd2FrZXVwc19wZXJfc2Vjb25kLCBIUlRJTUVSX01PREVfUkVMKTsKIH0KIAogc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3N0b3BfdGltZXIodm9pZCkKIHsKLQl1OCB0c3RyOwotCi0JdHN0ciA9IGN0cmxfaW5iKFRNVV9UU1RSKTsKLQl0c3RyICY9IH5UTVUxX1RTVFJfSU5JVDsKLQljdHJsX291dGIodHN0ciwgVE1VX1RTVFIpOworCWhydGltZXJfY2FuY2VsKCZocnRpbWVyKTsKIH0KIAogc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3Jlc2V0KHZvaWQpCkBAIC03NywzOCArNjYsMzAgQEAKIHN0YXRpYyB2b2lkIGRhY19hdWRpb19zdGFydCh2b2lkKQogewogCWlmIChtYWNoX2lzX2hwNnh4KCkpIHsKLQkJdTE2IHYgPSBpbncoSEQ2NDQ2MV9HUEFEUik7CisJCXUxNiB2ID0gX19yYXdfcmVhZHcoSEQ2NDQ2MV9HUEFEUik7CiAJCXYgJj0gfkhENjQ0NjFfR1BBRFJfU1BFQUtFUjsKLQkJb3V0dyh2LCBIRDY0NDYxX0dQQURSKTsKKwkJX19yYXdfd3JpdGV3KHYsIEhENjQ0NjFfR1BBRFIpOwogCX0KIAogCXNoX2RhY19lbmFibGUoQ09ORklHX1NPVU5EX1NIX0RBQ19BVURJT19DSEFOTkVMKTsKLQljdHJsX291dHcoVE1VMV9UQ1JfSU5JVCwgVE1VMV9UQ1IpOwogfQogc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3N0b3Aodm9pZCkKIHsKIAlkYWNfYXVkaW9fc3RvcF90aW1lcigpOwogCiAJaWYgKG1hY2hfaXNfaHA2eHgoKSkgewotCQl1MTYgdiA9IGludyhIRDY0NDYxX0dQQURSKTsKKwkJdTE2IHYgPSBfX3Jhd19yZWFkdyhIRDY0NDYxX0dQQURSKTsKIAkJdiB8PSBIRDY0NDYxX0dQQURSX1NQRUFLRVI7Ci0JCW91dHcodiwgSEQ2NDQ2MV9HUEFEUik7CisJCV9fcmF3X3dyaXRldyh2LCBIRDY0NDYxX0dQQURSKTsKIAl9CiAKLSAJc2hfZGFjX291dHB1dCgwLCBDT05GSUdfU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUwpOworCXNoX2RhY19vdXRwdXQoMCwgQ09ORklHX1NPVU5EX1NIX0RBQ19BVURJT19DSEFOTkVMKTsKIAlzaF9kYWNfZGlzYWJsZShDT05GSUdfU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUwpOwogfQogCiBzdGF0aWMgdm9pZCBkYWNfYXVkaW9fc2V0X3JhdGUodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGludGVydmFsOwotIAlzdHJ1Y3QgY2xrICpjbGs7Ci0KLSAJY2xrID0gY2xrX2dldChOVUxMLCAibW9kdWxlX2NsayIpOwotIAlpbnRlcnZhbCA9IChjbGtfZ2V0X3JhdGUoY2xrKSAvIDQpIC8gcmF0ZTsKLSAJY2xrX3B1dChjbGspOwotCWN0cmxfb3V0bChpbnRlcnZhbCwgVE1VMV9UQ09SKTsKLQljdHJsX291dGwoaW50ZXJ2YWwsIFRNVTFfVENOVCk7CisJd2FrZXVwc19wZXJfc2Vjb25kID0ga3RpbWVfc2V0KDAsIDEwMDAwMDAwMDAgLyByYXRlKTsKIH0KIAogc3RhdGljIGludCBkYWNfYXVkaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0yNjUsMzIgKzI0NiwyNiBAQAogICAgICAgLnJlbGVhc2UgPQlkYWNfYXVkaW9fcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcjFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldikKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBzaF9kYWNfYXVkaW9fdGltZXIoc3RydWN0IGhydGltZXIgKmhhbmRsZSkKIHsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXR1czsKLQotCXRpbWVyX3N0YXR1cyA9IGN0cmxfaW53KFRNVTFfVENSKTsKLQl0aW1lcl9zdGF0dXMgJj0gfjB4MTAwOwotCWN0cmxfb3V0dyh0aW1lcl9zdGF0dXMsIFRNVTFfVENSKTsKLQogCWlmICghZW1wdHkpIHsKIAkJc2hfZGFjX291dHB1dCgqYnVmZmVyX2JlZ2luLCBDT05GSUdfU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUwpOwogCQlidWZmZXJfYmVnaW4rKzsKIAogCQlpZiAoYnVmZmVyX2JlZ2luID09IGRhdGFfYnVmZmVyICsgQlVGRkVSX1NJWkUpCiAJCQlidWZmZXJfYmVnaW4gPSBkYXRhX2J1ZmZlcjsKLQkJaWYgKGJ1ZmZlcl9iZWdpbiA9PSBidWZmZXJfZW5kKSB7CisJCWlmIChidWZmZXJfYmVnaW4gPT0gYnVmZmVyX2VuZCkKIAkJCWVtcHR5ID0gMTsKLQkJCWRhY19hdWRpb19zdG9wX3RpbWVyKCk7Ci0JCX0KIAl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCisJaWYgKCFlbXB0eSkKKwkJaHJ0aW1lcl9zdGFydCgmaHJ0aW1lciwgd2FrZXVwc19wZXJfc2Vjb25kLCBIUlRJTUVSX01PREVfUkVMKTsKKworCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKIH0KIAogc3RhdGljIGludCBfX2luaXQgZGFjX2F1ZGlvX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0dmFsOwotCiAJaWYgKChkZXZpY2VfbWFqb3IgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmRhY19hdWRpb19mb3BzLCAtMSkpIDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCByZWdpc3RlciBkc3AgZGV2aWNlIik7CiAJCXJldHVybiBkZXZpY2VfbWFqb3I7CkBAIC0zMDYsMjEgKzI4MSwyNSBAQAogCXJhdGUgPSA4MDAwOwogCWRhY19hdWRpb19zZXRfcmF0ZSgpOwogCi0JcmV0dmFsID0KLQkgICAgcmVxdWVzdF9pcnEoVElNRVIxX0lSUSwgdGltZXIxX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwgTU9ETkFNRSwgMCk7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzaF9kYWNfYXVkaW86IElSUSAlZCByZXF1ZXN0IGZhaWxlZFxuIiwKLQkJICAgICAgIFRJTUVSMV9JUlEpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KKwkvKiBUb2RheTogSGlnaCBSZXNvbHV0aW9uIFRpbWVyIGRyaXZlbiBEQUMgcGxheWJhY2suCisJICogVGhlIHRpbWVyIGNhbGxiYWNrIGdldHMgY2FsbGVkIG9uY2UgcGVyIHNhbXBsZS4gT3VjaC4KKwkgKgorCSAqIEZ1dHVyZTogQSBtdWNoIGJldHRlciBhcHByb2FjaCB3b3VsZCBiZSB0byB1c2UgdGhlCisJICogU0g3NzIwIENNVCtETUFDK0RBQyBoYXJkd2FyZSBjb21iaW5hdGlvbiBsaWtlIHRoaXM6CisJICogLSBQcm9ncmFtIHNhbXBsZSByYXRlIHVzaW5nIENNVDAgb3IgQ01UMQorCSAqIC0gUHJvZ3JhbSBETUFDIHRvIHVzZSBDTVQgZm9yIHRpbWluZyBhbmQgb3V0cHV0IHRvIERBQworCSAqIC0gUGxheSBzb3VuZCB1c2luZyBETUFDLCBsZXQgQ1BVIHNsZWVwLgorCSAqIC0gV2hpbGUgYXQgaXQsIHJld3JpdGUgdGhpcyBkcml2ZXIgdG8gdXNlIEFMU0EuCisJICovCisKKwlocnRpbWVyX2luaXQoJmhydGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJaHJ0aW1lci5mdW5jdGlvbiA9IHNoX2RhY19hdWRpb190aW1lcjsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZGFjX2F1ZGlvX2V4aXQodm9pZCkKIHsKLQlmcmVlX2lycShUSU1FUjFfSVJRLCAwKTsKLQogCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldmljZV9tYWpvcik7CiAJa2ZyZWUoKHZvaWQgKilkYXRhX2J1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmLy5naXRpZ25vcmUgYi90b29scy9wZXJmLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5YTc1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDE2IEBACitQRVJGLUJVSUxELU9QVElPTlMKK1BFUkYtQ0ZMQUdTCitQRVJGLUdVSS1WQVJTCitQRVJGLVZFUlNJT04tRklMRQorcGVyZgorcGVyZi1oZWxwCitwZXJmLXJlY29yZAorcGVyZi1yZXBvcnQKK3BlcmYtc3RhdAorcGVyZi10b3AKK3BlcmYqLjEKK3BlcmYqLnhtbAorY29tbW9uLWNtZHMuaAordGFncworVEFHUworY3Njb3BlKgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTcxOTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vTWFrZWZpbGUKQEAgLTAsMCArMSwzMDAgQEAKK01BTjFfVFhUPSBcCisJJChmaWx0ZXItb3V0ICQoYWRkc3VmZml4IC50eHQsICQoQVJUSUNMRVMpICQoU1BfQVJUSUNMRVMpKSwgXAorCQkkKHdpbGRjYXJkIHBlcmYtKi50eHQpKSBcCisJcGVyZi50eHQKK01BTjVfVFhUPQorTUFON19UWFQ9CisKK01BTl9UWFQgPSAkKE1BTjFfVFhUKSAkKE1BTjVfVFhUKSAkKE1BTjdfVFhUKQorTUFOX1hNTD0kKHBhdHN1YnN0ICUudHh0LCUueG1sLCQoTUFOX1RYVCkpCitNQU5fSFRNTD0kKHBhdHN1YnN0ICUudHh0LCUuaHRtbCwkKE1BTl9UWFQpKQorCitET0NfSFRNTD0kKE1BTl9IVE1MKQorCitBUlRJQ0xFUyA9CisjIHdpdGggdGhlaXIgb3duIGZvcm1hdHRpbmcgcnVsZXMuCitTUF9BUlRJQ0xFUyA9CitBUElfRE9DUyA9ICQocGF0c3Vic3QgJS50eHQsJSwkKGZpbHRlci1vdXQgdGVjaG5pY2FsL2FwaS1pbmRleC1za2VsLnR4dCB0ZWNobmljYWwvYXBpLWluZGV4LnR4dCwgJCh3aWxkY2FyZCB0ZWNobmljYWwvYXBpLSoudHh0KSkpCitTUF9BUlRJQ0xFUyArPSAkKEFQSV9ET0NTKQorU1BfQVJUSUNMRVMgKz0gdGVjaG5pY2FsL2FwaS1pbmRleAorCitET0NfSFRNTCArPSAkKHBhdHN1YnN0ICUsJS5odG1sLCQoQVJUSUNMRVMpICQoU1BfQVJUSUNMRVMpKQorCitET0NfTUFOMT0kKHBhdHN1YnN0ICUudHh0LCUuMSwkKE1BTjFfVFhUKSkKK0RPQ19NQU41PSQocGF0c3Vic3QgJS50eHQsJS41LCQoTUFONV9UWFQpKQorRE9DX01BTjc9JChwYXRzdWJzdCAlLnR4dCwlLjcsJChNQU43X1RYVCkpCisKK3ByZWZpeD89JChIT01FKQorYmluZGlyPz0kKHByZWZpeCkvYmluCitodG1sZGlyPz0kKHByZWZpeCkvc2hhcmUvZG9jL3BlcmYtZG9jCitwZGZkaXI/PSQocHJlZml4KS9zaGFyZS9kb2MvcGVyZi1kb2MKK21hbmRpcj89JChwcmVmaXgpL3NoYXJlL21hbgorbWFuMWRpcj0kKG1hbmRpcikvbWFuMQorbWFuNWRpcj0kKG1hbmRpcikvbWFuNQorbWFuN2Rpcj0kKG1hbmRpcikvbWFuNworIyBERVNURElSPQorCitBU0NJSURPQz1hc2NpaWRvYworQVNDSUlET0NfRVhUUkEgPQorTUFOUEFHRV9YU0wgPSBtYW5wYWdlLW5vcm1hbC54c2wKK1hNTFRPX0VYVFJBID0KK0lOU1RBTEw/PWluc3RhbGwKK1JNID89IHJtIC1mCitET0NfUkVGID0gb3JpZ2luL21hbgorSFRNTF9SRUYgPSBvcmlnaW4vaHRtbAorCitpbmZvZGlyPz0kKHByZWZpeCkvc2hhcmUvaW5mbworTUFLRUlORk89bWFrZWluZm8KK0lOU1RBTExfSU5GTz1pbnN0YWxsLWluZm8KK0RPQ0JPT0syWF9URVhJPWRvY2Jvb2syeC10ZXhpCitEQkxBVEVYPWRibGF0ZXgKK2lmbmRlZiBQRVJMX1BBVEgKKwlQRVJMX1BBVEggPSAvdXNyL2Jpbi9wZXJsCitlbmRpZgorCistaW5jbHVkZSAuLi9jb25maWcubWFrLmF1dG9nZW4KKy1pbmNsdWRlIC4uL2NvbmZpZy5tYWsKKworIworIyBGb3IgYXNjaWlkb2MgLi4uCisjCS03LjEuMiwJbm8gZXh0cmEgc2V0dGluZ3MgYXJlIG5lZWRlZC4KKyMJOC4wLSwJc2V0IEFTQ0lJRE9DOC4KKyMKKworIworIyBGb3IgZG9jYm9vay14c2wgLi4uCisjCS0xLjY4LjEsCXNldCBBU0NJSURPQ19OT19ST0ZGPyAoYmFzZWQgb24gY2hhbmdlbG9nIGZyb20gMS43My4wKQorIwkxLjY5LjAsCQlubyBleHRyYSBzZXR0aW5ncyBhcmUgbmVlZGVkPworIwkxLjY5LjEtMS43MS4wLAlzZXQgRE9DQk9PS19TVVBQUkVTU19TUD8KKyMJMS43MS4xLAkJbm8gZXh0cmEgc2V0dGluZ3MgYXJlIG5lZWRlZD8KKyMJMS43Mi4wLAkJc2V0IERPQ0JPT0tfWFNMXzE3Mi4KKyMJMS43My4wLSwJc2V0IEFTQ0lJRE9DX05PX1JPRkYKKyMKKworIworIyBJZiB5b3UgaGFkIGJlZW4gdXNpbmcgRE9DQk9PS19YU0xfMTcyIGluIGFuIGF0dGVtcHQgdG8gZ2V0IHJpZAorIyBvZiAndGhlICIuZnQgQyIgcHJvYmxlbScgaW4geW91ciBnZW5lcmF0ZWQgbWFucGFnZXMsIGFuZCB5b3UKKyMgaW5zdGVhZCBlbmRlZCB1cCB3aXRoIHdlaXJkIGNoYXJhY3RlcnMgYXJvdW5kIGNhbGxvdXRzLCB0cnkKKyMgdXNpbmcgQVNDSUlET0NfTk9fUk9GRiBpbnN0ZWFkIChpdCB3b3JrcyBmaW5lIHdpdGggQVNDSUlET0M4KS4KKyMKKworaWZkZWYgQVNDSUlET0M4CitBU0NJSURPQ19FWFRSQSArPSAtYSBhc2NpaWRvYzdjb21wYXRpYmxlCitlbmRpZgoraWZkZWYgRE9DQk9PS19YU0xfMTcyCitBU0NJSURPQ19FWFRSQSArPSAtYSBwZXJmLWFzY2lpZG9jLW5vLXJvZmYKK01BTlBBR0VfWFNMID0gbWFucGFnZS0xLjcyLnhzbAorZWxzZQorCWlmZGVmIEFTQ0lJRE9DX05PX1JPRkYKKwkjIGRvY2Jvb2steHNsIGFmdGVyIDEuNzIgbmVlZHMgdGhlIHJlZ3VsYXIgWFNMLCBidXQgd2lsbCBub3QKKwkjIHBhc3MtdGhydSByYXcgcm9mZiBjb2RlcyBmcm9tIGFzY2lpZG9jLmNvbmYsIHNvIHR1cm4gdGhlbSBvZmYuCisJQVNDSUlET0NfRVhUUkEgKz0gLWEgcGVyZi1hc2NpaWRvYy1uby1yb2ZmCisJZW5kaWYKK2VuZGlmCitpZmRlZiBNQU5fQk9MRF9MSVRFUkFMCitYTUxUT19FWFRSQSArPSAtbSBtYW5wYWdlLWJvbGQtbGl0ZXJhbC54c2wKK2VuZGlmCitpZmRlZiBET0NCT09LX1NVUFBSRVNTX1NQCitYTUxUT19FWFRSQSArPSAtbSBtYW5wYWdlLXN1cHByZXNzLXNwLnhzbAorZW5kaWYKKworU0hFTExfUEFUSCA/PSAkKFNIRUxMKQorIyBTaGVsbCBxdW90ZTsKK1NIRUxMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIRUxMX1BBVEgpKQorCisjCisjIFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgaXMgYSBtaW5vciBidWcgaW4gYXNjaWlkb2MuCisjIFRoZSB2ZXJzaW9uIGFmdGVyIDYuMC4zIF93aWxsXyBpbmNsdWRlIHRoZSBwYXRjaCBmb3VuZCBoZXJlOgorIyAgIGh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9cGVyZiZtPTExMTU1ODc1NzIwMjI0MyZ3PTIKKyMKKyMgVW50aWwgdGhhdCB2ZXJzaW9uIGlzIHJlbGVhc2VkIHlvdSBtYXkgaGF2ZSB0byBhcHBseSB0aGUgcGF0Y2gKKyMgeW91cnNlbGYgLSB5ZXMsIGFsbCA2IGNoYXJhY3RlcnMgb2YgaXQhCisjCisKK1FVSUVUX1NVQkRJUjAgID0gKyQoTUFLRSkgLUMgIyBzcGFjZSB0byBzZXBhcmF0ZSAtQyBhbmQgc3ViZGlyCitRVUlFVF9TVUJESVIxICA9CisKK2lmbmVxICgkKGZpbmRzdHJpbmcgJChNQUtFRkxBR1MpLHcpLHcpCitQUklOVF9ESVIgPSAtLW5vLXByaW50LWRpcmVjdG9yeQorZWxzZSAjICJtYWtlIC13IgorTk9fU1VCRElSID0gOgorZW5kaWYKKworaWZuZXEgKCQoZmluZHN0cmluZyAkKE1BS0VGTEFHUykscykscykKK2lmbmRlZiBWCisJUVVJRVRfQVNDSUlET0MJPSBAZWNobyAnICAgJyBBU0NJSURPQyAkQDsKKwlRVUlFVF9YTUxUTwk9IEBlY2hvICcgICAnIFhNTFRPICRAOworCVFVSUVUX0RCMlRFWEkJPSBAZWNobyAnICAgJyBEQjJURVhJICRAOworCVFVSUVUX01BS0VJTkZPCT0gQGVjaG8gJyAgICcgTUFLRUlORk8gJEA7CisJUVVJRVRfREJMQVRFWAk9IEBlY2hvICcgICAnIERCTEFURVggJEA7CisJUVVJRVRfWFNMVFBST0MJPSBAZWNobyAnICAgJyBYU0xUUFJPQyAkQDsKKwlRVUlFVF9HRU4JPSBAZWNobyAnICAgJyBHRU4gJEA7CisJUVVJRVRfU1RERVJSCT0gMj4gL2Rldi9udWxsCisJUVVJRVRfU1VCRElSMAk9ICtAc3ViZGlyPQorCVFVSUVUX1NVQkRJUjEJPSA7JChOT19TVUJESVIpIGVjaG8gJyAgICcgU1VCRElSICQkc3ViZGlyOyBcCisJCQkgICQoTUFLRSkgJChQUklOVF9ESVIpIC1DICQkc3ViZGlyCisJZXhwb3J0IFYKK2VuZGlmCitlbmRpZgorCithbGw6IGh0bWwgbWFuCisKK2h0bWw6ICQoRE9DX0hUTUwpCisKKyQoRE9DX0hUTUwpICQoRE9DX01BTjEpICQoRE9DX01BTjUpICQoRE9DX01BTjcpOiBhc2NpaWRvYy5jb25mCisKK21hbjogbWFuMSBtYW41IG1hbjcKK21hbjE6ICQoRE9DX01BTjEpCittYW41OiAkKERPQ19NQU41KQorbWFuNzogJChET0NfTUFONykKKworaW5mbzogcGVyZi5pbmZvIHBlcmZtYW4uaW5mbworCitwZGY6IHVzZXItbWFudWFsLnBkZgorCitpbnN0YWxsOiBpbnN0YWxsLW1hbgorCitpbnN0YWxsLW1hbjogbWFuCisJJChJTlNUQUxMKSAtZCAtbSA3NTUgJChERVNURElSKSQobWFuMWRpcikKKyMJJChJTlNUQUxMKSAtZCAtbSA3NTUgJChERVNURElSKSQobWFuNWRpcikKKyMJJChJTlNUQUxMKSAtZCAtbSA3NTUgJChERVNURElSKSQobWFuN2RpcikKKwkkKElOU1RBTEwpIC1tIDY0NCAkKERPQ19NQU4xKSAkKERFU1RESVIpJChtYW4xZGlyKQorIwkkKElOU1RBTEwpIC1tIDY0NCAkKERPQ19NQU41KSAkKERFU1RESVIpJChtYW41ZGlyKQorIwkkKElOU1RBTEwpIC1tIDY0NCAkKERPQ19NQU43KSAkKERFU1RESVIpJChtYW43ZGlyKQorCitpbnN0YWxsLWluZm86IGluZm8KKwkkKElOU1RBTEwpIC1kIC1tIDc1NSAkKERFU1RESVIpJChpbmZvZGlyKQorCSQoSU5TVEFMTCkgLW0gNjQ0IHBlcmYuaW5mbyBwZXJmbWFuLmluZm8gJChERVNURElSKSQoaW5mb2RpcikKKwlpZiB0ZXN0IC1yICQoREVTVERJUikkKGluZm9kaXIpL2RpcjsgdGhlbiBcCisJICAkKElOU1RBTExfSU5GTykgLS1pbmZvLWRpcj0kKERFU1RESVIpJChpbmZvZGlyKSBwZXJmLmluZm8gO1wKKwkgICQoSU5TVEFMTF9JTkZPKSAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIHBlcmZtYW4uaW5mbyA7XAorCWVsc2UgXAorCSAgZWNobyAiTm8gZGlyZWN0b3J5IGZvdW5kIGluICQoREVTVERJUikkKGluZm9kaXIpIiA+JjIgOyBcCisJZmkKKworaW5zdGFsbC1wZGY6IHBkZgorCSQoSU5TVEFMTCkgLWQgLW0gNzU1ICQoREVTVERJUikkKHBkZmRpcikKKwkkKElOU1RBTEwpIC1tIDY0NCB1c2VyLW1hbnVhbC5wZGYgJChERVNURElSKSQocGRmZGlyKQorCitpbnN0YWxsLWh0bWw6IGh0bWwKKwknJChTSEVMTF9QQVRIX1NRKScgLi9pbnN0YWxsLXdlYmRvYy5zaCAkKERFU1RESVIpJChodG1sZGlyKQorCisuLi9QRVJGLVZFUlNJT04tRklMRTogLkZPUkNFLVBFUkYtVkVSU0lPTi1GSUxFCisJJChRVUlFVF9TVUJESVIwKS4uLyAkKFFVSUVUX1NVQkRJUjEpIFBFUkYtVkVSU0lPTi1GSUxFCisKKy1pbmNsdWRlIC4uL1BFUkYtVkVSU0lPTi1GSUxFCisKKyMKKyMgRGV0ZXJtaW5lICJpbmNsdWRlOjoiIGZpbGUgcmVmZXJlbmNlcyBpbiBhc2NpaWRvYyBmaWxlcy4KKyMKK2RvYy5kZXAgOiAkKHdpbGRjYXJkICoudHh0KSBidWlsZC1kb2NkZXAucGVybAorCSQoUVVJRVRfR0VOKSQoUk0pICRAKyAkQCAmJiBcCisJJChQRVJMX1BBVEgpIC4vYnVpbGQtZG9jZGVwLnBlcmwgPiRAKyAkKFFVSUVUX1NUREVSUikgJiYgXAorCW12ICRAKyAkQAorCistaW5jbHVkZSBkb2MuZGVwCisKK2NtZHNfdHh0ID0gY21kcy1hbmNpbGxhcnlpbnRlcnJvZ2F0b3JzLnR4dCBcCisJY21kcy1hbmNpbGxhcnltYW5pcHVsYXRvcnMudHh0IFwKKwljbWRzLW1haW5wb3JjZWxhaW4udHh0IFwKKwljbWRzLXBsdW1iaW5naW50ZXJyb2dhdG9ycy50eHQgXAorCWNtZHMtcGx1bWJpbmdtYW5pcHVsYXRvcnMudHh0IFwKKwljbWRzLXN5bmNoaW5ncmVwb3NpdG9yaWVzLnR4dCBcCisJY21kcy1zeW5jaGVscGVycy50eHQgXAorCWNtZHMtcHVyZWhlbHBlcnMudHh0IFwKKwljbWRzLWZvcmVpZ25zY21pbnRlcmZhY2UudHh0CisKKyQoY21kc190eHQpOiBjbWQtbGlzdC5tYWRlCisKK2NtZC1saXN0Lm1hZGU6IGNtZC1saXN0LnBlcmwgLi4vY29tbWFuZC1saXN0LnR4dCAkKE1BTjFfVFhUKQorCSQoUVVJRVRfR0VOKSQoUk0pICRAICYmIFwKKwkkKFBFUkxfUEFUSCkgLi9jbWQtbGlzdC5wZXJsIC4uL2NvbW1hbmQtbGlzdC50eHQgJChRVUlFVF9TVERFUlIpICYmIFwKKwlkYXRlID4kQAorCitjbGVhbjoKKwkkKFJNKSAqLnhtbCAqLnhtbCsgKi5odG1sICouaHRtbCsgKi4xICouNSAqLjcKKwkkKFJNKSAqLnRleGkgKi50ZXhpKyAqLnRleGkrKyBwZXJmLmluZm8gcGVyZm1hbi5pbmZvCisJJChSTSkgaG93dG8taW5kZXgudHh0IGhvd3RvLyouaHRtbCBkb2MuZGVwCisJJChSTSkgdGVjaG5pY2FsL2FwaS0qLmh0bWwgdGVjaG5pY2FsL2FwaS1pbmRleC50eHQKKwkkKFJNKSAkKGNtZHNfdHh0KSAqLm1hZGUKKworJChNQU5fSFRNTCk6ICUuaHRtbCA6ICUudHh0CisJJChRVUlFVF9BU0NJSURPQykkKFJNKSAkQCsgJEAgJiYgXAorCSQoQVNDSUlET0MpIC1iIHhodG1sMTEgLWQgbWFucGFnZSAtZiBhc2NpaWRvYy5jb25mIFwKKwkJJChBU0NJSURPQ19FWFRSQSkgLWFwZXJmX3ZlcnNpb249JChQRVJGX1ZFUlNJT04pIC1vICRAKyAkPCAmJiBcCisJbXYgJEArICRACisKKyUuMSAlLjUgJS43IDogJS54bWwKKwkkKFFVSUVUX1hNTFRPKSQoUk0pICRAICYmIFwKKwl4bWx0byAtbSAkKE1BTlBBR0VfWFNMKSAkKFhNTFRPX0VYVFJBKSBtYW4gJDwKKworJS54bWwgOiAlLnR4dAorCSQoUVVJRVRfQVNDSUlET0MpJChSTSkgJEArICRAICYmIFwKKwkkKEFTQ0lJRE9DKSAtYiBkb2Nib29rIC1kIG1hbnBhZ2UgLWYgYXNjaWlkb2MuY29uZiBcCisJCSQoQVNDSUlET0NfRVhUUkEpIC1hcGVyZl92ZXJzaW9uPSQoUEVSRl9WRVJTSU9OKSAtbyAkQCsgJDwgJiYgXAorCW12ICRAKyAkQAorCitYU0xUID0gZG9jYm9vay54c2wKK1hTTFRPUFRTID0gLS14aW5jbHVkZSAtLXN0cmluZ3BhcmFtIGh0bWwuc3R5bGVzaGVldCBkb2Nib29rLXhzbC5jc3MKKwordXNlci1tYW51YWwuaHRtbDogdXNlci1tYW51YWwueG1sCisJJChRVUlFVF9YU0xUUFJPQyl4c2x0cHJvYyAkKFhTTFRPUFRTKSAtbyAkQCAkKFhTTFQpICQ8CisKK3BlcmYuaW5mbzogdXNlci1tYW51YWwudGV4aQorCSQoUVVJRVRfTUFLRUlORk8pJChNQUtFSU5GTykgLS1uby1zcGxpdCAtbyAkQCB1c2VyLW1hbnVhbC50ZXhpCisKK3VzZXItbWFudWFsLnRleGk6IHVzZXItbWFudWFsLnhtbAorCSQoUVVJRVRfREIyVEVYSSkkKFJNKSAkQCsgJEAgJiYgXAorCSQoRE9DQk9PSzJYX1RFWEkpIHVzZXItbWFudWFsLnhtbCAtLWVuY29kaW5nPVVURi04IC0tdG8tc3Rkb3V0ID4kQCsrICYmIFwKKwkkKFBFUkxfUEFUSCkgZml4LXRleGkucGVybCA8JEArKyA+JEArICYmIFwKKwlybSAkQCsrICYmIFwKKwltdiAkQCsgJEAKKwordXNlci1tYW51YWwucGRmOiB1c2VyLW1hbnVhbC54bWwKKwkkKFFVSUVUX0RCTEFURVgpJChSTSkgJEArICRAICYmIFwKKwkkKERCTEFURVgpIC1vICRAKyAtcCAvZXRjL2FzY2lpZG9jL2RibGF0ZXgvYXNjaWlkb2MtZGJsYXRleC54c2wgLXMgL2V0Yy9hc2NpaWRvYy9kYmxhdGV4L2FzY2lpZG9jLWRibGF0ZXguc3R5ICQ8ICYmIFwKKwltdiAkQCsgJEAKKworcGVyZm1hbi50ZXhpOiAkKE1BTl9YTUwpIGNhdC10ZXhpLnBlcmwKKwkkKFFVSUVUX0RCMlRFWEkpJChSTSkgJEArICRAICYmIFwKKwkoJChmb3JlYWNoIHhtbCwkKE1BTl9YTUwpLCQoRE9DQk9PSzJYX1RFWEkpIC0tZW5jb2Rpbmc9VVRGLTggXAorCQktLXRvLXN0ZG91dCAkKHhtbCkgJiYpIHRydWUpID4gJEArKyAmJiBcCisJJChQRVJMX1BBVEgpIGNhdC10ZXhpLnBlcmwgJEAgPCRAKysgPiRAKyAmJiBcCisJcm0gJEArKyAmJiBcCisJbXYgJEArICRACisKK3BlcmZtYW4uaW5mbzogcGVyZm1hbi50ZXhpCisJJChRVUlFVF9NQUtFSU5GTykkKE1BS0VJTkZPKSAtLW5vLXNwbGl0IC0tbm8tdmFsaWRhdGUgJCoudGV4aQorCiskKHBhdHN1YnN0ICUudHh0LCUudGV4aSwkKE1BTl9UWFQpKTogJS50ZXhpIDogJS54bWwKKwkkKFFVSUVUX0RCMlRFWEkpJChSTSkgJEArICRAICYmIFwKKwkkKERPQ0JPT0syWF9URVhJKSAtLXRvLXN0ZG91dCAkKi54bWwgPiRAKyAmJiBcCisJbXYgJEArICRACisKK2hvd3RvLWluZGV4LnR4dDogaG93dG8taW5kZXguc2ggJCh3aWxkY2FyZCBob3d0by8qLnR4dCkKKwkkKFFVSUVUX0dFTikkKFJNKSAkQCsgJEAgJiYgXAorCSckKFNIRUxMX1BBVEhfU1EpJyAuL2hvd3RvLWluZGV4LnNoICQod2lsZGNhcmQgaG93dG8vKi50eHQpID4kQCsgJiYgXAorCW12ICRAKyAkQAorCiskKHBhdHN1YnN0ICUsJS5odG1sLCQoQVJUSUNMRVMpKSA6ICUuaHRtbCA6ICUudHh0CisJJChRVUlFVF9BU0NJSURPQykkKEFTQ0lJRE9DKSAtYiB4aHRtbDExICQqLnR4dAorCitXRUJET0NfREVTVCA9IC9wdWIvc29mdHdhcmUvdG9vbHMvcGVyZi9kb2NzCisKKyQocGF0c3Vic3QgJS50eHQsJS5odG1sLCQod2lsZGNhcmQgaG93dG8vKi50eHQpKTogJS5odG1sIDogJS50eHQKKwkkKFFVSUVUX0FTQ0lJRE9DKSQoUk0pICRAKyAkQCAmJiBcCisJc2VkIC1lICcxLC9eJCQvZCcgJDwgfCAkKEFTQ0lJRE9DKSAtYiB4aHRtbDExIC0gPiRAKyAmJiBcCisJbXYgJEArICRACisKK2luc3RhbGwtd2ViZG9jIDogaHRtbAorCSckKFNIRUxMX1BBVEhfU1EpJyAuL2luc3RhbGwtd2ViZG9jLnNoICQoV0VCRE9DX0RFU1QpCisKK3F1aWNrLWluc3RhbGw6IHF1aWNrLWluc3RhbGwtbWFuCisKK3F1aWNrLWluc3RhbGwtbWFuOgorCSckKFNIRUxMX1BBVEhfU1EpJyAuL2luc3RhbGwtZG9jLXF1aWNrLnNoICQoRE9DX1JFRikgJChERVNURElSKSQobWFuZGlyKQorCitxdWljay1pbnN0YWxsLWh0bWw6CisJJyQoU0hFTExfUEFUSF9TUSknIC4vaW5zdGFsbC1kb2MtcXVpY2suc2ggJChIVE1MX1JFRikgJChERVNURElSKSQoaHRtbGRpcikKKworLlBIT05ZOiAuRk9SQ0UtUEVSRi1WRVJTSU9OLUZJTEUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2YjIzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9hc2NpaWRvYy5jb25mCkBAIC0wLDAgKzEsOTEgQEAKKyMjIGxpbmtwZXJmOiBtYWNybworIworIyBVc2FnZTogbGlua3BlcmY6Y29tbWFuZFttYW5wYWdlLXNlY3Rpb25dCisjCisjIE5vdGUsIHswfSBpcyB0aGUgbWFucGFnZSBzZWN0aW9uLCB3aGlsZSB7dGFyZ2V0fSBpcyB0aGUgY29tbWFuZC4KKyMKKyMgU2hvdyBQRVJGIGxpbmsgYXM6IDxjb21tYW5kPig8c2VjdGlvbj4pOyBpZiBzZWN0aW9uIGlzIGRlZmluZWQsIGVsc2UganVzdCBzaG93CisjIHRoZSBjb21tYW5kLgorCitbbWFjcm9zXQorKD9zdSlbXFxdPyg/UDxuYW1lPmxpbmtwZXJmKTooP1A8dGFyZ2V0PlxTKj8pXFsoP1A8YXR0cmxpc3Q+Lio/KVxdPQorCitbYXR0cmlidXRlc10KK2FzdGVyaXNrPSYjNDI7CitwbHVzPSYjNDM7CitjYXJldD0mIzk0Oworc3RhcnRzYj0mIzkxOworZW5kc2I9JiM5MzsKK3RpbGRlPSYjMTI2OworCitpZmRlZjo6YmFja2VuZC1kb2Nib29rW10KK1tsaW5rcGVyZi1pbmxpbmVtYWNyb10KK3swJXt0YXJnZXR9fQorezAjPGNpdGVyZWZlbnRyeT59Cit7MCM8cmVmZW50cnl0aXRsZT57dGFyZ2V0fTwvcmVmZW50cnl0aXRsZT48bWFudm9sbnVtPnswfTwvbWFudm9sbnVtPn0KK3swIzwvY2l0ZXJlZmVudHJ5Pn0KK2VuZGlmOjpiYWNrZW5kLWRvY2Jvb2tbXQorCitpZmRlZjo6YmFja2VuZC1kb2Nib29rW10KK2lmbmRlZjo6cGVyZi1hc2NpaWRvYy1uby1yb2ZmW10KKyMgInVuYnJlYWsiIGRvY2Jvb2steHNsIHYxLjY4IGZvciBtYW5wYWdlcy4gdjEuNjkgd29ya3Mgd2l0aCBvciB3aXRob3V0IHRoaXMuCisjIHYxLjcyIGJyZWFrcyB3aXRoIHRoaXMgYmVjYXVzZSBpdCByZXBsYWNlcyBkb3RzIG5vdCBpbiByb2ZmIHJlcXVlc3RzLgorW2xpc3RpbmdibG9ja10KKzxleGFtcGxlPjx0aXRsZT57dGl0bGV9PC90aXRsZT4KKzxsaXRlcmFsbGF5b3V0PgoraWZkZWY6OmRvY3R5cGUtbWFucGFnZVtdCismIzEwOy5mdCBDJiMxMDsKK2VuZGlmOjpkb2N0eXBlLW1hbnBhZ2VbXQorfAoraWZkZWY6OmRvY3R5cGUtbWFucGFnZVtdCismIzEwOy5mdCYjMTA7CitlbmRpZjo6ZG9jdHlwZS1tYW5wYWdlW10KKzwvbGl0ZXJhbGxheW91dD4KK3t0aXRsZSN9PC9leGFtcGxlPgorZW5kaWY6OnBlcmYtYXNjaWlkb2Mtbm8tcm9mZltdCisKK2lmZGVmOjpwZXJmLWFzY2lpZG9jLW5vLXJvZmZbXQoraWZkZWY6OmRvY3R5cGUtbWFucGFnZVtdCisjIFRoZSBmb2xsb3dpbmcgdHdvIHNtYWxsIHdvcmthcm91bmRzIGluc2VydCBhIHNpbXBsZSBwYXJhZ3JhcGggYWZ0ZXIgc2NyZWVuCitbbGlzdGluZ2Jsb2NrXQorPGV4YW1wbGU+PHRpdGxlPnt0aXRsZX08L3RpdGxlPgorPGxpdGVyYWxsYXlvdXQ+Cit8Cis8L2xpdGVyYWxsYXlvdXQ+PHNpbXBhcmE+PC9zaW1wYXJhPgore3RpdGxlI308L2V4YW1wbGU+CisKK1t2ZXJzZWJsb2NrXQorPGZvcm1hbHBhcmF7aWQ/IGlkPSJ7aWR9In0+PHRpdGxlPnt0aXRsZX08L3RpdGxlPjxwYXJhPgore3RpdGxlJX08bGl0ZXJhbGxheW91dHtpZD8gaWQ9IntpZH0ifT4KK3t0aXRsZSN9PGxpdGVyYWxsYXlvdXQ+Cit8Cis8L2xpdGVyYWxsYXlvdXQ+Cit7dGl0bGUjfTwvcGFyYT48L2Zvcm1hbHBhcmE+Cit7dGl0bGUlfTxzaW1wYXJhPjwvc2ltcGFyYT4KK2VuZGlmOjpkb2N0eXBlLW1hbnBhZ2VbXQorZW5kaWY6OnBlcmYtYXNjaWlkb2Mtbm8tcm9mZltdCitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KKworaWZkZWY6OmRvY3R5cGUtbWFucGFnZVtdCitpZmRlZjo6YmFja2VuZC1kb2Nib29rW10KK1toZWFkZXJdCit0ZW1wbGF0ZTo6W2hlYWRlci1kZWNsYXJhdGlvbnNdCis8cmVmZW50cnk+Cis8cmVmbWV0YT4KKzxyZWZlbnRyeXRpdGxlPnttYW50aXRsZX08L3JlZmVudHJ5dGl0bGU+Cis8bWFudm9sbnVtPnttYW52b2xudW19PC9tYW52b2xudW0+Cis8cmVmbWlzY2luZm8gY2xhc3M9InNvdXJjZSI+cGVyZjwvcmVmbWlzY2luZm8+Cis8cmVmbWlzY2luZm8gY2xhc3M9InZlcnNpb24iPntwZXJmX3ZlcnNpb259PC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0ibWFudWFsIj5wZXJmIE1hbnVhbDwvcmVmbWlzY2luZm8+Cis8L3JlZm1ldGE+Cis8cmVmbmFtZWRpdj4KKyAgPHJlZm5hbWU+e21hbm5hbWV9PC9yZWZuYW1lPgorICA8cmVmcHVycG9zZT57bWFucHVycG9zZX08L3JlZnB1cnBvc2U+Cis8L3JlZm5hbWVkaXY+CitlbmRpZjo6YmFja2VuZC1kb2Nib29rW10KK2VuZGlmOjpkb2N0eXBlLW1hbnBhZ2VbXQorCitpZmRlZjo6YmFja2VuZC14aHRtbDExW10KK1tsaW5rcGVyZi1pbmxpbmVtYWNyb10KKzxhIGhyZWY9Int0YXJnZXR9Lmh0bWwiPnt0YXJnZXR9ezA/KHswfSl9PC9hPgorZW5kaWY6OmJhY2tlbmQteGh0bWwxMVtdCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS0xLjcyLnhzbCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLTEuNzIueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDMxNWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS0xLjcyLnhzbApAQCAtMCwwICsxLDE0IEBACis8IS0tIG1hbnBhZ2UtMS43Mi54c2w6CisgICAgIHNwZWNpYWwgc2V0dGluZ3MgZm9yIG1hbnBhZ2VzIHJlbmRlcmVkIGZyb20gYXNjaWlkb2MrZG9jYm9vaworICAgICBoYW5kbGVzIHBlY3VsaWFyaXRpZXMgaW4gZG9jYm9vay14c2wgMS43Mi4wIC0tPgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorCQl2ZXJzaW9uPSIxLjAiPgorCis8eHNsOmltcG9ydCBocmVmPSJtYW5wYWdlLWJhc2UueHNsIi8+CisKKzwhLS0gdGhlc2UgYXJlIHRoZSBzcGVjaWFsIHZhbHVlcyBmb3IgdGhlIHJvZmYgY29udHJvbCBjaGFyYWN0ZXJzCisgICAgIG5lZWRlZCBmb3IgZG9jYm9vay14c2wgMS43Mi4wIC0tPgorPHhzbDpwYXJhbSBuYW1lPSJnaXQuZG9jYm9vay5iYWNrc2xhc2giPiYjeDI1OTM7PC94c2w6cGFyYW0+Cis8eHNsOnBhcmFtIG5hbWU9ImdpdC5kb2Nib29rLmRvdCIgICAgICA+JiN4MjMwMjs8L3hzbDpwYXJhbT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLWJhc2UueHNsIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2UtYmFzZS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2NGZhNjEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS1iYXNlLnhzbApAQCAtMCwwICsxLDM1IEBACis8IS0tIG1hbnBhZ2UtYmFzZS54c2w6CisgICAgIHNwZWNpYWwgZm9ybWF0dGluZyBmb3IgbWFucGFnZXMgcmVuZGVyZWQgZnJvbSBhc2NpaWRvYytkb2Nib29rIC0tPgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorCQl2ZXJzaW9uPSIxLjAiPgorCis8IS0tIHRoZXNlIHBhcmFtcyBzaWxlbmNlIHNvbWUgb3V0cHV0IGZyb20geG1sdG8gLS0+Cis8eHNsOnBhcmFtIG5hbWU9Im1hbi5vdXRwdXQucXVpZXRseSIgc2VsZWN0PSIxIi8+Cis8eHNsOnBhcmFtIG5hbWU9InJlZmVudHJ5Lm1ldGEuZ2V0LnF1aWV0bHkiIHNlbGVjdD0iMSIvPgorCis8IS0tIGNvbnZlcnQgYXNjaWlkb2MgY2FsbG91dHMgdG8gbWFuIHBhZ2UgZm9ybWF0OworICAgICBnaXQuZG9jYm9vay5iYWNrc2xhc2ggYW5kIGdpdC5kb2Nib29rLmRvdCBwYXJhbXMKKyAgICAgbXVzdCBiZSBzdXBwbGllZCBieSBhbm90aGVyIFhTTCBmaWxlIG9yIG90aGVyIG1lYW5zIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY28iPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoCisJCQkgICAgICAkZ2l0LmRvY2Jvb2suYmFja3NsYXNoLCdmQignLAorCQkJICAgICAgc3Vic3RyaW5nLWFmdGVyKEBpZCwnLScpLCcpJywKKwkJCSAgICAgICRnaXQuZG9jYm9vay5iYWNrc2xhc2gsJ2ZSJykiLz4KKzwveHNsOnRlbXBsYXRlPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY2FsbG91dGxpc3QiPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2l0LmRvY2Jvb2suZG90Ii8+CisJPHhzbDp0ZXh0PnNwJiMxMDs8L3hzbDp0ZXh0PgorCTx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKwk8eHNsOnRleHQ+JiMxMDs8L3hzbDp0ZXh0PgorPC94c2w6dGVtcGxhdGU+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjYWxsb3V0Ij4KKwk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iY29uY2F0KAorCQkJICAgICAgJGdpdC5kb2Nib29rLmJhY2tzbGFzaCwnZkInLAorCQkJICAgICAgc3Vic3RyaW5nLWFmdGVyKEBhcmVhcmVmcywnLScpLAorCQkJICAgICAgJy4gJywkZ2l0LmRvY2Jvb2suYmFja3NsYXNoLCdmUicpIi8+CisJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2l0LmRvY2Jvb2suZG90Ii8+CisJPHhzbDp0ZXh0PmJyJiMxMDs8L3hzbDp0ZXh0PgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS1ib2xkLWxpdGVyYWwueHNsIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2UtYm9sZC1saXRlcmFsLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDhlYjVkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2UtYm9sZC1saXRlcmFsLnhzbApAQCAtMCwwICsxLDE3IEBACis8IS0tIG1hbnBhZ2UtYm9sZC1saXRlcmFsLnhzbDoKKyAgICAgc3BlY2lhbCBmb3JtYXR0aW5nIGZvciBtYW5wYWdlcyByZW5kZXJlZCBmcm9tIGFzY2lpZG9jK2RvY2Jvb2sgLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisJCXZlcnNpb249IjEuMCI+CisKKzwhLS0gcmVuZGVyIGxpdGVyYWwgdGV4dCBhcyBib2xkIChpbnN0ZWFkIG9mIHBsYWluIG9yIG1vbm9zcGFjZSk7CisgICAgIHRoaXMgbWFrZXMgbGl0ZXJhbCB0ZXh0IGVhc2llciB0byBkaXN0aW5ndWlzaCBpbiBtYW5wYWdlcworICAgICB2aWV3ZWQgb24gYSB0dHkgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJsaXRlcmFsIj4KKwk8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGdpdC5kb2Nib29rLmJhY2tzbGFzaCIvPgorCTx4c2w6dGV4dD5mQjwveHNsOnRleHQ+CisJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2l0LmRvY2Jvb2suYmFja3NsYXNoIi8+CisJPHhzbDp0ZXh0PmZSPC94c2w6dGV4dD4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2Utbm9ybWFsLnhzbCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLW5vcm1hbC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4ZjViMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLW5vcm1hbC54c2wKQEAgLTAsMCArMSwxMyBAQAorPCEtLSBtYW5wYWdlLW5vcm1hbC54c2w6CisgICAgIHNwZWNpYWwgc2V0dGluZ3MgZm9yIG1hbnBhZ2VzIHJlbmRlcmVkIGZyb20gYXNjaWlkb2MrZG9jYm9vaworICAgICBoYW5kbGVzIGFueXRoaW5nIHdlIHdhbnQgdG8ga2VlcCBhd2F5IGZyb20gZG9jYm9vay14c2wgMS43Mi4wIC0tPgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorCQl2ZXJzaW9uPSIxLjAiPgorCis8eHNsOmltcG9ydCBocmVmPSJtYW5wYWdlLWJhc2UueHNsIi8+CisKKzwhLS0gdGhlc2UgYXJlIHRoZSBub3JtYWwgdmFsdWVzIGZvciB0aGUgcm9mZiBjb250cm9sIGNoYXJhY3RlcnMgLS0+Cis8eHNsOnBhcmFtIG5hbWU9ImdpdC5kb2Nib29rLmJhY2tzbGFzaCI+XDwveHNsOnBhcmFtPgorPHhzbDpwYXJhbSBuYW1lPSJnaXQuZG9jYm9vay5kb3QiCT4uPC94c2w6cGFyYW0+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS1zdXBwcmVzcy1zcC54c2wgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS1zdXBwcmVzcy1zcC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzYzc2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLXN1cHByZXNzLXNwLnhzbApAQCAtMCwwICsxLDIxIEBACis8IS0tIG1hbnBhZ2Utc3VwcHJlc3Mtc3AueHNsOgorICAgICBzcGVjaWFsIHNldHRpbmdzIGZvciBtYW5wYWdlcyByZW5kZXJlZCBmcm9tIGFzY2lpZG9jK2RvY2Jvb2sKKyAgICAgaGFuZGxlcyBlcnJvbmVvdXMsIGlubGluZSAuc3AgaW4gbWFucGFnZSBvdXRwdXQgb2Ygc29tZQorICAgICB2ZXJzaW9ucyBvZiBkb2Nib29rLXhzbCAtLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKwkJdmVyc2lvbj0iMS4wIj4KKworPCEtLSBhdHRlbXB0IHRvIHdvcmsgYXJvdW5kIHNwdXJpb3VzIC5zcCBhdCB0aGUgdGFpbCBvZiB0aGUgbGluZQorICAgICB0aGF0IHNvbWUgdmVyc2lvbnMgb2YgZG9jYm9vayBzdHlsZXNoZWV0cyBzZWVtIHRvIGFkZCAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InNpbXBhcmEiPgorICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbnRlbnQiPgorICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KKyAgPC94c2w6dmFyaWFibGU+CisgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJub3JtYWxpemUtc3BhY2UoJGNvbnRlbnQpIi8+CisgIDx4c2w6aWYgdGVzdD0ibm90KGFuY2VzdG9yOjphdXRob3JibHVyYikgYW5kCisgICAgICAgICAgICAgICAgbm90KGFuY2VzdG9yOjpwZXJzb25ibHVyYikiPgorICAgIDx4c2w6dGV4dD4mIzEwOyYjMTA7PC94c2w6dGV4dD4KKyAgPC94c2w6aWY+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWFubm90YXRlLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWFubm90YXRlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWRjYWRlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYW5ub3RhdGUudHh0CkBAIC0wLDAgKzEsMjkgQEAKK3BlcmYtYW5ub3RhdGUoMSkKKz09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK3BlcmYtYW5ub3RhdGUgLSBSZWFkIHBlcmYuZGF0YSAoY3JlYXRlZCBieSBwZXJmIHJlY29yZCkgYW5kIGRpc3BsYXkgYW5ub3RhdGVkIGNvZGUKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisncGVyZiBhbm5vdGF0ZScgWy1pIDxmaWxlPiB8IC0taW5wdXQ9ZmlsZV0gc3ltYm9sX25hbWUKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgcmVhZHMgdGhlIGlucHV0IGZpbGUgYW5kIGRpc3BsYXlzIGFuIGFubm90YXRlZCB2ZXJzaW9uIG9mIHRoZQorY29kZS4gSWYgdGhlIG9iamVjdCBmaWxlIGhhcyBkZWJ1ZyBzeW1ib2xzIHRoZW4gdGhlIHNvdXJjZSBjb2RlIHdpbGwgYmUKK2Rpc3BsYXllZCBhbG9uZ3NpZGUgYXNzZW1ibHkgY29kZS4KKworSWYgdGhlcmUgaXMgbm8gZGVidWcgaW5mbyBpbiB0aGUgb2JqZWN0LCB0aGVuIGFubm90YXRlZCBhc3NlbWJseSBpcyBkaXNwbGF5ZWQuCisKK09QVElPTlMKKy0tLS0tLS0KKy1pOjoKKy0taW5wdXQ9OjoKKyAgICAgICAgSW5wdXQgZmlsZSBuYW1lLiAoZGVmYXVsdDogcGVyZi5kYXRhKQorCitTRUUgQUxTTworLS0tLS0tLS0KK2xpbmtwZXJmOnBlcmYtcmVjb3JkWzFdCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1oZWxwLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWhlbHAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDM5MTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1oZWxwLnR4dApAQCAtMCwwICsxLDM4IEBACitwZXJmLWhlbHAoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitwZXJmLWhlbHAgLSBkaXNwbGF5IGhlbHAgaW5mb3JtYXRpb24gYWJvdXQgcGVyZgorCitTWU5PUFNJUworLS0tLS0tLS0KKydwZXJmIGhlbHAnIFstYXwtLWFsbF0gW0NPTU1BTkRdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorCitXaXRoIG5vIG9wdGlvbnMgYW5kIG5vIENPTU1BTkQgZ2l2ZW4sIHRoZSBzeW5vcHNpcyBvZiB0aGUgJ3BlcmYnCitjb21tYW5kIGFuZCBhIGxpc3Qgb2YgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBwZXJmIGNvbW1hbmRzIGFyZSBwcmludGVkCitvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCitJZiB0aGUgb3B0aW9uICctLWFsbCcgb3IgJy1hJyBpcyBnaXZlbiwgdGhlbiBhbGwgYXZhaWxhYmxlIGNvbW1hbmRzIGFyZQorcHJpbnRlZCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LgorCitJZiBhIHBlcmYgY29tbWFuZCBpcyBuYW1lZCwgYSBtYW51YWwgcGFnZSBmb3IgdGhhdCBjb21tYW5kIGlzIGJyb3VnaHQKK3VwLiBUaGUgJ21hbicgcHJvZ3JhbSBpcyB1c2VkIGJ5IGRlZmF1bHQgZm9yIHRoaXMgcHVycG9zZSwgYnV0IHRoaXMKK2NhbiBiZSBvdmVycmlkZGVuIGJ5IG90aGVyIG9wdGlvbnMgb3IgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuCisKK05vdGUgdGhhdCBgcGVyZiAtLWhlbHAgLi4uYCBpcyBpZGVudGljYWwgdG8gYHBlcmYgaGVscCAuLi5gIGJlY2F1c2UgdGhlCitmb3JtZXIgaXMgaW50ZXJuYWxseSBjb252ZXJ0ZWQgaW50byB0aGUgbGF0dGVyLgorCitPUFRJT05TCistLS0tLS0tCistYTo6CistLWFsbDo6CisJUHJpbnRzIGFsbCB0aGUgYXZhaWxhYmxlIGNvbW1hbmRzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuIFRoaXMKKwlvcHRpb24gc3VwZXJzZWRlcyBhbnkgb3RoZXIgb3B0aW9uLgorCitQRVJGCistLS0tCitQYXJ0IG9mIHRoZSBsaW5rcGVyZjpwZXJmWzFdIHN1aXRlCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1saXN0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWxpc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTBiOTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1saXN0LnR4dApAQCAtMCwwICsxLDI1IEBACitwZXJmLWxpc3QoMSkKKz09PT09PT09PT09PQorCitOQU1FCistLS0tCitwZXJmLWxpc3QgLSBMaXN0IGFsbCBzeW1ib2xpYyBldmVudCB0eXBlcworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydwZXJmIGxpc3QnCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBjb21tYW5kIGRpc3BsYXlzIHRoZSBzeW1ib2xpYyBldmVudCB0eXBlcyB3aGljaCBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlCit2YXJpb3VzIHBlcmYgY29tbWFuZHMgd2l0aCB0aGUgLWUgb3B0aW9uLgorCitPUFRJT05TCistLS0tLS0tCitOb25lCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua3BlcmY6cGVyZi1zdGF0WzFdLCBsaW5rcGVyZjpwZXJmLXRvcFsxXSwKK2xpbmtwZXJmOnBlcmYtcmVjb3JkWzFdCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJjMWVlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dApAQCAtMCwwICsxLDQyIEBACitwZXJmLXJlY29yZCgxKQorPT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorcGVyZi1yZWNvcmQgLSBSdW4gYSBjb21tYW5kIGFuZCByZWNvcmQgaXRzIHByb2ZpbGUgaW50byBwZXJmLmRhdGEKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisncGVyZiByZWNvcmQnIFstZSA8RVZFTlQ+IHwgLS1ldmVudD1FVkVOVF0gWy1sXSBbLWFdIDxjb21tYW5kPgorJ3BlcmYgcmVjb3JkJyBbLWUgPEVWRU5UPiB8IC0tZXZlbnQ9RVZFTlRdIFstbF0gWy1hXSAtLSA8Y29tbWFuZD4gWzxvcHRpb25zPl0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgcnVucyBhIGNvbW1hbmQgYW5kIGdhdGhlcnMgYSBwZXJmb3JtYW5jZSBjb3VudGVyIHByb2ZpbGUKK2Zyb20gaXQsIGludG8gcGVyZi5kYXRhIC0gd2l0aG91dCBkaXNwbGF5aW5nIGFueXRoaW5nLgorCitUaGlzIGZpbGUgY2FuIHRoZW4gYmUgaW5zcGVjdGVkIGxhdGVyIG9uLCB1c2luZyAncGVyZiByZXBvcnQnLgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxjb21tYW5kPi4uLjo6CisJQW55IGNvbW1hbmQgeW91IGNhbiBzcGVjaWZ5IGluIGEgc2hlbGwuCisKKy1lOjoKKy0tZXZlbnQ9OjoKKwlTZWxlY3QgdGhlIFBNVSBldmVudC4gU2VsZWN0aW9uIGNhbiBiZSBhIHN5bWJvbGljIGV2ZW50IG5hbWUKKwkodXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYWxsIGV2ZW50cykgb3IgYSByYXcgUE1VCisJZXZlbnQgKGV2ZW50c2VsK3VtYXNrKSBpbiB0aGUgZm9ybSBvZiByTk5OIHdoZXJlIE5OTiBpcyBhCisJIGhleGFkZWNpbWFsIGV2ZW50IGRlc2NyaXB0b3IuCisKKy1hOjoKKyAgICAgICAgc3lzdGVtLXdpZGUgY29sbGVjdGlvbgorCistbDo6CisgICAgICAgIHNjYWxlIGNvdW50ZXIgdmFsdWVzCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua3BlcmY6cGVyZi1zdGF0WzFdLCBsaW5rcGVyZjpwZXJmLWxpc3RbMV0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlcG9ydC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZXBvcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDNmYzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZXBvcnQudHh0CkBAIC0wLDAgKzEsMjYgQEAKK3BlcmYtcmVwb3J0KDEpCis9PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitwZXJmLXJlcG9ydCAtIFJlYWQgcGVyZi5kYXRhIChjcmVhdGVkIGJ5IHBlcmYgcmVjb3JkKSBhbmQgZGlzcGxheSB0aGUgcHJvZmlsZQorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydwZXJmIHJlcG9ydCcgWy1pIDxmaWxlPiB8IC0taW5wdXQ9ZmlsZV0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgZGlzcGxheXMgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgcHJvZmlsZSBpbmZvcm1hdGlvbiByZWNvcmRlZAordmlhIHBlcmYgcmVwb3J0LgorCitPUFRJT05TCistLS0tLS0tCistaTo6CistLWlucHV0PTo6CisgICAgICAgIElucHV0IGZpbGUgbmFtZS4gKGRlZmF1bHQ6IHBlcmYuZGF0YSkKKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rcGVyZjpwZXJmLXN0YXRbMV0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXN0YXQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc3RhdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM2OGE3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXN0YXQudHh0CkBAIC0wLDAgKzEsNjYgQEAKK3BlcmYtc3RhdCgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK3BlcmYtc3RhdCAtIFJ1biBhIGNvbW1hbmQgYW5kIGdhdGhlciBwZXJmb3JtYW5jZSBjb3VudGVyIHN0YXRpc3RpY3MKKworU1lOT1BTSVMKKy0tLS0tLS0tCitbdmVyc2VdCisncGVyZiBzdGF0JyBbLWUgPEVWRU5UPiB8IC0tZXZlbnQ9RVZFTlRdIFstbF0gWy1hXSA8Y29tbWFuZD4KKydwZXJmIHN0YXQnIFstZSA8RVZFTlQ+IHwgLS1ldmVudD1FVkVOVF0gWy1sXSBbLWFdIC0tIDxjb21tYW5kPiBbPG9wdGlvbnM+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgY29tbWFuZCBydW5zIGEgY29tbWFuZCBhbmQgZ2F0aGVycyBwZXJmb3JtYW5jZSBjb3VudGVyIHN0YXRpc3RpY3MKK2Zyb20gaXQuCisKKworT1BUSU9OUworLS0tLS0tLQorPGNvbW1hbmQ+Li4uOjoKKwlBbnkgY29tbWFuZCB5b3UgY2FuIHNwZWNpZnkgaW4gYSBzaGVsbC4KKworCistZTo6CistLWV2ZW50PTo6CisJU2VsZWN0IHRoZSBQTVUgZXZlbnQuIFNlbGVjdGlvbiBjYW4gYmUgYSBzeW1ib2xpYyBldmVudCBuYW1lCisJKHVzZSAncGVyZiBsaXN0JyB0byBsaXN0IGFsbCBldmVudHMpIG9yIGEgcmF3IFBNVQorCWV2ZW50IChldmVudHNlbCt1bWFzaykgaW4gdGhlIGZvcm0gb2Ygck5OTiB3aGVyZSBOTk4gaXMgYQorCSBoZXhhZGVjaW1hbCBldmVudCBkZXNjcmlwdG9yLgorCistaTo6CistLWluaGVyaXQ6OgorICAgICAgICBjaGlsZCB0YXNrcyBpbmhlcml0IGNvdW50ZXJzCistcDo6CistLXBpZD08cGlkPjo6CisgICAgICAgIHN0YXQgZXZlbnRzIG9uIGV4aXN0aW5nIHBpZAorCistYTo6CisgICAgICAgIHN5c3RlbS13aWRlIGNvbGxlY3Rpb24KKworLWw6OgorICAgICAgICBzY2FsZSBjb3VudGVyIHZhbHVlcworCitFWEFNUExFUworLS0tLS0tLS0KKworJCBwZXJmIHN0YXQgLS0gbWFrZSAtagorCisgUGVyZm9ybWFuY2UgY291bnRlciBzdGF0cyBmb3IgJ21ha2UgLWonOgorCisgICAgODExNy4zNzAyNTYgIHRhc2sgY2xvY2sgdGlja3MgICAgICMgICAgICAxMS4yODEgQ1BVIHV0aWxpemF0aW9uIGZhY3RvcgorICAgICAgICAgICAgNjc4ICBjb250ZXh0IHN3aXRjaGVzICAgICAjICAgICAgIDAuMDAwIE0vc2VjCisgICAgICAgICAgICAxMzMgIENQVSBtaWdyYXRpb25zICAgICAgICMgICAgICAgMC4wMDAgTS9zZWMKKyAgICAgICAgIDIzNTcyNCAgcGFnZWZhdWx0cyAgICAgICAgICAgIyAgICAgICAwLjAyOSBNL3NlYworICAgIDI0ODIxMTYyNTI2ICBDUFUgY3ljbGVzICAgICAgICAgICAjICAgIDMwNTcuNzg0IE0vc2VjCisgICAgMTg2ODczMDM0NTcgIGluc3RydWN0aW9ucyAgICAgICAgICMgICAgMjMwMi4xMzggTS9zZWMKKyAgICAgIDE3MjE1ODg5NSAgY2FjaGUgcmVmZXJlbmNlcyAgICAgIyAgICAgIDIxLjIwOSBNL3NlYworICAgICAgIDI3MDc1MjU5ICBjYWNoZSBtaXNzZXMgICAgICAgICAjICAgICAgIDMuMzM1IE0vc2VjCisKKyBXYWxsLWNsb2NrIHRpbWUgZWxhcHNlZDogICA3MTkuNTU0MzUyIG1zZWNzCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua3BlcmY6cGVyZi10b3BbMV0sIGxpbmtwZXJmOnBlcmYtbGlzdFsxXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdG9wLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRvcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM5ZDAxMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRvcC50eHQKQEAgLTAsMCArMSwzOSBAQAorcGVyZi10b3AoMSkKKz09PT09PT09PT09CisKK05BTUUKKy0tLS0KK3BlcmYtdG9wIC0gUnVuIGEgY29tbWFuZCBhbmQgcHJvZmlsZSBpdAorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydwZXJmIHRvcCcgWy1lIDxFVkVOVD4gfCAtLWV2ZW50PUVWRU5UXSBbLWxdIFstYV0gPGNvbW1hbmQ+CisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBjb21tYW5kIHJ1bnMgYSBjb21tYW5kIGFuZCBnYXRoZXJzIGEgcGVyZm9ybWFuY2UgY291bnRlciBwcm9maWxlCitmcm9tIGl0LgorCisKK09QVElPTlMKKy0tLS0tLS0KKzxjb21tYW5kPi4uLjo6CisJQW55IGNvbW1hbmQgeW91IGNhbiBzcGVjaWZ5IGluIGEgc2hlbGwuCisKKy1lOjoKKy0tZXZlbnQ9OjoKKwlTZWxlY3QgdGhlIFBNVSBldmVudC4gU2VsZWN0aW9uIGNhbiBiZSBhIHN5bWJvbGljIGV2ZW50IG5hbWUKKwkodXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYWxsIGV2ZW50cykgb3IgYSByYXcgUE1VCisJZXZlbnQgKGV2ZW50c2VsK3VtYXNrKSBpbiB0aGUgZm9ybSBvZiByTk5OIHdoZXJlIE5OTiBpcyBhCisJIGhleGFkZWNpbWFsIGV2ZW50IGRlc2NyaXB0b3IuCisKKy1hOjoKKyAgICAgICAgc3lzdGVtLXdpZGUgY29sbGVjdGlvbgorCistbDo6CisgICAgICAgIHNjYWxlIGNvdW50ZXIgdmFsdWVzCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua3BlcmY6cGVyZi1zdGF0WzFdLCBsaW5rcGVyZjpwZXJmLWxpc3RbMV0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWM4MzI1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYudHh0CkBAIC0wLDAgKzEsMjQgQEAKK3BlcmYoMSkKKz09PT09PT0KKworTkFNRQorLS0tLQorcGVyZiAtIFBlcmZvcm1hbmNlIGFuYWx5c2lzIHRvb2xzIGZvciBMaW51eAorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydwZXJmJyBbLS12ZXJzaW9uXSBbLS1oZWxwXSBDT01NQU5EIFtBUkdTXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1BlcmZvcm1hbmNlIGNvdW50ZXJzIGZvciBMaW51eCBhcmUgYXJlIGEgbmV3IGtlcm5lbC1iYXNlZCBzdWJzeXN0ZW0KK3RoYXQgcHJvdmlkZSBhIGZyYW1ld29yayBmb3IgYWxsIHRoaW5ncyBwZXJmb3JtYW5jZSBhbmFseXNpcy4gSXQKK2NvdmVycyBoYXJkd2FyZSBsZXZlbCAoQ1BVL1BNVSwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyBVbml0KSBmZWF0dXJlcworYW5kIHNvZnR3YXJlIGZlYXR1cmVzIChzb2Z0d2FyZSBjb3VudGVycywgdHJhY2Vwb2ludHMpIGFzIHdlbGwuCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua3BlcmY6cGVyZi1zdGF0WzFdLCBsaW5rcGVyZjpwZXJmLXRvcFsxXSwKK2xpbmtwZXJmOnBlcmYtcmVjb3JkWzFdLCBsaW5rcGVyZjpwZXJmLXJlcG9ydFsxXSwKK2xpbmtwZXJmOnBlcmYtbGlzdFsxXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiZDVkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKQEAgLTAsMCArMSw5MjkgQEAKKyMgVGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoaXMgTWFrZWZpbGUgaXMuLi4KK2FsbDo6CisKKyMgRGVmaW5lIFY9MSB0byBoYXZlIGEgbW9yZSB2ZXJib3NlIGNvbXBpbGUuCisjCisjIERlZmluZSBTTlBSSU5URl9SRVRVUk5TX0JPR1VTIGlmIHlvdXIgYXJlIG9uIGEgc3lzdGVtIHdoaWNoIHNucHJpbnRmKCkKKyMgb3IgdnNucHJpbnRmKCkgcmV0dXJuIC0xIGluc3RlYWQgb2YgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd291bGQKKyMgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbmFsIHN0cmluZyBpZiBlbm91Z2ggc3BhY2UgaGFkIGJlZW4gYXZhaWxhYmxlLgorIworIyBEZWZpbmUgRlJFQURfUkVBRFNfRElSRUNUT1JJRVMgaWYgeW91ciBhcmUgb24gYSBzeXN0ZW0gd2hpY2ggc3VjY2VlZHMKKyMgd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgZnJvbSBhbiBmb3BlbidlZCBkaXJlY3RvcnkuCisjCisjIERlZmluZSBOT19PUEVOU1NMIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHlvdSBkbyBub3QgaGF2ZSBPcGVuU1NMLgorIyBUaGlzIGFsc28gaW1wbGllcyBNT1pJTExBX1NIQTEuCisjCisjIERlZmluZSBDVVJMRElSPS9mb28vYmFyIGlmIHlvdXIgY3VybCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KKyMKKyMgRGVmaW5lIEVYUEFURElSPS9mb28vYmFyIGlmIHlvdXIgZXhwYXQgaGVhZGVyIGFuZCBsaWJyYXJ5IGZpbGVzIGFyZSBpbgorIyAvZm9vL2Jhci9pbmNsdWRlIGFuZCAvZm9vL2Jhci9saWIgZGlyZWN0b3JpZXMuCisjCisjIERlZmluZSBOT19EX0lOT19JTl9ESVJFTlQgaWYgeW91IGRvbid0IGhhdmUgZF9pbm8gaW4geW91ciBzdHJ1Y3QgZGlyZW50LgorIworIyBEZWZpbmUgTk9fRF9UWVBFX0lOX0RJUkVOVCBpZiB5b3VyIHBsYXRmb3JtIGRlZmluZXMgRFRfVU5LTk9XTiBidXQgbGFja3MKKyMgZF90eXBlIGluIHN0cnVjdCBkaXJlbnQgKGxhdGVzdCBDeWd3aW4gLS0gd2lsbCBiZSBmaXhlZCBzb29uaXNoKS4KKyMKKyMgRGVmaW5lIE5PX0M5OV9GT1JNQVQgaWYgeW91ciBmb3JtYXR0ZWQgSU8gZnVuY3Rpb25zIChwcmludGYvc2NhbmYgZXQuYWwuKQorIyBkbyBub3Qgc3VwcG9ydCB0aGUgJ3NpemUgc3BlY2lmaWVycycgaW50cm9kdWNlZCBieSBDOTksIG5hbWVseSBsbCwgaGgsCisjIGosIHosIHQuIChyZXByZXNlbnRpbmcgbG9uZyBsb25nIGludCwgY2hhciwgaW50bWF4X3QsIHNpemVfdCwgcHRyZGlmZl90KS4KKyMgc29tZSBDIGNvbXBpbGVycyBzdXBwb3J0ZWQgdGhlc2Ugc3BlY2lmaWVycyBwcmlvciB0byBDOTkgYXMgYW4gZXh0ZW5zaW9uLgorIworIyBEZWZpbmUgTk9fU1RSQ0FTRVNUUiBpZiB5b3UgZG9uJ3QgaGF2ZSBzdHJjYXNlc3RyLgorIworIyBEZWZpbmUgTk9fTUVNTUVNIGlmIHlvdSBkb24ndCBoYXZlIG1lbW1lbS4KKyMKKyMgRGVmaW5lIE5PX1NUUlRPVU1BWCBpZiB5b3UgZG9uJ3QgaGF2ZSBzdHJ0b3VtYXggaW4gdGhlIEMgbGlicmFyeS4KKyMgSWYgeW91ciBjb21waWxlciBhbHNvIGRvZXMgbm90IHN1cHBvcnQgbG9uZyBsb25nIG9yIGRvZXMgbm90IGhhdmUKKyMgc3RydG91bGwsIGRlZmluZSBOT19TVFJUT1VMTC4KKyMKKyMgRGVmaW5lIE5PX1NFVEVOViBpZiB5b3UgZG9uJ3QgaGF2ZSBzZXRlbnYgaW4gdGhlIEMgbGlicmFyeS4KKyMKKyMgRGVmaW5lIE5PX1VOU0VURU5WIGlmIHlvdSBkb24ndCBoYXZlIHVuc2V0ZW52IGluIHRoZSBDIGxpYnJhcnkuCisjCisjIERlZmluZSBOT19NS0RURU1QIGlmIHlvdSBkb24ndCBoYXZlIG1rZHRlbXAgaW4gdGhlIEMgbGlicmFyeS4KKyMKKyMgRGVmaW5lIE5PX1NZU19TRUxFQ1RfSCBpZiB5b3UgZG9uJ3QgaGF2ZSBzeXMvc2VsZWN0LmguCisjCisjIERlZmluZSBOT19TWU1MSU5LX0hFQUQgaWYgeW91IG5ldmVyIHdhbnQgLnBlcmYvSEVBRCB0byBiZSBhIHN5bWJvbGljIGxpbmsuCisjIEVuYWJsZSBpdCBvbiBXaW5kb3dzLiAgQnkgZGVmYXVsdCwgc3ltcmVmcyBhcmUgc3RpbGwgdXNlZC4KKyMKKyMgRGVmaW5lIE5PX1NWTl9URVNUUyBpZiB5b3Ugd2FudCB0byBza2lwIHRpbWUtY29uc3VtaW5nIFNWTiBpbnRlcm9wZXJhYmlsaXR5CisjIHRlc3RzLiAgVGhlc2UgdGVzdHMgdGFrZSB1cCBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aGUgdG90YWwgdGVzdCB0aW1lCisjIGJ1dCBhcmUgbm90IG5lZWRlZCB1bmxlc3MgeW91IHBsYW4gdG8gdGFsayB0byBTVk4gcmVwb3MuCisjCisjIERlZmluZSBOT19GSU5LIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gRGFyd2luL01hYyBPUyBYLCBoYXZlIEZpbmsKKyMgaW5zdGFsbGVkIGluIC9zdywgYnV0IGRvbid0IHdhbnQgUEVSRiB0byBsaW5rIGFnYWluc3QgYW55IGxpYnJhcmllcworIyBpbnN0YWxsZWQgdGhlcmUuICBJZiBkZWZpbmVkIHlvdSBtYXkgc3BlY2lmeSB5b3VyIG93biAob3IgRmluaydzKQorIyBpbmNsdWRlIGRpcmVjdG9yaWVzIGFuZCBsaWJyYXJ5IGRpcmVjdG9yaWVzIGJ5IGRlZmluaW5nIENGTEFHUworIyBhbmQgTERGTEFHUyBhcHByb3ByaWF0ZWx5LgorIworIyBEZWZpbmUgTk9fREFSV0lOX1BPUlRTIGlmIHlvdSBhcmUgYnVpbGRpbmcgb24gRGFyd2luL01hYyBPUyBYLAorIyBoYXZlIERhcndpblBvcnRzIGluc3RhbGxlZCBpbiAvb3B0L2xvY2FsLCBidXQgZG9uJ3Qgd2FudCBQRVJGIHRvCisjIGxpbmsgYWdhaW5zdCBhbnkgbGlicmFyaWVzIGluc3RhbGxlZCB0aGVyZS4gIElmIGRlZmluZWQgeW91IG1heQorIyBzcGVjaWZ5IHlvdXIgb3duIChvciBEYXJ3aW5Qb3J0J3MpIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kCisjIGxpYnJhcnkgZGlyZWN0b3JpZXMgYnkgZGVmaW5pbmcgQ0ZMQUdTIGFuZCBMREZMQUdTIGFwcHJvcHJpYXRlbHkuCisjCisjIERlZmluZSBQUENfU0hBMSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgbWFrZSB0byBtYWtlIHVzZSBvZgorIyBhIGJ1bmRsZWQgU0hBMSByb3V0aW5lIG9wdGltaXplZCBmb3IgUG93ZXJQQy4KKyMKKyMgRGVmaW5lIEFSTV9TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgb3B0aW1pemVkIGZvciBBUk0uCisjCisjIERlZmluZSBNT1pJTExBX1NIQTEgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIG1ha2UgdG8gbWFrZSB1c2Ugb2YKKyMgYSBidW5kbGVkIFNIQTEgcm91dGluZSBjb21pbmcgZnJvbSBNb3ppbGxhLiBJdCBpcyBHUEwnZCBhbmQgc2hvdWxkIGJlIGZhc3QKKyMgb24gbm9uLXg4NiBhcmNoaXRlY3R1cmVzIChlLmcuIFBvd2VyUEMpLCB3aGlsZSB0aGUgT3BlblNTTCB2ZXJzaW9uIChkZWZhdWx0CisjIGNob2ljZSkgaGFzIHZlcnkgZmFzdCB2ZXJzaW9uIG9wdGltaXplZCBmb3IgaTU4Ni4KKyMKKyMgRGVmaW5lIE5FRURTX1NTTF9XSVRIX0NSWVBUTyBpZiB5b3UgbmVlZCAtbGNyeXB0byB3aXRoIC1sc3NsIChEYXJ3aW4pLgorIworIyBEZWZpbmUgTkVFRFNfTElCSUNPTlYgaWYgbGlua2luZyB3aXRoIGxpYmMgaXMgbm90IGVub3VnaCAoRGFyd2luKS4KKyMKKyMgRGVmaW5lIE5FRURTX1NPQ0tFVCBpZiBsaW5raW5nIHdpdGggbGliYyBpcyBub3QgZW5vdWdoIChTdW5PUywKKyMgUGF0cmljayBNYXVyaXR6KS4KKyMKKyMgRGVmaW5lIE5PX01NQVAgaWYgeW91IHdhbnQgdG8gYXZvaWQgbW1hcC4KKyMKKyMgRGVmaW5lIE5PX1BUSFJFQURTIGlmIHlvdSBkbyBub3QgaGF2ZSBvciBkbyBub3Qgd2FudCB0byB1c2UgUHRocmVhZHMuCisjCisjIERlZmluZSBOT19QUkVBRCBpZiB5b3UgaGF2ZSBhIHByb2JsZW0gd2l0aCBwcmVhZCgpIHN5c3RlbSBjYWxsIChlLmcuCisjIGN5Z3dpbi5kbGwgYmVmb3JlIHYxLjUuMjIpLgorIworIyBEZWZpbmUgTk9fRkFTVF9XT1JLSU5HX0RJUkVDVE9SWSBpZiBhY2Nlc3Npbmcgb2JqZWN0cyBpbiBwYWNrIGZpbGVzIGlzCisjIGdlbmVyYWxseSBmYXN0ZXIgb24geW91ciBwbGF0Zm9ybSB0aGFuIGFjY2Vzc2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuCisjCisjIERlZmluZSBOT19UUlVTVEFCTEVfRklMRU1PREUgaWYgeW91ciBmaWxlc3lzdGVtIG1heSBjbGFpbSB0byBzdXBwb3J0CisjIHRoZSBleGVjdXRhYmxlIG1vZGUgYml0LCBidXQgZG9lc24ndCByZWFsbHkgZG8gc28uCisjCisjIERlZmluZSBOT19JUFY2IGlmIHlvdSBsYWNrIElQdjYgc3VwcG9ydCBhbmQgZ2V0YWRkcmluZm8oKS4KKyMKKyMgRGVmaW5lIE5PX1NPQ0tBRERSX1NUT1JBR0UgaWYgeW91ciBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIHN0cnVjdAorIyBzb2NrYWRkcl9zdG9yYWdlLgorIworIyBEZWZpbmUgTk9fSUNPTlYgaWYgeW91ciBsaWJjIGRvZXMgbm90IHByb3Blcmx5IHN1cHBvcnQgaWNvbnYuCisjCisjIERlZmluZSBPTERfSUNPTlYgaWYgeW91ciBsaWJyYXJ5IGhhcyBhbiBvbGQgaWNvbnYoKSwgd2hlcmUgdGhlIHNlY29uZAorIyAoaW5wdXQgYnVmZmVyIHBvaW50ZXIpIHBhcmFtZXRlciBpcyBkZWNsYXJlZCB3aXRoIHR5cGUgKGNvbnN0IGNoYXIgKiopLgorIworIyBEZWZpbmUgTk9fREVGTEFURV9CT1VORCBpZiB5b3VyIHpsaWIgZG9lcyBub3QgaGF2ZSBkZWZsYXRlQm91bmQuCisjCisjIERlZmluZSBOT19SX1RPX0dDQ19MSU5LRVIgaWYgeW91ciBnY2MgZG9lcyBub3QgbGlrZSAiLVIvcGF0aC9saWIiCisjIHRoYXQgdGVsbHMgcnVudGltZSBwYXRocyB0byBkeW5hbWljIGxpYnJhcmllczsKKyMgIi1XbCwtcnBhdGg9L3BhdGgvbGliIiBpcyB1c2VkIGluc3RlYWQuCisjCisjIERlZmluZSBVU0VfTlNFQyBiZWxvdyBpZiB5b3Ugd2FudCBwZXJmIHRvIGNhcmUgYWJvdXQgc3ViLXNlY29uZCBmaWxlIG10aW1lcworIyBhbmQgY3RpbWVzLiBOb3RlIHRoYXQgeW91IG5lZWQgcmVjZW50IGdsaWJjIChhdCBsZWFzdCAyLjIuNCkgZm9yIHRoaXMsIGFuZAorIyBpdCB3aWxsIEJSRUFLIFlPVVIgTE9DQUwgRElGRlMhIHNob3ctZGlmZiBhbmQgYW55dGhpbmcgdXNpbmcgaXQgd2lsbCBsaWtlbHkKKyMgcmFuZG9tbHkgYnJlYWsgdW5sZXNzIHlvdXIgdW5kZXJseWluZyBmaWxlc3lzdGVtIHN1cHBvcnRzIHRob3NlIHN1Yi1zZWNvbmQKKyMgdGltZXMgKG15IGV4dDMgZG9lc24ndCkuCisjCisjIERlZmluZSBVU0VfU1RfVElNRVNQRUMgaWYgeW91ciAic3RydWN0IHN0YXQiIHVzZXMgInN0X2N0aW1lc3BlYyIgaW5zdGVhZCBvZgorIyAic3RfY3RpbSIKKyMKKyMgRGVmaW5lIE5PX05TRUMgaWYgeW91ciAic3RydWN0IHN0YXQiIGRvZXMgbm90IGhhdmUgInN0X2N0aW0udHZfbnNlYyIKKyMgYXZhaWxhYmxlLiAgVGhpcyBhdXRvbWF0aWNhbGx5IHR1cm5zIFVTRV9OU0VDIG9mZi4KKyMKKyMgRGVmaW5lIFVTRV9TVERFViBiZWxvdyBpZiB5b3Ugd2FudCBwZXJmIHRvIGNhcmUgYWJvdXQgdGhlIHVuZGVybHlpbmcgZGV2aWNlCisjIGNoYW5nZSBiZWluZyBjb25zaWRlcmVkIGFuIGlub2RlIGNoYW5nZSBmcm9tIHRoZSB1cGRhdGUtaW5kZXggcGVyc3BlY3RpdmUuCisjCisjIERlZmluZSBOT19TVF9CTE9DS1NfSU5fU1RSVUNUX1NUQVQgaWYgeW91ciBwbGF0Zm9ybSBkb2VzIG5vdCBoYXZlIHN0X2Jsb2NrcworIyBmaWVsZCB0aGF0IGNvdW50cyB0aGUgb24tZGlzayBmb290cHJpbnQgaW4gNTEyLWJ5dGUgYmxvY2tzLgorIworIyBEZWZpbmUgQVNDSUlET0M4IGlmIHlvdSB3YW50IHRvIGZvcm1hdCBkb2N1bWVudGF0aW9uIHdpdGggQXNjaWlEb2MgOAorIworIyBEZWZpbmUgRE9DQk9PS19YU0xfMTcyIGlmIHlvdSB3YW50IHRvIGZvcm1hdCBtYW4gcGFnZXMgd2l0aCBEb2NCb29rIFhTTCB2MS43Mi4KKyMKKyMgRGVmaW5lIE5PX1BFUkxfTUFLRU1BS0VSIGlmIHlvdSBjYW5ub3QgdXNlIE1ha2VmaWxlcyBnZW5lcmF0ZWQgYnkgcGVybCdzCisjIE1ha2VNYWtlciAoZS5nLiB1c2luZyBBY3RpdmVTdGF0ZSB1bmRlciBDeWd3aW4pLgorIworIyBEZWZpbmUgTk9fUEVSTCBpZiB5b3UgZG8gbm90IHdhbnQgUGVybCBzY3JpcHRzIG9yIGxpYnJhcmllcyBhdCBhbGwuCisjCisjIERlZmluZSBJTlRFUk5BTF9RU09SVCB0byB1c2UgR2l0J3MgaW1wbGVtZW50YXRpb24gb2YgcXNvcnQoKSwgd2hpY2gKKyMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIG1lcmdlIHNvcnQgdXNlZCBpbiBnbGliYy4gVGhpcyBpcworIyByZWNvbW1lbmRlZCBpZiBHaXQgdHJpZ2dlcnMgTyhuXjIpIGJlaGF2aW9yIGluIHlvdXIgcGxhdGZvcm0ncyBxc29ydCgpLgorIworIyBEZWZpbmUgTk9fRVhURVJOQUxfR1JFUCBpZiB5b3UgZG9uJ3Qgd2FudCAicGVyZiBncmVwIiB0byBldmVyIGNhbGwKKyMgeW91ciBleHRlcm5hbCBncmVwIChlLmcuLCBpZiB5b3VyIHN5c3RlbSBsYWNrcyBncmVwLCBpZiBpdHMgZ3JlcCBpcworIyBicm9rZW4sIG9yIHNwYXduaW5nIGV4dGVybmFsIHByb2Nlc3MgaXMgc2xvd2VyIHRoYW4gYnVpbHQtaW4gZ3JlcCBwZXJmIGhhcykuCisKK1BFUkYtVkVSU0lPTi1GSUxFOiAuRk9SQ0UtUEVSRi1WRVJTSU9OLUZJTEUKKwlAJChTSEVMTF9QQVRIKSB1dGlsL1BFUkYtVkVSU0lPTi1HRU4KKy1pbmNsdWRlIFBFUkYtVkVSU0lPTi1GSUxFCisKK3VuYW1lX1MgOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLXMgMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQordW5hbWVfTSA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtbSAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9PIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1vIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX1IgOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLXIgMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQordW5hbWVfUCA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtcCAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9WIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC12IDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKKworIyBDRkxBR1MgYW5kIExERkxBR1MgYXJlIGZvciB0aGUgdXNlcnMgdG8gb3ZlcnJpZGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCitDRkxBR1MgPSAtZ2dkYjMgLVdhbGwgLVdlcnJvciAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdtaXNzaW5nLXByb3RvdHlwZXMgLXN0ZD1nbnU5OSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtTzYKK0xERkxBR1MgPSAtbHB0aHJlYWQgLWxydCAtbGVsZgorQUxMX0NGTEFHUyA9ICQoQ0ZMQUdTKQorQUxMX0xERkxBR1MgPSAkKExERkxBR1MpCitTVFJJUCA/PSBzdHJpcAorCisjIEFtb25nIHRoZSB2YXJpYWJsZXMgYmVsb3csIHRoZXNlOgorIyAgIHBlcmZleGVjZGlyCisjICAgdGVtcGxhdGVfZGlyCisjICAgbWFuZGlyCisjICAgaW5mb2RpcgorIyAgIGh0bWxkaXIKKyMgICBFVENfUEVSRkNPTkZJRyAoYnV0IG5vdCBzeXNjb25mZGlyKQorIyBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgcmVsYXRpdmUgcGF0aCBzb21lL3doZXJlL2Vsc2U7CisjIHRoaXMgaXMgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gJChwcmVmaXgpIGFuZCAicGVyZiIgYXQKKyMgcnVudGltZSBmaWd1cmVzIG91dCB3aGVyZSB0aGV5IGFyZSBiYXNlZCBvbiB0aGUgcGF0aCB0byB0aGUgZXhlY3V0YWJsZS4KKyMgVGhpcyBjYW4gaGVscCBpbnN0YWxsaW5nIHRoZSBzdWl0ZSBpbiBhIHJlbG9jYXRhYmxlIHdheS4KKworcHJlZml4ID0gJChIT01FKQorYmluZGlyX3JlbGF0aXZlID0gYmluCitiaW5kaXIgPSAkKHByZWZpeCkvJChiaW5kaXJfcmVsYXRpdmUpCittYW5kaXIgPSBzaGFyZS9tYW4KK2luZm9kaXIgPSBzaGFyZS9pbmZvCitwZXJmZXhlY2RpciA9IGxpYmV4ZWMvcGVyZi1jb3JlCitzaGFyZWRpciA9ICQocHJlZml4KS9zaGFyZQordGVtcGxhdGVfZGlyID0gc2hhcmUvcGVyZi1jb3JlL3RlbXBsYXRlcworaHRtbGRpciA9IHNoYXJlL2RvYy9wZXJmLWRvYworaWZlcSAoJChwcmVmaXgpLC91c3IpCitzeXNjb25mZGlyID0gL2V0YworRVRDX1BFUkZDT05GSUcgPSAkKHN5c2NvbmZkaXIpL3BlcmZjb25maWcKK2Vsc2UKK3N5c2NvbmZkaXIgPSAkKHByZWZpeCkvZXRjCitFVENfUEVSRkNPTkZJRyA9IGV0Yy9wZXJmY29uZmlnCitlbmRpZgorbGliID0gbGliCisjIERFU1RESVI9CisKK2V4cG9ydCBwcmVmaXggYmluZGlyIHNoYXJlZGlyIHN5c2NvbmZkaXIKKworQ0MgPSBnY2MKK0FSID0gYXIKK1JNID0gcm0gLWYKK1RBUiA9IHRhcgorRklORCA9IGZpbmQKK0lOU1RBTEwgPSBpbnN0YWxsCitSUE1CVUlMRCA9IHJwbWJ1aWxkCitQVEhSRUFEX0xJQlMgPSAtbHB0aHJlYWQKKworIyBzcGFyc2UgaXMgYXJjaGl0ZWN0dXJlLW5ldXRyYWwsIHdoaWNoIG1lYW5zIHRoYXQgd2UgbmVlZCB0byB0ZWxsIGl0CisjIGV4cGxpY2l0bHkgd2hhdCBhcmNoaXRlY3R1cmUgdG8gY2hlY2sgZm9yLiBGaXggdGhpcyB1cCBmb3IgeW91cnMuLgorU1BBUlNFX0ZMQUdTID0gLURfX0JJR19FTkRJQU5fXyAtRF9fcG93ZXJwY19fCisKKworCisjIyMgLS0tIEVORCBDT05GSUdVUkFUSU9OIFNFQ1RJT04gLS0tCisKKyMgVGhvc2UgbXVzdCBub3QgYmUgR05VLXNwZWNpZmljOyB0aGV5IGFyZSBzaGFyZWQgd2l0aCBwZXJsLyB3aGljaCBtYXkKKyMgYmUgYnVpbHQgYnkgYSBkaWZmZXJlbnQgY29tcGlsZXIuIChOb3RlIHRoYXQgdGhpcyBpcyBhbiBhcnRpZmFjdCBub3cKKyMgYnV0IGl0IHN0aWxsIG1pZ2h0IGJlIG5pY2UgdG8ga2VlcCB0aGF0IGRpc3RpbmN0aW9uLikKK0JBU0lDX0NGTEFHUyA9CitCQVNJQ19MREZMQUdTID0KKworIyBHdWFyZCBhZ2FpbnN0IGVudmlyb25tZW50IHZhcmlhYmxlcworQlVJTFRJTl9PQkpTID0KK0JVSUxUX0lOUyA9CitDT01QQVRfQ0ZMQUdTID0KK0NPTVBBVF9PQkpTID0KK0xJQl9IID0KK0xJQl9PQkpTID0KK1NDUklQVF9QRVJMID0KK1NDUklQVF9TSCA9CitURVNUX1BST0dSQU1TID0KKworIworIyBObyBzY3JpcHRzIHJpZ2h0IG5vdzoKKyMKKworIyBTQ1JJUFRfU0ggKz0gcGVyZi1hbS5zaAorCisjCisjIE5vIFBlcmwgc2NyaXB0cyByaWdodCBub3c6CisjCisKKyMgU0NSSVBUX1BFUkwgKz0gcGVyZi1hZGQtLWludGVyYWN0aXZlLnBlcmwKKworU0NSSVBUUyA9ICQocGF0c3Vic3QgJS5zaCwlLCQoU0NSSVBUX1NIKSkgXAorCSAgJChwYXRzdWJzdCAlLnBlcmwsJSwkKFNDUklQVF9QRVJMKSkKKworIyBFbXB0eS4uLgorRVhUUkFfUFJPR1JBTVMgPQorCisjIC4uLiBhbmQgYWxsIHRoZSByZXN0IHRoYXQgY291bGQgYmUgbW92ZWQgb3V0IG9mIGJpbmRpciB0byBwZXJmZXhlY2RpcgorUFJPR1JBTVMgKz0gJChFWFRSQV9QUk9HUkFNUykKKworIworIyBTaW5nbGUgJ3BlcmYnIGJpbmFyeSByaWdodCBub3c6CisjCitQUk9HUkFNUyArPSBwZXJmCisKKyMgTGlzdCBidWlsdC1pbiBjb21tYW5kICRDIHdob3NlIGltcGxlbWVudGF0aW9uIGNtZF8kQygpIGlzIG5vdCBpbgorIyBidWlsdGluLSRDLm8gYnV0IGlzIGxpbmtlZCBpbiBhcyBwYXJ0IG9mIHNvbWUgb3RoZXIgY29tbWFuZC4KKyMKKyMgTm9uZSByaWdodCBub3c6CisjCisjIEJVSUxUX0lOUyArPSBwZXJmLWluaXQgJFgKKworIyB3aGF0ICdhbGwnIHdpbGwgYnVpbGQgYW5kICdpbnN0YWxsJyB3aWxsIGluc3RhbGwsIGluIHBlcmZleGVjZGlyCitBTExfUFJPR1JBTVMgPSAkKFBST0dSQU1TKSAkKFNDUklQVFMpCisKKyMgd2hhdCAnYWxsJyB3aWxsIGJ1aWxkIGJ1dCBub3QgaW5zdGFsbCBpbiBwZXJmZXhlY2RpcgorT1RIRVJfUFJPR1JBTVMgPSBwZXJmJFgKKworIyBTZXQgcGF0aHMgdG8gdG9vbHMgZWFybHkgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGZvciB2ZXJzaW9uIHRlc3RzLgoraWZuZGVmIFNIRUxMX1BBVEgKKwlTSEVMTF9QQVRIID0gL2Jpbi9zaAorZW5kaWYKK2lmbmRlZiBQRVJMX1BBVEgKKwlQRVJMX1BBVEggPSAvdXNyL2Jpbi9wZXJsCitlbmRpZgorCitleHBvcnQgUEVSTF9QQVRICisKK0xJQl9GSUxFPWxpYnBlcmYuYQorCitMSUJfSCArPSAuLi8uLi9pbmNsdWRlL2xpbnV4L3BlcmZfY291bnRlci5oCitMSUJfSCArPSBwZXJmLmgKK0xJQl9IICs9IHV0aWwvbGlzdC5oCitMSUJfSCArPSB1dGlsL3JidHJlZS5oCitMSUJfSCArPSB1dGlsL2xldmVuc2h0ZWluLmgKK0xJQl9IICs9IHV0aWwvcGFyc2Utb3B0aW9ucy5oCitMSUJfSCArPSB1dGlsL3BhcnNlLWV2ZW50cy5oCitMSUJfSCArPSB1dGlsL3F1b3RlLmgKK0xJQl9IICs9IHV0aWwvdXRpbC5oCitMSUJfSCArPSB1dGlsL2hlbHAuaAorTElCX0ggKz0gdXRpbC9zdHJidWYuaAorTElCX0ggKz0gdXRpbC9zdHJpbmcuaAorTElCX0ggKz0gdXRpbC9ydW4tY29tbWFuZC5oCitMSUJfSCArPSB1dGlsL3NpZ2NoYWluLmgKK0xJQl9IICs9IHV0aWwvc3ltYm9sLmgKK0xJQl9IICs9IHV0aWwvY29sb3IuaAorCitMSUJfT0JKUyArPSB1dGlsL2Fic3BhdGgubworTElCX09CSlMgKz0gdXRpbC9hbGlhcy5vCitMSUJfT0JKUyArPSB1dGlsL2NvbmZpZy5vCitMSUJfT0JKUyArPSB1dGlsL2N0eXBlLm8KK0xJQl9PQkpTICs9IHV0aWwvZW52aXJvbm1lbnQubworTElCX09CSlMgKz0gdXRpbC9leGVjX2NtZC5vCitMSUJfT0JKUyArPSB1dGlsL2hlbHAubworTElCX09CSlMgKz0gdXRpbC9sZXZlbnNodGVpbi5vCitMSUJfT0JKUyArPSB1dGlsL3BhcnNlLW9wdGlvbnMubworTElCX09CSlMgKz0gdXRpbC9wYXJzZS1ldmVudHMubworTElCX09CSlMgKz0gdXRpbC9wYXRoLm8KK0xJQl9PQkpTICs9IHV0aWwvcmJ0cmVlLm8KK0xJQl9PQkpTICs9IHV0aWwvcnVuLWNvbW1hbmQubworTElCX09CSlMgKz0gdXRpbC9xdW90ZS5vCitMSUJfT0JKUyArPSB1dGlsL3N0cmJ1Zi5vCitMSUJfT0JKUyArPSB1dGlsL3N0cmluZy5vCitMSUJfT0JKUyArPSB1dGlsL3VzYWdlLm8KK0xJQl9PQkpTICs9IHV0aWwvd3JhcHBlci5vCitMSUJfT0JKUyArPSB1dGlsL3NpZ2NoYWluLm8KK0xJQl9PQkpTICs9IHV0aWwvc3ltYm9sLm8KK0xJQl9PQkpTICs9IHV0aWwvY29sb3IubworTElCX09CSlMgKz0gdXRpbC9wYWdlci5vCisKK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWFubm90YXRlLm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLWhlbHAubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tbGlzdC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1yZWNvcmQubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tcmVwb3J0Lm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXN0YXQubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tdG9wLm8KKworUEVSRkxJQlMgPSAkKExJQl9GSUxFKQorRVhUTElCUyA9CisKKyMKKyMgUGxhdGZvcm0gc3BlY2lmaWMgdHdlYWtzCisjCisKKyMgV2UgY2hvb3NlIHRvIGF2b2lkICJpZiAuLiBlbHNlIGlmIC4uIGVsc2UgLi4gZW5kaWYgZW5kaWYiCisjIGJlY2F1c2UgbWFpbnRhaW5pbmcgdGhlIG5lc3RpbmcgdG8gbWF0Y2ggaXMgYSBwYWluLiAgSWYKKyMgd2UgaGFkICJlbGlmIiB0aGluZ3Mgd291bGQgaGF2ZSBiZWVuIG11Y2ggbmljZXIuLi4KKworLWluY2x1ZGUgY29uZmlnLm1hay5hdXRvZ2VuCistaW5jbHVkZSBjb25maWcubWFrCisKK2lmZXEgKCQodW5hbWVfUyksRGFyd2luKQorCWlmbmRlZiBOT19GSU5LCisJCWlmZXEgKCQoc2hlbGwgdGVzdCAtZCAvc3cvbGliICYmIGVjaG8geSkseSkKKwkJCUJBU0lDX0NGTEFHUyArPSAtSS9zdy9pbmNsdWRlCisJCQlCQVNJQ19MREZMQUdTICs9IC1ML3N3L2xpYgorCQllbmRpZgorCWVuZGlmCisJaWZuZGVmIE5PX0RBUldJTl9QT1JUUworCQlpZmVxICgkKHNoZWxsIHRlc3QgLWQgL29wdC9sb2NhbC9saWIgJiYgZWNobyB5KSx5KQorCQkJQkFTSUNfQ0ZMQUdTICs9IC1JL29wdC9sb2NhbC9pbmNsdWRlCisJCQlCQVNJQ19MREZMQUdTICs9IC1ML29wdC9sb2NhbC9saWIKKwkJZW5kaWYKKwllbmRpZgorCVBUSFJFQURfTElCUyA9CitlbmRpZgorCitpZm5kZWYgQ0NfTERfRFlOUEFUSAorCWlmZGVmIE5PX1JfVE9fR0NDX0xJTktFUgorCQkjIFNvbWUgZ2NjIGRvZXMgbm90IGFjY2VwdCBhbmQgcGFzcyAtUiB0byB0aGUgbGlua2VyIHRvIHNwZWNpZnkKKwkJIyB0aGUgcnVudGltZSBkeW5hbWljIGxpYnJhcnkgcGF0aC4KKwkJQ0NfTERfRFlOUEFUSCA9IC1XbCwtcnBhdGgsCisJZWxzZQorCQlDQ19MRF9EWU5QQVRIID0gLVIKKwllbmRpZgorZW5kaWYKKworaWZkZWYgWkxJQl9QQVRICisJQkFTSUNfQ0ZMQUdTICs9IC1JJChaTElCX1BBVEgpL2luY2x1ZGUKKwlFWFRMSUJTICs9IC1MJChaTElCX1BBVEgpLyQobGliKSAkKENDX0xEX0RZTlBBVEgpJChaTElCX1BBVEgpLyQobGliKQorZW5kaWYKK0VYVExJQlMgKz0gLWx6CisKK2lmZGVmIE5FRURTX1NPQ0tFVAorCUVYVExJQlMgKz0gLWxzb2NrZXQKK2VuZGlmCitpZmRlZiBORUVEU19OU0wKKwlFWFRMSUJTICs9IC1sbnNsCitlbmRpZgoraWZkZWYgTk9fRF9UWVBFX0lOX0RJUkVOVAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0RfVFlQRV9JTl9ESVJFTlQKK2VuZGlmCitpZmRlZiBOT19EX0lOT19JTl9ESVJFTlQKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19EX0lOT19JTl9ESVJFTlQKK2VuZGlmCitpZmRlZiBOT19TVF9CTE9DS1NfSU5fU1RSVUNUX1NUQVQKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19TVF9CTE9DS1NfSU5fU1RSVUNUX1NUQVQKK2VuZGlmCitpZmRlZiBVU0VfTlNFQworCUJBU0lDX0NGTEFHUyArPSAtRFVTRV9OU0VDCitlbmRpZgoraWZkZWYgVVNFX1NUX1RJTUVTUEVDCisJQkFTSUNfQ0ZMQUdTICs9IC1EVVNFX1NUX1RJTUVTUEVDCitlbmRpZgoraWZkZWYgTk9fTlNFQworCUJBU0lDX0NGTEFHUyArPSAtRE5PX05TRUMKK2VuZGlmCitpZmRlZiBOT19DOTlfRk9STUFUCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fQzk5X0ZPUk1BVAorZW5kaWYKK2lmZGVmIFNOUFJJTlRGX1JFVFVSTlNfQk9HVVMKKwlDT01QQVRfQ0ZMQUdTICs9IC1EU05QUklOVEZfUkVUVVJOU19CT0dVUworCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9zbnByaW50Zi5vCitlbmRpZgoraWZkZWYgRlJFQURfUkVBRFNfRElSRUNUT1JJRVMKKwlDT01QQVRfQ0ZMQUdTICs9IC1ERlJFQURfUkVBRFNfRElSRUNUT1JJRVMKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvZm9wZW4ubworZW5kaWYKK2lmZGVmIE5PX1NZTUxJTktfSEVBRAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX1NZTUxJTktfSEVBRAorZW5kaWYKK2lmZGVmIE5PX1NUUkNBU0VTVFIKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fU1RSQ0FTRVNUUgorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9zdHJjYXNlc3RyLm8KK2VuZGlmCitpZmRlZiBOT19TVFJUT1VNQVgKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fU1RSVE9VTUFYCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3N0cnRvdW1heC5vCitlbmRpZgoraWZkZWYgTk9fU1RSVE9VTEwKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fU1RSVE9VTEwKK2VuZGlmCitpZmRlZiBOT19TRVRFTlYKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fU0VURU5WCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3NldGVudi5vCitlbmRpZgoraWZkZWYgTk9fTUtEVEVNUAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19NS0RURU1QCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L21rZHRlbXAubworZW5kaWYKK2lmZGVmIE5PX1VOU0VURU5WCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX1VOU0VURU5WCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3Vuc2V0ZW52Lm8KK2VuZGlmCitpZmRlZiBOT19TWVNfU0VMRUNUX0gKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19TWVNfU0VMRUNUX0gKK2VuZGlmCitpZmRlZiBOT19NTUFQCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX01NQVAKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvbW1hcC5vCitlbHNlCisJaWZkZWYgVVNFX1dJTjMyX01NQVAKKwkJQ09NUEFUX0NGTEFHUyArPSAtRFVTRV9XSU4zMl9NTUFQCisJCUNPTVBBVF9PQkpTICs9IGNvbXBhdC93aW4zMm1tYXAubworCWVuZGlmCitlbmRpZgoraWZkZWYgTk9fUFJFQUQKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fUFJFQUQKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvcHJlYWQubworZW5kaWYKK2lmZGVmIE5PX0ZBU1RfV09SS0lOR19ESVJFQ1RPUlkKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19GQVNUX1dPUktJTkdfRElSRUNUT1JZCitlbmRpZgoraWZkZWYgTk9fVFJVU1RBQkxFX0ZJTEVNT0RFCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fVFJVU1RBQkxFX0ZJTEVNT0RFCitlbmRpZgoraWZkZWYgTk9fSVBWNgorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0lQVjYKK2VuZGlmCitpZmRlZiBOT19VSU5UTUFYX1QKKwlCQVNJQ19DRkxBR1MgKz0gLUR1aW50bWF4X3Q9dWludDMyX3QKK2VuZGlmCitpZmRlZiBOT19TT0NLQUREUl9TVE9SQUdFCitpZmRlZiBOT19JUFY2CisJQkFTSUNfQ0ZMQUdTICs9IC1Ec29ja2FkZHJfc3RvcmFnZT1zb2NrYWRkcl9pbgorZWxzZQorCUJBU0lDX0NGTEFHUyArPSAtRHNvY2thZGRyX3N0b3JhZ2U9c29ja2FkZHJfaW42CitlbmRpZgorZW5kaWYKK2lmZGVmIE5PX0lORVRfTlRPUAorCUxJQl9PQkpTICs9IGNvbXBhdC9pbmV0X250b3AubworZW5kaWYKK2lmZGVmIE5PX0lORVRfUFRPTgorCUxJQl9PQkpTICs9IGNvbXBhdC9pbmV0X3B0b24ubworZW5kaWYKKworaWZkZWYgTk9fSUNPTlYKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19JQ09OVgorZW5kaWYKKworaWZkZWYgT0xEX0lDT05WCisJQkFTSUNfQ0ZMQUdTICs9IC1ET0xEX0lDT05WCitlbmRpZgorCitpZmRlZiBOT19ERUZMQVRFX0JPVU5ECisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fREVGTEFURV9CT1VORAorZW5kaWYKKworaWZkZWYgUFBDX1NIQTEKKwlTSEExX0hFQURFUiA9ICJwcGMvc2hhMS5oIgorCUxJQl9PQkpTICs9IHBwYy9zaGExLm8gcHBjL3NoYTFwcGMubworZWxzZQoraWZkZWYgQVJNX1NIQTEKKwlTSEExX0hFQURFUiA9ICJhcm0vc2hhMS5oIgorCUxJQl9PQkpTICs9IGFybS9zaGExLm8gYXJtL3NoYTFfYXJtLm8KK2Vsc2UKK2lmZGVmIE1PWklMTEFfU0hBMQorCVNIQTFfSEVBREVSID0gIm1vemlsbGEtc2hhMS9zaGExLmgiCisJTElCX09CSlMgKz0gbW96aWxsYS1zaGExL3NoYTEubworZWxzZQorCVNIQTFfSEVBREVSID0gPG9wZW5zc2wvc2hhLmg+CisJRVhUTElCUyArPSAkKExJQl80X0NSWVBUTykKK2VuZGlmCitlbmRpZgorZW5kaWYKK2lmZGVmIE5PX1BFUkxfTUFLRU1BS0VSCisJZXhwb3J0IE5PX1BFUkxfTUFLRU1BS0VSCitlbmRpZgoraWZkZWYgTk9fSFNUUkVSUk9SCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX0hTVFJFUlJPUgorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9oc3RyZXJyb3IubworZW5kaWYKK2lmZGVmIE5PX01FTU1FTQorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19NRU1NRU0KKwlDT01QQVRfT0JKUyArPSBjb21wYXQvbWVtbWVtLm8KK2VuZGlmCitpZmRlZiBJTlRFUk5BTF9RU09SVAorCUNPTVBBVF9DRkxBR1MgKz0gLURJTlRFUk5BTF9RU09SVAorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9xc29ydC5vCitlbmRpZgoraWZkZWYgUlVOVElNRV9QUkVGSVgKKwlDT01QQVRfQ0ZMQUdTICs9IC1EUlVOVElNRV9QUkVGSVgKK2VuZGlmCisKK2lmZGVmIERJUl9IQVNfQlNEX0dST1VQX1NFTUFOVElDUworCUNPTVBBVF9DRkxBR1MgKz0gLURESVJfSEFTX0JTRF9HUk9VUF9TRU1BTlRJQ1MKK2VuZGlmCitpZmRlZiBOT19FWFRFUk5BTF9HUkVQCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fRVhURVJOQUxfR1JFUAorZW5kaWYKKworaWZlcSAoJChQRVJMX1BBVEgpLCkKK05PX1BFUkw9Tm9UaGFua3MKK2VuZGlmCisKK1FVSUVUX1NVQkRJUjAgID0gKyQoTUFLRSkgLUMgIyBzcGFjZSB0byBzZXBhcmF0ZSAtQyBhbmQgc3ViZGlyCitRVUlFVF9TVUJESVIxICA9CisKK2lmbmVxICgkKGZpbmRzdHJpbmcgJChNQUtFRkxBR1MpLHcpLHcpCitQUklOVF9ESVIgPSAtLW5vLXByaW50LWRpcmVjdG9yeQorZWxzZSAjICJtYWtlIC13IgorTk9fU1VCRElSID0gOgorZW5kaWYKKworaWZuZXEgKCQoZmluZHN0cmluZyAkKE1BS0VGTEFHUykscykscykKK2lmbmRlZiBWCisJUVVJRVRfQ0MgICAgICAgPSBAZWNobyAnICAgJyBDQyAkQDsKKwlRVUlFVF9BUiAgICAgICA9IEBlY2hvICcgICAnIEFSICRAOworCVFVSUVUX0xJTksgICAgID0gQGVjaG8gJyAgICcgTElOSyAkQDsKKwlRVUlFVF9CVUlMVF9JTiA9IEBlY2hvICcgICAnIEJVSUxUSU4gJEA7CisJUVVJRVRfR0VOICAgICAgPSBAZWNobyAnICAgJyBHRU4gJEA7CisJUVVJRVRfU1VCRElSMCAgPSArQHN1YmRpcj0KKwlRVUlFVF9TVUJESVIxICA9IDskKE5PX1NVQkRJUikgZWNobyAnICAgJyBTVUJESVIgJCRzdWJkaXI7IFwKKwkJCSAkKE1BS0UpICQoUFJJTlRfRElSKSAtQyAkJHN1YmRpcgorCWV4cG9ydCBWCisJZXhwb3J0IFFVSUVUX0dFTgorCWV4cG9ydCBRVUlFVF9CVUlMVF9JTgorZW5kaWYKK2VuZGlmCisKK2lmZGVmIEFTQ0lJRE9DOAorCWV4cG9ydCBBU0NJSURPQzgKK2VuZGlmCisKKyMgU2hlbGwgcXVvdGUgKGRvIG5vdCB1c2UgJChjYWxsKSB0byBhY2NvbW1vZGF0ZSBhbmNpZW50IHNldHVwcyk7CisKK1NIQTFfSEVBREVSX1NRID0gJChzdWJzdCAnLCdcJycsJChTSEExX0hFQURFUikpCitFVENfUEVSRkNPTkZJR19TUSA9ICQoc3Vic3QgJywnXCcnLCQoRVRDX1BFUkZDT05GSUcpKQorCitERVNURElSX1NRID0gJChzdWJzdCAnLCdcJycsJChERVNURElSKSkKK2JpbmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoYmluZGlyKSkKK2JpbmRpcl9yZWxhdGl2ZV9TUSA9ICQoc3Vic3QgJywnXCcnLCQoYmluZGlyX3JlbGF0aXZlKSkKK21hbmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQobWFuZGlyKSkKK2luZm9kaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKGluZm9kaXIpKQorcGVyZmV4ZWNkaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKHBlcmZleGVjZGlyKSkKK3RlbXBsYXRlX2Rpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQodGVtcGxhdGVfZGlyKSkKK2h0bWxkaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKGh0bWxkaXIpKQorcHJlZml4X1NRID0gJChzdWJzdCAnLCdcJycsJChwcmVmaXgpKQorCitTSEVMTF9QQVRIX1NRID0gJChzdWJzdCAnLCdcJycsJChTSEVMTF9QQVRIKSkKK1BFUkxfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoUEVSTF9QQVRIKSkKKworTElCUyA9ICQoUEVSRkxJQlMpICQoRVhUTElCUykKKworQkFTSUNfQ0ZMQUdTICs9IC1EU0hBMV9IRUFERVI9JyQoU0hBMV9IRUFERVJfU1EpJyBcCisJJChDT01QQVRfQ0ZMQUdTKQorTElCX09CSlMgKz0gJChDT01QQVRfT0JKUykKKworQUxMX0NGTEFHUyArPSAkKEJBU0lDX0NGTEFHUykKK0FMTF9MREZMQUdTICs9ICQoQkFTSUNfTERGTEFHUykKKworZXhwb3J0IFRBUiBJTlNUQUxMIERFU1RESVIgU0hFTExfUEFUSAorCisKKyMjIyBCdWlsZCBydWxlcworCitTSEVMTCA9ICQoU0hFTExfUEFUSCkKKworYWxsOjogc2hlbGxfY29tcGF0aWJpbGl0eV90ZXN0ICQoQUxMX1BST0dSQU1TKSAkKEJVSUxUX0lOUykgJChPVEhFUl9QUk9HUkFNUykgUEVSRi1CVUlMRC1PUFRJT05TCitpZm5lcSAoLCRYKQorCSQoZm9yZWFjaCBwLCQocGF0c3Vic3QgJSRYLCUsJChmaWx0ZXIgJSRYLCQoQUxMX1BST0dSQU1TKSAkKEJVSUxUX0lOUykgcGVyZiRYKSksIHRlc3QgJyRwJyAtZWYgJyRwJFgnIHx8ICQoUk0pICckcCc7KQorZW5kaWYKKworYWxsOjoKKworcGxlYXNlX3NldF9TSEVMTF9QQVRIX3RvX2FfbW9yZV9tb2Rlcm5fc2hlbGw6CisJQCQkKDopCisKK3NoZWxsX2NvbXBhdGliaWxpdHlfdGVzdDogcGxlYXNlX3NldF9TSEVMTF9QQVRIX3RvX2FfbW9yZV9tb2Rlcm5fc2hlbGwKKworc3RyaXA6ICQoUFJPR1JBTVMpIHBlcmYkWAorCSQoU1RSSVApICQoU1RSSVBfT1BUUykgJChQUk9HUkFNUykgcGVyZiRYCisKK3BlcmYubzogcGVyZi5jIGNvbW1vbi1jbWRzLmggUEVSRi1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1EUEVSRl9WRVJTSU9OPSciJChQRVJGX1ZFUlNJT04pIicgXAorCQknLURQRVJGX0hUTUxfUEFUSD0iJChodG1sZGlyX1NRKSInIFwKKwkJJChBTExfQ0ZMQUdTKSAtYyAkKGZpbHRlciAlLmMsJF4pCisKK3BlcmYkWDogcGVyZi5vICQoQlVJTFRJTl9PQkpTKSAkKFBFUkZMSUJTKQorCSQoUVVJRVRfTElOSykkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAIHBlcmYubyBcCisJCSQoQlVJTFRJTl9PQkpTKSAkKEFMTF9MREZMQUdTKSAkKExJQlMpCisKK2J1aWx0aW4taGVscC5vOiBidWlsdGluLWhlbHAuYyBjb21tb24tY21kcy5oIFBFUkYtQ0ZMQUdTCisJJChRVUlFVF9DQykkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgXAorCQknLURQRVJGX0hUTUxfUEFUSD0iJChodG1sZGlyX1NRKSInIFwKKwkJJy1EUEVSRl9NQU5fUEFUSD0iJChtYW5kaXJfU1EpIicgXAorCQknLURQRVJGX0lORk9fUEFUSD0iJChpbmZvZGlyX1NRKSInICQ8CisKKyQoQlVJTFRfSU5TKTogcGVyZiRYCisJJChRVUlFVF9CVUlMVF9JTikkKFJNKSAkQCAmJiBcCisJbG4gcGVyZiRYICRAIDI+L2Rldi9udWxsIHx8IFwKKwlsbiAtcyBwZXJmJFggJEAgMj4vZGV2L251bGwgfHwgXAorCWNwIHBlcmYkWCAkQAorCitjb21tb24tY21kcy5oOiB1dGlsL2dlbmVyYXRlLWNtZGxpc3Quc2ggY29tbWFuZC1saXN0LnR4dAorCitjb21tb24tY21kcy5oOiAkKHdpbGRjYXJkIERvY3VtZW50YXRpb24vcGVyZi0qLnR4dCkKKwkkKFFVSUVUX0dFTil1dGlsL2dlbmVyYXRlLWNtZGxpc3Quc2ggPiAkQCsgJiYgbXYgJEArICRACisKKyQocGF0c3Vic3QgJS5zaCwlLCQoU0NSSVBUX1NIKSkgOiAlIDogJS5zaAorCSQoUVVJRVRfR0VOKSQoUk0pICRAICRAKyAmJiBcCisJc2VkIC1lICcxc3wjIS4qL3NofCMhJChTSEVMTF9QQVRIX1NRKXwnIFwKKwkgICAgLWUgJ3N8QFNIRUxMX1BBVEhAfCQoU0hFTExfUEFUSF9TUSl8JyBcCisJICAgIC1lICdzfEBAUEVSTEBAfCQoUEVSTF9QQVRIX1NRKXxnJyBcCisJICAgIC1lICdzL0BAUEVSRl9WRVJTSU9OQEAvJChQRVJGX1ZFUlNJT04pL2cnIFwKKwkgICAgLWUgJ3MvQEBOT19DVVJMQEAvJChOT19DVVJMKS9nJyBcCisJICAgICRALnNoID4kQCsgJiYgXAorCWNobW9kICt4ICRAKyAmJiBcCisJbXYgJEArICRACisKK2NvbmZpZ3VyZTogY29uZmlndXJlLmFjCisJJChRVUlFVF9HRU4pJChSTSkgJEAgJDwrICYmIFwKKwlzZWQgLWUgJ3MvQEBQRVJGX1ZFUlNJT05AQC8kKFBFUkZfVkVSU0lPTikvZycgXAorCSAgICAkPCA+ICQ8KyAmJiBcCisJYXV0b2NvbmYgLW8gJEAgJDwrICYmIFwKKwkkKFJNKSAkPCsKKworIyBUaGVzZSBjYW4gcmVjb3JkIFBFUkZfVkVSU0lPTgorcGVyZi5vIHBlcmYuc3BlYyBcCisJJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKSBcCisJJChwYXRzdWJzdCAlLnBlcmwsJSwkKFNDUklQVF9QRVJMKSkgXAorCTogUEVSRi1WRVJTSU9OLUZJTEUKKworJS5vOiAlLmMgUEVSRi1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAkPAorJS5zOiAlLmMgUEVSRi1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1TICQoQUxMX0NGTEFHUykgJDwKKyUubzogJS5TCisJJChRVUlFVF9DQykkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgJDwKKwordXRpbC9leGVjX2NtZC5vOiB1dGlsL2V4ZWNfY21kLmMgUEVSRi1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSBcCisJCSctRFBFUkZfRVhFQ19QQVRIPSIkKHBlcmZleGVjZGlyX1NRKSInIFwKKwkJJy1EQklORElSPSIkKGJpbmRpcl9yZWxhdGl2ZV9TUSkiJyBcCisJCSctRFBSRUZJWD0iJChwcmVmaXhfU1EpIicgXAorCQkkPAorCitidWlsdGluLWluaXQtZGIubzogYnVpbHRpbi1pbml0LWRiLmMgUEVSRi1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtRERFRkFVTFRfUEVSRl9URU1QTEFURV9ESVI9JyIkKHRlbXBsYXRlX2Rpcl9TUSkiJyAkPAorCit1dGlsL2NvbmZpZy5vOiB1dGlsL2NvbmZpZy5jIFBFUkYtQ0ZMQUdTCisJJChRVUlFVF9DQykkKENDKSAtbyAkKi5vIC1jICQoQUxMX0NGTEFHUykgLURFVENfUEVSRkNPTkZJRz0nIiQoRVRDX1BFUkZDT05GSUdfU1EpIicgJDwKKworcGVyZi0lJFg6ICUubyAkKFBFUkZMSUJTKQorCSQoUVVJRVRfTElOSykkKENDKSAkKEFMTF9DRkxBR1MpIC1vICRAICQoQUxMX0xERkxBR1MpICQoZmlsdGVyICUubywkXikgJChMSUJTKQorCiskKExJQl9PQkpTKSAkKEJVSUxUSU5fT0JKUyk6ICQoTElCX0gpCiskKHBhdHN1YnN0IHBlcmYtJSRYLCUubywkKFBST0dSQU1TKSk6ICQoTElCX0gpICQod2lsZGNhcmQgKi8qLmgpCitidWlsdGluLXJldmVydC5vIHd0LXN0YXR1cy5vOiB3dC1zdGF0dXMuaAorCiskKExJQl9GSUxFKTogJChMSUJfT0JKUykKKwkkKFFVSUVUX0FSKSQoUk0pICRAICYmICQoQVIpIHJjcyAkQCAkKExJQl9PQkpTKQorCitkb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGFsbAorCittYW46CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIG1hbgorCitodG1sOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBodG1sCisKK2luZm86CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGluZm8KKworcGRmOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBwZGYKKworVEFHUzoKKwkkKFJNKSBUQUdTCisJJChGSU5EKSAuIC1uYW1lICcqLltoY1NdJyAtcHJpbnQgfCB4YXJncyBldGFncyAtYQorCit0YWdzOgorCSQoUk0pIHRhZ3MKKwkkKEZJTkQpIC4gLW5hbWUgJyouW2hjU10nIC1wcmludCB8IHhhcmdzIGN0YWdzIC1hCisKK2NzY29wZToKKwkkKFJNKSBjc2NvcGUqCisJJChGSU5EKSAuIC1uYW1lICcqLltoY1NdJyAtcHJpbnQgfCB4YXJncyBjc2NvcGUgLWIKKworIyMjIERldGVjdCBwcmVmaXggY2hhbmdlcworVFJBQ0tfQ0ZMQUdTID0gJChzdWJzdCAnLCdcJycsJChBTExfQ0ZMQUdTKSk6XAorICAgICAgICAgICAgICQoYmluZGlyX1NRKTokKHBlcmZleGVjZGlyX1NRKTokKHRlbXBsYXRlX2Rpcl9TUSk6JChwcmVmaXhfU1EpCisKK1BFUkYtQ0ZMQUdTOiAuRk9SQ0UtUEVSRi1DRkxBR1MKKwlARkxBR1M9JyQoVFJBQ0tfQ0ZMQUdTKSc7IFwKKwkgICAgaWYgdGVzdCB4IiQkRkxBR1MiICE9IHgiYGNhdCBQRVJGLUNGTEFHUyAyPi9kZXYvbnVsbGAiIDsgdGhlbiBcCisJCWVjaG8gMT4mMiAiICAgICogbmV3IGJ1aWxkIGZsYWdzIG9yIHByZWZpeCI7IFwKKwkJZWNobyAiJCRGTEFHUyIgPlBFUkYtQ0ZMQUdTOyBcCisgICAgICAgICAgICBmaQorCisjIFdlIG5lZWQgdG8gYXBwbHkgc3EgdHdpY2UsIG9uY2UgdG8gcHJvdGVjdCBmcm9tIHRoZSBzaGVsbAorIyB0aGF0IHJ1bnMgUEVSRi1CVUlMRC1PUFRJT05TLCBhbmQgdGhlbiBhZ2FpbiB0byBwcm90ZWN0IGl0CisjIGFuZCB0aGUgZmlyc3QgbGV2ZWwgcXVvdGluZyBmcm9tIHRoZSBzaGVsbCB0aGF0IHJ1bnMgImVjaG8iLgorUEVSRi1CVUlMRC1PUFRJT05TOiAuRk9SQ0UtUEVSRi1CVUlMRC1PUFRJT05TCisJQGVjaG8gU0hFTExfUEFUSD1cJyckKHN1YnN0ICcsJ1wnJywkKFNIRUxMX1BBVEhfU1EpKSdcJyA+JEAKKwlAZWNobyBUQVI9XCcnJChzdWJzdCAnLCdcJycsJChzdWJzdCAnLCdcJycsJChUQVIpKSknXCcgPj4kQAorCUBlY2hvIE5PX0NVUkw9XCcnJChzdWJzdCAnLCdcJycsJChzdWJzdCAnLCdcJycsJChOT19DVVJMKSkpJ1wnID4+JEAKKwlAZWNobyBOT19QRVJMPVwnJyQoc3Vic3QgJywnXCcnLCQoc3Vic3QgJywnXCcnLCQoTk9fUEVSTCkpKSdcJyA+PiRACisKKyMjIyBUZXN0aW5nIHJ1bGVzCisKKyMKKyMgTm9uZSByaWdodCBub3c6CisjCisjIFRFU1RfUFJPR1JBTVMgKz0gdGVzdC1zb21ldGhpbmckWAorCithbGw6OiAkKFRFU1RfUFJPR1JBTVMpCisKKyMgR05VIG1ha2Ugc3VwcG9ydHMgZXhwb3J0aW5nIGFsbCB2YXJpYWJsZXMgYnkgImV4cG9ydCIgd2l0aG91dCBwYXJhbWV0ZXJzLgorIyBIb3dldmVyLCB0aGUgZW52aXJvbm1lbnQgZ2V0cyBxdWl0ZSBiaWcsIGFuZCBzb21lIHByb2dyYW1zIGhhdmUgcHJvYmxlbXMKKyMgd2l0aCB0aGF0LgorCitleHBvcnQgTk9fU1ZOX1RFU1RTCisKK2NoZWNrOiBjb21tb24tY21kcy5oCisJaWYgc3BhcnNlOyBcCisJdGhlbiBcCisJCWZvciBpIGluICouYyAqLyouYzsgXAorCQlkbyBcCisJCQlzcGFyc2UgJChBTExfQ0ZMQUdTKSAkKFNQQVJTRV9GTEFHUykgJCRpIHx8IGV4aXQ7IFwKKwkJZG9uZTsgXAorCWVsc2UgXAorCQllY2hvIDI+JjEgIkRpZCB5b3UgbWVhbiAnbWFrZSB0ZXN0Jz8iOyBcCisJCWV4aXQgMTsgXAorCWZpCisKK3JlbW92ZS1kYXNoZXM6CisJLi9maXh1cC1idWlsdGlucyAkKEJVSUxUX0lOUykgJChQUk9HUkFNUykgJChTQ1JJUFRTKQorCisjIyMgSW5zdGFsbGF0aW9uIHJ1bGVzCisKK2lmbmVxICgkKGZpbHRlciAvJSwkKGZpcnN0d29yZCAkKHRlbXBsYXRlX2RpcikpKSwpCit0ZW1wbGF0ZV9pbnN0ZGlyID0gJCh0ZW1wbGF0ZV9kaXIpCitlbHNlCit0ZW1wbGF0ZV9pbnN0ZGlyID0gJChwcmVmaXgpLyQodGVtcGxhdGVfZGlyKQorZW5kaWYKK2V4cG9ydCB0ZW1wbGF0ZV9pbnN0ZGlyCisKK2lmbmVxICgkKGZpbHRlciAvJSwkKGZpcnN0d29yZCAkKHBlcmZleGVjZGlyKSkpLCkKK3BlcmZleGVjX2luc3RkaXIgPSAkKHBlcmZleGVjZGlyKQorZWxzZQorcGVyZmV4ZWNfaW5zdGRpciA9ICQocHJlZml4KS8kKHBlcmZleGVjZGlyKQorZW5kaWYKK3BlcmZleGVjX2luc3RkaXJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKHBlcmZleGVjX2luc3RkaXIpKQorZXhwb3J0IHBlcmZleGVjX2luc3RkaXIKKworaW5zdGFsbDogYWxsCisJJChJTlNUQUxMKSAtZCAtbSA3NTUgJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSknCisJJChJTlNUQUxMKSBwZXJmJFggJyQoREVTVERJUl9TUSkkKGJpbmRpcl9TUSknCitpZmRlZiBCVUlMVF9JTlMKKwkkKElOU1RBTEwpIC1kIC1tIDc1NSAnJChERVNURElSX1NRKSQocGVyZmV4ZWNfaW5zdGRpcl9TUSknCisJJChJTlNUQUxMKSAkKEJVSUxUX0lOUykgJyQoREVTVERJUl9TUSkkKHBlcmZleGVjX2luc3RkaXJfU1EpJworaWZuZXEgKCwkWCkKKwkkKGZvcmVhY2ggcCwkKHBhdHN1YnN0ICUkWCwlLCQoZmlsdGVyICUkWCwkKEFMTF9QUk9HUkFNUykgJChCVUlMVF9JTlMpIHBlcmYkWCkpLCAkKFJNKSAnJChERVNURElSX1NRKSQocGVyZmV4ZWNfaW5zdGRpcl9TUSkvJHAnOykKK2VuZGlmCitlbmRpZgorCitpbnN0YWxsLWRvYzoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gaW5zdGFsbAorCitpbnN0YWxsLW1hbjoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gaW5zdGFsbC1tYW4KKworaW5zdGFsbC1odG1sOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBpbnN0YWxsLWh0bWwKKworaW5zdGFsbC1pbmZvOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBpbnN0YWxsLWluZm8KKworaW5zdGFsbC1wZGY6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGluc3RhbGwtcGRmCisKK3F1aWNrLWluc3RhbGwtZG9jOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBxdWljay1pbnN0YWxsCisKK3F1aWNrLWluc3RhbGwtbWFuOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBxdWljay1pbnN0YWxsLW1hbgorCitxdWljay1pbnN0YWxsLWh0bWw6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIHF1aWNrLWluc3RhbGwtaHRtbAorCisKKyMjIyBNYWludGFpbmVyJ3MgZGlzdCBydWxlcworIworIyBOb25lIHJpZ2h0IG5vdworIworIworIyBwZXJmLnNwZWM6IHBlcmYuc3BlYy5pbgorIwlzZWQgLWUgJ3MvQEBWRVJTSU9OQEAvJChQRVJGX1ZFUlNJT04pL2cnIDwgJDwgPiAkQCsKKyMJbXYgJEArICRACisjCisjIFBFUkZfVEFSTkFNRT1wZXJmLSQoUEVSRl9WRVJTSU9OKQorIyBkaXN0OiBwZXJmLnNwZWMgcGVyZi1hcmNoaXZlJChYKSBjb25maWd1cmUKKyMJLi9wZXJmLWFyY2hpdmUgLS1mb3JtYXQ9dGFyIFwKKyMJCS0tcHJlZml4PSQoUEVSRl9UQVJOQU1FKS8gSEVBRF57dHJlZX0gPiAkKFBFUkZfVEFSTkFNRSkudGFyCisjCUBta2RpciAtcCAkKFBFUkZfVEFSTkFNRSkKKyMJQGNwIHBlcmYuc3BlYyBjb25maWd1cmUgJChQRVJGX1RBUk5BTUUpCisjCUBlY2hvICQoUEVSRl9WRVJTSU9OKSA+ICQoUEVSRl9UQVJOQU1FKS92ZXJzaW9uCisjCSQoVEFSKSByZiAkKFBFUkZfVEFSTkFNRSkudGFyIFwKKyMJCSQoUEVSRl9UQVJOQU1FKS9wZXJmLnNwZWMgXAorIwkJJChQRVJGX1RBUk5BTUUpL2NvbmZpZ3VyZSBcCisjCQkkKFBFUkZfVEFSTkFNRSkvdmVyc2lvbgorIwlAJChSTSkgLXIgJChQRVJGX1RBUk5BTUUpCisjCWd6aXAgLWYgLTkgJChQRVJGX1RBUk5BTUUpLnRhcgorIworIyBodG1sZG9jcyA9IHBlcmYtaHRtbGRvY3MtJChQRVJGX1ZFUlNJT04pCisjIG1hbnBhZ2VzID0gcGVyZi1tYW5wYWdlcy0kKFBFUkZfVkVSU0lPTikKKyMgZGlzdC1kb2M6CisjCSQoUk0pIC1yIC5kb2MtdG1wLWRpcgorIwlta2RpciAuZG9jLXRtcC1kaXIKKyMJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIFdFQkRPQ19ERVNUPS4uLy5kb2MtdG1wLWRpciBpbnN0YWxsLXdlYmRvYworIwljZCAuZG9jLXRtcC1kaXIgJiYgJChUQVIpIGNmIC4uLyQoaHRtbGRvY3MpLnRhciAuCisjCWd6aXAgLW4gLTkgLWYgJChodG1sZG9jcykudGFyCisjCToKKyMJJChSTSkgLXIgLmRvYy10bXAtZGlyCisjCW1rZGlyIC1wIC5kb2MtdG1wLWRpci9tYW4xIC5kb2MtdG1wLWRpci9tYW41IC5kb2MtdG1wLWRpci9tYW43CisjCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBERVNURElSPS4vIFwKKyMJCW1hbjFkaXI9Li4vLmRvYy10bXAtZGlyL21hbjEgXAorIwkJbWFuNWRpcj0uLi8uZG9jLXRtcC1kaXIvbWFuNSBcCisjCQltYW43ZGlyPS4uLy5kb2MtdG1wLWRpci9tYW43IFwKKyMJCWluc3RhbGwKKyMJY2QgLmRvYy10bXAtZGlyICYmICQoVEFSKSBjZiAuLi8kKG1hbnBhZ2VzKS50YXIgLgorIwlnemlwIC1uIC05IC1mICQobWFucGFnZXMpLnRhcgorIwkkKFJNKSAtciAuZG9jLXRtcC1kaXIKKyMKKyMgcnBtOiBkaXN0CisjCSQoUlBNQlVJTEQpIC10YSAkKFBFUkZfVEFSTkFNRSkudGFyLmd6CisKKyMjIyBDbGVhbmluZyBydWxlcworCitkaXN0Y2xlYW46IGNsZWFuCisjCSQoUk0pIGNvbmZpZ3VyZQorCitjbGVhbjoKKwkkKFJNKSAqLm8gKi8qLm8gJChMSUJfRklMRSkKKwkkKFJNKSAkKEFMTF9QUk9HUkFNUykgJChCVUlMVF9JTlMpIHBlcmYkWAorCSQoUk0pICQoVEVTVF9QUk9HUkFNUykKKwkkKFJNKSAqLnNwZWMgKi5weWMgKi5weW8gKi8qLnB5YyAqLyoucHlvIGNvbW1vbi1jbWRzLmggVEFHUyB0YWdzIGNzY29wZSoKKwkkKFJNKSAtciBhdXRvbTR0ZS5jYWNoZQorCSQoUk0pIGNvbmZpZy5sb2cgY29uZmlnLm1hay5hdXRvZ2VuIGNvbmZpZy5tYWsuYXBwZW5kIGNvbmZpZy5zdGF0dXMgY29uZmlnLmNhY2hlCisJJChSTSkgLXIgJChQRVJGX1RBUk5BTUUpIC5kb2MtdG1wLWRpcgorCSQoUk0pICQoUEVSRl9UQVJOQU1FKS50YXIuZ3ogcGVyZi1jb3JlXyQoUEVSRl9WRVJTSU9OKS0qLnRhci5negorCSQoUk0pICQoaHRtbGRvY3MpLnRhci5neiAkKG1hbnBhZ2VzKS50YXIuZ3oKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24vIGNsZWFuCisJJChSTSkgUEVSRi1WRVJTSU9OLUZJTEUgUEVSRi1DRkxBR1MgUEVSRi1CVUlMRC1PUFRJT05TCisKKy5QSE9OWTogYWxsIGluc3RhbGwgY2xlYW4gc3RyaXAKKy5QSE9OWTogc2hlbGxfY29tcGF0aWJpbGl0eV90ZXN0IHBsZWFzZV9zZXRfU0hFTExfUEFUSF90b19hX21vcmVfbW9kZXJuX3NoZWxsCisuUEhPTlk6IC5GT1JDRS1QRVJGLVZFUlNJT04tRklMRSBUQUdTIHRhZ3MgY3Njb3BlIC5GT1JDRS1QRVJGLUNGTEFHUworLlBIT05ZOiAuRk9SQ0UtUEVSRi1CVUlMRC1PUFRJT05TCisKKyMjIyBNYWtlIHN1cmUgYnVpbHQtaW5zIGRvIG5vdCBoYXZlIGR1cHMgYW5kIGxpc3RlZCBpbiBwZXJmLmMKKyMKK2NoZWNrLWJ1aWx0aW5zOjoKKwkuL2NoZWNrLWJ1aWx0aW5zLnNoCisKKyMjIyBUZXN0IHN1aXRlIGNvdmVyYWdlIHRlc3RpbmcKKyMKKyMgTm9uZSByaWdodCBub3cKKyMKKyMgLlBIT05ZOiBjb3ZlcmFnZSBjb3ZlcmFnZS1jbGVhbiBjb3ZlcmFnZS1idWlsZCBjb3ZlcmFnZS1yZXBvcnQKKyMKKyMgY292ZXJhZ2U6CisjCSQoTUFLRSkgY292ZXJhZ2UtYnVpbGQKKyMJJChNQUtFKSBjb3ZlcmFnZS1yZXBvcnQKKyMKKyMgY292ZXJhZ2UtY2xlYW46CisjCXJtIC1mICouZ2NkYSAqLmdjbm8KKyMKKyMgQ09WRVJBR0VfQ0ZMQUdTID0gJChDRkxBR1MpIC1PMCAtZnRlc3QtY292ZXJhZ2UgLWZwcm9maWxlLWFyY3MKKyMgQ09WRVJBR0VfTERGTEFHUyA9ICQoQ0ZMQUdTKSAgLU8wIC1sZ2NvdgorIworIyBjb3ZlcmFnZS1idWlsZDogY292ZXJhZ2UtY2xlYW4KKyMJJChNQUtFKSBDRkxBR1M9IiQoQ09WRVJBR0VfQ0ZMQUdTKSIgTERGTEFHUz0iJChDT1ZFUkFHRV9MREZMQUdTKSIgYWxsCisjCSQoTUFLRSkgQ0ZMQUdTPSIkKENPVkVSQUdFX0NGTEFHUykiIExERkxBR1M9IiQoQ09WRVJBR0VfTERGTEFHUykiIFwKKyMJCS1qMSB0ZXN0CisjCisjIGNvdmVyYWdlLXJlcG9ydDoKKyMJZ2NvdiAtYiAqLmMgKi8qLmMKKyMJZ3JlcCAnXmZ1bmN0aW9uLipjYWxsZWQgMCAnICouYy5nY292ICovKi5jLmdjb3YgXAorIwkJfCBzZWQgLWUgJ3MvXChbXjpdKlwpXC5nY292OiAqZnVuY3Rpb24gXChbXiBdKlwpIGNhbGxlZC4qL1wxOiBcMi8nIFwKKyMJCXwgdGVlIGNvdmVyYWdlLXVudGVzdGVkLWZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWVkNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMKQEAgLTAsMCArMSwxMzU2IEBACisvKgorICogYnVpbHRpbi1hbm5vdGF0ZS5jCisgKgorICogQnVpbHRpbiBhbm5vdGF0ZSBjb21tYW5kOiBBbmFseXplIHRoZSBwZXJmLmRhdGEgaW5wdXQgZmlsZSwKKyAqIGxvb2sgdXAgYW5kIHJlYWQgRFNPcyBhbmQgc3ltYm9sIGluZm9ybWF0aW9uIGFuZCBkaXNwbGF5CisgKiBhIGhpc3RvZ3JhbSBvZiByZXN1bHRzLCBhbG9uZyB2YXJpb3VzIHNvcnRpbmcga2V5cy4KKyAqLworI2luY2x1ZGUgImJ1aWx0aW4uaCIKKworI2luY2x1ZGUgInV0aWwvdXRpbC5oIgorCisjaW5jbHVkZSAidXRpbC9jb2xvci5oIgorI2luY2x1ZGUgInV0aWwvbGlzdC5oIgorI2luY2x1ZGUgInV0aWwvY2FjaGUuaCIKKyNpbmNsdWRlICJ1dGlsL3JidHJlZS5oIgorI2luY2x1ZGUgInV0aWwvc3ltYm9sLmgiCisjaW5jbHVkZSAidXRpbC9zdHJpbmcuaCIKKworI2luY2x1ZGUgInBlcmYuaCIKKworI2luY2x1ZGUgInV0aWwvcGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgInV0aWwvcGFyc2UtZXZlbnRzLmgiCisKKyNkZWZpbmUgU0hPV19LRVJORUwJMQorI2RlZmluZSBTSE9XX1VTRVIJMgorI2RlZmluZSBTSE9XX0hWCQk0CisKK3N0YXRpYyBjaGFyCQljb25zdCAqaW5wdXRfbmFtZSA9ICJwZXJmLmRhdGEiOworc3RhdGljIGNoYXIJCSp2bWxpbnV4ID0gInZtbGludXgiOworCitzdGF0aWMgY2hhcgkJZGVmYXVsdF9zb3J0X29yZGVyW10gPSAiY29tbSxzeW1ib2wiOworc3RhdGljIGNoYXIJCSpzb3J0X29yZGVyID0gZGVmYXVsdF9zb3J0X29yZGVyOworCitzdGF0aWMgaW50CQlpbnB1dDsKK3N0YXRpYyBpbnQJCXNob3dfbWFzayA9IFNIT1dfS0VSTkVMIHwgU0hPV19VU0VSIHwgU0hPV19IVjsKKworc3RhdGljIGludAkJZHVtcF90cmFjZSA9IDA7CisjZGVmaW5lIGRwcmludGYoeC4uLikJZG8geyBpZiAoZHVtcF90cmFjZSkgcHJpbnRmKHgpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50CQl2ZXJib3NlOworCitzdGF0aWMgdW5zaWduZWQgbG9uZwlwYWdlX3NpemU7CitzdGF0aWMgdW5zaWduZWQgbG9uZwltbWFwX3dpbmRvdyA9IDMyOworCitzdHJ1Y3QgaXBfZXZlbnQgeworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJX191NjQgaXA7CisJX191MzIgcGlkLCB0aWQ7Cit9OworCitzdHJ1Y3QgbW1hcF9ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwlfX3UzMiBwaWQsIHRpZDsKKwlfX3U2NCBzdGFydDsKKwlfX3U2NCBsZW47CisJX191NjQgcGdvZmY7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07Cit9OworCitzdHJ1Y3QgY29tbV9ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwlfX3UzMiBwaWQsIHRpZDsKKwljaGFyIGNvbW1bMTZdOworfTsKKworc3RydWN0IGZvcmtfZXZlbnQgeworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJX191MzIgcGlkLCBwcGlkOworfTsKKworc3RydWN0IHBlcmlvZF9ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwlfX3U2NCB0aW1lOworCV9fdTY0IGlkOworCV9fdTY0IHNhbXBsZV9wZXJpb2Q7Cit9OworCit0eXBlZGVmIHVuaW9uIGV2ZW50X3VuaW9uIHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCXN0cnVjdCBpcF9ldmVudAkJCWlwOworCXN0cnVjdCBtbWFwX2V2ZW50CQltbWFwOworCXN0cnVjdCBjb21tX2V2ZW50CQljb21tOworCXN0cnVjdCBmb3JrX2V2ZW50CQlmb3JrOworCXN0cnVjdCBwZXJpb2RfZXZlbnQJCXBlcmlvZDsKK30gZXZlbnRfdDsKKworc3RhdGljIExJU1RfSEVBRChkc29zKTsKK3N0YXRpYyBzdHJ1Y3QgZHNvICprZXJuZWxfZHNvOworc3RhdGljIHN0cnVjdCBkc28gKnZkc287CisKKworc3RhdGljIHZvaWQgZHNvc19fYWRkKHN0cnVjdCBkc28gKmRzbykKK3sKKwlsaXN0X2FkZF90YWlsKCZkc28tPm5vZGUsICZkc29zKTsKK30KKworc3RhdGljIHN0cnVjdCBkc28gKmRzb3NfX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHNvICpwb3M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmRzb3MsIG5vZGUpCisJCWlmIChzdHJjbXAocG9zLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIHBvczsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkc28gKmRzb3NfX2ZpbmRuZXcoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHNvICpkc28gPSBkc29zX19maW5kKG5hbWUpOworCWludCBucjsKKworCWlmIChkc28pCisJCXJldHVybiBkc287CisKKwlkc28gPSBkc29fX25ldyhuYW1lLCAwKTsKKwlpZiAoIWRzbykKKwkJZ290byBvdXRfZGVsZXRlX2RzbzsKKworCW5yID0gZHNvX19sb2FkKGRzbywgTlVMTCwgdmVyYm9zZSk7CisJaWYgKG5yIDwgMCkgeworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW46ICVzXG4iLCBuYW1lKTsKKwkJZ290byBvdXRfZGVsZXRlX2RzbzsKKwl9CisJaWYgKCFuciAmJiB2ZXJib3NlKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkiTm8gc3ltYm9scyBmb3VuZCBpbjogJXMsIG1heWJlIGluc3RhbGwgYSBkZWJ1ZyBwYWNrYWdlP1xuIiwKKwkJCQluYW1lKTsKKwl9CisKKwlkc29zX19hZGQoZHNvKTsKKworCXJldHVybiBkc287CisKK291dF9kZWxldGVfZHNvOgorCWRzb19fZGVsZXRlKGRzbyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGRzb3NfX2ZwcmludGYoRklMRSAqZnApCit7CisJc3RydWN0IGRzbyAqcG9zOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZkc29zLCBub2RlKQorCQlkc29fX2ZwcmludGYocG9zLCBmcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICp2ZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIF9fdTY0IGlwKQoreworCXJldHVybiBkc29fX2ZpbmRfc3ltYm9sKGtlcm5lbF9kc28sIGlwKTsKK30KKworc3RhdGljIGludCBsb2FkX2tlcm5lbCh2b2lkKQoreworCWludCBlcnI7CisKKwlrZXJuZWxfZHNvID0gZHNvX19uZXcoIltrZXJuZWxdIiwgMCk7CisJaWYgKCFrZXJuZWxfZHNvKQorCQlyZXR1cm4gLTE7CisKKwllcnIgPSBkc29fX2xvYWRfa2VybmVsKGtlcm5lbF9kc28sIHZtbGludXgsIE5VTEwsIHZlcmJvc2UpOworCWlmIChlcnIpIHsKKwkJZHNvX19kZWxldGUoa2VybmVsX2Rzbyk7CisJCWtlcm5lbF9kc28gPSBOVUxMOworCX0gZWxzZQorCQlkc29zX19hZGQoa2VybmVsX2Rzbyk7CisKKwl2ZHNvID0gZHNvX19uZXcoIlt2ZHNvXSIsIDApOworCWlmICghdmRzbykKKwkJcmV0dXJuIC0xOworCisJdmRzby0+ZmluZF9zeW1ib2wgPSB2ZHNvX19maW5kX3N5bWJvbDsKKworCWRzb3NfX2FkZCh2ZHNvKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBtYXAgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlfX3U2NAkgc3RhcnQ7CisJX191NjQJIGVuZDsKKwlfX3U2NAkgcGdvZmY7CisJX191NjQJICgqbWFwX2lwKShzdHJ1Y3QgbWFwICosIF9fdTY0KTsKKwlzdHJ1Y3QgZHNvCSAqZHNvOworfTsKKworc3RhdGljIF9fdTY0IG1hcF9fbWFwX2lwKHN0cnVjdCBtYXAgKm1hcCwgX191NjQgaXApCit7CisJcmV0dXJuIGlwIC0gbWFwLT5zdGFydCArIG1hcC0+cGdvZmY7Cit9CisKK3N0YXRpYyBfX3U2NCB2ZHNvX19tYXBfaXAoc3RydWN0IG1hcCAqbWFwLCBfX3U2NCBpcCkKK3sKKwlyZXR1cm4gaXA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwICptYXBfX25ldyhzdHJ1Y3QgbW1hcF9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IG1hcCAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKKworCWlmIChzZWxmICE9IE5VTEwpIHsKKwkJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBldmVudC0+ZmlsZW5hbWU7CisKKwkJc2VsZi0+c3RhcnQgPSBldmVudC0+c3RhcnQ7CisJCXNlbGYtPmVuZCAgID0gZXZlbnQtPnN0YXJ0ICsgZXZlbnQtPmxlbjsKKwkJc2VsZi0+cGdvZmYgPSBldmVudC0+cGdvZmY7CisKKwkJc2VsZi0+ZHNvID0gZHNvc19fZmluZG5ldyhmaWxlbmFtZSk7CisJCWlmIChzZWxmLT5kc28gPT0gTlVMTCkKKwkJCWdvdG8gb3V0X2RlbGV0ZTsKKworCQlpZiAoc2VsZi0+ZHNvID09IHZkc28pCisJCQlzZWxmLT5tYXBfaXAgPSB2ZHNvX19tYXBfaXA7CisJCWVsc2UKKwkJCXNlbGYtPm1hcF9pcCA9IG1hcF9fbWFwX2lwOworCX0KKwlyZXR1cm4gc2VsZjsKK291dF9kZWxldGU6CisJZnJlZShzZWxmKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtYXAgKm1hcF9fY2xvbmUoc3RydWN0IG1hcCAqc2VsZikKK3sKKwlzdHJ1Y3QgbWFwICptYXAgPSBtYWxsb2Moc2l6ZW9mKCpzZWxmKSk7CisKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkobWFwLCBzZWxmLCBzaXplb2YoKnNlbGYpKTsKKworCXJldHVybiBtYXA7Cit9CisKK3N0YXRpYyBpbnQgbWFwX19vdmVybGFwKHN0cnVjdCBtYXAgKmwsIHN0cnVjdCBtYXAgKnIpCit7CisJaWYgKGwtPnN0YXJ0ID4gci0+c3RhcnQpIHsKKwkJc3RydWN0IG1hcCAqdCA9IGw7CisJCWwgPSByOworCQlyID0gdDsKKwl9CisKKwlpZiAobC0+ZW5kID4gci0+c3RhcnQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzaXplX3QgbWFwX19mcHJpbnRmKHN0cnVjdCBtYXAgKnNlbGYsIEZJTEUgKmZwKQoreworCXJldHVybiBmcHJpbnRmKGZwLCAiICVMeC0lTHggJUx4ICVzXG4iLAorCQkgICAgICAgc2VsZi0+c3RhcnQsIHNlbGYtPmVuZCwgc2VsZi0+cGdvZmYsIHNlbGYtPmRzby0+bmFtZSk7Cit9CisKKworc3RydWN0IHRocmVhZCB7CisJc3RydWN0IHJiX25vZGUJIHJiX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCBtYXBzOworCXBpZF90CQkgcGlkOworCWNoYXIJCSAqY29tbTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGhyZWFkICp0aHJlYWRfX25ldyhwaWRfdCBwaWQpCit7CisJc3RydWN0IHRocmVhZCAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKKworCWlmIChzZWxmICE9IE5VTEwpIHsKKwkJc2VsZi0+cGlkID0gcGlkOworCQlzZWxmLT5jb21tID0gbWFsbG9jKDMyKTsKKwkJaWYgKHNlbGYtPmNvbW0pCisJCQlzbnByaW50ZihzZWxmLT5jb21tLCAzMiwgIjolZCIsIHNlbGYtPnBpZCk7CisJCUlOSVRfTElTVF9IRUFEKCZzZWxmLT5tYXBzKTsKKwl9CisKKwlyZXR1cm4gc2VsZjsKK30KKworc3RhdGljIGludCB0aHJlYWRfX3NldF9jb21tKHN0cnVjdCB0aHJlYWQgKnNlbGYsIGNvbnN0IGNoYXIgKmNvbW0pCit7CisJaWYgKHNlbGYtPmNvbW0pCisJCWZyZWUoc2VsZi0+Y29tbSk7CisJc2VsZi0+Y29tbSA9IHN0cmR1cChjb21tKTsKKwlyZXR1cm4gc2VsZi0+Y29tbSA/IDAgOiAtRU5PTUVNOworfQorCitzdGF0aWMgc2l6ZV90IHRocmVhZF9fZnByaW50ZihzdHJ1Y3QgdGhyZWFkICpzZWxmLCBGSUxFICpmcCkKK3sKKwlzdHJ1Y3QgbWFwICpwb3M7CisJc2l6ZV90IHJldCA9IGZwcmludGYoZnAsICJUaHJlYWQgJWQgJXNcbiIsIHNlbGYtPnBpZCwgc2VsZi0+Y29tbSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnNlbGYtPm1hcHMsIG5vZGUpCisJCXJldCArPSBtYXBfX2ZwcmludGYocG9zLCBmcCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdCB0aHJlYWRzOworc3RhdGljIHN0cnVjdCB0aHJlYWQgKmxhc3RfbWF0Y2g7CisKK3N0YXRpYyBzdHJ1Y3QgdGhyZWFkICp0aHJlYWRzX19maW5kbmV3KHBpZF90IHBpZCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmdGhyZWFkcy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCB0aHJlYWQgKnRoOworCisJLyoKKwkgKiBGb250LWVuZCBjYWNoZSAtIFBJRCBsb29rdXBzIGNvbWUgaW4gYmxvY2tzLAorCSAqIHNvIG1vc3Qgb2YgdGhlIHRpbWUgd2UgZG9udCBoYXZlIHRvIGxvb2sgdXAKKwkgKiB0aGUgZnVsbCByYnRyZWU6CisJICovCisJaWYgKGxhc3RfbWF0Y2ggJiYgbGFzdF9tYXRjaC0+cGlkID09IHBpZCkKKwkJcmV0dXJuIGxhc3RfbWF0Y2g7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJdGggPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCB0aHJlYWQsIHJiX25vZGUpOworCisJCWlmICh0aC0+cGlkID09IHBpZCkgeworCQkJbGFzdF9tYXRjaCA9IHRoOworCQkJcmV0dXJuIHRoOworCQl9CisKKwkJaWYgKHBpZCA8IHRoLT5waWQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJdGggPSB0aHJlYWRfX25ldyhwaWQpOworCWlmICh0aCAhPSBOVUxMKSB7CisJCXJiX2xpbmtfbm9kZSgmdGgtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJCXJiX2luc2VydF9jb2xvcigmdGgtPnJiX25vZGUsICZ0aHJlYWRzKTsKKwkJbGFzdF9tYXRjaCA9IHRoOworCX0KKworCXJldHVybiB0aDsKK30KKworc3RhdGljIHZvaWQgdGhyZWFkX19pbnNlcnRfbWFwKHN0cnVjdCB0aHJlYWQgKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgbWFwICpwb3MsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCB0bXAsICZzZWxmLT5tYXBzLCBub2RlKSB7CisJCWlmIChtYXBfX292ZXJsYXAocG9zLCBtYXApKSB7CisJCQlsaXN0X2RlbF9pbml0KCZwb3MtPm5vZGUpOworCQkJLyogWFhYIGxlYWtzIGRzb3MgKi8KKwkJCWZyZWUocG9zKTsKKwkJfQorCX0KKworCWxpc3RfYWRkX3RhaWwoJm1hcC0+bm9kZSwgJnNlbGYtPm1hcHMpOworfQorCitzdGF0aWMgaW50IHRocmVhZF9fZm9yayhzdHJ1Y3QgdGhyZWFkICpzZWxmLCBzdHJ1Y3QgdGhyZWFkICpwYXJlbnQpCit7CisJc3RydWN0IG1hcCAqbWFwOworCisJaWYgKHNlbGYtPmNvbW0pCisJCWZyZWUoc2VsZi0+Y29tbSk7CisJc2VsZi0+Y29tbSA9IHN0cmR1cChwYXJlbnQtPmNvbW0pOworCWlmICghc2VsZi0+Y29tbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1hcCwgJnBhcmVudC0+bWFwcywgbm9kZSkgeworCQlzdHJ1Y3QgbWFwICpuZXcgPSBtYXBfX2Nsb25lKG1hcCk7CisJCWlmICghbmV3KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXRocmVhZF9faW5zZXJ0X21hcChzZWxmLCBuZXcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1hcCAqdGhyZWFkX19maW5kX21hcChzdHJ1Y3QgdGhyZWFkICpzZWxmLCBfX3U2NCBpcCkKK3sKKwlzdHJ1Y3QgbWFwICpwb3M7CisKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmc2VsZi0+bWFwcywgbm9kZSkKKwkJaWYgKGlwID49IHBvcy0+c3RhcnQgJiYgaXAgPD0gcG9zLT5lbmQpCisJCQlyZXR1cm4gcG9zOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzaXplX3QgdGhyZWFkc19fZnByaW50ZihGSUxFICpmcCkKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisKKwlmb3IgKG5kID0gcmJfZmlyc3QoJnRocmVhZHMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlzdHJ1Y3QgdGhyZWFkICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IHRocmVhZCwgcmJfbm9kZSk7CisKKwkJcmV0ICs9IHRocmVhZF9fZnByaW50Zihwb3MsIGZwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaGlzdG9ncmFtLCBzb3J0ZWQgb24gaXRlbSwgY29sbGVjdHMgY291bnRzCisgKi8KKworc3RhdGljIHN0cnVjdCByYl9yb290IGhpc3Q7CisKK3N0cnVjdCBoaXN0X2VudHJ5IHsKKwlzdHJ1Y3QgcmJfbm9kZQkgcmJfbm9kZTsKKworCXN0cnVjdCB0aHJlYWQJICp0aHJlYWQ7CisJc3RydWN0IG1hcAkgKm1hcDsKKwlzdHJ1Y3QgZHNvCSAqZHNvOworCXN0cnVjdCBzeW1ib2wJICpzeW07CisJX191NjQJIGlwOworCWNoYXIJCSBsZXZlbDsKKworCXVpbnQzMl90CSBjb3VudDsKK307CisKKy8qCisgKiBjb25maWd1cmFibGUgc29ydGluZyBiaXRzCisgKi8KKworc3RydWN0IHNvcnRfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCWNoYXIgKmhlYWRlcjsKKworCWludDY0X3QgKCpjbXApKHN0cnVjdCBoaXN0X2VudHJ5ICosIHN0cnVjdCBoaXN0X2VudHJ5ICopOworCWludDY0X3QgKCpjb2xsYXBzZSkoc3RydWN0IGhpc3RfZW50cnkgKiwgc3RydWN0IGhpc3RfZW50cnkgKik7CisJc2l6ZV90CSgqcHJpbnQpKEZJTEUgKmZwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKK307CisKKy8qIC0tc29ydCBwaWQgKi8KKworc3RhdGljIGludDY0X3QKK3NvcnRfX3RocmVhZF9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwlyZXR1cm4gcmlnaHQtPnRocmVhZC0+cGlkIC0gbGVmdC0+dGhyZWFkLT5waWQ7Cit9CisKK3N0YXRpYyBzaXplX3QKK3NvcnRfX3RocmVhZF9wcmludChGSUxFICpmcCwgc3RydWN0IGhpc3RfZW50cnkgKnNlbGYpCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIlMTZzOiU1ZCIsIHNlbGYtPnRocmVhZC0+Y29tbSA/OiAiIiwgc2VsZi0+dGhyZWFkLT5waWQpOworfQorCitzdGF0aWMgc3RydWN0IHNvcnRfZW50cnkgc29ydF90aHJlYWQgPSB7CisJLmhlYWRlciA9ICIgICAgICAgICBDb21tYW5kOiAgUGlkIiwKKwkuY21wCT0gc29ydF9fdGhyZWFkX2NtcCwKKwkucHJpbnQJPSBzb3J0X190aHJlYWRfcHJpbnQsCit9OworCisvKiAtLXNvcnQgY29tbSAqLworCitzdGF0aWMgaW50NjRfdAorc29ydF9fY29tbV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwlyZXR1cm4gcmlnaHQtPnRocmVhZC0+cGlkIC0gbGVmdC0+dGhyZWFkLT5waWQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X19jb21tX2NvbGxhcHNlKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJY2hhciAqY29tbV9sID0gbGVmdC0+dGhyZWFkLT5jb21tOworCWNoYXIgKmNvbW1fciA9IHJpZ2h0LT50aHJlYWQtPmNvbW07CisKKwlpZiAoIWNvbW1fbCB8fCAhY29tbV9yKSB7CisJCWlmICghY29tbV9sICYmICFjb21tX3IpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoIWNvbW1fbCkKKwkJCXJldHVybiAtMTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIHN0cmNtcChjb21tX2wsIGNvbW1fcik7Cit9CisKK3N0YXRpYyBzaXplX3QKK3NvcnRfX2NvbW1fcHJpbnQoRklMRSAqZnAsIHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmKQoreworCXJldHVybiBmcHJpbnRmKGZwLCAiJTE2cyIsIHNlbGYtPnRocmVhZC0+Y29tbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2NvbW0gPSB7CisJLmhlYWRlcgkJPSAiICAgICAgICAgQ29tbWFuZCIsCisJLmNtcAkJPSBzb3J0X19jb21tX2NtcCwKKwkuY29sbGFwc2UJPSBzb3J0X19jb21tX2NvbGxhcHNlLAorCS5wcmludAkJPSBzb3J0X19jb21tX3ByaW50LAorfTsKKworLyogLS1zb3J0IGRzbyAqLworCitzdGF0aWMgaW50NjRfdAorc29ydF9fZHNvX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCXN0cnVjdCBkc28gKmRzb19sID0gbGVmdC0+ZHNvOworCXN0cnVjdCBkc28gKmRzb19yID0gcmlnaHQtPmRzbzsKKworCWlmICghZHNvX2wgfHwgIWRzb19yKSB7CisJCWlmICghZHNvX2wgJiYgIWRzb19yKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKCFkc29fbCkKKwkJCXJldHVybiAtMTsKKwkJZWxzZQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIHN0cmNtcChkc29fbC0+bmFtZSwgZHNvX3ItPm5hbWUpOworfQorCitzdGF0aWMgc2l6ZV90Citzb3J0X19kc29fcHJpbnQoRklMRSAqZnAsIHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmKQoreworCWlmIChzZWxmLT5kc28pCisJCXJldHVybiBmcHJpbnRmKGZwLCAiJS0yNXMiLCBzZWxmLT5kc28tPm5hbWUpOworCisJcmV0dXJuIGZwcmludGYoZnAsICIlMDE2bGx4ICAgICAgICAgIiwgKF9fdTY0KXNlbGYtPmlwKTsKK30KKworc3RhdGljIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfZHNvID0geworCS5oZWFkZXIgPSAiU2hhcmVkIE9iamVjdCAgICAgICAgICAgICIsCisJLmNtcAk9IHNvcnRfX2Rzb19jbXAsCisJLnByaW50CT0gc29ydF9fZHNvX3ByaW50LAorfTsKKworLyogLS1zb3J0IHN5bWJvbCAqLworCitzdGF0aWMgaW50NjRfdAorc29ydF9fc3ltX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCV9fdTY0IGlwX2wsIGlwX3I7CisKKwlpZiAobGVmdC0+c3ltID09IHJpZ2h0LT5zeW0pCisJCXJldHVybiAwOworCisJaXBfbCA9IGxlZnQtPnN5bSA/IGxlZnQtPnN5bS0+c3RhcnQgOiBsZWZ0LT5pcDsKKwlpcF9yID0gcmlnaHQtPnN5bSA/IHJpZ2h0LT5zeW0tPnN0YXJ0IDogcmlnaHQtPmlwOworCisJcmV0dXJuIChpbnQ2NF90KShpcF9yIC0gaXBfbCk7Cit9CisKK3N0YXRpYyBzaXplX3QKK3NvcnRfX3N5bV9wcmludChGSUxFICpmcCwgc3RydWN0IGhpc3RfZW50cnkgKnNlbGYpCit7CisJc2l6ZV90IHJldCA9IDA7CisKKwlpZiAodmVyYm9zZSkKKwkJcmV0ICs9IGZwcmludGYoZnAsICIlIzAxOGxseCAgIiwgKF9fdTY0KXNlbGYtPmlwKTsKKworCWlmIChzZWxmLT5zeW0pIHsKKwkJcmV0ICs9IGZwcmludGYoZnAsICJbJWNdICVzIiwKKwkJCXNlbGYtPmRzbyA9PSBrZXJuZWxfZHNvID8gJ2snIDogJy4nLCBzZWxmLT5zeW0tPm5hbWUpOworCX0gZWxzZSB7CisJCXJldCArPSBmcHJpbnRmKGZwLCAiJSMwMTZsbHgiLCAoX191NjQpc2VsZi0+aXApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X3N5bSA9IHsKKwkuaGVhZGVyID0gIlN5bWJvbCIsCisJLmNtcAk9IHNvcnRfX3N5bV9jbXAsCisJLnByaW50CT0gc29ydF9fc3ltX3ByaW50LAorfTsKKworc3RhdGljIGludCBzb3J0X19uZWVkX2NvbGxhcHNlID0gMDsKKworc3RydWN0IHNvcnRfZGltZW5zaW9uIHsKKwljaGFyCQkJKm5hbWU7CisJc3RydWN0IHNvcnRfZW50cnkJKmVudHJ5OworCWludAkJCXRha2VuOworfTsKKworc3RhdGljIHN0cnVjdCBzb3J0X2RpbWVuc2lvbiBzb3J0X2RpbWVuc2lvbnNbXSA9IHsKKwl7IC5uYW1lID0gInBpZCIsCS5lbnRyeSA9ICZzb3J0X3RocmVhZCwJfSwKKwl7IC5uYW1lID0gImNvbW0iLAkuZW50cnkgPSAmc29ydF9jb21tLAl9LAorCXsgLm5hbWUgPSAiZHNvIiwJLmVudHJ5ID0gJnNvcnRfZHNvLAl9LAorCXsgLm5hbWUgPSAic3ltYm9sIiwJLmVudHJ5ID0gJnNvcnRfc3ltLAl9LAorfTsKKworc3RhdGljIExJU1RfSEVBRChoaXN0X2VudHJ5X19zb3J0X2xpc3QpOworCitzdGF0aWMgaW50IHNvcnRfZGltZW5zaW9uX19hZGQoY2hhciAqdG9rKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc29ydF9kaW1lbnNpb25zKTsgaSsrKSB7CisJCXN0cnVjdCBzb3J0X2RpbWVuc2lvbiAqc2QgPSAmc29ydF9kaW1lbnNpb25zW2ldOworCisJCWlmIChzZC0+dGFrZW4pCisJCQljb250aW51ZTsKKworCQlpZiAoc3RybmNhc2VjbXAodG9rLCBzZC0+bmFtZSwgc3RybGVuKHRvaykpKQorCQkJY29udGludWU7CisKKwkJaWYgKHNkLT5lbnRyeS0+Y29sbGFwc2UpCisJCQlzb3J0X19uZWVkX2NvbGxhcHNlID0gMTsKKworCQlsaXN0X2FkZF90YWlsKCZzZC0+ZW50cnktPmxpc3QsICZoaXN0X2VudHJ5X19zb3J0X2xpc3QpOworCQlzZC0+dGFrZW4gPSAxOworCisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRVNSQ0g7Cit9CisKK3N0YXRpYyBpbnQ2NF90CitoaXN0X2VudHJ5X19jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwlzdHJ1Y3Qgc29ydF9lbnRyeSAqc2U7CisJaW50NjRfdCBjbXAgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZSwgJmhpc3RfZW50cnlfX3NvcnRfbGlzdCwgbGlzdCkgeworCQljbXAgPSBzZS0+Y21wKGxlZnQsIHJpZ2h0KTsKKwkJaWYgKGNtcCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBjbXA7Cit9CisKK3N0YXRpYyBpbnQ2NF90CitoaXN0X2VudHJ5X19jb2xsYXBzZShzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCXN0cnVjdCBzb3J0X2VudHJ5ICpzZTsKKwlpbnQ2NF90IGNtcCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmaGlzdF9lbnRyeV9fc29ydF9saXN0LCBsaXN0KSB7CisJCWludDY0X3QgKCpmKShzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKKworCQlmID0gc2UtPmNvbGxhcHNlID86IHNlLT5jbXA7CisKKwkJY21wID0gZihsZWZ0LCByaWdodCk7CisJCWlmIChjbXApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY21wOworfQorCisvKgorICogY29sbGVjdCBoaXN0b2dyYW0gY291bnRzCisgKi8KK3N0YXRpYyB2b2lkIGhpc3RfaGl0KHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgX191NjQgaXApCit7CisJdW5zaWduZWQgaW50IHN5bV9zaXplLCBvZmZzZXQ7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gaGUtPnN5bTsKKworCWhlLT5jb3VudCsrOworCisJaWYgKCFzeW0gfHwgIXN5bS0+aGlzdCkKKwkJcmV0dXJuOworCisJc3ltX3NpemUgPSBzeW0tPmVuZCAtIHN5bS0+c3RhcnQ7CisJb2Zmc2V0ID0gaXAgLSBzeW0tPnN0YXJ0OworCisJaWYgKG9mZnNldCA+PSBzeW1fc2l6ZSkKKwkJcmV0dXJuOworCisJc3ltLT5oaXN0X3N1bSsrOworCXN5bS0+aGlzdFtvZmZzZXRdKys7CisKKwlpZiAodmVyYm9zZSA+PSAzKQorCQlwcmludGYoIiVwICVzOiBjb3VudCsrIFtpcDogJXAsICUwOEx4XSA9PiAlTGRcbiIsCisJCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWhlLT5zeW0tPnN0YXJ0LAorCQkJaGUtPnN5bS0+bmFtZSwKKwkJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpaXAsIGlwIC0gaGUtPnN5bS0+c3RhcnQsCisJCQlzeW0tPmhpc3Rbb2Zmc2V0XSk7Cit9CisKK3N0YXRpYyBpbnQKK2hpc3RfZW50cnlfX2FkZChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHN0cnVjdCBtYXAgKm1hcCwgc3RydWN0IGRzbyAqZHNvLAorCQlzdHJ1Y3Qgc3ltYm9sICpzeW0sIF9fdTY0IGlwLCBjaGFyIGxldmVsKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZoaXN0LnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGhpc3RfZW50cnkgKmhlOworCXN0cnVjdCBoaXN0X2VudHJ5IGVudHJ5ID0geworCQkudGhyZWFkCT0gdGhyZWFkLAorCQkubWFwCT0gbWFwLAorCQkuZHNvCT0gZHNvLAorCQkuc3ltCT0gc3ltLAorCQkuaXAJPSBpcCwKKwkJLmxldmVsCT0gbGV2ZWwsCisJCS5jb3VudAk9IDEsCisJfTsKKwlpbnQgY21wOworCisJd2hpbGUgKCpwICE9IE5VTEwpIHsKKwkJcGFyZW50ID0gKnA7CisJCWhlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisKKwkJY21wID0gaGlzdF9lbnRyeV9fY21wKCZlbnRyeSwgaGUpOworCisJCWlmICghY21wKSB7CisJCQloaXN0X2hpdChoZSwgaXApOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChjbXAgPCAwKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCX0KKworCWhlID0gbWFsbG9jKHNpemVvZigqaGUpKTsKKwlpZiAoIWhlKQorCQlyZXR1cm4gLUVOT01FTTsKKwkqaGUgPSBlbnRyeTsKKwlyYl9saW5rX25vZGUoJmhlLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmaGUtPnJiX25vZGUsICZoaXN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoaXN0X2VudHJ5X19mcmVlKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkKK3sKKwlmcmVlKGhlKTsKK30KKworLyoKKyAqIGNvbGxhcHNlIHRoZSBoaXN0b2dyYW0KKyAqLworCitzdGF0aWMgc3RydWN0IHJiX3Jvb3QgY29sbGFwc2VfaGlzdHM7CisKK3N0YXRpYyB2b2lkIGNvbGxhcHNlX19pbnNlcnRfZW50cnkoc3RydWN0IGhpc3RfZW50cnkgKmhlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZjb2xsYXBzZV9oaXN0cy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBoaXN0X2VudHJ5ICppdGVyOworCWludDY0X3QgY21wOworCisJd2hpbGUgKCpwICE9IE5VTEwpIHsKKwkJcGFyZW50ID0gKnA7CisJCWl0ZXIgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKworCQljbXAgPSBoaXN0X2VudHJ5X19jb2xsYXBzZShpdGVyLCBoZSk7CisKKwkJaWYgKCFjbXApIHsKKwkJCWl0ZXItPmNvdW50ICs9IGhlLT5jb3VudDsKKwkJCWhpc3RfZW50cnlfX2ZyZWUoaGUpOworCQkJcmV0dXJuOworCQl9CisKKwkJaWYgKGNtcCA8IDApCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJcmJfbGlua19ub2RlKCZoZS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmhlLT5yYl9ub2RlLCAmY29sbGFwc2VfaGlzdHMpOworfQorCitzdGF0aWMgdm9pZCBjb2xsYXBzZV9fcmVzb3J0KHZvaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5leHQ7CisJc3RydWN0IGhpc3RfZW50cnkgKm47CisKKwlpZiAoIXNvcnRfX25lZWRfY29sbGFwc2UpCisJCXJldHVybjsKKworCW5leHQgPSByYl9maXJzdCgmaGlzdCk7CisJd2hpbGUgKG5leHQpIHsKKwkJbiA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJbmV4dCA9IHJiX25leHQoJm4tPnJiX25vZGUpOworCisJCXJiX2VyYXNlKCZuLT5yYl9ub2RlLCAmaGlzdCk7CisJCWNvbGxhcHNlX19pbnNlcnRfZW50cnkobik7CisJfQorfQorCisvKgorICogcmV2ZXJzZSB0aGUgbWFwLCBzb3J0IG9uIGNvdW50LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdCBvdXRwdXRfaGlzdHM7CisKK3N0YXRpYyB2b2lkIG91dHB1dF9faW5zZXJ0X2VudHJ5KHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmb3V0cHV0X2hpc3RzLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGhpc3RfZW50cnkgKml0ZXI7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJaXRlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCisJCWlmIChoZS0+Y291bnQgPiBpdGVyLT5jb3VudCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwlyYl9saW5rX25vZGUoJmhlLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmaGUtPnJiX25vZGUsICZvdXRwdXRfaGlzdHMpOworfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfX3Jlc29ydCh2b2lkKQoreworCXN0cnVjdCByYl9ub2RlICpuZXh0OworCXN0cnVjdCBoaXN0X2VudHJ5ICpuOworCXN0cnVjdCByYl9yb290ICp0cmVlID0gJmhpc3Q7CisKKwlpZiAoc29ydF9fbmVlZF9jb2xsYXBzZSkKKwkJdHJlZSA9ICZjb2xsYXBzZV9oaXN0czsKKworCW5leHQgPSByYl9maXJzdCh0cmVlKTsKKworCXdoaWxlIChuZXh0KSB7CisJCW4gPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisJCW5leHQgPSByYl9uZXh0KCZuLT5yYl9ub2RlKTsKKworCQlyYl9lcmFzZSgmbi0+cmJfbm9kZSwgdHJlZSk7CisJCW91dHB1dF9faW5zZXJ0X2VudHJ5KG4pOworCX0KK30KKworc3RhdGljIHZvaWQgcmVnaXN0ZXJfaWRsZV90aHJlYWQodm9pZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KDApOworCisJaWYgKHRocmVhZCA9PSBOVUxMIHx8CisJCQl0aHJlYWRfX3NldF9jb21tKHRocmVhZCwgIltpZGxlXSIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAicHJvYmxlbSBpbnNlcnRpbmcgaWRsZSB0YXNrLlxuIik7CisJCWV4aXQoLTEpOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdG90YWwgPSAwLAorCQkgICAgIHRvdGFsX21tYXAgPSAwLAorCQkgICAgIHRvdGFsX2NvbW0gPSAwLAorCQkgICAgIHRvdGFsX2ZvcmsgPSAwLAorCQkgICAgIHRvdGFsX3Vua25vd24gPSAwOworCitzdGF0aWMgaW50Citwcm9jZXNzX292ZXJmbG93X2V2ZW50KGV2ZW50X3QgKmV2ZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCWNoYXIgbGV2ZWw7CisJaW50IHNob3cgPSAwOworCXN0cnVjdCBkc28gKmRzbyA9IE5VTEw7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+aXAucGlkKTsKKwlfX3U2NCBpcCA9IGV2ZW50LT5pcC5pcDsKKwlzdHJ1Y3QgbWFwICptYXAgPSBOVUxMOworCisJZHByaW50ZigiJXAgWyVwXTogUEVSRl9FVkVOVCAoSVAsICVkKTogJWQ6ICVwXG4iLAorCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJZXZlbnQtPmhlYWRlci5taXNjLAorCQlldmVudC0+aXAucGlkLAorCQkodm9pZCAqKShsb25nKWlwKTsKKworCWRwcmludGYoIiAuLi4gdGhyZWFkOiAlczolZFxuIiwgdGhyZWFkLT5jb21tLCB0aHJlYWQtPnBpZCk7CisKKwlpZiAodGhyZWFkID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKKwkJCWV2ZW50LT5oZWFkZXIudHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX0tFUk5FTCkgeworCQlzaG93ID0gU0hPV19LRVJORUw7CisJCWxldmVsID0gJ2snOworCisJCWRzbyA9IGtlcm5lbF9kc287CisKKwkJZHByaW50ZigiIC4uLi4uLiBkc286ICVzXG4iLCBkc28tPm5hbWUpOworCisJfSBlbHNlIGlmIChldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX0VWRU5UX01JU0NfVVNFUikgeworCisJCXNob3cgPSBTSE9XX1VTRVI7CisJCWxldmVsID0gJy4nOworCisJCW1hcCA9IHRocmVhZF9fZmluZF9tYXAodGhyZWFkLCBpcCk7CisJCWlmIChtYXAgIT0gTlVMTCkgeworCQkJaXAgPSBtYXAtPm1hcF9pcChtYXAsIGlwKTsKKwkJCWRzbyA9IG1hcC0+ZHNvOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIHRoaXMgaXMgb3V0c2lkZSBvZiBhbGwga25vd24gbWFwcywKKwkJCSAqIGFuZCBpcyBhIG5lZ2F0aXZlIGFkZHJlc3MsIHRyeSB0byBsb29rIGl0CisJCQkgKiB1cCBpbiB0aGUga2VybmVsIGRzbywgYXMgaXQgbWlnaHQgYmUgYQorCQkJICogdnN5c2NhbGwgKHdoaWNoIGV4ZWN1dGVzIGluIHVzZXItbW9kZSk6CisJCQkgKi8KKwkJCWlmICgobG9uZyBsb25nKWlwIDwgMCkKKwkJCQlkc28gPSBrZXJuZWxfZHNvOworCQl9CisJCWRwcmludGYoIiAuLi4uLi4gZHNvOiAlc1xuIiwgZHNvID8gZHNvLT5uYW1lIDogIjxub3QgZm91bmQ+Iik7CisKKwl9IGVsc2UgeworCQlzaG93ID0gU0hPV19IVjsKKwkJbGV2ZWwgPSAnSCc7CisJCWRwcmludGYoIiAuLi4uLi4gZHNvOiBbaHlwZXJ2aXNvcl1cbiIpOworCX0KKworCWlmIChzaG93ICYgc2hvd19tYXNrKSB7CisJCXN0cnVjdCBzeW1ib2wgKnN5bSA9IE5VTEw7CisKKwkJaWYgKGRzbykKKwkJCXN5bSA9IGRzby0+ZmluZF9zeW1ib2woZHNvLCBpcCk7CisKKwkJaWYgKGhpc3RfZW50cnlfX2FkZCh0aHJlYWQsIG1hcCwgZHNvLCBzeW0sIGlwLCBsZXZlbCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkicHJvYmxlbSBpbmNyZW1lbnRpbmcgc3ltYm9sIGNvdW50LCBza2lwcGluZyBldmVudFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJdG90YWwrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX21tYXBfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+bW1hcC5waWQpOworCXN0cnVjdCBtYXAgKm1hcCA9IG1hcF9fbmV3KCZldmVudC0+bW1hcCk7CisKKwlkcHJpbnRmKCIlcCBbJXBdOiBQRVJGX0VWRU5UX01NQVAgJWQ6IFslcCglcCkgQCAlcF06ICVzXG4iLAorCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJZXZlbnQtPm1tYXAucGlkLAorCQkodm9pZCAqKShsb25nKWV2ZW50LT5tbWFwLnN0YXJ0LAorCQkodm9pZCAqKShsb25nKWV2ZW50LT5tbWFwLmxlbiwKKwkJKHZvaWQgKikobG9uZylldmVudC0+bW1hcC5wZ29mZiwKKwkJZXZlbnQtPm1tYXAuZmlsZW5hbWUpOworCisJaWYgKHRocmVhZCA9PSBOVUxMIHx8IG1hcCA9PSBOVUxMKSB7CisJCWRwcmludGYoInByb2JsZW0gcHJvY2Vzc2luZyBQRVJGX0VWRU5UX01NQVAsIHNraXBwaW5nIGV2ZW50LlxuIik7CisJCXJldHVybiAwOworCX0KKworCXRocmVhZF9faW5zZXJ0X21hcCh0aHJlYWQsIG1hcCk7CisJdG90YWxfbW1hcCsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfY29tbV9ldmVudChldmVudF90ICpldmVudCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5jb21tLnBpZCk7CisKKwlkcHJpbnRmKCIlcCBbJXBdOiBQRVJGX0VWRU5UX0NPTU06ICVzOiVkXG4iLAorCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJZXZlbnQtPmNvbW0uY29tbSwgZXZlbnQtPmNvbW0ucGlkKTsKKworCWlmICh0aHJlYWQgPT0gTlVMTCB8fAorCSAgICB0aHJlYWRfX3NldF9jb21tKHRocmVhZCwgZXZlbnQtPmNvbW0uY29tbSkpIHsKKwkJZHByaW50ZigicHJvYmxlbSBwcm9jZXNzaW5nIFBFUkZfRVZFTlRfQ09NTSwgc2tpcHBpbmcgZXZlbnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0b3RhbF9jb21tKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19mb3JrX2V2ZW50KGV2ZW50X3QgKmV2ZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmZvcmsucGlkKTsKKwlzdHJ1Y3QgdGhyZWFkICpwYXJlbnQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5mb3JrLnBwaWQpOworCisJZHByaW50ZigiJXAgWyVwXTogUEVSRl9FVkVOVF9GT1JLOiAlZDolZFxuIiwKKwkJKHZvaWQgKikob2Zmc2V0ICsgaGVhZCksCisJCSh2b2lkICopKGxvbmcpKGV2ZW50LT5oZWFkZXIuc2l6ZSksCisJCWV2ZW50LT5mb3JrLnBpZCwgZXZlbnQtPmZvcmsucHBpZCk7CisKKwlpZiAoIXRocmVhZCB8fCAhcGFyZW50IHx8IHRocmVhZF9fZm9yayh0aHJlYWQsIHBhcmVudCkpIHsKKwkJZHByaW50ZigicHJvYmxlbSBwcm9jZXNzaW5nIFBFUkZfRVZFTlRfRk9SSywgc2tpcHBpbmcgZXZlbnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0b3RhbF9mb3JrKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19wZXJpb2RfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJZHByaW50ZigiJXAgWyVwXTogUEVSRl9FVkVOVF9QRVJJT0Q6IHRpbWU6JUxkLCBpZDolTGQ6IHBlcmlvZDolTGRcbiIsCisJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkodm9pZCAqKShsb25nKShldmVudC0+aGVhZGVyLnNpemUpLAorCQlldmVudC0+cGVyaW9kLnRpbWUsCisJCWV2ZW50LT5wZXJpb2QuaWQsCisJCWV2ZW50LT5wZXJpb2Quc2FtcGxlX3BlcmlvZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19ldmVudChldmVudF90ICpldmVudCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlpZiAoZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XKQorCQlyZXR1cm4gcHJvY2Vzc19vdmVyZmxvd19ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKTsKKworCXN3aXRjaCAoZXZlbnQtPmhlYWRlci50eXBlKSB7CisJY2FzZSBQRVJGX0VWRU5UX01NQVA6CisJCXJldHVybiBwcm9jZXNzX21tYXBfZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCk7CisKKwljYXNlIFBFUkZfRVZFTlRfQ09NTToKKwkJcmV0dXJuIHByb2Nlc3NfY29tbV9ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKTsKKworCWNhc2UgUEVSRl9FVkVOVF9GT1JLOgorCQlyZXR1cm4gcHJvY2Vzc19mb3JrX2V2ZW50KGV2ZW50LCBvZmZzZXQsIGhlYWQpOworCisJY2FzZSBQRVJGX0VWRU5UX1BFUklPRDoKKwkJcmV0dXJuIHByb2Nlc3NfcGVyaW9kX2V2ZW50KGV2ZW50LCBvZmZzZXQsIGhlYWQpOworCS8qCisJICogV2UgZG9udCBwcm9jZXNzIHRoZW0gcmlnaHQgbm93IGJ1dCB0aGV5IGFyZSBmaW5lOgorCSAqLworCisJY2FzZSBQRVJGX0VWRU5UX1RIUk9UVExFOgorCWNhc2UgUEVSRl9FVkVOVF9VTlRIUk9UVExFOgorCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGFyc2VfbGluZShGSUxFICpmaWxlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIF9fdTY0IHN0YXJ0LCBfX3U2NCBsZW4pCit7CisJY2hhciAqbGluZSA9IE5VTEwsICp0bXAsICp0bXAyOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJc2l6ZV90IGxpbmVfbGVuOworCV9fdTY0IGxpbmVfaXA7CisJaW50IHJldDsKKwljaGFyICpjOworCisJaWYgKGdldGxpbmUoJmxpbmUsICZsaW5lX2xlbiwgZmlsZSkgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLTE7CisKKwljID0gc3RyY2hyKGxpbmUsICdcbicpOworCWlmIChjKQorCQkqYyA9IDA7CisKKwlsaW5lX2lwID0gLTE7CisJb2Zmc2V0ID0gMDsKKwlyZXQgPSAtMjsKKworCS8qCisJICogU3RyaXAgbGVhZGluZyBzcGFjZXM6CisJICovCisJdG1wID0gbGluZTsKKwl3aGlsZSAoKnRtcCkgeworCQlpZiAoKnRtcCAhPSAnICcpCisJCQlicmVhazsKKwkJdG1wKys7CisJfQorCisJaWYgKCp0bXApIHsKKwkJLyoKKwkJICogUGFyc2UgaGV4YSBhZGRyZXNzZXMgZm9sbG93ZWQgYnkgJzonCisJCSAqLworCQlsaW5lX2lwID0gc3RydG91bGwodG1wLCAmdG1wMiwgMTYpOworCQlpZiAoKnRtcDIgIT0gJzonKQorCQkJbGluZV9pcCA9IC0xOworCX0KKworCWlmIChsaW5lX2lwICE9IC0xKSB7CisJCXVuc2lnbmVkIGludCBoaXRzID0gMDsKKwkJZG91YmxlIHBlcmNlbnQgPSAwLjA7CisJCWNoYXIgKmNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7CisKKwkJb2Zmc2V0ID0gbGluZV9pcCAtIHN0YXJ0OworCQlpZiAob2Zmc2V0IDwgbGVuKQorCQkJaGl0cyA9IHN5bS0+aGlzdFtvZmZzZXRdOworCisJCWlmIChzeW0tPmhpc3Rfc3VtKQorCQkJcGVyY2VudCA9IDEwMC4wICogaGl0cyAvIHN5bS0+aGlzdF9zdW07CisKKwkJLyoKKwkJICogV2UgY29sb3IgaGlnaC1vdmVyaGVhZCBlbnRyaWVzIGluIHJlZCwgbWlkLW92ZXJoZWFkCisJCSAqIGVudHJpZXMgaW4gZ3JlZW4gLSBhbmQga2VlcCB0aGUgbG93IG92ZXJoZWFkIHBsYWNlcworCQkgKiBub3JtYWw6CisJCSAqLworCQlpZiAocGVyY2VudCA+PSA1LjApCisJCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOworCQllbHNlIHsKKwkJCWlmIChwZXJjZW50ID4gMC41KQorCQkJCWNvbG9yID0gUEVSRl9DT0xPUl9HUkVFTjsKKwkJfQorCisJCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBjb2xvciwgIiAlNy4yZiIsIHBlcmNlbnQpOworCQlwcmludGYoIiA6CSIpOworCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgUEVSRl9DT0xPUl9CTFVFLCAiJXNcbiIsIGxpbmUpOworCX0gZWxzZSB7CisJCWlmICghKmxpbmUpCisJCQlwcmludGYoIiAgICAgICAgIDpcbiIpOworCQllbHNlCisJCQlwcmludGYoIiAgICAgICAgIDoJJXNcbiIsIGxpbmUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbm5vdGF0ZV9zeW0oc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJY2hhciAqZmlsZW5hbWUgPSBkc28tPm5hbWU7CisJX191NjQgc3RhcnQsIGVuZCwgbGVuOworCWNoYXIgY29tbWFuZFtQQVRIX01BWCoyXTsKKwlGSUxFICpmaWxlOworCisJaWYgKCFmaWxlbmFtZSkKKwkJcmV0dXJuOworCWlmIChkc28gPT0ga2VybmVsX2RzbykKKwkJZmlsZW5hbWUgPSB2bWxpbnV4OworCisJcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCIgUGVyY2VudCB8CVNvdXJjZSBjb2RlICYgRGlzYXNzZW1ibHkgb2YgJXNcbiIsIGZpbGVuYW1lKTsKKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKwlpZiAodmVyYm9zZSA+PSAyKQorCQlwcmludGYoImFubm90YXRpbmcgWyVwXSAlMzBzIDogWyVwXSAlMzBzXG4iLCBkc28sIGRzby0+bmFtZSwgc3ltLCBzeW0tPm5hbWUpOworCisJc3RhcnQgPSBzeW0tPm9ial9zdGFydDsKKwlpZiAoIXN0YXJ0KQorCQlzdGFydCA9IHN5bS0+c3RhcnQ7CisKKwllbmQgPSBzdGFydCArIHN5bS0+ZW5kIC0gc3ltLT5zdGFydCArIDE7CisJbGVuID0gc3ltLT5lbmQgLSBzeW0tPnN0YXJ0OworCisJc3ByaW50Zihjb21tYW5kLCAib2JqZHVtcCAtLXN0YXJ0LWFkZHJlc3M9MHglMDE2THggLS1zdG9wLWFkZHJlc3M9MHglMDE2THggLWRTICVzIiwgKF9fdTY0KXN0YXJ0LCAoX191NjQpZW5kLCBmaWxlbmFtZSk7CisKKwlpZiAodmVyYm9zZSA+PSAzKQorCQlwcmludGYoImRvaW5nOiAlc1xuIiwgY29tbWFuZCk7CisKKwlmaWxlID0gcG9wZW4oY29tbWFuZCwgInIiKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybjsKKworCXdoaWxlICghZmVvZihmaWxlKSkgeworCQlpZiAocGFyc2VfbGluZShmaWxlLCBzeW0sIHN0YXJ0LCBsZW4pIDwgMCkKKwkJCWJyZWFrOworCX0KKworCXBjbG9zZShmaWxlKTsKK30KKworc3RhdGljIHZvaWQgZmluZF9hbm5vdGF0aW9ucyh2b2lkKQoreworCXN0cnVjdCByYl9ub2RlICpuZDsKKwlzdHJ1Y3QgZHNvICpkc287CisJaW50IGNvdW50ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHNvLCAmZHNvcywgbm9kZSkgeworCisJCWZvciAobmQgPSByYl9maXJzdCgmZHNvLT5zeW1zKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKKworCQkJaWYgKHN5bS0+aGlzdCkgeworCQkJCWFubm90YXRlX3N5bShkc28sIHN5bSk7CisJCQkJY291bnQrKzsKKwkJCX0KKwkJfQorCX0KKworCWlmICghY291bnQpCisJCXByaW50ZigiIEVycm9yOiBzeW1ib2wgJyVzJyBub3QgcHJlc2VudCBhbW9uZ3N0IHRoZSBzYW1wbGVzLlxuIiwgc3ltX2hpc3RfZmlsdGVyKTsKK30KKworc3RhdGljIGludCBfX2NtZF9hbm5vdGF0ZSh2b2lkKQoreworCWludCByZXQsIHJjID0gRVhJVF9GQUlMVVJFOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGhlYWQgPSAwOworCXN0cnVjdCBzdGF0IHN0YXQ7CisJZXZlbnRfdCAqZXZlbnQ7CisJdWludDMyX3Qgc2l6ZTsKKwljaGFyICpidWY7CisKKwlyZWdpc3Rlcl9pZGxlX3RocmVhZCgpOworCisJaW5wdXQgPSBvcGVuKGlucHV0X25hbWUsIE9fUkRPTkxZKTsKKwlpZiAoaW5wdXQgPCAwKSB7CisJCXBlcnJvcigiZmFpbGVkIHRvIG9wZW4gZmlsZSIpOworCQlleGl0KC0xKTsKKwl9CisKKwlyZXQgPSBmc3RhdChpbnB1dCwgJnN0YXQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigiZmFpbGVkIHRvIHN0YXQgZmlsZSIpOworCQlleGl0KC0xKTsKKwl9CisKKwlpZiAoIXN0YXQuc3Rfc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInplcm8tc2l6ZWQgZmlsZSwgbm90aGluZyB0byBkbyFcbiIpOworCQlleGl0KDApOworCX0KKworCWlmIChsb2FkX2tlcm5lbCgpIDwgMCkgeworCQlwZXJyb3IoImZhaWxlZCB0byBsb2FkIGtlcm5lbCBzeW1ib2xzIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCityZW1hcDoKKwlidWYgPSAoY2hhciAqKW1tYXAoTlVMTCwgcGFnZV9zaXplICogbW1hcF93aW5kb3csIFBST1RfUkVBRCwKKwkJCSAgIE1BUF9TSEFSRUQsIGlucHV0LCBvZmZzZXQpOworCWlmIChidWYgPT0gTUFQX0ZBSUxFRCkgeworCQlwZXJyb3IoImZhaWxlZCB0byBtbWFwIGZpbGUiKTsKKwkJZXhpdCgtMSk7CisJfQorCittb3JlOgorCWV2ZW50ID0gKGV2ZW50X3QgKikoYnVmICsgaGVhZCk7CisKKwlzaXplID0gZXZlbnQtPmhlYWRlci5zaXplOworCWlmICghc2l6ZSkKKwkJc2l6ZSA9IDg7CisKKwlpZiAoaGVhZCArIGV2ZW50LT5oZWFkZXIuc2l6ZSA+PSBwYWdlX3NpemUgKiBtbWFwX3dpbmRvdykgeworCQl1bnNpZ25lZCBsb25nIHNoaWZ0ID0gcGFnZV9zaXplICogKGhlYWQgLyBwYWdlX3NpemUpOworCQlpbnQgcmV0OworCisJCXJldCA9IG11bm1hcChidWYsIHBhZ2Vfc2l6ZSAqIG1tYXBfd2luZG93KTsKKwkJYXNzZXJ0KHJldCA9PSAwKTsKKworCQlvZmZzZXQgKz0gc2hpZnQ7CisJCWhlYWQgLT0gc2hpZnQ7CisJCWdvdG8gcmVtYXA7CisJfQorCisJc2l6ZSA9IGV2ZW50LT5oZWFkZXIuc2l6ZTsKKworCWRwcmludGYoIiVwIFslcF06IGV2ZW50OiAlZFxuIiwKKwkJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkJKHZvaWQgKikobG9uZylldmVudC0+aGVhZGVyLnNpemUsCisJCQlldmVudC0+aGVhZGVyLnR5cGUpOworCisJaWYgKCFzaXplIHx8IHByb2Nlc3NfZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCkgPCAwKSB7CisKKwkJZHByaW50ZigiJXAgWyVwXTogc2tpcHBpbmcgdW5rbm93biBoZWFkZXIgdHlwZTogJWRcbiIsCisJCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJCSh2b2lkICopKGxvbmcpKGV2ZW50LT5oZWFkZXIuc2l6ZSksCisJCQlldmVudC0+aGVhZGVyLnR5cGUpOworCisJCXRvdGFsX3Vua25vd24rKzsKKworCQkvKgorCQkgKiBhc3N1bWUgd2UgbG9zdCB0cmFjayBvZiB0aGUgc3RyZWFtLCBjaGVjayBhbGlnbm1lbnQsIGFuZAorCQkgKiBpbmNyZW1lbnQgYSBzaW5nbGUgdTY0IGluIHRoZSBob3BlIHRvIGNhdGNoIG9uIGFnYWluICdzb29uJy4KKwkJICovCisKKwkJaWYgKHVubGlrZWx5KGhlYWQgJiA3KSkKKwkJCWhlYWQgJj0gfjdVTEw7CisKKwkJc2l6ZSA9IDg7CisJfQorCisJaGVhZCArPSBzaXplOworCisJaWYgKG9mZnNldCArIGhlYWQgPCBzdGF0LnN0X3NpemUpCisJCWdvdG8gbW9yZTsKKworCXJjID0gRVhJVF9TVUNDRVNTOworCWNsb3NlKGlucHV0KTsKKworCWRwcmludGYoIiAgICAgIElQIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsKTsKKwlkcHJpbnRmKCIgICAgbW1hcCBldmVudHM6ICUxMGxkXG4iLCB0b3RhbF9tbWFwKTsKKwlkcHJpbnRmKCIgICAgY29tbSBldmVudHM6ICUxMGxkXG4iLCB0b3RhbF9jb21tKTsKKwlkcHJpbnRmKCIgICAgZm9yayBldmVudHM6ICUxMGxkXG4iLCB0b3RhbF9mb3JrKTsKKwlkcHJpbnRmKCIgdW5rbm93biBldmVudHM6ICUxMGxkXG4iLCB0b3RhbF91bmtub3duKTsKKworCWlmIChkdW1wX3RyYWNlKQorCQlyZXR1cm4gMDsKKworCWlmICh2ZXJib3NlID49IDMpCisJCXRocmVhZHNfX2ZwcmludGYoc3Rkb3V0KTsKKworCWlmICh2ZXJib3NlID49IDIpCisJCWRzb3NfX2ZwcmludGYoc3Rkb3V0KTsKKworCWNvbGxhcHNlX19yZXNvcnQoKTsKKwlvdXRwdXRfX3Jlc29ydCgpOworCisJZmluZF9hbm5vdGF0aW9ucygpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFubm90YXRlX3VzYWdlW10gPSB7CisJInBlcmYgYW5ub3RhdGUgWzxvcHRpb25zPl0gPGNvbW1hbmQ+IiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJT1BUX1NUUklORygnaScsICJpbnB1dCIsICZpbnB1dF9uYW1lLCAiZmlsZSIsCisJCSAgICAiaW5wdXQgZmlsZSBuYW1lIiksCisJT1BUX1NUUklORygncycsICJzeW1ib2wiLCAmc3ltX2hpc3RfZmlsdGVyLCAic3ltYm9sIiwKKwkJICAgICJzeW1ib2wgdG8gYW5ub3RhdGUiKSwKKwlPUFRfQk9PTEVBTigndicsICJ2ZXJib3NlIiwgJnZlcmJvc2UsCisJCSAgICAiYmUgbW9yZSB2ZXJib3NlIChzaG93IHN5bWJvbCBhZGRyZXNzLCBldGMpIiksCisJT1BUX0JPT0xFQU4oJ0QnLCAiZHVtcC1yYXctdHJhY2UiLCAmZHVtcF90cmFjZSwKKwkJICAgICJkdW1wIHJhdyB0cmFjZSBpbiBBU0NJSSIpLAorCU9QVF9TVFJJTkcoJ2snLCAidm1saW51eCIsICZ2bWxpbnV4LCAiZmlsZSIsICJ2bWxpbnV4IHBhdGhuYW1lIiksCisJT1BUX0VORCgpCit9OworCitzdGF0aWMgdm9pZCBzZXR1cF9zb3J0aW5nKHZvaWQpCit7CisJY2hhciAqdG1wLCAqdG9rLCAqc3RyID0gc3RyZHVwKHNvcnRfb3JkZXIpOworCisJZm9yICh0b2sgPSBzdHJ0b2tfcihzdHIsICIsICIsICZ0bXApOworCQkJdG9rOyB0b2sgPSBzdHJ0b2tfcihOVUxMLCAiLCAiLCAmdG1wKSkgeworCQlpZiAoc29ydF9kaW1lbnNpb25fX2FkZCh0b2spIDwgMCkgeworCQkJZXJyb3IoIlVua25vd24gLS1zb3J0IGtleTogYCVzJyIsIHRvayk7CisJCQl1c2FnZV93aXRoX29wdGlvbnMoYW5ub3RhdGVfdXNhZ2UsIG9wdGlvbnMpOworCQl9CisJfQorCisJZnJlZShzdHIpOworfQorCitpbnQgY21kX2Fubm90YXRlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXN5bWJvbF9faW5pdCgpOworCisJcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKKworCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIGFubm90YXRlX3VzYWdlLCAwKTsKKworCXNldHVwX3NvcnRpbmcoKTsKKworCWlmIChhcmdjKSB7CisJCS8qCisJCSAqIFNwZWNpYWwgY2FzZTogaWYgdGhlcmUncyBhbiBhcmd1bWVudCBsZWZ0IHRoZW4gYXNzdW1lIHRoYQorCQkgKiBpdCdzIGEgc3ltYm9sIGZpbHRlcjoKKwkJICovCisJCWlmIChhcmdjID4gMSkKKwkJCXVzYWdlX3dpdGhfb3B0aW9ucyhhbm5vdGF0ZV91c2FnZSwgb3B0aW9ucyk7CisKKwkJc3ltX2hpc3RfZmlsdGVyID0gYXJndlswXTsKKwl9CisKKwlpZiAoIXN5bV9oaXN0X2ZpbHRlcikKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zKGFubm90YXRlX3VzYWdlLCBvcHRpb25zKTsKKworCXNldHVwX3BhZ2VyKCk7CisKKwlyZXR1cm4gX19jbWRfYW5ub3RhdGUoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1oZWxwLmMgYi90b29scy9wZXJmL2J1aWx0aW4taGVscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzJkYzMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4taGVscC5jCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogYnVpbHRpbi1oZWxwLmMKKyAqCisgKiBCdWlsdGluIGhlbHAgY29tbWFuZAorICovCisjaW5jbHVkZSAidXRpbC9jYWNoZS5oIgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJ1dGlsL2V4ZWNfY21kLmgiCisjaW5jbHVkZSAiY29tbW9uLWNtZHMuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1dGlsL3J1bi1jb21tYW5kLmgiCisjaW5jbHVkZSAidXRpbC9oZWxwLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWFuX3ZpZXdlcl9saXN0IHsKKwlzdHJ1Y3QgbWFuX3ZpZXdlcl9saXN0ICpuZXh0OworCWNoYXIgbmFtZVtGTEVYX0FSUkFZXTsKK30gKm1hbl92aWV3ZXJfbGlzdDsKKworc3RhdGljIHN0cnVjdCBtYW5fdmlld2VyX2luZm9fbGlzdCB7CisJc3RydWN0IG1hbl92aWV3ZXJfaW5mb19saXN0ICpuZXh0OworCWNvbnN0IGNoYXIgKmluZm87CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOworfSAqbWFuX3ZpZXdlcl9pbmZvX2xpc3Q7CisKK2VudW0gaGVscF9mb3JtYXQgeworCUhFTFBfRk9STUFUX01BTiwKKwlIRUxQX0ZPUk1BVF9JTkZPLAorCUhFTFBfRk9STUFUX1dFQiwKK307CisKK3N0YXRpYyBpbnQgc2hvd19hbGwgPSAwOworc3RhdGljIGVudW0gaGVscF9mb3JtYXQgaGVscF9mb3JtYXQgPSBIRUxQX0ZPUk1BVF9NQU47CitzdGF0aWMgc3RydWN0IG9wdGlvbiBidWlsdGluX2hlbHBfb3B0aW9uc1tdID0geworCU9QVF9CT09MRUFOKCdhJywgImFsbCIsICZzaG93X2FsbCwgInByaW50IGFsbCBhdmFpbGFibGUgY29tbWFuZHMiKSwKKwlPUFRfU0VUX0lOVCgnbScsICJtYW4iLCAmaGVscF9mb3JtYXQsICJzaG93IG1hbiBwYWdlIiwgSEVMUF9GT1JNQVRfTUFOKSwKKwlPUFRfU0VUX0lOVCgndycsICJ3ZWIiLCAmaGVscF9mb3JtYXQsICJzaG93IG1hbnVhbCBpbiB3ZWIgYnJvd3NlciIsCisJCQlIRUxQX0ZPUk1BVF9XRUIpLAorCU9QVF9TRVRfSU5UKCdpJywgImluZm8iLCAmaGVscF9mb3JtYXQsICJzaG93IGluZm8gcGFnZSIsCisJCQlIRUxQX0ZPUk1BVF9JTkZPKSwKKwlPUFRfRU5EKCksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJ1aWx0aW5faGVscF91c2FnZVtdID0geworCSJwZXJmIGhlbHAgWy0tYWxsXSBbLS1tYW58LS13ZWJ8LS1pbmZvXSBbY29tbWFuZF0iLAorCU5VTEwKK307CisKK3N0YXRpYyBlbnVtIGhlbHBfZm9ybWF0IHBhcnNlX2hlbHBfZm9ybWF0KGNvbnN0IGNoYXIgKmZvcm1hdCkKK3sKKwlpZiAoIXN0cmNtcChmb3JtYXQsICJtYW4iKSkKKwkJcmV0dXJuIEhFTFBfRk9STUFUX01BTjsKKwlpZiAoIXN0cmNtcChmb3JtYXQsICJpbmZvIikpCisJCXJldHVybiBIRUxQX0ZPUk1BVF9JTkZPOworCWlmICghc3RyY21wKGZvcm1hdCwgIndlYiIpIHx8ICFzdHJjbXAoZm9ybWF0LCAiaHRtbCIpKQorCQlyZXR1cm4gSEVMUF9GT1JNQVRfV0VCOworCWRpZSgidW5yZWNvZ25pemVkIGhlbHAgZm9ybWF0ICclcyciLCBmb3JtYXQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X21hbl92aWV3ZXJfaW5mbyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtYW5fdmlld2VyX2luZm9fbGlzdCAqdmlld2VyOworCisJZm9yICh2aWV3ZXIgPSBtYW5fdmlld2VyX2luZm9fbGlzdDsgdmlld2VyOyB2aWV3ZXIgPSB2aWV3ZXItPm5leHQpCisJeworCQlpZiAoIXN0cmNhc2VjbXAobmFtZSwgdmlld2VyLT5uYW1lKSkKKwkJCXJldHVybiB2aWV3ZXItPmluZm87CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGNoZWNrX2VtYWNzY2xpZW50X3ZlcnNpb24odm9pZCkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIGJ1ZmZlciA9IFNUUkJVRl9JTklUOworCXN0cnVjdCBjaGlsZF9wcm9jZXNzIGVjX3Byb2Nlc3M7CisJY29uc3QgY2hhciAqYXJndl9lY1tdID0geyAiZW1hY3NjbGllbnQiLCAiLS12ZXJzaW9uIiwgTlVMTCB9OworCWludCB2ZXJzaW9uOworCisJLyogZW1hY3NjbGllbnQgcHJpbnRzIGl0cyB2ZXJzaW9uIG51bWJlciBvbiBzdGRlcnIgKi8KKwltZW1zZXQoJmVjX3Byb2Nlc3MsIDAsIHNpemVvZihlY19wcm9jZXNzKSk7CisJZWNfcHJvY2Vzcy5hcmd2ID0gYXJndl9lYzsKKwllY19wcm9jZXNzLmVyciA9IC0xOworCWVjX3Byb2Nlc3Muc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisJaWYgKHN0YXJ0X2NvbW1hbmQoJmVjX3Byb2Nlc3MpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHN0YXJ0IGVtYWNzY2xpZW50LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc3RyYnVmX3JlYWQoJmJ1ZmZlciwgZWNfcHJvY2Vzcy5lcnIsIDIwKTsKKwljbG9zZShlY19wcm9jZXNzLmVycik7CisKKwkvKgorCSAqIERvbid0IGJvdGhlciBjaGVja2luZyByZXR1cm4gdmFsdWUsIGJlY2F1c2UgImVtYWNzY2xpZW50IC0tdmVyc2lvbiIKKwkgKiBzZWVtcyB0byBhbHdheXMgZXhpdHMgd2l0aCBjb2RlIDEuCisJICovCisJZmluaXNoX2NvbW1hbmQoJmVjX3Byb2Nlc3MpOworCisJaWYgKHByZWZpeGNtcChidWZmZXIuYnVmLCAiZW1hY3NjbGllbnQiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSBlbWFjc2NsaWVudCB2ZXJzaW9uLlxuIik7CisJCXN0cmJ1Zl9yZWxlYXNlKCZidWZmZXIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RyYnVmX3JlbW92ZSgmYnVmZmVyLCAwLCBzdHJsZW4oImVtYWNzY2xpZW50IikpOworCXZlcnNpb24gPSBhdG9pKGJ1ZmZlci5idWYpOworCisJaWYgKHZlcnNpb24gPCAyMikgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJlbWFjc2NsaWVudCB2ZXJzaW9uICclZCcgdG9vIG9sZCAoPCAyMikuXG4iLAorCQkJdmVyc2lvbik7CisJCXN0cmJ1Zl9yZWxlYXNlKCZidWZmZXIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWNfd29tYW5fZW1hY3MoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciAqcGFnZSkKK3sKKwlpZiAoIWNoZWNrX2VtYWNzY2xpZW50X3ZlcnNpb24oKSkgeworCQkvKiBUaGlzIHdvcmtzIG9ubHkgd2l0aCBlbWFjc2NsaWVudCB2ZXJzaW9uID49IDIyLiAqLworCQlzdHJ1Y3Qgc3RyYnVmIG1hbl9wYWdlID0gU1RSQlVGX0lOSVQ7CisKKwkJaWYgKCFwYXRoKQorCQkJcGF0aCA9ICJlbWFjc2NsaWVudCI7CisJCXN0cmJ1Zl9hZGRmKCZtYW5fcGFnZSwgIih3b21hbiBcIiVzXCIpIiwgcGFnZSk7CisJCWV4ZWNscChwYXRoLCAiZW1hY3NjbGllbnQiLCAiLWUiLCBtYW5fcGFnZS5idWYsIE5VTEwpOworCQl3YXJuaW5nKCJmYWlsZWQgdG8gZXhlYyAnJXMnOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleGVjX21hbl9rb25xdWVyb3IoY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciAqcGFnZSkKK3sKKwljb25zdCBjaGFyICpkaXNwbGF5ID0gZ2V0ZW52KCJESVNQTEFZIik7CisJaWYgKGRpc3BsYXkgJiYgKmRpc3BsYXkpIHsKKwkJc3RydWN0IHN0cmJ1ZiBtYW5fcGFnZSA9IFNUUkJVRl9JTklUOworCQljb25zdCBjaGFyICpmaWxlbmFtZSA9ICJrZm1jbGllbnQiOworCisJCS8qIEl0J3Mgc2ltcGxlciB0byBsYXVuY2gga29ucXVlcm9yIHVzaW5nIGtmbWNsaWVudC4gKi8KKwkJaWYgKHBhdGgpIHsKKwkJCWNvbnN0IGNoYXIgKmZpbGUgPSBzdHJyY2hyKHBhdGgsICcvJyk7CisJCQlpZiAoZmlsZSAmJiAhc3RyY21wKGZpbGUgKyAxLCAia29ucXVlcm9yIikpIHsKKwkJCQljaGFyICpuZXcgPSBzdHJkdXAocGF0aCk7CisJCQkJY2hhciAqZGVzdCA9IHN0cnJjaHIobmV3LCAnLycpOworCisJCQkJLyogc3RybGVuKCJrb25xdWVyb3IiKSA9PSBzdHJsZW4oImtmbWNsaWVudCIpICovCisJCQkJc3RyY3B5KGRlc3QgKyAxLCAia2ZtY2xpZW50Iik7CisJCQkJcGF0aCA9IG5ldzsKKwkJCX0KKwkJCWlmIChmaWxlKQorCQkJCWZpbGVuYW1lID0gZmlsZTsKKwkJfSBlbHNlCisJCQlwYXRoID0gImtmbWNsaWVudCI7CisJCXN0cmJ1Zl9hZGRmKCZtYW5fcGFnZSwgIm1hbjolcygxKSIsIHBhZ2UpOworCQlleGVjbHAocGF0aCwgZmlsZW5hbWUsICJuZXdUYWIiLCBtYW5fcGFnZS5idWYsIE5VTEwpOworCQl3YXJuaW5nKCJmYWlsZWQgdG8gZXhlYyAnJXMnOiAlcyIsIHBhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleGVjX21hbl9tYW4oY29uc3QgY2hhciogcGF0aCwgY29uc3QgY2hhciAqcGFnZSkKK3sKKwlpZiAoIXBhdGgpCisJCXBhdGggPSAibWFuIjsKKwlleGVjbHAocGF0aCwgIm1hbiIsIHBhZ2UsIE5VTEwpOworCXdhcm5pbmcoImZhaWxlZCB0byBleGVjICclcyc6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQgZXhlY19tYW5fY21kKGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIHNoZWxsX2NtZCA9IFNUUkJVRl9JTklUOworCXN0cmJ1Zl9hZGRmKCZzaGVsbF9jbWQsICIlcyAlcyIsIGNtZCwgcGFnZSk7CisJZXhlY2woIi9iaW4vc2giLCAic2giLCAiLWMiLCBzaGVsbF9jbWQuYnVmLCBOVUxMKTsKKwl3YXJuaW5nKCJmYWlsZWQgdG8gZXhlYyAnJXMnOiAlcyIsIGNtZCwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQgYWRkX21hbl92aWV3ZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbWFuX3ZpZXdlcl9saXN0ICoqcCA9ICZtYW5fdmlld2VyX2xpc3Q7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihuYW1lKTsKKworCXdoaWxlICgqcCkKKwkJcCA9ICYoKCpwKS0+bmV4dCk7CisJKnAgPSBjYWxsb2MoMSwgKHNpemVvZigqKnApICsgbGVuICsgMSkpOworCXN0cm5jcHkoKCpwKS0+bmFtZSwgbmFtZSwgbGVuKTsKK30KKworc3RhdGljIGludCBzdXBwb3J0ZWRfbWFuX3ZpZXdlcihjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKQoreworCXJldHVybiAoIXN0cm5jYXNlY21wKCJtYW4iLCBuYW1lLCBsZW4pIHx8CisJCSFzdHJuY2FzZWNtcCgid29tYW4iLCBuYW1lLCBsZW4pIHx8CisJCSFzdHJuY2FzZWNtcCgia29ucXVlcm9yIiwgbmFtZSwgbGVuKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2FkZF9tYW5fdmlld2VyX2luZm8oY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICBzaXplX3QgbGVuLAorCQkJCSAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXN0cnVjdCBtYW5fdmlld2VyX2luZm9fbGlzdCAqbmV3ID0gY2FsbG9jKDEsIHNpemVvZigqbmV3KSArIGxlbiArIDEpOworCisJc3RybmNweShuZXctPm5hbWUsIG5hbWUsIGxlbik7CisJbmV3LT5pbmZvID0gc3RyZHVwKHZhbHVlKTsKKwluZXctPm5leHQgPSBtYW5fdmlld2VyX2luZm9fbGlzdDsKKwltYW5fdmlld2VyX2luZm9fbGlzdCA9IG5ldzsKK30KKworc3RhdGljIGludCBhZGRfbWFuX3ZpZXdlcl9wYXRoKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICAgc2l6ZV90IGxlbiwKKwkJCSAgICAgICBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoc3VwcG9ydGVkX21hbl92aWV3ZXIobmFtZSwgbGVuKSkKKwkJZG9fYWRkX21hbl92aWV3ZXJfaW5mbyhuYW1lLCBsZW4sIHZhbHVlKTsKKwllbHNlCisJCXdhcm5pbmcoIiclcyc6IHBhdGggZm9yIHVuc3VwcG9ydGVkIG1hbiB2aWV3ZXIuXG4iCisJCQkiUGxlYXNlIGNvbnNpZGVyIHVzaW5nICdtYW4uPHRvb2w+LmNtZCcgaW5zdGVhZC4iLAorCQkJbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfbWFuX3ZpZXdlcl9jbWQoY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgIHNpemVfdCBsZW4sCisJCQkgICAgICBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoc3VwcG9ydGVkX21hbl92aWV3ZXIobmFtZSwgbGVuKSkKKwkJd2FybmluZygiJyVzJzogY21kIGZvciBzdXBwb3J0ZWQgbWFuIHZpZXdlci5cbiIKKwkJCSJQbGVhc2UgY29uc2lkZXIgdXNpbmcgJ21hbi48dG9vbD4ucGF0aCcgaW5zdGVhZC4iLAorCQkJbmFtZSk7CisJZWxzZQorCQlkb19hZGRfbWFuX3ZpZXdlcl9pbmZvKG5hbWUsIGxlbiwgdmFsdWUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX21hbl92aWV3ZXJfaW5mbyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSB2YXIgKyA0OworCWNvbnN0IGNoYXIgKnN1YmtleSA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKworCWlmICghc3Via2V5KQorCQlyZXR1cm4gZXJyb3IoIkNvbmZpZyB3aXRoIG5vIGtleSBmb3IgbWFuIHZpZXdlcjogJXMiLCBuYW1lKTsKKworCWlmICghc3RyY21wKHN1YmtleSwgIi5wYXRoIikpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQlyZXR1cm4gYWRkX21hbl92aWV3ZXJfcGF0aChuYW1lLCBzdWJrZXkgLSBuYW1lLCB2YWx1ZSk7CisJfQorCWlmICghc3RyY21wKHN1YmtleSwgIi5jbWQiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCXJldHVybiBhZGRfbWFuX3ZpZXdlcl9jbWQobmFtZSwgc3Via2V5IC0gbmFtZSwgdmFsdWUpOworCX0KKworCXdhcm5pbmcoIiclcyc6IHVuc3VwcG9ydGVkIG1hbiB2aWV3ZXIgc3ViIGtleS4iLCBzdWJrZXkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcmZfaGVscF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqY2IpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiaGVscC5mb3JtYXQiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCWhlbHBfZm9ybWF0ID0gcGFyc2VfaGVscF9mb3JtYXQodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzdHJjbXAodmFyLCAibWFuLnZpZXdlciIpKSB7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJYWRkX21hbl92aWV3ZXIodmFsdWUpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFwcmVmaXhjbXAodmFyLCAibWFuLiIpKQorCQlyZXR1cm4gYWRkX21hbl92aWV3ZXJfaW5mbyh2YXIsIHZhbHVlKTsKKworCXJldHVybiBwZXJmX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUsIGNiKTsKK30KKworc3RhdGljIHN0cnVjdCBjbWRuYW1lcyBtYWluX2NtZHMsIG90aGVyX2NtZHM7CisKK3ZvaWQgbGlzdF9jb21tb25fY21kc19oZWxwKHZvaWQpCit7CisJaW50IGksIGxvbmdlc3QgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tbW9uX2NtZHMpOyBpKyspIHsKKwkJaWYgKGxvbmdlc3QgPCBzdHJsZW4oY29tbW9uX2NtZHNbaV0ubmFtZSkpCisJCQlsb25nZXN0ID0gc3RybGVuKGNvbW1vbl9jbWRzW2ldLm5hbWUpOworCX0KKworCXB1dHMoIiBUaGUgbW9zdCBjb21tb25seSB1c2VkIHBlcmYgY29tbWFuZHMgYXJlOiIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbW1vbl9jbWRzKTsgaSsrKSB7CisJCXByaW50ZigiICAgJXMgICAiLCBjb21tb25fY21kc1tpXS5uYW1lKTsKKwkJbXB1dF9jaGFyKCcgJywgbG9uZ2VzdCAtIHN0cmxlbihjb21tb25fY21kc1tpXS5uYW1lKSk7CisJCXB1dHMoY29tbW9uX2NtZHNbaV0uaGVscCk7CisJfQorfQorCitzdGF0aWMgaW50IGlzX3BlcmZfY29tbWFuZChjb25zdCBjaGFyICpzKQoreworCXJldHVybiBpc19pbl9jbWRsaXN0KCZtYWluX2NtZHMsIHMpIHx8CisJCWlzX2luX2NtZGxpc3QoJm90aGVyX2NtZHMsIHMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJlcGVuZChjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmNtZCkKK3sKKwlzaXplX3QgcHJlX2xlbiA9IHN0cmxlbihwcmVmaXgpOworCXNpemVfdCBjbWRfbGVuID0gc3RybGVuKGNtZCk7CisJY2hhciAqcCA9IG1hbGxvYyhwcmVfbGVuICsgY21kX2xlbiArIDEpOworCW1lbWNweShwLCBwcmVmaXgsIHByZV9sZW4pOworCXN0cmNweShwICsgcHJlX2xlbiwgY21kKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNtZF90b19wYWdlKGNvbnN0IGNoYXIgKnBlcmZfY21kKQoreworCWlmICghcGVyZl9jbWQpCisJCXJldHVybiAicGVyZiI7CisJZWxzZSBpZiAoIXByZWZpeGNtcChwZXJmX2NtZCwgInBlcmYiKSkKKwkJcmV0dXJuIHBlcmZfY21kOworCWVsc2UgaWYgKGlzX3BlcmZfY29tbWFuZChwZXJmX2NtZCkpCisJCXJldHVybiBwcmVwZW5kKCJwZXJmLSIsIHBlcmZfY21kKTsKKwllbHNlCisJCXJldHVybiBwcmVwZW5kKCJwZXJmLSIsIHBlcmZfY21kKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBfbWFuX3BhdGgodm9pZCkKK3sKKwlzdHJ1Y3Qgc3RyYnVmIG5ld19wYXRoID0gU1RSQlVGX0lOSVQ7CisJY29uc3QgY2hhciAqb2xkX3BhdGggPSBnZXRlbnYoIk1BTlBBVEgiKTsKKworCS8qIFdlIHNob3VsZCBhbHdheXMgcHV0ICc6JyBhZnRlciBvdXIgcGF0aC4gSWYgdGhlcmUgaXMgbm8KKwkgKiBvbGRfcGF0aCwgdGhlICc6JyBhdCB0aGUgZW5kIHdpbGwgbGV0ICdtYW4nIHRvIHRyeQorCSAqIHN5c3RlbS13aWRlIHBhdGhzIGFmdGVyIG91cnMgdG8gZmluZCB0aGUgbWFudWFsIHBhZ2UuIElmCisJICogdGhlcmUgaXMgb2xkX3BhdGgsIHdlIG5lZWQgJzonIGFzIGRlbGltaXRlci4gKi8KKwlzdHJidWZfYWRkc3RyKCZuZXdfcGF0aCwgc3lzdGVtX3BhdGgoUEVSRl9NQU5fUEFUSCkpOworCXN0cmJ1Zl9hZGRjaCgmbmV3X3BhdGgsICc6Jyk7CisJaWYgKG9sZF9wYXRoKQorCQlzdHJidWZfYWRkc3RyKCZuZXdfcGF0aCwgb2xkX3BhdGgpOworCisJc2V0ZW52KCJNQU5QQVRIIiwgbmV3X3BhdGguYnVmLCAxKTsKKworCXN0cmJ1Zl9yZWxlYXNlKCZuZXdfcGF0aCk7Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWNfdmlld2VyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnBhZ2UpCit7CisJY29uc3QgY2hhciAqaW5mbyA9IGdldF9tYW5fdmlld2VyX2luZm8obmFtZSk7CisKKwlpZiAoIXN0cmNhc2VjbXAobmFtZSwgIm1hbiIpKQorCQlleGVjX21hbl9tYW4oaW5mbywgcGFnZSk7CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgIndvbWFuIikpCisJCWV4ZWNfd29tYW5fZW1hY3MoaW5mbywgcGFnZSk7CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImtvbnF1ZXJvciIpKQorCQlleGVjX21hbl9rb25xdWVyb3IoaW5mbywgcGFnZSk7CisJZWxzZSBpZiAoaW5mbykKKwkJZXhlY19tYW5fY21kKGluZm8sIHBhZ2UpOworCWVsc2UKKwkJd2FybmluZygiJyVzJzogdW5rbm93biBtYW4gdmlld2VyLiIsIG5hbWUpOworfQorCitzdGF0aWMgdm9pZCBzaG93X21hbl9wYWdlKGNvbnN0IGNoYXIgKnBlcmZfY21kKQoreworCXN0cnVjdCBtYW5fdmlld2VyX2xpc3QgKnZpZXdlcjsKKwljb25zdCBjaGFyICpwYWdlID0gY21kX3RvX3BhZ2UocGVyZl9jbWQpOworCWNvbnN0IGNoYXIgKmZhbGxiYWNrID0gZ2V0ZW52KCJQRVJGX01BTl9WSUVXRVIiKTsKKworCXNldHVwX21hbl9wYXRoKCk7CisJZm9yICh2aWV3ZXIgPSBtYW5fdmlld2VyX2xpc3Q7IHZpZXdlcjsgdmlld2VyID0gdmlld2VyLT5uZXh0KQorCXsKKwkJZXhlY192aWV3ZXIodmlld2VyLT5uYW1lLCBwYWdlKTsgLyogd2lsbCByZXR1cm4gd2hlbiB1bmFibGUgKi8KKwl9CisJaWYgKGZhbGxiYWNrKQorCQlleGVjX3ZpZXdlcihmYWxsYmFjaywgcGFnZSk7CisJZXhlY192aWV3ZXIoIm1hbiIsIHBhZ2UpOworCWRpZSgibm8gbWFuIHZpZXdlciBoYW5kbGVkIHRoZSByZXF1ZXN0Iik7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaW5mb19wYWdlKGNvbnN0IGNoYXIgKnBlcmZfY21kKQoreworCWNvbnN0IGNoYXIgKnBhZ2UgPSBjbWRfdG9fcGFnZShwZXJmX2NtZCk7CisJc2V0ZW52KCJJTkZPUEFUSCIsIHN5c3RlbV9wYXRoKFBFUkZfSU5GT19QQVRIKSwgMSk7CisJZXhlY2xwKCJpbmZvIiwgImluZm8iLCAicGVyZm1hbiIsIHBhZ2UsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBnZXRfaHRtbF9wYWdlX3BhdGgoc3RydWN0IHN0cmJ1ZiAqcGFnZV9wYXRoLCBjb25zdCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgKmh0bWxfcGF0aCA9IHN5c3RlbV9wYXRoKFBFUkZfSFRNTF9QQVRIKTsKKworCS8qIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHBlcmYgZG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkuICovCisJaWYgKHN0YXQobWtwYXRoKCIlcy9wZXJmLmh0bWwiLCBodG1sX3BhdGgpLCAmc3QpCisJICAgIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpKQorCQlkaWUoIiclcyc6IG5vdCBhIGRvY3VtZW50YXRpb24gZGlyZWN0b3J5LiIsIGh0bWxfcGF0aCk7CisKKwlzdHJidWZfaW5pdChwYWdlX3BhdGgsIDApOworCXN0cmJ1Zl9hZGRmKHBhZ2VfcGF0aCwgIiVzLyVzLmh0bWwiLCBodG1sX3BhdGgsIHBhZ2UpOworfQorCisvKgorICogSWYgb3Blbl9odG1sIGlzIG5vdCBkZWZpbmVkIGluIGEgcGxhdGZvcm0tc3BlY2lmaWMgd2F5IChzZWUgZm9yCisgKiBleGFtcGxlIGNvbXBhdC9taW5ndy5oKSwgd2UgdXNlIHRoZSBzY3JpcHQgd2ViLS1icm93c2UgdG8gZGlzcGxheQorICogSFRNTC4KKyAqLworI2lmbmRlZiBvcGVuX2h0bWwKK3N0YXRpYyB2b2lkIG9wZW5faHRtbChjb25zdCBjaGFyICpwYXRoKQoreworCWV4ZWNsX3BlcmZfY21kKCJ3ZWItLWJyb3dzZSIsICItYyIsICJoZWxwLmJyb3dzZXIiLCBwYXRoLCBOVUxMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzaG93X2h0bWxfcGFnZShjb25zdCBjaGFyICpwZXJmX2NtZCkKK3sKKwljb25zdCBjaGFyICpwYWdlID0gY21kX3RvX3BhZ2UocGVyZl9jbWQpOworCXN0cnVjdCBzdHJidWYgcGFnZV9wYXRoOyAvKiBpdCBsZWFrcyBidXQgd2UgZXhlYyBiZWxsb3cgKi8KKworCWdldF9odG1sX3BhZ2VfcGF0aCgmcGFnZV9wYXRoLCBwYWdlKTsKKworCW9wZW5faHRtbChwYWdlX3BhdGguYnVmKTsKK30KKworaW50IGNtZF9oZWxwKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWNvbnN0IGNoYXIgKmFsaWFzOworCWxvYWRfY29tbWFuZF9saXN0KCJwZXJmLSIsICZtYWluX2NtZHMsICZvdGhlcl9jbWRzKTsKKworCXBlcmZfY29uZmlnKHBlcmZfaGVscF9jb25maWcsIE5VTEwpOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgYnVpbHRpbl9oZWxwX29wdGlvbnMsCisJCQlidWlsdGluX2hlbHBfdXNhZ2UsIDApOworCisJaWYgKHNob3dfYWxsKSB7CisJCXByaW50ZigiXG4gdXNhZ2U6ICVzXG5cbiIsIHBlcmZfdXNhZ2Vfc3RyaW5nKTsKKwkJbGlzdF9jb21tYW5kcygicGVyZiBjb21tYW5kcyIsICZtYWluX2NtZHMsICZvdGhlcl9jbWRzKTsKKwkJcHJpbnRmKCIgJXNcblxuIiwgcGVyZl9tb3JlX2luZm9fc3RyaW5nKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFhcmd2WzBdKSB7CisJCXByaW50ZigiXG4gdXNhZ2U6ICVzXG5cbiIsIHBlcmZfdXNhZ2Vfc3RyaW5nKTsKKwkJbGlzdF9jb21tb25fY21kc19oZWxwKCk7CisJCXByaW50ZigiXG4gJXNcblxuIiwgcGVyZl9tb3JlX2luZm9fc3RyaW5nKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYWxpYXMgPSBhbGlhc19sb29rdXAoYXJndlswXSk7CisJaWYgKGFsaWFzICYmICFpc19wZXJmX2NvbW1hbmQoYXJndlswXSkpIHsKKwkJcHJpbnRmKCJgcGVyZiAlcycgaXMgYWxpYXNlZCB0byBgJXMnXG4iLCBhcmd2WzBdLCBhbGlhcyk7CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoaGVscF9mb3JtYXQpIHsKKwljYXNlIEhFTFBfRk9STUFUX01BTjoKKwkJc2hvd19tYW5fcGFnZShhcmd2WzBdKTsKKwkJYnJlYWs7CisJY2FzZSBIRUxQX0ZPUk1BVF9JTkZPOgorCQlzaG93X2luZm9fcGFnZShhcmd2WzBdKTsKKwkJYnJlYWs7CisJY2FzZSBIRUxQX0ZPUk1BVF9XRUI6CisJCXNob3dfaHRtbF9wYWdlKGFyZ3ZbMF0pOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1saXN0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNjBlMzcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4tbGlzdC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBidWlsdGluLWxpc3QuYworICoKKyAqIEJ1aWx0aW4gbGlzdCBjb21tYW5kOiBsaXN0IGFsbCBldmVudCB0eXBlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgUmVkIEhhdCBJbmMsIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICovCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjaW5jbHVkZSAicGVyZi5oIgorCisjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAidXRpbC9wYXJzZS1ldmVudHMuaCIKKworaW50IGNtZF9saXN0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXByaW50X2V2ZW50cygpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MjU5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKQEAgLTAsMCArMSw1ODIgQEAKKy8qCisgKiBidWlsdGluLXJlY29yZC5jCisgKgorICogQnVpbHRpbiByZWNvcmQgY29tbWFuZDogUmVjb3JkIHRoZSBwcm9maWxlIG9mIGEgd29ya2xvYWQKKyAqIChvciBhIENQVSwgb3IgYSBQSUQpIGludG8gdGhlIHBlcmYuZGF0YSBvdXRwdXQgZmlsZSAtIGZvcgorICogbGF0ZXIgYW5hbHlzaXMgdmlhIHBlcmYgcmVwb3J0LgorICovCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjaW5jbHVkZSAicGVyZi5oIgorCisjaW5jbHVkZSAidXRpbC91dGlsLmgiCisjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAidXRpbC9wYXJzZS1ldmVudHMuaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZy5oIgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c2NoZWQuaD4KKworI2RlZmluZSBBTElHTih4LCBhKQkJX19BTElHTl9NQVNLKHgsICh0eXBlb2YoeCkpKGEpLTEpCisjZGVmaW5lIF9fQUxJR05fTUFTSyh4LCBtYXNrKQkoKCh4KSsobWFzaykpJn4obWFzaykpCisKK3N0YXRpYyBpbnQJCQlmZFtNQVhfTlJfQ1BVU11bTUFYX0NPVU5URVJTXTsKKworc3RhdGljIGxvbmcJCQlkZWZhdWx0X2ludGVydmFsCQk9IDEwMDAwMDsKKworc3RhdGljIGludAkJCW5yX2NwdXMJCQkJPSAwOworc3RhdGljIHVuc2lnbmVkIGludAkJcGFnZV9zaXplOworc3RhdGljIHVuc2lnbmVkIGludAkJbW1hcF9wYWdlcwkJCT0gMTI4Oworc3RhdGljIGludAkJCWZyZXEJCQkJPSAwOworc3RhdGljIGludAkJCW91dHB1dDsKK3N0YXRpYyBjb25zdCBjaGFyCQkqb3V0cHV0X25hbWUJCQk9ICJwZXJmLmRhdGEiOworc3RhdGljIGludAkJCWdyb3VwCQkJCT0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJCXJlYWx0aW1lX3ByaW8JCQk9IDA7CitzdGF0aWMgaW50CQkJc3lzdGVtX3dpZGUJCQk9IDA7CitzdGF0aWMgcGlkX3QJCQl0YXJnZXRfcGlkCQkJPSAtMTsKK3N0YXRpYyBpbnQJCQlpbmhlcml0CQkJCT0gMTsKK3N0YXRpYyBpbnQJCQlmb3JjZQkJCQk9IDA7CitzdGF0aWMgaW50CQkJYXBwZW5kX2ZpbGUJCQk9IDA7CitzdGF0aWMgaW50CQkJdmVyYm9zZQkJCQk9IDA7CisKK3N0YXRpYyBsb25nCQkJc2FtcGxlczsKK3N0YXRpYyBzdHJ1Y3QgdGltZXZhbAkJbGFzdF9yZWFkOworc3RhdGljIHN0cnVjdCB0aW1ldmFsCQl0aGlzX3JlYWQ7CisKK3N0YXRpYyBfX3U2NAkJCWJ5dGVzX3dyaXR0ZW47CisKK3N0YXRpYyBzdHJ1Y3QgcG9sbGZkCQlldmVudF9hcnJheVtNQVhfTlJfQ1BVUyAqIE1BWF9DT1VOVEVSU107CisKK3N0YXRpYyBpbnQJCQlucl9wb2xsOworc3RhdGljIGludAkJCW5yX2NwdTsKKworc3RydWN0IG1tYXBfZXZlbnQgeworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJX191MzIJCQkJcGlkOworCV9fdTMyCQkJCXRpZDsKKwlfX3U2NAkJCQlzdGFydDsKKwlfX3U2NAkJCQlsZW47CisJX191NjQJCQkJcGdvZmY7CisJY2hhcgkJCQlmaWxlbmFtZVtQQVRIX01BWF07Cit9OworCitzdHJ1Y3QgY29tbV9ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwlfX3UzMgkJCQlwaWQ7CisJX191MzIJCQkJdGlkOworCWNoYXIJCQkJY29tbVsxNl07Cit9OworCisKK3N0cnVjdCBtbWFwX2RhdGEgeworCWludAkJCWNvdW50ZXI7CisJdm9pZAkJCSpiYXNlOworCXVuc2lnbmVkIGludAkJbWFzazsKKwl1bnNpZ25lZCBpbnQJCXByZXY7Cit9OworCitzdGF0aWMgc3RydWN0IG1tYXBfZGF0YQkJbW1hcF9hcnJheVtNQVhfTlJfQ1BVU11bTUFYX0NPVU5URVJTXTsKKworc3RhdGljIHVuc2lnbmVkIGludCBtbWFwX3JlYWRfaGVhZChzdHJ1Y3QgbW1hcF9kYXRhICptZCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX21tYXBfcGFnZSAqcGMgPSBtZC0+YmFzZTsKKwlpbnQgaGVhZDsKKworCWhlYWQgPSBwYy0+ZGF0YV9oZWFkOworCXJtYigpOworCisJcmV0dXJuIGhlYWQ7Cit9CisKK3N0YXRpYyB2b2lkIG1tYXBfcmVhZChzdHJ1Y3QgbW1hcF9kYXRhICptZCkKK3sKKwl1bnNpZ25lZCBpbnQgaGVhZCA9IG1tYXBfcmVhZF9oZWFkKG1kKTsKKwl1bnNpZ25lZCBpbnQgb2xkID0gbWQtPnByZXY7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IG1kLT5iYXNlICsgcGFnZV9zaXplOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwl2b2lkICpidWY7CisJaW50IGRpZmY7CisKKwlnZXR0aW1lb2ZkYXkoJnRoaXNfcmVhZCwgTlVMTCk7CisKKwkvKgorCSAqIElmIHdlJ3JlIGZ1cnRoZXIgYmVoaW5kIHRoYW4gaGFsZiB0aGUgYnVmZmVyLCB0aGVyZSdzIGEgY2hhbmNlCisJICogdGhlIHdyaXRlciB3aWxsIGJpdGUgb3VyIHRhaWwgYW5kIG1lc3MgdXAgdGhlIHNhbXBsZXMgdW5kZXIgdXMuCisJICoKKwkgKiBJZiB3ZSBzb21laG93IGVuZGVkIHVwIGFoZWFkIG9mIHRoZSBoZWFkLCB3ZSBnb3QgbWVzc2VkIHVwLgorCSAqCisJICogSW4gZWl0aGVyIGNhc2UsIHRydW5jYXRlIGFuZCByZXN0YXJ0IGF0IGhlYWQuCisJICovCisJZGlmZiA9IGhlYWQgLSBvbGQ7CisJaWYgKGRpZmYgPiBtZC0+bWFzayAvIDIgfHwgZGlmZiA8IDApIHsKKwkJc3RydWN0IHRpbWV2YWwgaXY7CisJCXVuc2lnbmVkIGxvbmcgbXNlY3M7CisKKwkJdGltZXJzdWIoJnRoaXNfcmVhZCwgJmxhc3RfcmVhZCwgJml2KTsKKwkJbXNlY3MgPSBpdi50dl9zZWMqMTAwMCArIGl2LnR2X3VzZWMvMTAwMDsKKworCQlmcHJpbnRmKHN0ZGVyciwgIldBUk5JTkc6IGZhaWxlZCB0byBrZWVwIHVwIHdpdGggbW1hcCBkYXRhLiIKKwkJCQkiICBMYXN0IHJlYWQgJWx1IG1zZWNzIGFnby5cbiIsIG1zZWNzKTsKKworCQkvKgorCQkgKiBoZWFkIHBvaW50cyB0byBhIGtub3duIGdvb2QgZW50cnksIHN0YXJ0IHRoZXJlLgorCQkgKi8KKwkJb2xkID0gaGVhZDsKKwl9CisKKwlsYXN0X3JlYWQgPSB0aGlzX3JlYWQ7CisKKwlpZiAob2xkICE9IGhlYWQpCisJCXNhbXBsZXMrKzsKKworCXNpemUgPSBoZWFkIC0gb2xkOworCisJaWYgKChvbGQgJiBtZC0+bWFzaykgKyBzaXplICE9IChoZWFkICYgbWQtPm1hc2spKSB7CisJCWJ1ZiA9ICZkYXRhW29sZCAmIG1kLT5tYXNrXTsKKwkJc2l6ZSA9IG1kLT5tYXNrICsgMSAtIChvbGQgJiBtZC0+bWFzayk7CisJCW9sZCArPSBzaXplOworCisJCXdoaWxlIChzaXplKSB7CisJCQlpbnQgcmV0ID0gd3JpdGUob3V0cHV0LCBidWYsIHNpemUpOworCisJCQlpZiAocmV0IDwgMCkKKwkJCQlkaWUoImZhaWxlZCB0byB3cml0ZSIpOworCisJCQlzaXplIC09IHJldDsKKwkJCWJ1ZiArPSByZXQ7CisKKwkJCWJ5dGVzX3dyaXR0ZW4gKz0gcmV0OworCQl9CisJfQorCisJYnVmID0gJmRhdGFbb2xkICYgbWQtPm1hc2tdOworCXNpemUgPSBoZWFkIC0gb2xkOworCW9sZCArPSBzaXplOworCisJd2hpbGUgKHNpemUpIHsKKwkJaW50IHJldCA9IHdyaXRlKG91dHB1dCwgYnVmLCBzaXplKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCWRpZSgiZmFpbGVkIHRvIHdyaXRlIik7CisKKwkJc2l6ZSAtPSByZXQ7CisJCWJ1ZiArPSByZXQ7CisKKwkJYnl0ZXNfd3JpdHRlbiArPSByZXQ7CisJfQorCisJbWQtPnByZXYgPSBvbGQ7Cit9CisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgZG9uZSA9IDA7CitzdGF0aWMgdm9sYXRpbGUgaW50IHNpZ25yID0gLTE7CisKK3N0YXRpYyB2b2lkIHNpZ19oYW5kbGVyKGludCBzaWcpCit7CisJZG9uZSA9IDE7CisJc2lnbnIgPSBzaWc7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19hdGV4aXQodm9pZCkKK3sKKwlpZiAoc2lnbnIgPT0gLTEpCisJCXJldHVybjsKKworCXNpZ25hbChzaWduciwgU0lHX0RGTCk7CisJa2lsbChnZXRwaWQoKSwgc2lnbnIpOworfQorCitzdGF0aWMgdm9pZCBwaWRfc3ludGhlc2l6ZV9jb21tX2V2ZW50KHBpZF90IHBpZCwgaW50IGZ1bGwpCit7CisJc3RydWN0IGNvbW1fZXZlbnQgY29tbV9ldjsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwljaGFyIGJmW0JVRlNJWl07CisJaW50IGZkLCByZXQ7CisJc2l6ZV90IHNpemU7CisJY2hhciAqZmllbGQsICpzZXA7CisJRElSICp0YXNrczsKKwlzdHJ1Y3QgZGlyZW50IGRpcmVudCwgKm5leHQ7CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIi9wcm9jLyVkL3N0YXQiLCBwaWQpOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwlpZiAocmVhZChmZCwgYmYsIHNpemVvZihiZikpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IHJlYWQgJXNcbiIsIGZpbGVuYW1lKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwljbG9zZShmZCk7CisKKwkvKiA5MDI3IChjYXQpIFIgNjc0NyA5MDI3IDY3NDcgMzQ4MTYgOTAyNyAuLi4gKi8KKwltZW1zZXQoJmNvbW1fZXYsIDAsIHNpemVvZihjb21tX2V2KSk7CisJZmllbGQgPSBzdHJjaHIoYmYsICcoJyk7CisJaWYgKGZpZWxkID09IE5VTEwpCisJCWdvdG8gb3V0X2ZhaWx1cmU7CisJc2VwID0gc3RyY2hyKCsrZmllbGQsICcpJyk7CisJaWYgKHNlcCA9PSBOVUxMKQorCQlnb3RvIG91dF9mYWlsdXJlOworCXNpemUgPSBzZXAgLSBmaWVsZDsKKwltZW1jcHkoY29tbV9ldi5jb21tLCBmaWVsZCwgc2l6ZSsrKTsKKworCWNvbW1fZXYucGlkID0gcGlkOworCWNvbW1fZXYuaGVhZGVyLnR5cGUgPSBQRVJGX0VWRU5UX0NPTU07CisJc2l6ZSA9IEFMSUdOKHNpemUsIHNpemVvZihfX3U2NCkpOworCWNvbW1fZXYuaGVhZGVyLnNpemUgPSBzaXplb2YoY29tbV9ldikgLSAoc2l6ZW9mKGNvbW1fZXYuY29tbSkgLSBzaXplKTsKKworCWlmICghZnVsbCkgeworCQljb21tX2V2LnRpZCA9IHBpZDsKKworCQlyZXQgPSB3cml0ZShvdXRwdXQsICZjb21tX2V2LCBjb21tX2V2LmhlYWRlci5zaXplKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXBlcnJvcigiZmFpbGVkIHRvIHdyaXRlIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIvcHJvYy8lZC90YXNrIiwgcGlkKTsKKworCXRhc2tzID0gb3BlbmRpcihmaWxlbmFtZSk7CisJd2hpbGUgKCFyZWFkZGlyX3IodGFza3MsICZkaXJlbnQsICZuZXh0KSAmJiBuZXh0KSB7CisJCWNoYXIgKmVuZDsKKwkJcGlkID0gc3RydG9sKGRpcmVudC5kX25hbWUsICZlbmQsIDEwKTsKKwkJaWYgKCplbmQpCisJCQljb250aW51ZTsKKworCQljb21tX2V2LnRpZCA9IHBpZDsKKworCQlyZXQgPSB3cml0ZShvdXRwdXQsICZjb21tX2V2LCBjb21tX2V2LmhlYWRlci5zaXplKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXBlcnJvcigiZmFpbGVkIHRvIHdyaXRlIik7CisJCQlleGl0KC0xKTsKKwkJfQorCX0KKwljbG9zZWRpcih0YXNrcyk7CisJcmV0dXJuOworCitvdXRfZmFpbHVyZToKKwlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IGdldCBDT01NIGFuZCBwZ2lkLCBtYWxmb3JtZWQgJXNcbiIsCisJCWZpbGVuYW1lKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK3N0YXRpYyB2b2lkIHBpZF9zeW50aGVzaXplX21tYXBfc2FtcGxlcyhwaWRfdCBwaWQpCit7CisJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CisJRklMRSAqZnA7CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIi9wcm9jLyVkL21hcHMiLCBwaWQpOworCisJZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKwlpZiAoZnAgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKwl3aGlsZSAoMSkgeworCQljaGFyIGJmW0JVRlNJWl0sICpwYmYgPSBiZjsKKwkJc3RydWN0IG1tYXBfZXZlbnQgbW1hcF9ldiA9IHsKKwkJCS5oZWFkZXIudHlwZSA9IFBFUkZfRVZFTlRfTU1BUCwKKwkJfTsKKwkJaW50IG47CisJCXNpemVfdCBzaXplOworCQlpZiAoZmdldHMoYmYsIHNpemVvZihiZiksIGZwKSA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLyogMDA0MDAwMDAtMDA0MGMwMDAgci14cCAwMDAwMDAwMCBmZDowMSA0MTAzOCAgL2Jpbi9jYXQgKi8KKwkJbiA9IGhleDJ1NjQocGJmLCAmbW1hcF9ldi5zdGFydCk7CisJCWlmIChuIDwgMCkKKwkJCWNvbnRpbnVlOworCQlwYmYgKz0gbiArIDE7CisJCW4gPSBoZXgydTY0KHBiZiwgJm1tYXBfZXYubGVuKTsKKwkJaWYgKG4gPCAwKQorCQkJY29udGludWU7CisJCXBiZiArPSBuICsgMzsKKwkJaWYgKCpwYmYgPT0gJ3gnKSB7IC8qIHZtX2V4ZWMgKi8KKwkJCWNoYXIgKmV4ZWNuYW1lID0gc3RycmNocihiZiwgJyAnKTsKKworCQkJaWYgKGV4ZWNuYW1lID09IE5VTEwgfHwgZXhlY25hbWVbMV0gIT0gJy8nKQorCQkJCWNvbnRpbnVlOworCisJCQlleGVjbmFtZSArPSAxOworCQkJc2l6ZSA9IHN0cmxlbihleGVjbmFtZSk7CisJCQlleGVjbmFtZVtzaXplIC0gMV0gPSAnXDAnOyAvKiBSZW1vdmUgXG4gKi8KKwkJCW1lbWNweShtbWFwX2V2LmZpbGVuYW1lLCBleGVjbmFtZSwgc2l6ZSk7CisJCQlzaXplID0gQUxJR04oc2l6ZSwgc2l6ZW9mKF9fdTY0KSk7CisJCQltbWFwX2V2LmxlbiAtPSBtbWFwX2V2LnN0YXJ0OworCQkJbW1hcF9ldi5oZWFkZXIuc2l6ZSA9IChzaXplb2YobW1hcF9ldikgLQorCQkJCQkgICAgICAgKHNpemVvZihtbWFwX2V2LmZpbGVuYW1lKSAtIHNpemUpKTsKKwkJCW1tYXBfZXYucGlkID0gcGlkOworCQkJbW1hcF9ldi50aWQgPSBwaWQ7CisKKwkJCWlmICh3cml0ZShvdXRwdXQsICZtbWFwX2V2LCBtbWFwX2V2LmhlYWRlci5zaXplKSA8IDApIHsKKwkJCQlwZXJyb3IoImZhaWxlZCB0byB3cml0ZSIpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQl9CisJfQorCisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQgc3ludGhlc2l6ZV9zYW1wbGVzKHZvaWQpCit7CisJRElSICpwcm9jOworCXN0cnVjdCBkaXJlbnQgZGlyZW50LCAqbmV4dDsKKworCXByb2MgPSBvcGVuZGlyKCIvcHJvYyIpOworCisJd2hpbGUgKCFyZWFkZGlyX3IocHJvYywgJmRpcmVudCwgJm5leHQpICYmIG5leHQpIHsKKwkJY2hhciAqZW5kOworCQlwaWRfdCBwaWQ7CisKKwkJcGlkID0gc3RydG9sKGRpcmVudC5kX25hbWUsICZlbmQsIDEwKTsKKwkJaWYgKCplbmQpIC8qIG9ubHkgaW50ZXJlc3RlZCBpbiBwcm9wZXIgbnVtZXJpY2FsIGRpcmVudHMgKi8KKwkJCWNvbnRpbnVlOworCisJCXBpZF9zeW50aGVzaXplX2NvbW1fZXZlbnQocGlkLCAxKTsKKwkJcGlkX3N5bnRoZXNpemVfbW1hcF9zYW1wbGVzKHBpZCk7CisJfQorCisJY2xvc2VkaXIocHJvYyk7Cit9CisKK3N0YXRpYyBpbnQgZ3JvdXBfZmQ7CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9jb3VudGVyKGludCBjb3VudGVyLCBpbnQgY3B1LCBwaWRfdCBwaWQpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyID0gYXR0cnMgKyBjb3VudGVyOworCWludCB0cmFjayA9IDE7CisKKwlhdHRyLT5zYW1wbGVfdHlwZQk9IFBFUkZfU0FNUExFX0lQIHwgUEVSRl9TQU1QTEVfVElEOworCWlmIChmcmVxKSB7CisJCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX1BFUklPRDsKKwkJYXR0ci0+ZnJlcQkJPSAxOworCQlhdHRyLT5zYW1wbGVfZnJlcQk9IGZyZXE7CisJfQorCWF0dHItPm1tYXAJCT0gdHJhY2s7CisJYXR0ci0+Y29tbQkJPSB0cmFjazsKKwlhdHRyLT5pbmhlcml0CQk9IChjcHUgPCAwKSAmJiBpbmhlcml0OworCWF0dHItPmRpc2FibGVkCQk9IDE7CisKKwl0cmFjayA9IDA7IC8qIG9ubHkgdGhlIGZpcnN0IGNvdW50ZXIgbmVlZHMgdGhlc2UgKi8KKwordHJ5X2FnYWluOgorCWZkW25yX2NwdV1bY291bnRlcl0gPSBzeXNfcGVyZl9jb3VudGVyX29wZW4oYXR0ciwgcGlkLCBjcHUsIGdyb3VwX2ZkLCAwKTsKKworCWlmIChmZFtucl9jcHVdW2NvdW50ZXJdIDwgMCkgeworCQlpbnQgZXJyID0gZXJybm87CisKKwkJaWYgKGVyciA9PSBFUEVSTSkKKwkJCWRpZSgiUGVybWlzc2lvbiBlcnJvciAtIGFyZSB5b3Ugcm9vdD9cbiIpOworCisJCS8qCisJCSAqIElmIGl0J3MgY3ljbGVzIHRoZW4gZmFsbCBiYWNrIHRvIGhydGltZXIKKwkJICogYmFzZWQgY3B1LWNsb2NrLXRpY2sgc3cgY291bnRlciwgd2hpY2gKKwkJICogaXMgYWx3YXlzIGF2YWlsYWJsZSBldmVuIGlmIG5vIFBNVSBzdXBwb3J0OgorCQkgKi8KKwkJaWYgKGF0dHItPnR5cGUgPT0gUEVSRl9UWVBFX0hBUkRXQVJFCisJCQkmJiBhdHRyLT5jb25maWcgPT0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTKSB7CisKKwkJCWlmICh2ZXJib3NlKQorCQkJCXdhcm5pbmcoIiAuLi4gdHJ5aW5nIHRvIGZhbGwgYmFjayB0byBjcHUtY2xvY2stdGlja3NcbiIpOworCQkJYXR0ci0+dHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRTsKKwkJCWF0dHItPmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLOworCQkJZ290byB0cnlfYWdhaW47CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCQllcnJvcigicGVyZmNvdW50ZXIgc3lzY2FsbCByZXR1cm5lZCB3aXRoICVkICglcylcbiIsCisJCQlmZFtucl9jcHVdW2NvdW50ZXJdLCBzdHJlcnJvcihlcnIpKTsKKwkJZGllKCJObyBDT05GSUdfUEVSRl9DT1VOVEVSUz15IGtlcm5lbCBzdXBwb3J0IGNvbmZpZ3VyZWQ/XG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJYXNzZXJ0KGZkW25yX2NwdV1bY291bnRlcl0gPj0gMCk7CisJZmNudGwoZmRbbnJfY3B1XVtjb3VudGVyXSwgRl9TRVRGTCwgT19OT05CTE9DSyk7CisKKwkvKgorCSAqIEZpcnN0IGNvdW50ZXIgYWN0cyBhcyB0aGUgZ3JvdXAgbGVhZGVyOgorCSAqLworCWlmIChncm91cCAmJiBncm91cF9mZCA9PSAtMSkKKwkJZ3JvdXBfZmQgPSBmZFtucl9jcHVdW2NvdW50ZXJdOworCisJZXZlbnRfYXJyYXlbbnJfcG9sbF0uZmQgPSBmZFtucl9jcHVdW2NvdW50ZXJdOworCWV2ZW50X2FycmF5W25yX3BvbGxdLmV2ZW50cyA9IFBPTExJTjsKKwlucl9wb2xsKys7CisKKwltbWFwX2FycmF5W25yX2NwdV1bY291bnRlcl0uY291bnRlciA9IGNvdW50ZXI7CisJbW1hcF9hcnJheVtucl9jcHVdW2NvdW50ZXJdLnByZXYgPSAwOworCW1tYXBfYXJyYXlbbnJfY3B1XVtjb3VudGVyXS5tYXNrID0gbW1hcF9wYWdlcypwYWdlX3NpemUgLSAxOworCW1tYXBfYXJyYXlbbnJfY3B1XVtjb3VudGVyXS5iYXNlID0gbW1hcChOVUxMLCAobW1hcF9wYWdlcysxKSpwYWdlX3NpemUsCisJCQlQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIGZkW25yX2NwdV1bY291bnRlcl0sIDApOworCWlmIChtbWFwX2FycmF5W25yX2NwdV1bY291bnRlcl0uYmFzZSA9PSBNQVBfRkFJTEVEKSB7CisJCWVycm9yKCJmYWlsZWQgdG8gbW1hcCB3aXRoICVkICglcylcbiIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KC0xKTsKKwl9CisKKwlpb2N0bChmZFtucl9jcHVdW2NvdW50ZXJdLCBQRVJGX0NPVU5URVJfSU9DX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIG9wZW5fY291bnRlcnMoaW50IGNwdSwgcGlkX3QgcGlkKQoreworCWludCBjb3VudGVyOworCisJaWYgKHBpZCA+IDApIHsKKwkJcGlkX3N5bnRoZXNpemVfY29tbV9ldmVudChwaWQsIDApOworCQlwaWRfc3ludGhlc2l6ZV9tbWFwX3NhbXBsZXMocGlkKTsKKwl9CisKKwlncm91cF9mZCA9IC0xOworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBucl9jb3VudGVyczsgY291bnRlcisrKQorCQljcmVhdGVfY291bnRlcihjb3VudGVyLCBjcHUsIHBpZCk7CisKKwlucl9jcHUrKzsKK30KKworc3RhdGljIGludCBfX2NtZF9yZWNvcmQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBpLCBjb3VudGVyOworCXN0cnVjdCBzdGF0IHN0OworCXBpZF90IHBpZDsKKwlpbnQgZmxhZ3M7CisJaW50IHJldDsKKworCXBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisJbnJfY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworCWFzc2VydChucl9jcHVzIDw9IE1BWF9OUl9DUFVTKTsKKwlhc3NlcnQobnJfY3B1cyA+PSAwKTsKKworCWlmICghc3RhdChvdXRwdXRfbmFtZSwgJnN0KSAmJiAhZm9yY2UgJiYgIWFwcGVuZF9maWxlKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3IsIG91dHB1dCBmaWxlICVzIGV4aXN0cywgdXNlIC1BIHRvIGFwcGVuZCBvciAtZiB0byBvdmVyd3JpdGUuXG4iLAorCQkJCW91dHB1dF9uYW1lKTsKKwkJZXhpdCgtMSk7CisJfQorCisJZmxhZ3MgPSBPX0NSRUFUfE9fUkRXUjsKKwlpZiAoYXBwZW5kX2ZpbGUpCisJCWZsYWdzIHw9IE9fQVBQRU5EOworCWVsc2UKKwkJZmxhZ3MgfD0gT19UUlVOQzsKKworCW91dHB1dCA9IG9wZW4ob3V0cHV0X25hbWUsIGZsYWdzLCBTX0lSVVNSfFNfSVdVU1IpOworCWlmIChvdXRwdXQgPCAwKSB7CisJCXBlcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgZmlsZSIpOworCQlleGl0KC0xKTsKKwl9CisKKwlpZiAoIXN5c3RlbV93aWRlKSB7CisJCW9wZW5fY291bnRlcnMoLTEsIHRhcmdldF9waWQgIT0gLTEgPyB0YXJnZXRfcGlkIDogZ2V0cGlkKCkpOworCX0gZWxzZSBmb3IgKGkgPSAwOyBpIDwgbnJfY3B1czsgaSsrKQorCQlvcGVuX2NvdW50ZXJzKGksIHRhcmdldF9waWQpOworCisJYXRleGl0KHNpZ19hdGV4aXQpOworCXNpZ25hbChTSUdDSExELCBzaWdfaGFuZGxlcik7CisJc2lnbmFsKFNJR0lOVCwgc2lnX2hhbmRsZXIpOworCisJaWYgKHRhcmdldF9waWQgPT0gLTEgJiYgYXJnYykgeworCQlwaWQgPSBmb3JrKCk7CisJCWlmIChwaWQgPCAwKQorCQkJcGVycm9yKCJmYWlsZWQgdG8gZm9yayIpOworCisJCWlmICghcGlkKSB7CisJCQlpZiAoZXhlY3ZwKGFyZ3ZbMF0sIChjaGFyICoqKWFyZ3YpKSB7CisJCQkJcGVycm9yKGFyZ3ZbMF0pOworCQkJCWV4aXQoLTEpOworCQkJfQorCQl9CisJfQorCisJaWYgKHJlYWx0aW1lX3ByaW8pIHsKKwkJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOworCisJCXBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcmVhbHRpbWVfcHJpbzsKKwkJaWYgKHNjaGVkX3NldHNjaGVkdWxlcigwLCBTQ0hFRF9GSUZPLCAmcGFyYW0pKSB7CisJCQlwcmludGYoIkNvdWxkIG5vdCBzZXQgcmVhbHRpbWUgcHJpb3JpdHkuXG4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJfQorCisJaWYgKHN5c3RlbV93aWRlKQorCQlzeW50aGVzaXplX3NhbXBsZXMoKTsKKworCXdoaWxlICghZG9uZSkgeworCQlpbnQgaGl0cyA9IHNhbXBsZXM7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2NwdTsgaSsrKSB7CisJCQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykKKwkJCQltbWFwX3JlYWQoJm1tYXBfYXJyYXlbaV1bY291bnRlcl0pOworCQl9CisKKwkJaWYgKGhpdHMgPT0gc2FtcGxlcykKKwkJCXJldCA9IHBvbGwoZXZlbnRfYXJyYXksIG5yX3BvbGwsIDEwMCk7CisJfQorCisJLyoKKwkgKiBBcHByb3hpbWF0ZSBSSVAgZXZlbnQgc2l6ZTogMjQgYnl0ZXMuCisJICovCisJZnByaW50ZihzdGRlcnIsCisJCSJbIHBlcmYgcmVjb3JkOiBDYXB0dXJlZCBhbmQgd3JvdGUgJS4zZiBNQiAlcyAofiVsbGQgc2FtcGxlcykgXVxuIiwKKwkJKGRvdWJsZSlieXRlc193cml0dGVuIC8gMTAyNC4wIC8gMTAyNC4wLAorCQlvdXRwdXRfbmFtZSwKKwkJYnl0ZXNfd3JpdHRlbiAvIDI0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJlY29yZF91c2FnZVtdID0geworCSJwZXJmIHJlY29yZCBbPG9wdGlvbnM+XSBbPGNvbW1hbmQ+XSIsCisJInBlcmYgcmVjb3JkIFs8b3B0aW9ucz5dIC0tIDxjb21tYW5kPiBbPG9wdGlvbnM+XSIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworCU9QVF9DQUxMQkFDSygnZScsICJldmVudCIsIE5VTEwsICJldmVudCIsCisJCSAgICAgImV2ZW50IHNlbGVjdG9yLiB1c2UgJ3BlcmYgbGlzdCcgdG8gbGlzdCBhdmFpbGFibGUgZXZlbnRzIiwKKwkJICAgICBwYXJzZV9ldmVudHMpLAorCU9QVF9JTlRFR0VSKCdwJywgInBpZCIsICZ0YXJnZXRfcGlkLAorCQkgICAgInJlY29yZCBldmVudHMgb24gZXhpc3RpbmcgcGlkIiksCisJT1BUX0lOVEVHRVIoJ3InLCAicmVhbHRpbWUiLCAmcmVhbHRpbWVfcHJpbywKKwkJICAgICJjb2xsZWN0IGRhdGEgd2l0aCB0aGlzIFJUIFNDSEVEX0ZJRk8gcHJpb3JpdHkiKSwKKwlPUFRfQk9PTEVBTignYScsICJhbGwtY3B1cyIsICZzeXN0ZW1fd2lkZSwKKwkJCSAgICAic3lzdGVtLXdpZGUgY29sbGVjdGlvbiBmcm9tIGFsbCBDUFVzIiksCisJT1BUX0JPT0xFQU4oJ0EnLCAiYXBwZW5kIiwgJmFwcGVuZF9maWxlLAorCQkJICAgICJhcHBlbmQgdG8gdGhlIG91dHB1dCBmaWxlIHRvIGRvIGluY3JlbWVudGFsIHByb2ZpbGluZyIpLAorCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmZvcmNlLAorCQkJIm92ZXJ3cml0ZSBleGlzdGluZyBkYXRhIGZpbGUiKSwKKwlPUFRfTE9ORygnYycsICJjb3VudCIsICZkZWZhdWx0X2ludGVydmFsLAorCQkgICAgImV2ZW50IHBlcmlvZCB0byBzYW1wbGUiKSwKKwlPUFRfU1RSSU5HKCdvJywgIm91dHB1dCIsICZvdXRwdXRfbmFtZSwgImZpbGUiLAorCQkgICAgIm91dHB1dCBmaWxlIG5hbWUiKSwKKwlPUFRfQk9PTEVBTignaScsICJpbmhlcml0IiwgJmluaGVyaXQsCisJCSAgICAiY2hpbGQgdGFza3MgaW5oZXJpdCBjb3VudGVycyIpLAorCU9QVF9JTlRFR0VSKCdGJywgImZyZXEiLCAmZnJlcSwKKwkJICAgICJwcm9maWxlIGF0IHRoaXMgZnJlcXVlbmN5IiksCisJT1BUX0lOVEVHRVIoJ20nLCAibW1hcC1wYWdlcyIsICZtbWFwX3BhZ2VzLAorCQkgICAgIm51bWJlciBvZiBtbWFwIGRhdGEgcGFnZXMiKSwKKwlPUFRfQk9PTEVBTigndicsICJ2ZXJib3NlIiwgJnZlcmJvc2UsCisJCSAgICAiYmUgbW9yZSB2ZXJib3NlIChzaG93IGNvdW50ZXIgb3BlbiBlcnJvcnMsIGV0YykiKSwKKwlPUFRfRU5EKCkKK307CisKK2ludCBjbWRfcmVjb3JkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCWludCBjb3VudGVyOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgcmVjb3JkX3VzYWdlLCAwKTsKKwlpZiAoIWFyZ2MgJiYgdGFyZ2V0X3BpZCA9PSAtMSAmJiAhc3lzdGVtX3dpZGUpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhyZWNvcmRfdXNhZ2UsIG9wdGlvbnMpOworCisJaWYgKCFucl9jb3VudGVycykKKwkJbnJfY291bnRlcnMgPSAxOworCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IG5yX2NvdW50ZXJzOyBjb3VudGVyKyspIHsKKwkJaWYgKGF0dHJzW2NvdW50ZXJdLnNhbXBsZV9wZXJpb2QpCisJCQljb250aW51ZTsKKworCQlhdHRyc1tjb3VudGVyXS5zYW1wbGVfcGVyaW9kID0gZGVmYXVsdF9pbnRlcnZhbDsKKwl9CisKKwlyZXR1cm4gX19jbWRfcmVjb3JkKGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmE5M2IKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKQEAgLTAsMCArMSwxMzE2IEBACisvKgorICogYnVpbHRpbi1yZXBvcnQuYworICoKKyAqIEJ1aWx0aW4gcmVwb3J0IGNvbW1hbmQ6IEFuYWx5emUgdGhlIHBlcmYuZGF0YSBpbnB1dCBmaWxlLAorICogbG9vayB1cCBhbmQgcmVhZCBEU09zIGFuZCBzeW1ib2wgaW5mb3JtYXRpb24gYW5kIGRpc3BsYXkKKyAqIGEgaGlzdG9ncmFtIG9mIHJlc3VsdHMsIGFsb25nIHZhcmlvdXMgc29ydGluZyBrZXlzLgorICovCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjaW5jbHVkZSAidXRpbC91dGlsLmgiCisKKyNpbmNsdWRlICJ1dGlsL2NvbG9yLmgiCisjaW5jbHVkZSAidXRpbC9saXN0LmgiCisjaW5jbHVkZSAidXRpbC9jYWNoZS5oIgorI2luY2x1ZGUgInV0aWwvcmJ0cmVlLmgiCisjaW5jbHVkZSAidXRpbC9zeW1ib2wuaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZy5oIgorCisjaW5jbHVkZSAicGVyZi5oIgorCisjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAidXRpbC9wYXJzZS1ldmVudHMuaCIKKworI2RlZmluZSBTSE9XX0tFUk5FTAkxCisjZGVmaW5lIFNIT1dfVVNFUgkyCisjZGVmaW5lIFNIT1dfSFYJCTQKKworc3RhdGljIGNoYXIJCWNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CitzdGF0aWMgY2hhcgkJKnZtbGludXggPSBOVUxMOworCitzdGF0aWMgY2hhcgkJZGVmYXVsdF9zb3J0X29yZGVyW10gPSAiY29tbSxkc28iOworc3RhdGljIGNoYXIJCSpzb3J0X29yZGVyID0gZGVmYXVsdF9zb3J0X29yZGVyOworCitzdGF0aWMgaW50CQlpbnB1dDsKK3N0YXRpYyBpbnQJCXNob3dfbWFzayA9IFNIT1dfS0VSTkVMIHwgU0hPV19VU0VSIHwgU0hPV19IVjsKKworc3RhdGljIGludAkJZHVtcF90cmFjZSA9IDA7CisjZGVmaW5lIGRwcmludGYoeC4uLikJZG8geyBpZiAoZHVtcF90cmFjZSkgcHJpbnRmKHgpOyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50CQl2ZXJib3NlOworc3RhdGljIGludAkJZnVsbF9wYXRoczsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcJcGFnZV9zaXplOworc3RhdGljIHVuc2lnbmVkIGxvbmcJbW1hcF93aW5kb3cgPSAzMjsKKworc3RydWN0IGlwX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCV9fdTY0IGlwOworCV9fdTMyIHBpZCwgdGlkOworCV9fdTY0IHBlcmlvZDsKK307CisKK3N0cnVjdCBtbWFwX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCV9fdTMyIHBpZCwgdGlkOworCV9fdTY0IHN0YXJ0OworCV9fdTY0IGxlbjsKKwlfX3U2NCBwZ29mZjsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKK307CisKK3N0cnVjdCBjb21tX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCV9fdTMyIHBpZCwgdGlkOworCWNoYXIgY29tbVsxNl07Cit9OworCitzdHJ1Y3QgZm9ya19ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwlfX3UzMiBwaWQsIHBwaWQ7Cit9OworCitzdHJ1Y3QgcGVyaW9kX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCV9fdTY0IHRpbWU7CisJX191NjQgaWQ7CisJX191NjQgc2FtcGxlX3BlcmlvZDsKK307CisKK3R5cGVkZWYgdW5pb24gZXZlbnRfdW5pb24geworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJc3RydWN0IGlwX2V2ZW50CQkJaXA7CisJc3RydWN0IG1tYXBfZXZlbnQJCW1tYXA7CisJc3RydWN0IGNvbW1fZXZlbnQJCWNvbW07CisJc3RydWN0IGZvcmtfZXZlbnQJCWZvcms7CisJc3RydWN0IHBlcmlvZF9ldmVudAkJcGVyaW9kOworfSBldmVudF90OworCitzdGF0aWMgTElTVF9IRUFEKGRzb3MpOworc3RhdGljIHN0cnVjdCBkc28gKmtlcm5lbF9kc287CitzdGF0aWMgc3RydWN0IGRzbyAqdmRzbzsKKworc3RhdGljIHZvaWQgZHNvc19fYWRkKHN0cnVjdCBkc28gKmRzbykKK3sKKwlsaXN0X2FkZF90YWlsKCZkc28tPm5vZGUsICZkc29zKTsKK30KKworc3RhdGljIHN0cnVjdCBkc28gKmRzb3NfX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHNvICpwb3M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmRzb3MsIG5vZGUpCisJCWlmIChzdHJjbXAocG9zLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIHBvczsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkc28gKmRzb3NfX2ZpbmRuZXcoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZHNvICpkc28gPSBkc29zX19maW5kKG5hbWUpOworCWludCBucjsKKworCWlmIChkc28pCisJCXJldHVybiBkc287CisKKwlkc28gPSBkc29fX25ldyhuYW1lLCAwKTsKKwlpZiAoIWRzbykKKwkJZ290byBvdXRfZGVsZXRlX2RzbzsKKworCW5yID0gZHNvX19sb2FkKGRzbywgTlVMTCwgdmVyYm9zZSk7CisJaWYgKG5yIDwgMCkgeworCQlpZiAodmVyYm9zZSkKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW46ICVzXG4iLCBuYW1lKTsKKwkJZ290byBvdXRfZGVsZXRlX2RzbzsKKwl9CisJaWYgKCFuciAmJiB2ZXJib3NlKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkiTm8gc3ltYm9scyBmb3VuZCBpbjogJXMsIG1heWJlIGluc3RhbGwgYSBkZWJ1ZyBwYWNrYWdlP1xuIiwKKwkJCQluYW1lKTsKKwl9CisKKwlkc29zX19hZGQoZHNvKTsKKworCXJldHVybiBkc287CisKK291dF9kZWxldGVfZHNvOgorCWRzb19fZGVsZXRlKGRzbyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGRzb3NfX2ZwcmludGYoRklMRSAqZnApCit7CisJc3RydWN0IGRzbyAqcG9zOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZkc29zLCBub2RlKQorCQlkc29fX2ZwcmludGYocG9zLCBmcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICp2ZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpkc28sIF9fdTY0IGlwKQoreworCXJldHVybiBkc29fX2ZpbmRfc3ltYm9sKGtlcm5lbF9kc28sIGlwKTsKK30KKworc3RhdGljIGludCBsb2FkX2tlcm5lbCh2b2lkKQoreworCWludCBlcnI7CisKKwlrZXJuZWxfZHNvID0gZHNvX19uZXcoIltrZXJuZWxdIiwgMCk7CisJaWYgKCFrZXJuZWxfZHNvKQorCQlyZXR1cm4gLTE7CisKKwllcnIgPSBkc29fX2xvYWRfa2VybmVsKGtlcm5lbF9kc28sIHZtbGludXgsIE5VTEwsIHZlcmJvc2UpOworCWlmIChlcnIpIHsKKwkJZHNvX19kZWxldGUoa2VybmVsX2Rzbyk7CisJCWtlcm5lbF9kc28gPSBOVUxMOworCX0gZWxzZQorCQlkc29zX19hZGQoa2VybmVsX2Rzbyk7CisKKwl2ZHNvID0gZHNvX19uZXcoIlt2ZHNvXSIsIDApOworCWlmICghdmRzbykKKwkJcmV0dXJuIC0xOworCisJdmRzby0+ZmluZF9zeW1ib2wgPSB2ZHNvX19maW5kX3N5bWJvbDsKKworCWRzb3NfX2FkZCh2ZHNvKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjaGFyIF9fY3dkW1BBVEhfTUFYXTsKK3N0YXRpYyBjaGFyICpjd2QgPSBfX2N3ZDsKK3N0YXRpYyBpbnQgY3dkbGVuOworCitzdGF0aWMgaW50IHN0cmNvbW1vbihjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwlpbnQgbiA9IDA7CisKKwl3aGlsZSAocGF0aG5hbWVbbl0gPT0gY3dkW25dICYmIG4gPCBjd2RsZW4pCisJCSsrbjsKKworCXJldHVybiBuOworfQorCitzdHJ1Y3QgbWFwIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJX191NjQJIHN0YXJ0OworCV9fdTY0CSBlbmQ7CisJX191NjQJIHBnb2ZmOworCV9fdTY0CSAoKm1hcF9pcCkoc3RydWN0IG1hcCAqLCBfX3U2NCk7CisJc3RydWN0IGRzbwkgKmRzbzsKK307CisKK3N0YXRpYyBfX3U2NCBtYXBfX21hcF9pcChzdHJ1Y3QgbWFwICptYXAsIF9fdTY0IGlwKQoreworCXJldHVybiBpcCAtIG1hcC0+c3RhcnQgKyBtYXAtPnBnb2ZmOworfQorCitzdGF0aWMgX191NjQgdmRzb19fbWFwX2lwKHN0cnVjdCBtYXAgKm1hcCwgX191NjQgaXApCit7CisJcmV0dXJuIGlwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19hbm9uX21lbW9yeShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICAgcmV0dXJuIHN0cmNtcChmaWxlbmFtZSwgIi8vYW5vbiIpID09IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwICptYXBfX25ldyhzdHJ1Y3QgbW1hcF9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IG1hcCAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKKworCWlmIChzZWxmICE9IE5VTEwpIHsKKwkJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBldmVudC0+ZmlsZW5hbWU7CisJCWNoYXIgbmV3ZmlsZW5hbWVbUEFUSF9NQVhdOworCQlpbnQgYW5vbjsKKworCQlpZiAoY3dkKSB7CisJCQlpbnQgbiA9IHN0cmNvbW1vbihmaWxlbmFtZSk7CisKKwkJCWlmIChuID09IGN3ZGxlbikgeworCQkJCXNucHJpbnRmKG5ld2ZpbGVuYW1lLCBzaXplb2YobmV3ZmlsZW5hbWUpLAorCQkJCQkgIi4lcyIsIGZpbGVuYW1lICsgbik7CisJCQkJZmlsZW5hbWUgPSBuZXdmaWxlbmFtZTsKKwkJCX0KKwkJfQorCisJCWFub24gPSBpc19hbm9uX21lbW9yeShmaWxlbmFtZSk7CisKKwkJaWYgKGFub24pIHsKKwkJCXNucHJpbnRmKG5ld2ZpbGVuYW1lLCBzaXplb2YobmV3ZmlsZW5hbWUpLCAiL3RtcC9wZXJmLSVkLm1hcCIsIGV2ZW50LT5waWQpOworCQkJZmlsZW5hbWUgPSBuZXdmaWxlbmFtZTsKKwkJfQorCisJCXNlbGYtPnN0YXJ0ID0gZXZlbnQtPnN0YXJ0OworCQlzZWxmLT5lbmQgICA9IGV2ZW50LT5zdGFydCArIGV2ZW50LT5sZW47CisJCXNlbGYtPnBnb2ZmID0gZXZlbnQtPnBnb2ZmOworCisJCXNlbGYtPmRzbyA9IGRzb3NfX2ZpbmRuZXcoZmlsZW5hbWUpOworCQlpZiAoc2VsZi0+ZHNvID09IE5VTEwpCisJCQlnb3RvIG91dF9kZWxldGU7CisKKwkJaWYgKHNlbGYtPmRzbyA9PSB2ZHNvIHx8IGFub24pCisJCQlzZWxmLT5tYXBfaXAgPSB2ZHNvX19tYXBfaXA7CisJCWVsc2UKKwkJCXNlbGYtPm1hcF9pcCA9IG1hcF9fbWFwX2lwOworCX0KKwlyZXR1cm4gc2VsZjsKK291dF9kZWxldGU6CisJZnJlZShzZWxmKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtYXAgKm1hcF9fY2xvbmUoc3RydWN0IG1hcCAqc2VsZikKK3sKKwlzdHJ1Y3QgbWFwICptYXAgPSBtYWxsb2Moc2l6ZW9mKCpzZWxmKSk7CisKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkobWFwLCBzZWxmLCBzaXplb2YoKnNlbGYpKTsKKworCXJldHVybiBtYXA7Cit9CisKK3N0YXRpYyBpbnQgbWFwX19vdmVybGFwKHN0cnVjdCBtYXAgKmwsIHN0cnVjdCBtYXAgKnIpCit7CisJaWYgKGwtPnN0YXJ0ID4gci0+c3RhcnQpIHsKKwkJc3RydWN0IG1hcCAqdCA9IGw7CisJCWwgPSByOworCQlyID0gdDsKKwl9CisKKwlpZiAobC0+ZW5kID4gci0+c3RhcnQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzaXplX3QgbWFwX19mcHJpbnRmKHN0cnVjdCBtYXAgKnNlbGYsIEZJTEUgKmZwKQoreworCXJldHVybiBmcHJpbnRmKGZwLCAiICVMeC0lTHggJUx4ICVzXG4iLAorCQkgICAgICAgc2VsZi0+c3RhcnQsIHNlbGYtPmVuZCwgc2VsZi0+cGdvZmYsIHNlbGYtPmRzby0+bmFtZSk7Cit9CisKKworc3RydWN0IHRocmVhZCB7CisJc3RydWN0IHJiX25vZGUJIHJiX25vZGU7CisJc3RydWN0IGxpc3RfaGVhZCBtYXBzOworCXBpZF90CQkgcGlkOworCWNoYXIJCSAqY29tbTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGhyZWFkICp0aHJlYWRfX25ldyhwaWRfdCBwaWQpCit7CisJc3RydWN0IHRocmVhZCAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKKworCWlmIChzZWxmICE9IE5VTEwpIHsKKwkJc2VsZi0+cGlkID0gcGlkOworCQlzZWxmLT5jb21tID0gbWFsbG9jKDMyKTsKKwkJaWYgKHNlbGYtPmNvbW0pCisJCQlzbnByaW50ZihzZWxmLT5jb21tLCAzMiwgIjolZCIsIHNlbGYtPnBpZCk7CisJCUlOSVRfTElTVF9IRUFEKCZzZWxmLT5tYXBzKTsKKwl9CisKKwlyZXR1cm4gc2VsZjsKK30KKworc3RhdGljIGludCB0aHJlYWRfX3NldF9jb21tKHN0cnVjdCB0aHJlYWQgKnNlbGYsIGNvbnN0IGNoYXIgKmNvbW0pCit7CisJaWYgKHNlbGYtPmNvbW0pCisJCWZyZWUoc2VsZi0+Y29tbSk7CisJc2VsZi0+Y29tbSA9IHN0cmR1cChjb21tKTsKKwlyZXR1cm4gc2VsZi0+Y29tbSA/IDAgOiAtRU5PTUVNOworfQorCitzdGF0aWMgc2l6ZV90IHRocmVhZF9fZnByaW50ZihzdHJ1Y3QgdGhyZWFkICpzZWxmLCBGSUxFICpmcCkKK3sKKwlzdHJ1Y3QgbWFwICpwb3M7CisJc2l6ZV90IHJldCA9IGZwcmludGYoZnAsICJUaHJlYWQgJWQgJXNcbiIsIHNlbGYtPnBpZCwgc2VsZi0+Y29tbSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnNlbGYtPm1hcHMsIG5vZGUpCisJCXJldCArPSBtYXBfX2ZwcmludGYocG9zLCBmcCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdCB0aHJlYWRzOworc3RhdGljIHN0cnVjdCB0aHJlYWQgKmxhc3RfbWF0Y2g7CisKK3N0YXRpYyBzdHJ1Y3QgdGhyZWFkICp0aHJlYWRzX19maW5kbmV3KHBpZF90IHBpZCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmdGhyZWFkcy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCB0aHJlYWQgKnRoOworCisJLyoKKwkgKiBGb250LWVuZCBjYWNoZSAtIFBJRCBsb29rdXBzIGNvbWUgaW4gYmxvY2tzLAorCSAqIHNvIG1vc3Qgb2YgdGhlIHRpbWUgd2UgZG9udCBoYXZlIHRvIGxvb2sgdXAKKwkgKiB0aGUgZnVsbCByYnRyZWU6CisJICovCisJaWYgKGxhc3RfbWF0Y2ggJiYgbGFzdF9tYXRjaC0+cGlkID09IHBpZCkKKwkJcmV0dXJuIGxhc3RfbWF0Y2g7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJdGggPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCB0aHJlYWQsIHJiX25vZGUpOworCisJCWlmICh0aC0+cGlkID09IHBpZCkgeworCQkJbGFzdF9tYXRjaCA9IHRoOworCQkJcmV0dXJuIHRoOworCQl9CisKKwkJaWYgKHBpZCA8IHRoLT5waWQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJdGggPSB0aHJlYWRfX25ldyhwaWQpOworCWlmICh0aCAhPSBOVUxMKSB7CisJCXJiX2xpbmtfbm9kZSgmdGgtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJCXJiX2luc2VydF9jb2xvcigmdGgtPnJiX25vZGUsICZ0aHJlYWRzKTsKKwkJbGFzdF9tYXRjaCA9IHRoOworCX0KKworCXJldHVybiB0aDsKK30KKworc3RhdGljIHZvaWQgdGhyZWFkX19pbnNlcnRfbWFwKHN0cnVjdCB0aHJlYWQgKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCkKK3sKKwlzdHJ1Y3QgbWFwICpwb3MsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9zLCB0bXAsICZzZWxmLT5tYXBzLCBub2RlKSB7CisJCWlmIChtYXBfX292ZXJsYXAocG9zLCBtYXApKSB7CisJCQlsaXN0X2RlbF9pbml0KCZwb3MtPm5vZGUpOworCQkJLyogWFhYIGxlYWtzIGRzb3MgKi8KKwkJCWZyZWUocG9zKTsKKwkJfQorCX0KKworCWxpc3RfYWRkX3RhaWwoJm1hcC0+bm9kZSwgJnNlbGYtPm1hcHMpOworfQorCitzdGF0aWMgaW50IHRocmVhZF9fZm9yayhzdHJ1Y3QgdGhyZWFkICpzZWxmLCBzdHJ1Y3QgdGhyZWFkICpwYXJlbnQpCit7CisJc3RydWN0IG1hcCAqbWFwOworCisJaWYgKHNlbGYtPmNvbW0pCisJCWZyZWUoc2VsZi0+Y29tbSk7CisJc2VsZi0+Y29tbSA9IHN0cmR1cChwYXJlbnQtPmNvbW0pOworCWlmICghc2VsZi0+Y29tbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1hcCwgJnBhcmVudC0+bWFwcywgbm9kZSkgeworCQlzdHJ1Y3QgbWFwICpuZXcgPSBtYXBfX2Nsb25lKG1hcCk7CisJCWlmICghbmV3KQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXRocmVhZF9faW5zZXJ0X21hcChzZWxmLCBuZXcpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1hcCAqdGhyZWFkX19maW5kX21hcChzdHJ1Y3QgdGhyZWFkICpzZWxmLCBfX3U2NCBpcCkKK3sKKwlzdHJ1Y3QgbWFwICpwb3M7CisKKwlpZiAoc2VsZiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmc2VsZi0+bWFwcywgbm9kZSkKKwkJaWYgKGlwID49IHBvcy0+c3RhcnQgJiYgaXAgPD0gcG9zLT5lbmQpCisJCQlyZXR1cm4gcG9zOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzaXplX3QgdGhyZWFkc19fZnByaW50ZihGSUxFICpmcCkKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisKKwlmb3IgKG5kID0gcmJfZmlyc3QoJnRocmVhZHMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlzdHJ1Y3QgdGhyZWFkICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IHRocmVhZCwgcmJfbm9kZSk7CisKKwkJcmV0ICs9IHRocmVhZF9fZnByaW50Zihwb3MsIGZwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogaGlzdG9ncmFtLCBzb3J0ZWQgb24gaXRlbSwgY29sbGVjdHMgY291bnRzCisgKi8KKworc3RhdGljIHN0cnVjdCByYl9yb290IGhpc3Q7CisKK3N0cnVjdCBoaXN0X2VudHJ5IHsKKwlzdHJ1Y3QgcmJfbm9kZQkgcmJfbm9kZTsKKworCXN0cnVjdCB0aHJlYWQJICp0aHJlYWQ7CisJc3RydWN0IG1hcAkgKm1hcDsKKwlzdHJ1Y3QgZHNvCSAqZHNvOworCXN0cnVjdCBzeW1ib2wJICpzeW07CisJX191NjQJCSBpcDsKKwljaGFyCQkgbGV2ZWw7CisKKwlfX3U2NAkJIGNvdW50OworfTsKKworLyoKKyAqIGNvbmZpZ3VyYWJsZSBzb3J0aW5nIGJpdHMKKyAqLworCitzdHJ1Y3Qgc29ydF9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJY2hhciAqaGVhZGVyOworCisJaW50NjRfdCAoKmNtcCkoc3RydWN0IGhpc3RfZW50cnkgKiwgc3RydWN0IGhpc3RfZW50cnkgKik7CisJaW50NjRfdCAoKmNvbGxhcHNlKShzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKKwlzaXplX3QJKCpwcmludCkoRklMRSAqZnAsIHN0cnVjdCBoaXN0X2VudHJ5ICopOworfTsKKworLyogLS1zb3J0IHBpZCAqLworCitzdGF0aWMgaW50NjRfdAorc29ydF9fdGhyZWFkX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCXJldHVybiByaWdodC0+dGhyZWFkLT5waWQgLSBsZWZ0LT50aHJlYWQtPnBpZDsKK30KKworc3RhdGljIHNpemVfdAorc29ydF9fdGhyZWFkX3ByaW50KEZJTEUgKmZwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZikKK3sKKwlyZXR1cm4gZnByaW50ZihmcCwgIiUxNnM6JTVkIiwgc2VsZi0+dGhyZWFkLT5jb21tID86ICIiLCBzZWxmLT50aHJlYWQtPnBpZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X3RocmVhZCA9IHsKKwkuaGVhZGVyID0gIiAgICAgICAgIENvbW1hbmQ6ICBQaWQiLAorCS5jbXAJPSBzb3J0X190aHJlYWRfY21wLAorCS5wcmludAk9IHNvcnRfX3RocmVhZF9wcmludCwKK307CisKKy8qIC0tc29ydCBjb21tICovCisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X19jb21tX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCXJldHVybiByaWdodC0+dGhyZWFkLT5waWQgLSBsZWZ0LT50aHJlYWQtPnBpZDsKK30KKworc3RhdGljIGludDY0X3QKK3NvcnRfX2NvbW1fY29sbGFwc2Uoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwljaGFyICpjb21tX2wgPSBsZWZ0LT50aHJlYWQtPmNvbW07CisJY2hhciAqY29tbV9yID0gcmlnaHQtPnRocmVhZC0+Y29tbTsKKworCWlmICghY29tbV9sIHx8ICFjb21tX3IpIHsKKwkJaWYgKCFjb21tX2wgJiYgIWNvbW1fcikKKwkJCXJldHVybiAwOworCQllbHNlIGlmICghY29tbV9sKQorCQkJcmV0dXJuIC0xOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gc3RyY21wKGNvbW1fbCwgY29tbV9yKTsKK30KKworc3RhdGljIHNpemVfdAorc29ydF9fY29tbV9wcmludChGSUxFICpmcCwgc3RydWN0IGhpc3RfZW50cnkgKnNlbGYpCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIlMTZzIiwgc2VsZi0+dGhyZWFkLT5jb21tKTsKK30KKworc3RhdGljIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfY29tbSA9IHsKKwkuaGVhZGVyCQk9ICIgICAgICAgICBDb21tYW5kIiwKKwkuY21wCQk9IHNvcnRfX2NvbW1fY21wLAorCS5jb2xsYXBzZQk9IHNvcnRfX2NvbW1fY29sbGFwc2UsCisJLnByaW50CQk9IHNvcnRfX2NvbW1fcHJpbnQsCit9OworCisvKiAtLXNvcnQgZHNvICovCisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X19kc29fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJc3RydWN0IGRzbyAqZHNvX2wgPSBsZWZ0LT5kc287CisJc3RydWN0IGRzbyAqZHNvX3IgPSByaWdodC0+ZHNvOworCisJaWYgKCFkc29fbCB8fCAhZHNvX3IpIHsKKwkJaWYgKCFkc29fbCAmJiAhZHNvX3IpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoIWRzb19sKQorCQkJcmV0dXJuIC0xOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gc3RyY21wKGRzb19sLT5uYW1lLCBkc29fci0+bmFtZSk7Cit9CisKK3N0YXRpYyBzaXplX3QKK3NvcnRfX2Rzb19wcmludChGSUxFICpmcCwgc3RydWN0IGhpc3RfZW50cnkgKnNlbGYpCit7CisJaWYgKHNlbGYtPmRzbykKKwkJcmV0dXJuIGZwcmludGYoZnAsICIlLTI1cyIsIHNlbGYtPmRzby0+bmFtZSk7CisKKwlyZXR1cm4gZnByaW50ZihmcCwgIiUwMTZsbHggICAgICAgICAiLCAoX191NjQpc2VsZi0+aXApOworfQorCitzdGF0aWMgc3RydWN0IHNvcnRfZW50cnkgc29ydF9kc28gPSB7CisJLmhlYWRlciA9ICJTaGFyZWQgT2JqZWN0ICAgICAgICAgICAgIiwKKwkuY21wCT0gc29ydF9fZHNvX2NtcCwKKwkucHJpbnQJPSBzb3J0X19kc29fcHJpbnQsCit9OworCisvKiAtLXNvcnQgc3ltYm9sICovCisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X19zeW1fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJX191NjQgaXBfbCwgaXBfcjsKKworCWlmIChsZWZ0LT5zeW0gPT0gcmlnaHQtPnN5bSkKKwkJcmV0dXJuIDA7CisKKwlpcF9sID0gbGVmdC0+c3ltID8gbGVmdC0+c3ltLT5zdGFydCA6IGxlZnQtPmlwOworCWlwX3IgPSByaWdodC0+c3ltID8gcmlnaHQtPnN5bS0+c3RhcnQgOiByaWdodC0+aXA7CisKKwlyZXR1cm4gKGludDY0X3QpKGlwX3IgLSBpcF9sKTsKK30KKworc3RhdGljIHNpemVfdAorc29ydF9fc3ltX3ByaW50KEZJTEUgKmZwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZikKK3sKKwlzaXplX3QgcmV0ID0gMDsKKworCWlmICh2ZXJib3NlKQorCQlyZXQgKz0gZnByaW50ZihmcCwgIiUjMDE4bGx4ICAiLCAoX191NjQpc2VsZi0+aXApOworCisJaWYgKHNlbGYtPnN5bSkgeworCQlyZXQgKz0gZnByaW50ZihmcCwgIlslY10gJXMiLAorCQkJc2VsZi0+ZHNvID09IGtlcm5lbF9kc28gPyAnaycgOiAnLicsIHNlbGYtPnN5bS0+bmFtZSk7CisJfSBlbHNlIHsKKwkJcmV0ICs9IGZwcmludGYoZnAsICIlIzAxNmxseCIsIChfX3U2NClzZWxmLT5pcCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3ltID0geworCS5oZWFkZXIgPSAiU3ltYm9sIiwKKwkuY21wCT0gc29ydF9fc3ltX2NtcCwKKwkucHJpbnQJPSBzb3J0X19zeW1fcHJpbnQsCit9OworCitzdGF0aWMgaW50IHNvcnRfX25lZWRfY29sbGFwc2UgPSAwOworCitzdHJ1Y3Qgc29ydF9kaW1lbnNpb24geworCWNoYXIJCQkqbmFtZTsKKwlzdHJ1Y3Qgc29ydF9lbnRyeQkqZW50cnk7CisJaW50CQkJdGFrZW47Cit9OworCitzdGF0aWMgc3RydWN0IHNvcnRfZGltZW5zaW9uIHNvcnRfZGltZW5zaW9uc1tdID0geworCXsgLm5hbWUgPSAicGlkIiwJLmVudHJ5ID0gJnNvcnRfdGhyZWFkLAl9LAorCXsgLm5hbWUgPSAiY29tbSIsCS5lbnRyeSA9ICZzb3J0X2NvbW0sCX0sCisJeyAubmFtZSA9ICJkc28iLAkuZW50cnkgPSAmc29ydF9kc28sCX0sCisJeyAubmFtZSA9ICJzeW1ib2wiLAkuZW50cnkgPSAmc29ydF9zeW0sCX0sCit9OworCitzdGF0aWMgTElTVF9IRUFEKGhpc3RfZW50cnlfX3NvcnRfbGlzdCk7CisKK3N0YXRpYyBpbnQgc29ydF9kaW1lbnNpb25fX2FkZChjaGFyICp0b2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzb3J0X2RpbWVuc2lvbnMpOyBpKyspIHsKKwkJc3RydWN0IHNvcnRfZGltZW5zaW9uICpzZCA9ICZzb3J0X2RpbWVuc2lvbnNbaV07CisKKwkJaWYgKHNkLT50YWtlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdHJuY2FzZWNtcCh0b2ssIHNkLT5uYW1lLCBzdHJsZW4odG9rKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoc2QtPmVudHJ5LT5jb2xsYXBzZSkKKwkJCXNvcnRfX25lZWRfY29sbGFwc2UgPSAxOworCisJCWxpc3RfYWRkX3RhaWwoJnNkLT5lbnRyeS0+bGlzdCwgJmhpc3RfZW50cnlfX3NvcnRfbGlzdCk7CisJCXNkLT50YWtlbiA9IDE7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FU1JDSDsKK30KKworc3RhdGljIGludDY0X3QKK2hpc3RfZW50cnlfX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCXN0cnVjdCBzb3J0X2VudHJ5ICpzZTsKKwlpbnQ2NF90IGNtcCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmaGlzdF9lbnRyeV9fc29ydF9saXN0LCBsaXN0KSB7CisJCWNtcCA9IHNlLT5jbXAobGVmdCwgcmlnaHQpOworCQlpZiAoY21wKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNtcDsKK30KKworc3RhdGljIGludDY0X3QKK2hpc3RfZW50cnlfX2NvbGxhcHNlKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJc3RydWN0IHNvcnRfZW50cnkgKnNlOworCWludDY0X3QgY21wID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2UsICZoaXN0X2VudHJ5X19zb3J0X2xpc3QsIGxpc3QpIHsKKwkJaW50NjRfdCAoKmYpKHN0cnVjdCBoaXN0X2VudHJ5ICosIHN0cnVjdCBoaXN0X2VudHJ5ICopOworCisJCWYgPSBzZS0+Y29sbGFwc2UgPzogc2UtPmNtcDsKKworCQljbXAgPSBmKGxlZnQsIHJpZ2h0KTsKKwkJaWYgKGNtcCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBjbXA7Cit9CisKK3N0YXRpYyBzaXplX3QKK2hpc3RfZW50cnlfX2ZwcmludGYoRklMRSAqZnAsIHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmLCBfX3U2NCB0b3RhbF9zYW1wbGVzKQoreworCXN0cnVjdCBzb3J0X2VudHJ5ICpzZTsKKwlzaXplX3QgcmV0OworCisJaWYgKHRvdGFsX3NhbXBsZXMpIHsKKwkJZG91YmxlIHBlcmNlbnQgPSBzZWxmLT5jb3VudCAqIDEwMC4wIC8gdG90YWxfc2FtcGxlczsKKwkJY2hhciAqY29sb3IgPSBQRVJGX0NPTE9SX05PUk1BTDsKKworCQkvKgorCQkgKiBXZSBjb2xvciBoaWdoLW92ZXJoZWFkIGVudHJpZXMgaW4gcmVkLCBtaWQtb3ZlcmhlYWQKKwkJICogZW50cmllcyBpbiBncmVlbiAtIGFuZCBrZWVwIHRoZSBsb3cgb3ZlcmhlYWQgcGxhY2VzCisJCSAqIG5vcm1hbDoKKwkJICovCisJCWlmIChwZXJjZW50ID49IDUuMCkgeworCQkJY29sb3IgPSBQRVJGX0NPTE9SX1JFRDsKKwkJfSBlbHNlIHsKKwkJCWlmIChwZXJjZW50ID49IDAuNSkKKwkJCQljb2xvciA9IFBFUkZfQ09MT1JfR1JFRU47CisJCX0KKworCQlyZXQgPSBjb2xvcl9mcHJpbnRmKGZwLCBjb2xvciwgIiAgICU2LjJmJSUiLAorCQkJCShzZWxmLT5jb3VudCAqIDEwMC4wKSAvIHRvdGFsX3NhbXBsZXMpOworCX0gZWxzZQorCQlyZXQgPSBmcHJpbnRmKGZwLCAiJTEyTGQgIiwgc2VsZi0+Y291bnQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZSwgJmhpc3RfZW50cnlfX3NvcnRfbGlzdCwgbGlzdCkgeworCQlmcHJpbnRmKGZwLCAiICAiKTsKKwkJcmV0ICs9IHNlLT5wcmludChmcCwgc2VsZik7CisJfQorCisJcmV0ICs9IGZwcmludGYoZnAsICJcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGNvbGxlY3QgaGlzdG9ncmFtIGNvdW50cworICovCisKK3N0YXRpYyBpbnQKK2hpc3RfZW50cnlfX2FkZChzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHN0cnVjdCBtYXAgKm1hcCwgc3RydWN0IGRzbyAqZHNvLAorCQlzdHJ1Y3Qgc3ltYm9sICpzeW0sIF9fdTY0IGlwLCBjaGFyIGxldmVsLCBfX3U2NCBjb3VudCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmaGlzdC5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSBlbnRyeSA9IHsKKwkJLnRocmVhZAk9IHRocmVhZCwKKwkJLm1hcAk9IG1hcCwKKwkJLmRzbwk9IGRzbywKKwkJLnN5bQk9IHN5bSwKKwkJLmlwCT0gaXAsCisJCS5sZXZlbAk9IGxldmVsLAorCQkuY291bnQJPSBjb3VudCwKKwl9OworCWludCBjbXA7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJaGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKworCQljbXAgPSBoaXN0X2VudHJ5X19jbXAoJmVudHJ5LCBoZSk7CisKKwkJaWYgKCFjbXApIHsKKwkJCWhlLT5jb3VudCArPSBjb3VudDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGNtcCA8IDApCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJaGUgPSBtYWxsb2Moc2l6ZW9mKCpoZSkpOworCWlmICghaGUpCisJCXJldHVybiAtRU5PTUVNOworCSpoZSA9IGVudHJ5OworCXJiX2xpbmtfbm9kZSgmaGUtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZoZS0+cmJfbm9kZSwgJmhpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhpc3RfZW50cnlfX2ZyZWUoc3RydWN0IGhpc3RfZW50cnkgKmhlKQoreworCWZyZWUoaGUpOworfQorCisvKgorICogY29sbGFwc2UgdGhlIGhpc3RvZ3JhbQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdCBjb2xsYXBzZV9oaXN0czsKKworc3RhdGljIHZvaWQgY29sbGFwc2VfX2luc2VydF9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmNvbGxhcHNlX2hpc3RzLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGhpc3RfZW50cnkgKml0ZXI7CisJaW50NjRfdCBjbXA7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJaXRlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCisJCWNtcCA9IGhpc3RfZW50cnlfX2NvbGxhcHNlKGl0ZXIsIGhlKTsKKworCQlpZiAoIWNtcCkgeworCQkJaXRlci0+Y291bnQgKz0gaGUtPmNvdW50OworCQkJaGlzdF9lbnRyeV9fZnJlZShoZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoY21wIDwgMCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwlyYl9saW5rX25vZGUoJmhlLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmaGUtPnJiX25vZGUsICZjb2xsYXBzZV9oaXN0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxhcHNlX19yZXNvcnQodm9pZCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqbjsKKworCWlmICghc29ydF9fbmVlZF9jb2xsYXBzZSkKKwkJcmV0dXJuOworCisJbmV4dCA9IHJiX2ZpcnN0KCZoaXN0KTsKKwl3aGlsZSAobmV4dCkgeworCQluID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCQluZXh0ID0gcmJfbmV4dCgmbi0+cmJfbm9kZSk7CisKKwkJcmJfZXJhc2UoJm4tPnJiX25vZGUsICZoaXN0KTsKKwkJY29sbGFwc2VfX2luc2VydF9lbnRyeShuKTsKKwl9Cit9CisKKy8qCisgKiByZXZlcnNlIHRoZSBtYXAsIHNvcnQgb24gY291bnQuCisgKi8KKworc3RhdGljIHN0cnVjdCByYl9yb290IG91dHB1dF9oaXN0czsKKworc3RhdGljIHZvaWQgb3V0cHV0X19pbnNlcnRfZW50cnkoc3RydWN0IGhpc3RfZW50cnkgKmhlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZvdXRwdXRfaGlzdHMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaXRlcjsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQlpdGVyID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisKKwkJaWYgKGhlLT5jb3VudCA+IGl0ZXItPmNvdW50KQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCX0KKworCXJiX2xpbmtfbm9kZSgmaGUtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZoZS0+cmJfbm9kZSwgJm91dHB1dF9oaXN0cyk7Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF9fcmVzb3J0KHZvaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5leHQ7CisJc3RydWN0IGhpc3RfZW50cnkgKm47CisJc3RydWN0IHJiX3Jvb3QgKnRyZWUgPSAmaGlzdDsKKworCWlmIChzb3J0X19uZWVkX2NvbGxhcHNlKQorCQl0cmVlID0gJmNvbGxhcHNlX2hpc3RzOworCisJbmV4dCA9IHJiX2ZpcnN0KHRyZWUpOworCisJd2hpbGUgKG5leHQpIHsKKwkJbiA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJbmV4dCA9IHJiX25leHQoJm4tPnJiX25vZGUpOworCisJCXJiX2VyYXNlKCZuLT5yYl9ub2RlLCB0cmVlKTsKKwkJb3V0cHV0X19pbnNlcnRfZW50cnkobik7CisJfQorfQorCitzdGF0aWMgc2l6ZV90IG91dHB1dF9fZnByaW50ZihGSUxFICpmcCwgX191NjQgdG90YWxfc2FtcGxlcykKK3sKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqcG9zOworCXN0cnVjdCBzb3J0X2VudHJ5ICpzZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisJc2l6ZV90IHJldCA9IDA7CisKKwlmcHJpbnRmKGZwLCAiXG4iKTsKKwlmcHJpbnRmKGZwLCAiI1xuIik7CisJZnByaW50ZihmcCwgIiMgKCVMZCBzYW1wbGVzKVxuIiwgKF9fdTY0KXRvdGFsX3NhbXBsZXMpOworCWZwcmludGYoZnAsICIjXG4iKTsKKworCWZwcmludGYoZnAsICIjIE92ZXJoZWFkIik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZSwgJmhpc3RfZW50cnlfX3NvcnRfbGlzdCwgbGlzdCkKKwkJZnByaW50ZihmcCwgIiAgJXMiLCBzZS0+aGVhZGVyKTsKKwlmcHJpbnRmKGZwLCAiXG4iKTsKKworCWZwcmludGYoZnAsICIjIC4uLi4uLi4uIik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZSwgJmhpc3RfZW50cnlfX3NvcnRfbGlzdCwgbGlzdCkgeworCQlpbnQgaTsKKworCQlmcHJpbnRmKGZwLCAiICAiKTsKKwkJZm9yIChpID0gMDsgaSA8IHN0cmxlbihzZS0+aGVhZGVyKTsgaSsrKQorCQkJZnByaW50ZihmcCwgIi4iKTsKKwl9CisJZnByaW50ZihmcCwgIlxuIik7CisKKwlmcHJpbnRmKGZwLCAiI1xuIik7CisKKwlmb3IgKG5kID0gcmJfZmlyc3QoJm91dHB1dF9oaXN0cyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisJCXJldCArPSBoaXN0X2VudHJ5X19mcHJpbnRmKGZwLCBwb3MsIHRvdGFsX3NhbXBsZXMpOworCX0KKworCWlmICghc3RyY21wKHNvcnRfb3JkZXIsIGRlZmF1bHRfc29ydF9vcmRlcikpIHsKKwkJZnByaW50ZihmcCwgIiNcbiIpOworCQlmcHJpbnRmKGZwLCAiIyAoRm9yIG1vcmUgZGV0YWlscywgdHJ5OiBwZXJmIHJlcG9ydCAtLXNvcnQgY29tbSxkc28sc3ltYm9sKVxuIik7CisJCWZwcmludGYoZnAsICIjXG4iKTsKKwl9CisJZnByaW50ZihmcCwgIlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByZWdpc3Rlcl9pZGxlX3RocmVhZCh2b2lkKQoreworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoMCk7CisKKwlpZiAodGhyZWFkID09IE5VTEwgfHwKKwkJCXRocmVhZF9fc2V0X2NvbW0odGhyZWFkLCAiW2lkbGVdIikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJwcm9ibGVtIGluc2VydGluZyBpZGxlIHRhc2suXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbCA9IDAsCisJCSAgICAgdG90YWxfbW1hcCA9IDAsCisJCSAgICAgdG90YWxfY29tbSA9IDAsCisJCSAgICAgdG90YWxfZm9yayA9IDAsCisJCSAgICAgdG90YWxfdW5rbm93biA9IDA7CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3Nfb3ZlcmZsb3dfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJY2hhciBsZXZlbDsKKwlpbnQgc2hvdyA9IDA7CisJc3RydWN0IGRzbyAqZHNvID0gTlVMTDsKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5pcC5waWQpOworCV9fdTY0IGlwID0gZXZlbnQtPmlwLmlwOworCV9fdTY0IHBlcmlvZCA9IDE7CisJc3RydWN0IG1hcCAqbWFwID0gTlVMTDsKKworCWlmIChldmVudC0+aGVhZGVyLnR5cGUgJiBQRVJGX1NBTVBMRV9QRVJJT0QpCisJCXBlcmlvZCA9IGV2ZW50LT5pcC5wZXJpb2Q7CisKKwlkcHJpbnRmKCIlcCBbJXBdOiBQRVJGX0VWRU5UIChJUCwgJWQpOiAlZDogJXAgcGVyaW9kOiAlTGRcbiIsCisJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkodm9pZCAqKShsb25nKShldmVudC0+aGVhZGVyLnNpemUpLAorCQlldmVudC0+aGVhZGVyLm1pc2MsCisJCWV2ZW50LT5pcC5waWQsCisJCSh2b2lkICopKGxvbmcpaXAsCisJCShsb25nIGxvbmcpcGVyaW9kKTsKKworCWRwcmludGYoIiAuLi4gdGhyZWFkOiAlczolZFxuIiwgdGhyZWFkLT5jb21tLCB0aHJlYWQtPnBpZCk7CisKKwlpZiAodGhyZWFkID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKKwkJCWV2ZW50LT5oZWFkZXIudHlwZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX0tFUk5FTCkgeworCQlzaG93ID0gU0hPV19LRVJORUw7CisJCWxldmVsID0gJ2snOworCisJCWRzbyA9IGtlcm5lbF9kc287CisKKwkJZHByaW50ZigiIC4uLi4uLiBkc286ICVzXG4iLCBkc28tPm5hbWUpOworCisJfSBlbHNlIGlmIChldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX0VWRU5UX01JU0NfVVNFUikgeworCisJCXNob3cgPSBTSE9XX1VTRVI7CisJCWxldmVsID0gJy4nOworCisJCW1hcCA9IHRocmVhZF9fZmluZF9tYXAodGhyZWFkLCBpcCk7CisJCWlmIChtYXAgIT0gTlVMTCkgeworCQkJaXAgPSBtYXAtPm1hcF9pcChtYXAsIGlwKTsKKwkJCWRzbyA9IG1hcC0+ZHNvOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIElmIHRoaXMgaXMgb3V0c2lkZSBvZiBhbGwga25vd24gbWFwcywKKwkJCSAqIGFuZCBpcyBhIG5lZ2F0aXZlIGFkZHJlc3MsIHRyeSB0byBsb29rIGl0CisJCQkgKiB1cCBpbiB0aGUga2VybmVsIGRzbywgYXMgaXQgbWlnaHQgYmUgYQorCQkJICogdnN5c2NhbGwgKHdoaWNoIGV4ZWN1dGVzIGluIHVzZXItbW9kZSk6CisJCQkgKi8KKwkJCWlmICgobG9uZyBsb25nKWlwIDwgMCkKKwkJCQlkc28gPSBrZXJuZWxfZHNvOworCQl9CisJCWRwcmludGYoIiAuLi4uLi4gZHNvOiAlc1xuIiwgZHNvID8gZHNvLT5uYW1lIDogIjxub3QgZm91bmQ+Iik7CisKKwl9IGVsc2UgeworCQlzaG93ID0gU0hPV19IVjsKKwkJbGV2ZWwgPSAnSCc7CisJCWRwcmludGYoIiAuLi4uLi4gZHNvOiBbaHlwZXJ2aXNvcl1cbiIpOworCX0KKworCWlmIChzaG93ICYgc2hvd19tYXNrKSB7CisJCXN0cnVjdCBzeW1ib2wgKnN5bSA9IE5VTEw7CisKKwkJaWYgKGRzbykKKwkJCXN5bSA9IGRzby0+ZmluZF9zeW1ib2woZHNvLCBpcCk7CisKKwkJaWYgKGhpc3RfZW50cnlfX2FkZCh0aHJlYWQsIG1hcCwgZHNvLCBzeW0sIGlwLCBsZXZlbCwgcGVyaW9kKSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCSJwcm9ibGVtIGluY3JlbWVudGluZyBzeW1ib2wgY291bnQsIHNraXBwaW5nIGV2ZW50XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwl0b3RhbCArPSBwZXJpb2Q7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19tbWFwX2V2ZW50KGV2ZW50X3QgKmV2ZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPm1tYXAucGlkKTsKKwlzdHJ1Y3QgbWFwICptYXAgPSBtYXBfX25ldygmZXZlbnQtPm1tYXApOworCisJZHByaW50ZigiJXAgWyVwXTogUEVSRl9FVkVOVF9NTUFQICVkOiBbJXAoJXApIEAgJXBdOiAlc1xuIiwKKwkJKHZvaWQgKikob2Zmc2V0ICsgaGVhZCksCisJCSh2b2lkICopKGxvbmcpKGV2ZW50LT5oZWFkZXIuc2l6ZSksCisJCWV2ZW50LT5tbWFwLnBpZCwKKwkJKHZvaWQgKikobG9uZylldmVudC0+bW1hcC5zdGFydCwKKwkJKHZvaWQgKikobG9uZylldmVudC0+bW1hcC5sZW4sCisJCSh2b2lkICopKGxvbmcpZXZlbnQtPm1tYXAucGdvZmYsCisJCWV2ZW50LT5tbWFwLmZpbGVuYW1lKTsKKworCWlmICh0aHJlYWQgPT0gTlVMTCB8fCBtYXAgPT0gTlVMTCkgeworCQlkcHJpbnRmKCJwcm9ibGVtIHByb2Nlc3NpbmcgUEVSRl9FVkVOVF9NTUFQLCBza2lwcGluZyBldmVudC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aHJlYWRfX2luc2VydF9tYXAodGhyZWFkLCBtYXApOworCXRvdGFsX21tYXArKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX2NvbW1fZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+Y29tbS5waWQpOworCisJZHByaW50ZigiJXAgWyVwXTogUEVSRl9FVkVOVF9DT01NOiAlczolZFxuIiwKKwkJKHZvaWQgKikob2Zmc2V0ICsgaGVhZCksCisJCSh2b2lkICopKGxvbmcpKGV2ZW50LT5oZWFkZXIuc2l6ZSksCisJCWV2ZW50LT5jb21tLmNvbW0sIGV2ZW50LT5jb21tLnBpZCk7CisKKwlpZiAodGhyZWFkID09IE5VTEwgfHwKKwkgICAgdGhyZWFkX19zZXRfY29tbSh0aHJlYWQsIGV2ZW50LT5jb21tLmNvbW0pKSB7CisJCWRwcmludGYoInByb2JsZW0gcHJvY2Vzc2luZyBQRVJGX0VWRU5UX0NPTU0sIHNraXBwaW5nIGV2ZW50LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJdG90YWxfY29tbSsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfZm9ya19ldmVudChldmVudF90ICpldmVudCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5mb3JrLnBpZCk7CisJc3RydWN0IHRocmVhZCAqcGFyZW50ID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+Zm9yay5wcGlkKTsKKworCWRwcmludGYoIiVwIFslcF06IFBFUkZfRVZFTlRfRk9SSzogJWQ6JWRcbiIsCisJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkodm9pZCAqKShsb25nKShldmVudC0+aGVhZGVyLnNpemUpLAorCQlldmVudC0+Zm9yay5waWQsIGV2ZW50LT5mb3JrLnBwaWQpOworCisJaWYgKCF0aHJlYWQgfHwgIXBhcmVudCB8fCB0aHJlYWRfX2ZvcmsodGhyZWFkLCBwYXJlbnQpKSB7CisJCWRwcmludGYoInByb2JsZW0gcHJvY2Vzc2luZyBQRVJGX0VWRU5UX0ZPUkssIHNraXBwaW5nIGV2ZW50LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJdG90YWxfZm9yaysrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfcGVyaW9kX2V2ZW50KGV2ZW50X3QgKmV2ZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCWRwcmludGYoIiVwIFslcF06IFBFUkZfRVZFTlRfUEVSSU9EOiB0aW1lOiVMZCwgaWQ6JUxkOiBwZXJpb2Q6JUxkXG4iLAorCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJZXZlbnQtPnBlcmlvZC50aW1lLAorCQlldmVudC0+cGVyaW9kLmlkLAorCQlldmVudC0+cGVyaW9kLnNhbXBsZV9wZXJpb2QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJaWYgKGV2ZW50LT5oZWFkZXIubWlzYyAmIFBFUkZfRVZFTlRfTUlTQ19PVkVSRkxPVykKKwkJcmV0dXJuIHByb2Nlc3Nfb3ZlcmZsb3dfZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCk7CisKKwlzd2l0Y2ggKGV2ZW50LT5oZWFkZXIudHlwZSkgeworCWNhc2UgUEVSRl9FVkVOVF9NTUFQOgorCQlyZXR1cm4gcHJvY2Vzc19tbWFwX2V2ZW50KGV2ZW50LCBvZmZzZXQsIGhlYWQpOworCisJY2FzZSBQRVJGX0VWRU5UX0NPTU06CisJCXJldHVybiBwcm9jZXNzX2NvbW1fZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCk7CisKKwljYXNlIFBFUkZfRVZFTlRfRk9SSzoKKwkJcmV0dXJuIHByb2Nlc3NfZm9ya19ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKTsKKworCWNhc2UgUEVSRl9FVkVOVF9QRVJJT0Q6CisJCXJldHVybiBwcm9jZXNzX3BlcmlvZF9ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKTsKKwkvKgorCSAqIFdlIGRvbnQgcHJvY2VzcyB0aGVtIHJpZ2h0IG5vdyBidXQgdGhleSBhcmUgZmluZToKKwkgKi8KKworCWNhc2UgUEVSRl9FVkVOVF9USFJPVFRMRToKKwljYXNlIFBFUkZfRVZFTlRfVU5USFJPVFRMRToKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19jbWRfcmVwb3J0KHZvaWQpCit7CisJaW50IHJldCwgcmMgPSBFWElUX0ZBSUxVUkU7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgaGVhZCA9IDA7CisJc3RydWN0IHN0YXQgc3RhdDsKKwlldmVudF90ICpldmVudDsKKwl1aW50MzJfdCBzaXplOworCWNoYXIgKmJ1ZjsKKworCXJlZ2lzdGVyX2lkbGVfdGhyZWFkKCk7CisKKwlpbnB1dCA9IG9wZW4oaW5wdXRfbmFtZSwgT19SRE9OTFkpOworCWlmIChpbnB1dCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIgZmFpbGVkIHRvIG9wZW4gZmlsZTogJXMiLCBpbnB1dF9uYW1lKTsKKwkJaWYgKCFzdHJjbXAoaW5wdXRfbmFtZSwgInBlcmYuZGF0YSIpKQorCQkJZnByaW50ZihzdGRlcnIsICIgICh0cnkgJ3BlcmYgcmVjb3JkJyBmaXJzdCkiKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlyZXQgPSBmc3RhdChpbnB1dCwgJnN0YXQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigiZmFpbGVkIHRvIHN0YXQgZmlsZSIpOworCQlleGl0KC0xKTsKKwl9CisKKwlpZiAoIXN0YXQuc3Rfc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInplcm8tc2l6ZWQgZmlsZSwgbm90aGluZyB0byBkbyFcbiIpOworCQlleGl0KDApOworCX0KKworCWlmIChsb2FkX2tlcm5lbCgpIDwgMCkgeworCQlwZXJyb3IoImZhaWxlZCB0byBsb2FkIGtlcm5lbCBzeW1ib2xzIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJaWYgKCFmdWxsX3BhdGhzKSB7CisJCWlmIChnZXRjd2QoX19jd2QsIHNpemVvZihfX2N3ZCkpID09IE5VTEwpIHsKKwkJCXBlcnJvcigiZmFpbGVkIHRvIGdldCB0aGUgY3VycmVudCBkaXJlY3RvcnkiKTsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwkJY3dkbGVuID0gc3RybGVuKGN3ZCk7CisJfSBlbHNlIHsKKwkJY3dkID0gTlVMTDsKKwkJY3dkbGVuID0gMDsKKwl9CityZW1hcDoKKwlidWYgPSAoY2hhciAqKW1tYXAoTlVMTCwgcGFnZV9zaXplICogbW1hcF93aW5kb3csIFBST1RfUkVBRCwKKwkJCSAgIE1BUF9TSEFSRUQsIGlucHV0LCBvZmZzZXQpOworCWlmIChidWYgPT0gTUFQX0ZBSUxFRCkgeworCQlwZXJyb3IoImZhaWxlZCB0byBtbWFwIGZpbGUiKTsKKwkJZXhpdCgtMSk7CisJfQorCittb3JlOgorCWV2ZW50ID0gKGV2ZW50X3QgKikoYnVmICsgaGVhZCk7CisKKwlzaXplID0gZXZlbnQtPmhlYWRlci5zaXplOworCWlmICghc2l6ZSkKKwkJc2l6ZSA9IDg7CisKKwlpZiAoaGVhZCArIGV2ZW50LT5oZWFkZXIuc2l6ZSA+PSBwYWdlX3NpemUgKiBtbWFwX3dpbmRvdykgeworCQl1bnNpZ25lZCBsb25nIHNoaWZ0ID0gcGFnZV9zaXplICogKGhlYWQgLyBwYWdlX3NpemUpOworCQlpbnQgcmV0OworCisJCXJldCA9IG11bm1hcChidWYsIHBhZ2Vfc2l6ZSAqIG1tYXBfd2luZG93KTsKKwkJYXNzZXJ0KHJldCA9PSAwKTsKKworCQlvZmZzZXQgKz0gc2hpZnQ7CisJCWhlYWQgLT0gc2hpZnQ7CisJCWdvdG8gcmVtYXA7CisJfQorCisJc2l6ZSA9IGV2ZW50LT5oZWFkZXIuc2l6ZTsKKworCWRwcmludGYoIiVwIFslcF06IGV2ZW50OiAlZFxuIiwKKwkJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkJKHZvaWQgKikobG9uZylldmVudC0+aGVhZGVyLnNpemUsCisJCQlldmVudC0+aGVhZGVyLnR5cGUpOworCisJaWYgKCFzaXplIHx8IHByb2Nlc3NfZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCkgPCAwKSB7CisKKwkJZHByaW50ZigiJXAgWyVwXTogc2tpcHBpbmcgdW5rbm93biBoZWFkZXIgdHlwZTogJWRcbiIsCisJCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJCSh2b2lkICopKGxvbmcpKGV2ZW50LT5oZWFkZXIuc2l6ZSksCisJCQlldmVudC0+aGVhZGVyLnR5cGUpOworCisJCXRvdGFsX3Vua25vd24rKzsKKworCQkvKgorCQkgKiBhc3N1bWUgd2UgbG9zdCB0cmFjayBvZiB0aGUgc3RyZWFtLCBjaGVjayBhbGlnbm1lbnQsIGFuZAorCQkgKiBpbmNyZW1lbnQgYSBzaW5nbGUgdTY0IGluIHRoZSBob3BlIHRvIGNhdGNoIG9uIGFnYWluICdzb29uJy4KKwkJICovCisKKwkJaWYgKHVubGlrZWx5KGhlYWQgJiA3KSkKKwkJCWhlYWQgJj0gfjdVTEw7CisKKwkJc2l6ZSA9IDg7CisJfQorCisJaGVhZCArPSBzaXplOworCisJaWYgKG9mZnNldCArIGhlYWQgPCBzdGF0LnN0X3NpemUpCisJCWdvdG8gbW9yZTsKKworCXJjID0gRVhJVF9TVUNDRVNTOworCWNsb3NlKGlucHV0KTsKKworCWRwcmludGYoIiAgICAgIElQIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsKTsKKwlkcHJpbnRmKCIgICAgbW1hcCBldmVudHM6ICUxMGxkXG4iLCB0b3RhbF9tbWFwKTsKKwlkcHJpbnRmKCIgICAgY29tbSBldmVudHM6ICUxMGxkXG4iLCB0b3RhbF9jb21tKTsKKwlkcHJpbnRmKCIgICAgZm9yayBldmVudHM6ICUxMGxkXG4iLCB0b3RhbF9mb3JrKTsKKwlkcHJpbnRmKCIgdW5rbm93biBldmVudHM6ICUxMGxkXG4iLCB0b3RhbF91bmtub3duKTsKKworCWlmIChkdW1wX3RyYWNlKQorCQlyZXR1cm4gMDsKKworCWlmICh2ZXJib3NlID49IDMpCisJCXRocmVhZHNfX2ZwcmludGYoc3Rkb3V0KTsKKworCWlmICh2ZXJib3NlID49IDIpCisJCWRzb3NfX2ZwcmludGYoc3Rkb3V0KTsKKworCWNvbGxhcHNlX19yZXNvcnQoKTsKKwlvdXRwdXRfX3Jlc29ydCgpOworCW91dHB1dF9fZnByaW50ZihzdGRvdXQsIHRvdGFsKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZXBvcnRfdXNhZ2VbXSA9IHsKKwkicGVyZiByZXBvcnQgWzxvcHRpb25zPl0gPGNvbW1hbmQ+IiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJT1BUX1NUUklORygnaScsICJpbnB1dCIsICZpbnB1dF9uYW1lLCAiZmlsZSIsCisJCSAgICAiaW5wdXQgZmlsZSBuYW1lIiksCisJT1BUX0JPT0xFQU4oJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLAorCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBzeW1ib2wgYWRkcmVzcywgZXRjKSIpLAorCU9QVF9CT09MRUFOKCdEJywgImR1bXAtcmF3LXRyYWNlIiwgJmR1bXBfdHJhY2UsCisJCSAgICAiZHVtcCByYXcgdHJhY2UgaW4gQVNDSUkiKSwKKwlPUFRfU1RSSU5HKCdrJywgInZtbGludXgiLCAmdm1saW51eCwgImZpbGUiLCAidm1saW51eCBwYXRobmFtZSIpLAorCU9QVF9TVFJJTkcoJ3MnLCAic29ydCIsICZzb3J0X29yZGVyLCAia2V5WyxrZXkyLi4uXSIsCisJCSAgICJzb3J0IGJ5IGtleShzKTogcGlkLCBjb21tLCBkc28sIHN5bWJvbC4gRGVmYXVsdDogcGlkLHN5bWJvbCIpLAorCU9QVF9CT09MRUFOKCdQJywgImZ1bGwtcGF0aHMiLCAmZnVsbF9wYXRocywKKwkJICAgICJEb24ndCBzaG9ydGVuIHRoZSBwYXRobmFtZXMgdGFraW5nIGludG8gYWNjb3VudCB0aGUgY3dkIiksCisJT1BUX0VORCgpCit9OworCitzdGF0aWMgdm9pZCBzZXR1cF9zb3J0aW5nKHZvaWQpCit7CisJY2hhciAqdG1wLCAqdG9rLCAqc3RyID0gc3RyZHVwKHNvcnRfb3JkZXIpOworCisJZm9yICh0b2sgPSBzdHJ0b2tfcihzdHIsICIsICIsICZ0bXApOworCQkJdG9rOyB0b2sgPSBzdHJ0b2tfcihOVUxMLCAiLCAiLCAmdG1wKSkgeworCQlpZiAoc29ydF9kaW1lbnNpb25fX2FkZCh0b2spIDwgMCkgeworCQkJZXJyb3IoIlVua25vd24gLS1zb3J0IGtleTogYCVzJyIsIHRvayk7CisJCQl1c2FnZV93aXRoX29wdGlvbnMocmVwb3J0X3VzYWdlLCBvcHRpb25zKTsKKwkJfQorCX0KKworCWZyZWUoc3RyKTsKK30KKworaW50IGNtZF9yZXBvcnQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3ltYm9sX19pbml0KCk7CisKKwlwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgcmVwb3J0X3VzYWdlLCAwKTsKKworCXNldHVwX3NvcnRpbmcoKTsKKworCS8qCisJICogQW55ICh1bnJlY29nbml6ZWQpIGFyZ3VtZW50cyBsZWZ0PworCSAqLworCWlmIChhcmdjKQorCQl1c2FnZV93aXRoX29wdGlvbnMocmVwb3J0X3VzYWdlLCBvcHRpb25zKTsKKworCXNldHVwX3BhZ2VyKCk7CisKKwlyZXR1cm4gX19jbWRfcmVwb3J0KCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNlNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIGJ1aWx0aW4tc3RhdC5jCisgKgorICogQnVpbHRpbiBzdGF0IGNvbW1hbmQ6IEdpdmUgYSBwcmVjaXNlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHN1bW1hcnkKKyAqIG92ZXJ2aWV3IGFib3V0IGFueSB3b3JrbG9hZCwgQ1BVIG9yIHNwZWNpZmljIFBJRC4KKyAqCisgKiBTYW1wbGUgb3V0cHV0OgorCisgICAkIHBlcmYgc3RhdCB+L2hhY2tiZW5jaCAxMAorICAgVGltZTogMC4xMDQKKworICAgIFBlcmZvcm1hbmNlIGNvdW50ZXIgc3RhdHMgZm9yICcvaG9tZS9taW5nby9oYWNrYmVuY2gnOgorCisgICAgICAgMTI1NS41Mzg2MTEgIHRhc2sgY2xvY2sgdGlja3MgICAgICMgICAgICAxMC4xNDMgQ1BVIHV0aWxpemF0aW9uIGZhY3RvcgorICAgICAgICAgICAgIDU0MDExICBjb250ZXh0IHN3aXRjaGVzICAgICAjICAgICAgIDAuMDQzIE0vc2VjCisgICAgICAgICAgICAgICAzODUgIENQVSBtaWdyYXRpb25zICAgICAgICMgICAgICAgMC4wMDAgTS9zZWMKKyAgICAgICAgICAgICAxNzc1NSAgcGFnZWZhdWx0cyAgICAgICAgICAgIyAgICAgICAwLjAxNCBNL3NlYworICAgICAgICAzODA4MzIzMTg1ICBDUFUgY3ljbGVzICAgICAgICAgICAjICAgIDMwMzMuMjE5IE0vc2VjCisgICAgICAgIDE1NzUxMTExOTAgIGluc3RydWN0aW9ucyAgICAgICAgICMgICAgMTI1NC41MzAgTS9zZWMKKyAgICAgICAgICAxNzM2Nzg5NSAgY2FjaGUgcmVmZXJlbmNlcyAgICAgIyAgICAgIDEzLjgzMyBNL3NlYworICAgICAgICAgICA3Njc0NDIxICBjYWNoZSBtaXNzZXMgICAgICAgICAjICAgICAgIDYuMTEyIE0vc2VjCisKKyAgICBXYWxsLWNsb2NrIHRpbWUgZWxhcHNlZDogICAxMjMuNzg2NjIwIG1zZWNzCisKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFJlZCBIYXQgSW5jLCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKiBJbXByb3ZlbWVudHMgYW5kIGZpeGVzIGJ5OgorICoKKyAqICAgQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW5AbGludXguaW50ZWwuY29tPgorICogICBZYW5taW4gWmhhbmcgPHlhbm1pbi56aGFuZ0BpbnRlbC5jb20+CisgKiAgIFd1IEZlbmdndWFuZyA8ZmVuZ2d1YW5nLnd1QGludGVsLmNvbT4KKyAqICAgTWlrZSBHYWxicmFpdGggPGVmYXVsdEBnbXguZGU+CisgKiAgIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdjIuIChhbmQgb25seSB2Miwgbm90IGFueSBsYXRlciB2ZXJzaW9uKQorICovCisKKyNpbmNsdWRlICJwZXJmLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgInV0aWwvdXRpbC5oIgorI2luY2x1ZGUgInV0aWwvcGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgInV0aWwvcGFyc2UtZXZlbnRzLmgiCisKKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKworc3RhdGljIHN0cnVjdCBwZXJmX2NvdW50ZXJfYXR0ciBkZWZhdWx0X2F0dHJzW01BWF9DT1VOVEVSU10gPSB7CisKKyAgeyAudHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfVEFTS19DTE9DSwl9LAorICB7IC50eXBlID0gUEVSRl9UWVBFX1NPRlRXQVJFLCAuY29uZmlnID0gUEVSRl9DT1VOVF9TV19DT05URVhUX1NXSVRDSEVTfSwKKyAgeyAudHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElPTlMJfSwKKyAgeyAudHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMJfSwKKworICB7IC50eXBlID0gUEVSRl9UWVBFX0hBUkRXQVJFLCAuY29uZmlnID0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTCX0sCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OUwl9LAorICB7IC50eXBlID0gUEVSRl9UWVBFX0hBUkRXQVJFLCAuY29uZmlnID0gUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTfSwKKyAgeyAudHlwZSA9IFBFUkZfVFlQRV9IQVJEV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTCX0sCisKK307CisKK3N0YXRpYyBpbnQJCQlzeXN0ZW1fd2lkZQkJCT0gIDA7CitzdGF0aWMgaW50CQkJaW5oZXJpdAkJCQk9ICAxOworc3RhdGljIGludAkJCXZlcmJvc2UJCQkJPSAgMDsKKworc3RhdGljIGludAkJCWZkW01BWF9OUl9DUFVTXVtNQVhfQ09VTlRFUlNdOworCitzdGF0aWMgaW50CQkJdGFyZ2V0X3BpZAkJCT0gLTE7CitzdGF0aWMgaW50CQkJbnJfY3B1cwkJCQk9ICAwOworc3RhdGljIHVuc2lnbmVkIGludAkJcGFnZV9zaXplOworCitzdGF0aWMgaW50CQkJc2NhbGUJCQkJPSAgMTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkZWZhdWx0X2NvdW50W10gPSB7CisJMTAwMDAwMCwKKwkxMDAwMDAwLAorCSAgMTAwMDAsCisJICAxMDAwMCwKKwkxMDAwMDAwLAorCSAgMTAwMDAsCit9OworCitzdGF0aWMgX191NjQJCQlldmVudF9yZXNbTUFYX0NPVU5URVJTXVszXTsKK3N0YXRpYyBfX3U2NAkJCWV2ZW50X3NjYWxlZFtNQVhfQ09VTlRFUlNdOworCitzdGF0aWMgX191NjQJCQlydW50aW1lX25zZWNzOworc3RhdGljIF9fdTY0CQkJd2FsbHRpbWVfbnNlY3M7CitzdGF0aWMgX191NjQJCQlydW50aW1lX2N5Y2xlczsKKworc3RhdGljIHZvaWQgY3JlYXRlX3BlcmZfc3RhdF9jb3VudGVyKGludCBjb3VudGVyKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfYXR0ciAqYXR0ciA9IGF0dHJzICsgY291bnRlcjsKKworCWlmIChzY2FsZSkKKwkJYXR0ci0+cmVhZF9mb3JtYXQgPSBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX0VOQUJMRUQgfAorCQkJCSAgICBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkc7CisKKwlpZiAoc3lzdGVtX3dpZGUpIHsKKwkJaW50IGNwdTsKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBucl9jcHVzOyBjcHUgKyspIHsKKwkJCWZkW2NwdV1bY291bnRlcl0gPSBzeXNfcGVyZl9jb3VudGVyX29wZW4oYXR0ciwgLTEsIGNwdSwgLTEsIDApOworCQkJaWYgKGZkW2NwdV1bY291bnRlcl0gPCAwICYmIHZlcmJvc2UpIHsKKwkJCQlwcmludGYoIkVycm9yOiBjb3VudGVyICVkLCBzeXNfcGVyZl9jb3VudGVyX29wZW4oKSBzeXNjYWxsIHJldHVybmVkIHdpdGggJWQgKCVzKVxuIiwgY291bnRlciwgZmRbY3B1XVtjb3VudGVyXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWF0dHItPmluaGVyaXQJPSBpbmhlcml0OworCQlhdHRyLT5kaXNhYmxlZAk9IDE7CisKKwkJZmRbMF1bY291bnRlcl0gPSBzeXNfcGVyZl9jb3VudGVyX29wZW4oYXR0ciwgMCwgLTEsIC0xLCAwKTsKKwkJaWYgKGZkWzBdW2NvdW50ZXJdIDwgMCAmJiB2ZXJib3NlKSB7CisJCQlwcmludGYoIkVycm9yOiBjb3VudGVyICVkLCBzeXNfcGVyZl9jb3VudGVyX29wZW4oKSBzeXNjYWxsIHJldHVybmVkIHdpdGggJWQgKCVzKVxuIiwgY291bnRlciwgZmRbMF1bY291bnRlcl0sIHN0cmVycm9yKGVycm5vKSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBEb2VzIHRoZSBjb3VudGVyIGhhdmUgbnNlY3MgYXMgYSB1bml0PworICovCitzdGF0aWMgaW5saW5lIGludCBuc2VjX2NvdW50ZXIoaW50IGNvdW50ZXIpCit7CisJaWYgKGF0dHJzW2NvdW50ZXJdLnR5cGUgIT0gUEVSRl9UWVBFX1NPRlRXQVJFKQorCQlyZXR1cm4gMDsKKworCWlmIChhdHRyc1tjb3VudGVyXS5jb25maWcgPT0gUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0spCisJCXJldHVybiAxOworCisJaWYgKGF0dHJzW2NvdW50ZXJdLmNvbmZpZyA9PSBQRVJGX0NPVU5UX1NXX1RBU0tfQ0xPQ0spCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIG91dCB0aGUgcmVzdWx0cyBvZiBhIHNpbmdsZSBjb3VudGVyOgorICovCitzdGF0aWMgdm9pZCByZWFkX2NvdW50ZXIoaW50IGNvdW50ZXIpCit7CisJX191NjQgKmNvdW50LCBzaW5nbGVfY291bnRbM107CisJc3NpemVfdCByZXM7CisJaW50IGNwdSwgbnY7CisJaW50IHNjYWxlZDsKKworCWNvdW50ID0gZXZlbnRfcmVzW2NvdW50ZXJdOworCisJY291bnRbMF0gPSBjb3VudFsxXSA9IGNvdW50WzJdID0gMDsKKworCW52ID0gc2NhbGUgPyAzIDogMTsKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IG5yX2NwdXM7IGNwdSArKykgeworCQlpZiAoZmRbY3B1XVtjb3VudGVyXSA8IDApCisJCQljb250aW51ZTsKKworCQlyZXMgPSByZWFkKGZkW2NwdV1bY291bnRlcl0sIHNpbmdsZV9jb3VudCwgbnYgKiBzaXplb2YoX191NjQpKTsKKwkJYXNzZXJ0KHJlcyA9PSBudiAqIHNpemVvZihfX3U2NCkpOworCisJCWNvdW50WzBdICs9IHNpbmdsZV9jb3VudFswXTsKKwkJaWYgKHNjYWxlKSB7CisJCQljb3VudFsxXSArPSBzaW5nbGVfY291bnRbMV07CisJCQljb3VudFsyXSArPSBzaW5nbGVfY291bnRbMl07CisJCX0KKwl9CisKKwlzY2FsZWQgPSAwOworCWlmIChzY2FsZSkgeworCQlpZiAoY291bnRbMl0gPT0gMCkgeworCQkJZXZlbnRfc2NhbGVkW2NvdW50ZXJdID0gLTE7CisJCQljb3VudFswXSA9IDA7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoY291bnRbMl0gPCBjb3VudFsxXSkgeworCQkJZXZlbnRfc2NhbGVkW2NvdW50ZXJdID0gMTsKKwkJCWNvdW50WzBdID0gKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkoKGRvdWJsZSljb3VudFswXSAqIGNvdW50WzFdIC8gY291bnRbMl0gKyAwLjUpOworCQl9CisJfQorCS8qCisJICogU2F2ZSB0aGUgZnVsbCBydW50aW1lIC0gdG8gYWxsb3cgbm9ybWFsaXphdGlvbiBkdXJpbmcgcHJpbnRvdXQ6CisJICovCisJaWYgKGF0dHJzW2NvdW50ZXJdLnR5cGUgPT0gUEVSRl9UWVBFX1NPRlRXQVJFICYmCisJCWF0dHJzW2NvdW50ZXJdLmNvbmZpZyA9PSBQRVJGX0NPVU5UX1NXX1RBU0tfQ0xPQ0spCisJCXJ1bnRpbWVfbnNlY3MgPSBjb3VudFswXTsKKwlpZiAoYXR0cnNbY291bnRlcl0udHlwZSA9PSBQRVJGX1RZUEVfSEFSRFdBUkUgJiYKKwkJYXR0cnNbY291bnRlcl0uY29uZmlnID09IFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUykKKwkJcnVudGltZV9jeWNsZXMgPSBjb3VudFswXTsKK30KKworLyoKKyAqIFByaW50IG91dCB0aGUgcmVzdWx0cyBvZiBhIHNpbmdsZSBjb3VudGVyOgorICovCitzdGF0aWMgdm9pZCBwcmludF9jb3VudGVyKGludCBjb3VudGVyKQoreworCV9fdTY0ICpjb3VudDsKKwlpbnQgc2NhbGVkOworCisJY291bnQgPSBldmVudF9yZXNbY291bnRlcl07CisJc2NhbGVkID0gZXZlbnRfc2NhbGVkW2NvdW50ZXJdOworCisJaWYgKHNjYWxlZCA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiAlMTRzICAlLTIwc1xuIiwKKwkJCSI8bm90IGNvdW50ZWQ+IiwgZXZlbnRfbmFtZShjb3VudGVyKSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobnNlY19jb3VudGVyKGNvdW50ZXIpKSB7CisJCWRvdWJsZSBtc2VjcyA9IChkb3VibGUpY291bnRbMF0gLyAxMDAwMDAwOworCisJCWZwcmludGYoc3RkZXJyLCAiICUxNC42ZiAgJS0yMHMiLAorCQkJbXNlY3MsIGV2ZW50X25hbWUoY291bnRlcikpOworCQlpZiAoYXR0cnNbY291bnRlcl0udHlwZSA9PSBQRVJGX1RZUEVfU09GVFdBUkUgJiYKKwkJCWF0dHJzW2NvdW50ZXJdLmNvbmZpZyA9PSBQRVJGX0NPVU5UX1NXX1RBU0tfQ0xPQ0spIHsKKworCQkJaWYgKHdhbGx0aW1lX25zZWNzKQorCQkJCWZwcmludGYoc3RkZXJyLCAiICMgJTExLjNmIENQVSB1dGlsaXphdGlvbiBmYWN0b3IiLAorCQkJCQkoZG91YmxlKWNvdW50WzBdIC8gKGRvdWJsZSl3YWxsdGltZV9uc2Vjcyk7CisJCX0KKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIiAlMTRMZCAgJS0yMHMiLAorCQkJY291bnRbMF0sIGV2ZW50X25hbWUoY291bnRlcikpOworCQlpZiAocnVudGltZV9uc2VjcykKKwkJCWZwcmludGYoc3RkZXJyLCAiICMgJTExLjNmIE0vc2VjIiwKKwkJCQkoZG91YmxlKWNvdW50WzBdL3J1bnRpbWVfbnNlY3MqMTAwMC4wKTsKKwkJaWYgKHJ1bnRpbWVfY3ljbGVzICYmCisJCQlhdHRyc1tjb3VudGVyXS50eXBlID09IFBFUkZfVFlQRV9IQVJEV0FSRSAmJgorCQkJCWF0dHJzW2NvdW50ZXJdLmNvbmZpZyA9PSBQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OUykgeworCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAjICUxLjNmIHBlciBjeWNsZSIsCisJCQkJKGRvdWJsZSljb3VudFswXSAvIChkb3VibGUpcnVudGltZV9jeWNsZXMpOworCQl9CisJfQorCWlmIChzY2FsZWQpCisJCWZwcmludGYoc3RkZXJyLCAiICAoc2NhbGVkIGZyb20gJS4yZiUlKSIsCisJCQkoZG91YmxlKSBjb3VudFsyXSAvIGNvdW50WzFdICogMTAwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgZG9fcGVyZl9zdGF0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdDAsIHQxOworCWludCBjb3VudGVyOworCWludCBzdGF0dXM7CisJaW50IHBpZDsKKwlpbnQgaTsKKworCWlmICghc3lzdGVtX3dpZGUpCisJCW5yX2NwdXMgPSAxOworCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IG5yX2NvdW50ZXJzOyBjb3VudGVyKyspCisJCWNyZWF0ZV9wZXJmX3N0YXRfY291bnRlcihjb3VudGVyKTsKKworCS8qCisJICogRW5hYmxlIGNvdW50ZXJzIGFuZCBleGVjIHRoZSBjb21tYW5kOgorCSAqLworCXQwID0gcmRjbG9jaygpOworCXByY3RsKFBSX1RBU0tfUEVSRl9DT1VOVEVSU19FTkFCTEUpOworCisJaWYgKChwaWQgPSBmb3JrKCkpIDwgMCkKKwkJcGVycm9yKCJmYWlsZWQgdG8gZm9yayIpOworCisJaWYgKCFwaWQpIHsKKwkJaWYgKGV4ZWN2cChhcmd2WzBdLCAoY2hhciAqKilhcmd2KSkgeworCQkJcGVycm9yKGFyZ3ZbMF0pOworCQkJZXhpdCgtMSk7CisJCX0KKwl9CisKKwl3aGlsZSAod2FpdCgmc3RhdHVzKSA+PSAwKQorCQk7CisKKwlwcmN0bChQUl9UQVNLX1BFUkZfQ09VTlRFUlNfRElTQUJMRSk7CisJdDEgPSByZGNsb2NrKCk7CisKKwl3YWxsdGltZV9uc2VjcyA9IHQxIC0gdDA7CisKKwlmZmx1c2goc3Rkb3V0KTsKKworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiBQZXJmb3JtYW5jZSBjb3VudGVyIHN0YXRzIGZvciBcJyVzIiwgYXJndlswXSk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKQorCQlmcHJpbnRmKHN0ZGVyciwgIiAlcyIsIGFyZ3ZbaV0pOworCisJZnByaW50ZihzdGRlcnIsICJcJzpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBucl9jb3VudGVyczsgY291bnRlcisrKQorCQlyZWFkX2NvdW50ZXIoY291bnRlcik7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykKKwkJcHJpbnRfY291bnRlcihjb3VudGVyKTsKKworCisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiIFdhbGwtY2xvY2sgdGltZSBlbGFwc2VkOiAlMTIuNmYgbXNlY3NcbiIsCisJCQkoZG91YmxlKSh0MS10MCkvMWU2KTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvbGF0aWxlIGludCBzaWduciA9IC0xOworCitzdGF0aWMgdm9pZCBza2lwX3NpZ25hbChpbnQgc2lnbm8pCit7CisJc2lnbnIgPSBzaWdubzsKK30KKworc3RhdGljIHZvaWQgc2lnX2F0ZXhpdCh2b2lkKQoreworCWlmIChzaWduciA9PSAtMSkKKwkJcmV0dXJuOworCisJc2lnbmFsKHNpZ25yLCBTSUdfREZMKTsKKwlraWxsKGdldHBpZCgpLCBzaWducik7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3RhdF91c2FnZVtdID0geworCSJwZXJmIHN0YXQgWzxvcHRpb25zPl0gPGNvbW1hbmQ+IiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJT1BUX0NBTExCQUNLKCdlJywgImV2ZW50IiwgTlVMTCwgImV2ZW50IiwKKwkJICAgICAiZXZlbnQgc2VsZWN0b3IuIHVzZSAncGVyZiBsaXN0JyB0byBsaXN0IGF2YWlsYWJsZSBldmVudHMiLAorCQkgICAgIHBhcnNlX2V2ZW50cyksCisJT1BUX0JPT0xFQU4oJ2knLCAiaW5oZXJpdCIsICZpbmhlcml0LAorCQkgICAgImNoaWxkIHRhc2tzIGluaGVyaXQgY291bnRlcnMiKSwKKwlPUFRfSU5URUdFUigncCcsICJwaWQiLCAmdGFyZ2V0X3BpZCwKKwkJICAgICJzdGF0IGV2ZW50cyBvbiBleGlzdGluZyBwaWQiKSwKKwlPUFRfQk9PTEVBTignYScsICJhbGwtY3B1cyIsICZzeXN0ZW1fd2lkZSwKKwkJCSAgICAic3lzdGVtLXdpZGUgY29sbGVjdGlvbiBmcm9tIGFsbCBDUFVzIiksCisJT1BUX0JPT0xFQU4oJ1MnLCAic2NhbGUiLCAmc2NhbGUsCisJCQkgICAgInNjYWxlL25vcm1hbGl6ZSBjb3VudGVycyIpLAorCU9QVF9CT09MRUFOKCd2JywgInZlcmJvc2UiLCAmdmVyYm9zZSwKKwkJICAgICJiZSBtb3JlIHZlcmJvc2UgKHNob3cgY291bnRlciBvcGVuIGVycm9ycywgZXRjKSIpLAorCU9QVF9FTkQoKQorfTsKKworaW50IGNtZF9zdGF0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisKKwltZW1jcHkoYXR0cnMsIGRlZmF1bHRfYXR0cnMsIHNpemVvZihhdHRycykpOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgc3RhdF91c2FnZSwgMCk7CisJaWYgKCFhcmdjKQorCQl1c2FnZV93aXRoX29wdGlvbnMoc3RhdF91c2FnZSwgb3B0aW9ucyk7CisKKwlpZiAoIW5yX2NvdW50ZXJzKQorCQlucl9jb3VudGVycyA9IDg7CisKKwlucl9jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisJYXNzZXJ0KG5yX2NwdXMgPD0gTUFYX05SX0NQVVMpOworCWFzc2VydChucl9jcHVzID49IDApOworCisJLyoKKwkgKiBXZSBkb250IHdhbnQgdG8gYmxvY2sgdGhlIHNpZ25hbHMgLSB0aGF0IHdvdWxkIGNhdXNlCisJICogY2hpbGQgdGFza3MgdG8gaW5oZXJpdCB0aGF0IGFuZCBDdHJsLUMgd291bGQgbm90IHdvcmsuCisJICogV2hhdCB3ZSB3YW50IGlzIGZvciBDdHJsLUMgdG8gd29yayBpbiB0aGUgZXhlYygpLWVkCisJICogdGFzaywgYnV0IGJlaW5nIGlnbm9yZWQgYnkgcGVyZiBzdGF0IGl0c2VsZjoKKwkgKi8KKwlhdGV4aXQoc2lnX2F0ZXhpdCk7CisJc2lnbmFsKFNJR0lOVCwgIHNraXBfc2lnbmFsKTsKKwlzaWduYWwoU0lHQUxSTSwgc2tpcF9zaWduYWwpOworCXNpZ25hbChTSUdBQlJULCBza2lwX3NpZ25hbCk7CisKKwlyZXR1cm4gZG9fcGVyZl9zdGF0KGFyZ2MsIGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzM4ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTAsMCArMSw3MzYgQEAKKy8qCisgKiBidWlsdGluLXRvcC5jCisgKgorICogQnVpbHRpbiB0b3AgY29tbWFuZDogRGlzcGxheSBhIGNvbnRpbnVvdXNseSB1cGRhdGVkIHByb2ZpbGUgb2YKKyAqIGFueSB3b3JrbG9hZCwgQ1BVIG9yIHNwZWNpZmljIFBJRC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFJlZCBIYXQgSW5jLCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKiBJbXByb3ZlbWVudHMgYW5kIGZpeGVzIGJ5OgorICoKKyAqICAgQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW5AbGludXguaW50ZWwuY29tPgorICogICBZYW5taW4gWmhhbmcgPHlhbm1pbi56aGFuZ0BpbnRlbC5jb20+CisgKiAgIFd1IEZlbmdndWFuZyA8ZmVuZ2d1YW5nLnd1QGludGVsLmNvbT4KKyAqICAgTWlrZSBHYWxicmFpdGggPGVmYXVsdEBnbXguZGU+CisgKiAgIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdjIuIChhbmQgb25seSB2Miwgbm90IGFueSBsYXRlciB2ZXJzaW9uKQorICovCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjaW5jbHVkZSAicGVyZi5oIgorCisjaW5jbHVkZSAidXRpbC9zeW1ib2wuaCIKKyNpbmNsdWRlICJ1dGlsL2NvbG9yLmgiCisjaW5jbHVkZSAidXRpbC91dGlsLmgiCisjaW5jbHVkZSAidXRpbC9yYnRyZWUuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLWV2ZW50cy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RhdGljIGludAkJCWZkW01BWF9OUl9DUFVTXVtNQVhfQ09VTlRFUlNdOworCitzdGF0aWMgaW50CQkJc3lzdGVtX3dpZGUJCQk9ICAwOworCitzdGF0aWMgaW50CQkJZGVmYXVsdF9pbnRlcnZhbAkJPSAxMDAwMDA7CisKK3N0YXRpYyBfX3U2NAkJCWNvdW50X2ZpbHRlcgkJCT0gIDU7CitzdGF0aWMgaW50CQkJcHJpbnRfZW50cmllcwkJCT0gMTU7CisKK3N0YXRpYyBpbnQJCQl0YXJnZXRfcGlkCQkJPSAtMTsKK3N0YXRpYyBpbnQJCQlwcm9maWxlX2NwdQkJCT0gLTE7CitzdGF0aWMgaW50CQkJbnJfY3B1cwkJCQk9ICAwOworc3RhdGljIHVuc2lnbmVkIGludAkJcmVhbHRpbWVfcHJpbwkJCT0gIDA7CitzdGF0aWMgaW50CQkJZ3JvdXAJCQkJPSAgMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJCXBhZ2Vfc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJCW1tYXBfcGFnZXMJCQk9IDE2Oworc3RhdGljIGludAkJCWZyZXEJCQkJPSAgMDsKK3N0YXRpYyBpbnQJCQl2ZXJib3NlCQkJCT0gIDA7CisKK3N0YXRpYyBjaGFyCQkJKnN5bV9maWx0ZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZwkJZmlsdGVyX3N0YXJ0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcJCWZpbHRlcl9lbmQ7CisKK3N0YXRpYyBpbnQJCQlkZWxheV9zZWNzCQkJPSAgMjsKK3N0YXRpYyBpbnQJCQl6ZXJvOworc3RhdGljIGludAkJCWR1bXBfc3ltdGFiOworCisvKgorICogU3ltYm9scworICovCisKK3N0YXRpYyBfX3U2NAkJCW1pbl9pcDsKK3N0YXRpYyBfX3U2NAkJCW1heF9pcCA9IC0xbGw7CisKK3N0cnVjdCBzeW1fZW50cnkgeworCXN0cnVjdCByYl9ub2RlCQlyYl9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwl1bnNpZ25lZCBsb25nCQljb3VudFtNQVhfQ09VTlRFUlNdOworCXVuc2lnbmVkIGxvbmcJCXNuYXBfY291bnQ7CisJZG91YmxlCQkJd2VpZ2h0OworCWludAkJCXNraXA7Cit9OworCitzdHJ1Y3Qgc3ltX2VudHJ5CQkqc3ltX2ZpbHRlcl9lbnRyeTsKKworc3RydWN0IGRzbwkJCSprZXJuZWxfZHNvOworCisvKgorICogU3ltYm9scyB3aWxsIGJlIGFkZGVkIGhlcmUgaW4gcmVjb3JkX2lwIGFuZCB3aWxsIGdldCBvdXQKKyAqIGFmdGVyIGRlY2F5ZWQuCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoYWN0aXZlX3N5bWJvbHMpOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBhY3RpdmVfc3ltYm9sc19sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyoKKyAqIE9yZGVyaW5nIHdlaWdodDogY291bnQtMSAqIGNvdW50LTIgKiAuLi4gLyBjb3VudC1uCisgKi8KK3N0YXRpYyBkb3VibGUgc3ltX3dlaWdodChjb25zdCBzdHJ1Y3Qgc3ltX2VudHJ5ICpzeW0pCit7CisJZG91YmxlIHdlaWdodCA9IHN5bS0+c25hcF9jb3VudDsKKwlpbnQgY291bnRlcjsKKworCWZvciAoY291bnRlciA9IDE7IGNvdW50ZXIgPCBucl9jb3VudGVycy0xOyBjb3VudGVyKyspCisJCXdlaWdodCAqPSBzeW0tPmNvdW50W2NvdW50ZXJdOworCisJd2VpZ2h0IC89IChzeW0tPmNvdW50W2NvdW50ZXJdICsgMSk7CisKKwlyZXR1cm4gd2VpZ2h0OworfQorCitzdGF0aWMgbG9uZwkJCXNhbXBsZXM7CitzdGF0aWMgbG9uZwkJCXVzZXJzcGFjZV9zYW1wbGVzOworc3RhdGljIGNvbnN0IGNoYXIJCUNPTlNPTEVfQ0xFQVJbXSA9ICIbW0gbWzJKIjsKKworc3RhdGljIHZvaWQgX19saXN0X2luc2VydF9hY3RpdmVfc3ltKHN0cnVjdCBzeW1fZW50cnkgKnN5bWUpCit7CisJbGlzdF9hZGQoJnN5bWUtPm5vZGUsICZhY3RpdmVfc3ltYm9scyk7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfcmVtb3ZlX2FjdGl2ZV9zeW0oc3RydWN0IHN5bV9lbnRyeSAqc3ltZSkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJmFjdGl2ZV9zeW1ib2xzX2xvY2spOworCWxpc3RfZGVsX2luaXQoJnN5bWUtPm5vZGUpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY3RpdmVfc3ltYm9sc19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcmJfaW5zZXJ0X2FjdGl2ZV9zeW0oc3RydWN0IHJiX3Jvb3QgKnRyZWUsIHN0cnVjdCBzeW1fZW50cnkgKnNlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZ0cmVlLT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBzeW1fZW50cnkgKml0ZXI7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJaXRlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHN5bV9lbnRyeSwgcmJfbm9kZSk7CisKKwkJaWYgKHNlLT53ZWlnaHQgPiBpdGVyLT53ZWlnaHQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJcmJfbGlua19ub2RlKCZzZS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnNlLT5yYl9ub2RlLCB0cmVlKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3ltX3RhYmxlKHZvaWQpCit7CisJaW50IHByaW50ZWQgPSAwLCBqOworCWludCBjb3VudGVyOworCWZsb2F0IHNhbXBsZXNfcGVyX3NlYyA9IHNhbXBsZXMvZGVsYXlfc2VjczsKKwlmbG9hdCBrc2FtcGxlc19wZXJfc2VjID0gKHNhbXBsZXMtdXNlcnNwYWNlX3NhbXBsZXMpL2RlbGF5X3NlY3M7CisJZmxvYXQgc3VtX2tzYW1wbGVzID0gMC4wOworCXN0cnVjdCBzeW1fZW50cnkgKnN5bWUsICpuOworCXN0cnVjdCByYl9yb290IHRtcCA9IFJCX1JPT1Q7CisJc3RydWN0IHJiX25vZGUgKm5kOworCisJc2FtcGxlcyA9IHVzZXJzcGFjZV9zYW1wbGVzID0gMDsKKworCS8qIFNvcnQgdGhlIGFjdGl2ZSBzeW1ib2xzICovCisJcHRocmVhZF9tdXRleF9sb2NrKCZhY3RpdmVfc3ltYm9sc19sb2NrKTsKKwlzeW1lID0gbGlzdF9lbnRyeShhY3RpdmVfc3ltYm9scy5uZXh0LCBzdHJ1Y3Qgc3ltX2VudHJ5LCBub2RlKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYWN0aXZlX3N5bWJvbHNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShzeW1lLCBuLCAmYWN0aXZlX3N5bWJvbHMsIG5vZGUpIHsKKwkJc3ltZS0+c25hcF9jb3VudCA9IHN5bWUtPmNvdW50WzBdOworCQlpZiAoc3ltZS0+c25hcF9jb3VudCAhPSAwKSB7CisJCQlzeW1lLT53ZWlnaHQgPSBzeW1fd2VpZ2h0KHN5bWUpOworCQkJcmJfaW5zZXJ0X2FjdGl2ZV9zeW0oJnRtcCwgc3ltZSk7CisJCQlzdW1fa3NhbXBsZXMgKz0gc3ltZS0+c25hcF9jb3VudDsKKworCQkJZm9yIChqID0gMDsgaiA8IG5yX2NvdW50ZXJzOyBqKyspCisJCQkJc3ltZS0+Y291bnRbal0gPSB6ZXJvID8gMCA6IHN5bWUtPmNvdW50W2pdICogNyAvIDg7CisJCX0gZWxzZQorCQkJbGlzdF9yZW1vdmVfYWN0aXZlX3N5bShzeW1lKTsKKwl9CisKKwlwdXRzKENPTlNPTEVfQ0xFQVIpOworCisJcHJpbnRmKAorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCAiICAgUGVyZlRvcDolOC4wZiBpcnFzL3NlYyAga2VybmVsOiU0LjFmJSUgWyIsCisJCXNhbXBsZXNfcGVyX3NlYywKKwkJMTAwLjAgLSAoMTAwLjAqKChzYW1wbGVzX3Blcl9zZWMta3NhbXBsZXNfcGVyX3NlYykvc2FtcGxlc19wZXJfc2VjKSkpOworCisJaWYgKG5yX2NvdW50ZXJzID09IDEpIHsKKwkJcHJpbnRmKCIlTGQiLCBhdHRyc1swXS5zYW1wbGVfcGVyaW9kKTsKKwkJaWYgKGZyZXEpCisJCQlwcmludGYoIkh6ICIpOworCQllbHNlCisJCQlwcmludGYoIiAiKTsKKwl9CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykgeworCQlpZiAoY291bnRlcikKKwkJCXByaW50ZigiLyIpOworCisJCXByaW50ZigiJXMiLCBldmVudF9uYW1lKGNvdW50ZXIpKTsKKwl9CisKKwlwcmludGYoICJdLCAiKTsKKworCWlmICh0YXJnZXRfcGlkICE9IC0xKQorCQlwcmludGYoIiAodGFyZ2V0X3BpZDogJWQiLCB0YXJnZXRfcGlkKTsKKwllbHNlCisJCXByaW50ZigiIChhbGwiKTsKKworCWlmIChwcm9maWxlX2NwdSAhPSAtMSkKKwkJcHJpbnRmKCIsIGNwdTogJWQpXG4iLCBwcm9maWxlX2NwdSk7CisJZWxzZSB7CisJCWlmICh0YXJnZXRfcGlkICE9IC0xKQorCQkJcHJpbnRmKCIpXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIsICVkIENQVXMpXG4iLCBucl9jcHVzKTsKKwl9CisKKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKKworCWlmIChucl9jb3VudGVycyA9PSAxKQorCQlwcmludGYoIiAgICAgICAgICAgICBzYW1wbGVzICAgIHBjbnQiKTsKKwllbHNlCisJCXByaW50ZigiICB3ZWlnaHQgICAgIHNhbXBsZXMgICAgcGNudCIpOworCisJcHJpbnRmKCIgICAgICAgICBSSVAgICAgICAgICAga2VybmVsIGZ1bmN0aW9uXG4iCisJICAgICAgIAkgICAgICAgIiAgX19fX19fICAgICBfX19fX19fICAgX19fX18gICBfX19fX19fX19fX19fX19fICAgX19fX19fX19fX19fX19fXG5cbiIKKwkpOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KCZ0bXApOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlzdHJ1Y3Qgc3ltX2VudHJ5ICpzeW1lID0gcmJfZW50cnkobmQsIHN0cnVjdCBzeW1fZW50cnksIHJiX25vZGUpOworCQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSAoc3RydWN0IHN5bWJvbCAqKShzeW1lICsgMSk7CisJCWNoYXIgKmNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7CisJCWRvdWJsZSBwY250OworCisJCWlmICgrK3ByaW50ZWQgPiBwcmludF9lbnRyaWVzIHx8IHN5bWUtPnNuYXBfY291bnQgPCBjb3VudF9maWx0ZXIpCisJCQljb250aW51ZTsKKworCQlwY250ID0gMTAwLjAgLSAoMTAwLjAgKiAoKHN1bV9rc2FtcGxlcyAtIHN5bWUtPnNuYXBfY291bnQpIC8KKwkJCQkJIHN1bV9rc2FtcGxlcykpOworCisJCS8qCisJCSAqIFdlIGNvbG9yIGhpZ2gtb3ZlcmhlYWQgZW50cmllcyBpbiByZWQsIG1pZC1vdmVyaGVhZAorCQkgKiBlbnRyaWVzIGluIGdyZWVuIC0gYW5kIGtlZXAgdGhlIGxvdyBvdmVyaGVhZCBwbGFjZXMKKwkJICogbm9ybWFsOgorCQkgKi8KKwkJaWYgKHBjbnQgPj0gNS4wKSB7CisJCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOworCQl9IGVsc2UgeworCQkJaWYgKHBjbnQgPj0gMC41KQorCQkJCWNvbG9yID0gUEVSRl9DT0xPUl9HUkVFTjsKKwkJfQorCisJCWlmIChucl9jb3VudGVycyA9PSAxKQorCQkJcHJpbnRmKCIlMjAuMmYgLSAiLCBzeW1lLT53ZWlnaHQpOworCQllbHNlCisJCQlwcmludGYoIiU5LjFmICUxMGxkIC0gIiwgc3ltZS0+d2VpZ2h0LCBzeW1lLT5zbmFwX2NvdW50KTsKKworCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgY29sb3IsICIlNC4xZiUlIiwgcGNudCk7CisJCXByaW50ZigiIC0gJTAxNmxseCA6ICVzXG4iLCBzeW0tPnN0YXJ0LCBzeW0tPm5hbWUpOworCX0KK30KKworc3RhdGljIHZvaWQgKmRpc3BsYXlfdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG9sbGZkIHN0ZGluX3BvbGwgPSB7IC5mZCA9IDAsIC5ldmVudHMgPSBQT0xMSU4gfTsKKwlpbnQgZGVsYXlfbXNlY3MgPSBkZWxheV9zZWNzICogMTAwMDsKKworCXByaW50ZigiUGVyZlRvcCByZWZyZXNoIHBlcmlvZDogJWQgc2Vjb25kc1xuIiwgZGVsYXlfc2Vjcyk7CisKKwlkbyB7CisJCXByaW50X3N5bV90YWJsZSgpOworCX0gd2hpbGUgKCFwb2xsKCZzdGRpbl9wb2xsLCAxLCBkZWxheV9tc2VjcykgPT0gMSk7CisKKwlwcmludGYoImtleSBwcmVzc2VkIC0gZXhpdGluZy5cbiIpOworCWV4aXQoMCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzeW1ib2xfZmlsdGVyKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdGF0aWMgaW50IGZpbHRlcl9tYXRjaDsKKwlzdHJ1Y3Qgc3ltX2VudHJ5ICpzeW1lOworCWNvbnN0IGNoYXIgKm5hbWUgPSBzeW0tPm5hbWU7CisKKwlpZiAoIXN0cmNtcChuYW1lLCAiX3RleHQiKSB8fAorCSAgICAhc3RyY21wKG5hbWUsICJfZXRleHQiKSB8fAorCSAgICAhc3RyY21wKG5hbWUsICJfc2luaXR0ZXh0IikgfHwKKwkgICAgIXN0cm5jbXAoImluaXRfbW9kdWxlIiwgbmFtZSwgMTEpIHx8CisJICAgICFzdHJuY21wKCJjbGVhbnVwX21vZHVsZSIsIG5hbWUsIDE0KSB8fAorCSAgICBzdHJzdHIobmFtZSwgIl90ZXh0X3N0YXJ0IikgfHwKKwkgICAgc3Ryc3RyKG5hbWUsICJfdGV4dF9lbmQiKSkKKwkJcmV0dXJuIDE7CisKKwlzeW1lID0gZHNvX19zeW1fcHJpdihzZWxmLCBzeW0pOworCS8qIFRhZyBzYW1wbGVzIHRvIGJlIHNraXBwZWQuICovCisJaWYgKCFzdHJjbXAoImRlZmF1bHRfaWRsZSIsIG5hbWUpIHx8CisJICAgICFzdHJjbXAoImNwdV9pZGxlIiwgbmFtZSkgfHwKKwkgICAgIXN0cmNtcCgiZW50ZXJfaWRsZSIsIG5hbWUpIHx8CisJICAgICFzdHJjbXAoImV4aXRfaWRsZSIsIG5hbWUpIHx8CisJICAgICFzdHJjbXAoIm13YWl0X2lkbGUiLCBuYW1lKSkKKwkJc3ltZS0+c2tpcCA9IDE7CisKKwlpZiAoZmlsdGVyX21hdGNoID09IDEpIHsKKwkJZmlsdGVyX2VuZCA9IHN5bS0+c3RhcnQ7CisJCWZpbHRlcl9tYXRjaCA9IC0xOworCQlpZiAoZmlsdGVyX2VuZCAtIGZpbHRlcl9zdGFydCA+IDEwMDAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiaG0sIHRvbyBsYXJnZSBmaWx0ZXIgc3ltYm9sIDwlcz4gLSBza2lwcGluZy5cbiIsCisJCQkJc3ltX2ZpbHRlcik7CisJCQlmcHJpbnRmKHN0ZGVyciwgInN5bWJvbCBmaWx0ZXIgc3RhcnQ6ICUwMTZseFxuIiwKKwkJCQlmaWx0ZXJfc3RhcnQpOworCQkJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgZW5kOiAlMDE2bHhcbiIsCisJCQkJZmlsdGVyX2VuZCk7CisJCQlmaWx0ZXJfZW5kID0gZmlsdGVyX3N0YXJ0ID0gMDsKKwkJCXN5bV9maWx0ZXIgPSBOVUxMOworCQkJc2xlZXAoMSk7CisJCX0KKwl9CisKKwlpZiAoZmlsdGVyX21hdGNoID09IDAgJiYgc3ltX2ZpbHRlciAmJiAhc3RyY21wKG5hbWUsIHN5bV9maWx0ZXIpKSB7CisJCWZpbHRlcl9tYXRjaCA9IDE7CisJCWZpbHRlcl9zdGFydCA9IHN5bS0+c3RhcnQ7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9zeW1ib2xzKHZvaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IHN5bWJvbCAgKnN5bTsKKworCWtlcm5lbF9kc28gPSBkc29fX25ldygiW2tlcm5lbF0iLCBzaXplb2Yoc3RydWN0IHN5bV9lbnRyeSkpOworCWlmIChrZXJuZWxfZHNvID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChkc29fX2xvYWRfa2VybmVsKGtlcm5lbF9kc28sIE5VTEwsIHN5bWJvbF9maWx0ZXIsIDEpICE9IDApCisJCWdvdG8gb3V0X2RlbGV0ZV9kc287CisKKwlub2RlID0gcmJfZmlyc3QoJmtlcm5lbF9kc28tPnN5bXMpOworCXN5bSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzeW1ib2wsIHJiX25vZGUpOworCW1pbl9pcCA9IHN5bS0+c3RhcnQ7CisKKwlub2RlID0gcmJfbGFzdCgma2VybmVsX2Rzby0+c3ltcyk7CisJc3ltID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSk7CisJbWF4X2lwID0gc3ltLT5lbmQ7CisKKwlpZiAoZHVtcF9zeW10YWIpCisJCWRzb19fZnByaW50ZihrZXJuZWxfZHNvLCBzdGRlcnIpOworCisJcmV0dXJuIDA7CisKK291dF9kZWxldGVfZHNvOgorCWRzb19fZGVsZXRlKGtlcm5lbF9kc28pOworCWtlcm5lbF9kc28gPSBOVUxMOworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBUUkFDRV9DT1VOVCAgICAgMworCisvKgorICogQmluYXJ5IHNlYXJjaCBpbiB0aGUgaGlzdG9ncmFtIHRhYmxlIGFuZCByZWNvcmQgdGhlIGhpdDoKKyAqLworc3RhdGljIHZvaWQgcmVjb3JkX2lwKF9fdTY0IGlwLCBpbnQgY291bnRlcikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBkc29fX2ZpbmRfc3ltYm9sKGtlcm5lbF9kc28sIGlwKTsKKworCWlmIChzeW0gIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3ltX2VudHJ5ICpzeW1lID0gZHNvX19zeW1fcHJpdihrZXJuZWxfZHNvLCBzeW0pOworCisJCWlmICghc3ltZS0+c2tpcCkgeworCQkJc3ltZS0+Y291bnRbY291bnRlcl0rKzsKKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmYWN0aXZlX3N5bWJvbHNfbG9jayk7CisJCQlpZiAobGlzdF9lbXB0eSgmc3ltZS0+bm9kZSkgfHwgIXN5bWUtPm5vZGUubmV4dCkKKwkJCQlfX2xpc3RfaW5zZXJ0X2FjdGl2ZV9zeW0oc3ltZSk7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmYWN0aXZlX3N5bWJvbHNfbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlzYW1wbGVzLS07Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZXZlbnQoX191NjQgaXAsIGludCBjb3VudGVyKQoreworCXNhbXBsZXMrKzsKKworCWlmIChpcCA8IG1pbl9pcCB8fCBpcCA+IG1heF9pcCkgeworCQl1c2Vyc3BhY2Vfc2FtcGxlcysrOworCQlyZXR1cm47CisJfQorCisJcmVjb3JkX2lwKGlwLCBjb3VudGVyKTsKK30KKworc3RydWN0IG1tYXBfZGF0YSB7CisJaW50CQkJY291bnRlcjsKKwl2b2lkCQkJKmJhc2U7CisJdW5zaWduZWQgaW50CQltYXNrOworCXVuc2lnbmVkIGludAkJcHJldjsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbW1hcF9yZWFkX2hlYWQoc3RydWN0IG1tYXBfZGF0YSAqbWQpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9tbWFwX3BhZ2UgKnBjID0gbWQtPmJhc2U7CisJaW50IGhlYWQ7CisKKwloZWFkID0gcGMtPmRhdGFfaGVhZDsKKwlybWIoKTsKKworCXJldHVybiBoZWFkOworfQorCitzdHJ1Y3QgdGltZXZhbCBsYXN0X3JlYWQsIHRoaXNfcmVhZDsKKworc3RhdGljIHZvaWQgbW1hcF9yZWFkX2NvdW50ZXIoc3RydWN0IG1tYXBfZGF0YSAqbWQpCit7CisJdW5zaWduZWQgaW50IGhlYWQgPSBtbWFwX3JlYWRfaGVhZChtZCk7CisJdW5zaWduZWQgaW50IG9sZCA9IG1kLT5wcmV2OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtZC0+YmFzZSArIHBhZ2Vfc2l6ZTsKKwlpbnQgZGlmZjsKKworCWdldHRpbWVvZmRheSgmdGhpc19yZWFkLCBOVUxMKTsKKworCS8qCisJICogSWYgd2UncmUgZnVydGhlciBiZWhpbmQgdGhhbiBoYWxmIHRoZSBidWZmZXIsIHRoZXJlJ3MgYSBjaGFuY2UKKwkgKiB0aGUgd3JpdGVyIHdpbGwgYml0ZSBvdXIgdGFpbCBhbmQgbWVzcyB1cCB0aGUgc2FtcGxlcyB1bmRlciB1cy4KKwkgKgorCSAqIElmIHdlIHNvbWVob3cgZW5kZWQgdXAgYWhlYWQgb2YgdGhlIGhlYWQsIHdlIGdvdCBtZXNzZWQgdXAuCisJICoKKwkgKiBJbiBlaXRoZXIgY2FzZSwgdHJ1bmNhdGUgYW5kIHJlc3RhcnQgYXQgaGVhZC4KKwkgKi8KKwlkaWZmID0gaGVhZCAtIG9sZDsKKwlpZiAoZGlmZiA+IG1kLT5tYXNrIC8gMiB8fCBkaWZmIDwgMCkgeworCQlzdHJ1Y3QgdGltZXZhbCBpdjsKKwkJdW5zaWduZWQgbG9uZyBtc2VjczsKKworCQl0aW1lcnN1YigmdGhpc19yZWFkLCAmbGFzdF9yZWFkLCAmaXYpOworCQltc2VjcyA9IGl2LnR2X3NlYyoxMDAwICsgaXYudHZfdXNlYy8xMDAwOworCisJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogZmFpbGVkIHRvIGtlZXAgdXAgd2l0aCBtbWFwIGRhdGEuIgorCQkJCSIgIExhc3QgcmVhZCAlbHUgbXNlY3MgYWdvLlxuIiwgbXNlY3MpOworCisJCS8qCisJCSAqIGhlYWQgcG9pbnRzIHRvIGEga25vd24gZ29vZCBlbnRyeSwgc3RhcnQgdGhlcmUuCisJCSAqLworCQlvbGQgPSBoZWFkOworCX0KKworCWxhc3RfcmVhZCA9IHRoaXNfcmVhZDsKKworCWZvciAoOyBvbGQgIT0gaGVhZDspIHsKKwkJc3RydWN0IGlwX2V2ZW50IHsKKwkJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJCQlfX3U2NCBpcDsKKwkJCV9fdTMyIHBpZCwgdGFyZ2V0X3BpZDsKKwkJfTsKKwkJc3RydWN0IG1tYXBfZXZlbnQgeworCQkJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwkJCV9fdTMyIHBpZCwgdGFyZ2V0X3BpZDsKKwkJCV9fdTY0IHN0YXJ0OworCQkJX191NjQgbGVuOworCQkJX191NjQgcGdvZmY7CisJCQljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwkJfTsKKworCQl0eXBlZGVmIHVuaW9uIGV2ZW50X3VuaW9uIHsKKwkJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJCQlzdHJ1Y3QgaXBfZXZlbnQgaXA7CisJCQlzdHJ1Y3QgbW1hcF9ldmVudCBtbWFwOworCQl9IGV2ZW50X3Q7CisKKwkJZXZlbnRfdCAqZXZlbnQgPSAoZXZlbnRfdCAqKSZkYXRhW29sZCAmIG1kLT5tYXNrXTsKKworCQlldmVudF90IGV2ZW50X2NvcHk7CisKKwkJc2l6ZV90IHNpemUgPSBldmVudC0+aGVhZGVyLnNpemU7CisKKwkJLyoKKwkJICogRXZlbnQgc3RyYWRkbGVzIHRoZSBtbWFwIGJvdW5kYXJ5IC0tIGhlYWRlciBzaG91bGQgYWx3YXlzCisJCSAqIGJlIGluc2lkZSBkdWUgdG8gdTY0IGFsaWdubWVudCBvZiBvdXRwdXQuCisJCSAqLworCQlpZiAoKG9sZCAmIG1kLT5tYXNrKSArIHNpemUgIT0gKChvbGQgKyBzaXplKSAmIG1kLT5tYXNrKSkgeworCQkJdW5zaWduZWQgaW50IG9mZnNldCA9IG9sZDsKKwkJCXVuc2lnbmVkIGludCBsZW4gPSBtaW4oc2l6ZW9mKCpldmVudCksIHNpemUpLCBjcHk7CisJCQl2b2lkICpkc3QgPSAmZXZlbnRfY29weTsKKworCQkJZG8geworCQkJCWNweSA9IG1pbihtZC0+bWFzayArIDEgLSAob2Zmc2V0ICYgbWQtPm1hc2spLCBsZW4pOworCQkJCW1lbWNweShkc3QsICZkYXRhW29mZnNldCAmIG1kLT5tYXNrXSwgY3B5KTsKKwkJCQlvZmZzZXQgKz0gY3B5OworCQkJCWRzdCArPSBjcHk7CisJCQkJbGVuIC09IGNweTsKKwkJCX0gd2hpbGUgKGxlbik7CisKKwkJCWV2ZW50ID0gJmV2ZW50X2NvcHk7CisJCX0KKworCQlvbGQgKz0gc2l6ZTsKKworCQlpZiAoZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XKSB7CisJCQlpZiAoZXZlbnQtPmhlYWRlci50eXBlICYgUEVSRl9TQU1QTEVfSVApCisJCQkJcHJvY2Vzc19ldmVudChldmVudC0+aXAuaXAsIG1kLT5jb3VudGVyKTsKKwkJfQorCX0KKworCW1kLT5wcmV2ID0gb2xkOworfQorCitzdGF0aWMgc3RydWN0IHBvbGxmZCBldmVudF9hcnJheVtNQVhfTlJfQ1BVUyAqIE1BWF9DT1VOVEVSU107CitzdGF0aWMgc3RydWN0IG1tYXBfZGF0YSBtbWFwX2FycmF5W01BWF9OUl9DUFVTXVtNQVhfQ09VTlRFUlNdOworCitzdGF0aWMgdm9pZCBtbWFwX3JlYWQodm9pZCkKK3sKKwlpbnQgaSwgY291bnRlcjsKKworCWZvciAoaSA9IDA7IGkgPCBucl9jcHVzOyBpKyspIHsKKwkJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IG5yX2NvdW50ZXJzOyBjb3VudGVyKyspCisJCQltbWFwX3JlYWRfY291bnRlcigmbW1hcF9hcnJheVtpXVtjb3VudGVyXSk7CisJfQorfQorCitpbnQgbnJfcG9sbDsKK2ludCBncm91cF9mZDsKKworc3RhdGljIHZvaWQgc3RhcnRfY291bnRlcihpbnQgaSwgaW50IGNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyOworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBwcm9maWxlX2NwdTsKKwlpZiAodGFyZ2V0X3BpZCA9PSAtMSAmJiBwcm9maWxlX2NwdSA9PSAtMSkKKwkJY3B1ID0gaTsKKworCWF0dHIgPSBhdHRycyArIGNvdW50ZXI7CisKKwlhdHRyLT5zYW1wbGVfdHlwZQk9IFBFUkZfU0FNUExFX0lQIHwgUEVSRl9TQU1QTEVfVElEOworCWF0dHItPmZyZXEJCT0gZnJlcTsKKwordHJ5X2FnYWluOgorCWZkW2ldW2NvdW50ZXJdID0gc3lzX3BlcmZfY291bnRlcl9vcGVuKGF0dHIsIHRhcmdldF9waWQsIGNwdSwgZ3JvdXBfZmQsIDApOworCisJaWYgKGZkW2ldW2NvdW50ZXJdIDwgMCkgeworCQlpbnQgZXJyID0gZXJybm87CisKKwkJaWYgKGVyciA9PSBFUEVSTSkKKwkJCWRpZSgiTm8gcGVybWlzc2lvbiAtIGFyZSB5b3Ugcm9vdD9cbiIpOworCQkvKgorCQkgKiBJZiBpdCdzIGN5Y2xlcyB0aGVuIGZhbGwgYmFjayB0byBocnRpbWVyCisJCSAqIGJhc2VkIGNwdS1jbG9jay10aWNrIHN3IGNvdW50ZXIsIHdoaWNoCisJCSAqIGlzIGFsd2F5cyBhdmFpbGFibGUgZXZlbiBpZiBubyBQTVUgc3VwcG9ydDoKKwkJICovCisJCWlmIChhdHRyLT50eXBlID09IFBFUkZfVFlQRV9IQVJEV0FSRQorCQkJJiYgYXR0ci0+Y29uZmlnID09IFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUykgeworCisJCQlpZiAodmVyYm9zZSkKKwkJCQl3YXJuaW5nKCIgLi4uIHRyeWluZyB0byBmYWxsIGJhY2sgdG8gY3B1LWNsb2NrLXRpY2tzXG4iKTsKKworCQkJYXR0ci0+dHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRTsKKwkJCWF0dHItPmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLOworCQkJZ290byB0cnlfYWdhaW47CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCQllcnJvcigicGVyZmNvdW50ZXIgc3lzY2FsbCByZXR1cm5lZCB3aXRoICVkICglcylcbiIsCisJCQlmZFtpXVtjb3VudGVyXSwgc3RyZXJyb3IoZXJyKSk7CisJCWRpZSgiTm8gQ09ORklHX1BFUkZfQ09VTlRFUlM9eSBrZXJuZWwgc3VwcG9ydCBjb25maWd1cmVkP1xuIik7CisJCWV4aXQoLTEpOworCX0KKwlhc3NlcnQoZmRbaV1bY291bnRlcl0gPj0gMCk7CisJZmNudGwoZmRbaV1bY291bnRlcl0sIEZfU0VURkwsIE9fTk9OQkxPQ0spOworCisJLyoKKwkgKiBGaXJzdCBjb3VudGVyIGFjdHMgYXMgdGhlIGdyb3VwIGxlYWRlcjoKKwkgKi8KKwlpZiAoZ3JvdXAgJiYgZ3JvdXBfZmQgPT0gLTEpCisJCWdyb3VwX2ZkID0gZmRbaV1bY291bnRlcl07CisKKwlldmVudF9hcnJheVtucl9wb2xsXS5mZCA9IGZkW2ldW2NvdW50ZXJdOworCWV2ZW50X2FycmF5W25yX3BvbGxdLmV2ZW50cyA9IFBPTExJTjsKKwlucl9wb2xsKys7CisKKwltbWFwX2FycmF5W2ldW2NvdW50ZXJdLmNvdW50ZXIgPSBjb3VudGVyOworCW1tYXBfYXJyYXlbaV1bY291bnRlcl0ucHJldiA9IDA7CisJbW1hcF9hcnJheVtpXVtjb3VudGVyXS5tYXNrID0gbW1hcF9wYWdlcypwYWdlX3NpemUgLSAxOworCW1tYXBfYXJyYXlbaV1bY291bnRlcl0uYmFzZSA9IG1tYXAoTlVMTCwgKG1tYXBfcGFnZXMrMSkqcGFnZV9zaXplLAorCQkJUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZFtpXVtjb3VudGVyXSwgMCk7CisJaWYgKG1tYXBfYXJyYXlbaV1bY291bnRlcl0uYmFzZSA9PSBNQVBfRkFJTEVEKQorCQlkaWUoImZhaWxlZCB0byBtbWFwIHdpdGggJWQgKCVzKVxuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3N0YXRpYyBpbnQgX19jbWRfdG9wKHZvaWQpCit7CisJcHRocmVhZF90IHRocmVhZDsKKwlpbnQgaSwgY291bnRlcjsKKwlpbnQgcmV0OworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykgeworCQlncm91cF9mZCA9IC0xOworCQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykKKwkJCXN0YXJ0X2NvdW50ZXIoaSwgY291bnRlcik7CisJfQorCisJLyogV2FpdCBmb3IgYSBtaW5pbWFsIHNldCBvZiBldmVudHMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBzbmFwc2hvdCAqLworCXBvbGwoZXZlbnRfYXJyYXksIG5yX3BvbGwsIDEwMCk7CisKKwltbWFwX3JlYWQoKTsKKworCWlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBOVUxMLCBkaXNwbGF5X3RocmVhZCwgTlVMTCkpIHsKKwkJcHJpbnRmKCJDb3VsZCBub3QgY3JlYXRlIGRpc3BsYXkgdGhyZWFkLlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChyZWFsdGltZV9wcmlvKSB7CisJCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKworCQlwYXJhbS5zY2hlZF9wcmlvcml0eSA9IHJlYWx0aW1lX3ByaW87CisJCWlmIChzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfRklGTywgJnBhcmFtKSkgeworCQkJcHJpbnRmKCJDb3VsZCBub3Qgc2V0IHJlYWx0aW1lIHByaW9yaXR5LlxuIik7CisJCQlleGl0KC0xKTsKKwkJfQorCX0KKworCXdoaWxlICgxKSB7CisJCWludCBoaXRzID0gc2FtcGxlczsKKworCQltbWFwX3JlYWQoKTsKKworCQlpZiAoaGl0cyA9PSBzYW1wbGVzKQorCQkJcmV0ID0gcG9sbChldmVudF9hcnJheSwgbnJfcG9sbCwgMTAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0b3BfdXNhZ2VbXSA9IHsKKwkicGVyZiB0b3AgWzxvcHRpb25zPl0iLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwlPUFRfQ0FMTEJBQ0soJ2UnLCAiZXZlbnQiLCBOVUxMLCAiZXZlbnQiLAorCQkgICAgICJldmVudCBzZWxlY3Rvci4gdXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYXZhaWxhYmxlIGV2ZW50cyIsCisJCSAgICAgcGFyc2VfZXZlbnRzKSwKKwlPUFRfSU5URUdFUignYycsICJjb3VudCIsICZkZWZhdWx0X2ludGVydmFsLAorCQkgICAgImV2ZW50IHBlcmlvZCB0byBzYW1wbGUiKSwKKwlPUFRfSU5URUdFUigncCcsICJwaWQiLCAmdGFyZ2V0X3BpZCwKKwkJICAgICJwcm9maWxlIGV2ZW50cyBvbiBleGlzdGluZyBwaWQiKSwKKwlPUFRfQk9PTEVBTignYScsICJhbGwtY3B1cyIsICZzeXN0ZW1fd2lkZSwKKwkJCSAgICAic3lzdGVtLXdpZGUgY29sbGVjdGlvbiBmcm9tIGFsbCBDUFVzIiksCisJT1BUX0lOVEVHRVIoJ0MnLCAiQ1BVIiwgJnByb2ZpbGVfY3B1LAorCQkgICAgIkNQVSB0byBwcm9maWxlIG9uIiksCisJT1BUX0lOVEVHRVIoJ20nLCAibW1hcC1wYWdlcyIsICZtbWFwX3BhZ2VzLAorCQkgICAgIm51bWJlciBvZiBtbWFwIGRhdGEgcGFnZXMiKSwKKwlPUFRfSU5URUdFUigncicsICJyZWFsdGltZSIsICZyZWFsdGltZV9wcmlvLAorCQkgICAgImNvbGxlY3QgZGF0YSB3aXRoIHRoaXMgUlQgU0NIRURfRklGTyBwcmlvcml0eSIpLAorCU9QVF9JTlRFR0VSKCdkJywgImRlbGF5IiwgJmRlbGF5X3NlY3MsCisJCSAgICAibnVtYmVyIG9mIHNlY29uZHMgdG8gZGVsYXkgYmV0d2VlbiByZWZyZXNoZXMiKSwKKwlPUFRfQk9PTEVBTignRCcsICJkdW1wLXN5bXRhYiIsICZkdW1wX3N5bXRhYiwKKwkJCSAgICAiZHVtcCB0aGUgc3ltYm9sIHRhYmxlIHVzZWQgZm9yIHByb2ZpbGluZyIpLAorCU9QVF9JTlRFR0VSKCdmJywgImNvdW50LWZpbHRlciIsICZjb3VudF9maWx0ZXIsCisJCSAgICAib25seSBkaXNwbGF5IGZ1bmN0aW9ucyB3aXRoIG1vcmUgZXZlbnRzIHRoYW4gdGhpcyIpLAorCU9QVF9CT09MRUFOKCdnJywgImdyb3VwIiwgJmdyb3VwLAorCQkJICAgICJwdXQgdGhlIGNvdW50ZXJzIGludG8gYSBjb3VudGVyIGdyb3VwIiksCisJT1BUX1NUUklORygncycsICJzeW0tZmlsdGVyIiwgJnN5bV9maWx0ZXIsICJwYXR0ZXJuIiwKKwkJICAgICJvbmx5IGRpc3BsYXkgc3ltYm9scyBtYXRjaGlnIHRoaXMgcGF0dGVybiIpLAorCU9QVF9CT09MRUFOKCd6JywgInplcm8iLCAmZ3JvdXAsCisJCSAgICAiemVybyBoaXN0b3J5IGFjcm9zcyB1cGRhdGVzIiksCisJT1BUX0lOVEVHRVIoJ0YnLCAiZnJlcSIsICZmcmVxLAorCQkgICAgInByb2ZpbGUgYXQgdGhpcyBmcmVxdWVuY3kiKSwKKwlPUFRfSU5URUdFUignRScsICJlbnRyaWVzIiwgJnByaW50X2VudHJpZXMsCisJCSAgICAiZGlzcGxheSB0aGlzIG1hbnkgZnVuY3Rpb25zIiksCisJT1BUX0JPT0xFQU4oJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLAorCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBjb3VudGVyIG9wZW4gZXJyb3JzLCBldGMpIiksCisJT1BUX0VORCgpCit9OworCitpbnQgY21kX3RvcChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgY291bnRlcjsKKworCXBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCB0b3BfdXNhZ2UsIDApOworCWlmIChhcmdjKQorCQl1c2FnZV93aXRoX29wdGlvbnModG9wX3VzYWdlLCBvcHRpb25zKTsKKworCWlmIChmcmVxKSB7CisJCWRlZmF1bHRfaW50ZXJ2YWwgPSBmcmVxOworCQlmcmVxID0gMTsKKwl9CisKKwkvKiBDUFUgYW5kIFBJRCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisJaWYgKHRhcmdldF9waWQgIT0gLTEgJiYgcHJvZmlsZV9jcHUgIT0gLTEpIHsKKwkJcHJpbnRmKCJXQVJOSU5HOiBQSUQgc3dpdGNoIG92ZXJyaWRpbmcgQ1BVXG4iKTsKKwkJc2xlZXAoMSk7CisJCXByb2ZpbGVfY3B1ID0gLTE7CisJfQorCisJaWYgKCFucl9jb3VudGVycykKKwkJbnJfY291bnRlcnMgPSAxOworCisJaWYgKGRlbGF5X3NlY3MgPCAxKQorCQlkZWxheV9zZWNzID0gMTsKKworCXBhcnNlX3N5bWJvbHMoKTsKKworCS8qCisJICogRmlsbCBpbiB0aGUgb25lcyBub3Qgc3BlY2lmaWNhbGx5IGluaXRpYWxpemVkIHZpYSAtYzoKKwkgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykgeworCQlpZiAoYXR0cnNbY291bnRlcl0uc2FtcGxlX3BlcmlvZCkKKwkJCWNvbnRpbnVlOworCisJCWF0dHJzW2NvdW50ZXJdLnNhbXBsZV9wZXJpb2QgPSBkZWZhdWx0X2ludGVydmFsOworCX0KKworCW5yX2NwdXMgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKwlhc3NlcnQobnJfY3B1cyA8PSBNQVhfTlJfQ1BVUyk7CisJYXNzZXJ0KG5yX2NwdXMgPj0gMCk7CisKKwlpZiAodGFyZ2V0X3BpZCAhPSAtMSB8fCBwcm9maWxlX2NwdSAhPSAtMSkKKwkJbnJfY3B1cyA9IDE7CisKKwlyZXR1cm4gX19jbWRfdG9wKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4uaCBiL3Rvb2xzL3BlcmYvYnVpbHRpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDE2ODIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4uaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIEJVSUxUSU5fSAorI2RlZmluZSBCVUlMVElOX0gKKworI2luY2x1ZGUgInV0aWwvdXRpbC5oIgorI2luY2x1ZGUgInV0aWwvc3RyYnVmLmgiCisKK2V4dGVybiBjb25zdCBjaGFyIHBlcmZfdmVyc2lvbl9zdHJpbmdbXTsKK2V4dGVybiBjb25zdCBjaGFyIHBlcmZfdXNhZ2Vfc3RyaW5nW107CitleHRlcm4gY29uc3QgY2hhciBwZXJmX21vcmVfaW5mb19zdHJpbmdbXTsKKworZXh0ZXJuIHZvaWQgbGlzdF9jb21tb25fY21kc19oZWxwKHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmhlbHBfdW5rbm93bl9jbWQoY29uc3QgY2hhciAqY21kKTsKK2V4dGVybiB2b2lkIHBydW5lX3BhY2tlZF9vYmplY3RzKGludCk7CitleHRlcm4gaW50IHJlYWRfbGluZV93aXRoX251bChjaGFyICpidWYsIGludCBzaXplLCBGSUxFICpmaWxlKTsKK2V4dGVybiBpbnQgY2hlY2tfcGFnZXJfY29uZmlnKGNvbnN0IGNoYXIgKmNtZCk7CisKK2V4dGVybiBpbnQgY21kX2Fubm90YXRlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2hlbHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmVjb3JkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3JlcG9ydChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zdGF0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3RvcChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF92ZXJzaW9uKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2xpc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29tbWFuZC1saXN0LnR4dCBiL3Rvb2xzL3BlcmYvY29tbWFuZC1saXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWJjZTMwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9jb21tYW5kLWxpc3QudHh0CkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTGlzdCBvZiBrbm93biBwZXJmIGNvbW1hbmRzLgorIyBjb21tYW5kIG5hbWUJCQljYXRlZ29yeSBbZGVwcmVjYXRlZF0gW2NvbW1vbl0KKyMKK3BlcmYtYW5ub3RhdGUJCQltYWlucG9yY2VsYWluIGNvbW1vbgorcGVyZi1saXN0CQkJbWFpbnBvcmNlbGFpbiBjb21tb24KK3BlcmYtcmVjb3JkCQkJbWFpbnBvcmNlbGFpbiBjb21tb24KK3BlcmYtcmVwb3J0CQkJbWFpbnBvcmNlbGFpbiBjb21tb24KK3BlcmYtc3RhdAkJCW1haW5wb3JjZWxhaW4gY29tbW9uCitwZXJmLXRvcAkJCW1haW5wb3JjZWxhaW4gY29tbW9uCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2Rlc2lnbi50eHQgYi90b29scy9wZXJmL2Rlc2lnbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwZTExNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvZGVzaWduLnR4dApAQCAtMCwwICsxLDQ0MiBAQAorCitQZXJmb3JtYW5jZSBDb3VudGVycyBmb3IgTGludXgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQZXJmb3JtYW5jZSBjb3VudGVycyBhcmUgc3BlY2lhbCBoYXJkd2FyZSByZWdpc3RlcnMgYXZhaWxhYmxlIG9uIG1vc3QgbW9kZXJuCitDUFVzLiBUaGVzZSByZWdpc3RlcnMgY291bnQgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVzIG9mIGh3IGV2ZW50czogc3VjaAorYXMgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkLCBjYWNoZW1pc3NlcyBzdWZmZXJlZCwgb3IgYnJhbmNoZXMgbWlzLXByZWRpY3RlZCAtCit3aXRob3V0IHNsb3dpbmcgZG93biB0aGUga2VybmVsIG9yIGFwcGxpY2F0aW9ucy4gVGhlc2UgcmVnaXN0ZXJzIGNhbiBhbHNvCit0cmlnZ2VyIGludGVycnVwdHMgd2hlbiBhIHRocmVzaG9sZCBudW1iZXIgb2YgZXZlbnRzIGhhdmUgcGFzc2VkIC0gYW5kIGNhbgordGh1cyBiZSB1c2VkIHRvIHByb2ZpbGUgdGhlIGNvZGUgdGhhdCBydW5zIG9uIHRoYXQgQ1BVLgorCitUaGUgTGludXggUGVyZm9ybWFuY2UgQ291bnRlciBzdWJzeXN0ZW0gcHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gb2YgdGhlc2UKK2hhcmR3YXJlIGNhcGFiaWxpdGllcy4gSXQgcHJvdmlkZXMgcGVyIHRhc2sgYW5kIHBlciBDUFUgY291bnRlcnMsIGNvdW50ZXIKK2dyb3VwcywgYW5kIGl0IHByb3ZpZGVzIGV2ZW50IGNhcGFiaWxpdGllcyBvbiB0b3Agb2YgdGhvc2UuICBJdAorcHJvdmlkZXMgInZpcnR1YWwiIDY0LWJpdCBjb3VudGVycywgcmVnYXJkbGVzcyBvZiB0aGUgd2lkdGggb2YgdGhlCit1bmRlcmx5aW5nIGhhcmR3YXJlIGNvdW50ZXJzLgorCitQZXJmb3JtYW5jZSBjb3VudGVycyBhcmUgYWNjZXNzZWQgdmlhIHNwZWNpYWwgZmlsZSBkZXNjcmlwdG9ycy4KK1RoZXJlJ3Mgb25lIGZpbGUgZGVzY3JpcHRvciBwZXIgdmlydHVhbCBjb3VudGVyIHVzZWQuCisKK1RoZSBzcGVjaWFsIGZpbGUgZGVzY3JpcHRvciBpcyBvcGVuZWQgdmlhIHRoZSBwZXJmX2NvdW50ZXJfb3BlbigpCitzeXN0ZW0gY2FsbDoKKworICAgaW50IHN5c19wZXJmX2NvdW50ZXJfb3BlbihzdHJ1Y3QgcGVyZl9jb3VudGVyX2h3X2V2ZW50ICpod19ldmVudF91cHRyLAorCQkJICAgICBwaWRfdCBwaWQsIGludCBjcHUsIGludCBncm91cF9mZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK1RoZSBzeXNjYWxsIHJldHVybnMgdGhlIG5ldyBmZC4gVGhlIGZkIGNhbiBiZSB1c2VkIHZpYSB0aGUgbm9ybWFsCitWRlMgc3lzdGVtIGNhbGxzOiByZWFkKCkgY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgY291bnRlciwgZmNudGwoKQorY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBibG9ja2luZyBtb2RlLCBldGMuCisKK011bHRpcGxlIGNvdW50ZXJzIGNhbiBiZSBrZXB0IG9wZW4gYXQgYSB0aW1lLCBhbmQgdGhlIGNvdW50ZXJzCitjYW4gYmUgcG9sbCgpZWQuCisKK1doZW4gY3JlYXRpbmcgYSBuZXcgY291bnRlciBmZCwgJ3BlcmZfY291bnRlcl9od19ldmVudCcgaXM6CisKK3N0cnVjdCBwZXJmX2NvdW50ZXJfaHdfZXZlbnQgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgTVNCIG9mIHRoZSBjb25maWcgd29yZCBzaWduaWZpZXMgaWYgdGhlIHJlc3QgY29udGFpbnMgY3B1CisgICAgICAgICAqIHNwZWNpZmljIChyYXcpIGNvdW50ZXIgY29uZmlndXJhdGlvbiBkYXRhLCBpZiB1bnNldCwgdGhlIG5leHQKKyAgICAgICAgICogNyBiaXRzIGFyZSBhbiBldmVudCB0eXBlIGFuZCB0aGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgdGhlIGV2ZW50CisgICAgICAgICAqIGlkZW50aWZpZXIuCisgICAgICAgICAqLworICAgICAgICBfX3U2NCAgICAgICAgICAgICAgICAgICBjb25maWc7CisKKyAgICAgICAgX191NjQgICAgICAgICAgICAgICAgICAgaXJxX3BlcmlvZDsKKyAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcmVjb3JkX3R5cGU7CisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJlYWRfZm9ybWF0OworCisgICAgICAgIF9fdTY0ICAgICAgICAgICAgICAgICAgIGRpc2FibGVkICAgICAgIDogIDEsIC8qIG9mZiBieSBkZWZhdWx0ICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0ICAgICAgICA6ICAxLCAvKiBjaGlsZHJlbiBpbmhlcml0IGl0ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkICAgICAgICAgOiAgMSwgLyogbXVzdCBhbHdheXMgYmUgb24gUE1VICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZSAgICAgIDogIDEsIC8qIG9ubHkgZ3JvdXAgb24gUE1VICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlX3VzZXIgICA6ICAxLCAvKiBkb24ndCBjb3VudCB1c2VyICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9rZXJuZWwgOiAgMSwgLyogZGl0dG8ga2VybmVsICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVfaHYgICAgIDogIDEsIC8qIGRpdHRvIGh5cGVydmlzb3IgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlX2lkbGUgICA6ICAxLCAvKiBkb24ndCBjb3VudCB3aGVuIGlkbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1hcCAgICAgICAgICAgOiAgMSwgLyogaW5jbHVkZSBtbWFwIGRhdGEgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bm1hcCAgICAgICAgIDogIDEsIC8qIGluY2x1ZGUgbXVubWFwIGRhdGEgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tICAgICAgICAgICA6ICAxLCAvKiBpbmNsdWRlIGNvbW0gZGF0YSAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc2VydmVkXzEgICA6IDUyOworCisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGV4dHJhX2NvbmZpZ19sZW47CisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHdha2V1cF9ldmVudHM7ICAvKiB3YWtldXAgZXZlcnkgbiBldmVudHMgKi8KKworICAgICAgICBfX3U2NCAgICAgICAgICAgICAgICAgICBfX3Jlc2VydmVkXzI7CisgICAgICAgIF9fdTY0ICAgICAgICAgICAgICAgICAgIF9fcmVzZXJ2ZWRfMzsKK307CisKK1RoZSAnY29uZmlnJyBmaWVsZCBzcGVjaWZpZXMgd2hhdCB0aGUgY291bnRlciBzaG91bGQgY291bnQuICBJdAoraXMgZGl2aWRlZCBpbnRvIDMgYml0LWZpZWxkczoKKworcmF3X3R5cGU6IDEgYml0ICAgKG1vc3Qgc2lnbmlmaWNhbnQgYml0KQkweDgwMDBfMDAwMF8wMDAwXzAwMDAKK3R5cGU6CSAgNyBiaXRzICAobmV4dCBtb3N0IHNpZ25pZmljYW50KQkweDdmMDBfMDAwMF8wMDAwXzAwMDAKK2V2ZW50X2lkOiA1NiBiaXRzIChsZWFzdCBzaWduaWZpY2FudCkJCTB4MDBmZl9mZmZmX2ZmZmZfZmZmZgorCitJZiAncmF3X3R5cGUnIGlzIDEsIHRoZW4gdGhlIGNvdW50ZXIgd2lsbCBjb3VudCBhIGhhcmR3YXJlIGV2ZW50CitzcGVjaWZpZWQgYnkgdGhlIHJlbWFpbmluZyA2MyBiaXRzIG9mIGV2ZW50X2NvbmZpZy4gIFRoZSBlbmNvZGluZyBpcworbWFjaGluZS1zcGVjaWZpYy4KKworSWYgJ3Jhd190eXBlJyBpcyAwLCB0aGVuIHRoZSAndHlwZScgZmllbGQgc2F5cyB3aGF0IGtpbmQgb2YgY291bnRlcgordGhpcyBpcywgd2l0aCB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorCitlbnVtIHBlcmZfZXZlbnRfdHlwZXMgeworCVBFUkZfVFlQRV9IQVJEV0FSRQkJPSAwLAorCVBFUkZfVFlQRV9TT0ZUV0FSRQkJPSAxLAorCVBFUkZfVFlQRV9UUkFDRVBPSU5UCQk9IDIsCit9OworCitBIGNvdW50ZXIgb2YgUEVSRl9UWVBFX0hBUkRXQVJFIHdpbGwgY291bnQgdGhlIGhhcmR3YXJlIGV2ZW50CitzcGVjaWZpZWQgYnkgJ2V2ZW50X2lkJzoKKworLyoKKyAqIEdlbmVyYWxpemVkIHBlcmZvcm1hbmNlIGNvdW50ZXIgZXZlbnQgdHlwZXMsIHVzZWQgYnkgdGhlIGh3X2V2ZW50LmV2ZW50X2lkCisgKiBwYXJhbWV0ZXIgb2YgdGhlIHN5c19wZXJmX2NvdW50ZXJfb3BlbigpIHN5c2NhbGw6CisgKi8KK2VudW0gaHdfZXZlbnRfaWRzIHsKKwkvKgorCSAqIENvbW1vbiBoYXJkd2FyZSBldmVudHMsIGdlbmVyYWxpemVkIGJ5IHRoZSBrZXJuZWw6CisJICovCisJUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTCQk9IDAsCisJUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlMJCT0gMSwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVMJPSAyLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTCQk9IDMsCisJUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TCT0gNCwKKwlQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVMJPSA1LAorCVBFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFUwkJPSA2LAorfTsKKworVGhlc2UgYXJlIHN0YW5kYXJkaXplZCB0eXBlcyBvZiBldmVudHMgdGhhdCB3b3JrIHJlbGF0aXZlbHkgdW5pZm9ybWx5CitvbiBhbGwgQ1BVcyB0aGF0IGltcGxlbWVudCBQZXJmb3JtYW5jZSBDb3VudGVycyBzdXBwb3J0IHVuZGVyIExpbnV4LAorYWx0aG91Z2ggdGhlcmUgbWF5IGJlIHZhcmlhdGlvbnMgKGUuZy4sIGRpZmZlcmVudCBDUFVzIG1pZ2h0IGNvdW50CitjYWNoZSByZWZlcmVuY2VzIGFuZCBtaXNzZXMgYXQgZGlmZmVyZW50IGxldmVscyBvZiB0aGUgY2FjaGUgaGllcmFyY2h5KS4KK0lmIGEgQ1BVIGlzIG5vdCBhYmxlIHRvIGNvdW50IHRoZSBzZWxlY3RlZCBldmVudCwgdGhlbiB0aGUgc3lzdGVtIGNhbGwKK3dpbGwgcmV0dXJuIC1FSU5WQUwuCisKK01vcmUgaHdfZXZlbnRfdHlwZXMgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsLCBidXQgdGhleSBhcmUgQ1BVLXNwZWNpZmljCithbmQgYWNjZXNzZWQgYXMgcmF3IGV2ZW50cy4gIEZvciBleGFtcGxlLCB0byBjb3VudCAiRXh0ZXJuYWwgYnVzCitjeWNsZXMgd2hpbGUgYnVzIGxvY2sgc2lnbmFsIGFzc2VydGVkIiBldmVudHMgb24gSW50ZWwgQ29yZSBDUFVzLCBwYXNzCitpbiBhIDB4NDA2NCBldmVudF9pZCB2YWx1ZSBhbmQgc2V0IGh3X2V2ZW50LnJhd190eXBlIHRvIDEuCisKK0EgY291bnRlciBvZiB0eXBlIFBFUkZfVFlQRV9TT0ZUV0FSRSB3aWxsIGNvdW50IG9uZSBvZiB0aGUgYXZhaWxhYmxlCitzb2Z0d2FyZSBldmVudHMsIHNlbGVjdGVkIGJ5ICdldmVudF9pZCc6CisKKy8qCisgKiBTcGVjaWFsICJzb2Z0d2FyZSIgY291bnRlcnMgcHJvdmlkZWQgYnkgdGhlIGtlcm5lbCwgZXZlbiBpZiB0aGUgaGFyZHdhcmUKKyAqIGRvZXMgbm90IHN1cHBvcnQgcGVyZm9ybWFuY2UgY291bnRlcnMuIFRoZXNlIGNvdW50ZXJzIG1lYXN1cmUgdmFyaW91cworICogcGh5c2ljYWwgYW5kIHN3IGV2ZW50cyBvZiB0aGUga2VybmVsIChhbmQgYWxsb3cgdGhlIHByb2ZpbGluZyBvZiB0aGVtIGFzCisgKiB3ZWxsKToKKyAqLworZW51bSBzd19ldmVudF9pZHMgeworCVBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLCQk9IDAsCisJUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLCQk9IDEsCisJUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUwkJPSAyLAorCVBFUkZfQ09VTlRfU1dfQ09OVEVYVF9TV0lUQ0hFUwk9IDMsCisJUEVSRl9DT1VOVF9TV19DUFVfTUlHUkFUSU9OUwk9IDQsCisJUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4JPSA1LAorCVBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKCT0gNiwKK307CisKK0NvdW50ZXJzIG9mIHRoZSB0eXBlIFBFUkZfVFlQRV9UUkFDRVBPSU5UIGFyZSBhdmFpbGFibGUgd2hlbiB0aGUgZnRyYWNlIGV2ZW50Cit0cmFjZXIgaXMgYXZhaWxhYmxlLCBhbmQgZXZlbnRfaWQgdmFsdWVzIGNhbiBiZSBvYnRhaW5lZCBmcm9tCisvZGVidWcvdHJhY2luZy9ldmVudHMvKi8qL2lkCisKKworQ291bnRlcnMgY29tZSBpbiB0d28gZmxhdm91cnM6IGNvdW50aW5nIGNvdW50ZXJzIGFuZCBzYW1wbGluZworY291bnRlcnMuICBBICJjb3VudGluZyIgY291bnRlciBpcyBvbmUgdGhhdCBpcyB1c2VkIGZvciBjb3VudGluZyB0aGUKK251bWJlciBvZiBldmVudHMgdGhhdCBvY2N1ciwgYW5kIGlzIGNoYXJhY3RlcmlzZWQgYnkgaGF2aW5nCitpcnFfcGVyaW9kID0gMC4KKworCitBIHJlYWQoKSBvbiBhIGNvdW50ZXIgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlciBhbmQgcG9zc2libGUKK2FkZGl0aW9uYWwgdmFsdWVzIGFzIHNwZWNpZmllZCBieSAncmVhZF9mb3JtYXQnLCBlYWNoIHZhbHVlIGlzIGEgdTY0ICg4IGJ5dGVzKQoraW4gc2l6ZS4KKworLyoKKyAqIEJpdHMgdGhhdCBjYW4gYmUgc2V0IGluIGh3X2V2ZW50LnJlYWRfZm9ybWF0IHRvIHJlcXVlc3QgdGhhdAorICogcmVhZHMgb24gdGhlIGNvdW50ZXIgc2hvdWxkIHJldHVybiB0aGUgaW5kaWNhdGVkIHF1YW50aXRpZXMsCisgKiBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIGJpdCB2YWx1ZSwgYWZ0ZXIgdGhlIGNvdW50ZXIgdmFsdWUuCisgKi8KK2VudW0gcGVyZl9jb3VudGVyX3JlYWRfZm9ybWF0IHsKKyAgICAgICAgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVEICA9ICAxLAorICAgICAgICBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkcgID0gIDIsCit9OworCitVc2luZyB0aGVzZSBhZGRpdGlvbmFsIHZhbHVlcyBvbmUgY2FuIGVzdGFibGlzaCB0aGUgb3ZlcmNvbW1pdCByYXRpbyBmb3IgYQorcGFydGljdWxhciBjb3VudGVyIGFsbG93aW5nIG9uZSB0byB0YWtlIHRoZSByb3VuZC1yb2JpbiBzY2hlZHVsaW5nIGVmZmVjdAoraW50byBhY2NvdW50LgorCisKK0EgInNhbXBsaW5nIiBjb3VudGVyIGlzIG9uZSB0aGF0IGlzIHNldCB1cCB0byBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQKK2V2ZXJ5IE4gZXZlbnRzLCB3aGVyZSBOIGlzIGdpdmVuIGJ5ICdpcnFfcGVyaW9kJy4gIEEgc2FtcGxpbmcgY291bnRlcgoraGFzIGlycV9wZXJpb2QgPiAwLiBUaGUgcmVjb3JkX3R5cGUgY29udHJvbHMgd2hhdCBkYXRhIGlzIHJlY29yZGVkIG9uIGVhY2gKK2ludGVycnVwdDoKKworLyoKKyAqIEJpdHMgdGhhdCBjYW4gYmUgc2V0IGluIGh3X2V2ZW50LnJlY29yZF90eXBlIHRvIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIGluIHRoZSBvdmVyZmxvdyBwYWNrZXRzLgorICovCitlbnVtIHBlcmZfY291bnRlcl9yZWNvcmRfZm9ybWF0IHsKKyAgICAgICAgUEVSRl9SRUNPUkRfSVAgICAgICAgICAgPSAxVSA8PCAwLAorICAgICAgICBQRVJGX1JFQ09SRF9USUQgICAgICAgICA9IDFVIDw8IDEsCisgICAgICAgIFBFUkZfUkVDT1JEX1RJTUUgICAgICAgID0gMVUgPDwgMiwKKyAgICAgICAgUEVSRl9SRUNPUkRfQUREUiAgICAgICAgPSAxVSA8PCAzLAorICAgICAgICBQRVJGX1JFQ09SRF9HUk9VUCAgICAgICA9IDFVIDw8IDQsCisgICAgICAgIFBFUkZfUkVDT1JEX0NBTExDSEFJTiAgID0gMVUgPDwgNSwKK307CisKK1N1Y2ggKGFuZCBvdGhlcikgZXZlbnRzIHdpbGwgYmUgcmVjb3JkZWQgaW4gYSByaW5nLWJ1ZmZlciwgd2hpY2ggaXMKK2F2YWlsYWJsZSB0byB1c2VyLXNwYWNlIHVzaW5nIG1tYXAoKSAoc2VlIGJlbG93KS4KKworVGhlICdkaXNhYmxlZCcgYml0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb3VudGVyIHN0YXJ0cyBvdXQgZGlzYWJsZWQKK29yIGVuYWJsZWQuICBJZiBpdCBpcyBpbml0aWFsbHkgZGlzYWJsZWQsIGl0IGNhbiBiZSBlbmFibGVkIGJ5IGlvY3RsCitvciBwcmN0bCAoc2VlIGJlbG93KS4KKworVGhlICdpbmhlcml0JyBiaXQsIGlmIHNldCwgc3BlY2lmaWVzIHRoYXQgdGhpcyBjb3VudGVyIHNob3VsZCBjb3VudAorZXZlbnRzIG9uIGRlc2NlbmRhbnQgdGFza3MgYXMgd2VsbCBhcyB0aGUgdGFzayBzcGVjaWZpZWQuICBUaGlzIG9ubHkKK2FwcGxpZXMgdG8gbmV3IGRlc2NlbmRlbnRzLCBub3QgdG8gYW55IGV4aXN0aW5nIGRlc2NlbmRlbnRzIGF0IHRoZQordGltZSB0aGUgY291bnRlciBpcyBjcmVhdGVkIChub3IgdG8gYW55IG5ldyBkZXNjZW5kZW50cyBvZiBleGlzdGluZworZGVzY2VuZGVudHMpLgorCitUaGUgJ3Bpbm5lZCcgYml0LCBpZiBzZXQsIHNwZWNpZmllcyB0aGF0IHRoZSBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUKK29uIHRoZSBDUFUgaWYgYXQgYWxsIHBvc3NpYmxlLiAgSXQgb25seSBhcHBsaWVzIHRvIGhhcmR3YXJlIGNvdW50ZXJzCithbmQgb25seSB0byBncm91cCBsZWFkZXJzLiAgSWYgYSBwaW5uZWQgY291bnRlciBjYW5ub3QgYmUgcHV0IG9udG8gdGhlCitDUFUgKGUuZy4gYmVjYXVzZSB0aGVyZSBhcmUgbm90IGVub3VnaCBoYXJkd2FyZSBjb3VudGVycyBvciBiZWNhdXNlIG9mCithIGNvbmZsaWN0IHdpdGggc29tZSBvdGhlciBldmVudCksIHRoZW4gdGhlIGNvdW50ZXIgZ29lcyBpbnRvIGFuCisnZXJyb3InIHN0YXRlLCB3aGVyZSByZWFkcyByZXR1cm4gZW5kLW9mLWZpbGUgKGkuZS4gcmVhZCgpIHJldHVybnMgMCkKK3VudGlsIHRoZSBjb3VudGVyIGlzIHN1YnNlcXVlbnRseSBlbmFibGVkIG9yIGRpc2FibGVkLgorCitUaGUgJ2V4Y2x1c2l2ZScgYml0LCBpZiBzZXQsIHNwZWNpZmllcyB0aGF0IHdoZW4gdGhpcyBjb3VudGVyJ3MgZ3JvdXAKK2lzIG9uIHRoZSBDUFUsIGl0IHNob3VsZCBiZSB0aGUgb25seSBncm91cCB1c2luZyB0aGUgQ1BVJ3MgY291bnRlcnMuCitJbiBmdXR1cmUsIHRoaXMgd2lsbCBhbGxvdyBzb3BoaXN0aWNhdGVkIG1vbml0b3JpbmcgcHJvZ3JhbXMgdG8gc3VwcGx5CitleHRyYSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHZpYSAnZXh0cmFfY29uZmlnX2xlbicgdG8gZXhwbG9pdAorYWR2YW5jZWQgZmVhdHVyZXMgb2YgdGhlIENQVSdzIFBlcmZvcm1hbmNlIE1vbml0b3IgVW5pdCAoUE1VKSB0aGF0IGFyZQorbm90IG90aGVyd2lzZSBhY2Nlc3NpYmxlIGFuZCB0aGF0IG1pZ2h0IGRpc3J1cHQgb3RoZXIgaGFyZHdhcmUKK2NvdW50ZXJzLgorCitUaGUgJ2V4Y2x1ZGVfdXNlcicsICdleGNsdWRlX2tlcm5lbCcgYW5kICdleGNsdWRlX2h2JyBiaXRzIHByb3ZpZGUgYQord2F5IHRvIHJlcXVlc3QgdGhhdCBjb3VudGluZyBvZiBldmVudHMgYmUgcmVzdHJpY3RlZCB0byB0aW1lcyB3aGVuIHRoZQorQ1BVIGlzIGluIHVzZXIsIGtlcm5lbCBhbmQvb3IgaHlwZXJ2aXNvciBtb2RlLgorCitUaGUgJ21tYXAnIGFuZCAnbXVubWFwJyBiaXRzIGFsbG93IHJlY29yZGluZyBvZiBQUk9UX0VYRUMgbW1hcC9tdW5tYXAKK29wZXJhdGlvbnMsIHRoZXNlIGNhbiBiZSB1c2VkIHRvIHJlbGF0ZSB1c2Vyc3BhY2UgSVAgYWRkcmVzc2VzIHRvIGFjdHVhbAorY29kZSwgZXZlbiBhZnRlciB0aGUgbWFwcGluZyAob3IgZXZlbiB0aGUgd2hvbGUgcHJvY2VzcykgaXMgZ29uZSwKK3RoZXNlIGV2ZW50cyBhcmUgcmVjb3JkZWQgaW4gdGhlIHJpbmctYnVmZmVyIChzZWUgYmVsb3cpLgorCitUaGUgJ2NvbW0nIGJpdCBhbGxvd3MgdHJhY2tpbmcgb2YgcHJvY2VzcyBjb21tIGRhdGEgb24gcHJvY2VzcyBjcmVhdGlvbi4KK1RoaXMgdG9vIGlzIHJlY29yZGVkIGluIHRoZSByaW5nLWJ1ZmZlciAoc2VlIGJlbG93KS4KKworVGhlICdwaWQnIHBhcmFtZXRlciB0byB0aGUgcGVyZl9jb3VudGVyX29wZW4oKSBzeXN0ZW0gY2FsbCBhbGxvd3MgdGhlCitjb3VudGVyIHRvIGJlIHNwZWNpZmljIHRvIGEgdGFzazoKKworIHBpZCA9PSAwOiBpZiB0aGUgcGlkIHBhcmFtZXRlciBpcyB6ZXJvLCB0aGUgY291bnRlciBpcyBhdHRhY2hlZCB0byB0aGUKKyBjdXJyZW50IHRhc2suCisKKyBwaWQgPiAwOiB0aGUgY291bnRlciBpcyBhdHRhY2hlZCB0byBhIHNwZWNpZmljIHRhc2sgKGlmIHRoZSBjdXJyZW50IHRhc2sKKyBoYXMgc3VmZmljaWVudCBwcml2aWxlZ2UgdG8gZG8gc28pCisKKyBwaWQgPCAwOiBhbGwgdGFza3MgYXJlIGNvdW50ZWQgKHBlciBjcHUgY291bnRlcnMpCisKK1RoZSAnY3B1JyBwYXJhbWV0ZXIgYWxsb3dzIGEgY291bnRlciB0byBiZSBtYWRlIHNwZWNpZmljIHRvIGEgQ1BVOgorCisgY3B1ID49IDA6IHRoZSBjb3VudGVyIGlzIHJlc3RyaWN0ZWQgdG8gYSBzcGVjaWZpYyBDUFUKKyBjcHUgPT0gLTE6IHRoZSBjb3VudGVyIGNvdW50cyBvbiBhbGwgQ1BVcworCisoTm90ZTogdGhlIGNvbWJpbmF0aW9uIG9mICdwaWQgPT0gLTEnIGFuZCAnY3B1ID09IC0xJyBpcyBub3QgdmFsaWQuKQorCitBICdwaWQgPiAwJyBhbmQgJ2NwdSA9PSAtMScgY291bnRlciBpcyBhIHBlciB0YXNrIGNvdW50ZXIgdGhhdCBjb3VudHMKK2V2ZW50cyBvZiB0aGF0IHRhc2sgYW5kICdmb2xsb3dzJyB0aGF0IHRhc2sgdG8gd2hhdGV2ZXIgQ1BVIHRoZSB0YXNrCitnZXRzIHNjaGVkdWxlIHRvLiBQZXIgdGFzayBjb3VudGVycyBjYW4gYmUgY3JlYXRlZCBieSBhbnkgdXNlciwgZm9yCit0aGVpciBvd24gdGFza3MuCisKK0EgJ3BpZCA9PSAtMScgYW5kICdjcHUgPT0geCcgY291bnRlciBpcyBhIHBlciBDUFUgY291bnRlciB0aGF0IGNvdW50cworYWxsIGV2ZW50cyBvbiBDUFUteC4gUGVyIENQVSBjb3VudGVycyBuZWVkIENBUF9TWVNfQURNSU4gcHJpdmlsZWdlLgorCitUaGUgJ2ZsYWdzJyBwYXJhbWV0ZXIgaXMgY3VycmVudGx5IHVudXNlZCBhbmQgbXVzdCBiZSB6ZXJvLgorCitUaGUgJ2dyb3VwX2ZkJyBwYXJhbWV0ZXIgYWxsb3dzIGNvdW50ZXIgImdyb3VwcyIgdG8gYmUgc2V0IHVwLiAgQQorY291bnRlciBncm91cCBoYXMgb25lIGNvdW50ZXIgd2hpY2ggaXMgdGhlIGdyb3VwICJsZWFkZXIiLiAgVGhlIGxlYWRlcgoraXMgY3JlYXRlZCBmaXJzdCwgd2l0aCBncm91cF9mZCA9IC0xIGluIHRoZSBwZXJmX2NvdW50ZXJfb3BlbiBjYWxsCit0aGF0IGNyZWF0ZXMgaXQuICBUaGUgcmVzdCBvZiB0aGUgZ3JvdXAgbWVtYmVycyBhcmUgY3JlYXRlZAorc3Vic2VxdWVudGx5LCB3aXRoIGdyb3VwX2ZkIGdpdmluZyB0aGUgZmQgb2YgdGhlIGdyb3VwIGxlYWRlci4KKyhBIHNpbmdsZSBjb3VudGVyIG9uIGl0cyBvd24gaXMgY3JlYXRlZCB3aXRoIGdyb3VwX2ZkID0gLTEgYW5kIGlzCitjb25zaWRlcmVkIHRvIGJlIGEgZ3JvdXAgd2l0aCBvbmx5IDEgbWVtYmVyLikKKworQSBjb3VudGVyIGdyb3VwIGlzIHNjaGVkdWxlZCBvbnRvIHRoZSBDUFUgYXMgYSB1bml0LCB0aGF0IGlzLCBpdCB3aWxsCitvbmx5IGJlIHB1dCBvbnRvIHRoZSBDUFUgaWYgYWxsIG9mIHRoZSBjb3VudGVycyBpbiB0aGUgZ3JvdXAgY2FuIGJlCitwdXQgb250byB0aGUgQ1BVLiAgVGhpcyBtZWFucyB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIG1lbWJlciBjb3VudGVycworY2FuIGJlIG1lYW5pbmdmdWxseSBjb21wYXJlZCwgYWRkZWQsIGRpdmlkZWQgKHRvIGdldCByYXRpb3MpLCBldGMuLAord2l0aCBlYWNoIG90aGVyLCBzaW5jZSB0aGV5IGhhdmUgY291bnRlZCBldmVudHMgZm9yIHRoZSBzYW1lIHNldCBvZgorZXhlY3V0ZWQgaW5zdHJ1Y3Rpb25zLgorCisKK0xpa2Ugc3RhdGVkLCBhc3luY2hyb25vdXMgZXZlbnRzLCBsaWtlIGNvdW50ZXIgb3ZlcmZsb3cgb3IgUFJPVF9FWEVDIG1tYXAKK3RyYWNraW5nIGFyZSBsb2dnZWQgaW50byBhIHJpbmctYnVmZmVyLiBUaGlzIHJpbmctYnVmZmVyIGlzIGNyZWF0ZWQgYW5kCithY2Nlc3NlZCB0aHJvdWdoIG1tYXAoKS4KKworVGhlIG1tYXAgc2l6ZSBzaG91bGQgYmUgMSsyXm4gcGFnZXMsIHdoZXJlIHRoZSBmaXJzdCBwYWdlIGlzIGEgbWV0YS1kYXRhIHBhZ2UKKyhzdHJ1Y3QgcGVyZl9jb3VudGVyX21tYXBfcGFnZSkgdGhhdCBjb250YWlucyB2YXJpb3VzIGJpdHMgb2YgaW5mb3JtYXRpb24gc3VjaAorYXMgd2hlcmUgdGhlIHJpbmctYnVmZmVyIGhlYWQgaXMuCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgbWFwcGVkIHZpYSBtbWFwCisgKi8KK3N0cnVjdCBwZXJmX2NvdW50ZXJfbW1hcF9wYWdlIHsKKyAgICAgICAgX191MzIgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdHVyZSAqLworICAgICAgICBfX3UzMiAgIGNvbXBhdF92ZXJzaW9uOyAgICAgICAgIC8qIGxvd2VzdCB2ZXJzaW9uIHRoaXMgaXMgY29tcGF0IHdpdGggKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBCaXRzIG5lZWRlZCB0byByZWFkIHRoZSBodyBjb3VudGVycyBpbiB1c2VyLXNwYWNlLgorICAgICAgICAgKgorICAgICAgICAgKiAgIHUzMiBzZXE7CisgICAgICAgICAqICAgczY0IGNvdW50OworICAgICAgICAgKgorICAgICAgICAgKiAgIGRvIHsKKyAgICAgICAgICogICAgIHNlcSA9IHBjLT5sb2NrOworICAgICAgICAgKgorICAgICAgICAgKiAgICAgYmFycmllcigpCisgICAgICAgICAqICAgICBpZiAocGMtPmluZGV4KSB7CisgICAgICAgICAqICAgICAgIGNvdW50ID0gcG1jX3JlYWQocGMtPmluZGV4IC0gMSk7CisgICAgICAgICAqICAgICAgIGNvdW50ICs9IHBjLT5vZmZzZXQ7CisgICAgICAgICAqICAgICB9IGVsc2UKKyAgICAgICAgICogICAgICAgZ290byByZWd1bGFyX3JlYWQ7CisgICAgICAgICAqCisgICAgICAgICAqICAgICBiYXJyaWVyKCk7CisgICAgICAgICAqICAgfSB3aGlsZSAocGMtPmxvY2sgIT0gc2VxKTsKKyAgICAgICAgICoKKyAgICAgICAgICogTk9URTogZm9yIG9idmlvdXMgcmVhc29uIHRoaXMgb25seSB3b3JrcyBvbiBzZWxmLW1vbml0b3JpbmcKKyAgICAgICAgICogICAgICAgcHJvY2Vzc2VzLgorICAgICAgICAgKi8KKyAgICAgICAgX191MzIgICBsb2NrOyAgICAgICAgICAgICAgICAgICAvKiBzZXFsb2NrIGZvciBzeW5jaHJvbml6YXRpb24gKi8KKyAgICAgICAgX191MzIgICBpbmRleDsgICAgICAgICAgICAgICAgICAvKiBoYXJkd2FyZSBjb3VudGVyIGlkZW50aWZpZXIgKi8KKyAgICAgICAgX19zNjQgICBvZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiBhZGQgdG8gaGFyZHdhcmUgY291bnRlciB2YWx1ZSAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnRyb2wgZGF0YSBmb3IgdGhlIG1tYXAoKSBkYXRhIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogVXNlci1zcGFjZSByZWFkaW5nIHRoaXMgdmFsdWUgc2hvdWxkIGlzc3VlIGFuIHJtYigpLCBvbiBTTVAgY2FwYWJsZQorICAgICAgICAgKiBwbGF0Zm9ybXMsIGFmdGVyIHJlYWRpbmcgdGhpcyB2YWx1ZSAtLSBzZWUgcGVyZl9jb3VudGVyX3dha2V1cCgpLgorICAgICAgICAgKi8KKyAgICAgICAgX191MzIgICBkYXRhX2hlYWQ7ICAgICAgICAgICAgICAvKiBoZWFkIGluIHRoZSBkYXRhIHNlY3Rpb24gKi8KK307CisKK05PVEU6IHRoZSBody1jb3VudGVyIHVzZXJzcGFjZSBiaXRzIGFyZSBhcmNoIHNwZWNpZmljIGFuZCBhcmUgY3VycmVudGx5IG9ubHkKKyAgICAgIGltcGxlbWVudGVkIG9uIHBvd2VycGMuCisKK1RoZSBmb2xsb3dpbmcgMl5uIHBhZ2VzIGFyZSB0aGUgcmluZy1idWZmZXIgd2hpY2ggY29udGFpbnMgZXZlbnRzIG9mIHRoZSBmb3JtOgorCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19LRVJORUwgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUEVSRl9FVkVOVF9NSVNDX1VTRVIgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBQRVJGX0VWRU5UX01JU0NfT1ZFUkZMT1cgICAgICAgICgxIDw8IDIpCisKK3N0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciB7CisgICAgICAgIF9fdTMyICAgdHlwZTsKKyAgICAgICAgX191MTYgICBtaXNjOworICAgICAgICBfX3UxNiAgIHNpemU7Cit9OworCitlbnVtIHBlcmZfZXZlbnRfdHlwZSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIE1NQVAgZXZlbnRzIHJlY29yZCB0aGUgUFJPVF9FWEVDIG1hcHBpbmdzIHNvIHRoYXQgd2UgY2FuCisgICAgICAgICAqIGNvcnJlbGF0ZSB1c2Vyc3BhY2UgSVBzIHRvIGNvZGUuIFRoZXkgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyAgICAgICAgICoKKyAgICAgICAgICogc3RydWN0IHsKKyAgICAgICAgICogICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgICAgICAgIGhlYWRlcjsKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCwgdGlkOworICAgICAgICAgKiAgICAgIHU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjsKKyAgICAgICAgICogICAgICB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICAgICAgICogICAgICB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnb2ZmOworICAgICAgICAgKiAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVbXTsKKyAgICAgICAgICogfTsKKyAgICAgICAgICovCisgICAgICAgIFBFUkZfRVZFTlRfTU1BUCAgICAgICAgICAgICAgICAgPSAxLAorICAgICAgICBQRVJGX0VWRU5UX01VTk1BUCAgICAgICAgICAgICAgID0gMiwKKworICAgICAgICAvKgorICAgICAgICAgKiBzdHJ1Y3QgeworICAgICAgICAgKiAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAgICAgICAgaGVhZGVyOworICAgICAgICAgKgorICAgICAgICAgKiAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkLCB0aWQ7CisgICAgICAgICAqICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tW107CisgICAgICAgICAqIH07CisgICAgICAgICAqLworICAgICAgICBQRVJGX0VWRU5UX0NPTU0gICAgICAgICAgICAgICAgID0gMywKKworICAgICAgICAvKgorICAgICAgICAgKiBXaGVuIGhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XIHRoZSBldmVudF90eXBlIGZpZWxkCisgICAgICAgICAqIHdpbGwgYmUgUEVSRl9SRUNPUkRfKgorICAgICAgICAgKgorICAgICAgICAgKiBzdHJ1Y3QgeworICAgICAgICAgKiAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAgICAgICAgaGVhZGVyOworICAgICAgICAgKgorICAgICAgICAgKiAgICAgIHsgdTY0ICAgICAgICAgICAgICAgICAgIGlwOyAgICAgICB9ICYmIFBFUkZfUkVDT1JEX0lQCisgICAgICAgICAqICAgICAgeyB1MzIgICAgICAgICAgICAgICAgICAgcGlkLCB0aWQ7IH0gJiYgUEVSRl9SRUNPUkRfVElECisgICAgICAgICAqICAgICAgeyB1NjQgICAgICAgICAgICAgICAgICAgdGltZTsgICAgIH0gJiYgUEVSRl9SRUNPUkRfVElNRQorICAgICAgICAgKiAgICAgIHsgdTY0ICAgICAgICAgICAgICAgICAgIGFkZHI7ICAgICB9ICYmIFBFUkZfUkVDT1JEX0FERFIKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICB7IHU2NCAgICAgICAgICAgICAgICAgICBucjsKKyAgICAgICAgICogICAgICAgIHsgdTY0IGV2ZW50LCB2YWw7IH0gICBjbnRbbnJdOyAgfSAmJiBQRVJGX1JFQ09SRF9HUk9VUAorICAgICAgICAgKgorICAgICAgICAgKiAgICAgIHsgdTE2ICAgICAgICAgICAgICAgICAgIG5yLAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh2LAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOworICAgICAgICAgKiAgICAgICAgdTY0ICAgICAgICAgICAgICAgICAgIGlwc1tucl07ICB9ICYmIFBFUkZfUkVDT1JEX0NBTExDSEFJTgorICAgICAgICAgKiB9OworICAgICAgICAgKi8KK307CisKK05PVEU6IFBFUkZfUkVDT1JEX0NBTExDSEFJTiBpcyBhcmNoIHNwZWNpZmljIGFuZCBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZAorICAgICAgb24geDg2LgorCitOb3RpZmljYXRpb24gb2YgbmV3IGV2ZW50cyBpcyBwb3NzaWJsZSB0aHJvdWdoIHBvbGwoKS9zZWxlY3QoKS9lcG9sbCgpIGFuZAorZmNudGwoKSBtYW5hZ2luZyBzaWduYWxzLgorCitOb3JtYWxseSBhIG5vdGlmaWNhdGlvbiBpcyBnZW5lcmF0ZWQgZm9yIGV2ZXJ5IHBhZ2UgZmlsbGVkLCBob3dldmVyIG9uZSBjYW4KK2FkZGl0aW9uYWxseSBzZXQgcGVyZl9jb3VudGVyX2h3X2V2ZW50Lndha2V1cF9ldmVudHMgdG8gZ2VuZXJhdGUgb25lIGV2ZXJ5CitzbyBtYW55IGNvdW50ZXIgb3ZlcmZsb3cgZXZlbnRzLgorCitGdXR1cmUgd29yayB3aWxsIGluY2x1ZGUgYSBzcGxpY2UoKSBpbnRlcmZhY2UgdG8gdGhlIHJpbmctYnVmZmVyLgorCisKK0NvdW50ZXJzIGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZCBpbiB0d28gd2F5czogdmlhIGlvY3RsIGFuZCB2aWEKK3ByY3RsLiAgV2hlbiBhIGNvdW50ZXIgaXMgZGlzYWJsZWQsIGl0IGRvZXNuJ3QgY291bnQgb3IgZ2VuZXJhdGUKK2V2ZW50cyBidXQgZG9lcyBjb250aW51ZSB0byBleGlzdCBhbmQgbWFpbnRhaW4gaXRzIGNvdW50IHZhbHVlLgorCitBbiBpbmRpdmlkdWFsIGNvdW50ZXIgb3IgY291bnRlciBncm91cCBjYW4gYmUgZW5hYmxlZCB3aXRoCisKKwlpb2N0bChmZCwgUEVSRl9DT1VOVEVSX0lPQ19FTkFCTEUpOworCitvciBkaXNhYmxlZCB3aXRoCisKKwlpb2N0bChmZCwgUEVSRl9DT1VOVEVSX0lPQ19ESVNBQkxFKTsKKworRW5hYmxpbmcgb3IgZGlzYWJsaW5nIHRoZSBsZWFkZXIgb2YgYSBncm91cCBlbmFibGVzIG9yIGRpc2FibGVzIHRoZQord2hvbGUgZ3JvdXA7IHRoYXQgaXMsIHdoaWxlIHRoZSBncm91cCBsZWFkZXIgaXMgZGlzYWJsZWQsIG5vbmUgb2YgdGhlCitjb3VudGVycyBpbiB0aGUgZ3JvdXAgd2lsbCBjb3VudC4gIEVuYWJsaW5nIG9yIGRpc2FibGluZyBhIG1lbWJlciBvZiBhCitncm91cCBvdGhlciB0aGFuIHRoZSBsZWFkZXIgb25seSBhZmZlY3RzIHRoYXQgY291bnRlciAtIGRpc2FibGluZyBhbgorbm9uLWxlYWRlciBzdG9wcyB0aGF0IGNvdW50ZXIgZnJvbSBjb3VudGluZyBidXQgZG9lc24ndCBhZmZlY3QgYW55CitvdGhlciBjb3VudGVyLgorCitBZGRpdGlvbmFsbHksIG5vbi1pbmhlcml0ZWQgb3ZlcmZsb3cgY291bnRlcnMgY2FuIHVzZQorCisJaW9jdGwoZmQsIFBFUkZfQ09VTlRFUl9JT0NfUkVGUkVTSCwgbnIpOworCit0byBlbmFibGUgYSBjb3VudGVyIGZvciAnbnInIGV2ZW50cywgYWZ0ZXIgd2hpY2ggaXQgZ2V0cyBkaXNhYmxlZCBhZ2Fpbi4KKworQSBwcm9jZXNzIGNhbiBlbmFibGUgb3IgZGlzYWJsZSBhbGwgdGhlIGNvdW50ZXIgZ3JvdXBzIHRoYXQgYXJlCithdHRhY2hlZCB0byBpdCwgdXNpbmcgcHJjdGw6CisKKwlwcmN0bChQUl9UQVNLX1BFUkZfQ09VTlRFUlNfRU5BQkxFKTsKKworCXByY3RsKFBSX1RBU0tfUEVSRl9DT1VOVEVSU19ESVNBQkxFKTsKKworVGhpcyBhcHBsaWVzIHRvIGFsbCBjb3VudGVycyBvbiB0aGUgY3VycmVudCBwcm9jZXNzLCB3aGV0aGVyIGNyZWF0ZWQKK2J5IHRoaXMgcHJvY2VzcyBvciBieSBhbm90aGVyLCBhbmQgZG9lc24ndCBhZmZlY3QgYW55IGNvdW50ZXJzIHRoYXQKK3RoaXMgcHJvY2VzcyBoYXMgY3JlYXRlZCBvbiBvdGhlciBwcm9jZXNzZXMuICBJdCBvbmx5IGVuYWJsZXMgb3IKK2Rpc2FibGVzIHRoZSBncm91cCBsZWFkZXJzLCBub3QgYW55IG90aGVyIG1lbWJlcnMgaW4gdGhlIGdyb3Vwcy4KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9wZXJmLmMgYi90b29scy9wZXJmL3BlcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI3MjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9wZXJmLmMKQEAgLTAsMCArMSw0MjggQEAKKy8qCisgKiBwZXJmLmMKKyAqCisgKiBQZXJmb3JtYW5jZSBhbmFseXNpcyB1dGlsaXR5LgorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gaHViIGZyb20gd2hpY2ggdGhlIHN1Yi1jb21tYW5kcyAocGVyZiBzdGF0LAorICogcGVyZiB0b3AsIHBlcmYgcmVjb3JkLCBwZXJmIHJlcG9ydCwgZXRjLikgYXJlIHN0YXJ0ZWQuCisgKi8KKyNpbmNsdWRlICJidWlsdGluLmgiCisKKyNpbmNsdWRlICJ1dGlsL2V4ZWNfY21kLmgiCisjaW5jbHVkZSAidXRpbC9jYWNoZS5oIgorI2luY2x1ZGUgInV0aWwvcXVvdGUuaCIKKyNpbmNsdWRlICJ1dGlsL3J1bi1jb21tYW5kLmgiCisKK2NvbnN0IGNoYXIgcGVyZl91c2FnZV9zdHJpbmdbXSA9CisJInBlcmYgWy0tdmVyc2lvbl0gWy0taGVscF0gQ09NTUFORCBbQVJHU10iOworCitjb25zdCBjaGFyIHBlcmZfbW9yZV9pbmZvX3N0cmluZ1tdID0KKwkiU2VlICdwZXJmIGhlbHAgQ09NTUFORCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYSBzcGVjaWZpYyBjb21tYW5kLiI7CisKK3N0YXRpYyBpbnQgdXNlX3BhZ2VyID0gLTE7CitzdHJ1Y3QgcGFnZXJfY29uZmlnIHsKKwljb25zdCBjaGFyICpjbWQ7CisJaW50IHZhbDsKK307CisKK3N0YXRpYyBpbnQgcGFnZXJfY29tbWFuZF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGFnZXJfY29uZmlnICpjID0gZGF0YTsKKwlpZiAoIXByZWZpeGNtcCh2YXIsICJwYWdlci4iKSAmJiAhc3RyY21wKHZhciArIDYsIGMtPmNtZCkpCisJCWMtPnZhbCA9IHBlcmZfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybnMgMCBmb3IgIm5vIHBhZ2VyIiwgMSBmb3IgInVzZSBwYWdlciIsIGFuZCAtMSBmb3IgIm5vdCBzcGVjaWZpZWQiICovCitpbnQgY2hlY2tfcGFnZXJfY29uZmlnKGNvbnN0IGNoYXIgKmNtZCkKK3sKKwlzdHJ1Y3QgcGFnZXJfY29uZmlnIGM7CisJYy5jbWQgPSBjbWQ7CisJYy52YWwgPSAtMTsKKwlwZXJmX2NvbmZpZyhwYWdlcl9jb21tYW5kX2NvbmZpZywgJmMpOworCXJldHVybiBjLnZhbDsKK30KKworc3RhdGljIHZvaWQgY29tbWl0X3BhZ2VyX2Nob2ljZSh2b2lkKSB7CisJc3dpdGNoICh1c2VfcGFnZXIpIHsKKwljYXNlIDA6CisJCXNldGVudigiUEVSRl9QQUdFUiIsICJjYXQiLCAxKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBzZXR1cF9wYWdlcigpOyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX29wdGlvbnMoY29uc3QgY2hhcioqKiBhcmd2LCBpbnQqIGFyZ2MsIGludCogZW52Y2hhbmdlZCkKK3sKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwl3aGlsZSAoKmFyZ2MgPiAwKSB7CisJCWNvbnN0IGNoYXIgKmNtZCA9ICgqYXJndilbMF07CisJCWlmIChjbWRbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRm9yIGxlZ2FjeSByZWFzb25zLCB0aGUgInZlcnNpb24iIGFuZCAiaGVscCIKKwkJICogY29tbWFuZHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCAiLS0iIHByZXBlbmRlZAorCQkgKiB0byBtYWtlIHRoZW0gbG9vayBsaWtlIGZsYWdzLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoY21kLCAiLS1oZWxwIikgfHwgIXN0cmNtcChjbWQsICItLXZlcnNpb24iKSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIENoZWNrIHJlbWFpbmluZyBmbGFncy4KKwkJICovCisJCWlmICghcHJlZml4Y21wKGNtZCwgIi0tZXhlYy1wYXRoIikpIHsKKwkJCWNtZCArPSAxMTsKKwkJCWlmICgqY21kID09ICc9JykKKwkJCQlwZXJmX3NldF9hcmd2X2V4ZWNfcGF0aChjbWQgKyAxKTsKKwkJCWVsc2UgeworCQkJCXB1dHMocGVyZl9leGVjX3BhdGgoKSk7CisJCQkJZXhpdCgwKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi0taHRtbC1wYXRoIikpIHsKKwkJCXB1dHMoc3lzdGVtX3BhdGgoUEVSRl9IVE1MX1BBVEgpKTsKKwkJCWV4aXQoMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICItcCIpIHx8ICFzdHJjbXAoY21kLCAiLS1wYWdpbmF0ZSIpKSB7CisJCQl1c2VfcGFnZXIgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiLS1uby1wYWdlciIpKSB7CisJCQl1c2VfcGFnZXIgPSAwOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiLS1wZXJmLWRpciIpKSB7CisJCQlpZiAoKmFyZ2MgPCAyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJObyBkaXJlY3RvcnkgZ2l2ZW4gZm9yIC0tcGVyZi1kaXIuXG4iICk7CisJCQkJdXNhZ2UocGVyZl91c2FnZV9zdHJpbmcpOworCQkJfQorCQkJc2V0ZW52KFBFUkZfRElSX0VOVklST05NRU5ULCAoKmFyZ3YpWzFdLCAxKTsKKwkJCWlmIChlbnZjaGFuZ2VkKQorCQkJCSplbnZjaGFuZ2VkID0gMTsKKwkJCSgqYXJndikrKzsKKwkJCSgqYXJnYyktLTsKKwkJCWhhbmRsZWQrKzsKKwkJfSBlbHNlIGlmICghcHJlZml4Y21wKGNtZCwgIi0tcGVyZi1kaXI9IikpIHsKKwkJCXNldGVudihQRVJGX0RJUl9FTlZJUk9OTUVOVCwgY21kICsgMTAsIDEpOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiLS13b3JrLXRyZWUiKSkgeworCQkJaWYgKCphcmdjIDwgMikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm8gZGlyZWN0b3J5IGdpdmVuIGZvciAtLXdvcmstdHJlZS5cbiIgKTsKKwkJCQl1c2FnZShwZXJmX3VzYWdlX3N0cmluZyk7CisJCQl9CisJCQlzZXRlbnYoUEVSRl9XT1JLX1RSRUVfRU5WSVJPTk1FTlQsICgqYXJndilbMV0sIDEpOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQkJKCphcmd2KSsrOworCQkJKCphcmdjKS0tOworCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAoY21kLCAiLS13b3JrLXRyZWU9IikpIHsKKwkJCXNldGVudihQRVJGX1dPUktfVFJFRV9FTlZJUk9OTUVOVCwgY21kICsgMTIsIDEpOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbjogJXNcbiIsIGNtZCk7CisJCQl1c2FnZShwZXJmX3VzYWdlX3N0cmluZyk7CisJCX0KKworCQkoKmFyZ3YpKys7CisJCSgqYXJnYyktLTsKKwkJaGFuZGxlZCsrOworCX0KKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGludCBoYW5kbGVfYWxpYXMoaW50ICphcmdjcCwgY29uc3QgY2hhciAqKiphcmd2KQoreworCWludCBlbnZjaGFuZ2VkID0gMCwgcmV0ID0gMCwgc2F2ZWRfZXJybm8gPSBlcnJubzsKKwlpbnQgY291bnQsIG9wdGlvbl9jb3VudDsKKwljb25zdCBjaGFyKiogbmV3X2FyZ3Y7CisJY29uc3QgY2hhciAqYWxpYXNfY29tbWFuZDsKKwljaGFyICphbGlhc19zdHJpbmc7CisKKwlhbGlhc19jb21tYW5kID0gKCphcmd2KVswXTsKKwlhbGlhc19zdHJpbmcgPSBhbGlhc19sb29rdXAoYWxpYXNfY29tbWFuZCk7CisJaWYgKGFsaWFzX3N0cmluZykgeworCQlpZiAoYWxpYXNfc3RyaW5nWzBdID09ICchJykgeworCQkJaWYgKCphcmdjcCA+IDEpIHsKKwkJCQlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKworCQkJCXN0cmJ1Zl9pbml0KCZidWYsIFBBVEhfTUFYKTsKKwkJCQlzdHJidWZfYWRkc3RyKCZidWYsIGFsaWFzX3N0cmluZyk7CisJCQkJc3FfcXVvdGVfYXJndigmYnVmLCAoKmFyZ3YpICsgMSwgUEFUSF9NQVgpOworCQkJCWZyZWUoYWxpYXNfc3RyaW5nKTsKKwkJCQlhbGlhc19zdHJpbmcgPSBidWYuYnVmOworCQkJfQorCQkJcmV0ID0gc3lzdGVtKGFsaWFzX3N0cmluZyArIDEpOworCQkJaWYgKHJldCA+PSAwICYmIFdJRkVYSVRFRChyZXQpICYmCisJCQkgICAgV0VYSVRTVEFUVVMocmV0KSAhPSAxMjcpCisJCQkJZXhpdChXRVhJVFNUQVRVUyhyZXQpKTsKKwkJCWRpZSgiRmFpbGVkIHRvIHJ1biAnJXMnIHdoZW4gZXhwYW5kaW5nIGFsaWFzICclcyciLAorCQkJICAgIGFsaWFzX3N0cmluZyArIDEsIGFsaWFzX2NvbW1hbmQpOworCQl9CisJCWNvdW50ID0gc3BsaXRfY21kbGluZShhbGlhc19zdHJpbmcsICZuZXdfYXJndik7CisJCWlmIChjb3VudCA8IDApCisJCQlkaWUoIkJhZCBhbGlhcy4lcyBzdHJpbmciLCBhbGlhc19jb21tYW5kKTsKKwkJb3B0aW9uX2NvdW50ID0gaGFuZGxlX29wdGlvbnMoJm5ld19hcmd2LCAmY291bnQsICZlbnZjaGFuZ2VkKTsKKwkJaWYgKGVudmNoYW5nZWQpCisJCQlkaWUoImFsaWFzICclcycgY2hhbmdlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiIKKwkJCQkgIllvdSBjYW4gdXNlICchcGVyZicgaW4gdGhlIGFsaWFzIHRvIGRvIHRoaXMuIiwKKwkJCQkgYWxpYXNfY29tbWFuZCk7CisJCW1lbW1vdmUobmV3X2FyZ3YgLSBvcHRpb25fY291bnQsIG5ld19hcmd2LAorCQkJCWNvdW50ICogc2l6ZW9mKGNoYXIgKikpOworCQluZXdfYXJndiAtPSBvcHRpb25fY291bnQ7CisKKwkJaWYgKGNvdW50IDwgMSkKKwkJCWRpZSgiZW1wdHkgYWxpYXMgZm9yICVzIiwgYWxpYXNfY29tbWFuZCk7CisKKwkJaWYgKCFzdHJjbXAoYWxpYXNfY29tbWFuZCwgbmV3X2FyZ3ZbMF0pKQorCQkJZGllKCJyZWN1cnNpdmUgYWxpYXM6ICVzIiwgYWxpYXNfY29tbWFuZCk7CisKKwkJbmV3X2FyZ3YgPSByZWFsbG9jKG5ld19hcmd2LCBzaXplb2YoY2hhciopICoKKwkJCQkgICAgKGNvdW50ICsgKmFyZ2NwICsgMSkpOworCQkvKiBpbnNlcnQgYWZ0ZXIgY29tbWFuZCBuYW1lICovCisJCW1lbWNweShuZXdfYXJndiArIGNvdW50LCAqYXJndiArIDEsIHNpemVvZihjaGFyKikgKiAqYXJnY3ApOworCQluZXdfYXJndltjb3VudCsqYXJnY3BdID0gTlVMTDsKKworCQkqYXJndiA9IG5ld19hcmd2OworCQkqYXJnY3AgKz0gY291bnQgLSAxOworCisJCXJldCA9IDE7CisJfQorCisJZXJybm8gPSBzYXZlZF9lcnJubzsKKworCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IGNoYXIgcGVyZl92ZXJzaW9uX3N0cmluZ1tdID0gUEVSRl9WRVJTSU9OOworCisjZGVmaW5lIFJVTl9TRVRVUAkoMTw8MCkKKyNkZWZpbmUgVVNFX1BBR0VSCSgxPDwxKQorLyoKKyAqIHJlcXVpcmUgd29ya2luZyB0cmVlIHRvIGJlIHByZXNlbnQgLS0gYW55dGhpbmcgdXNlcyB0aGlzIG5lZWRzCisgKiBSVU5fU0VUVVAgZm9yIHJlYWRpbmcgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICovCisjZGVmaW5lIE5FRURfV09SS19UUkVFCSgxPDwyKQorCitzdHJ1Y3QgY21kX3N0cnVjdCB7CisJY29uc3QgY2hhciAqY21kOworCWludCAoKmZuKShpbnQsIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKik7CisJaW50IG9wdGlvbjsKK307CisKK3N0YXRpYyBpbnQgcnVuX2J1aWx0aW4oc3RydWN0IGNtZF9zdHJ1Y3QgKnAsIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgKnByZWZpeDsKKworCXByZWZpeCA9IE5VTEw7CisJaWYgKHAtPm9wdGlvbiAmIFJVTl9TRVRVUCkKKwkJcHJlZml4ID0gTlVMTDsgLyogc2V0dXBfcGVyZl9kaXJlY3RvcnkoKTsgKi8KKworCWlmICh1c2VfcGFnZXIgPT0gLTEgJiYgcC0+b3B0aW9uICYgUlVOX1NFVFVQKQorCQl1c2VfcGFnZXIgPSBjaGVja19wYWdlcl9jb25maWcocC0+Y21kKTsKKwlpZiAodXNlX3BhZ2VyID09IC0xICYmIHAtPm9wdGlvbiAmIFVTRV9QQUdFUikKKwkJdXNlX3BhZ2VyID0gMTsKKwljb21taXRfcGFnZXJfY2hvaWNlKCk7CisKKwlpZiAocC0+b3B0aW9uICYgTkVFRF9XT1JLX1RSRUUpCisJCS8qIHNldHVwX3dvcmtfdHJlZSgpICovOworCisJc3RhdHVzID0gcC0+Zm4oYXJnYywgYXJndiwgcHJlZml4KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzICYgMHhmZjsKKworCS8qIFNvbWVib2R5IGNsb3NlZCBzdGRvdXQ/ICovCisJaWYgKGZzdGF0KGZpbGVubyhzdGRvdXQpLCAmc3QpKQorCQlyZXR1cm4gMDsKKwkvKiBJZ25vcmUgd3JpdGUgZXJyb3JzIGZvciBwaXBlcyBhbmQgc29ja2V0cy4uICovCisJaWYgKFNfSVNGSUZPKHN0LnN0X21vZGUpIHx8IFNfSVNTT0NLKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIGZvciBFTk9TUEMgYW5kIEVJTyBlcnJvcnMuLiAqLworCWlmIChmZmx1c2goc3Rkb3V0KSkKKwkJZGllKCJ3cml0ZSBmYWlsdXJlIG9uIHN0YW5kYXJkIG91dHB1dDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCWlmIChmZXJyb3Ioc3Rkb3V0KSkKKwkJZGllKCJ1bmtub3duIHdyaXRlIGZhaWx1cmUgb24gc3RhbmRhcmQgb3V0cHV0Iik7CisJaWYgKGZjbG9zZShzdGRvdXQpKQorCQlkaWUoImNsb3NlIGZhaWxlZCBvbiBzdGFuZGFyZCBvdXRwdXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmNtZCA9IGFyZ3ZbMF07CisJc3RhdGljIHN0cnVjdCBjbWRfc3RydWN0IGNvbW1hbmRzW10gPSB7CisJCXsgImhlbHAiLCBjbWRfaGVscCwgMCB9LAorCQl7ICJsaXN0IiwgY21kX2xpc3QsIDAgfSwKKwkJeyAicmVjb3JkIiwgY21kX3JlY29yZCwgMCB9LAorCQl7ICJyZXBvcnQiLCBjbWRfcmVwb3J0LCAwIH0sCisJCXsgInN0YXQiLCBjbWRfc3RhdCwgMCB9LAorCQl7ICJ0b3AiLCBjbWRfdG9wLCAwIH0sCisJCXsgImFubm90YXRlIiwgY21kX2Fubm90YXRlLCAwIH0sCisJCXsgInZlcnNpb24iLCBjbWRfdmVyc2lvbiwgMCB9LAorCX07CisJaW50IGk7CisJc3RhdGljIGNvbnN0IGNoYXIgZXh0W10gPSBTVFJJUF9FWFRFTlNJT047CisKKwlpZiAoc2l6ZW9mKGV4dCkgPiAxKSB7CisJCWkgPSBzdHJsZW4oYXJndlswXSkgLSBzdHJsZW4oZXh0KTsKKwkJaWYgKGkgPiAwICYmICFzdHJjbXAoYXJndlswXSArIGksIGV4dCkpIHsKKwkJCWNoYXIgKmFyZ3YwID0gc3RyZHVwKGFyZ3ZbMF0pOworCQkJYXJndlswXSA9IGNtZCA9IGFyZ3YwOworCQkJYXJndjBbaV0gPSAnXDAnOworCQl9CisJfQorCisJLyogVHVybiAicGVyZiBjbWQgLS1oZWxwIiBpbnRvICJwZXJmIGhlbHAgY21kIiAqLworCWlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSkgeworCQlhcmd2WzFdID0gYXJndlswXTsKKwkJYXJndlswXSA9IGNtZCA9ICJoZWxwIjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tYW5kcyk7IGkrKykgeworCQlzdHJ1Y3QgY21kX3N0cnVjdCAqcCA9IGNvbW1hbmRzK2k7CisJCWlmIChzdHJjbXAocC0+Y21kLCBjbWQpKQorCQkJY29udGludWU7CisJCWV4aXQocnVuX2J1aWx0aW4ocCwgYXJnYywgYXJndikpOworCX0KK30KKworc3RhdGljIHZvaWQgZXhlY3ZfZGFzaGVkX2V4dGVybmFsKGNvbnN0IGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdHJidWYgY21kID0gU1RSQlVGX0lOSVQ7CisJY29uc3QgY2hhciAqdG1wOworCWludCBzdGF0dXM7CisKKwlzdHJidWZfYWRkZigmY21kLCAicGVyZi0lcyIsIGFyZ3ZbMF0pOworCisJLyoKKwkgKiBhcmd2WzBdIG11c3QgYmUgdGhlIHBlcmYgY29tbWFuZCwgYnV0IHRoZSBhcmd2IGFycmF5CisJICogYmVsb25ncyB0byB0aGUgY2FsbGVyLCBhbmQgbWF5IGJlIHJldXNlZCBpbgorCSAqIHN1YnNlcXVlbnQgbG9vcCBpdGVyYXRpb25zLiBTYXZlIGFyZ3ZbMF0gYW5kCisJICogcmVzdG9yZSBpdCBvbiBlcnJvci4KKwkgKi8KKwl0bXAgPSBhcmd2WzBdOworCWFyZ3ZbMF0gPSBjbWQuYnVmOworCisJLyoKKwkgKiBpZiB3ZSBmYWlsIGJlY2F1c2UgdGhlIGNvbW1hbmQgaXMgbm90IGZvdW5kLCBpdCBpcworCSAqIE9LIHRvIHJldHVybi4gT3RoZXJ3aXNlLCB3ZSBqdXN0IHBhc3MgYWxvbmcgdGhlIHN0YXR1cyBjb2RlLgorCSAqLworCXN0YXR1cyA9IHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ3YsIDApOworCWlmIChzdGF0dXMgIT0gLUVSUl9SVU5fQ09NTUFORF9FWEVDKSB7CisJCWlmIChJU19SVU5fQ09NTUFORF9FUlIoc3RhdHVzKSkKKwkJCWRpZSgidW5hYmxlIHRvIHJ1biAnJXMnIiwgYXJndlswXSk7CisJCWV4aXQoLXN0YXR1cyk7CisJfQorCWVycm5vID0gRU5PRU5UOyAvKiBhcyBpZiB3ZSBjYWxsZWQgZXhlY3ZwICovCisKKwlhcmd2WzBdID0gdG1wOworCisJc3RyYnVmX3JlbGVhc2UoJmNtZCk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX2FyZ3YoaW50ICphcmdjcCwgY29uc3QgY2hhciAqKiphcmd2KQoreworCWludCBkb25lX2FsaWFzID0gMDsKKworCXdoaWxlICgxKSB7CisJCS8qIFNlZSBpZiBpdCdzIGFuIGludGVybmFsIGNvbW1hbmQgKi8KKwkJaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoKmFyZ2NwLCAqYXJndik7CisKKwkJLyogLi4gdGhlbiB0cnkgdGhlIGV4dGVybmFsIG9uZXMgKi8KKwkJZXhlY3ZfZGFzaGVkX2V4dGVybmFsKCphcmd2KTsKKworCQkvKiBJdCBjb3VsZCBiZSBhbiBhbGlhcyAtLSB0aGlzIHdvcmtzIGFyb3VuZCB0aGUgaW5zYW5pdHkKKwkJICogb2Ygb3ZlcnJpZGluZyAicGVyZiBsb2ciIHdpdGggInBlcmYgc2hvdyIgYnkgaGF2aW5nCisJCSAqIGFsaWFzLmxvZyA9IHNob3cKKwkJICovCisJCWlmIChkb25lX2FsaWFzIHx8ICFoYW5kbGVfYWxpYXMoYXJnY3AsIGFyZ3YpKQorCQkJYnJlYWs7CisJCWRvbmVfYWxpYXMgPSAxOworCX0KKworCXJldHVybiBkb25lX2FsaWFzOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpjbWQ7CisKKwljbWQgPSBwZXJmX2V4dHJhY3RfYXJndjBfcGF0aChhcmd2WzBdKTsKKwlpZiAoIWNtZCkKKwkJY21kID0gInBlcmYtaGVscCI7CisKKwkvKgorCSAqICJwZXJmLXh4eHgiIGlzIHRoZSBzYW1lIGFzICJwZXJmIHh4eHgiLCBidXQgd2Ugb2J2aW91c2x5OgorCSAqCisJICogIC0gY2Fubm90IHRha2UgZmxhZ3MgaW4gYmV0d2VlbiB0aGUgInBlcmYiIGFuZCB0aGUgInh4eHgiLgorCSAqICAtIGNhbm5vdCBleGVjdXRlIGl0IGV4dGVybmFsbHkgKHNpbmNlIGl0IHdvdWxkIGp1c3QgZG8KKwkgKiAgICB0aGUgc2FtZSB0aGluZyBvdmVyIGFnYWluKQorCSAqCisJICogU28gd2UganVzdCBkaXJlY3RseSBjYWxsIHRoZSBpbnRlcm5hbCBjb21tYW5kIGhhbmRsZXIsIGFuZAorCSAqIGRpZSBpZiB0aGF0IG9uZSBjYW5ub3QgaGFuZGxlIGl0LgorCSAqLworCWlmICghcHJlZml4Y21wKGNtZCwgInBlcmYtIikpIHsKKwkJY21kICs9IDU7CisJCWFyZ3ZbMF0gPSBjbWQ7CisJCWhhbmRsZV9pbnRlcm5hbF9jb21tYW5kKGFyZ2MsIGFyZ3YpOworCQlkaWUoImNhbm5vdCBoYW5kbGUgJXMgaW50ZXJuYWxseSIsIGNtZCk7CisJfQorCisJLyogTG9vayBmb3IgZmxhZ3MuLiAqLworCWFyZ3YrKzsKKwlhcmdjLS07CisJaGFuZGxlX29wdGlvbnMoJmFyZ3YsICZhcmdjLCBOVUxMKTsKKwljb21taXRfcGFnZXJfY2hvaWNlKCk7CisJaWYgKGFyZ2MgPiAwKSB7CisJCWlmICghcHJlZml4Y21wKGFyZ3ZbMF0sICItLSIpKQorCQkJYXJndlswXSArPSAyOworCX0gZWxzZSB7CisJCS8qIFRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgY29tbWFuZDsgZ2l2ZSB0aGVtIGhlbHAgKi8KKwkJcHJpbnRmKCJcbiB1c2FnZTogJXNcblxuIiwgcGVyZl91c2FnZV9zdHJpbmcpOworCQlsaXN0X2NvbW1vbl9jbWRzX2hlbHAoKTsKKwkJcHJpbnRmKCJcbiAlc1xuXG4iLCBwZXJmX21vcmVfaW5mb19zdHJpbmcpOworCQlleGl0KDEpOworCX0KKwljbWQgPSBhcmd2WzBdOworCisJLyoKKwkgKiBXZSB1c2UgUEFUSCB0byBmaW5kIHBlcmYgY29tbWFuZHMsIGJ1dCB3ZSBwcmVwZW5kIHNvbWUgaGlnaGVyCisJICogcHJlY2lkZW5jZSBwYXRoczogdGhlICItLWV4ZWMtcGF0aCIgb3B0aW9uLCB0aGUgUEVSRl9FWEVDX1BBVEgKKwkgKiBlbnZpcm9ubWVudCwgYW5kIHRoZSAkKHBlcmZleGVjZGlyKSBmcm9tIHRoZSBNYWtlZmlsZSBhdCBidWlsZAorCSAqIHRpbWUuCisJICovCisJc2V0dXBfcGF0aCgpOworCisJd2hpbGUgKDEpIHsKKwkJc3RhdGljIGludCBkb25lX2hlbHAgPSAwOworCQlzdGF0aWMgaW50IHdhc19hbGlhcyA9IDA7CisKKwkJd2FzX2FsaWFzID0gcnVuX2FyZ3YoJmFyZ2MsICZhcmd2KTsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCWJyZWFrOworCisJCWlmICh3YXNfYWxpYXMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRXhwYW5zaW9uIG9mIGFsaWFzICclcycgZmFpbGVkOyAiCisJCQkJIiclcycgaXMgbm90IGEgcGVyZi1jb21tYW5kXG4iLAorCQkJCWNtZCwgYXJndlswXSk7CisJCQlleGl0KDEpOworCQl9CisJCWlmICghZG9uZV9oZWxwKSB7CisJCQljbWQgPSBhcmd2WzBdID0gaGVscF91bmtub3duX2NtZChjbWQpOworCQkJZG9uZV9oZWxwID0gMTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBydW4gY29tbWFuZCAnJXMnOiAlc1xuIiwKKwkJY21kLCBzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuaCBiL3Rvb2xzL3BlcmYvcGVyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGE1MDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3BlcmYuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9QRVJGX1BFUkZfSAorI2RlZmluZSBfUEVSRl9QRVJGX0gKKworI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2kzODZfXykKKyNpbmNsdWRlICIuLi8uLi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGQuaCIKKyNkZWZpbmUgcm1iKCkJCWFzbSB2b2xhdGlsZSgibGZlbmNlIiA6OjogIm1lbW9yeSIpCisjZGVmaW5lIGNwdV9yZWxheCgpCWFzbSB2b2xhdGlsZSgicmVwOyBub3AiIDo6OiAibWVtb3J5Iik7CisjZW5kaWYKKworI2lmZGVmIF9fcG93ZXJwY19fCisjaW5jbHVkZSAiLi4vLi4vYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIgorI2RlZmluZSBybWIoKQkJYXNtIHZvbGF0aWxlICgic3luYyIgOjo6ICJtZW1vcnkiKQorI2RlZmluZSBjcHVfcmVsYXgoKQlhc20gdm9sYXRpbGUgKCIiIDo6OiAibWVtb3J5Iik7CisjZW5kaWYKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9wZXJmX2NvdW50ZXIuaCIKKworLyoKKyAqIHByY3RsKFBSX1RBU0tfUEVSRl9DT1VOVEVSU19ESVNBQkxFKSB3aWxsIChjaGVhcGx5KSBkaXNhYmxlIGFsbAorICogY291bnRlcnMgaW4gdGhlIGN1cnJlbnQgdGFzay4KKyAqLworI2RlZmluZSBQUl9UQVNLX1BFUkZfQ09VTlRFUlNfRElTQUJMRSAgIDMxCisjZGVmaW5lIFBSX1RBU0tfUEVSRl9DT1VOVEVSU19FTkFCTEUgICAgMzIKKworI2lmbmRlZiBOU0VDX1BFUl9TRUMKKyMgZGVmaW5lIE5TRUNfUEVSX1NFQwkJCTEwMDAwMDAwMDBVTEwKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyByZGNsb2NrKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisJcmV0dXJuIHRzLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEwgKyB0cy50dl9uc2VjOworfQorCisvKgorICogUGljayB1cCBzb21lIGtlcm5lbCB0eXBlIGNvbnZlbnRpb25zOgorICovCisjZGVmaW5lIF9fdXNlcgorI2RlZmluZSBhc21saW5rYWdlCisKKyNkZWZpbmUgdW5saWtlbHkoeCkJX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKKyNkZWZpbmUgbWluKHgsIHkpICh7CQkJCVwKKwl0eXBlb2YoeCkgX21pbjEgPSAoeCk7CQkJXAorCXR5cGVvZih5KSBfbWluMiA9ICh5KTsJCQlcCisJKHZvaWQpICgmX21pbjEgPT0gJl9taW4yKTsJCVwKKwlfbWluMSA8IF9taW4yID8gX21pbjEgOiBfbWluMjsgfSkKKworc3RhdGljIGlubGluZSBpbnQKK3N5c19wZXJmX2NvdW50ZXJfb3BlbihzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgKmF0dHJfdXB0ciwKKwkJICAgICAgcGlkX3QgcGlkLCBpbnQgY3B1LCBpbnQgZ3JvdXBfZmQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIHN5c2NhbGwoX19OUl9wZXJmX2NvdW50ZXJfb3BlbiwgYXR0cl91cHRyLCBwaWQsIGNwdSwKKwkJICAgICAgIGdyb3VwX2ZkLCBmbGFncyk7Cit9CisKKyNkZWZpbmUgTUFYX0NPVU5URVJTCQkJMjU2CisjZGVmaW5lIE1BWF9OUl9DUFVTCQkJMjU2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL1BFUkYtVkVSU0lPTi1HRU4gYi90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTYxZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL1BFUkYtVkVSU0lPTi1HRU4KQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisKK0dWRj1QRVJGLVZFUlNJT04tRklMRQorREVGX1ZFUj12MC4wLjEuUEVSRgorCitMRj0nCisnCisKKyMgRmlyc3Qgc2VlIGlmIHRoZXJlIGlzIGEgdmVyc2lvbiBmaWxlIChpbmNsdWRlZCBpbiByZWxlYXNlIHRhcmJhbGxzKSwKKyMgdGhlbiB0cnkgZ2l0LWRlc2NyaWJlLCB0aGVuIGRlZmF1bHQuCitpZiB0ZXN0IC1mIHZlcnNpb24KK3RoZW4KKwlWTj0kKGNhdCB2ZXJzaW9uKSB8fCBWTj0iJERFRl9WRVIiCitlbGlmIHRlc3QgLWQgLmdpdCAtbyAtZiAuZ2l0ICYmCisJVk49JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsKSAmJgorCWNhc2UgIiRWTiIgaW4KKwkqJExGKikgKGV4aXQgMSkgOzsKKwl2WzAtOV0qKQorCQlnaXQgdXBkYXRlLWluZGV4IC1xIC0tcmVmcmVzaAorCQl0ZXN0IC16ICIkKGdpdCBkaWZmLWluZGV4IC0tbmFtZS1vbmx5IEhFQUQgLS0pIiB8fAorCQlWTj0iJFZOLWRpcnR5IiA7OworCWVzYWMKK3RoZW4KKwlWTj0kKGVjaG8gIiRWTiIgfCBzZWQgLWUgJ3MvLS8uL2cnKTsKK2Vsc2UKKwlWTj0iJERFRl9WRVIiCitmaQorCitWTj0kKGV4cHIgIiRWTiIgOiB2KidcKC4qXCknKQorCitpZiB0ZXN0IC1yICRHVkYKK3RoZW4KKwlWQz0kKHNlZCAtZSAncy9eUEVSRl9WRVJTSU9OID0gLy8nIDwkR1ZGKQorZWxzZQorCVZDPXVuc2V0CitmaQordGVzdCAiJFZOIiA9ICIkVkMiIHx8IHsKKwllY2hvID4mMiAiUEVSRl9WRVJTSU9OID0gJFZOIgorCWVjaG8gIlBFUkZfVkVSU0lPTiA9ICRWTiIgPiRHVkYKK30KKworCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYWJzcGF0aC5jIGIvdG9vbHMvcGVyZi91dGlsL2Fic3BhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQzM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Fic3BhdGguYwpAQCAtMCwwICsxLDExNyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKKy8qCisgKiBEbyBub3QgdXNlIHRoaXMgZm9yIGluc3BlY3RpbmcgKnRyYWNrZWQqIGNvbnRlbnQuICBXaGVuIHBhdGggaXMgYQorICogc3ltbGluayB0byBhIGRpcmVjdG9yeSwgd2UgZG8gbm90IHdhbnQgdG8gc2F5IGl0IGlzIGEgZGlyZWN0b3J5IHdoZW4KKyAqIGRlYWxpbmcgd2l0aCB0cmFja2VkIGNvbnRlbnQgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKyAqLworc3RhdGljIGludCBpc19kaXJlY3RvcnkoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlyZXR1cm4gKCFzdGF0KHBhdGgsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSk7Cit9CisKKy8qIFdlIGFsbG93ICJyZWN1cnNpdmUiIHN5bWJvbGljIGxpbmtzLiBPbmx5IHdpdGhpbiByZWFzb24sIHRob3VnaC4gKi8KKyNkZWZpbmUgTUFYREVQVEggNQorCitjb25zdCBjaGFyICptYWtlX2Fic29sdXRlX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdGF0aWMgY2hhciBidWZzWzJdW1BBVEhfTUFYICsgMV0sICpidWYgPSBidWZzWzBdLCAqbmV4dF9idWYgPSBidWZzWzFdOworCWNoYXIgY3dkWzEwMjRdID0gIiI7CisJaW50IGJ1Zl9pbmRleCA9IDEsIGxlbjsKKworCWludCBkZXB0aCA9IE1BWERFUFRIOworCWNoYXIgKmxhc3RfZWxlbSA9IE5VTEw7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RybGNweShidWYsIHBhdGgsIFBBVEhfTUFYKSA+PSBQQVRIX01BWCkKKwkJZGllICgiVG9vIGxvbmcgcGF0aDogJS4qcyIsIDYwLCBwYXRoKTsKKworCXdoaWxlIChkZXB0aC0tKSB7CisJCWlmICghaXNfZGlyZWN0b3J5KGJ1ZikpIHsKKwkJCWNoYXIgKmxhc3Rfc2xhc2ggPSBzdHJyY2hyKGJ1ZiwgJy8nKTsKKwkJCWlmIChsYXN0X3NsYXNoKSB7CisJCQkJKmxhc3Rfc2xhc2ggPSAnXDAnOworCQkJCWxhc3RfZWxlbSA9IHhzdHJkdXAobGFzdF9zbGFzaCArIDEpOworCQkJfSBlbHNlIHsKKwkJCQlsYXN0X2VsZW0gPSB4c3RyZHVwKGJ1Zik7CisJCQkJKmJ1ZiA9ICdcMCc7CisJCQl9CisJCX0KKworCQlpZiAoKmJ1ZikgeworCQkJaWYgKCEqY3dkICYmICFnZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkpCisJCQkJZGllICgiQ291bGQgbm90IGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisKKwkJCWlmIChjaGRpcihidWYpKQorCQkJCWRpZSAoIkNvdWxkIG5vdCBzd2l0Y2ggdG8gJyVzJyIsIGJ1Zik7CisJCX0KKwkJaWYgKCFnZXRjd2QoYnVmLCBQQVRIX01BWCkpCisJCQlkaWUgKCJDb3VsZCBub3QgZ2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiKTsKKworCQlpZiAobGFzdF9lbGVtKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCQlpZiAobGVuICsgc3RybGVuKGxhc3RfZWxlbSkgKyAyID4gUEFUSF9NQVgpCisJCQkJZGllICgiVG9vIGxvbmcgcGF0aCBuYW1lOiAnJXMvJXMnIiwKKwkJCQkJCWJ1ZiwgbGFzdF9lbGVtKTsKKwkJCWJ1ZltsZW5dID0gJy8nOworCQkJc3RyY3B5KGJ1ZiArIGxlbiArIDEsIGxhc3RfZWxlbSk7CisJCQlmcmVlKGxhc3RfZWxlbSk7CisJCQlsYXN0X2VsZW0gPSBOVUxMOworCQl9CisKKwkJaWYgKCFsc3RhdChidWYsICZzdCkgJiYgU19JU0xOSyhzdC5zdF9tb2RlKSkgeworCQkJbGVuID0gcmVhZGxpbmsoYnVmLCBuZXh0X2J1ZiwgUEFUSF9NQVgpOworCQkJaWYgKGxlbiA8IDApCisJCQkJZGllICgiSW52YWxpZCBzeW1saW5rOiAlcyIsIGJ1Zik7CisJCQlpZiAoUEFUSF9NQVggPD0gbGVuKQorCQkJCWRpZSgic3ltYm9saWMgbGluayB0b28gbG9uZzogJXMiLCBidWYpOworCQkJbmV4dF9idWZbbGVuXSA9ICdcMCc7CisJCQlidWYgPSBuZXh0X2J1ZjsKKwkJCWJ1Zl9pbmRleCA9IDEgLSBidWZfaW5kZXg7CisJCQluZXh0X2J1ZiA9IGJ1ZnNbYnVmX2luZGV4XTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisKKwlpZiAoKmN3ZCAmJiBjaGRpcihjd2QpKQorCQlkaWUgKCJDb3VsZCBub3QgY2hhbmdlIGJhY2sgdG8gJyVzJyIsIGN3ZCk7CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3B3ZF9jd2Qodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBjd2RbUEFUSF9NQVggKyAxXTsKKwljaGFyICpwd2Q7CisJc3RydWN0IHN0YXQgY3dkX3N0YXQsIHB3ZF9zdGF0OworCWlmIChnZXRjd2QoY3dkLCBQQVRIX01BWCkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcHdkID0gZ2V0ZW52KCJQV0QiKTsKKwlpZiAocHdkICYmIHN0cmNtcChwd2QsIGN3ZCkpIHsKKwkJc3RhdChjd2QsICZjd2Rfc3RhdCk7CisJCWlmICghc3RhdChwd2QsICZwd2Rfc3RhdCkgJiYKKwkJICAgIHB3ZF9zdGF0LnN0X2RldiA9PSBjd2Rfc3RhdC5zdF9kZXYgJiYKKwkJICAgIHB3ZF9zdGF0LnN0X2lubyA9PSBjd2Rfc3RhdC5zdF9pbm8pIHsKKwkJCXN0cmxjcHkoY3dkLCBwd2QsIFBBVEhfTUFYKTsKKwkJfQorCX0KKwlyZXR1cm4gY3dkOworfQorCitjb25zdCBjaGFyICptYWtlX25vbnJlbGF0aXZlX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVggKyAxXTsKKworCWlmIChpc19hYnNvbHV0ZV9wYXRoKHBhdGgpKSB7CisJCWlmIChzdHJsY3B5KGJ1ZiwgcGF0aCwgUEFUSF9NQVgpID49IFBBVEhfTUFYKQorCQkJZGllKCJUb28gbG9uZyBwYXRoOiAlLipzIiwgNjAsIHBhdGgpOworCX0gZWxzZSB7CisJCWNvbnN0IGNoYXIgKmN3ZCA9IGdldF9wd2RfY3dkKCk7CisJCWlmICghY3dkKQorCQkJZGllKCJDYW5ub3QgZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCWlmIChzbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMiLCBjd2QsIHBhdGgpID49IFBBVEhfTUFYKQorCQkJZGllKCJUb28gbG9uZyBwYXRoOiAlLipzIiwgNjAsIHBhdGgpOworCX0KKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2FsaWFzLmMgYi90b29scy9wZXJmL3V0aWwvYWxpYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjNkZDJiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2FsaWFzLmMKQEAgLTAsMCArMSw3NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICphbGlhc19rZXk7CitzdGF0aWMgY2hhciAqYWxpYXNfdmFsOworCitzdGF0aWMgaW50IGFsaWFzX2xvb2t1cF9jYihjb25zdCBjaGFyICprLCBjb25zdCBjaGFyICp2LCB2b2lkICpjYikKK3sKKwlpZiAoIXByZWZpeGNtcChrLCAiYWxpYXMuIikgJiYgIXN0cmNtcChrKzYsIGFsaWFzX2tleSkpIHsKKwkJaWYgKCF2KQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKGspOworCQlhbGlhc192YWwgPSBzdHJkdXAodik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworY2hhciAqYWxpYXNfbG9va3VwKGNvbnN0IGNoYXIgKmFsaWFzKQoreworCWFsaWFzX2tleSA9IGFsaWFzOworCWFsaWFzX3ZhbCA9IE5VTEw7CisJcGVyZl9jb25maWcoYWxpYXNfbG9va3VwX2NiLCBOVUxMKTsKKwlyZXR1cm4gYWxpYXNfdmFsOworfQorCitpbnQgc3BsaXRfY21kbGluZShjaGFyICpjbWRsaW5lLCBjb25zdCBjaGFyICoqKmFyZ3YpCit7CisJaW50IHNyYywgZHN0LCBjb3VudCA9IDAsIHNpemUgPSAxNjsKKwljaGFyIHF1b3RlZCA9IDA7CisKKwkqYXJndiA9IG1hbGxvYyhzaXplb2YoY2hhciopICogc2l6ZSk7CisKKwkvKiBzcGxpdCBhbGlhc19zdHJpbmcgKi8KKwkoKmFyZ3YpW2NvdW50KytdID0gY21kbGluZTsKKwlmb3IgKHNyYyA9IGRzdCA9IDA7IGNtZGxpbmVbc3JjXTspIHsKKwkJY2hhciBjID0gY21kbGluZVtzcmNdOworCQlpZiAoIXF1b3RlZCAmJiBpc3NwYWNlKGMpKSB7CisJCQljbWRsaW5lW2RzdCsrXSA9IDA7CisJCQl3aGlsZSAoY21kbGluZVsrK3NyY10KKwkJCQkJJiYgaXNzcGFjZShjbWRsaW5lW3NyY10pKQorCQkJCTsgLyogc2tpcCAqLworCQkJaWYgKGNvdW50ID49IHNpemUpIHsKKwkJCQlzaXplICs9IDE2OworCQkJCSphcmd2ID0gcmVhbGxvYygqYXJndiwgc2l6ZW9mKGNoYXIqKSAqIHNpemUpOworCQkJfQorCQkJKCphcmd2KVtjb3VudCsrXSA9IGNtZGxpbmUgKyBkc3Q7CisJCX0gZWxzZSBpZiAoIXF1b3RlZCAmJiAoYyA9PSAnXCcnIHx8IGMgPT0gJyInKSkgeworCQkJcXVvdGVkID0gYzsKKwkJCXNyYysrOworCQl9IGVsc2UgaWYgKGMgPT0gcXVvdGVkKSB7CisJCQlxdW90ZWQgPSAwOworCQkJc3JjKys7CisJCX0gZWxzZSB7CisJCQlpZiAoYyA9PSAnXFwnICYmIHF1b3RlZCAhPSAnXCcnKSB7CisJCQkJc3JjKys7CisJCQkJYyA9IGNtZGxpbmVbc3JjXTsKKwkJCQlpZiAoIWMpIHsKKwkJCQkJZnJlZSgqYXJndik7CisJCQkJCSphcmd2ID0gTlVMTDsKKwkJCQkJcmV0dXJuIGVycm9yKCJjbWRsaW5lIGVuZHMgd2l0aCBcXCIpOworCQkJCX0KKwkJCX0KKwkJCWNtZGxpbmVbZHN0KytdID0gYzsKKwkJCXNyYysrOworCQl9CisJfQorCisJY21kbGluZVtkc3RdID0gMDsKKworCWlmIChxdW90ZWQpIHsKKwkJZnJlZSgqYXJndik7CisJCSphcmd2ID0gTlVMTDsKKwkJcmV0dXJuIGVycm9yKCJ1bmNsb3NlZCBxdW90ZSIpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2NhY2hlLmggYi90b29scy9wZXJmL3V0aWwvY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTNkNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhY2hlLmgKQEAgLTAsMCArMSwxMTkgQEAKKyNpZm5kZWYgQ0FDSEVfSAorI2RlZmluZSBDQUNIRV9ICisKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAic3RyYnVmLmgiCisKKyNkZWZpbmUgUEVSRl9ESVJfRU5WSVJPTk1FTlQgIlBFUkZfRElSIgorI2RlZmluZSBQRVJGX1dPUktfVFJFRV9FTlZJUk9OTUVOVCAiUEVSRl9XT1JLX1RSRUUiCisjZGVmaW5lIERFRkFVTFRfUEVSRl9ESVJfRU5WSVJPTk1FTlQgIi5wZXJmIgorI2RlZmluZSBEQl9FTlZJUk9OTUVOVCAiUEVSRl9PQkpFQ1RfRElSRUNUT1JZIgorI2RlZmluZSBJTkRFWF9FTlZJUk9OTUVOVCAiUEVSRl9JTkRFWF9GSUxFIgorI2RlZmluZSBHUkFGVF9FTlZJUk9OTUVOVCAiUEVSRl9HUkFGVF9GSUxFIgorI2RlZmluZSBURU1QTEFURV9ESVJfRU5WSVJPTk1FTlQgIlBFUkZfVEVNUExBVEVfRElSIgorI2RlZmluZSBDT05GSUdfRU5WSVJPTk1FTlQgIlBFUkZfQ09ORklHIgorI2RlZmluZSBFWEVDX1BBVEhfRU5WSVJPTk1FTlQgIlBFUkZfRVhFQ19QQVRIIgorI2RlZmluZSBDRUlMSU5HX0RJUkVDVE9SSUVTX0VOVklST05NRU5UICJQRVJGX0NFSUxJTkdfRElSRUNUT1JJRVMiCisjZGVmaW5lIFBFUkZBVFRSSUJVVEVTX0ZJTEUgIi5wZXJmYXR0cmlidXRlcyIKKyNkZWZpbmUgSU5GT0FUVFJJQlVURVNfRklMRSAiaW5mby9hdHRyaWJ1dGVzIgorI2RlZmluZSBBVFRSSUJVVEVfTUFDUk9fUFJFRklYICJbYXR0cl0iCisKK3R5cGVkZWYgaW50ICgqY29uZmlnX2ZuX3QpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2b2lkICopOworZXh0ZXJuIGludCBwZXJmX2RlZmF1bHRfY29uZmlnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2b2lkICopOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19mcm9tX2ZpbGUoY29uZmlnX2ZuX3QgZm4sIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWcoY29uZmlnX2ZuX3QgZm4sIHZvaWQgKik7CitleHRlcm4gaW50IHBlcmZfcGFyc2VfdWxvbmcoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nICopOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19pbnQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGVyZl9jb25maWdfdWxvbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19ib29sX29yX2ludChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19ib29sKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWdfc3RyaW5nKGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWdfc2V0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWdfc2V0X211bHRpdmFyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gaW50IHBlcmZfY29uZmlnX3JlbmFtZV9zZWN0aW9uKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBjb25zdCBjaGFyICpwZXJmX2V0Y19wZXJmY29uZmlnKHZvaWQpOworZXh0ZXJuIGludCBjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmNiKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWdfc3lzdGVtKHZvaWQpOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19nbG9iYWwodm9pZCk7CitleHRlcm4gaW50IGNvbmZpZ19lcnJvcl9ub25ib29sKGNvbnN0IGNoYXIgKik7CitleHRlcm4gY29uc3QgY2hhciAqY29uZmlnX2V4Y2x1c2l2ZV9maWxlbmFtZTsKKworI2RlZmluZSBNQVhfUEVSRk5BTUUgKDEwMDApCitleHRlcm4gY2hhciBwZXJmX2RlZmF1bHRfZW1haWxbTUFYX1BFUkZOQU1FXTsKK2V4dGVybiBjaGFyIHBlcmZfZGVmYXVsdF9uYW1lW01BWF9QRVJGTkFNRV07CitleHRlcm4gaW50IHVzZXJfaWRlbnRfZXhwbGljaXRseV9naXZlbjsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnBlcmZfbG9nX291dHB1dF9lbmNvZGluZzsKK2V4dGVybiBjb25zdCBjaGFyICpwZXJmX21haWxtYXBfZmlsZTsKKworLyogSU8gaGVscGVyIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgbWF5YmVfZmx1c2hfb3JfZGllKEZJTEUgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgY29weV9mZChpbnQgaWZkLCBpbnQgb2ZkKTsKK2V4dGVybiBpbnQgY29weV9maWxlKGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgbW9kZSk7CitleHRlcm4gc3NpemVfdCByZWFkX2luX2Z1bGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CitleHRlcm4gc3NpemVfdCB3cml0ZV9pbl9mdWxsKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOworZXh0ZXJuIHZvaWQgd3JpdGVfb3JfZGllKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOworZXh0ZXJuIGludCB3cml0ZV9vcl93aGluZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICptc2cpOworZXh0ZXJuIGludCB3cml0ZV9vcl93aGluZV9waXBlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKm1zZyk7CitleHRlcm4gdm9pZCBmc3luY19vcl9kaWUoaW50IGZkLCBjb25zdCBjaGFyICopOworCisvKiBwYWdlci5jICovCitleHRlcm4gdm9pZCBzZXR1cF9wYWdlcih2b2lkKTsKK2V4dGVybiBjb25zdCBjaGFyICpwYWdlcl9wcm9ncmFtOworZXh0ZXJuIGludCBwYWdlcl9pbl91c2Uodm9pZCk7CitleHRlcm4gaW50IHBhZ2VyX3VzZV9jb2xvcjsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmVkaXRvcl9wcm9ncmFtOworZXh0ZXJuIGNvbnN0IGNoYXIgKmV4Y2x1ZGVzX2ZpbGU7CisKK2NoYXIgKmFsaWFzX2xvb2t1cChjb25zdCBjaGFyICphbGlhcyk7CitpbnQgc3BsaXRfY21kbGluZShjaGFyICpjbWRsaW5lLCBjb25zdCBjaGFyICoqKmFyZ3YpOworCisjZGVmaW5lIGFsbG9jX25yKHgpICgoKHgpKzE2KSozLzIpCisKKy8qCisgKiBSZWFsbG9jIHRoZSBidWZmZXIgcG9pbnRlZCBhdCBieSB2YXJpYWJsZSAneCcgc28gdGhhdCBpdCBjYW4gaG9sZAorICogYXQgbGVhc3QgJ25yJyBlbnRyaWVzOyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY3VycmVudGx5IGFsbG9jYXRlZAorICogaXMgJ2FsbG9jJywgdXNpbmcgdGhlIHN0YW5kYXJkIGdyb3dpbmcgZmFjdG9yIGFsbG9jX25yKCkgbWFjcm8uCisgKgorICogRE8gTk9UIFVTRSBhbnkgZXhwcmVzc2lvbiB3aXRoIHNpZGUtZWZmZWN0IGZvciAneCcgb3IgJ2FsbG9jJy4KKyAqLworI2RlZmluZSBBTExPQ19HUk9XKHgsIG5yLCBhbGxvYykgXAorCWRvIHsgXAorCQlpZiAoKG5yKSA+IGFsbG9jKSB7IFwKKwkJCWlmIChhbGxvY19ucihhbGxvYykgPCAobnIpKSBcCisJCQkJYWxsb2MgPSAobnIpOyBcCisJCQllbHNlIFwKKwkJCQlhbGxvYyA9IGFsbG9jX25yKGFsbG9jKTsgXAorCQkJeCA9IHhyZWFsbG9jKCh4KSwgYWxsb2MgKiBzaXplb2YoKih4KSkpOyBcCisJCX0gXAorCX0gd2hpbGUoMCkKKworCitzdGF0aWMgaW5saW5lIGludCBpc19hYnNvbHV0ZV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHBhdGhbMF0gPT0gJy8nOworfQorCitjb25zdCBjaGFyICptYWtlX2Fic29sdXRlX3BhdGgoY29uc3QgY2hhciAqcGF0aCk7Citjb25zdCBjaGFyICptYWtlX25vbnJlbGF0aXZlX3BhdGgoY29uc3QgY2hhciAqcGF0aCk7Citjb25zdCBjaGFyICptYWtlX3JlbGF0aXZlX3BhdGgoY29uc3QgY2hhciAqYWJzLCBjb25zdCBjaGFyICpiYXNlKTsKK2ludCBub3JtYWxpemVfcGF0aF9jb3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKTsKK2ludCBsb25nZXN0X2FuY2VzdG9yX2xlbmd0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpwcmVmaXhfbGlzdCk7CitjaGFyICpzdHJpcF9wYXRoX3N1ZmZpeChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzdWZmaXgpOworCitleHRlcm4gY2hhciAqbWtwYXRoKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiBjaGFyICpwZXJmX3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworLyogcGVyZl9ta3N0ZW1wKCkgLSBjcmVhdGUgdG1wIGZpbGUgaG9ub3JpbmcgVE1QRElSIHZhcmlhYmxlICovCitleHRlcm4gaW50IHBlcmZfbWtzdGVtcChjaGFyICpwYXRoLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSk7CisKK2V4dGVybiBjaGFyICpta3NucGF0aChjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBjaGFyICpwZXJmX3NucGF0aChjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBjaGFyICpwZXJmX3BhdGhkdXAoY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK2V4dGVybiBzaXplX3Qgc3RybGNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKTsKKworI2VuZGlmIC8qIENBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jb2xvci5jIGIvdG9vbHMvcGVyZi91dGlsL2NvbG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4YzIwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jb2xvci5jCkBAIC0wLDAgKzEsMjQxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorCitpbnQgcGVyZl91c2VfY29sb3JfZGVmYXVsdCA9IC0xOworCitzdGF0aWMgaW50IHBhcnNlX2NvbG9yKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2xvcl9uYW1lc1tdID0geworCQkibm9ybWFsIiwgImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLAorCQkiYmx1ZSIsICJtYWdlbnRhIiwgImN5YW4iLCAid2hpdGUiCisJfTsKKwljaGFyICplbmQ7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfbmFtZXMpOyBpKyspIHsKKwkJY29uc3QgY2hhciAqc3RyID0gY29sb3JfbmFtZXNbaV07CisJCWlmICghc3RybmNhc2VjbXAobmFtZSwgc3RyLCBsZW4pICYmICFzdHJbbGVuXSkKKwkJCXJldHVybiBpIC0gMTsKKwl9CisJaSA9IHN0cnRvbChuYW1lLCAmZW5kLCAxMCk7CisJaWYgKGVuZCAtIG5hbWUgPT0gbGVuICYmIGkgPj0gLTEgJiYgaSA8PSAyNTUpCisJCXJldHVybiBpOworCXJldHVybiAtMjsKK30KKworc3RhdGljIGludCBwYXJzZV9hdHRyKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJc3RhdGljIGNvbnN0IGludCBhdHRyX3ZhbHVlc1tdID0geyAxLCAyLCA0LCA1LCA3IH07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdHRyX25hbWVzW10gPSB7CisJCSJib2xkIiwgImRpbSIsICJ1bCIsICJibGluayIsICJyZXZlcnNlIgorCX07CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXR0cl9uYW1lcyk7IGkrKykgeworCQljb25zdCBjaGFyICpzdHIgPSBhdHRyX25hbWVzW2ldOworCQlpZiAoIXN0cm5jYXNlY21wKG5hbWUsIHN0ciwgbGVuKSAmJiAhc3RyW2xlbl0pCisJCQlyZXR1cm4gYXR0cl92YWx1ZXNbaV07CisJfQorCXJldHVybiAtMTsKK30KKwordm9pZCBjb2xvcl9wYXJzZShjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgY2hhciAqdmFyLCBjaGFyICpkc3QpCit7CisJY29sb3JfcGFyc2VfbWVtKHZhbHVlLCBzdHJsZW4odmFsdWUpLCB2YXIsIGRzdCk7Cit9CisKK3ZvaWQgY29sb3JfcGFyc2VfbWVtKGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgdmFsdWVfbGVuLCBjb25zdCBjaGFyICp2YXIsCisJCWNoYXIgKmRzdCkKK3sKKwljb25zdCBjaGFyICpwdHIgPSB2YWx1ZTsKKwlpbnQgbGVuID0gdmFsdWVfbGVuOworCWludCBhdHRyID0gLTE7CisJaW50IGZnID0gLTI7CisJaW50IGJnID0gLTI7CisKKwlpZiAoIXN0cm5jYXNlY21wKHZhbHVlLCAicmVzZXQiLCBsZW4pKSB7CisJCXN0cmNweShkc3QsIFBFUkZfQ09MT1JfUkVTRVQpOworCQlyZXR1cm47CisJfQorCisJLyogW2ZnIFtiZ11dIFthdHRyXSAqLworCXdoaWxlIChsZW4gPiAwKSB7CisJCWNvbnN0IGNoYXIgKndvcmQgPSBwdHI7CisJCWludCB2YWwsIHdvcmRsZW4gPSAwOworCisJCXdoaWxlIChsZW4gPiAwICYmICFpc3NwYWNlKHdvcmRbd29yZGxlbl0pKSB7CisJCQl3b3JkbGVuKys7CisJCQlsZW4tLTsKKwkJfQorCisJCXB0ciA9IHdvcmQgKyB3b3JkbGVuOworCQl3aGlsZSAobGVuID4gMCAmJiBpc3NwYWNlKCpwdHIpKSB7CisJCQlwdHIrKzsKKwkJCWxlbi0tOworCQl9CisKKwkJdmFsID0gcGFyc2VfY29sb3Iod29yZCwgd29yZGxlbik7CisJCWlmICh2YWwgPj0gLTEpIHsKKwkJCWlmIChmZyA9PSAtMikgeworCQkJCWZnID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGJnID09IC0yKSB7CisJCQkJYmcgPSB2YWw7CisJCQkJY29udGludWU7CisJCQl9CisJCQlnb3RvIGJhZDsKKwkJfQorCQl2YWwgPSBwYXJzZV9hdHRyKHdvcmQsIHdvcmRsZW4pOworCQlpZiAodmFsIDwgMCB8fCBhdHRyICE9IC0xKQorCQkJZ290byBiYWQ7CisJCWF0dHIgPSB2YWw7CisJfQorCisJaWYgKGF0dHIgPj0gMCB8fCBmZyA+PSAwIHx8IGJnID49IDApIHsKKwkJaW50IHNlcCA9IDA7CisKKwkJKmRzdCsrID0gJ1wwMzMnOworCQkqZHN0KysgPSAnWyc7CisJCWlmIChhdHRyID49IDApIHsKKwkJCSpkc3QrKyA9ICcwJyArIGF0dHI7CisJCQlzZXArKzsKKwkJfQorCQlpZiAoZmcgPj0gMCkgeworCQkJaWYgKHNlcCsrKQorCQkJCSpkc3QrKyA9ICc7JzsKKwkJCWlmIChmZyA8IDgpIHsKKwkJCQkqZHN0KysgPSAnMyc7CisJCQkJKmRzdCsrID0gJzAnICsgZmc7CisJCQl9IGVsc2UgeworCQkJCWRzdCArPSBzcHJpbnRmKGRzdCwgIjM4OzU7JWQiLCBmZyk7CisJCQl9CisJCX0KKwkJaWYgKGJnID49IDApIHsKKwkJCWlmIChzZXArKykKKwkJCQkqZHN0KysgPSAnOyc7CisJCQlpZiAoYmcgPCA4KSB7CisJCQkJKmRzdCsrID0gJzQnOworCQkJCSpkc3QrKyA9ICcwJyArIGJnOworCQkJfSBlbHNlIHsKKwkJCQlkc3QgKz0gc3ByaW50Zihkc3QsICI0ODs1OyVkIiwgYmcpOworCQkJfQorCQl9CisJCSpkc3QrKyA9ICdtJzsKKwl9CisJKmRzdCA9IDA7CisJcmV0dXJuOworYmFkOgorCWRpZSgiYmFkIGNvbG9yIHZhbHVlICclLipzJyBmb3IgdmFyaWFibGUgJyVzJyIsIHZhbHVlX2xlbiwgdmFsdWUsIHZhcik7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19jb2xvcmJvb2woY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IHN0ZG91dF9pc190dHkpCit7CisJaWYgKHZhbHVlKSB7CisJCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgIm5ldmVyIikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiYWx3YXlzIikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiYXV0byIpKQorCQkJZ290byBhdXRvX2NvbG9yOworCX0KKworCS8qIE1pc3Npbmcgb3IgZXhwbGljaXQgZmFsc2UgdG8gdHVybiBvZmYgY29sb3JpemF0aW9uICovCisJaWYgKCFwZXJmX2NvbmZpZ19ib29sKHZhciwgdmFsdWUpKQorCQlyZXR1cm4gMDsKKworCS8qIGFueSBub3JtYWwgdHJ1dGggdmFsdWUgZGVmYXVsdHMgdG8gJ2F1dG8nICovCisgYXV0b19jb2xvcjoKKwlpZiAoc3Rkb3V0X2lzX3R0eSA8IDApCisJCXN0ZG91dF9pc190dHkgPSBpc2F0dHkoMSk7CisJaWYgKHN0ZG91dF9pc190dHkgfHwgKHBhZ2VyX2luX3VzZSgpICYmIHBhZ2VyX3VzZV9jb2xvcikpIHsKKwkJY2hhciAqdGVybSA9IGdldGVudigiVEVSTSIpOworCQlpZiAodGVybSAmJiBzdHJjbXAodGVybSwgImR1bWIiKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHBlcmZfY29sb3JfZGVmYXVsdF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqY2IpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiY29sb3IudWkiKSkgeworCQlwZXJmX3VzZV9jb2xvcl9kZWZhdWx0ID0gcGVyZl9jb25maWdfY29sb3Jib29sKHZhciwgdmFsdWUsIC0xKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHBlcmZfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSwgY2IpOworfQorCitzdGF0aWMgaW50IGNvbG9yX3ZmcHJpbnRmKEZJTEUgKmZwLCBjb25zdCBjaGFyICpjb2xvciwgY29uc3QgY2hhciAqZm10LAorCQl2YV9saXN0IGFyZ3MsIGNvbnN0IGNoYXIgKnRyYWlsKQoreworCWludCByID0gMDsKKworCS8qCisJICogQXV0by1kZXRlY3Q6CisJICovCisJaWYgKHBlcmZfdXNlX2NvbG9yX2RlZmF1bHQgPCAwKSB7CisJCWlmIChpc2F0dHkoMSkgfHwgcGFnZXJfaW5fdXNlKCkpCisJCQlwZXJmX3VzZV9jb2xvcl9kZWZhdWx0ID0gMTsKKwkJZWxzZQorCQkJcGVyZl91c2VfY29sb3JfZGVmYXVsdCA9IDA7CisJfQorCisJaWYgKHBlcmZfdXNlX2NvbG9yX2RlZmF1bHQgJiYgKmNvbG9yKQorCQlyICs9IGZwcmludGYoZnAsICIlcyIsIGNvbG9yKTsKKwlyICs9IHZmcHJpbnRmKGZwLCBmbXQsIGFyZ3MpOworCWlmIChwZXJmX3VzZV9jb2xvcl9kZWZhdWx0ICYmICpjb2xvcikKKwkJciArPSBmcHJpbnRmKGZwLCAiJXMiLCBQRVJGX0NPTE9SX1JFU0VUKTsKKwlpZiAodHJhaWwpCisJCXIgKz0gZnByaW50ZihmcCwgIiVzIiwgdHJhaWwpOworCXJldHVybiByOworfQorCisKKworaW50IGNvbG9yX2ZwcmludGYoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmNvbG9yLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHI7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXIgPSBjb2xvcl92ZnByaW50ZihmcCwgY29sb3IsIGZtdCwgYXJncywgTlVMTCk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByOworfQorCitpbnQgY29sb3JfZnByaW50Zl9sbihGSUxFICpmcCwgY29uc3QgY2hhciAqY29sb3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgcjsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXIgPSBjb2xvcl92ZnByaW50ZihmcCwgY29sb3IsIGZtdCwgYXJncywgIlxuIik7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzcGxpdHMgdGhlIGJ1ZmZlciBieSBuZXdsaW5lcyBhbmQgY29sb3JzIHRoZSBsaW5lcyBpbmRpdmlkdWFsbHkuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBjb2xvcl9md3JpdGVfbGluZXMoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmNvbG9yLAorCQlzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlpZiAoISpjb2xvcikKKwkJcmV0dXJuIGZ3cml0ZShidWYsIGNvdW50LCAxLCBmcCkgIT0gMTsKKwl3aGlsZSAoY291bnQpIHsKKwkJY2hhciAqcCA9IG1lbWNocihidWYsICdcbicsIGNvdW50KTsKKwkJaWYgKHAgIT0gYnVmICYmIChmcHV0cyhjb2xvciwgZnApIDwgMCB8fAorCQkJCWZ3cml0ZShidWYsIHAgPyBwIC0gYnVmIDogY291bnQsIDEsIGZwKSAhPSAxIHx8CisJCQkJZnB1dHMoUEVSRl9DT0xPUl9SRVNFVCwgZnApIDwgMCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghcCkKKwkJCXJldHVybiAwOworCQlpZiAoZnB1dGMoJ1xuJywgZnApIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJY291bnQgLT0gcCArIDEgLSBidWY7CisJCWJ1ZiA9IHAgKyAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY29sb3IuaCBiL3Rvb2xzL3BlcmYvdXRpbC9jb2xvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYmZkMzcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvY29sb3IuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIENPTE9SX0gKKyNkZWZpbmUgQ09MT1JfSAorCisvKiAiXDAzM1sxOzM4OzU7Mnh4OzQ4OzU7Mnh4bVwwIiBpcyAyMyBieXRlcyAqLworI2RlZmluZSBDT0xPUl9NQVhMRU4gMjQKKworI2RlZmluZSBQRVJGX0NPTE9SX05PUk1BTAkiIgorI2RlZmluZSBQRVJGX0NPTE9SX1JFU0VUCSJcMDMzW20iCisjZGVmaW5lIFBFUkZfQ09MT1JfQk9MRAkJIlwwMzNbMW0iCisjZGVmaW5lIFBFUkZfQ09MT1JfUkVECQkiXDAzM1szMW0iCisjZGVmaW5lIFBFUkZfQ09MT1JfR1JFRU4JIlwwMzNbMzJtIgorI2RlZmluZSBQRVJGX0NPTE9SX1lFTExPVwkiXDAzM1szM20iCisjZGVmaW5lIFBFUkZfQ09MT1JfQkxVRQkJIlwwMzNbMzRtIgorI2RlZmluZSBQRVJGX0NPTE9SX01BR0VOVEEJIlwwMzNbMzVtIgorI2RlZmluZSBQRVJGX0NPTE9SX0NZQU4JCSJcMDMzWzM2bSIKKyNkZWZpbmUgUEVSRl9DT0xPUl9CR19SRUQJIlwwMzNbNDFtIgorCisvKgorICogVGhpcyB2YXJpYWJsZSBzdG9yZXMgdGhlIHZhbHVlIG9mIGNvbG9yLnVpCisgKi8KK2V4dGVybiBpbnQgcGVyZl91c2VfY29sb3JfZGVmYXVsdDsKKworCisvKgorICogVXNlIHRoaXMgaW5zdGVhZCBvZiBwZXJmX2RlZmF1bHRfY29uZmlnIGlmIHlvdSBuZWVkIHRoZSB2YWx1ZSBvZiBjb2xvci51aS4KKyAqLworaW50IHBlcmZfY29sb3JfZGVmYXVsdF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqY2IpOworCitpbnQgcGVyZl9jb25maWdfY29sb3Jib29sKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIGludCBzdGRvdXRfaXNfdHR5KTsKK3ZvaWQgY29sb3JfcGFyc2UoY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKnZhciwgY2hhciAqZHN0KTsKK3ZvaWQgY29sb3JfcGFyc2VfbWVtKGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgbGVuLCBjb25zdCBjaGFyICp2YXIsIGNoYXIgKmRzdCk7CitpbnQgY29sb3JfZnByaW50ZihGSUxFICpmcCwgY29uc3QgY2hhciAqY29sb3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCBjb2xvcl9mcHJpbnRmX2xuKEZJTEUgKmZwLCBjb25zdCBjaGFyICpjb2xvciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworaW50IGNvbG9yX2Z3cml0ZV9saW5lcyhGSUxFICpmcCwgY29uc3QgY2hhciAqY29sb3IsIHNpemVfdCBjb3VudCwgY29uc3QgY2hhciAqYnVmKTsKKworI2VuZGlmIC8qIENPTE9SX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jb25maWcuYyBiL3Rvb2xzL3BlcmYvdXRpbC9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQxM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NvbmZpZy5jCkBAIC0wLDAgKzEsODczIEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICogQ29weXJpZ2h0IChDKSBKb2hhbm5lcyBTY2hpbmRlbGluLCAyMDA1CisgKgorICovCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKworI2RlZmluZSBNQVhOQU1FICgyNTYpCisKK3N0YXRpYyBGSUxFICpjb25maWdfZmlsZTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25maWdfZmlsZV9uYW1lOworc3RhdGljIGludCBjb25maWdfbGluZW5yOworc3RhdGljIGludCBjb25maWdfZmlsZV9lb2Y7CisKK2NvbnN0IGNoYXIgKmNvbmZpZ19leGNsdXNpdmVfZmlsZW5hbWUgPSBOVUxMOworCitzdGF0aWMgaW50IGdldF9uZXh0X2NoYXIodm9pZCkKK3sKKwlpbnQgYzsKKwlGSUxFICpmOworCisJYyA9ICdcbic7CisJaWYgKChmID0gY29uZmlnX2ZpbGUpICE9IE5VTEwpIHsKKwkJYyA9IGZnZXRjKGYpOworCQlpZiAoYyA9PSAnXHInKSB7CisJCQkvKiBET1MgbGlrZSBzeXN0ZW1zICovCisJCQljID0gZmdldGMoZik7CisJCQlpZiAoYyAhPSAnXG4nKSB7CisJCQkJdW5nZXRjKGMsIGYpOworCQkJCWMgPSAnXHInOworCQkJfQorCQl9CisJCWlmIChjID09ICdcbicpCisJCQljb25maWdfbGluZW5yKys7CisJCWlmIChjID09IEVPRikgeworCQkJY29uZmlnX2ZpbGVfZW9mID0gMTsKKwkJCWMgPSAnXG4nOworCQl9CisJfQorCXJldHVybiBjOworfQorCitzdGF0aWMgY2hhciAqcGFyc2VfdmFsdWUodm9pZCkKK3sKKwlzdGF0aWMgY2hhciB2YWx1ZVsxMDI0XTsKKwlpbnQgcXVvdGUgPSAwLCBjb21tZW50ID0gMCwgbGVuID0gMCwgc3BhY2UgPSAwOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGxlbiA+PSBzaXplb2YodmFsdWUpIC0gMSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpZiAocXVvdGUpCisJCQkJcmV0dXJuIE5VTEw7CisJCQl2YWx1ZVtsZW5dID0gMDsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCQlpZiAoY29tbWVudCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaXNzcGFjZShjKSAmJiAhcXVvdGUpIHsKKwkJCXNwYWNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcXVvdGUpIHsKKwkJCWlmIChjID09ICc7JyB8fCBjID09ICcjJykgeworCQkJCWNvbW1lbnQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChzcGFjZSkgeworCQkJaWYgKGxlbikKKwkJCQl2YWx1ZVtsZW4rK10gPSAnICc7CisJCQlzcGFjZSA9IDA7CisJCX0KKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXG4nOgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSAndCc6CisJCQkJYyA9ICdcdCc7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQljID0gJ1xiJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJCWMgPSAnXG4nOworCQkJCWJyZWFrOworCQkJLyogU29tZSBjaGFyYWN0ZXJzIGVzY2FwZSBhcyB0aGVtc2VsdmVzICovCisJCQljYXNlICdcXCc6IGNhc2UgJyInOgorCQkJCWJyZWFrOworCQkJLyogUmVqZWN0IHVua25vd24gZXNjYXBlIHNlcXVlbmNlcyAqLworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXZhbHVlW2xlbisrXSA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnIicpIHsKKwkJCXF1b3RlID0gMS1xdW90ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhbHVlW2xlbisrXSA9IGM7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBpc2tleWNoYXIoaW50IGMpCit7CisJcmV0dXJuIGlzYWxudW0oYykgfHwgYyA9PSAnLSc7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3ZhbHVlKGNvbmZpZ19mbl90IGZuLCB2b2lkICpkYXRhLCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBjOworCWNoYXIgKnZhbHVlOworCisJLyogR2V0IHRoZSBmdWxsIG5hbWUgKi8KKwlmb3IgKDs7KSB7CisJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChjb25maWdfZmlsZV9lb2YpCisJCQlicmVhazsKKwkJaWYgKCFpc2tleWNoYXIoYykpCisJCQlicmVhazsKKwkJbmFtZVtsZW4rK10gPSB0b2xvd2VyKGMpOworCQlpZiAobGVuID49IE1BWE5BTUUpCisJCQlyZXR1cm4gLTE7CisJfQorCW5hbWVbbGVuXSA9IDA7CisJd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKKwkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKworCXZhbHVlID0gTlVMTDsKKwlpZiAoYyAhPSAnXG4nKSB7CisJCWlmIChjICE9ICc9JykKKwkJCXJldHVybiAtMTsKKwkJdmFsdWUgPSBwYXJzZV92YWx1ZSgpOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gZm4obmFtZSwgdmFsdWUsIGRhdGEpOworfQorCitzdGF0aWMgaW50IGdldF9leHRlbmRlZF9iYXNlX3ZhcihjaGFyICpuYW1lLCBpbnQgYmFzZWxlbiwgaW50IGMpCit7CisJZG8geworCQlpZiAoYyA9PSAnXG4nKQorCQkJcmV0dXJuIC0xOworCQljID0gZ2V0X25leHRfY2hhcigpOworCX0gd2hpbGUgKGlzc3BhY2UoYykpOworCisJLyogV2UgcmVxdWlyZSB0aGUgZm9ybWF0IHRvIGJlICdbYmFzZSAiZXh0ZW5zaW9uIl0nICovCisJaWYgKGMgIT0gJyInKQorCQlyZXR1cm4gLTE7CisJbmFtZVtiYXNlbGVuKytdID0gJy4nOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMgPT0gJyInKQorCQkJYnJlYWs7CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQluYW1lW2Jhc2VsZW4rK10gPSBjOworCQlpZiAoYmFzZWxlbiA+IE1BWE5BTUUgLyAyKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIEZpbmFsICddJyAqLworCWlmIChnZXRfbmV4dF9jaGFyKCkgIT0gJ10nKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGJhc2VsZW47Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jhc2VfdmFyKGNoYXIgKm5hbWUpCit7CisJaW50IGJhc2VsZW4gPSAwOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGNvbmZpZ19maWxlX2VvZikKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMgPT0gJ10nKQorCQkJcmV0dXJuIGJhc2VsZW47CisJCWlmIChpc3NwYWNlKGMpKQorCQkJcmV0dXJuIGdldF9leHRlbmRlZF9iYXNlX3ZhcihuYW1lLCBiYXNlbGVuLCBjKTsKKwkJaWYgKCFpc2tleWNoYXIoYykgJiYgYyAhPSAnLicpCisJCQlyZXR1cm4gLTE7CisJCWlmIChiYXNlbGVuID4gTUFYTkFNRSAvIDIpCisJCQlyZXR1cm4gLTE7CisJCW5hbWVbYmFzZWxlbisrXSA9IHRvbG93ZXIoYyk7CisJfQorfQorCitzdGF0aWMgaW50IHBlcmZfcGFyc2VfZmlsZShjb25maWdfZm5fdCBmbiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgY29tbWVudCA9IDA7CisJaW50IGJhc2VsZW4gPSAwOworCXN0YXRpYyBjaGFyIHZhcltNQVhOQU1FXTsKKworCS8qIFUrRkVGRiBCeXRlIE9yZGVyIE1hcmsgaW4gVVRGOCAqLworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICp1dGY4X2JvbSA9ICh1bnNpZ25lZCBjaGFyICopICJceGVmXHhiYlx4YmYiOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJvbXB0ciA9IHV0ZjhfYm9tOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGJvbXB0ciAmJiAqYm9tcHRyKSB7CisJCQkvKiBXZSBhcmUgYXQgdGhlIGZpbGUgYmVnaW5uaW5nOyBza2lwIFVURjgtZW5jb2RlZCBCT00KKwkJCSAqIGlmIHByZXNlbnQuIFNhbmUgZWRpdG9ycyB3b24ndCBwdXQgdGhpcyBpbiBvbiB0aGVpcgorCQkJICogb3duLCBidXQgZS5nLiBXaW5kb3dzIE5vdGVwYWQgd2lsbCBkbyBpdCBoYXBwaWx5LiAqLworCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSBjID09ICpib21wdHIpIHsKKwkJCQlib21wdHIrKzsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRG8gbm90IHRvbGVyYXRlIHBhcnRpYWwgQk9NLiAqLworCQkJCWlmIChib21wdHIgIT0gdXRmOF9ib20pCisJCQkJCWJyZWFrOworCQkJCS8qIE5vIEJPTSBhdCBmaWxlIGJlZ2lubmluZy4gQ29vbC4gKi8KKwkJCQlib21wdHIgPSBOVUxMOworCQkJfQorCQl9CisJCWlmIChjID09ICdcbicpIHsKKwkJCWlmIChjb25maWdfZmlsZV9lb2YpCisJCQkJcmV0dXJuIDA7CisJCQljb21tZW50ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb21tZW50IHx8IGlzc3BhY2UoYykpCisJCQljb250aW51ZTsKKwkJaWYgKGMgPT0gJyMnIHx8IGMgPT0gJzsnKSB7CisJCQljb21tZW50ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdbJykgeworCQkJYmFzZWxlbiA9IGdldF9iYXNlX3Zhcih2YXIpOworCQkJaWYgKGJhc2VsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJCXZhcltiYXNlbGVuKytdID0gJy4nOworCQkJdmFyW2Jhc2VsZW5dID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaXNhbHBoYShjKSkKKwkJCWJyZWFrOworCQl2YXJbYmFzZWxlbl0gPSB0b2xvd2VyKGMpOworCQlpZiAoZ2V0X3ZhbHVlKGZuLCBkYXRhLCB2YXIsIGJhc2VsZW4rMSkgPCAwKQorCQkJYnJlYWs7CisJfQorCWRpZSgiYmFkIGNvbmZpZyBmaWxlIGxpbmUgJWQgaW4gJXMiLCBjb25maWdfbGluZW5yLCBjb25maWdfZmlsZV9uYW1lKTsKK30KKworc3RhdGljIGludCBwYXJzZV91bml0X2ZhY3Rvcihjb25zdCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgKnZhbCkKK3sKKwlpZiAoISplbmQpCisJCXJldHVybiAxOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKGVuZCwgImsiKSkgeworCQkqdmFsICo9IDEwMjQ7CisJCXJldHVybiAxOworCX0KKwllbHNlIGlmICghc3RyY2FzZWNtcChlbmQsICJtIikpIHsKKwkJKnZhbCAqPSAxMDI0ICogMTAyNDsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UgaWYgKCFzdHJjYXNlY21wKGVuZCwgImciKSkgeworCQkqdmFsICo9IDEwMjQgKiAxMDI0ICogMTAyNDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcmZfcGFyc2VfbG9uZyhjb25zdCBjaGFyICp2YWx1ZSwgbG9uZyAqcmV0KQoreworCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKKwkJY2hhciAqZW5kOworCQlsb25nIHZhbCA9IHN0cnRvbCh2YWx1ZSwgJmVuZCwgMCk7CisJCXVuc2lnbmVkIGxvbmcgZmFjdG9yID0gMTsKKwkJaWYgKCFwYXJzZV91bml0X2ZhY3RvcihlbmQsICZmYWN0b3IpKQorCQkJcmV0dXJuIDA7CisJCSpyZXQgPSB2YWwgKiBmYWN0b3I7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHBlcmZfcGFyc2VfdWxvbmcoY29uc3QgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGxvbmcgKnJldCkKK3sKKwlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCWNoYXIgKmVuZDsKKwkJdW5zaWduZWQgbG9uZyB2YWwgPSBzdHJ0b3VsKHZhbHVlLCAmZW5kLCAwKTsKKwkJaWYgKCFwYXJzZV91bml0X2ZhY3RvcihlbmQsICZ2YWwpKQorCQkJcmV0dXJuIDA7CisJCSpyZXQgPSB2YWw7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGllX2JhZF9jb25maWcoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoY29uZmlnX2ZpbGVfbmFtZSkKKwkJZGllKCJiYWQgY29uZmlnIHZhbHVlIGZvciAnJXMnIGluICVzIiwgbmFtZSwgY29uZmlnX2ZpbGVfbmFtZSk7CisJZGllKCJiYWQgY29uZmlnIHZhbHVlIGZvciAnJXMnIiwgbmFtZSk7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19pbnQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJbG9uZyByZXQgPSAwOworCWlmICghcGVyZl9wYXJzZV9sb25nKHZhbHVlLCAmcmV0KSkKKwkJZGllX2JhZF9jb25maWcobmFtZSk7CisJcmV0dXJuIHJldDsKK30KKwordW5zaWduZWQgbG9uZyBwZXJmX2NvbmZpZ191bG9uZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwlpZiAoIXBlcmZfcGFyc2VfdWxvbmcodmFsdWUsICZyZXQpKQorCQlkaWVfYmFkX2NvbmZpZyhuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcGVyZl9jb25maWdfYm9vbF9vcl9pbnQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGludCAqaXNfYm9vbCkKK3sKKwkqaXNfYm9vbCA9IDE7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIDE7CisJaWYgKCEqdmFsdWUpCisJCXJldHVybiAwOworCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInllcyIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAib24iKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiZmFsc2UiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgIm5vIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJvZmYiKSkKKwkJcmV0dXJuIDA7CisJKmlzX2Jvb2wgPSAwOworCXJldHVybiBwZXJmX2NvbmZpZ19pbnQobmFtZSwgdmFsdWUpOworfQorCitpbnQgcGVyZl9jb25maWdfYm9vbChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpbnQgZGlzY2FyZDsKKwlyZXR1cm4gISFwZXJmX2NvbmZpZ19ib29sX29yX2ludChuYW1lLCB2YWx1ZSwgJmRpc2NhcmQpOworfQorCitpbnQgcGVyZl9jb25maWdfc3RyaW5nKGNvbnN0IGNoYXIgKipkZXN0LCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghdmFsdWUpCisJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCSpkZXN0ID0gc3RyZHVwKHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZXJmX2RlZmF1bHRfY29yZV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwkvKiBBZGQgb3RoZXIgY29uZmlnIHZhcmlhYmxlcyBoZXJlIGFuZCB0byBEb2N1bWVudGF0aW9uL2NvbmZpZy50eHQuICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBwZXJmX2RlZmF1bHRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmR1bW15KQoreworCWlmICghcHJlZml4Y21wKHZhciwgImNvcmUuIikpCisJCXJldHVybiBwZXJmX2RlZmF1bHRfY29yZV9jb25maWcodmFyLCB2YWx1ZSk7CisKKwkvKiBBZGQgb3RoZXIgY29uZmlnIHZhcmlhYmxlcyBoZXJlIGFuZCB0byBEb2N1bWVudGF0aW9uL2NvbmZpZy50eHQuICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19mcm9tX2ZpbGUoY29uZmlnX2ZuX3QgZm4sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpkYXRhKQoreworCWludCByZXQ7CisJRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCisJcmV0ID0gLTE7CisJaWYgKGYpIHsKKwkJY29uZmlnX2ZpbGUgPSBmOworCQljb25maWdfZmlsZV9uYW1lID0gZmlsZW5hbWU7CisJCWNvbmZpZ19saW5lbnIgPSAxOworCQljb25maWdfZmlsZV9lb2YgPSAwOworCQlyZXQgPSBwZXJmX3BhcnNlX2ZpbGUoZm4sIGRhdGEpOworCQlmY2xvc2UoZik7CisJCWNvbmZpZ19maWxlX25hbWUgPSBOVUxMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyICpwZXJmX2V0Y19wZXJmY29uZmlnKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN5c3RlbV93aWRlOworCWlmICghc3lzdGVtX3dpZGUpCisJCXN5c3RlbV93aWRlID0gc3lzdGVtX3BhdGgoRVRDX1BFUkZDT05GSUcpOworCXJldHVybiBzeXN0ZW1fd2lkZTsKK30KKworc3RhdGljIGludCBwZXJmX2Vudl9ib29sKGNvbnN0IGNoYXIgKmssIGludCBkZWYpCit7CisJY29uc3QgY2hhciAqdiA9IGdldGVudihrKTsKKwlyZXR1cm4gdiA/IHBlcmZfY29uZmlnX2Jvb2woaywgdikgOiBkZWY7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19zeXN0ZW0odm9pZCkKK3sKKwlyZXR1cm4gIXBlcmZfZW52X2Jvb2woIlBFUkZfQ09ORklHX05PU1lTVEVNIiwgMCk7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19nbG9iYWwodm9pZCkKK3sKKwlyZXR1cm4gIXBlcmZfZW52X2Jvb2woIlBFUkZfQ09ORklHX05PR0xPQkFMIiwgMCk7Cit9CisKK2ludCBwZXJmX2NvbmZpZyhjb25maWdfZm5fdCBmbiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMCwgZm91bmQgPSAwOworCWNoYXIgKnJlcG9fY29uZmlnID0gTlVMTDsKKwljb25zdCBjaGFyICpob21lID0gTlVMTDsKKworCS8qIFNldHRpbmcgJFBFUkZfQ09ORklHIG1ha2VzIHBlcmYgcmVhZCBfb25seV8gdGhlIGdpdmVuIGNvbmZpZyBmaWxlLiAqLworCWlmIChjb25maWdfZXhjbHVzaXZlX2ZpbGVuYW1lKQorCQlyZXR1cm4gcGVyZl9jb25maWdfZnJvbV9maWxlKGZuLCBjb25maWdfZXhjbHVzaXZlX2ZpbGVuYW1lLCBkYXRhKTsKKwlpZiAocGVyZl9jb25maWdfc3lzdGVtKCkgJiYgIWFjY2VzcyhwZXJmX2V0Y19wZXJmY29uZmlnKCksIFJfT0spKSB7CisJCXJldCArPSBwZXJmX2NvbmZpZ19mcm9tX2ZpbGUoZm4sIHBlcmZfZXRjX3BlcmZjb25maWcoKSwKKwkJCQkJICAgIGRhdGEpOworCQlmb3VuZCArPSAxOworCX0KKworCWhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKKwlpZiAocGVyZl9jb25maWdfZ2xvYmFsKCkgJiYgaG9tZSkgeworCQljaGFyICp1c2VyX2NvbmZpZyA9IHN0cmR1cChta3BhdGgoIiVzLy5wZXJmY29uZmlnIiwgaG9tZSkpOworCQlpZiAoIWFjY2Vzcyh1c2VyX2NvbmZpZywgUl9PSykpIHsKKwkJCXJldCArPSBwZXJmX2NvbmZpZ19mcm9tX2ZpbGUoZm4sIHVzZXJfY29uZmlnLCBkYXRhKTsKKwkJCWZvdW5kICs9IDE7CisJCX0KKwkJZnJlZSh1c2VyX2NvbmZpZyk7CisJfQorCisJcmVwb19jb25maWcgPSBwZXJmX3BhdGhkdXAoImNvbmZpZyIpOworCWlmICghYWNjZXNzKHJlcG9fY29uZmlnLCBSX09LKSkgeworCQlyZXQgKz0gcGVyZl9jb25maWdfZnJvbV9maWxlKGZuLCByZXBvX2NvbmZpZywgZGF0YSk7CisJCWZvdW5kICs9IDE7CisJfQorCWZyZWUocmVwb19jb25maWcpOworCWlmIChmb3VuZCA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZpbmQgYWxsIHRoZSBzdHVmZiBmb3IgcGVyZl9jb25maWdfc2V0KCkgYmVsb3cuCisgKi8KKworI2RlZmluZSBNQVhfTUFUQ0hFUyA1MTIKKworc3RhdGljIHN0cnVjdCB7CisJaW50IGJhc2VsZW47CisJY2hhcioga2V5OworCWludCBkb19ub3RfbWF0Y2g7CisJcmVnZXhfdCogdmFsdWVfcmVnZXg7CisJaW50IG11bHRpX3JlcGxhY2U7CisJc2l6ZV90IG9mZnNldFtNQVhfTUFUQ0hFU107CisJZW51bSB7IFNUQVJULCBTRUNUSU9OX1NFRU4sIFNFQ1RJT05fRU5EX1NFRU4sIEtFWV9TRUVOIH0gc3RhdGU7CisJaW50IHNlZW47Cit9IHN0b3JlOworCitzdGF0aWMgaW50IG1hdGNoZXMoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlyZXR1cm4gIXN0cmNtcChrZXksIHN0b3JlLmtleSkgJiYKKwkJKHN0b3JlLnZhbHVlX3JlZ2V4ID09IE5VTEwgfHwKKwkJIChzdG9yZS5kb19ub3RfbWF0Y2ggXgorCQkgICFyZWdleGVjKHN0b3JlLnZhbHVlX3JlZ2V4LCB2YWx1ZSwgMCwgTlVMTCwgMCkpKTsKK30KKworc3RhdGljIGludCBzdG9yZV9hdXgoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSwgdm9pZCAqY2IpCit7CisJY29uc3QgY2hhciAqZXA7CisJc2l6ZV90IHNlY3Rpb25fbGVuOworCisJc3dpdGNoIChzdG9yZS5zdGF0ZSkgeworCWNhc2UgS0VZX1NFRU46CisJCWlmIChtYXRjaGVzKGtleSwgdmFsdWUpKSB7CisJCQlpZiAoc3RvcmUuc2VlbiA9PSAxICYmIHN0b3JlLm11bHRpX3JlcGxhY2UgPT0gMCkgeworCQkJCXdhcm5pbmcoIiVzIGhhcyBtdWx0aXBsZSB2YWx1ZXMiLCBrZXkpOworCQkJfSBlbHNlIGlmIChzdG9yZS5zZWVuID49IE1BWF9NQVRDSEVTKSB7CisJCQkJZXJyb3IoInRvbyBtYW55IG1hdGNoZXMgZm9yICVzIiwga2V5KTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkJc3RvcmUuc2VlbisrOworCQl9CisJCWJyZWFrOworCWNhc2UgU0VDVElPTl9TRUVOOgorCQkvKgorCQkgKiBXaGF0IHdlIGFyZSBsb29raW5nIGZvciBpcyBpbiBzdG9yZS5rZXkgKGJvdGgKKwkJICogc2VjdGlvbiBhbmQgdmFyKSwgYW5kIGl0cyBzZWN0aW9uIHBhcnQgaXMgYmFzZWxlbgorCQkgKiBsb25nLiAgV2UgZm91bmQga2V5IChhZ2FpbiwgYm90aCBzZWN0aW9uIGFuZCB2YXIpLgorCQkgKiBXZSB3b3VsZCB3YW50IHRvIGtub3cgaWYgdGhpcyBrZXkgaXMgaW4gdGhlIHNhbWUKKwkJICogc2VjdGlvbiBhcyB3aGF0IHdlIGFyZSBsb29raW5nIGZvci4gIFdlIGFscmVhZHkKKwkJICoga25vdyB3ZSBhcmUgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcyB3aGF0IHNob3VsZAorCQkgKiBob2xkIHN0b3JlLmtleS4KKwkJICovCisJCWVwID0gc3RycmNocihrZXksICcuJyk7CisJCXNlY3Rpb25fbGVuID0gZXAgLSBrZXk7CisKKwkJaWYgKChzZWN0aW9uX2xlbiAhPSBzdG9yZS5iYXNlbGVuKSB8fAorCQkgICAgbWVtY21wKGtleSwgc3RvcmUua2V5LCBzZWN0aW9uX2xlbisxKSkgeworCQkJc3RvcmUuc3RhdGUgPSBTRUNUSU9OX0VORF9TRUVOOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBEbyBub3QgaW5jcmVtZW50IG1hdGNoZXM6IHRoaXMgaXMgbm8gbWF0Y2gsIGJ1dCB3ZQorCQkgKiBqdXN0IG1hZGUgc3VyZSB3ZSBhcmUgaW4gdGhlIGRlc2lyZWQgc2VjdGlvbi4KKwkJICovCisJCXN0b3JlLm9mZnNldFtzdG9yZS5zZWVuXSA9IGZ0ZWxsKGNvbmZpZ19maWxlKTsKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIFNFQ1RJT05fRU5EX1NFRU46CisJY2FzZSBTVEFSVDoKKwkJaWYgKG1hdGNoZXMoa2V5LCB2YWx1ZSkpIHsKKwkJCXN0b3JlLm9mZnNldFtzdG9yZS5zZWVuXSA9IGZ0ZWxsKGNvbmZpZ19maWxlKTsKKwkJCXN0b3JlLnN0YXRlID0gS0VZX1NFRU47CisJCQlzdG9yZS5zZWVuKys7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RycmNocihrZXksICcuJykgLSBrZXkgPT0gc3RvcmUuYmFzZWxlbiAmJgorCQkJICAgICAgIXN0cm5jbXAoa2V5LCBzdG9yZS5rZXksIHN0b3JlLmJhc2VsZW4pKSB7CisJCQkJCXN0b3JlLnN0YXRlID0gU0VDVElPTl9TRUVOOworCQkJCQlzdG9yZS5vZmZzZXRbc3RvcmUuc2Vlbl0gPSBmdGVsbChjb25maWdfZmlsZSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfd3JpdGVfc2VjdGlvbihpbnQgZmQsIGNvbnN0IGNoYXIqIGtleSkKK3sKKwljb25zdCBjaGFyICpkb3Q7CisJaW50IGksIHN1Y2Nlc3M7CisJc3RydWN0IHN0cmJ1ZiBzYiA9IFNUUkJVRl9JTklUOworCisJZG90ID0gbWVtY2hyKGtleSwgJy4nLCBzdG9yZS5iYXNlbGVuKTsKKwlpZiAoZG90KSB7CisJCXN0cmJ1Zl9hZGRmKCZzYiwgIlslLipzIFwiIiwgKGludCkoZG90IC0ga2V5KSwga2V5KTsKKwkJZm9yIChpID0gZG90IC0ga2V5ICsgMTsgaSA8IHN0b3JlLmJhc2VsZW47IGkrKykgeworCQkJaWYgKGtleVtpXSA9PSAnIicgfHwga2V5W2ldID09ICdcXCcpCisJCQkJc3RyYnVmX2FkZGNoKCZzYiwgJ1xcJyk7CisJCQlzdHJidWZfYWRkY2goJnNiLCBrZXlbaV0pOworCQl9CisJCXN0cmJ1Zl9hZGRzdHIoJnNiLCAiXCJdXG4iKTsKKwl9IGVsc2UgeworCQlzdHJidWZfYWRkZigmc2IsICJbJS4qc11cbiIsIHN0b3JlLmJhc2VsZW4sIGtleSk7CisJfQorCisJc3VjY2VzcyA9IHdyaXRlX2luX2Z1bGwoZmQsIHNiLmJ1Ziwgc2IubGVuKSA9PSBzYi5sZW47CisJc3RyYnVmX3JlbGVhc2UoJnNiKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgaW50IHN0b3JlX3dyaXRlX3BhaXIoaW50IGZkLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworCWludCBpLCBzdWNjZXNzOworCWludCBsZW5ndGggPSBzdHJsZW4oa2V5ICsgc3RvcmUuYmFzZWxlbiArIDEpOworCWNvbnN0IGNoYXIgKnF1b3RlID0gIiI7CisJc3RydWN0IHN0cmJ1ZiBzYiA9IFNUUkJVRl9JTklUOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlIG5lZWRzIHRvIGJlIHN1cnJvdW5kZWQgd2l0aCBhIGRxIHBhaXIuCisJICogTm90ZSB0aGF0IHByb2JsZW1hdGljIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyBiYWNrc2xhc2gtcXVvdGVkOyB0aGlzCisJICogY2hlY2sgaXMgYWJvdXQgbm90IGxvc2luZyBsZWFkaW5nIG9yIHRyYWlsaW5nIFNQIGFuZCBzdHJpbmdzIHRoYXQKKwkgKiBmb2xsb3cgYmVnaW5uaW5nLW9mLWNvbW1lbnQgY2hhcmFjdGVycyAoaS5lLiAnOycgYW5kICcjJykgYnkgdGhlCisJICogY29uZmlndXJhdGlvbiBwYXJzZXIuCisJICovCisJaWYgKHZhbHVlWzBdID09ICcgJykKKwkJcXVvdGUgPSAiXCIiOworCWZvciAoaSA9IDA7IHZhbHVlW2ldOyBpKyspCisJCWlmICh2YWx1ZVtpXSA9PSAnOycgfHwgdmFsdWVbaV0gPT0gJyMnKQorCQkJcXVvdGUgPSAiXCIiOworCWlmIChpICYmIHZhbHVlW2kgLSAxXSA9PSAnICcpCisJCXF1b3RlID0gIlwiIjsKKworCXN0cmJ1Zl9hZGRmKCZzYiwgIlx0JS4qcyA9ICVzIiwKKwkJICAgIGxlbmd0aCwga2V5ICsgc3RvcmUuYmFzZWxlbiArIDEsIHF1b3RlKTsKKworCWZvciAoaSA9IDA7IHZhbHVlW2ldOyBpKyspCisJCXN3aXRjaCAodmFsdWVbaV0pIHsKKwkJY2FzZSAnXG4nOgorCQkJc3RyYnVmX2FkZHN0cigmc2IsICJcXG4iKTsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQlzdHJidWZfYWRkc3RyKCZzYiwgIlxcdCIpOworCQkJYnJlYWs7CisJCWNhc2UgJyInOgorCQljYXNlICdcXCc6CisJCQlzdHJidWZfYWRkY2goJnNiLCAnXFwnKTsKKwkJZGVmYXVsdDoKKwkJCXN0cmJ1Zl9hZGRjaCgmc2IsIHZhbHVlW2ldKTsKKwkJCWJyZWFrOworCQl9CisJc3RyYnVmX2FkZGYoJnNiLCAiJXNcbiIsIHF1b3RlKTsKKworCXN1Y2Nlc3MgPSB3cml0ZV9pbl9mdWxsKGZkLCBzYi5idWYsIHNiLmxlbikgPT0gc2IubGVuOworCXN0cmJ1Zl9yZWxlYXNlKCZzYik7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIHNzaXplX3QgZmluZF9iZWdpbm5pbmdfb2ZfbGluZShjb25zdCBjaGFyKiBjb250ZW50cywgc2l6ZV90IHNpemUsCisJc2l6ZV90IG9mZnNldF8sIGludCogZm91bmRfYnJhY2tldCkKK3sKKwlzaXplX3QgZXF1YWxfb2Zmc2V0ID0gc2l6ZSwgYnJhY2tldF9vZmZzZXQgPSBzaXplOworCXNzaXplX3Qgb2Zmc2V0OworCitjb250bGluZToKKwlmb3IgKG9mZnNldCA9IG9mZnNldF8tMjsgb2Zmc2V0ID4gMAorCQkJJiYgY29udGVudHNbb2Zmc2V0XSAhPSAnXG4nOyBvZmZzZXQtLSkKKwkJc3dpdGNoIChjb250ZW50c1tvZmZzZXRdKSB7CisJCQljYXNlICc9JzogZXF1YWxfb2Zmc2V0ID0gb2Zmc2V0OyBicmVhazsKKwkJCWNhc2UgJ10nOiBicmFja2V0X29mZnNldCA9IG9mZnNldDsgYnJlYWs7CisJCX0KKwlpZiAob2Zmc2V0ID4gMCAmJiBjb250ZW50c1tvZmZzZXQtMV0gPT0gJ1xcJykgeworCQlvZmZzZXRfID0gb2Zmc2V0OworCQlnb3RvIGNvbnRsaW5lOworCX0KKwlpZiAoYnJhY2tldF9vZmZzZXQgPCBlcXVhbF9vZmZzZXQpIHsKKwkJKmZvdW5kX2JyYWNrZXQgPSAxOworCQlvZmZzZXQgPSBicmFja2V0X29mZnNldCsxOworCX0gZWxzZQorCQlvZmZzZXQrKzsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19zZXQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlyZXR1cm4gcGVyZl9jb25maWdfc2V0X211bHRpdmFyKGtleSwgdmFsdWUsIE5VTEwsIDApOworfQorCisvKgorICogSWYgdmFsdWU9PU5VTEwsIHVuc2V0IGluIChyZW1vdmUgZnJvbSkgY29uZmlnLAorICogaWYgdmFsdWVfcmVnZXghPU5VTEwsIGRpc3JlZ2FyZCBrZXkvdmFsdWUgcGFpcnMgd2hlcmUgdmFsdWUgZG9lcyBub3QgbWF0Y2guCisgKiBpZiBtdWx0aV9yZXBsYWNlPT0wLCBub3RoaW5nLCBvciBvbmx5IG9uZSBtYXRjaGluZyBrZXkvdmFsdWUgaXMgcmVwbGFjZWQsCisgKiAgICAgZWxzZSBhbGwgbWF0Y2hpbmcga2V5L3ZhbHVlcyAocmVnYXJkbGVzcyBob3cgbWFueSkgYXJlIHJlbW92ZWQsCisgKiAgICAgYmVmb3JlIHRoZSBuZXcgcGFpciBpcyB3cml0dGVuLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGlzOgorICoKKyAqIC0gaXQgbG9ja3MgdGhlIGNvbmZpZyBmaWxlIGJ5IGNyZWF0aW5nICIucGVyZi9jb25maWcubG9jayIKKyAqCisgKiAtIGl0IHRoZW4gcGFyc2VzIHRoZSBjb25maWcgdXNpbmcgc3RvcmVfYXV4KCkgYXMgdmFsaWRhdG9yIHRvIGZpbmQKKyAqICAgdGhlIHBvc2l0aW9uIG9uIHRoZSBrZXkvdmFsdWUgcGFpciB0byByZXBsYWNlLiBJZiBpdCBpcyB0byBiZSB1bnNldCwKKyAqICAgaXQgbXVzdCBiZSBmb3VuZCBleGFjdGx5IG9uY2UuCisgKgorICogLSB0aGUgY29uZmlnIGZpbGUgaXMgbW1hcCgpZWQgYW5kIHRoZSBwYXJ0IGJlZm9yZSB0aGUgbWF0Y2ggKGlmIGFueSkgaXMKKyAqICAgd3JpdHRlbiB0byB0aGUgbG9jayBmaWxlLCB0aGVuIHRoZSBjaGFuZ2VkIHBhcnQgYW5kIHRoZSByZXN0LgorICoKKyAqIC0gdGhlIGNvbmZpZyBmaWxlIGlzIHJlbW92ZWQgYW5kIHRoZSBsb2NrIGZpbGUgcmVuYW1lKClkIHRvIGl0LgorICoKKyAqLworaW50IHBlcmZfY29uZmlnX3NldF9tdWx0aXZhcihjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlLAorCWNvbnN0IGNoYXIqIHZhbHVlX3JlZ2V4LCBpbnQgbXVsdGlfcmVwbGFjZSkKK3sKKwlpbnQgaSwgZG90OworCWludCBmZCA9IC0xLCBpbl9mZDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyKiBjb25maWdfZmlsZW5hbWU7CisJY29uc3QgY2hhciogbGFzdF9kb3QgPSBzdHJyY2hyKGtleSwgJy4nKTsKKworCWlmIChjb25maWdfZXhjbHVzaXZlX2ZpbGVuYW1lKQorCQljb25maWdfZmlsZW5hbWUgPSBzdHJkdXAoY29uZmlnX2V4Y2x1c2l2ZV9maWxlbmFtZSk7CisJZWxzZQorCQljb25maWdfZmlsZW5hbWUgPSBwZXJmX3BhdGhkdXAoImNvbmZpZyIpOworCisJLyoKKwkgKiBTaW5jZSAia2V5IiBhY3R1YWxseSBjb250YWlucyB0aGUgc2VjdGlvbiBuYW1lIGFuZCB0aGUgcmVhbAorCSAqIGtleSBuYW1lIHNlcGFyYXRlZCBieSBhIGRvdCwgd2UgaGF2ZSB0byBrbm93IHdoZXJlIHRoZSBkb3QgaXMuCisJICovCisKKwlpZiAobGFzdF9kb3QgPT0gTlVMTCkgeworCQllcnJvcigia2V5IGRvZXMgbm90IGNvbnRhaW4gYSBzZWN0aW9uOiAlcyIsIGtleSk7CisJCXJldCA9IDI7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXN0b3JlLmJhc2VsZW4gPSBsYXN0X2RvdCAtIGtleTsKKworCXN0b3JlLm11bHRpX3JlcGxhY2UgPSBtdWx0aV9yZXBsYWNlOworCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUga2V5IGFuZCB3aGlsZSBhdCBpdCwgbG93ZXIgY2FzZSBpdCBmb3IgbWF0Y2hpbmcuCisJICovCisJc3RvcmUua2V5ID0gbWFsbG9jKHN0cmxlbihrZXkpICsgMSk7CisJZG90ID0gMDsKKwlmb3IgKGkgPSAwOyBrZXlbaV07IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSBrZXlbaV07CisJCWlmIChjID09ICcuJykKKwkJCWRvdCA9IDE7CisJCS8qIExlYXZlIHRoZSBleHRlbmRlZCBiYXNlbmFtZSB1bnRvdWNoZWQuLiAqLworCQlpZiAoIWRvdCB8fCBpID4gc3RvcmUuYmFzZWxlbikgeworCQkJaWYgKCFpc2tleWNoYXIoYykgfHwgKGkgPT0gc3RvcmUuYmFzZWxlbisxICYmICFpc2FscGhhKGMpKSkgeworCQkJCWVycm9yKCJpbnZhbGlkIGtleTogJXMiLCBrZXkpOworCQkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCQljID0gdG9sb3dlcihjKTsKKwkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCWVycm9yKCJpbnZhbGlkIGtleSAobmV3bGluZSk6ICVzIiwga2V5KTsKKwkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXN0b3JlLmtleVtpXSA9IGM7CisJfQorCXN0b3JlLmtleVtpXSA9IDA7CisKKwkvKgorCSAqIElmIC5wZXJmL2NvbmZpZyBkb2VzIG5vdCBleGlzdCB5ZXQsIHdyaXRlIGEgbWluaW1hbCB2ZXJzaW9uLgorCSAqLworCWluX2ZkID0gb3Blbihjb25maWdfZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoIGluX2ZkIDwgMCApIHsKKwkJZnJlZShzdG9yZS5rZXkpOworCisJCWlmICggRU5PRU5UICE9IGVycm5vICkgeworCQkJZXJyb3IoIm9wZW5pbmcgJXM6ICVzIiwgY29uZmlnX2ZpbGVuYW1lLAorCQkJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldCA9IDM7IC8qIHNhbWUgYXMgImludmFsaWQgY29uZmlnIGZpbGUiICovCisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCS8qIGlmIG5vdGhpbmcgdG8gdW5zZXQsIGVycm9yIG91dCAqLworCQlpZiAodmFsdWUgPT0gTlVMTCkgeworCQkJcmV0ID0gNTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKworCQlzdG9yZS5rZXkgPSAoY2hhciopa2V5OworCQlpZiAoIXN0b3JlX3dyaXRlX3NlY3Rpb24oZmQsIGtleSkgfHwKKwkJICAgICFzdG9yZV93cml0ZV9wYWlyKGZkLCBrZXksIHZhbHVlKSkKKwkJCWdvdG8gd3JpdGVfZXJyX291dDsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciogY29udGVudHM7CisJCXNpemVfdCBjb250ZW50c19zeiwgY29weV9iZWdpbiwgY29weV9lbmQ7CisJCWludCBpLCBuZXdfbGluZSA9IDA7CisKKwkJaWYgKHZhbHVlX3JlZ2V4ID09IE5VTEwpCisJCQlzdG9yZS52YWx1ZV9yZWdleCA9IE5VTEw7CisJCWVsc2UgeworCQkJaWYgKHZhbHVlX3JlZ2V4WzBdID09ICchJykgeworCQkJCXN0b3JlLmRvX25vdF9tYXRjaCA9IDE7CisJCQkJdmFsdWVfcmVnZXgrKzsKKwkJCX0gZWxzZQorCQkJCXN0b3JlLmRvX25vdF9tYXRjaCA9IDA7CisKKwkJCXN0b3JlLnZhbHVlX3JlZ2V4ID0gKHJlZ2V4X3QqKW1hbGxvYyhzaXplb2YocmVnZXhfdCkpOworCQkJaWYgKHJlZ2NvbXAoc3RvcmUudmFsdWVfcmVnZXgsIHZhbHVlX3JlZ2V4LAorCQkJCQlSRUdfRVhURU5ERUQpKSB7CisJCQkJZXJyb3IoImludmFsaWQgcGF0dGVybjogJXMiLCB2YWx1ZV9yZWdleCk7CisJCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQkJcmV0ID0gNjsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQl9CisKKwkJc3RvcmUub2Zmc2V0WzBdID0gMDsKKwkJc3RvcmUuc3RhdGUgPSBTVEFSVDsKKwkJc3RvcmUuc2VlbiA9IDA7CisKKwkJLyoKKwkJICogQWZ0ZXIgdGhpcywgc3RvcmUub2Zmc2V0IHdpbGwgY29udGFpbiB0aGUgKmVuZCogb2Zmc2V0CisJCSAqIG9mIHRoZSBsYXN0IG1hdGNoLCBvciByZW1haW4gYXQgMCBpZiBubyBtYXRjaCB3YXMgZm91bmQuCisJCSAqIEFzIGEgc2lkZSBlZmZlY3QsIHdlIG1ha2Ugc3VyZSB0byB0cmFuc2Zvcm0gb25seSBhIHZhbGlkCisJCSAqIGV4aXN0aW5nIGNvbmZpZyBmaWxlLgorCQkgKi8KKwkJaWYgKHBlcmZfY29uZmlnX2Zyb21fZmlsZShzdG9yZV9hdXgsIGNvbmZpZ19maWxlbmFtZSwgTlVMTCkpIHsKKwkJCWVycm9yKCJpbnZhbGlkIGNvbmZpZyBmaWxlICVzIiwgY29uZmlnX2ZpbGVuYW1lKTsKKwkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCWlmIChzdG9yZS52YWx1ZV9yZWdleCAhPSBOVUxMKSB7CisJCQkJcmVnZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQl9CisJCQlyZXQgPSAzOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCWZyZWUoc3RvcmUua2V5KTsKKwkJaWYgKHN0b3JlLnZhbHVlX3JlZ2V4ICE9IE5VTEwpIHsKKwkJCXJlZ2ZyZWUoc3RvcmUudmFsdWVfcmVnZXgpOworCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCX0KKworCQkvKiBpZiBub3RoaW5nIHRvIHVuc2V0LCBvciB0b28gbWFueSBtYXRjaGVzLCBlcnJvciBvdXQgKi8KKwkJaWYgKChzdG9yZS5zZWVuID09IDAgJiYgdmFsdWUgPT0gTlVMTCkgfHwKKwkJCQkoc3RvcmUuc2VlbiA+IDEgJiYgbXVsdGlfcmVwbGFjZSA9PSAwKSkgeworCQkJcmV0ID0gNTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKworCQlmc3RhdChpbl9mZCwgJnN0KTsKKwkJY29udGVudHNfc3ogPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCQljb250ZW50cyA9IG1tYXAoTlVMTCwgY29udGVudHNfc3osIFBST1RfUkVBRCwKKwkJCU1BUF9QUklWQVRFLCBpbl9mZCwgMCk7CisJCWNsb3NlKGluX2ZkKTsKKworCQlpZiAoc3RvcmUuc2VlbiA9PSAwKQorCQkJc3RvcmUuc2VlbiA9IDE7CisKKwkJZm9yIChpID0gMCwgY29weV9iZWdpbiA9IDA7IGkgPCBzdG9yZS5zZWVuOyBpKyspIHsKKwkJCWlmIChzdG9yZS5vZmZzZXRbaV0gPT0gMCkgeworCQkJCXN0b3JlLm9mZnNldFtpXSA9IGNvcHlfZW5kID0gY29udGVudHNfc3o7CisJCQl9IGVsc2UgaWYgKHN0b3JlLnN0YXRlICE9IEtFWV9TRUVOKSB7CisJCQkJY29weV9lbmQgPSBzdG9yZS5vZmZzZXRbaV07CisJCQl9IGVsc2UKKwkJCQljb3B5X2VuZCA9IGZpbmRfYmVnaW5uaW5nX29mX2xpbmUoCisJCQkJCWNvbnRlbnRzLCBjb250ZW50c19zeiwKKwkJCQkJc3RvcmUub2Zmc2V0W2ldLTIsICZuZXdfbGluZSk7CisKKwkJCWlmIChjb3B5X2VuZCA+IDAgJiYgY29udGVudHNbY29weV9lbmQtMV0gIT0gJ1xuJykKKwkJCQluZXdfbGluZSA9IDE7CisKKwkJCS8qIHdyaXRlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb25maWcgKi8KKwkJCWlmIChjb3B5X2VuZCA+IGNvcHlfYmVnaW4pIHsKKwkJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCQkJICBjb3B5X2VuZCAtIGNvcHlfYmVnaW4pIDwKKwkJCQkgICAgY29weV9lbmQgLSBjb3B5X2JlZ2luKQorCQkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJCQkJaWYgKG5ld19saW5lICYmCisJCQkJICAgIHdyaXRlX2luX2Z1bGwoZmQsICJcbiIsIDEpICE9IDEpCisJCQkJCWdvdG8gd3JpdGVfZXJyX291dDsKKwkJCX0KKwkJCWNvcHlfYmVnaW4gPSBzdG9yZS5vZmZzZXRbaV07CisJCX0KKworCQkvKiB3cml0ZSB0aGUgcGFpciAodmFsdWUgPT0gTlVMTCBtZWFucyB1bnNldCkgKi8KKwkJaWYgKHZhbHVlICE9IE5VTEwpIHsKKwkJCWlmIChzdG9yZS5zdGF0ZSA9PSBTVEFSVCkgeworCQkJCWlmICghc3RvcmVfd3JpdGVfc2VjdGlvbihmZCwga2V5KSkKKwkJCQkJZ290byB3cml0ZV9lcnJfb3V0OworCQkJfQorCQkJaWYgKCFzdG9yZV93cml0ZV9wYWlyKGZkLCBrZXksIHZhbHVlKSkKKwkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJCX0KKworCQkvKiB3cml0ZSB0aGUgcmVzdCBvZiB0aGUgY29uZmlnICovCisJCWlmIChjb3B5X2JlZ2luIDwgY29udGVudHNfc3opCisJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCQkgIGNvbnRlbnRzX3N6IC0gY29weV9iZWdpbikgPAorCQkJICAgIGNvbnRlbnRzX3N6IC0gY29weV9iZWdpbikKKwkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisKKwkJbXVubWFwKGNvbnRlbnRzLCBjb250ZW50c19zeik7CisJfQorCisJcmV0ID0gMDsKKworb3V0X2ZyZWU6CisJZnJlZShjb25maWdfZmlsZW5hbWUpOworCXJldHVybiByZXQ7CisKK3dyaXRlX2Vycl9vdXQ6CisJZ290byBvdXRfZnJlZTsKKworfQorCisvKgorICogQ2FsbCB0aGlzIHRvIHJlcG9ydCBlcnJvciBmb3IgeW91ciB2YXJpYWJsZSB0aGF0IHNob3VsZCBub3QKKyAqIGdldCBhIGJvb2xlYW4gdmFsdWUgKGkuZS4gIltteV0gdmFyIiBtZWFucyAidHJ1ZSIpLgorICovCitpbnQgY29uZmlnX2Vycm9yX25vbmJvb2woY29uc3QgY2hhciAqdmFyKQoreworCXJldHVybiBlcnJvcigiTWlzc2luZyB2YWx1ZSBmb3IgJyVzJyIsIHZhcik7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY3R5cGUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9jdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MGVjMDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvY3R5cGUuYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogU2FuZSBsb2NhbGUtaW5kZXBlbmRlbnQsIEFTQ0lJIGN0eXBlLgorICoKKyAqIE5vIHN1cnByaXNlcywgYW5kIHdvcmtzIHdpdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBjaGFycy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisKK2VudW0geworCVMgPSBHSVRfU1BBQ0UsCisJQSA9IEdJVF9BTFBIQSwKKwlEID0gR0lUX0RJR0lULAorCUcgPSBHSVRfR0xPQl9TUEVDSUFMLAkvKiAqLCA/LCBbLCBcXCAqLworCVIgPSBHSVRfUkVHRVhfU1BFQ0lBTCwJLyogJCwgKCwgKSwgKywgLiwgXiwgeywgfCAqICovCit9OworCit1bnNpZ25lZCBjaGFyIHNhbmVfY3R5cGVbMjU2XSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBTLCBTLCAwLCAwLCBTLCAwLCAwLAkJLyogICAwLi4gMTUgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkJLyogIDE2Li4gMzEgKi8KKwlTLCAwLCAwLCAwLCBSLCAwLCAwLCAwLCBSLCBSLCBHLCBSLCAwLCAwLCBSLCAwLAkJLyogIDMyLi4gNDcgKi8KKwlELCBELCBELCBELCBELCBELCBELCBELCBELCBELCAwLCAwLCAwLCAwLCAwLCBHLAkJLyogIDQ4Li4gNjMgKi8KKwkwLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLAkJLyogIDY0Li4gNzkgKi8KKwlBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBHLCBHLCAwLCBSLCAwLAkJLyogIDgwLi4gOTUgKi8KKwkwLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLAkJLyogIDk2Li4xMTEgKi8KKwlBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBSLCBSLCAwLCAwLCAwLAkJLyogMTEyLi4xMjcgKi8KKwkvKiBOb3RoaW5nIGluIHRoZSAxMjguLiByYW5nZSAqLworfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9lbnZpcm9ubWVudC5jIGIvdG9vbHMvcGVyZi91dGlsL2Vudmlyb25tZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1YjBlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9lbnZpcm9ubWVudC5jCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIFdlIHB1dCBhbGwgdGhlIHBlcmYgY29uZmlnIHZhcmlhYmxlcyBpbiB0aGlzIHNhbWUgb2JqZWN0CisgKiBmaWxlLCBzbyB0aGF0IHByb2dyYW1zIGNhbiBsaW5rIGFnYWluc3QgdGhlIGNvbmZpZyBwYXJzZXIKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIGxpbmsgYWdhaW5zdCBhbGwgdGhlIHJlc3Qgb2YgcGVyZi4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisKK2NvbnN0IGNoYXIgKnBhZ2VyX3Byb2dyYW07CitpbnQgcGFnZXJfdXNlX2NvbG9yID0gMTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9leGVjX2NtZC5jIGIvdG9vbHMvcGVyZi91dGlsL2V4ZWNfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5MjkyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9leGVjX2NtZC5jCkBAIC0wLDAgKzEsMTY1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjZGVmaW5lIE1BWF9BUkdTCTMyCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKK3N0YXRpYyBjb25zdCBjaGFyICphcmd2X2V4ZWNfcGF0aDsKK3N0YXRpYyBjb25zdCBjaGFyICphcmd2MF9wYXRoOworCitjb25zdCBjaGFyICpzeXN0ZW1fcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworI2lmZGVmIFJVTlRJTUVfUFJFRklYCisJc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeDsKKyNlbHNlCisJc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeCA9IFBSRUZJWDsKKyNlbmRpZgorCXN0cnVjdCBzdHJidWYgZCA9IFNUUkJVRl9JTklUOworCisJaWYgKGlzX2Fic29sdXRlX3BhdGgocGF0aCkpCisJCXJldHVybiBwYXRoOworCisjaWZkZWYgUlVOVElNRV9QUkVGSVgKKwlhc3NlcnQoYXJndjBfcGF0aCk7CisJYXNzZXJ0KGlzX2Fic29sdXRlX3BhdGgoYXJndjBfcGF0aCkpOworCisJaWYgKCFwcmVmaXggJiYKKwkgICAgIShwcmVmaXggPSBzdHJpcF9wYXRoX3N1ZmZpeChhcmd2MF9wYXRoLCBQRVJGX0VYRUNfUEFUSCkpICYmCisJICAgICEocHJlZml4ID0gc3RyaXBfcGF0aF9zdWZmaXgoYXJndjBfcGF0aCwgQklORElSKSkgJiYKKwkgICAgIShwcmVmaXggPSBzdHJpcF9wYXRoX3N1ZmZpeChhcmd2MF9wYXRoLCAicGVyZiIpKSkgeworCQlwcmVmaXggPSBQUkVGSVg7CisJCWZwcmludGYoc3RkZXJyLCAiUlVOVElNRV9QUkVGSVggcmVxdWVzdGVkLCAiCisJCQkJImJ1dCBwcmVmaXggY29tcHV0YXRpb24gZmFpbGVkLiAgIgorCQkJCSJVc2luZyBzdGF0aWMgZmFsbGJhY2sgJyVzJy5cbiIsIHByZWZpeCk7CisJfQorI2VuZGlmCisKKwlzdHJidWZfYWRkZigmZCwgIiVzLyVzIiwgcHJlZml4LCBwYXRoKTsKKwlwYXRoID0gc3RyYnVmX2RldGFjaCgmZCwgTlVMTCk7CisJcmV0dXJuIHBhdGg7Cit9CisKK2NvbnN0IGNoYXIgKnBlcmZfZXh0cmFjdF9hcmd2MF9wYXRoKGNvbnN0IGNoYXIgKmFyZ3YwKQoreworCWNvbnN0IGNoYXIgKnNsYXNoOworCisJaWYgKCFhcmd2MCB8fCAhKmFyZ3YwKQorCQlyZXR1cm4gTlVMTDsKKwlzbGFzaCA9IGFyZ3YwICsgc3RybGVuKGFyZ3YwKTsKKworCXdoaWxlIChhcmd2MCA8PSBzbGFzaCAmJiAhaXNfZGlyX3NlcCgqc2xhc2gpKQorCQlzbGFzaC0tOworCisJaWYgKHNsYXNoID49IGFyZ3YwKSB7CisJCWFyZ3YwX3BhdGggPSBzdHJuZHVwKGFyZ3YwLCBzbGFzaCAtIGFyZ3YwKTsKKwkJcmV0dXJuIHNsYXNoICsgMTsKKwl9CisKKwlyZXR1cm4gYXJndjA7Cit9CisKK3ZvaWQgcGVyZl9zZXRfYXJndl9leGVjX3BhdGgoY29uc3QgY2hhciAqZXhlY19wYXRoKQoreworCWFyZ3ZfZXhlY19wYXRoID0gZXhlY19wYXRoOworCS8qCisJICogUHJvcGFnYXRlIHRoaXMgc2V0dGluZyB0byBleHRlcm5hbCBwcm9ncmFtcy4KKwkgKi8KKwlzZXRlbnYoRVhFQ19QQVRIX0VOVklST05NRU5ULCBleGVjX3BhdGgsIDEpOworfQorCisKKy8qIFJldHVybnMgdGhlIGhpZ2hlc3QtcHJpb3JpdHksIGxvY2F0aW9uIHRvIGxvb2sgZm9yIHBlcmYgcHJvZ3JhbXMuICovCitjb25zdCBjaGFyICpwZXJmX2V4ZWNfcGF0aCh2b2lkKQoreworCWNvbnN0IGNoYXIgKmVudjsKKworCWlmIChhcmd2X2V4ZWNfcGF0aCkKKwkJcmV0dXJuIGFyZ3ZfZXhlY19wYXRoOworCisJZW52ID0gZ2V0ZW52KEVYRUNfUEFUSF9FTlZJUk9OTUVOVCk7CisJaWYgKGVudiAmJiAqZW52KSB7CisJCXJldHVybiBlbnY7CisJfQorCisJcmV0dXJuIHN5c3RlbV9wYXRoKFBFUkZfRVhFQ19QQVRIKTsKK30KKworc3RhdGljIHZvaWQgYWRkX3BhdGgoc3RydWN0IHN0cmJ1ZiAqb3V0LCBjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChwYXRoICYmICpwYXRoKSB7CisJCWlmIChpc19hYnNvbHV0ZV9wYXRoKHBhdGgpKQorCQkJc3RyYnVmX2FkZHN0cihvdXQsIHBhdGgpOworCQllbHNlCisJCQlzdHJidWZfYWRkc3RyKG91dCwgbWFrZV9ub25yZWxhdGl2ZV9wYXRoKHBhdGgpKTsKKworCQlzdHJidWZfYWRkY2gob3V0LCBQQVRIX1NFUCk7CisJfQorfQorCit2b2lkIHNldHVwX3BhdGgodm9pZCkKK3sKKwljb25zdCBjaGFyICpvbGRfcGF0aCA9IGdldGVudigiUEFUSCIpOworCXN0cnVjdCBzdHJidWYgbmV3X3BhdGggPSBTVFJCVUZfSU5JVDsKKworCWFkZF9wYXRoKCZuZXdfcGF0aCwgcGVyZl9leGVjX3BhdGgoKSk7CisJYWRkX3BhdGgoJm5ld19wYXRoLCBhcmd2MF9wYXRoKTsKKworCWlmIChvbGRfcGF0aCkKKwkJc3RyYnVmX2FkZHN0cigmbmV3X3BhdGgsIG9sZF9wYXRoKTsKKwllbHNlCisJCXN0cmJ1Zl9hZGRzdHIoJm5ld19wYXRoLCAiL3Vzci9sb2NhbC9iaW46L3Vzci9iaW46L2JpbiIpOworCisJc2V0ZW52KCJQQVRIIiwgbmV3X3BhdGguYnVmLCAxKTsKKworCXN0cmJ1Zl9yZWxlYXNlKCZuZXdfcGF0aCk7Cit9CisKK2NvbnN0IGNoYXIgKipwcmVwYXJlX3BlcmZfY21kKGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKipuYXJndjsKKworCWZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY107IGFyZ2MrKykKKwkJOyAvKiBqdXN0IGNvdW50aW5nICovCisJbmFyZ3YgPSBtYWxsb2Moc2l6ZW9mKCpuYXJndikgKiAoYXJnYyArIDIpKTsKKworCW5hcmd2WzBdID0gInBlcmYiOworCWZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY107IGFyZ2MrKykKKwkJbmFyZ3ZbYXJnYyArIDFdID0gYXJndlthcmdjXTsKKwluYXJndlthcmdjICsgMV0gPSBOVUxMOworCXJldHVybiBuYXJndjsKK30KKworaW50IGV4ZWN2X3BlcmZfY21kKGNvbnN0IGNoYXIgKiphcmd2KSB7CisJY29uc3QgY2hhciAqKm5hcmd2ID0gcHJlcGFyZV9wZXJmX2NtZChhcmd2KTsKKworCS8qIGV4ZWN2cCgpIGNhbiBvbmx5IGV2ZXIgcmV0dXJuIGlmIGl0IGZhaWxzICovCisJZXhlY3ZwKCJwZXJmIiwgKGNoYXIgKiopbmFyZ3YpOworCisJZnJlZShuYXJndik7CisJcmV0dXJuIC0xOworfQorCisKK2ludCBleGVjbF9wZXJmX2NtZChjb25zdCBjaGFyICpjbWQsLi4uKQoreworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbTUFYX0FSR1MgKyAxXTsKKwljb25zdCBjaGFyICphcmc7CisJdmFfbGlzdCBwYXJhbTsKKworCXZhX3N0YXJ0KHBhcmFtLCBjbWQpOworCWFyZ3ZbMF0gPSBjbWQ7CisJYXJnYyA9IDE7CisJd2hpbGUgKGFyZ2MgPCBNQVhfQVJHUykgeworCQlhcmcgPSBhcmd2W2FyZ2MrK10gPSB2YV9hcmcocGFyYW0sIGNoYXIgKik7CisJCWlmICghYXJnKQorCQkJYnJlYWs7CisJfQorCXZhX2VuZChwYXJhbSk7CisJaWYgKE1BWF9BUkdTIDw9IGFyZ2MpCisJCXJldHVybiBlcnJvcigidG9vIG1hbnkgYXJncyB0byBydW4gJXMiLCBjbWQpOworCisJYXJndlthcmdjXSA9IE5VTEw7CisJcmV0dXJuIGV4ZWN2X3BlcmZfY21kKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V4ZWNfY21kLmggYi90b29scy9wZXJmL3V0aWwvZXhlY19jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZlMjVlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V4ZWNfY21kLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBQRVJGX0VYRUNfQ01EX0gKKyNkZWZpbmUgUEVSRl9FWEVDX0NNRF9ICisKK2V4dGVybiB2b2lkIHBlcmZfc2V0X2FyZ3ZfZXhlY19wYXRoKGNvbnN0IGNoYXIgKmV4ZWNfcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciAqcGVyZl9leHRyYWN0X2FyZ3YwX3BhdGgoY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciAqcGVyZl9leGVjX3BhdGgodm9pZCk7CitleHRlcm4gdm9pZCBzZXR1cF9wYXRoKHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKipwcmVwYXJlX3BlcmZfY21kKGNvbnN0IGNoYXIgKiphcmd2KTsKK2V4dGVybiBpbnQgZXhlY3ZfcGVyZl9jbWQoY29uc3QgY2hhciAqKmFyZ3YpOyAvKiBOVUxMIHRlcm1pbmF0ZWQgKi8KK2V4dGVybiBpbnQgZXhlY2xfcGVyZl9jbWQoY29uc3QgY2hhciAqY21kLCAuLi4pOworZXh0ZXJuIGNvbnN0IGNoYXIgKnN5c3RlbV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpOworCisjZW5kaWYgLyogUEVSRl9FWEVDX0NNRF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaCBiL3Rvb2xzL3BlcmYvdXRpbC9nZW5lcmF0ZS1jbWRsaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwNmY2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaApAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vc2gKKworZWNobyAiLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgJDAgKi8KK3N0cnVjdCBjbWRuYW1lX2hlbHAKK3sKKyAgICBjaGFyIG5hbWVbMTZdOworICAgIGNoYXIgaGVscFs4MF07Cit9OworCitzdGF0aWMgc3RydWN0IGNtZG5hbWVfaGVscCBjb21tb25fY21kc1tdID0geyIKKworc2VkIC1uIC1lICdzL15wZXJmLVwoW14gCV0qXClbIAldLiogY29tbW9uLiovXDEvcCcgY29tbWFuZC1saXN0LnR4dCB8Citzb3J0IHwKK3doaWxlIHJlYWQgY21kCitkbworICAgICBzZWQgLW4gJworICAgICAvXk5BTUUvLC9wZXJmLSciJGNtZCInL0gKKyAgICAgJHsKKyAgICAgICAgICAgIHgKKyAgICAgICAgICAgIHMvLipwZXJmLSciJGNtZCInIC0gXCguKlwpLyAgeyInIiRjbWQiJyIsICJcMSJ9LC8KKwkgICAgcAorICAgICB9JyAiRG9jdW1lbnRhdGlvbi9wZXJmLSRjbWQudHh0IgorZG9uZQorZWNobyAifTsiCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGVscC5jIGIvdG9vbHMvcGVyZi91dGlsL2hlbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUzZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlbHAuYwpAQCAtMCwwICsxLDM2NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiLi4vYnVpbHRpbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAibGV2ZW5zaHRlaW4uaCIKKyNpbmNsdWRlICJoZWxwLmgiCisKKy8qIG1vc3QgR1VJIHRlcm1pbmFscyBzZXQgQ09MVU1OUyAoYWx0aG91Z2ggc29tZSBkb24ndCBleHBvcnQgaXQpICovCitzdGF0aWMgaW50IHRlcm1fY29sdW1ucyh2b2lkKQoreworCWNoYXIgKmNvbF9zdHJpbmcgPSBnZXRlbnYoIkNPTFVNTlMiKTsKKwlpbnQgbl9jb2xzOworCisJaWYgKGNvbF9zdHJpbmcgJiYgKG5fY29scyA9IGF0b2koY29sX3N0cmluZykpID4gMCkKKwkJcmV0dXJuIG5fY29sczsKKworI2lmZGVmIFRJT0NHV0lOU1oKKwl7CisJCXN0cnVjdCB3aW5zaXplIHdzOworCQlpZiAoIWlvY3RsKDEsIFRJT0NHV0lOU1osICZ3cykpIHsKKwkJCWlmICh3cy53c19jb2wpCisJCQkJcmV0dXJuIHdzLndzX2NvbDsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIDgwOworfQorCit2b2lkIGFkZF9jbWRuYW1lKHN0cnVjdCBjbWRuYW1lcyAqY21kcywgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgY21kbmFtZSAqZW50ID0gbWFsbG9jKHNpemVvZigqZW50KSArIGxlbiArIDEpOworCisJZW50LT5sZW4gPSBsZW47CisJbWVtY3B5KGVudC0+bmFtZSwgbmFtZSwgbGVuKTsKKwllbnQtPm5hbWVbbGVuXSA9IDA7CisKKwlBTExPQ19HUk9XKGNtZHMtPm5hbWVzLCBjbWRzLT5jbnQgKyAxLCBjbWRzLT5hbGxvYyk7CisJY21kcy0+bmFtZXNbY21kcy0+Y250KytdID0gZW50OworfQorCitzdGF0aWMgdm9pZCBjbGVhbl9jbWRuYW1lcyhzdHJ1Y3QgY21kbmFtZXMgKmNtZHMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNtZHMtPmNudDsgKytpKQorCQlmcmVlKGNtZHMtPm5hbWVzW2ldKTsKKwlmcmVlKGNtZHMtPm5hbWVzKTsKKwljbWRzLT5jbnQgPSAwOworCWNtZHMtPmFsbG9jID0gMDsKK30KKworc3RhdGljIGludCBjbWRuYW1lX2NvbXBhcmUoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXN0cnVjdCBjbWRuYW1lICphID0gKihzdHJ1Y3QgY21kbmFtZSAqKilhXzsKKwlzdHJ1Y3QgY21kbmFtZSAqYiA9ICooc3RydWN0IGNtZG5hbWUgKiopYl87CisJcmV0dXJuIHN0cmNtcChhLT5uYW1lLCBiLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgdW5pcShzdHJ1Y3QgY21kbmFtZXMgKmNtZHMpCit7CisJaW50IGksIGo7CisKKwlpZiAoIWNtZHMtPmNudCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gaiA9IDE7IGkgPCBjbWRzLT5jbnQ7IGkrKykKKwkJaWYgKHN0cmNtcChjbWRzLT5uYW1lc1tpXS0+bmFtZSwgY21kcy0+bmFtZXNbaS0xXS0+bmFtZSkpCisJCQljbWRzLT5uYW1lc1tqKytdID0gY21kcy0+bmFtZXNbaV07CisKKwljbWRzLT5jbnQgPSBqOworfQorCit2b2lkIGV4Y2x1ZGVfY21kcyhzdHJ1Y3QgY21kbmFtZXMgKmNtZHMsIHN0cnVjdCBjbWRuYW1lcyAqZXhjbHVkZXMpCit7CisJaW50IGNpLCBjaiwgZWk7CisJaW50IGNtcDsKKworCWNpID0gY2ogPSBlaSA9IDA7CisJd2hpbGUgKGNpIDwgY21kcy0+Y250ICYmIGVpIDwgZXhjbHVkZXMtPmNudCkgeworCQljbXAgPSBzdHJjbXAoY21kcy0+bmFtZXNbY2ldLT5uYW1lLCBleGNsdWRlcy0+bmFtZXNbZWldLT5uYW1lKTsKKwkJaWYgKGNtcCA8IDApCisJCQljbWRzLT5uYW1lc1tjaisrXSA9IGNtZHMtPm5hbWVzW2NpKytdOworCQllbHNlIGlmIChjbXAgPT0gMCkKKwkJCWNpKyssIGVpKys7CisJCWVsc2UgaWYgKGNtcCA+IDApCisJCQllaSsrOworCX0KKworCXdoaWxlIChjaSA8IGNtZHMtPmNudCkKKwkJY21kcy0+bmFtZXNbY2orK10gPSBjbWRzLT5uYW1lc1tjaSsrXTsKKworCWNtZHMtPmNudCA9IGNqOworfQorCitzdGF0aWMgdm9pZCBwcmV0dHlfcHJpbnRfc3RyaW5nX2xpc3Qoc3RydWN0IGNtZG5hbWVzICpjbWRzLCBpbnQgbG9uZ2VzdCkKK3sKKwlpbnQgY29scyA9IDEsIHJvd3M7CisJaW50IHNwYWNlID0gbG9uZ2VzdCArIDE7IC8qIG1pbiAxIFNQIGJldHdlZW4gd29yZHMgKi8KKwlpbnQgbWF4X2NvbHMgPSB0ZXJtX2NvbHVtbnMoKSAtIDE7IC8qIGRvbid0IHByaW50ICpvbiogdGhlIGVkZ2UgKi8KKwlpbnQgaSwgajsKKworCWlmIChzcGFjZSA8IG1heF9jb2xzKQorCQljb2xzID0gbWF4X2NvbHMgLyBzcGFjZTsKKwlyb3dzID0gKGNtZHMtPmNudCArIGNvbHMgLSAxKSAvIGNvbHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CisJCXByaW50ZigiICAiKTsKKworCQlmb3IgKGogPSAwOyBqIDwgY29sczsgaisrKSB7CisJCQlpbnQgbiA9IGogKiByb3dzICsgaTsKKwkJCWludCBzaXplID0gc3BhY2U7CisJCQlpZiAobiA+PSBjbWRzLT5jbnQpCisJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBjb2xzLTEgfHwgbiArIHJvd3MgPj0gY21kcy0+Y250KQorCQkJCXNpemUgPSAxOworCQkJcHJpbnRmKCIlLSpzIiwgc2l6ZSwgY21kcy0+bmFtZXNbbl0tPm5hbWUpOworCQl9CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorfQorCitzdGF0aWMgaW50IGlzX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzdGF0KG5hbWUsICZzdCkgfHwgLyogc3RhdCwgbm90IGxzdGF0ICovCisJICAgICFTX0lTUkVHKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIF9fTUlOR1czMl9fCisJLyogY2Fubm90IHRydXN0IHRoZSBleGVjdXRhYmxlIGJpdCwgcGVlayBpbnRvIHRoZSBmaWxlIGluc3RlYWQgKi8KKwljaGFyIGJ1ZlszXSA9IHsgMCB9OworCWludCBuOworCWludCBmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOworCXN0LnN0X21vZGUgJj0gflNfSVhVU1I7CisJaWYgKGZkID49IDApIHsKKwkJbiA9IHJlYWQoZmQsIGJ1ZiwgMik7CisJCWlmIChuID09IDIpCisJCQkvKiBET1MgZXhlY3V0YWJsZXMgc3RhcnQgd2l0aCAiTVoiICovCisJCQlpZiAoIXN0cmNtcChidWYsICIjISIpIHx8ICFzdHJjbXAoYnVmLCAiTVoiKSkKKwkJCQlzdC5zdF9tb2RlIHw9IFNfSVhVU1I7CisJCWNsb3NlKGZkKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gc3Quc3RfbW9kZSAmIFNfSVhVU1I7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfY29tbWFuZHNfaW5fZGlyKHN0cnVjdCBjbWRuYW1lcyAqY21kcywKKwkJCQkJIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJCSBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IHByZWZpeF9sZW47CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCXN0cnVjdCBzdHJidWYgYnVmID0gU1RSQlVGX0lOSVQ7CisJaW50IGxlbjsKKworCWlmICghZGlyKQorCQlyZXR1cm47CisJaWYgKCFwcmVmaXgpCisJCXByZWZpeCA9ICJwZXJmLSI7CisJcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOworCisJc3RyYnVmX2FkZGYoJmJ1ZiwgIiVzLyIsIHBhdGgpOworCWxlbiA9IGJ1Zi5sZW47CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWludCBlbnRsZW47CisKKwkJaWYgKHByZWZpeGNtcChkZS0+ZF9uYW1lLCBwcmVmaXgpKQorCQkJY29udGludWU7CisKKwkJc3RyYnVmX3NldGxlbigmYnVmLCBsZW4pOworCQlzdHJidWZfYWRkc3RyKCZidWYsIGRlLT5kX25hbWUpOworCQlpZiAoIWlzX2V4ZWN1dGFibGUoYnVmLmJ1ZikpCisJCQljb250aW51ZTsKKworCQllbnRsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSkgLSBwcmVmaXhfbGVuOworCQlpZiAoaGFzX2V4dGVuc2lvbihkZS0+ZF9uYW1lLCAiLmV4ZSIpKQorCQkJZW50bGVuIC09IDQ7CisKKwkJYWRkX2NtZG5hbWUoY21kcywgZGUtPmRfbmFtZSArIHByZWZpeF9sZW4sIGVudGxlbik7CisJfQorCWNsb3NlZGlyKGRpcik7CisJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7Cit9CisKK3ZvaWQgbG9hZF9jb21tYW5kX2xpc3QoY29uc3QgY2hhciAqcHJlZml4LAorCQlzdHJ1Y3QgY21kbmFtZXMgKm1haW5fY21kcywKKwkJc3RydWN0IGNtZG5hbWVzICpvdGhlcl9jbWRzKQoreworCWNvbnN0IGNoYXIgKmVudl9wYXRoID0gZ2V0ZW52KCJQQVRIIik7CisJY29uc3QgY2hhciAqZXhlY19wYXRoID0gcGVyZl9leGVjX3BhdGgoKTsKKworCWlmIChleGVjX3BhdGgpIHsKKwkJbGlzdF9jb21tYW5kc19pbl9kaXIobWFpbl9jbWRzLCBleGVjX3BhdGgsIHByZWZpeCk7CisJCXFzb3J0KG1haW5fY21kcy0+bmFtZXMsIG1haW5fY21kcy0+Y250LAorCQkgICAgICBzaXplb2YoKm1haW5fY21kcy0+bmFtZXMpLCBjbWRuYW1lX2NvbXBhcmUpOworCQl1bmlxKG1haW5fY21kcyk7CisJfQorCisJaWYgKGVudl9wYXRoKSB7CisJCWNoYXIgKnBhdGhzLCAqcGF0aCwgKmNvbG9uOworCQlwYXRoID0gcGF0aHMgPSBzdHJkdXAoZW52X3BhdGgpOworCQl3aGlsZSAoMSkgeworCQkJaWYgKChjb2xvbiA9IHN0cmNocihwYXRoLCBQQVRIX1NFUCkpKQorCQkJCSpjb2xvbiA9IDA7CisJCQlpZiAoIWV4ZWNfcGF0aCB8fCBzdHJjbXAocGF0aCwgZXhlY19wYXRoKSkKKwkJCQlsaXN0X2NvbW1hbmRzX2luX2RpcihvdGhlcl9jbWRzLCBwYXRoLCBwcmVmaXgpOworCisJCQlpZiAoIWNvbG9uKQorCQkJCWJyZWFrOworCQkJcGF0aCA9IGNvbG9uICsgMTsKKwkJfQorCQlmcmVlKHBhdGhzKTsKKworCQlxc29ydChvdGhlcl9jbWRzLT5uYW1lcywgb3RoZXJfY21kcy0+Y250LAorCQkgICAgICBzaXplb2YoKm90aGVyX2NtZHMtPm5hbWVzKSwgY21kbmFtZV9jb21wYXJlKTsKKwkJdW5pcShvdGhlcl9jbWRzKTsKKwl9CisJZXhjbHVkZV9jbWRzKG90aGVyX2NtZHMsIG1haW5fY21kcyk7Cit9CisKK3ZvaWQgbGlzdF9jb21tYW5kcyhjb25zdCBjaGFyICp0aXRsZSwgc3RydWN0IGNtZG5hbWVzICptYWluX2NtZHMsCisJCSAgIHN0cnVjdCBjbWRuYW1lcyAqb3RoZXJfY21kcykKK3sKKwlpbnQgaSwgbG9uZ2VzdCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFpbl9jbWRzLT5jbnQ7IGkrKykKKwkJaWYgKGxvbmdlc3QgPCBtYWluX2NtZHMtPm5hbWVzW2ldLT5sZW4pCisJCQlsb25nZXN0ID0gbWFpbl9jbWRzLT5uYW1lc1tpXS0+bGVuOworCWZvciAoaSA9IDA7IGkgPCBvdGhlcl9jbWRzLT5jbnQ7IGkrKykKKwkJaWYgKGxvbmdlc3QgPCBvdGhlcl9jbWRzLT5uYW1lc1tpXS0+bGVuKQorCQkJbG9uZ2VzdCA9IG90aGVyX2NtZHMtPm5hbWVzW2ldLT5sZW47CisKKwlpZiAobWFpbl9jbWRzLT5jbnQpIHsKKwkJY29uc3QgY2hhciAqZXhlY19wYXRoID0gcGVyZl9leGVjX3BhdGgoKTsKKwkJcHJpbnRmKCJhdmFpbGFibGUgJXMgaW4gJyVzJ1xuIiwgdGl0bGUsIGV4ZWNfcGF0aCk7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLSIpOworCQltcHV0X2NoYXIoJy0nLCBzdHJsZW4odGl0bGUpICsgc3RybGVuKGV4ZWNfcGF0aCkpOworCQlwdXRjaGFyKCdcbicpOworCQlwcmV0dHlfcHJpbnRfc3RyaW5nX2xpc3QobWFpbl9jbWRzLCBsb25nZXN0KTsKKwkJcHV0Y2hhcignXG4nKTsKKwl9CisKKwlpZiAob3RoZXJfY21kcy0+Y250KSB7CisJCXByaW50ZigiJXMgYXZhaWxhYmxlIGZyb20gZWxzZXdoZXJlIG9uIHlvdXIgJFBBVEhcbiIsIHRpdGxlKTsKKwkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJbXB1dF9jaGFyKCctJywgc3RybGVuKHRpdGxlKSk7CisJCXB1dGNoYXIoJ1xuJyk7CisJCXByZXR0eV9wcmludF9zdHJpbmdfbGlzdChvdGhlcl9jbWRzLCBsb25nZXN0KTsKKwkJcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKK2ludCBpc19pbl9jbWRsaXN0KHN0cnVjdCBjbWRuYW1lcyAqYywgY29uc3QgY2hhciAqcykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYy0+Y250OyBpKyspCisJCWlmICghc3RyY21wKHMsIGMtPm5hbWVzW2ldLT5uYW1lKSkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1dG9jb3JyZWN0Oworc3RhdGljIHN0cnVjdCBjbWRuYW1lcyBhbGlhc2VzOworCitzdGF0aWMgaW50IHBlcmZfdW5rbm93bl9jbWRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmNiKQoreworCWlmICghc3RyY21wKHZhciwgImhlbHAuYXV0b2NvcnJlY3QiKSkKKwkJYXV0b2NvcnJlY3QgPSBwZXJmX2NvbmZpZ19pbnQodmFyLHZhbHVlKTsKKwkvKiBBbHNvIHVzZSBhbGlhc2VzIGZvciBjb21tYW5kIGxvb2t1cCAqLworCWlmICghcHJlZml4Y21wKHZhciwgImFsaWFzLiIpKQorCQlhZGRfY21kbmFtZSgmYWxpYXNlcywgdmFyICsgNiwgc3RybGVuKHZhciArIDYpKTsKKworCXJldHVybiBwZXJmX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUsIGNiKTsKK30KKworc3RhdGljIGludCBsZXZlbnNodGVpbl9jb21wYXJlKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3QgY21kbmFtZSAqY29uc3QgKmMxID0gcDEsICpjb25zdCAqYzIgPSBwMjsKKwljb25zdCBjaGFyICpzMSA9ICgqYzEpLT5uYW1lLCAqczIgPSAoKmMyKS0+bmFtZTsKKwlpbnQgbDEgPSAoKmMxKS0+bGVuOworCWludCBsMiA9ICgqYzIpLT5sZW47CisJcmV0dXJuIGwxICE9IGwyID8gbDEgLSBsMiA6IHN0cmNtcChzMSwgczIpOworfQorCitzdGF0aWMgdm9pZCBhZGRfY21kX2xpc3Qoc3RydWN0IGNtZG5hbWVzICpjbWRzLCBzdHJ1Y3QgY21kbmFtZXMgKm9sZCkKK3sKKwlpbnQgaTsKKwlBTExPQ19HUk9XKGNtZHMtPm5hbWVzLCBjbWRzLT5jbnQgKyBvbGQtPmNudCwgY21kcy0+YWxsb2MpOworCisJZm9yIChpID0gMDsgaSA8IG9sZC0+Y250OyBpKyspCisJCWNtZHMtPm5hbWVzW2NtZHMtPmNudCsrXSA9IG9sZC0+bmFtZXNbaV07CisJZnJlZShvbGQtPm5hbWVzKTsKKwlvbGQtPmNudCA9IDA7CisJb2xkLT5uYW1lcyA9IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKmhlbHBfdW5rbm93bl9jbWQoY29uc3QgY2hhciAqY21kKQoreworCWludCBpLCBuID0gMCwgYmVzdF9zaW1pbGFyaXR5ID0gMDsKKwlzdHJ1Y3QgY21kbmFtZXMgbWFpbl9jbWRzLCBvdGhlcl9jbWRzOworCisJbWVtc2V0KCZtYWluX2NtZHMsIDAsIHNpemVvZihtYWluX2NtZHMpKTsKKwltZW1zZXQoJm90aGVyX2NtZHMsIDAsIHNpemVvZihtYWluX2NtZHMpKTsKKwltZW1zZXQoJmFsaWFzZXMsIDAsIHNpemVvZihhbGlhc2VzKSk7CisKKwlwZXJmX2NvbmZpZyhwZXJmX3Vua25vd25fY21kX2NvbmZpZywgTlVMTCk7CisKKwlsb2FkX2NvbW1hbmRfbGlzdCgicGVyZi0iLCAmbWFpbl9jbWRzLCAmb3RoZXJfY21kcyk7CisKKwlhZGRfY21kX2xpc3QoJm1haW5fY21kcywgJmFsaWFzZXMpOworCWFkZF9jbWRfbGlzdCgmbWFpbl9jbWRzLCAmb3RoZXJfY21kcyk7CisJcXNvcnQobWFpbl9jbWRzLm5hbWVzLCBtYWluX2NtZHMuY250LAorCSAgICAgIHNpemVvZihtYWluX2NtZHMubmFtZXMpLCBjbWRuYW1lX2NvbXBhcmUpOworCXVuaXEoJm1haW5fY21kcyk7CisKKwlpZiAobWFpbl9jbWRzLmNudCkgeworCQkvKiBUaGlzIHJldXNlcyBjbWRuYW1lLT5sZW4gZm9yIHNpbWlsYXJpdHkgaW5kZXggKi8KKwkJZm9yIChpID0gMDsgaSA8IG1haW5fY21kcy5jbnQ7ICsraSkKKwkJCW1haW5fY21kcy5uYW1lc1tpXS0+bGVuID0KKwkJCQlsZXZlbnNodGVpbihjbWQsIG1haW5fY21kcy5uYW1lc1tpXS0+bmFtZSwgMCwgMiwgMSwgNCk7CisKKwkJcXNvcnQobWFpbl9jbWRzLm5hbWVzLCBtYWluX2NtZHMuY250LAorCQkgICAgICBzaXplb2YoKm1haW5fY21kcy5uYW1lcyksIGxldmVuc2h0ZWluX2NvbXBhcmUpOworCisJCWJlc3Rfc2ltaWxhcml0eSA9IG1haW5fY21kcy5uYW1lc1swXS0+bGVuOworCQluID0gMTsKKwkJd2hpbGUgKG4gPCBtYWluX2NtZHMuY250ICYmIGJlc3Rfc2ltaWxhcml0eSA9PSBtYWluX2NtZHMubmFtZXNbbl0tPmxlbikKKwkJCSsrbjsKKwl9CisKKwlpZiAoYXV0b2NvcnJlY3QgJiYgbiA9PSAxKSB7CisJCWNvbnN0IGNoYXIgKmFzc3VtZWQgPSBtYWluX2NtZHMubmFtZXNbMF0tPm5hbWU7CisKKwkJbWFpbl9jbWRzLm5hbWVzWzBdID0gTlVMTDsKKwkJY2xlYW5fY21kbmFtZXMoJm1haW5fY21kcyk7CisJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogWW91IGNhbGxlZCBhIEdpdCBwcm9ncmFtIG5hbWVkICclcycsICIKKwkJCSJ3aGljaCBkb2VzIG5vdCBleGlzdC5cbiIKKwkJCSJDb250aW51aW5nIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgeW91IG1lYW50ICclcydcbiIsCisJCQljbWQsIGFzc3VtZWQpOworCQlpZiAoYXV0b2NvcnJlY3QgPiAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImluICUwLjFmIHNlY29uZHMgYXV0b21hdGljYWxseS4uLlxuIiwKKwkJCQkoZmxvYXQpYXV0b2NvcnJlY3QvMTAuMCk7CisJCQlwb2xsKE5VTEwsIDAsIGF1dG9jb3JyZWN0ICogMTAwKTsKKwkJfQorCQlyZXR1cm4gYXNzdW1lZDsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgInBlcmY6ICclcycgaXMgbm90IGEgcGVyZi1jb21tYW5kLiBTZWUgJ3BlcmYgLS1oZWxwJy5cbiIsIGNtZCk7CisKKwlpZiAobWFpbl9jbWRzLmNudCAmJiBiZXN0X3NpbWlsYXJpdHkgPCA2KSB7CisJCWZwcmludGYoc3RkZXJyLCAiXG5EaWQgeW91IG1lYW4gJXM/XG4iLAorCQkJbiA8IDIgPyAidGhpcyI6ICJvbmUgb2YgdGhlc2UiKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJZnByaW50ZihzdGRlcnIsICJcdCVzXG4iLCBtYWluX2NtZHMubmFtZXNbaV0tPm5hbWUpOworCX0KKworCWV4aXQoMSk7Cit9CisKK2ludCBjbWRfdmVyc2lvbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlwcmludGYoInBlcmYgdmVyc2lvbiAlc1xuIiwgcGVyZl92ZXJzaW9uX3N0cmluZyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGVscC5oIGIvdG9vbHMvcGVyZi91dGlsL2hlbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmJjMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlbHAuaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIEhFTFBfSAorI2RlZmluZSBIRUxQX0gKKworc3RydWN0IGNtZG5hbWVzIHsKKwlpbnQgYWxsb2M7CisJaW50IGNudDsKKwlzdHJ1Y3QgY21kbmFtZSB7CisJCXNpemVfdCBsZW47IC8qIGFsc28gdXNlZCBmb3Igc2ltaWxhcml0eSBpbmRleCBpbiBoZWxwLmMgKi8KKwkJY2hhciBuYW1lW0ZMRVhfQVJSQVldOworCX0gKipuYW1lczsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcHV0X2NoYXIoY2hhciBjLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXdoaWxlKG51bS0tKQorCQlwdXRjaGFyKGMpOworfQorCit2b2lkIGxvYWRfY29tbWFuZF9saXN0KGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJc3RydWN0IGNtZG5hbWVzICptYWluX2NtZHMsCisJCXN0cnVjdCBjbWRuYW1lcyAqb3RoZXJfY21kcyk7Cit2b2lkIGFkZF9jbWRuYW1lKHN0cnVjdCBjbWRuYW1lcyAqY21kcywgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbik7CisvKiBIZXJlIHdlIHJlcXVpcmUgdGhhdCBleGNsdWRlcyBpcyBhIHNvcnRlZCBsaXN0LiAqLwordm9pZCBleGNsdWRlX2NtZHMoc3RydWN0IGNtZG5hbWVzICpjbWRzLCBzdHJ1Y3QgY21kbmFtZXMgKmV4Y2x1ZGVzKTsKK2ludCBpc19pbl9jbWRsaXN0KHN0cnVjdCBjbWRuYW1lcyAqYywgY29uc3QgY2hhciAqcyk7Cit2b2lkIGxpc3RfY29tbWFuZHMoY29uc3QgY2hhciAqdGl0bGUsIHN0cnVjdCBjbWRuYW1lcyAqbWFpbl9jbWRzLAorCQkgICBzdHJ1Y3QgY21kbmFtZXMgKm90aGVyX2NtZHMpOworCisjZW5kaWYgLyogSEVMUF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbGV2ZW5zaHRlaW4uYyBiL3Rvb2xzL3BlcmYvdXRpbC9sZXZlbnNodGVpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjFkMTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvbGV2ZW5zaHRlaW4uYwpAQCAtMCwwICsxLDg0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJsZXZlbnNodGVpbi5oIgorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBEYW1lcmF1LUxldmVuc2h0ZWluIGFsZ29yaXRobSB0bworICogY2FsY3VsYXRlIGEgZGlzdGFuY2UgYmV0d2VlbiBzdHJpbmdzLgorICoKKyAqIEJhc2ljYWxseSwgaXQgc2F5cyBob3cgbWFueSBsZXR0ZXJzIG5lZWQgdG8gYmUgc3dhcHBlZCwgc3Vic3RpdHV0ZWQsCisgKiBkZWxldGVkIGZyb20sIG9yIGFkZGVkIHRvIHN0cmluZzEsIGF0IGxlYXN0LCB0byBnZXQgc3RyaW5nMi4KKyAqCisgKiBUaGUgaWRlYSBpcyB0byBidWlsZCBhIGRpc3RhbmNlIG1hdHJpeCBmb3IgdGhlIHN1YnN0cmluZ3Mgb2YgYm90aAorICogc3RyaW5ncy4gIFRvIGF2b2lkIGEgbGFyZ2Ugc3BhY2UgY29tcGxleGl0eSwgb25seSB0aGUgbGFzdCB0aHJlZSByb3dzCisgKiBhcmUga2VwdCBpbiBtZW1vcnkgKGlmIHN3YXBzIGhhZCB0aGUgc2FtZSBvciBoaWdoZXIgY29zdCBhcyBvbmUgZGVsZXRpb24KKyAqIHBsdXMgb25lIGluc2VydGlvbiwgb25seSB0d28gcm93cyB3b3VsZCBiZSBuZWVkZWQpLgorICoKKyAqIEF0IGFueSBzdGFnZSwgImkgKyAxIiBkZW5vdGVzIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgc3Vic3RyaW5nIG9mCisgKiBzdHJpbmcxIHRoYXQgdGhlIGRpc3RhbmNlIGlzIGNhbGN1bGF0ZWQgZm9yLgorICoKKyAqIHJvdzIgaG9sZHMgdGhlIGN1cnJlbnQgcm93LCByb3cxIHRoZSBwcmV2aW91cyByb3cgKGkuZS4gZm9yIHRoZSBzdWJzdHJpbmcKKyAqIG9mIHN0cmluZzEgb2YgbGVuZ3RoICJpIiksIGFuZCByb3cwIHRoZSByb3cgYmVmb3JlIHRoYXQuCisgKgorICogSW4gb3RoZXIgd29yZHMsIGF0IHRoZSBzdGFydCBvZiB0aGUgYmlnIGxvb3AsIHJvdzJbaiArIDFdIGNvbnRhaW5zIHRoZQorICogRGFtZXJhdS1MZXZlbnNodGVpbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdWJzdHJpbmcgb2Ygc3RyaW5nMSBvZiBsZW5ndGgKKyAqICJpIiBhbmQgdGhlIHN1YnN0cmluZyBvZiBzdHJpbmcyIG9mIGxlbmd0aCAiaiArIDEiLgorICoKKyAqIEFsbCB0aGUgYmlnIGxvb3AgZG9lcyBpcyBkZXRlcm1pbmUgdGhlIHBhcnRpYWwgbWluaW11bS1jb3N0IHBhdGhzLgorICoKKyAqIEl0IGRvZXMgc28gYnkgY2FsY3VsYXRpbmcgdGhlIGNvc3RzIG9mIHRoZSBwYXRoIGVuZGluZyBpbiBjaGFyYWN0ZXJzCisgKiBpIChpbiBzdHJpbmcxKSBhbmQgaiAoaW4gc3RyaW5nMiksIHJlc3BlY3RpdmVseSwgZ2l2ZW4gdGhhdCB0aGUgbGFzdAorICogb3BlcmF0aW9uIGlzIGEgc3Vic3RpdGlvbiwgYSBzd2FwLCBhIGRlbGV0aW9uLCBvciBhbiBpbnNlcnRpb24uCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgdGhlIGNvc3RzIHRvIGJlIHdlaWdodGVkOgorICoKKyAqIC0gdyAoYXMgaW4gInNXYXAiKQorICogLSBzIChhcyBpbiAiU3Vic3RpdHV0aW9uIikKKyAqIC0gYSAoZm9yIGluc2VydGlvbiwgQUtBICJBZGQiKQorICogLSBkIChhcyBpbiAiRGVsZXRpb24iKQorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWxjdWxhdGVzIGEgZGlzdGFuY2UgX2lmZl8gZCA9PSBhLgorICovCitpbnQgbGV2ZW5zaHRlaW4oY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMiwKKwkJaW50IHcsIGludCBzLCBpbnQgYSwgaW50IGQpCit7CisJaW50IGxlbjEgPSBzdHJsZW4oc3RyaW5nMSksIGxlbjIgPSBzdHJsZW4oc3RyaW5nMik7CisJaW50ICpyb3cwID0gbWFsbG9jKHNpemVvZihpbnQpICogKGxlbjIgKyAxKSk7CisJaW50ICpyb3cxID0gbWFsbG9jKHNpemVvZihpbnQpICogKGxlbjIgKyAxKSk7CisJaW50ICpyb3cyID0gbWFsbG9jKHNpemVvZihpbnQpICogKGxlbjIgKyAxKSk7CisJaW50IGksIGo7CisKKwlmb3IgKGogPSAwOyBqIDw9IGxlbjI7IGorKykKKwkJcm93MVtqXSA9IGogKiBhOworCWZvciAoaSA9IDA7IGkgPCBsZW4xOyBpKyspIHsKKwkJaW50ICpkdW1teTsKKworCQlyb3cyWzBdID0gKGkgKyAxKSAqIGQ7CisJCWZvciAoaiA9IDA7IGogPCBsZW4yOyBqKyspIHsKKwkJCS8qIHN1YnN0aXR1dGlvbiAqLworCQkJcm93MltqICsgMV0gPSByb3cxW2pdICsgcyAqIChzdHJpbmcxW2ldICE9IHN0cmluZzJbal0pOworCQkJLyogc3dhcCAqLworCQkJaWYgKGkgPiAwICYmIGogPiAwICYmIHN0cmluZzFbaSAtIDFdID09IHN0cmluZzJbal0gJiYKKwkJCQkJc3RyaW5nMVtpXSA9PSBzdHJpbmcyW2ogLSAxXSAmJgorCQkJCQlyb3cyW2ogKyAxXSA+IHJvdzBbaiAtIDFdICsgdykKKwkJCQlyb3cyW2ogKyAxXSA9IHJvdzBbaiAtIDFdICsgdzsKKwkJCS8qIGRlbGV0aW9uICovCisJCQlpZiAocm93MltqICsgMV0gPiByb3cxW2ogKyAxXSArIGQpCisJCQkJcm93MltqICsgMV0gPSByb3cxW2ogKyAxXSArIGQ7CisJCQkvKiBpbnNlcnRpb24gKi8KKwkJCWlmIChyb3cyW2ogKyAxXSA+IHJvdzJbal0gKyBhKQorCQkJCXJvdzJbaiArIDFdID0gcm93MltqXSArIGE7CisJCX0KKworCQlkdW1teSA9IHJvdzA7CisJCXJvdzAgPSByb3cxOworCQlyb3cxID0gcm93MjsKKwkJcm93MiA9IGR1bW15OworCX0KKworCWkgPSByb3cxW2xlbjJdOworCWZyZWUocm93MCk7CisJZnJlZShyb3cxKTsKKwlmcmVlKHJvdzIpOworCisJcmV0dXJuIGk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbGV2ZW5zaHRlaW4uaCBiL3Rvb2xzL3BlcmYvdXRpbC9sZXZlbnNodGVpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzNhYmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvbGV2ZW5zaHRlaW4uaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgTEVWRU5TSFRFSU5fSAorI2RlZmluZSBMRVZFTlNIVEVJTl9ICisKK2ludCBsZXZlbnNodGVpbihjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyLAorCWludCBzd2FwX3BlbmFsdHksIGludCBzdWJzdGl0aW9uX3BlbmFsdHksCisJaW50IGluc2VydGlvbl9wZW5hbHR5LCBpbnQgZGVsZXRpb25fcGVuYWx0eSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2xpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1NDhlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9saXN0LmgKQEAgLTAsMCArMSw2MDMgQEAKKyNpZm5kZWYgX0xJTlVYX0xJU1RfSAorI2RlZmluZSBfTElOVVhfTElTVF9ICisvKgorICBDb3B5cmlnaHQgKEMpIENhc3Qgb2YgZG96ZW5zLCBjb21lcyBmcm9tIHRoZSBMaW51eCBrZXJuZWwKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoKKyAqIFRoZXNlIGFyZSBub24tTlVMTCBwb2ludGVycyB0aGF0IHdpbGwgcmVzdWx0IGluIHBhZ2UgZmF1bHRzCisgKiB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdXNlZCB0byB2ZXJpZnkgdGhhdCBub2JvZHkgdXNlcworICogbm9uLWluaXRpYWxpemVkIGxpc3QgZW50cmllcy4KKyAqLworI2RlZmluZSBMSVNUX1BPSVNPTjEgKCh2b2lkICopMHgwMDEwMDEwMCkKKyNkZWZpbmUgTElTVF9QT0lTT04yICgodm9pZCAqKTB4MDAyMDAyMDApCisKKy8qKgorICogY29udGFpbmVyX29mIC0gY2FzdCBhIG1lbWJlciBvZiBhIHN0cnVjdHVyZSBvdXQgdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlCisgKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqLworI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkJXAorICAgICAgICBjb25zdCB0eXBlb2YoICgodHlwZSAqKTApLT5tZW1iZXIgKSAqX19tcHRyID0gKHB0cik7CVwKKyAgICAgICAgKHR5cGUgKikoIChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICk7fSkKKworLyoKKyAqIFNpbXBsZSBkb3VibHkgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24uCisgKgorICogU29tZSBvZiB0aGUgaW50ZXJuYWwgZnVuY3Rpb25zICgiX194eHgiKSBhcmUgdXNlZnVsIHdoZW4KKyAqIG1hbmlwdWxhdGluZyB3aG9sZSBsaXN0cyByYXRoZXIgdGhhbiBzaW5nbGUgZW50cmllcywgYXMKKyAqIHNvbWV0aW1lcyB3ZSBhbHJlYWR5IGtub3cgdGhlIG5leHQvcHJldiBlbnRyaWVzIGFuZCB3ZSBjYW4KKyAqIGdlbmVyYXRlIGJldHRlciBjb2RlIGJ5IHVzaW5nIHRoZW0gZGlyZWN0bHkgcmF0aGVyIHRoYW4KKyAqIHVzaW5nIHRoZSBnZW5lcmljIHNpbmdsZS1lbnRyeSByb3V0aW5lcy4KKyAqLworCitzdHJ1Y3QgbGlzdF9oZWFkIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0LCAqcHJldjsKK307CisKKyNkZWZpbmUgTElTVF9IRUFEX0lOSVQobmFtZSkgeyAmKG5hbWUpLCAmKG5hbWUpIH0KKworI2RlZmluZSBMSVNUX0hFQUQobmFtZSkgXAorCXN0cnVjdCBsaXN0X2hlYWQgbmFtZSA9IExJU1RfSEVBRF9JTklUKG5hbWUpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBJTklUX0xJU1RfSEVBRChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCWxpc3QtPm5leHQgPSBsaXN0OworCWxpc3QtPnByZXYgPSBsaXN0OworfQorCisvKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJldHdlZW4gdHdvIGtub3duIGNvbnNlY3V0aXZlIGVudHJpZXMuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqbmV3LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcHJldiwKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQpCit7CisJbmV4dC0+cHJldiA9IG5ldzsKKwluZXctPm5leHQgPSBuZXh0OworCW5ldy0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5ldzsKK30KKworLyoqCisgKiBsaXN0X2FkZCAtIGFkZCBhIG5ldyBlbnRyeQorICogQG5ldzogbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDogbGlzdCBoZWFkIHRvIGFkZCBpdCBhZnRlcgorICoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBhZnRlciB0aGUgc3BlY2lmaWVkIGhlYWQuCisgKiBUaGlzIGlzIGdvb2QgZm9yIGltcGxlbWVudGluZyBzdGFja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2FkZChuZXcsIGhlYWQsIGhlYWQtPm5leHQpOworfQorCisvKioKKyAqIGxpc3RfYWRkX3RhaWwgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6IGxpc3QgaGVhZCB0byBhZGQgaXQgYmVmb3JlCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJlZm9yZSB0aGUgc3BlY2lmaWVkIGhlYWQuCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHF1ZXVlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQobmV3LCBoZWFkLT5wcmV2LCBoZWFkKTsKK30KKworLyoKKyAqIERlbGV0ZSBhIGxpc3QgZW50cnkgYnkgbWFraW5nIHRoZSBwcmV2L25leHQgZW50cmllcworICogcG9pbnQgdG8gZWFjaCBvdGhlci4KKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICogcHJldiwgc3RydWN0IGxpc3RfaGVhZCAqIG5leHQpCit7CisJbmV4dC0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5leHQ7Cit9CisKKy8qKgorICogbGlzdF9kZWwgLSBkZWxldGVzIGVudHJ5IGZyb20gbGlzdC4KKyAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKiBOb3RlOiBsaXN0X2VtcHR5IG9uIGVudHJ5IGRvZXMgbm90IHJldHVybiB0cnVlIGFmdGVyIHRoaXMsIHRoZSBlbnRyeSBpcworICogaW4gYW4gdW5kZWZpbmVkIHN0YXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworCWVudHJ5LT5uZXh0ID0gTElTVF9QT0lTT04xOworCWVudHJ5LT5wcmV2ID0gTElTVF9QT0lTT04yOworfQorCisvKioKKyAqIGxpc3RfZGVsX3JhbmdlIC0gZGVsZXRlcyByYW5nZSBvZiBlbnRyaWVzIGZyb20gbGlzdC4KKyAqIEBiZWdpbmc6IGZpcnN0IGVsZW1lbnQgaW4gdGhlIHJhbmdlIHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0LgorICogQGJlZ2luZzogZmlyc3QgZWxlbWVudCBpbiB0aGUgcmFuZ2UgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKiBOb3RlOiBsaXN0X2VtcHR5IG9uIHRoZSByYW5nZSBvZiBlbnRyaWVzIGRvZXMgbm90IHJldHVybiB0cnVlIGFmdGVyIHRoaXMsCisgKiB0aGUgZW50cmllcyBpcyBpbiBhbiB1bmRlZmluZWQgc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2RlbF9yYW5nZShzdHJ1Y3QgbGlzdF9oZWFkICpiZWdpbiwKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKmVuZCkKK3sKKwliZWdpbi0+cHJldi0+bmV4dCA9IGVuZC0+bmV4dDsKKwllbmQtPm5leHQtPnByZXYgPSBiZWdpbi0+cHJldjsKK30KKworLyoqCisgKiBsaXN0X3JlcGxhY2UgLSByZXBsYWNlIG9sZCBlbnRyeSBieSBuZXcgb25lCisgKiBAb2xkIDogdGhlIGVsZW1lbnQgdG8gYmUgcmVwbGFjZWQKKyAqIEBuZXcgOiB0aGUgbmV3IGVsZW1lbnQgdG8gaW5zZXJ0CisgKiBOb3RlOiBpZiAnb2xkJyB3YXMgZW1wdHksIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X3JlcGxhY2Uoc3RydWN0IGxpc3RfaGVhZCAqb2xkLAorCQkJCXN0cnVjdCBsaXN0X2hlYWQgKm5ldykKK3sKKwluZXctPm5leHQgPSBvbGQtPm5leHQ7CisJbmV3LT5uZXh0LT5wcmV2ID0gbmV3OworCW5ldy0+cHJldiA9IG9sZC0+cHJldjsKKwluZXctPnByZXYtPm5leHQgPSBuZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X3JlcGxhY2VfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpvbGQsCisJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKm5ldykKK3sKKwlsaXN0X3JlcGxhY2Uob2xkLCBuZXcpOworCUlOSVRfTElTVF9IRUFEKG9sZCk7Cit9CisKKy8qKgorICogbGlzdF9kZWxfaW5pdCAtIGRlbGV0ZXMgZW50cnkgZnJvbSBsaXN0IGFuZCByZWluaXRpYWxpemUgaXQuCisgKiBAZW50cnk6IHRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9kZWxfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKK3sKKwlfX2xpc3RfZGVsKGVudHJ5LT5wcmV2LCBlbnRyeS0+bmV4dCk7CisJSU5JVF9MSVNUX0hFQUQoZW50cnkpOworfQorCisvKioKKyAqIGxpc3RfbW92ZSAtIGRlbGV0ZSBmcm9tIG9uZSBsaXN0IGFuZCBhZGQgYXMgYW5vdGhlcidzIGhlYWQKKyAqIEBsaXN0OiB0aGUgZW50cnkgdG8gbW92ZQorICogQGhlYWQ6IHRoZSBoZWFkIHRoYXQgd2lsbCBwcmVjZWRlIG91ciBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9tb3ZlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisgICAgICAgIF9fbGlzdF9kZWwobGlzdC0+cHJldiwgbGlzdC0+bmV4dCk7CisgICAgICAgIGxpc3RfYWRkKGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxpc3RfbW92ZV90YWlsIC0gZGVsZXRlIGZyb20gb25lIGxpc3QgYW5kIGFkZCBhcyBhbm90aGVyJ3MgdGFpbAorICogQGxpc3Q6IHRoZSBlbnRyeSB0byBtb3ZlCisgKiBAaGVhZDogdGhlIGhlYWQgdGhhdCB3aWxsIGZvbGxvdyBvdXIgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZV90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworICAgICAgICBfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOworICAgICAgICBsaXN0X2FkZF90YWlsKGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxpc3RfaXNfbGFzdCAtIHRlc3RzIHdoZXRoZXIgQGxpc3QgaXMgdGhlIGxhc3QgZW50cnkgaW4gbGlzdCBAaGVhZAorICogQGxpc3Q6IHRoZSBlbnRyeSB0byB0ZXN0CisgKiBAaGVhZDogdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgbGlzdF9pc19sYXN0KGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gbGlzdC0+bmV4dCA9PSBoZWFkOworfQorCisvKioKKyAqIGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eQorICogQGhlYWQ6IHRoZSBsaXN0IHRvIHRlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOworfQorCisvKioKKyAqIGxpc3RfZW1wdHlfY2FyZWZ1bCAtIHRlc3RzIHdoZXRoZXIgYSBsaXN0IGlzIGVtcHR5IGFuZCBub3QgYmVpbmcgbW9kaWZpZWQKKyAqIEBoZWFkOiB0aGUgbGlzdCB0byB0ZXN0CisgKgorICogRGVzY3JpcHRpb246CisgKiB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eSBfYW5kXyBjaGVja3MgdGhhdCBubyBvdGhlciBDUFUgbWlnaHQgYmUKKyAqIGluIHRoZSBwcm9jZXNzIG9mIG1vZGlmeWluZyBlaXRoZXIgbWVtYmVyIChuZXh0IG9yIHByZXYpCisgKgorICogTk9URTogdXNpbmcgbGlzdF9lbXB0eV9jYXJlZnVsKCkgd2l0aG91dCBzeW5jaHJvbml6YXRpb24KKyAqIGNhbiBvbmx5IGJlIHNhZmUgaWYgdGhlIG9ubHkgYWN0aXZpdHkgdGhhdCBjYW4gaGFwcGVuCisgKiB0byB0aGUgbGlzdCBlbnRyeSBpcyBsaXN0X2RlbF9pbml0KCkuIEVnLiBpdCBjYW5ub3QgYmUgdXNlZAorICogaWYgYW5vdGhlciBDUFUgY291bGQgcmUtbGlzdF9hZGQoKSBpdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbGlzdF9lbXB0eV9jYXJlZnVsKGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IGhlYWQtPm5leHQ7CisJcmV0dXJuIChuZXh0ID09IGhlYWQpICYmIChuZXh0ID09IGhlYWQtPnByZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X3NwbGljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0ID0gbGlzdC0+bmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0ID0gbGlzdC0+cHJldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICphdCA9IGhlYWQtPm5leHQ7CisKKwlmaXJzdC0+cHJldiA9IGhlYWQ7CisJaGVhZC0+bmV4dCA9IGZpcnN0OworCisJbGFzdC0+bmV4dCA9IGF0OworCWF0LT5wcmV2ID0gbGFzdDsKK30KKworLyoqCisgKiBsaXN0X3NwbGljZSAtIGpvaW4gdHdvIGxpc3RzCisgKiBAbGlzdDogdGhlIG5ldyBsaXN0IHRvIGFkZC4KKyAqIEBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlpZiAoIWxpc3RfZW1wdHkobGlzdCkpCisJCV9fbGlzdF9zcGxpY2UobGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGlzdF9zcGxpY2VfaW5pdCAtIGpvaW4gdHdvIGxpc3RzIGFuZCByZWluaXRpYWxpc2UgdGhlIGVtcHRpZWQgbGlzdC4KKyAqIEBsaXN0OiB0aGUgbmV3IGxpc3QgdG8gYWRkLgorICogQGhlYWQ6IHRoZSBwbGFjZSB0byBhZGQgaXQgaW4gdGhlIGZpcnN0IGxpc3QuCisgKgorICogVGhlIGxpc3QgYXQgQGxpc3QgaXMgcmVpbml0aWFsaXNlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2VfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCWlmICghbGlzdF9lbXB0eShsaXN0KSkgeworCQlfX2xpc3Rfc3BsaWNlKGxpc3QsIGhlYWQpOworCQlJTklUX0xJU1RfSEVBRChsaXN0KTsKKwl9Cit9CisKKy8qKgorICogbGlzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5CisgKiBAcHRyOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgcG9pbnRlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCWNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikKKworLyoqCisgKiBsaXN0X2ZpcnN0X2VudHJ5IC0gZ2V0IHRoZSBmaXJzdCBlbGVtZW50IGZyb20gYSBsaXN0CisgKiBAcHRyOiAgICAgICB0aGUgbGlzdCBoZWFkIHRvIHRha2UgdGhlIGVsZW1lbnQgZnJvbS4KKyAqIEB0eXBlOiAgICAgIHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6ICAgIHRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBOb3RlLCB0aGF0IGxpc3QgaXMgZXhwZWN0ZWQgdG8gYmUgbm90IGVtcHR5LgorICovCisjZGVmaW5lIGxpc3RfZmlyc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIFwKKwlsaXN0X2VudHJ5KChwdHIpLT5uZXh0LCB0eXBlLCBtZW1iZXIpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaAktCWl0ZXJhdGUgb3ZlciBhIGxpc3QKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKKyAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBfX2xpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqCisgKiBUaGlzIHZhcmlhbnQgZGlmZmVycyBmcm9tIGxpc3RfZm9yX2VhY2goKSBpbiB0aGF0IGl0J3MgdGhlCisgKiBzaW1wbGVzdCBwb3NzaWJsZSBsaXN0IGl0ZXJhdGlvbiBjb2RlLCBubyBwcmVmZXRjaGluZyBpcyBkb25lLgorICogVXNlIHRoaXMgZm9yIGNvZGUgdGhhdCBrbm93cyB0aGUgbGlzdCB0byBiZSB2ZXJ5IHNob3J0IChlbXB0eQorICogb3IgMSBlbnRyeSkgbW9zdCBvZiB0aGUgdGltZS4KKyAqLworI2RlZmluZSBfX2xpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX3ByZXYJLQlpdGVyYXRlIG92ZXIgYSBsaXN0IGJhY2t3YXJkcworICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5wcmV2OyBwb3MgIT0gKGhlYWQpOyBcCisgICAgICAgIAlwb3MgPSBwb3MtPnByZXYpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9zYWZlIC0gaXRlcmF0ZSBvdmVyIGEgbGlzdCBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbjoJCWFub3RoZXIgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIG4gPSBwb3MtPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKKwkJcG9zID0gbiwgbiA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5CS0JaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpCQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UgLSBpdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZS4KKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocG9zLCBoZWFkLCBtZW1iZXIpCQkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCVwKKwkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIucHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQorCisvKioKKyAqIGxpc3RfcHJlcGFyZV9lbnRyeSAtIHByZXBhcmUgYSBwb3MgZW50cnkgZm9yIHVzZSBpbiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIHN0YXJ0IHBvaW50CisgKiBAaGVhZDoJdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBQcmVwYXJlcyBhIHBvcyBlbnRyeSBmb3IgdXNlIGFzIGEgc3RhcnQgcG9pbnQgaW4gbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZS4KKyAqLworI2RlZmluZSBsaXN0X3ByZXBhcmVfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpIFwKKwkoKHBvcykgPyA6IGxpc3RfZW50cnkoaGVhZCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUgLSBjb250aW51ZSBpdGVyYXRpb24gb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBDb250aW51ZSB0byBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLCBjb250aW51aW5nIGFmdGVyCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHBvcywgaGVhZCwgbWVtYmVyKSAJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOwlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20gLSBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBJdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLCBjb250aW51aW5nIGZyb20gY3VycmVudCBwb3NpdGlvbi4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20ocG9zLCBoZWFkLCBtZW1iZXIpIAkJCVwKKwlmb3IgKDsgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJXAorCSAgICAgcG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIC0gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sIGhlYWQsIG1lbWJlcikJCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogSXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgY29udGludWluZyBhZnRlciBjdXJyZW50IHBvaW50LAorICogc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUocG9zLCBuLCBoZWFkLCBtZW1iZXIpIAkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksIAkJXAorCQluID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwkJCQkJCVwKKwkgICAgIHBvcyA9IG4sIG4gPSBsaXN0X2VudHJ5KG4tPm1lbWJlci5uZXh0LCB0eXBlb2YoKm4pLCBtZW1iZXIpKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9mcm9tCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIEl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgZnJvbSBjdXJyZW50IHBvaW50LCBzYWZlIGFnYWluc3QKKyAqIHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShwb3MsIG4sIGhlYWQsIG1lbWJlcikgCQkJXAorCWZvciAobiA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOwkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBuOgkJYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBJdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgc2FmZSBhZ2FpbnN0IHJlbW92YWwKKyAqIG9mIGxpc3QgZW50cnkuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocG9zLCBuLCBoZWFkLCBtZW1iZXIpCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+cHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIucHJldiwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoKKyAqIERvdWJsZSBsaW5rZWQgbGlzdHMgd2l0aCBhIHNpbmdsZSBwb2ludGVyIGxpc3QgaGVhZC4KKyAqIE1vc3RseSB1c2VmdWwgZm9yIGhhc2ggdGFibGVzIHdoZXJlIHRoZSB0d28gcG9pbnRlciBsaXN0IGhlYWQgaXMKKyAqIHRvbyB3YXN0ZWZ1bC4KKyAqIFlvdSBsb3NlIHRoZSBhYmlsaXR5IHRvIGFjY2VzcyB0aGUgdGFpbCBpbiBPKDEpLgorICovCisKK3N0cnVjdCBobGlzdF9oZWFkIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqZmlyc3Q7Cit9OworCitzdHJ1Y3QgaGxpc3Rfbm9kZSB7CisJc3RydWN0IGhsaXN0X25vZGUgKm5leHQsICoqcHByZXY7Cit9OworCisjZGVmaW5lIEhMSVNUX0hFQURfSU5JVCB7IC5maXJzdCA9IE5VTEwgfQorI2RlZmluZSBITElTVF9IRUFEKG5hbWUpIHN0cnVjdCBobGlzdF9oZWFkIG5hbWUgPSB7ICAuZmlyc3QgPSBOVUxMIH0KKyNkZWZpbmUgSU5JVF9ITElTVF9IRUFEKHB0cikgKChwdHIpLT5maXJzdCA9IE5VTEwpCitzdGF0aWMgaW5saW5lIHZvaWQgSU5JVF9ITElTVF9OT0RFKHN0cnVjdCBobGlzdF9ub2RlICpoKQoreworCWgtPm5leHQgPSBOVUxMOworCWgtPnBwcmV2ID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGxpc3RfdW5oYXNoZWQoY29uc3Qgc3RydWN0IGhsaXN0X25vZGUgKmgpCit7CisJcmV0dXJuICFoLT5wcHJldjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGxpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGhsaXN0X2hlYWQgKmgpCit7CisJcmV0dXJuICFoLT5maXJzdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faGxpc3RfZGVsKHN0cnVjdCBobGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpuZXh0ID0gbi0+bmV4dDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqKnBwcmV2ID0gbi0+cHByZXY7CisJKnBwcmV2ID0gbmV4dDsKKwlpZiAobmV4dCkKKwkJbmV4dC0+cHByZXYgPSBwcHJldjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhsaXN0X2RlbChzdHJ1Y3QgaGxpc3Rfbm9kZSAqbikKK3sKKwlfX2hsaXN0X2RlbChuKTsKKwluLT5uZXh0ID0gTElTVF9QT0lTT04xOworCW4tPnBwcmV2ID0gTElTVF9QT0lTT04yOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGxpc3RfZGVsX2luaXQoc3RydWN0IGhsaXN0X25vZGUgKm4pCit7CisJaWYgKCFobGlzdF91bmhhc2hlZChuKSkgeworCQlfX2hsaXN0X2RlbChuKTsKKwkJSU5JVF9ITElTVF9OT0RFKG4pOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGhsaXN0X2FkZF9oZWFkKHN0cnVjdCBobGlzdF9ub2RlICpuLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaCkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqZmlyc3QgPSBoLT5maXJzdDsKKwluLT5uZXh0ID0gZmlyc3Q7CisJaWYgKGZpcnN0KQorCQlmaXJzdC0+cHByZXYgPSAmbi0+bmV4dDsKKwloLT5maXJzdCA9IG47CisJbi0+cHByZXYgPSAmaC0+Zmlyc3Q7Cit9CisKKy8qIG5leHQgbXVzdCBiZSAhPSBOVUxMICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGxpc3RfYWRkX2JlZm9yZShzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwKKwkJCQkJc3RydWN0IGhsaXN0X25vZGUgKm5leHQpCit7CisJbi0+cHByZXYgPSBuZXh0LT5wcHJldjsKKwluLT5uZXh0ID0gbmV4dDsKKwluZXh0LT5wcHJldiA9ICZuLT5uZXh0OworCSoobi0+cHByZXYpID0gbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhsaXN0X2FkZF9hZnRlcihzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwKKwkJCQkJc3RydWN0IGhsaXN0X25vZGUgKm5leHQpCit7CisJbmV4dC0+bmV4dCA9IG4tPm5leHQ7CisJbi0+bmV4dCA9IG5leHQ7CisJbmV4dC0+cHByZXYgPSAmbi0+bmV4dDsKKworCWlmKG5leHQtPm5leHQpCisJCW5leHQtPm5leHQtPnBwcmV2ICA9ICZuZXh0LT5uZXh0OworfQorCisjZGVmaW5lIGhsaXN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBjb250YWluZXJfb2YocHRyLHR5cGUsbWVtYmVyKQorCisjZGVmaW5lIGhsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5maXJzdDsgcG9zOyBcCisJICAgICBwb3MgPSBwb3MtPm5leHQpCisKKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+Zmlyc3Q7IHBvcyAmJiAoeyBuID0gcG9zLT5uZXh0OyAxOyB9KTsgXAorCSAgICAgcG9zID0gbikKKworLyoqCisgKiBobGlzdF9mb3JfZWFjaF9lbnRyeQktIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEB0cG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnkodHBvcywgcG9zLCBoZWFkLCBtZW1iZXIpCQkJIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+Zmlyc3Q7CQkJCQkgXAorCSAgICAgcG9zICYmIAkJCSBcCisJCSh7IHRwb3MgPSBobGlzdF9lbnRyeShwb3MsIHR5cGVvZigqdHBvcyksIG1lbWJlcik7IDE7fSk7IFwKKwkgICAgIHBvcyA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBobGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSAtIGl0ZXJhdGUgb3ZlciBhIGhsaXN0IGNvbnRpbnVpbmcgYWZ0ZXIgY3VycmVudCBwb2ludAorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUodHBvcywgcG9zLCBtZW1iZXIpCQkgXAorCWZvciAocG9zID0gKHBvcyktPm5leHQ7CQkJCQkJIFwKKwkgICAgIHBvcyAmJiAJCQkgXAorCQkoeyB0cG9zID0gaGxpc3RfZW50cnkocG9zLCB0eXBlb2YoKnRwb3MpLCBtZW1iZXIpOyAxO30pOyBcCisJICAgICBwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogaGxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbSAtIGl0ZXJhdGUgb3ZlciBhIGhsaXN0IGNvbnRpbnVpbmcgZnJvbSBjdXJyZW50IHBvaW50CisgKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBwb3M6CXRoZSAmc3RydWN0IGhsaXN0X25vZGUgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgaGxpc3Rfbm9kZSB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBobGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKHRwb3MsIHBvcywgbWVtYmVyKQkJCSBcCisJZm9yICg7IHBvcyAmJiAJCQkgXAorCQkoeyB0cG9zID0gaGxpc3RfZW50cnkocG9zLCB0eXBlb2YoKnRwb3MpLCBtZW1iZXIpOyAxO30pOyBcCisJICAgICBwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAtIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cG9zLCBwb3MsIG4sIGhlYWQsIG1lbWJlcikgCQkgXAorCWZvciAocG9zID0gKGhlYWQpLT5maXJzdDsJCQkJCSBcCisJICAgICBwb3MgJiYgKHsgbiA9IHBvcy0+bmV4dDsgMTsgfSkgJiYgCQkJCSBcCisJCSh7IHRwb3MgPSBobGlzdF9lbnRyeShwb3MsIHR5cGVvZigqdHBvcyksIG1lbWJlcik7IDE7fSk7IFwKKwkgICAgIHBvcyA9IG4pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhZ2VyLmMgYi90b29scy9wZXJmL3V0aWwvcGFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhiY2NhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhZ2VyLmMKQEAgLTAsMCArMSw5OSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJzaWdjaGFpbi5oIgorCisvKgorICogVGhpcyBpcyBzcGxpdCB1cCBmcm9tIHRoZSByZXN0IG9mIGdpdCBzbyB0aGF0IHdlIGNhbiBkbworICogc29tZXRoaW5nIGRpZmZlcmVudCBvbiBXaW5kb3dzLgorICovCisKK3N0YXRpYyBpbnQgc3Bhd25lZF9wYWdlcjsKKworI2lmbmRlZiBfX01JTkdXMzJfXworc3RhdGljIHZvaWQgcGFnZXJfcHJlZXhlYyh2b2lkKQoreworCS8qCisJICogV29yayBhcm91bmQgYnVnIGluICJsZXNzIiBieSBub3Qgc3RhcnRpbmcgaXQgdW50aWwgd2UKKwkgKiBoYXZlIHJlYWwgaW5wdXQKKwkgKi8KKwlmZF9zZXQgaW47CisKKwlGRF9aRVJPKCZpbik7CisJRkRfU0VUKDAsICZpbik7CisJc2VsZWN0KDEsICZpbiwgTlVMTCwgJmluLCBOVUxMKTsKKworCXNldGVudigiTEVTUyIsICJGUlNYIiwgMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKnBhZ2VyX2FyZ3ZbXSA9IHsgInNoIiwgIi1jIiwgTlVMTCwgTlVMTCB9Oworc3RhdGljIHN0cnVjdCBjaGlsZF9wcm9jZXNzIHBhZ2VyX3Byb2Nlc3M7CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX3BhZ2VyKHZvaWQpCit7CisJZmZsdXNoKHN0ZG91dCk7CisJZmZsdXNoKHN0ZGVycik7CisJLyogc2lnbmFsIEVPRiB0byBwYWdlciAqLworCWNsb3NlKDEpOworCWNsb3NlKDIpOworCWZpbmlzaF9jb21tYW5kKCZwYWdlcl9wcm9jZXNzKTsKK30KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfcGFnZXJfc2lnbmFsKGludCBzaWdubykKK3sKKwl3YWl0X2Zvcl9wYWdlcigpOworCXNpZ2NoYWluX3BvcChzaWdubyk7CisJcmFpc2Uoc2lnbm8pOworfQorCit2b2lkIHNldHVwX3BhZ2VyKHZvaWQpCit7CisJY29uc3QgY2hhciAqcGFnZXIgPSBnZXRlbnYoIlBFUkZfUEFHRVIiKTsKKworCWlmICghaXNhdHR5KDEpKQorCQlyZXR1cm47CisJaWYgKCFwYWdlcikgeworCQlpZiAoIXBhZ2VyX3Byb2dyYW0pCisJCQlwZXJmX2NvbmZpZyhwZXJmX2RlZmF1bHRfY29uZmlnLCBOVUxMKTsKKwkJcGFnZXIgPSBwYWdlcl9wcm9ncmFtOworCX0KKwlpZiAoIXBhZ2VyKQorCQlwYWdlciA9IGdldGVudigiUEFHRVIiKTsKKwlpZiAoIXBhZ2VyKQorCQlwYWdlciA9ICJsZXNzIjsKKwllbHNlIGlmICghKnBhZ2VyIHx8ICFzdHJjbXAocGFnZXIsICJjYXQiKSkKKwkJcmV0dXJuOworCisJc3Bhd25lZF9wYWdlciA9IDE7IC8qIG1lYW5zIHdlIGFyZSBlbWl0dGluZyB0byB0ZXJtaW5hbCAqLworCisJLyogc3Bhd24gdGhlIHBhZ2VyICovCisJcGFnZXJfYXJndlsyXSA9IHBhZ2VyOworCXBhZ2VyX3Byb2Nlc3MuYXJndiA9IHBhZ2VyX2FyZ3Y7CisJcGFnZXJfcHJvY2Vzcy5pbiA9IC0xOworI2lmbmRlZiBfX01JTkdXMzJfXworCXBhZ2VyX3Byb2Nlc3MucHJlZXhlY19jYiA9IHBhZ2VyX3ByZWV4ZWM7CisjZW5kaWYKKwlpZiAoc3RhcnRfY29tbWFuZCgmcGFnZXJfcHJvY2VzcykpCisJCXJldHVybjsKKworCS8qIG9yaWdpbmFsIHByb2Nlc3MgY29udGludWVzLCBidXQgd3JpdGVzIHRvIHRoZSBwaXBlICovCisJZHVwMihwYWdlcl9wcm9jZXNzLmluLCAxKTsKKwlpZiAoaXNhdHR5KDIpKQorCQlkdXAyKHBhZ2VyX3Byb2Nlc3MuaW4sIDIpOworCWNsb3NlKHBhZ2VyX3Byb2Nlc3MuaW4pOworCisJLyogdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIHBhcmVudCB0ZXJtaW5hdGVzIGFmdGVyIHRoZSBwYWdlciAqLworCXNpZ2NoYWluX3B1c2hfY29tbW9uKHdhaXRfZm9yX3BhZ2VyX3NpZ25hbCk7CisJYXRleGl0KHdhaXRfZm9yX3BhZ2VyKTsKK30KKworaW50IHBhZ2VyX2luX3VzZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKmVudjsKKworCWlmIChzcGF3bmVkX3BhZ2VyKQorCQlyZXR1cm4gMTsKKworCWVudiA9IGdldGVudigiUEVSRl9QQUdFUl9JTl9VU0UiKTsKKwlyZXR1cm4gZW52ID8gcGVyZl9jb25maWdfYm9vbCgiUEVSRl9QQUdFUl9JTl9VU0UiLCBlbnYpIDogMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDVmMWNhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCkBAIC0wLDAgKzEsMzE2IEBACisKKyNpbmNsdWRlICIuLi9wZXJmLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJwYXJzZS1ldmVudHMuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorCitleHRlcm4gY2hhciAqc3RyY2FzZXN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKTsKKworaW50CQkJCQlucl9jb3VudGVyczsKKworc3RydWN0IHBlcmZfY291bnRlcl9hdHRyCQlhdHRyc1tNQVhfQ09VTlRFUlNdOworCitzdHJ1Y3QgZXZlbnRfc3ltYm9sIHsKKwlfX3U4CXR5cGU7CisJX191NjQJY29uZmlnOworCWNoYXIJKnN5bWJvbDsKK307CisKKyNkZWZpbmUgQyh4LCB5KSAudHlwZSA9IFBFUkZfVFlQRV8jI3gsIC5jb25maWcgPSBQRVJGX0NPVU5UXyMjeQorI2RlZmluZSBDUih4LCB5KSAudHlwZSA9IFBFUkZfVFlQRV8jI3gsIC5jb25maWcgPSB5CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfc3ltYm9sIGV2ZW50X3N5bWJvbHNbXSA9IHsKKyAgeyBDKEhBUkRXQVJFLCBIV19DUFVfQ1lDTEVTKSwJCSJjcHUtY3ljbGVzIiwJCX0sCisgIHsgQyhIQVJEV0FSRSwgSFdfQ1BVX0NZQ0xFUyksCQkiY3ljbGVzIiwJCX0sCisgIHsgQyhIQVJEV0FSRSwgSFdfSU5TVFJVQ1RJT05TKSwJImluc3RydWN0aW9ucyIsCQl9LAorICB7IEMoSEFSRFdBUkUsIEhXX0NBQ0hFX1JFRkVSRU5DRVMpLAkiY2FjaGUtcmVmZXJlbmNlcyIsCX0sCisgIHsgQyhIQVJEV0FSRSwgSFdfQ0FDSEVfTUlTU0VTKSwJImNhY2hlLW1pc3NlcyIsCQl9LAorICB7IEMoSEFSRFdBUkUsIEhXX0JSQU5DSF9JTlNUUlVDVElPTlMpLCJicmFuY2gtaW5zdHJ1Y3Rpb25zIiwJfSwKKyAgeyBDKEhBUkRXQVJFLCBIV19CUkFOQ0hfSU5TVFJVQ1RJT05TKSwiYnJhbmNoZXMiLAkJfSwKKyAgeyBDKEhBUkRXQVJFLCBIV19CUkFOQ0hfTUlTU0VTKSwJImJyYW5jaC1taXNzZXMiLAl9LAorICB7IEMoSEFSRFdBUkUsIEhXX0JVU19DWUNMRVMpLAkJImJ1cy1jeWNsZXMiLAkJfSwKKworICB7IEMoU09GVFdBUkUsIFNXX0NQVV9DTE9DSyksCQkiY3B1LWNsb2NrIiwJCX0sCisgIHsgQyhTT0ZUV0FSRSwgU1dfVEFTS19DTE9DSyksCQkidGFzay1jbG9jayIsCQl9LAorICB7IEMoU09GVFdBUkUsIFNXX1BBR0VfRkFVTFRTKSwJInBhZ2UtZmF1bHRzIiwJCX0sCisgIHsgQyhTT0ZUV0FSRSwgU1dfUEFHRV9GQVVMVFMpLAkiZmF1bHRzIiwJCX0sCisgIHsgQyhTT0ZUV0FSRSwgU1dfUEFHRV9GQVVMVFNfTUlOKSwJIm1pbm9yLWZhdWx0cyIsCQl9LAorICB7IEMoU09GVFdBUkUsIFNXX1BBR0VfRkFVTFRTX01BSiksCSJtYWpvci1mYXVsdHMiLAkJfSwKKyAgeyBDKFNPRlRXQVJFLCBTV19DT05URVhUX1NXSVRDSEVTKSwJImNvbnRleHQtc3dpdGNoZXMiLAl9LAorICB7IEMoU09GVFdBUkUsIFNXX0NPTlRFWFRfU1dJVENIRVMpLAkiY3MiLAkJCX0sCisgIHsgQyhTT0ZUV0FSRSwgU1dfQ1BVX01JR1JBVElPTlMpLAkiY3B1LW1pZ3JhdGlvbnMiLAl9LAorICB7IEMoU09GVFdBUkUsIFNXX0NQVV9NSUdSQVRJT05TKSwJIm1pZ3JhdGlvbnMiLAkJfSwKK307CisKKyNkZWZpbmUgX19QRVJGX0NPVU5URVJfRklFTEQoY29uZmlnLCBuYW1lKSBcCisJKChjb25maWcgJiBQRVJGX0NPVU5URVJfIyNuYW1lIyNfTUFTSykgPj4gUEVSRl9DT1VOVEVSXyMjbmFtZSMjX1NISUZUKQorCisjZGVmaW5lIFBFUkZfQ09VTlRFUl9SQVcoY29uZmlnKQlfX1BFUkZfQ09VTlRFUl9GSUVMRChjb25maWcsIFJBVykKKyNkZWZpbmUgUEVSRl9DT1VOVEVSX0NPTkZJRyhjb25maWcpCV9fUEVSRl9DT1VOVEVSX0ZJRUxEKGNvbmZpZywgQ09ORklHKQorI2RlZmluZSBQRVJGX0NPVU5URVJfVFlQRShjb25maWcpCV9fUEVSRl9DT1VOVEVSX0ZJRUxEKGNvbmZpZywgVFlQRSkKKyNkZWZpbmUgUEVSRl9DT1VOVEVSX0lEKGNvbmZpZykJCV9fUEVSRl9DT1VOVEVSX0ZJRUxEKGNvbmZpZywgRVZFTlQpCisKK3N0YXRpYyBjaGFyICpod19ldmVudF9uYW1lc1tdID0geworCSJjeWNsZXMiLAorCSJpbnN0cnVjdGlvbnMiLAorCSJjYWNoZS1yZWZlcmVuY2VzIiwKKwkiY2FjaGUtbWlzc2VzIiwKKwkiYnJhbmNoZXMiLAorCSJicmFuY2gtbWlzc2VzIiwKKwkiYnVzLWN5Y2xlcyIsCit9OworCitzdGF0aWMgY2hhciAqc3dfZXZlbnRfbmFtZXNbXSA9IHsKKwkiY3B1LWNsb2NrLXRpY2tzIiwKKwkidGFzay1jbG9jay10aWNrcyIsCisJInBhZ2UtZmF1bHRzIiwKKwkiY29udGV4dC1zd2l0Y2hlcyIsCisJIkNQVS1taWdyYXRpb25zIiwKKwkibWlub3ItZmF1bHRzIiwKKwkibWFqb3ItZmF1bHRzIiwKK307CisKKyNkZWZpbmUgTUFYX0FMSUFTRVMgOAorCitzdGF0aWMgY2hhciAqaHdfY2FjaGUgW11bTUFYX0FMSUFTRVNdID0geworCXsgIkwxLWRhdGEiCQksICJsMS1kIiwgImwxZCIsICJsMSIJCQkJfSwKKwl7ICJMMS1pbnN0cnVjdGlvbiIJLCAibDEtaSIsICJsMWkiCQkJCQl9LAorCXsgIkwyIgkJCSwgImwyIgkJCQkJCX0sCisJeyAiRGF0YS1UTEIiCQksICJkdGxiIiwgImQtdGxiIgkJCQl9LAorCXsgIkluc3RydWN0aW9uLVRMQiIJLCAiaXRsYiIsICJpLXRsYiIJCQkJfSwKKwl7ICJCcmFuY2giCQksICJicHUiICwgImJ0YiIsICJicGMiCQkJCX0sCit9OworCitzdGF0aWMgY2hhciAqaHdfY2FjaGVfb3AgW11bTUFYX0FMSUFTRVNdID0geworCXsgIkxvYWQiCQksICJyZWFkIgkJCQkJfSwKKwl7ICJTdG9yZSIJCSwgIndyaXRlIgkJCQkJfSwKKwl7ICJQcmVmZXRjaCIJCSwgInNwZWN1bGF0aXZlLXJlYWQiLCAic3BlY3VsYXRpdmUtbG9hZCIJfSwKK307CisKK3N0YXRpYyBjaGFyICpod19jYWNoZV9yZXN1bHQgW11bTUFYX0FMSUFTRVNdID0geworCXsgIlJlZmVyZW5jZSIJCSwgIm9wcyIsICJhY2Nlc3MiCQkJCX0sCisJeyAiTWlzcyIJCQkJCQkJCX0sCit9OworCitjaGFyICpldmVudF9uYW1lKGludCBjb3VudGVyKQoreworCV9fdTY0IGNvbmZpZyA9IGF0dHJzW2NvdW50ZXJdLmNvbmZpZzsKKwlpbnQgdHlwZSA9IGF0dHJzW2NvdW50ZXJdLnR5cGU7CisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKworCWlmIChhdHRyc1tjb3VudGVyXS50eXBlID09IFBFUkZfVFlQRV9SQVcpIHsKKwkJc3ByaW50ZihidWYsICJyYXcgMHglbGx4IiwgY29uZmlnKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFBFUkZfVFlQRV9IQVJEV0FSRToKKwkJaWYgKGNvbmZpZyA8IFBFUkZfQ09VTlRfSFdfTUFYKQorCQkJcmV0dXJuIGh3X2V2ZW50X25hbWVzW2NvbmZpZ107CisJCXJldHVybiAidW5rbm93bi1oYXJkd2FyZSI7CisKKwljYXNlIFBFUkZfVFlQRV9IV19DQUNIRTogeworCQlfX3U4IGNhY2hlX3R5cGUsIGNhY2hlX29wLCBjYWNoZV9yZXN1bHQ7CisJCXN0YXRpYyBjaGFyIG5hbWVbMTAwXTsKKworCQljYWNoZV90eXBlICAgPSAoY29uZmlnID4+ICAwKSAmIDB4ZmY7CisJCWlmIChjYWNoZV90eXBlID4gUEVSRl9DT1VOVF9IV19DQUNIRV9NQVgpCisJCQlyZXR1cm4gInVua25vd24tZXh0LWhhcmR3YXJlLWNhY2hlLXR5cGUiOworCisJCWNhY2hlX29wICAgICA9IChjb25maWcgPj4gIDgpICYgMHhmZjsKKwkJaWYgKGNhY2hlX29wID4gUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVgpCisJCQlyZXR1cm4gInVua25vd24tZXh0LWhhcmR3YXJlLWNhY2hlLW9wIjsKKworCQljYWNoZV9yZXN1bHQgPSAoY29uZmlnID4+IDE2KSAmIDB4ZmY7CisJCWlmIChjYWNoZV9yZXN1bHQgPiBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCisJCQlyZXR1cm4gInVua25vd24tZXh0LWhhcmR3YXJlLWNhY2hlLXJlc3VsdCI7CisKKwkJc3ByaW50ZihuYW1lLCAiJXMtQ2FjaGUtJXMtJXNlcyIsCisJCQlod19jYWNoZVtjYWNoZV90eXBlXVswXSwKKwkJCWh3X2NhY2hlX29wW2NhY2hlX29wXVswXSwKKwkJCWh3X2NhY2hlX3Jlc3VsdFtjYWNoZV9yZXN1bHRdWzBdKTsKKworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwljYXNlIFBFUkZfVFlQRV9TT0ZUV0FSRToKKwkJaWYgKGNvbmZpZyA8IFBFUkZfQ09VTlRfU1dfTUFYKQorCQkJcmV0dXJuIHN3X2V2ZW50X25hbWVzW2NvbmZpZ107CisJCXJldHVybiAidW5rbm93bi1zb2Z0d2FyZSI7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gInVua25vd24iOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FsaWFzZXMoY29uc3QgY2hhciAqc3RyLCBjaGFyICpuYW1lc1tdW01BWF9BTElBU0VTXSwgaW50IHNpemUpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxJQVNFUzsgaisrKSB7CisJCQlpZiAoIW5hbWVzW2ldW2pdKQorCQkJCWJyZWFrOworCQkJaWYgKHN0cmNhc2VzdHIoc3RyLCBuYW1lc1tpXVtqXSkpCisJCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZ2VuZXJpY19od19zeW1ib2xzKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyKQoreworCWludCBjYWNoZV90eXBlID0gLTEsIGNhY2hlX29wID0gMCwgY2FjaGVfcmVzdWx0ID0gMDsKKworCWNhY2hlX3R5cGUgPSBwYXJzZV9hbGlhc2VzKHN0ciwgaHdfY2FjaGUsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYKTsKKwkvKgorCSAqIE5vIGZhbGxiYWNrIC0gaWYgd2UgY2Fubm90IGdldCBhIGNsZWFyIGNhY2hlIHR5cGUKKwkgKiB0aGVuIGJhaWwgb3V0OgorCSAqLworCWlmIChjYWNoZV90eXBlID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhY2hlX29wID0gcGFyc2VfYWxpYXNlcyhzdHIsIGh3X2NhY2hlX29wLCBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCk7CisJLyoKKwkgKiBGYWxsIGJhY2sgdG8gcmVhZHM6CisJICovCisJaWYgKGNhY2hlX29wID09IC0xKQorCQljYWNoZV9vcCA9IFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfUkVBRDsKKworCWNhY2hlX3Jlc3VsdCA9IHBhcnNlX2FsaWFzZXMoc3RyLCBod19jYWNoZV9yZXN1bHQsCisJCQkJCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCk7CisJLyoKKwkgKiBGYWxsIGJhY2sgdG8gYWNjZXNzZXM6CisJICovCisJaWYgKGNhY2hlX3Jlc3VsdCA9PSAtMSkKKwkJY2FjaGVfcmVzdWx0ID0gUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfQUNDRVNTOworCisJYXR0ci0+Y29uZmlnID0gY2FjaGVfdHlwZSB8IChjYWNoZV9vcCA8PCA4KSB8IChjYWNoZV9yZXN1bHQgPDwgMTYpOworCWF0dHItPnR5cGUgPSBQRVJGX1RZUEVfSFdfQ0FDSEU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVhY2ggZXZlbnQgY2FuIGhhdmUgbXVsdGlwbGUgc3ltYm9saWMgbmFtZXMuCisgKiBTeW1ib2xpYyBuYW1lcyBhcmUgKGFsbW9zdCkgZXhhY3RseSBtYXRjaGVkLgorICovCitzdGF0aWMgaW50IHBhcnNlX2V2ZW50X3N5bWJvbHMoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgKmF0dHIpCit7CisJX191NjQgY29uZmlnLCBpZDsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpzZXAsICpwc3RyOworCisJaWYgKHN0clswXSA9PSAncicgJiYgaGV4MnU2NChzdHIgKyAxLCAmY29uZmlnKSA+IDApIHsKKwkJYXR0ci0+dHlwZSA9IFBFUkZfVFlQRV9SQVc7CisJCWF0dHItPmNvbmZpZyA9IGNvbmZpZzsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlwc3RyID0gc3RyOworCXNlcCA9IHN0cmNocihwc3RyLCAnOicpOworCWlmIChzZXApIHsKKwkJdHlwZSA9IGF0b2kocHN0cik7CisJCXBzdHIgPSBzZXAgKyAxOworCQlpZCA9IGF0b2kocHN0cik7CisJCXNlcCA9IHN0cmNocihwc3RyLCAnOicpOworCQlpZiAoc2VwKSB7CisJCQlwc3RyID0gc2VwICsgMTsKKwkJCWlmIChzdHJjaHIocHN0ciwgJ2snKSkKKwkJCQlhdHRyLT5leGNsdWRlX3VzZXIgPSAxOworCQkJaWYgKHN0cmNocihwc3RyLCAndScpKQorCQkJCWF0dHItPmV4Y2x1ZGVfa2VybmVsID0gMTsKKwkJfQorCQlhdHRyLT50eXBlID0gdHlwZTsKKwkJYXR0ci0+Y29uZmlnID0gaWQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZlbnRfc3ltYm9scyk7IGkrKykgeworCQlpZiAoIXN0cm5jbXAoc3RyLCBldmVudF9zeW1ib2xzW2ldLnN5bWJvbCwKKwkJCSAgICAgc3RybGVuKGV2ZW50X3N5bWJvbHNbaV0uc3ltYm9sKSkpIHsKKworCQkJYXR0ci0+dHlwZSA9IGV2ZW50X3N5bWJvbHNbaV0udHlwZTsKKwkJCWF0dHItPmNvbmZpZyA9IGV2ZW50X3N5bWJvbHNbaV0uY29uZmlnOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiBwYXJzZV9nZW5lcmljX2h3X3N5bWJvbHMoc3RyLCBhdHRyKTsKK30KKworaW50IHBhcnNlX2V2ZW50cyhjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHVuc2V0KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfYXR0ciBhdHRyOworCWludCByZXQ7CisKKwltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7CithZ2FpbjoKKwlpZiAobnJfY291bnRlcnMgPT0gTUFYX0NPVU5URVJTKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSBwYXJzZV9ldmVudF9zeW1ib2xzKHN0ciwgJmF0dHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYXR0cnNbbnJfY291bnRlcnNdID0gYXR0cjsKKwlucl9jb3VudGVycysrOworCisJc3RyID0gc3Ryc3RyKHN0ciwgIiwiKTsKKwlpZiAoc3RyKSB7CisJCXN0cisrOworCQlnb3RvIGFnYWluOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbXSA9IHsKKwkiIiwKKwkiSGFyZHdhcmUgZXZlbnQiLAorCSJTb2Z0d2FyZSBldmVudCIsCisJIlRyYWNlcG9pbnQgZXZlbnQiLAorCSJIYXJkd2FyZSBjYWNoZSBldmVudCIsCit9OworCisvKgorICogUHJpbnQgdGhlIGhlbHAgdGV4dCBmb3IgdGhlIGV2ZW50IHN5bWJvbHM6CisgKi8KK3ZvaWQgcHJpbnRfZXZlbnRzKHZvaWQpCit7CisJc3RydWN0IGV2ZW50X3N5bWJvbCAqc3ltcyA9IGV2ZW50X3N5bWJvbHM7CisJdW5zaWduZWQgaW50IGksIHR5cGUsIHByZXZfdHlwZSA9IC0xOworCisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiTGlzdCBvZiBwcmUtZGVmaW5lZCBldmVudHMgKHRvIGJlIHVzZWQgaW4gLWUpOlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldmVudF9zeW1ib2xzKTsgaSsrLCBzeW1zKyspIHsKKwkJdHlwZSA9IHN5bXMtPnR5cGUgKyAxOworCQlpZiAodHlwZSA+IEFSUkFZX1NJWkUoZXZlbnRfdHlwZV9kZXNjcmlwdG9ycykpCisJCQl0eXBlID0gMDsKKworCQlpZiAodHlwZSAhPSBwcmV2X3R5cGUpCisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKwkJZnByaW50ZihzdGRlcnIsICIgICUtMzBzIFslc11cbiIsIHN5bXMtPnN5bWJvbCwKKwkJCWV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbdHlwZV0pOworCisJCXByZXZfdHlwZSA9IHR5cGU7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAlLTMwcyBbcmF3IGhhcmR3YXJlIGV2ZW50IGRlc2NyaXB0b3JdXG4iLAorCQkick5OTiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKworCWV4aXQoMTI5KTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Q1NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oCkBAIC0wLDAgKzEsMTcgQEAKKworLyoKKyAqIFBhcnNlIHN5bWJvbGljIGV2ZW50cy9jb3VudHMgcGFzc2VkIGluIGFzIG9wdGlvbnM6CisgKi8KKworZXh0ZXJuIGludAkJCW5yX2NvdW50ZXJzOworCitleHRlcm4gc3RydWN0IHBlcmZfY291bnRlcl9hdHRyIGF0dHJzW01BWF9DT1VOVEVSU107CisKK2V4dGVybiBjaGFyICpldmVudF9uYW1lKGludCBjdHIpOworCitleHRlcm4gaW50IHBhcnNlX2V2ZW50cyhjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHVuc2V0KTsKKworI2RlZmluZSBFVkVOVFNfSEVMUF9NQVggKDEyOCoxMDI0KQorCitleHRlcm4gdm9pZCBwcmludF9ldmVudHModm9pZCk7CisKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWZmYjEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jCkBAIC0wLDAgKzEsNTA4IEBACisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIE9QVF9TSE9SVCAxCisjZGVmaW5lIE9QVF9VTlNFVCAyCisKK3N0YXRpYyBpbnQgb3B0ZXJyb3IoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICpyZWFzb24sIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBPUFRfU0hPUlQpCisJCXJldHVybiBlcnJvcigic3dpdGNoIGAlYycgJXMiLCBvcHQtPnNob3J0X25hbWUsIHJlYXNvbik7CisJaWYgKGZsYWdzICYgT1BUX1VOU0VUKQorCQlyZXR1cm4gZXJyb3IoIm9wdGlvbiBgbm8tJXMnICVzIiwgb3B0LT5sb25nX25hbWUsIHJlYXNvbik7CisJcmV0dXJuIGVycm9yKCJvcHRpb24gYCVzJyAlcyIsIG9wdC0+bG9uZ19uYW1lLCByZWFzb24pOworfQorCitzdGF0aWMgaW50IGdldF9hcmcoc3RydWN0IHBhcnNlX29wdF9jdHhfdCAqcCwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LAorCQkgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKiphcmcpCit7CisJaWYgKHAtPm9wdCkgeworCQkqYXJnID0gcC0+b3B0OworCQlwLT5vcHQgPSBOVUxMOworCX0gZWxzZSBpZiAocC0+YXJnYyA9PSAxICYmIChvcHQtPmZsYWdzICYgUEFSU0VfT1BUX0xBU1RBUkdfREVGQVVMVCkpIHsKKwkJKmFyZyA9IChjb25zdCBjaGFyICopb3B0LT5kZWZ2YWw7CisJfSBlbHNlIGlmIChwLT5hcmdjID4gMSkgeworCQlwLT5hcmdjLS07CisJCSphcmcgPSAqKytwLT5hcmd2OworCX0gZWxzZQorCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAicmVxdWlyZXMgYSB2YWx1ZSIsIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdmFsdWUoc3RydWN0IHBhcnNlX29wdF9jdHhfdCAqcCwKKwkJICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGludCBmbGFncykKK3sKKwljb25zdCBjaGFyICpzLCAqYXJnID0gTlVMTDsKKwljb25zdCBpbnQgdW5zZXQgPSBmbGFncyAmIE9QVF9VTlNFVDsKKworCWlmICh1bnNldCAmJiBwLT5vcHQpCisJCXJldHVybiBvcHRlcnJvcihvcHQsICJ0YWtlcyBubyB2YWx1ZSIsIGZsYWdzKTsKKwlpZiAodW5zZXQgJiYgKG9wdC0+ZmxhZ3MgJiBQQVJTRV9PUFRfTk9ORUcpKQorCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAiaXNuJ3QgYXZhaWxhYmxlIiwgZmxhZ3MpOworCisJaWYgKCEoZmxhZ3MgJiBPUFRfU0hPUlQpICYmIHAtPm9wdCkgeworCQlzd2l0Y2ggKG9wdC0+dHlwZSkgeworCQljYXNlIE9QVElPTl9DQUxMQkFDSzoKKwkJCWlmICghKG9wdC0+ZmxhZ3MgJiBQQVJTRV9PUFRfTk9BUkcpKQorCQkJCWJyZWFrOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBPUFRJT05fQk9PTEVBTjoKKwkJY2FzZSBPUFRJT05fQklUOgorCQljYXNlIE9QVElPTl9TRVRfSU5UOgorCQljYXNlIE9QVElPTl9TRVRfUFRSOgorCQkJcmV0dXJuIG9wdGVycm9yKG9wdCwgInRha2VzIG5vIHZhbHVlIiwgZmxhZ3MpOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzd2l0Y2ggKG9wdC0+dHlwZSkgeworCWNhc2UgT1BUSU9OX0JJVDoKKwkJaWYgKHVuc2V0KQorCQkJKihpbnQgKilvcHQtPnZhbHVlICY9IH5vcHQtPmRlZnZhbDsKKwkJZWxzZQorCQkJKihpbnQgKilvcHQtPnZhbHVlIHw9IG9wdC0+ZGVmdmFsOworCQlyZXR1cm4gMDsKKworCWNhc2UgT1BUSU9OX0JPT0xFQU46CisJCSooaW50ICopb3B0LT52YWx1ZSA9IHVuc2V0ID8gMCA6ICooaW50ICopb3B0LT52YWx1ZSArIDE7CisJCXJldHVybiAwOworCisJY2FzZSBPUFRJT05fU0VUX0lOVDoKKwkJKihpbnQgKilvcHQtPnZhbHVlID0gdW5zZXQgPyAwIDogb3B0LT5kZWZ2YWw7CisJCXJldHVybiAwOworCisJY2FzZSBPUFRJT05fU0VUX1BUUjoKKwkJKih2b2lkICoqKW9wdC0+dmFsdWUgPSB1bnNldCA/IE5VTEwgOiAodm9pZCAqKW9wdC0+ZGVmdmFsOworCQlyZXR1cm4gMDsKKworCWNhc2UgT1BUSU9OX1NUUklORzoKKwkJaWYgKHVuc2V0KQorCQkJKihjb25zdCBjaGFyICoqKW9wdC0+dmFsdWUgPSBOVUxMOworCQllbHNlIGlmIChvcHQtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRyAmJiAhcC0+b3B0KQorCQkJKihjb25zdCBjaGFyICoqKW9wdC0+dmFsdWUgPSAoY29uc3QgY2hhciAqKW9wdC0+ZGVmdmFsOworCQllbHNlCisJCQlyZXR1cm4gZ2V0X2FyZyhwLCBvcHQsIGZsYWdzLCAoY29uc3QgY2hhciAqKilvcHQtPnZhbHVlKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE9QVElPTl9DQUxMQkFDSzoKKwkJaWYgKHVuc2V0KQorCQkJcmV0dXJuICgqb3B0LT5jYWxsYmFjaykob3B0LCBOVUxMLCAxKSA/ICgtMSkgOiAwOworCQlpZiAob3B0LT5mbGFncyAmIFBBUlNFX09QVF9OT0FSRykKKwkJCXJldHVybiAoKm9wdC0+Y2FsbGJhY2spKG9wdCwgTlVMTCwgMCkgPyAoLTEpIDogMDsKKwkJaWYgKG9wdC0+ZmxhZ3MgJiBQQVJTRV9PUFRfT1BUQVJHICYmICFwLT5vcHQpCisJCQlyZXR1cm4gKCpvcHQtPmNhbGxiYWNrKShvcHQsIE5VTEwsIDApID8gKC0xKSA6IDA7CisJCWlmIChnZXRfYXJnKHAsIG9wdCwgZmxhZ3MsICZhcmcpKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gKCpvcHQtPmNhbGxiYWNrKShvcHQsIGFyZywgMCkgPyAoLTEpIDogMDsKKworCWNhc2UgT1BUSU9OX0lOVEVHRVI6CisJCWlmICh1bnNldCkgeworCQkJKihpbnQgKilvcHQtPnZhbHVlID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChvcHQtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRyAmJiAhcC0+b3B0KSB7CisJCQkqKGludCAqKW9wdC0+dmFsdWUgPSBvcHQtPmRlZnZhbDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChnZXRfYXJnKHAsIG9wdCwgZmxhZ3MsICZhcmcpKQorCQkJcmV0dXJuIC0xOworCQkqKGludCAqKW9wdC0+dmFsdWUgPSBzdHJ0b2woYXJnLCAoY2hhciAqKikmcywgMTApOworCQlpZiAoKnMpCisJCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAiZXhwZWN0cyBhIG51bWVyaWNhbCB2YWx1ZSIsIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE9QVElPTl9MT05HOgorCQlpZiAodW5zZXQpIHsKKwkJCSoobG9uZyAqKW9wdC0+dmFsdWUgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKG9wdC0+ZmxhZ3MgJiBQQVJTRV9PUFRfT1BUQVJHICYmICFwLT5vcHQpIHsKKwkJCSoobG9uZyAqKW9wdC0+dmFsdWUgPSBvcHQtPmRlZnZhbDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChnZXRfYXJnKHAsIG9wdCwgZmxhZ3MsICZhcmcpKQorCQkJcmV0dXJuIC0xOworCQkqKGxvbmcgKilvcHQtPnZhbHVlID0gc3RydG9sKGFyZywgKGNoYXIgKiopJnMsIDEwKTsKKwkJaWYgKCpzKQorCQkJcmV0dXJuIG9wdGVycm9yKG9wdCwgImV4cGVjdHMgYSBudW1lcmljYWwgdmFsdWUiLCBmbGFncyk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJZGllKCJzaG91bGQgbm90IGhhcHBlbiwgc29tZW9uZSBtdXN0IGJlIGhpdCBvbiB0aGUgZm9yZWhlYWQiKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc2hvcnRfb3B0KHN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgKnAsIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7CisJZm9yICg7IG9wdGlvbnMtPnR5cGUgIT0gT1BUSU9OX0VORDsgb3B0aW9ucysrKSB7CisJCWlmIChvcHRpb25zLT5zaG9ydF9uYW1lID09ICpwLT5vcHQpIHsKKwkJCXAtPm9wdCA9IHAtPm9wdFsxXSA/IHAtPm9wdCArIDEgOiBOVUxMOworCQkJcmV0dXJuIGdldF92YWx1ZShwLCBvcHRpb25zLCBPUFRfU0hPUlQpOworCQl9CisJfQorCXJldHVybiAtMjsKK30KKworc3RhdGljIGludCBwYXJzZV9sb25nX29wdChzdHJ1Y3QgcGFyc2Vfb3B0X2N0eF90ICpwLCBjb25zdCBjaGFyICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7CisJY29uc3QgY2hhciAqYXJnX2VuZCA9IHN0cmNocihhcmcsICc9Jyk7CisJY29uc3Qgc3RydWN0IG9wdGlvbiAqYWJicmV2X29wdGlvbiA9IE5VTEwsICphbWJpZ3VvdXNfb3B0aW9uID0gTlVMTDsKKwlpbnQgYWJicmV2X2ZsYWdzID0gMCwgYW1iaWd1b3VzX2ZsYWdzID0gMDsKKworCWlmICghYXJnX2VuZCkKKwkJYXJnX2VuZCA9IGFyZyArIHN0cmxlbihhcmcpOworCisJZm9yICg7IG9wdGlvbnMtPnR5cGUgIT0gT1BUSU9OX0VORDsgb3B0aW9ucysrKSB7CisJCWNvbnN0IGNoYXIgKnJlc3Q7CisJCWludCBmbGFncyA9IDA7CisKKwkJaWYgKCFvcHRpb25zLT5sb25nX25hbWUpCisJCQljb250aW51ZTsKKworCQlyZXN0ID0gc2tpcF9wcmVmaXgoYXJnLCBvcHRpb25zLT5sb25nX25hbWUpOworCQlpZiAob3B0aW9ucy0+dHlwZSA9PSBPUFRJT05fQVJHVU1FTlQpIHsKKwkJCWlmICghcmVzdCkKKwkJCQljb250aW51ZTsKKwkJCWlmICgqcmVzdCA9PSAnPScpCisJCQkJcmV0dXJuIG9wdGVycm9yKG9wdGlvbnMsICJ0YWtlcyBubyB2YWx1ZSIsIGZsYWdzKTsKKwkJCWlmICgqcmVzdCkKKwkJCQljb250aW51ZTsKKwkJCXAtPm91dFtwLT5jcGlkeCsrXSA9IGFyZyAtIDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXJlc3QpIHsKKwkJCS8qIGFiYnJldmlhdGVkPyAqLworCQkJaWYgKCFzdHJuY21wKG9wdGlvbnMtPmxvbmdfbmFtZSwgYXJnLCBhcmdfZW5kIC0gYXJnKSkgeworaXNfYWJicmV2aWF0ZWQ6CisJCQkJaWYgKGFiYnJldl9vcHRpb24pIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgdGhpcyBpcyBhYmJyZXZpYXRlZCwgaXQgaXMKKwkJCQkJICogYW1iaWd1b3VzLiBTbyB3aGVuIHRoZXJlIGlzIG5vCisJCQkJCSAqIGV4YWN0IG1hdGNoIGxhdGVyLCB3ZSBuZWVkIHRvCisJCQkJCSAqIGVycm9yIG91dC4KKwkJCQkJICovCisJCQkJCWFtYmlndW91c19vcHRpb24gPSBhYmJyZXZfb3B0aW9uOworCQkJCQlhbWJpZ3VvdXNfZmxhZ3MgPSBhYmJyZXZfZmxhZ3M7CisJCQkJfQorCQkJCWlmICghKGZsYWdzICYgT1BUX1VOU0VUKSAmJiAqYXJnX2VuZCkKKwkJCQkJcC0+b3B0ID0gYXJnX2VuZCArIDE7CisJCQkJYWJicmV2X29wdGlvbiA9IG9wdGlvbnM7CisJCQkJYWJicmV2X2ZsYWdzID0gZmxhZ3M7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBuZWdhdGVkIGFuZCBhYmJyZXZpYXRlZCB2ZXJ5IG11Y2g/ICovCisJCQlpZiAoIXByZWZpeGNtcCgibm8tIiwgYXJnKSkgeworCQkJCWZsYWdzIHw9IE9QVF9VTlNFVDsKKwkJCQlnb3RvIGlzX2FiYnJldmlhdGVkOworCQkJfQorCQkJLyogbmVnYXRlZD8gKi8KKwkJCWlmIChzdHJuY21wKGFyZywgIm5vLSIsIDMpKQorCQkJCWNvbnRpbnVlOworCQkJZmxhZ3MgfD0gT1BUX1VOU0VUOworCQkJcmVzdCA9IHNraXBfcHJlZml4KGFyZyArIDMsIG9wdGlvbnMtPmxvbmdfbmFtZSk7CisJCQkvKiBhYmJyZXZpYXRlZCBhbmQgbmVnYXRlZD8gKi8KKwkJCWlmICghcmVzdCAmJiAhcHJlZml4Y21wKG9wdGlvbnMtPmxvbmdfbmFtZSwgYXJnICsgMykpCisJCQkJZ290byBpc19hYmJyZXZpYXRlZDsKKwkJCWlmICghcmVzdCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnJlc3QpIHsKKwkJCWlmICgqcmVzdCAhPSAnPScpCisJCQkJY29udGludWU7CisJCQlwLT5vcHQgPSByZXN0ICsgMTsKKwkJfQorCQlyZXR1cm4gZ2V0X3ZhbHVlKHAsIG9wdGlvbnMsIGZsYWdzKTsKKwl9CisKKwlpZiAoYW1iaWd1b3VzX29wdGlvbikKKwkJcmV0dXJuIGVycm9yKCJBbWJpZ3VvdXMgb3B0aW9uOiAlcyAiCisJCQkiKGNvdWxkIGJlIC0tJXMlcyBvciAtLSVzJXMpIiwKKwkJCWFyZywKKwkJCShhbWJpZ3VvdXNfZmxhZ3MgJiBPUFRfVU5TRVQpID8gICJuby0iIDogIiIsCisJCQlhbWJpZ3VvdXNfb3B0aW9uLT5sb25nX25hbWUsCisJCQkoYWJicmV2X2ZsYWdzICYgT1BUX1VOU0VUKSA/ICAibm8tIiA6ICIiLAorCQkJYWJicmV2X29wdGlvbi0+bG9uZ19uYW1lKTsKKwlpZiAoYWJicmV2X29wdGlvbikKKwkJcmV0dXJuIGdldF92YWx1ZShwLCBhYmJyZXZfb3B0aW9uLCBhYmJyZXZfZmxhZ3MpOworCXJldHVybiAtMjsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfdHlwb3MoY29uc3QgY2hhciAqYXJnLCBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQoreworCWlmIChzdHJsZW4oYXJnKSA8IDMpCisJCXJldHVybjsKKworCWlmICghcHJlZml4Y21wKGFyZywgIm5vLSIpKSB7CisJCWVycm9yICgiZGlkIHlvdSBtZWFuIGAtLSVzYCAod2l0aCB0d28gZGFzaGVzID8pIiwgYXJnKTsKKwkJZXhpdCgxMjkpOworCX0KKworCWZvciAoOyBvcHRpb25zLT50eXBlICE9IE9QVElPTl9FTkQ7IG9wdGlvbnMrKykgeworCQlpZiAoIW9wdGlvbnMtPmxvbmdfbmFtZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXByZWZpeGNtcChvcHRpb25zLT5sb25nX25hbWUsIGFyZykpIHsKKwkJCWVycm9yICgiZGlkIHlvdSBtZWFuIGAtLSVzYCAod2l0aCB0d28gZGFzaGVzID8pIiwgYXJnKTsKKwkJCWV4aXQoMTI5KTsKKwkJfQorCX0KK30KKwordm9pZCBwYXJzZV9vcHRpb25zX3N0YXJ0KHN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgKmN0eCwKKwkJCSBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBmbGFncykKK3sKKwltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworCWN0eC0+YXJnYyA9IGFyZ2MgLSAxOworCWN0eC0+YXJndiA9IGFyZ3YgKyAxOworCWN0eC0+b3V0ICA9IGFyZ3Y7CisJY3R4LT5jcGlkeCA9ICgoZmxhZ3MgJiBQQVJTRV9PUFRfS0VFUF9BUkdWMCkgIT0gMCk7CisJY3R4LT5mbGFncyA9IGZsYWdzOworCWlmICgoZmxhZ3MgJiBQQVJTRV9PUFRfS0VFUF9VTktOT1dOKSAmJgorCSAgICAoZmxhZ3MgJiBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKSkKKwkJZGllKCJTVE9QX0FUX05PTl9PUFRJT04gYW5kIEtFRVBfVU5LTk9XTiBkb24ndCBnbyB0b2dldGhlciIpOworfQorCitzdGF0aWMgaW50IHVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbChjb25zdCBjaGFyICogY29uc3QgKiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqLCBpbnQpOworCitpbnQgcGFyc2Vfb3B0aW9uc19zdGVwKHN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgKmN0eCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMsCisJCSAgICAgICBjb25zdCBjaGFyICogY29uc3QgdXNhZ2VzdHJbXSkKK3sKKwlpbnQgaW50ZXJuYWxfaGVscCA9ICEoY3R4LT5mbGFncyAmIFBBUlNFX09QVF9OT19JTlRFUk5BTF9IRUxQKTsKKworCS8qIHdlIG11c3QgcmVzZXQgLT5vcHQsIHVua25vd24gc2hvcnQgb3B0aW9uIGxlYXZlIGl0IGRhbmdsaW5nICovCisJY3R4LT5vcHQgPSBOVUxMOworCisJZm9yICg7IGN0eC0+YXJnYzsgY3R4LT5hcmdjLS0sIGN0eC0+YXJndisrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGN0eC0+YXJndlswXTsKKworCQlpZiAoKmFyZyAhPSAnLScgfHwgIWFyZ1sxXSkgeworCQkJaWYgKGN0eC0+ZmxhZ3MgJiBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKQorCQkJCWJyZWFrOworCQkJY3R4LT5vdXRbY3R4LT5jcGlkeCsrXSA9IGN0eC0+YXJndlswXTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGFyZ1sxXSAhPSAnLScpIHsKKwkJCWN0eC0+b3B0ID0gYXJnICsgMTsKKwkJCWlmIChpbnRlcm5hbF9oZWxwICYmICpjdHgtPm9wdCA9PSAnaCcpCisJCQkJcmV0dXJuIHBhcnNlX29wdGlvbnNfdXNhZ2UodXNhZ2VzdHIsIG9wdGlvbnMpOworCQkJc3dpdGNoIChwYXJzZV9zaG9ydF9vcHQoY3R4LCBvcHRpb25zKSkgeworCQkJY2FzZSAtMToKKwkJCQlyZXR1cm4gcGFyc2Vfb3B0aW9uc191c2FnZSh1c2FnZXN0ciwgb3B0aW9ucyk7CisJCQljYXNlIC0yOgorCQkJCWdvdG8gdW5rbm93bjsKKwkJCX0KKwkJCWlmIChjdHgtPm9wdCkKKwkJCQljaGVja190eXBvcyhhcmcgKyAxLCBvcHRpb25zKTsKKwkJCXdoaWxlIChjdHgtPm9wdCkgeworCQkJCWlmIChpbnRlcm5hbF9oZWxwICYmICpjdHgtPm9wdCA9PSAnaCcpCisJCQkJCXJldHVybiBwYXJzZV9vcHRpb25zX3VzYWdlKHVzYWdlc3RyLCBvcHRpb25zKTsKKwkJCQlzd2l0Y2ggKHBhcnNlX3Nob3J0X29wdChjdHgsIG9wdGlvbnMpKSB7CisJCQkJY2FzZSAtMToKKwkJCQkJcmV0dXJuIHBhcnNlX29wdGlvbnNfdXNhZ2UodXNhZ2VzdHIsIG9wdGlvbnMpOworCQkJCWNhc2UgLTI6CisJCQkJCS8qIGZha2UgYSBzaG9ydCBvcHRpb24gdGhpbmcgdG8gaGlkZSB0aGUgZmFjdCB0aGF0IHdlIG1heSBoYXZlCisJCQkJCSAqIHN0YXJ0ZWQgdG8gcGFyc2UgYWdncmVnYXRlZCBzdHVmZgorCQkJCQkgKgorCQkJCQkgKiBUaGlzIGlzIGxlYWt5LCB0b28gYmFkLgorCQkJCQkgKi8KKwkJCQkJY3R4LT5hcmd2WzBdID0gc3RyZHVwKGN0eC0+b3B0IC0gMSk7CisJCQkJCSooY2hhciAqKWN0eC0+YXJndlswXSA9ICctJzsKKwkJCQkJZ290byB1bmtub3duOworCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFhcmdbMl0pIHsgLyogIi0tIiAqLworCQkJaWYgKCEoY3R4LT5mbGFncyAmIFBBUlNFX09QVF9LRUVQX0RBU0hEQVNIKSkgeworCQkJCWN0eC0+YXJnYy0tOworCQkJCWN0eC0+YXJndisrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW50ZXJuYWxfaGVscCAmJiAhc3RyY21wKGFyZyArIDIsICJoZWxwLWFsbCIpKQorCQkJcmV0dXJuIHVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbCh1c2FnZXN0ciwgb3B0aW9ucywgMSk7CisJCWlmIChpbnRlcm5hbF9oZWxwICYmICFzdHJjbXAoYXJnICsgMiwgImhlbHAiKSkKKwkJCXJldHVybiBwYXJzZV9vcHRpb25zX3VzYWdlKHVzYWdlc3RyLCBvcHRpb25zKTsKKwkJc3dpdGNoIChwYXJzZV9sb25nX29wdChjdHgsIGFyZyArIDIsIG9wdGlvbnMpKSB7CisJCWNhc2UgLTE6CisJCQlyZXR1cm4gcGFyc2Vfb3B0aW9uc191c2FnZSh1c2FnZXN0ciwgb3B0aW9ucyk7CisJCWNhc2UgLTI6CisJCQlnb3RvIHVua25vd247CisJCX0KKwkJY29udGludWU7Cit1bmtub3duOgorCQlpZiAoIShjdHgtPmZsYWdzICYgUEFSU0VfT1BUX0tFRVBfVU5LTk9XTikpCisJCQlyZXR1cm4gUEFSU0VfT1BUX1VOS05PV047CisJCWN0eC0+b3V0W2N0eC0+Y3BpZHgrK10gPSBjdHgtPmFyZ3ZbMF07CisJCWN0eC0+b3B0ID0gTlVMTDsKKwl9CisJcmV0dXJuIFBBUlNFX09QVF9ET05FOworfQorCitpbnQgcGFyc2Vfb3B0aW9uc19lbmQoc3RydWN0IHBhcnNlX29wdF9jdHhfdCAqY3R4KQoreworCW1lbW1vdmUoY3R4LT5vdXQgKyBjdHgtPmNwaWR4LCBjdHgtPmFyZ3YsIGN0eC0+YXJnYyAqIHNpemVvZigqY3R4LT5vdXQpKTsKKwljdHgtPm91dFtjdHgtPmNwaWR4ICsgY3R4LT5hcmdjXSA9IE5VTEw7CisJcmV0dXJuIGN0eC0+Y3BpZHggKyBjdHgtPmFyZ2M7Cit9CisKK2ludCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0aW9ucywKKwkJICBjb25zdCBjaGFyICogY29uc3QgdXNhZ2VzdHJbXSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgY3R4OworCisJcGFyc2Vfb3B0aW9uc19zdGFydCgmY3R4LCBhcmdjLCBhcmd2LCBmbGFncyk7CisJc3dpdGNoIChwYXJzZV9vcHRpb25zX3N0ZXAoJmN0eCwgb3B0aW9ucywgdXNhZ2VzdHIpKSB7CisJY2FzZSBQQVJTRV9PUFRfSEVMUDoKKwkJZXhpdCgxMjkpOworCWNhc2UgUEFSU0VfT1BUX0RPTkU6CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIFBBUlNFX09QVF9VTktOT1dOICovCisJCWlmIChjdHguYXJndlswXVsxXSA9PSAnLScpIHsKKwkJCWVycm9yKCJ1bmtub3duIG9wdGlvbiBgJXMnIiwgY3R4LmFyZ3ZbMF0gKyAyKTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bmtub3duIHN3aXRjaCBgJWMnIiwgKmN0eC5vcHQpOworCQl9CisJCXVzYWdlX3dpdGhfb3B0aW9ucyh1c2FnZXN0ciwgb3B0aW9ucyk7CisJfQorCisJcmV0dXJuIHBhcnNlX29wdGlvbnNfZW5kKCZjdHgpOworfQorCisjZGVmaW5lIFVTQUdFX09QVFNfV0lEVEggMjQKKyNkZWZpbmUgVVNBR0VfR0FQICAgICAgICAgMgorCitpbnQgdXNhZ2Vfd2l0aF9vcHRpb25zX2ludGVybmFsKGNvbnN0IGNoYXIgKiBjb25zdCAqdXNhZ2VzdHIsCisJCQkJY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0cywgaW50IGZ1bGwpCit7CisJaWYgKCF1c2FnZXN0cikKKwkJcmV0dXJuIFBBUlNFX09QVF9IRUxQOworCisJZnByaW50ZihzdGRlcnIsICJcbiB1c2FnZTogJXNcbiIsICp1c2FnZXN0cisrKTsKKwl3aGlsZSAoKnVzYWdlc3RyICYmICoqdXNhZ2VzdHIpCisJCWZwcmludGYoc3RkZXJyLCAiICAgIG9yOiAlc1xuIiwgKnVzYWdlc3RyKyspOworCXdoaWxlICgqdXNhZ2VzdHIpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyVzXG4iLAorCQkJCSoqdXNhZ2VzdHIgPyAiICAgICIgOiAiIiwKKwkJCQkqdXNhZ2VzdHIpOworCQl1c2FnZXN0cisrOworCX0KKworCWlmIChvcHRzLT50eXBlICE9IE9QVElPTl9HUk9VUCkKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKworCWZvciAoOyBvcHRzLT50eXBlICE9IE9QVElPTl9FTkQ7IG9wdHMrKykgeworCQlzaXplX3QgcG9zOworCQlpbnQgcGFkOworCisJCWlmIChvcHRzLT50eXBlID09IE9QVElPTl9HUk9VUCkgeworCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCWlmICgqb3B0cy0+aGVscCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBvcHRzLT5oZWxwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZnVsbCAmJiAob3B0cy0+ZmxhZ3MgJiBQQVJTRV9PUFRfSElEREVOKSkKKwkJCWNvbnRpbnVlOworCisJCXBvcyA9IGZwcmludGYoc3RkZXJyLCAiICAgICIpOworCQlpZiAob3B0cy0+c2hvcnRfbmFtZSkKKwkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIi0lYyIsIG9wdHMtPnNob3J0X25hbWUpOworCQlpZiAob3B0cy0+bG9uZ19uYW1lICYmIG9wdHMtPnNob3J0X25hbWUpCisJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICIsICIpOworCQlpZiAob3B0cy0+bG9uZ19uYW1lKQorCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiLS0lcyIsIG9wdHMtPmxvbmdfbmFtZSk7CisKKwkJc3dpdGNoIChvcHRzLT50eXBlKSB7CisJCWNhc2UgT1BUSU9OX0FSR1VNRU5UOgorCQkJYnJlYWs7CisJCWNhc2UgT1BUSU9OX0lOVEVHRVI6CisJCQlpZiAob3B0cy0+ZmxhZ3MgJiBQQVJTRV9PUFRfT1BUQVJHKQorCQkJCWlmIChvcHRzLT5sb25nX25hbWUpCisJCQkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIls9PG4+XSIpOworCQkJCWVsc2UKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiWzxuPl0iKTsKKwkJCWVsc2UKKwkJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICIgPG4+Iik7CisJCQlicmVhazsKKwkJY2FzZSBPUFRJT05fQ0FMTEJBQ0s6CisJCQlpZiAob3B0cy0+ZmxhZ3MgJiBQQVJTRV9PUFRfTk9BUkcpCisJCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIE9QVElPTl9TVFJJTkc6CisJCQlpZiAob3B0cy0+YXJnaCkgeworCQkJCWlmIChvcHRzLT5mbGFncyAmIFBBUlNFX09QVF9PUFRBUkcpCisJCQkJCWlmIChvcHRzLT5sb25nX25hbWUpCisJCQkJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICJbPTwlcz5dIiwgb3B0cy0+YXJnaCk7CisJCQkJCWVsc2UKKwkJCQkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIls8JXM+XSIsIG9wdHMtPmFyZ2gpOworCQkJCWVsc2UKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiIDwlcz4iLCBvcHRzLT5hcmdoKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG9wdHMtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRykKKwkJCQkJaWYgKG9wdHMtPmxvbmdfbmFtZSkKKwkJCQkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIls9Li4uXSIpOworCQkJCQllbHNlCisJCQkJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICJbLi4uXSIpOworCQkJCWVsc2UKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiIC4uLiIpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIE9QVElPTl97QklULEJPT0xFQU4sU0VUX0lOVCxTRVRfUFRSfSAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocG9zIDw9IFVTQUdFX09QVFNfV0lEVEgpCisJCQlwYWQgPSBVU0FHRV9PUFRTX1dJRFRIIC0gcG9zOworCQllbHNlIHsKKwkJCWZwdXRjKCdcbicsIHN0ZGVycik7CisJCQlwYWQgPSBVU0FHRV9PUFRTX1dJRFRIOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiJSpzJXNcbiIsIHBhZCArIFVTQUdFX0dBUCwgIiIsIG9wdHMtPmhlbHApOworCX0KKwlmcHV0YygnXG4nLCBzdGRlcnIpOworCisJcmV0dXJuIFBBUlNFX09QVF9IRUxQOworfQorCit2b2lkIHVzYWdlX3dpdGhfb3B0aW9ucyhjb25zdCBjaGFyICogY29uc3QgKnVzYWdlc3RyLAorCQkJY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0cykKK3sKKwl1c2FnZV93aXRoX29wdGlvbnNfaW50ZXJuYWwodXNhZ2VzdHIsIG9wdHMsIDApOworCWV4aXQoMTI5KTsKK30KKworaW50IHBhcnNlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwKKwkJCWNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdHMpCit7CisJcmV0dXJuIHVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbCh1c2FnZXN0ciwgb3B0cywgMCk7Cit9CisKKworaW50IHBhcnNlX29wdF92ZXJib3NpdHlfY2IoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICphcmcsCisJCQkgICBpbnQgdW5zZXQpCit7CisJaW50ICp0YXJnZXQgPSBvcHQtPnZhbHVlOworCisJaWYgKHVuc2V0KQorCQkvKiAtLW5vLXF1aWV0LCAtLW5vLXZlcmJvc2UgKi8KKwkJKnRhcmdldCA9IDA7CisJZWxzZSBpZiAob3B0LT5zaG9ydF9uYW1lID09ICd2JykgeworCQlpZiAoKnRhcmdldCA+PSAwKQorCQkJKCp0YXJnZXQpKys7CisJCWVsc2UKKwkJCSp0YXJnZXQgPSAxOworCX0gZWxzZSB7CisJCWlmICgqdGFyZ2V0IDw9IDApCisJCQkoKnRhcmdldCktLTsKKwkJZWxzZQorCQkJKnRhcmdldCA9IC0xOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmggYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDM5YTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTc0IEBACisjaWZuZGVmIFBBUlNFX09QVElPTlNfSAorI2RlZmluZSBQQVJTRV9PUFRJT05TX0gKKworZW51bSBwYXJzZV9vcHRfdHlwZSB7CisJLyogc3BlY2lhbCB0eXBlcyAqLworCU9QVElPTl9FTkQsCisJT1BUSU9OX0FSR1VNRU5ULAorCU9QVElPTl9HUk9VUCwKKwkvKiBvcHRpb25zIHdpdGggbm8gYXJndW1lbnRzICovCisJT1BUSU9OX0JJVCwKKwlPUFRJT05fQk9PTEVBTiwgLyogX0lOQ1Igd291bGQgaGF2ZSBiZWVuIGEgYmV0dGVyIG5hbWUgKi8KKwlPUFRJT05fU0VUX0lOVCwKKwlPUFRJT05fU0VUX1BUUiwKKwkvKiBvcHRpb25zIHdpdGggYXJndW1lbnRzICh1c3VhbGx5KSAqLworCU9QVElPTl9TVFJJTkcsCisJT1BUSU9OX0lOVEVHRVIsCisJT1BUSU9OX0xPTkcsCisJT1BUSU9OX0NBTExCQUNLLAorfTsKKworZW51bSBwYXJzZV9vcHRfZmxhZ3MgeworCVBBUlNFX09QVF9LRUVQX0RBU0hEQVNIID0gMSwKKwlQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OID0gMiwKKwlQQVJTRV9PUFRfS0VFUF9BUkdWMCA9IDQsCisJUEFSU0VfT1BUX0tFRVBfVU5LTk9XTiA9IDgsCisJUEFSU0VfT1BUX05PX0lOVEVSTkFMX0hFTFAgPSAxNiwKK307CisKK2VudW0gcGFyc2Vfb3B0X29wdGlvbl9mbGFncyB7CisJUEFSU0VfT1BUX09QVEFSRyAgPSAxLAorCVBBUlNFX09QVF9OT0FSRyAgID0gMiwKKwlQQVJTRV9PUFRfTk9ORUcgICA9IDQsCisJUEFSU0VfT1BUX0hJRERFTiAgPSA4LAorCVBBUlNFX09QVF9MQVNUQVJHX0RFRkFVTFQgPSAxNiwKK307CisKK3N0cnVjdCBvcHRpb247Cit0eXBlZGVmIGludCBwYXJzZV9vcHRfY2IoY29uc3Qgc3RydWN0IG9wdGlvbiAqLCBjb25zdCBjaGFyICphcmcsIGludCB1bnNldCk7CisKKy8qCisgKiBgdHlwZWA6OgorICogICBob2xkcyB0aGUgdHlwZSBvZiB0aGUgb3B0aW9uLCB5b3UgbXVzdCBoYXZlIGFuIE9QVElPTl9FTkQgbGFzdCBpbiB5b3VyCisgKiAgIGFycmF5LgorICoKKyAqIGBzaG9ydF9uYW1lYDo6CisgKiAgIHRoZSBjaGFyYWN0ZXIgdG8gdXNlIGFzIGEgc2hvcnQgb3B0aW9uIG5hbWUsICdcMCcgaWYgbm9uZS4KKyAqCisgKiBgbG9uZ19uYW1lYDo6CisgKiAgIHRoZSBsb25nIG9wdGlvbiBuYW1lLCB3aXRob3V0IHRoZSBsZWFkaW5nIGRhc2hlcywgTlVMTCBpZiBub25lLgorICoKKyAqIGB2YWx1ZWA6OgorICogICBzdG9yZXMgcG9pbnRlcnMgdG8gdGhlIHZhbHVlcyB0byBiZSBmaWxsZWQuCisgKgorICogYGFyZ2hgOjoKKyAqICAgdG9rZW4gdG8gZXhwbGFpbiB0aGUga2luZCBvZiBhcmd1bWVudCB0aGlzIG9wdGlvbiB3YW50cy4gS2VlcCBpdAorICogICBob21vZ2Vub3VzIGFjcm9zcyB0aGUgcmVwb3NpdG9yeS4KKyAqCisgKiBgaGVscGA6OgorICogICB0aGUgc2hvcnQgaGVscCBhc3NvY2lhdGVkIHRvIHdoYXQgdGhlIG9wdGlvbiBkb2VzLgorICogICBNdXN0IG5ldmVyIGJlIE5VTEwgKGV4Y2VwdCBmb3IgT1BUSU9OX0VORCkuCisgKiAgIE9QVElPTl9HUk9VUCB1c2VzIHRoaXMgcG9pbnRlciB0byBzdG9yZSB0aGUgZ3JvdXAgaGVhZGVyLgorICoKKyAqIGBmbGFnc2A6OgorICogICBtYXNrIG9mIHBhcnNlX29wdF9vcHRpb25fZmxhZ3MuCisgKiAgIFBBUlNFX09QVF9PUFRBUkc6IHNheXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgb3B0aW9ubmFsIChub3QgZm9yIEJPT0xFQU5zKQorICogICBQQVJTRV9PUFRfTk9BUkc6IHNheXMgdGhhdCB0aGlzIG9wdGlvbiB0YWtlcyBubyBhcmd1bWVudCwgZm9yIENBTExCQUNLcworICogICBQQVJTRV9PUFRfTk9ORUc6IHNheXMgdGhhdCB0aGlzIG9wdGlvbiBjYW5ub3QgYmUgbmVnYXRlZAorICogICBQQVJTRV9PUFRfSElEREVOIHRoaXMgb3B0aW9uIGlzIHNraXBwZWQgaW4gdGhlIGRlZmF1bHQgdXNhZ2UsIHNob3dlZCBpbgorICogICAgICAgICAgICAgICAgICAgIHRoZSBsb25nIG9uZS4KKyAqCisgKiBgY2FsbGJhY2tgOjoKKyAqICAgcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgdG8gdXNlIGZvciBPUFRJT05fQ0FMTEJBQ0suCisgKgorICogYGRlZnZhbGA6OgorICogICBkZWZhdWx0IHZhbHVlIHRvIGZpbGwgKCotPnZhbHVlKSB3aXRoIGZvciBQQVJTRV9PUFRfT1BUQVJHLgorICogICBPUFRJT05fe0JJVCxTRVRfSU5ULFNFVF9QVFJ9IHN0b3JlIHRoZSB7bWFzayxpbnRlZ2VyLHBvaW50ZXJ9IHRvIHB1dCBpbgorICogICB0aGUgdmFsdWUgd2hlbiBtZXQuCisgKiAgIENBTExCQUNLUyBjYW4gdXNlIGl0IGxpa2UgdGhleSB3YW50LgorICovCitzdHJ1Y3Qgb3B0aW9uIHsKKwllbnVtIHBhcnNlX29wdF90eXBlIHR5cGU7CisJaW50IHNob3J0X25hbWU7CisJY29uc3QgY2hhciAqbG9uZ19uYW1lOworCXZvaWQgKnZhbHVlOworCWNvbnN0IGNoYXIgKmFyZ2g7CisJY29uc3QgY2hhciAqaGVscDsKKworCWludCBmbGFnczsKKwlwYXJzZV9vcHRfY2IgKmNhbGxiYWNrOworCWludHB0cl90IGRlZnZhbDsKK307CisKKyNkZWZpbmUgT1BUX0VORCgpICAgICAgICAgICAgICAgICAgIHsgT1BUSU9OX0VORCB9CisjZGVmaW5lIE9QVF9BUkdVTUVOVChsLCBoKSAgICAgICAgICB7IE9QVElPTl9BUkdVTUVOVCwgMCwgKGwpLCBOVUxMLCBOVUxMLCAoaCkgfQorI2RlZmluZSBPUFRfR1JPVVAoaCkgICAgICAgICAgICAgICAgeyBPUFRJT05fR1JPVVAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIChoKSB9CisjZGVmaW5lIE9QVF9CSVQocywgbCwgdiwgaCwgYikgICAgICB7IE9QVElPTl9CSVQsIChzKSwgKGwpLCAodiksIE5VTEwsIChoKSwgMCwgTlVMTCwgKGIpIH0KKyNkZWZpbmUgT1BUX0JPT0xFQU4ocywgbCwgdiwgaCkgICAgIHsgT1BUSU9OX0JPT0xFQU4sIChzKSwgKGwpLCAodiksIE5VTEwsIChoKSB9CisjZGVmaW5lIE9QVF9TRVRfSU5UKHMsIGwsIHYsIGgsIGkpICB7IE9QVElPTl9TRVRfSU5ULCAocyksIChsKSwgKHYpLCBOVUxMLCAoaCksIDAsIE5VTEwsIChpKSB9CisjZGVmaW5lIE9QVF9TRVRfUFRSKHMsIGwsIHYsIGgsIHApICB7IE9QVElPTl9TRVRfUFRSLCAocyksIChsKSwgKHYpLCBOVUxMLCAoaCksIDAsIE5VTEwsIChwKSB9CisjZGVmaW5lIE9QVF9JTlRFR0VSKHMsIGwsIHYsIGgpICAgICB7IE9QVElPTl9JTlRFR0VSLCAocyksIChsKSwgKHYpLCBOVUxMLCAoaCkgfQorI2RlZmluZSBPUFRfTE9ORyhzLCBsLCB2LCBoKSAgICAgICAgeyBPUFRJT05fTE9ORywgKHMpLCAobCksICh2KSwgTlVMTCwgKGgpIH0KKyNkZWZpbmUgT1BUX1NUUklORyhzLCBsLCB2LCBhLCBoKSAgIHsgT1BUSU9OX1NUUklORywgIChzKSwgKGwpLCAodiksIChhKSwgKGgpIH0KKyNkZWZpbmUgT1BUX0RBVEUocywgbCwgdiwgaCkgXAorCXsgT1BUSU9OX0NBTExCQUNLLCAocyksIChsKSwgKHYpLCAidGltZSIsKGgpLCAwLCBcCisJICBwYXJzZV9vcHRfYXBwcm94aWRhdGVfY2IgfQorI2RlZmluZSBPUFRfQ0FMTEJBQ0socywgbCwgdiwgYSwgaCwgZikgXAorCXsgT1BUSU9OX0NBTExCQUNLLCAocyksIChsKSwgKHYpLCAoYSksIChoKSwgMCwgKGYpIH0KKworLyogcGFyc2Vfb3B0aW9ucygpIHdpbGwgZmlsdGVyIG91dCB0aGUgcHJvY2Vzc2VkIG9wdGlvbnMgYW5kIGxlYXZlIHRoZQorICogbm9uLW9wdGlvbiBhcmdtZW50cyBpbiBhcmd2W10uCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGxlZnQgaW4gYXJndltdLgorICovCitleHRlcm4gaW50IHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHVzYWdlc3RyW10sIGludCBmbGFncyk7CisKK2V4dGVybiBOT1JFVFVSTiB2b2lkIHVzYWdlX3dpdGhfb3B0aW9ucyhjb25zdCBjaGFyICogY29uc3QgKnVzYWdlc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpOworCisvKi0tLS0tIGluY3JlbWFudGFsIGFkdmFuY2VkIEFQSXMgLS0tLS0qLworCitlbnVtIHsKKwlQQVJTRV9PUFRfSEVMUCA9IC0xLAorCVBBUlNFX09QVF9ET05FLAorCVBBUlNFX09QVF9VTktOT1dOLAorfTsKKworLyoKKyAqIEl0J3Mgb2theSBmb3IgdGhlIGNhbGxlciB0byBjb25zdW1lIGFyZ3YvYXJnYyBpbiB0aGUgdXN1YWwgd2F5LgorICogT3RoZXIgZmllbGRzIG9mIHRoYXQgc3RydWN0dXJlIGFyZSBwcml2YXRlIHRvIHBhcnNlLW9wdGlvbnMgYW5kIHNob3VsZCBub3QKKyAqIGJlIG1vZGlmaWVkIGluIGFueSB3YXkuCisgKi8KK3N0cnVjdCBwYXJzZV9vcHRfY3R4X3QgeworCWNvbnN0IGNoYXIgKiphcmd2OworCWNvbnN0IGNoYXIgKipvdXQ7CisJaW50IGFyZ2MsIGNwaWR4OworCWNvbnN0IGNoYXIgKm9wdDsKKwlpbnQgZmxhZ3M7Cit9OworCitleHRlcm4gaW50IHBhcnNlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRzKTsKKworZXh0ZXJuIHZvaWQgcGFyc2Vfb3B0aW9uc19zdGFydChzdHJ1Y3QgcGFyc2Vfb3B0X2N0eF90ICpjdHgsCisJCQkJaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgZmxhZ3MpOworCitleHRlcm4gaW50IHBhcnNlX29wdGlvbnNfc3RlcChzdHJ1Y3QgcGFyc2Vfb3B0X2N0eF90ICpjdHgsCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zLAorCQkJICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHVzYWdlc3RyW10pOworCitleHRlcm4gaW50IHBhcnNlX29wdGlvbnNfZW5kKHN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgKmN0eCk7CisKKworLyotLS0tLSBzb21lIG9mdGVuIHVzZWQgb3B0aW9ucyAtLS0tLSovCitleHRlcm4gaW50IHBhcnNlX29wdF9hYmJyZXZfY2IoY29uc3Qgc3RydWN0IG9wdGlvbiAqLCBjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gaW50IHBhcnNlX29wdF9hcHByb3hpZGF0ZV9jYihjb25zdCBzdHJ1Y3Qgb3B0aW9uICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2V4dGVybiBpbnQgcGFyc2Vfb3B0X3ZlcmJvc2l0eV9jYihjb25zdCBzdHJ1Y3Qgb3B0aW9uICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2RlZmluZSBPUFRfX1ZFUkJPU0UodmFyKSAgT1BUX0JPT0xFQU4oJ3YnLCAidmVyYm9zZSIsICh2YXIpLCAiYmUgdmVyYm9zZSIpCisjZGVmaW5lIE9QVF9fUVVJRVQodmFyKSAgICBPUFRfQk9PTEVBTigncScsICJxdWlldCIsICAgKHZhciksICJiZSBxdWlldCIpCisjZGVmaW5lIE9QVF9fVkVSQk9TSVRZKHZhcikgXAorCXsgT1BUSU9OX0NBTExCQUNLLCAndicsICJ2ZXJib3NlIiwgKHZhciksIE5VTEwsICJiZSBtb3JlIHZlcmJvc2UiLCBcCisJICBQQVJTRV9PUFRfTk9BUkcsICZwYXJzZV9vcHRfdmVyYm9zaXR5X2NiLCAwIH0sIFwKKwl7IE9QVElPTl9DQUxMQkFDSywgJ3EnLCAicXVpZXQiLCAodmFyKSwgTlVMTCwgImJlIG1vcmUgcXVpZXQiLCBcCisJICBQQVJTRV9PUFRfTk9BUkcsICZwYXJzZV9vcHRfdmVyYm9zaXR5X2NiLCAwIH0KKyNkZWZpbmUgT1BUX19EUllfUlVOKHZhcikgIE9QVF9CT09MRUFOKCduJywgImRyeS1ydW4iLCAodmFyKSwgImRyeSBydW4iKQorI2RlZmluZSBPUFRfX0FCQlJFVih2YXIpICBcCisJeyBPUFRJT05fQ0FMTEJBQ0ssIDAsICJhYmJyZXYiLCAodmFyKSwgIm4iLCBcCisJICAidXNlIDxuPiBkaWdpdHMgdG8gZGlzcGxheSBTSEEtMXMiLCBcCisJICBQQVJTRV9PUFRfT1BUQVJHLCAmcGFyc2Vfb3B0X2FiYnJldl9jYiwgMCB9CisKK2V4dGVybiBjb25zdCBjaGFyICpwYXJzZV9vcHRpb25zX2ZpeF9maWxlbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZpbGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXRoLmMgYi90b29scy9wZXJmL3V0aWwvcGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDFhNDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcGF0aC5jCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogSSdtIHRpcmVkIG9mIGRvaW5nICJ2c25wcmludGYoKSIgZXRjIGp1c3QgdG8gb3BlbiBhCisgKiBmaWxlLCBzbyBoZXJlJ3MgYSAicmV0dXJuIHN0YXRpYyBidWZmZXIgd2l0aCBwcmludGYiCisgKiBpbnRlcmZhY2UgZm9yIHBhdGhzLgorICoKKyAqIEl0J3Mgb2J2aW91c2x5IG5vdCB0aHJlYWQtc2FmZS4gU3VlIG1lLiBCdXQgaXQncyBxdWl0ZQorICogdXNlZnVsIGZvciBkb2luZyB0aGluZ3MgbGlrZQorICoKKyAqICAgZiA9IG9wZW4obWtwYXRoKCIlcy8lcy5wZXJmIiwgYmFzZSwgbmFtZSksIE9fUkRPTkxZKTsKKyAqCisgKiB3aGljaCBpcyB3aGF0IGl0J3MgZGVzaWduZWQgZm9yLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIGNoYXIgYmFkX3BhdGhbXSA9ICIvYmFkLXBhdGgvIjsKKy8qCisgKiBUd28gaGFja3M6CisgKi8KKworc3RhdGljIGNoYXIgKmdldF9wZXJmX2Rpcih2b2lkKQoreworCXJldHVybiAiLiI7Cit9CisKK3NpemVfdCBzdHJsY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IHJldCA9IHN0cmxlbihzcmMpOworCisJaWYgKHNpemUpIHsKKwkJc2l6ZV90IGxlbiA9IChyZXQgPj0gc2l6ZSkgPyBzaXplIC0gMSA6IHJldDsKKwkJbWVtY3B5KGRlc3QsIHNyYywgbGVuKTsKKwkJZGVzdFtsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgY2hhciAqZ2V0X3BhdGhuYW1lKHZvaWQpCit7CisJc3RhdGljIGNoYXIgcGF0aG5hbWVfYXJyYXlbNF1bUEFUSF9NQVhdOworCXN0YXRpYyBpbnQgaW5kZXg7CisJcmV0dXJuIHBhdGhuYW1lX2FycmF5WzMgJiArK2luZGV4XTsKK30KKworc3RhdGljIGNoYXIgKmNsZWFudXBfcGF0aChjaGFyICpwYXRoKQoreworCS8qIENsZWFuIGl0IHVwICovCisJaWYgKCFtZW1jbXAocGF0aCwgIi4vIiwgMikpIHsKKwkJcGF0aCArPSAyOworCQl3aGlsZSAoKnBhdGggPT0gJy8nKQorCQkJcGF0aCsrOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworY2hhciAqbWtzbnBhdGgoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXVuc2lnbmVkIGxlbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKGJ1ZiwgbiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKGxlbiA+PSBuKSB7CisJCXN0cmxjcHkoYnVmLCBiYWRfcGF0aCwgbik7CisJCXJldHVybiBidWY7CisJfQorCXJldHVybiBjbGVhbnVwX3BhdGgoYnVmKTsKK30KKworc3RhdGljIGNoYXIgKnBlcmZfdnNucGF0aChjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwljb25zdCBjaGFyICpwZXJmX2RpciA9IGdldF9wZXJmX2RpcigpOworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzdHJsZW4ocGVyZl9kaXIpOworCWlmIChuIDwgbGVuICsgMSkKKwkJZ290byBiYWQ7CisJbWVtY3B5KGJ1ZiwgcGVyZl9kaXIsIGxlbik7CisJaWYgKGxlbiAmJiAhaXNfZGlyX3NlcChwZXJmX2RpcltsZW4tMV0pKQorCQlidWZbbGVuKytdID0gJy8nOworCWxlbiArPSB2c25wcmludGYoYnVmICsgbGVuLCBuIC0gbGVuLCBmbXQsIGFyZ3MpOworCWlmIChsZW4gPj0gbikKKwkJZ290byBiYWQ7CisJcmV0dXJuIGNsZWFudXBfcGF0aChidWYpOworYmFkOgorCXN0cmxjcHkoYnVmLCBiYWRfcGF0aCwgbik7CisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqcGVyZl9zbnBhdGgoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJKHZvaWQpcGVyZl92c25wYXRoKGJ1ZiwgbiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqcGVyZl9wYXRoZHVwKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJdmFfbGlzdCBhcmdzOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJKHZvaWQpcGVyZl92c25wYXRoKHBhdGgsIHNpemVvZihwYXRoKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuIHhzdHJkdXAocGF0aCk7Cit9CisKK2NoYXIgKm1rcGF0aChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgbGVuOworCWNoYXIgKnBhdGhuYW1lID0gZ2V0X3BhdGhuYW1lKCk7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzbnByaW50ZihwYXRobmFtZSwgUEFUSF9NQVgsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWlmIChsZW4gPj0gUEFUSF9NQVgpCisJCXJldHVybiBiYWRfcGF0aDsKKwlyZXR1cm4gY2xlYW51cF9wYXRoKHBhdGhuYW1lKTsKK30KKworY2hhciAqcGVyZl9wYXRoKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNvbnN0IGNoYXIgKnBlcmZfZGlyID0gZ2V0X3BlcmZfZGlyKCk7CisJY2hhciAqcGF0aG5hbWUgPSBnZXRfcGF0aG5hbWUoKTsKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgbGVuOworCisJbGVuID0gc3RybGVuKHBlcmZfZGlyKTsKKwlpZiAobGVuID4gUEFUSF9NQVgtMTAwKQorCQlyZXR1cm4gYmFkX3BhdGg7CisJbWVtY3B5KHBhdGhuYW1lLCBwZXJmX2RpciwgbGVuKTsKKwlpZiAobGVuICYmIHBlcmZfZGlyW2xlbi0xXSAhPSAnLycpCisJCXBhdGhuYW1lW2xlbisrXSA9ICcvJzsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiArPSB2c25wcmludGYocGF0aG5hbWUgKyBsZW4sIFBBVEhfTUFYIC0gbGVuLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gYmFkX3BhdGg7CisJcmV0dXJuIGNsZWFudXBfcGF0aChwYXRobmFtZSk7Cit9CisKKworLyogcGVyZl9ta3N0ZW1wKCkgLSBjcmVhdGUgdG1wIGZpbGUgaG9ub3JpbmcgVE1QRElSIHZhcmlhYmxlICovCitpbnQgcGVyZl9ta3N0ZW1wKGNoYXIgKnBhdGgsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnRlbXBsYXRlKQoreworCWNvbnN0IGNoYXIgKnRtcDsKKwlzaXplX3QgbjsKKworCXRtcCA9IGdldGVudigiVE1QRElSIik7CisJaWYgKCF0bXApCisJCXRtcCA9ICIvdG1wIjsKKwluID0gc25wcmludGYocGF0aCwgbGVuLCAiJXMvJXMiLCB0bXAsIHRlbXBsYXRlKTsKKwlpZiAobGVuIDw9IG4pIHsKKwkJZXJybm8gPSBFTkFNRVRPT0xPTkc7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIG1rc3RlbXAocGF0aCk7Cit9CisKKworY29uc3QgY2hhciAqbWFrZV9yZWxhdGl2ZV9wYXRoKGNvbnN0IGNoYXIgKmFicywgY29uc3QgY2hhciAqYmFzZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVggKyAxXTsKKwlpbnQgYmFzZWxlbjsKKwlpZiAoIWJhc2UpCisJCXJldHVybiBhYnM7CisJYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlpZiAocHJlZml4Y21wKGFicywgYmFzZSkpCisJCXJldHVybiBhYnM7CisJaWYgKGFic1tiYXNlbGVuXSA9PSAnLycpCisJCWJhc2VsZW4rKzsKKwllbHNlIGlmIChiYXNlW2Jhc2VsZW4gLSAxXSAhPSAnLycpCisJCXJldHVybiBhYnM7CisJc3RyY3B5KGJ1ZiwgYWJzICsgYmFzZWxlbik7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIEl0IGlzIG9rYXkgaWYgZHN0ID09IHNyYywgYnV0IHRoZXkgc2hvdWxkIG5vdCBvdmVybGFwIG90aGVyd2lzZS4KKyAqCisgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIG5vcm1hbGl6YXRpb25zIG9uIHNyYywgc3RvcmluZyB0aGUgcmVzdWx0IGluIGRzdDoKKyAqIC0gRW5zdXJlcyB0aGF0IGNvbXBvbmVudHMgYXJlIHNlcGFyYXRlZCBieSAnLycgKFdpbmRvd3Mgb25seSkKKyAqIC0gU3F1YXNoZXMgc2VxdWVuY2VzIG9mICcvJy4KKyAqIC0gUmVtb3ZlcyAiLiIgY29tcG9uZW50cy4KKyAqIC0gUmVtb3ZlcyAiLi4iIGNvbXBvbmVudHMsIGFuZCB0aGUgY29tcG9uZW50cyB0aGUgcHJlY2VkZSB0aGVtLgorICogUmV0dXJucyBmYWlsdXJlIChub24temVybykgaWYgYSAiLi4iIGNvbXBvbmVudCBhcHBlYXJzIGFzIGZpcnN0IHBhdGgKKyAqIGNvbXBvbmVudCBhbnl0aW1lIGR1cmluZyB0aGUgbm9ybWFsaXphdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm5zIHN1Y2Nlc3MgKDApLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHB1cmVseSB0ZXh0dWFsLiAgSXQgZG9lcyBub3QgZm9sbG93IHN5bWxpbmtzLAorICogdmVyaWZ5IHRoZSBleGlzdGVuY2Ugb2YgdGhlIHBhdGgsIG9yIG1ha2UgYW55IHN5c3RlbSBjYWxscy4KKyAqLworaW50IG5vcm1hbGl6ZV9wYXRoX2NvcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciAqZHN0MDsKKworCWlmIChoYXNfZG9zX2RyaXZlX3ByZWZpeChzcmMpKSB7CisJCSpkc3QrKyA9ICpzcmMrKzsKKwkJKmRzdCsrID0gKnNyYysrOworCX0KKwlkc3QwID0gZHN0OworCisJaWYgKGlzX2Rpcl9zZXAoKnNyYykpIHsKKwkJKmRzdCsrID0gJy8nOworCQl3aGlsZSAoaXNfZGlyX3NlcCgqc3JjKSkKKwkJCXNyYysrOworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKnNyYzsKKworCQkvKgorCQkgKiBBIHBhdGggY29tcG9uZW50IHRoYXQgYmVnaW5zIHdpdGggLiBjb3VsZCBiZQorCQkgKiBzcGVjaWFsOgorCQkgKiAoMSkgIi4iIGFuZCBlbmRzICAgLS0gaWdub3JlIGFuZCB0ZXJtaW5hdGUuCisJCSAqICgyKSAiLi8iICAgICAgICAgICAtLSBpZ25vcmUgdGhlbSwgZWF0IHNsYXNoIGFuZCBjb250aW51ZS4KKwkJICogKDMpICIuLiIgYW5kIGVuZHMgIC0tIHN0cmlwIG9uZSBhbmQgdGVybWluYXRlLgorCQkgKiAoNCkgIi4uLyIgICAgICAgICAgLS0gc3RyaXAgb25lLCBlYXQgc2xhc2ggYW5kIGNvbnRpbnVlLgorCQkgKi8KKwkJaWYgKGMgPT0gJy4nKSB7CisJCQlpZiAoIXNyY1sxXSkgeworCQkJCS8qICgxKSAqLworCQkJCXNyYysrOworCQkJfSBlbHNlIGlmIChpc19kaXJfc2VwKHNyY1sxXSkpIHsKKwkJCQkvKiAoMikgKi8KKwkJCQlzcmMgKz0gMjsKKwkJCQl3aGlsZSAoaXNfZGlyX3NlcCgqc3JjKSkKKwkJCQkJc3JjKys7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHNyY1sxXSA9PSAnLicpIHsKKwkJCQlpZiAoIXNyY1syXSkgeworCQkJCQkvKiAoMykgKi8KKwkJCQkJc3JjICs9IDI7CisJCQkJCWdvdG8gdXBfb25lOworCQkJCX0gZWxzZSBpZiAoaXNfZGlyX3NlcChzcmNbMl0pKSB7CisJCQkJCS8qICg0KSAqLworCQkJCQlzcmMgKz0gMzsKKwkJCQkJd2hpbGUgKGlzX2Rpcl9zZXAoKnNyYykpCisJCQkJCQlzcmMrKzsKKwkJCQkJZ290byB1cF9vbmU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogY29weSB1cCB0byB0aGUgbmV4dCAnLycsIGFuZCBlYXQgYWxsICcvJyAqLworCQl3aGlsZSAoKGMgPSAqc3JjKyspICE9ICdcMCcgJiYgIWlzX2Rpcl9zZXAoYykpCisJCQkqZHN0KysgPSBjOworCQlpZiAoaXNfZGlyX3NlcChjKSkgeworCQkJKmRzdCsrID0gJy8nOworCQkJd2hpbGUgKGlzX2Rpcl9zZXAoYykpCisJCQkJYyA9ICpzcmMrKzsKKwkJCXNyYy0tOworCQl9IGVsc2UgaWYgKCFjKQorCQkJYnJlYWs7CisJCWNvbnRpbnVlOworCisJdXBfb25lOgorCQkvKgorCQkgKiBkc3QwLi5kc3QgaXMgcHJlZml4IHBvcnRpb24sIGFuZCBkc3RbLTFdIGlzICcvJzsKKwkJICogZ28gdXAgb25lIGxldmVsLgorCQkgKi8KKwkJZHN0LS07CS8qIGdvIHRvIHRyYWlsaW5nICcvJyAqLworCQlpZiAoZHN0IDw9IGRzdDApCisJCQlyZXR1cm4gLTE7CisJCS8qIFdpbmRvd3M6IGRzdFstMV0gY2Fubm90IGJlIGJhY2tzbGFzaCBhbnltb3JlICovCisJCXdoaWxlIChkc3QwIDwgZHN0ICYmIGRzdFstMV0gIT0gJy8nKQorCQkJZHN0LS07CisJfQorCSpkc3QgPSAnXDAnOworCXJldHVybiAwOworfQorCisvKgorICogcGF0aCA9IENhbm9uaWNhbCBhYnNvbHV0ZSBwYXRoCisgKiBwcmVmaXhfbGlzdCA9IENvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGFic29sdXRlIHBhdGhzCisgKgorICogRGV0ZXJtaW5lcywgZm9yIGVhY2ggcGF0aCBpbiBwcmVmaXhfbGlzdCwgd2hldGhlciB0aGUgInByZWZpeCIgcmVhbGx5CisgKiBpcyBhbiBhbmNlc3RvciBkaXJlY3Rvcnkgb2YgcGF0aC4gIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdAorICogYW5jZXN0b3IgZGlyZWN0b3J5LCBleGNsdWRpbmcgYW55IHRyYWlsaW5nIHNsYXNoZXMsIG9yIC0xIGlmIG5vIHByZWZpeAorICogaXMgYW4gYW5jZXN0b3IuICAoTm90ZSB0aGF0IHRoaXMgbWVhbnMgMCBpcyByZXR1cm5lZCBpZiBwcmVmaXhfbGlzdCBpcworICogIi8iLikgIi9mb28iIGlzIG5vdCBjb25zaWRlcmVkIGFuIGFuY2VzdG9yIG9mICIvZm9vYmFyIi4gIERpcmVjdG9yaWVzCisgKiBhcmUgbm90IGNvbnNpZGVyZWQgdG8gYmUgdGhlaXIgb3duIGFuY2VzdG9ycy4gIHBhdGggbXVzdCBiZSBpbiBhCisgKiBjYW5vbmljYWwgZm9ybTogZW1wdHkgY29tcG9uZW50cywgb3IgIi4iIG9yICIuLiIgY29tcG9uZW50cyBhcmUgbm90CisgKiBhbGxvd2VkLiAgcHJlZml4X2xpc3QgbWF5IGJlIG51bGwsIHdoaWNoIGlzIGxpa2UgIiIuCisgKi8KK2ludCBsb25nZXN0X2FuY2VzdG9yX2xlbmd0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpwcmVmaXhfbGlzdCkKK3sKKwljaGFyIGJ1ZltQQVRIX01BWCsxXTsKKwljb25zdCBjaGFyICpjZWlsLCAqY29sb247CisJaW50IGxlbiwgbWF4X2xlbiA9IC0xOworCisJaWYgKHByZWZpeF9saXN0ID09IE5VTEwgfHwgIXN0cmNtcChwYXRoLCAiLyIpKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGNvbG9uID0gY2VpbCA9IHByZWZpeF9saXN0OyAqY29sb247IGNlaWwgPSBjb2xvbisxKSB7CisJCWZvciAoY29sb24gPSBjZWlsOyAqY29sb24gJiYgKmNvbG9uICE9IFBBVEhfU0VQOyBjb2xvbisrKTsKKwkJbGVuID0gY29sb24gLSBjZWlsOworCQlpZiAobGVuID09IDAgfHwgbGVuID4gUEFUSF9NQVggfHwgIWlzX2Fic29sdXRlX3BhdGgoY2VpbCkpCisJCQljb250aW51ZTsKKwkJc3RybGNweShidWYsIGNlaWwsIGxlbisxKTsKKwkJaWYgKG5vcm1hbGl6ZV9wYXRoX2NvcHkoYnVmLCBidWYpIDwgMCkKKwkJCWNvbnRpbnVlOworCQlsZW4gPSBzdHJsZW4oYnVmKTsKKwkJaWYgKGxlbiA+IDAgJiYgYnVmW2xlbi0xXSA9PSAnLycpCisJCQlidWZbLS1sZW5dID0gJ1wwJzsKKworCQlpZiAoIXN0cm5jbXAocGF0aCwgYnVmLCBsZW4pICYmCisJCSAgICBwYXRoW2xlbl0gPT0gJy8nICYmCisJCSAgICBsZW4gPiBtYXhfbGVuKSB7CisJCQltYXhfbGVuID0gbGVuOworCQl9CisJfQorCisJcmV0dXJuIG1heF9sZW47Cit9CisKKy8qIHN0cmlwIGFyYml0cmFyeSBhbW91bnQgb2YgZGlyZWN0b3J5IHNlcGFyYXRvcnMgYXQgZW5kIG9mIHBhdGggKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNob21wX3RyYWlsaW5nX2Rpcl9zZXAoY29uc3QgY2hhciAqcGF0aCwgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuICYmIGlzX2Rpcl9zZXAocGF0aFtsZW4gLSAxXSkpCisJCWxlbi0tOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBJZiBwYXRoIGVuZHMgd2l0aCBzdWZmaXggKGNvbXBsZXRlIHBhdGggY29tcG9uZW50cyksIHJldHVybnMgdGhlCisgKiBwYXJ0IGJlZm9yZSBzdWZmaXggKHNhbnMgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcnMpLgorICogT3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KKyAqLworY2hhciAqc3RyaXBfcGF0aF9zdWZmaXgoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc3VmZml4KQoreworCWludCBwYXRoX2xlbiA9IHN0cmxlbihwYXRoKSwgc3VmZml4X2xlbiA9IHN0cmxlbihzdWZmaXgpOworCisJd2hpbGUgKHN1ZmZpeF9sZW4pIHsKKwkJaWYgKCFwYXRoX2xlbikKKwkJCXJldHVybiBOVUxMOworCisJCWlmIChpc19kaXJfc2VwKHBhdGhbcGF0aF9sZW4gLSAxXSkpIHsKKwkJCWlmICghaXNfZGlyX3NlcChzdWZmaXhbc3VmZml4X2xlbiAtIDFdKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXBhdGhfbGVuID0gY2hvbXBfdHJhaWxpbmdfZGlyX3NlcChwYXRoLCBwYXRoX2xlbik7CisJCQlzdWZmaXhfbGVuID0gY2hvbXBfdHJhaWxpbmdfZGlyX3NlcChzdWZmaXgsIHN1ZmZpeF9sZW4pOworCQl9CisJCWVsc2UgaWYgKHBhdGhbLS1wYXRoX2xlbl0gIT0gc3VmZml4Wy0tc3VmZml4X2xlbl0pCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAocGF0aF9sZW4gJiYgIWlzX2Rpcl9zZXAocGF0aFtwYXRoX2xlbiAtIDFdKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHhzdHJuZHVwKHBhdGgsIGNob21wX3RyYWlsaW5nX2Rpcl9zZXAocGF0aCwgcGF0aF9sZW4pKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9xdW90ZS5jIGIvdG9vbHMvcGVyZi91dGlsL3F1b3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4YzUyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9xdW90ZS5jCkBAIC0wLDAgKzEsNDgxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorCitpbnQgcXVvdGVfcGF0aF9mdWxseSA9IDE7CisKKy8qIEhlbHAgdG8gY29weSB0aGUgdGhpbmcgcHJvcGVybHkgcXVvdGVkIGZvciB0aGUgc2hlbGwgc2FmZXR5LgorICogYW55IHNpbmdsZSBxdW90ZSBpcyByZXBsYWNlZCB3aXRoICdcJycsIGFueSBleGNsYW1hdGlvbiBwb2ludAorICogaXMgcmVwbGFjZWQgd2l0aCAnXCEnLCBhbmQgdGhlIHdob2xlIHRoaW5nIGlzIGVuY2xvc2VkIGluIGEKKyAqCisgKiBFLmcuCisgKiAgb3JpZ2luYWwgICAgIHNxX3F1b3RlICAgICByZXN1bHQKKyAqICBuYW1lICAgICA9PT4gbmFtZSAgICAgID09PiAnbmFtZScKKyAqICBhIGIgICAgICA9PT4gYSBiICAgICAgID09PiAnYSBiJworICogIGEnYiAgICAgID09PiBhJ1wnJ2IgICAgPT0+ICdhJ1wnJ2InCisgKiAgYSFiICAgICAgPT0+IGEnXCEnYiAgICA9PT4gJ2EnXCEnYicKKyAqLworc3RhdGljIGlubGluZSBpbnQgbmVlZF9ic19xdW90ZShjaGFyIGMpCit7CisJcmV0dXJuIChjID09ICdcJycgfHwgYyA9PSAnIScpOworfQorCit2b2lkIHNxX3F1b3RlX2J1ZihzdHJ1Y3Qgc3RyYnVmICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICp0b19mcmVlID0gTlVMTDsKKworCWlmIChkc3QtPmJ1ZiA9PSBzcmMpCisJCXRvX2ZyZWUgPSBzdHJidWZfZGV0YWNoKGRzdCwgTlVMTCk7CisKKwlzdHJidWZfYWRkY2goZHN0LCAnXCcnKTsKKwl3aGlsZSAoKnNyYykgeworCQlzaXplX3QgbGVuID0gc3RyY3NwbihzcmMsICInISIpOworCQlzdHJidWZfYWRkKGRzdCwgc3JjLCBsZW4pOworCQlzcmMgKz0gbGVuOworCQl3aGlsZSAobmVlZF9ic19xdW90ZSgqc3JjKSkgeworCQkJc3RyYnVmX2FkZHN0cihkc3QsICInXFwiKTsKKwkJCXN0cmJ1Zl9hZGRjaChkc3QsICpzcmMrKyk7CisJCQlzdHJidWZfYWRkY2goZHN0LCAnXCcnKTsKKwkJfQorCX0KKwlzdHJidWZfYWRkY2goZHN0LCAnXCcnKTsKKwlmcmVlKHRvX2ZyZWUpOworfQorCit2b2lkIHNxX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgYzsKKworCWZwdXRjKCdcJycsIHN0cmVhbSk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlpZiAobmVlZF9ic19xdW90ZShjKSkgeworCQkJZnB1dHMoIidcXCIsIHN0cmVhbSk7CisJCQlmcHV0YyhjLCBzdHJlYW0pOworCQkJZnB1dGMoJ1wnJywgc3RyZWFtKTsKKwkJfSBlbHNlIHsKKwkJCWZwdXRjKGMsIHN0cmVhbSk7CisJCX0KKwl9CisJZnB1dGMoJ1wnJywgc3RyZWFtKTsKK30KKwordm9pZCBzcV9xdW90ZV9hcmd2KHN0cnVjdCBzdHJidWYgKmRzdCwgY29uc3QgY2hhcioqIGFyZ3YsIHNpemVfdCBtYXhsZW4pCit7CisJaW50IGk7CisKKwkvKiBDb3B5IGludG8gZGVzdGluYXRpb24gYnVmZmVyLiAqLworCXN0cmJ1Zl9ncm93KGRzdCwgMjU1KTsKKwlmb3IgKGkgPSAwOyBhcmd2W2ldOyArK2kpIHsKKwkJc3RyYnVmX2FkZGNoKGRzdCwgJyAnKTsKKwkJc3FfcXVvdGVfYnVmKGRzdCwgYXJndltpXSk7CisJCWlmIChtYXhsZW4gJiYgZHN0LT5sZW4gPiBtYXhsZW4pCisJCQlkaWUoIlRvbyBtYW55IG9yIGxvbmcgYXJndW1lbnRzIik7CisJfQorfQorCitjaGFyICpzcV9kZXF1b3RlX3N0ZXAoY2hhciAqYXJnLCBjaGFyICoqbmV4dCkKK3sKKwljaGFyICpkc3QgPSBhcmc7CisJY2hhciAqc3JjID0gYXJnOworCWNoYXIgYzsKKworCWlmICgqc3JjICE9ICdcJycpCisJCXJldHVybiBOVUxMOworCWZvciAoOzspIHsKKwkJYyA9ICorK3NyYzsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChjICE9ICdcJycpIHsKKwkJCSpkc3QrKyA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXZSBzdGVwcGVkIG91dCBvZiBzcSAqLworCQlzd2l0Y2ggKCorK3NyYykgeworCQljYXNlICdcMCc6CisJCQkqZHN0ID0gMDsKKwkJCWlmIChuZXh0KQorCQkJCSpuZXh0ID0gTlVMTDsKKwkJCXJldHVybiBhcmc7CisJCWNhc2UgJ1xcJzoKKwkJCWMgPSAqKytzcmM7CisJCQlpZiAobmVlZF9ic19xdW90ZShjKSAmJiAqKytzcmMgPT0gJ1wnJykgeworCQkJCSpkc3QrKyA9IGM7CisJCQkJY29udGludWU7CisJCQl9CisJCS8qIEZhbGx0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQlpZiAoIW5leHQgfHwgIWlzc3BhY2UoKnNyYykpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlkbyB7CisJCQkJYyA9ICorK3NyYzsKKwkJCX0gd2hpbGUgKGlzc3BhY2UoYykpOworCQkJKmRzdCA9IDA7CisJCQkqbmV4dCA9IHNyYzsKKwkJCXJldHVybiBhcmc7CisJCX0KKwl9Cit9CisKK2NoYXIgKnNxX2RlcXVvdGUoY2hhciAqYXJnKQoreworCXJldHVybiBzcV9kZXF1b3RlX3N0ZXAoYXJnLCBOVUxMKTsKK30KKworaW50IHNxX2RlcXVvdGVfdG9fYXJndihjaGFyICphcmcsIGNvbnN0IGNoYXIgKioqYXJndiwgaW50ICpuciwgaW50ICphbGxvYykKK3sKKwljaGFyICpuZXh0ID0gYXJnOworCisJaWYgKCEqYXJnKQorCQlyZXR1cm4gMDsKKwlkbyB7CisJCWNoYXIgKmRlcXVvdGVkID0gc3FfZGVxdW90ZV9zdGVwKG5leHQsICZuZXh0KTsKKwkJaWYgKCFkZXF1b3RlZCkKKwkJCXJldHVybiAtMTsKKwkJQUxMT0NfR1JPVygqYXJndiwgKm5yICsgMSwgKmFsbG9jKTsKKwkJKCphcmd2KVsoKm5yKSsrXSA9IGRlcXVvdGVkOworCX0gd2hpbGUgKG5leHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIDEgbWVhbnM6IHF1b3RlIGFzIG9jdGFsCisgKiAwIG1lYW5zOiBxdW90ZSBhcyBvY3RhbCBpZiAocXVvdGVfcGF0aF9mdWxseSkKKyAqIC0xIG1lYW5zOiBuZXZlciBxdW90ZQorICogYzogcXVvdGUgYXMgIlxcYyIKKyAqLworI2RlZmluZSBYOCh4KSAgIHgsIHgsIHgsIHgsIHgsIHgsIHgsIHgKKyNkZWZpbmUgWDE2KHgpICBYOCh4KSwgWDgoeCkKK3N0YXRpYyBzaWduZWQgY2hhciBjb25zdCBzcV9sb29rdXBbMjU2XSA9IHsKKwkvKiAgICAgICAgICAgMCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICovCisJLyogMHgwMCAqLyAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICdhJywKKwkvKiAweDA4ICovICdiJywgJ3QnLCAnbicsICd2JywgJ2YnLCAncicsICAgMSwgICAxLAorCS8qIDB4MTAgKi8gWDE2KDEpLAorCS8qIDB4MjAgKi8gIC0xLCAgLTEsICciJywgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisJLyogMHgyOCAqLyBYMTYoLTEpLCBYMTYoLTEpLCBYMTYoLTEpLAorCS8qIDB4NTggKi8gIC0xLCAgLTEsICAtMSwgIC0xLCdcXCcsICAtMSwgIC0xLCAgLTEsCisJLyogMHg2MCAqLyBYMTYoLTEpLCBYOCgtMSksCisJLyogMHg3OCAqLyAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAgMSwKKwkvKiAweDgwICovIC8qIHNldCB0byAwICovCit9OworCitzdGF0aWMgaW5saW5lIGludCBzcV9tdXN0X3F1b3RlKGNoYXIgYykKK3sKKwlyZXR1cm4gc3FfbG9va3VwWyh1bnNpZ25lZCBjaGFyKWNdICsgcXVvdGVfcGF0aF9mdWxseSA+IDA7Cit9CisKKy8qIHJldHVybnMgdGhlIGxvbmdlc3QgcHJlZml4IG5vdCBuZWVkaW5nIGEgcXVvdGUgdXAgdG8gbWF4bGVuIGlmIHBvc2l0aXZlLgorICAgVGhpcyBzdG9wcyBhdCB0aGUgZmlyc3QgXDAgYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyBhIGNoYXJhY3RlciBuZWVkaW5nIGFuCisgICBlc2NhcGUgKi8KK3N0YXRpYyBzaXplX3QgbmV4dF9xdW90ZV9wb3MoY29uc3QgY2hhciAqcywgc3NpemVfdCBtYXhsZW4pCit7CisJc2l6ZV90IGxlbjsKKwlpZiAobWF4bGVuIDwgMCkgeworCQlmb3IgKGxlbiA9IDA7ICFzcV9tdXN0X3F1b3RlKHNbbGVuXSk7IGxlbisrKTsKKwl9IGVsc2UgeworCQlmb3IgKGxlbiA9IDA7IGxlbiA8IG1heGxlbiAmJiAhc3FfbXVzdF9xdW90ZShzW2xlbl0pOyBsZW4rKyk7CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBDLXN0eWxlIG5hbWUgcXVvdGluZy4KKyAqCisgKiAoMSkgaWYgc2IgYW5kIGZwIGFyZSBib3RoIE5VTEwsIGluc3BlY3QgdGhlIGlucHV0IG5hbWUgYW5kIGNvdW50cyB0aGUKKyAqICAgICBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgbmVlZGVkIHRvIGhvbGQgY19zdHlsZSBxdW90ZWQgdmVyc2lvbiBvZiBuYW1lLAorICogICAgIGNvdW50aW5nIHRoZSBkb3VibGUgcXVvdGVzIGFyb3VuZCBpdCBidXQgbm90IHRlcm1pbmF0aW5nIE5VTCwgYW5kCisgKiAgICAgcmV0dXJucyBpdC4KKyAqICAgICBIb3dldmVyLCBpZiBuYW1lIGRvZXMgbm90IG5lZWQgY19zdHlsZSBxdW90aW5nLCBpdCByZXR1cm5zIDAuCisgKgorICogKDIpIGlmIHNiIG9yIGZwIGFyZSBub3QgTlVMTCwgaXQgZW1pdHMgdGhlIGNfc3R5bGUgcXVvdGVkIHZlcnNpb24KKyAqICAgICBvZiBuYW1lLCBlbmNsb3NlZCB3aXRoIGRvdWJsZSBxdW90ZXMgaWYgYXNrZWQgYW5kIG5lZWRlZCBvbmx5LgorICogICAgIFJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBpbiAoMSkuCisgKi8KK3N0YXRpYyBzaXplX3QgcXVvdGVfY19zdHlsZV9jb3VudGVkKGNvbnN0IGNoYXIgKm5hbWUsIHNzaXplX3QgbWF4bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmJ1ZiAqc2IsIEZJTEUgKmZwLCBpbnQgbm9fZHEpCit7CisjdW5kZWYgRU1JVAorI2RlZmluZSBFTUlUKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoc2IpIHN0cmJ1Zl9hZGRjaChzYiwgKGMpKTsgICAgICAgICAgXAorCQlpZiAoZnApIGZwdXRjKChjKSwgZnApOyAgICAgICAgICAgICAgICAgXAorCQljb3VudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEVNSVRCVUYocywgbCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWludCBfX3JldDsJCQkJXAorCQlpZiAoc2IpIHN0cmJ1Zl9hZGQoc2IsIChzKSwgKGwpKTsgICAgICAgXAorCQlpZiAoZnApIF9fcmV0ID0gZndyaXRlKChzKSwgKGwpLCAxLCBmcCk7ICAgICAgICBcCisJCWNvdW50ICs9IChsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSB3aGlsZSAoMCkKKworCXNpemVfdCBsZW4sIGNvdW50ID0gMDsKKwljb25zdCBjaGFyICpwID0gbmFtZTsKKworCWZvciAoOzspIHsKKwkJaW50IGNoOworCisJCWxlbiA9IG5leHRfcXVvdGVfcG9zKHAsIG1heGxlbik7CisJCWlmIChsZW4gPT0gbWF4bGVuIHx8ICFwW2xlbl0pCisJCQlicmVhazsKKworCQlpZiAoIW5vX2RxICYmIHAgPT0gbmFtZSkKKwkJCUVNSVQoJyInKTsKKworCQlFTUlUQlVGKHAsIGxlbik7CisJCUVNSVQoJ1xcJyk7CisJCXAgKz0gbGVuOworCQljaCA9ICh1bnNpZ25lZCBjaGFyKSpwKys7CisJCWlmIChzcV9sb29rdXBbY2hdID49ICcgJykgeworCQkJRU1JVChzcV9sb29rdXBbY2hdKTsKKwkJfSBlbHNlIHsKKwkJCUVNSVQoKChjaCA+PiA2KSAmIDAzKSArICcwJyk7CisJCQlFTUlUKCgoY2ggPj4gMykgJiAwNykgKyAnMCcpOworCQkJRU1JVCgoKGNoID4+IDApICYgMDcpICsgJzAnKTsKKwkJfQorCX0KKworCUVNSVRCVUYocCwgbGVuKTsKKwlpZiAocCA9PSBuYW1lKSAgIC8qIG5vIGVuZGluZyBxdW90ZSBuZWVkZWQgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoIW5vX2RxKQorCQlFTUlUKCciJyk7CisJcmV0dXJuIGNvdW50OworfQorCitzaXplX3QgcXVvdGVfY19zdHlsZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RyYnVmICpzYiwgRklMRSAqZnAsIGludCBub2RxKQoreworCXJldHVybiBxdW90ZV9jX3N0eWxlX2NvdW50ZWQobmFtZSwgLTEsIHNiLCBmcCwgbm9kcSk7Cit9CisKK3ZvaWQgcXVvdGVfdHdvX2Nfc3R5bGUoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqcGF0aCwgaW50IG5vZHEpCit7CisJaWYgKHF1b3RlX2Nfc3R5bGUocHJlZml4LCBOVUxMLCBOVUxMLCAwKSB8fAorCSAgICBxdW90ZV9jX3N0eWxlKHBhdGgsIE5VTEwsIE5VTEwsIDApKSB7CisJCWlmICghbm9kcSkKKwkJCXN0cmJ1Zl9hZGRjaChzYiwgJyInKTsKKwkJcXVvdGVfY19zdHlsZShwcmVmaXgsIHNiLCBOVUxMLCAxKTsKKwkJcXVvdGVfY19zdHlsZShwYXRoLCBzYiwgTlVMTCwgMSk7CisJCWlmICghbm9kcSkKKwkJCXN0cmJ1Zl9hZGRjaChzYiwgJyInKTsKKwl9IGVsc2UgeworCQlzdHJidWZfYWRkc3RyKHNiLCBwcmVmaXgpOworCQlzdHJidWZfYWRkc3RyKHNiLCBwYXRoKTsKKwl9Cit9CisKK3ZvaWQgd3JpdGVfbmFtZV9xdW90ZWQoY29uc3QgY2hhciAqbmFtZSwgRklMRSAqZnAsIGludCB0ZXJtaW5hdG9yKQoreworCWlmICh0ZXJtaW5hdG9yKSB7CisJCXF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgZnAsIDApOworCX0gZWxzZSB7CisJCWZwdXRzKG5hbWUsIGZwKTsKKwl9CisJZnB1dGModGVybWluYXRvciwgZnApOworfQorCitleHRlcm4gdm9pZCB3cml0ZV9uYW1lX3F1b3RlZHBmeChjb25zdCBjaGFyICpwZngsIHNpemVfdCBwZnhsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBGSUxFICpmcCwgaW50IHRlcm1pbmF0b3IpCit7CisJaW50IG5lZWRxdW90ZSA9IDA7CisKKwlpZiAodGVybWluYXRvcikgeworCQluZWVkcXVvdGUgPSBuZXh0X3F1b3RlX3BvcyhwZngsIHBmeGxlbikgPCBwZnhsZW4KKwkJCXx8IG5hbWVbbmV4dF9xdW90ZV9wb3MobmFtZSwgLTEpXTsKKwl9CisJaWYgKG5lZWRxdW90ZSkgeworCQlmcHV0YygnIicsIGZwKTsKKwkJcXVvdGVfY19zdHlsZV9jb3VudGVkKHBmeCwgcGZ4bGVuLCBOVUxMLCBmcCwgMSk7CisJCXF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgZnAsIDEpOworCQlmcHV0YygnIicsIGZwKTsKKwl9IGVsc2UgeworCQlpbnQgcmV0OworCisJCXJldCA9IGZ3cml0ZShwZngsIHBmeGxlbiwgMSwgZnApOworCQlmcHV0cyhuYW1lLCBmcCk7CisJfQorCWZwdXRjKHRlcm1pbmF0b3IsIGZwKTsKK30KKworLyogcXVvdGUgcGF0aCBhcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gcHJlZml4ICovCitjaGFyICpxdW90ZV9wYXRoX3JlbGF0aXZlKGNvbnN0IGNoYXIgKmluLCBpbnQgbGVuLAorCQkJICBzdHJ1Y3Qgc3RyYnVmICpvdXQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgbmVlZHF1b3RlOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IHN0cmxlbihpbik7CisKKwkvKiAiLi4vIiBwcmVmaXggaXRzZWxmIGRvZXMgbm90IG5lZWQgcXVvdGluZywgYnV0ICJpbiIgbWlnaHQuICovCisJbmVlZHF1b3RlID0gbmV4dF9xdW90ZV9wb3MoaW4sIGxlbikgPCBsZW47CisJc3RyYnVmX3NldGxlbihvdXQsIDApOworCXN0cmJ1Zl9ncm93KG91dCwgbGVuKTsKKworCWlmIChuZWVkcXVvdGUpCisJCXN0cmJ1Zl9hZGRjaChvdXQsICciJyk7CisJaWYgKHByZWZpeCkgeworCQlpbnQgb2ZmID0gMDsKKwkJd2hpbGUgKHByZWZpeFtvZmZdICYmIG9mZiA8IGxlbiAmJiBwcmVmaXhbb2ZmXSA9PSBpbltvZmZdKQorCQkJaWYgKHByZWZpeFtvZmZdID09ICcvJykgeworCQkJCXByZWZpeCArPSBvZmYgKyAxOworCQkJCWluICs9IG9mZiArIDE7CisJCQkJbGVuIC09IG9mZiArIDE7CisJCQkJb2ZmID0gMDsKKwkJCX0gZWxzZQorCQkJCW9mZisrOworCisJCWZvciAoOyAqcHJlZml4OyBwcmVmaXgrKykKKwkJCWlmICgqcHJlZml4ID09ICcvJykKKwkJCQlzdHJidWZfYWRkc3RyKG91dCwgIi4uLyIpOworCX0KKworCXF1b3RlX2Nfc3R5bGVfY291bnRlZCAoaW4sIGxlbiwgb3V0LCBOVUxMLCAxKTsKKworCWlmIChuZWVkcXVvdGUpCisJCXN0cmJ1Zl9hZGRjaChvdXQsICciJyk7CisJaWYgKCFvdXQtPmxlbikKKwkJc3RyYnVmX2FkZHN0cihvdXQsICIuLyIpOworCisJcmV0dXJuIG91dC0+YnVmOworfQorCisvKgorICogQy1zdHlsZSBuYW1lIHVucXVvdGluZy4KKyAqCisgKiBRdW90ZWQgc2hvdWxkIHBvaW50IGF0IHRoZSBvcGVuaW5nIGRvdWJsZSBxdW90ZS4KKyAqICsgUmV0dXJucyAwIGlmIGl0IHdhcyBhYmxlIHRvIHVucXVvdGUgdGhlIHN0cmluZyBwcm9wZXJseSwgYW5kIGFwcGVuZHMgdGhlCisgKiAgIHJlc3VsdCBpbiB0aGUgc3RyYnVmIGBzYicuCisgKiArIFJldHVybnMgLTEgaW4gY2FzZSBvZiBlcnJvciwgYW5kIGRvZXNuJ3QgdG91Y2ggdGhlIHN0cmJ1Zi4gVGhvdWdoIG5vdGUKKyAqICAgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGluIHRoZSBzdHJidWYsIHNvIGNhbGxpbmcKKyAqICAgc3RyYnVmX3JlbGVhc2UgaXMgbWFuZGF0b3J5IHdoaWNoZXZlciByZXN1bHQgdW5xdW90ZV9jX3N0eWxlIHJldHVybnMuCisgKgorICogVXBkYXRlcyBlbmRwIHBvaW50ZXIgdG8gcG9pbnQgYXQgb25lIHBhc3QgdGhlIGVuZGluZyBkb3VibGUgcXVvdGUgaWYgZ2l2ZW4uCisgKi8KK2ludCB1bnF1b3RlX2Nfc3R5bGUoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnF1b3RlZCwgY29uc3QgY2hhciAqKmVuZHApCit7CisJc2l6ZV90IG9sZGxlbiA9IHNiLT5sZW4sIGxlbjsKKwlpbnQgY2gsIGFjOworCisJaWYgKCpxdW90ZWQrKyAhPSAnIicpCisJCXJldHVybiAtMTsKKworCWZvciAoOzspIHsKKwkJbGVuID0gc3RyY3NwbihxdW90ZWQsICJcIlxcIik7CisJCXN0cmJ1Zl9hZGQoc2IsIHF1b3RlZCwgbGVuKTsKKwkJcXVvdGVkICs9IGxlbjsKKworCQlzd2l0Y2ggKCpxdW90ZWQrKykgeworCQkgIGNhc2UgJyInOgorCQkJaWYgKGVuZHApCisJCQkJKmVuZHAgPSBxdW90ZWQ7CisJCQlyZXR1cm4gMDsKKwkJICBjYXNlICdcXCc6CisJCQlicmVhazsKKwkJICBkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXN3aXRjaCAoKGNoID0gKnF1b3RlZCsrKSkgeworCQljYXNlICdhJzogY2ggPSAnXGEnOyBicmVhazsKKwkJY2FzZSAnYic6IGNoID0gJ1xiJzsgYnJlYWs7CisJCWNhc2UgJ2YnOiBjaCA9ICdcZic7IGJyZWFrOworCQljYXNlICduJzogY2ggPSAnXG4nOyBicmVhazsKKwkJY2FzZSAncic6IGNoID0gJ1xyJzsgYnJlYWs7CisJCWNhc2UgJ3QnOiBjaCA9ICdcdCc7IGJyZWFrOworCQljYXNlICd2JzogY2ggPSAnXHYnOyBicmVhazsKKworCQljYXNlICdcXCc6IGNhc2UgJyInOgorCQkJYnJlYWs7IC8qIHZlcmJhdGltICovCisKKwkJLyogb2N0YWwgdmFsdWVzIHdpdGggZmlyc3QgZGlnaXQgb3ZlciA0IG92ZXJmbG93ICovCisJCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgorCQkJCQlhYyA9ICgoY2ggLSAnMCcpIDw8IDYpOworCQkJaWYgKChjaCA9ICpxdW90ZWQrKykgPCAnMCcgfHwgJzcnIDwgY2gpCisJCQkJZ290byBlcnJvcjsKKwkJCQkJYWMgfD0gKChjaCAtICcwJykgPDwgMyk7CisJCQlpZiAoKGNoID0gKnF1b3RlZCsrKSA8ICcwJyB8fCAnNycgPCBjaCkKKwkJCQlnb3RvIGVycm9yOworCQkJCQlhYyB8PSAoY2ggLSAnMCcpOworCQkJCQljaCA9IGFjOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJc3RyYnVmX2FkZGNoKHNiLCBjaCk7CisJCX0KKworICBlcnJvcjoKKwlzdHJidWZfc2V0bGVuKHNiLCBvbGRsZW4pOworCXJldHVybiAtMTsKK30KKworLyogcXVvdGluZyBhcyBhIHN0cmluZyBsaXRlcmFsIGZvciBvdGhlciBsYW5ndWFnZXMgKi8KKwordm9pZCBwZXJsX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKQoreworCWNvbnN0IGNoYXIgc3EgPSAnXCcnOworCWNvbnN0IGNoYXIgYnEgPSAnXFwnOworCWNoYXIgYzsKKworCWZwdXRjKHNxLCBzdHJlYW0pOworCXdoaWxlICgoYyA9ICpzcmMrKykpIHsKKwkJaWYgKGMgPT0gc3EgfHwgYyA9PSBicSkKKwkJCWZwdXRjKGJxLCBzdHJlYW0pOworCQlmcHV0YyhjLCBzdHJlYW0pOworCX0KKwlmcHV0YyhzcSwgc3RyZWFtKTsKK30KKwordm9pZCBweXRob25fcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpCit7CisJY29uc3QgY2hhciBzcSA9ICdcJyc7CisJY29uc3QgY2hhciBicSA9ICdcXCc7CisJY29uc3QgY2hhciBubCA9ICdcbic7CisJY2hhciBjOworCisJZnB1dGMoc3EsIHN0cmVhbSk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlpZiAoYyA9PSBubCkgeworCQkJZnB1dGMoYnEsIHN0cmVhbSk7CisJCQlmcHV0YygnbicsIHN0cmVhbSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSBzcSB8fCBjID09IGJxKQorCQkJZnB1dGMoYnEsIHN0cmVhbSk7CisJCWZwdXRjKGMsIHN0cmVhbSk7CisJfQorCWZwdXRjKHNxLCBzdHJlYW0pOworfQorCit2b2lkIHRjbF9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyIGM7CisKKwlmcHV0YygnIicsIHN0cmVhbSk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnWyc6IGNhc2UgJ10nOgorCQljYXNlICd7JzogY2FzZSAnfSc6CisJCWNhc2UgJyQnOiBjYXNlICdcXCc6IGNhc2UgJyInOgorCQkJZnB1dGMoJ1xcJywgc3RyZWFtKTsKKwkJZGVmYXVsdDoKKwkJCWZwdXRjKGMsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXGYnOgorCQkJZnB1dHMoIlxcZiIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXHInOgorCQkJZnB1dHMoIlxcciIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQkJZnB1dHMoIlxcbiIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJZnB1dHMoIlxcdCIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXHYnOgorCQkJZnB1dHMoIlxcdiIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlmcHV0YygnIicsIHN0cmVhbSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcXVvdGUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9xdW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZmFkODkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcXVvdGUuaApAQCAtMCwwICsxLDY4IEBACisjaWZuZGVmIFFVT1RFX0gKKyNkZWZpbmUgUVVPVEVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogSGVscCB0byBjb3B5IHRoZSB0aGluZyBwcm9wZXJseSBxdW90ZWQgZm9yIHRoZSBzaGVsbCBzYWZldHkuCisgKiBhbnkgc2luZ2xlIHF1b3RlIGlzIHJlcGxhY2VkIHdpdGggJ1wnJywgYW55IGV4Y2xhbWF0aW9uIHBvaW50CisgKiBpcyByZXBsYWNlZCB3aXRoICdcIScsIGFuZCB0aGUgd2hvbGUgdGhpbmcgaXMgZW5jbG9zZWQgaW4gYQorICogc2luZ2xlIHF1b3RlIHBhaXIuCisgKgorICogRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IHRvIHN5c3RlbSgpIGFzIGFuCisgKiBhcmd1bWVudDoKKyAqCisgKiBzcHJpbnRmKGNtZCwgImZvb2JhciAlcyAlcyIsIHNxX3F1b3RlKGFyZzApLCBzcV9xdW90ZShhcmcxKSkKKyAqCisgKiB3b3VsZCBiZSBhcHByb3ByaWF0ZS4gIElmIHRoZSBzeXN0ZW0oKSBpcyBnb2luZyB0byBjYWxsIHNzaCB0bworICogcnVuIHRoZSBjb21tYW5kIG9uIHRoZSBvdGhlciBzaWRlOgorICoKKyAqIHNwcmludGYoY21kLCAiZ2l0LWRpZmYtdHJlZSAlcyAlcyIsIHNxX3F1b3RlKGFyZzApLCBzcV9xdW90ZShhcmcxKSk7CisgKiBzcHJpbnRmKHJjbWQsICJzc2ggJXMgJXMiLCBzcV91dGlsL3F1b3RlLmhvc3QpLCBzcV9xdW90ZShjbWQpKTsKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGFib3ZlIGV4YW1wbGVzIGxlYWsgbWVtb3J5ISAgUmVtZW1iZXIgdG8gZnJlZSByZXN1bHQgZnJvbQorICogc3FfcXVvdGUoKSBpbiBhIHJlYWwgYXBwbGljYXRpb24uCisgKgorICogc3FfcXVvdGVfYnVmKCkgd3JpdGVzIHRvIGFuIGV4aXN0aW5nIGJ1ZmZlciBvZiBzcGVjaWZpZWQgc2l6ZTsgaXQKKyAqIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuCisgKiBleGNsdWRpbmcgdGhlIGZpbmFsIG51bGwgcmVnYXJkbGVzcyBvZiB0aGUgYnVmZmVyIHNpemUuCisgKi8KKworZXh0ZXJuIHZvaWQgc3FfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpOworCitleHRlcm4gdm9pZCBzcV9xdW90ZV9idWYoc3RydWN0IHN0cmJ1ZiAqLCBjb25zdCBjaGFyICpzcmMpOworZXh0ZXJuIHZvaWQgc3FfcXVvdGVfYXJndihzdHJ1Y3Qgc3RyYnVmICosIGNvbnN0IGNoYXIgKiphcmd2LCBzaXplX3QgbWF4bGVuKTsKKworLyogVGhpcyB1bndyYXBzIHdoYXQgc3FfcXVvdGUoKSBwcm9kdWNlcyBpbiBwbGFjZSwgYnV0IHJldHVybnMKKyAqIE5VTEwgaWYgdGhlIGlucHV0IGRvZXMgbm90IGxvb2sgbGlrZSB3aGF0IHNxX3F1b3RlIHdvdWxkIGhhdmUKKyAqIHByb2R1Y2VkLgorICovCitleHRlcm4gY2hhciAqc3FfZGVxdW90ZShjaGFyICopOworCisvKgorICogU2FtZSBhcyB0aGUgYWJvdmUsIGJ1dCBjYW4gYmUgdXNlZCB0byB1bndyYXAgbWFueSBhcmd1bWVudHMgaW4gdGhlCisgKiBzYW1lIHN0cmluZyBzZXBhcmF0ZWQgYnkgc3BhY2UuICJuZXh0IiBpcyBjaGFuZ2VkIHRvIHBvaW50IHRvIHRoZQorICogbmV4dCBhcmd1bWVudCB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYXMgZmlyc3QgcGFyYW1ldGVyLiBXaGVuIHRoZXJlCisgKiBpcyBubyBtb3JlIGFyZ3VtZW50IHRvIGJlIGRlcXVvdGVkLCAibmV4dCIgaXMgdXBkYXRlZCB0byBwb2ludCB0byBOVUxMLgorICovCitleHRlcm4gY2hhciAqc3FfZGVxdW90ZV9zdGVwKGNoYXIgKmFyZywgY2hhciAqKm5leHQpOworZXh0ZXJuIGludCBzcV9kZXF1b3RlX3RvX2FyZ3YoY2hhciAqYXJnLCBjb25zdCBjaGFyICoqKmFyZ3YsIGludCAqbnIsIGludCAqYWxsb2MpOworCitleHRlcm4gaW50IHVucXVvdGVfY19zdHlsZShzdHJ1Y3Qgc3RyYnVmICosIGNvbnN0IGNoYXIgKnF1b3RlZCwgY29uc3QgY2hhciAqKmVuZHApOworZXh0ZXJuIHNpemVfdCBxdW90ZV9jX3N0eWxlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzdHJidWYgKiwgRklMRSAqLCBpbnQgbm9fZHEpOworZXh0ZXJuIHZvaWQgcXVvdGVfdHdvX2Nfc3R5bGUoc3RydWN0IHN0cmJ1ZiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfbmFtZV9xdW90ZWQoY29uc3QgY2hhciAqbmFtZSwgRklMRSAqLCBpbnQgdGVybWluYXRvcik7CitleHRlcm4gdm9pZCB3cml0ZV9uYW1lX3F1b3RlZHBmeChjb25zdCBjaGFyICpwZngsIHNpemVfdCBwZnhsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBGSUxFICosIGludCB0ZXJtaW5hdG9yKTsKKworLyogcXVvdGUgcGF0aCBhcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gcHJlZml4ICovCitjaGFyICpxdW90ZV9wYXRoX3JlbGF0aXZlKGNvbnN0IGNoYXIgKmluLCBpbnQgbGVuLAorCQkJICBzdHJ1Y3Qgc3RyYnVmICpvdXQsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKKy8qIHF1b3RpbmcgYXMgYSBzdHJpbmcgbGl0ZXJhbCBmb3Igb3RoZXIgbGFuZ3VhZ2VzICovCitleHRlcm4gdm9pZCBwZXJsX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKTsKK2V4dGVybiB2b2lkIHB5dGhvbl9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYyk7CitleHRlcm4gdm9pZCB0Y2xfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9yYnRyZWUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9yYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTViYTljCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3JidHJlZS5jCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICBSZWQgQmxhY2sgVHJlZXMKKyAgKEMpIDE5OTkgIEFuZHJlYSBBcmNhbmdlbGkgPGFuZHJlYUBzdXNlLmRlPgorICAoQykgMjAwMiAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICBsaW51eC9saWIvcmJ0cmVlLmMKKyovCisKKyNpbmNsdWRlICJyYnRyZWUuaCIKKworc3RhdGljIHZvaWQgX19yYl9yb3RhdGVfbGVmdChzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKnJpZ2h0ID0gbm9kZS0+cmJfcmlnaHQ7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IHJiX3BhcmVudChub2RlKTsKKworCWlmICgobm9kZS0+cmJfcmlnaHQgPSByaWdodC0+cmJfbGVmdCkpCisJCXJiX3NldF9wYXJlbnQocmlnaHQtPnJiX2xlZnQsIG5vZGUpOworCXJpZ2h0LT5yYl9sZWZ0ID0gbm9kZTsKKworCXJiX3NldF9wYXJlbnQocmlnaHQsIHBhcmVudCk7CisKKwlpZiAocGFyZW50KQorCXsKKwkJaWYgKG5vZGUgPT0gcGFyZW50LT5yYl9sZWZ0KQorCQkJcGFyZW50LT5yYl9sZWZ0ID0gcmlnaHQ7CisJCWVsc2UKKwkJCXBhcmVudC0+cmJfcmlnaHQgPSByaWdodDsKKwl9CisJZWxzZQorCQlyb290LT5yYl9ub2RlID0gcmlnaHQ7CisJcmJfc2V0X3BhcmVudChub2RlLCByaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmJfcm90YXRlX3JpZ2h0KHN0cnVjdCByYl9ub2RlICpub2RlLCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbGVmdCA9IG5vZGUtPnJiX2xlZnQ7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IHJiX3BhcmVudChub2RlKTsKKworCWlmICgobm9kZS0+cmJfbGVmdCA9IGxlZnQtPnJiX3JpZ2h0KSkKKwkJcmJfc2V0X3BhcmVudChsZWZ0LT5yYl9yaWdodCwgbm9kZSk7CisJbGVmdC0+cmJfcmlnaHQgPSBub2RlOworCisJcmJfc2V0X3BhcmVudChsZWZ0LCBwYXJlbnQpOworCisJaWYgKHBhcmVudCkKKwl7CisJCWlmIChub2RlID09IHBhcmVudC0+cmJfcmlnaHQpCisJCQlwYXJlbnQtPnJiX3JpZ2h0ID0gbGVmdDsKKwkJZWxzZQorCQkJcGFyZW50LT5yYl9sZWZ0ID0gbGVmdDsKKwl9CisJZWxzZQorCQlyb290LT5yYl9ub2RlID0gbGVmdDsKKwlyYl9zZXRfcGFyZW50KG5vZGUsIGxlZnQpOworfQorCit2b2lkIHJiX2luc2VydF9jb2xvcihzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKmdwYXJlbnQ7CisKKwl3aGlsZSAoKHBhcmVudCA9IHJiX3BhcmVudChub2RlKSkgJiYgcmJfaXNfcmVkKHBhcmVudCkpCisJeworCQlncGFyZW50ID0gcmJfcGFyZW50KHBhcmVudCk7CisKKwkJaWYgKHBhcmVudCA9PSBncGFyZW50LT5yYl9sZWZ0KQorCQl7CisJCQl7CisJCQkJcmVnaXN0ZXIgc3RydWN0IHJiX25vZGUgKnVuY2xlID0gZ3BhcmVudC0+cmJfcmlnaHQ7CisJCQkJaWYgKHVuY2xlICYmIHJiX2lzX3JlZCh1bmNsZSkpCisJCQkJeworCQkJCQlyYl9zZXRfYmxhY2sodW5jbGUpOworCQkJCQlyYl9zZXRfYmxhY2socGFyZW50KTsKKwkJCQkJcmJfc2V0X3JlZChncGFyZW50KTsKKwkJCQkJbm9kZSA9IGdwYXJlbnQ7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcmVudC0+cmJfcmlnaHQgPT0gbm9kZSkKKwkJCXsKKwkJCQlyZWdpc3RlciBzdHJ1Y3QgcmJfbm9kZSAqdG1wOworCQkJCV9fcmJfcm90YXRlX2xlZnQocGFyZW50LCByb290KTsKKwkJCQl0bXAgPSBwYXJlbnQ7CisJCQkJcGFyZW50ID0gbm9kZTsKKwkJCQlub2RlID0gdG1wOworCQkJfQorCisJCQlyYl9zZXRfYmxhY2socGFyZW50KTsKKwkJCXJiX3NldF9yZWQoZ3BhcmVudCk7CisJCQlfX3JiX3JvdGF0ZV9yaWdodChncGFyZW50LCByb290KTsKKwkJfSBlbHNlIHsKKwkJCXsKKwkJCQlyZWdpc3RlciBzdHJ1Y3QgcmJfbm9kZSAqdW5jbGUgPSBncGFyZW50LT5yYl9sZWZ0OworCQkJCWlmICh1bmNsZSAmJiByYl9pc19yZWQodW5jbGUpKQorCQkJCXsKKwkJCQkJcmJfc2V0X2JsYWNrKHVuY2xlKTsKKwkJCQkJcmJfc2V0X2JsYWNrKHBhcmVudCk7CisJCQkJCXJiX3NldF9yZWQoZ3BhcmVudCk7CisJCQkJCW5vZGUgPSBncGFyZW50OworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwYXJlbnQtPnJiX2xlZnQgPT0gbm9kZSkKKwkJCXsKKwkJCQlyZWdpc3RlciBzdHJ1Y3QgcmJfbm9kZSAqdG1wOworCQkJCV9fcmJfcm90YXRlX3JpZ2h0KHBhcmVudCwgcm9vdCk7CisJCQkJdG1wID0gcGFyZW50OworCQkJCXBhcmVudCA9IG5vZGU7CisJCQkJbm9kZSA9IHRtcDsKKwkJCX0KKworCQkJcmJfc2V0X2JsYWNrKHBhcmVudCk7CisJCQlyYl9zZXRfcmVkKGdwYXJlbnQpOworCQkJX19yYl9yb3RhdGVfbGVmdChncGFyZW50LCByb290KTsKKwkJfQorCX0KKworCXJiX3NldF9ibGFjayhyb290LT5yYl9ub2RlKTsKK30KKworc3RhdGljIHZvaWQgX19yYl9lcmFzZV9jb2xvcihzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX25vZGUgKnBhcmVudCwKKwkJCSAgICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKm90aGVyOworCisJd2hpbGUgKCghbm9kZSB8fCByYl9pc19ibGFjayhub2RlKSkgJiYgbm9kZSAhPSByb290LT5yYl9ub2RlKQorCXsKKwkJaWYgKHBhcmVudC0+cmJfbGVmdCA9PSBub2RlKQorCQl7CisJCQlvdGhlciA9IHBhcmVudC0+cmJfcmlnaHQ7CisJCQlpZiAocmJfaXNfcmVkKG90aGVyKSkKKwkJCXsKKwkJCQlyYl9zZXRfYmxhY2sob3RoZXIpOworCQkJCXJiX3NldF9yZWQocGFyZW50KTsKKwkJCQlfX3JiX3JvdGF0ZV9sZWZ0KHBhcmVudCwgcm9vdCk7CisJCQkJb3RoZXIgPSBwYXJlbnQtPnJiX3JpZ2h0OworCQkJfQorCQkJaWYgKCghb3RoZXItPnJiX2xlZnQgfHwgcmJfaXNfYmxhY2sob3RoZXItPnJiX2xlZnQpKSAmJgorCQkJICAgICghb3RoZXItPnJiX3JpZ2h0IHx8IHJiX2lzX2JsYWNrKG90aGVyLT5yYl9yaWdodCkpKQorCQkJeworCQkJCXJiX3NldF9yZWQob3RoZXIpOworCQkJCW5vZGUgPSBwYXJlbnQ7CisJCQkJcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICghb3RoZXItPnJiX3JpZ2h0IHx8IHJiX2lzX2JsYWNrKG90aGVyLT5yYl9yaWdodCkpCisJCQkJeworCQkJCQlyYl9zZXRfYmxhY2sob3RoZXItPnJiX2xlZnQpOworCQkJCQlyYl9zZXRfcmVkKG90aGVyKTsKKwkJCQkJX19yYl9yb3RhdGVfcmlnaHQob3RoZXIsIHJvb3QpOworCQkJCQlvdGhlciA9IHBhcmVudC0+cmJfcmlnaHQ7CisJCQkJfQorCQkJCXJiX3NldF9jb2xvcihvdGhlciwgcmJfY29sb3IocGFyZW50KSk7CisJCQkJcmJfc2V0X2JsYWNrKHBhcmVudCk7CisJCQkJcmJfc2V0X2JsYWNrKG90aGVyLT5yYl9yaWdodCk7CisJCQkJX19yYl9yb3RhdGVfbGVmdChwYXJlbnQsIHJvb3QpOworCQkJCW5vZGUgPSByb290LT5yYl9ub2RlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJb3RoZXIgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCQlpZiAocmJfaXNfcmVkKG90aGVyKSkKKwkJCXsKKwkJCQlyYl9zZXRfYmxhY2sob3RoZXIpOworCQkJCXJiX3NldF9yZWQocGFyZW50KTsKKwkJCQlfX3JiX3JvdGF0ZV9yaWdodChwYXJlbnQsIHJvb3QpOworCQkJCW90aGVyID0gcGFyZW50LT5yYl9sZWZ0OworCQkJfQorCQkJaWYgKCghb3RoZXItPnJiX2xlZnQgfHwgcmJfaXNfYmxhY2sob3RoZXItPnJiX2xlZnQpKSAmJgorCQkJICAgICghb3RoZXItPnJiX3JpZ2h0IHx8IHJiX2lzX2JsYWNrKG90aGVyLT5yYl9yaWdodCkpKQorCQkJeworCQkJCXJiX3NldF9yZWQob3RoZXIpOworCQkJCW5vZGUgPSBwYXJlbnQ7CisJCQkJcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICghb3RoZXItPnJiX2xlZnQgfHwgcmJfaXNfYmxhY2sob3RoZXItPnJiX2xlZnQpKQorCQkJCXsKKwkJCQkJcmJfc2V0X2JsYWNrKG90aGVyLT5yYl9yaWdodCk7CisJCQkJCXJiX3NldF9yZWQob3RoZXIpOworCQkJCQlfX3JiX3JvdGF0ZV9sZWZ0KG90aGVyLCByb290KTsKKwkJCQkJb3RoZXIgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCQkJfQorCQkJCXJiX3NldF9jb2xvcihvdGhlciwgcmJfY29sb3IocGFyZW50KSk7CisJCQkJcmJfc2V0X2JsYWNrKHBhcmVudCk7CisJCQkJcmJfc2V0X2JsYWNrKG90aGVyLT5yYl9sZWZ0KTsKKwkJCQlfX3JiX3JvdGF0ZV9yaWdodChwYXJlbnQsIHJvb3QpOworCQkJCW5vZGUgPSByb290LT5yYl9ub2RlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChub2RlKQorCQlyYl9zZXRfYmxhY2sobm9kZSk7Cit9CisKK3ZvaWQgcmJfZXJhc2Uoc3RydWN0IHJiX25vZGUgKm5vZGUsIHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICpjaGlsZCwgKnBhcmVudDsKKwlpbnQgY29sb3I7CisKKwlpZiAoIW5vZGUtPnJiX2xlZnQpCisJCWNoaWxkID0gbm9kZS0+cmJfcmlnaHQ7CisJZWxzZSBpZiAoIW5vZGUtPnJiX3JpZ2h0KQorCQljaGlsZCA9IG5vZGUtPnJiX2xlZnQ7CisJZWxzZQorCXsKKwkJc3RydWN0IHJiX25vZGUgKm9sZCA9IG5vZGUsICpsZWZ0OworCisJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKKwkJd2hpbGUgKChsZWZ0ID0gbm9kZS0+cmJfbGVmdCkgIT0gTlVMTCkKKwkJCW5vZGUgPSBsZWZ0OworCQljaGlsZCA9IG5vZGUtPnJiX3JpZ2h0OworCQlwYXJlbnQgPSByYl9wYXJlbnQobm9kZSk7CisJCWNvbG9yID0gcmJfY29sb3Iobm9kZSk7CisKKwkJaWYgKGNoaWxkKQorCQkJcmJfc2V0X3BhcmVudChjaGlsZCwgcGFyZW50KTsKKwkJaWYgKHBhcmVudCA9PSBvbGQpIHsKKwkJCXBhcmVudC0+cmJfcmlnaHQgPSBjaGlsZDsKKwkJCXBhcmVudCA9IG5vZGU7CisJCX0gZWxzZQorCQkJcGFyZW50LT5yYl9sZWZ0ID0gY2hpbGQ7CisKKwkJbm9kZS0+cmJfcGFyZW50X2NvbG9yID0gb2xkLT5yYl9wYXJlbnRfY29sb3I7CisJCW5vZGUtPnJiX3JpZ2h0ID0gb2xkLT5yYl9yaWdodDsKKwkJbm9kZS0+cmJfbGVmdCA9IG9sZC0+cmJfbGVmdDsKKworCQlpZiAocmJfcGFyZW50KG9sZCkpCisJCXsKKwkJCWlmIChyYl9wYXJlbnQob2xkKS0+cmJfbGVmdCA9PSBvbGQpCisJCQkJcmJfcGFyZW50KG9sZCktPnJiX2xlZnQgPSBub2RlOworCQkJZWxzZQorCQkJCXJiX3BhcmVudChvbGQpLT5yYl9yaWdodCA9IG5vZGU7CisJCX0gZWxzZQorCQkJcm9vdC0+cmJfbm9kZSA9IG5vZGU7CisKKwkJcmJfc2V0X3BhcmVudChvbGQtPnJiX2xlZnQsIG5vZGUpOworCQlpZiAob2xkLT5yYl9yaWdodCkKKwkJCXJiX3NldF9wYXJlbnQob2xkLT5yYl9yaWdodCwgbm9kZSk7CisJCWdvdG8gY29sb3I7CisJfQorCisJcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworCWNvbG9yID0gcmJfY29sb3Iobm9kZSk7CisKKwlpZiAoY2hpbGQpCisJCXJiX3NldF9wYXJlbnQoY2hpbGQsIHBhcmVudCk7CisJaWYgKHBhcmVudCkKKwl7CisJCWlmIChwYXJlbnQtPnJiX2xlZnQgPT0gbm9kZSkKKwkJCXBhcmVudC0+cmJfbGVmdCA9IGNoaWxkOworCQllbHNlCisJCQlwYXJlbnQtPnJiX3JpZ2h0ID0gY2hpbGQ7CisJfQorCWVsc2UKKwkJcm9vdC0+cmJfbm9kZSA9IGNoaWxkOworCisgY29sb3I6CisJaWYgKGNvbG9yID09IFJCX0JMQUNLKQorCQlfX3JiX2VyYXNlX2NvbG9yKGNoaWxkLCBwYXJlbnQsIHJvb3QpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIChpbiBzb3J0IG9yZGVyKSBvZiB0aGUgdHJlZS4KKyAqLworc3RydWN0IHJiX25vZGUgKnJiX2ZpcnN0KGNvbnN0IHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlCSpuOworCisJbiA9IHJvb3QtPnJiX25vZGU7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAobi0+cmJfbGVmdCkKKwkJbiA9IG4tPnJiX2xlZnQ7CisJcmV0dXJuIG47Cit9CisKK3N0cnVjdCByYl9ub2RlICpyYl9sYXN0KGNvbnN0IHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlCSpuOworCisJbiA9IHJvb3QtPnJiX25vZGU7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAobi0+cmJfcmlnaHQpCisJCW4gPSBuLT5yYl9yaWdodDsKKwlyZXR1cm4gbjsKK30KKworc3RydWN0IHJiX25vZGUgKnJiX25leHQoY29uc3Qgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudDsKKworCWlmIChyYl9wYXJlbnQobm9kZSkgPT0gbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBJZiB3ZSBoYXZlIGEgcmlnaHQtaGFuZCBjaGlsZCwgZ28gZG93biBhbmQgdGhlbiBsZWZ0IGFzIGZhcgorCSAgIGFzIHdlIGNhbi4gKi8KKwlpZiAobm9kZS0+cmJfcmlnaHQpIHsKKwkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OyAKKwkJd2hpbGUgKG5vZGUtPnJiX2xlZnQpCisJCQlub2RlPW5vZGUtPnJiX2xlZnQ7CisJCXJldHVybiAoc3RydWN0IHJiX25vZGUgKilub2RlOworCX0KKworCS8qIE5vIHJpZ2h0LWhhbmQgY2hpbGRyZW4uICBFdmVyeXRoaW5nIGRvd24gYW5kIGxlZnQgaXMKKwkgICBzbWFsbGVyIHRoYW4gdXMsIHNvIGFueSAnbmV4dCcgbm9kZSBtdXN0IGJlIGluIHRoZSBnZW5lcmFsCisJICAgZGlyZWN0aW9uIG9mIG91ciBwYXJlbnQuIEdvIHVwIHRoZSB0cmVlOyBhbnkgdGltZSB0aGUKKwkgICBhbmNlc3RvciBpcyBhIHJpZ2h0LWhhbmQgY2hpbGQgb2YgaXRzIHBhcmVudCwga2VlcCBnb2luZworCSAgIHVwLiBGaXJzdCB0aW1lIGl0J3MgYSBsZWZ0LWhhbmQgY2hpbGQgb2YgaXRzIHBhcmVudCwgc2FpZAorCSAgIHBhcmVudCBpcyBvdXIgJ25leHQnIG5vZGUuICovCisJd2hpbGUgKChwYXJlbnQgPSByYl9wYXJlbnQobm9kZSkpICYmIG5vZGUgPT0gcGFyZW50LT5yYl9yaWdodCkKKwkJbm9kZSA9IHBhcmVudDsKKworCXJldHVybiBwYXJlbnQ7Cit9CisKK3N0cnVjdCByYl9ub2RlICpyYl9wcmV2KGNvbnN0IHN0cnVjdCByYl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQ7CisKKwlpZiAocmJfcGFyZW50KG5vZGUpID09IG5vZGUpCisJCXJldHVybiBOVUxMOworCisJLyogSWYgd2UgaGF2ZSBhIGxlZnQtaGFuZCBjaGlsZCwgZ28gZG93biBhbmQgdGhlbiByaWdodCBhcyBmYXIKKwkgICBhcyB3ZSBjYW4uICovCisJaWYgKG5vZGUtPnJiX2xlZnQpIHsKKwkJbm9kZSA9IG5vZGUtPnJiX2xlZnQ7IAorCQl3aGlsZSAobm9kZS0+cmJfcmlnaHQpCisJCQlub2RlPW5vZGUtPnJiX3JpZ2h0OworCQlyZXR1cm4gKHN0cnVjdCByYl9ub2RlICopbm9kZTsKKwl9CisKKwkvKiBObyBsZWZ0LWhhbmQgY2hpbGRyZW4uIEdvIHVwIHRpbGwgd2UgZmluZCBhbiBhbmNlc3RvciB3aGljaAorCSAgIGlzIGEgcmlnaHQtaGFuZCBjaGlsZCBvZiBpdHMgcGFyZW50ICovCisJd2hpbGUgKChwYXJlbnQgPSByYl9wYXJlbnQobm9kZSkpICYmIG5vZGUgPT0gcGFyZW50LT5yYl9sZWZ0KQorCQlub2RlID0gcGFyZW50OworCisJcmV0dXJuIHBhcmVudDsKK30KKwordm9pZCByYl9yZXBsYWNlX25vZGUoc3RydWN0IHJiX25vZGUgKnZpY3RpbSwgc3RydWN0IHJiX25vZGUgKm5ldywKKwkJICAgICBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gcmJfcGFyZW50KHZpY3RpbSk7CisKKwkvKiBTZXQgdGhlIHN1cnJvdW5kaW5nIG5vZGVzIHRvIHBvaW50IHRvIHRoZSByZXBsYWNlbWVudCAqLworCWlmIChwYXJlbnQpIHsKKwkJaWYgKHZpY3RpbSA9PSBwYXJlbnQtPnJiX2xlZnQpCisJCQlwYXJlbnQtPnJiX2xlZnQgPSBuZXc7CisJCWVsc2UKKwkJCXBhcmVudC0+cmJfcmlnaHQgPSBuZXc7CisJfSBlbHNlIHsKKwkJcm9vdC0+cmJfbm9kZSA9IG5ldzsKKwl9CisJaWYgKHZpY3RpbS0+cmJfbGVmdCkKKwkJcmJfc2V0X3BhcmVudCh2aWN0aW0tPnJiX2xlZnQsIG5ldyk7CisJaWYgKHZpY3RpbS0+cmJfcmlnaHQpCisJCXJiX3NldF9wYXJlbnQodmljdGltLT5yYl9yaWdodCwgbmV3KTsKKworCS8qIENvcHkgdGhlIHBvaW50ZXJzL2NvbG91ciBmcm9tIHRoZSB2aWN0aW0gdG8gdGhlIHJlcGxhY2VtZW50ICovCisJKm5ldyA9ICp2aWN0aW07Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcmJ0cmVlLmggYi90b29scy9wZXJmL3V0aWwvcmJ0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkYzQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9yYnRyZWUuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAgUmVkIEJsYWNrIFRyZWVzCisgIChDKSAxOTk5ICBBbmRyZWEgQXJjYW5nZWxpIDxhbmRyZWFAc3VzZS5kZT4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgbGludXgvaW5jbHVkZS9saW51eC9yYnRyZWUuaAorCisgIFRvIHVzZSByYnRyZWVzIHlvdSdsbCBoYXZlIHRvIGltcGxlbWVudCB5b3VyIG93biBpbnNlcnQgYW5kIHNlYXJjaCBjb3Jlcy4KKyAgVGhpcyB3aWxsIGF2b2lkIHVzIHRvIHVzZSBjYWxsYmFja3MgYW5kIHRvIGRyb3AgZHJhbW1hdGljYWxseSBwZXJmb3JtYW5jZXMuCisgIEkga25vdyBpdCdzIG5vdCB0aGUgY2xlYW5lciB3YXksICBidXQgaW4gQyAobm90IGluIEMrKykgdG8gZ2V0CisgIHBlcmZvcm1hbmNlcyBhbmQgZ2VuZXJpY2l0eS4uLgorCisgIFNvbWUgZXhhbXBsZSBvZiBpbnNlcnQgYW5kIHNlYXJjaCBmb2xsb3dzIGhlcmUuIFRoZSBzZWFyY2ggaXMgYSBwbGFpbgorICBub3JtYWwgc2VhcmNoIG92ZXIgYW4gb3JkZXJlZCB0cmVlLiBUaGUgaW5zZXJ0IGluc3RlYWQgbXVzdCBiZSBpbXBsZW1lbnRlZAorICBpbnQgdHdvIHN0ZXBzOiBhcyBmaXJzdCB0aGluZyB0aGUgY29kZSBtdXN0IGluc2VydCB0aGUgZWxlbWVudCBpbgorICBvcmRlciBhcyBhIHJlZCBsZWFmIGluIHRoZSB0cmVlLCB0aGVuIHRoZSBzdXBwb3J0IGxpYnJhcnkgZnVuY3Rpb24KKyAgcmJfaW5zZXJ0X2NvbG9yKCkgbXVzdCBiZSBjYWxsZWQuIFN1Y2ggZnVuY3Rpb24gd2lsbCBkbyB0aGUKKyAgbm90IHRyaXZpYWwgd29yayB0byByZWJhbGFuY2UgdGhlIHJidHJlZSBpZiBuZWNlc3NhcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICogcmJfc2VhcmNoX3BhZ2VfY2FjaGUoc3RydWN0IGlub2RlICogaW5vZGUsCisJCQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJc3RydWN0IHJiX25vZGUgKiBuID0gaW5vZGUtPmlfcmJfcGFnZV9jYWNoZS5yYl9ub2RlOworCXN0cnVjdCBwYWdlICogcGFnZTsKKworCXdoaWxlIChuKQorCXsKKwkJcGFnZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBwYWdlLCByYl9wYWdlX2NhY2hlKTsKKworCQlpZiAob2Zmc2V0IDwgcGFnZS0+b2Zmc2V0KQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG9mZnNldCA+IHBhZ2UtPm9mZnNldCkKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIHBhZ2U7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICogX19yYl9pbnNlcnRfcGFnZV9jYWNoZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCQkJICAgc3RydWN0IHJiX25vZGUgKiBub2RlKQoreworCXN0cnVjdCByYl9ub2RlICoqIHAgPSAmaW5vZGUtPmlfcmJfcGFnZV9jYWNoZS5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICogcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CisKKwl3aGlsZSAoKnApCisJeworCQlwYXJlbnQgPSAqcDsKKwkJcGFnZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHBhZ2UsIHJiX3BhZ2VfY2FjaGUpOworCisJCWlmIChvZmZzZXQgPCBwYWdlLT5vZmZzZXQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG9mZnNldCA+IHBhZ2UtPm9mZnNldCkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBwYWdlOworCX0KKworCXJiX2xpbmtfbm9kZShub2RlLCBwYXJlbnQsIHApOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKiByYl9pbnNlcnRfcGFnZV9jYWNoZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkJCSBzdHJ1Y3QgcmJfbm9kZSAqIG5vZGUpCit7CisJc3RydWN0IHBhZ2UgKiByZXQ7CisJaWYgKChyZXQgPSBfX3JiX2luc2VydF9wYWdlX2NhY2hlKGlub2RlLCBvZmZzZXQsIG5vZGUpKSkKKwkJZ290byBvdXQ7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsICZpbm9kZS0+aV9yYl9wYWdlX2NhY2hlKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9MSU5VWF9SQlRSRUVfSAorI2RlZmluZQlfTElOVVhfUkJUUkVFX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKioKKyAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQorICogQHB0cjoJdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKi8KKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJCVwKKwljb25zdCB0eXBlb2YoICgodHlwZSAqKTApLT5tZW1iZXIgKSAqX19tcHRyID0gKHB0cik7CVwKKwkodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQorCitzdHJ1Y3QgcmJfbm9kZQoreworCXVuc2lnbmVkIGxvbmcgIHJiX3BhcmVudF9jb2xvcjsKKyNkZWZpbmUJUkJfUkVECQkwCisjZGVmaW5lCVJCX0JMQUNLCTEKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJfcmlnaHQ7CisJc3RydWN0IHJiX25vZGUgKnJiX2xlZnQ7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGxvbmcpKSkpOworICAgIC8qIFRoZSBhbGlnbm1lbnQgbWlnaHQgc2VlbSBwb2ludGxlc3MsIGJ1dCBhbGxlZ2VkbHkgQ1JJUyBuZWVkcyBpdCAqLworCitzdHJ1Y3QgcmJfcm9vdAoreworCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOworfTsKKworCisjZGVmaW5lIHJiX3BhcmVudChyKSAgICgoc3RydWN0IHJiX25vZGUgKikoKHIpLT5yYl9wYXJlbnRfY29sb3IgJiB+MykpCisjZGVmaW5lIHJiX2NvbG9yKHIpICAgKChyKS0+cmJfcGFyZW50X2NvbG9yICYgMSkKKyNkZWZpbmUgcmJfaXNfcmVkKHIpICAgKCFyYl9jb2xvcihyKSkKKyNkZWZpbmUgcmJfaXNfYmxhY2socikgcmJfY29sb3IocikKKyNkZWZpbmUgcmJfc2V0X3JlZChyKSAgZG8geyAociktPnJiX3BhcmVudF9jb2xvciAmPSB+MTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcmJfc2V0X2JsYWNrKHIpICBkbyB7IChyKS0+cmJfcGFyZW50X2NvbG9yIHw9IDE7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYl9zZXRfcGFyZW50KHN0cnVjdCByYl9ub2RlICpyYiwgc3RydWN0IHJiX25vZGUgKnApCit7CisJcmItPnJiX3BhcmVudF9jb2xvciA9IChyYi0+cmJfcGFyZW50X2NvbG9yICYgMykgfCAodW5zaWduZWQgbG9uZylwOworfQorc3RhdGljIGlubGluZSB2b2lkIHJiX3NldF9jb2xvcihzdHJ1Y3QgcmJfbm9kZSAqcmIsIGludCBjb2xvcikKK3sKKwlyYi0+cmJfcGFyZW50X2NvbG9yID0gKHJiLT5yYl9wYXJlbnRfY29sb3IgJiB+MSkgfCBjb2xvcjsKK30KKworI2RlZmluZSBSQl9ST09UCShzdHJ1Y3QgcmJfcm9vdCkgeyBOVUxMLCB9CisjZGVmaW5lCXJiX2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpCisKKyNkZWZpbmUgUkJfRU1QVFlfUk9PVChyb290KQkoKHJvb3QpLT5yYl9ub2RlID09IE5VTEwpCisjZGVmaW5lIFJCX0VNUFRZX05PREUobm9kZSkJKHJiX3BhcmVudChub2RlKSA9PSBub2RlKQorI2RlZmluZSBSQl9DTEVBUl9OT0RFKG5vZGUpCShyYl9zZXRfcGFyZW50KG5vZGUsIG5vZGUpKQorCitleHRlcm4gdm9pZCByYl9pbnNlcnRfY29sb3Ioc3RydWN0IHJiX25vZGUgKiwgc3RydWN0IHJiX3Jvb3QgKik7CitleHRlcm4gdm9pZCByYl9lcmFzZShzdHJ1Y3QgcmJfbm9kZSAqLCBzdHJ1Y3QgcmJfcm9vdCAqKTsKKworLyogRmluZCBsb2dpY2FsIG5leHQgYW5kIHByZXZpb3VzIG5vZGVzIGluIGEgdHJlZSAqLworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9uZXh0KGNvbnN0IHN0cnVjdCByYl9ub2RlICopOworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9wcmV2KGNvbnN0IHN0cnVjdCByYl9ub2RlICopOworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9maXJzdChjb25zdCBzdHJ1Y3QgcmJfcm9vdCAqKTsKK2V4dGVybiBzdHJ1Y3QgcmJfbm9kZSAqcmJfbGFzdChjb25zdCBzdHJ1Y3QgcmJfcm9vdCAqKTsKKworLyogRmFzdCByZXBsYWNlbWVudCBvZiBhIHNpbmdsZSBub2RlIHdpdGhvdXQgcmVtb3ZlL3JlYmFsYW5jZS9hZGQvcmViYWxhbmNlICovCitleHRlcm4gdm9pZCByYl9yZXBsYWNlX25vZGUoc3RydWN0IHJiX25vZGUgKnZpY3RpbSwgc3RydWN0IHJiX25vZGUgKm5ldywgCisJCQkgICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmJfbGlua19ub2RlKHN0cnVjdCByYl9ub2RlICogbm9kZSwgc3RydWN0IHJiX25vZGUgKiBwYXJlbnQsCisJCQkJc3RydWN0IHJiX25vZGUgKiogcmJfbGluaykKK3sKKwlub2RlLT5yYl9wYXJlbnRfY29sb3IgPSAodW5zaWduZWQgbG9uZyApcGFyZW50OworCW5vZGUtPnJiX2xlZnQgPSBub2RlLT5yYl9yaWdodCA9IE5VTEw7CisKKwkqcmJfbGluayA9IG5vZGU7Cit9CisKKyNlbmRpZgkvKiBfTElOVVhfUkJUUkVFX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ydW4tY29tbWFuZC5jIGIvdG9vbHMvcGVyZi91dGlsL3J1bi1jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmNWU4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ydW4tY29tbWFuZC5jCkBAIC0wLDAgKzEsMzk1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9zZV9wYWlyKGludCBmZFsyXSkKK3sKKwljbG9zZShmZFswXSk7CisJY2xvc2UoZmRbMV0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVwX2Rldm51bGwoaW50IHRvKQoreworCWludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisJZHVwMihmZCwgdG8pOworCWNsb3NlKGZkKTsKK30KKworaW50IHN0YXJ0X2NvbW1hbmQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNtZCkKK3sKKwlpbnQgbmVlZF9pbiwgbmVlZF9vdXQsIG5lZWRfZXJyOworCWludCBmZGluWzJdLCBmZG91dFsyXSwgZmRlcnJbMl07CisKKwkvKgorCSAqIEluIGNhc2Ugb2YgZXJyb3JzIHdlIG11c3Qga2VlcCB0aGUgcHJvbWlzZSB0byBjbG9zZSBGRHMKKwkgKiB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgaW4gdmlhIC0+aW4gYW5kIC0+b3V0LgorCSAqLworCisJbmVlZF9pbiA9ICFjbWQtPm5vX3N0ZGluICYmIGNtZC0+aW4gPCAwOworCWlmIChuZWVkX2luKSB7CisJCWlmIChwaXBlKGZkaW4pIDwgMCkgeworCQkJaWYgKGNtZC0+b3V0ID4gMCkKKwkJCQljbG9zZShjbWQtPm91dCk7CisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9QSVBFOworCQl9CisJCWNtZC0+aW4gPSBmZGluWzFdOworCX0KKworCW5lZWRfb3V0ID0gIWNtZC0+bm9fc3Rkb3V0CisJCSYmICFjbWQtPnN0ZG91dF90b19zdGRlcnIKKwkJJiYgY21kLT5vdXQgPCAwOworCWlmIChuZWVkX291dCkgeworCQlpZiAocGlwZShmZG91dCkgPCAwKSB7CisJCQlpZiAobmVlZF9pbikKKwkJCQljbG9zZV9wYWlyKGZkaW4pOworCQkJZWxzZSBpZiAoY21kLT5pbikKKwkJCQljbG9zZShjbWQtPmluKTsKKwkJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX1BJUEU7CisJCX0KKwkJY21kLT5vdXQgPSBmZG91dFswXTsKKwl9CisKKwluZWVkX2VyciA9ICFjbWQtPm5vX3N0ZGVyciAmJiBjbWQtPmVyciA8IDA7CisJaWYgKG5lZWRfZXJyKSB7CisJCWlmIChwaXBlKGZkZXJyKSA8IDApIHsKKwkJCWlmIChuZWVkX2luKQorCQkJCWNsb3NlX3BhaXIoZmRpbik7CisJCQllbHNlIGlmIChjbWQtPmluKQorCQkJCWNsb3NlKGNtZC0+aW4pOworCQkJaWYgKG5lZWRfb3V0KQorCQkJCWNsb3NlX3BhaXIoZmRvdXQpOworCQkJZWxzZSBpZiAoY21kLT5vdXQpCisJCQkJY2xvc2UoY21kLT5vdXQpOworCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfUElQRTsKKwkJfQorCQljbWQtPmVyciA9IGZkZXJyWzBdOworCX0KKworI2lmbmRlZiBfX01JTkdXMzJfXworCWZmbHVzaChOVUxMKTsKKwljbWQtPnBpZCA9IGZvcmsoKTsKKwlpZiAoIWNtZC0+cGlkKSB7CisJCWlmIChjbWQtPm5vX3N0ZGluKQorCQkJZHVwX2Rldm51bGwoMCk7CisJCWVsc2UgaWYgKG5lZWRfaW4pIHsKKwkJCWR1cDIoZmRpblswXSwgMCk7CisJCQljbG9zZV9wYWlyKGZkaW4pOworCQl9IGVsc2UgaWYgKGNtZC0+aW4pIHsKKwkJCWR1cDIoY21kLT5pbiwgMCk7CisJCQljbG9zZShjbWQtPmluKTsKKwkJfQorCisJCWlmIChjbWQtPm5vX3N0ZGVycikKKwkJCWR1cF9kZXZudWxsKDIpOworCQllbHNlIGlmIChuZWVkX2VycikgeworCQkJZHVwMihmZGVyclsxXSwgMik7CisJCQljbG9zZV9wYWlyKGZkZXJyKTsKKwkJfQorCisJCWlmIChjbWQtPm5vX3N0ZG91dCkKKwkJCWR1cF9kZXZudWxsKDEpOworCQllbHNlIGlmIChjbWQtPnN0ZG91dF90b19zdGRlcnIpCisJCQlkdXAyKDIsIDEpOworCQllbHNlIGlmIChuZWVkX291dCkgeworCQkJZHVwMihmZG91dFsxXSwgMSk7CisJCQljbG9zZV9wYWlyKGZkb3V0KTsKKwkJfSBlbHNlIGlmIChjbWQtPm91dCA+IDEpIHsKKwkJCWR1cDIoY21kLT5vdXQsIDEpOworCQkJY2xvc2UoY21kLT5vdXQpOworCQl9CisKKwkJaWYgKGNtZC0+ZGlyICYmIGNoZGlyKGNtZC0+ZGlyKSkKKwkJCWRpZSgiZXhlYyAlczogY2QgdG8gJXMgZmFpbGVkICglcykiLCBjbWQtPmFyZ3ZbMF0sCisJCQkgICAgY21kLT5kaXIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChjbWQtPmVudikgeworCQkJZm9yICg7ICpjbWQtPmVudjsgY21kLT5lbnYrKykgeworCQkJCWlmIChzdHJjaHIoKmNtZC0+ZW52LCAnPScpKQorCQkJCQlwdXRlbnYoKGNoYXIqKSpjbWQtPmVudik7CisJCQkJZWxzZQorCQkJCQl1bnNldGVudigqY21kLT5lbnYpOworCQkJfQorCQl9CisJCWlmIChjbWQtPnByZWV4ZWNfY2IpCisJCQljbWQtPnByZWV4ZWNfY2IoKTsKKwkJaWYgKGNtZC0+cGVyZl9jbWQpIHsKKwkJCWV4ZWN2X3BlcmZfY21kKGNtZC0+YXJndik7CisJCX0gZWxzZSB7CisJCQlleGVjdnAoY21kLT5hcmd2WzBdLCAoY2hhciAqY29uc3QqKSBjbWQtPmFyZ3YpOworCQl9CisJCWV4aXQoMTI3KTsKKwl9CisjZWxzZQorCWludCBzMCA9IC0xLCBzMSA9IC0xLCBzMiA9IC0xOwkvKiBiYWNrdXBzIG9mIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciAqLworCWNvbnN0IGNoYXIgKipzYXJndiA9IGNtZC0+YXJndjsKKwljaGFyICoqZW52ID0gZW52aXJvbjsKKworCWlmIChjbWQtPm5vX3N0ZGluKSB7CisJCXMwID0gZHVwKDApOworCQlkdXBfZGV2bnVsbCgwKTsKKwl9IGVsc2UgaWYgKG5lZWRfaW4pIHsKKwkJczAgPSBkdXAoMCk7CisJCWR1cDIoZmRpblswXSwgMCk7CisJfSBlbHNlIGlmIChjbWQtPmluKSB7CisJCXMwID0gZHVwKDApOworCQlkdXAyKGNtZC0+aW4sIDApOworCX0KKworCWlmIChjbWQtPm5vX3N0ZGVycikgeworCQlzMiA9IGR1cCgyKTsKKwkJZHVwX2Rldm51bGwoMik7CisJfSBlbHNlIGlmIChuZWVkX2VycikgeworCQlzMiA9IGR1cCgyKTsKKwkJZHVwMihmZGVyclsxXSwgMik7CisJfQorCisJaWYgKGNtZC0+bm9fc3Rkb3V0KSB7CisJCXMxID0gZHVwKDEpOworCQlkdXBfZGV2bnVsbCgxKTsKKwl9IGVsc2UgaWYgKGNtZC0+c3Rkb3V0X3RvX3N0ZGVycikgeworCQlzMSA9IGR1cCgxKTsKKwkJZHVwMigyLCAxKTsKKwl9IGVsc2UgaWYgKG5lZWRfb3V0KSB7CisJCXMxID0gZHVwKDEpOworCQlkdXAyKGZkb3V0WzFdLCAxKTsKKwl9IGVsc2UgaWYgKGNtZC0+b3V0ID4gMSkgeworCQlzMSA9IGR1cCgxKTsKKwkJZHVwMihjbWQtPm91dCwgMSk7CisJfQorCisJaWYgKGNtZC0+ZGlyKQorCQlkaWUoImNoZGlyIGluIHN0YXJ0X2NvbW1hbmQoKSBub3QgaW1wbGVtZW50ZWQiKTsKKwlpZiAoY21kLT5lbnYpIHsKKwkJZW52ID0gY29weV9lbnZpcm9uKCk7CisJCWZvciAoOyAqY21kLT5lbnY7IGNtZC0+ZW52KyspCisJCQllbnYgPSBlbnZfc2V0ZW52KGVudiwgKmNtZC0+ZW52KTsKKwl9CisKKwlpZiAoY21kLT5wZXJmX2NtZCkgeworCQljbWQtPmFyZ3YgPSBwcmVwYXJlX3BlcmZfY21kKGNtZC0+YXJndik7CisJfQorCisJY21kLT5waWQgPSBtaW5nd19zcGF3bnZwZShjbWQtPmFyZ3ZbMF0sIGNtZC0+YXJndiwgZW52KTsKKworCWlmIChjbWQtPmVudikKKwkJZnJlZV9lbnZpcm9uKGVudik7CisJaWYgKGNtZC0+cGVyZl9jbWQpCisJCWZyZWUoY21kLT5hcmd2KTsKKworCWNtZC0+YXJndiA9IHNhcmd2OworCWlmIChzMCA+PSAwKQorCQlkdXAyKHMwLCAwKSwgY2xvc2UoczApOworCWlmIChzMSA+PSAwKQorCQlkdXAyKHMxLCAxKSwgY2xvc2UoczEpOworCWlmIChzMiA+PSAwKQorCQlkdXAyKHMyLCAyKSwgY2xvc2UoczIpOworI2VuZGlmCisKKwlpZiAoY21kLT5waWQgPCAwKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJaWYgKG5lZWRfaW4pCisJCQljbG9zZV9wYWlyKGZkaW4pOworCQllbHNlIGlmIChjbWQtPmluKQorCQkJY2xvc2UoY21kLT5pbik7CisJCWlmIChuZWVkX291dCkKKwkJCWNsb3NlX3BhaXIoZmRvdXQpOworCQllbHNlIGlmIChjbWQtPm91dCkKKwkJCWNsb3NlKGNtZC0+b3V0KTsKKwkJaWYgKG5lZWRfZXJyKQorCQkJY2xvc2VfcGFpcihmZGVycik7CisJCXJldHVybiBlcnIgPT0gRU5PRU5UID8KKwkJCS1FUlJfUlVOX0NPTU1BTkRfRVhFQyA6CisJCQktRVJSX1JVTl9DT01NQU5EX0ZPUks7CisJfQorCisJaWYgKG5lZWRfaW4pCisJCWNsb3NlKGZkaW5bMF0pOworCWVsc2UgaWYgKGNtZC0+aW4pCisJCWNsb3NlKGNtZC0+aW4pOworCisJaWYgKG5lZWRfb3V0KQorCQljbG9zZShmZG91dFsxXSk7CisJZWxzZSBpZiAoY21kLT5vdXQpCisJCWNsb3NlKGNtZC0+b3V0KTsKKworCWlmIChuZWVkX2VycikKKwkJY2xvc2UoZmRlcnJbMV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9vcl93aGluZShwaWRfdCBwaWQpCit7CisJZm9yICg7OykgeworCQlpbnQgc3RhdHVzLCBjb2RlOworCQlwaWRfdCB3YWl0aW5nID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCisJCWlmICh3YWl0aW5nIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IoIndhaXRwaWQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRDsKKwkJfQorCQlpZiAod2FpdGluZyAhPSBwaWQpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRDsKKwkJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDsKKworCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKQorCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9OT0VYSVQ7CisJCWNvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSAxMjc6CisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9FWEVDOworCQljYXNlIDA6CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtY29kZTsKKwkJfQorCX0KK30KKworaW50IGZpbmlzaF9jb21tYW5kKHN0cnVjdCBjaGlsZF9wcm9jZXNzICpjbWQpCit7CisJcmV0dXJuIHdhaXRfb3Jfd2hpbmUoY21kLT5waWQpOworfQorCitpbnQgcnVuX2NvbW1hbmQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNtZCkKK3sKKwlpbnQgY29kZSA9IHN0YXJ0X2NvbW1hbmQoY21kKTsKKwlpZiAoY29kZSkKKwkJcmV0dXJuIGNvZGU7CisJcmV0dXJuIGZpbmlzaF9jb21tYW5kKGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfcnVuX2NvbW1hbmRfdl9vcHQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNtZCwKKwkJCQkgICAgICBjb25zdCBjaGFyICoqYXJndiwKKwkJCQkgICAgICBpbnQgb3B0KQoreworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisJY21kLT5hcmd2ID0gYXJndjsKKwljbWQtPm5vX3N0ZGluID0gb3B0ICYgUlVOX0NPTU1BTkRfTk9fU1RESU4gPyAxIDogMDsKKwljbWQtPnBlcmZfY21kID0gb3B0ICYgUlVOX1BFUkZfQ01EID8gMSA6IDA7CisJY21kLT5zdGRvdXRfdG9fc3RkZXJyID0gb3B0ICYgUlVOX0NPTU1BTkRfU1RET1VUX1RPX1NUREVSUiA/IDEgOiAwOworfQorCitpbnQgcnVuX2NvbW1hbmRfdl9vcHQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQpCit7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgY21kOworCXByZXBhcmVfcnVuX2NvbW1hbmRfdl9vcHQoJmNtZCwgYXJndiwgb3B0KTsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmNtZCk7Cit9CisKK2ludCBydW5fY29tbWFuZF92X29wdF9jZF9lbnYoY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQsIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqY29uc3QgKmVudikKK3sKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBjbWQ7CisJcHJlcGFyZV9ydW5fY29tbWFuZF92X29wdCgmY21kLCBhcmd2LCBvcHQpOworCWNtZC5kaXIgPSBkaXI7CisJY21kLmVudiA9IGVudjsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmNtZCk7Cit9CisKKyNpZmRlZiBfX01JTkdXMzJfXworc3RhdGljIF9fc3RkY2FsbCB1bnNpZ25lZCBydW5fdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFzeW5jICphc3luYyA9IGRhdGE7CisJcmV0dXJuIGFzeW5jLT5wcm9jKGFzeW5jLT5mZF9mb3JfcHJvYywgYXN5bmMtPmRhdGEpOworfQorI2VuZGlmCisKK2ludCBzdGFydF9hc3luYyhzdHJ1Y3QgYXN5bmMgKmFzeW5jKQoreworCWludCBwaXBlX291dFsyXTsKKworCWlmIChwaXBlKHBpcGVfb3V0KSA8IDApCisJCXJldHVybiBlcnJvcigiY2Fubm90IGNyZWF0ZSBwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJYXN5bmMtPm91dCA9IHBpcGVfb3V0WzBdOworCisjaWZuZGVmIF9fTUlOR1czMl9fCisJLyogRmx1c2ggc3RkaW8gYmVmb3JlIGZvcmsoKSB0byBhdm9pZCBjbG9uaW5nIGJ1ZmZlcnMgKi8KKwlmZmx1c2goTlVMTCk7CisKKwlhc3luYy0+cGlkID0gZm9yaygpOworCWlmIChhc3luYy0+cGlkIDwgMCkgeworCQllcnJvcigiZm9yayAoYXN5bmMpIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZV9wYWlyKHBpcGVfb3V0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWFzeW5jLT5waWQpIHsKKwkJY2xvc2UocGlwZV9vdXRbMF0pOworCQlleGl0KCEhYXN5bmMtPnByb2MocGlwZV9vdXRbMV0sIGFzeW5jLT5kYXRhKSk7CisJfQorCWNsb3NlKHBpcGVfb3V0WzFdKTsKKyNlbHNlCisJYXN5bmMtPmZkX2Zvcl9wcm9jID0gcGlwZV9vdXRbMV07CisJYXN5bmMtPnRpZCA9IChIQU5ETEUpIF9iZWdpbnRocmVhZGV4KE5VTEwsIDAsIHJ1bl90aHJlYWQsIGFzeW5jLCAwLCBOVUxMKTsKKwlpZiAoIWFzeW5jLT50aWQpIHsKKwkJZXJyb3IoImNhbm5vdCBjcmVhdGUgdGhyZWFkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlX3BhaXIocGlwZV9vdXQpOworCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2ludCBmaW5pc2hfYXN5bmMoc3RydWN0IGFzeW5jICphc3luYykKK3sKKyNpZm5kZWYgX19NSU5HVzMyX18KKwlpbnQgcmV0ID0gMDsKKworCWlmICh3YWl0X29yX3doaW5lKGFzeW5jLT5waWQpKQorCQlyZXQgPSBlcnJvcigid2FpdHBpZCAoYXN5bmMpIGZhaWxlZCIpOworI2Vsc2UKKwlEV09SRCByZXQgPSAwOworCWlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KGFzeW5jLT50aWQsIElORklOSVRFKSAhPSBXQUlUX09CSkVDVF8wKQorCQlyZXQgPSBlcnJvcigid2FpdGluZyBmb3IgdGhyZWFkIGZhaWxlZDogJWx1IiwgR2V0TGFzdEVycm9yKCkpOworCWVsc2UgaWYgKCFHZXRFeGl0Q29kZVRocmVhZChhc3luYy0+dGlkLCAmcmV0KSkKKwkJcmV0ID0gZXJyb3IoImNhbm5vdCBnZXQgdGhyZWFkIGV4aXQgY29kZTogJWx1IiwgR2V0TGFzdEVycm9yKCkpOworCUNsb3NlSGFuZGxlKGFzeW5jLT50aWQpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworaW50IHJ1bl9ob29rKGNvbnN0IGNoYXIgKmluZGV4X2ZpbGUsIGNvbnN0IGNoYXIgKm5hbWUsIC4uLikKK3sKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBob29rOworCWNvbnN0IGNoYXIgKiphcmd2ID0gTlVMTCwgKmVudlsyXTsKKwljaGFyIGluZGV4W1BBVEhfTUFYXTsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJldDsKKwlzaXplX3QgaSA9IDAsIGFsbG9jID0gMDsKKworCWlmIChhY2Nlc3MocGVyZl9wYXRoKCJob29rcy8lcyIsIG5hbWUpLCBYX09LKSA8IDApCisJCXJldHVybiAwOworCisJdmFfc3RhcnQoYXJncywgbmFtZSk7CisJQUxMT0NfR1JPVyhhcmd2LCBpICsgMSwgYWxsb2MpOworCWFyZ3ZbaSsrXSA9IHBlcmZfcGF0aCgiaG9va3MvJXMiLCBuYW1lKTsKKwl3aGlsZSAoYXJndltpLTFdKSB7CisJCUFMTE9DX0dST1coYXJndiwgaSArIDEsIGFsbG9jKTsKKwkJYXJndltpKytdID0gdmFfYXJnKGFyZ3MsIGNvbnN0IGNoYXIgKik7CisJfQorCXZhX2VuZChhcmdzKTsKKworCW1lbXNldCgmaG9vaywgMCwgc2l6ZW9mKGhvb2spKTsKKwlob29rLmFyZ3YgPSBhcmd2OworCWhvb2subm9fc3RkaW4gPSAxOworCWhvb2suc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisJaWYgKGluZGV4X2ZpbGUpIHsKKwkJc25wcmludGYoaW5kZXgsIHNpemVvZihpbmRleCksICJQRVJGX0lOREVYX0ZJTEU9JXMiLCBpbmRleF9maWxlKTsKKwkJZW52WzBdID0gaW5kZXg7CisJCWVudlsxXSA9IE5VTEw7CisJCWhvb2suZW52ID0gZW52OworCX0KKworCXJldCA9IHN0YXJ0X2NvbW1hbmQoJmhvb2spOworCWZyZWUoYXJndik7CisJaWYgKHJldCkgeworCQl3YXJuaW5nKCJDb3VsZCBub3Qgc3Bhd24gJXMiLCBhcmd2WzBdKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gZmluaXNoX2NvbW1hbmQoJmhvb2spOworCWlmIChyZXQgPT0gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTCkKKwkJd2FybmluZygiJXMgZXhpdGVkIGR1ZSB0byB1bmNhdWdodCBzaWduYWwiLCBhcmd2WzBdKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcnVuLWNvbW1hbmQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ydW4tY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODI4OWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcnVuLWNvbW1hbmQuaApAQCAtMCwwICsxLDkzIEBACisjaWZuZGVmIFJVTl9DT01NQU5EX0gKKyNkZWZpbmUgUlVOX0NPTU1BTkRfSAorCitlbnVtIHsKKwlFUlJfUlVOX0NPTU1BTkRfRk9SSyA9IDEwMDAwLAorCUVSUl9SVU5fQ09NTUFORF9FWEVDLAorCUVSUl9SVU5fQ09NTUFORF9QSVBFLAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElELAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRCwKKwlFUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUwsCisJRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElULAorfTsKKyNkZWZpbmUgSVNfUlVOX0NPTU1BTkRfRVJSKHgpICgtKHgpID49IEVSUl9SVU5fQ09NTUFORF9GT1JLKQorCitzdHJ1Y3QgY2hpbGRfcHJvY2VzcyB7CisJY29uc3QgY2hhciAqKmFyZ3Y7CisJcGlkX3QgcGlkOworCS8qCisJICogVXNpbmcgLmluLCAub3V0LCAuZXJyOgorCSAqIC0gU3BlY2lmeSAwIGZvciBubyByZWRpcmVjdGlvbnMgKGNoaWxkIGluaGVyaXRzIHN0ZGluLCBzdGRvdXQsCisJICogICBzdGRlcnIgZnJvbSBwYXJlbnQpLgorCSAqIC0gU3BlY2lmeSAtMSB0byBoYXZlIGEgcGlwZSBhbGxvY2F0ZWQgYXMgZm9sbG93czoKKwkgKiAgICAgLmluOiByZXR1cm5zIHRoZSB3cml0YWJsZSBwaXBlIGVuZDsgcGFyZW50IHdyaXRlcyB0byBpdCwKKwkgKiAgICAgICAgICB0aGUgcmVhZGFibGUgcGlwZSBlbmQgYmVjb21lcyBjaGlsZCdzIHN0ZGluCisJICogICAgIC5vdXQsIC5lcnI6IHJldHVybnMgdGhlIHJlYWRhYmxlIHBpcGUgZW5kOyBwYXJlbnQgcmVhZHMgZnJvbQorCSAqICAgICAgICAgIGl0LCB0aGUgd3JpdGFibGUgcGlwZSBlbmQgYmVjb21lcyBjaGlsZCdzIHN0ZG91dC9zdGRlcnIKKwkgKiAgIFRoZSBjYWxsZXIgb2Ygc3RhcnRfY29tbWFuZCgpIG11c3QgY2xvc2UgdGhlIHJldHVybmVkIEZEcworCSAqICAgYWZ0ZXIgaXQgaGFzIGNvbXBsZXRlZCByZWFkaW5nIGZyb20vd3JpdGluZyB0byBpdCEKKwkgKiAtIFNwZWNpZnkgPiAwIHRvIHNldCBhIGNoYW5uZWwgdG8gYSBwYXJ0aWN1bGFyIEZEIGFzIGZvbGxvd3M6CisJICogICAgIC5pbjogYSByZWFkYWJsZSBGRCwgYmVjb21lcyBjaGlsZCdzIHN0ZGluCisJICogICAgIC5vdXQ6IGEgd3JpdGFibGUgRkQsIGJlY29tZXMgY2hpbGQncyBzdGRvdXQvc3RkZXJyCisJICogICAgIC5lcnIgPiAwIG5vdCBzdXBwb3J0ZWQKKwkgKiAgIFRoZSBzcGVjaWZpZWQgRkQgaXMgY2xvc2VkIGJ5IHN0YXJ0X2NvbW1hbmQoKSwgZXZlbiBpbiBjYXNlCisJICogICBvZiBlcnJvcnMhCisJICovCisJaW50IGluOworCWludCBvdXQ7CisJaW50IGVycjsKKwljb25zdCBjaGFyICpkaXI7CisJY29uc3QgY2hhciAqY29uc3QgKmVudjsKKwl1bnNpZ25lZCBub19zdGRpbjoxOworCXVuc2lnbmVkIG5vX3N0ZG91dDoxOworCXVuc2lnbmVkIG5vX3N0ZGVycjoxOworCXVuc2lnbmVkIHBlcmZfY21kOjE7IC8qIGlmIHRoaXMgaXMgdG8gYmUgcGVyZiBzdWItY29tbWFuZCAqLworCXVuc2lnbmVkIHN0ZG91dF90b19zdGRlcnI6MTsKKwl2b2lkICgqcHJlZXhlY19jYikodm9pZCk7Cit9OworCitpbnQgc3RhcnRfY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqKTsKK2ludCBmaW5pc2hfY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqKTsKK2ludCBydW5fY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqKTsKKworZXh0ZXJuIGludCBydW5faG9vayhjb25zdCBjaGFyICppbmRleF9maWxlLCBjb25zdCBjaGFyICpuYW1lLCAuLi4pOworCisjZGVmaW5lIFJVTl9DT01NQU5EX05PX1NURElOIDEKKyNkZWZpbmUgUlVOX1BFUkZfQ01ECSAgICAgMgkvKklmIHRoaXMgaXMgdG8gYmUgcGVyZiBzdWItY29tbWFuZCAqLworI2RlZmluZSBSVU5fQ09NTUFORF9TVERPVVRfVE9fU1RERVJSIDQKK2ludCBydW5fY29tbWFuZF92X29wdChjb25zdCBjaGFyICoqYXJndiwgaW50IG9wdCk7CisKKy8qCisgKiBlbnYgKHRoZSBlbnZpcm9ubWVudCkgaXMgdG8gYmUgZm9ybWF0dGVkIGxpa2UgZW52aXJvbjogIlZBUj1WQUxVRSIuCisgKiBUbyB1bnNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2UganVzdCAiVkFSIi4KKyAqLworaW50IHJ1bl9jb21tYW5kX3Zfb3B0X2NkX2Vudihjb25zdCBjaGFyICoqYXJndiwgaW50IG9wdCwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpjb25zdCAqZW52KTsKKworLyoKKyAqIFRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlzIHRvIGZlZWQgYSBwaXBlIGJ5IHJ1bm5pbmcKKyAqIGEgZnVuY3Rpb24gYXN5bmNocm9ub3VzbHkgYW5kIHByb3ZpZGluZyBvdXRwdXQgdGhhdCB0aGUgY2FsbGVyIHJlYWRzLgorICoKKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgbm8gc3luY2hyb25pemF0aW9uIGFuZCBtdXR1YWwgZXhjbHVzaW9uIGJldHdlZW4KKyAqIHRoZSBjYWxsZXIgYW5kIHRoZSBmZWVkIGZ1bmN0aW9uIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHRoZSBmdW5jdGlvbgorICogY2FuIHJ1biBpbiBhIHRocmVhZCB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIGNhbGxlci4KKyAqLworc3RydWN0IGFzeW5jIHsKKwkvKgorCSAqIHByb2Mgd3JpdGVzIHRvIGZkIGFuZCBjbG9zZXMgaXQ7CisJICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKKwkgKi8KKwlpbnQgKCpwcm9jKShpbnQgZmQsIHZvaWQgKmRhdGEpOworCXZvaWQgKmRhdGE7CisJaW50IG91dDsJLyogY2FsbGVyIHJlYWRzIGZyb20gaGVyZSBhbmQgY2xvc2VzIGl0ICovCisjaWZuZGVmIF9fTUlOR1czMl9fCisJcGlkX3QgcGlkOworI2Vsc2UKKwlIQU5ETEUgdGlkOworCWludCBmZF9mb3JfcHJvYzsKKyNlbmRpZgorfTsKKworaW50IHN0YXJ0X2FzeW5jKHN0cnVjdCBhc3luYyAqYXN5bmMpOworaW50IGZpbmlzaF9hc3luYyhzdHJ1Y3QgYXN5bmMgKmFzeW5jKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2lnY2hhaW4uYyBiL3Rvb2xzL3BlcmYvdXRpbC9zaWdjaGFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMThiOTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvc2lnY2hhaW4uYwpAQCAtMCwwICsxLDUyIEBACisjaW5jbHVkZSAic2lnY2hhaW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIFNJR0NIQUlOX01BWF9TSUdOQUxTIDMyCisKK3N0cnVjdCBzaWdjaGFpbl9zaWduYWwgeworCXNpZ2NoYWluX2Z1biAqb2xkOworCWludCBuOworCWludCBhbGxvYzsKK307CitzdGF0aWMgc3RydWN0IHNpZ2NoYWluX3NpZ25hbCBzaWduYWxzW1NJR0NIQUlOX01BWF9TSUdOQUxTXTsKKworc3RhdGljIHZvaWQgY2hlY2tfc2lnbnVtKGludCBzaWcpCit7CisJaWYgKHNpZyA8IDEgfHwgc2lnID49IFNJR0NIQUlOX01BWF9TSUdOQUxTKQorCQlkaWUoIkJVRzogc2lnbmFsIG91dCBvZiByYW5nZTogJWQiLCBzaWcpOworfQorCitpbnQgc2lnY2hhaW5fcHVzaChpbnQgc2lnLCBzaWdjaGFpbl9mdW4gZikKK3sKKwlzdHJ1Y3Qgc2lnY2hhaW5fc2lnbmFsICpzID0gc2lnbmFscyArIHNpZzsKKwljaGVja19zaWdudW0oc2lnKTsKKworCUFMTE9DX0dST1cocy0+b2xkLCBzLT5uICsgMSwgcy0+YWxsb2MpOworCXMtPm9sZFtzLT5uXSA9IHNpZ25hbChzaWcsIGYpOworCWlmIChzLT5vbGRbcy0+bl0gPT0gU0lHX0VSUikKKwkJcmV0dXJuIC0xOworCXMtPm4rKzsKKwlyZXR1cm4gMDsKK30KKworaW50IHNpZ2NoYWluX3BvcChpbnQgc2lnKQoreworCXN0cnVjdCBzaWdjaGFpbl9zaWduYWwgKnMgPSBzaWduYWxzICsgc2lnOworCWNoZWNrX3NpZ251bShzaWcpOworCWlmIChzLT5uIDwgMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2lnbmFsKHNpZywgcy0+b2xkW3MtPm4gLSAxXSkgPT0gU0lHX0VSUikKKwkJcmV0dXJuIC0xOworCXMtPm4tLTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzaWdjaGFpbl9wdXNoX2NvbW1vbihzaWdjaGFpbl9mdW4gZikKK3sKKwlzaWdjaGFpbl9wdXNoKFNJR0lOVCwgZik7CisJc2lnY2hhaW5fcHVzaChTSUdIVVAsIGYpOworCXNpZ2NoYWluX3B1c2goU0lHVEVSTSwgZik7CisJc2lnY2hhaW5fcHVzaChTSUdRVUlULCBmKTsKKwlzaWdjaGFpbl9wdXNoKFNJR1BJUEUsIGYpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NpZ2NoYWluLmggYi90b29scy9wZXJmL3V0aWwvc2lnY2hhaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTgwODNiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zaWdjaGFpbi5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgU0lHQ0hBSU5fSAorI2RlZmluZSBTSUdDSEFJTl9ICisKK3R5cGVkZWYgdm9pZCAoKnNpZ2NoYWluX2Z1bikoaW50KTsKKworaW50IHNpZ2NoYWluX3B1c2goaW50IHNpZywgc2lnY2hhaW5fZnVuIGYpOworaW50IHNpZ2NoYWluX3BvcChpbnQgc2lnKTsKKwordm9pZCBzaWdjaGFpbl9wdXNoX2NvbW1vbihzaWdjaGFpbl9mdW4gZik7CisKKyNlbmRpZiAvKiBTSUdDSEFJTl9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3RyYnVmLmMgYi90b29scy9wZXJmL3V0aWwvc3RyYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiYTA5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zdHJidWYuYwpAQCAtMCwwICsxLDM1OSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK2ludCBwcmVmaXhjbXAoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJZm9yICg7IDsgc3RyKyssIHByZWZpeCsrKQorCQlpZiAoISpwcmVmaXgpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoKnN0ciAhPSAqcHJlZml4KQorCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSpwcmVmaXggLSAodW5zaWduZWQgY2hhcikqc3RyOworfQorCisvKgorICogVXNlZCBhcyB0aGUgZGVmYXVsdCAtPmJ1ZiB2YWx1ZSwgc28gdGhhdCBwZW9wbGUgY2FuIGFsd2F5cyBhc3N1bWUKKyAqIGJ1ZiBpcyBub24gTlVMTCBhbmQgLT5idWYgaXMgTlVMIHRlcm1pbmF0ZWQgZXZlbiBmb3IgYSBmcmVzaGx5CisgKiBpbml0aWFsaXplZCBzdHJidWYuCisgKi8KK2NoYXIgc3RyYnVmX3Nsb3BidWZbMV07CisKK3ZvaWQgc3RyYnVmX2luaXQoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBoaW50KQoreworCXNiLT5hbGxvYyA9IHNiLT5sZW4gPSAwOworCXNiLT5idWYgPSBzdHJidWZfc2xvcGJ1ZjsKKwlpZiAoaGludCkKKwkJc3RyYnVmX2dyb3coc2IsIGhpbnQpOworfQorCit2b2lkIHN0cmJ1Zl9yZWxlYXNlKHN0cnVjdCBzdHJidWYgKnNiKQoreworCWlmIChzYi0+YWxsb2MpIHsKKwkJZnJlZShzYi0+YnVmKTsKKwkJc3RyYnVmX2luaXQoc2IsIDApOworCX0KK30KKworY2hhciAqc3RyYnVmX2RldGFjaChzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90ICpzeikKK3sKKwljaGFyICpyZXMgPSBzYi0+YWxsb2MgPyBzYi0+YnVmIDogTlVMTDsKKwlpZiAoc3opCisJCSpzeiA9IHNiLT5sZW47CisJc3RyYnVmX2luaXQoc2IsIDApOworCXJldHVybiByZXM7Cit9CisKK3ZvaWQgc3RyYnVmX2F0dGFjaChzdHJ1Y3Qgc3RyYnVmICpzYiwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBzaXplX3QgYWxsb2MpCit7CisJc3RyYnVmX3JlbGVhc2Uoc2IpOworCXNiLT5idWYgICA9IGJ1ZjsKKwlzYi0+bGVuICAgPSBsZW47CisJc2ItPmFsbG9jID0gYWxsb2M7CisJc3RyYnVmX2dyb3coc2IsIDApOworCXNiLT5idWZbc2ItPmxlbl0gPSAnXDAnOworfQorCit2b2lkIHN0cmJ1Zl9ncm93KHN0cnVjdCBzdHJidWYgKnNiLCBzaXplX3QgZXh0cmEpCit7CisJaWYgKHNiLT5sZW4gKyBleHRyYSArIDEgPD0gc2ItPmxlbikKKwkJZGllKCJ5b3Ugd2FudCB0byB1c2Ugd2F5IHRvbyBtdWNoIG1lbW9yeSIpOworCWlmICghc2ItPmFsbG9jKQorCQlzYi0+YnVmID0gTlVMTDsKKwlBTExPQ19HUk9XKHNiLT5idWYsIHNiLT5sZW4gKyBleHRyYSArIDEsIHNiLT5hbGxvYyk7Cit9CisKK3ZvaWQgc3RyYnVmX3RyaW0oc3RydWN0IHN0cmJ1ZiAqc2IpCit7CisJY2hhciAqYiA9IHNiLT5idWY7CisJd2hpbGUgKHNiLT5sZW4gPiAwICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpc2ItPmJ1ZltzYi0+bGVuIC0gMV0pKQorCQlzYi0+bGVuLS07CisJd2hpbGUgKHNiLT5sZW4gPiAwICYmIGlzc3BhY2UoKmIpKSB7CisJCWIrKzsKKwkJc2ItPmxlbi0tOworCX0KKwltZW1tb3ZlKHNiLT5idWYsIGIsIHNiLT5sZW4pOworCXNiLT5idWZbc2ItPmxlbl0gPSAnXDAnOworfQordm9pZCBzdHJidWZfcnRyaW0oc3RydWN0IHN0cmJ1ZiAqc2IpCit7CisJd2hpbGUgKHNiLT5sZW4gPiAwICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpc2ItPmJ1ZltzYi0+bGVuIC0gMV0pKQorCQlzYi0+bGVuLS07CisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7Cit9CisKK3ZvaWQgc3RyYnVmX2x0cmltKHN0cnVjdCBzdHJidWYgKnNiKQoreworCWNoYXIgKmIgPSBzYi0+YnVmOworCXdoaWxlIChzYi0+bGVuID4gMCAmJiBpc3NwYWNlKCpiKSkgeworCQliKys7CisJCXNiLT5sZW4tLTsKKwl9CisJbWVtbW92ZShzYi0+YnVmLCBiLCBzYi0+bGVuKTsKKwlzYi0+YnVmW3NiLT5sZW5dID0gJ1wwJzsKK30KKwordm9pZCBzdHJidWZfdG9sb3dlcihzdHJ1Y3Qgc3RyYnVmICpzYikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2ItPmxlbjsgaSsrKQorCQlzYi0+YnVmW2ldID0gdG9sb3dlcihzYi0+YnVmW2ldKTsKK30KKworc3RydWN0IHN0cmJ1ZiAqKnN0cmJ1Zl9zcGxpdChjb25zdCBzdHJ1Y3Qgc3RyYnVmICpzYiwgaW50IGRlbGltKQoreworCWludCBhbGxvYyA9IDIsIHBvcyA9IDA7CisJY2hhciAqbiwgKnA7CisJc3RydWN0IHN0cmJ1ZiAqKnJldDsKKwlzdHJ1Y3Qgc3RyYnVmICp0OworCisJcmV0ID0gY2FsbG9jKGFsbG9jLCBzaXplb2Yoc3RydWN0IHN0cmJ1ZiAqKSk7CisJcCA9IG4gPSBzYi0+YnVmOworCXdoaWxlIChuIDwgc2ItPmJ1ZiArIHNiLT5sZW4pIHsKKwkJaW50IGxlbjsKKwkJbiA9IG1lbWNocihuLCBkZWxpbSwgc2ItPmxlbiAtIChuIC0gc2ItPmJ1ZikpOworCQlpZiAocG9zICsgMSA+PSBhbGxvYykgeworCQkJYWxsb2MgPSBhbGxvYyAqIDI7CisJCQlyZXQgPSByZWFsbG9jKHJldCwgc2l6ZW9mKHN0cnVjdCBzdHJidWYgKikgKiBhbGxvYyk7CisJCX0KKwkJaWYgKCFuKQorCQkJbiA9IHNiLT5idWYgKyBzYi0+bGVuIC0gMTsKKwkJbGVuID0gbiAtIHAgKyAxOworCQl0ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RyYnVmKSk7CisJCXN0cmJ1Zl9pbml0KHQsIGxlbik7CisJCXN0cmJ1Zl9hZGQodCwgcCwgbGVuKTsKKwkJcmV0W3Bvc10gPSB0OworCQlyZXRbKytwb3NdID0gTlVMTDsKKwkJcCA9ICsrbjsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzdHJidWZfbGlzdF9mcmVlKHN0cnVjdCBzdHJidWYgKipzYnMpCit7CisJc3RydWN0IHN0cmJ1ZiAqKnMgPSBzYnM7CisKKwl3aGlsZSAoKnMpIHsKKwkJc3RyYnVmX3JlbGVhc2UoKnMpOworCQlmcmVlKCpzKyspOworCX0KKwlmcmVlKHNicyk7Cit9CisKK2ludCBzdHJidWZfY21wKGNvbnN0IHN0cnVjdCBzdHJidWYgKmEsIGNvbnN0IHN0cnVjdCBzdHJidWYgKmIpCit7CisJaW50IGxlbiA9IGEtPmxlbiA8IGItPmxlbiA/IGEtPmxlbjogYi0+bGVuOworCWludCBjbXAgPSBtZW1jbXAoYS0+YnVmLCBiLT5idWYsIGxlbik7CisJaWYgKGNtcCkKKwkJcmV0dXJuIGNtcDsKKwlyZXR1cm4gYS0+bGVuIDwgYi0+bGVuID8gLTE6IGEtPmxlbiAhPSBiLT5sZW47Cit9CisKK3ZvaWQgc3RyYnVmX3NwbGljZShzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90IHBvcywgc2l6ZV90IGxlbiwKKwkJCQkgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGxlbikKK3sKKwlpZiAocG9zICsgbGVuIDwgcG9zKQorCQlkaWUoInlvdSB3YW50IHRvIHVzZSB3YXkgdG9vIG11Y2ggbWVtb3J5Iik7CisJaWYgKHBvcyA+IHNiLT5sZW4pCisJCWRpZSgiYHBvcycgaXMgdG9vIGZhciBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIiKTsKKwlpZiAocG9zICsgbGVuID4gc2ItPmxlbikKKwkJZGllKCJgcG9zICsgbGVuJyBpcyB0b28gZmFyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciIpOworCisJaWYgKGRsZW4gPj0gbGVuKQorCQlzdHJidWZfZ3JvdyhzYiwgZGxlbiAtIGxlbik7CisJbWVtbW92ZShzYi0+YnVmICsgcG9zICsgZGxlbiwKKwkJCXNiLT5idWYgKyBwb3MgKyBsZW4sCisJCQlzYi0+bGVuIC0gcG9zIC0gbGVuKTsKKwltZW1jcHkoc2ItPmJ1ZiArIHBvcywgZGF0YSwgZGxlbik7CisJc3RyYnVmX3NldGxlbihzYiwgc2ItPmxlbiArIGRsZW4gLSBsZW4pOworfQorCit2b2lkIHN0cmJ1Zl9pbnNlcnQoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBwb3MsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RyYnVmX3NwbGljZShzYiwgcG9zLCAwLCBkYXRhLCBsZW4pOworfQorCit2b2lkIHN0cmJ1Zl9yZW1vdmUoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBwb3MsIHNpemVfdCBsZW4pCit7CisJc3RyYnVmX3NwbGljZShzYiwgcG9zLCBsZW4sIE5VTEwsIDApOworfQorCit2b2lkIHN0cmJ1Zl9hZGQoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RyYnVmX2dyb3coc2IsIGxlbik7CisJbWVtY3B5KHNiLT5idWYgKyBzYi0+bGVuLCBkYXRhLCBsZW4pOworCXN0cmJ1Zl9zZXRsZW4oc2IsIHNiLT5sZW4gKyBsZW4pOworfQorCit2b2lkIHN0cmJ1Zl9hZGRkdXAoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBwb3MsIHNpemVfdCBsZW4pCit7CisJc3RyYnVmX2dyb3coc2IsIGxlbik7CisJbWVtY3B5KHNiLT5idWYgKyBzYi0+bGVuLCBzYi0+YnVmICsgcG9zLCBsZW4pOworCXN0cmJ1Zl9zZXRsZW4oc2IsIHNiLT5sZW4gKyBsZW4pOworfQorCit2b2lkIHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgbGVuOworCXZhX2xpc3QgYXA7CisKKwlpZiAoIXN0cmJ1Zl9hdmFpbChzYikpCisJCXN0cmJ1Zl9ncm93KHNiLCA2NCk7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKHNiLT5idWYgKyBzYi0+bGVuLCBzYi0+YWxsb2MgLSBzYi0+bGVuLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWlmIChsZW4gPCAwKQorCQlkaWUoInlvdXIgdnNucHJpbnRmIGlzIGJyb2tlbiIpOworCWlmIChsZW4gPiBzdHJidWZfYXZhaWwoc2IpKSB7CisJCXN0cmJ1Zl9ncm93KHNiLCBsZW4pOworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJbGVuID0gdnNucHJpbnRmKHNiLT5idWYgKyBzYi0+bGVuLCBzYi0+YWxsb2MgLSBzYi0+bGVuLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKwkJaWYgKGxlbiA+IHN0cmJ1Zl9hdmFpbChzYikpIHsKKwkJCWRpZSgidGhpcyBzaG91bGQgbm90IGhhcHBlbiwgeW91ciBzbnByaW50ZiBpcyBicm9rZW4iKTsKKwkJfQorCX0KKwlzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgbGVuKTsKK30KKwordm9pZCBzdHJidWZfZXhwYW5kKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpmb3JtYXQsIGV4cGFuZF9mbl90IGZuLAorCQkgICB2b2lkICpjb250ZXh0KQoreworCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqcGVyY2VudDsKKwkJc2l6ZV90IGNvbnN1bWVkOworCisJCXBlcmNlbnQgPSBzdHJjaHJudWwoZm9ybWF0LCAnJScpOworCQlzdHJidWZfYWRkKHNiLCBmb3JtYXQsIHBlcmNlbnQgLSBmb3JtYXQpOworCQlpZiAoISpwZXJjZW50KQorCQkJYnJlYWs7CisJCWZvcm1hdCA9IHBlcmNlbnQgKyAxOworCisJCWNvbnN1bWVkID0gZm4oc2IsIGZvcm1hdCwgY29udGV4dCk7CisJCWlmIChjb25zdW1lZCkKKwkJCWZvcm1hdCArPSBjb25zdW1lZDsKKwkJZWxzZQorCQkJc3RyYnVmX2FkZGNoKHNiLCAnJScpOworCX0KK30KKworc2l6ZV90IHN0cmJ1Zl9leHBhbmRfZGljdF9jYihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGxhY2Vob2xkZXIsCisJCXZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHN0cmJ1Zl9leHBhbmRfZGljdF9lbnRyeSAqZSA9IGNvbnRleHQ7CisJc2l6ZV90IGxlbjsKKworCWZvciAoOyBlLT5wbGFjZWhvbGRlciAmJiAobGVuID0gc3RybGVuKGUtPnBsYWNlaG9sZGVyKSk7IGUrKykgeworCQlpZiAoIXN0cm5jbXAocGxhY2Vob2xkZXIsIGUtPnBsYWNlaG9sZGVyLCBsZW4pKSB7CisJCQlpZiAoZS0+dmFsdWUpCisJCQkJc3RyYnVmX2FkZHN0cihzYiwgZS0+dmFsdWUpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc2l6ZV90IHN0cmJ1Zl9mcmVhZChzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90IHNpemUsIEZJTEUgKmYpCit7CisJc2l6ZV90IHJlczsKKwlzaXplX3Qgb2xkYWxsb2MgPSBzYi0+YWxsb2M7CisKKwlzdHJidWZfZ3JvdyhzYiwgc2l6ZSk7CisJcmVzID0gZnJlYWQoc2ItPmJ1ZiArIHNiLT5sZW4sIDEsIHNpemUsIGYpOworCWlmIChyZXMgPiAwKQorCQlzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgcmVzKTsKKwllbHNlIGlmIChyZXMgPCAwICYmIG9sZGFsbG9jID09IDApCisJCXN0cmJ1Zl9yZWxlYXNlKHNiKTsKKwlyZXR1cm4gcmVzOworfQorCitzc2l6ZV90IHN0cmJ1Zl9yZWFkKHN0cnVjdCBzdHJidWYgKnNiLCBpbnQgZmQsIHNpemVfdCBoaW50KQoreworCXNpemVfdCBvbGRsZW4gPSBzYi0+bGVuOworCXNpemVfdCBvbGRhbGxvYyA9IHNiLT5hbGxvYzsKKworCXN0cmJ1Zl9ncm93KHNiLCBoaW50ID8gaGludCA6IDgxOTIpOworCWZvciAoOzspIHsKKwkJc3NpemVfdCBjbnQ7CisKKwkJY250ID0gcmVhZChmZCwgc2ItPmJ1ZiArIHNiLT5sZW4sIHNiLT5hbGxvYyAtIHNiLT5sZW4gLSAxKTsKKwkJaWYgKGNudCA8IDApIHsKKwkJCWlmIChvbGRhbGxvYyA9PSAwKQorCQkJCXN0cmJ1Zl9yZWxlYXNlKHNiKTsKKwkJCWVsc2UKKwkJCQlzdHJidWZfc2V0bGVuKHNiLCBvbGRsZW4pOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghY250KQorCQkJYnJlYWs7CisJCXNiLT5sZW4gKz0gY250OworCQlzdHJidWZfZ3JvdyhzYiwgODE5Mik7CisJfQorCisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7CisJcmV0dXJuIHNiLT5sZW4gLSBvbGRsZW47Cit9CisKKyNkZWZpbmUgU1RSQlVGX01BWExJTksgKDIqUEFUSF9NQVgpCisKK2ludCBzdHJidWZfcmVhZGxpbmsoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnBhdGgsIHNpemVfdCBoaW50KQoreworCXNpemVfdCBvbGRhbGxvYyA9IHNiLT5hbGxvYzsKKworCWlmIChoaW50IDwgMzIpCisJCWhpbnQgPSAzMjsKKworCXdoaWxlIChoaW50IDwgU1RSQlVGX01BWExJTkspIHsKKwkJaW50IGxlbjsKKworCQlzdHJidWZfZ3JvdyhzYiwgaGludCk7CisJCWxlbiA9IHJlYWRsaW5rKHBhdGgsIHNiLT5idWYsIGhpbnQpOworCQlpZiAobGVuIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVSQU5HRSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmIChsZW4gPCBoaW50KSB7CisJCQlzdHJidWZfc2V0bGVuKHNiLCBsZW4pOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiAuLiB0aGUgYnVmZmVyIHdhcyB0b28gc21hbGwgLSB0cnkgYWdhaW4gKi8KKwkJaGludCAqPSAyOworCX0KKwlpZiAob2xkYWxsb2MgPT0gMCkKKwkJc3RyYnVmX3JlbGVhc2Uoc2IpOworCXJldHVybiAtMTsKK30KKworaW50IHN0cmJ1Zl9nZXRsaW5lKHN0cnVjdCBzdHJidWYgKnNiLCBGSUxFICpmcCwgaW50IHRlcm0pCit7CisJaW50IGNoOworCisJc3RyYnVmX2dyb3coc2IsIDApOworCWlmIChmZW9mKGZwKSkKKwkJcmV0dXJuIEVPRjsKKworCXN0cmJ1Zl9yZXNldChzYik7CisJd2hpbGUgKChjaCA9IGZnZXRjKGZwKSkgIT0gRU9GKSB7CisJCWlmIChjaCA9PSB0ZXJtKQorCQkJYnJlYWs7CisJCXN0cmJ1Zl9ncm93KHNiLCAxKTsKKwkJc2ItPmJ1ZltzYi0+bGVuKytdID0gY2g7CisJfQorCWlmIChjaCA9PSBFT0YgJiYgc2ItPmxlbiA9PSAwKQorCQlyZXR1cm4gRU9GOworCisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdHJidWZfcmVhZF9maWxlKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgaGludCkKK3sKKwlpbnQgZmQsIGxlbjsKKworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWxlbiA9IHN0cmJ1Zl9yZWFkKHNiLCBmZCwgaGludCk7CisJY2xvc2UoZmQpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5oIGIvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTkwOGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvc3RyYnVmLmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpZm5kZWYgU1RSQlVGX0gKKyNkZWZpbmUgU1RSQlVGX0gKKworLyoKKyAqIFN0cmJ1ZidzIGNhbiBiZSB1c2UgaW4gbWFueSB3YXlzOiBhcyBhIGJ5dGUgYXJyYXksIG9yIHRvIHN0b3JlIGFyYml0cmFyeQorICogbG9uZywgb3ZlcmZsb3cgc2FmZSBzdHJpbmdzLgorICoKKyAqIFN0cmJ1ZnMgaGFzIHNvbWUgaW52YXJpYW50cyB0aGF0IGFyZSB2ZXJ5IGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQ6CisgKgorICogMS4gdGhlIC0+YnVmIG1lbWJlciBpcyBhbHdheXMgbWFsbG9jLWVkLCBoZW5jZSBzdHJidWYncyBjYW4gYmUgdXNlZCB0bworICogICAgYnVpbGQgY29tcGxleCBzdHJpbmdzL2J1ZmZlcnMgd2hvc2UgZmluYWwgc2l6ZSBpc24ndCBlYXNpbHkga25vd24uCisgKgorICogICAgSXQgaXMgTk9UIGxlZ2FsIHRvIGNvcHkgdGhlIC0+YnVmIHBvaW50ZXIgYXdheS4KKyAqICAgIGBzdHJidWZfZGV0YWNoJyBpcyB0aGUgb3BlcmF0aW9uIHRoYXQgZGV0YWNocyBhIGJ1ZmZlciBmcm9tIGl0cyBzaGVsbAorICogICAgd2hpbGUga2VlcGluZyB0aGUgc2hlbGwgdmFsaWQgd3J0IGl0cyBpbnZhcmlhbnRzLgorICoKKyAqIDIuIHRoZSAtPmJ1ZiBtZW1iZXIgaXMgYSBieXRlIGFycmF5IHRoYXQgaGFzIGF0IGxlYXN0IC0+bGVuICsgMSBieXRlcworICogICAgYWxsb2NhdGVkLiBUaGUgZXh0cmEgYnl0ZSBpcyB1c2VkIHRvIHN0b3JlIGEgJ1wwJywgYWxsb3dpbmcgdGhlIC0+YnVmCisgKiAgICBtZW1iZXIgdG8gYmUgYSB2YWxpZCBDLXN0cmluZy4gRXZlcnkgc3RyYnVmIGZ1bmN0aW9uIGVuc3VyZSB0aGlzCisgKiAgICBpbnZhcmlhbnQgaXMgcHJlc2VydmVkLgorICoKKyAqICAgIE5vdGUgdGhhdCBpdCBpcyBPSyB0byAicGxheSIgd2l0aCB0aGUgYnVmZmVyIGRpcmVjdGx5IGlmIHlvdSB3b3JrIGl0CisgKiAgICB0aGF0IHdheToKKyAqCisgKiAgICBzdHJidWZfZ3JvdyhzYiwgU09NRV9TSVpFKTsKKyAqICAgICAgIC4uLiBIZXJlLCB0aGUgbWVtb3J5IGFycmF5IHN0YXJ0aW5nIGF0IHNiLT5idWYsIGFuZCBvZiBsZW5ndGgKKyAqICAgICAgIC4uLiBzdHJidWZfYXZhaWwoc2IpIGlzIGFsbCB5b3VycywgYW5kIHlvdSBhcmUgc3VyZSB0aGF0CisgKiAgICAgICAuLi4gc3RyYnVmX2F2YWlsKHNiKSBpcyBhdCBsZWFzdCBTT01FX1NJWkUuCisgKiAgICBzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgU09NRV9PVEhFUl9TSVpFKTsKKyAqCisgKiAgICBPZiBjb3Vyc2UsIFNPTUVfT1RIRVJfU0laRSBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8gc3RyYnVmX2F2YWlsKHNiKS4KKyAqCisgKiAgICBEb2luZyBzbyBpcyBzYWZlLCB0aG91Z2ggaWYgaXQgaGFzIHRvIGJlIGRvbmUgaW4gbWFueSBwbGFjZXMsIGFkZGluZyB0aGUKKyAqICAgIG1pc3NpbmcgQVBJIHRvIHRoZSBzdHJidWYgbW9kdWxlIGlzIHRoZSB3YXkgdG8gZ28uCisgKgorICogICAgWFhYOiBkbyBfbm90XyBhc3N1bWUgdGhhdCB0aGUgYXJlYSB0aGF0IGlzIHlvdXJzIGlzIG9mIHNpemUgLT5hbGxvYyAtIDEKKyAqICAgICAgICAgZXZlbiBpZiBpdCdzIHRydWUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uIEFsbG9jIGlzIHNvbWVob3cgYQorICogICAgICAgICAicHJpdmF0ZSIgbWVtYmVyIHRoYXQgc2hvdWxkIG5vdCBiZSBtZXNzZWQgd2l0aC4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK2V4dGVybiBjaGFyIHN0cmJ1Zl9zbG9wYnVmW107CitzdHJ1Y3Qgc3RyYnVmIHsKKwlzaXplX3QgYWxsb2M7CisJc2l6ZV90IGxlbjsKKwljaGFyICpidWY7Cit9OworCisjZGVmaW5lIFNUUkJVRl9JTklUICB7IDAsIDAsIHN0cmJ1Zl9zbG9wYnVmIH0KKworLyotLS0tLSBzdHJidWYgbGlmZSBjeWNsZSAtLS0tLSovCitleHRlcm4gdm9pZCBzdHJidWZfaW5pdChzdHJ1Y3Qgc3RyYnVmICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBzdHJidWZfcmVsZWFzZShzdHJ1Y3Qgc3RyYnVmICopOworZXh0ZXJuIGNoYXIgKnN0cmJ1Zl9kZXRhY2goc3RydWN0IHN0cmJ1ZiAqLCBzaXplX3QgKik7CitleHRlcm4gdm9pZCBzdHJidWZfYXR0YWNoKHN0cnVjdCBzdHJidWYgKiwgdm9pZCAqLCBzaXplX3QsIHNpemVfdCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc3RyYnVmX3N3YXAoc3RydWN0IHN0cmJ1ZiAqYSwgc3RydWN0IHN0cmJ1ZiAqYikgeworCXN0cnVjdCBzdHJidWYgdG1wID0gKmE7CisJKmEgPSAqYjsKKwkqYiA9IHRtcDsKK30KKworLyotLS0tLSBzdHJidWYgc2l6ZSByZWxhdGVkIC0tLS0tKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHN0cmJ1Zl9hdmFpbChjb25zdCBzdHJ1Y3Qgc3RyYnVmICpzYikgeworCXJldHVybiBzYi0+YWxsb2MgPyBzYi0+YWxsb2MgLSBzYi0+bGVuIC0gMSA6IDA7Cit9CisKK2V4dGVybiB2b2lkIHN0cmJ1Zl9ncm93KHN0cnVjdCBzdHJidWYgKiwgc2l6ZV90KTsKKworc3RhdGljIGlubGluZSB2b2lkIHN0cmJ1Zl9zZXRsZW4oc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBsZW4pIHsKKwlpZiAoIXNiLT5hbGxvYykKKwkJc3RyYnVmX2dyb3coc2IsIDApOworCWFzc2VydChsZW4gPCBzYi0+YWxsb2MpOworCXNiLT5sZW4gPSBsZW47CisJc2ItPmJ1ZltsZW5dID0gJ1wwJzsKK30KKyNkZWZpbmUgc3RyYnVmX3Jlc2V0KHNiKSAgc3RyYnVmX3NldGxlbihzYiwgMCkKKworLyotLS0tLSBjb250ZW50IHJlbGF0ZWQgLS0tLS0qLworZXh0ZXJuIHZvaWQgc3RyYnVmX3RyaW0oc3RydWN0IHN0cmJ1ZiAqKTsKK2V4dGVybiB2b2lkIHN0cmJ1Zl9ydHJpbShzdHJ1Y3Qgc3RyYnVmICopOworZXh0ZXJuIHZvaWQgc3RyYnVmX2x0cmltKHN0cnVjdCBzdHJidWYgKik7CitleHRlcm4gaW50IHN0cmJ1Zl9jbXAoY29uc3Qgc3RydWN0IHN0cmJ1ZiAqLCBjb25zdCBzdHJ1Y3Qgc3RyYnVmICopOworZXh0ZXJuIHZvaWQgc3RyYnVmX3RvbG93ZXIoc3RydWN0IHN0cmJ1ZiAqKTsKKworZXh0ZXJuIHN0cnVjdCBzdHJidWYgKipzdHJidWZfc3BsaXQoY29uc3Qgc3RydWN0IHN0cmJ1ZiAqLCBpbnQgZGVsaW0pOworZXh0ZXJuIHZvaWQgc3RyYnVmX2xpc3RfZnJlZShzdHJ1Y3Qgc3RyYnVmICoqKTsKKworLyotLS0tLSBhZGQgZGF0YSBpbiB5b3VyIGJ1ZmZlciAtLS0tLSovCitzdGF0aWMgaW5saW5lIHZvaWQgc3RyYnVmX2FkZGNoKHN0cnVjdCBzdHJidWYgKnNiLCBpbnQgYykgeworCXN0cmJ1Zl9ncm93KHNiLCAxKTsKKwlzYi0+YnVmW3NiLT5sZW4rK10gPSBjOworCXNiLT5idWZbc2ItPmxlbl0gPSAnXDAnOworfQorCitleHRlcm4gdm9pZCBzdHJidWZfaW5zZXJ0KHN0cnVjdCBzdHJidWYgKiwgc2l6ZV90IHBvcywgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgc3RyYnVmX3JlbW92ZShzdHJ1Y3Qgc3RyYnVmICosIHNpemVfdCBwb3MsIHNpemVfdCBsZW4pOworCisvKiBzcGxpY2UgcG9zLi5wb3MrbGVuIHdpdGggZ2l2ZW4gZGF0YSAqLworZXh0ZXJuIHZvaWQgc3RyYnVmX3NwbGljZShzdHJ1Y3Qgc3RyYnVmICosIHNpemVfdCBwb3MsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKworZXh0ZXJuIHZvaWQgc3RyYnVmX2FkZChzdHJ1Y3Qgc3RyYnVmICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHJidWZfYWRkc3RyKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpzKSB7CisJc3RyYnVmX2FkZChzYiwgcywgc3RybGVuKHMpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHJidWZfYWRkYnVmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBzdHJ1Y3Qgc3RyYnVmICpzYjIpIHsKKwlzdHJidWZfYWRkKHNiLCBzYjItPmJ1Ziwgc2IyLT5sZW4pOworfQorZXh0ZXJuIHZvaWQgc3RyYnVmX2FkZGR1cChzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90IHBvcywgc2l6ZV90IGxlbik7CisKK3R5cGVkZWYgc2l6ZV90ICgqZXhwYW5kX2ZuX3QpIChzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGxhY2Vob2xkZXIsIHZvaWQgKmNvbnRleHQpOworZXh0ZXJuIHZvaWQgc3RyYnVmX2V4cGFuZChzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqZm9ybWF0LCBleHBhbmRfZm5fdCBmbiwgdm9pZCAqY29udGV4dCk7CitzdHJ1Y3Qgc3RyYnVmX2V4cGFuZF9kaWN0X2VudHJ5IHsKKwljb25zdCBjaGFyICpwbGFjZWhvbGRlcjsKKwljb25zdCBjaGFyICp2YWx1ZTsKK307CitleHRlcm4gc2l6ZV90IHN0cmJ1Zl9leHBhbmRfZGljdF9jYihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGxhY2Vob2xkZXIsIHZvaWQgKmNvbnRleHQpOworCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDIsMykpKQorZXh0ZXJuIHZvaWQgc3RyYnVmX2FkZGYoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworZXh0ZXJuIHNpemVfdCBzdHJidWZfZnJlYWQoc3RydWN0IHN0cmJ1ZiAqLCBzaXplX3QsIEZJTEUgKik7CisvKiBYWFg6IGlmIHJlYWQgZmFpbHMsIGFueSBwYXJ0aWFsIHJlYWQgaXMgdW5kb25lICovCitleHRlcm4gc3NpemVfdCBzdHJidWZfcmVhZChzdHJ1Y3Qgc3RyYnVmICosIGludCBmZCwgc2l6ZV90IGhpbnQpOworZXh0ZXJuIGludCBzdHJidWZfcmVhZF9maWxlKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgaGludCk7CitleHRlcm4gaW50IHN0cmJ1Zl9yZWFkbGluayhzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGF0aCwgc2l6ZV90IGhpbnQpOworCitleHRlcm4gaW50IHN0cmJ1Zl9nZXRsaW5lKHN0cnVjdCBzdHJidWYgKiwgRklMRSAqLCBpbnQpOworCitleHRlcm4gdm9pZCBzdHJpcHNwYWNlKHN0cnVjdCBzdHJidWYgKmJ1ZiwgaW50IHNraXBfY29tbWVudHMpOworZXh0ZXJuIGludCBsYXVuY2hfZWRpdG9yKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdHJidWYgKmJ1ZmZlciwgY29uc3QgY2hhciAqY29uc3QgKmVudik7CisKK2V4dGVybiBpbnQgc3RyYnVmX2JyYW5jaG5hbWUoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGludCBzdHJidWZfY2hlY2tfYnJhbmNoX3JlZihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZiAvKiBTVFJCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N0cmluZy5jIGIvdG9vbHMvcGVyZi91dGlsL3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzNjMGMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvc3RyaW5nLmMKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgInN0cmluZy5oIgorCitzdGF0aWMgaW50IGhleChjaGFyIGNoKQoreworCWlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKwkJcmV0dXJuIGNoIC0gJzAnOworCWlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkKKwkJcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisJaWYgKChjaCA+PSAnQScpICYmIChjaCA8PSAnRicpKQorCQlyZXR1cm4gY2ggLSAnQScgKyAxMDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBXaGlsZSB3ZSBmaW5kIG5pY2UgaGV4IGNoYXJzLCBidWlsZCBhIGxvbmdfdmFsLgorICogUmV0dXJuIG51bWJlciBvZiBjaGFycyBwcm9jZXNzZWQuCisgKi8KK2ludCBoZXgydTY0KGNvbnN0IGNoYXIgKnB0ciwgX191NjQgKmxvbmdfdmFsKQoreworCWNvbnN0IGNoYXIgKnAgPSBwdHI7CisJKmxvbmdfdmFsID0gMDsKKworCXdoaWxlICgqcCkgeworCQljb25zdCBpbnQgaGV4X3ZhbCA9IGhleCgqcCk7CisKKwkJaWYgKGhleF92YWwgPCAwKQorCQkJYnJlYWs7CisKKwkJKmxvbmdfdmFsID0gKCpsb25nX3ZhbCA8PCA0KSB8IGhleF92YWw7CisJCXArKzsKKwl9CisKKwlyZXR1cm4gcCAtIHB0cjsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zdHJpbmcuaCBiL3Rvb2xzL3BlcmYvdXRpbC9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjgxMmMxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N0cmluZy5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfUEVSRl9TVFJJTkdfSF8KKyNkZWZpbmUgX1BFUkZfU1RSSU5HX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgaGV4MnU2NChjb25zdCBjaGFyICpwdHIsIF9fdTY0ICp2YWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWE1NWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCkBAIC0wLDAgKzEsNjQxIEBACisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgIi4uL3BlcmYuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzeW1ib2wuaCIKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKworY29uc3QgY2hhciAqc3ltX2hpc3RfZmlsdGVyOworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltYm9sX19uZXcoX191NjQgc3RhcnQsIF9fdTY0IGxlbiwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBwcml2X3NpemUsCisJCQkJICBfX3U2NCBvYmpfc3RhcnQsIGludCB2ZXJib3NlKQoreworCXNpemVfdCBuYW1lbGVuID0gc3RybGVuKG5hbWUpICsgMTsKKwlzdHJ1Y3Qgc3ltYm9sICpzZWxmID0gY2FsbG9jKDEsIHByaXZfc2l6ZSArIHNpemVvZigqc2VsZikgKyBuYW1lbGVuKTsKKworCWlmICghc2VsZikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodmVyYm9zZSA+PSAyKQorCQlwcmludGYoIm5ldyBzeW1ib2w6ICUwMTZMeCBbJTA4bHhdOiAlcywgaGlzdDogJXAsIG9ial9zdGFydDogJXBcbiIsCisJCQkoX191NjQpc3RhcnQsICh1bnNpZ25lZCBsb25nKWxlbiwgbmFtZSwgc2VsZi0+aGlzdCwgKHZvaWQgKikodW5zaWduZWQgbG9uZylvYmpfc3RhcnQpOworCisJc2VsZi0+b2JqX3N0YXJ0PSBvYmpfc3RhcnQ7CisJc2VsZi0+aGlzdCA9IE5VTEw7CisJc2VsZi0+aGlzdF9zdW0gPSAwOworCisJaWYgKHN5bV9oaXN0X2ZpbHRlciAmJiAhc3RyY21wKG5hbWUsIHN5bV9oaXN0X2ZpbHRlcikpCisJCXNlbGYtPmhpc3QgPSBjYWxsb2Moc2l6ZW9mKF9fdTY0KSwgbGVuKTsKKworCWlmIChwcml2X3NpemUpIHsKKwkJbWVtc2V0KHNlbGYsIDAsIHByaXZfc2l6ZSk7CisJCXNlbGYgPSAoKHZvaWQgKilzZWxmKSArIHByaXZfc2l6ZTsKKwl9CisJc2VsZi0+c3RhcnQgPSBzdGFydDsKKwlzZWxmLT5lbmQgICA9IHN0YXJ0ICsgbGVuIC0gMTsKKwltZW1jcHkoc2VsZi0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisKKwlyZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQgc3ltYm9sX19kZWxldGUoc3RydWN0IHN5bWJvbCAqc2VsZiwgdW5zaWduZWQgaW50IHByaXZfc2l6ZSkKK3sKKwlmcmVlKCgodm9pZCAqKXNlbGYpIC0gcHJpdl9zaXplKTsKK30KKworc3RhdGljIHNpemVfdCBzeW1ib2xfX2ZwcmludGYoc3RydWN0IHN5bWJvbCAqc2VsZiwgRklMRSAqZnApCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIgJWxseC0lbGx4ICVzXG4iLAorCQkgICAgICAgc2VsZi0+c3RhcnQsIHNlbGYtPmVuZCwgc2VsZi0+bmFtZSk7Cit9CisKK3N0cnVjdCBkc28gKmRzb19fbmV3KGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBzeW1fcHJpdl9zaXplKQoreworCXN0cnVjdCBkc28gKnNlbGYgPSBtYWxsb2Moc2l6ZW9mKCpzZWxmKSArIHN0cmxlbihuYW1lKSArIDEpOworCisJaWYgKHNlbGYgIT0gTlVMTCkgeworCQlzdHJjcHkoc2VsZi0+bmFtZSwgbmFtZSk7CisJCXNlbGYtPnN5bXMgPSBSQl9ST09UOworCQlzZWxmLT5zeW1fcHJpdl9zaXplID0gc3ltX3ByaXZfc2l6ZTsKKwkJc2VsZi0+ZmluZF9zeW1ib2wgPSBkc29fX2ZpbmRfc3ltYm9sOworCX0KKworCXJldHVybiBzZWxmOworfQorCitzdGF0aWMgdm9pZCBkc29fX2RlbGV0ZV9zeW1ib2xzKHN0cnVjdCBkc28gKnNlbGYpCit7CisJc3RydWN0IHN5bWJvbCAqcG9zOworCXN0cnVjdCByYl9ub2RlICpuZXh0ID0gcmJfZmlyc3QoJnNlbGYtPnN5bXMpOworCisJd2hpbGUgKG5leHQpIHsKKwkJcG9zID0gcmJfZW50cnkobmV4dCwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSk7CisJCW5leHQgPSByYl9uZXh0KCZwb3MtPnJiX25vZGUpOworCQlyYl9lcmFzZSgmcG9zLT5yYl9ub2RlLCAmc2VsZi0+c3ltcyk7CisJCXN5bWJvbF9fZGVsZXRlKHBvcywgc2VsZi0+c3ltX3ByaXZfc2l6ZSk7CisJfQorfQorCit2b2lkIGRzb19fZGVsZXRlKHN0cnVjdCBkc28gKnNlbGYpCit7CisJZHNvX19kZWxldGVfc3ltYm9scyhzZWxmKTsKKwlmcmVlKHNlbGYpOworfQorCitzdGF0aWMgdm9pZCBkc29fX2luc2VydF9zeW1ib2woc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzZWxmLT5zeW1zLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJY29uc3QgX191NjQgaXAgPSBzeW0tPnN0YXJ0OworCXN0cnVjdCBzeW1ib2wgKnM7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSk7CisJCWlmIChpcCA8IHMtPnN0YXJ0KQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCX0KKwlyYl9saW5rX25vZGUoJnN5bS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnN5bS0+cmJfbm9kZSwgJnNlbGYtPnN5bXMpOworfQorCitzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpbmRfc3ltYm9sKHN0cnVjdCBkc28gKnNlbGYsIF9fdTY0IGlwKQoreworCXN0cnVjdCByYl9ub2RlICpuOworCisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwluID0gc2VsZi0+c3ltcy5yYl9ub2RlOworCisJd2hpbGUgKG4pIHsKKwkJc3RydWN0IHN5bWJvbCAqcyA9IHJiX2VudHJ5KG4sIHN0cnVjdCBzeW1ib2wsIHJiX25vZGUpOworCisJCWlmIChpcCA8IHMtPnN0YXJ0KQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGlwID4gcy0+ZW5kKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gczsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc2l6ZV90IGRzb19fZnByaW50ZihzdHJ1Y3QgZHNvICpzZWxmLCBGSUxFICpmcCkKK3sKKwlzaXplX3QgcmV0ID0gZnByaW50ZihmcCwgImRzbzogJXNcbiIsIHNlbGYtPm5hbWUpOworCisJc3RydWN0IHJiX25vZGUgKm5kOworCWZvciAobmQgPSByYl9maXJzdCgmc2VsZi0+c3ltcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCBzeW1ib2wgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKKwkJcmV0ICs9IHN5bWJvbF9fZnByaW50Zihwb3MsIGZwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpzZWxmLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQgdmVyYm9zZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQsICpwcmV2bmQ7CisJY2hhciAqbGluZSA9IE5VTEw7CisJc2l6ZV90IG47CisJRklMRSAqZmlsZSA9IGZvcGVuKCIvcHJvYy9rYWxsc3ltcyIsICJyIik7CisKKwlpZiAoZmlsZSA9PSBOVUxMKQorCQlnb3RvIG91dF9mYWlsdXJlOworCisJd2hpbGUgKCFmZW9mKGZpbGUpKSB7CisJCV9fdTY0IHN0YXJ0OworCQlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJCWludCBsaW5lX2xlbiwgbGVuOworCQljaGFyIHN5bWJvbF90eXBlOworCisJCWxpbmVfbGVuID0gZ2V0bGluZSgmbGluZSwgJm4sIGZpbGUpOworCQlpZiAobGluZV9sZW4gPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKCFsaW5lKQorCQkJZ290byBvdXRfZmFpbHVyZTsKKworCQlsaW5lWy0tbGluZV9sZW5dID0gJ1wwJzsgLyogXG4gKi8KKworCQlsZW4gPSBoZXgydTY0KGxpbmUsICZzdGFydCk7CisKKwkJbGVuKys7CisJCWlmIChsZW4gKyAyID49IGxpbmVfbGVuKQorCQkJY29udGludWU7CisKKwkJc3ltYm9sX3R5cGUgPSB0b3VwcGVyKGxpbmVbbGVuXSk7CisJCS8qCisJCSAqIFdlJ3JlIGludGVyZXN0ZWQgb25seSBpbiBjb2RlICgnVCdleHQpCisJCSAqLworCQlpZiAoc3ltYm9sX3R5cGUgIT0gJ1QnICYmIHN5bWJvbF90eXBlICE9ICdXJykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBXZWxsIGZpeCB1cCB0aGUgZW5kIGxhdGVyLCB3aGVuIHdlIGhhdmUgYWxsIHNvcnRlZC4KKwkJICovCisJCXN5bSA9IHN5bWJvbF9fbmV3KHN0YXJ0LCAweGRlYWQsIGxpbmUgKyBsZW4gKyAyLAorCQkJCSAgc2VsZi0+c3ltX3ByaXZfc2l6ZSwgMCwgdmVyYm9zZSk7CisKKwkJaWYgKHN5bSA9PSBOVUxMKQorCQkJZ290byBvdXRfZGVsZXRlX2xpbmU7CisKKwkJaWYgKGZpbHRlciAmJiBmaWx0ZXIoc2VsZiwgc3ltKSkKKwkJCXN5bWJvbF9fZGVsZXRlKHN5bSwgc2VsZi0+c3ltX3ByaXZfc2l6ZSk7CisJCWVsc2UKKwkJCWRzb19faW5zZXJ0X3N5bWJvbChzZWxmLCBzeW0pOworCX0KKworCS8qCisJICogTm93IHRoYXQgd2UgaGF2ZSBhbGwgc29ydGVkIG91dCwganVzdCBzZXQgdGhlIC0+ZW5kIG9mIGFsbAorCSAqIHN5bWJvbHMKKwkgKi8KKwlwcmV2bmQgPSByYl9maXJzdCgmc2VsZi0+c3ltcyk7CisKKwlpZiAocHJldm5kID09IE5VTEwpCisJCWdvdG8gb3V0X2RlbGV0ZV9saW5lOworCisJZm9yIChuZCA9IHJiX25leHQocHJldm5kKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJc3RydWN0IHN5bWJvbCAqcHJldiA9IHJiX2VudHJ5KHByZXZuZCwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSksCisJCQkgICAgICAqY3VyciA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKKworCQlwcmV2LT5lbmQgPSBjdXJyLT5zdGFydCAtIDE7CisJCXByZXZuZCA9IG5kOworCX0KKworCWZyZWUobGluZSk7CisJZmNsb3NlKGZpbGUpOworCisJcmV0dXJuIDA7CisKK291dF9kZWxldGVfbGluZToKKwlmcmVlKGxpbmUpOworb3V0X2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGRzb19fbG9hZF9wZXJmX21hcChzdHJ1Y3QgZHNvICpzZWxmLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQgdmVyYm9zZSkKK3sKKwljaGFyICpsaW5lID0gTlVMTDsKKwlzaXplX3QgbjsKKwlGSUxFICpmaWxlOworCWludCBucl9zeW1zID0gMDsKKworCWZpbGUgPSBmb3BlbihzZWxmLT5uYW1lLCAiciIpOworCWlmIChmaWxlID09IE5VTEwpCisJCWdvdG8gb3V0X2ZhaWx1cmU7CisKKwl3aGlsZSAoIWZlb2YoZmlsZSkpIHsKKwkJX191NjQgc3RhcnQsIHNpemU7CisJCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwkJaW50IGxpbmVfbGVuLCBsZW47CisKKwkJbGluZV9sZW4gPSBnZXRsaW5lKCZsaW5lLCAmbiwgZmlsZSk7CisJCWlmIChsaW5lX2xlbiA8IDApCisJCQlicmVhazsKKworCQlpZiAoIWxpbmUpCisJCQlnb3RvIG91dF9mYWlsdXJlOworCisJCWxpbmVbLS1saW5lX2xlbl0gPSAnXDAnOyAvKiBcbiAqLworCisJCWxlbiA9IGhleDJ1NjQobGluZSwgJnN0YXJ0KTsKKworCQlsZW4rKzsKKwkJaWYgKGxlbiArIDIgPj0gbGluZV9sZW4pCisJCQljb250aW51ZTsKKworCQlsZW4gKz0gaGV4MnU2NChsaW5lICsgbGVuLCAmc2l6ZSk7CisKKwkJbGVuKys7CisJCWlmIChsZW4gKyAyID49IGxpbmVfbGVuKQorCQkJY29udGludWU7CisKKwkJc3ltID0gc3ltYm9sX19uZXcoc3RhcnQsIHNpemUsIGxpbmUgKyBsZW4sCisJCQkJICBzZWxmLT5zeW1fcHJpdl9zaXplLCBzdGFydCwgdmVyYm9zZSk7CisKKwkJaWYgKHN5bSA9PSBOVUxMKQorCQkJZ290byBvdXRfZGVsZXRlX2xpbmU7CisKKwkJaWYgKGZpbHRlciAmJiBmaWx0ZXIoc2VsZiwgc3ltKSkKKwkJCXN5bWJvbF9fZGVsZXRlKHN5bSwgc2VsZi0+c3ltX3ByaXZfc2l6ZSk7CisJCWVsc2UgeworCQkJZHNvX19pbnNlcnRfc3ltYm9sKHNlbGYsIHN5bSk7CisJCQlucl9zeW1zKys7CisJCX0KKwl9CisKKwlmcmVlKGxpbmUpOworCWZjbG9zZShmaWxlKTsKKworCXJldHVybiBucl9zeW1zOworCitvdXRfZGVsZXRlX2xpbmU6CisJZnJlZShsaW5lKTsKK291dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworLyoqCisgKiBlbGZfc3ltdGFiX19mb3JfZWFjaF9zeW1ib2wgLSBpdGVyYXRlIHRocnUgYWxsIHRoZSBzeW1ib2xzCisgKgorICogQHNlbGY6IHN0cnVjdCBlbGZfc3ltdGFiIGluc3RhbmNlIHRvIGl0ZXJhdGUKKyAqIEBpbmRleDogdWludDMyX3QgaW5kZXgKKyAqIEBzeW06IEdFbGZfU3ltIGl0ZXJhdG9yCisgKi8KKyNkZWZpbmUgZWxmX3N5bXRhYl9fZm9yX2VhY2hfc3ltYm9sKHN5bXMsIG5yX3N5bXMsIGluZGV4LCBzeW0pIFwKKwlmb3IgKGluZGV4ID0gMCwgZ2VsZl9nZXRzeW0oc3ltcywgaW5kZXgsICZzeW0pO1wKKwkgICAgIGluZGV4IDwgbnJfc3ltczsgXAorCSAgICAgaW5kZXgrKywgZ2VsZl9nZXRzeW0oc3ltcywgaW5kZXgsICZzeW0pKQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZWxmX3N5bV9fdHlwZShjb25zdCBHRWxmX1N5bSAqc3ltKQoreworCXJldHVybiBHRUxGX1NUX1RZUEUoc3ltLT5zdF9pbmZvKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZWxmX3N5bV9faXNfZnVuY3Rpb24oY29uc3QgR0VsZl9TeW0gKnN5bSkKK3sKKwlyZXR1cm4gZWxmX3N5bV9fdHlwZShzeW0pID09IFNUVF9GVU5DICYmCisJICAgICAgIHN5bS0+c3RfbmFtZSAhPSAwICYmCisJICAgICAgIHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGICYmCisJICAgICAgIHN5bS0+c3Rfc2l6ZSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVsZl9zeW1fX25hbWUoY29uc3QgR0VsZl9TeW0gKnN5bSwKKwkJCQkJY29uc3QgRWxmX0RhdGEgKnN5bXN0cnMpCit7CisJcmV0dXJuIHN5bXN0cnMtPmRfYnVmICsgc3ltLT5zdF9uYW1lOworfQorCitzdGF0aWMgRWxmX1NjbiAqZWxmX3NlY3Rpb25fYnlfbmFtZShFbGYgKmVsZiwgR0VsZl9FaGRyICplcCwKKwkJCQkgICAgR0VsZl9TaGRyICpzaHAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIHNpemVfdCAqaW5kZXgpCit7CisJRWxmX1NjbiAqc2VjID0gTlVMTDsKKwlzaXplX3QgY250ID0gMTsKKworCXdoaWxlICgoc2VjID0gZWxmX25leHRzY24oZWxmLCBzZWMpKSAhPSBOVUxMKSB7CisJCWNoYXIgKnN0cjsKKworCQlnZWxmX2dldHNoZHIoc2VjLCBzaHApOworCQlzdHIgPSBlbGZfc3RycHRyKGVsZiwgZXAtPmVfc2hzdHJuZHgsIHNocC0+c2hfbmFtZSk7CisJCWlmICghc3RyY21wKG5hbWUsIHN0cikpIHsKKwkJCWlmIChpbmRleCkKKwkJCQkqaW5kZXggPSBjbnQ7CisJCQlicmVhazsKKwkJfQorCQkrK2NudDsKKwl9CisKKwlyZXR1cm4gc2VjOworfQorCisjZGVmaW5lIGVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWwocmVsZGF0YSwgcG9zLCBwb3NfbWVtLCBpZHgsIG5yX2VudHJpZXMpIFwKKwlmb3IgKGlkeCA9IDAsIHBvcyA9IGdlbGZfZ2V0cmVsKHJlbGRhdGEsIDAsICZwb3NfbWVtKTsgXAorCSAgICAgaWR4IDwgbnJfZW50cmllczsgXAorCSAgICAgKytpZHgsIHBvcyA9IGdlbGZfZ2V0cmVsKHJlbGRhdGEsIGlkeCwgJnBvc19tZW0pKQorCisjZGVmaW5lIGVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWxhKHJlbGRhdGEsIHBvcywgcG9zX21lbSwgaWR4LCBucl9lbnRyaWVzKSBcCisJZm9yIChpZHggPSAwLCBwb3MgPSBnZWxmX2dldHJlbGEocmVsZGF0YSwgMCwgJnBvc19tZW0pOyBcCisJICAgICBpZHggPCBucl9lbnRyaWVzOyBcCisJICAgICArK2lkeCwgcG9zID0gZ2VsZl9nZXRyZWxhKHJlbGRhdGEsIGlkeCwgJnBvc19tZW0pKQorCitzdGF0aWMgaW50IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzdHJ1Y3QgIGRzbyAqc2VsZiwgRWxmICplbGYsCisJCQkJICAgICAgIEdFbGZfRWhkciAqZWhkciwgRWxmX1NjbiAqc2NuX2R5bnN5bSwKKwkJCQkgICAgICAgR0VsZl9TaGRyICpzaGRyX2R5bnN5bSwKKwkJCQkgICAgICAgc2l6ZV90IGR5bnN5bV9pZHgsIGludCB2ZXJib3NlKQoreworCXVpbnQzMl90IG5yX3JlbF9lbnRyaWVzLCBpZHg7CisJR0VsZl9TeW0gc3ltOworCV9fdTY0IHBsdF9vZmZzZXQ7CisJR0VsZl9TaGRyIHNoZHJfcGx0OworCXN0cnVjdCBzeW1ib2wgKmY7CisJR0VsZl9TaGRyIHNoZHJfcmVsX3BsdDsKKwlFbGZfRGF0YSAqcmVsZGF0YSwgKnN5bXMsICpzeW1zdHJzOworCUVsZl9TY24gKnNjbl9wbHRfcmVsLCAqc2NuX3N5bXN0cnM7CisJY2hhciBzeW1wbHRuYW1lWzEwMjRdOworCWludCBuciA9IDAsIHN5bWlkeDsKKworCXNjbl9wbHRfcmVsID0gZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsIGVoZHIsICZzaGRyX3JlbF9wbHQsCisJCQkJCSAgIi5yZWxhLnBsdCIsIE5VTEwpOworCWlmIChzY25fcGx0X3JlbCA9PSBOVUxMKSB7CisJCXNjbl9wbHRfcmVsID0gZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsIGVoZHIsICZzaGRyX3JlbF9wbHQsCisJCQkJCQkgICIucmVsLnBsdCIsIE5VTEwpOworCQlpZiAoc2NuX3BsdF9yZWwgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChzaGRyX3JlbF9wbHQuc2hfbGluayAhPSBkeW5zeW1faWR4KQorCQlyZXR1cm4gMDsKKworCWlmIChlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgZWhkciwgJnNoZHJfcGx0LCAiLnBsdCIsIE5VTEwpID09IE5VTEwpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBGZXRjaCB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIHRvIGZpbmQgdGhlIGluZGV4ZXMgdG8gdGhlIEdPVAorCSAqIGFuZCB0aGUgc3ltYm9scyBpbiB0aGUgLmR5bnN5bSB0aGV5IHJlZmVyIHRvLgorCSAqLworCXJlbGRhdGEgPSBlbGZfZ2V0ZGF0YShzY25fcGx0X3JlbCwgTlVMTCk7CisJaWYgKHJlbGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc3ltcyA9IGVsZl9nZXRkYXRhKHNjbl9keW5zeW0sIE5VTEwpOworCWlmIChzeW1zID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNjbl9zeW1zdHJzID0gZWxmX2dldHNjbihlbGYsIHNoZHJfZHluc3ltLT5zaF9saW5rKTsKKwlpZiAoc2NuX3N5bXN0cnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc3ltc3RycyA9IGVsZl9nZXRkYXRhKHNjbl9zeW1zdHJzLCBOVUxMKTsKKwlpZiAoc3ltc3RycyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlucl9yZWxfZW50cmllcyA9IHNoZHJfcmVsX3BsdC5zaF9zaXplIC8gc2hkcl9yZWxfcGx0LnNoX2VudHNpemU7CisJcGx0X29mZnNldCA9IHNoZHJfcGx0LnNoX29mZnNldDsKKworCWlmIChzaGRyX3JlbF9wbHQuc2hfdHlwZSA9PSBTSFRfUkVMQSkgeworCQlHRWxmX1JlbGEgcG9zX21lbSwgKnBvczsKKworCQllbGZfc2VjdGlvbl9fZm9yX2VhY2hfcmVsYShyZWxkYXRhLCBwb3MsIHBvc19tZW0sIGlkeCwKKwkJCQkJICAgbnJfcmVsX2VudHJpZXMpIHsKKwkJCXN5bWlkeCA9IEdFTEZfUl9TWU0ocG9zLT5yX2luZm8pOworCQkJcGx0X29mZnNldCArPSBzaGRyX3BsdC5zaF9lbnRzaXplOworCQkJZ2VsZl9nZXRzeW0oc3ltcywgc3ltaWR4LCAmc3ltKTsKKwkJCXNucHJpbnRmKHN5bXBsdG5hbWUsIHNpemVvZihzeW1wbHRuYW1lKSwKKwkJCQkgIiVzQHBsdCIsIGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3RycykpOworCisJCQlmID0gc3ltYm9sX19uZXcocGx0X29mZnNldCwgc2hkcl9wbHQuc2hfZW50c2l6ZSwKKwkJCQkJc3ltcGx0bmFtZSwgc2VsZi0+c3ltX3ByaXZfc2l6ZSwgMCwgdmVyYm9zZSk7CisJCQlpZiAoIWYpCisJCQkJcmV0dXJuIC0xOworCisJCQlkc29fX2luc2VydF9zeW1ib2woc2VsZiwgZik7CisJCQkrK25yOworCQl9CisJfSBlbHNlIGlmIChzaGRyX3JlbF9wbHQuc2hfdHlwZSA9PSBTSFRfUkVMKSB7CisJCUdFbGZfUmVsIHBvc19tZW0sICpwb3M7CisJCWVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWwocmVsZGF0YSwgcG9zLCBwb3NfbWVtLCBpZHgsCisJCQkJCSAgbnJfcmVsX2VudHJpZXMpIHsKKwkJCXN5bWlkeCA9IEdFTEZfUl9TWU0ocG9zLT5yX2luZm8pOworCQkJcGx0X29mZnNldCArPSBzaGRyX3BsdC5zaF9lbnRzaXplOworCQkJZ2VsZl9nZXRzeW0oc3ltcywgc3ltaWR4LCAmc3ltKTsKKwkJCXNucHJpbnRmKHN5bXBsdG5hbWUsIHNpemVvZihzeW1wbHRuYW1lKSwKKwkJCQkgIiVzQHBsdCIsIGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3RycykpOworCisJCQlmID0gc3ltYm9sX19uZXcocGx0X29mZnNldCwgc2hkcl9wbHQuc2hfZW50c2l6ZSwKKwkJCQkJc3ltcGx0bmFtZSwgc2VsZi0+c3ltX3ByaXZfc2l6ZSwgMCwgdmVyYm9zZSk7CisJCQlpZiAoIWYpCisJCQkJcmV0dXJuIC0xOworCisJCQlkc29fX2luc2VydF9zeW1ib2woc2VsZiwgZik7CisJCQkrK25yOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVE9ETzogVGhlcmUgYXJlIHN0aWxsIG9uZSBtb3JlIHNoZHJfcmVsX3BsdC5zaF90eXBlCisJCSAqIEkgaGF2ZSB0byBpbnZlc3RpZ2F0ZSwgYnV0IHByb2JhYmx5IHNob3VsZCBiZSBpZ25vcmVkLgorCQkgKi8KKwl9CisKKwlyZXR1cm4gbnI7Cit9CisKK3N0YXRpYyBpbnQgZHNvX19sb2FkX3N5bShzdHJ1Y3QgZHNvICpzZWxmLCBpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwgaW50IHZlcmJvc2UpCit7CisJRWxmX0RhdGEgKnN5bXN0cnM7CisJdWludDMyX3QgbnJfc3ltczsKKwlpbnQgZXJyID0gLTE7CisJdWludDMyX3QgaW5kZXg7CisJR0VsZl9FaGRyIGVoZHI7CisJR0VsZl9TaGRyIHNoZHI7CisJRWxmX0RhdGEgKnN5bXM7CisJR0VsZl9TeW0gc3ltOworCUVsZl9TY24gKnNlYywgKnNlY19keW5zeW07CisJRWxmICplbGY7CisJc2l6ZV90IGR5bnN5bV9pZHg7CisJaW50IG5yID0gMDsKKworCWVsZiA9IGVsZl9iZWdpbihmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKKwlpZiAoZWxmID09IE5VTEwpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgcmVhZCAlcyBFTEYgZmlsZS5cbiIsCisJCQkJX19mdW5jX18sIG5hbWUpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwlpZiAoZ2VsZl9nZXRlaGRyKGVsZiwgJmVoZHIpID09IE5VTEwpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgZ2V0IGVsZiBoZWFkZXIuXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0X2VsZl9lbmQ7CisJfQorCisJLyoKKwkgKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSAuZHluc3ltLCBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlCisJICogLnBsdCwgc3ludGhlc2l6aW5nIGl0cyBzeW1ib2xzLCB0aGF0IGFyZW4ndCBvbiB0aGUgc3ltdGFicyAoYmUgaXQKKwkgKiAuZHluc3ltIG9yIC5zeW10YWIpCisJICovCisJc2VjX2R5bnN5bSA9IGVsZl9zZWN0aW9uX2J5X25hbWUoZWxmLCAmZWhkciwgJnNoZHIsCisJCQkJCSAiLmR5bnN5bSIsICZkeW5zeW1faWR4KTsKKwlpZiAoc2VjX2R5bnN5bSAhPSBOVUxMKSB7CisJCW5yID0gZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHNlbGYsIGVsZiwgJmVoZHIsCisJCQkJCQkgc2VjX2R5bnN5bSwgJnNoZHIsCisJCQkJCQkgZHluc3ltX2lkeCwgdmVyYm9zZSk7CisJCWlmIChuciA8IDApCisJCQlnb3RvIG91dF9lbGZfZW5kOworCX0KKworCS8qCisJICogQnV0IGlmIHdlIGhhdmUgYSBmdWxsIC5zeW10YWIgKHRoYXQgaXMgYSBzdXBlcnNldCBvZiAuZHluc3ltKSB3ZQorCSAqIHNob3VsZCBhZGQgdGhlIHN5bWJvbHMgbm90IGluIHRoZSAuZHluc3luCisJICovCisJc2VjID0gZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmc2hkciwgIi5zeW10YWIiLCBOVUxMKTsKKwlpZiAoc2VjID09IE5VTEwpIHsKKwkJaWYgKHNlY19keW5zeW0gPT0gTlVMTCkKKwkJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwkJc2VjID0gc2VjX2R5bnN5bTsKKwkJZ2VsZl9nZXRzaGRyKHNlYywgJnNoZHIpOworCX0KKworCXN5bXMgPSBlbGZfZ2V0ZGF0YShzZWMsIE5VTEwpOworCWlmIChzeW1zID09IE5VTEwpCisJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwlzZWMgPSBlbGZfZ2V0c2NuKGVsZiwgc2hkci5zaF9saW5rKTsKKwlpZiAoc2VjID09IE5VTEwpCisJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwlzeW1zdHJzID0gZWxmX2dldGRhdGEoc2VjLCBOVUxMKTsKKwlpZiAoc3ltc3RycyA9PSBOVUxMKQorCQlnb3RvIG91dF9lbGZfZW5kOworCisJbnJfc3ltcyA9IHNoZHIuc2hfc2l6ZSAvIHNoZHIuc2hfZW50c2l6ZTsKKworCW1lbXNldCgmc3ltLCAwLCBzaXplb2Yoc3ltKSk7CisKKwllbGZfc3ltdGFiX19mb3JfZWFjaF9zeW1ib2woc3ltcywgbnJfc3ltcywgaW5kZXgsIHN5bSkgeworCQlzdHJ1Y3Qgc3ltYm9sICpmOworCQlfX3U2NCBvYmpfc3RhcnQ7CisKKwkJaWYgKCFlbGZfc3ltX19pc19mdW5jdGlvbigmc3ltKSkKKwkJCWNvbnRpbnVlOworCisJCXNlYyA9IGVsZl9nZXRzY24oZWxmLCBzeW0uc3Rfc2huZHgpOworCQlpZiAoIXNlYykKKwkJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwkJZ2VsZl9nZXRzaGRyKHNlYywgJnNoZHIpOworCQlvYmpfc3RhcnQgPSBzeW0uc3RfdmFsdWU7CisKKwkJc3ltLnN0X3ZhbHVlIC09IHNoZHIuc2hfYWRkciAtIHNoZHIuc2hfb2Zmc2V0OworCisJCWYgPSBzeW1ib2xfX25ldyhzeW0uc3RfdmFsdWUsIHN5bS5zdF9zaXplLAorCQkJCWVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3RycyksCisJCQkJc2VsZi0+c3ltX3ByaXZfc2l6ZSwgb2JqX3N0YXJ0LCB2ZXJib3NlKTsKKwkJaWYgKCFmKQorCQkJZ290byBvdXRfZWxmX2VuZDsKKworCQlpZiAoZmlsdGVyICYmIGZpbHRlcihzZWxmLCBmKSkKKwkJCXN5bWJvbF9fZGVsZXRlKGYsIHNlbGYtPnN5bV9wcml2X3NpemUpOworCQllbHNlIHsKKwkJCWRzb19faW5zZXJ0X3N5bWJvbChzZWxmLCBmKTsKKwkJCW5yKys7CisJCX0KKwl9CisKKwllcnIgPSBucjsKK291dF9lbGZfZW5kOgorCWVsZl9lbmQoZWxmKTsKK291dF9jbG9zZToKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKnNlbGYsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIsIGludCB2ZXJib3NlKQoreworCWludCBzaXplID0gc3RybGVuKHNlbGYtPm5hbWUpICsgc2l6ZW9mKCIvdXNyL2xpYi9kZWJ1ZyVzLmRlYnVnIik7CisJY2hhciAqbmFtZSA9IG1hbGxvYyhzaXplKTsKKwlpbnQgdmFyaWFudCA9IDA7CisJaW50IHJldCA9IC0xOworCWludCBmZDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHN0cm5jbXAoc2VsZi0+bmFtZSwgIi90bXAvcGVyZi0iLCAxMCkgPT0gMCkKKwkJcmV0dXJuIGRzb19fbG9hZF9wZXJmX21hcChzZWxmLCBmaWx0ZXIsIHZlcmJvc2UpOworCittb3JlOgorCWRvIHsKKwkJc3dpdGNoICh2YXJpYW50KSB7CisJCWNhc2UgMDogLyogRmVkb3JhICovCisJCQlzbnByaW50ZihuYW1lLCBzaXplLCAiL3Vzci9saWIvZGVidWclcy5kZWJ1ZyIsIHNlbGYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogVWJ1bnR1ICovCisJCQlzbnByaW50ZihuYW1lLCBzaXplLCAiL3Vzci9saWIvZGVidWclcyIsIHNlbGYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogU2FuZSBwZW9wbGUgKi8KKwkJCXNucHJpbnRmKG5hbWUsIHNpemUsICIlcyIsIHNlbGYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWdvdG8gb3V0OworCQl9CisJCXZhcmlhbnQrKzsKKworCQlmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOworCX0gd2hpbGUgKGZkIDwgMCk7CisKKwlyZXQgPSBkc29fX2xvYWRfc3ltKHNlbGYsIGZkLCBuYW1lLCBmaWx0ZXIsIHZlcmJvc2UpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogU29tZSBwZW9wbGUgc2VlbSB0byBoYXZlIGRlYnVnaW5mbyBmaWxlcyBfV0lUSE9VVF8gZGVidWcgaW5mbyE/IT8KKwkgKi8KKwlpZiAoIXJldCkKKwkJZ290byBtb3JlOworCitvdXQ6CisJZnJlZShuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKnZtbGludXgsCisJCQkgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIsIGludCB2ZXJib3NlKQoreworCWludCBlcnIsIGZkID0gb3Blbih2bWxpbnV4LCBPX1JET05MWSk7CisKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwllcnIgPSBkc29fX2xvYWRfc3ltKHNlbGYsIGZkLCB2bWxpbnV4LCBmaWx0ZXIsIHZlcmJvc2UpOworCWNsb3NlKGZkKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBkc29fX2xvYWRfa2VybmVsKHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKnZtbGludXgsCisJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwgaW50IHZlcmJvc2UpCit7CisJaW50IGVyciA9IC0xOworCisJaWYgKHZtbGludXgpCisJCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KHNlbGYsIHZtbGludXgsIGZpbHRlciwgdmVyYm9zZSk7CisKKwlpZiAoZXJyKQorCQllcnIgPSBkc29fX2xvYWRfa2FsbHN5bXMoc2VsZiwgZmlsdGVyLCB2ZXJib3NlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgc3ltYm9sX19pbml0KHZvaWQpCit7CisJZWxmX3ZlcnNpb24oRVZfQ1VSUkVOVCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmggYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxMjkyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9QRVJGX1NZTUJPTF8KKyNkZWZpbmUgX1BFUkZfU1lNQk9MXyAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImxpc3QuaCIKKyNpbmNsdWRlICJyYnRyZWUuaCIKKworc3RydWN0IHN5bWJvbCB7CisJc3RydWN0IHJiX25vZGUJcmJfbm9kZTsKKwlfX3U2NAkJc3RhcnQ7CisJX191NjQJCWVuZDsKKwlfX3U2NAkJb2JqX3N0YXJ0OworCV9fdTY0CQloaXN0X3N1bTsKKwlfX3U2NAkJKmhpc3Q7CisJY2hhcgkJbmFtZVswXTsKK307CisKK3N0cnVjdCBkc28geworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgcmJfcm9vdAkgc3ltczsKKwl1bnNpZ25lZCBpbnQJIHN5bV9wcml2X3NpemU7CisJc3RydWN0IHN5bWJvbCAgICAqKCpmaW5kX3N5bWJvbCkoc3RydWN0IGRzbyAqLCBfX3U2NCBpcCk7CisJY2hhcgkJIG5hbWVbMF07Cit9OworCitjb25zdCBjaGFyICpzeW1faGlzdF9maWx0ZXI7CisKK3R5cGVkZWYgaW50ICgqc3ltYm9sX2ZpbHRlcl90KShzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworCitzdHJ1Y3QgZHNvICpkc29fX25ldyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgc3ltX3ByaXZfc2l6ZSk7Cit2b2lkIGRzb19fZGVsZXRlKHN0cnVjdCBkc28gKnNlbGYpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmRzb19fc3ltX3ByaXYoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiAoKHZvaWQgKilzeW0pIC0gc2VsZi0+c3ltX3ByaXZfc2l6ZTsKK30KKworc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpzZWxmLCBfX3U2NCBpcCk7CisKK2ludCBkc29fX2xvYWRfa2VybmVsKHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKnZtbGludXgsCisJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwgaW50IHZlcmJvc2UpOworaW50IGRzb19fbG9hZChzdHJ1Y3QgZHNvICpzZWxmLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQgdmVyYm9zZSk7CisKK3NpemVfdCBkc29fX2ZwcmludGYoc3RydWN0IGRzbyAqc2VsZiwgRklMRSAqZnApOworCit2b2lkIHN5bWJvbF9faW5pdCh2b2lkKTsKKyNlbmRpZiAvKiBfUEVSRl9TWU1CT0xfICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdXNhZ2UuYyBiL3Rvb2xzL3BlcmYvdXRpbC91c2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmJmOWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VzYWdlLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgInV0aWwuaCIKKworc3RhdGljIHZvaWQgcmVwb3J0KGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykKK3sKKwljaGFyIG1zZ1sxMDI0XTsKKwl2c25wcmludGYobXNnLCBzaXplb2YobXNnKSwgZXJyLCBwYXJhbXMpOworCWZwcmludGYoc3RkZXJyLCAiICVzJXNcbiIsIHByZWZpeCwgbXNnKTsKK30KKworc3RhdGljIE5PUkVUVVJOIHZvaWQgdXNhZ2VfYnVpbHRpbihjb25zdCBjaGFyICplcnIpCit7CisJZnByaW50ZihzdGRlcnIsICJcbiBVc2FnZTogJXNcbiIsIGVycik7CisJZXhpdCgxMjkpOworfQorCitzdGF0aWMgTk9SRVRVUk4gdm9pZCBkaWVfYnVpbHRpbihjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCXJlcG9ydCgiIEZhdGFsOiAiLCBlcnIsIHBhcmFtcyk7CisJZXhpdCgxMjgpOworfQorCitzdGF0aWMgdm9pZCBlcnJvcl9idWlsdGluKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJcmVwb3J0KCIgRXJyb3I6ICIsIGVyciwgcGFyYW1zKTsKK30KKworc3RhdGljIHZvaWQgd2Fybl9idWlsdGluKGNvbnN0IGNoYXIgKndhcm4sIHZhX2xpc3QgcGFyYW1zKQoreworCXJlcG9ydCgiIFdhcm5pbmc6ICIsIHdhcm4sIHBhcmFtcyk7Cit9CisKKy8qIElmIHdlIGFyZSBpbiBhIGRsb3BlbigpZWQgLnNvIHdyaXRlIHRvIGEgZ2xvYmFsIHZhcmlhYmxlIHdvdWxkIHNlZ2ZhdWx0CisgKiAodWdoKSwgc28ga2VlcCB0aGluZ3Mgc3RhdGljLiAqLworc3RhdGljIHZvaWQgKCp1c2FnZV9yb3V0aW5lKShjb25zdCBjaGFyICplcnIpIE5PUkVUVVJOID0gdXNhZ2VfYnVpbHRpbjsKK3N0YXRpYyB2b2lkICgqZGllX3JvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpIE5PUkVUVVJOID0gZGllX2J1aWx0aW47CitzdGF0aWMgdm9pZCAoKmVycm9yX3JvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpID0gZXJyb3JfYnVpbHRpbjsKK3N0YXRpYyB2b2lkICgqd2Fybl9yb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSA9IHdhcm5fYnVpbHRpbjsKKwordm9pZCBzZXRfZGllX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpIE5PUkVUVVJOKQoreworCWRpZV9yb3V0aW5lID0gcm91dGluZTsKK30KKwordm9pZCB1c2FnZShjb25zdCBjaGFyICplcnIpCit7CisJdXNhZ2Vfcm91dGluZShlcnIpOworfQorCit2b2lkIGRpZShjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwlkaWVfcm91dGluZShlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7Cit9CisKK2ludCBlcnJvcihjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwllcnJvcl9yb3V0aW5lKGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgd2FybmluZyhjb25zdCBjaGFyICp3YXJuLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisKKwl2YV9zdGFydChwYXJhbXMsIHdhcm4pOworCXdhcm5fcm91dGluZSh3YXJuLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1OTBhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKQEAgLTAsMCArMSw0MTAgQEAKKyNpZm5kZWYgR0lUX0NPTVBBVF9VVElMX0gKKyNkZWZpbmUgR0lUX0NPTVBBVF9VVElMX0gKKworI2RlZmluZSBfRklMRV9PRkZTRVRfQklUUyA2NAorCisjaWZuZGVmIEZMRVhfQVJSQVkKKy8qCisgKiBTZWUgaWYgb3VyIGNvbXBpbGVyIGlzIGtub3duIHRvIHN1cHBvcnQgZmxleGlibGUgYXJyYXkgbWVtYmVycy4KKyAqLworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyMgZGVmaW5lIEZMRVhfQVJSQVkgLyogZW1wdHkgKi8KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjIGlmIChfX0dOVUNfXyA+PSAzKQorIyAgZGVmaW5lIEZMRVhfQVJSQVkgLyogZW1wdHkgKi8KKyMgZWxzZQorIyAgZGVmaW5lIEZMRVhfQVJSQVkgMCAvKiBvbGRlciBHTlUgZXh0ZW5zaW9uICovCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIE90aGVyd2lzZSwgZGVmYXVsdCB0byBzYWZlciBidXQgYSBiaXQgd2FzdGVmdWwgdHJhZGl0aW9uYWwgc3R5bGUKKyAqLworI2lmbmRlZiBGTEVYX0FSUkFZCisjIGRlZmluZSBGTEVYX0FSUkFZIDEKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFRZUEVPRih4KSAoX190eXBlb2ZfXyh4KSkKKyNlbHNlCisjZGVmaW5lIFRZUEVPRih4KQorI2VuZGlmCisKKyNkZWZpbmUgTVNCKHgsIGJpdHMpICgoeCkgJiBUWVBFT0YoeCkofjBVTEwgPDwgKHNpemVvZih4KSAqIDggLSAoYml0cykpKSkKKyNkZWZpbmUgSEFTX01VTFRJX0JJVFMoaSkgICgoaSkgJiAoKGkpIC0gMSkpICAvKiBjaGVja3MgaWYgYW4gaW50ZWdlciBoYXMgbW9yZSB0aGFuIDEgYml0IHNldCAqLworCisvKiBBcHByb3hpbWF0aW9uIG9mIHRoZSBsZW5ndGggb2YgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0eXBlLiAqLworI2RlZmluZSBkZWNpbWFsX2xlbmd0aCh4KQkoKGludCkoc2l6ZW9mKHgpICogMi41NiArIDAuNSkgKyAxKQorCisjaWYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgICYmICFkZWZpbmVkKF9fVVNMQ19fKSAmJiAhZGVmaW5lZChfTV9VTklYKQorI2RlZmluZSBfWE9QRU5fU09VUkNFIDYwMCAvKiBnbGliYzIgYW5kIEFJWCA1LjNMIG5lZWQgNTAwLCBPcGVuQlNEIG5lZWRzIDYwMCBmb3IgU19JU0xOSygpICovCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgMSAvKiBBSVggNS4zTCBuZWVkcyB0aGlzICovCisjZW5kaWYKKyNkZWZpbmUgX0FMTF9TT1VSQ0UgMQorI2RlZmluZSBfR05VX1NPVVJDRSAxCisjZGVmaW5lIF9CU0RfU09VUkNFIDEKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8dXRpbWUuaD4KKyNpZm5kZWYgX19NSU5HVzMyX18KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmbmRlZiBOT19TWVNfU0VMRUNUX0gKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorI3VuZGVmIF9YT1BFTl9TT1VSQ0UKKyNpbmNsdWRlIDxncnAuaD4KKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA2MDAKKyNpbmNsdWRlICJjb21wYXQvY3lnd2luLmgiCisjZWxzZQorI3VuZGVmIF9BTExfU09VUkNFIC8qIEFJWCA1LjNMIGRlZmluZXMgYSBzdHJ1Y3QgbGlzdCB3aXRoIF9BTExfU09VUkNFLiAqLworI2luY2x1ZGUgPGdycC5oPgorI2RlZmluZSBfQUxMX1NPVVJDRSAxCisjZW5kaWYKKyNlbHNlIAkvKiBfX01JTkdXMzJfXyAqLworLyogcHVsbCBpbiBXaW5kb3dzIGNvbXBhdGliaWxpdHkgc3R1ZmYgKi8KKyNpbmNsdWRlICJjb21wYXQvbWluZ3cuaCIKKyNlbmRpZgkvKiBfX01JTkdXMzJfXyAqLworCisjaWZuZGVmIE5PX0lDT05WCisjaW5jbHVkZSA8aWNvbnYuaD4KKyNlbmRpZgorCisjaWZuZGVmIE5PX09QRU5TU0wKKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjZW5kaWYKKworLyogT24gbW9zdCBzeXN0ZW1zIDxsaW1pdHMuaD4gd291bGQgaGF2ZSBnaXZlbiB1cyB0aGlzLCBidXQKKyAqIG5vdCBvbiBzb21lIHN5c3RlbXMgKGUuZy4gR05VL0h1cmQpLgorICovCisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYIDQwOTYKKyNlbmRpZgorCisjaWZuZGVmIFBSSXVNQVgKKyNkZWZpbmUgUFJJdU1BWCAibGx1IgorI2VuZGlmCisKKyNpZm5kZWYgUFJJdTMyCisjZGVmaW5lIFBSSXUzMiAidSIKKyNlbmRpZgorCisjaWZuZGVmIFBSSXgzMgorI2RlZmluZSBQUkl4MzIgIngiCisjZW5kaWYKKworI2lmbmRlZiBQQVRIX1NFUAorI2RlZmluZSBQQVRIX1NFUCAnOicKKyNlbmRpZgorCisjaWZuZGVmIFNUUklQX0VYVEVOU0lPTgorI2RlZmluZSBTVFJJUF9FWFRFTlNJT04gIiIKKyNlbmRpZgorCisjaWZuZGVmIGhhc19kb3NfZHJpdmVfcHJlZml4CisjZGVmaW5lIGhhc19kb3NfZHJpdmVfcHJlZml4KHBhdGgpIDAKKyNlbmRpZgorCisjaWZuZGVmIGlzX2Rpcl9zZXAKKyNkZWZpbmUgaXNfZGlyX3NlcChjKSAoKGMpID09ICcvJykKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgTk9SRVRVUk4gX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKKyNlbHNlCisjZGVmaW5lIE5PUkVUVVJOCisjaWZuZGVmIF9fYXR0cmlidXRlX18KKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQorI2VuZGlmCisjZW5kaWYKKworLyogR2VuZXJhbCBoZWxwZXIgZnVuY3Rpb25zICovCitleHRlcm4gdm9pZCB1c2FnZShjb25zdCBjaGFyICplcnIpIE5PUkVUVVJOOworZXh0ZXJuIHZvaWQgZGllKGNvbnN0IGNoYXIgKmVyciwgLi4uKSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiBpbnQgZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIHZvaWQgd2FybmluZyhjb25zdCBjaGFyICplcnIsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK2V4dGVybiB2b2lkIHNldF9kaWVfcm91dGluZSh2b2lkICgqcm91dGluZSkoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykgTk9SRVRVUk4pOworCitleHRlcm4gaW50IHByZWZpeGNtcChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gdGltZV90IHRtX3RvX3RpbWVfdChjb25zdCBzdHJ1Y3QgdG0gKnRtKTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpza2lwX3ByZWZpeChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKHByZWZpeCk7CisJcmV0dXJuIHN0cm5jbXAoc3RyLCBwcmVmaXgsIGxlbikgPyBOVUxMIDogc3RyICsgbGVuOworfQorCisjaWYgZGVmaW5lZChOT19NTUFQKSB8fCBkZWZpbmVkKFVTRV9XSU4zMl9NTUFQKQorCisjaWZuZGVmIFBST1RfUkVBRAorI2RlZmluZSBQUk9UX1JFQUQgMQorI2RlZmluZSBQUk9UX1dSSVRFIDIKKyNkZWZpbmUgTUFQX1BSSVZBVEUgMQorI2RlZmluZSBNQVBfRkFJTEVEICgodm9pZCopLTEpCisjZW5kaWYKKworI2RlZmluZSBtbWFwIGdpdF9tbWFwCisjZGVmaW5lIG11bm1hcCBnaXRfbXVubWFwCitleHRlcm4gdm9pZCAqZ2l0X21tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LCBpbnQgZmxhZ3MsIGludCBmZCwgb2ZmX3Qgb2Zmc2V0KTsKK2V4dGVybiBpbnQgZ2l0X211bm1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCk7CisKKyNlbHNlIC8qIE5PX01NQVAgfHwgVVNFX1dJTjMyX01NQVAgKi8KKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNlbmRpZiAvKiBOT19NTUFQIHx8IFVTRV9XSU4zMl9NTUFQICovCisKKyNpZmRlZiBOT19NTUFQCisKKy8qIFRoaXMgdmFsdWUgbXVzdCBiZSBtdWx0aXBsZSBvZiAocGFnZXNpemUgKiAyKSAqLworI2RlZmluZSBERUZBVUxUX1BBQ0tFRF9HSVRfV0lORE9XX1NJWkUgKDEgKiAxMDI0ICogMTAyNCkKKworI2Vsc2UgLyogTk9fTU1BUCAqLworCisvKiBUaGlzIHZhbHVlIG11c3QgYmUgbXVsdGlwbGUgb2YgKHBhZ2VzaXplICogMikgKi8KKyNkZWZpbmUgREVGQVVMVF9QQUNLRURfR0lUX1dJTkRPV19TSVpFIFwKKwkoc2l6ZW9mKHZvaWQqKSA+PSA4IFwKKwkJPyAgMSAqIDEwMjQgKiAxMDI0ICogMTAyNCBcCisJCTogMzIgKiAxMDI0ICogMTAyNCkKKworI2VuZGlmIC8qIE5PX01NQVAgKi8KKworI2lmZGVmIE5PX1NUX0JMT0NLU19JTl9TVFJVQ1RfU1RBVAorI2RlZmluZSBvbl9kaXNrX2J5dGVzKHN0KSAoKHN0KS5zdF9zaXplKQorI2Vsc2UKKyNkZWZpbmUgb25fZGlza19ieXRlcyhzdCkgKChzdCkuc3RfYmxvY2tzICogNTEyKQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9QQUNLRURfR0lUX0xJTUlUIFwKKwkoKDEwMjRMICogMTAyNEwpICogKHNpemVvZih2b2lkKikgPj0gOCA/IDgxOTIgOiAyNTYpKQorCisjaWZkZWYgTk9fUFJFQUQKKyNkZWZpbmUgcHJlYWQgZ2l0X3ByZWFkCitleHRlcm4gc3NpemVfdCBnaXRfcHJlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KTsKKyNlbmRpZgorLyoKKyAqIEZvcndhcmQgZGVjbCB0aGF0IHdpbGwgcmVtaW5kIHVzIGlmIGl0cyB0d2luIGluIGNhY2hlLmggY2hhbmdlcy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBjb21wYXQvcHJlYWQuYy4gIEJ1dCB3ZSBjYW4ndCBpbmNsdWRlCisgKiBjYWNoZS5oIHRoZXJlLgorICovCitleHRlcm4gc3NpemVfdCByZWFkX2luX2Z1bGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CisKKyNpZmRlZiBOT19TRVRFTlYKKyNkZWZpbmUgc2V0ZW52IGdpdHNldGVudgorZXh0ZXJuIGludCBnaXRzZXRlbnYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjZW5kaWYKKworI2lmZGVmIE5PX01LRFRFTVAKKyNkZWZpbmUgbWtkdGVtcCBnaXRta2R0ZW1wCitleHRlcm4gY2hhciAqZ2l0bWtkdGVtcChjaGFyICopOworI2VuZGlmCisKKyNpZmRlZiBOT19VTlNFVEVOVgorI2RlZmluZSB1bnNldGVudiBnaXR1bnNldGVudgorZXh0ZXJuIHZvaWQgZ2l0dW5zZXRlbnYoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWZkZWYgTk9fU1RSQ0FTRVNUUgorI2RlZmluZSBzdHJjYXNlc3RyIGdpdHN0cmNhc2VzdHIKK2V4dGVybiBjaGFyICpnaXRzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpOworI2VuZGlmCisKKyNpZmRlZiBOT19TVFJMQ1BZCisjZGVmaW5lIHN0cmxjcHkgZ2l0c3RybGNweQorZXh0ZXJuIHNpemVfdCBnaXRzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworI2VuZGlmCisKKyNpZmRlZiBOT19TVFJUT1VNQVgKKyNkZWZpbmUgc3RydG91bWF4IGdpdHN0cnRvdW1heAorZXh0ZXJuIHVpbnRtYXhfdCBnaXRzdHJ0b3VtYXgoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOworI2VuZGlmCisKKyNpZmRlZiBOT19IU1RSRVJST1IKKyNkZWZpbmUgaHN0cmVycm9yIGdpdGhzdHJlcnJvcgorZXh0ZXJuIGNvbnN0IGNoYXIgKmdpdGhzdHJlcnJvcihpbnQgaGVycm9yKTsKKyNlbmRpZgorCisjaWZkZWYgTk9fTUVNTUVNCisjZGVmaW5lIG1lbW1lbSBnaXRtZW1tZW0KK3ZvaWQgKmdpdG1lbW1lbShjb25zdCB2b2lkICpoYXlzdGFjaywgc2l6ZV90IGhheXN0YWNrbGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm5lZWRsZSwgc2l6ZV90IG5lZWRsZWxlbik7CisjZW5kaWYKKworI2lmZGVmIEZSRUFEX1JFQURTX0RJUkVDVE9SSUVTCisjaWZkZWYgZm9wZW4KKyN1bmRlZiBmb3BlbgorI2VuZGlmCisjZGVmaW5lIGZvcGVuKGEsYikgZ2l0X2ZvcGVuKGEsYikKK2V4dGVybiBGSUxFICpnaXRfZm9wZW4oY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorCisjaWZkZWYgU05QUklOVEZfUkVUVVJOU19CT0dVUworI2RlZmluZSBzbnByaW50ZiBnaXRfc25wcmludGYKK2V4dGVybiBpbnQgZ2l0X3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IG1heHNpemUsCisJCQljb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisjZGVmaW5lIHZzbnByaW50ZiBnaXRfdnNucHJpbnRmCitleHRlcm4gaW50IGdpdF92c25wcmludGYoY2hhciAqc3RyLCBzaXplX3QgbWF4c2l6ZSwKKwkJCSBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworI2VuZGlmCisKKyNpZmRlZiBfX0dMSUJDX1BSRVJFUQorI2lmIF9fR0xJQkNfUFJFUkVRKDIsIDEpCisjZGVmaW5lIEhBVkVfU1RSQ0hSTlVMCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0hSTlVMCisjZGVmaW5lIHN0cmNocm51bCBnaXRzdHJjaHJudWwKK3N0YXRpYyBpbmxpbmUgY2hhciAqZ2l0c3RyY2hybnVsKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworCXdoaWxlICgqcyAmJiAqcyAhPSBjKQorCQlzKys7CisJcmV0dXJuIChjaGFyICopczsKK30KKyNlbmRpZgorCisvKgorICogV3JhcHBlcnM6CisgKi8KK2V4dGVybiBjaGFyICp4c3RyZHVwKGNvbnN0IGNoYXIgKnN0cik7CitleHRlcm4gdm9pZCAqeG1hbGxvYyhzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAqeG1lbWR1cHooY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitleHRlcm4gY2hhciAqeHN0cm5kdXAoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkICp4cmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICp4Y2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgKnhtbWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIG9mZl90IG9mZnNldCk7CitleHRlcm4gc3NpemVfdCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CitleHRlcm4gc3NpemVfdCB4d3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pOworZXh0ZXJuIGludCB4ZHVwKGludCBmZCk7CitleHRlcm4gRklMRSAqeGZkb3BlbihpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpOworZXh0ZXJuIGludCB4bWtzdGVtcChjaGFyICp0ZW1wbGF0ZSk7CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHhzaXplX3Qob2ZmX3QgbGVuKQoreworCXJldHVybiAoc2l6ZV90KWxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFzX2V4dGVuc2lvbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXh0KQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCXNpemVfdCBleHRsZW4gPSBzdHJsZW4oZXh0KTsKKwlyZXR1cm4gbGVuID4gZXh0bGVuICYmICFtZW1jbXAoZmlsZW5hbWUgKyBsZW4gLSBleHRsZW4sIGV4dCwgZXh0bGVuKTsKK30KKworLyogU2FuZSBjdHlwZSAtIG5vIGxvY2FsZSwgYW5kIHdvcmtzIHdpdGggc2lnbmVkIGNoYXJzICovCisjdW5kZWYgaXNhc2NpaQorI3VuZGVmIGlzc3BhY2UKKyN1bmRlZiBpc2RpZ2l0CisjdW5kZWYgaXNhbHBoYQorI3VuZGVmIGlzYWxudW0KKyN1bmRlZiB0b2xvd2VyCisjdW5kZWYgdG91cHBlcgorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2FuZV9jdHlwZVsyNTZdOworI2RlZmluZSBHSVRfU1BBQ0UgMHgwMQorI2RlZmluZSBHSVRfRElHSVQgMHgwMgorI2RlZmluZSBHSVRfQUxQSEEgMHgwNAorI2RlZmluZSBHSVRfR0xPQl9TUEVDSUFMIDB4MDgKKyNkZWZpbmUgR0lUX1JFR0VYX1NQRUNJQUwgMHgxMAorI2RlZmluZSBzYW5lX2lzdGVzdCh4LG1hc2spICgoc2FuZV9jdHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgKG1hc2spKSAhPSAwKQorI2RlZmluZSBpc2FzY2lpKHgpICgoKHgpICYgfjB4N2YpID09IDApCisjZGVmaW5lIGlzc3BhY2UoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfU1BBQ0UpCisjZGVmaW5lIGlzZGlnaXQoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfRElHSVQpCisjZGVmaW5lIGlzYWxwaGEoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfQUxQSEEpCisjZGVmaW5lIGlzYWxudW0oeCkgc2FuZV9pc3Rlc3QoeCxHSVRfQUxQSEEgfCBHSVRfRElHSVQpCisjZGVmaW5lIGlzX2dsb2Jfc3BlY2lhbCh4KSBzYW5lX2lzdGVzdCh4LEdJVF9HTE9CX1NQRUNJQUwpCisjZGVmaW5lIGlzX3JlZ2V4X3NwZWNpYWwoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfR0xPQl9TUEVDSUFMIHwgR0lUX1JFR0VYX1NQRUNJQUwpCisjZGVmaW5lIHRvbG93ZXIoeCkgc2FuZV9jYXNlKCh1bnNpZ25lZCBjaGFyKSh4KSwgMHgyMCkKKyNkZWZpbmUgdG91cHBlcih4KSBzYW5lX2Nhc2UoKHVuc2lnbmVkIGNoYXIpKHgpLCAwKQorCitzdGF0aWMgaW5saW5lIGludCBzYW5lX2Nhc2UoaW50IHgsIGludCBoaWdoKQoreworCWlmIChzYW5lX2lzdGVzdCh4LCBHSVRfQUxQSEEpKQorCQl4ID0gKHggJiB+MHgyMCkgfCBoaWdoOworCXJldHVybiB4OworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJ0b3VsX3VpKGNoYXIgY29uc3QgKnMsIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgKnJlc3VsdCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKnA7CisKKwllcnJubyA9IDA7CisJdWwgPSBzdHJ0b3VsKHMsICZwLCBiYXNlKTsKKwlpZiAoZXJybm8gfHwgKnAgfHwgcCA9PSBzIHx8ICh1bnNpZ25lZCBpbnQpIHVsICE9IHVsKQorCQlyZXR1cm4gLTE7CisJKnJlc3VsdCA9IHVsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJ0b2xfaShjaGFyIGNvbnN0ICpzLCBpbnQgYmFzZSwgaW50ICpyZXN1bHQpCit7CisJbG9uZyB1bDsKKwljaGFyICpwOworCisJZXJybm8gPSAwOworCXVsID0gc3RydG9sKHMsICZwLCBiYXNlKTsKKwlpZiAoZXJybm8gfHwgKnAgfHwgcCA9PSBzIHx8IChpbnQpIHVsICE9IHVsKQorCQlyZXR1cm4gLTE7CisJKnJlc3VsdCA9IHVsOworCXJldHVybiAwOworfQorCisjaWZkZWYgSU5URVJOQUxfUVNPUlQKK3ZvaWQgZ2l0X3Fzb3J0KHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisJICAgICAgIGludCgqY29tcGFyKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworI2RlZmluZSBxc29ydCBnaXRfcXNvcnQKKyNlbmRpZgorCisjaWZuZGVmIERJUl9IQVNfQlNEX0dST1VQX1NFTUFOVElDUworIyBkZWZpbmUgRk9SQ0VfRElSX1NFVF9HSUQgU19JU0dJRAorI2Vsc2UKKyMgZGVmaW5lIEZPUkNFX0RJUl9TRVRfR0lEIDAKKyNlbmRpZgorCisjaWZkZWYgTk9fTlNFQworI3VuZGVmIFVTRV9OU0VDCisjZGVmaW5lIFNUX0NUSU1FX05TRUMoc3QpIDAKKyNkZWZpbmUgU1RfTVRJTUVfTlNFQyhzdCkgMAorI2Vsc2UKKyNpZmRlZiBVU0VfU1RfVElNRVNQRUMKKyNkZWZpbmUgU1RfQ1RJTUVfTlNFQyhzdCkgKCh1bnNpZ25lZCBpbnQpKChzdCkuc3RfY3RpbWVzcGVjLnR2X25zZWMpKQorI2RlZmluZSBTVF9NVElNRV9OU0VDKHN0KSAoKHVuc2lnbmVkIGludCkoKHN0KS5zdF9tdGltZXNwZWMudHZfbnNlYykpCisjZWxzZQorI2RlZmluZSBTVF9DVElNRV9OU0VDKHN0KSAoKHVuc2lnbmVkIGludCkoKHN0KS5zdF9jdGltLnR2X25zZWMpKQorI2RlZmluZSBTVF9NVElNRV9OU0VDKHN0KSAoKHVuc2lnbmVkIGludCkoKHN0KS5zdF9tdGltLnR2X25zZWMpKQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvd3JhcHBlci5jIGIvdG9vbHMvcGVyZi91dGlsL3dyYXBwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzUwZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3dyYXBwZXIuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIFZhcmlvdXMgdHJpdmlhbCBoZWxwZXIgd3JhcHBlcnMgYXJvdW5kIHN0YW5kYXJkIGZ1bmN0aW9ucworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworLyoKKyAqIFRoZXJlJ3Mgbm8gcGFjayBtZW1vcnkgdG8gcmVsZWFzZSAtIGJ1dCBzdGF5IGNsb3NlIHRvIHRoZSBHaXQKKyAqIHZlcnNpb24gc28gd3JhcCB0aGlzIGF3YXk6CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX3BhY2tfbWVtb3J5KHNpemVfdCBzaXplLCBpbnQgZmxhZykKK3sKK30KKworY2hhciAqeHN0cmR1cChjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqcmV0ID0gc3RyZHVwKHN0cik7CisJaWYgKCFyZXQpIHsKKwkJcmVsZWFzZV9wYWNrX21lbW9yeShzdHJsZW4oc3RyKSArIDEsIC0xKTsKKwkJcmV0ID0gc3RyZHVwKHN0cik7CisJCWlmICghcmV0KQorCQkJZGllKCJPdXQgb2YgbWVtb3J5LCBzdHJkdXAgZmFpbGVkIik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgKnhtYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcmV0ID0gbWFsbG9jKHNpemUpOworCWlmICghcmV0ICYmICFzaXplKQorCQlyZXQgPSBtYWxsb2MoMSk7CisJaWYgKCFyZXQpIHsKKwkJcmVsZWFzZV9wYWNrX21lbW9yeShzaXplLCAtMSk7CisJCXJldCA9IG1hbGxvYyhzaXplKTsKKwkJaWYgKCFyZXQgJiYgIXNpemUpCisJCQlyZXQgPSBtYWxsb2MoMSk7CisJCWlmICghcmV0KQorCQkJZGllKCJPdXQgb2YgbWVtb3J5LCBtYWxsb2MgZmFpbGVkIik7CisJfQorI2lmZGVmIFhNQUxMT0NfUE9JU09OCisJbWVtc2V0KHJldCwgMHhBNSwgc2l6ZSk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogeG1lbWR1cHooKSBhbGxvY2F0ZXMgKGxlbiArIDEpIGJ5dGVzIG9mIG1lbW9yeSwgZHVwbGljYXRlcyAibGVuIiBieXRlcyBvZgorICogImRhdGEiIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCB6ZXJvIHRlcm1pbmF0ZXMgdGhlIGFsbG9jYXRlZCBtZW1vcnksCisgKiBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLAorICogdGhlIHByb2dyYW0gZGllcy4KKyAqLwordm9pZCAqeG1lbWR1cHooY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwljaGFyICpwID0geG1hbGxvYyhsZW4gKyAxKTsKKwltZW1jcHkocCwgZGF0YSwgbGVuKTsKKwlwW2xlbl0gPSAnXDAnOworCXJldHVybiBwOworfQorCitjaGFyICp4c3RybmR1cChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCit7CisJY2hhciAqcCA9IG1lbWNocihzdHIsICdcMCcsIGxlbik7CisJcmV0dXJuIHhtZW1kdXB6KHN0ciwgcCA/IHAgLSBzdHIgOiBsZW4pOworfQorCit2b2lkICp4cmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldCA9IHJlYWxsb2MocHRyLCBzaXplKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gcmVhbGxvYyhwdHIsIDEpOworCWlmICghcmV0KSB7CisJCXJlbGVhc2VfcGFja19tZW1vcnkoc2l6ZSwgLTEpOworCQlyZXQgPSByZWFsbG9jKHB0ciwgc2l6ZSk7CisJCWlmICghcmV0ICYmICFzaXplKQorCQkJcmV0ID0gcmVhbGxvYyhwdHIsIDEpOworCQlpZiAoIXJldCkKKwkJCWRpZSgiT3V0IG9mIG1lbW9yeSwgcmVhbGxvYyBmYWlsZWQiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCAqeGNhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldCA9IGNhbGxvYyhubWVtYiwgc2l6ZSk7CisJaWYgKCFyZXQgJiYgKCFubWVtYiB8fCAhc2l6ZSkpCisJCXJldCA9IGNhbGxvYygxLCAxKTsKKwlpZiAoIXJldCkgeworCQlyZWxlYXNlX3BhY2tfbWVtb3J5KG5tZW1iICogc2l6ZSwgLTEpOworCQlyZXQgPSBjYWxsb2Mobm1lbWIsIHNpemUpOworCQlpZiAoIXJldCAmJiAoIW5tZW1iIHx8ICFzaXplKSkKKwkJCXJldCA9IGNhbGxvYygxLCAxKTsKKwkJaWYgKCFyZXQpCisJCQlkaWUoIk91dCBvZiBtZW1vcnksIGNhbGxvYyBmYWlsZWQiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCAqeG1tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsCisJaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpCit7CisJdm9pZCAqcmV0ID0gbW1hcChzdGFydCwgbGVuZ3RoLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCk7CisJaWYgKHJldCA9PSBNQVBfRkFJTEVEKSB7CisJCWlmICghbGVuZ3RoKQorCQkJcmV0dXJuIE5VTEw7CisJCXJlbGVhc2VfcGFja19tZW1vcnkobGVuZ3RoLCBmZCk7CisJCXJldCA9IG1tYXAoc3RhcnQsIGxlbmd0aCwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQpOworCQlpZiAocmV0ID09IE1BUF9GQUlMRUQpCisJCQlkaWUoIk91dCBvZiBtZW1vcnk/IG1tYXAgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB4cmVhZCgpIGlzIHRoZSBzYW1lIGEgcmVhZCgpLCBidXQgaXQgYXV0b21hdGljYWxseSByZXN0YXJ0cyByZWFkKCkKKyAqIG9wZXJhdGlvbnMgd2l0aCBhIHJlY292ZXJhYmxlIGVycm9yIChFQUdBSU4gYW5kIEVJTlRSKS4geHJlYWQoKQorICogRE9FUyBOT1QgR1VBUkFOVEVFIHRoYXQgImxlbiIgYnl0ZXMgaXMgcmVhZCBldmVuIGlmIHRoZSBkYXRhIGlzIGF2YWlsYWJsZS4KKyAqLworc3NpemVfdCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IG5yOworCXdoaWxlICgxKSB7CisJCW5yID0gcmVhZChmZCwgYnVmLCBsZW4pOworCQlpZiAoKG5yIDwgMCkgJiYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIG5yOworCX0KK30KKworLyoKKyAqIHh3cml0ZSgpIGlzIHRoZSBzYW1lIGEgd3JpdGUoKSwgYnV0IGl0IGF1dG9tYXRpY2FsbHkgcmVzdGFydHMgd3JpdGUoKQorICogb3BlcmF0aW9ucyB3aXRoIGEgcmVjb3ZlcmFibGUgZXJyb3IgKEVBR0FJTiBhbmQgRUlOVFIpLiB4d3JpdGUoKSBET0VTIE5PVAorICogR1VBUkFOVEVFIHRoYXQgImxlbiIgYnl0ZXMgaXMgd3JpdHRlbiBldmVuIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAqLworc3NpemVfdCB4d3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCBucjsKKwl3aGlsZSAoMSkgeworCQluciA9IHdyaXRlKGZkLCBidWYsIGxlbik7CisJCWlmICgobnIgPCAwKSAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbnI7CisJfQorfQorCitzc2l6ZV90IHJlYWRfaW5fZnVsbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnAgPSBidWY7CisJc3NpemVfdCB0b3RhbCA9IDA7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNzaXplX3QgbG9hZGVkID0geHJlYWQoZmQsIHAsIGNvdW50KTsKKwkJaWYgKGxvYWRlZCA8PSAwKQorCQkJcmV0dXJuIHRvdGFsID8gdG90YWwgOiBsb2FkZWQ7CisJCWNvdW50IC09IGxvYWRlZDsKKwkJcCArPSBsb2FkZWQ7CisJCXRvdGFsICs9IGxvYWRlZDsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3NzaXplX3Qgd3JpdGVfaW5fZnVsbChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNvbnN0IGNoYXIgKnAgPSBidWY7CisJc3NpemVfdCB0b3RhbCA9IDA7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNzaXplX3Qgd3JpdHRlbiA9IHh3cml0ZShmZCwgcCwgY291bnQpOworCQlpZiAod3JpdHRlbiA8IDApCisJCQlyZXR1cm4gLTE7CisJCWlmICghd3JpdHRlbikgeworCQkJZXJybm8gPSBFTk9TUEM7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY291bnQgLT0gd3JpdHRlbjsKKwkJcCArPSB3cml0dGVuOworCQl0b3RhbCArPSB3cml0dGVuOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKworaW50IHhkdXAoaW50IGZkKQoreworCWludCByZXQgPSBkdXAoZmQpOworCWlmIChyZXQgPCAwKQorCQlkaWUoImR1cCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gcmV0OworfQorCitGSUxFICp4ZmRvcGVuKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkKK3sKKwlGSUxFICpzdHJlYW0gPSBmZG9wZW4oZmQsIG1vZGUpOworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJZGllKCJPdXQgb2YgbWVtb3J5PyBmZG9wZW4gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIHN0cmVhbTsKK30KKworaW50IHhta3N0ZW1wKGNoYXIgKnRlbXBsYXRlKQoreworCWludCBmZDsKKworCWZkID0gbWtzdGVtcCh0ZW1wbGF0ZSk7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJVbmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIGZkOworfQpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vaW9hcGljLmMgYi92aXJ0L2t2bS9pb2FwaWMuYwppbmRleCBjM2I5OWRlLi4xZWRkYWU5IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9pb2FwaWMuYworKysgYi92aXJ0L2t2bS9pb2FwaWMuYwpAQCAtODUsNyArODUsNyBAQAogCiBzdGF0aWMgaW50IGlvYXBpY19zZXJ2aWNlKHN0cnVjdCBrdm1faW9hcGljICppb2FwaWMsIHVuc2lnbmVkIGludCBpZHgpCiB7Ci0JdW5pb24gaW9hcGljX3JlZGlyX2VudHJ5ICpwZW50OworCXVuaW9uIGt2bV9pb2FwaWNfcmVkaXJlY3RfZW50cnkgKnBlbnQ7CiAJaW50IGluamVjdGVkID0gLTE7CiAKIAlwZW50ID0gJmlvYXBpYy0+cmVkaXJ0YmxbaWR4XTsKQEAgLTE0MiwxNDkgKzE0Miw0MCBAQAogCX0KIH0KIAotc3RhdGljIGludCBpb2FwaWNfaW5qX2lycShzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljLAotCQkJICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJICAgdTggdmVjdG9yLCB1OCB0cmlnX21vZGUsIHU4IGRlbGl2ZXJ5X21vZGUpCi17Ci0JaW9hcGljX2RlYnVnKCJpcnEgJWQgdHJpZyAlZCBkZWxpdiAlZFxuIiwgdmVjdG9yLCB0cmlnX21vZGUsCi0JCSAgICAgZGVsaXZlcnlfbW9kZSk7Ci0KLQlBU1NFUlQoKGRlbGl2ZXJ5X21vZGUgPT0gSU9BUElDX0ZJWEVEKSB8fAotCSAgICAgICAoZGVsaXZlcnlfbW9kZSA9PSBJT0FQSUNfTE9XRVNUX1BSSU9SSVRZKSk7Ci0KLQlyZXR1cm4ga3ZtX2FwaWNfc2V0X2lycSh2Y3B1LCB2ZWN0b3IsIHRyaWdfbW9kZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGlvYXBpY19pbmpfbm1pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlrdm1faW5qZWN0X25taSh2Y3B1KTsKLQlrdm1fdmNwdV9raWNrKHZjcHUpOwotfQotCi11MzIga3ZtX2lvYXBpY19nZXRfZGVsaXZlcnlfYml0bWFzayhzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljLCB1OCBkZXN0LAotCQkJCSAgICB1OCBkZXN0X21vZGUpCi17Ci0JdTMyIG1hc2sgPSAwOwotCWludCBpOwotCXN0cnVjdCBrdm0gKmt2bSA9IGlvYXBpYy0+a3ZtOwotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKLQotCWlvYXBpY19kZWJ1ZygiZGVzdCAlZCBkZXN0X21vZGUgJWRcbiIsIGRlc3QsIGRlc3RfbW9kZSk7Ci0KLQlpZiAoZGVzdF9tb2RlID09IDApIHsJLyogUGh5c2ljYWwgbW9kZS4gKi8KLQkJaWYgKGRlc3QgPT0gMHhGRikgewkvKiBCcm9hZGNhc3QuICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKQotCQkJCWlmIChrdm0tPnZjcHVzW2ldICYmIGt2bS0+dmNwdXNbaV0tPmFyY2guYXBpYykKLQkJCQkJbWFzayB8PSAxIDw8IGk7Ci0JCQlyZXR1cm4gbWFzazsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKSB7Ci0JCQl2Y3B1ID0ga3ZtLT52Y3B1c1tpXTsKLQkJCWlmICghdmNwdSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChrdm1fYXBpY19tYXRjaF9waHlzaWNhbF9hZGRyKHZjcHUtPmFyY2guYXBpYywgZGVzdCkpIHsKLQkJCQlpZiAodmNwdS0+YXJjaC5hcGljKQotCQkJCQltYXNrID0gMSA8PCBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChkZXN0ICE9IDApCS8qIExvZ2ljYWwgbW9kZSwgTURBIG5vbi16ZXJvLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgKytpKSB7Ci0JCQl2Y3B1ID0ga3ZtLT52Y3B1c1tpXTsKLQkJCWlmICghdmNwdSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh2Y3B1LT5hcmNoLmFwaWMgJiYKLQkJCSAgICBrdm1fYXBpY19tYXRjaF9sb2dpY2FsX2FkZHIodmNwdS0+YXJjaC5hcGljLCBkZXN0KSkKLQkJCQltYXNrIHw9IDEgPDwgdmNwdS0+dmNwdV9pZDsKLQkJfQotCWlvYXBpY19kZWJ1ZygibWFzayAleFxuIiwgbWFzayk7Ci0JcmV0dXJuIG1hc2s7Ci19Ci0KIHN0YXRpYyBpbnQgaW9hcGljX2RlbGl2ZXIoc3RydWN0IGt2bV9pb2FwaWMgKmlvYXBpYywgaW50IGlycSkKIHsKLQl1OCBkZXN0ID0gaW9hcGljLT5yZWRpcnRibFtpcnFdLmZpZWxkcy5kZXN0X2lkOwotCXU4IGRlc3RfbW9kZSA9IGlvYXBpYy0+cmVkaXJ0YmxbaXJxXS5maWVsZHMuZGVzdF9tb2RlOwotCXU4IGRlbGl2ZXJ5X21vZGUgPSBpb2FwaWMtPnJlZGlydGJsW2lycV0uZmllbGRzLmRlbGl2ZXJ5X21vZGU7Ci0JdTggdmVjdG9yID0gaW9hcGljLT5yZWRpcnRibFtpcnFdLmZpZWxkcy52ZWN0b3I7Ci0JdTggdHJpZ19tb2RlID0gaW9hcGljLT5yZWRpcnRibFtpcnFdLmZpZWxkcy50cmlnX21vZGU7Ci0JdTMyIGRlbGl2ZXJfYml0bWFzazsKLQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7Ci0JaW50IHZjcHVfaWQsIHIgPSAtMTsKKwl1bmlvbiBrdm1faW9hcGljX3JlZGlyZWN0X2VudHJ5ICplbnRyeSA9ICZpb2FwaWMtPnJlZGlydGJsW2lycV07CisJc3RydWN0IGt2bV9sYXBpY19pcnEgaXJxZTsKIAogCWlvYXBpY19kZWJ1ZygiZGVzdD0leCBkZXN0X21vZGU9JXggZGVsaXZlcnlfbW9kZT0leCAiCiAJCSAgICAgInZlY3Rvcj0leCB0cmlnX21vZGU9JXhcbiIsCi0JCSAgICAgZGVzdCwgZGVzdF9tb2RlLCBkZWxpdmVyeV9tb2RlLCB2ZWN0b3IsIHRyaWdfbW9kZSk7CisJCSAgICAgZW50cnktPmZpZWxkcy5kZXN0LCBlbnRyeS0+ZmllbGRzLmRlc3RfbW9kZSwKKwkJICAgICBlbnRyeS0+ZmllbGRzLmRlbGl2ZXJ5X21vZGUsIGVudHJ5LT5maWVsZHMudmVjdG9yLAorCQkgICAgIGVudHJ5LT5maWVsZHMudHJpZ19tb2RlKTsKIAotCWRlbGl2ZXJfYml0bWFzayA9IGt2bV9pb2FwaWNfZ2V0X2RlbGl2ZXJ5X2JpdG1hc2soaW9hcGljLCBkZXN0LAotCQkJCQkJCSAgZGVzdF9tb2RlKTsKLQlpZiAoIWRlbGl2ZXJfYml0bWFzaykgewotCQlpb2FwaWNfZGVidWcoIm5vIHRhcmdldCBvbiBkZXN0aW5hdGlvblxuIik7Ci0JCXJldHVybiAwOwotCX0KKwlpcnFlLmRlc3RfaWQgPSBlbnRyeS0+ZmllbGRzLmRlc3RfaWQ7CisJaXJxZS52ZWN0b3IgPSBlbnRyeS0+ZmllbGRzLnZlY3RvcjsKKwlpcnFlLmRlc3RfbW9kZSA9IGVudHJ5LT5maWVsZHMuZGVzdF9tb2RlOworCWlycWUudHJpZ19tb2RlID0gZW50cnktPmZpZWxkcy50cmlnX21vZGU7CisJaXJxZS5kZWxpdmVyeV9tb2RlID0gZW50cnktPmZpZWxkcy5kZWxpdmVyeV9tb2RlIDw8IDg7CisJaXJxZS5sZXZlbCA9IDE7CisJaXJxZS5zaG9ydGhhbmQgPSAwOwogCi0Jc3dpdGNoIChkZWxpdmVyeV9tb2RlKSB7Ci0JY2FzZSBJT0FQSUNfTE9XRVNUX1BSSU9SSVRZOgotCQl2Y3B1ID0ga3ZtX2dldF9sb3dlc3RfcHJpb192Y3B1KGlvYXBpYy0+a3ZtLCB2ZWN0b3IsCi0JCQkJZGVsaXZlcl9iaXRtYXNrKTsKICNpZmRlZiBDT05GSUdfWDg2Ci0JCWlmIChpcnEgPT0gMCkKLQkJCXZjcHUgPSBpb2FwaWMtPmt2bS0+dmNwdXNbMF07Ci0jZW5kaWYKLQkJaWYgKHZjcHUgIT0gTlVMTCkKLQkJCXIgPSBpb2FwaWNfaW5qX2lycShpb2FwaWMsIHZjcHUsIHZlY3RvciwKLQkJCQkgICAgICAgdHJpZ19tb2RlLCBkZWxpdmVyeV9tb2RlKTsKLQkJZWxzZQotCQkJaW9hcGljX2RlYnVnKCJudWxsIGxvd2VzdCBwcmlvIHZjcHU6ICIKLQkJCQkgICAgICJtYXNrPSV4IHZlY3Rvcj0leCBkZWxpdmVyeV9tb2RlPSV4XG4iLAotCQkJCSAgICAgZGVsaXZlcl9iaXRtYXNrLCB2ZWN0b3IsIElPQVBJQ19MT1dFU1RfUFJJT1JJVFkpOwotCQlicmVhazsKLQljYXNlIElPQVBJQ19GSVhFRDoKLSNpZmRlZiBDT05GSUdfWDg2Ci0JCWlmIChpcnEgPT0gMCkKLQkJCWRlbGl2ZXJfYml0bWFzayA9IDE7Ci0jZW5kaWYKLQkJZm9yICh2Y3B1X2lkID0gMDsgZGVsaXZlcl9iaXRtYXNrICE9IDA7IHZjcHVfaWQrKykgewotCQkJaWYgKCEoZGVsaXZlcl9iaXRtYXNrICYgKDEgPDwgdmNwdV9pZCkpKQotCQkJCWNvbnRpbnVlOwotCQkJZGVsaXZlcl9iaXRtYXNrICY9IH4oMSA8PCB2Y3B1X2lkKTsKLQkJCXZjcHUgPSBpb2FwaWMtPmt2bS0+dmNwdXNbdmNwdV9pZF07Ci0JCQlpZiAodmNwdSkgewotCQkJCWlmIChyIDwgMCkKLQkJCQkJciA9IDA7Ci0JCQkJciArPSBpb2FwaWNfaW5qX2lycShpb2FwaWMsIHZjcHUsIHZlY3RvciwKLQkJCQkJICAgICAgIHRyaWdfbW9kZSwgZGVsaXZlcnlfbW9kZSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJT0FQSUNfTk1JOgotCQlmb3IgKHZjcHVfaWQgPSAwOyBkZWxpdmVyX2JpdG1hc2sgIT0gMDsgdmNwdV9pZCsrKSB7Ci0JCQlpZiAoIShkZWxpdmVyX2JpdG1hc2sgJiAoMSA8PCB2Y3B1X2lkKSkpCi0JCQkJY29udGludWU7Ci0JCQlkZWxpdmVyX2JpdG1hc2sgJj0gfigxIDw8IHZjcHVfaWQpOwotCQkJdmNwdSA9IGlvYXBpYy0+a3ZtLT52Y3B1c1t2Y3B1X2lkXTsKLQkJCWlmICh2Y3B1KSB7Ci0JCQkJaW9hcGljX2lual9ubWkodmNwdSk7Ci0JCQkJciA9IDE7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJaW9hcGljX2RlYnVnKCJOTUkgdG8gdmNwdSAlZCBmYWlsZWRcbiIsCi0JCQkJCQl2Y3B1LT52Y3B1X2lkKTsKLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbnN1cHBvcnRlZCBkZWxpdmVyeSBtb2RlICVkXG4iLAotCQkgICAgICAgZGVsaXZlcnlfbW9kZSk7Ci0JCWJyZWFrOworCS8qIEFsd2F5cyBkZWxpdmVyeSBQSVQgaW50ZXJydXB0IHRvIHZjcHUgMCAqLworCWlmIChpcnEgPT0gMCkgeworCQlpcnFlLmRlc3RfbW9kZSA9IDA7IC8qIFBoeXNpY2FsIG1vZGUuICovCisJCWlycWUuZGVzdF9pZCA9IGlvYXBpYy0+a3ZtLT52Y3B1c1swXS0+dmNwdV9pZDsKIAl9Ci0JcmV0dXJuIHI7CisjZW5kaWYKKwlyZXR1cm4ga3ZtX2lycV9kZWxpdmVyeV90b19hcGljKGlvYXBpYy0+a3ZtLCBOVUxMLCAmaXJxZSk7CiB9CiAKIGludCBrdm1faW9hcGljX3NldF9pcnEoc3RydWN0IGt2bV9pb2FwaWMgKmlvYXBpYywgaW50IGlycSwgaW50IGxldmVsKQogewogCXUzMiBvbGRfaXJyID0gaW9hcGljLT5pcnI7CiAJdTMyIG1hc2sgPSAxIDw8IGlycTsKLQl1bmlvbiBpb2FwaWNfcmVkaXJfZW50cnkgZW50cnk7CisJdW5pb24ga3ZtX2lvYXBpY19yZWRpcmVjdF9lbnRyeSBlbnRyeTsKIAlpbnQgcmV0ID0gMTsKIAogCWlmIChpcnEgPj0gMCAmJiBpcnEgPCBJT0FQSUNfTlVNX1BJTlMpIHsKQEAgLTMwNSw3ICsxOTYsNyBAQAogc3RhdGljIHZvaWQgX19rdm1faW9hcGljX3VwZGF0ZV9lb2koc3RydWN0IGt2bV9pb2FwaWMgKmlvYXBpYywgaW50IHBpbiwKIAkJCQkgICAgaW50IHRyaWdnZXJfbW9kZSkKIHsKLQl1bmlvbiBpb2FwaWNfcmVkaXJfZW50cnkgKmVudDsKKwl1bmlvbiBrdm1faW9hcGljX3JlZGlyZWN0X2VudHJ5ICplbnQ7CiAKIAllbnQgPSAmaW9hcGljLT5yZWRpcnRibFtwaW5dOwogCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9pb2FwaWMuaCBiL3ZpcnQva3ZtL2lvYXBpYy5oCmluZGV4IGEzNGJkNWUuLjcwODBiNzEgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2lvYXBpYy5oCisrKyBiL3ZpcnQva3ZtL2lvYXBpYy5oCkBAIC00MCwyMiArNDAsNyBAQAogCXUzMiBpZDsKIAl1MzIgaXJyOwogCXUzMiBwYWQ7Ci0JdW5pb24gaW9hcGljX3JlZGlyX2VudHJ5IHsKLQkJdTY0IGJpdHM7Ci0JCXN0cnVjdCB7Ci0JCQl1OCB2ZWN0b3I7Ci0JCQl1OCBkZWxpdmVyeV9tb2RlOjM7Ci0JCQl1OCBkZXN0X21vZGU6MTsKLQkJCXU4IGRlbGl2ZXJ5X3N0YXR1czoxOwotCQkJdTggcG9sYXJpdHk6MTsKLQkJCXU4IHJlbW90ZV9pcnI6MTsKLQkJCXU4IHRyaWdfbW9kZToxOwotCQkJdTggbWFzazoxOwotCQkJdTggcmVzZXJ2ZTo3OwotCQkJdTggcmVzZXJ2ZWRbNF07Ci0JCQl1OCBkZXN0X2lkOwotCQl9IGZpZWxkczsKLQl9IHJlZGlydGJsW0lPQVBJQ19OVU1fUElOU107CisJdW5pb24ga3ZtX2lvYXBpY19yZWRpcmVjdF9lbnRyeSByZWRpcnRibFtJT0FQSUNfTlVNX1BJTlNdOwogCXN0cnVjdCBrdm1faW9fZGV2aWNlIGRldjsKIAlzdHJ1Y3Qga3ZtICprdm07CiAJdm9pZCAoKmFja19ub3RpZmllcikodm9pZCAqb3BhcXVlLCBpbnQgaXJxKTsKQEAgLTc5LDEzICs2NCwxMyBAQAogCXJldHVybiBrdm0tPmFyY2gudmlvYXBpYzsKIH0KIAotc3RydWN0IGt2bV92Y3B1ICprdm1fZ2V0X2xvd2VzdF9wcmlvX3ZjcHUoc3RydWN0IGt2bSAqa3ZtLCB1OCB2ZWN0b3IsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYml0bWFwKTsKK2ludCBrdm1fYXBpY19tYXRjaF9kZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9sYXBpYyAqc291cmNlLAorCQlpbnQgc2hvcnRfaGFuZCwgaW50IGRlc3QsIGludCBkZXN0X21vZGUpOworaW50IGt2bV9hcGljX2NvbXBhcmVfcHJpbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUxLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUyKTsKIHZvaWQga3ZtX2lvYXBpY191cGRhdGVfZW9pKHN0cnVjdCBrdm0gKmt2bSwgaW50IHZlY3RvciwgaW50IHRyaWdnZXJfbW9kZSk7CiBpbnQga3ZtX2lvYXBpY19pbml0KHN0cnVjdCBrdm0gKmt2bSk7CiBpbnQga3ZtX2lvYXBpY19zZXRfaXJxKHN0cnVjdCBrdm1faW9hcGljICppb2FwaWMsIGludCBpcnEsIGludCBsZXZlbCk7CiB2b2lkIGt2bV9pb2FwaWNfcmVzZXQoc3RydWN0IGt2bV9pb2FwaWMgKmlvYXBpYyk7Ci11MzIga3ZtX2lvYXBpY19nZXRfZGVsaXZlcnlfYml0bWFzayhzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljLCB1OCBkZXN0LAotCQkJCXU4IGRlc3RfbW9kZSk7Ci0KK2ludCBrdm1faXJxX2RlbGl2ZXJ5X3RvX2FwaWMoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2xhcGljICpzcmMsCisJCXN0cnVjdCBrdm1fbGFwaWNfaXJxICppcnEpOwogI2VuZGlmCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9pb21tdS5jIGIvdmlydC9rdm0vaW9tbXUuYwppbmRleCA0YzQwMzc1Li4xNTE0NzU4IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9pb21tdS5jCisrKyBiL3ZpcnQva3ZtL2lvbW11LmMKQEAgLTM5LDExICszOSwxNiBAQAogCXBmbl90IHBmbjsKIAlpbnQgaSwgciA9IDA7CiAJc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluID0ga3ZtLT5hcmNoLmlvbW11X2RvbWFpbjsKKwlpbnQgZmxhZ3M7CiAKIAkvKiBjaGVjayBpZiBpb21tdSBleGlzdHMgYW5kIGluIHVzZSAqLwogCWlmICghZG9tYWluKQogCQlyZXR1cm4gMDsKIAorCWZsYWdzID0gSU9NTVVfUkVBRCB8IElPTU1VX1dSSVRFOworCWlmIChrdm0tPmFyY2guaW9tbXVfZmxhZ3MgJiBLVk1fSU9NTVVfQ0FDSEVfQ09IRVJFTkNZKQorCQlmbGFncyB8PSBJT01NVV9DQUNIRTsKKwogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewogCQkvKiBjaGVjayBpZiBhbHJlYWR5IG1hcHBlZCAqLwogCQlpZiAoaW9tbXVfaW92YV90b19waHlzKGRvbWFpbiwgZ2ZuX3RvX2dwYShnZm4pKSkKQEAgLTUzLDggKzU4LDcgQEAKIAkJciA9IGlvbW11X21hcF9yYW5nZShkb21haW4sCiAJCQkJICAgIGdmbl90b19ncGEoZ2ZuKSwKIAkJCQkgICAgcGZuX3RvX2hwYShwZm4pLAotCQkJCSAgICBQQUdFX1NJWkUsCi0JCQkJICAgIElPTU1VX1JFQUQgfCBJT01NVV9XUklURSk7CisJCQkJICAgIFBBR0VfU0laRSwgZmxhZ3MpOwogCQlpZiAocikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJrdm1faW9tbXVfbWFwX2FkZHJlc3M6IgogCQkJICAgICAgICJpb21tdSBmYWlsZWQgdG8gbWFwIHBmbj0lbHhcbiIsIHBmbik7CkBAIC04OCw3ICs5Miw3IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOwogCXN0cnVjdCBpb21tdV9kb21haW4gKmRvbWFpbiA9IGt2bS0+YXJjaC5pb21tdV9kb21haW47Ci0JaW50IHI7CisJaW50IHIsIGxhc3RfZmxhZ3M7CiAKIAkvKiBjaGVjayBpZiBpb21tdSBleGlzdHMgYW5kIGluIHVzZSAqLwogCWlmICghZG9tYWluKQpAQCAtMTA3LDEyICsxMTEsMjkgQEAKIAkJcmV0dXJuIHI7CiAJfQogCisJbGFzdF9mbGFncyA9IGt2bS0+YXJjaC5pb21tdV9mbGFnczsKKwlpZiAoaW9tbXVfZG9tYWluX2hhc19jYXAoa3ZtLT5hcmNoLmlvbW11X2RvbWFpbiwKKwkJCQkgSU9NTVVfQ0FQX0NBQ0hFX0NPSEVSRU5DWSkpCisJCWt2bS0+YXJjaC5pb21tdV9mbGFncyB8PSBLVk1fSU9NTVVfQ0FDSEVfQ09IRVJFTkNZOworCisJLyogQ2hlY2sgaWYgbmVlZCB0byB1cGRhdGUgSU9NTVUgcGFnZSB0YWJsZSBmb3IgZ3Vlc3QgbWVtb3J5ICovCisJaWYgKChsYXN0X2ZsYWdzIF4ga3ZtLT5hcmNoLmlvbW11X2ZsYWdzKSA9PQorCQkJS1ZNX0lPTU1VX0NBQ0hFX0NPSEVSRU5DWSkgeworCQlrdm1faW9tbXVfdW5tYXBfbWVtc2xvdHMoa3ZtKTsKKwkJciA9IGt2bV9pb21tdV9tYXBfbWVtc2xvdHMoa3ZtKTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dF91bm1hcDsKKwl9CisKIAlwcmludGsoS0VSTl9ERUJVRyAiYXNzaWduIGRldmljZTogaG9zdCBiZGYgPSAleDoleDoleFxuIiwKIAkJYXNzaWduZWRfZGV2LT5ob3N0X2J1c25yLAogCQlQQ0lfU0xPVChhc3NpZ25lZF9kZXYtPmhvc3RfZGV2Zm4pLAogCQlQQ0lfRlVOQyhhc3NpZ25lZF9kZXYtPmhvc3RfZGV2Zm4pKTsKIAogCXJldHVybiAwOworb3V0X3VubWFwOgorCWt2bV9pb21tdV91bm1hcF9tZW1zbG90cyhrdm0pOworCXJldHVybiByOwogfQogCiBpbnQga3ZtX2RlYXNzaWduX2RldmljZShzdHJ1Y3Qga3ZtICprdm0sCmRpZmYgLS1naXQgYS92aXJ0L2t2bS9pcnFfY29tbS5jIGIvdmlydC9rdm0vaXJxX2NvbW0uYwppbmRleCA4NjRhYzU0Li5hOGJkNDY2IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9pcnFfY29tbS5jCisrKyBiL3ZpcnQva3ZtL2lycV9jb21tLmMKQEAgLTIyLDYgKzIyLDkgQEAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogCiAjaW5jbHVkZSA8YXNtL21zaWRlZi5oPgorI2lmZGVmIENPTkZJR19JQTY0CisjaW5jbHVkZSA8YXNtL2lvc2FwaWMuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSAiaXJxLmgiCiAKQEAgLTQzLDU1ICs0Niw3MSBAQAogCXJldHVybiBrdm1faW9hcGljX3NldF9pcnEoa3ZtLT5hcmNoLnZpb2FwaWMsIGUtPmlycWNoaXAucGluLCBsZXZlbCk7CiB9CiAKK2lubGluZSBzdGF0aWMgYm9vbCBrdm1faXNfZG1fbG93ZXN0X3ByaW8oc3RydWN0IGt2bV9sYXBpY19pcnEgKmlycSkKK3sKKyNpZmRlZiBDT05GSUdfSUE2NAorCXJldHVybiBpcnEtPmRlbGl2ZXJ5X21vZGUgPT0KKwkJKElPU0FQSUNfTE9XRVNUX1BSSU9SSVRZIDw8IElPU0FQSUNfREVMSVZFUllfU0hJRlQpOworI2Vsc2UKKwlyZXR1cm4gaXJxLT5kZWxpdmVyeV9tb2RlID09IEFQSUNfRE1fTE9XRVNUOworI2VuZGlmCit9CisKK2ludCBrdm1faXJxX2RlbGl2ZXJ5X3RvX2FwaWMoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2xhcGljICpzcmMsCisJCXN0cnVjdCBrdm1fbGFwaWNfaXJxICppcnEpCit7CisJaW50IGksIHIgPSAtMTsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsICpsb3dlc3QgPSBOVUxMOworCisJaWYgKGlycS0+ZGVzdF9tb2RlID09IDAgJiYgaXJxLT5kZXN0X2lkID09IDB4ZmYgJiYKKwkJCWt2bV9pc19kbV9sb3dlc3RfcHJpbyhpcnEpKQorCQlwcmludGsoS0VSTl9JTkZPICJrdm06IGFwaWM6IHBoeXMgYnJvYWRjYXN0IGFuZCBsb3dlc3QgcHJpb1xuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgS1ZNX01BWF9WQ1BVUzsgaSsrKSB7CisJCXZjcHUgPSBrdm0tPnZjcHVzW2ldOworCisJCWlmICghdmNwdSB8fCAha3ZtX2FwaWNfcHJlc2VudCh2Y3B1KSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgha3ZtX2FwaWNfbWF0Y2hfZGVzdCh2Y3B1LCBzcmMsIGlycS0+c2hvcnRoYW5kLAorCQkJCQlpcnEtPmRlc3RfaWQsIGlycS0+ZGVzdF9tb2RlKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgha3ZtX2lzX2RtX2xvd2VzdF9wcmlvKGlycSkpIHsKKwkJCWlmIChyIDwgMCkKKwkJCQlyID0gMDsKKwkJCXIgKz0ga3ZtX2FwaWNfc2V0X2lycSh2Y3B1LCBpcnEpOworCQl9IGVsc2UgeworCQkJaWYgKCFsb3dlc3QpCisJCQkJbG93ZXN0ID0gdmNwdTsKKwkJCWVsc2UgaWYgKGt2bV9hcGljX2NvbXBhcmVfcHJpbyh2Y3B1LCBsb3dlc3QpIDwgMCkKKwkJCQlsb3dlc3QgPSB2Y3B1OworCQl9CisJfQorCisJaWYgKGxvd2VzdCkKKwkJciA9IGt2bV9hcGljX3NldF9pcnEobG93ZXN0LCBpcnEpOworCisJcmV0dXJuIHI7Cit9CisKIHN0YXRpYyBpbnQga3ZtX3NldF9tc2koc3RydWN0IGt2bV9rZXJuZWxfaXJxX3JvdXRpbmdfZW50cnkgKmUsCiAJCSAgICAgICBzdHJ1Y3Qga3ZtICprdm0sIGludCBsZXZlbCkKIHsKLQlpbnQgdmNwdV9pZCwgciA9IC0xOwotCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKLQlzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljID0gaW9hcGljX2lycWNoaXAoa3ZtKTsKLQlpbnQgZGVzdF9pZCA9IChlLT5tc2kuYWRkcmVzc19sbyAmIE1TSV9BRERSX0RFU1RfSURfTUFTSykKLQkJCT4+IE1TSV9BRERSX0RFU1RfSURfU0hJRlQ7Ci0JaW50IHZlY3RvciA9IChlLT5tc2kuZGF0YSAmIE1TSV9EQVRBX1ZFQ1RPUl9NQVNLKQotCQkJPj4gTVNJX0RBVEFfVkVDVE9SX1NISUZUOwotCWludCBkZXN0X21vZGUgPSB0ZXN0X2JpdChNU0lfQUREUl9ERVNUX01PREVfU0hJRlQsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmZS0+bXNpLmFkZHJlc3NfbG8pOwotCWludCB0cmlnX21vZGUgPSB0ZXN0X2JpdChNU0lfREFUQV9UUklHR0VSX1NISUZULAotCQkJCSh1bnNpZ25lZCBsb25nICopJmUtPm1zaS5kYXRhKTsKLQlpbnQgZGVsaXZlcnlfbW9kZSA9IHRlc3RfYml0KE1TSV9EQVRBX0RFTElWRVJZX01PREVfU0hJRlQsCi0JCQkJKHVuc2lnbmVkIGxvbmcgKikmZS0+bXNpLmRhdGEpOwotCXUzMiBkZWxpdmVyX2JpdG1hc2s7CisJc3RydWN0IGt2bV9sYXBpY19pcnEgaXJxOwogCi0JQlVHX09OKCFpb2FwaWMpOworCWlycS5kZXN0X2lkID0gKGUtPm1zaS5hZGRyZXNzX2xvICYKKwkJCU1TSV9BRERSX0RFU1RfSURfTUFTSykgPj4gTVNJX0FERFJfREVTVF9JRF9TSElGVDsKKwlpcnEudmVjdG9yID0gKGUtPm1zaS5kYXRhICYKKwkJCU1TSV9EQVRBX1ZFQ1RPUl9NQVNLKSA+PiBNU0lfREFUQV9WRUNUT1JfU0hJRlQ7CisJaXJxLmRlc3RfbW9kZSA9ICgxIDw8IE1TSV9BRERSX0RFU1RfTU9ERV9TSElGVCkgJiBlLT5tc2kuYWRkcmVzc19sbzsKKwlpcnEudHJpZ19tb2RlID0gKDEgPDwgTVNJX0RBVEFfVFJJR0dFUl9TSElGVCkgJiBlLT5tc2kuZGF0YTsKKwlpcnEuZGVsaXZlcnlfbW9kZSA9IGUtPm1zaS5kYXRhICYgMHg3MDA7CisJaXJxLmxldmVsID0gMTsKKwlpcnEuc2hvcnRoYW5kID0gMDsKIAotCWRlbGl2ZXJfYml0bWFzayA9IGt2bV9pb2FwaWNfZ2V0X2RlbGl2ZXJ5X2JpdG1hc2soaW9hcGljLAotCQkJCWRlc3RfaWQsIGRlc3RfbW9kZSk7Ci0JLyogSU9BUElDIGRlbGl2ZXJ5IG1vZGUgdmFsdWUgaXMgdGhlIHNhbWUgYXMgTVNJIGhlcmUgKi8KLQlzd2l0Y2ggKGRlbGl2ZXJ5X21vZGUpIHsKLQljYXNlIElPQVBJQ19MT1dFU1RfUFJJT1JJVFk6Ci0JCXZjcHUgPSBrdm1fZ2V0X2xvd2VzdF9wcmlvX3ZjcHUoaW9hcGljLT5rdm0sIHZlY3RvciwKLQkJCQlkZWxpdmVyX2JpdG1hc2spOwotCQlpZiAodmNwdSAhPSBOVUxMKQotCQkJciA9IGt2bV9hcGljX3NldF9pcnEodmNwdSwgdmVjdG9yLCB0cmlnX21vZGUpOwotCQllbHNlCi0JCQlwcmludGsoS0VSTl9JTkZPICJrdm06IG51bGwgbG93ZXN0IHByaW9yaXR5IHZjcHUhXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBJT0FQSUNfRklYRUQ6Ci0JCWZvciAodmNwdV9pZCA9IDA7IGRlbGl2ZXJfYml0bWFzayAhPSAwOyB2Y3B1X2lkKyspIHsKLQkJCWlmICghKGRlbGl2ZXJfYml0bWFzayAmICgxIDw8IHZjcHVfaWQpKSkKLQkJCQljb250aW51ZTsKLQkJCWRlbGl2ZXJfYml0bWFzayAmPSB+KDEgPDwgdmNwdV9pZCk7Ci0JCQl2Y3B1ID0gaW9hcGljLT5rdm0tPnZjcHVzW3ZjcHVfaWRdOwotCQkJaWYgKHZjcHUpIHsKLQkJCQlpZiAociA8IDApCi0JCQkJCXIgPSAwOwotCQkJCXIgKz0ga3ZtX2FwaWNfc2V0X2lycSh2Y3B1LCB2ZWN0b3IsIHRyaWdfbW9kZSk7Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiByOworCS8qIFRPRE8gRGVhbCB3aXRoIFJIIGJpdCBvZiBNU0kgbWVzc2FnZSBhZGRyZXNzICovCisJcmV0dXJuIGt2bV9pcnFfZGVsaXZlcnlfdG9fYXBpYyhrdm0sIE5VTEwsICZpcnEpOwogfQogCiAvKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUga3ZtLT5sb2NrIG11dGV4IGhlbGQKQEAgLTI1Miw3ICsyNzEsNyBAQAogCQkJZGVsdGEgPSA4OwogCQkJYnJlYWs7CiAJCWNhc2UgS1ZNX0lSUUNISVBfSU9BUElDOgotCQkJCWUtPnNldCA9IGt2bV9zZXRfaW9hcGljX2lycTsKKwkJCWUtPnNldCA9IGt2bV9zZXRfaW9hcGljX2lycTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9rdm1fbWFpbi5jIGIvdmlydC9rdm0va3ZtX21haW4uYwppbmRleCA0ZDBkZDM5Li5lMjExOTQ1IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9rdm1fbWFpbi5jCisrKyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKQEAgLTQxLDYgKzQxLDggQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNjAsOSArNjIsNiBAQAogTU9EVUxFX0FVVEhPUigiUXVtcmFuZXQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGludCBtc2kyaW50eCA9IDE7Ci1tb2R1bGVfcGFyYW0obXNpMmludHgsIGJvb2wsIDApOwotCiBERUZJTkVfU1BJTkxPQ0soa3ZtX2xvY2spOwogTElTVF9IRUFEKHZtX2xpc3QpOwogCkBAIC05NSwzOCArOTQsOTYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCBmaW5kX2luZGV4X2Zyb21faG9zdF9pcnEoc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsCisJCQkJICAgICphc3NpZ25lZF9kZXYsIGludCBpcnEpCit7CisJaW50IGksIGluZGV4OworCXN0cnVjdCBtc2l4X2VudHJ5ICpob3N0X21zaXhfZW50cmllczsKKworCWhvc3RfbXNpeF9lbnRyaWVzID0gYXNzaWduZWRfZGV2LT5ob3N0X21zaXhfZW50cmllczsKKworCWluZGV4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IGFzc2lnbmVkX2Rldi0+ZW50cmllc19ucjsgaSsrKQorCQlpZiAoaXJxID09IGhvc3RfbXNpeF9lbnRyaWVzW2ldLnZlY3RvcikgeworCQkJaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwlpZiAoaW5kZXggPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWwgdG8gZmluZCBjb3JyZWxhdGVkIE1TSS1YIGVudHJ5IVxuIik7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBpbmRleDsKK30KKwogc3RhdGljIHZvaWQga3ZtX2Fzc2lnbmVkX2Rldl9pbnRlcnJ1cHRfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldjsKKwlzdHJ1Y3Qga3ZtICprdm07CisJaW50IGlycSwgaTsKIAogCWFzc2lnbmVkX2RldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwsCiAJCQkJICAgIGludGVycnVwdF93b3JrKTsKKwlrdm0gPSBhc3NpZ25lZF9kZXYtPmt2bTsKIAogCS8qIFRoaXMgaXMgdGFrZW4gdG8gc2FmZWx5IGluamVjdCBpcnEgaW5zaWRlIHRoZSBndWVzdC4gV2hlbgogCSAqIHRoZSBpbnRlcnJ1cHQgaW5qZWN0aW9uIChvciB0aGUgaW9hcGljIGNvZGUpIHVzZXMgYQogCSAqIGZpbmVyLWdyYWluZWQgbG9jaywgdXBkYXRlIHRoaXMKIAkgKi8KLQltdXRleF9sb2NrKCZhc3NpZ25lZF9kZXYtPmt2bS0+bG9jayk7Ci0Ja3ZtX3NldF9pcnEoYXNzaWduZWRfZGV2LT5rdm0sIGFzc2lnbmVkX2Rldi0+aXJxX3NvdXJjZV9pZCwKLQkJICAgIGFzc2lnbmVkX2Rldi0+Z3Vlc3RfaXJxLCAxKTsKLQotCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9BU1NJR05FRF9ERVZfR1VFU1RfTVNJKSB7Ci0JCWVuYWJsZV9pcnEoYXNzaWduZWRfZGV2LT5ob3N0X2lycSk7Ci0JCWFzc2lnbmVkX2Rldi0+aG9zdF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmFzc2lnbmVkX2Rldi0+YXNzaWduZWRfZGV2X2xvY2spOworCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9ERVZfSVJRX0hPU1RfTVNJWCkgeworCQlzdHJ1Y3Qga3ZtX2d1ZXN0X21zaXhfZW50cnkgKmd1ZXN0X2VudHJpZXMgPQorCQkJYXNzaWduZWRfZGV2LT5ndWVzdF9tc2l4X2VudHJpZXM7CisJCWZvciAoaSA9IDA7IGkgPCBhc3NpZ25lZF9kZXYtPmVudHJpZXNfbnI7IGkrKykgeworCQkJaWYgKCEoZ3Vlc3RfZW50cmllc1tpXS5mbGFncyAmCisJCQkJCUtWTV9BU1NJR05FRF9NU0lYX1BFTkRJTkcpKQorCQkJCWNvbnRpbnVlOworCQkJZ3Vlc3RfZW50cmllc1tpXS5mbGFncyAmPSB+S1ZNX0FTU0lHTkVEX01TSVhfUEVORElORzsKKwkJCWt2bV9zZXRfaXJxKGFzc2lnbmVkX2Rldi0+a3ZtLAorCQkJCSAgICBhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQsCisJCQkJICAgIGd1ZXN0X2VudHJpZXNbaV0udmVjdG9yLCAxKTsKKwkJCWlycSA9IGFzc2lnbmVkX2Rldi0+aG9zdF9tc2l4X2VudHJpZXNbaV0udmVjdG9yOworCQkJaWYgKGlycSAhPSAwKQorCQkJCWVuYWJsZV9pcnEoaXJxKTsKKwkJCWFzc2lnbmVkX2Rldi0+aG9zdF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJCWt2bV9zZXRfaXJxKGFzc2lnbmVkX2Rldi0+a3ZtLCBhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQsCisJCQkgICAgYXNzaWduZWRfZGV2LT5ndWVzdF9pcnEsIDEpOworCQlpZiAoYXNzaWduZWRfZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgJgorCQkJCUtWTV9ERVZfSVJRX0dVRVNUX01TSSkgeworCQkJZW5hYmxlX2lycShhc3NpZ25lZF9kZXYtPmhvc3RfaXJxKTsKKwkJCWFzc2lnbmVkX2Rldi0+aG9zdF9pcnFfZGlzYWJsZWQgPSBmYWxzZTsKKwkJfQogCX0KKworCXNwaW5fdW5sb2NrX2lycSgmYXNzaWduZWRfZGV2LT5hc3NpZ25lZF9kZXZfbG9jayk7CiAJbXV0ZXhfdW5sb2NrKCZhc3NpZ25lZF9kZXYtPmt2bS0+bG9jayk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBrdm1fYXNzaWduZWRfZGV2X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphc3NpZ25lZF9kZXYgPQogCQkoc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICopIGRldl9pZDsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZhc3NpZ25lZF9kZXYtPmFzc2lnbmVkX2Rldl9sb2NrLCBmbGFncyk7CisJaWYgKGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NU0lYKSB7CisJCWludCBpbmRleCA9IGZpbmRfaW5kZXhfZnJvbV9ob3N0X2lycShhc3NpZ25lZF9kZXYsIGlycSk7CisJCWlmIChpbmRleCA8IDApCisJCQlnb3RvIG91dDsKKwkJYXNzaWduZWRfZGV2LT5ndWVzdF9tc2l4X2VudHJpZXNbaW5kZXhdLmZsYWdzIHw9CisJCQlLVk1fQVNTSUdORURfTVNJWF9QRU5ESU5HOworCX0KKwogCXNjaGVkdWxlX3dvcmsoJmFzc2lnbmVkX2Rldi0+aW50ZXJydXB0X3dvcmspOwogCiAJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CiAJYXNzaWduZWRfZGV2LT5ob3N0X2lycV9kaXNhYmxlZCA9IHRydWU7CiAKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhc3NpZ25lZF9kZXYtPmFzc2lnbmVkX2Rldl9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0xMzQsNiArMTkxLDcgQEAKIHN0YXRpYyB2b2lkIGt2bV9hc3NpZ25lZF9kZXZfYWNrX2lycShzdHJ1Y3Qga3ZtX2lycV9hY2tfbm90aWZpZXIgKmtpYW4pCiB7CiAJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICpkZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChraWFuLT5nc2kgPT0gLTEpCiAJCXJldHVybjsKQEAgLTE0NiwyOCArMjA0LDMwIEBACiAJLyogVGhlIGd1ZXN0IGlycSBtYXkgYmUgc2hhcmVkIHNvIHRoaXMgYWNrIG1heSBiZQogCSAqIGZyb20gYW5vdGhlciBkZXZpY2UuCiAJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+YXNzaWduZWRfZGV2X2xvY2ssIGZsYWdzKTsKIAlpZiAoZGV2LT5ob3N0X2lycV9kaXNhYmxlZCkgewogCQllbmFibGVfaXJxKGRldi0+aG9zdF9pcnEpOwogCQlkZXYtPmhvc3RfaXJxX2Rpc2FibGVkID0gZmFsc2U7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+YXNzaWduZWRfZGV2X2xvY2ssIGZsYWdzKTsKIH0KIAotLyogVGhlIGZ1bmN0aW9uIGltcGxpY2l0IGhvbGQga3ZtLT5sb2NrIG11dGV4IGR1ZSB0byBjYW5jZWxfd29ya19zeW5jKCkgKi8KLXN0YXRpYyB2b2lkIGt2bV9mcmVlX2Fzc2lnbmVkX2lycShzdHJ1Y3Qga3ZtICprdm0sCi0JCQkJICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldikKK3N0YXRpYyB2b2lkIGRlYXNzaWduX2d1ZXN0X2lycShzdHJ1Y3Qga3ZtICprdm0sCisJCQkgICAgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphc3NpZ25lZF9kZXYpCiB7Ci0JaWYgKCFpcnFjaGlwX2luX2tlcm5lbChrdm0pKQotCQlyZXR1cm47Ci0KIAlrdm1fdW5yZWdpc3Rlcl9pcnFfYWNrX25vdGlmaWVyKCZhc3NpZ25lZF9kZXYtPmFja19ub3RpZmllcik7CisJYXNzaWduZWRfZGV2LT5hY2tfbm90aWZpZXIuZ3NpID0gLTE7CiAKIAlpZiAoYXNzaWduZWRfZGV2LT5pcnFfc291cmNlX2lkICE9IC0xKQogCQlrdm1fZnJlZV9pcnFfc291cmNlX2lkKGt2bSwgYXNzaWduZWRfZGV2LT5pcnFfc291cmNlX2lkKTsKIAlhc3NpZ25lZF9kZXYtPmlycV9zb3VyY2VfaWQgPSAtMTsKKwlhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmPSB+KEtWTV9ERVZfSVJRX0dVRVNUX01BU0spOworfQogCi0JaWYgKCFhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSkKLQkJcmV0dXJuOwotCisvKiBUaGUgZnVuY3Rpb24gaW1wbGljaXQgaG9sZCBrdm0tPmxvY2sgbXV0ZXggZHVlIHRvIGNhbmNlbF93b3JrX3N5bmMoKSAqLworc3RhdGljIHZvaWQgZGVhc3NpZ25faG9zdF9pcnEoc3RydWN0IGt2bSAqa3ZtLAorCQkJICAgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphc3NpZ25lZF9kZXYpCit7CiAJLyoKIAkgKiBJbiBrdm1fZnJlZV9kZXZpY2VfaXJxLCBjYW5jZWxfd29ya19zeW5jIHJldHVybiB0cnVlIGlmOgogCSAqIDEuIHdvcmsgaXMgc2NoZWR1bGVkLCBhbmQgdGhlbiBjYW5jZWxsZWQuCkBAIC0xODQsMTcgKzI0NCw2NCBAQAogCSAqIG5vdywgdGhlIGt2bSBzdGF0ZSBpcyBzdGlsbCBsZWdhbCBmb3IgcHJvYmFibHkgd2UgYWxzbyBoYXZlIHRvIHdhaXQKIAkgKiBpbnRlcnJ1cHRfd29yayBkb25lLgogCSAqLwotCWRpc2FibGVfaXJxX25vc3luYyhhc3NpZ25lZF9kZXYtPmhvc3RfaXJxKTsKLQljYW5jZWxfd29ya19zeW5jKCZhc3NpZ25lZF9kZXYtPmludGVycnVwdF93b3JrKTsKKwlpZiAoYXNzaWduZWRfZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgJiBLVk1fREVWX0lSUV9IT1NUX01TSVgpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBhc3NpZ25lZF9kZXYtPmVudHJpZXNfbnI7IGkrKykKKwkJCWRpc2FibGVfaXJxX25vc3luYyhhc3NpZ25lZF9kZXYtPgorCQkJCQkgICBob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IpOwogCi0JZnJlZV9pcnEoYXNzaWduZWRfZGV2LT5ob3N0X2lycSwgKHZvaWQgKilhc3NpZ25lZF9kZXYpOworCQljYW5jZWxfd29ya19zeW5jKCZhc3NpZ25lZF9kZXYtPmludGVycnVwdF93b3JrKTsKIAotCWlmIChhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9BU1NJR05FRF9ERVZfSE9TVF9NU0kpCi0JCXBjaV9kaXNhYmxlX21zaShhc3NpZ25lZF9kZXYtPmRldik7CisJCWZvciAoaSA9IDA7IGkgPCBhc3NpZ25lZF9kZXYtPmVudHJpZXNfbnI7IGkrKykKKwkJCWZyZWVfaXJxKGFzc2lnbmVkX2Rldi0+aG9zdF9tc2l4X2VudHJpZXNbaV0udmVjdG9yLAorCQkJCSAodm9pZCAqKWFzc2lnbmVkX2Rldik7CiAKLQlhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSA9IDA7CisJCWFzc2lnbmVkX2Rldi0+ZW50cmllc19uciA9IDA7CisJCWtmcmVlKGFzc2lnbmVkX2Rldi0+aG9zdF9tc2l4X2VudHJpZXMpOworCQlrZnJlZShhc3NpZ25lZF9kZXYtPmd1ZXN0X21zaXhfZW50cmllcyk7CisJCXBjaV9kaXNhYmxlX21zaXgoYXNzaWduZWRfZGV2LT5kZXYpOworCX0gZWxzZSB7CisJCS8qIERlYWwgd2l0aCBNU0kgYW5kIElOVHggKi8KKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGFzc2lnbmVkX2Rldi0+aG9zdF9pcnEpOworCQljYW5jZWxfd29ya19zeW5jKCZhc3NpZ25lZF9kZXYtPmludGVycnVwdF93b3JrKTsKKworCQlmcmVlX2lycShhc3NpZ25lZF9kZXYtPmhvc3RfaXJxLCAodm9pZCAqKWFzc2lnbmVkX2Rldik7CisKKwkJaWYgKGFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NU0kpCisJCQlwY2lfZGlzYWJsZV9tc2koYXNzaWduZWRfZGV2LT5kZXYpOworCX0KKworCWFzc2lnbmVkX2Rldi0+aXJxX3JlcXVlc3RlZF90eXBlICY9IH4oS1ZNX0RFVl9JUlFfSE9TVF9NQVNLKTsKIH0KIAorc3RhdGljIGludCBrdm1fZGVhc3NpZ25faXJxKHN0cnVjdCBrdm0gKmt2bSwKKwkJCSAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGlycV9yZXF1ZXN0ZWRfdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIGd1ZXN0X2lycV90eXBlLCBob3N0X2lycV90eXBlOworCisJaWYgKCFpcnFjaGlwX2luX2tlcm5lbChrdm0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBubyBpcnEgYXNzaWdubWVudCB0byBkZWFzc2lnbiAqLworCWlmICghYXNzaWduZWRfZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUpCisJCXJldHVybiAtRU5YSU87CisKKwlob3N0X2lycV90eXBlID0gaXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfSE9TVF9NQVNLOworCWd1ZXN0X2lycV90eXBlID0gaXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0RFVl9JUlFfR1VFU1RfTUFTSzsKKworCWlmIChob3N0X2lycV90eXBlKQorCQlkZWFzc2lnbl9ob3N0X2lycShrdm0sIGFzc2lnbmVkX2Rldik7CisJaWYgKGd1ZXN0X2lycV90eXBlKQorCQlkZWFzc2lnbl9ndWVzdF9pcnEoa3ZtLCBhc3NpZ25lZF9kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGt2bV9mcmVlX2Fzc2lnbmVkX2lycShzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFzc2lnbmVkX2RldikKK3sKKwlrdm1fZGVhc3NpZ25faXJxKGt2bSwgYXNzaWduZWRfZGV2LCBhc3NpZ25lZF9kZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSk7Cit9CiAKIHN0YXRpYyB2b2lkIGt2bV9mcmVlX2Fzc2lnbmVkX2RldmljZShzdHJ1Y3Qga3ZtICprdm0sCiAJCQkJICAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwKQEAgLTIyNiwxOTEgKzMzMywyNDUgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgYXNzaWduZWRfZGV2aWNlX3VwZGF0ZV9pbnR4KHN0cnVjdCBrdm0gKmt2bSwKLQkJCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqYWRldiwKLQkJCXN0cnVjdCBrdm1fYXNzaWduZWRfaXJxICphaXJxKQorc3RhdGljIGludCBhc3NpZ25lZF9kZXZpY2VfZW5hYmxlX2hvc3RfaW50eChzdHJ1Y3Qga3ZtICprdm0sCisJCQkJCSAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmRldikKIHsKLQlhZGV2LT5ndWVzdF9pcnEgPSBhaXJxLT5ndWVzdF9pcnE7Ci0JYWRldi0+YWNrX25vdGlmaWVyLmdzaSA9IGFpcnEtPmd1ZXN0X2lycTsKLQotCWlmIChhZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgJiBLVk1fQVNTSUdORURfREVWX0hPU1RfSU5UWCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoaXJxY2hpcF9pbl9rZXJuZWwoa3ZtKSkgewotCQlpZiAoIW1zaTJpbnR4ICYmCi0JCSAgICAoYWRldi0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0FTU0lHTkVEX0RFVl9IT1NUX01TSSkpIHsKLQkJCWZyZWVfaXJxKGFkZXYtPmhvc3RfaXJxLCAodm9pZCAqKWFkZXYpOwotCQkJcGNpX2Rpc2FibGVfbXNpKGFkZXYtPmRldik7Ci0JCX0KLQotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCi0JCQlyZXR1cm4gLUVQRVJNOwotCi0JCWlmIChhaXJxLT5ob3N0X2lycSkKLQkJCWFkZXYtPmhvc3RfaXJxID0gYWlycS0+aG9zdF9pcnE7Ci0JCWVsc2UKLQkJCWFkZXYtPmhvc3RfaXJxID0gYWRldi0+ZGV2LT5pcnE7Ci0KLQkJLyogRXZlbiB0aG91Z2ggdGhpcyBpcyBQQ0ksIHdlIGRvbid0IHdhbnQgdG8gdXNlIHNoYXJlZAotCQkgKiBpbnRlcnJ1cHRzLiBTaGFyaW5nIGhvc3QgZGV2aWNlcyB3aXRoIGd1ZXN0LWFzc2lnbmVkIGRldmljZXMKLQkJICogb24gdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUgaXMgbm90IGEgaGFwcHkgc2l0dWF0aW9uOiB0aGVyZQotCQkgKiBhcmUgZ29pbmcgdG8gYmUgbG9uZyBkZWxheXMgaW4gYWNjZXB0aW5nLCBhY2tpbmcsIGV0Yy4KLQkJICovCi0JCWlmIChyZXF1ZXN0X2lycShhZGV2LT5ob3N0X2lycSwga3ZtX2Fzc2lnbmVkX2Rldl9pbnRyLAotCQkJCTAsICJrdm1fYXNzaWduZWRfaW50eF9kZXZpY2UiLCAodm9pZCAqKWFkZXYpKQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JYWRldi0+aXJxX3JlcXVlc3RlZF90eXBlID0gS1ZNX0FTU0lHTkVEX0RFVl9HVUVTVF9JTlRYIHwKLQkJCQkgICBLVk1fQVNTSUdORURfREVWX0hPU1RfSU5UWDsKKwlkZXYtPmhvc3RfaXJxID0gZGV2LT5kZXYtPmlycTsKKwkvKiBFdmVuIHRob3VnaCB0aGlzIGlzIFBDSSwgd2UgZG9uJ3Qgd2FudCB0byB1c2Ugc2hhcmVkCisJICogaW50ZXJydXB0cy4gU2hhcmluZyBob3N0IGRldmljZXMgd2l0aCBndWVzdC1hc3NpZ25lZCBkZXZpY2VzCisJICogb24gdGhlIHNhbWUgaW50ZXJydXB0IGxpbmUgaXMgbm90IGEgaGFwcHkgc2l0dWF0aW9uOiB0aGVyZQorCSAqIGFyZSBnb2luZyB0byBiZSBsb25nIGRlbGF5cyBpbiBhY2NlcHRpbmcsIGFja2luZywgZXRjLgorCSAqLworCWlmIChyZXF1ZXN0X2lycShkZXYtPmhvc3RfaXJxLCBrdm1fYXNzaWduZWRfZGV2X2ludHIsCisJCQkwLCAia3ZtX2Fzc2lnbmVkX2ludHhfZGV2aWNlIiwgKHZvaWQgKilkZXYpKQorCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19YODYKLXN0YXRpYyBpbnQgYXNzaWduZWRfZGV2aWNlX3VwZGF0ZV9tc2koc3RydWN0IGt2bSAqa3ZtLAotCQkJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICphZGV2LAotCQkJc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgKmFpcnEpCisjaWZkZWYgX19LVk1fSEFWRV9NU0kKK3N0YXRpYyBpbnQgYXNzaWduZWRfZGV2aWNlX2VuYWJsZV9ob3N0X21zaShzdHJ1Y3Qga3ZtICprdm0sCisJCQkJCSAgIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqZGV2KQogewogCWludCByOwogCi0JYWRldi0+Z3Vlc3RfaXJxID0gYWlycS0+Z3Vlc3RfaXJxOwotCWlmIChhaXJxLT5mbGFncyAmIEtWTV9ERVZfSVJRX0FTU0lHTl9FTkFCTEVfTVNJKSB7Ci0JCS8qIHg4NiBkb24ndCBjYXJlIHVwcGVyIGFkZHJlc3Mgb2YgZ3Vlc3QgbXNpIG1lc3NhZ2UgYWRkciAqLwotCQlhZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgfD0gS1ZNX0FTU0lHTkVEX0RFVl9HVUVTVF9NU0k7Ci0JCWFkZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmPSB+S1ZNX0FTU0lHTkVEX0RFVl9HVUVTVF9JTlRYOwotCQlhZGV2LT5hY2tfbm90aWZpZXIuZ3NpID0gLTE7Ci0JfSBlbHNlIGlmIChtc2kyaW50eCkgewotCQlhZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgfD0gS1ZNX0FTU0lHTkVEX0RFVl9HVUVTVF9JTlRYOwotCQlhZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgJj0gfktWTV9BU1NJR05FRF9ERVZfR1VFU1RfTVNJOwotCQlhZGV2LT5hY2tfbm90aWZpZXIuZ3NpID0gYWlycS0+Z3Vlc3RfaXJxOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIEd1ZXN0IHJlcXVpcmUgdG8gZGlzYWJsZSBkZXZpY2UgTVNJLCB3ZSBkaXNhYmxlIE1TSSBhbmQKLQkJICogcmUtZW5hYmxlIElOVHggYnkgZGVmYXVsdCBhZ2Fpbi4gTm90aWNlIGl0J3Mgb25seSBmb3IKLQkJICogbm9uLW1zaTJpbnR4LgotCQkgKi8KLQkJYXNzaWduZWRfZGV2aWNlX3VwZGF0ZV9pbnR4KGt2bSwgYWRldiwgYWlycSk7Ci0JCXJldHVybiAwOworCWlmICghZGV2LT5kZXYtPm1zaV9lbmFibGVkKSB7CisJCXIgPSBwY2lfZW5hYmxlX21zaShkZXYtPmRldik7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CiAJfQogCi0JaWYgKGFkZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9BU1NJR05FRF9ERVZfSE9TVF9NU0kpCi0JCXJldHVybiAwOwotCi0JaWYgKGlycWNoaXBfaW5fa2VybmVsKGt2bSkpIHsKLQkJaWYgKCFtc2kyaW50eCkgewotCQkJaWYgKGFkZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmCi0JCQkJCUtWTV9BU1NJR05FRF9ERVZfSE9TVF9JTlRYKQotCQkJCWZyZWVfaXJxKGFkZXYtPmhvc3RfaXJxLCAodm9pZCAqKWFkZXYpOwotCi0JCQlyID0gcGNpX2VuYWJsZV9tc2koYWRldi0+ZGV2KTsKLQkJCWlmIChyKQotCQkJCXJldHVybiByOwotCQl9Ci0KLQkJYWRldi0+aG9zdF9pcnEgPSBhZGV2LT5kZXYtPmlycTsKLQkJaWYgKHJlcXVlc3RfaXJxKGFkZXYtPmhvc3RfaXJxLCBrdm1fYXNzaWduZWRfZGV2X2ludHIsIDAsCi0JCQkJImt2bV9hc3NpZ25lZF9tc2lfZGV2aWNlIiwgKHZvaWQgKilhZGV2KSkKLQkJCXJldHVybiAtRUlPOworCWRldi0+aG9zdF9pcnEgPSBkZXYtPmRldi0+aXJxOworCWlmIChyZXF1ZXN0X2lycShkZXYtPmhvc3RfaXJxLCBrdm1fYXNzaWduZWRfZGV2X2ludHIsIDAsCisJCQkia3ZtX2Fzc2lnbmVkX21zaV9kZXZpY2UiLCAodm9pZCAqKWRldikpIHsKKwkJcGNpX2Rpc2FibGVfbXNpKGRldi0+ZGV2KTsKKwkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYgKCFtc2kyaW50eCkKLQkJYWRldi0+aXJxX3JlcXVlc3RlZF90eXBlID0gS1ZNX0FTU0lHTkVEX0RFVl9HVUVTVF9NU0k7Ci0KLQlhZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgfD0gS1ZNX0FTU0lHTkVEX0RFVl9IT1NUX01TSTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IGt2bV92bV9pb2N0bF9hc3NpZ25faXJxKHN0cnVjdCBrdm0gKmt2bSwKLQkJCQkgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycQotCQkJCSAgICphc3NpZ25lZF9pcnEpCisjaWZkZWYgX19LVk1fSEFWRV9NU0lYCitzdGF0aWMgaW50IGFzc2lnbmVkX2RldmljZV9lbmFibGVfaG9zdF9tc2l4KHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkJICAgIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqZGV2KQogewotCWludCByID0gMDsKKwlpbnQgaSwgciA9IC1FSU5WQUw7CisKKwkvKiBob3N0X21zaXhfZW50cmllcyBhbmQgZ3Vlc3RfbXNpeF9lbnRyaWVzIHNob3VsZCBoYXZlIGJlZW4KKwkgKiBpbml0aWFsaXplZCAqLworCWlmIChkZXYtPmVudHJpZXNfbnIgPT0gMCkKKwkJcmV0dXJuIHI7CisKKwlyID0gcGNpX2VuYWJsZV9tc2l4KGRldi0+ZGV2LCBkZXYtPmhvc3RfbXNpeF9lbnRyaWVzLCBkZXYtPmVudHJpZXNfbnIpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmVudHJpZXNfbnI7IGkrKykgeworCQlyID0gcmVxdWVzdF9pcnEoZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS52ZWN0b3IsCisJCQkJa3ZtX2Fzc2lnbmVkX2Rldl9pbnRyLCAwLAorCQkJCSJrdm1fYXNzaWduZWRfbXNpeF9kZXZpY2UiLAorCQkJCSh2b2lkICopZGV2KTsKKwkJLyogRklYTUU6IGZyZWUgcmVxdWVzdGVkX2lycSdzIG9uIGZhaWx1cmUgKi8KKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgYXNzaWduZWRfZGV2aWNlX2VuYWJsZV9ndWVzdF9pbnR4KHN0cnVjdCBrdm0gKmt2bSwKKwkJCQlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmRldiwKKwkJCQlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSAqaXJxKQoreworCWRldi0+Z3Vlc3RfaXJxID0gaXJxLT5ndWVzdF9pcnE7CisJZGV2LT5hY2tfbm90aWZpZXIuZ3NpID0gaXJxLT5ndWVzdF9pcnE7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfX0tWTV9IQVZFX01TSQorc3RhdGljIGludCBhc3NpZ25lZF9kZXZpY2VfZW5hYmxlX2d1ZXN0X21zaShzdHJ1Y3Qga3ZtICprdm0sCisJCQlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmRldiwKKwkJCXN0cnVjdCBrdm1fYXNzaWduZWRfaXJxICppcnEpCit7CisJZGV2LT5ndWVzdF9pcnEgPSBpcnEtPmd1ZXN0X2lycTsKKwlkZXYtPmFja19ub3RpZmllci5nc2kgPSAtMTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorI2lmZGVmIF9fS1ZNX0hBVkVfTVNJWAorc3RhdGljIGludCBhc3NpZ25lZF9kZXZpY2VfZW5hYmxlX2d1ZXN0X21zaXgoc3RydWN0IGt2bSAqa3ZtLAorCQkJc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICpkZXYsCisJCQlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSAqaXJxKQoreworCWRldi0+Z3Vlc3RfaXJxID0gaXJxLT5ndWVzdF9pcnE7CisJZGV2LT5hY2tfbm90aWZpZXIuZ3NpID0gLTE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBhc3NpZ25faG9zdF9pcnEoc3RydWN0IGt2bSAqa3ZtLAorCQkJICAgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICpkZXYsCisJCQkgICBfX3UzMiBob3N0X2lycV90eXBlKQoreworCWludCByID0gLUVFWElTVDsKKworCWlmIChkZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSAmIEtWTV9ERVZfSVJRX0hPU1RfTUFTSykKKwkJcmV0dXJuIHI7CisKKwlzd2l0Y2ggKGhvc3RfaXJxX3R5cGUpIHsKKwljYXNlIEtWTV9ERVZfSVJRX0hPU1RfSU5UWDoKKwkJciA9IGFzc2lnbmVkX2RldmljZV9lbmFibGVfaG9zdF9pbnR4KGt2bSwgZGV2KTsKKwkJYnJlYWs7CisjaWZkZWYgX19LVk1fSEFWRV9NU0kKKwljYXNlIEtWTV9ERVZfSVJRX0hPU1RfTVNJOgorCQlyID0gYXNzaWduZWRfZGV2aWNlX2VuYWJsZV9ob3N0X21zaShrdm0sIGRldik7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgX19LVk1fSEFWRV9NU0lYCisJY2FzZSBLVk1fREVWX0lSUV9IT1NUX01TSVg6CisJCXIgPSBhc3NpZ25lZF9kZXZpY2VfZW5hYmxlX2hvc3RfbXNpeChrdm0sIGRldik7CisJCWJyZWFrOworI2VuZGlmCisJZGVmYXVsdDoKKwkJciA9IC1FSU5WQUw7CisJfQorCisJaWYgKCFyKQorCQlkZXYtPmlycV9yZXF1ZXN0ZWRfdHlwZSB8PSBob3N0X2lycV90eXBlOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgYXNzaWduX2d1ZXN0X2lycShzdHJ1Y3Qga3ZtICprdm0sCisJCQkgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9kZXZfa2VybmVsICpkZXYsCisJCQkgICAgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgKmlycSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGd1ZXN0X2lycV90eXBlKQoreworCWludCBpZDsKKwlpbnQgciA9IC1FRVhJU1Q7CisKKwlpZiAoZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgJiBLVk1fREVWX0lSUV9HVUVTVF9NQVNLKQorCQlyZXR1cm4gcjsKKworCWlkID0ga3ZtX3JlcXVlc3RfaXJxX3NvdXJjZV9pZChrdm0pOworCWlmIChpZCA8IDApCisJCXJldHVybiBpZDsKKworCWRldi0+aXJxX3NvdXJjZV9pZCA9IGlkOworCisJc3dpdGNoIChndWVzdF9pcnFfdHlwZSkgeworCWNhc2UgS1ZNX0RFVl9JUlFfR1VFU1RfSU5UWDoKKwkJciA9IGFzc2lnbmVkX2RldmljZV9lbmFibGVfZ3Vlc3RfaW50eChrdm0sIGRldiwgaXJxKTsKKwkJYnJlYWs7CisjaWZkZWYgX19LVk1fSEFWRV9NU0kKKwljYXNlIEtWTV9ERVZfSVJRX0dVRVNUX01TSToKKwkJciA9IGFzc2lnbmVkX2RldmljZV9lbmFibGVfZ3Vlc3RfbXNpKGt2bSwgZGV2LCBpcnEpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIF9fS1ZNX0hBVkVfTVNJWAorCWNhc2UgS1ZNX0RFVl9JUlFfR1VFU1RfTVNJWDoKKwkJciA9IGFzc2lnbmVkX2RldmljZV9lbmFibGVfZ3Vlc3RfbXNpeChrdm0sIGRldiwgaXJxKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIXIpIHsKKwkJZGV2LT5pcnFfcmVxdWVzdGVkX3R5cGUgfD0gZ3Vlc3RfaXJxX3R5cGU7CisJCWt2bV9yZWdpc3Rlcl9pcnFfYWNrX25vdGlmaWVyKGt2bSwgJmRldi0+YWNrX25vdGlmaWVyKTsKKwl9IGVsc2UKKwkJa3ZtX2ZyZWVfaXJxX3NvdXJjZV9pZChrdm0sIGRldi0+aXJxX3NvdXJjZV9pZCk7CisKKwlyZXR1cm4gcjsKK30KKworLyogVE9ETyBEZWFsIHdpdGggS1ZNX0RFVl9JUlFfQVNTSUdORURfTUFTS19NU0lYICovCitzdGF0aWMgaW50IGt2bV92bV9pb2N0bF9hc3NpZ25faXJxKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2lycSAqYXNzaWduZWRfaXJxKQoreworCWludCByID0gLUVJTlZBTDsKIAlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKm1hdGNoOwotCXUzMiBjdXJyZW50X2ZsYWdzID0gMCwgY2hhbmdlZF9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGhvc3RfaXJxX3R5cGUsIGd1ZXN0X2lycV90eXBlOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCFpcnFjaGlwX2luX2tlcm5lbChrdm0pKQorCQlyZXR1cm4gcjsKKworCW11dGV4X2xvY2soJmt2bS0+bG9jayk7CisJciA9IC1FTk9ERVY7CisJbWF0Y2ggPSBrdm1fZmluZF9hc3NpZ25lZF9kZXYoJmt2bS0+YXJjaC5hc3NpZ25lZF9kZXZfaGVhZCwKKwkJCQkgICAgICBhc3NpZ25lZF9pcnEtPmFzc2lnbmVkX2Rldl9pZCk7CisJaWYgKCFtYXRjaCkKKwkJZ290byBvdXQ7CisKKwlob3N0X2lycV90eXBlID0gKGFzc2lnbmVkX2lycS0+ZmxhZ3MgJiBLVk1fREVWX0lSUV9IT1NUX01BU0spOworCWd1ZXN0X2lycV90eXBlID0gKGFzc2lnbmVkX2lycS0+ZmxhZ3MgJiBLVk1fREVWX0lSUV9HVUVTVF9NQVNLKTsKKworCXIgPSAtRUlOVkFMOworCS8qIGNhbiBvbmx5IGFzc2lnbiBvbmUgdHlwZSBhdCBhIHRpbWUgKi8KKwlpZiAoaHdlaWdodF9sb25nKGhvc3RfaXJxX3R5cGUpID4gMSkKKwkJZ290byBvdXQ7CisJaWYgKGh3ZWlnaHRfbG9uZyhndWVzdF9pcnFfdHlwZSkgPiAxKQorCQlnb3RvIG91dDsKKwlpZiAoaG9zdF9pcnFfdHlwZSA9PSAwICYmIGd1ZXN0X2lycV90eXBlID09IDApCisJCWdvdG8gb3V0OworCisJciA9IDA7CisJaWYgKGhvc3RfaXJxX3R5cGUpCisJCXIgPSBhc3NpZ25faG9zdF9pcnEoa3ZtLCBtYXRjaCwgaG9zdF9pcnFfdHlwZSk7CisJaWYgKHIpCisJCWdvdG8gb3V0OworCisJaWYgKGd1ZXN0X2lycV90eXBlKQorCQlyID0gYXNzaWduX2d1ZXN0X2lycShrdm0sIG1hdGNoLCBhc3NpZ25lZF9pcnEsIGd1ZXN0X2lycV90eXBlKTsKK291dDoKKwltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3ZtX2lvY3RsX2RlYXNzaWduX2Rldl9pcnEoc3RydWN0IGt2bSAqa3ZtLAorCQkJCQkgc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEKKwkJCQkJICphc3NpZ25lZF9pcnEpCit7CisJaW50IHIgPSAtRU5PREVWOworCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqbWF0Y2g7CiAKIAltdXRleF9sb2NrKCZrdm0tPmxvY2spOwogCiAJbWF0Y2ggPSBrdm1fZmluZF9hc3NpZ25lZF9kZXYoJmt2bS0+YXJjaC5hc3NpZ25lZF9kZXZfaGVhZCwKIAkJCQkgICAgICBhc3NpZ25lZF9pcnEtPmFzc2lnbmVkX2Rldl9pZCk7Ci0JaWYgKCFtYXRjaCkgewotCQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlpZiAoIW1hdGNoKQorCQlnb3RvIG91dDsKIAotCWlmICghbWF0Y2gtPmlycV9yZXF1ZXN0ZWRfdHlwZSkgewotCQlJTklUX1dPUksoJm1hdGNoLT5pbnRlcnJ1cHRfd29yaywKLQkJCQlrdm1fYXNzaWduZWRfZGV2X2ludGVycnVwdF93b3JrX2hhbmRsZXIpOwotCQlpZiAoaXJxY2hpcF9pbl9rZXJuZWwoa3ZtKSkgewotCQkJLyogUmVnaXN0ZXIgYWNrIG5vZml0aWVyICovCi0JCQltYXRjaC0+YWNrX25vdGlmaWVyLmdzaSA9IC0xOwotCQkJbWF0Y2gtPmFja19ub3RpZmllci5pcnFfYWNrZWQgPQotCQkJCQlrdm1fYXNzaWduZWRfZGV2X2Fja19pcnE7Ci0JCQlrdm1fcmVnaXN0ZXJfaXJxX2Fja19ub3RpZmllcihrdm0sCi0JCQkJCSZtYXRjaC0+YWNrX25vdGlmaWVyKTsKLQotCQkJLyogUmVxdWVzdCBJUlEgc291cmNlIElEICovCi0JCQlyID0ga3ZtX3JlcXVlc3RfaXJxX3NvdXJjZV9pZChrdm0pOwotCQkJaWYgKHIgPCAwKQotCQkJCWdvdG8gb3V0X3JlbGVhc2U7Ci0JCQllbHNlCi0JCQkJbWF0Y2gtPmlycV9zb3VyY2VfaWQgPSByOwotCi0jaWZkZWYgQ09ORklHX1g4NgotCQkJLyogRGV0ZXJtaW5lIGhvc3QgZGV2aWNlIGlycSB0eXBlLCB3ZSBjYW4ga25vdyB0aGUKLQkJCSAqIHJlc3VsdCBmcm9tIGRldi0+bXNpX2VuYWJsZWQgKi8KLQkJCWlmIChtc2kyaW50eCkKLQkJCQlwY2lfZW5hYmxlX21zaShtYXRjaC0+ZGV2KTsKLSNlbmRpZgotCQl9Ci0JfQotCi0JaWYgKChtYXRjaC0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0FTU0lHTkVEX0RFVl9IT1NUX01TSSkgJiYKLQkJIChtYXRjaC0+aXJxX3JlcXVlc3RlZF90eXBlICYgS1ZNX0FTU0lHTkVEX0RFVl9HVUVTVF9NU0kpKQotCQljdXJyZW50X2ZsYWdzIHw9IEtWTV9ERVZfSVJRX0FTU0lHTl9FTkFCTEVfTVNJOwotCi0JY2hhbmdlZF9mbGFncyA9IGFzc2lnbmVkX2lycS0+ZmxhZ3MgXiBjdXJyZW50X2ZsYWdzOwotCi0JaWYgKChjaGFuZ2VkX2ZsYWdzICYgS1ZNX0RFVl9JUlFfQVNTSUdOX01TSV9BQ1RJT04pIHx8Ci0JICAgIChtc2kyaW50eCAmJiBtYXRjaC0+ZGV2LT5tc2lfZW5hYmxlZCkpIHsKLSNpZmRlZiBDT05GSUdfWDg2Ci0JCXIgPSBhc3NpZ25lZF9kZXZpY2VfdXBkYXRlX21zaShrdm0sIG1hdGNoLCBhc3NpZ25lZF9pcnEpOwotCQlpZiAocikgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAia3ZtOiBmYWlsZWQgdG8gZW5hYmxlICIKLQkJCQkJIk1TSSBkZXZpY2UhXG4iKTsKLQkJCWdvdG8gb3V0X3JlbGVhc2U7Ci0JCX0KLSNlbHNlCi0JCXIgPSAtRU5PVFRZOwotI2VuZGlmCi0JfSBlbHNlIGlmIChhc3NpZ25lZF9pcnEtPmhvc3RfaXJxID09IDAgJiYgbWF0Y2gtPmRldi0+aXJxID09IDApIHsKLQkJLyogSG9zdCBkZXZpY2UgSVJRIDAgbWVhbnMgZG9uJ3Qgc3VwcG9ydCBJTlR4ICovCi0JCWlmICghbXNpMmludHgpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAia3ZtOiB3YWl0IGRldmljZSB0byBlbmFibGUgTVNJIVxuIik7Ci0JCQlyID0gMDsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAia3ZtOiBmYWlsZWQgdG8gZW5hYmxlIE1TSSBkZXZpY2UhXG4iKTsKLQkJCXIgPSAtRU5PVFRZOwotCQkJZ290byBvdXRfcmVsZWFzZTsKLQkJfQotCX0gZWxzZSB7Ci0JCS8qIE5vbi1zaGFyaW5nIElOVHggbW9kZSAqLwotCQlyID0gYXNzaWduZWRfZGV2aWNlX3VwZGF0ZV9pbnR4KGt2bSwgbWF0Y2gsIGFzc2lnbmVkX2lycSk7Ci0JCWlmIChyKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJrdm06IGZhaWxlZCB0byBlbmFibGUgIgotCQkJCQkiSU5UeCBkZXZpY2UhXG4iKTsKLQkJCWdvdG8gb3V0X3JlbGVhc2U7Ci0JCX0KLQl9Ci0KKwlyID0ga3ZtX2RlYXNzaWduX2lycShrdm0sIG1hdGNoLCBhc3NpZ25lZF9pcnEtPmZsYWdzKTsKK291dDoKIAltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CiAJcmV0dXJuIHI7Ci1vdXRfcmVsZWFzZToKLQltdXRleF91bmxvY2soJmt2bS0+bG9jayk7Ci0Ja3ZtX2ZyZWVfYXNzaWduZWRfZGV2aWNlKGt2bSwgbWF0Y2gpOwotCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50IGt2bV92bV9pb2N0bF9hc3NpZ25fZGV2aWNlKHN0cnVjdCBrdm0gKmt2bSwKQEAgLTQyNyw3ICs1ODgsNyBAQAogCQkJCSAgICAgIGFzc2lnbmVkX2Rldi0+YXNzaWduZWRfZGV2X2lkKTsKIAlpZiAobWF0Y2gpIHsKIAkJLyogZGV2aWNlIGFscmVhZHkgYXNzaWduZWQgKi8KLQkJciA9IC1FSU5WQUw7CisJCXIgPSAtRUVYSVNUOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQ2NCw4ICs2MjUsMTIgQEAKIAltYXRjaC0+aG9zdF9kZXZmbiA9IGFzc2lnbmVkX2Rldi0+ZGV2Zm47CiAJbWF0Y2gtPmZsYWdzID0gYXNzaWduZWRfZGV2LT5mbGFnczsKIAltYXRjaC0+ZGV2ID0gZGV2OworCXNwaW5fbG9ja19pbml0KCZtYXRjaC0+YXNzaWduZWRfZGV2X2xvY2spOwogCW1hdGNoLT5pcnFfc291cmNlX2lkID0gLTE7CiAJbWF0Y2gtPmt2bSA9IGt2bTsKKwltYXRjaC0+YWNrX25vdGlmaWVyLmlycV9hY2tlZCA9IGt2bV9hc3NpZ25lZF9kZXZfYWNrX2lycTsKKwlJTklUX1dPUksoJm1hdGNoLT5pbnRlcnJ1cHRfd29yaywKKwkJICBrdm1fYXNzaWduZWRfZGV2X2ludGVycnVwdF93b3JrX2hhbmRsZXIpOwogCiAJbGlzdF9hZGQoJm1hdGNoLT5saXN0LCAma3ZtLT5hcmNoLmFzc2lnbmVkX2Rldl9oZWFkKTsKIApAQCAtODc4LDYgKzEwNDMsOCBAQAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfTU1VX05PVElGSUVSKSAmJiBkZWZpbmVkKEtWTV9BUkNIX1dBTlRfTU1VX05PVElGSUVSKQogCW1tdV9ub3RpZmllcl91bnJlZ2lzdGVyKCZrdm0tPm1tdV9ub3RpZmllciwga3ZtLT5tbSk7CisjZWxzZQorCWt2bV9hcmNoX2ZsdXNoX3NoYWRvdyhrdm0pOwogI2VuZGlmCiAJa3ZtX2FyY2hfZGVzdHJveV92bShrdm0pOwogCW1tZHJvcChtbSk7CkBAIC05MTksOSArMTA4Niw4IEBACiB7CiAJaW50IHI7CiAJZ2ZuX3QgYmFzZV9nZm47Ci0JdW5zaWduZWQgbG9uZyBucGFnZXM7Ci0JaW50IGxhcmdlcGFnZXM7Ci0JdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzLCB1Z2ZuOworCXVuc2lnbmVkIGxvbmcgbGFyZ2VwYWdlcywgaTsKIAlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90OwogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3Qgb2xkLCBuZXc7CiAKQEAgLTEwMTAsNiArMTE3NiwxNCBAQAogCQkJbmV3LmxwYWdlX2luZm9bMF0ud3JpdGVfY291bnQgPSAxOwogCQlpZiAoKGJhc2VfZ2ZuK25wYWdlcykgJSBLVk1fUEFHRVNfUEVSX0hQQUdFKQogCQkJbmV3LmxwYWdlX2luZm9bbGFyZ2VwYWdlcy0xXS53cml0ZV9jb3VudCA9IDE7CisJCXVnZm4gPSBuZXcudXNlcnNwYWNlX2FkZHIgPj4gUEFHRV9TSElGVDsKKwkJLyoKKwkJICogSWYgdGhlIGdmbiBhbmQgdXNlcnNwYWNlIGFkZHJlc3MgYXJlIG5vdCBhbGlnbmVkIHdydCBlYWNoCisJCSAqIG90aGVyLCBkaXNhYmxlIGxhcmdlIHBhZ2Ugc3VwcG9ydCBmb3IgdGhpcyBzbG90CisJCSAqLworCQlpZiAoKGJhc2VfZ2ZuIF4gdWdmbikgJiAoS1ZNX1BBR0VTX1BFUl9IUEFHRSAtIDEpKQorCQkJZm9yIChpID0gMDsgaSA8IGxhcmdlcGFnZXM7ICsraSkKKwkJCQluZXcubHBhZ2VfaW5mb1tpXS53cml0ZV9jb3VudCA9IDE7CiAJfQogCiAJLyogQWxsb2NhdGUgcGFnZSBkaXJ0eSBiaXRtYXAgaWYgbmVlZGVkICovCkBAIC0xMDQzLDggKzEyMTcsMTAgQEAKIAogCWt2bV9mcmVlX3BoeXNtZW1fc2xvdCgmb2xkLCBucGFnZXMgPyAmbmV3IDogTlVMTCk7CiAJLyogU2xvdCBkZWxldGlvbiBjYXNlOiB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgY3VycmVudCBzbG90ICovCisJc3Bpbl9sb2NrKCZrdm0tPm1tdV9sb2NrKTsKIAlpZiAoIW5wYWdlcykKIAkJKm1lbXNsb3QgPSBvbGQ7CisJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOwogI2lmZGVmIENPTkZJR19ETUFSCiAJLyogbWFwIHRoZSBwYWdlcyBpbiBpb21tdSBwYWdlIHRhYmxlICovCiAJciA9IGt2bV9pb21tdV9tYXBfcGFnZXMoa3ZtLCBiYXNlX2dmbiwgbnBhZ2VzKTsKQEAgLTE0NTQsMTIgKzE2MzAsMTQgQEAKIAlmb3IgKDs7KSB7CiAJCXByZXBhcmVfdG9fd2FpdCgmdmNwdS0+d3EsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCi0JCWlmIChrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkgfHwKLQkJICAgIGt2bV9jcHVfaGFzX3BlbmRpbmdfdGltZXIodmNwdSkgfHwKLQkJICAgIGt2bV9hcmNoX3ZjcHVfcnVubmFibGUodmNwdSkpIHsKKwkJaWYgKChrdm1fYXJjaF9pbnRlcnJ1cHRfYWxsb3dlZCh2Y3B1KSAmJgorCQkJCQlrdm1fY3B1X2hhc19pbnRlcnJ1cHQodmNwdSkpIHx8CisJCQkJa3ZtX2FyY2hfdmNwdV9ydW5uYWJsZSh2Y3B1KSkgewogCQkJc2V0X2JpdChLVk1fUkVRX1VOSEFMVCwgJnZjcHUtPnJlcXVlc3RzKTsKIAkJCWJyZWFrOwogCQl9CisJCWlmIChrdm1fY3B1X2hhc19wZW5kaW5nX3RpbWVyKHZjcHUpKQorCQkJYnJlYWs7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwogCkBAIC0xNTkzLDYgKzE3NzEsODggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIF9fS1ZNX0hBVkVfTVNJWAorc3RhdGljIGludCBrdm1fdm1faW9jdGxfc2V0X21zaXhfbnIoc3RydWN0IGt2bSAqa3ZtLAorCQkJCSAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX21zaXhfbnIgKmVudHJ5X25yKQoreworCWludCByID0gMDsKKwlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKmFkZXY7CisKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOworCisJYWRldiA9IGt2bV9maW5kX2Fzc2lnbmVkX2Rldigma3ZtLT5hcmNoLmFzc2lnbmVkX2Rldl9oZWFkLAorCQkJCSAgICAgIGVudHJ5X25yLT5hc3NpZ25lZF9kZXZfaWQpOworCWlmICghYWRldikgeworCQlyID0gLUVJTlZBTDsKKwkJZ290byBtc2l4X25yX291dDsKKwl9CisKKwlpZiAoYWRldi0+ZW50cmllc19uciA9PSAwKSB7CisJCWFkZXYtPmVudHJpZXNfbnIgPSBlbnRyeV9uci0+ZW50cnlfbnI7CisJCWlmIChhZGV2LT5lbnRyaWVzX25yID09IDAgfHwKKwkJICAgIGFkZXYtPmVudHJpZXNfbnIgPj0gS1ZNX01BWF9NU0lYX1BFUl9ERVYpIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJZ290byBtc2l4X25yX291dDsKKwkJfQorCisJCWFkZXYtPmhvc3RfbXNpeF9lbnRyaWVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpICoKKwkJCQkJCWVudHJ5X25yLT5lbnRyeV9uciwKKwkJCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIWFkZXYtPmhvc3RfbXNpeF9lbnRyaWVzKSB7CisJCQlyID0gLUVOT01FTTsKKwkJCWdvdG8gbXNpeF9ucl9vdXQ7CisJCX0KKwkJYWRldi0+Z3Vlc3RfbXNpeF9lbnRyaWVzID0ga3phbGxvYygKKwkJCQlzaXplb2Yoc3RydWN0IGt2bV9ndWVzdF9tc2l4X2VudHJ5KSAqCisJCQkJZW50cnlfbnItPmVudHJ5X25yLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhZGV2LT5ndWVzdF9tc2l4X2VudHJpZXMpIHsKKwkJCWtmcmVlKGFkZXYtPmhvc3RfbXNpeF9lbnRyaWVzKTsKKwkJCXIgPSAtRU5PTUVNOworCQkJZ290byBtc2l4X25yX291dDsKKwkJfQorCX0gZWxzZSAvKiBOb3QgYWxsb3dlZCBzZXQgTVNJLVggbnVtYmVyIHR3aWNlICovCisJCXIgPSAtRUlOVkFMOworbXNpeF9ucl9vdXQ6CisJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGt2bV92bV9pb2N0bF9zZXRfbXNpeF9lbnRyeShzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICAgICAgIHN0cnVjdCBrdm1fYXNzaWduZWRfbXNpeF9lbnRyeSAqZW50cnkpCit7CisJaW50IHIgPSAwLCBpOworCXN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqYWRldjsKKworCW11dGV4X2xvY2soJmt2bS0+bG9jayk7CisKKwlhZGV2ID0ga3ZtX2ZpbmRfYXNzaWduZWRfZGV2KCZrdm0tPmFyY2guYXNzaWduZWRfZGV2X2hlYWQsCisJCQkJICAgICAgZW50cnktPmFzc2lnbmVkX2Rldl9pZCk7CisKKwlpZiAoIWFkZXYpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gbXNpeF9lbnRyeV9vdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFkZXYtPmVudHJpZXNfbnI7IGkrKykKKwkJaWYgKGFkZXYtPmd1ZXN0X21zaXhfZW50cmllc1tpXS52ZWN0b3IgPT0gMCB8fAorCQkgICAgYWRldi0+Z3Vlc3RfbXNpeF9lbnRyaWVzW2ldLmVudHJ5ID09IGVudHJ5LT5lbnRyeSkgeworCQkJYWRldi0+Z3Vlc3RfbXNpeF9lbnRyaWVzW2ldLmVudHJ5ID0gZW50cnktPmVudHJ5OworCQkJYWRldi0+Z3Vlc3RfbXNpeF9lbnRyaWVzW2ldLnZlY3RvciA9IGVudHJ5LT5nc2k7CisJCQlhZGV2LT5ob3N0X21zaXhfZW50cmllc1tpXS5lbnRyeSA9IGVudHJ5LT5lbnRyeTsKKwkJCWJyZWFrOworCQl9CisJaWYgKGkgPT0gYWRldi0+ZW50cmllc19ucikgeworCQlyID0gLUVOT1NQQzsKKwkJZ290byBtc2l4X2VudHJ5X291dDsKKwl9CisKK21zaXhfZW50cnlfb3V0OgorCW11dGV4X3VubG9jaygma3ZtLT5sb2NrKTsKKworCXJldHVybiByOworfQorI2VuZGlmCisKIHN0YXRpYyBsb25nIGt2bV92Y3B1X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJICAgdW5zaWduZWQgaW50IGlvY3RsLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTE4NjQsNiArMjEyNCwxMSBAQAogCQlicmVhazsKIAl9CiAJY2FzZSBLVk1fQVNTSUdOX0lSUTogeworCQlyID0gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCX0KKyNpZmRlZiBLVk1fQ0FQX0FTU0lHTl9ERVZfSVJRCisJY2FzZSBLVk1fQVNTSUdOX0RFVl9JUlE6IHsKIAkJc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgYXNzaWduZWRfaXJxOwogCiAJCXIgPSAtRUZBVUxUOwpAQCAtMTg3NCw2ICsyMTM5LDE4IEBACiAJCQlnb3RvIG91dDsKIAkJYnJlYWs7CiAJfQorCWNhc2UgS1ZNX0RFQVNTSUdOX0RFVl9JUlE6IHsKKwkJc3RydWN0IGt2bV9hc3NpZ25lZF9pcnEgYXNzaWduZWRfaXJxOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFzc2lnbmVkX2lycSwgYXJncCwgc2l6ZW9mIGFzc2lnbmVkX2lycSkpCisJCQlnb3RvIG91dDsKKwkJciA9IGt2bV92bV9pb2N0bF9kZWFzc2lnbl9kZXZfaXJxKGt2bSwgJmFzc2lnbmVkX2lycSk7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKyNlbmRpZgogI2VuZGlmCiAjaWZkZWYgS1ZNX0NBUF9ERVZJQ0VfREVBU1NJR05NRU5UCiAJY2FzZSBLVk1fREVBU1NJR05fUENJX0RFVklDRTogewpAQCAtMTkxNyw3ICsyMTk0LDI5IEBACiAJCXZmcmVlKGVudHJpZXMpOwogCQlicmVhazsKIAl9CisjaWZkZWYgX19LVk1fSEFWRV9NU0lYCisJY2FzZSBLVk1fQVNTSUdOX1NFVF9NU0lYX05SOiB7CisJCXN0cnVjdCBrdm1fYXNzaWduZWRfbXNpeF9uciBlbnRyeV9ucjsKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZW50cnlfbnIsIGFyZ3AsIHNpemVvZiBlbnRyeV9ucikpCisJCQlnb3RvIG91dDsKKwkJciA9IGt2bV92bV9pb2N0bF9zZXRfbXNpeF9ucihrdm0sICZlbnRyeV9ucik7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCX0KKwljYXNlIEtWTV9BU1NJR05fU0VUX01TSVhfRU5UUlk6IHsKKwkJc3RydWN0IGt2bV9hc3NpZ25lZF9tc2l4X2VudHJ5IGVudHJ5OworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZlbnRyeSwgYXJncCwgc2l6ZW9mIGVudHJ5KSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX3ZtX2lvY3RsX3NldF9tc2l4X2VudHJ5KGt2bSwgJmVudHJ5KTsKKwkJaWYgKHIpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQogI2VuZGlmCisjZW5kaWYgLyogS1ZNX0NBUF9JUlFfUk9VVElORyAqLwogCWRlZmF1bHQ6CiAJCXIgPSBrdm1fYXJjaF92bV9pb2N0bChmaWxwLCBpb2N0bCwgYXJnKTsKIAl9CkBAIC0yMTEyLDE1ICsyNDExLDE1IEBACiBzdGF0aWMgaW50IGt2bV9yZWJvb3Qoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwgdW5zaWduZWQgbG9uZyB2YWwsCiAJCSAgICAgIHZvaWQgKnYpCiB7Ci0JaWYgKHZhbCA9PSBTWVNfUkVTVEFSVCkgewotCQkvKgotCQkgKiBTb21lICh3ZWxsLCBhdCBsZWFzdCBtaW5lKSBCSU9TZXMgaGFuZyBvbiByZWJvb3QgaWYKLQkJICogaW4gdm14IHJvb3QgbW9kZS4KLQkJICovCi0JCXByaW50ayhLRVJOX0lORk8gImt2bTogZXhpdGluZyBoYXJkd2FyZSB2aXJ0dWFsaXphdGlvblxuIik7Ci0JCWt2bV9yZWJvb3RpbmcgPSB0cnVlOwotCQlvbl9lYWNoX2NwdShoYXJkd2FyZV9kaXNhYmxlLCBOVUxMLCAxKTsKLQl9CisJLyoKKwkgKiBTb21lICh3ZWxsLCBhdCBsZWFzdCBtaW5lKSBCSU9TZXMgaGFuZyBvbiByZWJvb3QgaWYKKwkgKiBpbiB2bXggcm9vdCBtb2RlLgorCSAqCisJICogQW5kIEludGVsIFRYVCByZXF1aXJlZCBWTVggb2ZmIGZvciBhbGwgY3B1IHdoZW4gc3lzdGVtIHNodXRkb3duLgorCSAqLworCXByaW50ayhLRVJOX0lORk8gImt2bTogZXhpdGluZyBoYXJkd2FyZSB2aXJ0dWFsaXphdGlvblxuIik7CisJa3ZtX3JlYm9vdGluZyA9IHRydWU7CisJb25fZWFjaF9jcHUoaGFyZHdhcmVfZGlzYWJsZSwgTlVMTCwgMSk7CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIApAQCAtMjM1NCw5ICsyNjUzLDYgQEAKIAogCWt2bV9wcmVlbXB0X29wcy5zY2hlZF9pbiA9IGt2bV9zY2hlZF9pbjsKIAlrdm1fcHJlZW1wdF9vcHMuc2NoZWRfb3V0ID0ga3ZtX3NjaGVkX291dDsKLSNpZm5kZWYgQ09ORklHX1g4NgotCW1zaTJpbnR4ID0gMDsKLSNlbmRpZgogCiAJcmV0dXJuIDA7CiAK